ZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMzN2ZiNQotLS0gL2Rldi9udWxsCisrKyBiL01ha2VmaWxlCkBAIC0wLDAgKzEsMTM2IEBACisjCisjICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QsIEluYy4KKyMgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgICAgVGhpcyBkb2N1bWVudCBpcyB0aGUgcHJvcGVydHkgb2YgTmVzdC4gSXQgaXMgY29uc2lkZXJlZAorIyAgICBjb25maWRlbnRpYWwgYW5kIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9uLgorIworIyAgICBUaGlzIGRvY3VtZW50IG1heSBub3QgYmUgcmVwcm9kdWNlZCBvciB0cmFuc21pdHRlZCBpbiBhbnkgZm9ybSwKKyMgICAgaW4gd2hvbGUgb3IgaW4gcGFydCwgd2l0aG91dCB0aGUgZXhwcmVzcyB3cml0dGVuIHBlcm1pc3Npb24gb2YKKyMgICAgTmVzdC4KKyMKKyMgICAgRGVzY3JpcHRpb246CisjICAgICAgVGhpcyBmaWxlIGlzIHRoZSBtYWtlIGZpbGUgZm9yIGxpYmdjcnlwdCwgR05VJ3MgYmFzaWMKKyMgICAgICBjcnlwdG9ncmFwaGljIGxpYnJhcnkuCisjCisKK0J1aWxkQ29uZmlnU3BlY2lhbGl6ZWQJOj0gTm8KK0J1aWxkUHJvZHVjdFNwZWNpYWxpemVkCTo9IE5vCisKK2luY2x1ZGUgcHJlLm1haworCitQYWNrYWdlTmFtZQkJOj0gbGliZ2NyeXB0CisKK1BhY2thZ2VFeHRlbnNpb24JOj0gdGFyLmJ6MgorUGFja2FnZVNlcGFyYXRvcgk6PSAtCisKK1BhY2thZ2VQYXRjaEFyZ3MJOj0gLXAxCisKK1BhY2thZ2VBcmNoaXZlCQk6PSAkKFBhY2thZ2VOYW1lKS4kKFBhY2thZ2VFeHRlbnNpb24pCitQYWNrYWdlU291cmNlRGlyCTo9ICQoUGFja2FnZU5hbWUpJChQYWNrYWdlU2VwYXJhdG9yKSQoUGFja2FnZVZlcnNpb24pCisKK1BhY2thZ2VCdWlsZE1ha2VmaWxlCT0gJChjYWxsIEdlbmVyYXRlQnVpbGRQYXRocyxNYWtlZmlsZSkKKworTGljZW5zZVNvdXJjZUZpbGVzCTo9IENPUFlJTkcgQ09QWUlORy5MSUIKK0xpY2Vuc2VTb3VyY2VQYXRocyAgICAgIDo9ICQoYWRkcHJlZml4ICQoUGFja2FnZVNvdXJjZURpcikvLCQoTGljZW5zZVNvdXJjZUZpbGVzKSkKKworQ2xlYW5QYXRocwkJKz0gJChQYWNrYWdlTGljZW5zZUZpbGUpCisKK0dwZ0Vycm9yRGlyCQk6PSBzdy90cHMvbGliZ3BnLWVycm9yCitHcGdFcnJvckluY0RpcgkJOj0gJChjYWxsIEdlbmVyYXRlUmVzdWx0UGF0aHMsJChHcGdFcnJvckRpciksdXNyL2luY2x1ZGUpCitHcGdFcnJvckxpYkRpcgkJOj0gJChjYWxsIEdlbmVyYXRlUmVzdWx0UGF0aHMsJChHcGdFcnJvckRpciksdXNyL2xpYikKKworYWxsOiAkKFBhY2thZ2VEZWZhdWx0R29hbCkKKworIyBHZW5lcmF0ZSB0aGUgcGFja2FnZSBsaWNlbnNlIGNvbnRlbnRzLgorCiskKExpY2Vuc2VTb3VyY2VQYXRocyk6IHNvdXJjZQorCiskKFBhY2thZ2VMaWNlbnNlRmlsZSk6ICQoTGljZW5zZVNvdXJjZVBhdGhzKQorCSQoVmVyYm9zZSl0b3VjaCAkQAorCSQoVmVyYm9zZSlmb3IgZmlsZSBpbiAkKExpY2Vuc2VTb3VyY2VQYXRocyk7IGRvCVwKKwkJZWNobyAiQ29uY2F0ZW5hdGluZyBcIiQke2ZpbGV9XCIuLi4iOwlcCisJCWNhdCAkJHtmaWxlfSA+PiAkQDsJCQlcCisJZG9uZQorCisjIEV4dHJhY3QgdGhlIHNvdXJjZSBmcm9tIHRoZSBhcmNoaXZlIGFuZCBhcHBseSBwYXRjaGVzLCBpZiBhbnkuCisKKyQoUGFja2FnZVNvdXJjZURpcik6ICQoUGFja2FnZUFyY2hpdmUpICQoUGFja2FnZVBhdGNoUGF0aHMpCisJJChleHBhbmQtYW5kLXBhdGNoLXBhY2thZ2UpCisKKyMgUHJlcGFyZSB0aGUgc291cmNlcy4KKworLlBIT05ZOiBzb3VyY2UKK3NvdXJjZTogfCAkKFBhY2thZ2VTb3VyY2VEaXIpCisKKyMgUGF0Y2ggdGhlIHNvdXJjZXMsIGlmIG5lY2Vzc2FyeS4KKworLlBIT05ZOiBwYXRjaAorcGF0Y2g6IHNvdXJjZQorCisjIEdlbmVyYXRlIHRoZSBwYWNrYWdlIGJ1aWxkIG1ha2VmaWxlLgorCiskKFBhY2thZ2VCdWlsZE1ha2VmaWxlKTogfCAkKFBhY2thZ2VTb3VyY2VEaXIpICQoQnVpbGREaXJlY3RvcnkpICQoUmVzdWx0RGlyZWN0b3J5KQorCSQoVmVyYm9zZSljZCAkKEJ1aWxkRGlyZWN0b3J5KSAmJiBcCisJJChDVVJESVIpLyQoUGFja2FnZVNvdXJjZURpcikvY29uZmlndXJlIFwKKwlDQz0iJChDQykiIENYWD0iJChDWFgpIiBBUj0kKEFSKSBOTT0kKE5NKSBSQU5MSUI9JChSQU5MSUIpIFNUUklQPSQoU1RSSVApIFwKKwlDUFBGTEFHUz0iJChjYWxsIFRvb2xHZW5lcmF0ZUluY2x1ZGVBcmd1bWVudCwkKEdwZ0Vycm9ySW5jRGlyKSkiIFwKKwlMREZMQUdTPSItTCQoR3BnRXJyb3JMaWJEaXIpIC1sZ3BnLWVycm9yIiBcCisJSU5TVEFMTD0iJChJTlNUQUxMKSAkKElOU1RBTExGTEFHUykiIFwKKwktLWJ1aWxkPSQoSG9zdFR1cGxlKSBcCisJLS1ob3N0PSQoVGFyZ2V0VHVwbGUpIFwKKwktLXByZWZpeD0vdXNyIFwKKwktLXN5c2NvbmZkaXI9L2V0YyBcCisJLS1sb2NhbHN0YXRlZGlyPS92YXIgXAorCS0td2l0aC1ncGctZXJyb3ItcHJlZml4PSQoY2FsbCBHZW5lcmF0ZVJlc3VsdFBhdGhzLCQoR3BnRXJyb3JEaXIpLHVzcikgXAorCS0tZGlzYWJsZS1zdGF0aWMKKworIyBDb25maWd1cmUgdGhlIHNvdXJjZSBmb3IgYnVpbGRpbmcuCisKKy5QSE9OWTogY29uZmlndXJlCitjb25maWd1cmU6IHNvdXJjZSAkKFBhY2thZ2VCdWlsZE1ha2VmaWxlKQorCisjIEJ1aWxkIHRoZSBzb3VyY2UuCisjCisjIFdlIGhhdmUgdG8gdW5zZXQgTUFLRUZMQUdTIHNpbmNlIHRoZXkgY29uZnVzZSB0aGUgcGFja2FnZSBidWlsZCBvdGhlcndpc2UuCisKKy5QSE9OWTogYnVpbGQKK2J1aWxkOiBjb25maWd1cmUKKwkkKFZlcmJvc2UpdW5zZXQgTUFLRUZMQUdTICYmIFwKKwkkKE1BS0UpICQoSk9CU0ZMQUcpIC1DICQoQnVpbGREaXJlY3RvcnkpIFwKKwlhbGwKKworIyBTdGFnZSB0aGUgYnVpbGQgdG8gYSB0ZW1wb3JhcnkgaW5zdGFsbGF0aW9uIGFyZWEuCisjCisjIFdlIGhhdmUgdG8gdW5zZXQgTUFLRUZMQUdTIHNpbmNlIHRoZXkgY29uZnVzZSB0aGUgcGFja2FnZSBidWlsZCBvdGhlcndpc2UuCisjCisjIFdlIGV4cGxpY3RseSByZW1vdmUgJ2xpYmZvby5sYScgYmVjYXVzZSBzb21lIHBhY2thZ2VzIHRoYXQgZGVwZW5kIG9uCisjIHRoZXNlIGxpYnJhcmllcyB1c2UgbGlidG9vbC4gSWYgbGlidG9vbCBmaW5kcyBhICdsaWJmb28ubGEnIGZpbGUgZm9yCisjIGEgbGlicmFyeSwgaXQgdXNlcyB0aGUgdmFsdWUgb2YgJ2xpYmRpcj08ZGlyPicgaXQgZmluZHMuIEluIG91cgorIyBjYXNlLCBzaW5jZSAnLS1wcmVmaXg9L3VzcicgdGhpcyB2YWx1ZSBpcyAnL3Vzci9saWInLiBJdCB0aGVuCisjIHJlc29sdmVzICctbGZvbycuIEluIGEgY3Jvc3MtY29tcGlsYXRpb24gZW52aXJvbm1lbnQsIHRoaXMgaXMgbGlrZWx5CisjIHRvIGJlIG5laXRoZXIgdGhlIHJpZ2h0IGFyY2hpdGVjdHVyZSBub3IgdGhlIHJpZ2h0IHZlcnNpb24gdG8gbGluaworIyBhZ2FpbnN0LiBJbiBzaG9ydCwgd2UgbG9zZS4KKyMKKyMgV2UgY291bGQgYWxzbyBoYW5kbGUgdGhpcyBieSByZW1vdmluZyBERVNURElSIGFuZCBzZXR0aW5nIHRoZSBwcmVmaXgKKyMgdG8gJChSZXN1bHREaXJlY3RvcnkpOyBob3dldmVyLCB0aGF0IHJlc3VsdHMgaW4gbGlidG9vbCBoYXJkLWNvZGluZworIyAkKFJlc3VsdERpcmVjdG9yeSkgYXMgdGhlIFJQQVRIIGluIHRoZSBsaW5rZWQgZXhlY3V0YWJsZXMgd2hpY2ggaXMKKyMgTk9UIHdoYXQgd2Ugd2FudCBlaXRoZXIuIFdlIGxvc2UgYWdhaW4uCisjCisjIEJ5IHJlbW92aW5nIHRoZSAnKi5sYScgZmlsZSwgd2Ugd2luIGJ5IGVuc3VyaW5nIG5laXRoZXIgYSBtaXNkaXJlY3RlZAorIyBsaW5rIG5vciBhbiBSUEFUSC4KKworLlBIT05ZOiBzdGFnZQorc3RhZ2U6IGJ1aWxkIHwgJChSZXN1bHREaXJlY3RvcnkpCisJJChWZXJib3NlKXVuc2V0IE1BS0VGTEFHUyAmJiBcCisJJChNQUtFKSAkKEpPQlNGTEFHKSAtQyAkKEJ1aWxkRGlyZWN0b3J5KSBcCisJREVTVERJUj0kKFJlc3VsdERpcmVjdG9yeSkgXAorCWluc3RhbGwKKwkkKFZlcmJvc2UpJChSTSkgJChSTUZMQUdTKSAkKGNhbGwgR2VuZXJhdGVSZXN1bHRQYXRocywsdXNyL2xpYi9saWJnY3J5cHQubGEpCisKK2NsZWFuOgorCSQoVmVyYm9zZSkkKFJNKSAkKFJNRkxBR1MpIC1yICQoUGFja2FnZVNvdXJjZURpcikKKwkkKFZlcmJvc2UpJChSTSkgJChSTUZMQUdTKSAtciAkKEJ1aWxkRGlyZWN0b3J5KQorCSQoVmVyYm9zZSkkKFJNKSAkKFJNRkxBR1MpIC1yICQoUmVzdWx0RGlyZWN0b3J5KQorCitpbmNsdWRlIHBvc3QubWFrCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvQVVUSE9SUyBiL2xpYmdjcnlwdC0xLjQuNi9BVVRIT1JTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNzJjMjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvQVVUSE9SUwpAQCAtMCwwICsxLDEzMSBAQAorTGlicmFyeTogTGliZ2NyeXB0CitIb21lcGFnZTogaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2xpYmdjcnlwdC8KK01haW50YWluZXI6IFdlcm5lciBLb2NoIDx3a0BnbnVwZy5vcmc+CitCdWcgcmVwb3J0czogPGJ1Zy1saWJnY3J5cHRAZ251cGcub3JnPiAgb3IgaHR0cDovL2J1Z3MuZ251cGcub3JnCitTZWN1cml0eSByZWxhdGVkIGJ1ZyByZXBvcnRzOiA8c2VjdXJpdHlAZ251cGcub3JnPgorTGljZW5zZSAobGlicmFyeSk6IExHUEx2Mi4xKworTGljZW5zZSAobWFudWFsIGFuZCB0b29scyk6IEdQTHYyKworCitMaWJnY3J5cHQgdXNlZCB0byBiZSBwYXJ0IG9mIEdudVBHIGJ1dCBoYXMgYmVlbiB0YWtlbiBvdXQgaW50byBpdHMgb3duCitwYWNrYWdlIG9uIDIwMDAtMTItMjEuCisKKworQXV0aG9ycyBvZiBMaWJnY3J5cHQKKz09PT09PT09PT09PT09PT09PT09CisKK0dOVVBHCVdlcm5lciBLb2NoCQkgIDE5OTgtMDItMjMKK0Fzc2lnbnMgR05VIFByaXZhY3kgR3VhcmQgYW5kIGZ1dHVyZSBjaGFuZ2VzLgord2tAZ251cGcub3JnCitEZXNpZ25lZCBhbmQgaW1wbGVtZW50ZWQgR251UEcuCisKK0dOVVBHCU1hdHRoZXcgU2thbGEJCSAgIDE5OTgtMDgtMTAKK0Rpc2NsYWltcyBjaGFuZ2VzLgorbXNrYWxhQGFuc3V6LnNvb2tlLmJjLmNhCitXcm90ZSBjaXBoZXIvdHdvZmlzaC5jLgorCitHTlVQRwlOYXR1cmFsIFJlc291cmNlcyBDYW5hZGEgICAgMTk5OC0wOC0xMQorRGlzY2xhaW1zIGNoYW5nZXMgYnkgTWF0dGhldyBTa2FsYS4KKworR05VUEcJTWljaGFlbCBSb3RoCUdlcm1hbnkgICAgIDE5OTgtMDktMTcKK0Fzc2lnbnMgY2hhbmdlcy4KK21yb3RoQG5lc3NpZS5kZQorV3JvdGUgY2lwaGVyL2Rlcy5jLgorQ2hhbmdlcyBhbmQgYnVnIGZpeGVzIGFsbCBvdmVyIHRoZSBwbGFjZS4KKworR05VUEcJTmlrbGFzIEhlcm5hZXVzIAkxOTk4LTA5LTE4CitEaXNjbGFpbXMgY2hhbmdlcy4KK25oQGRmLmx0aC5zZQorV2VhayBrZXkgcGF0Y2hlcy4KKworR05VUEcJUultaSBHdXlvbWFyY2gJCTE5OTktMDUtMjUKK0Fzc2lnbnMgcGFzdCBhbmQgZnV0dXJlIGNoYW5nZXMuIChnMTAvY29tcHJlc3MuYywgZzEwL2VuY3ItZGF0YS5jLAorZzEwL2ZyZWUtcGFja2V0LmMsIGcxMC9tZGZpbHRlci5jLCBnMTAvcGxhaW50ZXh0LmMsIHV0aWwvaW9idWYuYykKK3JndXlvbUBtYWlsLmRvdGNvbS5mcgorCitBTlkgICAgIGcxMCBDb2RlIEdtYkggICAgICAgICAgIDIwMDEtMDYtMDcKK0NvZGUgbWFya2VkIHdpdGggQ2hhbmdlTG9nIGVudHJpZXMgb2YgZzEwIENvZGUgZW1wbG95ZWVzLgorCitMSUJHQ1JZUFQgVGltbyBTY2h1bHogICAgICAgICAgIDIwMDEtMDgtMzEKK0Fzc2lnbnMgcGFzdCBhbmQgZnV0dXJlIGNoYW5nZXMuCit0d29hZGF5QGZyZWFrbWFpbC5kZQorCitMSUJHQ1JZUFQgU2ltb24gSm9zZWZzc29uICAgICAgIDIwMDItMTAtMjUKK0Fzc2lnbnMgcGFzdCBhbmQgZnV0dXJlIGNoYW5nZXMgdG8gRlNGIChjaXBoZXIve21kNCxjcmN9LmMsIENUUiBtb2RlLAorQ1RTL01BQyBmbGFncywgc2VsZiB0ZXN0IGltcHJvdmVtZW50cykKK3NpbW9uQGpvc2Vmc3Nvbi5vcmcKKworTElCR0NSWVBUIE1vcml0eiBTY2h1bHRlCTIwMDMtMDQtMTcKK0Fzc2lnbnMgcGFzdCBhbmQgZnV0dXJlIGNoYW5nZXMuCittb3JpdHpAZzEwY29kZS5jb20KKworR05VVExTICBOaWtvbGFvcyBNYXZyb2dpYW5ub3BvdWxvcyAgMjAwMy0xMS0yMgorbm1hdkBnbnV0bHMub3JnCitPcmlnaW5hbCBjb2RlIGZvciBjaXBoZXIvcmZjMjI2OC5jLgorCitMSUJHQ1JZUFQJVGhlIFdyaXR0ZW4gV29yZAkyMDA1LTA0LTE1CitBc3NpZ25zIHBhc3QgYW5kIGZ1dHVyZSBjaGFuZ2VzLiAobmV3OiBzcmMvbGliZ2NyeXB0LnBjLmluLAorc3JjL01ha2VmaWxlLmFtLCBzcmMvc2VjbWVtLmMsIG1waS9ocHBhMS4xL21waWgtbXVsMy5TLAorbXBpL2hwcGExLjEvdWRpdi1xcm5uZC5TLCBtcGkvaHBwYTEuMS9tcGloLW11bDIuUywKK21waS9ocHBhMS4xL21waWgtbXVsMS5TLCBtcGkvTWFrZWZpbGUuYW0sIHRlc3RzL3ByaW1lLmMsCit0ZXN0cy9yZWdpc3Rlci5jLCB0ZXN0cy9hYy5jLCB0ZXN0cy9iYXNpYy5jLCB0ZXN0cy90c2V4cC5jLAordGVzdHMva2V5Z2VuLmMsIHRlc3RzL3B1YmtleS5jLCBjb25maWd1cmUuYWMsIGFjaW5jbHVkZS5tNCkKKworTElCR0NSWVBUICAgICAgIEJyYWQgSGFyZHMgICAgICAgMjAwNi0wMi0wOQorQXNzaWducyBQYXN0IGFuZCBGdXR1cmUgQ2hhbmdlcworYnJhZGhAZnJvZ21vdXRoLm5ldAorKEFkZGVkIE9GQiBtb2RlLiBDaGFuZ2VkIGNpcGhlci9jaXBoZXIuYywgdGVzdC9iYXNpYy5jIGRvYy9nY3J5cHQudGV4LgorIGFkZGVkIFNIQS0yMjQsIGNoYW5nZWQgY2lwaGVyL3NoYTI1Ni5jLCBhZGRlZCBITUFDIHRlc3RzLikKKworTElCR0NSWVBUICAgICAgIEh5ZS1TaGlrIENoYW5nICAgMjAwNi0wOS0wNworQXNzaWducyBQYXN0IGFuZCBGdXR1cmUgQ2hhbmdlcworcGVya3lAZnJlZWJzZC5vcmcKKyhTRUVEIGNpcGhlcikKKworTElCR0NSWVBUICAgICAgIFdlcm5lciBEaXR0bWFubiAgKiogcGVuZGluZyAqKgord2VybmVyLmRpdHRtYW5uQHQtb25saW5lLmRlCisobXBpL2FtZDY0LCB0ZXN0cy9tcGl0ZXN0cy5jKQorCitHTlVQRyAgICAgICAgICAgRGF2aWQgU2hhdworQXNzaWducyBwYXN0IGFuZCBmdXR1cmUgY2hhbmdlcy4KK2RzaGF3QGphYmJlcndvY2t5LmNvbT4KKyhjaXBoZXIvY2FtZWxsaWEtZ2x1ZS5jIGFuZCByZWxhdGVkIHN0dWZmKQorCisKKworTW9yZSBjcmVkaXRzCis9PT09PT09PT09PT0KK1RoZSBBVEggaW1wbGVtZW50YXRpb24gKHNyYy9hdGgqKSBoYXMgYmVlbiB0YWtlbiBmcm9tIEdQR01FIGFuZAorcmVsaWNlbnNlZCB0byB0aGUgTEdQTCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBvZiBHUEdNRSAoZzEwIENvZGUKK0dtYkgpOyBpdCBpcyBub3cgY29uc2lkZXJlZCB0byBiZSBhIHBhcnQgb2YgTGliZ2NyeXB0LgorCitNb3N0IG9mIHRoZSBzdHVmZiBpbiBtcGkgaGFzIGJlZW4gdGFrZW4gZnJvbSBhbiBvbGQgR01QIGxpYnJhcnkKK3ZlcnNpb24gYnkgVG9yYmpvcm4gR3Jhbmx1bmQgPHRlZ2VAbm9pc3kudG1nLnNlPi4KKworVGhlIGZpbGVzIGNpcGhlci9ybmR1bml4LmMgYW5kIGNpcGhlci9ybmR3MzIuYyBhcmUgYmFzZWQgb24gdGhvc2UKK2ZpbGVzIGZyb20gQ3J5cHRsaWIuICBDb3B5cmlnaHQgUGV0ZXIgR3V0bWFubiwgUGF1bCBLZW5kYWxsLCBhbmQgQ2hyaXMKK1dlZGd3b29kIDE5OTYtMTk5OS4KKworVGhlIEVDQyBjb2RlIGNpcGhlci9lY2MuYyB3YXMgYmFzZWQgb24gY29kZSBieSBTZXJnaSBCbGFuY2ggaSBUb3JuZSwKK3NlcmdpIGF0IGNhbGN1cmNvIGRvdCBvcmcuCisKK1RoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQ2FtZWxsaWEgY2lwaGVyIGhhcyBiZWVuIGJlZW4gdGFrZW4gZnJvbSB0aGUKK29yaWdpbmFsIE5UVCBwcm92aWRlZCBHUEwgc291cmNlLgorCitUaGUgQ0FWUyB0ZXN0aW5nIHByb2dyYW0gdGVzdHMvY2F2c19kcml2ZXIucGwgaXMgbm90IHRvIGJlIGNvbnNpZGVyZWQKK2EgcGFydCBvZiBsaWJnY3J5cHQgcHJvcGVyLiAgV2UgZGlzdHJpYnV0ZSBpdCBtZXJlbHkgZm9yIGNvbnZlbmllbmNlLgorSXQgaGFzIGEgcGVybWlzc2l2ZSBsaWNlbnNlIGFuZCBpcyBjb3B5cmlnaHQgYnkgYXRzZWMgaW5mb3JtYXRpb24KK3NlY3VyaXR5IGNvcnBvcmF0aW9uLiAgU2VlIHRoZSBmaWxlIGZvciBkZXRhaWxzLgorCisKKyBDb3B5cmlnaHQgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNiwKKyAgICAgICAgICAgMjAwNywgMjAwOCwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRoZSBhdXRob3IgZ2l2ZXMKKyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0IGV2ZW4gdGhlCisgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisKKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L0NPUFlJTkcgYi9saWJnY3J5cHQtMS40LjYvQ09QWUlORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjBjMzFhCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L0NPUFlJTkcKQEAgLTAsMCArMSwzNDAgQEAKKwkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisJCSAgICAgICBWZXJzaW9uIDIsIEp1bmUgMTk5MQorCisgQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgICA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCisgb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCisKKwkJCSAgICBQcmVhbWJsZQorCisgIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKK2ZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlCitzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiAgVGhpcworR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIG1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQgdG8gYW55IG90aGVyIHByb2dyYW0gd2hvc2UgYXV0aG9ycyBjb21taXQgdG8KK3VzaW5nIGl0LiAgKFNvbWUgb3RoZXIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkKK3RoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSAgWW91IGNhbiBhcHBseSBpdCB0bworeW91ciBwcm9ncmFtcywgdG9vLgorCisgIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKK3ByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKK2hhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKK3RoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAoraWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKK2luIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KKworICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCithbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCitUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdQorZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgorCisgIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKK2dyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdAoreW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUKK3NvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIKK3JpZ2h0cy4KKworICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kCisoMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LAorZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KKworICBBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgordGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKK3NvZnR3YXJlLiAgSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQord2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28KK3RoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsCithdXRob3JzJyByZXB1dGF0aW9ucy4KKworICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQorcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZQorcHJvZ3JhbSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZQorcHJvZ3JhbSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55CitwYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgorCisgIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCittb2RpZmljYXRpb24gZm9sbG93LgorDAorCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgorCisgIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMKK2Egbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkCit1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhlICJQcm9ncmFtIiwgYmVsb3csCityZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIKK21lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6Cit0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LAorZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKK2xhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4KK3RoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgorCitBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAorY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgorcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQoraXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuCitXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KKworICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3MKK3NvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQorY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZQorY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZQorbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OworYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KKworWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kCit5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgorCisgIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24KK29mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQKK2Rpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQorYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKKworICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCisKKyAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4KKyAgICB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkKKyAgICBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZAorICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkKKyAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCisgICAgaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbgorICAgIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQorICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQorICAgIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIKKyAgICB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcworICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0CisgICAgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbgorICAgIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQorDAorVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgoraWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSwKK2FuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgordGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQorc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91CitkaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKK29uIHRoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgordGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKK2VudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4KKworVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Cit5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KK2V4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgorY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgUHJvZ3JhbS4KKworSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbQord2l0aCB0aGUgUHJvZ3JhbSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mCithIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgordGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KKworICAzLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGEgd29yayBiYXNlZCBvbiBpdCwKK3VuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZgorU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCisgICAgYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZQorICAgIHNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucworICAgIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYikgQWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUKKyAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNoYXJnZSBubyBtb3JlIHRoYW4geW91cgorICAgIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUKKyAgICBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlCisgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0KKyAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBjKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlcgorICAgIHRvIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzCisgICAgYWxsb3dlZCBvbmx5IGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UKKyAgICByZWNlaXZlZCB0aGUgcHJvZ3JhbSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gd2l0aCBzdWNoCisgICAgYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pCisKK1RoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKK21ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlCitjb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueQorYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvCitjb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhCitzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUKK2FueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5Citmb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZQorb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQKK2l0c2VsZiBhY2NvbXBhbmllcyB0aGUgZXhlY3V0YWJsZS4KKworSWYgZGlzdHJpYnV0aW9uIG9mIGV4ZWN1dGFibGUgb3Igb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZworYWNjZXNzIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudAorYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzCitkaXN0cmlidXRpb24gb2YgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKK2NvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCisMCisgIDQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQorZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdAorb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzCit2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuCitIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcgordGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2gKK3BhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KKworICA1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKK3NpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCitkaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKK3Byb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKK21vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKK2FsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKK3RoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgorCisgIDYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCitvcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCit0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgorcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgorWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KK3RoaXMgTGljZW5zZS4KKworICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50CitpbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAorY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgorb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAorZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKK2Rpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKK0xpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKK21heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKK2xpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkKK2FsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgordGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bworcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KKworSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCithbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCithcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgorY2lyY3Vtc3RhbmNlcy4KKworSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQorcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKK3N1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKK2ludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcworaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCitnZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCit0aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAorc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwordG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90CitpbXBvc2UgdGhhdCBjaG9pY2UuCisKK1RoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bworYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCisMCisgIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluCitjZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKK29yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UKK21heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZwordGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZworY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzCit0aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KKworICA5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucworb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCitiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KK2FkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCitFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBQcm9ncmFtCitzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueQorbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YKK3RoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24uCisKKyAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQorcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvcgordG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMKK21ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzCitvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kCitvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KKworCQkJICAgIE5PIFdBUlJBTlRZCisKKyAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZCitGT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4KK09USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKK1BST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VECitPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUworVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRQorUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsCitSRVBBSVIgT1IgQ09SUkVDVElPTi4KKworICAxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCitXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SCitSRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLAorSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HCitPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVECitUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkKK1lPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSCitQUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKK1BPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKworCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworDAorCSAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKKworICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Citwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0CitmcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KKworICBUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gIEl0IGlzIHNhZmVzdAordG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQorY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKK3RoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgorCisgICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KKyAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgorCitJZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCit3aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgorCisgICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSB5ZWFyICBuYW1lIG9mIGF1dGhvcgorICAgIEdub21vdmlzaW9uIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4KKyAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0CisgICAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgorCitUaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKK3BhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB0aGUgY29tbWFuZHMgeW91IHVzZSBtYXkKK2JlIGNhbGxlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBgc2hvdyB3JyBhbmQgYHNob3cgYyc7IHRoZXkgY291bGQgZXZlbiBiZQorbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXIgcHJvZ3JhbS4KKworWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKK3NjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmCituZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6CisKKyAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUgcHJvZ3JhbQorICBgR25vbW92aXNpb24nICh3aGljaCBtYWtlcyBwYXNzZXMgYXQgY29tcGlsZXJzKSB3cml0dGVuIGJ5IEphbWVzIEhhY2tlci4KKworICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5ODkKKyAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKKworVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbSBpbnRvCitwcm9wcmlldGFyeSBwcm9ncmFtcy4gIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91IG1heQorY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGggdGhlCitsaWJyYXJ5LiAgSWYgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L0NPUFlJTkcuTElCIGIvbGliZ2NyeXB0LTEuNC42L0NPUFlJTkcuTElCCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmOWI2YjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvQ09QWUlORy5MSUIKQEAgLTAsMCArMSw1MTAgQEAKKworICAgICAgICAgICAgICAgICAgR05VIExFU1NFUiBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4xLCBGZWJydWFyeSAxOTk5CisKKyBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICAgIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworW1RoaXMgaXMgdGhlIGZpcnN0IHJlbGVhc2VkIHZlcnNpb24gb2YgdGhlIExlc3NlciBHUEwuICBJdCBhbHNvIGNvdW50cworIGFzIHRoZSBzdWNjZXNzb3Igb2YgdGhlIEdOVSBMaWJyYXJ5IFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIGhlbmNlCisgdGhlIHZlcnNpb24gbnVtYmVyIDIuMS5dCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVhbWJsZQorCisgIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKK2ZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlcyBhcmUgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlCitmcmVlIHNvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuCisKKyAgVGhpcyBsaWNlbnNlLCB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFwcGxpZXMgdG8gc29tZQorc3BlY2lhbGx5IGRlc2lnbmF0ZWQgc29mdHdhcmUgcGFja2FnZXMtLXR5cGljYWxseSBsaWJyYXJpZXMtLW9mIHRoZQorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCBvdGhlciBhdXRob3JzIHdobyBkZWNpZGUgdG8gdXNlIGl0LiAgWW91CitjYW4gdXNlIGl0IHRvbywgYnV0IHdlIHN1Z2dlc3QgeW91IGZpcnN0IHRoaW5rIGNhcmVmdWxseSBhYm91dCB3aGV0aGVyCit0aGlzIGxpY2Vuc2Ugb3IgdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgdGhlIGJldHRlcgorc3RyYXRlZ3kgdG8gdXNlIGluIGFueSBwYXJ0aWN1bGFyIGNhc2UsIGJhc2VkIG9uIHRoZSBleHBsYW5hdGlvbnMKK2JlbG93LgorCisgIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tIG9mIHVzZSwKK25vdCBwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQKK3lvdSBoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UKK2ZvciB0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpOyB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQKK2l0IGlmIHlvdSB3YW50IGl0OyB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBhbmQgdXNlIHBpZWNlcyBvZgoraXQgaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBhcmUgaW5mb3JtZWQgdGhhdCB5b3UgY2FuIGRvCit0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAorZGlzdHJpYnV0b3JzIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGVzZQorcmlnaHRzLiAgVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yCit5b3UgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5IG9yIGlmIHlvdSBtb2RpZnkgaXQuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSwgd2hldGhlciBncmF0aXMKK29yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0IHdlIGdhdmUKK3lvdS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZSBzb3VyY2UKK2NvZGUuICBJZiB5b3UgbGluayBvdGhlciBjb2RlIHdpdGggdGhlIGxpYnJhcnksIHlvdSBtdXN0IHByb3ZpZGUKK2NvbXBsZXRlIG9iamVjdCBmaWxlcyB0byB0aGUgcmVjaXBpZW50cywgc28gdGhhdCB0aGV5IGNhbiByZWxpbmsgdGhlbQord2l0aCB0aGUgbGlicmFyeSBhZnRlciBtYWtpbmcgY2hhbmdlcyB0byB0aGUgbGlicmFyeSBhbmQgcmVjb21waWxpbmcKK2l0LiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIgcmlnaHRzLgorCisgIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCBhIHR3by1zdGVwIG1ldGhvZDogKDEpIHdlIGNvcHlyaWdodCB0aGUKK2xpYnJhcnksIGFuZCAoMikgd2Ugb2ZmZXIgeW91IHRoaXMgbGljZW5zZSwgd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsCitwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgbGlicmFyeS4KKworICBUbyBwcm90ZWN0IGVhY2ggZGlzdHJpYnV0b3IsIHdlIHdhbnQgdG8gbWFrZSBpdCB2ZXJ5IGNsZWFyIHRoYXQKK3RoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGUgZnJlZSBsaWJyYXJ5LiAgQWxzbywgaWYgdGhlIGxpYnJhcnkgaXMKK21vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB0aGUgcmVjaXBpZW50cyBzaG91bGQga25vdwordGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsIHZlcnNpb24sIHNvIHRoYXQgdGhlIG9yaWdpbmFsCithdXRob3IncyByZXB1dGF0aW9uIHdpbGwgbm90IGJlIGFmZmVjdGVkIGJ5IHByb2JsZW1zIHRoYXQgbWlnaHQgYmUKK2ludHJvZHVjZWQgYnkgb3RoZXJzLgorXkwKKyAgRmluYWxseSwgc29mdHdhcmUgcGF0ZW50cyBwb3NlIGEgY29uc3RhbnQgdGhyZWF0IHRvIHRoZSBleGlzdGVuY2Ugb2YKK2FueSBmcmVlIHByb2dyYW0uICBXZSB3aXNoIHRvIG1ha2Ugc3VyZSB0aGF0IGEgY29tcGFueSBjYW5ub3QKK2VmZmVjdGl2ZWx5IHJlc3RyaWN0IHRoZSB1c2VycyBvZiBhIGZyZWUgcHJvZ3JhbSBieSBvYnRhaW5pbmcgYQorcmVzdHJpY3RpdmUgbGljZW5zZSBmcm9tIGEgcGF0ZW50IGhvbGRlci4gIFRoZXJlZm9yZSwgd2UgaW5zaXN0IHRoYXQKK2FueSBwYXRlbnQgbGljZW5zZSBvYnRhaW5lZCBmb3IgYSB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IG11c3QgYmUKK2NvbnNpc3RlbnQgd2l0aCB0aGUgZnVsbCBmcmVlZG9tIG9mIHVzZSBzcGVjaWZpZWQgaW4gdGhpcyBsaWNlbnNlLgorCisgIE1vc3QgR05VIHNvZnR3YXJlLCBpbmNsdWRpbmcgc29tZSBsaWJyYXJpZXMsIGlzIGNvdmVyZWQgYnkgdGhlCitvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoaXMgbGljZW5zZSwgdGhlIEdOVSBMZXNzZXIKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFwcGxpZXMgdG8gY2VydGFpbiBkZXNpZ25hdGVkIGxpYnJhcmllcywgYW5kCitpcyBxdWl0ZSBkaWZmZXJlbnQgZnJvbSB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFdlIHVzZQordGhpcyBsaWNlbnNlIGZvciBjZXJ0YWluIGxpYnJhcmllcyBpbiBvcmRlciB0byBwZXJtaXQgbGlua2luZyB0aG9zZQorbGlicmFyaWVzIGludG8gbm9uLWZyZWUgcHJvZ3JhbXMuCisKKyAgV2hlbiBhIHByb2dyYW0gaXMgbGlua2VkIHdpdGggYSBsaWJyYXJ5LCB3aGV0aGVyIHN0YXRpY2FsbHkgb3IgdXNpbmcKK2Egc2hhcmVkIGxpYnJhcnksIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgdHdvIGlzIGxlZ2FsbHkgc3BlYWtpbmcgYQorY29tYmluZWQgd29yaywgYSBkZXJpdmF0aXZlIG9mIHRoZSBvcmlnaW5hbCBsaWJyYXJ5LiAgVGhlIG9yZGluYXJ5CitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHRoZXJlZm9yZSBwZXJtaXRzIHN1Y2ggbGlua2luZyBvbmx5IGlmIHRoZQorZW50aXJlIGNvbWJpbmF0aW9uIGZpdHMgaXRzIGNyaXRlcmlhIG9mIGZyZWVkb20uICBUaGUgTGVzc2VyIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIHBlcm1pdHMgbW9yZSBsYXggY3JpdGVyaWEgZm9yIGxpbmtpbmcgb3RoZXIgY29kZSB3aXRoCit0aGUgbGlicmFyeS4KKworICBXZSBjYWxsIHRoaXMgbGljZW5zZSB0aGUgIkxlc3NlciIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBiZWNhdXNlIGl0Citkb2VzIExlc3MgdG8gcHJvdGVjdCB0aGUgdXNlcidzIGZyZWVkb20gdGhhbiB0aGUgb3JkaW5hcnkgR2VuZXJhbAorUHVibGljIExpY2Vuc2UuICBJdCBhbHNvIHByb3ZpZGVzIG90aGVyIGZyZWUgc29mdHdhcmUgZGV2ZWxvcGVycyBMZXNzCitvZiBhbiBhZHZhbnRhZ2Ugb3ZlciBjb21wZXRpbmcgbm9uLWZyZWUgcHJvZ3JhbXMuICBUaGVzZSBkaXNhZHZhbnRhZ2VzCithcmUgdGhlIHJlYXNvbiB3ZSB1c2UgdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1hbnkKK2xpYnJhcmllcy4gIEhvd2V2ZXIsIHRoZSBMZXNzZXIgbGljZW5zZSBwcm92aWRlcyBhZHZhbnRhZ2VzIGluIGNlcnRhaW4KK3NwZWNpYWwgY2lyY3Vtc3RhbmNlcy4KKworICBGb3IgZXhhbXBsZSwgb24gcmFyZSBvY2Nhc2lvbnMsIHRoZXJlIG1heSBiZSBhIHNwZWNpYWwgbmVlZCB0bworZW5jb3VyYWdlIHRoZSB3aWRlc3QgcG9zc2libGUgdXNlIG9mIGEgY2VydGFpbiBsaWJyYXJ5LCBzbyB0aGF0IGl0CitiZWNvbWVzIGEgZGUtZmFjdG8gc3RhbmRhcmQuICBUbyBhY2hpZXZlIHRoaXMsIG5vbi1mcmVlIHByb2dyYW1zIG11c3QKK2JlIGFsbG93ZWQgdG8gdXNlIHRoZSBsaWJyYXJ5LiAgQSBtb3JlIGZyZXF1ZW50IGNhc2UgaXMgdGhhdCBhIGZyZWUKK2xpYnJhcnkgZG9lcyB0aGUgc2FtZSBqb2IgYXMgd2lkZWx5IHVzZWQgbm9uLWZyZWUgbGlicmFyaWVzLiAgSW4gdGhpcworY2FzZSwgdGhlcmUgaXMgbGl0dGxlIHRvIGdhaW4gYnkgbGltaXRpbmcgdGhlIGZyZWUgbGlicmFyeSB0byBmcmVlCitzb2Z0d2FyZSBvbmx5LCBzbyB3ZSB1c2UgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorCisgIEluIG90aGVyIGNhc2VzLCBwZXJtaXNzaW9uIHRvIHVzZSBhIHBhcnRpY3VsYXIgbGlicmFyeSBpbiBub24tZnJlZQorcHJvZ3JhbXMgZW5hYmxlcyBhIGdyZWF0ZXIgbnVtYmVyIG9mIHBlb3BsZSB0byB1c2UgYSBsYXJnZSBib2R5IG9mCitmcmVlIHNvZnR3YXJlLiAgRm9yIGV4YW1wbGUsIHBlcm1pc3Npb24gdG8gdXNlIHRoZSBHTlUgQyBMaWJyYXJ5IGluCitub24tZnJlZSBwcm9ncmFtcyBlbmFibGVzIG1hbnkgbW9yZSBwZW9wbGUgdG8gdXNlIHRoZSB3aG9sZSBHTlUKK29wZXJhdGluZyBzeXN0ZW0sIGFzIHdlbGwgYXMgaXRzIHZhcmlhbnQsIHRoZSBHTlUvTGludXggb3BlcmF0aW5nCitzeXN0ZW0uCisKKyAgQWx0aG91Z2ggdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIExlc3MgcHJvdGVjdGl2ZSBvZiB0aGUKK3VzZXJzJyBmcmVlZG9tLCBpdCBkb2VzIGVuc3VyZSB0aGF0IHRoZSB1c2VyIG9mIGEgcHJvZ3JhbSB0aGF0IGlzCitsaW5rZWQgd2l0aCB0aGUgTGlicmFyeSBoYXMgdGhlIGZyZWVkb20gYW5kIHRoZSB3aGVyZXdpdGhhbCB0byBydW4KK3RoYXQgcHJvZ3JhbSB1c2luZyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIExpYnJhcnkuCisKKyAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKK21vZGlmaWNhdGlvbiBmb2xsb3cuICBQYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYQorIndvcmsgYmFzZWQgb24gdGhlIGxpYnJhcnkiIGFuZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgbGlicmFyeSIuICBUaGUKK2Zvcm1lciBjb250YWlucyBjb2RlIGRlcml2ZWQgZnJvbSB0aGUgbGlicmFyeSwgd2hlcmVhcyB0aGUgbGF0dGVyIG11c3QKK2JlIGNvbWJpbmVkIHdpdGggdGhlIGxpYnJhcnkgaW4gb3JkZXIgdG8gcnVuLgorXkwKKyAgICAgICAgICAgICAgICAgIEdOVSBMRVNTRVIgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCisKKyAgMC4gVGhpcyBMaWNlbnNlIEFncmVlbWVudCBhcHBsaWVzIHRvIGFueSBzb2Z0d2FyZSBsaWJyYXJ5IG9yIG90aGVyCitwcm9ncmFtIHdoaWNoIGNvbnRhaW5zIGEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBvcgorb3RoZXIgYXV0aG9yaXplZCBwYXJ0eSBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZgordGhpcyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoYWxzbyBjYWxsZWQgInRoaXMgTGljZW5zZSIpLgorRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCisKKyAgQSAibGlicmFyeSIgbWVhbnMgYSBjb2xsZWN0aW9uIG9mIHNvZnR3YXJlIGZ1bmN0aW9ucyBhbmQvb3IgZGF0YQorcHJlcGFyZWQgc28gYXMgdG8gYmUgY29udmVuaWVudGx5IGxpbmtlZCB3aXRoIGFwcGxpY2F0aW9uIHByb2dyYW1zCisod2hpY2ggdXNlIHNvbWUgb2YgdGhvc2UgZnVuY3Rpb25zIGFuZCBkYXRhKSB0byBmb3JtIGV4ZWN1dGFibGVzLgorCisgIFRoZSAiTGlicmFyeSIsIGJlbG93LCByZWZlcnMgdG8gYW55IHN1Y2ggc29mdHdhcmUgbGlicmFyeSBvciB3b3JrCit3aGljaCBoYXMgYmVlbiBkaXN0cmlidXRlZCB1bmRlciB0aGVzZSB0ZXJtcy4gIEEgIndvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5IiBtZWFucyBlaXRoZXIgdGhlIExpYnJhcnkgb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlcgorY29weXJpZ2h0IGxhdzogdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBMaWJyYXJ5IG9yIGEKK3BvcnRpb24gb2YgaXQsIGVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQKK3N0cmFpZ2h0Zm9yd2FyZGx5IGludG8gYW5vdGhlciBsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMKK2luY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbiB0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pCisKKyAgIlNvdXJjZSBjb2RlIiBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKK21ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGEgbGlicmFyeSwgY29tcGxldGUgc291cmNlIGNvZGUgbWVhbnMKK2FsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueSBhc3NvY2lhdGVkCitpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvIGNvbnRyb2wKK2NvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGxpYnJhcnkuCisKKyAgQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKK2NvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKK3J1bm5pbmcgYSBwcm9ncmFtIHVzaW5nIHRoZSBMaWJyYXJ5IGlzIG5vdCByZXN0cmljdGVkLCBhbmQgb3V0cHV0IGZyb20KK3N1Y2ggYSBwcm9ncmFtIGlzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQKK29uIHRoZSBMaWJyYXJ5IChpbmRlcGVuZGVudCBvZiB0aGUgdXNlIG9mIHRoZSBMaWJyYXJ5IGluIGEgdG9vbCBmb3IKK3dyaXRpbmcgaXQpLiAgV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBMaWJyYXJ5IGRvZXMKK2FuZCB3aGF0IHRoZSBwcm9ncmFtIHRoYXQgdXNlcyB0aGUgTGlicmFyeSBkb2VzLgorCisgIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIExpYnJhcnkncworY29tcGxldGUgc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQKK3lvdSBjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuCithcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdAorYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkKK3dhcnJhbnR5OyBhbmQgZGlzdHJpYnV0ZSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIGFsb25nIHdpdGggdGhlCitMaWJyYXJ5LgorCisgIFlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksCithbmQgeW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhCitmZWUuCisMCisgIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIExpYnJhcnkgb3IgYW55IHBvcnRpb24KK29mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgY29weSBhbmQKK2Rpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQorYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKKworICAgIGEpIFRoZSBtb2RpZmllZCB3b3JrIG11c3QgaXRzZWxmIGJlIGEgc29mdHdhcmUgbGlicmFyeS4KKworICAgIGIpIFlvdSBtdXN0IGNhdXNlIHRoZSBmaWxlcyBtb2RpZmllZCB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCisKKyAgICBjKSBZb3UgbXVzdCBjYXVzZSB0aGUgd2hvbGUgb2YgdGhlIHdvcmsgdG8gYmUgbGljZW5zZWQgYXQgbm8KKyAgICBjaGFyZ2UgdG8gYWxsIHRoaXJkIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworICAgIGQpIElmIGEgZmFjaWxpdHkgaW4gdGhlIG1vZGlmaWVkIExpYnJhcnkgcmVmZXJzIHRvIGEgZnVuY3Rpb24gb3IgYQorICAgIHRhYmxlIG9mIGRhdGEgdG8gYmUgc3VwcGxpZWQgYnkgYW4gYXBwbGljYXRpb24gcHJvZ3JhbSB0aGF0IHVzZXMKKyAgICB0aGUgZmFjaWxpdHksIG90aGVyIHRoYW4gYXMgYW4gYXJndW1lbnQgcGFzc2VkIHdoZW4gdGhlIGZhY2lsaXR5CisgICAgaXMgaW52b2tlZCwgdGhlbiB5b3UgbXVzdCBtYWtlIGEgZ29vZCBmYWl0aCBlZmZvcnQgdG8gZW5zdXJlIHRoYXQsCisgICAgaW4gdGhlIGV2ZW50IGFuIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBseSBzdWNoIGZ1bmN0aW9uIG9yCisgICAgdGFibGUsIHRoZSBmYWNpbGl0eSBzdGlsbCBvcGVyYXRlcywgYW5kIHBlcmZvcm1zIHdoYXRldmVyIHBhcnQgb2YKKyAgICBpdHMgcHVycG9zZSByZW1haW5zIG1lYW5pbmdmdWwuCisKKyAgICAoRm9yIGV4YW1wbGUsIGEgZnVuY3Rpb24gaW4gYSBsaWJyYXJ5IHRvIGNvbXB1dGUgc3F1YXJlIHJvb3RzIGhhcworICAgIGEgcHVycG9zZSB0aGF0IGlzIGVudGlyZWx5IHdlbGwtZGVmaW5lZCBpbmRlcGVuZGVudCBvZiB0aGUKKyAgICBhcHBsaWNhdGlvbi4gIFRoZXJlZm9yZSwgU3Vic2VjdGlvbiAyZCByZXF1aXJlcyB0aGF0IGFueQorICAgIGFwcGxpY2F0aW9uLXN1cHBsaWVkIGZ1bmN0aW9uIG9yIHRhYmxlIHVzZWQgYnkgdGhpcyBmdW5jdGlvbiBtdXN0CisgICAgYmUgb3B0aW9uYWw6IGlmIHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgaXQsIHRoZSBzcXVhcmUKKyAgICByb290IGZ1bmN0aW9uIG11c3Qgc3RpbGwgY29tcHV0ZSBzcXVhcmUgcm9vdHMuKQorCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCitpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBMaWJyYXJ5LAorYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCit0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCitzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKK2Rpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAorb24gdGhlIExpYnJhcnksIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCit0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQorZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlCitpdC4KKworVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Cit5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KK2V4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgorY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgTGlicmFyeS4KKworSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgTGlicmFyeQord2l0aCB0aGUgTGlicmFyeSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnkpIG9uIGEgdm9sdW1lIG9mCithIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgordGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KKworICAzLiBZb3UgbWF5IG9wdCB0byBhcHBseSB0aGUgdGVybXMgb2YgdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZSB0byBhIGdpdmVuIGNvcHkgb2YgdGhlIExpYnJhcnkuICBUbyBkbwordGhpcywgeW91IG11c3QgYWx0ZXIgYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlLCBzbwordGhhdCB0aGV5IHJlZmVyIHRvIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLAoraW5zdGVhZCBvZiB0byB0aGlzIExpY2Vuc2UuICAoSWYgYSBuZXdlciB2ZXJzaW9uIHRoYW4gdmVyc2lvbiAyIG9mIHRoZQorb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaGFzIGFwcGVhcmVkLCB0aGVuIHlvdSBjYW4gc3BlY2lmeQordGhhdCB2ZXJzaW9uIGluc3RlYWQgaWYgeW91IHdpc2guKSAgRG8gbm90IG1ha2UgYW55IG90aGVyIGNoYW5nZSBpbgordGhlc2Ugbm90aWNlcy4KK15MCisgIE9uY2UgdGhpcyBjaGFuZ2UgaXMgbWFkZSBpbiBhIGdpdmVuIGNvcHksIGl0IGlzIGlycmV2ZXJzaWJsZSBmb3IKK3RoYXQgY29weSwgc28gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gYWxsCitzdWJzZXF1ZW50IGNvcGllcyBhbmQgZGVyaXZhdGl2ZSB3b3JrcyBtYWRlIGZyb20gdGhhdCBjb3B5LgorCisgIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSB3aXNoIHRvIGNvcHkgcGFydCBvZiB0aGUgY29kZSBvZgordGhlIExpYnJhcnkgaW50byBhIHByb2dyYW0gdGhhdCBpcyBub3QgYSBsaWJyYXJ5LgorCisgIDQuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYSBwb3J0aW9uIG9yCitkZXJpdmF0aXZlIG9mIGl0LCB1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybQordW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWNjb21wYW55CitpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUsIHdoaWNoCittdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEKK21lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZS4KKworICBJZiBkaXN0cmlidXRpb24gb2Ygb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQorZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUKK3NvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2Ugc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudCB0bworZGlzdHJpYnV0ZSB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAorY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KKworICA1LiBBIHByb2dyYW0gdGhhdCBjb250YWlucyBubyBkZXJpdmF0aXZlIG9mIGFueSBwb3J0aW9uIG9mIHRoZQorTGlicmFyeSwgYnV0IGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCB0aGUgTGlicmFyeSBieSBiZWluZyBjb21waWxlZCBvcgorbGlua2VkIHdpdGggaXQsIGlzIGNhbGxlZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIuICBTdWNoIGEKK3dvcmssIGluIGlzb2xhdGlvbiwgaXMgbm90IGEgZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5LCBhbmQKK3RoZXJlZm9yZSBmYWxscyBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgSG93ZXZlciwgbGlua2luZyBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeQorY3JlYXRlcyBhbiBleGVjdXRhYmxlIHRoYXQgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5IChiZWNhdXNlIGl0Citjb250YWlucyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSksIHJhdGhlciB0aGFuIGEgIndvcmsgdGhhdCB1c2VzIHRoZQorbGlicmFyeSIuICBUaGUgZXhlY3V0YWJsZSBpcyB0aGVyZWZvcmUgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UuCitTZWN0aW9uIDYgc3RhdGVzIHRlcm1zIGZvciBkaXN0cmlidXRpb24gb2Ygc3VjaCBleGVjdXRhYmxlcy4KKworICBXaGVuIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB1c2VzIG1hdGVyaWFsIGZyb20gYSBoZWFkZXIgZmlsZQordGhhdCBpcyBwYXJ0IG9mIHRoZSBMaWJyYXJ5LCB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIG1heSBiZSBhCitkZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnkgZXZlbiB0aG91Z2ggdGhlIHNvdXJjZSBjb2RlIGlzIG5vdC4KK1doZXRoZXIgdGhpcyBpcyB0cnVlIGlzIGVzcGVjaWFsbHkgc2lnbmlmaWNhbnQgaWYgdGhlIHdvcmsgY2FuIGJlCitsaW5rZWQgd2l0aG91dCB0aGUgTGlicmFyeSwgb3IgaWYgdGhlIHdvcmsgaXMgaXRzZWxmIGEgbGlicmFyeS4gIFRoZQordGhyZXNob2xkIGZvciB0aGlzIHRvIGJlIHRydWUgaXMgbm90IHByZWNpc2VseSBkZWZpbmVkIGJ5IGxhdy4KKworICBJZiBzdWNoIGFuIG9iamVjdCBmaWxlIHVzZXMgb25seSBudW1lcmljYWwgcGFyYW1ldGVycywgZGF0YQorc3RydWN0dXJlIGxheW91dHMgYW5kIGFjY2Vzc29ycywgYW5kIHNtYWxsIG1hY3JvcyBhbmQgc21hbGwgaW5saW5lCitmdW5jdGlvbnMgKHRlbiBsaW5lcyBvciBsZXNzIGluIGxlbmd0aCksIHRoZW4gdGhlIHVzZSBvZiB0aGUgb2JqZWN0CitmaWxlIGlzIHVucmVzdHJpY3RlZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIGxlZ2FsbHkgYSBkZXJpdmF0aXZlCit3b3JrLiAgKEV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhpcyBvYmplY3QgY29kZSBwbHVzIHBvcnRpb25zIG9mIHRoZQorTGlicmFyeSB3aWxsIHN0aWxsIGZhbGwgdW5kZXIgU2VjdGlvbiA2LikKKworICBPdGhlcndpc2UsIGlmIHRoZSB3b3JrIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSwgeW91IG1heQorZGlzdHJpYnV0ZSB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDYuCitBbnkgZXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGF0IHdvcmsgYWxzbyBmYWxsIHVuZGVyIFNlY3Rpb24gNiwKK3doZXRoZXIgb3Igbm90IHRoZXkgYXJlIGxpbmtlZCBkaXJlY3RseSB3aXRoIHRoZSBMaWJyYXJ5IGl0c2VsZi4KK15MCisgIDYuIEFzIGFuIGV4Y2VwdGlvbiB0byB0aGUgU2VjdGlvbnMgYWJvdmUsIHlvdSBtYXkgYWxzbyBjb21iaW5lIG9yCitsaW5rIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB3aXRoIHRoZSBMaWJyYXJ5IHRvIHByb2R1Y2UgYQord29yayBjb250YWluaW5nIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5LCBhbmQgZGlzdHJpYnV0ZSB0aGF0IHdvcmsKK3VuZGVyIHRlcm1zIG9mIHlvdXIgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHRoZSB0ZXJtcyBwZXJtaXQKK21vZGlmaWNhdGlvbiBvZiB0aGUgd29yayBmb3IgdGhlIGN1c3RvbWVyJ3Mgb3duIHVzZSBhbmQgcmV2ZXJzZQorZW5naW5lZXJpbmcgZm9yIGRlYnVnZ2luZyBzdWNoIG1vZGlmaWNhdGlvbnMuCisKKyAgWW91IG11c3QgZ2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggZWFjaCBjb3B5IG9mIHRoZSB3b3JrIHRoYXQgdGhlCitMaWJyYXJ5IGlzIHVzZWQgaW4gaXQgYW5kIHRoYXQgdGhlIExpYnJhcnkgYW5kIGl0cyB1c2UgYXJlIGNvdmVyZWQgYnkKK3RoaXMgTGljZW5zZS4gIFlvdSBtdXN0IHN1cHBseSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAgSWYgdGhlIHdvcmsKK2R1cmluZyBleGVjdXRpb24gZGlzcGxheXMgY29weXJpZ2h0IG5vdGljZXMsIHlvdSBtdXN0IGluY2x1ZGUgdGhlCitjb3B5cmlnaHQgbm90aWNlIGZvciB0aGUgTGlicmFyeSBhbW9uZyB0aGVtLCBhcyB3ZWxsIGFzIGEgcmVmZXJlbmNlCitkaXJlY3RpbmcgdGhlIHVzZXIgdG8gdGhlIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAgQWxzbywgeW91IG11c3QgZG8gb25lCitvZiB0aGVzZSB0aGluZ3M6CisKKyAgICBhKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZworICAgIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUgZm9yIHRoZSBMaWJyYXJ5IGluY2x1ZGluZyB3aGF0ZXZlcgorICAgIGNoYW5nZXMgd2VyZSB1c2VkIGluIHRoZSB3b3JrICh3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyCisgICAgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSk7IGFuZCwgaWYgdGhlIHdvcmsgaXMgYW4gZXhlY3V0YWJsZSBsaW5rZWQKKyAgICB3aXRoIHRoZSBMaWJyYXJ5LCB3aXRoIHRoZSBjb21wbGV0ZSBtYWNoaW5lLXJlYWRhYmxlICJ3b3JrIHRoYXQKKyAgICB1c2VzIHRoZSBMaWJyYXJ5IiwgYXMgb2JqZWN0IGNvZGUgYW5kL29yIHNvdXJjZSBjb2RlLCBzbyB0aGF0IHRoZQorICAgIHVzZXIgY2FuIG1vZGlmeSB0aGUgTGlicmFyeSBhbmQgdGhlbiByZWxpbmsgdG8gcHJvZHVjZSBhIG1vZGlmaWVkCisgICAgZXhlY3V0YWJsZSBjb250YWluaW5nIHRoZSBtb2RpZmllZCBMaWJyYXJ5LiAgKEl0IGlzIHVuZGVyc3Rvb2QKKyAgICB0aGF0IHRoZSB1c2VyIHdobyBjaGFuZ2VzIHRoZSBjb250ZW50cyBvZiBkZWZpbml0aW9ucyBmaWxlcyBpbiB0aGUKKyAgICBMaWJyYXJ5IHdpbGwgbm90IG5lY2Vzc2FyaWx5IGJlIGFibGUgdG8gcmVjb21waWxlIHRoZSBhcHBsaWNhdGlvbgorICAgIHRvIHVzZSB0aGUgbW9kaWZpZWQgZGVmaW5pdGlvbnMuKQorCisgICAgYikgVXNlIGEgc3VpdGFibGUgc2hhcmVkIGxpYnJhcnkgbWVjaGFuaXNtIGZvciBsaW5raW5nIHdpdGggdGhlCisgICAgTGlicmFyeS4gIEEgc3VpdGFibGUgbWVjaGFuaXNtIGlzIG9uZSB0aGF0ICgxKSB1c2VzIGF0IHJ1biB0aW1lIGEKKyAgICBjb3B5IG9mIHRoZSBsaWJyYXJ5IGFscmVhZHkgcHJlc2VudCBvbiB0aGUgdXNlcidzIGNvbXB1dGVyIHN5c3RlbSwKKyAgICByYXRoZXIgdGhhbiBjb3B5aW5nIGxpYnJhcnkgZnVuY3Rpb25zIGludG8gdGhlIGV4ZWN1dGFibGUsIGFuZCAoMikKKyAgICB3aWxsIG9wZXJhdGUgcHJvcGVybHkgd2l0aCBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIGlmCisgICAgdGhlIHVzZXIgaW5zdGFsbHMgb25lLCBhcyBsb25nIGFzIHRoZSBtb2RpZmllZCB2ZXJzaW9uIGlzCisgICAgaW50ZXJmYWNlLWNvbXBhdGlibGUgd2l0aCB0aGUgdmVyc2lvbiB0aGF0IHRoZSB3b3JrIHdhcyBtYWRlIHdpdGguCisKKyAgICBjKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdAorICAgIHRocmVlIHllYXJzLCB0byBnaXZlIHRoZSBzYW1lIHVzZXIgdGhlIG1hdGVyaWFscyBzcGVjaWZpZWQgaW4KKyAgICBTdWJzZWN0aW9uIDZhLCBhYm92ZSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB0aGUgY29zdCBvZgorICAgIHBlcmZvcm1pbmcgdGhpcyBkaXN0cmlidXRpb24uCisKKyAgICBkKSBJZiBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQorICAgIGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCBvZmZlciBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZSBhYm92ZQorICAgIHNwZWNpZmllZCBtYXRlcmlhbHMgZnJvbSB0aGUgc2FtZSBwbGFjZS4KKworICAgIGUpIFZlcmlmeSB0aGF0IHRoZSB1c2VyIGhhcyBhbHJlYWR5IHJlY2VpdmVkIGEgY29weSBvZiB0aGVzZQorICAgIG1hdGVyaWFscyBvciB0aGF0IHlvdSBoYXZlIGFscmVhZHkgc2VudCB0aGlzIHVzZXIgYSBjb3B5LgorCisgIEZvciBhbiBleGVjdXRhYmxlLCB0aGUgcmVxdWlyZWQgZm9ybSBvZiB0aGUgIndvcmsgdGhhdCB1c2VzIHRoZQorTGlicmFyeSIgbXVzdCBpbmNsdWRlIGFueSBkYXRhIGFuZCB1dGlsaXR5IHByb2dyYW1zIG5lZWRlZCBmb3IKK3JlcHJvZHVjaW5nIHRoZSBleGVjdXRhYmxlIGZyb20gaXQuICBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLAordGhlIG1hdGVyaWFscyB0byBiZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlIGFueXRoaW5nIHRoYXQgaXMKK25vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeSBmb3JtKSB3aXRoIHRoZSBtYWpvcgorY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBvbgord2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50IGl0c2VsZiBhY2NvbXBhbmllcwordGhlIGV4ZWN1dGFibGUuCisKKyAgSXQgbWF5IGhhcHBlbiB0aGF0IHRoaXMgcmVxdWlyZW1lbnQgY29udHJhZGljdHMgdGhlIGxpY2Vuc2UKK3Jlc3RyaWN0aW9ucyBvZiBvdGhlciBwcm9wcmlldGFyeSBsaWJyYXJpZXMgdGhhdCBkbyBub3Qgbm9ybWFsbHkKK2FjY29tcGFueSB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gIFN1Y2ggYSBjb250cmFkaWN0aW9uIG1lYW5zIHlvdSBjYW5ub3QKK3VzZSBib3RoIHRoZW0gYW5kIHRoZSBMaWJyYXJ5IHRvZ2V0aGVyIGluIGFuIGV4ZWN1dGFibGUgdGhhdCB5b3UKK2Rpc3RyaWJ1dGUuCiteTAorICA3LiBZb3UgbWF5IHBsYWNlIGxpYnJhcnkgZmFjaWxpdGllcyB0aGF0IGFyZSBhIHdvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5IHNpZGUtYnktc2lkZSBpbiBhIHNpbmdsZSBsaWJyYXJ5IHRvZ2V0aGVyIHdpdGggb3RoZXIgbGlicmFyeQorZmFjaWxpdGllcyBub3QgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHN1Y2ggYSBjb21iaW5lZAorbGlicmFyeSwgcHJvdmlkZWQgdGhhdCB0aGUgc2VwYXJhdGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3b3JrIGJhc2VkIG9uCit0aGUgTGlicmFyeSBhbmQgb2YgdGhlIG90aGVyIGxpYnJhcnkgZmFjaWxpdGllcyBpcyBvdGhlcndpc2UKK3Blcm1pdHRlZCwgYW5kIHByb3ZpZGVkIHRoYXQgeW91IGRvIHRoZXNlIHR3byB0aGluZ3M6CisKKyAgICBhKSBBY2NvbXBhbnkgdGhlIGNvbWJpbmVkIGxpYnJhcnkgd2l0aCBhIGNvcHkgb2YgdGhlIHNhbWUgd29yaworICAgIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCB1bmNvbWJpbmVkIHdpdGggYW55IG90aGVyIGxpYnJhcnkKKyAgICBmYWNpbGl0aWVzLiAgVGhpcyBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAgICBTZWN0aW9ucyBhYm92ZS4KKworICAgIGIpIEdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIHRoZSBjb21iaW5lZCBsaWJyYXJ5IG9mIHRoZSBmYWN0CisgICAgdGhhdCBwYXJ0IG9mIGl0IGlzIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGV4cGxhaW5pbmcKKyAgICB3aGVyZSB0byBmaW5kIHRoZSBhY2NvbXBhbnlpbmcgdW5jb21iaW5lZCBmb3JtIG9mIHRoZSBzYW1lIHdvcmsuCisKKyAgOC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yIGRpc3RyaWJ1dGUKK3RoZSBMaWJyYXJ5IGV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55CithdHRlbXB0IG90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIGxpbmsgd2l0aCwgb3IKK2Rpc3RyaWJ1dGUgdGhlIExpYnJhcnkgaXMgdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91cgorcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4gIEhvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLAorb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlciB0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcwordGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2ggcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgorCisgIDkuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAorc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKK2Rpc3RyaWJ1dGUgdGhlIExpYnJhcnkgb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQorcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQorbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5KSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAorYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwordGhlIExpYnJhcnkgb3Igd29ya3MgYmFzZWQgb24gaXQuCisKKyAgMTAuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkpLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCitvcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlLCBsaW5rIHdpdGggb3IgbW9kaWZ5IHRoZSBMaWJyYXJ5CitzdWJqZWN0IHRvIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCityZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCitZb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB3aXRoCit0aGlzIExpY2Vuc2UuCiteTAorICAxMS4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKK2NvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90CitkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91CittYXkgbm90IGRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50CitsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5IGJ5CithbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KK3RoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIExpYnJhcnkuCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bworYXBwbHksIGFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyCitjaXJjdW1zdGFuY2VzLgorCitJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55CitwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQorc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQoraW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0gd2hpY2ggaXMKK2ltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQorZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAordGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKK3RvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAoraW1wb3NlIHRoYXQgY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KK2JlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorCisgIDEyLiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIExpYnJhcnkgaXMgcmVzdHJpY3RlZCBpbgorY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCitvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIExpYnJhcnkgdW5kZXIgdGhpcyBMaWNlbnNlCittYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcgdGhvc2UKK2NvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKK2NvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwordGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMTMuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3Cit2ZXJzaW9ucyBvZiB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuCitTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsIGJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sCitidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8gYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCisKK0VhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIExpYnJhcnkKK3NwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZAorImFueSBsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZAorY29uZGl0aW9ucyBlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBMaWJyYXJ5IGRvZXMgbm90IHNwZWNpZnkgYQorbGljZW5zZSB2ZXJzaW9uIG51bWJlciwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiteTAorICAxNC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIExpYnJhcnkgaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgaW5jb21wYXRpYmxlIHdpdGggdGhlc2UsCit3cml0ZSB0byB0aGUgYXV0aG9yIHRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcworY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcyBtYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIKK2RlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMgb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMKK29mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQgb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nCithbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk8gV0FSUkFOVFkKKworICAxNS4gQkVDQVVTRSBUSEUgTElCUkFSWSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8KK1dBUlJBTlRZIEZPUiBUSEUgTElCUkFSWSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuCitFWENFUFQgV0hFTiBPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUgorT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRSBMSUJSQVJZICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkKK0tJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCitQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUKK0xJQlJBUlkgSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFIExJQlJBUlkgUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FCitUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTYuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4KK1dSSVRJTkcgV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZCitBTkQvT1IgUkVESVNUUklCVVRFIFRIRSBMSUJSQVJZIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVQorRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUgorQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUKK0xJQlJBUlkgKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcKK1JFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBCitGQUlMVVJFIE9GIFRIRSBMSUJSQVJZIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgU09GVFdBUkUpLCBFVkVOIElGCitTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICitEQU1BR0VTLgorCisgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKK15MCisgICAgICAgICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBMaWJyYXJpZXMKKworICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBsaWJyYXJ5LCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Citwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgd2UgcmVjb21tZW5kIG1ha2luZyBpdCBmcmVlIHNvZnR3YXJlIHRoYXQKK2V2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZS4gIFlvdSBjYW4gZG8gc28gYnkgcGVybWl0dGluZworcmVkaXN0cmlidXRpb24gdW5kZXIgdGhlc2UgdGVybXMgKG9yLCBhbHRlcm5hdGl2ZWx5LCB1bmRlciB0aGUgdGVybXMKK29mIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlKS4KKworICBUbyBhcHBseSB0aGVzZSB0ZXJtcywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgbGlicmFyeS4KK0l0IGlzIHNhZmVzdCB0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0CitlZmZlY3RpdmVseSBjb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQKK2hhdmUgYXQgbGVhc3QgdGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbAorbm90aWNlIGlzIGZvdW5kLgorCisKKyAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgbGlicmFyeSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgorICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+CisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgIFVTQQorCitBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KKworWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yCit5b3VyIHNjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIGxpYnJhcnksCitpZiBuZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6CisKKyAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUKKyAgbGlicmFyeSBgRnJvYicgKGEgbGlicmFyeSBmb3IgdHdlYWtpbmcga25vYnMpIHdyaXR0ZW4gYnkgSmFtZXMKKyAgUmFuZG9tIEhhY2tlci4KKworICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5OTAKKyAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKKworVGhhdCdzIGFsbCB0aGVyZSBpcyB0byBpdCEKKworCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvQ2hhbmdlTG9nIGIvbGliZ2NyeXB0LTEuNC42L0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGNhNzM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L0NoYW5nZUxvZwpAQCAtMCwwICsxLDEzNTggQEAKKzIwMTAtMDctMTMgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwlSZWxlYXNlIDEuNC42LgorCisJKiBjb25maWd1cmUuYWM6IEJ1bXAgTFQgdmVyc2lvbiB0byBDMTcvQTYvUjAuCisKKzIwMDktMTItMTEgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwlSZWxlYXNlIDEuNC41LgorCisJKiBjb25maWd1cmUuYWM6IEJ1bXAgTFQgdmVyc2lvbiB0byBDMTYvQTUvUjMuCisKKwkqIGNvbmZpZ3VyZS5hYzogQWRkIG9wdGlvbiAtLWRpc2FibGUtTy1mbGFnLW11bmdpbmcuCisKKzIwMDktMDEtMjIgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwlSZWxlYXNlIDEuNC40LgorCisJKiBjb25maWd1cmUuYWM6IEJ1bXAgTFQgdmVyc2lvbiB0byBDMTYvQTUvUjIuCisKKzIwMDgtMTAtMzAgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzogUmVtb3ZlIG9wdGlvbiAtLWVuYWJsZS1nY2Mtd2FybmluZ3MuICBBdXRvZGV0ZWN0CisJdXNlZnVsIGdjYyB3YXJuaW5ncyBpbiBtYWludGFpbmVyIG1vZGUuCisKKzIwMDgtMDktMTggIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwlSZWxlYXNlIDEuNC4zLgorCisJKiBjb25maWd1cmUuYWM6IEJ1bXAgTFQgdmVyc2lvbiB0byBDMTYvQTUvUjEuCisKKzIwMDgtMDktMTUgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzogQ2VoY2sgZm9yIHN5c2xvZy4KKworMjAwOC0wOS0wOCAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCVJlbGVhc2UgMS40LjIuCisKKzIwMDgtMDktMDEgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwlSZWxlYXNlIDEuNC4ycmMyLgorCisJKiBjb25maWd1cmUuYWM6IFVwZGF0ZSBzdm5fcmV2aXNpb24gbWFjcm8uCisKKzIwMDgtMDgtMjIgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzogQWRkIG9wdGlvbiAtLWVuYWJsZS1obWFjLWJpbmFyeS1jaGVjay4KKwkoRExfTElCUyk6IENoZWNrIHdoZXRoZXIgLWxkbCBpcyByZXF1aXJlZC4KKworMjAwOC0wOC0xOSAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCVJlbGVhc2UgMS40LjJyYzEuCisKKwkqIGNvbmZpZ3VyZS5hYzogQnVtcCBMVCB2ZXJzaW9uIHRvIEMxNi9BNS9SMC4KKworMjAwOC0wOC0xOCAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBSZW1vdmUgdGhlIHVudXNlZCBCVUdTIGZpbGUuCisKKzIwMDgtMDgtMTUgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYyAoQUhfQk9UVE9NKTogRGVmaW5lIEdDUllfR1BHX0VSUl9OT1RfT1BFUkFUSU9OQUwuCisKKzIwMDgtMDctMDUgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIHJhbmRvbS86IE5ldy4KKwkqIE1ha2VmaWxlLmFtIChESVNUX1NVQkRJUlMpOiBBZGQgcmFuZG9tLgorCSogY29uZmlndXJlLmFjIChBQ19DT05GSUdfRklMRVMpOiBBZGQgcmFuZG9tL01ha2VmaWxlLgorCisyMDA4LTA0LTI1ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJUmVsZWFzZSAxLjQuMS4KKworCSogY29uZmlndXJlLmFjOiBCdW1wIExUIHZlcnNpb24gdG8gQzE1L0E0L1I0LgorCisyMDA4LTA0LTIyICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBjb25maWd1cmUuYWM6IFNldCB2ZXJzaW9uIHRvIDEuNC4xcmMxLgorCisyMDA4LTA0LTE4ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBjb25maWd1cmUuYWMgKEFIX0JPVFRPTSk6IEFkZCBDQU1FTExJQV9FWFRfU1lNX1BSRUZJWC4KKwkoTkFNRV9PRl9ERVZfUkFORE9NKTogIFJlbW92ZSBzcGVjaWFsIGNhc2VzIGZvciBTb2xhcmlzIGV0Yy4gIFRoaXMKKwltYXRjaGVzIHRoZSBnbnVwZyAxLjQuOSB2ZXJzaW9uLgorCisyMDA4LTA0LTAxICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBjb25maWd1cmUuYWMgKEFDX0lOSVQpOiBGaXggcXVvdGluZy4KKworMjAwOC0wMy0xOSAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogY29uZmlndXJlLmFjOiBGaXggdGhlIHRlc3RzIGZvciBVU0VfPGFsZ28+IHRvIGVpdGhlciBkZWZpbmUgb3IKKwl1bmRlZiB0aGUgbWFjcm9zLiAgU3VnZ2VzdGVkIGJ5IERpcmsgU3RvZWNrZXIuCisKKzIwMDgtMDMtMTggIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzogVGVzdCBmb3IgdWludHB0cl90LgorCisyMDA4LTAyLTE4ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBjb25maWd1cmUuYWMgKElTX0RFVkVMT1BNRU5UX1ZFUlNJT04pOiBTZXQgZGVwZW5kaW5nIG9uIHRoZSBteV9zdm4uCisKKzIwMDctMTItMTEgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzogV2UgYWN0dWFsbHkgcmVxdWlyZSBsaWJncGctZXJyb3IgMS40LiAgUmVwb3J0ZWQgYnkKKwlUaW0gTW9vbmV5LgorCisyMDA3LTEyLTEwICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJUmVsZWFzZWQgMS40LjAuCisKKwkqIGNvbmZpZ3VyZS5hYzogU2V0IExUIHRvIEMxNS9BNC9SMy4KKworMjAwNy0xMi0wNSAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogY29uZmlndXJlLmFjOiBBZGQgb3B0aW9uIC0tZGlzYWJsZS1wYWRsb2NrLXN1cHBvcnQuCisKKzIwMDctMTItMDMgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwlSZWxlYXNlZCAxLjMuMi4KKworCSogY29uZmlndXJlLmFjOiBTZXQgTFQgdG8gQzE1L0E0L1IyLgorCisJKiBjb25maWcuc3ViLCBjb25maWcuZ3Vlc3M6IFVwZGF0ZSB0byB2ZXJzaW9uIDIwMDctMTEtMTkuCisKKzIwMDctMTAtMzAgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzogUHJvdGVjdCBjb25maWcuaCBhZ2FpbnN0IGRvdWJsZSBpbmNsdXNpb24uCisKKzIwMDctMTAtMjYgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwlSZWxlYXNlZCAxLjMuMS4KKworCSogY29uZmlndXJlLmFjOiBTZXQgTFQgdG8gQzE1L0E0L1IxLgorCisyMDA3LTA4LTIyICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBSRUFETUU6IFJld3JpdGUgdGhlIGxpY2Vuc2UgZGVzY3JpcHRpb24uCisJKiBjb25maWd1cmUuYWMgKFVTRV9STkRXMzIsIFVTRV9STkRVTklYKTogVW5tYXJrIGFzIEdQTCBtb2R1bGVzLgorCisyMDA3LTA4LTA4ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBjb25maWd1cmUuYWM6IFVzZSAkaG9zdCBhbmQgbm90ICR0YXJnZXQuCisKKzIwMDctMDctMjYgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGFjaW5jbHVkZS5tNCAoR05VUEdfU1lTX1NZTUJPTF9VTkRFUlNDT1JFKTogRml4IGEgc3ludGF4IGVycm9yCisJaW4gdGhlIHRlc3QgcHJvZ3JhbSB3aGljaCBsdXJrZWQgdGhlcmUgZm9yIDQgeWVhcnMuICBBZGp1c3RlZCBuYW1lCisJb2YgbGlidG9vbHMgZ2xvYmFsX3N5c3RlbV9waXBlIHZhcmlhYmxlIGFuZCBhZGQgZXh0cmEgY3V0IHN0YWdlLgorCVJlcG9ydGVkIGJ5IEdyZWdvciBSaWVwbC4KKworMjAwNy0wNi0xNSAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogYXV0b2dlbi5zaCAoRk9SQ0UpOiBVc2UgPSBhbmQgbm90ID09IGluIHRlc3QgdG8gYmUgUE9TSVhseSBjb3JyZWN0LgorCisyMDA3LTA1LTMwICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBjb25maWd1cmUuYWM6IENhbWVsbGlhIGlzIG5vIGxvbmdlciBHUEwuCisKKzIwMDctMDUtMjQgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzogVHJ5IHRvIHVzZSAtV3BvaW50ZXItYXJpdGguCisKKzIwMDctMDUtMTkgIE1hcmN1cyBCcmlua21hbm4gIDxtYXJjdXNAZzEwY29kZS5kZT4KKworCSogY29uZmlndXJlLmFjOiBGaXggdGVzdCBmb3Igb3B0aW9uYWwgVURJViBhbmQgVURJVl9RUk5ORCBNUEkKKwltb2R1bGVzLgorCisyMDA3LTA1LTA5ICBNYXJjdXMgQnJpbmttYW5uICA8bWFyY3VzQGcxMGNvZGUuZGU+CisKKwkqIGNvbmZpZ3VyZS5hYyAoYWNfY3ZfbXBpX2NvbmZpZ19kb25lKTogVW51c2VkIHZhcmlhYmxlIHJlbW92ZWQuCisJKGFjX2N2X21waV9tb2RfbGlzdCwgTVBJX01PRF9MSVNUX0xPLCBNUElfTU9EX0xJU1RfTyk6IFJlbW92ZWQuCisJKE1QSV9NT0RfQVNNX01QSUhfQUREMSwgTVBJX01PRF9BU01fTVBJSF9TVUIxLAorCU1QSV9NT0RfQVNNX01QSUhfTVVMMSwgTVBJX01PRF9BU01fTVBJSF9NVUwyLAorCU1QSV9NT0RfQVNNX01QSUhfTVVMMywgTVBJX01PRF9BU01fTVBJSF9MU0hJRlQsCisJTVBJX01PRF9BU01fTVBJSF9SU0hJRlQsIE1QSV9NT0RfQVNNX01QSUhfVURJViwKKwlNUElfTU9EX0FTTV9NUElIX1VESVZfUVJOTkQsIE1QSV9NT0RfQ19NUElIX0FERDEsCisJTVBJX01PRF9DX01QSUhfU1VCMSwgTVBJX01PRF9DX01QSUhfTVVMMSwgTVBJX01PRF9DX01QSUhfTVVMMiwKKwlNUElfTU9EX0NfTVBJSF9NVUwzLCBNUElfTU9EX0NfTVBJSF9MU0hJRlQsIE1QSV9NT0RfQ19NUElIX1JTSElGVCwKKwlNUElfTU9EX0NfTVBJSF9VRElWLCBNUElfTU9EX0NfTVBJSF9VRElWX1FSTk5EKTogTmV3IGF1dG9tYWtlCisJdmFyaWFibGVzLgorCisyMDA3LTA1LTA0ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJUmVsZWFzZWQgMS4zLjAuCisKKwkqIGNvbmZpZ3VyZS5hYzogU2V0IExUIHRvIEMxNS9BNC9SMC4KKworCSogY29uZmlndXJlLmFjOiBSZXF1aXJlIGF1dG9tYWtlIDEuMTAKKwkoQU1fUFJPR19DQ19DX08pOiBOZXcuCisKKzIwMDctMDUtMDMgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzogRml4IGRldGVjdGlvbiBvZiBHUExlZCByYW5kb20gbW9kdWxlcy4KKworMjAwNy0wNS0wMiAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogY29uZmlndXJlLmFjIChMSUJHQ1JZUFRfRElHRVNUUywgTElCR0NSWVBUX0NJUEhFUlMpCisJKExJQkdDUllQVF9QVUJLRVlfQ0lQSEVSUyk6IEFjX2RlZmluZSBsaXN0cyBvZiBhbGdvcml0aG1zLgorCShkZWZhdWx0X2NpcGhlcnMpOiBEb24ndCBtYWtlIGNhbWVsbGlhIGEgZGVmYXVsdC4KKworMjAwNy0wNS0wMiAgRGF2aWQgU2hhdyAgPGRzaGF3QGphYmJlcndvY2t5LmNvbT4KKworCSogTkVXUywgY29uZmlndXJlLmFjOiBBZGQgQ2FtZWxsaWEuCisKKzIwMDctMDQtMzAgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIFJFQURNRS5hcGljaGFuZ2VzOiBNb3ZlIHRvIGRvYy8uCisJKiBNYWtlZmlsZS5hbSAoRVhUUkFfRElTVCk6IFJlbW92ZWQgdGhhdCBmaWxlLgorCisyMDA3LTA0LTI4ICBNYXJjdXMgQnJpbmttYW5uICA8bWFyY3VzQGcxMGNvZGUuZGU+CisKKwkqIGNvbmZpZ3VyZS5hYzogQWxsb3cgdG8gc3BlY2lmeSBhZGRpdGlvbmFsIHNlYXJjaCBkaXJlY3RvcmllcworCXdpdGggLS1lbmFibGUtbXBpLXBhdGguCisKKzIwMDctMDQtMTYgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzogQ2hlY2sgZm9yIHN5c2NvbmYuCisJKiBhY2luY2x1ZGUubTQgKEdOVVBHX0NIRUNLX01MT0NLKTogVHJ5IHRvIHVzZSBzeXNjb25mIHRvIGdldCB0aGUKKwlwYWdlIHNpemUgYW5kIHVzZSBnZXRwYWdlc2l6ZSBvbmx5IHRoZW4gaWYgYXZhaWxhYmxlLgorCisyMDA3LTAzLTIyICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBjb25maWd1cmUuYWM6IEFkZCBzdXBwb3J0IGZvciBFQ0MuCisKKzIwMDctMDItMjIgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChESVNUQ0hFQ0tfQ09ORklHVVJFX0ZMQUdTKTogVXNlCisJLS1lbmFibGUtcmFuZG9tLWRhZW1vbi4KKworCSogY29uZmlndXJlLmFjOiBOZXcgb3B0aW9uIC0tZW5hYmxlLXJhbmRvbS1kYWVtb24uCisJQ3JlYXRlIHZlcnNpb25pbmZvLnJjIGFuZCBwcm92aWRlIHRoZSBidWlsZCBpbmZvcm1hdGlvbi4KKworMjAwNy0wMi0yMSAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogTWFrZWZpbGUuYW0sIGNvbmZpZ3VyZS5hYzogSWdub3JlIHczMi1kbGwvLgorCisyMDA3LTAyLTIwICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBjb25maWd1cmUuYWM6IEJ1bXAgTFQgdmVyc2lvbiB0byBDMTQvQTMvUjAgaW4gcHJlcGFyYXRpb24gZm9yIGEKKwlyZWxlYXNlLgorCisJKiBhdXRvZ2VuLnNoOiBBZGQgb3B0aW9uIC0tZm9yY2UuCisJKiBjb25maWd1cmUuYWM6IE5ldyBvcHRpb24gLS1kaXNhYmxlLWVuZGlhbi1jaGVjay4gIFVzZSBhIHJlYWwKKwlub2V4ZWNzdGFjayB0ZXN0IGluc3RlYWQgb2YgcmVxdWlyaW5nIGFuIG9wdGlvbi4gIEFkZCBTVk4gdmVyc2lvbgorCW1hZ2ljLgorCisyMDA3LTAyLTAyICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBjb25maWd1cmUuYWMgKEZBTExCQUNLX1NPQ0tMRU5fVCk6IFNwZWNpYWwgY2FzZSBmb3IgbWluZ3czMi4KKworMjAwNi0xMS0xNSAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogYXV0b2dlbi5zaDogQWRkIGNvbnZlbmllbmNlIG9wdGlvbiAtLWJ1aWxkLWFtZDY0LgorCisyMDA2LTEwLTIwICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBNYWtlZmlsZS5hbSAoc3Rvd2luc3RhbGwpOiBOZXcgY29udmVuaWVuY2UgdGFyZ2V0LgorCisyMDA2LTEwLTEyICBNYXJjdXMgQnJpbmttYW5uICA8bWFyY3VzQGcxMGNvZGUuZGU+CisKKwkqIGNvbmZpZ3VyZS5hYyAoRkFMTEJBQ0tfU09DS0xFTl9UKTogVGhpcmQgdGltZSBpcyBhIGNoYXJtLgorCURlZmluZSBnY3J5X3NvY2tsZW5fdCwgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggc29ja2xlbl90CisJZGVmaW5pdGlvbnMgYnkgYXV0b2NvbmYuCisKKzIwMDYtMTAtMTEgIE1hcmN1cyBCcmlua21hbm4gIDxtYXJjdXNAZzEwY29kZS5kZT4KKworCSogY29uZmlndXJlLmFjIChGQUxMQkFDS19TT0NLTEVOX1QpOiBSZXdyaXRlIGluIHRlcm1zIG9mCisJc29ja2xlbi5tNC4KKworMjAwNi0xMC0xMSAgTWFyY3VzIEJyaW5rbWFubiAgPG1hcmN1c0BnMTBjb2RlLmRlPgorCisJKiBhY2luY2x1ZGUubTQgKEdOVVBHX0ZJWF9IRFJfVkVSU0lPTik6IFJlbW92ZWQuCisJKiBjb25maWd1cmUuYWM6IERvIG5vdCBjYWxsIEdOVVBHX0ZJWF9IRFJfVkVSU0lPTi4KKworMjAwNi0xMC0xMCAgTWFyY3VzIEJyaW5rbWFubiAgPG1hcmN1c0BnMTBjb2RlLmRlPgorCisJKiBjb25maWd1cmUuYWM6IEludm9rZSBBQ19DSEVDS19TT0NLTEVOX1RZUEUuCisJKEFDX0NPTkZJR19GSUxFUyk6IEFkZCBzcmMvZ2NyeXB0LmguCisJKEFDX0NPTkZJR19TUkNESVIpOiBDaGFuZ2UgdG8gc3JjL2xpYmdjcnlwdC52ZXJzLgorCisyMDA2LTEwLTAyICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBhY2luY2x1ZGUubTQgKEdOVVBHX1NZU19TWU1CT0xfVU5ERVJTQ09SRSk6IFRlc3Qgb24gSE9TVCBhbmQgbm90CisJVEFSR0VULiAgSGFyZHdpcmUgZm9yIG1pbmd3MzIuIEFsbG93IHNldHRpbmcgdmlhIGNvbW1hbmQgbGluZSB3aGVuCisJY3Jvc3MgY29tcGlsaW5nLgorCisyMDA2LTA4LTI5ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBjb25maWd1cmUuYWMgKFVTRV9TRUVEKTogTmV3LgorCisyMDA2LTA3LTI2ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBjb25maWd1cmUuYWM6IE5ldyBvcHRpb25zIC0tZW5hYmxlLW5vZXhlY3N0YWNrIGFuZAorCS0tZGlzYWJsZS1vcHRpbWl6YXRpb24uCisKKzIwMDYtMDctMDQgIE1hcmN1cyBCcmlua21hbm4gIDxtYXJjdXNAZzEwY29kZS5kZT4KKworCSogY29uZmlndXJlLmFjOiBDYWxsIEFDX0xJQlRPT19XSU4zMl9ETEwgYW5kIEFDX0xJQlRPT0xfUkMuCisKKwkqIGNvbmZpZ3VyZS5hYzogQ2FsbCBnbF9UWVBFX1NPQ0tMRU5fVCBpbnN0ZWFkIG9mIHRoZSBvdGhlcgorCXNvY2tsZW5fdCBjaGVja3MuCisKKzIwMDYtMDYtMDggIE1hcmN1cyBCcmlua21hbm4gIDxtYXJjdXNAZzEwY29kZS5kZT4KKworCSogY29uZmlndXJlLmFjIChQVEhfTElCUyk6IEFkZCAtLWFsbCB0byBwdGgtY29uZmlnIGludm9jYXRpb24uCisKKzIwMDYtMDMtMTQgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzogQ2hlY2sgZm9yIGZjdG5sIGFuZCBmdHJ1bmNhdGUuCisJKEhBVkVfUFRIKTogQ2hlY2sgZm9yIEdOVSBQdGguCisJKEhBVkVfVzMyX1NZU1RFTSk6IERlZmluZSBpdC4KKwkqIGFjaW5jbHVkZS5tNCAoR05VUEdfUFRIX1ZFUlNJT05fQ0hFQ0spOiBOZXcuIFRha2VuIGZyb20gR251UEcgMS40LgorCisyMDA1LTEyLTA4ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBjb25maWd1cmUuYWM6IENoYW5nZWQgdGhlIHJhbmRvbSBkZXZpY2UgbmFtZXMgZm9yIG5ldGJzZC4gIEZyb20KKwlDaHJpc3RpYW4gQmllcmUuCisKKzIwMDUtMTEtMDIgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBORVdTOiBEb2N1bWVudGVkIG1pbm9yIEFQSSBjaGFuZ2VzLgorCisyMDA1LTA5LTE1ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBEZXBlbmQgb24gUkVBRE1FLlNWTiwgbm90IG9uIFJFQURNRS5DVlMuCisKKzIwMDUtMDYtMjUgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBjb25maWd1cmUuYWM6IFJlbW92ZWQgc3JjL2xpYmdjcnlwdC5wYyBmcm9tIEFDX0NPTkZJR19GSUxFUy4KKworMjAwNS0wNi0xMCAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogY29uZmlndXJlLmFjOiBNb3ZlIGRldGVjdGlvbiBvZiBiYXNpYyBzdHVmZiB0byB0aGUgdG9wLiAgRm9yCisJZXhhbXBsZSB3ZSBuZWVkIHRvIGtub3cgd2hldGhlciBnY2MgaXMgdXNlZCBiZWZvcmUgdGVzdGluZyBmb3IgaXQuCisJUmVwb3J0ZWQgYnkgUmFsZiBGYXNzZWwuCisKKzIwMDUtMDQtMjMgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBhY2luY2x1ZGUubTQgKFRZUEVfU09DS0xFTl9UKTogTmV3IHR5cGUgZGVmaW5pdGlvbiB0ZXN0OworCXByb3ZpZGVkIGJ5IEFsYmVydCBDaGluLgorCSogY29uZmlndXJlLmFjOiBEb24ndCB1c2UgJChDTUQpIGFzIGl0J3Mgbm90IHBvcnRhYmxlOyB1c2UgQ01EIGluCisJYmFja3RpY2tzIGluc3RlYWQuICBTaW1wbGVyIC1sbnNsLy1sc29ja2V0IHRlc3QuICBVc2UKKwlUWVBFX1NPQ0tMRU5fVCB0ZXN0LiAgRG9uJ3QgZm9yZ2V0IHRvIHNldCBgcmFuZG9tX21vZHVsZXMnCisJY29ycmVjdGx5LgorCisyMDA1LTA0LTIyICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogY29uZmlndXJlLmFjOiBBZGRlZCBzdXBwb3J0IGZvciBwa2djb25maWc7IHByb3ZpZGVkIGJ5IEFsYmVydAorCUNoaW4uCisKKzIwMDUtMDQtMTEgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBjb25maWd1cmUuYWM6IEludGVncmF0ZSBXaGlybHBvb2wuCisKKzIwMDUtMDEtMDQgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwlVcGRhdGVkIHRvIGF1dG9tYWtlIDEuOS4KKworCSogYWNpbmNsdWRlLm00OiBVcGRhdGVkIGZvciB1c2Ugd2l0aCBhdXRvbWFrZSAxLjkuCisKKwkqIGNvbmZpZ3VyZS5hYzogUmVxdWlyZSBsaWJncGctZXJyb3IgMS4wOyBub3QgcmVhbGx5IG5lZWRlZCBidXQKKwl0aGF0IGlzIHRoZSBmaXJzdCBzdGFibGUgdmVyc2lvbi4KKworCSogTWFrZWZpbGUuYW0gKEFDTE9DQUxfQU1GTEFHUyk6IE5ldyBmb3IgLUkgbTQuCisJKEFVVE9NQUtFX09QVElPTlMpOiBOZXcgdG8gY3JlYXRlIGEgYnppcCBhcmNoaXZlLgorCisyMDA1LTAyLTAzICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogVEhBTktTOiBVcGRhdGVkLgorCisyMDA0LTA4LTA5ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogVEhBTktTOiBVcGRhdGVkLgorCisyMDA0LTA3LTA0ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogVEhBTktTOiBVcGRhdGVkLgorCisyMDA0LTA0LTIxICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogY29uZmlndXJlLmFjOiBEb24ndCBwcmludCBhIHdhcm5pbmcgaWYgR05VIG1ha2Ugd2FzIG5vdCBmb3VuZC4KKworMjAwNC0wNS0wNyAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5kZT4KKworCSogVEhBTktTOiBVcGRhdGVkLgorCisyMDA0LTA0LTAyICBUaG9tYXMgU2Nod2luZ2UgIDxzY2h3aW5nZUBuaWMtbmFjLXByb2plY3QuZGU+CisKKwkqIGF1dG9nZW4uc2g6IEFkZGVkIEFDTE9DQUxfRkxBR1MuCisKKzIwMDQtMDQtMTUgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJUmVsZWFzZWQgMS4yLjAuCisKKwkqIGNvbmZpZ3VyZS5hYzogU2V0IExUIHRvIEMxMi9BMS9SMS4KKworMjAwNC0wNC0wNiAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIGNvbmZpZy5ndWVzcywgY29uZmlnLnN1YiwgbHRtYWluLnNoOiBVcGRhdGVkIHRvIHRob3NlIGZyb20KKwlsaWJ0b29scyAxLjUuNC4KKworMjAwNC0wMy0yOSAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwlSZWxlYXNlZCAxLjEuOTQuCisKKwkqIGNvbmZpZ3VyZS5hYzogU2V0IExUIHRvIEMxMi9BMS9SMC4KKworMjAwNC0wMy0xMCAgTWFyY3VzIEJyaW5rbWFubiAgPG1hcmN1c0BnMTBjb2RlLmRlPgorCisJKiBjb25maWd1cmUuYWMgKExJQkdDUllQVF9DT05GSUdfTElCU19QVEhSRUFELAorCUxJQkdDUllQVF9DT05GSUdfQ0ZMQUdTX1BUSFJFQUQsIExJQkdDUllQVF9DT05GSUdfTElCU19QVEgsCisJTElCR0NSWVBUX0NPTkZJR19DRkxBR1NfUFRILCBoYXZlX3B0aCwgaGF2ZV9wdGhyZWFkLCBBQ19DSEVDS19QVEgsCisJQUNfQ0hFQ0tfTElCKHB0aHJlYWQpLCBIQVZFX1BUSCwgSEFWRV9QVEhSRUFEKTogUmVtb3ZlZC4KKworMjAwNC0wMy0wNiAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwlSZWxlYXNlZCAxLjEuOTMuCisKKwkqIGNvbmZpZ3VyZS5hYyAoTElCR0NSWVBUX0NPTkZJR19TT05BTUVfTlVNQkVSKTogUmVwbGFjZWQgYnkKKwlMSUJHQ1JZUFRfQ09OUElHX0FQSV9WRVJTSU9OLiAgU2V0IGl0IHRvIDEuICBTZXQgTFQgdG8gQzExL0EwL1IxLgorCisyMDA0LTAzLTA1ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogY29uZmlndXJlLmFjIChMSUJHQ1JZUFRfQ09ORklHX1NPTkFNRV9OVU1CRVIpOiBOZXcuCisKKzIwMDQtMDItMjAgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisgICAgICAgIFJlbGVhc2VkIDEuMS45Mi4KKworCSogY29uZmlndXJlLmFjOiBTZXQgTFQgdG8gQzExL0EwL1IwLgorCisyMDA0LTAyLTExICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogYXV0b2dlbi5zaCAoY2hlY2tfdmVyc2lvbik6IFJlbW92ZWQgYmFzaGlzbSBhbmQgc2ltcGxpZmllZC4KKworMjAwNC0wMi0wNiAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzogQWRkIHJmYzIyNjggY2lwaGVyIGFsZ29yaXRobS4KKworMjAwNC0wMS0yNSAgTW9yaXR6IFNjaHVsdGUgIDxtb0BnMTBjb2RlLmNvbT4KKworCSogVEhBTktTOiBVcGRhdGVkLgorCisyMDAzLTEyLTE5ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCVJlbGVhc2VkIDEuMS45MS4KKworCSogY29uZmlndXJlLmFjOiBCdW1iZWQgTFQgdmVyc2lvbiB0byBDMTAvQTMvUjEuCisKKzIwMDMtMTItMDggIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBNYWtlZmlsZS5hbSAoZGlzdC1ob29rKTogRG9uJ3QgZGlzdHJpYnV0ZSBzdHVmZiBmcm9tIHRoZSBub3cKKwlvYnNvbGV0ZSBzY3JpcHRzIGRpci4KKwkoRVhUUkFfRElTVCk6IFJlbW92ZSBSRUFETUVfYWxwaGEKKwkqIFJFQURNRS1hbHBoYTogUmVtb3ZlZC4KKwkqIGNvbmZpZ3VyZS5hYyAoQU1fQ09ORklHX0FVWF9ESVIpOiBSZW1vdmVkLgorCisJKiBDT1BZSU5HLkRPQzogUmVtb3ZlZC4KKwkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkZWQgUkVBRE1FLkNWUyBhbmQKKwlhdXRvZ2VuLnNoLiBSZW1vdmVkIENPUFlJTkcuRE9DLgorCisyMDAzLTExLTE0ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCVJlbGVhc2VkIDEuMS45MC4KKworCSogY29uZmlndXJlLmFjOiBCdW1iZWQgTFQgdmVyc2lvbiB0byBDMTAvQTMvUjAuCisKKwkqIGNvbmZpZ3VyZS5hYyAoaGF2ZV9sZF92ZXJzaW9uX3NjcmlwdCk6IFNldCB0aGUgZGVmYXVsdCBpbgorCWEgc2VwYXJhdGUgdGVzdC4KKwkoUFJJTlRBQkxFX09TX05BTUUpOiBEb24ndCBoYW5kbGUgdGhlIEh1cmQgZXh0cmEsIHRoaXMgbGVhZHMgdG8KKwljb25mbGljdHMgd2l0aCBCU0QgYmFzZWQgR05VIHN5c3RlbXMuICBUaGUgSHVyZCBoYXMgbm93IGEgd29ya2luZworCXVuYW1lLgorCisyMDAzLTExLTA0ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogY29uZmlndXJlLmFjIChVU0VfU0hBMSk6IE1ha2Ugc3VyZSBpdCBpcyBhbHdheXMgaW5jbHVkZWQuCisJKFVTRV9STUQxNjApOiBSZW1vdmVkIHRoaXMgQU0gY29uZGl0aW9uYWwuCisKKzIwMDMtMTAtMzEgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBjb25maWd1cmUuYWM6IEJ1bWJlZCB2ZXJzaW9uIG51bWJlciB0byAxLjEuOTAtY3ZzIGZvciBmdXRoZXIKKwlkZXZlbG9wbWVudAorCisJUmVsZWFzZWQgMS4xLjQ0LgorCisJKiBhY2luY2x1ZGUubTQgKEFDX0NIRUNLX1BUSCk6IEFkZGVkLgorCSogY29uZmlndXJlLmFjOiBVc2UgaXQgaGVyZSBpbnN0ZWFkIG9mIHRoZSBnZW5lcmljIGxpYiB0ZXN0LgorCUJ1bWJlZCBMVCB2ZXNpb24gdG8gQzkvQTIvUjAuCisKKzIwMDMtMTAtMjcgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBjb25maWd1cmUuYWM6IEdpdmUgYSBoaW50IG9uIHdoZXJlIGxpYmdwZy1lcnJvciBpcyBhdmFpbGFibGUuCisJUmVmb3JtYXR0ZWQgbG9uZyBsaW5lcy4gIERvbid0IGluY2x1ZGUgZ2NyeXB0LWRlZnMuaC4KKwkoLS1lbmFibGUtZ2NjLXdhcm5pbmdzKTogTmV3IG9wdGlvbi4KKworMjAwMy0xMC0yNCAgTW9yaXR6IFNjaHVsdGUgIDxtb0BnMTBjb2RlLmNvbT4KKworCSogY29uZmlndXJlLmFjOiBDaGVjayBmb3Igc29ja2xlbl90LgorCisyMDAzLTEwLTExICBNb3JpdHogU2NodWx0ZSAgPG1vQGcxMGNvZGUuY29tPgorCisJKiBhY2luY2x1ZGUubTQ6IFVwZGF0ZSBBTV9QQVRIX0dQR19FUlJPUiBtYWNyby4KKworMjAwMy0wOS0wNCAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwlSZWxlYXNlZCAxLjEuNDMuCisKKwkqIGNvbmZpZ3VyZS5hYzogUmVxdWlyZSBsaWJncGctZXJyb3IgMC40IGR1ZSB0byB0aGUgcHJpbWUgaW50ZXJmYWNlLgorCisyMDAzLTA4LTI5ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogYWNpbmNsdWRlLm00IChHTlVQR19TWVNfU1lNQk9MX1VOREVSU0NPUkUpOiBSZS1pbXBsZW1lbnRlZC4KKwkqIGNvbmZpZ3VyZS5hYzogVXNlIGl0IGhlcmUuCisKKzIwMDMtMDgtMjcgIE1vcml0eiBTY2h1bHRlICA8bW9AZzEwY29kZS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzogU3Vic3RpdHV0ZTogTElCR0NSWVBUX0NPTkZJR19MSUJTX1BUSFJFQUQsCisJTElCR0NSWVBUX0NPTkZJR19DRkxBR1NfUFRIUkVBRCwgTElCR0NSWVBUX0NPTkZJR19MSUJTX1BUSCwKKwlMSUJHQ1JZUFRfQ09ORklHX0NGTEFHU19QVEgsIExJQkdDUllQVF9USFJFQURfTU9EVUxFUy4KKworMjAwMy0wOC0wNyAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzogRmFpbCwgaWYgbGliZ3BnLWVycm9yIGNvdWxkIG5vdCBiZSBmb3VuZC4KKworMjAwMy0wNy0zMSAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwlSZWxlYXNlZCAxLjEuNDIuCisKKwkqIGNvbmZpZ3VyZS5hYzogU2V0IExUIHZlcnNpb24gdG8gNy8wLzAuCisKKzIwMDMtMDctMzAgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBBVVRIT1JTIChNYWludGFpbmVyKTogQXNzaWduZWQgTW9yaXR6IGFzIE1haW50YWluZXIuCisKKzIwMDMtMDctMzAgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBORVdTOiBJbmNsdWRlIG11Y2ggbW9yZSBjb21wbGV0ZSBsaXN0IG9mIGBJbnRlcmZhY2UgY2hhbmdlcworCXJlbGF0aXZlIHRvIHRoZSAxLjEuMTIgcmVsZWFzZScuCisKKzIwMDMtMDctMTQgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBjb25maWd1cmUuYWM6IEJ1bWJlZCB2ZXJzaW9uIG51bWJlciB1cCB0byAxLjEuNDItY3ZzLgorCisyMDAzLTA3LTA5ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogY29uZmlndXJlLmFjOiBSZWludHJvZHVjZSAtLWRpc2FibGUtYXNtLCBzaW5jZSBpdCBpcyBuZWVkZWQgYnkKKwltcGkvY29uZmlnLmxpbmtzLgorCisyMDAzLTA3LTA1ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogUkVBRE1FOiBGZXcgY2hhbmdlcywgbWVudGlvbiBsaWJncGctZXJyb3IuCisKKzIwMDMtMDYtMTggIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBjb25maWd1cmUuYWMgKGF2YWlsYWJsZV9jaXBoZXJzKTogUmVtb3ZlZCBTZXJwZW50LCBocnJtLgorCisyMDAzLTA2LTE3ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogYWNpbmNsdWRlLm00OiBSZW1vdmVkIG1hY3JvIGRlZmluaXRpb25zOiBHTlVQR19DSEVDS19GQVFQUk9HLAorCUdOVVBHX0NIRUNLX0VORElBTiwgR05VUEdfQ0hFQ0tfQ0FDSEUsIEdOVVBHX0NIRUNLX1BJQywKKwlHTlVQR19DSEVDS19FWFBPUlREWU5BTUlDLCBHTlVQR19DSEVDS19JUEMsIEdOVVBHX1BST0dfTk0sCisJR05VUEdfU1lTX1NZTUJPTF9VTkRFUlNDT1JFLCBHTlVQR19GVU5DX01LRElSX1RBS0VTX09ORV9BUkcsCisJR1BIX1BST0dfREIyQU5ZLgorCUFkZGVkIG1hY3JvIGRlZmluaXRpb25zOiBBTV9QQVRIX0dQR19FUlJPUi4KKworCSogY29uZmlndXJlLmFjOiBVc2UgYWx0ZXJuYXRpdmUgYXBwcm9hY2ggZm9yIGJ1aWxkaW5nIGJhc2VkIG9uCisJY29uZGl0aW9uYWwgc291cmNlcywgd2hpY2ggZG9lcyBub3QgbWFrZSBhdXRvbWFrZSBlYXQgYWxsIHlvdXIKKwltZW1vcnksIGV0Yy4KKwlSZW1vdmVkIHVudXNlZCB0ZXN0cy4KKwlSZW5hbWVkIC0tZW5hYmxlLXN0YXRpYy1ybmQgdG8gLS1lbmFibGUtcmFuZG9tLgorCVVzZSBBdXRvY29uZidzIEFDX0NfQklHRU5ESUFOIG1hY3JvIGluc3RlYWQgb2Ygb3VyIG93bi4KKwlSZS1vcmdhbml6ZWQgdGhlIHdob2xlIGZpbGUuCisKKzIwMDMtMDYtMTYgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBjb25maWd1cmUuYWMgKEFDX0NPTkZJR19GSUxFUyk6IFJlbW92ZWQgZG9jL3ZlcnNpb24uc2dtbC4KKworMjAwMy0wNi0xMSAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzogUmVtb3ZlIC0tZW5hYmxlLWxpYmdwZy1lcnJvciBmbGFnLgorCVVlIEFDX1BBVEhfR1BHX0VSUk9SLgorCisyMDAzLTA2LTA5ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogTkVXUzogTWVudGlvbiBBUEkgY2hhbmdlcyBhbmQgbGliZ3BnLWVycm9yLgorCisyMDAzLTA1LTI1ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogY29uZmlndXJlLmFjIChVU0VfTElCR1BHX0VSUk9SKTogSW1wbGVtZW50YXRpb24gb2YgdGhlCisJLS1lbmFibGUtbGliZ3BnLWVycm9yIHN3aXRjaC4KKwlEZWZpbmUgVVNFX0xJQkdQR19FUlJPUiBpbiBMSUJHQ1JZUFRfQ09ORklHX0ZMQUdTLCBpbiBjYXNlCisJbGliZ3BnLWVycm9yIGlzIHVzZWQuCisKKzIwMDMtMDUtMjIgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBjb25maWd1cmUuYWMgKEFDX0NIRUNLX0hFQURFUlMpOiBSZW1vdmVkIHVudXNlZCBoZWFkZXJzOgorCXRlcm1pby5oLCBsYW5naW5mby5oLgorCShBQ19DSEVDS19GVU5DUyk6IFJlbW92ZWQgdW51c2VkIGZ1bmN0aW9uczogc3Ryc2VwLCBzdHJsd3IsCisJdGNnZXRhdHRyLCBzZXRybGltaXQsIHN0cmZ0aW1lLCBubF9sYW5naW5mbywgc2lnYWN0aW9uLAorCXNpZ3Byb2NtYXNrLCBmb3BlbjY0LCBmc3RhdDY0LgorCisyMDAzLTA0LTI3ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogUkVBRE1FOiBEb2N1bWVudGVkIG5ldyBjb25maWd1cmUgc3dpdGNoZXMuCisJTWVudGlvbiB0aGUgLS1lbmFibGUtbWFpbnRhaW5lci1zd2l0Y2guCisKKwkqIGNvbmZpZ3VyZS5hYzogTWVyZ2VkIHNvbWUgY29kZSBmcm9tIEdudVBHJ3MgY29uZmlndXJlLmFjIGZvcgorCWRpc2FibGluZyBzaGE1MTIvdGlnZXIgaW4gY2FzZSBubyA2NCBkYXRhIHR5cGVzIGFyZSBhdmFpbGFibGUuCisKKzIwMDMtMDQtMTcgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBjb25maWd1cmUuYWM6IEluY2x1ZGUgc3VwcG9ydCBmb3Igc2hhNTEyLgorCisyMDAzLTA0LTE3ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogQVVUSE9SUzogVXBkYXRlZC4KKworMjAwMy0wNC0xNiAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzogSW1wbGVtZW50IGNvbW1hbmQgbGluZSBzd2l0Y2hlczogLS1lbmFibGUtY2lwaGVycywKKwktLWVuYWJsZS1wdWJrZXktY2lwaGVycyBhbmQgLS1lbmFibGUtZGlnZXN0cy4KKwlTZXQgQXV0b21ha2UgY29uZGl0aW9uYWxzIGFuZCBjb25maWcuaCBzeW1ib2xzIGRlcGVuZGluZyBvbiB0aGUKKwlzZWxlY3RlZCBjaXBoZXJzLCBwdWJrZXktY2lwaGVycywgZGlnZXN0cyBhbmQgcmFuZG9tLW1vZHVsZXMuCisKKwkqIGFjaW5jbHVkZS5tNCAoTElTVF9NRU1CRVIpOiBOZXcgbWFjcm8uCisKKwkqIGNvbmZpZ3VyZS5hYzogU2ltcGxpZmllZCwgcmVtb3ZlZCBjb2RlIGZvciBwYXJzaW5nCisJRVhUUkFfUFJPR1JBTVMgZnJvbSBNYWtlZmlsZS5hbS4KKworMjAwMy0wNC0wOCAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzogTWVyZ2VkIHJhbmRvbS1tb2R1bGUgc2VsZWN0aW9uIGNvZGUgZnJvbSBHbnVQRydzCisJY29uZmlndXJlLmFjLgorCisyMDAzLTA0LTA3ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogY29uZmlndXJlLmFjOiBSZW1vdmVkIGNvZGUgZm9yIGdlbmVyYXRpbmcgY29udHJ1Y3QuYy4KKwlSZW1vdmUgZGlnZXN0IG1vZHVsZXMgZnJvbSB0aGUgc3RhdGljX21vZHVsZXMgbGlzdCwgb25seSBoYW5kbGUKKwlyYW5kb20gbW9kdWxlIHNlbGVjdGlvbi4KKworCisyMDAzLTAzLTI0ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogTkVXUzogTWVudGlvbiBuZXcgQ0JDX01BQyBmbGFnLgorCisJKiBBVVRIT1JTIChNYWludGFpbmVyKTogVXBkYXRlIGVudHJ5IGZvciBTaW1vbiBKb3NlZnNzb24uCisKKzIwMDMtMDMtMDQgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBUT0RPOiBSZW1vdmUgaXRlbSBhYm91dCByZXNldHRpbmcgaGFuZGxlcywgc2luY2UKKwlnY3J5X2NpcGhlcl9yZXNldCBpcyBpbXBsZW1lbnRlZCBieSBub3cuCisKKwkqIE5FV1M6IE1lbnRpb25lZCBnY3J5X2NpcGhlcl9yZXNldC4KKworMjAwMy0wMS0yMSAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIFJFQURNRSAoQ29uZmlndXJlIG9wdGlvbnMpOiBOZXcuCisJKiBjb25maWd1cmUuYWMgKGhhdmVfbGRfdmVyc2lvbl9zY3JpcHQpOiBOZXcgb3B0aW9uCisJLS1lbmFibGUtbGQtdmVyc2lvbi1zY3JpcHQuCisKKzIwMDMtMDEtMjAgIFNpbW9uIEpvc2Vmc3NvbiAgPGphc0BleHR1bmRvLmNvbT4KKworCSogY29uZmlndXJlLmFjIChNT0RVTEVTX0lOX0NJUEhFUik6IEFkZCBjcmMuCisKKzIwMDMtMDEtMjAgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJUmVsZWFzZWQgMS4xLjEyLgorCisJKiBjb25maWd1cmUuYWMgKExJQkdDUllQVF9MVF9SRVZJU0lPTik6IEJ1bWJlZCB1cC4KKworMjAwMi0xMi0yMSAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwlSZWxlYXNlZCAxLjEuMTEuCisKKwkqIGNvbmZpZ3VyZS5hYyAoTElCR0NSWVBUX0xUX0NVUlJFTlQ6IEJ1bWJlZCB0byA2LzUvMCBkdWUgdG8gYSBuZXcKKwlpbnRlcmZhY2UKKworMjAwMi0xMi0xOSAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYyAoaGF2ZV9wdGhyZWFkKTogQ2hlY2sgZm9yIHB0aHJlYWRzIGluIGxpYmMuCisJKGhhdmVfbGRfdmVyc2lvbl9zY3JpcHQpOiBOZXcuCisKKzIwMDItMTEtMTAgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBjb25maWd1cmUuYWMgKE1PRFVMRVNfSU5fQ0lQSEVSKTogQWRkIG1kNC5jLiAgQnkgU2ltb24gSm9zZWZzc29uLgorCisyMDAyLTA5LTIwICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCVJlbGVhc2VkIDEuMS4xMC4KKworCSogY29uZmlndXJlLmFjIChIQVZFX0RFVl9SQU5ET01fSU9DVEwpOiBEb24ndCBjaGVjayBmb3IgaXQ7IGl0IGlzCisJbm90IHVzZWQuCisJKEFTX0NIRUNLX0hFQURFUlMpOiBDaGVjayBmb3Igc3lzL3NlbGVjdC5oLgorCSogTWFrZWZpbGUuYW0gKERJU1RfU1VCRElSUyk6IE5ldyB0byBpbmNsdWRlIHRoZSB3MzItZGxsIGRpcmVjdG9yeQorCisyMDAyLTA5LTE4ICBUaW1vIFNjaHVseiAgPHRzQHdpbnB0Lm9yZz4KKworCSogY29uZmlndXJlLmFjOiBBZGRlZCBtYWtlZmlsZSBmb3IgdGhlIFczMiBETEwuCisKKzIwMDItMDktMTcgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBjb25maWd1cmUuYWM6IENoZWNrIGZvciBQdGggYW5kIFB0aHJlYWRzLgorCisyMDAyLTA4LTIzICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCVJlbGVhc2VkIDEuMS45LgorCisJKiBjb25maWd1cmUuYWMgKExJQkdDUllQVF9DT05GSUdfQ0ZMQUdTKTogUmVuYW1lZCBmcm9tCisJTElCR0NSWVBUX0NGTEFHUyBhbmQgcmVtb3ZlZCB0aGUgbGlicGF0aCBiZWNhdXNlIGl0IGlzIHNldCBieSB0aGUKKwljb25maWcgc2NyaXB0LgorCShMSUJHQ1JZUFRfTFRfUkVWSVNJT04pOiBTZXQgTFQgdmVyc2lvbiB0byA1LzQvMS4KKworMjAwMi0wNi0yNSAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwlSZWxlYXNlZCAxLjEuOC4KKworCSogY29uZmlndXJlLmFjOiBTZXQgTFQgdmVyc2lvbiB0byA1LzQvMC4KKworMjAwMi0wNS0yMSAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwlSZWxlYXNlZCAxLjEuNy4KKworCSogY29uZmlndXJlLmFjOiBTZXQgTFQgdmVyc2lvbiB0byA0LzMvMC4KKworMjAwMi0wNS0xNyAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzogUmVtb3ZlZCBhbGwgdGhlIGR5bmFtaWMgbG9hZGluZyBzdHVmZi4KKworMjAwMi0wNS0xNiAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzogUmVvcmRlcmVkIHRoZSBDX0NIRUNLX0ZVTkNTLgorCisyMDAyLTA1LTE1ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogY29uZmlndXJlLmFjOiBBZGp1c3RlZCBmb3IgbmV3IE1QSSBtb2R1bGUgc3R1ZmYuCisKKzIwMDItMDUtMTQgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJQ2hhbmdlZCBsaWNlbnNlIHRvIHRoZSBMR1BMLgorCisyMDAyLTA1LTAyICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogam5saWIvOiBSZW1vdmVkLgorCSogTWFrZWZpbGUuYW0gKFNVQkRJUlMpOiBSZW1vdmVkIGpubGliLgorCSogY29uZmlndXJlLmFjIChqbmxpYi9NYWtlZmlsZSk6IFJlbW92ZWQuCisKKwkqIGNvbmZpZ3VyZS5hYzogRGVmaW5lIF9SRUVOVFJBTlQuCisKKzIwMDItMDItMTggIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBjb25maWd1cmUuYWMgKE1QSV9FWFRSQV9BU01fT0JKUyk6IFVzZSAubG8gc3VmZml4LgorCShBQ19DQU5PTklDQUxfVEFSR0VUKTogQWRkZWQuCisKKzIwMDItMDItMDcgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJUmVsZWFzZWQgMS4xLjYuCisKKzIwMDItMDEtMjQgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBqbmxpYi86IFJlcGxhY2VkIGJ5IGEgZnJlc2ggY29weSBmcm9tIEdudVBHIChhY3R1YWxseSB0aGUgTmV3UEcKKwlkZXZlbG9wbWVudCBicmFuY2gpLiAgQWRqdXN0ZWQgTWFrZWZpbGUuYW0gYW5kIGpubGliLWNvbmZpZy5oCisJYWNjb3JkaW5nbHkuCisKKzIwMDEtMTItMTggIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJUmVsZWFzZWQgMS4xLjUuCisKKwkqIE1ha2VmaWxlLmFtIChkaXN0LWhvb2spOiBPbmx5IGxvb2sgaW4gbXBpIGFuZCBzY3JpcHRzIGZvcgorCWRpc3RmaWxlczsgdGhpcyB3YXkgd2UgZG9uJ3QgaW5jbHVkZSB0aG9zZSBvZiBhIHN0YWxlICJtYWtlIGRpc3QiCisJZGlyZWN0b3J5LgorCisJKiBhY2luY2x1ZGUubTQgKEdOVVBHX0ZJWF9IRFJfVkVSU0lPTik6IE1ha2UgaXQgd29yayB3aXRoIHRoZSBuZXcKKwlhdXRvbWFrZS4KKwkqIGNvbmZpZ3VyZS5hYzogRG9uJ3QgY2htb2QgZGIyYW55LgorCisyMDAxLTA4LTA2ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogY29uZmlndXJlLmFjOiBSZW1vdmVkIGNyb3NzIGNvbXBpbGluZyBoYWNrcy4KKworMjAwMS0wOC0wMyAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwlSZWxlYXNlZCAxLjEuNC4KKworCSogYWNpbmNsdWRlLm00IChHTlVQR19DSEVDS19UWVBFREVGKTogRGVmaW5lIEdOVSBTb3VyY2UuCisKKyAgICAgICAgTWlncmF0ZWQgdG8gYXV0b2NvbmYgMi41Mi4KKwkqIGFjaW5jbHVkZS5tNDogUmVtb3ZlZCBHTlVQR19MSU5LX0ZJTEVTIGFuZCBjb252ZXJ0ZWQuCisJKiBhY2NvbmZpZy5oOiBSZW1vdmVkCisJKiBjb25maWd1cmUuaW46IFJlcGxhY2VkIGJ5Li4uCisJKiBjb25maWd1cmUuYWM6IGFuZCBtb2RpZmllZCBmb3IgdXNlIHdpdGggYXV0b2NvbmYgMi41Mi4gIFJlcGxhY2VkCisJR05VUEdfTElOS19GSUxFUyB3aXRoIEFDX0NPTkZJR19MSU5LUyBhbmQgbW92ZWQgc29tZSBpbmZvcm1hdGlvbmFsCisJbWVzc2FnZXMgdG8gdGhlIGVuZC4gUmVtb3ZlZCAtLWVuYWJsZS1tLWRlYnVnCisKKwkqIHRlc3RzLzogTmV3LgorCSogTWFrZWZpbGUuYW06IEluY2x1ZGVkIHRlc3RzIGRpcmVjdG9yeQorCisJKiBjb25maWd1cmUuaW4gKERZTkxJTktfTU9EX0NGTEFHUyk6IFVzZSAtc2hhcmVkIHdpdGggZGVjLW9zZi4KKwlSZXBvcnRlZCBieSBDaHJpcyBBZGFtcy4gIE1lcmdlZCBzb21lIGNhc2VzLgorCisyMDAxLTA1LTMxICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCVJlbGVhc2VkIDEuMS4zLgorCisJKiBjb25maWd1cmUuaW46IFVzZSBfZ2NyeV8gcHJlZml4IHdoZW4gY3JlYXRpbmcgdGhlIGNpcGhlciBjb25zdHJ1Y3Rvci4KKworCSogYWNjb25maWcuaCAoX0dDUllQVF9JTl9MSUJHQ1JZUFQpOiBEZWZpbmUgaXQgaGVyZS4KKworMjAwMS0wNS0yOCAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIGFjaW5jbHVkZS5tNCAoR1BIX1BST0dfRE9DQk9PSyk6IFJlbW92ZWQuCisJKEdQSF9QUk9HX0RCMkFOWSk6IE5ldy4gVGFrZW4gZnJvbSBHUEguCisJKiBjb25maWd1cmUuaW46IFVzZSBpdCBoZXJlLgorCisyMDAwLTEyLTE5ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCU1ham9yIGNoYW5nZToKKwlSZW1vdmVkIGFsbCBHbnVQRyBzdHVmZiBhbmQgcmVuYW1lZCB0aGlzIHBpZWNlIG9mIHNvZnR3YXJlCisJdG8gZ2NyeXB0LiAgVGhlIGRpcmVjdG9yeSBnY3J5cHQgaGFzIGJlZW4gcmVuYW1lZCB0byBzcmMuCisKKzIwMDAtMTEtMTQgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJVmVyc2lvbiAxLjEuMiByZWxlYXNlZC4KKworMjAwMC0xMS0xMyAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIGFjaW5jbHVkZS5tNCAoR05VUEdfRklYX0hEUl9WRVJTSU9OKTogVlBBVEggYnVpbGQgZml4LgorCisyMDAwLTEwLTEwICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogTWFrZWZpbGUuYW0gKGRpc3QtaG9vayk6IENyZWF0ZSB0aGUgdmVyc2lvbiBmaWxlLgorCSogY29uZmlndXJlLmluOiBTZXQgdGhlIGxpYnRvb2wgdmVyc2lvbiBoZXJlLCByZW1vdmVkIHRoZSBuZWVkCisJZm9yIHRoZSB2ZXJzaW9uIGZpbGUuCisKK01vbiBTZXAgMTggMTY6MzU6NDUgQ0VTVCAyMDAwICBXZXJuZXIgS29jaCAgPHdrQG9wZW5pdC5kZT4KKworICAgICAgICAqIGFjaW5jbHVkZS5tNCAoR05VUEdfQ0hFQ0tfTUxPQ0spOiAgUmVtb3ZlZCB0aGF0IHNpbGx5IG1rZGlyKCkuCisKKyAgICAgICAgKiBjb25maWd1cmUuaW46ICBDaGFuZ2VzIHRvIGFsbG93IGZvciBTb2xhcmlzIHJhbmRvbSBkZXZpY2UuCisgICAgICAgIEJ5IE5pbHMgRWxsbWVucmVpY2guCisgICAgICAgICgtLXdpdGgtZWdkLXNvY2tldCk6IE5ldy4KKworICAgICAgICAqIGNvbmZpZ3VyZS5pbiAoR05VUEdfSE9NRURJUik6IE5ldy4KKworICAgICAgICAqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgZm9yIGZzdGF0NjQgYW5kIGZvcGVuNjQKKworICAgICAgICAqIGFjaW5jbHVkZS5tNCAoR05VUEdfQ0hFQ0tfRkFRUFJPRyk6IE5ldy4KKyAgICAgICAgKiBjb25maWd1cmUuaW46IFRlc3QgZm9yIHRoaXMuCisKKyAgICAgICAgKiBjb25maWd1cmUuaW4gKERZTkxJTktfTU9EX0NGTEFHUyk6IEZpeCBieSBEYXZpZCBDaGFtcGlvbi4KKworVHVlIEF1ZyAyMiAxNDozMToxNSBDRVNUIDIwMDAgIFdlcm5lciBLb2NoICA8d2tAb3Blbml0LmRlPgorCisgICAgICAgIFZlcnNpb24gMS4xLjEKKworRnJpIEF1ZyAxOCAxNDoyNzoxNCBDRVNUIDIwMDAgIFdlcm5lciBLb2NoICA8d2tAb3Blbml0LmRlPgorCisgICogYWdlbnQvOiBOZXcuCisgICogTWFrZWZpbGUuYW0sIGNvbmZpZ3VyZS5pbjogU3VwcG9ydCBmb3IgdGhlIG5ldyBkaXJlY3RvcnkuCisKK01vbiBKdWwgMTcgMTY6MzU6NDcgQ0VTVCAyMDAwICBXZXJuZXIgS29jaCAgPHdrQD4KKworICAqIGNvbmZpZ3VyZS5pbiAobWluZ3czMik6IENoYW5nZXMgdG8gYWxsb3cgZm9yIG1pbmd3MzJtc3ZjCisKK0ZyaSBKdWwgMTQgMTk6Mzg6MjMgQ0VTVCAyMDAwICBXZXJuZXIgS29jaCAgPHdrQD4KKworICBUaGUgYmlnIG1lcmdlIGJldHdlZW4gdGhpcyBvbmUgYW5kIHRoZSBzdGFibGUgYnJhbmNoIDEuMC4gIFN0aWxsIG5lZWQKKyAgdG8gbWVyZ2UgVE5BTktTLCBBVVRIT1JTIGFuZCBzdWNoLiAgSXQgcHJvYmFseSBkb2VzIG5vdCBjb21waWxlIHlldC4KKworICAqIGFjaW5jbHVkZS5tNCAoR05VUEdfQ0hFQ0tfTUxPQ0spOiBGaXhlZCBzeW50YXggZXJyb3IgaW4gQyBjb2RlLgorCisgICogY29uZmlndXJlLmluOiBBZGQgY2hlY2sgZm9yIHRlcm1pby5oLCB3YWl0IHVuY3Rpb3NuIGFuZCBzaWdhY3Rpb24uCisKKyAgKiBhY2luY2x1ZGUubTQsIGNvbmZpZ3VyZS5pbiAoR05VUEdfQ0hFQ0tfR05VTUFLRSk6IE5ldy4KKworICAqIGFjaW5jbHVkZS5tNCAoTUtESVJfVEFLRVNfT05FX0FSRyk6IENoZWNrIHNvbWUgaGVhZGVycy4gQnkgR2HrbCBRdelyaS4KKworICAqIGNvbmZpZ3VyZS5pbiAoQU1fSU5JVF9BVVRPTUFLRSk6IFVzZSB0aGlzIG5vdy4gQnkgR2HrbC4KKworICAqIGFjaW5jbHVkZS5tNCAoR05VUEdfQ0hFQ0tfRVhQT1JURFlOQU1JQyk6IFJlcGxhY2VtZW50IGZvcgorICBHTlVQR19DSEVDS19SRFlOQU1JQyB3aGljaCBzaG91bGQgaGFuZGxlIGdjYyB3aXRoIG5vbiBHTlUgbGQgbmljZXIuCisgIENvbnRyaWJ1dGVkIGJ5IERhdmUgRHlrc3RyYS4KKyAgKiBjb25maWd1cmUuaW4gKEdOWVBHX0NIRUNLX1JEWU5BTUlDKTogUmVwbGFjZWQgYnkgdGhlIG5ldyBjaGVjay4KKworICAqIGNvbmZpZ3VyZS5pbjogQWRkIGEgdGVzdCBmb3IgdW5pc2duZWQgbG9uZyBsb25nLgorCisgICogY29uZmlndXJlLmluIChEWU5MSU5LX01PRF9DRkxBR1MpOiBTZXQgZGlmZmVyZW50IGZvciBOZXRCU0QuCisKKyAgKiBjb25maWd1cmUuaW46IEFkZCBjaGVjayBmb3IgY2xvY2tfZ2V0dGltZQorCisgICogY29uZmlndXJlLmluIChBTExfTElOR1VBUyk6IEFkZCBubC4KKyAgKiBjb25maWd1cmUuaW4gKEFMTF9MSU5HVUFTKTogQWRkIEVzcGVyYW50by4KKyAgKiBjb25maWd1cmUuaW4gKEFMTF9MSU5HVUFTKTogQWRkIHN2IGFuZCBqYS4KKworICAqIGNvbmZpZ3VyZS5pbjogVXNlIC91c3IvbG9jYWwgZm9yIENGTEFHUyBhbmQgTERGTEFHUyB3aGVuCisgIHRhcmdldCBpcyBmcmVlYnNkLiAgQnkgUultaS4KKworICAqIGNvbmZpZ3VyZS5pbjogRG8gbm90IHNldCBkZXZlbG9wbWVudCB2ZXJzaW9uIHdoZW4gdGhlIHZlcnNpb24gaGFzCisgIGEgZGFzaCBpbiBpdC4gIFN1Z2dlc3RlZCBieSBEYXZlIER5a3N0cmEuCisKKyAgKiBjb25maWd1cmUuaW46IFJlbW92ZWQgc3Vic3RpdHV0aW9uIGZvciBkb2MvZ3BoL01ha2VmaWxlLgorICBEbyBhbGwgdGhlIGdjYyB3YXJuaW5nIG9ubHkgaW4gbWFpbnRhaW5lciBtb2RlLgorCisgICogY29uZmlndXJlLmluIChkbG9wZW4pOiBVc2UgQ0hFQ0tfRlVOQyBmb3IgYSB0ZXN0IG9mIGRsb3BlbiBpbiBsaWJjLgorICBTdWdnZXN0ZWQgYnkgQWxleGFuZHJlIE9saXZhLgorICAoLVdhbGwpOiBNb3ZlZCB0aGUgc2V0dHRpbmcgb2YgZ2NjIHdhcm5pbmcgb3B0aW9ucyBuZWFyIHRvIHRoZSBlbmQKKyAgc28gdGhhdCB0ZXN0cyBkb24ndCBnZXQgY29uZnVzZWQuICBTdWdnZXN0ZWQgYnkgUGF1bCBELiBTbWl0aC4KKworICAqIGFjaW5jbHVkZS5tNCAoR05VUEdfU1lTX05NX1BBUlNFKTogQWRkZWQgQlNESSBzdXBwb3J0LgorICAoR05VUEdfQ0hFQ0tfUkRZTkFNSUMpOiBEaXR0by4KKworICAqIGFjaW5jbHVkZS5tNCAoR05VUEdfQ0hFQ0tfTUxPQ0spOiBDaGFuZ2VkIHRoZSB3YXkgdG8gdGVzdCBmb3IKKyAgbGlicnQuICBUZXN0IHN1Z2dlc3RlZCBieSBKZWZmIExvbmcuCisKKyAgKiBhY2luY2x1ZGUubTQgKEdOVVBHX0NIRUNLX01MT0NLKTogRG8gbGlicnQgY2hlY2sgb25seSB3aGVuCisgIHdlIGNhbid0IGxpbmsgYSB0ZXN0IHByb2dyYW0uICBUaGlzIHdheSBHTlUgc3lzdGVtcyBkb24ndCBuZWVkCisgIHRvIGxpbmsgYWdhaW5zdCBsaW5ydC4KKyAgKEdOVVBHX0NIRUNLX0lQQyk6IEZpeGVkIHVzZSBvZiBUUllfQ09NUElMRSBtYWNyby4gIEZyb20gVGltIE1vb25leS4KKworICAqIGFjaW5jbHVkZS5tNCAoR05VUEdfU1lTX1NZTUJPTF9VTkRFUlNDT1JFKTogQWRkIHN1cHBvcnQgZm9yCisgIERKR1BQLgorICAoR05VUEdfQ0hFQ0tfTUxPQ0spOiBDaGVjayB3aGV0aGVyIG1sb2NrIHNpdHMgaW4gbGlicnQuCisKKyAgKiBhY2luY2x1ZGUubTQgKEdOVVBHX0NIRUNLX1JEWU5BTUlDKTogQWRkIE5ldEJTRC4gQnkgVGhvbWFzIEtsYXVzbmVyLgorCisgICogYWNjb25maWcuaCAoSEFWRV9NTE9DSyk6IEFkZGVkCisKK01vbiBNYXIgMTMgMTk6MjI6NDYgQ0VUIDIwMDAgIFdlcm5lciBLb2NoICA8d2tAb3Blbml0LmRlPgorCisJKiBjb25maWd1cmUuaW46IE5vdyB1c2VzIHRoZSBEb2Nib29rIE00cyBmcm9tIEdQSC4KKworTW9uIEphbiAzMSAxNzo0NjozNSBDRVQgMjAwMCAgV2VybmVyIEtvY2ggIDx3a0A+CisKKwkqIE1ha2VmaWxlLmFtOiBSZS1hZGRlZCB0b29scy4gQnkgUultaS4KKworTW9uIEphbiAzMSAxNjozNzozNCBDRVQgMjAwMCAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5kZT4KKworCSogY29uZmlndXJlLmluOiBDcmVhdGUgYSBzeW1saW5rIGZvciB0eXBlcy5oIGluIGdjcnlwdC8uCisKK1RodSBKYW4gMjcgMTg6MDA6NDQgQ0VUIDIwMDAgIFdlcm5lciBLb2NoICA8d2tAZ251cGcuZGU+CisKKwkqIGNvbmZpZ3VyZS5pbiAoZzEwZGVmcy5oKTogUmVwbGFjZWQgYnkgZ251cGctZGVmcy5oCisKK01vbiBKYW4gMjQgMTM6MDQ6MjggQ0VUIDIwMDAgIFdlcm5lciBLb2NoICA8d2tAZ251cGcuZGU+CisKKwkqIGpubGliLyA6IE5ldy4KKworCSogY29uZmlndXJlLmluOiBEbyBzZXQgZGV2ZWxvcG1lbnQgdmVyc2lvbiB3aGVuIHRoZSB2ZXJzaW9uIGhhcworCWEgZGFzaCBpbiBpdC4gIFN1Z2dlc3RlZCBieSBEYXZlIER5a3N0cmEuCisKK1RodSBEZWMgIDkgMTc6MjI6MjcgQ0VUIDE5OTkgIFdlcm5lciBLb2NoICA8d2tAZ251cGcuZGU+CisKKwkqIGFjaW5jbHVkZS5tNCAoR05VUEdfRklYX0hEUl9WRVJTSU9OKTogTmV3LgorCSogY29uZmlndXJlLmluOiBDaGVjayBhbmQgZml4IHRoZSB2ZXJzaW9uIG51bWJlciBvZiBnY3J5cHQvZ2NyeXB0LmgKKwlzbyB0aGF0IGl0IGlzIGFsd2F5cyB0aGUgc2F2ZSBhcyBWRVJTSU9OLgorCitUaHUgT2N0IDI4IDE2OjE3OjQ2IENFU1QgMTk5OSAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5kZT4KKworCSogU3RhcnRlZCB3aXRoIGRldmVsb3BtZW50IHNlcmllcyAxLjEgb24gMTk5OS0xMC0yNgorCitUdWUgT2N0IDI2IDE0OjEwOjIxIENFU1QgMTk5OSAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5kZT4KKworCSogUkVBRE1FLWFscGhhOiBOZXcKKworCSogY29uZmlndXJlLmluOiBGaXhlZCBxdW90aW5nIGluIHRlc3QgZm9yIGRldmVsb3BtZW50IHZlcnNpb24uCisKKwkqIFRIQU5LUzogQWRkIGVudHJpZXMgZm9yIE1pY2hhZWwsIEJyZW5ubyBhbmQgSiBIb3JhY2lvIHdobyBkaWQKKwl2ZXJ5IG5pY2UgSG93dG8gZG9jdW1lbnRzIC0gSSBhcG9saWdpemUgZm9yIGZvcmdldHRpbmcgdG8gbWVudGlvbiB0aGVtCisJZWFybGllci4KKworRnJpIFNlcCAxNyAxMjo1Njo0MiBDRVNUIDE5OTkgIFdlcm5lciBLb2NoICA8d2tAaXNpbC5kLnNodXR0bGUuZGU+CisKKworCSogY29uZmlndXJlLmluOiBBZGQgIi1sY2FwIiB3aGVuIGNhcGFiaWxpdGllcyBhcmUgcmVxdWVzdGVkLgorCUFkZCB0aGUgY29uZGl0aW9uYWwgQ1JPU1NfQ09NUElMSU5HLgorCSogTWFrZWZpbGUuYW06IERvbid0IHVzZSBjaGVja3Mgd2hlbiBDUk9TU19DT01QSUxJTkcuCisKKworV2VkIFNlcCAxNSAxNjoyMjoxNyBDRVNUIDE5OTkgIFdlcm5lciBLb2NoICA8d2tAaXNpbC5kLnNodXR0bGUuZGU+CisKKworCSogY29uZmlndXJlLmluIChBTExfTElOR1VBUyk6IEFkZCBwdF9QVC4KKworCSogY29uZmlndXJlLmluOiBTb21lIHR3ZWFrcyBmb3IgY3Jvc3MgY29tcGlsaW5nIHVuZGVyIE1pbmdXMzIKKwkqIGFjY29uZmlnLmggKFVTRV9TVEFUSUNfUk5EVzMyKTogTmV3LgorCitUdWUgU2VwICA3IDE3OjA4OjEwIENFU1QgMTk5OSAgV2VybmVyIEtvY2ggIDx3a0Bpc2lsLmQuc2h1dHRsZS5kZT4KKworCisJKiBWRVJTSU9OOiBTZXQgdG8gMS4wLjAuCisKK01vbiBTZXAgIDYgMTk6NTk6MDggQ0VTVCAxOTk5ICBXZXJuZXIgS29jaCAgPHdrQGlzaWwuZC5zaHV0dGxlLmRlPgorCisKKwkqIGNvbmZpZ3VyZS5pbjogQ3JlYXRlIG1ha2VmaWxlIGluIGRvYy9ncGgKKworCSogYWNpbmNsdWRlLm00IChHTlVQR19GVU5DX01LRElSX1RBS0VTX09ORV9BUkcpOiBOZXcKKwkqIGNvbmZpZ3VyZS5pbjogdXNlIHRoZSBhYm92ZS4KKworVGh1IFNlcCAgMiAxNjo0MDo1NSBDRVNUIDE5OTkgIFdlcm5lciBLb2NoICA8d2tAaXNpbC5kLnNodXR0bGUuZGU+CisKKworCSogVkVSU0lPTjogU2V0IHRvIDAuOS4xMS4KKworVHVlIEF1ZyAzMSAxNzoyMDo0NCBDRVNUIDE5OTkgIFdlcm5lciBLb2NoICA8d2tAaXNpbC5kLnNodXR0bGUuZGU+CisKKwkqIGNvbmZpZ3VyZS5pbjogTWlub3IgY2hhbmdlcyB0byB0aGUgT1MvMiBhbmQgTWluZ3czMiBzeXN0ZW0gbGFiZWxzLgorCUFkZCBhIHByaW50YWJsZSBuYW1lIGZvciBIdXJkLgorCitNb24gQXVnIDMwIDIwOjM4OjMzIENFU1QgMTk5OSAgV2VybmVyIEtvY2ggIDx3a0Bpc2lsLmQuc2h1dHRsZS5kZT4KKworCSogY29uZmlndXJlLmluOiBTb21lIHN1cHBvcnQgZm9yIERKR1BQIChNYXJrIEVsYnJlY2h0KQorCitXZWQgQXVnICA0IDEwOjM0OjQ2IENFU1QgMTk5OSAgV2VybmVyIEtvY2ggIDx3a0Bpc2lsLmQuc2h1dHRsZS5kZT4KKworCSogVkVSU0lPTjogU2V0IHRvIDAuOS4xMC4KKworTW9uIEp1bCAyNiAwOTozNDo0NiBDRVNUIDE5OTkgIFdlcm5lciBLb2NoICA8d2tAaXNpbC5kLnNodXR0bGUuZGU+CisKKwkqIGFjaW5jbHVkZS5tNCAoR05VUEdfU1lTX1NZTUJPTF9VTkRFUlNDT1JFKTogcmVtb3ZlIGluaXQgb2YgYWNfY3ZfLi4uCisKKwkqIE1ha2VmaWxlLmFtIChESVNDTEVBTkZJTEVTKTogTmV3CisKK0ZyaSBKdWwgMjMgMTM6NTM6MDMgQ0VTVCAxOTk5ICBXZXJuZXIgS29jaCAgPHdrQGlzaWwuZC5zaHV0dGxlLmRlPgorCisJKiBWRVJTSU9OOiBTZXQgdG8gMC45LjkuCisKKwkqIGNvbmZpZ3VyZS5pbjogUHJpbnQgYSBub3RpY2Ugd2hlbiBybmR1bml4IGlzIHVzZWQuCisKK1RodSBKdWwgMTUgMTA6MTU6MzUgQ0VTVCAxOTk5ICBXZXJuZXIgS29jaCAgPHdrQGlzaWwuZC5zaHV0dGxlLmRlPgorCisJKiBhY2luY2x1ZGUubTQgKEdOVVBHX1NZU19TWU1CT0xfVU5ERVJTQ09SRSk6IEZpeGVkIGxhc3QgbW9kaWZpY2F0aW9uLgorCitXZWQgSnVsICA3IDEzOjA4OjQwIENFU1QgMTk5OSAgV2VybmVyIEtvY2ggIDx3a0Bpc2lsLmQuc2h1dHRsZS5kZT4KKworCSogTWFrZWZpbGUuYW06IFN1cHBvcnQgZm9yIGxpYnRvb2wuCisJKiBjb25maWd1cmUuaW46IERpdHRvLgorCitUdWUgSnVuIDI5IDIxOjQ0OjI1IENFU1QgMTk5OSAgV2VybmVyIEtvY2ggIDx3a0Bpc2lsLmQuc2h1dHRsZS5kZT4KKworCSogY29uZmlndXJlLmluICh1c2VfbG9jYWxfemxpYik6IFRoZSBsb3N0IGRvbGxhciBpcyBiYWNrLgorCisJKiBhY2luY2x1ZGUubTQgKEdOVVBHX1NZU19TWU1CT0xfVU5ERVJTQ09SRSk6IEFkZCBFTVggY2FzZS4KKwkqIGNvbmZpZ3VyZS5pbjogQW5vdGhlciB2YXJpYW50IG9mIHRoZSBNWCB2ZW5kb3Igc3RyaW5nCisKKwkqIGNvbmZpZ3VyZS5pbiAoLS13aXRoLWNhcGFiaWxpdGllcyk6IFNvbWUgdGVzdCBjb2RlIChSZW1pKS4KKworU2F0IEp1biAyNiAxMjoxNTo1OSBDRVNUIDE5OTkgIFdlcm5lciBLb2NoICA8d2tAaXNpbC5kLnNodXR0bGUuZGU+CisKKwkqIGFjaW5jbHVkZS5tNCAoR05VUEdfQ0hFQ0tfUkRZTkFNSUMpOiBTdXBwb3J0IGZvciBIUFVYIGFuZCBJUklYLgorCSogY29uZmlndXJlLmluIChIQVZFX0RMX1NITF9MT0FEKTogTmV3IGZvciBIUFVYIChEYXZlIER5a3N0cmEpLgorCisJKiBWRVJTSU9OOiBOb3cgMC45LjgKKworV2VkIEp1biAxNiAyMDoxNjoyMSBDRVNUIDE5OTkgIFdlcm5lciBLb2NoICA8d2tAaXNpbC5kLnNodXR0bGUuZGU+CisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIHRlc3QgZm9yIGRvY2Jvb2stdG8tbWFuCisKK1R1ZSBKdW4gMTUgMTI6MjE6MDggQ0VTVCAxOTk5ICBXZXJuZXIgS29jaCAgPHdrQGlzaWwuZC5zaHV0dGxlLmRlPgorCisJKiBhY2luY2x1ZGUubTQgKEdOVVBHX1NZU19OTV9QQVJTRSk6IFN1cHBvcnQgZm9yIHtuZXQsZnJlZX1ic2QsCisKK1RodSBKdW4gMTAgMTQ6MTg6MjMgQ0VTVCAxOTk5ICBXZXJuZXIgS29jaCAgPHdrQGlzaWwuZC5zaHV0dGxlLmRlPgorCisJKiBjb25maWd1cmUuaW4gKFpMSUIsR0RCTSk6IENoZWNrIGJvdGgsIGhlYWRlciBhbmQgbGliLgorCitTYXQgSnVuICA1IDE1OjMwOjMzIENFU1QgMTk5OSAgV2VybmVyIEtvY2ggIDx3a0Bpc2lsLmQuc2h1dHRsZS5kZT4KKworCSogcGtjbGlzdC5jIChrZXlfcHJlc2VudF9pbl9wa19saXN0KTogTmV3IChNaWNoYWVsKS4KKworVHVlIE1heSAyNSAxOTo1MDozMiBDRVNUIDE5OTkgIFdlcm5lciBLb2NoICA8d2tAaXNpbC5kLnNodXR0bGUuZGU+CisKKwkqIGNvbmZpZ3VyZS5pbiAoSVNfREVWRUxPUE1FTlRfVkVSU0lPTik6IEZpeGVkIGRldGVjdGlvbi4KKworU3VuIE1heSAyMyAxNDoyMDoyMiBDRVNUIDE5OTkgIFdlcm5lciBLb2NoICA8d2tAaXNpbC5kLnNodXR0bGUuZGU+CisKKwkqIGFjaW5jbHVkZS5tNCAoR05VUEdfU1lTX1NZTUJPTF9VTkRFUlNDT1JFKTogYXNzdW1lIHllcyB3aGVuCisJY3Jvc3MtY29tcGlsaW5nLgorCitNb24gTWF5IDE3IDIxOjU0OjQzIENFU1QgMTk5OSAgV2VybmVyIEtvY2ggIDx3a0Bpc2lsLmQuc2h1dHRsZS5kZT4KKworCSogY29uZmlndXJlLmluIChzb2NrZXQpOiBGaXggZm9yIFVuaXN5cyBieSBLYXRzdWhpcm8gS29uZG91LgorCitTYXQgTWF5ICA4IDE5OjI4OjA4IENFU1QgMTk5OSAgV2VybmVyIEtvY2ggIDx3a0Bpc2lsLmQuc2h1dHRsZS5kZT4KKworCSogTkVXUzogQWRkIGEgbWFya2VyIGxpbmUgd2hpY2ggSSBmb3Jnb3QgdG8gZG8gZm9yIDAuOS42LgorCitUaHUgTWF5ICA2IDE0OjE4OjE3IENFU1QgMTk5OSAgV2VybmVyIEtvY2ggIDx3a0Bpc2lsLmQuc2h1dHRsZS5kZT4KKworCSogUkVBRE1FOiBNaW5vciB1cGRhdGVzCisKKwkqIFZFUlNJT046IE5vdyAwLjkuNgorCitUaHUgQXByICA4IDA5OjM1OjUzIENFU1QgMTk5OSAgV2VybmVyIEtvY2ggIDx3a0Bpc2lsLmQuc2h1dHRsZS5kZT4KKworCSogYWNpbmNsdWRlLm00IChHTlVQR19DSEVDS19SRFlOQU1JQyk6IEZpeCBmb3IKKwkJCQkJICAgICAgIGFtaWdhLW9wZW5ic2QgKFBldGVyIFJlaWNoKQorCShHTlVQR19QUk9HX05NKTogRGl0dG8KKworV2VkIEFwciAgNyAyMDo1MTozOSBDRVNUIDE5OTkgIFdlcm5lciBLb2NoICA8d2tAaXNpbC5kLnNodXR0bGUuZGU+CisKKwkqIE1ha2VmaWxlLmFtIChnMTBkZWZzLmgpOiBSZW1vdmVkLgorCSogY29uZmlndXJlLmluIChBQ19PVVRQVVRfQ09NTUFORFMpOiBDcmVhdGUgZzEwZGVmcy5oCisKK1NhdCBNYXIgMjAgMTI6NTU6MzMgQ0VUIDE5OTkgIFdlcm5lciBLb2NoICA8d2tAaXNpbC5kLnNodXR0bGUuZGU+CisKKwkqIFZFUlNJT046IE5vdyAwLjkuNQorCitTdW4gTWFyIDE0IDE5OjM0OjM2IENFVCAxOTk5ICBXZXJuZXIgS29jaCAgPHdrQGlzaWwuZC5zaHV0dGxlLmRlPgorCisJKiBhY2luY2x1ZGUubTQgKEFNX1NZU19TWU1CT0xfVU5ERVJTQ09SRSk6IFJlbW92ZWQgYmVjYXVzZSBpdCBpcworCW5vdyBpbiB0aGUgbGF0ZXN0IGxpYnRvb2wuCisKK1RodSBNYXIgMTEgMTY6Mzk6NDYgQ0VUIDE5OTkgIFdlcm5lciBLb2NoICA8d2tAaXNpbC5kLnNodXR0bGUuZGU+CisKKwkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlZCB0aGUgbmVlZCBmb3IgbGlidG9vbAorCitNb24gTWFyICA4IDIwOjQ3OjE3IENFVCAxOTk5ICBXZXJuZXIgS29jaCAgPHdrQGlzaWwuZC5zaHV0dGxlLmRlPgorCisJKiBjb25maWd1cmUuaW4gKERMU1lNX05FRURTX1VOREVSU0NPUkUpOiBSZXBsYWNlZC4KKwkqIGFjaW5jbHVkZS5pbiAoQU1fU1lTX1NZTUJPTF9VTkRFUlNDT1JFKTogTmV3LgorCisJKiBWRVJTSU9OOiBOb3cgMC45LjQKKworU3VuIEZlYiAyOCAxOToxMTowMCBDRVQgMTk5OSAgV2VybmVyIEtvY2ggIDx3a0Bpc2lsLmQuc2h1dHRsZS5kZT4KKworCSogY29uZmlndXJlLmluIChkbGQpOiBUZXN0IGRpc2FibGVkLgorCitGcmkgRmViIDI2IDE3OjU1OjQxIENFVCAxOTk5ICBXZXJuZXIgS29jaCAgPHdrQGlzaWwuZC5zaHV0dGxlLmRlPgorCisJKiBlbmNvZGUuYyAoZW5jb2RlX3NpbXBsZSk6IHRlbXBvcmFyeSBmaXguCisKK1dlZCBGZWIgMjQgMTE6MDc6MjcgQ0VUIDE5OTkgIFdlcm5lciBLb2NoICA8d2tAaXNpbC5kLnNodXR0bGUuZGU+CisKKwkqIGNvbmZpZ3VyZS5pbjogTmV3IG9wdGlvbiAtLWVuYWJsZS1zdGF0aWMtcm5kLgorCitNb24gRmViIDIyIDIwOjA0OjAwIENFVCAxOTk5ICBXZXJuZXIgS29jaCAgPHdrQGlzaWwuZC5zaHV0dGxlLmRlPgorCisJKiBCVUdTOiBOb3cgd2UgYXNzaWduIGJ1ZyBudW1iZXJzLgorCSogT0JVR1M6IE5ldyB0byBrZWVwIHJhY2sgbyBmaXhlZCBidWdzIChDVlMgb25seSkKKworRnJpIEZlYiAxOSAxODowMTo1NCBDRVQgMTk5OSAgV2VybmVyIEtvY2ggIDx3a0Bpc2lsLmQuc2h1dHRsZS5kZT4KKworCSogVkVSU0lPTjogUmVsZWFzZWQgMC45LjMKKworRnJpIEZlYiAxOSAxNTo0OToxNSBDRVQgMTk5OSAgV2VybmVyIEtvY2ggIDx3a0Bpc2lsLmQuc2h1dHRsZS5kZT4KKworCSogYWNpbmNsdWRlLm00OiBSZW1vdmVkIGdldHRleHQgbWFjcm9zLgorCitUdWUgRmViIDE2IDE0OjEwOjAyIENFVCAxOTk5ICBXZXJuZXIgS29jaCAgPHdrQGlzaWwuZC5zaHV0dGxlLmRlPgorCisJKiBjb25maWd1cmUuaW4gKHNvY2tldCk6IENoZWNrIGZvciAtbHNvY2tldCBhbmQgLWxuc2wuCisJKG9zZjQpOiBEaXNhYmxlIGFsbCB3YXJuaW5ncyBmb3IgREVDJ3MgY2MuCisJKC1XYWxsKTogQWRkIG1vcmUgd2FybmluZyBvcHRpb25zIGZvciBnY2MKKworU2F0IEZlYiAxMyAxMjowNDo0MyBDRVQgMTk5OSAgV2VybmVyIEtvY2ggIDx3a0Bpc2lsLmQuc2h1dHRsZS5kZT4KKworCSogY29uZmlndXJlLmluOiBDaGFuZ2VkIGRldGVjdGlvbiBvZiBjb21waWxlciBmbGFncy4KKwkqIGludGwvIDogUmVtb3ZlZCBkaXJlY3RvcnkKKworV2VkIEZlYiAxMCAxNzoxNTozOSBDRVQgMTk5OSAgV2VybmVyIEtvY2ggIDx3a0Bpc2lsLmQuc2h1dHRsZS5kZT4KKworCSogYWNpbmNsdWRlLm00IChHTlVQR19DSEVDS19SRFlOQU1JQyk6IEZpeCBmb3IgZnJlZWJzZCAyLjIKKworCSogY29uZmlndXJlLmluOiBhIGxvdCBvZiBjaGFuZ2VzIHRvIGFsbG93IHNlbGVjdGlvbiBvZiBtb2R1bGVzLgorCUFkZCBzdXBwb3J0IGZvciBPUy8yLgorCisJKiBhY2luY2x1ZGUubTQ6IGFkZCBzb21lIG1vcmUgY2FjaGluZworCisJKiBSRUFETUU6IFNwZWxsaW5nIGFuZCBncmFtbWFyIGNvcnJlY3Rpb25zIChKb2huIEEuIE1hcnRpbikKKwkqIElOU1RBTEw6IERpdHRvLgorCitXZWQgSmFuIDIwIDIxOjQwOjIxIENFVCAxOTk5ICBXZXJuZXIgS29jaCAgPHdrQGlzaWwuZC5zaHV0dGxlLmRlPgorCisJKiBjb25maWd1cmUuaW46IC0tZW5hYmxlLW0tZ3VhcmQgaXMgbm93IGRlZmF1bHQKKworV2VkIEphbiAxMyAxMjo0OTozNiBDRVQgMTk5OSAgV2VybmVyIEtvY2ggIDx3a0Bpc2lsLmQuc2h1dHRsZS5kZT4KKworCSogSU5TVEFMTDogQXBwbGllZCBuZXcgaW5mb3JtYXRpb24gaG93IHRvIGJ1aWxkIHJwbXMgYnkgRmFiaW8gQ29hdHRpCisJKiBNYWtlZmlsZS5pbiAoZ251cGcuc3BlYyk6IENoYW5nZWQgdGhlIG5hbWVzLgorCitUdWUgSmFuIDEyIDExOjE3OjE4IENFVCAxOTk5ICBXZXJuZXIgS29jaCAgPHdrQGlzaWwuZC5zaHV0dGxlLmRlPgorCisJKiBjb25maWcubGlua3MgKG02OGstYXRhcmktbWludCk6IE5ldworCitUdWUgSmFuIDEyIDA5OjE3OjE5IENFVCAxOTk5ICBHYetsIFF16XJpIDxncXVlcmlAbWFpbC5kb3Rjb20uZnI+CisKKwkqIGFsbDogRml4ZWQgdHlwb3MgYWxsIG92ZXIgdGhlIHBsYWNlCisKK1NhdCBKYW4gIDkgMTY6MDI6MjMgQ0VUIDE5OTkgIFdlcm5lciBLb2NoICA8d2tAaXNpbC5kLnNodXR0bGUuZGU+CisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIGEgd2F5IHRvIHN0YXRpY2FsbHkgbGluayBybmR1bml4CisKK1N1biBKYW4gIDMgMTU6Mjg6NDQgQ0VUIDE5OTkgIFdlcm5lciBLb2NoICA8d2tAaXNpbC5kLnNodXR0bGUuZGU+CisKKwkqIGFjaW5jbHVkZS5tNCAoR05VUEdfQ0hFQ0tfUkRZTkFNSUMpOiBOZXcuCisJKiBjb25maWd1cmUuaW4gKERZTkxPQURfQ0ZMQUdTKTogVXNlIHJlc3VsdCBmcm9tIENIRUNLX1JEWU5BTUlDCisKK1dlZCBEZWMgMjMgMTM6MTg6MTQgQ0VUIDE5OTggIFdlcm5lciBLb2NoICA8d2tAaXNpbC5kLnNodXR0bGUuZGU+CisKKwkqIFJFQURNRTogUmVwbGFjZWQgdGhlIGNvbW1hbmQgb3ZlcnZpZXcgd2l0aCBhIHNob3J0IGludHJvLgorCitTYXQgRGVjIDEyIDE4OjQwOjMyIENFVCAxOTk4ICBXZXJuZXIgS29jaCAgPHdrQGlzaWwuZC5zaHV0dGxlLmRlPgorCisJKiBjb25maWd1cmUuaW46IEFkZCBjaGVjayBmb3IgZGxvcGVuIGluIGxpYmMgKEdyZWcgVHJveGVsKQorCWFuZCBhIG5ldyBkZWZpbmUKKwkqIGFjY29uZmlnLmggKERMU1lNX05FRURTX1VOREVSU0NPUkUpOiBOZXcuCisKK1RodSBEZWMgMTAgMjA6MTU6MzYgQ0VUIDE5OTggIFdlcm5lciBLb2NoICA8d2tAaXNpbC5kLnNodXR0bGUuZGU+CisKKwkqIGFjaW5jbHVkZS5tIChHTlVQR19DSEVDS19QSUMpOiBOZXcKKwkqIGNvbmZpZ3VyZS5pbiwgYWNpbmNsdWRlLm00OiBSZW5hbWVkIGFsbCBXS18gdG8gR05VUEdfCisKK1R1ZSBEZWMgIDggMTU6MDk6MjkgQ0VUIDE5OTggIFdlcm5lciBLb2NoICA8d2tAaXNpbC5kLnNodXR0bGUuZGU+CisKKwkqIFZFUlNJT046IFNldCB0byAwLjQuNQorCitXZWQgTm92IDI1IDEyOjM4OjI5IDE5OTggIFdlcm5lciBLb2NoICAod2tAaXNpbC5kLnNodXR0bGUuZGUpCisKKwkqIGNvbmZpZ3VyZS5pbiAoVVNFX1JORExJTlVYKTogTmV3LgorCitGcmkgTm92IDIwIDE5OjM0OjU3IDE5OTggIFdlcm5lciBLb2NoICAod2tAaXNpbC5kLnNodXR0bGUuZGUpCisKKwkqIFZFUlNJT046IFJlbGVhc2VkIDAuNC40CisKKwkqIGNvbmZpZ3VyZS5pbiAodHJ5X2FzbV9tb2R1bGVzKTogRm9yIG9wdGlvbiAtLWRpc2FibGUtYXNtCisKK1R1ZSBOb3YgMTAgMTk6MzI6NDAgMTk5OCAgV2VybmVyIEtvY2ggICh3a0Bpc2lsLmQuc2h1dHRsZS5kZSkKKworCSogY29uZmlndXJlLmluIChNUElfU0ZMQUdTKTogTmV3LgorCitUdWUgTm92IDEwIDEzOjQ0OjUzIDE5OTggIFdlcm5lciBLb2NoICAod2tAaXNpbC5kLnNodXR0bGUuZGUpCisKKwkqIEFCT1VULU5MUzogTmV3CisJKiBjb25maWd1cmUuaW4gKEFDX1JFVklTSU9OKTogTmV3LgorCitTdW4gTm92ICA4IDE4OjIwOjM1IDE5OTggIFdlcm5lciBLb2NoICAod2tAaXNpbC5kLnNodXR0bGUuZGUpCisKKwkqIFZFUlNJT046IFNldCB0byAwLjQuMworCitTdW4gT2N0IDI1IDE5OjQ5OjM3IDE5OTggIFdlcm5lciBLb2NoICAod2tAaXNpbC5kLnNodXR0bGUuZGUpCisKKwkqIE1ha2VmaWxlLmFtIChnMTBkZWZzLmgpOiBOZXcgbWFjcm8gR05VUEdfREFUQURJUi4KKworV2VkIE9jdCAyMSAxNzoyNDoyNCAxOTk4ICBXZXJuZXIgS29jaCAgKHdrQGlzaWwuZC5zaHV0dGxlLmRlKQorCisJKiBjb25maWd1cmUuaW46IFJlbW92ZWQgZ2V0dGV4dCBrbHVkZ2UKKwkqIGFjaW5jbHVkZS5tNDogQWRkIHBhdGNoZWQgQU1fV0lUSF9OS1MgbWFjcm8KKworVHVlIE9jdCAyMCAxOTowMzozNiAxOTk4ICBXZXJuZXIgS29jaCAgKHdrQGlzaWwuZC5zaHV0dGxlLmRlKQorCisJKiBjb25maWd1cmUuaW46IEtsdWRnZSB0byBtYWtlIEFNX0dOVV9HRVRURVhUIHdvcmssCisJY2hhbmdlZCBzb21lIG1hY29ycyB0byBtb3JlIG1vZGVybiB2ZXJzaW9ucy4gQWxzbworCWNoYW5nZWcgdGhlIGFsbCBtYWtlZmlsZXMgdG8gcmVtb3ZlIGR1cGxpY2F0ZSAuLi9pbnRsLgorCSogYWNpbmNsdWRlLm00OiBSZW1vdmVkIHRoZSBnZXR0ZXh0IHN0dWZmLCBhcyB0aGlzCisJYWxyZWFkeSBjb21lcyB3aXRoIGF1dG9tYWtlIG5vdy4KKworV2VkIE9jdCAxNCAxMjoxMTozNCAxOTk4ICBXZXJuZXIgS29jaCAgKHdrQGlzaWwuZC5zaHV0dGxlLmRlKQorCisJKiBjb25maWd1cmUuaW4gKE5BTUVfT0ZfREVWX1JBTkRPTSk6IE5ldy4KKwkoRFlOTElOS19NT0RfQ0ZMQUdTKTogTmV3LgorCitUaHUgT2N0ICA4IDEwOjU1OjE1IDE5OTggIFdlcm5lciBLb2NoICAod2tAaXNpbC5kLnNodXR0bGUuZGUpCisKKwkqIE1ha2VmaWxlLmFtIChnMTBkZWZzLmgpOiBjcmVhdGVzIGluY2x1ZGUgZmlsZQorCSogYWNjb25maWcuaDogbm93IGluY2x1ZGVzIGcxMGRlZnMuaAorCSogY29uZmlndXJlLmluOiBSZW1vdmVkIEcxMF9MT0NBTEVESVIgYW5kIEdOVVBHX0xJQgorCitUaHUgU2VwIDE3IDE4OjQ5OjQwIDE5OTggIFdlcm5lciBLb2NoICAod2tAKG5vbmUpKQorCisJKiBNYWtlZmlsZS5hbSAoZGlzdC1ob29rKTogTm93IGNyZWF0ZXMgUlBNIGZpbGUuCisJKiBzY3JpcHRzL2dudXBnLnNwZWM6IE5ldyB0ZW1wbGF0ZSBmaWxlIGZvciBSUE1zCisKK1RodSBKdWwgMzAgMTk6MTc6MDcgMTk5OCAgV2VybmVyIEtvY2ggICh3a0Aobm9uZSkpCisKKwkqIGFjaW5jbHVkZS5oIChXS19DSEVDS19JUEMpOiBOZXcKKwkqIGNvbmZpZ3VyZS5pbiA6IEFkZCBjaGVja3MgZm9yIFN5c1YgSVBDCisKK1RodSBKdW4gMjUgMTE6MTg6NDkgMTk5OCAgV2VybmVyIEtvY2ggICh3a0Bpc2lsLmQuc2h1dHRsZS5kZSkKKworCSogY29uZmlndXJlLmluICgtLWRpc2FibGUtZHlubG9hZCk6IE5ldy4KKworV2VkIEp1biAxMCAwNzo0ODo1OSAxOTk4ICBXZXJuZXIgS29jaCxtb2JpbCwsLAkod2tAdG9ib2xkKQorCisJKiBjb25maWd1cmUuaW4gKEdOVVBHX0xJQkRJUik6IE5ldy4KKworTW9uIE1heSAyNSAxOToxMDo1OSAxOTk4ICBXZXJuZXIgS29jaCAgKHdrQGlzaWwuZC5zaHV0dGxlLmRlKQorCisJKiByYW5kLXVuaXguYyAoZmFzdF9yYW5kb21fcG9sbCk6IGZpeGVkIHN5bnRheCBidWcuCisKK01vbiBNYXkgMTEgMTA6MjE6MzEgMTk5OCAgV2VybmVyIEtvY2ggICh3a0Bpc2lsLmQuc2h1dHRsZS5kZSkKKworCSogY29uZmlndXJlLmluIChQUklOVEFCTEVfT1NfTkFNRSk6IExpbnV4IGlzIG5vdyBHTlUvTGludXgKKworVHVlIEFwciAxNCAxOTowODowNSAxOTk4ICBXZXJuZXIgS29jaCAgKHdrQGlzaWwuZC5zaHV0dGxlLmRlKQorCisJKiBbYWxsIGZpbGVzXTogQXBwbGllZCBNYXR0aGV3IFNrYWxhJ3MgdHlwbyBhbmQgZ3JhbW1hciBmaXhlcy4KKworV2VkIE1hciAgNCAxMDozMjo0MCAxOTk4ICBXZXJuZXIgS29jaCAgKHdrQGlzaWwuZC5zaHV0dGxlLmRlKQorCisJKiBjb25maWd1cmUuaW4gKGdldHJ1c2FnZSxnZXR0aW1lb2ZkYXkpOiBOZXcgdGVzdHMuCisKK0ZyaSBGZWIgMjcgMTM6MTQ6MTcgMTk5OCAgV2VybmVyIEtvY2ggICh3a0Bpc2lsLmQuc2h1dHRsZS5kZSkKKworCSogY29uZmlndXJlLmluICgtLWRpc2FibGUtbS1ndWFyZCk6IE5ldy4KKworVGh1IEZlYiAyNiAxNzowOToyNyAxOTk4ICBXZXJuZXIgS29jaCAgKHdrQGlzaWwuZC5zaHV0dGxlLmRlKQorCisJKiBjb25maWd1cmUuaW4sIGFjaW5jbHVkZS5tNCwgaW50bC8sIHBvLzogTmV3IG1hY3JvcyB0YWtlbgorCWZyb20gR05PTUUsIHN3aXRjaGVkIHRvIGF1dG9tYWtlIDEuMmYKKworVGh1IEZlYiAyNiAwOTowNTo0NiAxOTk4ICBXZXJuZXIgS29jaCAgKHdrQGlzaWwuZC5zaHV0dGxlLmRlKQorCisJKiBjb25maWd1cmUuaW4gKGRvYy9NYWtlZmlsZSk6IE5ldworCitUaHUgRmViIDI2IDA3OjQwOjQ3IDE5OTggIFdlcm5lciBLb2NoICAod2tAaXNpbC5kLnNodXR0bGUuZGUpCisKKwkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlZCBnZXR0ZXh0IHN0dWZmCisKK1dlZCBGZWIgMjUgMTE6NDQ6MTAgMTk5OCAgV2VybmVyIEtvY2ggICh3a0Bpc2lsLmQuc2h1dHRsZS5kZSkKKworCSogY2hlY2tzLyp0ZXN0IDogcmVzdHJ1Y3R1cmVkIHRoZSBkaXJlY3RvcnkuCisKK1R1ZSBGZWIgMjQgMTU6NTk6MTIgMTk5OCAgV2VybmVyIEtvY2ggICh3a0Bpc2lsLmQuc2h1dHRsZS5kZSkKKworCSogY29uZmlndXJlLmluOiBDaGFuZ2VkIHRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIEdOVVBHIGFuZAorCWNobmFnZWQgc2V2ZXJhbCBvdGhlciBuYW1lcyB0b28uCisKK1dlZCBGZWIgMTggMTc6MzY6NDUgMTk5OCAgV2VybmVyIEtvY2ggICh3a0Bpc2lsLmQuc2h1dHRsZS5kZSkKKworCSogTWFrZWZpbGUuYW0gKGNoZWNrcyk6IE5ldy4KKworU2F0IEZlYiAxNCAxNTozNzo1NSAxOTk4ICBXZXJuZXIgS29jaCAgKHdrQGlzaWwuZC5zaHV0dGxlLmRlKQorCisJKiBjb25maWd1cmUuaW4gKG1waV9jb25maWdfZG9uZSk6IFJlbW92ZWQgYXNtIGxpbmtzIGNhY2hpbmcuCisKK1NhdCBGZWIgMTQgMTQ6MDI6MjAgMTk5OCAgV2VybmVyIEtvY2ggICh3a0Bpc2lsLmQuc2h1dHRsZS5kZSkKKworCSogY29uZmlndXJlLmluIChQUklOVEFCTEVfT1NfTkFNRSk6IE5ldy4KKwkqIGFjY29uZmlnLmg6IExpa2V3aXNlLgorCitGcmkgRmViIDEzIDE5OjQzOjQxIDE5OTggIFdlcm5lciBLb2NoICAod2tAaXNpbC5kLnNodXR0bGUuZGUpCisKKwkqIGNvbmZpZ3VyZS5pbiA6IEZpeGVkIHpsaWIgc3R1ZmYKKwkqIE1ha2VmaWxlLmFtOiBMaWtld2lzZQorCisKKyBDb3B5cmlnaHQgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNiwKKwkgICAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IGFzIGEgc3BlY2lhbCBleGNlcHRpb24gdGhlIGF1dGhvciBnaXZlcworIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQgZXZlbiB0aGUKKyBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9JTlNUQUxMIGIvbGliZ2NyeXB0LTEuNC42L0lOU1RBTEwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ1ODcxNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9JTlNUQUxMCkBAIC0wLDAgKzEsMjM0IEBACitJbnN0YWxsYXRpb24gSW5zdHJ1Y3Rpb25zCisqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwNCwgMjAwNSwKKzIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBmcmVlIGRvY3VtZW50YXRpb247IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gZ2l2ZXMKK3VubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KKworQmFzaWMgSW5zdGFsbGF0aW9uCis9PT09PT09PT09PT09PT09PT0KKworQnJpZWZseSwgdGhlIHNoZWxsIGNvbW1hbmRzIGAuL2NvbmZpZ3VyZTsgbWFrZTsgbWFrZSBpbnN0YWxsJyBzaG91bGQKK2NvbmZpZ3VyZSwgYnVpbGQsIGFuZCBpbnN0YWxsIHRoaXMgcGFja2FnZS4gIFRoZSBmb2xsb3dpbmcKK21vcmUtZGV0YWlsZWQgaW5zdHJ1Y3Rpb25zIGFyZSBnZW5lcmljOyBzZWUgdGhlIGBSRUFETUUnIGZpbGUgZm9yCitpbnN0cnVjdGlvbnMgc3BlY2lmaWMgdG8gdGhpcyBwYWNrYWdlLgorCisgICBUaGUgYGNvbmZpZ3VyZScgc2hlbGwgc2NyaXB0IGF0dGVtcHRzIHRvIGd1ZXNzIGNvcnJlY3QgdmFsdWVzIGZvcgordmFyaW91cyBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyB1c2VkIGR1cmluZyBjb21waWxhdGlvbi4gIEl0IHVzZXMKK3Rob3NlIHZhbHVlcyB0byBjcmVhdGUgYSBgTWFrZWZpbGUnIGluIGVhY2ggZGlyZWN0b3J5IG9mIHRoZSBwYWNrYWdlLgorSXQgbWF5IGFsc28gY3JlYXRlIG9uZSBvciBtb3JlIGAuaCcgZmlsZXMgY29udGFpbmluZyBzeXN0ZW0tZGVwZW5kZW50CitkZWZpbml0aW9ucy4gIEZpbmFsbHksIGl0IGNyZWF0ZXMgYSBzaGVsbCBzY3JpcHQgYGNvbmZpZy5zdGF0dXMnIHRoYXQKK3lvdSBjYW4gcnVuIGluIHRoZSBmdXR1cmUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiwgYW5kIGEKK2ZpbGUgYGNvbmZpZy5sb2cnIGNvbnRhaW5pbmcgY29tcGlsZXIgb3V0cHV0ICh1c2VmdWwgbWFpbmx5IGZvcgorZGVidWdnaW5nIGBjb25maWd1cmUnKS4KKworICAgSXQgY2FuIGFsc28gdXNlIGFuIG9wdGlvbmFsIGZpbGUgKHR5cGljYWxseSBjYWxsZWQgYGNvbmZpZy5jYWNoZScKK2FuZCBlbmFibGVkIHdpdGggYC0tY2FjaGUtZmlsZT1jb25maWcuY2FjaGUnIG9yIHNpbXBseSBgLUMnKSB0aGF0IHNhdmVzCit0aGUgcmVzdWx0cyBvZiBpdHMgdGVzdHMgdG8gc3BlZWQgdXAgcmVjb25maWd1cmluZy4gIENhY2hpbmcgaXMKK2Rpc2FibGVkIGJ5IGRlZmF1bHQgdG8gcHJldmVudCBwcm9ibGVtcyB3aXRoIGFjY2lkZW50YWwgdXNlIG9mIHN0YWxlCitjYWNoZSBmaWxlcy4KKworICAgSWYgeW91IG5lZWQgdG8gZG8gdW51c3VhbCB0aGluZ3MgdG8gY29tcGlsZSB0aGUgcGFja2FnZSwgcGxlYXNlIHRyeQordG8gZmlndXJlIG91dCBob3cgYGNvbmZpZ3VyZScgY291bGQgY2hlY2sgd2hldGhlciB0byBkbyB0aGVtLCBhbmQgbWFpbAorZGlmZnMgb3IgaW5zdHJ1Y3Rpb25zIHRvIHRoZSBhZGRyZXNzIGdpdmVuIGluIHRoZSBgUkVBRE1FJyBzbyB0aGV5IGNhbgorYmUgY29uc2lkZXJlZCBmb3IgdGhlIG5leHQgcmVsZWFzZS4gIElmIHlvdSBhcmUgdXNpbmcgdGhlIGNhY2hlLCBhbmQgYXQKK3NvbWUgcG9pbnQgYGNvbmZpZy5jYWNoZScgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UKK21heSByZW1vdmUgb3IgZWRpdCBpdC4KKworICAgVGhlIGZpbGUgYGNvbmZpZ3VyZS5hYycgKG9yIGBjb25maWd1cmUuaW4nKSBpcyB1c2VkIHRvIGNyZWF0ZQorYGNvbmZpZ3VyZScgYnkgYSBwcm9ncmFtIGNhbGxlZCBgYXV0b2NvbmYnLiAgWW91IG5lZWQgYGNvbmZpZ3VyZS5hYycgaWYKK3lvdSB3YW50IHRvIGNoYW5nZSBpdCBvciByZWdlbmVyYXRlIGBjb25maWd1cmUnIHVzaW5nIGEgbmV3ZXIgdmVyc2lvbgorb2YgYGF1dG9jb25mJy4KKworVGhlIHNpbXBsZXN0IHdheSB0byBjb21waWxlIHRoaXMgcGFja2FnZSBpczoKKworICAxLiBgY2QnIHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgcGFja2FnZSdzIHNvdXJjZSBjb2RlIGFuZCB0eXBlCisgICAgIGAuL2NvbmZpZ3VyZScgdG8gY29uZmlndXJlIHRoZSBwYWNrYWdlIGZvciB5b3VyIHN5c3RlbS4KKworICAgICBSdW5uaW5nIGBjb25maWd1cmUnIG1pZ2h0IHRha2UgYSB3aGlsZS4gIFdoaWxlIHJ1bm5pbmcsIGl0IHByaW50cworICAgICBzb21lIG1lc3NhZ2VzIHRlbGxpbmcgd2hpY2ggZmVhdHVyZXMgaXQgaXMgY2hlY2tpbmcgZm9yLgorCisgIDIuIFR5cGUgYG1ha2UnIHRvIGNvbXBpbGUgdGhlIHBhY2thZ2UuCisKKyAgMy4gT3B0aW9uYWxseSwgdHlwZSBgbWFrZSBjaGVjaycgdG8gcnVuIGFueSBzZWxmLXRlc3RzIHRoYXQgY29tZSB3aXRoCisgICAgIHRoZSBwYWNrYWdlLgorCisgIDQuIFR5cGUgYG1ha2UgaW5zdGFsbCcgdG8gaW5zdGFsbCB0aGUgcHJvZ3JhbXMgYW5kIGFueSBkYXRhIGZpbGVzIGFuZAorICAgICBkb2N1bWVudGF0aW9uLgorCisgIDUuIFlvdSBjYW4gcmVtb3ZlIHRoZSBwcm9ncmFtIGJpbmFyaWVzIGFuZCBvYmplY3QgZmlsZXMgZnJvbSB0aGUKKyAgICAgc291cmNlIGNvZGUgZGlyZWN0b3J5IGJ5IHR5cGluZyBgbWFrZSBjbGVhbicuICBUbyBhbHNvIHJlbW92ZSB0aGUKKyAgICAgZmlsZXMgdGhhdCBgY29uZmlndXJlJyBjcmVhdGVkIChzbyB5b3UgY2FuIGNvbXBpbGUgdGhlIHBhY2thZ2UgZm9yCisgICAgIGEgZGlmZmVyZW50IGtpbmQgb2YgY29tcHV0ZXIpLCB0eXBlIGBtYWtlIGRpc3RjbGVhbicuICBUaGVyZSBpcworICAgICBhbHNvIGEgYG1ha2UgbWFpbnRhaW5lci1jbGVhbicgdGFyZ2V0LCBidXQgdGhhdCBpcyBpbnRlbmRlZCBtYWlubHkKKyAgICAgZm9yIHRoZSBwYWNrYWdlJ3MgZGV2ZWxvcGVycy4gIElmIHlvdSB1c2UgaXQsIHlvdSBtYXkgaGF2ZSB0byBnZXQKKyAgICAgYWxsIHNvcnRzIG9mIG90aGVyIHByb2dyYW1zIGluIG9yZGVyIHRvIHJlZ2VuZXJhdGUgZmlsZXMgdGhhdCBjYW1lCisgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworQ29tcGlsZXJzIGFuZCBPcHRpb25zCis9PT09PT09PT09PT09PT09PT09PT0KKworU29tZSBzeXN0ZW1zIHJlcXVpcmUgdW51c3VhbCBvcHRpb25zIGZvciBjb21waWxhdGlvbiBvciBsaW5raW5nIHRoYXQgdGhlCitgY29uZmlndXJlJyBzY3JpcHQgZG9lcyBub3Qga25vdyBhYm91dC4gIFJ1biBgLi9jb25maWd1cmUgLS1oZWxwJyBmb3IKK2RldGFpbHMgb24gc29tZSBvZiB0aGUgcGVydGluZW50IGVudmlyb25tZW50IHZhcmlhYmxlcy4KKworICAgWW91IGNhbiBnaXZlIGBjb25maWd1cmUnIGluaXRpYWwgdmFsdWVzIGZvciBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKK2J5IHNldHRpbmcgdmFyaWFibGVzIGluIHRoZSBjb21tYW5kIGxpbmUgb3IgaW4gdGhlIGVudmlyb25tZW50LiAgSGVyZQoraXMgYW4gZXhhbXBsZToKKworICAgICAuL2NvbmZpZ3VyZSBDQz1jOTkgQ0ZMQUdTPS1nIExJQlM9LWxwb3NpeAorCisgICAqTm90ZSBEZWZpbmluZyBWYXJpYWJsZXM6OiwgZm9yIG1vcmUgZGV0YWlscy4KKworQ29tcGlsaW5nIEZvciBNdWx0aXBsZSBBcmNoaXRlY3R1cmVzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworWW91IGNhbiBjb21waWxlIHRoZSBwYWNrYWdlIGZvciBtb3JlIHRoYW4gb25lIGtpbmQgb2YgY29tcHV0ZXIgYXQgdGhlCitzYW1lIHRpbWUsIGJ5IHBsYWNpbmcgdGhlIG9iamVjdCBmaWxlcyBmb3IgZWFjaCBhcmNoaXRlY3R1cmUgaW4gdGhlaXIKK293biBkaXJlY3RvcnkuICBUbyBkbyB0aGlzLCB5b3UgY2FuIHVzZSBHTlUgYG1ha2UnLiAgYGNkJyB0byB0aGUKK2RpcmVjdG9yeSB3aGVyZSB5b3Ugd2FudCB0aGUgb2JqZWN0IGZpbGVzIGFuZCBleGVjdXRhYmxlcyB0byBnbyBhbmQgcnVuCit0aGUgYGNvbmZpZ3VyZScgc2NyaXB0LiAgYGNvbmZpZ3VyZScgYXV0b21hdGljYWxseSBjaGVja3MgZm9yIHRoZQorc291cmNlIGNvZGUgaW4gdGhlIGRpcmVjdG9yeSB0aGF0IGBjb25maWd1cmUnIGlzIGluIGFuZCBpbiBgLi4nLgorCisgICBXaXRoIGEgbm9uLUdOVSBgbWFrZScsIGl0IGlzIHNhZmVyIHRvIGNvbXBpbGUgdGhlIHBhY2thZ2UgZm9yIG9uZQorYXJjaGl0ZWN0dXJlIGF0IGEgdGltZSBpbiB0aGUgc291cmNlIGNvZGUgZGlyZWN0b3J5LiAgQWZ0ZXIgeW91IGhhdmUKK2luc3RhbGxlZCB0aGUgcGFja2FnZSBmb3Igb25lIGFyY2hpdGVjdHVyZSwgdXNlIGBtYWtlIGRpc3RjbGVhbicgYmVmb3JlCityZWNvbmZpZ3VyaW5nIGZvciBhbm90aGVyIGFyY2hpdGVjdHVyZS4KKworSW5zdGFsbGF0aW9uIE5hbWVzCis9PT09PT09PT09PT09PT09PT0KKworQnkgZGVmYXVsdCwgYG1ha2UgaW5zdGFsbCcgaW5zdGFsbHMgdGhlIHBhY2thZ2UncyBjb21tYW5kcyB1bmRlcgorYC91c3IvbG9jYWwvYmluJywgaW5jbHVkZSBmaWxlcyB1bmRlciBgL3Vzci9sb2NhbC9pbmNsdWRlJywgZXRjLiAgWW91CitjYW4gc3BlY2lmeSBhbiBpbnN0YWxsYXRpb24gcHJlZml4IG90aGVyIHRoYW4gYC91c3IvbG9jYWwnIGJ5IGdpdmluZworYGNvbmZpZ3VyZScgdGhlIG9wdGlvbiBgLS1wcmVmaXg9UFJFRklYJy4KKworICAgWW91IGNhbiBzcGVjaWZ5IHNlcGFyYXRlIGluc3RhbGxhdGlvbiBwcmVmaXhlcyBmb3IKK2FyY2hpdGVjdHVyZS1zcGVjaWZpYyBmaWxlcyBhbmQgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzLiAgSWYgeW91CitwYXNzIHRoZSBvcHRpb24gYC0tZXhlYy1wcmVmaXg9UFJFRklYJyB0byBgY29uZmlndXJlJywgdGhlIHBhY2thZ2UgdXNlcworUFJFRklYIGFzIHRoZSBwcmVmaXggZm9yIGluc3RhbGxpbmcgcHJvZ3JhbXMgYW5kIGxpYnJhcmllcy4KK0RvY3VtZW50YXRpb24gYW5kIG90aGVyIGRhdGEgZmlsZXMgc3RpbGwgdXNlIHRoZSByZWd1bGFyIHByZWZpeC4KKworICAgSW4gYWRkaXRpb24sIGlmIHlvdSB1c2UgYW4gdW51c3VhbCBkaXJlY3RvcnkgbGF5b3V0IHlvdSBjYW4gZ2l2ZQorb3B0aW9ucyBsaWtlIGAtLWJpbmRpcj1ESVInIHRvIHNwZWNpZnkgZGlmZmVyZW50IHZhbHVlcyBmb3IgcGFydGljdWxhcgora2luZHMgb2YgZmlsZXMuICBSdW4gYGNvbmZpZ3VyZSAtLWhlbHAnIGZvciBhIGxpc3Qgb2YgdGhlIGRpcmVjdG9yaWVzCit5b3UgY2FuIHNldCBhbmQgd2hhdCBraW5kcyBvZiBmaWxlcyBnbyBpbiB0aGVtLgorCisgICBJZiB0aGUgcGFja2FnZSBzdXBwb3J0cyBpdCwgeW91IGNhbiBjYXVzZSBwcm9ncmFtcyB0byBiZSBpbnN0YWxsZWQKK3dpdGggYW4gZXh0cmEgcHJlZml4IG9yIHN1ZmZpeCBvbiB0aGVpciBuYW1lcyBieSBnaXZpbmcgYGNvbmZpZ3VyZScgdGhlCitvcHRpb24gYC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYJyBvciBgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVgnLgorCitPcHRpb25hbCBGZWF0dXJlcworPT09PT09PT09PT09PT09PT0KKworU29tZSBwYWNrYWdlcyBwYXkgYXR0ZW50aW9uIHRvIGAtLWVuYWJsZS1GRUFUVVJFJyBvcHRpb25zIHRvCitgY29uZmlndXJlJywgd2hlcmUgRkVBVFVSRSBpbmRpY2F0ZXMgYW4gb3B0aW9uYWwgcGFydCBvZiB0aGUgcGFja2FnZS4KK1RoZXkgbWF5IGFsc28gcGF5IGF0dGVudGlvbiB0byBgLS13aXRoLVBBQ0tBR0UnIG9wdGlvbnMsIHdoZXJlIFBBQ0tBR0UKK2lzIHNvbWV0aGluZyBsaWtlIGBnbnUtYXMnIG9yIGB4JyAoZm9yIHRoZSBYIFdpbmRvdyBTeXN0ZW0pLiAgVGhlCitgUkVBRE1FJyBzaG91bGQgbWVudGlvbiBhbnkgYC0tZW5hYmxlLScgYW5kIGAtLXdpdGgtJyBvcHRpb25zIHRoYXQgdGhlCitwYWNrYWdlIHJlY29nbml6ZXMuCisKKyAgIEZvciBwYWNrYWdlcyB0aGF0IHVzZSB0aGUgWCBXaW5kb3cgU3lzdGVtLCBgY29uZmlndXJlJyBjYW4gdXN1YWxseQorZmluZCB0aGUgWCBpbmNsdWRlIGFuZCBsaWJyYXJ5IGZpbGVzIGF1dG9tYXRpY2FsbHksIGJ1dCBpZiBpdCBkb2Vzbid0LAoreW91IGNhbiB1c2UgdGhlIGBjb25maWd1cmUnIG9wdGlvbnMgYC0teC1pbmNsdWRlcz1ESVInIGFuZAorYC0teC1saWJyYXJpZXM9RElSJyB0byBzcGVjaWZ5IHRoZWlyIGxvY2F0aW9ucy4KKworU3BlY2lmeWluZyB0aGUgU3lzdGVtIFR5cGUKKz09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZXJlIG1heSBiZSBzb21lIGZlYXR1cmVzIGBjb25maWd1cmUnIGNhbm5vdCBmaWd1cmUgb3V0IGF1dG9tYXRpY2FsbHksCitidXQgbmVlZHMgdG8gZGV0ZXJtaW5lIGJ5IHRoZSB0eXBlIG9mIG1hY2hpbmUgdGhlIHBhY2thZ2Ugd2lsbCBydW4gb24uCitVc3VhbGx5LCBhc3N1bWluZyB0aGUgcGFja2FnZSBpcyBidWlsdCB0byBiZSBydW4gb24gdGhlIF9zYW1lXworYXJjaGl0ZWN0dXJlcywgYGNvbmZpZ3VyZScgY2FuIGZpZ3VyZSB0aGF0IG91dCwgYnV0IGlmIGl0IHByaW50cyBhCittZXNzYWdlIHNheWluZyBpdCBjYW5ub3QgZ3Vlc3MgdGhlIG1hY2hpbmUgdHlwZSwgZ2l2ZSBpdCB0aGUKK2AtLWJ1aWxkPVRZUEUnIG9wdGlvbi4gIFRZUEUgY2FuIGVpdGhlciBiZSBhIHNob3J0IG5hbWUgZm9yIHRoZSBzeXN0ZW0KK3R5cGUsIHN1Y2ggYXMgYHN1bjQnLCBvciBhIGNhbm9uaWNhbCBuYW1lIHdoaWNoIGhhcyB0aGUgZm9ybToKKworICAgICBDUFUtQ09NUEFOWS1TWVNURU0KKword2hlcmUgU1lTVEVNIGNhbiBoYXZlIG9uZSBvZiB0aGVzZSBmb3JtczoKKworICAgICBPUyBLRVJORUwtT1MKKworICAgU2VlIHRoZSBmaWxlIGBjb25maWcuc3ViJyBmb3IgdGhlIHBvc3NpYmxlIHZhbHVlcyBvZiBlYWNoIGZpZWxkLiAgSWYKK2Bjb25maWcuc3ViJyBpc24ndCBpbmNsdWRlZCBpbiB0aGlzIHBhY2thZ2UsIHRoZW4gdGhpcyBwYWNrYWdlIGRvZXNuJ3QKK25lZWQgdG8ga25vdyB0aGUgbWFjaGluZSB0eXBlLgorCisgICBJZiB5b3UgYXJlIF9idWlsZGluZ18gY29tcGlsZXIgdG9vbHMgZm9yIGNyb3NzLWNvbXBpbGluZywgeW91IHNob3VsZAordXNlIHRoZSBvcHRpb24gYC0tdGFyZ2V0PVRZUEUnIHRvIHNlbGVjdCB0aGUgdHlwZSBvZiBzeXN0ZW0gdGhleSB3aWxsCitwcm9kdWNlIGNvZGUgZm9yLgorCisgICBJZiB5b3Ugd2FudCB0byBfdXNlXyBhIGNyb3NzIGNvbXBpbGVyLCB0aGF0IGdlbmVyYXRlcyBjb2RlIGZvciBhCitwbGF0Zm9ybSBkaWZmZXJlbnQgZnJvbSB0aGUgYnVpbGQgcGxhdGZvcm0sIHlvdSBzaG91bGQgc3BlY2lmeSB0aGUKKyJob3N0IiBwbGF0Zm9ybSAoaS5lLiwgdGhhdCBvbiB3aGljaCB0aGUgZ2VuZXJhdGVkIHByb2dyYW1zIHdpbGwKK2V2ZW50dWFsbHkgYmUgcnVuKSB3aXRoIGAtLWhvc3Q9VFlQRScuCisKK1NoYXJpbmcgRGVmYXVsdHMKKz09PT09PT09PT09PT09PT0KKworSWYgeW91IHdhbnQgdG8gc2V0IGRlZmF1bHQgdmFsdWVzIGZvciBgY29uZmlndXJlJyBzY3JpcHRzIHRvIHNoYXJlLCB5b3UKK2NhbiBjcmVhdGUgYSBzaXRlIHNoZWxsIHNjcmlwdCBjYWxsZWQgYGNvbmZpZy5zaXRlJyB0aGF0IGdpdmVzIGRlZmF1bHQKK3ZhbHVlcyBmb3IgdmFyaWFibGVzIGxpa2UgYENDJywgYGNhY2hlX2ZpbGUnLCBhbmQgYHByZWZpeCcuCitgY29uZmlndXJlJyBsb29rcyBmb3IgYFBSRUZJWC9zaGFyZS9jb25maWcuc2l0ZScgaWYgaXQgZXhpc3RzLCB0aGVuCitgUFJFRklYL2V0Yy9jb25maWcuc2l0ZScgaWYgaXQgZXhpc3RzLiAgT3IsIHlvdSBjYW4gc2V0IHRoZQorYENPTkZJR19TSVRFJyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUgbG9jYXRpb24gb2YgdGhlIHNpdGUgc2NyaXB0LgorQSB3YXJuaW5nOiBub3QgYWxsIGBjb25maWd1cmUnIHNjcmlwdHMgbG9vayBmb3IgYSBzaXRlIHNjcmlwdC4KKworRGVmaW5pbmcgVmFyaWFibGVzCis9PT09PT09PT09PT09PT09PT0KKworVmFyaWFibGVzIG5vdCBkZWZpbmVkIGluIGEgc2l0ZSBzaGVsbCBzY3JpcHQgY2FuIGJlIHNldCBpbiB0aGUKK2Vudmlyb25tZW50IHBhc3NlZCB0byBgY29uZmlndXJlJy4gIEhvd2V2ZXIsIHNvbWUgcGFja2FnZXMgbWF5IHJ1bgorY29uZmlndXJlIGFnYWluIGR1cmluZyB0aGUgYnVpbGQsIGFuZCB0aGUgY3VzdG9taXplZCB2YWx1ZXMgb2YgdGhlc2UKK3ZhcmlhYmxlcyBtYXkgYmUgbG9zdC4gIEluIG9yZGVyIHRvIGF2b2lkIHRoaXMgcHJvYmxlbSwgeW91IHNob3VsZCBzZXQKK3RoZW0gaW4gdGhlIGBjb25maWd1cmUnIGNvbW1hbmQgbGluZSwgdXNpbmcgYFZBUj12YWx1ZScuICBGb3IgZXhhbXBsZToKKworICAgICAuL2NvbmZpZ3VyZSBDQz0vdXNyL2xvY2FsMi9iaW4vZ2NjCisKK2NhdXNlcyB0aGUgc3BlY2lmaWVkIGBnY2MnIHRvIGJlIHVzZWQgYXMgdGhlIEMgY29tcGlsZXIgKHVubGVzcyBpdCBpcworb3ZlcnJpZGRlbiBpbiB0aGUgc2l0ZSBzaGVsbCBzY3JpcHQpLgorCitVbmZvcnR1bmF0ZWx5LCB0aGlzIHRlY2huaXF1ZSBkb2VzIG5vdCB3b3JrIGZvciBgQ09ORklHX1NIRUxMJyBkdWUgdG8KK2FuIEF1dG9jb25mIGJ1Zy4gIFVudGlsIHRoZSBidWcgaXMgZml4ZWQgeW91IGNhbiB1c2UgdGhpcyB3b3JrYXJvdW5kOgorCisgICAgIENPTkZJR19TSEVMTD0vYmluL2Jhc2ggL2Jpbi9iYXNoIC4vY29uZmlndXJlIENPTkZJR19TSEVMTD0vYmluL2Jhc2gKKworYGNvbmZpZ3VyZScgSW52b2NhdGlvbgorPT09PT09PT09PT09PT09PT09PT09PQorCitgY29uZmlndXJlJyByZWNvZ25pemVzIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyB0byBjb250cm9sIGhvdyBpdCBvcGVyYXRlcy4KKworYC0taGVscCcKK2AtaCcKKyAgICAgUHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBvcHRpb25zIHRvIGBjb25maWd1cmUnLCBhbmQgZXhpdC4KKworYC0tdmVyc2lvbicKK2AtVicKKyAgICAgUHJpbnQgdGhlIHZlcnNpb24gb2YgQXV0b2NvbmYgdXNlZCB0byBnZW5lcmF0ZSB0aGUgYGNvbmZpZ3VyZScKKyAgICAgc2NyaXB0LCBhbmQgZXhpdC4KKworYC0tY2FjaGUtZmlsZT1GSUxFJworICAgICBFbmFibGUgdGhlIGNhY2hlOiB1c2UgYW5kIHNhdmUgdGhlIHJlc3VsdHMgb2YgdGhlIHRlc3RzIGluIEZJTEUsCisgICAgIHRyYWRpdGlvbmFsbHkgYGNvbmZpZy5jYWNoZScuICBGSUxFIGRlZmF1bHRzIHRvIGAvZGV2L251bGwnIHRvCisgICAgIGRpc2FibGUgY2FjaGluZy4KKworYC0tY29uZmlnLWNhY2hlJworYC1DJworICAgICBBbGlhcyBmb3IgYC0tY2FjaGUtZmlsZT1jb25maWcuY2FjaGUnLgorCitgLS1xdWlldCcKK2AtLXNpbGVudCcKK2AtcScKKyAgICAgRG8gbm90IHByaW50IG1lc3NhZ2VzIHNheWluZyB3aGljaCBjaGVja3MgYXJlIGJlaW5nIG1hZGUuICBUbworICAgICBzdXBwcmVzcyBhbGwgbm9ybWFsIG91dHB1dCwgcmVkaXJlY3QgaXQgdG8gYC9kZXYvbnVsbCcgKGFueSBlcnJvcgorICAgICBtZXNzYWdlcyB3aWxsIHN0aWxsIGJlIHNob3duKS4KKworYC0tc3JjZGlyPURJUicKKyAgICAgTG9vayBmb3IgdGhlIHBhY2thZ2UncyBzb3VyY2UgY29kZSBpbiBkaXJlY3RvcnkgRElSLiAgVXN1YWxseQorICAgICBgY29uZmlndXJlJyBjYW4gZGV0ZXJtaW5lIHRoYXQgZGlyZWN0b3J5IGF1dG9tYXRpY2FsbHkuCisKK2Bjb25maWd1cmUnIGFsc28gYWNjZXB0cyBzb21lIG90aGVyLCBub3Qgd2lkZWx5IHVzZWZ1bCwgb3B0aW9ucy4gIFJ1bgorYGNvbmZpZ3VyZSAtLWhlbHAnIGZvciBtb3JlIGRldGFpbHMuCisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9NYWtlZmlsZS5hbSBiL2xpYmdjcnlwdC0xLjQuNi9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWFlOTBlCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNTMgQEAKKyMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gcHJvZHVjZSBNYWtlZmlsZS5pbgorIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTksIDIwMDAsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyMKKyMgTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisKK0FDTE9DQUxfQU1GTEFHUyA9IC1JIG00CitBVVRPTUFLRV9PUFRJT05TID0gZGlzdC1iemlwMgorRElTVENIRUNLX0NPTkZJR1VSRV9GTEFHUyA9IC0tZW5hYmxlLXJhbmRvbS1kYWVtb24gXAorICAtLWVuYWJsZS1jaXBoZXJzPWFyY2ZvdXI6Ymxvd2Zpc2g6Y2FzdDU6ZGVzOmFlczp0d29maXNoOnNlcnBlbnQ6cmZjMjI2ODpzZWVkOmNhbWVsbGlhCisKK0RJU1RfU1VCRElSUyA9IG00IG1waSBjaXBoZXIgcmFuZG9tIHNyYyBkb2MgdGVzdHMKK1NVQkRJUlMgPSBtcGkgY2lwaGVyIHJhbmRvbSBzcmMgZG9jIHRlc3RzCitFWFRSQV9ESVNUID0gYXV0b2dlbi5zaCBSRUFETUUuU1ZOCitESVNUQ0xFQU5GSUxFUyA9IAorCisKKyMgQWRkIGFsbCB0aGUgZmlsZXMgbGlzdGVkIGluICJkaXN0ZmlsZXMiIGZpbGVzIHRvIHRoZSBkaXN0cmlidXRpb24sCisjIGFwcGx5IHZlcnNpb24gbnVtYmVyIHMgdG8gc29tZSBmaWxlcyBhbmQgY3JlYXRlIGEgVkVSU0lPTiBmaWxlIHdoaWNoCisjIHdlIG5lZWQgZm9yIHRoZSBQcmVyZXE6IHBhdGNoIGZpbGUgdHJpY2suIAorZGlzdC1ob29rOgorCUBzZXQgLWU7IFwKKwkgZm9yIGZpbGUgaW4gYGNkICQodG9wX3NyY2Rpcik7IFwKKwkgICAgICBmaW5kIG1waSAtdHlwZSBmIC1uYW1lIGRpc3RmaWxlc2A7IGRvIFwKKwkgICAgZGlyPWBkaXJuYW1lICQkZmlsZWAgOyAkKG1raW5zdGFsbGRpcnMpICQoZGlzdGRpcikvJCRkaXIgOyBcCisJICAgIGZvciBpIGluIGRpc3RmaWxlcyBgY2F0ICQodG9wX3NyY2RpcikvJCRmaWxlYCA7IGRvIFwKKwkJbG4gJCh0b3Bfc3JjZGlyKS8kJGRpci8kJGkgJChkaXN0ZGlyKS8kJGRpci8kJGkgMj4gL2Rldi9udWxsIFwKKwkJfHwgY3AgLXAgJCh0b3Bfc3JjZGlyKS8kJGRpci8kJGkgJChkaXN0ZGlyKS8kJGRpci8kJGk7IFwKKwkgICAgZG9uZSA7IFwKKwlkb25lCisJQHNldCAtZTsgXAorCWVjaG8gIiQoVkVSU0lPTikiID4gJChkaXN0ZGlyKS9WRVJTSU9OCisKK3N0b3dpbnN0YWxsOiAKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsIHByZWZpeD0vdXNyL2xvY2FsL3N0b3cvbGliZ2NyeXB0CisKKworCisKKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L01ha2VmaWxlLmluIGIvbGliZ2NyeXB0LTEuNC42L01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYTRjZWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSw3MTkgQEAKKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTAuMiBmcm9tIE1ha2VmaWxlLmFtLgorIyBAY29uZmlndXJlX2lucHV0QAorCisjIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKKyMgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCitAU0VUX01BS0VACisKKyMgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk5LCAyMDAwLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisjCisjIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK2FtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKK2luc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0CitpbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCitpbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX3RyaXBsZXQgPSBAYnVpbGRACitob3N0X3RyaXBsZXQgPSBAaG9zdEAKK3N1YmRpciA9IC4KK0RJU1RfQ09NTU9OID0gUkVBRE1FICQoYW1fX2NvbmZpZ3VyZV9kZXBzKSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gXAorCSQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHNyY2RpcikvY29uZmlnLmguaW4gXAorCSQodG9wX3NyY2RpcikvY29uZmlndXJlIEFVVEhPUlMgQ09QWUlORyBDT1BZSU5HLkxJQiBDaGFuZ2VMb2cgXAorCUlOU1RBTEwgTkVXUyBUSEFOS1MgVE9ETyBjb21waWxlIGNvbmZpZy5ndWVzcyBjb25maWcuc3ViIFwKKwlkZXBjb21wIGluc3RhbGwtc2ggbHRtYWluLnNoIG1pc3NpbmcgbWtpbnN0YWxsZGlycworQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAorYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvbTQvbGlidG9vbC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9ub2V4ZWNzdGFjay5tNCAkKHRvcF9zcmNkaXIpL200L29uY2Vvbmx5Lm00IFwKKwkkKHRvcF9zcmNkaXIpL200L3NvY2tsZW4ubTQgJCh0b3Bfc3JjZGlyKS9tNC9zeXNfc29ja2V0X2gubTQgXAorCSQodG9wX3NyY2RpcikvYWNpbmNsdWRlLm00ICQodG9wX3NyY2RpcikvY29uZmlndXJlLmFjCithbV9fY29uZmlndXJlX2RlcHMgPSAkKGFtX19hY2xvY2FsX200X2RlcHMpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykgXAorCSQoQUNMT0NBTF9NNCkKK2FtX19DT05GSUdfRElTVENMRUFOX0ZJTEVTID0gY29uZmlnLnN0YXR1cyBjb25maWcuY2FjaGUgY29uZmlnLmxvZyBcCisgY29uZmlndXJlLmxpbmVubyBjb25maWcuc3RhdHVzLmxpbmVubworbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycworQ09ORklHX0hFQURFUiA9IGNvbmZpZy5oCitDT05GSUdfQ0xFQU5fRklMRVMgPQorU09VUkNFUyA9CitESVNUX1NPVVJDRVMgPQorUkVDVVJTSVZFX1RBUkdFVFMgPSBhbGwtcmVjdXJzaXZlIGNoZWNrLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlIFwKKwlodG1sLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIFwKKwlpbnN0YWxsLWR2aS1yZWN1cnNpdmUgaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBcCisJaW5zdGFsbC1odG1sLXJlY3Vyc2l2ZSBpbnN0YWxsLWluZm8tcmVjdXJzaXZlIFwKKwlpbnN0YWxsLXBkZi1yZWN1cnNpdmUgaW5zdGFsbC1wcy1yZWN1cnNpdmUgaW5zdGFsbC1yZWN1cnNpdmUgXAorCWluc3RhbGxjaGVjay1yZWN1cnNpdmUgaW5zdGFsbGRpcnMtcmVjdXJzaXZlIHBkZi1yZWN1cnNpdmUgXAorCXBzLXJlY3Vyc2l2ZSB1bmluc3RhbGwtcmVjdXJzaXZlCitSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUyA9IG1vc3RseWNsZWFuLXJlY3Vyc2l2ZSBjbGVhbi1yZWN1cnNpdmUJXAorICBkaXN0Y2xlYW4tcmVjdXJzaXZlIG1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlCitFVEFHUyA9IGV0YWdzCitDVEFHUyA9IGN0YWdzCitESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQorZGlzdGRpciA9ICQoUEFDS0FHRSktJChWRVJTSU9OKQordG9wX2Rpc3RkaXIgPSAkKGRpc3RkaXIpCithbV9fcmVtb3ZlX2Rpc3RkaXIgPSBcCisgIHsgdGVzdCAhIC1kICQoZGlzdGRpcikgXAorICAgIHx8IHsgZmluZCAkKGRpc3RkaXIpIC10eXBlIGQgISAtcGVybSAtMjAwIC1leGVjIGNobW9kIHUrdyB7fSAnOycgXAorICAgICAgICAgJiYgcm0gLWZyICQoZGlzdGRpcik7IH07IH0KK0RJU1RfQVJDSElWRVMgPSAkKGRpc3RkaXIpLnRhci5neiAkKGRpc3RkaXIpLnRhci5iejIKK0daSVBfRU5WID0gLS1iZXN0CitkaXN0dW5pbnN0YWxsY2hlY2tfbGlzdGZpbGVzID0gZmluZCAuIC10eXBlIGYgLXByaW50CitkaXN0Y2xlYW5jaGVja19saXN0ZmlsZXMgPSBmaW5kIC4gLXR5cGUgZiAtcHJpbnQKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FNVEFSID0gQEFNVEFSQAorQVIgPSBAQVJACitBUyA9IEBBU0AKK0FVVE9DT05GID0gQEFVVE9DT05GQAorQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAorQVVUT01BS0UgPSBAQVVUT01BS0VACitBV0sgPSBAQVdLQAorQlVJTERfRklMRVZFUlNJT04gPSBAQlVJTERfRklMRVZFUlNJT05ACitCVUlMRF9SRVZJU0lPTiA9IEBCVUlMRF9SRVZJU0lPTkAKK0JVSUxEX1RJTUVTVEFNUCA9IEBCVUlMRF9USU1FU1RBTVBACitDQyA9IEBDQ0AKK0NDQVMgPSBAQ0NBU0AKK0NDQVNERVBNT0RFID0gQENDQVNERVBNT0RFQAorQ0NBU0ZMQUdTID0gQENDQVNGTEFHU0AKK0NDREVQTU9ERSA9IEBDQ0RFUE1PREVACitDRkxBR1MgPSBAQ0ZMQUdTQAorQ1BQID0gQENQUEAKK0NQUEZMQUdTID0gQENQUEZMQUdTQAorQ1hYID0gQENYWEAKK0NYWENQUCA9IEBDWFhDUFBACitDWFhERVBNT0RFID0gQENYWERFUE1PREVACitDWFhGTEFHUyA9IEBDWFhGTEFHU0AKK0NZR1BBVEhfVyA9IEBDWUdQQVRIX1dACitERUZTID0gQERFRlNACitERVBESVIgPSBAREVQRElSQAorRExMVE9PTCA9IEBETExUT09MQAorRExfTElCUyA9IEBETF9MSUJTQAorRUNITyA9IEBFQ0hPQAorRUNIT19DID0gQEVDSE9fQ0AKK0VDSE9fTiA9IEBFQ0hPX05ACitFQ0hPX1QgPSBARUNIT19UQAorRUdSRVAgPSBARUdSRVBACitFWEVFWFQgPSBARVhFRVhUQAorRjc3ID0gQEY3N0AKK0ZBTExCQUNLX1NPQ0tMRU5fVCA9IEBGQUxMQkFDS19TT0NLTEVOX1RACitGRkxBR1MgPSBARkZMQUdTQAorR0NSWVBUX0NJUEhFUlMgPSBAR0NSWVBUX0NJUEhFUlNACitHQ1JZUFRfRElHRVNUUyA9IEBHQ1JZUFRfRElHRVNUU0AKK0dDUllQVF9QVUJLRVlfQ0lQSEVSUyA9IEBHQ1JZUFRfUFVCS0VZX0NJUEhFUlNACitHQ1JZUFRfUkFORE9NID0gQEdDUllQVF9SQU5ET01ACitHUEdfRVJST1JfQ0ZMQUdTID0gQEdQR19FUlJPUl9DRkxBR1NACitHUEdfRVJST1JfQ09ORklHID0gQEdQR19FUlJPUl9DT05GSUdACitHUEdfRVJST1JfTElCUyA9IEBHUEdfRVJST1JfTElCU0AKK0dSRVAgPSBAR1JFUEAKK0lOU1RBTEwgPSBASU5TVEFMTEAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitJTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAorSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACitJTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAorTERGTEFHUyA9IEBMREZMQUdTQAorTElCR0NSWVBUX0NJUEhFUlMgPSBATElCR0NSWVBUX0NJUEhFUlNACitMSUJHQ1JZUFRfQ09ORklHX0FQSV9WRVJTSU9OID0gQExJQkdDUllQVF9DT05GSUdfQVBJX1ZFUlNJT05ACitMSUJHQ1JZUFRfQ09ORklHX0NGTEFHUyA9IEBMSUJHQ1JZUFRfQ09ORklHX0NGTEFHU0AKK0xJQkdDUllQVF9DT05GSUdfTElCUyA9IEBMSUJHQ1JZUFRfQ09ORklHX0xJQlNACitMSUJHQ1JZUFRfRElHRVNUUyA9IEBMSUJHQ1JZUFRfRElHRVNUU0AKK0xJQkdDUllQVF9MVF9BR0UgPSBATElCR0NSWVBUX0xUX0FHRUAKK0xJQkdDUllQVF9MVF9DVVJSRU5UID0gQExJQkdDUllQVF9MVF9DVVJSRU5UQAorTElCR0NSWVBUX0xUX1JFVklTSU9OID0gQExJQkdDUllQVF9MVF9SRVZJU0lPTkAKK0xJQkdDUllQVF9QVUJLRVlfQ0lQSEVSUyA9IEBMSUJHQ1JZUFRfUFVCS0VZX0NJUEhFUlNACitMSUJHQ1JZUFRfVEhSRUFEX01PRFVMRVMgPSBATElCR0NSWVBUX1RIUkVBRF9NT0RVTEVTQAorTElCT0JKUyA9IEBMSUJPQkpTQAorTElCUyA9IEBMSUJTQAorTElCVE9PTCA9IEBMSUJUT09MQAorTE5fUyA9IEBMTl9TQAorTFRMSUJPQkpTID0gQExUTElCT0JKU0AKK01BSU5UID0gQE1BSU5UQAorTUFLRUlORk8gPSBATUFLRUlORk9ACitNS0RJUl9QID0gQE1LRElSX1BACitNUElfU0ZMQUdTID0gQE1QSV9TRkxBR1NACitOT0VYRUNTVEFDS19GTEFHUyA9IEBOT0VYRUNTVEFDS19GTEFHU0AKK09CSkRVTVAgPSBAT0JKRFVNUEAKK09CSkVYVCA9IEBPQkpFWFRACitQQUNLQUdFID0gQFBBQ0tBR0VACitQQUNLQUdFX0JVR1JFUE9SVCA9IEBQQUNLQUdFX0JVR1JFUE9SVEAKK1BBQ0tBR0VfTkFNRSA9IEBQQUNLQUdFX05BTUVACitQQUNLQUdFX1NUUklORyA9IEBQQUNLQUdFX1NUUklOR0AKK1BBQ0tBR0VfVEFSTkFNRSA9IEBQQUNLQUdFX1RBUk5BTUVACitQQUNLQUdFX1VSTCA9IEBQQUNLQUdFX1VSTEAKK1BBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACitQQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKK1BUSF9DRkxBR1MgPSBAUFRIX0NGTEFHU0AKK1BUSF9DT05GSUcgPSBAUFRIX0NPTkZJR0AKK1BUSF9MSUJTID0gQFBUSF9MSUJTQAorUkFOTElCID0gQFJBTkxJQkAKK1JDID0gQFJDQAorU0VUX01BS0UgPSBAU0VUX01BS0VACitTSEVMTCA9IEBTSEVMTEAKK1NUUklQID0gQFNUUklQQAorU1lTX1NPQ0tFVF9IID0gQFNZU19TT0NLRVRfSEAKK1ZFUlNJT04gPSBAVkVSU0lPTkAKK2Fic19idWlsZGRpciA9IEBhYnNfYnVpbGRkaXJACithYnNfc3JjZGlyID0gQGFic19zcmNkaXJACithYnNfdG9wX2J1aWxkZGlyID0gQGFic190b3BfYnVpbGRkaXJACithYnNfdG9wX3NyY2RpciA9IEBhYnNfdG9wX3NyY2RpckAKK2FjX2N0X0NDID0gQGFjX2N0X0NDQAorYWNfY3RfQ1hYID0gQGFjX2N0X0NYWEAKK2FjX2N0X0Y3NyA9IEBhY19jdF9GNzdACithbV9faW5jbHVkZSA9IEBhbV9faW5jbHVkZUAKK2FtX19sZWFkaW5nX2RvdCA9IEBhbV9fbGVhZGluZ19kb3RACithbV9fcXVvdGUgPSBAYW1fX3F1b3RlQAorYW1fX3RhciA9IEBhbV9fdGFyQAorYW1fX3VudGFyID0gQGFtX191bnRhckAKK2JpbmRpciA9IEBiaW5kaXJACitidWlsZCA9IEBidWlsZEAKK2J1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAorYnVpbGRfY3B1ID0gQGJ1aWxkX2NwdUAKK2J1aWxkX29zID0gQGJ1aWxkX29zQAorYnVpbGRfdmVuZG9yID0gQGJ1aWxkX3ZlbmRvckAKK2J1aWxkZGlyID0gQGJ1aWxkZGlyQAorZGF0YWRpciA9IEBkYXRhZGlyQAorZGF0YXJvb3RkaXIgPSBAZGF0YXJvb3RkaXJACitkb2NkaXIgPSBAZG9jZGlyQAorZHZpZGlyID0gQGR2aWRpckAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAoraG9zdCA9IEBob3N0QAoraG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAoraG9zdF9jcHUgPSBAaG9zdF9jcHVACitob3N0X29zID0gQGhvc3Rfb3NACitob3N0X3ZlbmRvciA9IEBob3N0X3ZlbmRvckAKK2h0bWxkaXIgPSBAaHRtbGRpckAKK2luY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKK2luZm9kaXIgPSBAaW5mb2RpckAKK2luc3RhbGxfc2ggPSBAaW5zdGFsbF9zaEAKK2xpYmRpciA9IEBsaWJkaXJACitsaWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACitsb2NhbGVkaXIgPSBAbG9jYWxlZGlyQAorbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAorbWFuZGlyID0gQG1hbmRpckAKK21rZGlyX3AgPSBAbWtkaXJfcEAKK29sZGluY2x1ZGVkaXIgPSBAb2xkaW5jbHVkZWRpckAKK3BkZmRpciA9IEBwZGZkaXJACitwcmVmaXggPSBAcHJlZml4QAorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAorcHNkaXIgPSBAcHNkaXJACitzYmluZGlyID0gQHNiaW5kaXJACitzaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKK3NyY2RpciA9IEBzcmNkaXJACitzeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAordG9wX2J1aWxkX3ByZWZpeCA9IEB0b3BfYnVpbGRfcHJlZml4QAordG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK0FDTE9DQUxfQU1GTEFHUyA9IC1JIG00CitBVVRPTUFLRV9PUFRJT05TID0gZGlzdC1iemlwMgorRElTVENIRUNLX0NPTkZJR1VSRV9GTEFHUyA9IC0tZW5hYmxlLXJhbmRvbS1kYWVtb24gXAorICAtLWVuYWJsZS1jaXBoZXJzPWFyY2ZvdXI6Ymxvd2Zpc2g6Y2FzdDU6ZGVzOmFlczp0d29maXNoOnNlcnBlbnQ6cmZjMjI2ODpzZWVkOmNhbWVsbGlhCisKK0RJU1RfU1VCRElSUyA9IG00IG1waSBjaXBoZXIgcmFuZG9tIHNyYyBkb2MgdGVzdHMKK1NVQkRJUlMgPSBtcGkgY2lwaGVyIHJhbmRvbSBzcmMgZG9jIHRlc3RzCitFWFRSQV9ESVNUID0gYXV0b2dlbi5zaCBSRUFETUUuU1ZOCitESVNUQ0xFQU5GSUxFUyA9IAorYWxsOiBjb25maWcuaAorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFsbC1yZWN1cnNpdmUKKworLlNVRkZJWEVTOgorYW0tLXJlZnJlc2g6CisJQDoKKyQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCUBmb3IgZGVwIGluICQ/OyBkbyBcCisJICBjYXNlICckKGFtX19jb25maWd1cmVfZGVwcyknIGluIFwKKwkgICAgKiQkZGVwKikgXAorCSAgICAgIGVjaG8gJyBjZCAkKHNyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUgJzsgXAorCSAgICAgIGNkICQoc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWdudSAgXAorCQkmJiBleGl0IDA7IFwKKwkgICAgICBleGl0IDE7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZ251ICBNYWtlZmlsZSc7IFwKKwljZCAkKHRvcF9zcmNkaXIpICYmIFwKKwkgICQoQVVUT01BS0UpIC0tZ251ICBNYWtlZmlsZQorLlBSRUNJT1VTOiBNYWtlZmlsZQorTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCUBjYXNlICckPycgaW4gXAorCSAgKmNvbmZpZy5zdGF0dXMqKSBcCisJICAgIGVjaG8gJyAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMnOyBcCisJICAgICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1czs7IFwKKwkgICopIFwKKwkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpJzsgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKKwllc2FjOworCiskKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKKwkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCisKKyQodG9wX3NyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCWNkICQoc3JjZGlyKSAmJiAkKEFVVE9DT05GKQorJChBQ0xPQ0FMX000KTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19hY2xvY2FsX200X2RlcHMpCisJY2QgJChzcmNkaXIpICYmICQoQUNMT0NBTCkgJChBQ0xPQ0FMX0FNRkxBR1MpCisKK2NvbmZpZy5oOiBzdGFtcC1oMQorCUBpZiB0ZXN0ICEgLWYgJEA7IHRoZW4gXAorCSAgcm0gLWYgc3RhbXAtaDE7IFwKKwkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHN0YW1wLWgxOyBcCisJZWxzZSA6OyBmaQorCitzdGFtcC1oMTogJChzcmNkaXIpL2NvbmZpZy5oLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJQHJtIC1mIHN0YW1wLWgxCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyBjb25maWcuaAorJChzcmNkaXIpL2NvbmZpZy5oLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2NvbmZpZ3VyZV9kZXBzKSAKKwljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT0hFQURFUikKKwlybSAtZiBzdGFtcC1oMQorCXRvdWNoICRACisKK2Rpc3RjbGVhbi1oZHI6CisJLXJtIC1mIGNvbmZpZy5oIHN0YW1wLWgxCisKK21vc3RseWNsZWFuLWxpYnRvb2w6CisJLXJtIC1mICoubG8KKworY2xlYW4tbGlidG9vbDoKKwktcm0gLXJmIC5saWJzIF9saWJzCisKK2Rpc3RjbGVhbi1saWJ0b29sOgorCS1ybSAtZiBsaWJ0b29sIGNvbmZpZy5sdAorCisjIFRoaXMgZGlyZWN0b3J5J3Mgc3ViZGlyZWN0b3JpZXMgYXJlIG1vc3RseSBpbmRlcGVuZGVudDsgeW91IGNhbiBjZAorIyBpbnRvIHRoZW0gYW5kIHJ1biBgbWFrZScgd2l0aG91dCBnb2luZyB0aHJvdWdoIHRoaXMgTWFrZWZpbGUuCisjIFRvIGNoYW5nZSB0aGUgdmFsdWVzIG9mIGBtYWtlJyB2YXJpYWJsZXM6IGluc3RlYWQgb2YgZWRpdGluZyBNYWtlZmlsZXMsCisjICgxKSBpZiB0aGUgdmFyaWFibGUgaXMgc2V0IGluIGBjb25maWcuc3RhdHVzJywgZWRpdCBgY29uZmlnLnN0YXR1cycKKyMgICAgICh3aGljaCB3aWxsIGNhdXNlIHRoZSBNYWtlZmlsZXMgdG8gYmUgcmVnZW5lcmF0ZWQgd2hlbiB5b3UgcnVuIGBtYWtlJyk7CisjICgyKSBvdGhlcndpc2UsIHBhc3MgdGhlIGRlc2lyZWQgdmFsdWVzIG9uIHRoZSBgbWFrZScgY29tbWFuZCBsaW5lLgorJChSRUNVUlNJVkVfVEFSR0VUUyk6CisJQGZhaWxjb209J2V4aXQgMSc7IFwKKwlmb3IgZiBpbiB4ICQkTUFLRUZMQUdTOyBkbyBcCisJICBjYXNlICQkZiBpbiBcCisJICAgICo9KiB8IC0tWyFrXSopOzsgXAorCSAgICAqayopIGZhaWxjb209J2ZhaWw9eWVzJzs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZG90X3NlZW49bm87IFwKKwl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCisJbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAorCSAgICBkb3Rfc2Vlbj15ZXM7IFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKKwkgIGVsc2UgXAorCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAorCSAgZmk7IFwKKwkgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAorCSAgfHwgZXZhbCAkJGZhaWxjb207IFwKKwlkb25lOyBcCisJaWYgdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iOyB0aGVuIFwKKwkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICIkJHRhcmdldC1hbSIgfHwgZXhpdCAxOyBcCisJZmk7IHRlc3QgLXogIiQkZmFpbCIKKworJChSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUyk6CisJQGZhaWxjb209J2V4aXQgMSc7IFwKKwlmb3IgZiBpbiB4ICQkTUFLRUZMQUdTOyBkbyBcCisJICBjYXNlICQkZiBpbiBcCisJICAgICo9KiB8IC0tWyFrXSopOzsgXAorCSAgICAqayopIGZhaWxjb209J2ZhaWw9eWVzJzs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZG90X3NlZW49bm87IFwKKwljYXNlICIkQCIgaW4gXAorCSAgZGlzdGNsZWFuLSogfCBtYWludGFpbmVyLWNsZWFuLSopIGxpc3Q9JyQoRElTVF9TVUJESVJTKScgOzsgXAorCSAgKikgbGlzdD0nJChTVUJESVJTKScgOzsgXAorCWVzYWM7IFwKKwlyZXY9Jyc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gOjsgZWxzZSBcCisJICAgIHJldj0iJCRzdWJkaXIgJCRyZXYiOyBcCisJICBmaTsgXAorCWRvbmU7IFwKKwlyZXY9IiQkcmV2IC4iOyBcCisJdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAorCWZvciBzdWJkaXIgaW4gJCRyZXY7IGRvIFwKKwkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCisJICBlbHNlIFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKKwkgIGZpOyBcCisJICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKKwkgIHx8IGV2YWwgJCRmYWlsY29tOyBcCisJZG9uZSAmJiB0ZXN0IC16ICIkJGZhaWwiCit0YWdzLXJlY3Vyc2l2ZToKKwlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIHRlc3QgIiQkc3ViZGlyIiA9IC4gfHwgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRhZ3MpOyBcCisJZG9uZQorY3RhZ3MtcmVjdXJzaXZlOgorCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgdGVzdCAiJCRzdWJkaXIiID0gLiB8fCAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY3RhZ3MpOyBcCisJZG9uZQorCitJRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkgJChUQUdTX0ZJTEVTKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCW1raWQgLWZJRCAkJHVuaXF1ZQordGFnczogVEFHUworCitUQUdTOiB0YWdzLXJlY3Vyc2l2ZSAkKEhFQURFUlMpICQoU09VUkNFUykgY29uZmlnLmguaW4gJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwl0YWdzPTsgXAorCWhlcmU9YHB3ZGA7IFwKKwlpZiAoJChFVEFHUykgLS1ldGFncy1pbmNsdWRlIC0tdmVyc2lvbikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKKwkgIGluY2x1ZGVfb3B0aW9uPS0tZXRhZ3MtaW5jbHVkZTsgXAorCSAgZW1wdHlfZml4PS47IFwKKwllbHNlIFwKKwkgIGluY2x1ZGVfb3B0aW9uPS0taW5jbHVkZTsgXAorCSAgZW1wdHlfZml4PTsgXAorCWZpOyBcCisJbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAorCSAgICB0ZXN0ICEgLWYgJCRzdWJkaXIvVEFHUyB8fCBcCisJICAgICAgdGFncz0iJCR0YWdzICQkaW5jbHVkZV9vcHRpb249JCRoZXJlLyQkc3ViZGlyL1RBR1MiOyBcCisJICBmaTsgXAorCWRvbmU7IFwKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgY29uZmlnLmguaW4gJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCR0YWdzJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAorCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAorCSAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAorCSAgICAkJHRhZ3MgJCR1bmlxdWU7IFwKKwlmaQorY3RhZ3M6IENUQUdTCitDVEFHUzogY3RhZ3MtcmVjdXJzaXZlICQoSEVBREVSUykgJChTT1VSQ0VTKSBjb25maWcuaC5pbiAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCXRhZ3M9OyBcCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpIGNvbmZpZy5oLmluICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCisJICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCisJdGVzdCAteiAiJChDVEFHU19BUkdTKSQkdGFncyQkdW5pcXVlIiBcCisJICB8fCAkKENUQUdTKSAkKENUQUdTRkxBR1MpICQoQU1fQ1RBR1NGTEFHUykgJChDVEFHU19BUkdTKSBcCisJICAgICAkJHRhZ3MgJCR1bmlxdWUKKworR1RBR1M6CisJaGVyZT1gJChhbV9fY2QpICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKKwkgICYmIGNkICQodG9wX3NyY2RpcikgXAorCSAgJiYgZ3RhZ3MgLWkgJChHVEFHU19BUkdTKSAkJGhlcmUKKworZGlzdGNsZWFuLXRhZ3M6CisJLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRIIHRhZ3MKKworZGlzdGRpcjogJChESVNURklMRVMpCisJJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCisJdGVzdCAtZCAkKGRpc3RkaXIpIHx8IG1rZGlyICQoZGlzdGRpcikKKwlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJdG9wc3JjZGlyc3RyaXA9YGVjaG8gIiQodG9wX3NyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCWxpc3Q9JyQoRElTVEZJTEVTKSc7IFwKKwkgIGRpc3RfZmlsZXM9YGZvciBmaWxlIGluICQkbGlzdDsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBcCisJICBzZWQgLWUgInN8XiQkc3JjZGlyc3RyaXAvfHw7dCIgXAorCSAgICAgIC1lICJzfF4kJHRvcHNyY2RpcnN0cmlwL3wkKHRvcF9idWlsZGRpcikvfDt0ImA7IFwKKwljYXNlICQkZGlzdF9maWxlcyBpbiBcCisJICAqLyopICQoTUtESVJfUCkgYGVjaG8gIiQkZGlzdF9maWxlcyIgfCBcCisJCQkgICBzZWQgJy9cLy8hZDtzfF58JChkaXN0ZGlyKS98O3MsL1teL10qJCQsLCcgfCBcCisJCQkgICBzb3J0IC11YCA7OyBcCisJZXNhYzsgXAorCWZvciBmaWxlIGluICQkZGlzdF9maWxlczsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJGZpbGUgfHwgdGVzdCAtZCAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAorCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKKwkgICAgZGlyPWBlY2hvICIvJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKKwkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCisJICAgICAgY3AgLXBSICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKSQkZGlyIHx8IGV4aXQgMTsgXAorCSAgICBmaTsgXAorCSAgICBjcCAtcFIgJCRkLyQkZmlsZSAkKGRpc3RkaXIpJCRkaXIgfHwgZXhpdCAxOyBcCisJICBlbHNlIFwKKwkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorCWxpc3Q9JyQoRElTVF9TVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAorCSAgICB0ZXN0IC1kICIkKGRpc3RkaXIpLyQkc3ViZGlyIiBcCisJICAgIHx8ICQoTUtESVJfUCkgIiQoZGlzdGRpcikvJCRzdWJkaXIiIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICAgIGRpc3RkaXI9YCQoYW1fX2NkKSAkKGRpc3RkaXIpICYmIHB3ZGA7IFwKKwkgICAgdG9wX2Rpc3RkaXI9YCQoYW1fX2NkKSAkKHRvcF9kaXN0ZGlyKSAmJiBwd2RgOyBcCisJICAgIChjZCAkJHN1YmRpciAmJiBcCisJICAgICAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgXAorCSAgICAgICAgdG9wX2Rpc3RkaXI9IiQkdG9wX2Rpc3RkaXIiIFwKKwkgICAgICAgIGRpc3RkaXI9IiQkZGlzdGRpci8kJHN1YmRpciIgXAorCQlhbV9fcmVtb3ZlX2Rpc3RkaXI9OiBcCisJCWFtX19za2lwX2xlbmd0aF9jaGVjaz06IFwKKwkgICAgICAgIGRpc3RkaXIpIFwKKwkgICAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIFwKKwkgIHRvcF9kaXN0ZGlyPSIkKHRvcF9kaXN0ZGlyKSIgZGlzdGRpcj0iJChkaXN0ZGlyKSIgXAorCSAgZGlzdC1ob29rCisJLWZpbmQgJChkaXN0ZGlyKSAtdHlwZSBkICEgLXBlcm0gLTc3NyAtZXhlYyBjaG1vZCBhK3J3eCB7fSBcOyAtbyBcCisJICAhIC10eXBlIGQgISAtcGVybSAtNDQ0IC1saW5rcyAxIC1leGVjIGNobW9kIGErciB7fSBcOyAtbyBcCisJICAhIC10eXBlIGQgISAtcGVybSAtNDAwIC1leGVjIGNobW9kIGErciB7fSBcOyAtbyBcCisJICAhIC10eXBlIGQgISAtcGVybSAtNDQ0IC1leGVjICQoaW5zdGFsbF9zaCkgLWMgLW0gYStyIHt9IHt9IFw7IFwKKwl8fCBjaG1vZCAtUiBhK3IgJChkaXN0ZGlyKQorZGlzdC1nemlwOiBkaXN0ZGlyCisJdGFyZGlyPSQoZGlzdGRpcikgJiYgJChhbV9fdGFyKSB8IEdaSVA9JChHWklQX0VOVikgZ3ppcCAtYyA+JChkaXN0ZGlyKS50YXIuZ3oKKwkkKGFtX19yZW1vdmVfZGlzdGRpcikKK2Rpc3QtYnppcDI6IGRpc3RkaXIKKwl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgYnppcDIgLTkgLWMgPiQoZGlzdGRpcikudGFyLmJ6MgorCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQorCitkaXN0LWx6bWE6IGRpc3RkaXIKKwl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgbHptYSAtOSAtYyA+JChkaXN0ZGlyKS50YXIubHptYQorCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQorCitkaXN0LXRhclo6IGRpc3RkaXIKKwl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgY29tcHJlc3MgLWMgPiQoZGlzdGRpcikudGFyLloKKwkkKGFtX19yZW1vdmVfZGlzdGRpcikKKworZGlzdC1zaGFyOiBkaXN0ZGlyCisJc2hhciAkKGRpc3RkaXIpIHwgR1pJUD0kKEdaSVBfRU5WKSBnemlwIC1jID4kKGRpc3RkaXIpLnNoYXIuZ3oKKwkkKGFtX19yZW1vdmVfZGlzdGRpcikKKworZGlzdC16aXA6IGRpc3RkaXIKKwktcm0gLWYgJChkaXN0ZGlyKS56aXAKKwl6aXAgLXJxICQoZGlzdGRpcikuemlwICQoZGlzdGRpcikKKwkkKGFtX19yZW1vdmVfZGlzdGRpcikKKworZGlzdCBkaXN0LWFsbDogZGlzdGRpcgorCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCBHWklQPSQoR1pJUF9FTlYpIGd6aXAgLWMgPiQoZGlzdGRpcikudGFyLmd6CisJdGFyZGlyPSQoZGlzdGRpcikgJiYgJChhbV9fdGFyKSB8IGJ6aXAyIC05IC1jID4kKGRpc3RkaXIpLnRhci5iejIKKwkkKGFtX19yZW1vdmVfZGlzdGRpcikKKworIyBUaGlzIHRhcmdldCB1bnRhcnMgdGhlIGRpc3QgZmlsZSBhbmQgdHJpZXMgYSBWUEFUSCBjb25maWd1cmF0aW9uLiAgVGhlbgorIyBpdCBndWFyYW50ZWVzIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBpcyBzZWxmLWNvbnRhaW5lZCBieSBtYWtpbmcgYW5vdGhlcgorIyB0YXJmaWxlLgorZGlzdGNoZWNrOiBkaXN0CisJY2FzZSAnJChESVNUX0FSQ0hJVkVTKScgaW4gXAorCSoudGFyLmd6KikgXAorCSAgR1pJUD0kKEdaSVBfRU5WKSBndW56aXAgLWMgJChkaXN0ZGlyKS50YXIuZ3ogfCAkKGFtX191bnRhcikgOztcCisJKi50YXIuYnoyKikgXAorCSAgYnVuemlwMiAtYyAkKGRpc3RkaXIpLnRhci5iejIgfCAkKGFtX191bnRhcikgOztcCisJKi50YXIubHptYSopIFwKKwkgIHVubHptYSAtYyAkKGRpc3RkaXIpLnRhci5sem1hIHwgJChhbV9fdW50YXIpIDs7XAorCSoudGFyLloqKSBcCisJICB1bmNvbXByZXNzIC1jICQoZGlzdGRpcikudGFyLlogfCAkKGFtX191bnRhcikgOztcCisJKi5zaGFyLmd6KikgXAorCSAgR1pJUD0kKEdaSVBfRU5WKSBndW56aXAgLWMgJChkaXN0ZGlyKS5zaGFyLmd6IHwgdW5zaGFyIDs7XAorCSouemlwKikgXAorCSAgdW56aXAgJChkaXN0ZGlyKS56aXAgOztcCisJZXNhYworCWNobW9kIC1SIGEtdyAkKGRpc3RkaXIpOyBjaG1vZCBhK3cgJChkaXN0ZGlyKQorCW1rZGlyICQoZGlzdGRpcikvX2J1aWxkCisJbWtkaXIgJChkaXN0ZGlyKS9faW5zdAorCWNobW9kIGEtdyAkKGRpc3RkaXIpCisJZGNfaW5zdGFsbF9iYXNlPWAkKGFtX19jZCkgJChkaXN0ZGlyKS9faW5zdCAmJiBwd2QgfCBzZWQgLWUgJ3MsXlteOlxcL106W1xcL10sLywnYCBcCisJICAmJiBkY19kZXN0ZGlyPSIkJHtUTVBESVItL3RtcH0vYW0tZGMtJCQkJC8iIFwKKwkgICYmIGNkICQoZGlzdGRpcikvX2J1aWxkIFwKKwkgICYmIC4uL2NvbmZpZ3VyZSAtLXNyY2Rpcj0uLiAtLXByZWZpeD0iJCRkY19pbnN0YWxsX2Jhc2UiIFwKKwkgICAgJChESVNUQ0hFQ0tfQ09ORklHVVJFX0ZMQUdTKSBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkdmkgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY2hlY2sgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbCBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsY2hlY2sgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdW5pbnN0YWxsIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3R1bmluc3RhbGxjaGVja19kaXI9IiQkZGNfaW5zdGFsbF9iYXNlIiBcCisJICAgICAgICBkaXN0dW5pbnN0YWxsY2hlY2sgXAorCSAgJiYgY2htb2QgLVIgYS13ICIkJGRjX2luc3RhbGxfYmFzZSIgXAorCSAgJiYgKHsgXAorCSAgICAgICAoY2QgLi4vLi4gJiYgdW1hc2sgMDc3ICYmIG1rZGlyICIkJGRjX2Rlc3RkaXIiKSBcCisJICAgICAgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIERFU1RESVI9IiQkZGNfZGVzdGRpciIgaW5zdGFsbCBcCisJICAgICAgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIERFU1RESVI9IiQkZGNfZGVzdGRpciIgdW5pbnN0YWxsIFwKKwkgICAgICAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgREVTVERJUj0iJCRkY19kZXN0ZGlyIiBcCisJICAgICAgICAgICAgZGlzdHVuaW5zdGFsbGNoZWNrX2Rpcj0iJCRkY19kZXN0ZGlyIiBkaXN0dW5pbnN0YWxsY2hlY2s7IFwKKwkgICAgICB9IHx8IHsgcm0gLXJmICIkJGRjX2Rlc3RkaXIiOyBleGl0IDE7IH0pIFwKKwkgICYmIHJtIC1yZiAiJCRkY19kZXN0ZGlyIiBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkaXN0IFwKKwkgICYmIHJtIC1yZiAkKERJU1RfQVJDSElWRVMpIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3RjbGVhbmNoZWNrCisJJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCisJQChlY2hvICIkKGRpc3RkaXIpIGFyY2hpdmVzIHJlYWR5IGZvciBkaXN0cmlidXRpb246ICI7IFwKKwkgIGxpc3Q9JyQoRElTVF9BUkNISVZFUyknOyBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRpOyBkb25lKSB8IFwKKwkgIHNlZCAtZSAxaCAtZSAxcy8uLz0vZyAtZSAxcCAtZSAxeCAtZSAnJCRwJyAtZSAnJCR4JworZGlzdHVuaW5zdGFsbGNoZWNrOgorCUBjZCAkKGRpc3R1bmluc3RhbGxjaGVja19kaXIpIFwKKwkmJiB0ZXN0IGAkKGRpc3R1bmluc3RhbGxjaGVja19saXN0ZmlsZXMpIHwgd2MgLWxgIC1sZSAxIFwKKwkgICB8fCB7IGVjaG8gIkVSUk9SOiBmaWxlcyBsZWZ0IGFmdGVyIHVuaW5zdGFsbDoiIDsgXAorCSAgICAgICAgaWYgdGVzdCAtbiAiJChERVNURElSKSI7IHRoZW4gXAorCSAgICAgICAgICBlY2hvICIgIChjaGVjayBERVNURElSIHN1cHBvcnQpIjsgXAorCSAgICAgICAgZmkgOyBcCisJICAgICAgICAkKGRpc3R1bmluc3RhbGxjaGVja19saXN0ZmlsZXMpIDsgXAorCSAgICAgICAgZXhpdCAxOyB9ID4mMgorZGlzdGNsZWFuY2hlY2s6IGRpc3RjbGVhbgorCUBpZiB0ZXN0ICckKHNyY2RpciknID0gLiA7IHRoZW4gXAorCSAgZWNobyAiRVJST1I6IGRpc3RjbGVhbmNoZWNrIGNhbiBvbmx5IHJ1biBmcm9tIGEgVlBBVEggYnVpbGQiIDsgXAorCSAgZXhpdCAxIDsgXAorCWZpCisJQHRlc3QgYCQoZGlzdGNsZWFuY2hlY2tfbGlzdGZpbGVzKSB8IHdjIC1sYCAtZXEgMCBcCisJICB8fCB7IGVjaG8gIkVSUk9SOiBmaWxlcyBsZWZ0IGluIGJ1aWxkIGRpcmVjdG9yeSBhZnRlciBkaXN0Y2xlYW46IiA7IFwKKwkgICAgICAgJChkaXN0Y2xlYW5jaGVja19saXN0ZmlsZXMpIDsgXAorCSAgICAgICBleGl0IDE7IH0gPiYyCitjaGVjay1hbTogYWxsLWFtCitjaGVjazogY2hlY2stcmVjdXJzaXZlCithbGwtYW06IE1ha2VmaWxlIGNvbmZpZy5oCitpbnN0YWxsZGlyczogaW5zdGFsbGRpcnMtcmVjdXJzaXZlCitpbnN0YWxsZGlycy1hbToKK2luc3RhbGw6IGluc3RhbGwtcmVjdXJzaXZlCitpbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1yZWN1cnNpdmUKK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZQordW5pbnN0YWxsOiB1bmluc3RhbGwtcmVjdXJzaXZlCisKK2luc3RhbGwtYW06IGFsbC1hbQorCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCisKK2luc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZQoraW5zdGFsbC1zdHJpcDoKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCisJICBgdGVzdCAteiAnJChTVFJJUCknIHx8IFwKKwkgICAgZWNobyAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyJgIGluc3RhbGwKK21vc3RseWNsZWFuLWdlbmVyaWM6CisKK2NsZWFuLWdlbmVyaWM6CisKK2Rpc3RjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQorCS10ZXN0IC16ICIkKERJU1RDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChESVNUQ0xFQU5GSUxFUykKKworbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgorCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKKwlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCitjbGVhbjogY2xlYW4tcmVjdXJzaXZlCisKK2NsZWFuLWFtOiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgbW9zdGx5Y2xlYW4tYW0KKworZGlzdGNsZWFuOiBkaXN0Y2xlYW4tcmVjdXJzaXZlCisJLXJtIC1mICQoYW1fX0NPTkZJR19ESVNUQ0xFQU5fRklMRVMpCisJLXJtIC1mIE1ha2VmaWxlCitkaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1nZW5lcmljIGRpc3RjbGVhbi1oZHIgXAorCWRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi10YWdzCisKK2R2aTogZHZpLXJlY3Vyc2l2ZQorCitkdmktYW06CisKK2h0bWw6IGh0bWwtcmVjdXJzaXZlCisKK2luZm86IGluZm8tcmVjdXJzaXZlCisKK2luZm8tYW06CisKK2luc3RhbGwtZGF0YS1hbToKKworaW5zdGFsbC1kdmk6IGluc3RhbGwtZHZpLXJlY3Vyc2l2ZQorCitpbnN0YWxsLWV4ZWMtYW06CisKK2luc3RhbGwtaHRtbDogaW5zdGFsbC1odG1sLXJlY3Vyc2l2ZQorCitpbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1yZWN1cnNpdmUKKworaW5zdGFsbC1tYW46CisKK2luc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1yZWN1cnNpdmUKKworaW5zdGFsbC1wczogaW5zdGFsbC1wcy1yZWN1cnNpdmUKKworaW5zdGFsbGNoZWNrLWFtOgorCittYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZQorCS1ybSAtZiAkKGFtX19DT05GSUdfRElTVENMRUFOX0ZJTEVTKQorCS1ybSAtcmYgJCh0b3Bfc3JjZGlyKS9hdXRvbTR0ZS5jYWNoZQorCS1ybSAtZiBNYWtlZmlsZQorbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYworCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tcmVjdXJzaXZlCisKK21vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wKKworcGRmOiBwZGYtcmVjdXJzaXZlCisKK3BkZi1hbToKKworcHM6IHBzLXJlY3Vyc2l2ZQorCitwcy1hbToKKwordW5pbnN0YWxsLWFtOgorCisuTUFLRTogJChSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUykgJChSRUNVUlNJVkVfVEFSR0VUUykgaW5zdGFsbC1hbSBcCisJaW5zdGFsbC1zdHJpcAorCisuUEhPTlk6ICQoUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMpICQoUkVDVVJTSVZFX1RBUkdFVFMpIENUQUdTIEdUQUdTIFwKKwlhbGwgYWxsLWFtIGFtLS1yZWZyZXNoIGNoZWNrIGNoZWNrLWFtIGNsZWFuIGNsZWFuLWdlbmVyaWMgXAorCWNsZWFuLWxpYnRvb2wgY3RhZ3MgY3RhZ3MtcmVjdXJzaXZlIGRpc3QgZGlzdC1hbGwgZGlzdC1iemlwMiBcCisJZGlzdC1nemlwIGRpc3QtaG9vayBkaXN0LWx6bWEgZGlzdC1zaGFyIGRpc3QtdGFyWiBkaXN0LXppcCBcCisJZGlzdGNoZWNrIGRpc3RjbGVhbiBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4taGRyIFwKKwlkaXN0Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tdGFncyBkaXN0Y2xlYW5jaGVjayBkaXN0ZGlyIFwKKwlkaXN0dW5pbnN0YWxsY2hlY2sgZHZpIGR2aS1hbSBodG1sIGh0bWwtYW0gaW5mbyBpbmZvLWFtIFwKKwlpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1kYXRhIGluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWR2aSBcCisJaW5zdGFsbC1kdmktYW0gaW5zdGFsbC1leGVjIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWh0bWwgXAorCWluc3RhbGwtaHRtbC1hbSBpbnN0YWxsLWluZm8gaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtbWFuIFwKKwlpbnN0YWxsLXBkZiBpbnN0YWxsLXBkZi1hbSBpbnN0YWxsLXBzIGluc3RhbGwtcHMtYW0gXAorCWluc3RhbGwtc3RyaXAgaW5zdGFsbGNoZWNrIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBcCisJaW5zdGFsbGRpcnMtYW0gbWFpbnRhaW5lci1jbGVhbiBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgXAorCW1vc3RseWNsZWFuIG1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbCBwZGYgcGRmLWFtIFwKKwlwcyBwcy1hbSB0YWdzIHRhZ3MtcmVjdXJzaXZlIHVuaW5zdGFsbCB1bmluc3RhbGwtYW0KKworCisjIEFkZCBhbGwgdGhlIGZpbGVzIGxpc3RlZCBpbiAiZGlzdGZpbGVzIiBmaWxlcyB0byB0aGUgZGlzdHJpYnV0aW9uLAorIyBhcHBseSB2ZXJzaW9uIG51bWJlciBzIHRvIHNvbWUgZmlsZXMgYW5kIGNyZWF0ZSBhIFZFUlNJT04gZmlsZSB3aGljaAorIyB3ZSBuZWVkIGZvciB0aGUgUHJlcmVxOiBwYXRjaCBmaWxlIHRyaWNrLiAKK2Rpc3QtaG9vazoKKwlAc2V0IC1lOyBcCisJIGZvciBmaWxlIGluIGBjZCAkKHRvcF9zcmNkaXIpOyBcCisJICAgICAgZmluZCBtcGkgLXR5cGUgZiAtbmFtZSBkaXN0ZmlsZXNgOyBkbyBcCisJICAgIGRpcj1gZGlybmFtZSAkJGZpbGVgIDsgJChta2luc3RhbGxkaXJzKSAkKGRpc3RkaXIpLyQkZGlyIDsgXAorCSAgICBmb3IgaSBpbiBkaXN0ZmlsZXMgYGNhdCAkKHRvcF9zcmNkaXIpLyQkZmlsZWAgOyBkbyBcCisJCWxuICQodG9wX3NyY2RpcikvJCRkaXIvJCRpICQoZGlzdGRpcikvJCRkaXIvJCRpIDI+IC9kZXYvbnVsbCBcCisJCXx8IGNwIC1wICQodG9wX3NyY2RpcikvJCRkaXIvJCRpICQoZGlzdGRpcikvJCRkaXIvJCRpOyBcCisJICAgIGRvbmUgOyBcCisJZG9uZQorCUBzZXQgLWU7IFwKKwllY2hvICIkKFZFUlNJT04pIiA+ICQoZGlzdGRpcikvVkVSU0lPTgorCitzdG93aW5zdGFsbDogCisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbCBwcmVmaXg9L3Vzci9sb2NhbC9zdG93L2xpYmdjcnlwdAorIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KKyMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgorLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L05FV1MgYi9saWJnY3J5cHQtMS40LjYvTkVXUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGFhMmRiCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L05FV1MKQEAgLTAsMCArMSw2MjYgQEAKK05vdGV3b3J0aHkgY2hhbmdlcyBpbiB2ZXJzaW9uIDEuNC42ICgyMDEwLTA3LTEzKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqIE5ldyB2YXJpYW50cyBvZiB0aGUgVElHRVIgYWxnb3JpdGhtLiAgICAgICAgCisKKyAqIE5ldyBjaXBoZXIgYWxnb3JpdGhtIG1vZGUgZm9yIEFFUy1XUkFQLgorCisgKiBJbnRlcmZhY2UgY2hhbmdlcyByZWxhdGl2ZSB0byB0aGUgMS40LjIgcmVsZWFzZToKKyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgR0NSWV9NRF9USUdFUjEgICAgICAgICAgICAgTkVXLgorIEdDUllfTURfVElHRVIyICAgICAgICAgICAgIE5FVy4KKyBHQ1JZX0NJUEhFUl9NT0RFX0FFU1dSQVAgICBORVcuCisKKworTm90ZXdvcnRoeSBjaGFuZ2VzIGluIHZlcnNpb24gMS40LjUgKDIwMDktMTItMTEpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICogRml4ZWQgbWlub3IgbWVtb3J5IGxlYWsgaW4gRFNBIGtleSBnZW5lcmF0aW9uLgorCisgKiBObyBtb3JlIHN3aXRjaGluZyB0byBGSVBTIG1vZGUgaWYgL3Byb2MvdmVyc2lvbiBpcyBub3QgcmVhZGFibGUuCisKKyAqIEZpeGVkIGEgc2lnaWxsIGR1cmluZyBQYWRsb2NrIGRldGVjdGlvbiBvbiBvbGQgQ1BVcy4KKworICogRml4ZWQgYSBoYW5nIG9uIHNvbWUgVzIwMDAgbWFjaGluZXMuCisKKyAqIEJvb3N0ZWQgU0hBLTUxMiBwZXJmb3JtYW5jZSBieSAzMCUgb24gaWEzMiBib3hlcyBhbmQgZ2NjIDQuMzsKKyAgIFNIQS0yNTYgd2VudCB1cCBieSAyNSUuCisKKworTm90ZXdvcnRoeSBjaGFuZ2VzIGluIHZlcnNpb24gMS40LjQgKDIwMDktMDEtMjIpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICogUHVibGlzaCBHQ1JZX01PRFVMRV9JRF9VU0VSIGFuZCBHQ1JZX01PRFVMRV9JRF9VU0VSX0xBU1QgY29uc3RhbnRzLgorICAgVGhpcyBmdW5jdGlvbmFsaXR5IGhhcyBiZWVuIGluIExpYmdjcnlwdCBzaW5jZSAxLjMuMC4gCisKKyAqIE1ENSBtYXkgbm93IGJlIHVzZWQgaW4gbm9uLWVuZm9yY2VkIGZpcHMgbW9kZS4KKworICogRml4ZWQgSE1BQyBmb3IgU0hBLTM4NCBhbmQgU0hBLTUxMiB3aXRoIGtleXMgbG9uZ2VyIHRoYW4gNjQgYnl0ZXMuCisKKyAqIEluIGZpcHMgbW9kZSwgUlNBIGtleXMgYXJlIG5vdyBnZW5lcmF0ZWQgdXNpbmcgdGhlIFg5LjMxIGFsZ29yaXRobQorICAgYW5kIERTQSBrZXlzIHVzaW5nIHRoZSBGSVBTIDE4Ni0yIGFsZ29yaXRobS4KKworICogVGhlIHRyYW5zaWVudC1rZXkgZmxhZyBpcyBub3cgYWxzbyBzdXBwb3J0ZWQgZm9yIERTQSBrZXkKKyAgIGdlbmVyYXRpb24uICBEU0EgZG9tYWluIHBhcmFtZXRlcnMgbWF5IGJlIGdpdmVuIGFzIHdlbGwuCisKKworTm90ZXdvcnRoeSBjaGFuZ2VzIGluIHZlcnNpb24gMS40LjMgKDIwMDgtMDktMTgpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICogVHJ5IHRvIGF1dG8taW5pdGlhbGl6ZSBMaWJnY3J5cHQgdG8gbWluaW1pemUgdGhlIGVmZmVjdCBvZgorICAgYXBwbGljYXRpb25zIG5vdCBkb2luZyB0aGF0IGNvcnJlY3RseS4gIFRoaXMgaXMgbm90IGEgcGVyZmVjdAorICAgc29sdXRpb24gYnV0IGdpdmVuIHRoYXQgbWFueSBhcHBsaWNhdGlvbmlvbiB3b3VsZCB0b3RhbGx5IGZhaWwKKyAgIHdpdGhvdXQgc3VjaCBhIGhhY2ssIHdlIHRyeSB0byBoZWxwIGF0IGxlYXN0IHdpdGggdGhlIG1vc3QgY29tbW9uCisgICBjYXNlcy4gIEZvbGtzLCBwbGVhc2UgcmVhZCB0aGUgbWFudWFsIHRvIGxlYXJuIGhvdyB0byBwcm9wZXJseQorICAgaW5pdGlhbGl6ZSBMaWJnY3J5cHQhCisKKyAqIEF1dG8taW5pdGlhbGl6ZSB0aGUgc2VjdXJlIG1lbW9yeSB0byAzMmsgaW5zdGVhZCBvZiBhYm9ydGluZyB0aGUKKyAgIHByb2Nlc3MuCisKKyAqIExvZyBmYXRhbCBlcnJvcnMgdmlhIHN5c2xvZy4KKworICogQ2hhbmdlZCB0aGUgbmFtZSBhbmQgdGhlIHNlbWFudGljcyBvZiB0aGUgZmlwcyBtb2RlIGNvbmZpZyBmaWxlLgorCisgKiBBZGQgY29udmVuaWVuY2UgbWFjcm8gZ2NyeV9maXBzX21vZGVfYWN0aXZlLgorCisgKiBNb3JlIHNlbGYtdGVzdHMuCisKKyAqIERvY3VtZW50YXRpb24gY2xlYW51cHMuCisKKworTm90ZXdvcnRoeSBjaGFuZ2VzIGluIHZlcnNpb24gMS40LjIgKDIwMDgtMDktMDgpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICogVGhlIGxvbmcgbWlzc2luZyBnY3J5X21waV9sc2hpZnQgZnVuY3Rpb24gaGFzIGJlZW4gYWRkZWQuCisKKyAqIFJTQSBrZXkgZ2VuZXJhdGlvbiBub3cgc3VwcG9ydHMgYSAidHJhbnNpZW50LWtleSIgZmxhZy4KKworICogVGhlIGtleWdyaXAgY29tcHV0YXRpb24gZm9yIEVDRFNBIGhhcyBiZWVuIGltcGxlbWVudGVkIHRodXMgRUNEU0EKKyAgIGlzIG5vdyBmdWxseSBzdXBwb3J0ZWQuCisKKyAqIEEgZmV3IG1hY3JvcyBoYXZlIGJlZW4gcmVwbGFjZWQgYnkgZnVuY3Rpb25zIGZvciBiZXR0ZXIgdHlwZQorICAgY2hlY2tpbmcuCisKKyAqIFRoZSB0aHJlYWQgaW5pdGlhbGl6YXRpb24gc3RydWN0dXJlIG5vdyBjYXJyaWVzIHZlcnNpb24KKyAgIGluZm9ybWF0aW9uLgorCisgKiBUaGUgbWFudWFsIGRlc2NyaWJlcyBtb3JlIGNsZWFybHkgaG93IHRvIGluaXRpYWxpemUgTGliZ2NyeXB0LgorCisgKiBUaGUgbGlicmFyeSBtYXkgbm93IGJlIHN3aXRjaGVkIGludG8gYSBGSVBTIG1vZGUuCisKKyAqIEludGVyZmFjZSBjaGFuZ2VzIHJlbGF0aXZlIHRvIHRoZSAxLjMuMCByZWxlYXNlOgorIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyBHQ1JZQ1RMX09QRVJBVElPTkFMX1AgICBORVcuCisgR0NSWUNUTF9GSVBTX01PREVfUCAgICAgTkVXLgorIEdDUllDVExfRk9SQ0VfRklQU19NT0RFIE5FVy4KKyBnY3J5X2NpcGhlcl9zZXRrZXkgICAgICBORVc6IFJlcGxhY2VzIG1hY3JvLgorIGdjcnlfY2lwaGVyX3NldGl2ICAgICAgIE5FVzogUmVwbGFjZXMgbWFjcm8uCisgZ2NyeV9jaXBoZXJfc2V0Y3RyICAgICAgTkVXOiBSZXBsYWNlcyBtYWNyby4KKyBnY3J5X21waV9sc2hpZnQgICAgICAgICBORVcuCisgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCisKK05vdGV3b3J0aHkgY2hhbmdlcyBpbiB2ZXJzaW9uIDEuNC4xICgyMDA4LTA0LTI1KQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqIEZpeGVkIGEgYnVnIGludHJvZHVjZWQgYnkgMS4zLjEgd2hpY2ggbGVkIHRvIHRoZSBjb21zdW1wdGlvbiBvZiBmYXIKKyAgIHRvbyBtdWNoIGVudHJvcHkgZm9yIHRoZSBpbnRpYWwgc2VlZGluZy4KKworICogSW1wcm92ZWQgQUVTIHBlcmZvcm1hbmNlIGZvciBDRkIgYW5kIENCQyBtb2Rlcy4KKworICogUmVtb3ZlZCBidWlsZCBwcm9ibGVtcyBmb3IgdGhlIFBhZGxvY2sgc3VwcG9ydC4KKworCitOb3Rld29ydGh5IGNoYW5nZXMgaW4gdmVyc2lvbiAxLjQuMCAoMjAwNy0xMi0xMCkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKiBOZXcgY29uZmlndXJlIG9wdGlvbiAtLWRpc2FibGUtcGFkbG9jay1zdXBwb3J0IHdoaWNoIGlzIG1vc3RseQorICAgdXNlZnVsIGluIGNhc2Ugb2YgYnVpbGQgcHJvYmxlbXMuCisKKworTm90ZXdvcnRoeSBjaGFuZ2VzIGluIHZlcnNpb24gMS4zLjIgKDIwMDctMTItMDMpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICogVGhlIHZpc2liaWxpdHkgYXR0cmlidXRlIGlzIG5vdyB1c2VkIGlmIHN1cHBvcnRlZCBieSB0aGUgdG9vbGNoYWluLgorCisgKiBUaGUgQUNFIGVuZ2luZSBvZiBWSUEgcHJvY2Vzc29ycyBpcyBub3cgdXNlZCBmb3IgQUVTLTEyOC4KKworICogVGhlIEFTTi4xIERFUiB0ZW1wbGF0ZSBmb3IgU0hBLTIyNCBoYXMgYmVlbiBmaXhlZC4KKworCitOb3Rld29ydGh5IGNoYW5nZXMgaW4gdmVyc2lvbiAxLjMuMSAoMjAwNy0xMC0yNikKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKiBUaGUgZW50aXJlIGxpYnJhcnkgaXMgbm93IHVuZGVyIHRoZSBMR1BMLiBUaGUgaGVscGVyIHByb2dyYW1zIGFuZAorICAgdGhlIG1hbnVhbCBhcmUgdW5kZXIgdGhlIEdQTC4gIEt1ZG9zIHRvIFBldGVyIEd1dG1hbm4gZm9yIGdpdmluZworICAgcGVybWlzc2lvbnMgdG8gcmVsaWNlbnNlIHRoZSBybmR3MzIgYW5kIHJuZHVuaXggbW9kdWxlcy4KKworICogVGhlIENhbWVsbGlhIGNpcGhlciBpcyBub3cgdW5kZXIgdGhlIExHUEwgYW5kIGluY2x1ZGVkIGJ5IGRlZmF1bHQuCisKKyAqIEZpeGVkIGEgYnVnIGluIHRoZSBkZXRlY3Rpb24gb2Ygc3ltYm9sIHByZWZpeGVzIHdoaWNoIGluaGliaXRlZCB0aGUKKyAgIGJ1aWxkIG9mIG9wdGltemllZCBhc3NlbWJsZXIgY29kZSBvbiBjZXJ0YWluIHN5c3RlbXMuCisKKyAqIFVwZGF0ZWQgdGhlIGVudHJvcHkgZ2F0aGVyZXIgZm9yIFczMi4KKworCitOb3Rld29ydGh5IGNoYW5nZXMgaW4gdmVyc2lvbiAxLjMuMCAoMjAwNy0wNS0wNCkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKiBDaGFuZ2VkIHRoZSB3YXkgdGhlIFJORyBnZXRzIGluaXRpYWxpemVkLiBUaGlzIGFsbG93cyB0byBrZWVwIGl0CisgICB1bmluaXRpYWxpemVkIGFzIGxvbmcgYXMgbm8gcmFuZG9tIG51bWJlcnMgYXJlIHVzZWQuICBUbyBvdmVycmlkZQorICAgdGhpcywgdGhlIG5ldyBtYWNybyBnY3J5X2Zhc3RfcmFuZG9tX3BvbGwgbWF5IGJlIHVzZWQuICBJdCBpcyBpbgorICAgZ2VuZXJhbCBhIGdvb2QgaWRlYSB0byBzcHJlYWQgdGhpcyBtYWNybyBpbnRvIHRoZSBhcHBsaWNhdGlvbiBjb2RlCisgICB0byBtYWtlIHN1cmUgdGhhdCB0aGVzZSBwb2xscyBoYXBwZW4gb2Z0ZW4gZW5vdWdoLgorCisgKiBNYWRlIHRoZSBSTkcgaW1tdW5lIGFnYWluc3QgZm9yayB3aXRob3V0IGV4ZWMuCisKKyAqIFJlYWRpbmcgYW5kIHdyaXRpbmcgdGhlIHJhbmRvbSBzZWVkIGZpbGUgaXMgbm93IHByb3RlY3RlZCBieSBhCisgICBmY250bCBzdHlsZSBmaWxlIGxvY2sgb24gc3lzdGVtcyB0aGF0IHByb3ZpZGUgdGhpcyBmdW5jdGlvbi4KKworICogU3VwcG9ydCBmb3IgU0hBLTIyNCBhbmQgSE1BQyB1c2luZyBTSEEtMzg0IGFuZCBTSEEtNTEyLgorCisgKiBTdXBwb3J0IGZvciB0aGUgU0VFRCBjaXBoZXIuCisKKyAqIFN1cHBvcnQgZm9yIHRoZSBDYW1lbGxpYSBjaXBoZXIuICBOb3RlIHRoYXQgQ2FtZWxsaWEgaXMgZGlzYWJsZWQgYnkKKyAgIGRlZmF1bHQsIGFuZCB0aGF0IGVuYWJsaW5nIGl0IGNoYW5nZXMgdGhlIGxpY2Vuc2Ugb2YgbGliZ2NyeXB0IGZyb20KKyAgIExHUEwgdG8gR1BMLgorCisgKiBTdXBwb3J0IGZvciBPRkIgZW5jcnlwdGlvbiBtb2RlLgorCisgKiBnY3J5X21waV9yc2hpZnQgZG9lcyBub3QgYW55bW9yZSB0cnVuY2F0ZSB0aGUgc2hpZnQgY291bnQuCisKKyAqIFJlc2VydmVkIGFsZ29yaXRobSByYW5nZXMgZm9yIHVzZSBieSBhcHBsaWNhdGlvbnMuCisKKyAqIFN1cHBvcnQgZm9yIERTQTIuCisKKyAqIFRoZSBuZXcgZnVuY3Rpb24gZ2NyeV9tZF9kZWJ1ZyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZQorICAgZ2NyeV9tZF9zdGFydF9kZWJ1ZyBhbmQgZ2NyeV9tZF9zdG9wX2RlYnVnIG1hY3Jvcy4KKworICogTmV3IGNvbmZpZ3VyZSBvcHRpb24gLS1lbmFibGUtcmFuZG9tLWRhZW1vbiB0byBzdXBwb3J0IGEgc3lzdGVtCisgICB3aWRlIHJhbmRvbSBkYWVtb24uICBUaGUgZGFlbW9uIGNvZGUgaXMgZXhwZXJpbWVudGFsIGFuZCBub3QgeWV0CisgICB2ZXJ5IHdlbGwgd29ya2luZy4gIEl0IHdpbGwgZXZlbnR1YWxseSBhbGxvdyB0byBrZWVwIGEgZ2xvYmFsCisgICByYW5kb20gcG9vbCBmb3IgdGhlIHNha2Ugb2Ygc2hvcnQgbGl2aW5nIHByb2Nlc3Nlcy4KKworICogTm9uIGV4ZWN1dGFibGUgc3RhY2sgc3VwcG9ydCBpcyBub3cgdXNlZCBieSBkZWZhdWx0IG9uIHN5c3RlbXMKKyAgIHN1cHBvcnRpbmcgaXQuCisKKyAqIFN1cHBvcnQgZm9yIE1pY3Jvc29mdCBXaW5kb3dzLgorCisgKiBBc3NlbWJsZXIgc3VwcG9ydCBmb3IgdGhlIEFNRDY0IGFyY2hpdGVjdHVyZS4KKworICogTmV3IGNvbmZpZ3VyZSBvcHRpb24gLS1lbmFibGUtbXBpLXBhdGggZm9yIG9wdGltaXplZCBidWlsZHMuCisKKyAqIEV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciBFQ0RTQTsgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgdGVzdGluZy4KKworICogTmV3IGNvbnRyb2wgY29kZSBHQ1JZQ1RMX1BSSU5UX0NPTkZJRyB0byBwcmludCB0aGUgYnVpbGQKKyAgIGNvbmZpZ3VyYXRpb24uCisKKyAqIE1pbm9yIGNoYW5nZXMgdG8gc29tZSBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuICBCdWZmZXIgYXJndW1lbnRzIGFyZQorICAgbm93IHR5cGVkIGFzIHZvaWQgcG9pbnRlci4gIFRoaXMgc2hvdWxkIG5vdCBhZmZlY3QgYW55IGNvbXBpbGF0aW9uLgorICAgRml4ZWQgdHdvIGJ1Z3MgaW4gcmV0dXJuIHZhbHVlcyBhbmQgY2xhcmlmaWVkIGRvY3VtZW50YXRpb24uCisKKyAqIEludGVyZmFjZSBjaGFuZ2VzIHJlbGF0aXZlIHRvIHRoZSAxLjIuMCByZWxlYXNlOgorIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyBnY3J5X2Zhc3RfcmFuZG9tX3BvbGwJIE5FVworIGdjcnlfbWRfZGVidWcgICAgICAgICAgIE5FVworIGdjcnlfc2V4cF9udGhfc3RyaW5nICAgIE5FVworIEdDUllfTURfU0hBMjI0ICAgICAgICAgIE5FVworIEdDUllfUEtfVVNBR0VfQ0VSVCAgICAgIE5FVworIEdDUllfUEtfVVNBR0VfQVVUSCAgICAgIE5FVworIEdDUllfUEtfVVNBR0VfVU5LTiAgICAgIE5FVworIEdDUllfUEtfRUNEU0EgICAgICAgICAgIE5FVworIEdDUllfQ0lQSEVSX1NFRUQgICAgICAgIE5FVworIEdDUllfQ0lQSEVSX0NBTUVMTElBMTI4IE5FVworIEdDUllfQ0lQSEVSX0NBTUVMTElBMTkyIE5FVworIEdDUllfQ0lQSEVSX0NBTUVMTElBMjU2IE5FVworIEdDUllDVExfRkFLRURfUkFORE9NX1AgIE5FVyAKKyBHQ1JZQ1RMX1BSSU5UX0NPTkZJRyAgICBORVcKKyBHQ1JZQ1RMX1NFVF9STkRFR0RfU09DS0VUICBORVcuCisgZ2NyeV9tcGlfc2NhbiAgICAgICAgICAgQ0hBTkdFRDogQXJndW1lbnQgQlVGRkVSIGlzIG5vdyB2b2lkKi4KKyBnY3J5X3BrX2FsZ29fbmFtZSAgICAgICBDSEFOR0VEOiBSZXR1cm5zICI/IiBpbnN0ZWFkIG9mIE5VTEwuCisgZ2NyeV9jaXBoZXJfYWxnb19uYW1lICAgQ0hBTkdFRDogUmV0dXJucyAiPyIgaW5zdGVhZCBvZiAiIi4KKyBnY3J5X3BrX3NwZWNfdCAgICAgICAgICBDSEFOR0VEOiBFbGVtZW50IEFMSUFTRVMgaXMgbm93IGNvbnN0IHB0ci4KKyBnY3J5X21kX3dyaXRlX3QgICAgICAgICBDSEFOR0VEOiBBcmd1bWVudCBCVUYgaXMgbm93IGEgY29uc3Qgdm9pZCouCisgZ2NyeV9tZF9jdGwgICAgICAgICAgICAgQ0hBTkdFRDogQXJndW1lbnQgQlVGRkVSIGlzIG5vdyB2b2lkKi4KKyBnY3J5X2NpcGhlcl9lbmNyeXB0ICAgICBDSEFOR0VEOiBBcmd1bWVudHMgSU4gYW5kIE9VVCBhcmUgbm93IHZvaWQqLgorIGdjcnlfY2lwaGVyX2RlY3J5cHQgICAgIENIQU5HRUQ6IEFyZ3VtZW50cyBJTiBhbmQgT1VUIGFyZSBub3cgdm9pZCouCisgZ2NyeV9zZXhwX3NwcmludCAgICAgICAgQ0hBTkdFRDogQXJndW1lbnQgQlVGRkVSIGlzIG5vdyB2b2lkKi4KKyBnY3J5X2NyZWF0ZV9ub25jZSAgICAgICBDSEFOR0VEOiBBcmd1bWVudCBCVUZGRVIgaXMgbm93IHZvaWQqLgorIGdjcnlfcmFuZG9taXplICAgICAgICAgIENIQU5HRUQ6IEFyZ3VtZW50IEJVRkZFUiBpcyBub3cgdm9pZCouCisgZ2NyeV9jaXBoZXJfcmVnaXN0ZXIgICAgQ0hBTkdFRDogQXJndW1lbnQgQUxHT1JJVEhNX0lEIGlzIG5vdyBpbnQqLgorIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworCitOb3Rld29ydGh5IGNoYW5nZXMgaW4gdmVyc2lvbiAxLjIuMCAoMjAwNC0wNC0xNSkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKiBGaXJzdCBzdGFibGUgcmVsZWFzZS4KKworCitOb3Rld29ydGh5IGNoYW5nZXMgaW4gdmVyc2lvbiAxLjEuOTQgKDIwMDQtMDMtMjkpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqIFRoZSBzdXBwb3J0IGZvciBtdWx0aS10aHJlYWRlZCB1c2VycyBnb2VzIGludG8gaXRzIHRoaXJkCisgICBpbmNhcm5hdGlvbi4gIFdlIHJlbW92ZWQgY29tcGlsZSB0aW1lIHN1cHBvcnQgZm9yIHRocmVhZCBsaWJyYXJpZXMuCisgICBUbyBzdXBwb3J0IHRoZSB0aHJlYWQgbGlicmFyeSBvZiB5b3VyIGNob2ljZSwgeW91IGhhdmUgdG8gc2V0IHVwCisgICBjYWxsYmFjayBoYW5kbGVycyBhdCBpbml0aWFsaXphdGlvbiB0aW1lLiAgTmV3IGRhdGEgc3RydWN0dXJlcywgYQorICAgbmV3IGNvbnRyb2wgY29tbWFuZCwgYW5kIGRlZmF1bHQgaW5pdGlhbGl6ZXJzIGFyZSBwcm92aWRlZCBmb3IgdGhpcworICAgcHVycG9zZS4KKworICogSW50ZXJmYWNlIGNoYW5nZXMgcmVsYXRpdmUgdG8gdGhlIDEuMS45MyByZWxlYXNlOgorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorbGliZ2NyeXB0LWNvbmZpZyAtLXRocmVhZAlPQlNPTEVURQorbGliZ2NyeXB0LXB0aC5sYQkJUkVNT1ZFRAorbGliZ2NyeXB0LXB0aHJlYWQubGEJCVJFTU9WRUQKK0dDUllDVExfU0VUX1RIUkVBRF9DQlMJCU5FVworc3RydWN0IGdjcnlwdF90aHJlYWRfY2JzCU5FVworZW51bSBnY3J5X3RocmVhZF9vcHRpb24JCU5FVworR0NSWV9USFJFQURfT1BUSU9OX1BUSF9JTVBMCU5FVworR0NSWV9USFJFQURfT1BUSU9OX1BUSFJFQURfSU1QTAlORVcKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworTm90ZXdvcnRoeSBjaGFuZ2VzIGluIHZlcnNpb24gMS4xLjkzICgyMDA0LTAzLTA2KQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKiBUaGUgYXV0b21hdGljIHRocmVhZCBsaWJyYXJ5IGRldGVjdGlvbiBoYXMgZmluYWxseSBiZWVuIHJlbW92ZWQuCisgICBGcm9tIG5vdyBvbiwgb25seSBsaW5raW5nIGV4cGxpY2l0ZWx5IHRvIGxpYmdjcnlwdCwgbGliZ2NyeXB0LXB0aAorICAgb3IgbGliZ2NyeXB0LXB0aHJlYWQgaXMgc3VwcG9ydGVkLgorCitOb3Rld29ydGh5IGNoYW5nZXMgaW4gdmVyc2lvbiAxLjEuOTIgKDIwMDQtMDItMjApCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqIE1pbm9yIGJ1ZyBmaXhlcy4KKworICogSW5jbHVkZWQgYSBsaW1pdGVkIGltcGxlbWVudGF0aW9uIG9mIFJGQzIyNjguCisKKyAqIENoYW5nZWQgQVBJIG9mIHRoZSBnY3J5X2FjXyBmdW5jdGlvbnMuICBPbmx5IGEgdmVyeSBmZXcgcHJvZ3JhbXMKKyAgIHNob3VsZCBiZSBhZmZlY3RlZCBieSB0aGlzLgorCisgKiBJbnRlcmZhY2UgY2hhbmdlcyByZWxhdGl2ZSB0byB0aGUgMS4xLjkxIHJlbGVhc2U6Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitHQ1JZX0NJUEhFUl9SRkMyMjY4XzQwICAgICAgICAgIE5FVy4KK2djcnlfYWNfZGF0YV9zZXQgICAgICAgICAgICAgICAgQ0hBTkdFRDogTmV3IGFyZ3VtZW50IEZMQUdTLgorZ2NyeV9hY19kYXRhX2dldF9uYW1lICAgICAgICAgICBDSEFOR0VEOiBOZXcgYXJndW1lbnQgRkxBR1MuCitnY3J5X2FjX2RhdGFfZ2V0X2luZGV4ICAgICAgICAgIENIQU5HRUQ6IE5ldyBhcmd1bWVudCBGTEFHUy4KK2djcnlfYWNfa2V5X3BhaXJfZ2VuZXJhdGUgICAgICAgQ0hBTkdFRDogTmV3IGFuZCByZW9yZGVyZWQgYXJndW1lbnRzLgorZ2NyeV9hY19rZXlfdGVzdCAgICAgICAgICAgICAgICBDSEFOR0VEOiBOZXcgYXJndW1lbnQgSEFORExFLgorZ2NyeV9hY19rZXlfZ2V0X25iaXRzICAgICAgICAgICBDSEFOR0VEOiBOZXcgYXJndW1lbnQgSEFORExFLgorZ2NyeV9hY19rZXlfZ2V0X2dyaXAgICAgICAgICAgICBDSEFOR0VEOiBOZXcgYXJndW1lbnQgSEFORExFLgorZ2NyeV9hY19kYXRhX3NlYXJjaCAgICAgICAgICAgICBSRU1PVkVELgorZ2NyeV9hY19kYXRhX2FkZCAgICAgICAgICAgICAgICBSRU1PVkVELgorR0NSWV9BQ19EQVRBX0ZMQUdfTk9fQkxJTkRJTkcgICBSRU1PVkVELgorR0NSWV9BQ19GTEFHX05PX0JMSU5ESU5HICAgICAgICBORVc6IFJlcGxhY2VzIGFib3ZlLgorCisKK05vdGV3b3J0aHkgY2hhbmdlcyBpbiB2ZXJzaW9uIDEuMS45MSAoMjAwMy0xMi0xOSkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICogQ29kZSBjbGVhbnVwcyBhbmQgbWlub3IgYnVnIGZpeGVzLgorCisKK05vdGV3b3J0aHkgY2hhbmdlcyBpbiB2ZXJzaW9uIDEuMS45MCAoMjAwMy0xMS0xNCkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICogVGhlIHVzZSBvZiB0aGUgR0NSWV9XRUFLX1JBTkRPTSBsZXZlbCBpcyBub3cgZGVwcmVjYXRlZCBpbiBmYXZvciBvZgorICAgdGhlIG5ldyBnY3J5X2NyZWF0ZV9ub25jZSBmdW5jdGlvbi4KKworICogZ2NyeV9zZXhwX2J1aWxkIG5vdyBzdXBwb3J0cyBhICIlYiIgZm9ybWF0IHRvIGluY2x1ZGUgYSBtZW1vcnkgYnVmZmVyLgorCisgKiBNaW5vciBjb25maWd1cmF0aW9uIGZpeGVzLgorIAorICogSW50ZXJmYWNlIGNoYW5nZXMgcmVsYXRpdmUgdG8gdGhlIDEuMS40NCByZWxlYXNlOgorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorZ2NyeV9jcmVhdGVfbm9uY2UgICAgICAgICAgICAgICBORVcKK2djcnlfc2V4cF9idWlsZCAgICAgICAgICAgICAgICAgRU5IQU5DRUQKKworCitOb3Rld29ydGh5IGNoYW5nZXMgaW4gdmVyc2lvbiAxLjEuNDQgKDIwMDMtMTAtMzEpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqIEJ1ZyBmaXhlcyBhbmQgbW9yZSBjb2RlIGNsZWFudXBzLgorCisgKiBFbmhhbmNlZCB0aGUgcHJpbWUgQVBJLgorCisgKiBJbnRlcmZhY2UgY2hhbmdlcyByZWxhdGl2ZSB0byB0aGUgMS4xLjQzIHJlbGVhc2U6Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitnY3J5X3ByaW1lX2dyb3VwX2dlbmVyYXRvciAgICAgIE5FVworZ2NyeV9wcmltZV9yZWxlYXNlX2ZhY3RvcnMgICAgICBORVcKKworCitOb3Rld29ydGh5IGNoYW5nZXMgaW4gdmVyc2lvbiAxLjEuNDMgKDIwMDMtMDktMDQpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqIEJ1ZyBmaXhlcyBhbmQgaW50ZXJuYWwgY29kZSBjbGVhbnVwcy4KKworICogU3VwcG9ydCBmb3IgdGhlIFNlcnBlbnQgY2lwaGVyIGFsZ29yaXRobS4KKworICogSW50ZXJmYWNlIGNoYW5nZXMgcmVsYXRpdmUgdG8gdGhlIDEuMS40MiByZWxlYXNlOgorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorZ2NyeV9wcmltZV9nZW5lcmF0ZSAgICAgICAgICAgICBORVcKK2djcnlfcHJpbWVfY2hlY2sgICAgICAgICAgICAgICAgTkVXCisKKworTm90ZXdvcnRoeSBjaGFuZ2VzIGluIHZlcnNpb24gMS4xLjQyICgyMDAzLTA3LTMxKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKiBNYWpvciBBUEkgY2xlYW51cC4gIEFwcGxpY2F0aW9ucyBuZWVkIHRvIGJlIGNvbnZlcnRlZCB0byB0aGUgbmV3CisgICBBUEkuICBTZWUgUkVBRE1FLmFwaWNoYW5nZXMgZm9yIGhpbnRzIG9uIGhvdyB0byBkbyB0aGF0LiAgQmFja3dhcmQKKyAgIGNvbXBhdGliaWxpdHkgaXMgcHJvdmlkZWQgd2hlcmUgaXQgd2FzIHBvc3NpYmxlIHdpdGhvdXQgdG9vIG11Y2gKKyAgIGVmZm9ydCBhbmQgZGlkIG5vdCBjb2xsaWRlIHdpdGggdGhlIG92ZXJhbGwgc2FuaXRpemF0aW9uIGVmZm9ydC4KKyAgIEhvd2V2ZXIsIHRoaXMgaXMgb25seSBmb3IgZWFzZSBvZiB0cmFuc2l0aW9uLiAgTk8gREVQUkVDQVRFRAorICAgRlVOQ1RJT04gT1IgREFUQSBUWVBFIElTIENPTlNJREVSRUQgQSBQQVJUIE9GIFRIRSBBUEkgT1IgQUJJIEFORAorICAgV0lMTCBCRSBEUk9QUEVEIElOIFRIRSBGVVRVUkUgV0lUSE9VVCBDSEFOR0lORyBUSEUgU09OQU1FIE9GIFRIRQorICAgTElCUkFSWS4gCisKKyAqIElmIGdjcnlwdC5oIGlzIGluY2x1ZGVkIGluIHNvdXJjZXMgY29tcGlsZWQgYnkgR0NDIDMuMSBvciBsYXRlciwKKyAgIGRlcHJlY2F0ZWQgYXR0cmlidXRlcyB3aWxsIHdhcm4gYWJvdXQgdXNlIG9mIG9ic29sZXRlIGZ1bmN0aW9ucyBhbmQKKyAgIHR5cGUgZGVmaW5pdGlvbnMuICBZb3UgY2FuIHN1cHByZXNzIHRoZXNlIHdhcm5pbmdzIGJ5IHBhc3NpbmcKKyAgIC1Xbm8tZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMgdG8gdGhlIGdjYyBjb21tYW5kLgorCisgKiBnY3J5X2NoZWNrX3ZlcnNpb24gbXVzdCBiZSBjYWxsZWQgZnJvbSBub3cgb24gdG8gaW5pdGlhbGl6ZSB0aGUKKyAgIGxpYnJhcnksIGl0IGlzIG5vdCBsb25nZXIgb3B0aW9uYWwuCisKKyAqIFJlbW92ZWQgYGxpYmdjcnlwdCBlcnJubycgY29uY2VwdC4KKworICogTGliZ2NyeXB0IGRlcGVuZHMgb24gbGliZ3BnLWVycm9yLCBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBlcnJvcgorICAgY29kZXMgYW5kIGFjY29yZGluZyBmdW5jdGlvbnMgZm9yIGFsbCBHbnVQRyBjb21wb25lbnRzLiAgRnVuY3Rpb25zCisgICB0aGF0IHVzZWQgdG8gcmV0dXJuIGVycm9yIGNvZGVzIGFzYSBgaW50JyBoYXZlIGJlZW4gY2hhbmdlZCB0bworICAgcmV0dXJuIGEgY29kZSBvZiB0eXBlIGBnY3J5X2Vycm9yX3QnLiAgQWxsIEdDUllFUlJfKiBlcnJvciBzeW1ib2xzCisgICBoYXZlIGJlZW4gcmVtb3ZlZCwgc2luY2UgdGhleSBhcmUgbm93IGNvbnRhaW5lZCBpbiBsaWJncGctZXJyb3IKKyAgIChHUEdfRVJSXyopLiBBbGwgZnVuY3Rpb25zIGFuZCB0eXBlcyBpbiBsaWJncGctZXJyb3IgaGF2ZSBhbHNvIGJlZW4KKyAgIHdyYXBwZWQgaW4gTGliZ2NyeXB0LiBUaGUgbmV3IHR5cGVzIGFyZSBnY3J5X2Vycl9jb2RlX3QgYW5kCisgICBnY3J5X2Vycl9zb3VyY2VfdC4gIFRoZSBuZXcgZnVuY3Rpb25zIGFyZSBnY3J5X2Vycl9jb2RlLAorICAgZ2NyeV9lcnJfc291cmNlLCBnY3J5X2Vycm9yLCBnY3J5X2Vycl9tYWtlLCBnY3J5X2Vycm9yX2Zyb21fZXJybm8sCisgICBnY3J5X2Vycl9tYWtlX2Zyb21fZXJybm8sIGdjcnlfZXJyX2NvZGVfZnJvbV9lcnJubywKKyAgIGdjcnlfZXJyX2NvZGVfdG9fZXJybm8sIGdjcnlfc3Ryc291cmNlLgorCisgKiBOZXcgZnVuY3Rpb24gZ2NyeV9tcGlfZHVtcCB0byBoZWxwIGluIGRlYnVnZ2luZy4gCisKKyAqIEFkZGVkIGFsdGVybmF0aXZlIGludGVyZmFjZSBmb3IgYXN5bW1ldHJpYyBjcnlwdG9ncmFwaHkuCisKKyAqIENSQy0zMiwgQ1JDLTMyIGEnbGEgUkZDIDE1MTAsIENSQy0yNCBhJ2xhIFJGQyAyNDQwIGFyZSBub3cKKyAgIHN1cHBvcnRlZC4KKworICogU0hBLTI1NiwgU0hBLTM4NCBhbmQgU0hBLTUxMiBhcmUgbm93IHN1cHBvcnRlZC4KKworICogMTI4IGJpdCBUd29maXNoIGlzIG5vdyBzdXBwb3J0ZWQuCisKKyAqIFRoZSByYW5kb20gbW9kdWxlIHdvbid0IHByaW50IHRoZSAibm90IGVub3VnaCByYW5kb20gYnl0ZXMKKyAgIGF2YWlsYWJsZSIgYW55bW9yZS4gIEEgbmV3IHByb2dyZXNzIHN0YXR1cyBpcyBpc3N1ZWQgaW5zdGVhZC4KKworICogQ0JDLU1BQyBmb3IgYmxvY2sgY2lwaGVycyBpcyBub3cgc3VwcG9ydGVkLCBieSB1c2luZyBhCisgICBHQ1JZX0NJUEhFUl9DQkNfTUFDIGNpcGhlciBmbGFnLgorCisgKiBDVFIgbW9kZSBmb3IgYmxvY2sgY2lwaGVycyBpcyBub3cgc3VwcG9ydGVkLgorCisgKiBUaGUgcHVibGljIFJTQSBleHBvbmVudCBjYW4gbm93IGJlIHNwZWNpZmllZCBpbiBrZXkgZ2VuZXJhdGlvbi4gCisKKyAqIFJTQSBibGluZGluZyBpcyBub3cgc3VwcG9ydGVkIGFuZCBpcyB1c2VkIGF1dG9tYXRpY2FsbHkgZm9yIFJTQQorICAgZGVjcnlwdGlvbi4gIEl0IGNhbiBiZSBleHBsaWNpdGVseSBkaXNhYmxlZCBieSB1c2luZyB0aGUKKyAgIGBuby1ibGluZGluZycgc3ltYm9sIGluIHRoZSBgZmxhZ3MnIFMtRXhwcmVzc2lvbiBvciBieSB1c2luZyB0aGUKKyAgIEdDUllfQUNfRkxBR19EQVRBX05PX0JMSU5ESU5HIGZsYWcgd2hlbiB1c2luZyB0aGUgYWMgaW50ZXJmYWNlLgorCisgKiBnY3J5X3NleHBfY2Fub25fbGVuIGRvZXMgbm90IHVzZSBhIGBoaXN0b3JpY2FsbHkgZW5jb2RlZCcgZXJyb3IKKyAgIGNvZGUgYW55bW9yZS4KKworCisgKiBJbnRlcmZhY2UgY2hhbmdlcyByZWxhdGl2ZSB0byB0aGUgMS4xLjEyIHJlbGVhc2U6Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitHQ1JZX01QSQkJCURFUFJFQ0FURUQ7IFVzZTogZ2NyeV9tcGlfdAorR2NyeU1QSQkJCQlERVBSRUNBVEVEOyBVc2U6IGdjcnlfbXBpX3QKK0dDUllfU0VYUAkJCURFUFJFQ0FURUQ7IFVzZTogZ2NyeV9zZXhwX3QKK0djcnlTZXhwCQkJREVQUkVDQVRFRDsgVXNlOiBnY3J5X3NleHBfdAorR0NSWV9DSVBIRVJfSEQJCQlERVBSRUNBVEVEOyBVc2U6IGdjcnlfY2lwaGVyX2hkX3QKK0djcnlDaXBoZXJIZAkJCURFUFJFQ0FURUQ7IFVzZTogZ2NyeV9jaXBoZXJfaGRfdAorR0NSWV9NRF9IRAkJCURFUFJFQ0FURUQ7IFVzZTogZ2NyeV9tZF9oZF90CitHY3J5TURIZAkJCURFUFJFQ0FURUQ7IFVzZTogZ2NyeV9tZF9oZF90CitnY3J5X2Vycm9yX3QJCQlORVcKK2djcnlfZXJyX2NvZGVfdAkJCU5FVworZ2NyeV9lcnJfc291cmNlX3QJCU5FVworZ2NyeV9lcnJfbWFrZQkJCU5FVworZ2NyeV9lcnJvcgkJCU5FVworZ2NyeV9lcnJfY29kZQkJCU5FVworZ2NyeV9lcnJfc291cmNlCQkJTkVXCitnY3J5X2Vycl9jb2RlX2Zyb21fZXJybm8JTkVXCitnY3J5X2Vycl9jb2RlX3RvX2Vycm5vCQlORVcKK2djcnlfZXJyX21ha2VfZnJvbV9lcnJubwlORVcKK2djcnlfZXJyb3JfZnJvbV9lcnJubwkJTkVXCitnY3J5X3N0cnNvdXJjZQkJCU5FVworR0NSWUVSUl97c29tZSBlcnJvciBjb2RlfQlSRU1PVkVEOyBVc2UgR1BHX0VSUl8qCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gbGliZ3BnLWVycm9yIGluc3RlYWQuCitnY3J5X2Vycm5vICAgICAgICAgICAgICAgICAgICAgIFJFTU9WRUQKK2djcnlfc2V4cF9jYW5vbl9sZW4JCUNIQU5HRUQKK2djcnlfc2V4cF9idWlsZF9hcnJheQkJTkVXCitnY3J5X21waV9zY2FuCQkJQ0hBTkdFRDogTmV3IGFyZ3VtZW50IHRvIHNlcGFyYXRlIGluL291dCBhcmdzLgorZ2NyeV9tcGlfcHJpbnQJCQlDSEFOR0VEOiBEaXR0by4KK2djcnlfbXBpX2R1bXAJCQlORVcKK2djcnlfY2lwaGVyX29wZW4JCUNIQU5HRUQKK2djcnlfY2lwaGVyX3Jlc2V0CQlORVcKK2djcnlfY2lwaGVyX3JlZ2lzdGVyCQlORVcKK2djcnlfY2lwaGVyX3VucmVnaXN0ZXIJCU5FVworZ2NyeV9jaXBoZXJfbGlzdAkJTkVXCitnY3J5X2NpcGhlcl9hbGdvX2tleWxlbgkJUkVQTEFDRUQgbWFjcm8gd2l0aCBmdW5jdGlvbi4KK2djcnlfY2lwaGVyX2FsZ29fYmxrbGVuCQlSRVBMQUNFRCBtYWNybyB3aXRoIGZ1bmN0aW9uLgorZ2NyeV9wa19yZWdpc3RlcgkJTkVXCitnY3J5X3BrX3VucmVnaXN0ZXIJCU5FVworZ2NyeV9wa19saXN0CQkJTkVXCitnY3J5X3BrX2RlY3J5cHQJCQlFTkhBTkNFRDogQWxsb3dzIGZsYWcgdG8gcmV0dXJuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZSBTLWV4cHJlc3Npb24uCitnY3J5X21kX29wZW4JCQlDSEFOR0VECitnY3J5X21kX2NvcHkJCQlDSEFOR0VECitnY3J5X21kX2lzX2VuYWJsZWQJCU5FVworZ2NyeV9tZF9pc19zZWN1cmUJCU5FVworZ2NyeV9tZF9yZWdpc3RlcgkJTkVXCitnY3J5X21kX3VucmVnaXN0ZXIJCU5FVworZ2NyeV9tZF9saXN0CQkJTkVXCitnY3J5X2FjX2RhdGFfdAkJCU5FVworZ2NyeV9hY19rZXlfdAkJCU5FVworZ2NyeV9hY19rZXlfcGFpcl90CQlORVcKK2djcnlfYWNfaGFuZGxlX3QJCU5FVworZ2NyeV9hY19rZXlfc3BlY19yc2FfdAkJTkVXCitnY3J5X2FjX2RhdGFfbmV3CQlORVcKK2djcnlfYWNfZGF0YV9kZXN0cm95CQlORVcKK2djcnlfYWNfZGF0YV9zZXQJCU5FVworZ2NyeV9hY19kYXRhX2NvcHkJCU5FVworZ2NyeV9hY19kYXRhX2xlbmd0aAkJTkVXCitnY3J5X2FjX2RhdGFfZ2V0X25hbWUJCU5FVworZ2NyeV9hY19kYXRhX2dldF9pbmRleAkJTkVXCitnY3J5X2FjX2RhdGFfY2xlYXIJCU5FVworZ2NyeV9hY19vcGVuCQkJTkVXCitnY3J5X2FjX2Nsb3NlCQkJTkVXCitnY3J5X2FjX2tleV9pbml0CQlORVcKK2djcnlfYWNfa2V5X3BhaXJfZ2VuZXJhdGUJTkVXCitnY3J5X2FjX2tleV9wYWlyX2V4dHJhY3QJTkVXCitnY3J5X2FjX2tleV9kYXRhX2dldAkJTkVXCitnY3J5X2FjX2tleV90ZXN0CQlORVcKK2djcnlfYWNfa2V5X2dldF9uYml0cwkJTkVXCitnY3J5X2FjX2tleV9nZXRfZ3JpcAkJTkVXCitnY3J5X2FjX2tleV9kZXN0cm95CQlORVcKK2djcnlfYWNfa2V5X3BhaXJfZGVzdHJveQlORVcKK2djcnlfYWNfZGF0YV9lbmNyeXB0CQlORVcKK2djcnlfYWNfZGF0YV9kZWNyeXB0CQlORVcKK2djcnlfYWNfZGF0YV9zaWduCQlORVcKK2djcnlfYWNfZGF0YV92ZXJpZnkJCU5FVworZ2NyeV9hY19pZF90b19uYW1lCQlORVcKK2djcnlfYWNfbmFtZV90b19pZAkJTkVXCitnY3J5X2hhbmRsZXJfcHJvZ3Jlc3NfdAkJTkVXCitnY3J5X2hhbmRsZXJfYWxsb2NfdAkJTkVXCitnY3J5X2hhbmRsZXJfc2VjdXJlX2NoZWNrX3QJTkVXCitnY3J5X2hhbmRsZV9yZWFsbG9jX3QJCU5FVworZ2NyeV9oYW5kbGVyX2ZyZWVfdAkJTkVXCitnY3J5X2hhbmRsZXJfbm9fbWVtX3QJCU5FVworZ2NyeV9oYW5kbGVyX2Vycm9yX3QJCU5FVworZ2NyeV9oYW5kbGVyX2xvZ190CQlORVcKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworTm90ZXdvcnRoeSBjaGFuZ2VzIGluIHZlcnNpb24gMS4xLjEyICgyMDAzLTAxLTIwKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKiBnY3J5X3BrX3NpZ24sIGdjcnlfcGtfdmVyaWZ5IGFuZCBnY3J5X3BrX2VuY3J5cHQgY2FuIG5vdyBoYW5kbGUgYW4KKyAgIG9wdGlvbmFsIHBrY3MxIGZsYWdzIHBhcmFtZXRlciBpbiB0aGUgUy1leHByZXNzaW9uLiAgQSBzaW1pbGFyIGZsYWcKKyAgIG1heSBiZSBwYXNzZWQgdG8gZ2NyeV9wa19kZWNyeXB0IGJ1dCBpdCBpcyBvbmx5IHN5bnRhY3RpY2FsbHkKKyAgIGltcGxlbWVudGVkLgorCisgKiBOZXcgY29udmVuaWVuY2UgbWFjcm8gZ2NyeV9tZF9nZXRfYXNub2lkLgorCisgKiBUaGVyZSBpcyBub3cgc29tZSByZWFsIHN0dWZmIGluIHRoZSBtYW51YWwuCisKKworTm90ZXdvcnRoeSBjaGFuZ2VzIGluIHZlcnNpb24gMS4xLjExICgyMDAyLTEyLTIxKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKiBEb24ndCBleHBvcnQgaW50ZXJuYWwgc3ltYm9scyBhbnltb3JlIChjdXJyZW50bHkgb25seSBmb3IgR05VIHN5c3RlbXMpCisKKyAqIE5ldyBhbGdvcml0aG06IE1ENAorCisgKiBJbXBsZW1lbnRlZCBjaXBoZXJ0ZXh0IHN0ZWFsaW5nLgorCisgKiBTbWFsbGVyIGJ1Z3MgZml4ZXMgYW5kIGEgZmV3IG5ldyBPSURzLgorCisgKiBJbnRlcmZhY2UgY2hhbmdlcyByZWxhdGl2ZSB0byB0aGUgMS4xLjggcmVsZWFzZToKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorZ2NyeV9jaXBoZXJfY3RzICAgICAgICAgICAgICAgICAgIE5FVworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKKworTm90ZXdvcnRoeSBjaGFuZ2VzIGluIHZlcnNpb24gMS4xLjEwICgyMDAyLTA5LTIwKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKiBGaXhlZCBzaGFyZWQgbGlicmFyeSBidWlsZHMgZm9yIGkzODYsIFBQQyBhbmQgU3BhcmMuCisKKyAqIEFkZGVkIHNpbXBsZSBiZW5jaG1hcmsgdG9vbC4KKworICogUmVwbGFjZWQgdGhlIGludGVybmFsIG11dGV4ZXMgYnkgY29kZSB3aGljaCBhdXRvbWF0aWNhbGx5IGFkYXB0cyB0bworICAgdGhlIHVzZWQgdGhyZWFkaW5nIGxpYnJhcnkuICBDdXJyZW50bHkgUHRoIGFuZCBQdGhyZWFkIGFyZQorICAgc3VwcG9ydGVkLiAgRm9yIG5vbi1FTEYgc3lzdGVtcyB0aGUgR05VIHRvb2xjaGFpbiBpcyBub3cgcmVxdWlyZWQuLgorCisgKiBBZGRlZCB1bnRlc3RlZCBzdXBwb3J0IHRvIGJ1aWxkIFdpbmRvd3MgRExMcy4KKworTm90ZXdvcnRoeSBjaGFuZ2VzIGluIHZlcnNpb24gMS4xLjkgKDIwMDItMDgtMjMpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICogU3VwcG9ydCBmb3IgcGxhaW4gb2xkIERFUy4KKworCitOb3Rld29ydGh5IGNoYW5nZXMgaW4gdmVyc2lvbiAxLjEuOCAoMjAwMi0wNi0yNSkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKiBNaW5vciBjbGVhbnVwcyBhbmQgZXhwb3J0ZWQgYSBmZXcgbmV3IGZ1bmN0aW9ucy4KKworICogSW50ZXJmYWNlIGNoYW5nZXMgcmVsYXRpdmUgdG8gdGhlIDEuMS43IHJlbGVhc2U6Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitnY3J5X21waV9kaXYgICAgICAgICAgICAgICAgICAgICAgTkVXCitnY3J5X21waV9tb2QgICAgICAgICAgICAgICAgICAgICAgTkVXCitnY3J5X21waV9pbnZtICAgICAgICAgICAgICAgICAgICAgTkVXCitnY3J5X21waV9zd2FwICAgICAgICAgICAgICAgICAgICAgTkVXCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK05vdGV3b3J0aHkgY2hhbmdlcyBpbiB2ZXJzaW9uIDEuMS43ICgyMDAyLTA1LTIxKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogTGliZ2NyeXB0IGlzIG5vdyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIKKyAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZTsgc2VlIHRoZSBSRUFETUUgZmlsZSBmb3IgZGV0YWlscy4gICAgCisgIAorKiBJdCBpcyBwb3NzaWJsZSB0byB1c2UgbGliZ2NyeXB0IHcvbyBpbnRpYWxpemVkIHNlY3VyZSBtZW1vcnkuCisKKyogTGliZ2NyeXB0IHNob3VsZCBub3cgYmUgdGhyZWFkIHNhZmUgYWZ0ZXIgdGhlIGluaXRpYWxpemF0aW9uLgorICBnY3J5X2NvbnRyb2wgKEdDUllDUkxfSU5JVElBTElaQVRJT05fRklOSVNIRUQsTlVMTCwwKSBzaG91bGQgaGF2ZQorICBiZWVuIGNhbGxlZCBiZWZvcmUgY3JlYXRpbmcgYWRkaXRpb25hbCB0aHJlYWRzLgorCisgKiBJbnRlcmZhY2UgY2hhbmdlcyByZWxhdGl2ZSB0byB0aGUgMS4xLjYgcmVsZWFzZToKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK0dDUllDVExfRElTQUJMRV9JTlRFUk5BTF9MT0NLSU5HICBORVcKK0dDUllDVExfRElTQUJMRV9TRUNNRU0gICAgICAgICAgICBORVcKK0dDUllDVExfSU5JVElBTElaQVRJT05fRklOSVNIRUQgICBORVcKK0dDUllDVExfSU5JVElBTElaQVRJT05fRklOSVNIRURfUCBORVcKK0dDUllDVExfQU5ZX0lOSVRJQUxJWkFUSU9OX1AgICAgICBORVcKK2djcnlfc3RyZHVwICAgICAgICAgICAgICAgICAgICAgICBORVcKK2djcnlfc2V4cF9jcmVhdGUgICAgICAgICAgICAgICAgICBORVcKK2djcnlfc2V4cF9uZXcgICAgICAgICAgICAgICAgICAgICBORVcKK2djcnlfc2V0X3Byb2dyZXNzX2hhbmRsZXIgICAgICAgICBORVcKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworTm90ZXdvcnRoeSBjaGFuZ2VzIGluIHZlcnNpb24gMS4xLjYgKDIwMDItMDItMDcpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAqIEVuaGFuY2VkIHRoZSBTLWV4cHJlc3Npb24gY29udmVyc2lvbiBmdW5jdGlvbnMuCisgICAgICAgIAorTm90ZXdvcnRoeSBjaGFuZ2VzIGluIHZlcnNpb24gMS4xLjUgKDIwMDEtMTItMTgpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAqIGdjcnlfe2NpcGhlcixtZH1fbWFwX25hbWUgYXJlIG5vdyBhYmxlIHRvIG1hcCBzdHJpbmdpZmllZCBvYmplY3QgSURzLgorCisgICogTmV3IGZ1bmN0aW9ucyBnY3J5X3NleHBfY2Fub25fbGVuIGFuZCBnY3J5X2NpcGhlcl9tb2RlX2Zyb21fb2lkLgorCisgICogQ2xvc2VkIHNvbWUgbWVtb3J5IGxlYWtzLgorCisKK05vdGV3b3J0aHkgY2hhbmdlcyBpbiB2ZXJzaW9uIDEuMS40ICgyMDAxLTA4LTAzKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgKiBBcmNmb3VyIGRvZXMgbm93IHdvcmsuICAgICAgICAgICAgICAgICAgIAorCisgICogU29tZSBtaW5vciBmaXhlcy4KKworICAqIEFkZGVkIGEgZmlyc3QgdGVzdCBwcm9ncmFtCisKKyAgKiBNaWdyYXRlZCB0byBhdXRvY29uZiAyLjUyLgorCisKK05vdGV3b3J0aHkgY2hhbmdlcyBpbiB2ZXJzaW9uIDEuMS4zICgyMDAxLTA1LTMxKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgKiBGaXJzdCByZWxlYXNlIG9mIExpYmdjcnlwdCB3aGljaCBpcyBhIHJlc3VsdCBvZiBzcGxpdHRpbmcgR251UEcKKyAgICBpbnRvIGludG8gbGliZ2NyeXB0IGFuZCBHbnVQRy4KKworCitDb3B5cmlnaHQgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNywgMjAwOCwKKyAgICAgICAgICAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0aGUgYXV0aG9yIGdpdmVzCit1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCitUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0IGV2ZW4gdGhlCitpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9SRUFETUUgYi9saWJnY3J5cHQtMS40LjYvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3M2JiNmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvUkVBRE1FCkBAIC0wLDAgKzEsMjcwIEBACisJCSAgICBMaWJnY3J5cHQgLSBUaGUgR05VIENyeXB0byBMaWJyYXJ5CisJCSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMS40LjYKKyAKKworICAgIENvcHlyaWdodCAyMDAwLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA3LCAyMDA4LAorICAgICAgICAgICAgICAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IGFzIGEgc3BlY2lhbCBleGNlcHRpb24gdGhlIGF1dGhvciBnaXZlcworICAgIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisgICAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQgZXZlbiB0aGUKKyAgICBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworCisKKyAgICBPdmVydmlldworICAgIC0tLS0tLS0tCisKKyAgICBMaWJnY3J5cHQgaXMgYSBnZW5lcmFsIHB1cnBvc2UgY3J5cHRvIGxpYnJhcnkgYmFzZWQgb24gdGhlIGNvZGUKKyAgICB1c2VkIGluIEdudVBHLiAgTGliZ2NyeXB0IGRlcGVuZHMgb24gdGhlIGxpYnJhcnkgYGxpYmdwZy1lcnJvcicsCisgICAgd2hpY2ggbXVzdCBiZSBpbnN0YWxsZWQgY29ycmVjdGx5IGJlZm9yZSBMaWJnY3J5cHQgaXMgdG8gYmUgYnVpbHQuCisgICAgTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMR1BMLCBzZWUgdGhlIHNlY3Rpb24gIkxpY2Vuc2UiCisgICAgYmVsb3cgZm9yIGRldGFpbHMuCisKKworICAgIEJ1aWxkIEluc3RydWN0aW9ucworICAgIC0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGhlIGRvd25sb2FkIGNhbm9uaWNhbCBsb2NhdGlvbiBmb3IgbGliZ2NyeXB0IGlzOgorCisgICAgICBmdHA6Ly9mdHAuZ251cGcub3JnL2djcnlwdC9saWJnY3J5cHQvCisgICAgIAorICAgIFRvIGJ1aWxkIGxpYmdjcnlwdCB5b3UgbmVlZCBsaWJncGctZXJyb3I6CisKKyAgICAgIGZ0cDovL2Z0cC5nbnVwZy5vcmcvZ2NyeXB0L2xpYmdwZy1lcnJvci8KKworICAgIFlvdSBzaG91bGQgZ2V0IHRoZSBsYXRlc3QgdmVyc2lvbnMgb2YgY291cnNlLgorCisgICAgQWZ0ZXIgYnVpbGRpbmcgYW5kIGluc3RhbGxpbmcgdGhlIGxpYmdwZy1lcnJvciBwYWNrYWdlLCB5b3UgbWF5CisgICAgY29udGludWUgd2l0aCBMaWJnY3J5cHQgaW5zdGFsbGF0aW9uIEFzIHdpdGggYWxsbW9zdCBhbGwgR05VCisgICAgcGFja2FnZXMsIHlvdSBqdXN0IGhhdmUgdG8gZG8KKworICAgICAgIC4vY29uZmlndXJlCisgICAgICAgbWFrZQorICAgICAgIG1ha2UgY2hlY2sKKyAgICAgICBtYWtlIGluc3RhbGwKKworICAgIFRoZSAibWFrZSBjaGVjayIgaXMgbm90IHJlcXVpcmVkIGJ1dCBhIGdvb2QgaWRlYSB0byBzZWUgd2hldGhlcgorICAgIHRoZSBsaWJyYXJ5IHdvcmtzIGFzIGV4cGVjdGVkLiAgVGhlIGNoZWNrIHRha2VzIHNvbWUgd2hpbGUgYW5kCisgICAgcHJpbnRzIHNvbWUgYmVuY2htYXJraW5nIHJlc3VsdHMuICBCZWZvcmUgZG9pbmcgIm1ha2UgaW5zdGFsbCIgeW91CisgICAgcHJvYmFibHkgbmVlZCB0byBiZWNvbWUgcm9vdC4KKworICAgIFRvIGJ1aWxkIGxpYmdjcnlwdCBmb3IgTWljcm9zb2Z0IFdpbmRvd3MsIHlvdSBuZWVkIHRvIGhhdmUgdGhlCisgICAgbWluZ3czMiBjcm9zcy1idWlsZGluZyB0b29sY2hhaW4gaW5zdGFsbGVkLiAgSW5zdGVhZCBvZiBydW5uaW5nIGEKKyAgICBwbGFpbiBjb25maWd1cmUgeW91IHVzZQorCisgICAgICAuL2F1dG9nZW4uc2ggLS1idWlsZC13MzIKKyAgICAgIG1ha2UKKyAgICAgIG1ha2UgaW5zdGFsbAorICAgICAgCisgICAgQnkgZGVmYXVsdCB0aGlzIGNvbW1hbmQgc2VxdWVuY2VzIGV4cGVjdHNkIGEgbGliZ3BnLWVycm9yCisgICAgaW5zdGFsbGVkIGJlbG93ICRIT01FL3czMnJvb3QgYW5kIGluc3RhbGxzIGxpYmdjcnlwdCB0byB0aGF0CisgICAgZGlyZWN0b3J5IHRvby4gIFNlZSB0aGUgYXV0b2dlbi5zaCBjb2RlIGZvciBkZXRhaWxzLgorCisgICAgVGhlIGRvY3VtZW50YXRpb24gaXMgYXZhaWxhYmxlIGFzIGFuIEluZm8gZmlsZSAoZ2NyeXB0LmluZm8pLiAgVG8KKyAgICBidWlsZCBkb2N1bWVudGF0aW9uIGluIFBERiwgcnVuIHRoaXM6CisKKyAgICAgIGNkIGRvYworICAgICAgbWFrZSBwZGYKKworCisKKyAgICBNYWlsaW5nIExpc3QKKyAgICAtLS0tLS0tLS0tLS0KKworICAgIFlvdSBtYXkgd2FudCB0byBqb2luIHRoZSBkZXZlbG9wZXIncyBtYWlsaW5nIGxpc3QKKyAgICBnY3J5cHQtZGV2ZWxAZ251cGcub3JnIGJ5IHNlbmRpbmcgbWFpbCB3aXRoIGEgc3ViamVjdCBvZgorICAgICJzdWJzY3JpYmUiIHRvIGdjcnlwdC1kZXZlbC1yZXF1ZXN0QGdudXBnLm9yZy4gIEFuIGFyY2hpdmUgb2YgdGhpcworICAgIGxpc3QgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly9saXN0cy5nbnVwZy5vcmcgLgorCisKKyAgICBDb25maWd1cmUgb3B0aW9ucyAKKyAgICAtLS0tLS0tLS0tLS0tLS0tLQorICAgIEhlcmUgaXMgYSBsaXN0IG9mIGNvbmZpZ3VyZSBvcHRpb25zIHdoaWNoIGFyZSBzb21ldGltZXMgdXNlZnVsIAorICAgIGZvciBpbnN0YWxsYXRpb24uCisKKyAgICAgLS1lbmFibGUtbS1ndWFyZAorICAgICAgICAgICAgICAgICAgICAgRW5hYmxlIHRoZSBpbnRlZ3JhdGVkIG1hbGxvYyBjaGVja2luZyBjb2RlLiBQbGVhc2UKKyAgICAgICAgICAgICAgICAgICAgIG5vdGUgdGhhdCB0aGlzIGZlYXR1cmUgZG9lcyBub3Qgd29yayBvbiBhbGwgQ1BVcworICAgICAgICAgICAgICAgICAgICAgKGUuZy4gU3VuT1MgNS43IG9uIFVsdHJhU3BhcmMtMikgYW5kIG1pZ2h0IGdpdmUKKyAgICAgICAgICAgICAgICAgICAgIHlvdSBhIGJ1cyBlcnJvci4KKworICAgICAtLWRpc2FibGUtYXNtCisgICAgICAgICAgICAgICAgICAgICBEbyBub3QgdXNlIGFzc2VtYmxlciBtb2R1bGVzLiAgSXQgaXMgbm90IHBvc3NpYmxlIAorICAgICAgICAgICAgICAgICAgICAgdG8gdXNlIHRoaXMgb24gc29tZSBDUFUgdHlwZXMuCisgICAgICAgICAgICAgICAgICAgIAorICAgICAtLWVuYWJsZS1sZC12ZXJzaW9uLXNjcmlwdAorICAgICAgICAgICAgICAgICAgICAgTGliZ2NyeXB0IHRyaWVzIHRvIGJ1aWxkIGEgbGlicmFyeSB3aGVyZSBpbnRlcm5hbAorICAgICAgICAgICAgICAgICAgICAgc3ltYm9scyBhcmUgbm90IGV4cG9ydGVkLiAgVGhpcyByZXF1aXJlcyBzdXBwb3J0CisgICAgICAgICAgICAgICAgICAgICBmcm9tIGxkIGFuZCBpcyBjdXJyZW50bHkgZW5hYmxlZCBmb3IgYSBmZXcgT1Nlcy4KKyAgICAgICAgICAgICAgICAgICAgIElmIHlvdSBrbm93IHRoYXQgeW91ciBsZCBzdXBwb3J0cyB0aGUgc28gY2FsbGVkCisgICAgICAgICAgICAgICAgICAgICBFTEYgdmVyc2lvbiBzY3JpcHRzLCB5b3UgY2FuIHVzZSB0aGlzIG9wdGlvbiB0bworICAgICAgICAgICAgICAgICAgICAgZm9yY2UgaXRzIHVzZS4gIE9UT0gsIGlmIHlvdSBnZXQgZXJyb3IgbWVzc2FnZQorICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgbGlua2VyLCB5b3UgcHJvYmFibHkgd2FudCB0byB1c2UgdGhpcworICAgICAgICAgICAgICAgICAgICAgb3B0aW9uIHRvIGRpc2FibGUgdGhlIHVzZSBvZiB2ZXJzaW9uIHNjcmlwdHMuCisgICAgICAgICAgICAgICAgICAgICBOb3RlLCB0aGF0IHlvdSBzaG91bGQgbmV2ZXIgZXZlciB1c2UgYW4KKyAgICAgICAgICAgICAgICAgICAgIHVuZG9jdW1lbnRlZCBzeW1ib2wgb3Igb25lIHdoaWNoIGlzIHByZWZpeGVkIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgIGFuIHVuZGVyc2NvcmUuIAorCisgICAgIC0tZW5hYmxlLWNpcGhlcnM9bGlzdAorICAgICAtLWVuYWJsZS1wdWJrZXktY2lwaGVycz1saXN0CisgICAgIC0tZW5hYmxlLWRpZ2VzdHM9bGlzdAorICAgICAgICAgICAgICAgICAgICAgSWYgbm90IG90aGVyd2lzZSBzcGVjaWZpZWQsIGFsbCBhbGdvcml0aG1zCisgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlZCBpbiB0aGUgbGliZ2NyeXB0IHNvdXJjZSB0cmVlIGFyZSBidWlsdC4KKwkJICAgICBBbiBleGNlcHRpb24gYXJlIGFsZ29yaXRobXMsIHdoaWNoIGRlcGVuZCBvbgorCQkgICAgIGZlYXR1cmVzIG5vdCBwcm92aWRlZCBieSB0aGUgc3lzdGVtLCBsaWtlIDY0Yml0CisJCSAgICAgZGF0YSB0eXBlcy4gIFdpdGggdGhlc2Ugc3dpdGNoZXMgaXQgaXMgcG9zc2libGUKKyAgICAgICAgICAgICAgICAgICAgIHRvIHNlbGVjdCBleGFjdGx5IHRob3NlIGFsZ29yaXRobSBtb2R1bGVzLCB3aGljaAorCQkgICAgIHNob3VsZCBiZSBidWlsdC4gIFRoZSBhbGdvcml0aG1zIGFyZSB0byBiZQorICAgICAgICAgICAgICAgICAgICAgc2VwYXJhdGVkIGJ5IHNwYWNlcywgY29tbWFzIG9yIGNvbG9ucy4gIFRvIHZpZXcKKyAgICAgICAgICAgICAgICAgICAgIHRoZSBsaXN0IHVzZWQgd2l0aCB0aGUgY3VycmVudCBidWlsZCB0aGUgcHJvZ3JhbQorICAgICAgICAgICAgICAgICAgICAgdGVzdHMvdmVyc2lvbiBtYXkgYmUgdXNlZC4KKworICAgICAtLWRpc2FibGUtZW5kaWFuLWNoZWNrCisgICAgICAgICAgICAgICAgICAgICBEb24ndCBsZXQgY29uZmlndXJlIHRlc3QgZm9yIHRoZSBlbmRpYW5uZXNzIGJ1dAorICAgICAgICAgICAgICAgICAgICAgdHJ5IHRvIHVzZSB0aGUgT1MgcHJvdmlkZWQgbWFjcm9zIGF0IGNvbXBpbGUKKyAgICAgICAgICAgICAgICAgICAgIHRpbWUuICBUaGlzIGlzIGhlbHBmdWwgdG8gY3JlYXRlIE9TIFggZmF0IGJpbmFyaWVzLgorCisgICAgIC0tZW5hYmxlLXJhbmRvbS1kYWVtb24KKyAgICAgICAgICAgICAgICAgICAgIEluY2x1ZGUgc3VwcG9ydCBmb3IgYSBnbG9iYWwgcmFuZG9tIGRhd21vbiBhbmQKKyAgICAgICAgICAgICAgICAgICAgIGJ1aWxkIHRoZSBkYWVtb24uICBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlLgorCisgICAgIC0tZW5hYmxlLW1waS1wYXRoPUVYVFJBX1BBVEgKKyAgICAgICAgICAgICAgICAgICAgIFByZXBlbmQgRVhUUkFfUEFUSCB0byBsaXN0IG9mIENQVSBzcGVjaWZpYworICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemF0aW9ucy4gIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byBhZGQKKyAgICAgICAgICAgICAgICAgICAgIG9wdGltaXphdGlvbnMgZm9ybiBhIEludGVsIFBlbnRpdW0gNCBjb21wYXRpYmxlCisgICAgICAgICAgICAgICAgICAgICBDUFUsIHlvdSBtYXkgdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAtLWVuYWJsZS1tcGktcGF0aD1wZW50aXVtNC9zc2UyOnBlbnRpdW00L21teAorICAgICAgICAgICAgICAgICAgICAgVGFrZSBjYXJlOiBUaGUgZ2VuZXJhdGVkIGxpYnJhcnkgbWF5IGNyYXNoIG9uCisgICAgICAgICAgICAgICAgICAgICBub24tY29tcGF0aWJsZSBDUFVzLgorCisgICAgIC0tZW5hYmxlLXJhbmRvbT1OQU1FIAorICAgICAgICAgICAgICAgICAgICAgRm9yY2UgdGhlIHVzZSBvZiB0aGUgcmFuZG9tIGdhdGhlcmluZyBtb2R1bGUKKwkJICAgICBOQU1FLiAgRGVmYXVsdCBpcyBlaXRoZXIgdG8gdXNlIC9kZXYvcmFuZG9tIG9yCisJCSAgICAgdGhlIGF1dG8gbW9kZS4gIFBvc3NpYmxlIHZhbHVlcyBmb3IgTkFNRSBhcmU6CisJCSAgICAgICBlZ2QgLSBVc2UgdGhlIG1vZHVsZSB3aGljaCBhY2Nlc3NlcyB0aGUKKwkJCSAgICAgRW50cm9weSBHYXRoZXJpbmcgRGFlbW9uLiBTZWUgdGhlIHdlYnBhZ2VzCisJCQkgICAgIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGl0LgorCQkgICAgICB1bml4IC0gVXNlIHRoZSBzdGFuZGFyZCBVbml4IG1vZHVsZSB3aGljaCBkb2VzIG5vdAorCQkJICAgICBoYXZlIGEgdmVyeSBnb29kIHBlcmZvcm1hbmNlLgorCQkgICAgIGxpbnV4IC0gVXNlIHRoZSBtb2R1bGUgd2hpY2ggYWNjZXNzZXMgL2Rldi9yYW5kb20uCisJCQkgICAgIFRoaXMgaXMgdGhlIGZpcnN0IGNob2ljZSBhbmQgdGhlIGRlZmF1bHQgb25lCisJCQkgICAgIGZvciBHTlUvTGludXggb3IgKkJTRC4KKyAgICAgICAgICAgICAgICAgICAgICBhdXRvIC0gQ29tcGlsZSBsaW51eCwgZWdkIGFuZCB1bml4IGluIGFuZCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hZ2ljYWxseSBzZWxlY3QgYXQgcnVudGltZS4KKyAgCisgICAgIC0tZW5hYmxlLWhtYWMtYmluYXJ5LWNoZWNrCisgICAgICAgICAgICAgICAgICAgICBJbmNsdWRlIHN1cHBvcnQgdG8gY2hlY2sgdGhlIGJpbmFyeSBhdCBydW50aW1lCisgICAgICAgICAgICAgICAgICAgICBhZ2FpbnN0IGEgSE1BQyBjaGVja3N1bS4gIFRoaXMgd29ya3Mgb25seSBpbiBGSVBTCisgICAgICAgICAgICAgICAgICAgICBtb2RlIGFuZCBvbiBzeXN0ZW1zIHByb3ZpZGluZyB0aGUgZGxhZGRyIGZ1bmN0aW9uLgorCisgICAgIC0tZGlzYWJsZS1wYWRsb2NrLXN1cHBvcnQKKyAgICAgICAgICAgICAgICAgICAgIERpc2FibGUgc3VwcG9ydCBmb3IgdGhlIFBhZExvY2sgZW5naW5lIG9mIFZJQQorICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29ycy4gIFRoZSBkZWZhdWx0IGlzIHRvIHVzZSBQYWRMb2NrIGlmCisgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUuICBUcnkgdGhpcyBpZiB5b3UgZ2V0IHByb2JsZW1zIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgIGFzc2VtYmxlciBjb2RlLgorCisgICAgIC0tZGlzYWJsZS1PLWZsYWctbXVuZ2luZworICAgICAgICAgICAgICAgICAgICAgU29tZSBjb2RlIGlzIHRvbyBjb21wbGV4IGZvciBzb21lIGNvbXBpbGVycyB3aGlsZQorICAgICAgICAgICAgICAgICAgICAgaW4gaGlnaGVyIG9wdGltaXphdGlvbiBtb2RlcywgdGh1cyB0aGUgY29tcGlsZXIKKyAgICAgICAgICAgICAgICAgICAgIGludm9jYXRpb24gaXMgbW9kaWZpZWQgdG8gdXNlIGEgbG93ZXIKKyAgICAgICAgICAgICAgICAgICAgIG9wdGltaXphdGlvbiBsZXZlbC4gIFVzdWFsbHkgdGhpcyB3b3JrcyB2ZXJ5IHdlbGwKKyAgICAgICAgICAgICAgICAgICAgIGJ1dCBvbiBzb21lIHBsYXRmb3JtcyB0aGVzZSBydWxlcyBicmVhayB0aGUKKyAgICAgICAgICAgICAgICAgICAgIGludm9jYXRpb24uICBUaGlzIG9wdGlvbiBtYXkgYmUgdXNlZCB0byBkaXNhYmxlCisgICAgICAgICAgICAgICAgICAgICB0aGUgZmVhdHVyZSB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IGVpdGhlciBnb29kCisgICAgICAgICAgICAgICAgICAgICBDRkxBR1MgYXJlIGdpdmVuIG9yIHRoZSBjb21waWxlciBjYW4gZ3JvayB0aGUgY29kZS4KKyAgICAgIAorCisgICAgQnVpbGQgUHJvYmxlbXMKKyAgICAtLS0tLS0tLS0tLS0tLQorCisgICAgV2UgY2FuJ3QgY2hlY2sgYWxsIGFzc2VtYmxlciBmaWxlcywgc28gaWYgeW91IGhhdmUgcHJvYmxlbXMKKyAgICBhc3NlbWJsaW5nIHRoZW0gKG9yIHRoZSBwcm9ncmFtIGNyYXNoZXMpIHVzZSAtLWRpc2FibGUtYXNtIHdpdGgKKyAgICAuL2NvbmZpZ3VyZS4gIElmIHlvdSBvcHQgdG8gZGVsZXRlIGluZGl2aWR1YWwgcmVwbGFjZW1lbnQgZmlsZXMgaW4KKyAgICBob3BlcyBvZiB1c2luZyB0aGUgcmVtYWluaW5nIG9uZXMsIGJlIGF3YXJlIHRoYXQgdGhlIGNvbmZpZ3VyZQorICAgIHNjcmlwdHMgbWF5IGNvbnNpZGVyIHNldmVyYWwgc3ViZGlyZWN0b3JpZXMgdG8gZ2V0IGFsbCBhdmFpbGFibGUKKyAgICBhc3NlbWJsZXIgZmlsZXM7IGJlIHN1cmUgdG8gZGVsZXRlIHRoZSBjb3JyZWN0IG9uZXMuICBOZXZlciBkZWxldGUKKyAgICB1ZGl2LXFybm5kLlMgaW4gYW55IENQVSBkaXJlY3RvcnksIGJlY2F1c2UgdGhlcmUgbWF5IGJlIG5vIEMKKyAgICBzdWJzdGl0dXRlIChpbiBtcGkvZ2VuZXJlaWMpLiAgRG9uJ3QgZm9yZ2V0IHRvIGRlbGV0ZQorICAgICJjb25maWcuY2FjaGUiIGFuZCBydW4gIi4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2siLiAgV2UgZ290IGEgZmV3CisgICAgcmVwb3J0cyBhYm91dCBwcm9ibGVtcyB1c2luZyB2ZXJzaW9ucyBvZiBnY2MgZWFybGllciB0aGFuIDIuOTYKKyAgICBhbG9uZyB3aXRoIGEgbm9uLUdOVSBhc3NlbWJsZXIgKGFzKS4gIElmIHRoaXMgYXBwbGllcyB0byB5b3VyCisgICAgcGxhdGZvcm0sIHlvdSBjYW4gZWl0aGVyIHVwZ3JhZGUgZ2NjIHRvIGEgbW9yZSByZWNlbnQgdmVyc2lvbiwgb3IKKyAgICB1c2UgdGhlIEdOVSBhc3NlbWJsZXIuCisKKyAgICBTb21lIG1ha2UgdG9vbHMgYXJlIGJyb2tlbiAtIHRoZSBiZXN0IHNvbHV0aW9uIGlzIHRvIHVzZSBHTlUncworICAgIG1ha2UuICBUcnkgZ21ha2Ugb3IgZ3JhYiB0aGUgc291cmNlcyBmcm9tIGEgR05VIGFyY2hpdmUgYW5kCisgICAgaW5zdGFsbCB0aGVtLgorCisgICAgU3BlY2lmaWMgcHJvYmxlbXMgb24gc29tZSBtYWNoaW5lczoKKworICAgICAgKiBJQk0gUlMvNjAwMCBydW5uaW5nIEFJWAorCisJRHVlIHRvIGEgY2hhbmdlIGluIGdjYyAoc2luY2UgdmVyc2lvbiAyLjgpIHRoZSBNUEkgc3R1ZmYgbWF5CisJbm90IGJ1aWxkLiBJbiB0aGlzIGNhc2UgdHJ5IHRvIHJ1biBjb25maWd1cmUgdXNpbmc6CisJICAgIENGTEFHUz0iLWcgLU8yIC1tY3B1PXBvd2VycGMiIC4vY29uZmlndXJlCisKKyAgICAgICogU1ZSNC4yIChFU0lYIFY0LjIgY2MpCisKKyAgICAgICAgRHVlIHRvIHByb2JsZW1zIHdpdGggdGhlIEVTSVggYXMoMSksIHlvdSBwcm9iYWJseSB3YW50IHRvIGRvOgorICAgICAgICAgICAgQ0ZMQUdTPSItTyAtSyBwZW50aXVtIiAuL2NvbmZpZ3VyZSAtLWRpc2FibGUtYXNtCisKKyAgICAgICogU3VuT1MgNC4xLjQKKyAgICAgIAorICAgICAgICAgLi9jb25maWd1cmUgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPXllcworCisgICAgICAqIFNwYXJjNjQgQ1BVcworCisgICAgICAgIFdlIGhhdmUgcmVwb3J0cyBhYm91dCBmYWlsdXJlcyBpbiB0aGUgQUVTIG1vZHVsZSB3aGVuCisgICAgICAgIGNvbXBpbGluZyB1c2luZyBnY2MgKGUuZy4gdmVyc2lvbiA0LjEuMikgYW5kIHRoZSBvcHRpb24gLU8zOworICAgICAgICB1c2luZyAtTzIgc29sdmVzIHRoZSBwcm9ibGVtLgorCisKKworICAgIExpY2Vuc2UKKyAgICAtLS0tLS0tCisgICAgCisgICAgVGhlIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyCisgICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoTEdQTCk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQiBmb3IgdGhlCisgICAgYWN0dWFsIHRlcm1zLiAgVGhlIGhlbHBlciBwcm9ncmFtcyAoZS5nLiBnY3J5cHRybmQgYW5kIGdldHJhbmRvbSkKKyAgICBhcyB3ZWxsIGFzIHRoZSBkb2N1bWVudGF0aW9uIGFyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YKKyAgICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciB0aGUKKyAgICBhY3R1YWwgdGVybXMuCisKKyAgICBUaGlzIGxpYnJhcnkgdXNlZCB0byBiZSBhdmFpbGFibGUgdW5kZXIgdGhlIEdQTCAtIHRoaXMgd2FzIGNoYW5nZWQKKyAgICB3aXRoIHZlcnNpb24gMS4xLjcgd2l0aCB0aGUgcmF0aW9uYWxlIHRoYXQgdGhlcmUgYXJlIG5vdyBtYW55IGZyZWUKKyAgICBjcnlwdG8gbGlicmFyaWVzIGF2YWlsYWJsZSBhbmQgbWFueSBvZiB0aGVtIGNvbWUgd2l0aCBjYXBhYmlsaXRpZXMKKyAgICBzaW1pbGFyIHRvIExpYmNyeXB0LiAgV2UgZGVjaWRlZCB0aGF0IHRvIGZvc3RlciB0aGUgdXNlIG9mCisgICAgY3J5cHRvZ3JhcGh5IGluIEZyZWUgU29mdHdhcmUgYW4gTEdQTGVkIGxpYnJhcnkgd291bGQgbWFrZSBtb3JlCisgICAgc2Vuc2UgYmVjYXVzZSBpdCBhdm9pZHMgcHJvYmxlbXMgZHVlIHRvIGxpY2Vuc2UgaW5jb21wYXRpYmlsaXRpZXMKKyAgICBiZXR3ZWVuIHNvbWUgRnJlZSBTb2Z0d2FyZSBsaWNlbnNlcyBhbmQgdGhlIEdQTC4KKworICAgIFBsZWFzZSBub3RlIHRoYXQgaW4gbWFueSBjYXNlcyBpdCBpcyBiZXR0ZXIgZm9yIGEgbGlicmFyeSB0byBiZQorICAgIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwsIHNvIHRoYXQgaXQgcHJvdmlkZXMgYW4gYWR2YW50YWdlIGZvciBmcmVlCisgICAgc29mdHdhcmUgcHJvamVjdHMuICBUaGUgTGVzc2VyIEdQTCBpcyBzbyBuYW1lZCBiZWNhdXNlIGl0IGRvZXMKKyAgICBsZXNzIHRvIHByb3RlY3QgdGhlIGZyZWVkb20gb2YgdGhlIHVzZXJzIG9mIHRoZSBjb2RlIHRoYXQgaXQKKyAgICBjb3ZlcnMuICBTZWUgaHR0cDovL3d3dy5nbnUub3JnL3BoaWxvc29waHkvd2h5LW5vdC1sZ3BsLmh0bWwgZm9yCisgICAgbW9yZSBleHBsYW5hdGlvbi4KKworCisgICAgQ29udGFjdAorICAgIC0tLS0tLS0KKworICAgIFNlZSB0aGUgZmlsZSBBVVRIT1JTLgorCisgICAgQ29tbWVyY2lhbCBncmFkZSBzdXBwb3J0IGZvciBMaWJnY3J5cHQgaXMgYXZhaWxhYmxlOyBwbGVhc2Ugc2VlCisgICAgaHR0cDovL3d3dy5nbnVwZy5vcmcvc2VydmljZS5odG1sIC4KKworCisgIFRoaXMgZmlsZSBpcyBGcmVlIFNvZnR3YXJlOyBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRoZSBhdXRob3JzIGdpdmVzCisgIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsIHdpdGggb3Igd2l0aG91dAorICBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4gRm9yIGNvbmRpdGlvbnMKKyAgb2YgdGhlIHdob2xlIHBhY2thZ2UsIHBsZWFzZSBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIFRoaXMgZmlsZSBpcworICBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKKyAgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCisgIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L1JFQURNRS5TVk4gYi9saWJnY3J5cHQtMS40LjYvUkVBRE1FLlNWTgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTE3OTIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L1JFQURNRS5TVk4KQEAgLTAsMCArMSw1MSBAQAorSWYgeW91IGFyZSBidWlsZGluZyBmcm9tIENWUywgcnVuIHRoZSBzY3JpcHQKKworLi9hdXRvZ2VuLnNoCisKK2ZpcnN0LCB0byBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSBhbGwgdGhlIG5lY2Vzc2FyeSBtYWludGFpbmVyIHRvb2xzCithcmUgaW5zdGFsbGVkIGFuZCB0byBidWlsZCB0aGUgYWN0dWFsIGNvbmZpZ3VyYXRpb24gZmlsZXMuICBUaGVuIHJ1bgorCisuL2NvbmZpZ3VyZSAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUKKworZm9sbG93ZWQgYnkgdGhlIHVzdWFsIG1ha2UuCisKK0lmIGF1dG9nZW4uc2ggY29tcGxhaW5zIGFib3V0IGluc3VmZmljaWVudCB2ZXJzaW9ucyBvZiB0aGUgcmVxdWlyZWQKK3Rvb2xzLCBvciB0aGUgdG9vbHMgYXJlIG5vdCBpbnN0YWxsZWQsIHlvdSBtYXkgdXNlIGVudmlyb25tZW50Cit2YXJpYWJsZXMgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgdG9vbCBuYW1lczoKKworIEFVVE9NQUtFX1NVRkZJWCAgaXMgdXNlZCBhcyBhIHN1ZmZpeCBmb3IgYWxsIHRvb2xzIGZyb20gdGhlIGF1dG9tYWtlCisgICAgICAgICAgICAgICAgICBwYWNrYWdlLiAgRm9yIGV4YW1wbGUgCisgICAgICAgICAgICAgICAgICAgICBBVVRPTUFLRV9TVUZGSVg9Ii0xLjciIC4vYXV0b2dlbi5zaAorICAgICAgICAgICAgICAgICAgdXNlcyAiYXV0b21ha2UtMS43IiBhbmQgImFjbG9jYWwtMS43LgorIEFVVE9NQUtFX1BSRUZJWCAgaXMgdXNlZCBhcyBhIHByZWZpeCBmb3IgYWxsIHRvb2xzIGZyb20gdGhlIGF1dG9tYWtlCisgICAgICAgICAgICAgICAgICBwYWdlIGFuZCBtYXkgYmUgY29tYmluZWQgd2l0aCBBVVRPTUFLRV9TVUZGSVguIGUuZy46CisgICAgICAgICAgICAgICAgICAgIEFVVE9NQUtFX1BSRUZJWD0vdXNyL2Zvby9iaW4gLi9hdXRvZ2VuLnNoCisgICAgICAgICAgICAgICAgICB1c2VzICJhdXRvbWFrZSIgYW5kICJhY2xvY2FsIiBpbiB0aGUgL3Vzci9mb28vYmluCisgICAgICAgICAgICAgICAgICBkaXJlY3RvcnkuCisgQVVUT0NPTkZfU1VGRklYICBpcyB1c2VkIGFzIGEgc3VmZml4IGZvciBhbGwgdG9vbHMgZnJvbSB0aGUgYXV0b21ha2UKKyAgICAgICAgICAgICAgICAgIHBhY2thZ2UKKyBBVVRPQ09ORl9QUkVGSVggIGlzIHVzZWQgYXMgYSBwcmVmaXggZm9yIGFsbCB0b29scyBmcm9tIHRoZSBhdXRvbWFrZQorICAgICAgICAgICAgICAgICAgcGFja2FnZQorIEdFVFRFWFRfU1VGRklYICAgaXMgdXNlZCBhcyBhIHN1ZmZpeCBmb3IgYWxsIHRvb2xzIGZyb20gdGhlIGdldHRleHQKKyAgICAgICAgICAgICAgICAgIHBhY2thZ2UKKyBHRVRURVhUX1BSRUZJWCAgIGlzIHVzZWQgYXMgYSBwcmVmaXggZm9yIGFsbCB0b29scyBmcm9tIHRoZSBnZXR0ZXh0CisgICAgICAgICAgICAgICAgICBwYWNrYWdlCisKK0l0IGlzIGFsc28gcG9zc2libGUgdG8gdXNlIHRoZSB2YXJpYWJsZSBuYW1lIEFVVE9NQUtFLCBBVVRPQ09ORiwKK0FDTE9DQUwsIEFVVE9IRUFERVIsIEdFVFRFWFQgYW5kIE1TR01FUkdFIHRvIGRpcmVjdGx5IHNwZWNpZnkgdGhlIG5hbWUKK29mIHRoZSBwcm9ncmFtcyB0byBydW4uICBJdCBpcyBob3dldmVyIGJldHRlciB0byB1c2UgdGhlIHN1ZmZpeCBhbmQKK3ByZWZpeCBmb3JtcyBhcyBkZXNjcmliZWQgYWJvdmUgYmVjYXVzZSB0aGF0IGRvZXMgbm90IHJlcXVpcmUKK2tub3dsZWRnZSBhYm91dCB0aGUgYWN0dWFsIHRvb2xzIHVzZWQgYnkgYXV0Z2VuLnNoLgorCisKK1BsZWFzZSBkb24ndCB1c2UgYXV0b3BvaW50LCBsaWJ0b29saXplIG9yIGF1dG9yZWNvbmYgdW5sZXNzIHlvdSBhcmUKK3RoZSBjdXJyZW50IG1haW50YWluZXIgYW5kIHdhbnQgdG8gdXBkYXRlIHRoZSBzdGFuZGFyZCBjb25maWd1cmF0aW9uCitmaWxlcy4gIEFsbCB0aG9zZSBmaWxlcyBzaG91bGQgYmUgaW4gdGhlIENWUyBhbmQgb25seSB1cGRhdGVkIG1hbnVhbGx5CitpZiB0aGUgbWFpbnRhaW5lciBkZWNpZGVzIHRoYXQgbmV3ZXIgdmVyc2lvbnMgYXJlIHJlcXVpcmVkLiAgVGhlCittYWludGFpbmVyIHNob3VsZCBhbHNvIG1ha2Ugc3VyZSB0aGF0IHRoZSByZXF1aXJlZCB2ZXJzaW9uIG9mIGF1dG9tYWtlCitldCBhbC4gYXJlIHByb3Blcmx5IGluZGljYXRlZCBhdCB0aGUgdG9wIG9mIGNvbmZpZ3VyZS5hYyBhbmQgdGFrZSBjYXJlCit0byBjb3B5IHRoZSBmaWxlcyBhbmQgbm90IG1lcmVseSB1c2Ugc3ltbGlua3MuCisKKworCisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9USEFOS1MgYi9saWJnY3J5cHQtMS40LjYvVEhBTktTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNDk3NGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvVEhBTktTCkBAIC0wLDAgKzEsMTU5IEBACitMaWJnY3J5cHQgaXMgYmFzZWQgb24gdGhlIEdudVBHIGNvZGUuICBIZXJlIGlzIGEgbGlzdCBvZiBwZW9wbGUsIHdobworaGVscGVkIGluIEdudVBHIGFuZCBMaWJnY3J5cHQgZGV2ZWxvcG1lbnQuICBQbGVhc2UgaGVscCB1cyB0byBrZWVwIGl0Citjb21wbGV0ZSBhbmQgZnJlZSBvZiBlcnJvcnMuCisKK0FsYmVydCBDaGluICAgICAgICAgICAgICAgIGNoaW5hIGF0IHRoZXdyaXR0ZW53b3JkIGNvbQorQWxsYW4gQ2xhcmsJCSAgIGFsbGFuY0BzY28uY29tCitBbmFuZCBLdW1yaWEJCSAgIHdpbGRmaXJlQHByb2dzb2MudXRzLmVkdS5hdQorQW5kcmVhcyBNZXR6bGVyICAgICAgICAgICAgYW1ldHpsZXIgYXQgZG93bmhpbGwuYXQuZXUub3JnCitBcmllbCBUIEdsZW5uCQkgICBhcmllbEBjb2x1bWJpYS5lZHUKK0JvZG8gTW9lbGxlcgkJICAgQm9kb19Nb2VsbGVyQHB1YmxpYy51bmktaGFtYnVyZy5kZQorQnJlbm5vIGRlIFdpbnRlcgkgICBicmVubm9AZGV3aW50ZXIuY29tCitCcmlhbiBNb29yZQkJICAgYmVtQGNtYy5uZXQKK0JyaWFuIFdhcm5lcgkJICAgd2FybmVyQGxvdGhhci5jb20KK0JyaWV1YyBKZXVuaG9tbWUJICAgYmJwQHZpYS5lY3AuZnIKK0JyeWFuIEZ1bGxlcnRvbiAJICAgYnJ5YW5mQHNhbXVyYWkuY29tCitDYXNrZXkgTC4gRGlja3NvbgkgICBjYXNrZXlAdGVjaG5vY2FnZS5jb20KK0NlZXMgdmFuIGRlIEdyaWVuZAkgICBjZWVzLWxpc3RAZ3JpZW5kLnhzNGFsbC5ubAorQ2hhcmxlcyBMZXZlcnQJCSAgIGNoYXJsZXNAY29tbS5wb2x5bXRsLmNhCitDaHJpc3RpYW4gQmllcmUgICAgICAgICAgICBjaHJpc3RpYW5iaWVyZUBnbXguZGUKK0NocmlzdGlhbiBHcm90aG9mZiAgICAgICAgIGdyb3Rob2ZmQGNzLnB1cmR1ZS5lZHUKK0NocmlzdGlhbiB2b24gUm9xdWVzCSAgIHJvcXVlc0Bwb25kLnN1Yi5vcmcKK0NocmlzdG9waGVyIE9saXZlcgkgICBvbGl2ZXJAZnJpdHoudHJhdmVyc2UubmV0CitDaHJpc3RpYW4gUmVja3RlbndhbGQJICAgY2hyaXNAY2l0ZWNzLmRlCitEYW5pZWwgRWlzZW5idWQgCSAgIGVpc2VuYnVkQGNzLnN3YXJ0aG1vcmUuZWR1CitEYW5pZWwgS29lbmluZwkJICAgZGFuQG1haWwuaXNpcy5kZQorRGF2aWQgRWxsZW1lbnQJCSAgIGVsbGVtZW50QHNkZC5ocC5jb20KK0RldGxlZiBMYW5uZXJ0CQkgICBsYW5uZXJ0QGxhbm5lcnQucnoudW5pLWR1ZXNzZWxkb3JmLmRlCitEaXJrIExhdHRlcm1hbm4gCSAgIGRsYXR0QHQtb25saW5lLmRlCitEaXJrIFN0b2Vja2VyICAgICAgICAgICAgICBnY3J5cHRAZHN0b2Vja2VyLmRlCitFZCBCb3JhYXMJCSAgIGVjeGpvQGVzcGVyYW50by5vcmcKK0VsaWUgRGUgQnJhdXdlciAgICAgICAgICAgIGVsaWVAZGUtYnJhdXdlci5iZQorRW56byBNaWNoZWxhbmdlbGkJICAgZW1ATWFpbEFuZE5ld3MuY29tCitFcm5zdCBNb2xpdG9yCQkgICBlcm5zdC5tb2xpdG9yQHVuaS1ib25uLmRlCitGYWJpbyBDb2F0dGkJCSAgIGNvdmFAZmVsaXgudW5pZmUuaXQKK0ZlbGl4IHZvbiBMZWl0bmVyCSAgIGxlaXRuZXJAYW1kaXYuZGUKK0ZyYW5rIEhlY2tlbmJhY2gJICAgaGVja2VuYkBtaS51bmktZXJsYW5nZW4uZGUKK0ZyYW5rIFN0YWphbm8JCSAgIGZyYW5rLnN0YWphbm9AY2wuY2FtLmFjLnVrCitHYWJyaWVsZSBNb250aSAgICAgICAgICAgICBwc2ljdXM3OCBnbWFpbCBjb20KK0dhw6tsIFF1w6lyaQkJICAgZ3F1ZXJpQG1haWwuZG90Y29tLmZyCitHcmVnb3IgUmllcGwgICAgICAgICAgICAgICBzZXRvLWt1bkBmcmVlc3VyZi5jaAorR2VybGluZGUgS2xhZXMgICAgICAgICAgICAgZ2tAdTY0LmRlCitHcmVnIExvdWlzCQkgICBnbG91aXNAZHluYW1pY3JvLm9uLmNhCitHcmVnIFRyb3hlbAkJICAgZ2R0QGlyLmJibi5jb20KK0dyZWdvcnkgU3RldWNrCQkgICBzdGV1Y2tAaW5hbWUuY29tCitHZW9mZiBLZWF0aW5nCQkgICBnZW9mZmtAb3plbWFpbC5jb20uYXUKK0hhcmFsZCBEZW5rZXIJCSAgIGhhcnJ5QGhhbC53ZXN0ZmFsZW4uZGUKK0hlbmRyaWsgQnVzY2hrYW1wCSAgIGJ1c2Noa2FtcEByaGV1bWFuZXQub3JnCitIb2xnZXIgU2NodXJpZwkJICAgaG9sZ2VyQGQub20ub3JnCitIdWdoIERhbmllbAkJICAgaHVnaEB0b2FkLmNvbQorSWFuIE1jS2VsbGFyCQkgICBpbWNrZWxsYXJAaGFydmVzdHJvYWQuY29tLmF1CitJYW4gUGV0ZXJzICAgICAgICAgICAgICAgICBpdHBAeGltaWFuLmNvbQorSmFudXN6IEEuIFVyYmFub3dpY3oJICAgYWxleEBib2ZoLnRvcnVuLnBsCitKYW1lcyBUcm91cAkJICAgamFtZXNAbm9jcmV3Lm9yZworSmVhbi1sb3VwIEdhaWxseQkgICBnemlwQHByZXAuYWkubWl0LmVkdQorSmVmZiBKb2huc29uICAgICAgICAgICAgICAgamJqQHJlZGhhdC5jb20KK0plbnMgQmFjaGVtCQkgICBiYWNoZW1AcnJ6LnVuaS1rb2Vsbi5kZQorSiBIb3JhY2lvIE1HCQkgICBob21lZ2FAY2liZXJpYS5lcworSm9hY2hpbSBCYWNrZXMJCSAgIGJhY2tlc0ByaHJrLnVuaS1rbC5kZQorSm9yZGkgTWFsbGFjaCAgICAgICAgICAgICAgam9yZGlAc2luZG9taW5pby5uZXQKK0pvaG4gQS4gTWFydGluCQkgICBqYW1AamFtdXguY29tCitKb2hubnkgVGV2ZcOfZW4JCSAgIGoudGV2ZXNzZW5AZ214LmRlCitKw7ZyZyBTY2hpbGxpbmcJCSAgIHNjaGlsbGluZ0Bmb2t1cy5nbWQuZGUKK0p1biBLdXJpeWFtYQkJICAga3VyaXlhbWFAc2t5LnJpbS5vci5qcAorS2FybCBGb2dlbAkJICAga2ZvZ2VsQGd1YW5hYmFuYS5vbnNob3JlLmNvbQorS2Fyc3RlbiBUaHlnZXNlbgkgICBrYXJ0aHlAa29tLmF1Yy5kaworS2F0c3VoaXJvIEtvbmRvdQkgICBrb25kb3VAbmVjLmNvLmpwCitLYXp1IFlhbWFtb3RvCQkgICBrYXp1QGlpamxhYi5uZXQKK0xhcnMgS2VsbG9nZy1TdGVkbWFuCSAgIGxhcnNAYnUuZWR1CitMZWUgRmlzaGVyICAgICAgICAgICAgICAgICBibGliYmV0IGF0IGdtYWlsIGRvdCBjb20KK01hcmNvIGQnSXRyaSAgICAgICAgICAgICAgIG1kQGxpbnV4Lml0CitNYXJrIEFkbGVyCQkgICBtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1CitNYXJrIEVsYnJlY2h0CQkgICBzbm93YmFsbDNAYmlnZm9vdC5jb20KK01hcmt1cyBGcmllZGwJCSAgIE1hcmt1cy5GcmllZGxAaW5mb3JtYXRpay51bmktZXJsYW5nZW4uZGUKK01hdHRoaWFzIFVybGljaHMgICAgICAgICAgIHNtdXJmQHNtdXJmLm5vcmlzLmRlCitNYXJ0aW4gS2FobGVydAkJICAgbWFydGluLmthaGxlcnRAcHJvdmkuZGUKK01hcnRpbiBIYW1pbHRvbgorTWFydGluIFNjaHVsdGUJCSAgIHNjaHVsdGVAdGhwLnVuaS1rb2Vsbi5kZQorTWF0dGhldyBTa2FsYQkJICAgbXNrYWxhQGFuc3V6LnNvb2tlLmJjLmNhCitNYXggS2VsbGVybWFubiAgICAgICAgICAgICBtYXhAZHVlbXBlbC5vcmcKK01heCBWYWxpYW5za2l5CQkgICBtYXhjb21AbWF4Y29tLm1sLm9yZworTWljaGFlbCBGaXNjaGVyIHYuIE1vbGxhcmQgbWZ2bUBnbXguZGUKK01pY2hhZWwgUm90aAkJICAgbXJvdGhAbmVzc2llLmRlCitNaWNoYWVsIFNvYm9sZXYgCSAgIG1zc0BkZXNwYWlyLnRyYW5zYXMuY29tCitNaWNoZWxlIEJhbGRlc3NhcmkJICAgbWljaGVsZUBwdXBhenpvLm9yZworTW9kZXN0YXMgVmFpbml1cwkgICBnZXJvbWFuYXNAbWFpbGFzLmNvbQorTmVpbCBEdW5iYXIgICAgICAgICAgICAgICAgbmVpbC5kdW5iYXIgYXQgcG9ib3guY29tCitOZWlsIFNwcmluZwkJICAgbnNwcmluZ0Bjcy53YXNoaW5ndG9uLmVkdQorTmV3dG9uIEhhbW1ldCAgICAgICAgICAgICAgbmV3dG9uQGhhbW1ldC5uZXQKK05pY29sYXMgR3JhbmVyCQkgICBOaWNvbGFzLkdyYW5lckBjcmkudS1wc3VkLmZyCitOSUlCRSBZdXRha2EJCSAgIGduaWliZUBjaHJvb3Qub3JnCitOaWtsYXMgSGVybmFldXMKK05pa29sYXkgU3R1cm0JCSAgIHN0dXJtQHNlYy5pbmZvcm1hdGlrLnR1LWRhcm1zdGFkdC5kZQorTmlrb3MgTWF2cm95YW5vcG91bG9zICAgICAgbm1hdkBoZWxsdWcuZ3IKK05pbXJvZCBaaW1lcm1hbiAJICAgemltZXJtYW5AZm9yZnJlZS5hdAorTiBKIERveWUJCSAgIG5pY0BuaXNzLmFjLnVrCitPbGl2ZXIgSGFha2VydAkJICAgaGFha2VydEBoc3AuZGUKK09za2FyaSBKw6TDpHNrZWzDpGluZW4JICAgZjMzMDAzYUBjYy5odXQuZmkKK1BhdWwgRC4gU21pdGgJCSAgIHBzbWl0aEBiYXluZXR3b3Jrcy5jb20KK1BoaWxpcHBlIExhbGliZXJ0ZQkgICBhcnNwaGxAb2VpbC5xYy5jYQorUGV0ZXIgR3V0bWFubgkJICAgcGd1dDAwMUBjcy5hdWNrbGFuZC5hYy5uegorUWluZ0xvbmcJCSAgIHFpbmdsb25nQGJvbGl6bS5paGVwLnN1CitSYWZhZWwgw4F2aWxhIGRlIEVzcMOtbmRvbGEgIHJhZmFlbC5lc3BpbmRvbGFAZ21haWwuY29tCitSYWZhw6tsIENhcnLDqSAgICAgICAgICAgICAgIGZ1bm1hbkB2aWRlb2xhbi5vcmcKK1JhbGYgRmFzc2VsICAgICAgICAgICAgICAgIHJhbGZAYWt1dGVjaC5kZQorUmFsZiBIaWxkZWJyYW5kdCAgICAgICAgICAgUmFsZi5IaWxkZWJyYW5kdEBpbm5vbWluYXRlLmNvbSAKK1JhbGYgU2NobmVpZGVyICAgICAgICAgICAgIHJhbGZAdGFwZmVyZS1zY2huZWlkZXJsZWlucy5kZQorUmFscGggR2lsbGVuCQkgICBnaWxsZW5AdGhlb2NoZW0udW5pLWR1ZXNzZWxkb3JmLmRlCitSYW1pIExlaHRpICAgICAgICAgICAgICAgICBSYW1pLkxlaHRpQGZpbmxhbmQuc3VuLmNvbQorUmFuZG9scGggQ2h1bmcgICAgICAgICAgICAgdGF1c3FAZGViaWFuLm9yZworUmFuZHkJCQkgICBtY2NsZWxsckBvaXQuZWR1CitSYXQJCQkgICByYXRpbm94QHBlb3J0aC5nd2VlcC5uZXQKK1JlaW5oYXJkIFdvYnN0CQkgICBSLldvYnN0QGlmdy1kcmVzZGVuLmRlCitSw6ltaSBHdXlvbWFyY2gJCSAgIHJndXlvbUBtYWlsLmRvdGNvbS5mcgorUmV1YmVuIFN1bW5lcgkJICAgcmFzdW1uZXJAd2lzZG9tLndlaXptYW5uLmFjLmlsCitSaWNoYXJkIE91dGVyYnJpZGdlCSAgIG91dGVyQGludGVybG9nLmNvbQorUm9kZHkgU3RyYWNoYW4JCSAgIHJvZGR5QHNhdGxpbmsuY29tLmF1CitSb2xhbmQgUm9zZW5mZWxkCSAgIHJvbGFuZEBzcGlubmFrZXIucmhlaW4uZGUKK1Jvc3MgR29sZGVyCQkgICByb3NzaWdlZUBiaWdmb290LmNvbQorU2VyZ2UgTXVuaG92ZW4JCSAgIG11bmhvdmVuQG1lbWEudWNsLmFjLmJlCitTaW1vbiBKb3NlZnNzb24gICAgICAgICAgICBqYXNAZXh0dW5kby5jb20KK1NMIEJhdXIgCQkgICBzdGV2ZUB4ZW1hY3Mub3JnCitTdGVwaGFuIEF1c3Rlcm11ZWhsZSAgICAgICBhdUBoY3NkLmRlCitTdGVwaGFuIE3DvGxsZXIgICAgICAgICAgICAgc211ZWxsZXIgYXQgYXRzZWMgY29tCitTdGVwaGFuZSBDb3J0aGVzeSAgICAgICAgICBzdGVwaGFuZUBzZW50ZS5jaAorU3RlZmFuIEthcnJtYW5uIAkgICBTLkthcnJtYW5uQGdteC5uZXQKK1N0ZWZhbiBLZWxsZXIJCSAgIGRyZXNAY3MudHUtYmVybGluLmRlCitTdGVmZmVuIFVsbHJpY2ggCSAgIGNjcmxwaHJAeGVuc2VpLmNvbQorU3RlZmZlbiBaYWhuCQkgICB6YWhuQGJlcmxpbi5zbmFmdS5kZQorU3RldmVuIEJha2tlcgkJICAgc3RldmVuQGljb2UuYXR0LmNvbQorU3VzYW5uZSBTY2h1bHR6IAkgICBzY2h1bHR6QGhzcC5kZQorU3pha2F0cyBJc3R2YW4gICAgICAgICAgICAgc3pha2kubXNAZ21haWwuY29tCitUaGlhZ28gSnVuZyBCYXVlcm1hbm4JICAganVuZ21hbm5AY3diLm1hdHJpeC5jb20uYnIKK1Rob21hcyBSb2Vzc2xlciAJICAgcm9lc3NsZXJAZ3V1Zy5kZQorVG9tIEhvbHJveWQgICAgICAgICAgICAgICAgdG9taEBwby5jcmwuZ28uanAKK1RvbSBTcGluZGxlcgkJICAgZG9nY293QGhvbWUubWVyaXQuZWR1CitUb20gWmVydWNoYQkJICAgdHplcnVjaEBjZWRkZWMuY29tCitUb21hcyBGYXN0aAkJICAgdG9tYXMuZmFzdGhAdHdpbnNwb3QubmV0CitUb21taSBLb211bGFpbmVuICAgICAgICAgICBUb21taS5Lb211bGFpbmVuQGlraS5maQorVGhvbWFzIE1pa2tlbHNlbgkgICB0Ym1AaW1hZ2UuZGsKK1VsZiBNw7ZsbGVyCQkgICAzdW1vZWxsZUBpbmZvcm1hdGlrLnVuaS1oYW1idXJnLmRlCitVbWJlcnRvIFNhbHNpCQkgICBzYWxzaUBpY29zYWVkcm8uaXQKK1VvdGkgVXJwYWxhCitVcmtvIEx1c2EJCSAgIHVsdXNhQGV1c2thbG5ldC5uZXQKK1ZpY3RvciBTdGlubmVyICAgICAgICAgICAgIGhheXBvQGlubC5mcgorV2FsdGVyIEtvY2gJCSAgIGtvY2hAdTMyLmRlCitXZXJuZXIgS29jaAkJICAgd2tAZ251cGcub3JnCitXaW0gVmFuZGVwdXR0ZQkJICAgd2ltQGtkODUuY29tCisJCQkgICBuYmVja2VyQGhucy5jb20KKworCisgQ29weXJpZ2h0IDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0aGUgYXV0aG9yIGdpdmVzCisgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dCBldmVuIHRoZQorIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L1RPRE8gYi9saWJnY3J5cHQtMS40LjYvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDQ2OGUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L1RPRE8KQEAgLTAsMCArMSw2MSBAQAorV2hhdCdzIGxlZnQgdG8gZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gb3V0bGluZSAtKi0KKworKiBOZXh0IEFQSSBicmVhazoKKyoqIGdjcnlfYWNfaW9fdAorICBSZW1vdmUgdXNlIG9mIGFub255bW91cyB1bmlvbi4KKyoqIGdjcnlfYWMKKyAgQ29uc2lkZXIgdG8gcmVtb3ZlIGl0LgorCisqIHVkaXYtcXJuYmQubyBzaG91bGQgZ2V0IGJ1aWxkIGFzICoubG8gW0hQVVhdCisKKyogQWxsb3cgb3BlcmF0aW9uIHVzaW5nIFJTQSBrZXlzIGNvbnNpc3Rpbmcgb2YgdGhlIE9wZW5TU0wga2V5cy4KKyAgVGhpcyByZXF1aXJlcyB0aGUgaW50cm9kdWN0aW9uIG9mIGEgcGFyYW1ldGVyIG5hbWVzIChzYXkpIFUgd2hpY2gKKyAgaXMgY2FsY3VsYXRlZCBhY2NvcmRpbmcgdG8gT3BlblNTTC9QS0NTIzEgcnVsZXMuCisKKyogbGlua2VyIHNjcmlwdCB0ZXN0CisgIFdyaXRlIGFuIGF1dG9jb25mIHRlc3QgdG8gY2hlY2sgd2hldGhlciB0aGUgbGlua2VyIHN1cHBvcnRzIGEKKyAgdmVyc2lvbiBzY3JpcHQuIAorCisqIEFkZCBhdHRyaWJ1dGVzIHRvIHRoZSBNUEkgZnVuY3Rpb25zLgorCisqIGNpcGhlci9wdWJrZXkuYyBhbmQgcHVia2V5IGltcGxlbWVudGFpb25zLgorICBEb24ndCByZWx5IG9uIHRoZSBzZWN1cmUgbWVtb3J5IGJhc2VkIHdpcGluZyBmdW5jdGlvbiBidXQgYWRkIGFuCisgIGV4dHJhIHdpcGluZy4KKyAgCisqIFVzZSBidWlsdGluIGJpdCBmdW5jdGlvbnMgb2YgZ2NjIDMuNAorCisqIENvbnNpZGVyIHVzaW5nIGEgZGFlbW9uIHRvIG1haW50YWluIHRoZSByYW5kb20gcG9vbAorICBbUGFydGx5IGRvbmVdIFRoZSBkb3duIHNpZGUgb2YgdGhpcyBpcyB0aGF0IHdlIGNhbid0IGFzc3VtZSB0aGF0IHRoZQorICByYW5kb20gaGFzIGhhcyBhbHdheXMgYmVlbiBzdG9yZWQgaW4gInNlY3VyZSBtZW1vcnkiLiAgQW5kIHdlIHJlbHkKKyAgb24gdGhhdCBzbmlmZmluZyBvZiBVbml4IGRvbWFpbiBzb2NrZXRzIGlzIG5vdCBwb3NzaWJsZS4gIFdlIGNhbgorICBpbXBsZW1lbnQgdGhpcyBzaW1wbHkgYnkgZGV0ZWN0aW5nIGEgc3BlY2lhbCBwcmVmaXhlZCByYW5kb20gc2VlZAorICBuYW1lIGFuZCBkaXZlcnQgaW4gdGhpcyBjYXNlIHRvIHRoZSBkYWVtb24uICBUaGVyZSBhcmUgc2V2ZXJhbAorICBiZW5lZml0cyB3aXRoIHN1Y2ggYW4gYXBwcm9hY2g6IFdlIGtlZXAgdGhlIHN0YXRlIG9mIHRoZSBSTkcgb3ZlcgorICBpbnZvY2F0aW9ucyBvZiBsaWJnY3J5cHQgYmFzZWQgYXBwbGljYXRpb25zLCBkb24ndCBuZWVkIHRpbWUKKyAgY29uc3VtaW5nIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwb29sIGFuZCBpbiBjYXNlIHRoZSBlbnRyb3B5CisgIGNvbGxlY3Ryb3MgbmVlZCB0byBydW4gdGhhdCBidW5jaCBvZiBVbml4IHV0aWxpdGllcyB3ZSBkb24ndCB3YXN0ZQorICB0aGVpciBwcmVjaW91cyByZXN1bHRzLgorCisqIEFkZCBPQUVQCisKKyogZ2NyeXB0cm5kLmMKKyAgUmVxdWlyZXMgYSB0ZXN0IGZvciBwdGggW2RvbmVdIGFzIHdlbGwgYXMgc29tZSBvdGhlciB0ZXN0cy4KKworKiBzZWNtZW0uYworICBDaGVjayB3aGV0aGVyIHRoZSBtZW1vcnkgYmxvY2sgaXMgdmFsaWQgYmVmb3JlIHJlbGVhc2luZyBpdCBhbmQKKyAgcHJpbnQgYSBkaWFnbm9zaWMsIGxpa2UgZ2xpYmMgZG9lcy4KKworKiB0aHJlYWRzCisqKiBXZSBuZWVkIHRvIGRvY3VtZW50IGZvcmsgcHJvYmxlbXMKKyAgSW4gcGFydGljdWxhciB0aGF0IHJlaW5pdGlhbGl6YXRpb24gaXMgcmVxdWlyZWQgaW4gcmFuZG9tLmMKKyAgSG93ZXZlciwgdGhlcmUgaXMgbm8gY29kZSB5ZXQgdG8gZG8gaXQuCisKKyogVGVzdHMKKyAgV2UgbmVlZCBhIGxvdCBtb3JlIHRlc3RzLiAgTGV0cyBrZWVwIGFuIGV2ZXIgZ3Jvd2luZyBsaXN0IGhlcmUuCisqKiBXcml0ZSB0ZXN0cyBmb3IgdGhlIHByb2dyZXNzIGZ1bmN0aW9uCisqKiBtcGl0ZXN0cyBkb2VzIG5vIHJlYWwgY2hlY2tzIHlldC4KKyoqIHB0aHJlYWRzCisgIFRvIGNhdGNoIHNpbXBsZSBlcnJvcnMgbGlrZSB0aGUgb25lIGZpeGVkIG9uIDIwMDctMDMtMTYuCisqKiBDKysgdGVzdHMKKyAgV2UgaGF2ZSBzb21lIGNvZGUgdG8gYWxsb3cgdXNpbmcgbGliZ2NyeXB0IGZyb20gQysrLCBzbyB3ZSBhbHNvCisgIHNob3VsZCBoYXZlIGEgdGVzdCBjYXNlLgpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L1ZFUlNJT04gYi9saWJnY3J5cHQtMS40LjYvVkVSU0lPTgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTE0YmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L1ZFUlNJT04KQEAgLTAsMCArMSBAQAorMS40LjYKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9hY2luY2x1ZGUubTQgYi9saWJnY3J5cHQtMS40LjYvYWNpbmNsdWRlLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YmMwZmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvYWNpbmNsdWRlLm00CkBAIC0wLDAgKzEsNDIwIEBACitkbmwgbWFjcm9zIHRvIGNvbmZpZ3VyZSBMaWJnY3J5cHQKK2RubCBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCitkbmwgICAgICAgICAgICAgICAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorZG5sCitkbmwgVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorZG5sCitkbmwgTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworZG5sIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKK2RubCB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorZG5sIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitkbmwgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorZG5sIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorZG5sCitkbmwgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworZG5sIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK2RubCBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisKK2RubCBHTlVQR19NU0dfUFJJTlQoU1RSSU5HKQorZG5sIHByaW50IGEgbWVzc2FnZQorZG5sCitkZWZpbmUoW0dOVVBHX01TR19QUklOVF0sCisgIFsgZWNobyAkYWNfbiAiJDEiIiAkYWNfYyIgMT4mQVNfTUVTU0FHRV9GRChbXSkKKyAgXSkKKworZG5sIEdOVVBHX0NIRUNLX1RZUEVERUYoVFlQRSwgSEFWRV9OQU1FKQorZG5sIENoZWNrIHdoZXRoZXIgYSB0eXBlZGVmIGV4aXN0cyBhbmQgY3JlYXRlIGEgI2RlZmluZSAkMiBpZiBpdCBleGlzdHMKK2RubAorQUNfREVGVU4oW0dOVVBHX0NIRUNLX1RZUEVERUZdLAorICBbIEFDX01TR19DSEVDS0lORyhmb3IgJDEgdHlwZWRlZikKKyAgICBBQ19DQUNIRV9WQUwoZ251cGdfY3ZfdHlwZWRlZl8kMSwKKyAgICBbQUNfVFJZX0NPTVBJTEUoWyNkZWZpbmUgX0dOVV9TT1VSQ0UgMQorICAgICNpbmNsdWRlIDxzdGRsaWIuaD4KKyAgICAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+XSwgWworICAgICN1bmRlZiAkMQorICAgIGludCBhID0gc2l6ZW9mKCQxKTsKKyAgICBdLCBnbnVwZ19jdl90eXBlZGVmXyQxPXllcywgZ251cGdfY3ZfdHlwZWRlZl8kMT1ubyApXSkKKyAgICBBQ19NU0dfUkVTVUxUKCRnbnVwZ19jdl90eXBlZGVmXyQxKQorICAgIGlmIHRlc3QgIiRnbnVwZ19jdl90eXBlZGVmXyQxIiA9IHllczsgdGhlbgorICAgICAgICBBQ19ERUZJTkUoJDIsMSxbRGVmaW5lZCBpZiBhIGBdJDFbJyBpcyB0eXBlZGVmJ2RdKQorICAgIGZpCisgIF0pCisKKworZG5sIEdOVVBHX0NIRUNLX0dOVU1BS0UKK2RubAorQUNfREVGVU4oW0dOVVBHX0NIRUNLX0dOVU1BS0VdLAorICBbCisgICAgaWYgJHtNQUtFLW1ha2V9IC0tdmVyc2lvbiAyPi9kZXYvbnVsbCB8IGdyZXAgJ15HTlUgJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgICAgOgorICAgIGVsc2UKKyAgICAgICAgQUNfTVNHX1dBUk4oW1sKKyoqKgorKioqIEl0IHNlZW1zIHRoYXQgeW91IGFyZSBub3QgdXNpbmcgR05VIG1ha2UuICBTb21lIG1ha2UgdG9vbHMgaGF2ZSBzZXJpb3VzCisqKiogZmxhd3MgYW5kIHlvdSBtYXkgbm90IGJlIGFibGUgdG8gYnVpbGQgdGhpcyBzb2Z0d2FyZSBhdCBhbGwuIEJlZm9yZSB5b3UKKyoqKiBjb21wbGFpbiwgcGxlYXNlIHRyeSBHTlUgbWFrZTogIEdOVSBtYWtlIGlzIGVhc3kgdG8gYnVpbGQgYW5kIGF2YWlsYWJsZQorKioqIGF0IGFsbCBHTlUgYXJjaGl2ZXMuICBJdCBpcyBhbHdheXMgYXZhaWxhYmxlIGZyb20gZnRwLmdudS5vcmc6L2dudS9tYWtlLgorKioqXV0pCisgICAgZmkKKyAgXSkKKworCisjCisjIEdOVVBHX1NZU19TWU1CT0xfVU5ERVJTQ09SRQorIyBEb2VzIHRoZSBjb21waWxlciBwcmVmaXggZ2xvYmFsIHN5bWJvbHMgd2l0aCBhbiB1bmRlcnNjb3JlPworIworIyBUYWtlbiBmcm9tIEdudVBHIDEuMiBhbmQgbW9kaWZpZWQgdG8gdXNlIHRoZSBsaWJ0b29sIG1hY3Jvcy4KK0FDX0RFRlVOKFtHTlVQR19TWVNfU1lNQk9MX1VOREVSU0NPUkVdLAorW3RtcF9kb19jaGVjaz0ibm8iCitjYXNlICIke2hvc3R9IiBpbgorICAgICotbWluZ3czMm1zdmMqKQorICAgICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9eWVzCisgICAgICAgIDs7CisgICAgaTM4Ni1lbXgtb3MyIHwgaVszNDU2XTg2LXBjLW9zMiplbXggfCBpMzg2LXBjLW1zZG9zZGpncHApCisgICAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKKyAgICAgICAgOzsKKyAgICAqKQorICAgICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgICAgICAgaWYgdGVzdCAieCRhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUiID0geCA7IHRoZW4KKyAgICAgICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPXllcworICAgICAgICBmaQorICAgICAgZWxzZQorICAgICAgICAgdG1wX2RvX2NoZWNrPSJ5ZXMiCisgICAgICBmaQorICAgICAgIDs7Citlc2FjCitpZiB0ZXN0ICIkdG1wX2RvX2NoZWNrIiA9ICJ5ZXMiOyB0aGVuCisgIEFDX1JFUVVJUkUoW0FDX0xJQlRPT0xfU1lTX0dMT0JBTF9TWU1CT0xfUElQRV0pCisgIEFDX01TR19DSEVDS0lORyhbZm9yIF8gcHJlZml4IGluIGNvbXBpbGVkIHN5bWJvbHNdKQorICBBQ19DQUNIRV9WQUwoYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlLAorICBbYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vCisgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisgICAgICB2b2lkIG5tX3Rlc3RfZnVuYygpe30KKyAgICAgIGludCBtYWluKCl7bm1fdGVzdF9mdW5jO3JldHVybiAwO30KK0VPRgorICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgorICAgICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgorICAgIGFjX25saXN0PWNvbmZ0ZXN0Lm5tCisgICAgaWYgQUNfVFJZX0VWQUwoTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcfCBjdXQgLWQgXCcgXCcgLWYgMiBcPiAkYWNfbmxpc3QpICYmIHRlc3QgLXMgIiRhY19ubGlzdCI7IHRoZW4KKyAgICAgICMgU2VlIHdoZXRoZXIgdGhlIHN5bWJvbHMgaGF2ZSBhIGxlYWRpbmcgdW5kZXJzY29yZS4KKyAgICAgIGlmIGVncmVwICdeX25tX3Rlc3RfZnVuYycgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9eWVzCisgICAgICBlbHNlCisgICAgICAgIGlmIGVncmVwICdebm1fdGVzdF9mdW5jICcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICAgIDoKKyAgICAgICAgZWxzZQorICAgICAgICAgIGVjaG8gImNvbmZpZ3VyZTogY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRhY19ubGlzdCIgPiZBQ19GRF9DQworICAgICAgICBmaQorICAgICAgZmkKKyAgICBlbHNlCisgICAgICBlY2hvICJjb25maWd1cmU6IGNhbm5vdCBydW4gJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mQUNfRkRfQ0MKKyAgICBmaQorICBlbHNlCisgICAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JkFDX0ZEX0NDCisgICAgY2F0IGNvbmZ0ZXN0LmMgPiZBQ19GRF9DQworICBmaQorICBybSAtcmYgY29uZnRlc3QqCisgIF0pCisgIGVsc2UKKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgXyBwcmVmaXggaW4gY29tcGlsZWQgc3ltYm9sc10pCisgIGZpCitBQ19NU0dfUkVTVUxUKCRhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUpCitpZiB0ZXN0IHgkYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlID0geHllczsgdGhlbgorICBBQ19ERUZJTkUoV0lUSF9TWU1CT0xfVU5ERVJTQ09SRSwxLAorICAgICAgICAgICAgW0RlZmluZWQgaWYgY29tcGlsZWQgc3ltYm9scyBoYXZlIGEgbGVhZGluZyB1bmRlcnNjb3JlXSkKK2ZpCitdKQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ2hlY2sgd2hldGhlciBtbG9jayBpcyBicm9rZW4gKGhwdXggMTAuMjAgcmFpc2VzIGEgU0lHQlVTIGlmIG1sb2NrCisjIGlzIG5vdCBjYWxsZWQgZnJvbSB1aWQgMCAobm90IHRlc3RlZCB3aGV0aGVyIHVpZCAwIHdvcmtzKQorIyBGb3IgREVDcyBUcnU2NCB3ZSBoYXZlIGFsc28gdG8gY2hlY2sgd2hldGhlciBtbG9jayBpcyBpbiBsaWJydAorIyBtbG9jayBpcyB0aGVyZSBhIG1hY3JvIHVzaW5nIG1lbWxrKCkKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2RubCBHTlVQR19DSEVDS19NTE9DSworZG5sCitkZWZpbmUoR05VUEdfQ0hFQ0tfTUxPQ0ssCisgIFsgQUNfQ0hFQ0tfRlVOQ1MobWxvY2spCisgICAgaWYgdGVzdCAiJGFjX2N2X2Z1bmNfbWxvY2siID0gIm5vIjsgdGhlbgorICAgICAgICBBQ19DSEVDS19IRUFERVJTKHN5cy9tbWFuLmgpCisgICAgICAgIGlmIHRlc3QgIiRhY19jdl9oZWFkZXJfc3lzX21tYW5faCIgPSAieWVzIjsgdGhlbgorICAgICAgICAgICAgIyBBZGQgbGlicnQgdG8gTElCUzoKKyAgICAgICAgICAgIEFDX0NIRUNLX0xJQihydCwgbWVtbGspCisgICAgICAgICAgICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciBtbG9jayBpcyBpbiBzeXMvbW1hbi5oXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbnVwZ19jdl9tbG9ja19pc19pbl9zeXNfbW1hbiwKKyAgICAgICAgICAgICAgICBbQUNfVFJZX0xJTksoWworICAgICAgICAgICAgICAgICAgICAjaW5jbHVkZSA8YXNzZXJ0Lmg+CisgICAgICAgICAgICAgICAgICAgICNpZmRlZiBIQVZFX1NZU19NTUFOX0gKKyAgICAgICAgICAgICAgICAgICAgI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgIF0sIFsKK2ludCBpOworCisvKiBnbGliYyBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgKiB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseQorICogbmFtZWQgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZQorICogaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl9tbG9jaykgfHwgZGVmaW5lZCAoX19zdHViX19fbWxvY2spCitjaG9rZSBtZQorI2Vsc2UKK21sb2NrKCZpLCA0KTsKKyNlbmRpZgorOyByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgIGdudXBnX2N2X21sb2NrX2lzX2luX3N5c19tbWFuPXllcywKKyAgICAgICAgICAgICAgICBnbnVwZ19jdl9tbG9ja19pc19pbl9zeXNfbW1hbj1ubyldKQorICAgICAgICAgICAgaWYgdGVzdCAiJGdudXBnX2N2X21sb2NrX2lzX2luX3N5c19tbWFuIiA9ICJ5ZXMiOyB0aGVuCisgICAgICAgICAgICAgICAgQUNfREVGSU5FKEhBVkVfTUxPQ0ssMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0RlZmluZWQgaWYgdGhlIHN5c3RlbSBzdXBwb3J0cyBhbiBtbG9jaygpIGNhbGxdKQorICAgICAgICAgICAgZmkKKyAgICAgICAgZmkKKyAgICBmaQorICAgIGlmIHRlc3QgIiRhY19jdl9mdW5jX21sb2NrIiA9ICJ5ZXMiOyB0aGVuCisgICAgICAgIEFDX0NIRUNLX0ZVTkNTKHN5c2NvbmYgZ2V0cGFnZXNpemUpCisgICAgICAgIEFDX01TR19DSEVDS0lORyh3aGV0aGVyIG1sb2NrIGlzIGJyb2tlbikKKyAgICAgICAgICBBQ19DQUNIRV9WQUwoZ251cGdfY3ZfaGF2ZV9icm9rZW5fbWxvY2ssCisgICAgICAgICAgICAgQUNfVFJZX1JVTihbCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKK2ludCBtYWluKCkKK3sKKyAgICBjaGFyICpwb29sOworICAgIGludCBlcnI7CisgICAgbG9uZyBpbnQgcGdzaXplOworCisjaWYgZGVmaW5lZChIQVZFX1NZU0NPTkYpICYmIGRlZmluZWQoX1NDX1BBR0VTSVpFKQorICAgIHBnc2l6ZSA9IHN5c2NvbmYgKF9TQ19QQUdFU0laRSk7CisjZWxpZiBkZWZpbmVkIChIQVZFX0dFVFBBR0VTSVpFKQorICAgIHBnc2l6ZSA9IGdldHBhZ2VzaXplKCk7ICAgICAgIAorI2Vsc2UKKyAgICBwZ3NpemUgPSAtMTsKKyNlbmRpZgorCisgICAgaWYgKHBnc2l6ZSA9PSAtMSkKKyAgICAgIHBnc2l6ZSA9IDQwOTY7CisKKyAgICBwb29sID0gbWFsbG9jKCA0MDk2ICsgcGdzaXplICk7CisgICAgaWYoICFwb29sICkKKyAgICAgICAgcmV0dXJuIDI7CisgICAgcG9vbCArPSAocGdzaXplIC0gKChsb25nIGludClwb29sICUgcGdzaXplKSk7CisKKyAgICBlcnIgPSBtbG9jayggcG9vbCwgNDA5NiApOworICAgIGlmKCAhZXJyIHx8IGVycm5vID09IEVQRVJNICkKKyAgICAgICAgcmV0dXJuIDA7IC8qIG9rYXkgKi8KKworICAgIHJldHVybiAxOyAgLyogaG1tbSAqLworfQorCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgZ251cGdfY3ZfaGF2ZV9icm9rZW5fbWxvY2s9Im5vIiwKKyAgICAgICAgICAgIGdudXBnX2N2X2hhdmVfYnJva2VuX21sb2NrPSJ5ZXMiLAorICAgICAgICAgICAgZ251cGdfY3ZfaGF2ZV9icm9rZW5fbWxvY2s9ImFzc3VtZS1ubyIKKyAgICAgICAgICAgKQorICAgICAgICAgKQorICAgICAgICAgaWYgdGVzdCAiJGdudXBnX2N2X2hhdmVfYnJva2VuX21sb2NrIiA9ICJ5ZXMiOyB0aGVuCisgICAgICAgICAgICAgQUNfREVGSU5FKEhBVkVfQlJPS0VOX01MT0NLLDEsCisgICAgICAgICAgICAgICAgICAgICAgIFtEZWZpbmVkIGlmIHRoZSBtbG9jaygpIGNhbGwgZG9lcyBub3Qgd29ya10pCisgICAgICAgICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCisgICAgICAgICBlbHNlCisgICAgICAgICAgICBpZiB0ZXN0ICIkZ251cGdfY3ZfaGF2ZV9icm9rZW5fbWxvY2siID0gIm5vIjsgdGhlbgorICAgICAgICAgICAgICAgIEFDX01TR19SRVNVTFQobm8pCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChhc3N1bWluZyBubykKKyAgICAgICAgICAgIGZpCisgICAgICAgICBmaQorICAgIGZpCisgIF0pCisKKyMgR05VUEdfU1lTX0xJQlRPT0xfQ1lHV0lOMzIgLSBmaW5kIHRvb2xzIG5lZWRlZCBvbiBjeWd3aW4zMgorQUNfREVGVU4oW0dOVVBHX1NZU19MSUJUT09MX0NZR1dJTjMyXSwKK1tBQ19DSEVDS19UT09MKERMTFRPT0wsIGRsbHRvb2wsIGZhbHNlKQorQUNfQ0hFQ0tfVE9PTChBUywgYXMsIGZhbHNlKQorXSkKKworZG5sIExJU1RfTUVNQkVSKCkKK2RubCBDaGVjayB3ZXRoZXIgYW4gZWxlbWVudCBpc3QgY29udGFpbmVkIGluIGEgbGlzdC4gIFNldCBgZm91bmQnIHRvCitkbmwgYDEnIGlmIHRoZSBlbGVtZW50IGlzIGZvdW5kIGluIHRoZSBsaXN0LCB0byBgMCcgb3RoZXJ3aXNlLgorQUNfREVGVU4oW0xJU1RfTUVNQkVSXSwKK1sKK25hbWU9JDEKK2xpc3Q9JDIKK2ZvdW5kPTAKKworZm9yIG4gaW4gJGxpc3Q7IGRvCisgIGlmIHRlc3QgIngkbmFtZSIgPSAieCRuIjsgdGhlbgorICAgIGZvdW5kPTEKKyAgZmkKK2RvbmUKK10pCisKK2RubCBBTV9QQVRIX0dQR19FUlJPUihbTUlOSU1VTS1WRVJTSU9OLAorZG5sICAgICAgICAgICAgICAgICAgIFtBQ1RJT04tSUYtRk9VTkQgWywgQUNUSU9OLUlGLU5PVC1GT1VORCBdXV0pCitkbmwgVGVzdCBmb3IgbGliZ3BnLWVycm9yIGFuZCBkZWZpbmUgR1BHX0VSUk9SX0NGTEFHUyBhbmQgR1BHX0VSUk9SX0xJQlMKK2RubAorQUNfREVGVU4oW0FNX1BBVEhfR1BHX0VSUk9SXSwKK1sgQUNfQVJHX1dJVEgoZ3BnLWVycm9yLXByZWZpeCwKKyAgICAgICAgICAgIEFDX0hFTFBfU1RSSU5HKFstLXdpdGgtZ3BnLWVycm9yLXByZWZpeD1QRlhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ByZWZpeCB3aGVyZSBHUEcgRXJyb3IgaXMgaW5zdGFsbGVkIChvcHRpb25hbCldKSwKKyAgICAgZ3BnX2Vycm9yX2NvbmZpZ19wcmVmaXg9IiR3aXRodmFsIiwgZ3BnX2Vycm9yX2NvbmZpZ19wcmVmaXg9IiIpCisgIGlmIHRlc3QgeCRncGdfZXJyb3JfY29uZmlnX3ByZWZpeCAhPSB4IDsgdGhlbgorICAgICBpZiB0ZXN0IHgke0dQR19FUlJPUl9DT05GSUcrc2V0fSAhPSB4c2V0IDsgdGhlbgorICAgICAgICBHUEdfRVJST1JfQ09ORklHPSRncGdfZXJyb3JfY29uZmlnX3ByZWZpeC9iaW4vZ3BnLWVycm9yLWNvbmZpZworICAgICBmaQorICBmaQorCisgIEFDX1BBVEhfUFJPRyhHUEdfRVJST1JfQ09ORklHLCBncGctZXJyb3ItY29uZmlnLCBubykKKyAgbWluX2dwZ19lcnJvcl92ZXJzaW9uPWlmZWxzZShbJDFdLCAsMC4wLCQxKQorICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIEdQRyBFcnJvciAtIHZlcnNpb24gPj0gJG1pbl9ncGdfZXJyb3JfdmVyc2lvbikKKyAgb2s9bm8KKyAgaWYgdGVzdCAiJEdQR19FUlJPUl9DT05GSUciICE9ICJubyIgOyB0aGVuCisgICAgcmVxX21ham9yPWBlY2hvICRtaW5fZ3BnX2Vycm9yX3ZlcnNpb24gfCBcCisgICAgICAgICAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpXC5cKFtbMC05XV0qXCkvXDEvJ2AKKyAgICByZXFfbWlub3I9YGVjaG8gJG1pbl9ncGdfZXJyb3JfdmVyc2lvbiB8IFwKKyAgICAgICAgICAgICAgIHNlZCAncy9cKFtbMC05XV0qXClcLlwoW1swLTldXSpcKS9cMi8nYAorICAgIGdwZ19lcnJvcl9jb25maWdfdmVyc2lvbj1gJEdQR19FUlJPUl9DT05GSUcgJGdwZ19lcnJvcl9jb25maWdfYXJncyAtLXZlcnNpb25gCisgICAgaWYgdGVzdCAiJGdwZ19lcnJvcl9jb25maWdfdmVyc2lvbiI7IHRoZW4KKyAgICAgIG1ham9yPWBlY2hvICRncGdfZXJyb3JfY29uZmlnX3ZlcnNpb24gfCBcCisgICAgICAgICAgICAgICAgIHNlZCAncy9cKFtbMC05XV0qXClcLlwoW1swLTldXSpcKS4qL1wxLydgCisgICAgICBtaW5vcj1gZWNobyAkZ3BnX2Vycm9yX2NvbmZpZ192ZXJzaW9uIHwgXAorICAgICAgICAgICAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpXC5cKFtbMC05XV0qXCkuKi9cMi8nYAorICAgICAgaWYgdGVzdCAiJG1ham9yIiAtZ3QgIiRyZXFfbWFqb3IiOyB0aGVuCisgICAgICAgICAgb2s9eWVzCisgICAgICBlbHNlIAorICAgICAgICAgIGlmIHRlc3QgIiRtYWpvciIgLWVxICIkcmVxX21ham9yIjsgdGhlbgorICAgICAgICAgICAgICBpZiB0ZXN0ICIkbWlub3IiIC1nZSAiJHJlcV9taW5vciI7IHRoZW4KKyAgICAgICAgICAgICAgICAgb2s9eWVzCisgICAgICAgICAgICAgIGZpCisgICAgICAgICAgZmkKKyAgICAgIGZpCisgICAgZmkKKyAgZmkKKyAgaWYgdGVzdCAkb2sgPSB5ZXM7IHRoZW4KKyAgICBHUEdfRVJST1JfQ0ZMQUdTPWAkR1BHX0VSUk9SX0NPTkZJRyAkZ3BnX2Vycm9yX2NvbmZpZ19hcmdzIC0tY2ZsYWdzYAorICAgIEdQR19FUlJPUl9MSUJTPWAkR1BHX0VSUk9SX0NPTkZJRyAkZ3BnX2Vycm9yX2NvbmZpZ19hcmdzIC0tbGlic2AKKyAgICBBQ19NU0dfUkVTVUxUKHllcykKKyAgICBpZmVsc2UoWyQyXSwgLCA6LCBbJDJdKQorICBlbHNlCisgICAgR1BHX0VSUk9SX0NGTEFHUz0iIgorICAgIEdQR19FUlJPUl9MSUJTPSIiCisgICAgQUNfTVNHX1JFU1VMVChubykKKyAgICBpZmVsc2UoWyQzXSwgLCA6LCBbJDNdKQorICBmaQorICBBQ19TVUJTVChHUEdfRVJST1JfQ0ZMQUdTKQorICBBQ19TVUJTVChHUEdfRVJST1JfTElCUykKK10pCisKKworZG5sIENoZWNrIGZvciBzb2NrbGVuX3Q6IGhpc3RvcmljYWxseSBvbiBCU0QgaXQgaXMgYW4gaW50LCBhbmQgaW4KK2RubCBQT1NJWCAxZyBpdCBpcyBhIHR5cGUgb2YgaXRzIG93biwgYnV0IHNvbWUgcGxhdGZvcm1zIHVzZSBkaWZmZXJlbnQKK2RubCB0eXBlcyBmb3IgdGhlIGFyZ3VtZW50IHRvIGdldHNvY2tvcHQsIGdldHBlZXJuYW1lLCBldGMuICBTbyB3ZQorZG5sIGhhdmUgdG8gdGVzdCB0byBmaW5kIHNvbWV0aGluZyB0aGF0IHdpbGwgd29yay4KK0FDX0RFRlVOKFtUWVBFX1NPQ0tMRU5fVF0sCitbCisgICBBQ19DSEVDS19UWVBFKFtzb2NrbGVuX3RdLCAsWworICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3Igc29ja2xlbl90IGVxdWl2YWxlbnRdKQorICAgICAgQUNfQ0FDSEVfVkFMKFtzb2NrbGVuX3RfZXF1aXZdLAorICAgICAgWworICAgICAgICAgIyBTeXN0ZW1zIGhhdmUgZWl0aGVyICJzdHJ1Y3Qgc29ja2FkZHIgKiIgb3IKKyAgICAgICAgICMgInZvaWQgKiIgYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byBnZXRwZWVybmFtZQorICAgICAgICAgc29ja2xlbl90X2VxdWl2PQorICAgICAgICAgZm9yIGFyZzIgaW4gInN0cnVjdCBzb2NrYWRkciIgdm9pZDsgZG8KKyAgICAgICAgICAgIGZvciB0IGluIGludCBzaXplX3QgdW5zaWduZWQgbG9uZyAidW5zaWduZWQgbG9uZyI7IGRvCisgICAgICAgICAgICAgICBBQ19UUllfQ09NUElMRShbCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCitpbnQgZ2V0cGVlcm5hbWUgKGludCwgJGFyZzIgKiwgJHQgKik7CisgICAgICAgICAgICAgICBdLFsKKyAgICAgICAgICAgICAgICAgICR0IGxlbjsKKyAgICAgICAgICAgICAgICAgIGdldHBlZXJuYW1lKDAsMCwmbGVuKTsKKyAgICAgICAgICAgICAgIF0sWworICAgICAgICAgICAgICAgICAgc29ja2xlbl90X2VxdWl2PSIkdCIKKyAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICBdKQorICAgICAgICAgICAgZG9uZQorICAgICAgICAgZG9uZQorCisgICAgICAgICBpZiB0ZXN0ICJ4JHNvY2tsZW5fdF9lcXVpdiIgPSB4OyB0aGVuCisgICAgICAgICAgICBBQ19NU0dfRVJST1IoW0Nhbm5vdCBmaW5kIGEgdHlwZSB0byB1c2UgaW4gcGxhY2Ugb2Ygc29ja2xlbl90XSkKKyAgICAgICAgIGZpCisgICAgICBdKQorICAgICAgQUNfTVNHX1JFU1VMVCgkc29ja2xlbl90X2VxdWl2KQorICAgICAgQUNfREVGSU5FX1VOUVVPVEVEKHNvY2tsZW5fdCwgJHNvY2tsZW5fdF9lcXVpdiwKKwkJCVt0eXBlIHRvIHVzZSBpbiBwbGFjZSBvZiBzb2NrbGVuX3QgaWYgbm90IGRlZmluZWRdKV0sCisgICAgICBbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD5dKQorXSkKKworCisjIEdOVVBHX1BUSF9WRVJTSU9OX0NIRUNLKFJFUVVJUkVEKQorIyAKKyMgSWYgdGhlIHZlcnNpb24gaXMgc3VmZmljaWVudCwgSEFWRV9QVEggd2lsbCBiZSBzZXQgdG8geWVzLgorIworIyBUYWtlbiBmb3JtIHRoZSBtNCBtYWNyb3Mgd2hpY2ggY29tZSB3aXRoIFB0aAorQUNfREVGVU4oW0dOVVBHX1BUSF9WRVJTSU9OX0NIRUNLXSwKKyAgWworICAgIF9wdGhfdmVyc2lvbj1gJFBUSF9DT05GSUcgLS12ZXJzaW9uIHwgYXdrICdOUj09MSB7cHJpbnQgWyRdM30nYAorICAgIF9yZXFfdmVyc2lvbj0iaWZlbHNlKFskMV0sLDEuMi4wLCQxKSIKKworICAgIEFDX01TR19DSEVDS0lORyhmb3IgUFRIIC0gdmVyc2lvbiA+PSAkX3JlcV92ZXJzaW9uKQorICAgIGZvciBfdmFyIGluIF9wdGhfdmVyc2lvbiBfcmVxX3ZlcnNpb247IGRvCisgICAgICAgIGV2YWwgIl92YWw9XCJcJCR7X3Zhcn1cIiIKKyAgICAgICAgX21ham9yPWBlY2hvICRfdmFsIHwgc2VkICdzL1woW1swLTldXSpcKVwuXChbWzAtOV1dKlwpXChbW2FiLl1dXClcKFtbMC05XV0qXCkvXDEvJ2AKKyAgICAgICAgX21pbm9yPWBlY2hvICRfdmFsIHwgc2VkICdzL1woW1swLTldXSpcKVwuXChbWzAtOV1dKlwpXChbW2FiLl1dXClcKFtbMC05XV0qXCkvXDIvJ2AKKyAgICAgICAgX3J0eXBlPWBlY2hvICRfdmFsIHwgc2VkICdzL1woW1swLTldXSpcKVwuXChbWzAtOV1dKlwpXChbW2FiLl1dXClcKFtbMC05XV0qXCkvXDMvJ2AKKyAgICAgICAgX21pY3JvPWBlY2hvICRfdmFsIHwgc2VkICdzL1woW1swLTldXSpcKVwuXChbWzAtOV1dKlwpXChbW2FiLl1dXClcKFtbMC05XV0qXCkvXDQvJ2AKKyAgICAgICAgY2FzZSAkX3J0eXBlIGluCisgICAgICAgICAgICAiYSIgKSBfcnR5cGU9MCA7OworICAgICAgICAgICAgImIiICkgX3J0eXBlPTEgOzsKKyAgICAgICAgICAgICIuIiApIF9ydHlwZT0yIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgX2hleD1gZWNobyBkdW1teSB8IGF3ayAneyBwcmludGYoIiVkJTAyZCUxZCUwMmQiLCBtYWpvciwgbWlub3IsIHJ0eXBlLCBtaWNybyk7IH0nIFwKKyAgICAgICAgICAgICAgIm1ham9yPSRfbWFqb3IiICJtaW5vcj0kX21pbm9yIiAicnR5cGU9JF9ydHlwZSIgIm1pY3JvPSRfbWljcm8iYAorICAgICAgICBldmFsICIke192YXJ9X2hleD1cIlwkX2hleFwiIgorICAgIGRvbmUKKyAgICBoYXZlX3B0aD1ubworICAgIGlmIHRlc3QgIi4kX3B0aF92ZXJzaW9uX2hleCIgIT0gLjsgdGhlbgorICAgICAgICBpZiB0ZXN0ICIuJF9yZXFfdmVyc2lvbl9oZXgiICE9IC47IHRoZW4KKyAgICAgICAgICAgIGlmIHRlc3QgJF9wdGhfdmVyc2lvbl9oZXggLWdlICRfcmVxX3ZlcnNpb25faGV4OyB0aGVuCisgICAgICAgICAgICAgICAgaGF2ZV9wdGg9eWVzCisgICAgICAgICAgICBmaQorICAgICAgICBmaQorICAgIGZpCisgICAgaWYgdGVzdCAkaGF2ZV9wdGggPSB5ZXM7IHRoZW4KKyAgICAgICBBQ19NU0dfUkVTVUxUKHllcykKKyAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgUFRIIGluc3RhbGxhdGlvbiBpcyBzYW5lXSkKKyAgICAgICBBQ19DQUNIRV9WQUwoZ251cGdfY3ZfcHRoX2lzX3NhbmUsWworICAgICAgICAgX2dudXBnX3B0aF9zYXZlX2NmbGFncz0kQ0ZMQUdTCisgICAgICAgICBfZ251cGdfcHRoX3NhdmVfbGRmbGFncz0kTERGTEFHUworICAgICAgICAgX2dudXBnX3B0aF9zYXZlX2xpYnM9JExJQlMKKyAgICAgICAgIENGTEFHUz0iJENGTEFHUyBgJFBUSF9DT05GSUcgLS1jZmxhZ3NgIgorICAgICAgICAgTERGTEFHUz0iJExERkxBR1MgYCRQVEhfQ09ORklHIC0tbGRmbGFnc2AiCisgICAgICAgICBMSUJTPSIkTElCUyBgJFBUSF9DT05GSUcgLS1saWJzYCIKKyAgICAgICAgIEFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oWyNpbmNsdWRlIDxwdGguaD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1sgcHRoX2luaXQgKCk7XV0pXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdudXBnX2N2X3B0aF9pc19zYW5lPXllcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGdudXBnX2N2X3B0aF9pc19zYW5lPW5vKQorICAgICAgICAgQ0ZMQUdTPSRfZ251cGdfcHRoX3NhdmVfY2ZsYWdzCisgICAgICAgICBMREZMQUdTPSRfZ251cGdfcHRoX3NhdmVfbGRmbGFncworICAgICAgICAgTElCUz0kX2dudXBnX3B0aF9zYXZlX2xpYnMKKyAgICAgICBdKQorICAgICAgIGlmIHRlc3QgJGdudXBnX2N2X3B0aF9pc19zYW5lICE9IHllczsgdGhlbgorICAgICAgICAgIGhhdmVfcHRoPW5vCisgICAgICAgZmkKKyAgICAgICBBQ19NU0dfUkVTVUxUKCRnbnVwZ19jdl9wdGhfaXNfc2FuZSkKKyAgICBlbHNlCisgICAgICAgQUNfTVNHX1JFU1VMVChubykKKyAgICBmaSAgICAKKyAgXSkKKworCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvYWNsb2NhbC5tNCBiL2xpYmdjcnlwdC0xLjQuNi9hY2xvY2FsLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MmRkYzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvYWNsb2NhbC5tNApAQCAtMCwwICsxLDk4MSBAQAorIyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhY2xvY2FsIDEuMTAuMiAtKi0gQXV0b2NvbmYgLSotCisKKyMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LAorIyAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworbTRfaWZuZGVmKFtBQ19BVVRPQ09ORl9WRVJTSU9OXSwKKyAgW200X2NvcHkoW200X1BBQ0tBR0VfVkVSU0lPTl0sIFtBQ19BVVRPQ09ORl9WRVJTSU9OXSldKWRubAorbTRfaWYobTRfZGVmbihbQUNfQVVUT0NPTkZfVkVSU0lPTl0pLCBbMi42NF0sLAorW200X3dhcm5pbmcoW3RoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGZvciBhdXRvY29uZiAyLjY0LgorWW91IGhhdmUgYW5vdGhlciB2ZXJzaW9uIG9mIGF1dG9jb25mLiAgSXQgbWF5IHdvcmssIGJ1dCBpcyBub3QgZ3VhcmFudGVlZCB0by4KK0lmIHlvdSBoYXZlIHByb2JsZW1zLCB5b3UgbWF5IG5lZWQgdG8gcmVnZW5lcmF0ZSB0aGUgYnVpbGQgc3lzdGVtIGVudGlyZWx5LgorVG8gZG8gc28sIHVzZSB0aGUgcHJvY2VkdXJlIGRvY3VtZW50ZWQgYnkgdGhlIHBhY2thZ2UsIHR5cGljYWxseSBgYXV0b3JlY29uZicuXSldKQorCisjIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBBTV9BVVRPTUFLRV9WRVJTSU9OKFZFUlNJT04pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQXV0b21ha2UgWC5ZIHRyYWNlcyB0aGlzIG1hY3JvIHRvIGVuc3VyZSBhY2xvY2FsLm00IGhhcyBiZWVuCisjIGdlbmVyYXRlZCBmcm9tIHRoZSBtNCBmaWxlcyBhY2NvbXBhbnlpbmcgQXV0b21ha2UgWC5ZLgorIyAoVGhpcyBwcml2YXRlIG1hY3JvIHNob3VsZCBub3QgYmUgY2FsbGVkIG91dHNpZGUgdGhpcyBmaWxlLikKK0FDX0RFRlVOKFtBTV9BVVRPTUFLRV9WRVJTSU9OXSwKK1thbV9fYXBpX3ZlcnNpb249JzEuMTAnCitkbmwgU29tZSB1c2VycyBmaW5kIEFNX0FVVE9NQUtFX1ZFUlNJT04gYW5kIG1pc3Rha2UgaXQgZm9yIGEgd2F5IHRvCitkbmwgcmVxdWlyZSBzb21lIG1pbmltdW0gdmVyc2lvbi4gIFBvaW50IHRoZW0gdG8gdGhlIHJpZ2h0IG1hY3JvLgorbTRfaWYoWyQxXSwgWzEuMTAuMl0sIFtdLAorICAgICAgW0FDX0ZBVEFMKFtEbyBub3QgY2FsbCAkMCwgdXNlIEFNX0lOSVRfQVVUT01BS0UoWyQxXSkuXSldKWRubAorXSkKKworIyBfQU1fQVVUT0NPTkZfVkVSU0lPTihWRVJTSU9OKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBhY2xvY2FsIHRyYWNlcyB0aGlzIG1hY3JvIHRvIGZpbmQgdGhlIEF1dG9jb25mIHZlcnNpb24uCisjIFRoaXMgaXMgYSBwcml2YXRlIG1hY3JvIHRvby4gIFVzaW5nIG00X2RlZmluZSBzaW1wbGlmaWVzCisjIHRoZSBsb2dpYyBpbiBhY2xvY2FsLCB3aGljaCBjYW4gc2ltcGx5IGlnbm9yZSB0aGlzIGRlZmluaXRpb24uCittNF9kZWZpbmUoW19BTV9BVVRPQ09ORl9WRVJTSU9OXSwgW10pCisKKyMgQU1fU0VUX0NVUlJFTlRfQVVUT01BS0VfVkVSU0lPTgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENhbGwgQU1fQVVUT01BS0VfVkVSU0lPTiBhbmQgQU1fQVVUT01BS0VfVkVSU0lPTiBzbyB0aGV5IGNhbiBiZSB0cmFjZWQuCisjIFRoaXMgZnVuY3Rpb24gaXMgQUNfUkVRVUlSRWQgYnkgQU1fSU5JVF9BVVRPTUFLRS4KK0FDX0RFRlVOKFtBTV9TRVRfQ1VSUkVOVF9BVVRPTUFLRV9WRVJTSU9OXSwKK1tBTV9BVVRPTUFLRV9WRVJTSU9OKFsxLjEwLjJdKWRubAorbTRfaWZuZGVmKFtBQ19BVVRPQ09ORl9WRVJTSU9OXSwKKyAgW200X2NvcHkoW200X1BBQ0tBR0VfVkVSU0lPTl0sIFtBQ19BVVRPQ09ORl9WRVJTSU9OXSldKWRubAorX0FNX0FVVE9DT05GX1ZFUlNJT04obTRfZGVmbihbQUNfQVVUT0NPTkZfVkVSU0lPTl0pKV0pCisKKyMgRmlndXJlIG91dCBob3cgdG8gcnVuIHRoZSBhc3NlbWJsZXIuICAgICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KKworIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDUKKworIyBBTV9QUk9HX0FTCisjIC0tLS0tLS0tLS0KK0FDX0RFRlVOKFtBTV9QUk9HX0FTXSwKK1sjIEJ5IGRlZmF1bHQgd2Ugc2ltcGx5IHVzZSB0aGUgQyBjb21waWxlciB0byBidWlsZCBhc3NlbWJseSBjb2RlLgorQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pCit0ZXN0ICIke0NDQVMrc2V0fSIgPSBzZXQgfHwgQ0NBUz0kQ0MKK3Rlc3QgIiR7Q0NBU0ZMQUdTK3NldH0iID0gc2V0IHx8IENDQVNGTEFHUz0kQ0ZMQUdTCitBQ19BUkdfVkFSKFtDQ0FTXSwgICAgICBbYXNzZW1ibGVyIGNvbXBpbGVyIGNvbW1hbmQgKGRlZmF1bHRzIHRvIENDKV0pCitBQ19BUkdfVkFSKFtDQ0FTRkxBR1NdLCBbYXNzZW1ibGVyIGNvbXBpbGVyIGZsYWdzIChkZWZhdWx0cyB0byBDRkxBR1MpXSkKK19BTV9JRl9PUFRJT04oW25vLWRlcGVuZGVuY2llc10sLCBbX0FNX0RFUEVOREVOQ0lFUyhbQ0NBU10pXSlkbmwKK10pCisKKyMgQU1fQVVYX0RJUl9FWFBBTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KKworIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDMsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgRm9yIHByb2plY3RzIHVzaW5nIEFDX0NPTkZJR19BVVhfRElSKFtmb29dKSwgQXV0b2NvbmYgc2V0cworIyAkYWNfYXV4X2RpciB0byBgJHNyY2Rpci9mb28nLiAgSW4gb3RoZXIgcHJvamVjdHMsIGl0IGlzIHNldCB0bworIyBgJHNyY2RpcicsIGAkc3JjZGlyLy4uJywgb3IgYCRzcmNkaXIvLi4vLi4nLgorIworIyBPZiBjb3Vyc2UsIEF1dG9tYWtlIG11c3QgaG9ub3IgdGhpcyB2YXJpYWJsZSB3aGVuZXZlciBpdCBjYWxscyBhCisjIHRvb2wgZnJvbSB0aGUgYXV4aWxpYXJ5IGRpcmVjdG9yeS4gIFRoZSBwcm9ibGVtIGlzIHRoYXQgJHNyY2RpciAoYW5kCisjIHRoZXJlZm9yZSAkYWNfYXV4X2RpciBhcyB3ZWxsKSBjYW4gYmUgZWl0aGVyIGFic29sdXRlIG9yIHJlbGF0aXZlLAorIyBkZXBlbmRpbmcgb24gaG93IGNvbmZpZ3VyZSBpcyBydW4uICBUaGlzIGlzIHByZXR0eSBhbm5veWluZywgc2luY2UKKyMgaXQgbWFrZXMgJGFjX2F1eF9kaXIgcXVpdGUgdW51c2FibGUgaW4gc3ViZGlyZWN0b3JpZXM6IGluIHRoZSB0b3AKKyMgc291cmNlIGRpcmVjdG9yeSwgYW55IGZvcm0gd2lsbCB3b3JrIGZpbmUsIGJ1dCBpbiBzdWJkaXJlY3RvcmllcyBhCisjIHJlbGF0aXZlIHBhdGggbmVlZHMgdG8gYmUgYWRqdXN0ZWQgZmlyc3QuCisjCisjICRhY19hdXhfZGlyL21pc3NpbmcKKyMgICAgZmFpbHMgd2hlbiBjYWxsZWQgZnJvbSBhIHN1YmRpcmVjdG9yeSBpZiAkYWNfYXV4X2RpciBpcyByZWxhdGl2ZQorIyAkdG9wX3NyY2Rpci8kYWNfYXV4X2Rpci9taXNzaW5nCisjICAgIGZhaWxzIGlmICRhY19hdXhfZGlyIGlzIGFic29sdXRlLAorIyAgICBmYWlscyB3aGVuIGNhbGxlZCBmcm9tIGEgc3ViZGlyZWN0b3J5IGluIGEgVlBBVEggYnVpbGQgd2l0aAorIyAgICAgICAgICBhIHJlbGF0aXZlICRhY19hdXhfZGlyCisjCisjIFRoZSByZWFzb24gb2YgdGhlIGxhdHRlciBmYWlsdXJlIGlzIHRoYXQgJHRvcF9zcmNkaXIgYW5kICRhY19hdXhfZGlyCisjIGFyZSBib3RoIHByZWZpeGVkIGJ5ICRzcmNkaXIuICBJbiBhbiBpbi1zb3VyY2UgYnVpbGQgdGhpcyBpcyB1c3VhbGx5CisjIGhhcm1sZXNzIGJlY2F1c2UgJHNyY2RpciBpcyBgLicsIGJ1dCB0aGluZ3Mgd2lsbCBicm9rZSB3aGVuIHlvdQorIyBzdGFydCBhIFZQQVRIIGJ1aWxkIG9yIHVzZSBhbiBhYnNvbHV0ZSAkc3JjZGlyLgorIworIyBTbyB3ZSBjb3VsZCB1c2Ugc29tZXRoaW5nIHNpbWlsYXIgdG8gJHRvcF9zcmNkaXIvJGFjX2F1eF9kaXIvbWlzc2luZywKKyMgaWZmIHdlIHN0cmlwIHRoZSBsZWFkaW5nICRzcmNkaXIgZnJvbSAkYWNfYXV4X2Rpci4gIFRoYXQgd291bGQgYmU6CisjICAgYW1fYXV4X2Rpcj0nXCQodG9wX3NyY2RpcikvJ2BleHByICIkYWNfYXV4X2RpciIgOiAiJHNyY2Rpci8vKlwoLipcKSJgCisjIGFuZCB0aGVuIHdlIHdvdWxkIGRlZmluZSAkTUlTU0lORyBhcworIyAgIE1JU1NJTkc9Ilwke1NIRUxMfSAkYW1fYXV4X2Rpci9taXNzaW5nIgorIyBUaGlzIHdpbGwgd29yayBhcyBsb25nIGFzIE1JU1NJTkcgaXMgbm90IGNhbGxlZCBmcm9tIGNvbmZpZ3VyZSwgYmVjYXVzZQorIyB1bmZvcnR1bmF0ZWx5ICQodG9wX3NyY2RpcikgaGFzIG5vIG1lYW5pbmcgaW4gY29uZmlndXJlLgorIyBIb3dldmVyIHRoZXJlIGFyZSBvdGhlciB2YXJpYWJsZXMsIGxpa2UgQ0MsIHdoaWNoIGFyZSBvZnRlbiB1c2VkIGluCisjIGNvbmZpZ3VyZSwgYW5kIGNvdWxkIHRoZXJlZm9yZSBub3QgdXNlIHRoaXMgImZpeGVkIiAkYWNfYXV4X2Rpci4KKyMKKyMgQW5vdGhlciBzb2x1dGlvbiwgdXNlZCBoZXJlLCBpcyB0byBhbHdheXMgZXhwYW5kICRhY19hdXhfZGlyIHRvIGFuCisjIGFic29sdXRlIFBBVEguICBUaGUgZHJhd2JhY2sgaXMgdGhhdCB1c2luZyBhYnNvbHV0ZSBwYXRocyBwcmV2ZW50IGEKKyMgY29uZmlndXJlZCB0cmVlIHRvIGJlIG1vdmVkIHdpdGhvdXQgcmVjb25maWd1cmF0aW9uLgorCitBQ19ERUZVTihbQU1fQVVYX0RJUl9FWFBBTkRdLAorW2RubCBSZWx5IG9uIGF1dG9jb25mIHRvIHNldCB1cCBDRFBBVEggcHJvcGVybHkuCitBQ19QUkVSRVEoWzIuNTBdKWRubAorIyBleHBhbmQgJGFjX2F1eF9kaXIgdG8gYW4gYWJzb2x1dGUgcGF0aAorYW1fYXV4X2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAorXSkKKworIyBBTV9DT05ESVRJT05BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQorCisjIENvcHlyaWdodCAoQykgMTk5NywgMjAwMCwgMjAwMSwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNgorIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCA4CisKKyMgQU1fQ09ORElUSU9OQUwoTkFNRSwgU0hFTEwtQ09ORElUSU9OKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIERlZmluZSBhIGNvbmRpdGlvbmFsLgorQUNfREVGVU4oW0FNX0NPTkRJVElPTkFMXSwKK1tBQ19QUkVSRVEoMi41MilkbmwKKyBpZmVsc2UoWyQxXSwgW1RSVUVdLCAgW0FDX0ZBVEFMKFskMDogaW52YWxpZCBjb25kaXRpb246ICQxXSldLAorCVskMV0sIFtGQUxTRV0sIFtBQ19GQVRBTChbJDA6IGludmFsaWQgY29uZGl0aW9uOiAkMV0pXSlkbmwKK0FDX1NVQlNUKFskMV9UUlVFXSlkbmwKK0FDX1NVQlNUKFskMV9GQUxTRV0pZG5sCitfQU1fU1VCU1RfTk9UTUFLRShbJDFfVFJVRV0pZG5sCitfQU1fU1VCU1RfTk9UTUFLRShbJDFfRkFMU0VdKWRubAoraWYgJDI7IHRoZW4KKyAgJDFfVFJVRT0KKyAgJDFfRkFMU0U9JyMnCitlbHNlCisgICQxX1RSVUU9JyMnCisgICQxX0ZBTFNFPQorZmkKK0FDX0NPTkZJR19DT01NQU5EU19QUkUoCitbaWYgdGVzdCAteiAiJHskMV9UUlVFfSIgJiYgdGVzdCAteiAiJHskMV9GQUxTRX0iOyB0aGVuCisgIEFDX01TR19FUlJPUihbW2NvbmRpdGlvbmFsICIkMSIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS5dXSkKK2ZpXSldKQorCisjIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNgorIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCA5CisKKyMgVGhlcmUgYXJlIGEgZmV3IGRpcnR5IGhhY2tzIGJlbG93IHRvIGF2b2lkIGxldHRpbmcgYEFDX1BST0dfQ0MnIGJlCisjIHdyaXR0ZW4gaW4gY2xlYXIsIGluIHdoaWNoIGNhc2UgYXV0b21ha2UsIHdoZW4gcmVhZGluZyBhY2xvY2FsLm00LAorIyB3aWxsIHRoaW5rIGl0IHNlZXMgYSAqdXNlKiwgYW5kIHRoZXJlZm9yZSB3aWxsIHRyaWdnZXIgYWxsIGl0J3MKKyMgQyBzdXBwb3J0IG1hY2hpbmVyeS4gIEFsc28gbm90ZSB0aGF0IGl0IG1lYW5zIHRoYXQgYXV0b3NjYW4sIHNlZWluZworIyBDQyBldGMuIGluIHRoZSBNYWtlZmlsZSwgd2lsbCBhc2sgZm9yIGFuIEFDX1BST0dfQ0MgdXNlLi4uCisKKworIyBfQU1fREVQRU5ERU5DSUVTKE5BTUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2VlIGhvdyB0aGUgY29tcGlsZXIgaW1wbGVtZW50cyBkZXBlbmRlbmN5IGNoZWNraW5nLgorIyBOQU1FIGlzICJDQyIsICJDWFgiLCAiR0NKIiwgb3IgIk9CSkMiLgorIyBXZSB0cnkgYSBmZXcgdGVjaG5pcXVlcyBhbmQgdXNlIHRoYXQgdG8gc2V0IGEgc2luZ2xlIGNhY2hlIHZhcmlhYmxlLgorIworIyBXZSBkb24ndCBBQ19SRVFVSVJFIHRoZSBjb3JyZXNwb25kaW5nIEFDX1BST0dfQ0Mgc2luY2UgdGhlIGxhdHRlciB3YXMKKyMgbW9kaWZpZWQgdG8gaW52b2tlIF9BTV9ERVBFTkRFTkNJRVMoQ0MpOyB3ZSB3b3VsZCBoYXZlIGEgY2lyY3VsYXIKKyMgZGVwZW5kZW5jeSwgYW5kIGdpdmVuIHRoYXQgdGhlIHVzZXIgaXMgbm90IGV4cGVjdGVkIHRvIHJ1biB0aGlzIG1hY3JvLAorIyBqdXN0IHJlbHkgb24gQUNfUFJPR19DQy4KK0FDX0RFRlVOKFtfQU1fREVQRU5ERU5DSUVTXSwKK1tBQ19SRVFVSVJFKFtBTV9TRVRfREVQRElSXSlkbmwKK0FDX1JFUVVJUkUoW0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTXSlkbmwKK0FDX1JFUVVJUkUoW0FNX01BS0VfSU5DTFVERV0pZG5sCitBQ19SRVFVSVJFKFtBTV9ERVBfVFJBQ0tdKWRubAorCitpZmVsc2UoWyQxXSwgQ0MsICAgW2RlcGNjPSIkQ0MiICAgYW1fY29tcGlsZXJfbGlzdD1dLAorICAgICAgIFskMV0sIENYWCwgIFtkZXBjYz0iJENYWCIgIGFtX2NvbXBpbGVyX2xpc3Q9XSwKKyAgICAgICBbJDFdLCBPQkpDLCBbZGVwY2M9IiRPQkpDIiBhbV9jb21waWxlcl9saXN0PSdnY2MzIGdjYyddLAorICAgICAgIFskMV0sIFVQQywgIFtkZXBjYz0iJFVQQyIgIGFtX2NvbXBpbGVyX2xpc3Q9XSwKKyAgICAgICBbJDFdLCBHQ0osICBbZGVwY2M9IiRHQ0oiICBhbV9jb21waWxlcl9saXN0PSdnY2MzIGdjYyddLAorICAgICAgICAgICAgICAgICAgIFtkZXBjYz0iJCQxIiAgIGFtX2NvbXBpbGVyX2xpc3Q9XSkKKworQUNfQ0FDSEVfQ0hFQ0soW2RlcGVuZGVuY3kgc3R5bGUgb2YgJGRlcGNjXSwKKyAgICAgICAgICAgICAgIFthbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZV0sCitbaWYgdGVzdCAteiAiJEFNREVQX1RSVUUiICYmIHRlc3QgLWYgIiRhbV9kZXBjb21wIjsgdGhlbgorICAjIFdlIG1ha2UgYSBzdWJkaXIgYW5kIGRvIHRoZSB0ZXN0cyB0aGVyZS4gIE90aGVyd2lzZSB3ZSBjYW4gZW5kIHVwCisgICMgbWFraW5nIGJvZ3VzIGZpbGVzIHRoYXQgd2UgZG9uJ3Qga25vdyBhYm91dCBhbmQgbmV2ZXIgcmVtb3ZlLiAgRm9yCisgICMgaW5zdGFuY2UgaXQgd2FzIHJlcG9ydGVkIHRoYXQgb24gSFAtVVggdGhlIGdjYyB0ZXN0IHdpbGwgZW5kIHVwCisgICMgbWFraW5nIGEgZHVtbXkgZmlsZSBuYW1lZCBgRCcgLS0gYmVjYXVzZSBgLU1EJyBtZWFucyBgcHV0IHRoZSBvdXRwdXQKKyAgIyBpbiBEJy4KKyAgbWtkaXIgY29uZnRlc3QuZGlyCisgICMgQ29weSBkZXBjb21wIHRvIHN1YmRpciBiZWNhdXNlIG90aGVyd2lzZSB3ZSB3b24ndCBmaW5kIGl0IGlmIHdlJ3JlCisgICMgdXNpbmcgYSByZWxhdGl2ZSBkaXJlY3RvcnkuCisgIGNwICIkYW1fZGVwY29tcCIgY29uZnRlc3QuZGlyCisgIGNkIGNvbmZ0ZXN0LmRpcgorICAjIFdlIHdpbGwgYnVpbGQgb2JqZWN0cyBhbmQgZGVwZW5kZW5jaWVzIGluIGEgc3ViZGlyZWN0b3J5IGJlY2F1c2UKKyAgIyBpdCBoZWxwcyB0byBkZXRlY3QgaW5hcHBsaWNhYmxlIGRlcGVuZGVuY3kgbW9kZXMuICBGb3IgaW5zdGFuY2UKKyAgIyBib3RoIFRydTY0J3MgY2MgYW5kIElDQyBzdXBwb3J0IC1NRCB0byBvdXRwdXQgZGVwZW5kZW5jaWVzIGFzIGEKKyAgIyBzaWRlIGVmZmVjdCBvZiBjb21waWxhdGlvbiwgYnV0IElDQyB3aWxsIHB1dCB0aGUgZGVwZW5kZW5jaWVzIGluCisgICMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdoaWxlIFRydTY0IHdpbGwgcHV0IHRoZW0gaW4gdGhlIG9iamVjdAorICAjIGRpcmVjdG9yeS4KKyAgbWtkaXIgc3ViCisKKyAgYW1fY3ZfJDFfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9bm9uZQorICBpZiB0ZXN0ICIkYW1fY29tcGlsZXJfbGlzdCIgPSAiIjsgdGhlbgorICAgICBhbV9jb21waWxlcl9saXN0PWBzZWQgLW4gWydzL14jKlwoW2EtekEtWjAtOV0qXCkpJC9cMS9wJ10gPCAuL2RlcGNvbXBgCisgIGZpCisgIGZvciBkZXBtb2RlIGluICRhbV9jb21waWxlcl9saXN0OyBkbworICAgICMgU2V0dXAgYSBzb3VyY2Ugd2l0aCBtYW55IGRlcGVuZGVuY2llcywgYmVjYXVzZSBzb21lIGNvbXBpbGVycworICAgICMgbGlrZSB0byB3cmFwIGxhcmdlIGRlcGVuZGVuY3kgbGlzdHMgb24gY29sdW1uIDgwICh3aXRoIFwpLCBhbmQKKyAgICAjIHdlIHNob3VsZCBub3QgY2hvb3NlIGEgZGVwY29tcCBtb2RlIHdoaWNoIGlzIGNvbmZ1c2VkIGJ5IHRoaXMuCisgICAgIworICAgICMgV2UgbmVlZCB0byByZWNyZWF0ZSB0aGVzZSBmaWxlcyBmb3IgZWFjaCB0ZXN0LCBhcyB0aGUgY29tcGlsZXIgbWF5CisgICAgIyBvdmVyd3JpdGUgc29tZSBvZiB0aGVtIHdoZW4gdGVzdGluZyB3aXRoIG9ic2N1cmUgY29tbWFuZCBsaW5lcy4KKyAgICAjIFRoaXMgaGFwcGVucyBhdCBsZWFzdCB3aXRoIHRoZSBBSVggQyBjb21waWxlci4KKyAgICA6ID4gc3ViL2NvbmZ0ZXN0LmMKKyAgICBmb3IgaSBpbiAxIDIgMyA0IDUgNjsgZG8KKyAgICAgIGVjaG8gJyNpbmNsdWRlICJjb25mdHN0JyRpJy5oIicgPj4gc3ViL2NvbmZ0ZXN0LmMKKyAgICAgICMgVXNpbmcgYDogPiBzdWIvY29uZnRzdCRpLmgnIGNyZWF0ZXMgb25seSBzdWIvY29uZnRzdDEuaCB3aXRoCisgICAgICAjIFNvbGFyaXMgOCdzIHsvdXNyLH0vYmluL3NoLgorICAgICAgdG91Y2ggc3ViL2NvbmZ0c3QkaS5oCisgICAgZG9uZQorICAgIGVjaG8gIiR7YW1fX2luY2x1ZGV9ICR7YW1fX3F1b3RlfXN1Yi9jb25mdGVzdC5QbyR7YW1fX3F1b3RlfSIgPiBjb25mbWYKKworICAgIGNhc2UgJGRlcG1vZGUgaW4KKyAgICBub3NpZGVlZmZlY3QpCisgICAgICAjIGFmdGVyIHRoaXMgdGFnLCBtZWNoYW5pc21zIGFyZSBub3QgYnkgc2lkZS1lZmZlY3QsIHNvIHRoZXknbGwKKyAgICAgICMgb25seSBiZSB1c2VkIHdoZW4gZXhwbGljaXRseSByZXF1ZXN0ZWQKKyAgICAgIGlmIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciID0geHllczsgdGhlbgorCWNvbnRpbnVlCisgICAgICBlbHNlCisJYnJlYWsKKyAgICAgIGZpCisgICAgICA7OworICAgIG5vbmUpIGJyZWFrIDs7CisgICAgZXNhYworICAgICMgV2UgY2hlY2sgd2l0aCBgLWMnIGFuZCBgLW8nIGZvciB0aGUgc2FrZSBvZiB0aGUgImRhc2htc3Rkb3V0IgorICAgICMgbW9kZS4gIEl0IHR1cm5zIG91dCB0aGF0IHRoZSBTdW5Qcm8gQysrIGNvbXBpbGVyIGRvZXMgbm90IHByb3Blcmx5CisgICAgIyBoYW5kbGUgYC1NIC1vJywgYW5kIHdlIG5lZWQgdG8gZGV0ZWN0IHRoaXMuCisgICAgaWYgZGVwbW9kZT0kZGVwbW9kZSBcCisgICAgICAgc291cmNlPXN1Yi9jb25mdGVzdC5jIG9iamVjdD1zdWIvY29uZnRlc3QuJHtPQkpFWFQtb30gXAorICAgICAgIGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlBvIHRtcGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlRQbyBcCisgICAgICAgJFNIRUxMIC4vZGVwY29tcCAkZGVwY2MgLWMgLW8gc3ViL2NvbmZ0ZXN0LiR7T0JKRVhULW99IHN1Yi9jb25mdGVzdC5jIFwKKyAgICAgICAgID4vZGV2L251bGwgMj5jb25mdGVzdC5lcnIgJiYKKyAgICAgICBncmVwIHN1Yi9jb25mdHN0MS5oIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCisgICAgICAgZ3JlcCBzdWIvY29uZnRzdDYuaCBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgorICAgICAgIGdyZXAgc3ViL2NvbmZ0ZXN0LiR7T0JKRVhULW99IHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCisgICAgICAgJHtNQUtFLW1ha2V9IC1zIC1mIGNvbmZtZiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICAjIGljYyBkb2Vzbid0IGNob2tlIG9uIHVua25vd24gb3B0aW9ucywgaXQgd2lsbCBqdXN0IGlzc3VlIHdhcm5pbmdzCisgICAgICAjIG9yIHJlbWFya3MgKGV2ZW4gd2l0aCAtV2Vycm9yKS4gIFNvIHdlIGdyZXAgc3RkZXJyIGZvciBhbnkgbWVzc2FnZQorICAgICAgIyB0aGF0IHNheXMgYW4gb3B0aW9uIHdhcyBpZ25vcmVkIG9yIG5vdCBzdXBwb3J0ZWQuCisgICAgICAjIFdoZW4gZ2l2ZW4gLU1QLCBpY2MgNy4wIGFuZCA3LjEgY29tcGxhaW4gdGh1c2x5OgorICAgICAgIyAgIGljYzogQ29tbWFuZCBsaW5lIHdhcm5pbmc6IGlnbm9yaW5nIG9wdGlvbiAnLU0nOyBubyBhcmd1bWVudCByZXF1aXJlZAorICAgICAgIyBUaGUgZGlhZ25vc2lzIGNoYW5nZWQgaW4gaWNjIDguMDoKKyAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSByZW1hcms6IG9wdGlvbiAnLU1QJyBub3Qgc3VwcG9ydGVkCisgICAgICBpZiAoZ3JlcCAnaWdub3Jpbmcgb3B0aW9uJyBjb25mdGVzdC5lcnIgfHwKKyAgICAgICAgICBncmVwICdub3Qgc3VwcG9ydGVkJyBjb25mdGVzdC5lcnIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCisgICAgICAgIGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPSRkZXBtb2RlCisgICAgICAgIGJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKworICBjZCAuLgorICBybSAtcmYgY29uZnRlc3QuZGlyCitlbHNlCisgIGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKK2ZpCitdKQorQUNfU1VCU1QoWyQxREVQTU9ERV0sIFtkZXBtb2RlPSRhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZV0pCitBTV9DT05ESVRJT05BTChbYW1fX2Zhc3RkZXAkMV0sIFsKKyAgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vIFwKKyAgJiYgdGVzdCAiJGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA9IGdjYzNdKQorXSkKKworCisjIEFNX1NFVF9ERVBESVIKKyMgLS0tLS0tLS0tLS0tLQorIyBDaG9vc2UgYSBkaXJlY3RvcnkgbmFtZSBmb3IgZGVwZW5kZW5jeSBmaWxlcy4KKyMgVGhpcyBtYWNybyBpcyBBQ19SRVFVSVJFZCBpbiBfQU1fREVQRU5ERU5DSUVTCitBQ19ERUZVTihbQU1fU0VUX0RFUERJUl0sCitbQUNfUkVRVUlSRShbQU1fU0VUX0xFQURJTkdfRE9UXSlkbmwKK0FDX1NVQlNUKFtERVBESVJdLCBbIiR7YW1fX2xlYWRpbmdfZG90fWRlcHMiXSlkbmwKK10pCisKKworIyBBTV9ERVBfVFJBQ0sKKyMgLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbQU1fREVQX1RSQUNLXSwKK1tBQ19BUkdfRU5BQkxFKGRlcGVuZGVuY3ktdHJhY2tpbmcsCitbICAtLWRpc2FibGUtZGVwZW5kZW5jeS10cmFja2luZyAgc3BlZWRzIHVwIG9uZS10aW1lIGJ1aWxkCisgIC0tZW5hYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgICBkbyBub3QgcmVqZWN0IHNsb3cgZGVwZW5kZW5jeSBleHRyYWN0b3JzXSkKK2lmIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubzsgdGhlbgorICBhbV9kZXBjb21wPSIkYWNfYXV4X2Rpci9kZXBjb21wIgorICBBTURFUEJBQ0tTTEFTSD0nXCcKK2ZpCitBTV9DT05ESVRJT05BTChbQU1ERVBdLCBbdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vXSkKK0FDX1NVQlNUKFtBTURFUEJBQ0tTTEFTSF0pZG5sCitfQU1fU1VCU1RfTk9UTUFLRShbQU1ERVBCQUNLU0xBU0hdKWRubAorXSkKKworIyBHZW5lcmF0ZSBjb2RlIHRvIHNldCB1cCBkZXBlbmRlbmN5IHRyYWNraW5nLiAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQorCisjIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwOAorIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjc2VyaWFsIDQKKworIyBfQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbX0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTXSwKK1sjIEF1dG9jb25mIDIuNjIgcXVvdGVzIC0tZmlsZSBhcmd1bWVudHMgZm9yIGV2YWwsIGJ1dCBub3Qgd2hlbiBmaWxlcworIyBhcmUgbGlzdGVkIHdpdGhvdXQgLS1maWxlLiAgTGV0J3MgcGxheSBzYWZlIGFuZCBvbmx5IGVuYWJsZSB0aGUgZXZhbAorIyBpZiB3ZSBkZXRlY3QgdGhlIHF1b3RpbmcuCitjYXNlICRDT05GSUdfRklMRVMgaW4KKypcJyopIGV2YWwgc2V0IHggIiRDT05GSUdfRklMRVMiIDs7CisqKSAgIHNldCB4ICRDT05GSUdfRklMRVMgOzsKK2VzYWMKK3NoaWZ0Citmb3IgbWYKK2RvCisgICMgU3RyaXAgTUYgc28gd2UgZW5kIHVwIHdpdGggdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgIG1mPWBlY2hvICIkbWYiIHwgc2VkIC1lICdzLzouKiQvLydgCisgICMgQ2hlY2sgd2hldGhlciB0aGlzIGlzIGFuIEF1dG9tYWtlIGdlbmVyYXRlZCBNYWtlZmlsZSBvciBub3QuCisgICMgV2UgdXNlZCB0byBtYXRjaCBvbmx5IHRoZSBmaWxlcyBuYW1lZCBgTWFrZWZpbGUuaW4nLCBidXQKKyAgIyBzb21lIHBlb3BsZSByZW5hbWUgdGhlbTsgc28gaW5zdGVhZCB3ZSBsb29rIGF0IHRoZSBmaWxlIGNvbnRlbnQuCisgICMgR3JlcCdpbmcgdGhlIGZpcnN0IGxpbmUgaXMgbm90IGVub3VnaDogc29tZSBwZW9wbGUgcG9zdC1wcm9jZXNzCisgICMgZWFjaCBNYWtlZmlsZS5pbiBhbmQgYWRkIGEgbmV3IGxpbmUgb24gdG9wIG9mIGVhY2ggZmlsZSB0byBzYXkgc28uCisgICMgR3JlcCdpbmcgdGhlIHdob2xlIGZpbGUgaXMgbm90IGdvb2QgZWl0aGVyOiBBSVggZ3JlcCBoYXMgYSBsaW5lCisgICMgbGltaXQgb2YgMjA0OCwgYnV0IGFsbCBzZWQncyB3ZSBrbm93IGhhdmUgdW5kZXJzdGFuZCBhdCBsZWFzdCA0MDAwLgorICBpZiBzZWQgLW4gJ3MsXiMuKmdlbmVyYXRlZCBieSBhdXRvbWFrZS4qLFgscCcgIiRtZiIgfCBncmVwIFggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgZGlycGFydD1gQVNfRElSTkFNRSgiJG1mIilgCisgIGVsc2UKKyAgICBjb250aW51ZQorICBmaQorICAjIEV4dHJhY3QgdGhlIGRlZmluaXRpb24gb2YgREVQRElSLCBhbV9faW5jbHVkZSwgYW5kIGFtX19xdW90ZQorICAjIGZyb20gdGhlIE1ha2VmaWxlIHdpdGhvdXQgcnVubmluZyBgbWFrZScuCisgIERFUERJUj1gc2VkIC1uICdzL15ERVBESVIgPSAvL3AnIDwgIiRtZiJgCisgIHRlc3QgLXogIiRERVBESVIiICYmIGNvbnRpbnVlCisgIGFtX19pbmNsdWRlPWBzZWQgLW4gJ3MvXmFtX19pbmNsdWRlID0gLy9wJyA8ICIkbWYiYAorICB0ZXN0IC16ICJhbV9faW5jbHVkZSIgJiYgY29udGludWUKKyAgYW1fX3F1b3RlPWBzZWQgLW4gJ3MvXmFtX19xdW90ZSA9IC8vcCcgPCAiJG1mImAKKyAgIyBXaGVuIHVzaW5nIGFuc2kya25yLCBVIG1heSBiZSBlbXB0eSBvciBhbiB1bmRlcnNjb3JlOyBleHBhbmQgaXQKKyAgVT1gc2VkIC1uICdzL15VID0gLy9wJyA8ICIkbWYiYAorICAjIEZpbmQgYWxsIGRlcGVuZGVuY3kgb3V0cHV0IGZpbGVzLCB0aGV5IGFyZSBpbmNsdWRlZCBmaWxlcyB3aXRoCisgICMgJChERVBESVIpIGluIHRoZWlyIG5hbWVzLiAgV2UgaW52b2tlIHNlZCB0d2ljZSBiZWNhdXNlIGl0IGlzIHRoZQorICAjIHNpbXBsZXN0IGFwcHJvYWNoIHRvIGNoYW5naW5nICQoREVQRElSKSB0byBpdHMgYWN0dWFsIHZhbHVlIGluIHRoZQorICAjIGV4cGFuc2lvbi4KKyAgZm9yIGZpbGUgaW4gYHNlZCAtbiAiCisgICAgcy9eJGFtX19pbmNsdWRlICRhbV9fcXVvdGVcKC4qKERFUERJUikuKlwpJGFtX19xdW90ZSInJC9cMS9wJyA8IiRtZiIgfCBcCisgICAgICAgc2VkIC1lICdzL1wkKERFUERJUikvJyIkREVQRElSIicvZycgLWUgJ3MvXCRVLyciJFUiJy9nJ2A7IGRvCisgICAgIyBNYWtlIHN1cmUgdGhlIGRpcmVjdG9yeSBleGlzdHMuCisgICAgdGVzdCAtZiAiJGRpcnBhcnQvJGZpbGUiICYmIGNvbnRpbnVlCisgICAgZmRpcj1gQVNfRElSTkFNRShbIiRmaWxlIl0pYAorICAgIEFTX01LRElSX1AoWyRkaXJwYXJ0LyRmZGlyXSkKKyAgICAjIGVjaG8gImNyZWF0aW5nICRkaXJwYXJ0LyRmaWxlIgorICAgIGVjaG8gJyMgZHVtbXknID4gIiRkaXJwYXJ0LyRmaWxlIgorICBkb25lCitkb25lCitdKSMgX0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTCisKKworIyBBTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUaGlzIG1hY3JvIHNob3VsZCBvbmx5IGJlIGludm9rZWQgb25jZSAtLSB1c2UgdmlhIEFDX1JFUVVJUkUuCisjCisjIFRoaXMgY29kZSBpcyBvbmx5IHJlcXVpcmVkIHdoZW4gYXV0b21hdGljIGRlcGVuZGVuY3kgdHJhY2tpbmcKKyMgaXMgZW5hYmxlZC4gIEZJWE1FLiAgVGhpcyBjcmVhdGVzIGVhY2ggYC5QJyBmaWxlIHRoYXQgd2Ugd2lsbAorIyBuZWVkIGluIG9yZGVyIHRvIGJvb3RzdHJhcCB0aGUgZGVwZW5kZW5jeSBoYW5kbGluZyBjb2RlLgorQUNfREVGVU4oW0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTXSwKK1tBQ19DT05GSUdfQ09NTUFORFMoW2RlcGZpbGVzXSwKKyAgICAgW3Rlc3QgeCIkQU1ERVBfVFJVRSIgIT0geCIiIHx8IF9BTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EU10sCisgICAgIFtBTURFUF9UUlVFPSIkQU1ERVBfVFJVRSIgYWNfYXV4X2Rpcj0iJGFjX2F1eF9kaXIiXSkKK10pCisKKyMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA1CisjIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDgKKworIyBBTV9DT05GSUdfSEVBREVSIGlzIG9ic29sZXRlLiAgSXQgaGFzIGJlZW4gcmVwbGFjZWQgYnkgQUNfQ09ORklHX0hFQURFUlMuCitBVV9ERUZVTihbQU1fQ09ORklHX0hFQURFUl0sIFtBQ19DT05GSUdfSEVBREVSUygkQCldKQorCisjIERvIGFsbCB0aGUgd29yayBmb3IgQXV0b21ha2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCisKKyMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LAorIyAyMDA1LCAyMDA2LCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDEzCisKKyMgVGhpcyBtYWNybyBhY3R1YWxseSBkb2VzIHRvbyBtdWNoLiAgU29tZSBjaGVja3MgYXJlIG9ubHkgbmVlZGVkIGlmCisjIHlvdXIgcGFja2FnZSBkb2VzIGNlcnRhaW4gdGhpbmdzLiAgQnV0IHRoaXMgaXNuJ3QgcmVhbGx5IGEgYmlnIGRlYWwuCisKKyMgQU1fSU5JVF9BVVRPTUFLRShQQUNLQUdFLCBWRVJTSU9OLCBbTk8tREVGSU5FXSkKKyMgQU1fSU5JVF9BVVRPTUFLRShbT1BUSU9OU10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRoZSBjYWxsIHdpdGggUEFDS0FHRSBhbmQgVkVSU0lPTiBhcmd1bWVudHMgaXMgdGhlIG9sZCBzdHlsZQorIyBjYWxsIChwcmUgYXV0b2NvbmYtMi41MCksIHdoaWNoIGlzIGJlaW5nIHBoYXNlZCBvdXQuICBQQUNLQUdFCisjIGFuZCBWRVJTSU9OIHNob3VsZCBub3cgYmUgcGFzc2VkIHRvIEFDX0lOSVQgYW5kIHJlbW92ZWQgZnJvbQorIyB0aGUgY2FsbCB0byBBTV9JTklUX0FVVE9NQUtFLgorIyBXZSBzdXBwb3J0IGJvdGggY2FsbCBzdHlsZXMgZm9yIHRoZSB0cmFuc2l0aW9uLiAgQWZ0ZXIKKyMgdGhlIG5leHQgQXV0b21ha2UgcmVsZWFzZSwgQXV0b2NvbmYgY2FuIG1ha2UgdGhlIEFDX0lOSVQKKyMgYXJndW1lbnRzIG1hbmRhdG9yeSwgYW5kIHRoZW4gd2UgY2FuIGRlcGVuZCBvbiBhIG5ldyBBdXRvY29uZgorIyByZWxlYXNlIGFuZCBkcm9wIHRoZSBvbGQgY2FsbCBzdXBwb3J0LgorQUNfREVGVU4oW0FNX0lOSVRfQVVUT01BS0VdLAorW0FDX1BSRVJFUShbMi42MF0pZG5sCitkbmwgQXV0b2NvbmYgd2FudHMgdG8gZGlzYWxsb3cgQU1fIG5hbWVzLiAgV2UgZXhwbGljaXRseSBhbGxvdworZG5sIHRoZSBvbmVzIHdlIGNhcmUgYWJvdXQuCittNF9wYXR0ZXJuX2FsbG93KFteQU1fW0EtWl0rRkxBR1MkXSlkbmwKK0FDX1JFUVVJUkUoW0FNX1NFVF9DVVJSRU5UX0FVVE9NQUtFX1ZFUlNJT05dKWRubAorQUNfUkVRVUlSRShbQUNfUFJPR19JTlNUQUxMXSlkbmwKK2lmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCI7IHRoZW4KKyAgIyBVc2UgLUkkKHNyY2Rpcikgb25seSB3aGVuICQoc3JjZGlyKSAhPSAuLCBzbyB0aGF0IG1ha2UncyBvdXRwdXQKKyAgIyBpcyBub3QgcG9sbHV0ZWQgd2l0aCByZXBlYXRlZCAiLUkuIgorICBBQ19TVUJTVChbYW1fX2lzcmNdLCBbJyAtSSQoc3JjZGlyKSddKV9BTV9TVUJTVF9OT1RNQUtFKFthbV9faXNyY10pZG5sCisgICMgdGVzdCB0byBzZWUgaWYgc3JjZGlyIGFscmVhZHkgY29uZmlndXJlZAorICBpZiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgorICAgIEFDX01TR19FUlJPUihbc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biAibWFrZSBkaXN0Y2xlYW4iIHRoZXJlIGZpcnN0XSkKKyAgZmkKK2ZpCisKKyMgdGVzdCB3aGV0aGVyIHdlIGhhdmUgY3lncGF0aAoraWYgdGVzdCAteiAiJENZR1BBVEhfVyI7IHRoZW4KKyAgaWYgKGN5Z3BhdGggLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCisgICAgQ1lHUEFUSF9XPSdjeWdwYXRoIC13JworICBlbHNlCisgICAgQ1lHUEFUSF9XPWVjaG8KKyAgZmkKK2ZpCitBQ19TVUJTVChbQ1lHUEFUSF9XXSkKKworIyBEZWZpbmUgdGhlIGlkZW50aXR5IG9mIHRoZSBwYWNrYWdlLgorZG5sIERpc3Rpbmd1aXNoIGJldHdlZW4gb2xkLXN0eWxlIGFuZCBuZXctc3R5bGUgY2FsbHMuCittNF9pZnZhbChbJDJdLAorW200X2lmdmFsKFskM10sIFtfQU1fU0VUX09QVElPTihbbm8tZGVmaW5lXSldKWRubAorIEFDX1NVQlNUKFtQQUNLQUdFXSwgWyQxXSlkbmwKKyBBQ19TVUJTVChbVkVSU0lPTl0sIFskMl0pXSwKK1tfQU1fU0VUX09QVElPTlMoWyQxXSlkbmwKK2RubCBEaWFnbm9zZSBvbGQtc3R5bGUgQUNfSU5JVCB3aXRoIG5ldy1zdHlsZSBBTV9BVVRPTUFLRV9JTklULgorbTRfaWYobTRfaWZkZWYoW0FDX1BBQ0tBR0VfTkFNRV0sIDEpbTRfaWZkZWYoW0FDX1BBQ0tBR0VfVkVSU0lPTl0sIDEpLCAxMSwsCisgIFttNF9mYXRhbChbQUNfSU5JVCBzaG91bGQgYmUgY2FsbGVkIHdpdGggcGFja2FnZSBhbmQgdmVyc2lvbiBhcmd1bWVudHNdKV0pZG5sCisgQUNfU1VCU1QoW1BBQ0tBR0VdLCBbJ0FDX1BBQ0tBR0VfVEFSTkFNRSddKWRubAorIEFDX1NVQlNUKFtWRVJTSU9OXSwgWydBQ19QQUNLQUdFX1ZFUlNJT04nXSldKWRubAorCitfQU1fSUZfT1BUSU9OKFtuby1kZWZpbmVdLCwKK1tBQ19ERUZJTkVfVU5RVU9URUQoUEFDS0FHRSwgIiRQQUNLQUdFIiwgW05hbWUgb2YgcGFja2FnZV0pCisgQUNfREVGSU5FX1VOUVVPVEVEKFZFUlNJT04sICIkVkVSU0lPTiIsIFtWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlXSldKWRubAorCisjIFNvbWUgdG9vbHMgQXV0b21ha2UgbmVlZHMuCitBQ19SRVFVSVJFKFtBTV9TQU5JVFlfQ0hFQ0tdKWRubAorQUNfUkVRVUlSRShbQUNfQVJHX1BST0dSQU1dKWRubAorQU1fTUlTU0lOR19QUk9HKEFDTE9DQUwsIGFjbG9jYWwtJHthbV9fYXBpX3ZlcnNpb259KQorQU1fTUlTU0lOR19QUk9HKEFVVE9DT05GLCBhdXRvY29uZikKK0FNX01JU1NJTkdfUFJPRyhBVVRPTUFLRSwgYXV0b21ha2UtJHthbV9fYXBpX3ZlcnNpb259KQorQU1fTUlTU0lOR19QUk9HKEFVVE9IRUFERVIsIGF1dG9oZWFkZXIpCitBTV9NSVNTSU5HX1BST0coTUFLRUlORk8sIG1ha2VpbmZvKQorQU1fUFJPR19JTlNUQUxMX1NICitBTV9QUk9HX0lOU1RBTExfU1RSSVAKK0FDX1JFUVVJUkUoW0FNX1BST0dfTUtESVJfUF0pZG5sCisjIFdlIG5lZWQgYXdrIGZvciB0aGUgImNoZWNrIiB0YXJnZXQuICBUaGUgc3lzdGVtICJhd2siIGlzIGJhZCBvbgorIyBzb21lIHBsYXRmb3Jtcy4KK0FDX1JFUVVJUkUoW0FDX1BST0dfQVdLXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKWRubAorQUNfUkVRVUlSRShbQU1fU0VUX0xFQURJTkdfRE9UXSlkbmwKK19BTV9JRl9PUFRJT04oW3Rhci11c3Rhcl0sIFtfQU1fUFJPR19UQVIoW3VzdGFyXSldLAorICAgICAgICAgICAgICBbX0FNX0lGX09QVElPTihbdGFyLXBheF0sIFtfQU1fUFJPR19UQVIoW3BheF0pXSwKKwkgICAgICAJCSAgICAgW19BTV9QUk9HX1RBUihbdjddKV0pXSkKK19BTV9JRl9PUFRJT04oW25vLWRlcGVuZGVuY2llc10sLAorW0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0NDXSwKKyAgICAgICAgICAgICAgICAgIFtfQU1fREVQRU5ERU5DSUVTKENDKV0sCisgICAgICAgICAgICAgICAgICBbZGVmaW5lKFtBQ19QUk9HX0NDXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmbihbQUNfUFJPR19DQ10pW19BTV9ERVBFTkRFTkNJRVMoQ0MpXSldKWRubAorQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfQ1hYXSwKKyAgICAgICAgICAgICAgICAgIFtfQU1fREVQRU5ERU5DSUVTKENYWCldLAorICAgICAgICAgICAgICAgICAgW2RlZmluZShbQUNfUFJPR19DWFhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZuKFtBQ19QUk9HX0NYWF0pW19BTV9ERVBFTkRFTkNJRVMoQ1hYKV0pXSlkbmwKK0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX09CSkNdLAorICAgICAgICAgICAgICAgICAgW19BTV9ERVBFTkRFTkNJRVMoT0JKQyldLAorICAgICAgICAgICAgICAgICAgW2RlZmluZShbQUNfUFJPR19PQkpDXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmbihbQUNfUFJPR19PQkpDXSlbX0FNX0RFUEVOREVOQ0lFUyhPQkpDKV0pXSlkbmwKK10pCitdKQorCisKKyMgV2hlbiBjb25maWcuc3RhdHVzIGdlbmVyYXRlcyBhIGhlYWRlciwgd2UgbXVzdCB1cGRhdGUgdGhlIHN0YW1wLWggZmlsZS4KKyMgVGhpcyBmaWxlIHJlc2lkZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBjb25maWcgaGVhZGVyCisjIHRoYXQgaXMgZ2VuZXJhdGVkLiAgVGhlIHN0YW1wIGZpbGVzIGFyZSBudW1iZXJlZCB0byBoYXZlIGRpZmZlcmVudCBuYW1lcy4KKworIyBBdXRvY29uZiBjYWxscyBfQUNfQU1fQ09ORklHX0hFQURFUl9IT09LICh3aGVuIGRlZmluZWQpIGluIHRoZQorIyBsb29wIHdoZXJlIGNvbmZpZy5zdGF0dXMgY3JlYXRlcyB0aGUgaGVhZGVycywgc28gd2UgY2FuIGdlbmVyYXRlCisjIG91ciBzdGFtcCBmaWxlcyB0aGVyZS4KK0FDX0RFRlVOKFtfQUNfQU1fQ09ORklHX0hFQURFUl9IT09LXSwKK1sjIENvbXB1dGUgJDEncyBpbmRleCBpbiAkY29uZmlnX2hlYWRlcnMuCitfYW1fYXJnPSQxCitfYW1fc3RhbXBfY291bnQ9MQorZm9yIF9hbV9oZWFkZXIgaW4gJGNvbmZpZ19oZWFkZXJzIDo7IGRvCisgIGNhc2UgJF9hbV9oZWFkZXIgaW4KKyAgICAkX2FtX2FyZyB8ICRfYW1fYXJnOiogKQorICAgICAgYnJlYWsgOzsKKyAgICAqICkKKyAgICAgIF9hbV9zdGFtcF9jb3VudD1gZXhwciAkX2FtX3N0YW1wX2NvdW50ICsgMWAgOzsKKyAgZXNhYworZG9uZQorZWNobyAidGltZXN0YW1wIGZvciAkX2FtX2FyZyIgPmBBU19ESVJOQU1FKFsiJF9hbV9hcmciXSlgL3N0YW1wLWhbXSRfYW1fc3RhbXBfY291bnRdKQorCisjIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMywgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBBTV9QUk9HX0lOU1RBTExfU0gKKyMgLS0tLS0tLS0tLS0tLS0tLS0tCisjIERlZmluZSAkaW5zdGFsbF9zaC4KK0FDX0RFRlVOKFtBTV9QUk9HX0lOU1RBTExfU0hdLAorW0FDX1JFUVVJUkUoW0FNX0FVWF9ESVJfRVhQQU5EXSlkbmwKK2luc3RhbGxfc2g9JHtpbnN0YWxsX3NoLSJcJChTSEVMTCkgJGFtX2F1eF9kaXIvaW5zdGFsbC1zaCJ9CitBQ19TVUJTVChpbnN0YWxsX3NoKV0pCisKKyMgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA1ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCAyCisKKyMgQ2hlY2sgd2hldGhlciB0aGUgdW5kZXJseWluZyBmaWxlLXN5c3RlbSBzdXBwb3J0cyBmaWxlbmFtZXMKKyMgd2l0aCBhIGxlYWRpbmcgZG90LiAgRm9yIGluc3RhbmNlIE1TLURPUyBkb2Vzbid0LgorQUNfREVGVU4oW0FNX1NFVF9MRUFESU5HX0RPVF0sCitbcm0gLXJmIC50c3QgMj4vZGV2L251bGwKK21rZGlyIC50c3QgMj4vZGV2L251bGwKK2lmIHRlc3QgLWQgLnRzdDsgdGhlbgorICBhbV9fbGVhZGluZ19kb3Q9LgorZWxzZQorICBhbV9fbGVhZGluZ19kb3Q9XworZmkKK3JtZGlyIC50c3QgMj4vZGV2L251bGwKK0FDX1NVQlNUKFthbV9fbGVhZGluZ19kb3RdKV0pCisKKyMgQWRkIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvcHRpb24gdG8gY29uZmlndXJlLiAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KKyMgRnJvbSBKaW0gTWV5ZXJpbmcKKworIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTgsIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUKKyMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgNAorCitBQ19ERUZVTihbQU1fTUFJTlRBSU5FUl9NT0RFXSwKK1tBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzXSkKKyAgZG5sIG1haW50YWluZXItbW9kZSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0CisgIEFDX0FSR19FTkFCTEUobWFpbnRhaW5lci1tb2RlLAorWyAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlICBlbmFibGUgbWFrZSBydWxlcyBhbmQgZGVwZW5kZW5jaWVzIG5vdCB1c2VmdWwKKwkJCSAgKGFuZCBzb21ldGltZXMgY29uZnVzaW5nKSB0byB0aGUgY2FzdWFsIGluc3RhbGxlcl0sCisgICAgICBVU0VfTUFJTlRBSU5FUl9NT0RFPSRlbmFibGV2YWwsCisgICAgICBVU0VfTUFJTlRBSU5FUl9NT0RFPW5vKQorICBBQ19NU0dfUkVTVUxUKFskVVNFX01BSU5UQUlORVJfTU9ERV0pCisgIEFNX0NPTkRJVElPTkFMKE1BSU5UQUlORVJfTU9ERSwgW3Rlc3QgJFVTRV9NQUlOVEFJTkVSX01PREUgPSB5ZXNdKQorICBNQUlOVD0kTUFJTlRBSU5FUl9NT0RFX1RSVUUKKyAgQUNfU1VCU1QoTUFJTlQpZG5sCitdCispCisKK0FVX0RFRlVOKFtqbV9NQUlOVEFJTkVSX01PREVdLCBbQU1fTUFJTlRBSU5FUl9NT0RFXSkKKworIyBDaGVjayB0byBzZWUgaG93ICdtYWtlJyB0cmVhdHMgaW5jbHVkZXMuCSAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KKworIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDMKKworIyBBTV9NQUtFX0lOQ0xVREUoKQorIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayB0byBzZWUgaG93IG1ha2UgdHJlYXRzIGluY2x1ZGVzLgorQUNfREVGVU4oW0FNX01BS0VfSU5DTFVERV0sCitbYW1fbWFrZT0ke01BS0UtbWFrZX0KK2NhdCA+IGNvbmZpbmMgPDwgJ0VORCcKK2FtX19kb2l0OgorCUBlY2hvIGRvbmUKKy5QSE9OWTogYW1fX2RvaXQKK0VORAorIyBJZiB3ZSBkb24ndCBmaW5kIGFuIGluY2x1ZGUgZGlyZWN0aXZlLCBqdXN0IGNvbW1lbnQgb3V0IHRoZSBjb2RlLgorQUNfTVNHX0NIRUNLSU5HKFtmb3Igc3R5bGUgb2YgaW5jbHVkZSB1c2VkIGJ5ICRhbV9tYWtlXSkKK2FtX19pbmNsdWRlPSIjIgorYW1fX3F1b3RlPQorX2FtX3Jlc3VsdD1ub25lCisjIEZpcnN0IHRyeSBHTlUgbWFrZSBzdHlsZSBpbmNsdWRlLgorZWNobyAiaW5jbHVkZSBjb25maW5jIiA+IGNvbmZtZgorIyBXZSBncmVwIG91dCBgRW50ZXJpbmcgZGlyZWN0b3J5JyBhbmQgYExlYXZpbmcgZGlyZWN0b3J5JworIyBtZXNzYWdlcyB3aGljaCBjYW4gb2NjdXIgaWYgYHcnIGVuZHMgdXAgaW4gTUFLRUZMQUdTLgorIyBJbiBwYXJ0aWN1bGFyIHdlIGRvbid0IGxvb2sgYXQgYF5tYWtlOicgYmVjYXVzZSBHTlUgbWFrZSBtaWdodAorIyBiZSBpbnZva2VkIHVuZGVyIHNvbWUgb3RoZXIgbmFtZSAodXN1YWxseSAiZ21ha2UiKSwgaW4gd2hpY2gKKyMgY2FzZSBpdCBwcmludHMgaXRzIG5ldyBuYW1lIGluc3RlYWQgb2YgYG1ha2UnLgoraWYgdGVzdCAiYCRhbV9tYWtlIC1zIC1mIGNvbmZtZiAyPiAvZGV2L251bGwgfCBncmVwIC12ICdpbmcgZGlyZWN0b3J5J2AiID0gImRvbmUiOyB0aGVuCisgICBhbV9faW5jbHVkZT1pbmNsdWRlCisgICBhbV9fcXVvdGU9CisgICBfYW1fcmVzdWx0PUdOVQorZmkKKyMgTm93IHRyeSBCU0QgbWFrZSBzdHlsZSBpbmNsdWRlLgoraWYgdGVzdCAiJGFtX19pbmNsdWRlIiA9ICIjIjsgdGhlbgorICAgZWNobyAnLmluY2x1ZGUgImNvbmZpbmMiJyA+IGNvbmZtZgorICAgaWYgdGVzdCAiYCRhbV9tYWtlIC1zIC1mIGNvbmZtZiAyPiAvZGV2L251bGxgIiA9ICJkb25lIjsgdGhlbgorICAgICAgYW1fX2luY2x1ZGU9LmluY2x1ZGUKKyAgICAgIGFtX19xdW90ZT0iXCIiCisgICAgICBfYW1fcmVzdWx0PUJTRAorICAgZmkKK2ZpCitBQ19TVUJTVChbYW1fX2luY2x1ZGVdKQorQUNfU1VCU1QoW2FtX19xdW90ZV0pCitBQ19NU0dfUkVTVUxUKFskX2FtX3Jlc3VsdF0pCitybSAtZiBjb25maW5jIGNvbmZtZgorXSkKKworIyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDgKKyMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgNgorCisjIEFNX1BST0dfQ0NfQ19PCisjIC0tLS0tLS0tLS0tLS0tCisjIExpa2UgQUNfUFJPR19DQ19DX08sIGJ1dCBjaGFuZ2VkIGZvciBhdXRvbWFrZS4KK0FDX0RFRlVOKFtBTV9QUk9HX0NDX0NfT10sCitbQUNfUkVRVUlSRShbQUNfUFJPR19DQ19DX09dKWRubAorQUNfUkVRVUlSRShbQU1fQVVYX0RJUl9FWFBBTkRdKWRubAorQUNfUkVRVUlSRV9BVVhfRklMRShbY29tcGlsZV0pZG5sCisjIEZJWE1FOiB3ZSByZWx5IG9uIHRoZSBjYWNoZSB2YXJpYWJsZSBuYW1lIGJlY2F1c2UKKyMgdGhlcmUgaXMgbm8gb3RoZXIgd2F5Lgorc2V0IGR1bW15ICRDQworYW1fY2M9YGVjaG8gJFsyXSB8IHNlZCBbJ3MvW15hLXpBLVowLTlfXS9fL2c7cy9eWzAtOV0vXy8nXWAKK2V2YWwgYW1fdD1cJGFjX2N2X3Byb2dfY2NfJHthbV9jY31fY19vCitpZiB0ZXN0ICIkYW1fdCIgIT0geWVzOyB0aGVuCisgICAjIExvc2luZyBjb21waWxlciwgc28gb3ZlcnJpZGUgd2l0aCB0aGUgc2NyaXB0LgorICAgIyBGSVhNRTogSXQgaXMgd3JvbmcgdG8gcmV3cml0ZSBDQy4KKyAgICMgQnV0IGlmIHdlIGRvbid0IHRoZW4gd2UgZ2V0IGludG8gdHJvdWJsZSBvZiBvbmUgc29ydCBvciBhbm90aGVyLgorICAgIyBBIGxvbmdlci10ZXJtIGZpeCB3b3VsZCBiZSB0byBoYXZlIGF1dG9tYWtlIHVzZSBhbV9fQ0MgaW4gdGhpcyBjYXNlLAorICAgIyBhbmQgdGhlbiB3ZSBjb3VsZCBzZXQgYW1fX0NDPSJcJCh0b3Bfc3JjZGlyKS9jb21waWxlIFwkKENDKSIKKyAgIENDPSIkYW1fYXV4X2Rpci9jb21waWxlICRDQyIKK2ZpCitkbmwgTWFrZSBzdXJlIEFDX1BST0dfQ0MgaXMgbmV2ZXIgY2FsbGVkIGFnYWluLCBvciBpdCB3aWxsIG92ZXJyaWRlIG91cgorZG5sIHNldHRpbmcgb2YgQ0MuCittNF9kZWZpbmUoW0FDX1BST0dfQ0NdLAorICAgICAgICAgIFttNF9mYXRhbChbQUNfUFJPR19DQyBjYW5ub3QgYmUgY2FsbGVkIGFmdGVyIEFNX1BST0dfQ0NfQ19PXSldKQorXSkKKworIyBGYWtlIHRoZSBleGlzdGVuY2Ugb2YgcHJvZ3JhbXMgdGhhdCBHTlUgbWFpbnRhaW5lcnMgdXNlLiAgLSotIEF1dG9jb25mIC0qLQorCisjIENvcHlyaWdodCAoQykgMTk5NywgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMywgMjAwNCwgMjAwNQorIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCA1CisKKyMgQU1fTUlTU0lOR19QUk9HKE5BTUUsIFBST0dSQU0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0FNX01JU1NJTkdfUFJPR10sCitbQUNfUkVRVUlSRShbQU1fTUlTU0lOR19IQVNfUlVOXSkKKyQxPSR7JDEtIiR7YW1fbWlzc2luZ19ydW59JDIifQorQUNfU1VCU1QoJDEpXSkKKworCisjIEFNX01JU1NJTkdfSEFTX1JVTgorIyAtLS0tLS0tLS0tLS0tLS0tLS0KKyMgRGVmaW5lIE1JU1NJTkcgaWYgbm90IGRlZmluZWQgc28gZmFyIGFuZCB0ZXN0IGlmIGl0IHN1cHBvcnRzIC0tcnVuLgorIyBJZiBpdCBkb2VzLCBzZXQgYW1fbWlzc2luZ19ydW4gdG8gdXNlIGl0LCBvdGhlcndpc2UsIHRvIG5vdGhpbmcuCitBQ19ERUZVTihbQU1fTUlTU0lOR19IQVNfUlVOXSwKK1tBQ19SRVFVSVJFKFtBTV9BVVhfRElSX0VYUEFORF0pZG5sCitBQ19SRVFVSVJFX0FVWF9GSUxFKFttaXNzaW5nXSlkbmwKK3Rlc3QgeCIke01JU1NJTkcrc2V0fSIgPSB4c2V0IHx8IE1JU1NJTkc9Ilwke1NIRUxMfSAkYW1fYXV4X2Rpci9taXNzaW5nIgorIyBVc2UgZXZhbCB0byBleHBhbmQgJFNIRUxMCitpZiBldmFsICIkTUlTU0lORyAtLXJ1biB0cnVlIjsgdGhlbgorICBhbV9taXNzaW5nX3J1bj0iJE1JU1NJTkcgLS1ydW4gIgorZWxzZQorICBhbV9taXNzaW5nX3J1bj0KKyAgQUNfTVNHX1dBUk4oW2BtaXNzaW5nJyBzY3JpcHQgaXMgdG9vIG9sZCBvciBtaXNzaW5nXSkKK2ZpCitdKQorCisjIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBBTV9QUk9HX01LRElSX1AKKyMgLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIGZvciBgbWtkaXIgLXAnLgorQUNfREVGVU4oW0FNX1BST0dfTUtESVJfUF0sCitbQUNfUFJFUkVRKFsyLjYwXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfTUtESVJfUF0pZG5sCitkbmwgQXV0b21ha2UgMS44IHRvIDEuOS42IHVzZWQgdG8gZGVmaW5lIG1rZGlyX3AuICBXZSBub3cgdXNlIE1LRElSX1AsCitkbmwgd2hpbGUga2VlcGluZyBhIGRlZmluaXRpb24gb2YgbWtkaXJfcCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KK2RubCBATUtESVJfUEAgaXMgbWFnaWM6IEFDX09VVFBVVCBhZGp1c3RzIGl0cyB2YWx1ZSBmb3IgZWFjaCBNYWtlZmlsZS4KK2RubCBIb3dldmVyIHdlIGNhbm5vdCBkZWZpbmUgbWtkaXJfcCBhcyAkKE1LRElSX1ApIGZvciB0aGUgc2FrZSBvZgorZG5sIE1ha2VmaWxlLmlucyB0aGF0IGRvIG5vdCBkZWZpbmUgTUtESVJfUCwgc28gd2UgZG8gb3VyIG93bgorZG5sIGFkanVzdG1lbnQgdXNpbmcgdG9wX2J1aWxkZGlyICh3aGljaCBpcyBkZWZpbmVkIG1vcmUgb2Z0ZW4gdGhhbgorZG5sIE1LRElSX1ApLgorQUNfU1VCU1QoW21rZGlyX3BdLCBbIiRNS0RJUl9QIl0pZG5sCitjYXNlICRta2Rpcl9wIGluCisgIFtbXFwvJF1dKiB8ID86W1tcXC9dXSopIDs7CisgICovKikgbWtkaXJfcD0iXCQodG9wX2J1aWxkZGlyKS8kbWtkaXJfcCIgOzsKK2VzYWMKK10pCisKKyMgSGVscGVyIGZ1bmN0aW9ucyBmb3Igb3B0aW9uIGhhbmRsaW5nLiAgICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KKworIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDUsIDIwMDggIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDQKKworIyBfQU1fTUFOR0xFX09QVElPTihOQU1FKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW19BTV9NQU5HTEVfT1BUSU9OXSwKK1tbX0FNX09QVElPTl9dbTRfYnBhdHN1YnN0KCQxLCBbW15hLXpBLVowLTlfXV0sIFtfXSldKQorCisjIF9BTV9TRVRfT1BUSU9OKE5BTUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTZXQgb3B0aW9uIE5BTUUuICBQcmVzZW50bHkgdGhhdCBvbmx5IG1lYW5zIGRlZmluaW5nIGEgZmxhZyBmb3IgdGhpcyBvcHRpb24uCitBQ19ERUZVTihbX0FNX1NFVF9PUFRJT05dLAorW200X2RlZmluZShfQU1fTUFOR0xFX09QVElPTihbJDFdKSwgMSldKQorCisjIF9BTV9TRVRfT1BUSU9OUyhPUFRJT05TKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE9QVElPTlMgaXMgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBBdXRvbWFrZSBvcHRpb25zLgorQUNfREVGVU4oW19BTV9TRVRfT1BUSU9OU10sCitbbTRfZm9yZWFjaF93KFtfQU1fT3B0aW9uXSwgWyQxXSwgW19BTV9TRVRfT1BUSU9OKF9BTV9PcHRpb24pXSldKQorCisjIF9BTV9JRl9PUFRJT04oT1BUSU9OLCBJRi1TRVQsIFtJRi1OT1QtU0VUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFeGVjdXRlIElGLVNFVCBpZiBPUFRJT04gaXMgc2V0LCBJRi1OT1QtU0VUIG90aGVyd2lzZS4KK0FDX0RFRlVOKFtfQU1fSUZfT1BUSU9OXSwKK1ttNF9pZnNldChfQU1fTUFOR0xFX09QVElPTihbJDFdKSwgWyQyXSwgWyQzXSldKQorCisjIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lLiAgICAtKi0gQXV0b2NvbmYgLSotCisKKyMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA1CisjIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDQKKworIyBBTV9TQU5JVFlfQ0hFQ0sKKyMgLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbQU1fU0FOSVRZX0NIRUNLXSwKK1tBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZV0pCisjIEp1c3QgaW4gY2FzZQorc2xlZXAgMQorZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdC5maWxlCisjIERvIGBzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCisjIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKKyMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKKyMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCisjIGRpcmVjdG9yeSkuCitpZiAoCisgICBzZXQgWCBgbHMgLUx0ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0LmZpbGUgMj4gL2Rldi9udWxsYAorICAgaWYgdGVzdCAiJFsqXSIgPSAiWCI7IHRoZW4KKyAgICAgICMgLUwgZGlkbid0IHdvcmsuCisgICAgICBzZXQgWCBgbHMgLXQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZWAKKyAgIGZpCisgICBybSAtZiBjb25mdGVzdC5maWxlCisgICBpZiB0ZXN0ICIkWypdIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdC5maWxlIiBcCisgICAgICAmJiB0ZXN0ICIkWypdIiAhPSAiWCBjb25mdGVzdC5maWxlICRzcmNkaXIvY29uZmlndXJlIjsgdGhlbgorCisgICAgICAjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCisgICAgICAjIGlmLCBmb3IgaW5zdGFuY2UsIENPTkZJR19TSEVMTCBpcyBiYXNoIGFuZCBpdCBpbmhlcml0cyBhCisgICAgICAjIGJyb2tlbiBscyBhbGlhcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaGFzIGFjdHVhbGx5CisgICAgICAjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCisgICAgICBBQ19NU0dfRVJST1IoW2xzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KK2FsaWFzIGluIHlvdXIgZW52aXJvbm1lbnRdKQorICAgZmkKKworICAgdGVzdCAiJFsyXSIgPSBjb25mdGVzdC5maWxlCisgICApCit0aGVuCisgICAjIE9rLgorICAgOgorZWxzZQorICAgQUNfTVNHX0VSUk9SKFtuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKK0NoZWNrIHlvdXIgc3lzdGVtIGNsb2NrXSkKK2ZpCitBQ19NU0dfUkVTVUxUKHllcyldKQorCisjIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMywgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBBTV9QUk9HX0lOU1RBTExfU1RSSVAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE9uZSBpc3N1ZSB3aXRoIHZlbmRvciBgaW5zdGFsbCcgKGV2ZW4gR05VKSBpcyB0aGF0IHlvdSBjYW4ndAorIyBzcGVjaWZ5IHRoZSBwcm9ncmFtIHVzZWQgdG8gc3RyaXAgYmluYXJpZXMuICBUaGlzIGlzIGVzcGVjaWFsbHkKKyMgYW5ub3lpbmcgaW4gY3Jvc3MtY29tcGlsaW5nIGVudmlyb25tZW50cywgd2hlcmUgdGhlIGJ1aWxkJ3Mgc3RyaXAKKyMgaXMgdW5saWtlbHkgdG8gaGFuZGxlIHRoZSBob3N0J3MgYmluYXJpZXMuCisjIEZvcnR1bmF0ZWx5IGluc3RhbGwtc2ggd2lsbCBob25vciBhIFNUUklQUFJPRyB2YXJpYWJsZSwgc28gd2UKKyMgYWx3YXlzIHVzZSBpbnN0YWxsLXNoIGluIGBtYWtlIGluc3RhbGwtc3RyaXAnLCBhbmQgaW5pdGlhbGl6ZQorIyBTVFJJUFBST0cgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIFNUUklQIHZhcmlhYmxlIChzZXQgYnkgdGhlIHVzZXIpLgorQUNfREVGVU4oW0FNX1BST0dfSU5TVEFMTF9TVFJJUF0sCitbQUNfUkVRVUlSRShbQU1fUFJPR19JTlNUQUxMX1NIXSlkbmwKKyMgSW5zdGFsbGVkIGJpbmFyaWVzIGFyZSB1c3VhbGx5IHN0cmlwcGVkIHVzaW5nIGBzdHJpcCcgd2hlbiB0aGUgdXNlcgorIyBydW4gYG1ha2UgaW5zdGFsbC1zdHJpcCcuICBIb3dldmVyIGBzdHJpcCcgbWlnaHQgbm90IGJlIHRoZSByaWdodAorIyB0b29sIHRvIHVzZSBpbiBjcm9zcy1jb21waWxhdGlvbiBlbnZpcm9ubWVudHMsIHRoZXJlZm9yZSBBdXRvbWFrZQorIyB3aWxsIGhvbm9yIHRoZSBgU1RSSVAnIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIG92ZXJydWxlIHRoaXMgcHJvZ3JhbS4KK2RubCBEb24ndCB0ZXN0IGZvciAkY3Jvc3NfY29tcGlsaW5nID0geWVzLCBiZWNhdXNlIGl0IG1pZ2h0IGJlIGBtYXliZScuCitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiAhPSBubzsgdGhlbgorICBBQ19DSEVDS19UT09MKFtTVFJJUF0sIFtzdHJpcF0sIDopCitmaQorSU5TVEFMTF9TVFJJUF9QUk9HUkFNPSJcJChpbnN0YWxsX3NoKSAtYyAtcyIKK0FDX1NVQlNUKFtJTlNUQUxMX1NUUklQX1BST0dSQU1dKV0pCisKKyMgQ29weXJpZ2h0IChDKSAyMDA2ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIF9BTV9TVUJTVF9OT1RNQUtFKFZBUklBQkxFKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUHJldmVudCBBdXRvbWFrZSBmcm9tIG91dHB1dHRpbmcgVkFSSUFCTEUgPSBAVkFSSUFCTEVAIGluIE1ha2VmaWxlLmluLgorIyBUaGlzIG1hY3JvIGlzIHRyYWNlZCBieSBBdXRvbWFrZS4KK0FDX0RFRlVOKFtfQU1fU1VCU1RfTk9UTUFLRV0pCisKKyMgQ2hlY2sgaG93IHRvIGNyZWF0ZSBhIHRhcmJhbGwuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KKworIyBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDIKKworIyBfQU1fUFJPR19UQVIoRk9STUFUKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayBob3cgdG8gY3JlYXRlIGEgdGFyYmFsbCBpbiBmb3JtYXQgRk9STUFULgorIyBGT1JNQVQgc2hvdWxkIGJlIG9uZSBvZiBgdjcnLCBgdXN0YXInLCBvciBgcGF4Jy4KKyMKKyMgU3Vic3RpdHV0ZSBhIHZhcmlhYmxlICQoYW1fX3RhcikgdGhhdCBpcyBhIGNvbW1hbmQKKyMgd3JpdGluZyB0byBzdGRvdXQgYSBGT1JNQVQtdGFyYmFsbCBjb250YWluaW5nIHRoZSBkaXJlY3RvcnkKKyMgJHRhcmRpci4KKyMgICAgIHRhcmRpcj1kaXJlY3RvcnkgJiYgJChhbV9fdGFyKSA+IHJlc3VsdC50YXIKKyMKKyMgU3Vic3RpdHV0ZSBhIHZhcmlhYmxlICQoYW1fX3VudGFyKSB0aGF0IGV4dHJhY3Qgc3VjaAorIyBhIHRhcmJhbGwgcmVhZCBmcm9tIHN0ZGluLgorIyAgICAgJChhbV9fdW50YXIpIDwgcmVzdWx0LnRhcgorQUNfREVGVU4oW19BTV9QUk9HX1RBUl0sCitbIyBBbHdheXMgZGVmaW5lIEFNVEFSIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorQU1fTUlTU0lOR19QUk9HKFtBTVRBUl0sIFt0YXJdKQorbTRfaWYoWyQxXSwgW3Y3XSwKKyAgICAgW2FtX190YXI9JyR7QU1UQVJ9IGNob2YgLSAiJCR0YXJkaXIiJzsgYW1fX3VudGFyPScke0FNVEFSfSB4ZiAtJ10sCisgICAgIFttNF9jYXNlKFskMV0sIFt1c3Rhcl0sLCBbcGF4XSwsCisgICAgICAgICAgICAgIFttNF9mYXRhbChbVW5rbm93biB0YXIgZm9ybWF0XSldKQorQUNfTVNHX0NIRUNLSU5HKFtob3cgdG8gY3JlYXRlIGEgJDEgdGFyIGFyY2hpdmVdKQorIyBMb29wIG92ZXIgYWxsIGtub3duIG1ldGhvZHMgdG8gY3JlYXRlIGEgdGFyIGFyY2hpdmUgdW50aWwgb25lIHdvcmtzLgorX2FtX3Rvb2xzPSdnbnV0YXIgbTRfaWYoWyQxXSwgW3VzdGFyXSwgW3BsYWludGFyXSkgcGF4IGNwaW8gbm9uZScKK19hbV90b29scz0ke2FtX2N2X3Byb2dfdGFyXyQxLSRfYW1fdG9vbHN9CisjIERvIG5vdCBmb2xkIHRoZSBhYm92ZSB0d28gbGluZSBpbnRvIG9uZSwgYmVjYXVzZSBUcnU2NCBzaCBhbmQKKyMgU29sYXJpcyBzaCB3aWxsIG5vdCBncm9rIHNwYWNlcyBpbiB0aGUgcmhzIG9mIGAtJy4KK2ZvciBfYW1fdG9vbCBpbiAkX2FtX3Rvb2xzCitkbworICBjYXNlICRfYW1fdG9vbCBpbgorICBnbnV0YXIpCisgICAgZm9yIF9hbV90YXIgaW4gdGFyIGdudXRhciBndGFyOworICAgIGRvCisgICAgICBBTV9SVU5fTE9HKFskX2FtX3RhciAtLXZlcnNpb25dKSAmJiBicmVhaworICAgIGRvbmUKKyAgICBhbV9fdGFyPSIkX2FtX3RhciAtLWZvcm1hdD1tNF9pZihbJDFdLCBbcGF4XSwgW3Bvc2l4XSwgWyQxXSkgLWNoZiAtICInIiQkdGFyZGlyIicKKyAgICBhbV9fdGFyXz0iJF9hbV90YXIgLS1mb3JtYXQ9bTRfaWYoWyQxXSwgW3BheF0sIFtwb3NpeF0sIFskMV0pIC1jaGYgLSAiJyIkdGFyZGlyIicKKyAgICBhbV9fdW50YXI9IiRfYW1fdGFyIC14ZiAtIgorICAgIDs7CisgIHBsYWludGFyKQorICAgICMgTXVzdCBza2lwIEdOVSB0YXI6IGlmIGl0IGRvZXMgbm90IHN1cHBvcnQgLS1mb3JtYXQ9IGl0IGRvZXNuJ3QgY3JlYXRlCisgICAgIyB1c3RhciB0YXJiYWxsIGVpdGhlci4KKyAgICAodGFyIC0tdmVyc2lvbikgPi9kZXYvbnVsbCAyPiYxICYmIGNvbnRpbnVlCisgICAgYW1fX3Rhcj0ndGFyIGNoZiAtICIkJHRhcmRpciInCisgICAgYW1fX3Rhcl89J3RhciBjaGYgLSAiJHRhcmRpciInCisgICAgYW1fX3VudGFyPSd0YXIgeGYgLScKKyAgICA7OworICBwYXgpCisgICAgYW1fX3Rhcj0ncGF4IC1MIC14ICQxIC13ICIkJHRhcmRpciInCisgICAgYW1fX3Rhcl89J3BheCAtTCAteCAkMSAtdyAiJHRhcmRpciInCisgICAgYW1fX3VudGFyPSdwYXggLXInCisgICAgOzsKKyAgY3BpbykKKyAgICBhbV9fdGFyPSdmaW5kICIkJHRhcmRpciIgLXByaW50IHwgY3BpbyAtbyAtSCAkMSAtTCcKKyAgICBhbV9fdGFyXz0nZmluZCAiJHRhcmRpciIgLXByaW50IHwgY3BpbyAtbyAtSCAkMSAtTCcKKyAgICBhbV9fdW50YXI9J2NwaW8gLWkgLUggJDEgLWQnCisgICAgOzsKKyAgbm9uZSkKKyAgICBhbV9fdGFyPWZhbHNlCisgICAgYW1fX3Rhcl89ZmFsc2UKKyAgICBhbV9fdW50YXI9ZmFsc2UKKyAgICA7OworICBlc2FjCisKKyAgIyBJZiB0aGUgdmFsdWUgd2FzIGNhY2hlZCwgc3RvcCBub3cuICBXZSBqdXN0IHdhbnRlZCB0byBoYXZlIGFtX190YXIKKyAgIyBhbmQgYW1fX3VudGFyIHNldC4KKyAgdGVzdCAtbiAiJHthbV9jdl9wcm9nX3Rhcl8kMX0iICYmIGJyZWFrCisKKyAgIyB0YXIvdW50YXIgYSBkdW1teSBkaXJlY3RvcnksIGFuZCBzdG9wIGlmIHRoZSBjb21tYW5kIHdvcmtzCisgIHJtIC1yZiBjb25mdGVzdC5kaXIKKyAgbWtkaXIgY29uZnRlc3QuZGlyCisgIGVjaG8gR3JlcE1lID4gY29uZnRlc3QuZGlyL2ZpbGUKKyAgQU1fUlVOX0xPRyhbdGFyZGlyPWNvbmZ0ZXN0LmRpciAmJiBldmFsICRhbV9fdGFyXyA+Y29uZnRlc3QudGFyXSkKKyAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgorICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LnRhcjsgdGhlbgorICAgIEFNX1JVTl9MT0coWyRhbV9fdW50YXIgPGNvbmZ0ZXN0LnRhcl0pCisgICAgZ3JlcCBHcmVwTWUgY29uZnRlc3QuZGlyL2ZpbGUgPi9kZXYvbnVsbCAyPiYxICYmIGJyZWFrCisgIGZpCitkb25lCitybSAtcmYgY29uZnRlc3QuZGlyCisKK0FDX0NBQ0hFX1ZBTChbYW1fY3ZfcHJvZ190YXJfJDFdLCBbYW1fY3ZfcHJvZ190YXJfJDE9JF9hbV90b29sXSkKK0FDX01TR19SRVNVTFQoWyRhbV9jdl9wcm9nX3Rhcl8kMV0pXSkKK0FDX1NVQlNUKFthbV9fdGFyXSkKK0FDX1NVQlNUKFthbV9fdW50YXJdKQorXSkgIyBfQU1fUFJPR19UQVIKKworbTRfaW5jbHVkZShbbTQvbGlidG9vbC5tNF0pCittNF9pbmNsdWRlKFttNC9ub2V4ZWNzdGFjay5tNF0pCittNF9pbmNsdWRlKFttNC9vbmNlb25seS5tNF0pCittNF9pbmNsdWRlKFttNC9zb2NrbGVuLm00XSkKK200X2luY2x1ZGUoW200L3N5c19zb2NrZXRfaC5tNF0pCittNF9pbmNsdWRlKFthY2luY2x1ZGUubTRdKQpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L2F1dG9nZW4uc2ggYi9saWJnY3J5cHQtMS40LjYvYXV0b2dlbi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZjJkYjRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L2F1dG9nZW4uc2gKQEAgLTAsMCArMSwyMDAgQEAKKyMhIC9iaW4vc2gKKyMgUnVuIHRoaXMgdG8gZ2VuZXJhdGUgYWxsIHRoZSBpbml0aWFsIG1ha2VmaWxlcywgZXRjLiAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDAzIGcxMCBDb2RlIEdtYkgKKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IGFzIGEgc3BlY2lhbCBleGNlcHRpb24gdGhlIGF1dGhvciBnaXZlcworIyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dCBldmVuIHRoZQorIyBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworY29uZmlndXJlX2FjPSJjb25maWd1cmUuYWMiCisKK2N2dHZlciAoKSB7CisgIGF3ayAnTlI9PTEge3NwbGl0KCRORixBLCIuIik7WD0xMDAwMDAwKkFbMV0rMTAwMCpBWzJdK0FbM107cHJpbnQgWDtleGl0IDB9JworfQorCitjaGVja192ZXJzaW9uICgpIHsKKyAgICBpZiBbIGAoIiQxIiAtLXZlcnNpb24gfHwgZWNobyAiMCIpIHwgY3Z0dmVyYCAtZ2UgIiQyIiBdOyB0aGVuCisgICAgICAgcmV0dXJuIDAKKyAgICBmaQorICAgIGVjaG8gIioqRXJyb3IqKjogIlxgJDFcJyIgbm90IGluc3RhbGxlZCBvciB0b28gb2xkLiIgPiYyCisgICAgZWNobyAnICAgICAgICAgICBWZXJzaW9uICckMycgb3IgbmV3ZXIgaXMgcmVxdWlyZWQuJyA+JjIKKyAgICBbIC1uICIkNCIgXSAmJiBlY2hvICcgICAgICAgICAgIE5vdGUgdGhhdCB0aGlzIGlzIHBhcnQgb2YgJ1xgJDRcJycuJyA+JjIKKyAgICBESUU9InllcyIKKyAgICByZXR1cm4gMQorfQorCisKK0RJRT1ubworRk9SQ0U9CitpZiB0ZXN0IHgiJDEiID0geCItLWZvcmNlIjsgdGhlbgorICBGT1JDRT0iIC0tZm9yY2UiCisgIHNoaWZ0CitmaQorCisjICoqKioqIFczMiBidWlsZCBzY3JpcHQgKioqKioqKgorIyBVc2VkIHRvIGNyb3NzLWNvbXBpbGUgZm9yIFdpbmRvd3MuCitpZiB0ZXN0ICIkMSIgPSAiLS1idWlsZC13MzIiOyB0aGVuCisgICAgdG1wPWBkaXJuYW1lICQwYAorICAgIHRzZGlyPWBjZCAiJHRtcCI7IHB3ZGAKKyAgICBzaGlmdAorICAgIGlmIFsgISAtZiAkdHNkaXIvY29uZmlnLmd1ZXNzIF07IHRoZW4KKyAgICAgICAgZWNobyAiJHRzZGlyL2NvbmZpZy5ndWVzcyBub3QgZm91bmQiID4mMgorICAgICAgICBleGl0IDEKKyAgICBmaQorICAgIGJ1aWxkPWAkdHNkaXIvY29uZmlnLmd1ZXNzYAorCisgICAgWyAteiAiJHczMnJvb3QiIF0gJiYgdzMycm9vdD0iJEhPTUUvdzMycm9vdCIKKyAgICBlY2hvICJVc2luZyAkdzMycm9vdCBhcyBzdGFuZGFyZCBpbnN0YWxsIGRpcmVjdG9yeSIgPiYyCisgICAgCisgICAgIyBMb2NhdGUgdGhlIGNyb3NzIGNvbXBpbGVyCisgICAgY3Jvc3NiaW5kaXI9CisgICAgZm9yIGhvc3QgaW4gaTU4Ni1taW5ndzMybXN2YyBpMzg2LW1pbmd3MzJtc3ZjOyBkbworICAgICAgICBpZiAke2hvc3R9LWdjYyAtLXZlcnNpb24gPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgorICAgICAgICAgICAgY3Jvc3NiaW5kaXI9L3Vzci8ke2hvc3R9L2JpbgorICAgICAgICAgICAgY29uZl9DQz0iQ0M9JHtob3N0fS1nY2MiCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZmkKKyAgICBkb25lCisgICAgaWYgWyAteiAiJGNyb3NzYmluZGlyIiBdOyB0aGVuCisgICAgICAgIGVjaG8gIkNyb3NzIGNvbXBpbGVyIGtpdCBub3QgaW5zdGFsbGVkIiA+JjIKKyAgICAgICAgZWNobyAiVW5kZXIgRGViaWFuIEdOVS9MaW51eCwgeW91IG1heSBpbnN0YWxsIGl0IHVzaW5nIiA+JjIKKyAgICAgICAgZWNobyAiICBhcHQtZ2V0IGluc3RhbGwgbWluZ3czMiBtaW5ndzMyLXJ1bnRpbWUgbWluZ3czMi1iaW51dGlscyIgPiYyIAorICAgICAgICBlY2hvICJTdG9wLiIgPiYyCisgICAgICAgIGV4aXQgMQorICAgIGZpCisgICAKKyAgICBpZiBbIC1mICIkdHNkaXIvY29uZmlnLmxvZyIgXTsgdGhlbgorICAgICAgICBpZiAhIGhlYWQgJHRzZGlyL2NvbmZpZy5sb2cgfCBncmVwICIkaG9zdCIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICAgICAgZWNobyAiUGVhc2UgcnVuIGEgJ21ha2UgZGlzdGNsZWFuJyBmaXJzdCIgPiYyCisgICAgICAgICAgICBleGl0IDEKKyAgICAgICAgZmkKKyAgICBmaQorCisgICAgLi9jb25maWd1cmUgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlICAtLXByZWZpeD0ke3czMnJvb3R9ICBcCisgICAgICAgICAgICAtLWhvc3Q9JHtob3N0fSAtLWJ1aWxkPSR7YnVpbGR9IFwKKyAgICAgICAgICAgIC0td2l0aC1ncGctZXJyb3ItcHJlZml4PSR7dzMycm9vdH0KKyAgICBleGl0ICQ/CitmaQorIyAqKioqKiBlbmQgVzMyIGJ1aWxkIHNjcmlwdCAqKioqKioqCisKKworIyAqKioqKiBBTUQ2NCBjcm9zcyBidWlsZCBzY3JpcHQgKioqKioqKgorIyBVc2VkIHRvIGNyb3NzLWNvbXBpbGUgZm9yIEFNRDY0IChmb3IgdGVzdGluZykKK2lmIHRlc3QgIiQxIiA9ICItLWJ1aWxkLWFtZDY0IjsgdGhlbgorICAgIHRtcD1gZGlybmFtZSAkMGAKKyAgICB0c2Rpcj1gY2QgIiR0bXAiOyBwd2RgCisgICAgc2hpZnQKKyAgICBpZiBbICEgLWYgJHRzZGlyL2NvbmZpZy5ndWVzcyBdOyB0aGVuCisgICAgICAgIGVjaG8gIiR0c2Rpci9jb25maWcuZ3Vlc3Mgbm90IGZvdW5kIiA+JjIKKyAgICAgICAgZXhpdCAxCisgICAgZmkKKyAgICBidWlsZD1gJHRzZGlyL2NvbmZpZy5ndWVzc2AKKworICAgIFsgLXogIiRhbWQ2NHJvb3QiIF0gJiYgYW1kNjRyb290PSIkSE9NRS9hbWQ2NHJvb3QiCisgICAgZWNobyAiVXNpbmcgJGFtZDY0cm9vdCBhcyBzdGFuZGFyZCBpbnN0YWxsIGRpcmVjdG9yeSIgPiYyCisgICAgCisgICAgIyBMb2NhdGUgdGhlIGNyb3NzIGNvbXBpbGVyCisgICAgY3Jvc3NiaW5kaXI9CisgICAgZm9yIGhvc3QgaW4geDg2XzY0LWxpbnV4LWdudSBhbWQ2NC1saW51eC1nbnU7IGRvCisgICAgICAgIGlmICR7aG9zdH0tZ2NjIC0tdmVyc2lvbiA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCisgICAgICAgICAgICBjcm9zc2JpbmRpcj0vdXNyLyR7aG9zdH0vYmluCisgICAgICAgICAgICBjb25mX0NDPSJDQz0ke2hvc3R9LWdjYyIKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBmaQorICAgIGRvbmUKKyAgICBpZiBbIC16ICIkY3Jvc3NiaW5kaXIiIF07IHRoZW4KKyAgICAgICAgZWNobyAiQ3Jvc3MgY29tcGlsZXIga2l0IG5vdCBpbnN0YWxsZWQiID4mMgorICAgICAgICBlY2hvICJTdG9wLiIgPiYyCisgICAgICAgIGV4aXQgMQorICAgIGZpCisgICAKKyAgICBpZiBbIC1mICIkdHNkaXIvY29uZmlnLmxvZyIgXTsgdGhlbgorICAgICAgICBpZiAhIGhlYWQgJHRzZGlyL2NvbmZpZy5sb2cgfCBncmVwICIkaG9zdCIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICAgICAgZWNobyAiUGxlYXNlIHJ1biBhICdtYWtlIGRpc3RjbGVhbicgZmlyc3QiID4mMgorICAgICAgICAgICAgZXhpdCAxCisgICAgICAgIGZpCisgICAgZmkKKworICAgICR0c2Rpci9jb25maWd1cmUgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIC0tcHJlZml4PSR7YW1kNjRyb290fSAgXAorICAgICAgICAgICAgIC0taG9zdD0ke2hvc3R9IC0tYnVpbGQ9JHtidWlsZH0gXAorICAgICAgICAgICAgIC0td2l0aC1ncGctZXJyb3ItcHJlZml4PSR7YW1kNjRyb290fSAKKyAKKyAgICByYz0kPworICAgIGV4aXQgJHJjCitmaQorIyAqKioqKiBlbmQgQU1ENjQgY3Jvc3MgYnVpbGQgc2NyaXB0ICoqKioqKioKKworIyBHcmVwIHRoZSByZXF1aXJlZCB2ZXJzaW9ucyBmcm9tIGNvbmZpZ3VyZS5hYworYXV0b2NvbmZfdmVycz1gc2VkIC1uICcvXkFDX1BSRVJFUSgvIHsgCitzL14uKihcKC4qXCkpL1wxL3AKK3EKK30nICR7Y29uZmlndXJlX2FjfWAKK2F1dG9jb25mX3ZlcnNfbnVtPWBlY2hvICIkYXV0b2NvbmZfdmVycyIgfCBjdnR2ZXJgCisKK2F1dG9tYWtlX3ZlcnM9YHNlZCAtbiAnL15taW5fYXV0b21ha2VfdmVyc2lvbj0vIHsgCitzL14uKj0iXCguKlwpIi9cMS9wCitxCit9JyAke2NvbmZpZ3VyZV9hY31gCithdXRvbWFrZV92ZXJzX251bT1gZWNobyAiJGF1dG9tYWtlX3ZlcnMiIHwgY3Z0dmVyYAorCisjZ2V0dGV4dF92ZXJzPWBzZWQgLW4gJy9eQU1fR05VX0dFVFRFWFRfVkVSU0lPTigvIHsgCisjcy9eLiooXCguKlwpKS9cMS9wCisjcQorI30nICR7Y29uZmlndXJlX2FjfWAKKyNnZXR0ZXh0X3ZlcnNfbnVtPWBlY2hvICIkZ2V0dGV4dF92ZXJzIiB8IGN2dHZlcmAKKworCitpZiBbIC16ICIkYXV0b2NvbmZfdmVycyIgLW8gLXogIiRhdXRvbWFrZV92ZXJzIiBdCit0aGVuCisgIGVjaG8gIioqRXJyb3IqKjogdmVyc2lvbiBpbmZvcm1hdGlvbiBub3QgZm91bmQgaW4gIlxgJHtjb25maWd1cmVfYWN9XCciLiIgPiYyCisgIGV4aXQgMQorZmkKKworIyBBbGxvdyB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCB0b29sIG5hbWVzCitBVVRPQ09ORj0ke0FVVE9DT05GX1BSRUZJWH0ke0FVVE9DT05GOi1hdXRvY29uZn0ke0FVVE9DT05GX1NVRkZJWH0KK0FVVE9IRUFERVI9JHtBVVRPQ09ORl9QUkVGSVh9JHtBVVRPSEVBREVSOi1hdXRvaGVhZGVyfSR7QVVUT0NPTkZfU1VGRklYfQorCitBVVRPTUFLRT0ke0FVVE9NQUtFX1BSRUZJWH0ke0FVVE9NQUtFOi1hdXRvbWFrZX0ke0FVVE9NQUtFX1NVRkZJWH0KK0FDTE9DQUw9JHtBVVRPTUFLRV9QUkVGSVh9JHtBQ0xPQ0FMOi1hY2xvY2FsfSR7QVVUT01BS0VfU1VGRklYfQorCisjR0VUVEVYVD0ke0dFVFRFWFRfUFJFRklYfSR7R0VUVEVYVDotZ2V0dGV4dH0ke0dFVFRFWFRfU1VGRklYfQorI01TR01FUkdFPSR7R0VUVEVYVF9QUkVGSVh9JHtNU0dNRVJHRTotbXNnbWVyZ2V9JHtHRVRURVhUX1NVRkZJWH0KKworCitpZiBjaGVja192ZXJzaW9uICRBVVRPQ09ORiAkYXV0b2NvbmZfdmVyc19udW0gJGF1dG9jb25mX3ZlcnMgOyB0aGVuCisgICAgY2hlY2tfdmVyc2lvbiAkQVVUT0hFQURFUiAkYXV0b2NvbmZfdmVyc19udW0gJGF1dG9jb25mX3ZlcnMgYXV0b2NvbmYKK2ZpCitpZiBjaGVja192ZXJzaW9uICRBVVRPTUFLRSAkYXV0b21ha2VfdmVyc19udW0gJGF1dG9tYWtlX3ZlcnM7IHRoZW4KKyAgY2hlY2tfdmVyc2lvbiAkQUNMT0NBTCAkYXV0b21ha2VfdmVyc19udW0gJGF1dG9jb25mX3ZlcnMgYXV0b21ha2UKK2ZpCisjaWYgY2hlY2tfdmVyc2lvbiAkR0VUVEVYVCAkZ2V0dGV4dF92ZXJzX251bSAkZ2V0dGV4dF92ZXJzOyB0aGVuCisjICBjaGVja192ZXJzaW9uICRNU0dNRVJHRSAkZ2V0dGV4dF92ZXJzX251bSAkZ2V0dGV4dF92ZXJzIGdldHRleHQKKyNmaQorCitpZiB0ZXN0ICIkRElFIiA9ICJ5ZXMiOyB0aGVuCisgICAgY2F0IDw8RU9GCisKK05vdGUgdGhhdCB5b3UgbWF5IHVzZSBhbHRlcm5hdGl2ZSB2ZXJzaW9ucyBvZiB0aGUgdG9vbHMgYnkgc2V0dGluZyAKK3RoZSBjb3JyZXNwb25kaW5nIGVudmlyb25tZW50IHZhcmlhYmxlczsgc2VlIFJFQURNRS5TVk4gZm9yIGRldGFpbHMuCisgICAgICAgICAgICAgICAgICAgCitFT0YKKyAgICBleGl0IDEKK2ZpCisKK2VjaG8gIlJ1bm5pbmcgYWNsb2NhbCAtSSBtNCAke0FDTE9DQUxfRkxBR1M6KyRBQ0xPQ0FMX0ZMQUdTIH0uLi4iCiskQUNMT0NBTCAtSSBtNCAkQUNMT0NBTF9GTEFHUworZWNobyAiUnVubmluZyBhdXRvaGVhZGVyLi4uIgorJEFVVE9IRUFERVIKK2VjaG8gIlJ1bm5pbmcgYXV0b21ha2UgLS1nbnUgLi4uIgorJEFVVE9NQUtFIC0tZ251OworZWNobyAiUnVubmluZyBhdXRvY29uZiR7Rk9SQ0V9IC4uLiIKKyRBVVRPQ09ORiR7Rk9SQ0V9CisKK2VjaG8gIllvdSBtYXkgbm93IHJ1bjogCisgIC4vY29uZmlndXJlIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSAmJiBtYWtlCisiCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvY2lwaGVyL0NoYW5nZUxvZyBiL2xpYmdjcnlwdC0xLjQuNi9jaXBoZXIvQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNmRjYWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvY2lwaGVyL0NoYW5nZUxvZwpAQCAtMCwwICsxLDM5NDIgQEAKKzIwMTAtMDctMTMgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGNpcGhlci5jIChkb19hZXN3cmFwX2VuY3J5cHQsIGRvX2Flc3dyYXBfZGVjcnlwdCk6IE5ldy4gIFRha2UKKwlmcm9tIGN1cnJlbnQgU1ZOIHRydW5rLgorCShnY3J5X2NpcGhlcl9vcGVuLCBnY3J5X2NpcGhlcl9lbmNyeXB0LCBnY3J5X2NpcGhlcl9kZWNyeXB0KTogSG9vaworCXRoZW0gaW4uCisJKHN0cnVjdCBnY3J5X2NpcGhlcl9oYW5kbGUpOiBBZGQgZmllbGQgTUFSS1MuCisJKGNpcGhlcl9zZXRrZXksIGNpcGhlcl9zZXRpdik6IFNldCBNQVJLUy4KKwkoY2lwaGVyX3Jlc2V0KTogQ2xlYXIgTUFSS1MuCisKKzIwMTAtMDctMDkgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIHRpZ2VyLmMgKGFzbik6IFVuZmV0dGVyIHRoZSBvbGQgVElHRVIgZnJvbSBhbiBPSUQuCisJKFRJR0VSX0NPTlRFWFQpOiBBZGQgZmllbGQgVkFSSUFOVC4KKwkodGlnZXJfaW5pdCk6IEZhY3RvciBjb2RlIG91dCB0byAuLi4KKwkoZG9faW5pdCk6IC4uLiBuZXcuCisJKHRpZ2VyMV9pbml0LCB0aWdlcjJfaW5pdCk6IE5ldy4KKwkoX2djcnlfZGlnZXN0X3NwZWNfdGlnZXIxLCBfZ2NyeV9kaWdlc3Rfc3BlY190aWdlcjIpOiBOZXcuCisJKiBtZC5jIChkaWdlc3RfdGFibGUpOiBBZGQgVElHRVIxIGFuZCBUSUdFUjIgdmFyaWFudHMuCisKKwkqIG1kLmMgKG1kX3JlYWQpOiBGaXggaW5jb21wbGV0ZSBjaGVjayBmb3IgTlVMTC4gIFJlcG9ydGVkIGJ5CisJRmFiaWFuIEthaWwuCisKKzIwMDktMTItMTEgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChvX2ZsYWdfbXVuZ2luZyk6IE5ldy4KKwkodGlnZXIubywgdGlnZXIubG8pOiBVc2UgaXQuCisKKwkqIHNoYTI1Ni5jIChDaG8sIE1haiwgU3VtMCwgU3VtMSk6IFR1cm4gbWFjcm9zIGludG8gaW5saW5lCisJZnVuY3Rpb25zLgorCSh0cmFuc2Zvcm0pOiBQYXJ0bHkgdW5yb2xsIHRvIGludGVyd2VhdmUgdGhlIGNoYWluIHZhcmlhYmxlcy4KKworCSogc2hhNTEyLmMgKFJPVFIsIENoLCBNYWosIFN1bTAsIFN1bTEpOiBUdXJuIG1hY3JvcyBpbnRvIGlubGluZQorCWZ1bmN0aW9ucy4KKwkodHJhbnNmb3JtKTogUGFydGx5IHVucm9sbCB0byBpbnRlcndlYXZlIHRoZSBjaGFpbiB2YXJpYWJsZXMuCisJU3VnZ2VzdGVkIGJ5IENocmlzdGlhbiBHcm90aG9mZi4KKworMjAwOS0wOC0yMSAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogZHNhLmMgKGRzYV9nZW5lcmF0ZV9leHQpOiBSZWxlYXNlIHJldGZhY3RvcnMgYXJyYXkgYmVmb3JlCisJc2V0dGluZyBpdCB0byBOVUxMLiAgUmVwb3J0ZWQgYnkgRGFpa28gVWVuby4KKworMjAwOS0wMS0yMiAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogZWNjLmMgKGNvbXB1dGVfa2V5Z3JpcCk6IFJlbW92ZSBzdXBlcmZsdW91cyBjb25zdC4KKworMjAwOS0wMS0wNiAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogcm1kMTYwLmMgKG9pZF9zcGVjX3JtZDE2MCk6IEFkZCBUZWxlVHJ1c3QgaWRlbnRpZmllci4KKworMjAwOC0xMi0xMCAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogZHNhLmMgKGdlbmVyYXRlKTogQWRkIGFyZyBET01BSU4gYW5kIHVzZSBpdCBpZiBzcGVjaWZpZWQuCisJKGdlbmVyYXRlX2ZpcHMxODYpOiBEaXR0by4KKwkoZHNhX2dlbmVyYXRlX2V4dCk6IFBhcnNlIGFuZCBjaGVjayB0aGUgb3B0aW9uYWwgImRvbWFpbiIKKwlwYXJhbWV0ZXIgYW5kIHBhc3MgdGhlbSB0byB0aGUgZ2VuZXJhdGUgZnVuY3Rpb25zLgorCisJKiByaWpuZGFlbC5jIChyaWpuZGFlbF9uYW1lcyk6IEFkZCAiQUVTMTI4IiBhbmQgIkFFUy0xMjgiLgorCShyaWpuZGFlbDE5Ml9uYW1lcyk6IEFkZCAiQUVTLTE5MiIuCisJKHJpam5kYWVsMjU2X25hbWVzKTogQWRkICJBRVMtMjU2Ii4KKworMjAwOC0xMi0wNSAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogZHNhLmMgKGdlbmVyYXRlKTogQWRkIGFyZyBUUkFOU0lFTlRfS0VZIGFuZCB1c2UgaXQgdG8gZGV0cm1pbmUKKwl0aGUgUk5HIHF1YWxpdHkgbmVlZGVkLgorCShkc2FfZ2VuZXJhdGVfZXh0KTogUGFyc2UgdGhlIHRyYW5zaWVudC1rZXkgZmxhZyB1bmQgcGFzcyBpdCB0bworCWdlbmVyYXRlLgorCisyMDA4LTExLTI4ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBkc2EuYyAoZ2VuZXJhdGVfZmlwczE4Nik6IEFkZCBhcmcgREVSSVZFUEFSTVMgYW5kIHVzZSB0aGUgc2VlZAorCXZhbHVlIGlmIGF2YWlsYWJsZS4KKworCSogcHJpbWVnZW4uYyAoX2djcnlfZ2VuZXJhdGVfZmlwczE4Nl8yX3ByaW1lKTogRml4IGlubmVyIHAgbG9vcC4KKworMjAwOC0xMS0yNiAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogcHJpbWVnZW4uYyAoX2djcnlfZ2VuZXJhdGVfZmlwczE4Nl8zX3ByaW1lKTogTmV3LgorCSogZHNhLmMgKGdlbmVyYXRlX2ZpcHMxODYpOiBBZGQgYXJnIFVTRV9GSVBTMTg2XzIuCisJKGRzYV9nZW5lcmF0ZV9leHQpOiBQYXJzZSBuZXcgZmxhZyB1c2UtZmlwczE4My0yLgorCisyMDA4LTExLTI1ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBkc2EuYyAoZ2VuZXJhdGVfZmlwczE4Nik6IE5ldy4KKwkoZHNhX2dlbmVyYXRlX2V4dCk6IFVzZSBuZXcgZnVuY3Rpb24gaWYgZGVyaXZlLXBhcm1zIGFyZSBnaXZlbiBvcgorCWlmIGluIEZJUFMgbW9kZS4KKwkqIHByaW1lZ2VuLmMgKF9nY3J5X2dlbmVyYXRlX2ZpcHMxODZfMl9wcmltZSk6IE5ldy4KKworMjAwOC0xMS0yNCAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogcHVia2V5LmMgKGdjcnlfcGtfZ2Vua2V5KTogSW5zZXJ0IGNvZGUgdG8gb3V0cHV0IGV4dHJhaW5mby4KKwkocHVia2V5X2dlbmVyYXRlKTogQWRkIGFyZyBSX0VYVFJBSU5GTyBhbmQgcGFzcyBpdCB0byB0aGUgZXh0ZW5kZWQKKwlrZXkgZ2VuZXJhdGlvbiBmdW5jdGlvbi4KKwkqIHJzYS5jIChnZW5feDkzMV9wYXJtX3hwLCBnZW5feDkzMV9wYXJtX3hpKTogTmV3LgorCShnZW5lcmF0ZV94OTMxKTogR2VuZXJhdGUgcGFyYW1zIGlmIG5vdCBnaXZlbi4KKwkocnNhX2dlbmVyYXRlX2V4dCk6IFBhcnNlIHVzZS14OTMxIGZsYWcuICBSZXR1cm4gcC1xLXN3YXBwZWQKKwlpbmRpY2F0b3IuCisJKiBkc2EuYyAoZHNhX2dlbmVyYXRlX2V4dCk6IFB1dCBSRVRGQUNUT1JTIGludG8gUl9FWFRSQUlORk8gaWYKKwlwb3NzaWJsZS4KKworCSogcHVia2V5LmMgKGdjcnlfcGtfZ2Vua2V5KTogUmVtb3ZlIHBhcnNpbmcgb2YgYWxtb3N0IGFsbAorCXBhcmFtZXRlcnMgYW5kIHBhc3MgdGhlIHBhcmFtZXRlciBTLWV4cHJlc3Npb24gdG8gcHVia2V5X2dlbmVyYXRlLgorCShwdWJrZXlfZ2VuZXJhdGUpOiBTaW1wbGlmeSBieSByZXF1aXRyaW5nIG1vZHVsZXMgdG8gcGFyc2UgdGhlCisJcGFyYW1ldGVycy4gUmVtb3ZlIHRoZSBzcGVjaWFsIGNhc2VzIGZvciBFbGdhbWFsIGFuZCBFQ0MuCisJKHNleHBfZWxlbWVudHNfZXh0cmFjdF9lY2MpOiBBZGQgYXJnIEVYVFJBU1BFQyBhbmQgdXNlIGl0LiAgRml4CisJc21hbGwgbWVtb3J5IGxlYWsuCisJKHNleHBfdG9fa2V5KTogUGFzcyBFWFRSQVNQRUMgdG8gc2V4cF9lbGVtZW50c19leHRyYWN0X2VjYy4KKwkocHVia2V5X3RhYmxlKSBbVVNFX0VMR0FNQUxdOiBBZGQgcmVhbCBleHRyYXNwZWMuCisJKiByc2EuYyAocnNhX2dlbmVyYXRlX2V4dCk6IEFkanVzdCBmb3IgbmV3IGNhbGxpbmcgY29udmVudGlvbi4KKwkqIGRzYS5jIChkc2FfZ2VuZXJhdGVfZXh0KTogRGl0dG8uCisJKiBlbGdhbWFsLmMgKF9nY3J5X2VsZ19nZW5lcmF0ZSk6IERpdHRvLiBSZW5hbWUgdG8gZWxnX2dlbmVyYXRlX2V4dC4KKwkoZWxnX2dlbmVyYXRlKTogTmV3LgorCShfZ2NyeV9lbGdfZ2VuZXJhdGVfdXNpbmdfeCk6IFJlbW92ZSBhZnRlciBtZXJnaW5nIGNvZGUgd2l0aAorCWVsZ19nZW5lcmF0ZV9leHQuCisJKF9nY3J5X3B1YmtleV9leHRyYXNwZWNfZWxnKTogTmV3LgorCShfZ2NyeV9lbGdfY2hlY2tfc2VjcmV0X2tleSwgX2djcnlfZWxnX2VuY3J5cHQsIF9nY3J5X2VsZ19zaWduKSAKKwkoX2djcnlfZWxnX3ZlcmlmeSwgX2djcnlfZWxnX2dldF9uYml0cyk6IE1ha2Ugc3RhdGljIGFuZCByZW1vdmUKKwlfZ2NyeV8gcHJlZml4LgorCSogZWNjLmMgKF9nY3J5X2VjY19nZW5lcmF0ZSk6IFJlbmFtZSB0byBlY2NfZ2VuZXJhdGVfZXh0IGFuZAorCWFkanVzdCBmb3IgbmV3IGNhbGxpbmcgY29udmVudGlvbi4KKwkoX2djcnlfZWNjX2dldF9wYXJhbSk6IFJlbmFtZSB0byBlY2NfZ2V0X3BhcmFtIGFuZCBtYWtlIHN0YXRpYy4KKwkoX2djcnlfcHVia2V5X2V4dHJhc3BlY19lY2RzYSk6IEFkZCBlY2NfZ2VuZXJhdGVfZXh0IGFuZAorCWVjY19nZXRfcGFyYW0uCisJCisyMDA4LTExLTIwICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBwdWJrZXkuYyAocHVia2V5X2dlbmVyYXRlKTogQWRkIGFyZyBERVJJVkVQQVJNUy4KKwkoZ2NyeV9wa19nZW5rZXkpOiBQYXJzZSBkZXJpdmUtcGFybXMgYW5kIHBhc3MgaXQgdG8gYWJvdmUuCisJKiByc2EuYyAoZ2VuZXJhdGVfeDkzMSk6IE5ldy4KKwkocnNhX2dlbmVyYXRlX2V4dCk6IEFkZCBhcmcgREVSSVZFUEFSTVMgYW5kIGNhbGwgbmV3IGZ1bmN0aW9uIGluCisJZmlwcyBtb2RlIG9yIGlmIERFUklWRVBBUk1TIGlzIGdpdmVuLgorCSogcHJpbWVnZW4uYyAoX2djcnlfZGVyaXZlX3g5MzFfcHJpbWUsIGZpbmRfeDkzMV9wcmltZSk6IE5ldy4KKworMjAwOC0xMS0xOSAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogcnNhLmMgKHJzYV9kZWNyeXB0KTogVXNlIGdjcnlfY3JlYXRlX25vbmNlIGZvciBibGluZGluZy4KKwkoZ2VuZXJhdGUpOiBSZW5hbWUgdG8gZ2VuZXJhdGVfc3RkLgorCisyMDA4LTExLTA1ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBtZC5jIChtZF9vcGVuKTogVXNlIGEgc3dpdGNoIHRvIHNldCB0aGUgQnNpemUuCisJKHByZXBhcmVfbWFjcGFkcyk6IEZpeCBsb25nIGtleSBjYXNlIGZvciBTSEEzODQgYW5kIFNIQTUxMi4KKworCSogY2lwaGVyLmMgKGdjcnlfY2lwaGVyX2hhbmRsZSk6IEFkZCBmaWVsZCBFWFRSQVNQRUMuCisJKGdjcnlfY2lwaGVyX29wZW4pOiBTZXQgaXQuCisJKGdjcnlfY2lwaGVyX2N0bCk6IEFkZCBwcml2YXRlIGNvbnRyb2wgY29kZSB0byBkaXNhYmxlIHdlYWsga2V5CisJZGV0ZWN0aW9uIGFuZCB0byByZXR1cm4gdGhlIGN1cnJlbnQgaW5wdXQgYmxvY2suCisJKiBkZXMuYyAoX3RyaXBsZWRlc19jdHgpOiBBZGQgZmllbGQgRkxBR1MuCisJKGRvX3RyaXBsZWRlc19zZXRfZXh0cmFfaW5mbyk6IE5ldy4KKwkoX2djcnlfY2lwaGVyX2V4dHJhc3BlY190cmlwbGVkZXMpOiBBZGQgbmV3IGZ1bmN0aW9uLgorCShkb190cmlwbGVkZXNfc2V0a2V5KTogRGlzYWJsZSB3ZWFrIGtleSBkZXRlY3Rpb24uCisKKzIwMDgtMTAtMjQgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIG1kLmMgKGRpZ2VzdF90YWJsZSk6IEFsbG93IE1ENSBpbiBmaXBzIG1vZGUuCisJKG1kX3JlZ2lzdGVyX2RlZmF1bHQpOiBUYWtlIHNwZWNpYWwgYWN0aW9uIGZvciBNRDUuCisJKG1kX2VuYWJsZSwgZ2NyeV9tZF9oYXNoX2J1ZmZlcik6IERpdHRvLgorCisyMDA4LTA5LTMwICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiByaWpuZGFlbC5jIChkb19zZXRrZXkpOiBQcm9wZXJseSBhbGlnbiAidCIgYW5kICJ0ayIuCisJKHByZXBhcmVfZGVjcnlwdGlvbik6IFByb3Blcmx5IGFsaWduICJ3Ii4gIEZpeGVzIGJ1ZyAjOTM2LgorCisyMDA4LTA5LTE4ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBwdWJrZXkuYyAoZ2NyeV9wa19nZW5rZXkpOiBQYXJzZSBkb21haW4gcGFyYW1ldGVyLgorCShwdWJrZXlfZ2VuZXJhdGUpOiBBZGQgbmV3IGFyZyBET01BSU4gYW5kIHJlbW92ZSBzcGVjaWFsIGNhc2UgZm9yCisJRFNBIHdpdGggcWJpdHMuCisJKiByc2EuYyAocnNhX2dlbmVyYXRlKTogQWRkIGR1bW15IGFyZ3MgUUJJVFMsIE5BTUUgYW5kIERPTUFJTiBhbmQKKwlyZW5hbWUgdG8gcnNhX2dlbmVyYXRlX2V4dC4gIENoYW5nZSBjYWxsZXIuCisJKF9nY3J5X3JzYV9nZW5lcmF0ZSwgX2djcnlfcnNhX2NoZWNrX3NlY3JldF9rZXkpIAorCShfZ2NyeV9yc2FfZW5jcnlwdCwgX2djcnlfcnNhX2RlY3J5cHQsIF9nY3J5X3JzYV9zaWduKSAKKwkoX2djcnlfcnNhX3ZlcmlmeSwgX2djcnlfcnNhX2dldF9uYml0cyk6IE1ha2Ugc3RhdGljIGFuZCByZW1vdmUKKwlfZ2NyeV8gcHJlZml4LgorCShfZ2NyeV9wdWJrZXlfc3BlY19yc2EsIF9nY3J5X3B1YmtleV9leHRyYXNwZWNfcnNhKTogQWRqdXN0IG5hbWVzLgorCSogZHNhLmMgKGRzYV9nZW5lcmF0ZV9leHQpOiBOZXcuCisJKF9nY3J5X2RzYV9nZW5lcmF0ZSk6IFJlcGxhY2UgY29kZSBieSBhIGNhbGwgdG8gZHNhX2dlbmVyYXRlLgorCShfZ2NyeV9kc2FfY2hlY2tfc2VjcmV0X2tleSwgX2djcnlfZHNhX3NpZ24sIF9nY3J5X2RzYV92ZXJpZnkpCisJKF9nY3J5X2RzYV9nZXRfbmJpdHMpOiBNYWtlIHN0YXRpYyBhbmQgcmVtb3ZlIF9nY3J5IHByZWZpeC4KKwkoX2djcnlfZHNhX2dlbmVyYXRlMik6IFJlbW92ZS4KKwkoX2djcnlfcHVia2V5X3NwZWNfZHNhKTogQWRqdXN0IHRvIG5hbWUgY2hhbmdlcy4KKwkoX2djcnlfcHVia2V5X2V4dHJhc3BlY19yc2EpOiBBZGQgZHNhX2dlbmVyYXRlX2V4dC4KKworMjAwOC0wOS0xNiAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogZWNjLmMgKHJ1bl9zZWxmdGVzdHMpOiBBZGQgYXJnIEVYVEVOREVELgorCisyMDA4LTA5LTEyICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiByc2EuYyAodGVzdF9rZXlzKTogRG8gYSBiYWQgY2FzZSBzaWduYXR1cmUgY2hlY2suCisJKiBkc2EuYyAodGVzdF9rZXlzKTogRG8gYSBiYWQgY2FzZSBjaGVjay4KKworCSogY2lwaGVyLmMgKF9nY3J5X2NpcGhlcl9zZWxmdGVzdCk6IEFkZCBhcmcgRVhURU5ERUQgYW5kIHBhc3MgaXQKKwl0byB0aGUgY2FsbGVkIHRlc3RzLgorCSogbWQuYyAoX2djcnlfbWRfc2VsZnRlc3QpOiBEaXR0by4KKwkqIHB1YmtleS5jIChfZ2NyeV9wa19zZWxmdGVzdCk6IERpdHRvLgorCSogcmlqbmRhZWwuYyAocnVuX3NlbGZ0ZXN0cyk6IEFkZCBhcmcgRVhURU5ERUQgYW5kIHBhc3MgaXQgdG8gdGhlCisJY2FsbGVkIHRlc3RzLgorCShzZWxmdGVzdF9maXBzXzEyOCk6IEFkZCBhcmcgRVhURU5ERUQgYW5kIHJ1biBvbmx5IG9uZSB0ZXN0CisJbm9uLWV4dGVuZGVkIG1vZGUuCisJKHNlbGZ0ZXN0X2ZpcHNfMTkyKTogQWRkIGR1bW15IGFyZyBFWFRFTkRFRC4KKwkoc2VsZnRlc3RfZmlwc18yNTYpOiBEaXR0by4KKwkqIGhtYWMtdGVzdHMuYyAoX2djcnlfaG1hY19zZWxmdGVzdCk6IERpdHRvLgorCShydW5fc2VsZnRlc3RzKTogRGl0dG8uCisJKHNlbGZ0ZXN0c19zaGExKTogQWRkIGFyZyBFWFRFTkRFRCBhbmQgcnVuIG9ubHkgb25lIHRlc3QKKwlub24tZXh0ZW5kZWQgbW9kZS4KKwkoc2VsZnRlc3RzX3NoYTIyNCwgc2VsZnRlc3RzX3NoYTI1Nik6IERpdHRvLgorCShzZWxmdGVzdHNfc2hhMzg0LCBzZWxmdGVzdHNfc2hhNTEyKTogRGl0dG8uCisJKiBzaGExLmMgKHJ1bl9zZWxmdGVzdHMpOiBBZGQgYXJnIEVYVEVOREVEIGFuZCBwYXNzIGl0IHRvIHRoZQorCWNhbGxlZCB0ZXN0LgorCShzZWxmdGVzdHNfc2hhMSk6IEFkZCBhcmcgRVhURU5ERUQgYW5kIHJ1biBvbmx5IG9uZSB0ZXN0CisJbm9uLWV4dGVuZGVkIG1vZGUuCisJKiBzaGEyNTYuYyAocnVuX3NlbGZ0ZXN0cyk6IEFkZCBhcmcgRVhURU5ERUQgYW5kIHBhc3MgaXQgdG8gdGhlCisJY2FsbGVkIHRlc3RzLgorCShzZWxmdGVzdHNfc2hhMjI0KTogQWRkIGFyZyBFWFRFTkRFRCBhbmQgcnVuIG9ubHkgb25lIHRlc3QKKwlub24tZXh0ZW5kZWQgbW9kZS4KKwkoc2VsZnRlc3RzX3NoYTI1Nik6IERpdHRvLgorCSogc2hhNTEyLmMgKHJ1bl9zZWxmdGVzdHMpOiBBZGQgYXJnIEVYVEVOREVEIGFuZCBwYXNzIGl0IHRvIHRoZQorCWNhbGxlZCB0ZXN0cy4KKwkoc2VsZnRlc3RzX3NoYTM4NCk6IEFkZCBhcmcgRVhURU5ERUQgYW5kIHJ1biBvbmx5IG9uZSB0ZXN0CisJbm9uLWV4dGVuZGVkIG1vZGUuCisJKHNlbGZ0ZXN0c19zaGE1MTIpOiBEaXR0by4KKwkqIGRlcy5jIChydW5fc2VsZnRlc3RzKTogQWRkIGFyZyBFWFRFTkRFRCBhbmQgcGFzcyBpdCB0byB0aGUKKwljYWxsZWQgdGVzdC4KKwkoc2VsZnRlc3RfZmlwcyk6IEFkZCBkdW1teSBhcmcgRVhURU5ERUQuCisJKiByc2EuYyAocnVuX3NlbGZ0ZXN0cyk6IEFkZCBkdW1teSBhcmcgRVhURU5ERUQuCisKKwkqIGRzYS5jIChydW5fc2VsZnRlc3RzKTogQWRkIGR1bW15IGFyZyBFWFRFTkRFRC4KKworCSogcnNhLmMgKGV4dHJhY3RfYV9mcm9tX3NleHApOiBOZXcuCisJKHNlbGZ0ZXN0X2VuY3JfMTAyNCk6IENoZWNrIHRoYXQgdGhlIGNpcGhlcnRleHQgZG9lcyBub3QgbWF0Y2ggdGhlCisJcGxhaW50ZXh0LgorCSh0ZXN0X2tleXMpOiBJbXByb3ZlIHRlc3RzIGFuZCByZXR1cm4gYW4gZXJyb3Igc3RhdHVzLgorCShnZW5lcmF0ZSk6IFJldHVybiBhbiBlcnJvciBpZiB0ZXN0X2tleXMgZmFpbHMuCisJKiBkc2EuYyAodGVzdF9rZXlzKTogQWRkIGNvbW1lbnRzIGFuZCByZXR1cm4gYW4gZXJyb3Igc3RhdHVzLgorCShnZW5lcmF0ZSk6IFJldHVybiBhbiBlcnJvciBpZiB0ZXN0X2tleXMgZmFpbGVkLgorCisyMDA4LTA5LTExICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiByc2EuYyAoX2djcnlfcnNhX2RlY3J5cHQpOiBSZXR1cm4gYW4gZXJyb3IgaW5zdGVhZCBvZiBjYWxsaW5nCisJQlVHIGluIGNhc2Ugb2YgYSBwcmFjdGljYWxseSBpbXBvc3NpYmxlIGNvbmRpdGlvbi4KKwkoc2FtcGxlX3NlY3JldF9rZXksIHNhbXBsZV9wdWJsaWNfa2V5KTogTmV3LgorCShzZWxmdGVzdF9zaWduXzEwMjQsIHNlbGZ0ZXN0X2VuY3JfMTAyNCk6IE5ldy4KKwkoc2VsZnRlc3RzX3JzYSk6IEltcGxlbWVudCB0ZXN0cy4KKwkqIGRzYS5jIChzYW1wbGVfc2VjcmV0X2tleSwgc2FtcGxlX3B1YmxpY19rZXkpOiBOZXcuCisJKHNlbGZ0ZXN0X3NpZ25fMTAyNCk6IE5ldy4KKwkoc2VsZnRlc3RzX2RzYSk6IEltcGxlbWVudCB0ZXN0cy4KKworMjAwOC0wOS0wOSAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogaG1hYy10ZXN0cy5jIChzZWxmdGVzdHNfc2hhMSk6IEFkZCB0ZXN0cy4KKwkoc2VsZnRlc3RzX3NoYTIyNCwgc2VsZnRlc3RzX3NoYTM4NCwgc2VsZnRlc3RzX3NoYTUxMik6IE1ha2UgdXAgdGVzdHMuCisKKwkqIGhhc2gtY29tbW9uLmMsIGhhc2gtY29tbW9uLmg6IE5ldy4KKwkqIHNoYTEuYyAoc2VsZnRlc3RzX3NoYTEpOiBBZGQgMyB0ZXN0cy4KKwkqIHNoYTI1Ni5jIChzZWxmdGVzdHNfc2hhMjU2LCBzZWxmdGVzdHNfc2hhMjI0KTogRGl0dG8uCisJKiBzaGE1MTIuYyAoc2VsZnRlc3RzX3NoYTUxMiwgc2VsZnRlc3RzX3NoYTM4NCk6IERpdHRvLgorCisyMDA4LTA4LTI5ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBwdWJrZXkuYyAoZ2NyeV9wa19nZXRfa2V5Z3JpcCk6IFJlbW92ZSB0aGUgc3BlY2lhbCBjYXNlIGZvciBSU0EKKwlhbmQgY2hlY2sgd2hldGhlciBhIGN1c3RvbSBjb21wdXRhdGlvbiBmdW5jdGlvbiBoYXMgYmVlbiBzZXR1cC4KKwkqIHJzYS5jIChjb21wdXRlX2tleWdyaXApOiBOZXcuCisJKF9nY3J5X3B1YmtleV9leHRyYXNwZWNfcnNhKTogU2V0dXAgdGhpcyBmdW5jdGlvbi4KKwkqIGVjYy5jIChjb21wdXRlX2tleWdyaXApOiBOZXcuCisJKF9nY3J5X3B1YmtleV9leHRyYXNwZWNfZWNkc2EpOiBTZXR1cCB0aGlzIGZ1bmN0aW9uLgorCisyMDA4LTA4LTI4ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBjaXBoZXIuYyAoY2lwaGVyX2RlY3J5cHQsIGNpcGhlcl9lbmNyeXB0KTogUmV0dXJuIGFuIGVycm9yIGlmCisJbW9kZSBOT05FIGlzIHVzZWQuCisJKGdjcnlfY2lwaGVyX29wZW4pOiBBbGxvdyBtb2RlIE5PTkUgb25seSB3aXRoIGEgZGVidWcgZmxhZyBzZXQgYW5kCisJaWYgbm90IGluIEZJUFMgbW9kZS4KKworMjAwOC0wOC0yNiAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogcHVia2V5LmMgKHB1YmtleV9nZW5lcmF0ZSk6IEFkZCBhcmcgS0VZR0VOX0ZMQUdTLgorCShnY3J5X3BrX2dlbmtleSk6IEltcGxlbWVudCBuZXcgcGFyYW1ldGVyICJ0cmFuc2llbnQta2V5IiBhbmQKKwlwYXNzIGl0IGFzIGZsYWdzIHRvIHB1YmtleV9nZW5lcmF0ZS4KKwkocHVia2V5X2dlbmVyYXRlKTogTWFrZSB1c2Ugb2YgYW4gZXh0X2dlbmVyYXRlIGZ1bmN0aW9uLgorCSogcnNhLmMgKGdlbmVyYXRlKTogQWRkIG5ldyBhcmcgdHJhbnNpZW50X2tleSBhbmQgcGFzcyBhcHByb3ByaWF0ZQorCWFyZ3MgdG8gdGhlIHByaW1lIGdlbmVyYXRvci4KKwkoX2djcnlfcnNhX2dlbmVyYXRlKTogRmFjdG9yIGFsbCBjb2RlIG91dCB0byAuLi4KKwkocnNhX2dlbmVyYXRlKTogLi4gbmV3IGZ1bmMgd2l0aCBleHRyYSBhcmcgS0VZR0VOX0ZMQUdTLgorCShfZ2NyeV9wdWJrZXlfZXh0cmFzcGVjX2VjZHNhKTogU2V0dXAgcnNhX2dlbmVyYXRlLgorCSogcHJpbWVnZW4uYyAoX2djcnlfZ2VuZXJhdGVfc2VjcmV0X3ByaW1lKSAKKwkoX2djcnlfZ2VuZXJhdGVfcHVibGljX3ByaW1lKTogQWRkIG5ldyBhcmcgUkFORE9NX0xFVkVMLgorCisyMDA4LTA4LTIxICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBwcmltZWdlbi5jIChfZ2NyeV9nZW5lcmF0ZV9zZWNyZXRfcHJpbWUpCisJKF9nY3J5X2dlbmVyYXRlX3B1YmxpY19wcmltZSk6IFVzZSBhIGNvbnN0YW50IG1hY3JvIGZvciB0aGUgcmFuZG9tCisJbGV2ZWwuCisJCisyMDA4LTA4LTE5ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBwdWJrZXkuYyAoc2V4cF9lbGVtZW50c19leHRyYWN0X2VjYykgWyFVU0VfRUNDXTogRG8gbm90IGFsbG93CisJYWxsb3cgImN1cnZlIiBwYXJhbWV0ZXIuCisKKzIwMDgtMDgtMTUgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIHB1YmtleS5jIChfZ2NyeV9wa19zZWxmdGVzdCk6IE5ldy4KKwkqIGRzYS5jIChzZWxmdGVzdHNfZHNhLCBydW5fc2VsZnRlc3RzKTogTmV3LgorCSogcnNhLmMgKHNlbGZ0ZXN0c19yc2EsIHJ1bl9zZWxmdGVzdHMpOiBOZXcuCisJKiBlY2MuYyAoc2VsZnRlc3RzX2VjZHNhLCBydW5fc2VsZnRlc3RzKTogTmV3LgorCisJKiBtZC5jIChfZ2NyeV9tZF9zZWxmdGVzdCk6IE5ldy4KKwkqIHNoYTEuYyAocnVuX3NlbGZ0ZXN0cywgc2VsZnRlc3RzX3NoYTEpOiBOZXcuCisJKiBzaGEyNTYuYyAoc2VsZnRlc3RzX3NoYTIyNCwgc2VsZnRlc3RzX3NoYTI1NiwgcnVuX3NlbGZ0ZXN0cyk6IE5ldy4KKwkqIHNoYTUxMi5jIChzZWxmdGVzdHNfc2hhMzg0LCBzZWxmdGVzdHNfc2hhNTEyLCBydW5fc2VsZnRlc3RzKTogTmV3LgorCisJKiBkZXMuYyAoc2VsZnRlc3QpOiBSZW1vdmUgc3RhdGljIHZhcmlhYmxlIGZvcm0gc2VsZnRlc3QuCisJKGRlc19zZXRrZXkpOiBObyBvbi10aGUtZmx5IHNlbGYgdGVzdCBpbiBmaXBzIG1vZGUuCisJKHRyaXBsZWRlc19zZXQza2V5cyk6IERpdHRvLgorCisJKiBjaXBoZXIuYyAoX2djcnlfY2lwaGVyX3NldGtleSwgX2djcnlfY2lwaGVyX3NldGl2KTogCisKKwkqIGRzYS5jIChnZW5lcmF0ZSk6IEJhaWwgb3V0IGluIGZpcHMgbW9kZSBpZiBOQklUUyBpcyBsZXNzIHRoYW4JMTAyNC4KKwkqIHJzYS5jIChnZW5lcmF0ZSk6IFJldHVybiBhbiBlcnJvciBjb2RlIGlmIHRoZSB0aGUgcmVxdWVzdGVkIHNpemUKKwlpcyBsZXNzIHRoYW4gMTAyNCBhbmQgd2UgYXJlIGluIGZwaXMgbW9kZS4KKwkoX2djcnlfcnNhX2dlbmVyYXRlKTogVGFrZSBjYXJlIG9mIHRoYXQgZXJyb3IgY29kZS4KKworCSogZWNjLmMgKGdlbmVyYXRlX2N1cnZlKTogSW4gZmlwcyBtb2RlIGVuYWJsZSBvbmx5IE5JU1QgY3VydmVzLgorCisJKiBjaXBoZXIuYyAoX2djcnlfY2lwaGVyX3NlbGZ0ZXN0KTogTmV3LgorCisJKiBzaGE1MTIuYyAoX2djcnlfZGlnZXN0X2V4dHJhc3BlY19zaGEzODQpCisJKF9nY3J5X2RpZ2VzdF9leHRyYXNwZWNfc2hhNTEyKTogTmV3LgorCSogc2hhMjU2LmMgKF9nY3J5X2RpZ2VzdF9leHRyYXNwZWNfc2hhMjI0KQorCShfZ2NyeV9kaWdlc3RfZXh0cmFzcGVjX3NoYTI1Nik6IE5ldy4KKwkqIHNoYTEuYyAoX2djcnlfZGlnZXN0X2V4dHJhc3BlY19zaGExKTogTmV3LgorCSogZWNjLmMgKF9nY3J5X3B1YmtleV9leHRyYXNwZWNfZWNkc2EpOiBOZXcuCisJKiBkc2EuYyAoX2djcnlfcHVia2V5X2V4dHJhc3BlY19kc2EpOiBOZXcuCisJKiByc2EuYyAoX2djcnlfcHVia2V5X2V4dHJhc3BlY19yc2EpOiBOZXcuCisJKiByaWpuZGFlbC5jIChfZ2NyeV9jaXBoZXJfZXh0cmFzcGVjX2FlcykKKwkoX2djcnlfY2lwaGVyX2V4dHJhc3BlY19hZXMxOTIsIF9nY3J5X2NpcGhlcl9leHRyYXNwZWNfYWVzMjU2KTogTmV3LgorCSogZGVzLmMgKF9nY3J5X2NpcGhlcl9leHRyYXNwZWNfdHJpcGxlZGVzKTogTmV3LgorCisJKiBjaXBoZXIuYyAoZ2NyeV9jaXBoZXJfcmVnaXN0ZXIpOiBSZW5hbWUgdG8gX2djcnlfY2lwaGVyX3JlZ2lzdGVyLgorCUFkZCBhcmcgRVhUUkFTUEVDLgorCShkdW1teV9leHRyYV9zcGVjKTogTmV3LgorCShjaXBoZXJfdGFibGVfZW50cnkpOiBBZGQgZXh0cmFzcGVjIGZpZWxkLgorCSogbWQuYyAoX2djcnlfbWRfcmVnaXN0ZXIpOiBSZW5hbWUgdG8gX2djcnlfbWRfcmVnaXN0ZXIuICBBZGQKKwlhcmcgRVhUUkFTUEVDLgorCShkdW1teV9leHRyYV9zcGVjKTogTmV3LgorCShkaWdlc3RfdGFibGVfZW50cnkpOiBBZGQgZXh0cmFzcGVjIGZpZWxkLgorCSogcHVia2V5LmMgKGdjcnlfcGtfcmVnaXN0ZXIpOiBSZW5hbWUgdG8gX2djcnlfcGtfcmVnaXN0ZXIuICBBZGQKKwlhcmcgRVhUUkFTUEVDLgorCShkdW1teV9leHRyYV9zcGVjKTogTmV3LgorCShwdWJrZXlfdGFibGVfZW50cnkpOiBBZGQgZXh0cmFzcGVjIGZpZWxkLgorCisJKiBhYy5jOiBMZXQgbW9zdCBwdWJsaWMgZnVuY3Rpb25zIHJldHVybiBHUEdfRVJSX1VOU1VQUE9SVEVEIGluCisJZmlwcyBtb2RlLgorCisJKiBwdWJrZXkuYyAocHVia2V5X3RhYmxlX2VudHJ5KTogQWRkIGZpZWxkIEZJUFNfQUxMT1dFRCBhbmQgbWFyaworCWFwcHJvcHJpYXRlIGFsZ29yaXRobXMuCisJKGR1bW15X2dlbmVyYXRlLCBkdW1teV9jaGVja19zZWNyZXRfa2V5LCBkdW1teV9lbmNyeXB0KSAKKwkoZHVtbXlfZGVjcnlwdCwgZHVtbXlfc2lnbiwgZHVtbXlfdmVyaWZ5LCBkdW1teV9nZXRfbmJpdHMpOiBTaWduYWwKKwlhIGZpcHMgZXJyb3Igd2hlbiB1c2VkLgorCShnY3J5X3BrX3JlZ2lzdGVyKTogSW4gZmlwcyBtb2RlIGRvIG5vdCBhbGxvdyB0byByZWdpc3RlciBuZXcKKwlhbGdvcml0aG1zLgorCisJKiBtZC5jIChkaWdlc3RfdGFibGUpOiBBZGQgZmllbGQgRklQU19BTExPV0VEIGFuZCBtYXJrIGFwcHJvcHJpYXRlCisJYWxnb3JpdGhtcy4KKwkobWRfcmVnaXN0ZXJfZGVmYXVsdCk6IEluIGZpcHMgbW9kZSByZWdpc3RlciBvbmx5IGZpcHMgYWxnb3JpdGhtcy4KKwkoZ2NyeV9tZF9yZWdpc3Rlcik6IEluIGZpcHMgbW9kZSBkbyBub3QgYWxsb3cgdG8gcmVnaXN0ZXIgbmV3CisJYWxnb3JpdGhtcy4KKwkoZ2NyeV9tZF9nZXQpOiBTaWduYWwgYSBmaXBzIGVycm9yIGlmIGNhbGxlZC4KKwkoZ2NyeV9tZF9oYXNoX2J1ZmZlcik6IERvIG5vdCBhbGxvdyBybWQxNjAgd2hlbiBub3QgaW4gZmlwcyBtb2RlLgorCShtZF9zdGFydF9kZWJ1Zyk6IERpc2FibGUgaW4gZmlwc19tb2RlLgorCisJKiBtZC5jIChnY3J5X21kX3JlZ2lzdGVyX2RlZmF1bHQpOiBSZW5hbWUgdG8gLi4KKwkobWRfcmVnaXN0ZXJfZGVmYXVsdCk6IC4uIHRoaXMuCisJKG1kX2RpZ2VzdCk6IFJlbW92ZSB0aGlzIGNvbW1lbnRlZCBmdWNudGlvbi4KKwkqIHB1YmtleS5jIChnY3J5X3BrX3JlZ2lzdGVyX2RlZmF1bHQpOiBSZW5hbWUgdG8gLi4KKwkocGtfcmVnaXN0ZXJfZGVmYXVsdCk6IC4uIHRoaXMuCisKKwkqIGNpcGhlci5jIChjaXBoZXJfdGFibGVfZW50cnkpOiBBZGQgZmllbGQgRklQU19BTExPV0VELgorCShnY3J5X2NpcGhlcl9yZWdpc3Rlcl9kZWZhdWx0KTogUmVnaXN0ZXIgb25seSBmaXBzIGFwcHJvdmVkCisJYWxnb3JpdGhtcy4KKwkoZ2NyeV9jaXBoZXJfcmVnaXN0ZXIpOiBEbyBub3QgYWxsb3cgdG8gcmVnaXN0ZXIgbmV3IGNpcGhlcnMuCisJKGNpcGhlcl9zZXRpdik6IFNpZ25hbCBmaXBzIGVycm9yLgorCQorCSogY2lwaGVyIChnY3J5X2NpcGhlcl9yZWdpc3Rlcl9kZWZhdWx0KTogUmVuYW1lIHRvIC4uCisJKGNpcGhlcl9yZWdpc3Rlcl9kZWZhdWx0KTogLi4gdGhpcy4KKwkoUkVHSVNURVJfREVGQVVMVF9DSVBIRVJTKTogQWRqdXN0IGZvciB0aGF0IGNoYW5nZS4KKworMjAwOC0wNy0wNSAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogcmFuZG9tLWRhZW1vbi5jLCByYW5kb20uaCwgcm5kaHcuYywgcm5kdW5peC5jLCByYW5kLWludGVybmFsLmgKKwkqIHJhbmRvbS5jLCBybmRlZ2QuYywgcm5kbGludXguYywgcm5kdzMyLmM6IE1vdmUgdG8gLi4vY2lwaGVyLgorCSogTWFrZWZpbGUuYW06IFJlbW92ZSByYW5kb20gc3R1ZmYuCisKKzIwMDgtMDYtMjQgIFN6YWthdHMgSXN0dmFuIDxzemFraS5tc0BnbWFpbC5jb20+ICAod2spCisKKwkqIGFjLmMgKF9nY3J5X2FjX2tleV9kZXN0cm95LCBfZ2NyeV9hY19rZXlfcGFpcl9nZW5lcmF0ZSk6IFJlbGFzZQorCXNvbWUgbW9yZSBtZW1vcnkuCisKKzIwMDgtMDQtMjIgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIHJpam5kYWVsLmMgKF9nY3J5X2Flc19jZmJfZW5jLCBfZ2NyeV9hZXNfY2JjX2VuYykgCisJKF9nY3J5X2Flc19jZmJfZGVjLCBfZ2NyeV9hZXNfY2JjX2RlYyk6IFVzZSBQYWRsb2NrIGlmIHBvc3NpYmxlLgorCisyMDA4LTA0LTE4ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBzaGExLmMgKHRyYW5zZm9ybV9hbGlnbmVkKTogUmVtb3ZlLiAgVGhhdCBpcyB3aWxsIG9idmlvc3VseSBub3QKKwl3b3JrIGJlY2F1c2Ugd2UgbmVlZCBhIHNjcmF0Y2ggd29ya2luZyBhcmVhIGFuZCBvdXIgaW50ZXJuYWwgQVBJCisJZG9lcyBub3QgYWxsb3cgdG8gbW9kaWZ5IHRoZSBidWZmZXJzLgorCisJKiByaWpuZGFlbC5jOiBGYWN0b3IgdGFibGVzIG91dCB0byAuLgorCSogcmlqbmRhZWwtdGFibGVzLmg6IC4uIG5ldy4KKworCSogYWMuYyAoYWNfZGF0YV9leHRyYWN0KTogTWFrZSBzdGF0aWMuCisKKwkqIGNhbWVsbGlhLmggW0hBVkVfQ09ORklHX0hdOiBJbmNsdWRlIGNvbmZpZy5oLgorCisJKiBybmR3MzIuYyAocmVnaXN0cnlfcG9sbCk6IE9ubHkgcHJpbnQgdGhlIHBlcmZvcm1hbmNlIGRhdGEKKwlwcm9ibGVtIHdhcm5pbmcgb25jZS4gIFN1Z2dlc3RlZCBieSBTaW1vbiBKb3NlZnNzb24uCisKKzIwMDgtMDMtMTkgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGNpcGhlci5jIChnY3J5X2NpcGhlcl9vcGVuKSBbVVNFX0FFU106IEluaXQgYnVsayBlbmNyeXB0aW9uIG9ubHkKKwlpZiByZXF1ZXN0ZWQuICBTdWdnZXN0ZWQgYnkgRGlyayBTdG9lY2tlci4KKworMjAwOC0wMy0xOCAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogc2hhMS5jOiBJbmNsdWRlIHN0ZGludC5oLgorCSh0cmFuc2Zvcm0pOiBBZGQgYXJnIE5CTE9DS1Mgc28gdGhhdCB3ZSBjYW4gd29yayBvbiBtb3JlIHRoYW4gb25lCisJYmxvY2sgYW5kIGF2b2lkIHVwZGF0ZXMgb2YgdGhlIGNoYWluaW5nIHZhcmlhYmxlcy4gIENoYW5nZWQgYWxsCisJY2FsbGVycyB0byB1c2UgMS4KKwkoc2hhMV93cml0ZSk6IFJlcGxhY2UgbG9vcCBhcm91bmQgdHJhbnNmb3JtLgorCSh0cmFuc2Zvcm1fYWxpZ25lZCkgW1dPUkRTX0JJR0VORElBTl06IE5ldy4KKwkoVFJBTlNGT1JNKTogTmV3IG1hY3JvIHRvIHJlcGxhY2UgYWxsIGRpcmVjdCBjYWxscyBvZiB0cmFuc2Zvcm0uCisKKzIwMDgtMDMtMTcgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIHJpam5kYWVsLmMgKF9nY3J5X2Flc19jZmJfZGVjKTogTmV3LgorCShkb19lbmNyeXB0KTogRmFjdG9yIGNvZGUgb3V0IHRvIC4uCisJKGRvX2VuY3J5cHRfYWxpZ25lZCk6IC4uIE5ldy4KKwkoX2djcnlfYWVzX2NmYl9lbmMsIF9nY3J5X2Flc19jZmJfZGVjKTogVXNlIG5ldyBmdW5jdGlvbi4KKwkoZG9fZGVjcnlwdCk6IEZhY3RvciBjb2RlIG91dCB0byAuLgorCShkb19kZWNyeXB0X2FsaWduZWQpOiAuLiBuZXcuCisJKF9nY3J5X2Flc19jYmNfZW5jLCBfZ2NyeV9hZXNfY2JjX2RlYyk6IE5ldy4KKwkqIGNpcGhlci5jIChzdHJ1Y3QgZ2NyeV9jaXBoZXJfaGFuZGxlKTogUHV0IGZpZWxkIElWIGludG8gbmV3CisJdW5pb24gVV9JViB0byBlbmZvcmNlIHByb3BlciBhbGlnbm1lbnQuICBDaGFuZ2UgYWxsIHVzZXJzLgorCShkb19jZmJfZGVjcnlwdCk6IE9wdGltaXplLgorCShkb19jYmNfZW5jcnlwdCwgZG9fY2JjX2RlY3J5cHQpOiBPcHRpbWl6ZS4KKworMjAwOC0wMy0xNSAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogcmlqbmRhZWwuYyAoX2djcnlfYWVzX2NmYl9lbmMpOiBOZXcuCisJKiBjaXBoZXIuYyAoc3RydWN0IGdjcnlfY2lwaGVyX2hhbmRsZSk6IEFkZCBmaWVsZCBBTEdPIGFuZCBCVUxLLgorCShnY3J5X2NpcGhlcl9vcGVuKTogU2V0IEFMR08gYW5kIEJVTEsuCisJKGRvX2NmYl9lbmNyeXB0KTogT3B0aW1pemUuCisKKzIwMDgtMDItMTggIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIHJzYS5jIChfZ2NyeV9yc2FfdmVyaWZ5KSBbSVNfREVWRUxPUE1FTlRfVkVSU0lPTl06IFByaW50CisJaW50ZXJtZWRpYXRlIHJlc3VsdHMuCisKKzIwMDgtMDEtMDggIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIHJhbmRvbS5jIChhZGRfcmFuZG9tbmVzcyk6IERvIG5vdCBqdXN0IGluY3JlbWVudAorCVBPT0xfRklMTEVEX0NPVU5URVIgYnV0IHVwZGF0ZSBpdCBieSB0aGUgYWN0dWFsIGFtb3VudCBvZiBkYXRhLgorCisyMDA3LTEyLTEzICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBwdWJrZXkuYyAoc2V4cF9kYXRhX3RvX21waSk6IFN1cHBvcnQgU0hBLTIyNC4KKworMjAwNy0xMi0wNSAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogcmlqbmRhZWwuYyAoVVNFX1BBRExPQ0spOiBEZXBlbmQgb24gRU5BQkxFX1BBRExPQ0tfU1VQUE9SVC4KKwkqIHJuZGh3LmMgKFVTRV9QQURMT0NLKTogRGl0dG8KKworCSogcnNhLmMgKHNlY3JldCk6IEZpeGVkIGNvbmRpdGlvbiB0ZXN0IGZvciB1c2luZyBDUlQuICBSZXBvcnRlZCBieQorCURlYW4gU2NhcmZmLiAgRml4ZXMgYnVnIzg2NC4KKwkoX2djcnlfcnNhX2NoZWNrX3NlY3JldF9rZXkpOiBSZXR1cm4gYW4gZXJybyBpZiB0aGUgb3B0aW9uYWwKKwlwYXJhbWV0ZXJzIGFyZSBtaXNzaW5nLgorCSogcHVia2V5LmMgKHNleHBfZWxlbWVudHNfZXh0cmFjdCk6IEFkZCBhcmcgQUxHT19OQU1FLiBDaGFuZ2VkIGFsbAorCWNhbGxlcnMgdG8gcGFzcyBOVUxMLiBBZGQgaGFjayB0byBhbGxvdyBmb3Igb3B0aW9uYWwgUlNBCisJcGFyYW1ldGVycy4KKwkoc2V4cF90b19rZXkpOiBQYXNzIGFsZ28gbmFtZSB0byBzZXhwX2VsZW1lbnRzX2V4dHJhY3QuCisKKzIwMDctMTItMDMgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIHJhbmRvbS5jIChnY3J5X3JhbmRvbV9hZGRfYnl0ZXMpOiBJbXBsZW1lbnQgaXQuCisJKiByYW5kLWludGVybmFsLmggKFJBTkRPTV9PUklHSU5fRVhURVJOQUwpOiBOZXcuCisKKzIwMDctMTEtMzAgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIHJuZGh3LmM6IE5ldy4KKwkqIHJuZGxpbnV4LmMgKF9nY3J5X3JuZGxpbnV4X2dhdGhlcl9yYW5kb20pOiBUcnkgdG8gcmVhZCA1MCUKKwlkaXJlY3RseSBmcm9tIHRoZSBod3JuZy4KKwkqIHJhbmRvbS5jIChkb19mYXN0X3JhbmRvbV9wb2xsKTogQWxzbyBydW4gdGhlIGh3IHJuZyBmYXN0IHBvbGwuCisJKF9nY3J5X3JhbmRvbV9kdW1wX3N0YXRzKTogVGVsbCB3aGV0aGVyIHRoZSBodyBybmcgZmFpbGVkLgorCisyMDA3LTExLTI5ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiByaWpuZGFlbC5jIChVU0VfUEFETE9DSyk6IERlZmluZSBuZXcgbWFjcm8gdXNlZCBmb3IgaWEzMi4KKwkoUklKTkRBRUxfY29udGV4dCkgW1VTRV9QQURMT0NLXTogQWRkIGZpZWxkcyBVU0VfUEFETE9DSyBhbmQKKwlQQURMT0NLX0tFWS4KKwkoZG9fc2V0a2V5KSBbVVNFX1BBRExPQ0tdOiBFbmFibGUgcGFkbG9jayBpZiBhdmFpbGFibGUgZm9yIDEyOCBiaXQKKwlBRVMuCisJKGRvX3BhZGxvY2spIFtVU0VfUEFETE9DS106IE5ldy4KKwkocmlqbmRhZWxfZW5jcnlwdCwgcmlqbmRhZWxfZGVjcnlwdCkgW1VTRV9QQURMT0NLXTogRGl2ZXJ0IHRvCisJZG9fcGFkbG9jay4KKwkqIGNpcGhlci5jIChjaXBoZXJfY29udGV4dF9hbGlnbm1lbnRfdCk6IE5ldy4gIFVzZSBpdCBpbiB0aGlzCisJbW9kdWxlIGluIHBsYWNlIG9mIFBST1BFUkxZX0FMSUdORURfVFlQRS4KKwkoTkVFRF8xNkJZVEVfQUxJR05FRF9DT05URVhUKTogRGVmaW5lIG1hY3JvIGZvciBpYTMyLgorCShzdHJ1Y3QgZ2NyeV9jaXBoZXJfaGFuZGxlKTogQWRkIGZpZWxkIEhBTkRMRV9PRkZTRVQuCisJKGdjcnlfY2lwaGVyX29wZW4pOiBUYWtlIGNhcmUgb2YgaW5jcmVhc2VkIGFsaWdubWVudCByZXF1aXJlbWVudHMuCisJKGdjcnlfY2lwaGVyX2Nsb3NlKTogRGl0dG8uCisKKzIwMDctMTEtMjggIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIHNoYTI1Ni5jIChhc24yMjQpOiBGaXhlZCB3cm9uZyB0ZW1wbGF0ZS4gIEl0IGhhcHBlbmVkIGR1ZSB0byBhCisJYnVnIGluIFJGQzQ4ODAuICBTSEEtMjI0IGlzIG5vdCBpbiB0aGUgc3RhYmxlIHZlcnNpb24gb2YgbGliZ2NyeXB0CisJc28gdGhlIGNvbnNlcXVlbmNlcyBhcmUgbGltaXRlZCB0byB1c2VycyBvZiB0aGlzIGRldmVsIHZlcnNpb24uCisKKzIwMDctMTAtMzEgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGFjLmMgKGdjcnlfYWNfZGF0YV9uZXcpOiBSZW1vdmUgZHVlIHRvIHRoZSB2aXNpYmlsaXR5IHdyYXBwZXIuCisJKGdjcnlfYWNfZGF0YV9kZXN0cm95LCBnY3J5X2FjX2RhdGFfY29weSwgZ2NyeV9hY19kYXRhX2xlbmd0aCkgCisJKGdjcnlfYWNfZGF0YV9zZXQsIGdjcnlfYWNfZGF0YV9nZXRfbmFtZSwgZ2NyeV9hY19kYXRhX2dldF9pbmRleCkgCisJKGdjcnlfYWNfZGF0YV90b19zZXhwLCBnY3J5X2FjX2RhdGFfZnJvbV9zZXhwKSAKKwkoZ2NyeV9hY19kYXRhX2NsZWFyLCBnY3J5X2FjX2lvX2luaXQsIGdjcnlfYWNfb3BlbikgCisJKGdjcnlfYWNfY2xvc2UsIGdjcnlfYWNfa2V5X2luaXQsIGdjcnlfYWNfa2V5X3BhaXJfZ2VuZXJhdGUpIAorCShnY3J5X2FjX2tleV9wYWlyX2V4dHJhY3QsIGdjcnlfYWNfa2V5X2Rlc3Ryb3kpIAorCShnY3J5X2FjX2tleV9wYWlyX2Rlc3Ryb3ksIGdjcnlfYWNfa2V5X2RhdGFfZ2V0KSAKKwkoZ2NyeV9hY19rZXlfdGVzdCwgZ2NyeV9hY19rZXlfZ2V0X25iaXRzLCBnY3J5X2FjX2tleV9nZXRfZ3JpcCkgCisJKGdjcnlfYWNfZGF0YV9lbmNyeXB0LCBnY3J5X2FjX2RhdGFfZGVjcnlwdCwgZ2NyeV9hY19kYXRhX3NpZ24pIAorCShnY3J5X2FjX2RhdGFfdmVyaWZ5LCBnY3J5X2FjX2RhdGFfZW5jb2RlLCBnY3J5X2FjX2RhdGFfZGVjb2RlKSAKKwkoZ2NyeV9hY19tcGlfdG9fb3MsIGdjcnlfYWNfbXBpX3RvX29zX2FsbG9jLCBnY3J5X2FjX29zX3RvX21waSkgCisJKGdjcnlfYWNfZGF0YV9lbmNyeXB0X3NjaGVtZSwgZ2NyeV9hY19kYXRhX2RlY3J5cHRfc2NoZW1lKSAKKwkoZ2NyeV9hY19kYXRhX3NpZ25fc2NoZW1lLCBnY3J5X2FjX2RhdGFfdmVyaWZ5X3NjaGVtZSkgCisJKGdjcnlfYWNfaW9faW5pdF92YSk6IERpdHRvLgorCShnY3J5X2FjX2lkX3RvX25hbWUsIGdjcnlfYWNfbmFtZV90b19pZCk6IFJlbW92ZSBhcyB0aGVzZQorCWRlcHJlY2F0ZWQgZnVuY3Rpb25zIGFyZSBub3cgaW1wbGVtZW50ZWQgYnkgdmlzaWJpbGl0eS5jLgorCisyMDA3LTEwLTI2ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBybmR3MzIuYzogRGlzYWJsZSBkZWJ1ZyBmbGFnLgorCisyMDA3LTEwLTI1ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBybmR3MzIuYzogVXBkYXRlZCBmcm9tIGN1cnJlbnQgY3J5cHRsaWIgc25hcHNob3QgYW5kIG1vZGlmaWVkCisJZm9yIG91ciB1c2UuICBSZW1vdmVkIHN1cHBvcnQgZnJvbSBwcmUgTlQgc3lzdGVtcy4KKwkoc2xvd19nYXRoZXJlcl93aW5kb3dzOTUpOiBSZW1vdmUuCisJKF9nY3J5X3JuZHczMl9nYXRoZXJfcmFuZG9tKTogUmVxdWlyZSBhbiBOVCBwbGF0Zm9ybS4KKwkoaW5pdF9zeXN0ZW1fcm5nLCByZWFkX3N5c3RlbV9ybmcsIHJlYWRfbWJtX2RhdGEpOiBOZXcuCisJKHNsb3dfZ2F0aGVyZXJfd2luZG93c05UKTogUmVuYW1lIHRvIC4uLgorCShzbG93X2dhdGhlcmVyKTogLi4gdGhpcy4gIFJlYWQgc3lzdGVtIFJORyBhbmQgTUJNLgorCShyZWdpc3RyeV9wb2xsKTogTmV3IHdpdGggY29kZSBmYWN0b3JlZCBvdXQgZnJvbSBzbG93X2dhdGhlcmVyLgorCisyMDA3LTA4LTIzICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiByYW5kb20uYyAocG9vbF9maWxsZWRfY291bnRlcik6IE5ldy4KKwkoYWRkX3JhbmRvbW5lc3MpOiBVc2UgaXQuCisKKzIwMDctMDgtMjIgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIHJuZHczMi5jLCBybmR1bml4LmM6IFN3aXRjaGVkIHRvIExHUEwuCisKKzIwMDctMDUtMzAgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGNhbWVsbGlhLmgsIGNhbWVsbGlhLmM6IFJlcGxhY2UgYnkgbmV3IExHUEwgdmVyc2lvbiBhbmQgYWRqdXN0ZWQKKwljYW1lbGxpYS5oLgorCisyMDA3LTA1LTA5ICBNYXJjdXMgQnJpbmttYW5uICA8bWFyY3VzQGcxMGNvZGUuZGU+CisKKwkqIGFjLmMgKF9nY3J5X2FjX2lvX2luaXRfdmEsIF9nY3J5X2FjX2lvX3dyaXRlLCBfZ2NyeV9hY19pb19yZWFkKToKKwlBZGp1c3QgdXNlcnMgb2YgZ2NyeV9hY19pb190IGJlY2F1c2UgdW5pb24gaXMgbm90IGFub255bW91cworCWFueW1vcmUuCisKKzIwMDctMDUtMDIgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGNhbWVsbGlhLWdsdWUuYyAoY2FtZWxsaWFfc2V0a2V5LCBjYW1lbGxpYV9lbmNyeXB0KQorCShjYW1lbGxpYV9kZWNyeXB0KTogUmVjYWxjdWxhdGVkIHVzZWQgc3RhY2sgc2l6ZSBpbiBjYWxsZWQKKwlmdW5jdGlvbnMuCisJKiBjYW1lbGxpYS5oOiBSZWRlZmluZSBleHRlcm5hbCBzeW1ib2xzLgorCisyMDA3LTA1LTAyICBEYXZpZCBTaGF3ICA8ZHNoYXdAamFiYmVyd29ja3kuY29tPgorCisJKiBNYWtlZmlsZS5hbSwgY2lwaGVyLmM6IEFkZCBDYW1lbGxpYS4KKworCSogY2FtZWxsaWEtZ2x1ZS5jOiBOZXcuICBUaGUgbmVjZXNzYXJ5IGdsdWUgdG8gaW50ZXJmYWNlIGxpYmdjcnlwdAorCXRvIHRoZSBzdG9jayBOVFQgQ2FtZWxsaWEgZGlzdHJpYnV0aW9uLgorCisJKiBjYW1lbGxpYS5oLCBjYW1lbGxpYS5jOiBUaGUgc3RvY2sgTlRUIENhbWVsbGlhIGRpc3RyaWJ1dGlvbgorCShHUEwpLgorCisyMDA3LTA0LTMwICBEYXZpZCBTaGF3ICA8ZHNoYXdAamFiYmVyd29ja3kuY29tPgorCisJKiBjaXBoZXIuYzogVXNlICNpZiBpbnN0ZWFkIG9mICNpZmRlZiBhcyBjb25maWd1cmUgZGVmaW5lcyB0aGUKKwlVU0VfY2lwaGVyIGRlZmluZXMgYXMgMCBmb3IgZGlzYWJsZWQuCisKKzIwMDctMDQtMzAgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIHJuZGVnZC5jIChfZ2NyeV9ybmRlZ2Rfc2V0X3NvY2tldF9uYW1lKTogTmV3LgorCisyMDA3LTA0LTMwICBNYXJjdXMgQnJpbmttYW5uICA8bWFyY3VzQGcxMGNvZGUuZGU+CisKKwkqIGVjYy5jIChlYzJvcyk6IEZpeCByZWxvY2F0aW9uIG9mIHNob3J0IG51bWJlcnMuCisKKwkqIGVjYy5jIChnZW5lcmF0ZV9rZXkpOiBEbyBub3QgYWxsb2NhdGUgRCwgd2hpY2ggd2lsbCBiZSBhbGxvY2F0ZWQKKwlieSBHRU5fSy4gIFJlbW92ZSBHLiAgRml4IHRlc3QgaWYgZ194LCBnX3kgcmVzcC4gcV94LCBxX3kgYXJlCisJcmVxdWVzdGVkLgorCShfZ2NyeV9lY2NfZ2VuZXJhdGUpOiBSZWxlYXNlIHVubmVlZGVkIG1lbWJlcnMgb2YgU0suCisJKiBwdWJrZXkuYyAoc2V4cF90b19rZXkpOiBSZWxlYXNlIE5BTUUuCisKKzIwMDctMDQtMjggIE1hcmN1cyBCcmlua21hbm4gIDxtYXJjdXNAZzEwY29kZS5kZT4KKworCSogYWMuYyAoZ2NyeV9hY19tcGkpOiBSZW1vdmUgbWVtYmVyIE5BTUVfUFJPVklERUQuCisJKGFjX2RhdGFfbXBpX2NvcHksIF9nY3J5X2FjX2RhdGFfc2V0LCBfZ2NyeV9hY19kYXRhX2dldF9uYW1lKQorCShfZ2NyeV9hY19kYXRhX2dldF9pbmRleCwgYWNfZGF0YV9jb25zdHJ1Y3QpOiBBZGp1c3QgaGFuZGxpbmcgb2YKKwlOQU1FIGFjY29yZGluZ2x5LgorCisyMDA3LTA0LTIwICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBlY2MuYyAoZG9tYWluX3Bhcm1zKTogQWRkIHN0YW5kYXJkIGJyYWlucG9vbCBjdXJ2ZXMuCisKKzIwMDctMDQtMTggIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGVjYy5jIChnZW5lcmF0ZV9jdXJ2ZSk6IEltcGxlbWVudCBhbGlhcyBtZWNoYW5pc20uCisKKwkqIHB1YmtleS5jIChzZXhwX2VsZW1lbnRzX2V4dHJhY3RfZWNjKTogTmV3LgorCShzZXhwX3RvX2tleSk6IEFkZCBzcGVjaWFsIGNhc2UgZm9yIGVjYy4KKwkoc2V4cF90b19rZXksIHNleHBfdG9fc2lnLCBzZXhwX3RvX2VuYywgZ2NyeV9wa19nZW5rZXkpOiBSZXBsYWNlCisJbmFtZV90ZXJtaW5hdGVkIHN0dWZmIGJ5IGEgY2FsbCB0byBfZ2NyeV9zZXhwX250aF9zdHJpbmcuCisJKGdjcnlfcGtfZ2V0X2tleWdyaXApOiBEaXR0by4KKworMjAwNy0wNC0xNiAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogZWNjLmMgKF9nY3J5X2VjY19nZW5lcmF0ZSk6IFJlbmFtZWQgRFVNTVkgdG8gQ1VSVkUgYW5kIHVzZSBpdC4KKworMjAwNy0wNC0xMyAgTWFyY3VzIEJyaW5rbWFubiAgPG1hcmN1c0BnMTBjb2RlLmRlPgorCisJKiBhYy5jIChhY19kYXRhX2NvbnN0cnVjdCk6IENhc3QgY29uc3QgYXdheSB0byBzdXBwcmVzcyBjb21waWxlcgorCXdhcm5pbmcuCisKKwkqIGVjYy5jIChlY2NfZ2VuZXJhdGUpOiBBdm9pZCBjb21waWxlciB3YXJuaW5nIGZvciB1bnVzZWQgYXJndW1lbnQKKwlEVU1NWS4KKwkoZWNjX3ZlcmlmeSk6IEF2b2lkIGNvbXBpbGVyIHdhcm5pbmcgZm9yIHVudXNlZCBhcmd1bWVudHMgQ01QIGFuZAorCU9QQVFVRVYuCisKKzIwMDctMDQtMDYgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIHNoYTEuYyAob2lkX3NwZWNfc2hhMSk6IEFkZCBhbm90aGVyIG9pZCBmcm9tIFg5LjYyLgorCisyMDA3LTAzLTI4ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBwdWJrZXkuYyAoZ2NyeV9wa19nZW5rZXkpOiBEbyBub3QgaXNzdWUgbWlzYy1rZXktaW5mbyBpZiBpdCBpcworCWVtcHR5LgorCShnY3J5X3BrX2dlbmtleSk6IE5ldyBwYXJhbWV0ZXIgImN1cnZlIi4KKworCSogZWNjLmM6IEVudGlyZWx5IHJld3JpdHRlbiB3aXRoIG9ubHkgYSBmZXcgdHJhY2VzIG9mIHRoZSBvbGQKKwljb2RlIGxlZnQuCisJKF9nY3J5X2VjY19nZW5lcmF0ZSk6IE5ldy4KKwkoZ2VuZXJhdGVfa2V5KSBOZXcgYXJnIE5BTUUuCisJKGdlbmVyYXRlX2N1cnZlKTogRGl0dG8uICBSZXR1cm4gYWN0dWFsIG51bWJlciBvZiBOQklUUy4KKworMjAwNy0wMy0yNiAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogcHVia2V5LmMgKGdjcnlfcGtfZ2Vua2V5KTogSW5jcmVhc2Ugc2l6ZSBvZiBTS0VZIGFycmF5IGFuZCBhZGQgYQorCXJ1bnRpbWUgYm91bmRzIGNoZWNrLgorCisyMDA3LTAzLTIzICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBlY2MuYyAoZWNjX2N0eF9pbml0LCBlY2NfY3R4X2ZyZWUsIGVjY19tb2QsIGVjY19tdWxtKTogTmV3LgorCShkdXBsaWNhdGVfcG9pbnQsIHN1bV9wb2ludHMsIGVzY2FsYXJfbXVsdCk6IERvbid0IHVzZSBhCisJY29weSBvZiBiYXNlLT5wLiAgUmVwbGFjZWQgYWxsIG1waV9tdWxtIGJ5IGVjY19tdWxtIHNvIHRoYXQgd2UgY2FuCisJZXhwZXJpbWVudCB3aXRoIGRpZmZlcmVudCBhbGdvcml0aG1zLgorCShnZW5lcmF0ZV9rZXksIGNoZWNrX3NlY3JldF9rZXksIHNpZ24sIHZlcmlmeSk6IEluaXRpYWxpemUgYQorCWNvbXB1dGF0aW9uIGNvbnRleHQgZm9yIHVzZSBieSBlY2NfbXVsbS4KKworMjAwNy0wMy0yMiAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogcHVia2V5LmMgKHB1YmtleV90YWJsZSk6IEluaXRpYWxpemUgRUNDLgorCSogTWFrZWZpbGUuYW0gKEVYVFJBX2xpYmNpcGhlcl9sYV9TT1VSQ0VTKTogQWRkIGVjYy5jLgorCSogZWNjLmM6IE5ldy4gSGVhdmlseSByZWZvcm1hdHRlZCBhbmQgY2hhbmdlZCBmb3IgdXNlIGluIGxpYmdjcnlwdC4KKwkocG9pbnRfaW5pdCk6IE5ldy4KKwkoZXNjYWxhcl9tdWx0KTogTWFrZSBhcmcgUiB0aGUgZmlyc3QgYXJnIHRvIGJlIHNpbWlsYXIgdG8gdGhlIG1waQorCWZ1bmN0aW9ucy4KKwkoZHVwbGljYXRlX3BvaW50KTogRGl0dG8KKwkoc3VtX3BvaW50cyk6IERpdHRvCisJKHNpZ24sIHZlcmlmeSk6IFJlbW92ZSB1bm5lZWRlZCBjb3B5IG9wZXJhdGlvbnMuCisJKHN1bV9wb2ludHMpOiBSZW1vdmVkIG1lbW9yeSBsZWFrcyBhbmQgb3B0aW1pemVkIHNvbWUgY29tcGFyZXMuCisJKHZlcmlmeSk6IFNpbXBsaWZpZWQgaW5wdXQgY2hlY2suCisKKzIwMDctMDMtMTQgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIHJhbmRvbS5jIChNQVNLX0xFVkVMKTogUmVtb3ZlZCBtYWNybyBhcyBpdCB3YXMgdXNlZCBvbmx5IGF0IG9uZQorCXBsYWNlLiAgT3BlbiBjb2RlZCBpdCB0aGVyZS4KKwkoZ2NyeV9yYW5kb21pemUsIF9nY3J5X3VwZGF0ZV9yYW5kb21fc2VlZF9maWxlKQorCShfZ2NyeV9mYXN0X3JhbmRvbV9wb2xsKTogRmFjdG9yIGxvY2sgY29kZSBvdXQgdG8gLi4KKwkobG9ja19wb29sLCB1bmxvY2tfcG9vbCk6IC4uIG5ldy4KKwkoaW5pdGlhbGl6ZSk6IExvb2sgdGhlIHBvb2wgd2hpbGUgYWxsb2NhdGluZy4gCisJKHJlYWRfcmFuZG9tX3NvdXJjZSwgZG9fZmFzdF9yYW5kb21fcG9sbCk6IE1vdmVkIGludGlhbGl6YXRpb24gdG8gLi4uCisJKGluaXRpYWxpemUpOiAuLiBoZXJlLgorCShfZ2NyeV9lbmFibGVfcXVpY2tfcmFuZG9tX2dlbik6IE5vIG1vcmUgbmVlZCBmb3IgaW5pdGlhbGl6YXRpb24uCisJKGlzX2luaXRpYWxpemVkKTogIE1vdmVkIHRoaXMgZ2xvYmFsIGZsYWcgdG8gLi4KKwkoaW5pdGlhbGl6ZSk6IC4uIGhlcmUgYW5kIGNoYW5nZWQgYWxsIHVzZXJzIHRvIHVuY29uZGl0aW9uYWxseSBjYWxsCisJaW5pdGlhbGl6ZS4KKwkoYWRkX3JhbmRvbW5lc3MpOiBSZW1vdmUgaW5pdGFsaXphdGlvbiBoZXJlLiAgSXQgc2ltcGx5IGNhbid0CisJaGFwcGVuLiAKKworCSogcmFuZG9tLmMgKGVudW0gcmFuZG9tX29yaWdpbnMpOiBNb3ZlZCB0byAuLgorCSogcmFuZC1pbnRlcm5hbC5oOiAuLiBoZXJlLgorCSogcm5kdW5peC5jIChfZ2NyeV9ybmR1bml4X2dhdGhlcl9yYW5kb20pOiBVc2UgZW51bSBpbiBwcm90b3R5cGUKKwlmb3IgT1JJR0lOIGFuZCByZW5hbWVkIFJFUVVFU1RPUiB0byBPUklHSU4uCisJKiBybmRlZ2QuYyAoX2djcnlfcm5kZWdkX2dhdGhlcl9yYW5kb20pOiBEaXR0by4KKwkqIHJuZGxpbnV4LmMgKF9nY3J5X3JuZGxpbnV4X2dhdGhlcl9yYW5kb20pOiBEaXR0by4KKwkqIHJuZHczMi5jIChfZ2NyeV9ybmR3MzJfZ2F0aGVyX3JhbmRvbSk6IERpdHRvLgorCShfZ2NyeV9ybmR3MzJfZ2F0aGVyX3JhbmRvbV9mYXN0KTogRGl0dG8uCisKKzIwMDctMDMtMTMgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIHJhbmRvbS5jIChlbnVtIHJhbmRvbV9vcmlnaW5zKTogTmV3LgorCShhZGRfcmFuZG9tbmVzcyk6IFJlbmFtZWQgYXJnIFNPVVJDRSB0byBPUklHSU4uCisJKHJlYWRfcmFuZG9tX3NvdXJjZSk6IFJlbmFtZWQgYXJnIFJFUVVFU1RPUiB0byBPUklHSU4uCisJKGdldGZuY19nYXRoZXJfcmFuZG9tKTogUmVtb3ZlZCBzdGF0aWMgdmFyaWFibGUgYmVjYXVzZSB0aGlzCisJZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgb25lIGFuZCB0aHVzIHdlIGRvbid0IG5lZWQgdGhpcworCW9wdGltaXphdGlvbi4KKwkoX2djcnlfcXVpY2tfcmFuZG9tX2dlbik6IFJlbW92ZWQgYW5kIHJlcGxhY2VkIGJ5Li4KKwkoX2djcnlfZW5hYmxlX3F1aWNrX3JhbmRvbV9nZW4pOiAuLiB0aGlzLiAgSXQgaXMgb25seXUgdXNlZCB0bworCWVuYWJsZSBpdCBhbmQgaXQgZG9lcyBub3QgbWFrZSBzZW5zZSB0byBkaXNhYmxlIGl0IGxhdGVyLiBDaGFuZ2VkCisJdGhlIG9ubHkgb25lIGNhbGxlciB0b28uCisJKGdldF9yYW5kb21fYnl0ZXMpOiBSZW1vdmVkLgorCShnY3J5X3JhbmRvbV9ieXRlcywgZ2NyeV9yYW5kb21fYnl0ZXNfc2VjdXJlKTogSW1wbGVtZW50IGluIHRlcm1zCisJb2YgZ2NyeV9yYW5kb21pemUuCisJKiByYW5kb20tZGFlbW9uLmMgKF9nY3J5X2RhZW1vbl9nZXRfcmFuZG9tX2J5dGVzKTogUmVtb3ZlZC4KKworMjAwNy0wMi0yMyAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogZWxnYW1hbC5jIChnZW5lcmF0ZSk6IFJlbW92ZWQgdW51c2VkIHZhcmlhYmxlIFRFTVAuCisJKHRlc3Rfa2V5cyk6IE5ldyBhcmcgTk9ESUUuCisJKGdlbmVyYXRlX3VzaW5nX3gsIF9nY3J5X2VsZ19nZW5lcmF0ZV91c2luZ194KTogTmV3LgorCSogcHVia2V5LmMgKHB1YmtleV9nZW5lcmF0ZSk6IE5ldyBhcmcgWFZBTFVFIGFuZCBkaXJlY3QgY2FsbCB0bworCXRoZSBuZXcgZWxnYW1hbCBnZW5lcmF0ZSBmdWNudGlvbi4KKwkoZ2NyeV9wa19nZW5rZXkpOiBQYXJzZSB0aGUgbmV3ICJ4dmFsdWUiIHRhZy4KKworMjAwNy0wMi0yMiAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogcHVia2V5LmMgKHNleHBfZGF0YV90b19tcGkpOiBIYW5kbGUgZHluYW1pY2FsbHkgYWxsb2NhdGVkCisJYWxnb3JpdGhtcy4gIFN1Z2dlc3RlZCBieSBOZWlsIER1bmJhci4gIEZpeGVzIGJ1ZyM1OTYuCisKKwkqIHJuZHczMi5jIChfZ2NyeV9ybmR3MzJfZ2F0aGVyX3JhbmRvbV9mYXN0KTogTWFrZSBpdCByZXR1cm4gdm9pZC4KKworCSogY2lwaGVyLmMgKGdjcnlfY2lwaGVyX2FsZ29fbmFtZSk6IFNpbXBsaWZpZWQuCisKKwkqIHJhbmRvbS5jOiBVc2UgdGhlIGRhZW1vbiBvbmx5IGlmIGNvbXBpbGVkIHdpdGggVVNFX1JBTkRPTV9EQUVNT04uIAorCisJKiBNYWtlZmlsZS5hbSAobGliY2lwaGVyX2xhX1NPVVJDRVMpOiBCdWlsZCByYW5kb20tZGFlbW9uIHN1cHBvcnQKKwlvbmx5IGlmIHJlcXVlc3RlZC4KKworMjAwNy0wMi0yMSAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogcmFuZG9tLmMgKHJuZHBvb2wsIGtleXBvb2wpOiBNYWtlIHVuc2lnbmVkLgorCShtaXhfcG9vbCk6IENoYW5nZSBjaGFyKiB2YXJpYWJsZXMgdG8gdW5zaWduZWQgY2hhciouCisJKGdjcnlfcmFuZG9taXplKTogTWFrZSBhcmcgQlVGRkVSIGEgdm9pZCouCisJKGdjcnlfY3JlYXRlX25vbmNlKTogRGl0dG8uCisKKwkqIHJtZDE2MC5jIChnY3J5X3JtZDE2MF9taXhibG9jayk6IE1ha2UgQlVGRkVSIGEgdm9pZCouCisJKF9nY3J5X3JtZDE2MF9oYXNoX2J1ZmZlcik6IE1ha2UgT1VUQlVGIGFuZCBCVUZGRVIgdm9pZCouCisJKiBzaGExLmMgKF9nY3J5X3NoYTFfaGFzaF9idWZmZXIpOiBEaXR0by4KKworCSogY2lwaGVyLmMgKGdjcnlfY2lwaGVyX2VuY3J5cHQsIGNyeV9jaXBoZXJfZGVjcnlwdCk6IENoYW5nZQorCWJ1ZmZlciBhcmdzIHRvIHZvaWQqLgorCShnY3J5X2NpcGhlcl9yZWdpc3Rlcik6IE1ha2UgQUxHT1JJVEhNX0lEIGEgaW50ICouCisKKwkqIG1kLmMgKG1kX3N0YXJ0X2RlYnVnKTogTWFrZSBTVUZGSVggYSBjb25zdCBjaGFyKi4gIFVzZSBzbnByaW50Zi4KKwkoZ2NyeV9tZF9kZWJ1Zyk6IE5ldy4KKwkoZ2NyeV9tZF9jdGwpOiBDaGFuZ2VkIGFyZyBCVUZGRVIgZnJvbSB1bnNpZ25lZCBjaGFyKi4KKworCSogbWQuYyAobWRfd3JpdGUpOiBNYWtlIElOQlVGIGEgY29uc3Qgdm9pZCouCisJKGdjcnlfbWRfd3JpdGUpOiBSZW1vdmUgbmVlZGxlc3MgY2FzdC4KKwkqIGNyYy5jIChjcmMzMl93cml0ZSk6IE1ha2UgSU5CVUYgYSBjb25zdCB2b2lkKgorCSh1cGRhdGVfY3JjMzIsIGNyYzI0cmZjMjQ0MF93cml0ZSk6IERpdHRvLgorCSogc2hhNTEyLmMgKHNoYTUxMl93cml0ZSwgdHJhbnNmb3JtKTogRGl0dG8uCisJKiBzaGEyNTYuYyAoc2hhMjU2X3dyaXRlLCB0cmFuc2Zvcm0pOiBEaXR0by4KKwkqIHJtZDE2MC5jIChybWQxNjBfd3JpdGUsIHRyYW5zZm9ybSk6IERpdHRvLgorCSogbWQ1LmMgKG1kNV93cml0ZSwgdHJhbnNmb3JtKTogRGl0dG8uCisJKiBtZDQuYyAobWQ0X3dyaXRlLCB0cmFuc2Zvcm0pOiBEaXR0by4KKwkqIHNoYTEuYyAoc2hhMV93cml0ZSwgdHJhbnNmb3JtKTogRGl0dG8uCisKKwkqIHRpZ2VyLmMgKHRpZ2VyX3dyaXRlLCB0cmFuc2Zvcm0pOiBEaXR0by4KKwkqIHdoaXJscG9vbC5jICh3aGlybHBvb2xfd3JpdGUsIHdoaXJscG9vbF9hZGQsIHRyYW5zZm9ybSk6IERpdHRvLgorCisJKiBlbGdhbWFsLmMgKGVsZ19uYW1lcyk6IENoYW5nZSB0byBhIGNvbnN0Ki4KKwkqIGRzYS5jIChkc2FfbmFtZXMpOiBEaXR0by4KKwkqIHJzYS5jIChyc2FfbmFtZXMpOiBEaXR0by4KKwkqIHB1YmtleS5jIChnY3J5X3BrX2xvb2t1cF9mdW5jX25hbWUpOiBNYWtlIEFMSUFTRVMgYSBjb25zdC4KKworMjAwNy0wMi0yMCAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogcm5kbGludXguYyAob3Blbl9kZXZpY2UpOiBSZW1vdmUgdW5zdXNlZCBhcmcgTUlOT1IuCisKKzIwMDctMDEtMzAgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIHNoYTI1Ni5jIChvaWRfc3BlY19zaGEyNTYpOiBBZGQgYWxpYXMgZnJvbSBwa2NzIzEuCisJKiBzaGE1MTIuYyAob2lkX3NwZWNfc2hhNTEyKTogRGl0dG8uCisJKG9pZF9zcGVjX3NoYTM4NCk6IERpdHRvLgorCisyMDA2LTEyLTE4ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBybmRsaW51eC5jIChzZXRfY2xvZXhlY19mbGFnKTogTmV3LgorCShvcGVuX2RldmljZSk6IFNldCBjbG9zZS1vbi1leGl0IGZsYWdzLiAgU3VnZ2VzdGVkIGJ5IE1heAorCUtlbGxlcm1hbm4uICBGaXhlcyBEZWJpYW4jNDAzNjEzLgorCisJKiBNYWtlZmlsZS5hbSAoQU1fQ1BQRkxBR1MsIEFNX0NGTEFHUyk6IFNwbGl0dGVkIGFuZCBtZXJnZWQKKwlNb3JpdHonIGNoYW5nZXMuCisJKElOQ0xVREVTKTogUmVtb3ZlZC4KKworMjAwNi0xMS0zMCAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogc2VycGVudC5jIChieXRlX3N3YXBfMzIpOiBSZW1vdmUgdHJhaWxpbmcgc2VtaWNvbG9uLgorCisyMDA2LTExLTE1ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBNYWtlZmlsZS5hbSAoSU5DTFVERVMpOiBJbmNsdWRlIC4uL3NyYy8KKworMjAwNi0xMS0wMyAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogcmFuZG9tLmMgW0hBVkVfR0VUVElNRU9GREFZXTogSW5jbHVkZWQgc3lzL3RpbWUuaCBhbmQgbm90CisJc3lzL3RpbWVzLmguICBSZXBvcnRlZCBieSBSYWZhw6tsIENhcnLDqS4KKworMjAwNi0xMS0wNSAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChBTV9DRkxBR1MpOiBBZGRlZCAtSSQodG9wX2J1aWxkZGlyKS9zcmMgc28gdGhhdCB0aGUKKwluZXcgZ2NyeXB0LmggaXMgdXNlZCwgbm90IHRoZSBvbmUgaW5zdGFsbGVkIGluIHRoZSBzeXN0ZW0uCisKKzIwMDYtMTAtMjUgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIHByaW1lZ2VuLmMgKHByaW1lX2dlbmVyYXRlX2ludGVybmFsKTogVHdlYWtlZCB1c2Ugb2Ygc2VjdXJlCisJbWVtb3J5IGFuZCBlbnRyb3B5IHVzZS4gU2FmZSB1bnVzZWQgcHJpbWVzIGZyb20gdGhlIHBvb2wuIEFsbG9jYXRlCisJYXQgbGVhc3QgYSBwb29sIG9mIDMwLgorCShzYXZlX3Bvb2xfcHJpbWUsIGdldF9wb29sX3ByaW1lKTogTmV3LgorCisyMDA2LTEwLTIzICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBhYy5jIChfZ2NyeV9hY19kYXRhX2Zyb21fc2V4cCk6IFJlc2V0IHNleHBfdG1wIGZvciBmYWlsc2FmZQorCW1lYW5zLiAgUmVsZWFzZSBzZXhwX2N1ciBpZiBuZWVkZWQuICBSZXBvcnRlZCBieSBEaXJrIFN0b2Vja2VyLgorCisJKiBwdWJrZXkuYyAocHVia2V5c19yZWdpc3RlcmVkX2xvY2spOiBJbnRpYWxpemVkIGl0LiAgSXQgaXMgbm90CisJIHJlYWx5IG5lZWRlZCBiZWNhdXNlIHRoaXMgaXMgYSBtZXJlIGluaXRpYWxpemF0aW9uIHRvIDAgYW55d2F5LgorCSBOb3RlZCBieSBWaWN0b3IgU3Rpbm5lci4KKworMjAwNi0xMC0xNyAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogZHNhLmMgKF9nY3J5X2RzYV9nZW5lcmF0ZTIpOiBOZXcuCisJKGdlbmVyYXRlKTogTmV3IGFyZyBRQklUUy4gIEFkZCBzYW5pdHkgY2hlY2tzIGZvciByZWFzb25hYmxlIHFiaXRzCisJYW5kIG5iaXRzLgorCSogcHVia2V5LmMgKGdjcnlfcGtfZ2Vua2V5KTogUGFyc2UgYW4gcWJpdHMgZWxlbWVudC4KKwkocHVia2V5X2dlbmVyYXRlKTogTmV3IGFyZyBRQklUUy4gIFBhc3MgaXQgdG8gdGhlIERTQSBnZW5lcmF0aW9uLgorCisyMDA2LTEwLTA1ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBtZC5jIChnY3J5X21kX2FsZ29faW5mbykgPGdldF9hc25vaWQ+OiBDaGVjayB0aGF0IHRoZSBhbGdvIGlzCisJYXZhaWxhYmxlLgorCisyMDA2LTEwLTA0ICBEYXZpZCBTaGF3ICA8ZHNoYXdAamFiYmVyd29ja3kuY29tPiAgKHdrKQorIAorCSogdGlnZXIuYyAocm91bmQpOiBSZW5hbWUgdG8gdGlnZXJfcm91bmQgYXMgZ2NjIDQgaGFzIGEgYnVpbHQtaW4KKwlyb3VuZCBmdW5jdGlvbiB0aGF0IHRoaXMgY29uZmxpY3RzIHdpdGguCisgCisyMDA2LTA5LTExICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBybmR3MzIuYyAoc2xvd19nYXRoZXJlcl93aW5kb3dzTlQpOiBXaGlsZSBhZGRpbmcgZGF0YSB1c2UgdGhlCisJc2l6ZSBvZiB0aGUgZGlza1BlcmZvcm1hbmNlIGFuZCBub3QgaXRzIGFkZHJlc3MuIEhhcyBiZWVuIGZpeGVkIGluCisJR251UEcgbW9yZSB0aGFuIGEgeWVhciBhZ28uICBOb3RlZCBieSBMZWUgRmlzaGVyLgorCisyMDA2LTA4LTMwICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBwdWJrZXkuYyAoc2V4cF9kYXRhX3RvX21waSk6IE5lZWQgdG8gYWxsb3cgInJpcGVtZDE2MCIgaGVyZSBhcworCXRoaXMgaXMgdGhlIGNhbm9uaWNhbCBuYW1lLgorCisyMDA2LTA4LTI5ICBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+ICAod2spCisKKwkqIHNlZWQuYzogTmV3LgorCisyMDA2LTA4LTAzICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiByYW5kb20tZGFlbW9uLmMgKF9nY3J5X2RhZW1vbl9pbml0aWFsaXplX2Jhc2ljcyk6IERvbid0CisJaW5pdGlhbGl6ZSB0aGUgc29ja2V0LiAgUmVtb3ZlIGFyZyBTT0NLRVROQU1FLgorCShjb25uZWN0X3RvX3NvY2tldCk6IE1ha2Ugc3VyZSB0aGF0IGRhZW1vbiBpcyBzZXQgdG8gLTEgb24gZXJyb3IuCisJKGNhbGxfZGFlbW9uKTogSW5pdGlhbGl6ZSB0aGUgc29ja2V0IG9uIHRoZSBmaXJzdCBjYWxsLgorCShfZ2NyeV9kYWVtb25fcmFuZG9taXplLCBfZ2NyeV9kYWVtb25fZ2V0X3JhbmRvbV9ieXRlcykgCisJKF9nY3J5X2RhZW1vbl9jcmVhdGVfbm9uY2UpOiBOZXcgYXJnIFNPQ0tFVE5BTUUuCisJKiByYW5kb20uYyAoaW5pdGlhbGl6ZSk6IENhbGwgbmV3IGRhZW1vbiBpbml0aWFsaXphdG9yLgorCShnZXRfcmFuZG9tX2J5dGVzLCBnY3J5X3JhbmRvbWl6ZSwgZ2NyeV9jcmVhdGVfbm9uY2UpOiBQYXNzIHNvY2tldAorCW5hbWUgdG8gZGFlbW9uIGNhbGwgYW5kIHJlc2V0IGFsbG93X2RhZW1vbiBvbiBmYWlsdXJlLgorCisyMDA2LTA3LTI2ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBybWQxNjAuYyAoX2djcnlfcm1kMTYwX21peGJsb2NrKTogQWRkIGNhc3QgdG8gdHJhbnNmb3JtIGNhbGwuCisKKwkqIGJsb3dmaXNoLmMgKHNlbGZ0ZXN0KTogQ2FzdCBzdHJpbmcgdG8gdXNuaWduZWQgY2hhciouCisKKwkqIHByaW1lZ2VuLmMgKHByaW1lX2dlbmVyYXRlX2ludGVybmFsKTogQ2FzdCB1bnNpZ25lZC9jaGFyKgorCW1pc21hdGNoIGluIGNhbGxpbmcgbV9vdXRfb2Zfbi4KKwkoaXNfcHJpbWUpOiBDaGFuZ2VkIENPVU5UIHRvIHVuc2lnbmVkIGludCAqLgorCisJKiBhYy5jIChfZ2NyeV9hY19kYXRhX2NvcHkpOiBJbml0aWFsaXplIERBVEFfTVBJUy4KKworCSogcmFuZG9tLmMgKGdjcnlfY3JlYXRlX25vbmNlKTogVXBkYXRlIHRoZSBwaWQgYWZ0ZXIgYSBmb3JrLgorCVJlcG9ydGVkIGJ5IFVvdGkgVXJwYWxhLgorCisyMDA2LTA3LTA0ICBNYXJjdXMgQnJpbmttYW5uICA8bWFyY3VzQGcxMGNvZGUuZGU+CisKKwkqIHNoYTUxMi5jOiBGaXggdHlwbyBpbiBjb3B5cmlnaHQgbm90aWNlLgorCisyMDA2LTA2LTIxICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiByc2EuYyAoX2djcnlfcnNhX2dlbmVyYXRlKTogUmVwbGFjZSB4Y2FsbG9jIGJ5IGNhbGxvYy4KKwkqIHB1YmtleS5jIChnY3J5X3BrX2VuY3J5cHQsIGdjcnlfcGtfc2lnbik6IERpdHRvLgorCShzZXhwX3RvX2tleSwgc2V4cF90b19zaWcsIHNleHBfdG9fZW5jLCBnY3J5X3BrX2VuY3J5cHQpIAorCShnY3J5X3BrX3NpZ24sIGdjcnlfcGtfZ2Vua2V5LCBnY3J5X3BrX2dldF9rZXlncmlwKTogRGl0dG8uIAorCSogbWQuYyAobWRfY29weSk6IERpdHRvLgorCQorMjAwNi0wNC0yMiAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIHJhbmRvbS1kYWVtb24uYyAoX2djcnlfZGFlbW9uX2luaXRpYWxpemVfYmFzaWNzKTogTmV3IGFyZ3VtZW50OgorCVNPQ0tFVE5BTUUuICBQYXNzaW5nIG9uIHRvIGNvbm5lY3RfdG9fc29ja2V0KCkgaWYgbm9uLU5VTEwuCisJKGNvbm5lY3RfdG9fc29ja2V0LCB3cml0ZW4sIHJlYWRuLCBjYWxsX2RhZW1vbik6IE5ldyBmdW5jdGlvbnMuCisJKF9nY3J5X2RhZW1vbl9yYW5kb21pemUsIF9nY3J5X2RhZW1vbl9nZXRfcmFuZG9tX2J5dGVzKSAKKwkoX2djcnlfZGFlbW9uX2NyZWF0ZV9ub25jZSk6IENhbGwgY2FsbF9kYWVtb24oKS4KKwkoUkFORE9NX0RBRU1PTl9TT0NLRVQpOiBOZXcgc3ltYm9sLgorCShkYWVtb25fc29ja2V0KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KKworCSogcmFuZG9tLmggKF9nY3J5X2RhZW1vbl9pbml0aWFsaXplX2Jhc2ljcyk6IE5ldyBwYXJhbWV0ZXI6CisJU09DS0VUTkFNRS4KKwkoX2djcnlfc2V0X3JhbmRvbV9kYWVtb25fc29ja2V0KTogTmV3IGRlY2xhcmF0aW9uLgorCisJKiByYW5kb20uYyAoaW5pdGlhbGl6ZV9iYXNpY3MpOiBQYXNzIERBRU1PTl9TT0NLRVRfTkFNRSB0bworCV9nY3J5X2RhZW1vbl9pbml0aWFsaXplX2Jhc2ljcy4KKwkoX2djcnlfc2V0X3JhbmRvbV9kYWVtb25fc29ja2V0KTogTmV3IGZ1bmN0aW9uLCBzZXR0aW5nCisJREFFTU9OX1NPQ0tFVF9OQU1FLgorCisyMDA2LTA0LTAxICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogYWMuYyAoZW1lX3BrY3NfdjFfNV9lbmNvZGUpOiBVc2UgS0VZX1NJWkUgZGlyZWN0bHksIG5vIG5lZWQgdG8KKwljYWxsIGdjcnlfYWNfa2V5X2dldF9uYml0cy4KKwkoZW1lX3BrY3NfdjFfNV9kZWNvZGUpOiBMaWtld2lzZS4KKwkoYWNfZXNfZGVuY29kZV9wcmVwYXJlX3BrY3NfdjFfNSk6IEZpbGwgb3B0aW9uc19lbSBzdHJ1Y3R1cmUgd2l0aAorCWtleV9zaXplLgorCShfZ2NyeV9hY19kYXRhX2R1bXAsIGdjcnlfYWNfZGF0YV9kdW1wKTogTmV3IGZ1bmN0aW9ucy4KKwkoX2djcnlfYWNfZGF0YV90b19zZXhwLCBfZ2NyeV9hY19kYXRhX2Zyb21fc2V4cCk6IE1vcmUgb3IgbGVzcworCXJld3JpdHRlbjsgY2hhbmdlZCBTLUV4cHJlc3Npb24gZm9ybWF0IHNvIHRoYXQgaXQgbWF0Y2hlcyB0aGUgb25lCisJdXNlZCBpbiBwdWJrZXkuYy4KKworMjAwNi0wMy0xNSAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogcmFuZG9tLWRhZW1vbi5jOiBOZXcuCisJKiByYW5kb20uYyAoX2djcnlfdXNlX3JhbmRvbV9kYWVtb24pOiBOZXcuCisJKGdldF9yYW5kb21fYnl0ZXMsIGdjcnlfcmFuZG9taXplLCBnY3J5X2NyZWF0ZV9ub25jZSk6IFRyeQorCWRpdmVydGluZyB0byB0aGUgZGFlbW9uIGZ1bmN0aW9ucy4KKworMjAwNi0wMy0xNCAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogcmFuZG9tLmMgKGxvY2tfc2VlZF9maWxlKTogTmV3LgorCShyZWFkX3NlZWRfZmlsZSwgX2djcnlfdXBkYXRlX3JhbmRvbV9zZWVkX2ZpbGUpOiBVc2UgaXQuCisKKwkqIHJhbmRvbS5jIChnY3J5X2NyZWF0ZV9ub25jZSk6ICBEZXRlY3QgYSBmb3JrIGFuZCByZS1zZWVkLgorCShyZWFkX3Bvb2wpOiBGaXhlZCB0aGUgZm9yayBkZXRlY3Rpb247IGl0IHVzZWQgdG8gd29yayBvbmx5IGZvcgorCW11bHRpLXRocmVhZGVkIHByb2Nlc3Nlcy4KKworMjAwNi0wMy0xMiAgQnJhZCBIYXJkcyAgPGJyYWRoQGZyb2dtb3V0aC5uZXQ+ICAod2spCisKKwkqIG1kLmMgKG1kX29wZW4pOiBVc2UgbmV3IHZhcmlhYmxlIG1hY3BhZHNfQnNpemUgaW5zdGVhZCBvZgorCWhhcmR3aXJpbmcgdGhlIGJsb2NrIHNpemUuICBDaGFuZ2VkIGF0IGFsbCBwbGFjZXMuCisKKzIwMDYtMDMtMTAgIEJyYWQgSGFyZHMgIDxicmFkaEBmcm9nbW91dGgubmV0PiAgKHdrLCBwYXRjaCAyMDA1LTA0LTIyKQorCisJKiBtZC5jLCBzaGEyNTYuYzogIEFkZCBzdXBwb3J0IGZvciBTSEEtMjI0LgorCShzaGEyMjRfaW5pdCk6IE5ldy4KKwkKKzIwMDYtMDEtMTggIEJyYWQgSGFyZHMgIDxicmFkaEBmcm9nbW91dGgubmV0PiAgKHdrIDIwMDYtMDMtMDcpCisKKwkqIGNpcGhlci5jIChjaXBoZXJfZW5jcnlwdCwgY2lwaGVyX2RlY3J5cHQsIGRvX29mYl9lbmNyeXB0KQorCShkb19vZmJfZGVjcnlwdCwgZ2NyeV9jaXBoZXJfb3Blbik6IEltcGxlbWVudCBPdXRwdXQgRmVlZGJhY2sgTW9kZS4KKworMjAwNS0xMS0wMiAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIHB1YmtleS5jIChnY3J5X3BrX2FsZ29fbmFtZSk6IFJldHVybiAiPyIgaW5zdGVhZCBvZiBOVUxMIGZvcgorCXVua25vd24gYWxnb3JpdGhtIElEcy4KKwkqIGNpcGhlci5jIChjaXBoZXJfYWxnb190b19zdHJpbmcpOiBMaWtld2lzZS4KKworMjAwNS0xMS0wMSAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIHB1YmtleS5jIChnY3J5X3BrX2FsZ29faW5mbyk6IERvbid0IGZvcmdldCB0byBicmVhayBhZnRlciBzd2l0Y2gKKwljYXNlLgorCisyMDA1LTA5LTE5ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBkc2EuYyAoZ2VuZXJhdGUpOiBBZGQgcHJlbGltaW5hcnkgc3VwcG9ydCBmb3IgMiBhbmQgNCBrZXlzLgorCVJldHVybiBhbiBlcnJvciBjb2RlIGlmIHRoZSBrZXkgc2l6ZSBpcyBub3Qgc3VwcG9ydGVkLgorCShfZ2NyeV9kc2FfZ2VuZXJhdGUpOiBSZXR1cm4gYW4gZXJyb3IuCisKKzIwMDUtMDgtMjIgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIHByaW1lZ2VuLmMgKGNoZWNrX3ByaW1lKTogTmV3IGFyZyBSTV9ST1VORFMuCisJKHByaW1lX2dlbmVyYXRlX2ludGVybmFsKTogQ2FsbCBpdCBoZXJlIHdpdGggNSByb3VuZHMgYXMgdXNlZAorCWJlZm9yZS4KKwkoZ2NyeV9wcmltZV9jaGVjayk6IEJ1dCBoZXJlIHdpdGggNjQgcm91bmRzLgorCShpc19wcmltZSk6IE1ha2Ugc3VyZSBuZXZlciB0byB1c2UgbGVzcyB0aGFuIDUgcm91bmRzLgorCisyMDA1LTA0LTE2ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogYWMuYyAoX2djcnlfYWNfaW5pdCk6IE5ldyBmdW5jdGlvbi4KKworMjAwNS0wNC0xMiAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGFjLmMgKF9nY3J5X2FjX2lvX3dyaXRlLCBfZ2NyeV9hY19pb19yZWFkKTogSW5pdGlhbGl6ZSBlcnIgdG8KKwltYWtlIHRoZSBjb21waWxlciBoYXBweS4KKwlBbHdheXMgdXNlIGVycm5vLCBub3cgdGhhdCBnY3J5X21hbGxvYygpIGlzIGd1YXJhbnRlZWQgdG8gc2V0CisJZXJybm8gb24gZmFpbHVyZS4KKwkoX2djcnlfYWNfZGF0YV90b19zZXhwKTogRG9uJ3QgZm9yZ2V0IHRvIGdvdG8gb3V0IGFmdGVyIGVycm9yIGluCisJbG9vcC4KKwkoX2djcnlfYWNfZGF0YV90b19zZXhwKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZTogbXBpX2xpc3Q7CisJKF9nY3J5X2FjX2RhdGFfdG9fc2V4cCk6IEFsd2F5cyBkZWFsbG9jYXRlIHNleHBfYnVmZmVyLgorCShfZ2NyeV9hY19kYXRhX2Zyb21fc2V4cCk6IERvbid0IGZvcmdldCB0byBpbml0aWFsaXplIGRhdGFfc2V0X25ldy4KKwkoX2djcnlfYWNfZGF0YV9mcm9tX3NleHApOiBIYW5kbGUgc3BlY2lhbCBjYXNlLCB3aGljaCBpcworCW5lY2Vzc2FyeSwgc2luY2UgZ2NyeV9zZXhwX250aCgpIGRvZXMgbm90IGRpc3Rpbmd1aXNoIGJldHdlZW4KKwkiZWxlbWVudCBkb2VzIG5vdCBleGlzdCIgYW5kICJlbGVtZW50IGlzIHRoZSBlbXB0eSBsaXN0Ii4KKwkoX2djcnlfYWNfaW9faW5pdF92YSk6IFVzZSBhc3NlcnQgdG8gbWFrZSBzdXJlIHRoYXQgbW9kZSBhbmQgdHlwZQorCWFyZSBjb3JyZWN0LgorCVVzZSBnY3J5X2Vycm9yX3QgdHlwZXMgd2hlcmUgZ2NyeV9lcnJfY29kZV90IHR5cGVzIGhhdmUgYmVlbiB1c2VkCisJYmVmb3JlLgorCisyMDA1LTA0LTExICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogYWMuYyAoX2djcnlfYWNfZGF0YV9zaWduX3NjaGVtZSk6IERvbid0IGZvcmdldCB0byBpbml0aWFsaXplCisJYnVmZmVyLgorCisJKiB3aGlybHBvb2wuYzogTmV3IGZpbGUuCisJKiBtZC5jIChkaWdlc3RfdGFibGUpOiBBZGQgd2hpcmxwb29sLgorCSogTWFrZWZpbGUuYW0gKEVYVFJBX2xpYmNpcGhlcl9sYV9TT1VSQ0VTKTogQWRkZWQ6IHdoaXJscG9vbC5jLgorCisyMDA1LTAzLTMwICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogYWMuYyAoX2djcnlfYWNfZGF0YV9mcm9tX3NleHApOiBVc2UgbGVuZ3RoIG9mIFNFWFBfQ1VSLCBub3QKKwlsZW5ndGggb2YgU0VYUDsgZG8gbm90IGZvcmdldCB0byBzZXQgU0VYUF9UTVAgdG8gTlVMTCBhZnRlciBpdCBoYXMKKwliZWVuIHJlbGVhc2VkLgorCisJKHN0cnVjdCBnY3J5X2FjX21waSk6IE5ldyBtZW1iZXI6IG5hbWVfcHJvdmlkZWQuCisJKF9nY3J5X2FjX2RhdGFfc2V0KTogUmVuYW1lIHZhcmlhYmxlIGBuYW1lX2ZpbmFsJyB0byBgbmFtZV9jcCc7CisJcmVtb3ZlIGNvbnN0IHF1YWxpZmllcjsgY2hhbmdlIGNvZGUgdG8gbm90IGNhc3QgYXdheSBjb25zdAorCXF1YWxpZmllcnM7IHVzZSBuYW1lX3Byb3ZpZGVkIG1lbWJlciBhcyB3ZWxsLgorCShfZ2NyeV9hY19kYXRhX3NldCwgX2djcnlfYWNfZGF0YV9nZXRfbmFtZSk6IFVzZSBuYW1lX3Byb3ZpZGVkCisJbWVtYmVyIG9mIG5hbWVkIG1waSBzdHJ1Y3R1cmUuCisKKwkoZ2NyeV9hY19uYW1lX3RvX2lkKTogRG8gbm90IGZvcmdldCB0byBpbml0aWFsaXplIGVyci4KKwkoX2djcnlfYWNfZGF0YV9nZXRfaW5kZXgpOiBEbyBub3QgZm9yZ2V0IHRvIGluaXRpYWxpemUgbXBpX3JldHVybjsKKwl1c2UgZ2NyeV9mcmVlKCkgaW5zdGVhZCBvZiBmcmVlKCk7IHJlbW92ZSB1bm5lY2Vzc2FyeSBjYXN0OyByZW5hbWUKKwltcGlfcmV0dXJuIGFuZCBuYW1lX3JldHVybiB0byBtcGlfY3AgYW5kIG5hbWVfY3A7IGFkanVzdCBjb2RlLgorCShhY19kYXRhX21waV9jb3B5KTogRG8gbm90IGNhc3QgYXdheSBjb25zdCBxdWFsaWZpZXIuCisJKGFjX2RhdGFfdmFsdWVzX2Rlc3Ryb3kpOiBMaWtld2lzZS4KKwkoYWNfZGF0YV9jb25zdHJ1Y3QpOiBMaWtld2lzZS4KKworCShhY19kYXRhX21waV9jb3B5KTogSW5pdGlhbGl6ZSBmbGFncyB0byBHQ1JZX0FDX0ZMQUdfREVBTExPQy4KKwkoYWNfZGF0YV9leHRyYWN0KTogVXNlIEdDUllfQUNfRkxBR19ERUFMTE9DIGluc3RlYWQgb2YKKwlHQ1JZX0FDX0ZMQUdfQ09QWS4KKworCShfZ2NyeV9hY19pb19pbml0X3ZhLCBfZ2NyeV9hY19pb19pbml0LCBnY3J5X2FjX2lvX2luaXQpCisJKGdjcnlfYWNfaW9faW5pdF92YSwgX2djcnlfYWNfaW9fd3JpdGUsIF9nY3J5X2FjX2lvX3JlYWQpCisJKF9nY3J5X2FjX2lvX3JlYWRfYWxsLCBfZ2NyeV9hY19pb19wcm9jZXNzKTogTmV3IGZ1bmN0aW9ucy4KKwkoZ3J5X2FjX2VtX2RlbmNvZGVfdCk6IFVzZSBnY3J5X2FjX2lvX3QgaW4gcHJvdG90eXBlIGluc3RlYWQgb2YKKwltZW1yb3kgc3RyaW5ncyBkaXJlY3RseTsgYWRqdXN0IGVuY29kZS9kZWNvZGUgZnVuY3Rpb25zIHRvIHVzZSBpbworCW9iamVjdHMuCisJKGVtc2FfcGtjc192MV81X2VuY29kZV9kYXRhX2NiKTogTmV3IGZ1bmN0aW9uIC4uLgorCShlbXNhX3BrY3NfdjFfNV9lbmNvZGUpOiAuLi4gdXNlIGl0IGhlcmUuCisJKGFjX2RhdGFfZGVuY29kZSk6IFVzZSBpbyBvYmplY3RzLgorCShfZ2NyeV9hY19kYXRhX2VuY29kZSwgX2djcnlfYWNfZGF0YV9kZWNvZGUsIGdjcnlfYWNfZGF0YV9lbmNvZGUpCisJKGdjcnlfYWNfZGF0YV9kZWNvZGUpOiBMaWtld2lzZS4KKwkoX2djcnlfYWNfZGF0YV9lbmNyeXB0X3NjaGVtZSwgZ2NyeV9hY19kYXRhX2VuY3J5cHRfc2NoZW1lKQorCShfZ2NyeV9hY19kYXRhX2RlY3J5cHRfc2NoZW1lLCBnY3J5X2FjX2RhdGFfZGVjcnlwdF9zY2hlbWUpCisJKF9nY3J5X2FjX2RhdGFfc2lnbl9zY2hlbWUsIGdjcnlfYWNfZGF0YV9zaWduX3NjaGVtZSkKKwkoX2djcnlfYWNfZGF0YV92ZXJpZnlfc2NoZW1lLCBnY3J5X2FjX2RhdGFfdmVyaWZ5X3NjaGVtZSk6CisJTGlrZXdpc2UuCisKKzIwMDUtMDMtMjMgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIHJuZHczMi5jIChfZ2NyeV9ybmR3MzJfZ2F0aGVyX3JhbmRvbV9mYXN0KTogV2hpbGUgYWRkaW5nIGRhdGEKKwl1c2UgdGhlIHNpemUgb2YgdGhlIG9iamVjdCBhbmQgbm90IHRoZSBvbmUgb2YgaXRzIGFkZHJlc3MuICBCdWcKKwlyZXBvcnRlZCBieSBTYXNjaGEgS2llZmVyLgorCisyMDA1LTAzLTE5ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogY2lwaGVyLmMgKGRvX2NiY19lbmNyeXB0KTogQmUgY2FyZWZ1bCB0byBub3Qgb3ZlcndyaXRlIGRhdGEsCisJd2hpY2ggaXMgdG8gYmUgdXNlZCBsYXRlciBvbi4gIFRoaXMgaGFwcGVuZCwgaW4gY2FzZSBDVFMgaXMKKwllbmFibGVkIGFuZCBPVVRCVUYgaXMgZXF1YWwgdG8gSU5CVUYuCisKKzIwMDUtMDItMjUgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIHB1YmtleS5jIChnY3J5X3BrX2dldF9rZXlncmlwKTogQWxsb3cgZm9yIHNoYWRvd2VkLXByaXZhdGUta2V5LgorCisyMDA1LTAyLTEzICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogc2VycGVudC5jOiBVcGRhdGVkIGZyb20gMS4yIGJyYW5jaDoKKworCXMvdTMyX3QvdTMyLyBhbmQgcy9ieXRlX3QvYnl0ZS8uICBUb28gbWF0Y2ggd2hhdCB3ZSBoYXZlIGFsd2F5cworCXVzZWQgYW5kIGFyZSB1c2luZyBpbiBhbGwgb3RoZXIgZmlsZXMgdG9vCisJKHNlcnBlbnRfdGVzdCk6IE1vdmVkIHByb3RvdHlwZSBvdXQgb2YgYSBmdWNudGlvbi4KKworMjAwNS0wMi0wNyAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGFjLmM6IE1ham9yIHBhcnRzIHJld3JpdHRlbi4KKwkqIHB1YmtleS5jIChfZ2NyeV9wa19nZXRfZWxlbWVudHMpOiBOZXcgZnVuY3Rpb24uCisKKzIwMDQtMTItMDkgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIHNlcnBlbnQuYyAoc2VycGVudF9zZXRrZXkpOiBNb3ZlZCBwcm90b3R5cGUgb2Ygc2VycGVudF90ZXN0IHRvCisJb3V0ZXIgc2NvcGUuCisKKzIwMDQtMDktMTEgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBwdWJrZXkuYyAocHVia2V5X3RhYmxlKTogQWRkZWQgYW4gYWxpYXMgZW50cnkgZm9yIEdDUllfUEtfRUxHX0UuCisKKzIwMDQtMDgtMjMgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBhYy5jOiBEbyBub3QgaW5jbHVkZSA8YXNzZXJ0Lmg+LgorCSogcm5kZWdkLmM6IExpa2V3aXNlLgorCSogc2hhMS5jOiBMaWtld2lzZS4KKwkqIHJuZHVuaXguYzogTGlrZXdpc2UuCisJKiBybmRsaW51eC5jOiBMaWtld2lzZS4KKwkqIHJtZDE2MC5jOiBMaWtld2lzZS4KKwkqIG1kNS5jOiBMaWtld2lzZS4KKwkqIG1kNC5jOiBMaWtld2lzZS4KKwkqIGNpcGhlci5jOiBMaWtld2lzZS4KKwkqIGNyYy5jOiBMaWtld2lzZS4KKwkqIGJsb3dmaXNoLmM6IExpa2V3aXNlLgorCisJKiBwdWJrZXkuYyAoZHVtbXlfZ2VuZXJhdGUsIGR1bW15X2NoZWNrX3NlY3JldF9rZXkpCisJKGR1bW15X2VuY3J5cHQsIGR1bW15X2RlY3J5cHQsIGR1bW15X3NpZ24sIGR1bW15X3ZlcmlmeSk6IFJldHVybgorCWVyciBjb2RlIEdQR19FUlJfTk9UX0lNUExFTUVOVEVEIGluc3RlYWQgb2YgYWJvcnRpbmcgdGhyb3VnaAorCWxvZ19idWcoKS4KKwkoZHVtbXlfZ2V0X25iaXRzKTogUmV0dXJuIDAgaW5zdGVhZCBvZiBhYm9ydGluZyB0aG91Z2ggbG9nX2J1ZygpLgorCisyMDA0LTA4LTE5ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuZGU+CisKKwkqIHB1YmtleS5jIChzZXhwX2RhdGFfdG9fbXBpKTogQ2hhbmdlZCB0aGUgemVybyByYW5kb20gYnl0ZQorCXN1YnN0aXR1dGluZyBjb2RlIHRvIGFjdHVhbGx5IGRvIGNsZXZlciB0aGluZ3MuICBUaGFua3MgdG8KKwlNYXR0aGlhcyBVcmxpY2hzIGZvciBub3RpbmcgdGhlIGltcGxlbWVudGF0aW9uIHByb2JsZW0uCisKKzIwMDQtMDgtMDkgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBwdWJrZXkuYyAoZ2NyeV9wa19zaWduKTogRml4ZWQgbWVtb3J5IGxlYWs7IGZpeCBwcm92aWRlZCBieQorCU1vZGVzdGFzIFZhaW5pdXMuCisKKzIwMDQtMDctMTYgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiByaWpuZGFlbC5jIChkb19lbmNyeXB0KTogRml4IGFsaWdubWVudCBwcm9ibGVtLiAgQnVncyBmb3VuZCBieQorCU1hdHRoaWFzIFVybGljaHMuCisJKGRvX2RlY3J5cHQpOiBEaXR0by4KKwkoa2V5U2NoZWQsIGtleVNjaGVkMik6IFVzZSAyIG1hY3JvcyBhbG9uZyB3aXRoIHVuaW9ucyBpbiB0aGUga2V5CisJc2NoZWR1bGUgY29udGV4dC4KKworMjAwNC0wNy0xNCAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIHJzYS5jIChfZ2NyeV9yc2FfZGVjcnlwdCk6IERvbid0IGZvcmdldCB0byBmcmVlICJhIi4gIFRoYW5rcyB0bworCU5pa29zIE1hdnJveWFub3BvdWxvcy4KKworMjAwNC0wNS0wOSAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIHJhbmRvbS5jIChyZWFkX3Bvb2wpOiBNaXggdGhlIFBJRCBpbiB0byBiZXR0ZXIgcHJvdGVjdCBhZnRlciBhCisJZm9yay4KKworMjAwNC0wNy0wNCAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIHNlcnBlbnQuYzogVXNlICJ1MzJfdCIgaW5zdGVhZCBvZiAidW5zaWduZWQgbG9uZyIsIGRvIG5vdAorCWRlY2xhcmUgUy1Cb3ggdmFyaWFibGVzIGFzICJyZWdpc3RlciIuICBGaXhlcyBmYWlsdXJlIG9uCisJT3BlbkJTRC9zcGFyYzY0LCByZXBvcnRlZCBieSBOaWtvbGF5IFN0dXJtLgorCisyMDA0LTA1LTA3ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogcmFuZG9tLmMgKGluaXRpYWxpemUpOiBGYWN0b3JlZCBvdXQgc29tZSBjb2RlIHRvIC4uCisJKGluaXRpYWxpemVfYmFzaWNzKTogLi4gbmV3IGZ1bmN0aW9uLgorCShfZ2NyeV9yYW5kb21faW5pdGlhbGl6ZSk6IEp1c3QgY2FsbCBpbml0aWFsaXplX2Jhc2ljcyB1bmxlc3MgdGhlCisJbmV3IGFyZyBGVUxMIGlzIHNldCB0byBUUlVFLgorCShfZ2NyeV9mYXN0X3JhbmRvbV9wb2xsKTogRG9uJ3QgZG8gYW55dGhpbmcgdW5sZXNzIHRoZSByYW5kb20KKwlzeXN0ZW0gaGFzIGJlZW4gcmVhbGx5IGluaXRpYWxpemVkLgorCisyMDA0LTA1LTA3ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmRlPgorCisJKiBhYy5jIChnY3J5X2FjX29wZW4pOiBEbyBub3QgZGVyZWZlcmVuY2UgTlVMTCBwb2ludGVyLiAgUmVwb3J0ZWQKKwlieSBVbWJlcnRvIFNhbHNpLgorCisyMDA0LTAyLTIwICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogcHJpbWVnZW4uYyAoY2hlY2tfcHJpbWUpOiBOZXcgYXJncyBDQl9GVU5DIGFuZCBDQl9BUkc7IGNhbGwgdGhlbQorCWF0IGRpZmZlcmVudCBzdGFnZXMuICBQYXNzIHRoZXNlIGFyZ3VtZW50cyB0aHJvdWdoIGFsbCBjYWxsZXJzLgorCisyMDA0LTAyLTA2ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogZGVzLmM6IEFkZCBhIG5ldyBPSUQgYXMgdXNlZCBieSBwa2NzIzEyLgorCisJKiByZmMyMjY4LmM6IE5ldy4gVGFrZW4gZnJvbSBsaWJnY3J5cHQuIAorCSogY2lwaGVyLmM6IFNldHVwIHRoZSByZmMyMjY4IGFsZ29yaXRobS4KKworMjAwNC0wMS0yNSAgTW9yaXR6IFNjaHVsdGUgIDxtb0BnMTBjb2RlLmNvbT4KKworCSogcHJpbWVnZW4uYyAocHJpbWVfZ2VuZXJhdGVfaW50ZXJuYWwpOiBEbyBub3QgZm9yZ2V0IHRvIGZyZWUKKwlgcV9mYWN0b3InOyBmaXhlZCBieSBCcmlldWMgSmV1bmhvbW1lLgorCShwcmltZV9nZW5lcmF0ZV9pbnRlcm5hbCk6IERvIG5vdCBmb3JnZXQgdG8gZnJlZSBgcHJpbWUnLgorCisyMDA0LTAxLTE0ICBNb3JpdHogU2NodWx0ZSAgPG1vQGcxMGNvZGUuY29tPgorCisJKiBhYy5jIChnY3J5X2FjX2RhdGFfc2V0KTogTmV3IGFyZ3VtZW50OiBmbGFnczsgc2xpZ2h0bHkKKwlyZXdyaXR0ZW4uCisJKGdjcnlfYWNfZGF0YV9nZXRfbmFtZSwgZ2NyeV9hY19kYXRhX2dldF9pbmRleCk6IExpa2V3aXNlLgorCShnY3J5X2FjX2tleV9wYWlyX2dlbmVyYXRlKTogTmV3IGFyZ3VtZW50OiBtaXNjX2RhdGE7IG1vZGlmaWVkCisJb3JkZXIgb2YgYXJndW1lbnRzLgorCShnY3J5X2FjX2tleV90ZXN0KTogTmV3IGFyZ3VtZW50OiBoYW5kbGUuCisJKGdjcnlfYWNfa2V5X2dldF9uYml0cywgZ2NyeV9hY19rZXlfZ2V0X2dyaXApOiBMaWtld2lzZS4KKwlVc2UgR0NSWV9BQ19GTEFHX05PX0JMSU5ESU5HIGluc3RlYWQgb2YKKwlHQ1JZX0FDX0RBVEFfRkxBR19OT19CTElORElORy4KKwkoZ2NyeV9hY19tcGkpOiBOZXcgbWVtYmVyOiBmbGFncy4KKwkoZ2NyeV9hY19kYXRhX3NlYXJjaCwgZ2NyeV9hY19kYXRhX2FkZCk6IFJlbW92ZWQgZnVuY3Rpb25zLgorCisyMDAzLTEyLTIyICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogcHJpbWVnZW4uYyAoaXNfcHJpbWUpOiBSZWxlYXNlIEEyLgorCisyMDAzLTEyLTE5ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogbWQuYzogTW92ZWQgYSBjb3VwbGUgb2YgZnVuY3Rpb25zIGRvd24gYmVsb3cgdGhlIGRhdGEgc3RydWN0dXJlCisJZGVmaW5pdGlvbnMuCisJKHN0cnVjdCBnY3J5X21kX2NvbnRleHQpOiBOZXcgZmllbGQgQUNUVUFMX0hBTkRMRV9TSVpFLgorCShtZF9vcGVuKTogU2V0IGl0IGhlcmUuCisJKHN0cmN1dCBnY3J5X21kX2xpc3QpOiBOZXcgZmllbGQgQUNUVUFMX1NUUlVDVF9TSVpFLgorCShtZF9lbmFibGUpOiBTZXQgaXQgaGVyZS4KKwkobWRfY2xvc2UpOiBXaXBlIHRoZSBjb250ZXh0IG1lbW9yeS4KKwlzZWN1cmUgbWVtb3J5LgorCSogY2lwaGVyLmMgKHN0cnVjdCBnY3J5X2NpcGhlcl9oYW5kbGUpOiBOZXcgZmllbGQgQUNUVUFMX0hBTkRMRV9TSVpFLgorCShnY3J5X2NpcGhlcl9vcGVuKTogU2V0IGl0IGhlcmUuCisJKGdjcnlfY2lwaGVyX2Nsb3NlKTogVXNlIGl0IHRvIGFsd2F5cyB3aXBlIG91dCB0aGUgaGFuZGxlIGRhdGEuCisKKwkqIGFjLmMgKGdjcnlfYWNfb3Blbik6IE1ha2Ugc3VyZSBIQU5ETEUgZ2V0cyBpbml0aWFsaXplZCBldmVuIHdoZW4KKwl0aGUgZnVuY3Rpb24gaXMgbm90IHN1Y2Nlc3NmdWwuCisJKGdjcnlfYWNfY2xvc2UpOiBBbGxvdyBhIE5VTEwgaGFuZGxlLgorCShnY3J5X2FjX2tleV9kZXN0cm95LCBnY3J5X2FjX2tleV9wYWlyX2Rlc3Ryb3kpOiBEaXR0by4KKwkoZ2NyeV9hY19rZXlfZ2V0X2dyaXApOiBSZXR1cm4gSU5WX09CSiBvbiBlcnJvci4KKworCSogcHJpbWVnZW4uYyAocHJpbWVfZ2VuZXJhdGVfaW50ZXJuYWwpOiBGaXhlZCBlcnJvciBjb2RlIGZvcgorCWZhaWxlZCBtYWxsb2MuICBSZXBsYWNlZCB0aGUgIWVyciBpZiBjaGFpbiBieSBnb3Rvcy4KKwkoZ2NyeV9wcmltZV9ncm91cF9nZW5lcmF0b3IpOiBSZW1vdmUgdGhlIGV4dHJhIHNhbml0eSBjaGVjay4KKworCSogbWQuYzogTWlub3IgY29kZSBhbmQgY29tbWVudCBjbGVhbnVwcy4KKworMjAwMy0xMi0xNiAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIHByaW1lZ2VuLmMgKGdlbl9wcmltZSk6IERvYyBmaXguICBUaGFua3MgdG8gTmV3dG9uIEhhbW1ldC4KKworMjAwMy0xMi0xMSAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIHJuZHVuaXguYyAoc2xvd19wb2xsKTogRG9uJ3QgdXNlICN3YXJuaW5nIGJ1dCAjZXJyb3IuCisKKwkqIHJuZGVnZC5jOiBDaGFuZ2VkIGluZGVudGF0aW9uLgorCShteV9tYWtlX2ZpbGVuYW1lKTogUmVtb3ZkIHRoZSB2YXJfYXJnIGNydWZ0IGJlY3Vhc2Ugd2UKKwlkb24ndCBuZWVkIGl0IGhlcmUuICBDaGFuZ2VkIGNhbGxlci4gIAorCisJKiBybmRsaW51eC5jOiBDaGFuZ2VkIGluZGVudGF0aW9uLgorCShvcGVuX2RldmljZSk6IFJlbW92ZSB0aGUgc3VwZXJmbHVvdXMgc3RhdCBjYWxsIGFuZCBjbGFyaWZ5CisJY29tbWVudC4KKworCSogcnNhLmM6IENoYW5nZWQgaW5kZW50YXRpb24uCisJKHNlY3JldCk6IFVzZSB0aGUgc3RhbmRhcmQgYWxnb3JpdGhtIGlmIHAsIHEgYW5kIHUgYXJlIG5vdAorCWF2YWlsYWJsZS4KKwkocnNhX2JsaW5kLCByc2FfdW5ibGluZCk6IFJlbmFtZWQgZnJvbSBfZ2NyeV9yc2FfYmxpbmQsCisJX2djcnlfcnNhX3VuYmxpbmQgYW5kIG1vdmVkIG1vcmUgdG8gdGhlIHRvcC4KKworCSogbWQ0LmM6IENoYW5nZWQgaW5kZW50YXRpb24uICBSZW1vdmVkIHVubmVjZXNzYXJ5IGNhc3RzLgorCSogbWQ1LmMsIHJtZDE2MC5jLCBzaGExLmMsIHRpZ2VyLmM6IERpdHRvLgorCSogcmlqbmRhZWwuYywgdHdvZmlzaC5jOiBEaXR0by4KKwkqIHNlcnBlbnQuYzogUmVtb3ZlZCB1bm5lY2Vzc2FyeSBjYXN0cy4KKwkqIHNoYTI1Ni5jLCBzaGE1MTIuYzogRGl0dG8uCisKKzIwMDMtMTItMDkgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBkc2EuYzogVW5pZmllZCBpbmRlbnRhdGlvbiBzdHlsZS4KKwkqIGVsZ2FtYWwuYzogRGl0dG8uIAorCSogZGVzLmMgKGRlc19rZXlfc2NoZWR1bGUpOiBDb2RlIGJlYXV0aWZpY2F0aW9ucy4KKwkqIGJsb3dmaXNoLmM6IENoYW5nZWQgaW5kZW50YXRpb24gc3R5bGUuCisJKiBjYXN0NS5jIChkb19jYXN0X3NldGtleSk6IERpdHRvLgorCisJKiBwdWJrZXkuYyAoZ2NyeV9wa19lbmNyeXB0KTogUmVwbGFjZWQgdGhlIGNoYWluIG9mIGlmKCFlcnIpIHRlc3RzCisJYnkgc3RyYWlnaHRmb3J3YXJkIGdvdG9zLiBPdGhlciBjbGVhbnVwcy4KKwkoZ2NyeV9wa19kZWNyeXB0KTogRGl0dG8uCisJKGdjcnlfcGtfc2lnbik6IERpdHRvLgorCShnY3J5X3BrX3ZlcmlmeSk6IERpdHRvLgorCShnY3J5X3BrX2dlbmtleSk6IERpdHRvLiAgVXNlIHN0cnRvdWwgaW5zdGVhZCBvZiBzdHJ0b2wuCisJKGdjcnlfcGtfY3RsKTogVXNlIEdQR19FUlJfSU5WX0FSRyB0byBpbmRpY2F0ZSBiYWQgYXJndW1lbnRzLgorCisyMDAzLTEyLTA3ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogcHVia2V5LmMgKGdjcnlfcGtfcmVnaXN0ZXJfZGVmYXVsdCk6IFVuZGVmIHRoZSBoZWxwZXIgbWFjcm8uCisJKGdjcnlfcGtfbWFwX25hbWUpOiBBbGxvdyBOVUxMIGZvciBzdHJpbmcuCisJKHNleHBfdG9fa2V5KTogVXNlIG1lbWNweSBhbmQgbm90IHN0cm5jcHkuICBVc2UgZ2NyeV9mcmVlIGFuZCBub3QKKwlmcmVlLgorCShzZXhwX3RvX3NpZyk6IERpdHRvLgorCShzZXhwX3RvX2VuYyk6IERpdHRvLiAgUmVwbGFjZWQgdGhlIGNoYWluIG9mIGlmKCFlcnIpIHRlc3RzIGJ5CisJc3RyYWlnaHRmb3J3YXJkIGdvdG9zLgorCisyMDAzLTEyLTA1ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogY2lwaGVyLmM6IERvY3VtZW50YXRpb24gY2xlYW51cHMuCisJKGdjcnlfY2lwaGVyX21vZGVfZnJvbV9vaWQpOiBBbGxvdyBOVUxMIGZvciBTVFJJTkcuCisKKzIwMDMtMTItMDMgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBlbGdhbWFsLmMgKHNpZ24sIGRvX2VuY3J5cHQsIGdlbl9rKTogTWFrZSBzdXJlIHRoYXQgYSBzbWFsbCBLIGlzCisJb25seSB1c2VkIGZvciBlbmNyeXB0aW9uLgorCisyMDAzLTExLTE4ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogcmFuZG9tLmggKHJuZHczMl9zZXRfZGxsX25hbWUpOiBSZW1vdmVkIHVudXNlZCBwcm90b3R5cGUuCisKKwkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkZWQgTWFuaWZlc3QuCisKKzIwMDMtMTEtMTEgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBNYW5pZmVzdDogTmV3LgorCisyMDAzLTExLTA0ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogbWQuYyAoZ2NyeV9tZF9oYXNoX2J1ZmZlcik6IFVzZSBzaG9ydGN1dCBmb3IgU0hBMQorCSogc2hhMS5jIChfZ2NyeV9zaGExX2hhc2hfYnVmZmVyKTogTmV3LgorCisJKiByYW5kb20uYzogUmVmb3JtYXR0ZWQgbW9zdCBmdW5jdGlvbnMuCisJKG1peF9wb29sKTogTW92ZWQgdGhlIGZhaWxzYWZlX2RpZ2VzdCBmcm9tIGdsb2JhbAorCXNjb3BlIHRvIGhlcmUuCisJKGRvX2Zhc3RfcmFuZG9tX3BvbGwpOiBVc2UgdGhlIGdlbmVyaWMgZnVjbnRpb25zIGV2ZW4gaWYgYSBmYXN0CisJZ2F0aGVyaW5nIGZ1bmN0aW9uIGhhcyBiZWVuIHVzZWQuCisJKHJlYWRfcG9vbCk6IERldGVjdCBhIGZvcmsgYW5kIHJldHJ5LgorCShnY3J5X3JhbmRvbWl6ZSwgZ2V0X3JhbmRvbV9ieXRlcyk6IERvbid0IGRpc3Rpbmd1aXNoIGFueW1vcmUKKwliZXR3ZWVuIHdlYWsgYW5kIHN0cm9uZyByYW5kb20uCisJKGdjcnlfY3JlYXRlX25vbmNlKTogTmV3LgorCisyMDAzLTEwLTMxICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogcm5kdzMyLmMgKHNsb3dfZ2F0aGVyZXJfd2luZG93c05UKTogVXNlIGEgcGxhaW4gYnVmZmVyIGZvciB0aGUKKwlkaXNrIHBlcmZvcm1hbmNlIHZhbHVlcyBhbmQgbm90IHRoZSBXMzIgQVBJIHN0cnVjdHVyZS4KKworCSogZHNhLmMgKHZlcmlmeSk6IHMvZXhwL2V4LyBkdWUgdG8gc2hhZG93aW5nIG9mIGEgYnVpbHRpbi4KKwkqIGVsZ2FtYWwuYyAodmVyaWZ5KTogRGl0dG8uCisKKwkqIGFjLmMgKGdjcnlfYWNfZGF0YV9nZXRfaW5kZXgpOiBzL2luZGV4L2lkeC8KKwkoZ2NyeV9hY19kYXRhX2NvcHlfaW50ZXJuYWwpOiBSZW1vdmUgdGhlIGNhc3QgaW4gX2djcnlfbWFsbG9jLgorCShnY3J5X2FjX2RhdGFfYWRkKTogTXVzdCB1c2UgZ2NyeV9yZWFsbG9jIGluc3RlYWQgb2YgcmVhbGxvYy4KKwkqIHB1YmtleS5jIChzZXhwX2VsZW1lbnRzX2V4dHJhY3QpOiBzL2luZGV4L2lkeC8gYXMgdHJpYnV0ZSB0byB0aGUKKwlmb3JlaGFja2Vycy4KKwkoZ2NyeV9wa19lbmNyeXB0KTogUmVtb3ZlZCBzaGFkb3dlZCBkZWZpbml0aW9uIG9mIEkuIFJlb3JkZXJlZAorCWFyZ3VtZW50cyB0byBtYWxsb2MgZm9yIGNsYXJpdHkuCisJKGdjcnlfcGtfc2lnbiwgZ2NyeV9wa19nZW5rZXkpOiBEaXR0by4KKwkqIHByaW1lZ2VuLmMgKHByaW1lX2dlbmVyYXRlX2ludGVybmFsKTogcy9yYW5kb20vcmFuZG9tbGV2ZWwvLgorCisyMDAzLTEwLTI3ICBNb3JpdHogU2NodWx0ZSAgPG1vQGcxMGNvZGUuY29tPgorCisJKiBwdWJrZXkuYyAoZ2NyeV9wa19lbmNyeXB0KTogRG9uJ3QgZm9yZ2V0IHRvIGRlYWxsb2NhdGUgcGtleS4KKworMjAwMy0xMC0yNyAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIHJhbmRvbS5jIChnY3J5X3JhbmRvbV9hZGRfYnl0ZXMpOiBSZXR1cm4gaWYgYnVmbGVuIGlzIHplcm8gdG8KKwlhdm9pZCBnY2Mgd2FybmluZyBhYm91dCB1bnNlZCBwYXJhbWV0ZXIuCisJKE1BU0tfTEVWRUwpOiBTaW1wbGlmaWVkOyBkb2VzIG5vdyB3b3JrIGZvciBzaWduZWQgYW5kIHVuc2lnbmVkCisJdy9vIHdhcm5pbmdzLgorCisJKiBtZC5jIChtZF9zdGFydF9kZWJ1Zyk6IFJlbW92ZWQgdGhlIGNvbnN0IGZyb20gU1VGRklYLCBiZWNhdXNlCisJdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSB0aGUgY29udHJvbCBmdWNudGlvbiB3aGljaCBkb2VzIG5vdAorCXJlcXVpcmUgY29uc3QuCisKKwlQcmVmaXhlZCBhbGwgKHB1YmtleSxkaWdlc3QsY2lwaGVyfV9zcGVjXyogZ2xvYmFsZSB2YXJpYWJsZXMgd2l0aAorCV9nY3J5Xy4KKworCSogYWMuYyAoYWNfa2V5X2lkZW50aWZpZXJzKTogTWFkZSBzdGF0aWMuCisKKwkqIHJhbmRvbS5jIChnZXRmbmNfZ2F0aGVyX3JhbmRvbSxnZXRmbmNfZmFzdF9yYW5kb21fcG9sbCk6IE1vdmUKKwlwcm90b3R5cGVzIHRvIC4uCisJKiByYW5kLWludGVybmFsLmg6IC4uIGhlcmUgCisJKiByYW5kb20uYyAoZ2V0Zm5jX2dhdGhlcl9yYW5kb20pOiBJbmNsdWRlIHJuZHczMiBnYXRoZXJlci4KKwkqIHJuZHVuaXguYywgcm5kdzMyLmMsIHJuZGVnZC5jOiBJbmNsdWRlIHRoZW0gaGVyZS4KKwkqIHJuZGxpbnV4LmMgKF9nY3J5X3JuZGxpbnV4X2dhdGhlcl9yYW5kb20pOiBQcmVwZW5kIHRoZSBfZ2NyeV8KKwlwcmVmaXguICBDaGFuZ2VkIGFsbCBjYWxsZXJzLgorCSogcm5kZWdkLmMgKF9nY3J5X3JuZGVnZF9nYXRoZXJfcmFuZG9tKTogTGlrZXdpc2UuCisJKF9nY3J5X3JuZGVnZF9jb25uZWN0X3NvY2tldCk6IExpa2V3aXNlLgorCSogcm5kdW5peC5jIChfZ2NyeV9ybmR1bml4X2dhdGhlcl9yYW5kb20pOiBMaWtld2lzZS4KKwkod2FpdHBpZCk6IE1hZGUgc3RhdGljLgorCSogcm5kdzMyLmM6IFJlbW92ZWQgdGhlIG9sZCBhbmQgdW51c2VkIHdpbnNlZWQuZGxsIGNydWZ0LgorCShfZ2NyeV9ybmR3MzJfZ2F0aGVyX3JhbmRvbV9mYXN0KTogUmVuYW1lZCBmcm9tCisJZ2F0aGVyX3JhbmRvbV9mYXN0LgorCShfZ2NyeV9ybmR3MzJfZ2F0aGVyX3JhbmRvbSk6IFJlbmFtZWQgZnJvbSBnYXRoZXJfcmFuZG9tLiAgTm90ZSwKKwl0aGF0IHRoZSBjaGFuZ2VzIDIwMDMtMDQtMDggc29tZWhvdyBnb3QgbG9zdC4KKworCSogc2hhNTEyLmMgKHNoYTUxMl9pbml0LCBzaGEzODRfaW5pdCk6IE1hZGUgc3RhdGljLgorCisJKiBjaXBoZXIuYyAoZG9fY3RyX2RlY3J5cHQpOiBSZW1vdmVkICJyZXR1cm4iIGZyb20gdGhpcyB2b2lkCisJZnVuY3Rpb24uCisKKzIwMDMtMTAtMjQgIE1vcml0eiBTY2h1bHRlICA8bW9AZzEwY29kZS5jb20+CisKKwkqIHNlcnBlbnQuYzogRml4IGFuIGlzc3VlIG9uIGJpZy1lbmRpYW4gc3lzdGVtcy4KKworCSogcm5kdzMyLmM6IFJlbW92ZWQgSVNfTU9EVUxFIC1jcnVmdC4KKwkqIHJuZGxpbnV4LmMgKHJuZGxpbnV4X2dhdGhlcl9yYW5kb20pOiBMaWtld2lzZS4KKworMjAwMy0xMC0xMCAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIHByaW1lZ2VuLmMgKGdlbl9wcmltZSk6IEJhaWwgb3V0IGlmIE5CSVRTIGlzIGxlc3MgdGhhbiAxNi4KKwkocHJpbWVfZ2VuZXJhdGVfaW50ZXJuYWwpOiBJbml0aWFsaXplIHByaW1lIHZhcmlhYmxlIHRvIHN1cHByZXNzCisJY29tcGlsZXIgd2FybmluZy4gIENoZWNrIHBiaXRzLCBpbml0aWFsaXplIHFiaXRzIHdoZW4gcGFzc2VkIGFzCisJemVyby4KKworCSogcHJpbWVnZW4uYyAocHJpbWVfZ2VuZXJhdGVfaW50ZXJuYWwpOiBOZXcgYXJnCisJQUxMX0ZBQ1RPUlMuIENoYW5nZWQgYWxsIGNhbGxlcnMuCisJKGdjcnlfcHJpbWVfZ2VuZXJhdGUpOiBNYWtlIHRoZSBmYWN0b3JzIGFyZyBvcHRpb25hbC4gUmVxdWVzdAorCWFsbF9mYWN0b3JzLiAgTWFrZSBzdXJlIFBSSU1FIGlzIHNldCB0byBOVUxMIGV2ZW4gb24gZXJyb3IuCisJKGdjcnlfcHJpbWVfZ3JvdXBfZ2VuZXJhdG9yKTogTmV3LgorCShnY3J5X3ByaW1lX3JlbGVhc2VfZmFjdG9ycyk6IE5ldy4KKworMjAwMy0xMC0wNiAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIHByaW1lZ2VuLmMgKGdlbl9wcmltZSk6IEFzc2VydCB0aGF0IE5CSVRTIGlzIG5ldmVyIHplcm8sIGl0CisJd291bGQgY2F1c2UgYSBzZWd2LgorCisyMDAzLTA5LTI4ICBNb3JpdHogU2NodWx0ZSAgPG1vQGcxMGNvZGUuY29tPgorCisJKiBhYy5jOiBJbmNsdWRlICJjaXBoZXIuaCIuCisKKzIwMDMtMDktMjcgIE1vcml0eiBTY2h1bHRlICA8bW9AZzEwY29kZS5jb20+CisKKwkqIHJuZGVnZC5jIChkb19yZWFkKTogUmV0dXJuIG5yZWFkIGluc3RlYWQgb2YgbmJ5dGVzOyB0aGFua3MgdG8KKwlNaWNoYWVsIENhZXJ3eW4uCisKKzIwMDMtMDktMDQgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBwdWJrZXkuYyAoX2djcnlfcGtfYWxpYXNlZF9hbGdvX25hbWUpOiBOZXcuCisJKiBhYy5jIChnY3J5X2FjX29wZW4pOiBVc2UgaXQgaGVyZS4KKworCSogTWFrZWZpbGUuYW0gKEVYVFJBX2xpYmNpcGhlcl9sYV9TT1VSQ0VTKTogQWRkIHNlcnBlbnQuYworCisyMDAzLTA5LTAyICBNb3JpdHogU2NodWx0ZSAgPG1vQGcxMGNvZGUuY29tPgorCisJKiBwcmltZWdlbi5jIChnY3J5X3ByaW1lX2NoZWNrLCBnY3J5X3ByaW1lX2dlbmVyYXRlKTogTmV3CisJZnVuY3Rpb25zLgorCShwcmltZV9nZW5lcmF0ZV9pbnRlcm5hbCk6IE5ldyBmdW5jdGlvbiwgYmFzZWQgb24KKwlfZ2NyeV9nZW5lcmF0ZV9lbGdfcHJpbWUuCisJKF9nY3J5X2dlbmVyYXRlX2VsZ19wcmltZSk6IFJld3JpdHRlbiBhcyBhIHdyYXBwZXIgZm9yCisJcHJpbWVfZ2VuZXJhdGVfaW50ZXJuYWwuCisKKzIwMDMtMDgtMjggIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBwdWJrZXkuYyAoZ2NyeV9wa19lbmNyeXB0KTogRG9uJ3QgaW5jbHVkZSB0aGUgZmxhZ3MgbGlzdCBpbiB0aGUKKwlyZXR1cm4gdmFsdWUuICBUaGlzIGRvZXMgbm90IG1ha2Ugc2Vuc2UgYW5kIGJyZWFrcyBhbnkgcHJvZ3JhbXMKKwlwYXJzaW5nIHRoZSBvdXRwdXQgc3RyaWN0bHkgKGUuZy4gY3VycmVudCBncGdzbSkuCisJKGdjcnlfcGtfZW5jcnlwdCk6IElmIGFsaWFzZXMgZm9yIHRoZSBhbGdvcml0aG0gbmFtZSBleGlzdHMsIHRha2UKKwl0aGUgZmlyc3Qgb25lIGluc3RlYWQgb2YgdGhlIHJlZ3VsYXIgbmFtZSB0byBhZGhlcmUgdG8gU1BLSQorCWNvbnZlbnRpb25zLgorCShnY3J5X3BrX2dlbmtleSk6IERpdHRvLgorCShnY3J5X3BrX3NpZ24pOiBEaXR0by4gUmVtb3ZlZCB1bnVzZWQgS0VZX0FMR09fTkFNRS4KKworMjAwMy0wOC0xOSAgTW9yaXR6IFNjaHVsdGUgIDxtb0BnMTBjb2RlLmNvbT4KKworCSogY2lwaGVyLmM6IEFkZCBzdXBwb3J0IGZvciBTZXJwZW50CisJKiBzZXJwZW50LmM6IE5ldyBmaWxlLgorCisyMDAzLTA4LTEwICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogcnNhLmMgKF9nY3J5X3JzYV9ibGluZCwgX2djcnlfcnNhX3VuYmxpbmQpOiBEZWNsYXJlIHN0YXRpYy4KKworMjAwMy0wOC0wOSAgVGltbyBTY2h1bHogIDx0d29hZGF5QGZyZWFrbWFpbC5kZT4KKworCSogcmFuZG9tLmMgKGdldGZuY19nYXRoZXJfcmFuZG9tKTogRG9uJ3QgY2hlY2sgTkFNRV9PRl9ERVZfUkFORE9NCisJdHdvIHRpbWVzLCBidXQgYWxzbyB0aGUgTkFNRV9PRl9ERVZfVVJBTkRPTSBkZXZpY2UuCisJCisyMDAzLTA4LTA4ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogcHVia2V5LmMgKHNleHBfdG9fZW5jKTogRml4ZWQgZXh0cmFjdGlvbiBvZiBTLUV4cHJlc3Npb246IGRvIG5vdAorCWZhaWwgaWYgbm8gYGZsYWdzJyBzdWIgUy1FeHByZXNzaW9uIGlzIGZvdW5kLgorCisyMDAzLTA3LTI3ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogbWQuYyAoZ2NyeV9tZF9sb29rdXBfZnVuY19vaWQpOiBBbGxvdyBmb3IgZW1wdHkgT0lEIGxpc3RzLgorCisyMDAzLTA3LTIzICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogYWMuYyAoZ2NyeV9hY19kYXRhX2NvbnN0cnVjdCk6IE5ldyBhcmd1bWVudDogaW5jbHVkZV9mbGFncywgb25seQorCWluY2x1ZGUgYGZsYWdzJyBTLWV4cHJlc3Npb24sIGlmIGluY2x1ZGVfZmxhZ3MgaXMgdHJ1ZS4gIEFkanVzdAorCWNhbGxlcnMuICBUaGFua3MgZm9yIHRyaWdnZXJpbmcgYSBidWcgY2F1c2VkIGJ5IGBmbGFncycKKwlzdWItUy1leHByZXNzaW9uIHdoZXJlIHRoZXkgYXJlIG5vdCBleHBlY3RlZCB0byBSYWxmIFNjaG5laWRlci4KKworMjAwMy0wNy0yMSAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIHB1YmtleS5jIChnY3J5X3BrX2xvb2t1cF9mdW5jX25hbWUpOiBVc2UgbmV3IG1lbWJlciBuYW1lCisJYGFsaWFzZXMnIGluc3RlYWQgb2YgYHNleHBfbmFtZXMnLgorCisJKiBhYy5jIChnY3J5X2FjX2tleV9kYXRhX2dldCk6IE5ldyBmdW5jdGlvbi4KKworCSogY2lwaGVyLmMgKGdjcnlfY2lwaGVyX2xvb2t1cF9mdW5jX25hbWUpOiBGaXggcmV0dXJuIHZhbHVlLgorCisyMDAzLTA3LTIwICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogYmxvd2Zpc2guYzogQWRqdXN0ZWQgZm9yIG5ldyBnY3J5X2NpcGhlcl9zcGVjX3Qgc3RydWN0dXJlLgorCSogY2FzdDUuYzogTGlrZXdpc2UuCisJKiB0d29maXNoLmM6IExpa2V3aXNlLgorCSogYXJjZm91ci5jOiBMaWtld2lzZS4KKwkqIHJpam5kYWVsLmMgKHJpam5kYWVsX29pZHMsIHJpam5kYWVsMTkyX29pZHMsIHJpam5kYWVsMjU2X29pZHMpOgorCU5ldyB2YXJpYWJsZXMsIGFkanVzdCBmb3IgbmV3IGdjcnlfY2lwaGVyX3NwZWNfdCBzdHJ1Y3R1cmUuCisJKiBkZXMuYyAob2lkc190cmlwbGVkZXMpOiBOZXcgdmFyaWFibGUsIGFkanVzdCBmb3IgbmV3CisJZ2NyeV9jaXBoZXJfc3BlY190IHN0cnVjdHVyZS4KKworCSogbWQuYyAob2lkX3RhYmxlKTogUmVtb3ZlZC4KKworCSogdGlnZXIuYyAob2lkX3NwZWNfdGlnZXIpOiBOZXcgdmFyaWFibGUuCisJKGRpZ2VzdF9zcGVjX3RpZ2VyKTogQWRqdXN0ZWQgZm9yIG5ldyBncnlfbWRfc3BlY190IHN0cnVjdHVyZS4KKworCSogc2hhNTEyLmMgKG9pZF9zcGVjX3NoYTUxMik6IE5ldyB2YXJpYWJsZS4KKwkoZGlnZXN0X3NwZWNfc2hhNTEyKTogQWRqdXN0ZWQgZm9yIG5ldyBncnlfbWRfc3BlY190IHN0cnVjdHVyZS4KKworCSogc2hhNTEyLmMgKG9pZF9zcGVjX3NoYTM4NCk6IE5ldyB2YXJpYWJsZS4KKwkoZGlnZXN0X3NwZWNfc2hhMzg0KTogQWRqdXN0ZWQgZm9yIG5ldyBncnlfbWRfc3BlY190IHN0cnVjdHVyZS4KKworCSogc2hhMjU2LmMgKG9pZF9zcGVjX3NoYTI1Nik6IE5ldyB2YXJpYWJsZS4KKwkoZGlnZXN0X3NwZWNfc2hhMjU2KTogQWRqdXN0ZWQgZm9yIG5ldyBncnlfbWRfc3BlY190IHN0cnVjdHVyZS4KKworCSogc2hhMS5jIChvaWRfc3BlY19zaGExKTogTmV3IHZhcmlhYmxlLgorCShkaWdlc3Rfc3BlY19zaGExKTogQWRqdXN0ZWQgZm9yIG5ldyBncnlfbWRfc3BlY190IHN0cnVjdHVyZS4KKworCSogcm1kMTYwLmMgKG9pZF9zcGVjX3JtZDE2MCk6IE5ldyB2YXJpYWJsZS4KKwkoZGlnZXN0X3NwZWNfcm5kMTYwKTogQWRqdXN0ZWQgZm9yIG5ldyBncnlfbWRfc3BlY190IHN0cnVjdHVyZS4KKworCSogbWQ1LmMgKG9pZF9zcGVjX21kNSk6IE5ldyB2YXJpYWJsZS4KKwkoZGlnZXN0X3NwZWNfbWQ1KTogQWRqdXN0ZWQgZm9yIG5ldyBncnlfbWRfc3BlY190IHN0cnVjdHVyZS4KKworCSogbWQ0LmMgKG9pZF9zcGVjX21kNCk6IE5ldyB2YXJpYWJsZS4KKwkoZGlnZXN0X3NwZWNfbWQ0KTogQWRqdXN0ZWQgZm9yIG5ldyBncnlfbWRfc3BlY190IHN0cnVjdHVyZS4KKworCSogY3JjLmMgKGRpZ2VzdF9zcGVjX2NyYzMyLCBkaWdlc3Rfc3BlY19jcmMzMl9yZmMxNTEwLAorCWRpZ2VzdF9zcGVjX2NyYzMyX3JmYzI0NDApOiBBZGp1c3RlZCBmb3IgbmV3IGdyeV9tZF9zcGVjX3QKKwlzdHJ1Y3R1cmUuCisKKzIwMDMtMDctMTkgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBtZC5jIChnY3J5X21kX2xvb2t1cF9mdW5jX29pZCk6IE5ldyBmdW5jdGlvbi4KKwkoc2VhcmNoX29pZCk6IE5ldyBmdW5jdGlvbiwgY29waWVkIGZyb20gY2lwaGVyLmMuCisJKGdjcnlfbWRfbWFwX25hbWUpOiBBZGp1c3QgZm9yIG5ldyBzZWFyY2hfb2lkX2ludGVyZmFjZS4KKworCSogY2lwaGVyLmMgKG9pZF90YWJsZSk6IFJlbW92ZWQgdGFibGUuCisJKGdjcnlfY2lwaGVyX2xvb2t1cF9mdW5jX29pZCk6IE5ldyBmdW5jdGlvbi4KKwkoc2VhcmNoX29pZCk6IFJld3JpdHRlbiB0byB1c2UgdGhlIG1vZHVsZSBmdW5jdGlvbnMuCisJKGdjcnlfY2lwaGVyX21hcF9uYW1lKTogQWRqdXN0IGZvciBuZXcgc2VhcmNoX29pZCBpbnRlcmZhY2UuCisJKGdjcnlfY2lwaGVyX21vZGVfZnJvbV9vaWQpOiBMaWtld2lzZS4KKworMjAwMy0wNy0xOCAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIG1kLmMgKGdjcnlfbWRfaGFzaF9idWZmZXIpOiBDb252ZXJ0IEVSUiB0byBncGdfZXJyb3JfdCBpbgorCWdwZ19zdHJlcnJvci4KKworMjAwMy0wNy0xNCAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGNpcGhlci5jIChnY3J5X2NpcGhlcl9sb29rdXBfZnVuY19uYW1lKTogQWxzbyBjaGVjayB0aGUgY2lwaGVyCisJbmFtZSBhbGlhc2VzLCBub3QganVzdCB0aGUgcHJpbWFyeSBuYW1lLgorCShnY3J5X2NpcGhlcl9tYXBfbmFtZSk6IFJlbW92ZSBrbHVkZ2UgZm9yIGFsaWFzaW5nIFJpam5kYWVsIHRvCisJQUVTLgorCisJKiBhcmNmb3VyLmMsIGJsb3dmaXNoLmMsIGNhc3Q1LmMsIGRlcy5jLCB0d29maXNoLmM6IEFkanVzdCBjaXBoZXIKKwlzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZXMuCisKKwkqIHJpam5kYWVsLmMgKHJpam5kYWVsX25hbWVzLCByaWpuZGFlbDE5Ml9uYW1lcywKKwlyaWpuZGFlbDI1Nl9uYW1lcyk6IE5ldyB2YXJpYWJsZXMsIHVzZSB0aGVtIGluIHRoZSBjaXBoZXIKKwlzcGVjaWZpY2F0aW9ucy4KKworCSogcm1kMTYwdGVzdC5jOiBSZW1vdmVkIGZpbGUuCisKKwkqIGFjLmMsIGFyY2ZvdXIuYywgYmxvd2Zpc2guYywgY2FzdDUuYywgY2lwaGVyLmMsIGRlcy5jLCBkc2EuYywKKwllbGdhbWFsLmMsIG1kLmMsIHB1YmtleS5jLCByYW5kb20uYywgcmlqbmRhZWwuYywgcnNhLmMsIHR3b2Zpc2guYzoKKwlVc2VkIGdjcnlfZXJyKiB3cmFwcGVycyBmb3IgbGliZ3BnIHN5bWJvbHMuCisKKwkqIHByaW1lZ2VuLmMgKGdlbl9wcmltZSk6IENvcnJlY3QgdGhlIG9yZGVyIGFyZ3VtZW50cyB0bworCWV4dHJhX2NoZWNrLgorCisyMDAzLTA3LTEyICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogYWMuYzogUmVwbGFjZWQgYWxsIHB1YmxpYyBvY2N1cmVuY2VzIG9mIGdwZ19lcnJvcl90IHdpdGgKKwlnY3J5X2Vycm9yX3QuCisJKiBjaXBoZXIuYzogTGlrZXdpc2UuCisJKiBtZC5jOiBMaWtld2lzZS4KKwkqIHB1YmtleS5jOiBMaWtld2lzZS4KKwkqIHJhbmRvbS5jOiBMaWtld2lzZS4KKworCSogY2lwaGVyLmM6IEFkZGVkIHN1cHBvcnQgZm9yIFRXT0ZJU0gxMjguCisKKzIwMDMtMDctMDggIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBhYy5jIChnY3J5X2FjX2RhdGFfY29weV9pbnRlcm5hbCk6IE5ldyBmdW5jdGlvbiwgYmFzZWQgb24KKwlnY3J5X2FjX2RhdGFfY29weS4KKwkoZ2NyeV9hY19kYXRhX2NvcHkpOiBNYWRlIHB1YmxpYywgdXNlIGdjcnlfYWNfZGF0YV9jb3B5X2ludGVybmFsLgorCShnY3J5X2FjX2tleV9pbml0KTogVXNlIGdjcnlfYWNfZGF0YV9jb3B5X2ludGVybmFsLgorCisyMDAzLTA3LTA3ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogYWMuYyAoZ2NyeV9hY19kYXRhX3NldCk6IE9ubHkgcmVsZWFzZSBvbGQgTVBJIHZhbHVlIGlmIGl0IGlzCisJZGlmZmVyZW50IGZyb20gdGhlIG5ldyB2YWx1ZS4gIEJ1ZyByZXBvcnRlZCBieSBTaW1vbiBKb3NlZnNzb24KKwk8amFzQGV4dHVuZG8uY29tPi4KKworCSogcHVia2V5LmMgKGdjcnlfcGtfbGlzdCk6IE5ldyBmdW5jdGlvbi4KKwkqIG1kLmMgKGdjcnlfbWRfbGlzdCk6IE5ldyBmdW5jdGlvbi4KKworCSogYWMuYyAoZ2NyeV9hY19rZXlfcGFpcl9nZW5lcmF0ZSk6IEZpeCBjYWxjdWxhdGlvbiBvZiBmb3JtYXQKKwlzdHJpbmcgc2l6ZS4KKworMjAwMy0wNy0wNSAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIG1kLmM6IE5hbWVkIHN0cnVjdCBvZiBkaWdlc3RfdGFibGUgYGRpZ2VzdF90YWJsZV9lbnRyeScuCisJKGRpZ2VzdF90YWJsZV9lbnRyeSk6IE5ldyBtZW1iZXI6IGFsZ29yaXRobTsgZmlsbGVkIGluLgorCShkaWdlc3RfdGFibGVfZW50cnkpOiBSZW1vdmVkIHVudXNlZCBtZW1iZXI6IGZsYWdzLgorCShnY3J5X21kX3JlZ2lzdGVyKTogTmV3IGFyZ3VtZW50OiBhbGdvcml0aG1faWQsIGZpbGxlZCBpbi4KKwkoZ2NyeV9tZF9yZWdpc3Rlcl9kZWZhdWx0KTogVXNlZCBhbGdvcml0aG0gSUQgZnJvbSBtb2R1bGUKKwlzdHJ1Y3R1cmUuCisJKGdjcnlfbWRfbWFwX25hbWUpOiBMaWtld2lzZS4KKwkobWRfZW5hYmxlKTogTGlrZXdpc2UuCisJKG1kX3JlYWQpOiBMaWtld2lzZS4KKwkoZ2NyeV9tZF9pbmZvKTogTGlrZXdpc2UuCisKKwkqIHB1YmtleS5jOiBOYW1lZCB0cnVjdCBmb3IgcHVia2V5X3RhYmxlIGBwdWJrZXlfdGFibGVfZW50cnknLgorCShwdWJrZXlfdGFibGVfZW50cnkpOiBOZXcgbWVtYmVyOiBhbGdvcml0aG07IGZpbGxlZCBpbi4KKwkoZ2NyeV9wa19yZWdpc3Rlcl9kZWZhdWx0KTogVXNlZCBhbGdvcml0aG0gSUQgZnJvbSBwdWJrZXlfdGFibGUuCisJKGdjcnlfcGtfcmVnaXN0ZXIpOiBOZXcgYXJndW1lbnQ6IGFsZ29yaXRobV9pZCwgZmlsbGVkIGluLgorCShnY3J5X3BrX21hcF9uYW1lKTogVXNlZCBhbGdvcml0aG0gSUQgZnJvbSBtb2R1bGUgc3RydWN0dXJlLgorCShnY3J5X3BrX2RlY3J5cHQpOiBMaWtld2lzZS4KKwkoZ2NyeV9wa19lbmNyeXB0KTogTGlrZXdpc2UuCisJKGdjcnlfcGtfdmVyaWZ5KTogTGlrZXdpc2UuCisJKGdjcnlfcGtfc2lnbik6IExpa2V3aXNlLgorCShnY3J5X3BrX3Rlc3RrZXkpOiBMaWtld2lzZS4KKwkoZ2NyeV9wa19nZW5rZXkpOiBMaWtld2lzZS4KKwkoZ2NyeV9wa19nZXRfbmJpdHMpOiBMaWtld2lzZS4KKwkoc2V4cF90b19rZXkpOiBSZW1vdmVkIHVudXNlZCB2YXJpYWJsZTogYWxnby4KKwkoc2V4cF90b19zaWcpOiBMaWtld2lzZS4KKworCSogY2lwaGVyLmM6IE5hbWVkIHN0cnVjdCBmb3IgY2lwaGVyX3RhYmxlIGBjaXBoZXJfdGFibGVfZW50cnknLgorCShjaXBoZXJfdGFibGVfZW50cnkpOiBOZXcgbWVtYmVyOiBhbGdvcml0aG07IGZpbGxlZCBpbi4KKwkoZ2NyeV9jaXBoZXJfcmVnaXN0ZXJfZGVmYXVsdCk6IFVzZWQgYWxnb3JpdGhtIElEIGZyb20KKwljaXBoZXJfdGFibGUuCisJKGdjcnlfY2lwaGVyX3JlZ2lzdGVyKTogTmV3IGFyZ3VtZW50OiBhbGdvcml0aG1faWQsIGZpbGxlZCBpbi4KKwkoZ2NyeV9jaXBoZXJfbWFwX25hbWUpOiBVc2VkIGFsZ29yaXRobSBJRCBmcm9tIG1vZHVsZSBzdHJ1Y3R1cmUuCisKKwkqIGFyY2ZvdXIuYyAoY2lwaGVyX3NwZWNfYXJjZm91cik6IFJlbW92ZWQgYWxnb3JpdGhtIElELgorCSogYmxvd2Zpc2guYyAoY2lwaGVyX3NwZWNfYmxvd2Zpc2gpOiBMaWtld2lzZS4KKwkqIGNhc3Q1LmMgKGNpcGhlcl9zcGVjX2Nhc3Q1KTogTGlrZXdpc2UuCisJKiBjcmMuYyAoZGlnZXN0X3NwZWNfY3JjMzIpOiBMaWtld2lzZS4KKwkqIGNyYy5jIChkaWdlc3Rfc3BlY19jcmMzMl9yZmMxNTEwKTogTGlrZXdpc2UuCisJKiBjcmMuYyAoZGlnZXN0X3NwZWNfY3JjMzJfcmZjMjQ0MCk6IExpa2V3aXNlLgorCSogZGVzLmMgKGNpcGhlcl9zcGVjX2Rlcyk6IExpa2V3aXNlLgorCSogZGVzLmMgKGNpcGhlcl9zcGVjX3RyaXBsZWRlcyk6IExpa2V3aXNlLgorCSogZHNhLmMgKHB1YmtleV9zcGVjX2RzYSk6IExpa2V3aXNlLgorCSogZWxnYW1hbC5jIChwdWJrZXlfc3BlY19lbGcpOiBMaWtld2lzZS4KKwkqIG1kNC5jIChkaWdlc3Rfc3BlY19tZDQpOiBMaWtld2lzZS4KKwkqIG1kNS5jIChkaWdlc3Rfc3BlY19tZDUpOiBMaWtld2lzZS4KKwkqIGFlcy5jIChjaXBoZXJfc3BlY19hZXMpOiBMaWtld2lzZS4KKwkqIGFlcy5jIChjaXBoZXJfc3BlY19hZXMxOTIpOiBMaWtld2lzZS4KKwkqIGFlcy5jIChjaXBoZXJfc3BlY19hZXMyNTYpOiBMaWtld2lzZS4KKwkqIHJzYS5jIChwdWJrZXlfc3BlY19yc2EpOiBMaWtld2lzZS4KKwkqIHNoYTEuYyAoZGlnZXN0X3NwZWNfc2hhMSk6IExpa2V3aXNlLgorCSogc2hhMjU2LmMgKGRpZ2VzdF9zcGVjX3NoYTI1Nik6IExpa2V3aXNlLgorCSogc2hhNTEyLmMgKGRpZ2VzdF9zcGVjX3NoYTUxMik6IExpa2V3aXNlLgorCSogdGlnZXIuYyAoZGlnZXN0X3NwZWNfdGlnZXIpOiBMaWtld2lzZS4KKwkqIHR3b2Zpc2guYyAoY2lwaGVyX3NwZWNfdHdvZmlzaCk6IExpa2V3aXNlLgorCSogdHdvZmlzaC5jIChjaXBoZXJfc3BlY190d29maXNoMTI4KTogTGlrZXdpc2UuCisKKwkqIE1ha2VmaWxlLmFtIChFWFRSQV9saWJjaXBoZXJfbGFfU09VUkNFUyk6IEZpeCBsaXN0IG9mIHNvdXJjZQorCWZpbGVzOyByZXBvcnRlZCBieSBTaW1vbiBKb3NlZnNzb24gPGphc0BleHR1bmRvLmNvbT4uCisKKwkqIHB1YmtleS5jOiBSZXBsYWNlZCBhbGwgb2NjdXJlbmNlcyBvZiBgaWQnIHdpdGggYGFsZ29yaXRobScsCisJc2luY2UgYGlkJyBpcyBhIGtleXdvcmQgaW4gb2JqLWMuCisJKiBtZC5jOiBMaWtld2lzZS4KKwkqIGNpcGhlci5jOiBMaWtld2lzZS4KKworCSogY3JjLmMsIG1kNC5jLCBtZDUuYywgcm1kMTYwLmMsIHNoYTEuYywgc2hhMjU2LmMsIHRpZ2VyLmM6CisJUmVwbGFjZWQgYWxsIG9jY3VyZW5jZXMgb2YgZ2NyeV9kaWdlc3Rfc3BlY190IHdpdGggZ2NyeV9tZF9zcGVjX3QuCisKKwkqIGRzYS5jLCByc2EuYywgZWxnYW1hbC5jOiBSZXBsYWNlZCBhbGwgb2NjdXJlbmNlbnMgb2YKKwlnY3J5X3B1YmtleV9zcGVjX3Qgd2l0aCBnY3J5X3BrX3NwZWNfdC4KKworCSogbWQuYzogUmVwbGFjZWQgYWxsIG9jY3VyZW5jZXMgb2YgZ2NyeV9kaWdlc3Rfc3BlY190IHdpdGgKKwlnY3J5X21kX3NwZWNfdC4KKwkoZ2NyeV9kaWdlc3RfcmVnaXN0ZXJfZGVmYXVsdCk6IFJlbmFtZWQgdG8gLi4uCisJKGdjcnlfbWRfcmVnaXN0ZXJfZGVmYXVsdCk6IC4uLiB0aGlzOyBhZGp1c3RlZCBjYWxsZXJzLgorCShnY3J5X2RpZ2VzdF9sb29rdXBfZnVuY19uYW1lKTogUmVuYW1lZCB0byAuLi4KKwkoZ2NyeV9tZF9sb29rdXBfZnVuY19uYW1lKTogLi4uIHRoaXM7IGFkanVzdGVkIGNhbGxlcnMuCisJKGdjcnlfZGlnZXN0X2xvb2t1cF9uYW1lKTogUmVuYW1lZCB0byAuLi4KKwkoZ2NyeV9tZF9sb29rdXBfbmFtZSk6IC4uLiB0aGlzOyBhZGp1c3RlZCBjYWxsZXJzLgorCShnY3J5X2RpZ2VzdF9yZWdpc3Rlcik6IFJlbmFtZWQgdG8gLi4uCisJKGdjcnlfbWRfcmVnaXN0ZXIpOiAuLi4gdGhpcy4KKwkoZ2NyeV9kaWdlc3RfdW5yZWdpc3Rlcik6IFJlbmFtZWQgdG8gLi4uCisJKGdjcnlfbWRfdW5yZWdpc3Rlcik6IC4uLiB0aGlzLgorCisJKiBwdWJrZXkuYyAoZ2NyeV9wdWJrZXlfcmVnaXN0ZXIpOiBSZW5hbWVkIHRvIC4uLgorCShnY3J5X3BrX3JlZ2lzdGVyKTogLi4uIHRoaXMuCisJKGdjcnlfcHVia2V5X3VucmVnaXN0ZXIpOiBSZW5hbWVkIHRvIC4uLgorCShnY3J5X3BrX3VucmVnaXN0ZXIpOiAuLi4gdGhpcy4KKwlSZXBsYWNlZCBhbGwgb2NjdXJlbmNlcyBvZiBnY3J5X3B1YmtleV9zcGVjX3Qgd2l0aCBnY3J5X3BrX3NwZWNfdC4KKwkoZ2NyeV9wdWJrZXlfcmVnaXN0ZXJfZGVmYXVsdCk6IFJlbmFtZWQgdG8gLi4uCisJKGdjcnlfcGtfcmVnaXN0ZXJfZGVmYXVsdCk6IC4uLiB0aGlzOyBhZGp1c3RlZCBjYWxsZXJzLgorCShnY3J5X3B1YmtleV9sb29rdXBfZnVuY19uYW1lKTogUmVuYW1lZCB0byAuLi4KKwkoZ2NyeV9wa19sb29rdXBfZnVuY19uYW1lKTogLi4uIHRoaXM7IGFkanVzdGVkIGNhbGxlcnMuCisJKGdjcnlfcHVia2V5X2xvb2t1cF9uYW1lKTogUmVuYW1lZCB0byAuLi4KKwkoZ2NyeV9wa19sb29rdXBfbmFtZSk6IC4uLiB0aGlzOyBhZGp1c3RlZCBjYWxsZXJzLgorCisJKiBtZC5jIChnY3J5X21kX2hhc2hfYnVmZmVyKTogRml4IGVycm9yIGNoZWNraW5nLiAgVGhhbmtzIHRvIFNpbW9uCisJSm9zZWZzc29uIDxqYXNAZXh0dW5kZS5jb20+LgorCisyMDAzLTA3LTA0ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogY2lwaGVyLmMgKGdjcnlfY2lwaGVyX2xpc3QpOiBOZXcgZnVuY3Rpb24uCisKKzIwMDMtMDctMDEgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBwdWJrZXkuYyAoc2V4cF90b19zaWcpOiBBY2NlcHQgYSBgZmxhZ3MnIFMtZXhwcmVzc2lvbiB0byBiZSBtb3JlCisJY29uc2lzdGVudCB3aXRoIHNleHBfdG9fZW5jLgorCisyMDAzLTA2LTMwICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKGxpYmNpcGhlcl9sYV9TT1VSQ0VTKTogQWRkZWQ6IGFjLmMuCisKKwkqIHB1YmtleS5jIChfZ2NyeV9wa19tb2R1bGVfbG9va3VwKTogTmV3IGZ1bmN0aW9uLgorCShfZ2NyeV9wa19tb2R1bGVfcmVsZWFzZSk6IE5ldyBmdW5jdGlvbi4KKworMjAwMy0wNi0yOSAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGFjLmM6IE5ldyBmaWxlLgorCisyMDAzLTA2LTI2ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogbWQuYyAoZ2NyeV9tZF9oYXNoX2J1ZmZlcik6IFRyaWdnZXIgQlVHIGNvcnJlY2x5IHdpdGggbmV3IEFQSS4KKworMjAwMy0wNi0xOSAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIG1kLmMgKGdjcnlfbWRfaXNfZW5hYmxlZCk6IEZpeGVkLiAKKworMjAwMy0wNi0xOCAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIGNpcGhlci5jIChnY3J5X2NpcGhlcl9nZXRfYWxnb19rZXlsZW4pOiBOZXcuCisJKGdjcnlfY2lwaGVyX2dldF9hbGdvX2Jsa2xlbik6IE5ldy4KKworMjAwMy0wNi0xOCAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGFyY2ZvdXIuYywgY2lwaGVyLmMsIGJsb3dmaXNoLmMsIG1kLmMsIGNhc3Q1LmMsIHB1YmtleS5jLCBjcmMuYywKKwlkZXMuYywgZHNhLmMsIGVsZ2FtYWwuYywgbWQ0LmMsIG1kNS5jLCByYW5kb20uYywgcmlqbmRhZWwuYywKKwlybWQxNjAuYywgcnNhLmMsIHNoYTEuYywgc2hhMjU2LmMsIHNoYTUxMi5jLCB0aWdlci5jLCB0d29maXNoLmM6CisJUmVwbGFjZWQgb2xkZXIgdHlwZXMgR2NyeURpZ2VzdFNwZWMsIEdjcnlDaXBoZXJTcGVjIGFuZAorCUdjcnlQdWJrZXlTcGVjIHdpdGggbmV3ZXIgdHlwZXM6IGdjcnlfZGlnZXN0X3NwZWNfdCwKKwlnY3J5X2NpcGhlcl9zcGVjX3QgYW5kIGdjcnlfcHVia2V5X3NwZWNfdC4KKworCSogbWQuYyAoZ2NyeV9kaWdlc3RfaWRfbmV3KTogUmVtb3ZlZCBmdW5jdGlvbi4KKwkoZ2NyeV9kaWdlc3RfcmVnaXN0ZXIpOiBSZW1vdmVkIGNvZGUgZm9yIGdlbmVyYXRpbmcgYSBuZXcgbW9kdWxlCisJSUQuCisKKwkqIHB1YmtleS5jIChnY3J5X3B1YmtleV9pZF9uZXcpOiBSZW1vdmVkIGZ1bmN0aW9uLgorCShnY3J5X3B1YmtleV9yZWdpc3Rlcik6IFJlbW92ZWQgY29kZSBmb3IgZ2VuZXJhdGluZyBhIG5ldyBtb2R1bGUKKwlJRC4KKworCSogY2lwaGVyLmMsIG1kLmMsIHB1YmtleS5jOiBSZXBsYWNlIG9sZCB0eXBlIEdjcnlNb2R1bGUgd2l0aCBuZXdlcgorCW9uZTogZ2NyeV9tb2R1bGVfdC4KKwkoZ2NyeV9jaXBoZXJfaWRfbmV3KTogUmVtb3ZlZCBmdW5jdGlvbi4KKwkoZ2NyeV9jaXBoZXJfcmVnaXN0ZXIpOiBSZW1vdmVkIGNvZGUgZm9yIGdlbmVyYXRpbmcgYSBuZXcgbW9kdWxlCisJSUQuCisKKwkqIGNpcGhlci5jIChnY3J5X2NpcGhlcl9yZWdpc3Rlcik6IEFkanVzdCBjYWxsIHRvCisJX2djcnlfbW9kdWxlX2FkZC4KKwkoZ2NyeV9jaXBoZXJfcmVnaXN0ZXJfZGVmYXVsdCk6IExpa2V3aXNlLgorCSogcHVia2V5LmMgKGdjcnlfcHVia2V5X3JlZ2lzdGVyX2RlZmF1bHQpOiBMaWtld2lzZS4KKwkoZ2NyeV9wdWJrZXlfcmVnaXN0ZXIpOiBMaWtld2lzZS4KKwkqIG1kLmMgKGdjcnlfZGlnZXN0X3JlZ2lzdGVyX2RlZmF1bHQpOiBMaWtld2lzZS4KKwkoZ2NyeV9kaWdlc3RfcmVnaXN0ZXIpOiBMaWtld2lzZS4KKworCSogbWQuYyAoZ2NyeV9kaWdlc3RfbG9va3VwX2Z1bmNfaWQpOiBSZW1vdmVkIGZ1bmN0aW9uLgorCShnY3J5X2RpZ2VzdF9sb29rdXBfaWQpOiBMaWtld2lzZS4KKwkoZ2NyeV9kaWdlc3RfaWRfbmV3KTogVXNlIF9nY3J5X21vZHVsZV9sb29rdXBfaWQgaW5zdGVhZCBvZgorCWdjcnlfZGlnZXN0X2xvb2t1cF9pZC4KKwkoZGlnZXN0X2FsZ29fdG9fc3RyaW5nKTogTGlrZXdpc2UuCisJKGNoZWNrX2RpZ2VzdF9hbGdvKTogTGlrZXdpc2UuCisJKG1kX2VuYWJsZSk6IExpa2V3aXNlLgorCShtZF9kaWdlc3RfbGVuZ3RoKTogTGlrZXdpc2UuCisJKG1kX2Fzbl9vaWQpOiBMaWtld2lzZS4KKworCSogcHVia2V5LmMgKGdjcnlfcHVia2V5X2xvb2t1cF9pZCk6IFJlbW92ZWQgZnVuY3Rpb24uCisJKGdjcnlfcHVia2V5X2xvb2t1cF9mdW5jX2lkKTogTGlrZXdpc2UuCisJKGdjcnlfcHVia2V5X2lkX25ldyk6IFVzZSBfZ2NyeV9tb2R1bGVfbG9va3VwX2lkIGluc3RlYWQgb2YKKwlnY3J5X3B1YmtleV9pZF9uZXcuCisJKGdjcnlfcGtfYWxnb19uYW1lKTogTGlrZXdpc2UuCisJKGRpc2FibGVfcHVia2V5X2FsZ28pOiBMaWtld2lzZS4KKwkoY2hlY2tfcHVia2V5X2FsZ28pOiBMaWtld2lzZS4KKwkocHVia2V5X2dldF9ucGtleSk6IExpa2V3aXNlLgorCShwdWJrZXlfZ2V0X25za2V5KTogTGlrZXdpc2UuCisJKHB1YmtleV9nZXRfbnNpZyk6IExpa2V3aXNlLgorCShwdWJrZXlfZ2V0X25lbmMpOiBMaWtld2lzZS4KKwkocHVia2V5X2dlbmVyYXRlKTogTGlrZXdpc2UuCisJKHB1YmtleV9jaGVja19zZWNyZXRfa2V5KTogTGlrZXdpc2UuCisJKHB1YmtleV9lbmNyeXB0KTogTGlrZXdpc2UuCisJKHB1YmtleV9kZWNyeXB0KTogTGlrZXdpc2UuCisJKHB1YmtleV9zaWduKTogTGlrZXdpc2UuCisJKHB1YmtleV92ZXJpZnkpOiBMaWtld2lzZS4KKwkoZ2NyeV9wa19hbGdvX2luZm8pOiBMaWtld2lzZS4KKworCSogY2lwaGVyLmMgKGdjcnlfY2lwaGVyX2xvb2t1cF9mdW5jX2lkKTogUmVtb3ZlZCBmdW5jdGlvbi4KKwkoZ2NyeV9jaXBoZXJfbG9va3VwX2lkKTogTGlrZXdpc2UuCisJKGNpcGhlcl9hbGdvX3RvX3N0cmluZyk6IHVzZSBfZ2NyeV9tb2R1bGVfbG9va3VwX2lkIGluc3RlYWQgb2YKKwlnY3J5X2NpcGhlcl9sb29rdXBfaWQuCisJKGRpc2FibGVfY2lwaGVyX2FsZ28pOiBMaWtld2lzZS4KKwkoY2hlY2tfY2lwaGVyX2FsZ28pOiBMaWtld2lzZS4KKwkoY2lwaGVyX2dldF9ibG9ja3NpemUpOiBMaWtld2lzZS4KKwkoZ2NyeV9jaXBoZXJfb3Blbik6IExpa2V3aXNlLgorCShnY3J5X2NpcGhlcl9pZF9uZXcpOiBMaWtld2lzZS4KKworMjAwMy0wNi0xNyAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChHQ1JZUFRfTU9EVUxFUyk6IFNldCB0byBAR0NSWVBUX0NJUEhFUlNALAorCUBHQ1JZUFRfUFVCS0VZX0NJUEhFUlNALCBAR0NSWVBUX0RJR0VTVFNAIGFuZCBAR0NSWVBUX1JBTkRPTUAuCisJKGxpYmNpcGhlcl9sYV9ERVBFTkRFTkNJRVMpOiBTZXQgdG8gJChHQ1JZUFRfTU9EVUxFUykuCisJKGxpYmNpcGhlcl9sYV9MSUJBREQpOiBMaWtld2lzZS4KKwkoQU1fQ0ZMQUdTKTogQWRkZWQ6IEBHUEdfRVJST1JfQ0ZMQUdTQC4KKwkoRVhUUkFfbGliY2lwaGVyX2xhX1NPVVJDRVMpOiBBZGRlZCBhbGwgY29uZGl0aW9uYWwgc291cmNlcy4KKworCSogbWQuYyAobWRfb3Blbik6IFVzZSBfZ2NyeV9mYXN0X3JhbmRvbV9wb2xsIGluc3RlYWQgb2YKKwlmYXN0X3JhbmRvbV9wb2xsLgorCSogY2lwaGVyLmMgKGdjcnlfY2lwaGVyX29wZW4pOiBMaWtld2lzZS4KKworCSogcmFuZG9tLmggKGZhc3RfcmFuZG9tX3BvbGwpOiBSZW1vdmVkIG1hY3JvLgorCisJKiBibG93ZmlzaC5jLCBtZDQuYywgbWQ1LmMsIHJtZDE2MC5jLCBzaGExLmMsIHNoYTI1Ni5jLCBzaGE1MTIuYywKKwl0aWdlci5jOiBVc2UgQXV0b2NvbmYncyBXT1JEU19CSUdFTkRJQU4gaW5zdGVhZCBvZiBvdXIgb3duCisJQklHX0VORElBTl9IT1NULgorCisyMDAzLTA2LTE2ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogcmFuZG9tLmMgKGdldGZuY19nYXRoZXJfcmFuZG9tKTogRG8gbm90IHNwZWNpYWwtY2FzZQorCVVTRV9BTExfUkFORE9NX01PRFVMRVMsIG1ha2UgaXQgdGhlIGRlZmF1bHQuCisKKwkqIGRzYS5jOiBSZXBsYWNlIGxhc3Qgb2NjdXJlbmNlcyBvZiBvbGQgdHlwZSBuYW1lcyB3aXRoIG5ld2VyCisJbmFtZXMgKGkuZS4gcmVwbGFjZSBNUEkgd2l0aCBnY3J5X21waV90KS4KKwkqIGVsZ2FtYWwuYzogTGlrZXdpc2UuCisJKiBwcmltZWdlbi5jOiBMaWtld2lzZS4KKwkqIHB1YmtleS5jOiBMaWtld2lzZS4KKwkqIHJzYS5jOiBMaWtld2lzZS4KKworMjAwMy0wNi0xNCAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGRlcy5jIChkZXNfc2V0a2V5KTogQWRkIHNlbGZ0ZXN0IGNoZWNrLgorCSh0cmlwbGVkZXNfc2V0M2tleXMpOiBMaWtld2lzZS4KKwkoZG9fdHJpcGxlZGVzX3NldGtleSk6IFJlbW92ZSBzZWxmdGVzdCBjaGVjay4KKwkoZG9fZGVzX3NldGtleSk6IExpa2V3aXNlLgorCisyMDAzLTA2LTExICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogbWQuYyAoX2djcnlfbWRfaW5pdCk6IE5ldyBmdW5jdGlvbi4KKwkqIGNpcGhlci5jIChfZ2NyeV9jaXBoZXJfaW5pdCk6IE5ldyBmdW5jdGlvbi4KKwkqIHB1YmtleS5jIChfZ2NyeV9wa19pbml0KTogTmV3IGZ1bmN0aW9uLgorCisyMDAzLTA2LTEzICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogbWQuYyAoZ2NyeV9tZF9nZXRfYWxnbyk6IFJldmVydGVkIHRvIG9sZCBBUEkuICBUaGlzIGlzIGEKKwljb252ZW5pZW5jZSBmdW5jdGlvbiBhbnl3YXkgYW5kIGVycm9yIGNoZWNraW5nIGlzIG5vdCBhcHByb3JpYXRlLgorCShnY3J5X21kX2lzX3NlY3VyZSk6IE5ldy4KKwkoZ2NyeV9tZF9pc19lbmFibGVkKTogTmV3LgorCisyMDAzLTA2LTEyICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogY2lwaGVyLmMgKGdjcnlfY2lwaGVyX29wZW4pOiBNYWtlIHN1cmUgSEFORExFIGlzIHNldCB0byBOVUxMIG9uCisJZXJyb3IuCisKKzIwMDMtMDYtMTEgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBtZC5jIChnY3J5X21kX29wZW4pOiBNYWtlIHN1cmUgSCByZWNlaXZlcyBlaXRoZXIgTlVMTCBvciBhbgorCXZhbGlkIGhhbmRsZS4KKwkoZ2NyeV9tZF9jb3B5KTogU3dhcHBlZCBhcmd1bWVudHMgc28gdGhhdCBpdCBpcyBtb3JlIGluIGxpb25lIHdpdGgKKwltZF9vcGVuIGFuZCBtb3N0IG90aGVyIEFQSSBmdWNudGlvbnMgbGlrZSBtZW1jcHkgKGRlc3RpbmF0aW9uCisJY29tZXMgZmlyc3QpLiAgTWFrZSBzdXJlIEhBTkRMRSBpcyBzZXQgdG8gTlVMTCBvbiBlcnJvci4KKwkKKwkqIHJpam5kYWVsLmMgKGRvX2VuY3J5cHQpOiBIYWNrIHRvIGZvcmNlIGNvcnJlY3QgYWxpZ25tZW50LiAgSXQKKwlzZWVtcyBub3QgdG8gYmUJbm90IHN1ZmZpY2llbnQsIHRob3VnaC4gIFdlIHNob3VsZCByZXdvcmsgdGhpcworCWZ1Y250aW9ucyBhbmQgcmVtb3ZlIGFsbCB0aGVzZSB1Z2x5IGNhc3RzLiAgTGV0IHRoZSBjb21waWxlcgorCW9wdGltaXplIG9yIGhhdmUgYW4gYXNzZW1ibGVyIGltcGxlbWVudGF0aW9uLgorCisyMDAzLTA2LTA5ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogTWFrZWZpbGUuYW06IFJlbW92ZWQgcnVsZXMgc2VycGVudCwgc2luY2UgdGhhdCBpcyBub3QgY29tbWl0ZWQKKwl5ZXQuCisKKzIwMDMtMDYtMDggIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBwdWJrZXkuYyAoZ2NyeV9wa19lbmNyeXB0KTogSW1wcm92ZSBjYWxjdWxhdGlvbiBmb3Igc2l6ZSBvZiB0aGUKKwlmb3JtYXQgc3RyaW5nLgorCisyMDAzLTA2LTA3ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogYXJjZm91ci5jLCBiaXRoZWxwLmgsIGJsb3dmaXNoLmMsIGNhc3Q1LmMsIGNpcGhlci5jLCBjcmMuYywKKwlkZXMuYywgZHNhLmMsIGVsZ2FtYWwuYywgbWQ0LmMsIG1kNS5jLCBtZC5jLCBwcmltZWdlbi5jLCBwdWJrZXkuYywKKwlyYW5kLWludGVybmFsLmgsIHJhbmRvbS5jLCByYW5kb20uaCwgcmlqbmRhZWwuYywgcm1kMTYwLmMsCisJcm1kMTYwdGVzdC5jLCBybWQuaCwgcm5kZWdlZC5jLCBybmRsaW51eC5jLCBybmR1bml4LmMsIHJuZHczMi5jLAorCXJzYS5jLCBzaGExLmMsIHNoYTI1Ni5jLCBzaGE1MTIuYywgdGlnZXIuYywgdHdvZmlzaC5jOiBFZGl0ZWQgYWxsCisJcHJlcHJvY2Vzc29yIGluc3RydWN0aW9ucyB0byByZW1vdmUgd2hpdGVzcGFjZSBiZWZvcmUgdGhlICcjJy4KKwlUaGlzIGlzIG5vdCByZXF1aXJlZCBieSBDODksIGJ1dCB0aGVyZSBhcmUgc29tZSBjb21waWxlcnMgb3V0CisJdGhlcmUgdGhhdCBkb24ndCBsaWtlIGl0LiAgUmVwbGFjZWQgYW55IG9jY3VyZW5jZSBvZiB0aGUgbm93CisJZGVwcmVjYXRlZCB0eXBlIG5hbWVzIHdpdGggdGhlIG5ldyBvbmVzLgorCQorMjAwMy0wNi0wNCAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIHB1YmtleS5jIChnY3J5X3BrX2VuY3J5cHQpOiBDb25zdHJ1Y3QgYW4gYXJnX2xpc3QgYW5kIHVzZQorCWdjcnlfc2V4cF9idWlsZF9hcnJheSBpbnN0ZWFkIG9mIGdjcnlfc2V4cF9idWlsZC4KKwkoZ2NyeV9wa19zaWduKTogTGlrZXdpc2UuCisJKGdjcnlfcGtfZ2Vua2V5KTogTGlrZXdpc2UuCisKKzIwMDMtMDYtMDEgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBkc2EuYyAoX2djcnlfZHNhX2dlbmVyYXRlKTogRG8gbm90IGNoZWNrIHdldGhlciB0aGUgYWxnb3JpdGhtIElECisJZG9lcyBpbmRlZWQgYmVsb25nIHRvIERTQS4KKwkoX2djcnlfZHNhX3NpZ24pOiBMaWtld2lzZS4KKwkoX2djcnlfZHNhX3ZlcmlmeSk6IExpa2V3aXNlLgorCShfZ2NyeV9kc2FfZ2V0X25iaXRzKTogTGlrZXdpc2UuCisKKwkqIGVsZ2FtYWwuYyAoX2djcnlfZWxnX2NoZWNrX3NlY3JldF9rZXkpOiBEbyBub3QgY2hlY2sgd2V0aGVyIHRoZQorCWFsZ29yaXRobSBJRCBkb2VzIGluZGVlZCBiZWxvbmcgdG8gRWxHYW1hbC4KKwkoX2djcnlfZWxnX2VuY3J5cHQpOiBMaWtld2lzZS4KKwkoX2djcnlfZWxnX2RlY3J5cHQpOiBMaWtld2lzZS4KKwkoX2djcnlfZWxnX3NpZ24pOiBMaWtld2lzZS4KKwkoX2djcnlfZWxnX3ZlcmlmeSk6IExpa2V3aXNlLgorCShfZ2NyeV9lbGdfZ2V0X25iaXRzKTogTGlrZXdpc2UuCisJKF9nY3J5X2VsZ19nZW5lcmF0ZSk6IExpa2V3aXNlLgorCisJKiByc2EuYyAoX2djcnlfcnNhX2dlbmVyYXRlKTogRG8gbm90IGNoZWNrIHdldGhlciB0aGUgYWxnb3JpdGhtIElECisJZG9lcyBpbmRlZWQgYmVsb25nIHRvIFJTQS4KKwkoX2djcnlfcnNhX2VuY3J5cHQpOiBMaWtld2lzZS4KKwkoX2djcnlfcnNhX2RlY3J5cHQpOiBMaWtld2lzZS4KKwkoX2djcnlfcnNhX3NpZ24pOiBMaWtld2lzZS4KKwkoX2djcnlfcnNhX3ZlcmlmeSk6IExpa2V3aXNlLgorCShfZ2NyeV9yc2FfZ2V0X25iaXRzKTogTGlrZXdpc2UuCisKKzIwMDMtMDUtMzAgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBtZC5jIChtZF9nZXRfYWxnbyk6IFJldHVybiB6ZXJvIGluIGNhc2UgdG8gYWxnb3JpdGhtIGlzIGVuYWJsZWQuCisKKwkqIG1kLmMgKGdjcnlfbWRfaW5mbyk6IEFkanVzdGVkIGZvciBuZXcgbm8tZXJybm8tQVBJLgorCShtZF9maW5hbCk6IExpa2V3aXNlLgorCShnY3J5X21kX2dldF9hbGdvKTogTGlrZXdpc2UuCisJKiBwdWJrZXkuYyAoZ2NyeV9wa19nZXRfa2V5Z3JpcCk6IExpa2V3aXNlLgorCShnY3J5X3BrX2N0bCk6IExpa2V3aXNlLgorCShnY3J5X3BrX2FsZ29faW5mbyk6IExpa2V3aXNlLgorCSogZGVzLmMgKHNlbGZ0ZXN0KTogTGlrZXdpc2UuCisKKzIwMDMtMDUtMjkgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBtZC5jIChtZF9lbmFibGUpOiBEbyBub3QgZm9yZ2V0IHRvIHJlbGVhc2UgbW9kdWxlIG9uIGVycm9yLgorCShnY3J5X21kX29wZW4pOiBBZGp1c3RlZCBmb3IgbmV3IG5vLWVycm5vLUFQSS4KKwkobWRfb3Blbik6IExpa2V3aXNlLgorCShtZF9jb3B5KTogTGlrZXdpc2UuCisJKGdjcnlfbWRfY29weSk6IExpa2V3aXNlLgorCShnY3J5X21kX3NldGtleSk6IExpa2V3aXNlLgorCShnY3J5X21kX2FsZ29faW5mbyk6IExpa2V3aXNlLgorCisJKiBjaXBoZXIuYyAoZ2NyeV9jaXBoZXJfb3Blbik6IEFkanVzdGVkIGZvciBuZXcgbm8tZXJybm8tQVBJIGFuZAorCWFsc28gZml4ZWQgYSBsb2NraW5nIGJ1Zy4KKwkoZ2NyeV9jaXBoZXJfZW5jcnlwdCk6IEFkanVzdGVkIGZvciBuZXcgbm8tZXJybm8tQVBJLgorCShnY3J5X2NpcGhlcl9kZWNyeXB0KTogTGlrZXdpc2UuCisJKGdjcnlfY2lwaGVyX2N0bCk6IExpa2V3aXNlLgorCShnY3J5X2NpcGhlcl9pbmZvKTogTGlrZXdpc2UuCisJKGdjcnlfY2lwaGVyX2FsZ29faW5mbyk6IExpa2V3aXNlLgorCisyMDAzLTA1LTI4ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogbWQuYyAobWRfZW5hYmxlKTogQWRqdXN0ZWQgZm9yIGxpYmdwZy1lcnJvci4KKwkoZ2NyeV9tZF9lbmFibGUpOiBMaWtld2lzZS4KKwkoZ2NyeV9kaWdlc3RfcmVnaXN0ZXJfZGVmYXVsdCk6IExpa2V3aXNlLgorCShnY3J5X2RpZ2VzdF9yZWdpc3Rlcik6IExpa2V3aXNlLgorCShjaGVja19kaWdlc3RfYWxnbyk6IExpa2V3aXNlLgorCShwcmVwYXJlX21hY3BhZHMpOiBMaWtld2lzZS4KKwkoZ2NyeV9tZF9zZXRrZXkpOiBMaWtld2lzZS4KKwkoZ2NyeV9tZF9jdGwpOiBMaWtld2lzZS4KKwkoZ2NyeV9tZF9nZXQpOiBMaWtld2lzZS4KKwkoZ2NyeV9tZF9hbGdvX2luZm8pOiBMaWtld2lzZS4KKwkoZ2NyeV9tZF9pbmZvKTogTGlrZXdpc2UuCisJKiBkc2EuYyAoX2djcnlfZHNhX2dlbmVyYXRlKTogTGlrZXdpc2UuCisJKF9nY3J5X2RzYV9jaGVja19zZWNyZXRfa2V5KTogTGlrZXdpc2UuCisJKF9nY3J5X2RzYV9zaWduKTogTGlrZXdpZS4KKwkoX2djcnlfZHNhX3ZlcmlmeSk6IExpa2V3aXNlLgorCSogdHdvZmlzaC5jIChkb190d29maXNoX3NldGtleSk6IExpa2V3aXNlLgorCSh0d29maXNoX3NldGtleSk6IExpa2V3aXNlLgorCSogY2lwaGVyLmMgKGdjcnlfY2lwaGVyX3JlZ2lzdGVyKTogTGlrZXdpc2UuCisKKzIwMDMtMDUtMjUgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiByaWpuZGFlbC5jIChkb19zZXRrZXkpOiBBZGp1c3RlZCBmb3IgbGliZ3BnLWVycm9yLgorCShyaWpuZGFlbF9zZXRrZXkpOiBMaWtld2lzZS4KKwkqIHJhbmRvbS5jIChnY3J5X3JhbmRvbV9hZGRfYnl0ZXMpOiBMaWtld2lzZS4KKwkqIGVsZ2FtYWwuYyAoX2djcnlfZWxnX2dlbmVyYXRlKTogTGlrZXdpc2UuCisJKF9nY3J5X2VsZ19jaGVja19zZWNyZXRfa2V5KTogTGlrZXdpc2UuCisJKF9nY3J5X2VsZ19lbmNyeXB0KTogTGlrZXdpc2UuCisJKF9nY3J5X2VsZ19kZWNyeXB0KTogTGlrZXdpc2UuCisJKF9nY3J5X2VsZ19zaWduKTogTGlrZXdpc2UuCisJKF9nY3J5X2VsZ192ZXJpZnkpOiBMaWtld2lzZS4KKwkqIHJzYS5jIChfZ2NyeV9yc2FfZ2VuZXJhdGUpOiBMaWtld2lzZS4KKwkoX2djcnlfcnNhX2NoZWNrX3NlY3JldF9rZXkpOiBMaWtld2lzZS4KKwkoX2djcnlfcnNhX2VuY3J5cHQpOiBMaWtld2lzZS4KKwkoX2djcnlfcnNhX2RlY3J5cHQpOiBMaWtld2lzZS4KKwkoX2djcnlfcnNhX3NpZ24pOiBMaWtld2lzZS4KKwkoX2djcnlfcnNhX3ZlcmlmeSk6IExpa2V3aXNlLgorCSogcHVia2V5LmMgKGR1bW15X2dlbmVyYXRlLCBkdW1teV9jaGVja19zZWNyZXRfa2V5LCBkdW1teV9lbmNyeXB0LAorCWR1bW15X2RlY3J5cHQsIGR1bW15X3NpZ24sIGR1bW15X3ZlcmlmeSk6IExpa2V3aXNlLgorCShnY3J5X3B1YmtleV9yZWdpc3Rlcik6IExpa2V3aXNlLgorCShjaGVja19wdWJrZXlfYWxnbyk6IExpa2V3aXNlLgorCShwdWJrZXlfZ2VuZXJhdGUpOiBMaWtld2lzZS4KKwkocHVia2V5X2NoZWNrX3NlY3JldF9rZXkpOiBMaWtld2lzZS4KKwkocHVia2V5X2VuY3J5cHQpOiBMaWtld2lzZS4KKwkocHVia2V5X2RlY3J5cHQpOiBMaWtld2lzZS4KKwkocHVia2V5X3NpZ24pOiBMaWtld2lzZS4KKwkocHVia2V5X3ZlcmlmeSk6IExpa2V3aXNlLgorCShzZXhwX2VsZW1lbnRzX2V4dHJhY3QpOiBMaWtld2lzZS4KKwkoc2V4cF90b19rZXkpOiBMaWtld2lzZS4KKwkoc2V4cF90b19zaWcpOiBMaWtld2lzZS4KKwkoc2V4cF90b19lbmMpOiBMaWtld2lzZS4KKwkoc2V4cF9kYXRhX3RvX21waSk6IExpa2V3aXNlLgorCShnY3J5X3BrX2VuY3J5cHQpOiBMaWtld2lzZS4KKwkoZ2NyeV9wa19kZWNyeXB0KTogTGlrZXdpc2UuCisJKGdjcnlfcGtfc2lnbik6IExpa2V3aXNlLgorCShnY3J5X3BrX3ZlcmlmeSk6IExpa2V3aXNlLgorCShnY3J5X3BrX3Rlc3RrZXkpOiBMaWtld2lzZS4KKwkoZ2NyeV9wa19nZW5rZXkpOiBMaWtld2lzZS4KKwkoZ2NyeV9wa19jdGwpOiBMaWtld2lzZS4KKwkqIGNpcGhlci5jIChkdW1teV9zZXRrZXkpOiBMaWtld2lzZS4KKwkoY2hlY2tfY2lwaGVyX2FsZ28pOiBMaWtld2lzZS4KKwkoZ2NyeV9jaXBoZXJfb3Blbik6IExpa2V3aXNlLgorCShjaXBoZXJfc2V0a2V5KTogTGlrZXdpc2UuCisJKGdjcnlfY2lwaGVyX2N0bCk6IExpa2V3aXNlLgorCShjaXBoZXJfZW5jcnlwdCk6IExpa2V3aXNlLgorCShnY3J5X2NpcGhlcl9lbmNyeXB0KTogTGlrZXdpc2UuCisJKGNpcGhlcl9kZWNyeXB0KTogTGlrZXdpc2UuCisJKGdjcnlfY2lwaGVyX2RlY3J5cHQpOiBMaWtld2lzZS4KKwkoZ2NyeV9jaXBoZXJfaW5mbyk6IExpa2V3aXNlLgorCShnY3J5X2NpcGhlcl9hbGdvX2luZm8pOiBMaWtld2lzZS4KKwkqIGNhc3Q1LmMgKGNhc3Rfc2V0a2V5KTogTGlrZXdpc2UuCisJKGRvX2Nhc3Rfc2V0a2V5KTogTGlrZXdpc2UuCisJKiBhcmNmb3VyLmMgKGFyY2ZvdXJfc2V0a2V5KTogTGlrZXdpc2UuCisJKGRvX2FyY2ZvdXJfc2V0a2V5KTogTGlrZXdpc2UuCisJKiBibG93ZmlzaC5jIChkb19iZl9zZXRrZXkpOiBMaWtld2lzZS4KKwkoYmZfc2V0a2V5KTogTGlrZXdpc2UuCisJKiBkZXMuYyAoZG9fZGVzX3NldGtleSk6IExpa2V3aXNlLgorCShkb190cmlwbGVkZXNfc2V0a2V5KTogTGlrZXdpc2UuCisKKzIwMDMtMDUtMjIgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiB0aWdlci5jOiBNZXJnZWQgY29kZSB1c3NpbmcgdGhlIFU2NF9DIG1hY3JvIGZyb20gR251UEcuCisKKwkqIHNoYTUxMi5jOiBMaWtld2lzZS4KKworMjAwMy0wNS0xNyAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIHB1YmtleS5jIChnY3J5X3BrX2dlbmtleSk6IEZpeCB0eXBlOiBhY3F1aXJlIGEgbG9jaywgaW5zdGVhZCBvZgorCXJlbGVhc2luZyBpdC4KKworMjAwMy0wNS0xMSAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIHB1YmtleS5jIChnY3J5X3BrX3Rlc3RrZXkpOiBDYWxsIFJFR0lTVEVSX0RFRkFVTFRfQ0lQSEVSUy4KKwkoZ2NyeV9wa19jdGwpOiBMaWtld2lzZS4KKworMjAwMy0wNC0yNyAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIHB1YmtleS5jIChnY3J5X3BrX2dlbmtleSk6IFJlbGVhc2Ugc2V4cCBhZnRlciBleHRyYWN0ZWQgZGF0YSBoYXMKKwliZWVuIHVzZWQuCisKKwkqIG1kLmMgKGdjcnlfbWRfZ2V0X2FsZ29fZGxlbik6IFNpbXBsaWZpZWQsIHNpbXBseSBjYWxsCisJbWRfZGlnZXN0X2xlbmd0aCB0byBkbyB0aGUgam9iLgorCisJKiBkZXMuYyAoZG9fZGVzX3NldGtleSk6IENoZWNrIGZvciBzZWxmdGVzdCBmYWlsdXJlIG5vdCBvbmx5CisJZHVyaW5nIGluaXRpYWxpemF0aW9uLgorCShkb190cmlwbGVkZXNfc2V0a2V5KTogSW5jbHVkZSBjaGVjayBmb3Igc2VsZnRlc3QgZmFpbHVyZS4KKworCSogcHVia2V5LmMgKGdjcnlfcHVia2V5X3JlZ2lzdGVyX2RlZmF1bHQpOiBOZXcgbWFjcm8KKwlgcHVia2V5X3VzZV9kdW1teScsIHVzZSBpdC4KKworCSogZWxnYW1hbC5jIChlbGdfbmFtZXMpOiBOZXcgdmFyaWFibGUuCisJKHB1YmtleV9zcGVjX2VsZyk6IEluY2x1ZGUgZWxnX25hbWVzLgorCisJKiBkc2EuYyAoZHNhX25hbWVzKTogTmV3IHZhcmlhYmxlLgorCShwdWJrZXlfc3BlY19kc2EpOiBJbmNsdWRlIGRzYV9uYW1lcy4KKworCSogcnNhLmMgKHJzYV9uYW1lcyk6IE5ldyB2YXJpYWJsZS4KKwkocHVia2V5X3NwZWNfcnNhKTogSW5jbHVkZSByc2FfbmFtZXMuCisKKwkqIHB1YmtleS5jIChnY3J5X3B1YmtleV9sb29rdXBfZnVuY19uYW1lKTogQ29tcGFyZSBuYW1lIGFsc28gd2l0aAorCXRoZSBuYW1lcyBsaXN0ZWQgaW4gYHNleHBfbmFtZXMnLgorCisyMDAzLTA0LTI0ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogcHVia2V5LmMgKHNleHBfdG9fa2V5KTogTmV3IHZhcmlhYmxlczogbW9kdWxlLCBwdWJrZXkuICBBZGp1c3RlZAorCXRvIG5ldyBtb2R1bGUgaW50ZXJmYWNlLgorCShzZXhwX3RvX2tleSk6IENoYW5nZW5kIHR5cGUgb2YgYXJndW1lbnQgYHJldGFsZ28nIGZyb20gYGludCAqJyB0bworCWBHY3J5TW9kdWxlICoqJy4gIEFkanVzdGVkIGFsbCBjYWxsZXJzLiAgUmVtb3ZlZCBhcmd1bWVudDoKKwlyX2FsZ290YmxpZHguCisJKHNleHBfdG9fc2lnKTogQ2hhbmdlbmQgdHlwZSBvZiBhcmd1bWVudCBgcmV0YWxnbycgZnJvbSBgaW50IConIHRvCisJYEdjcnlNb2R1bGUgKionLiAgQWRqdXN0ZWQgYWxsIGNhbGxlcnMuCisJKHNleHBfdG9fZW5jKTogTGlrZXdpc2UuCisKKwkocHVia2V5X2dldF9ucGtleSwgcHVia2V5X2dldF9uc2tleSwgcHVia2V5X2dldF9uc2lnLAorCXB1YmtleV9nZXRfbmVuYyk6IFVzZSBzdHJsZW4gdG8gZmluZCBvdXQgdGhlIG51bWJlci4KKworCSogcnNhLmM6IEFkanVzdCBwdWJrZXlfc3BlY19yc2EgdG8gbmV3IGludGVybmFsIGludGVyZmFjZS4KKwkqIGRzYS5jOiBMaWtld2lzZS4KKwkqIGVsZ2FtYWwuYzogTGlrZXdpc2UuCisKKzIwMDMtMDQtMTcgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBwdWJrZXkuYyAoc2V4cF9lbGVtZW50c19leHRyYWN0KTogTmV3IGZ1bmN0aW9uLgorCSogcHVia2V5LmMgKHNleHBfdG9fa2V5KTogUmVtb3ZlZCB2YXJpYWJsZSBgaWR4JywgYWRkZWQgYGVycicsIHVzZQorCXNleHBfZWxlbWVudHNfZXh0cmFjdC4KKwkoc2V4cF90b19zaWcpOiBMaWtld2lzZS4KKwkoc2V4cF90b19lbmMpOiBMaWtld2lzZS4KKworCSogcHVia2V5LmM6IFRlcm1pbmF0ZSBsaXN0IGNvcnJlY3RseS4KKwkqIG1kLmM6IEluY2x1ZGUgc2hhNTEyL3NoYTM4NCBpbiBkaWdlc3RfdGFibGUuCisKKzIwMDMtMDQtMTYgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBNYWtlZmlsZS5hbTogSW5jbHVkZSBzdXBwb3J0IGZvciBzaGE1MTIuYy4KKworCSogc2hhNTEyLmM6IE5ldyBmaWxlLCBtZXJnZWQgZnJvbSBHbnVQRywgd2l0aCBmZXcgbW9kaWZpY2F0aW9ucworCWZvciBsaWJnY3J5cHQuCisKKwkqIHJhbmQtaW50ZXJuYWwuaDogUmVtb3ZlZCBkZWNsYXJhdGlvbnMgZm9yIGNvbnN0cnVjdG9yIGZ1bmN0aW9ucy4KKworCSogbWQuYyAobWRfY29weSk6IENhbGwgX2djcnlfbW9kdWxlX3VzZSBmb3IgaW5jcmVtZW50aW5nIHRoZSB1c2FnZQorCWNvdW50ZXIgb2YgdGhlIGRpZ2VzdCBtb2R1bGVzLgorCisJKiByc2EuYzogRG8gbm90IGluY2x1ZGUgInJzYS5oIi4KKwkqIGRzYS5jOiBEbyBub3QgaW5jbHVkZSAiZHNhLmgiLgorCSogZWxnYW1hbC5jOiBEbyBub3QgaW5jbHVkZSAiZWxnYW1hbC5oIi4KKwkqIGRlcy5jOiBEbyBub3QgaW5jbHVkZSAiZGVzLmgiLgorCSogY2FzdDUuYzogRG8gbm90IGluY2x1ZGUgImNhc3Q1LmgiLgorCSogYmxvd2Zpc2guYzogRG8gbm90IGluY2x1ZGUgImJsb3dmaXNoLmgiLgorCSogYXJjZm91ci5jOiBEbyBub3QgaW5jbHVkZSAiYXJjZm91ci5oIi4KKworCSogTWFrZWZpbGUuYW0gKGxpYmNpcGhlcl9sYV9ERVBFTkRFTkNJRVMpOiBSZW1vdmVkLgorCShsaWJjaXBoZXJfbGFfTElCQUREKTogUmVtb3ZlZC4KKwlVc2UgQXV0b21ha2UgY29uZGl0aW9uYWxzIGZvciBjb25kaXRpb25hbCBjb21waWxhdGlvbi4KKworMjAwMy0wNC0xMyAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGNpcGhlci5jIChnY3J5X2NpcGhlcl9vcGVuKTogQ2FsbCBSRUdJU1RFUl9ERUZBVUxUX0NJUEhFUlMuCisKKwkqIG1kLmMgKGdjcnlfbWRfbGlzdCk6IE5ldyBtZW1iZXI6IG1vZHVsZS4KKwkobWRfZW5hYmxlKTogTmV3IHZhcmlhYmxlOiBtb2R1bGUsIGNoYW5nZWQgdXNlIG9mIG1vZHVsZSBhbmQKKwlkaWdlc3QuCisJKG1kX2VuYWJsZSk6IEluaXRpYWxpemUgbWVtYmVyOiBtb2R1bGUuCisJKG1kX2Nsb3NlKTogQ2FsbCBfZ2NyeV9tb2R1bGVfcmVsZWFzZS4KKworCSogY2lwaGVyLmMgKGdjcnlfY2lwaGVyX29wZW4pOiBOZXcgdmFyaWFibGU6IG1vZHVsZSwgY2hhbmdlZCB1c2Ugb2YKKwltb2R1bGUgYW5kIGNpcGhlci4KKwkoc3RydWN0IGdjcnlfY2lwaGVyX2hhbmRsZSk6IE5ldyBtZW1iZXI6IG1vZHVsZS4KKwkoZ2NyeV9jaXBoZXJfb3Blbik6IEluaXRpYWxpemUgbWVtYmVyOiBtb2R1bGUuCisJKGdjcnlfY2lwaGVyX2Nsb3NlKTogQ2FsbCBfZ2NyeV9tb2R1bGVfcmVsZWFzZS4KKworMjAwMy0wNC0wOSAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisJCisJKiBjaXBoZXIuYzogSW5jbHVkZSAiYXRoLmgiLgorCSogbWQuYzogTGlrZXdpc2UuCisJKiBwdWJrZXkuYzogTGlrZXdpc2UuCisKKwkqIGNpcGhlci5jIChjaXBoZXJzX3JlZ2lzdGVyZWRfbG9jayk6IE5ldyB2YXJpYWJsZS4KKwkqIG1kLmMgKGRpZ2VzdHNfcmVnaXN0ZXJlZF9sb2NrKTogTmV3IHZhcmlhYmxlLgorCSogcHVia2V5LmMgKHB1YmtleXNfcmVnaXN0ZXJlZF9sb2NrKTogTmV3IHZhcmlhYmxlLgorCisJKiBybmRsaW51eC5jIChnbnVwZ2V4dF92ZXJzaW9uLCBmdW5jX3RhYmxlKTogUmVtb3ZlZCBkZWZpbml0aW9ucy4KKwkoZ251cGdleHRfZW51bV9mdW5jKTogUmVtb3ZlZCBmdW5jdGlvbi4KKwkoX2djcnlfcm5kbGludXhfY29uc3RydWN0b3IpOiBSZW1vdmVkIGZ1bmN0aW9uLgorCisJKiBybmRlZ2QuYyAoZ251cGdleHRfdmVyc2lvbiwgZnVuY190YWJsZSk6IFJlbW92ZWQgZGVmaW5pdGlvbnMuCisJKGdudXBnZXh0X2VudW1fZnVuYyk6IFJlbW92ZWQgZnVuY3Rpb24uCisJKF9nY3J5X3JuZGVnZF9jb25zdHJ1Y3Rvcik6IFJlbW92ZWQgZnVuY3Rpb24uCisKKwkqIHJuZHVuaXguYyAoZ251cGdleHRfdmVyc2lvbiwgZnVuY190YWJsZSk6IFJlbW92ZWQgZGVmaW5pdGlvbnMuCisJKGdudXBnZXh0X2VudW1fZnVuYyk6IFJlbW92ZWQgZnVuY3Rpb24uCisJKF9nY3J5X3JuZHVuaXhfY29uc3RydWN0b3IpOiBSZW1vdmVkIGZ1bmN0aW9uLgorCisJKiBybmR3MzIuYyAoZ251cGdleHRfdmVyc2lvbiwgZnVuY190YWJsZSk6IFJlbW92ZWQgZGVmaW5pdGlvbnMuCisJKGdudXBnZXh0X2VudW1fZnVuYyk6IFJlbW92ZWQgZnVuY3Rpb24uCisJKF9nY3J5X3JuZHczMl9jb25zdHJ1Y3Rvcik6IFJlbW92ZWQgZnVuY3Rpb24uCisKKwkqIHJuZGVnZC5jIChybmRlZ2RfY29ubmVjdF9zb2NrZXQpOiBTaW1wbGlmeSBjb2RlIGZvciBjcmVhdGluZyB0aGUKKwllZ2Qgc29ja2V0IGFkZHJlc3MuCisJKHJuZGVnZF9jb25uZWN0X3NvY2tldCk6IENhbGwgbG9nX2ZhdGFsIHVzZSBpbnN0ZWFkIG9mCisJZzEwX2xvZ19mYXRhbC4KKwkoZWdkX2dhdGhlcl9yYW5kb20pOiBSZW5hbWVkIHRvIC4uLgorCShybmRlZ2RfZ2F0aGVyX3JhbmRvbSk6IC4uLiBoZXJlLgorCisyMDAzLTA0LTA4ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogcm5kbGludXguYzogRG8gbm90IGluY2x1ZGUgImR5bmxvYWQuaCIuCisJKiBybmR1bml4LmM6IExpa2V3aXNlLgorCSogcm5kdzMyLmM6IExpa2V3aXNlLgorCisJKiBybmRlZ2QuYyAocm5kZWdkX2Nvbm5lY3Rfc29ja2V0KTogRmFjdG9yZWQgb3V0IGZyb20gLi4uCisJKGVnZF9nYXRoZXJfcmFuZG9tKTogaGVyZTsgY2FsbCBpdC4KKwkoZWdkX3NvY2tldCk6IE5ldyB2YXJpYWJsZS4KKwkoZWdkX2dhdGhlcl9yYW5kb20pOiBJbml0aWFsaXplIGZkIHdpdGggZWdkX3NvY2tldCwgZG8gbm90IGRlY2xhcmUKKwlmZCBzdGF0aWMuCisJKGRvX3JlYWQpOiBNZXJnZWQgZmV3IGNoYW5nZXMgZnJvbSBHbnVQRy4gRklYTUUgLSBub3QgZmluaXNoZWQ/CisJRG8gbm90IGluY2x1ZGUgImR5bmxvYWQuaCIuCisKKwkqIHJuZHczMi5jIChnYXRoZXJfcmFuZG9tKTogUmVuYW1lZCB0byBybmR3MzJfZ2F0aGVyX3JhbmRvbSwgZG8KKwlub3QgZGVjbGFyZSBzdGF0aWMuCisJKGdhdGhlcl9yYW5kb21fZmFzdCk6IFJlbmFtZWQgdG8gcm5kdzMyX2dhdGhlcl9yYW5kb21fZmFzdCwgZG8gbm90CisJZGVjbGFyZSBzdGF0aWMuCisKKwkqIHJuZHVuaXguYyAoZ2F0aGVyX3JhbmRvbSk6IFJlbmFtZWQgdG8gcm5kdW5peF9nYXRoZXJfcmFuZG9tLCBkbworCW5vdCBkZWNsYXJlIHN0YXRpYy4KKwkqIHJuZGVnZC5jIChnYXRoZXJfcmFuZG9tKTogUmVuYW1lZCB0byBybmRlZ2RfZ2F0aGVyX3JhbmRvbSwgZG8KKwlub3QgZGVjbGFyZSBzdGF0aWMuCisJKiBybmRsaW51eC5jIChnYXRoZXJfcmFuZG9tKTogUmVuYW1lZCB0byBybmRsaW51eF9nYXRoZXJfcmFuZG9tLAorCWRvIG5vdCBkZWNsYXJlIHN0YXRpYy4KKworMjAwMy0wNC0wNyAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChsaWJjaXBoZXJfbGFfU09VUkNFUyk6IFJlbW92ZWQgY29uc3RydWN0LmMuCisJKGxpYmNpcGhlcl9sYV9TT1VSQ0VTKTogQWRkZWQgc2hhMS5jLCBzaGEyNTYuYywgcm1kMTYwLmMsIG1kNC5jLAorCW1kNS5jLCB0aWdlci5jIGFuZCBjcmMuYworCShFWFRSQV9QUk9HUkFNUyk6IFJlbW92ZWQgc2hhMSwgc2hhMjU2LCBybWQxNjAsIG1kNCwgbWQ1LCB0aWdlcgorCWFuZCBjcmMuICBSZW1vdmVkIGRlZmluaXRpb25zOiBFWFRSQV9tZDRfU09VUkNFUywKKwlFWFRSQV9tZDVfU09VUkNFUywgRVhUUkFfcm1kMTYwX1NPVVJDRVMsIEVYVFJBX3NoYTFfU09VUkNFUywKKwlFWFRSQV9zaGEyNTZfU09VUkNFUywgRVhUUkFfdGlnZXJfU09VUkNFUyBhbmQgRVhUUkFfY3JjX1NPVVJDRVMsCisJQlVJTFRfU09VUkNFUywgRElTVENMRUFORklMRVMuCisKKwkqIHB1YmtleS5jOiBEbyBub3QgaW5jbHVkZSAiZWxnYW1hbC5oIiwgImRzYS5oIiBhbmQgInJzYS5oIi4KKworCSogTWFrZWZpbGUuYW0gKGxpYmNpcGhlcl9sYV9TT1VSQ0VTKTogUmVtb3ZlZCByc2EuaCwgZWxnYW1hbC5oLAorCWRzYS5oLCBkZXMuaCwgY2FzdDUuaCwgYXJjZm91ci5oIGFuZCBibG93ZmlzaC5oLgorCisJKiByc2EuaDogUmVtb3ZlZCBmaWxlLgorCSogZWxnYW1hbC5oOiBSZW1vdmVkIGZpbGUuCisJKiBkc2EuaDogUmVtb3ZlZCBmaWxlLgorCSogZGVzLmg6IFJlbW92ZWQgZmlsZS4KKwkqIGNhc3Q1Lmg6IFJlbW92ZWQgZmlsZS4KKwkqIGFyY2ZvdXIuaDogUmVtb3ZlZCBmaWxlLgorCSogYmxvd2Zpc2guaDogUmVtb3ZlZCBmaWxlLgorCisJKiBNYWtlZmlsZS5hbSAobGliY2lwaGVyX2xhX1NPVVJDRVMpOiBSZW1vdmVkIGR5bmxvYWQuYyBhbmQKKwlkeW5sb2FkLmguCisKKwkqIHJzYS5jIChwdWJrZXlfc3BlY19yc2EpOiBOZXcgdmFyaWFibGUuCisJKiBkc2EuYyAocHVia2V5X3NwZWNfcnNhKTogTmV3IHZhcmlhYmxlLgorCSogZWxnYW1hbC5jIChwdWJrZXlfc3BlY19lbGcpOiBOZXcgdmFyaWFibGUuCisJCisJKiByc2EuYyAoX2djcnlfcnNhX2dldF9pbmZvKTogUmVtb3ZlZCBmdW5jdGlvbi4KKwkqIGVsZ2FtYWwuYyAoX2djcnlfZWxnX2dldF9pbmZvKTogUmVtb3ZlZCBmdW5jdGlvbi4KKwkqIGRzYS5jIChfZ2NyeV9kc2FfZ2V0X2luZm8pOiBSZW1vdmVkIGZ1bmN0aW9uLgorCisJKiB0aWdlci5jICh0aWdlcl9nZXRfaW5mbyk6IFJlbW92ZWQgZnVuY3Rpb24uCisJKGdudXBnZXh0X3ZlcnNpb24sIGZ1bmNfdGFibGUpOiBSZW1vdmVkIGRlZmluaXRpb25zLgorCShnbnVwZ2V4dF9lbnVtX2Z1bmMpOiBSZW1vdmVkIGZ1bmN0aW9uLgorCShfZ2NyeV90aWdlcl9jb25zdHJ1Y3Rvcik6IFJlbW92ZWQgZnVuY3Rpb24uCisJCisJKiBzaGExLmMgKHNoYTFfZ2V0X2luZm8pOiBSZW1vdmVkIGZ1bmN0aW9uLgorCShnbnVwZ2V4dF92ZXJzaW9uLCBmdW5jX3RhYmxlKTogUmVtb3ZlZCBkZWZpbml0aW9ucy4KKwkoZ251cGdleHRfZW51bV9mdW5jKTogUmVtb3ZlZCBmdW5jdGlvbi4KKwkoX2djcnlfc2hhMV9jb25zdHJ1Y3Rvcik6IFJlbW92ZWQgZnVuY3Rpb24uCisKKwkqIHNoYTI1Ni5jIChzaGEyNTZfZ2V0X2luZm8pOiBSZW1vdmVkIGZ1bmN0aW9uLgorCShnbnVwZ2V4dF92ZXJzaW9uLCBmdW5jX3RhYmxlKTogUmVtb3ZlZCBkZWZpbml0aW9ucy4KKwkoZ251cGdleHRfZW51bV9mdW5jKTogUmVtb3ZlZCBmdW5jdGlvbi4KKwkoX2djcnlfc2hhMjU2X2NvbnN0cnVjdG9yKTogUmVtb3ZlZCBmdW5jdGlvbi4KKworCSogcm1kMTYwLmMgKHJtZDE2MF9nZXRfaW5mbyk6IFJlbW92ZWQgZnVuY3Rpb24uCisJKGdudXBnZXh0X3ZlcnNpb24sIGZ1bmNfdGFibGUpOiBSZW1vdmVkIGRlZmluaXRpb25zLgorCShnbnVwZ2V4dF9lbnVtX2Z1bmMpOiBSZW1vdmVkIGZ1bmN0aW9uLgorCShfZ2NyeV9ybWQxNjBfY29uc3RydWN0b3IpOiBSZW1vdmVkIGZ1bmN0aW9uLgorCisJKiBtZDUuYyAobWQ1X2dldF9pbmZvKTogUmVtb3ZlZCBmdW5jdGlvbi4KKwkoZ251cGdleHRfdmVyc2lvbiwgZnVuY190YWJsZSk6IFJlbW92ZWQgZGVmaW5pdGlvbnMuCisJKGdudXBnZXh0X2VudW1fZnVuYyk6IFJlbW92ZWQgZnVuY3Rpb24uCisJKF9nY3J5X21kNV9jb25zdHJ1Y3Rvcik6IFJlbW92ZWQgZnVuY3Rpb24uCisKKwkqIG1kNC5jIChtZDRfZ2V0X2luZm8pOiBSZW1vdmVkIGZ1bmN0aW9uLgorCShnbnVwZ2V4dF92ZXJzaW9uLCBmdW5jX3RhYmxlKTogUmVtb3ZlZCBkZWZpbml0aW9ucy4KKwkoZ251cGdleHRfZW51bV9mdW5jKTogUmVtb3ZlZCBmdW5jdGlvbi4KKwkoX2djcnlfbWQ0X2NvbnN0cnVjdG9yKTogUmVtb3ZlZCBmdW5jdGlvbi4KKworCSogY3JjLmMgKGNyY19nZXRfaW5mbyk6IFJlbW92ZWQgZnVuY3Rpb24uCisKKwkqIGFyY2ZvdXIuYyAoZG9fYXJjZm91cl9zZXRrZXkpOiBDaGFuZ2VkIHR5cGUgb2YgY29udGV4dCBhcmd1bWVudAorCXRvIGB2b2lkIConLCBhZGRlZCBsb2NhbCB2YXJpYWJsZSBmb3IgY2FzdCwgYWRqdXN0ZWQgY2FsbGVycy4KKwkoYXJjZm91cl9zZXRrZXkpOiBMaWtld2lzZS4KKwkoZW5jcnlwdF9zdHJlYW0pOiBMaWtld2lzZS4KKwkqIGNhc3Q1LmMgKGNhc3Rfc2V0a2V5KTogTGlrZXdpc2UuCisJKGVuY3J5cHRfYmxvY2spOiBMaWtld2lzZS4KKwkqIHJpam5kYWVsLmMgKHJpam5kYWVsX3NldGtleSk6IExpa2V3aXNlLgorCShyaWpuZGFlbF9lbmNyeXB0KTogTGlrZXdpc2UuCisJKHJpam5kYWVsX2RlY3J5cHQpOiBMaWtld2lzZS4KKwkqIHR3b2Zpc2guYyAodHdvZmlzaF9zZXRrZXkpOiBMaWtld2lzZS4KKwkodHdvZmlzaF9lbmNyeXB0KTogTGlrZXdpc2UuCisJKHR3b2Zpc2hfZGVjcnlwdCk6IExpa2V3aXNlLgorCSogZGVzLmMgKGRvX2Rlc19zZXRrZXkpOiBMaWtld2lzZS4KKwkoZG9fZGVzX2VuY3J5cHQpOiBMaWtld2lzZS4KKwkoZG9fZGVzX2VuY3J5cHQpOiBMaWtld2lzZS4KKwkoZG9fdHJpcGxlZGVzX2VuY3J5cHQpOiBMaWtld2lzZS4KKwkoZG9fdHJpcGxlZGVzX2VuY3J5cHQpOiBMaWtld2lzZS4KKwkqIGJsb3dmaXNoLmMgKGJmX3NldGtleTogTGlrZXdpc2UuCisJKGVuY3J5cHRfYmxvY2spOiBMaWtld2lzZS4KKwkoZGVjcnlwdF9ibG9jayk6IExpa2V3aXNlLgorCQorCSogYXJjZm91ci5jIChlbmNyeXB0X3N0cmVhbSk6IExpa2V3aXNlLgorCisJKiByaWpuZGFlbC5jIChnbnVwZ2V4dF92ZXJzaW9uLCBmdW5jX3RhYmxlKTogUmVtb3ZlZCBkZWZpbml0aW9ucy4KKwkoZ251cGdleHRfZW51bV9mdW5jKSBSZW1vdmVkIGZ1bmN0aW9uLgkKKwkKKwkqIHR3b2Zpc2guYyAoZ251cGdleHRfdmVyc2lvbiwgZnVuY190YWJsZSk6IFJlbW92ZWQgZGVmaW5pdGlvbnMuCisJKGdudXBnZXh0X2VudW1fZnVuYykgUmVtb3ZlZCBmdW5jdGlvbi4JCisKKwkqIGNhc3Q1LmMgKENJUEhFUl9BTEdPX0NBU1Q1KTogUmVtb3ZlZC4KKworCSogYmxvd2Zpc2guYyAoRk5DQ0FTVF9TRVRLRVksIEZOQ0NBU1RfQ1JZUFQpOiBSZW1vdmVkIG1hY3Jvcy4KKwkoQ0lQSEVSX0FMR09fQkxPV0ZJU0gpOiBSZW1vdmVkIHN5bWJvbC4KKwkqIGNhc3Q1LmMgKEZOQ0NBU1RfU0VUS0VZLCBGTkNDQVNUX0NSWVBUKTogTGlrZXdpc2UuCisJKiBkZXMuYyAoc2VsZnRlc3RfZmFpbGVkKTogUmVtb3ZlZC4KKwkoaW5pdGlhbGl6ZWQpOiBOZXcgdmFyaWFibGUuCisJKGRvX2Rlc19zZXRrZXkpOiBSdW4gc2VsZnRlc3QsIGlmIG5vdCB5ZXQgZG9uZS4KKwkoRk5DQ0FTVF9TRVRLRVksIEZOQ0NBU1RfQ1JZUFQpOiBSZW1vdmVkIG1hY3Jvcy4KKworCSogYXJjZm91ci5jIChfZ2NyeV9hcmNmb3VyX2dldF9pbmZvKTogUmVtb3ZlZCBmdW5jdGlvbi4KKwkqIGJsb3dmaXNoLmMgKF9nY3J5X2Jsb3dmaXNoX2dldF9pbmZvKTogUmVtb3ZlZCBmdW5jdGlvbi4KKwkqIGNhc3Q1LmMgKF9nY3J5X2Nhc3Q1X2dldF9pbmZvKTogUmVtb3ZlZCBmdW5jdGlvbi4KKwkqIGRlcy5jIChfZ2NyeV9kZXNfZ2V0X2luZm8pOiBSZW1vdmVkIGZ1bmN0aW9uLgorCSogcmlqbmRhZWwuYyAoX2djcnlfcmlqbmRhZWxfZ2V0X2luZm8pOiBSZW1vdmVkIGZ1bmN0aW9uLgorCSogdHdvZmlzaC5jIChfZ2NyeV90d29maXNoX2dldF9pbmZvKTogUmVtb3ZlZCBmdW5jdGlvbi4KKworCSogYXJjZm91ci5jIChjaXBoZXJfc3BlY19hcmNmb3VyKTogTmV3IHZhcmlhYmxlLgorCSogdHdvZmlzaC5jIChjaXBoZXJfc3BlY190d29maXNoLCBjaXBoZXJfc3BlY190d29maXNoMTI4KTogTmV3CisJdmFyaWFibGVzLgorCSogcmlqbmRhZWwuYyAoY2lwaGVyX3NwZWNfYWVzLCBjaXBoZXJfc3BlY19hZXMxOTIsCisJY2lwaGVyX3NwZWMyNTYpOiBOZXcgdmFyaWFibGVzLgorCSogZGVzLmMgKGNpcGhlcl9zcGVjX2RlcywgY2lwaGVyX3NwZWNfdHJpcGxlZGVzKTogTmV3IHZhcmlhYmxlcy4KKwkqIGNhc3Q1LmMgKGNpcGhlcl9zcGVjX2Nhc3Q1KTogTmV3IHZhcmlhYmxlLgorCSogYmxvd2Zpc2guYyAoY2lwaGVyX3NwZWNfYmxvd2Zpc2gpOiBMaWtld2lzZS4KKwkKKwkqIHR3b2Zpc2guYzogRG8gbm90IGluY2x1ZGUgImR5bmxvYWQuaCIuCisJKiByaWpuZGFlbC5jOiBMaWtld2lzZS4KKwkqIGRlcy5jOiBMaWtld2lzZS4KKwkqIGNhc3Q1LmM6IExpa2V3aXNlLgorCSogYmxvd2Zpc2guYzogTGlrZXdpc2UuCisJKiBjaXBoZXIuYzogTGlrZXdpc2UuCisJKiBjcmMuYzogTGlrZXdpc2UuCisJKiBtZDQuYzogTGlrZXdpc2UuCisJKiBtZDUuYzogTGlrZXdpc2UuCisJKiBtZC5jOiBMaWtld2lzZS4KKwkqIHB1YmtleS5jOiBMaWtld2lzZS4KKwkqIHJpam5kYWVsLmM6IExpa2V3aXNlLgorCSogc2hhMS5jOiBMaWtld2lzZS4KKwkqIHNoYTI1Ni5jOiBMaWtld2lzZS4KKworCSogYXJjZm91ci5jOiBJbmNsdWRlICJjaXBoZXIuaCIuCisJKiB0d29maXNoLmM6IExpa2V3aXNlLgorCSogcmlqbmRhZWwuYzogTGlrZXdpc2UuCisJKiBkZXMuYzogTGlrZXdpc2UuCisJKiBjYXN0NS5jOiBMaWtld2lzZS4KKwkqIGJsb3dmaXNoLmM6IExpa2V3aXNlLgorCisJKiB0d29maXNoLmMgKHR3b2Zpc2hfc2V0a2V5KTogRGVjbGFyZWQgYXJndW1lbnQgYGtleScgY29uc3QuCisJKHR3b2Zpc2hfZW5jcnlwdCk6IERlY2xhcmVkIGFyZ3VtZW50IGBpbmJ1ZicgY29uc3QuCisJKHR3b2Zpc2hfZGVjcnlwdCk6IExpa2V3aXNlLgorCisJKiByaWpuZGFlbC5jIChyaWpuZGFlbF9zZXRrZXkpOiBEZWNsYXJlZCBhcmd1bWVudCBga2V5JyBjb25zdC4KKwkocmlqbmRhZWxfZW5jcnlwdCk6IERlY2xhcmVkIGFyZ3VtZW50IGBpbmJ1ZicgY29uc3QuCisJKHJpam5kYWVsX2RlY3J5cHQpOiBMaWtld2lzZS4KKworCSogZGVzLmMgKGRvX2Rlc19zZXRrZXkpOiBEZWNsYXJlZCBhcmd1bWVudCBga2V5JyBjb25zdC4KKwkoZG9fdHJpcGxlZGVzX3NldGtleSk6IExpa2V3aXNlLgorCShkb19kZXNfZW5jcnlwdCk6IERlY2xhcmVkIGFyZ3VtZW50IGBpbmJ1ZicgY29uc3QuCisJKGRvX2Rlc19kZWNyeXB0KTogTGlrZXdpc2UuCisJKGRvX3RyaXBsZWRlc19lbmNyeXB0KTogTGlrZXdpc2UuCisJKGRvX3RyaXBsZWRlc19kZWNyeXB0KTogTGlrZXdpc2UuCisKKwkqIGNhc3Q1LmMgKGVuY3J5cHRfYmxvY2spOiBEZWNsYXJlZCBhcmd1bWVudCBgaW5idWYnIGNvbnN0LgorCShkZWNyeXB0X2Jsb2NrKTogTGlrZXdpc2UuCisJKGNhc3Rfc2V0a2V5KTogRGVjbGFyZWQgYXJndW1lbnQgYGtleScgY29uc3QuCisKKwkqIGJsb3dmaXNoLmMgKGRvX2JmX3NldGtleSk6IERlY2xhcmVkIGFyZ3VtZW50IGBrZXknIGNvbnN0LgorCShlbmNyeXB0X2Jsb2NrKTogRGVjbGFyZWQgYXJndW1lbnQgYGluYnVmJyBjb25zdC4KKwkoZW5jcnlwdF9ibG9jayk6IExpa2V3aXNlLgorCisJCisKKwkqIGNpcGhlci5jOiBSZW1vdmUgQ0lQSEVSX0FMR09fRFVNTVkgcmVsYXRlZCBjb2RlLgorCVJlbW92ZWQgc3RydWN0IGNpcGhlcl90YWJsZV9zLgorCUNoYW5nZWQgZGVmaW5pdGlvbiBvZiBjaXBoZXJfdGFibGUuCisJUmVtb3ZlZCBkZWZpbml0aW9uIG9mIGRpc2FibGVkX2FsZ29zLgorCShjaXBoZXJzX3JlZ2lzdGVyZWQsIGRlZmF1bHRfY2lwaGVyc19yZWdpc3RlcmVkKTogTmV3IHZhcmlhYmxlcy4KKwkoUkVHSVNURVJfREVGQVVMVF9DSVBIRVJTKTogTmV3IG1hY3JvLgorCShkdW1teV9zZXRrZXkpOiBEZWNsYXJlZCBhcmd1bWVudCBga2V5JyBjb25zdC4KKwkoZHVtbXlfZW5jcnlwdF9ibG9jayk6IERlY2xhcmVkIGFyZ3VtZW50IGBpbmJ1ZicgY29uc3QuCisJKGR1bW15X2VuY3J5cHRfYmxvY2spOiBMaWtld2lzZS4KKwkoZHVtbXlfZW5jcnlwdF9zdHJlYW0pOiBMaWtld2lzZS4KKwkoZHVtbXlfZW5jcnlwdF9zdHJlYW0pOiBMaWtld2lzZS4KKwkoZHVtbXlfc2V0a2V5KTogVXNlIGB1bnNpZ25lZCBjaGFyJyBpbnN0ZWFkIG9mIGBieXRlJy4KKwkoZHVtbXlfZW5jcnlwdF9ibG9jayk6IExpa2V3aXNlLgorCShkdW1teV9kZWNyeXB0X2Jsb2NrKTogTGlrZXdpc2UuCisJKGR1bW15X2VuY3J5cHRfc3RyZWFtKTogTGlrZXdpc2UuCisJKGR1bW15X2RlY3J5cHRfc3RyZWFtKTogTGlrZXdpc2UuCisJKGdjcnlfY2lwaGVyX3JlZ2lzdGVyX2RlZmF1bHQpOiBOZXcgZnVuY3Rpb24uCisJKGdjcnlfY2lwaGVyX2xvb2t1cF9mdW5jX2lkKTogTmV3IGZ1bmN0aW9uLgorCShnY3J5X2NpcGhlcl9sb29rdXBfZnVuY19uYW1lKTogTmV3IGZ1bmN0aW9uLgorCShnY3J5X2NpcGhlcl9sb29rdXBfaWQpOiBOZXcgZnVuY3Rpb24uCisJKGdjcnlfY2lwaGVyX2xvb2t1cF9uYW1lKTogTmV3IGZ1bmN0aW9uLgorCShnY3J5X2NpcGhlcl9pZF9uZXcpOiBOZXcgZnVuY3Rpb24uCisJKGdjcnlfY2lwaGVyX3JlZ2lzdGVyKTogTmV3IGZ1bmN0aW9uLgorCShnY3J5X2NpcGhlcl91bnJlZ2lzdGVyKTogTmV3IGZ1bmN0aW9uLgorCShzZXR1cF9jaXBoZXJfdGFibGUpOiBSZW1vdmVkIGZ1bmN0aW9uLgorCShsb2FkX2NpcGhlcl9tb2R1bGVzKTogUmVtb3ZlZCBmdW5jdGlvbi4KKwkoZ2NyeV9jaXBoZXJfbWFwX25hbWUpOiBBZGp1c3RlZCB0byB1c2UgbmV3IG1vZHVsZSBtYW5hZ2VtZW50LgorCShjaXBoZXJfYWxnb190b19zdHJpbmcpOiBMaWtld2lzZS4KKwkoZGlzYWJsZV9jaXBoZXJfYWxnbyk6IExpa2V3aXNlLgorCShjaGVja19jaXBoZXJfYWxnbyk6IExpa2V3aXNlLgorCShjaXBoZXJfZ2V0X2tleWxlbik6IExpa2V3aXNlLgorCShjaXBoZXJfZ2V0X2Jsb2Nrc2l6ZSk6IExpa2V3aXNlLgorCShnY3J5X2NpcGhlcl9vcGVuKTogTGlrZXdpc2UuCisJKHN0cnVjdCBnY3J5X2NpcGhlcl9oYW5kbGUpOiBSZXBsYWNlZCBtZW1iZXJzIGFsZ28sIGFsZ29faW5kZXgsCisJYmxvY2tzaXplLCBzZXRrZXksIGVuY3J5cHQsIGRlY3J5cHQsIHN0ZW5jcnlwdCwgc3RkZWNyeXB0IHdpdGggb25lCisJbWVtYmVyOiBjaXBoZXIuCisJKGdjcnlfY2lwaGVyX29wZW4pOiBBZGp1c3RlZCBjb2RlIGZvciBuZXcgaGFuZGxlIHN0cnVjdHVyZS4KKwkoY2lwaGVyX3NldGtleSk6IExpa2V3aXNlLgorCShjaXBoZXJfc2V0aXYpOiBMaWtld2lzZS4KKwkoY2lwaGVyX3Jlc2V0KTogTGlrZXdpc2UuCisJKGRvX2VjYl9lbmNyeXB0KTogTGlrZXdpc2UuCisJKGRvX2VjYl9kZWNyeXB0KTogTGlrZXdpc2UuCisJKGRvX2NiY19lbmNyeXB0KTogTGlrZXdpc2UuCisJKGRvX2NiY19kZWNyeXB0KTogTGlrZXdpc2UuCisJKGRvX2NmYl9lbmNyeXB0KTogTGlrZXdpc2UuCisJKGRvX2NmYl9kZWNyeXB0KTogTGlrZXdpc2UuCisJKGRvX2N0cl9lbmNyeXB0KTogTGlrZXdpc2UuCisJKGNpcGhlcl9lbmNyeXB0KTogTGlrZXdpc2UuCisJKGdjcnlfY2lwaGVyX2VuY3J5cHQpOiBMaWtld2lzZS4KKwkoY2lwaGVyX2RlY3J5cHQpOiBMaWtld2lzZS4KKwkoZ2NyeV9jaXBoZXJfZGVjcnlwdCk6IExpa2V3aXNlLgorCShjaXBoZXJfc3luYyk6IExpa2V3aXNlLgorCShnY3J5X2NpcGhlcl9jdGwpOiBMaWtld2lzZS4KKworCSogcHVia2V5LmM6IFJlbW92ZWQgc3RydWN0IHB1YmtleV90YWJsZV9zLgorCUNoYW5nZWQgZGVmaW5pdGlvbiBvZiBwdWJrZXlfdGFibGUuCisJUmVtb3ZlZCBkZWZpbml0aW9uIG9mIGRpc2FibGVkX2FsZ29zLgorCShwdWJrZXlzX3JlZ2lzdGVyZWQsIGRlZmF1bHRfcHVia2V5c19yZWdpc3RlcmVkKTogTmV3IHZhcmlhYmxlcy4KKwkoUkVHSVNURVJfREVGQVVMVF9QVUJLRVlTKTogTmV3IG1hY3JvLgorCShzZXR1cF9wdWJrZXlfdGFibGUpOiBSZW1vdmVkIGZ1bmN0aW9uLgorCShsb2FkX3B1YmtleV9tb2R1bGVzKTogUmVtb3ZlZCBmdW5jdGlvbi4KKwkoZ2NyeV9wdWJrZXlfcmVnaXN0ZXJfZGVmYXVsdCk6IE5ldyBmdW5jdGlvbi4KKwkoZ2NyeV9wdWJrZXlfbG9va3VwX2Z1bmNfaWQpOiBOZXcgZnVuY3Rpb24uCisJKGdjcnlfcHVia2V5X2xvb2t1cF9mdW5jX25hbWUpOiBOZXcgZnVuY3Rpb24uCisJKGdjcnlfcHVia2V5X2xvb2t1cF9pZCk6IE5ldyBmdW5jdGlvbi4KKwkoZ2NyeV9wdWJrZXlfbG9va3VwX25hbWUpOiBOZXcgZnVuY3Rpb24uCisJKGdjcnlfcHVia2V5X2lkX25ldyk6IE5ldyBmdW5jdGlvbi4KKwkoZ2NyeV9wdWJrZXlfcmVnaXN0ZXIpOiBOZXcgZnVuY3Rpb24uCisJKGdjcnlfcHVia2V5X3VucmVnaXN0ZXIpOiBOZXcgZnVuY3Rpb24uCisJKGdjcnlfcGtfbWFwX25hbWUpOiBBZGp1c3RlZCB0byB1c2UgbmV3IG1vZHVsZSBtYW5hZ2VtZW50LgorCShnY3J5X3BrX2FsZ29fbmFtZSk6IExpa2V3aXNlLgorCShkaXNhYmxlX3B1YmtleV9hbGdvKTogTGlrZXdpc2UuCisJKGNoZWNrX3B1YmtleV9hbGdvKTogTGlrZXdpc2UuCisJKHB1YmtleV9nZXRfbnBrZXkpOiBMaWtld2lzZS4KKwkocHVia2V5X2dldF9uc2tleSk6IExpa2V3aXNlLgorCShwdWJrZXlfZ2V0X25zaWcpOiBMaWtld2lzZS4KKwkocHVia2V5X2dldF9uZW5jKTogTGlrZXdpc2UuCisJKHB1YmtleV9nZW5lcmF0ZSk6IExpa2V3aXNlLgorCShwdWJrZXlfY2hlY2tfc2VjcmV0X2tleSk6IExpa2V3aXNlLgorCShwdWJrZXlfZW5jcnlwdCk6IExpa2V3aXNlLgorCShwdWJrZXlfZGVjcnlwdCk6IExpa2V3aXNlLgorCShwdWJrZXlfc2lnbik6IExpa2V3aXNlLgorCShwdWJrZXlfdmVyaWZ5KTogTGlrZXdpc2UuCisJKGdjcnlfcGtfZ2V0X25iaXRzKTogTGlrZXdpc2UuCisJKGdjcnlfcGtfYWxnb19pbmZvKTogTGlrZXdpc2UuCisKKwkqIG1kLmM6IFJlbW92ZWQgc3RydWN0IG1kX2RpZ2VzdF9saXN0X3MuCisJKGRpZ2VzdF9saXN0KTogQ2hhbmdlZCBkZWZpbml0aW9uLgorCShkaWdlc3RzX3JlZ2lzdGVyZWQsIGRlZmF1bHRfZGlnZXN0c19yZWdpc3RlcmVkKTogTmV3IHZhcmlhYmxlcy4KKwkoUkVHSVNURVJfREVGQVVMVF9ESUdFU1RTKTogTmV3IG1hY3JvLgorCShuZXdfbGlzdF9pdGVtKTogUmVtb3ZlZCBmdW5jdGlvbi4KKwkoc2V0dXBfbWRfdGFibGUpOiBSZW1vdmVkIGZ1bmN0aW9uLgorCShsb2FkX2RpZ2VzdF9tb2R1bGUpOiBSZW1vdmVkIGZ1bmN0aW9uLgorCShnY3J5X2RpZ2VzdF9yZWdpc3Rlcl9kZWZhdWx0KTogTmV3IGZ1bmN0aW9uLgorCShnY3J5X2RpZ2VzdF9sb29rdXBfZnVuY19pZCk6IE5ldyBmdW5jdGlvbi4KKwkoZ2NyeV9kaWdlc3RfbG9va3VwX2Z1bmNfbmFtZSk6IE5ldyBmdW5jdGlvbi4KKwkoZ2NyeV9kaWdlc3RfbG9va3VwX2lkKTogTmV3IGZ1bmN0aW9uLgorCShnY3J5X2RpZ2VzdF9sb29rdXBfbmFtZSk6IE5ldyBmdW5jdGlvbi4KKwkoZ2NyeV9kaWdlc3RfaWRfbmV3KTogTmV3IGZ1bmN0aW9uLgorCShnY3J5X2RpZ2VzdF9yZWdpc3Rlcik6IE5ldyBmdW5jdGlvbi4KKwkoZ2NyeV9kaWdlc3RfdW5yZWdpc3Rlcik6IE5ldyBmdW5jdGlvbi4KKwkoR2NyeURpZ2VzdEVudHJ5KTogTmV3IHR5cGUuCisJKHN0cnVjdCBnY3J5X21kX2NvbnRleHQpOiBBZGp1c3RlZCB0eXBlIG9mIGBsaXN0Jy4KKwkoZ2NyeV9tZF9tYXBfbmFtZSk6IEFkanVzdGVkIHRvIHVzZSBuZXcgbW9kdWxlIG1hbmFnZW1lbnQuCisJKGRpZ2VzdF9hbGdvX3RvX3N0cmluZyk6IExpa2V3aXNlLgorCShjaGVja19kaWdlc3RfYWxnbyk6IExpa2V3aXNlLgorCShtZF9lbmFibGUpOiBMaWtld2lzZS4KKwkobWRfZGlnZXN0X2xlbmd0aCk6IExpa2V3aXNlLgorCShtZF9hc25fb2lkKTogTGlrZXdpc2UuCisKKzIwMDMtMDQtMDcgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBwdWJrZXkuYzogUmVwbGFjZWQgUFVCS0VZX0FMR09fRFNBIHdpdGggR0NSWV9QS19EU0EsCisJUFVCS0VZX0FMR09fUlNBIHdpdGggR0NSWV9QS19SU0EgYW5kIFBVQktFWV9BTEdPX0VMR0FNQUwgd2l0aAorCUdDUllfUEtfRUxHLgorCisJKiBkc2EuYzogUmVwbGFjZWQgUFVCS0VZX0FMR09fRFNBIHdpdGggR0NSWV9QS19EU0EuCisKKzIwMDMtMDQtMDEgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBkZXMuYzogUmVtb3ZlZCBjaGVja3MgZm9yIEdDUllfQ0lQSEVSXzNERVMgYW5kIEdDUllfQ0lQSEVSX0RFUy4KKworMjAwMy0wMy0zMSAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIHRpZ2VyLmMgKHRpZ2VyX2dldF9pbmZvKTogRG8gbm90IGRlY2xhcmUgc3RhdGljLgorCSogc2hhMjU2LmMgKHNoYTI1Nl9nZXRfaW5mbyk6IExpa2V3aXNlLgorCSogc2hhMS5jIChzaGExX2dldF9pbmZvKTogTGlrZXdpc2UuCisJKiBybWQxNjAuYyAocm1kMTYwX2dldF9pbmZvKTogTGlrZXdpc2UuCisJKiBtZDUuYyAobWQ1X2dldF9pbmZvKTogTGlrZXdpc2UuCisJKiBtZDQuYyAobWQ0X2dldF9pbmZvKTogTGlrZXdpc2UuCisJKiBjcmMuYyAoY3JjX2dldF9pbmZvKTogTGlrZXdpc2UuCisKKwkqIG1kLmMgKGxvYWRfZGlnZXN0X21vZHVsZSk6IENhbGwgc2V0dXBfbWRfdGFibGUgZHVyaW5nCisJaW5pdGlhbGl6YXRpb24uCisJKG5ld19saXN0X2l0ZW0pOiBMaW5rIG5ldyBlbGVtZW50IGludG8gZGlnZXN0X2xpc3QuCisKKwkqIGNpcGhlci5jIChkb19jdHJfZGVjcnlwdCk6IE1hZGUgZG9fY3RyX2VuY3J5cHQgYWN0IGFzIGEgd3JhcHBlcgorCWZvciBkb19jdHJfZW5jcnlwdCwgc2luY2UgdGhlc2UgZnVuY3Rpb25zIGFyZSBpZGVudGljYWwuCisKKzIwMDMtMDMtMzAgIFNpbW9uIEpvc2Vmc3NvbiAgPGphc0BleHR1bmRvLmNvbT4KKworCSogY2lwaGVyLmMgKHN0cnVjdCBnY3J5X2NpcGhlcl9oYW5kbGUpOiBBZGQgY291bnRlciBmaWVsZC4KKwkoZ2NyeV9jaXBoZXJfb3Blbik6IEFkZCBDVFIuCisJKGNpcGhlcl9yZXNldCk6IENsZWFyIGNvdW50ZXIgZmllbGQuCisJKGRvX2N0cl9lbmNyeXB0LCBkb19jdHJfZGVjcnlwdCk6IE5ldyBmdW5jdGlvbnMuCisJKGNpcGhlcl9lbmNyeXB0LCBjaXBoZXJfZGVjcnlwdCk6IENhbGwgQ1RSIGZ1bmN0aW9ucy4KKwkoZ2NyeV9jaXBoZXJfY3RsKTogQWRkIFNFVF9DVFIgdG8gc2V0IGNvdW50ZXIuCisKKzIwMDMtMDMtMzAgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiByc2EuYyAoX2djcnlfcnNhX2JsaW5kKTogTmV3IGZ1bmN0aW9uLgorCShfZ2NyeV9yc2FfdW5ibGluZCk6IE5ldyBmdW5jdGlvbi4KKwkoX2djcnlfcnNhX2RlY3J5cHQpOiBVc2UgX2djcnlfcnNhX2JsaW5kIGFuZCBfZ2NyeV9yc2FfZGVjcnlwdC4KKworMjAwMy0wMy0yNiAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGR5bmxvYWQuYyAoX2djcnlfZW51bV9nbnVwZ2V4dF9wdWJrZXlzKTogQWRqdXN0IGBlbmNyeXB0JyBhbmQKKwlgZGVjcnlwdCcgZnVuY3Rpb24gYXJndW1lbnRzLgorCShfZ2NyeV9lbnVtX2dudXBnZXh0X3B1YmtleXMpOiBMaWtld2lzZS4KKwkqIGR5bmxvYWQuaDogTGlrZXdpc2UuCisJCisJKiBwdWJrZXkuYyAoZHVtbXlfZGVjcnlwdCk6IEFkZCBhcmd1bWVudDogaW50IGZsYWdzLgorCShkdW1teV9lbmNyeXB0KTogTGlrZXdpc2UuCisKKwkqIGVsZ2FtYWwuYyAoX2djcnlfZWxnX2VuY3J5cHQpOiBBZGQgYXJndW1lbnQ6IGludCBmbGFncy4KKwkoX2djcnlfZWxnX2RlY3J5cHQpOiBMaWtld2lzZS4KKworCSogcnNhLmMgKF9nY3J5X3JzYV9lbmNyeXB0KTogQWRkIGFyZ3VtZW50OiBpbnQgZmxhZ3MuCisJKF9nY3J5X3JzYV9kZWNyeXB0KTogTGlrZXdpc2UuCisKKwkqIHB1YmtleS5jOiBBZGQgYGZsYWdzJyBhcmd1bWVudCB0byBtZW1iZXJzIGBlbmNyeXB0JyBhbmQKKwlgZGVjcnlwdCcgb2Ygc3RydWN0IGBwdWJrZXlfdGFibGVfcycuCisKKwkqIHJzYS5oOiBBZGQgYGZsYWdzJyBhcmd1bWVudCB0byBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuCisJKiBlbGdhbWFsLmg6IExpa2V3aXNlLgorCisJKiBwdWJrZXkuYyAoc2V4cF9kYXRhX3RvX21waSk6IE5ldyB2YXJpYWJsZTogaW50IHBhcnNlZF9mbGFncy4KKwkoc2V4cF9kYXRhX3RvX21waSk6IFNldCBgcGFyc2VkX2ZsYWdzJy4KKwkoc2V4cF9kYXRhX3RvX21waSk6IE5ldyBhcmd1bWVudDogaW50ICpmbGFncy4KKwkoZ2NyeV9wa19lbmNyeXB0KTogTmV3IHZhcmlhYmxlOiBpbnQgZmxhZ3MuCisJKGdjcnlfcGtfZW5jcnlwdCk6IFBhc3MgYGZsYWdzJyB0byBwdWJrZXlfZW5jcnlwdC4KKwkocHVia2V5X2VuY3J5cHQpOiBOZXcgdmFyaWFibGU6IGludCBmbGFncy4KKwkocHVia2V5X2VuY3J5cHQpOiBQYXNzIGBmbGFncycgdG8gcHVia2V5IGVuY3J5cHQgZnVuY3Rpb24uCisJKHB1YmtleV9kZWNyeXB0KTogTGlrZXdpc2UuCisJKHB1YmtleV9kZWNyeXB0KTogUGFzcyBgZmxhZ3MnIHRvIHB1YmtleSBlbmNyeXB0IGZ1bmN0aW9uLgorCShnY3J5X3BrX2VuY3J5cHQpOiBJbmNsdWRlIGBmbGFncycgcy1leHAgaW4gcmV0dXJuIGxpc3QuCisJKHNleHBfdG9fZW5jKTogTmV3IGFyZ3VtZW50OiBpbnQgKmZsYWdzLgorCShnY3J5X3BrX2RlY3J5cHQpOiBOZXcgdmFyaWFibGU6IGludCBmbGFncy4KKwkoZ2NyeV9wa19kZWNyeXB0KTogUGFzcyBgZmxhZ3MnIHRvIHB1YmtleV9kZWNyeXB0LgorCShzZXhwX3RvX2VuYyk6IE5ldyB2YXJpYWJsZTogaW50IHBhcnNlZF9mbGFncy4KKwkoc2V4cF90b19lbmMpOiBTZXQgYHBhcnNlZF9mbGFncycuCisKKzIwMDMtMDMtMjIgIFNpbW9uIEpvc2Vmc3NvbiAgPGphc0BleHR1bmRvLmNvbT4KKworCSogY2lwaGVyLmMgKGdjcnlfY2lwaGVyX29wZW4sIGRvX2NiY19lbmNyeXB0KQorCShnY3J5X2NpcGhlcl9lbmNyeXB0KTogU3VwcG9ydCBHQ1JZX0NJUEhFUl9DQkNfTUFDLgorCShnY3J5X2NpcGhlcl9jdGwpOiBTdXBwb3J0IEdDUllDVExfU0VUX0NCQ19NQUMuCisKKzIwMDMtMDMtMTkgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBwcmltZWdlbi5jIChnZW5fcHJpbWUpOiBOZXcgYXJncyBFWFRSQV9DSEVDSyBhbmQgRVhUUkFfQ0hFQ0tfQVJHCisJdG8gYWxsb3cgZm9yIGEgdXNlciBjYWxsYmFjay4gIENoYW5nZWQgYWxsIGNhbGxlcnMuCisJKF9nY3J5X2dlbmVyYXRlX3NlY3JldF9wcmltZSkKKwkoX2djcnlfZ2VuZXJhdGVfcHVibGljX3ByaW1lKTogRGl0dG8sIHBhc3MgdGhlbSB0byBnZW5fcHJpbWUuCisJKiByc2EuYyAoY2hlY2tfZXhwb25lbnQpOiBOZXcuCisJKGdlbmVyYXRlKTogVXNlIGEgY2FsbGJhY2sgdG8gZW5zdXJlIHRoYXQgYSBnaXZlbiBleHBvbmVudCBpcworCWFjdHVhbGx5IGdlbmVyYXRlZC4KKworMjAwMy0wMy0xMiAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIHByaW1lZ2VuLmM6IEluaXRpYWxpemUgYG5vX29mX3NtYWxsX3ByaW1lX251bWJlcnMnIHN0YXRpY2FsbHkuCisJKGdlbl9wcmltZSk6IFJlbW92ZSBjYWxjdWxhdGlvbiBvZiBgbm9fb2Zfc21hbGxfcHJpbWVfbnVtYmVycycuCisKKzIwMDMtMDMtMDMgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBtZC5jIChnY3J5X21kX2N0bCk6IFJld3JpdHRlbiB0byB1c2Ugc2FtZSBzdHlsZSBsaWtlIHRoZSBvdGhlcgorCWZ1bmN0aW9ucyBkaXNwYXRjaGVycy4KKworMjAwMy0wMy0wMiAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGNpcGhlci5jIChzdHJ1Y3QgZ2NyeV9jaXBoZXJfaGFuZGxlKTogTmV3IG1lbWJlcjogYWxnb19pbmRleC4KKwkoZ2NyeV9jaXBoZXJfb3Blbik6IEFsbG9jYXRlIG1lbW9yeSBmb3IgdHdvIGNpcGhlciBjb250ZXh0cy4KKwlJbml0aWFsaXplIGFsZ29faW5kZXguCisJKGNpcGhlcl9zZXRrZXkpOiBEdXBsaWNhdGUgY29udGV4dCBpbnRvIHJlc2VydmVkIG1lbW9yeS4KKwkoY2lwaGVyX3Jlc2V0KTogTmV3IGZ1bmN0aW9uLCB3aGljaCByZXNldHMgdGhlIGNvbnRleHQgYW5kIGNsZWFyCisJdGhlIElWLgorCShnY3J5X2NpcGhlcl9jdGwpOiBDYWxsIGNpcGhlcl9yZXNldC4KKworMjAwMy0wMi0yMyAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGNpcGhlci5jOiBSZW1vdmUgKGJvZ3VzKSBgZGlnaXRwJyBtYWNybyBkZWZpbml0aW9uLgorCSogbWQuYzogTGlrZXdpc2UuCisKKwkqIGJsb3dmaXNoLmMgKGJ1cm5fc3RhY2spOiBSZW1vdmVkLgorCSogYXJjZm91ci5jIChidXJuX3N0YWNrKTogTGlrZXdpc2UuCisJKiBjYXN0NS5jIChidXJuX3N0YWNrKTogTGlrZXdpc2UuCisJKiBkZXMuYyAoYnVybl9zdGFjayk6IExpa2V3aXNlLgorCSogbWQ0LmMgKGJ1cm5fc3RhY2spOiBMaWtld2lzZS4KKwkqIG1kNS5jIChidXJuX3N0YWNrKTogTGlrZXdpc2UuCisJKiByYW5kb20uYyAoYnVybl9zdGFjayk6IExpa2V3aXNlLgorCSogcmlqbmRhZWwuYyAoYnVybl9zdGFjayk6IExpa2V3aXNlLgorCSogcm1kMTYwLmMgKGJ1cm5fc3RhY2spOiBMaWtld2lzZS4KKwkqIHNoYTEuYyAoYnVybl9zdGFjayk6IExpa2V3aXNlLgorCSogc2hhMjU2LmMgKGJ1cm5fc3RhY2spOiBMaWtld2lzZS4KKwkqIHRpZ2VyLmMgKGJ1cm5fc3RhY2spOiBMaWtld2lzZS4KKwkqIHR3b2Zpc2guYyAoYnVybl9zdGFjayk6IExpa2V3aXNlLgorCisJKiBibG93ZmlzaC5jOiBDaGFuZ2VkIGFsbCBvY2N1cmVuY2VzIG9mIGJ1cm5fc3RhY2sgdG8KKwlfZ2NyeV9idXJuX3N0YWNrLgorCSogYXJjZm91ci5jOiBMaWtld2lzZS4KKwkqIGNhc3Q1LmM6IExpa2V3aXNlLgorCSogZGVzLmM6IExpa2V3aXNlLgorCSogbWQ0LmM6IExpa2V3aXNlLgorCSogbWQ1LmM6IExpa2V3aXNlLgorCSogcmFuZG9tLmM6IExpa2V3aXNlLgorCSogcmlqbmRhZWwuYzogTGlrZXdpc2UuCisJKiBybWQxNjAuYzogTGlrZXdpc2UuCisJKiBzaGExLmM6IExpa2V3aXNlLgorCSogc2hhMjU2LmM6IExpa2V3aXNlLgorCSogdGlnZXIuYzogTGlrZXdpc2UuCisJKiB0d29maXNoLmM6IExpa2V3aXNlLgorCisJKiBhcmNmb3VyLmMgKF9nY3J5X2FyY2ZvdXJfZ2V0X2luZm8pOiBVc2UgR0NSWV9DSVBIRVJfQVJDRk9VUgorCWluc3RlYWQgb2YgaGFyZC1jb2RlZCB2YWx1ZSBgMzAxJy4KKworMjAwMy0wMS0yNCAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIHJhbmRvbS5jIChfZ2NyeV9yZWdpc3Rlcl9yYW5kb21fcHJvZ3Jlc3MpOiBOZXcuCisJKF9nY3J5X3JhbmRvbV9wcm9ncmVzcyk6IE5ldy4KKworCSogcm5kbGludXguYyAoZ2F0aGVyX3JhbmRvbSk6IENhbGwgdGhlIHJhbmRvbSBwcm9ncmVzcyBmdW5jdGlvbi4gCisKKzIwMDMtMDEtMjMgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiByc2EuYyAoZ2VuZXJhdGUpOiBOZXcgYXJnIFVTRV9FIHRvIHJlcXVlc3QgYSBzcGVjaWZpYyBwdWJsaWMKKwlleHBvbmVudC4KKwkoX2djcnlfcnNhX2dlbmVyYXRlKTogRGl0dG8uCisJKiBlbGdhbWFsLmMgKF9nY3J5X2VsZ19nZW5lcmF0ZSk6IE11c3QgYWRkIGFuIGR1bW15IGFyZ3VtZW50CisJaW5zdGVhZCBvZiBVU0VfRS4KKwkqIGRzYS5jIChfZ2NyeV9kc2FfZ2VuZXJhdGUpOiBEaXR0by4KKwkqIHB1YmtleS5jIChkdW1teV9nZW5lcmF0ZSk6IERpdHRvLgorCShwdWJrZXlfZ2VuZXJhdGUpOiBBZGQgVVNFX0UgYXJnIGFuZCBwYXNzIGl0IGRvd24uCisJKGdjcnlfcGtfZ2Vua2V5KTogRGV0ZWN0ICJyc2EtdXNlLWUiIHBhcmFtZXRlciBhbmQgcGFzcyBpdCB0byBnZW5lcmF0ZS4KKworCSogcHVia2V5LmMgKHNleHBfdG9fZW5jKTogTmV3IGFyZyBSRVRfTU9ERVJOLgorCShnY3J5X3BrX2RlY3J5cHQpOiBNYWtlIHVzZSBvZiBpdCB0byByZXR1cm4gYSByZWFsIFMtZXhwcmVzc2lvbi4KKwlSZXR1cm4gYmV0dGVyIGVycm9yIGNvZGVzLgorCShnY3J5X3BrX3ZlcmlmeSk6IFJldHVybiBiZXR0ZXIgZXJyb3IgY29kZXMuCisKKzIwMDMtMDEtMjEgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiByYW5kb20uYyAoZ2NyeV9yYW5kb21fYWRkX2J5dGVzKTogQWRkIFFVQUxJVFkgYXJndW1lbnQsIGxldAorCWZ1bmN0aW9uIHJldHVybiBhbiBlcnJvciBjb2RlIGFuZCBkaXNhYmxlIGl0cyBjb3JlIGZvciBub3cuCisKKzIwMDMtMDEtMjEgIFRpbW8gU2NodWx6ICA8dHdvYWRheUBmcmVha21haWwuZGU+CisKKwkqIHJhbmRvbS5jIChnY3J5X3JhbmRvbV9hZGRfYnl0ZXMpOiBOZXcuIEZ1bmN0aW9uIHRvIGFkZCBleHRlcm5hbAorCXJhbmRvbSB0byB0aGUgcG9vbC4KKwkKKzIwMDMtMDEtMjAgIFNpbW9uIEpvc2Vmc3NvbiAgPGphc0BleHR1bmRvLmNvbT4KKworCSogY3JjLmM6IE5ldy4KKwkqIE1ha2VmaWxlLmFtIChFWFRSQV9QUk9HUkFNUywgRVhUUkFfY3JjX1NPVVJDRVMpOiBBZGQgY3JjLmMuCisJKiBtZC5jIChnY3J5X21kX2dldF9hbGdvX2RsZW4pOiBBZGQgdmFsdWVzIGZvciBDUkMuCisKKzIwMDMtMDEtMjAgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBzaGEyNTYuYzogTmV3LgorCSogYml0aGVscC5oIChyb3IpOiBOZXcuCisJKiBNYWtmaWxlLmFtOiBBZGQgc2hhMjU2LmMuCisJKiBtZC5jIChvaWRfdGFibGUpOiBBZGQgdmFsdWVzIGZvciBTSEEyNTYgZXQgYWwuCisJKGdjcnlfbWRfZ2V0X2FsZ29fZGxlbik6IExpa2V3aXNlCisKKzIwMDMtMDEtMjAgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBwdWJrZXkuYyAoZ2NyeV9wa19nZXRfa2V5Z3JpcCk6IEltcGxlbWVudGVkIGtleWdyaXBzIGZvciBEU0EKKwlhbmQgRWxHYW1hbC4KKworMjAwMy0wMS0xNyAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIGNpcGhlci5jIChnY3J5X2NpcGhlcl9lbmNyeXB0KTogUmV3b3JrZWQgc28gdGhhdCB0aGUgb3V0cHV0IHdpbGwKKwluZXZlciBjb250YWluIHRoZSBwbGFpbnRleHQgZXZlbiBpZiB0aGUgY2FsbGVyIGRpZCBub3QgY2hlY2tlZCB0aGUKKwlyZXR1cm4gdmFsdWUuCisKKwkqIG1kLmMgKGdjcnlfbWRfZ2V0X2FsZ28pOiBDaGFuZ2VkIGVycm9yIGNvZGUgdG8gR0NSWUVSUl9HRU5FUkFMCisJYmVjYXVzZSB3ZSBkb24ndCBoYXZlIGFuIGludmFsaWQgbWQgYWxnbyBidXQgbm8gYWxnb3JpdGhtIGVuYWJsZWQuCisKKwkqIHB1YmtleS5jIChnY3J5X3BrX2dlbmtleSk6IENoYW5nZWQgZXJyb3IgY29kZSBmb3IgYm91bmRzIGNoZWNrCisJb2YgdGFibGUgcGFyYW1ldGVycyB0byBHQ1JZRVJSX0lOVEVSTkFMLgorCisJKiBtZC5jIChnY3J5X21kX29wZW4pOiBQYXJ0bHkgcmV2ZXJ0ZWQgVGltbydzIGNoYW5nZSBmcm9tCisJMjAwMi0xMC0xMCBieSByZW1vdmluZyB0aGUgY2hlY2sgZm9yIHRoZSBhbGdvcml0aG0uICBBbiBhbGdvcml0aG0KKwlvZiAwIGlzIGFsbG93ZWQgYW5kIGFueXdheSB3ZSBzaG91bGQgbm90IGRvdWJsZSBjaGVjayBpdCBvciBjaGVjaworCWl0IHVzaW5nIGEgZGlmZmVyZW50IGZ1bmN0aW9uLiAgQWxzbyBmaXhlZCB0aGUgZmxhZ3MgY2hlY2suCisKKwkqIHB1YmtleS5jIChnY3J5X3BrX2VuY3J5cHQpOiBNYWtlIHN1cmUgdGhhdCBSX0NJUEggcG9pbnRzIHRvIE5VTEwKKwlvbiBlcnJvci4KKwkoZ2NyeV9wa19kZWNyeXB0KTogRGl0dG8gZm9yIFJfUExBSU4uCisJKGdjcnlfcGtfc2lnbik6IERpdHRvIGZvciBSX1NJRy4KKwkoZ2NyeV9wa19nZW5rZXkpOiBEaXR0byBmb3IgUl9LRVkuCisKKzIwMDMtMDEtMTYgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBtZC5jIChnY3J5X21kX3dyaXRlKTogQ2hhbmdlZCAybmQgYXJndW1lbnQgdHlwZSB0byB2b2lkKi4KKwkoZ2NyeV9tZF9oYXNoX2J1ZmZlcik6IENoYW5nZWQgdHlwZSBvZiBib3RocyBidWZmZXJzIHRvIHZvaWQqLgorCShnY3J5X21kX3NldGtleSk6IENoYW5nZWQgMm5kIGFyZ3VtZW50IHR5cGUgdG8gdm9pZCouCisKKzIwMDMtMDEtMTUgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBwdWJrZXkuYyAoc2V4cF9kYXRhX3RvX21waSk6IE5ldy4gIFRoaXMgaGFuZGxlcyBwa2NzMSBwYWRkaW5nLgorCShnY3J5X3BrX3NpZ24sIGdjcnlfcGtfdmVyaWZ5KTogVXNlIGl0IGhlcmUuCisJKGdjcnlfcGtfZW5jcnlwdCk6IEFuZCBoZXJlLgorCShwdWJrZXlfdmVyaWZ5KTogQWRkIGRlYnVnIGNvZGUuCisJKHNleHBfdG9fZW5jKTogSGFuZGxlIGZsYWdzIGluIHRoZSBpbnB1dCBhbmQgcmV0dXJuIHRoZSBwa2NzMSBmbGFnCisJaW4gYSBuZXcgcGFyYW1ldGVyLgorCShnY3J5X3BrX2RlY3J5cHQpOiBQcmVwYXJlIGZvciBmdXR1cmUgcGtjczEgaGFuZGxpbmcuCisKKzIwMDItMTItMTkgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiByYW5kb20uYyAoX2djcnlfcmFuZG9tX2luaXRpYWxpemUpOiBOZXcuCisKKzIwMDItMTItMTYgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBjaXBoZXIuYzogQWRkZWQgYSBUZWxldHJ1c3Qgc3BlY2lmaWMgT0lEIGZvciAzREVTLgorCisyMDAyLTEyLTEyICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogbWQuYzogQWRkZWQgYW5vdGhlciBvZGRiYWxsIE9JVyBPSUQgKHNoYS0xV2l0aFJTQUVuY3J5cHRpb24pLgorCisyMDAyLTExLTIzICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogbWQuYyAobG9hZF9kaWdlc3RfbW9kdWxlKTogRW5sYXJnZWQgY2hlY2tlZF9hbGdvcyBiaXRtYXAuCisJKiBtZDQuYyAoZnVuY190YWJsZSk6ICBGaXhlZCBlbnRyeSBmb3IgbWQ0LiAKKwlCb3RoIGJ5IFNpbW9uIEpvc2VwaHNvbi4KKwkodHJhbnNmb3JtKTogQ29weSBkYXRhIHRvIGdldCB0aGUgYWxpZ25tZW50IHN0cmFpZ2h0LiBUZXN0ZWQgb25seQorCW9uIGkzODYuCisKKzIwMDItMTEtMTAgIFNpbW9uIEpvc2Vmc3NvbiAgPGphc0BleHR1bmRvLmNvbT4KKworCSogY2lwaGVyLmMgKGdjcnlfY2lwaGVyX29wZW4pOiBEb24ndCByZWplY3QgQ1RTIGZsYWcuCisJKGRvX2NiY19lbmNyeXB0LCBkb19jYmNfZGVjcnlwdCwgY2lwaGVyX2VuY3J5cHQpIAorCShnY3J5X2NpcGhlcl9lbmNyeXB0LCBjaXBoZXJfZGVjcnlwdCkKKwkoZ2NyeV9jaXBoZXJfZGVjcnlwdCk6IFN1cHBvcnQgQ1RTIGZsYWcuCisJKGdjcnlfY2lwaGVyX2N0bCk6IFRvZ2dsZSBDVFMgZmxhZy4KKworMjAwMi0xMS0xMCAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIG1kNC5jOiBOZXcuIEJ5IFNpbW9uIEpvc2Vmc3Nvbi4KKwkqIE1ha2VmaWxlLmFtIChFWFRSQV9QUk9HUkFNUyk6IEFkZCBtZDQuYy4gCisJKiBtZC5jIChvaWRfdGFibGUsZ2NyeV9tZF9nZXRfYWxnb19kbGVuKTogTUQ0IHN1cHBvcnQuIAorCisyMDAyLTEwLTE0ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogYXJjZm91ci5jIChkb19lbmNyeXB0X3N0cmVhbSk6IERvbid0IHVzZSBpbmNyZW1lbnQgb3Agd2hlbgorCWFzc2lnbmluZyB0byB0aGUgc2FtZSB2YXJpYWJsZS4KKworMjAwMi0xMC0xMCAgVGltbyBTY2h1bHogIDx0c0B3aW5wdC5vcmc+CisKKwkqIHB1YmtleS5jIChnY3J5X3BrX2dlbmtleSk6IENoZWNrIGJvdW5kYXJpZXMuCisJCisJKiBtZC5jIChnY3J5X21kX29wZW4pOiBDaGVjayB0aGF0IGFsZ28gaXMgYXZhaWxhYmxlIGFuZCBvbmx5CisJdmFsaWQgZmxhZyB2YWx1ZXMgYXJlIHVzZWQuCisJKGdjcnlfbWRfZ2V0X2FsZ28pOiBBZGQgZXJyb3IgaGFuZGxpbmcuCisJCisyMDAyLTA5LTI2ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogbWQuYzogSW5jbHVkZSBhbiBPSUQgZm9yIFRJR0VSLgorCSogdGlnZXIuYyAodGlnZXJfZ2V0X2luZm8pOiBVc2UgYSByZWd1bGFyIE9JRC4KKworMjAwMi0wOS0xNyAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIHJhbmRvbS5jOiBSZXBsYWNlZCBtdXRleC5oIGJ5IHRoZSBuZXcgYXRoLmguICBDaGFuZ2VkIGFsbCBjYWxscy4KKworMjAwMi0wOS0xNiAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIGFyY2ZvdXIuYyAoZG9fZW5jcnlwdF9zdHJlYW0pOiBVc2UgcmVnaXN0ZXIgbW9kaWZpZXIgYW5kIG1vZHVsby4KKwlBY2NvcmRpbmcgdG8gTmlrb3MgTWF2cm95YW5vcG91bG9zIHRoaXMgaW5jcmVhc2VzIHBlcmZyb21hY2Ugb24KKwlpMzg2IHN5c3RlbSBub3RpY2FibGUuICBBbmQgSSBhbHdheXMgdG91Z2h0IGdjYyBpcyBjbGV2ZXIgZW5vdWdoLgorCSogbWQ1LmMgKHRyYW5zZm9ybSk6IFVzZSByZWdpc3RlciBtb2RpZmllci4KKwkqIHJtZDE2MC5jICh0cmFuc2Zvcm0pOiBEaXR0by4KKwkqIHNoYTEuYyAodHJhbnNmb3JtKTogRGl0dG8uICBXZSBob3BlIHRoYXQgdGhlcmUgYXJlIDYgZnJlZSByZWdpc3RlcnMuCisJKiByYW5kb20uYyAoZ2NyeV9yYW5kb21pemUpOiBSZXdyb3RlIHRvIGF2b2lkIG1hbGxvYyBjYWxscy4KKworCSogcm5kbGludXguYyAoZ2F0aGVyX3JhbmRvbSk6IFJlcGxhY2VkIHJlbWFpbmluZyBmcHJpbnRmcyBieSBsb2dfKi4KKwkqIGFyY2ZvdXIuYyAoZG9fYXJjZm91cl9zZXRrZXkpOiBEaXR0by4KKwkqIHR3b2Zpc2guYyAoZG9fdHdvZmlzaF9zZXRrZXkpOiBEaXR0by4KKwkqIHJuZGVnZC5jIChnYXRoZXJfcmFuZG9tKTogRGl0dG8uCisJKiByaWpuZGFlbC5jIChkb19zZXRrZXkpOiBEaXR0by4KKwkqIHJhbmRvbS5jIChfZ2NyeV9yYW5kb21fZHVtcF9zdGF0cyk6IERpdHRvLiAKKwkqIHByaW1lZ2VuLmMgKF9nY3J5X2dlbmVyYXRlX2VsZ19wcmltZSk6IERpdHRvLgorCSogZGVzLmMgKF9nY3J5X2Rlc19nZXRfaW5mbyk6IERpdHRvLgorCSogY2FzdDUuYyAoZG9fY2FzdF9zZXRrZXkpOiBEaXR0by4KKwkqIGJsb3dmaXNoLmMgKGRvX2JmX3NldGtleSk6IERpdHRvLgorCisyMDAyLTA4LTI2ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogZGVzLmMgKHdlYWtfa2V5cyk6IEZpeGVkIG9uZSBlbnRyeSBpbiB0aGUgdGFibGUgYW5kIGNvbXBhcmVkCisJYWxsIGVudHJpZXMgYWdhaW5zdCB0aGUgbGl0ZXJhdHVyZS4KKwkoc2VsZnRlc3QpOiBDaGVja3N1bSB0aGUgd2VhayBrZXkgdGFibGUuCisKKzIwMDItMDgtMjEgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBwdWJrZXkuYzogRW5hYmxlIGtleWdyaXAgY2FsY3VsYXRpb24gZm9yICJvcGVucGdwLXJzYSIuCisKKzIwMDItMDgtMTcgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBjaXBoZXIuYyAoc2V0dXBfY2lwaGVyX3RhYmxlKTogRG9uJ3Qgb3ZlcndyaXRlIHRoZSBERVMgZW50cnkKKwl3aXRoIHRoZSBlbnRyeSBmb3IgRFVNTVkuCisKKzIwMDItMDgtMTQgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBkZXMuYyAoZG9fZGVzX3NldGtleSxkb19kZXNfZW5jcnlwdCwgZG9fZGVzX2RlY3J5cHQpOiBOZXcuCisJKF9nY3J5X2Rlc19nZXRfaW5mbyk6IFN1cHBvcnQgcGxhaW4gb2xkIERFUy4KKwkqIGNpcGhlci5jIChzZXR1cF9jaXBoZXJfdGFibGUpOiBQdXQgREVTIGludG8gdGhlIHRhYmxlLgorCisyMDAyLTA3LTI1ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogcm5kdW5peC5jIChfZ2NyeV9ybmR1bml4X2NvbnN0cnVjdG9yKTogUHJlZml4ZWQgd2l0aCBfZ2NyeV8uCisJTm90ZWQgYnkgU3RlcGhhbiBBdXN0ZXJtdWVobGUuCisKKzIwMDItMDctMDggIFRpbW8gU2NodWx6ICA8dHNAd2lucHQub3JnPgorCisJKiBybmR3MzIuYzogUmVwbGFjZWQgdGhlIG1fIG1lbW9yeSBmdW5jdGlvbnMgd2l0aCB0aGUgcmVhbCAKKwlnY3J5XyBmdW5jdGlvbnMuIFJlbmFtZWQgYWxsIGcxMF8gcHJlZml4ZWQgZnVuY3Rpb25zIHRvIGxvZ18uCisJCisyMDAyLTA2LTEyICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogcnNhLmMgKGdlbmVyYXRlKTogVXNlIGUgPSA2NTUzNyBmb3Igbm93LgorCisyMDAyLTA2LTExICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogcHVia2V5LmMgKGdjcnlfcGtfZ2V0X2tleWdyaXApOiBBbGxvdyBhICJwcm90ZWN0ZWQtcHJpdmF0ZS1rZXkiLgorCisyMDAyLTA2LTA1ICBUaW1vIFNjaHVseiAgPHRzQHdpbnB0Lm9yZz4KKworCSogY2lwaGVyLmMgKGdjcnlfY2lwaGVyX2VuY3J5cHQsIGdjcnlfY2lwaGVyX2RlY3J5cHQpOgorCUNoZWNrIHRoYXQgdGhlIGlucHV0IHNpemUgaXMgYSBtdWx0aXBsZSBvZiB0aGUgYmxvY2tzaXplLgorCQorMjAwMi0wNS0yMyAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIG1kLmMgKG9pZF90YWJsZSk6IEFkZCBhbiByc2Fkc2kgT0lEIGZvciBNRDUuCisKKzIwMDItMDUtMjEgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBwcmltZWdlbi5jLCBlbGdhbWFsLmMsIGRzYS5jIChwcm9ncmVzcyk6IERvIG5vdCBwcmludCBhbnl0aGluZworCWJ5IGRlZmF1bHQuICBQYXNzIGFuIGV4dHJhIGlkZW50aWZ5aW5nIHN0cmluZyB0byB0aGUgY2FsbGJhY2sgYW5kCisJcmVzZXJ2ZWQgMiBhcmd1bWVuc3QgZm9yIGN1cnJlbnQgYW5kIHRvdGFsIGNvdW50ZXJzLiAgQ2hhbmdlZCB0aGUKKwlyZWdpc3RlciBmdW5jdGlvbiBwcm90b3R5cGUuCisKKzIwMDItMDUtMTcgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBybmRlZ2QuYyAocm5kZWdkX2NvbnN0cnVjdG9yKTogRml4ZWQgbmFtZSBvZiByZWdpc3RlciBmdW5jdGlvbgorCWFuZCBwcmVmaXhlZCB0aGUgZnVuY3Rpb24gbmFtZSB3aXRoIF9nY3J5Xy4KKwkqIHJuZHczMi5jIChybmR3MzJfY29uc3RydWN0b3IpOiBEaXR0by4KKwkqIHRpZ2VyLmMgKHRpZ2VyX2NvbnN0cnVjdG9yKTogRGl0dG8uCisKKwkqIE1ha2VmaWxlLmFtOiBSZW1vdmVkIGFsbCBkeW5hbWljIGxvYWRpbmcgc3R1ZmYuCisJKiBkeW5sb2FkLmM6IERpdHRvLiBOb3cgb25seSB1c2VkIGZvciB0aGUgY29uc3RydWN0b3Igc3lzdGVtLgorCisyMDAyLTA1LTE1ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogcmFuZG9tLmMgKGdjcnlfcmFuZG9tX2J5dGVzLGdjcnlfcmFuZG9tX2J5dGVzX3NlY3VyZSkKKwkoZ2NyeV9yYW5kb21pemUpOiBNYWtlIHN1cmUgd2UgYXJlIGluaXRpYWxpemVkLgorCisyMDAyLTA1LTE0ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCUNoYW5nZWQgbGljZW5zZSBvZiBtb3N0IGZpbGVzIHRvIHRoZSBMR1BMLgorCisyMDAyLTA1LTAyICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogcmFuZG9tLmMgKF9nY3J5X2Zhc3RfcmFuZG9tX3BvbGwpOiBJbml0aWFsaXplIHRoZSBtb2R1bGUgc28gdGhlCisJbXV0ZXggY2FuIGJlIHVzZWQuCisKKwkqIHByaW1lZ2VuLmMgKHNtYWxsX3ByaW1lX251bWJlcnMpOiBNb3ZlZCB0YWJsZSBmcm9tIHNtYWxscHJpbWUuYworCSogc21hbGxwcmltZS5jOiBGaWxlIHJlbW92ZWQuCisKKwkqIGRlcy5jIChsZWZ0a2V5X3N3YXAsIHJpZ2h0a2V5X3N3YXAsIHdvcmtpbmdfbWVtY21wKTogTWFkZSBzdGF0aWMuCisKKwkqIGNpcGhlci5jIChnY3J5X2NpcGhlcl9tYXBfbmFtZSk6IE1hcCAiUklKTkRBRUwiIHRvICJBRVMiLgorCSogcmlqbmRhZWwuYyAocmlqbmRhZWxfZ2V0X2luZm8pOiBXZSBkbyBvbmx5IHN1cHBvcnQgYSAxMjggYml0CisJYmxvY2tzaXplIHNvIGl0IG1ha2VzIHNlbnNlIHRvIGNoYW5nZSB0aGUgYWxnb3JpdGhtIHN0cmluZ3MgdG8KKwlBRVMuCisKKwkqIHRpZ2VyLmMgKHRpZ2VyX2ZpbmFsKTogUmVtb3ZlZCBzdXBlcmZsdW91cyB0b2tlbiBwYXN0aW5nIG9wZXJhdG9ycy4KKwkqIG1kNS5jIChtZDVfZmluYWwpOiBEaXR0by4KKworMjAwMi0wNC0zMCAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIGNpcGhlci5jOiBGaXhlZCBsaXN0IG9mIGNvcHlyaWdodCB5ZWFycy4KKworMjAwMi0wMy0xOCAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIHJhbmRvbS5jIChpbml0aWFsaXplKTogSW5pdGlhbGl6ZSB0aGUgbmV3IHBvb2wgbG9jayBtdXRleC4KKwkoX2djcnlfZmFzdF9yYW5kb21fcG9sbCk6IEFkZCBsb2NraW5nIGFuZCBtb3ZlZCBtYWluCisJY29kZSBvdXQgdG8uLi4KKwkoZG9fZmFzdF9yYW5kb21fcG9sbCk6IG5ldyBmdW5jdGlvbi4KKwkocmVhZF9wb29sKTogVXNlIHRoZSBuZXcgZnVuY3Rpb24gaGVyZS4KKwkoZ2V0X3JhbmRvbV9ieXRlcyk6IEFkZCBsb2NraW5nLgorCShfZ2NyeV91cGRhdGVfcmFuZG9tX3NlZWRfZmlsZSk6IERpdHRvLgorCisyMDAyLTAzLTExICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogbWQuYzogQWRkIHJzYVNpZ25hdHVyZVdpdGhyaXBlbWQxNjAgdG8gT0lEIHRhYmxlLgorCisyMDAyLTAyLTIwICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogc2hhMS5jOiBSZW1vdmVkIGEgbGVmdCBvdmVyIGNvbW1lbnQgbm90ZS4gIFRoZSBjb2RlIGhhcyBiZWVuCisJcmV3cml0dGVuIGZyb20gc2NyYXRjaCBpbiAxOTk4LiAgVGhhbmtzIHRvIE5pZWxzIE3DtmxsZXIgZm9yCisJcmVwb3J0aW5nIHRoaXMgbWlzbGVhZGluZyBjb21tZW50LgorCisyMDAyLTAyLTE4ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogcm5kdW5peC5jIChybmR1bml4X2NvbnN0cnVjdG9yKTogVXNlIHRoZSB0aGUgbmV3IHByZWZpeGVkCisJZnVuY3Rpb24gbmFtZS4gIFJlcG9ydGVkIGJ5IEpvcmRpIE1hbGxhY2guCisKKzIwMDItMDItMTAgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiByYW5kb20uYyAobWl4X3Bvb2wpOiBDYXJyeSBhbiBleHRyYSBmYWlsc2FmZV9kaWdlc3QgYnVmZmVyCisJYXJvdW5kIHRvIG1ha2UgdGhlIGZ1bmN0aW9uIG1vcmUgcm9idXN0LgorCisyMDAyLTAyLTA4ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogcmFuZG9tLmMgKGFkZF9yYW5kb21uZXNzKTogWG9yIG5ldyBkYXRhIGludG8gdGhlIHBvb2wgYW5kIG5vdAorCWp1c3QgY29weSBpdC4gIFRoaXMgYXZvaWRzIGFueSBjaG9vc2VuIGlucHV0IGF0dGFja3Mgd2hpY2ggYXJlIG5vdAorCXNlcmlvdXMgaW4gb3VyIHNldHRpbmcgYmVjYXVzZSBhbiBvdXRzaWRlciB3b24ndCBiZSBhYmxlIHRvIG1peAorCWRhdGEgaW4gYW5kIGV2ZW4gdGhlbiB3ZSBrZWVwIGdvaW5nIHdpdGggYSBQUk5HLiAgVGhhbmtzIHRvIFN0ZWZhbgorCUtlbGxlciBmb3IgcG9pbnRpbmcgdGhpcyBvdXQuCisKKzIwMDItMDEtMDQgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBwdWJrZXkuYyAoZ2NyeV9wa19nZW5rZXkpOiBEbyBub3QgcmVsZWFzZSBza2V5IC0gaXQgaXMgc3RhdGljLgorCisJKiBwcmltZWdlbi5jIChnZW5fcHJpbWUpOiBPZiBjb3Vyc2Ugd2Ugc2hvdWxkIHVzZSBzZXRfYml0CisJYW5kIG5vdCBzZXRfaGlnaGJpdCB0byBzZXQgdGhlIHNlY29uZCBoaWdoIGJpdC4KKworMjAwMS0xMi0xOCAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIHJzYS5jIChnZW5lcmF0ZSk6IExvb3AgdW50aWwgd2UgZmluZCB0aGUgZXhhY3QgbW9kdWx1cyBzaXplLgorCUNoYW5nZWQgdGhlIGV4cG9uZW50IHRvIDQxLgorCShyc2FfZ2V0X2luZm8pOiBzL3VzYWdlL3JfdXNhZ2UvIHRvIGF2b2lkIHNoYWRvdyB3YXJuaW5ncy4KKwkqIHByaW1lZ2VuLmMgKGdlbl9wcmltZSk6IFNldCAyIGhpZ2ggb3JkZXIgYml0cyBmb3Igc2VjcmV0IHByaW1lcy4KKworCSogTWFrZWZpbGUuYW0gKERJU1RDTEVBTkZJTEVTKTogSW5jbHVkZSBjb25zdHJ1Y3QuYy4KKworMjAwMS0xMi0xNyAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIHB1YmtleS5jIChnY3J5X3BrX2dldF9rZXlncmlwKTogTmV3IC0gZXhwZXJpbWVudGFsLgorCisyMDAxLTEyLTExICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogY2lwaGVyLmM6IEFkZGVkIE9JRHMgZm9yIEFFUy4KKwkoZ2NyeV9jaXBoZXJfbW9kZV9mcm9tX29pZCk6IE5ldy4KKwkoZ2NyeV9jaXBoZXJfbWFwX25hbWUpOiBNb3ZlZCBPSUQgc2VhcmNoIGNvZGUgdG8gLi4KKwkoc2VhcmNoX29pZCk6IC4uIG5ldyBmdW5jdGlvbi4KKworMjAwMS0xMi0xMCAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIHB1YmtleS5jIChnY3J5X3BrX2VuY3J5cHQpOiBGaW5kIHRoZSBzaWduYXR1cmUgYWxnb3JpdGhtIGJ5IG5hbWUKKwlhbmQgbm90IGJ5IG51bWJlci4KKwkKKwkqIHB1YmtleS5jIChnY3J5X3BrX2VuY3J5cHQsZ2NyeV9wa19kZWNyeXB0LGdjcnlfcGtfc2lnbikKKwkoZ2NyeV9wa192ZXJpZnksZ2NyeV9wa190ZXN0a2V5LCBnY3J5X3BrX2dlbmtleSkKKwkoZ2NyeV9wa19nZXRfbmJpdHMpOiBSZWxlYXNlIHRoZSBhcnJheXMuICBOb3RlZCBieSBOaWtvcworCU1hdnJveWFub3BvdWxvcy4KKworMjAwMS0xMi0wNiAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIGNpcGhlci5jIChnY3J5X2NpcGhlcl9tYXBfbmFtZSk6IExvb2sgYWxzbyBmb3IgT0lEcyBwcmVmaXhlZAorCXdpdGggIm9pZC4iICBvciAiT0lELiIuCisKKzIwMDEtMTItMDUgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBwdWJrZXkuYyAoYWxnb19pbmZvX3RhYmxlKTogRml4ZWQgZW50cnkgZm9yIG9wZW5wZ3AtcnNhLiAKKworMjAwMS0xMS0yNCAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIHB1YmtleS5jOiBBZGRlZCB0aGUgcnNhRW5jcnlwdGlvbiBPSUQgdG8gdGhlIHRhYmxlcy4KKwkoc2V4cF90b19rZXkpOiBBZGQgYW4gYXJnIHRvIHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGFsZ29yaXRobSwKKwljaGFuZ2VkIGFsbCBjYWxsZXJzLgorCShnY3J5X3BrX3NpZ24pOiBGaW5kIHRoZSBzaWduYXR1cmUgYWxnb3JpdGhtIGJ5IG5hbWUgYW5kIG5vdCBieQorCW51bWJlci4KKwkoZ2NyeV9wa19nZXRfbmJpdHMpOiBGaXhlZCBzbyB0aGF0IHdlIGNhbiBub3cgcmVhbGx5IHBhc3MgYSBzZWNyZXQKKwlrZXkgdG8gZ2V0IHRoZSByZXN1bHQuCisJCisJKiBtZC5jIChnY3J5X21kX21hcF9uYW1lKTogTG9vayBhbHNvIGZvciBPSURzIHByZWZpeGVkIHdpdGggIm9pZC4iCisJb3IgIk9JRC4iIHNvIHRoYXQgYW4gT0lEIHN0cmluZyBjYW4gYmUgdXNlZCBhcyBhbiBTLUV4cCB0b2tlbi4KKworMjAwMS0xMS0yMCAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIG1kLmMgKGdjcnlfbWRfbWFwX25hbWUpOiBMb29rdXAgYnkgT0lEIGlmIHRoZSB0aGUgbmFtZSBiZWdpbnMKKwl3aXRoIGEgZGlnaXQuCisJKG9pZF90YWJsZSk6IE5ldy4KKwkKKzIwMDEtMTEtMTYgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBtZC5jIChnY3J5X21kX2luZm8pOiBOZXcgb3BlcmF0b3IgR0NSWUNUTF9JU19BTEdPX0VOQUJMRUQuCisKKzIwMDEtMTEtMDcgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBtZC5jIChnY3J5X21kX2hhc2hfYnVmZmVyKTogQ2xvc2UgdGhlIGhhbmRsZSB3aGljaCB3YXMgbGVmdCBvcGVuCisJZm9yIGFsZ29yaXRobXMgb3RoZXIgdGhhbiBybWQxNjAuCisKKzIwMDEtMDgtMDggIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBybmR3MzIuYyAoZ2F0aGVyX3JhbmRvbSk6IFVzZSB0b29saGVscCBpbiBhZGRpdGlvbiB0byB0aGUgTlQKKwlnYXRoZXJlciBmb3IgV2luZG93czIwMDAuICBTdWdnZXN0ZWQgYnkgU2FtaSBUb2x2YW5lbi4KKworCSogcmFuZG9tLmMgKHJlYWRfcG9vbCk6IEZpeGVkIGxlbmd0aCBjaGVjaywgdGhpcyB1c2VkIHRvIGJlIG9uZQorCWJ5dGUgdG8gc3RyaWN0LiAgTWFkZSBhbiBhc3NlcnQgb3V0IG9mIGl0IGJlY2F1c2UgdGhlIGNhbGxlciBoYXMKKwlhbHJlYWR5IG1hZGUgc3VyZSB0aGF0IG9ubHkgcG9vbHNpemUgYnl0ZXMgYXJlIHJlcXVlc3RlZC4KKwlSZXBvcnRlZCBieSBNYXJjdXMgQnJpbmttYW5uLgorCisyMDAxLTA4LTAzICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogY2lwaGVyLmMgKGNpcGhlcl9lbmNyeXB0LCBjaXBoZXJfZGVjcnlwdCk6IFByZXBhcmUgdG8gcmV0dXJuCisJZXJyb3JzLiBXZSBoYXZlIHRvIGNoYW5nZSB0aGUgaW50ZXJmYWNlIHRvIGFsbCBjaXBoZXJzIHRvIG1ha2UKKwl0aGlzIHJlYWxseSB3b3JrIGJ1dCB3ZSBzaG91bGQgZG8gc28gdG8gcHJlcGFyZSBmb3IgaGFyZHdhcmUKKwllbmNyeXB0aW9uIG1vZHVsZXMuCisJKGdjcnlfY2lwaGVyX2VuY3J5cHQsIGdjcnlfY2lwaGVyX2RlY3J5cHQpOiBSZXR1cm4gdGhlIGVycm9yIGFuZAorCXNldCBsYXN0ZXJyLiAKKwkoZ2NyeV9jaXBoZXJfY3RsKTogTWFrZSBzdXJlIHRoYXQgZXJyb3JzIGZyb20gc2V0a2V5IGFyZSByZXR1cm5lZC4KKworMjAwMS0wOC0wMiAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIHJuZGxpbnV4LmMgKGdhdGhlcl9yYW5kb20pOiBjYXN0ZWQgYSBzaXplX3QgYXJnIHRvIGludCBzbyB0aGF0CisJdGhlIGZvcm1hdCBzdHJpbmcgaXMgY29ycmVjdC4gIENhc3RpbmcgaXMgb2theSBoZXJlIGFuZCBhdm9pZHMKKwl0cmFuc2xhdGlvbiBjaGFuZ2VzLiAKKworCSogcmFuZG9tLmMgKGZhc3RfcmFuZG9tX3BvbGwpOiBEbyBub3QgY2hlY2sgdGhlIHJldHVybiBjb2RlIG9mCisJZ2V0cnVzYWdlLgorCisJKiBybmR1bml4LmM6IEFkZCBhIHNpZ25hbC5oIGhlYWRlciB0byBhdm9pZCB3YXJuaW5ncyBvbiBTb2xhcmlzIDcKKwlhbmQgOC4KKworCSogdGlnZXIuYyAocHJpbnRfYWJjLHByaW50X2RhdGEpOiBSZW1vdmVkLgorCisJKiByaWpuZGFlbC5jLCBkZXMuYywgYmxvd2Zpc2guYywgdHdvZmlzaC5jLCBjYXN0NS5jLCBhcmNmb3VyLmMKKwkoYnVybl9zdGFjayk6IE5ldy4gIEFkZCB3cmFwcGVycyBmb3IgbW9zdCBmdW5jdGlvbnMgdG8gYmUgYWJsZSB0bworCWNhbGwgYnVybl9zdGFjayBhZnRlciB0aGUgZnVuY3Rpb24gaW52b2NhdGlvbi4gVGhpcyBtZXRob2RzIHNlZW1zCisJdG8gYmUgdGhlIG1vc3QgcG9ydGFibGUgd2F5IHRvIHplcm9pc2UgdGhlIHN0YWNrIHVzZWQuIEl0IGRvZXMKKwlvbmx5IHdvcmsgb24gc3RhY2sgZnJhbWUgYmFzZWQgbWFjaGluZXMgYnV0IGl0IGlzIGhpZ2hseSBwb3J0YWJsZQorCWFuZCBoYXMgbm8gc2lkZSBlZmZlY3RzLiAgSnVzdCBzZXR0aW5nIHRoZSBhdXRvbWF0aWMgdmFyaWFibGVzIGF0CisJdGhlIGVuZCBvZiBhIGZ1bmN0aW9uIHRvIHplcm8gZG9lcyBub3Qgd29yayB3ZWxsIGJlY2F1c2UgdGhlCisJY29tcGlsZXIgd2lsbCBvcHRpbWl6ZSB0aGVtIGF3YXkgLSBtYXJraW5nIHRoZW0gYXMgdm9sYXRpbGUgd291bGQKKwliZSBiYWQgZm9yIHBlcmZvcm1hbmNlLgorCSogbWQ1LmMsIHNoYTEuYywgcm1kMTYwLmMsIHRpZ2VyLmMgKGJ1cm5fc3RhY2spOiBMaWtld2lzZS4KKwkqIHJhbmRvbS5jIChidXJuX3N0YWNrKTogTmV3LgorCShtaXhfcG9vbCk6IFVzZSBpdCBoZXJlIHRvIGJ1cm4gdGhlIHN0YWNrIG9mIHRoZSBtaXhibG9jayBmdW5jdGlvbi4KKworCSogcHJpbWVnZW4uYyAoX2djcnlfZ2VuZXJhdGVfZWxnX3ByaW1lKTogRnJlZWQgcSBhdCAzIHBsYWNlcy4KKwlUaGFua3MgdG8gVG9tbWkgS29tdWxhaW5lbi4KKworCSogYXJjZm91ci5jIChhcmNmb3VyX3NldGtleSk6IENoZWNrIHRoZSBtaW5pbWltIGtleWxlbmd0aCBhZ2FpbnN0CisJYnl0ZXMgYW5kIG5vdCBiaXRzLgorCShzZWxmdGVzdCk6IE11c3QgcmVzZXQgdGhlIGtleSBiZWZvcmUgZGVjcnlwdGlvbi4gCisKKzIwMDEtMDUtMzEgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBzaGExLmMgKHNoYTFfaW5pdCk6IE1hZGUgc3RhdGljLgorCisgICAgICAgIENoYW5nZWQgYWxsIGcxMF8gcHJlZml4ZWQgZnVuY3Rpb24gbmFtZXMgYXMgd2VsbCBhcyBzb21lIG1waV8KKwlmdW5jdGlvbiBuYW1lcyB0byBjb3BlIHdpdGggdGhlIGludHJvZHVjZWQgbmFtaW5nIGNoYW5nZXMuCisJCisJKiBtZC5jIChwcmVwYXJlX21hY3BhZHMpOiBNYWRlIGtleSBjb25zdC4KKworMjAwMS0wNS0yOCAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIHJuZGVnZC5jIChnYXRoZXJfcmFuZG9tKTogUmVtb3ZlZCB0aGUgdXNlIG9mIHR0eV9wcmludGYuCisKKzIwMDEtMDMtMjkgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBtZDUuYyAobWQ1X2ZpbmFsKTogRml4ZWQgY2FsY3VsYXRpb24gb2YgaGFzaGVkIGxlbmd0aC4gIFRoYW5rcworCXRvIGRpc2FzdHJ5QHNhaWtuZXMubHYgZm9yIHBvaW50aW5nIG91dCB0aGF0IGl0IHdhcyBob3JyaWJsZSB3cm9uZworCWZvciBtb3JlIHRoYW4gNTEyTUIgb2YgaW5wdXQuCisJKiBzaGExLmMgKHNoYTFfZmluYWwpOiBEaXR0by4KKwkqIHJtZDE2MC5jIChybWQxNjBfZmluYWwpOiBEaXR0by4KKwkqIHRpZ2VyLmMgKHRpZ2VyX2ZpbmFsKTogRGl0dG8uCisKKwkqIGJsb3dmaXNoLmMgKGVuY3J5cHQsZG9fZW5jcnlwdCk6IENoYW5nZWQgbmFtZSB0byBkb19lbmNyeXB0IHRvCisJYXZvaWQgbmFtZSBjbGFzaGVzIHdpdGggYW4gZW5jcnlwdCBmdW5jdGlvbiBpbiBzdGRsaWIuaCBvZgorCUR5bml4L1BJWC4gIFRoYW5rcyB0byBHZW5lIENhcnRlci4KKwkqIGVsZ2FtYWwuYyAoZW5jcnlwdCxkb19lbmNyeXB0KTogRGl0dG8uCisKKwkqIHR3b2Zpc2guYyAoZ251cGdleHRfZW51bV9mdW5jKTogVXNlIG9ubHkgd2hlbiB3aGVuIGNvbXBpbGVkIGFzIGEKKwltb2R1bGUuCisJKiByaWpuZGFlbC5jIChnbnVwZ2V4dF9lbnVtX2Z1bmMpOiBEaXR0by4KKworCSogdGlnZXIuYyAodGlnZXJfZ2V0X2luZm8pOiBSZXR1cm4gIlRJR0VSMTkyIiBhbmQgbm90IGp1c3QKKwkiVElHRVIiLiAgQnkgRWR3aW4gV291ZHQuCisJCisJKiByYW5kb20uYzogQWx3YXlzIGluY2x1ZGUgdGltZS5oIC0gc3RhbmRhcmQgcmVxdWlyZW1lbnQuICBUaGFua3MKKwl0byBKYW1lcyBUcm91cC4KKworCSogcm5kdzMyLmM6IEZpeGVzIHRvIHRoZSBtYWNyb3MuCisKKzIwMDEtMDEtMTEgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBjaXBoZXIuYyAoY2lwaGVyX2VuY3J5cHQsZ2NyeV9jaXBoZXJfZW5jcnlwdCk6IFVzZSBibG9ja3NpemUgYW5kCisJbm90IDguCisKKzIwMDAtMTItMTkgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisgCU1ham9yIGNoYW5nZToKKwlSZW1vdmVkIGFsbCBHbnVQRyBzdHVmZiBhbmQgcmVuYW1lZCB0aGlzIHBpZWNlIG9mIHNvZnR3YXJlCisJdG8gZ2NyeXB0LiAKKworMjAwMC0xMS0xNCAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIGRzYS5jICh0ZXN0X2tleXMpOiBSZXBsYWNlZCBtcGlfYWxsb2MgYnkgZ2NyeV9tcGlfbmV3IGFuZAorCW1waV9mcmVlIGJ5IGdjcnlfbXBpX3JlbGVhc2UuCisJKiBlbGdhbWFsLmMgKHRlc3Rfa2V5cyxnZW5lcmF0ZSk6IERpdHRvLCBhbHNvIGZvciBtcGlfYWxsb2Nfc2VjdXJlLgorCSogcnNhLmMgKHRlc3Rfa2V5cyxnZW5lcmF0ZSxyc2FfdmVyaWZ5KTogRGl0dG8uCisJKiBwcmltZWdlbi5jIChnZW5lcmF0ZV9lbGdfcHJpbWUpOiBEaXR0by4KKwkoZ2VuX3ByaW1lKTogRGl0dG8gYW5kIHJlbW92ZWQgbmxpbWJzLgorCisJKiByc2EuYyAoZ2VuZXJhdGUpOiBBbGxvY2F0ZSAyIG1vcmUgdmFycyBpbiBzZWN1cmUgbWVtb3J5LgorCisJKiBNYWtlZmlsZS5hbSAoT01JVF9ERVBFTkRFTkNJRVMpOiBIYWNrIHRvIHdvcmsgYXJvdW5kIGRlcGVuZGVuY3kKKwlwcm9ibGVtcy4KKworMjAwMC0xMC0wOSAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIGFyY2ZvdXIuYywgYXJjZm91ci5oOiBOZXcuCisJKiBjaXBoZXIuYyAoY2lwaGVyX2VuY3J5cHQsIGNpcGhlcl9kZWNyeXB0KTogQWRkIHN0cmVhbSBtb2RlLgorCShzZXR1cF9jaXBoZXJfdGFibGUpOiBBZGQgQXJjZm91ci4KKwkoZ2NyeV9jaXBoZXJfb3Blbik6IEtsdWRnZSB0byBhbGxvdyBzdHJlYW0gbW9kZS4KKworV2VkIE9jdCAgNCAxMzoxNjoxOCBDRVNUIDIwMDAgIFdlcm5lciBLb2NoICA8d2tAb3Blbml0LmRlPgorCisgICAgICAgICogc2hhMS5jICh0cmFuc2Zvcm0pOiBVc2Ugcm9sKCkgbWFjcm8uICBBY3R1YWxseSB0aGlzIGlzIG5vdCBuZWVkZWQKKyAgICAgICAgZm9yIGEgbmV3ZXIgZ2NjIGJ1dCB0aGVyZSBhcmUgc3RpbGwgYW90ZXIgY29tcGlsZXJzLgorCisgICAgICAgICogcnNhLmMgKHRlc3Rfa2V5cyk6IFVzZSBuZXcgcmFuZG9tIGZ1bmN0aW9uLiAKKworICAgICAgICAqIG1kLmMgKGdjcnlfbWRfc2V0a2V5KTogTmV3IGZ1bmN0aW9uIHRvIG92ZXJjb21lIHByb2JsZW1zIHdpdGgKKyAgICAgICAgY29uc3QgY29uZmxpY3MuICAKKyAgICAgICAgKGdjcnlfbWRfY3RsKTogUGFzcyBzZXQga2V5IHRvIHRoZSBuZXcgZnVuY3Rpb25zLgorCisgICAgICAgICogcmlqbmRhZWwuYzogTmV3LgorICAgICAgICAqIGNpcGhlci5jOiBBZGQgUmlqbmRhZWwgc3VwcG9ydC4KKworTW9uIFNlcCAxOCAxNjozNTo0NSBDRVNUIDIwMDAgIFdlcm5lciBLb2NoICA8d2tAb3Blbml0LmRlPgorCisgICAgICAgICogcm5kbGludXguYyAob3Blbl9kZXZpY2UpOiBMb29zZSByYW5kb20gZGV2aWNlIGNoZWNraW5nLgorICAgICAgICBCeSBOaWxzIEVsbG1lbnJlaWNoLgorCisgICAgICAgICogcmFuZG9tLmMgKGZhc3RfcmFuZG9tX3BvbGwpOiBDaGVjayBFTk9TWVMgZm9yIGdldHJ1c2FnZS4KKyAgICAgICAgKiBybmR1bml4LmM6ICBBZGQgMiBzb3VyY2VzIGZvciBRTlguIEJ5IFNhbSBSb2JlcnRzLgorCisgICAgICAgICogcHVia2V5LmMgKGdjcnlfcGtfYWxnb19pbmZvKTogQWRkIEdDUllDVExfR0VUX0FMR09fVVNBR0UuCisKKyAgICAgICAgKiByc2EuYzogQ2hhbmdlZCB0aGUgY29tbWVudCBhYm91dCB0aGUgcGF0ZW50LgorICAgICAgICAoc2VjcmV0KTogU3BlZWQgdXAgYnkgdXNpbmcgdGhlIENSVC4gIEZvciBhIDJrIGtleXMgdGhpcworICAgICAgICBpcyBhYm91dCAzIHRpbWVzIGZhc3Rlci4KKyAgICAgICAgKHN0cm9uZ2VyX2tleV9jaGVjayk6IE5ldyBidXQgdW51c2VkIGNvZGUgdG8gY2hlY2sgdGhlIHNlY3JldCBrZXkuCisgICAgICAgICogTWFrZWZpbGUuYW06IEluY2x1ZGVkIHJzYS5bY2hdLgorICAgICAgICAqIHB1YmtleS5jOiBFbmFibGVkIFJTQSBzdXBwb3J0LgorICAgICAgICAocHVia2V5X2dldF9ucGtleSk6IFJlbW92ZWQgUlNBIHdvcmthcm91bmQuCisKK01vbiBKdWwgMzEgMTA6MDQ6NDcgQ0VTVCAyMDAwICBXZXJuZXIgS29jaCAgPHdrQG9wZW5pdC5kZT4KKworICAqIHB1YmtleS5jOiBSZXBsYWNlZCBhbGwgZ2NyeV9zZXhwX3tjYXIsY2RyfV97ZGF0YSxtcGl9IGJ5IHRoZSBuZXcKKyAgZ2NyeV9zZXhwX250aF97ZGF0YSxtcGl9IGZ1bmN0aW9ucy4KKworVHVlIEp1bCAyNSAxNzo0NDoxNSBDRVNUIDIwMDAgIFdlcm5lciBLb2NoICA8d2tAb3Blbml0LmRlPgorCisgICogcHVia2V5LmMgKGV4cF90b19rZXksc2V4cF90b19zaWcsc2V4cF90b19lbmMsZ2NyeV9wa19lbmNyeXB0LAorICAgIGdjcnlfcGtfZGVjcnlwdCxnY3J5X3BrX3NpZ24sZ2NyeV9wa19nZW5rZXkpOiBDaGFuZ2VkIHRvIHdvcmsgd2l0aAorICAgIHRoZSBuZXcgUy1FeHAgaW50ZXJmYWNlLgorCitNb24gSnVsIDE3IDE2OjM1OjQ3IENFU1QgMjAwMCAgV2VybmVyIEtvY2ggIDx3a0A+CisKKyAgKiByYW5kb20uYyAoZ2F0aGVyX2Zha2VkKTogUmVwbGFjZWQgbWFrZV90aW1lc3RhbXAgYnkgdGltZSgyKSBhZ2Fpbi4KKworRnJpIEp1bCAxNCAxOTozODoyMyBDRVNUIDIwMDAgIFdlcm5lciBLb2NoICA8d2tAPgorCisgICogbWQuYyAoZ2NyeV9tZF9jdGwpOiBTdXBwb3J0IEdDUllDVExfe1NUQVJULFNUT1B9X0RVTVAuCisKKyAgKiBNYWtlZmlsZS5hbTogTmV2ZXIgY29tcGlsZSBtaW5ndzMyIGFzIG1vZHVsZS4KKworICAqIE1ha2VmaWxlLmFtOiBUd2Vha2VkIG1vZHVsZSBidWlsZCBhbmQgcmVtb3ZlZCBsaWJ0b29sCisKKyAgKiBNYWtlZmlsZS5hbTogIFJlcGxhY2VkIC1PMSBieSAtTy4gU3VnZ2VzdGVkIGJ5IEFsZWMgSGFiaWcuCisKKyAgKiBlbGdhbWFsLmMgKHNpZ24pOiBSZW1vdmVkIGluYWN0aXZlIGNvZGUuCisKKyAgKiByc2EuYywgcnNhLmg6IE5ldyBiYXNlZCBvbiB0aGUgb2xkIG1vZHVsZSB2ZXJzaW9uIChvbmx5IGluIENWUyBmb3Igbm93KS4KKyAgKiBwdWJrZXkuYyAoc2V0dXBfcHVia2V5X3RhYmxlKTogQWRkZWQgY29tbWVudGVkIHN1cHBvcnQgZm9yIFJTQS4KKworICAqIHJuZHVuaXguYyAod2FpdHBpZCk6IE5ldy4gRm9yIFVUUyAyLjEuICBBbGwgYnkgRGF2ZSBEeWtzdHJhLgorICAobXlfcG9wZW4pOiBEbyB0aGUgRkRfQ0xPRVhFQyBvbmx5IGlmIGl0IGlzIGF2YWlsYWJsZQorICAoc3RhcnRfZ2F0aGVyZXIpOiBDb3BlIHdpdGggbWlzc2luZyBfU0NfT1BFTl9NQVgKKworICAqIHJuZHVuaXguYzogQWRkIHNvbWUgbW9yZSBoZWFkZXJzIGZvciBRTlguIEJ5IFNhbSBSb2JlcnRzLgorCisgICogcm5kZWdkLmMgKGdhdGhlcl9yYW5kb20pOiBTaG9ydGN1dCBsZXZlbCAwLgorICAqIHJuZHVuaXguYyAoZ2F0aGVyX3JhbmRvbSk6IERpdHRvLgorICAqIHJuZHczMi5jIChnYXRoZXJfcmFuZG9tKTogRGl0dG8uCisKKyAgKiBybmR3MzIuYzogUmVwbGFjZWQgd2l0aCBjb2RlIGZyb20gQ3J5cHRsaWIgYW5kIGNvbW1lbnRlZCB0aGUgb2xkIHN0dWZmLgorICAqIHJuZHczMi5jOiBBZGQgc29tZSBkZWJ1Z2luZyBjb2RlIGVuYWJsZWQgYnkgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUuCisKKyAgKiByYW5kb20uYyAocmVhZF9zZWVkX2ZpbGUpOiBCaW5hcnkgb3BlbiBmb3IgRE9TaXNoIHN5c3RlbQorICAodXBkYXRlX3JhbmRvbV9zZWVkX2ZpbGUpOiBEaXR0by4KKyAgKiByYW5kb20uYyBbTUlOR1czMl06IEluY2x1ZGUgcHJvY2Vzcy5oIGZvciBnZXRwaWQuCisgICogcmFuZG9tLmMgKGZhc3RfcmFuZG9tX3BvbGwpOiBBZGQgY2xvY2tfZ2V0dGltZSgpIGFzIGZhbGxiYWNrIGZvcgorICBzeXN0ZW0gd2hpY2ggc3VwcG9ydCB0aGlzIFBPU0lYLjQgZnVjbnRpb24uIEJ5IFNhbSBSb2JlcnRzLgorCisgICogcmFuZG9tLmMgKHJlYWRfc2VlZF9maWxlKTogUmVtb3ZlZCB0aGUgU19JU0xOSyB0ZXN0IGJlY3Vhc2UgaXQKKyAgaXMgYWxyZWFkeSBjb3ZlcmVkIGJ5ICFTX0lTUkVHIGFuZCBpcyBub3QgZGVmaW5lZCBpbiBVbml4d2FyZS4KKyAgUmVwb3J0ZWQgYnkgRGF2ZSBEeWtzdHJhLgorICAodXBkYXRlX3JhbmRvbV9zZWVkX2ZpbGUpOiBTaWxlbnRseSBpZ25vcmUgdXBkYXRlIHJlcXVlc3Qgd2hlbiBwb29sCisgIGlzIG5vdCBmaWxsZWQuCisKKyAgKiByYW5kb20uYyAocmVhZF9zZWVkX2ZpbGUpOiBOZXcuCisgIChzZXRfcmFuZG9tX3NlZWRfZmlsZSk6IE5ldy4KKyAgKHJlYWRfcG9vbCk6IFRyeSB0byByZWFkIHRoZSBzZWVkaW5nIGZpbGUuCisgICh1cGRhdGVfcmFuZG9tX3NlZWRfZmlsZSk6IE5ldy4KKworICAocmVhZF9wb29sKTogRG8gYW4gaW5pdGlhbCBleHRyYSBzZWVkaW5nIHdoZW4gbGV2ZWwgMiBxdWFsaXR5IHJhbmRvbQorICBpcyByZXF1ZXN0ZWQgdGhlIGZpcnN0IHRpbWUuCVRoaXMgcmVxdWVzdGVzIGF0IGxlYXN0IFBPT0xTSVpFLzIgYnl0ZXMKKyAgb2YgZW50cm9weS4gIENvbXBpbmVkIHdpdGggdGhlIHNlZWRpbmcgZmlsZSB0aGlzIHNob3VsZCBtYWtlIG5vcm1hbAorICByYW5kb20gYnl0ZXMgY2hlYXBlciBhbmQgaW5jcmVhc2UgdGhlIHF1YWxpdHkgb2YgdGhlIHJhbmRvbSBieXRlcworICB1c2VkIGZvciBrZXkgZ2VuZXJhdGlvbi4KKworICAqIHJhbmRvbS5jIChyZWFkX3Bvb2wpOiBQcmludCBhIG1vcmUgZnJpZW5kbHkgZXJyb3IgbWVzc2FnZSBpbgorICBjYXNlcyB3aGVuIHRvbyBtdWNoIHJhbmRvbSBpcyByZXF1ZXN0ZWQgaW4gb25lIGNhbGwuCisKKyAgKiByYW5kb20uYyAoZmFzdF9yYW5kb21fcG9sbCk6IENoZWNrIHdoZXRoZXIgUlVTQUdFX1NFTEYgaXMgZGVmaW5lZDsKKyAgdGhpcyBpcyBub3QgdGhlIGNhc2UgZm9yIHNvbWUgRVNJWCBhbmQgVW5peHdhcmUsIGFsdGhvdWdoIHRoZXkgaGF2ZQorICBnZXRydXNhZ2UoKS4KKworICAqIHByaW1lZ2VuLmMgKGdlbmVyYXRlX2VsZ19wcmltZSk6IEFsbCBwcmltZXMgYXJlIG5vdyBnZW5lcmF0ZWQgd2l0aAorICB0aGUgbG93ZXN0IHJhbmRvbSBxdWFsaXR5IGxldmVsLiAgQmVjYXVzZSB0aGV5IGFyZSBwdWJsaWMgYW55d2F5IHdlCisgIGRvbid0IG5lZWQgc3Ryb25nZXIgcmFuZG9tIGFuZCBieSB0aGlzIHdlIGRvIG5vdCBkcmFpbiB0aGUgc3lzdGVtcworICBlbnRyb3B5IHNvIG11Y2guCisKKyAgKiBwcmltZWdlbi5jIChyZWdpc3Rlcl9wcmltZWdlbl9wcm9ncmVzcyk6IE5ldy4KKyAgKiBkc2EuYyAocmVnaXN0ZXJfcGtfZHNhX3Byb2dyZXNzKTogTmV3LgorICAqIGVsZ2FtYWwuYyAocmVnaXN0ZXJfcGtfZWxnX3Byb2dyZXNzKTogTmV3LgorCisgICogZWxnYW1hbC5jICh3aWVuZXJfbWFwKTogTmV3LgorICAoZ2VuX2spOiBVc2UgYSBtdWNoIHNtYWxsZXIgay4KKyAgKGdlbmVyYXRlKTogQ2FsY3VsYXRlIHRoZSBxYml0cyB1c2luZyB0aGUgd2llbmVyIG1hcCBhbmQKKyAgY2hvb3NlIGFuIHggYXQgYSBzaXplIGNvbXBhcmFibGUgdG8gdGhlIG9uZSBjaG9vc2VuIGluIGdlbl9rCisKKyAgKiBybWQxNjAuYyAocm1kMTYwX2dldF9pbmZvKTogTW92ZWQgY2FzdGluZyB0byB0aGUgbGVmdCBzaWRlIGR1ZSB0byBhCisgIHByb2JsZW0gd2l0aCBVVFM0LjMuCVN1Z2dlc3RlZCBieSBEYXZlIER5a3N0cmEuCisgICogc2hhMS5jIChzaGExX2dldF9pbmZvKTogRGl0dG8uCisgICogdGlnZXIuYyAodGlnZXJfZ2V0X2luZm8pOiBEaXR0by4KKyAgKiBtZDUuYyAobWQ1X2dldF9pbmZvKTogRGl0dG8KKyAgKiBkZXMuYyAoZGVzX2dldF9pbmZvKTogRGl0dG8uCisgICogYmxvd2Zpc2guYyAoYmxvd2Zpc2hfZ2V0X2luZm8pOiBEaXR0by4KKyAgKiBjYXN0NS5jIChjYXN0NV9nZXRfaW5mbyk6IERpdHRvLgorICAqIHR3b2Zpc2guYyAodHdvZmlzaF9nZXRfaW5mbyk6IERpdHRvLgorCitGcmkgTWFyIDI0IDExOjI1OjQ1IENFVCAyMDAwICBXZXJuZXIgS29jaCAgPHdrQG9wZW5pdC5kZT4KKworCSogbWQuYyAobWRfb3Blbik6IEFkZCBobWFjIGFyZyBhbmQgYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBwYWRzLgorCShtZF9maW5hbGl6ZSk6IEFkZCBITUFDIHN1cHBvcnQuCisJKG1kX2NvcHkpOiBEaXR0by4KKwkobWRfY2xvc2UpOiBEaXR0by4KKwkoZ2NyeV9tZF9yZXNldCk6IERpdHRvLgorCShnY3J5X21kX2N0bCk6IERpdHRvLgorCShwcmVwYXJlX21hY3BkYXMpOiBOZXcuCisKK01vbiBNYXIgMTMgMTk6MjI6NDYgQ0VUIDIwMDAgIFdlcm5lciBLb2NoICA8d2tAb3Blbml0LmRlPgorCisJKiBtZC5jIChnY3J5X21kX2hhc2hfYnVmZmVyKTogQWRkIHN1cHBvcnQgZm9yIHRoZSBvdGhlciBhbGdvcml0aG1zLgorCitNb24gSmFuIDMxIDE2OjM3OjM0IENFVCAyMDAwICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLmRlPgorCisJKiBnZW5wcmltZS5jIChnZW5lcmF0ZV9lbGdfcHJpbWUpOiBGaXhlZCByZXR1cm5lZCBmYWN0b3JzIHdoaWNoIG5ldmVyCisJd29ya2VkIGZvciBub24tRFNBIGtleXMuCisKK1RodSBKYW4gMjcgMTg6MDA6NDQgQ0VUIDIwMDAgIFdlcm5lciBLb2NoICA8d2tAZ251cGcuZGU+CisKKwkqIHB1YmtleS5jIChzZXhwX3RvX2tleSk6IEZpeGVkIG1lbSBsZWFrcyBpbiBjYXNlIG9mIGVycm9ycy4KKworTW9uIEphbiAyNCAyMjoyNDozOCBDRVQgMjAwMCAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5kZT4KKworCSogcHVia2V5LmMgKGdjcnlfcGtfZGVjcnlwdCk6IEltcGxlbWVudGVkLgorCShnY3J5X3BrX2VuY3J5cHQpOiBJbXBsZW1lbnRlZC4KKwkoZ2NyeV9wa190ZXN0a2V5KTogTmV3LgorCShnY3J5X3BrX2dlbmtleSk6IE5ldy4KKwkocHVia2V5X2RlY3J5cHQpOiBNYWRlIHN0YXRpYy4KKwkocHVia2V5X2VuY3J5cHQpOiBEaXR0by4KKwkocHVia2V5X2NoZWNrX3NlY3JldF9rZXkpOiBEaXR0by4KKwkocHVia2V5X2dlbmVyYXRlKTogRGl0dG8uCisKK01vbiBKYW4gMjQgMTM6MDQ6MjggQ0VUIDIwMDAgIFdlcm5lciBLb2NoICA8d2tAZ251cGcuZGU+CisKKwkqIHB1YmtleS5jIChwdWJrZXlfbmJpdHMpOiBSZW1vdmVkIGFuZCByZXBsYWNlZCBieSAuLi4KKwkoZ2NyeV9wa19nZXRfbmJpdHMpOiB0aGlzIG5ldyBvbmUuCisKK1dlZCBEZWMgIDggMjE6NTg6MzIgQ0VUIDE5OTkgIFdlcm5lciBLb2NoICA8d2tAZ251cGcuZGU+CisKKwkqIGRzYS5jOiBzL21waV9wb3dtL2djcnlfbXBpX3Bvd20vZworCSogZWxnYW1hbC5jOiBEaXR0by4KKwkqIHByaW1lZ2VuLmM6IERpdHRvLgorCisJKiA6IFJlcGxhY2VkIGcxMF9vcHRfdmVyYm9zZSBieSBnMTBfbG9nX3ZlcmJvc2l0eSgpLgorCisJKiBNYWtlZmlsZS5hbSAoSU5DTFVERVMpOiByZW1vdmVkIGludGwsIGFkZCAuLi9nY3J5cHQKKworRnJpIE5vdiAxOSAxNzoxNToyMCBDRVQgMTk5OSAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5kZT4KKworCSogZHlubG9hZC5jIChjbXBfZmlsZW5hbWVzKTogTmV3IHRvIHJlcGxhY2VkIGNvbXBhcmVfZmlsZW5hbWUoKSBpbgorCW1vZHVsZS4KKwkocmVnaXN0ZXJfY2lwaGVyX2V4dGVuc2lvbik6IFJlbW92ZWQgdGhlIHRpbGRlIGV4cGFuc2lvbiBzdHVmZi4KKwkqIHJuZGVnLmMgKG15X21ha2VfZmlsZW5hbWUpOiBOZXcuCisKKwkqIDogUmVwbGFjZWQgaGVhZGVyIHV0aWwuaCBieSBnMTBsaWIuaAorCisJKiByYW5kb20uYyAoZ2F0aGVyX2Zha2VkKTogUmVwbGFjZWQgbWFrZV90aW1lc3RhbXAgYnkgdGltZSgyKS4KKwlEaXNhYmxlZCB3cm5pbmcgcHJpbnRlZCB3aXRoIHR0eV9wcmludGYuCisJKiBybmRsaW51eC5jIChnYXRoZXJfcmFuZG9tKTogQWx3YXlzIHVzZSBmcHJpbnRmIGluc3RlYWQgb2YgdHR5X3h4eDsKKwl0aGlzIHNob3VsZCBiZSByZXBsYWNlZCBieSBhIGNhbGxiYWNrIGZ1bmN0aW9uLgorCisJKiBwcmltZWdlbi5jIChnZW5fcHJpbWUpOiBVc2UgZ2NyeV9tcGlfcmFuZG9taXplLgorCShpc19wcmltZSk6IERpdHRvLgorCSogZWxnYW1hbC5jICh0ZXN0X2tleXMpOiBEaXR0by4KKwkqIGRzYS5jICh0ZXN0X2tleXMpOiBEaXR0by4KKworCSogY2lwaGVyLmMgKGdjcnlfY2lwaGVyX2Nsb3NlKTogRGllIG9uIGludmFsaWQgaGFuZGxlLgorCitNb24gTm92IDE1IDIxOjM2OjAyIENFVCAxOTk5ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLmRlPgorCisJKiBlbGdhbWFsLmMgKGdlbl9rKTogVXNlIHRoZSBuZXcgcmFuZG9tIEFQSS4KKwkoZ2VuZXJhdGUpOiBEaXR0by4KKwkqIGRzYS5jIChnZW5fayk6IERpdHRvLgorCShnZW5lcmF0ZSk6IERpdHRvLgorCitTYXQgTm92IDEzIDE3OjQ0OjIzIENFVCAxOTk5ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLmRlPgorCisJKiBwdWJrZXkuYyAoZGlzYWJsZV9wdWJrZXlfYWxnbyk6IE1hZGUgc3RhdGljLgorCShnY3J5X3BrX2N0bCk6IE5ldy4KKworCSogcmFuZG9tLmMgKGdldF9yYW5kb21fYml0cyk6IFJlbmFtZWQgdG8gLi4uCisJKGdldF9yYW5kb21fYnl0ZXMpOiAuLi4gdGhpcyBhbmQgbWFkZSBzdGF0aWMuCisJKGdjcnlfcmFuZG9tX2J5dGVzKTogTmV3LgorCShnY3J5X3JhbmRvbV9ieXRlc19zZWN1cmUpOiBOZXcuCisJKHJhbmRvbWl6ZV9idWZmZXIpOiBSZW5hbWVkIHRvIC4uLgorCShnY3J5X3JhbmRvbWl6ZSk6IC4uLnRoaXMuCisKKwkqIG1kLmMgKGdjcnlfbWRfaGFzaF9idWZmZXIpOiBOZXcuCisKKwkqIHB1YmtleS5jIChnY3J5X3BrX2FsZ29faW5mbyk6IDQgbmV3IGNvbW1hbmRzLgorCShwdWJrZXlfZ2V0X25wa2V5KTogTWFkZSBzdGF0aWMuCisJKHB1YmtleV9nZXRfbnNrZXkpOiBNYWRlIHN0YXRpYy4KKwkocHVia2V5X2dldF9uc2lnKTogTWFkZSBzdGF0aWMuCisJKHB1YmtleV9nZXRfbmVuYyk6IE1hZGUgc3RhdGljLgorCisJKiBwdWJrZXkuYzogUmVtb3ZlZCBhbGwgRzEwRVJSX3h4eC4KKwkqIGNpcGhlci5jOiBDaGFuZ2VkIGFsbCBHQ1JZRVJSX0lOVl9BTEdPIHRvIEdDUllFUlJfSU5WX0NJUEhFUl9BTEdPLgorCSogbWQuYzogQ2hhbmdlZCBhbGwgR0NSWUVSUl9JTlZfQUxHTyB0byBHQ1JZRVJSX0lOVl9NRF9BTEdPLgorCSogY2FzdDUuYyAoY2FzdF9zZXRrZXkpOiBDaGFuZ2VkIGVycm9jb2RlcyB0byBHQ1JZRVJSX3h4eC4KKwkqIGJsb3dmaXNoLmM6IERpdHRvLgorCSogZGVzLmM6IERpdHRvLgorCSogdHdvZmlzaC5jOiBEaXR0by4KKwkqIGRzYS5jOiBEaXR0by4KKwkqIGVsZ2FtYWwuYzogRGl0dG8uCisKKwkqIGcxMGMuYzogUmVtb3ZlZAorCisJKiBjaXBoZXIuYyAoZ2NyeV9jaXBoZXJfb3Blbik6IFJlcGxhY2VkIGFsbG9jIGZ1bmN0aW9ucyBhbmQgcmV0dXJuIE5VTEwKKwlpZiB3ZSBhcmUgb3V0IG9mIGNvcmUuCisJKiBkeW5sb2FkLmM6IFJlcGxhY2VkIGFsbCBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbnMuCisJKiBtZC5jOiBEaXR0by4KKwkqIHByaW1lZ2VuLmM6IERpdHRvLgorCSogcHVia2V5LmM6IERpdHRvLgorCSogcmFuZG9tLmM6IERpdHRvLgorCSogcm5kdzMyLmM6IERpdHRvLgorCSogZWxnYW1hbC5jOiBEaXR0by4KKwkqIGRzYS5jOiBEaXR0by4KKworVHVlIE9jdCAyNiAxNDoxMDoyMSBDRVNUIDE5OTkgIFdlcm5lciBLb2NoICA8d2tAZ251cGcuZGU+CisKKwkqIGVsZ2FtYWwuYyAoc2lnbik6IEh1Z2ggZm91bmQgc3RyYW5nZSBjb2RlIGhlcmUuIFJlcGxhY2VkIGJ5IEJVRygpLgorCisJKiBjaXBoZXIuYzogTWVyZ2VkIHdpdGggZ2NyeXB0L3N5bWFwaS5jLgorCisJKiBwdWJrZXkuYyAoc3RyaW5nX3RvX3B1YmtleV9hbGdvKTogUmVuYW1lZCBmdW5jdGlvbiB0byAuLi4KKwkoZ2NyeV9wa19tYXBfbmFtZSk6IC4uLiB0aGlzLgorCShwdWJrZXlfYWxnb190b19zdHJpbmcpOiBSZW5hbWVkIGZ1bmN0aW9uIHRvIC4uLgorCShnY3J5X3BrX2FsZ29fbmFtZSk6IC4uLiB0aGlzLgorCShnY3J5X3BrX2FsZ29faW5mbyk6IE5ldy4KKwkqIHB1YmtleS5jOiBNZXJnZWQgd2l0aCBnY3J5cHQvcGthcGkuYy4KKworCSogbWQuYyAobWRfcmVzZXQpOiBDbGVhciBmaW5hbGl6ZWQ7IHRoYW5rcyB0byBVbGYgTW9lbGxlciBmb3IKKwlmaXhpbmcgdGhpcyBidWcuCisKKwkqIG1kLmM6IE1lcmdlZCB3aXRoIGdjcnlwdC9tZGFwaS5jCisKK1dlZCBTZXAgMTUgMTQ6Mzk6NTkgQ0VTVCAxOTk5ICBNaWNoYWVsIFJvdGggPG1yb3RoQG5lc3NpZS5kZT4KKworCSogZGVzLmM6IFZhcmlvdXMgc3BlZWQgaW1wcm92ZW1lbnRzOiBPbmUgYml0IHByZSByb3RhdGlvbgorCSAgdHJpY2sgYWZ0ZXIgaW5pdGlhbCBwZXJtdXRhdGlvbiAoUmljaGFyZCBPdXRlcmJyaWRnZSkuCisJICBGaW5pc2hlZCB0ZXN0IG9mIFNTTGVheSBUcmlwcGxlLURFUyBwYXR0ZXJucy4KKworV2VkIFNlcCAxNSAxNjoyMjoxNyBDRVNUIDE5OTkgIFdlcm5lciBLb2NoICA8d2tAaXNpbC5kLnNodXR0bGUuZGU+CisKKwkqIHJuZHczMi5jOiBOZXcuCisKK01vbiBTZXAgMTMgMTA6NTE6MjkgQ0VTVCAxOTk5ICBXZXJuZXIgS29jaCAgPHdrQGlzaWwuZC5zaHV0dGxlLmRlPgorCisJKiBiaXRoZWxwLmg6IE5ldy4KKwkqIHJtZDE2MC5oLCBzaGExLmgsIG1kNS5oOiBVc2UgdGhlIHJvbCBtYWNybyBmcm9tIGJpdGhlbHAuaAorCitUdWUgU2VwICA3IDE2OjIzOjM2IENFU1QgMTk5OSAgV2VybmVyIEtvY2ggIDx3a0Bpc2lsLmQuc2h1dHRsZS5kZT4KKworCSogTWFrZWZpbGUuYW06IEZpeGVkIHNlZHMgZm9yIGxhdGVzdCBlZ2NjLiBCeSBPbGxpdmllciBSb2JlcnQuCisKK01vbiBTZXAgIDYgMTk6NTk6MDggQ0VTVCAxOTk5ICBXZXJuZXIgS29jaCAgPHdrQGlzaWwuZC5zaHV0dGxlLmRlPgorCisJKiBkZXMuYyAoc2VsZnRlc3QpOiBBZGQgc29tZSB0ZXN0cGF0dGVybgorCitNb24gQXVnIDMwIDIwOjM4OjMzIENFU1QgMTk5OSAgV2VybmVyIEtvY2ggIDx3a0Bpc2lsLmQuc2h1dHRsZS5kZT4KKworCSogY2lwaGVyLmMgKGRvX2NiY19lbmNyeXB0KTogRml4ZWQgc2VyaW91cyBidWcgb2NjdXJpbmcgd2hlbiBub3QgdXNpbmcKKwlpbiBwbGFjZSBlbmNyeXB0aW9uLiBQb2ludGVkIG91dCBieSBGcmFuayBTdGFqYW5vLgorCitNb24gSnVsIDI2IDA5OjM0OjQ2IENFU1QgMTk5OSAgV2VybmVyIEtvY2ggIDx3a0Bpc2lsLmQuc2h1dHRsZS5kZT4KKworCSogbWQ1LmMgKG1kNV9maW5hbCk6IEZpeCBmb3IgYSBTQ08gY3BwIGJ1Zy4KKworVGh1IEp1bCAxNSAxMDoxNTozNSBDRVNUIDE5OTkgIFdlcm5lciBLb2NoICA8d2tAaXNpbC5kLnNodXR0bGUuZGU+CisKKwkqIGVsZ2FtYWwuYyAoZWxnX2NoZWNrX3NlY3JldF9rZXksZWxnX2VuY3J5cHQKKwllbGdfZGVjcnlwdCxlbGdfc2lnbixlbGdfdmVyaWZ5KTogU2FuaXR5IGNoZWNrIG9uIHRoZSBhcmdzLgorCSogZHNhLmMgKGRzYV9jaGVja19zZWNyZXRfa2V5LGRzYV9zaWduLGRzYV92ZXJpZnkpOiBEaXR0by4KKworCSogcHVia2V5LmMgKGRpc2FibGVfcHVia2V5X2FsZ28pOiBOZXcuCisJKGNoZWNrX3B1YmtleV9hbGdvMik6IExvb2sgYXQgZGlzYWJsZWQgYWxnbyB0YWJsZS4KKwkqIGNpcGhlci5jIChkaXNhYmxlX2NpcGhlcl9hbGdvKTogTmV3LgorCShjaGVja19jaXBoZXJfYWxnbyk6IExvb2sgYXQgZGlzYWJsZWQgYWxnbyB0YWJsZS4KKworV2VkIEp1bCAgNyAxMzowODo0MCBDRVNUIDE5OTkgIFdlcm5lciBLb2NoICA8d2tAaXNpbC5kLnNodXR0bGUuZGU+CisKKwkqIE1ha2VmaWxlLmFtOiBTdXBwb3J0IGZvciBsaWJ0b29sLgorCitGcmkgSnVsICAyIDExOjQ1OjU0IENFU1QgMTk5OSAgV2VybmVyIEtvY2ggIDx3a0Bpc2lsLmQuc2h1dHRsZS5kZT4KKworCSogZHNhLmMgKGdlbl9rKTogQ2hhbmdlZCBhbGdvcml0aG0gdG8gY29uc3VtZSBsZXNzIHJhbmRvbSBieXRlcworCSogZWxnYW1hbC5jIChnZW5fayk6IERpdHRvLgorCisJKiByYW5kb20uYyAocmFuZG9tX2R1bXBfc3RhdHMpOiBOZXcuCisKK1RodSBKdWwgIDEgMTI6NDc6MzEgQ0VTVCAxOTk5ICBXZXJuZXIgS29jaCAgPHdrQGlzaWwuZC5zaHV0dGxlLmRlPgorCisJKiBwcmltZWdlbi5jLCBlbGdhbWFsLmMsIGRzYS5jIChwcm9nZXNzKTogTmV3IGFuZCByZXBsYWNlZCBhbGwKKwlmcHV0YyB3aXRoIGEgY2FsbCB0byB0aGlzIGZ1bmN0aW9uLgorCitTYXQgSnVuIDI2IDEyOjE1OjU5IENFU1QgMTk5OSAgV2VybmVyIEtvY2ggIDx3a0Bpc2lsLmQuc2h1dHRsZS5kZT4KKworCSogcm5kZWdkLmMgKGRvX3dyaXRlKTogcy9zc2l6ZV90L2ludC8gZHVlIHRvIFN1bk9TIDQuMSBwcm9icy4KKworCSogY2lwaGVyLmMgKGRvX2NiY19lbmNyeXB0LCBkb19jYmNfZGVjcnlwdCk6IE5ldy4KKworCSogZHlubG9hZC5jIChIQVZFX0RMX1NITF9MT0FEKTogTWFwIGhwdXggQVBJIHRvIGRsb3BlbiAoRGF2ZSBEeWtzdHJhKS4KKwkqIE1ha2VmaWxlLmFtIChpbnN0YWxsLWV4ZWMtaG9vayk6IFJlbW92ZWQuCisKK1N1biBNYXkgMjMgMTQ6MjA6MjIgQ0VTVCAxOTk5ICBXZXJuZXIgS29jaCAgPHdrQGlzaWwuZC5zaHV0dGxlLmRlPgorCisJKiBjaXBoZXIuYyAoc2V0dXBfY2lwaGVyX3RhYmxlKTogRW5hYmxlIFR3b2Zpc2gKKworCSogcmFuZG9tLmMgKGZhc3RfcmFuZG9tX3BvbGwpOiBEaXNhYmxlIHVzZSBvZiB0aW1lcygpIGZvciBtaW5ndzMyLgorCitNb24gTWF5IDE3IDIxOjU0OjQzIENFU1QgMTk5OSAgV2VybmVyIEtvY2ggIDx3a0Bpc2lsLmQuc2h1dHRsZS5kZT4KKworCSogZHlubG9hZC5jIChyZWdpc3Rlcl9pbnRlcm5hbF9jaXBoZXJfZXh0ZW5zaW9uKTogTWlub3IgaW5pdCBmaXguCisKK1R1ZSBNYXkgIDQgMTU6NDc6NTMgQ0VTVCAxOTk5ICBXZXJuZXIgS29jaCAgPHdrQGlzaWwuZC5zaHV0dGxlLmRlPgorCisJKiBwcmltZWdlbi5jIChnZW5fcHJpbWUpOiBSZWFkZGVkIHRoZSBGZXJtYXQgdGVzdC4gRml4ZWQgdGhlIGJ1ZworCXRoYXQgd2UgZGlkbid0IGNvcnJlY3QgZm9yIHN0ZXAgd2hlbiBwYXNzaW5nIHRoZSBwcmltZSB0byB0aGUKKwlSYWJpbi1NaWxsZXIgdGVzdCB3aGljaCBsZWQgdG8gYmFkIHBlcmZvcm1hbmNlIChTdGVmYW4gS2VsbGVyKS4KKwkoY2hlY2tfcHJpbWUpOiBBZGQgYSBmaXJzdCBGZXJtYXQgdGVzdC4KKworU3VuIEFwciAxOCAxMDoxMToyOCBDRVNUIDE5OTkgIFdlcm5lciBLb2NoICA8d2tAaXNpbC5kLnNodXR0bGUuZGU+CisKKwkqIGNpcGhlci5jIChjaXBoZXJfc2V0aXYpOiBBZGQgaXZsZW4gYXJnLCBjaGFuZ2VkIGFsbCBjYWxsZXJzLgorCisJKiByYW5kb20uYyAocmFuZG9taXplX2J1ZmZlcik6IGFsd2F5IHVzZSBzZWN1cmUgbWVtb3J5IGJlY2F1c2UKKwl3ZSBjYW4ndCB1c2UgbV9pc19zZWN1cmUoKSBvbiBhIHN0YXRpY2FsbHkgYWxsb2NhdGVkIGJ1ZmZlci4KKworCSogdHdvZmlzaC5jOiBSZXBsYWNlZCBzb21lIG1hY3JvcyBieSBhIGxvb3AgdG8gcmVkdWNlIHRleHQgc2l6ZS4KKwkqIE1ha2VmaWxlLmFtICh0d29maXNoKTogTm8gbW9yZSBuZWVkIGZvciBzZWQgZWRpdGluZy4KKworRnJpIEFwciAgOSAxMjoyNjoyNSBDRVNUIDE5OTkgIFdlcm5lciBLb2NoICA8d2tAaXNpbC5kLnNodXR0bGUuZGU+CisKKwkqIGNpcGhlci5jIChjaXBoZXJfb3Blbik6IFJldmVyc2VkIHRoZSBjaGFuZ2VzIGZvciBBVVRPX0NGQi4KKworCSogYmxvd2Zpc2guYzogRHJvcHBlZCB0aGUgQmxvd2Zpc2ggMTYwIG1vZGUuCisJKiBjaXBoZXIuYyAoY2lwaGVyX29wZW4pOiBEaXR0by4KKwkoc2V0dXBfY2lwaGVyX3RhYmxlKTogRGl0dG8uICBBbmQgcmVtb3ZlZCBzdXBwb3J0IG9mIHR3b2Zpc2gxMjgKKworV2VkIEFwciAgNyAyMDo1MTozOSBDRVNUIDE5OTkgIFdlcm5lciBLb2NoICA8d2tAaXNpbC5kLnNodXR0bGUuZGU+CisKKwkqIHJhbmRvbS5jIChnZXRfcmFuZG9tX2JpdHMpOiBDYW4gbm93IGhhbmRsZSByZXF1ZXN0cyA+IFBPT0xTSVpFCisKKwkqIGNpcGhlci5jIChjaXBoZXJfb3Blbik6IE5vdyB1c2VzIHN0YW5kYXJkIENGQiBmb3IgYXV0b21vZGUgaWYKKwl0aGUgYmxvY2tzaXplIGlzIGd0IDggKGFjY29yZGluZyB0byByZmMyNDQwKS4KKworCSogdHdvZmlzaC5jOiBBcHBsaWVkIE1hdHRoZXcgU2thbGEncyBwYXRjaGVzIGZvciAyNTYgYml0IGtleS4KKworVHVlIEFwciAgNiAxOTo1ODoxMiBDRVNUIDE5OTkgIFdlcm5lciBLb2NoICA8d2tAaXNpbC5kLnNodXR0bGUuZGU+CisKKwkqIHJhbmRvbS5jIChnZXRfcmFuZG9tX2JpdHMpOiBDYW4gbm93IGhhbmRsZSByZXF1ZXN0cyA+IFBPT0xTSVpFCisKKwkqIGNpcGhlci5jIChjaXBoZXJfb3Blbik6IE5vdyB1c2VzIHN0YW5kYXJkIENGQiBmb3IgYXV0b21vZGUgaWYKKwl0aGUgYmxvY2tzaXplIGlzIGd0IDggKGFjY29yZGluZyB0byByZmMyNDQwKS4KKworU2F0IE1hciAyMCAxMTo0NDoyMSBDRVQgMTk5OSAgV2VybmVyIEtvY2ggIDx3a0Bpc2lsLmQuc2h1dHRsZS5kZT4KKworCSogcm5kbGludXguYyAodHR5X3ByaW50ZikgW0lTX01PRFVMRV06IFJlbW92ZWQuCisKKwkqIHJuZGVnZC5jIChnYXRoZXJfcmFuZG9tKTogU29tZSBmaXhlcy4KKworV2VkIE1hciAxNyAxMzowOTowMyBDRVQgMTk5OSAgV2VybmVyIEtvY2ggIDx3a0Bpc2lsLmQuc2h1dHRsZS5kZT4KKworCSogcm5kZWdkLmMgKGRvX3JlYWQpOiBOZXcuCisJKGdhdGhlcl9yYW5kb20pOiBDaGFuZ2VkIHRoZSBpbXBsZW1lbnRhdGlvbi4KKworTW9uIE1hciAgOCAyMDo0NzoxNyBDRVQgMTk5OSAgV2VybmVyIEtvY2ggIDx3a0Bpc2lsLmQuc2h1dHRsZS5kZT4KKworCSogZHlubG9hZC5jIChETFNZTV9ORUVEU19VTkRFUlNDT1JFKTogUmVuYW1lZC4KKworRnJpIEZlYiAyNiAxNzo1NTo0MSBDRVQgMTk5OSAgV2VybmVyIEtvY2ggIDx3a0Bpc2lsLmQuc2h1dHRsZS5kZT4KKworCSogbWQuYzogTmVhcmx5IGEgdG90YWwgcmV3cm90ZS4KKworV2VkIEZlYiAyNCAxMTowNzoyNyBDRVQgMTk5OSAgV2VybmVyIEtvY2ggIDx3a0Bpc2lsLmQuc2h1dHRsZS5kZT4KKworCSogY2lwaGVyLmMgKGNvbnRleHQpOiBGaXhlZCBhbGlnbm1lbnQKKwkqIG1kLmM6IERpdHRvLgorCisJKiBybmRlZ2QuYzogTmV3CisKK01vbiBGZWIgMjIgMjA6MDQ6MDAgQ0VUIDE5OTkgIFdlcm5lciBLb2NoICA8d2tAaXNpbC5kLnNodXR0bGUuZGU+CisKKwkqIHJuZGVnZC5jOiBOZXcuCisKK1dlZCBGZWIgMTAgMTc6MTU6MzkgQ0VUIDE5OTkgIFdlcm5lciBLb2NoICA8d2tAaXNpbC5kLnNodXR0bGUuZGU+CisKKwkqIE1ha2VmaWxlLmFtOiBNb2R1bGVzIGFyZSBub3cgZmlndXJlZCBvdXQgYnkgY29uZmlndXJlCisJKiBjb25zdHJ1Y3QuYzogTmV3LiBHZW5lcmF0ZWQgYnkgY29uZmlndXJlLiBDaGFuZ2VkIGFsbCBtb2R1bGVzCisJdG8gd29yayB3aXRoIHRoYXQuCisJKiBzaGExLmg6IFJlbW92ZWQuCisJKiBtZDUuaDogUmVtb3ZlZC4KKworCSogdHdvZmlzaC5jOiBDaGFuZ2VkIGludGVyZmFjZSB0byBhbGxvdyBUd29maXNoLzI1NgorCisJKiBybmR1bml4LmMgKHN0YXJ0X2dhdGhlcmVyKTogRGllIG9uIFNJR1BJUEUuCisKK1dlZCBKYW4gMjAgMTg6NTk6NDkgQ0VUIDE5OTkgIFdlcm5lciBLb2NoICA8d2tAaXNpbC5kLnNodXR0bGUuZGU+CisKKwkqIHJuZHVuaXguYyAoZ2F0aGVyX3JhbmRvbSk6IEZpeCB0byBhdm9pZCBpbmZpbml0ZSBsb29wLgorCitTdW4gSmFuIDE3IDExOjA0OjMzIENFVCAxOTk5ICBXZXJuZXIgS29jaCAgPHdrQGlzaWwuZC5zaHV0dGxlLmRlPgorCisJKiBkZXMuYyAoaXNfd2Vha19rZXkpOiBSZXBsYWNlIHN5c3RlbSBtZW1jbXAgZHVlIHRvIGJ1Z3MKKwlpbiBTdW5PUydzIG1lbWNtcC4KKwkoZGVzX2dldF9pbmZvKTogUmV0dXJuIGVycm9yIG9uIGZhaWxlZCBzZWxmdGVzdC4KKwkqIHR3b2Zpc2guYyAodHdvZmlzaF9zZXRrZXkpOiBSZXR1cm4gZXJyb3Igb24gZmFpbGVkIHNlbGZ0ZXN0IG9yCisJaW52YWxpZCBrZXlsZW5ndGguCisJKiBjYXN0NS5jIChjYXN0X3NldGtleSk6IERpdHRvLgorCSogYmxvd2Zpc2guYyAoYmZfc2V0a2V5KTogUmV0dXJuIGVycm9yIG9uIGZhaWxlZCBzZWxmdGVzdC4KKworVHVlIEphbiAxMiAxMToxNzoxOCBDRVQgMTk5OSAgV2VybmVyIEtvY2ggIDx3a0Bpc2lsLmQuc2h1dHRsZS5kZT4KKworCSogcmFuZG9tLmMgKHJhbmRvbV9pc19mYWtlZCk6IE5ldy4KKworCSogdGlnZXIuYzogT25seSBjb21waWxlIGlmIHdlIGhhdmUgdGhlIHU2NCB0eXBlCisKK1NhdCBKYW4gIDkgMTY6MDI6MjMgQ0VUIDE5OTkgIFdlcm5lciBLb2NoICA8d2tAaXNpbC5kLnNodXR0bGUuZGU+CisKKwkqIHJuZHVuaXguYyAoZ2F0aGVyX3JhbmRvbSk6IGNoZWNrIGZvciBzZXR1aWQuCisKKwkqIE1ha2VmaWxlLmFtOiBBZGQgYSB3YXkgdG8gc3RhaWNhbGx5IGxpbmsgcmFuZG9tIG1vZHVsZXMKKworVGh1IEphbiAgNyAxODowMDo1OCBDRVQgMTk5OSAgV2VybmVyIEtvY2ggIDx3a0Bpc2lsLmQuc2h1dHRsZS5kZT4KKworCSogbWQuYyAobWRfc3RvcF9kZWJ1Zyk6IERvIGEgZmx1c2ggZmlyc3QuCisJKG1kX29wZW4pOiBzaXplIG9mIGJ1ZmZlciBub3cgZGVwZW5kcyBvbiB0aGUgc2VjdXJlIHBhcmFtZXRlcgorCitTdW4gSmFuICAzIDE1OjI4OjQ0IENFVCAxOTk5ICBXZXJuZXIgS29jaCAgPHdrQGlzaWwuZC5zaHV0dGxlLmRlPgorCisJKiBybmR1bml4LmMgKHN0YXJ0X2dhdGhlcmVyKTogRml4ZWQgc3R1cGlkID09Lz0gYnVnCisKKzE5OTgtMTItMzEgIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+CisKKwkqIGRlcy5jIChpc193ZWFrX2tleSk6IFJld3JpdGUgbG9vcCBlbmQgY29uZGl0aW9uLgorCitUdWUgRGVjIDI5IDE0OjQxOjQ3IENFVCAxOTk4ICBXZXJuZXIgS29jaCAgPHdrQGlzaWwuZC5zaHV0dGxlLmRlPgorCisJKiByYW5kb20uYzogYWRkIHVuaXN0ZC5oIGZvciBnZXRwaWQoKS4KKwkoUkFORF9NQVgpOiBGYWxsYmFjayB2YWx1ZSBmb3IgU3VuLgorCitXZWQgRGVjIDIzIDE3OjEyOjI0IENFVCAxOTk4ICBXZXJuZXIgS29jaCAgPHdrQGlzaWwuZC5zaHV0dGxlLmRlPgorCisJKiBtZC5jIChtZF9jb3B5KTogUmVzZXQgZGVidWcuCisKK01vbiBEZWMgMTQgMjE6MTg6NDkgQ0VUIDE5OTggIFdlcm5lciBLb2NoICA8d2tAaXNpbC5kLnNodXR0bGUuZGU+CisKKwkqIHJhbmRvbS5jIChyZWFkX3JhbmRvbV9zb3VyY2UpOiBDaGFuZ2VkIHRoZSBpbnRlcmZhY2UgdG8gdGhlCisJcmFuZG9tIGdhdGhlcmluZyBmdW5jdGlvbi4KKwkoZ2F0aGVyX2Zha2VkKTogVXNlIG5ldyBpbnRlcmZhY2UuCisJKiBkeW5sb2FkLmMgKGR5bmxvYWRfZ2V0Zm5jX2Zhc3RfcmFuZG9tX3BvbGwpOiBEaXR0by4KKwkoZHlubG9hZF9nZXRmbmNfZ2F0aGVyX3JhbmRvbSk6IERpdHRvLgorCSogcm5kbGludXguYyAoZ2F0aGVyX3JhbmRvbSk6IERpdHRvLgorCSogcm5kdW5peC5jIChnYXRoZXJfcmFuZG9tKTogRGl0dG8uCisKK1NhdCBEZWMgMTIgMTg6NDA6MzIgQ0VUIDE5OTggIFdlcm5lciBLb2NoICA8d2tAaXNpbC5kLnNodXR0bGUuZGU+CisKKwkqIGR5bmxvYWQuYyAoU1lNQk9MX1ZFUlNJT04pOiBOZXcgdG8gY29wZSB3aXRoIHN5c3RlbSB3aGljaCBuZWVkcworCXVuZGVyc2NvcmVzLgorCisJKiBybmR1bml4LmM6IFJld3JvdGUgbGFyZ2UgcGFydHMKKworVGh1IERlYyAxMCAyMDoxNTozNiBDRVQgMTk5OCAgV2VybmVyIEtvY2ggIDx3a0Bpc2lsLmQuc2h1dHRsZS5kZT4KKworCSogZHlubG9hZC5jIChsb2FkX2V4dGVuc2lvbik6IGluY3JlYXNlZCBuZWVkZWQgdmVyYm9zaXR5IGxldmVsLgorCisJKiByYW5kb20uYyAoZmFzdF9yYW5kb21fcG9sbCk6IEZhbGxiYWNrIHRvIGEgZGVmYXVsdCBmYXN0IHJhbmRvbQorCXBvbGwgZnVuY3Rpb24uCisJKHJlYWRfcmFuZG9tX3NvdXJjZSk6IEFsd2F5cyB1c2UgdGhlIGZha2VkIGVudHJveSBnYXRoZXJlciBpZiBubworCWdhdGhlciBtb2R1bGUgaXMgYXZhaWxhYmxlLgorCSogcm5kbGludXguYyAoZmFzdF9wb2xsKTogUmVtb3ZlZC4KKwkqIHJuZHVuaXguYyAoZmFzdF9wb2xsKTogUmVtb3ZlZC4KKworCitXZWQgTm92IDI1IDEyOjMzOjQxIDE5OTggIFdlcm5lciBLb2NoICAod2tAaXNpbC5kLnNodXR0bGUuZGUpCisKKwkqIHJhbmQtKi5jOiBSZW1vdmVkLgorCSogcm5kbGludXguYyA6IE5ldy4KKwkqIHJuZHVuaXguYyA6IE5ldy4KKwkqIHJhbmRvbS5jIDogUmVzdHJ1Y3R1cmVkIHRoZSBpbnRlcmZhY2UgdG8gdGhlIGdhdGhlciBtb2R1bGVzLgorCShpbnRpYWxpemUpOiBDYWxsIGNvbnN0cnVjdG9yIGZ1bmN0aW9ucworCShyZWFkX3JhZG5vbV9zb3VyY2UpOiBNb3ZlZCB0byBoZXJlLgorCSogZHlubG9hZC5jIChkeW5sb2FkX2dldGZuY19nYXRoZXJfcmFuZG9tKTogTmV3LgorCShkeW5sb2FkX2dldGZuY19mYXN0X3JhbmRvbV9wb2xsKTogTmV3LgorCShyZWdpc3Rlcl9pbnRlcm5hbF9jaXBoZXJfZXh0ZW5zaW9uKTogTmV3LgorCShyZWdpc3Rlcl9jaXBoZXJfZXh0ZW5zaW9uKTogU3VwcG9ydCBvZiBpbnRlcm5hbCBtb2R1bGVzLgorCitTdW4gTm92ICA4IDE3OjQ0OjM2IDE5OTggIFdlcm5lciBLb2NoICAod2tAaXNpbC5kLnNodXR0bGUuZGUpCisKKwkqIHJhbmQtdW5peC5jIChyZWFkX3JhbmRvbV9zb3VyY2UpOiBSZW1vdmVkIHRoZSBhc3NlcnQuCisKK01vbiBPY3QgMTkgMTg6MzQ6MzAgMTk5OCAgbWUsLCwgICh3a0B0b2JvbGQpCisKKwkqIHB1YmtleS5jOiBIYWNrIHRvIGFsbG93IHVzIHRvIGdpdmUgc29tZSBpbmZvIGFib3V0IFJTQSBrZXlzIGJhY2suCisKK1RodSBPY3QgMTUgMTE6NDc6NTcgMTk5OCAgV2VybmVyIEtvY2ggICh3a0Bpc2lsLmQuc2h1dHRsZS5kZSkKKworCSogZHlubG9hZC5jOiBTdXBwb3J0IGZvciBETEQKKworV2VkIE9jdCAxNCAxMjoxMzowNyAxOTk4ICBXZXJuZXIgS29jaCAgKHdrQGlzaWwuZC5zaHV0dGxlLmRlKQorCisJKiByYW5kLXVuaXguYzogTm93IHVzZXMgbmFtZXMgZnJvbSBjb25maWd1cmUgZm9yIC9kZXYvcmFuZG9tLgorCisxOTk4LTEwLTEwICBTTCBCYXVyICA8c3RldmVAYWx0YWlyLnhlbWFjcy5vcmc+CisKKwkqIE1ha2VmaWxlLmFtOiBmaXggc2VkIC1PIHN1YnN0aXR1dGlvbnMgdG8gY2F0Y2ggLU82LCBldGMuCisKK1R1ZSBPY3QgIDYgMTA6MDY6MzIgMTk5OCAgV2VybmVyIEtvY2ggICh3a0Bpc2lsLmQuc2h1dHRsZS5kZSkKKworCSogcmFuZC11bml4LmMgKEhBVkVfR0VUVElNRU9GREFZKTogRml4ZWQgKHdhcyAuLkdFVFRJTUVPRlRJTUUgOi0pCisJKiByYW5kLWR1bW15LmMgKEhBVkVfR0VUVElNRU9GREFZKTogRGl0dG8uCisKK01vbiBTZXAgMjggMTM6MjM6MDkgMTk5OCAgV2VybmVyIEtvY2ggICh3a0Bpc2lsLmQuc2h1dHRsZS5kZSkKKworCSogbWQuYyAobWRfZGlnZXN0KTogTmV3LgorCShtZF9yZXNldCk6IE5ldy4KKworV2VkIFNlcCAyMyAxMjoyNzowMiAxOTk4ICBXZXJuZXIgS29jaCAgKHdrQGlzaWwuZC5zaHV0dGxlLmRlKQorCisJKiB0aWdlci5jIChUSUdFUl9DT05URVhUKTogbW92ZWQgImJ1ZiIsIHNvIHRoYXQgaXQgaXMgNjQgYml0IGFsaWduZWQuCisKK01vbiBTZXAgMjEgMDY6MjI6NTMgMTk5OCAgV2VybmVyIEtvY2ggICh3a0Aobm9uZSkpCisKKwkqIGRlcy5jOiBTb21lIHBhdGNoZXMgZnJvbSBNaWNoYWVsLgorCitUaHUgU2VwIDE3IDE5OjAwOjA2IDE5OTggIFdlcm5lciBLb2NoICAod2tAKG5vbmUpKQorCisJKiBkZXMuYyA6IE5ldyBmaWxlIGZyb20gTWljaGFlbCBSb3RoIDxtcm90aEBuZXNzaWUuZGU+CisKK01vbiBTZXAgMTQgMTE6MTA6NTUgMTk5OCAgV2VybmVyIEtvY2ggICh3a0Aobm9uZSkpCisKKwkqIGJsb3dmaXNoLmMgKGJmX3NldGtleSk6IE5pa2xhcyBIZXJuYWV1cyBwYXRjaCB0byBkZXRlY3Qgd2VhayBrZXlzLgorCitNb24gU2VwIDE0IDA5OjE5OjI1IDE5OTggIFdlcm5lciBLb2NoICAod2tAKG5vbmUpKQorCisJKiBkeW5sb2FkLmMgKFJUTERfTk9XKTogTm93IGRlZmluZWQgdG8gMSBpZiBpdCBpcyB1bmRlZmluZWQuCisKK01vbiBTZXAgIDcgMTc6MDQ6MzMgMTk5OCAgV2VybmVyIEtvY2ggICh3a0Aobm9uZSkpCisKKwkqIE1ha2VmaWxlLmFtOiBGaXhlcyB0byBhbGxvdyBhIGRpZmZlcmVudCBidWlsZCBkaXJlY3RvcnkKKworVGh1IEF1ZyAgNiAxNzoyNTozOCAxOTk4ICBXZXJuZXIgS29jaCxtb2JpbCwsLAkod2tAdG9ib2xkKQorCisJKiByYW5kb20uYyAoZ2V0X3JhbmRvbV9ieXRlKTogUmVtb3ZlZCBhbmQgY2hhbmdlZCBhbGwgY2FsbGVycworCXRvIHVzZSBnZXRfcmFuZG9tX2JpdHMoKQorCitNb24gSnVsIDI3IDEwOjMwOjIyIDE5OTggIFdlcm5lciBLb2NoICAod2tAKG5vbmUpKQorCisJKiBjaXBoZXIuYyA6IFN1cHBvcnQgZm9yIG90aGVyIGJsb2Nrc2l6ZXMKKwkoY2lwaGVyX2dldF9ibG9ja3NpemUpOiBOZXcuCisJKiB0d29maXNoLmM6IE5ldy4KKwkqIE1ha2VmaWxlLmFtOiBBZGQgdHdvZmlzaCBtb2R1bGUuCisKK01vbiBKdWwgMTMgMjE6MzA6NTIgMTk5OCAgV2VybmVyIEtvY2ggICh3a0Bpc2lsLmQuc2h1dHRsZS5kZSkKKworCSogcmFuZG9tLmMgKHJlYWRfcG9vbCk6IFNpbXBsZSBhbGxvYyBpZiBzZWN1cmVfYWxsb2MgaXMgbm90IHNldC4KKwkoZ2V0X3JhbmRvbV9iaXRzKTogRGl0dG8uCisKK1RodSBKdWwgIDkgMTM6MDE6MTQgMTk5OCAgV2VybmVyIEtvY2ggICh3a0Bpc2lsLmQuc2h1dHRsZS5kZSkKKworCSogZHlubG9hZC5jIChsb2FkX2V4dGVuc2lvbik6IEZ1bmN0aW9uIG5vdyBuYmFpbHMgb3V0IGlmCisJdGhlIHByb2dyYW0gaXMgcnVuIHNldHVpZC4KKworV2VkIEp1bCAgOCAxODo1ODoyMyAxOTk4ICBXZXJuZXIgS29jaCAgKHdrQGlzaWwuZC5zaHV0dGxlLmRlKQorCisJKiBybWQxNjAuYyAocm1kMTYwX2hhc2hfYnVmZmVyKTogTmV3LgorCitUaHUgSnVsICAyIDEwOjUwOjMwIDE5OTggIFdlcm5lciBLb2NoICAod2tAaXNpbC5kLnNodXR0bGUuZGUpCisKKwkqIGNpcGhlci5jIChjaXBoZXJfb3Blbik6IGFsZ29zID49MTAwIHVzZSBzdGFuZGFyZCBDRkIKKworVGh1IEp1biAyNSAxMToxODoyNSAxOTk4ICBXZXJuZXIgS29jaCAgKHdrQGlzaWwuZC5zaHV0dGxlLmRlKQorCisJKiBNYWtlZmlsZS5hbTogU3VwcG9ydCBmb3IgZXh0ZW5zaW9ucworCitUaHUgSnVuIDE4IDEyOjA5OjM4IDE5OTggIFdlcm5lciBLb2NoICAod2tAaXNpbC5kLnNodXR0bGUuZGUpCisKKwkqIHJhbmRvbS5jIChtaXhfcG9vbCk6IHNpbXBsZXIgaGFuZGxpbmcgZm9yIGxldmVsIDAKKworTW9uIEp1biAxNSAxNDo0MDo0OCAxOTk4ICBXZXJuZXIgS29jaCAgKHdrQGlzaWwuZC5zaHV0dGxlLmRlKQorCisJKiB0aWdlci5jOiBSZW1vdmVkIGZyb20gZGlzdCwgd2lsbCByZWFwcGVhciBhcyBkeW5sb2FkIG1vZHVsZQorCitTYXQgSnVuIDEzIDE0OjE2OjU3IDE5OTggIFdlcm5lciBLb2NoICAod2tAaXNpbC5kLnNodXR0bGUuZGUpCisKKwkqIHB1YmtleS5jOiBNYWpvciBjaGFuZ2VzIHRvIGFsbG93IGV4dGVuc2lvbnMuIENoYW5nZWQgdGhlIGludGVmYWNlCisJb2YgYWxsIHB1YmxpYyBrZXkgY2lwaGVycyBhbmQgYWRkZWQgdGhlIGFiaWxpdHkgdG8gbG9hZCBleHRlbnNpb25zCisJb24gZGVtYW5kLgorCisJKiBtaXNjLmM6IFJlbW92ZWQuCisKK1dlZCBKdW4gMTAgMDc6NTI6MDggMTk5OCAgV2VybmVyIEtvY2gsbW9iaWwsLCwJKHdrQHRvYm9sZCkKKworCSogZHlubG9hZC5jOiBOZXcuCisJKiBjaXBoZXIuYzogTWFqb3IgY2hhbmdlcyB0byBhbGxvdyBleHRlbnNpb25zLgorCitNb24gSnVuICA4IDIyOjQzOjAwIDE5OTggIFdlcm5lciBLb2NoICAod2tAaXNpbC5kLnNodXR0bGUuZGUpCisKKwkqIGNpcGhlci5jOiBNYWpvciBpbnRlcm5hbCBjaG5hZ2VzIHRvIHN1cHBvcnQgZXh0ZW5zaW9ucy4KKwkqIGJsb3dmaXNoLmMgKGJsb3dmaXNoX2dldF9pbmZvKTogTmV3IGFuZCBtYWRlIGFsbCBpbnRlcm5hbAorCWZ1bmN0aW9ucyBzdGF0aWMsIGNoYW5nZWQgaGVkZXIuCisJKiBjYXN0NS5jIChjYXN0NV9nZXRfaW5mbyk6IExpa2V3aXNlLgorCitNb24gSnVuICA4IDEyOjI3OjUyIDE5OTggIFdlcm5lciBLb2NoICAod2tAaXNpbC5kLnNodXR0bGUuZGUpCisKKwkqIHRpZ2VyLmMgKHRyYW5zZm9ybSk6IEZpeCBmb3IgYmlnIGVuZGlhbgorCisJKiBjaXBoZXIuYyAoZG9fY2ZiX2RlY3J5cHQpOiBCaWcgZW5kaWFuIGZpeC4KKworRnJpIE1heSAyMiAwNzozMDozOSAxOTk4ICBXZXJuZXIgS29jaCAgKHdrQGlzaWwuZC5zaHV0dGxlLmRlKQorCisJKiBtZC5jIChtZF9nZXRfb2lkKTogQWRkIGEgbmV3IG9uZSBmb3IgVElHRVIuCisKK1RodSBNYXkgMjEgMTM6MjQ6NTIgMTk5OCAgV2VybmVyIEtvY2ggICh3a0Bpc2lsLmQuc2h1dHRsZS5kZSkKKworCSogY2lwaGVyLmM6IEFkZCBzdXBwb3J0IGZvciBhIGR1bW15IGNpcGhlcgorCitUaHUgTWF5IDE0IDE1OjQwOjM2IDE5OTggIFdlcm5lciBLb2NoICAod2tAaXNpbC5kLnNodXR0bGUuZGUpCisKKwkqIHJtZDE2MC5jICh0cmFuc2Zvcm0pOiBmaXhlZCBzaWdidXMgLSBJIHNob3VsZCBiZXR0ZXIKKwlhZGQgQ2hyaXN0aWFuIHZvbiBSb3F1ZXMncyBuZXcgaW1wbGVtZW5hdGlvbiBvZiBybWQxNjBfd3JpdGUuCisKK0ZyaSBNYXkgIDggMTg6MDc6NDQgMTk5OCAgV2VybmVyIEtvY2ggICh3a0Bpc2lsLmQuc2h1dHRsZS5kZSkKKworCSogcmFuZC1pbnRlcm5hbC5oLCByYW5kLXVuaXguYywgcmFuZC13MzIuYywgcmFuZF9kdW1teS5jOiBOZXcKKwkqIHJhbmRvbS5jOiBNb3ZlZCBzeXN0ZW0gc3BlY2lmaWMgZnVuY3Rpb25zIHRvIHJhbmQtKioqKi5jCisKK0ZyaSBNYXkgIDggMTQ6MDE6MTcgMTk5OCAgV2VybmVyIEtvY2ggICh3a0Bpc2lsLmQuc2h1dHRsZS5kZSkKKworCSogcmFuZG9tLmMgKGZhc3RfcmFuZG9tX3BvbGwpOiBhZGQgY2FsbCB0byBnZXRocnRpbWUuCisKK1R1ZSBNYXkgIDUgMjE6Mjg6NTUgMTk5OCAgV2VybmVyIEtvY2ggICh3a0Bpc2lsLmQuc2h1dHRsZS5kZSkKKworCSogZWxnYW1hbC5jIChlbGdfZ2VuZXJhdGUpOiBjaG9vc2luZyB4IHdhcyBub3QgY29ycmVjdCwgY291bGQKKwl5aWVsZCA2IGJ5dGVzIHdoaWNoIGFyZSBub3QgZnJvbSB0aGUgcmFuZG9tIHBvb2wsIHRzc3MsIHRzc3MuLgorCitUdWUgTWF5ICA1IDE0OjA5OjA2IDE5OTggIFdlcm5lciBLb2NoICAod2tAaXNpbC5kLnNodXR0bGUuZGUpCisKKwkqIHByaW1lZ2VuLmMgKGdlbmVyYXRlX2VsZ19wcmltZSk6IEFkZCBhcmcgbW9kZSwgY2hhbmdlZCBhbGwKKwljYWxsZXJzIGFuZCBpbXBsZW1lbnRlZCBtb2RlIDEuCisKK01vbiBBcHIgMjcgMTQ6NDE6NTggMTk5OCAgV2VybmVyIEtvY2ggICh3a0Bpc2lsLmQuc2h1dHRsZS5kZSkKKworCSogY2lwaGVyLmMgKGNpcGhlcl9nZXRfa2V5bGVuKTogTmV3LgorCitTdW4gQXByIDI2IDE0OjQ0OjUyIDE5OTggIFdlcm5lciBLb2NoICAod2tAaXNpbC5kLnNodXR0bGUuZGUpCisKKwkqIHRpZ2VyLmMsIHRpZ2VyLmg6IE5ldy4KKworV2VkIEFwciAgOCAxNDo1NzoxMSAxOTk4ICBXZXJuZXIgS29jaCAgKHdrQGlzaWwuZC5zaHV0dGxlLmRlKQorCisJKiBtaXNjLmMgKGNoZWNrX3B1YmtleV9hbGdvMik6IE5ldy4KKworVHVlIEFwciAgNyAxODo0Njo0OSAxOTk4ICBXZXJuZXIgS29jaCAgKHdrQGlzaWwuZC5zaHV0dGxlLmRlKQorCisJKiBjaXBoZXIuYzogTmV3CisJKiBtaXNjLmMgKGNoZWNrX2NpcGhlcl9hbGdvKTogTW92ZWQgdG8gY2lwaGVyLmMKKwkqIGNhc3Q1LmM6IE1vdmVkIG1hbnkgZnVuY3Rpb25zIHRvIGNpcGhlci5jCisJKiBibG93ZmlzaC5jOiBMaWtld2lzZS4KKworU2F0IEFwciAgNCAxOTo1MjowOCAxOTk4ICBXZXJuZXIgS29jaCAgKHdrQGlzaWwuZC5zaHV0dGxlLmRlKQorCisJKiBjYXN0NS5jOiBJbXBsZW1lbnRlZCBhbmQgdGVzdGVkLgorCitXZWQgQXByICAxIDE2OjM4OjI3IDE5OTggIFdlcm5lciBLb2NoICAod2tAaXNpbC5kLnNodXR0bGUuZGUpCisKKwkqIGVsZ2FtYWwuYyAoZWxnX2dlbmVyYXRlKTogRmFzdGVyIGdlbmVyYXRpb24gb2YgeCBpbiBzb21lIGNhc2VzLgorCitUaHUgTWFyIDE5IDEzOjU0OjQ4IDE5OTggIFdlcm5lciBLb2NoICAod2tAaXNpbC5kLnNodXR0bGUuZGUpCisKKwkqIGJsb3dmaXNoLmMgKGJsb3dmaXNoX2RlY29kZV9jZmIpOiBjaGFuZ2VkIFhPUiBvcGVyYXRpb24KKwkoYmxvd2Zpc2hfZW5jb2RlX2NmYik6IERpdHRvLgorCitUaHUgTWFyIDEyIDE0OjA0OjA1IDE5OTggIFdlcm5lciBLb2NoICAod2tAaXNpbC5kLnNodXR0bGUuZGUpCisKKwkqIHNoYTEuYyAodHJhbnNmb3JtKTogUmV3cm90ZQorCisJKiBibG93ZmlzaC5jIChlbmNyeXB0KTogVW5yb2xsZWQgZm9yIHJvdW5kcyA9PSAxNgorCShkZWNyeXB0KTogRGl0dG8uCisKK1R1ZSBNYXIgMTAgMTY6MzI6MDggMTk5OCAgV2VybmVyIEtvY2ggICh3a0Bpc2lsLmQuc2h1dHRsZS5kZSkKKworCSogcm1kMTYwLmMgKHRyYW5zZm9ybSk6IFVucm9sbGVkIHRoZSBsb29wLgorCitUdWUgTWFyIDEwIDEzOjA1OjE0IDE5OTggIFdlcm5lciBLb2NoICAod2tAaXNpbC5kLnNodXR0bGUuZGUpCisKKwkqIHJhbmRvbS5jIChyZWFkX3Bvb2wpOiBBZGQgcG9vbF9iYWxhbmNlIHN0dWZmLgorCShnZXRfcmFuZG9tX2JpdHMpOiBOZXcuCisKKwkqIGVsZ2FtYWwuYyAoZWxnX2dlbmVyYXRlKTogTm93IHVzZXMgZ2V0X3JhbmRvbV9iaXRzIHRvIGdlbmVyYXRlIHguCisKKworVHVlIE1hciAxMCAxMTozMzo1MSAxOTk4ICBXZXJuZXIgS29jaCAgKHdrQGlzaWwuZC5zaHV0dGxlLmRlKQorCisJKiBtZC5jIChtZF9kaWdlc3RfbGVuZ3RoKTogTmV3LgorCitUdWUgTWFyIDEwIDExOjI3OjQxIDE5OTggIFdlcm5lciBLb2NoICAod2tAaXNpbC5kLnNodXR0bGUuZGUpCisKKwkqIGRzYS5jIChkc2FfdmVyaWZ5KTogV29ya3MuCisKK01vbiBNYXIgIDkgMTI6NTk6MDggMTk5OCAgV2VybmVyIEtvY2ggICh3a0Bpc2lsLmQuc2h1dHRsZS5kZSkKKworCSogZHNhLmMsIGRzYS5oOiBSZW1vdmVkIHNvbWUgdW51c2VkIGNvZGUuCisKK1dlZCBNYXIgIDQgMTA6Mzk6MjIgMTk5OCAgV2VybmVyIEtvY2ggICh3a0Bpc2lsLmQuc2h1dHRsZS5kZSkKKworCSogbWQuYyAobWRfb3Blbik6IEFkZCBjYWxsIHRvIGZhc3RfcmFuZG9tX3BvbGwuCisJYmxvd2Zpc2guYyAoYmxvd2Zpc2hfc2V0a2V5KTogRGl0dG8uCisKK1R1ZSBNYXIgIDMgMTM6MzI6NTQgMTk5OCAgV2VybmVyIEtvY2ggICh3a0Bpc2lsLmQuc2h1dHRsZS5kZSkKKworCSogcm1kMTYwLmMgKHJtZDE2MF9taXhibG9jayk6IE5ldy4KKwkqIHJhbmRvbS5jOiBSZXN0cnVjdHVyZWQgdG8gc3RhcnQgd2l0aCBhIG5ldyBSTkcgaW1wbGVtZW50YXRpb24uCisJKiByYW5kb20uaDogTmV3LgorCitNb24gTWFyICAyIDE5OjIxOjQ2IDE5OTggIFdlcm5lciBLb2NoICAod2tAaXNpbC5kLnNodXR0bGUuZGUpCisKKwkqIGdvc3QuYywgZ29zdC5oOiBSZW1vdmVkIGJlY2F1c2UgdGhleSBkaWQgb25seSBjb250YWluIHRyYXNoLgorCitTdW4gTWFyICAxIDE2OjQyOjI5IDE5OTggIFdlcm5lciBLb2NoICAod2tAaXNpbC5kLnNodXR0bGUuZGUpCisKKwkqIHJhbmRvbS5jIChmaWxsX2J1ZmZlcik6IHJlbW92ZWQgZXJyb3IgbWVzc2FnZSBpZiBuID09IC0xLgorCitGcmkgRmViIDI3IDE2OjM5OjM0IDE5OTggIFdlcm5lciBLb2NoICAod2tAaXNpbC5kLnNodXR0bGUuZGUpCisKKwkqIG1kLmMgKG1kX2VuYWJsZSk6IE5vIGluaXQgaWYgY2FsbGVkIHR3aWNlLgorCitUaHUgRmViIDI2IDA3OjU3OjAyIDE5OTggIFdlcm5lciBLb2NoICAod2tAaXNpbC5kLnNodXR0bGUuZGUpCisKKwkqIHByaW1lZ2VuLmMgKGdlbmVyYXRlX2VsZ19wcmltZSk6IENoYW5nZWQgdGhlIHByb2dyZXNzIHByaW50aW5nLgorCShnZW5fcHJpbWUpOiBEaXR0by4KKworVHVlIEZlYiAyNCAxMjoyODo0MiAxOTk4ICBXZXJuZXIgS29jaCAgKHdrQGlzaWwuZC5zaHV0dGxlLmRlKQorCisJKiBtZDUuYywgbWQuNSA6IFJlcGxhY2VkIGJ5IGEgbW9kaWZpZWQgdmVyc2lvbiBvZiBtZDUuYyBmcm9tCisJR05VIHRleHR1dGlscyAxLjIyLgorCitXZWQgRmViIDE4IDE0OjA4OjMwIDE5OTggIFdlcm5lciBLb2NoICAod2tAaXNpbC5kLnNodXR0bGUuZGUpCisKKwkqIG1kLmMsIG1kLmggOiBOZXcgZGVidWdnaW5nIHN1cHBvcnQKKworTW9uIEZlYiAxNiAxMDowODo0NyAxOTk4ICBXZXJuZXIgS29jaCAgKHdrQGlzaWwuZC5zaHV0dGxlLmRlKQorCisJKiBtaXNjLmMgKGNpcGhlcl9hbGdvX3RvX3N0cmluZyk6IE5ldworCShwdWJrZXlfYWxnb190b19zdHJpbmcpOiBOZXcuCisJKGRpZ2VzdF9hbGdvX3RvX3N0cmluZyk6IE5ldy4KKworCisgQ29weXJpZ2h0IDE5OTgsMTk5OSwyMDAwLDIwMDEsMjAwMiwyMDAzLDIwMDQsMjAwNSwyMDA2CisJICAgMjAwNywgMjAwOCwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRoZSBhdXRob3IgZ2l2ZXMKKyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0IGV2ZW4gdGhlCisgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvY2lwaGVyL01ha2VmaWxlLmFtIGIvbGliZ2NyeXB0LTEuNC42L2NpcGhlci9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDcwNDMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L2NpcGhlci9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDgyIEBACisjIE1ha2VmaWxlIGZvciBjaXBoZXIgbW9kdWxlcworIyBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCisjICAgICAgICAgICAgICAgMjAwMywgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorIworIyBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBwcm9kdWNlIE1ha2VmaWxlLmluCisKK0VYVFJBX0RJU1QgPSBNYW5pZmVzdAorCisjIE5lZWQgdG8gaW5jbHVkZSAuLi9zcmMgaW4gYWRkaXRpb24gdG8gdG9wX3NyY2RpciBiZWNhdXNlIGdjcnlwdC5oIGlzCisjIGEgYnVpbHQgaGVhZGVyLgorQU1fQ1BQRkxBR1MgPSAtSS4uL3NyYyAtSSQodG9wX3NyY2Rpcikvc3JjIAorQU1fQ0ZMQUdTID0gJChHUEdfRVJST1JfQ0ZMQUdTKQorCisKK25vaW5zdF9MVExJQlJBUklFUyA9IGxpYmNpcGhlci5sYQorCitHQ1JZUFRfTU9EVUxFUyA9IEBHQ1JZUFRfQ0lQSEVSU0AgQEdDUllQVF9QVUJLRVlfQ0lQSEVSU0AgQEdDUllQVF9ESUdFU1RTQAorCitsaWJjaXBoZXJfbGFfREVQRU5ERU5DSUVTID0gJChHQ1JZUFRfTU9EVUxFUykKK2xpYmNpcGhlcl9sYV9MSUJBREQgPSAkKEdDUllQVF9NT0RVTEVTKQorCitsaWJjaXBoZXJfbGFfU09VUkNFUyA9IFwKK2NpcGhlci5jIHB1YmtleS5jIGFjLmMgbWQuYyBcCitobWFjLXRlc3RzLmMgXAorYml0aGVscC5oICBcCitwcmltZWdlbi5jICBcCitoYXNoLWNvbW1vbi5jIGhhc2gtY29tbW9uLmggXAorcm1kLmgKKworRVhUUkFfbGliY2lwaGVyX2xhX1NPVVJDRVMgPSBcCithcmNmb3VyLmMgXAorYmxvd2Zpc2guYyBcCitjYXN0NS5jIFwKK2NyYy5jIFwKK2Rlcy5jIFwKK2RzYS5jIFwKK2VsZ2FtYWwuYyBcCitlY2MuYyBcCittZDQuYyBcCittZDUuYyBcCityaWpuZGFlbC5jIHJpam5kYWVsLXRhYmxlcy5oIFwKK3JtZDE2MC5jIFwKK3JzYS5jIFwKK3NlZWQuYyBcCitzZXJwZW50LmMgXAorc2hhMS5jIFwKK3NoYTI1Ni5jIFwKK3NoYTUxMi5jIFwKK3RpZ2VyLmMgXAord2hpcmxwb29sLmMgXAordHdvZmlzaC5jIFwKK3JmYzIyNjguYyBcCitjYW1lbGxpYS5jIGNhbWVsbGlhLmggY2FtZWxsaWEtZ2x1ZS5jCisKK2lmIEVOQUJMRV9PX0ZMQUdfTVVOR0lORworb19mbGFnX211bmdpbmcgPSBzZWQgLWUgJ3MvLU9bMi05c10qLy1PMS9nJworZWxzZQorb19mbGFnX211bmdpbmcgPSBjYXQKK2VuZGlmCisKKworIyBXZSBuZWVkIHRvIGxvd2VyIHRoZSBvcHRpbWl6YXRpb24gZm9yIHRoaXMgbW9kdWxlLgordGlnZXIubzogJChzcmNkaXIpL3RpZ2VyLmMKKwlgZWNobyAkKENPTVBJTEUpIC1jICQoc3JjZGlyKS90aWdlci5jIHwgJChvX2ZsYWdfbXVuZ2luZykgYAorCit0aWdlci5sbzogJChzcmNkaXIpL3RpZ2VyLmMKKwlgZWNobyAkKExUQ09NUElMRSkgLWMgJChzcmNkaXIpL3RpZ2VyLmMgfCAkKG9fZmxhZ19tdW5naW5nKSBgCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvY2lwaGVyL01ha2VmaWxlLmluIGIvbGliZ2NyeXB0LTEuNC42L2NpcGhlci9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTA1Y2I4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L2NpcGhlci9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDU3MiBAQAorIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYnkgYXV0b21ha2UgMS4xMC4yIGZyb20gTWFrZWZpbGUuYW0uCisjIEBjb25maWd1cmVfaW5wdXRACisKKyMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAorIyAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKKyMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorIyBQQVJUSUNVTEFSIFBVUlBPU0UuCisKK0BTRVRfTUFLRUAKKworIyBNYWtlZmlsZSBmb3IgY2lwaGVyIG1vZHVsZXMKKyMgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAorIyAgICAgICAgICAgICAgIDIwMDMsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyMKKyMgTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gcHJvZHVjZSBNYWtlZmlsZS5pbgorCitWUEFUSCA9IEBzcmNkaXJACitwa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKK3BrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAorYW1fX2NkID0gQ0RQQVRIPSIkJHtaU0hfVkVSU0lPTisufSQoUEFUSF9TRVBBUkFUT1IpIiAmJiBjZAoraW5zdGFsbF9zaF9EQVRBID0gJChpbnN0YWxsX3NoKSAtYyAtbSA2NDQKK2luc3RhbGxfc2hfUFJPR1JBTSA9ICQoaW5zdGFsbF9zaCkgLWMKK2luc3RhbGxfc2hfU0NSSVBUID0gJChpbnN0YWxsX3NoKSAtYworSU5TVEFMTF9IRUFERVIgPSAkKElOU1RBTExfREFUQSkKK3RyYW5zZm9ybSA9ICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKK05PUk1BTF9JTlNUQUxMID0gOgorUFJFX0lOU1RBTEwgPSA6CitQT1NUX0lOU1RBTEwgPSA6CitOT1JNQUxfVU5JTlNUQUxMID0gOgorUFJFX1VOSU5TVEFMTCA9IDoKK1BPU1RfVU5JTlNUQUxMID0gOgorYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKK2hvc3RfdHJpcGxldCA9IEBob3N0QAorc3ViZGlyID0gY2lwaGVyCitESVNUX0NPTU1PTiA9ICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuaW4gQ2hhbmdlTG9nCitBQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00CithbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9tNC9saWJ0b29sLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L25vZXhlY3N0YWNrLm00ICQodG9wX3NyY2RpcikvbTQvb25jZW9ubHkubTQgXAorCSQodG9wX3NyY2RpcikvbTQvc29ja2xlbi5tNCAkKHRvcF9zcmNkaXIpL200L3N5c19zb2NrZXRfaC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2luY2x1ZGUubTQgJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuYWMKK2FtX19jb25maWd1cmVfZGVwcyA9ICQoYW1fX2FjbG9jYWxfbTRfZGVwcykgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKSBcCisJJChBQ0xPQ0FMX000KQorbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycworQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9jb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0KK0xUTElCUkFSSUVTID0gJChub2luc3RfTFRMSUJSQVJJRVMpCithbV9fREVQRU5ERU5DSUVTXzEgPQorYW1fbGliY2lwaGVyX2xhX09CSkVDVFMgPSBjaXBoZXIubG8gcHVia2V5LmxvIGFjLmxvIG1kLmxvIFwKKwlobWFjLXRlc3RzLmxvIHByaW1lZ2VuLmxvIGhhc2gtY29tbW9uLmxvCitsaWJjaXBoZXJfbGFfT0JKRUNUUyA9ICQoYW1fbGliY2lwaGVyX2xhX09CSkVDVFMpCitERUZBVUxUX0lOQ0xVREVTID0gLUkuQGFtX19pc3JjQCAtSSQodG9wX2J1aWxkZGlyKQorZGVwY29tcCA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvZGVwY29tcAorYW1fX2RlcGZpbGVzX21heWJlID0gZGVwZmlsZXMKK0NPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgXAorCSQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKK0xUQ09NUElMRSA9ICQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSBcCisJLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpIFwKKwkkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCitDQ0xEID0gJChDQykKK0xJTksgPSAkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgXAorCS0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0xERkxBR1MpIFwKKwkkKExERkxBR1MpIC1vICRACitTT1VSQ0VTID0gJChsaWJjaXBoZXJfbGFfU09VUkNFUykgJChFWFRSQV9saWJjaXBoZXJfbGFfU09VUkNFUykKK0RJU1RfU09VUkNFUyA9ICQobGliY2lwaGVyX2xhX1NPVVJDRVMpICQoRVhUUkFfbGliY2lwaGVyX2xhX1NPVVJDRVMpCitFVEFHUyA9IGV0YWdzCitDVEFHUyA9IGN0YWdzCitESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQorQUNMT0NBTCA9IEBBQ0xPQ0FMQAorQU1UQVIgPSBAQU1UQVJACitBUiA9IEBBUkAKK0FTID0gQEFTQAorQVVUT0NPTkYgPSBAQVVUT0NPTkZACitBVVRPSEVBREVSID0gQEFVVE9IRUFERVJACitBVVRPTUFLRSA9IEBBVVRPTUFLRUAKK0FXSyA9IEBBV0tACitCVUlMRF9GSUxFVkVSU0lPTiA9IEBCVUlMRF9GSUxFVkVSU0lPTkAKK0JVSUxEX1JFVklTSU9OID0gQEJVSUxEX1JFVklTSU9OQAorQlVJTERfVElNRVNUQU1QID0gQEJVSUxEX1RJTUVTVEFNUEAKK0NDID0gQENDQAorQ0NBUyA9IEBDQ0FTQAorQ0NBU0RFUE1PREUgPSBAQ0NBU0RFUE1PREVACitDQ0FTRkxBR1MgPSBAQ0NBU0ZMQUdTQAorQ0NERVBNT0RFID0gQENDREVQTU9ERUAKK0NGTEFHUyA9IEBDRkxBR1NACitDUFAgPSBAQ1BQQAorQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACitDWFggPSBAQ1hYQAorQ1hYQ1BQID0gQENYWENQUEAKK0NYWERFUE1PREUgPSBAQ1hYREVQTU9ERUAKK0NYWEZMQUdTID0gQENYWEZMQUdTQAorQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKK0RFRlMgPSBAREVGU0AKK0RFUERJUiA9IEBERVBESVJACitETExUT09MID0gQERMTFRPT0xACitETF9MSUJTID0gQERMX0xJQlNACitFQ0hPID0gQEVDSE9ACitFQ0hPX0MgPSBARUNIT19DQAorRUNIT19OID0gQEVDSE9fTkAKK0VDSE9fVCA9IEBFQ0hPX1RACitFR1JFUCA9IEBFR1JFUEAKK0VYRUVYVCA9IEBFWEVFWFRACitGNzcgPSBARjc3QAorRkFMTEJBQ0tfU09DS0xFTl9UID0gQEZBTExCQUNLX1NPQ0tMRU5fVEAKK0ZGTEFHUyA9IEBGRkxBR1NACitHQ1JZUFRfQ0lQSEVSUyA9IEBHQ1JZUFRfQ0lQSEVSU0AKK0dDUllQVF9ESUdFU1RTID0gQEdDUllQVF9ESUdFU1RTQAorR0NSWVBUX1BVQktFWV9DSVBIRVJTID0gQEdDUllQVF9QVUJLRVlfQ0lQSEVSU0AKK0dDUllQVF9SQU5ET00gPSBAR0NSWVBUX1JBTkRPTUAKK0dQR19FUlJPUl9DRkxBR1MgPSBAR1BHX0VSUk9SX0NGTEFHU0AKK0dQR19FUlJPUl9DT05GSUcgPSBAR1BHX0VSUk9SX0NPTkZJR0AKK0dQR19FUlJPUl9MSUJTID0gQEdQR19FUlJPUl9MSUJTQAorR1JFUCA9IEBHUkVQQAorSU5TVEFMTCA9IEBJTlNUQUxMQAorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKK0lOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACitJTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKK0lOU1RBTExfU1RSSVBfUFJPR1JBTSA9IEBJTlNUQUxMX1NUUklQX1BST0dSQU1ACitMREZMQUdTID0gQExERkxBR1NACitMSUJHQ1JZUFRfQ0lQSEVSUyA9IEBMSUJHQ1JZUFRfQ0lQSEVSU0AKK0xJQkdDUllQVF9DT05GSUdfQVBJX1ZFUlNJT04gPSBATElCR0NSWVBUX0NPTkZJR19BUElfVkVSU0lPTkAKK0xJQkdDUllQVF9DT05GSUdfQ0ZMQUdTID0gQExJQkdDUllQVF9DT05GSUdfQ0ZMQUdTQAorTElCR0NSWVBUX0NPTkZJR19MSUJTID0gQExJQkdDUllQVF9DT05GSUdfTElCU0AKK0xJQkdDUllQVF9ESUdFU1RTID0gQExJQkdDUllQVF9ESUdFU1RTQAorTElCR0NSWVBUX0xUX0FHRSA9IEBMSUJHQ1JZUFRfTFRfQUdFQAorTElCR0NSWVBUX0xUX0NVUlJFTlQgPSBATElCR0NSWVBUX0xUX0NVUlJFTlRACitMSUJHQ1JZUFRfTFRfUkVWSVNJT04gPSBATElCR0NSWVBUX0xUX1JFVklTSU9OQAorTElCR0NSWVBUX1BVQktFWV9DSVBIRVJTID0gQExJQkdDUllQVF9QVUJLRVlfQ0lQSEVSU0AKK0xJQkdDUllQVF9USFJFQURfTU9EVUxFUyA9IEBMSUJHQ1JZUFRfVEhSRUFEX01PRFVMRVNACitMSUJPQkpTID0gQExJQk9CSlNACitMSUJTID0gQExJQlNACitMSUJUT09MID0gQExJQlRPT0xACitMTl9TID0gQExOX1NACitMVExJQk9CSlMgPSBATFRMSUJPQkpTQAorTUFJTlQgPSBATUFJTlRACitNQUtFSU5GTyA9IEBNQUtFSU5GT0AKK01LRElSX1AgPSBATUtESVJfUEAKK01QSV9TRkxBR1MgPSBATVBJX1NGTEFHU0AKK05PRVhFQ1NUQUNLX0ZMQUdTID0gQE5PRVhFQ1NUQUNLX0ZMQUdTQAorT0JKRFVNUCA9IEBPQkpEVU1QQAorT0JKRVhUID0gQE9CSkVYVEAKK1BBQ0tBR0UgPSBAUEFDS0FHRUAKK1BBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAorUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKK1BBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAorUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKK1BBQ0tBR0VfVVJMID0gQFBBQ0tBR0VfVVJMQAorUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKK1BBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAorUFRIX0NGTEFHUyA9IEBQVEhfQ0ZMQUdTQAorUFRIX0NPTkZJRyA9IEBQVEhfQ09ORklHQAorUFRIX0xJQlMgPSBAUFRIX0xJQlNACitSQU5MSUIgPSBAUkFOTElCQAorUkMgPSBAUkNACitTRVRfTUFLRSA9IEBTRVRfTUFLRUAKK1NIRUxMID0gQFNIRUxMQAorU1RSSVAgPSBAU1RSSVBACitTWVNfU09DS0VUX0ggPSBAU1lTX1NPQ0tFVF9IQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorYWJzX2J1aWxkZGlyID0gQGFic19idWlsZGRpckAKK2Fic19zcmNkaXIgPSBAYWJzX3NyY2RpckAKK2Fic190b3BfYnVpbGRkaXIgPSBAYWJzX3RvcF9idWlsZGRpckAKK2Fic190b3Bfc3JjZGlyID0gQGFic190b3Bfc3JjZGlyQAorYWNfY3RfQ0MgPSBAYWNfY3RfQ0NACithY19jdF9DWFggPSBAYWNfY3RfQ1hYQAorYWNfY3RfRjc3ID0gQGFjX2N0X0Y3N0AKK2FtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAorYW1fX2xlYWRpbmdfZG90ID0gQGFtX19sZWFkaW5nX2RvdEAKK2FtX19xdW90ZSA9IEBhbV9fcXVvdGVACithbV9fdGFyID0gQGFtX190YXJACithbV9fdW50YXIgPSBAYW1fX3VudGFyQAorYmluZGlyID0gQGJpbmRpckAKK2J1aWxkID0gQGJ1aWxkQAorYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACitidWlsZF9jcHUgPSBAYnVpbGRfY3B1QAorYnVpbGRfb3MgPSBAYnVpbGRfb3NACitidWlsZF92ZW5kb3IgPSBAYnVpbGRfdmVuZG9yQAorYnVpbGRkaXIgPSBAYnVpbGRkaXJACitkYXRhZGlyID0gQGRhdGFkaXJACitkYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKK2RvY2RpciA9IEBkb2NkaXJACitkdmlkaXIgPSBAZHZpZGlyQAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACitob3N0ID0gQGhvc3RACitob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACitob3N0X2NwdSA9IEBob3N0X2NwdUAKK2hvc3Rfb3MgPSBAaG9zdF9vc0AKK2hvc3RfdmVuZG9yID0gQGhvc3RfdmVuZG9yQAoraHRtbGRpciA9IEBodG1sZGlyQAoraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAoraW5mb2RpciA9IEBpbmZvZGlyQAoraW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAorbGliZGlyID0gQGxpYmRpckAKK2xpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKK2xvY2FsZWRpciA9IEBsb2NhbGVkaXJACitsb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACittYW5kaXIgPSBAbWFuZGlyQAorbWtkaXJfcCA9IEBta2Rpcl9wQAorb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAorcGRmZGlyID0gQHBkZmRpckAKK3ByZWZpeCA9IEBwcmVmaXhACitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACitwc2RpciA9IEBwc2RpckAKK3NiaW5kaXIgPSBAc2JpbmRpckAKK3NoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAorc3JjZGlyID0gQHNyY2RpckAKK3N5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKK3RhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACit0b3BfYnVpbGRfcHJlZml4ID0gQHRvcF9idWlsZF9wcmVmaXhACit0b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorRVhUUkFfRElTVCA9IE1hbmlmZXN0CisKKyMgTmVlZCB0byBpbmNsdWRlIC4uL3NyYyBpbiBhZGRpdGlvbiB0byB0b3Bfc3JjZGlyIGJlY2F1c2UgZ2NyeXB0LmggaXMKKyMgYSBidWlsdCBoZWFkZXIuCitBTV9DUFBGTEFHUyA9IC1JLi4vc3JjIC1JJCh0b3Bfc3JjZGlyKS9zcmMgCitBTV9DRkxBR1MgPSAkKEdQR19FUlJPUl9DRkxBR1MpCitub2luc3RfTFRMSUJSQVJJRVMgPSBsaWJjaXBoZXIubGEKK0dDUllQVF9NT0RVTEVTID0gQEdDUllQVF9DSVBIRVJTQCBAR0NSWVBUX1BVQktFWV9DSVBIRVJTQCBAR0NSWVBUX0RJR0VTVFNACitsaWJjaXBoZXJfbGFfREVQRU5ERU5DSUVTID0gJChHQ1JZUFRfTU9EVUxFUykKK2xpYmNpcGhlcl9sYV9MSUJBREQgPSAkKEdDUllQVF9NT0RVTEVTKQorbGliY2lwaGVyX2xhX1NPVVJDRVMgPSBcCitjaXBoZXIuYyBwdWJrZXkuYyBhYy5jIG1kLmMgXAoraG1hYy10ZXN0cy5jIFwKK2JpdGhlbHAuaCAgXAorcHJpbWVnZW4uYyAgXAoraGFzaC1jb21tb24uYyBoYXNoLWNvbW1vbi5oIFwKK3JtZC5oCisKK0VYVFJBX2xpYmNpcGhlcl9sYV9TT1VSQ0VTID0gXAorYXJjZm91ci5jIFwKK2Jsb3dmaXNoLmMgXAorY2FzdDUuYyBcCitjcmMuYyBcCitkZXMuYyBcCitkc2EuYyBcCitlbGdhbWFsLmMgXAorZWNjLmMgXAorbWQ0LmMgXAorbWQ1LmMgXAorcmlqbmRhZWwuYyByaWpuZGFlbC10YWJsZXMuaCBcCitybWQxNjAuYyBcCityc2EuYyBcCitzZWVkLmMgXAorc2VycGVudC5jIFwKK3NoYTEuYyBcCitzaGEyNTYuYyBcCitzaGE1MTIuYyBcCit0aWdlci5jIFwKK3doaXJscG9vbC5jIFwKK3R3b2Zpc2guYyBcCityZmMyMjY4LmMgXAorY2FtZWxsaWEuYyBjYW1lbGxpYS5oIGNhbWVsbGlhLWdsdWUuYworCitARU5BQkxFX09fRkxBR19NVU5HSU5HX0ZBTFNFQG9fZmxhZ19tdW5naW5nID0gY2F0CitARU5BQkxFX09fRkxBR19NVU5HSU5HX1RSVUVAb19mbGFnX211bmdpbmcgPSBzZWQgLWUgJ3MvLU9bMi05c10qLy1PMS9nJworYWxsOiBhbGwtYW0KKworLlNVRkZJWEVTOgorLlNVRkZJWEVTOiAuYyAubG8gLm8gLm9iagorJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJQGZvciBkZXAgaW4gJD87IGRvIFwKKwkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAorCSAgICAqJCRkZXAqKSBcCisJICAgICAgKCBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2ggKSBcCisJICAgICAgICAmJiB7IGlmIHRlc3QgLWYgJEA7IHRoZW4gZXhpdCAwOyBlbHNlIGJyZWFrOyBmaTsgfTsgXAorCSAgICAgIGV4aXQgMTs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUgIGNpcGhlci9NYWtlZmlsZSc7IFwKKwljZCAkKHRvcF9zcmNkaXIpICYmIFwKKwkgICQoQVVUT01BS0UpIC0tZ251ICBjaXBoZXIvTWFrZWZpbGUKKy5QUkVDSU9VUzogTWFrZWZpbGUKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwlAY2FzZSAnJD8nIGluIFwKKwkgICpjb25maWcuc3RhdHVzKikgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2g7OyBcCisJICAqKSBcCisJICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSknOyBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKKwllc2FjOworCiskKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKworJCh0b3Bfc3JjZGlyKS9jb25maWd1cmU6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCiskKEFDTE9DQUxfTTQpOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKworY2xlYW4tbm9pbnN0TFRMSUJSQVJJRVM6CisJLXRlc3QgLXogIiQobm9pbnN0X0xUTElCUkFSSUVTKSIgfHwgcm0gLWYgJChub2luc3RfTFRMSUJSQVJJRVMpCisJQGxpc3Q9JyQobm9pbnN0X0xUTElCUkFSSUVTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgZGlyPSJgZWNobyAkJHAgfCBzZWQgLWUgJ3N8L1teL10qJCR8fCdgIjsgXAorCSAgdGVzdCAiJCRkaXIiICE9ICIkJHAiIHx8IGRpcj0uOyBcCisJICBlY2hvICJybSAtZiBcIiQke2Rpcn0vc29fbG9jYXRpb25zXCIiOyBcCisJICBybSAtZiAiJCR7ZGlyfS9zb19sb2NhdGlvbnMiOyBcCisJZG9uZQorbGliY2lwaGVyLmxhOiAkKGxpYmNpcGhlcl9sYV9PQkpFQ1RTKSAkKGxpYmNpcGhlcl9sYV9ERVBFTkRFTkNJRVMpIAorCSQoTElOSykgICQobGliY2lwaGVyX2xhX09CSkVDVFMpICQobGliY2lwaGVyX2xhX0xJQkFERCkgJChMSUJTKQorCittb3N0bHljbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLiQoT0JKRVhUKQorCitkaXN0Y2xlYW4tY29tcGlsZToKKwktcm0gLWYgKi50YWIuYworCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvYWMuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9hcmNmb3VyLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvYmxvd2Zpc2guUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9jYW1lbGxpYS1nbHVlLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvY2FtZWxsaWEuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9jYXN0NS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2NpcGhlci5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2NyYy5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2Rlcy5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2RzYS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2VjYy5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2VsZ2FtYWwuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9oYXNoLWNvbW1vbi5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2htYWMtdGVzdHMuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9tZC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL21kNC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL21kNS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3ByaW1lZ2VuLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcHVia2V5LlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcmZjMjI2OC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3Jpam5kYWVsLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcm1kMTYwLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcnNhLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvc2VlZC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3NlcnBlbnQuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9zaGExLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvc2hhMjU2LlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvc2hhNTEyLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvdGlnZXIuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS90d29maXNoLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvd2hpcmxwb29sLlBsb0BhbV9fcXVvdGVACisKKy5jLm86CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ09NUElMRSkgLWMgJDwKKworLmMub2JqOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCBgJChDWUdQQVRIX1cpICckPCdgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ09NUElMRSkgLWMgYCQoQ1lHUEFUSF9XKSAnJDwnYAorCisuYy5sbzoKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoTFRDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCAkPAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUGxvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTFRDT01QSUxFKSAtYyAtbyAkQCAkPAorCittb3N0bHljbGVhbi1saWJ0b29sOgorCS1ybSAtZiAqLmxvCisKK2NsZWFuLWxpYnRvb2w6CisJLXJtIC1yZiAubGlicyBfbGlicworCitJRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkgJChUQUdTX0ZJTEVTKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCW1raWQgLWZJRCAkJHVuaXF1ZQordGFnczogVEFHUworCitUQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCXRhZ3M9OyBcCisJaGVyZT1gcHdkYDsgXAorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCR0YWdzJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAorCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAorCSAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAorCSAgICAkJHRhZ3MgJCR1bmlxdWU7IFwKKwlmaQorY3RhZ3M6IENUQUdTCitDVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwl0YWdzPTsgXAorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwl0ZXN0IC16ICIkKENUQUdTX0FSR1MpJCR0YWdzJCR1bmlxdWUiIFwKKwkgIHx8ICQoQ1RBR1MpICQoQ1RBR1NGTEFHUykgJChBTV9DVEFHU0ZMQUdTKSAkKENUQUdTX0FSR1MpIFwKKwkgICAgICQkdGFncyAkJHVuaXF1ZQorCitHVEFHUzoKKwloZXJlPWAkKGFtX19jZCkgJCh0b3BfYnVpbGRkaXIpICYmIHB3ZGAgXAorCSAgJiYgY2QgJCh0b3Bfc3JjZGlyKSBcCisJICAmJiBndGFncyAtaSAkKEdUQUdTX0FSR1MpICQkaGVyZQorCitkaXN0Y2xlYW4tdGFnczoKKwktcm0gLWYgVEFHUyBJRCBHVEFHUyBHUlRBR1MgR1NZTVMgR1BBVEggdGFncworCitkaXN0ZGlyOiAkKERJU1RGSUxFUykKKwlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJdG9wc3JjZGlyc3RyaXA9YGVjaG8gIiQodG9wX3NyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCWxpc3Q9JyQoRElTVEZJTEVTKSc7IFwKKwkgIGRpc3RfZmlsZXM9YGZvciBmaWxlIGluICQkbGlzdDsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBcCisJICBzZWQgLWUgInN8XiQkc3JjZGlyc3RyaXAvfHw7dCIgXAorCSAgICAgIC1lICJzfF4kJHRvcHNyY2RpcnN0cmlwL3wkKHRvcF9idWlsZGRpcikvfDt0ImA7IFwKKwljYXNlICQkZGlzdF9maWxlcyBpbiBcCisJICAqLyopICQoTUtESVJfUCkgYGVjaG8gIiQkZGlzdF9maWxlcyIgfCBcCisJCQkgICBzZWQgJy9cLy8hZDtzfF58JChkaXN0ZGlyKS98O3MsL1teL10qJCQsLCcgfCBcCisJCQkgICBzb3J0IC11YCA7OyBcCisJZXNhYzsgXAorCWZvciBmaWxlIGluICQkZGlzdF9maWxlczsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJGZpbGUgfHwgdGVzdCAtZCAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAorCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKKwkgICAgZGlyPWBlY2hvICIvJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKKwkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCisJICAgICAgY3AgLXBSICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKSQkZGlyIHx8IGV4aXQgMTsgXAorCSAgICBmaTsgXAorCSAgICBjcCAtcFIgJCRkLyQkZmlsZSAkKGRpc3RkaXIpJCRkaXIgfHwgZXhpdCAxOyBcCisJICBlbHNlIFwKKwkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorY2hlY2stYW06IGFsbC1hbQorY2hlY2s6IGNoZWNrLWFtCithbGwtYW06IE1ha2VmaWxlICQoTFRMSUJSQVJJRVMpCitpbnN0YWxsZGlyczoKK2luc3RhbGw6IGluc3RhbGwtYW0KK2luc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCitpbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQordW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KKworaW5zdGFsbC1hbTogYWxsLWFtCisJQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KKworaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stYW0KK2luc3RhbGwtc3RyaXA6CisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKKwkgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAorCSAgYHRlc3QgLXogJyQoU1RSSVApJyB8fCBcCisJICAgIGVjaG8gIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciYCBpbnN0YWxsCittb3N0bHljbGVhbi1nZW5lcmljOgorCitjbGVhbi1nZW5lcmljOgorCitkaXN0Y2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKKworbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgorCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKKwlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCitjbGVhbjogY2xlYW4tYW0KKworY2xlYW4tYW06IGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBjbGVhbi1ub2luc3RMVExJQlJBUklFUyBcCisJbW9zdGx5Y2xlYW4tYW0KKworZGlzdGNsZWFuOiBkaXN0Y2xlYW4tYW0KKwktcm0gLXJmIC4vJChERVBESVIpCisJLXJtIC1mIE1ha2VmaWxlCitkaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIFwKKwlkaXN0Y2xlYW4tdGFncworCitkdmk6IGR2aS1hbQorCitkdmktYW06CisKK2h0bWw6IGh0bWwtYW0KKworaW5mbzogaW5mby1hbQorCitpbmZvLWFtOgorCitpbnN0YWxsLWRhdGEtYW06CisKK2luc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1hbQorCitpbnN0YWxsLWV4ZWMtYW06CisKK2luc3RhbGwtaHRtbDogaW5zdGFsbC1odG1sLWFtCisKK2luc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLWFtCisKK2luc3RhbGwtbWFuOgorCitpbnN0YWxsLXBkZjogaW5zdGFsbC1wZGYtYW0KKworaW5zdGFsbC1wczogaW5zdGFsbC1wcy1hbQorCitpbnN0YWxsY2hlY2stYW06CisKK21haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tYW0KKwktcm0gLXJmIC4vJChERVBESVIpCisJLXJtIC1mIE1ha2VmaWxlCittYWludGFpbmVyLWNsZWFuLWFtOiBkaXN0Y2xlYW4tYW0gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljCisKK21vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1hbQorCittb3N0bHljbGVhbi1hbTogbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1nZW5lcmljIFwKKwltb3N0bHljbGVhbi1saWJ0b29sCisKK3BkZjogcGRmLWFtCisKK3BkZi1hbToKKworcHM6IHBzLWFtCisKK3BzLWFtOgorCit1bmluc3RhbGwtYW06CisKKy5NQUtFOiBpbnN0YWxsLWFtIGluc3RhbGwtc3RyaXAKKworLlBIT05ZOiBDVEFHUyBHVEFHUyBhbGwgYWxsLWFtIGNoZWNrIGNoZWNrLWFtIGNsZWFuIGNsZWFuLWdlbmVyaWMgXAorCWNsZWFuLWxpYnRvb2wgY2xlYW4tbm9pbnN0TFRMSUJSQVJJRVMgY3RhZ3MgZGlzdGNsZWFuIFwKKwlkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tbGlidG9vbCBcCisJZGlzdGNsZWFuLXRhZ3MgZGlzdGRpciBkdmkgZHZpLWFtIGh0bWwgaHRtbC1hbSBpbmZvIGluZm8tYW0gXAorCWluc3RhbGwgaW5zdGFsbC1hbSBpbnN0YWxsLWRhdGEgaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZHZpIFwKKwlpbnN0YWxsLWR2aS1hbSBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtaHRtbCBcCisJaW5zdGFsbC1odG1sLWFtIGluc3RhbGwtaW5mbyBpbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1tYW4gXAorCWluc3RhbGwtcGRmIGluc3RhbGwtcGRmLWFtIGluc3RhbGwtcHMgaW5zdGFsbC1wcy1hbSBcCisJaW5zdGFsbC1zdHJpcCBpbnN0YWxsY2hlY2sgaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIFwKKwltYWludGFpbmVyLWNsZWFuIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBcCisJbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wgXAorCXBkZiBwZGYtYW0gcHMgcHMtYW0gdGFncyB1bmluc3RhbGwgdW5pbnN0YWxsLWFtCisKKworIyBXZSBuZWVkIHRvIGxvd2VyIHRoZSBvcHRpbWl6YXRpb24gZm9yIHRoaXMgbW9kdWxlLgordGlnZXIubzogJChzcmNkaXIpL3RpZ2VyLmMKKwlgZWNobyAkKENPTVBJTEUpIC1jICQoc3JjZGlyKS90aWdlci5jIHwgJChvX2ZsYWdfbXVuZ2luZykgYAorCit0aWdlci5sbzogJChzcmNkaXIpL3RpZ2VyLmMKKwlgZWNobyAkKExUQ09NUElMRSkgLWMgJChzcmNkaXIpL3RpZ2VyLmMgfCAkKG9fZmxhZ19tdW5naW5nKSBgCisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvY2lwaGVyL01hbmlmZXN0IGIvbGliZ2NyeXB0LTEuNC42L2NpcGhlci9NYW5pZmVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2Q2NGY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L2NpcGhlci9NYW5pZmVzdApAQCAtMCwwICsxLDczIEBACisjIE1hbmlmZXN0IC0gY2hlY2tzdW1zIG9mIHRoZSBjaXBoZXIgZGlyZWN0b3J5CisjIENvcHlyaWdodCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisjCisjIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBnZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorCisjIENoZWNrc3VtcyBmb3IgYWxsIHNvdXJjZSBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeS4gRm9ybWF0IGlzCisjIGZpbGVuYW1lLCBibGFua3MsIGJhc2UtNjQgcGFydCBvZiBhbiBPcGVuUEdQIGRldGFjaGVkIHNpZ25hdHVyZQorIyB3aXRob3V0IHRoZSBoZWFkZXIgbGluZXMuICBCbGFuayBsaW5lcyBhbmQgbGluZXMgYmVnaW5uaW5nIHdpdGggYQorIyBoYXNoIG1hcmsgYXJlIGlnbm9yZWQuICBBIHRvb2wgdG8gcHJvY2VzcyB0aGlzIGZpbGUgaXMgYXZhaWxhYmxlIGJ5CisjIGN2cyAtZCA6cHNlcnZlcjphbm9uY3ZzQGN2cy5nbnVwZy5vcmc6L2N2cy93ayBjbyBtaXNjLXNjcmlwdHMvbWFuaWZlc3QtdG9vbAorIworIyBUaGUgc3BlY2lhbCBlbnRyeSAiJG5hbWVzJCIgaG9sZHMgYSBzaWduYXR1cmUgb3ZlciBhbGwgc29ydGVkCisjIGZpbGVuYW1lcyBleGNsdWRpbmcgaXRzZWxmLgorCisKKyMgQWxnb3JpdGhtIEFQSQorY2lwaGVyLmMgaVFDVkF3VUFRRHpyVmpFQW5wODMyUy83QVFJUERnUCtPVkovWU5XWTVtN2MwOUVCYlBBekwvV3NHb2o2d3JCTk1ta1JsTU9xVEhlaCtPT3RqdUZIdDFmOXVoZk0yTnpsN3NKNStoNHJ5WktMRVptUVBSTVRaVG5BcWt2R2RzckpXSm5pZ1VBOVF3WWRWME9OcUM5QzYzZ3B1RzQ2NWdPOVRaVk9xbFF1L0ZUeFNSdVRRWVV1bGthQk5HNzFuOG5aRU91c0JWd1YyWUE9PTU4eEgKK3B1YmtleS5jIGlRQ1ZBd1VBUDlYUTNqRUFucDgzMlMvN0FRSjVVZ1FBeUhmRUJ2UFZKOHdUUmc4YzdpeFMyR2lWbUlnd0lvNXR2UWFpUUpUUFdBU2V2dllyQisyWjJxYTljQVR5dTUwQUNqTHpiYXF1R0JnUHpqSlYzZFUvcXR0VDFnQ3FSdU4vTENOdlhGZTVxbklaZXplamMzUkFhZEZOVHcvcE9USHEwd3hEMUtlZzY2cnVlaTlSMzZOYmE1OXBFUUlXSUJYVGZ1YlJmdDJoTVlrPT1FMDl0CithYy5jIGlRQ1ZBd1VBUUR6c096RUFucDgzMlMvN0FRSkNCUVAvV0k2RVYvZHNSNHJtaGE2UlZodmtqWm8xN2tROHo2cElsNUozY1hPdnFFa0lGZUQySFl1M0hIcldTVDVsN3lYbGZmaHBEa1ZIa2ZNaWg0cnVLNzZxNkZtMGR4Wjk4cE80Qy9kVnRnaW1sdnZjeS93T1FqcHpzRTBmWUFlMUJZZGc4MUxKMDlYMzN2VzV4NkMyOWx1bmZLUk9PMnRQbFY1aThmZmVvRnZtTUY4PT1qMjZnCittZC5jIGlRQ1ZBd1VBUCtORkdqRUFucDgzMlMvN0FRSnM4d1AvUWRrMEVBS3N5cjNPMS9wbU9TTjhBRzRyUEtiZDZLRFR6dm9CUEFONHVwRndLWVk0aFd3dnkxMlEzWVU5RG1FQ3J6WmtSQ1hIUjdtbGpWUUtzNkI3Q1JaSktqRkttT0VMcGNKRHRLdnU0MHZUczFiT0g0azlpSllacEdnUkE4M25rUStFTEFjcGhBYkNBK0tJcFZyMks0bUNKQUIwRmhwQzJ1T1E1MEpIQWtvPT1CZUY2CitwcmltZWdlbi5jIGlRQ1ZBd1VBUUR6c29ERUFucDgzMlMvN0FRS1lSd1AvVHFBUUJtMXJIVG5GMEhZRTA1UHFYZldsT3FhNkVvc3FWcGFPY3MvT0lXNlBhcVgweEgxVWxydWtLN2pOT2pLM3hDNG8xcU5RMVVLenoyZHZRYXExYk12Tk5pemVhdnhBaDEwU0paYzBoSWMvb2ZjODNJYmpMaDhTWlZXUTY3Snhqc1VkM0RPWG1TbWhQWitQcWQ3Y1VJaXc4ZkRvRitJOUVacXkzQ091MXdZPT0xZWJUCisKKyMgQWxnb3JpdGhtIGltcGxlbWVudGF0aW9ucworYXJjZm91ci5jIGlRQ1ZBd1VBUDlYUi9URUFucDgzMlMvN0FRSmNSd1A2QWx2WUV4KytmcFQ0bUlZbzB4UkRxS0VRZXFNUXZiYVJoSWcyZVY3NEp4SXRwSGEzcTVZc1lJbCtuMXlVejVnMzVKUldXWFNXbUFaQndPNXdMS3NIaWk0a1JVaGdyS1duU29RWm9QcGw0OUw1K04zUjU4T04zUzBydTVsc0JpRUpFemUzeHBsZjJ2cXdySDl2MVFIVkQrZ1U3VVRsZk5xcklKb09VWE4rMU80PT1UcSt4CitibG93ZmlzaC5jIGlRQ1ZBd1VBUDlYVEVURUFucDgzMlMvN0FRSmFFZ1FBZ2lxcWZ1Tyt6UXRzY2dUQjBydk96VnltSUtqUktqWWhGdUxqVnVjNzlHNHoxUkNBZmZ2SW4vWU0yZDdrdCtaL1FGN3pqY1RBT2dFVENRTDFYb2twWDJ6ejlIUEFNaTJ0bERZNXpzRHVmVE5xajBuNFdCTDluTTd3NlhBdnNpd1AxQjNicUNUdjlTakpWNEtieEo1OHZ3MXlRRStzcVc3NFIvUUlIRnZDN21VPT13Wm5YCitjYXN0NS5jIGlRQ1ZBd1VBUDlYVDZERUFucDgzMlMvN0FRSjN4Z1AvZWhMakVOM0dFTEd1ZGJxZW85MVhkK1BxaXRIcmt1QmJ0UklZWDdVZGQvZnlYTE4raDhyTUpWeUlRWDJtK21weGJCeHVkVlUzeDgvRE5UOEIwWkhBd0s2cXFKbUVCTExoRVlQZ0l1Rjc2aTlMTXJQMUtxVVBoQXdSWjJPcHBqSUl1Z0JRK3JQNzRhRDRlTHlkL2FLUUhOdVhNTDhRR1dSNkt3UVNob2hYTTVJPT0vQlJoCitjcmMuYyBpUUNWQXdVQVA3b3VlakVBbnA4MzJTLzdBUUlnd1FRQXBnNU5tNjN0SDVEUWtiTit6UHpNTzlZZ29qM3VreGZGVHlUQlBZU1hZS01pVGpFYkVTZWdhVTQwdU44am56MnZwcmNJUVdjZ1pmek80K29wRUpNY0kzNWFQd3pFazB2S09wMFMvUHJCTFVZMnJKZm5EVmtYNVhnSkZaYTJRN0xMZTgyNlVFQnpUVllXOTI0dXRpQ0NlOG9PYU9FV1ZOcGcxbXFka251M005bz09a3o1RAorZGVzLmMgaVFDVkF3VUFRQ04yb0RFQW5wODMyUy83QVFML2p3UDZBdW9xNm5aQ0RCanBnYzl0RHp1SVJ3YTlEcXl1TTNnWDk0dXZnRXBVd2RIc3piMmJHNDNkejAza1ZtY1l4dGoxTXpYYnlDZUNaT3dveDBiMlNLbUxneElick5QNnlHYnpWZFRqNjU5MmdEWXVmL1pYbWMxWk5KMUREbGRjUFEwbjlmWFVpcFVQd3lQYU5XbzNtU1phTmNNS1NXV3pkSzBKNmNpRzZuazdTV0k9PTlrL3QKK2RzYS5jIGlRQ1ZBd1VBUDlYWkhERUFucDgzMlMvN0FRTEJSZ1AvWHJCelRFWXg1Y2NNajFNTWI2c2czN2xpRUhkSXl5eTQ5emp2dDZqVXF4ajRSdXdWRU44UzZ2M3U0cS9ReUprSEFpMUUwRWtSRWdFTmx5SFc2UEtXaFliY3JkMHZQSUFOMTV5am5sMnlxdHJDckpJbWV4VUNvcUpKZXdLMEU0Sk9pY0diYWJUaWw4TVpqayttYmhFUG5qSkJxT2t5UDF3MGkzMXBFRGdFLzhNPT1wQzhzCitlbGdhbWFsLmMgaVFDVkF3VUFQOVhiWXpFQW5wODMyUy83QVFMWGFnUUEzSHJ2c3BaZmJUR2dtVUgwSXFMUVRKMGV4VVB4SnY1REVUMlR2b0l5NjJ0ckRtTU42bFRBajVQK2E3alE4dWRjdTB3K21SMnZYVUhjeFVwTkEyUHhMYU13R3pOU1k0elJETmU5cjNTRlREckZtNm00eTlLbzJlOFh0RUErV0Y2UC9YTHBjazRKbjd2TUVEbVZHUHdrTmQyMmtYRkZFOGRCR3dHNmk1SGsxTWs9PW9CVXMKK21kNC5jIGlRQ1ZBd1VBUDloNTBERUFucDgzMlMvN0FRSmhIZ1FBek5BL0I2TVdGRGxDdFBrSVZhVzhScFAxRWcwWk5Nc3kwczdTSmtvcE9DQmx1NkN3WFVPS2UrOHBwY1N4aGpZS2g0aTR1UXIvUXRmaXBZbEJqektKR25yYWZvRi9OdWdYTkNPSFNUR1QxMVR2SzdtQ2lCdVVNVmd2WkdBbE9KSW1rNmVUVGZValJyTWZhWE0vU1dsOGJkSjRacHpkakV5Vmg4OXI3STVKckdrPT14MlVECittZDUuYyBpUUNWQXdVQVA5aDdMekVBbnA4MzJTLzdBUUpVR1FQL2MwY2JmNldaWEN6bWp1Zkh4aUU5RkFRQnpUc0EwV3RhTnFkRmNIbDdmaG1pa0d0a25sYUVEOG41YTdlWWQvQzQ4MVVRVzZXZ3Evb1pkc3Znb1BXUGhHM2ZPQ3kyQ0ZQOWNaVlhJVHVNU2YwdWN5WlRGVUpOTzE1Zm5aK25EZnNVditKUGR2MWFTZVJpbkFVdGZBY1NLZmtTeVI5QkNQWnZreCt0Z1U2Y3BoVT09WnYraAorcmlqbmRhZWwuYyBpUUNWQXdVQVA5aDljVEVBbnA4MzJTLzdBUUtGMUFQK1AyTC90UHFESlJEZysvZndiT2s4VHMwTU54bnZ2WUVtM2dFNzNUS3VMdDFTK0IyK2prclpjS052TTVWR1BuVk1KYm5TMGxtSUswNG5tZWRIQ09mdEdUT3doR3VsWkFISElhS0d5c3RUM0pxbDRpUHdzL0pNZ0FqRTdGeXhoNVdaTXRCOXlFbGpLQnBKNVhOcWhyTXZ2eGNIcG55UDMrWXpJWE53emszNFYrYz09ZEo1aworcm1kMTYwLmMgaVFDVkF3VUFQOWgrYlRFQW5wODMyUy83QVFLMU9nUCtQTktGNk56aTZYOTNlYXNWbGtzZExxS0VzQXJDQXcyUWpHV0RHeXhUbmJpSk01NXFBbDlKeFIxbW4zVitvT0w3aXpMTHdUdDZFWUs5ZXZoemZjeFk1TjVNbmk4NVJBY3NMUHN1QWZRREV6akk2R1VXSHRRVUtQYk0rQmFvcnpmaFFqWUZTWnl2dW0vZFpZSi9XZml3d3docXFJS3lWVTJaRlNxQTM4WUdDL2M9PTlqZEEKK3JzYS5jIGlRQ1ZBd1VBUDlpSEl6RUFucDgzMlMvN0FRS0FZd1FBdVd0bk10ZTU0UUhOK0hpajl0NHNHdXlwWG9nYWpPYjF2UVF3R2dTMGZLc2FCWnN1U1AyYW16ZTRvNWRpSXZzUVRzRlE0Q3pqdnFvQ1Z1QkRvSE0zeGtTRDh3R0Rpemd2dENhbUF4a2RiRjd3bXpsZEtGbjhTcEpxbFZ3V1FNUDZrazFJalhIRXVZYjRJRFdHVGJWTWhmRXUrZU9sVTgrUFNLNEloWnFOdnQ0PT0vM2hwCitzZXJwZW50LmMgaVFDVkF3VUFQOWgvVnpFQW5wODMyUy83QVFMeUN3UC9kMXpibWI3bC9QcmlaTmE5L1o3bW8wMVhGZTVNbkFxQ2ZJd2hsOUdqZWFNc3pjb1MzN2pFQ05xNW5MdnJUVEZJSUpwbTNydkJlUHdpQ0c0V3d4MUkxOEhDeGFQMTk4cGNTYVIrQkxPSjNBajUyRVpQcnh0cWxES3VGcjM4Wk9QNWdpeVVxVVlWWUdWZHJ6NGtSTU5XQVpRSzUzR2VKbkdoWENuaHhvakxFZ0E9PWNrNDYKK3NoYTEuYyBpUUNWQXdVQVA5aUFUVEVBbnA4MzJTLzdBUUtjU3dRQXdBcy9Ibk5xaG8zbFUxWlVnQ1BOdDVQMi9Ccm02VzIxK3dXV0dLSmtTcnJhL2M0TllWS0pHRER3bHNGRTBiOWxuMXVadDdiSFJlRmtLWEszSm5yS1RtTlZjeC9DeTY0aUNNUk5NaGFNNzJNcXk3d1d4NXlIQkFtTUJ4ekZHbk5RS2JtZVk1MnplR2loNUhzTkxTaWJjMnBQdU9WaVdvMkpQSjVDaS93SXdsOD09L3d0Tworc2hhMjU2LmMgaVFDVkF3VUFQOWlBdHpFQW5wODMyUy83QVFKRDJRUC9VcXZMMGhoakcxd0VGYkdyZGtWOXRiYTFzTURYZG5uSzZYN0hkTHVScFZBZ05pUWlGZjhKRG1udGQvZFoyUTcxcDRVYWUyY3RxdmU0V29FaWpQVVpQakFDbnB1WmZ4MFNFUUwwbFFCa3d4ekpwN2x6OXVqVnR3UTJjTS9hWWV4SmtYY1dnR2Nsb0pOTE0zSmJXUEdJSm51WWJyL0l3SjZSUUY5dmdqMDM1N289PVVXTzEKK3NoYTUxMi5jIGlRQ1ZBd1VBUDlpQlRERUFucDgzMlMvN0FRSVBCQVFBMjhDSlNVUUxpVzBzMng5dTgvT0gyZUtueFBqQTRzWm1iNTBXUDc5MjBMZW02NlAzMUMzQnJPcXdmQm90NFJMaGpMK3poLytVYzRzM0hQd0FwWnVqOUU0QnhOTWxxTHYrVHFrKytEQWJkYU9lWVQ0amVVdCttbGhRUTZtSC9SRHN5MzJyWnNOc0dRMmJVR3hhelptZkcrK1BMM0p5aGF3cUN5MDBTVURyL28wPT1IKzBYCit0aWdlci5jIGlRQ1ZBd1VBUDlpQ2ZqRUFucDgzMlMvN0FRS3Vmd1AvZnJ5djNNcVNPWVkrOTAzMjVESDdYMy9DdGVreGVvb04wc2NHc0hYMGZ4QmFrV1NNZWNUTnJqMzNLUGRkTFM0NmdVL1M4OXpJYzJOL0J3LzdFVklBWFZGQTMvM0lwK09yRk91SU1PNFB5MXNDZEI4bzJZKzV5Z3Y4aVhMY3NYSXExTzBhdjc5aTlnNzc0VjN1YVhhMnFOOVpuWGUwQUVoY3k4RkhKMmkvd3JvPT01WFZCCit0d29maXNoLmMgaVFDVkF3VUFQOWlENlRFQW5wODMyUy83QVFLVW5RUC9ScThGYVllSFRHN0hiWnVxQXM5cGJQaXR6akRia2RaZGRtSW5XUjdObWV2QmtLdmhzSkFMalZvb2MwS0dRZm8ybEFBbXkzWGkvNFFRTjhWUG41MURWakRJZ2Y3eCtEUWgvOVRGSkhNY2N4STlhc1VnaTQrVE5ubU1xTFUxazNOOFMyUGp5WjFzamVDOEI3OWZLUHB3Q3pqNzJXa3FQa3padzNsMmpBcnIrZFU9PU5kSlQKK3JmYzIyNjguYyBpUUNWQXdVQVFDTiszakVBbnA4MzJTLzdBUUx2MWdRQTFoSmgyOWhBaktpNHVMU0d4WHZKNmN5WW1QZG1ldmRLcmJMbnVIWld0SGU0eHZDZ3kvblRkRW9qRXB4Z0xwL2hML29nYXN1V1JDMVcxNldpejlyeXhmN1lSMHVoWldheU8vYlFOYWdwZlU1TUlrSlRMdUtxcWdwd1l1bUNTUWZPdWdYVkFxY2dFemorMTNlZXlKYUZWcnp3ck5hNjdzaDg0bm1iak9qTmp2RT09MHpCcQorCisjIFJhbmRvbSBudW1iZXIgcmVsYXRlZAorcmFuZG9tLmMgaVFDVkF3VUFQN25zSVRFQW5wODMyUy83QVFLNFNBUUF0dmZVZ3J0R09RMlBseEdNbGEwcUpMUEhqSmFjTXdncTBlY3VzaUk3OWVsUGREc0ZmQ0NrNmRLMVVnMmtGYk5tMjJuQ0dITmNVcXVxYlg3bm9pN1pWUW5tUEJRWHp5TE5aZDdHbXJhd1JaZmRsUmVyVFVEQnBTblI4Vjh1aS81K1lZcDYyN0U3a0tHQzBoUFNncVhGcWw2b0JNSWZubzBMWndGSlRqSWV2Ulk9PUw0MTkKK3JhbmRvbS5oIGlRQ1ZBd1VBUDdvdktERUFucDgzMlMvN0FRSjNiUVFBam5QZWJueVRDN3NwaEF2Mkk3dUl6K3lQZ3cxWmZiVmhMditPaVdEbE85aXNoK2ZSeXlNcHkrSEVMQk9nWmpKZGdSZWdxaGxaQzZxeW5zNWFyTS9WZ2xZaStQenZkTE8zaElxSEUvWUZmcElGUHo4d0JyY21scXJZeWQzQ3NHcWNZc2Zqb2NYTnR0Q0JMZVNXbW9KMDlsdEtRSDh5ekpmM29BZ042WDF5dWM0PT1lTm9VCityYW5kLWludGVybmFsLmggaVFDVkF3VUFQN291dkRFQW5wODMyUy83QVFMWW5BUUFoZEk3RVJvSlZDa1Y4R2lWN01qYVV4djFXSUw3aVoraklPdlZodjRmTnloQ0dDR29FdFRqa3lwdXQvbGo3TnNoM0ZYRXFSaHlwR0dyQ0xmNDd4L2d1YTVuK0J3ZmZvZ3hWeVVEcWlPeXlHaE5UUHBlM2ZRY05CdmJQQ3Rjbzh5TUs0R0pPNUczQnF6bFB5TitCTWVvZ0x5bXlWNlNtMW12aDVMWkR5QUZiZlE9PXRaU0UKK3JuZGxpbnV4LmMgaVFDVkF3VUFQOWlQWVRFQW5wODMyUy83QVFMNi9BUC9aRHJiT2tWdUI5cUo3c0tlWDFNSW1aRXN6M21pMHhQb3ZKemFCdEJVN2EwaWRjVUtyV1lPdlFGV1JsTFVlcTBpQ1Q2K2gybDVibmlQN3E3aGVwemxLYStWUFk5VldhUXRocWVKbTJsNUxONlFRNVB5TWZCcTA0UXVCbmN3OUJKbkNHbUV5VEx0M1J4SVhCQVBkeG1pVnh0Y1JJRlVxQ0J0UXZvVVhHTHZlbXc9PXQzN2sKK3JuZGVnZC5jIGlRQ1ZBd1VBUDlpUFJERUFucDgzMlMvN0FRSW1CUVAvV0hLZytoS1hjbTFwUXZpbHpNTDBqWnB3SzVQQU1NNHVCbm5QSk5JWFdPWUJPNkkvWGc5ZC90UExnOE5sbW10eVFDbzJFdTB5YkRTdCs4bXUrZFd2ZUF5cyswTFRpME1JcWVQOUJNekNLejhkbldINitTOGh1TFh3VEYzbTBJcnFNMEpMYjZiNzFHSzlTT3E2c1dRMjJ5VzV2ZjYxaFhQOGtIOWRoSWFvTVpzPT1GYUhWCitybmR1bml4LmMgaVFDVkF3VUFQOWlRbHpFQW5wODMyUy83QVFML0tnUUEyOUdudmNENFhiNXFqRE1CZ1c5VEhFRTQrNGxmZXgvNmsrRmgwSVQ2MU9MSnNXVkxKN2JKcFJudGJ1cnc0dVFtNFRmN0NPOHZhaURGRFloS0tyelhlT0YxZm1kcGNMOGhBK2ZOcDlJL01VT2M0ZTlrTjkrWUo5d2lrVmEwU1pqMU9CZmh6Z2NGTGQxeE90dWxrcjNpaTUySExGOXZocnh6a2dWd3ZEMTBCaTg9PTJjTUwKK3JuZHczMi5jIGlRQ1ZBd1VBUDlpUktERUFucDgzMlMvN0FRSXVhQVFBM0FKcjNXcW54TkRzV0NJZHZlaGY4U3VvdHRoaitsYVg4bkpzdkRmRmhYUEtjWERwc2cwd1RUWFNubktneUVENTMrdVlpTURuVlJzeGVXQXloS3d2eDFNampsYVNNTWp6Ykg2aXNXVEg4RmFXcExncnhFa1hvUGVOcVlmNUZYcGRVa2NVeEdYMlJrUWV1WC9jSWZpSExORTlDVjB1c2FGMmp5c2pCWDJpRVJZPT1FRW5PCisKKyMgSGVscGVyCitiaXRoZWxwLmggaVFDVkF3VUFQN291UFRFQW5wODMyUy83QVFLWGdnUUFxamNndmloSUYzV2NsT2d3MUpWMnJiQVJ3NElTSURSTUZxZGFOQ3FCUng2QndFejNVR3NFSWx6NitpUjFzUy9yZXFONjFXdnRqTGIrRDArdHVqQWtHcmdRSmhGTEc4NVd0RzJ0QjVVVm9JM2FtMWZwa3dpUm0rYlI0cnYwckdrMEJZazgxYkM3K2w0S3JLOW81bFZwNGxDc3JvcmxVS3NkNDhsTm1CSHlBWE09PW1ERE4KK3JtZC5oIGlRQ1ZBd1VBUDdvdW1qRUFucDgzMlMvN0FRSmlKUVAvVjRiSndqWmFZbmRKelYrS1JuSURibDFrb0h1dytaSzVoZU1ZVnU4UWs0eWxxdi8vQkd5ZVJhM2paQ2NmUEhJMzVxNkhpbENzMlZCbThoaUJNakhTcVkvVlBuMlpRMHlnL2x0NnFFdmw3WWpzTG15TUlDdmpHK25jc3pIb3E5cFJ2bkYzdlRuTTE4c1BJaW9YTGs4ZnNrdU0wWE9DTkJzMEFSQkFRalk5VUdJPT1vbFVOCisKKyMgQ29uZmlndXJhdGlvbgorTWFrZWZpbGUuYW0gaVFDVkF3VUFRQ04zM1RFQW5wODMyUy83QVFLRkpBUUF6N0JEa0M4MTRxK1FpdUUvam51dEpIUjVxbGdicm0zaWtHYlF3ZFJ6WVVzY3N0NGJDQ1d5M3VLTC9zSVBHTGcrSlFYdEY1Rm5zUXkzczREOUJPWWhwNzJjQTlrdFlLNjVoaGk0cE5tL0pRMGxYa1pNTmZrOEdvNWxOektlemxXd0h2a013UlhSMEZlcDB3UGR5ZWFLVzVCZmFXMkFCdmdlcDZCcCtoSEVieWc9PXpTeWkKKyRuYW1lcyQgaVFDVkF3VUFRQ04zRURFQW5wODMyUy83QVFKWExBUDhEdkhUcG01RGtURjM1RW16ZUtwaTlpZTU5QVpjWmFuRDE5aXIvZS83K1BhUXhyMnJpdUxIREd3RktUanUrZGN2dkJzcXJ5Z1hPQzM3OEdYVld6SUYyT1p3UzRFZERjSitwZ29qbzlVcHNxcEtzSkhvdVk0VWd4NWNRaWFseGJhNDYya1VuOGhjaWhTQm5NeWM0THpiSjVXUTRwdVF1cXk1NDRkMng5NCsybXM9PUc0THMKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9jaXBoZXIvYWMuYyBiL2xpYmdjcnlwdC0xLjQuNi9jaXBoZXIvYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTk0OThiCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L2NpcGhlci9hYy5jCkBAIC0wLDAgKzEsMzMwMSBAQAorLyogYWMuYyAtIEFsdGVybmF0aXZlIGludGVyZmFjZSBmb3IgYXN5bW1ldHJpYyBjcnlwdG9ncmFwaHkuCisgICBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYKKyAgICAgICAgICAgICAgICAgMjAwNywgMjAwOCAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgIAorICAgTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBnZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgCisgICBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAgCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2luY2x1ZGUgImcxMGxpYi5oIgorI2luY2x1ZGUgImNpcGhlci5oIgorI2luY2x1ZGUgIm1waS5oIgorCisMCisKKy8qIEF0IHRoZSBtb21lbnQgdGhlIGFjIGludGVyZmFjZSBpcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSBwaworICAgaW50ZXJmYWNlLCBidXQgdGhpcyBtaWdodCBjaGFuZ2Ugc29tZXdoZW4gaW4gdGhlIGZ1dHVyZSwgZGVwZW5kaW5nCisgICBvbiBob3cgbWFueSBwZW9wbGUgcHJlZmVyIHRoZSBhYyBpbnRlcmZhY2UuICAqLworCisvKiBNYXBwaW5nIG9mIGZsYWcgbnVtYmVycyB0byB0aGUgYWNjb3JkaW5nIHN0cmluZ3MgYXMgaXQgaXMgZXhwZWN0ZWQKKyAgIGZvciBTLWV4cHJlc3Npb25zLiAgKi8KK3N0YXRpYyBzdHJ1Y3QgbnVtYmVyX3N0cmluZworeworICBpbnQgbnVtYmVyOworICBjb25zdCBjaGFyICpzdHJpbmc7Cit9IGFjX2ZsYWdzW10gPQorICB7CisgICAgeyBHQ1JZX0FDX0ZMQUdfTk9fQkxJTkRJTkcsICJuby1ibGluZGluZyIgfSwKKyAgfTsKKworLyogVGhlIHBvc2l0aW9ucyBpbiB0aGlzIGxpc3QgY29ycmVzcG9uZCB0byB0aGUgdmFsdWVzIGNvbnRhaW5lZCBpbgorICAgdGhlIGdjcnlfYWNfa2V5X3R5cGVfdCBlbnVtZXJhdGlvbiBsaXN0LiAgKi8KK3N0YXRpYyBjb25zdCBjaGFyICphY19rZXlfaWRlbnRpZmllcnNbXSA9CisgIHsKKyAgICAicHJpdmF0ZS1rZXkiLAorICAgICJwdWJsaWMta2V5IgorICB9OworCisvKiBUaGVzZSBzcGVjaWZpY2F0aW9ucyBhcmUgbmVlZGVkIGZvciBrZXktcGFpciBnZW5lcmF0aW9uOyB0aGUgY2FsbGVyCisgICBpcyBhbGxvd2VkIHRvIHBhc3MgYWRkaXRpb25hbCwgYWxnb3JpdGhtLXNwZWNpZmljIGBzcGVjcycgdG8KKyAgIGdjcnlfYWNfa2V5X3BhaXJfZ2VuZXJhdGUuICBUaGlzIGxpc3QgaXMgdXNlZCBmb3IgZGVjb2RpbmcgdGhlCisgICBwcm92aWRlZCB2YWx1ZXMgYWNjb3JkaW5nIHRvIHRoZSBzZWxlY3RlZCBhbGdvcml0aG0uICAqLworc3RydWN0IGdjcnlfYWNfa2V5X2dlbmVyYXRlX3NwZWMKK3sKKyAgaW50IGFsZ29yaXRobTsJCS8qIEFsZ29yaXRobSBmb3Igd2hpY2ggdGhpcyBmbGFnIGlzCisJCQkJICAgcmVsZXZhbnQuICAqLworICBjb25zdCBjaGFyICpuYW1lOwkJLyogTmFtZSBvZiB0aGlzIGZsYWcuICAqLworICBzaXplX3Qgb2Zmc2V0OwkJLyogT2Zmc2V0IGluIHRoZSBjaXBoZXItc3BlY2lmaWMgc3BlYworCQkJCSAgIHN0cnVjdHVyZSBhdCB3aGljaCB0aGUgTVBJIHZhbHVlCisJCQkJICAgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZmxhZyBpcyB0byBiZQorCQkJCSAgIGZvdW5kLiAgKi8KK30gYWNfa2V5X2dlbmVyYXRlX3NwZWNzW10gPQorICB7CisgICAgeyBHQ1JZX0FDX1JTQSwgInJzYS11c2UtZSIsIG9mZnNldG9mIChnY3J5X2FjX2tleV9zcGVjX3JzYV90LCBlKSB9LAorICAgIHsgMCB9CisgIH07CisKKy8qIEhhbmRsZSBzdHJ1Y3R1cmUuICAqLworc3RydWN0IGdjcnlfYWNfaGFuZGxlCit7CisgIGludCBhbGdvcml0aG07CQkvKiBBbGdvcml0aG0gSUQgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKwkJCQkgICBoYW5kbGUuICAqLworICBjb25zdCBjaGFyICphbGdvcml0aG1fbmFtZTsJLyogTmFtZSBvZiB0aGUgYWxnb3JpdGhtLiAgKi8KKyAgdW5zaWduZWQgaW50IGZsYWdzOwkJLyogRmxhZ3MsIG5vdCB1c2VkIHlldC4gICovCisgIGdjcnlfbW9kdWxlX3QgbW9kdWxlOwkgICAgICAgIC8qIFJlZmVyZW5jZSB0byB0aGUgYWxnb3JpdGhtCisJCQkJICAgbW9kdWxlLiAgKi8KK307CisKKy8qIEEgbmFtZWQgTVBJIHZhbHVlLiAgKi8KK3R5cGVkZWYgc3RydWN0IGdjcnlfYWNfbXBpCit7CisgIGNoYXIgKm5hbWU7CQkJLyogU2VsZi1tYWludGFpbmVkIGNvcHkgb2YgbmFtZS4gICovCisgIGdjcnlfbXBpX3QgbXBpOwkJLyogTVBJIHZhbHVlLiAgICAgICAgICovCisgIHVuc2lnbmVkIGludCBmbGFnczsJCS8qIEZsYWdzLiAgICAgICAgICAgICAqLworfSBnY3J5X2FjX21waV90OworCisvKiBBIGRhdGEgc2V0LCB0aGF0IGlzIHNpbXBseSBhIGxpc3Qgb2YgbmFtZWQgTVBJIHZhbHVlcy4gICovCitzdHJ1Y3QgZ2NyeV9hY19kYXRhCit7CisgIGdjcnlfYWNfbXBpX3QgKmRhdGE7CQkvKiBMaXN0IG9mIG5hbWVkIHZhbHVlcy4gICAgICAqLworICB1bnNpZ25lZCBpbnQgZGF0YV9uOwkJLyogTnVtYmVyIG9mIHZhbHVlcyBpbiBEQVRBLiAgKi8KK307CisKKy8qIEEgc2luZ2xlIGtleS4gICovCitzdHJ1Y3QgZ2NyeV9hY19rZXkKK3sKKyAgZ2NyeV9hY19kYXRhX3QgZGF0YTsJCS8qIERhdGEgaW4gbmF0aXZlIGFjIHN0cnVjdHVyZS4gICovCisgIGdjcnlfYWNfa2V5X3R5cGVfdCB0eXBlOwkvKiBUeXBlIG9mIHRoZSBrZXkuICAgICAgICAgICAgICAqLworfTsKKworLyogQSBrZXkgcGFpci4gICovCitzdHJ1Y3QgZ2NyeV9hY19rZXlfcGFpcgoreworICBnY3J5X2FjX2tleV90IHB1YmxpYzsKKyAgZ2NyeV9hY19rZXlfdCBzZWNyZXQ7Cit9OworCisMCisKKy8qIAorICogRnVuY3Rpb25zIGZvciB3b3JraW5nIHdpdGggZGF0YSBzZXRzLgorICovCisKKy8qIENyZWF0ZXMgYSBuZXcsIGVtcHR5IGRhdGEgc2V0IGFuZCBzdG9yZSBpdCBpbiBEQVRBLiAgKi8KK2djcnlfZXJyb3JfdAorX2djcnlfYWNfZGF0YV9uZXcgKGdjcnlfYWNfZGF0YV90ICpkYXRhKQoreworICBnY3J5X2FjX2RhdGFfdCBkYXRhX25ldzsKKyAgZ2NyeV9lcnJvcl90IGVycjsKKworICBpZiAoZmlwc19tb2RlICgpKQorICAgIHJldHVybiBncGdfZXJyb3IgKEdQR19FUlJfTk9UX1NVUFBPUlRFRCk7CisKKyAgZGF0YV9uZXcgPSBnY3J5X21hbGxvYyAoc2l6ZW9mICgqZGF0YV9uZXcpKTsKKyAgaWYgKCEgZGF0YV9uZXcpCisgICAgeworICAgICAgZXJyID0gZ2NyeV9lcnJvcl9mcm9tX2Vycm5vIChlcnJubyk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgZGF0YV9uZXctPmRhdGEgPSBOVUxMOworICBkYXRhX25ldy0+ZGF0YV9uID0gMDsKKyAgKmRhdGEgPSBkYXRhX25ldzsKKyAgZXJyID0gMDsKKworIG91dDoKKworICByZXR1cm4gZXJyOworfQorCisvKiBEZXN0cm95cyBhbGwgdGhlIGVudHJpZXMgaW4gREFUQSwgYnV0IG5vdCBEQVRBIGl0c2VsZi4gICovCitzdGF0aWMgdm9pZAorYWNfZGF0YV92YWx1ZXNfZGVzdHJveSAoZ2NyeV9hY19kYXRhX3QgZGF0YSkKK3sKKyAgdW5zaWduZWQgaW50IGk7CisgIAorICBmb3IgKGkgPSAwOyBpIDwgZGF0YS0+ZGF0YV9uOyBpKyspCisgICAgaWYgKGRhdGEtPmRhdGFbaV0uZmxhZ3MgJiBHQ1JZX0FDX0ZMQUdfREVBTExPQykKKyAgICAgIHsKKwlnY3J5X21waV9yZWxlYXNlIChkYXRhLT5kYXRhW2ldLm1waSk7CisJZ2NyeV9mcmVlIChkYXRhLT5kYXRhW2ldLm5hbWUpOworICAgICAgfQorfQorCisvKiBEZXN0cm95cyB0aGUgZGF0YSBzZXQgREFUQS4gICovCit2b2lkCitfZ2NyeV9hY19kYXRhX2Rlc3Ryb3kgKGdjcnlfYWNfZGF0YV90IGRhdGEpCit7CisgIGlmIChkYXRhKQorICAgIHsKKyAgICAgIGFjX2RhdGFfdmFsdWVzX2Rlc3Ryb3kgKGRhdGEpOworICAgICAgZ2NyeV9mcmVlIChkYXRhLT5kYXRhKTsKKyAgICAgIGdjcnlfZnJlZSAoZGF0YSk7CisgICAgfQorfQorCisvKiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBjb3B5IG9mIHRoZSBhcnJheSBvZiBuYW1lZCBNUElzIERBVEFfTVBJUywKKyAgIHdoaWNoIGlzIG9mIGxlbmd0aCBEQVRBX01QSVNfTjsgdGhlIGNvcHkgaXMgc3RvcmVkIGluCisgICBEQVRBX01QSVNfQ1AuICAqLworc3RhdGljIGdjcnlfZXJyb3JfdAorYWNfZGF0YV9tcGlfY29weSAoZ2NyeV9hY19tcGlfdCAqZGF0YV9tcGlzLCB1bnNpZ25lZCBpbnQgZGF0YV9tcGlzX24sCisJCSAgZ2NyeV9hY19tcGlfdCAqKmRhdGFfbXBpc19jcCkKK3sKKyAgZ2NyeV9hY19tcGlfdCAqZGF0YV9tcGlzX25ldzsKKyAgZ2NyeV9lcnJvcl90IGVycjsKKyAgdW5zaWduZWQgaW50IGk7CisgIGdjcnlfbXBpX3QgbXBpOworICBjaGFyICpsYWJlbDsKKworICBkYXRhX21waXNfbmV3ID0gZ2NyeV9tYWxsb2MgKHNpemVvZiAoKmRhdGFfbXBpc19uZXcpICogZGF0YV9tcGlzX24pOworICBpZiAoISBkYXRhX21waXNfbmV3KQorICAgIHsKKyAgICAgIGVyciA9IGdjcnlfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pOworICAgICAgZ290byBvdXQ7CisgICAgfQorICBtZW1zZXQgKGRhdGFfbXBpc19uZXcsIDAsIHNpemVvZiAoKmRhdGFfbXBpc19uZXcpICogZGF0YV9tcGlzX24pOworCisgIGVyciA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCBkYXRhX21waXNfbjsgaSsrKQorICAgIHsKKyAgICAgIC8qIENvcHkgdmFsdWVzLiAgKi8KKworICAgICAgbGFiZWwgPSBnY3J5X3N0cmR1cCAoZGF0YV9tcGlzW2ldLm5hbWUpOworICAgICAgbXBpID0gZ2NyeV9tcGlfY29weSAoZGF0YV9tcGlzW2ldLm1waSk7CisgICAgICBpZiAoISAobGFiZWwgJiYgbXBpKSkKKwl7CisJICBlcnIgPSBnY3J5X2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKTsKKwkgIGdjcnlfbXBpX3JlbGVhc2UgKG1waSk7CisJICBnY3J5X2ZyZWUgKGxhYmVsKTsKKwkgIGJyZWFrOworCX0KKworICAgICAgZGF0YV9tcGlzX25ld1tpXS5mbGFncyA9IEdDUllfQUNfRkxBR19ERUFMTE9DOworICAgICAgZGF0YV9tcGlzX25ld1tpXS5uYW1lID0gbGFiZWw7CisgICAgICBkYXRhX21waXNfbmV3W2ldLm1waSA9IG1waTsKKyAgICB9CisgIGlmIChlcnIpCisgICAgZ290byBvdXQ7CisKKyAgKmRhdGFfbXBpc19jcCA9IGRhdGFfbXBpc19uZXc7CisgIGVyciA9IDA7CisKKyBvdXQ6CisKKyAgaWYgKGVycikKKyAgICBpZiAoZGF0YV9tcGlzX25ldykKKyAgICAgIHsKKwlmb3IgKGkgPSAwOyBpIDwgZGF0YV9tcGlzX247IGkrKykKKwkgIHsKKwkgICAgZ2NyeV9tcGlfcmVsZWFzZSAoZGF0YV9tcGlzX25ld1tpXS5tcGkpOworCSAgICBnY3J5X2ZyZWUgKGRhdGFfbXBpc19uZXdbaV0ubmFtZSk7CisJICB9CisJZ2NyeV9mcmVlIChkYXRhX21waXNfbmV3KTsKKyAgICAgIH0KKworICByZXR1cm4gZXJyOworfQorCisvKiBDcmVhdGUgYSBjb3B5IG9mIHRoZSBkYXRhIHNldCBEQVRBIGFuZCBzdG9yZSBpdCBpbiBEQVRBX0NQLiAgKi8KK2djcnlfZXJyb3JfdAorX2djcnlfYWNfZGF0YV9jb3B5IChnY3J5X2FjX2RhdGFfdCAqZGF0YV9jcCwgZ2NyeV9hY19kYXRhX3QgZGF0YSkKK3sKKyAgZ2NyeV9hY19tcGlfdCAqZGF0YV9tcGlzID0gTlVMTDsKKyAgZ2NyeV9hY19kYXRhX3QgZGF0YV9uZXc7CisgIGdjcnlfZXJyb3JfdCBlcnI7CisKKyAgaWYgKGZpcHNfbW9kZSAoKSkKKyAgICByZXR1cm4gZ3BnX2Vycm9yIChHUEdfRVJSX05PVF9TVVBQT1JURUQpOworCisgIC8qIEFsbG9jYXRlIGRhdGEgc2V0LiAgKi8KKyAgZGF0YV9uZXcgPSBnY3J5X21hbGxvYyAoc2l6ZW9mICgqZGF0YV9uZXcpKTsKKyAgaWYgKCEgZGF0YV9uZXcpCisgICAgeworICAgICAgZXJyID0gZ2NyeV9lcnJvcl9mcm9tX2Vycm5vIChlcnJubyk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgZXJyID0gYWNfZGF0YV9tcGlfY29weSAoZGF0YS0+ZGF0YSwgZGF0YS0+ZGF0YV9uLCAmZGF0YV9tcGlzKTsKKyAgaWYgKGVycikKKyAgICBnb3RvIG91dDsKKyAgCisgIGRhdGFfbmV3LT5kYXRhX24gPSBkYXRhLT5kYXRhX247CisgIGRhdGFfbmV3LT5kYXRhID0gZGF0YV9tcGlzOworICAqZGF0YV9jcCA9IGRhdGFfbmV3OworCisgb3V0OgorCisgIGlmIChlcnIpCisgICAgZ2NyeV9mcmVlIChkYXRhX25ldyk7CisKKyAgcmV0dXJuIGVycjsKK30KKworLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIG5hbWVkIE1QSSB2YWx1ZXMgaW5zaWRlIG9mIHRoZSBkYXRhIHNldAorICAgREFUQS4gICovCit1bnNpZ25lZCBpbnQKK19nY3J5X2FjX2RhdGFfbGVuZ3RoIChnY3J5X2FjX2RhdGFfdCBkYXRhKQoreworICByZXR1cm4gZGF0YS0+ZGF0YV9uOworfQorCisKKy8qIEFkZCB0aGUgdmFsdWUgTVBJIHRvIERBVEEgd2l0aCB0aGUgbGFiZWwgTkFNRS4gIElmIEZMQUdTIGNvbnRhaW5zCisgICBHQ1JZX0FDX0ZMQUdfQ09QWSwgdGhlIGRhdGEgc2V0IHdpbGwgY29udGFpbiBjb3BpZXMgb2YgTkFNRQorICAgYW5kIE1QSS4gIElmIEZMQUdTIGNvbnRhaW5zIEdDUllfQUNfRkxBR19ERUFMTE9DIG9yCisgICBHQ1JZX0FDX0ZMQUdfQ09QWSwgdGhlIHZhbHVlcyBjb250YWluZWQgaW4gdGhlIGRhdGEgc2V0IHdpbGwKKyAgIGJlIGRlYWxsb2NhdGVkIHdoZW4gdGhleSBhcmUgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBkYXRhIHNldC4gICovCitnY3J5X2Vycm9yX3QKK19nY3J5X2FjX2RhdGFfc2V0IChnY3J5X2FjX2RhdGFfdCBkYXRhLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCisJCSAgIGNvbnN0IGNoYXIgKm5hbWUsIGdjcnlfbXBpX3QgbXBpKQoreworICBnY3J5X2Vycm9yX3QgZXJyOworICBnY3J5X21waV90IG1waV9jcDsKKyAgY2hhciAqbmFtZV9jcDsKKyAgdW5zaWduZWQgaW50IGk7CisKKyAgbmFtZV9jcCA9IE5VTEw7CisgIG1waV9jcCA9IE5VTEw7CisKKyAgaWYgKGZpcHNfbW9kZSAoKSkKKyAgICByZXR1cm4gZ3BnX2Vycm9yIChHUEdfRVJSX05PVF9TVVBQT1JURUQpOworCisgIGlmIChmbGFncyAmIH4oR0NSWV9BQ19GTEFHX0RFQUxMT0MgfCBHQ1JZX0FDX0ZMQUdfQ09QWSkpCisgICAgeworICAgICAgZXJyID0gZ2NyeV9lcnJvciAoR1BHX0VSUl9JTlZfQVJHKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoZmxhZ3MgJiBHQ1JZX0FDX0ZMQUdfQ09QWSkKKyAgICB7CisgICAgICAvKiBDcmVhdGUgY29waWVzLiAgKi8KKworICAgICAgZmxhZ3MgfD0gR0NSWV9BQ19GTEFHX0RFQUxMT0M7CisgICAgICBuYW1lX2NwID0gZ2NyeV9zdHJkdXAgKG5hbWUpOworICAgICAgbXBpX2NwID0gZ2NyeV9tcGlfY29weSAobXBpKTsKKyAgICAgIGlmICghIChuYW1lX2NwICYmIG1waV9jcCkpCisJeworCSAgZXJyID0gZ2NyeV9lcnJvcl9mcm9tX2Vycm5vIChlcnJubyk7CisJICBnb3RvIG91dDsKKwl9CisgICAgfQorCisgIC8qIFNlYXJjaCBmb3IgZXhpc3RpbmcgZW50cnkuICAqLworICBmb3IgKGkgPSAwOyBpIDwgZGF0YS0+ZGF0YV9uOyBpKyspCisgICAgaWYgKCEgc3RyY21wIChuYW1lLCBkYXRhLT5kYXRhW2ldLm5hbWUpKQorICAgICAgYnJlYWs7CisgIGlmIChpIDwgZGF0YS0+ZGF0YV9uKQorICAgIHsKKyAgICAgIC8qIEFuIGVudHJ5IGZvciBOQU1FIGRvZXMgYWxyZWFkeSBleGlzdC4gICovCisgICAgICBpZiAoZGF0YS0+ZGF0YVtpXS5mbGFncyAmIEdDUllfQUNfRkxBR19ERUFMTE9DKQorCXsKKwkgIGdjcnlfbXBpX3JlbGVhc2UgKGRhdGEtPmRhdGFbaV0ubXBpKTsKKwkgIGdjcnlfZnJlZSAoZGF0YS0+ZGF0YVtpXS5uYW1lKTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogQ3JlYXRlIGEgbmV3IGVudHJ5LiAgKi8KKworICAgICAgZ2NyeV9hY19tcGlfdCAqYWNfbXBpczsKKworICAgICAgYWNfbXBpcyA9IGdjcnlfcmVhbGxvYyAoZGF0YS0+ZGF0YSwKKwkJCSAgICAgIHNpemVvZiAoKmRhdGEtPmRhdGEpICogKGRhdGEtPmRhdGFfbiArIDEpKTsKKyAgICAgIGlmICghIGFjX21waXMpCisJeworCSAgZXJyID0gZ2NyeV9lcnJvcl9mcm9tX2Vycm5vIChlcnJubyk7CisJICBnb3RvIG91dDsKKwl9CisKKyAgICAgIGlmIChkYXRhLT5kYXRhICE9IGFjX21waXMpCisJZGF0YS0+ZGF0YSA9IGFjX21waXM7CisgICAgICBkYXRhLT5kYXRhX24rKzsKKyAgICB9CisKKyAgZGF0YS0+ZGF0YVtpXS5uYW1lID0gbmFtZV9jcCA/IG5hbWVfY3AgOiAoKGNoYXIgKikgbmFtZSk7CisgIGRhdGEtPmRhdGFbaV0ubXBpID0gbXBpX2NwID8gbXBpX2NwIDogbXBpOworICBkYXRhLT5kYXRhW2ldLmZsYWdzID0gZmxhZ3M7CisgIGVyciA9IDA7CisKKyBvdXQ6CisKKyAgaWYgKGVycikKKyAgICB7CisgICAgICBnY3J5X21waV9yZWxlYXNlIChtcGlfY3ApOworICAgICAgZ2NyeV9mcmVlIChuYW1lX2NwKTsKKyAgICB9CisKKyAgcmV0dXJuIGVycjsKK30KKworLyogU3RvcmVzIHRoZSB2YWx1ZSBsYWJlbGxlZCB3aXRoIE5BTUUgZm91bmQgaW4gdGhlIGRhdGEgc2V0IERBVEEgaW4KKyAgIE1QSS4gIFRoZSByZXR1cm5lZCBNUEkgdmFsdWUgd2lsbCBiZSByZWxlYXNlZCBpbiBjYXNlCisgICBnY3J5X2FjX2RhdGFfc2V0IGlzIHVzZWQgdG8gYXNzb2NpYXRlIHRoZSBsYWJlbCBOQU1FIHdpdGggYQorICAgZGlmZmVyZW50IE1QSSB2YWx1ZS4gICovCitnY3J5X2Vycm9yX3QKK19nY3J5X2FjX2RhdGFfZ2V0X25hbWUgKGdjcnlfYWNfZGF0YV90IGRhdGEsIHVuc2lnbmVkIGludCBmbGFncywKKwkJCWNvbnN0IGNoYXIgKm5hbWUsIGdjcnlfbXBpX3QgKm1waSkKK3sKKyAgZ2NyeV9tcGlfdCBtcGlfcmV0dXJuOworICBnY3J5X2Vycm9yX3QgZXJyOworICB1bnNpZ25lZCBpbnQgaTsKKworICBpZiAoZmlwc19tb2RlICgpKQorICAgIHJldHVybiBncGdfZXJyb3IgKEdQR19FUlJfTk9UX1NVUFBPUlRFRCk7CisKKyAgaWYgKGZsYWdzICYgfihHQ1JZX0FDX0ZMQUdfQ09QWSkpCisgICAgeworICAgICAgZXJyID0gZ2NyeV9lcnJvciAoR1BHX0VSUl9JTlZfQVJHKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgZGF0YS0+ZGF0YV9uOyBpKyspCisgICAgaWYgKCEgc3RyY21wIChuYW1lLCBkYXRhLT5kYXRhW2ldLm5hbWUpKQorICAgICAgYnJlYWs7CisgIGlmIChpID09IGRhdGEtPmRhdGFfbikKKyAgICB7CisgICAgICBlcnIgPSBnY3J5X2Vycm9yIChHUEdfRVJSX05PVF9GT1VORCk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKGZsYWdzICYgR0NSWV9BQ19GTEFHX0NPUFkpCisgICAgeworICAgICAgbXBpX3JldHVybiA9IGdjcnlfbXBpX2NvcHkgKGRhdGEtPmRhdGFbaV0ubXBpKTsKKyAgICAgIGlmICghIG1waV9yZXR1cm4pCisJeworCSAgZXJyID0gZ2NyeV9lcnJvcl9mcm9tX2Vycm5vIChlcnJubyk7IC8qIEZJWE1FPyAqLworCSAgZ290byBvdXQ7CisJfQorICAgIH0KKyAgZWxzZQorICAgIG1waV9yZXR1cm4gPSBkYXRhLT5kYXRhW2ldLm1waTsKKworICAqbXBpID0gbXBpX3JldHVybjsKKyAgZXJyID0gMDsKKworIG91dDoKKworICByZXR1cm4gZXJyOworfQorCisvKiBTdG9yZXMgaW4gTkFNRSBhbmQgTVBJIHRoZSBuYW1lZCBNUEkgdmFsdWUgY29udGFpbmVkIGluIHRoZSBkYXRhCisgICBzZXQgREFUQSB3aXRoIHRoZSBpbmRleCBJRFguICBOQU1FIG9yIE1QSSBtYXkgYmUgTlVMTC4gIFRoZQorICAgcmV0dXJuZWQgTVBJIHZhbHVlIHdpbGwgYmUgcmVsZWFzZWQgaW4gY2FzZSBnY3J5X2FjX2RhdGFfc2V0IGlzCisgICB1c2VkIHRvIGFzc29jaWF0ZSB0aGUgbGFiZWwgTkFNRSB3aXRoIGEgZGlmZmVyZW50IE1QSSB2YWx1ZS4gICovCitnY3J5X2Vycm9yX3QKK19nY3J5X2FjX2RhdGFfZ2V0X2luZGV4IChnY3J5X2FjX2RhdGFfdCBkYXRhLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCisJCQkgdW5zaWduZWQgaW50IGlkeCwKKwkJCSBjb25zdCBjaGFyICoqbmFtZSwgZ2NyeV9tcGlfdCAqbXBpKQoreworICBnY3J5X2Vycm9yX3QgZXJyOworICBnY3J5X21waV90IG1waV9jcDsKKyAgY2hhciAqbmFtZV9jcDsKKworICBuYW1lX2NwID0gTlVMTDsKKyAgbXBpX2NwID0gTlVMTDsKKworICBpZiAoZmlwc19tb2RlICgpKQorICAgIHJldHVybiBncGdfZXJyb3IgKEdQR19FUlJfTk9UX1NVUFBPUlRFRCk7CisKKyAgaWYgKGZsYWdzICYgfihHQ1JZX0FDX0ZMQUdfQ09QWSkpCisgICAgeworICAgICAgZXJyID0gZ2NyeV9lcnJvciAoR1BHX0VSUl9JTlZfQVJHKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoaWR4ID49IGRhdGEtPmRhdGFfbikKKyAgICB7CisgICAgICBlcnIgPSBnY3J5X2Vycm9yIChHUEdfRVJSX0lOVl9BUkcpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmIChmbGFncyAmIEdDUllfQUNfRkxBR19DT1BZKQorICAgIHsKKyAgICAgIC8qIFJldHVybiBjb3BpZXMgdG8gdGhlIHVzZXIuICAqLworICAgICAgaWYgKG5hbWUpCisJeworCSAgbmFtZV9jcCA9IGdjcnlfc3RyZHVwIChkYXRhLT5kYXRhW2lkeF0ubmFtZSk7CisJICBpZiAoISBuYW1lX2NwKQorCSAgICB7CisJICAgICAgZXJyID0gZ2NyeV9lcnJvcl9mcm9tX2Vycm5vIChlcnJubyk7CisJICAgICAgZ290byBvdXQ7CisJICAgIH0KKwl9CisgICAgICBpZiAobXBpKQorCXsKKwkgIG1waV9jcCA9IGdjcnlfbXBpX2NvcHkgKGRhdGEtPmRhdGFbaWR4XS5tcGkpOworCSAgaWYgKCEgbXBpX2NwKQorCSAgICB7CisJICAgICAgZXJyID0gZ2NyeV9lcnJvcl9mcm9tX2Vycm5vIChlcnJubyk7CisJICAgICAgZ290byBvdXQ7CisJICAgIH0KKwl9CisgICAgfQorCisgIGlmIChuYW1lKQorICAgICpuYW1lID0gbmFtZV9jcCA/IG5hbWVfY3AgOiBkYXRhLT5kYXRhW2lkeF0ubmFtZTsKKyAgaWYgKG1waSkKKyAgICAqbXBpID0gbXBpX2NwID8gbXBpX2NwIDogZGF0YS0+ZGF0YVtpZHhdLm1waTsKKyAgZXJyID0gMDsKKworIG91dDoKKworICBpZiAoZXJyKQorICAgIHsKKyAgICAgIGdjcnlfbXBpX3JlbGVhc2UgKG1waV9jcCk7CisgICAgICBnY3J5X2ZyZWUgKG5hbWVfY3ApOworICAgIH0KKworICByZXR1cm4gZXJyOworfQorCisvKiBDb252ZXJ0IHRoZSBkYXRhIHNldCBEQVRBIGludG8gYSBuZXcgUy1FeHByZXNzaW9uLCB3aGljaCBpcyB0byBiZQorICAgc3RvcmVkIGluIFNFWFAsIGFjY29yZGluZyB0byB0aGUgaWRlbnRpZmllcnMgY29udGFpbmVkIGluCisgICBJREVOVElGSUVSUy4gICovCitnY3J5X2Vycm9yX3QKK19nY3J5X2FjX2RhdGFfdG9fc2V4cCAoZ2NyeV9hY19kYXRhX3QgZGF0YSwgZ2NyeV9zZXhwX3QgKnNleHAsCisJCSAgICAgICBjb25zdCBjaGFyICoqaWRlbnRpZmllcnMpCit7CisgIGdjcnlfc2V4cF90IHNleHBfbmV3OworICBnY3J5X2Vycm9yX3QgZXJyOworICBjaGFyICpzZXhwX2J1ZmZlcjsKKyAgc2l6ZV90IHNleHBfYnVmZmVyX247CisgIHNpemVfdCBpZGVudGlmaWVyc19uOworICBjb25zdCBjaGFyICpsYWJlbDsKKyAgZ2NyeV9tcGlfdCBtcGk7CisgIHZvaWQgKiphcmdfbGlzdDsKKyAgc2l6ZV90IGRhdGFfbjsKKyAgdW5zaWduZWQgaW50IGk7CisKKyAgc2V4cF9idWZmZXJfbiA9IDE7CisgIHNleHBfYnVmZmVyID0gTlVMTDsKKyAgYXJnX2xpc3QgPSBOVUxMOworICBlcnIgPSAwOworCisgIGlmIChmaXBzX21vZGUgKCkpCisgICAgcmV0dXJuIGdwZ19lcnJvciAoR1BHX0VSUl9OT1RfU1VQUE9SVEVEKTsKKworICAvKiBDYWxjdWxhdGUgc2l6ZSBvZiBTLWV4cHJlc3Npb24gcmVwcmVzZW50YXRpb24uICAqLworCisgIGkgPSAwOworICBpZiAoaWRlbnRpZmllcnMpCisgICAgd2hpbGUgKGlkZW50aWZpZXJzW2ldKQorICAgICAgeworCS8qIEZvciBlYWNoIGlkZW50aWZpZXIsIHdlIGFkZCAiKDxJREVOVElGSUVSPikiLiAgKi8KKwlzZXhwX2J1ZmZlcl9uICs9IDEgKyBzdHJsZW4gKGlkZW50aWZpZXJzW2ldKSArIDE7CisJaSsrOworICAgICAgfQorICBpZGVudGlmaWVyc19uID0gaTsKKyAgCisgIGlmICghIGlkZW50aWZpZXJzX24pCisgICAgLyogSWYgdGhlcmUgYXJlIE5PIGlkZW50aWZpZXJzLCB3ZSBzdGlsbCBhZGQgc3Vycm91bmRpbmcgYnJhY2VzIHNvCisgICAgICAgdGhhdCB3ZSBoYXZlIGEgbGlzdCBvZiBuYW1lZCBNUEkgdmFsdWUgbGlzdHMuICBPdGhlcndpc2UgaXQKKyAgICAgICB3b3VsZG4ndCBiZSB0b28gbXVjaCBmdW4gdG8gcHJvY2VzcyB0aGVzZSBsaXN0cy4gICovCisgICAgc2V4cF9idWZmZXJfbiArPSAyOworICAKKyAgZGF0YV9uID0gX2djcnlfYWNfZGF0YV9sZW5ndGggKGRhdGEpOworICBmb3IgKGkgPSAwOyBpIDwgZGF0YV9uOyBpKyspCisgICAgeworICAgICAgZXJyID0gZ2NyeV9hY19kYXRhX2dldF9pbmRleCAoZGF0YSwgMCwgaSwgJmxhYmVsLCBOVUxMKTsKKyAgICAgIGlmIChlcnIpCisJYnJlYWs7CisgICAgICAvKiBGb3IgZWFjaCBNUEkgd2UgYWRkICIoPExBQkVMPiAlbSkiLiAgKi8KKyAgICAgIHNleHBfYnVmZmVyX24gKz0gMSArIHN0cmxlbiAobGFiZWwpICsgNDsKKyAgICB9CisgIGlmIChlcnIpCisgICAgZ290byBvdXQ7CisKKyAgLyogQWxsb2NhdGUgYnVmZmVyLiAgKi8KKworICBzZXhwX2J1ZmZlciA9IGdjcnlfbWFsbG9jIChzZXhwX2J1ZmZlcl9uKTsKKyAgaWYgKCEgc2V4cF9idWZmZXIpCisgICAgeworICAgICAgZXJyID0gZ2NyeV9lcnJvcl9mcm9tX2Vycm5vIChlcnJubyk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgLyogRmlsbCBidWZmZXIuICAqLworCisgICpzZXhwX2J1ZmZlciA9IDA7CisgIHNleHBfYnVmZmVyX24gPSAwOworCisgIC8qIEFkZCBpZGVudGlmaWVyczogKDxJREVOVElGSUVSMD4oPElERU5USUZJRVIxPi4uLikpLiAgKi8KKyAgaWYgKGlkZW50aWZpZXJzX24pCisgICAgeworICAgICAgLyogQWRkIG5lc3RlZCBpZGVudGlmaWVyIGxpc3RzIGFzIHVzdWFsLiAgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBpZGVudGlmaWVyc19uOyBpKyspCisJc2V4cF9idWZmZXJfbiArPSBzcHJpbnRmIChzZXhwX2J1ZmZlciArIHNleHBfYnVmZmVyX24sICIoJXMiLAorCQkJCSAgaWRlbnRpZmllcnNbaV0pOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEFkZCBzcGVjaWFsIGxpc3QuICAqLworICAgICAgc2V4cF9idWZmZXJfbiArPSBzcHJpbnRmIChzZXhwX2J1ZmZlciArIHNleHBfYnVmZmVyX24sICIoIik7CisgICAgfQorCisgIC8qIEFkZCBNUEkgbGlzdC4gICovCisgIGFyZ19saXN0ID0gZ2NyeV9tYWxsb2MgKHNpemVvZiAoKmFyZ19saXN0KSAqIChkYXRhX24gKyAxKSk7CisgIGlmICghIGFyZ19saXN0KQorICAgIHsKKyAgICAgIGVyciA9IGdjcnlfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pOworICAgICAgZ290byBvdXQ7CisgICAgfQorICBmb3IgKGkgPSAwOyBpIDwgZGF0YV9uOyBpKyspCisgICAgeworICAgICAgZXJyID0gZ2NyeV9hY19kYXRhX2dldF9pbmRleCAoZGF0YSwgMCwgaSwgJmxhYmVsLCAmbXBpKTsKKyAgICAgIGlmIChlcnIpCisJYnJlYWs7CisgICAgICBzZXhwX2J1ZmZlcl9uICs9IHNwcmludGYgKHNleHBfYnVmZmVyICsgc2V4cF9idWZmZXJfbiwKKwkJCQkiKCVzICUlbSkiLCBsYWJlbCk7CisgICAgICBhcmdfbGlzdFtpXSA9ICZkYXRhLT5kYXRhW2ldLm1waTsKKyAgICB9CisgIGlmIChlcnIpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKGlkZW50aWZpZXJzX24pCisgICAgeworICAgICAgLyogQWRkIGNsb3NpbmcgYnJhY2VzIGZvciBpZGVudGlmaWVyIGxpc3RzIGFzIHVzdWFsLiAgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBpZGVudGlmaWVyc19uOyBpKyspCisJc2V4cF9idWZmZXJfbiArPSBzcHJpbnRmIChzZXhwX2J1ZmZlciArIHNleHBfYnVmZmVyX24sICIpIik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogQWRkIGNsb3NpbmcgYnJhY2VzIGZvciBzcGVjaWFsIGxpc3QuICAqLworICAgICAgc2V4cF9idWZmZXJfbiArPSBzcHJpbnRmIChzZXhwX2J1ZmZlciArIHNleHBfYnVmZmVyX24sICIpIik7CisgICAgfQorCisgIC8qIENvbnN0cnVjdC4gICovCisgIGVyciA9IGdjcnlfc2V4cF9idWlsZF9hcnJheSAoJnNleHBfbmV3LCBOVUxMLCBzZXhwX2J1ZmZlciwgYXJnX2xpc3QpOworICBpZiAoZXJyKQorICAgIGdvdG8gb3V0OworCisgICpzZXhwID0gc2V4cF9uZXc7CisKKyBvdXQ6CisKKyAgZ2NyeV9mcmVlIChzZXhwX2J1ZmZlcik7CisgIGdjcnlfZnJlZSAoYXJnX2xpc3QpOworCisgIHJldHVybiBlcnI7Cit9CisKKy8qIENyZWF0ZSBhIG5ldyBkYXRhIHNldCwgd2hpY2ggaXMgdG8gYmUgc3RvcmVkIGluIERBVEFfU0VULCBmcm9tIHRoZQorICAgUy1FeHByZXNzaW9uIFNFWFAsIGFjY29yZGluZyB0byB0aGUgaWRlbnRpZmllcnMgY29udGFpbmVkIGluCisgICBJREVOVElGSUVSUy4gICovCitnY3J5X2Vycm9yX3QKK19nY3J5X2FjX2RhdGFfZnJvbV9zZXhwIChnY3J5X2FjX2RhdGFfdCAqZGF0YV9zZXQsIGdjcnlfc2V4cF90IHNleHAsCisJCQkgY29uc3QgY2hhciAqKmlkZW50aWZpZXJzKQoreworICBnY3J5X2FjX2RhdGFfdCBkYXRhX3NldF9uZXc7CisgIGdjcnlfZXJyb3JfdCBlcnI7CisgIGdjcnlfc2V4cF90IHNleHBfY3VyOworICBnY3J5X3NleHBfdCBzZXhwX3RtcDsKKyAgZ2NyeV9tcGlfdCBtcGk7CisgIGNoYXIgKnN0cmluZzsKKyAgY29uc3QgY2hhciAqZGF0YTsKKyAgc2l6ZV90IGRhdGFfbjsKKyAgc2l6ZV90IHNleHBfbjsKKyAgdW5zaWduZWQgaW50IGk7CisgIGludCBza2lwX25hbWU7CisKKyAgZGF0YV9zZXRfbmV3ID0gTlVMTDsKKyAgc2V4cF9jdXIgPSBzZXhwOworICBzZXhwX3RtcCA9IE5VTEw7CisgIHN0cmluZyA9IE5VTEw7CisgIG1waSA9IE5VTEw7CisgIGVyciA9IDA7CisKKyAgaWYgKGZpcHNfbW9kZSAoKSkKKyAgICByZXR1cm4gZ3BnX2Vycm9yIChHUEdfRVJSX05PVF9TVVBQT1JURUQpOworCisgIC8qIFByb2Nlc3MgUy1leHByZXNzaW9uL2lkZW50aWZpZXJzLiAgKi8KKworICBpZiAoaWRlbnRpZmllcnMpCisgICAgeworICAgICAgZm9yIChpID0gMDsgaWRlbnRpZmllcnNbaV07IGkrKykKKwl7CisJICAvKiBOZXh0IGlkZW50aWZpZXIuICBFeHRyYWN0IGZpcnN0IGRhdGEgaXRlbSBmcm9tCisJICAgICBTRVhQX0NVUi4gICovCisJICBkYXRhID0gZ2NyeV9zZXhwX250aF9kYXRhIChzZXhwX2N1ciwgMCwgJmRhdGFfbik7CisKKwkgIGlmICghICgoZGF0YV9uID09IHN0cmxlbiAoaWRlbnRpZmllcnNbaV0pKQorCQkgJiYgKCEgc3RybmNtcCAoZGF0YSwgaWRlbnRpZmllcnNbaV0sIGRhdGFfbikpKSkKKwkgICAgeworCSAgICAgIC8qIElkZW50aWZpZXIgbWlzbWF0Y2ggLT4gZXJyb3IuICAqLworCSAgICAgIGVyciA9IGdjcnlfZXJyb3IgKEdQR19FUlJfSU5WX1NFWFApOworCSAgICAgIGJyZWFrOworCSAgICB9CisKKwkgIC8qIElkZW50aWZpZXIgbWF0Y2hlcy4gIE5vdyB3ZSBoYXZlIHRvIGRpc3Rpbmd1aXNoIHR3bworCSAgICAgY2FzZXM6CisJICAgICAKKwkgICAgIChpKSAgd2UgYXJlIGF0IHRoZSBsYXN0IGlkZW50aWZpZXI6CisJICAgICBsZWF2ZSBsb29wCisKKwkgICAgIChpaSkgd2UgYXJlIG5vdCBhdCB0aGUgbGFzdCBpZGVudGlmaWVyOgorCSAgICAgZXh0cmFjdCBuZXh0IGVsZW1lbnQsIHdoaWNoIGlzIHN1cHBvc2VkIHRvIGJlIGEKKwkgICAgIHN1Ymxpc3QuICAqLworCisJICBpZiAoISBpZGVudGlmaWVyc1tpICsgMV0pCisJICAgIC8qIExhc3QgaWRlbnRpZmllci4gICovCisJICAgIGJyZWFrOworCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogTm90IHRoZSBsYXN0IGlkZW50aWZpZXIsIGV4dHJhY3QgbmV4dCBzdWJsaXN0LiAgKi8KKworCSAgICAgIHNleHBfdG1wID0gZ2NyeV9zZXhwX250aCAoc2V4cF9jdXIsIDEpOworCSAgICAgIGlmICghIHNleHBfdG1wKQorCQl7CisJCSAgLyogTWlzc2luZyBzdWJsaXN0LiAgKi8KKwkJICBlcnIgPSBnY3J5X2Vycm9yIChHUEdfRVJSX0lOVl9TRVhQKTsKKwkJICBicmVhazsKKwkJfQorCisJICAgICAgLyogUmVsZWFzZSBvbGQgU0VYUF9DVVIsIGluIGNhc2UgaXQgaXMgbm90IGVxdWFsIHRvIHRoZQorCQkgb3JpZ2luYWwgU0VYUC4gICovCisJICAgICAgaWYgKHNleHBfY3VyICE9IHNleHApCisJCWdjcnlfc2V4cF9yZWxlYXNlIChzZXhwX2N1cik7CisKKwkgICAgICAvKiBNYWtlIFNFWFBfQ1VSIHBvaW50IHRvIHRoZSBuZXcgY3VycmVudCBzdWJsaXN0LiAgKi8KKwkgICAgICBzZXhwX2N1ciA9IHNleHBfdG1wOworICAgICAgICAgICAgICBzZXhwX3RtcCA9IE5VTEw7CisJICAgIH0KKwl9CisgICAgICBpZiAoZXJyKQorCWdvdG8gb3V0OworCisgICAgICBpZiAoaSkKKyAgICAgICAgeworICAgICAgICAgIC8qIFdlIGhhdmUgYXQgbGVhc3Qgb25lIGlkZW50aWZpZXIgaW4gdGhlIGxpc3QsIHRoaXMgbWVhbnMKKyAgICAgICAgICAgICB0aGUgdGhlIGxpc3Qgb2YgbmFtZWQgTVBJIHZhbHVlcyBpcyBwcmVmaXhlZCwgdGhpcyBtZWFucworICAgICAgICAgICAgIHRoYXQgd2UgbmVlZCB0byBza2lwIHRoZSBmaXJzdCBpdGVtICh0aGUgbGlzdCBuYW1lKSwgd2hlbgorICAgICAgICAgICAgIHByb2Nlc3NpbmcgdGhlIE1QSSB2YWx1ZXMuICAqLworICAgICAgICAgIHNraXBfbmFtZSA9IDE7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIFNpbmNlIHRoZXJlIGlzIG5vIGlkZW50aWZpZXJzIGxpc3QsIHRoZSBsaXN0IG9mIG5hbWVkIE1QSQorICAgICAgICAgICAgIHZhbHVlcyBpcyBub3QgcHJlZml4ZWQgd2l0aCBhIGxpc3QgbmFtZSwgdGhlcmVmb3JlIHRoZQorICAgICAgICAgICAgIG9mZnNldCB0byB1c2UgaXMgemVyby4gICovCisgICAgICAgICAgc2tpcF9uYW1lID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIC8qIFNpbmNlIHRoZXJlIGlzIG5vIGlkZW50aWZpZXJzIGxpc3QsIHRoZSBsaXN0IG9mIG5hbWVkIE1QSQorICAgICAgIHZhbHVlcyBpcyBub3QgcHJlZml4ZWQgd2l0aCBhIGxpc3QgbmFtZSwgdGhlcmVmb3JlIHRoZSBvZmZzZXQKKyAgICAgICB0byB1c2UgaXMgemVyby4gICovCisgICAgc2tpcF9uYW1lID0gMDsKKworICAvKiBDcmVhdGUgZGF0YSBzZXQgZnJvbSBTLWV4cHJlc3Npb24gZGF0YS4gICovCisgIAorICBlcnIgPSBnY3J5X2FjX2RhdGFfbmV3ICgmZGF0YV9zZXRfbmV3KTsKKyAgaWYgKGVycikKKyAgICBnb3RvIG91dDsKKworICAvKiBGaWd1cmUgb3V0IGFtb3VudCBvZiBuYW1lZCBNUElzIGluIFNFWFBfQ1VSLiAgKi8KKyAgaWYgKHNleHBfY3VyKQorICAgIHNleHBfbiA9IGdjcnlfc2V4cF9sZW5ndGggKHNleHBfY3VyKSAtIHNraXBfbmFtZTsKKyAgZWxzZQorICAgIHNleHBfbiA9IDA7CisKKyAgLyogRXh0cmFjdGUgdGhlIG5hbWVkIE1QSXMgc2VxdWVudGlhbGx5LiAgKi8KKyAgZm9yIChpID0gMDsgaSA8IHNleHBfbjsgaSsrKQorICAgIHsKKyAgICAgIC8qIFN0b3JlIG5leHQgUy1FeHByZXNzaW9uIHBhaXIsIHdoaWNoIGlzIHN1cHBvc2VkIHRvIGNvbnNpc3Qgb2YKKwkgYSBuYW1lIGFuZCBhbiBNUEkgdmFsdWUsIGluIFNFWFBfVE1QLiAgKi8KKworICAgICAgc2V4cF90bXAgPSBnY3J5X3NleHBfbnRoIChzZXhwX2N1ciwgaSArIHNraXBfbmFtZSk7CisgICAgICBpZiAoISBzZXhwX3RtcCkKKwl7CisJICBlcnIgPSBnY3J5X2Vycm9yIChHUEdfRVJSX0lOVl9TRVhQKTsKKwkgIGJyZWFrOworCX0KKworICAgICAgLyogRXh0cmFjdCBuYW1lIGZyb20gY3VycmVudCBTLUV4cHJlc3Npb24gcGFpci4gICovCisgICAgICBkYXRhID0gZ2NyeV9zZXhwX250aF9kYXRhIChzZXhwX3RtcCwgMCwgJmRhdGFfbik7CisgICAgICBzdHJpbmcgPSBnY3J5X21hbGxvYyAoZGF0YV9uICsgMSk7CisgICAgICBpZiAoISBzdHJpbmcpCisJeworCSAgZXJyID0gZ2NyeV9lcnJvcl9mcm9tX2Vycm5vIChlcnJubyk7CisJICBicmVhazsKKwl9CisgICAgICBtZW1jcHkgKHN0cmluZywgZGF0YSwgZGF0YV9uKTsKKyAgICAgIHN0cmluZ1tkYXRhX25dID0gMDsKKworICAgICAgLyogRXh0cmFjdCBNUEkgdmFsdWUuICAqLworICAgICAgbXBpID0gZ2NyeV9zZXhwX250aF9tcGkgKHNleHBfdG1wLCAxLCAwKTsKKyAgICAgIGlmICghIG1waSkKKwl7CisJICBlcnIgPSBnY3J5X2Vycm9yIChHUEdfRVJSX0lOVl9TRVhQKTsgLyogRklYTUU/ICovCisJICBicmVhazsKKwl9CisKKyAgICAgIC8qIFN0b3JlIG5hbWVkIE1QSSBpbiBkYXRhX3NldF9uZXcuICAqLworICAgICAgZXJyID0gZ2NyeV9hY19kYXRhX3NldCAoZGF0YV9zZXRfbmV3LCBHQ1JZX0FDX0ZMQUdfREVBTExPQywgc3RyaW5nLCBtcGkpOworICAgICAgaWYgKGVycikKKwlicmVhazsKKworLyogICAgICAgZ2NyeV9mcmVlIChzdHJpbmcpOyAqLworICAgICAgc3RyaW5nID0gTlVMTDsKKy8qICAgICAgIGdjcnlfbXBpX3JlbGVhc2UgKG1waSk7ICovCisgICAgICBtcGkgPSBOVUxMOworCisgICAgICBnY3J5X3NleHBfcmVsZWFzZSAoc2V4cF90bXApOworICAgICAgc2V4cF90bXAgPSBOVUxMOworICAgIH0KKyAgaWYgKGVycikKKyAgICBnb3RvIG91dDsKKworICAqZGF0YV9zZXQgPSBkYXRhX3NldF9uZXc7CisKKyBvdXQ6CisKKyAgaWYgKHNleHBfY3VyICE9IHNleHApCisgICAgZ2NyeV9zZXhwX3JlbGVhc2UgKHNleHBfY3VyKTsKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKHNleHBfdG1wKTsKKyAgZ2NyeV9tcGlfcmVsZWFzZSAobXBpKTsKKyAgZ2NyeV9mcmVlIChzdHJpbmcpOworICAKKyAgaWYgKGVycikKKyAgICBnY3J5X2FjX2RhdGFfZGVzdHJveSAoZGF0YV9zZXRfbmV3KTsKKworICByZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyB2b2lkCitfZ2NyeV9hY19kYXRhX2R1bXAgKGNvbnN0IGNoYXIgKnByZWZpeCwgZ2NyeV9hY19kYXRhX3QgZGF0YSkKK3sKKyAgdW5zaWduZWQgY2hhciAqbXBpX2J1ZmZlcjsKKyAgc2l6ZV90IG1waV9idWZmZXJfbjsKKyAgdW5zaWduZWQgaW50IGRhdGFfbjsKKyAgZ2NyeV9lcnJvcl90IGVycjsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgZ2NyeV9tcGlfdCBtcGk7CisgIHVuc2lnbmVkIGludCBpOworCisgIGlmICghIGRhdGEpCisgICAgcmV0dXJuOworCisgIGlmIChmaXBzX21vZGUgKCkpCisgICAgcmV0dXJuOworCisgIG1waV9idWZmZXIgPSBOVUxMOworCisgIGRhdGFfbiA9IF9nY3J5X2FjX2RhdGFfbGVuZ3RoIChkYXRhKTsKKyAgZm9yIChpID0gMDsgaSA8IGRhdGFfbjsgaSsrKQorICAgIHsKKyAgICAgIGVyciA9IGdjcnlfYWNfZGF0YV9nZXRfaW5kZXggKGRhdGEsIDAsIGksICZuYW1lLCAmbXBpKTsKKyAgICAgIGlmIChlcnIpCisJeworCSAgbG9nX2Vycm9yICgiZmFpbGVkIHRvIGR1bXAgZGF0YSBzZXQiKTsKKwkgIGJyZWFrOworCX0KKworICAgICAgZXJyID0gZ2NyeV9tcGlfYXByaW50IChHQ1JZTVBJX0ZNVF9IRVgsICZtcGlfYnVmZmVyLCAmbXBpX2J1ZmZlcl9uLCBtcGkpOworICAgICAgaWYgKGVycikKKwl7CisJICBsb2dfZXJyb3IgKCJmYWlsZWQgdG8gZHVtcCBkYXRhIHNldCIpOworCSAgYnJlYWs7CisJfQorCisgICAgICBsb2dfcHJpbnRmICgiJXMlcyVzOiAlc1xuIiwKKwkJICBwcmVmaXggPyBwcmVmaXggOiAiIiwKKwkJICBwcmVmaXggPyAiOiAiIDogIiIKKwkJICAsIG5hbWUsIG1waV9idWZmZXIpOworCisgICAgICBnY3J5X2ZyZWUgKG1waV9idWZmZXIpOworICAgICAgbXBpX2J1ZmZlciA9IE5VTEw7CisgICAgfQorCisgIGdjcnlfZnJlZSAobXBpX2J1ZmZlcik7Cit9CisKKy8qIER1bXAgdGhlIG5hbWVkIE1QSSB2YWx1ZXMgY29udGFpbmVkIGluIHRoZSBkYXRhIHNldCBEQVRBIHRvCisgICBMaWJnY3J5cHQncyBsb2dnaW5nIHN0cmVhbS4gICovCit2b2lkCitnY3J5X2FjX2RhdGFfZHVtcCAoY29uc3QgY2hhciAqcHJlZml4LCBnY3J5X2FjX2RhdGFfdCBkYXRhKQoreworICBfZ2NyeV9hY19kYXRhX2R1bXAgKHByZWZpeCwgZGF0YSk7Cit9CisKKy8qIERlc3Ryb3lzIGFueSB2YWx1ZXMgY29udGFpbmVkIGluIHRoZSBkYXRhIHNldCBEQVRBLiAgKi8KK3ZvaWQKK19nY3J5X2FjX2RhdGFfY2xlYXIgKGdjcnlfYWNfZGF0YV90IGRhdGEpCit7CisgIGFjX2RhdGFfdmFsdWVzX2Rlc3Ryb3kgKGRhdGEpOworICBnY3J5X2ZyZWUgKGRhdGEtPmRhdGEpOworICBkYXRhLT5kYXRhID0gTlVMTDsKKyAgZGF0YS0+ZGF0YV9uID0gMDsKK30KKworDAorCisvKgorICogSW1wbGVtZW50YXRpb24gb2YgYGFjIGlvJyBvYmplY3RzLgorICovCisKKy8qIEluaXRpYWxpemUgQUNfSU8gYWNjb3JkaW5nIHRvIE1PREUsIFRZUEUgYW5kIHRoZSB2YXJpYWJsZSBsaXN0IG9mCisgICBhcmd1bWVudHMgQVAuICBUaGUgbGlzdCBvZiB2YXJpYWJsZSBhcmd1bWVudHMgdG8gc3BlY2lmeSBkZXBlbmRzIG9uCisgICB0aGUgZ2l2ZW4gVFlQRS4gICovCit2b2lkCitfZ2NyeV9hY19pb19pbml0X3ZhIChnY3J5X2FjX2lvX3QgKmFjX2lvLAorCQkgICAgIGdjcnlfYWNfaW9fbW9kZV90IG1vZGUsIGdjcnlfYWNfaW9fdHlwZV90IHR5cGUsIHZhX2xpc3QgYXApCit7CisgIG1lbXNldCAoYWNfaW8sIDAsIHNpemVvZiAoKmFjX2lvKSk7CisKKyAgaWYgKGZpcHNfbW9kZSAoKSkKKyAgICByZXR1cm47CisKKyAgZ2NyeV9hc3NlcnQgKChtb2RlID09IEdDUllfQUNfSU9fUkVBREFCTEUpIHx8IChtb2RlID09IEdDUllfQUNfSU9fV1JJVEFCTEUpKTsKKyAgZ2NyeV9hc3NlcnQgKCh0eXBlID09IEdDUllfQUNfSU9fU1RSSU5HKSB8fCAodHlwZSA9PSBHQ1JZX0FDX0lPX1NUUklORykpOworCisgIGFjX2lvLT5tb2RlID0gbW9kZTsKKyAgYWNfaW8tPnR5cGUgPSB0eXBlOworCisgIHN3aXRjaCAobW9kZSkKKyAgICB7CisgICAgY2FzZSBHQ1JZX0FDX0lPX1JFQURBQkxFOgorICAgICAgc3dpdGNoICh0eXBlKQorCXsKKwljYXNlIEdDUllfQUNfSU9fU1RSSU5HOgorCSAgYWNfaW8tPmlvLnJlYWRhYmxlLnN0cmluZy5kYXRhID0gdmFfYXJnIChhcCwgdW5zaWduZWQgY2hhciAqKTsKKwkgIGFjX2lvLT5pby5yZWFkYWJsZS5zdHJpbmcuZGF0YV9uID0gdmFfYXJnIChhcCwgc2l6ZV90KTsKKwkgIGJyZWFrOworCisJY2FzZSBHQ1JZX0FDX0lPX0NBTExCQUNLOgorCSAgYWNfaW8tPmlvLnJlYWRhYmxlLmNhbGxiYWNrLmNiID0gdmFfYXJnIChhcCwgZ2NyeV9hY19kYXRhX3JlYWRfY2JfdCk7CisJICBhY19pby0+aW8ucmVhZGFibGUuY2FsbGJhY2sub3BhcXVlID0gdmFfYXJnIChhcCwgdm9pZCAqKTsKKwkgIGJyZWFrOworCX0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR0NSWV9BQ19JT19XUklUQUJMRToKKyAgICAgIHN3aXRjaCAodHlwZSkKKwl7CisJY2FzZSBHQ1JZX0FDX0lPX1NUUklORzoKKwkgIGFjX2lvLT5pby53cml0YWJsZS5zdHJpbmcuZGF0YSA9IHZhX2FyZyAoYXAsIHVuc2lnbmVkIGNoYXIgKiopOworCSAgYWNfaW8tPmlvLndyaXRhYmxlLnN0cmluZy5kYXRhX24gPSB2YV9hcmcgKGFwLCBzaXplX3QgKik7CisJICBicmVhazsKKworCWNhc2UgR0NSWV9BQ19JT19DQUxMQkFDSzoKKwkgIGFjX2lvLT5pby53cml0YWJsZS5jYWxsYmFjay5jYiA9IHZhX2FyZyAoYXAsIGdjcnlfYWNfZGF0YV93cml0ZV9jYl90KTsKKwkgIGFjX2lvLT5pby53cml0YWJsZS5jYWxsYmFjay5vcGFxdWUgPSB2YV9hcmcgKGFwLCB2b2lkICopOworCSAgYnJlYWs7CisJfQorICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKiBJbml0aWFsaXplIEFDX0lPIGFjY29yZGluZyB0byBNT0RFLCBUWVBFIGFuZCB0aGUgdmFyaWFibGUgbGlzdCBvZgorICAgYXJndW1lbnRzLiAgVGhlIGxpc3Qgb2YgdmFyaWFibGUgYXJndW1lbnRzIHRvIHNwZWNpZnkgZGVwZW5kcyBvbgorICAgdGhlIGdpdmVuIFRZUEUuICovCit2b2lkCitfZ2NyeV9hY19pb19pbml0IChnY3J5X2FjX2lvX3QgKmFjX2lvLAorCQkgIGdjcnlfYWNfaW9fbW9kZV90IG1vZGUsIGdjcnlfYWNfaW9fdHlwZV90IHR5cGUsIC4uLikKK3sKKyAgdmFfbGlzdCBhcDsKKworICB2YV9zdGFydCAoYXAsIHR5cGUpOworICBfZ2NyeV9hY19pb19pbml0X3ZhIChhY19pbywgbW9kZSwgdHlwZSwgYXApOworICB2YV9lbmQgKGFwKTsKK30KKworCisvKiBXcml0ZSB0byB0aGUgSU8gb2JqZWN0IEFDX0lPIEJVRkZFUl9OIGJ5dGVzIGZyb20gQlVGRkVSLiAgUmV0dXJuCisgICB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZS4gICovCitzdGF0aWMgZ2NyeV9lcnJvcl90CitfZ2NyeV9hY19pb193cml0ZSAoZ2NyeV9hY19pb190ICphY19pbywgdW5zaWduZWQgY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmZmVyX24pCit7CisgIGdjcnlfZXJyb3JfdCBlcnI7CisKKyAgZ2NyeV9hc3NlcnQgKGFjX2lvLT5tb2RlID09IEdDUllfQUNfSU9fV1JJVEFCTEUpOworICBlcnIgPSAwOworCisgIHN3aXRjaCAoYWNfaW8tPnR5cGUpCisgICAgeworICAgIGNhc2UgR0NSWV9BQ19JT19TVFJJTkc6CisgICAgICB7CisJdW5zaWduZWQgY2hhciAqcDsKKworCWlmICgqYWNfaW8tPmlvLndyaXRhYmxlLnN0cmluZy5kYXRhKQorCSAgeworCSAgICBwID0gZ2NyeV9yZWFsbG9jICgqYWNfaW8tPmlvLndyaXRhYmxlLnN0cmluZy5kYXRhLAorCQkJICAgICAgKmFjX2lvLT5pby53cml0YWJsZS5zdHJpbmcuZGF0YV9uICsgYnVmZmVyX24pOworCSAgICBpZiAoISBwKQorCSAgICAgIGVyciA9IGdjcnlfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pOworCSAgICBlbHNlCisJICAgICAgeworCQlpZiAoKmFjX2lvLT5pby53cml0YWJsZS5zdHJpbmcuZGF0YSAhPSBwKQorCQkgICphY19pby0+aW8ud3JpdGFibGUuc3RyaW5nLmRhdGEgPSBwOworCQltZW1jcHkgKHAgKyAqYWNfaW8tPmlvLndyaXRhYmxlLnN0cmluZy5kYXRhX24sIGJ1ZmZlciwgYnVmZmVyX24pOworCQkqYWNfaW8tPmlvLndyaXRhYmxlLnN0cmluZy5kYXRhX24gKz0gYnVmZmVyX247CisJICAgICAgfQorCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgaWYgKGdjcnlfaXNfc2VjdXJlIChidWZmZXIpKQorCSAgICAgIHAgPSBnY3J5X21hbGxvY19zZWN1cmUgKGJ1ZmZlcl9uKTsKKwkgICAgZWxzZQorCSAgICAgIHAgPSBnY3J5X21hbGxvYyAoYnVmZmVyX24pOworCSAgICBpZiAoISBwKQorCSAgICAgIGVyciA9IGdjcnlfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pOworCSAgICBlbHNlCisJICAgICAgeworCQltZW1jcHkgKHAsIGJ1ZmZlciwgYnVmZmVyX24pOworCQkqYWNfaW8tPmlvLndyaXRhYmxlLnN0cmluZy5kYXRhID0gcDsKKwkJKmFjX2lvLT5pby53cml0YWJsZS5zdHJpbmcuZGF0YV9uID0gYnVmZmVyX247CisJICAgICAgfQorCSAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdDUllfQUNfSU9fQ0FMTEJBQ0s6CisgICAgICBlcnIgPSAoKmFjX2lvLT5pby53cml0YWJsZS5jYWxsYmFjay5jYikgKGFjX2lvLT5pby53cml0YWJsZS5jYWxsYmFjay5vcGFxdWUsCisJCQkJCSAgICAgICBidWZmZXIsIGJ1ZmZlcl9uKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm4gZXJyOworfQorCisvKiBSZWFkICpCVUZGRVJfTiBieXRlcyBmcm9tIHRoZSBJTyBvYmplY3QgQUNfSU8gaW50byBCVUZGRVI7IE5SRUFECisgICBieXRlcyBoYXZlIGFscmVhZHkgYmVlbiByZWFkIGZyb20gdGhlIG9iamVjdDsgb24gc3VjY2Vzcywgc3RvcmUgdGhlCisgICBhbW91bnQgb2YgYnl0ZXMgcmVhZCBpbiAqQlVGRkVSX047IHplcm8gYnl0ZXMgcmVhZCBtZWFucyBFT0YuCisgICBSZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGVycm9yIGNvZGUuICAqLworc3RhdGljIGdjcnlfZXJyb3JfdAorX2djcnlfYWNfaW9fcmVhZCAoZ2NyeV9hY19pb190ICphY19pbywKKwkJICB1bnNpZ25lZCBpbnQgbnJlYWQsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgc2l6ZV90ICpidWZmZXJfbikKK3sKKyAgZ2NyeV9lcnJvcl90IGVycjsKKyAgCisgIGdjcnlfYXNzZXJ0IChhY19pby0+bW9kZSA9PSBHQ1JZX0FDX0lPX1JFQURBQkxFKTsKKyAgZXJyID0gMDsKKworICBzd2l0Y2ggKGFjX2lvLT50eXBlKQorICAgIHsKKyAgICBjYXNlIEdDUllfQUNfSU9fU1RSSU5HOgorICAgICAgeworCXNpemVfdCBieXRlc19hdmFpbGFibGU7CisJc2l6ZV90IGJ5dGVzX3RvX3JlYWQ7CisJc2l6ZV90IGJ5dGVzX3dhbnRlZDsKKworCWJ5dGVzX2F2YWlsYWJsZSA9IGFjX2lvLT5pby5yZWFkYWJsZS5zdHJpbmcuZGF0YV9uIC0gbnJlYWQ7CisJYnl0ZXNfd2FudGVkID0gKmJ1ZmZlcl9uOworCisJaWYgKGJ5dGVzX3dhbnRlZCA+IGJ5dGVzX2F2YWlsYWJsZSkKKwkgIGJ5dGVzX3RvX3JlYWQgPSBieXRlc19hdmFpbGFibGU7CisJZWxzZQorCSAgYnl0ZXNfdG9fcmVhZCA9IGJ5dGVzX3dhbnRlZDsKKworCW1lbWNweSAoYnVmZmVyLCBhY19pby0+aW8ucmVhZGFibGUuc3RyaW5nLmRhdGEgKyBucmVhZCwgYnl0ZXNfdG9fcmVhZCk7CisJKmJ1ZmZlcl9uID0gYnl0ZXNfdG9fcmVhZDsKKwllcnIgPSAwOworCWJyZWFrOworICAgICAgfQorCisgICAgY2FzZSBHQ1JZX0FDX0lPX0NBTExCQUNLOgorICAgICAgZXJyID0gKCphY19pby0+aW8ucmVhZGFibGUuY2FsbGJhY2suY2IpCisJKGFjX2lvLT5pby5yZWFkYWJsZS5jYWxsYmFjay5vcGFxdWUsIGJ1ZmZlciwgYnVmZmVyX24pOworICAgICAgYnJlYWs7CisgICAgfQorCisgIHJldHVybiBlcnI7Cit9CisKKy8qIFJlYWQgYWxsIGRhdGEgYXZhaWxhYmxlIGZyb20gdGhlIElPIG9iamVjdCBBQ19JTyBpbnRvIG5ld2x5CisgICBhbGxvY2F0ZWQgbWVtb3J5LCBzdG9yaW5nIGFuIGFwcHJvcHJpYXRlIHBvaW50ZXIgaW4gKkJVRkZFUiBhbmQgdGhlCisgICBhbW91bnQgb2YgYnl0ZXMgcmVhZCBpbiAqQlVGRkVSX04uICBSZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGVycm9yCisgICBjb2RlLiAgKi8KK3N0YXRpYyBnY3J5X2Vycm9yX3QKK19nY3J5X2FjX2lvX3JlYWRfYWxsIChnY3J5X2FjX2lvX3QgKmFjX2lvLCB1bnNpZ25lZCBjaGFyICoqYnVmZmVyLCBzaXplX3QgKmJ1ZmZlcl9uKQoreworICB1bnNpZ25lZCBjaGFyICpidWZmZXJfbmV3OworICBzaXplX3QgYnVmZmVyX25ld19uOworICB1bnNpZ25lZCBjaGFyIGJ1ZltCVUZTSVpdOworICBzaXplX3QgYnVmX247CisgIHVuc2lnbmVkIGNoYXIgKnA7CisgIGdjcnlfZXJyb3JfdCBlcnI7CisKKyAgYnVmZmVyX25ldyA9IE5VTEw7CisgIGJ1ZmZlcl9uZXdfbiA9IDA7CisKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgYnVmX24gPSBzaXplb2YgKGJ1Zik7CisgICAgICBlcnIgPSBfZ2NyeV9hY19pb19yZWFkIChhY19pbywgYnVmZmVyX25ld19uLCBidWYsICZidWZfbik7CisgICAgICBpZiAoZXJyKQorCWJyZWFrOworCisgICAgICBpZiAoYnVmX24pCisJeworCSAgcCA9IGdjcnlfcmVhbGxvYyAoYnVmZmVyX25ldywgYnVmZmVyX25ld19uICsgYnVmX24pOworCSAgaWYgKCEgcCkKKwkgICAgeworCSAgICAgIGVyciA9IGdjcnlfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICAKKwkgIGlmIChidWZmZXJfbmV3ICE9IHApCisJICAgIGJ1ZmZlcl9uZXcgPSBwOworCisJICBtZW1jcHkgKGJ1ZmZlcl9uZXcgKyBidWZmZXJfbmV3X24sIGJ1ZiwgYnVmX24pOworCSAgYnVmZmVyX25ld19uICs9IGJ1Zl9uOworCX0KKyAgICAgIGVsc2UKKwlicmVhazsKKyAgICB9CisgIGlmIChlcnIpCisgICAgZ290byBvdXQ7CisKKyAgKmJ1ZmZlcl9uID0gYnVmZmVyX25ld19uOworICAqYnVmZmVyID0gYnVmZmVyX25ldzsKKworIG91dDoKKworICBpZiAoZXJyKQorICAgIGdjcnlfZnJlZSAoYnVmZmVyX25ldyk7CisKKyAgcmV0dXJuIGVycjsKK30KKworLyogUmVhZCBkYXRhIGNodW5rcyBmcm9tIHRoZSBJTyBvYmplY3QgQUNfSU8gdW50aWwgRU9GLCBmZWVkaW5nIHRoZW0KKyAgIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBDQi4gIFJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgZXJyb3IKKyAgIGNvZGUuICAqLworc3RhdGljIGdjcnlfZXJyb3JfdAorX2djcnlfYWNfaW9fcHJvY2VzcyAoZ2NyeV9hY19pb190ICphY19pbywKKwkJICAgICBnY3J5X2FjX2RhdGFfd3JpdGVfY2JfdCBjYiwgdm9pZCAqb3BhcXVlKQoreworICB1bnNpZ25lZCBjaGFyIGJ1ZmZlcltCVUZTSVpdOworICB1bnNpZ25lZCBpbnQgbnJlYWQ7CisgIHNpemVfdCBidWZmZXJfbjsKKyAgZ2NyeV9lcnJvcl90IGVycjsKKworICBucmVhZCA9IDA7CisKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgYnVmZmVyX24gPSBzaXplb2YgKGJ1ZmZlcik7CisgICAgICBlcnIgPSBfZ2NyeV9hY19pb19yZWFkIChhY19pbywgbnJlYWQsIGJ1ZmZlciwgJmJ1ZmZlcl9uKTsKKyAgICAgIGlmIChlcnIpCisJYnJlYWs7CisgICAgICBpZiAoYnVmZmVyX24pCisJeworCSAgZXJyID0gKCpjYikgKG9wYXF1ZSwgYnVmZmVyLCBidWZmZXJfbik7CisJICBpZiAoZXJyKQorCSAgICBicmVhazsKKwkgIG5yZWFkICs9IGJ1ZmZlcl9uOworCX0KKyAgICAgIGVsc2UKKwlicmVhazsKKyAgICB9CisKKyAgcmV0dXJuIGVycjsKK30KKworDAorCisvKiAKKyAqIEZ1bmN0aW9ucyBmb3IgY29udmVydGluZyBkYXRhIGJldHdlZW4gdGhlIG5hdGl2ZSBhYyBhbmQgdGhlCisgKiBTLWV4cHJlc3Npb24gc3RydWN0dXJlIHVzZWQgYnkgdGhlIHBrIGludGVyZmFjZS4KKyAqLworCisvKiBFeHRyYWN0IHRoZSBTLUV4cHJlc3Npb24gREFUQV9TRVhQIGludG8gREFUQSB1bmRlciB0aGUgY29udHJvbCBvZgorICAgVFlQRSBhbmQgTkFNRS4gIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IFMtRXhwcmVzc2lvbnMgYXJlIG9mIHRoZQorICAgZm9sbG93aW5nIHN0cnVjdHVyZToKKworICAgKElERU5USUZJRVIgWy4uLl0KKyAgIChBTEdPUklUSE0gPGxpc3Qgb2YgbmFtZWQgTVBJIHZhbHVlcz4pKSAqLworc3RhdGljIGdjcnlfZXJyb3JfdAorYWNfZGF0YV9leHRyYWN0IChjb25zdCBjaGFyICppZGVudGlmaWVyLCBjb25zdCBjaGFyICphbGdvcml0aG0sCisJCSBnY3J5X3NleHBfdCBzZXhwLCBnY3J5X2FjX2RhdGFfdCAqZGF0YSkKK3sKKyAgZ2NyeV9lcnJvcl90IGVycjsKKyAgZ2NyeV9zZXhwX3QgdmFsdWVfc2V4cDsKKyAgZ2NyeV9zZXhwX3QgZGF0YV9zZXhwOworICBzaXplX3QgZGF0YV9zZXhwX247CisgIGdjcnlfbXBpX3QgdmFsdWVfbXBpOworICBjaGFyICp2YWx1ZV9uYW1lOworICBjb25zdCBjaGFyICpkYXRhX3JhdzsKKyAgc2l6ZV90IGRhdGFfcmF3X247CisgIGdjcnlfYWNfZGF0YV90IGRhdGFfbmV3OworICB1bnNpZ25lZCBpbnQgaTsKKworICB2YWx1ZV9zZXhwID0gTlVMTDsKKyAgZGF0YV9zZXhwID0gTlVMTDsKKyAgdmFsdWVfbmFtZSA9IE5VTEw7CisgIHZhbHVlX21waSA9IE5VTEw7CisgIGRhdGFfbmV3ID0gTlVMTDsKKworICAvKiBWZXJpZnkgdGhhdCB0aGUgUy1leHByZXNzaW9uIGNvbnRhaW5zIHRoZSBjb3JyZWN0IGlkZW50aWZpZXIuICAqLworICBkYXRhX3JhdyA9IGdjcnlfc2V4cF9udGhfZGF0YSAoc2V4cCwgMCwgJmRhdGFfcmF3X24pOworICBpZiAoKCEgZGF0YV9yYXcpIHx8IHN0cm5jbXAgKGlkZW50aWZpZXIsIGRhdGFfcmF3LCBkYXRhX3Jhd19uKSkKKyAgICB7CisgICAgICBlcnIgPSBnY3J5X2Vycm9yIChHUEdfRVJSX0lOVl9TRVhQKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAvKiBFeHRyYWN0IGlubmVyIFMtZXhwcmVzc2lvbi4gICovCisgIGRhdGFfc2V4cCA9IGdjcnlfc2V4cF9maW5kX3Rva2VuIChzZXhwLCBhbGdvcml0aG0sIDApOworICBpZiAoISBkYXRhX3NleHApCisgICAgeworICAgICAgZXJyID0gZ2NyeV9lcnJvciAoR1BHX0VSUl9JTlZfU0VYUCk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgLyogQ291bnQgZGF0YSBlbGVtZW50cy4gICovCisgIGRhdGFfc2V4cF9uID0gZ2NyeV9zZXhwX2xlbmd0aCAoZGF0YV9zZXhwKTsKKyAgZGF0YV9zZXhwX24tLTsKKworICAvKiBBbGxvY2F0ZSBuZXcgZGF0YSBzZXQuICAqLworICBlcnIgPSBfZ2NyeV9hY19kYXRhX25ldyAoJmRhdGFfbmV3KTsKKyAgaWYgKGVycikKKyAgICBnb3RvIG91dDsKKworICAvKiBJdGVyYXRlIHRocm91Z2ggbGlzdCBvZiBkYXRhIGVsZW1lbnRzIGFuZCBhZGQgdGhlbSB0byB0aGUgZGF0YQorICAgICBzZXQuICAqLworICBmb3IgKGkgPSAwOyBpIDwgZGF0YV9zZXhwX247IGkrKykKKyAgICB7CisgICAgICAvKiBHZXQgdGhlIFMtZXhwcmVzc2lvbiBvZiB0aGUgbmFtZWQgTVBJLCB0aGF0IGNvbnRhaW5zIHRoZSBuYW1lCisJIGFuZCB0aGUgTVBJIHZhbHVlLiAgKi8KKyAgICAgIHZhbHVlX3NleHAgPSBnY3J5X3NleHBfbnRoIChkYXRhX3NleHAsIGkgKyAxKTsKKyAgICAgIGlmICghIHZhbHVlX3NleHApCisJeworCSAgZXJyID0gZ2NyeV9lcnJvciAoR1BHX0VSUl9JTlZfU0VYUCk7CisJICBicmVhazsKKwl9CisKKyAgICAgIC8qIEV4dHJhY3QgdGhlIG5hbWUuICAqLworICAgICAgZGF0YV9yYXcgPSBnY3J5X3NleHBfbnRoX2RhdGEgKHZhbHVlX3NleHAsIDAsICZkYXRhX3Jhd19uKTsKKyAgICAgIGlmICghIGRhdGFfcmF3KQorCXsKKwkgIGVyciA9IGdjcnlfZXJyb3IgKEdQR19FUlJfSU5WX1NFWFApOworCSAgYnJlYWs7CisJfQorCisgICAgICAvKiBFeHRyYWN0IHRoZSBNUEkgdmFsdWUuICAqLworICAgICAgdmFsdWVfbXBpID0gZ2NyeV9zZXhwX250aF9tcGkgKHZhbHVlX3NleHAsIDEsIEdDUllNUElfRk1UX1VTRyk7CisgICAgICBpZiAoISB2YWx1ZV9tcGkpCisJeworCSAgZXJyID0gZ2NyeV9lcnJvciAoR1BHX0VSUl9JTlRFUk5BTCk7IC8qIEZJWE1FPyAqLworCSAgYnJlYWs7CisJfQorCisgICAgICAvKiBEdXBsaWNhdGUgdGhlIG5hbWUuICAqLworICAgICAgdmFsdWVfbmFtZSA9IGdjcnlfbWFsbG9jIChkYXRhX3Jhd19uICsgMSk7CisgICAgICBpZiAoISB2YWx1ZV9uYW1lKQorCXsKKwkgIGVyciA9IGdjcnlfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pOworCSAgYnJlYWs7CisJfQorICAgICAgc3RybmNweSAodmFsdWVfbmFtZSwgZGF0YV9yYXcsIGRhdGFfcmF3X24pOworICAgICAgdmFsdWVfbmFtZVtkYXRhX3Jhd19uXSA9IDA7CisKKyAgICAgIGVyciA9IF9nY3J5X2FjX2RhdGFfc2V0IChkYXRhX25ldywgR0NSWV9BQ19GTEFHX0RFQUxMT0MsIHZhbHVlX25hbWUsIHZhbHVlX21waSk7CisgICAgICBpZiAoZXJyKQorCWJyZWFrOworCisgICAgICBnY3J5X3NleHBfcmVsZWFzZSAodmFsdWVfc2V4cCk7CisgICAgICB2YWx1ZV9zZXhwID0gTlVMTDsKKyAgICAgIHZhbHVlX25hbWUgPSBOVUxMOworICAgICAgdmFsdWVfbXBpID0gTlVMTDsKKyAgICB9CisgIGlmIChlcnIpCisgICAgZ290byBvdXQ7CisKKyAgLyogQ29weSBvdXQuICAqLworICAqZGF0YSA9IGRhdGFfbmV3OworCisgb3V0OgorCisgIC8qIERlYWxsb2NhdGUgcmVzb3VyY2VzLiAgKi8KKyAgaWYgKGVycikKKyAgICB7CisgICAgICBfZ2NyeV9hY19kYXRhX2Rlc3Ryb3kgKGRhdGFfbmV3KTsKKyAgICAgIGdjcnlfbXBpX3JlbGVhc2UgKHZhbHVlX21waSk7CisgICAgICBnY3J5X2ZyZWUgKHZhbHVlX25hbWUpOworICAgICAgZ2NyeV9zZXhwX3JlbGVhc2UgKHZhbHVlX3NleHApOworICAgIH0KKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKGRhdGFfc2V4cCk7CisKKyAgcmV0dXJuIGVycjsKK30KKworLyogQ29uc3RydWN0IGFuIFMtZXhwcmVzc2lvbiBmcm9tIHRoZSBEQVRBIGFuZCBzdG9yZSBpdCBpbgorICAgREFUQV9TRVhQLiBUaGUgUy1leHByZXNzaW9uIHdpbGwgYmUgb2YgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6CisKKyAgIChJREVOVElGSUVSIFsoZmxhZ3MgWy4uLl0pXQorICAgKEFMR09SSVRITSA8bGlzdCBvZiBuYW1lZCBNUEkgdmFsdWVzPikpICAqLworc3RhdGljIGdjcnlfZXJyb3JfdAorYWNfZGF0YV9jb25zdHJ1Y3QgKGNvbnN0IGNoYXIgKmlkZW50aWZpZXIsIGludCBpbmNsdWRlX2ZsYWdzLAorCQkgICB1bnNpZ25lZCBpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmFsZ29yaXRobSwKKwkJICAgZ2NyeV9hY19kYXRhX3QgZGF0YSwgZ2NyeV9zZXhwX3QgKnNleHApCit7CisgIHVuc2lnbmVkIGludCBkYXRhX2xlbmd0aDsKKyAgZ2NyeV9zZXhwX3Qgc2V4cF9uZXc7CisgIGdjcnlfZXJyb3JfdCBlcnI7CisgIHNpemVfdCBzZXhwX2Zvcm1hdF9uOworICBjaGFyICpzZXhwX2Zvcm1hdDsKKyAgdm9pZCAqKmFyZ19saXN0OworICB1bnNpZ25lZCBpbnQgaTsKKworICBhcmdfbGlzdCA9IE5VTEw7CisgIHNleHBfbmV3ID0gTlVMTDsKKyAgc2V4cF9mb3JtYXQgPSBOVUxMOworCisgIC8qIFdlIGJ1aWxkIGEgbGlzdCBvZiBhcmd1bWVudHMgdG8gcGFzcyB0bworICAgICBnY3J5X3NleHBfYnVpbGRfYXJyYXkoKS4gICovCisgIGRhdGFfbGVuZ3RoID0gX2djcnlfYWNfZGF0YV9sZW5ndGggKGRhdGEpOworICBhcmdfbGlzdCA9IGdjcnlfbWFsbG9jIChzaXplb2YgKCphcmdfbGlzdCkgKiAoZGF0YV9sZW5ndGggKiAyKSk7CisgIGlmICghIGFyZ19saXN0KQorICAgIHsKKyAgICAgIGVyciA9IGdjcnlfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIC8qIEZpbGwgbGlzdCB3aXRoIE1QSXMuICAqLworICBmb3IgKGkgPSAwOyBpIDwgZGF0YV9sZW5ndGg7IGkrKykKKyAgICB7CisgICAgICBjaGFyICoqbmFtZWFkZHIgID0gJmRhdGEtPmRhdGFbaV0ubmFtZTsKKworICAgICAgYXJnX2xpc3RbKGkgKiAyKSArIDBdID0gbmFtZWFkZHI7CisgICAgICBhcmdfbGlzdFsoaSAqIDIpICsgMV0gPSAmZGF0YS0+ZGF0YVtpXS5tcGk7CisgICAgfQorCisgIC8qIENhbGN1bGF0ZSBzaXplIG9mIGZvcm1hdCBzdHJpbmcuICAqLworICBzZXhwX2Zvcm1hdF9uID0gKDMKKwkJICAgKyAoaW5jbHVkZV9mbGFncyA/IDcgOiAwKQorCQkgICArIChhbGdvcml0aG0gPyAoMiArIHN0cmxlbiAoYWxnb3JpdGhtKSkgOiAwKQorCQkgICArIHN0cmxlbiAoaWRlbnRpZmllcikpOworCisgIGZvciAoaSA9IDA7IGkgPCBkYXRhX2xlbmd0aDsgaSsrKQorICAgIC8qIFBlci1lbGVtZW50IHNpemVzLiAgKi8KKyAgICBzZXhwX2Zvcm1hdF9uICs9IDY7CisKKyAgaWYgKGluY2x1ZGVfZmxhZ3MpCisgICAgLyogQWRkIGZsYWdzLiAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgRElNIChhY19mbGFncyk7IGkrKykKKyAgICAgIGlmIChmbGFncyAmIGFjX2ZsYWdzW2ldLm51bWJlcikKKwlzZXhwX2Zvcm1hdF9uICs9IHN0cmxlbiAoYWNfZmxhZ3NbaV0uc3RyaW5nKSArIDE7CisKKyAgLyogRG9uZS4gICovCisgIHNleHBfZm9ybWF0ID0gZ2NyeV9tYWxsb2MgKHNleHBfZm9ybWF0X24pOworICBpZiAoISBzZXhwX2Zvcm1hdCkKKyAgICB7CisgICAgICBlcnIgPSBnY3J5X2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAvKiBDb25zdHJ1Y3QgdGhlIGZvcm1hdCBzdHJpbmcuICAqLworCisgICpzZXhwX2Zvcm1hdCA9IDA7CisgIHN0cmNhdCAoc2V4cF9mb3JtYXQsICIoIik7CisgIHN0cmNhdCAoc2V4cF9mb3JtYXQsIGlkZW50aWZpZXIpOworICBpZiAoaW5jbHVkZV9mbGFncykKKyAgICB7CisgICAgICBzdHJjYXQgKHNleHBfZm9ybWF0LCAiKGZsYWdzIik7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgRElNIChhY19mbGFncyk7IGkrKykKKwlpZiAoZmxhZ3MgJiBhY19mbGFnc1tpXS5udW1iZXIpCisJICB7CisJICAgIHN0cmNhdCAoc2V4cF9mb3JtYXQsICIgIik7CisJICAgIHN0cmNhdCAoc2V4cF9mb3JtYXQsIGFjX2ZsYWdzW2ldLnN0cmluZyk7CisJICB9CisgICAgICBzdHJjYXQgKHNleHBfZm9ybWF0LCAiKSIpOworICAgIH0KKyAgaWYgKGFsZ29yaXRobSkKKyAgICB7CisgICAgICBzdHJjYXQgKHNleHBfZm9ybWF0LCAiKCIpOworICAgICAgc3RyY2F0IChzZXhwX2Zvcm1hdCwgYWxnb3JpdGhtKTsKKyAgICB9CisgIGZvciAoaSA9IDA7IGkgPCBkYXRhX2xlbmd0aDsgaSsrKQorICAgIHN0cmNhdCAoc2V4cF9mb3JtYXQsICIoJXMlbSkiKTsKKyAgaWYgKGFsZ29yaXRobSkKKyAgICBzdHJjYXQgKHNleHBfZm9ybWF0LCAiKSIpOworICBzdHJjYXQgKHNleHBfZm9ybWF0LCAiKSIpOworCisgIC8qIENyZWF0ZSBmaW5hbCBTLWV4cHJlc3Npb24uICAqLworICBlcnIgPSBnY3J5X3NleHBfYnVpbGRfYXJyYXkgKCZzZXhwX25ldywgTlVMTCwgc2V4cF9mb3JtYXQsIGFyZ19saXN0KTsKKyAgaWYgKGVycikKKyAgICBnb3RvIG91dDsKKworICAqc2V4cCA9IHNleHBfbmV3OworCisgb3V0OgorCisgIC8qIERlYWxsb2NhdGUgcmVzb3VyY2VzLiAgKi8KKyAgZ2NyeV9mcmVlIChzZXhwX2Zvcm1hdCk7CisgIGdjcnlfZnJlZSAoYXJnX2xpc3QpOworICBpZiAoZXJyKQorICAgIGdjcnlfc2V4cF9yZWxlYXNlIChzZXhwX25ldyk7CisKKyAgcmV0dXJuIGVycjsKK30KKworDAorCisvKgorICogSGFuZGxlIG1hbmFnZW1lbnQuCisgKi8KKworLyogQ3JlYXRlcyBhIG5ldyBoYW5kbGUgZm9yIHRoZSBhbGdvcml0aG0gQUxHT1JJVEhNIGFuZCBzdG9yZXMgaXQgaW4KKyAgIEhBTkRMRS4gIEZMQUdTIGlzIG5vdCB1c2VkIHlldC4gICovCitnY3J5X2Vycm9yX3QKK19nY3J5X2FjX29wZW4gKGdjcnlfYWNfaGFuZGxlX3QgKmhhbmRsZSwKKwkgICAgICAgZ2NyeV9hY19pZF90IGFsZ29yaXRobSwgdW5zaWduZWQgaW50IGZsYWdzKQoreworICBnY3J5X2FjX2hhbmRsZV90IGhhbmRsZV9uZXc7CisgIGNvbnN0IGNoYXIgKmFsZ29yaXRobV9uYW1lOworICBnY3J5X21vZHVsZV90IG1vZHVsZTsKKyAgZ2NyeV9lcnJvcl90IGVycjsKKworICAqaGFuZGxlID0gTlVMTDsKKyAgbW9kdWxlID0gTlVMTDsKKworICBpZiAoZmlwc19tb2RlICgpKQorICAgIHJldHVybiBncGdfZXJyb3IgKEdQR19FUlJfTk9UX1NVUFBPUlRFRCk7CisKKyAgLyogR2V0IG5hbWUuICAqLworICBhbGdvcml0aG1fbmFtZSA9IF9nY3J5X3BrX2FsaWFzZWRfYWxnb19uYW1lIChhbGdvcml0aG0pOworICBpZiAoISBhbGdvcml0aG1fbmFtZSkKKyAgICB7CisgICAgICBlcnIgPSBnY3J5X2Vycm9yIChHUEdfRVJSX1BVQktFWV9BTEdPKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAvKiBBY3F1aXJlIHJlZmVyZW5jZSB0byB0aGUgcHVia2V5IG1vZHVsZS4gICovCisgIGVyciA9IF9nY3J5X3BrX21vZHVsZV9sb29rdXAgKGFsZ29yaXRobSwgJm1vZHVsZSk7CisgIGlmIChlcnIpCisgICAgZ290byBvdXQ7CisgIAorICAvKiBBbGxvY2F0ZS4gICovCisgIGhhbmRsZV9uZXcgPSBnY3J5X21hbGxvYyAoc2l6ZW9mICgqaGFuZGxlX25ldykpOworICBpZiAoISBoYW5kbGVfbmV3KQorICAgIHsKKyAgICAgIGVyciA9IGdjcnlfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIC8qIERvbmUuICAqLworICBoYW5kbGVfbmV3LT5hbGdvcml0aG0gPSBhbGdvcml0aG07CisgIGhhbmRsZV9uZXctPmFsZ29yaXRobV9uYW1lID0gYWxnb3JpdGhtX25hbWU7CisgIGhhbmRsZV9uZXctPmZsYWdzID0gZmxhZ3M7CisgIGhhbmRsZV9uZXctPm1vZHVsZSA9IG1vZHVsZTsKKyAgKmhhbmRsZSA9IGhhbmRsZV9uZXc7CisKKyBvdXQ6CisgIAorICAvKiBEZWFsbG9jYXRlIHJlc291cmNlcy4gICovCisgIGlmIChlcnIpCisgICAgX2djcnlfcGtfbW9kdWxlX3JlbGVhc2UgKG1vZHVsZSk7CisKKyAgcmV0dXJuIGVycjsKK30KKworCisvKiBEZXN0cm95cyB0aGUgaGFuZGxlIEhBTkRMRS4gICovCit2b2lkCitfZ2NyeV9hY19jbG9zZSAoZ2NyeV9hY19oYW5kbGVfdCBoYW5kbGUpCit7CisgIC8qIFJlbGVhc2UgcmVmZXJlbmNlIHRvIHB1YmtleSBtb2R1bGUuICAqLworICBpZiAoaGFuZGxlKQorICAgIHsKKyAgICAgIF9nY3J5X3BrX21vZHVsZV9yZWxlYXNlIChoYW5kbGUtPm1vZHVsZSk7CisgICAgICBnY3J5X2ZyZWUgKGhhbmRsZSk7CisgICAgfQorfQorCisKKwwKKy8qIAorICogS2V5IG1hbmFnZW1lbnQuCisgKi8KKworLyogSW5pdGlhbGl6ZSBhIGtleSBmcm9tIGEgZ2l2ZW4gZGF0YSBzZXQuICAqLworLyogRklYTUUvRGFtbjogdGhlIGFyZ3VtZW50IEhBTkRMRSBpcyBub3Qgb25seSB1bm5lY2Vzc2FyeSwgaXQgaXMKKyAgIGNvbXBsZXRlbHkgV1JPTkcgaGVyZS4gICovCitnY3J5X2Vycm9yX3QKK19nY3J5X2FjX2tleV9pbml0IChnY3J5X2FjX2tleV90ICprZXksIGdjcnlfYWNfaGFuZGxlX3QgaGFuZGxlLAorCQkgICBnY3J5X2FjX2tleV90eXBlX3QgdHlwZSwgZ2NyeV9hY19kYXRhX3QgZGF0YSkKK3sKKyAgZ2NyeV9hY19kYXRhX3QgZGF0YV9uZXc7CisgIGdjcnlfYWNfa2V5X3Qga2V5X25ldzsKKyAgZ2NyeV9lcnJvcl90IGVycjsKKworICAodm9pZCloYW5kbGU7CisKKyAgaWYgKGZpcHNfbW9kZSAoKSkKKyAgICByZXR1cm4gZ3BnX2Vycm9yIChHUEdfRVJSX05PVF9TVVBQT1JURUQpOworCisgIC8qIEFsbG9jYXRlLiAgKi8KKyAga2V5X25ldyA9IGdjcnlfbWFsbG9jIChzaXplb2YgKCprZXlfbmV3KSk7CisgIGlmICghIGtleV9uZXcpCisgICAgeworICAgICAgZXJyID0gZ2NyeV9lcnJvcl9mcm9tX2Vycm5vIChlcnJubyk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgLyogQ29weSBkYXRhIHNldC4gICovCisgIGVyciA9IF9nY3J5X2FjX2RhdGFfY29weSAoJmRhdGFfbmV3LCBkYXRhKTsKKyAgaWYgKGVycikKKyAgICBnb3RvIG91dDsKKworICAvKiBEb25lLiAgKi8KKyAga2V5X25ldy0+ZGF0YSA9IGRhdGFfbmV3OworICBrZXlfbmV3LT50eXBlID0gdHlwZTsKKyAgKmtleSA9IGtleV9uZXc7CisKKyBvdXQ6CisKKyAgaWYgKGVycikKKyAgICAvKiBEZWFsbG9jYXRlIHJlc291cmNlcy4gICovCisgICAgZ2NyeV9mcmVlIChrZXlfbmV3KTsKKworICByZXR1cm4gZXJyOworfQorCisKKy8qIEdlbmVyYXRlcyBhIG5ldyBrZXkgcGFpciB2aWEgdGhlIGhhbmRsZSBIQU5ETEUgb2YgTkJJVFMgYml0cyBhbmQKKyAgIHN0b3JlcyBpdCBpbiBLRVlfUEFJUi4gIEluIGNhc2Ugbm9uLXN0YW5kYXJkIHNldHRpbmdzIGFyZSB3YW50ZWQsIGEKKyAgIHBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUgb2YgdHlwZSBnY3J5X2FjX2tleV9zcGVjXzxhbGdvcml0aG0+X3QsCisgICBtYXRjaGluZyB0aGUgc2VsZWN0ZWQgYWxnb3JpdGhtLCBjYW4gYmUgZ2l2ZW4gYXMgS0VZX1NQRUMuCisgICBNSVNDX0RBVEEgaXMgbm90IHVzZWQgeWV0LiAgKi8KK2djcnlfZXJyb3JfdAorX2djcnlfYWNfa2V5X3BhaXJfZ2VuZXJhdGUgKGdjcnlfYWNfaGFuZGxlX3QgaGFuZGxlLCB1bnNpZ25lZCBpbnQgbmJpdHMsCisJCQkgICAgdm9pZCAqa2V5X3NwZWMsCisJCQkgICAgZ2NyeV9hY19rZXlfcGFpcl90ICprZXlfcGFpciwKKwkJCSAgICBnY3J5X21waV90ICoqbWlzY19kYXRhKQoreworICBnY3J5X3NleHBfdCBnZW5rZXlfc2V4cF9yZXF1ZXN0OworICBnY3J5X3NleHBfdCBnZW5rZXlfc2V4cF9yZXBseTsKKyAgZ2NyeV9hY19kYXRhX3Qga2V5X2RhdGFfc2VjcmV0OworICBnY3J5X2FjX2RhdGFfdCBrZXlfZGF0YV9wdWJsaWM7CisgIGdjcnlfYWNfa2V5X3BhaXJfdCBrZXlfcGFpcl9uZXc7CisgIGdjcnlfYWNfa2V5X3Qga2V5X3NlY3JldDsKKyAgZ2NyeV9hY19rZXlfdCBrZXlfcHVibGljOworICBnY3J5X3NleHBfdCBrZXlfc2V4cDsKKyAgZ2NyeV9lcnJvcl90IGVycjsKKyAgY2hhciAqZ2Vua2V5X2Zvcm1hdDsKKyAgc2l6ZV90IGdlbmtleV9mb3JtYXRfbjsKKyAgdm9pZCAqKmFyZ19saXN0OworICBzaXplX3QgYXJnX2xpc3RfbjsKKyAgdW5zaWduZWQgaW50IGk7CisgIHVuc2lnbmVkIGludCBqOworCisgICh2b2lkKW1pc2NfZGF0YTsKKworICBpZiAoZmlwc19tb2RlICgpKQorICAgIHJldHVybiBncGdfZXJyb3IgKEdQR19FUlJfTk9UX1NVUFBPUlRFRCk7CisKKyAga2V5X2RhdGFfc2VjcmV0ID0gTlVMTDsKKyAga2V5X2RhdGFfcHVibGljID0gTlVMTDsKKyAga2V5X3NlY3JldCA9IE5VTEw7CisgIGtleV9wdWJsaWMgPSBOVUxMOworICBnZW5rZXlfZm9ybWF0ID0gTlVMTDsKKyAgYXJnX2xpc3QgPSBOVUxMOworICBnZW5rZXlfc2V4cF9yZXF1ZXN0ID0gTlVMTDsKKyAgZ2Vua2V5X3NleHBfcmVwbHkgPSBOVUxMOworICBrZXlfc2V4cCA9IE5VTEw7CisKKyAgLyogQWxsb2NhdGUga2V5IHBhaXIuICAqLworICBrZXlfcGFpcl9uZXcgPSBnY3J5X21hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZ2NyeV9hY19rZXlfcGFpcikpOworICBpZiAoISBrZXlfcGFpcl9uZXcpCisgICAgeworICAgICAgZXJyID0gZ2NyeV9lcnJvcl9mcm9tX2Vycm5vIChlcnJubyk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgLyogQWxsb2NhdGUga2V5cy4gICovCisgIGtleV9zZWNyZXQgPSBnY3J5X21hbGxvYyAoc2l6ZW9mICgqa2V5X3NlY3JldCkpOworICBpZiAoISBrZXlfc2VjcmV0KQorICAgIHsKKyAgICAgIGVyciA9IGdjcnlfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pOworICAgICAgZ290byBvdXQ7CisgICAgfQorICBrZXlfcHVibGljID0gZ2NyeV9tYWxsb2MgKHNpemVvZiAoKmtleV9wdWJsaWMpKTsKKyAgaWYgKCEga2V5X3B1YmxpYykKKyAgICB7CisgICAgICBlcnIgPSBnY3J5X2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAvKiBDYWxjdWxhdGUgc2l6ZSBvZiB0aGUgZm9ybWF0IHN0cmluZywgdGhhdCBpcyB1c2VkIGZvciBjcmVhdGluZworICAgICB0aGUgcmVxdWVzdCBTLWV4cHJlc3Npb24uICAqLworICBnZW5rZXlfZm9ybWF0X24gPSAyMjsKKworICAvKiBSZXNwZWN0IGFueSByZWxldmFudCBhbGdvcml0aG0gc3BlY2lmaWMgY29tbWFuZHMuICAqLworICBpZiAoa2V5X3NwZWMpCisgICAgZm9yIChpID0gMDsgaSA8IERJTSAoYWNfa2V5X2dlbmVyYXRlX3NwZWNzKTsgaSsrKQorICAgICAgaWYgKGhhbmRsZS0+YWxnb3JpdGhtID09IGFjX2tleV9nZW5lcmF0ZV9zcGVjc1tpXS5hbGdvcml0aG0pCisJZ2Vua2V5X2Zvcm1hdF9uICs9IDY7CisKKyAgLyogQ3JlYXRlIGZvcm1hdCBzdHJpbmcuICAqLworICBnZW5rZXlfZm9ybWF0ID0gZ2NyeV9tYWxsb2MgKGdlbmtleV9mb3JtYXRfbik7CisgIGlmICghIGdlbmtleV9mb3JtYXQpCisgICAgeworICAgICAgZXJyID0gZ2NyeV9lcnJvcl9mcm9tX2Vycm5vIChlcnJubyk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgLyogRmlsbCBmb3JtYXQgc3RyaW5nLiAgKi8KKyAgKmdlbmtleV9mb3JtYXQgPSAwOworICBzdHJjYXQgKGdlbmtleV9mb3JtYXQsICIoZ2Vua2V5KCVzKG5iaXRzJWQpIik7CisgIGlmIChrZXlfc3BlYykKKyAgICBmb3IgKGkgPSAwOyBpIDwgRElNIChhY19rZXlfZ2VuZXJhdGVfc3BlY3MpOyBpKyspCisgICAgICBpZiAoaGFuZGxlLT5hbGdvcml0aG0gPT0gYWNfa2V5X2dlbmVyYXRlX3NwZWNzW2ldLmFsZ29yaXRobSkKKwlzdHJjYXQgKGdlbmtleV9mb3JtYXQsICIoJXMlbSkiKTsKKyAgc3RyY2F0IChnZW5rZXlfZm9ybWF0LCAiKSkiKTsKKworICAvKiBCdWlsZCBsaXN0IG9mIGFyZ3VtZW50IHBvaW50ZXJzLCB0aGUgYWxnb3JpdGhtIG5hbWUgYW5kIHRoZSBuYml0cworICAgICBhcmUgYWx3YXlzIG5lZWRlZC4gICovCisgIGFyZ19saXN0X24gPSAyOworCisgIC8qIE5vdyB0aGUgYWxnb3JpdGhtIHNwZWNpZmljIGFyZ3VtZW50cy4gICovCisgIGlmIChrZXlfc3BlYykKKyAgICBmb3IgKGkgPSAwOyBpIDwgRElNIChhY19rZXlfZ2VuZXJhdGVfc3BlY3MpOyBpKyspCisgICAgICBpZiAoaGFuZGxlLT5hbGdvcml0aG0gPT0gYWNfa2V5X2dlbmVyYXRlX3NwZWNzW2ldLmFsZ29yaXRobSkKKwlhcmdfbGlzdF9uICs9IDI7CisKKyAgLyogQWxsb2NhdGUgbGlzdC4gICovCisgIGFyZ19saXN0ID0gZ2NyeV9tYWxsb2MgKHNpemVvZiAoKmFyZ19saXN0KSAqIGFyZ19saXN0X24pOworICBpZiAoISBhcmdfbGlzdCkKKyAgICB7CisgICAgICBlcnIgPSBnY3J5X2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBhcmdfbGlzdFswXSA9ICh2b2lkICopICZoYW5kbGUtPmFsZ29yaXRobV9uYW1lOworICBhcmdfbGlzdFsxXSA9ICh2b2lkICopICZuYml0czsKKyAgaWYgKGtleV9zcGVjKQorICAgIGZvciAoaiA9IDIsIGkgPSAwOyBpIDwgRElNIChhY19rZXlfZ2VuZXJhdGVfc3BlY3MpOyBpKyspCisgICAgICBpZiAoaGFuZGxlLT5hbGdvcml0aG0gPT0gYWNfa2V5X2dlbmVyYXRlX3NwZWNzW2ldLmFsZ29yaXRobSkKKwl7CisJICAvKiBBZGQgbmFtZSBvZiB0aGlzIHNwZWNpZmljYXRpb24gZmxhZyBhbmQgdGhlCisJICAgICBhY2NvcmRpbmcgbWVtYmVyIG9mIHRoZSBzcGVjIHN0cnVjdXR1cmUuICAqLworCSAgYXJnX2xpc3RbaisrXSA9ICh2b2lkICopKCZhY19rZXlfZ2VuZXJhdGVfc3BlY3NbaV0ubmFtZSk7CisJICBhcmdfbGlzdFtqKytdID0gKHZvaWQgKikKKwkgICAgKCgoY2hhciAqKSBrZXlfc3BlYykKKwkgICAgICsgYWNfa2V5X2dlbmVyYXRlX3NwZWNzW2ldLm9mZnNldCk7CisJICAvKiBGSVhNRTogYWJvdmUgc2VlbXMgdG8gc3Vjay4gICovCisJfQorCisgIC8qIENvbnN0cnVjdCBmaW5hbCByZXF1ZXN0IFMtZXhwcmVzc2lvbi4gICovCisgIGVyciA9IGdjcnlfc2V4cF9idWlsZF9hcnJheSAoJmdlbmtleV9zZXhwX3JlcXVlc3QsCisJCQkgICAgICAgTlVMTCwgZ2Vua2V5X2Zvcm1hdCwgYXJnX2xpc3QpOworICBpZiAoZXJyKQorICAgIGdvdG8gb3V0OworCisgIC8qIFBlcmZvcm0gZ2Vua2V5IG9wZXJhdGlvbi4gICovCisgIGVyciA9IGdjcnlfcGtfZ2Vua2V5ICgmZ2Vua2V5X3NleHBfcmVwbHksIGdlbmtleV9zZXhwX3JlcXVlc3QpOworICBpZiAoZXJyKQorICAgIGdvdG8gb3V0OworCisgIGtleV9zZXhwID0gZ2NyeV9zZXhwX2ZpbmRfdG9rZW4gKGdlbmtleV9zZXhwX3JlcGx5LCAicHJpdmF0ZS1rZXkiLCAwKTsKKyAgaWYgKCEga2V5X3NleHApCisgICAgeworICAgICAgZXJyID0gZ2NyeV9lcnJvciAoR1BHX0VSUl9JTlRFUk5BTCk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisgIGVyciA9IGFjX2RhdGFfZXh0cmFjdCAoInByaXZhdGUta2V5IiwgaGFuZGxlLT5hbGdvcml0aG1fbmFtZSwKKwkJCSBrZXlfc2V4cCwgJmtleV9kYXRhX3NlY3JldCk7CisgIGlmIChlcnIpCisgICAgZ290byBvdXQ7CisKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKGtleV9zZXhwKTsKKyAga2V5X3NleHAgPSBnY3J5X3NleHBfZmluZF90b2tlbiAoZ2Vua2V5X3NleHBfcmVwbHksICJwdWJsaWMta2V5IiwgMCk7CisgIGlmICghIGtleV9zZXhwKQorICAgIHsKKyAgICAgIGVyciA9IGdjcnlfZXJyb3IgKEdQR19FUlJfSU5URVJOQUwpOworICAgICAgZ290byBvdXQ7CisgICAgfQorICBlcnIgPSBhY19kYXRhX2V4dHJhY3QgKCJwdWJsaWMta2V5IiwgaGFuZGxlLT5hbGdvcml0aG1fbmFtZSwKKwkJCSBrZXlfc2V4cCwgJmtleV9kYXRhX3B1YmxpYyk7CisgIGlmIChlcnIpCisgICAgZ290byBvdXQ7CisKKyAgLyogRG9uZS4gICovCisKKyAga2V5X3NlY3JldC0+dHlwZSA9IEdDUllfQUNfS0VZX1NFQ1JFVDsKKyAga2V5X3NlY3JldC0+ZGF0YSA9IGtleV9kYXRhX3NlY3JldDsKKyAga2V5X3B1YmxpYy0+dHlwZSA9IEdDUllfQUNfS0VZX1BVQkxJQzsKKyAga2V5X3B1YmxpYy0+ZGF0YSA9IGtleV9kYXRhX3B1YmxpYzsKKyAga2V5X3BhaXJfbmV3LT5zZWNyZXQgPSBrZXlfc2VjcmV0OworICBrZXlfcGFpcl9uZXctPnB1YmxpYyA9IGtleV9wdWJsaWM7CisgICprZXlfcGFpciA9IGtleV9wYWlyX25ldzsKKworIG91dDoKKworICAvKiBEZWFsbG9jYXRlIHJlc291cmNlcy4gICovCisgIAorICBnY3J5X2ZyZWUgKGdlbmtleV9mb3JtYXQpOworICBnY3J5X2ZyZWUgKGFyZ19saXN0KTsKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKGdlbmtleV9zZXhwX3JlcXVlc3QpOworICBnY3J5X3NleHBfcmVsZWFzZSAoZ2Vua2V5X3NleHBfcmVwbHkpOworICBnY3J5X3NleHBfcmVsZWFzZSAoa2V5X3NleHApOworICBpZiAoZXJyKQorICAgIHsKKyAgICAgIF9nY3J5X2FjX2RhdGFfZGVzdHJveSAoa2V5X2RhdGFfc2VjcmV0KTsKKyAgICAgIF9nY3J5X2FjX2RhdGFfZGVzdHJveSAoa2V5X2RhdGFfcHVibGljKTsKKyAgICAgIGdjcnlfZnJlZSAoa2V5X3NlY3JldCk7CisgICAgICBnY3J5X2ZyZWUgKGtleV9wdWJsaWMpOworICAgICAgZ2NyeV9mcmVlIChrZXlfcGFpcl9uZXcpOworICAgIH0KKworICByZXR1cm4gZXJyOworfQorCisvKiBSZXR1cm5zIHRoZSBrZXkgb2YgdHlwZSBXSElDSCBvdXQgb2YgdGhlIGtleSBwYWlyIEtFWV9QQUlSLiAgKi8KK2djcnlfYWNfa2V5X3QKK19nY3J5X2FjX2tleV9wYWlyX2V4dHJhY3QgKGdjcnlfYWNfa2V5X3BhaXJfdCBrZXlfcGFpciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X2FjX2tleV90eXBlX3Qgd2hpY2gpCit7CisgIGdjcnlfYWNfa2V5X3Qga2V5OworCisgIGlmIChmaXBzX21vZGUgKCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgc3dpdGNoICh3aGljaCkKKyAgICB7CisgICAgY2FzZSBHQ1JZX0FDX0tFWV9TRUNSRVQ6CisgICAgICBrZXkgPSBrZXlfcGFpci0+c2VjcmV0OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdDUllfQUNfS0VZX1BVQkxJQzoKKyAgICAgIGtleSA9IGtleV9wYWlyLT5wdWJsaWM7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBrZXkgPSBOVUxMOworICAgICAgYnJlYWs7CisgICAgfQorCisgIHJldHVybiBrZXk7Cit9CisKKy8qIERlc3Ryb3lzIHRoZSBrZXkgS0VZLiAgKi8KK3ZvaWQKK19nY3J5X2FjX2tleV9kZXN0cm95IChnY3J5X2FjX2tleV90IGtleSkKK3sKKyAgdW5zaWduZWQgaW50IGk7CisKKyAgaWYgKGtleSkKKyAgICB7CisgICAgICBpZiAoa2V5LT5kYXRhKQorICAgICAgICB7CisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGtleS0+ZGF0YS0+ZGF0YV9uOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChrZXktPmRhdGEtPmRhdGFbaV0ubXBpKQorICAgICAgICAgICAgICAgIGdjcnlfbXBpX3JlbGVhc2UgKGtleS0+ZGF0YS0+ZGF0YVtpXS5tcGkpOworICAgICAgICAgICAgICBpZiAoa2V5LT5kYXRhLT5kYXRhW2ldLm5hbWUpCisgICAgICAgICAgICAgICAgZ2NyeV9mcmVlIChrZXktPmRhdGEtPmRhdGFbaV0ubmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgZ2NyeV9mcmVlIChrZXktPmRhdGEtPmRhdGEpOworICAgICAgICAgIGdjcnlfZnJlZSAoa2V5LT5kYXRhKTsKKyAgICAgICAgfQorICAgICAgZ2NyeV9mcmVlIChrZXkpOworICAgIH0KK30KKworLyogRGVzdHJveXMgdGhlIGtleSBwYWlyIEtFWV9QQUlSLiAgKi8KK3ZvaWQKK19nY3J5X2FjX2tleV9wYWlyX2Rlc3Ryb3kgKGdjcnlfYWNfa2V5X3BhaXJfdCBrZXlfcGFpcikKK3sKKyAgaWYgKGtleV9wYWlyKQorICAgIHsKKyAgICAgIGdjcnlfYWNfa2V5X2Rlc3Ryb3kgKGtleV9wYWlyLT5zZWNyZXQpOworICAgICAgZ2NyeV9hY19rZXlfZGVzdHJveSAoa2V5X3BhaXItPnB1YmxpYyk7CisgICAgICBnY3J5X2ZyZWUgKGtleV9wYWlyKTsKKyAgICB9Cit9CisKKy8qIFJldHVybnMgdGhlIGRhdGEgc2V0IGNvbnRhaW5lZCBpbiB0aGUga2V5IEtFWS4gICovCitnY3J5X2FjX2RhdGFfdAorX2djcnlfYWNfa2V5X2RhdGFfZ2V0IChnY3J5X2FjX2tleV90IGtleSkKK3sKKyAgaWYgKGZpcHNfbW9kZSAoKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIGtleS0+ZGF0YTsKK30KKworLyogVmVyaWZpZXMgdGhhdCB0aGUga2V5IEtFWSBpcyBzYW5lIHZpYSBIQU5ETEUuICAqLworZ2NyeV9lcnJvcl90CitfZ2NyeV9hY19rZXlfdGVzdCAoZ2NyeV9hY19oYW5kbGVfdCBoYW5kbGUsIGdjcnlfYWNfa2V5X3Qga2V5KQoreworICBnY3J5X3NleHBfdCBrZXlfc2V4cDsKKyAgZ2NyeV9lcnJvcl90IGVycjsKKworICBpZiAoZmlwc19tb2RlICgpKQorICAgIHJldHVybiBncGdfZXJyb3IgKEdQR19FUlJfTk9UX1NVUFBPUlRFRCk7CisKKyAga2V5X3NleHAgPSBOVUxMOworICBlcnIgPSBhY19kYXRhX2NvbnN0cnVjdCAoYWNfa2V5X2lkZW50aWZpZXJzW2tleS0+dHlwZV0sIDAsIDAsCisJCQkgICBoYW5kbGUtPmFsZ29yaXRobV9uYW1lLCBrZXktPmRhdGEsICZrZXlfc2V4cCk7CisgIGlmIChlcnIpCisgICAgZ290byBvdXQ7CisKKyAgZXJyID0gZ2NyeV9wa190ZXN0a2V5IChrZXlfc2V4cCk7CisKKyBvdXQ6CisKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKGtleV9zZXhwKTsKKworICByZXR1cm4gZ2NyeV9lcnJvciAoZXJyKTsKK30KKworLyogU3RvcmVzIHRoZSBudW1iZXIgb2YgYml0cyBvZiB0aGUga2V5IEtFWSBpbiBOQklUUyB2aWEgSEFORExFLiAgKi8KK2djcnlfZXJyb3JfdAorX2djcnlfYWNfa2V5X2dldF9uYml0cyAoZ2NyeV9hY19oYW5kbGVfdCBoYW5kbGUsCisJCQlnY3J5X2FjX2tleV90IGtleSwgdW5zaWduZWQgaW50ICpuYml0cykKK3sKKyAgZ2NyeV9zZXhwX3Qga2V5X3NleHA7CisgIGdjcnlfZXJyb3JfdCBlcnI7CisgIHVuc2lnbmVkIGludCBuOworCisgIGlmIChmaXBzX21vZGUgKCkpCisgICAgcmV0dXJuIGdwZ19lcnJvciAoR1BHX0VSUl9OT1RfU1VQUE9SVEVEKTsKKworICBrZXlfc2V4cCA9IE5VTEw7CisKKyAgZXJyID0gYWNfZGF0YV9jb25zdHJ1Y3QgKGFjX2tleV9pZGVudGlmaWVyc1trZXktPnR5cGVdLAorCQkJICAgMCwgMCwgaGFuZGxlLT5hbGdvcml0aG1fbmFtZSwga2V5LT5kYXRhLCAma2V5X3NleHApOworICBpZiAoZXJyKQorICAgIGdvdG8gb3V0OworCisgIG4gPSBnY3J5X3BrX2dldF9uYml0cyAoa2V5X3NleHApOworICBpZiAoISBuKQorICAgIHsKKyAgICAgIGVyciA9IGdjcnlfZXJyb3IgKEdQR19FUlJfUFVCS0VZX0FMR08pOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICpuYml0cyA9IG47CisKKyBvdXQ6CisKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKGtleV9zZXhwKTsKKworICByZXR1cm4gZXJyOworfQorCisvKiBXcml0ZXMgdGhlIDIwIGJ5dGUgbG9uZyBrZXkgZ3JpcCBvZiB0aGUga2V5IEtFWSB0byBLRVlfR1JJUCB2aWEKKyAgIEhBTkRMRS4gICovCitnY3J5X2Vycm9yX3QKK19nY3J5X2FjX2tleV9nZXRfZ3JpcCAoZ2NyeV9hY19oYW5kbGVfdCBoYW5kbGUsCisJCSAgICAgICBnY3J5X2FjX2tleV90IGtleSwgdW5zaWduZWQgY2hhciAqa2V5X2dyaXApCit7CisgIGdjcnlfc2V4cF90IGtleV9zZXhwOworICBnY3J5X2Vycm9yX3QgZXJyOworICB1bnNpZ25lZCBjaGFyICpyZXQ7CisKKyAgaWYgKGZpcHNfbW9kZSAoKSkKKyAgICByZXR1cm4gZ3BnX2Vycm9yIChHUEdfRVJSX05PVF9TVVBQT1JURUQpOworCisgIGtleV9zZXhwID0gTlVMTDsKKyAgZXJyID0gYWNfZGF0YV9jb25zdHJ1Y3QgKGFjX2tleV9pZGVudGlmaWVyc1trZXktPnR5cGVdLCAwLCAwLAorCQkJICAgaGFuZGxlLT5hbGdvcml0aG1fbmFtZSwga2V5LT5kYXRhLCAma2V5X3NleHApOworICBpZiAoZXJyKQorICAgIGdvdG8gb3V0OworCisgIHJldCA9IGdjcnlfcGtfZ2V0X2tleWdyaXAgKGtleV9zZXhwLCBrZXlfZ3JpcCk7CisgIGlmICghIHJldCkKKyAgICB7CisgICAgICBlcnIgPSBnY3J5X2Vycm9yIChHUEdfRVJSX0lOVl9PQkopOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGVyciA9IDA7CisKKyBvdXQ6CisKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKGtleV9zZXhwKTsKKworICByZXR1cm4gZXJyOworfQorCisKKwwKKworLyogCisgKiBGdW5jdGlvbnMgcGVyZm9ybWluZyBjcnlwdG9ncmFwaGljIG9wZXJhdGlvbnMuCisgKi8KKworLyogRW5jcnlwdHMgdGhlIHBsYWluIHRleHQgTVBJIHZhbHVlIERBVEFfUExBSU4gd2l0aCB0aGUga2V5IHB1YmxpYworICAgS0VZIHVuZGVyIHRoZSBjb250cm9sIG9mIHRoZSBmbGFncyBGTEFHUyBhbmQgc3RvcmVzIHRoZSByZXN1bHRpbmcKKyAgIGRhdGEgc2V0IGludG8gREFUQV9FTkNSWVBURUQuICAqLworZ2NyeV9lcnJvcl90CitfZ2NyeV9hY19kYXRhX2VuY3J5cHQgKGdjcnlfYWNfaGFuZGxlX3QgaGFuZGxlLAorCQkgICAgICAgdW5zaWduZWQgaW50IGZsYWdzLAorCQkgICAgICAgZ2NyeV9hY19rZXlfdCBrZXksCisJCSAgICAgICBnY3J5X21waV90IGRhdGFfcGxhaW4sCisJCSAgICAgICBnY3J5X2FjX2RhdGFfdCAqZGF0YV9lbmNyeXB0ZWQpCit7CisgIGdjcnlfYWNfZGF0YV90IGRhdGFfZW5jcnlwdGVkX25ldzsKKyAgZ2NyeV9hY19kYXRhX3QgZGF0YV92YWx1ZTsKKyAgZ2NyeV9zZXhwX3Qgc2V4cF9yZXF1ZXN0OworICBnY3J5X3NleHBfdCBzZXhwX3JlcGx5OworICBnY3J5X3NleHBfdCBzZXhwX2tleTsKKyAgZ2NyeV9lcnJvcl90IGVycjsKKworICBpZiAoZmlwc19tb2RlICgpKQorICAgIHJldHVybiBncGdfZXJyb3IgKEdQR19FUlJfTk9UX1NVUFBPUlRFRCk7CisKKyAgZGF0YV9lbmNyeXB0ZWRfbmV3ID0gTlVMTDsKKyAgc2V4cF9yZXF1ZXN0ID0gTlVMTDsKKyAgc2V4cF9yZXBseSA9IE5VTEw7CisgIGRhdGFfdmFsdWUgPSBOVUxMOworICBzZXhwX2tleSA9IE5VTEw7CisKKyAgaWYgKGtleS0+dHlwZSAhPSBHQ1JZX0FDX0tFWV9QVUJMSUMpCisgICAgeworICAgICAgZXJyID0gZ2NyeV9lcnJvciAoR1BHX0VSUl9XUk9OR19LRVlfVVNBR0UpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGVyciA9IGFjX2RhdGFfY29uc3RydWN0IChhY19rZXlfaWRlbnRpZmllcnNba2V5LT50eXBlXSwgMCwgMCwKKwkJCSAgIGhhbmRsZS0+YWxnb3JpdGhtX25hbWUsIGtleS0+ZGF0YSwgJnNleHBfa2V5KTsKKyAgaWYgKGVycikKKyAgICBnb3RvIG91dDsKKworICBlcnIgPSBfZ2NyeV9hY19kYXRhX25ldyAoJmRhdGFfdmFsdWUpOworICBpZiAoZXJyKQorICAgIGdvdG8gb3V0OworCisgIGVyciA9IF9nY3J5X2FjX2RhdGFfc2V0IChkYXRhX3ZhbHVlLCAwLCAidmFsdWUiLCBkYXRhX3BsYWluKTsKKyAgaWYgKGVycikKKyAgICBnb3RvIG91dDsKKworICBlcnIgPSBhY19kYXRhX2NvbnN0cnVjdCAoImRhdGEiLCAxLCBmbGFncywgaGFuZGxlLT5hbGdvcml0aG1fbmFtZSwKKwkJCSAgIGRhdGFfdmFsdWUsICZzZXhwX3JlcXVlc3QpOworICBpZiAoZXJyKQorICAgIGdvdG8gb3V0OworCisgIC8qIEZJWE1FOiBlcnJvciB2cy4gZXJyY29kZT8gKi8KKworICBlcnIgPSBnY3J5X3BrX2VuY3J5cHQgKCZzZXhwX3JlcGx5LCBzZXhwX3JlcXVlc3QsIHNleHBfa2V5KTsKKyAgaWYgKGVycikKKyAgICBnb3RvIG91dDsKKworICAvKiBFeHRyYWN0IGRhdGEuICAqLworICBlcnIgPSBhY19kYXRhX2V4dHJhY3QgKCJlbmMtdmFsIiwgaGFuZGxlLT5hbGdvcml0aG1fbmFtZSwKKwkJCSBzZXhwX3JlcGx5LCAmZGF0YV9lbmNyeXB0ZWRfbmV3KTsKKyAgaWYgKGVycikKKyAgICBnb3RvIG91dDsKKworICAqZGF0YV9lbmNyeXB0ZWQgPSBkYXRhX2VuY3J5cHRlZF9uZXc7CisKKyBvdXQ6CisKKyAgLyogRGVhbGxvY2F0ZSByZXNvdXJjZXMuICAqLworCisgIGdjcnlfc2V4cF9yZWxlYXNlIChzZXhwX3JlcXVlc3QpOworICBnY3J5X3NleHBfcmVsZWFzZSAoc2V4cF9yZXBseSk7CisgIGdjcnlfc2V4cF9yZWxlYXNlIChzZXhwX2tleSk7CisgIF9nY3J5X2FjX2RhdGFfZGVzdHJveSAoZGF0YV92YWx1ZSk7CisKKyAgcmV0dXJuIGVycjsKK30KKworLyogRGVjcnlwdHMgdGhlIGVuY3J5cHRlZCBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgZGF0YSBzZXQKKyAgIERBVEFfRU5DUllQVEVEIHdpdGggdGhlIHNlY3JldCBrZXkgS0VZIHVuZGVyIHRoZSBjb250cm9sIG9mIHRoZQorICAgZmxhZ3MgRkxBR1MgYW5kIHN0b3JlcyB0aGUgcmVzdWx0aW5nIHBsYWluIHRleHQgTVBJIHZhbHVlIGluCisgICBEQVRBX1BMQUlOLiAgKi8KK2djcnlfZXJyb3JfdAorX2djcnlfYWNfZGF0YV9kZWNyeXB0IChnY3J5X2FjX2hhbmRsZV90IGhhbmRsZSwKKwkJICAgICAgIHVuc2lnbmVkIGludCBmbGFncywKKwkJICAgICAgIGdjcnlfYWNfa2V5X3Qga2V5LAorCQkgICAgICAgZ2NyeV9tcGlfdCAqZGF0YV9wbGFpbiwKKwkJICAgICAgIGdjcnlfYWNfZGF0YV90IGRhdGFfZW5jcnlwdGVkKQoreworICBnY3J5X21waV90IGRhdGFfZGVjcnlwdGVkOworICBnY3J5X3NleHBfdCBzZXhwX3JlcXVlc3Q7CisgIGdjcnlfc2V4cF90IHNleHBfcmVwbHk7CisgIGdjcnlfc2V4cF90IHNleHBfdmFsdWU7CisgIGdjcnlfc2V4cF90IHNleHBfa2V5OworICBnY3J5X2Vycm9yX3QgZXJyOworCisgIGlmIChmaXBzX21vZGUgKCkpCisgICAgcmV0dXJuIGdwZ19lcnJvciAoR1BHX0VSUl9OT1RfU1VQUE9SVEVEKTsKKworICBzZXhwX3JlcXVlc3QgPSBOVUxMOworICBzZXhwX3JlcGx5ID0gTlVMTDsKKyAgc2V4cF92YWx1ZSA9IE5VTEw7CisgIHNleHBfa2V5ID0gTlVMTDsKKworICBpZiAoa2V5LT50eXBlICE9IEdDUllfQUNfS0VZX1NFQ1JFVCkKKyAgICB7CisgICAgICBlcnIgPSBnY3J5X2Vycm9yIChHUEdfRVJSX1dST05HX0tFWV9VU0FHRSk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgZXJyID0gYWNfZGF0YV9jb25zdHJ1Y3QgKGFjX2tleV9pZGVudGlmaWVyc1trZXktPnR5cGVdLCAwLCAwLAorCQkJICAgaGFuZGxlLT5hbGdvcml0aG1fbmFtZSwga2V5LT5kYXRhLCAmc2V4cF9rZXkpOworICBpZiAoZXJyKQorICAgIGdvdG8gb3V0OworCisgIC8qIENyZWF0ZSBTLWV4cHJlc3Npb24gZnJvbSBkYXRhLiAgKi8KKyAgZXJyID0gYWNfZGF0YV9jb25zdHJ1Y3QgKCJlbmMtdmFsIiwgMSwgZmxhZ3MsIGhhbmRsZS0+YWxnb3JpdGhtX25hbWUsCisJCQkgICBkYXRhX2VuY3J5cHRlZCwgJnNleHBfcmVxdWVzdCk7CisgIGlmIChlcnIpCisgICAgZ290byBvdXQ7CisKKyAgLyogRGVjcnlwdC4gICovCisgIGVyciA9IGdjcnlfcGtfZGVjcnlwdCAoJnNleHBfcmVwbHksIHNleHBfcmVxdWVzdCwgc2V4cF9rZXkpOworICBpZiAoZXJyKQorICAgIGdvdG8gb3V0OworCisgIC8qIEV4dHJhY3QgcGxhaW4gdGV4dC4gKi8KKyAgc2V4cF92YWx1ZSA9IGdjcnlfc2V4cF9maW5kX3Rva2VuIChzZXhwX3JlcGx5LCAidmFsdWUiLCAwKTsKKyAgaWYgKCEgc2V4cF92YWx1ZSkKKyAgICB7CisgICAgICAvKiBGSVhNRT8gICovCisgICAgICBlcnIgPSBnY3J5X2Vycm9yIChHUEdfRVJSX0dFTkVSQUwpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGRhdGFfZGVjcnlwdGVkID0gZ2NyeV9zZXhwX250aF9tcGkgKHNleHBfdmFsdWUsIDEsIEdDUllNUElfRk1UX1VTRyk7CisgIGlmICghIGRhdGFfZGVjcnlwdGVkKQorICAgIHsKKyAgICAgIGVyciA9IGdjcnlfZXJyb3IgKEdQR19FUlJfR0VORVJBTCk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgKmRhdGFfcGxhaW4gPSBkYXRhX2RlY3J5cHRlZDsKKworIG91dDoKKworICAvKiBEZWFsbG9jYXRlIHJlc291cmNlcy4gICovCisgIGdjcnlfc2V4cF9yZWxlYXNlIChzZXhwX3JlcXVlc3QpOworICBnY3J5X3NleHBfcmVsZWFzZSAoc2V4cF9yZXBseSk7CisgIGdjcnlfc2V4cF9yZWxlYXNlIChzZXhwX3ZhbHVlKTsKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKHNleHBfa2V5KTsKKworICByZXR1cm4gZ2NyeV9lcnJvciAoZXJyKTsKKworfQorCisvKiBTaWducyB0aGUgZGF0YSBjb250YWluZWQgaW4gREFUQSB3aXRoIHRoZSBzZWNyZXQga2V5IEtFWSBhbmQgc3RvcmVzCisgICB0aGUgcmVzdWx0aW5nIHNpZ25hdHVyZSBkYXRhIHNldCBpbiBEQVRBX1NJR05BVFVSRS4gICovCitnY3J5X2Vycm9yX3QKK19nY3J5X2FjX2RhdGFfc2lnbiAoZ2NyeV9hY19oYW5kbGVfdCBoYW5kbGUsCisJCSAgICBnY3J5X2FjX2tleV90IGtleSwKKwkJICAgIGdjcnlfbXBpX3QgZGF0YSwKKwkJICAgIGdjcnlfYWNfZGF0YV90ICpkYXRhX3NpZ25hdHVyZSkKK3sKKyAgZ2NyeV9hY19kYXRhX3QgZGF0YV9zaWduZWQ7CisgIGdjcnlfYWNfZGF0YV90IGRhdGFfdmFsdWU7CisgIGdjcnlfc2V4cF90IHNleHBfcmVxdWVzdDsKKyAgZ2NyeV9zZXhwX3Qgc2V4cF9yZXBseTsKKyAgZ2NyeV9zZXhwX3Qgc2V4cF9rZXk7CisgIGdjcnlfZXJyb3JfdCBlcnI7CisKKyAgaWYgKGZpcHNfbW9kZSAoKSkKKyAgICByZXR1cm4gZ3BnX2Vycm9yIChHUEdfRVJSX05PVF9TVVBQT1JURUQpOworCisgIGRhdGFfc2lnbmVkID0gTlVMTDsKKyAgZGF0YV92YWx1ZSA9IE5VTEw7CisgIHNleHBfcmVxdWVzdCA9IE5VTEw7CisgIHNleHBfcmVwbHkgPSBOVUxMOworICBzZXhwX2tleSA9IE5VTEw7CisKKyAgaWYgKGtleS0+dHlwZSAhPSBHQ1JZX0FDX0tFWV9TRUNSRVQpCisgICAgeworICAgICAgZXJyID0gZ2NyeV9lcnJvciAoR1BHX0VSUl9XUk9OR19LRVlfVVNBR0UpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGVyciA9IGFjX2RhdGFfY29uc3RydWN0IChhY19rZXlfaWRlbnRpZmllcnNba2V5LT50eXBlXSwgMCwgMCwKKwkJCSAgIGhhbmRsZS0+YWxnb3JpdGhtX25hbWUsIGtleS0+ZGF0YSwgJnNleHBfa2V5KTsKKyAgaWYgKGVycikKKyAgICBnb3RvIG91dDsKKworICBlcnIgPSBfZ2NyeV9hY19kYXRhX25ldyAoJmRhdGFfdmFsdWUpOworICBpZiAoZXJyKQorICAgIGdvdG8gb3V0OworCisgIGVyciA9IF9nY3J5X2FjX2RhdGFfc2V0IChkYXRhX3ZhbHVlLCAwLCAidmFsdWUiLCBkYXRhKTsKKyAgaWYgKGVycikKKyAgICBnb3RvIG91dDsKKworICAvKiBDcmVhdGUgUy1leHByZXNzaW9uIGhvbGRpbmcgdGhlIGRhdGEuICAqLworICBlcnIgPSBhY19kYXRhX2NvbnN0cnVjdCAoImRhdGEiLCAxLCAwLCBOVUxMLCBkYXRhX3ZhbHVlLCAmc2V4cF9yZXF1ZXN0KTsKKyAgaWYgKGVycikKKyAgICBnb3RvIG91dDsKKworICAvKiBTaWduLiAgKi8KKyAgZXJyID0gZ2NyeV9wa19zaWduICgmc2V4cF9yZXBseSwgc2V4cF9yZXF1ZXN0LCBzZXhwX2tleSk7CisgIGlmIChlcnIpCisgICAgZ290byBvdXQ7CisKKyAgLyogRXh0cmFjdCBkYXRhLiAgKi8KKyAgZXJyID0gYWNfZGF0YV9leHRyYWN0ICgic2lnLXZhbCIsIGhhbmRsZS0+YWxnb3JpdGhtX25hbWUsCisJCQkgc2V4cF9yZXBseSwgJmRhdGFfc2lnbmVkKTsKKyAgaWYgKGVycikKKyAgICBnb3RvIG91dDsKKworICAvKiBEb25lLiAgKi8KKyAgKmRhdGFfc2lnbmF0dXJlID0gZGF0YV9zaWduZWQ7CisKKyBvdXQ6CisKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKHNleHBfcmVxdWVzdCk7CisgIGdjcnlfc2V4cF9yZWxlYXNlIChzZXhwX3JlcGx5KTsKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKHNleHBfa2V5KTsKKyAgX2djcnlfYWNfZGF0YV9kZXN0cm95IChkYXRhX3ZhbHVlKTsKKworICByZXR1cm4gZ2NyeV9lcnJvciAoZXJyKTsKK30KKworCisvKiBWZXJpZmllcyB0aGF0IHRoZSBzaWduYXR1cmUgY29udGFpbmVkIGluIHRoZSBkYXRhIHNldAorICAgREFUQV9TSUdOQVRVUkUgaXMgaW5kZWVkIHRoZSByZXN1bHQgb2Ygc2lnbmluZyB0aGUgZGF0YSBjb250YWluZWQKKyAgIGluIERBVEEgd2l0aCB0aGUgc2VjcmV0IGtleSBiZWxvbmdpbmcgdG8gdGhlIHB1YmxpYyBrZXkgS0VZLiAgKi8KK2djcnlfZXJyb3JfdAorX2djcnlfYWNfZGF0YV92ZXJpZnkgKGdjcnlfYWNfaGFuZGxlX3QgaGFuZGxlLAorCQkgICAgICBnY3J5X2FjX2tleV90IGtleSwKKwkJICAgICAgZ2NyeV9tcGlfdCBkYXRhLAorCQkgICAgICBnY3J5X2FjX2RhdGFfdCBkYXRhX3NpZ25hdHVyZSkKK3sKKyAgZ2NyeV9zZXhwX3Qgc2V4cF9zaWduYXR1cmU7CisgIGdjcnlfYWNfZGF0YV90IGRhdGFfdmFsdWU7CisgIGdjcnlfc2V4cF90IHNleHBfZGF0YTsKKyAgZ2NyeV9zZXhwX3Qgc2V4cF9rZXk7CisgIGdjcnlfZXJyb3JfdCBlcnI7CisKKyAgaWYgKGZpcHNfbW9kZSAoKSkKKyAgICByZXR1cm4gZ3BnX2Vycm9yIChHUEdfRVJSX05PVF9TVVBQT1JURUQpOworCisgIHNleHBfc2lnbmF0dXJlID0gTlVMTDsKKyAgZGF0YV92YWx1ZSA9IE5VTEw7CisgIHNleHBfZGF0YSA9IE5VTEw7CisgIHNleHBfa2V5ID0gTlVMTDsKKworICBlcnIgPSBhY19kYXRhX2NvbnN0cnVjdCAoInB1YmxpYy1rZXkiLCAwLCAwLAorCQkJICAgaGFuZGxlLT5hbGdvcml0aG1fbmFtZSwga2V5LT5kYXRhLCAmc2V4cF9rZXkpOworICBpZiAoZXJyKQorICAgIGdvdG8gb3V0OworCisgIGlmIChrZXktPnR5cGUgIT0gR0NSWV9BQ19LRVlfUFVCTElDKQorICAgIHsKKyAgICAgIGVyciA9IGdjcnlfZXJyb3IgKEdQR19FUlJfV1JPTkdfS0VZX1VTQUdFKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAvKiBDb25zdHJ1Y3QgUy1leHByZXNzaW9uIGhvbGRpbmcgdGhlIHNpZ25hdHVyZSBkYXRhLiAgKi8KKyAgZXJyID0gYWNfZGF0YV9jb25zdHJ1Y3QgKCJzaWctdmFsIiwgMSwgMCwgaGFuZGxlLT5hbGdvcml0aG1fbmFtZSwKKwkJCSAgIGRhdGFfc2lnbmF0dXJlLCAmc2V4cF9zaWduYXR1cmUpOworICBpZiAoZXJyKQorICAgIGdvdG8gb3V0OworCisgIGVyciA9IF9nY3J5X2FjX2RhdGFfbmV3ICgmZGF0YV92YWx1ZSk7CisgIGlmIChlcnIpCisgICAgZ290byBvdXQ7CisKKyAgZXJyID0gX2djcnlfYWNfZGF0YV9zZXQgKGRhdGFfdmFsdWUsIDAsICJ2YWx1ZSIsIGRhdGEpOworICBpZiAoZXJyKQorICAgIGdvdG8gb3V0OworCisgIC8qIENvbnN0cnVjdCBTLWV4cHJlc3Npb24gaG9sZGluZyB0aGUgZGF0YS4gICovCisgIGVyciA9IGFjX2RhdGFfY29uc3RydWN0ICgiZGF0YSIsIDEsIDAsIE5VTEwsIGRhdGFfdmFsdWUsICZzZXhwX2RhdGEpOworICBpZiAoZXJyKQorICAgIGdvdG8gb3V0OworCisgIC8qIFZlcmlmeSBzaWduYXR1cmUuICAqLworICBlcnIgPSBnY3J5X3BrX3ZlcmlmeSAoc2V4cF9zaWduYXR1cmUsIHNleHBfZGF0YSwgc2V4cF9rZXkpOworCisgb3V0OgorCisgIGdjcnlfc2V4cF9yZWxlYXNlIChzZXhwX3NpZ25hdHVyZSk7CisgIGdjcnlfc2V4cF9yZWxlYXNlIChzZXhwX2RhdGEpOworICBnY3J5X3NleHBfcmVsZWFzZSAoc2V4cF9rZXkpOworICBfZ2NyeV9hY19kYXRhX2Rlc3Ryb3kgKGRhdGFfdmFsdWUpOworCisgIHJldHVybiBnY3J5X2Vycm9yIChlcnIpOworfQorCisKKworDAorLyoKKyAqIEltcGxlbWVudGF0aW9uIG9mIGVuY29kaW5nIG1ldGhvZHMgKGVtKS4KKyAqLworCisvKiBUeXBlIGZvciBmdW5jdGlvbnMgdGhhdCBlbmNvZGUgb3IgZGVjb2RlIChoZW5jZSB0aGUgbmFtZSkgYQorICAgbWVzc2FnZS4gICovCit0eXBlZGVmIGdjcnlfZXJyb3JfdCAoKmdjcnlfYWNfZW1fZGVuY29kZV90KSAodW5zaWduZWQgaW50IGZsYWdzLAorCQkJCQkJIHZvaWQgKm9wdGlvbnMsCisJCQkJCQkgZ2NyeV9hY19pb190ICphY19pb19yZWFkLAorCQkJCQkJIGdjcnlfYWNfaW9fdCAqYWNfaW9fd3JpdGUpOworCisvKiBGaWxsIHRoZSBidWZmZXIgQlVGRkVSIHdoaWNoIGlzIEJVRkZFUl9OIGJ5dGVzIGxvbmcgd2l0aCBub24temVybworICAgcmFuZG9tIGJ5dGVzIG9mIHJhbmRvbSBsZXZlbCBMRVZFTC4gICovCitzdGF0aWMgdm9pZAorZW1fcmFuZG9taXplX25vbnplcm8gKHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGJ1ZmZlcl9uLAorCQkgICAgICBnY3J5X3JhbmRvbV9sZXZlbF90IGxldmVsKQoreworICB1bnNpZ25lZCBjaGFyICpidWZmZXJfcmFuZDsKKyAgdW5zaWduZWQgaW50IGJ1ZmZlcl9yYW5kX247CisgIHVuc2lnbmVkIGludCB6ZXJvczsKKyAgdW5zaWduZWQgaW50IGk7CisgIHVuc2lnbmVkIGludCBqOworCisgIGZvciAoaSA9IDA7IGkgPCBidWZmZXJfbjsgaSsrKQorICAgIGJ1ZmZlcltpXSA9IDA7CisgIAorICBkbworICAgIHsKKyAgICAgIC8qIENvdW50IHplcm9zLiAgKi8KKyAgICAgIGZvciAoaSA9IHplcm9zID0gMDsgaSA8IGJ1ZmZlcl9uOyBpKyspCisJaWYgKCEgYnVmZmVyW2ldKQorCSAgemVyb3MrKzsKKworICAgICAgaWYgKHplcm9zKQorCXsKKwkgIC8qIEdldCByYW5kb20gYnl0ZXMuICAqLworCSAgYnVmZmVyX3JhbmRfbiA9IHplcm9zICsgKHplcm9zIC8gMTI4KTsKKwkgIGJ1ZmZlcl9yYW5kID0gZ2NyeV9yYW5kb21fYnl0ZXNfc2VjdXJlIChidWZmZXJfcmFuZF9uLCBsZXZlbCk7CisKKwkgIC8qIFN1YnN0aXR1dGUgemVyb3Mgd2l0aCBub24temVybyByYW5kb20gYnl0ZXMuICAqLworCSAgZm9yIChpID0gaiA9IDA7IHplcm9zICYmIChpIDwgYnVmZmVyX24pICYmIChqIDwgYnVmZmVyX3JhbmRfbik7IGkrKykKKwkgICAgaWYgKCEgYnVmZmVyW2ldKQorCSAgICAgIHsKKwkJd2hpbGUgKChqIDwgYnVmZmVyX3JhbmRfbikgJiYgKCEgYnVmZmVyX3JhbmRbal0pKQorCQkgIGorKzsKKwkJaWYgKGogPCBidWZmZXJfcmFuZF9uKQorCQkgIHsKKwkJICAgIGJ1ZmZlcltpXSA9IGJ1ZmZlcl9yYW5kW2orK107CisJCSAgICB6ZXJvcy0tOworCQkgIH0KKwkJZWxzZQorCQkgIGJyZWFrOworCSAgICAgIH0KKwkgIGdjcnlfZnJlZSAoYnVmZmVyX3JhbmQpOworCX0KKyAgICB9CisgIHdoaWxlICh6ZXJvcyk7Cit9CisKKy8qIEVuY29kZSBhIG1lc3NhZ2UgYWNjb3JkaW5nIHRvIHRoZSBFbmNvZGluZyBNZXRob2QgZm9yIEVuY3J5cHRpb24KKyAgIGBQS0NTLVYxXzUnIChFTUUtUEtDUy1WMV81KS4gICovCitzdGF0aWMgZ2NyeV9lcnJvcl90CitlbWVfcGtjc192MV81X2VuY29kZSAodW5zaWduZWQgaW50IGZsYWdzLCB2b2lkICpvcHRzLAorCQkgICAgICBnY3J5X2FjX2lvX3QgKmFjX2lvX3JlYWQsCisJCSAgICAgIGdjcnlfYWNfaW9fdCAqYWNfaW9fd3JpdGUpCit7CisgIGdjcnlfYWNfZW1lX3BrY3NfdjFfNV90ICpvcHRpb25zOworICBnY3J5X2Vycm9yX3QgZXJyOworICB1bnNpZ25lZCBjaGFyICpidWZmZXI7CisgIHVuc2lnbmVkIGNoYXIgKnBzOworICB1bnNpZ25lZCBjaGFyICptOworICBzaXplX3QgbV9uOworICB1bnNpZ25lZCBpbnQgcHNfbjsKKyAgdW5zaWduZWQgaW50IGs7CisKKyAgKHZvaWQpZmxhZ3M7CisKKyAgb3B0aW9ucyA9IG9wdHM7CisgIGJ1ZmZlciA9IE5VTEw7CisgIG0gPSBOVUxMOworCisgIGVyciA9IF9nY3J5X2FjX2lvX3JlYWRfYWxsIChhY19pb19yZWFkLCAmbSwgJm1fbik7CisgIGlmIChlcnIpCisgICAgZ290byBvdXQ7CisKKyAgLyogRmlndXJlIG91dCBrZXkgbGVuZ3RoIGluIGJ5dGVzLiAgKi8KKyAgayA9IG9wdGlvbnMtPmtleV9zaXplIC8gODsKKworICBpZiAobV9uID4gayAtIDExKQorICAgIHsKKyAgICAgIC8qIEtleSBpcyB0b28gc2hvcnQgZm9yIG1lc3NhZ2UuICAqLworICAgICAgZXJyID0gZ2NyeV9lcnJvciAoR1BHX0VSUl9UT09fU0hPUlQpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIC8qIEFjY29yZGluZyB0byB0aGlzIGVuY29kaW5nIG1ldGhvZCwgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGVuY29kZWQKKyAgICAgbWVzc2FnZSBpcyB6ZXJvLiAgVGhpcyBieXRlIHdpbGwgYmUgbG9zdCBhbnl3YXksIHdoZW4gdGhlIGVuY29kZWQKKyAgICAgbWVzc2FnZSBpcyB0byBiZSBjb252ZXJ0ZWQgaW50byBhbiBNUEksIHRoYXQncyB3aHkgd2Ugc2tpcAorICAgICBpdC4gICovCisKKyAgLyogQWxsb2NhdGUgYnVmZmVyLiAgKi8KKyAgYnVmZmVyID0gZ2NyeV9tYWxsb2MgKGsgLSAxKTsKKyAgaWYgKCEgYnVmZmVyKQorICAgIHsKKyAgICAgIGVyciA9IGdjcnlfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIC8qIEdlbmVyYXRlIGFuIG9jdGV0IHN0cmluZyBQUyBvZiBsZW5ndGggayAtIG1MZW4gLSAzIGNvbnNpc3RpbmcKKyAgICAgb2YgcHNldWRvcmFuZG9tbHkgZ2VuZXJhdGVkIG5vbnplcm8gb2N0ZXRzLiAgVGhlIGxlbmd0aCBvZiBQUworICAgICB3aWxsIGJlIGF0IGxlYXN0IGVpZ2h0IG9jdGV0cy4gICovCisgIHBzX24gPSBrIC0gbV9uIC0gMzsKKyAgcHMgPSBidWZmZXIgKyAxOworICBlbV9yYW5kb21pemVfbm9uemVybyAocHMsIHBzX24sIEdDUllfU1RST05HX1JBTkRPTSk7CisKKyAgLyogQ29uY2F0ZW5hdGUgUFMsIHRoZSBtZXNzYWdlIE0sIGFuZCBvdGhlciBwYWRkaW5nIHRvIGZvcm0gYW4KKyAgICAgZW5jb2RlZCBtZXNzYWdlIEVNIG9mIGxlbmd0aCBrIG9jdGV0cyBhczoKKworICAgICBFTSA9IDB4MDAgfHwgMHgwMiB8fCBQUyB8fCAweDAwIHx8IE0uICAqLworCisgIGJ1ZmZlclswXSA9IDB4MDI7CisgIGJ1ZmZlcltwc19uICsgMV0gPSAweDAwOworICBtZW1jcHkgKGJ1ZmZlciArIHBzX24gKyAyLCBtLCBtX24pOworCisgIGVyciA9IF9nY3J5X2FjX2lvX3dyaXRlIChhY19pb193cml0ZSwgYnVmZmVyLCBrIC0gMSk7CisKKyBvdXQ6CisKKyAgZ2NyeV9mcmVlIChidWZmZXIpOworICBnY3J5X2ZyZWUgKG0pOworCisgIHJldHVybiBlcnI7Cit9CisKKy8qIERlY29kZSBhIG1lc3NhZ2UgYWNjb3JkaW5nIHRvIHRoZSBFbmNvZGluZyBNZXRob2QgZm9yIEVuY3J5cHRpb24KKyAgIGBQS0NTLVYxXzUnIChFTUUtUEtDUy1WMV81KS4gICovCitzdGF0aWMgZ2NyeV9lcnJvcl90CitlbWVfcGtjc192MV81X2RlY29kZSAodW5zaWduZWQgaW50IGZsYWdzLCB2b2lkICpvcHRzLAorCQkgICAgICBnY3J5X2FjX2lvX3QgKmFjX2lvX3JlYWQsCisJCSAgICAgIGdjcnlfYWNfaW9fdCAqYWNfaW9fd3JpdGUpCit7CisgIGdjcnlfYWNfZW1lX3BrY3NfdjFfNV90ICpvcHRpb25zOworICB1bnNpZ25lZCBjaGFyICpidWZmZXI7CisgIHVuc2lnbmVkIGNoYXIgKmVtOworICBzaXplX3QgZW1fbjsKKyAgZ2NyeV9lcnJvcl90IGVycjsKKyAgdW5zaWduZWQgaW50IGk7CisgIHVuc2lnbmVkIGludCBrOworCisgICh2b2lkKWZsYWdzOworCisgIG9wdGlvbnMgPSBvcHRzOworICBidWZmZXIgPSBOVUxMOworICBlbSA9IE5VTEw7CisKKyAgZXJyID0gX2djcnlfYWNfaW9fcmVhZF9hbGwgKGFjX2lvX3JlYWQsICZlbSwgJmVtX24pOworICBpZiAoZXJyKQorICAgIGdvdG8gb3V0OworCisgIC8qIEZpZ3VyZSBvdXQga2V5IHNpemUuICAqLworICBrID0gb3B0aW9ucy0+a2V5X3NpemUgLyA4OworCisgIC8qIFNlYXJjaCBmb3IgemVybyBieXRlLiAgKi8KKyAgZm9yIChpID0gMDsgKGkgPCBlbV9uKSAmJiBlbVtpXTsgaSsrKTsKKworICAvKiBBY2NvcmRpbmcgdG8gdGhpcyBlbmNvZGluZyBtZXRob2QsIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBlbmNvZGVkCisgICAgIG1lc3NhZ2Ugc2hvdWxkIGJlIHplcm8uICBUaGlzIGJ5dGUgaXMgbG9zdC4gICovCisKKyAgaWYgKCEgKChlbV9uID49IDEwKQorCSAmJiAoZW1fbiA9PSAoayAtIDEpKQorCSAmJiAoZW1bMF0gPT0gMHgwMikKKwkgJiYgKGkgPCBlbV9uKQorCSAmJiAoKGkgLSAxKSA+PSA4KSkpCisgICAgeworICAgICAgZXJyID0gZ2NyeV9lcnJvciAoR1BHX0VSUl9ERUNSWVBUX0ZBSUxFRCk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaSsrOworICBidWZmZXIgPSBnY3J5X21hbGxvYyAoZW1fbiAtIGkpOworICBpZiAoISBidWZmZXIpCisgICAgeworICAgICAgZXJyID0gZ2NyeV9lcnJvcl9mcm9tX2Vycm5vIChlcnJubyk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgbWVtY3B5IChidWZmZXIsIGVtICsgaSwgZW1fbiAtIGkpOworICBlcnIgPSBfZ2NyeV9hY19pb193cml0ZSAoYWNfaW9fd3JpdGUsIGJ1ZmZlciwgZW1fbiAtIGkpOworCisgb3V0OgorCisgIGdjcnlfZnJlZSAoYnVmZmVyKTsKKyAgZ2NyeV9mcmVlIChlbSk7CisKKyAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGdjcnlfZXJyb3JfdAorZW1zYV9wa2NzX3YxXzVfZW5jb2RlX2RhdGFfY2IgKHZvaWQgKm9wYXF1ZSwKKwkJCSAgICAgICB1bnNpZ25lZCBjaGFyICpidWZmZXIsIHNpemVfdCBidWZmZXJfbikKK3sKKyAgZ2NyeV9tZF9oZF90IG1kX2hhbmRsZTsKKworICBtZF9oYW5kbGUgPSBvcGFxdWU7CisgIGdjcnlfbWRfd3JpdGUgKG1kX2hhbmRsZSwgYnVmZmVyLCBidWZmZXJfbik7CisKKyAgcmV0dXJuIDA7Cit9CisKKworLyogRW5jb2RlIGEgbWVzc2FnZSBhY2NvcmRpbmcgdG8gdGhlIEVuY29kaW5nIE1ldGhvZCBmb3IgU2lnbmF0dXJlcworICAgd2l0aCBBcHBlbmRpeCBgUEtDUy1WMV81JyAoRU1TQS1QS0NTLVYxXzUpLiAgKi8KK3N0YXRpYyBnY3J5X2Vycm9yX3QKK2Vtc2FfcGtjc192MV81X2VuY29kZSAodW5zaWduZWQgaW50IGZsYWdzLCB2b2lkICpvcHRzLAorCQkgICAgICAgZ2NyeV9hY19pb190ICphY19pb19yZWFkLAorCQkgICAgICAgZ2NyeV9hY19pb190ICphY19pb193cml0ZSkKK3sKKyAgZ2NyeV9hY19lbXNhX3BrY3NfdjFfNV90ICpvcHRpb25zOworICBnY3J5X2Vycm9yX3QgZXJyOworICBnY3J5X21kX2hkX3QgbWQ7CisgIHVuc2lnbmVkIGNoYXIgKnQ7CisgIHNpemVfdCB0X247CisgIHVuc2lnbmVkIGNoYXIgKmg7CisgIHNpemVfdCBoX247CisgIHVuc2lnbmVkIGNoYXIgKnBzOworICBzaXplX3QgcHNfbjsKKyAgdW5zaWduZWQgY2hhciAqYnVmZmVyOworICBzaXplX3QgYnVmZmVyX247CisgIHVuc2lnbmVkIGNoYXIgYXNuWzEwMF07CS8qIEZJWE1FLCBhbHdheXMgZW5vdWdoPyAgKi8KKyAgc2l6ZV90IGFzbl9uOworICB1bnNpZ25lZCBpbnQgaTsKKworICAodm9pZClmbGFnczsKKyAgCisgIG9wdGlvbnMgPSBvcHRzOworICBidWZmZXIgPSBOVUxMOworICBtZCA9IE5VTEw7CisgIHBzID0gTlVMTDsKKyAgdCA9IE5VTEw7CisKKyAgLyogQ3JlYXRlIGhhc2hpbmcgaGFuZGxlIGFuZCBnZXQgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbi4gICovCisgIGVyciA9IGdjcnlfbWRfb3BlbiAoJm1kLCBvcHRpb25zLT5tZCwgMCk7CisgIGlmIChlcnIpCisgICAgZ290byBvdXQ7CisKKyAgYXNuX24gPSBESU0gKGFzbik7CisgIGVyciA9IGdjcnlfbWRfYWxnb19pbmZvIChvcHRpb25zLT5tZCwgR0NSWUNUTF9HRVRfQVNOT0lELCBhc24sICZhc25fbik7CisgIGlmIChlcnIpCisgICAgZ290byBvdXQ7CisKKyAgaF9uID0gZ2NyeV9tZF9nZXRfYWxnb19kbGVuIChvcHRpb25zLT5tZCk7CisKKyAgZXJyID0gX2djcnlfYWNfaW9fcHJvY2VzcyAoYWNfaW9fcmVhZCwgZW1zYV9wa2NzX3YxXzVfZW5jb2RlX2RhdGFfY2IsIG1kKTsKKyAgaWYgKGVycikKKyAgICBnb3RvIG91dDsKKworICBoID0gZ2NyeV9tZF9yZWFkIChtZCwgMCk7CisKKyAgLyogRW5jb2RlIHRoZSBhbGdvcml0aG0gSUQgZm9yIHRoZSBoYXNoIGZ1bmN0aW9uIGFuZCB0aGUgaGFzaCB2YWx1ZQorICAgICBpbnRvIGFuIEFTTi4xIHZhbHVlIG9mIHR5cGUgRGlnZXN0SW5mbyB3aXRoIHRoZSBEaXN0aW5ndWlzaGVkCisgICAgIEVuY29kaW5nIFJ1bGVzIChERVIpLCB3aGVyZSB0aGUgdHlwZSBEaWdlc3RJbmZvIGhhcyB0aGUgc3ludGF4OgorCisgICAgIERpZ2VzdEluZm8gOjo9PSBTRVFVRU5DRSB7CisgICAgIGRpZ2VzdEFsZ29yaXRobSBBbGdvcml0aG1JZGVudGlmaWVyLAorICAgICBkaWdlc3QgT0NURVQgU1RSSU5HCisgICAgIH0KKworICAgICBUaGUgZmlyc3QgZmllbGQgaWRlbnRpZmllcyB0aGUgaGFzaCBmdW5jdGlvbiBhbmQgdGhlIHNlY29uZAorICAgICBjb250YWlucyB0aGUgaGFzaCB2YWx1ZS4gIExldCBUIGJlIHRoZSBERVIgZW5jb2Rpbmcgb2YgdGhlCisgICAgIERpZ2VzdEluZm8gdmFsdWUgYW5kIGxldCB0TGVuIGJlIHRoZSBsZW5ndGggaW4gb2N0ZXRzIG9mIFQuICAqLworCisgIHRfbiA9IGFzbl9uICsgaF9uOworICB0ID0gZ2NyeV9tYWxsb2MgKHRfbik7CisgIGlmICghIHQpCisgICAgeworICAgICAgZXJyID0gZ2NyeV9lcnJvcl9mcm9tX2Vycm5vIChlcnJubyk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgZm9yIChpID0gMDsgaSA8IGFzbl9uOyBpKyspCisgICAgdFtpXSA9IGFzbltpXTsKKyAgZm9yIChpID0gMDsgaSA8IGhfbjsgaSsrKQorICAgIHRbYXNuX24gKyBpXSA9IGhbaV07CisKKyAgLyogSWYgZW1MZW4gPCB0TGVuICsgMTEsIG91dHB1dCAiaW50ZW5kZWQgZW5jb2RlZCBtZXNzYWdlIGxlbmd0aAorICAgICB0b28gc2hvcnQiIGFuZCBzdG9wLiAgKi8KKyAgaWYgKG9wdGlvbnMtPmVtX24gPCB0X24gKyAxMSkKKyAgICB7CisgICAgICBlcnIgPSBnY3J5X2Vycm9yIChHUEdfRVJSX1RPT19TSE9SVCk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgLyogR2VuZXJhdGUgYW4gb2N0ZXQgc3RyaW5nIFBTIGNvbnNpc3Rpbmcgb2YgZW1MZW4gLSB0TGVuIC0gMyBvY3RldHMKKyAgICAgd2l0aCBoZXhhZGVjaW1hbCB2YWx1ZSAweEZGLiAgVGhlIGxlbmd0aCBvZiBQUyB3aWxsIGJlIGF0IGxlYXN0IDgKKyAgICAgb2N0ZXRzLiAgKi8KKyAgcHNfbiA9IG9wdGlvbnMtPmVtX24gLSB0X24gLSAzOworICBwcyA9IGdjcnlfbWFsbG9jIChwc19uKTsKKyAgaWYgKCEgcHMpCisgICAgeworICAgICAgZXJyID0gZ2NyeV9lcnJvcl9mcm9tX2Vycm5vIChlcnJubyk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisgIGZvciAoaSA9IDA7IGkgPCBwc19uOyBpKyspCisgICAgcHNbaV0gPSAweEZGOworCisgIC8qIENvbmNhdGVuYXRlIFBTLCB0aGUgREVSIGVuY29kaW5nIFQsIGFuZCBvdGhlciBwYWRkaW5nIHRvIGZvcm0gdGhlCisgICAgIGVuY29kZWQgbWVzc2FnZSBFTSBhczoKKworICAgICBFTSA9IDB4MDAgfHwgMHgwMSB8fCBQUyB8fCAweDAwIHx8IFQuICAqLworCisgIGJ1ZmZlcl9uID0gcHNfbiArIHRfbiArIDM7CisgIGJ1ZmZlciA9IGdjcnlfbWFsbG9jIChidWZmZXJfbik7CisgIGlmICghIGJ1ZmZlcikKKyAgICB7CisgICAgICBlcnIgPSBnY3J5X2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBidWZmZXJbMF0gPSAweDAwOworICBidWZmZXJbMV0gPSAweDAxOworICBmb3IgKGkgPSAwOyBpIDwgcHNfbjsgaSsrKQorICAgIGJ1ZmZlclsyICsgaV0gPSBwc1tpXTsKKyAgYnVmZmVyWzIgKyBwc19uXSA9IDB4MDA7CisgIGZvciAoaSA9IDA7IGkgPCB0X247IGkrKykKKyAgICBidWZmZXJbMyArIHBzX24gKyBpXSA9IHRbaV07CisKKyAgZXJyID0gX2djcnlfYWNfaW9fd3JpdGUgKGFjX2lvX3dyaXRlLCBidWZmZXIsIGJ1ZmZlcl9uKTsKKworIG91dDoKKworICBnY3J5X21kX2Nsb3NlIChtZCk7CisKKyAgZ2NyeV9mcmVlIChidWZmZXIpOworICBnY3J5X2ZyZWUgKHBzKTsKKyAgZ2NyeV9mcmVlICh0KTsKKworICByZXR1cm4gZXJyOworfQorCisvKiBgQWN0aW9ucycgZm9yIGRhdGFfZGVuY29kZSgpLiAgKi8KK3R5cGVkZWYgZW51bSBkZW5jb2RlX2FjdGlvbgorICB7CisgICAgREFUQV9FTkNPREUsCisgICAgREFUQV9ERUNPREUsCisgIH0KK2RlbmNvZGVfYWN0aW9uX3Q7CisKKy8qIEVuY29kZSBvciBkZWNvZGUgYSBtZXNzYWdlIGFjY29yZGluZyB0byB0aGUgdGhlIGVuY29kaW5nIG1ldGhvZAorICAgTUVUSE9EOyBBQ1RJT04gc3BlY2lmaWVzIHdldGhlciB0aGUgbWVzc2FnZSB0aGF0IGlzIGNvbnRhaW5lZCBpbgorICAgQlVGRkVSX0lOIGFuZCBvZiBsZW5ndGggQlVGRkVSX0lOX04gc2hvdWxkIGJlIGVuY29kZWQgb3IgZGVjb2RlZC4KKyAgIFRoZSByZXN1bHRpbmcgbWVzc2FnZSB3aWxsIGJlIHN0b3JlZCBpbiBhIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIgaW4KKyAgIEJVRkZFUl9PVVQgYW5kIEJVRkZFUl9PVVRfTi4gICovCitzdGF0aWMgZ2NyeV9lcnJvcl90CithY19kYXRhX2RlbmNvZGUgKGdjcnlfYWNfZW1fdCBtZXRob2QsIGRlbmNvZGVfYWN0aW9uX3QgYWN0aW9uLAorCQkgdW5zaWduZWQgaW50IGZsYWdzLCB2b2lkICpvcHRpb25zLAorCQkgZ2NyeV9hY19pb190ICphY19pb19yZWFkLAorCQkgZ2NyeV9hY19pb190ICphY19pb193cml0ZSkKK3sKKyAgc3RydWN0CisgIHsKKyAgICBnY3J5X2FjX2VtX3QgbWV0aG9kOworICAgIGdjcnlfYWNfZW1fZGVuY29kZV90IGVuY29kZTsKKyAgICBnY3J5X2FjX2VtX2RlbmNvZGVfdCBkZWNvZGU7CisgIH0gbWV0aG9kc1tdID0KKyAgICB7CisgICAgICB7IEdDUllfQUNfRU1FX1BLQ1NfVjFfNSwKKwllbWVfcGtjc192MV81X2VuY29kZSwgZW1lX3BrY3NfdjFfNV9kZWNvZGUgfSwKKyAgICAgIHsgR0NSWV9BQ19FTVNBX1BLQ1NfVjFfNSwKKwllbXNhX3BrY3NfdjFfNV9lbmNvZGUsIE5VTEwgfSwKKyAgICB9OworICBzaXplX3QgbWV0aG9kc19uOworICBnY3J5X2Vycm9yX3QgZXJyOworICB1bnNpZ25lZCBpbnQgaTsKKworICBtZXRob2RzX24gPSBzaXplb2YgKG1ldGhvZHMpIC8gc2l6ZW9mICgqbWV0aG9kcyk7CisKKyAgZm9yIChpID0gMDsgaSA8IG1ldGhvZHNfbjsgaSsrKQorICAgIGlmIChtZXRob2RzW2ldLm1ldGhvZCA9PSBtZXRob2QpCisgICAgICBicmVhazsKKyAgaWYgKGkgPT0gbWV0aG9kc19uKQorICAgIHsKKyAgICAgIGVyciA9IGdjcnlfZXJyb3IgKEdQR19FUlJfTk9UX0ZPVU5EKTsJLyogRklYTUU/ICovCisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgZXJyID0gMDsKKyAgc3dpdGNoIChhY3Rpb24pCisgICAgeworICAgIGNhc2UgREFUQV9FTkNPREU6CisgICAgICBpZiAobWV0aG9kc1tpXS5lbmNvZGUpCisJLyogRklYTUU/ICovCisJZXJyID0gKCptZXRob2RzW2ldLmVuY29kZSkgKGZsYWdzLCBvcHRpb25zLCBhY19pb19yZWFkLCBhY19pb193cml0ZSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgREFUQV9ERUNPREU6CisgICAgICBpZiAobWV0aG9kc1tpXS5kZWNvZGUpCisJLyogRklYTUU/ICovCisJZXJyID0gKCptZXRob2RzW2ldLmRlY29kZSkgKGZsYWdzLCBvcHRpb25zLCBhY19pb19yZWFkLCBhY19pb193cml0ZSk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBlcnIgPSBnY3J5X2Vycm9yIChHUEdfRVJSX0lOVl9BUkcpOworICAgICAgYnJlYWs7CisgICAgfQorCisgb3V0OgorCisgIHJldHVybiBlcnI7Cit9CisKKy8qIEVuY29kZSBhIG1lc3NhZ2UgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGluZyBtZXRob2QgTUVUSE9ELiAgT1BUSU9OUworICAgbXVzdCBiZSBhIHBvaW50ZXIgdG8gYSBtZXRob2Qtc3BlY2lmaWMgc3RydWN0dXJlCisgICAoZ2NyeV9hY19lbSpfdCkuICAqLworZ2NyeV9lcnJvcl90CitfZ2NyeV9hY19kYXRhX2VuY29kZSAoZ2NyeV9hY19lbV90IG1ldGhvZCwKKwkJICAgICAgdW5zaWduZWQgaW50IGZsYWdzLCB2b2lkICpvcHRpb25zLAorCQkgICAgICBnY3J5X2FjX2lvX3QgKmFjX2lvX3JlYWQsCisJCSAgICAgIGdjcnlfYWNfaW9fdCAqYWNfaW9fd3JpdGUpCit7CisgIGlmIChmaXBzX21vZGUgKCkpCisgICAgcmV0dXJuIGdwZ19lcnJvciAoR1BHX0VSUl9OT1RfU1VQUE9SVEVEKTsKKworICByZXR1cm4gYWNfZGF0YV9kZW5jb2RlIChtZXRob2QsIERBVEFfRU5DT0RFLCBmbGFncywgb3B0aW9ucywKKwkJCSAgYWNfaW9fcmVhZCwgYWNfaW9fd3JpdGUpOworfQorCisvKiBEZW5jb2RlIGEgbWVzc2FnZSBhY2NvcmRpbmcgdG8gdGhlIGVuY29kaW5nIG1ldGhvZCBNRVRIT0QuICBPUFRJT05TCisgICBtdXN0IGJlIGEgcG9pbnRlciB0byBhIG1ldGhvZC1zcGVjaWZpYyBzdHJ1Y3R1cmUKKyAgIChnY3J5X2FjX2VtKl90KS4gICovCitnY3J5X2Vycm9yX3QKK19nY3J5X2FjX2RhdGFfZGVjb2RlIChnY3J5X2FjX2VtX3QgbWV0aG9kLAorCQkgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsIHZvaWQgKm9wdGlvbnMsCisJCSAgICAgIGdjcnlfYWNfaW9fdCAqYWNfaW9fcmVhZCwKKwkJICAgICAgZ2NyeV9hY19pb190ICphY19pb193cml0ZSkKK3sKKyAgaWYgKGZpcHNfbW9kZSAoKSkKKyAgICByZXR1cm4gZ3BnX2Vycm9yIChHUEdfRVJSX05PVF9TVVBQT1JURUQpOworCisgIHJldHVybiBhY19kYXRhX2RlbmNvZGUgKG1ldGhvZCwgREFUQV9ERUNPREUsIGZsYWdzLCBvcHRpb25zLAorCQkJICBhY19pb19yZWFkLCBhY19pb193cml0ZSk7Cit9CisKKy8qIENvbnZlcnQgYW4gTVBJIGludG8gYW4gb2N0ZXQgc3RyaW5nLiAgKi8KK3ZvaWQKK19nY3J5X2FjX21waV90b19vcyAoZ2NyeV9tcGlfdCBtcGksIHVuc2lnbmVkIGNoYXIgKm9zLCBzaXplX3Qgb3NfbikKK3sKKyAgdW5zaWduZWQgbG9uZyBkaWdpdDsKKyAgZ2NyeV9tcGlfdCBiYXNlOworICB1bnNpZ25lZCBpbnQgaTsKKyAgdW5zaWduZWQgaW50IG47CisgIGdjcnlfbXBpX3QgbTsKKyAgZ2NyeV9tcGlfdCBkOworCisgIGlmIChmaXBzX21vZGUgKCkpCisgICAgcmV0dXJuOworCisgIGJhc2UgPSBnY3J5X21waV9uZXcgKDApOworICBnY3J5X21waV9zZXRfdWkgKGJhc2UsIDI1Nik7CisKKyAgbiA9IDA7CisgIG0gPSBnY3J5X21waV9jb3B5IChtcGkpOworICB3aGlsZSAoZ2NyeV9tcGlfY21wX3VpIChtLCAwKSkKKyAgICB7CisgICAgICBuKys7CisgICAgICBnY3J5X21waV9kaXYgKG0sIE5VTEwsIG0sIGJhc2UsIDApOworICAgIH0KKworICBnY3J5X21waV9zZXQgKG0sIG1waSk7CisgIGQgPSBnY3J5X21waV9uZXcgKDApOworICBmb3IgKGkgPSAwOyAoaSA8IG4pICYmIChpIDwgb3Nfbik7IGkrKykKKyAgICB7CisgICAgICBnY3J5X21waV9tb2QgKGQsIG0sIGJhc2UpOworICAgICAgX2djcnlfbXBpX2dldF91aSAoZCwgJmRpZ2l0KTsKKyAgICAgIGdjcnlfbXBpX2RpdiAobSwgTlVMTCwgbSwgYmFzZSwgMCk7CisgICAgICBvc1tvc19uIC0gaSAtIDFdID0gKGRpZ2l0ICYgMHhGRik7CisgICAgfQorCisgIGZvciAoOyBpIDwgb3NfbjsgaSsrKQorICAgIG9zW29zX24gLSBpIC0gMV0gPSAwOworCisgIGdjcnlfbXBpX3JlbGVhc2UgKGJhc2UpOworICBnY3J5X21waV9yZWxlYXNlIChkKTsKKyAgZ2NyeV9tcGlfcmVsZWFzZSAobSk7Cit9CisKKy8qIENvbnZlcnQgYW4gTVBJIGludG8gYW4gbmV3bHkgYWxsb2NhdGVkIG9jdGV0IHN0cmluZy4gICovCitnY3J5X2Vycm9yX3QKK19nY3J5X2FjX21waV90b19vc19hbGxvYyAoZ2NyeV9tcGlfdCBtcGksIHVuc2lnbmVkIGNoYXIgKipvcywgc2l6ZV90ICpvc19uKQoreworICB1bnNpZ25lZCBjaGFyICpidWZmZXI7CisgIHNpemVfdCBidWZmZXJfbjsKKyAgZ2NyeV9lcnJvcl90IGVycjsKKyAgdW5zaWduZWQgaW50IG5iaXRzOworCisgIGlmIChmaXBzX21vZGUgKCkpCisgICAgcmV0dXJuIGdwZ19lcnJvciAoR1BHX0VSUl9OT1RfU1VQUE9SVEVEKTsKKworICBuYml0cyA9IGdjcnlfbXBpX2dldF9uYml0cyAobXBpKTsKKyAgYnVmZmVyX24gPSAobmJpdHMgKyA3KSAvIDg7CisgIGJ1ZmZlciA9IGdjcnlfbWFsbG9jIChidWZmZXJfbik7CisgIGlmICghIGJ1ZmZlcikKKyAgICB7CisgICAgICBlcnIgPSBnY3J5X2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICAgIAorICBfZ2NyeV9hY19tcGlfdG9fb3MgKG1waSwgYnVmZmVyLCBidWZmZXJfbik7CisgICpvcyA9IGJ1ZmZlcjsKKyAgKm9zX24gPSBidWZmZXJfbjsKKyAgZXJyID0gMDsKKworIG91dDoKKworICByZXR1cm4gZXJyOworfQorCisKKy8qIENvbnZlcnQgYW4gb2N0ZXQgc3RyaW5nIGludG8gYW4gTVBJLiAgKi8KK3ZvaWQKK19nY3J5X2FjX29zX3RvX21waSAoZ2NyeV9tcGlfdCBtcGksIHVuc2lnbmVkIGNoYXIgKm9zLCBzaXplX3Qgb3NfbikKK3sKKyAgdW5zaWduZWQgaW50IGk7CisgIGdjcnlfbXBpX3QgeGk7CisgIGdjcnlfbXBpX3QgeDsKKyAgZ2NyeV9tcGlfdCBhOworICAKKyAgaWYgKGZpcHNfbW9kZSAoKSkKKyAgICByZXR1cm47CisKKyAgYSA9IGdjcnlfbXBpX25ldyAoMCk7CisgIGdjcnlfbXBpX3NldF91aSAoYSwgMSk7CisgIHggPSBnY3J5X21waV9uZXcgKDApOworICBnY3J5X21waV9zZXRfdWkgKHgsIDApOworICB4aSA9IGdjcnlfbXBpX25ldyAoMCk7CisKKyAgZm9yIChpID0gMDsgaSA8IG9zX247IGkrKykKKyAgICB7CisgICAgICBnY3J5X21waV9tdWxfdWkgKHhpLCBhLCBvc1tvc19uIC0gaSAtIDFdKTsKKyAgICAgIGdjcnlfbXBpX2FkZCAoeCwgeCwgeGkpOworICAgICAgZ2NyeV9tcGlfbXVsX3VpIChhLCBhLCAyNTYpOworICAgIH0KKyAgICAgIAorICBnY3J5X21waV9yZWxlYXNlICh4aSk7CisgIGdjcnlfbXBpX3JlbGVhc2UgKGEpOworCisgIGdjcnlfbXBpX3NldCAobXBpLCB4KTsKKyAgZ2NyeV9tcGlfcmVsZWFzZSAoeCk7CQkvKiBGSVhNRTogY29ycmVjdD8gKi8KK30KKworCisMCisvKiAKKyAqIEltcGxlbWVudGF0aW9uIG9mIEVuY3J5cHRpb24gU2NoZW1lcyAoRVMpIGFuZCBTaWduYXR1cmUgU2NoZW1lcworICogd2l0aCBBcHBlbmRpeCAoU1NBKS4KKyAqLworCisvKiBTY2hlbWVzIGNvbnNpc3Qgb2YgdHdvIHRoaW5nczogZW5jb2RpbmcgbWV0aG9kcyBhbmQgY3J5cHRvZ3JhcGhpYworICAgcHJpbWl0aXZlcy4KKworICAgU2luY2UgZW5jb2RpbmcgbWV0aG9kcyBhcmUgYWNjZXNzaWJsZSB0aHJvdWdoIGEgY29tbW9uIEFQSSB3aXRoCisgICBtZXRob2Qtc3BlY2lmaWMgb3B0aW9ucyBwYXNzZWQgYXMgYW4gYW5vbnltb3VzIHN0cnVjdCwgc2NoZW1lcyBoYXZlCisgICB0byBwcm92aWRlIGZ1bmN0aW9ucyB0aGF0IGNvbnN0cnVjdCB0aGlzIG1ldGhvZC1zcGVjaWZpYyBzdHJ1Y3R1cmU7CisgICB0aGlzIGlzIHdoYXQgdGhlIGZ1bmN0aW9ucyBvZiB0eXBlIGBnY3J5X2FjX2RlbmNvZGVfcHJlcGFyZV90JyBhcmUKKyAgIHRoZXJlIGZvci4gICovCisKK3R5cGVkZWYgZ2NyeV9lcnJvcl90ICgqZ2NyeV9hY19kZW5jb2RlX3ByZXBhcmVfdCkgKGdjcnlfYWNfaGFuZGxlX3QgaGFuZGxlLAorCQkJCQkJICAgZ2NyeV9hY19rZXlfdCBrZXksCisJCQkJCQkgICB2b2lkICpvcHRzLAorCQkJCQkJICAgdm9pZCAqb3B0c19lbSk7CisKKy8qIFRoZSBgZGVuY29kZV9wcmVwYXJlJyBmdW5jdGlvbiBmb3IgRVMtUEtDUy1WMV81LiAgKi8KK3N0YXRpYyBnY3J5X2Vycm9yX3QKK2FjX2VzX2RlbmNvZGVfcHJlcGFyZV9wa2NzX3YxXzUgKGdjcnlfYWNfaGFuZGxlX3QgaGFuZGxlLCBnY3J5X2FjX2tleV90IGtleSwKKwkJCQkgdm9pZCAqb3B0cywgdm9pZCAqb3B0c19lbSkKK3sKKyAgZ2NyeV9hY19lbWVfcGtjc192MV81X3QgKm9wdGlvbnNfZW07CisgIHVuc2lnbmVkIGludCBuYml0czsKKyAgZ2NyeV9lcnJvcl90IGVycjsKKworICAodm9pZClvcHRzOworCisgIGVyciA9IF9nY3J5X2FjX2tleV9nZXRfbmJpdHMgKGhhbmRsZSwga2V5LCAmbmJpdHMpOworICBpZiAoZXJyKQorICAgIGdvdG8gb3V0OworCisgIG9wdGlvbnNfZW0gPSBvcHRzX2VtOworICBvcHRpb25zX2VtLT5rZXlfc2l6ZSA9IG5iaXRzOworCisgb3V0OgorCisgIHJldHVybiBlcnI7Cit9CisKKy8qIFRoZSBgZGVuY29kZV9wcmVwYXJlJyBmdW5jdGlvbiBmb3IgU1NBLVBLQ1MtVjFfNS4gICovCitzdGF0aWMgZ2NyeV9lcnJvcl90CithY19zc2FfZGVuY29kZV9wcmVwYXJlX3BrY3NfdjFfNSAoZ2NyeV9hY19oYW5kbGVfdCBoYW5kbGUsIGdjcnlfYWNfa2V5X3Qga2V5LAorCQkJCSAgdm9pZCAqb3B0cywgdm9pZCAqb3B0c19lbSkKK3sKKyAgZ2NyeV9hY19lbXNhX3BrY3NfdjFfNV90ICpvcHRpb25zX2VtOworICBnY3J5X2FjX3NzYV9wa2NzX3YxXzVfdCAqb3B0aW9uczsKKyAgZ2NyeV9lcnJvcl90IGVycjsKKyAgdW5zaWduZWQgaW50IGs7CisKKyAgb3B0aW9uc19lbSA9IG9wdHNfZW07CisgIG9wdGlvbnMgPSBvcHRzOworCisgIGVyciA9IF9nY3J5X2FjX2tleV9nZXRfbmJpdHMgKGhhbmRsZSwga2V5LCAmayk7CisgIGlmIChlcnIpCisgICAgZ290byBvdXQ7CisKKyAgayA9IChrICsgNykgLyA4OworICBvcHRpb25zX2VtLT5tZCA9IG9wdGlvbnMtPm1kOworICBvcHRpb25zX2VtLT5lbV9uID0gazsKKworIG91dDoKKworICByZXR1cm4gZXJyOworfQorCisvKiBUeXBlIGhvbGRpbmcgdGhlIGluZm9ybWF0aW9uIGFib3V0IGVhY2ggc3VwcG9ydGVkCisgICBFbmNyeXB0aW9uL1NpZ25hdHVyZSBTY2hlbWUuICAqLwordHlwZWRlZiBzdHJ1Y3QgYWNfc2NoZW1lCit7CisgIGdjcnlfYWNfc2NoZW1lX3Qgc2NoZW1lOworICBnY3J5X2FjX2VtX3Qgc2NoZW1lX2VuY29kaW5nOworICBnY3J5X2FjX2RlbmNvZGVfcHJlcGFyZV90IGRlbmNvZGVfcHJlcGFyZTsKKyAgc2l6ZV90IG9wdGlvbnNfZW1fbjsKK30gYWNfc2NoZW1lX3Q7CisKKy8qIExpc3Qgb2Ygc3VwcG9ydGVkIFNjaGVtZXMuICAqLworc3RhdGljIGFjX3NjaGVtZV90IGFjX3NjaGVtZXNbXSA9CisgIHsKKyAgICB7IEdDUllfQUNfRVNfUEtDU19WMV81LCBHQ1JZX0FDX0VNRV9QS0NTX1YxXzUsCisgICAgICBhY19lc19kZW5jb2RlX3ByZXBhcmVfcGtjc192MV81LAorICAgICAgc2l6ZW9mIChnY3J5X2FjX2VtZV9wa2NzX3YxXzVfdCkgfSwKKyAgICB7IEdDUllfQUNfU1NBX1BLQ1NfVjFfNSwgR0NSWV9BQ19FTVNBX1BLQ1NfVjFfNSwKKyAgICAgIGFjX3NzYV9kZW5jb2RlX3ByZXBhcmVfcGtjc192MV81LAorICAgICAgc2l6ZW9mIChnY3J5X2FjX2Vtc2FfcGtjc192MV81X3QpIH0KKyAgfTsKKworLyogTG9va3VwIGEgc2NoZW1lIGJ5IGl0J3MgSUQuICAqLworc3RhdGljIGFjX3NjaGVtZV90ICoKK2FjX3NjaGVtZV9nZXQgKGdjcnlfYWNfc2NoZW1lX3Qgc2NoZW1lKQoreworICBhY19zY2hlbWVfdCAqYWNfc2NoZW1lOworICB1bnNpZ25lZCBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgRElNIChhY19zY2hlbWVzKTsgaSsrKQorICAgIGlmIChzY2hlbWUgPT0gYWNfc2NoZW1lc1tpXS5zY2hlbWUpCisgICAgICBicmVhazsKKyAgaWYgKGkgPT0gRElNIChhY19zY2hlbWVzKSkKKyAgICBhY19zY2hlbWUgPSBOVUxMOworICBlbHNlCisgICAgYWNfc2NoZW1lID0gYWNfc2NoZW1lcyArIGk7CisKKyAgcmV0dXJuIGFjX3NjaGVtZTsKK30KKworLyogUHJlcGFyZXMgdGhlIGVuY29kaW5nL2RlY29kaW5nIGJ5IGNyZWF0aW5nIGFuIGFjY29yZGluZyBvcHRpb24KKyAgIHN0cnVjdHVyZS4gICovCitzdGF0aWMgZ2NyeV9lcnJvcl90CithY19kZW5jb2RlX3ByZXBhcmUgKGdjcnlfYWNfaGFuZGxlX3QgaGFuZGxlLCBnY3J5X2FjX2tleV90IGtleSwgdm9pZCAqb3B0cywKKwkJICAgIGFjX3NjaGVtZV90IHNjaGVtZSwgdm9pZCAqKm9wdHNfZW0pCit7CisgIGdjcnlfZXJyb3JfdCBlcnI7CisgIHZvaWQgKm9wdGlvbnNfZW07CisKKyAgb3B0aW9uc19lbSA9IGdjcnlfbWFsbG9jIChzY2hlbWUub3B0aW9uc19lbV9uKTsKKyAgaWYgKCEgb3B0aW9uc19lbSkKKyAgICB7CisgICAgICBlcnIgPSBnY3J5X2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgCisgIGVyciA9ICgqc2NoZW1lLmRlbmNvZGVfcHJlcGFyZSkgKGhhbmRsZSwga2V5LCBvcHRzLCBvcHRpb25zX2VtKTsKKyAgaWYgKGVycikKKyAgICBnb3RvIG91dDsKKworICAqb3B0c19lbSA9IG9wdGlvbnNfZW07CisKKyBvdXQ6CisKKyAgaWYgKGVycikKKyAgICBmcmVlIChvcHRpb25zX2VtKTsKKworICByZXR1cm4gZXJyOworfQorCisvKiBDb252ZXJ0IGEgZGF0YSBzZXQgaW50byBhIHNpbmdsZSBNUEk7IGN1cnJlbnRseSwgdGhpcyBpcyBvbmx5CisgICBzdXBwb3J0ZWQgZm9yIGRhdGEgc2V0cyBjb250YWluaW5nIGEgc2luZ2xlIE1QSS4gICovCitzdGF0aWMgZ2NyeV9lcnJvcl90CithY19kYXRhX3NldF90b19tcGkgKGdjcnlfYWNfZGF0YV90IGRhdGEsIGdjcnlfbXBpX3QgKm1waSkKK3sKKyAgZ2NyeV9lcnJvcl90IGVycjsKKyAgZ2NyeV9tcGlfdCBtcGlfbmV3OworICB1bnNpZ25lZCBpbnQgZWxlbXM7CisKKyAgZWxlbXMgPSBfZ2NyeV9hY19kYXRhX2xlbmd0aCAoZGF0YSk7CisKKyAgaWYgKGVsZW1zICE9IDEpCisgICAgeworICAgICAgLyogRklYTUU6IEkgZ3Vlc3MsIHdlIHNob3VsZCBiZSBtb3JlIGZsZXhpYmxlIGluIHRoaXMgcmVzcGVjdCBieQorCSBhbGxvd2luZyB0aGUgYWN0dWFsIGVuY3J5cHRpb24vc2lnbmF0dXJlIHNjaGVtZXMgdG8gaW1wbGVtZW50CisJIHRoaXMgY29udmVyc2lvbiBtZWNoYW5pc20uICAqLworICAgICAgZXJyID0gZ2NyeV9lcnJvciAoR1BHX0VSUl9DT05GTElDVCk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgZXJyID0gX2djcnlfYWNfZGF0YV9nZXRfaW5kZXggKGRhdGEsIEdDUllfQUNfRkxBR19DT1BZLCAwLCBOVUxMLCAmbXBpX25ldyk7CisgIGlmIChlcnIpCisgICAgZ290byBvdXQ7CisKKyAgKm1waSA9IG1waV9uZXc7CisKKyBvdXQ6CisKKyAgcmV0dXJuIGVycjsKK30KKworLyogRW5jcnlwdHMgdGhlIHBsYWluIHRleHQgbWVzc2FnZSBjb250YWluZWQgaW4gTSwgd2hpY2ggaXMgb2Ygc2l6ZQorICAgTV9OLCB3aXRoIHRoZSBwdWJsaWMga2V5IEtFWV9QVUJMSUMgYWNjb3JkaW5nIHRvIHRoZSBFbmNyeXB0aW9uCisgICBTY2hlbWUgU0NIRU1FX0lELiAgSEFORExFIGlzIHVzZWQgZm9yIGFjY2Vzc2luZyB0aGUgbG93LWxldmVsCisgICBjcnlwdG9ncmFwaGljIHByaW1pdGl2ZXMuICBJZiBPUFRTIGlzIG5vdCBOVUxMLCBpdCBoYXMgdG8gYmUgYW4KKyAgIGFub255bW91cyBzdHJ1Y3R1cmUgc3BlY2lmaWMgdG8gdGhlIGNob3NlbiBzY2hlbWUgKGdjcnlfYWNfZXNfKl90KS4KKyAgIFRoZSBlbmNyeXB0ZWQgbWVzc2FnZSB3aWxsIGJlIHN0b3JlZCBpbiBDIGFuZCBDX04uICAqLworZ2NyeV9lcnJvcl90CitfZ2NyeV9hY19kYXRhX2VuY3J5cHRfc2NoZW1lIChnY3J5X2FjX2hhbmRsZV90IGhhbmRsZSwKKwkJCSAgICAgIGdjcnlfYWNfc2NoZW1lX3Qgc2NoZW1lX2lkLAorCQkJICAgICAgdW5zaWduZWQgaW50IGZsYWdzLCB2b2lkICpvcHRzLAorCQkJICAgICAgZ2NyeV9hY19rZXlfdCBrZXksCisJCQkgICAgICBnY3J5X2FjX2lvX3QgKmlvX21lc3NhZ2UsCisJCQkgICAgICBnY3J5X2FjX2lvX3QgKmlvX2NpcGhlcikKK3sKKyAgZ2NyeV9lcnJvcl90IGVycjsKKyAgZ2NyeV9hY19pb190IGlvX2VtOworICB1bnNpZ25lZCBjaGFyICplbTsKKyAgc2l6ZV90IGVtX247CisgIGdjcnlfbXBpX3QgbXBpX3BsYWluOworICBnY3J5X2FjX2RhdGFfdCBkYXRhX2VuY3J5cHRlZDsKKyAgZ2NyeV9tcGlfdCBtcGlfZW5jcnlwdGVkOworICB1bnNpZ25lZCBjaGFyICpidWZmZXI7CisgIHNpemVfdCBidWZmZXJfbjsKKyAgdm9pZCAqb3B0c19lbTsKKyAgYWNfc2NoZW1lX3QgKnNjaGVtZTsKKworICAodm9pZClmbGFnczsKKworICBpZiAoZmlwc19tb2RlICgpKQorICAgIHJldHVybiBncGdfZXJyb3IgKEdQR19FUlJfTk9UX1NVUFBPUlRFRCk7CisKKyAgZGF0YV9lbmNyeXB0ZWQgPSBOVUxMOworICBtcGlfZW5jcnlwdGVkID0gTlVMTDsKKyAgbXBpX3BsYWluID0gTlVMTDsKKyAgb3B0c19lbSA9IE5VTEw7CisgIGJ1ZmZlciA9IE5VTEw7CisgIGVtID0gTlVMTDsKKworICBzY2hlbWUgPSBhY19zY2hlbWVfZ2V0IChzY2hlbWVfaWQpOworICBpZiAoISBzY2hlbWUpCisgICAgeworICAgICAgZXJyID0gZ2NyeV9lcnJvciAoR1BHX0VSUl9OT19FTkNSWVBUSU9OX1NDSEVNRSk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKGtleS0+dHlwZSAhPSBHQ1JZX0FDX0tFWV9QVUJMSUMpCisgICAgeworICAgICAgZXJyID0gZ2NyeV9lcnJvciAoR1BHX0VSUl9XUk9OR19LRVlfVVNBR0UpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGVyciA9IGFjX2RlbmNvZGVfcHJlcGFyZSAoaGFuZGxlLCBrZXksIG9wdHMsICpzY2hlbWUsICZvcHRzX2VtKTsKKyAgaWYgKGVycikKKyAgICBnb3RvIG91dDsKKworICBfZ2NyeV9hY19pb19pbml0ICgmaW9fZW0sIEdDUllfQUNfSU9fV1JJVEFCTEUsCisJCSAgICBHQ1JZX0FDX0lPX1NUUklORywgJmVtLCAmZW1fbik7CisKKyAgZXJyID0gX2djcnlfYWNfZGF0YV9lbmNvZGUgKHNjaGVtZS0+c2NoZW1lX2VuY29kaW5nLCAwLCBvcHRzX2VtLAorCQkJICAgICAgaW9fbWVzc2FnZSwgJmlvX2VtKTsKKyAgaWYgKGVycikKKyAgICBnb3RvIG91dDsKKworICBtcGlfcGxhaW4gPSBnY3J5X21waV9zbmV3ICgwKTsKKyAgZ2NyeV9hY19vc190b19tcGkgKG1waV9wbGFpbiwgZW0sIGVtX24pOworCisgIGVyciA9IF9nY3J5X2FjX2RhdGFfZW5jcnlwdCAoaGFuZGxlLCAwLCBrZXksIG1waV9wbGFpbiwgJmRhdGFfZW5jcnlwdGVkKTsKKyAgaWYgKGVycikKKyAgICBnb3RvIG91dDsKKworICBlcnIgPSBhY19kYXRhX3NldF90b19tcGkgKGRhdGFfZW5jcnlwdGVkLCAmbXBpX2VuY3J5cHRlZCk7CisgIGlmIChlcnIpCisgICAgZ290byBvdXQ7CisKKyAgZXJyID0gX2djcnlfYWNfbXBpX3RvX29zX2FsbG9jIChtcGlfZW5jcnlwdGVkLCAmYnVmZmVyLCAmYnVmZmVyX24pOworICBpZiAoZXJyKQorICAgIGdvdG8gb3V0OworCisgIGVyciA9IF9nY3J5X2FjX2lvX3dyaXRlIChpb19jaXBoZXIsIGJ1ZmZlciwgYnVmZmVyX24pOworCisgb3V0OgorCisgIGdjcnlfYWNfZGF0YV9kZXN0cm95IChkYXRhX2VuY3J5cHRlZCk7CisgIGdjcnlfbXBpX3JlbGVhc2UgKG1waV9lbmNyeXB0ZWQpOworICBnY3J5X21waV9yZWxlYXNlIChtcGlfcGxhaW4pOworICBnY3J5X2ZyZWUgKG9wdHNfZW0pOworICBnY3J5X2ZyZWUgKGJ1ZmZlcik7CisgIGdjcnlfZnJlZSAoZW0pOworCisgIHJldHVybiBlcnI7Cit9CisKKy8qIERlY3J5cHRlcyB0aGUgY2lwaGVyIG1lc3NhZ2UgY29udGFpbmVkIGluIEMsIHdoaWNoIGlzIG9mIHNpemUgQ19OLAorICAgd2l0aCB0aGUgc2VjcmV0IGtleSBLRVlfU0VDUkVUIGFjY29yZGluZyB0byB0aGUgRW5jcnlwdGlvbiBTY2hlbWUKKyAgIFNDSEVNRV9JRC4gIEhhbmRsZSBpcyB1c2VkIGZvciBhY2Nlc3NpbmcgdGhlIGxvdy1sZXZlbAorICAgY3J5cHRvZ3JhcGhpYyBwcmltaXRpdmVzLiAgSWYgT1BUUyBpcyBub3QgTlVMTCwgaXQgaGFzIHRvIGJlIGFuCisgICBhbm9ueW1vdXMgc3RydWN0dXJlIHNwZWNpZmljIHRvIHRoZSBjaG9zZW4gc2NoZW1lIChnY3J5X2FjX2VzXypfdCkuCisgICBUaGUgZGVjcnlwdGVkIG1lc3NhZ2Ugd2lsbCBiZSBzdG9yZWQgaW4gTSBhbmQgTV9OLiAgKi8KK2djcnlfZXJyb3JfdAorX2djcnlfYWNfZGF0YV9kZWNyeXB0X3NjaGVtZSAoZ2NyeV9hY19oYW5kbGVfdCBoYW5kbGUsCisJCQkgICAgICBnY3J5X2FjX3NjaGVtZV90IHNjaGVtZV9pZCwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBmbGFncywgdm9pZCAqb3B0cywKKwkJCSAgICAgIGdjcnlfYWNfa2V5X3Qga2V5LAorCQkJICAgICAgZ2NyeV9hY19pb190ICppb19jaXBoZXIsCisJCQkgICAgICBnY3J5X2FjX2lvX3QgKmlvX21lc3NhZ2UpCit7CisgIGdjcnlfYWNfaW9fdCBpb19lbTsKKyAgZ2NyeV9lcnJvcl90IGVycjsKKyAgZ2NyeV9hY19kYXRhX3QgZGF0YV9lbmNyeXB0ZWQ7CisgIHVuc2lnbmVkIGNoYXIgKmVtOworICBzaXplX3QgZW1fbjsKKyAgZ2NyeV9tcGlfdCBtcGlfZW5jcnlwdGVkOworICBnY3J5X21waV90IG1waV9kZWNyeXB0ZWQ7CisgIHZvaWQgKm9wdHNfZW07CisgIGFjX3NjaGVtZV90ICpzY2hlbWU7CisgIGNoYXIgKmVsZW1lbnRzX2VuYzsKKyAgc2l6ZV90IGVsZW1lbnRzX2VuY19uOworICB1bnNpZ25lZCBjaGFyICpjOworICBzaXplX3QgY19uOworCisgICh2b2lkKWZsYWdzOworCisgIGlmIChmaXBzX21vZGUgKCkpCisgICAgcmV0dXJuIGdwZ19lcnJvciAoR1BHX0VSUl9OT1RfU1VQUE9SVEVEKTsKKworICBkYXRhX2VuY3J5cHRlZCA9IE5VTEw7CisgIG1waV9lbmNyeXB0ZWQgPSBOVUxMOworICBtcGlfZGVjcnlwdGVkID0gTlVMTDsKKyAgZWxlbWVudHNfZW5jID0gTlVMTDsKKyAgb3B0c19lbSA9IE5VTEw7CisgIGVtID0gTlVMTDsKKyAgYyA9IE5VTEw7CisKKyAgc2NoZW1lID0gYWNfc2NoZW1lX2dldCAoc2NoZW1lX2lkKTsKKyAgaWYgKCEgc2NoZW1lKQorICAgIHsKKyAgICAgIGVyciA9IGdjcnlfZXJyb3IgKEdQR19FUlJfTk9fRU5DUllQVElPTl9TQ0hFTUUpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmIChrZXktPnR5cGUgIT0gR0NSWV9BQ19LRVlfU0VDUkVUKQorICAgIHsKKyAgICAgIGVyciA9IGdjcnlfZXJyb3IgKEdQR19FUlJfV1JPTkdfS0VZX1VTQUdFKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBlcnIgPSBfZ2NyeV9hY19pb19yZWFkX2FsbCAoaW9fY2lwaGVyLCAmYywgJmNfbik7CisgIGlmIChlcnIpCisgICAgZ290byBvdXQ7CisKKyAgbXBpX2VuY3J5cHRlZCA9IGdjcnlfbXBpX3NuZXcgKDApOworICBnY3J5X2FjX29zX3RvX21waSAobXBpX2VuY3J5cHRlZCwgYywgY19uKTsKKworICBlcnIgPSBfZ2NyeV9wa19nZXRfZWxlbWVudHMgKGhhbmRsZS0+YWxnb3JpdGhtLCAmZWxlbWVudHNfZW5jLCBOVUxMKTsKKyAgaWYgKGVycikKKyAgICBnb3RvIG91dDsKKworICBlbGVtZW50c19lbmNfbiA9IHN0cmxlbiAoZWxlbWVudHNfZW5jKTsKKyAgaWYgKGVsZW1lbnRzX2VuY19uICE9IDEpCisgICAgeworICAgICAgLyogRklYTUU/ICovCisgICAgICBlcnIgPSBnY3J5X2Vycm9yIChHUEdfRVJSX0NPTkZMSUNUKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBlcnIgPSBfZ2NyeV9hY19kYXRhX25ldyAoJmRhdGFfZW5jcnlwdGVkKTsKKyAgaWYgKGVycikKKyAgICBnb3RvIG91dDsKKworICBlcnIgPSBfZ2NyeV9hY19kYXRhX3NldCAoZGF0YV9lbmNyeXB0ZWQsIEdDUllfQUNfRkxBR19DT1BZIHwgR0NSWV9BQ19GTEFHX0RFQUxMT0MsCisJCQkgICBlbGVtZW50c19lbmMsIG1waV9lbmNyeXB0ZWQpOworICBpZiAoZXJyKQorICAgIGdvdG8gb3V0OworCisgIGVyciA9IF9nY3J5X2FjX2RhdGFfZGVjcnlwdCAoaGFuZGxlLCAwLCBrZXksICZtcGlfZGVjcnlwdGVkLCBkYXRhX2VuY3J5cHRlZCk7CisgIGlmIChlcnIpCisgICAgZ290byBvdXQ7CisKKyAgZXJyID0gX2djcnlfYWNfbXBpX3RvX29zX2FsbG9jIChtcGlfZGVjcnlwdGVkLCAmZW0sICZlbV9uKTsKKyAgaWYgKGVycikKKyAgICBnb3RvIG91dDsKKworICBlcnIgPSBhY19kZW5jb2RlX3ByZXBhcmUgKGhhbmRsZSwga2V5LCBvcHRzLCAqc2NoZW1lLCAmb3B0c19lbSk7CisgIGlmIChlcnIpCisgICAgZ290byBvdXQ7CisKKyAgX2djcnlfYWNfaW9faW5pdCAoJmlvX2VtLCBHQ1JZX0FDX0lPX1JFQURBQkxFLAorCQkgICAgR0NSWV9BQ19JT19TVFJJTkcsIGVtLCBlbV9uKTsKKworICBlcnIgPSBfZ2NyeV9hY19kYXRhX2RlY29kZSAoc2NoZW1lLT5zY2hlbWVfZW5jb2RpbmcsIDAsIG9wdHNfZW0sCisJCQkgICAgICAmaW9fZW0sIGlvX21lc3NhZ2UpOworICBpZiAoZXJyKQorICAgIGdvdG8gb3V0OworCisgb3V0OgorICAKKyAgX2djcnlfYWNfZGF0YV9kZXN0cm95IChkYXRhX2VuY3J5cHRlZCk7CisgIGdjcnlfbXBpX3JlbGVhc2UgKG1waV9lbmNyeXB0ZWQpOworICBnY3J5X21waV9yZWxlYXNlIChtcGlfZGVjcnlwdGVkKTsKKyAgZnJlZSAoZWxlbWVudHNfZW5jKTsKKyAgZ2NyeV9mcmVlIChvcHRzX2VtKTsKKyAgZ2NyeV9mcmVlIChlbSk7CisgIGdjcnlfZnJlZSAoYyk7CisKKyAgcmV0dXJuIGVycjsKK30KKworCisvKiBTaWducyB0aGUgbWVzc2FnZSBjb250YWluZWQgaW4gTSwgd2hpY2ggaXMgb2Ygc2l6ZSBNX04sIHdpdGggdGhlCisgICBzZWNyZXQga2V5IEtFWSBhY2NvcmRpbmcgdG8gdGhlIFNpZ25hdHVyZSBTY2hlbWUgU0NIRU1FX0lELiAgSGFuZGxlCisgICBpcyB1c2VkIGZvciBhY2Nlc3NpbmcgdGhlIGxvdy1sZXZlbCBjcnlwdG9ncmFwaGljIHByaW1pdGl2ZXMuICBJZgorICAgT1BUUyBpcyBub3QgTlVMTCwgaXQgaGFzIHRvIGJlIGFuIGFub255bW91cyBzdHJ1Y3R1cmUgc3BlY2lmaWMgdG8KKyAgIHRoZSBjaG9zZW4gc2NoZW1lIChnY3J5X2FjX3NzYV8qX3QpLiAgVGhlIHNpZ25lZCBtZXNzYWdlIHdpbGwgYmUKKyAgIHN0b3JlZCBpbiBTIGFuZCBTX04uICAqLworZ2NyeV9lcnJvcl90CitfZ2NyeV9hY19kYXRhX3NpZ25fc2NoZW1lIChnY3J5X2FjX2hhbmRsZV90IGhhbmRsZSwKKwkJCSAgIGdjcnlfYWNfc2NoZW1lX3Qgc2NoZW1lX2lkLAorCQkJICAgdW5zaWduZWQgaW50IGZsYWdzLCB2b2lkICpvcHRzLAorCQkJICAgZ2NyeV9hY19rZXlfdCBrZXksCisJCQkgICBnY3J5X2FjX2lvX3QgKmlvX21lc3NhZ2UsCisJCQkgICBnY3J5X2FjX2lvX3QgKmlvX3NpZ25hdHVyZSkKK3sKKyAgZ2NyeV9hY19pb190IGlvX2VtOworICBnY3J5X2Vycm9yX3QgZXJyOworICBnY3J5X2FjX2RhdGFfdCBkYXRhX3NpZ25lZDsKKyAgdW5zaWduZWQgY2hhciAqZW07CisgIHNpemVfdCBlbV9uOworICBnY3J5X21waV90IG1waTsKKyAgdm9pZCAqb3B0c19lbTsKKyAgdW5zaWduZWQgY2hhciAqYnVmZmVyOworICBzaXplX3QgYnVmZmVyX247CisgIGdjcnlfbXBpX3QgbXBpX3NpZ25lZDsKKyAgYWNfc2NoZW1lX3QgKnNjaGVtZTsKKworICAodm9pZClmbGFnczsKKworICBpZiAoZmlwc19tb2RlICgpKQorICAgIHJldHVybiBncGdfZXJyb3IgKEdQR19FUlJfTk9UX1NVUFBPUlRFRCk7CisKKyAgZGF0YV9zaWduZWQgPSBOVUxMOworICBtcGlfc2lnbmVkID0gTlVMTDsKKyAgb3B0c19lbSA9IE5VTEw7CisgIGJ1ZmZlciA9IE5VTEw7CisgIG1waSA9IE5VTEw7CisgIGVtID0gTlVMTDsKKworICBpZiAoa2V5LT50eXBlICE9IEdDUllfQUNfS0VZX1NFQ1JFVCkKKyAgICB7CisgICAgICBlcnIgPSBnY3J5X2Vycm9yIChHUEdfRVJSX1dST05HX0tFWV9VU0FHRSk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgc2NoZW1lID0gYWNfc2NoZW1lX2dldCAoc2NoZW1lX2lkKTsKKyAgaWYgKCEgc2NoZW1lKQorICAgIHsKKyAgICAgIC8qIEZJWE1FOiBhZGp1c3QgYXBpIG9mIHNjaGVtZV9nZXQgaW4gcmVzcGVjdCB0byBlcnIgY29kZXMuICAqLworICAgICAgZXJyID0gZ2NyeV9lcnJvciAoR1BHX0VSUl9OT19TSUdOQVRVUkVfU0NIRU1FKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBlcnIgPSBhY19kZW5jb2RlX3ByZXBhcmUgKGhhbmRsZSwga2V5LCBvcHRzLCAqc2NoZW1lLCAmb3B0c19lbSk7CisgIGlmIChlcnIpCisgICAgZ290byBvdXQ7CisKKyAgX2djcnlfYWNfaW9faW5pdCAoJmlvX2VtLCBHQ1JZX0FDX0lPX1dSSVRBQkxFLAorCQkgICAgR0NSWV9BQ19JT19TVFJJTkcsICZlbSwgJmVtX24pOworCisgIGVyciA9IF9nY3J5X2FjX2RhdGFfZW5jb2RlIChzY2hlbWUtPnNjaGVtZV9lbmNvZGluZywgMCwgb3B0c19lbSwKKwkJCSAgICAgIGlvX21lc3NhZ2UsICZpb19lbSk7CisgIGlmIChlcnIpCisgICAgZ290byBvdXQ7CisKKyAgbXBpID0gZ2NyeV9tcGlfbmV3ICgwKTsKKyAgX2djcnlfYWNfb3NfdG9fbXBpIChtcGksIGVtLCBlbV9uKTsKKworICBlcnIgPSBfZ2NyeV9hY19kYXRhX3NpZ24gKGhhbmRsZSwga2V5LCBtcGksICZkYXRhX3NpZ25lZCk7CisgIGlmIChlcnIpCisgICAgZ290byBvdXQ7CisKKyAgZXJyID0gYWNfZGF0YV9zZXRfdG9fbXBpIChkYXRhX3NpZ25lZCwgJm1waV9zaWduZWQpOworICBpZiAoZXJyKQorICAgIGdvdG8gb3V0OworCisgIGVyciA9IF9nY3J5X2FjX21waV90b19vc19hbGxvYyAobXBpX3NpZ25lZCwgJmJ1ZmZlciwgJmJ1ZmZlcl9uKTsKKyAgaWYgKGVycikKKyAgICBnb3RvIG91dDsKKworICBlcnIgPSBfZ2NyeV9hY19pb193cml0ZSAoaW9fc2lnbmF0dXJlLCBidWZmZXIsIGJ1ZmZlcl9uKTsKKworIG91dDoKKworICBfZ2NyeV9hY19kYXRhX2Rlc3Ryb3kgKGRhdGFfc2lnbmVkKTsKKyAgZ2NyeV9tcGlfcmVsZWFzZSAobXBpX3NpZ25lZCk7CisgIGdjcnlfbXBpX3JlbGVhc2UgKG1waSk7CisgIGdjcnlfZnJlZSAob3B0c19lbSk7CisgIGdjcnlfZnJlZSAoYnVmZmVyKTsKKyAgZ2NyeV9mcmVlIChlbSk7CisKKyAgcmV0dXJuIGVycjsKK30KKworLyogVmVyaWZpZXMgdGhhdCB0aGUgc2lnbmF0dXJlIGNvbnRhaW5lZCBpbiBTLCB3aGljaCBpcyBvZiBsZW5ndGggU19OLAorICAgaXMgaW5kZWVkIHRoZSByZXN1bHQgb2Ygc2lnbmluZyB0aGUgbWVzc2FnZSBjb250YWluZWQgaW4gTSwgd2hpY2gKKyAgIGlzIG9mIHNpemUgTV9OLCB3aXRoIHRoZSBzZWNyZXQga2V5IGJlbG9uZ2luZyB0byB0aGUgcHVibGljIGtleQorICAgS0VZX1BVQkxJQy4gIElmIE9QVFMgaXMgbm90IE5VTEwsIGl0IGhhcyB0byBiZSBhbiBhbm9ueW1vdXMKKyAgIHN0cnVjdHVyZSAoZ2NyeV9hY19zc2FfKl90KSBzcGVjaWZpYyB0byB0aGUgU2lnbmF0dXJlIFNjaGVtZSwgd2hvc2UKKyAgIElEIGlzIGNvbnRhaW5lZCBpbiBTQ0hFTUVfSUQuICAqLworZ2NyeV9lcnJvcl90CitfZ2NyeV9hY19kYXRhX3ZlcmlmeV9zY2hlbWUgKGdjcnlfYWNfaGFuZGxlX3QgaGFuZGxlLAorCQkJICAgICBnY3J5X2FjX3NjaGVtZV90IHNjaGVtZV9pZCwKKwkJCSAgICAgdW5zaWduZWQgaW50IGZsYWdzLCB2b2lkICpvcHRzLAorCQkJICAgICBnY3J5X2FjX2tleV90IGtleSwKKwkJCSAgICAgZ2NyeV9hY19pb190ICppb19tZXNzYWdlLAorCQkJICAgICBnY3J5X2FjX2lvX3QgKmlvX3NpZ25hdHVyZSkKK3sKKyAgZ2NyeV9hY19pb190IGlvX2VtOworICBnY3J5X2Vycm9yX3QgZXJyOworICBnY3J5X2FjX2RhdGFfdCBkYXRhX3NpZ25lZDsKKyAgdW5zaWduZWQgY2hhciAqZW07CisgIHNpemVfdCBlbV9uOworICB2b2lkICpvcHRzX2VtOworICBnY3J5X21waV90IG1waV9zaWduYXR1cmU7CisgIGdjcnlfbXBpX3QgbXBpX2RhdGE7CisgIGFjX3NjaGVtZV90ICpzY2hlbWU7CisgIGNoYXIgKmVsZW1lbnRzX3NpZzsKKyAgc2l6ZV90IGVsZW1lbnRzX3NpZ19uOworICB1bnNpZ25lZCBjaGFyICpzOworICBzaXplX3Qgc19uOworCisgICh2b2lkKWZsYWdzOworCisgIGlmIChmaXBzX21vZGUgKCkpCisgICAgcmV0dXJuIGdwZ19lcnJvciAoR1BHX0VSUl9OT1RfU1VQUE9SVEVEKTsKKworICBtcGlfc2lnbmF0dXJlID0gTlVMTDsKKyAgZWxlbWVudHNfc2lnID0gTlVMTDsKKyAgZGF0YV9zaWduZWQgPSBOVUxMOworICBtcGlfZGF0YSA9IE5VTEw7CisgIG9wdHNfZW0gPSBOVUxMOworICBlbSA9IE5VTEw7CisgIHMgPSBOVUxMOworCisgIGlmIChrZXktPnR5cGUgIT0gR0NSWV9BQ19LRVlfUFVCTElDKQorICAgIHsKKyAgICAgIGVyciA9IGdjcnlfZXJyb3IgKEdQR19FUlJfV1JPTkdfS0VZX1VTQUdFKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBzY2hlbWUgPSBhY19zY2hlbWVfZ2V0IChzY2hlbWVfaWQpOworICBpZiAoISBzY2hlbWUpCisgICAgeworICAgICAgZXJyID0gZ2NyeV9lcnJvciAoR1BHX0VSUl9OT19TSUdOQVRVUkVfU0NIRU1FKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBlcnIgPSBhY19kZW5jb2RlX3ByZXBhcmUgKGhhbmRsZSwga2V5LCBvcHRzLCAqc2NoZW1lLCAmb3B0c19lbSk7CisgIGlmIChlcnIpCisgICAgZ290byBvdXQ7CisKKyAgX2djcnlfYWNfaW9faW5pdCAoJmlvX2VtLCBHQ1JZX0FDX0lPX1dSSVRBQkxFLAorCQkgICAgR0NSWV9BQ19JT19TVFJJTkcsICZlbSwgJmVtX24pOworCisgIGVyciA9IF9nY3J5X2FjX2RhdGFfZW5jb2RlIChzY2hlbWUtPnNjaGVtZV9lbmNvZGluZywgMCwgb3B0c19lbSwKKwkJCSAgICAgIGlvX21lc3NhZ2UsICZpb19lbSk7CisgIGlmIChlcnIpCisgICAgZ290byBvdXQ7CisKKyAgbXBpX2RhdGEgPSBnY3J5X21waV9uZXcgKDApOworICBfZ2NyeV9hY19vc190b19tcGkgKG1waV9kYXRhLCBlbSwgZW1fbik7CisKKyAgZXJyID0gX2djcnlfYWNfaW9fcmVhZF9hbGwgKGlvX3NpZ25hdHVyZSwgJnMsICZzX24pOworICBpZiAoZXJyKQorICAgIGdvdG8gb3V0OworCisgIG1waV9zaWduYXR1cmUgPSBnY3J5X21waV9uZXcgKDApOworICBfZ2NyeV9hY19vc190b19tcGkgKG1waV9zaWduYXR1cmUsIHMsIHNfbik7CisKKyAgZXJyID0gX2djcnlfcGtfZ2V0X2VsZW1lbnRzIChoYW5kbGUtPmFsZ29yaXRobSwgTlVMTCwgJmVsZW1lbnRzX3NpZyk7CisgIGlmIChlcnIpCisgICAgZ290byBvdXQ7CisKKyAgZWxlbWVudHNfc2lnX24gPSBzdHJsZW4gKGVsZW1lbnRzX3NpZyk7CisgIGlmIChlbGVtZW50c19zaWdfbiAhPSAxKQorICAgIHsKKyAgICAgIC8qIEZJWE1FPyAqLworICAgICAgZXJyID0gZ2NyeV9lcnJvciAoR1BHX0VSUl9DT05GTElDVCk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgZXJyID0gX2djcnlfYWNfZGF0YV9uZXcgKCZkYXRhX3NpZ25lZCk7CisgIGlmIChlcnIpCisgICAgZ290byBvdXQ7CisKKyAgZXJyID0gX2djcnlfYWNfZGF0YV9zZXQgKGRhdGFfc2lnbmVkLCBHQ1JZX0FDX0ZMQUdfQ09QWSB8IEdDUllfQUNfRkxBR19ERUFMTE9DLAorCQkJICAgZWxlbWVudHNfc2lnLCBtcGlfc2lnbmF0dXJlKTsKKyAgaWYgKGVycikKKyAgICBnb3RvIG91dDsKKworICBnY3J5X21waV9yZWxlYXNlIChtcGlfc2lnbmF0dXJlKTsKKyAgbXBpX3NpZ25hdHVyZSA9IE5VTEw7CisgIAorICBlcnIgPSBfZ2NyeV9hY19kYXRhX3ZlcmlmeSAoaGFuZGxlLCBrZXksIG1waV9kYXRhLCBkYXRhX3NpZ25lZCk7CisKKyBvdXQ6CisKKyAgX2djcnlfYWNfZGF0YV9kZXN0cm95IChkYXRhX3NpZ25lZCk7CisgIGdjcnlfbXBpX3JlbGVhc2UgKG1waV9zaWduYXR1cmUpOworICBnY3J5X21waV9yZWxlYXNlIChtcGlfZGF0YSk7CisgIGZyZWUgKGVsZW1lbnRzX3NpZyk7CisgIGdjcnlfZnJlZSAob3B0c19lbSk7CisgIGdjcnlfZnJlZSAoZW0pOworICBnY3J5X2ZyZWUgKHMpOworCisgIHJldHVybiBlcnI7Cit9CisKKworLyogCisgKiBHZW5lcmFsIGZ1bmN0aW9ucy4KKyAqLworCitnY3J5X2Vycl9jb2RlX3QKK19nY3J5X2FjX2luaXQgKHZvaWQpCit7CisgIGlmIChmaXBzX21vZGUgKCkpCisgICAgcmV0dXJuIEdQR19FUlJfTk9UX1NVUFBPUlRFRDsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9jaXBoZXIvYXJjZm91ci5jIGIvbGliZ2NyeXB0LTEuNC42L2NpcGhlci9hcmNmb3VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJiMDU1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9jaXBoZXIvYXJjZm91ci5jCkBAIC0wLDAgKzEsMTU2IEBACisvKiBhcmNmb3VyLmMgIC0gIFRoZSBhcmNmb3VyIHN0cmVhbSBjaXBoZXIKKyAqCUNvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBnZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKgorICogRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIGFsZ29yaXRobSwgc2VlOgorICogICBCcnVjZSBTY2huZWllcjogQXBwbGllZCBDcnlwdG9ncmFwaHkuIEpvaG4gV2lsZXkgJiBTb25zLCAxOTk2LgorICogICBJU0JOIDAtNDcxLTExNzA5LTkuIFBhZ2VzIDM5NyBmZi4KKyAqLworCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAiZzEwbGliLmgiCisjaW5jbHVkZSAiY2lwaGVyLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyICpzZWxmdGVzdCh2b2lkKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBpZHhfaSwgaWR4X2o7CisgICAgYnl0ZSBzYm94WzI1Nl07Cit9IEFSQ0ZPVVJfY29udGV4dDsKKworc3RhdGljIHZvaWQKK2RvX2VuY3J5cHRfc3RyZWFtKCBBUkNGT1VSX2NvbnRleHQgKmN0eCwKKwkJICAgYnl0ZSAqb3V0YnVmLCBjb25zdCBieXRlICppbmJ1ZiwgdW5zaWduZWQgaW50IGxlbmd0aCApCit7CisgIHJlZ2lzdGVyIGludCBpID0gY3R4LT5pZHhfaTsKKyAgcmVnaXN0ZXIgaW50IGogPSBjdHgtPmlkeF9qOworICByZWdpc3RlciBieXRlICpzYm94ID0gY3R4LT5zYm94OworICByZWdpc3RlciBpbnQgdDsgIAorCisgIHdoaWxlICggbGVuZ3RoLS0gKQorICAgIHsKKyAgICAgIGkrKzsKKyAgICAgIGkgPSBpICYgMjU1OyAvKiBUaGUgYW5kLW9wIHNlZW1zIHRvIGJlIGZhc3RlciB0aGFuIHRoZSBtb2Qtb3AuICovCisgICAgICBqICs9IHNib3hbaV07CisgICAgICBqICY9IDI1NTsKKyAgICAgIHQgPSBzYm94W2ldOyBzYm94W2ldID0gc2JveFtqXTsgc2JveFtqXSA9IHQ7CisgICAgICAqb3V0YnVmKysgPSAqaW5idWYrKyBeIHNib3hbKHNib3hbaV0gKyBzYm94W2pdKSAmIDI1NV07CisgICAgfQorICAKKyAgY3R4LT5pZHhfaSA9IGk7CisgIGN0eC0+aWR4X2ogPSBqOworfQorCitzdGF0aWMgdm9pZAorZW5jcnlwdF9zdHJlYW0gKHZvaWQgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgYnl0ZSAqb3V0YnVmLCBjb25zdCBieXRlICppbmJ1ZiwgdW5zaWduZWQgaW50IGxlbmd0aCkKK3sKKyAgQVJDRk9VUl9jb250ZXh0ICpjdHggPSAoQVJDRk9VUl9jb250ZXh0ICopIGNvbnRleHQ7CisgIGRvX2VuY3J5cHRfc3RyZWFtIChjdHgsIG91dGJ1ZiwgaW5idWYsIGxlbmd0aCApOworICBfZ2NyeV9idXJuX3N0YWNrICg2NCk7Cit9CisKKworc3RhdGljIGdjcnlfZXJyX2NvZGVfdAorZG9fYXJjZm91cl9zZXRrZXkgKHZvaWQgKmNvbnRleHQsIGNvbnN0IGJ5dGUgKmtleSwgdW5zaWduZWQgaW50IGtleWxlbikKK3sKKyAgc3RhdGljIGludCBpbml0aWFsaXplZDsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIHNlbGZ0ZXN0X2ZhaWxlZDsKKyAgaW50IGksIGo7CisgIGJ5dGUga2FyclsyNTZdOworICBBUkNGT1VSX2NvbnRleHQgKmN0eCA9IChBUkNGT1VSX2NvbnRleHQgKikgY29udGV4dDsKKworICBpZiAoIWluaXRpYWxpemVkICkgCisgICAgeworICAgICAgaW5pdGlhbGl6ZWQgPSAxOworICAgICAgc2VsZnRlc3RfZmFpbGVkID0gc2VsZnRlc3QoKTsKKyAgICAgIGlmKCBzZWxmdGVzdF9mYWlsZWQgKQorICAgICAgICBsb2dfZXJyb3IgKCJBUkNGT1VSIHNlbGZ0ZXN0IGZhaWxlZCAoJXMpXG4iLCBzZWxmdGVzdF9mYWlsZWQgKTsKKyAgICB9CisgIGlmKCBzZWxmdGVzdF9mYWlsZWQgKQorICAgIHJldHVybiBHUEdfRVJSX1NFTEZURVNUX0ZBSUxFRDsKKworICBpZigga2V5bGVuIDwgNDAvOCApIC8qIHdlIHdhbnQgYXQgbGVhc3QgNDAgYml0cyAqLworICAgIHJldHVybiBHUEdfRVJSX0lOVl9LRVlMRU47CisKKyAgY3R4LT5pZHhfaSA9IGN0eC0+aWR4X2ogPSAwOworICBmb3IgKGk9MDsgaSA8IDI1NjsgaSsrICkKKyAgICBjdHgtPnNib3hbaV0gPSBpOworICBmb3IgKGk9MDsgaSA8IDI1NjsgaSsrICkKKyAgICBrYXJyW2ldID0ga2V5W2kla2V5bGVuXTsKKyAgZm9yIChpPWo9MDsgaSA8IDI1NjsgaSsrICkgCisgICAgeworICAgICAgaW50IHQ7CisgICAgICBqID0gKGogKyBjdHgtPnNib3hbaV0gKyBrYXJyW2ldKSAlIDI1NjsKKyAgICAgIHQgPSBjdHgtPnNib3hbaV07CisgICAgICBjdHgtPnNib3hbaV0gPSBjdHgtPnNib3hbal07CisgICAgICBjdHgtPnNib3hbal0gPSB0OworICAgIH0gCisgIG1lbXNldCgga2FyciwgMCwgMjU2ICk7CisKKyAgcmV0dXJuIEdQR19FUlJfTk9fRVJST1I7Cit9CisKK3N0YXRpYyBnY3J5X2Vycl9jb2RlX3QKK2FyY2ZvdXJfc2V0a2V5ICggdm9pZCAqY29udGV4dCwgY29uc3QgYnl0ZSAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuICkKK3sKKyAgQVJDRk9VUl9jb250ZXh0ICpjdHggPSAoQVJDRk9VUl9jb250ZXh0ICopIGNvbnRleHQ7CisgIGdjcnlfZXJyX2NvZGVfdCByYyA9IGRvX2FyY2ZvdXJfc2V0a2V5IChjdHgsIGtleSwga2V5bGVuICk7CisgIF9nY3J5X2J1cm5fc3RhY2sgKDMwMCk7CisgIHJldHVybiByYzsKK30KKworCitzdGF0aWMgY29uc3QgY2hhcioKK3NlbGZ0ZXN0KHZvaWQpCit7CisgIEFSQ0ZPVVJfY29udGV4dCBjdHg7CisgIGJ5dGUgc2NyYXRjaFsxNl07CSAgIAorICAgIAorICAvKiBUZXN0IHZlY3RvciBmcm9tIENyeXB0bGliIGxhYmVsZWQgdGhlcmU6ICJmcm9tIHRoZQorICAgICBTdGF0ZS9Db21tZXJjZSBEZXBhcnRtZW50Ii4gKi8KKyAgc3RhdGljIGJ5dGUga2V5XzFbXSA9CisgICAgeyAweDYxLCAweDhBLCAweDYzLCAweEQyLCAweEZCIH07CisgIHN0YXRpYyBieXRlIHBsYWludGV4dF8xW10gPQorICAgIHsgMHhEQywgMHhFRSwgMHg0QywgMHhGOSwgMHgyQyB9OworICBzdGF0aWMgY29uc3QgYnl0ZSBjaXBoZXJ0ZXh0XzFbXSA9CisgICAgeyAweEYxLCAweDM4LCAweDI5LCAweEM5LCAweERFIH07CisKKyAgYXJjZm91cl9zZXRrZXkoICZjdHgsIGtleV8xLCBzaXplb2Yoa2V5XzEpKTsKKyAgZW5jcnlwdF9zdHJlYW0oICZjdHgsIHNjcmF0Y2gsIHBsYWludGV4dF8xLCBzaXplb2YocGxhaW50ZXh0XzEpKTsKKyAgaWYgKCBtZW1jbXAgKHNjcmF0Y2gsIGNpcGhlcnRleHRfMSwgc2l6ZW9mIChjaXBoZXJ0ZXh0XzEpKSkKKyAgICByZXR1cm4gIkFyY2ZvdXIgZW5jcnlwdGlvbiB0ZXN0IDEgZmFpbGVkLiI7CisgIGFyY2ZvdXJfc2V0a2V5KCAmY3R4LCBrZXlfMSwgc2l6ZW9mKGtleV8xKSk7CisgIGVuY3J5cHRfc3RyZWFtKCZjdHgsIHNjcmF0Y2gsIHNjcmF0Y2gsIHNpemVvZihwbGFpbnRleHRfMSkpOyAvKiBkZWNyeXB0ICovCisgIGlmICggbWVtY21wIChzY3JhdGNoLCBwbGFpbnRleHRfMSwgc2l6ZW9mIChwbGFpbnRleHRfMSkpKQorICAgIHJldHVybiAiQXJjZm91ciBkZWNyeXB0aW9uIHRlc3QgMSBmYWlsZWQuIjsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKworZ2NyeV9jaXBoZXJfc3BlY190IF9nY3J5X2NpcGhlcl9zcGVjX2FyY2ZvdXIgPQorICB7CisgICAgIkFSQ0ZPVVIiLCBOVUxMLCBOVUxMLCAxLCAxMjgsIHNpemVvZiAoQVJDRk9VUl9jb250ZXh0KSwKKyAgICBhcmNmb3VyX3NldGtleSwgTlVMTCwgTlVMTCwgZW5jcnlwdF9zdHJlYW0sIGVuY3J5cHRfc3RyZWFtLAorICB9OworCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvY2lwaGVyL2JpdGhlbHAuaCBiL2xpYmdjcnlwdC0xLjQuNi9jaXBoZXIvYml0aGVscC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MDUzMjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvY2lwaGVyL2JpdGhlbHAuaApAQCAtMCwwICsxLDU0IEBACisvKiBiaXRoZWxwLmggIC0gIFNvbWUgYml0IG1hbmlwdWxhdGlvbiBoZWxwZXJzCisgKglDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgZ2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICovCisjaWZuZGVmIEcxMF9CSVRIRUxQX0gKKyNkZWZpbmUgRzEwX0JJVEhFTFBfSAorCisKKy8qKioqKioqKioqKioqKioqCisgKiBSb3RhdGUgdGhlIDMyIGJpdCB1bnNpZ25lZCBpbnRlZ2VyIFggYnkgTiBiaXRzIGxlZnQvcmlnaHQKKyAqLworI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19pMzg2X18pCitzdGF0aWMgaW5saW5lIHUzMgorcm9sKCB1MzIgeCwgaW50IG4pCit7CisJX19hc21fXygicm9sbCAlJWNsLCUwIgorCQk6Ij1yIiAoeCkKKwkJOiIwIiAoeCksImMiIChuKSk7CisJcmV0dXJuIHg7Cit9CisjZWxzZQorI2RlZmluZSByb2woeCxuKSAoICgoeCkgPDwgKG4pKSB8ICgoeCkgPj4gKDMyLShuKSkpICkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX2kzODZfXykKK3N0YXRpYyBpbmxpbmUgdTMyCityb3IodTMyIHgsIGludCBuKQoreworCV9fYXNtX18oInJvcmwgJSVjbCwlMCIKKwkJOiI9ciIgKHgpCisJCToiMCIgKHgpLCJjIiAobikpOworCXJldHVybiB4OworfQorI2Vsc2UKKyNkZWZpbmUgcm9yKHgsbikgKCAoKHgpID4+IChuKSkgfCAoKHgpIDw8ICgzMi0obikpKSApCisjZW5kaWYKKworCisjZW5kaWYgLypHMTBfQklUSEVMUF9IKi8KZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9jaXBoZXIvYmxvd2Zpc2guYyBiL2xpYmdjcnlwdC0xLjQuNi9jaXBoZXIvYmxvd2Zpc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWY2OGUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L2NpcGhlci9ibG93ZmlzaC5jCkBAIC0wLDAgKzEsNjA1IEBACisvKiBibG93ZmlzaC5jICAtICBCbG93ZmlzaCBlbmNyeXB0aW9uCisgKglDb3B5cmlnaHQgKEMpIDE5OTgsIDIwMDEsIDIwMDIsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgZ2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICoKKyAqIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBhbGdvcml0aG0sIHNlZToKKyAqICAgQnJ1Y2UgU2NobmVpZXI6IEFwcGxpZWQgQ3J5cHRvZ3JhcGh5LiBKb2huIFdpbGV5ICYgU29ucywgMTk5Ni4KKyAqICAgSVNCTiAwLTQ3MS0xMTcwOS05LiBQYWdlcyAzMzYgZmYuCisgKi8KKworLyogVGVzdCB2YWx1ZXM6CisgKiBrZXkJICAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiOworICogcGxhaW4gICJCTE9XRklTSCIKKyAqIGNpcGhlciAzMiA0RSBEMCBGRSBGNCAxMyBBMiAwMworICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJ0eXBlcy5oIgorI2luY2x1ZGUgImcxMGxpYi5oIgorI2luY2x1ZGUgImNpcGhlci5oIgorCisjZGVmaW5lIEJMT1dGSVNIX0JMT0NLU0laRSA4CisjZGVmaW5lIEJMT1dGSVNIX1JPVU5EUyAxNgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdTMyIHMwWzI1Nl07CisgICAgdTMyIHMxWzI1Nl07CisgICAgdTMyIHMyWzI1Nl07CisgICAgdTMyIHMzWzI1Nl07CisgICAgdTMyIHBbQkxPV0ZJU0hfUk9VTkRTKzJdOworfSBCTE9XRklTSF9jb250ZXh0OworCitzdGF0aWMgZ2NyeV9lcnJfY29kZV90IGJmX3NldGtleSAodm9pZCAqYywgY29uc3QgYnl0ZSAqa2V5LCB1bnNpZ25lZCBrZXlsZW4pOworc3RhdGljIHZvaWQgZW5jcnlwdF9ibG9jayAodm9pZCAqYmMsIGJ5dGUgKm91dGJ1ZiwgY29uc3QgYnl0ZSAqaW5idWYpOworc3RhdGljIHZvaWQgZGVjcnlwdF9ibG9jayAodm9pZCAqYmMsIGJ5dGUgKm91dGJ1ZiwgY29uc3QgYnl0ZSAqaW5idWYpOworCisKKy8qIHByZWNvbXB1dGVkIFMgYm94ZXMgKi8KK3N0YXRpYyBjb25zdCB1MzIga3MwWzI1Nl0gPSB7CisgICAgMHhEMTMxMEJBNiwweDk4REZCNUFDLDB4MkZGRDcyREIsMHhEMDFBREZCNywweEI4RTFBRkVELDB4NkEyNjdFOTYsCisgICAgMHhCQTdDOTA0NSwweEYxMkM3Rjk5LDB4MjRBMTk5NDcsMHhCMzkxNkNGNywweDA4MDFGMkUyLDB4ODU4RUZDMTYsCisgICAgMHg2MzY5MjBEOCwweDcxNTc0RTY5LDB4QTQ1OEZFQTMsMHhGNDkzM0Q3RSwweDBEOTU3NDhGLDB4NzI4RUI2NTgsCisgICAgMHg3MThCQ0Q1OCwweDgyMTU0QUVFLDB4N0I1NEE0MUQsMHhDMjVBNTlCNSwweDlDMzBENTM5LDB4MkFGMjYwMTMsCisgICAgMHhDNUQxQjAyMywweDI4NjA4NUYwLDB4Q0E0MTc5MTgsMHhCOERCMzhFRiwweDhFNzlEQ0IwLDB4NjAzQTE4MEUsCisgICAgMHg2QzlFMEU4QiwweEIwMUU4QTNFLDB4RDcxNTc3QzEsMHhCRDMxNEIyNywweDc4QUYyRkRBLDB4NTU2MDVDNjAsCisgICAgMHhFNjU1MjVGMywweEFBNTVBQjk0LDB4NTc0ODk4NjIsMHg2M0U4MTQ0MCwweDU1Q0EzOTZBLDB4MkFBQjEwQjYsCisgICAgMHhCNENDNUMzNCwweDExNDFFOENFLDB4QTE1NDg2QUYsMHg3QzcyRTk5MywweEIzRUUxNDExLDB4NjM2RkJDMkEsCisgICAgMHgyQkE5QzU1RCwweDc0MTgzMUY2LDB4Q0U1QzNFMTYsMHg5Qjg3OTMxRSwweEFGRDZCQTMzLDB4NkMyNENGNUMsCisgICAgMHg3QTMyNTM4MSwweDI4OTU4Njc3LDB4M0I4RjQ4OTgsMHg2QjRCQjlBRiwweEM0QkZFODFCLDB4NjYyODIxOTMsCisgICAgMHg2MUQ4MDlDQywweEZCMjFBOTkxLDB4NDg3Q0FDNjAsMHg1REVDODAzMiwweEVGODQ1RDVELDB4RTk4NTc1QjEsCisgICAgMHhEQzI2MjMwMiwweEVCNjUxQjg4LDB4MjM4OTNFODEsMHhEMzk2QUNDNSwweDBGNkQ2RkYzLDB4ODNGNDQyMzksCisgICAgMHgyRTBCNDQ4MiwweEE0ODQyMDA0LDB4NjlDOEYwNEEsMHg5RTFGOUI1RSwweDIxQzY2ODQyLDB4RjZFOTZDOUEsCisgICAgMHg2NzBDOUM2MSwweEFCRDM4OEYwLDB4NkE1MUEwRDIsMHhEODU0MkY2OCwweDk2MEZBNzI4LDB4QUI1MTMzQTMsCisgICAgMHg2RUVGMEI2QywweDEzN0EzQkU0LDB4QkEzQkYwNTAsMHg3RUZCMkE5OCwweEExRjE2NTFELDB4MzlBRjAxNzYsCisgICAgMHg2NkNBNTkzRSwweDgyNDMwRTg4LDB4OENFRTg2MTksMHg0NTZGOUZCNCwweDdEODRBNUMzLDB4M0I4QjVFQkUsCisgICAgMHhFMDZGNzVEOCwweDg1QzEyMDczLDB4NDAxQTQ0OUYsMHg1NkMxNkFBNiwweDRFRDNBQTYyLDB4MzYzRjc3MDYsCisgICAgMHgxQkZFREY3MiwweDQyOUIwMjNELDB4MzdEMEQ3MjQsMHhEMDBBMTI0OCwweERCMEZFQUQzLDB4NDlGMUMwOUIsCisgICAgMHgwNzUzNzJDOSwweDgwOTkxQjdCLDB4MjVENDc5RDgsMHhGNkU4REVGNywweEUzRkU1MDFBLDB4QjY3OTRDM0IsCisgICAgMHg5NzZDRTBCRCwweDA0QzAwNkJBLDB4QzFBOTRGQjYsMHg0MDlGNjBDNCwweDVFNUM5RUMyLDB4MTk2QTI0NjMsCisgICAgMHg2OEZCNkZBRiwweDNFNkM1M0I1LDB4MTMzOUIyRUIsMHgzQjUyRUM2RiwweDZERkM1MTFGLDB4OUIzMDk1MkMsCisgICAgMHhDQzgxNDU0NCwweEFGNUVCRDA5LDB4QkVFM0QwMDQsMHhERTMzNEFGRCwweDY2MEYyODA3LDB4MTkyRTRCQjMsCisgICAgMHhDMENCQTg1NywweDQ1Qzg3NDBGLDB4RDIwQjVGMzksMHhCOUQzRkJEQiwweDU1NzlDMEJELDB4MUE2MDMyMEEsCisgICAgMHhENkExMDBDNiwweDQwMkM3Mjc5LDB4Njc5RjI1RkUsMHhGQjFGQTNDQywweDhFQTVFOUY4LDB4REIzMjIyRjgsCisgICAgMHgzQzc1MTZERiwweEZENjE2QjE1LDB4MkY1MDFFQzgsMHhBRDA1NTJBQiwweDMyM0RCNUZBLDB4RkQyMzg3NjAsCisgICAgMHg1MzMxN0I0OCwweDNFMDBERjgyLDB4OUU1QzU3QkIsMHhDQTZGOENBMCwweDFBODc1NjJFLDB4REYxNzY5REIsCisgICAgMHhENTQyQThGNiwweDI4N0VGRkMzLDB4QUM2NzMyQzYsMHg4QzRGNTU3MywweDY5NUIyN0IwLDB4QkJDQTU4QzgsCisgICAgMHhFMUZGQTM1RCwweEI4RjAxMUEwLDB4MTBGQTNEOTgsMHhGRDIxODNCOCwweDRBRkNCNTZDLDB4MkREMUQzNUIsCisgICAgMHg5QTUzRTQ3OSwweEI2Rjg0NTY1LDB4RDI4RTQ5QkMsMHg0QkZCOTc5MCwweEUxRERGMkRBLDB4QTRDQjdFMzMsCisgICAgMHg2MkZCMTM0MSwweENFRTRDNkU4LDB4RUYyMENBREEsMHgzNjc3NEMwMSwweEQwN0U5RUZFLDB4MkJGMTFGQjQsCisgICAgMHg5NURCREE0RCwweEFFOTA5MTk4LDB4RUFBRDhFNzEsMHg2QjkzRDVBMCwweEQwOEVEMUQwLDB4QUZDNzI1RTAsCisgICAgMHg4RTNDNUIyRiwweDhFNzU5NEI3LDB4OEZGNkUyRkIsMHhGMjEyMkI2NCwweDg4ODhCODEyLDB4OTAwREYwMUMsCisgICAgMHg0RkFENUVBMCwweDY4OEZDMzFDLDB4RDFDRkYxOTEsMHhCM0E4QzFBRCwweDJGMkYyMjE4LDB4QkUwRTE3NzcsCisgICAgMHhFQTc1MkRGRSwweDhCMDIxRkExLDB4RTVBMENDMEYsMHhCNTZGNzRFOCwweDE4QUNGM0Q2LDB4Q0U4OUUyOTksCisgICAgMHhCNEE4NEZFMCwweEZEMTNFMEI3LDB4N0NDNDNCODEsMHhEMkFEQThEOSwweDE2NUZBMjY2LDB4ODA5NTc3MDUsCisgICAgMHg5M0NDNzMxNCwweDIxMUExNDc3LDB4RTZBRDIwNjUsMHg3N0I1RkE4NiwweEM3NTQ0MkY1LDB4RkI5RDM1Q0YsCisgICAgMHhFQkNEQUYwQywweDdCM0U4OUEwLDB4RDY0MTFCRDMsMHhBRTFFN0U0OSwweDAwMjUwRTJELDB4MjA3MUIzNUUsCisgICAgMHgyMjY4MDBCQiwweDU3QjhFMEFGLDB4MjQ2NDM2OUIsMHhGMDA5QjkxRSwweDU1NjM5MTFELDB4NTlERkE2QUEsCisgICAgMHg3OEMxNDM4OSwweEQ5NUE1MzdGLDB4MjA3RDVCQTIsMHgwMkU1QjlDNSwweDgzMjYwMzc2LDB4NjI5NUNGQTksCisgICAgMHgxMUM4MTk2OCwweDRFNzM0QTQxLDB4QjM0NzJEQ0EsMHg3QjE0QTk0QSwweDFCNTEwMDUyLDB4OUE1MzI5MTUsCisgICAgMHhENjBGNTczRiwweEJDOUJDNkU0LDB4MkI2MEE0NzYsMHg4MUU2NzQwMCwweDA4QkE2RkI1LDB4NTcxQkU5MUYsCisgICAgMHhGMjk2RUM2QiwweDJBMEREOTE1LDB4QjY2MzY1MjEsMHhFN0I5RjlCNiwweEZGMzQwNTJFLDB4QzU4NTU2NjQsCisgICAgMHg1M0IwMkQ1RCwweEE5OUY4RkExLDB4MDhCQTQ3OTksMHg2RTg1MDc2QSB9OworCitzdGF0aWMgY29uc3QgdTMyIGtzMVsyNTZdID0geworICAgIDB4NEI3QTcwRTksMHhCNUIzMjk0NCwweERCNzUwOTJFLDB4QzQxOTI2MjMsMHhBRDZFQTZCMCwweDQ5QTdERjdELAorICAgIDB4OUNFRTYwQjgsMHg4RkVEQjI2NiwweEVDQUE4QzcxLDB4Njk5QTE3RkYsMHg1NjY0NTI2QywweEMyQjE5RUUxLAorICAgIDB4MTkzNjAyQTUsMHg3NTA5NEMyOSwweEEwNTkxMzQwLDB4RTQxODNBM0UsMHgzRjU0OTg5QSwweDVCNDI5RDY1LAorICAgIDB4NkI4RkU0RDYsMHg5OUY3M0ZENiwweEExRDI5QzA3LDB4RUZFODMwRjUsMHg0RDJEMzhFNiwweEYwMjU1REMxLAorICAgIDB4NENERDIwODYsMHg4NDcwRUIyNiwweDYzODJFOUM2LDB4MDIxRUNDNUUsMHgwOTY4NkIzRiwweDNFQkFFRkM5LAorICAgIDB4M0M5NzE4MTQsMHg2QjZBNzBBMSwweDY4N0YzNTg0LDB4NTJBMEUyODYsMHhCNzlDNTMwNSwweEFBNTAwNzM3LAorICAgIDB4M0UwNzg0MUMsMHg3RkRFQUU1QywweDhFN0Q0NEVDLDB4NTcxNkYyQjgsMHhCMDNBREEzNywweEYwNTAwQzBELAorICAgIDB4RjAxQzFGMDQsMHgwMjAwQjNGRiwweEFFMENGNTFBLDB4M0NCNTc0QjIsMHgyNTgzN0E1OCwweERDMDkyMUJELAorICAgIDB4RDE5MTEzRjksMHg3Q0E5MkZGNiwweDk0MzI0NzczLDB4MjJGNTQ3MDEsMHgzQUU1RTU4MSwweDM3QzJEQURDLAorICAgIDB4QzhCNTc2MzQsMHg5QUYzRERBNywweEE5NDQ2MTQ2LDB4MEZEMDAzMEUsMHhFQ0M4QzczRSwweEE0NzUxRTQxLAorICAgIDB4RTIzOENEOTksMHgzQkVBMEUyRiwweDMyODBCQkExLDB4MTgzRUIzMzEsMHg0RTU0OEIzOCwweDRGNkRCOTA4LAorICAgIDB4NkY0MjBEMDMsMHhGNjBBMDRCRiwweDJDQjgxMjkwLDB4MjQ5NzdDNzksMHg1Njc5QjA3MiwweEJDQUY4OUFGLAorICAgIDB4REU5QTc3MUYsMHhEOTkzMDgxMCwweEIzOEJBRTEyLDB4RENDRjNGMkUsMHg1NTEyNzIxRiwweDJFNkI3MTI0LAorICAgIDB4NTAxQURERTYsMHg5Rjg0Q0Q4NywweDdBNTg0NzE4LDB4NzQwOERBMTcsMHhCQzlGOUFCQywweEU5NEI3RDhDLAorICAgIDB4RUM3QUVDM0EsMHhEQjg1MURGQSwweDYzMDk0MzY2LDB4QzQ2NEMzRDIsMHhFRjFDMTg0NywweDMyMTVEOTA4LAorICAgIDB4REQ0MzNCMzcsMHgyNEMyQkExNiwweDEyQTE0RDQzLDB4MkE2NUM0NTEsMHg1MDk0MDAwMiwweDEzM0FFNERELAorICAgIDB4NzFERkY4OUUsMHgxMDMxNEU1NSwweDgxQUM3N0Q2LDB4NUYxMTE5OUIsMHgwNDM1NTZGMSwweEQ3QTNDNzZCLAorICAgIDB4M0MxMTE4M0IsMHg1OTI0QTUwOSwweEYyOEZFNkVELDB4OTdGMUZCRkEsMHg5RUJBQkYyQywweDFFMTUzQzZFLAorICAgIDB4ODZFMzQ1NzAsMHhFQUU5NkZCMSwweDg2MEU1RTBBLDB4NUEzRTJBQjMsMHg3NzFGRTcxQywweDRFM0QwNkZBLAorICAgIDB4Mjk2NURDQjksMHg5OUU3MUQwRiwweDgwM0U4OUQ2LDB4NTI2NkM4MjUsMHgyRTRDQzk3OCwweDlDMTBCMzZBLAorICAgIDB4QzYxNTBFQkEsMHg5NEUyRUE3OCwweEE1RkMzQzUzLDB4MUUwQTJERjQsMHhGMkY3NEVBNywweDM2MUQyQjNELAorICAgIDB4MTkzOTI2MEYsMHgxOUMyNzk2MCwweDUyMjNBNzA4LDB4RjcxMzEyQjYsMHhFQkFERkU2RSwweEVBQzMxRjY2LAorICAgIDB4RTNCQzQ1OTUsMHhBNjdCQzg4MywweEIxN0YzN0QxLDB4MDE4Q0ZGMjgsMHhDMzMyRERFRiwweEJFNkM1QUE1LAorICAgIDB4NjU1ODIxODUsMHg2OEFCOTgwMiwweEVFQ0VBNTBGLDB4REIyRjk1M0IsMHgyQUVGN0RBRCwweDVCNkUyRjg0LAorICAgIDB4MTUyMUI2MjgsMHgyOTA3NjE3MCwweEVDREQ0Nzc1LDB4NjE5RjE1MTAsMHgxM0NDQTgzMCwweEVCNjFCRDk2LAorICAgIDB4MDMzNEZFMUUsMHhBQTAzNjNDRiwweEI1NzM1QzkwLDB4NEM3MEEyMzksMHhENTlFOUUwQiwweENCQUFERTE0LAorICAgIDB4RUVDQzg2QkMsMHg2MDYyMkNBNywweDlDQUI1Q0FCLDB4QjJGMzg0NkUsMHg2NDhCMUVBRiwweDE5QkRGMENBLAorICAgIDB4QTAyMzY5QjksMHg2NTVBQkI1MCwweDQwNjg1QTMyLDB4M0MyQUI0QjMsMHgzMTlFRTlENSwweEMwMjFCOEY3LAorICAgIDB4OUI1NDBCMTksMHg4NzVGQTA5OSwweDk1Rjc5OTdFLDB4NjIzRDdEQTgsMHhGODM3ODg5QSwweDk3RTMyRDc3LAorICAgIDB4MTFFRDkzNUYsMHgxNjY4MTI4MSwweDBFMzU4ODI5LDB4QzdFNjFGRDYsMHg5NkRFREZBMSwweDc4NThCQTk5LAorICAgIDB4NTdGNTg0QTUsMHgxQjIyNzI2MywweDlCODNDM0ZGLDB4MUFDMjQ2OTYsMHhDREIzMEFFQiwweDUzMkUzMDU0LAorICAgIDB4OEZEOTQ4RTQsMHg2REJDMzEyOCwweDU4RUJGMkVGLDB4MzRDNkZGRUEsMHhGRTI4RUQ2MSwweEVFN0MzQzczLAorICAgIDB4NUQ0QTE0RDksMHhFODY0QjdFMywweDQyMTA1RDE0LDB4MjAzRTEzRTAsMHg0NUVFRTJCNiwweEEzQUFBQkVBLAorICAgIDB4REI2QzRGMTUsMHhGQUNCNEZEMCwweEM3NDJGNDQyLDB4RUY2QUJCQjUsMHg2NTRGM0IxRCwweDQxQ0QyMTA1LAorICAgIDB4RDgxRTc5OUUsMHg4Njg1NERDNywweEU0NEI0NzZBLDB4M0Q4MTYyNTAsMHhDRjYyQTFGMiwweDVCOEQyNjQ2LAorICAgIDB4RkM4ODgzQTAsMHhDMUM3QjZBMywweDdGMTUyNEMzLDB4NjlDQjc0OTIsMHg0Nzg0OEEwQiwweDU2OTJCMjg1LAorICAgIDB4MDk1QkJGMDAsMHhBRDE5NDg5RCwweDE0NjJCMTc0LDB4MjM4MjBFMDAsMHg1ODQyOEQyQSwweDBDNTVGNUVBLAorICAgIDB4MURBREY0M0UsMHgyMzNGNzA2MSwweDMzNzJGMDkyLDB4OEQ5MzdFNDEsMHhENjVGRUNGMSwweDZDMjIzQkRCLAorICAgIDB4N0NERTM3NTksMHhDQkVFNzQ2MCwweDQwODVGMkE3LDB4Q0U3NzMyNkUsMHhBNjA3ODA4NCwweDE5Rjg1MDlFLAorICAgIDB4RThFRkQ4NTUsMHg2MUQ5OTczNSwweEE5NjlBN0FBLDB4QzUwQzA2QzIsMHg1QTA0QUJGQywweDgwMEJDQURDLAorICAgIDB4OUU0NDdBMkUsMHhDMzQ1MzQ4NCwweEZERDU2NzA1LDB4MEUxRTlFQzksMHhEQjczREJEMywweDEwNTU4OENELAorICAgIDB4Njc1RkRBNzksMHhFMzY3NDM0MCwweEM1QzQzNDY1LDB4NzEzRTM4RDgsMHgzRDI4Rjg5RSwweEYxNkRGRjIwLAorICAgIDB4MTUzRTIxRTcsMHg4RkIwM0Q0QSwweEU2RTM5RjJCLDB4REI4M0FERjcgfTsKKworc3RhdGljIGNvbnN0IHUzMiBrczJbMjU2XSA9IHsKKyAgICAweEU5M0Q1QTY4LDB4OTQ4MTQwRjcsMHhGNjRDMjYxQywweDk0NjkyOTM0LDB4NDExNTIwRjcsMHg3NjAyRDRGNywKKyAgICAweEJDRjQ2QjJFLDB4RDRBMjAwNjgsMHhENDA4MjQ3MSwweDMzMjBGNDZBLDB4NDNCN0Q0QjcsMHg1MDAwNjFBRiwKKyAgICAweDFFMzlGNjJFLDB4OTcyNDQ1NDYsMHgxNDIxNEY3NCwweEJGOEI4ODQwLDB4NEQ5NUZDMUQsMHg5NkI1OTFBRiwKKyAgICAweDcwRjREREQzLDB4NjZBMDJGNDUsMHhCRkJDMDlFQywweDAzQkQ5Nzg1LDB4N0ZBQzZERDAsMHgzMUNCODUwNCwKKyAgICAweDk2RUIyN0IzLDB4NTVGRDM5NDEsMHhEQTI1NDdFNiwweEFCQ0EwQTlBLDB4Mjg1MDc4MjUsMHg1MzA0MjlGNCwKKyAgICAweDBBMkM4NkRBLDB4RTlCNjZERkIsMHg2OERDMTQ2MiwweEQ3NDg2OTAwLDB4NjgwRUMwQTQsMHgyN0ExOERFRSwKKyAgICAweDRGM0ZGRUEyLDB4RTg4N0FEOEMsMHhCNThDRTAwNiwweDdBRjRENkI2LDB4QUFDRTFFN0MsMHhEMzM3NUZFQywKKyAgICAweENFNzhBMzk5LDB4NDA2QjJBNDIsMHgyMEZFOUUzNSwweEQ5RjM4NUI5LDB4RUUzOUQ3QUIsMHgzQjEyNEU4QiwKKyAgICAweDFEQzlGQUY3LDB4NEI2RDE4NTYsMHgyNkEzNjYzMSwweEVBRTM5N0IyLDB4M0E2RUZBNzQsMHhERDVCNDMzMiwKKyAgICAweDY4NDFFN0Y3LDB4Q0E3ODIwRkIsMHhGQjBBRjU0RSwweEQ4RkVCMzk3LDB4NDU0MDU2QUMsMHhCQTQ4OTUyNywKKyAgICAweDU1NTMzQTNBLDB4MjA4MzhEODcsMHhGRTZCQTlCNywweEQwOTY5NTRCLDB4NTVBODY3QkMsMHhBMTE1OUE1OCwKKyAgICAweENDQTkyOTYzLDB4OTlFMURCMzMsMHhBNjJBNEE1NiwweDNGMzEyNUY5LDB4NUVGNDdFMUMsMHg5MDI5MzE3QywKKyAgICAweEZERjhFODAyLDB4MDQyNzJGNzAsMHg4MEJCMTU1QywweDA1MjgyQ0UzLDB4OTVDMTE1NDgsMHhFNEM2NkQyMiwKKyAgICAweDQ4QzExMzNGLDB4QzcwRjg2REMsMHgwN0Y5QzlFRSwweDQxMDQxRjBGLDB4NDA0Nzc5QTQsMHg1RDg4NkUxNywKKyAgICAweDMyNUY1MUVCLDB4RDU5QkMwRDEsMHhGMkJDQzE4RiwweDQxMTEzNTY0LDB4MjU3Qjc4MzQsMHg2MDJBOUM2MCwKKyAgICAweERGRjhFOEEzLDB4MUY2MzZDMUIsMHgwRTEyQjRDMiwweDAyRTEzMjlFLDB4QUY2NjRGRDEsMHhDQUQxODExNSwKKyAgICAweDZCMjM5NUUwLDB4MzMzRTkyRTEsMHgzQjI0MEI2MiwweEVFQkVCOTIyLDB4ODVCMkEyMEUsMHhFNkJBMEQ5OSwKKyAgICAweERFNzIwQzhDLDB4MkRBMkY3MjgsMHhEMDEyNzg0NSwweDk1Qjc5NEZELDB4NjQ3RDA4NjIsMHhFN0NDRjVGMCwKKyAgICAweDU0NDlBMzZGLDB4ODc3RDQ4RkEsMHhDMzlERkQyNywweEYzM0U4RDFFLDB4MEE0NzYzNDEsMHg5OTJFRkY3NCwKKyAgICAweDNBNkY2RUFCLDB4RjRGOEZEMzcsMHhBODEyREM2MCwweEExRUJEREY4LDB4OTkxQkUxNEMsMHhEQjZFNkIwRCwKKyAgICAweEM2N0I1NTEwLDB4NkQ2NzJDMzcsMHgyNzY1RDQzQiwweERDRDBFODA0LDB4RjEyOTBEQzcsMHhDQzAwRkZBMywKKyAgICAweEI1MzkwRjkyLDB4NjkwRkVEMEIsMHg2NjdCOUZGQiwweENFREI3RDlDLDB4QTA5MUNGMEIsMHhEOTE1NUVBMywKKyAgICAweEJCMTMyRjg4LDB4NTE1QkFEMjQsMHg3Qjk0NzlCRiwweDc2M0JENkVCLDB4MzczOTJFQjMsMHhDQzExNTk3OSwKKyAgICAweDgwMjZFMjk3LDB4RjQyRTMxMkQsMHg2ODQyQURBNywweEM2NkEyQjNCLDB4MTI3NTRDQ0MsMHg3ODJFRjExQywKKyAgICAweDZBMTI0MjM3LDB4Qjc5MjUxRTcsMHgwNkExQkJFNiwweDRCRkI2MzUwLDB4MUE2QjEwMTgsMHgxMUNBRURGQSwKKyAgICAweDNEMjVCREQ4LDB4RTJFMUMzQzksMHg0NDQyMTY1OSwweDBBMTIxMzg2LDB4RDkwQ0VDNkUsMHhENUFCRUEyQSwKKyAgICAweDY0QUY2NzRFLDB4REE4NkE4NUYsMHhCRUJGRTk4OCwweDY0RTRDM0ZFLDB4OURCQzgwNTcsMHhGMEY3QzA4NiwKKyAgICAweDYwNzg3QkY4LDB4NjAwMzYwNEQsMHhEMUZEODM0NiwweEY2MzgxRkIwLDB4Nzc0NUFFMDQsMHhENzM2RkNDQywKKyAgICAweDgzNDI2QjMzLDB4RjAxRUFCNzEsMHhCMDgwNDE4NywweDNDMDA1RTVGLDB4NzdBMDU3QkUsMHhCREU4QUUyNCwKKyAgICAweDU1NDY0Mjk5LDB4QkY1ODJFNjEsMHg0RTU4RjQ4RiwweEYyRERGREEyLDB4RjQ3NEVGMzgsMHg4Nzg5QkRDMiwKKyAgICAweDUzNjZGOUMzLDB4QzhCMzhFNzQsMHhCNDc1RjI1NSwweDQ2RkNEOUI5LDB4N0FFQjI2NjEsMHg4QjFEREY4NCwKKyAgICAweDg0NkEwRTc5LDB4OTE1Rjk1RTIsMHg0NjZFNTk4RSwweDIwQjQ1NzcwLDB4OENENTU1OTEsMHhDOTAyREU0QywKKyAgICAweEI5MEJBQ0UxLDB4QkI4MjA1RDAsMHgxMUE4NjI0OCwweDc1NzRBOTlFLDB4Qjc3RjE5QjYsMHhFMEE5REMwOSwKKyAgICAweDY2MkQwOUExLDB4QzQzMjQ2MzMsMHhFODVBMUYwMiwweDA5RjBCRThDLDB4NEE5OUEwMjUsMHgxRDZFRkUxMCwKKyAgICAweDFBQjkzRDFELDB4MEJBNUE0REYsMHhBMTg2RjIwRiwweDI4NjhGMTY5LDB4RENCN0RBODMsMHg1NzM5MDZGRSwKKyAgICAweEExRTJDRTlCLDB4NEZDRDdGNTIsMHg1MDExNUUwMSwweEE3MDY4M0ZBLDB4QTAwMkI1QzQsMHgwREU2RDAyNywKKyAgICAweDlBRjg4QzI3LDB4NzczRjg2NDEsMHhDMzYwNEMwNiwweDYxQTgwNkI1LDB4RjAxNzdBMjgsMHhDMEY1ODZFMCwKKyAgICAweDAwNjA1OEFBLDB4MzBEQzdENjIsMHgxMUU2OUVENywweDIzMzhFQTYzLDB4NTNDMkREOTQsMHhDMkMyMTYzNCwKKyAgICAweEJCQ0JFRTU2LDB4OTBCQ0I2REUsMHhFQkZDN0RBMSwweENFNTkxRDc2LDB4NkYwNUU0MDksMHg0QjdDMDE4OCwKKyAgICAweDM5NzIwQTNELDB4N0M5MjdDMjQsMHg4NkUzNzI1RiwweDcyNEQ5REI5LDB4MUFDMTVCQjQsMHhEMzlFQjhGQywKKyAgICAweEVENTQ1NTc4LDB4MDhGQ0E1QjUsMHhEODNEN0NEMywweDREQUQwRkM0LDB4MUU1MEVGNUUsMHhCMTYxRTZGOCwKKyAgICAweEEyODUxNEQ5LDB4NkM1MTEzM0MsMHg2RkQ1QzdFNywweDU2RTE0RUM0LDB4MzYyQUJGQ0UsMHhEREM2QzgzNywKKyAgICAweEQ3OUEzMjM0LDB4OTI2MzgyMTIsMHg2NzBFRkE4RSwweDQwNjAwMEUwIH07CisKK3N0YXRpYyBjb25zdCB1MzIga3MzWzI1Nl0gPSB7CisgICAgMHgzQTM5Q0UzNywweEQzRkFGNUNGLDB4QUJDMjc3MzcsMHg1QUM1MkQxQiwweDVDQjA2NzlFLDB4NEZBMzM3NDIsCisgICAgMHhEMzgyMjc0MCwweDk5QkM5QkJFLDB4RDUxMThFOUQsMHhCRjBGNzMxNSwweEQ2MkQxQzdFLDB4QzcwMEM0N0IsCisgICAgMHhCNzhDMUI2QiwweDIxQTE5MDQ1LDB4QjI2RUIxQkUsMHg2QTM2NkVCNCwweDU3NDhBQjJGLDB4QkM5NDZFNzksCisgICAgMHhDNkEzNzZEMiwweDY1NDlDMkM4LDB4NTMwRkY4RUUsMHg0NjhEREU3RCwweEQ1NzMwQTFELDB4NENEMDREQzYsCisgICAgMHgyOTM5QkJEQiwweEE5QkE0NjUwLDB4QUM5NTI2RTgsMHhCRTVFRTMwNCwweEExRkFENUYwLDB4NkEyRDUxOUEsCisgICAgMHg2M0VGOENFMiwweDlBODZFRTIyLDB4QzA4OUMyQjgsMHg0MzI0MkVGNiwweEE1MUUwM0FBLDB4OUNGMkQwQTQsCisgICAgMHg4M0MwNjFCQSwweDlCRTk2QTRELDB4OEZFNTE1NTAsMHhCQTY0NUJENiwweDI4MjZBMkY5LDB4QTczQTNBRTEsCisgICAgMHg0QkE5OTU4NiwweEVGNTU2MkU5LDB4QzcyRkVGRDMsMHhGNzUyRjdEQSwweDNGMDQ2RjY5LDB4NzdGQTBBNTksCisgICAgMHg4MEU0QTkxNSwweDg3QjA4NjAxLDB4OUIwOUU2QUQsMHgzQjNFRTU5MywweEU5OTBGRDVBLDB4OUUzNEQ3OTcsCisgICAgMHgyQ0YwQjdEOSwweDAyMkI4QjUxLDB4OTZENUFDM0EsMHgwMTdEQTY3RCwweEQxQ0YzRUQ2LDB4N0M3RDJEMjgsCisgICAgMHgxRjlGMjVDRiwweEFERjJCODlCLDB4NUFENkI0NzIsMHg1QTg4RjU0QywweEUwMjlBQzcxLDB4RTAxOUE1RTYsCisgICAgMHg0N0IwQUNGRCwweEVEOTNGQTlCLDB4RThEM0M0OEQsMHgyODNCNTdDQywweEY4RDU2NjI5LDB4NzkxMzJFMjgsCisgICAgMHg3ODVGMDE5MSwweEVENzU2MDU1LDB4Rjc5NjBFNDQsMHhFM0QzNUU4QywweDE1MDU2REQ0LDB4ODhGNDZEQkEsCisgICAgMHgwM0ExNjEyNSwweDA1NjRGMEJELDB4QzNFQjlFMTUsMHgzQzkwNTdBMiwweDk3MjcxQUVDLDB4QTkzQTA3MkEsCisgICAgMHgxQjNGNkQ5QiwweDFFNjMyMUY1LDB4RjU5QzY2RkIsMHgyNkRDRjMxOSwweDc1MzNEOTI4LDB4QjE1NUZERjUsCisgICAgMHgwMzU2MzQ4MiwweDhBQkEzQ0JCLDB4Mjg1MTc3MTEsMHhDMjBBRDlGOCwweEFCQ0M1MTY3LDB4Q0NBRDkyNUYsCisgICAgMHg0REU4MTc1MSwweDM4MzBEQzhFLDB4Mzc5RDU4NjIsMHg5MzIwRjk5MSwweEVBN0E5MEMyLDB4RkIzRTdCQ0UsCisgICAgMHg1MTIxQ0U2NCwweDc3NEZCRTMyLDB4QThCNkUzN0UsMHhDMzI5M0Q0NiwweDQ4REU1MzY5LDB4NjQxM0U2ODAsCisgICAgMHhBMkFFMDgxMCwweERENkRCMjI0LDB4Njk4NTJERkQsMHgwOTA3MjE2NiwweEIzOUE0NjBBLDB4NjQ0NUMwREQsCisgICAgMHg1ODZDREVDRiwweDFDMjBDOEFFLDB4NUJCRUY3REQsMHgxQjU4OEQ0MCwweENDRDIwMTdGLDB4NkJCNEUzQkIsCisgICAgMHhEREEyNkE3RSwweDNBNTlGRjQ1LDB4M0UzNTBBNDQsMHhCQ0I0Q0RENSwweDcyRUFDRUE4LDB4RkE2NDg0QkIsCisgICAgMHg4RDY2MTJBRSwweEJGM0M2RjQ3LDB4RDI5QkU0NjMsMHg1NDJGNUQ5RSwweEFFQzI3NzFCLDB4RjY0RTYzNzAsCisgICAgMHg3NDBFMEQ4RCwweEU3NUIxMzU3LDB4Rjg3MjE2NzEsMHhBRjUzN0Q1RCwweDQwNDBDQjA4LDB4NEVCNEUyQ0MsCisgICAgMHgzNEQyNDY2QSwweDAxMTVBRjg0LDB4RTFCMDA0MjgsMHg5NTk4M0ExRCwweDA2Qjg5RkI0LDB4Q0U2RUEwNDgsCisgICAgMHg2RjNGM0I4MiwweDM1MjBBQjgyLDB4MDExQTFENEIsMHgyNzcyMjdGOCwweDYxMTU2MEIxLDB4RTc5MzNGREMsCisgICAgMHhCQjNBNzkyQiwweDM0NDUyNUJELDB4QTA4ODM5RTEsMHg1MUNFNzk0QiwweDJGMzJDOUI3LDB4QTAxRkJBQzksCisgICAgMHhFMDFDQzg3RSwweEJDQzdEMUY2LDB4Q0YwMTExQzMsMHhBMUU4QUFDNywweDFBOTA4NzQ5LDB4RDQ0RkJEOUEsCisgICAgMHhEMERBREVDQiwweEQ1MEFEQTM4LDB4MDMzOUMzMkEsMHhDNjkxMzY2NywweDhERjkzMTdDLDB4RTBCMTJCNEYsCisgICAgMHhGNzlFNTlCNywweDQzRjVCQjNBLDB4RjJENTE5RkYsMHgyN0Q5NDU5QywweEJGOTcyMjJDLDB4MTVFNkZDMkEsCisgICAgMHgwRjkxRkM3MSwweDlCOTQxNTI1LDB4RkFFNTkzNjEsMHhDRUI2OUNFQiwweEMyQTg2NDU5LDB4MTJCQUE4RDEsCisgICAgMHhCNkMxMDc1RSwweEUzMDU2QTBDLDB4MTBEMjUwNjUsMHhDQjAzQTQ0MiwweEUwRUM2RTBFLDB4MTY5OERCM0IsCisgICAgMHg0Qzk4QTBCRSwweDMyNzhFOTY0LDB4OUYxRjk1MzIsMHhFMEQzOTJERiwweEQzQTAzNDJCLDB4ODk3MUYyMUUsCisgICAgMHgxQjBBNzQ0MSwweDRCQTMzNDhDLDB4QzVCRTcxMjAsMHhDMzc2MzJEOCwweERGMzU5RjhELDB4OUI5OTJGMkUsCisgICAgMHhFNjBCNkY0NywweDBGRTNGMTFELDB4RTU0Q0RBNTQsMHgxRURBRDg5MSwweENFNjI3OUNGLDB4Q0QzRTdFNkYsCisgICAgMHgxNjE4QjE2NiwweEZEMkMxRDA1LDB4ODQ4RkQyQzUsMHhGNkZCMjI5OSwweEY1MjNGMzU3LDB4QTYzMjc2MjMsCisgICAgMHg5M0E4MzUzMSwweDU2Q0NDRDAyLDB4QUNGMDgxNjIsMHg1QTc1RUJCNSwweDZFMTYzNjk3LDB4ODhEMjczQ0MsCisgICAgMHhERTk2NjI5MiwweDgxQjk0OUQwLDB4NEM1MDkwMUIsMHg3MUM2NTYxNCwweEU2QzZDN0JELDB4MzI3QTE0MEEsCisgICAgMHg0NUUxRDAwNiwweEMzRjI3QjlBLDB4QzlBQTUzRkQsMHg2MkE4MEYwMCwweEJCMjVCRkUyLDB4MzVCREQyRjYsCisgICAgMHg3MTEyNjkwNSwweEIyMDQwMjIyLDB4QjZDQkNGN0MsMHhDRDc2OUMyQiwweDUzMTEzRUMwLDB4MTY0MEUzRDMsCisgICAgMHgzOEFCQkQ2MCwweDI1NDdBREYwLDB4QkEzODIwOUMsMHhGNzQ2Q0U3NiwweDc3QUZBMUM1LDB4MjA3NTYwNjAsCisgICAgMHg4NUNCRkU0RSwweDhBRTg4REQ4LDB4N0FBQUY5QjAsMHg0Q0Y5QUE3RSwweDE5NDhDMjVDLDB4MDJGQjhBOEMsCisgICAgMHgwMUMzNkFFNCwweEQ2RUJFMUY5LDB4OTBENEY4NjksMHhBNjVDREVBMCwweDNGMDkyNTJELDB4QzIwOEU2OUYsCisgICAgMHhCNzRFNjEzMiwweENFNzdFMjVCLDB4NTc4RkRGRTMsMHgzQUMzNzJFNiB9OworCitzdGF0aWMgY29uc3QgdTMyIHBzW0JMT1dGSVNIX1JPVU5EUysyXSA9IHsKKyAgICAweDI0M0Y2QTg4LDB4ODVBMzA4RDMsMHgxMzE5OEEyRSwweDAzNzA3MzQ0LDB4QTQwOTM4MjIsMHgyOTlGMzFEMCwKKyAgICAweDA4MkVGQTk4LDB4RUM0RTZDODksMHg0NTI4MjFFNiwweDM4RDAxMzc3LDB4QkU1NDY2Q0YsMHgzNEU5MEM2QywKKyAgICAweEMwQUMyOUI3LDB4Qzk3QzUwREQsMHgzRjg0RDVCNSwweEI1NDcwOTE3LDB4OTIxNkQ1RDksMHg4OTc5RkIxQiB9OworCisKKworI2lmIEJMT1dGSVNIX1JPVU5EUyAhPSAxNgorc3RhdGljIGlubGluZSB1MzIKK2Z1bmN0aW9uX0YoIEJMT1dGSVNIX2NvbnRleHQgKmJjLCB1MzIgeCApCit7CisgICAgdTE2IGEsIGIsIGMsIGQ7CisKKyNpZmRlZiBXT1JEU19CSUdFTkRJQU4KKyAgICBhID0gKChieXRlKikmeClbMF07CisgICAgYiA9ICgoYnl0ZSopJngpWzFdOworICAgIGMgPSAoKGJ5dGUqKSZ4KVsyXTsKKyAgICBkID0gKChieXRlKikmeClbM107CisjZWxzZQorICAgIGEgPSAoKGJ5dGUqKSZ4KVszXTsKKyAgICBiID0gKChieXRlKikmeClbMl07CisgICAgYyA9ICgoYnl0ZSopJngpWzFdOworICAgIGQgPSAoKGJ5dGUqKSZ4KVswXTsKKyNlbmRpZgorCisgICAgcmV0dXJuICgoYmMtPnMwW2FdICsgYmMtPnMxW2JdKSBeIGJjLT5zMltjXSApICsgYmMtPnMzW2RdOworfQorI2VuZGlmCisKKyNpZmRlZiBXT1JEU19CSUdFTkRJQU4KKyNkZWZpbmUgRih4KSAoKCggczBbKChieXRlKikmeClbMF1dICsgczFbKChieXRlKikmeClbMV1dKQkgXAorCQkgICBeIHMyWygoYnl0ZSopJngpWzJdXSkgKyBzM1soKGJ5dGUqKSZ4KVszXV0gKQorI2Vsc2UKKyNkZWZpbmUgRih4KSAoKCggczBbKChieXRlKikmeClbM11dICsgczFbKChieXRlKikmeClbMl1dKQkgXAorCQkgICBeIHMyWygoYnl0ZSopJngpWzFdXSkgKyBzM1soKGJ5dGUqKSZ4KVswXV0gKQorI2VuZGlmCisjZGVmaW5lIFIobCxyLGkpICBkbyB7IGwgXj0gcFtpXTsgciBePSBGKGwpOyB9IHdoaWxlKDApCisKKworc3RhdGljIHZvaWQKK2RvX2VuY3J5cHQgKCBCTE9XRklTSF9jb250ZXh0ICpiYywgdTMyICpyZXRfeGwsIHUzMiAqcmV0X3hyICkKK3sKKyNpZiBCTE9XRklTSF9ST1VORFMgPT0gMTYKKyAgdTMyIHhsLCB4ciwgKnMwLCAqczEsICpzMiwgKnMzLCAqcDsKKworICB4bCA9ICpyZXRfeGw7CisgIHhyID0gKnJldF94cjsKKyAgcCA9IGJjLT5wOworICBzMCA9IGJjLT5zMDsKKyAgczEgPSBiYy0+czE7CisgIHMyID0gYmMtPnMyOworICBzMyA9IGJjLT5zMzsKKworICBSKCB4bCwgeHIsCTApOworICBSKCB4ciwgeGwsCTEpOworICBSKCB4bCwgeHIsCTIpOworICBSKCB4ciwgeGwsCTMpOworICBSKCB4bCwgeHIsCTQpOworICBSKCB4ciwgeGwsCTUpOworICBSKCB4bCwgeHIsCTYpOworICBSKCB4ciwgeGwsCTcpOworICBSKCB4bCwgeHIsCTgpOworICBSKCB4ciwgeGwsCTkpOworICBSKCB4bCwgeHIsIDEwKTsKKyAgUiggeHIsIHhsLCAxMSk7CisgIFIoIHhsLCB4ciwgMTIpOworICBSKCB4ciwgeGwsIDEzKTsKKyAgUiggeGwsIHhyLCAxNCk7CisgIFIoIHhyLCB4bCwgMTUpOworCisgIHhsIF49IHBbQkxPV0ZJU0hfUk9VTkRTXTsKKyAgeHIgXj0gcFtCTE9XRklTSF9ST1VORFMrMV07CisKKyAgKnJldF94bCA9IHhyOworICAqcmV0X3hyID0geGw7CisKKyNlbHNlCisgIHUzMiB4bCwgeHIsIHRlbXAsICpwOworICBpbnQgaTsKKworICB4bCA9ICpyZXRfeGw7CisgIHhyID0gKnJldF94cjsKKyAgcCA9IGJjLT5wOworCisgIGZvcihpPTA7IGkgPCBCTE9XRklTSF9ST1VORFM7IGkrKyApCisgICAgeworICAgICAgeGwgXj0gcFtpXTsKKyAgICAgIHhyIF49IGZ1bmN0aW9uX0YoYmMsIHhsKTsKKyAgICAgIHRlbXAgPSB4bDsKKyAgICAgIHhsID0geHI7CisgICAgICB4ciA9IHRlbXA7CisgICAgfQorICB0ZW1wID0geGw7CisgIHhsID0geHI7CisgIHhyID0gdGVtcDsKKworICB4ciBePSBwW0JMT1dGSVNIX1JPVU5EU107CisgIHhsIF49IHBbQkxPV0ZJU0hfUk9VTkRTKzFdOworCisgICpyZXRfeGwgPSB4bDsKKyAgKnJldF94ciA9IHhyOworI2VuZGlmCit9CisKKworc3RhdGljIHZvaWQKK2RlY3J5cHQgKCBCTE9XRklTSF9jb250ZXh0ICpiYywgdTMyICpyZXRfeGwsIHUzMiAqcmV0X3hyICkKK3sKKyNpZiBCTE9XRklTSF9ST1VORFMgPT0gMTYKKyAgdTMyIHhsLCB4ciwgKnMwLCAqczEsICpzMiwgKnMzLCAqcDsKKworICB4bCA9ICpyZXRfeGw7CisgIHhyID0gKnJldF94cjsKKyAgcCA9IGJjLT5wOworICBzMCA9IGJjLT5zMDsKKyAgczEgPSBiYy0+czE7CisgIHMyID0gYmMtPnMyOworICBzMyA9IGJjLT5zMzsKKworICBSKCB4bCwgeHIsIDE3KTsKKyAgUiggeHIsIHhsLCAxNik7CisgIFIoIHhsLCB4ciwgMTUpOworICBSKCB4ciwgeGwsIDE0KTsKKyAgUiggeGwsIHhyLCAxMyk7CisgIFIoIHhyLCB4bCwgMTIpOworICBSKCB4bCwgeHIsIDExKTsKKyAgUiggeHIsIHhsLCAxMCk7CisgIFIoIHhsLCB4ciwJOSk7CisgIFIoIHhyLCB4bCwJOCk7CisgIFIoIHhsLCB4ciwJNyk7CisgIFIoIHhyLCB4bCwJNik7CisgIFIoIHhsLCB4ciwJNSk7CisgIFIoIHhyLCB4bCwJNCk7CisgIFIoIHhsLCB4ciwJMyk7CisgIFIoIHhyLCB4bCwJMik7CisKKyAgeGwgXj0gcFsxXTsKKyAgeHIgXj0gcFswXTsKKworICAqcmV0X3hsID0geHI7CisgICpyZXRfeHIgPSB4bDsKKworI2Vsc2UKKyAgdTMyIHhsLCB4ciwgdGVtcCwgKnA7CisgIGludCBpOworCisgIHhsID0gKnJldF94bDsKKyAgeHIgPSAqcmV0X3hyOworICBwID0gYmMtPnA7CisKKyAgZm9yIChpPUJMT1dGSVNIX1JPVU5EUysxOyBpID4gMTsgaS0tICkKKyAgICB7CisgICAgICB4bCBePSBwW2ldOworICAgICAgeHIgXj0gZnVuY3Rpb25fRihiYywgeGwpOworICAgICAgdGVtcCA9IHhsOworICAgICAgeGwgPSB4cjsKKyAgICAgIHhyID0gdGVtcDsKKyAgICB9CisKKyAgdGVtcCA9IHhsOworICB4bCA9IHhyOworICB4ciA9IHRlbXA7CisKKyAgeHIgXj0gcFsxXTsKKyAgeGwgXj0gcFswXTsKKworICAqcmV0X3hsID0geGw7CisgICpyZXRfeHIgPSB4cjsKKyNlbmRpZgorfQorCisjdW5kZWYgRgorI3VuZGVmIFIKKworc3RhdGljIHZvaWQKK2RvX2VuY3J5cHRfYmxvY2sgKCBCTE9XRklTSF9jb250ZXh0ICpiYywgYnl0ZSAqb3V0YnVmLCBjb25zdCBieXRlICppbmJ1ZiApCit7CisgIHUzMiBkMSwgZDI7CisKKyAgZDEgPSBpbmJ1ZlswXSA8PCAyNCB8IGluYnVmWzFdIDw8IDE2IHwgaW5idWZbMl0gPDwgOCB8IGluYnVmWzNdOworICBkMiA9IGluYnVmWzRdIDw8IDI0IHwgaW5idWZbNV0gPDwgMTYgfCBpbmJ1Zls2XSA8PCA4IHwgaW5idWZbN107CisgIGRvX2VuY3J5cHQoIGJjLCAmZDEsICZkMiApOworICBvdXRidWZbMF0gPSAoZDEgPj4gMjQpICYgMHhmZjsKKyAgb3V0YnVmWzFdID0gKGQxID4+IDE2KSAmIDB4ZmY7CisgIG91dGJ1ZlsyXSA9IChkMSA+Pgk4KSAmIDB4ZmY7CisgIG91dGJ1ZlszXSA9ICBkMQkgICAmIDB4ZmY7CisgIG91dGJ1Zls0XSA9IChkMiA+PiAyNCkgJiAweGZmOworICBvdXRidWZbNV0gPSAoZDIgPj4gMTYpICYgMHhmZjsKKyAgb3V0YnVmWzZdID0gKGQyID4+CTgpICYgMHhmZjsKKyAgb3V0YnVmWzddID0gIGQyCSAgICYgMHhmZjsKK30KKworc3RhdGljIHZvaWQKK2VuY3J5cHRfYmxvY2sgKHZvaWQgKmNvbnRleHQsIGJ5dGUgKm91dGJ1ZiwgY29uc3QgYnl0ZSAqaW5idWYpCit7CisgIEJMT1dGSVNIX2NvbnRleHQgKmJjID0gKEJMT1dGSVNIX2NvbnRleHQgKikgY29udGV4dDsKKyAgZG9fZW5jcnlwdF9ibG9jayAoYmMsIG91dGJ1ZiwgaW5idWYpOworICBfZ2NyeV9idXJuX3N0YWNrICg2NCk7Cit9CisKKworc3RhdGljIHZvaWQKK2RvX2RlY3J5cHRfYmxvY2sgKEJMT1dGSVNIX2NvbnRleHQgKmJjLCBieXRlICpvdXRidWYsIGNvbnN0IGJ5dGUgKmluYnVmKQoreworICB1MzIgZDEsIGQyOworCisgIGQxID0gaW5idWZbMF0gPDwgMjQgfCBpbmJ1ZlsxXSA8PCAxNiB8IGluYnVmWzJdIDw8IDggfCBpbmJ1ZlszXTsKKyAgZDIgPSBpbmJ1Zls0XSA8PCAyNCB8IGluYnVmWzVdIDw8IDE2IHwgaW5idWZbNl0gPDwgOCB8IGluYnVmWzddOworICBkZWNyeXB0KCBiYywgJmQxLCAmZDIgKTsKKyAgb3V0YnVmWzBdID0gKGQxID4+IDI0KSAmIDB4ZmY7CisgIG91dGJ1ZlsxXSA9IChkMSA+PiAxNikgJiAweGZmOworICBvdXRidWZbMl0gPSAoZDEgPj4JOCkgJiAweGZmOworICBvdXRidWZbM10gPSAgZDEJICAgJiAweGZmOworICBvdXRidWZbNF0gPSAoZDIgPj4gMjQpICYgMHhmZjsKKyAgb3V0YnVmWzVdID0gKGQyID4+IDE2KSAmIDB4ZmY7CisgIG91dGJ1Zls2XSA9IChkMiA+Pgk4KSAmIDB4ZmY7CisgIG91dGJ1Zls3XSA9ICBkMgkgICAmIDB4ZmY7Cit9CisKK3N0YXRpYyB2b2lkCitkZWNyeXB0X2Jsb2NrICh2b2lkICpjb250ZXh0LCBieXRlICpvdXRidWYsIGNvbnN0IGJ5dGUgKmluYnVmKQoreworICBCTE9XRklTSF9jb250ZXh0ICpiYyA9IChCTE9XRklTSF9jb250ZXh0ICopIGNvbnRleHQ7CisgIGRvX2RlY3J5cHRfYmxvY2sgKGJjLCBvdXRidWYsIGluYnVmKTsKKyAgX2djcnlfYnVybl9zdGFjayAoNjQpOworfQorCisKK3N0YXRpYyBjb25zdCBjaGFyKgorc2VsZnRlc3Qodm9pZCkKK3sKKyAgQkxPV0ZJU0hfY29udGV4dCBjOworICBieXRlIHBsYWluW10gPSAiQkxPV0ZJU0giOworICBieXRlIGJ1ZmZlcls4XTsKKyAgYnl0ZSBwbGFpbjNbXSA9IHsgMHhGRSwgMHhEQywgMHhCQSwgMHg5OCwgMHg3NiwgMHg1NCwgMHgzMiwgMHgxMCB9OworICBieXRlIGtleTNbXSA9IHsgMHg0MSwgMHg3OSwgMHg2RSwgMHhBMCwgMHg1MiwgMHg2MSwgMHg2RSwgMHhFNCB9OworICBieXRlIGNpcGhlcjNbXSA9IHsgMHhFMSwgMHgxMywgMHhGNCwgMHgxMCwgMHgyQywgMHhGQywgMHhDRSwgMHg0MyB9OworCisgIGJmX3NldGtleSggKHZvaWQgKikgJmMsCisgICAgICAgICAgICAgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKSJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIsIDI2ICk7CisgIGVuY3J5cHRfYmxvY2soICh2b2lkICopICZjLCBidWZmZXIsIHBsYWluICk7CisgIGlmKCBtZW1jbXAoIGJ1ZmZlciwgIlx4MzJceDRFXHhEMFx4RkVceEY0XHgxM1x4QTJceDAzIiwgOCApICkKKyAgICByZXR1cm4gIkJsb3dmaXNoIHNlbGZ0ZXN0IGZhaWxlZCAoMSkuIjsKKyAgZGVjcnlwdF9ibG9jayggKHZvaWQgKikgJmMsIGJ1ZmZlciwgYnVmZmVyICk7CisgIGlmKCBtZW1jbXAoIGJ1ZmZlciwgcGxhaW4sIDggKSApCisgICAgcmV0dXJuICJCbG93ZmlzaCBzZWxmdGVzdCBmYWlsZWQgKDIpLiI7CisKKyAgYmZfc2V0a2V5KCAodm9pZCAqKSAmYywga2V5MywgOCApOworICBlbmNyeXB0X2Jsb2NrKCAodm9pZCAqKSAmYywgYnVmZmVyLCBwbGFpbjMgKTsKKyAgaWYoIG1lbWNtcCggYnVmZmVyLCBjaXBoZXIzLCA4ICkgKQorICAgIHJldHVybiAiQmxvd2Zpc2ggc2VsZnRlc3QgZmFpbGVkICgzKS4iOworICBkZWNyeXB0X2Jsb2NrKCAodm9pZCAqKSAmYywgYnVmZmVyLCBidWZmZXIgKTsKKyAgaWYoIG1lbWNtcCggYnVmZmVyLCBwbGFpbjMsIDggKSApCisgICAgcmV0dXJuICJCbG93ZmlzaCBzZWxmdGVzdCBmYWlsZWQgKDQpLiI7CisgIHJldHVybiBOVUxMOworfQorCisKKworc3RhdGljIGdjcnlfZXJyX2NvZGVfdAorZG9fYmZfc2V0a2V5IChCTE9XRklTSF9jb250ZXh0ICpjLCBjb25zdCBieXRlICprZXksIHVuc2lnbmVkIGtleWxlbikKK3sKKyAgaW50IGksIGo7CisgIHUzMiBkYXRhLCBkYXRhbCwgZGF0YXI7CisgIHN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQ7CisgIHN0YXRpYyBjb25zdCBjaGFyICpzZWxmdGVzdF9mYWlsZWQ7CisKKyAgaWYoICFpbml0aWFsaXplZCApIAorICAgIHsKKyAgICAgIGluaXRpYWxpemVkID0gMTsKKyAgICAgIHNlbGZ0ZXN0X2ZhaWxlZCA9IHNlbGZ0ZXN0KCk7CisgICAgICBpZiggc2VsZnRlc3RfZmFpbGVkICkKKyAgICAgICAgbG9nX2Vycm9yICgiJXNcbiIsIHNlbGZ0ZXN0X2ZhaWxlZCApOworICAgIH0KKyAgaWYoIHNlbGZ0ZXN0X2ZhaWxlZCApCisgICAgcmV0dXJuIEdQR19FUlJfU0VMRlRFU1RfRkFJTEVEOworCisgIGZvcihpPTA7IGkgPCBCTE9XRklTSF9ST1VORFMrMjsgaSsrICkKKyAgICBjLT5wW2ldID0gcHNbaV07CisgIGZvcihpPTA7IGkgPCAyNTY7IGkrKyApIAorICAgIHsKKyAgICAgIGMtPnMwW2ldID0ga3MwW2ldOworICAgICAgYy0+czFbaV0gPSBrczFbaV07CisgICAgICBjLT5zMltpXSA9IGtzMltpXTsKKyAgICAgIGMtPnMzW2ldID0ga3MzW2ldOworICAgIH0KKworICBmb3IoaT1qPTA7IGkgPCBCTE9XRklTSF9ST1VORFMrMjsgaSsrICkgCisgICAgeworI2lmZGVmIFdPUkRTX0JJR0VORElBTgorICAgICAgKChieXRlKikmZGF0YSlbMF0gPSBrZXlbal07CisgICAgICAoKGJ5dGUqKSZkYXRhKVsxXSA9IGtleVsoaisxKSVrZXlsZW5dOworICAgICAgKChieXRlKikmZGF0YSlbMl0gPSBrZXlbKGorMikla2V5bGVuXTsKKyAgICAgICgoYnl0ZSopJmRhdGEpWzNdID0ga2V5WyhqKzMpJWtleWxlbl07CisjZWxzZQorICAgICAgKChieXRlKikmZGF0YSlbM10gPSBrZXlbal07CisgICAgICAoKGJ5dGUqKSZkYXRhKVsyXSA9IGtleVsoaisxKSVrZXlsZW5dOworICAgICAgKChieXRlKikmZGF0YSlbMV0gPSBrZXlbKGorMikla2V5bGVuXTsKKyAgICAgICgoYnl0ZSopJmRhdGEpWzBdID0ga2V5WyhqKzMpJWtleWxlbl07CisjZW5kaWYKKyAgICAgIGMtPnBbaV0gXj0gZGF0YTsKKyAgICAgIGogPSAoais0KSAlIGtleWxlbjsKKyAgICB9CisKKyAgZGF0YWwgPSBkYXRhciA9IDA7CisgIGZvcihpPTA7IGkgPCBCTE9XRklTSF9ST1VORFMrMjsgaSArPSAyICkKKyAgICB7CisgICAgICBkb19lbmNyeXB0KCBjLCAmZGF0YWwsICZkYXRhciApOworICAgICAgYy0+cFtpXSAgID0gZGF0YWw7CisgICAgICBjLT5wW2krMV0gPSBkYXRhcjsKKyAgICB9CisgIGZvcihpPTA7IGkgPCAyNTY7IGkgKz0gMiApCQorICAgIHsKKyAgICAgIGRvX2VuY3J5cHQoIGMsICZkYXRhbCwgJmRhdGFyICk7CisgICAgICBjLT5zMFtpXSAgID0gZGF0YWw7CisgICAgICBjLT5zMFtpKzFdID0gZGF0YXI7CisgICAgfQorICBmb3IoaT0wOyBpIDwgMjU2OyBpICs9IDIgKQorICAgIHsKKyAgICAgIGRvX2VuY3J5cHQoIGMsICZkYXRhbCwgJmRhdGFyICk7CisgICAgICBjLT5zMVtpXSAgID0gZGF0YWw7CisgICAgICBjLT5zMVtpKzFdID0gZGF0YXI7CisgICAgfQorICBmb3IoaT0wOyBpIDwgMjU2OyBpICs9IDIgKQorICAgIHsKKyAgICAgIGRvX2VuY3J5cHQoIGMsICZkYXRhbCwgJmRhdGFyICk7CisgICAgICBjLT5zMltpXSAgID0gZGF0YWw7CisgICAgICBjLT5zMltpKzFdID0gZGF0YXI7CisgICAgfQorICBmb3IoaT0wOyBpIDwgMjU2OyBpICs9IDIgKQorICAgIHsKKyAgICAgIGRvX2VuY3J5cHQoIGMsICZkYXRhbCwgJmRhdGFyICk7CisgICAgICBjLT5zM1tpXSAgID0gZGF0YWw7CisgICAgICBjLT5zM1tpKzFdID0gZGF0YXI7CisgICAgfQorCisKKyAgLyogQ2hlY2sgZm9yIHdlYWsga2V5LiAgQSB3ZWFrIGtleSBpcyBhIGtleSBpbiB3aGljaCBhIHZhbHVlIGluCisgICAgIHRoZSBQLWFycmF5IChoZXJlIGMpIG9jY3VycyBtb3JlIHRoYW4gb25jZSBwZXIgdGFibGUuICAqLworICBmb3IoaT0wOyBpIDwgMjU1OyBpKysgKQorICAgIHsKKyAgICAgIGZvciggaj1pKzE7IGogPCAyNTY7IGorKykKKyAgICAgICAgeworICAgICAgICAgIGlmKCAoYy0+czBbaV0gPT0gYy0+czBbal0pIHx8IChjLT5zMVtpXSA9PSBjLT5zMVtqXSkgfHwKKyAgICAgICAgICAgICAgKGMtPnMyW2ldID09IGMtPnMyW2pdKSB8fCAoYy0+czNbaV0gPT0gYy0+czNbal0pICkKKyAgICAgICAgICAgIHJldHVybiBHUEdfRVJSX1dFQUtfS0VZOworICAgICAgICB9CisgICAgfQorCisgIHJldHVybiBHUEdfRVJSX05PX0VSUk9SOworfQorCisKK3N0YXRpYyBnY3J5X2Vycl9jb2RlX3QKK2JmX3NldGtleSAodm9pZCAqY29udGV4dCwgY29uc3QgYnl0ZSAqa2V5LCB1bnNpZ25lZCBrZXlsZW4pCit7CisgIEJMT1dGSVNIX2NvbnRleHQgKmMgPSAoQkxPV0ZJU0hfY29udGV4dCAqKSBjb250ZXh0OworICBnY3J5X2Vycl9jb2RlX3QgcmMgPSBkb19iZl9zZXRrZXkgKGMsIGtleSwga2V5bGVuKTsKKyAgX2djcnlfYnVybl9zdGFjayAoNjQpOworICByZXR1cm4gcmM7Cit9CisKKworZ2NyeV9jaXBoZXJfc3BlY190IF9nY3J5X2NpcGhlcl9zcGVjX2Jsb3dmaXNoID0KKyAgeworICAgICJCTE9XRklTSCIsIE5VTEwsIE5VTEwsIEJMT1dGSVNIX0JMT0NLU0laRSwgMTI4LAorICAgIHNpemVvZiAoQkxPV0ZJU0hfY29udGV4dCksCisgICAgYmZfc2V0a2V5LCBlbmNyeXB0X2Jsb2NrLCBkZWNyeXB0X2Jsb2NrCisgIH07CmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvY2lwaGVyL2NhbWVsbGlhLWdsdWUuYyBiL2xpYmdjcnlwdC0xLjQuNi9jaXBoZXIvY2FtZWxsaWEtZ2x1ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2N2FmODUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvY2lwaGVyL2NhbWVsbGlhLWdsdWUuYwpAQCAtMCwwICsxLDI1MyBAQAorLyogY2FtZWxsaWEtZ2x1ZS5jIC0gR2x1ZSBmb3IgdGhlIENhbWVsbGlhIGNpcGhlcgorICogQ29weXJpZ2h0IChDKSAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qIEkgcHV0IGFsbCB0aGUgbGliZ2NyeXB0LXNwZWNpZmljIHN0dWZmIGluIHRoaXMgZmlsZSB0byBrZWVwIHRoZQorICAgY2FtZWxsaWEuYy9jYW1lbGxpYS5oIGZpbGVzIGV4YWN0bHkgYXMgcHJvdmlkZWQgYnkgTlRULiAgSWYgdGhleQorICAgdXBkYXRlIHRoZWlyIGNvZGUsIHRoaXMgc2hvdWxkIG1ha2UgaXQgZWFzaWVyIHRvIGJyaW5nIHRoZSBjaGFuZ2VzCisgICBpbi4gLSBkc2hhdworCisgICBUaGVyZSBpcyBvbmUgc21hbGwgY2hhbmdlIHdoaWNoIG5lZWRzIHRvIGJlIGRvbmU6IEluY2x1ZGUgdGhlCisgICBmb2xsb3dpbmcgY29kZSBhdCB0aGUgdG9wIG9mIGNhbWVsbGlhLmg6ICovCisjaWYgMAorCisvKiBUbyB1c2UgQ2FtZWxsaWEgd2l0aCBsaWJyYXJpZXMgaXQgaXMgb2Z0ZW4gdXNlZnVsIHRvIGtlZXAgdGhlIG5hbWUKKyAqIHNwYWNlIG9mIHRoZSBsaWJyYXJ5IGNsZWFuLiAgVGhlIGZvbGxvd2luZyBtYWNybyBpcyB0aHVzIHVzZWZ1bDoKKyAqCisgKiAgICAgI2RlZmluZSBDQU1FTExJQV9FWFRfU1lNX1BSRUZJWCBmb29fCisgKiAgCisgKiBUaGlzIHByZWZpeGVzIGFsbCBleHRlcm5hbCBzeW1ib2xzIHdpdGggImZvb18iLgorICovCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisjaWZkZWYgQ0FNRUxMSUFfRVhUX1NZTV9QUkVGSVgKKyNkZWZpbmUgQ0FNRUxMSUFfUFJFRklYMSh4LHkpIHggIyMgeQorI2RlZmluZSBDQU1FTExJQV9QUkVGSVgyKHgseSkgQ0FNRUxMSUFfUFJFRklYMSh4LHkpCisjZGVmaW5lIENBTUVMTElBX1BSRUZJWCh4KSAgICBDQU1FTExJQV9QUkVGSVgyKENBTUVMTElBX0VYVF9TWU1fUFJFRklYLHgpCisjZGVmaW5lIENhbWVsbGlhX0VrZXlnZW4gICAgICBDQU1FTExJQV9QUkVGSVgoQ2FtZWxsaWFfRWtleWdlbikKKyNkZWZpbmUgQ2FtZWxsaWFfRW5jcnlwdEJsb2NrIENBTUVMTElBX1BSRUZJWChDYW1lbGxpYV9FbmNyeXB0QmxvY2spCisjZGVmaW5lIENhbWVsbGlhX0RlY3J5cHRCbG9jayBDQU1FTExJQV9QUkVGSVgoQ2FtZWxsaWFfRGVjcnlwdEJsb2NrKQorI2RlZmluZSBjYW1lbGxpYV9kZWNyeXB0MTI4ICAgQ0FNRUxMSUFfUFJFRklYKGNhbWVsbGlhX2RlY3J5cHQxMjgpCisjZGVmaW5lIGNhbWVsbGlhX2RlY3J5cHQyNTYgICBDQU1FTExJQV9QUkVGSVgoY2FtZWxsaWFfZGVjcnlwdDI1NikKKyNkZWZpbmUgY2FtZWxsaWFfZW5jcnlwdDEyOCAgIENBTUVMTElBX1BSRUZJWChjYW1lbGxpYV9lbmNyeXB0MTI4KQorI2RlZmluZSBjYW1lbGxpYV9lbmNyeXB0MjU2ICAgQ0FNRUxMSUFfUFJFRklYKGNhbWVsbGlhX2VuY3J5cHQyNTYpCisjZGVmaW5lIGNhbWVsbGlhX3NldHVwMTI4ICAgICBDQU1FTExJQV9QUkVGSVgoY2FtZWxsaWFfc2V0dXAxMjgpCisjZGVmaW5lIGNhbWVsbGlhX3NldHVwMTkyICAgICBDQU1FTExJQV9QUkVGSVgoY2FtZWxsaWFfc2V0dXAxOTIpIAorI2RlZmluZSBjYW1lbGxpYV9zZXR1cDI1NiAgICAgQ0FNRUxMSUFfUFJFRklYKGNhbWVsbGlhX3NldHVwMjU2KQorI2VuZGlmIC8qQ0FNRUxMSUFfRVhUX1NZTV9QUkVGSVgqLworCisjZW5kaWYgLyogQ29kZSBzYW1wbGUuICovCisKKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAiZzEwbGliLmgiCisjaW5jbHVkZSAiY2lwaGVyLmgiCisjaW5jbHVkZSAiY2FtZWxsaWEuaCIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgaW50IGtleWJpdGxlbmd0aDsKKyAgS0VZX1RBQkxFX1RZUEUga2V5dGFibGU7Cit9IENBTUVMTElBX2NvbnRleHQ7CisKK3N0YXRpYyBjb25zdCBjaGFyICpzZWxmdGVzdCh2b2lkKTsKKworc3RhdGljIGdjcnlfZXJyX2NvZGVfdAorY2FtZWxsaWFfc2V0a2V5KHZvaWQgKmMsIGNvbnN0IGJ5dGUgKmtleSwgdW5zaWduZWQga2V5bGVuKQoreworICBDQU1FTExJQV9jb250ZXh0ICpjdHg9YzsKKyAgc3RhdGljIGludCBpbml0aWFsaXplZD0wOworICBzdGF0aWMgY29uc3QgY2hhciAqc2VsZnRlc3RfZmFpbGVkPU5VTEw7CisKKyAgaWYoa2V5bGVuIT0xNiAmJiBrZXlsZW4hPTI0ICYmIGtleWxlbiE9MzIpCisgICAgcmV0dXJuIEdQR19FUlJfSU5WX0tFWUxFTjsKKworICBpZighaW5pdGlhbGl6ZWQpCisgICAgeworICAgICAgaW5pdGlhbGl6ZWQ9MTsKKyAgICAgIHNlbGZ0ZXN0X2ZhaWxlZD1zZWxmdGVzdCgpOworICAgICAgaWYoc2VsZnRlc3RfZmFpbGVkKQorCWxvZ19lcnJvcigiJXNcbiIsc2VsZnRlc3RfZmFpbGVkKTsKKyAgICB9CisKKyAgaWYoc2VsZnRlc3RfZmFpbGVkKQorICAgIHJldHVybiBHUEdfRVJSX1NFTEZURVNUX0ZBSUxFRDsKKworICBjdHgtPmtleWJpdGxlbmd0aD1rZXlsZW4qODsKKyAgQ2FtZWxsaWFfRWtleWdlbihjdHgtPmtleWJpdGxlbmd0aCxrZXksY3R4LT5rZXl0YWJsZSk7CisgIF9nY3J5X2J1cm5fc3RhY2sKKyAgICAoKDE5KzM0KzM0KSpzaXplb2YodTMyKSsyKnNpemVvZih2b2lkKikgLyogY2FtZWxsaWFfc2V0dXAyNTYgKi8KKyAgICAgKyg0KzMyKSpzaXplb2YodTMyKSsyKnNpemVvZih2b2lkKikgICAgLyogY2FtZWxsaWFfc2V0dXAxOTIgKi8KKyAgICAgKzArc2l6ZW9mKGludCkrMipzaXplb2Yodm9pZCopICAgICAgICAgLyogQ2FtZWxsaWFfRWtleWdlbiAqLworICAgICArMyoyKnNpemVvZih2b2lkKikgICAgICAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxscy4gICovCisgICAgICk7ICAKKworICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2NhbWVsbGlhX2VuY3J5cHQodm9pZCAqYywgYnl0ZSAqb3V0YnVmLCBjb25zdCBieXRlICppbmJ1ZikKK3sKKyAgQ0FNRUxMSUFfY29udGV4dCAqY3R4PWM7CisKKyAgQ2FtZWxsaWFfRW5jcnlwdEJsb2NrKGN0eC0+a2V5Yml0bGVuZ3RoLGluYnVmLGN0eC0+a2V5dGFibGUsb3V0YnVmKTsKKyAgX2djcnlfYnVybl9zdGFjaworICAgIChzaXplb2YoaW50KSsyKnNpemVvZih1bnNpZ25lZCBjaGFyICopK3NpemVvZihLRVlfVEFCTEVfVFlQRSkKKyAgICAgKzQqc2l6ZW9mKHUzMikKKyAgICAgKzIqc2l6ZW9mKHUzMiopKzQqc2l6ZW9mKHUzMikKKyAgICAgKzIqMipzaXplb2Yodm9pZCopIC8qIEZ1bmN0aW9uIGNhbGxzLiAgKi8KKyAgICApOworfQorCitzdGF0aWMgdm9pZAorY2FtZWxsaWFfZGVjcnlwdCh2b2lkICpjLCBieXRlICpvdXRidWYsIGNvbnN0IGJ5dGUgKmluYnVmKQoreworICBDQU1FTExJQV9jb250ZXh0ICpjdHg9YzsKKworICBDYW1lbGxpYV9EZWNyeXB0QmxvY2soY3R4LT5rZXliaXRsZW5ndGgsaW5idWYsY3R4LT5rZXl0YWJsZSxvdXRidWYpOworICBfZ2NyeV9idXJuX3N0YWNrCisgICAgKHNpemVvZihpbnQpKzIqc2l6ZW9mKHVuc2lnbmVkIGNoYXIgKikrc2l6ZW9mKEtFWV9UQUJMRV9UWVBFKQorICAgICArNCpzaXplb2YodTMyKQorICAgICArMipzaXplb2YodTMyKikrNCpzaXplb2YodTMyKQorICAgICArMioyKnNpemVvZih2b2lkKikgLyogRnVuY3Rpb24gY2FsbHMuICAqLworICAgICk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK3NlbGZ0ZXN0KHZvaWQpCit7CisgIENBTUVMTElBX2NvbnRleHQgY3R4OworICBieXRlIHNjcmF0Y2hbMTZdOworICAKKyAgLyogVGhlc2UgdGVzdCB2ZWN0b3JzIGFyZSBmcm9tIFJGQy0zNzEzICovCisgIGNvbnN0IGJ5dGUgcGxhaW50ZXh0W109CisgICAgeworICAgICAgMHgwMSwweDIzLDB4NDUsMHg2NywweDg5LDB4YWIsMHhjZCwweGVmLAorICAgICAgMHhmZSwweGRjLDB4YmEsMHg5OCwweDc2LDB4NTQsMHgzMiwweDEwCisgICAgfTsKKyAgY29uc3QgYnl0ZSBrZXlfMTI4W109CisgICAgeworICAgICAgMHgwMSwweDIzLDB4NDUsMHg2NywweDg5LDB4YWIsMHhjZCwweGVmLAorICAgICAgMHhmZSwweGRjLDB4YmEsMHg5OCwweDc2LDB4NTQsMHgzMiwweDEwCisgICAgfTsKKyAgY29uc3QgYnl0ZSBjaXBoZXJ0ZXh0XzEyOFtdPQorICAgIHsKKyAgICAgIDB4NjcsMHg2NywweDMxLDB4MzgsMHg1NCwweDk2LDB4NjksMHg3MywKKyAgICAgIDB4MDgsMHg1NywweDA2LDB4NTYsMHg0OCwweGVhLDB4YmUsMHg0MworICAgIH07CisgIGNvbnN0IGJ5dGUga2V5XzE5MltdPQorICAgIHsKKyAgICAgIDB4MDEsMHgyMywweDQ1LDB4NjcsMHg4OSwweGFiLDB4Y2QsMHhlZiwweGZlLDB4ZGMsMHhiYSwweDk4LAorICAgICAgMHg3NiwweDU0LDB4MzIsMHgxMCwweDAwLDB4MTEsMHgyMiwweDMzLDB4NDQsMHg1NSwweDY2LDB4NzcKKyAgICB9OworICBjb25zdCBieXRlIGNpcGhlcnRleHRfMTkyW109CisgICAgeworICAgICAgMHhiNCwweDk5LDB4MzQsMHgwMSwweGIzLDB4ZTksMHg5NiwweGY4LAorICAgICAgMHg0ZSwweGU1LDB4Y2UsMHhlNywweGQ3LDB4OWIsMHgwOSwweGI5CisgICAgfTsKKyAgY29uc3QgYnl0ZSBrZXlfMjU2W109CisgICAgeworICAgICAgMHgwMSwweDIzLDB4NDUsMHg2NywweDg5LDB4YWIsMHhjZCwweGVmLDB4ZmUsMHhkYywweGJhLAorICAgICAgMHg5OCwweDc2LDB4NTQsMHgzMiwweDEwLDB4MDAsMHgxMSwweDIyLDB4MzMsMHg0NCwweDU1LAorICAgICAgMHg2NiwweDc3LDB4ODgsMHg5OSwweGFhLDB4YmIsMHhjYywweGRkLDB4ZWUsMHhmZgorICAgIH07CisgIGNvbnN0IGJ5dGUgY2lwaGVydGV4dF8yNTZbXT0KKyAgICB7CisgICAgICAweDlhLDB4Y2MsMHgyMywweDdkLDB4ZmYsMHgxNiwweGQ3LDB4NmMsCisgICAgICAweDIwLDB4ZWYsMHg3YywweDkxLDB4OWUsMHgzYSwweDc1LDB4MDkKKyAgICB9OworCisgIGNhbWVsbGlhX3NldGtleSgmY3R4LGtleV8xMjgsc2l6ZW9mKGtleV8xMjgpKTsKKyAgY2FtZWxsaWFfZW5jcnlwdCgmY3R4LHNjcmF0Y2gscGxhaW50ZXh0KTsKKyAgaWYobWVtY21wKHNjcmF0Y2gsY2lwaGVydGV4dF8xMjgsc2l6ZW9mKGNpcGhlcnRleHRfMTI4KSkhPTApCisgICAgcmV0dXJuICJDQU1FTExJQS0xMjggdGVzdCBlbmNyeXB0aW9uIGZhaWxlZC4iOworICBjYW1lbGxpYV9kZWNyeXB0KCZjdHgsc2NyYXRjaCxzY3JhdGNoKTsKKyAgaWYobWVtY21wKHNjcmF0Y2gscGxhaW50ZXh0LHNpemVvZihwbGFpbnRleHQpKSE9MCkKKyAgICByZXR1cm4gIkNBTUVMTElBLTEyOCB0ZXN0IGRlY3J5cHRpb24gZmFpbGVkLiI7CisKKyAgY2FtZWxsaWFfc2V0a2V5KCZjdHgsa2V5XzE5MixzaXplb2Yoa2V5XzE5MikpOworICBjYW1lbGxpYV9lbmNyeXB0KCZjdHgsc2NyYXRjaCxwbGFpbnRleHQpOworICBpZihtZW1jbXAoc2NyYXRjaCxjaXBoZXJ0ZXh0XzE5MixzaXplb2YoY2lwaGVydGV4dF8xOTIpKSE9MCkKKyAgICByZXR1cm4gIkNBTUVMTElBLTE5MiB0ZXN0IGVuY3J5cHRpb24gZmFpbGVkLiI7CisgIGNhbWVsbGlhX2RlY3J5cHQoJmN0eCxzY3JhdGNoLHNjcmF0Y2gpOworICBpZihtZW1jbXAoc2NyYXRjaCxwbGFpbnRleHQsc2l6ZW9mKHBsYWludGV4dCkpIT0wKQorICAgIHJldHVybiAiQ0FNRUxMSUEtMTkyIHRlc3QgZGVjcnlwdGlvbiBmYWlsZWQuIjsKKworICBjYW1lbGxpYV9zZXRrZXkoJmN0eCxrZXlfMjU2LHNpemVvZihrZXlfMjU2KSk7CisgIGNhbWVsbGlhX2VuY3J5cHQoJmN0eCxzY3JhdGNoLHBsYWludGV4dCk7CisgIGlmKG1lbWNtcChzY3JhdGNoLGNpcGhlcnRleHRfMjU2LHNpemVvZihjaXBoZXJ0ZXh0XzI1NikpIT0wKQorICAgIHJldHVybiAiQ0FNRUxMSUEtMjU2IHRlc3QgZW5jcnlwdGlvbiBmYWlsZWQuIjsKKyAgY2FtZWxsaWFfZGVjcnlwdCgmY3R4LHNjcmF0Y2gsc2NyYXRjaCk7CisgIGlmKG1lbWNtcChzY3JhdGNoLHBsYWludGV4dCxzaXplb2YocGxhaW50ZXh0KSkhPTApCisgICAgcmV0dXJuICJDQU1FTExJQS0yNTYgdGVzdCBkZWNyeXB0aW9uIGZhaWxlZC4iOworCisgIHJldHVybiBOVUxMOworfQorCisvKiBUaGVzZSBvaWRzIGFyZSBmcm9tCisgICA8aHR0cDovL2luZm8uaXNsLm50dC5jby5qcC9jcnlwdC9lbmcvY2FtZWxsaWEvc3BlY2lmaWNhdGlvbnNfb2lkLmh0bWw+LAorICAgcmV0cmlldmVkIE1heSAxLCAyMDA3LiAqLworCitzdGF0aWMgZ2NyeV9jaXBoZXJfb2lkX3NwZWNfdCBjYW1lbGxpYTEyOF9vaWRzW10gPQorICB7CisgICAgeyIxLjIuMzkyLjIwMDAxMS42MS4xLjEuMS4yIiwgR0NSWV9DSVBIRVJfTU9ERV9DQkN9LAorICAgIHsiMC4zLjQ0MDEuNS4zLjEuOS4xIiwgR0NSWV9DSVBIRVJfTU9ERV9FQ0J9LAorICAgIHsiMC4zLjQ0MDEuNS4zLjEuOS4zIiwgR0NSWV9DSVBIRVJfTU9ERV9PRkJ9LAorICAgIHsiMC4zLjQ0MDEuNS4zLjEuOS40IiwgR0NSWV9DSVBIRVJfTU9ERV9DRkJ9LAorICAgIHsgTlVMTCB9CisgIH07CisKK3N0YXRpYyBnY3J5X2NpcGhlcl9vaWRfc3BlY190IGNhbWVsbGlhMTkyX29pZHNbXSA9CisgIHsKKyAgICB7IjEuMi4zOTIuMjAwMDExLjYxLjEuMS4xLjMiLCBHQ1JZX0NJUEhFUl9NT0RFX0NCQ30sCisgICAgeyIwLjMuNDQwMS41LjMuMS45LjIxIiwgR0NSWV9DSVBIRVJfTU9ERV9FQ0J9LAorICAgIHsiMC4zLjQ0MDEuNS4zLjEuOS4yMyIsIEdDUllfQ0lQSEVSX01PREVfT0ZCfSwKKyAgICB7IjAuMy40NDAxLjUuMy4xLjkuMjQiLCBHQ1JZX0NJUEhFUl9NT0RFX0NGQn0sCisgICAgeyBOVUxMIH0KKyAgfTsKKworc3RhdGljIGdjcnlfY2lwaGVyX29pZF9zcGVjX3QgY2FtZWxsaWEyNTZfb2lkc1tdID0KKyAgeworICAgIHsiMS4yLjM5Mi4yMDAwMTEuNjEuMS4xLjEuNCIsIEdDUllfQ0lQSEVSX01PREVfQ0JDfSwKKyAgICB7IjAuMy40NDAxLjUuMy4xLjkuNDEiLCBHQ1JZX0NJUEhFUl9NT0RFX0VDQn0sCisgICAgeyIwLjMuNDQwMS41LjMuMS45LjQzIiwgR0NSWV9DSVBIRVJfTU9ERV9PRkJ9LAorICAgIHsiMC4zLjQ0MDEuNS4zLjEuOS40NCIsIEdDUllfQ0lQSEVSX01PREVfQ0ZCfSwKKyAgICB7IE5VTEwgfQorICB9OworCitnY3J5X2NpcGhlcl9zcGVjX3QgX2djcnlfY2lwaGVyX3NwZWNfY2FtZWxsaWExMjggPQorICB7CisgICAgIkNBTUVMTElBMTI4IixOVUxMLGNhbWVsbGlhMTI4X29pZHMsQ0FNRUxMSUFfQkxPQ0tfU0laRSwxMjgsCisgICAgc2l6ZW9mKENBTUVMTElBX2NvbnRleHQpLGNhbWVsbGlhX3NldGtleSxjYW1lbGxpYV9lbmNyeXB0LGNhbWVsbGlhX2RlY3J5cHQKKyAgfTsKKworZ2NyeV9jaXBoZXJfc3BlY190IF9nY3J5X2NpcGhlcl9zcGVjX2NhbWVsbGlhMTkyID0KKyAgeworICAgICJDQU1FTExJQTE5MiIsTlVMTCxjYW1lbGxpYTE5Ml9vaWRzLENBTUVMTElBX0JMT0NLX1NJWkUsMTkyLAorICAgIHNpemVvZihDQU1FTExJQV9jb250ZXh0KSxjYW1lbGxpYV9zZXRrZXksY2FtZWxsaWFfZW5jcnlwdCxjYW1lbGxpYV9kZWNyeXB0CisgIH07CisKK2djcnlfY2lwaGVyX3NwZWNfdCBfZ2NyeV9jaXBoZXJfc3BlY19jYW1lbGxpYTI1NiA9CisgIHsKKyAgICAiQ0FNRUxMSUEyNTYiLE5VTEwsY2FtZWxsaWEyNTZfb2lkcyxDQU1FTExJQV9CTE9DS19TSVpFLDI1NiwKKyAgICBzaXplb2YoQ0FNRUxMSUFfY29udGV4dCksY2FtZWxsaWFfc2V0a2V5LGNhbWVsbGlhX2VuY3J5cHQsY2FtZWxsaWFfZGVjcnlwdAorICB9OwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L2NpcGhlci9jYW1lbGxpYS5jIGIvbGliZ2NyeXB0LTEuNC42L2NpcGhlci9jYW1lbGxpYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5Y2Q0OWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvY2lwaGVyL2NhbWVsbGlhLmMKQEAgLTAsMCArMSwxNDYxIEBACisvKiBjYW1lbGxpYS5oCXZlciAxLjIuMAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiwyMDA3CisgKiBOVFQgKE5pcHBvbiBUZWxlZ3JhcGggYW5kIFRlbGVwaG9uZSBDb3Jwb3JhdGlvbikuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisvKgorICogQWxnb3JpdGhtIFNwZWNpZmljYXRpb24gCisgKiAgaHR0cDovL2luZm8uaXNsLm50dC5jby5qcC9jcnlwdC9lbmcvY2FtZWxsaWEvc3BlY2lmaWNhdGlvbnMuaHRtbAorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImNhbWVsbGlhLmgiCisKKy8qIHUzMiBtdXN0IGJlIDMyYml0IHdvcmQgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50IHUzMjsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1ODsKKworLyoga2V5IGNvbnN0YW50cyAqLworCisjZGVmaW5lIENBTUVMTElBX1NJR01BMUwgKDB4QTA5RTY2N0ZMKQorI2RlZmluZSBDQU1FTExJQV9TSUdNQTFSICgweDNCQ0M5MDhCTCkKKyNkZWZpbmUgQ0FNRUxMSUFfU0lHTUEyTCAoMHhCNjdBRTg1OEwpCisjZGVmaW5lIENBTUVMTElBX1NJR01BMlIgKDB4NENBQTczQjJMKQorI2RlZmluZSBDQU1FTExJQV9TSUdNQTNMICgweEM2RUYzNzJGTCkKKyNkZWZpbmUgQ0FNRUxMSUFfU0lHTUEzUiAoMHhFOTRGODJCRUwpCisjZGVmaW5lIENBTUVMTElBX1NJR01BNEwgKDB4NTRGRjUzQTVMKQorI2RlZmluZSBDQU1FTExJQV9TSUdNQTRSICgweEYxRDM2RjFDTCkKKyNkZWZpbmUgQ0FNRUxMSUFfU0lHTUE1TCAoMHgxMEU1MjdGQUwpCisjZGVmaW5lIENBTUVMTElBX1NJR01BNVIgKDB4REU2ODJEMURMKQorI2RlZmluZSBDQU1FTExJQV9TSUdNQTZMICgweEIwNTY4OEMyTCkKKyNkZWZpbmUgQ0FNRUxMSUFfU0lHTUE2UiAoMHhCM0U2QzFGREwpCisKKy8qCisgKiAgbWFjcm9zCisgKi8KKworCisjaWYgZGVmaW5lZChfTVNDX1ZFUikKKworIyBkZWZpbmUgU1dBUCh4KSAoX2xyb3RsKHgsIDgpICYgMHgwMGZmMDBmZiB8IF9scm90cih4LCA4KSAmIDB4ZmYwMGZmMDApCisjIGRlZmluZSBHRVRVMzIocCkgU1dBUCgqKCh1MzIgKikocCkpKQorIyBkZWZpbmUgUFVUVTMyKGN0LCBzdCkgeyooKHUzMiAqKShjdCkpID0gU1dBUCgoc3QpKTt9CisKKyNlbHNlIC8qIG5vdCBNUy1WQyAqLworCisjIGRlZmluZSBHRVRVMzIocHQpCQkJCVwKKyAgICAoKCh1MzIpKHB0KVswXSA8PCAyNCkJCQlcCisgICAgIF4gKCh1MzIpKHB0KVsxXSA8PCAxNikJCQlcCisgICAgIF4gKCh1MzIpKHB0KVsyXSA8PCAgOCkJCQlcCisgICAgIF4gKCh1MzIpKHB0KVszXSkpCisKKyMgZGVmaW5lIFBVVFUzMihjdCwgc3QpICB7CQkJXAorCShjdClbMF0gPSAodTgpKChzdCkgPj4gMjQpOwkJXAorCShjdClbMV0gPSAodTgpKChzdCkgPj4gMTYpOwkJXAorCShjdClbMl0gPSAodTgpKChzdCkgPj4gIDgpOwkJXAorCShjdClbM10gPSAodTgpKHN0KTsgfQorCisjZW5kaWYKKworI2RlZmluZSBDYW1lbGxpYVN1YmtleUwoSU5ERVgpIChzdWJrZXlbKElOREVYKSoyXSkKKyNkZWZpbmUgQ2FtZWxsaWFTdWJrZXlSKElOREVYKSAoc3Via2V5WyhJTkRFWCkqMiArIDFdKQorCisvKiByb3RhdGlvbiByaWdodCBzaGlmdCAxYnl0ZSAqLworI2RlZmluZSBDQU1FTExJQV9SUjgoeCkgKCgoeCkgPj4gOCkgKyAoKHgpIDw8IDI0KSkKKy8qIHJvdGF0aW9uIGxlZnQgc2hpZnQgMWJpdCAqLworI2RlZmluZSBDQU1FTExJQV9STDEoeCkgKCgoeCkgPDwgMSkgKyAoKHgpID4+IDMxKSkKKy8qIHJvdGF0aW9uIGxlZnQgc2hpZnQgMWJ5dGUgKi8KKyNkZWZpbmUgQ0FNRUxMSUFfUkw4KHgpICgoKHgpIDw8IDgpICsgKCh4KSA+PiAyNCkpCisKKyNkZWZpbmUgQ0FNRUxMSUFfUk9MRFEobGwsIGxyLCBybCwgcnIsIHcwLCB3MSwgYml0cykJXAorICAgIGRvIHsJCQkJCQlcCisJdzAgPSBsbDsJCQkJCVwKKwlsbCA9IChsbCA8PCBiaXRzKSArIChsciA+PiAoMzIgLSBiaXRzKSk7CVwKKwlsciA9IChsciA8PCBiaXRzKSArIChybCA+PiAoMzIgLSBiaXRzKSk7CVwKKwlybCA9IChybCA8PCBiaXRzKSArIChyciA+PiAoMzIgLSBiaXRzKSk7CVwKKwlyciA9IChyciA8PCBiaXRzKSArICh3MCA+PiAoMzIgLSBiaXRzKSk7CVwKKyAgICB9IHdoaWxlKDApCisKKyNkZWZpbmUgQ0FNRUxMSUFfUk9MRFFvMzIobGwsIGxyLCBybCwgcnIsIHcwLCB3MSwgYml0cykJXAorICAgIGRvIHsJCQkJCQlcCisJdzAgPSBsbDsJCQkJCVwKKwl3MSA9IGxyOwkJCQkJXAorCWxsID0gKGxyIDw8IChiaXRzIC0gMzIpKSArIChybCA+PiAoNjQgLSBiaXRzKSk7CVwKKwlsciA9IChybCA8PCAoYml0cyAtIDMyKSkgKyAocnIgPj4gKDY0IC0gYml0cykpOwlcCisJcmwgPSAocnIgPDwgKGJpdHMgLSAzMikpICsgKHcwID4+ICg2NCAtIGJpdHMpKTsJXAorCXJyID0gKHcwIDw8IChiaXRzIC0gMzIpKSArICh3MSA+PiAoNjQgLSBiaXRzKSk7CVwKKyAgICB9IHdoaWxlKDApCisKKyNkZWZpbmUgQ0FNRUxMSUFfU1AxMTEwKElOREVYKSAoY2FtZWxsaWFfc3AxMTEwWyhJTkRFWCldKQorI2RlZmluZSBDQU1FTExJQV9TUDAyMjIoSU5ERVgpIChjYW1lbGxpYV9zcDAyMjJbKElOREVYKV0pCisjZGVmaW5lIENBTUVMTElBX1NQMzAzMyhJTkRFWCkgKGNhbWVsbGlhX3NwMzAzM1soSU5ERVgpXSkKKyNkZWZpbmUgQ0FNRUxMSUFfU1A0NDA0KElOREVYKSAoY2FtZWxsaWFfc3A0NDA0WyhJTkRFWCldKQorCisjZGVmaW5lIENBTUVMTElBX0YoeGwsIHhyLCBrbCwga3IsIHlsLCB5ciwgaWwsIGlyLCB0MCwgdDEpCVwKKyAgICBkbyB7CQkJCQkJCVwKKwlpbCA9IHhsIF4ga2w7CQkJCQkJXAorCWlyID0geHIgXiBrcjsJCQkJCQlcCisJdDAgPSBpbCA+PiAxNjsJCQkJCQlcCisJdDEgPSBpciA+PiAxNjsJCQkJCQlcCisJeWwgPSBDQU1FTExJQV9TUDExMTAoaXIgJiAweGZmKQkJCQlcCisJICAgIF4gQ0FNRUxMSUFfU1AwMjIyKCh0MSA+PiA4KSAmIDB4ZmYpCQkJXAorCSAgICBeIENBTUVMTElBX1NQMzAzMyh0MSAmIDB4ZmYpCQkJXAorCSAgICBeIENBTUVMTElBX1NQNDQwNCgoaXIgPj4gOCkgJiAweGZmKTsJCVwKKwl5ciA9IENBTUVMTElBX1NQMTExMCgodDAgPj4gOCkgJiAweGZmKQkJCVwKKwkgICAgXiBDQU1FTExJQV9TUDAyMjIodDAgJiAweGZmKQkJCVwKKwkgICAgXiBDQU1FTExJQV9TUDMwMzMoKGlsID4+IDgpICYgMHhmZikJCQlcCisJICAgIF4gQ0FNRUxMSUFfU1A0NDA0KGlsICYgMHhmZik7CQkJXAorCXlsIF49IHlyOwkJCQkJCVwKKwl5ciA9IENBTUVMTElBX1JSOCh5cik7CQkJCQlcCisJeXIgXj0geWw7CQkJCQkJXAorICAgIH0gd2hpbGUoMCkKKworCisvKgorICogZm9yIHNwZWVkIHVwCisgKgorICovCisjZGVmaW5lIENBTUVMTElBX0ZMUyhsbCwgbHIsIHJsLCByciwga2xsLCBrbHIsIGtybCwga3JyLCB0MCwgdDEsIHQyLCB0MykgXAorICAgIGRvIHsJCQkJCQkJCVwKKwl0MCA9IGtsbDsJCQkJCQkJXAorCXQwICY9IGxsOwkJCQkJCQlcCisJbHIgXj0gQ0FNRUxMSUFfUkwxKHQwKTsJCQkJCQlcCisJdDEgPSBrbHI7CQkJCQkJCVwKKwl0MSB8PSBscjsJCQkJCQkJXAorCWxsIF49IHQxOwkJCQkJCQlcCisJCQkJCQkJCQlcCisJdDIgPSBrcnI7CQkJCQkJCVwKKwl0MiB8PSBycjsJCQkJCQkJXAorCXJsIF49IHQyOwkJCQkJCQlcCisJdDMgPSBrcmw7CQkJCQkJCVwKKwl0MyAmPSBybDsJCQkJCQkJXAorCXJyIF49IENBTUVMTElBX1JMMSh0Myk7CQkJCQkJXAorICAgIH0gd2hpbGUoMCkKKworI2RlZmluZSBDQU1FTExJQV9ST1VORFNNKHhsLCB4ciwga2wsIGtyLCB5bCwgeXIsIGlsLCBpciwgdDAsIHQxKQlcCisgICAgZG8gewkJCQkJCQkJXAorCWlyID0gQ0FNRUxMSUFfU1AxMTEwKHhyICYgMHhmZikJCQkJCVwKKwkgICAgXiBDQU1FTExJQV9TUDAyMjIoKHhyID4+IDI0KSAmIDB4ZmYpCQkJXAorCSAgICBeIENBTUVMTElBX1NQMzAzMygoeHIgPj4gMTYpICYgMHhmZikJCQlcCisJICAgIF4gQ0FNRUxMSUFfU1A0NDA0KCh4ciA+PiA4KSAmIDB4ZmYpOwkJCVwKKwlpbCA9IENBTUVMTElBX1NQMTExMCgoeGwgPj4gMjQpICYgMHhmZikJCQkJXAorCSAgICBeIENBTUVMTElBX1NQMDIyMigoeGwgPj4gMTYpICYgMHhmZikJCQlcCisJICAgIF4gQ0FNRUxMSUFfU1AzMDMzKCh4bCA+PiA4KSAmIDB4ZmYpCQkJCVwKKwkgICAgXiBDQU1FTExJQV9TUDQ0MDQoeGwgJiAweGZmKTsJCQkJXAorCWlsIF49IGtsOwkJCQkJCQlcCisJaXIgXj0ga3I7CQkJCQkJCVwKKwlpciBePSBpbDsJCQkJCQkJXAorCWlsID0gQ0FNRUxMSUFfUlI4KGlsKTsJCQkJCQlcCisJaWwgXj0gaXI7CQkJCQkJCVwKKwl5bCBePSBpcjsJCQkJCQkJXAorCXlyIF49IGlsOwkJCQkJCQlcCisgICAgfSB3aGlsZSgwKQorCisKK3N0YXRpYyBjb25zdCB1MzIgY2FtZWxsaWFfc3AxMTEwWzI1Nl0gPSB7CisgICAgMHg3MDcwNzAwMCwweDgyODI4MjAwLDB4MmMyYzJjMDAsMHhlY2VjZWMwMCwKKyAgICAweGIzYjNiMzAwLDB4MjcyNzI3MDAsMHhjMGMwYzAwMCwweGU1ZTVlNTAwLAorICAgIDB4ZTRlNGU0MDAsMHg4NTg1ODUwMCwweDU3NTc1NzAwLDB4MzUzNTM1MDAsCisgICAgMHhlYWVhZWEwMCwweDBjMGMwYzAwLDB4YWVhZWFlMDAsMHg0MTQxNDEwMCwKKyAgICAweDIzMjMyMzAwLDB4ZWZlZmVmMDAsMHg2YjZiNmIwMCwweDkzOTM5MzAwLAorICAgIDB4NDU0NTQ1MDAsMHgxOTE5MTkwMCwweGE1YTVhNTAwLDB4MjEyMTIxMDAsCisgICAgMHhlZGVkZWQwMCwweDBlMGUwZTAwLDB4NGY0ZjRmMDAsMHg0ZTRlNGUwMCwKKyAgICAweDFkMWQxZDAwLDB4NjU2NTY1MDAsMHg5MjkyOTIwMCwweGJkYmRiZDAwLAorICAgIDB4ODY4Njg2MDAsMHhiOGI4YjgwMCwweGFmYWZhZjAwLDB4OGY4ZjhmMDAsCisgICAgMHg3YzdjN2MwMCwweGViZWJlYjAwLDB4MWYxZjFmMDAsMHhjZWNlY2UwMCwKKyAgICAweDNlM2UzZTAwLDB4MzAzMDMwMDAsMHhkY2RjZGMwMCwweDVmNWY1ZjAwLAorICAgIDB4NWU1ZTVlMDAsMHhjNWM1YzUwMCwweDBiMGIwYjAwLDB4MWExYTFhMDAsCisgICAgMHhhNmE2YTYwMCwweGUxZTFlMTAwLDB4MzkzOTM5MDAsMHhjYWNhY2EwMCwKKyAgICAweGQ1ZDVkNTAwLDB4NDc0NzQ3MDAsMHg1ZDVkNWQwMCwweDNkM2QzZDAwLAorICAgIDB4ZDlkOWQ5MDAsMHgwMTAxMDEwMCwweDVhNWE1YTAwLDB4ZDZkNmQ2MDAsCisgICAgMHg1MTUxNTEwMCwweDU2NTY1NjAwLDB4NmM2YzZjMDAsMHg0ZDRkNGQwMCwKKyAgICAweDhiOGI4YjAwLDB4MGQwZDBkMDAsMHg5YTlhOWEwMCwweDY2NjY2NjAwLAorICAgIDB4ZmJmYmZiMDAsMHhjY2NjY2MwMCwweGIwYjBiMDAwLDB4MmQyZDJkMDAsCisgICAgMHg3NDc0NzQwMCwweDEyMTIxMjAwLDB4MmIyYjJiMDAsMHgyMDIwMjAwMCwKKyAgICAweGYwZjBmMDAwLDB4YjFiMWIxMDAsMHg4NDg0ODQwMCwweDk5OTk5OTAwLAorICAgIDB4ZGZkZmRmMDAsMHg0YzRjNGMwMCwweGNiY2JjYjAwLDB4YzJjMmMyMDAsCisgICAgMHgzNDM0MzQwMCwweDdlN2U3ZTAwLDB4NzY3Njc2MDAsMHgwNTA1MDUwMCwKKyAgICAweDZkNmQ2ZDAwLDB4YjdiN2I3MDAsMHhhOWE5YTkwMCwweDMxMzEzMTAwLAorICAgIDB4ZDFkMWQxMDAsMHgxNzE3MTcwMCwweDA0MDQwNDAwLDB4ZDdkN2Q3MDAsCisgICAgMHgxNDE0MTQwMCwweDU4NTg1ODAwLDB4M2EzYTNhMDAsMHg2MTYxNjEwMCwKKyAgICAweGRlZGVkZTAwLDB4MWIxYjFiMDAsMHgxMTExMTEwMCwweDFjMWMxYzAwLAorICAgIDB4MzIzMjMyMDAsMHgwZjBmMGYwMCwweDljOWM5YzAwLDB4MTYxNjE2MDAsCisgICAgMHg1MzUzNTMwMCwweDE4MTgxODAwLDB4ZjJmMmYyMDAsMHgyMjIyMjIwMCwKKyAgICAweGZlZmVmZTAwLDB4NDQ0NDQ0MDAsMHhjZmNmY2YwMCwweGIyYjJiMjAwLAorICAgIDB4YzNjM2MzMDAsMHhiNWI1YjUwMCwweDdhN2E3YTAwLDB4OTE5MTkxMDAsCisgICAgMHgyNDI0MjQwMCwweDA4MDgwODAwLDB4ZThlOGU4MDAsMHhhOGE4YTgwMCwKKyAgICAweDYwNjA2MDAwLDB4ZmNmY2ZjMDAsMHg2OTY5NjkwMCwweDUwNTA1MDAwLAorICAgIDB4YWFhYWFhMDAsMHhkMGQwZDAwMCwweGEwYTBhMDAwLDB4N2Q3ZDdkMDAsCisgICAgMHhhMWExYTEwMCwweDg5ODk4OTAwLDB4NjI2MjYyMDAsMHg5Nzk3OTcwMCwKKyAgICAweDU0NTQ1NDAwLDB4NWI1YjViMDAsMHgxZTFlMWUwMCwweDk1OTU5NTAwLAorICAgIDB4ZTBlMGUwMDAsMHhmZmZmZmYwMCwweDY0NjQ2NDAwLDB4ZDJkMmQyMDAsCisgICAgMHgxMDEwMTAwMCwweGM0YzRjNDAwLDB4MDAwMDAwMDAsMHg0ODQ4NDgwMCwKKyAgICAweGEzYTNhMzAwLDB4ZjdmN2Y3MDAsMHg3NTc1NzUwMCwweGRiZGJkYjAwLAorICAgIDB4OGE4YThhMDAsMHgwMzAzMDMwMCwweGU2ZTZlNjAwLDB4ZGFkYWRhMDAsCisgICAgMHgwOTA5MDkwMCwweDNmM2YzZjAwLDB4ZGRkZGRkMDAsMHg5NDk0OTQwMCwKKyAgICAweDg3ODc4NzAwLDB4NWM1YzVjMDAsMHg4MzgzODMwMCwweDAyMDIwMjAwLAorICAgIDB4Y2RjZGNkMDAsMHg0YTRhNGEwMCwweDkwOTA5MDAwLDB4MzMzMzMzMDAsCisgICAgMHg3MzczNzMwMCwweDY3Njc2NzAwLDB4ZjZmNmY2MDAsMHhmM2YzZjMwMCwKKyAgICAweDlkOWQ5ZDAwLDB4N2Y3ZjdmMDAsMHhiZmJmYmYwMCwweGUyZTJlMjAwLAorICAgIDB4NTI1MjUyMDAsMHg5YjliOWIwMCwweGQ4ZDhkODAwLDB4MjYyNjI2MDAsCisgICAgMHhjOGM4YzgwMCwweDM3MzczNzAwLDB4YzZjNmM2MDAsMHgzYjNiM2IwMCwKKyAgICAweDgxODE4MTAwLDB4OTY5Njk2MDAsMHg2ZjZmNmYwMCwweDRiNGI0YjAwLAorICAgIDB4MTMxMzEzMDAsMHhiZWJlYmUwMCwweDYzNjM2MzAwLDB4MmUyZTJlMDAsCisgICAgMHhlOWU5ZTkwMCwweDc5Nzk3OTAwLDB4YTdhN2E3MDAsMHg4YzhjOGMwMCwKKyAgICAweDlmOWY5ZjAwLDB4NmU2ZTZlMDAsMHhiY2JjYmMwMCwweDhlOGU4ZTAwLAorICAgIDB4MjkyOTI5MDAsMHhmNWY1ZjUwMCwweGY5ZjlmOTAwLDB4YjZiNmI2MDAsCisgICAgMHgyZjJmMmYwMCwweGZkZmRmZDAwLDB4YjRiNGI0MDAsMHg1OTU5NTkwMCwKKyAgICAweDc4Nzg3ODAwLDB4OTg5ODk4MDAsMHgwNjA2MDYwMCwweDZhNmE2YTAwLAorICAgIDB4ZTdlN2U3MDAsMHg0NjQ2NDYwMCwweDcxNzE3MTAwLDB4YmFiYWJhMDAsCisgICAgMHhkNGQ0ZDQwMCwweDI1MjUyNTAwLDB4YWJhYmFiMDAsMHg0MjQyNDIwMCwKKyAgICAweDg4ODg4ODAwLDB4YTJhMmEyMDAsMHg4ZDhkOGQwMCwweGZhZmFmYTAwLAorICAgIDB4NzI3MjcyMDAsMHgwNzA3MDcwMCwweGI5YjliOTAwLDB4NTU1NTU1MDAsCisgICAgMHhmOGY4ZjgwMCwweGVlZWVlZTAwLDB4YWNhY2FjMDAsMHgwYTBhMGEwMCwKKyAgICAweDM2MzYzNjAwLDB4NDk0OTQ5MDAsMHgyYTJhMmEwMCwweDY4Njg2ODAwLAorICAgIDB4M2MzYzNjMDAsMHgzODM4MzgwMCwweGYxZjFmMTAwLDB4YTRhNGE0MDAsCisgICAgMHg0MDQwNDAwMCwweDI4MjgyODAwLDB4ZDNkM2QzMDAsMHg3YjdiN2IwMCwKKyAgICAweGJiYmJiYjAwLDB4YzljOWM5MDAsMHg0MzQzNDMwMCwweGMxYzFjMTAwLAorICAgIDB4MTUxNTE1MDAsMHhlM2UzZTMwMCwweGFkYWRhZDAwLDB4ZjRmNGY0MDAsCisgICAgMHg3Nzc3NzcwMCwweGM3YzdjNzAwLDB4ODA4MDgwMDAsMHg5ZTllOWUwMCwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgY2FtZWxsaWFfc3AwMjIyWzI1Nl0gPSB7CisgICAgMHgwMGUwZTBlMCwweDAwMDUwNTA1LDB4MDA1ODU4NTgsMHgwMGQ5ZDlkOSwKKyAgICAweDAwNjc2NzY3LDB4MDA0ZTRlNGUsMHgwMDgxODE4MSwweDAwY2JjYmNiLAorICAgIDB4MDBjOWM5YzksMHgwMDBiMGIwYiwweDAwYWVhZWFlLDB4MDA2YTZhNmEsCisgICAgMHgwMGQ1ZDVkNSwweDAwMTgxODE4LDB4MDA1ZDVkNWQsMHgwMDgyODI4MiwKKyAgICAweDAwNDY0NjQ2LDB4MDBkZmRmZGYsMHgwMGQ2ZDZkNiwweDAwMjcyNzI3LAorICAgIDB4MDA4YThhOGEsMHgwMDMyMzIzMiwweDAwNGI0YjRiLDB4MDA0MjQyNDIsCisgICAgMHgwMGRiZGJkYiwweDAwMWMxYzFjLDB4MDA5ZTllOWUsMHgwMDljOWM5YywKKyAgICAweDAwM2EzYTNhLDB4MDBjYWNhY2EsMHgwMDI1MjUyNSwweDAwN2I3YjdiLAorICAgIDB4MDAwZDBkMGQsMHgwMDcxNzE3MSwweDAwNWY1ZjVmLDB4MDAxZjFmMWYsCisgICAgMHgwMGY4ZjhmOCwweDAwZDdkN2Q3LDB4MDAzZTNlM2UsMHgwMDlkOWQ5ZCwKKyAgICAweDAwN2M3YzdjLDB4MDA2MDYwNjAsMHgwMGI5YjliOSwweDAwYmViZWJlLAorICAgIDB4MDBiY2JjYmMsMHgwMDhiOGI4YiwweDAwMTYxNjE2LDB4MDAzNDM0MzQsCisgICAgMHgwMDRkNGQ0ZCwweDAwYzNjM2MzLDB4MDA3MjcyNzIsMHgwMDk1OTU5NSwKKyAgICAweDAwYWJhYmFiLDB4MDA4ZThlOGUsMHgwMGJhYmFiYSwweDAwN2E3YTdhLAorICAgIDB4MDBiM2IzYjMsMHgwMDAyMDIwMiwweDAwYjRiNGI0LDB4MDBhZGFkYWQsCisgICAgMHgwMGEyYTJhMiwweDAwYWNhY2FjLDB4MDBkOGQ4ZDgsMHgwMDlhOWE5YSwKKyAgICAweDAwMTcxNzE3LDB4MDAxYTFhMWEsMHgwMDM1MzUzNSwweDAwY2NjY2NjLAorICAgIDB4MDBmN2Y3ZjcsMHgwMDk5OTk5OSwweDAwNjE2MTYxLDB4MDA1YTVhNWEsCisgICAgMHgwMGU4ZThlOCwweDAwMjQyNDI0LDB4MDA1NjU2NTYsMHgwMDQwNDA0MCwKKyAgICAweDAwZTFlMWUxLDB4MDA2MzYzNjMsMHgwMDA5MDkwOSwweDAwMzMzMzMzLAorICAgIDB4MDBiZmJmYmYsMHgwMDk4OTg5OCwweDAwOTc5Nzk3LDB4MDA4NTg1ODUsCisgICAgMHgwMDY4Njg2OCwweDAwZmNmY2ZjLDB4MDBlY2VjZWMsMHgwMDBhMGEwYSwKKyAgICAweDAwZGFkYWRhLDB4MDA2ZjZmNmYsMHgwMDUzNTM1MywweDAwNjI2MjYyLAorICAgIDB4MDBhM2EzYTMsMHgwMDJlMmUyZSwweDAwMDgwODA4LDB4MDBhZmFmYWYsCisgICAgMHgwMDI4MjgyOCwweDAwYjBiMGIwLDB4MDA3NDc0NzQsMHgwMGMyYzJjMiwKKyAgICAweDAwYmRiZGJkLDB4MDAzNjM2MzYsMHgwMDIyMjIyMiwweDAwMzgzODM4LAorICAgIDB4MDA2NDY0NjQsMHgwMDFlMWUxZSwweDAwMzkzOTM5LDB4MDAyYzJjMmMsCisgICAgMHgwMGE2YTZhNiwweDAwMzAzMDMwLDB4MDBlNWU1ZTUsMHgwMDQ0NDQ0NCwKKyAgICAweDAwZmRmZGZkLDB4MDA4ODg4ODgsMHgwMDlmOWY5ZiwweDAwNjU2NTY1LAorICAgIDB4MDA4Nzg3ODcsMHgwMDZiNmI2YiwweDAwZjRmNGY0LDB4MDAyMzIzMjMsCisgICAgMHgwMDQ4NDg0OCwweDAwMTAxMDEwLDB4MDBkMWQxZDEsMHgwMDUxNTE1MSwKKyAgICAweDAwYzBjMGMwLDB4MDBmOWY5ZjksMHgwMGQyZDJkMiwweDAwYTBhMGEwLAorICAgIDB4MDA1NTU1NTUsMHgwMGExYTFhMSwweDAwNDE0MTQxLDB4MDBmYWZhZmEsCisgICAgMHgwMDQzNDM0MywweDAwMTMxMzEzLDB4MDBjNGM0YzQsMHgwMDJmMmYyZiwKKyAgICAweDAwYThhOGE4LDB4MDBiNmI2YjYsMHgwMDNjM2MzYywweDAwMmIyYjJiLAorICAgIDB4MDBjMWMxYzEsMHgwMGZmZmZmZiwweDAwYzhjOGM4LDB4MDBhNWE1YTUsCisgICAgMHgwMDIwMjAyMCwweDAwODk4OTg5LDB4MDAwMDAwMDAsMHgwMDkwOTA5MCwKKyAgICAweDAwNDc0NzQ3LDB4MDBlZmVmZWYsMHgwMGVhZWFlYSwweDAwYjdiN2I3LAorICAgIDB4MDAxNTE1MTUsMHgwMDA2MDYwNiwweDAwY2RjZGNkLDB4MDBiNWI1YjUsCisgICAgMHgwMDEyMTIxMiwweDAwN2U3ZTdlLDB4MDBiYmJiYmIsMHgwMDI5MjkyOSwKKyAgICAweDAwMGYwZjBmLDB4MDBiOGI4YjgsMHgwMDA3MDcwNywweDAwMDQwNDA0LAorICAgIDB4MDA5YjliOWIsMHgwMDk0OTQ5NCwweDAwMjEyMTIxLDB4MDA2NjY2NjYsCisgICAgMHgwMGU2ZTZlNiwweDAwY2VjZWNlLDB4MDBlZGVkZWQsMHgwMGU3ZTdlNywKKyAgICAweDAwM2IzYjNiLDB4MDBmZWZlZmUsMHgwMDdmN2Y3ZiwweDAwYzVjNWM1LAorICAgIDB4MDBhNGE0YTQsMHgwMDM3MzczNywweDAwYjFiMWIxLDB4MDA0YzRjNGMsCisgICAgMHgwMDkxOTE5MSwweDAwNmU2ZTZlLDB4MDA4ZDhkOGQsMHgwMDc2NzY3NiwKKyAgICAweDAwMDMwMzAzLDB4MDAyZDJkMmQsMHgwMGRlZGVkZSwweDAwOTY5Njk2LAorICAgIDB4MDAyNjI2MjYsMHgwMDdkN2Q3ZCwweDAwYzZjNmM2LDB4MDA1YzVjNWMsCisgICAgMHgwMGQzZDNkMywweDAwZjJmMmYyLDB4MDA0ZjRmNGYsMHgwMDE5MTkxOSwKKyAgICAweDAwM2YzZjNmLDB4MDBkY2RjZGMsMHgwMDc5Nzk3OSwweDAwMWQxZDFkLAorICAgIDB4MDA1MjUyNTIsMHgwMGViZWJlYiwweDAwZjNmM2YzLDB4MDA2ZDZkNmQsCisgICAgMHgwMDVlNWU1ZSwweDAwZmJmYmZiLDB4MDA2OTY5NjksMHgwMGIyYjJiMiwKKyAgICAweDAwZjBmMGYwLDB4MDAzMTMxMzEsMHgwMDBjMGMwYywweDAwZDRkNGQ0LAorICAgIDB4MDBjZmNmY2YsMHgwMDhjOGM4YywweDAwZTJlMmUyLDB4MDA3NTc1NzUsCisgICAgMHgwMGE5YTlhOSwweDAwNGE0YTRhLDB4MDA1NzU3NTcsMHgwMDg0ODQ4NCwKKyAgICAweDAwMTExMTExLDB4MDA0NTQ1NDUsMHgwMDFiMWIxYiwweDAwZjVmNWY1LAorICAgIDB4MDBlNGU0ZTQsMHgwMDBlMGUwZSwweDAwNzM3MzczLDB4MDBhYWFhYWEsCisgICAgMHgwMGYxZjFmMSwweDAwZGRkZGRkLDB4MDA1OTU5NTksMHgwMDE0MTQxNCwKKyAgICAweDAwNmM2YzZjLDB4MDA5MjkyOTIsMHgwMDU0NTQ1NCwweDAwZDBkMGQwLAorICAgIDB4MDA3ODc4NzgsMHgwMDcwNzA3MCwweDAwZTNlM2UzLDB4MDA0OTQ5NDksCisgICAgMHgwMDgwODA4MCwweDAwNTA1MDUwLDB4MDBhN2E3YTcsMHgwMGY2ZjZmNiwKKyAgICAweDAwNzc3Nzc3LDB4MDA5MzkzOTMsMHgwMDg2ODY4NiwweDAwODM4MzgzLAorICAgIDB4MDAyYTJhMmEsMHgwMGM3YzdjNywweDAwNWI1YjViLDB4MDBlOWU5ZTksCisgICAgMHgwMGVlZWVlZSwweDAwOGY4ZjhmLDB4MDAwMTAxMDEsMHgwMDNkM2QzZCwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgY2FtZWxsaWFfc3AzMDMzWzI1Nl0gPSB7CisgICAgMHgzODAwMzgzOCwweDQxMDA0MTQxLDB4MTYwMDE2MTYsMHg3NjAwNzY3NiwKKyAgICAweGQ5MDBkOWQ5LDB4OTMwMDkzOTMsMHg2MDAwNjA2MCwweGYyMDBmMmYyLAorICAgIDB4NzIwMDcyNzIsMHhjMjAwYzJjMiwweGFiMDBhYmFiLDB4OWEwMDlhOWEsCisgICAgMHg3NTAwNzU3NSwweDA2MDAwNjA2LDB4NTcwMDU3NTcsMHhhMDAwYTBhMCwKKyAgICAweDkxMDA5MTkxLDB4ZjcwMGY3ZjcsMHhiNTAwYjViNSwweGM5MDBjOWM5LAorICAgIDB4YTIwMGEyYTIsMHg4YzAwOGM4YywweGQyMDBkMmQyLDB4OTAwMDkwOTAsCisgICAgMHhmNjAwZjZmNiwweDA3MDAwNzA3LDB4YTcwMGE3YTcsMHgyNzAwMjcyNywKKyAgICAweDhlMDA4ZThlLDB4YjIwMGIyYjIsMHg0OTAwNDk0OSwweGRlMDBkZWRlLAorICAgIDB4NDMwMDQzNDMsMHg1YzAwNWM1YywweGQ3MDBkN2Q3LDB4YzcwMGM3YzcsCisgICAgMHgzZTAwM2UzZSwweGY1MDBmNWY1LDB4OGYwMDhmOGYsMHg2NzAwNjc2NywKKyAgICAweDFmMDAxZjFmLDB4MTgwMDE4MTgsMHg2ZTAwNmU2ZSwweGFmMDBhZmFmLAorICAgIDB4MmYwMDJmMmYsMHhlMjAwZTJlMiwweDg1MDA4NTg1LDB4MGQwMDBkMGQsCisgICAgMHg1MzAwNTM1MywweGYwMDBmMGYwLDB4OWMwMDljOWMsMHg2NTAwNjU2NSwKKyAgICAweGVhMDBlYWVhLDB4YTMwMGEzYTMsMHhhZTAwYWVhZSwweDllMDA5ZTllLAorICAgIDB4ZWMwMGVjZWMsMHg4MDAwODA4MCwweDJkMDAyZDJkLDB4NmIwMDZiNmIsCisgICAgMHhhODAwYThhOCwweDJiMDAyYjJiLDB4MzYwMDM2MzYsMHhhNjAwYTZhNiwKKyAgICAweGM1MDBjNWM1LDB4ODYwMDg2ODYsMHg0ZDAwNGQ0ZCwweDMzMDAzMzMzLAorICAgIDB4ZmQwMGZkZmQsMHg2NjAwNjY2NiwweDU4MDA1ODU4LDB4OTYwMDk2OTYsCisgICAgMHgzYTAwM2EzYSwweDA5MDAwOTA5LDB4OTUwMDk1OTUsMHgxMDAwMTAxMCwKKyAgICAweDc4MDA3ODc4LDB4ZDgwMGQ4ZDgsMHg0MjAwNDI0MiwweGNjMDBjY2NjLAorICAgIDB4ZWYwMGVmZWYsMHgyNjAwMjYyNiwweGU1MDBlNWU1LDB4NjEwMDYxNjEsCisgICAgMHgxYTAwMWExYSwweDNmMDAzZjNmLDB4M2IwMDNiM2IsMHg4MjAwODI4MiwKKyAgICAweGI2MDBiNmI2LDB4ZGIwMGRiZGIsMHhkNDAwZDRkNCwweDk4MDA5ODk4LAorICAgIDB4ZTgwMGU4ZTgsMHg4YjAwOGI4YiwweDAyMDAwMjAyLDB4ZWIwMGViZWIsCisgICAgMHgwYTAwMGEwYSwweDJjMDAyYzJjLDB4MWQwMDFkMWQsMHhiMDAwYjBiMCwKKyAgICAweDZmMDA2ZjZmLDB4OGQwMDhkOGQsMHg4ODAwODg4OCwweDBlMDAwZTBlLAorICAgIDB4MTkwMDE5MTksMHg4NzAwODc4NywweDRlMDA0ZTRlLDB4MGIwMDBiMGIsCisgICAgMHhhOTAwYTlhOSwweDBjMDAwYzBjLDB4NzkwMDc5NzksMHgxMTAwMTExMSwKKyAgICAweDdmMDA3ZjdmLDB4MjIwMDIyMjIsMHhlNzAwZTdlNywweDU5MDA1OTU5LAorICAgIDB4ZTEwMGUxZTEsMHhkYTAwZGFkYSwweDNkMDAzZDNkLDB4YzgwMGM4YzgsCisgICAgMHgxMjAwMTIxMiwweDA0MDAwNDA0LDB4NzQwMDc0NzQsMHg1NDAwNTQ1NCwKKyAgICAweDMwMDAzMDMwLDB4N2UwMDdlN2UsMHhiNDAwYjRiNCwweDI4MDAyODI4LAorICAgIDB4NTUwMDU1NTUsMHg2ODAwNjg2OCwweDUwMDA1MDUwLDB4YmUwMGJlYmUsCisgICAgMHhkMDAwZDBkMCwweGM0MDBjNGM0LDB4MzEwMDMxMzEsMHhjYjAwY2JjYiwKKyAgICAweDJhMDAyYTJhLDB4YWQwMGFkYWQsMHgwZjAwMGYwZiwweGNhMDBjYWNhLAorICAgIDB4NzAwMDcwNzAsMHhmZjAwZmZmZiwweDMyMDAzMjMyLDB4NjkwMDY5NjksCisgICAgMHgwODAwMDgwOCwweDYyMDA2MjYyLDB4MDAwMDAwMDAsMHgyNDAwMjQyNCwKKyAgICAweGQxMDBkMWQxLDB4ZmIwMGZiZmIsMHhiYTAwYmFiYSwweGVkMDBlZGVkLAorICAgIDB4NDUwMDQ1NDUsMHg4MTAwODE4MSwweDczMDA3MzczLDB4NmQwMDZkNmQsCisgICAgMHg4NDAwODQ4NCwweDlmMDA5ZjlmLDB4ZWUwMGVlZWUsMHg0YTAwNGE0YSwKKyAgICAweGMzMDBjM2MzLDB4MmUwMDJlMmUsMHhjMTAwYzFjMSwweDAxMDAwMTAxLAorICAgIDB4ZTYwMGU2ZTYsMHgyNTAwMjUyNSwweDQ4MDA0ODQ4LDB4OTkwMDk5OTksCisgICAgMHhiOTAwYjliOSwweGIzMDBiM2IzLDB4N2IwMDdiN2IsMHhmOTAwZjlmOSwKKyAgICAweGNlMDBjZWNlLDB4YmYwMGJmYmYsMHhkZjAwZGZkZiwweDcxMDA3MTcxLAorICAgIDB4MjkwMDI5MjksMHhjZDAwY2RjZCwweDZjMDA2YzZjLDB4MTMwMDEzMTMsCisgICAgMHg2NDAwNjQ2NCwweDliMDA5YjliLDB4NjMwMDYzNjMsMHg5ZDAwOWQ5ZCwKKyAgICAweGMwMDBjMGMwLDB4NGIwMDRiNGIsMHhiNzAwYjdiNywweGE1MDBhNWE1LAorICAgIDB4ODkwMDg5ODksMHg1ZjAwNWY1ZiwweGIxMDBiMWIxLDB4MTcwMDE3MTcsCisgICAgMHhmNDAwZjRmNCwweGJjMDBiY2JjLDB4ZDMwMGQzZDMsMHg0NjAwNDY0NiwKKyAgICAweGNmMDBjZmNmLDB4MzcwMDM3MzcsMHg1ZTAwNWU1ZSwweDQ3MDA0NzQ3LAorICAgIDB4OTQwMDk0OTQsMHhmYTAwZmFmYSwweGZjMDBmY2ZjLDB4NWIwMDViNWIsCisgICAgMHg5NzAwOTc5NywweGZlMDBmZWZlLDB4NWEwMDVhNWEsMHhhYzAwYWNhYywKKyAgICAweDNjMDAzYzNjLDB4NGMwMDRjNGMsMHgwMzAwMDMwMywweDM1MDAzNTM1LAorICAgIDB4ZjMwMGYzZjMsMHgyMzAwMjMyMywweGI4MDBiOGI4LDB4NWQwMDVkNWQsCisgICAgMHg2YTAwNmE2YSwweDkyMDA5MjkyLDB4ZDUwMGQ1ZDUsMHgyMTAwMjEyMSwKKyAgICAweDQ0MDA0NDQ0LDB4NTEwMDUxNTEsMHhjNjAwYzZjNiwweDdkMDA3ZDdkLAorICAgIDB4MzkwMDM5MzksMHg4MzAwODM4MywweGRjMDBkY2RjLDB4YWEwMGFhYWEsCisgICAgMHg3YzAwN2M3YywweDc3MDA3Nzc3LDB4NTYwMDU2NTYsMHgwNTAwMDUwNSwKKyAgICAweDFiMDAxYjFiLDB4YTQwMGE0YTQsMHgxNTAwMTUxNSwweDM0MDAzNDM0LAorICAgIDB4MWUwMDFlMWUsMHgxYzAwMWMxYywweGY4MDBmOGY4LDB4NTIwMDUyNTIsCisgICAgMHgyMDAwMjAyMCwweDE0MDAxNDE0LDB4ZTkwMGU5ZTksMHhiZDAwYmRiZCwKKyAgICAweGRkMDBkZGRkLDB4ZTQwMGU0ZTQsMHhhMTAwYTFhMSwweGUwMDBlMGUwLAorICAgIDB4OGEwMDhhOGEsMHhmMTAwZjFmMSwweGQ2MDBkNmQ2LDB4N2EwMDdhN2EsCisgICAgMHhiYjAwYmJiYiwweGUzMDBlM2UzLDB4NDAwMDQwNDAsMHg0ZjAwNGY0ZiwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgY2FtZWxsaWFfc3A0NDA0WzI1Nl0gPSB7CisgICAgMHg3MDcwMDA3MCwweDJjMmMwMDJjLDB4YjNiMzAwYjMsMHhjMGMwMDBjMCwKKyAgICAweGU0ZTQwMGU0LDB4NTc1NzAwNTcsMHhlYWVhMDBlYSwweGFlYWUwMGFlLAorICAgIDB4MjMyMzAwMjMsMHg2YjZiMDA2YiwweDQ1NDUwMDQ1LDB4YTVhNTAwYTUsCisgICAgMHhlZGVkMDBlZCwweDRmNGYwMDRmLDB4MWQxZDAwMWQsMHg5MjkyMDA5MiwKKyAgICAweDg2ODYwMDg2LDB4YWZhZjAwYWYsMHg3YzdjMDA3YywweDFmMWYwMDFmLAorICAgIDB4M2UzZTAwM2UsMHhkY2RjMDBkYywweDVlNWUwMDVlLDB4MGIwYjAwMGIsCisgICAgMHhhNmE2MDBhNiwweDM5MzkwMDM5LDB4ZDVkNTAwZDUsMHg1ZDVkMDA1ZCwKKyAgICAweGQ5ZDkwMGQ5LDB4NWE1YTAwNWEsMHg1MTUxMDA1MSwweDZjNmMwMDZjLAorICAgIDB4OGI4YjAwOGIsMHg5YTlhMDA5YSwweGZiZmIwMGZiLDB4YjBiMDAwYjAsCisgICAgMHg3NDc0MDA3NCwweDJiMmIwMDJiLDB4ZjBmMDAwZjAsMHg4NDg0MDA4NCwKKyAgICAweGRmZGYwMGRmLDB4Y2JjYjAwY2IsMHgzNDM0MDAzNCwweDc2NzYwMDc2LAorICAgIDB4NmQ2ZDAwNmQsMHhhOWE5MDBhOSwweGQxZDEwMGQxLDB4MDQwNDAwMDQsCisgICAgMHgxNDE0MDAxNCwweDNhM2EwMDNhLDB4ZGVkZTAwZGUsMHgxMTExMDAxMSwKKyAgICAweDMyMzIwMDMyLDB4OWM5YzAwOWMsMHg1MzUzMDA1MywweGYyZjIwMGYyLAorICAgIDB4ZmVmZTAwZmUsMHhjZmNmMDBjZiwweGMzYzMwMGMzLDB4N2E3YTAwN2EsCisgICAgMHgyNDI0MDAyNCwweGU4ZTgwMGU4LDB4NjA2MDAwNjAsMHg2OTY5MDA2OSwKKyAgICAweGFhYWEwMGFhLDB4YTBhMDAwYTAsMHhhMWExMDBhMSwweDYyNjIwMDYyLAorICAgIDB4NTQ1NDAwNTQsMHgxZTFlMDAxZSwweGUwZTAwMGUwLDB4NjQ2NDAwNjQsCisgICAgMHgxMDEwMDAxMCwweDAwMDAwMDAwLDB4YTNhMzAwYTMsMHg3NTc1MDA3NSwKKyAgICAweDhhOGEwMDhhLDB4ZTZlNjAwZTYsMHgwOTA5MDAwOSwweGRkZGQwMGRkLAorICAgIDB4ODc4NzAwODcsMHg4MzgzMDA4MywweGNkY2QwMGNkLDB4OTA5MDAwOTAsCisgICAgMHg3MzczMDA3MywweGY2ZjYwMGY2LDB4OWQ5ZDAwOWQsMHhiZmJmMDBiZiwKKyAgICAweDUyNTIwMDUyLDB4ZDhkODAwZDgsMHhjOGM4MDBjOCwweGM2YzYwMGM2LAorICAgIDB4ODE4MTAwODEsMHg2ZjZmMDA2ZiwweDEzMTMwMDEzLDB4NjM2MzAwNjMsCisgICAgMHhlOWU5MDBlOSwweGE3YTcwMGE3LDB4OWY5ZjAwOWYsMHhiY2JjMDBiYywKKyAgICAweDI5MjkwMDI5LDB4ZjlmOTAwZjksMHgyZjJmMDAyZiwweGI0YjQwMGI0LAorICAgIDB4Nzg3ODAwNzgsMHgwNjA2MDAwNiwweGU3ZTcwMGU3LDB4NzE3MTAwNzEsCisgICAgMHhkNGQ0MDBkNCwweGFiYWIwMGFiLDB4ODg4ODAwODgsMHg4ZDhkMDA4ZCwKKyAgICAweDcyNzIwMDcyLDB4YjliOTAwYjksMHhmOGY4MDBmOCwweGFjYWMwMGFjLAorICAgIDB4MzYzNjAwMzYsMHgyYTJhMDAyYSwweDNjM2MwMDNjLDB4ZjFmMTAwZjEsCisgICAgMHg0MDQwMDA0MCwweGQzZDMwMGQzLDB4YmJiYjAwYmIsMHg0MzQzMDA0MywKKyAgICAweDE1MTUwMDE1LDB4YWRhZDAwYWQsMHg3Nzc3MDA3NywweDgwODAwMDgwLAorICAgIDB4ODI4MjAwODIsMHhlY2VjMDBlYywweDI3MjcwMDI3LDB4ZTVlNTAwZTUsCisgICAgMHg4NTg1MDA4NSwweDM1MzUwMDM1LDB4MGMwYzAwMGMsMHg0MTQxMDA0MSwKKyAgICAweGVmZWYwMGVmLDB4OTM5MzAwOTMsMHgxOTE5MDAxOSwweDIxMjEwMDIxLAorICAgIDB4MGUwZTAwMGUsMHg0ZTRlMDA0ZSwweDY1NjUwMDY1LDB4YmRiZDAwYmQsCisgICAgMHhiOGI4MDBiOCwweDhmOGYwMDhmLDB4ZWJlYjAwZWIsMHhjZWNlMDBjZSwKKyAgICAweDMwMzAwMDMwLDB4NWY1ZjAwNWYsMHhjNWM1MDBjNSwweDFhMWEwMDFhLAorICAgIDB4ZTFlMTAwZTEsMHhjYWNhMDBjYSwweDQ3NDcwMDQ3LDB4M2QzZDAwM2QsCisgICAgMHgwMTAxMDAwMSwweGQ2ZDYwMGQ2LDB4NTY1NjAwNTYsMHg0ZDRkMDA0ZCwKKyAgICAweDBkMGQwMDBkLDB4NjY2NjAwNjYsMHhjY2NjMDBjYywweDJkMmQwMDJkLAorICAgIDB4MTIxMjAwMTIsMHgyMDIwMDAyMCwweGIxYjEwMGIxLDB4OTk5OTAwOTksCisgICAgMHg0YzRjMDA0YywweGMyYzIwMGMyLDB4N2U3ZTAwN2UsMHgwNTA1MDAwNSwKKyAgICAweGI3YjcwMGI3LDB4MzEzMTAwMzEsMHgxNzE3MDAxNywweGQ3ZDcwMGQ3LAorICAgIDB4NTg1ODAwNTgsMHg2MTYxMDA2MSwweDFiMWIwMDFiLDB4MWMxYzAwMWMsCisgICAgMHgwZjBmMDAwZiwweDE2MTYwMDE2LDB4MTgxODAwMTgsMHgyMjIyMDAyMiwKKyAgICAweDQ0NDQwMDQ0LDB4YjJiMjAwYjIsMHhiNWI1MDBiNSwweDkxOTEwMDkxLAorICAgIDB4MDgwODAwMDgsMHhhOGE4MDBhOCwweGZjZmMwMGZjLDB4NTA1MDAwNTAsCisgICAgMHhkMGQwMDBkMCwweDdkN2QwMDdkLDB4ODk4OTAwODksMHg5Nzk3MDA5NywKKyAgICAweDViNWIwMDViLDB4OTU5NTAwOTUsMHhmZmZmMDBmZiwweGQyZDIwMGQyLAorICAgIDB4YzRjNDAwYzQsMHg0ODQ4MDA0OCwweGY3ZjcwMGY3LDB4ZGJkYjAwZGIsCisgICAgMHgwMzAzMDAwMywweGRhZGEwMGRhLDB4M2YzZjAwM2YsMHg5NDk0MDA5NCwKKyAgICAweDVjNWMwMDVjLDB4MDIwMjAwMDIsMHg0YTRhMDA0YSwweDMzMzMwMDMzLAorICAgIDB4Njc2NzAwNjcsMHhmM2YzMDBmMywweDdmN2YwMDdmLDB4ZTJlMjAwZTIsCisgICAgMHg5YjliMDA5YiwweDI2MjYwMDI2LDB4MzczNzAwMzcsMHgzYjNiMDAzYiwKKyAgICAweDk2OTYwMDk2LDB4NGI0YjAwNGIsMHhiZWJlMDBiZSwweDJlMmUwMDJlLAorICAgIDB4Nzk3OTAwNzksMHg4YzhjMDA4YywweDZlNmUwMDZlLDB4OGU4ZTAwOGUsCisgICAgMHhmNWY1MDBmNSwweGI2YjYwMGI2LDB4ZmRmZDAwZmQsMHg1OTU5MDA1OSwKKyAgICAweDk4OTgwMDk4LDB4NmE2YTAwNmEsMHg0NjQ2MDA0NiwweGJhYmEwMGJhLAorICAgIDB4MjUyNTAwMjUsMHg0MjQyMDA0MiwweGEyYTIwMGEyLDB4ZmFmYTAwZmEsCisgICAgMHgwNzA3MDAwNywweDU1NTUwMDU1LDB4ZWVlZTAwZWUsMHgwYTBhMDAwYSwKKyAgICAweDQ5NDkwMDQ5LDB4Njg2ODAwNjgsMHgzODM4MDAzOCwweGE0YTQwMGE0LAorICAgIDB4MjgyODAwMjgsMHg3YjdiMDA3YiwweGM5YzkwMGM5LDB4YzFjMTAwYzEsCisgICAgMHhlM2UzMDBlMywweGY0ZjQwMGY0LDB4YzdjNzAwYzcsMHg5ZTllMDA5ZSwKK307CisKKworLyoqCisgKiBTdHVmZiByZWxhdGVkIHRvIHRoZSBDYW1lbGxpYSBrZXkgc2NoZWR1bGUKKyAqLworI2RlZmluZSBzdWJsKHgpIHN1YkxbKHgpXQorI2RlZmluZSBzdWJyKHgpIHN1YlJbKHgpXQorCit2b2lkIGNhbWVsbGlhX3NldHVwMTI4KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgdTMyICpzdWJrZXkpCit7CisgICAgdTMyIGtsbCwga2xyLCBrcmwsIGtycjsKKyAgICB1MzIgaWwsIGlyLCB0MCwgdDEsIHcwLCB3MTsKKyAgICB1MzIga3c0bCwga3c0ciwgZHcsIHRsLCB0cjsKKyAgICB1MzIgc3ViTFsyNl07CisgICAgdTMyIHN1YlJbMjZdOworCisgICAgLyoqCisgICAgICogIGsgPT0ga2xsIHx8IGtsciB8fCBrcmwgfHwga3JyICh8fCBpcyBjb25jYXRpbmF0aW9uKQorICAgICAqLworICAgIGtsbCA9IEdFVFUzMihrZXkgICAgICk7CisgICAga2xyID0gR0VUVTMyKGtleSArICA0KTsKKyAgICBrcmwgPSBHRVRVMzIoa2V5ICsgIDgpOworICAgIGtyciA9IEdFVFUzMihrZXkgKyAxMik7CisgICAgLyoqCisgICAgICogZ2VuZXJhdGUgS0wgZGVwZW5kZW50IHN1YmtleXMKKyAgICAgKi8KKyAgICBzdWJsKDApID0ga2xsOyBzdWJyKDApID0ga2xyOworICAgIHN1YmwoMSkgPSBrcmw7IHN1YnIoMSkgPSBrcnI7CisgICAgQ0FNRUxMSUFfUk9MRFEoa2xsLCBrbHIsIGtybCwga3JyLCB3MCwgdzEsIDE1KTsKKyAgICBzdWJsKDQpID0ga2xsOyBzdWJyKDQpID0ga2xyOworICAgIHN1YmwoNSkgPSBrcmw7IHN1YnIoNSkgPSBrcnI7CisgICAgQ0FNRUxMSUFfUk9MRFEoa2xsLCBrbHIsIGtybCwga3JyLCB3MCwgdzEsIDMwKTsKKyAgICBzdWJsKDEwKSA9IGtsbDsgc3VicigxMCkgPSBrbHI7CisgICAgc3VibCgxMSkgPSBrcmw7IHN1YnIoMTEpID0ga3JyOworICAgIENBTUVMTElBX1JPTERRKGtsbCwga2xyLCBrcmwsIGtyciwgdzAsIHcxLCAxNSk7CisgICAgc3VibCgxMykgPSBrcmw7IHN1YnIoMTMpID0ga3JyOworICAgIENBTUVMTElBX1JPTERRKGtsbCwga2xyLCBrcmwsIGtyciwgdzAsIHcxLCAxNyk7CisgICAgc3VibCgxNikgPSBrbGw7IHN1YnIoMTYpID0ga2xyOworICAgIHN1YmwoMTcpID0ga3JsOyBzdWJyKDE3KSA9IGtycjsKKyAgICBDQU1FTExJQV9ST0xEUShrbGwsIGtsciwga3JsLCBrcnIsIHcwLCB3MSwgMTcpOworICAgIHN1YmwoMTgpID0ga2xsOyBzdWJyKDE4KSA9IGtscjsKKyAgICBzdWJsKDE5KSA9IGtybDsgc3VicigxOSkgPSBrcnI7CisgICAgQ0FNRUxMSUFfUk9MRFEoa2xsLCBrbHIsIGtybCwga3JyLCB3MCwgdzEsIDE3KTsKKyAgICBzdWJsKDIyKSA9IGtsbDsgc3VicigyMikgPSBrbHI7CisgICAgc3VibCgyMykgPSBrcmw7IHN1YnIoMjMpID0ga3JyOworCisgICAgLyogZ2VuZXJhdGUgS0EgKi8KKyAgICBrbGwgPSBzdWJsKDApOyBrbHIgPSBzdWJyKDApOworICAgIGtybCA9IHN1YmwoMSk7IGtyciA9IHN1YnIoMSk7CisgICAgQ0FNRUxMSUFfRihrbGwsIGtsciwKKwkgICAgICAgQ0FNRUxMSUFfU0lHTUExTCwgQ0FNRUxMSUFfU0lHTUExUiwKKwkgICAgICAgdzAsIHcxLCBpbCwgaXIsIHQwLCB0MSk7CisgICAga3JsIF49IHcwOyBrcnIgXj0gdzE7CisgICAgQ0FNRUxMSUFfRihrcmwsIGtyciwKKwkgICAgICAgQ0FNRUxMSUFfU0lHTUEyTCwgQ0FNRUxMSUFfU0lHTUEyUiwKKwkgICAgICAga2xsLCBrbHIsIGlsLCBpciwgdDAsIHQxKTsKKyAgICBDQU1FTExJQV9GKGtsbCwga2xyLAorCSAgICAgICBDQU1FTExJQV9TSUdNQTNMLCBDQU1FTExJQV9TSUdNQTNSLAorCSAgICAgICBrcmwsIGtyciwgaWwsIGlyLCB0MCwgdDEpOworICAgIGtybCBePSB3MDsga3JyIF49IHcxOworICAgIENBTUVMTElBX0Yoa3JsLCBrcnIsCisJICAgICAgIENBTUVMTElBX1NJR01BNEwsIENBTUVMTElBX1NJR01BNFIsCisJICAgICAgIHcwLCB3MSwgaWwsIGlyLCB0MCwgdDEpOworICAgIGtsbCBePSB3MDsga2xyIF49IHcxOworCisgICAgLyogZ2VuZXJhdGUgS0EgZGVwZW5kZW50IHN1YmtleXMgKi8KKyAgICBzdWJsKDIpID0ga2xsOyBzdWJyKDIpID0ga2xyOworICAgIHN1YmwoMykgPSBrcmw7IHN1YnIoMykgPSBrcnI7CisgICAgQ0FNRUxMSUFfUk9MRFEoa2xsLCBrbHIsIGtybCwga3JyLCB3MCwgdzEsIDE1KTsKKyAgICBzdWJsKDYpID0ga2xsOyBzdWJyKDYpID0ga2xyOworICAgIHN1YmwoNykgPSBrcmw7IHN1YnIoNykgPSBrcnI7CisgICAgQ0FNRUxMSUFfUk9MRFEoa2xsLCBrbHIsIGtybCwga3JyLCB3MCwgdzEsIDE1KTsKKyAgICBzdWJsKDgpID0ga2xsOyBzdWJyKDgpID0ga2xyOworICAgIHN1YmwoOSkgPSBrcmw7IHN1YnIoOSkgPSBrcnI7CisgICAgQ0FNRUxMSUFfUk9MRFEoa2xsLCBrbHIsIGtybCwga3JyLCB3MCwgdzEsIDE1KTsKKyAgICBzdWJsKDEyKSA9IGtsbDsgc3VicigxMikgPSBrbHI7CisgICAgQ0FNRUxMSUFfUk9MRFEoa2xsLCBrbHIsIGtybCwga3JyLCB3MCwgdzEsIDE1KTsKKyAgICBzdWJsKDE0KSA9IGtsbDsgc3VicigxNCkgPSBrbHI7CisgICAgc3VibCgxNSkgPSBrcmw7IHN1YnIoMTUpID0ga3JyOworICAgIENBTUVMTElBX1JPTERRbzMyKGtsbCwga2xyLCBrcmwsIGtyciwgdzAsIHcxLCAzNCk7CisgICAgc3VibCgyMCkgPSBrbGw7IHN1YnIoMjApID0ga2xyOworICAgIHN1YmwoMjEpID0ga3JsOyBzdWJyKDIxKSA9IGtycjsKKyAgICBDQU1FTExJQV9ST0xEUShrbGwsIGtsciwga3JsLCBrcnIsIHcwLCB3MSwgMTcpOworICAgIHN1YmwoMjQpID0ga2xsOyBzdWJyKDI0KSA9IGtscjsKKyAgICBzdWJsKDI1KSA9IGtybDsgc3VicigyNSkgPSBrcnI7CisKKworICAgIC8qIGFic29yYiBrdzIgdG8gb3RoZXIgc3Via2V5cyAqLworICAgIHN1YmwoMykgXj0gc3VibCgxKTsgc3VicigzKSBePSBzdWJyKDEpOworICAgIHN1YmwoNSkgXj0gc3VibCgxKTsgc3Vicig1KSBePSBzdWJyKDEpOworICAgIHN1YmwoNykgXj0gc3VibCgxKTsgc3Vicig3KSBePSBzdWJyKDEpOworICAgIHN1YmwoMSkgXj0gc3VicigxKSAmIH5zdWJyKDkpOworICAgIGR3ID0gc3VibCgxKSAmIHN1YmwoOSksIHN1YnIoMSkgXj0gQ0FNRUxMSUFfUkwxKGR3KTsKKyAgICBzdWJsKDExKSBePSBzdWJsKDEpOyBzdWJyKDExKSBePSBzdWJyKDEpOworICAgIHN1YmwoMTMpIF49IHN1YmwoMSk7IHN1YnIoMTMpIF49IHN1YnIoMSk7CisgICAgc3VibCgxNSkgXj0gc3VibCgxKTsgc3VicigxNSkgXj0gc3VicigxKTsKKyAgICBzdWJsKDEpIF49IHN1YnIoMSkgJiB+c3VicigxNyk7CisgICAgZHcgPSBzdWJsKDEpICYgc3VibCgxNyksIHN1YnIoMSkgXj0gQ0FNRUxMSUFfUkwxKGR3KTsKKyAgICBzdWJsKDE5KSBePSBzdWJsKDEpOyBzdWJyKDE5KSBePSBzdWJyKDEpOworICAgIHN1YmwoMjEpIF49IHN1YmwoMSk7IHN1YnIoMjEpIF49IHN1YnIoMSk7CisgICAgc3VibCgyMykgXj0gc3VibCgxKTsgc3VicigyMykgXj0gc3VicigxKTsKKyAgICBzdWJsKDI0KSBePSBzdWJsKDEpOyBzdWJyKDI0KSBePSBzdWJyKDEpOworCisgICAgLyogYWJzb3JiIGt3NCB0byBvdGhlciBzdWJrZXlzICovCisgICAga3c0bCA9IHN1YmwoMjUpOyBrdzRyID0gc3VicigyNSk7CisgICAgc3VibCgyMikgXj0ga3c0bDsgc3VicigyMikgXj0ga3c0cjsKKyAgICBzdWJsKDIwKSBePSBrdzRsOyBzdWJyKDIwKSBePSBrdzRyOworICAgIHN1YmwoMTgpIF49IGt3NGw7IHN1YnIoMTgpIF49IGt3NHI7CisgICAga3c0bCBePSBrdzRyICYgfnN1YnIoMTYpOworICAgIGR3ID0ga3c0bCAmIHN1YmwoMTYpLCBrdzRyIF49IENBTUVMTElBX1JMMShkdyk7CisgICAgc3VibCgxNCkgXj0ga3c0bDsgc3VicigxNCkgXj0ga3c0cjsKKyAgICBzdWJsKDEyKSBePSBrdzRsOyBzdWJyKDEyKSBePSBrdzRyOworICAgIHN1YmwoMTApIF49IGt3NGw7IHN1YnIoMTApIF49IGt3NHI7CisgICAga3c0bCBePSBrdzRyICYgfnN1YnIoOCk7CisgICAgZHcgPSBrdzRsICYgc3VibCg4KSwga3c0ciBePSBDQU1FTExJQV9STDEoZHcpOworICAgIHN1YmwoNikgXj0ga3c0bDsgc3Vicig2KSBePSBrdzRyOworICAgIHN1YmwoNCkgXj0ga3c0bDsgc3Vicig0KSBePSBrdzRyOworICAgIHN1YmwoMikgXj0ga3c0bDsgc3VicigyKSBePSBrdzRyOworICAgIHN1YmwoMCkgXj0ga3c0bDsgc3VicigwKSBePSBrdzRyOworCisgICAgLyoga2V5IFhPUiBpcyBlbmQgb2YgRi1mdW5jdGlvbiAqLworICAgIENhbWVsbGlhU3Via2V5TCgwKSA9IHN1YmwoMCkgXiBzdWJsKDIpOworICAgIENhbWVsbGlhU3Via2V5UigwKSA9IHN1YnIoMCkgXiBzdWJyKDIpOworICAgIENhbWVsbGlhU3Via2V5TCgyKSA9IHN1YmwoMyk7CisgICAgQ2FtZWxsaWFTdWJrZXlSKDIpID0gc3VicigzKTsKKyAgICBDYW1lbGxpYVN1YmtleUwoMykgPSBzdWJsKDIpIF4gc3VibCg0KTsKKyAgICBDYW1lbGxpYVN1YmtleVIoMykgPSBzdWJyKDIpIF4gc3Vicig0KTsKKyAgICBDYW1lbGxpYVN1YmtleUwoNCkgPSBzdWJsKDMpIF4gc3VibCg1KTsKKyAgICBDYW1lbGxpYVN1YmtleVIoNCkgPSBzdWJyKDMpIF4gc3Vicig1KTsKKyAgICBDYW1lbGxpYVN1YmtleUwoNSkgPSBzdWJsKDQpIF4gc3VibCg2KTsKKyAgICBDYW1lbGxpYVN1YmtleVIoNSkgPSBzdWJyKDQpIF4gc3Vicig2KTsKKyAgICBDYW1lbGxpYVN1YmtleUwoNikgPSBzdWJsKDUpIF4gc3VibCg3KTsKKyAgICBDYW1lbGxpYVN1YmtleVIoNikgPSBzdWJyKDUpIF4gc3Vicig3KTsKKyAgICB0bCA9IHN1YmwoMTApIF4gKHN1YnIoMTApICYgfnN1YnIoOCkpOworICAgIGR3ID0gdGwgJiBzdWJsKDgpLCB0ciA9IHN1YnIoMTApIF4gQ0FNRUxMSUFfUkwxKGR3KTsKKyAgICBDYW1lbGxpYVN1YmtleUwoNykgPSBzdWJsKDYpIF4gdGw7CisgICAgQ2FtZWxsaWFTdWJrZXlSKDcpID0gc3Vicig2KSBeIHRyOworICAgIENhbWVsbGlhU3Via2V5TCg4KSA9IHN1YmwoOCk7CisgICAgQ2FtZWxsaWFTdWJrZXlSKDgpID0gc3Vicig4KTsKKyAgICBDYW1lbGxpYVN1YmtleUwoOSkgPSBzdWJsKDkpOworICAgIENhbWVsbGlhU3Via2V5Uig5KSA9IHN1YnIoOSk7CisgICAgdGwgPSBzdWJsKDcpIF4gKHN1YnIoNykgJiB+c3Vicig5KSk7CisgICAgZHcgPSB0bCAmIHN1YmwoOSksIHRyID0gc3Vicig3KSBeIENBTUVMTElBX1JMMShkdyk7CisgICAgQ2FtZWxsaWFTdWJrZXlMKDEwKSA9IHRsIF4gc3VibCgxMSk7CisgICAgQ2FtZWxsaWFTdWJrZXlSKDEwKSA9IHRyIF4gc3VicigxMSk7CisgICAgQ2FtZWxsaWFTdWJrZXlMKDExKSA9IHN1YmwoMTApIF4gc3VibCgxMik7CisgICAgQ2FtZWxsaWFTdWJrZXlSKDExKSA9IHN1YnIoMTApIF4gc3VicigxMik7CisgICAgQ2FtZWxsaWFTdWJrZXlMKDEyKSA9IHN1YmwoMTEpIF4gc3VibCgxMyk7CisgICAgQ2FtZWxsaWFTdWJrZXlSKDEyKSA9IHN1YnIoMTEpIF4gc3VicigxMyk7CisgICAgQ2FtZWxsaWFTdWJrZXlMKDEzKSA9IHN1YmwoMTIpIF4gc3VibCgxNCk7CisgICAgQ2FtZWxsaWFTdWJrZXlSKDEzKSA9IHN1YnIoMTIpIF4gc3VicigxNCk7CisgICAgQ2FtZWxsaWFTdWJrZXlMKDE0KSA9IHN1YmwoMTMpIF4gc3VibCgxNSk7CisgICAgQ2FtZWxsaWFTdWJrZXlSKDE0KSA9IHN1YnIoMTMpIF4gc3VicigxNSk7CisgICAgdGwgPSBzdWJsKDE4KSBeIChzdWJyKDE4KSAmIH5zdWJyKDE2KSk7CisgICAgZHcgPSB0bCAmIHN1YmwoMTYpLAl0ciA9IHN1YnIoMTgpIF4gQ0FNRUxMSUFfUkwxKGR3KTsKKyAgICBDYW1lbGxpYVN1YmtleUwoMTUpID0gc3VibCgxNCkgXiB0bDsKKyAgICBDYW1lbGxpYVN1YmtleVIoMTUpID0gc3VicigxNCkgXiB0cjsKKyAgICBDYW1lbGxpYVN1YmtleUwoMTYpID0gc3VibCgxNik7CisgICAgQ2FtZWxsaWFTdWJrZXlSKDE2KSA9IHN1YnIoMTYpOworICAgIENhbWVsbGlhU3Via2V5TCgxNykgPSBzdWJsKDE3KTsKKyAgICBDYW1lbGxpYVN1YmtleVIoMTcpID0gc3VicigxNyk7CisgICAgdGwgPSBzdWJsKDE1KSBeIChzdWJyKDE1KSAmIH5zdWJyKDE3KSk7CisgICAgZHcgPSB0bCAmIHN1YmwoMTcpLAl0ciA9IHN1YnIoMTUpIF4gQ0FNRUxMSUFfUkwxKGR3KTsKKyAgICBDYW1lbGxpYVN1YmtleUwoMTgpID0gdGwgXiBzdWJsKDE5KTsKKyAgICBDYW1lbGxpYVN1YmtleVIoMTgpID0gdHIgXiBzdWJyKDE5KTsKKyAgICBDYW1lbGxpYVN1YmtleUwoMTkpID0gc3VibCgxOCkgXiBzdWJsKDIwKTsKKyAgICBDYW1lbGxpYVN1YmtleVIoMTkpID0gc3VicigxOCkgXiBzdWJyKDIwKTsKKyAgICBDYW1lbGxpYVN1YmtleUwoMjApID0gc3VibCgxOSkgXiBzdWJsKDIxKTsKKyAgICBDYW1lbGxpYVN1YmtleVIoMjApID0gc3VicigxOSkgXiBzdWJyKDIxKTsKKyAgICBDYW1lbGxpYVN1YmtleUwoMjEpID0gc3VibCgyMCkgXiBzdWJsKDIyKTsKKyAgICBDYW1lbGxpYVN1YmtleVIoMjEpID0gc3VicigyMCkgXiBzdWJyKDIyKTsKKyAgICBDYW1lbGxpYVN1YmtleUwoMjIpID0gc3VibCgyMSkgXiBzdWJsKDIzKTsKKyAgICBDYW1lbGxpYVN1YmtleVIoMjIpID0gc3VicigyMSkgXiBzdWJyKDIzKTsKKyAgICBDYW1lbGxpYVN1YmtleUwoMjMpID0gc3VibCgyMik7CisgICAgQ2FtZWxsaWFTdWJrZXlSKDIzKSA9IHN1YnIoMjIpOworICAgIENhbWVsbGlhU3Via2V5TCgyNCkgPSBzdWJsKDI0KSBeIHN1YmwoMjMpOworICAgIENhbWVsbGlhU3Via2V5UigyNCkgPSBzdWJyKDI0KSBeIHN1YnIoMjMpOworCisgICAgLyogYXBwbHkgdGhlIGludmVyc2Ugb2YgdGhlIGxhc3QgaGFsZiBvZiBQLWZ1bmN0aW9uICovCisgICAgZHcgPSBDYW1lbGxpYVN1YmtleUwoMikgXiBDYW1lbGxpYVN1YmtleVIoMiksIGR3ID0gQ0FNRUxMSUFfUkw4KGR3KTsKKyAgICBDYW1lbGxpYVN1YmtleVIoMikgPSBDYW1lbGxpYVN1YmtleUwoMikgXiBkdywgQ2FtZWxsaWFTdWJrZXlMKDIpID0gZHc7CisgICAgZHcgPSBDYW1lbGxpYVN1YmtleUwoMykgXiBDYW1lbGxpYVN1YmtleVIoMyksIGR3ID0gQ0FNRUxMSUFfUkw4KGR3KTsKKyAgICBDYW1lbGxpYVN1YmtleVIoMykgPSBDYW1lbGxpYVN1YmtleUwoMykgXiBkdywgQ2FtZWxsaWFTdWJrZXlMKDMpID0gZHc7CisgICAgZHcgPSBDYW1lbGxpYVN1YmtleUwoNCkgXiBDYW1lbGxpYVN1YmtleVIoNCksIGR3ID0gQ0FNRUxMSUFfUkw4KGR3KTsKKyAgICBDYW1lbGxpYVN1YmtleVIoNCkgPSBDYW1lbGxpYVN1YmtleUwoNCkgXiBkdywgQ2FtZWxsaWFTdWJrZXlMKDQpID0gZHc7CisgICAgZHcgPSBDYW1lbGxpYVN1YmtleUwoNSkgXiBDYW1lbGxpYVN1YmtleVIoNSksIGR3ID0gQ0FNRUxMSUFfUkw4KGR3KTsKKyAgICBDYW1lbGxpYVN1YmtleVIoNSkgPSBDYW1lbGxpYVN1YmtleUwoNSkgXiBkdywgQ2FtZWxsaWFTdWJrZXlMKDUpID0gZHc7CisgICAgZHcgPSBDYW1lbGxpYVN1YmtleUwoNikgXiBDYW1lbGxpYVN1YmtleVIoNiksIGR3ID0gQ0FNRUxMSUFfUkw4KGR3KTsKKyAgICBDYW1lbGxpYVN1YmtleVIoNikgPSBDYW1lbGxpYVN1YmtleUwoNikgXiBkdywgQ2FtZWxsaWFTdWJrZXlMKDYpID0gZHc7CisgICAgZHcgPSBDYW1lbGxpYVN1YmtleUwoNykgXiBDYW1lbGxpYVN1YmtleVIoNyksIGR3ID0gQ0FNRUxMSUFfUkw4KGR3KTsKKyAgICBDYW1lbGxpYVN1YmtleVIoNykgPSBDYW1lbGxpYVN1YmtleUwoNykgXiBkdywgQ2FtZWxsaWFTdWJrZXlMKDcpID0gZHc7CisgICAgZHcgPSBDYW1lbGxpYVN1YmtleUwoMTApIF4gQ2FtZWxsaWFTdWJrZXlSKDEwKSwgZHcgPSBDQU1FTExJQV9STDgoZHcpOworICAgIENhbWVsbGlhU3Via2V5UigxMCkgPSBDYW1lbGxpYVN1YmtleUwoMTApIF4gZHcsIENhbWVsbGlhU3Via2V5TCgxMCkgPSBkdzsKKyAgICBkdyA9IENhbWVsbGlhU3Via2V5TCgxMSkgXiBDYW1lbGxpYVN1YmtleVIoMTEpLCBkdyA9IENBTUVMTElBX1JMOChkdyk7CisgICAgQ2FtZWxsaWFTdWJrZXlSKDExKSA9IENhbWVsbGlhU3Via2V5TCgxMSkgXiBkdywgQ2FtZWxsaWFTdWJrZXlMKDExKSA9IGR3OworICAgIGR3ID0gQ2FtZWxsaWFTdWJrZXlMKDEyKSBeIENhbWVsbGlhU3Via2V5UigxMiksIGR3ID0gQ0FNRUxMSUFfUkw4KGR3KTsKKyAgICBDYW1lbGxpYVN1YmtleVIoMTIpID0gQ2FtZWxsaWFTdWJrZXlMKDEyKSBeIGR3LCBDYW1lbGxpYVN1YmtleUwoMTIpID0gZHc7CisgICAgZHcgPSBDYW1lbGxpYVN1YmtleUwoMTMpIF4gQ2FtZWxsaWFTdWJrZXlSKDEzKSwgZHcgPSBDQU1FTExJQV9STDgoZHcpOworICAgIENhbWVsbGlhU3Via2V5UigxMykgPSBDYW1lbGxpYVN1YmtleUwoMTMpIF4gZHcsIENhbWVsbGlhU3Via2V5TCgxMykgPSBkdzsKKyAgICBkdyA9IENhbWVsbGlhU3Via2V5TCgxNCkgXiBDYW1lbGxpYVN1YmtleVIoMTQpLCBkdyA9IENBTUVMTElBX1JMOChkdyk7CisgICAgQ2FtZWxsaWFTdWJrZXlSKDE0KSA9IENhbWVsbGlhU3Via2V5TCgxNCkgXiBkdywgQ2FtZWxsaWFTdWJrZXlMKDE0KSA9IGR3OworICAgIGR3ID0gQ2FtZWxsaWFTdWJrZXlMKDE1KSBeIENhbWVsbGlhU3Via2V5UigxNSksIGR3ID0gQ0FNRUxMSUFfUkw4KGR3KTsKKyAgICBDYW1lbGxpYVN1YmtleVIoMTUpID0gQ2FtZWxsaWFTdWJrZXlMKDE1KSBeIGR3LCBDYW1lbGxpYVN1YmtleUwoMTUpID0gZHc7CisgICAgZHcgPSBDYW1lbGxpYVN1YmtleUwoMTgpIF4gQ2FtZWxsaWFTdWJrZXlSKDE4KSwgZHcgPSBDQU1FTExJQV9STDgoZHcpOworICAgIENhbWVsbGlhU3Via2V5UigxOCkgPSBDYW1lbGxpYVN1YmtleUwoMTgpIF4gZHcsIENhbWVsbGlhU3Via2V5TCgxOCkgPSBkdzsKKyAgICBkdyA9IENhbWVsbGlhU3Via2V5TCgxOSkgXiBDYW1lbGxpYVN1YmtleVIoMTkpLCBkdyA9IENBTUVMTElBX1JMOChkdyk7CisgICAgQ2FtZWxsaWFTdWJrZXlSKDE5KSA9IENhbWVsbGlhU3Via2V5TCgxOSkgXiBkdywgQ2FtZWxsaWFTdWJrZXlMKDE5KSA9IGR3OworICAgIGR3ID0gQ2FtZWxsaWFTdWJrZXlMKDIwKSBeIENhbWVsbGlhU3Via2V5UigyMCksIGR3ID0gQ0FNRUxMSUFfUkw4KGR3KTsKKyAgICBDYW1lbGxpYVN1YmtleVIoMjApID0gQ2FtZWxsaWFTdWJrZXlMKDIwKSBeIGR3LCBDYW1lbGxpYVN1YmtleUwoMjApID0gZHc7CisgICAgZHcgPSBDYW1lbGxpYVN1YmtleUwoMjEpIF4gQ2FtZWxsaWFTdWJrZXlSKDIxKSwgZHcgPSBDQU1FTExJQV9STDgoZHcpOworICAgIENhbWVsbGlhU3Via2V5UigyMSkgPSBDYW1lbGxpYVN1YmtleUwoMjEpIF4gZHcsIENhbWVsbGlhU3Via2V5TCgyMSkgPSBkdzsKKyAgICBkdyA9IENhbWVsbGlhU3Via2V5TCgyMikgXiBDYW1lbGxpYVN1YmtleVIoMjIpLCBkdyA9IENBTUVMTElBX1JMOChkdyk7CisgICAgQ2FtZWxsaWFTdWJrZXlSKDIyKSA9IENhbWVsbGlhU3Via2V5TCgyMikgXiBkdywgQ2FtZWxsaWFTdWJrZXlMKDIyKSA9IGR3OworICAgIGR3ID0gQ2FtZWxsaWFTdWJrZXlMKDIzKSBeIENhbWVsbGlhU3Via2V5UigyMyksIGR3ID0gQ0FNRUxMSUFfUkw4KGR3KTsKKyAgICBDYW1lbGxpYVN1YmtleVIoMjMpID0gQ2FtZWxsaWFTdWJrZXlMKDIzKSBeIGR3LCBDYW1lbGxpYVN1YmtleUwoMjMpID0gZHc7CisKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgY2FtZWxsaWFfc2V0dXAyNTYoY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCB1MzIgKnN1YmtleSkKK3sKKyAgICB1MzIga2xsLGtscixrcmwsa3JyOyAgICAgICAgICAgLyogbGVmdCBoYWxmIG9mIGtleSAqLworICAgIHUzMiBrcmxsLGtybHIsa3JybCxrcnJyOyAgICAgICAvKiByaWdodCBoYWxmIG9mIGtleSAqLworICAgIHUzMiBpbCwgaXIsIHQwLCB0MSwgdzAsIHcxOyAgICAvKiB0ZW1wb3JhcnkgdmFyaWFibGVzICovCisgICAgdTMyIGt3NGwsIGt3NHIsIGR3LCB0bCwgdHI7CisgICAgdTMyIHN1YkxbMzRdOworICAgIHUzMiBzdWJSWzM0XTsKKworICAgIC8qKgorICAgICAqICBrZXkgPSAoa2xsIHx8IGtsciB8fCBrcmwgfHwga3JyIHx8IGtybGwgfHwga3JsciB8fCBrcnJsIHx8IGtycnIpCisgICAgICogICh8fCBpcyBjb25jYXRpbmF0aW9uKQorICAgICAqLworCisgICAga2xsICA9IEdFVFUzMihrZXkgICAgICk7CisgICAga2xyICA9IEdFVFUzMihrZXkgKyAgNCk7CisgICAga3JsICA9IEdFVFUzMihrZXkgKyAgOCk7CisgICAga3JyICA9IEdFVFUzMihrZXkgKyAxMik7CisgICAga3JsbCA9IEdFVFUzMihrZXkgKyAxNik7CisgICAga3JsciA9IEdFVFUzMihrZXkgKyAyMCk7CisgICAga3JybCA9IEdFVFUzMihrZXkgKyAyNCk7CisgICAga3JyciA9IEdFVFUzMihrZXkgKyAyOCk7CisKKyAgICAvKiBnZW5lcmF0ZSBLTCBkZXBlbmRlbnQgc3Via2V5cyAqLworICAgIHN1YmwoMCkgPSBrbGw7IHN1YnIoMCkgPSBrbHI7CisgICAgc3VibCgxKSA9IGtybDsgc3VicigxKSA9IGtycjsKKyAgICBDQU1FTExJQV9ST0xEUW8zMihrbGwsIGtsciwga3JsLCBrcnIsIHcwLCB3MSwgNDUpOworICAgIHN1YmwoMTIpID0ga2xsOyBzdWJyKDEyKSA9IGtscjsKKyAgICBzdWJsKDEzKSA9IGtybDsgc3VicigxMykgPSBrcnI7CisgICAgQ0FNRUxMSUFfUk9MRFEoa2xsLCBrbHIsIGtybCwga3JyLCB3MCwgdzEsIDE1KTsKKyAgICBzdWJsKDE2KSA9IGtsbDsgc3VicigxNikgPSBrbHI7CisgICAgc3VibCgxNykgPSBrcmw7IHN1YnIoMTcpID0ga3JyOworICAgIENBTUVMTElBX1JPTERRKGtsbCwga2xyLCBrcmwsIGtyciwgdzAsIHcxLCAxNyk7CisgICAgc3VibCgyMikgPSBrbGw7IHN1YnIoMjIpID0ga2xyOworICAgIHN1YmwoMjMpID0ga3JsOyBzdWJyKDIzKSA9IGtycjsKKyAgICBDQU1FTExJQV9ST0xEUW8zMihrbGwsIGtsciwga3JsLCBrcnIsIHcwLCB3MSwgMzQpOworICAgIHN1YmwoMzApID0ga2xsOyBzdWJyKDMwKSA9IGtscjsKKyAgICBzdWJsKDMxKSA9IGtybDsgc3VicigzMSkgPSBrcnI7CisKKyAgICAvKiBnZW5lcmF0ZSBLUiBkZXBlbmRlbnQgc3Via2V5cyAqLworICAgIENBTUVMTElBX1JPTERRKGtybGwsIGtybHIsIGtycmwsIGtycnIsIHcwLCB3MSwgMTUpOworICAgIHN1YmwoNCkgPSBrcmxsOyBzdWJyKDQpID0ga3JscjsKKyAgICBzdWJsKDUpID0ga3JybDsgc3Vicig1KSA9IGtycnI7CisgICAgQ0FNRUxMSUFfUk9MRFEoa3JsbCwga3Jsciwga3JybCwga3JyciwgdzAsIHcxLCAxNSk7CisgICAgc3VibCg4KSA9IGtybGw7IHN1YnIoOCkgPSBrcmxyOworICAgIHN1YmwoOSkgPSBrcnJsOyBzdWJyKDkpID0ga3JycjsKKyAgICBDQU1FTExJQV9ST0xEUShrcmxsLCBrcmxyLCBrcnJsLCBrcnJyLCB3MCwgdzEsIDMwKTsKKyAgICBzdWJsKDE4KSA9IGtybGw7IHN1YnIoMTgpID0ga3JscjsKKyAgICBzdWJsKDE5KSA9IGtycmw7IHN1YnIoMTkpID0ga3JycjsKKyAgICBDQU1FTExJQV9ST0xEUW8zMihrcmxsLCBrcmxyLCBrcnJsLCBrcnJyLCB3MCwgdzEsIDM0KTsKKyAgICBzdWJsKDI2KSA9IGtybGw7IHN1YnIoMjYpID0ga3JscjsKKyAgICBzdWJsKDI3KSA9IGtycmw7IHN1YnIoMjcpID0ga3JycjsKKyAgICBDQU1FTExJQV9ST0xEUW8zMihrcmxsLCBrcmxyLCBrcnJsLCBrcnJyLCB3MCwgdzEsIDM0KTsKKworICAgIC8qIGdlbmVyYXRlIEtBICovCisgICAga2xsID0gc3VibCgwKSBeIGtybGw7IGtsciA9IHN1YnIoMCkgXiBrcmxyOworICAgIGtybCA9IHN1YmwoMSkgXiBrcnJsOyBrcnIgPSBzdWJyKDEpIF4ga3JycjsKKyAgICBDQU1FTExJQV9GKGtsbCwga2xyLAorCSAgICAgICBDQU1FTExJQV9TSUdNQTFMLCBDQU1FTExJQV9TSUdNQTFSLAorCSAgICAgICB3MCwgdzEsIGlsLCBpciwgdDAsIHQxKTsKKyAgICBrcmwgXj0gdzA7IGtyciBePSB3MTsKKyAgICBDQU1FTExJQV9GKGtybCwga3JyLAorCSAgICAgICBDQU1FTExJQV9TSUdNQTJMLCBDQU1FTExJQV9TSUdNQTJSLAorCSAgICAgICBrbGwsIGtsciwgaWwsIGlyLCB0MCwgdDEpOworICAgIGtsbCBePSBrcmxsOyBrbHIgXj0ga3JscjsKKyAgICBDQU1FTExJQV9GKGtsbCwga2xyLAorCSAgICAgICBDQU1FTExJQV9TSUdNQTNMLCBDQU1FTExJQV9TSUdNQTNSLAorCSAgICAgICBrcmwsIGtyciwgaWwsIGlyLCB0MCwgdDEpOworICAgIGtybCBePSB3MCBeIGtycmw7IGtyciBePSB3MSBeIGtycnI7CisgICAgQ0FNRUxMSUFfRihrcmwsIGtyciwKKwkgICAgICAgQ0FNRUxMSUFfU0lHTUE0TCwgQ0FNRUxMSUFfU0lHTUE0UiwKKwkgICAgICAgdzAsIHcxLCBpbCwgaXIsIHQwLCB0MSk7CisgICAga2xsIF49IHcwOyBrbHIgXj0gdzE7CisKKyAgICAvKiBnZW5lcmF0ZSBLQiAqLworICAgIGtybGwgXj0ga2xsOyBrcmxyIF49IGtscjsKKyAgICBrcnJsIF49IGtybDsga3JyciBePSBrcnI7CisgICAgQ0FNRUxMSUFfRihrcmxsLCBrcmxyLAorCSAgICAgICBDQU1FTExJQV9TSUdNQTVMLCBDQU1FTExJQV9TSUdNQTVSLAorCSAgICAgICB3MCwgdzEsIGlsLCBpciwgdDAsIHQxKTsKKyAgICBrcnJsIF49IHcwOyBrcnJyIF49IHcxOworICAgIENBTUVMTElBX0Yoa3JybCwga3JyciwKKwkgICAgICAgQ0FNRUxMSUFfU0lHTUE2TCwgQ0FNRUxMSUFfU0lHTUE2UiwKKwkgICAgICAgdzAsIHcxLCBpbCwgaXIsIHQwLCB0MSk7CisgICAga3JsbCBePSB3MDsga3JsciBePSB3MTsKKworICAgIC8qIGdlbmVyYXRlIEtBIGRlcGVuZGVudCBzdWJrZXlzICovCisgICAgQ0FNRUxMSUFfUk9MRFEoa2xsLCBrbHIsIGtybCwga3JyLCB3MCwgdzEsIDE1KTsKKyAgICBzdWJsKDYpID0ga2xsOyBzdWJyKDYpID0ga2xyOworICAgIHN1YmwoNykgPSBrcmw7IHN1YnIoNykgPSBrcnI7CisgICAgQ0FNRUxMSUFfUk9MRFEoa2xsLCBrbHIsIGtybCwga3JyLCB3MCwgdzEsIDMwKTsKKyAgICBzdWJsKDE0KSA9IGtsbDsgc3VicigxNCkgPSBrbHI7CisgICAgc3VibCgxNSkgPSBrcmw7IHN1YnIoMTUpID0ga3JyOworICAgIHN1YmwoMjQpID0ga2xyOyBzdWJyKDI0KSA9IGtybDsKKyAgICBzdWJsKDI1KSA9IGtycjsgc3VicigyNSkgPSBrbGw7CisgICAgQ0FNRUxMSUFfUk9MRFFvMzIoa2xsLCBrbHIsIGtybCwga3JyLCB3MCwgdzEsIDQ5KTsKKyAgICBzdWJsKDI4KSA9IGtsbDsgc3VicigyOCkgPSBrbHI7CisgICAgc3VibCgyOSkgPSBrcmw7IHN1YnIoMjkpID0ga3JyOworCisgICAgLyogZ2VuZXJhdGUgS0IgZGVwZW5kZW50IHN1YmtleXMgKi8KKyAgICBzdWJsKDIpID0ga3JsbDsgc3VicigyKSA9IGtybHI7CisgICAgc3VibCgzKSA9IGtycmw7IHN1YnIoMykgPSBrcnJyOworICAgIENBTUVMTElBX1JPTERRKGtybGwsIGtybHIsIGtycmwsIGtycnIsIHcwLCB3MSwgMzApOworICAgIHN1YmwoMTApID0ga3JsbDsgc3VicigxMCkgPSBrcmxyOworICAgIHN1YmwoMTEpID0ga3JybDsgc3VicigxMSkgPSBrcnJyOworICAgIENBTUVMTElBX1JPTERRKGtybGwsIGtybHIsIGtycmwsIGtycnIsIHcwLCB3MSwgMzApOworICAgIHN1YmwoMjApID0ga3JsbDsgc3VicigyMCkgPSBrcmxyOworICAgIHN1YmwoMjEpID0ga3JybDsgc3VicigyMSkgPSBrcnJyOworICAgIENBTUVMTElBX1JPTERRbzMyKGtybGwsIGtybHIsIGtycmwsIGtycnIsIHcwLCB3MSwgNTEpOworICAgIHN1YmwoMzIpID0ga3JsbDsgc3VicigzMikgPSBrcmxyOworICAgIHN1YmwoMzMpID0ga3JybDsgc3VicigzMykgPSBrcnJyOworCisgICAgLyogYWJzb3JiIGt3MiB0byBvdGhlciBzdWJrZXlzICovCisgICAgc3VibCgzKSBePSBzdWJsKDEpOyBzdWJyKDMpIF49IHN1YnIoMSk7CisgICAgc3VibCg1KSBePSBzdWJsKDEpOyBzdWJyKDUpIF49IHN1YnIoMSk7CisgICAgc3VibCg3KSBePSBzdWJsKDEpOyBzdWJyKDcpIF49IHN1YnIoMSk7CisgICAgc3VibCgxKSBePSBzdWJyKDEpICYgfnN1YnIoOSk7CisgICAgZHcgPSBzdWJsKDEpICYgc3VibCg5KSwgc3VicigxKSBePSBDQU1FTExJQV9STDEoZHcpOworICAgIHN1YmwoMTEpIF49IHN1YmwoMSk7IHN1YnIoMTEpIF49IHN1YnIoMSk7CisgICAgc3VibCgxMykgXj0gc3VibCgxKTsgc3VicigxMykgXj0gc3VicigxKTsKKyAgICBzdWJsKDE1KSBePSBzdWJsKDEpOyBzdWJyKDE1KSBePSBzdWJyKDEpOworICAgIHN1YmwoMSkgXj0gc3VicigxKSAmIH5zdWJyKDE3KTsKKyAgICBkdyA9IHN1YmwoMSkgJiBzdWJsKDE3KSwgc3VicigxKSBePSBDQU1FTExJQV9STDEoZHcpOworICAgIHN1YmwoMTkpIF49IHN1YmwoMSk7IHN1YnIoMTkpIF49IHN1YnIoMSk7CisgICAgc3VibCgyMSkgXj0gc3VibCgxKTsgc3VicigyMSkgXj0gc3VicigxKTsKKyAgICBzdWJsKDIzKSBePSBzdWJsKDEpOyBzdWJyKDIzKSBePSBzdWJyKDEpOworICAgIHN1YmwoMSkgXj0gc3VicigxKSAmIH5zdWJyKDI1KTsKKyAgICBkdyA9IHN1YmwoMSkgJiBzdWJsKDI1KSwgc3VicigxKSBePSBDQU1FTExJQV9STDEoZHcpOworICAgIHN1YmwoMjcpIF49IHN1YmwoMSk7IHN1YnIoMjcpIF49IHN1YnIoMSk7CisgICAgc3VibCgyOSkgXj0gc3VibCgxKTsgc3VicigyOSkgXj0gc3VicigxKTsKKyAgICBzdWJsKDMxKSBePSBzdWJsKDEpOyBzdWJyKDMxKSBePSBzdWJyKDEpOworICAgIHN1YmwoMzIpIF49IHN1YmwoMSk7IHN1YnIoMzIpIF49IHN1YnIoMSk7CisKKyAgICAvKiBhYnNvcmIga3c0IHRvIG90aGVyIHN1YmtleXMgKi8KKyAgICBrdzRsID0gc3VibCgzMyk7IGt3NHIgPSBzdWJyKDMzKTsKKyAgICBzdWJsKDMwKSBePSBrdzRsOyBzdWJyKDMwKSBePSBrdzRyOworICAgIHN1YmwoMjgpIF49IGt3NGw7IHN1YnIoMjgpIF49IGt3NHI7CisgICAgc3VibCgyNikgXj0ga3c0bDsgc3VicigyNikgXj0ga3c0cjsKKyAgICBrdzRsIF49IGt3NHIgJiB+c3VicigyNCk7CisgICAgZHcgPSBrdzRsICYgc3VibCgyNCksIGt3NHIgXj0gQ0FNRUxMSUFfUkwxKGR3KTsKKyAgICBzdWJsKDIyKSBePSBrdzRsOyBzdWJyKDIyKSBePSBrdzRyOworICAgIHN1YmwoMjApIF49IGt3NGw7IHN1YnIoMjApIF49IGt3NHI7CisgICAgc3VibCgxOCkgXj0ga3c0bDsgc3VicigxOCkgXj0ga3c0cjsKKyAgICBrdzRsIF49IGt3NHIgJiB+c3VicigxNik7CisgICAgZHcgPSBrdzRsICYgc3VibCgxNiksIGt3NHIgXj0gQ0FNRUxMSUFfUkwxKGR3KTsKKyAgICBzdWJsKDE0KSBePSBrdzRsOyBzdWJyKDE0KSBePSBrdzRyOworICAgIHN1YmwoMTIpIF49IGt3NGw7IHN1YnIoMTIpIF49IGt3NHI7CisgICAgc3VibCgxMCkgXj0ga3c0bDsgc3VicigxMCkgXj0ga3c0cjsKKyAgICBrdzRsIF49IGt3NHIgJiB+c3Vicig4KTsKKyAgICBkdyA9IGt3NGwgJiBzdWJsKDgpLCBrdzRyIF49IENBTUVMTElBX1JMMShkdyk7CisgICAgc3VibCg2KSBePSBrdzRsOyBzdWJyKDYpIF49IGt3NHI7CisgICAgc3VibCg0KSBePSBrdzRsOyBzdWJyKDQpIF49IGt3NHI7CisgICAgc3VibCgyKSBePSBrdzRsOyBzdWJyKDIpIF49IGt3NHI7CisgICAgc3VibCgwKSBePSBrdzRsOyBzdWJyKDApIF49IGt3NHI7CisKKyAgICAvKiBrZXkgWE9SIGlzIGVuZCBvZiBGLWZ1bmN0aW9uICovCisgICAgQ2FtZWxsaWFTdWJrZXlMKDApID0gc3VibCgwKSBeIHN1YmwoMik7CisgICAgQ2FtZWxsaWFTdWJrZXlSKDApID0gc3VicigwKSBeIHN1YnIoMik7CisgICAgQ2FtZWxsaWFTdWJrZXlMKDIpID0gc3VibCgzKTsKKyAgICBDYW1lbGxpYVN1YmtleVIoMikgPSBzdWJyKDMpOworICAgIENhbWVsbGlhU3Via2V5TCgzKSA9IHN1YmwoMikgXiBzdWJsKDQpOworICAgIENhbWVsbGlhU3Via2V5UigzKSA9IHN1YnIoMikgXiBzdWJyKDQpOworICAgIENhbWVsbGlhU3Via2V5TCg0KSA9IHN1YmwoMykgXiBzdWJsKDUpOworICAgIENhbWVsbGlhU3Via2V5Uig0KSA9IHN1YnIoMykgXiBzdWJyKDUpOworICAgIENhbWVsbGlhU3Via2V5TCg1KSA9IHN1YmwoNCkgXiBzdWJsKDYpOworICAgIENhbWVsbGlhU3Via2V5Uig1KSA9IHN1YnIoNCkgXiBzdWJyKDYpOworICAgIENhbWVsbGlhU3Via2V5TCg2KSA9IHN1YmwoNSkgXiBzdWJsKDcpOworICAgIENhbWVsbGlhU3Via2V5Uig2KSA9IHN1YnIoNSkgXiBzdWJyKDcpOworICAgIHRsID0gc3VibCgxMCkgXiAoc3VicigxMCkgJiB+c3Vicig4KSk7CisgICAgZHcgPSB0bCAmIHN1YmwoOCksIHRyID0gc3VicigxMCkgXiBDQU1FTExJQV9STDEoZHcpOworICAgIENhbWVsbGlhU3Via2V5TCg3KSA9IHN1YmwoNikgXiB0bDsKKyAgICBDYW1lbGxpYVN1YmtleVIoNykgPSBzdWJyKDYpIF4gdHI7CisgICAgQ2FtZWxsaWFTdWJrZXlMKDgpID0gc3VibCg4KTsKKyAgICBDYW1lbGxpYVN1YmtleVIoOCkgPSBzdWJyKDgpOworICAgIENhbWVsbGlhU3Via2V5TCg5KSA9IHN1YmwoOSk7CisgICAgQ2FtZWxsaWFTdWJrZXlSKDkpID0gc3Vicig5KTsKKyAgICB0bCA9IHN1YmwoNykgXiAoc3Vicig3KSAmIH5zdWJyKDkpKTsKKyAgICBkdyA9IHRsICYgc3VibCg5KSwgdHIgPSBzdWJyKDcpIF4gQ0FNRUxMSUFfUkwxKGR3KTsKKyAgICBDYW1lbGxpYVN1YmtleUwoMTApID0gdGwgXiBzdWJsKDExKTsKKyAgICBDYW1lbGxpYVN1YmtleVIoMTApID0gdHIgXiBzdWJyKDExKTsKKyAgICBDYW1lbGxpYVN1YmtleUwoMTEpID0gc3VibCgxMCkgXiBzdWJsKDEyKTsKKyAgICBDYW1lbGxpYVN1YmtleVIoMTEpID0gc3VicigxMCkgXiBzdWJyKDEyKTsKKyAgICBDYW1lbGxpYVN1YmtleUwoMTIpID0gc3VibCgxMSkgXiBzdWJsKDEzKTsKKyAgICBDYW1lbGxpYVN1YmtleVIoMTIpID0gc3VicigxMSkgXiBzdWJyKDEzKTsKKyAgICBDYW1lbGxpYVN1YmtleUwoMTMpID0gc3VibCgxMikgXiBzdWJsKDE0KTsKKyAgICBDYW1lbGxpYVN1YmtleVIoMTMpID0gc3VicigxMikgXiBzdWJyKDE0KTsKKyAgICBDYW1lbGxpYVN1YmtleUwoMTQpID0gc3VibCgxMykgXiBzdWJsKDE1KTsKKyAgICBDYW1lbGxpYVN1YmtleVIoMTQpID0gc3VicigxMykgXiBzdWJyKDE1KTsKKyAgICB0bCA9IHN1YmwoMTgpIF4gKHN1YnIoMTgpICYgfnN1YnIoMTYpKTsKKyAgICBkdyA9IHRsICYgc3VibCgxNiksIHRyID0gc3VicigxOCkgXiBDQU1FTExJQV9STDEoZHcpOworICAgIENhbWVsbGlhU3Via2V5TCgxNSkgPSBzdWJsKDE0KSBeIHRsOworICAgIENhbWVsbGlhU3Via2V5UigxNSkgPSBzdWJyKDE0KSBeIHRyOworICAgIENhbWVsbGlhU3Via2V5TCgxNikgPSBzdWJsKDE2KTsKKyAgICBDYW1lbGxpYVN1YmtleVIoMTYpID0gc3VicigxNik7CisgICAgQ2FtZWxsaWFTdWJrZXlMKDE3KSA9IHN1YmwoMTcpOworICAgIENhbWVsbGlhU3Via2V5UigxNykgPSBzdWJyKDE3KTsKKyAgICB0bCA9IHN1YmwoMTUpIF4gKHN1YnIoMTUpICYgfnN1YnIoMTcpKTsKKyAgICBkdyA9IHRsICYgc3VibCgxNyksIHRyID0gc3VicigxNSkgXiBDQU1FTExJQV9STDEoZHcpOworICAgIENhbWVsbGlhU3Via2V5TCgxOCkgPSB0bCBeIHN1YmwoMTkpOworICAgIENhbWVsbGlhU3Via2V5UigxOCkgPSB0ciBeIHN1YnIoMTkpOworICAgIENhbWVsbGlhU3Via2V5TCgxOSkgPSBzdWJsKDE4KSBeIHN1YmwoMjApOworICAgIENhbWVsbGlhU3Via2V5UigxOSkgPSBzdWJyKDE4KSBeIHN1YnIoMjApOworICAgIENhbWVsbGlhU3Via2V5TCgyMCkgPSBzdWJsKDE5KSBeIHN1YmwoMjEpOworICAgIENhbWVsbGlhU3Via2V5UigyMCkgPSBzdWJyKDE5KSBeIHN1YnIoMjEpOworICAgIENhbWVsbGlhU3Via2V5TCgyMSkgPSBzdWJsKDIwKSBeIHN1YmwoMjIpOworICAgIENhbWVsbGlhU3Via2V5UigyMSkgPSBzdWJyKDIwKSBeIHN1YnIoMjIpOworICAgIENhbWVsbGlhU3Via2V5TCgyMikgPSBzdWJsKDIxKSBeIHN1YmwoMjMpOworICAgIENhbWVsbGlhU3Via2V5UigyMikgPSBzdWJyKDIxKSBeIHN1YnIoMjMpOworICAgIHRsID0gc3VibCgyNikgXiAoc3VicigyNikgJiB+c3VicigyNCkpOworICAgIGR3ID0gdGwgJiBzdWJsKDI0KSwgdHIgPSBzdWJyKDI2KSBeIENBTUVMTElBX1JMMShkdyk7CisgICAgQ2FtZWxsaWFTdWJrZXlMKDIzKSA9IHN1YmwoMjIpIF4gdGw7CisgICAgQ2FtZWxsaWFTdWJrZXlSKDIzKSA9IHN1YnIoMjIpIF4gdHI7CisgICAgQ2FtZWxsaWFTdWJrZXlMKDI0KSA9IHN1YmwoMjQpOworICAgIENhbWVsbGlhU3Via2V5UigyNCkgPSBzdWJyKDI0KTsKKyAgICBDYW1lbGxpYVN1YmtleUwoMjUpID0gc3VibCgyNSk7CisgICAgQ2FtZWxsaWFTdWJrZXlSKDI1KSA9IHN1YnIoMjUpOworICAgIHRsID0gc3VibCgyMykgXiAoc3VicigyMykgJiAgfnN1YnIoMjUpKTsKKyAgICBkdyA9IHRsICYgc3VibCgyNSksIHRyID0gc3VicigyMykgXiBDQU1FTExJQV9STDEoZHcpOworICAgIENhbWVsbGlhU3Via2V5TCgyNikgPSB0bCBeIHN1YmwoMjcpOworICAgIENhbWVsbGlhU3Via2V5UigyNikgPSB0ciBeIHN1YnIoMjcpOworICAgIENhbWVsbGlhU3Via2V5TCgyNykgPSBzdWJsKDI2KSBeIHN1YmwoMjgpOworICAgIENhbWVsbGlhU3Via2V5UigyNykgPSBzdWJyKDI2KSBeIHN1YnIoMjgpOworICAgIENhbWVsbGlhU3Via2V5TCgyOCkgPSBzdWJsKDI3KSBeIHN1YmwoMjkpOworICAgIENhbWVsbGlhU3Via2V5UigyOCkgPSBzdWJyKDI3KSBeIHN1YnIoMjkpOworICAgIENhbWVsbGlhU3Via2V5TCgyOSkgPSBzdWJsKDI4KSBeIHN1YmwoMzApOworICAgIENhbWVsbGlhU3Via2V5UigyOSkgPSBzdWJyKDI4KSBeIHN1YnIoMzApOworICAgIENhbWVsbGlhU3Via2V5TCgzMCkgPSBzdWJsKDI5KSBeIHN1YmwoMzEpOworICAgIENhbWVsbGlhU3Via2V5UigzMCkgPSBzdWJyKDI5KSBeIHN1YnIoMzEpOworICAgIENhbWVsbGlhU3Via2V5TCgzMSkgPSBzdWJsKDMwKTsKKyAgICBDYW1lbGxpYVN1YmtleVIoMzEpID0gc3VicigzMCk7CisgICAgQ2FtZWxsaWFTdWJrZXlMKDMyKSA9IHN1YmwoMzIpIF4gc3VibCgzMSk7CisgICAgQ2FtZWxsaWFTdWJrZXlSKDMyKSA9IHN1YnIoMzIpIF4gc3VicigzMSk7CisKKyAgICAvKiBhcHBseSB0aGUgaW52ZXJzZSBvZiB0aGUgbGFzdCBoYWxmIG9mIFAtZnVuY3Rpb24gKi8KKyAgICBkdyA9IENhbWVsbGlhU3Via2V5TCgyKSBeIENhbWVsbGlhU3Via2V5UigyKSwgZHcgPSBDQU1FTExJQV9STDgoZHcpOworICAgIENhbWVsbGlhU3Via2V5UigyKSA9IENhbWVsbGlhU3Via2V5TCgyKSBeIGR3LCBDYW1lbGxpYVN1YmtleUwoMikgPSBkdzsKKyAgICBkdyA9IENhbWVsbGlhU3Via2V5TCgzKSBeIENhbWVsbGlhU3Via2V5UigzKSwgZHcgPSBDQU1FTExJQV9STDgoZHcpOworICAgIENhbWVsbGlhU3Via2V5UigzKSA9IENhbWVsbGlhU3Via2V5TCgzKSBeIGR3LCBDYW1lbGxpYVN1YmtleUwoMykgPSBkdzsKKyAgICBkdyA9IENhbWVsbGlhU3Via2V5TCg0KSBeIENhbWVsbGlhU3Via2V5Uig0KSwgZHcgPSBDQU1FTExJQV9STDgoZHcpOworICAgIENhbWVsbGlhU3Via2V5Uig0KSA9IENhbWVsbGlhU3Via2V5TCg0KSBeIGR3LCBDYW1lbGxpYVN1YmtleUwoNCkgPSBkdzsKKyAgICBkdyA9IENhbWVsbGlhU3Via2V5TCg1KSBeIENhbWVsbGlhU3Via2V5Uig1KSwgZHcgPSBDQU1FTExJQV9STDgoZHcpOworICAgIENhbWVsbGlhU3Via2V5Uig1KSA9IENhbWVsbGlhU3Via2V5TCg1KSBeIGR3LCBDYW1lbGxpYVN1YmtleUwoNSkgPSBkdzsKKyAgICBkdyA9IENhbWVsbGlhU3Via2V5TCg2KSBeIENhbWVsbGlhU3Via2V5Uig2KSwgZHcgPSBDQU1FTExJQV9STDgoZHcpOworICAgIENhbWVsbGlhU3Via2V5Uig2KSA9IENhbWVsbGlhU3Via2V5TCg2KSBeIGR3LCBDYW1lbGxpYVN1YmtleUwoNikgPSBkdzsKKyAgICBkdyA9IENhbWVsbGlhU3Via2V5TCg3KSBeIENhbWVsbGlhU3Via2V5Uig3KSwgZHcgPSBDQU1FTExJQV9STDgoZHcpOworICAgIENhbWVsbGlhU3Via2V5Uig3KSA9IENhbWVsbGlhU3Via2V5TCg3KSBeIGR3LCBDYW1lbGxpYVN1YmtleUwoNykgPSBkdzsKKyAgICBkdyA9IENhbWVsbGlhU3Via2V5TCgxMCkgXiBDYW1lbGxpYVN1YmtleVIoMTApLCBkdyA9IENBTUVMTElBX1JMOChkdyk7CisgICAgQ2FtZWxsaWFTdWJrZXlSKDEwKSA9IENhbWVsbGlhU3Via2V5TCgxMCkgXiBkdywgQ2FtZWxsaWFTdWJrZXlMKDEwKSA9IGR3OworICAgIGR3ID0gQ2FtZWxsaWFTdWJrZXlMKDExKSBeIENhbWVsbGlhU3Via2V5UigxMSksIGR3ID0gQ0FNRUxMSUFfUkw4KGR3KTsKKyAgICBDYW1lbGxpYVN1YmtleVIoMTEpID0gQ2FtZWxsaWFTdWJrZXlMKDExKSBeIGR3LCBDYW1lbGxpYVN1YmtleUwoMTEpID0gZHc7CisgICAgZHcgPSBDYW1lbGxpYVN1YmtleUwoMTIpIF4gQ2FtZWxsaWFTdWJrZXlSKDEyKSwgZHcgPSBDQU1FTExJQV9STDgoZHcpOworICAgIENhbWVsbGlhU3Via2V5UigxMikgPSBDYW1lbGxpYVN1YmtleUwoMTIpIF4gZHcsIENhbWVsbGlhU3Via2V5TCgxMikgPSBkdzsKKyAgICBkdyA9IENhbWVsbGlhU3Via2V5TCgxMykgXiBDYW1lbGxpYVN1YmtleVIoMTMpLCBkdyA9IENBTUVMTElBX1JMOChkdyk7CisgICAgQ2FtZWxsaWFTdWJrZXlSKDEzKSA9IENhbWVsbGlhU3Via2V5TCgxMykgXiBkdywgQ2FtZWxsaWFTdWJrZXlMKDEzKSA9IGR3OworICAgIGR3ID0gQ2FtZWxsaWFTdWJrZXlMKDE0KSBeIENhbWVsbGlhU3Via2V5UigxNCksIGR3ID0gQ0FNRUxMSUFfUkw4KGR3KTsKKyAgICBDYW1lbGxpYVN1YmtleVIoMTQpID0gQ2FtZWxsaWFTdWJrZXlMKDE0KSBeIGR3LCBDYW1lbGxpYVN1YmtleUwoMTQpID0gZHc7CisgICAgZHcgPSBDYW1lbGxpYVN1YmtleUwoMTUpIF4gQ2FtZWxsaWFTdWJrZXlSKDE1KSwgZHcgPSBDQU1FTExJQV9STDgoZHcpOworICAgIENhbWVsbGlhU3Via2V5UigxNSkgPSBDYW1lbGxpYVN1YmtleUwoMTUpIF4gZHcsIENhbWVsbGlhU3Via2V5TCgxNSkgPSBkdzsKKyAgICBkdyA9IENhbWVsbGlhU3Via2V5TCgxOCkgXiBDYW1lbGxpYVN1YmtleVIoMTgpLCBkdyA9IENBTUVMTElBX1JMOChkdyk7CisgICAgQ2FtZWxsaWFTdWJrZXlSKDE4KSA9IENhbWVsbGlhU3Via2V5TCgxOCkgXiBkdywgQ2FtZWxsaWFTdWJrZXlMKDE4KSA9IGR3OworICAgIGR3ID0gQ2FtZWxsaWFTdWJrZXlMKDE5KSBeIENhbWVsbGlhU3Via2V5UigxOSksIGR3ID0gQ0FNRUxMSUFfUkw4KGR3KTsKKyAgICBDYW1lbGxpYVN1YmtleVIoMTkpID0gQ2FtZWxsaWFTdWJrZXlMKDE5KSBeIGR3LCBDYW1lbGxpYVN1YmtleUwoMTkpID0gZHc7CisgICAgZHcgPSBDYW1lbGxpYVN1YmtleUwoMjApIF4gQ2FtZWxsaWFTdWJrZXlSKDIwKSwgZHcgPSBDQU1FTExJQV9STDgoZHcpOworICAgIENhbWVsbGlhU3Via2V5UigyMCkgPSBDYW1lbGxpYVN1YmtleUwoMjApIF4gZHcsIENhbWVsbGlhU3Via2V5TCgyMCkgPSBkdzsKKyAgICBkdyA9IENhbWVsbGlhU3Via2V5TCgyMSkgXiBDYW1lbGxpYVN1YmtleVIoMjEpLCBkdyA9IENBTUVMTElBX1JMOChkdyk7CisgICAgQ2FtZWxsaWFTdWJrZXlSKDIxKSA9IENhbWVsbGlhU3Via2V5TCgyMSkgXiBkdywgQ2FtZWxsaWFTdWJrZXlMKDIxKSA9IGR3OworICAgIGR3ID0gQ2FtZWxsaWFTdWJrZXlMKDIyKSBeIENhbWVsbGlhU3Via2V5UigyMiksIGR3ID0gQ0FNRUxMSUFfUkw4KGR3KTsKKyAgICBDYW1lbGxpYVN1YmtleVIoMjIpID0gQ2FtZWxsaWFTdWJrZXlMKDIyKSBeIGR3LCBDYW1lbGxpYVN1YmtleUwoMjIpID0gZHc7CisgICAgZHcgPSBDYW1lbGxpYVN1YmtleUwoMjMpIF4gQ2FtZWxsaWFTdWJrZXlSKDIzKSwgZHcgPSBDQU1FTExJQV9STDgoZHcpOworICAgIENhbWVsbGlhU3Via2V5UigyMykgPSBDYW1lbGxpYVN1YmtleUwoMjMpIF4gZHcsIENhbWVsbGlhU3Via2V5TCgyMykgPSBkdzsKKyAgICBkdyA9IENhbWVsbGlhU3Via2V5TCgyNikgXiBDYW1lbGxpYVN1YmtleVIoMjYpLCBkdyA9IENBTUVMTElBX1JMOChkdyk7CisgICAgQ2FtZWxsaWFTdWJrZXlSKDI2KSA9IENhbWVsbGlhU3Via2V5TCgyNikgXiBkdywgQ2FtZWxsaWFTdWJrZXlMKDI2KSA9IGR3OworICAgIGR3ID0gQ2FtZWxsaWFTdWJrZXlMKDI3KSBeIENhbWVsbGlhU3Via2V5UigyNyksIGR3ID0gQ0FNRUxMSUFfUkw4KGR3KTsKKyAgICBDYW1lbGxpYVN1YmtleVIoMjcpID0gQ2FtZWxsaWFTdWJrZXlMKDI3KSBeIGR3LCBDYW1lbGxpYVN1YmtleUwoMjcpID0gZHc7CisgICAgZHcgPSBDYW1lbGxpYVN1YmtleUwoMjgpIF4gQ2FtZWxsaWFTdWJrZXlSKDI4KSwgZHcgPSBDQU1FTExJQV9STDgoZHcpOworICAgIENhbWVsbGlhU3Via2V5UigyOCkgPSBDYW1lbGxpYVN1YmtleUwoMjgpIF4gZHcsIENhbWVsbGlhU3Via2V5TCgyOCkgPSBkdzsKKyAgICBkdyA9IENhbWVsbGlhU3Via2V5TCgyOSkgXiBDYW1lbGxpYVN1YmtleVIoMjkpLCBkdyA9IENBTUVMTElBX1JMOChkdyk7CisgICAgQ2FtZWxsaWFTdWJrZXlSKDI5KSA9IENhbWVsbGlhU3Via2V5TCgyOSkgXiBkdywgQ2FtZWxsaWFTdWJrZXlMKDI5KSA9IGR3OworICAgIGR3ID0gQ2FtZWxsaWFTdWJrZXlMKDMwKSBeIENhbWVsbGlhU3Via2V5UigzMCksIGR3ID0gQ0FNRUxMSUFfUkw4KGR3KTsKKyAgICBDYW1lbGxpYVN1YmtleVIoMzApID0gQ2FtZWxsaWFTdWJrZXlMKDMwKSBeIGR3LCBDYW1lbGxpYVN1YmtleUwoMzApID0gZHc7CisgICAgZHcgPSBDYW1lbGxpYVN1YmtleUwoMzEpIF4gQ2FtZWxsaWFTdWJrZXlSKDMxKSwgZHcgPSBDQU1FTExJQV9STDgoZHcpOworICAgIENhbWVsbGlhU3Via2V5UigzMSkgPSBDYW1lbGxpYVN1YmtleUwoMzEpIF4gZHcsQ2FtZWxsaWFTdWJrZXlMKDMxKSA9IGR3OworICAgIAorICAgIHJldHVybjsKK30KKwordm9pZCBjYW1lbGxpYV9zZXR1cDE5Mihjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIHUzMiAqc3Via2V5KQoreworICAgIHVuc2lnbmVkIGNoYXIga2tbMzJdOworICAgIHUzMiBrcmxsLCBrcmxyLCBrcnJsLGtycnI7CisKKyAgICBtZW1jcHkoa2ssIGtleSwgMjQpOworICAgIG1lbWNweSgodW5zaWduZWQgY2hhciAqKSZrcmxsLCBrZXkrMTYsNCk7CisgICAgbWVtY3B5KCh1bnNpZ25lZCBjaGFyICopJmtybHIsIGtleSsyMCw0KTsKKyAgICBrcnJsID0gfmtybGw7CisgICAga3JyciA9IH5rcmxyOworICAgIG1lbWNweShraysyNCwgKHVuc2lnbmVkIGNoYXIgKikma3JybCwgNCk7CisgICAgbWVtY3B5KGtrKzI4LCAodW5zaWduZWQgY2hhciAqKSZrcnJyLCA0KTsKKyAgICBjYW1lbGxpYV9zZXR1cDI1Nihraywgc3Via2V5KTsKKyAgICByZXR1cm47Cit9CisKKworLyoqCisgKiBTdHVmZiByZWxhdGVkIHRvIGNhbWVsbGlhIGVuY3J5cHRpb24vZGVjcnlwdGlvbgorICoKKyAqICJpbyIgbXVzdCBiZSA0Ynl0ZSBhbGlnbmVkIGFuZCBiaWctZW5kaWFuIGRhdGEuCisgKi8KK3ZvaWQgY2FtZWxsaWFfZW5jcnlwdDEyOChjb25zdCB1MzIgKnN1YmtleSwgdTMyICppbykKK3sKKyAgICB1MzIgaWwsIGlyLCB0MCwgdDE7CisKKyAgICAvKiBwcmUgd2hpdGVuaW5nIGJ1dCBhYnNvcmIga3cyKi8KKyAgICBpb1swXSBePSBDYW1lbGxpYVN1YmtleUwoMCk7CisgICAgaW9bMV0gXj0gQ2FtZWxsaWFTdWJrZXlSKDApOworICAgIC8qIG1haW4gaXRlcmF0aW9uICovCisKKyAgICBDQU1FTExJQV9ST1VORFNNKGlvWzBdLGlvWzFdLAorCQkgICAgIENhbWVsbGlhU3Via2V5TCgyKSxDYW1lbGxpYVN1YmtleVIoMiksCisJCSAgICAgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworICAgIENBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCSAgICAgQ2FtZWxsaWFTdWJrZXlMKDMpLENhbWVsbGlhU3Via2V5UigzKSwKKwkJICAgICBpb1swXSxpb1sxXSxpbCxpcix0MCx0MSk7CisgICAgQ0FNRUxMSUFfUk9VTkRTTShpb1swXSxpb1sxXSwKKwkJICAgICBDYW1lbGxpYVN1YmtleUwoNCksQ2FtZWxsaWFTdWJrZXlSKDQpLAorCQkgICAgIGlvWzJdLGlvWzNdLGlsLGlyLHQwLHQxKTsKKyAgICBDQU1FTExJQV9ST1VORFNNKGlvWzJdLGlvWzNdLAorCQkgICAgIENhbWVsbGlhU3Via2V5TCg1KSxDYW1lbGxpYVN1YmtleVIoNSksCisJCSAgICAgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworICAgIENBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCSAgICAgQ2FtZWxsaWFTdWJrZXlMKDYpLENhbWVsbGlhU3Via2V5Uig2KSwKKwkJICAgICBpb1syXSxpb1szXSxpbCxpcix0MCx0MSk7CisgICAgQ0FNRUxMSUFfUk9VTkRTTShpb1syXSxpb1szXSwKKwkJICAgICBDYW1lbGxpYVN1YmtleUwoNyksQ2FtZWxsaWFTdWJrZXlSKDcpLAorCQkgICAgIGlvWzBdLGlvWzFdLGlsLGlyLHQwLHQxKTsKKworICAgIENBTUVMTElBX0ZMUyhpb1swXSxpb1sxXSxpb1syXSxpb1szXSwKKwkJIENhbWVsbGlhU3Via2V5TCg4KSxDYW1lbGxpYVN1YmtleVIoOCksCisJCSBDYW1lbGxpYVN1YmtleUwoOSksQ2FtZWxsaWFTdWJrZXlSKDkpLAorCQkgdDAsdDEsaWwsaXIpOworCisgICAgQ0FNRUxMSUFfUk9VTkRTTShpb1swXSxpb1sxXSwKKwkJICAgICBDYW1lbGxpYVN1YmtleUwoMTApLENhbWVsbGlhU3Via2V5UigxMCksCisJCSAgICAgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworICAgIENBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCSAgICAgQ2FtZWxsaWFTdWJrZXlMKDExKSxDYW1lbGxpYVN1YmtleVIoMTEpLAorCQkgICAgIGlvWzBdLGlvWzFdLGlsLGlyLHQwLHQxKTsKKyAgICBDQU1FTExJQV9ST1VORFNNKGlvWzBdLGlvWzFdLAorCQkgICAgIENhbWVsbGlhU3Via2V5TCgxMiksQ2FtZWxsaWFTdWJrZXlSKDEyKSwKKwkJICAgICBpb1syXSxpb1szXSxpbCxpcix0MCx0MSk7CisgICAgQ0FNRUxMSUFfUk9VTkRTTShpb1syXSxpb1szXSwKKwkJICAgICBDYW1lbGxpYVN1YmtleUwoMTMpLENhbWVsbGlhU3Via2V5UigxMyksCisJCSAgICAgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworICAgIENBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCSAgICAgQ2FtZWxsaWFTdWJrZXlMKDE0KSxDYW1lbGxpYVN1YmtleVIoMTQpLAorCQkgICAgIGlvWzJdLGlvWzNdLGlsLGlyLHQwLHQxKTsKKyAgICBDQU1FTExJQV9ST1VORFNNKGlvWzJdLGlvWzNdLAorCQkgICAgIENhbWVsbGlhU3Via2V5TCgxNSksQ2FtZWxsaWFTdWJrZXlSKDE1KSwKKwkJICAgICBpb1swXSxpb1sxXSxpbCxpcix0MCx0MSk7CisKKyAgICBDQU1FTExJQV9GTFMoaW9bMF0saW9bMV0saW9bMl0saW9bM10sCisJCSBDYW1lbGxpYVN1YmtleUwoMTYpLENhbWVsbGlhU3Via2V5UigxNiksCisJCSBDYW1lbGxpYVN1YmtleUwoMTcpLENhbWVsbGlhU3Via2V5UigxNyksCisJCSB0MCx0MSxpbCxpcik7CisKKyAgICBDQU1FTExJQV9ST1VORFNNKGlvWzBdLGlvWzFdLAorCQkgICAgIENhbWVsbGlhU3Via2V5TCgxOCksQ2FtZWxsaWFTdWJrZXlSKDE4KSwKKwkJICAgICBpb1syXSxpb1szXSxpbCxpcix0MCx0MSk7CisgICAgQ0FNRUxMSUFfUk9VTkRTTShpb1syXSxpb1szXSwKKwkJICAgICBDYW1lbGxpYVN1YmtleUwoMTkpLENhbWVsbGlhU3Via2V5UigxOSksCisJCSAgICAgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworICAgIENBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCSAgICAgQ2FtZWxsaWFTdWJrZXlMKDIwKSxDYW1lbGxpYVN1YmtleVIoMjApLAorCQkgICAgIGlvWzJdLGlvWzNdLGlsLGlyLHQwLHQxKTsKKyAgICBDQU1FTExJQV9ST1VORFNNKGlvWzJdLGlvWzNdLAorCQkgICAgIENhbWVsbGlhU3Via2V5TCgyMSksQ2FtZWxsaWFTdWJrZXlSKDIxKSwKKwkJICAgICBpb1swXSxpb1sxXSxpbCxpcix0MCx0MSk7CisgICAgQ0FNRUxMSUFfUk9VTkRTTShpb1swXSxpb1sxXSwKKwkJICAgICBDYW1lbGxpYVN1YmtleUwoMjIpLENhbWVsbGlhU3Via2V5UigyMiksCisJCSAgICAgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworICAgIENBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCSAgICAgQ2FtZWxsaWFTdWJrZXlMKDIzKSxDYW1lbGxpYVN1YmtleVIoMjMpLAorCQkgICAgIGlvWzBdLGlvWzFdLGlsLGlyLHQwLHQxKTsKKworICAgIC8qIHBvc3Qgd2hpdGVuaW5nIGJ1dCBrdzQgKi8KKyAgICBpb1syXSBePSBDYW1lbGxpYVN1YmtleUwoMjQpOworICAgIGlvWzNdIF49IENhbWVsbGlhU3Via2V5UigyNCk7CisKKyAgICB0MCA9IGlvWzBdOworICAgIHQxID0gaW9bMV07CisgICAgaW9bMF0gPSBpb1syXTsKKyAgICBpb1sxXSA9IGlvWzNdOworICAgIGlvWzJdID0gdDA7CisgICAgaW9bM10gPSB0MTsKKwkKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgY2FtZWxsaWFfZGVjcnlwdDEyOChjb25zdCB1MzIgKnN1YmtleSwgdTMyICppbykKK3sKKyAgICB1MzIgaWwsaXIsdDAsdDE7ICAgICAgICAgICAgICAgLyogdGVtcG9yYXJ5IHZhbGlhYmxlcyAqLworICAgIAorICAgIC8qIHByZSB3aGl0ZW5pbmcgYnV0IGFic29yYiBrdzIqLworICAgIGlvWzBdIF49IENhbWVsbGlhU3Via2V5TCgyNCk7CisgICAgaW9bMV0gXj0gQ2FtZWxsaWFTdWJrZXlSKDI0KTsKKworICAgIC8qIG1haW4gaXRlcmF0aW9uICovCisgICAgQ0FNRUxMSUFfUk9VTkRTTShpb1swXSxpb1sxXSwKKwkJICAgICBDYW1lbGxpYVN1YmtleUwoMjMpLENhbWVsbGlhU3Via2V5UigyMyksCisJCSAgICAgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworICAgIENBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCSAgICAgQ2FtZWxsaWFTdWJrZXlMKDIyKSxDYW1lbGxpYVN1YmtleVIoMjIpLAorCQkgICAgIGlvWzBdLGlvWzFdLGlsLGlyLHQwLHQxKTsKKyAgICBDQU1FTExJQV9ST1VORFNNKGlvWzBdLGlvWzFdLAorCQkgICAgIENhbWVsbGlhU3Via2V5TCgyMSksQ2FtZWxsaWFTdWJrZXlSKDIxKSwKKwkJICAgICBpb1syXSxpb1szXSxpbCxpcix0MCx0MSk7CisgICAgQ0FNRUxMSUFfUk9VTkRTTShpb1syXSxpb1szXSwKKwkJICAgICBDYW1lbGxpYVN1YmtleUwoMjApLENhbWVsbGlhU3Via2V5UigyMCksCisJCSAgICAgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworICAgIENBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCSAgICAgQ2FtZWxsaWFTdWJrZXlMKDE5KSxDYW1lbGxpYVN1YmtleVIoMTkpLAorCQkgICAgIGlvWzJdLGlvWzNdLGlsLGlyLHQwLHQxKTsKKyAgICBDQU1FTExJQV9ST1VORFNNKGlvWzJdLGlvWzNdLAorCQkgICAgIENhbWVsbGlhU3Via2V5TCgxOCksQ2FtZWxsaWFTdWJrZXlSKDE4KSwKKwkJICAgICBpb1swXSxpb1sxXSxpbCxpcix0MCx0MSk7CisKKyAgICBDQU1FTExJQV9GTFMoaW9bMF0saW9bMV0saW9bMl0saW9bM10sCisJCSBDYW1lbGxpYVN1YmtleUwoMTcpLENhbWVsbGlhU3Via2V5UigxNyksCisJCSBDYW1lbGxpYVN1YmtleUwoMTYpLENhbWVsbGlhU3Via2V5UigxNiksCisJCSB0MCx0MSxpbCxpcik7CisKKyAgICBDQU1FTExJQV9ST1VORFNNKGlvWzBdLGlvWzFdLAorCQkgICAgIENhbWVsbGlhU3Via2V5TCgxNSksQ2FtZWxsaWFTdWJrZXlSKDE1KSwKKwkJICAgICBpb1syXSxpb1szXSxpbCxpcix0MCx0MSk7CisgICAgQ0FNRUxMSUFfUk9VTkRTTShpb1syXSxpb1szXSwKKwkJICAgICBDYW1lbGxpYVN1YmtleUwoMTQpLENhbWVsbGlhU3Via2V5UigxNCksCisJCSAgICAgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworICAgIENBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCSAgICAgQ2FtZWxsaWFTdWJrZXlMKDEzKSxDYW1lbGxpYVN1YmtleVIoMTMpLAorCQkgICAgIGlvWzJdLGlvWzNdLGlsLGlyLHQwLHQxKTsKKyAgICBDQU1FTExJQV9ST1VORFNNKGlvWzJdLGlvWzNdLAorCQkgICAgIENhbWVsbGlhU3Via2V5TCgxMiksQ2FtZWxsaWFTdWJrZXlSKDEyKSwKKwkJICAgICBpb1swXSxpb1sxXSxpbCxpcix0MCx0MSk7CisgICAgQ0FNRUxMSUFfUk9VTkRTTShpb1swXSxpb1sxXSwKKwkJICAgICBDYW1lbGxpYVN1YmtleUwoMTEpLENhbWVsbGlhU3Via2V5UigxMSksCisJCSAgICAgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworICAgIENBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCSAgICAgQ2FtZWxsaWFTdWJrZXlMKDEwKSxDYW1lbGxpYVN1YmtleVIoMTApLAorCQkgICAgIGlvWzBdLGlvWzFdLGlsLGlyLHQwLHQxKTsKKworICAgIENBTUVMTElBX0ZMUyhpb1swXSxpb1sxXSxpb1syXSxpb1szXSwKKwkJIENhbWVsbGlhU3Via2V5TCg5KSxDYW1lbGxpYVN1YmtleVIoOSksCisJCSBDYW1lbGxpYVN1YmtleUwoOCksQ2FtZWxsaWFTdWJrZXlSKDgpLAorCQkgdDAsdDEsaWwsaXIpOworCisgICAgQ0FNRUxMSUFfUk9VTkRTTShpb1swXSxpb1sxXSwKKwkJICAgICBDYW1lbGxpYVN1YmtleUwoNyksQ2FtZWxsaWFTdWJrZXlSKDcpLAorCQkgICAgIGlvWzJdLGlvWzNdLGlsLGlyLHQwLHQxKTsKKyAgICBDQU1FTExJQV9ST1VORFNNKGlvWzJdLGlvWzNdLAorCQkgICAgIENhbWVsbGlhU3Via2V5TCg2KSxDYW1lbGxpYVN1YmtleVIoNiksCisJCSAgICAgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworICAgIENBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCSAgICAgQ2FtZWxsaWFTdWJrZXlMKDUpLENhbWVsbGlhU3Via2V5Uig1KSwKKwkJICAgICBpb1syXSxpb1szXSxpbCxpcix0MCx0MSk7CisgICAgQ0FNRUxMSUFfUk9VTkRTTShpb1syXSxpb1szXSwKKwkJICAgICBDYW1lbGxpYVN1YmtleUwoNCksQ2FtZWxsaWFTdWJrZXlSKDQpLAorCQkgICAgIGlvWzBdLGlvWzFdLGlsLGlyLHQwLHQxKTsKKyAgICBDQU1FTExJQV9ST1VORFNNKGlvWzBdLGlvWzFdLAorCQkgICAgIENhbWVsbGlhU3Via2V5TCgzKSxDYW1lbGxpYVN1YmtleVIoMyksCisJCSAgICAgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworICAgIENBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCSAgICAgQ2FtZWxsaWFTdWJrZXlMKDIpLENhbWVsbGlhU3Via2V5UigyKSwKKwkJICAgICBpb1swXSxpb1sxXSxpbCxpcix0MCx0MSk7CisKKyAgICAvKiBwb3N0IHdoaXRlbmluZyBidXQga3c0ICovCisgICAgaW9bMl0gXj0gQ2FtZWxsaWFTdWJrZXlMKDApOworICAgIGlvWzNdIF49IENhbWVsbGlhU3Via2V5UigwKTsKKworICAgIHQwID0gaW9bMF07CisgICAgdDEgPSBpb1sxXTsKKyAgICBpb1swXSA9IGlvWzJdOworICAgIGlvWzFdID0gaW9bM107CisgICAgaW9bMl0gPSB0MDsKKyAgICBpb1szXSA9IHQxOworCisgICAgcmV0dXJuOworfQorCisvKioKKyAqIHN0dWZmIGZvciAxOTIgYW5kIDI1NmJpdCBlbmNyeXB0aW9uL2RlY3J5cHRpb24KKyAqLwordm9pZCBjYW1lbGxpYV9lbmNyeXB0MjU2KGNvbnN0IHUzMiAqc3Via2V5LCB1MzIgKmlvKQoreworICAgIHUzMiBpbCxpcix0MCx0MTsgICAgICAgICAgIC8qIHRlbXBvcmFyeSB2YWxpYWJsZXMgKi8KKworICAgIC8qIHByZSB3aGl0ZW5pbmcgYnV0IGFic29yYiBrdzIqLworICAgIGlvWzBdIF49IENhbWVsbGlhU3Via2V5TCgwKTsKKyAgICBpb1sxXSBePSBDYW1lbGxpYVN1YmtleVIoMCk7CisKKyAgICAvKiBtYWluIGl0ZXJhdGlvbiAqLworICAgIENBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCSAgICAgQ2FtZWxsaWFTdWJrZXlMKDIpLENhbWVsbGlhU3Via2V5UigyKSwKKwkJICAgICBpb1syXSxpb1szXSxpbCxpcix0MCx0MSk7CisgICAgQ0FNRUxMSUFfUk9VTkRTTShpb1syXSxpb1szXSwKKwkJICAgICBDYW1lbGxpYVN1YmtleUwoMyksQ2FtZWxsaWFTdWJrZXlSKDMpLAorCQkgICAgIGlvWzBdLGlvWzFdLGlsLGlyLHQwLHQxKTsKKyAgICBDQU1FTExJQV9ST1VORFNNKGlvWzBdLGlvWzFdLAorCQkgICAgIENhbWVsbGlhU3Via2V5TCg0KSxDYW1lbGxpYVN1YmtleVIoNCksCisJCSAgICAgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworICAgIENBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCSAgICAgQ2FtZWxsaWFTdWJrZXlMKDUpLENhbWVsbGlhU3Via2V5Uig1KSwKKwkJICAgICBpb1swXSxpb1sxXSxpbCxpcix0MCx0MSk7CisgICAgQ0FNRUxMSUFfUk9VTkRTTShpb1swXSxpb1sxXSwKKwkJICAgICBDYW1lbGxpYVN1YmtleUwoNiksQ2FtZWxsaWFTdWJrZXlSKDYpLAorCQkgICAgIGlvWzJdLGlvWzNdLGlsLGlyLHQwLHQxKTsKKyAgICBDQU1FTExJQV9ST1VORFNNKGlvWzJdLGlvWzNdLAorCQkgICAgIENhbWVsbGlhU3Via2V5TCg3KSxDYW1lbGxpYVN1YmtleVIoNyksCisJCSAgICAgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworCisgICAgQ0FNRUxMSUFfRkxTKGlvWzBdLGlvWzFdLGlvWzJdLGlvWzNdLAorCQkgQ2FtZWxsaWFTdWJrZXlMKDgpLENhbWVsbGlhU3Via2V5Uig4KSwKKwkJIENhbWVsbGlhU3Via2V5TCg5KSxDYW1lbGxpYVN1YmtleVIoOSksCisJCSB0MCx0MSxpbCxpcik7CisKKyAgICBDQU1FTExJQV9ST1VORFNNKGlvWzBdLGlvWzFdLAorCQkgICAgIENhbWVsbGlhU3Via2V5TCgxMCksQ2FtZWxsaWFTdWJrZXlSKDEwKSwKKwkJICAgICBpb1syXSxpb1szXSxpbCxpcix0MCx0MSk7CisgICAgQ0FNRUxMSUFfUk9VTkRTTShpb1syXSxpb1szXSwKKwkJICAgICBDYW1lbGxpYVN1YmtleUwoMTEpLENhbWVsbGlhU3Via2V5UigxMSksCisJCSAgICAgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworICAgIENBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCSAgICAgQ2FtZWxsaWFTdWJrZXlMKDEyKSxDYW1lbGxpYVN1YmtleVIoMTIpLAorCQkgICAgIGlvWzJdLGlvWzNdLGlsLGlyLHQwLHQxKTsKKyAgICBDQU1FTExJQV9ST1VORFNNKGlvWzJdLGlvWzNdLAorCQkgICAgIENhbWVsbGlhU3Via2V5TCgxMyksQ2FtZWxsaWFTdWJrZXlSKDEzKSwKKwkJICAgICBpb1swXSxpb1sxXSxpbCxpcix0MCx0MSk7CisgICAgQ0FNRUxMSUFfUk9VTkRTTShpb1swXSxpb1sxXSwKKwkJICAgICBDYW1lbGxpYVN1YmtleUwoMTQpLENhbWVsbGlhU3Via2V5UigxNCksCisJCSAgICAgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworICAgIENBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCSAgICAgQ2FtZWxsaWFTdWJrZXlMKDE1KSxDYW1lbGxpYVN1YmtleVIoMTUpLAorCQkgICAgIGlvWzBdLGlvWzFdLGlsLGlyLHQwLHQxKTsKKworICAgIENBTUVMTElBX0ZMUyhpb1swXSxpb1sxXSxpb1syXSxpb1szXSwKKwkJIENhbWVsbGlhU3Via2V5TCgxNiksQ2FtZWxsaWFTdWJrZXlSKDE2KSwKKwkJIENhbWVsbGlhU3Via2V5TCgxNyksQ2FtZWxsaWFTdWJrZXlSKDE3KSwKKwkJIHQwLHQxLGlsLGlyKTsKKworICAgIENBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCSAgICAgQ2FtZWxsaWFTdWJrZXlMKDE4KSxDYW1lbGxpYVN1YmtleVIoMTgpLAorCQkgICAgIGlvWzJdLGlvWzNdLGlsLGlyLHQwLHQxKTsKKyAgICBDQU1FTExJQV9ST1VORFNNKGlvWzJdLGlvWzNdLAorCQkgICAgIENhbWVsbGlhU3Via2V5TCgxOSksQ2FtZWxsaWFTdWJrZXlSKDE5KSwKKwkJICAgICBpb1swXSxpb1sxXSxpbCxpcix0MCx0MSk7CisgICAgQ0FNRUxMSUFfUk9VTkRTTShpb1swXSxpb1sxXSwKKwkJICAgICBDYW1lbGxpYVN1YmtleUwoMjApLENhbWVsbGlhU3Via2V5UigyMCksCisJCSAgICAgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworICAgIENBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCSAgICAgQ2FtZWxsaWFTdWJrZXlMKDIxKSxDYW1lbGxpYVN1YmtleVIoMjEpLAorCQkgICAgIGlvWzBdLGlvWzFdLGlsLGlyLHQwLHQxKTsKKyAgICBDQU1FTExJQV9ST1VORFNNKGlvWzBdLGlvWzFdLAorCQkgICAgIENhbWVsbGlhU3Via2V5TCgyMiksQ2FtZWxsaWFTdWJrZXlSKDIyKSwKKwkJICAgICBpb1syXSxpb1szXSxpbCxpcix0MCx0MSk7CisgICAgQ0FNRUxMSUFfUk9VTkRTTShpb1syXSxpb1szXSwKKwkJICAgICBDYW1lbGxpYVN1YmtleUwoMjMpLENhbWVsbGlhU3Via2V5UigyMyksCisJCSAgICAgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworCisgICAgQ0FNRUxMSUFfRkxTKGlvWzBdLGlvWzFdLGlvWzJdLGlvWzNdLAorCQkgQ2FtZWxsaWFTdWJrZXlMKDI0KSxDYW1lbGxpYVN1YmtleVIoMjQpLAorCQkgQ2FtZWxsaWFTdWJrZXlMKDI1KSxDYW1lbGxpYVN1YmtleVIoMjUpLAorCQkgdDAsdDEsaWwsaXIpOworCisgICAgQ0FNRUxMSUFfUk9VTkRTTShpb1swXSxpb1sxXSwKKwkJICAgICBDYW1lbGxpYVN1YmtleUwoMjYpLENhbWVsbGlhU3Via2V5UigyNiksCisJCSAgICAgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworICAgIENBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCSAgICAgQ2FtZWxsaWFTdWJrZXlMKDI3KSxDYW1lbGxpYVN1YmtleVIoMjcpLAorCQkgICAgIGlvWzBdLGlvWzFdLGlsLGlyLHQwLHQxKTsKKyAgICBDQU1FTExJQV9ST1VORFNNKGlvWzBdLGlvWzFdLAorCQkgICAgIENhbWVsbGlhU3Via2V5TCgyOCksQ2FtZWxsaWFTdWJrZXlSKDI4KSwKKwkJICAgICBpb1syXSxpb1szXSxpbCxpcix0MCx0MSk7CisgICAgQ0FNRUxMSUFfUk9VTkRTTShpb1syXSxpb1szXSwKKwkJICAgICBDYW1lbGxpYVN1YmtleUwoMjkpLENhbWVsbGlhU3Via2V5UigyOSksCisJCSAgICAgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworICAgIENBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCSAgICAgQ2FtZWxsaWFTdWJrZXlMKDMwKSxDYW1lbGxpYVN1YmtleVIoMzApLAorCQkgICAgIGlvWzJdLGlvWzNdLGlsLGlyLHQwLHQxKTsKKyAgICBDQU1FTExJQV9ST1VORFNNKGlvWzJdLGlvWzNdLAorCQkgICAgIENhbWVsbGlhU3Via2V5TCgzMSksQ2FtZWxsaWFTdWJrZXlSKDMxKSwKKwkJICAgICBpb1swXSxpb1sxXSxpbCxpcix0MCx0MSk7CisKKyAgICAvKiBwb3N0IHdoaXRlbmluZyBidXQga3c0ICovCisgICAgaW9bMl0gXj0gQ2FtZWxsaWFTdWJrZXlMKDMyKTsKKyAgICBpb1szXSBePSBDYW1lbGxpYVN1YmtleVIoMzIpOworCisgICAgdDAgPSBpb1swXTsKKyAgICB0MSA9IGlvWzFdOworICAgIGlvWzBdID0gaW9bMl07CisgICAgaW9bMV0gPSBpb1szXTsKKyAgICBpb1syXSA9IHQwOworICAgIGlvWzNdID0gdDE7CisKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgY2FtZWxsaWFfZGVjcnlwdDI1Nihjb25zdCB1MzIgKnN1YmtleSwgdTMyICppbykKK3sKKyAgICB1MzIgaWwsaXIsdDAsdDE7ICAgICAgICAgICAvKiB0ZW1wb3JhcnkgdmFsaWFibGVzICovCisKKyAgICAvKiBwcmUgd2hpdGVuaW5nIGJ1dCBhYnNvcmIga3cyKi8KKyAgICBpb1swXSBePSBDYW1lbGxpYVN1YmtleUwoMzIpOworICAgIGlvWzFdIF49IENhbWVsbGlhU3Via2V5UigzMik7CisJCisgICAgLyogbWFpbiBpdGVyYXRpb24gKi8KKyAgICBDQU1FTExJQV9ST1VORFNNKGlvWzBdLGlvWzFdLAorCQkgICAgIENhbWVsbGlhU3Via2V5TCgzMSksQ2FtZWxsaWFTdWJrZXlSKDMxKSwKKwkJICAgICBpb1syXSxpb1szXSxpbCxpcix0MCx0MSk7CisgICAgQ0FNRUxMSUFfUk9VTkRTTShpb1syXSxpb1szXSwKKwkJICAgICBDYW1lbGxpYVN1YmtleUwoMzApLENhbWVsbGlhU3Via2V5UigzMCksCisJCSAgICAgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworICAgIENBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCSAgICAgQ2FtZWxsaWFTdWJrZXlMKDI5KSxDYW1lbGxpYVN1YmtleVIoMjkpLAorCQkgICAgIGlvWzJdLGlvWzNdLGlsLGlyLHQwLHQxKTsKKyAgICBDQU1FTExJQV9ST1VORFNNKGlvWzJdLGlvWzNdLAorCQkgICAgIENhbWVsbGlhU3Via2V5TCgyOCksQ2FtZWxsaWFTdWJrZXlSKDI4KSwKKwkJICAgICBpb1swXSxpb1sxXSxpbCxpcix0MCx0MSk7CisgICAgQ0FNRUxMSUFfUk9VTkRTTShpb1swXSxpb1sxXSwKKwkJICAgICBDYW1lbGxpYVN1YmtleUwoMjcpLENhbWVsbGlhU3Via2V5UigyNyksCisJCSAgICAgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworICAgIENBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCSAgICAgQ2FtZWxsaWFTdWJrZXlMKDI2KSxDYW1lbGxpYVN1YmtleVIoMjYpLAorCQkgICAgIGlvWzBdLGlvWzFdLGlsLGlyLHQwLHQxKTsKKworICAgIENBTUVMTElBX0ZMUyhpb1swXSxpb1sxXSxpb1syXSxpb1szXSwKKwkJIENhbWVsbGlhU3Via2V5TCgyNSksQ2FtZWxsaWFTdWJrZXlSKDI1KSwKKwkJIENhbWVsbGlhU3Via2V5TCgyNCksQ2FtZWxsaWFTdWJrZXlSKDI0KSwKKwkJIHQwLHQxLGlsLGlyKTsKKworICAgIENBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCSAgICAgQ2FtZWxsaWFTdWJrZXlMKDIzKSxDYW1lbGxpYVN1YmtleVIoMjMpLAorCQkgICAgIGlvWzJdLGlvWzNdLGlsLGlyLHQwLHQxKTsKKyAgICBDQU1FTExJQV9ST1VORFNNKGlvWzJdLGlvWzNdLAorCQkgICAgIENhbWVsbGlhU3Via2V5TCgyMiksQ2FtZWxsaWFTdWJrZXlSKDIyKSwKKwkJICAgICBpb1swXSxpb1sxXSxpbCxpcix0MCx0MSk7CisgICAgQ0FNRUxMSUFfUk9VTkRTTShpb1swXSxpb1sxXSwKKwkJICAgICBDYW1lbGxpYVN1YmtleUwoMjEpLENhbWVsbGlhU3Via2V5UigyMSksCisJCSAgICAgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworICAgIENBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCSAgICAgQ2FtZWxsaWFTdWJrZXlMKDIwKSxDYW1lbGxpYVN1YmtleVIoMjApLAorCQkgICAgIGlvWzBdLGlvWzFdLGlsLGlyLHQwLHQxKTsKKyAgICBDQU1FTExJQV9ST1VORFNNKGlvWzBdLGlvWzFdLAorCQkgICAgIENhbWVsbGlhU3Via2V5TCgxOSksQ2FtZWxsaWFTdWJrZXlSKDE5KSwKKwkJICAgICBpb1syXSxpb1szXSxpbCxpcix0MCx0MSk7CisgICAgQ0FNRUxMSUFfUk9VTkRTTShpb1syXSxpb1szXSwKKwkJICAgICBDYW1lbGxpYVN1YmtleUwoMTgpLENhbWVsbGlhU3Via2V5UigxOCksCisJCSAgICAgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworCisgICAgQ0FNRUxMSUFfRkxTKGlvWzBdLGlvWzFdLGlvWzJdLGlvWzNdLAorCQkgQ2FtZWxsaWFTdWJrZXlMKDE3KSxDYW1lbGxpYVN1YmtleVIoMTcpLAorCQkgQ2FtZWxsaWFTdWJrZXlMKDE2KSxDYW1lbGxpYVN1YmtleVIoMTYpLAorCQkgdDAsdDEsaWwsaXIpOworCisgICAgQ0FNRUxMSUFfUk9VTkRTTShpb1swXSxpb1sxXSwKKwkJICAgICBDYW1lbGxpYVN1YmtleUwoMTUpLENhbWVsbGlhU3Via2V5UigxNSksCisJCSAgICAgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworICAgIENBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCSAgICAgQ2FtZWxsaWFTdWJrZXlMKDE0KSxDYW1lbGxpYVN1YmtleVIoMTQpLAorCQkgICAgIGlvWzBdLGlvWzFdLGlsLGlyLHQwLHQxKTsKKyAgICBDQU1FTExJQV9ST1VORFNNKGlvWzBdLGlvWzFdLAorCQkgICAgIENhbWVsbGlhU3Via2V5TCgxMyksQ2FtZWxsaWFTdWJrZXlSKDEzKSwKKwkJICAgICBpb1syXSxpb1szXSxpbCxpcix0MCx0MSk7CisgICAgQ0FNRUxMSUFfUk9VTkRTTShpb1syXSxpb1szXSwKKwkJICAgICBDYW1lbGxpYVN1YmtleUwoMTIpLENhbWVsbGlhU3Via2V5UigxMiksCisJCSAgICAgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworICAgIENBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCSAgICAgQ2FtZWxsaWFTdWJrZXlMKDExKSxDYW1lbGxpYVN1YmtleVIoMTEpLAorCQkgICAgIGlvWzJdLGlvWzNdLGlsLGlyLHQwLHQxKTsKKyAgICBDQU1FTExJQV9ST1VORFNNKGlvWzJdLGlvWzNdLAorCQkgICAgIENhbWVsbGlhU3Via2V5TCgxMCksQ2FtZWxsaWFTdWJrZXlSKDEwKSwKKwkJICAgICBpb1swXSxpb1sxXSxpbCxpcix0MCx0MSk7CisKKyAgICBDQU1FTExJQV9GTFMoaW9bMF0saW9bMV0saW9bMl0saW9bM10sCisJCSBDYW1lbGxpYVN1YmtleUwoOSksQ2FtZWxsaWFTdWJrZXlSKDkpLAorCQkgQ2FtZWxsaWFTdWJrZXlMKDgpLENhbWVsbGlhU3Via2V5Uig4KSwKKwkJIHQwLHQxLGlsLGlyKTsKKworICAgIENBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCSAgICAgQ2FtZWxsaWFTdWJrZXlMKDcpLENhbWVsbGlhU3Via2V5Uig3KSwKKwkJICAgICBpb1syXSxpb1szXSxpbCxpcix0MCx0MSk7CisgICAgQ0FNRUxMSUFfUk9VTkRTTShpb1syXSxpb1szXSwKKwkJICAgICBDYW1lbGxpYVN1YmtleUwoNiksQ2FtZWxsaWFTdWJrZXlSKDYpLAorCQkgICAgIGlvWzBdLGlvWzFdLGlsLGlyLHQwLHQxKTsKKyAgICBDQU1FTExJQV9ST1VORFNNKGlvWzBdLGlvWzFdLAorCQkgICAgIENhbWVsbGlhU3Via2V5TCg1KSxDYW1lbGxpYVN1YmtleVIoNSksCisJCSAgICAgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworICAgIENBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCSAgICAgQ2FtZWxsaWFTdWJrZXlMKDQpLENhbWVsbGlhU3Via2V5Uig0KSwKKwkJICAgICBpb1swXSxpb1sxXSxpbCxpcix0MCx0MSk7CisgICAgQ0FNRUxMSUFfUk9VTkRTTShpb1swXSxpb1sxXSwKKwkJICAgICBDYW1lbGxpYVN1YmtleUwoMyksQ2FtZWxsaWFTdWJrZXlSKDMpLAorCQkgICAgIGlvWzJdLGlvWzNdLGlsLGlyLHQwLHQxKTsKKyAgICBDQU1FTExJQV9ST1VORFNNKGlvWzJdLGlvWzNdLAorCQkgICAgIENhbWVsbGlhU3Via2V5TCgyKSxDYW1lbGxpYVN1YmtleVIoMiksCisJCSAgICAgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworCisgICAgLyogcG9zdCB3aGl0ZW5pbmcgYnV0IGt3NCAqLworICAgIGlvWzJdIF49IENhbWVsbGlhU3Via2V5TCgwKTsKKyAgICBpb1szXSBePSBDYW1lbGxpYVN1YmtleVIoMCk7CisKKyAgICB0MCA9IGlvWzBdOworICAgIHQxID0gaW9bMV07CisgICAgaW9bMF0gPSBpb1syXTsKKyAgICBpb1sxXSA9IGlvWzNdOworICAgIGlvWzJdID0gdDA7CisgICAgaW9bM10gPSB0MTsKKworICAgIHJldHVybjsKK30KKworLyoqKgorICoKKyAqIEFQSSBmb3IgY29tcGF0aWJpbGl0eQorICovCisKK3ZvaWQgQ2FtZWxsaWFfRWtleWdlbihjb25zdCBpbnQga2V5Qml0TGVuZ3RoLCAKKwkJICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmF3S2V5LCAKKwkJICAgICAgS0VZX1RBQkxFX1RZUEUga2V5VGFibGUpCit7CisgICAgc3dpdGNoKGtleUJpdExlbmd0aCkgeworICAgIGNhc2UgMTI4OgorCWNhbWVsbGlhX3NldHVwMTI4KHJhd0tleSwga2V5VGFibGUpOworCWJyZWFrOworICAgIGNhc2UgMTkyOgorCWNhbWVsbGlhX3NldHVwMTkyKHJhd0tleSwga2V5VGFibGUpOworCWJyZWFrOworICAgIGNhc2UgMjU2OgorCWNhbWVsbGlhX3NldHVwMjU2KHJhd0tleSwga2V5VGFibGUpOworCWJyZWFrOworICAgIGRlZmF1bHQ6CisJYnJlYWs7CisgICAgfQorfQorCisKK3ZvaWQgQ2FtZWxsaWFfRW5jcnlwdEJsb2NrKGNvbnN0IGludCBrZXlCaXRMZW5ndGgsIAorCQkJICAgY29uc3QgdW5zaWduZWQgY2hhciAqcGxhaW50ZXh0LCAKKwkJCSAgIGNvbnN0IEtFWV9UQUJMRV9UWVBFIGtleVRhYmxlLCAKKwkJCSAgIHVuc2lnbmVkIGNoYXIgKmNpcGhlcnRleHQpCit7CisgICAgdTMyIHRtcFs0XTsKKworICAgIHRtcFswXSA9IEdFVFUzMihwbGFpbnRleHQpOworICAgIHRtcFsxXSA9IEdFVFUzMihwbGFpbnRleHQgKyA0KTsKKyAgICB0bXBbMl0gPSBHRVRVMzIocGxhaW50ZXh0ICsgOCk7CisgICAgdG1wWzNdID0gR0VUVTMyKHBsYWludGV4dCArIDEyKTsKKworICAgIHN3aXRjaCAoa2V5Qml0TGVuZ3RoKSB7CisgICAgY2FzZSAxMjg6CisJY2FtZWxsaWFfZW5jcnlwdDEyOChrZXlUYWJsZSwgdG1wKTsKKwlicmVhazsKKyAgICBjYXNlIDE5MjoKKwkvKiBmYWxsIHRocm91Z2ggKi8KKyAgICBjYXNlIDI1NjoKKwljYW1lbGxpYV9lbmNyeXB0MjU2KGtleVRhYmxlLCB0bXApOworCWJyZWFrOworICAgIGRlZmF1bHQ6CisJYnJlYWs7CisgICAgfQorCisgICAgUFVUVTMyKGNpcGhlcnRleHQsIHRtcFswXSk7CisgICAgUFVUVTMyKGNpcGhlcnRleHQgKyA0LCB0bXBbMV0pOworICAgIFBVVFUzMihjaXBoZXJ0ZXh0ICsgOCwgdG1wWzJdKTsKKyAgICBQVVRVMzIoY2lwaGVydGV4dCArIDEyLCB0bXBbM10pOworfQorCit2b2lkIENhbWVsbGlhX0RlY3J5cHRCbG9jayhjb25zdCBpbnQga2V5Qml0TGVuZ3RoLCAKKwkJCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNpcGhlcnRleHQsIAorCQkJICAgY29uc3QgS0VZX1RBQkxFX1RZUEUga2V5VGFibGUsIAorCQkJICAgdW5zaWduZWQgY2hhciAqcGxhaW50ZXh0KQoreworICAgIHUzMiB0bXBbNF07CisKKyAgICB0bXBbMF0gPSBHRVRVMzIoY2lwaGVydGV4dCk7CisgICAgdG1wWzFdID0gR0VUVTMyKGNpcGhlcnRleHQgKyA0KTsKKyAgICB0bXBbMl0gPSBHRVRVMzIoY2lwaGVydGV4dCArIDgpOworICAgIHRtcFszXSA9IEdFVFUzMihjaXBoZXJ0ZXh0ICsgMTIpOworCisgICAgc3dpdGNoIChrZXlCaXRMZW5ndGgpIHsKKyAgICBjYXNlIDEyODoKKwljYW1lbGxpYV9kZWNyeXB0MTI4KGtleVRhYmxlLCB0bXApOworCWJyZWFrOworICAgIGNhc2UgMTkyOgorCS8qIGZhbGwgdGhyb3VnaCAqLworICAgIGNhc2UgMjU2OgorCWNhbWVsbGlhX2RlY3J5cHQyNTYoa2V5VGFibGUsIHRtcCk7CisJYnJlYWs7CisgICAgZGVmYXVsdDoKKwlicmVhazsKKyAgICB9CisgICAgUFVUVTMyKHBsYWludGV4dCwgdG1wWzBdKTsKKyAgICBQVVRVMzIocGxhaW50ZXh0ICsgNCwgdG1wWzFdKTsKKyAgICBQVVRVMzIocGxhaW50ZXh0ICsgOCwgdG1wWzJdKTsKKyAgICBQVVRVMzIocGxhaW50ZXh0ICsgMTIsIHRtcFszXSk7Cit9CmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvY2lwaGVyL2NhbWVsbGlhLmggYi9saWJnY3J5cHQtMS40LjYvY2lwaGVyL2NhbWVsbGlhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQyNWEzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9jaXBoZXIvY2FtZWxsaWEuaApAQCAtMCwwICsxLDgxIEBACisvKiBjYW1lbGxpYS5oCXZlciAxLjIuMAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiwyMDA3CisgKiBOVFQgKE5pcHBvbiBUZWxlZ3JhcGggYW5kIFRlbGVwaG9uZSBDb3Jwb3JhdGlvbikuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaWZuZGVmIEhFQURFUl9DQU1FTExJQV9ICisjZGVmaW5lIEhFQURFUl9DQU1FTExJQV9ICisKKy8qIFRvIHVzZSBDYW1lbGxpYSB3aXRoIGxpYnJhcmllcyBpdCBpcyBvZnRlbiB1c2VmdWwgdG8ga2VlcCB0aGUgbmFtZQorICogc3BhY2Ugb2YgdGhlIGxpYnJhcnkgY2xlYW4uICBUaGUgZm9sbG93aW5nIG1hY3JvIGlzIHRodXMgdXNlZnVsOgorICoKKyAqICAgICAjZGVmaW5lIENBTUVMTElBX0VYVF9TWU1fUFJFRklYIGZvb18KKyAqICAKKyAqIFRoaXMgcHJlZml4ZXMgYWxsIGV4dGVybmFsIHN5bWJvbHMgd2l0aCAiZm9vXyIuCisgKi8KKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKyNpZmRlZiBDQU1FTExJQV9FWFRfU1lNX1BSRUZJWAorI2RlZmluZSBDQU1FTExJQV9QUkVGSVgxKHgseSkgeCAjIyB5CisjZGVmaW5lIENBTUVMTElBX1BSRUZJWDIoeCx5KSBDQU1FTExJQV9QUkVGSVgxKHgseSkKKyNkZWZpbmUgQ0FNRUxMSUFfUFJFRklYKHgpICAgIENBTUVMTElBX1BSRUZJWDIoQ0FNRUxMSUFfRVhUX1NZTV9QUkVGSVgseCkKKyNkZWZpbmUgQ2FtZWxsaWFfRWtleWdlbiAgICAgIENBTUVMTElBX1BSRUZJWChDYW1lbGxpYV9Fa2V5Z2VuKQorI2RlZmluZSBDYW1lbGxpYV9FbmNyeXB0QmxvY2sgQ0FNRUxMSUFfUFJFRklYKENhbWVsbGlhX0VuY3J5cHRCbG9jaykKKyNkZWZpbmUgQ2FtZWxsaWFfRGVjcnlwdEJsb2NrIENBTUVMTElBX1BSRUZJWChDYW1lbGxpYV9EZWNyeXB0QmxvY2spCisjZGVmaW5lIGNhbWVsbGlhX2RlY3J5cHQxMjggICBDQU1FTExJQV9QUkVGSVgoY2FtZWxsaWFfZGVjcnlwdDEyOCkKKyNkZWZpbmUgY2FtZWxsaWFfZGVjcnlwdDI1NiAgIENBTUVMTElBX1BSRUZJWChjYW1lbGxpYV9kZWNyeXB0MjU2KQorI2RlZmluZSBjYW1lbGxpYV9lbmNyeXB0MTI4ICAgQ0FNRUxMSUFfUFJFRklYKGNhbWVsbGlhX2VuY3J5cHQxMjgpCisjZGVmaW5lIGNhbWVsbGlhX2VuY3J5cHQyNTYgICBDQU1FTExJQV9QUkVGSVgoY2FtZWxsaWFfZW5jcnlwdDI1NikKKyNkZWZpbmUgY2FtZWxsaWFfc2V0dXAxMjggICAgIENBTUVMTElBX1BSRUZJWChjYW1lbGxpYV9zZXR1cDEyOCkKKyNkZWZpbmUgY2FtZWxsaWFfc2V0dXAxOTIgICAgIENBTUVMTElBX1BSRUZJWChjYW1lbGxpYV9zZXR1cDE5MikgCisjZGVmaW5lIGNhbWVsbGlhX3NldHVwMjU2ICAgICBDQU1FTExJQV9QUkVGSVgoY2FtZWxsaWFfc2V0dXAyNTYpCisjZW5kaWYgLypDQU1FTExJQV9FWFRfU1lNX1BSRUZJWCovCisKKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBDQU1FTExJQV9CTE9DS19TSVpFIDE2CisjZGVmaW5lIENBTUVMTElBX1RBQkxFX0JZVEVfTEVOIDI3MgorI2RlZmluZSBDQU1FTExJQV9UQUJMRV9XT1JEX0xFTiAoQ0FNRUxMSUFfVEFCTEVfQllURV9MRU4gLyA0KQorCit0eXBlZGVmIHVuc2lnbmVkIGludCBLRVlfVEFCTEVfVFlQRVtDQU1FTExJQV9UQUJMRV9XT1JEX0xFTl07CisKKwordm9pZCBDYW1lbGxpYV9Fa2V5Z2VuKGNvbnN0IGludCBrZXlCaXRMZW5ndGgsCisJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJhd0tleSwgCisJCSAgICAgIEtFWV9UQUJMRV9UWVBFIGtleVRhYmxlKTsKKwordm9pZCBDYW1lbGxpYV9FbmNyeXB0QmxvY2soY29uc3QgaW50IGtleUJpdExlbmd0aCwKKwkJCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBsYWludGV4dCwgCisJCQkgICBjb25zdCBLRVlfVEFCTEVfVFlQRSBrZXlUYWJsZSwgCisJCQkgICB1bnNpZ25lZCBjaGFyICpjaXBoZXJUZXh0KTsKKwordm9pZCBDYW1lbGxpYV9EZWNyeXB0QmxvY2soY29uc3QgaW50IGtleUJpdExlbmd0aCwgCisJCQkgICBjb25zdCB1bnNpZ25lZCBjaGFyICpjaXBoZXJUZXh0LCAKKwkJCSAgIGNvbnN0IEtFWV9UQUJMRV9UWVBFIGtleVRhYmxlLCAKKwkJCSAgIHVuc2lnbmVkIGNoYXIgKnBsYWludGV4dCk7CisKKworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBIRUFERVJfQ0FNRUxMSUFfSCAqLwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L2NpcGhlci9jYXN0NS5jIGIvbGliZ2NyeXB0LTEuNC42L2NpcGhlci9jYXN0NS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzM2Q1NWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvY2lwaGVyL2Nhc3Q1LmMKQEAgLTAsMCArMSw2MjAgQEAKKy8qIGNhc3Q1LmMgIC0gIENBU1Q1IGNpcGhlciAoUkZDMjE0NCkKKyAqCUNvcHlyaWdodCAoQykgMTk5OCwgMjAwMSwgMjAwMiwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBnZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKi8KKworLyogVGVzdCB2ZWN0b3JzOgorICoKKyAqIDEyOC1iaXQga2V5CSAgICAgICA9IDAxIDIzIDQ1IDY3IDEyIDM0IDU2IDc4IDIzIDQ1IDY3IDg5IDM0IDU2IDc4IDlBCisgKgkgICBwbGFpbnRleHQgICA9IDAxIDIzIDQ1IDY3IDg5IEFCIENEIEVGCisgKgkgICBjaXBoZXJ0ZXh0ICA9IDIzIDhCIDRGIEU1IDg0IDdFIDQ0IEIyCisgKgorICogODAtYml0ICBrZXkJICAgICAgID0gMDEgMjMgNDUgNjcgMTIgMzQgNTYgNzggMjMgNDUKKyAqCQkgICAgICAgPSAwMSAyMyA0NSA2NyAxMiAzNCA1NiA3OCAyMyA0NSAwMCAwMCAwMCAwMCAwMCAwMAorICoJICAgcGxhaW50ZXh0ICAgPSAwMSAyMyA0NSA2NyA4OSBBQiBDRCBFRgorICoJICAgY2lwaGVydGV4dCAgPSBFQiA2QSA3MSAxQSAyQyAwMiAyNyAxQgorICoKKyAqIDQwLWJpdCAga2V5CSAgICAgICA9IDAxIDIzIDQ1IDY3IDEyCisgKgkJICAgICAgID0gMDEgMjMgNDUgNjcgMTIgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAKKyAqCSAgIHBsYWludGV4dCAgID0gMDEgMjMgNDUgNjcgODkgQUIgQ0QgRUYKKyAqCSAgIGNpcGhlcnRleHQgID0gN0EgQzggMTYgRDEgNkUgOUIgMzAgMkUKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJnMTBsaWIuaCIKKyNpbmNsdWRlICJ0eXBlcy5oIgorI2luY2x1ZGUgImNpcGhlci5oIgorCisjZGVmaW5lIENBU1Q1X0JMT0NLU0laRSA4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1MzIgIEttWzE2XTsKKyAgICBieXRlIEtyWzE2XTsKK30gQ0FTVDVfY29udGV4dDsKKworc3RhdGljIGdjcnlfZXJyX2NvZGVfdCBjYXN0X3NldGtleSAodm9pZCAqYywgY29uc3QgYnl0ZSAqa2V5LCB1bnNpZ25lZCBrZXlsZW4pOworc3RhdGljIHZvaWQgZW5jcnlwdF9ibG9jayAodm9pZCAqYywgYnl0ZSAqb3V0YnVmLCBjb25zdCBieXRlICppbmJ1Zik7CitzdGF0aWMgdm9pZCBkZWNyeXB0X2Jsb2NrICh2b2lkICpjLCBieXRlICpvdXRidWYsIGNvbnN0IGJ5dGUgKmluYnVmKTsKKworCisKKworc3RhdGljIGNvbnN0IHUzMiBzMVsyNTZdID0geworMHgzMGZiNDBkNCwgMHg5ZmEwZmYwYiwgMHg2YmVjY2QyZiwgMHgzZjI1OGM3YSwgMHgxZTIxM2YyZiwgMHg5YzAwNGRkMywgMHg2MDAzZTU0MCwgMHhjZjlmYzk0OSwKKzB4YmZkNGFmMjcsIDB4ODhiYmJkYjUsIDB4ZTIwMzQwOTAsIDB4OThkMDk2NzUsIDB4NmU2M2EwZTAsIDB4MTVjMzYxZDIsIDB4YzJlNzY2MWQsIDB4MjJkNGZmOGUsCisweDI4NjgzYjZmLCAweGMwN2ZkMDU5LCAweGZmMjM3OWM4LCAweDc3NWY1MGUyLCAweDQzYzM0MGQzLCAweGRmMmY4NjU2LCAweDg4N2NhNDFhLCAweGEyZDJiZDJkLAorMHhhMWM5ZTBkNiwgMHgzNDZjNDgxOSwgMHg2MWI3NmQ4NywgMHgyMjU0MGYyZiwgMHgyYWJlMzJlMSwgMHhhYTU0MTY2YiwgMHgyMjU2OGUzYSwgMHhhMmQzNDFkMCwKKzB4NjZkYjQwYzgsIDB4YTc4NDM5MmYsIDB4MDA0ZGZmMmYsIDB4MmRiOWQyZGUsIDB4OTc5NDNmYWMsIDB4NGE5N2MxZDgsIDB4NTI3NjQ0YjcsIDB4YjVmNDM3YTcsCisweGI4MmNiYWVmLCAweGQ3NTFkMTU5LCAweDZmZjdmMGVkLCAweDVhMDk3YTFmLCAweDgyN2I2OGQwLCAweDkwZWNmNTJlLCAweDIyYjBjMDU0LCAweGJjOGU1OTM1LAorMHg0YjZkMmY3ZiwgMHg1MGJiNjRhMiwgMHhkMjY2NDkxMCwgMHhiZWU1ODEyZCwgMHhiNzMzMjI5MCwgMHhlOTNiMTU5ZiwgMHhiNDhlZTQxMSwgMHg0YmZmMzQ1ZCwKKzB4ZmQ0NWMyNDAsIDB4YWQzMTk3M2YsIDB4YzRmNmQwMmUsIDB4NTVmYzgxNjUsIDB4ZDViMWNhYWQsIDB4YTFhYzJkYWUsIDB4YTJkNGI3NmQsIDB4YzE5YjBjNTAsCisweDg4MjI0MGYyLCAweDBjNmU0ZjM4LCAweGE0ZTRiZmQ3LCAweDRmNWJhMjcyLCAweDU2NGMxZDJmLCAweGM1OWM1MzE5LCAweGI5NDllMzU0LCAweGIwNDY2OWZlLAorMHhiMWI2YWI4YSwgMHhjNzEzNThkZCwgMHg2Mzg1YzU0NSwgMHgxMTBmOTM1ZCwgMHg1NzUzOGFkNSwgMHg2YTM5MDQ5MywgMHhlNjNkMzdlMCwgMHgyYTU0ZjZiMywKKzB4M2E3ODdkNWYsIDB4NjI3NmEwYjUsIDB4MTlhNmZjZGYsIDB4N2E0MjIwNmEsIDB4MjlmOWQ0ZDUsIDB4ZjYxYjE4OTEsIDB4YmI3MjI3NWUsIDB4YWE1MDgxNjcsCisweDM4OTAxMDkxLCAweGM2YjUwNWViLCAweDg0YzdjYjhjLCAweDJhZDc1YTBmLCAweDg3NGExNDI3LCAweGEyZDE5MzZiLCAweDJhZDI4NmFmLCAweGFhNTZkMjkxLAorMHhkNzg5NDM2MCwgMHg0MjVjNzUwZCwgMHg5M2IzOWUyNiwgMHgxODcxODRjOSwgMHg2YzAwYjMyZCwgMHg3M2UyYmIxNCwgMHhhMGJlYmMzYywgMHg1NDYyMzc3OSwKKzB4NjQ0NTllYWIsIDB4M2YzMjhiODIsIDB4NzcxOGNmODIsIDB4NTlhMmNlYTYsIDB4MDRlZTAwMmUsIDB4ODlmZTc4ZTYsIDB4M2ZhYjA5NTAsIDB4MzI1ZmY2YzIsCisweDgxMzgzZjA1LCAweDY5NjNjNWM4LCAweDc2Y2I1YWQ2LCAweGQ0OTk3NGM5LCAweGNhMTgwZGNmLCAweDM4MDc4MmQ1LCAweGM3ZmE1Y2Y2LCAweDhhYzMxNTExLAorMHgzNWU3OWUxMywgMHg0N2RhOTFkMCwgMHhmNDBmOTA4NiwgMHhhN2UyNDE5ZSwgMHgzMTM2NjI0MSwgMHgwNTFlZjQ5NSwgMHhhYTU3M2IwNCwgMHg0YTgwNWQ4ZCwKKzB4NTQ4MzAwZDAsIDB4MDAzMjJhM2MsIDB4YmY2NGNkZGYsIDB4YmE1N2E2OGUsIDB4NzVjNjM3MmIsIDB4NTBhZmQzNDEsIDB4YTdjMTMyNzUsIDB4OTE1YTBiZjUsCisweDZiNTRiZmFiLCAweDJiMGIxNDI2LCAweGFiNGNjOWQ3LCAweDQ0OWNjZDgyLCAweGY3ZmJmMjY1LCAweGFiODVjNWYzLCAweDFiNTVkYjk0LCAweGFhZDRlMzI0LAorMHhjZmE0YmQzZiwgMHgyZGVhYTNlMiwgMHg5ZTIwNGQwMiwgMHhjOGJkMjVhYywgMHhlYWRmNTViMywgMHhkNWJkOWU5OCwgMHhlMzEyMzFiMiwgMHgyYWQ1YWQ2YywKKzB4OTU0MzI5ZGUsIDB4YWRiZTQ1MjgsIDB4ZDg3MTBmNjksIDB4YWE1MWM5MGYsIDB4YWE3ODZiZjYsIDB4MjI1MTNmMWUsIDB4YWE1MWE3OWIsIDB4MmFkMzQ0Y2MsCisweDdiNWE0MWYwLCAweGQzN2NmYmFkLCAweDFiMDY5NTA1LCAweDQxZWNlNDkxLCAweGI0YzMzMmU2LCAweDAzMjI2OGQ0LCAweGM5NjAwYWNjLCAweGNlMzg3ZTZkLAorMHhiZjZiYjE2YywgMHg2YTcwZmI3OCwgMHgwZDAzZDljOSwgMHhkNGRmMzlkZSwgMHhlMDEwNjNkYSwgMHg0NzM2ZjQ2NCwgMHg1YWQzMjhkOCwgMHhiMzQ3Y2M5NiwKKzB4NzViYjBmYzMsIDB4OTg1MTFiZmIsIDB4NGZmYmNjMzUsIDB4YjU4YmNmNmEsIDB4ZTExZjBhYmMsIDB4YmZjNWZlNGEsIDB4YTcwYWVjMTAsIDB4YWMzOTU3MGEsCisweDNmMDQ0NDJmLCAweDYxODhiMTUzLCAweGUwMzk3YTJlLCAweDU3MjdjYjc5LCAweDljZWI0MThmLCAweDFjYWNkNjhkLCAweDJhZDM3Yzk2LCAweDAxNzVjYjlkLAorMHhjNjlkZmYwOSwgMHhjNzViNjVmMCwgMHhkOWRiNDBkOCwgMHhlYzBlNzc3OSwgMHg0NzQ0ZWFkNCwgMHhiMTFjMzI3NCwgMHhkZDI0Y2I5ZSwgMHg3ZTFjNTRiZCwKKzB4ZjAxMTQ0ZjksIDB4ZDIyNDBlYjEsIDB4OTY3NWIzZmQsIDB4YTNhYzM3NTUsIDB4ZDQ3YzI3YWYsIDB4NTFjODVmNGQsIDB4NTY5MDc1OTYsIDB4YTViYjE1ZTYsCisweDU4MDMwNGYwLCAweGNhMDQyY2YxLCAweDAxMWEzN2VhLCAweDhkYmZhYWRiLCAweDM1YmEzZTRhLCAweDM1MjZmZmEwLCAweGMzN2I0ZDA5LCAweGJjMzA2ZWQ5LAorMHg5OGE1MjY2NiwgMHg1NjQ4ZjcyNSwgMHhmZjVlNTY5ZCwgMHgwY2VkNjNkMCwgMHg3YzYzYjJjZiwgMHg3MDBiNDVlMSwgMHhkNWVhNTBmMSwgMHg4NWE5Mjg3MiwKKzB4YWYxZmJkYTcsIDB4ZDQyMzQ4NzAsIDB4YTc4NzBiZjMsIDB4MmQzYjRkNzksIDB4NDJlMDQxOTgsIDB4MGNkMGVkZTcsIDB4MjY0NzBkYjgsIDB4Zjg4MTgxNGMsCisweDQ3NGQ2YWQ3LCAweDdjMGM1ZTVjLCAweGQxMjMxOTU5LCAweDM4MWI3Mjk4LCAweGY1ZDJmNGRiLCAweGFiODM4NjUzLCAweDZlMmYxZTIzLCAweDgzNzE5YzllLAorMHhiZDkxZTA0NiwgMHg5YTU2NDU2ZSwgMHhkYzM5MjAwYywgMHgyMGM4YzU3MSwgMHg5NjJiZGExYywgMHhlMWU2OTZmZiwgMHhiMTQxYWIwOCwgMHg3Y2NhODliOSwKKzB4MWE2OWU3ODMsIDB4MDJjYzQ4NDMsIDB4YTJmN2M1NzksIDB4NDI5ZWY0N2QsIDB4NDI3YjE2OWMsIDB4NWFjOWYwNDksIDB4ZGQ4ZjBmMDAsIDB4NWM4MTY1YmYKK307CitzdGF0aWMgY29uc3QgdTMyIHMyWzI1Nl0gPSB7CisweDFmMjAxMDk0LCAweGVmMGJhNzViLCAweDY5ZTNjZjdlLCAweDM5M2Y0MzgwLCAweGZlNjFjZjdhLCAweGVlYzUyMDdhLCAweDU1ODg5Yzk0LCAweDcyZmMwNjUxLAorMHhhZGE3ZWY3OSwgMHg0ZTFkNzIzNSwgMHhkNTVhNjNjZSwgMHhkZTA0MzZiYSwgMHg5OWM0MzBlZiwgMHg1ZjBjMDc5NCwgMHgxOGRjZGI3ZCwgMHhhMWQ2ZWZmMywKKzB4YTBiNTJmN2IsIDB4NTllODM2MDUsIDB4ZWUxNWIwOTQsIDB4ZTlmZmQ5MDksIDB4ZGM0NDAwODYsIDB4ZWY5NDQ0NTksIDB4YmE4M2NjYjMsIDB4ZTBjM2NkZmIsCisweGQxZGE0MTgxLCAweDNiMDkyYWIxLCAweGY5OTdmMWMxLCAweGE1ZTZjZjdiLCAweDAxNDIwZGRiLCAweGU0ZTdlZjViLCAweDI1YTFmZjQxLCAweGUxODBmODA2LAorMHgxZmM0MTA4MCwgMHgxNzliZWU3YSwgMHhkMzdhYzZhOSwgMHhmZTU4MzBhNCwgMHg5OGRlOGI3ZiwgMHg3N2U4M2Y0ZSwgMHg3OTkyOTI2OSwgMHgyNGZhOWY3YiwKKzB4ZTExM2M4NWIsIDB4YWNjNDAwODMsIDB4ZDc1MDM1MjUsIDB4ZjdlYTYxNWYsIDB4NjIxNDMxNTQsIDB4MGQ1NTRiNjMsIDB4NWQ2ODExMjEsIDB4Yzg2NmMzNTksCisweDNkNjNjZjczLCAweGNlZTIzNGMwLCAweGQ0ZDg3ZTg3LCAweDVjNjcyYjIxLCAweDA3MWY2MTgxLCAweDM5Zjc2MjdmLCAweDM2MWUzMDg0LCAweGU0ZWI1NzNiLAorMHg2MDJmNjRhNCwgMHhkNjNhY2Q5YywgMHgxYmJjNDYzNSwgMHg5ZTgxMDMyZCwgMHgyNzAxZjUwYywgMHg5OTg0N2FiNCwgMHhhMGUzZGY3OSwgMHhiYTZjZjM4YywKKzB4MTA4NDMwOTQsIDB4MjUzN2E5NWUsIDB4ZjQ2ZjZmZmUsIDB4YTFmZjNiMWYsIDB4MjA4Y2ZiNmEsIDB4OGY0NThjNzQsIDB4ZDllMGEyMjcsIDB4NGVjNzNhMzQsCisweGZjODg0ZjY5LCAweDNlNGRlOGRmLCAweGVmMGUwMDg4LCAweDM1NTk2NDhkLCAweDhhNDUzODhjLCAweDFkODA0MzY2LCAweDcyMWQ5YmZkLCAweGE1ODY4NGJiLAorMHhlODI1NjMzMywgMHg4NDRlODIxMiwgMHgxMjhkODA5OCwgMHhmZWQzM2ZiNCwgMHhjZTI4MGFlMSwgMHgyN2UxOWJhNSwgMHhkNWE2YzI1MiwgMHhlNDk3NTRiZCwKKzB4YzVkNjU1ZGQsIDB4ZWI2NjcwNjQsIDB4Nzc4NDBiNGQsIDB4YTFiNmE4MDEsIDB4ODRkYjI2YTksIDB4ZTBiNTY3MTQsIDB4MjFmMDQzYjcsIDB4ZTVkMDU4NjAsCisweDU0ZjAzMDg0LCAweDA2NmZmNDcyLCAweGEzMWFhMTUzLCAweGRhZGM0NzU1LCAweGI1NjI1ZGJmLCAweDY4NTYxYmU2LCAweDgzY2E2Yjk0LCAweDJkNmVkMjNiLAorMHhlY2NmMDFkYiwgMHhhNmQzZDBiYSwgMHhiNjgwM2Q1YywgMHhhZjc3YTcwOSwgMHgzM2I0YTM0YywgMHgzOTdiYzhkNiwgMHg1ZWUyMmI5NSwgMHg1ZjBlNTMwNCwKKzB4ODFlZDZmNjEsIDB4MjBlNzQzNjQsIDB4YjQ1ZTEzNzgsIDB4ZGUxODYzOWIsIDB4ODgxY2ExMjIsIDB4Yjk2NzI2ZDEsIDB4ODA0OWE3ZTgsIDB4MjJiN2RhN2IsCisweDVlNTUyZDI1LCAweDUyNzJkMjM3LCAweDc5ZDI5NTFjLCAweGM2MGQ4OTRjLCAweDQ4OGNiNDAyLCAweDFiYTRmZTViLCAweGE0YjA5ZjZiLCAweDFjYTgxNWNmLAorMHhhMjBjMzAwNSwgMHg4ODcxZGY2MywgMHhiOWRlMmZjYiwgMHgwY2M2YzllOSwgMHgwYmVlZmY1MywgMHhlMzIxNDUxNywgMHhiNDU0MjgzNSwgMHg5ZjYzMjkzYywKKzB4ZWU0MWU3MjksIDB4NmUxZDJkN2MsIDB4NTAwNDUyODYsIDB4MWU2Njg1ZjMsIDB4ZjMzNDAxYzYsIDB4MzBhMjJjOTUsIDB4MzFhNzA4NTAsIDB4NjA5MzBmMTMsCisweDczZjk4NDE3LCAweGExMjY5ODU5LCAweGVjNjQ1YzQ0LCAweDUyYzg3N2E5LCAweGNkZmYzM2E2LCAweGEwMmIxNzQxLCAweDdjYmFkOWEyLCAweDIxODAwMzZmLAorMHg1MGQ5OWMwOCwgMHhjYjNmNDg2MSwgMHhjMjZiZDc2NSwgMHg2NGEzZjZhYiwgMHg4MDM0MjY3NiwgMHgyNWE3NWU3YiwgMHhlNGU2ZDFmYywgMHgyMGM3MTBlNiwKKzB4Y2RmMGI2ODAsIDB4MTc4NDRkM2IsIDB4MzFlZWY4NGQsIDB4N2UwODI0ZTQsIDB4MmNjYjQ5ZWIsIDB4ODQ2YTNiYWUsIDB4OGZmNzc4ODgsIDB4ZWU1ZDYwZjYsCisweDdhZjc1NjczLCAweDJmZGQ1Y2RiLCAweGExMTYzMWMxLCAweDMwZjY2ZjQzLCAweGIzZmFlYzU0LCAweDE1N2ZkN2ZhLCAweGVmODU3OWNjLCAweGQxNTJkZTU4LAorMHhkYjJmZmQ1ZSwgMHg4ZjMyY2UxOSwgMHgzMDZhZjk3YSwgMHgwMmYwM2VmOCwgMHg5OTMxOWFkNSwgMHhjMjQyZmEwZiwgMHhhN2UzZWJiMCwgMHhjNjhlNDkwNiwKKzB4YjhkYTIzMGMsIDB4ODA4MjMwMjgsIDB4ZGNkZWYzYzgsIDB4ZDM1ZmIxNzEsIDB4MDg4YTFiYzgsIDB4YmVjMGM1NjAsIDB4NjFhM2M5ZTgsIDB4YmNhOGY1NGQsCisweGM3MmZlZmZhLCAweDIyODIyZTk5LCAweDgyYzU3MGI0LCAweGQ4ZDk0ZTg5LCAweDhiMWMzNGJjLCAweDMwMWUxNmU2LCAweDI3M2JlOTc5LCAweGIwZmZlYWE2LAorMHg2MWQ5YjhjNiwgMHgwMGIyNDg2OSwgMHhiN2ZmY2UzZiwgMHgwOGRjMjgzYiwgMHg0M2RhZjY1YSwgMHhmN2UxOTc5OCwgMHg3NjE5YjcyZiwgMHg4ZjFjOWJhNCwKKzB4ZGM4NjM3YTAsIDB4MTZhN2QzYjEsIDB4OWZjMzkzYjcsIDB4YTcxMzZlZWIsIDB4YzZiY2M2M2UsIDB4MWE1MTM3NDIsIDB4ZWY2ODI4YmMsIDB4NTIwMzY1ZDYsCisweDJkNmE3N2FiLCAweDM1MjdlZDRiLCAweDgyMWZkMjE2LCAweDA5NWM2ZTJlLCAweGRiOTJmMmZiLCAweDVlZWEyOWNiLCAweDE0NTg5MmY1LCAweDkxNTg0ZjdmLAorMHg1NDgzNjk3YiwgMHgyNjY3YThjYywgMHg4NTE5NjA0OCwgMHg4YzRiYWNlYSwgMHg4MzM4NjBkNCwgMHgwZDIzZTBmOSwgMHg2YzM4N2U4YSwgMHgwYWU2ZDI0OSwKKzB4YjI4NDYwMGMsIDB4ZDgzNTczMWQsIDB4ZGNiMWM2NDcsIDB4YWM0YzU2ZWEsIDB4M2ViZDgxYjMsIDB4MjMwZWFiYjAsIDB4NjQzOGJjODcsIDB4ZjBiNWIxZmEsCisweDhmNWVhMmIzLCAweGZjMTg0NjQyLCAweDBhMDM2YjdhLCAweDRmYjA4OWJkLCAweDY0OWRhNTg5LCAweGEzNDU0MTVlLCAweDVjMDM4MzIzLCAweDNlNWQzYmI5LAorMHg0M2Q3OTU3MiwgMHg3ZTZkZDA3YywgMHgwNmRmZGYxZSwgMHg2YzZjYzRlZiwgMHg3MTYwYTUzOSwgMHg3M2JmYmU3MCwgMHg4Mzg3NzYwNSwgMHg0NTIzZWNmMQorfTsKK3N0YXRpYyBjb25zdCB1MzIgczNbMjU2XSA9IHsKKzB4OGRlZmMyNDAsIDB4MjVmYTVkOWYsIDB4ZWI5MDNkYmYsIDB4ZTgxMGM5MDcsIDB4NDc2MDdmZmYsIDB4MzY5ZmU0NGIsIDB4OGMxZmM2NDQsIDB4YWVjZWNhOTAsCisweGJlYjFmOWJmLCAweGVlZmJjYWVhLCAweGU4Y2YxOTUwLCAweDUxZGYwN2FlLCAweDkyMGU4ODA2LCAweGYwYWQwNTQ4LCAweGUxM2M4ZDgzLCAweDkyNzAxMGQ1LAorMHgxMTEwN2Q5ZiwgMHgwNzY0N2RiOSwgMHhiMmUzZTRkNCwgMHgzZDRmMjg1ZSwgMHhiOWFmYTgyMCwgMHhmYWRlODJlMCwgMHhhMDY3MjY4YiwgMHg4MjcyNzkyZSwKKzB4NTUzZmIyYzAsIDB4NDg5YWUyMmIsIDB4ZDRlZjk3OTQsIDB4MTI1ZTNmYmMsIDB4MjFmZmZjZWUsIDB4ODI1YjFiZmQsIDB4OTI1NWM1ZWQsIDB4MTI1N2EyNDAsCisweDRlMWE4MzAyLCAweGJhZTA3ZmZmLCAweDUyODI0NmU3LCAweDhlNTcxNDBlLCAweDMzNzNmN2JmLCAweDhjOWY4MTg4LCAweGE2ZmM0ZWU4LCAweGM5ODJiNWE1LAorMHhhOGMwMWRiNywgMHg1NzlmYzI2NCwgMHg2NzA5NGYzMSwgMHhmMmJkM2Y1ZiwgMHg0MGZmZjdjMSwgMHgxZmI3OGRmYywgMHg4ZTZiZDJjMSwgMHg0MzdiZTU5YiwKKzB4OTliMDNkYmYsIDB4YjVkYmM2NGIsIDB4NjM4ZGMwZTYsIDB4NTU4MTlkOTksIDB4YTE5N2M4MWMsIDB4NGEwMTJkNmUsIDB4YzU4ODRhMjgsIDB4Y2NjMzZmNzEsCisweGI4NDNjMjEzLCAweDZjMDc0M2YxLCAweDgzMDk4OTNjLCAweDBmZWRkZDVmLCAweDJmN2ZlODUwLCAweGQ3YzA3ZjdlLCAweDAyNTA3ZmJmLCAweDVhZmI5YTA0LAorMHhhNzQ3ZDJkMCwgMHgxNjUxMTkyZSwgMHhhZjcwYmYzZSwgMHg1OGMzMTM4MCwgMHg1Zjk4MzAyZSwgMHg3MjdjYzNjNCwgMHgwYTBmYjQwMiwgMHgwZjdmZWY4MiwKKzB4OGM5NmZkYWQsIDB4NWQyYzJhYWUsIDB4OGVlOTlhNDksIDB4NTBkYTg4YjgsIDB4ODQyN2Y0YTAsIDB4MWVhYzU3OTAsIDB4Nzk2ZmI0NDksIDB4ODI1MmRjMTUsCisweGVmYmQ3ZDliLCAweGE2NzI1OTdkLCAweGFkYTg0MGQ4LCAweDQ1ZjU0NTA0LCAweGZhNWQ3NDAzLCAweGU4M2VjMzA1LCAweDRmOTE3NTFhLCAweDkyNTY2OWMyLAorMHgyM2VmZTk0MSwgMHhhOTAzZjEyZSwgMHg2MDI3MGRmMiwgMHgwMjc2ZTRiNiwgMHg5NGZkNjU3NCwgMHg5Mjc5ODViMiwgMHg4Mjc2ZGJjYiwgMHgwMjc3ODE3NiwKKzB4ZjhhZjkxOGQsIDB4NGU0OGY3OWUsIDB4OGY2MTZkZGYsIDB4ZTI5ZDg0MGUsIDB4ODQyZjdkODMsIDB4MzQwY2U1YzgsIDB4OTZiYmI2ODIsIDB4OTNiNGIxNDgsCisweGVmMzAzY2FiLCAweDk4NGZhZjI4LCAweDc3OWZhZjliLCAweDkyZGM1NjBkLCAweDIyNGQxZTIwLCAweDg0MzdhYTg4LCAweDdkMjlkYzk2LCAweDI3NTZkM2RjLAorMHg4YjkwN2NlZSwgMHhiNTFmZDI0MCwgMHhlN2MwN2NlMywgMHhlNTY2YjRhMSwgMHhjM2U5NjE1ZSwgMHgzY2Y4MjA5ZCwgMHg2MDk0ZDFlMywgMHhjZDljYTM0MSwKKzB4NWM3NjQ2MGUsIDB4MDBlYTk4M2IsIDB4ZDRkNjc4ODEsIDB4ZmQ0NzU3MmMsIDB4Zjc2Y2VkZDksIDB4YmRhODIyOWMsIDB4MTI3ZGFkYWEsIDB4NDM4YTA3NGUsCisweDFmOTdjMDkwLCAweDA4MWJkYjhhLCAweDkzYTA3ZWJlLCAweGI5MzhjYTE1LCAweDk3YjAzY2ZmLCAweDNkYzJjMGY4LCAweDhkMWFiMmVjLCAweDY0MzgwZTUxLAorMHg2OGNjN2JmYiwgMHhkOTBmMjc4OCwgMHgxMjQ5MDE4MSwgMHg1ZGU1ZmZkNCwgMHhkZDdlZjg2YSwgMHg3NmEyZTIxNCwgMHhiOWE0MDM2OCwgMHg5MjVkOTU4ZiwKKzB4NGIzOWZmZmEsIDB4YmEzOWFlZTksIDB4YTRmZmQzMGIsIDB4ZmFmNzkzM2IsIDB4NmQ0OTg2MjMsIDB4MTkzY2JjZmEsIDB4Mjc2Mjc1NDUsIDB4ODI1Y2Y0N2EsCisweDYxYmQ4YmEwLCAweGQxMWU0MmQxLCAweGNlYWQwNGY0LCAweDEyN2VhMzkyLCAweDEwNDI4ZGI3LCAweDgyNzJhOTcyLCAweDkyNzBjNGE4LCAweDEyN2RlNTBiLAorMHgyODViYTFjOCwgMHgzYzYyZjQ0ZiwgMHgzNWMwZWFhNSwgMHhlODA1ZDIzMSwgMHg0Mjg5MjlmYiwgMHhiNGZjZGY4MiwgMHg0ZmI2NmE1MywgMHgwZTdkYzE1YiwKKzB4MWYwODFmYWIsIDB4MTA4NjE4YWUsIDB4ZmNmZDA4NmQsIDB4ZjlmZjI4ODksIDB4Njk0YmNjMTEsIDB4MjM2YTVjYWUsIDB4MTJkZWNhNGQsIDB4MmMzZjhjYzUsCisweGQyZDAyZGZlLCAweGY4ZWY1ODk2LCAweGU0Y2Y1MmRhLCAweDk1MTU1YjY3LCAweDQ5NGE0ODhjLCAweGI5YjZhODBjLCAweDVjOGY4MmJjLCAweDg5ZDM2YjQ1LAorMHgzYTYwOTQzNywgMHhlYzAwYzlhOSwgMHg0NDcxNTI1MywgMHgwYTg3NGI0OSwgMHhkNzczYmM0MCwgMHg3YzM0NjcxYywgMHgwMjcxN2VmNiwgMHg0ZmViNTUzNiwKKzB4YTJkMDJmZmYsIDB4ZDJiZjYwYzQsIDB4ZDQzZjAzYzAsIDB4NTBiNGVmNmQsIDB4MDc0NzhjZDEsIDB4MDA2ZTE4ODgsIDB4YTJlNTNmNTUsIDB4YjllNmQ0YmMsCisweGEyMDQ4MDE2LCAweDk3NTczODMzLCAweGQ3MjA3ZDY3LCAweGRlMGY4ZjNkLCAweDcyZjg3YjMzLCAweGFiY2M0ZjMzLCAweDc2ODhjNTVkLCAweDdiMDBhNmIwLAorMHg5NDdiMDAwMSwgMHg1NzAwNzVkMiwgMHhmOWJiODhmOCwgMHg4OTQyMDE5ZSwgMHg0MjY0YTVmZiwgMHg4NTYzMDJlMCwgMHg3MmRiZDkyYiwgMHhlZTk3MWI2OSwKKzB4NmVhMjJmZGUsIDB4NWYwOGFlMmIsIDB4YWY3YTYxNmQsIDB4ZTVjOTg3NjcsIDB4Y2YxZmViZDIsIDB4NjFlZmM4YzIsIDB4ZjFhYzI1NzEsIDB4Y2M4MjM5YzIsCisweDY3MjE0Y2I4LCAweGIxZTU4M2QxLCAweGI3ZGMzZTYyLCAweDdmMTBiZGNlLCAweGY5MGE1YzM4LCAweDBmZjA0NDNkLCAweDYwNmU2ZGM2LCAweDYwNTQzYTQ5LAorMHg1NzI3YzE0OCwgMHgyYmU5OGExZCwgMHg4YWI0MTczOCwgMHgyMGUxYmUyNCwgMHhhZjk2ZGEwZiwgMHg2ODQ1ODQyNSwgMHg5OTgzM2JlNSwgMHg2MDBkNDU3ZCwKKzB4MjgyZjkzNTAsIDB4ODMzNGIzNjIsIDB4ZDkxZDExMjAsIDB4MmI2ZDhkYTAsIDB4NjQyYjFlMzEsIDB4OWMzMDVhMDAsIDB4NTJiY2U2ODgsIDB4MWIwMzU4OGEsCisweGY3YmFlZmQ1LCAweDQxNDJlZDljLCAweGE0MzE1YzExLCAweDgzMzIzZWM1LCAweGRmZWY0NjM2LCAweGExMzNjNTAxLCAweGU5ZDM1MzFjLCAweGVlMzUzNzgzCit9Oworc3RhdGljIGNvbnN0IHUzMiBzNFsyNTZdID0geworMHg5ZGIzMDQyMCwgMHgxZmI2ZTlkZSwgMHhhN2JlN2JlZiwgMHhkMjczYTI5OCwgMHg0YTRmN2JkYiwgMHg2NGFkOGM1NywgMHg4NTUxMDQ0MywgMHhmYTAyMGVkMSwKKzB4N2UyODdhZmYsIDB4ZTYwZmI2NjMsIDB4MDk1ZjM1YTEsIDB4NzllYmYxMjAsIDB4ZmQwNTlkNDMsIDB4NjQ5N2I3YjEsIDB4ZjM2NDFmNjMsIDB4MjQxZTRhZGYsCisweDI4MTQ3ZjVmLCAweDRmYTJiOGNkLCAweGM5NDMwMDQwLCAweDBjYzMyMjIwLCAweGZkZDMwYjMwLCAweGMwYTUzNzRmLCAweDFkMmQwMGQ5LCAweDI0MTQ3YjE1LAorMHhlZTRkMTExYSwgMHgwZmNhNTE2NywgMHg3MWZmOTA0YywgMHgyZDE5NWZmZSwgMHgxYTA1NjQ1ZiwgMHgwYzEzZmVmZSwgMHgwODFiMDhjYSwgMHgwNTE3MDEyMSwKKzB4ODA1MzAxMDAsIDB4ZTgzZTVlZmUsIDB4YWM5YWY0ZjgsIDB4N2ZlNzI3MDEsIDB4ZDJiOGVlNWYsIDB4MDZkZjQyNjEsIDB4YmI5ZTliOGEsIDB4NzI5M2VhMjUsCisweGNlODRmZmRmLCAweGY1NzE4ODAxLCAweDNkZDY0YjA0LCAweGEyNmYyNjNiLCAweDdlZDQ4NDAwLCAweDU0N2VlYmU2LCAweDQ0NmQ0Y2EwLCAweDZjZjNkNmY1LAorMHgyNjQ5YWJkZiwgMHhhZWEwYzdmNSwgMHgzNjMzOGNjMSwgMHg1MDNmN2U5MywgMHhkMzc3MjA2MSwgMHgxMWI2MzhlMSwgMHg3MjUwMGUwMywgMHhmODBlYjJiYiwKKzB4YWJlMDUwMmUsIDB4ZWM4ZDc3ZGUsIDB4NTc5NzFlODEsIDB4ZTE0ZjY3NDYsIDB4YzkzMzU0MDAsIDB4NjkyMDMxOGYsIDB4MDgxZGJiOTksIDB4ZmZjMzA0YTUsCisweDRkMzUxODA1LCAweDdmM2Q1Y2UzLCAweGE2Yzg2NmM2LCAweDVkNWJjY2E5LCAweGRhZWM2ZmVhLCAweDlmOTI2ZjkxLCAweDlmNDYyMjJmLCAweDM5OTE0NjdkLAorMHhhNWJmNmQ4ZSwgMHgxMTQzYzQ0ZiwgMHg0Mzk1ODMwMiwgMHhkMDIxNGVlYiwgMHgwMjIwODNiOCwgMHgzZmI2MTgwYywgMHgxOGY4OTMxZSwgMHgyODE2NThlNiwKKzB4MjY0ODZlM2UsIDB4OGJkNzhhNzAsIDB4NzQ3N2U0YzEsIDB4YjUwNmUwN2MsIDB4ZjMyZDBhMjUsIDB4NzkwOThiMDIsIDB4ZTRlYWJiODEsIDB4MjgxMjNiMjMsCisweDY5ZGVhZDM4LCAweDE1NzRjYTE2LCAweGRmODcxYjYyLCAweDIxMWM0MGI3LCAweGE1MWE5ZWY5LCAweDAwMTQzNzdiLCAweDA0MWU4YWM4LCAweDA5MTE0MDAzLAorMHhiZDU5ZTRkMiwgMHhlM2QxNTZkNSwgMHg0ZmU4NzZkNSwgMHgyZjkxYTM0MCwgMHg1NTdiZThkZSwgMHgwMGVhZTRhNywgMHgwY2U1YzJlYywgMHg0ZGI0YmJhNiwKKzB4ZTc1NmJkZmYsIDB4ZGQzMzY5YWMsIDB4ZWMxN2IwMzUsIDB4MDY1NzIzMjcsIDB4OTlhZmM4YjAsIDB4NTZjOGMzOTEsIDB4NmI2NTgxMWMsIDB4NWUxNDYxMTksCisweDZlODVjYjc1LCAweGJlMDdjMDAyLCAweGMyMzI1NTc3LCAweDg5M2ZmNGVjLCAweDViYmZjOTJkLCAweGQwZWMzYjI1LCAweGI3ODAxYWI3LCAweDhkNmQzYjI0LAorMHgyMGM3NjNlZiwgMHhjMzY2YTVmYywgMHg5YzM4Mjg4MCwgMHgwYWNlMzIwNSwgMHhhYWM5NTQ4YSwgMHhlY2ExZDdjNywgMHgwNDFhZmEzMiwgMHgxZDE2NjI1YSwKKzB4NjcwMTkwMmMsIDB4OWI3NTdhNTQsIDB4MzFkNDc3ZjcsIDB4OTEyNmIwMzEsIDB4MzZjYzZmZGIsIDB4YzcwYjhiNDYsIDB4ZDllNjZhNDgsIDB4NTZlNTVhNzksCisweDAyNmE0Y2ViLCAweDUyNDM3ZWZmLCAweDJmOGY3NmI0LCAweDBkZjk4MGE1LCAweDg2NzRjZGUzLCAweGVkZGEwNGViLCAweDE3YTliZTA0LCAweDJjMThmNGRmLAorMHhiNzc0N2Y5ZCwgMHhhYjJhZjdiNCwgMHhlZmMzNGQyMCwgMHgyZTA5NmI3YywgMHgxNzQxYTI1NCwgMHhlNWI2YTAzNSwgMHgyMTNkNDJmNiwgMHgyYzFjN2MyNiwKKzB4NjFjMmY1MGYsIDB4NjU1MmRhZjksIDB4ZDJjMjMxZjgsIDB4MjUxMzBmNjksIDB4ZDgxNjdmYTIsIDB4MDQxOGYyYzgsIDB4MDAxYTk2YTYsIDB4MGQxNTI2YWIsCisweDYzMzE1YzIxLCAweDVlMGE3MmVjLCAweDQ5YmFmZWZkLCAweDE4NzkwOGQ5LCAweDhkMGRiZDg2LCAweDMxMTE3MGE3LCAweDNlOWI2NDBjLCAweGNjM2UxMGQ3LAorMHhkNWNhZDNiNiwgMHgwY2FlYzM4OCwgMHhmNzMwMDFlMSwgMHg2YzcyOGFmZiwgMHg3MWVhZTJhMSwgMHgxZjlhZjM2ZSwgMHhjZmNiZDEyZiwgMHhjMWRlODQxNywKKzB4YWMwN2JlNmIsIDB4Y2I0NGExZDgsIDB4OGI5YjBmNTYsIDB4MDEzOTg4YzMsIDB4YjFjNTJmY2EsIDB4YjRiZTMxY2QsIDB4ZDg3ODI4MDYsIDB4MTJhM2E0ZTIsCisweDZmN2RlNTMyLCAweDU4ZmQ3ZWI2LCAweGQwMWVlOTAwLCAweDI0YWRmZmMyLCAweGY0OTkwZmM1LCAweDk3MTFhYWM1LCAweDAwMWQ3Yjk1LCAweDgyZTVlN2QyLAorMHgxMDk4NzNmNiwgMHgwMDYxMzA5NiwgMHhjMzJkOTUyMSwgMHhhZGExMjFmZiwgMHgyOTkwODQxNSwgMHg3ZmJiOTc3ZiwgMHhhZjllYjNkYiwgMHgyOWM5ZWQyYSwKKzB4NWNlMmE0NjUsIDB4YTczMGYzMmMsIDB4ZDBhYTNmZTgsIDB4OGE1Y2MwOTEsIDB4ZDQ5ZTJjZTcsIDB4MGNlNDU0YTksIDB4ZDYwYWNkODYsIDB4MDE1ZjE5MTksCisweDc3MDc5MTAzLCAweGRlYTAzYWY2LCAweDc4YTg1NjVlLCAweGRlZTM1NmRmLCAweDIxZjA1Y2JlLCAweDhiNzVlMzg3LCAweGIzYzUwNjUxLCAweGI4YTVjM2VmLAorMHhkOGVlYjZkMiwgMHhlNTIzYmU3NywgMHhjMjE1NDUyOSwgMHgyZjY5ZWZkZiwgMHhhZmU2N2FmYiwgMHhmNDcwYzRiMiwgMHhmM2UwZWI1YiwgMHhkNmNjOTg3NiwKKzB4MzllNDQ2MGMsIDB4MWZkYTg1MzgsIDB4MTk4NzgzMmYsIDB4Y2EwMDczNjcsIDB4YTk5MTQ0ZjgsIDB4Mjk2YjI5OWUsIDB4NDkyZmMyOTUsIDB4OTI2NmJlYWIsCisweGI1Njc2ZTY5LCAweDliZDNkZGRhLCAweGRmN2UwNTJmLCAweGRiMjU3MDFjLCAweDFiNWU1MWVlLCAweGY2NTMyNGU2LCAweDZhZmNlMzZjLCAweDAzMTZjYzA0LAorMHg4NjQ0MjEzZSwgMHhiN2RjNTlkMCwgMHg3OTY1MjkxZiwgMHhjY2Q2ZmQ0MywgMHg0MTgyMzk3OSwgMHg5MzJiY2RmNiwgMHhiNjU3YzM0ZCwgMHg0ZWRmZDI4MiwKKzB4N2FlNTI5MGMsIDB4M2NiOTUzNmIsIDB4ODUxZTIwZmUsIDB4OTgzMzU1N2UsIDB4MTNlY2YwYjAsIDB4ZDNmZmIzNzIsIDB4M2Y4NWM1YzEsIDB4MGFlZjdlZDIKK307CitzdGF0aWMgY29uc3QgdTMyIHM1WzI1Nl0gPSB7CisweDdlYzkwYzA0LCAweDJjNmU3NGI5LCAweDliMGU2NmRmLCAweGE2MzM3OTExLCAweGI4NmE3ZmZmLCAweDFkZDM1OGY1LCAweDQ0ZGQ5ZDQ0LCAweDE3MzExNjdmLAorMHgwOGZiZjFmYSwgMHhlN2Y1MTFjYywgMHhkMjA1MWIwMCwgMHg3MzVhYmEwMCwgMHgyYWI3MjJkOCwgMHgzODYzODFjYiwgMHhhY2Y2MjQzYSwgMHg2OWJlZmQ3YSwKKzB4ZTZhMmU3N2YsIDB4ZjBjNzIwY2QsIDB4YzQ0OTQ4MTYsIDB4Y2NmNWMxODAsIDB4Mzg4NTE2NDAsIDB4MTViMGE4NDgsIDB4ZTY4YjE4Y2IsIDB4NGNhYWRlZmYsCisweDVmNDgwYTAxLCAweDA0MTJiMmFhLCAweDI1OTgxNGZjLCAweDQxZDBlZmUyLCAweDRlNDBiNDhkLCAweDI0OGViNmZiLCAweDhkYmExY2ZlLCAweDQxYTk5YjAyLAorMHgxYTU1MGEwNCwgMHhiYThmNjVjYiwgMHg3MjUxZjRlNywgMHg5NWE1MTcyNSwgMHhjMTA2ZWNkNywgMHg5N2E1OTgwYSwgMHhjNTM5YjlhYSwgMHg0ZDc5ZmU2YSwKKzB4ZjJmM2Y3NjMsIDB4NjhhZjgwNDAsIDB4ZWQwYzllNTYsIDB4MTFiNDk1OGIsIDB4ZTFlYjVhODgsIDB4ODcwOWU2YjAsIDB4ZDdlMDcxNTYsIDB4NGUyOWZlYTcsCisweDYzNjZlNTJkLCAweDAyZDFjMDAwLCAweGM0YWM4ZTA1LCAweDkzNzdmNTcxLCAweDBjMDUzNzJhLCAweDU3ODUzNWYyLCAweDIyNjFiZTAyLCAweGQ2NDJhMGM5LAorMHhkZjEzYTI4MCwgMHg3NGI1NWJkMiwgMHg2ODIxOTljMCwgMHhkNDIxZTVlYywgMHg1M2ZiM2NlOCwgMHhjOGFkZWRiMywgMHgyOGE4N2ZjOSwgMHgzZDk1OTk4MSwKKzB4NWMxZmY5MDAsIDB4ZmUzOGQzOTksIDB4MGM0ZWZmMGIsIDB4MDYyNDA3ZWEsIDB4YWEyZjRmYjEsIDB4NGZiOTY5NzYsIDB4OTBjNzk1MDUsIDB4YjBhOGE3NzQsCisweGVmNTVhMWZmLCAweGU1OWNhMmMyLCAweGE2YjYyZDI3LCAweGU2NmE0MjYzLCAweGRmNjUwMDFmLCAweDBlYzUwOTY2LCAweGRmZGQ1NWJjLCAweDI5ZGUwNjU1LAorMHg5MTFlNzM5YSwgMHgxN2FmODk3NSwgMHgzMmM3OTExYywgMHg4OWY4OTQ2OCwgMHgwZDAxZTk4MCwgMHg1MjQ3NTVmNCwgMHgwM2I2M2NjOSwgMHgwY2M4NDRiMiwKKzB4YmNmM2YwYWEsIDB4ODdhYzM2ZTksIDB4ZTUzYTc0MjYsIDB4MDFiM2Q4MmIsIDB4MWE5ZTc0NDksIDB4NjRlZTJkN2UsIDB4Y2RkYmIxZGEsIDB4MDFjOTQ5MTAsCisweGI4NjhiZjgwLCAweDBkMjZmM2ZkLCAweDkzNDJlZGU3LCAweDA0YTVjMjg0LCAweDYzNjczN2I2LCAweDUwZjViNjE2LCAweGYyNDc2NmUzLCAweDhlY2EzNmMxLAorMHgxMzZlMDVkYiwgMHhmZWYxODM5MSwgMHhmYjg4N2EzNywgMHhkNmU3ZjdkNCwgMHhjN2ZiN2RjOSwgMHgzMDYzZmNkZiwgMHhiNmY1ODlkZSwgMHhlYzI5NDFkYSwKKzB4MjZlNDY2OTUsIDB4Yjc1NjY0MTksIDB4ZjY1NGVmYzUsIDB4ZDA4ZDU4YjcsIDB4NDg5MjU0MDEsIDB4YzFiYWNiN2YsIDB4ZTVmZjU1MGYsIDB4YjYwODMwNDksCisweDViYjVkMGU4LCAweDg3ZDcyZTVhLCAweGFiNmE2ZWUxLCAweDIyM2E2NmNlLCAweGM2MmJmM2NkLCAweDllMDg4NWY5LCAweDY4Y2IzZTQ3LCAweDA4NmMwMTBmLAorMHhhMjFkZTgyMCwgMHhkMThiNjlkZSwgMHhmM2Y2NTc3NywgMHhmYTAyYzNmNiwgMHg0MDdlZGFjMywgMHhjYmIzZDU1MCwgMHgxNzkzMDg0ZCwgMHhiMGQ3MGViYSwKKzB4MGFiMzc4ZDUsIDB4ZDk1MWZiMGMsIDB4ZGVkN2RhNTYsIDB4NDEyNGJiZTQsIDB4OTRjYTBiNTYsIDB4MGY1NzU1ZDEsIDB4ZTBlMWU1NmUsIDB4NjE4NGI1YmUsCisweDU4MGEyNDlmLCAweDk0Zjc0YmMwLCAweGUzMjc4ODhlLCAweDlmN2I1NTYxLCAweGMzZGMwMjgwLCAweDA1Njg3NzE1LCAweDY0NmM2YmQ3LCAweDQ0OTA0ZGIzLAorMHg2NmI0ZjBhMywgMHhjMGYxNjQ4YSwgMHg2OTdlZDVhZiwgMHg0OWU5MmZmNiwgMHgzMDllMzc0ZiwgMHgyY2I2MzU2YSwgMHg4NTgwODU3MywgMHg0OTkxZjg0MCwKKzB4NzZmMGFlMDIsIDB4MDgzYmU4NGQsIDB4Mjg0MjFjOWEsIDB4NDQ0ODk0MDYsIDB4NzM2ZTRjYjgsIDB4YzEwOTI5MTAsIDB4OGJjOTVmYzYsIDB4N2Q4NjljZjQsCisweDEzNGY2MTZmLCAweDJlNzcxMThkLCAweGIzMWIyYmUxLCAweGFhOTBiNDcyLCAweDNjYTVkNzE3LCAweDdkMTYxYmJhLCAweDljYWQ5MDEwLCAweGFmNDYyYmEyLAorMHg5ZmU0NTlkMiwgMHg0NWQzNDU1OSwgMHhkOWYyZGExMywgMHhkYmM2NTQ4NywgMHhmM2U0Zjk0ZSwgMHgxNzZkNDg2ZiwgMHgwOTdjMTNlYSwgMHg2MzFkYTVjNywKKzB4NDQ1ZjczODIsIDB4MTc1NjgzZjQsIDB4Y2RjNjZhOTcsIDB4NzBiZTAyODgsIDB4YjNjZGNmNzIsIDB4NmU1ZGQyZjMsIDB4MjA5MzYwNzksIDB4NDU5YjgwYTUsCisweGJlNjBlMmRiLCAweGE5YzIzMTAxLCAweGViYTUzMTVjLCAweDIyNGU0MmYyLCAweDFjNWMxNTcyLCAweGY2NzIxYjJjLCAweDFhZDJmZmYzLCAweDhjMjU0MDRlLAorMHgzMjRlZDcyZiwgMHg0MDY3YjdmZCwgMHgwNTIzMTM4ZSwgMHg1Y2EzYmM3OCwgMHhkYzBmZDY2ZSwgMHg3NTkyMjI4MywgMHg3ODRkNmIxNywgMHg1OGViYjE2ZSwKKzB4NDQwOTRmODUsIDB4M2Y0ODFkODcsIDB4ZmNmZWFlN2IsIDB4NzdiNWZmNzYsIDB4OGMyMzAyYmYsIDB4YWFmNDc1NTYsIDB4NWY0NmIwMmEsIDB4MmIwOTI4MDEsCisweDNkMzhmNWY3LCAweDBjYTgxZjM2LCAweDUyYWY0YThhLCAweDY2ZDVlN2MwLCAweGRmM2IwODc0LCAweDk1MDU1MTEwLCAweDFiNWFkN2E4LCAweGY2MWVkNWFkLAorMHg2Y2Y2ZTQ3OSwgMHgyMDc1ODE4NCwgMHhkMGNlZmE2NSwgMHg4OGY3YmU1OCwgMHg0YTA0NjgyNiwgMHgwZmY2ZjhmMywgMHhhMDljN2Y3MCwgMHg1MzQ2YWJhMCwKKzB4NWNlOTZjMjgsIDB4ZTE3NmVkYTMsIDB4NmJhYzMwN2YsIDB4Mzc2ODI5ZDIsIDB4ODUzNjBmYTksIDB4MTdlM2ZlMmEsIDB4MjRiNzk3NjcsIDB4ZjVhOTZiMjAsCisweGQ2Y2QyNTk1LCAweDY4ZmYxZWJmLCAweDc1NTU0NDJjLCAweGYxOWYwNmJlLCAweGY5ZTA2NTlhLCAweGVlYjk0OTFkLCAweDM0MDEwNzE4LCAweGJiMzBjYWI4LAorMHhlODIyZmUxNSwgMHg4ODU3MDk4MywgMHg3NTBlNjI0OSwgMHhkYTYyN2U1NSwgMHg1ZTc2ZmZhOCwgMHhiMTUzNDU0NiwgMHg2ZDQ3ZGUwOCwgMHhlZmU5ZTdkNAorfTsKK3N0YXRpYyBjb25zdCB1MzIgczZbMjU2XSA9IHsKKzB4ZjZmYThmOWQsIDB4MmNhYzZjZTEsIDB4NGNhMzQ4NjcsIDB4ZTIzMzdmN2MsIDB4OTVkYjA4ZTcsIDB4MDE2ODQzYjQsIDB4ZWNlZDVjYmMsIDB4MzI1NTUzYWMsCisweGJmOWYwOTYwLCAweGRmYTFlMmVkLCAweDgzZjA1NzlkLCAweDYzZWQ4NmI5LCAweDFhYjZhNmI4LCAweGRlNWViZTM5LCAweGYzOGZmNzMyLCAweDg5ODliMTM4LAorMHgzM2YxNDk2MSwgMHhjMDE5MzdiZCwgMHhmNTA2YzZkYSwgMHhlNDYyNWU3ZSwgMHhhMzA4ZWE5OSwgMHg0ZTIzZTMzYywgMHg3OWNiZDdjYywgMHg0OGExNDM2NywKKzB4YTMxNDk2MTksIDB4ZmVjOTRiZDUsIDB4YTExNDE3NGEsIDB4ZWFhMDE4NjYsIDB4YTA4NGRiMmQsIDB4MDlhODQ4NmYsIDB4YTg4ODYxNGEsIDB4MjkwMGFmOTgsCisweDAxNjY1OTkxLCAweGUxOTkyODYzLCAweGM4ZjMwYzYwLCAweDJlNzhlZjNjLCAweGQwZDUxOTMyLCAweGNmMGZlYzE0LCAweGY3Y2EwN2QyLCAweGQwYTgyMDcyLAorMHhmZDQxMTk3ZSwgMHg5MzA1YTZiMCwgMHhlODZiZTNkYSwgMHg3NGJlZDNjZCwgMHgzNzJkYTUzYywgMHg0YzdmNDQ0OCwgMHhkYWI1ZDQ0MCwgMHg2ZGJhMGVjMywKKzB4MDgzOTE5YTcsIDB4OWZiYWVlZDksIDB4NDlkYmNmYjAsIDB4NGU2NzBjNTMsIDB4NWMzZDljMDEsIDB4NjRiZGI5NDEsIDB4MmMwZTYzNmEsIDB4YmE3ZGQ5Y2QsCisweGVhNmY3Mzg4LCAweGU3MGJjNzYyLCAweDM1ZjI5YWRiLCAweDVjNGNkZDhkLCAweGYwZDQ4ZDhjLCAweGI4ODE1M2UyLCAweDA4YTE5ODY2LCAweDFhZTJlYWM4LAorMHgyODRjYWY4OSwgMHhhYTkyODIyMywgMHg5MzM0YmU1MywgMHgzYjNhMjFiZiwgMHgxNjQzNGJlMywgMHg5YWVhMzkwNiwgMHhlZmU4YzM2ZSwgMHhmODkwY2RkOSwKKzB4ODAyMjZkYWUsIDB4YzM0MGE0YTMsIDB4ZGY3ZTljMDksIDB4YTY5NGE4MDcsIDB4NWI3YzVlY2MsIDB4MjIxZGIzYTYsIDB4OWE2OWEwMmYsIDB4Njg4MThhNTQsCisweGNlYjIyOTZmLCAweDUzYzA4NDNhLCAweGZlODkzNjU1LCAweDI1YmZlNjhhLCAweGI0NjI4YWJjLCAweGNmMjIyZWJmLCAweDI1YWM2ZjQ4LCAweGE5YTk5Mzg3LAorMHg1M2JkZGI2NSwgMHhlNzZmZmJlNywgMHhlOTY3ZmQ3OCwgMHgwYmE5MzU2MywgMHg4ZTM0MmJjMSwgMHhlOGExMWJlOSwgMHg0OTgwNzQwZCwgMHhjODA4N2RmYywKKzB4OGRlNGJmOTksIDB4YTExMTAxYTAsIDB4N2ZkMzc5NzUsIDB4ZGE1YTI2YzAsIDB4ZTgxZjk5NGYsIDB4OTUyOGNkODksIDB4ZmQzMzlmZWQsIDB4Yjg3ODM0YmYsCisweDVmMDQ0NTZkLCAweDIyMjU4Njk4LCAweGM5YzRjODNiLCAweDJkYzE1NmJlLCAweDRmNjI4ZGFhLCAweDU3ZjU1ZWM1LCAweGUyMjIwYWJlLCAweGQyOTE2ZWJmLAorMHg0ZWM3NWI5NSwgMHgyNGYyYzNjMCwgMHg0MmQxNWQ5OSwgMHhjZDBkN2ZhMCwgMHg3YjZlMjdmZiwgMHhhOGRjOGFmMCwgMHg3MzQ1YzEwNiwgMHhmNDFlMjMyZiwKKzB4MzUxNjIzODYsIDB4ZTZlYTg5MjYsIDB4MzMzM2IwOTQsIDB4MTU3ZWM2ZjIsIDB4MzcyYjc0YWYsIDB4NjkyNTczZTQsIDB4ZTlhOWQ4NDgsIDB4ZjMxNjAyODksCisweDNhNjJlZjFkLCAweGE3ODdlMjM4LCAweGYzYTVmNjc2LCAweDc0MzY0ODUzLCAweDIwOTUxMDYzLCAweDQ1NzY2OThkLCAweGI2ZmFkNDA3LCAweDU5MmFmOTUwLAorMHgzNmY3MzUyMywgMHg0Y2ZiNmU4NywgMHg3ZGE0Y2VjMCwgMHg2YzE1MmRhYSwgMHhjYjAzOTZhOCwgMHhjNTBkZmU1ZCwgMHhmY2Q3MDdhYiwgMHgwOTIxYzQyZiwKKzB4ODlkZmYwYmIsIDB4NWZlMmJlNzgsIDB4NDQ4ZjRmMzMsIDB4NzU0NjEzYzksIDB4MmIwNWQwOGQsIDB4NDhiOWQ1ODUsIDB4ZGMwNDk0NDEsIDB4YzgwOThmOWIsCisweDdkZWRlNzg2LCAweGMzOWEzMzczLCAweDQyNDEwMDA1LCAweDZhMDkxNzUxLCAweDBlZjNjOGE2LCAweDg5MDA3MmQ2LCAweDI4MjA3NjgyLCAweGE5YTlmN2JlLAorMHhiZjMyNjc5ZCwgMHhkNDViNWI3NSwgMHhiMzUzZmQwMCwgMHhjYmIwZTM1OCwgMHg4MzBmMjIwYSwgMHgxZjhmYjIxNCwgMHhkMzcyY2YwOCwgMHhjYzNjNGExMywKKzB4OGNmNjMxNjYsIDB4MDYxYzg3YmUsIDB4ODhjOThmODgsIDB4NjA2MmUzOTcsIDB4NDdjZjhlN2EsIDB4YjZjODUyODMsIDB4M2NjMmFjZmIsIDB4M2ZjMDY5NzYsCisweDRlOGYwMjUyLCAweDY0ZDgzMTRkLCAweGRhMzg3MGUzLCAweDFlNjY1NDU5LCAweGMxMDkwOGYwLCAweDUxMzAyMWE1LCAweDZjNWI2OGI3LCAweDgyMmY4YWEwLAorMHgzMDA3Y2QzZSwgMHg3NDcxOWVlZiwgMHhkYzg3MjY4MSwgMHgwNzMzNDBkNCwgMHg3ZTQzMmZkOSwgMHgwYzVlYzI0MSwgMHg4ODA5Mjg2YywgMHhmNTkyZDg5MSwKKzB4MDhhOTMwZjYsIDB4OTU3ZWYzMDUsIDB4YjdmYmZmYmQsIDB4YzI2NmU5NmYsIDB4NmZlNGFjOTgsIDB4YjE3M2VjYzAsIDB4YmM2MGI0MmEsIDB4OTUzNDk4ZGEsCisweGZiYTFhZTEyLCAweDJkNGJkNzM2LCAweDBmMjVmYWFiLCAweGE0ZjNmY2ViLCAweGUyOTY5MTIzLCAweDI1N2YwYzNkLCAweDkzNDhhZjQ5LCAweDM2MTQwMGJjLAorMHhlODgxNmY0YSwgMHgzODE0ZjIwMCwgMHhhM2Y5NDA0MywgMHg5YzdhNTRjMiwgMHhiYzcwNGY1NywgMHhkYTQxZTdmOSwgMHhjMjVhZDMzYSwgMHg1NGY0YTA4NCwKKzB4YjE3ZjU1MDUsIDB4NTkzNTdjYmUsIDB4ZWRiZDE1YzgsIDB4N2Y5N2M1YWIsIDB4YmE1YWM3YjUsIDB4YjZmNmRlYWYsIDB4M2E0NzljM2EsIDB4NTMwMmRhMjUsCisweDY1M2Q3ZTZhLCAweDU0MjY4ZDQ5LCAweDUxYTQ3N2VhLCAweDUwMTdkNTViLCAweGQ3ZDI1ZDg4LCAweDQ0MTM2Yzc2LCAweDA0MDRhOGM4LCAweGI4ZTVhMTIxLAorMHhiODFhOTI4YSwgMHg2MGVkNTg2OSwgMHg5N2M1NWI5NiwgMHhlYWVjOTkxYiwgMHgyOTkzNTkxMywgMHgwMWZkYjdmMSwgMHgwODhlOGRmYSwgMHg5YWI2ZjZmNSwKKzB4M2I0Y2JmOWYsIDB4NGE1ZGUzYWIsIDB4ZTYwNTFkMzUsIDB4YTBlMWQ4NTUsIDB4ZDM2YjRjZjEsIDB4ZjU0NGVkZWIsIDB4YjBlOTM1MjQsIDB4YmViYjhmYmQsCisweGEyZDc2MmNmLCAweDQ5YzkyZjU0LCAweDM4YjVmMzMxLCAweDcxMjhhNDU0LCAweDQ4MzkyOTA1LCAweGE2NWIxZGI4LCAweDg1MWM5N2JkLCAweGQ2NzVjZjJmCit9Oworc3RhdGljIGNvbnN0IHUzMiBzN1syNTZdID0geworMHg4NWUwNDAxOSwgMHgzMzJiZjU2NywgMHg2NjJkYmZmZiwgMHhjZmM2NTY5MywgMHgyYThkN2Y2ZiwgMHhhYjliYzkxMiwgMHhkZTYwMDhhMSwgMHgyMDI4ZGExZiwKKzB4MDIyN2JjZTcsIDB4NGQ2NDI5MTYsIDB4MThmYWMzMDAsIDB4NTBmMThiODIsIDB4MmNiMmNiMTEsIDB4YjIzMmU3NWMsIDB4NGIzNjk1ZjIsIDB4YjI4NzA3ZGUsCisweGEwNWZiY2Y2LCAweGNkNDE4MWU5LCAweGUxNTAyMTBjLCAweGUyNGVmMWJkLCAweGIxNjhjMzgxLCAweGZkZTRlNzg5LCAweDVjNzliMGQ4LCAweDFlOGJmZDQzLAorMHg0ZDQ5NTAwMSwgMHgzOGJlNDM0MSwgMHg5MTNjZWUxZCwgMHg5MmE3OWMzZiwgMHgwODk3NjZiZSwgMHhiYWVlYWRmNCwgMHgxMjg2YmVjZiwgMHhiNmVhY2IxOSwKKzB4MjY2MGMyMDAsIDB4NzU2NWJkZTQsIDB4NjQyNDFmN2EsIDB4ODI0OGRjYTksIDB4YzNiM2FkNjYsIDB4MjgxMzYwODYsIDB4MGJkOGRmYTgsIDB4MzU2ZDFjZjIsCisweDEwNzc4OWJlLCAweGIzYjJlOWNlLCAweDA1MDJhYThmLCAweDBiYzAzNTFlLCAweDE2NmJmNTJhLCAweGViMTJmZjgyLCAweGUzNDg2OTExLCAweGQzNGQ3NTE2LAorMHg0ZTdiM2FmZiwgMHg1ZjQzNjcxYiwgMHg5Y2Y2ZTAzNywgMHg0OTgxYWM4MywgMHgzMzQyNjZjZSwgMHg4YzkzNDFiNywgMHhkMGQ4NTRjMCwgMHhjYjNhNmM4OCwKKzB4NDdiYzI4MjksIDB4NDcyNWJhMzcsIDB4YTY2YWQyMmIsIDB4N2FkNjFmMWUsIDB4MGM1Y2JhZmEsIDB4NDQzN2YxMDcsIDB4YjZlNzk5NjIsIDB4NDJkMmQ4MTYsCisweDBhOTYxMjg4LCAweGUxYTVjMDZlLCAweDEzNzQ5ZTY3LCAweDcyZmMwODFhLCAweGIxZDEzOWY3LCAweGY5NTgzNzQ1LCAweGNmMTlkZjU4LCAweGJlYzNmNzU2LAorMHhjMDZlYmEzMCwgMHgwNzIxMWIyNCwgMHg0NWMyODgyOSwgMHhjOTVlMzE3ZiwgMHhiYzhlYzUxMSwgMHgzOGJjNDZlOSwgMHhjNmU2ZmExNCwgMHhiYWU4NTg0YSwKKzB4YWQ0ZWJjNDYsIDB4NDY4ZjUwOGIsIDB4NzgyOTQzNWYsIDB4ZjEyNDE4M2IsIDB4ODIxZGJhOWYsIDB4YWZmNjBmZjQsIDB4ZWEyYzRlNmQsIDB4MTZlMzkyNjQsCisweDkyNTQ0YThiLCAweDAwOWI0ZmMzLCAweGFiYTY4Y2VkLCAweDlhYzk2Zjc4LCAweDA2YTViNzlhLCAweGIyODU2ZTZlLCAweDFhZWMzY2E5LCAweGJlODM4Njg4LAorMHgwZTA4MDRlOSwgMHg1NWYxYmU1NiwgMHhlN2U1MzYzYiwgMHhiM2ExZjI1ZCwgMHhmN2RlYmI4NSwgMHg2MWZlMDMzYywgMHgxNjc0NjIzMywgMHgzYzAzNGMyOCwKKzB4ZGE2ZDBjNzQsIDB4NzlhYWM1NmMsIDB4M2NlNGUxYWQsIDB4NTFmMGM4MDIsIDB4OThmOGYzNWEsIDB4MTYyNmE0OWYsIDB4ZWVkODJiMjksIDB4MWQzODJmZTMsCisweDBjNGZiOTlhLCAweGJiMzI1Nzc4LCAweDNlYzZkOTdiLCAweDZlNzdhNmE5LCAweGNiNjU4YjVjLCAweGQ0NTIzMGM3LCAweDJiZDE0MDhiLCAweDYwYzAzZWI3LAorMHhiOTA2OGQ3OCwgMHhhMzM3NTRmNCwgMHhmNDMwYzg3ZCwgMHhjOGE3MTMwMiwgMHhiOTZkOGMzMiwgMHhlYmQ0ZTdiZSwgMHhiZThiOWQyZCwgMHg3OTc5ZmIwNiwKKzB4ZTcyMjUzMDgsIDB4OGI3NWNmNzcsIDB4MTFlZjhkYTQsIDB4ZTA4M2M4NTgsIDB4OGQ2Yjc4NmYsIDB4NWE2MzE3YTYsIDB4ZmE1Y2Y3YTAsIDB4NWRkYTAwMzMsCisweGYyOGViZmIwLCAweGY1YjljMzEwLCAweGEwZWFjMjgwLCAweDA4Yjk3NjdhLCAweGEzZDlkMmIwLCAweDc5ZDM0MjE3LCAweDAyMWE3MThkLCAweDlhYzYzMzZhLAorMHgyNzExZmQ2MCwgMHg0MzgwNTBlMywgMHgwNjk5MDhhOCwgMHgzZDdmZWRjNCwgMHg4MjZkMmJlZiwgMHg0ZWViODQ3NiwgMHg0ODhkY2YyNSwgMHgzNmM5ZDU2NiwKKzB4MjhlNzRlNDEsIDB4YzI2MTBhY2EsIDB4M2Q0OWE5Y2YsIDB4YmFlM2I5ZGYsIDB4YjY1ZjhkZTYsIDB4OTJhZWFmNjQsIDB4M2FjN2Q1ZTYsIDB4OWVhODA1MDksCisweGYyMmIwMTdkLCAweGE0MTczZjcwLCAweGRkMWUxNmMzLCAweDE1ZTBkN2Y5LCAweDUwYjFiODg3LCAweDJiOWY0ZmQ1LCAweDYyNWFiYTgyLCAweDZhMDE3OTYyLAorMHgyZWMwMWI5YywgMHgxNTQ4OGFhOSwgMHhkNzE2ZTc0MCwgMHg0MDA1NWEyYywgMHg5M2QyOWEyMiwgMHhlMzJkYmY5YSwgMHgwNTg3NDViOSwgMHgzNDUzZGMxZSwKKzB4ZDY5OTI5NmUsIDB4NDk2Y2ZmNmYsIDB4MWM5ZjQ5ODYsIDB4ZGZlMmVkMDcsIDB4Yjg3MjQyZDEsIDB4MTlkZTdlYWUsIDB4MDUzZTU2MWEsIDB4MTVhZDZmOGMsCisweDY2NjI2YzFjLCAweDcxNTRjMjRjLCAweGVhMDgyYjJhLCAweDkzZWIyOTM5LCAweDE3ZGNiMGYwLCAweDU4ZDRmMmFlLCAweDllYTI5NGZiLCAweDUyY2Y1NjRjLAorMHg5ODgzZmU2NiwgMHgyZWM0MDU4MSwgMHg3NjM5NTNjMywgMHgwMWQ2NjkyZSwgMHhkM2EwYzEwOCwgMHhhMWU3MTYwZSwgMHhlNGYyZGZhNiwgMHg2OTNlZDI4NSwKKzB4NzQ5MDQ2OTgsIDB4NGMyYjBlZGQsIDB4NGY3NTc2NTYsIDB4NWQzOTMzNzgsIDB4YTEzMjIzNGYsIDB4M2QzMjFjNWQsIDB4YzNmNWUxOTQsIDB4NGIyNjkzMDEsCisweGM3OWYwMjJmLCAweDNjOTk3ZTdlLCAweDVlNGY5NTA0LCAweDNmZmFmYmJkLCAweDc2ZjdhZDBlLCAweDI5NjY5M2Y0LCAweDNkMWZjZTZmLCAweGM2MWU0NWJlLAorMHhkM2I1YWIzNCwgMHhmNzJiZjliNywgMHgxYjA0MzRjMCwgMHg0ZTcyYjU2NywgMHg1NTkyYTMzZCwgMHhiNTIyOTMwMSwgMHhjZmQyYTg3ZiwgMHg2MGFlYjc2NywKKzB4MTgxNDM4NmIsIDB4MzBiY2MzM2QsIDB4MzhhMGMwN2QsIDB4ZmQxNjA2ZjIsIDB4YzM2MzUxOWIsIDB4NTg5ZGQzOTAsIDB4NTQ3OWY4ZTYsIDB4MWNiOGQ2NDcsCisweDk3ZmQ2MWE5LCAweGVhNzc1OWY0LCAweDJkNTc1MzlkLCAweDU2OWE1OGNmLCAweGU4NGU2M2FkLCAweDQ2MmUxYjc4LCAweDY1ODBmODdlLCAweGYzODE3OTE0LAorMHg5MWRhNTVmNCwgMHg0MGEyMzBmMywgMHhkMTk4OGYzNSwgMHhiNmUzMThkMiwgMHgzZmZhNTBiYywgMHgzZDQwZjAyMSwgMHhjM2MwYmRhZSwgMHg0OTU4YzI0YywKKzB4NTE4ZjM2YjIsIDB4ODRiMWQzNzAsIDB4MGZlZGNlODMsIDB4ODc4ZGRhZGEsIDB4ZjJhMjc5YzcsIDB4OTRlMDFiZTgsIDB4OTA3MTZmNGIsIDB4OTU0YjhhYTMKK307CitzdGF0aWMgY29uc3QgdTMyIHM4WzI1Nl0gPSB7CisweGUyMTYzMDBkLCAweGJiZGRmZmZjLCAweGE3ZWJkYWJkLCAweDM1NjQ4MDk1LCAweDc3ODlmOGI3LCAweGU2YzExMjFiLCAweDBlMjQxNjAwLCAweDA1MmNlOGI1LAorMHgxMWE5Y2ZiMCwgMHhlNTk1MmYxMSwgMHhlY2U3OTkwYSwgMHg5Mzg2ZDE3NCwgMHgyYTQyOTMxYywgMHg3NmUzODExMSwgMHhiMTJkZWYzYSwgMHgzN2RkZGRmYywKKzB4ZGU5YWRlYjEsIDB4MGEwY2MzMmMsIDB4YmUxOTcwMjksIDB4ODRhMDA5NDAsIDB4YmIyNDNhMGYsIDB4YjRkMTM3Y2YsIDB4YjQ0ZTc5ZjAsIDB4MDQ5ZWVkZmQsCisweDBiMTVhMTVkLCAweDQ4MGQzMTY4LCAweDhiYmJkZTVhLCAweDY2OWRlZDQyLCAweGM3ZWNlODMxLCAweDNmOGY5NWU3LCAweDcyZGYxOTFiLCAweDc1ODAzMzBkLAorMHg5NDA3NDI1MSwgMHg1YzdkY2RmYSwgMHhhYmJlNmQ2MywgMHhhYTQwMjE2NCwgMHhiMzAxZDQwYSwgMHgwMmU3ZDFjYSwgMHg1MzU3MWRhZSwgMHg3YTMxODJhMiwKKzB4MTJhOGRkZWMsIDB4ZmRhYTMzNWQsIDB4MTc2ZjQzZTgsIDB4NzFmYjQ2ZDQsIDB4MzgxMjkwMjIsIDB4Y2U5NDlhZDQsIDB4Yjg0NzY5YWQsIDB4OTY1YmQ4NjIsCisweDgyZjNkMDU1LCAweDY2ZmI5NzY3LCAweDE1YjgwYjRlLCAweDFkNWI0N2EwLCAweDRjZmRlMDZmLCAweGMyOGVjNGI4LCAweDU3ZTg3MjZlLCAweDY0N2E3OGZjLAorMHg5OTg2NWQ0NCwgMHg2MDhiZDU5MywgMHg2YzIwMGUwMywgMHgzOWRjNWZmNiwgMHg1ZDBiMDBhMywgMHhhZTYzYWZmMiwgMHg3ZThiZDYzMiwgMHg3MDEwOGMwYywKKzB4YmJkMzUwNDksIDB4Mjk5OGRmMDQsIDB4OTgwY2Y0MmEsIDB4OWI2ZGY0OTEsIDB4OWU3ZWRkNTMsIDB4MDY5MTg1NDgsIDB4NThjYjdlMDcsIDB4M2I3NGVmMmUsCisweDUyMmZmZmIxLCAweGQyNDcwOGNjLCAweDFjN2UyN2NkLCAweGE0ZWIyMTViLCAweDNjZjFkMmUyLCAweDE5YjQ3YTM4LCAweDQyNGY3NjE4LCAweDM1ODU2MDM5LAorMHg5ZDE3ZGVlNywgMHgyN2ViMzVlNiwgMHhjOWFmZjY3YiwgMHgzNmJhZjViOCwgMHgwOWM0NjdjZCwgMHhjMTg5MTBiMSwgMHhlMTFkYmY3YiwgMHgwNmNkMWFmOCwKKzB4NzE3MGM2MDgsIDB4MmQ1ZTMzNTQsIDB4ZDRkZTQ5NWEsIDB4NjRjNmQwMDYsIDB4YmNjMGM2MmMsIDB4M2RkMDBkYjMsIDB4NzA4ZjhmMzQsIDB4NzdkNTFiNDIsCisweDI2NGY2MjBmLCAweDI0YjhkMmJmLCAweDE1YzFiNzllLCAweDQ2YTUyNTY0LCAweGY4ZDdlNTRlLCAweDNlMzc4MTYwLCAweDc4OTVjZGE1LCAweDg1OWMxNWE1LAorMHhlNjQ1OTc4OCwgMHhjMzdiYzc1ZiwgMHhkYjA3YmEwYywgMHgwNjc2YTNhYiwgMHg3ZjIyOWIxZSwgMHgzMTg0MmU3YiwgMHgyNDI1OWZkNywgMHhmOGJlZjQ3MiwKKzB4ODM1ZmZjYjgsIDB4NmRmNGMxZjIsIDB4OTZmNWIxOTUsIDB4ZmQwYWYwZmMsIDB4YjBmZTEzNGMsIDB4ZTI1MDZkM2QsIDB4NGY5YjEyZWEsIDB4ZjIxNWYyMjUsCisweGEyMjM3MzZmLCAweDlmYjRjNDI4LCAweDI1ZDA0OTc5LCAweDM0YzcxM2Y4LCAweGM0NjE4MTg3LCAweGVhN2E2ZTk4LCAweDdjZDE2ZWZjLCAweDE0MzY4NzZjLAorMHhmMTU0NDEwNywgMHhiZWRlZWUxNCwgMHg1NmU5YWYyNywgMHhhMDRhYTQ0MSwgMHgzY2Y3Yzg5OSwgMHg5MmVjYmFlNiwgMHhkZDY3MDE2ZCwgMHgxNTE2ODJlYiwKKzB4YTg0MmVlZGYsIDB4ZmRiYTYwYjQsIDB4ZjE5MDdiNzUsIDB4MjBlMzAzMGYsIDB4MjRkOGMyOWUsIDB4ZTEzOTY3M2IsIDB4ZWZhNjNmYjgsIDB4NzE4NzMwNTQsCisweGI2ZjJjZjNiLCAweDlmMzI2NDQyLCAweGNiMTVhNGNjLCAweGIwMWE0NTA0LCAweGYxZTQ3ZDhkLCAweDg0NGExYmU1LCAweGJhZTdkZmRjLCAweDQyY2JkYTcwLAorMHhjZDdkYWUwYSwgMHg1N2U4NWI3YSwgMHhkNTNmNWFmNiwgMHgyMGNmNGQ4YywgMHhjZWE0ZDQyOCwgMHg3OWQxMzBhNCwgMHgzNDg2ZWJmYiwgMHgzM2QzY2RkYywKKzB4Nzc4NTNiNTMsIDB4MzdlZmZjYjUsIDB4YzUwNjg3NzgsIDB4ZTU4MGIzZTYsIDB4NGU2OGI4ZjQsIDB4YzVjOGIzN2UsIDB4MGQ4MDllYTIsIDB4Mzk4ZmViN2MsCisweDEzMmE0Zjk0LCAweDQzYjc5NTBlLCAweDJmZWU3ZDFjLCAweDIyMzYxM2JkLCAweGRkMDZjYWEyLCAweDM3ZGY5MzJiLCAweGM0MjQ4Mjg5LCAweGFjZjNlYmMzLAorMHg1NzE1ZjZiNywgMHhlZjM0NzhkZCwgMHhmMjY3NjE2ZiwgMHhjMTQ4Y2JlNCwgMHg5MDUyODE1ZSwgMHg1ZTQxMGZhYiwgMHhiNDhhMjQ2NSwgMHgyZWRhN2ZhNCwKKzB4ZTg3YjQwZTQsIDB4ZTk4ZWEwODQsIDB4NTg4OWU5ZTEsIDB4ZWZkMzkwZmMsIDB4ZGQwN2QzNWIsIDB4ZGI0ODU2OTQsIDB4MzhkN2U1YjIsIDB4NTc3MjAxMDEsCisweDczMGVkZWJjLCAweDViNjQzMTEzLCAweDk0OTE3ZTRmLCAweDUwM2MyZmJhLCAweDY0NmYxMjgyLCAweDc1MjNkMjRhLCAweGUwNzc5Njk1LCAweGY5YzE3YThmLAorMHg3YTViMjEyMSwgMHhkMTg3Yjg5NiwgMHgyOTI2M2E0ZCwgMHhiYTUxMGNkZiwgMHg4MWY0N2M5ZiwgMHhhZDExNjNlZCwgMHhlYTdiNTk2NSwgMHgxYTAwNzI2ZSwKKzB4MTE0MDMwOTIsIDB4MDBkYTZkNzcsIDB4NGEwY2RkNjEsIDB4YWQxZjQ2MDMsIDB4NjA1YmRmYjAsIDB4OWVlZGMzNjQsIDB4MjJlYmU2YTgsIDB4Y2VlN2QyOGEsCisweGEwZTczNmEwLCAweDU1NjRhNmI5LCAweDEwODUzMjA5LCAweGM3ZWI4ZjM3LCAweDJkZTcwNWNhLCAweDg5NTE1NzBmLCAweGRmMDk4MjJiLCAweGJkNjkxYTZjLAorMHhhYTEyZTRmMiwgMHg4NzQ1MWMwZiwgMHhlMGY2YTI3YSwgMHgzYWRhNDgxOSwgMHg0Y2YxNzY0ZiwgMHgwZDc3MWMyYiwgMHg2N2NkYjE1NiwgMHgzNTBkODM4NCwKKzB4NTkzOGZhMGYsIDB4NDIzOTllZjMsIDB4MzY5OTdiMDcsIDB4MGU4NDA5M2QsIDB4NGFhOTNlNjEsIDB4ODM2MGQ4N2IsIDB4MWZhOThiMGMsIDB4MTE0OTM4MmMsCisweGU5NzYyNWE1LCAweDA2MTRkMWI3LCAweDBlMjUyNDRiLCAweDBjNzY4MzQ3LCAweDU4OWU4ZDgyLCAweDBkMjA1OWQxLCAweGE0NjZiYjFlLCAweGY4ZGEwYTgyLAorMHgwNGYxOTEzMCwgMHhiYTZlNGVjMCwgMHg5OTI2NTE2NCwgMHgxZWU3MjMwZCwgMHg1MGIyYWQ4MCwgMHhlYWVlNjgwMSwgMHg4ZGIyYTI4MywgMHhlYThiZjU5ZQorfTsKKworCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX2kzODZfXykKK3N0YXRpYyBpbmxpbmUgdTMyCityb2woaW50IG4sIHUzMiB4KQoreworCV9fYXNtX18oInJvbGwgJSVjbCwlMCIKKwkJOiI9ciIgKHgpCisJCToiMCIgKHgpLCJjIiAobikpOworCXJldHVybiB4OworfQorI2Vsc2UKKyNkZWZpbmUgcm9sKG4seCkgKCAoKHgpIDw8IChuKSkgfCAoKHgpID4+ICgzMi0obikpKSApCisjZW5kaWYKKworI2RlZmluZSBGMShELG0scikgICggIChJID0gKChtKSArIChEKSkpLCAoST1yb2woKHIpLEkpKSwgICBcCisgICAgKCgoczFbSSA+PiAyNF0gXiBzMlsoST4+MTYpJjB4ZmZdKSAtIHMzWyhJPj44KSYweGZmXSkgKyBzNFtJJjB4ZmZdKSApCisjZGVmaW5lIEYyKEQsbSxyKSAgKCAgKEkgPSAoKG0pIF4gKEQpKSksIChJPXJvbCgociksSSkpLCAgIFwKKyAgICAoKChzMVtJID4+IDI0XSAtIHMyWyhJPj4xNikmMHhmZl0pICsgczNbKEk+PjgpJjB4ZmZdKSBeIHM0W0kmMHhmZl0pICkKKyNkZWZpbmUgRjMoRCxtLHIpICAoICAoSSA9ICgobSkgLSAoRCkpKSwgKEk9cm9sKChyKSxJKSksICAgXAorICAgICgoKHMxW0kgPj4gMjRdICsgczJbKEk+PjE2KSYweGZmXSkgXiBzM1soST4+OCkmMHhmZl0pIC0gczRbSSYweGZmXSkgKQorCitzdGF0aWMgdm9pZAorZG9fZW5jcnlwdF9ibG9jayggQ0FTVDVfY29udGV4dCAqYywgYnl0ZSAqb3V0YnVmLCBjb25zdCBieXRlICppbmJ1ZiApCit7CisgICAgdTMyIGwsIHIsIHQ7CisgICAgdTMyIEk7ICAgLyogdXNlZCBieSB0aGUgRnggbWFjcm9zICovCisgICAgdTMyICpLbTsKKyAgICBieXRlICpLcjsKKworICAgIEttID0gYy0+S207CisgICAgS3IgPSBjLT5LcjsKKworICAgIC8qIChMMCxSMCkgPC0tIChtMS4uLm02NCkuCShTcGxpdCB0aGUgcGxhaW50ZXh0IGludG8gbGVmdCBhbmQKKyAgICAgKiByaWdodCAzMi1iaXQgaGFsdmVzIEwwID0gbTEuLi5tMzIgYW5kIFIwID0gbTMzLi4ubTY0LikKKyAgICAgKi8KKyAgICBsID0gaW5idWZbMF0gPDwgMjQgfCBpbmJ1ZlsxXSA8PCAxNiB8IGluYnVmWzJdIDw8IDggfCBpbmJ1ZlszXTsKKyAgICByID0gaW5idWZbNF0gPDwgMjQgfCBpbmJ1Zls1XSA8PCAxNiB8IGluYnVmWzZdIDw8IDggfCBpbmJ1Zls3XTsKKworICAgIC8qICgxNiByb3VuZHMpIGZvciBpIGZyb20gMSB0byAxNiwgY29tcHV0ZSBMaSBhbmQgUmkgYXMgZm9sbG93czoKKyAgICAgKglMaSA9IFJpLTE7CisgICAgICoJUmkgPSBMaS0xIF4gZihSaS0xLEttaSxLcmkpLCB3aGVyZSBmIGlzIGRlZmluZWQgaW4gU2VjdGlvbiAyLjIKKyAgICAgKiBSb3VuZHMgMSwgNCwgNywgMTAsIDEzLCBhbmQgMTYgdXNlIGYgZnVuY3Rpb24gVHlwZSAxLgorICAgICAqIFJvdW5kcyAyLCA1LCA4LCAxMSwgYW5kIDE0IHVzZSBmIGZ1bmN0aW9uIFR5cGUgMi4KKyAgICAgKiBSb3VuZHMgMywgNiwgOSwgMTIsIGFuZCAxNSB1c2UgZiBmdW5jdGlvbiBUeXBlIDMuCisgICAgICovCisKKyAgICB0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjEociwgS21bIDBdLCBLclsgMF0pOworICAgIHQgPSBsOyBsID0gcjsgciA9IHQgXiBGMihyLCBLbVsgMV0sIEtyWyAxXSk7CisgICAgdCA9IGw7IGwgPSByOyByID0gdCBeIEYzKHIsIEttWyAyXSwgS3JbIDJdKTsKKyAgICB0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjEociwgS21bIDNdLCBLclsgM10pOworICAgIHQgPSBsOyBsID0gcjsgciA9IHQgXiBGMihyLCBLbVsgNF0sIEtyWyA0XSk7CisgICAgdCA9IGw7IGwgPSByOyByID0gdCBeIEYzKHIsIEttWyA1XSwgS3JbIDVdKTsKKyAgICB0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjEociwgS21bIDZdLCBLclsgNl0pOworICAgIHQgPSBsOyBsID0gcjsgciA9IHQgXiBGMihyLCBLbVsgN10sIEtyWyA3XSk7CisgICAgdCA9IGw7IGwgPSByOyByID0gdCBeIEYzKHIsIEttWyA4XSwgS3JbIDhdKTsKKyAgICB0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjEociwgS21bIDldLCBLclsgOV0pOworICAgIHQgPSBsOyBsID0gcjsgciA9IHQgXiBGMihyLCBLbVsxMF0sIEtyWzEwXSk7CisgICAgdCA9IGw7IGwgPSByOyByID0gdCBeIEYzKHIsIEttWzExXSwgS3JbMTFdKTsKKyAgICB0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjEociwgS21bMTJdLCBLclsxMl0pOworICAgIHQgPSBsOyBsID0gcjsgciA9IHQgXiBGMihyLCBLbVsxM10sIEtyWzEzXSk7CisgICAgdCA9IGw7IGwgPSByOyByID0gdCBeIEYzKHIsIEttWzE0XSwgS3JbMTRdKTsKKyAgICB0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjEociwgS21bMTVdLCBLclsxNV0pOworCisgICAgLyogYzEuLi5jNjQgPC0tIChSMTYsTDE2KS4JKEV4Y2hhbmdlIGZpbmFsIGJsb2NrcyBMMTYsIFIxNiBhbmQKKyAgICAgKgljb25jYXRlbmF0ZSB0byBmb3JtIHRoZSBjaXBoZXJ0ZXh0LikgKi8KKyAgICBvdXRidWZbMF0gPSAociA+PiAyNCkgJiAweGZmOworICAgIG91dGJ1ZlsxXSA9IChyID4+IDE2KSAmIDB4ZmY7CisgICAgb3V0YnVmWzJdID0gKHIgPj4gIDgpICYgMHhmZjsKKyAgICBvdXRidWZbM10gPSAgcgkgICYgMHhmZjsKKyAgICBvdXRidWZbNF0gPSAobCA+PiAyNCkgJiAweGZmOworICAgIG91dGJ1Zls1XSA9IChsID4+IDE2KSAmIDB4ZmY7CisgICAgb3V0YnVmWzZdID0gKGwgPj4gIDgpICYgMHhmZjsKKyAgICBvdXRidWZbN10gPSAgbAkgICYgMHhmZjsKK30KKworc3RhdGljIHZvaWQKK2VuY3J5cHRfYmxvY2sgKHZvaWQgKmNvbnRleHQgLCBieXRlICpvdXRidWYsIGNvbnN0IGJ5dGUgKmluYnVmKQoreworICBDQVNUNV9jb250ZXh0ICpjID0gKENBU1Q1X2NvbnRleHQgKikgY29udGV4dDsKKyAgZG9fZW5jcnlwdF9ibG9jayAoYywgb3V0YnVmLCBpbmJ1Zik7CisgIF9nY3J5X2J1cm5fc3RhY2sgKDIwKzQqc2l6ZW9mKHZvaWQqKSk7Cit9CisKKworc3RhdGljIHZvaWQKK2RvX2RlY3J5cHRfYmxvY2sgKENBU1Q1X2NvbnRleHQgKmMsIGJ5dGUgKm91dGJ1ZiwgY29uc3QgYnl0ZSAqaW5idWYgKQoreworICAgIHUzMiBsLCByLCB0OworICAgIHUzMiBJOworICAgIHUzMiAqS207CisgICAgYnl0ZSAqS3I7CisKKyAgICBLbSA9IGMtPkttOworICAgIEtyID0gYy0+S3I7CisKKyAgICBsID0gaW5idWZbMF0gPDwgMjQgfCBpbmJ1ZlsxXSA8PCAxNiB8IGluYnVmWzJdIDw8IDggfCBpbmJ1ZlszXTsKKyAgICByID0gaW5idWZbNF0gPDwgMjQgfCBpbmJ1Zls1XSA8PCAxNiB8IGluYnVmWzZdIDw8IDggfCBpbmJ1Zls3XTsKKworICAgIHQgPSBsOyBsID0gcjsgciA9IHQgXiBGMShyLCBLbVsxNV0sIEtyWzE1XSk7CisgICAgdCA9IGw7IGwgPSByOyByID0gdCBeIEYzKHIsIEttWzE0XSwgS3JbMTRdKTsKKyAgICB0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjIociwgS21bMTNdLCBLclsxM10pOworICAgIHQgPSBsOyBsID0gcjsgciA9IHQgXiBGMShyLCBLbVsxMl0sIEtyWzEyXSk7CisgICAgdCA9IGw7IGwgPSByOyByID0gdCBeIEYzKHIsIEttWzExXSwgS3JbMTFdKTsKKyAgICB0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjIociwgS21bMTBdLCBLclsxMF0pOworICAgIHQgPSBsOyBsID0gcjsgciA9IHQgXiBGMShyLCBLbVsgOV0sIEtyWyA5XSk7CisgICAgdCA9IGw7IGwgPSByOyByID0gdCBeIEYzKHIsIEttWyA4XSwgS3JbIDhdKTsKKyAgICB0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjIociwgS21bIDddLCBLclsgN10pOworICAgIHQgPSBsOyBsID0gcjsgciA9IHQgXiBGMShyLCBLbVsgNl0sIEtyWyA2XSk7CisgICAgdCA9IGw7IGwgPSByOyByID0gdCBeIEYzKHIsIEttWyA1XSwgS3JbIDVdKTsKKyAgICB0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjIociwgS21bIDRdLCBLclsgNF0pOworICAgIHQgPSBsOyBsID0gcjsgciA9IHQgXiBGMShyLCBLbVsgM10sIEtyWyAzXSk7CisgICAgdCA9IGw7IGwgPSByOyByID0gdCBeIEYzKHIsIEttWyAyXSwgS3JbIDJdKTsKKyAgICB0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjIociwgS21bIDFdLCBLclsgMV0pOworICAgIHQgPSBsOyBsID0gcjsgciA9IHQgXiBGMShyLCBLbVsgMF0sIEtyWyAwXSk7CisKKyAgICBvdXRidWZbMF0gPSAociA+PiAyNCkgJiAweGZmOworICAgIG91dGJ1ZlsxXSA9IChyID4+IDE2KSAmIDB4ZmY7CisgICAgb3V0YnVmWzJdID0gKHIgPj4gIDgpICYgMHhmZjsKKyAgICBvdXRidWZbM10gPSAgcgkgICYgMHhmZjsKKyAgICBvdXRidWZbNF0gPSAobCA+PiAyNCkgJiAweGZmOworICAgIG91dGJ1Zls1XSA9IChsID4+IDE2KSAmIDB4ZmY7CisgICAgb3V0YnVmWzZdID0gKGwgPj4gIDgpICYgMHhmZjsKKyAgICBvdXRidWZbN10gPSAgbAkgICYgMHhmZjsKK30KKworc3RhdGljIHZvaWQKK2RlY3J5cHRfYmxvY2sgKHZvaWQgKmNvbnRleHQsIGJ5dGUgKm91dGJ1ZiwgY29uc3QgYnl0ZSAqaW5idWYpCit7CisgIENBU1Q1X2NvbnRleHQgKmMgPSAoQ0FTVDVfY29udGV4dCAqKSBjb250ZXh0OworICBkb19kZWNyeXB0X2Jsb2NrIChjLCBvdXRidWYsIGluYnVmKTsKKyAgX2djcnlfYnVybl9zdGFjayAoMjArNCpzaXplb2Yodm9pZCopKTsKK30KKworCitzdGF0aWMgY29uc3QgY2hhcioKK3NlbGZ0ZXN0KHZvaWQpCit7CisgICAgQ0FTVDVfY29udGV4dCBjOworICAgIGJ5dGUga2V5WzE2XSAgPSB7IDB4MDEsIDB4MjMsIDB4NDUsIDB4NjcsIDB4MTIsIDB4MzQsIDB4NTYsIDB4NzgsCisJCSAgICAgIDB4MjMsIDB4NDUsIDB4NjcsIDB4ODksIDB4MzQsIDB4NTYsIDB4NzgsIDB4OUEgIH07CisgICAgYnl0ZSBwbGFpbls4XSA9IHsgMHgwMSwgMHgyMywgMHg0NSwgMHg2NywgMHg4OSwgMHhBQiwgMHhDRCwgMHhFRiB9OworICAgIGJ5dGUgY2lwaGVyWzhdPSB7IDB4MjMsIDB4OEIsIDB4NEYsIDB4RTUsIDB4ODQsIDB4N0UsIDB4NDQsIDB4QjIgfTsKKyAgICBieXRlIGJ1ZmZlcls4XTsKKworICAgIGNhc3Rfc2V0a2V5KCAmYywga2V5LCAxNiApOworICAgIGVuY3J5cHRfYmxvY2soICZjLCBidWZmZXIsIHBsYWluICk7CisgICAgaWYoIG1lbWNtcCggYnVmZmVyLCBjaXBoZXIsIDggKSApCisJcmV0dXJuICIxIjsKKyAgICBkZWNyeXB0X2Jsb2NrKCAmYywgYnVmZmVyLCBidWZmZXIgKTsKKyAgICBpZiggbWVtY21wKCBidWZmZXIsIHBsYWluLCA4ICkgKQorCXJldHVybiAiMiI7CisKKyNpZiAwIC8qIGZ1bGwgbWFpbnRlbmFuY2UgdGVzdCAqLworICAgIHsKKwlpbnQgaTsKKwlieXRlIGEwWzE2XSA9IHsgMHgwMSwweDIzLDB4NDUsMHg2NywweDEyLDB4MzQsMHg1NiwweDc4LAorCQkJMHgyMywweDQ1LDB4NjcsMHg4OSwweDM0LDB4NTYsMHg3OCwweDlBIH07CisJYnl0ZSBiMFsxNl0gPSB7IDB4MDEsMHgyMywweDQ1LDB4NjcsMHgxMiwweDM0LDB4NTYsMHg3OCwKKwkJCTB4MjMsMHg0NSwweDY3LDB4ODksMHgzNCwweDU2LDB4NzgsMHg5QSB9OworCWJ5dGUgYTFbMTZdID0geyAweEVFLDB4QTksMHhEMCwweEEyLDB4NDksMHhGRCwweDNCLDB4QTYsCisJCQkweEIzLDB4NDMsMHg2RiwweEI4LDB4OUQsMHg2RCwweENBLDB4OTIgfTsKKwlieXRlIGIxWzE2XSA9IHsgMHhCMiwweEM5LDB4NUUsMHhCMCwweDBDLDB4MzEsMHhBRCwweDcxLAorCQkJMHg4MCwweEFDLDB4MDUsMHhCOCwweEU4LDB4M0QsMHg2OSwweDZFIH07CisKKwlmb3IoaT0wOyBpIDwgMTAwMDAwMDsgaSsrICkgeworCSAgICBjYXN0X3NldGtleSggJmMsIGIwLCAxNiApOworCSAgICBlbmNyeXB0X2Jsb2NrKCAmYywgYTAsIGEwICk7CisJICAgIGVuY3J5cHRfYmxvY2soICZjLCBhMCs4LCBhMCs4ICk7CisJICAgIGNhc3Rfc2V0a2V5KCAmYywgYTAsIDE2ICk7CisJICAgIGVuY3J5cHRfYmxvY2soICZjLCBiMCwgYjAgKTsKKwkgICAgZW5jcnlwdF9ibG9jayggJmMsIGIwKzgsIGIwKzggKTsKKwl9CisJaWYoIG1lbWNtcCggYTAsIGExLCAxNiApIHx8IG1lbWNtcCggYjAsIGIxLCAxNiApICkKKwkgICAgcmV0dXJuICIzIjsKKworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBOVUxMOworfQorCisKK3N0YXRpYyB2b2lkCitrZXlfc2NoZWR1bGUoIHUzMiAqeCwgdTMyICp6LCB1MzIgKmsgKQoreworCisjZGVmaW5lIHhpKGkpICAgKCh4WyhpKS80XSA+PiAoOCooMy0oKGkpJTQpKSkpICYgMHhmZikKKyNkZWZpbmUgemkoaSkgICAoKHpbKGkpLzRdID4+ICg4KigzLSgoaSklNCkpKSkgJiAweGZmKQorCisgICAgelswXSA9IHhbMF0gXiBzNVt4aSgxMyldXnM2W3hpKDE1KV1eczdbeGkoMTIpXV5zOFt4aSgxNCldXnM3W3hpKCA4KV07CisgICAgelsxXSA9IHhbMl0gXiBzNVt6aSggMCldXnM2W3ppKCAyKV1eczdbemkoIDEpXV5zOFt6aSggMyldXnM4W3hpKDEwKV07CisgICAgelsyXSA9IHhbM10gXiBzNVt6aSggNyldXnM2W3ppKCA2KV1eczdbemkoIDUpXV5zOFt6aSggNCldXnM1W3hpKCA5KV07CisgICAgelszXSA9IHhbMV0gXiBzNVt6aSgxMCldXnM2W3ppKCA5KV1eczdbemkoMTEpXV5zOFt6aSggOCldXnM2W3hpKDExKV07CisgICAga1swXSA9IHM1W3ppKCA4KV1eczZbemkoIDkpXV5zN1t6aSggNyldXnM4W3ppKCA2KV1eczVbemkoIDIpXTsKKyAgICBrWzFdID0gczVbemkoMTApXV5zNlt6aSgxMSldXnM3W3ppKCA1KV1eczhbemkoIDQpXV5zNlt6aSggNildOworICAgIGtbMl0gPSBzNVt6aSgxMildXnM2W3ppKDEzKV1eczdbemkoIDMpXV5zOFt6aSggMildXnM3W3ppKCA5KV07CisgICAga1szXSA9IHM1W3ppKDE0KV1eczZbemkoMTUpXV5zN1t6aSggMSldXnM4W3ppKCAwKV1eczhbemkoMTIpXTsKKworICAgIHhbMF0gPSB6WzJdIF4gczVbemkoIDUpXV5zNlt6aSggNyldXnM3W3ppKCA0KV1eczhbemkoIDYpXV5zN1t6aSggMCldOworICAgIHhbMV0gPSB6WzBdIF4gczVbeGkoIDApXV5zNlt4aSggMildXnM3W3hpKCAxKV1eczhbeGkoIDMpXV5zOFt6aSggMildOworICAgIHhbMl0gPSB6WzFdIF4gczVbeGkoIDcpXV5zNlt4aSggNildXnM3W3hpKCA1KV1eczhbeGkoIDQpXV5zNVt6aSggMSldOworICAgIHhbM10gPSB6WzNdIF4gczVbeGkoMTApXV5zNlt4aSggOSldXnM3W3hpKDExKV1eczhbeGkoIDgpXV5zNlt6aSggMyldOworICAgIGtbNF0gPSBzNVt4aSggMyldXnM2W3hpKCAyKV1eczdbeGkoMTIpXV5zOFt4aSgxMyldXnM1W3hpKCA4KV07CisgICAga1s1XSA9IHM1W3hpKCAxKV1eczZbeGkoIDApXV5zN1t4aSgxNCldXnM4W3hpKDE1KV1eczZbeGkoMTMpXTsKKyAgICBrWzZdID0gczVbeGkoIDcpXV5zNlt4aSggNildXnM3W3hpKCA4KV1eczhbeGkoIDkpXV5zN1t4aSggMyldOworICAgIGtbN10gPSBzNVt4aSggNSldXnM2W3hpKCA0KV1eczdbeGkoMTApXV5zOFt4aSgxMSldXnM4W3hpKCA3KV07CisKKyAgICB6WzBdID0geFswXSBeIHM1W3hpKDEzKV1eczZbeGkoMTUpXV5zN1t4aSgxMildXnM4W3hpKDE0KV1eczdbeGkoIDgpXTsKKyAgICB6WzFdID0geFsyXSBeIHM1W3ppKCAwKV1eczZbemkoIDIpXV5zN1t6aSggMSldXnM4W3ppKCAzKV1eczhbeGkoMTApXTsKKyAgICB6WzJdID0geFszXSBeIHM1W3ppKCA3KV1eczZbemkoIDYpXV5zN1t6aSggNSldXnM4W3ppKCA0KV1eczVbeGkoIDkpXTsKKyAgICB6WzNdID0geFsxXSBeIHM1W3ppKDEwKV1eczZbemkoIDkpXV5zN1t6aSgxMSldXnM4W3ppKCA4KV1eczZbeGkoMTEpXTsKKyAgICBrWzhdID0gczVbemkoIDMpXV5zNlt6aSggMildXnM3W3ppKDEyKV1eczhbemkoMTMpXV5zNVt6aSggOSldOworICAgIGtbOV0gPSBzNVt6aSggMSldXnM2W3ppKCAwKV1eczdbemkoMTQpXV5zOFt6aSgxNSldXnM2W3ppKDEyKV07CisgICAga1sxMF09IHM1W3ppKCA3KV1eczZbemkoIDYpXV5zN1t6aSggOCldXnM4W3ppKCA5KV1eczdbemkoIDIpXTsKKyAgICBrWzExXT0gczVbemkoIDUpXV5zNlt6aSggNCldXnM3W3ppKDEwKV1eczhbemkoMTEpXV5zOFt6aSggNildOworCisgICAgeFswXSA9IHpbMl0gXiBzNVt6aSggNSldXnM2W3ppKCA3KV1eczdbemkoIDQpXV5zOFt6aSggNildXnM3W3ppKCAwKV07CisgICAgeFsxXSA9IHpbMF0gXiBzNVt4aSggMCldXnM2W3hpKCAyKV1eczdbeGkoIDEpXV5zOFt4aSggMyldXnM4W3ppKCAyKV07CisgICAgeFsyXSA9IHpbMV0gXiBzNVt4aSggNyldXnM2W3hpKCA2KV1eczdbeGkoIDUpXV5zOFt4aSggNCldXnM1W3ppKCAxKV07CisgICAgeFszXSA9IHpbM10gXiBzNVt4aSgxMCldXnM2W3hpKCA5KV1eczdbeGkoMTEpXV5zOFt4aSggOCldXnM2W3ppKCAzKV07CisgICAga1sxMl09IHM1W3hpKCA4KV1eczZbeGkoIDkpXV5zN1t4aSggNyldXnM4W3hpKCA2KV1eczVbeGkoIDMpXTsKKyAgICBrWzEzXT0gczVbeGkoMTApXV5zNlt4aSgxMSldXnM3W3hpKCA1KV1eczhbeGkoIDQpXV5zNlt4aSggNyldOworICAgIGtbMTRdPSBzNVt4aSgxMildXnM2W3hpKDEzKV1eczdbeGkoIDMpXV5zOFt4aSggMildXnM3W3hpKCA4KV07CisgICAga1sxNV09IHM1W3hpKDE0KV1eczZbeGkoMTUpXV5zN1t4aSggMSldXnM4W3hpKCAwKV1eczhbeGkoMTMpXTsKKworI3VuZGVmIHhpCisjdW5kZWYgemkKK30KKworCitzdGF0aWMgZ2NyeV9lcnJfY29kZV90Citkb19jYXN0X3NldGtleSggQ0FTVDVfY29udGV4dCAqYywgY29uc3QgYnl0ZSAqa2V5LCB1bnNpZ25lZCBrZXlsZW4gKQoreworICBzdGF0aWMgaW50IGluaXRpYWxpemVkOworICBzdGF0aWMgY29uc3QgY2hhciogc2VsZnRlc3RfZmFpbGVkOworICBpbnQgaTsKKyAgdTMyIHhbNF07CisgIHUzMiB6WzRdOworICB1MzIga1sxNl07CisKKyAgaWYoICFpbml0aWFsaXplZCApIAorICAgIHsKKyAgICAgIGluaXRpYWxpemVkID0gMTsKKyAgICAgIHNlbGZ0ZXN0X2ZhaWxlZCA9IHNlbGZ0ZXN0KCk7CisgICAgICBpZiggc2VsZnRlc3RfZmFpbGVkICkKKyAgICAgICAgbG9nX2Vycm9yICgiQ0FTVDUgc2VsZnRlc3QgZmFpbGVkICglcykuXG4iLCBzZWxmdGVzdF9mYWlsZWQgKTsKKyAgICB9CisgIGlmKCBzZWxmdGVzdF9mYWlsZWQgKQorICAgIHJldHVybiBHUEdfRVJSX1NFTEZURVNUX0ZBSUxFRDsKKworICBpZigga2V5bGVuICE9IDE2ICkKKyAgICByZXR1cm4gR1BHX0VSUl9JTlZfS0VZTEVOOworCisgIHhbMF0gPSBrZXlbMF0gIDw8IDI0IHwga2V5WzFdICA8PCAxNiB8IGtleVsyXSAgPDwgOCB8IGtleVszXTsKKyAgeFsxXSA9IGtleVs0XSAgPDwgMjQgfCBrZXlbNV0gIDw8IDE2IHwga2V5WzZdICA8PCA4IHwga2V5WzddOworICB4WzJdID0ga2V5WzhdICA8PCAyNCB8IGtleVs5XSAgPDwgMTYgfCBrZXlbMTBdIDw8IDggfCBrZXlbMTFdOworICB4WzNdID0ga2V5WzEyXSA8PCAyNCB8IGtleVsxM10gPDwgMTYgfCBrZXlbMTRdIDw8IDggfCBrZXlbMTVdOworCisgIGtleV9zY2hlZHVsZSggeCwgeiwgayApOworICBmb3IoaT0wOyBpIDwgMTY7IGkrKyApCisgICAgYy0+S21baV0gPSBrW2ldOworICBrZXlfc2NoZWR1bGUoIHgsIHosIGsgKTsKKyAgZm9yKGk9MDsgaSA8IDE2OyBpKysgKQorICAgIGMtPktyW2ldID0ga1tpXSAmIDB4MWY7CisKKyAgbWVtc2V0KCZ4LDAsIHNpemVvZiB4KTsKKyAgbWVtc2V0KCZ6LDAsIHNpemVvZiB6KTsKKyAgbWVtc2V0KCZrLDAsIHNpemVvZiBrKTsKKworI3VuZGVmIHhpCisjdW5kZWYgemkKKyAgcmV0dXJuIEdQR19FUlJfTk9fRVJST1I7Cit9CisKK3N0YXRpYyBnY3J5X2Vycl9jb2RlX3QKK2Nhc3Rfc2V0a2V5ICh2b2lkICpjb250ZXh0LCBjb25zdCBieXRlICprZXksIHVuc2lnbmVkIGtleWxlbiApCit7CisgIENBU1Q1X2NvbnRleHQgKmMgPSAoQ0FTVDVfY29udGV4dCAqKSBjb250ZXh0OworICBnY3J5X2Vycl9jb2RlX3QgcmMgPSBkb19jYXN0X3NldGtleSAoYywga2V5LCBrZXlsZW4pOworICBfZ2NyeV9idXJuX3N0YWNrICg5Nis3KnNpemVvZih2b2lkKikpOworICByZXR1cm4gcmM7Cit9CisKKworZ2NyeV9jaXBoZXJfc3BlY190IF9nY3J5X2NpcGhlcl9zcGVjX2Nhc3Q1ID0KKyAgeworICAgICJDQVNUNSIsIE5VTEwsIE5VTEwsIENBU1Q1X0JMT0NLU0laRSwgMTI4LCBzaXplb2YgKENBU1Q1X2NvbnRleHQpLAorICAgIGNhc3Rfc2V0a2V5LCBlbmNyeXB0X2Jsb2NrLCBkZWNyeXB0X2Jsb2NrCisgIH07CmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvY2lwaGVyL2NpcGhlci5jIGIvbGliZ2NyeXB0LTEuNC42L2NpcGhlci9jaXBoZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2ZlNTRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L2NpcGhlci9jaXBoZXIuYwpAQCAtMCwwICsxLDIxMzMgQEAKKy8qIGNpcGhlci5jICAtCWNpcGhlciBkaXNwYXRjaGVyCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMKKyAqICAgICAgICAgICAgICAgMjAwNSwgMjAwNywgMjAwOCwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBnZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgImcxMGxpYi5oIgorI2luY2x1ZGUgImNpcGhlci5oIgorI2luY2x1ZGUgImF0aC5oIgorCisjZGVmaW5lIE1BWF9CTE9DS1NJWkUgMTYKKyNkZWZpbmUgVEFCTEVfU0laRSAxNAorI2RlZmluZSBDVFhfTUFHSUNfTk9STUFMIDB4MjQwOTE5NjQKKyNkZWZpbmUgQ1RYX01BR0lDX1NFQ1VSRSAweDQ2OTE5MDQyCisKKyN1bmRlZiBORUVEXzE2QllURV9BTElHTkVEX0NPTlRFWFQKKyNpZiBkZWZpbmVkIChfX2kzODZfXykgJiYgU0laRU9GX1VOU0lHTkVEX0xPTkcgPT0gNCAmJiBkZWZpbmVkIChfX0dOVUNfXykKKyNkZWZpbmUgTkVFRF8xNkJZVEVfQUxJR05FRF9DT05URVhUIDEKKyNlbmRpZgorCisvKiBBIGR1bW15IGV4dHJhc3BlYyBzbyB0aGF0IHdlIGRvIG5vdCBuZWVkIHRvIHRlc3RzIHRoZSBleHRyYXNwZWMKKyAgIGZpZWxkIGZyb20gdGhlIG1vZHVsZSBzcGVjaWZpY2F0aW9uIGFnYWluc3QgTlVMTCBhbmQgaW5zdGVhZAorICAgZGlyZWN0bHkgdGVzdCB0aGUgcmVzcGVjdGl2ZSBmaWVsZHMgb2YgZXh0cmFzcGVjcy4gICovCitzdGF0aWMgY2lwaGVyX2V4dHJhX3NwZWNfdCBkdW1teV9leHRyYV9zcGVjOworCisvKiBUaGlzIGlzIHRoZSBsaXN0IG9mIHRoZSBkZWZhdWx0IGNpcGhlcnMsIHdoaWNoIGFyZSBpbmNsdWRlZCBpbgorICAgbGliZ2NyeXB0LiAgKi8KK3N0YXRpYyBzdHJ1Y3QgY2lwaGVyX3RhYmxlX2VudHJ5Cit7CisgIGdjcnlfY2lwaGVyX3NwZWNfdCAqY2lwaGVyOworICBjaXBoZXJfZXh0cmFfc3BlY190ICpleHRyYXNwZWM7CisgIHVuc2lnbmVkIGludCBhbGdvcml0aG07CisgIGludCBmaXBzX2FsbG93ZWQ7Cit9IGNpcGhlcl90YWJsZVtdID0KKyAgeworI2lmIFVTRV9CTE9XRklTSAorICAgIHsgJl9nY3J5X2NpcGhlcl9zcGVjX2Jsb3dmaXNoLAorICAgICAgJmR1bW15X2V4dHJhX3NwZWMsICAgICAgICAgICAgICAgICAgR0NSWV9DSVBIRVJfQkxPV0ZJU0ggfSwKKyNlbmRpZgorI2lmIFVTRV9ERVMKKyAgICB7ICZfZ2NyeV9jaXBoZXJfc3BlY19kZXMsICAgICAgIAorICAgICAgJmR1bW15X2V4dHJhX3NwZWMsICAgICAgICAgICAgICAgICAgR0NSWV9DSVBIRVJfREVTIH0sCisgICAgeyAmX2djcnlfY2lwaGVyX3NwZWNfdHJpcGxlZGVzLAorICAgICAgJl9nY3J5X2NpcGhlcl9leHRyYXNwZWNfdHJpcGxlZGVzLCAgR0NSWV9DSVBIRVJfM0RFUywgMSB9LAorI2VuZGlmCisjaWYgVVNFX0FSQ0ZPVVIKKyAgICB7ICZfZ2NyeV9jaXBoZXJfc3BlY19hcmNmb3VyLCAgICAKKyAgICAgICZkdW1teV9leHRyYV9zcGVjLCAgICAgICAgICAgICAgICAgIEdDUllfQ0lQSEVSX0FSQ0ZPVVIgfSwKKyNlbmRpZgorI2lmIFVTRV9DQVNUNQorICAgIHsgJl9nY3J5X2NpcGhlcl9zcGVjX2Nhc3Q1LCAgICAgIAorICAgICAgJmR1bW15X2V4dHJhX3NwZWMsICAgICAgICAgICAgICAgICAgR0NSWV9DSVBIRVJfQ0FTVDUgfSwKKyNlbmRpZgorI2lmIFVTRV9BRVMKKyAgICB7ICZfZ2NyeV9jaXBoZXJfc3BlY19hZXMsICAgICAgICAKKyAgICAgICZfZ2NyeV9jaXBoZXJfZXh0cmFzcGVjX2FlcywgICAgICAgIEdDUllfQ0lQSEVSX0FFUywgICAgMSB9LAorICAgIHsgJl9nY3J5X2NpcGhlcl9zcGVjX2FlczE5MiwgICAgIAorICAgICAgJl9nY3J5X2NpcGhlcl9leHRyYXNwZWNfYWVzMTkyLCAgICAgR0NSWV9DSVBIRVJfQUVTMTkyLCAxIH0sCisgICAgeyAmX2djcnlfY2lwaGVyX3NwZWNfYWVzMjU2LCAgICAgCisgICAgICAmX2djcnlfY2lwaGVyX2V4dHJhc3BlY19hZXMyNTYsICAgICBHQ1JZX0NJUEhFUl9BRVMyNTYsIDEgfSwKKyNlbmRpZgorI2lmIFVTRV9UV09GSVNICisgICAgeyAmX2djcnlfY2lwaGVyX3NwZWNfdHdvZmlzaCwKKyAgICAgICZkdW1teV9leHRyYV9zcGVjLCAgICAgICAgICAgICAgICAgIEdDUllfQ0lQSEVSX1RXT0ZJU0ggfSwKKyAgICB7ICZfZ2NyeV9jaXBoZXJfc3BlY190d29maXNoMTI4LCAgICAgCisgICAgICAmZHVtbXlfZXh0cmFfc3BlYywgICAgICAgICAgICAgICAgICBHQ1JZX0NJUEhFUl9UV09GSVNIMTI4IH0sCisjZW5kaWYKKyNpZiBVU0VfU0VSUEVOVAorICAgIHsgJl9nY3J5X2NpcGhlcl9zcGVjX3NlcnBlbnQxMjgsIAorICAgICAgJmR1bW15X2V4dHJhX3NwZWMsICAgICAgICAgICAgICAgICAgR0NSWV9DSVBIRVJfU0VSUEVOVDEyOCB9LAorICAgIHsgJl9nY3J5X2NpcGhlcl9zcGVjX3NlcnBlbnQxOTIsCisgICAgICAmZHVtbXlfZXh0cmFfc3BlYywgICAgICAgICAgICAgICAgICBHQ1JZX0NJUEhFUl9TRVJQRU5UMTkyIH0sCisgICAgeyAmX2djcnlfY2lwaGVyX3NwZWNfc2VycGVudDI1NiwgCisgICAgICAmZHVtbXlfZXh0cmFfc3BlYywgICAgICAgICAgICAgICAgICBHQ1JZX0NJUEhFUl9TRVJQRU5UMjU2IH0sCisjZW5kaWYKKyNpZiBVU0VfUkZDMjI2OAorICAgIHsgJl9nY3J5X2NpcGhlcl9zcGVjX3JmYzIyNjhfNDAsCisgICAgICAmZHVtbXlfZXh0cmFfc3BlYywgICAgICAgICAgICAgICAgICBHQ1JZX0NJUEhFUl9SRkMyMjY4XzQwIH0sCisjZW5kaWYKKyNpZiBVU0VfU0VFRAorICAgIHsgJl9nY3J5X2NpcGhlcl9zcGVjX3NlZWQsIAorICAgICAgJmR1bW15X2V4dHJhX3NwZWMsICAgICAgICAgICAgICAgICAgR0NSWV9DSVBIRVJfU0VFRCB9LAorI2VuZGlmCisjaWYgVVNFX0NBTUVMTElBCisgICAgeyAmX2djcnlfY2lwaGVyX3NwZWNfY2FtZWxsaWExMjgsCisgICAgICAmZHVtbXlfZXh0cmFfc3BlYywgICAgICAgICAgICAgICAgICBHQ1JZX0NJUEhFUl9DQU1FTExJQTEyOCB9LAorICAgIHsgJl9nY3J5X2NpcGhlcl9zcGVjX2NhbWVsbGlhMTkyLCAKKyAgICAgICZkdW1teV9leHRyYV9zcGVjLCAgICAgICAgICAgICAgICAgIEdDUllfQ0lQSEVSX0NBTUVMTElBMTkyIH0sCisgICAgeyAmX2djcnlfY2lwaGVyX3NwZWNfY2FtZWxsaWEyNTYsCisgICAgICAmZHVtbXlfZXh0cmFfc3BlYywgICAgICAgICAgICAgICAgICBHQ1JZX0NJUEhFUl9DQU1FTExJQTI1NiB9LAorI2VuZGlmCisgICAgeyBOVUxMICAgICAgICAgICAgICAgICAgICB9CisgIH07CisKKy8qIExpc3Qgb2YgcmVnaXN0ZXJlZCBjaXBoZXJzLiAgKi8KK3N0YXRpYyBnY3J5X21vZHVsZV90IGNpcGhlcnNfcmVnaXN0ZXJlZDsKKworLyogVGhpcyBpcyB0aGUgbG9jayBwcm90ZWN0aW5nIENJUEhFUlNfUkVHSVNURVJFRC4gICovCitzdGF0aWMgYXRoX211dGV4X3QgY2lwaGVyc19yZWdpc3RlcmVkX2xvY2sgPSBBVEhfTVVURVhfSU5JVElBTElaRVI7CisKKy8qIEZsYWcgdG8gY2hlY2sgd2V0aGVyIHRoZSBkZWZhdWx0IGNpcGhlcnMgaGF2ZSBhbHJlYWR5IGJlZW4KKyAgIHJlZ2lzdGVyZWQuICAqLworc3RhdGljIGludCBkZWZhdWx0X2NpcGhlcnNfcmVnaXN0ZXJlZDsKKworLyogQ29udmVuaWVudCBtYWNybyBmb3IgcmVnaXN0ZXJpbmcgdGhlIGRlZmF1bHQgY2lwaGVycy4gICovCisjZGVmaW5lIFJFR0lTVEVSX0RFRkFVTFRfQ0lQSEVSUyAgICAgICAgICAgICAgICAgICBcCisgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBhdGhfbXV0ZXhfbG9jayAoJmNpcGhlcnNfcmVnaXN0ZXJlZF9sb2NrKTsgICBcCisgICAgICBpZiAoISBkZWZhdWx0X2NpcGhlcnNfcmVnaXN0ZXJlZCkgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgY2lwaGVyX3JlZ2lzdGVyX2RlZmF1bHQgKCk7ICAgICAgICAgICAgICBcCisgICAgICAgICAgZGVmYXVsdF9jaXBoZXJzX3JlZ2lzdGVyZWQgPSAxOyAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBhdGhfbXV0ZXhfdW5sb2NrICgmY2lwaGVyc19yZWdpc3RlcmVkX2xvY2spOyBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHdoaWxlICgwKQorCisKKy8qIEEgVklBIHByb2Nlc3NvciB3aXRoIHRoZSBQYWRsb2NrIGVuZ2luZSByZXF1aXJlcyBhbiBhbGlnbm1lbnQgb2YKKyAgIG1vc3QgZGF0YSBvbiBhIDE2IGJ5dGUgYm91bmRhcnkuICBCZWNhdXNlIHdlIHRyaWNrIG91dCB0aGUgY29tcGlsZXIKKyAgIHdoaWxlIGFsbG9jYXRpbmcgdGhlIGNvbnRleHQsIHRoZSBhbGlnbiBhdHRyaWJ1dGUgYXMgdXNlZCBpbgorICAgcmlqbmRhZWwuYyBkb2VzIG5vdCB3b3JrIG9uIGl0cyBvd24uICBUaHVzIHdlIG5lZWQgdG8gbWFrZSBzdXJlCisgICB0aGF0IHRoZSBlbnRpcmUgY29udGV4dCBzdHJ1Y3R1cmUgaXMgYSBhbGlnbmVkIG9uIHRoYXQgYm91bmRhcnkuCisgICBXZSBhY2hpZXZlIHRoaXMgYnkgZGVmaW5pbmcgYSBuZXcgdHlwZSBhbmQgdXNlIHRoYXQgaW5zdGVhZCBvZiBvdXIKKyAgIHVzdWFsIGFsaWdubWVudCB0eXBlLiAgKi8KK3R5cGVkZWYgdW5pb24gCit7CisgIFBST1BFUkxZX0FMSUdORURfVFlQRSBmb287CisjaWZkZWYgTkVFRF8xNkJZVEVfQUxJR05FRF9DT05URVhUCisgIGNoYXIgYmFyWzE2XSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoMTYpKSk7CisjZW5kaWYgIAorICBjaGFyIGNbMV07Cit9IGNpcGhlcl9jb250ZXh0X2FsaWdubWVudF90OworCisKKy8qIFRoZSBoYW5kbGUgc3RydWN0dXJlLiAgKi8KK3N0cnVjdCBnY3J5X2NpcGhlcl9oYW5kbGUKK3sKKyAgaW50IG1hZ2ljOworICBzaXplX3QgYWN0dWFsX2hhbmRsZV9zaXplOyAgICAgLyogQWxsb2NhdGVkIHNpemUgb2YgdGhpcyBoYW5kbGUuICovCisgIHNpemVfdCBoYW5kbGVfb2Zmc2V0OyAgICAgICAgICAvKiBPZmZzZXQgdG8gdGhlIG1hbGxvY2VkIGJsb2NrLiAgKi8KKyAgZ2NyeV9jaXBoZXJfc3BlY190ICpjaXBoZXI7CisgIGNpcGhlcl9leHRyYV9zcGVjX3QgKmV4dHJhc3BlYzsKKyAgZ2NyeV9tb2R1bGVfdCBtb2R1bGU7CisKKyAgLyogVGhlIGFsZ29yaXRobSBpZC4gIFRoaXMgaXMgYSBoYWNrIHJlcXVpcmVkIGJlY2F1c2UgdGhlIG1vZHVsZQorICAgICBpbnRlcmZhY2UgZG9lcyBub3QgZWFzaWx5IGFsbG93IHRvIHJldHJpZXZlIHRoaXMgdmFsdWUuICovCisgIGludCBhbGdvOyAgCisKKyAgLyogQSBzdHJ1Y3R1cmUgd2l0aCBmdW5jdGlvbiBwb2ludGVycyBmb3IgYnVsayBvcGVyYXRpb25zLiAgRHVlIHRvCisgICAgIGxpbWl0YXRpb25zIG9mIHRoZSBtb2R1bGUgc3lzdGVtICh3ZSBkb24ndCB3YW50IHRvIGNoYW5nZSB0aGUKKyAgICAgQVBJKSB3ZSBuZWVkIHRvIGtlZXAgdGhlc2UgZnVuY3Rpb24gcG9pbnRlcnMgaGVyZS4gIFRoZSBjaXBoZXIKKyAgICAgb3BlbiBmdW5jdGlvbiBpbnRpYWxpemVzIHRoZW0gYW5kIHRoZSBhY3R1YWwgZW5jcnlwdGlvbiByb3V0aW5lcworICAgICB1c2UgdGhlbSBpZiB0aGV5IGFyZSBub3QgTlVMTC4gICovCisgIHN0cnVjdCB7CisgICAgdm9pZCAoKmNmYl9lbmMpKHZvaWQgKmNvbnRleHQsIHVuc2lnbmVkIGNoYXIgKml2LCAKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqb3V0YnVmX2FyZywgY29uc3Qgdm9pZCAqaW5idWZfYXJnLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbmJsb2Nrcyk7CisgICAgdm9pZCAoKmNmYl9kZWMpKHZvaWQgKmNvbnRleHQsIHVuc2lnbmVkIGNoYXIgKml2LCAKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqb3V0YnVmX2FyZywgY29uc3Qgdm9pZCAqaW5idWZfYXJnLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbmJsb2Nrcyk7CisgICAgdm9pZCAoKmNiY19lbmMpKHZvaWQgKmNvbnRleHQsIHVuc2lnbmVkIGNoYXIgKml2LCAKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqb3V0YnVmX2FyZywgY29uc3Qgdm9pZCAqaW5idWZfYXJnLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbmJsb2NrcywgaW50IGNiY19tYWMpOworICAgIHZvaWQgKCpjYmNfZGVjKSh2b2lkICpjb250ZXh0LCB1bnNpZ25lZCBjaGFyICppdiwgCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKm91dGJ1Zl9hcmcsIGNvbnN0IHZvaWQgKmluYnVmX2FyZywKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5ibG9ja3MpOworICB9IGJ1bGs7CisKKworICBpbnQgbW9kZTsKKyAgdW5zaWduZWQgaW50IGZsYWdzOworCisgIHN0cnVjdCB7CisgICAgdW5zaWduZWQgaW50IGtleToxOyAvKiBTZXQgdG8gMSBpZiBhIGtleSBoYXMgYmVlbiBzZXQuICAqLworICAgIHVuc2lnbmVkIGludCBpdjoxOyAgLyogU2V0IHRvIDEgaWYgYSBJViBoYXMgYmVlbiBzZXQuICAqLworICB9IG1hcmtzOworCisgIC8qIFRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IuICBUbyBoZWxwIGNvZGUgb3B0aW1pemF0aW9uIHdlIG1ha2UKKyAgICAgc3VyZSB0aGF0IGl0IGlzIGFsaWduZWQgb24gYW4gdW5zaWduZWQgbG9uZyBhbmQgdTMyIGJvdW5kYXJ5LiAgKi8KKyAgdW5pb24geworICAgIHVuc2lnbmVkIGxvbmcgZHVtbXlfaXY7ICAgICAgICAgCisgICAgdTMyIGR1bW15X3UzMl9pdjsKKyAgICB1bnNpZ25lZCBjaGFyIGl2W01BWF9CTE9DS1NJWkVdOwkKKyAgfSB1X2l2OworCisgIHVuc2lnbmVkIGNoYXIgbGFzdGl2W01BWF9CTE9DS1NJWkVdOworICBpbnQgdW51c2VkOyAgLyogTnVtYmVyIG9mIHVudXNlZCBieXRlcyBpbiB0aGUgSVYuICovCisKKyAgdW5zaWduZWQgY2hhciBjdHJbTUFYX0JMT0NLU0laRV07ICAgICAvKiBGb3IgQ291bnRlciAoQ1RSKSBtb2RlLiAqLworCisKKyAgLyogV2hhdCBmb2xsb3dzIGFyZSB0d28gY29udGV4dHMgb2YgdGhlIGNpcGhlciBpbiB1c2UuICBUaGUgZmlyc3QKKyAgICAgb25lIG5lZWRzIHRvIGJlIGFsaWduZWQgd2VsbCBlbm91Z2ggZm9yIHRoZSBjaXBoZXIgb3BlcmF0aW9uCisgICAgIHdoZXJlYXMgdGhlIHNlY29uZCBvbmUgaXMgYSBjb3B5IGNyZWF0ZWQgYnkgY2lwaGVyX3NldGtleSBhbmQKKyAgICAgdXNlZCBieSBjaXBoZXJfcmVzZXQuICBUaGF0IHNlY29uZCBjb3B5IGhhcyBubyBuZWVkIGZvciBwcm9wZXIKKyAgICAgYWxpZ21lbnQgYmVjYXVzZSBpdCBpcyBvbmx5IGFjY2Vzc2VkIGJ5IG1lbWNweS4gICovCisgIGNpcGhlcl9jb250ZXh0X2FsaWdubWVudF90IGNvbnRleHQ7Cit9OworCisKKwwKKy8qIFRoZXNlIGR1bW15IGZ1bmN0aW9ucyBhcmUgdXNlZCBpbiBjYXNlIGEgY2lwaGVyIGltcGxlbWVudGF0aW9uCisgICByZWZ1c2VzIHRvIHByb3ZpZGUgaXQncyBvd24gZnVuY3Rpb25zLiAgKi8KKworc3RhdGljIGdjcnlfZXJyX2NvZGVfdAorZHVtbXlfc2V0a2V5ICh2b2lkICpjLCBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4pCit7CisgICh2b2lkKWM7IAorICAodm9pZClrZXk7CisgICh2b2lkKWtleWxlbjsKKyAgcmV0dXJuIEdQR19FUlJfTk9fRVJST1I7Cit9CisKK3N0YXRpYyB2b2lkCitkdW1teV9lbmNyeXB0X2Jsb2NrICh2b2lkICpjLAorCQkgICAgIHVuc2lnbmVkIGNoYXIgKm91dGJ1ZiwgY29uc3QgdW5zaWduZWQgY2hhciAqaW5idWYpCit7CisgICh2b2lkKWM7CisgICh2b2lkKW91dGJ1ZjsKKyAgKHZvaWQpaW5idWY7CisgIEJVRygpOworfQorCitzdGF0aWMgdm9pZAorZHVtbXlfZGVjcnlwdF9ibG9jayAodm9pZCAqYywKKwkJICAgICB1bnNpZ25lZCBjaGFyICpvdXRidWYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluYnVmKQoreworICAodm9pZCljOworICAodm9pZClvdXRidWY7CisgICh2b2lkKWluYnVmOworICBCVUcoKTsKK30KKworc3RhdGljIHZvaWQKK2R1bW15X2VuY3J5cHRfc3RyZWFtICh2b2lkICpjLAorCQkgICAgICB1bnNpZ25lZCBjaGFyICpvdXRidWYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluYnVmLAorCQkgICAgICB1bnNpZ25lZCBpbnQgbikKK3sKKyAgKHZvaWQpYzsKKyAgKHZvaWQpb3V0YnVmOworICAodm9pZClpbmJ1ZjsKKyAgKHZvaWQpbjsKKyAgQlVHKCk7Cit9CisKK3N0YXRpYyB2b2lkCitkdW1teV9kZWNyeXB0X3N0cmVhbSAodm9pZCAqYywKKwkJICAgICAgdW5zaWduZWQgY2hhciAqb3V0YnVmLCBjb25zdCB1bnNpZ25lZCBjaGFyICppbmJ1ZiwKKwkJICAgICAgdW5zaWduZWQgaW50IG4pCit7CisgICh2b2lkKWM7CisgICh2b2lkKW91dGJ1ZjsKKyAgKHZvaWQpaW5idWY7CisgICh2b2lkKW47CisgIEJVRygpOworfQorCisMCisvKiBJbnRlcm5hbCBmdW5jdGlvbi4gIFJlZ2lzdGVyIGFsbCB0aGUgY2lwaGVycyBpbmNsdWRlZCBpbgorICAgQ0lQSEVSX1RBQkxFLiAgTm90ZSwgdGhhdCB0aGlzIGZ1bmN0aW9uIGdldHMgb25seSB1c2VkIGJ5IHRoZSBtYWNybworICAgUkVHSVNURVJfREVGQVVMVF9DSVBIRVJTIHdoaWNoIHByb3RlY3RzIGl0IHVzaW5nIGEgbXV0ZXguICovCitzdGF0aWMgdm9pZAorY2lwaGVyX3JlZ2lzdGVyX2RlZmF1bHQgKHZvaWQpCit7CisgIGdjcnlfZXJyX2NvZGVfdCBlcnIgPSBHUEdfRVJSX05PX0VSUk9SOworICBpbnQgaTsKKyAgCisgIGZvciAoaSA9IDA7ICFlcnIgJiYgY2lwaGVyX3RhYmxlW2ldLmNpcGhlcjsgaSsrKQorICAgIHsKKyAgICAgIGlmICghIGNpcGhlcl90YWJsZVtpXS5jaXBoZXItPnNldGtleSkKKwljaXBoZXJfdGFibGVbaV0uY2lwaGVyLT5zZXRrZXkgPSBkdW1teV9zZXRrZXk7CisgICAgICBpZiAoISBjaXBoZXJfdGFibGVbaV0uY2lwaGVyLT5lbmNyeXB0KQorCWNpcGhlcl90YWJsZVtpXS5jaXBoZXItPmVuY3J5cHQgPSBkdW1teV9lbmNyeXB0X2Jsb2NrOworICAgICAgaWYgKCEgY2lwaGVyX3RhYmxlW2ldLmNpcGhlci0+ZGVjcnlwdCkKKwljaXBoZXJfdGFibGVbaV0uY2lwaGVyLT5kZWNyeXB0ID0gZHVtbXlfZGVjcnlwdF9ibG9jazsKKyAgICAgIGlmICghIGNpcGhlcl90YWJsZVtpXS5jaXBoZXItPnN0ZW5jcnlwdCkKKwljaXBoZXJfdGFibGVbaV0uY2lwaGVyLT5zdGVuY3J5cHQgPSBkdW1teV9lbmNyeXB0X3N0cmVhbTsKKyAgICAgIGlmICghIGNpcGhlcl90YWJsZVtpXS5jaXBoZXItPnN0ZGVjcnlwdCkKKwljaXBoZXJfdGFibGVbaV0uY2lwaGVyLT5zdGRlY3J5cHQgPSBkdW1teV9kZWNyeXB0X3N0cmVhbTsKKworICAgICAgaWYgKCBmaXBzX21vZGUgKCkgJiYgIWNpcGhlcl90YWJsZVtpXS5maXBzX2FsbG93ZWQgKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgZXJyID0gX2djcnlfbW9kdWxlX2FkZCAoJmNpcGhlcnNfcmVnaXN0ZXJlZCwKKwkJCSAgICAgIGNpcGhlcl90YWJsZVtpXS5hbGdvcml0aG0sCisJCQkgICAgICAodm9pZCAqKSBjaXBoZXJfdGFibGVbaV0uY2lwaGVyLAorCQkJICAgICAgKHZvaWQgKikgY2lwaGVyX3RhYmxlW2ldLmV4dHJhc3BlYywKKwkJCSAgICAgIE5VTEwpOworICAgIH0KKworICBpZiAoZXJyKQorICAgIEJVRyAoKTsKK30KKworLyogSW50ZXJuYWwgY2FsbGJhY2sgZnVuY3Rpb24uICBVc2VkIHZpYSBfZ2NyeV9tb2R1bGVfbG9va3VwLiAgKi8KK3N0YXRpYyBpbnQKK2djcnlfY2lwaGVyX2xvb2t1cF9mdW5jX25hbWUgKHZvaWQgKnNwZWMsIHZvaWQgKmRhdGEpCit7CisgIGdjcnlfY2lwaGVyX3NwZWNfdCAqY2lwaGVyID0gKGdjcnlfY2lwaGVyX3NwZWNfdCAqKSBzcGVjOworICBjaGFyICpuYW1lID0gKGNoYXIgKikgZGF0YTsKKyAgY29uc3QgY2hhciAqKmFsaWFzZXMgPSBjaXBoZXItPmFsaWFzZXM7CisgIGludCBpLCByZXQgPSAhIHN0cmljbXAgKG5hbWUsIGNpcGhlci0+bmFtZSk7CisKKyAgaWYgKGFsaWFzZXMpCisgICAgZm9yIChpID0gMDsgYWxpYXNlc1tpXSAmJiAoISByZXQpOyBpKyspCisgICAgICByZXQgPSAhIHN0cmljbXAgKG5hbWUsIGFsaWFzZXNbaV0pOworCisgIHJldHVybiByZXQ7Cit9CisKKy8qIEludGVybmFsIGNhbGxiYWNrIGZ1bmN0aW9uLiAgVXNlZCB2aWEgX2djcnlfbW9kdWxlX2xvb2t1cC4gICovCitzdGF0aWMgaW50CitnY3J5X2NpcGhlcl9sb29rdXBfZnVuY19vaWQgKHZvaWQgKnNwZWMsIHZvaWQgKmRhdGEpCit7CisgIGdjcnlfY2lwaGVyX3NwZWNfdCAqY2lwaGVyID0gKGdjcnlfY2lwaGVyX3NwZWNfdCAqKSBzcGVjOworICBjaGFyICpvaWQgPSAoY2hhciAqKSBkYXRhOworICBnY3J5X2NpcGhlcl9vaWRfc3BlY190ICpvaWRfc3BlY3MgPSBjaXBoZXItPm9pZHM7CisgIGludCByZXQgPSAwLCBpOworCisgIGlmIChvaWRfc3BlY3MpCisgICAgZm9yIChpID0gMDsgb2lkX3NwZWNzW2ldLm9pZCAmJiAoISByZXQpOyBpKyspCisgICAgICBpZiAoISBzdHJpY21wIChvaWQsIG9pZF9zcGVjc1tpXS5vaWQpKQorCXJldCA9IDE7CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogSW50ZXJuYWwgZnVuY3Rpb24uICBMb29rdXAgYSBjaXBoZXIgZW50cnkgYnkgaXQncyBuYW1lLiAgKi8KK3N0YXRpYyBnY3J5X21vZHVsZV90CitnY3J5X2NpcGhlcl9sb29rdXBfbmFtZSAoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgZ2NyeV9tb2R1bGVfdCBjaXBoZXI7CisKKyAgY2lwaGVyID0gX2djcnlfbW9kdWxlX2xvb2t1cCAoY2lwaGVyc19yZWdpc3RlcmVkLCAodm9pZCAqKSBuYW1lLAorCQkJCWdjcnlfY2lwaGVyX2xvb2t1cF9mdW5jX25hbWUpOworCisgIHJldHVybiBjaXBoZXI7Cit9CisKKy8qIEludGVybmFsIGZ1bmN0aW9uLiAgTG9va3VwIGEgY2lwaGVyIGVudHJ5IGJ5IGl0J3Mgb2lkLiAgKi8KK3N0YXRpYyBnY3J5X21vZHVsZV90CitnY3J5X2NpcGhlcl9sb29rdXBfb2lkIChjb25zdCBjaGFyICpvaWQpCit7CisgIGdjcnlfbW9kdWxlX3QgY2lwaGVyOworCisgIGNpcGhlciA9IF9nY3J5X21vZHVsZV9sb29rdXAgKGNpcGhlcnNfcmVnaXN0ZXJlZCwgKHZvaWQgKikgb2lkLAorCQkJCWdjcnlfY2lwaGVyX2xvb2t1cF9mdW5jX29pZCk7CisKKyAgcmV0dXJuIGNpcGhlcjsKK30KKworLyogUmVnaXN0ZXIgYSBuZXcgY2lwaGVyIG1vZHVsZSB3aG9zZSBzcGVjaWZpY2F0aW9uIGNhbiBiZSBmb3VuZCBpbgorICAgQ0lQSEVSLiAgT24gc3VjY2VzcywgYSBuZXcgYWxnb3JpdGhtIElEIGlzIHN0b3JlZCBpbiBBTEdPUklUSE1fSUQKKyAgIGFuZCBhIHBvaW50ZXIgcmVwcmVzZW50aGluZyB0aGlzIG1vZHVsZSBpcyBzdG9yZWQgaW4gTU9EVUxFLiAgKi8KK2djcnlfZXJyb3JfdAorX2djcnlfY2lwaGVyX3JlZ2lzdGVyIChnY3J5X2NpcGhlcl9zcGVjX3QgKmNpcGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgY2lwaGVyX2V4dHJhX3NwZWNfdCAqZXh0cmFzcGVjLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmFsZ29yaXRobV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgZ2NyeV9tb2R1bGVfdCAqbW9kdWxlKQoreworICBnY3J5X2Vycl9jb2RlX3QgZXJyID0gMDsKKyAgZ2NyeV9tb2R1bGVfdCBtb2Q7CisKKyAgLyogV2UgZG8gbm90IHN1cHBvcnQgbW9kdWxlIGxvYWRpbmcgaW4gZmlwcyBtb2RlLiAgKi8KKyAgaWYgKGZpcHNfbW9kZSAoKSkKKyAgICByZXR1cm4gZ3BnX2Vycm9yIChHUEdfRVJSX05PVF9TVVBQT1JURUQpOworCisgIGF0aF9tdXRleF9sb2NrICgmY2lwaGVyc19yZWdpc3RlcmVkX2xvY2spOworICBlcnIgPSBfZ2NyeV9tb2R1bGVfYWRkICgmY2lwaGVyc19yZWdpc3RlcmVkLCAwLAorCQkJICAodm9pZCAqKWNpcGhlciwgCisJCQkgICh2b2lkICopKGV4dHJhc3BlYz8gZXh0cmFzcGVjIDogJmR1bW15X2V4dHJhX3NwZWMpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZCk7CisgIGF0aF9tdXRleF91bmxvY2sgKCZjaXBoZXJzX3JlZ2lzdGVyZWRfbG9jayk7CisKKyAgaWYgKCEgZXJyKQorICAgIHsKKyAgICAgICptb2R1bGUgPSBtb2Q7CisgICAgICAqYWxnb3JpdGhtX2lkID0gbW9kLT5tb2RfaWQ7CisgICAgfQorCisgIHJldHVybiBnY3J5X2Vycm9yIChlcnIpOworfQorCisvKiBVbnJlZ2lzdGVyIHRoZSBjaXBoZXIgaWRlbnRpZmllZCBieSBNT0RVTEUsIHdoaWNoIG11c3QgaGF2ZSBiZWVuCisgICByZWdpc3RlcmVkIHdpdGggZ2NyeV9jaXBoZXJfcmVnaXN0ZXIuICAqLwordm9pZAorZ2NyeV9jaXBoZXJfdW5yZWdpc3RlciAoZ2NyeV9tb2R1bGVfdCBtb2R1bGUpCit7CisgIGF0aF9tdXRleF9sb2NrICgmY2lwaGVyc19yZWdpc3RlcmVkX2xvY2spOworICBfZ2NyeV9tb2R1bGVfcmVsZWFzZSAobW9kdWxlKTsKKyAgYXRoX211dGV4X3VubG9jayAoJmNpcGhlcnNfcmVnaXN0ZXJlZF9sb2NrKTsKK30KKworLyogTG9jYXRlIHRoZSBPSUQgaW4gdGhlIG9pZCB0YWJsZSBhbmQgcmV0dXJuIHRoZSBpbmRleCBvciAtMSB3aGVuIG5vdAorICAgZm91bmQuICBBbiBvcGl0b25hbCAib2lkLiIgb3IgIk9JRC4iIHByZWZpeCBpbiBPSUQgaXMgaWdub3JlZCwgdGhlCisgICBPSUQgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gc3RhbmRhcmQgSUVURiBkb3R0ZWQgbm90YXRpb24uICBUaGUKKyAgIGludGVybmFsIGFsZ29yaXRobSBudW1iZXIgaXMgcmV0dXJuZWQgaW4gQUxHT1JJVEhNIHVubGVzcyBpdAorICAgaXNwYXNzZWQgYXMgTlVMTC4gIEEgcG9pbnRlciB0byB0aGUgc3BlY2lmaWNhdGlvbiBvZiB0aGUgbW9kdWxlCisgICBpbXBsZW1lbnRpbmcgdGhpcyBhbGdvcml0aG0gaXMgcmV0dXJuIGluIE9JRF9TUEVDIHVubGVzcyBwYXNzZWQgYXMKKyAgIE5VTEwuKi8KK3N0YXRpYyBpbnQgCitzZWFyY2hfb2lkIChjb25zdCBjaGFyICpvaWQsIGludCAqYWxnb3JpdGhtLCBnY3J5X2NpcGhlcl9vaWRfc3BlY190ICpvaWRfc3BlYykKK3sKKyAgZ2NyeV9tb2R1bGVfdCBtb2R1bGU7CisgIGludCByZXQgPSAwOworCisgIGlmIChvaWQgJiYgKCghIHN0cm5jbXAgKG9pZCwgIm9pZC4iLCA0KSkKKwkgICAgICB8fCAoISBzdHJuY21wIChvaWQsICJPSUQuIiwgNCkpKSkKKyAgICBvaWQgKz0gNDsKKworICBtb2R1bGUgPSBnY3J5X2NpcGhlcl9sb29rdXBfb2lkIChvaWQpOworICBpZiAobW9kdWxlKQorICAgIHsKKyAgICAgIGdjcnlfY2lwaGVyX3NwZWNfdCAqY2lwaGVyID0gbW9kdWxlLT5zcGVjOworICAgICAgaW50IGk7CisKKyAgICAgIGZvciAoaSA9IDA7IGNpcGhlci0+b2lkc1tpXS5vaWQgJiYgIXJldDsgaSsrKQorCWlmICghIHN0cmljbXAgKG9pZCwgY2lwaGVyLT5vaWRzW2ldLm9pZCkpCisJICB7CisJICAgIGlmIChhbGdvcml0aG0pCisJICAgICAgKmFsZ29yaXRobSA9IG1vZHVsZS0+bW9kX2lkOworCSAgICBpZiAob2lkX3NwZWMpCisJICAgICAgKm9pZF9zcGVjID0gY2lwaGVyLT5vaWRzW2ldOworCSAgICByZXQgPSAxOworCSAgfQorICAgICAgX2djcnlfbW9kdWxlX3JlbGVhc2UgKG1vZHVsZSk7CisgICAgfQorCisgIHJldHVybiByZXQ7Cit9CisKKy8qIE1hcCBTVFJJTkcgdG8gdGhlIGNpcGhlciBhbGdvcml0aG0gaWRlbnRpZmllci4gIFJldHVybnMgdGhlCisgICBhbGdvcml0aG0gSUQgb2YgdGhlIGNpcGhlciBmb3IgdGhlIGdpdmVuIG5hbWUgb3IgMCBpZiB0aGUgbmFtZSBpcworICAgbm90IGtub3duLiAgSXQgaXMgdmFsaWQgdG8gcGFzcyBOVUxMIGZvciBTVFJJTkcgd2hpY2ggcmVzdWx0cyBpbiBhCisgICByZXR1cm4gdmFsdWUgb2YgMC4gKi8KK2ludAorZ2NyeV9jaXBoZXJfbWFwX25hbWUgKGNvbnN0IGNoYXIgKnN0cmluZykKK3sKKyAgZ2NyeV9tb2R1bGVfdCBjaXBoZXI7CisgIGludCByZXQsIGFsZ29yaXRobSA9IDA7CisKKyAgaWYgKCEgc3RyaW5nKQorICAgIHJldHVybiAwOworCisgIFJFR0lTVEVSX0RFRkFVTFRfQ0lQSEVSUzsKKworICAvKiBJZiB0aGUgc3RyaW5nIHN0YXJ0cyB3aXRoIGEgZGlnaXQgKG9wdGlvbmFsbHkgcHJlZml4ZWQgd2l0aAorICAgICBlaXRoZXIgIk9JRC4iIG9yICJvaWQuIiksIHdlIGZpcnN0IGxvb2sgaW50byBvdXIgdGFibGUgb2YgQVNOLjEKKyAgICAgb2JqZWN0IGlkZW50aWZpZXJzIHRvIGZpZ3VyZSBvdXQgdGhlIGFsZ29yaXRobSAqLworCisgIGF0aF9tdXRleF9sb2NrICgmY2lwaGVyc19yZWdpc3RlcmVkX2xvY2spOworCisgIHJldCA9IHNlYXJjaF9vaWQgKHN0cmluZywgJmFsZ29yaXRobSwgTlVMTCk7CisgIGlmICghIHJldCkKKyAgICB7CisgICAgICBjaXBoZXIgPSBnY3J5X2NpcGhlcl9sb29rdXBfbmFtZSAoc3RyaW5nKTsKKyAgICAgIGlmIChjaXBoZXIpCisJeworCSAgYWxnb3JpdGhtID0gY2lwaGVyLT5tb2RfaWQ7CisJICBfZ2NyeV9tb2R1bGVfcmVsZWFzZSAoY2lwaGVyKTsKKwl9CisgICAgfQorCisgIGF0aF9tdXRleF91bmxvY2sgKCZjaXBoZXJzX3JlZ2lzdGVyZWRfbG9jayk7CisgIAorICByZXR1cm4gYWxnb3JpdGhtOworfQorCisKKy8qIEdpdmVuIGEgU1RSSU5HIHdpdGggYW4gT0lEIGluIGRvdHRlZCBkZWNpbWFsIG5vdGF0aW9uLCB0aGlzCisgICBmdW5jdGlvbiByZXR1cm5zIHRoZSBjaXBoZXIgbW9kZSAoR0NSWV9DSVBIRVJfTU9ERV8qKSBhc3NvY2lhdGVkCisgICB3aXRoIHRoYXQgT0lEIG9yIDAgaWYgbm8gbW9kZSBpcyBrbm93bi4gIFBhc3NpbmcgTlVMTCBmb3Igc3RyaW5nCisgICB5aWVsZHMgYSByZXR1cm4gdmFsdWUgb2YgMC4gKi8KK2ludAorZ2NyeV9jaXBoZXJfbW9kZV9mcm9tX29pZCAoY29uc3QgY2hhciAqc3RyaW5nKQoreworICBnY3J5X2NpcGhlcl9vaWRfc3BlY190IG9pZF9zcGVjOworICBpbnQgcmV0ID0gMCwgbW9kZSA9IDA7CisKKyAgaWYgKCFzdHJpbmcpCisgICAgcmV0dXJuIDA7CisKKyAgYXRoX211dGV4X2xvY2sgKCZjaXBoZXJzX3JlZ2lzdGVyZWRfbG9jayk7CisgIHJldCA9IHNlYXJjaF9vaWQgKHN0cmluZywgTlVMTCwgJm9pZF9zcGVjKTsKKyAgaWYgKHJldCkKKyAgICBtb2RlID0gb2lkX3NwZWMubW9kZTsKKyAgYXRoX211dGV4X3VubG9jayAoJmNpcGhlcnNfcmVnaXN0ZXJlZF9sb2NrKTsKKworICByZXR1cm4gbW9kZTsKK30KKworCisvKiBNYXAgdGhlIGNpcGhlciBhbGdvcml0aG0gd2hvc2UgSUQgaXMgY29udGFpbmVkIGluIEFMR09SSVRITSB0byBhCisgICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFsZ29yaXRobSBuYW1lLiAgRm9yIHVua25vd24gYWxnb3JpdGhtCisgICBJRHMgdGhpcyBmdW5jdGlvbiByZXR1cm5zICI/Ii4gICovCitzdGF0aWMgY29uc3QgY2hhciAqCitjaXBoZXJfYWxnb190b19zdHJpbmcgKGludCBhbGdvcml0aG0pCit7CisgIGdjcnlfbW9kdWxlX3QgY2lwaGVyOworICBjb25zdCBjaGFyICpuYW1lOworCisgIFJFR0lTVEVSX0RFRkFVTFRfQ0lQSEVSUzsKKworICBhdGhfbXV0ZXhfbG9jayAoJmNpcGhlcnNfcmVnaXN0ZXJlZF9sb2NrKTsKKyAgY2lwaGVyID0gX2djcnlfbW9kdWxlX2xvb2t1cF9pZCAoY2lwaGVyc19yZWdpc3RlcmVkLCBhbGdvcml0aG0pOworICBpZiAoY2lwaGVyKQorICAgIHsKKyAgICAgIG5hbWUgPSAoKGdjcnlfY2lwaGVyX3NwZWNfdCAqKSBjaXBoZXItPnNwZWMpLT5uYW1lOworICAgICAgX2djcnlfbW9kdWxlX3JlbGVhc2UgKGNpcGhlcik7CisgICAgfQorICBlbHNlCisgICAgbmFtZSA9ICI/IjsKKyAgYXRoX211dGV4X3VubG9jayAoJmNpcGhlcnNfcmVnaXN0ZXJlZF9sb2NrKTsKKworICByZXR1cm4gbmFtZTsKK30KKworLyogTWFwIHRoZSBjaXBoZXIgYWxnb3JpdGhtIGlkZW50aWZpZXIgQUxHT1JJVEhNIHRvIGEgc3RyaW5nCisgICByZXByZXNlbnRpbmcgdGhpcyBhbGdvcml0aG0uICBUaGlzIHN0cmluZyBpcyB0aGUgZGVmYXVsdCBuYW1lIGFzCisgICB1c2VkIGJ5IExpYmdjcnlwdC4gIEFuIHBvaW50ZXIgdG8gYW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGZvcgorICAgYW4gdW5rbm93biBhbGdvcml0aG0uICBOVUxMIGlzIG5ldmVyIHJldHVybmVkLiAqLworY29uc3QgY2hhciAqCitnY3J5X2NpcGhlcl9hbGdvX25hbWUgKGludCBhbGdvcml0aG0pCit7CisgIHJldHVybiBjaXBoZXJfYWxnb190b19zdHJpbmcgKGFsZ29yaXRobSk7Cit9CisKKworLyogRmxhZyB0aGUgY2lwaGVyIGFsZ29yaXRobSB3aXRoIHRoZSBpZGVudGlmaWVyIEFMR09SSVRITSBhcworICAgZGlzYWJsZWQuICBUaGVyZSBpcyBubyBlcnJvciByZXR1cm4sIHRoZSBmdW5jdGlvbiBkb2VzIG5vdGhpbmcgZm9yCisgICB1bmtub3duIGFsZ29yaXRobXMuICBEaXNhYmxlZCBhbGdvcml0aG1zIGFyZSB2aXR1YWxseSBub3QgYXZhaWxhYmxlCisgICBpbiBMaWJnY3J5cHQuICovCitzdGF0aWMgdm9pZAorZGlzYWJsZV9jaXBoZXJfYWxnbyAoaW50IGFsZ29yaXRobSkKK3sKKyAgZ2NyeV9tb2R1bGVfdCBjaXBoZXI7CisKKyAgUkVHSVNURVJfREVGQVVMVF9DSVBIRVJTOworCisgIGF0aF9tdXRleF9sb2NrICgmY2lwaGVyc19yZWdpc3RlcmVkX2xvY2spOworICBjaXBoZXIgPSBfZ2NyeV9tb2R1bGVfbG9va3VwX2lkIChjaXBoZXJzX3JlZ2lzdGVyZWQsIGFsZ29yaXRobSk7CisgIGlmIChjaXBoZXIpCisgICAgeworICAgICAgaWYgKCEgKGNpcGhlci0+ZmxhZ3MgJiBGTEFHX01PRFVMRV9ESVNBQkxFRCkpCisJY2lwaGVyLT5mbGFncyB8PSBGTEFHX01PRFVMRV9ESVNBQkxFRDsKKyAgICAgIF9nY3J5X21vZHVsZV9yZWxlYXNlIChjaXBoZXIpOworICAgIH0KKyAgYXRoX211dGV4X3VubG9jayAoJmNpcGhlcnNfcmVnaXN0ZXJlZF9sb2NrKTsKK30KKworCisvKiBSZXR1cm4gMCBpZiB0aGUgY2lwaGVyIGFsZ29yaXRobSB3aXRoIGlkZW50aWZpZXIgQUxHT1JJVEhNIGlzCisgICBhdmFpbGFibGUuIFJldHVybnMgYSBiYXNpYyBlcnJvciBjb2RlIHZhbHVlIGlmIGl0IGlzIG5vdAorICAgYXZhaWxhYmxlLiAgKi8KK3N0YXRpYyBnY3J5X2Vycl9jb2RlX3QKK2NoZWNrX2NpcGhlcl9hbGdvIChpbnQgYWxnb3JpdGhtKQoreworICBnY3J5X2Vycl9jb2RlX3QgZXJyID0gR1BHX0VSUl9OT19FUlJPUjsKKyAgZ2NyeV9tb2R1bGVfdCBjaXBoZXI7CisKKyAgUkVHSVNURVJfREVGQVVMVF9DSVBIRVJTOworCisgIGF0aF9tdXRleF9sb2NrICgmY2lwaGVyc19yZWdpc3RlcmVkX2xvY2spOworICBjaXBoZXIgPSBfZ2NyeV9tb2R1bGVfbG9va3VwX2lkIChjaXBoZXJzX3JlZ2lzdGVyZWQsIGFsZ29yaXRobSk7CisgIGlmIChjaXBoZXIpCisgICAgeworICAgICAgaWYgKGNpcGhlci0+ZmxhZ3MgJiBGTEFHX01PRFVMRV9ESVNBQkxFRCkKKwllcnIgPSBHUEdfRVJSX0NJUEhFUl9BTEdPOworICAgICAgX2djcnlfbW9kdWxlX3JlbGVhc2UgKGNpcGhlcik7CisgICAgfQorICBlbHNlCisgICAgZXJyID0gR1BHX0VSUl9DSVBIRVJfQUxHTzsKKyAgYXRoX211dGV4X3VubG9jayAoJmNpcGhlcnNfcmVnaXN0ZXJlZF9sb2NrKTsKKyAgCisgIHJldHVybiBlcnI7Cit9CisKKworLyogUmV0dXJuIHRoZSBzdGFuZGFyZCBsZW5ndGggb2YgdGhlIGtleSBmb3IgdGhlIGNpcGhlciBhbGdvcml0aG0gd2l0aAorICAgdGhlIGlkZW50aWZpZXIgQUxHT1JJVEhNLiAgVGhpcyBmdW5jdGlvbiBleHBlY3RzIGEgdmFsaWQgYWxnb3JpdGhtCisgICBhbmQgd2lsbCBhYm9ydCBpZiB0aGUgYWxnb3JpdGhtIGlzIG5vdCBhdmFpbGFibGUgb3IgdGhlIGxlbmd0aCBvZgorICAgdGhlIGtleSBpcyBub3Qga25vd24uICovCitzdGF0aWMgdW5zaWduZWQgaW50CitjaXBoZXJfZ2V0X2tleWxlbiAoaW50IGFsZ29yaXRobSkKK3sKKyAgZ2NyeV9tb2R1bGVfdCBjaXBoZXI7CisgIHVuc2lnbmVkIGxlbiA9IDA7CisKKyAgUkVHSVNURVJfREVGQVVMVF9DSVBIRVJTOworCisgIGF0aF9tdXRleF9sb2NrICgmY2lwaGVyc19yZWdpc3RlcmVkX2xvY2spOworICBjaXBoZXIgPSBfZ2NyeV9tb2R1bGVfbG9va3VwX2lkIChjaXBoZXJzX3JlZ2lzdGVyZWQsIGFsZ29yaXRobSk7CisgIGlmIChjaXBoZXIpCisgICAgeworICAgICAgbGVuID0gKChnY3J5X2NpcGhlcl9zcGVjX3QgKikgY2lwaGVyLT5zcGVjKS0+a2V5bGVuOworICAgICAgaWYgKCFsZW4pCisJbG9nX2J1ZyAoImNpcGhlciAlZCB3L28ga2V5IGxlbmd0aFxuIiwgYWxnb3JpdGhtKTsKKyAgICAgIF9nY3J5X21vZHVsZV9yZWxlYXNlIChjaXBoZXIpOworICAgIH0KKyAgZWxzZQorICAgIGxvZ19idWcgKCJjaXBoZXIgJWQgbm90IGZvdW5kXG4iLCBhbGdvcml0aG0pOworICBhdGhfbXV0ZXhfdW5sb2NrICgmY2lwaGVyc19yZWdpc3RlcmVkX2xvY2spOworCisgIHJldHVybiBsZW47Cit9CisKKy8qIFJldHVybiB0aGUgYmxvY2sgbGVuZ3RoIG9mIHRoZSBjaXBoZXIgYWxnb3JpdGhtIHdpdGggdGhlIGlkZW50aWZpZXIKKyAgIEFMR09SSVRITS4gIFRoaXMgZnVuY3Rpb24gZXhwZWN0cyBhIHZhbGlkIGFsZ29yaXRobSBhbmQgd2lsbCBhYm9ydAorICAgaWYgdGhlIGFsZ29yaXRobSBpcyBub3QgYXZhaWxhYmxlIG9yIHRoZSBsZW5ndGggb2YgdGhlIGtleSBpcyBub3QKKyAgIGtub3duLiAqLworc3RhdGljIHVuc2lnbmVkIGludAorY2lwaGVyX2dldF9ibG9ja3NpemUgKGludCBhbGdvcml0aG0pCit7CisgIGdjcnlfbW9kdWxlX3QgY2lwaGVyOworICB1bnNpZ25lZCBsZW4gPSAwOworCisgIFJFR0lTVEVSX0RFRkFVTFRfQ0lQSEVSUzsKKworICBhdGhfbXV0ZXhfbG9jayAoJmNpcGhlcnNfcmVnaXN0ZXJlZF9sb2NrKTsKKyAgY2lwaGVyID0gX2djcnlfbW9kdWxlX2xvb2t1cF9pZCAoY2lwaGVyc19yZWdpc3RlcmVkLCBhbGdvcml0aG0pOworICBpZiAoY2lwaGVyKQorICAgIHsKKyAgICAgIGxlbiA9ICgoZ2NyeV9jaXBoZXJfc3BlY190ICopIGNpcGhlci0+c3BlYyktPmJsb2Nrc2l6ZTsKKyAgICAgIGlmICghIGxlbikKKwkgIGxvZ19idWcgKCJjaXBoZXIgJWQgdy9vIGJsb2Nrc2l6ZVxuIiwgYWxnb3JpdGhtKTsKKyAgICAgIF9nY3J5X21vZHVsZV9yZWxlYXNlIChjaXBoZXIpOworICAgIH0KKyAgZWxzZQorICAgIGxvZ19idWcgKCJjaXBoZXIgJWQgbm90IGZvdW5kXG4iLCBhbGdvcml0aG0pOworICBhdGhfbXV0ZXhfdW5sb2NrICgmY2lwaGVyc19yZWdpc3RlcmVkX2xvY2spOworCisgIHJldHVybiBsZW47Cit9CisKKworLyoKKyAgIE9wZW4gYSBjaXBoZXIgaGFuZGxlIGZvciB1c2Ugd2l0aCBjaXBoZXIgYWxnb3JpdGhtIEFMR09SSVRITSwgdXNpbmcKKyAgIHRoZSBjaXBoZXIgbW9kZSBNT0RFIChvbmUgb2YgdGhlIEdDUllfQ0lQSEVSX01PREVfKikgYW5kIHJldHVybiBhCisgICBoYW5kbGUgaW4gSEFORExFLiAgUHV0IE5VTEwgaW50byBIQU5ETEUgYW5kIHJldHVybiBhbiBlcnJvciBjb2RlIGlmCisgICBzb21ldGhpbmcgZ29lcyB3cm9uZy4gIEZMQUdTIG1heSBiZSB1c2VkIHRvIG1vZGlmeSB0aGUKKyAgIG9wZXJhdGlvbi4gIFRoZSBkZWZpbmVkIGZsYWdzIGFyZToKKworICAgR0NSWV9DSVBIRVJfU0VDVVJFOiAgYWxsb2NhdGUgYWxsIGludGVybmFsIGJ1ZmZlcnMgaW4gc2VjdXJlIG1lbW9yeS4KKyAgIEdDUllfQ0lQSEVSX0VOQUJMRV9TWU5DOiAgRW5hYmxlIHRoZSBzeW5jIG9wZXJhdGlvbiBhcyB1c2VkIGluIE9wZW5QR1AuCisgICBHQ1JZX0NJUEhFUl9DQkNfQ1RTOiAgRW5hYmxlIENUUyBtb2RlLgorICAgR0NSWV9DSVBIRVJfQ0JDX01BQzogIEVuYWJsZSBNQUMgbW9kZS4KKworICAgVmFsdWVzIGZvciB0aGVzZSBmbGFncyBtYXkgYmUgY29tYmluZWQgdXNpbmcgT1IuCisgKi8KK2djcnlfZXJyb3JfdAorZ2NyeV9jaXBoZXJfb3BlbiAoZ2NyeV9jaXBoZXJfaGRfdCAqaGFuZGxlLAorCQkgIGludCBhbGdvLCBpbnQgbW9kZSwgdW5zaWduZWQgaW50IGZsYWdzKQoreworICBpbnQgc2VjdXJlID0gKGZsYWdzICYgR0NSWV9DSVBIRVJfU0VDVVJFKTsKKyAgZ2NyeV9jaXBoZXJfc3BlY190ICpjaXBoZXIgPSBOVUxMOworICBjaXBoZXJfZXh0cmFfc3BlY190ICpleHRyYXNwZWMgPSBOVUxMOworICBnY3J5X21vZHVsZV90IG1vZHVsZSA9IE5VTEw7CisgIGdjcnlfY2lwaGVyX2hkX3QgaCA9IE5VTEw7CisgIGdjcnlfZXJyX2NvZGVfdCBlcnIgPSAwOworCisgIC8qIElmIHRoZSBhcHBsaWNhdGlvbiBtaXNzZWQgdG8gY2FsbCB0aGUgcmFuZG9tIHBvbGwgZnVuY3Rpb24sIHdlIGRvCisgICAgIGl0IGhlcmUgdG8gZW5zdXJlIHRoYXQgaXQgaXMgdXNlZCBvbmNlIGluIGEgd2hpbGUuICovCisgIF9nY3J5X2Zhc3RfcmFuZG9tX3BvbGwgKCk7CisgIAorICBSRUdJU1RFUl9ERUZBVUxUX0NJUEhFUlM7CisKKyAgLyogRmV0Y2ggdGhlIGFjY29yZGluZyBtb2R1bGUgYW5kIGNoZWNrIHdldGhlciB0aGUgY2lwaGVyIGlzIG1hcmtlZAorICAgICBhdmFpbGFibGUgZm9yIHVzZS4gICovCisgIGF0aF9tdXRleF9sb2NrICgmY2lwaGVyc19yZWdpc3RlcmVkX2xvY2spOworICBtb2R1bGUgPSBfZ2NyeV9tb2R1bGVfbG9va3VwX2lkIChjaXBoZXJzX3JlZ2lzdGVyZWQsIGFsZ28pOworICBpZiAobW9kdWxlKQorICAgIHsKKyAgICAgIC8qIEZvdW5kIG1vZHVsZS4gICovCisKKyAgICAgIGlmIChtb2R1bGUtPmZsYWdzICYgRkxBR19NT0RVTEVfRElTQUJMRUQpCisJeworCSAgLyogTm90IGF2YWlsYWJsZSBmb3IgdXNlLiAgKi8KKwkgIGVyciA9IEdQR19FUlJfQ0lQSEVSX0FMR087CisJICBfZ2NyeV9tb2R1bGVfcmVsZWFzZSAobW9kdWxlKTsKKwl9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBjaXBoZXIgPSAoZ2NyeV9jaXBoZXJfc3BlY190ICopIG1vZHVsZS0+c3BlYzsKKyAgICAgICAgICBleHRyYXNwZWMgPSBtb2R1bGUtPmV4dHJhc3BlYzsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIGVyciA9IEdQR19FUlJfQ0lQSEVSX0FMR087CisgIGF0aF9tdXRleF91bmxvY2sgKCZjaXBoZXJzX3JlZ2lzdGVyZWRfbG9jayk7CisKKyAgLyogY2hlY2sgZmxhZ3MgKi8KKyAgaWYgKCghIGVycikKKyAgICAgICYmICgoZmxhZ3MgJiB+KDAgCisJCSAgICAgfCBHQ1JZX0NJUEhFUl9TRUNVUkUKKwkJICAgICB8IEdDUllfQ0lQSEVSX0VOQUJMRV9TWU5DCisJCSAgICAgfCBHQ1JZX0NJUEhFUl9DQkNfQ1RTCisJCSAgICAgfCBHQ1JZX0NJUEhFUl9DQkNfTUFDKSkKKwkgIHx8IChmbGFncyAmIEdDUllfQ0lQSEVSX0NCQ19DVFMgJiBHQ1JZX0NJUEhFUl9DQkNfTUFDKSkpCisgICAgZXJyID0gR1BHX0VSUl9DSVBIRVJfQUxHTzsKKworICAvKiBjaGVjayB0aGF0IGEgdmFsaWQgbW9kZSBoYXMgYmVlbiByZXF1ZXN0ZWQgKi8KKyAgaWYgKCEgZXJyKQorICAgIHN3aXRjaCAobW9kZSkKKyAgICAgIHsKKyAgICAgIGNhc2UgR0NSWV9DSVBIRVJfTU9ERV9FQ0I6CisgICAgICBjYXNlIEdDUllfQ0lQSEVSX01PREVfQ0JDOgorICAgICAgY2FzZSBHQ1JZX0NJUEhFUl9NT0RFX0NGQjoKKyAgICAgIGNhc2UgR0NSWV9DSVBIRVJfTU9ERV9PRkI6CisgICAgICBjYXNlIEdDUllfQ0lQSEVSX01PREVfQ1RSOgorICAgICAgY2FzZSBHQ1JZX0NJUEhFUl9NT0RFX0FFU1dSQVA6CisJaWYgKChjaXBoZXItPmVuY3J5cHQgPT0gZHVtbXlfZW5jcnlwdF9ibG9jaykKKwkgICAgfHwgKGNpcGhlci0+ZGVjcnlwdCA9PSBkdW1teV9kZWNyeXB0X2Jsb2NrKSkKKwkgIGVyciA9IEdQR19FUlJfSU5WX0NJUEhFUl9NT0RFOworCWJyZWFrOworCisgICAgICBjYXNlIEdDUllfQ0lQSEVSX01PREVfU1RSRUFNOgorCWlmICgoY2lwaGVyLT5zdGVuY3J5cHQgPT0gZHVtbXlfZW5jcnlwdF9zdHJlYW0pCisJICAgIHx8IChjaXBoZXItPnN0ZGVjcnlwdCA9PSBkdW1teV9kZWNyeXB0X3N0cmVhbSkpCisJICBlcnIgPSBHUEdfRVJSX0lOVl9DSVBIRVJfTU9ERTsKKwlicmVhazsKKworICAgICAgY2FzZSBHQ1JZX0NJUEhFUl9NT0RFX05PTkU6CisgICAgICAgIC8qIFRoaXMgbW9kZSBtYXkgYmUgdXNlZCBmb3IgZGVidWdnaW5nLiAgSXQgY29waWVzIHRoZSBtYWluCisgICAgICAgICAgIHRleHQgdmVyYmF0aW0gdG8gdGhlIGNpcGhlcnRleHQuICBXZSBkbyBub3QgYWxsb3cgdGhpcyBpbgorICAgICAgICAgICBmaXBzIG1vZGUgb3IgaWYgbm8gZGVidWcgZmxhZyBoYXMgYmVlbiBzZXQuICAqLworCWlmIChmaXBzX21vZGUgKCkgfHwgIV9nY3J5X2dldF9kZWJ1Z19mbGFnICgwKSkKKyAgICAgICAgICBlcnIgPSBHUEdfRVJSX0lOVl9DSVBIRVJfTU9ERTsKKwlicmVhazsKKworICAgICAgZGVmYXVsdDoKKwllcnIgPSBHUEdfRVJSX0lOVl9DSVBIRVJfTU9ERTsKKyAgICAgIH0KKworICAvKiBQZXJmb3JtIHNlbGZ0ZXN0IGhlcmUgYW5kIG1hcmsgdGhpcyB3aXRoIGEgZmxhZyBpbiBjaXBoZXJfdGFibGU/CisgICAgIE5vLCB3ZSBzaG91bGQgbm90IGRvIHRoaXMgYXMgaXQgdGFrZXMgdG9vIGxvbmcuICBGdXJ0aGVyIGl0IGRvZXMKKyAgICAgbm90IG1ha2Ugc2Vuc2UgdG8gZXhjbHVkZSBhbGdvcml0aG1zIHdpdGggZmFpbGluZyBzZWxmdGVzdHMgYXQKKyAgICAgcnVudGltZTogSWYgYSBzZWxmdGVzdCBmYWlscyB0aGVyZSBpcyBzb21ldGhpbmcgc2VyaW91c2x5IHdyb25nCisgICAgIHdpdGggdGhlIHN5c3RlbSBhbmQgdGh1cyB3ZSBiZXR0ZXIgZGllIGltbWVkaWF0ZWx5LiAqLworCisgIGlmICghIGVycikKKyAgICB7CisgICAgICBzaXplX3Qgc2l6ZSA9IChzaXplb2YgKCpoKQorICAgICAgICAgICAgICAgICAgICAgKyAyICogY2lwaGVyLT5jb250ZXh0c2l6ZQorICAgICAgICAgICAgICAgICAgICAgLSBzaXplb2YgKGNpcGhlcl9jb250ZXh0X2FsaWdubWVudF90KQorI2lmZGVmIE5FRURfMTZCWVRFX0FMSUdORURfQ09OVEVYVAorICAgICAgICAgICAgICAgICAgICAgKyAxNSAgLyogU3BhY2UgZm9yIGxlYWRpbmcgYWxpZ25tZW50IGdhcC4gICovCisjZW5kaWYgLypORUVEXzE2QllURV9BTElHTkVEX0NPTlRFWFQqLworICAgICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgaWYgKHNlY3VyZSkKKwloID0gZ2NyeV9jYWxsb2Nfc2VjdXJlICgxLCBzaXplKTsKKyAgICAgIGVsc2UKKwloID0gZ2NyeV9jYWxsb2MgKDEsIHNpemUpOworCisgICAgICBpZiAoISBoKQorCWVyciA9IGdwZ19lcnJfY29kZV9mcm9tX2Vycm5vIChlcnJubyk7CisgICAgICBlbHNlCisJeworICAgICAgICAgIHNpemVfdCBvZmYgPSAwOworCisjaWZkZWYgTkVFRF8xNkJZVEVfQUxJR05FRF9DT05URVhUCisgICAgICAgICAgaWYgKCAoKHVuc2lnbmVkIGxvbmcpaCAmIDB4MGYpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogVGhlIG1hbGxvY2VkIGJsb2NrIGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYgYnl0ZQorICAgICAgICAgICAgICAgICBib3VuZGFyeS4gIENvcnJlY3QgZm9yIHRoaXMuICAqLworICAgICAgICAgICAgICBvZmYgPSAxNiAtICgodW5zaWduZWQgbG9uZyloICYgMHgwZik7CisgICAgICAgICAgICAgIGggPSAodm9pZCopKChjaGFyKiloICsgb2ZmKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKk5FRURfMTZCWVRFX0FMSUdORURfQ09OVEVYVCovCisKKwkgIGgtPm1hZ2ljID0gc2VjdXJlID8gQ1RYX01BR0lDX1NFQ1VSRSA6IENUWF9NQUdJQ19OT1JNQUw7CisgICAgICAgICAgaC0+YWN0dWFsX2hhbmRsZV9zaXplID0gc2l6ZSAtIG9mZjsKKyAgICAgICAgICBoLT5oYW5kbGVfb2Zmc2V0ID0gb2ZmOworCSAgaC0+Y2lwaGVyID0gY2lwaGVyOworCSAgaC0+ZXh0cmFzcGVjID0gZXh0cmFzcGVjOworCSAgaC0+bW9kdWxlID0gbW9kdWxlOworICAgICAgICAgIGgtPmFsZ28gPSBhbGdvOworCSAgaC0+bW9kZSA9IG1vZGU7CisJICBoLT5mbGFncyA9IGZsYWdzOworCisgICAgICAgICAgLyogU2V0dXAgYnVsayBlbmNyeXB0aW9uIHJvdXRpbmVzLiAgKi8KKyAgICAgICAgICBzd2l0Y2ggKGFsZ28pCisgICAgICAgICAgICB7CisjaWZkZWYgVVNFX0FFUworICAgICAgICAgICAgY2FzZSBHQ1JZX0NJUEhFUl9BRVMxMjg6CisgICAgICAgICAgICBjYXNlIEdDUllfQ0lQSEVSX0FFUzE5MjoKKyAgICAgICAgICAgIGNhc2UgR0NSWV9DSVBIRVJfQUVTMjU2OgorICAgICAgICAgICAgICBoLT5idWxrLmNmYl9lbmMgPSBfZ2NyeV9hZXNfY2ZiX2VuYzsKKyAgICAgICAgICAgICAgaC0+YnVsay5jZmJfZGVjID0gX2djcnlfYWVzX2NmYl9kZWM7CisgICAgICAgICAgICAgIGgtPmJ1bGsuY2JjX2VuYyA9IF9nY3J5X2Flc19jYmNfZW5jOworICAgICAgICAgICAgICBoLT5idWxrLmNiY19kZWMgPSBfZ2NyeV9hZXNfY2JjX2RlYzsKKyAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLypVU0VfQUVTKi8KKyAgICAgICAgICAgICAgCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKwl9CisgICAgfQorCisgIC8qIERvbmUuICAqLworCisgIGlmIChlcnIpCisgICAgeworICAgICAgaWYgKG1vZHVsZSkKKwl7CisJICAvKiBSZWxlYXNlIG1vZHVsZS4gICovCisJICBhdGhfbXV0ZXhfbG9jayAoJmNpcGhlcnNfcmVnaXN0ZXJlZF9sb2NrKTsKKwkgIF9nY3J5X21vZHVsZV9yZWxlYXNlIChtb2R1bGUpOworCSAgYXRoX211dGV4X3VubG9jayAoJmNpcGhlcnNfcmVnaXN0ZXJlZF9sb2NrKTsKKwl9CisgICAgfQorCisgICpoYW5kbGUgPSBlcnIgPyBOVUxMIDogaDsKKworICByZXR1cm4gZ2NyeV9lcnJvciAoZXJyKTsKK30KKworCisvKiBSZWxlYXNlIGFsbCByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjaXBoZXIgaGFuZGxlIEguIEggbWF5IGJlCisgICBOVUxMIGluIHdoaWNoIGNhc2UgdGhpcyBpcyBhIG5vLW9wZXJhdGlvbi4gKi8KK3ZvaWQKK2djcnlfY2lwaGVyX2Nsb3NlIChnY3J5X2NpcGhlcl9oZF90IGgpCit7CisgIHNpemVfdCBvZmY7CisKKyAgaWYgKCFoKQorICAgIHJldHVybjsKKworICBpZiAoKGgtPm1hZ2ljICE9IENUWF9NQUdJQ19TRUNVUkUpCisgICAgICAmJiAoaC0+bWFnaWMgIT0gQ1RYX01BR0lDX05PUk1BTCkpCisgICAgX2djcnlfZmF0YWxfZXJyb3IoR1BHX0VSUl9JTlRFUk5BTCwKKwkJICAgICAgImdjcnlfY2lwaGVyX2Nsb3NlOiBhbHJlYWR5IGNsb3NlZC9pbnZhbGlkIGhhbmRsZSIpOworICBlbHNlCisgICAgaC0+bWFnaWMgPSAwOworCisgIC8qIFJlbGVhc2UgbW9kdWxlLiAgKi8KKyAgYXRoX211dGV4X2xvY2sgKCZjaXBoZXJzX3JlZ2lzdGVyZWRfbG9jayk7CisgIF9nY3J5X21vZHVsZV9yZWxlYXNlIChoLT5tb2R1bGUpOworICBhdGhfbXV0ZXhfdW5sb2NrICgmY2lwaGVyc19yZWdpc3RlcmVkX2xvY2spOworCisgIC8qIFdlIGFsd2F5cyB3YW50IHRvIHdpcGUgb3V0IHRoZSBtZW1vcnkgZXZlbiB3aGVuIHRoZSBjb250ZXh0IGhhcworICAgICBiZWVuIGFsbG9jYXRlZCBpbiBzZWN1cmUgbWVtb3J5LiAgVGhlIHVzZXIgbWlnaHQgaGF2ZSBkaXNhYmxlZAorICAgICBzZWN1cmUgbWVtb3J5IG9yIGlzIHVzaW5nIGhpcyBvd24gaW1wbGVtZW50YXRpb24gd2hpY2ggZG9lcyBub3QKKyAgICAgZG8gdGhlIHdpcGluZy4gIFRvIGFjY29tcGxpc2ggdGhpcyB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgdGhlCisgICAgIGFjdHVhbCBzaXplIG9mIHRoaXMgc3RydWN0dXJlIGJlY2F1c2Ugd2UgaGF2ZSBubyB3YXkgdG8ga25vd24KKyAgICAgaG93IGxhcmdlIHRoZSBhbGxvY2F0ZWQgYXJlYSB3YXMgd2hlbiB1c2luZyBhIHN0YW5kYXJkIG1hbGxvYy4gKi8KKyAgb2ZmID0gaC0+aGFuZGxlX29mZnNldDsKKyAgd2lwZW1lbW9yeSAoaCwgaC0+YWN0dWFsX2hhbmRsZV9zaXplKTsKKworICBnY3J5X2ZyZWUgKChjaGFyKiloIC0gb2ZmKTsKK30KKworCisvKiBTZXQgdGhlIGtleSB0byBiZSB1c2VkIGZvciB0aGUgZW5jcnlwdGlvbiBjb250ZXh0IEMgdG8gS0VZIHdpdGgKKyAgIGxlbmd0aCBLRVlMRU4uICBUaGUgbGVuZ3RoIHNob3VsZCBtYXRjaCB0aGUgcmVxdWlyZWQgbGVuZ3RoLiAqLworc3RhdGljIGdjcnlfZXJyb3JfdAorY2lwaGVyX3NldGtleSAoZ2NyeV9jaXBoZXJfaGRfdCBjLCBieXRlICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4pCit7CisgIGdjcnlfZXJyX2NvZGVfdCByZXQ7CisKKyAgcmV0ID0gKCpjLT5jaXBoZXItPnNldGtleSkgKCZjLT5jb250ZXh0LmMsIGtleSwga2V5bGVuKTsKKyAgaWYgKCFyZXQpCisgICAgeworICAgICAgLyogRHVwbGljYXRlIGluaXRpYWwgY29udGV4dC4gICovCisgICAgICBtZW1jcHkgKCh2b2lkICopICgoY2hhciAqKSAmYy0+Y29udGV4dC5jICsgYy0+Y2lwaGVyLT5jb250ZXh0c2l6ZSksCisgICAgICAgICAgICAgICh2b2lkICopICZjLT5jb250ZXh0LmMsCisgICAgICAgICAgICAgIGMtPmNpcGhlci0+Y29udGV4dHNpemUpOworICAgICAgYy0+bWFya3Mua2V5ID0gMTsKKyAgICB9CisgIGVsc2UKKyAgICBjLT5tYXJrcy5rZXkgPSAwOworCisgIHJldHVybiBnY3J5X2Vycm9yIChyZXQpOworfQorCisKKy8qIFNldCB0aGUgSVYgdG8gYmUgdXNlZCBmb3IgdGhlIGVuY3J5cHRpb24gY29udGV4dCBDIHRvIElWIHdpdGgKKyAgIGxlbmd0aCBJVkxFTi4gIFRoZSBsZW5ndGggc2hvdWxkIG1hdGNoIHRoZSByZXF1aXJlZCBsZW5ndGguICovCitzdGF0aWMgdm9pZAorY2lwaGVyX3NldGl2KCBnY3J5X2NpcGhlcl9oZF90IGMsIGNvbnN0IGJ5dGUgKml2LCB1bnNpZ25lZCBpdmxlbiApCit7CisgIG1lbXNldCAoYy0+dV9pdi5pdiwgMCwgYy0+Y2lwaGVyLT5ibG9ja3NpemUpOworICBpZiAoaXYpIAorICAgIHsKKyAgICAgIGlmIChpdmxlbiAhPSBjLT5jaXBoZXItPmJsb2Nrc2l6ZSkKKyAgICAgICAgeworICAgICAgICAgIGxvZ19pbmZvICgiV0FSTklORzogY2lwaGVyX3NldGl2OiBpdmxlbj0ldSBibGtsZW49JXVcbiIsCisgICAgICAgICAgICAgICAgICAgIGl2bGVuLCAodW5zaWduZWQgaW50KWMtPmNpcGhlci0+YmxvY2tzaXplKTsKKyAgICAgICAgICBmaXBzX3NpZ25hbF9lcnJvciAoIklWIGxlbmd0aCBkb2VzIG5vdCBtYXRjaCBibG9ja2xlbmd0aCIpOworICAgICAgICB9CisgICAgICBpZiAoaXZsZW4gPiBjLT5jaXBoZXItPmJsb2Nrc2l6ZSkKKyAgICAgICAgaXZsZW4gPSBjLT5jaXBoZXItPmJsb2Nrc2l6ZTsKKyAgICAgIG1lbWNweSAoYy0+dV9pdi5pdiwgaXYsIGl2bGVuKTsKKyAgICAgIGMtPm1hcmtzLml2ID0gMTsKKyAgICB9CisgIGVsc2UKKyAgICBjLT5tYXJrcy5pdiA9IDA7CisKKyAgYy0+dW51c2VkID0gMDsKK30KKworCisvKiBSZXNldCB0aGUgY2lwaGVyIGNvbnRleHQgdG8gdGhlIGluaXRpYWwgY29udGV4dC4gIFRoaXMgaXMgYmFzaWNhbGx5CisgICB0aGUgc2FtZSBhcyBhbiByZWxlYXNlIGZvbGxvd2VkIGJ5IGEgbmV3LiAqLworc3RhdGljIHZvaWQKK2NpcGhlcl9yZXNldCAoZ2NyeV9jaXBoZXJfaGRfdCBjKQoreworICBtZW1jcHkgKCZjLT5jb250ZXh0LmMsCisJICAoY2hhciAqKSAmYy0+Y29udGV4dC5jICsgYy0+Y2lwaGVyLT5jb250ZXh0c2l6ZSwKKwkgIGMtPmNpcGhlci0+Y29udGV4dHNpemUpOworICBtZW1zZXQgKCZjLT5tYXJrcywgMCwgc2l6ZW9mIGMtPm1hcmtzKTsKKyAgbWVtc2V0IChjLT51X2l2Lml2LCAwLCBjLT5jaXBoZXItPmJsb2Nrc2l6ZSk7CisgIG1lbXNldCAoYy0+bGFzdGl2LCAwLCBjLT5jaXBoZXItPmJsb2Nrc2l6ZSk7CisgIG1lbXNldCAoYy0+Y3RyLCAwLCBjLT5jaXBoZXItPmJsb2Nrc2l6ZSk7Cit9CisKKworc3RhdGljIHZvaWQKK2RvX2VjYl9lbmNyeXB0KCBnY3J5X2NpcGhlcl9oZF90IGMsIGJ5dGUgKm91dGJ1ZiwgY29uc3QgYnl0ZSAqaW5idWYsCisgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5ibG9ja3MgKQoreworICB1bnNpZ25lZCBpbnQgbjsKKyAgCisgIGZvciAobj0wOyBuIDwgbmJsb2NrczsgbisrICkKKyAgICB7CisgICAgICBjLT5jaXBoZXItPmVuY3J5cHQgKCAmYy0+Y29udGV4dC5jLCBvdXRidWYsIChieXRlKikvKmFyZ2dnKi9pbmJ1ZiApOworICAgICAgaW5idWYgICs9IGMtPmNpcGhlci0+YmxvY2tzaXplOworICAgICAgb3V0YnVmICs9IGMtPmNpcGhlci0+YmxvY2tzaXplOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2RvX2VjYl9kZWNyeXB0KCBnY3J5X2NpcGhlcl9oZF90IGMsIGJ5dGUgKm91dGJ1ZiwgY29uc3QgYnl0ZSAqaW5idWYsCisgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5ibG9ja3MgKQoreworICB1bnNpZ25lZCBpbnQgbjsKKworICBmb3IgKG49MDsgbiA8IG5ibG9ja3M7IG4rKyApIAorICAgIHsKKyAgICAgIGMtPmNpcGhlci0+ZGVjcnlwdCAoICZjLT5jb250ZXh0LmMsIG91dGJ1ZiwgKGJ5dGUqKS8qYXJnZ2cqL2luYnVmICk7CisgICAgICBpbmJ1ZiAgKz0gYy0+Y2lwaGVyLT5ibG9ja3NpemU7CisgICAgICBvdXRidWYgKz0gYy0+Y2lwaGVyLT5ibG9ja3NpemU7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCitkb19jYmNfZW5jcnlwdCAoZ2NyeV9jaXBoZXJfaGRfdCBjLCB1bnNpZ25lZCBjaGFyICpvdXRidWYsIAorICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluYnVmLCB1bnNpZ25lZCBpbnQgbmJ5dGVzICkKK3sKKyAgdW5zaWduZWQgaW50IG47CisgIHVuc2lnbmVkIGNoYXIgKml2cDsKKyAgaW50IGk7CisgIHNpemVfdCBibG9ja3NpemUgPSBjLT5jaXBoZXItPmJsb2Nrc2l6ZTsKKyAgdW5zaWduZWQgbmJsb2NrcyA9IG5ieXRlcyAvIGJsb2Nrc2l6ZTsKKworICBpZiAoKGMtPmZsYWdzICYgR0NSWV9DSVBIRVJfQ0JDX0NUUykgJiYgbmJ5dGVzID4gYmxvY2tzaXplKSAKKyAgICB7CisgICAgICBpZiAoKG5ieXRlcyAlIGJsb2Nrc2l6ZSkgPT0gMCkKKwluYmxvY2tzLS07CisgICAgfQorCisgIGlmIChjLT5idWxrLmNiY19lbmMpCisgICAgeworICAgICAgYy0+YnVsay5jYmNfZW5jICgmYy0+Y29udGV4dC5jLCBjLT51X2l2Lml2LCBvdXRidWYsIGluYnVmLCBuYmxvY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAoYy0+ZmxhZ3MgJiBHQ1JZX0NJUEhFUl9DQkNfTUFDKSk7IAorICAgICAgaW5idWYgICs9IG5ibG9ja3MgKiBibG9ja3NpemU7CisgICAgICBpZiAoIShjLT5mbGFncyAmIEdDUllfQ0lQSEVSX0NCQ19NQUMpKQorICAgICAgICBvdXRidWYgKz0gbmJsb2NrcyAqIGJsb2Nrc2l6ZTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmb3IgKG49MDsgbiA8IG5ibG9ja3M7IG4rKyApCisgICAgICAgIHsKKyAgICAgICAgICBmb3IgKGl2cD1jLT51X2l2Lml2LGk9MDsgaSA8IGJsb2Nrc2l6ZTsgaSsrICkKKyAgICAgICAgICAgIG91dGJ1ZltpXSA9IGluYnVmW2ldIF4gKml2cCsrOworICAgICAgICAgIGMtPmNpcGhlci0+ZW5jcnlwdCAoICZjLT5jb250ZXh0LmMsIG91dGJ1Ziwgb3V0YnVmICk7CisgICAgICAgICAgbWVtY3B5IChjLT51X2l2Lml2LCBvdXRidWYsIGJsb2Nrc2l6ZSApOworICAgICAgICAgIGluYnVmICArPSBibG9ja3NpemU7CisgICAgICAgICAgaWYgKCEoYy0+ZmxhZ3MgJiBHQ1JZX0NJUEhFUl9DQkNfTUFDKSkKKyAgICAgICAgICAgIG91dGJ1ZiArPSBibG9ja3NpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKChjLT5mbGFncyAmIEdDUllfQ0lQSEVSX0NCQ19DVFMpICYmIG5ieXRlcyA+IGJsb2Nrc2l6ZSkKKyAgICB7CisgICAgICAvKiBXZSBoYXZlIHRvIGJlIGNhcmVmdWwgaGVyZSwgc2luY2Ugb3V0YnVmIG1pZ2h0IGJlIGVxdWFsIHRvCisgICAgICAgICBpbmJ1Zi4gICovCisgICAgICBpbnQgcmVzdGJ5dGVzOworICAgICAgdW5zaWduZWQgY2hhciBiOworCisgICAgICBpZiAoKG5ieXRlcyAlIGJsb2Nrc2l6ZSkgPT0gMCkKKyAgICAgICAgcmVzdGJ5dGVzID0gYmxvY2tzaXplOworICAgICAgZWxzZQorICAgICAgICByZXN0Ynl0ZXMgPSBuYnl0ZXMgJSBibG9ja3NpemU7CisKKyAgICAgIG91dGJ1ZiAtPSBibG9ja3NpemU7CisgICAgICBmb3IgKGl2cCA9IGMtPnVfaXYuaXYsIGkgPSAwOyBpIDwgcmVzdGJ5dGVzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICBiID0gaW5idWZbaV07CisgICAgICAgICAgb3V0YnVmW2Jsb2Nrc2l6ZSArIGldID0gb3V0YnVmW2ldOworICAgICAgICAgIG91dGJ1ZltpXSA9IGIgXiAqaXZwKys7CisgICAgICAgIH0KKyAgICAgIGZvciAoOyBpIDwgYmxvY2tzaXplOyBpKyspCisgICAgICAgIG91dGJ1ZltpXSA9IDAgXiAqaXZwKys7CisgICAgICAKKyAgICAgIGMtPmNpcGhlci0+ZW5jcnlwdCAoJmMtPmNvbnRleHQuYywgb3V0YnVmLCBvdXRidWYpOworICAgICAgbWVtY3B5IChjLT51X2l2Lml2LCBvdXRidWYsIGJsb2Nrc2l6ZSk7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCitkb19jYmNfZGVjcnlwdCAoZ2NyeV9jaXBoZXJfaGRfdCBjLCB1bnNpZ25lZCBjaGFyICpvdXRidWYsIAorICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluYnVmLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworICB1bnNpZ25lZCBpbnQgbjsKKyAgdW5zaWduZWQgY2hhciAqaXZwOworICBpbnQgaTsKKyAgc2l6ZV90IGJsb2Nrc2l6ZSA9IGMtPmNpcGhlci0+YmxvY2tzaXplOworICB1bnNpZ25lZCBpbnQgbmJsb2NrcyA9IG5ieXRlcyAvIGJsb2Nrc2l6ZTsKKworICBpZiAoKGMtPmZsYWdzICYgR0NSWV9DSVBIRVJfQ0JDX0NUUykgJiYgbmJ5dGVzID4gYmxvY2tzaXplKQorICAgIHsKKyAgICAgIG5ibG9ja3MtLTsKKyAgICAgIGlmICgobmJ5dGVzICUgYmxvY2tzaXplKSA9PSAwKQorCW5ibG9ja3MtLTsKKyAgICAgIG1lbWNweSAoYy0+bGFzdGl2LCBjLT51X2l2Lml2LCBibG9ja3NpemUpOworICAgIH0KKworICBpZiAoYy0+YnVsay5jYmNfZGVjKQorICAgIHsKKyAgICAgIGMtPmJ1bGsuY2JjX2RlYyAoJmMtPmNvbnRleHQuYywgYy0+dV9pdi5pdiwgb3V0YnVmLCBpbmJ1ZiwgbmJsb2Nrcyk7IAorICAgICAgaW5idWYgICs9IG5ibG9ja3MgKiBibG9ja3NpemU7CisgICAgICBvdXRidWYgKz0gbmJsb2NrcyAqIGJsb2Nrc2l6ZTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmb3IgKG49MDsgbiA8IG5ibG9ja3M7IG4rKyApIAorICAgICAgICB7CisgICAgICAgICAgLyogQmVjYXVzZSBvdXRidWYgYW5kIGluYnVmIG1pZ2h0IGJlIHRoZSBzYW1lLCB3ZSBoYXZlIHRvCisgICAgICAgICAgICogc2F2ZSB0aGUgb3JpZ2luYWwgY2lwaGVydGV4dCBibG9jay4gIFdlIHVzZSBMQVNUSVYgZm9yCisgICAgICAgICAgICogdGhpcyBoZXJlIGJlY2F1c2UgaXQgaXMgbm90IHVzZWQgb3RoZXJ3aXNlLiAqLworICAgICAgICAgIG1lbWNweSAoYy0+bGFzdGl2LCBpbmJ1ZiwgYmxvY2tzaXplKTsKKyAgICAgICAgICBjLT5jaXBoZXItPmRlY3J5cHQgKCAmYy0+Y29udGV4dC5jLCBvdXRidWYsIGluYnVmICk7CisgICAgICAgICAgZm9yIChpdnA9Yy0+dV9pdi5pdixpPTA7IGkgPCBibG9ja3NpemU7IGkrKyApCisJICAgIG91dGJ1ZltpXSBePSAqaXZwKys7CisgICAgICAgICAgbWVtY3B5KGMtPnVfaXYuaXYsIGMtPmxhc3RpdiwgYmxvY2tzaXplICk7CisgICAgICAgICAgaW5idWYgICs9IGMtPmNpcGhlci0+YmxvY2tzaXplOworICAgICAgICAgIG91dGJ1ZiArPSBjLT5jaXBoZXItPmJsb2Nrc2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAoKGMtPmZsYWdzICYgR0NSWV9DSVBIRVJfQ0JDX0NUUykgJiYgbmJ5dGVzID4gYmxvY2tzaXplKSAKKyAgICB7CisgICAgICBpbnQgcmVzdGJ5dGVzOworICAgICAgCisgICAgICBpZiAoKG5ieXRlcyAlIGJsb2Nrc2l6ZSkgPT0gMCkKKyAgICAgICAgcmVzdGJ5dGVzID0gYmxvY2tzaXplOworICAgICAgZWxzZQorICAgICAgICByZXN0Ynl0ZXMgPSBuYnl0ZXMgJSBibG9ja3NpemU7CisgICAgICAKKyAgICAgIG1lbWNweSAoYy0+bGFzdGl2LCBjLT51X2l2Lml2LCBibG9ja3NpemUgKTsgICAgICAgICAvKiBTYXZlIENuLTIuICovCisgICAgICBtZW1jcHkgKGMtPnVfaXYuaXYsIGluYnVmICsgYmxvY2tzaXplLCByZXN0Ynl0ZXMgKTsgLyogU2F2ZSBDbi4gKi8KKworICAgICAgYy0+Y2lwaGVyLT5kZWNyeXB0ICggJmMtPmNvbnRleHQuYywgb3V0YnVmLCBpbmJ1ZiApOworICAgICAgZm9yIChpdnA9Yy0+dV9pdi5pdixpPTA7IGkgPCByZXN0Ynl0ZXM7IGkrKyApCisgICAgICAgIG91dGJ1ZltpXSBePSAqaXZwKys7CisgICAgICAKKyAgICAgIG1lbWNweShvdXRidWYgKyBibG9ja3NpemUsIG91dGJ1ZiwgcmVzdGJ5dGVzKTsKKyAgICAgIGZvcihpPXJlc3RieXRlczsgaSA8IGJsb2Nrc2l6ZTsgaSsrKQorICAgICAgICBjLT51X2l2Lml2W2ldID0gb3V0YnVmW2ldOworICAgICAgYy0+Y2lwaGVyLT5kZWNyeXB0ICgmYy0+Y29udGV4dC5jLCBvdXRidWYsIGMtPnVfaXYuaXYpOworICAgICAgZm9yKGl2cD1jLT5sYXN0aXYsaT0wOyBpIDwgYmxvY2tzaXplOyBpKysgKQorICAgICAgICBvdXRidWZbaV0gXj0gKml2cCsrOworICAgICAgLyogYy0+bGFzdGl2IGlzIG5vdyByZWFsbHkgbGFzdGxhc3RpdiwgZG9lcyB0aGlzIG1hdHRlcj8gKi8KKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK2RvX2NmYl9lbmNyeXB0KCBnY3J5X2NpcGhlcl9oZF90IGMsIHVuc2lnbmVkIGNoYXIgKm91dGJ1ZiwgCisgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaW5idWYsIHVuc2lnbmVkIGludCBuYnl0ZXMgKQoreworICB1bnNpZ25lZCBjaGFyICppdnA7CisgIHNpemVfdCBibG9ja3NpemUgPSBjLT5jaXBoZXItPmJsb2Nrc2l6ZTsKKyAgc2l6ZV90IGJsb2Nrc2l6ZV94XzIgPSBibG9ja3NpemUgKyBibG9ja3NpemU7CisgIAorICBpZiAoIG5ieXRlcyA8PSBjLT51bnVzZWQgKQorICAgIHsKKyAgICAgIC8qIFNob3J0IGVub3VnaCB0byBiZSBlbmNvZGVkIGJ5IHRoZSByZW1haW5pbmcgWE9SIG1hc2suICovCisgICAgICAvKiBYT1IgdGhlIGlucHV0IHdpdGggdGhlIElWIGFuZCBzdG9yZSBpbnB1dCBpbnRvIElWLiAqLworICAgICAgZm9yIChpdnA9Yy0+dV9pdi5pditjLT5jaXBoZXItPmJsb2Nrc2l6ZSAtIGMtPnVudXNlZDsKKyAgICAgICAgICAgbmJ5dGVzOworICAgICAgICAgICBuYnl0ZXMtLSwgYy0+dW51c2VkLS0gKQorICAgICAgICAqb3V0YnVmKysgPSAoKml2cCsrIF49ICppbmJ1ZisrKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKCBjLT51bnVzZWQgKQorICAgIHsKKyAgICAgIC8qIFhPUiB0aGUgaW5wdXQgd2l0aCB0aGUgSVYgYW5kIHN0b3JlIGlucHV0IGludG8gSVYgKi8KKyAgICAgIG5ieXRlcyAtPSBjLT51bnVzZWQ7CisgICAgICBmb3IoaXZwPWMtPnVfaXYuaXYrYmxvY2tzaXplIC0gYy0+dW51c2VkOyBjLT51bnVzZWQ7IGMtPnVudXNlZC0tICkKKyAgICAgICAgKm91dGJ1ZisrID0gKCppdnArKyBePSAqaW5idWYrKyk7CisgICAgfQorCisgIC8qIE5vdyB3ZSBjYW4gcHJvY2VzcyBjb21wbGV0ZSBibG9ja3MuICBXZSB1c2UgYSBsb29wIGFzIGxvbmcgYXMgd2UKKyAgICAgaGF2ZSBhdCBsZWFzdCAyIGJsb2NrcyBhbmQgdXNlIGNvbmRpdGlvbnMgZm9yIHRoZSByZXN0LiAgVGhpcworICAgICBhbHNvIGFsbG93cyB0byB1c2UgYSBidWxrIGVuY3J5cHRpb24gZnVuY3Rpb24gaWYgYXZhaWxhYmxlLiAgKi8KKyAgaWYgKG5ieXRlcyA+PSBibG9ja3NpemVfeF8yICYmIGMtPmJ1bGsuY2ZiX2VuYykKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgbmJsb2NrcyA9IG5ieXRlcyAvIGJsb2Nrc2l6ZTsKKyAgICAgIGMtPmJ1bGsuY2ZiX2VuYyAoJmMtPmNvbnRleHQuYywgYy0+dV9pdi5pdiwgb3V0YnVmLCBpbmJ1ZiwgbmJsb2Nrcyk7IAorICAgICAgb3V0YnVmICs9IG5ibG9ja3MgKiBibG9ja3NpemU7CisgICAgICBpbmJ1ZiAgKz0gbmJsb2NrcyAqIGJsb2Nrc2l6ZTsKKyAgICAgIG5ieXRlcyAtPSBuYmxvY2tzICogYmxvY2tzaXplOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHdoaWxlICggbmJ5dGVzID49IGJsb2Nrc2l6ZV94XzIgKQorICAgICAgICB7CisgICAgICAgICAgaW50IGk7CisgICAgICAgICAgLyogRW5jcnlwdCB0aGUgSVYuICovCisgICAgICAgICAgYy0+Y2lwaGVyLT5lbmNyeXB0ICggJmMtPmNvbnRleHQuYywgYy0+dV9pdi5pdiwgYy0+dV9pdi5pdiApOworICAgICAgICAgIC8qIFhPUiB0aGUgaW5wdXQgd2l0aCB0aGUgSVYgYW5kIHN0b3JlIGlucHV0IGludG8gSVYuICAqLworICAgICAgICAgIGZvcihpdnA9Yy0+dV9pdi5pdixpPTA7IGkgPCBibG9ja3NpemU7IGkrKyApCisgICAgICAgICAgICAqb3V0YnVmKysgPSAoKml2cCsrIF49ICppbmJ1ZisrKTsKKyAgICAgICAgICBuYnl0ZXMgLT0gYmxvY2tzaXplOworICAgICAgICB9CisgICAgfQorCisgIGlmICggbmJ5dGVzID49IGJsb2Nrc2l6ZSApCisgICAgeworICAgICAgaW50IGk7CisgICAgICAvKiBTYXZlIHRoZSBjdXJyZW50IElWIGFuZCB0aGVuIGVuY3J5cHQgdGhlIElWLiAqLworICAgICAgbWVtY3B5KCBjLT5sYXN0aXYsIGMtPnVfaXYuaXYsIGJsb2Nrc2l6ZSApOworICAgICAgYy0+Y2lwaGVyLT5lbmNyeXB0ICggJmMtPmNvbnRleHQuYywgYy0+dV9pdi5pdiwgYy0+dV9pdi5pdiApOworICAgICAgLyogWE9SIHRoZSBpbnB1dCB3aXRoIHRoZSBJViBhbmQgc3RvcmUgaW5wdXQgaW50byBJViAqLworICAgICAgZm9yKGl2cD1jLT51X2l2Lml2LGk9MDsgaSA8IGJsb2Nrc2l6ZTsgaSsrICkKKyAgICAgICAgKm91dGJ1ZisrID0gKCppdnArKyBePSAqaW5idWYrKyk7CisgICAgICBuYnl0ZXMgLT0gYmxvY2tzaXplOworICAgIH0KKyAgaWYgKCBuYnl0ZXMgKSAKKyAgICB7CisgICAgICAvKiBTYXZlIHRoZSBjdXJyZW50IElWIGFuZCB0aGVuIGVuY3J5cHQgdGhlIElWLiAqLworICAgICAgbWVtY3B5KCBjLT5sYXN0aXYsIGMtPnVfaXYuaXYsIGJsb2Nrc2l6ZSApOworICAgICAgYy0+Y2lwaGVyLT5lbmNyeXB0ICggJmMtPmNvbnRleHQuYywgYy0+dV9pdi5pdiwgYy0+dV9pdi5pdiApOworICAgICAgYy0+dW51c2VkID0gYmxvY2tzaXplOworICAgICAgLyogQXBwbHkgdGhlIFhPUi4gKi8KKyAgICAgIGMtPnVudXNlZCAtPSBuYnl0ZXM7CisgICAgICBmb3IoaXZwPWMtPnVfaXYuaXY7IG5ieXRlczsgbmJ5dGVzLS0gKQorICAgICAgICAqb3V0YnVmKysgPSAoKml2cCsrIF49ICppbmJ1ZisrKTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK2RvX2NmYl9kZWNyeXB0KCBnY3J5X2NpcGhlcl9oZF90IGMsIHVuc2lnbmVkIGNoYXIgKm91dGJ1ZiwgCisgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaW5idWYsIHVuc2lnbmVkIGludCBuYnl0ZXMgKQoreworICB1bnNpZ25lZCBjaGFyICppdnA7CisgIHVuc2lnbmVkIGxvbmcgdGVtcDsKKyAgaW50IGk7CisgIHNpemVfdCBibG9ja3NpemUgPSBjLT5jaXBoZXItPmJsb2Nrc2l6ZTsKKyAgc2l6ZV90IGJsb2Nrc2l6ZV94XzIgPSBibG9ja3NpemUgKyBibG9ja3NpemU7CisgIAorICBpZiAobmJ5dGVzIDw9IGMtPnVudXNlZCkKKyAgICB7CisgICAgICAvKiBTaG9ydCBlbm91Z2ggdG8gYmUgZW5jb2RlZCBieSB0aGUgcmVtYWluaW5nIFhPUiBtYXNrLiAqLworICAgICAgLyogWE9SIHRoZSBpbnB1dCB3aXRoIHRoZSBJViBhbmQgc3RvcmUgaW5wdXQgaW50byBJVi4gKi8KKyAgICAgIGZvciAoaXZwPWMtPnVfaXYuaXYrYmxvY2tzaXplIC0gYy0+dW51c2VkOworICAgICAgICAgICBuYnl0ZXM7IAorICAgICAgICAgICBuYnl0ZXMtLSwgYy0+dW51c2VkLS0pCisgICAgICAgIHsKKyAgICAgICAgICB0ZW1wID0gKmluYnVmKys7CisgICAgICAgICAgKm91dGJ1ZisrID0gKml2cCBeIHRlbXA7CisgICAgICAgICAgKml2cCsrID0gdGVtcDsKKyAgICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgCisgIGlmIChjLT51bnVzZWQpCisgICAgeworICAgICAgLyogWE9SIHRoZSBpbnB1dCB3aXRoIHRoZSBJViBhbmQgc3RvcmUgaW5wdXQgaW50byBJVi4gKi8KKyAgICAgIG5ieXRlcyAtPSBjLT51bnVzZWQ7CisgICAgICBmb3IgKGl2cD1jLT51X2l2Lml2K2Jsb2Nrc2l6ZSAtIGMtPnVudXNlZDsgYy0+dW51c2VkOyBjLT51bnVzZWQtLSApCisgICAgICAgIHsKKyAgICAgICAgICB0ZW1wID0gKmluYnVmKys7CisgICAgICAgICAgKm91dGJ1ZisrID0gKml2cCBeIHRlbXA7CisgICAgICAgICAgKml2cCsrID0gdGVtcDsKKyAgICAgICAgfQorICAgIH0KKyAgCisgIC8qIE5vdyB3ZSBjYW4gcHJvY2VzcyBjb21wbGV0ZSBibG9ja3MuICBXZSB1c2UgYSBsb29wIGFzIGxvbmcgYXMgd2UKKyAgICAgaGF2ZSBhdCBsZWFzdCAyIGJsb2NrcyBhbmQgdXNlIGNvbmRpdGlvbnMgZm9yIHRoZSByZXN0LiAgVGhpcworICAgICBhbHNvIGFsbG93cyB0byB1c2UgYSBidWxrIGVuY3J5cHRpb24gZnVuY3Rpb24gaWYgYXZhaWxhYmxlLiAgKi8KKyAgaWYgKG5ieXRlcyA+PSBibG9ja3NpemVfeF8yICYmIGMtPmJ1bGsuY2ZiX2RlYykKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgbmJsb2NrcyA9IG5ieXRlcyAvIGJsb2Nrc2l6ZTsKKyAgICAgIGMtPmJ1bGsuY2ZiX2RlYyAoJmMtPmNvbnRleHQuYywgYy0+dV9pdi5pdiwgb3V0YnVmLCBpbmJ1ZiwgbmJsb2Nrcyk7IAorICAgICAgb3V0YnVmICs9IG5ibG9ja3MgKiBibG9ja3NpemU7CisgICAgICBpbmJ1ZiAgKz0gbmJsb2NrcyAqIGJsb2Nrc2l6ZTsKKyAgICAgIG5ieXRlcyAtPSBuYmxvY2tzICogYmxvY2tzaXplOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHdoaWxlIChuYnl0ZXMgPj0gYmxvY2tzaXplX3hfMiApCisgICAgICAgIHsKKyAgICAgICAgICAvKiBFbmNyeXB0IHRoZSBJVi4gKi8KKyAgICAgICAgICBjLT5jaXBoZXItPmVuY3J5cHQgKCAmYy0+Y29udGV4dC5jLCBjLT51X2l2Lml2LCBjLT51X2l2Lml2ICk7CisgICAgICAgICAgLyogWE9SIHRoZSBpbnB1dCB3aXRoIHRoZSBJViBhbmQgc3RvcmUgaW5wdXQgaW50byBJVi4gKi8KKyAgICAgICAgICBmb3IgKGl2cD1jLT51X2l2Lml2LGk9MDsgaSA8IGJsb2Nrc2l6ZTsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgdGVtcCA9ICppbmJ1ZisrOworICAgICAgICAgICAgICAqb3V0YnVmKysgPSAqaXZwIF4gdGVtcDsKKyAgICAgICAgICAgICAgKml2cCsrID0gdGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBuYnl0ZXMgLT0gYmxvY2tzaXplOworICAgICAgICB9CisgICAgfQorCisgIGlmIChuYnl0ZXMgPj0gYmxvY2tzaXplICkKKyAgICB7CisgICAgICAvKiBTYXZlIHRoZSBjdXJyZW50IElWIGFuZCB0aGVuIGVuY3J5cHQgdGhlIElWLiAqLworICAgICAgbWVtY3B5ICggYy0+bGFzdGl2LCBjLT51X2l2Lml2LCBibG9ja3NpemUpOworICAgICAgYy0+Y2lwaGVyLT5lbmNyeXB0ICggJmMtPmNvbnRleHQuYywgYy0+dV9pdi5pdiwgYy0+dV9pdi5pdiApOworICAgICAgLyogWE9SIHRoZSBpbnB1dCB3aXRoIHRoZSBJViBhbmQgc3RvcmUgaW5wdXQgaW50byBJViAqLworICAgICAgZm9yIChpdnA9Yy0+dV9pdi5pdixpPTA7IGkgPCBibG9ja3NpemU7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICB0ZW1wID0gKmluYnVmKys7CisgICAgICAgICAgKm91dGJ1ZisrID0gKml2cCBeIHRlbXA7CisgICAgICAgICAgKml2cCsrID0gdGVtcDsKKyAgICAgICAgfQorICAgICAgbmJ5dGVzIC09IGJsb2Nrc2l6ZTsKKyAgICB9CisKKyAgaWYgKG5ieXRlcykKKyAgICB7IAorICAgICAgLyogU2F2ZSB0aGUgY3VycmVudCBJViBhbmQgdGhlbiBlbmNyeXB0IHRoZSBJVi4gKi8KKyAgICAgIG1lbWNweSAoIGMtPmxhc3RpdiwgYy0+dV9pdi5pdiwgYmxvY2tzaXplICk7CisgICAgICBjLT5jaXBoZXItPmVuY3J5cHQgKCAmYy0+Y29udGV4dC5jLCBjLT51X2l2Lml2LCBjLT51X2l2Lml2ICk7CisgICAgICBjLT51bnVzZWQgPSBibG9ja3NpemU7CisgICAgICAvKiBBcHBseSB0aGUgWE9SLiAqLworICAgICAgYy0+dW51c2VkIC09IG5ieXRlczsKKyAgICAgIGZvciAoaXZwPWMtPnVfaXYuaXY7IG5ieXRlczsgbmJ5dGVzLS0gKQorICAgICAgICB7CisgICAgICAgICAgdGVtcCA9ICppbmJ1ZisrOworICAgICAgICAgICpvdXRidWYrKyA9ICppdnAgXiB0ZW1wOworICAgICAgICAgICppdnArKyA9IHRlbXA7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK2RvX29mYl9lbmNyeXB0KCBnY3J5X2NpcGhlcl9oZF90IGMsCisgICAgICAgICAgICAgICAgYnl0ZSAqb3V0YnVmLCBjb25zdCBieXRlICppbmJ1ZiwgdW5zaWduZWQgbmJ5dGVzICkKK3sKKyAgYnl0ZSAqaXZwOworICBzaXplX3QgYmxvY2tzaXplID0gYy0+Y2lwaGVyLT5ibG9ja3NpemU7CisKKyAgaWYgKCBuYnl0ZXMgPD0gYy0+dW51c2VkICkKKyAgICB7CisgICAgICAvKiBTaG9ydCBlbm91Z2ggdG8gYmUgZW5jb2RlZCBieSB0aGUgcmVtYWluaW5nIFhPUiBtYXNrLiAqLworICAgICAgLyogWE9SIHRoZSBpbnB1dCB3aXRoIHRoZSBJViAqLworICAgICAgZm9yIChpdnA9Yy0+dV9pdi5pditjLT5jaXBoZXItPmJsb2Nrc2l6ZSAtIGMtPnVudXNlZDsKKyAgICAgICAgICAgbmJ5dGVzOworICAgICAgICAgICBuYnl0ZXMtLSwgYy0+dW51c2VkLS0gKQorICAgICAgICAqb3V0YnVmKysgPSAoKml2cCsrIF4gKmluYnVmKyspOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiggYy0+dW51c2VkICkKKyAgICB7CisgICAgICBuYnl0ZXMgLT0gYy0+dW51c2VkOworICAgICAgZm9yKGl2cD1jLT51X2l2Lml2K2Jsb2Nrc2l6ZSAtIGMtPnVudXNlZDsgYy0+dW51c2VkOyBjLT51bnVzZWQtLSApCisgICAgICAgICpvdXRidWYrKyA9ICgqaXZwKysgXiAqaW5idWYrKyk7CisgICAgfQorCisgIC8qIE5vdyB3ZSBjYW4gcHJvY2VzcyBjb21wbGV0ZSBibG9ja3MuICovCisgIHdoaWxlICggbmJ5dGVzID49IGJsb2Nrc2l6ZSApCisgICAgeworICAgICAgaW50IGk7CisgICAgICAvKiBFbmNyeXB0IHRoZSBJViAoYW5kIHNhdmUgdGhlIGN1cnJlbnQgb25lKS4gKi8KKyAgICAgIG1lbWNweSggYy0+bGFzdGl2LCBjLT51X2l2Lml2LCBibG9ja3NpemUgKTsKKyAgICAgIGMtPmNpcGhlci0+ZW5jcnlwdCAoICZjLT5jb250ZXh0LmMsIGMtPnVfaXYuaXYsIGMtPnVfaXYuaXYgKTsKKyAgICAgIAorICAgICAgZm9yIChpdnA9Yy0+dV9pdi5pdixpPTA7IGkgPCBibG9ja3NpemU7IGkrKyApCisgICAgICAgICpvdXRidWYrKyA9ICgqaXZwKysgXiAqaW5idWYrKyk7CisgICAgICBuYnl0ZXMgLT0gYmxvY2tzaXplOworICAgIH0KKyAgaWYgKCBuYnl0ZXMgKQorICAgIHsgLyogcHJvY2VzcyB0aGUgcmVtYWluaW5nIGJ5dGVzICovCisgICAgICBtZW1jcHkoIGMtPmxhc3RpdiwgYy0+dV9pdi5pdiwgYmxvY2tzaXplICk7CisgICAgICBjLT5jaXBoZXItPmVuY3J5cHQgKCAmYy0+Y29udGV4dC5jLCBjLT51X2l2Lml2LCBjLT51X2l2Lml2ICk7CisgICAgICBjLT51bnVzZWQgPSBibG9ja3NpemU7CisgICAgICBjLT51bnVzZWQgLT0gbmJ5dGVzOworICAgICAgZm9yKGl2cD1jLT51X2l2Lml2OyBuYnl0ZXM7IG5ieXRlcy0tICkKKyAgICAgICAgKm91dGJ1ZisrID0gKCppdnArKyBeICppbmJ1ZisrKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitkb19vZmJfZGVjcnlwdCggZ2NyeV9jaXBoZXJfaGRfdCBjLAorICAgICAgICAgICAgICAgIGJ5dGUgKm91dGJ1ZiwgY29uc3QgYnl0ZSAqaW5idWYsIHVuc2lnbmVkIGludCBuYnl0ZXMgKQoreworICBieXRlICppdnA7CisgIHNpemVfdCBibG9ja3NpemUgPSBjLT5jaXBoZXItPmJsb2Nrc2l6ZTsKKyAgCisgIGlmKCBuYnl0ZXMgPD0gYy0+dW51c2VkICkKKyAgICB7CisgICAgICAvKiBTaG9ydCBlbm91Z2ggdG8gYmUgZW5jb2RlZCBieSB0aGUgcmVtYWluaW5nIFhPUiBtYXNrLiAqLworICAgICAgZm9yIChpdnA9Yy0+dV9pdi5pditibG9ja3NpemUgLSBjLT51bnVzZWQ7IG5ieXRlczsgbmJ5dGVzLS0sYy0+dW51c2VkLS0pCisgICAgICAgICpvdXRidWYrKyA9ICppdnArKyBeICppbmJ1ZisrOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoIGMtPnVudXNlZCApCisgICAgeworICAgICAgbmJ5dGVzIC09IGMtPnVudXNlZDsKKyAgICAgIGZvciAoaXZwPWMtPnVfaXYuaXYrYmxvY2tzaXplIC0gYy0+dW51c2VkOyBjLT51bnVzZWQ7IGMtPnVudXNlZC0tICkKKyAgICAgICAgKm91dGJ1ZisrID0gKml2cCsrIF4gKmluYnVmKys7CisgICAgfQorCisgIC8qIE5vdyB3ZSBjYW4gcHJvY2VzcyBjb21wbGV0ZSBibG9ja3MuICovCisgIHdoaWxlICggbmJ5dGVzID49IGJsb2Nrc2l6ZSApCisgICAgeworICAgICAgaW50IGk7CisgICAgICAvKiBFbmNyeXB0IHRoZSBJViAoYW5kIHNhdmUgdGhlIGN1cnJlbnQgb25lKS4gKi8KKyAgICAgIG1lbWNweSggYy0+bGFzdGl2LCBjLT51X2l2Lml2LCBibG9ja3NpemUgKTsKKyAgICAgIGMtPmNpcGhlci0+ZW5jcnlwdCAoICZjLT5jb250ZXh0LmMsIGMtPnVfaXYuaXYsIGMtPnVfaXYuaXYgKTsKKyAgICAgIGZvciAoaXZwPWMtPnVfaXYuaXYsaT0wOyBpIDwgYmxvY2tzaXplOyBpKysgKQorICAgICAgICAqb3V0YnVmKysgPSAqaXZwKysgXiAqaW5idWYrKzsKKyAgICAgIG5ieXRlcyAtPSBibG9ja3NpemU7CisgICAgfQorICBpZiAoIG5ieXRlcyApIAorICAgIHsgLyogUHJvY2VzcyB0aGUgcmVtYWluaW5nIGJ5dGVzLiAqLworICAgICAgLyogRW5jcnlwdCB0aGUgSVYgKGFuZCBzYXZlIHRoZSBjdXJyZW50IG9uZSkuICovCisgICAgICBtZW1jcHkoIGMtPmxhc3RpdiwgYy0+dV9pdi5pdiwgYmxvY2tzaXplICk7CisgICAgICBjLT5jaXBoZXItPmVuY3J5cHQgKCAmYy0+Y29udGV4dC5jLCBjLT51X2l2Lml2LCBjLT51X2l2Lml2ICk7CisgICAgICBjLT51bnVzZWQgPSBibG9ja3NpemU7CisgICAgICBjLT51bnVzZWQgLT0gbmJ5dGVzOworICAgICAgZm9yIChpdnA9Yy0+dV9pdi5pdjsgbmJ5dGVzOyBuYnl0ZXMtLSApCisgICAgICAgICpvdXRidWYrKyA9ICppdnArKyBeICppbmJ1ZisrOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAorZG9fY3RyX2VuY3J5cHQoIGdjcnlfY2lwaGVyX2hkX3QgYywgYnl0ZSAqb3V0YnVmLCBjb25zdCBieXRlICppbmJ1ZiwKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzICkKK3sKKyAgdW5zaWduZWQgaW50IG47CisgIGJ5dGUgdG1wW01BWF9CTE9DS1NJWkVdOworICBpbnQgaTsKKworICBmb3Iobj0wOyBuIDwgbmJ5dGVzOyBuKyspCisgICAgeworICAgICAgaWYgKChuICUgYy0+Y2lwaGVyLT5ibG9ja3NpemUpID09IDApCisJeworCSAgYy0+Y2lwaGVyLT5lbmNyeXB0ICgmYy0+Y29udGV4dC5jLCB0bXAsIGMtPmN0cik7CisKKwkgIGZvciAoaSA9IGMtPmNpcGhlci0+YmxvY2tzaXplOyBpID4gMDsgaS0tKQorCSAgICB7CisJICAgICAgYy0+Y3RyW2ktMV0rKzsKKwkgICAgICBpZiAoYy0+Y3RyW2ktMV0gIT0gMCkKKwkJYnJlYWs7CisJICAgIH0KKwl9CisKKyAgICAgIC8qIFhPUiBpbnB1dCB3aXRoIGVuY3J5cHRlZCBjb3VudGVyIGFuZCBzdG9yZSBpbiBvdXRwdXQuICovCisgICAgICBvdXRidWZbbl0gPSBpbmJ1ZltuXSBeIHRtcFtuICUgYy0+Y2lwaGVyLT5ibG9ja3NpemVdOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2RvX2N0cl9kZWNyeXB0KCBnY3J5X2NpcGhlcl9oZF90IGMsIGJ5dGUgKm91dGJ1ZiwgY29uc3QgYnl0ZSAqaW5idWYsCisgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcyApCit7CisgIGRvX2N0cl9lbmNyeXB0IChjLCBvdXRidWYsIGluYnVmLCBuYnl0ZXMpOworfQorCisKKy8qIFBlcmZvcm0gdGhlIEFFUy1XcmFwIGFsZ29yaXRobSBhcyBzcGVjaWZpZWQgYnkgUkZDMzM5NC4gIFdlCisgICBpbXBsZW1lbnQgdGhpcyBhcyBhIG1vZGUgdXNhYmxlIHdpdGggYW55IGNpcGhlciBhbGdvcml0aG0gb2YKKyAgIGJsb2Nrc2l6ZSAxMjguICAqLworc3RhdGljIGdjcnlfZXJyX2NvZGVfdAorZG9fYWVzd3JhcF9lbmNyeXB0IChnY3J5X2NpcGhlcl9oZF90IGMsIGJ5dGUgKm91dGJ1ZiwgdW5zaWduZWQgaW50IG91dGJ1ZmxlbiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYnl0ZSAqaW5idWYsIHVuc2lnbmVkIGludCBpbmJ1ZmxlbiApCit7CisgIGludCBqLCB4OworICB1bnNpZ25lZCBpbnQgbiwgaTsKKyAgdW5zaWduZWQgY2hhciAqciwgKmEsICpiOworICB1bnNpZ25lZCBjaGFyIHRbOF07CisKKyNpZiBNQVhfQkxPQ0tTSVpFIDwgOAorI2Vycm9yIEludmFsaWQgYmxvY2sgc2l6ZQorI2VuZGlmCisgIC8qIFdlIHJlcXVpcmUgYSBjaXBoZXIgd2l0aCBhIDEyOCBiaXQgYmxvY2sgbGVuZ3RoLiAgKi8KKyAgaWYgKGMtPmNpcGhlci0+YmxvY2tzaXplICE9IDE2KQorICAgIHJldHVybiBHUEdfRVJSX0lOVl9MRU5HVEg7ICAKKyAgCisgIC8qIFRoZSBvdXRwdXQgYnVmZmVyIG11c3QgYmUgYWJsZSB0byBob2xkIHRoZSBpbnB1dCBkYXRhIHBsdXMgb25lCisgICAgIGFkZGl0aW9uYWwgYmxvY2suICAqLworICBpZiAob3V0YnVmbGVuIDwgaW5idWZsZW4gKyA4KQorICAgIHJldHVybiBHUEdfRVJSX0JVRkZFUl9UT09fU0hPUlQ7CisgIC8qIElucHV0IGRhdGEgbXVzdCBiZSBtdWx0aXBsZSBvZiA2NCBiaXRzLiAgKi8KKyAgaWYgKGluYnVmbGVuICUgOCkKKyAgICByZXR1cm4gR1BHX0VSUl9JTlZfQVJHOyAgIAorCisgIG4gPSBpbmJ1ZmxlbiAvIDg7CisKKyAgLyogV2UgbmVlZCBhdCBsZWFzdCB0d28gNjQgYml0IGJsb2Nrcy4gICovCisgIGlmIChuIDwgMikKKyAgICByZXR1cm4gR1BHX0VSUl9JTlZfQVJHOworCisgIHIgPSBvdXRidWY7IAorICBhID0gb3V0YnVmOyAgLyogV2Ugc3RvcmUgQSBkaXJlY3RseSBpbiBPVVRCVUYuICAqLworICBiID0gYy0+Y3RyOyAgLyogQiBpcyBhbHNvIHVzZWQgdG8gY29uY2F0ZW5hdGUgc3R1ZmYuICAqLworCisgIC8qIElmIGFuIElWIGhhcyBiZWVuIHNldCB3ZSB1c2UgdGhhdCBJViBhcyB0aGUgQWx0ZXJuYXRpdmUgSW5pdGlhbAorICAgICBWYWx1ZTsgaWYgaXQgaGFzIG5vdCBiZWVuIHNldCB3ZSB1c2UgdGhlIHN0YW5kYXJkIHZhbHVlLiAgKi8KKyAgaWYgKGMtPm1hcmtzLml2KQorICAgIG1lbWNweSAoYSwgYy0+dV9pdi5pdiwgOCk7CisgIGVsc2UKKyAgICBtZW1zZXQgKGEsIDB4YTYsIDgpOworCisgIC8qIENvcHkgdGhlIGluYnVmIHRvIHRoZSBvdXRidWYuICovCisgIG1lbW1vdmUgKHIrOCwgaW5idWYsIGluYnVmbGVuKTsKKworICBtZW1zZXQgKHQsIDAsIHNpemVvZiB0KTsgLyogdCA6PSAwLiAgKi8KKworICBmb3IgKGogPSAwOyBqIDw9IDU7IGorKykKKyAgICB7CisgICAgICBmb3IgKGkgPSAxOyBpIDw9IG47IGkrKykKKyAgICAgICAgeworICAgICAgICAgIC8qIEIgOj0gQUVTX2soIEEgfCBSW2ldICkgKi8KKyAgICAgICAgICBtZW1jcHkgKGIsIGEsIDgpOworICAgICAgICAgIG1lbWNweSAoYis4LCByK2kqOCwgOCk7CisgICAgICAgICAgYy0+Y2lwaGVyLT5lbmNyeXB0ICgmYy0+Y29udGV4dC5jLCBiLCBiKTsKKyAgICAgICAgICAvKiB0IDo9IHQgKyAxICAqLworCSAgZm9yICh4ID0gNzsgeCA+PSAwOyB4LS0pCisJICAgIHsKKwkgICAgICB0W3hdKys7CisJICAgICAgaWYgKHRbeF0pCisJCWJyZWFrOworCSAgICB9CisgICAgICAgICAgLyogQSA6PSBNU0JfNjQoQikgXiB0ICovCisgICAgICAgICAgZm9yICh4PTA7IHggPCA4OyB4KyspCisgICAgICAgICAgICBhW3hdID0gYlt4XSBeIHRbeF07CisgICAgICAgICAgLyogUltpXSA6PSBMU0JfNjQoQikgKi8KKyAgICAgICAgICBtZW1jcHkgKHIraSo4LCBiKzgsIDgpOworICAgICAgICB9CisgICB9CisgIAorICByZXR1cm4gMDsKK30KKworLyogUGVyZm9ybSB0aGUgQUVTLVVud3JhcCBhbGdvcml0aG0gYXMgc3BlY2lmaWVkIGJ5IFJGQzMzOTQuICBXZQorICAgaW1wbGVtZW50IHRoaXMgYXMgYSBtb2RlIHVzYWJsZSB3aXRoIGFueSBjaXBoZXIgYWxnb3JpdGhtIG9mCisgICBibG9ja3NpemUgMTI4LiAgKi8KK3N0YXRpYyBnY3J5X2Vycl9jb2RlX3QKK2RvX2Flc3dyYXBfZGVjcnlwdCAoZ2NyeV9jaXBoZXJfaGRfdCBjLCBieXRlICpvdXRidWYsIHVuc2lnbmVkIGludCBvdXRidWZsZW4sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ5dGUgKmluYnVmLCB1bnNpZ25lZCBpbnQgaW5idWZsZW4pCit7CisgIGludCBqLCB4OworICB1bnNpZ25lZCBpbnQgbiwgaTsKKyAgdW5zaWduZWQgY2hhciAqciwgKmEsICpiOworICB1bnNpZ25lZCBjaGFyIHRbOF07CisKKyNpZiBNQVhfQkxPQ0tTSVpFIDwgOAorI2Vycm9yIEludmFsaWQgYmxvY2sgc2l6ZQorI2VuZGlmCisgIC8qIFdlIHJlcXVpcmUgYSBjaXBoZXIgd2l0aCBhIDEyOCBiaXQgYmxvY2sgbGVuZ3RoLiAgKi8KKyAgaWYgKGMtPmNpcGhlci0+YmxvY2tzaXplICE9IDE2KQorICAgIHJldHVybiBHUEdfRVJSX0lOVl9MRU5HVEg7ICAKKyAgCisgIC8qIFRoZSBvdXRwdXQgYnVmZmVyIG11c3QgYmUgYWJsZSB0byBob2xkIHRoZSBpbnB1dCBkYXRhIG1pbnVzIG9uZQorICAgICBhZGRpdGlvbmFsIGJsb2NrLiAgRml4bWU6IFRoZSBjYWxsZXIgaGFzIG1vcmUgcmVzdHJpY3RpdmUgY2hlY2tzCisgICAgIC0gd2UgbWF5IHdhbnQgdG8gZml4IHRoZW0gZm9yIHRoaXMgbW9kZS4gICovCisgIGlmIChvdXRidWZsZW4gKyA4ICA8IGluYnVmbGVuKQorICAgIHJldHVybiBHUEdfRVJSX0JVRkZFUl9UT09fU0hPUlQ7CisgIC8qIElucHV0IGRhdGEgbXVzdCBiZSBtdWx0aXBsZSBvZiA2NCBiaXRzLiAgKi8KKyAgaWYgKGluYnVmbGVuICUgOCkKKyAgICByZXR1cm4gR1BHX0VSUl9JTlZfQVJHOyAgIAorCisgIG4gPSBpbmJ1ZmxlbiAvIDg7CisKKyAgLyogV2UgbmVlZCBhdCBsZWFzdCB0aHJlZSA2NCBiaXQgYmxvY2tzLiAgKi8KKyAgaWYgKG4gPCAzKQorICAgIHJldHVybiBHUEdfRVJSX0lOVl9BUkc7CisKKyAgciA9IG91dGJ1ZjsgCisgIGEgPSBjLT5sYXN0aXY7ICAvKiBXZSB1c2UgYy0+TEFTVElWIGFzIGJ1ZmZlciBmb3IgQS4gICovCisgIGIgPSBjLT5jdHI7ICAgICAvKiBCIGlzIGFsc28gdXNlZCB0byBjb25jYXRlbmF0ZSBzdHVmZi4gICovCisKKyAgLyogQ29weSB0aGUgaW5idWYgdG8gdGhlIG91dGJ1ZiBhbmQgc2F2ZSBBLiAqLworICBtZW1jcHkgKGEsIGluYnVmLCA4KTsKKyAgbWVtbW92ZSAociwgaW5idWYrOCwgaW5idWZsZW4tOCk7CisgIG4tLTsgLyogUmVkdWNlIHRvIGFjdHVhbCBudW1iZXIgb2YgZGF0YSBibG9ja3MuICAqLworCisgIC8qIHQgOj0gNiAqIG4gICovCisgIGkgPSBuICogNjsgIC8qIFRoZSByYW5nZSBpcyB2YWxpZCBiZWNhdXNlOiBuID0gaW5idWZsZW4gLyA4IC0gMS4gICovCisgIGZvciAoeD0wOyB4IDwgOCAmJiB4IDwgc2l6ZW9mIChpKTsgeCsrKQorICAgIHRbNy14XSA9IGkgPj4gKDgqeCk7CisgIGZvciAoOyB4IDwgODsgeCsrKQorICAgIHRbNy14XSA9IDA7CisKKyAgZm9yIChqID0gNTsgaiA+PSAwOyBqLS0pCisgICAgeworICAgICAgZm9yIChpID0gbjsgaSA+PSAxOyBpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAvKiBCIDo9IEFFU19rXjEoIChBIF4gdCl8IFJbaV0gKSAqLworICAgICAgICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyspCisgICAgICAgICAgICBiW3hdID0gYVt4XSBeIHRbeF07CisgICAgICAgICAgbWVtY3B5IChiKzgsIHIrKGktMSkqOCwgOCk7CisgICAgICAgICAgYy0+Y2lwaGVyLT5kZWNyeXB0ICgmYy0+Y29udGV4dC5jLCBiLCBiKTsKKyAgICAgICAgICAvKiB0IDo9IHQgLSAxICAqLworCSAgZm9yICh4ID0gNzsgeCA+PSAwOyB4LS0pCisJICAgIHsKKwkgICAgICB0W3hdLS07CisJICAgICAgaWYgKHRbeF0gIT0gMHhmZikKKwkJYnJlYWs7CisJICAgIH0KKyAgICAgICAgICAvKiBBIDo9IE1TQl82NChCKSAqLworICAgICAgICAgIG1lbWNweSAoYSwgYiwgOCk7CisgICAgICAgICAgLyogUltpXSA6PSBMU0JfNjQoQikgKi8KKyAgICAgICAgICBtZW1jcHkgKHIrKGktMSkqOCwgYis4LCA4KTsKKyAgICAgICAgfQorICAgfQorCisgIC8qIElmIGFuIElWIGhhcyBiZWVuIHNldCB3ZSBjb21wYXJlIGFnYWluc3QgdGhpcyBBbHRlcm5hdGl2ZSBJbml0aWFsCisgICAgIFZhbHVlOyBpZiBpdCBoYXMgbm90IGJlZW4gc2V0IHdlIGNvbXBhcmUgYWdhaW5zdCB0aGUgc3RhbmRhcmQgSVYuICAqLworICBpZiAoYy0+bWFya3MuaXYpCisgICAgaiA9IG1lbWNtcCAoYSwgYy0+dV9pdi5pdiwgOCk7CisgIGVsc2UKKyAgICB7CisgICAgICBmb3IgKGo9MCwgeD0wOyB4IDwgODsgeCsrKQorICAgICAgICBpZiAoYVt4XSAhPSAweGE2KQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGo9MTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICB9CisgIHJldHVybiBqPyBHUEdfRVJSX0NIRUNLU1VNIDogMDsKK30KKworCisvKioqKioqKioqKioqKioqKgorICogRW5jcnlwdCBJTkJVRiB0byBPVVRCVUYgd2l0aCB0aGUgbW9kZSBzZWxlY3RlZCBhdCBvcGVuLgorICogaW5idWYgYW5kIG91dGJ1ZiBtYXkgb3ZlcmxhcCBvciBiZSB0aGUgc2FtZS4KKyAqIERlcGVuZGluZyBvbiB0aGUgbW9kZSBzb21lIGNvbnRyYWludHMgYXBwbHkgdG8gTkJZVEVTLgorICovCitzdGF0aWMgZ2NyeV9lcnJfY29kZV90CitjaXBoZXJfZW5jcnlwdCAoZ2NyeV9jaXBoZXJfaGRfdCBjLCBieXRlICpvdXRidWYsCisJCWNvbnN0IGJ5dGUgKmluYnVmLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworICAgIGdjcnlfZXJyX2NvZGVfdCByYyA9IEdQR19FUlJfTk9fRVJST1I7CisKKyAgICBzd2l0Y2goIGMtPm1vZGUgKSB7CisgICAgICBjYXNlIEdDUllfQ0lQSEVSX01PREVfRUNCOgorCWlmICghKG5ieXRlcyVjLT5jaXBoZXItPmJsb2Nrc2l6ZSkpCisgICAgICAgICAgICBkb19lY2JfZW5jcnlwdChjLCBvdXRidWYsIGluYnVmLCBuYnl0ZXMvYy0+Y2lwaGVyLT5ibG9ja3NpemUgKTsKKyAgICAgICAgZWxzZSAKKyAgICAgICAgICAgIHJjID0gR1BHX0VSUl9JTlZfQVJHOworCWJyZWFrOworICAgICAgY2FzZSBHQ1JZX0NJUEhFUl9NT0RFX0NCQzoKKwlpZiAoIShuYnl0ZXMlYy0+Y2lwaGVyLT5ibG9ja3NpemUpCisgICAgICAgICAgICB8fCAobmJ5dGVzID4gYy0+Y2lwaGVyLT5ibG9ja3NpemUKKyAgICAgICAgICAgICAgICAmJiAoYy0+ZmxhZ3MgJiBHQ1JZX0NJUEhFUl9DQkNfQ1RTKSkpCisgICAgICAgICAgICBkb19jYmNfZW5jcnlwdChjLCBvdXRidWYsIGluYnVmLCBuYnl0ZXMgKTsKKyAgICAgICAgZWxzZSAKKyAgICAgICAgICAgIHJjID0gR1BHX0VSUl9JTlZfQVJHOworCWJyZWFrOworICAgICAgY2FzZSBHQ1JZX0NJUEhFUl9NT0RFX0NGQjoKKwlkb19jZmJfZW5jcnlwdChjLCBvdXRidWYsIGluYnVmLCBuYnl0ZXMgKTsKKwlicmVhazsKKyAgICAgIGNhc2UgR0NSWV9DSVBIRVJfTU9ERV9PRkI6CisJZG9fb2ZiX2VuY3J5cHQoYywgb3V0YnVmLCBpbmJ1ZiwgbmJ5dGVzICk7CisJYnJlYWs7CisgICAgICBjYXNlIEdDUllfQ0lQSEVSX01PREVfQ1RSOgorCWRvX2N0cl9lbmNyeXB0KGMsIG91dGJ1ZiwgaW5idWYsIG5ieXRlcyApOworCWJyZWFrOworICAgICAgY2FzZSBHQ1JZX0NJUEhFUl9NT0RFX1NUUkVBTToKKyAgICAgICAgYy0+Y2lwaGVyLT5zdGVuY3J5cHQgKCAmYy0+Y29udGV4dC5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGJ1ZiwgKGJ5dGUqKS8qYXJnZ2cqL2luYnVmLCBuYnl0ZXMgKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdDUllfQ0lQSEVSX01PREVfTk9ORToKKyAgICAgICAJaWYgKGZpcHNfbW9kZSAoKSB8fCAhX2djcnlfZ2V0X2RlYnVnX2ZsYWcgKDApKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGZpcHNfc2lnbmFsX2Vycm9yICgiY2lwaGVyIG1vZGUgTk9ORSB1c2VkIik7CisgICAgICAgICAgICByYyA9IEdQR19FUlJfSU5WX0NJUEhFUl9NT0RFOworICAgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggaW5idWYgIT0gb3V0YnVmICkKKyAgICAgICAgICAgICAgbWVtbW92ZSAob3V0YnVmLCBpbmJ1ZiwgbmJ5dGVzKTsKKyAgICAgICAgICB9CisJYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBsb2dfZmF0YWwoImNpcGhlcl9lbmNyeXB0OiBpbnZhbGlkIG1vZGUgJWRcbiIsIGMtPm1vZGUgKTsKKyAgICAgICAgcmMgPSBHUEdfRVJSX0lOVl9DSVBIRVJfTU9ERTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworCisvKioqKioqKioqKioqKioqKgorICogRW5jcnlwdCBJTiBhbmQgd3JpdGUgaXQgdG8gT1VULiAgSWYgSU4gaXMgTlVMTCwgaW4tcGxhY2UgZW5jcnlwdGlvbiBoYXMKKyAqIGJlZW4gcmVxdWVzdGVkLgorICovCitnY3J5X2Vycm9yX3QKK2djcnlfY2lwaGVyX2VuY3J5cHQgKGdjcnlfY2lwaGVyX2hkX3QgaCwgdm9pZCAqb3V0LCBzaXplX3Qgb3V0c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmluLCBzaXplX3QgaW5sZW4pCit7CisgIGdjcnlfZXJyX2NvZGVfdCBlcnI7CisKKyAgaWYgKGgtPm1vZGUgPT0gR0NSWV9DSVBIRVJfTU9ERV9BRVNXUkFQKQorICAgIHsKKyAgICAgIC8qIEhhY2sgdG8gaW1wbGVtZW50IEFFU1dSQVAgd2l0aG91dCB0b3VjaGluZyB0aGUgb3RoZXIgbW9kZXMuCisgICAgICAgICBUaGUgYWN0dWFsIGZ1bmN0aW9uIGhhcyBiZWVuIHRha2VuIGZyb20gdGhlIGN1cnJlbnQKKyAgICAgICAgIGRldmVsb3BtZW50IHZlcnNpb24gd2hpY2ggZG9lcyBhbGwgZXJyb3IgY2hlY2tpbmcgaW4gZWFjaAorICAgICAgICAgbW9kZSBmdW5jdGlvbi4gICovCisgICAgICBpZiAoIWluKQorICAgICAgICBlcnIgPSBkb19hZXN3cmFwX2VuY3J5cHQgKGgsIG91dCwgb3V0c2l6ZSwgb3V0LCBvdXRzaXplKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZXJyID0gZG9fYWVzd3JhcF9lbmNyeXB0IChoLCBvdXQsIG91dHNpemUsIGluLCBpbmxlbik7CisgICAgfQorICBlbHNlIGlmICghaW4pCisgICAgeworICAgICAgLyogQ2FsbGVyIHJlcXVlc3RlZCBpbi1wbGFjZSBlbmNyeXB0aW9uLiAqLworICAgICAgLyogQWN0dWFsbHkgY2lwaGVyX2VuY3J5cHQoKSBkb2VzIG5vdCBuZWVkIHRvIGtub3cgYWJvdXQgaXQsIGJ1dAorICAgICAgICogd2UgbWF5IGNoYW5nZSBpdCBpbiB0aGUgZnV0dXJlIHRvIGdldCBiZXR0ZXIgcGVyZm9ybWFuY2UuICAqLworICAgICAgZXJyID0gY2lwaGVyX2VuY3J5cHQgKGgsIG91dCwgb3V0LCBvdXRzaXplKTsKKyAgICB9CisgIGVsc2UgaWYgKG91dHNpemUgPCAoKGgtPmZsYWdzICYgR0NSWV9DSVBIRVJfQ0JDX01BQykgPworICAgICAgICAgICAgICAgICAgICAgIGgtPmNpcGhlci0+YmxvY2tzaXplIDogaW5sZW4pKQorICAgIGVyciA9IEdQR19FUlJfVE9PX1NIT1JUOworICBlbHNlIGlmICgoaC0+bW9kZSA9PSBHQ1JZX0NJUEhFUl9NT0RFX0VDQgorCSAgICB8fCAoaC0+bW9kZSA9PSBHQ1JZX0NJUEhFUl9NT0RFX0NCQworCQkmJiAoISAoKGgtPmZsYWdzICYgR0NSWV9DSVBIRVJfQ0JDX0NUUykKKwkJICAgICAgICYmIChpbmxlbiA+IGgtPmNpcGhlci0+YmxvY2tzaXplKSkpKSkKKwkgICAmJiAoaW5sZW4gJSBoLT5jaXBoZXItPmJsb2Nrc2l6ZSkpCisgICAgZXJyID0gR1BHX0VSUl9JTlZfQVJHOworICBlbHNlCisgICAgZXJyID0gY2lwaGVyX2VuY3J5cHQgKGgsIG91dCwgaW4sIGlubGVuKTsKKworICBpZiAoZXJyICYmIG91dCkKKyAgICBtZW1zZXQgKG91dCwgMHg0Miwgb3V0c2l6ZSk7IC8qIEZhaWxzYWZlOiBNYWtlIHN1cmUgdGhhdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWludGV4dCB3aWxsIG5ldmVyIG1ha2UgaXQgaW50bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VULiAqLworCisgIHJldHVybiBnY3J5X2Vycm9yIChlcnIpOworfQorCisKKworLyoqKioqKioqKioqKioqKioKKyAqIERlY3J5cHQgSU5CVUYgdG8gT1VUQlVGIHdpdGggdGhlIG1vZGUgc2VsZWN0ZWQgYXQgb3Blbi4KKyAqIGluYnVmIGFuZCBvdXRidWYgbWF5IG92ZXJsYXAgb3IgYmUgdGhlIHNhbWUuCisgKiBEZXBlbmRpbmcgb24gdGhlIG1vZGUgc29tZSBzb21lIGNvbnRyYWludHMgYXBwbHkgdG8gTkJZVEVTLgorICovCitzdGF0aWMgZ2NyeV9lcnJfY29kZV90CitjaXBoZXJfZGVjcnlwdCAoZ2NyeV9jaXBoZXJfaGRfdCBjLCBieXRlICpvdXRidWYsIGNvbnN0IGJ5dGUgKmluYnVmLAorCQl1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworICAgIGdjcnlfZXJyX2NvZGVfdCByYyA9IEdQR19FUlJfTk9fRVJST1I7CisKKyAgICBzd2l0Y2goIGMtPm1vZGUgKSB7CisgICAgICBjYXNlIEdDUllfQ0lQSEVSX01PREVfRUNCOgorCWlmICghKG5ieXRlcyVjLT5jaXBoZXItPmJsb2Nrc2l6ZSkpCisgICAgICAgICAgICBkb19lY2JfZGVjcnlwdChjLCBvdXRidWYsIGluYnVmLCBuYnl0ZXMvYy0+Y2lwaGVyLT5ibG9ja3NpemUgKTsKKyAgICAgICAgZWxzZSAKKyAgICAgICAgICAgIHJjID0gR1BHX0VSUl9JTlZfQVJHOworCWJyZWFrOworICAgICAgY2FzZSBHQ1JZX0NJUEhFUl9NT0RFX0NCQzoKKwlpZiAoIShuYnl0ZXMlYy0+Y2lwaGVyLT5ibG9ja3NpemUpCisgICAgICAgICAgICB8fCAobmJ5dGVzID4gYy0+Y2lwaGVyLT5ibG9ja3NpemUKKyAgICAgICAgICAgICAgICAmJiAoYy0+ZmxhZ3MgJiBHQ1JZX0NJUEhFUl9DQkNfQ1RTKSkpCisgICAgICAgICAgICBkb19jYmNfZGVjcnlwdChjLCBvdXRidWYsIGluYnVmLCBuYnl0ZXMgKTsKKyAgICAgICAgZWxzZSAKKyAgICAgICAgICAgIHJjID0gR1BHX0VSUl9JTlZfQVJHOworCWJyZWFrOworICAgICAgY2FzZSBHQ1JZX0NJUEhFUl9NT0RFX0NGQjoKKwlkb19jZmJfZGVjcnlwdChjLCBvdXRidWYsIGluYnVmLCBuYnl0ZXMgKTsKKwlicmVhazsKKyAgICAgIGNhc2UgR0NSWV9DSVBIRVJfTU9ERV9PRkI6CisJZG9fb2ZiX2RlY3J5cHQoYywgb3V0YnVmLCBpbmJ1ZiwgbmJ5dGVzICk7CisJYnJlYWs7CisgICAgICBjYXNlIEdDUllfQ0lQSEVSX01PREVfQ1RSOgorCWRvX2N0cl9kZWNyeXB0KGMsIG91dGJ1ZiwgaW5idWYsIG5ieXRlcyApOworCWJyZWFrOworICAgICAgY2FzZSBHQ1JZX0NJUEhFUl9NT0RFX1NUUkVBTToKKyAgICAgICAgYy0+Y2lwaGVyLT5zdGRlY3J5cHQgKCAmYy0+Y29udGV4dC5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGJ1ZiwgKGJ5dGUqKS8qYXJnZ2cqL2luYnVmLCBuYnl0ZXMgKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdDUllfQ0lQSEVSX01PREVfTk9ORToKKyAgICAgICAJaWYgKGZpcHNfbW9kZSAoKSB8fCAhX2djcnlfZ2V0X2RlYnVnX2ZsYWcgKDApKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGZpcHNfc2lnbmFsX2Vycm9yICgiY2lwaGVyIG1vZGUgTk9ORSB1c2VkIik7CisgICAgICAgICAgICByYyA9IEdQR19FUlJfSU5WX0NJUEhFUl9NT0RFOworICAgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpbmJ1ZiAhPSBvdXRidWYpCisgICAgICAgICAgICAgIG1lbW1vdmUgKG91dGJ1ZiwgaW5idWYsIG5ieXRlcyk7CisgICAgICAgICAgfQorCWJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgbG9nX2ZhdGFsICgiY2lwaGVyX2RlY3J5cHQ6IGludmFsaWQgbW9kZSAlZFxuIiwgYy0+bW9kZSApOworICAgICAgICByYyA9IEdQR19FUlJfSU5WX0NJUEhFUl9NT0RFOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisKK2djcnlfZXJyb3JfdAorZ2NyeV9jaXBoZXJfZGVjcnlwdCAoZ2NyeV9jaXBoZXJfaGRfdCBoLCB2b2lkICpvdXQsIHNpemVfdCBvdXRzaXplLAorCQkgICAgIGNvbnN0IHZvaWQgKmluLCBzaXplX3QgaW5sZW4pCit7CisgIGdjcnlfZXJyX2NvZGVfdCBlcnIgPSAwOworCisgIGlmIChoLT5tb2RlID09IEdDUllfQ0lQSEVSX01PREVfQUVTV1JBUCkKKyAgICB7CisgICAgICAvKiBIYWNrIHRvIGltcGxlbWVudCBBRVNXUkFQIHdpdGhvdXQgdG91Y2hpbmcgdGhlIG90aGVyIG1vZGVzLgorICAgICAgICAgVGhlIGFjdHVhbCBmdW5jdGlvbiBoYXMgYmVlbiB0YWtlbiBmcm9tIHRoZSBjdXJyZW50CisgICAgICAgICBkZXZlbG9wbWVudCB2ZXJzaW9uIHdoaWNoIGRvZXMgYWxsIGVycm9yIGNoZWNraW5nIGluIGVhY2gKKyAgICAgICAgIG1vZGUgZnVuY3Rpb24uICAqLworICAgICAgaWYgKCFpbikKKyAgICAgICAgZXJyID0gZG9fYWVzd3JhcF9kZWNyeXB0IChoLCBvdXQsIG91dHNpemUsIG91dCwgb3V0c2l6ZSk7CisgICAgICBlbHNlCisgICAgICAgIGVyciA9IGRvX2Flc3dyYXBfZGVjcnlwdCAoaCwgb3V0LCBvdXRzaXplLCBpbiwgaW5sZW4pOworICAgIH0KKyAgZWxzZSBpZiAoIWluKQorICAgIHsKKyAgICAgIC8qIENhbGxlciByZXF1ZXN0ZWQgaW4tcGxhY2UgZW5jcnlwdGlvbi4gKi8KKyAgICAgIC8qIEFjdHVhbGx5IGNpcGhlcl9lbmNyeXB0KCkgZG9lcyBub3QgbmVlZCB0byBrbm93IGFib3V0IGl0LCBidXQKKyAgICAgICAqIHdlIG1heSBjaGFuZ2UgaXQgaW4gdGhlIGZ1dHVyZSB0byBnZXQgYmV0dGVyIHBlcmZvcm1hbmNlLiAgKi8KKyAgICAgIGVyciA9IGNpcGhlcl9kZWNyeXB0IChoLCBvdXQsIG91dCwgb3V0c2l6ZSk7CisgICAgfQorICBlbHNlIGlmIChvdXRzaXplIDwgaW5sZW4pCisgICAgZXJyID0gR1BHX0VSUl9UT09fU0hPUlQ7CisgIGVsc2UgaWYgKCgoaC0+bW9kZSA9PSBHQ1JZX0NJUEhFUl9NT0RFX0VDQikKKwkgICAgfHwgKChoLT5tb2RlID09IEdDUllfQ0lQSEVSX01PREVfQ0JDKQorCQkmJiAoISAoKGgtPmZsYWdzICYgR0NSWV9DSVBIRVJfQ0JDX0NUUykKKwkJICAgICAgICYmIChpbmxlbiA+IGgtPmNpcGhlci0+YmxvY2tzaXplKSkpKSkKKwkgICAmJiAoaW5sZW4gJSBoLT5jaXBoZXItPmJsb2Nrc2l6ZSkgIT0gMCkKKyAgICBlcnIgPSBHUEdfRVJSX0lOVl9BUkc7CisgIGVsc2UKKyAgICBlcnIgPSBjaXBoZXJfZGVjcnlwdCAoaCwgb3V0LCBpbiwgaW5sZW4pOworCisgIHJldHVybiBnY3J5X2Vycm9yIChlcnIpOworfQorCisKKworLyoqKioqKioqKioqKioqKioKKyAqIFVzZWQgZm9yIFBHUCdzIHNvbWV3aGF0IHN0cmFuZ2UgQ0ZCIG1vZGUuIE9ubHkgd29ya3MgaWYKKyAqIHRoZSBjb3JyZXNwb25kaW5nIGZsYWcgaXMgc2V0LgorICovCitzdGF0aWMgdm9pZAorY2lwaGVyX3N5bmMgKGdjcnlfY2lwaGVyX2hkX3QgYykKK3sKKyAgaWYgKChjLT5mbGFncyAmIEdDUllfQ0lQSEVSX0VOQUJMRV9TWU5DKSAmJiBjLT51bnVzZWQpCisgICAgeworICAgICAgbWVtbW92ZSAoYy0+dV9pdi5pdiArIGMtPnVudXNlZCwKKyAgICAgICAgICAgICAgIGMtPnVfaXYuaXYsIGMtPmNpcGhlci0+YmxvY2tzaXplIC0gYy0+dW51c2VkKTsKKyAgICAgIG1lbWNweSAoYy0+dV9pdi5pdiwKKyAgICAgICAgICAgICAgYy0+bGFzdGl2ICsgYy0+Y2lwaGVyLT5ibG9ja3NpemUgLSBjLT51bnVzZWQsIGMtPnVudXNlZCk7CisgICAgICBjLT51bnVzZWQgPSAwOworICAgIH0KK30KKworCitnY3J5X2Vycm9yX3QKK19nY3J5X2NpcGhlcl9zZXRrZXkgKGdjcnlfY2lwaGVyX2hkX3QgaGQsIGNvbnN0IHZvaWQgKmtleSwgc2l6ZV90IGtleWxlbikKK3sKKyAgcmV0dXJuIGNpcGhlcl9zZXRrZXkgKGhkLCAodm9pZCopa2V5LCBrZXlsZW4pOworfQorCisKK2djcnlfZXJyb3JfdAorX2djcnlfY2lwaGVyX3NldGl2IChnY3J5X2NpcGhlcl9oZF90IGhkLCBjb25zdCB2b2lkICppdiwgc2l6ZV90IGl2bGVuKQoreworICBjaXBoZXJfc2V0aXYgKGhkLCBpdiwgaXZsZW4pOworICByZXR1cm4gMDsKK30KKworLyogU2V0IGNvdW50ZXIgZm9yIENUUiBtb2RlLiAgKENUUixDVFJMRU4pIG11c3QgZGVub3RlIGEgYnVmZmVyIG9mCisgICBibG9jayBzaXplIGxlbmd0aCwgb3IgKE5VTEwsMCkgdG8gc2V0IHRoZSBDVFIgdG8gdGhlIGFsbC16ZXJvCisgICBibG9jay4gKi8KK2dwZ19lcnJvcl90CitfZ2NyeV9jaXBoZXJfc2V0Y3RyIChnY3J5X2NpcGhlcl9oZF90IGhkLCBjb25zdCB2b2lkICpjdHIsIHNpemVfdCBjdHJsZW4pCit7CisgIGlmIChjdHIgJiYgY3RybGVuID09IGhkLT5jaXBoZXItPmJsb2Nrc2l6ZSkKKyAgICBtZW1jcHkgKGhkLT5jdHIsIGN0ciwgaGQtPmNpcGhlci0+YmxvY2tzaXplKTsKKyAgZWxzZSBpZiAoIWN0ciB8fCAhY3RybGVuKQorICAgIG1lbXNldCAoaGQtPmN0ciwgMCwgaGQtPmNpcGhlci0+YmxvY2tzaXplKTsKKyAgZWxzZQorICAgIHJldHVybiBncGdfZXJyb3IgKEdQR19FUlJfSU5WX0FSRyk7CisgIHJldHVybiAwOworfQorCisKK2djcnlfZXJyb3JfdAorZ2NyeV9jaXBoZXJfY3RsKCBnY3J5X2NpcGhlcl9oZF90IGgsIGludCBjbWQsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ1ZmxlbikKK3sKKyAgZ2NyeV9lcnJfY29kZV90IHJjID0gR1BHX0VSUl9OT19FUlJPUjsKKworICBzd2l0Y2ggKGNtZCkKKyAgICB7CisgICAgY2FzZSBHQ1JZQ1RMX1NFVF9LRVk6ICAvKiBEZXByZWNhdGVkOyB1c2UgZ2NyeV9jaXBoZXJfc2V0a2V5LiAgKi8KKyAgICAgIHJjID0gY2lwaGVyX3NldGtleSggaCwgYnVmZmVyLCBidWZsZW4gKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBHQ1JZQ1RMX1NFVF9JVjogICAvKiBEZXByZWNhdGVkOyB1c2UgZ2NyeV9jaXBoZXJfc2V0aXYuICAqLworICAgICAgY2lwaGVyX3NldGl2KCBoLCBidWZmZXIsIGJ1ZmxlbiApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdDUllDVExfUkVTRVQ6CisgICAgICBjaXBoZXJfcmVzZXQgKGgpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdDUllDVExfQ0ZCX1NZTkM6CisgICAgICBjaXBoZXJfc3luYyggaCApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdDUllDVExfU0VUX0NCQ19DVFM6CisgICAgICBpZiAoYnVmbGVuKQorCWlmIChoLT5mbGFncyAmIEdDUllfQ0lQSEVSX0NCQ19NQUMpCisJICByYyA9IEdQR19FUlJfSU5WX0ZMQUc7CisJZWxzZQorCSAgaC0+ZmxhZ3MgfD0gR0NSWV9DSVBIRVJfQ0JDX0NUUzsKKyAgICAgIGVsc2UKKwloLT5mbGFncyAmPSB+R0NSWV9DSVBIRVJfQ0JDX0NUUzsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBHQ1JZQ1RMX1NFVF9DQkNfTUFDOgorICAgICAgaWYgKGJ1ZmxlbikKKwlpZiAoaC0+ZmxhZ3MgJiBHQ1JZX0NJUEhFUl9DQkNfQ1RTKQorCSAgcmMgPSBHUEdfRVJSX0lOVl9GTEFHOworCWVsc2UKKwkgIGgtPmZsYWdzIHw9IEdDUllfQ0lQSEVSX0NCQ19NQUM7CisgICAgICBlbHNlCisJaC0+ZmxhZ3MgJj0gfkdDUllfQ0lQSEVSX0NCQ19NQUM7CisgICAgICBicmVhazsKKworICAgIGNhc2UgR0NSWUNUTF9ESVNBQkxFX0FMR086CisgICAgICAvKiBUaGlzIGNvbW1hbmQgZXhwZWN0cyBOVUxMIGZvciBIIGFuZCBCVUZGRVIgdG8gcG9pbnQgdG8gYW4KKyAgICAgICAgIGludGVnZXIgd2l0aCB0aGUgYWxnbyBudW1iZXIuICAqLworICAgICAgaWYoIGggfHwgIWJ1ZmZlciB8fCBidWZsZW4gIT0gc2l6ZW9mKGludCkgKQorCXJldHVybiBnY3J5X2Vycm9yIChHUEdfRVJSX0NJUEhFUl9BTEdPKTsKKyAgICAgIGRpc2FibGVfY2lwaGVyX2FsZ28oICooaW50KilidWZmZXIgKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBHQ1JZQ1RMX1NFVF9DVFI6IC8qIERlcHJlY2F0ZWQ7IHVzZSBnY3J5X2NpcGhlcl9zZXRjdHIuICAqLworICAgICAgaWYgKGJ1ZmZlciAmJiBidWZsZW4gPT0gaC0+Y2lwaGVyLT5ibG9ja3NpemUpCisJbWVtY3B5IChoLT5jdHIsIGJ1ZmZlciwgaC0+Y2lwaGVyLT5ibG9ja3NpemUpOworICAgICAgZWxzZSBpZiAoYnVmZmVyID09IE5VTEwgfHwgYnVmbGVuID09IDApCisJbWVtc2V0IChoLT5jdHIsIDAsIGgtPmNpcGhlci0+YmxvY2tzaXplKTsKKyAgICAgIGVsc2UKKwlyYyA9IEdQR19FUlJfSU5WX0FSRzsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSA2MTogIC8qIERpc2FibGUgd2VhayBrZXkgZGV0ZWN0aW9uIChwcml2YXRlKS4gICovCisgICAgICBpZiAoaC0+ZXh0cmFzcGVjLT5zZXRfZXh0cmFfaW5mbykKKyAgICAgICAgcmMgPSBoLT5leHRyYXNwZWMtPnNldF9leHRyYV9pbmZvIAorICAgICAgICAgICgmaC0+Y29udGV4dC5jLCBDSVBIRVJfSU5GT19OT19XRUFLX0tFWSwgTlVMTCwgMCk7CisgICAgICBlbHNlCisgICAgICAgIHJjID0gR1BHX0VSUl9OT1RfU1VQUE9SVEVEOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDYyOiAvKiBSZXR1cm4gY3VycmVudCBpbnB1dCB2ZWN0b3IgKHByaXZhdGUpLiAgKi8KKyAgICAgIC8qIFRoaXMgaXMgdGhlIGlucHV0IGJsb2NrIGFzIHVzZWQgaW4gQ0ZCIGFuZCBPRkIgbW9kZSB3aGljaCBoYXMKKyAgICAgICAgIGluaXRpYWxseSBiZWVuIHNldCBhcyBJVi4gIFRoZSByZXR1cm5lZCBmb3JtYXQgaXM6IAorICAgICAgICAgICAxIGJ5dGUgIEFjdHVhbCBsZW5ndGggb2YgdGhlIGJsb2NrIGluIGJ5dGVzLgorICAgICAgICAgICBuIGJ5dGUgIFRoZSBibG9jay4KKyAgICAgICAgIElmIHRoZSBwcm92aWRlZCBidWZmZXIgaXMgdG9vIHNob3J0LCBhbiBlcnJvciBpcyByZXR1cm5lZC4gKi8KKyAgICAgIGlmIChidWZsZW4gPCAoMSArIGgtPmNpcGhlci0+YmxvY2tzaXplKSkKKyAgICAgICAgcmMgPSBHUEdfRVJSX1RPT19TSE9SVDsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKml2cDsKKyAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkc3QgPSBidWZmZXI7CisgICAgICAgICAgaW50IG4gPSBoLT51bnVzZWQ7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKCFuKQorICAgICAgICAgICAgbiA9IGgtPmNpcGhlci0+YmxvY2tzaXplOworICAgICAgICAgIGdjcnlfYXNzZXJ0IChuIDw9IGgtPmNpcGhlci0+YmxvY2tzaXplKTsKKyAgICAgICAgICAqZHN0KysgPSBuOworICAgICAgICAgIGl2cCA9IGgtPnVfaXYuaXYgKyBoLT5jaXBoZXItPmJsb2Nrc2l6ZSAtIG47CisgICAgICAgICAgd2hpbGUgKG4tLSkKKyAgICAgICAgICAgICpkc3QrKyA9ICppdnArKzsKKyAgICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmMgPSBHUEdfRVJSX0lOVl9PUDsKKyAgICB9CisKKyAgcmV0dXJuIGdjcnlfZXJyb3IgKHJjKTsKK30KKworCisvKiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNpcGhlciBoYW5kbGUgSC4gIENNRCBpcyB0aGUga2luZCBvZgorICAgaW5mb3JtYXRpb24gcmVxdWVzdGVkLiAgQlVGRkVSIGFuZCBOQllURVMgYXJlIHJlc2VydmVkIGZvciBub3cuCisKKyAgIFRoZXJlIGFyZSBubyB2YWx1ZXMgZm9yIENNRCB5ZXQgZGVmaW5lZC4gIAorCisgICBUaGUgZnVjbnRpb24gYWx3YXlzIHJldHVybnMgR1BHX0VSUl9JTlZfT1AuCisgICAKKyAqLworZ2NyeV9lcnJvcl90CitnY3J5X2NpcGhlcl9pbmZvIChnY3J5X2NpcGhlcl9oZF90IGgsIGludCBjbWQsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90ICpuYnl0ZXMpCit7CisgIGdjcnlfZXJyX2NvZGVfdCBlcnIgPSBHUEdfRVJSX05PX0VSUk9SOworCisgICh2b2lkKWg7CisgICh2b2lkKWJ1ZmZlcjsKKyAgKHZvaWQpbmJ5dGVzOworCisgIHN3aXRjaCAoY21kKQorICAgIHsKKyAgICBkZWZhdWx0OgorICAgICAgZXJyID0gR1BHX0VSUl9JTlZfT1A7CisgICAgfQorCisgIHJldHVybiBnY3J5X2Vycm9yIChlcnIpOworfQorCisvKiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGdpdmVuIGNpcGhlciBhbGdvcml0aG0gQUxHTy4KKworICAgV0hBVCBzZWxlY3QgdGhlIGtpbmQgb2YgaW5mb3JtYXRpb24gcmV0dXJuZWQ6CisKKyAgICBHQ1JZQ1RMX0dFVF9LRVlMRU46CisgIAlSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUga2V5LiAgSWYgdGhlIGFsZ29yaXRobSBBTEdPCisgIAlzdXBwb3J0cyBtdWx0aXBsZSBrZXkgbGVuZ3RocywgdGhlIG1heGltdW0gc3VwcG9ydGVkIGtleSBsZW5ndGgKKyAgCWlzIHJldHVybmVkLiAgVGhlIGtleSBsZW5ndGggaXMgcmV0dXJuZWQgYXMgbnVtYmVyIG9mIG9jdGV0cy4KKyAgCUJVRkZFUiBhbmQgTkJZVEVTIG11c3QgYmUgemVyby4KKworICAgIEdDUllDVExfR0VUX0JMS0xFTjoKKyAgCVJldHVybiB0aGUgYmxvY2tsZW5ndGggb2YgdGhlIGFsZ29yaXRobSBBTEdPIGNvdW50ZWQgaW4gb2N0ZXRzLgorICAJQlVGRkVSIGFuZCBOQllURVMgbXVzdCBiZSB6ZXJvLgorCisgICAgR0NSWUNUTF9URVNUX0FMR086CisgIAlSZXR1cm5zIDAgaWYgdGhlIHNwZWNpZmllZCBhbGdvcml0aG0gQUxHTyBpcyBhdmFpbGFibGUgZm9yIHVzZS4KKyAgCUJVRkZFUiBhbmQgTkJZVEVTIG11c3QgYmUgemVyby4KKyAgCisgICBOb3RlOiBCZWNhdXNlIHRoaXMgZnVuY3Rpb24gaXMgaW4gbW9zdCBjYXNlcyB1c2VkIHRvIHJldHVybiBhbgorICAgaW50ZWdlciB2YWx1ZSwgd2UgY2FuIG1ha2UgaXQgZWFzaWVyIGZvciB0aGUgY2FsbGVyIHRvIGp1c3QgbG9vayBhdAorICAgdGhlIHJldHVybiB2YWx1ZS4gIFRoZSBjYWxsZXIgd2lsbCBpbiBhbGwgY2FzZXMgY29uc3VsdCB0aGUgdmFsdWUKKyAgIGFuZCB0aGVyZWJ5IGRldGVjdGluZyB3aGV0aGVyIGEgZXJyb3Igb2NjdXJlZCBvciBub3QgKGkuZS4gd2hpbGUKKyAgIGNoZWNraW5nIHRoZSBibG9jayBzaXplKQorICovCitnY3J5X2Vycm9yX3QKK2djcnlfY2lwaGVyX2FsZ29faW5mbyAoaW50IGFsZ28sIGludCB3aGF0LCB2b2lkICpidWZmZXIsIHNpemVfdCAqbmJ5dGVzKQoreworICBnY3J5X2Vycl9jb2RlX3QgZXJyID0gR1BHX0VSUl9OT19FUlJPUjsKKyAgdW5zaWduZWQgaW50IHVpOworCisgIHN3aXRjaCAod2hhdCkKKyAgICB7CisgICAgY2FzZSBHQ1JZQ1RMX0dFVF9LRVlMRU46CisgICAgICBpZiAoYnVmZmVyIHx8ICghIG5ieXRlcykpCisJZXJyID0gR1BHX0VSUl9DSVBIRVJfQUxHTzsKKyAgICAgIGVsc2UKKwl7CisJICB1aSA9IGNpcGhlcl9nZXRfa2V5bGVuIChhbGdvKTsKKwkgIGlmICgodWkgPiAwKSAmJiAodWkgPD0gNTEyKSkKKwkgICAgKm5ieXRlcyA9IChzaXplX3QpIHVpIC8gODsKKwkgIGVsc2UKKwkgICAgLyogVGhlIG9ubHkgcmVhc29uIGlzIGFuIGludmFsaWQgYWxnbyBvciBhIHN0cmFuZ2UKKwkgICAgICAgYmxvY2tzaXplLiAgKi8KKwkgICAgZXJyID0gR1BHX0VSUl9DSVBIRVJfQUxHTzsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgR0NSWUNUTF9HRVRfQkxLTEVOOgorICAgICAgaWYgKGJ1ZmZlciB8fCAoISBuYnl0ZXMpKQorCWVyciA9IEdQR19FUlJfQ0lQSEVSX0FMR087CisgICAgICBlbHNlCisJeworCSAgdWkgPSBjaXBoZXJfZ2V0X2Jsb2Nrc2l6ZSAoYWxnbyk7CisJICBpZiAoKHVpID4gMCkgJiYgKHVpIDwgMTAwMDApKQorCSAgICAqbmJ5dGVzID0gdWk7CisJICBlbHNlCisJICAgIC8qIFRoZSBvbmx5IHJlYXNvbiBpcyBhbiBpbnZhbGlkIGFsZ28gb3IgYSBzdHJhbmdlCisJICAgICAgIGJsb2Nrc2l6ZS4gICovCisJICAgIGVyciA9IEdQR19FUlJfQ0lQSEVSX0FMR087CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdDUllDVExfVEVTVF9BTEdPOgorICAgICAgaWYgKGJ1ZmZlciB8fCBuYnl0ZXMpCisJZXJyID0gR1BHX0VSUl9JTlZfQVJHOworICAgICAgZWxzZQorCWVyciA9IGNoZWNrX2NpcGhlcl9hbGdvIChhbGdvKTsKKyAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorCWVyciA9IEdQR19FUlJfSU5WX09QOworICAgIH0KKworICByZXR1cm4gZ2NyeV9lcnJvciAoZXJyKTsKK30KKworCisvKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgbGVuZ3RoIG9mIHRoZSBrZXkgZm9yIGFsZ29yaXRobSBBTEdPLiAgSWYgdGhlCisgICBhbGdvcml0aG0gc3VwcG9ydHMgbXVsdGlwbGUga2V5IGxlbmd0aHMsIHRoZSBtYXhpbXVtIHN1cHBvcnRlZCBrZXkKKyAgIGxlbmd0aCBpcyByZXR1cm5lZC4gIE9uIGVycm9yIDAgaXMgcmV0dXJuZWQuICBUaGUga2V5IGxlbmd0aCBpcworICAgcmV0dXJuZWQgYXMgbnVtYmVyIG9mIG9jdGV0cy4KKworICAgVGhpcyBpcyBhIGNvbnZlbmllbmNlIGZ1bmN0aW9ucyB3aGljaCBzaG91bGQgYmUgcHJlZmVycmVkIG92ZXIKKyAgIGdjcnlfY2lwaGVyX2FsZ29faW5mbyBiZWNhdXNlIGl0IGFsbG93cyBmb3IgcHJvcGVyIHR5cGUKKyAgIGNoZWNraW5nLiAgKi8KK3NpemVfdAorZ2NyeV9jaXBoZXJfZ2V0X2FsZ29fa2V5bGVuIChpbnQgYWxnbykgCit7CisgIHNpemVfdCBuOworCisgIGlmIChnY3J5X2NpcGhlcl9hbGdvX2luZm8gKGFsZ28sIEdDUllDVExfR0VUX0tFWUxFTiwgTlVMTCwgJm4pKQorICAgIG4gPSAwOworICByZXR1cm4gbjsKK30KKworLyogVGhpcyBmdW5jdGlvbnMgcmV0dXJucyB0aGUgYmxvY2tsZW5ndGggb2YgdGhlIGFsZ29yaXRobSBBTEdPCisgICBjb3VudGVkIGluIG9jdGV0cy4gIE9uIGVycm9yIDAgaXMgcmV0dXJuZWQuCisKKyAgIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBmdW5jdGlvbnMgd2hpY2ggc2hvdWxkIGJlIHByZWZlcnJlZCBvdmVyCisgICBnY3J5X2NpcGhlcl9hbGdvX2luZm8gYmVjYXVzZSBpdCBhbGxvd3MgZm9yIHByb3BlciB0eXBlCisgICBjaGVja2luZy4gICovCitzaXplX3QKK2djcnlfY2lwaGVyX2dldF9hbGdvX2Jsa2xlbiAoaW50IGFsZ28pIAoreworICBzaXplX3QgbjsKKworICBpZiAoZ2NyeV9jaXBoZXJfYWxnb19pbmZvKCBhbGdvLCBHQ1JZQ1RMX0dFVF9CTEtMRU4sIE5VTEwsICZuKSkKKyAgICBuID0gMDsKKyAgcmV0dXJuIG47Cit9CisKKy8qIEV4cGxpY2l0bHkgaW5pdGlhbGl6ZSB0aGlzIG1vZHVsZS4gICovCitnY3J5X2Vycl9jb2RlX3QKK19nY3J5X2NpcGhlcl9pbml0ICh2b2lkKQoreworICBnY3J5X2Vycl9jb2RlX3QgZXJyID0gR1BHX0VSUl9OT19FUlJPUjsKKworICBSRUdJU1RFUl9ERUZBVUxUX0NJUEhFUlM7CisKKyAgcmV0dXJuIGVycjsKK30KKworLyogR2V0IGEgbGlzdCBjb25zaXN0aW5nIG9mIHRoZSBJRHMgb2YgdGhlIGxvYWRlZCBjaXBoZXIgbW9kdWxlcy4gIElmCisgICBMSVNUIGlzIHplcm8sIHdyaXRlIHRoZSBudW1iZXIgb2YgbG9hZGVkIGNpcGhlciBtb2R1bGVzIHRvCisgICBMSVNUX0xFTkdUSCBhbmQgcmV0dXJuLiAgSWYgTElTVCBpcyBub24temVybywgdGhlIGZpcnN0CisgICAqTElTVF9MRU5HVEggYWxnb3JpdGhtIElEcyBhcmUgc3RvcmVkIGluIExJU1QsIHdoaWNoIG11c3QgYmUgb2YKKyAgIGFjY29yZGluZyBzaXplLiAgSW4gY2FzZSB0aGVyZSBhcmUgbGVzcyBjaXBoZXIgbW9kdWxlcyB0aGFuCisgICAqTElTVF9MRU5HVEgsICpMSVNUX0xFTkdUSCBpcyB1cGRhdGVkIHRvIHRoZSBjb3JyZWN0IG51bWJlci4gICovCitnY3J5X2Vycm9yX3QKK2djcnlfY2lwaGVyX2xpc3QgKGludCAqbGlzdCwgaW50ICpsaXN0X2xlbmd0aCkKK3sKKyAgZ2NyeV9lcnJfY29kZV90IGVyciA9IEdQR19FUlJfTk9fRVJST1I7CisKKyAgYXRoX211dGV4X2xvY2sgKCZjaXBoZXJzX3JlZ2lzdGVyZWRfbG9jayk7CisgIGVyciA9IF9nY3J5X21vZHVsZV9saXN0IChjaXBoZXJzX3JlZ2lzdGVyZWQsIGxpc3QsIGxpc3RfbGVuZ3RoKTsKKyAgYXRoX211dGV4X3VubG9jayAoJmNpcGhlcnNfcmVnaXN0ZXJlZF9sb2NrKTsKKworICByZXR1cm4gZXJyOworfQorCisKKy8qIFJ1biB0aGUgc2VsZnRlc3RzIGZvciBjaXBoZXIgYWxnb3JpdGhtIEFMR08gd2l0aCBvcHRpb25hbCByZXBvcnRpbmcKKyAgIGZ1bmN0aW9uIFJFUE9SVC4gICovCitncGdfZXJyb3JfdAorX2djcnlfY2lwaGVyX3NlbGZ0ZXN0IChpbnQgYWxnbywgaW50IGV4dGVuZGVkLCBzZWxmdGVzdF9yZXBvcnRfZnVuY190IHJlcG9ydCkKK3sKKyAgZ2NyeV9tb2R1bGVfdCBtb2R1bGUgPSBOVUxMOworICBjaXBoZXJfZXh0cmFfc3BlY190ICpleHRyYXNwZWMgPSBOVUxMOworICBnY3J5X2Vycl9jb2RlX3QgZWMgPSAwOworCisgIFJFR0lTVEVSX0RFRkFVTFRfQ0lQSEVSUzsKKworICBhdGhfbXV0ZXhfbG9jayAoJmNpcGhlcnNfcmVnaXN0ZXJlZF9sb2NrKTsKKyAgbW9kdWxlID0gX2djcnlfbW9kdWxlX2xvb2t1cF9pZCAoY2lwaGVyc19yZWdpc3RlcmVkLCBhbGdvKTsKKyAgaWYgKG1vZHVsZSAmJiAhKG1vZHVsZS0+ZmxhZ3MgJiBGTEFHX01PRFVMRV9ESVNBQkxFRCkpCisgICAgZXh0cmFzcGVjID0gbW9kdWxlLT5leHRyYXNwZWM7CisgIGF0aF9tdXRleF91bmxvY2sgKCZjaXBoZXJzX3JlZ2lzdGVyZWRfbG9jayk7CisgIGlmIChleHRyYXNwZWMgJiYgZXh0cmFzcGVjLT5zZWxmdGVzdCkKKyAgICBlYyA9IGV4dHJhc3BlYy0+c2VsZnRlc3QgKGFsZ28sIGV4dGVuZGVkLCByZXBvcnQpOworICBlbHNlCisgICAgeworICAgICAgZWMgPSBHUEdfRVJSX0NJUEhFUl9BTEdPOworICAgICAgaWYgKHJlcG9ydCkKKyAgICAgICAgcmVwb3J0ICgiY2lwaGVyIiwgYWxnbywgIm1vZHVsZSIsIAorICAgICAgICAgICAgICAgIG1vZHVsZSAmJiAhKG1vZHVsZS0+ZmxhZ3MgJiBGTEFHX01PRFVMRV9ESVNBQkxFRCk/CisgICAgICAgICAgICAgICAgIm5vIHNlbGZ0ZXN0IGF2YWlsYWJsZSIgOgorICAgICAgICAgICAgICAgIG1vZHVsZT8gImFsZ29yaXRobSBkaXNhYmxlZCIgOiAiYWxnb3JpdGhtIG5vdCBmb3VuZCIpOworICAgIH0KKworICBpZiAobW9kdWxlKQorICAgIHsKKyAgICAgIGF0aF9tdXRleF9sb2NrICgmY2lwaGVyc19yZWdpc3RlcmVkX2xvY2spOworICAgICAgX2djcnlfbW9kdWxlX3JlbGVhc2UgKG1vZHVsZSk7CisgICAgICBhdGhfbXV0ZXhfdW5sb2NrICgmY2lwaGVyc19yZWdpc3RlcmVkX2xvY2spOworICAgIH0KKyAgcmV0dXJuIGdwZ19lcnJvciAoZWMpOworfQpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L2NpcGhlci9jcmMuYyBiL2xpYmdjcnlwdC0xLjQuNi9jaXBoZXIvY3JjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA0ZmZmOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9jaXBoZXIvY3JjLmMKQEAgLTAsMCArMSwyOTcgQEAKKy8qIGNyYy5jIC0gQ3ljbGljIHJlZHVuZGFuY3kgY2hlY2tzLgorICogQ29weXJpZ2h0IChDKSAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnMTBsaWIuaCIKKyNpbmNsdWRlICJtZW1vcnkuaCIKKyNpbmNsdWRlICJjaXBoZXIuaCIKKworI2luY2x1ZGUgImJpdGhlbHAuaCIKKworLyogVGFibGUgb2YgQ1JDcyBvZiBhbGwgOC1iaXQgbWVzc2FnZXMuICBHZW5lcmF0ZWQgYnkgcnVubmluZyBjb2RlCisgICBmcm9tIFJGQyAxOTUyIG1vZGlmaWVkIHRvIHByaW50IG91dCB0aGUgdGFibGUuICovCitzdGF0aWMgdTMyIGNyYzMyX3RhYmxlWzI1Nl0gPSB7CisgIDB4MDAwMDAwMDAsIDB4NzcwNzMwOTYsIDB4ZWUwZTYxMmMsIDB4OTkwOTUxYmEsIDB4MDc2ZGM0MTksIDB4NzA2YWY0OGYsCisgIDB4ZTk2M2E1MzUsIDB4OWU2NDk1YTMsIDB4MGVkYjg4MzIsIDB4NzlkY2I4YTQsIDB4ZTBkNWU5MWUsIDB4OTdkMmQ5ODgsCisgIDB4MDliNjRjMmIsIDB4N2ViMTdjYmQsIDB4ZTdiODJkMDcsIDB4OTBiZjFkOTEsIDB4MWRiNzEwNjQsIDB4NmFiMDIwZjIsCisgIDB4ZjNiOTcxNDgsIDB4ODRiZTQxZGUsIDB4MWFkYWQ0N2QsIDB4NmRkZGU0ZWIsIDB4ZjRkNGI1NTEsIDB4ODNkMzg1YzcsCisgIDB4MTM2Yzk4NTYsIDB4NjQ2YmE4YzAsIDB4ZmQ2MmY5N2EsIDB4OGE2NWM5ZWMsIDB4MTQwMTVjNGYsIDB4NjMwNjZjZDksCisgIDB4ZmEwZjNkNjMsIDB4OGQwODBkZjUsIDB4M2I2ZTIwYzgsIDB4NGM2OTEwNWUsIDB4ZDU2MDQxZTQsIDB4YTI2NzcxNzIsCisgIDB4M2MwM2U0ZDEsIDB4NGIwNGQ0NDcsIDB4ZDIwZDg1ZmQsIDB4YTUwYWI1NmIsIDB4MzViNWE4ZmEsIDB4NDJiMjk4NmMsCisgIDB4ZGJiYmM5ZDYsIDB4YWNiY2Y5NDAsIDB4MzJkODZjZTMsIDB4NDVkZjVjNzUsIDB4ZGNkNjBkY2YsIDB4YWJkMTNkNTksCisgIDB4MjZkOTMwYWMsIDB4NTFkZTAwM2EsIDB4YzhkNzUxODAsIDB4YmZkMDYxMTYsIDB4MjFiNGY0YjUsIDB4NTZiM2M0MjMsCisgIDB4Y2ZiYTk1OTksIDB4YjhiZGE1MGYsIDB4MjgwMmI4OWUsIDB4NWYwNTg4MDgsIDB4YzYwY2Q5YjIsIDB4YjEwYmU5MjQsCisgIDB4MmY2ZjdjODcsIDB4NTg2ODRjMTEsIDB4YzE2MTFkYWIsIDB4YjY2NjJkM2QsIDB4NzZkYzQxOTAsIDB4MDFkYjcxMDYsCisgIDB4OThkMjIwYmMsIDB4ZWZkNTEwMmEsIDB4NzFiMTg1ODksIDB4MDZiNmI1MWYsIDB4OWZiZmU0YTUsIDB4ZThiOGQ0MzMsCisgIDB4NzgwN2M5YTIsIDB4MGYwMGY5MzQsIDB4OTYwOWE4OGUsIDB4ZTEwZTk4MTgsIDB4N2Y2YTBkYmIsIDB4MDg2ZDNkMmQsCisgIDB4OTE2NDZjOTcsIDB4ZTY2MzVjMDEsIDB4NmI2YjUxZjQsIDB4MWM2YzYxNjIsIDB4ODU2NTMwZDgsIDB4ZjI2MjAwNGUsCisgIDB4NmMwNjk1ZWQsIDB4MWIwMWE1N2IsIDB4ODIwOGY0YzEsIDB4ZjUwZmM0NTcsIDB4NjViMGQ5YzYsIDB4MTJiN2U5NTAsCisgIDB4OGJiZWI4ZWEsIDB4ZmNiOTg4N2MsIDB4NjJkZDFkZGYsIDB4MTVkYTJkNDksIDB4OGNkMzdjZjMsIDB4ZmJkNDRjNjUsCisgIDB4NGRiMjYxNTgsIDB4M2FiNTUxY2UsIDB4YTNiYzAwNzQsIDB4ZDRiYjMwZTIsIDB4NGFkZmE1NDEsIDB4M2RkODk1ZDcsCisgIDB4YTRkMWM0NmQsIDB4ZDNkNmY0ZmIsIDB4NDM2OWU5NmEsIDB4MzQ2ZWQ5ZmMsIDB4YWQ2Nzg4NDYsIDB4ZGE2MGI4ZDAsCisgIDB4NDQwNDJkNzMsIDB4MzMwMzFkZTUsIDB4YWEwYTRjNWYsIDB4ZGQwZDdjYzksIDB4NTAwNTcxM2MsIDB4MjcwMjQxYWEsCisgIDB4YmUwYjEwMTAsIDB4YzkwYzIwODYsIDB4NTc2OGI1MjUsIDB4MjA2Zjg1YjMsIDB4Yjk2NmQ0MDksIDB4Y2U2MWU0OWYsCisgIDB4NWVkZWY5MGUsIDB4MjlkOWM5OTgsIDB4YjBkMDk4MjIsIDB4YzdkN2E4YjQsIDB4NTliMzNkMTcsIDB4MmViNDBkODEsCisgIDB4YjdiZDVjM2IsIDB4YzBiYTZjYWQsIDB4ZWRiODgzMjAsIDB4OWFiZmIzYjYsIDB4MDNiNmUyMGMsIDB4NzRiMWQyOWEsCisgIDB4ZWFkNTQ3MzksIDB4OWRkMjc3YWYsIDB4MDRkYjI2MTUsIDB4NzNkYzE2ODMsIDB4ZTM2MzBiMTIsIDB4OTQ2NDNiODQsCisgIDB4MGQ2ZDZhM2UsIDB4N2E2YTVhYTgsIDB4ZTQwZWNmMGIsIDB4OTMwOWZmOWQsIDB4MGEwMGFlMjcsIDB4N2QwNzllYjEsCisgIDB4ZjAwZjkzNDQsIDB4ODcwOGEzZDIsIDB4MWUwMWYyNjgsIDB4NjkwNmMyZmUsIDB4Zjc2MjU3NWQsIDB4ODA2NTY3Y2IsCisgIDB4MTk2YzM2NzEsIDB4NmU2YjA2ZTcsIDB4ZmVkNDFiNzYsIDB4ODlkMzJiZTAsIDB4MTBkYTdhNWEsIDB4NjdkZDRhY2MsCisgIDB4ZjliOWRmNmYsIDB4OGViZWVmZjksIDB4MTdiN2JlNDMsIDB4NjBiMDhlZDUsIDB4ZDZkNmEzZTgsIDB4YTFkMTkzN2UsCisgIDB4MzhkOGMyYzQsIDB4NGZkZmYyNTIsIDB4ZDFiYjY3ZjEsIDB4YTZiYzU3NjcsIDB4M2ZiNTA2ZGQsIDB4NDhiMjM2NGIsCisgIDB4ZDgwZDJiZGEsIDB4YWYwYTFiNGMsIDB4MzYwMzRhZjYsIDB4NDEwNDdhNjAsIDB4ZGY2MGVmYzMsIDB4YTg2N2RmNTUsCisgIDB4MzE2ZThlZWYsIDB4NDY2OWJlNzksIDB4Y2I2MWIzOGMsIDB4YmM2NjgzMWEsIDB4MjU2ZmQyYTAsIDB4NTI2OGUyMzYsCisgIDB4Y2MwYzc3OTUsIDB4YmIwYjQ3MDMsIDB4MjIwMjE2YjksIDB4NTUwNTI2MmYsIDB4YzViYTNiYmUsIDB4YjJiZDBiMjgsCisgIDB4MmJiNDVhOTIsIDB4NWNiMzZhMDQsIDB4YzJkN2ZmYTcsIDB4YjVkMGNmMzEsIDB4MmNkOTllOGIsIDB4NWJkZWFlMWQsCisgIDB4OWI2NGMyYjAsIDB4ZWM2M2YyMjYsIDB4NzU2YWEzOWMsIDB4MDI2ZDkzMGEsIDB4OWMwOTA2YTksIDB4ZWIwZTM2M2YsCisgIDB4NzIwNzY3ODUsIDB4MDUwMDU3MTMsIDB4OTViZjRhODIsIDB4ZTJiODdhMTQsIDB4N2JiMTJiYWUsIDB4MGNiNjFiMzgsCisgIDB4OTJkMjhlOWIsIDB4ZTVkNWJlMGQsIDB4N2NkY2VmYjcsIDB4MGJkYmRmMjEsIDB4ODZkM2QyZDQsIDB4ZjFkNGUyNDIsCisgIDB4NjhkZGIzZjgsIDB4MWZkYTgzNmUsIDB4ODFiZTE2Y2QsIDB4ZjZiOTI2NWIsIDB4NmZiMDc3ZTEsIDB4MThiNzQ3NzcsCisgIDB4ODgwODVhZTYsIDB4ZmYwZjZhNzAsIDB4NjYwNjNiY2EsIDB4MTEwMTBiNWMsIDB4OGY2NTllZmYsIDB4Zjg2MmFlNjksCisgIDB4NjE2YmZmZDMsIDB4MTY2Y2NmNDUsIDB4YTAwYWUyNzgsIDB4ZDcwZGQyZWUsIDB4NGUwNDgzNTQsIDB4MzkwM2IzYzIsCisgIDB4YTc2NzI2NjEsIDB4ZDA2MDE2ZjcsIDB4NDk2OTQ3NGQsIDB4M2U2ZTc3ZGIsIDB4YWVkMTZhNGEsIDB4ZDlkNjVhZGMsCisgIDB4NDBkZjBiNjYsIDB4MzdkODNiZjAsIDB4YTliY2FlNTMsIDB4ZGViYjllYzUsIDB4NDdiMmNmN2YsIDB4MzBiNWZmZTksCisgIDB4YmRiZGYyMWMsIDB4Y2FiYWMyOGEsIDB4NTNiMzkzMzAsIDB4MjRiNGEzYTYsIDB4YmFkMDM2MDUsIDB4Y2RkNzA2OTMsCisgIDB4NTRkZTU3MjksIDB4MjNkOTY3YmYsIDB4YjM2NjdhMmUsIDB4YzQ2MTRhYjgsIDB4NWQ2ODFiMDIsIDB4MmE2ZjJiOTQsCisgIDB4YjQwYmJlMzcsIDB4YzMwYzhlYTEsIDB4NWEwNWRmMWIsIDB4MmQwMmVmOGQKK307CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIHdhcyBleHRyYWN0ZWQgZnJvbSBSRkMgMTk1MiBieSBTaW1vbgorICogSm9zZWZzc29uLCBmb3IgdGhlIFNoaXNoaSBwcm9qZWN0LCBhbmQgbW9kaWZpZWQgdG8gYmUgY29tcGF0aWJsZQorICogd2l0aCB0aGUgbW9kaWZpZWQgQ1JDLTMyIHVzZWQgYnkgUkZDIDE1MTAsIGFuZCBzdWJzZXF1ZW50bHkKKyAqIG1vZGlmaWVkIGZvciBHTlUgTGliZ2NyeXB0IHRvIGFsbG93IGl0IHRvIGJlIHVzZWQgZm9yIGNhbGN1bGF0aW5nCisgKiBib3RoIHVubW9kaWZpZWQgQ1JDLTMyIGFuZCBtb2RpZmllZCBDUkMtMzIgdmFsdWVzLiAgT3JpZ2luYWwKKyAqIGNvcHlyaWdodCBhbmQgbm90aWNlIGZyb20gdGhlIGRvY3VtZW50IGZvbGxvd3M6CisgKgorICogICAgQ29weXJpZ2h0IChjKSAxOTk2IEwuIFBldGVyIERldXRzY2gKKyAqCisgKiAgICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGlzIGRvY3VtZW50IGZvcgorICogICAgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgY2hhcmdlLCBpbmNsdWRpbmcgdHJhbnNsYXRpb25zIGludG8KKyAqICAgIG90aGVyIGxhbmd1YWdlcyBhbmQgaW5jb3Jwb3JhdGlvbiBpbnRvIGNvbXBpbGF0aW9ucywgcHJvdmlkZWQKKyAqICAgIHRoYXQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQsIGFuZAorICogICAgdGhhdCBhbnkgc3Vic3RhbnRpdmUgY2hhbmdlcyBvciBkZWxldGlvbnMgZnJvbSB0aGUgb3JpZ2luYWwgYXJlCisgKiAgICBjbGVhcmx5IG1hcmtlZC4KKyAqCisgKiBUaGUgY29weXJpZ2h0IG9uIFJGQ3MsIGFuZCBjb25zZXF1ZW50bHkgdGhlIGZ1bmN0aW9uIGJlbG93LCBhcmUKKyAqIHN1cHBvc2VkbHkgYWxzbyByZXRyb2FjdGl2ZWx5IGNsYWltZWQgYnkgdGhlIEludGVybmV0IFNvY2lldHkKKyAqIChhY2NvcmRpbmcgdG8gcmZjLWVkaXRvckByZmMtZWRpdG9yLm9yZyksIHdpdGggdGhlIGZvbGxvd2luZworICogY29weXJpZ2h0IG5vdGljZToKKyAqCisgKiAgICBDb3B5cmlnaHQgKEMpIFRoZSBJbnRlcm5ldCBTb2NpZXR5LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgICBUaGlzIGRvY3VtZW50IGFuZCB0cmFuc2xhdGlvbnMgb2YgaXQgbWF5IGJlIGNvcGllZCBhbmQgZnVybmlzaGVkCisgKiAgICB0byBvdGhlcnMsIGFuZCBkZXJpdmF0aXZlIHdvcmtzIHRoYXQgY29tbWVudCBvbiBvciBvdGhlcndpc2UKKyAqICAgIGV4cGxhaW4gaXQgb3IgYXNzaXN0IGluIGl0cyBpbXBsZW1lbnRhdGlvbiBtYXkgYmUgcHJlcGFyZWQsCisgKiAgICBjb3BpZWQsIHB1Ymxpc2hlZCBhbmQgZGlzdHJpYnV0ZWQsIGluIHdob2xlIG9yIGluIHBhcnQsIHdpdGhvdXQKKyAqICAgIHJlc3RyaWN0aW9uIG9mIGFueSBraW5kLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggYXJlIGluY2x1ZGVkIG9uIGFsbCBzdWNoIGNvcGllcyBhbmQKKyAqICAgIGRlcml2YXRpdmUgd29ya3MuICBIb3dldmVyLCB0aGlzIGRvY3VtZW50IGl0c2VsZiBtYXkgbm90IGJlCisgKiAgICBtb2RpZmllZCBpbiBhbnkgd2F5LCBzdWNoIGFzIGJ5IHJlbW92aW5nIHRoZSBjb3B5cmlnaHQgbm90aWNlIG9yCisgKiAgICByZWZlcmVuY2VzIHRvIHRoZSBJbnRlcm5ldCBTb2NpZXR5IG9yIG90aGVyIEludGVybmV0CisgKiAgICBvcmdhbml6YXRpb25zLCBleGNlcHQgYXMgbmVlZGVkIGZvciB0aGUgcHVycG9zZSBvZiBkZXZlbG9waW5nCisgKiAgICBJbnRlcm5ldCBzdGFuZGFyZHMgaW4gd2hpY2ggY2FzZSB0aGUgcHJvY2VkdXJlcyBmb3IgY29weXJpZ2h0cworICogICAgZGVmaW5lZCBpbiB0aGUgSW50ZXJuZXQgU3RhbmRhcmRzIHByb2Nlc3MgbXVzdCBiZSBmb2xsb3dlZCwgb3IKKyAqICAgIGFzIHJlcXVpcmVkIHRvIHRyYW5zbGF0ZSBpdCBpbnRvIGxhbmd1YWdlcyBvdGhlciB0aGFuIEVuZ2xpc2guCisgKgorICogICAgVGhlIGxpbWl0ZWQgcGVybWlzc2lvbnMgZ3JhbnRlZCBhYm92ZSBhcmUgcGVycGV0dWFsIGFuZCB3aWxsIG5vdCBiZQorICogICAgcmV2b2tlZCBieSB0aGUgSW50ZXJuZXQgU29jaWV0eSBvciBpdHMgc3VjY2Vzc29ycyBvciBhc3NpZ25zLgorICoKKyAqICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSBpbmZvcm1hdGlvbiBjb250YWluZWQgaGVyZWluIGlzIHByb3ZpZGVkCisgKiAgICBvbiBhbiAiQVMgSVMiIGJhc2lzIGFuZCBUSEUgSU5URVJORVQgU09DSUVUWSBBTkQgVEhFIElOVEVSTkVUCisgKiAgICBFTkdJTkVFUklORyBUQVNLIEZPUkNFIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUywgRVhQUkVTUyBPUgorICogICAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBBTlkgV0FSUkFOVFkgVEhBVCBUSEUgVVNFCisgKiAgICBPRiBUSEUgSU5GT1JNQVRJT04gSEVSRUlOIFdJTEwgTk9UIElORlJJTkdFIEFOWSBSSUdIVFMgT1IgQU5ZCisgKiAgICBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEKKyAqICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKi8KK3N0YXRpYyB1MzIKK3VwZGF0ZV9jcmMzMiAodTMyIGNyYywgY29uc3Qgdm9pZCAqYnVmX2FyZywgc2l6ZV90IGxlbikKK3sKKyAgY29uc3QgY2hhciAqYnVmID0gYnVmX2FyZzsKKyAgc2l6ZV90IG47CisKKyAgZm9yIChuID0gMDsgbiA8IGxlbjsgbisrKQorICAgIGNyYyA9IGNyYzMyX3RhYmxlWyhjcmMgXiBidWZbbl0pICYgMHhmZl0gXiAoY3JjID4+IDgpOworCisgIHJldHVybiBjcmM7Cit9CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIHUzMiBDUkM7CisgIGJ5dGUgYnVmWzRdOworfQorQ1JDX0NPTlRFWFQ7CisKKy8qIENSQzMyICovCisKK3N0YXRpYyB2b2lkCitjcmMzMl9pbml0ICh2b2lkICpjb250ZXh0KQoreworICBDUkNfQ09OVEVYVCAqY3R4ID0gKENSQ19DT05URVhUICopIGNvbnRleHQ7CisgIGN0eC0+Q1JDID0gMCBeIDB4ZmZmZmZmZmZMOworfQorCitzdGF0aWMgdm9pZAorY3JjMzJfd3JpdGUgKHZvaWQgKmNvbnRleHQsIGNvbnN0IHZvaWQgKmluYnVmLCBzaXplX3QgaW5sZW4pCit7CisgIENSQ19DT05URVhUICpjdHggPSAoQ1JDX0NPTlRFWFQgKikgY29udGV4dDsKKyAgaWYgKCFpbmJ1ZikKKyAgICByZXR1cm47CisgIGN0eC0+Q1JDID0gdXBkYXRlX2NyYzMyIChjdHgtPkNSQywgaW5idWYsIGlubGVuKTsKK30KKworc3RhdGljIGJ5dGUgKgorY3JjMzJfcmVhZCAodm9pZCAqY29udGV4dCkKK3sKKyAgQ1JDX0NPTlRFWFQgKmN0eCA9IChDUkNfQ09OVEVYVCAqKSBjb250ZXh0OworICByZXR1cm4gY3R4LT5idWY7Cit9CisKK3N0YXRpYyB2b2lkCitjcmMzMl9maW5hbCAodm9pZCAqY29udGV4dCkKK3sKKyAgQ1JDX0NPTlRFWFQgKmN0eCA9IChDUkNfQ09OVEVYVCAqKSBjb250ZXh0OworICBjdHgtPkNSQyBePSAweGZmZmZmZmZmTDsKKyAgY3R4LT5idWZbMF0gPSAoY3R4LT5DUkMgPj4gMjQpICYgMHhGRjsKKyAgY3R4LT5idWZbMV0gPSAoY3R4LT5DUkMgPj4gMTYpICYgMHhGRjsKKyAgY3R4LT5idWZbMl0gPSAoY3R4LT5DUkMgPj4gIDgpICYgMHhGRjsKKyAgY3R4LT5idWZbM10gPSAoY3R4LT5DUkMgICAgICApICYgMHhGRjsKK30KKworLyogQ1JDMzIgYSdsYSBSRkMgMTUxMCAqLworc3RhdGljIHZvaWQKK2NyYzMycmZjMTUxMF9pbml0ICh2b2lkICpjb250ZXh0KQoreworICBDUkNfQ09OVEVYVCAqY3R4ID0gKENSQ19DT05URVhUICopIGNvbnRleHQ7CisgIGN0eC0+Q1JDID0gMDsKK30KKworc3RhdGljIHZvaWQKK2NyYzMycmZjMTUxMF9maW5hbCAodm9pZCAqY29udGV4dCkKK3sKKyAgQ1JDX0NPTlRFWFQgKmN0eCA9IChDUkNfQ09OVEVYVCAqKSBjb250ZXh0OworICBjdHgtPmJ1ZlswXSA9IChjdHgtPkNSQyA+PiAyNCkgJiAweEZGOworICBjdHgtPmJ1ZlsxXSA9IChjdHgtPkNSQyA+PiAxNikgJiAweEZGOworICBjdHgtPmJ1ZlsyXSA9IChjdHgtPkNSQyA+PiAgOCkgJiAweEZGOworICBjdHgtPmJ1ZlszXSA9IChjdHgtPkNSQyAgICAgICkgJiAweEZGOworfQorCisvKiBDUkMyNCBhJ2xhIFJGQyAyNDQwICovCisvKgorICogVGhlIGZvbGxvd2luZyBDUkMgMjQgcm91dGluZXMgYXJlIGFkYXB0ZWQgZnJvbSBSRkMgMjQ0MCwgd2hpY2ggaGFzCisgKiB0aGUgZm9sbG93aW5nIGNvcHlyaWdodCBub3RpY2U6CisgKgorICogICBDb3B5cmlnaHQgKEMpIFRoZSBJbnRlcm5ldCBTb2NpZXR5ICgxOTk4KS4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogICBUaGlzIGRvY3VtZW50IGFuZCB0cmFuc2xhdGlvbnMgb2YgaXQgbWF5IGJlIGNvcGllZCBhbmQgZnVybmlzaGVkCisgKiAgIHRvIG90aGVycywgYW5kIGRlcml2YXRpdmUgd29ya3MgdGhhdCBjb21tZW50IG9uIG9yIG90aGVyd2lzZQorICogICBleHBsYWluIGl0IG9yIGFzc2lzdCBpbiBpdHMgaW1wbGVtZW50YXRpb24gbWF5IGJlIHByZXBhcmVkLAorICogICBjb3BpZWQsIHB1Ymxpc2hlZCBhbmQgZGlzdHJpYnV0ZWQsIGluIHdob2xlIG9yIGluIHBhcnQsIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24gb2YgYW55IGtpbmQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UKKyAqICAgYW5kIHRoaXMgcGFyYWdyYXBoIGFyZSBpbmNsdWRlZCBvbiBhbGwgc3VjaCBjb3BpZXMgYW5kIGRlcml2YXRpdmUKKyAqICAgd29ya3MuICBIb3dldmVyLCB0aGlzIGRvY3VtZW50IGl0c2VsZiBtYXkgbm90IGJlIG1vZGlmaWVkIGluIGFueQorICogICB3YXksIHN1Y2ggYXMgYnkgcmVtb3ZpbmcgdGhlIGNvcHlyaWdodCBub3RpY2Ugb3IgcmVmZXJlbmNlcyB0bworICogICB0aGUgSW50ZXJuZXQgU29jaWV0eSBvciBvdGhlciBJbnRlcm5ldCBvcmdhbml6YXRpb25zLCBleGNlcHQgYXMKKyAqICAgbmVlZGVkIGZvciB0aGUgcHVycG9zZSBvZiBkZXZlbG9waW5nIEludGVybmV0IHN0YW5kYXJkcyBpbiB3aGljaAorICogICBjYXNlIHRoZSBwcm9jZWR1cmVzIGZvciBjb3B5cmlnaHRzIGRlZmluZWQgaW4gdGhlIEludGVybmV0CisgKiAgIFN0YW5kYXJkcyBwcm9jZXNzIG11c3QgYmUgZm9sbG93ZWQsIG9yIGFzIHJlcXVpcmVkIHRvIHRyYW5zbGF0ZQorICogICBpdCBpbnRvIGxhbmd1YWdlcyBvdGhlciB0aGFuIEVuZ2xpc2guCisgKgorICogICBUaGUgbGltaXRlZCBwZXJtaXNzaW9ucyBncmFudGVkIGFib3ZlIGFyZSBwZXJwZXR1YWwgYW5kIHdpbGwgbm90IGJlCisgKiAgIHJldm9rZWQgYnkgdGhlIEludGVybmV0IFNvY2lldHkgb3IgaXRzIHN1Y2Nlc3NvcnMgb3IgYXNzaWducy4KKyAqCisgKiAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSBpbmZvcm1hdGlvbiBjb250YWluZWQgaGVyZWluIGlzIHByb3ZpZGVkIG9uCisgKiAgIGFuICJBUyBJUyIgYmFzaXMgYW5kIFRIRSBJTlRFUk5FVCBTT0NJRVRZIEFORCBUSEUgSU5URVJORVQKKyAqICAgRU5HSU5FRVJJTkcgVEFTSyBGT1JDRSBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IKKyAqICAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBBTlkgV0FSUkFOVFkgVEhBVCBUSEUgVVNFCisgKiAgIE9GIFRIRSBJTkZPUk1BVElPTiBIRVJFSU4gV0lMTCBOT1QgSU5GUklOR0UgQU5ZIFJJR0hUUyBPUiBBTlkKKyAqICAgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqICAgUFVSUE9TRS4KKyAqLworCisjZGVmaW5lIENSQzI0X0lOSVQgMHhiNzA0Y2VMCisjZGVmaW5lIENSQzI0X1BPTFkgMHgxODY0Y2ZiTAorCitzdGF0aWMgdm9pZAorY3JjMjRyZmMyNDQwX2luaXQgKHZvaWQgKmNvbnRleHQpCit7CisgIENSQ19DT05URVhUICpjdHggPSAoQ1JDX0NPTlRFWFQgKikgY29udGV4dDsKKyAgY3R4LT5DUkMgPSBDUkMyNF9JTklUOworfQorCitzdGF0aWMgdm9pZAorY3JjMjRyZmMyNDQwX3dyaXRlICh2b2lkICpjb250ZXh0LCBjb25zdCB2b2lkICppbmJ1Zl9hcmcsIHNpemVfdCBpbmxlbikKK3sKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqaW5idWYgPSBpbmJ1Zl9hcmc7CisgIGludCBpOworICBDUkNfQ09OVEVYVCAqY3R4ID0gKENSQ19DT05URVhUICopIGNvbnRleHQ7CisKKyAgaWYgKCFpbmJ1ZikKKyAgICByZXR1cm47CisKKyAgd2hpbGUgKGlubGVuLS0pIHsKKyAgICBjdHgtPkNSQyBePSAoKmluYnVmKyspIDw8IDE2OworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgIGN0eC0+Q1JDIDw8PSAxOworICAgICAgaWYgKGN0eC0+Q1JDICYgMHgxMDAwMDAwKQorCWN0eC0+Q1JDIF49IENSQzI0X1BPTFk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkCitjcmMyNHJmYzI0NDBfZmluYWwgKHZvaWQgKmNvbnRleHQpCit7CisgIENSQ19DT05URVhUICpjdHggPSAoQ1JDX0NPTlRFWFQgKikgY29udGV4dDsKKyAgY3R4LT5idWZbMF0gPSAoY3R4LT5DUkMgPj4gMTYpICYgMHhGRjsKKyAgY3R4LT5idWZbMV0gPSAoY3R4LT5DUkMgPj4gIDgpICYgMHhGRjsKKyAgY3R4LT5idWZbMl0gPSAoY3R4LT5DUkMgICAgICApICYgMHhGRjsKK30KKworZ2NyeV9tZF9zcGVjX3QgX2djcnlfZGlnZXN0X3NwZWNfY3JjMzIgPQorICB7CisgICAgIkNSQzMyIiwgTlVMTCwgMCwgTlVMTCwgNCwKKyAgICBjcmMzMl9pbml0LCBjcmMzMl93cml0ZSwgY3JjMzJfZmluYWwsIGNyYzMyX3JlYWQsCisgICAgc2l6ZW9mIChDUkNfQ09OVEVYVCkKKyAgfTsKKworZ2NyeV9tZF9zcGVjX3QgX2djcnlfZGlnZXN0X3NwZWNfY3JjMzJfcmZjMTUxMCA9CisgIHsKKyAgICAiQ1JDMzJSRkMxNTEwIiwgTlVMTCwgMCwgTlVMTCwgNCwKKyAgICBjcmMzMnJmYzE1MTBfaW5pdCwgY3JjMzJfd3JpdGUsCisgICAgY3JjMzJyZmMxNTEwX2ZpbmFsLCBjcmMzMl9yZWFkLAorICAgIHNpemVvZiAoQ1JDX0NPTlRFWFQpCisgIH07CisKK2djcnlfbWRfc3BlY190IF9nY3J5X2RpZ2VzdF9zcGVjX2NyYzI0X3JmYzI0NDAgPQorICB7CisgICAgIkNSQzI0UkZDMjQ0MCIsIE5VTEwsIDAsIE5VTEwsIDMsCisgICAgY3JjMjRyZmMyNDQwX2luaXQsIGNyYzI0cmZjMjQ0MF93cml0ZSwKKyAgICBjcmMyNHJmYzI0NDBfZmluYWwsIGNyYzMyX3JlYWQsCisgICAgc2l6ZW9mIChDUkNfQ09OVEVYVCkKKyAgfTsKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9jaXBoZXIvZGVzLmMgYi9saWJnY3J5cHQtMS40LjYvY2lwaGVyL2Rlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MWRmNzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvY2lwaGVyL2Rlcy5jCkBAIC0wLDAgKzEsMTE5NiBAQAorLyogZGVzLmMgLSBERVMgYW5kIFRyaXBsZS1ERVMgZW5jcnlwdGlvbi9kZWNyeXB0aW9uIEFsZ29yaXRobQorICogQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAxLCAyMDAyLCAyMDAzLAorICogICAgICAgICAgICAgICAyMDA4ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBnZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKgorICogRm9yIGEgZGVzY3JpcHRpb24gb2YgdHJpcGxlIGVuY3J5cHRpb24sIHNlZToKKyAqICAgQnJ1Y2UgU2NobmVpZXI6IEFwcGxpZWQgQ3J5cHRvZ3JhcGh5LiBTZWNvbmQgRWRpdGlvbi4KKyAqICAgSm9obiBXaWxleSAmIFNvbnMsIDE5OTYuIElTQk4gMC00NzEtMTI4NDUtNy4gUGFnZXMgMzU4IGZmLgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBhY2NvcmRpbmcgdG8gdGhlIGRlZmluaXRpb24gb2YgREVTIGluIEZJUFMKKyAqIFBVQiA0Ni0yIGZyb20gRGVjZW1iZXIgMTk5My4gCisgKi8KKworCisvKgorICogV3JpdHRlbiBieSBNaWNoYWVsIFJvdGggPG1yb3RoQG5lc3NpZS5kZT4sIFNlcHRlbWJlciAxOTk4CisgKi8KKworCisvKgorICogIFUgUyBBIEcgRQorICogPT09PT09PT09PT0KKyAqCisgKiBGb3IgREVTIG9yIFRyaXBsZS1ERVMgZW5jcnlwdGlvbi9kZWNyeXB0aW9uIHlvdSBtdXN0IGluaXRpYWxpemUgYSBwcm9wZXIKKyAqIGVuY3J5cHRpb24gY29udGV4dCB3aXRoIGEga2V5LgorICoKKyAqIEEgREVTIGtleSBpcyA2NGJpdCB3aWRlIGJ1dCBvbmx5IDU2Yml0cyBvZiB0aGUga2V5IGFyZSB1c2VkLiBUaGUgcmVtYWluaW5nCisgKiBiaXRzIGFyZSBwYXJpdHkgYml0cyBhbmQgdGhleSB3aWxsIF9ub3RfIGNoZWNrZWQgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwgYnV0CisgKiBzaW1wbHkgaWdub3JlZC4KKyAqCisgKiBGb3IgVHJpcGxlLURFUyB5b3UgY291bGQgdXNlIGVpdGhlciB0d28gNjRiaXQga2V5cyBvciB0aHJlZSA2NGJpdCBrZXlzLgorICogVGhlIHBhcml0eSBiaXRzIHdpbGwgX25vdF8gY2hlY2tlZCwgdG9vLgorICoKKyAqIEFmdGVyIGluaXRpYWxpemluZyBhIGNvbnRleHQgd2l0aCBhIGtleSB5b3UgY291bGQgdXNlIHRoaXMgY29udGV4dCB0bworICogZW5jcnlwdCBvciBkZWNyeXB0IGRhdGEgaW4gNjRiaXQgYmxvY2tzIGluIEVsZWN0cm9uaWMgQ29kZWJvb2sgTW9kZS4KKyAqCisgKiAoSW4gdGhlIGV4YW1wbGVzIGJlbG93IHRoZSBzbGFzaGVzIGF0IHRoZSBiZWdpbm5pbmcgYW5kIGVuZGluZyBvZiBjb21tZW50cworICogYXJlIG9taXRlZC4pCisgKgorICogREVTIEV4YW1wbGUKKyAqIC0tLS0tLS0tLS0tCisgKiAgICAgdW5zaWduZWQgY2hhciBrZXlbOF07CisgKiAgICAgdW5zaWduZWQgY2hhciBwbGFpbnRleHRbOF07CisgKiAgICAgdW5zaWduZWQgY2hhciBjaXBoZXJ0ZXh0WzhdOworICogICAgIHVuc2lnbmVkIGNoYXIgcmVjb3ZlcmRbOF07CisgKiAgICAgZGVzX2N0eCBjb250ZXh0OworICoKKyAqICAgICAqIEZpbGwgJ2tleScgYW5kICdwbGFpbnRleHQnIHdpdGggc29tZSBkYXRhICoKKyAqICAgICAuLi4uCisgKgorICogICAgICogU2V0IHVwIHRoZSBERVMgZW5jcnlwdGlvbiBjb250ZXh0ICoKKyAqICAgICBkZXNfc2V0a2V5KGNvbnRleHQsIGtleSk7CisgKgorICogICAgICogRW5jcnlwdCB0aGUgcGxhaW50ZXh0ICoKKyAqICAgICBkZXNfZWNiX2VuY3J5cHQoY29udGV4dCwgcGxhaW50ZXh0LCBjaXBoZXJ0ZXh0KTsKKyAqCisgKiAgICAgKiBUbyByZWNvdmVyIHRoZSBvcmdpbmFsIHBsYWludGV4dCBmcm9tIGNpcGhlcnRleHQgdXNlOiAqCisgKiAgICAgZGVzX2VjYl9kZWNyeXB0KGNvbnRleHQsIGNpcGhlcnRleHQsIHJlY292ZXJkKTsKKyAqCisgKgorICogVHJpcGxlLURFUyBFeGFtcGxlCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgICB1bnNpZ25lZCBjaGFyIGtleTFbOF07CisgKiAgICAgdW5zaWduZWQgY2hhciBrZXkyWzhdOworICogICAgIHVuc2lnbmVkIGNoYXIga2V5M1s4XTsKKyAqICAgICB1bnNpZ25lZCBjaGFyIHBsYWludGV4dFs4XTsKKyAqICAgICB1bnNpZ25lZCBjaGFyIGNpcGhlcnRleHRbOF07CisgKiAgICAgdW5zaWduZWQgY2hhciByZWNvdmVyZFs4XTsKKyAqICAgICB0cmlwbGVkZXNfY3R4IGNvbnRleHQ7CisgKgorICogICAgICogSWYgeW91IHdvdWxkIGxpa2UgdG8gdXNlIHR3byA2NGJpdCBrZXlzLCBmaWxsICdrZXkxJyBhbmQna2V5MicKKyAqCSB0aGVuIHNldHVwIHRoZSBlbmNyeXB0aW9uIGNvbnRleHQ6ICoKKyAqICAgICB0cmlwbGVkZXNfc2V0MmtleXMoY29udGV4dCwga2V5MSwga2V5Mik7CisgKgorICogICAgICogVG8gdXNlIHRocmVlIDY0Yml0IGtleXMgd2l0aCBUcmlwbGUtREVTIHVzZTogKgorICogICAgIHRyaXBsZWRlc19zZXQza2V5cyhjb250ZXh0LCBrZXkxLCBrZXkyLCBrZXkzKTsKKyAqCisgKiAgICAgKiBFbmNyeXB0aW5nIHBsYWludGV4dCB3aXRoIFRyaXBsZS1ERVMgKgorICogICAgIHRyaXBsZWRlc19lY2JfZW5jcnlwdChjb250ZXh0LCBwbGFpbnRleHQsIGNpcGhlcnRleHQpOworICoKKyAqICAgICAqIERlY3J5cHRpbmcgY2lwaGVydGV4dCB0byByZWNvdmVyIHRoZSBwbGFpbnRleHQgd2l0aCBUcmlwbGUtREVTICoKKyAqICAgICB0cmlwbGVkZXNfZWNiX2RlY3J5cHQoY29udGV4dCwgY2lwaGVydGV4dCwgcmVjb3ZlcmQpOworICoKKyAqCisgKiBTZWxmdGVzdAorICogLS0tLS0tLS0KKyAqICAgICBjaGFyICplcnJvcl9tc2c7CisgKgorICogICAgICogVG8gcGVyZm9ybSBhIHNlbGZ0ZXN0IG9mIHRoaXMgREVTL1RyaXBsZS1ERVMgaW1wbGVtZW50YXRpb24gdXNlIHRoZQorICoJIGZ1bmN0aW9uIHNlbGZ0ZXN0KCkuIEl0IHdpbGwgcmV0dXJuIGFuIGVycm9yIHN0cmluZyBpZiB0aGVyZSBhcmUKKyAqCSBzb21lIHByb2JsZW1zIHdpdGggdGhpcyBsaWJyYXJ5LiAqCisgKgorICogICAgIGlmICggKGVycm9yX21zZyA9IHNlbGZ0ZXN0KCkpICkKKyAqICAgICB7CisgKgkgICBmcHJpbnRmKHN0ZGVyciwgIkFuIGVycm9yIGluIHRoZSBERVMvVHJpcHBsZS1ERVMgaW1wbGVtZW50YXRpb24gb2NjdXJlZDogJXNcbiIsIGVycm9yX21zZyk7CisgKgkgICBhYm9ydCgpOworICogICAgIH0KKyAqLworCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgkgICAgICAgLyogbWVtY3B5LCBtZW1jbXAgKi8KKyNpbmNsdWRlICJ0eXBlcy5oIiAgICAgICAgICAgICAvKiBmb3IgYnl0ZSBhbmQgdTMyIHR5cGVkZWZzICovCisjaW5jbHVkZSAiZzEwbGliLmgiCisjaW5jbHVkZSAiY2lwaGVyLmgiCisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fR05VX0xJQlJBUllfXykKKyNkZWZpbmUgd29ya2luZ19tZW1jbXAgbWVtY21wCisjZWxzZQorLyoKKyAqIEFjY29yZGluZyB0byB0aGUgU3VuT1MgbWFuIHBhZ2UsIG1lbWNtcCByZXR1cm5zIGluZGV0ZXJtaW5hdGUgc2lnbgorICogZGVwZW5kaW5nIG9uIHdoZXRoZXIgY2hhcmFjdGVycyBhcmUgc2lnbmVkIG9yIG5vdC4KKyAqLworc3RhdGljIGludAord29ya2luZ19tZW1jbXAoIGNvbnN0IGNoYXIgKmEsIGNvbnN0IGNoYXIgKmIsIHNpemVfdCBuICkKK3sKKyAgICBmb3IoIDsgbjsgbi0tLCBhKyssIGIrKyApCisJaWYoICphICE9ICpiICkKKwkgICAgcmV0dXJuIChpbnQpKCooYnl0ZSopYSkgLSAoaW50KSgqKGJ5dGUqKWIpOworICAgIHJldHVybiAwOworfQorI2VuZGlmCisKKy8qCisgKiBFbmNyeXB0aW9uL0RlY3J5cHRpb24gY29udGV4dCBvZiBERVMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgX2Rlc19jdHgKKyAgeworICAgIHUzMiBlbmNyeXB0X3N1YmtleXNbMzJdOworICAgIHUzMiBkZWNyeXB0X3N1YmtleXNbMzJdOworICB9CitkZXNfY3R4WzFdOworCisvKgorICogRW5jcnlwdGlvbi9EZWNyeXB0aW9uIGNvbnRleHQgb2YgVHJpcGxlLURFUworICovCit0eXBlZGVmIHN0cnVjdCBfdHJpcGxlZGVzX2N0eAorICB7CisgICAgdTMyIGVuY3J5cHRfc3Via2V5c1s5Nl07CisgICAgdTMyIGRlY3J5cHRfc3Via2V5c1s5Nl07CisgICAgc3RydWN0IHsKKyAgICAgIGludCBub193ZWFrX2tleTsKKyAgICB9IGZsYWdzOworICB9Cit0cmlwbGVkZXNfY3R4WzFdOworCitzdGF0aWMgdm9pZCBkZXNfa2V5X3NjaGVkdWxlIChjb25zdCBieXRlICosIHUzMiAqKTsKK3N0YXRpYyBpbnQgZGVzX3NldGtleSAoc3RydWN0IF9kZXNfY3R4ICosIGNvbnN0IGJ5dGUgKik7CitzdGF0aWMgaW50IGRlc19lY2JfY3J5cHQgKHN0cnVjdCBfZGVzX2N0eCAqLCBjb25zdCBieXRlICosIGJ5dGUgKiwgaW50KTsKK3N0YXRpYyBpbnQgdHJpcGxlZGVzX3NldDJrZXlzIChzdHJ1Y3QgX3RyaXBsZWRlc19jdHggKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBieXRlICosIGNvbnN0IGJ5dGUgKik7CitzdGF0aWMgaW50IHRyaXBsZWRlc19zZXQza2V5cyAoc3RydWN0IF90cmlwbGVkZXNfY3R4ICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnl0ZSAqLCBjb25zdCBieXRlICosIGNvbnN0IGJ5dGUgKik7CitzdGF0aWMgaW50IHRyaXBsZWRlc19lY2JfY3J5cHQgKHN0cnVjdCBfdHJpcGxlZGVzX2N0eCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBieXRlICosIGJ5dGUgKiwgaW50KTsKK3N0YXRpYyBpbnQgaXNfd2Vha19rZXkgKCBjb25zdCBieXRlICprZXkgKTsKK3N0YXRpYyBjb25zdCBjaGFyICpzZWxmdGVzdCAodm9pZCk7CisKK3N0YXRpYyBpbnQgaW5pdGlhbGl6ZWQ7CisKKworCisKKy8qCisgKiBUaGUgcy1ib3ggdmFsdWVzIGFyZSBwZXJtdXRlZCBhY2NvcmRpbmcgdG8gdGhlICdwcmltaXRpdmUgZnVuY3Rpb24gUCcKKyAqIGFuZCBhcmUgcm90YXRlZCBvbmUgYml0IHRvIHRoZSBsZWZ0LgorICovCitzdGF0aWMgdTMyIHNib3gxWzY0XSA9Cit7CisgIDB4MDEwMTA0MDAsIDB4MDAwMDAwMDAsIDB4MDAwMTAwMDAsIDB4MDEwMTA0MDQsIDB4MDEwMTAwMDQsIDB4MDAwMTA0MDQsIDB4MDAwMDAwMDQsIDB4MDAwMTAwMDAsCisgIDB4MDAwMDA0MDAsIDB4MDEwMTA0MDAsIDB4MDEwMTA0MDQsIDB4MDAwMDA0MDAsIDB4MDEwMDA0MDQsIDB4MDEwMTAwMDQsIDB4MDEwMDAwMDAsIDB4MDAwMDAwMDQsCisgIDB4MDAwMDA0MDQsIDB4MDEwMDA0MDAsIDB4MDEwMDA0MDAsIDB4MDAwMTA0MDAsIDB4MDAwMTA0MDAsIDB4MDEwMTAwMDAsIDB4MDEwMTAwMDAsIDB4MDEwMDA0MDQsCisgIDB4MDAwMTAwMDQsIDB4MDEwMDAwMDQsIDB4MDEwMDAwMDQsIDB4MDAwMTAwMDQsIDB4MDAwMDAwMDAsIDB4MDAwMDA0MDQsIDB4MDAwMTA0MDQsIDB4MDEwMDAwMDAsCisgIDB4MDAwMTAwMDAsIDB4MDEwMTA0MDQsIDB4MDAwMDAwMDQsIDB4MDEwMTAwMDAsIDB4MDEwMTA0MDAsIDB4MDEwMDAwMDAsIDB4MDEwMDAwMDAsIDB4MDAwMDA0MDAsCisgIDB4MDEwMTAwMDQsIDB4MDAwMTAwMDAsIDB4MDAwMTA0MDAsIDB4MDEwMDAwMDQsIDB4MDAwMDA0MDAsIDB4MDAwMDAwMDQsIDB4MDEwMDA0MDQsIDB4MDAwMTA0MDQsCisgIDB4MDEwMTA0MDQsIDB4MDAwMTAwMDQsIDB4MDEwMTAwMDAsIDB4MDEwMDA0MDQsIDB4MDEwMDAwMDQsIDB4MDAwMDA0MDQsIDB4MDAwMTA0MDQsIDB4MDEwMTA0MDAsCisgIDB4MDAwMDA0MDQsIDB4MDEwMDA0MDAsIDB4MDEwMDA0MDAsIDB4MDAwMDAwMDAsIDB4MDAwMTAwMDQsIDB4MDAwMTA0MDAsIDB4MDAwMDAwMDAsIDB4MDEwMTAwMDQKK307CisKK3N0YXRpYyB1MzIgc2JveDJbNjRdID0KK3sKKyAgMHg4MDEwODAyMCwgMHg4MDAwODAwMCwgMHgwMDAwODAwMCwgMHgwMDEwODAyMCwgMHgwMDEwMDAwMCwgMHgwMDAwMDAyMCwgMHg4MDEwMDAyMCwgMHg4MDAwODAyMCwKKyAgMHg4MDAwMDAyMCwgMHg4MDEwODAyMCwgMHg4MDEwODAwMCwgMHg4MDAwMDAwMCwgMHg4MDAwODAwMCwgMHgwMDEwMDAwMCwgMHgwMDAwMDAyMCwgMHg4MDEwMDAyMCwKKyAgMHgwMDEwODAwMCwgMHgwMDEwMDAyMCwgMHg4MDAwODAyMCwgMHgwMDAwMDAwMCwgMHg4MDAwMDAwMCwgMHgwMDAwODAwMCwgMHgwMDEwODAyMCwgMHg4MDEwMDAwMCwKKyAgMHgwMDEwMDAyMCwgMHg4MDAwMDAyMCwgMHgwMDAwMDAwMCwgMHgwMDEwODAwMCwgMHgwMDAwODAyMCwgMHg4MDEwODAwMCwgMHg4MDEwMDAwMCwgMHgwMDAwODAyMCwKKyAgMHgwMDAwMDAwMCwgMHgwMDEwODAyMCwgMHg4MDEwMDAyMCwgMHgwMDEwMDAwMCwgMHg4MDAwODAyMCwgMHg4MDEwMDAwMCwgMHg4MDEwODAwMCwgMHgwMDAwODAwMCwKKyAgMHg4MDEwMDAwMCwgMHg4MDAwODAwMCwgMHgwMDAwMDAyMCwgMHg4MDEwODAyMCwgMHgwMDEwODAyMCwgMHgwMDAwMDAyMCwgMHgwMDAwODAwMCwgMHg4MDAwMDAwMCwKKyAgMHgwMDAwODAyMCwgMHg4MDEwODAwMCwgMHgwMDEwMDAwMCwgMHg4MDAwMDAyMCwgMHgwMDEwMDAyMCwgMHg4MDAwODAyMCwgMHg4MDAwMDAyMCwgMHgwMDEwMDAyMCwKKyAgMHgwMDEwODAwMCwgMHgwMDAwMDAwMCwgMHg4MDAwODAwMCwgMHgwMDAwODAyMCwgMHg4MDAwMDAwMCwgMHg4MDEwMDAyMCwgMHg4MDEwODAyMCwgMHgwMDEwODAwMAorfTsKKworc3RhdGljIHUzMiBzYm94M1s2NF0gPQoreworICAweDAwMDAwMjA4LCAweDA4MDIwMjAwLCAweDAwMDAwMDAwLCAweDA4MDIwMDA4LCAweDA4MDAwMjAwLCAweDAwMDAwMDAwLCAweDAwMDIwMjA4LCAweDA4MDAwMjAwLAorICAweDAwMDIwMDA4LCAweDA4MDAwMDA4LCAweDA4MDAwMDA4LCAweDAwMDIwMDAwLCAweDA4MDIwMjA4LCAweDAwMDIwMDA4LCAweDA4MDIwMDAwLCAweDAwMDAwMjA4LAorICAweDA4MDAwMDAwLCAweDAwMDAwMDA4LCAweDA4MDIwMjAwLCAweDAwMDAwMjAwLCAweDAwMDIwMjAwLCAweDA4MDIwMDAwLCAweDA4MDIwMDA4LCAweDAwMDIwMjA4LAorICAweDA4MDAwMjA4LCAweDAwMDIwMjAwLCAweDAwMDIwMDAwLCAweDA4MDAwMjA4LCAweDAwMDAwMDA4LCAweDA4MDIwMjA4LCAweDAwMDAwMjAwLCAweDA4MDAwMDAwLAorICAweDA4MDIwMjAwLCAweDA4MDAwMDAwLCAweDAwMDIwMDA4LCAweDAwMDAwMjA4LCAweDAwMDIwMDAwLCAweDA4MDIwMjAwLCAweDA4MDAwMjAwLCAweDAwMDAwMDAwLAorICAweDAwMDAwMjAwLCAweDAwMDIwMDA4LCAweDA4MDIwMjA4LCAweDA4MDAwMjAwLCAweDA4MDAwMDA4LCAweDAwMDAwMjAwLCAweDAwMDAwMDAwLCAweDA4MDIwMDA4LAorICAweDA4MDAwMjA4LCAweDAwMDIwMDAwLCAweDA4MDAwMDAwLCAweDA4MDIwMjA4LCAweDAwMDAwMDA4LCAweDAwMDIwMjA4LCAweDAwMDIwMjAwLCAweDA4MDAwMDA4LAorICAweDA4MDIwMDAwLCAweDA4MDAwMjA4LCAweDAwMDAwMjA4LCAweDA4MDIwMDAwLCAweDAwMDIwMjA4LCAweDAwMDAwMDA4LCAweDA4MDIwMDA4LCAweDAwMDIwMjAwCit9OworCitzdGF0aWMgdTMyIHNib3g0WzY0XSA9Cit7CisgIDB4MDA4MDIwMDEsIDB4MDAwMDIwODEsIDB4MDAwMDIwODEsIDB4MDAwMDAwODAsIDB4MDA4MDIwODAsIDB4MDA4MDAwODEsIDB4MDA4MDAwMDEsIDB4MDAwMDIwMDEsCisgIDB4MDAwMDAwMDAsIDB4MDA4MDIwMDAsIDB4MDA4MDIwMDAsIDB4MDA4MDIwODEsIDB4MDAwMDAwODEsIDB4MDAwMDAwMDAsIDB4MDA4MDAwODAsIDB4MDA4MDAwMDEsCisgIDB4MDAwMDAwMDEsIDB4MDAwMDIwMDAsIDB4MDA4MDAwMDAsIDB4MDA4MDIwMDEsIDB4MDAwMDAwODAsIDB4MDA4MDAwMDAsIDB4MDAwMDIwMDEsIDB4MDAwMDIwODAsCisgIDB4MDA4MDAwODEsIDB4MDAwMDAwMDEsIDB4MDAwMDIwODAsIDB4MDA4MDAwODAsIDB4MDAwMDIwMDAsIDB4MDA4MDIwODAsIDB4MDA4MDIwODEsIDB4MDAwMDAwODEsCisgIDB4MDA4MDAwODAsIDB4MDA4MDAwMDEsIDB4MDA4MDIwMDAsIDB4MDA4MDIwODEsIDB4MDAwMDAwODEsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDA4MDIwMDAsCisgIDB4MDAwMDIwODAsIDB4MDA4MDAwODAsIDB4MDA4MDAwODEsIDB4MDAwMDAwMDEsIDB4MDA4MDIwMDEsIDB4MDAwMDIwODEsIDB4MDAwMDIwODEsIDB4MDAwMDAwODAsCisgIDB4MDA4MDIwODEsIDB4MDAwMDAwODEsIDB4MDAwMDAwMDEsIDB4MDAwMDIwMDAsIDB4MDA4MDAwMDEsIDB4MDAwMDIwMDEsIDB4MDA4MDIwODAsIDB4MDA4MDAwODEsCisgIDB4MDAwMDIwMDEsIDB4MDAwMDIwODAsIDB4MDA4MDAwMDAsIDB4MDA4MDIwMDEsIDB4MDAwMDAwODAsIDB4MDA4MDAwMDAsIDB4MDAwMDIwMDAsIDB4MDA4MDIwODAKK307CisKK3N0YXRpYyB1MzIgc2JveDVbNjRdID0KK3sKKyAgMHgwMDAwMDEwMCwgMHgwMjA4MDEwMCwgMHgwMjA4MDAwMCwgMHg0MjAwMDEwMCwgMHgwMDA4MDAwMCwgMHgwMDAwMDEwMCwgMHg0MDAwMDAwMCwgMHgwMjA4MDAwMCwKKyAgMHg0MDA4MDEwMCwgMHgwMDA4MDAwMCwgMHgwMjAwMDEwMCwgMHg0MDA4MDEwMCwgMHg0MjAwMDEwMCwgMHg0MjA4MDAwMCwgMHgwMDA4MDEwMCwgMHg0MDAwMDAwMCwKKyAgMHgwMjAwMDAwMCwgMHg0MDA4MDAwMCwgMHg0MDA4MDAwMCwgMHgwMDAwMDAwMCwgMHg0MDAwMDEwMCwgMHg0MjA4MDEwMCwgMHg0MjA4MDEwMCwgMHgwMjAwMDEwMCwKKyAgMHg0MjA4MDAwMCwgMHg0MDAwMDEwMCwgMHgwMDAwMDAwMCwgMHg0MjAwMDAwMCwgMHgwMjA4MDEwMCwgMHgwMjAwMDAwMCwgMHg0MjAwMDAwMCwgMHgwMDA4MDEwMCwKKyAgMHgwMDA4MDAwMCwgMHg0MjAwMDEwMCwgMHgwMDAwMDEwMCwgMHgwMjAwMDAwMCwgMHg0MDAwMDAwMCwgMHgwMjA4MDAwMCwgMHg0MjAwMDEwMCwgMHg0MDA4MDEwMCwKKyAgMHgwMjAwMDEwMCwgMHg0MDAwMDAwMCwgMHg0MjA4MDAwMCwgMHgwMjA4MDEwMCwgMHg0MDA4MDEwMCwgMHgwMDAwMDEwMCwgMHgwMjAwMDAwMCwgMHg0MjA4MDAwMCwKKyAgMHg0MjA4MDEwMCwgMHgwMDA4MDEwMCwgMHg0MjAwMDAwMCwgMHg0MjA4MDEwMCwgMHgwMjA4MDAwMCwgMHgwMDAwMDAwMCwgMHg0MDA4MDAwMCwgMHg0MjAwMDAwMCwKKyAgMHgwMDA4MDEwMCwgMHgwMjAwMDEwMCwgMHg0MDAwMDEwMCwgMHgwMDA4MDAwMCwgMHgwMDAwMDAwMCwgMHg0MDA4MDAwMCwgMHgwMjA4MDEwMCwgMHg0MDAwMDEwMAorfTsKKworc3RhdGljIHUzMiBzYm94Nls2NF0gPQoreworICAweDIwMDAwMDEwLCAweDIwNDAwMDAwLCAweDAwMDA0MDAwLCAweDIwNDA0MDEwLCAweDIwNDAwMDAwLCAweDAwMDAwMDEwLCAweDIwNDA0MDEwLCAweDAwNDAwMDAwLAorICAweDIwMDA0MDAwLCAweDAwNDA0MDEwLCAweDAwNDAwMDAwLCAweDIwMDAwMDEwLCAweDAwNDAwMDEwLCAweDIwMDA0MDAwLCAweDIwMDAwMDAwLCAweDAwMDA0MDEwLAorICAweDAwMDAwMDAwLCAweDAwNDAwMDEwLCAweDIwMDA0MDEwLCAweDAwMDA0MDAwLCAweDAwNDA0MDAwLCAweDIwMDA0MDEwLCAweDAwMDAwMDEwLCAweDIwNDAwMDEwLAorICAweDIwNDAwMDEwLCAweDAwMDAwMDAwLCAweDAwNDA0MDEwLCAweDIwNDA0MDAwLCAweDAwMDA0MDEwLCAweDAwNDA0MDAwLCAweDIwNDA0MDAwLCAweDIwMDAwMDAwLAorICAweDIwMDA0MDAwLCAweDAwMDAwMDEwLCAweDIwNDAwMDEwLCAweDAwNDA0MDAwLCAweDIwNDA0MDEwLCAweDAwNDAwMDAwLCAweDAwMDA0MDEwLCAweDIwMDAwMDEwLAorICAweDAwNDAwMDAwLCAweDIwMDA0MDAwLCAweDIwMDAwMDAwLCAweDAwMDA0MDEwLCAweDIwMDAwMDEwLCAweDIwNDA0MDEwLCAweDAwNDA0MDAwLCAweDIwNDAwMDAwLAorICAweDAwNDA0MDEwLCAweDIwNDA0MDAwLCAweDAwMDAwMDAwLCAweDIwNDAwMDEwLCAweDAwMDAwMDEwLCAweDAwMDA0MDAwLCAweDIwNDAwMDAwLCAweDAwNDA0MDEwLAorICAweDAwMDA0MDAwLCAweDAwNDAwMDEwLCAweDIwMDA0MDEwLCAweDAwMDAwMDAwLCAweDIwNDA0MDAwLCAweDIwMDAwMDAwLCAweDAwNDAwMDEwLCAweDIwMDA0MDEwCit9OworCitzdGF0aWMgdTMyIHNib3g3WzY0XSA9Cit7CisgIDB4MDAyMDAwMDAsIDB4MDQyMDAwMDIsIDB4MDQwMDA4MDIsIDB4MDAwMDAwMDAsIDB4MDAwMDA4MDAsIDB4MDQwMDA4MDIsIDB4MDAyMDA4MDIsIDB4MDQyMDA4MDAsCisgIDB4MDQyMDA4MDIsIDB4MDAyMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDQwMDAwMDIsIDB4MDAwMDAwMDIsIDB4MDQwMDAwMDAsIDB4MDQyMDAwMDIsIDB4MDAwMDA4MDIsCisgIDB4MDQwMDA4MDAsIDB4MDAyMDA4MDIsIDB4MDAyMDAwMDIsIDB4MDQwMDA4MDAsIDB4MDQwMDAwMDIsIDB4MDQyMDAwMDAsIDB4MDQyMDA4MDAsIDB4MDAyMDAwMDIsCisgIDB4MDQyMDAwMDAsIDB4MDAwMDA4MDAsIDB4MDAwMDA4MDIsIDB4MDQyMDA4MDIsIDB4MDAyMDA4MDAsIDB4MDAwMDAwMDIsIDB4MDQwMDAwMDAsIDB4MDAyMDA4MDAsCisgIDB4MDQwMDAwMDAsIDB4MDAyMDA4MDAsIDB4MDAyMDAwMDAsIDB4MDQwMDA4MDIsIDB4MDQwMDA4MDIsIDB4MDQyMDAwMDIsIDB4MDQyMDAwMDIsIDB4MDAwMDAwMDIsCisgIDB4MDAyMDAwMDIsIDB4MDQwMDAwMDAsIDB4MDQwMDA4MDAsIDB4MDAyMDAwMDAsIDB4MDQyMDA4MDAsIDB4MDAwMDA4MDIsIDB4MDAyMDA4MDIsIDB4MDQyMDA4MDAsCisgIDB4MDAwMDA4MDIsIDB4MDQwMDAwMDIsIDB4MDQyMDA4MDIsIDB4MDQyMDAwMDAsIDB4MDAyMDA4MDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDIsIDB4MDQyMDA4MDIsCisgIDB4MDAwMDAwMDAsIDB4MDAyMDA4MDIsIDB4MDQyMDAwMDAsIDB4MDAwMDA4MDAsIDB4MDQwMDAwMDIsIDB4MDQwMDA4MDAsIDB4MDAwMDA4MDAsIDB4MDAyMDAwMDIKK307CisKK3N0YXRpYyB1MzIgc2JveDhbNjRdID0KK3sKKyAgMHgxMDAwMTA0MCwgMHgwMDAwMTAwMCwgMHgwMDA0MDAwMCwgMHgxMDA0MTA0MCwgMHgxMDAwMDAwMCwgMHgxMDAwMTA0MCwgMHgwMDAwMDA0MCwgMHgxMDAwMDAwMCwKKyAgMHgwMDA0MDA0MCwgMHgxMDA0MDAwMCwgMHgxMDA0MTA0MCwgMHgwMDA0MTAwMCwgMHgxMDA0MTAwMCwgMHgwMDA0MTA0MCwgMHgwMDAwMTAwMCwgMHgwMDAwMDA0MCwKKyAgMHgxMDA0MDAwMCwgMHgxMDAwMDA0MCwgMHgxMDAwMTAwMCwgMHgwMDAwMTA0MCwgMHgwMDA0MTAwMCwgMHgwMDA0MDA0MCwgMHgxMDA0MDA0MCwgMHgxMDA0MTAwMCwKKyAgMHgwMDAwMTA0MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgxMDA0MDA0MCwgMHgxMDAwMDA0MCwgMHgxMDAwMTAwMCwgMHgwMDA0MTA0MCwgMHgwMDA0MDAwMCwKKyAgMHgwMDA0MTA0MCwgMHgwMDA0MDAwMCwgMHgxMDA0MTAwMCwgMHgwMDAwMTAwMCwgMHgwMDAwMDA0MCwgMHgxMDA0MDA0MCwgMHgwMDAwMTAwMCwgMHgwMDA0MTA0MCwKKyAgMHgxMDAwMTAwMCwgMHgwMDAwMDA0MCwgMHgxMDAwMDA0MCwgMHgxMDA0MDAwMCwgMHgxMDA0MDA0MCwgMHgxMDAwMDAwMCwgMHgwMDA0MDAwMCwgMHgxMDAwMTA0MCwKKyAgMHgwMDAwMDAwMCwgMHgxMDA0MTA0MCwgMHgwMDA0MDA0MCwgMHgxMDAwMDA0MCwgMHgxMDA0MDAwMCwgMHgxMDAwMTAwMCwgMHgxMDAwMTA0MCwgMHgwMDAwMDAwMCwKKyAgMHgxMDA0MTA0MCwgMHgwMDA0MTAwMCwgMHgwMDA0MTAwMCwgMHgwMDAwMTA0MCwgMHgwMDAwMTA0MCwgMHgwMDA0MDA0MCwgMHgxMDAwMDAwMCwgMHgxMDA0MTAwMAorfTsKKworCisvKgorICogVGhlc2UgdHdvIHRhYmxlcyBhcmUgcGFydCBvZiB0aGUgJ3Blcm11dGVkIGNob2ljZSAxJyBmdW5jdGlvbi4KKyAqIEluIHRoaXMgaW1wbGVtZW50YXRpb24gc2V2ZXJhbCBzcGVlZCBpbXByb3ZlbWVudHMgYXJlIGRvbmUuCisgKi8KK3N0YXRpYyB1MzIgbGVmdGtleV9zd2FwWzE2XSA9Cit7CisgIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDEsIDB4MDAwMDAxMDAsIDB4MDAwMDAxMDEsCisgIDB4MDAwMTAwMDAsIDB4MDAwMTAwMDEsIDB4MDAwMTAxMDAsIDB4MDAwMTAxMDEsCisgIDB4MDEwMDAwMDAsIDB4MDEwMDAwMDEsIDB4MDEwMDAxMDAsIDB4MDEwMDAxMDEsCisgIDB4MDEwMTAwMDAsIDB4MDEwMTAwMDEsIDB4MDEwMTAxMDAsIDB4MDEwMTAxMDEKK307CisKK3N0YXRpYyB1MzIgcmlnaHRrZXlfc3dhcFsxNl0gPQoreworICAweDAwMDAwMDAwLCAweDAxMDAwMDAwLCAweDAwMDEwMDAwLCAweDAxMDEwMDAwLAorICAweDAwMDAwMTAwLCAweDAxMDAwMTAwLCAweDAwMDEwMTAwLCAweDAxMDEwMTAwLAorICAweDAwMDAwMDAxLCAweDAxMDAwMDAxLCAweDAwMDEwMDAxLCAweDAxMDEwMDAxLAorICAweDAwMDAwMTAxLCAweDAxMDAwMTAxLCAweDAwMDEwMTAxLCAweDAxMDEwMTAxLAorfTsKKworCisKKy8qCisgKiBOdW1iZXJzIG9mIGxlZnQgc2hpZnRzIHBlciByb3VuZCBmb3IgZW5jcnlwdGlvbiBzdWJrZXlzLgorICogVG8gY2FsY3VsYXRlIHRoZSBkZWNyeXB0aW9uIHN1YmtleXMgd2UganVzdCByZXZlcnNlIHRoZQorICogb3JkZXJpbmcgb2YgdGhlIGNhbGN1bGF0ZWQgZW5jcnlwdGlvbiBzdWJrZXlzLiBTbyB0aGVpcgorICogaXMgbm8gbmVlZCBmb3IgYSBkZWNyeXB0aW9uIHJvdGF0ZSB0YWIuCisgKi8KK3N0YXRpYyBieXRlIGVuY3J5cHRfcm90YXRlX3RhYlsxNl0gPQoreworICAxLCAxLCAyLCAyLCAyLCAyLCAyLCAyLCAxLCAyLCAyLCAyLCAyLCAyLCAyLCAxCit9OworCisKKworLyoKKyAqIFRhYmxlIHdpdGggd2VhayBERVMga2V5cyBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyLgorICogSW4gREVTIHRoZWlyIGFyZSA2NCBrbm93biBrZXlzIHdoaWNoIGFyZSB3ZWFrLiBUaGV5IGFyZSB3ZWFrCisgKiBiZWNhdXNlIHRoZXkgcHJvZHVjZSBvbmx5IG9uZSwgdHdvIG9yIGZvdXIgZGlmZmVyZW50CisgKiBzdWJrZXlzIGluIHRoZSBzdWJrZXkgc2NoZWR1bGluZyBwcm9jZXNzLgorICogVGhlIGtleXMgaW4gdGhpcyB0YWJsZSBoYXZlIGFsbCB0aGVpciBwYXJpdHkgYml0cyBjbGVhcmVkLgorICovCitzdGF0aWMgYnl0ZSB3ZWFrX2tleXNbNjRdWzhdID0KK3sKKyAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0sIC8qdyovCisgIHsgMHgwMCwgMHgwMCwgMHgxZSwgMHgxZSwgMHgwMCwgMHgwMCwgMHgwZSwgMHgwZSB9LAorICB7IDB4MDAsIDB4MDAsIDB4ZTAsIDB4ZTAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4ZjAgfSwKKyAgeyAweDAwLCAweDAwLCAweGZlLCAweGZlLCAweDAwLCAweDAwLCAweGZlLCAweGZlIH0sCisgIHsgMHgwMCwgMHgxZSwgMHgwMCwgMHgxZSwgMHgwMCwgMHgwZSwgMHgwMCwgMHgwZSB9LCAvKnN3Ki8KKyAgeyAweDAwLCAweDFlLCAweDFlLCAweDAwLCAweDAwLCAweDBlLCAweDBlLCAweDAwIH0sCisgIHsgMHgwMCwgMHgxZSwgMHhlMCwgMHhmZSwgMHgwMCwgMHgwZSwgMHhmMCwgMHhmZSB9LAorICB7IDB4MDAsIDB4MWUsIDB4ZmUsIDB4ZTAsIDB4MDAsIDB4MGUsIDB4ZmUsIDB4ZjAgfSwKKyAgeyAweDAwLCAweGUwLCAweDAwLCAweGUwLCAweDAwLCAweGYwLCAweDAwLCAweGYwIH0sIC8qc3cqLworICB7IDB4MDAsIDB4ZTAsIDB4MWUsIDB4ZmUsIDB4MDAsIDB4ZjAsIDB4MGUsIDB4ZmUgfSwKKyAgeyAweDAwLCAweGUwLCAweGUwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwIH0sCisgIHsgMHgwMCwgMHhlMCwgMHhmZSwgMHgxZSwgMHgwMCwgMHhmMCwgMHhmZSwgMHgwZSB9LAorICB7IDB4MDAsIDB4ZmUsIDB4MDAsIDB4ZmUsIDB4MDAsIDB4ZmUsIDB4MDAsIDB4ZmUgfSwgLypzdyovCisgIHsgMHgwMCwgMHhmZSwgMHgxZSwgMHhlMCwgMHgwMCwgMHhmZSwgMHgwZSwgMHhmMCB9LAorICB7IDB4MDAsIDB4ZmUsIDB4ZTAsIDB4MWUsIDB4MDAsIDB4ZmUsIDB4ZjAsIDB4MGUgfSwKKyAgeyAweDAwLCAweGZlLCAweGZlLCAweDAwLCAweDAwLCAweGZlLCAweGZlLCAweDAwIH0sCisgIHsgMHgxZSwgMHgwMCwgMHgwMCwgMHgxZSwgMHgwZSwgMHgwMCwgMHgwMCwgMHgwZSB9LAorICB7IDB4MWUsIDB4MDAsIDB4MWUsIDB4MDAsIDB4MGUsIDB4MDAsIDB4MGUsIDB4MDAgfSwgLypzdyovCisgIHsgMHgxZSwgMHgwMCwgMHhlMCwgMHhmZSwgMHgwZSwgMHgwMCwgMHhmMCwgMHhmZSB9LAorICB7IDB4MWUsIDB4MDAsIDB4ZmUsIDB4ZTAsIDB4MGUsIDB4MDAsIDB4ZmUsIDB4ZjAgfSwKKyAgeyAweDFlLCAweDFlLCAweDAwLCAweDAwLCAweDBlLCAweDBlLCAweDAwLCAweDAwIH0sCisgIHsgMHgxZSwgMHgxZSwgMHgxZSwgMHgxZSwgMHgwZSwgMHgwZSwgMHgwZSwgMHgwZSB9LCAvKncqLworICB7IDB4MWUsIDB4MWUsIDB4ZTAsIDB4ZTAsIDB4MGUsIDB4MGUsIDB4ZjAsIDB4ZjAgfSwKKyAgeyAweDFlLCAweDFlLCAweGZlLCAweGZlLCAweDBlLCAweDBlLCAweGZlLCAweGZlIH0sCisgIHsgMHgxZSwgMHhlMCwgMHgwMCwgMHhmZSwgMHgwZSwgMHhmMCwgMHgwMCwgMHhmZSB9LAorICB7IDB4MWUsIDB4ZTAsIDB4MWUsIDB4ZTAsIDB4MGUsIDB4ZjAsIDB4MGUsIDB4ZjAgfSwgLypzdyovCisgIHsgMHgxZSwgMHhlMCwgMHhlMCwgMHgxZSwgMHgwZSwgMHhmMCwgMHhmMCwgMHgwZSB9LAorICB7IDB4MWUsIDB4ZTAsIDB4ZmUsIDB4MDAsIDB4MGUsIDB4ZjAsIDB4ZmUsIDB4MDAgfSwKKyAgeyAweDFlLCAweGZlLCAweDAwLCAweGUwLCAweDBlLCAweGZlLCAweDAwLCAweGYwIH0sCisgIHsgMHgxZSwgMHhmZSwgMHgxZSwgMHhmZSwgMHgwZSwgMHhmZSwgMHgwZSwgMHhmZSB9LCAvKnN3Ki8KKyAgeyAweDFlLCAweGZlLCAweGUwLCAweDAwLCAweDBlLCAweGZlLCAweGYwLCAweDAwIH0sCisgIHsgMHgxZSwgMHhmZSwgMHhmZSwgMHgxZSwgMHgwZSwgMHhmZSwgMHhmZSwgMHgwZSB9LAorICB7IDB4ZTAsIDB4MDAsIDB4MDAsIDB4ZTAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4ZjAgfSwKKyAgeyAweGUwLCAweDAwLCAweDFlLCAweGZlLCAweGYwLCAweDAwLCAweDBlLCAweGZlIH0sCisgIHsgMHhlMCwgMHgwMCwgMHhlMCwgMHgwMCwgMHhmMCwgMHgwMCwgMHhmMCwgMHgwMCB9LCAvKnN3Ki8KKyAgeyAweGUwLCAweDAwLCAweGZlLCAweDFlLCAweGYwLCAweDAwLCAweGZlLCAweDBlIH0sCisgIHsgMHhlMCwgMHgxZSwgMHgwMCwgMHhmZSwgMHhmMCwgMHgwZSwgMHgwMCwgMHhmZSB9LAorICB7IDB4ZTAsIDB4MWUsIDB4MWUsIDB4ZTAsIDB4ZjAsIDB4MGUsIDB4MGUsIDB4ZjAgfSwKKyAgeyAweGUwLCAweDFlLCAweGUwLCAweDFlLCAweGYwLCAweDBlLCAweGYwLCAweDBlIH0sIC8qc3cqLworICB7IDB4ZTAsIDB4MWUsIDB4ZmUsIDB4MDAsIDB4ZjAsIDB4MGUsIDB4ZmUsIDB4MDAgfSwKKyAgeyAweGUwLCAweGUwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwIH0sCisgIHsgMHhlMCwgMHhlMCwgMHgxZSwgMHgxZSwgMHhmMCwgMHhmMCwgMHgwZSwgMHgwZSB9LAorICB7IDB4ZTAsIDB4ZTAsIDB4ZTAsIDB4ZTAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAgfSwgLyp3Ki8KKyAgeyAweGUwLCAweGUwLCAweGZlLCAweGZlLCAweGYwLCAweGYwLCAweGZlLCAweGZlIH0sCisgIHsgMHhlMCwgMHhmZSwgMHgwMCwgMHgxZSwgMHhmMCwgMHhmZSwgMHgwMCwgMHgwZSB9LAorICB7IDB4ZTAsIDB4ZmUsIDB4MWUsIDB4MDAsIDB4ZjAsIDB4ZmUsIDB4MGUsIDB4MDAgfSwKKyAgeyAweGUwLCAweGZlLCAweGUwLCAweGZlLCAweGYwLCAweGZlLCAweGYwLCAweGZlIH0sIC8qc3cqLworICB7IDB4ZTAsIDB4ZmUsIDB4ZmUsIDB4ZTAsIDB4ZjAsIDB4ZmUsIDB4ZmUsIDB4ZjAgfSwKKyAgeyAweGZlLCAweDAwLCAweDAwLCAweGZlLCAweGZlLCAweDAwLCAweDAwLCAweGZlIH0sCisgIHsgMHhmZSwgMHgwMCwgMHgxZSwgMHhlMCwgMHhmZSwgMHgwMCwgMHgwZSwgMHhmMCB9LAorICB7IDB4ZmUsIDB4MDAsIDB4ZTAsIDB4MWUsIDB4ZmUsIDB4MDAsIDB4ZjAsIDB4MGUgfSwKKyAgeyAweGZlLCAweDAwLCAweGZlLCAweDAwLCAweGZlLCAweDAwLCAweGZlLCAweDAwIH0sIC8qc3cqLworICB7IDB4ZmUsIDB4MWUsIDB4MDAsIDB4ZTAsIDB4ZmUsIDB4MGUsIDB4MDAsIDB4ZjAgfSwKKyAgeyAweGZlLCAweDFlLCAweDFlLCAweGZlLCAweGZlLCAweDBlLCAweDBlLCAweGZlIH0sCisgIHsgMHhmZSwgMHgxZSwgMHhlMCwgMHgwMCwgMHhmZSwgMHgwZSwgMHhmMCwgMHgwMCB9LAorICB7IDB4ZmUsIDB4MWUsIDB4ZmUsIDB4MWUsIDB4ZmUsIDB4MGUsIDB4ZmUsIDB4MGUgfSwgLypzdyovCisgIHsgMHhmZSwgMHhlMCwgMHgwMCwgMHgxZSwgMHhmZSwgMHhmMCwgMHgwMCwgMHgwZSB9LAorICB7IDB4ZmUsIDB4ZTAsIDB4MWUsIDB4MDAsIDB4ZmUsIDB4ZjAsIDB4MGUsIDB4MDAgfSwKKyAgeyAweGZlLCAweGUwLCAweGUwLCAweGZlLCAweGZlLCAweGYwLCAweGYwLCAweGZlIH0sCisgIHsgMHhmZSwgMHhlMCwgMHhmZSwgMHhlMCwgMHhmZSwgMHhmMCwgMHhmZSwgMHhmMCB9LCAvKnN3Ki8KKyAgeyAweGZlLCAweGZlLCAweDAwLCAweDAwLCAweGZlLCAweGZlLCAweDAwLCAweDAwIH0sCisgIHsgMHhmZSwgMHhmZSwgMHgxZSwgMHgxZSwgMHhmZSwgMHhmZSwgMHgwZSwgMHgwZSB9LAorICB7IDB4ZmUsIDB4ZmUsIDB4ZTAsIDB4ZTAsIDB4ZmUsIDB4ZmUsIDB4ZjAsIDB4ZjAgfSwKKyAgeyAweGZlLCAweGZlLCAweGZlLCAweGZlLCAweGZlLCAweGZlLCAweGZlLCAweGZlIH0gIC8qdyovCit9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgd2Vha19rZXlzX2Noa3N1bVsyMF0gPSB7CisgIDB4RDAsIDB4Q0YsIDB4MDcsIDB4MzgsIDB4OTMsIDB4NzAsIDB4OEEsIDB4ODMsIDB4N0QsIDB4RDcsCisgIDB4OEEsIDB4MzYsIDB4NjUsIDB4MjksIDB4NkMsIDB4MUYsIDB4N0MsIDB4M0YsIDB4RDMsIDB4NDEgCit9OworCisKKworLyoKKyAqIE1hY3JvIHRvIHN3YXAgYml0cyBhY3Jvc3MgdHdvIHdvcmRzLgorICovCisjZGVmaW5lIERPX1BFUk1VVEFUSU9OKGEsIHRlbXAsIGIsIG9mZnNldCwgbWFzaykJXAorICAgIHRlbXAgPSAoKGE+Pm9mZnNldCkgXiBiKSAmIG1hc2s7CQkJXAorICAgIGIgXj0gdGVtcDsJCQkJCQlcCisgICAgYSBePSB0ZW1wPDxvZmZzZXQ7CisKKworLyoKKyAqIFRoaXMgcGVyZm9ybXMgdGhlICdpbml0aWFsIHBlcm11dGF0aW9uJyBvZiB0aGUgZGF0YSB0byBiZSBlbmNyeXB0ZWQKKyAqIG9yIGRlY3J5cHRlZC4gQWRkaXRpb25hbGx5IHRoZSByZXN1bHRpbmcgdHdvIHdvcmRzIGFyZSByb3RhdGVkIG9uZSBiaXQKKyAqIHRvIHRoZSBsZWZ0LgorICovCisjZGVmaW5lIElOSVRJQUxfUEVSTVVUQVRJT04obGVmdCwgdGVtcCwgcmlnaHQpCQlcCisgICAgRE9fUEVSTVVUQVRJT04obGVmdCwgdGVtcCwgcmlnaHQsIDQsIDB4MGYwZjBmMGYpCVwKKyAgICBET19QRVJNVVRBVElPTihsZWZ0LCB0ZW1wLCByaWdodCwgMTYsIDB4MDAwMGZmZmYpCVwKKyAgICBET19QRVJNVVRBVElPTihyaWdodCwgdGVtcCwgbGVmdCwgMiwgMHgzMzMzMzMzMykJXAorICAgIERPX1BFUk1VVEFUSU9OKHJpZ2h0LCB0ZW1wLCBsZWZ0LCA4LCAweDAwZmYwMGZmKQlcCisgICAgcmlnaHQgPSAgKHJpZ2h0IDw8IDEpIHwgKHJpZ2h0ID4+IDMxKTsJCVwKKyAgICB0ZW1wICA9ICAobGVmdCBeIHJpZ2h0KSAmIDB4YWFhYWFhYWE7CQlcCisgICAgcmlnaHQgXj0gdGVtcDsJCQkJCVwKKyAgICBsZWZ0ICBePSB0ZW1wOwkJCQkJXAorICAgIGxlZnQgID0gIChsZWZ0IDw8IDEpIHwgKGxlZnQgPj4gMzEpOworCisvKgorICogVGhlICdpbnZlcnNlIGluaXRpYWwgcGVybXV0YXRpb24nLgorICovCisjZGVmaW5lIEZJTkFMX1BFUk1VVEFUSU9OKGxlZnQsIHRlbXAsIHJpZ2h0KQkJXAorICAgIGxlZnQgID0gIChsZWZ0IDw8IDMxKSB8IChsZWZ0ID4+IDEpOwkJXAorICAgIHRlbXAgID0gIChsZWZ0IF4gcmlnaHQpICYgMHhhYWFhYWFhYTsJCVwKKyAgICBsZWZ0ICBePSB0ZW1wOwkJCQkJXAorICAgIHJpZ2h0IF49IHRlbXA7CQkJCQlcCisgICAgcmlnaHQgID0gIChyaWdodCA8PCAzMSkgfCAocmlnaHQgPj4gMSk7CQlcCisgICAgRE9fUEVSTVVUQVRJT04ocmlnaHQsIHRlbXAsIGxlZnQsIDgsIDB4MDBmZjAwZmYpCVwKKyAgICBET19QRVJNVVRBVElPTihyaWdodCwgdGVtcCwgbGVmdCwgMiwgMHgzMzMzMzMzMykJXAorICAgIERPX1BFUk1VVEFUSU9OKGxlZnQsIHRlbXAsIHJpZ2h0LCAxNiwgMHgwMDAwZmZmZikJXAorICAgIERPX1BFUk1VVEFUSU9OKGxlZnQsIHRlbXAsIHJpZ2h0LCA0LCAweDBmMGYwZjBmKQorCisKKy8qCisgKiBBIGZ1bGwgREVTIHJvdW5kIGluY2x1ZGluZyAnZXhwYW5zaW9uIGZ1bmN0aW9uJywgJ3Nib3ggc3Vic3RpdHV0aW9uJworICogYW5kICdwcmltaXRpdmUgZnVuY3Rpb24gUCcgYnV0IHdpdGhvdXQgc3dhcHBpbmcgdGhlIGxlZnQgYW5kIHJpZ2h0IHdvcmQuCisgKiBQbGVhc2Ugbm90ZTogVGhlIGRhdGEgaW4gJ2Zyb20nIGFuZCAndG8nIGlzIGFscmVhZHkgcm90YXRlZCBvbmUgYml0IHRvCisgKiB0aGUgbGVmdCwgZG9uZSBpbiB0aGUgaW5pdGlhbCBwZXJtdXRhdGlvbi4KKyAqLworI2RlZmluZSBERVNfUk9VTkQoZnJvbSwgdG8sIHdvcmssIHN1YmtleSkJCVwKKyAgICB3b3JrID0gZnJvbSBeICpzdWJrZXkrKzsJCQkJXAorICAgIHRvIF49IHNib3g4WyAgd29yawkgICAgJiAweDNmIF07CQkJXAorICAgIHRvIF49IHNib3g2WyAod29yaz4+OCkgICYgMHgzZiBdOwkJCVwKKyAgICB0byBePSBzYm94NFsgKHdvcms+PjE2KSAmIDB4M2YgXTsJCQlcCisgICAgdG8gXj0gc2JveDJbICh3b3JrPj4yNCkgJiAweDNmIF07CQkJXAorICAgIHdvcmsgPSAoKGZyb20gPDwgMjgpIHwgKGZyb20gPj4gNCkpIF4gKnN1YmtleSsrOwlcCisgICAgdG8gXj0gc2JveDdbICB3b3JrCSAgICAmIDB4M2YgXTsJCQlcCisgICAgdG8gXj0gc2JveDVbICh3b3JrPj44KSAgJiAweDNmIF07CQkJXAorICAgIHRvIF49IHNib3gzWyAod29yaz4+MTYpICYgMHgzZiBdOwkJCVwKKyAgICB0byBePSBzYm94MVsgKHdvcms+PjI0KSAmIDB4M2YgXTsKKworLyoKKyAqIE1hY3JvcyB0byBjb252ZXJ0IDggYnl0ZXMgZnJvbS90byAzMmJpdCB3b3Jkcy4KKyAqLworI2RlZmluZSBSRUFEXzY0QklUX0RBVEEoZGF0YSwgbGVmdCwgcmlnaHQpCQkJCSAgIFwKKyAgICBsZWZ0ICA9IChkYXRhWzBdIDw8IDI0KSB8IChkYXRhWzFdIDw8IDE2KSB8IChkYXRhWzJdIDw8IDgpIHwgZGF0YVszXTsgIFwKKyAgICByaWdodCA9IChkYXRhWzRdIDw8IDI0KSB8IChkYXRhWzVdIDw8IDE2KSB8IChkYXRhWzZdIDw8IDgpIHwgZGF0YVs3XTsKKworI2RlZmluZSBXUklURV82NEJJVF9EQVRBKGRhdGEsIGxlZnQsIHJpZ2h0KQkJCQkgICBcCisgICAgZGF0YVswXSA9IChsZWZ0ID4+IDI0KSAmMHhmZjsgZGF0YVsxXSA9IChsZWZ0ID4+IDE2KSAmMHhmZjsgCSAgIFwKKyAgICBkYXRhWzJdID0gKGxlZnQgPj4gOCkgJjB4ZmY7IGRhdGFbM10gPSBsZWZ0ICYweGZmOwkJCSAgIFwKKyAgICBkYXRhWzRdID0gKHJpZ2h0ID4+IDI0KSAmMHhmZjsgZGF0YVs1XSA9IChyaWdodCA+PiAxNikgJjB4ZmY7CSAgIFwKKyAgICBkYXRhWzZdID0gKHJpZ2h0ID4+IDgpICYweGZmOyBkYXRhWzddID0gcmlnaHQgJjB4ZmY7CisKKy8qCisgKiBIYW5keSBtYWNyb3MgZm9yIGVuY3J5cHRpb24gYW5kIGRlY3J5cHRpb24gb2YgZGF0YQorICovCisjZGVmaW5lIGRlc19lY2JfZW5jcnlwdChjdHgsIGZyb20sIHRvKQkgICAgICBkZXNfZWNiX2NyeXB0KGN0eCwgZnJvbSwgdG8sIDApCisjZGVmaW5lIGRlc19lY2JfZGVjcnlwdChjdHgsIGZyb20sIHRvKQkgICAgICBkZXNfZWNiX2NyeXB0KGN0eCwgZnJvbSwgdG8sIDEpCisjZGVmaW5lIHRyaXBsZWRlc19lY2JfZW5jcnlwdChjdHgsIGZyb20sIHRvKSB0cmlwbGVkZXNfZWNiX2NyeXB0KGN0eCxmcm9tLHRvLDApCisjZGVmaW5lIHRyaXBsZWRlc19lY2JfZGVjcnlwdChjdHgsIGZyb20sIHRvKSB0cmlwbGVkZXNfZWNiX2NyeXB0KGN0eCxmcm9tLHRvLDEpCisKKworCisKKworCisvKgorICogZGVzX2tleV9zY2hlZHVsZSgpOgkgIENhbGN1bGF0ZSAxNiBzdWJrZXlzIHBhaXJzIChldmVuL29kZCkgZm9yCisgKgkJCSAgMTYgZW5jcnlwdGlvbiByb3VuZHMuCisgKgkJCSAgVG8gY2FsY3VsYXRlIHN1YmtleXMgZm9yIGRlY3J5cHRpb24gdGhlIGNhbGxlcgorICoJCQkgIGhhdmUgdG8gcmVvcmRlciB0aGUgZ2VuZXJhdGVkIHN1YmtleXMuCisgKgorICogICAgcmF3a2V5OgkgICAgOCBCeXRlcyBvZiBrZXkgZGF0YQorICogICAgc3Via2V5OgkgICAgQXJyYXkgb2YgYXQgbGVhc3QgMzIgdTMycy4gV2lsbCBiZSBmaWxsZWQKKyAqCQkgICAgd2l0aCBjYWxjdWxhdGVkIHN1YmtleXMuCisgKgorICovCitzdGF0aWMgdm9pZAorZGVzX2tleV9zY2hlZHVsZSAoY29uc3QgYnl0ZSAqIHJhd2tleSwgdTMyICogc3Via2V5KQoreworICB1MzIgbGVmdCwgcmlnaHQsIHdvcms7CisgIGludCByb3VuZDsKKworICBSRUFEXzY0QklUX0RBVEEgKHJhd2tleSwgbGVmdCwgcmlnaHQpCisKKyAgRE9fUEVSTVVUQVRJT04gKHJpZ2h0LCB3b3JrLCBsZWZ0LCA0LCAweDBmMGYwZjBmKQorICBET19QRVJNVVRBVElPTiAocmlnaHQsIHdvcmssIGxlZnQsIDAsIDB4MTAxMDEwMTApCisKKyAgbGVmdCA9ICgobGVmdGtleV9zd2FwWyhsZWZ0ID4+IDApICYgMHhmXSA8PCAzKQorICAgICAgICAgIHwgKGxlZnRrZXlfc3dhcFsobGVmdCA+PiA4KSAmIDB4Zl0gPDwgMikKKyAgICAgICAgICB8IChsZWZ0a2V5X3N3YXBbKGxlZnQgPj4gMTYpICYgMHhmXSA8PCAxKQorICAgICAgICAgIHwgKGxlZnRrZXlfc3dhcFsobGVmdCA+PiAyNCkgJiAweGZdKQorICAgICAgICAgIHwgKGxlZnRrZXlfc3dhcFsobGVmdCA+PiA1KSAmIDB4Zl0gPDwgNykKKyAgICAgICAgICB8IChsZWZ0a2V5X3N3YXBbKGxlZnQgPj4gMTMpICYgMHhmXSA8PCA2KQorICAgICAgICAgIHwgKGxlZnRrZXlfc3dhcFsobGVmdCA+PiAyMSkgJiAweGZdIDw8IDUpCisgICAgICAgICAgfCAobGVmdGtleV9zd2FwWyhsZWZ0ID4+IDI5KSAmIDB4Zl0gPDwgNCkpOworCisgIGxlZnQgJj0gMHgwZmZmZmZmZjsKKworICByaWdodCA9ICgocmlnaHRrZXlfc3dhcFsocmlnaHQgPj4gMSkgJiAweGZdIDw8IDMpCisgICAgICAgICAgIHwgKHJpZ2h0a2V5X3N3YXBbKHJpZ2h0ID4+IDkpICYgMHhmXSA8PCAyKQorICAgICAgICAgICB8IChyaWdodGtleV9zd2FwWyhyaWdodCA+PiAxNykgJiAweGZdIDw8IDEpCisgICAgICAgICAgIHwgKHJpZ2h0a2V5X3N3YXBbKHJpZ2h0ID4+IDI1KSAmIDB4Zl0pCisgICAgICAgICAgIHwgKHJpZ2h0a2V5X3N3YXBbKHJpZ2h0ID4+IDQpICYgMHhmXSA8PCA3KQorICAgICAgICAgICB8IChyaWdodGtleV9zd2FwWyhyaWdodCA+PiAxMikgJiAweGZdIDw8IDYpCisgICAgICAgICAgIHwgKHJpZ2h0a2V5X3N3YXBbKHJpZ2h0ID4+IDIwKSAmIDB4Zl0gPDwgNSkKKyAgICAgICAgICAgfCAocmlnaHRrZXlfc3dhcFsocmlnaHQgPj4gMjgpICYgMHhmXSA8PCA0KSk7CisKKyAgcmlnaHQgJj0gMHgwZmZmZmZmZjsKKworICBmb3IgKHJvdW5kID0gMDsgcm91bmQgPCAxNjsgKytyb3VuZCkKKyAgICB7CisgICAgICBsZWZ0ID0gKChsZWZ0IDw8IGVuY3J5cHRfcm90YXRlX3RhYltyb3VuZF0pCisgICAgICAgICAgICAgIHwgKGxlZnQgPj4gKDI4IC0gZW5jcnlwdF9yb3RhdGVfdGFiW3JvdW5kXSkpKSAmIDB4MGZmZmZmZmY7CisgICAgICByaWdodCA9ICgocmlnaHQgPDwgZW5jcnlwdF9yb3RhdGVfdGFiW3JvdW5kXSkKKyAgICAgICAgICAgICAgIHwgKHJpZ2h0ID4+ICgyOCAtIGVuY3J5cHRfcm90YXRlX3RhYltyb3VuZF0pKSkgJiAweDBmZmZmZmZmOworCisgICAgICAqc3Via2V5KysgPSAoKChsZWZ0IDw8IDQpICYgMHgyNDAwMDAwMCkKKyAgICAgICAgICAgICAgICAgICB8ICgobGVmdCA8PCAyOCkgJiAweDEwMDAwMDAwKQorICAgICAgICAgICAgICAgICAgIHwgKChsZWZ0IDw8IDE0KSAmIDB4MDgwMDAwMDApCisgICAgICAgICAgICAgICAgICAgfCAoKGxlZnQgPDwgMTgpICYgMHgwMjA4MDAwMCkKKyAgICAgICAgICAgICAgICAgICB8ICgobGVmdCA8PCA2KSAmIDB4MDEwMDAwMDApCisgICAgICAgICAgICAgICAgICAgfCAoKGxlZnQgPDwgOSkgJiAweDAwMjAwMDAwKQorICAgICAgICAgICAgICAgICAgIHwgKChsZWZ0ID4+IDEpICYgMHgwMDEwMDAwMCkKKyAgICAgICAgICAgICAgICAgICB8ICgobGVmdCA8PCAxMCkgJiAweDAwMDQwMDAwKQorICAgICAgICAgICAgICAgICAgIHwgKChsZWZ0IDw8IDIpICYgMHgwMDAyMDAwMCkKKyAgICAgICAgICAgICAgICAgICB8ICgobGVmdCA+PiAxMCkgJiAweDAwMDEwMDAwKQorICAgICAgICAgICAgICAgICAgIHwgKChyaWdodCA+PiAxMykgJiAweDAwMDAyMDAwKQorICAgICAgICAgICAgICAgICAgIHwgKChyaWdodCA+PiA0KSAmIDB4MDAwMDEwMDApCisgICAgICAgICAgICAgICAgICAgfCAoKHJpZ2h0IDw8IDYpICYgMHgwMDAwMDgwMCkKKyAgICAgICAgICAgICAgICAgICB8ICgocmlnaHQgPj4gMSkgJiAweDAwMDAwNDAwKQorICAgICAgICAgICAgICAgICAgIHwgKChyaWdodCA+PiAxNCkgJiAweDAwMDAwMjAwKQorICAgICAgICAgICAgICAgICAgIHwgKHJpZ2h0ICYgMHgwMDAwMDEwMCkKKyAgICAgICAgICAgICAgICAgICB8ICgocmlnaHQgPj4gNSkgJiAweDAwMDAwMDIwKQorICAgICAgICAgICAgICAgICAgIHwgKChyaWdodCA+PiAxMCkgJiAweDAwMDAwMDEwKQorICAgICAgICAgICAgICAgICAgIHwgKChyaWdodCA+PiAzKSAmIDB4MDAwMDAwMDgpCisgICAgICAgICAgICAgICAgICAgfCAoKHJpZ2h0ID4+IDE4KSAmIDB4MDAwMDAwMDQpCisgICAgICAgICAgICAgICAgICAgfCAoKHJpZ2h0ID4+IDI2KSAmIDB4MDAwMDAwMDIpCisgICAgICAgICAgICAgICAgICAgfCAoKHJpZ2h0ID4+IDI0KSAmIDB4MDAwMDAwMDEpKTsKKworICAgICAgKnN1YmtleSsrID0gKCgobGVmdCA8PCAxNSkgJiAweDIwMDAwMDAwKQorICAgICAgICAgICAgICAgICAgIHwgKChsZWZ0IDw8IDE3KSAmIDB4MTAwMDAwMDApCisgICAgICAgICAgICAgICAgICAgfCAoKGxlZnQgPDwgMTApICYgMHgwODAwMDAwMCkKKyAgICAgICAgICAgICAgICAgICB8ICgobGVmdCA8PCAyMikgJiAweDA0MDAwMDAwKQorICAgICAgICAgICAgICAgICAgIHwgKChsZWZ0ID4+IDIpICYgMHgwMjAwMDAwMCkKKyAgICAgICAgICAgICAgICAgICB8ICgobGVmdCA8PCAxKSAmIDB4MDEwMDAwMDApCisgICAgICAgICAgICAgICAgICAgfCAoKGxlZnQgPDwgMTYpICYgMHgwMDIwMDAwMCkKKyAgICAgICAgICAgICAgICAgICB8ICgobGVmdCA8PCAxMSkgJiAweDAwMTAwMDAwKQorICAgICAgICAgICAgICAgICAgIHwgKChsZWZ0IDw8IDMpICYgMHgwMDA4MDAwMCkKKyAgICAgICAgICAgICAgICAgICB8ICgobGVmdCA+PiA2KSAmIDB4MDAwNDAwMDApCisgICAgICAgICAgICAgICAgICAgfCAoKGxlZnQgPDwgMTUpICYgMHgwMDAyMDAwMCkKKyAgICAgICAgICAgICAgICAgICB8ICgobGVmdCA+PiA0KSAmIDB4MDAwMTAwMDApCisgICAgICAgICAgICAgICAgICAgfCAoKHJpZ2h0ID4+IDIpICYgMHgwMDAwMjAwMCkKKyAgICAgICAgICAgICAgICAgICB8ICgocmlnaHQgPDwgOCkgJiAweDAwMDAxMDAwKQorICAgICAgICAgICAgICAgICAgIHwgKChyaWdodCA+PiAxNCkgJiAweDAwMDAwODA4KQorICAgICAgICAgICAgICAgICAgIHwgKChyaWdodCA+PiA5KSAmIDB4MDAwMDA0MDApCisgICAgICAgICAgICAgICAgICAgfCAoKHJpZ2h0KSAmIDB4MDAwMDAyMDApCisgICAgICAgICAgICAgICAgICAgfCAoKHJpZ2h0IDw8IDcpICYgMHgwMDAwMDEwMCkKKyAgICAgICAgICAgICAgICAgICB8ICgocmlnaHQgPj4gNykgJiAweDAwMDAwMDIwKQorICAgICAgICAgICAgICAgICAgIHwgKChyaWdodCA+PiAzKSAmIDB4MDAwMDAwMTEpCisgICAgICAgICAgICAgICAgICAgfCAoKHJpZ2h0IDw8IDIpICYgMHgwMDAwMDAwNCkKKyAgICAgICAgICAgICAgICAgICB8ICgocmlnaHQgPj4gMjEpICYgMHgwMDAwMDAwMikpOworICAgIH0KK30KKworCisvKgorICogRmlsbCBhIERFUyBjb250ZXh0IHdpdGggc3Via2V5cyBjYWxjdWxhdGVkIGZyb20gYSA2NGJpdCBrZXkuCisgKiBEb2VzIG5vdCBjaGVjayBwYXJpdHkgYml0cywgYnV0IHNpbXBseSBpZ25vcmUgdGhlbS4KKyAqIERvZXMgbm90IGNoZWNrIGZvciB3ZWFrIGtleXMuCisgKi8KK3N0YXRpYyBpbnQKK2Rlc19zZXRrZXkgKHN0cnVjdCBfZGVzX2N0eCAqY3R4LCBjb25zdCBieXRlICoga2V5KQoreworICBzdGF0aWMgY29uc3QgY2hhciAqc2VsZnRlc3RfZmFpbGVkOworICBpbnQgaTsKKworICBpZiAoIWZpcHNfbW9kZSAoKSAmJiAhaW5pdGlhbGl6ZWQpCisgICAgeworICAgICAgaW5pdGlhbGl6ZWQgPSAxOworICAgICAgc2VsZnRlc3RfZmFpbGVkID0gc2VsZnRlc3QgKCk7CisKKyAgICAgIGlmIChzZWxmdGVzdF9mYWlsZWQpCisJbG9nX2Vycm9yICgiJXNcbiIsIHNlbGZ0ZXN0X2ZhaWxlZCk7CisgICAgfQorICBpZiAoc2VsZnRlc3RfZmFpbGVkKQorICAgIHJldHVybiBHUEdfRVJSX1NFTEZURVNUX0ZBSUxFRDsKKworICBkZXNfa2V5X3NjaGVkdWxlIChrZXksIGN0eC0+ZW5jcnlwdF9zdWJrZXlzKTsKKyAgX2djcnlfYnVybl9zdGFjayAoMzIpOworCisgIGZvcihpPTA7IGk8MzI7IGkrPTIpCisgICAgeworICAgICAgY3R4LT5kZWNyeXB0X3N1YmtleXNbaV0JPSBjdHgtPmVuY3J5cHRfc3Via2V5c1szMC1pXTsKKyAgICAgIGN0eC0+ZGVjcnlwdF9zdWJrZXlzW2krMV0gPSBjdHgtPmVuY3J5cHRfc3Via2V5c1szMS1pXTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKworCisvKgorICogRWxlY3Ryb25pYyBDb2RlYm9vayBNb2RlIERFUyBlbmNyeXB0aW9uL2RlY3J5cHRpb24gb2YgZGF0YSBhY2NvcmRpbmcKKyAqIHRvICdtb2RlJy4KKyAqLworc3RhdGljIGludAorZGVzX2VjYl9jcnlwdCAoc3RydWN0IF9kZXNfY3R4ICpjdHgsIGNvbnN0IGJ5dGUgKiBmcm9tLCBieXRlICogdG8sIGludCBtb2RlKQoreworICB1MzIgbGVmdCwgcmlnaHQsIHdvcms7CisgIHUzMiAqa2V5czsKKworICBrZXlzID0gbW9kZSA/IGN0eC0+ZGVjcnlwdF9zdWJrZXlzIDogY3R4LT5lbmNyeXB0X3N1YmtleXM7CisKKyAgUkVBRF82NEJJVF9EQVRBIChmcm9tLCBsZWZ0LCByaWdodCkKKyAgSU5JVElBTF9QRVJNVVRBVElPTiAobGVmdCwgd29yaywgcmlnaHQpCisKKyAgREVTX1JPVU5EIChyaWdodCwgbGVmdCwgd29yaywga2V5cykgREVTX1JPVU5EIChsZWZ0LCByaWdodCwgd29yaywga2V5cykKKyAgREVTX1JPVU5EIChyaWdodCwgbGVmdCwgd29yaywga2V5cykgREVTX1JPVU5EIChsZWZ0LCByaWdodCwgd29yaywga2V5cykKKyAgREVTX1JPVU5EIChyaWdodCwgbGVmdCwgd29yaywga2V5cykgREVTX1JPVU5EIChsZWZ0LCByaWdodCwgd29yaywga2V5cykKKyAgREVTX1JPVU5EIChyaWdodCwgbGVmdCwgd29yaywga2V5cykgREVTX1JPVU5EIChsZWZ0LCByaWdodCwgd29yaywga2V5cykKKyAgREVTX1JPVU5EIChyaWdodCwgbGVmdCwgd29yaywga2V5cykgREVTX1JPVU5EIChsZWZ0LCByaWdodCwgd29yaywga2V5cykKKyAgREVTX1JPVU5EIChyaWdodCwgbGVmdCwgd29yaywga2V5cykgREVTX1JPVU5EIChsZWZ0LCByaWdodCwgd29yaywga2V5cykKKyAgREVTX1JPVU5EIChyaWdodCwgbGVmdCwgd29yaywga2V5cykgREVTX1JPVU5EIChsZWZ0LCByaWdodCwgd29yaywga2V5cykKKyAgREVTX1JPVU5EIChyaWdodCwgbGVmdCwgd29yaywga2V5cykgREVTX1JPVU5EIChsZWZ0LCByaWdodCwgd29yaywga2V5cykKKworICBGSU5BTF9QRVJNVVRBVElPTiAocmlnaHQsIHdvcmssIGxlZnQpCisgIFdSSVRFXzY0QklUX0RBVEEgKHRvLCByaWdodCwgbGVmdCkKKworICByZXR1cm4gMDsKK30KKworCisKKy8qCisgKiBGaWxsIGEgVHJpcGxlLURFUyBjb250ZXh0IHdpdGggc3Via2V5cyBjYWxjdWxhdGVkIGZyb20gdHdvIDY0Yml0IGtleXMuCisgKiBEb2VzIG5vdCBjaGVjayB0aGUgcGFyaXR5IGJpdHMgb2YgdGhlIGtleXMsIGJ1dCBzaW1wbHkgaWdub3JlIHRoZW0uCisgKiBEb2VzIG5vdCBjaGVjayBmb3Igd2VhayBrZXlzLgorICovCitzdGF0aWMgaW50Cit0cmlwbGVkZXNfc2V0MmtleXMgKHN0cnVjdCBfdHJpcGxlZGVzX2N0eCAqY3R4LAorCQkgICAgY29uc3QgYnl0ZSAqIGtleTEsCisJCSAgICBjb25zdCBieXRlICoga2V5MikKK3sKKyAgaW50IGk7CisKKyAgZGVzX2tleV9zY2hlZHVsZSAoa2V5MSwgY3R4LT5lbmNyeXB0X3N1YmtleXMpOworICBkZXNfa2V5X3NjaGVkdWxlIChrZXkyLCAmKGN0eC0+ZGVjcnlwdF9zdWJrZXlzWzMyXSkpOworICBfZ2NyeV9idXJuX3N0YWNrICgzMik7CisKKyAgZm9yKGk9MDsgaTwzMjsgaSs9MikKKyAgICB7CisgICAgICBjdHgtPmRlY3J5cHRfc3Via2V5c1tpXQkgPSBjdHgtPmVuY3J5cHRfc3Via2V5c1szMC1pXTsKKyAgICAgIGN0eC0+ZGVjcnlwdF9zdWJrZXlzW2krMV0gID0gY3R4LT5lbmNyeXB0X3N1YmtleXNbMzEtaV07CisKKyAgICAgIGN0eC0+ZW5jcnlwdF9zdWJrZXlzW2krMzJdID0gY3R4LT5kZWNyeXB0X3N1YmtleXNbNjItaV07CisgICAgICBjdHgtPmVuY3J5cHRfc3Via2V5c1tpKzMzXSA9IGN0eC0+ZGVjcnlwdF9zdWJrZXlzWzYzLWldOworCisgICAgICBjdHgtPmVuY3J5cHRfc3Via2V5c1tpKzY0XSA9IGN0eC0+ZW5jcnlwdF9zdWJrZXlzW2ldOworICAgICAgY3R4LT5lbmNyeXB0X3N1YmtleXNbaSs2NV0gPSBjdHgtPmVuY3J5cHRfc3Via2V5c1tpKzFdOworCisgICAgICBjdHgtPmRlY3J5cHRfc3Via2V5c1tpKzY0XSA9IGN0eC0+ZGVjcnlwdF9zdWJrZXlzW2ldOworICAgICAgY3R4LT5kZWNyeXB0X3N1YmtleXNbaSs2NV0gPSBjdHgtPmRlY3J5cHRfc3Via2V5c1tpKzFdOworICAgIH0KKworICByZXR1cm4gMDsKK30KKworCisKKy8qCisgKiBGaWxsIGEgVHJpcGxlLURFUyBjb250ZXh0IHdpdGggc3Via2V5cyBjYWxjdWxhdGVkIGZyb20gdGhyZWUgNjRiaXQga2V5cy4KKyAqIERvZXMgbm90IGNoZWNrIHRoZSBwYXJpdHkgYml0cyBvZiB0aGUga2V5cywgYnV0IHNpbXBseSBpZ25vcmUgdGhlbS4KKyAqIERvZXMgbm90IGNoZWNrIGZvciB3ZWFrIGtleXMuCisgKi8KK3N0YXRpYyBpbnQKK3RyaXBsZWRlc19zZXQza2V5cyAoc3RydWN0IF90cmlwbGVkZXNfY3R4ICpjdHgsCisJCSAgICBjb25zdCBieXRlICoga2V5MSwKKwkJICAgIGNvbnN0IGJ5dGUgKiBrZXkyLAorCQkgICAgY29uc3QgYnl0ZSAqIGtleTMpCit7CisgIHN0YXRpYyBjb25zdCBjaGFyICpzZWxmdGVzdF9mYWlsZWQ7CisgIGludCBpOworCisgIGlmICghZmlwc19tb2RlICgpICYmICFpbml0aWFsaXplZCkKKyAgICB7CisgICAgICBpbml0aWFsaXplZCA9IDE7CisgICAgICBzZWxmdGVzdF9mYWlsZWQgPSBzZWxmdGVzdCAoKTsKKworICAgICAgaWYgKHNlbGZ0ZXN0X2ZhaWxlZCkKKwlsb2dfZXJyb3IgKCIlc1xuIiwgc2VsZnRlc3RfZmFpbGVkKTsKKyAgICB9CisgIGlmIChzZWxmdGVzdF9mYWlsZWQpCisgICAgcmV0dXJuIEdQR19FUlJfU0VMRlRFU1RfRkFJTEVEOworCisgIGRlc19rZXlfc2NoZWR1bGUgKGtleTEsIGN0eC0+ZW5jcnlwdF9zdWJrZXlzKTsKKyAgZGVzX2tleV9zY2hlZHVsZSAoa2V5MiwgJihjdHgtPmRlY3J5cHRfc3Via2V5c1szMl0pKTsKKyAgZGVzX2tleV9zY2hlZHVsZSAoa2V5MywgJihjdHgtPmVuY3J5cHRfc3Via2V5c1s2NF0pKTsKKyAgX2djcnlfYnVybl9zdGFjayAoMzIpOworCisgIGZvcihpPTA7IGk8MzI7IGkrPTIpCisgICAgeworICAgICAgY3R4LT5kZWNyeXB0X3N1YmtleXNbaV0JID0gY3R4LT5lbmNyeXB0X3N1YmtleXNbOTQtaV07CisgICAgICBjdHgtPmRlY3J5cHRfc3Via2V5c1tpKzFdICA9IGN0eC0+ZW5jcnlwdF9zdWJrZXlzWzk1LWldOworCisgICAgICBjdHgtPmVuY3J5cHRfc3Via2V5c1tpKzMyXSA9IGN0eC0+ZGVjcnlwdF9zdWJrZXlzWzYyLWldOworICAgICAgY3R4LT5lbmNyeXB0X3N1YmtleXNbaSszM10gPSBjdHgtPmRlY3J5cHRfc3Via2V5c1s2My1pXTsKKworICAgICAgY3R4LT5kZWNyeXB0X3N1YmtleXNbaSs2NF0gPSBjdHgtPmVuY3J5cHRfc3Via2V5c1szMC1pXTsKKyAgICAgIGN0eC0+ZGVjcnlwdF9zdWJrZXlzW2krNjVdID0gY3R4LT5lbmNyeXB0X3N1YmtleXNbMzEtaV07CisgICAgIH0KKworICByZXR1cm4gMDsKK30KKworCisKKy8qCisgKiBFbGVjdHJvbmljIENvZGVib29rIE1vZGUgVHJpcGxlLURFUyBlbmNyeXB0aW9uL2RlY3J5cHRpb24gb2YgZGF0YQorICogYWNjb3JkaW5nIHRvICdtb2RlJy4gIFNvbWV0aW1lcyB0aGlzIG1vZGUgaXMgbmFtZWQgJ0VERScgbW9kZQorICogKEVuY3J5cHRpb24tRGVjcnlwdGlvbi1FbmNyeXB0aW9uKS4KKyAqLworc3RhdGljIGludAordHJpcGxlZGVzX2VjYl9jcnlwdCAoc3RydWN0IF90cmlwbGVkZXNfY3R4ICpjdHgsIGNvbnN0IGJ5dGUgKiBmcm9tLAorICAgICAgICAgICAgICAgICAgICAgYnl0ZSAqIHRvLCBpbnQgbW9kZSkKK3sKKyAgdTMyIGxlZnQsIHJpZ2h0LCB3b3JrOworICB1MzIgKmtleXM7CisKKyAga2V5cyA9IG1vZGUgPyBjdHgtPmRlY3J5cHRfc3Via2V5cyA6IGN0eC0+ZW5jcnlwdF9zdWJrZXlzOworCisgIFJFQURfNjRCSVRfREFUQSAoZnJvbSwgbGVmdCwgcmlnaHQpCisgIElOSVRJQUxfUEVSTVVUQVRJT04gKGxlZnQsIHdvcmssIHJpZ2h0KQorCisgIERFU19ST1VORCAocmlnaHQsIGxlZnQsIHdvcmssIGtleXMpIERFU19ST1VORCAobGVmdCwgcmlnaHQsIHdvcmssIGtleXMpCisgIERFU19ST1VORCAocmlnaHQsIGxlZnQsIHdvcmssIGtleXMpIERFU19ST1VORCAobGVmdCwgcmlnaHQsIHdvcmssIGtleXMpCisgIERFU19ST1VORCAocmlnaHQsIGxlZnQsIHdvcmssIGtleXMpIERFU19ST1VORCAobGVmdCwgcmlnaHQsIHdvcmssIGtleXMpCisgIERFU19ST1VORCAocmlnaHQsIGxlZnQsIHdvcmssIGtleXMpIERFU19ST1VORCAobGVmdCwgcmlnaHQsIHdvcmssIGtleXMpCisgIERFU19ST1VORCAocmlnaHQsIGxlZnQsIHdvcmssIGtleXMpIERFU19ST1VORCAobGVmdCwgcmlnaHQsIHdvcmssIGtleXMpCisgIERFU19ST1VORCAocmlnaHQsIGxlZnQsIHdvcmssIGtleXMpIERFU19ST1VORCAobGVmdCwgcmlnaHQsIHdvcmssIGtleXMpCisgIERFU19ST1VORCAocmlnaHQsIGxlZnQsIHdvcmssIGtleXMpIERFU19ST1VORCAobGVmdCwgcmlnaHQsIHdvcmssIGtleXMpCisgIERFU19ST1VORCAocmlnaHQsIGxlZnQsIHdvcmssIGtleXMpIERFU19ST1VORCAobGVmdCwgcmlnaHQsIHdvcmssIGtleXMpCisKKyAgREVTX1JPVU5EIChsZWZ0LCByaWdodCwgd29yaywga2V5cykgREVTX1JPVU5EIChyaWdodCwgbGVmdCwgd29yaywga2V5cykKKyAgREVTX1JPVU5EIChsZWZ0LCByaWdodCwgd29yaywga2V5cykgREVTX1JPVU5EIChyaWdodCwgbGVmdCwgd29yaywga2V5cykKKyAgREVTX1JPVU5EIChsZWZ0LCByaWdodCwgd29yaywga2V5cykgREVTX1JPVU5EIChyaWdodCwgbGVmdCwgd29yaywga2V5cykKKyAgREVTX1JPVU5EIChsZWZ0LCByaWdodCwgd29yaywga2V5cykgREVTX1JPVU5EIChyaWdodCwgbGVmdCwgd29yaywga2V5cykKKyAgREVTX1JPVU5EIChsZWZ0LCByaWdodCwgd29yaywga2V5cykgREVTX1JPVU5EIChyaWdodCwgbGVmdCwgd29yaywga2V5cykKKyAgREVTX1JPVU5EIChsZWZ0LCByaWdodCwgd29yaywga2V5cykgREVTX1JPVU5EIChyaWdodCwgbGVmdCwgd29yaywga2V5cykKKyAgREVTX1JPVU5EIChsZWZ0LCByaWdodCwgd29yaywga2V5cykgREVTX1JPVU5EIChyaWdodCwgbGVmdCwgd29yaywga2V5cykKKyAgREVTX1JPVU5EIChsZWZ0LCByaWdodCwgd29yaywga2V5cykgREVTX1JPVU5EIChyaWdodCwgbGVmdCwgd29yaywga2V5cykKKworICBERVNfUk9VTkQgKHJpZ2h0LCBsZWZ0LCB3b3JrLCBrZXlzKSBERVNfUk9VTkQgKGxlZnQsIHJpZ2h0LCB3b3JrLCBrZXlzKQorICBERVNfUk9VTkQgKHJpZ2h0LCBsZWZ0LCB3b3JrLCBrZXlzKSBERVNfUk9VTkQgKGxlZnQsIHJpZ2h0LCB3b3JrLCBrZXlzKQorICBERVNfUk9VTkQgKHJpZ2h0LCBsZWZ0LCB3b3JrLCBrZXlzKSBERVNfUk9VTkQgKGxlZnQsIHJpZ2h0LCB3b3JrLCBrZXlzKQorICBERVNfUk9VTkQgKHJpZ2h0LCBsZWZ0LCB3b3JrLCBrZXlzKSBERVNfUk9VTkQgKGxlZnQsIHJpZ2h0LCB3b3JrLCBrZXlzKQorICBERVNfUk9VTkQgKHJpZ2h0LCBsZWZ0LCB3b3JrLCBrZXlzKSBERVNfUk9VTkQgKGxlZnQsIHJpZ2h0LCB3b3JrLCBrZXlzKQorICBERVNfUk9VTkQgKHJpZ2h0LCBsZWZ0LCB3b3JrLCBrZXlzKSBERVNfUk9VTkQgKGxlZnQsIHJpZ2h0LCB3b3JrLCBrZXlzKQorICBERVNfUk9VTkQgKHJpZ2h0LCBsZWZ0LCB3b3JrLCBrZXlzKSBERVNfUk9VTkQgKGxlZnQsIHJpZ2h0LCB3b3JrLCBrZXlzKQorICBERVNfUk9VTkQgKHJpZ2h0LCBsZWZ0LCB3b3JrLCBrZXlzKSBERVNfUk9VTkQgKGxlZnQsIHJpZ2h0LCB3b3JrLCBrZXlzKQorCisgIEZJTkFMX1BFUk1VVEFUSU9OIChyaWdodCwgd29yaywgbGVmdCkKKyAgV1JJVEVfNjRCSVRfREFUQSAodG8sIHJpZ2h0LCBsZWZ0KQorCisgIHJldHVybiAwOworfQorCisKKworCisKKy8qCisgKiBDaGVjayB3aGV0aGVyIHRoZSA4IGJ5dGUga2V5IGlzIHdlYWsuCisgKiBEb2VzIG5vdCBjaGVjayB0aGUgcGFyaXR5IGJpdHMgb2YgdGhlIGtleSBidXQgc2ltcGxlIGlnbm9yZSB0aGVtLgorICovCitzdGF0aWMgaW50Citpc193ZWFrX2tleSAoIGNvbnN0IGJ5dGUgKmtleSApCit7CisgIGJ5dGUgd29ya1s4XTsKKyAgaW50IGksIGxlZnQsIHJpZ2h0LCBtaWRkbGUsIGNtcF9yZXN1bHQ7CisKKyAgLyogY2xlYXIgcGFyaXR5IGJpdHMgKi8KKyAgZm9yKGk9MDsgaTw4OyArK2kpCisgICAgIHdvcmtbaV0gPSBrZXlbaV0gJiAweGZlOworCisgIC8qIGJpbmFyeSBzZWFyY2ggaW4gdGhlIHdlYWsga2V5IHRhYmxlICovCisgIGxlZnQgPSAwOworICByaWdodCA9IDYzOworICB3aGlsZShsZWZ0IDw9IHJpZ2h0KQorICAgIHsKKyAgICAgIG1pZGRsZSA9IChsZWZ0ICsgcmlnaHQpIC8gMjsKKworICAgICAgaWYgKCAhKGNtcF9yZXN1bHQ9d29ya2luZ19tZW1jbXAod29yaywgd2Vha19rZXlzW21pZGRsZV0sIDgpKSApCisJICByZXR1cm4gLTE7CisKKyAgICAgIGlmICggY21wX3Jlc3VsdCA+IDAgKQorCSAgbGVmdCA9IG1pZGRsZSArIDE7CisgICAgICBlbHNlCisJICByaWdodCA9IG1pZGRsZSAtIDE7CisgICAgfQorCisgIHJldHVybiAwOworfQorCisKKworLyoKKyAqIFBlcmZvcm1zIGEgc2VsZnRlc3Qgb2YgdGhpcyBERVMvVHJpcGxlLURFUyBpbXBsZW1lbnRhdGlvbi4KKyAqIFJldHVybnMgYW4gc3RyaW5nIHdpdGggdGhlIGVycm9yIHRleHQgb24gZmFpbHVyZS4KKyAqIFJldHVybnMgTlVMTCBpZiBhbGwgaXMgb2suCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICoKK3NlbGZ0ZXN0ICh2b2lkKQoreworICAvKgorICAgKiBDaGVjayBpZiAndTMyJyBpcyByZWFsbHkgMzIgYml0cyB3aWRlLiBUaGlzIERFUyAvIDNERVMgaW1wbGVtZW50YXRpb24KKyAgICogbmVlZCB0aGlzLgorICAgKi8KKyAgaWYgKHNpemVvZiAodTMyKSAhPSA0KQorICAgIHJldHVybiAiV3Jvbmcgd29yZCBzaXplIGZvciBERVMgY29uZmlndXJlZC4iOworCisgIC8qCisgICAqIERFUyBNYWludGVuYW5jZSBUZXN0CisgICAqLworICB7CisgICAgaW50IGk7CisgICAgYnl0ZSBrZXlbOF0gPQorICAgICAgezB4NTUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTV9OworICAgIGJ5dGUgaW5wdXRbOF0gPQorICAgICAgezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OworICAgIGJ5dGUgcmVzdWx0WzhdID0KKyAgICAgIHsweDI0LCAweDZlLCAweDlkLCAweGI5LCAweGM1LCAweDUwLCAweDM4LCAweDFhfTsKKyAgICBieXRlIHRlbXAxWzhdLCB0ZW1wMls4XSwgdGVtcDNbOF07CisgICAgZGVzX2N0eCBkZXM7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7ICsraSkKKyAgICAgIHsKKwlkZXNfc2V0a2V5IChkZXMsIGtleSk7CisJZGVzX2VjYl9lbmNyeXB0IChkZXMsIGlucHV0LCB0ZW1wMSk7CisJZGVzX2VjYl9lbmNyeXB0IChkZXMsIHRlbXAxLCB0ZW1wMik7CisJZGVzX3NldGtleSAoZGVzLCB0ZW1wMik7CisJZGVzX2VjYl9kZWNyeXB0IChkZXMsIHRlbXAxLCB0ZW1wMyk7CisJbWVtY3B5IChrZXksIHRlbXAzLCA4KTsKKwltZW1jcHkgKGlucHV0LCB0ZW1wMSwgOCk7CisgICAgICB9CisgICAgaWYgKG1lbWNtcCAodGVtcDMsIHJlc3VsdCwgOCkpCisgICAgICByZXR1cm4gIkRFUyBtYWludGVuYW5jZSB0ZXN0IGZhaWxlZC4iOworICB9CisKKworICAvKgorICAgKiBTZWxmIG1hZGUgVHJpcGxlLURFUyB0ZXN0CShEb2VzIHNvbWVib2R5IGtub3cgYW4gb2ZmaWNpYWwgdGVzdD8pCisgICAqLworICB7CisgICAgaW50IGk7CisgICAgYnl0ZSBpbnB1dFs4XSA9CisgICAgICB7MHhmZSwgMHhkYywgMHhiYSwgMHg5OCwgMHg3NiwgMHg1NCwgMHgzMiwgMHgxMH07CisgICAgYnl0ZSBrZXkxWzhdID0KKyAgICAgIHsweDEyLCAweDM0LCAweDU2LCAweDc4LCAweDlhLCAweGJjLCAweGRlLCAweGYwfTsKKyAgICBieXRlIGtleTJbOF0gPQorICAgICAgezB4MTEsIDB4MjIsIDB4MzMsIDB4NDQsIDB4ZmYsIDB4YWEsIDB4Y2MsIDB4ZGR9OworICAgIGJ5dGUgcmVzdWx0WzhdID0KKyAgICAgIHsweDdiLCAweDM4LCAweDNiLCAweDIzLCAweGEyLCAweDdkLCAweDI2LCAweGQzfTsKKworICAgIHRyaXBsZWRlc19jdHggZGVzMzsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKQorICAgICAgeworCXRyaXBsZWRlc19zZXQya2V5cyAoZGVzMywga2V5MSwga2V5Mik7CisJdHJpcGxlZGVzX2VjYl9lbmNyeXB0IChkZXMzLCBpbnB1dCwga2V5MSk7CisJdHJpcGxlZGVzX2VjYl9kZWNyeXB0IChkZXMzLCBpbnB1dCwga2V5Mik7CisJdHJpcGxlZGVzX3NldDNrZXlzIChkZXMzLCBrZXkxLCBpbnB1dCwga2V5Mik7CisJdHJpcGxlZGVzX2VjYl9lbmNyeXB0IChkZXMzLCBpbnB1dCwgaW5wdXQpOworICAgICAgfQorICAgIGlmIChtZW1jbXAgKGlucHV0LCByZXN1bHQsIDgpKQorICAgICAgcmV0dXJuICJUcmlwbGUtREVTIHRlc3QgZmFpbGVkLiI7CisgIH0KKyAgCisgIC8qCisgICAqIE1vcmUgVHJpcGxlLURFUyB0ZXN0LiAgVGhlc2UgYXJlIHRlc3R2ZWN0b3JzIGFzIHVzZWQgYnkgU1NMZWF5LAorICAgKiB0aGFua3MgdG8gSmVyb2VuIEMuIHZhbiBHZWxkZXJlbi4KKyAgICovCisgIHsgCisgICAgc3RydWN0IHsgYnl0ZSBrZXlbMjRdOyBieXRlIHBsYWluWzhdOyBieXRlIGNpcGhlcls4XTsgfSB0ZXN0ZGF0YVtdID0geworICAgICAgeyB7IDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwKKyAgICAgICAgICAweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsCisgICAgICAgICAgMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxICB9LAorICAgICAgICB7IDB4OTUsMHhGOCwweEE1LDB4RTUsMHhERCwweDMxLDB4RDksMHgwMCAgfSwKKyAgICAgICAgeyAweDgwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAgIH0KKyAgICAgIH0sCisgICAgICAKKyAgICAgIHsgeyAweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsCisgICAgICAgICAgMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLAorICAgICAgICAgIDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSAgfSwKKyAgICAgICAgeyAweDlELDB4NjQsMHg1NSwweDVBLDB4OUEsMHgxMCwweEI4LDB4NTIsIH0sCisgICAgICAgIHsgMHgwMCwweDAwLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDAwICB9CisgICAgICB9LAorICAgICAgeyB7IDB4MzgsMHg0OSwweDY3LDB4NEMsMHgyNiwweDAyLDB4MzEsMHg5RSwKKyAgICAgICAgICAweDM4LDB4NDksMHg2NywweDRDLDB4MjYsMHgwMiwweDMxLDB4OUUsCisgICAgICAgICAgMHgzOCwweDQ5LDB4NjcsMHg0QywweDI2LDB4MDIsMHgzMSwweDlFICB9LAorICAgICAgICB7IDB4NTEsMHg0NSwweDRCLDB4NTgsMHgyRCwweERGLDB4NDQsMHgwQSAgfSwKKyAgICAgICAgeyAweDcxLDB4NzgsMHg4NywweDZFLDB4MDEsMHhGMSwweDlCLDB4MkEgIH0KKyAgICAgIH0sCisgICAgICB7IHsgMHgwNCwweEI5LDB4MTUsMHhCQSwweDQzLDB4RkUsMHhCNSwweEI2LAorICAgICAgICAgIDB4MDQsMHhCOSwweDE1LDB4QkEsMHg0MywweEZFLDB4QjUsMHhCNiwKKyAgICAgICAgICAweDA0LDB4QjksMHgxNSwweEJBLDB4NDMsMHhGRSwweEI1LDB4QjYgIH0sCisgICAgICAgIHsgMHg0MiwweEZELDB4NDQsMHgzMCwweDU5LDB4NTcsMHg3RiwweEEyICB9LAorICAgICAgICB7IDB4QUYsMHgzNywweEZCLDB4NDIsMHgxRiwweDhDLDB4NDAsMHg5NSAgfQorICAgICAgfSwKKyAgICAgIHsgeyAweDAxLDB4MjMsMHg0NSwweDY3LDB4ODksMHhBQiwweENELDB4RUYsCisgICAgICAgICAgMHgwMSwweDIzLDB4NDUsMHg2NywweDg5LDB4QUIsMHhDRCwweEVGLAorICAgICAgICAgIDB4MDEsMHgyMywweDQ1LDB4NjcsMHg4OSwweEFCLDB4Q0QsMHhFRiAgfSwKKyAgICAgICAgeyAweDczLDB4NkYsMHg2RCwweDY1LDB4NjQsMHg2MSwweDc0LDB4NjEgIH0sCisgICAgICAgIHsgMHgzRCwweDEyLDB4NEYsMHhFMiwweDE5LDB4OEIsMHhBMywweDE4ICB9CisgICAgICB9LAorICAgICAgeyB7IDB4MDEsMHgyMywweDQ1LDB4NjcsMHg4OSwweEFCLDB4Q0QsMHhFRiwKKyAgICAgICAgICAweDU1LDB4NTUsMHg1NSwweDU1LDB4NTUsMHg1NSwweDU1LDB4NTUsCisgICAgICAgICAgMHgwMSwweDIzLDB4NDUsMHg2NywweDg5LDB4QUIsMHhDRCwweEVGICB9LAorICAgICAgICB7IDB4NzMsMHg2RiwweDZELDB4NjUsMHg2NCwweDYxLDB4NzQsMHg2MSAgfSwKKyAgICAgICAgeyAweEZCLDB4QUIsMHhBMSwweEZGLDB4OUQsMHgwNSwweEU5LDB4QjEgIH0KKyAgICAgIH0sCisgICAgICB7IHsgMHgwMSwweDIzLDB4NDUsMHg2NywweDg5LDB4QUIsMHhDRCwweEVGLAorICAgICAgICAgIDB4NTUsMHg1NSwweDU1LDB4NTUsMHg1NSwweDU1LDB4NTUsMHg1NSwKKyAgICAgICAgICAweEZFLDB4REMsMHhCQSwweDk4LDB4NzYsMHg1NCwweDMyLDB4MTAgIH0sCisgICAgICAgIHsgMHg3MywweDZGLDB4NkQsMHg2NSwweDY0LDB4NjEsMHg3NCwweDYxICB9LAorICAgICAgICB7IDB4MTgsMHhkNywweDQ4LDB4ZTUsMHg2MywweDYyLDB4MDUsMHg3MiAgfQorICAgICAgfSwKKyAgICAgIHsgeyAweDAzLDB4NTIsMHgwMiwweDA3LDB4NjcsMHgyMCwweDgyLDB4MTcsCisgICAgICAgICAgMHg4NiwweDAyLDB4ODcsMHg2NiwweDU5LDB4MDgsMHgyMSwweDk4LAorICAgICAgICAgIDB4NjQsMHgwNSwweDZBLDB4QkQsMHhGRSwweEE5LDB4MzQsMHg1NyAgfSwKKyAgICAgICAgeyAweDczLDB4NzEsMHg3NSwweDY5LDB4NjcsMHg2NywweDZDLDB4NjUgIH0sCisgICAgICAgIHsgMHhjMCwweDdkLDB4MmEsMHgwZiwweGE1LDB4NjYsMHhmYSwweDMwICB9CisgICAgICB9LAorICAgICAgeyB7IDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwKKyAgICAgICAgICAweDgwLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsCisgICAgICAgICAgMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAyICB9LAorICAgICAgICB7IDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCAgfSwKKyAgICAgICAgeyAweGU2LDB4ZTYsMHhkZCwweDViLDB4N2UsMHg3MiwweDI5LDB4NzQgIH0KKyAgICAgIH0sCisgICAgICB7IHsgMHgxMCwweDQ2LDB4MTAsMHgzNCwweDg5LDB4OTgsMHg4MCwweDIwLAorICAgICAgICAgIDB4OTEsMHgwNywweEQwLDB4MTUsMHg4OSwweDE5LDB4MDEsMHgwMSwKKyAgICAgICAgICAweDE5LDB4MDcsMHg5MiwweDEwLDB4OTgsMHgxQSwweDAxLDB4MDEgIH0sCisgICAgICAgIHsgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwICB9LAorICAgICAgICB7IDB4ZTEsMHhlZiwweDYyLDB4YzMsMHgzMiwweGZlLDB4ODIsMHg1YiAgfQorICAgICAgfQorICAgIH07CisKKyAgICBieXRlCQlyZXN1bHRbOF07CisgICAgaW50CQlpOworICAgIHRyaXBsZWRlc19jdHgJZGVzMzsKKworICAgIGZvciAoaT0wOyBpPHNpemVvZih0ZXN0ZGF0YSkvc2l6ZW9mKCp0ZXN0ZGF0YSk7ICsraSkKKyAgICAgIHsKKyAgICAgICAgdHJpcGxlZGVzX3NldDNrZXlzIChkZXMzLCB0ZXN0ZGF0YVtpXS5rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGRhdGFbaV0ua2V5ICsgOCwgdGVzdGRhdGFbaV0ua2V5ICsgMTYpOworICAgICAgICAKKyAgICAgICAgdHJpcGxlZGVzX2VjYl9lbmNyeXB0IChkZXMzLCB0ZXN0ZGF0YVtpXS5wbGFpbiwgcmVzdWx0KTsKKyAgICAgICAgaWYgKG1lbWNtcCAodGVzdGRhdGFbaV0uY2lwaGVyLCByZXN1bHQsIDgpKQorICAgICAgICAgIHJldHVybiAiVHJpcGxlLURFUyBTU0xlYXkgdGVzdCBmYWlsZWQgb24gZW5jcnlwdGlvbi4iOworCisgICAgICAgIHRyaXBsZWRlc19lY2JfZGVjcnlwdCAoZGVzMywgdGVzdGRhdGFbaV0uY2lwaGVyLCByZXN1bHQpOworICAgICAgICBpZiAobWVtY21wICh0ZXN0ZGF0YVtpXS5wbGFpbiwgcmVzdWx0LCA4KSkKKyAgICAgICAgICByZXR1cm4gICJUcmlwbGUtREVTIFNTTGVheSB0ZXN0IGZhaWxlZCBvbiBkZWNyeXB0aW9uLiI7OworICAgICAgfQorICB9CisKKyAgLyoKKyAgICogQ2hlY2sgdGhlIHdlYWsga2V5IGRldGVjdGlvbi4gV2Ugc2ltcGx5IGFzc3VtZSB0aGF0IHRoZSB0YWJsZQorICAgKiB3aXRoIHdlYWsga2V5cyBpcyBvayBhbmQgY2hlY2sgZXZlcnkga2V5IGluIHRoZSB0YWJsZSBpZiBpdCBpcworICAgKiBkZXRlY3RlZC4uLiAoVGhpcyB0ZXN0IGlzIGEgbGl0dGxlIGJpdCBzdHVwaWQpLgorICAgKi8KKyAgeworICAgIGludCBpOworICAgIHVuc2lnbmVkIGNoYXIgKnA7CisgICAgZ2NyeV9tZF9oZF90IGg7CisKKyAgICBpZiAoX2djcnlfbWRfb3BlbiAoJmgsIEdDUllfTURfU0hBMSwgMCkpCisgICAgICByZXR1cm4gIlNIQTEgbm90IGF2YWlsYWJsZSI7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7ICsraSkKKyAgICAgIF9nY3J5X21kX3dyaXRlIChoLCB3ZWFrX2tleXNbaV0sIDgpOworICAgIHAgPSBfZ2NyeV9tZF9yZWFkIChoLCBHQ1JZX01EX1NIQTEpOworICAgIGkgPSBtZW1jbXAgKHAsIHdlYWtfa2V5c19jaGtzdW0sIDIwKTsKKyAgICBfZ2NyeV9tZF9jbG9zZSAoaCk7CisgICAgaWYgKGkpCisgICAgICByZXR1cm4gIndlYWsga2V5IHRhYmxlIGRlZmVjdCI7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7ICsraSkKKyAgICAgIGlmICghaXNfd2Vha19rZXkod2Vha19rZXlzW2ldKSkKKyAgICAgICAgcmV0dXJuICJERVMgd2VhayBrZXkgZGV0ZWN0aW9uIGZhaWxlZCI7CisgIH0KKworICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgZ2NyeV9lcnJfY29kZV90Citkb190cmlwbGVkZXNfc2V0a2V5ICggdm9pZCAqY29udGV4dCwgY29uc3QgYnl0ZSAqa2V5LCB1bnNpZ25lZCBrZXlsZW4gKQoreworICBzdHJ1Y3QgX3RyaXBsZWRlc19jdHggKmN0eCA9IChzdHJ1Y3QgX3RyaXBsZWRlc19jdHggKikgY29udGV4dDsKKworICBpZigga2V5bGVuICE9IDI0ICkKKyAgICByZXR1cm4gR1BHX0VSUl9JTlZfS0VZTEVOOworCisgIHRyaXBsZWRlc19zZXQza2V5cyAoIGN0eCwga2V5LCBrZXkrOCwga2V5KzE2KTsKKworICBpZiAoY3R4LT5mbGFncy5ub193ZWFrX2tleSkKKyAgICA7IC8qIERldGVjdGlvbiBoYXMgYmVlbiBkaXNhYmxlZC4gICovCisgIGVsc2UgaWYgKGlzX3dlYWtfa2V5IChrZXkpIHx8IGlzX3dlYWtfa2V5IChrZXkrOCkgfHwgaXNfd2Vha19rZXkgKGtleSsxNikpCisgICAgeworICAgICAgX2djcnlfYnVybl9zdGFjayAoNjQpOworICAgICAgcmV0dXJuIEdQR19FUlJfV0VBS19LRVk7CisgICAgfQorICBfZ2NyeV9idXJuX3N0YWNrICg2NCk7CisKKyAgcmV0dXJuIEdQR19FUlJfTk9fRVJST1I7Cit9CisKKworc3RhdGljIGdjcnlfZXJyX2NvZGVfdAorZG9fdHJpcGxlZGVzX3NldF9leHRyYV9pbmZvICh2b2lkICpjb250ZXh0LCBpbnQgd2hhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnVmbGVuKQoreworICBzdHJ1Y3QgX3RyaXBsZWRlc19jdHggKmN0eCA9IChzdHJ1Y3QgX3RyaXBsZWRlc19jdHggKiljb250ZXh0OworICBncGdfZXJyX2NvZGVfdCBlYyA9IDA7CisKKyAgKHZvaWQpYnVmZmVyOworICAodm9pZClidWZsZW47CisKKyAgc3dpdGNoICh3aGF0KQorICAgIHsKKyAgICBjYXNlIENJUEhFUl9JTkZPX05PX1dFQUtfS0VZOgorICAgICAgY3R4LT5mbGFncy5ub193ZWFrX2tleSA9IDE7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBlYyA9IEdQR19FUlJfSU5WX09QOyAKKyAgICAgIGJyZWFrOworICAgIH0KKyAgcmV0dXJuIGVjOworfQorCisKK3N0YXRpYyB2b2lkCitkb190cmlwbGVkZXNfZW5jcnlwdCggdm9pZCAqY29udGV4dCwgYnl0ZSAqb3V0YnVmLCBjb25zdCBieXRlICppbmJ1ZiApCit7CisgIHN0cnVjdCBfdHJpcGxlZGVzX2N0eCAqY3R4ID0gKHN0cnVjdCBfdHJpcGxlZGVzX2N0eCAqKSBjb250ZXh0OworCisgIHRyaXBsZWRlc19lY2JfZW5jcnlwdCAoIGN0eCwgaW5idWYsIG91dGJ1ZiApOworICBfZ2NyeV9idXJuX3N0YWNrICgzMik7Cit9CisKK3N0YXRpYyB2b2lkCitkb190cmlwbGVkZXNfZGVjcnlwdCggdm9pZCAqY29udGV4dCwgYnl0ZSAqb3V0YnVmLCBjb25zdCBieXRlICppbmJ1ZiApCit7CisgIHN0cnVjdCBfdHJpcGxlZGVzX2N0eCAqY3R4ID0gKHN0cnVjdCBfdHJpcGxlZGVzX2N0eCAqKSBjb250ZXh0OworICB0cmlwbGVkZXNfZWNiX2RlY3J5cHQgKCBjdHgsIGluYnVmLCBvdXRidWYgKTsKKyAgX2djcnlfYnVybl9zdGFjayAoMzIpOworfQorCitzdGF0aWMgZ2NyeV9lcnJfY29kZV90Citkb19kZXNfc2V0a2V5ICh2b2lkICpjb250ZXh0LCBjb25zdCBieXRlICprZXksIHVuc2lnbmVkIGtleWxlbikKK3sKKyAgc3RydWN0IF9kZXNfY3R4ICpjdHggPSAoc3RydWN0IF9kZXNfY3R4ICopIGNvbnRleHQ7CisKKyAgaWYgKGtleWxlbiAhPSA4KQorICAgIHJldHVybiBHUEdfRVJSX0lOVl9LRVlMRU47CisKKyAgZGVzX3NldGtleSAoY3R4LCBrZXkpOworCisgIGlmIChpc193ZWFrX2tleSAoa2V5KSkgeworICAgIF9nY3J5X2J1cm5fc3RhY2sgKDY0KTsKKyAgICByZXR1cm4gR1BHX0VSUl9XRUFLX0tFWTsKKyAgfQorICBfZ2NyeV9idXJuX3N0YWNrICg2NCk7CisKKyAgcmV0dXJuIEdQR19FUlJfTk9fRVJST1I7Cit9CisKKworc3RhdGljIHZvaWQKK2RvX2Rlc19lbmNyeXB0KCB2b2lkICpjb250ZXh0LCBieXRlICpvdXRidWYsIGNvbnN0IGJ5dGUgKmluYnVmICkKK3sKKyAgc3RydWN0IF9kZXNfY3R4ICpjdHggPSAoc3RydWN0IF9kZXNfY3R4ICopIGNvbnRleHQ7CisKKyAgZGVzX2VjYl9lbmNyeXB0ICggY3R4LCBpbmJ1Ziwgb3V0YnVmICk7CisgIF9nY3J5X2J1cm5fc3RhY2sgKDMyKTsKK30KKworc3RhdGljIHZvaWQKK2RvX2Rlc19kZWNyeXB0KCB2b2lkICpjb250ZXh0LCBieXRlICpvdXRidWYsIGNvbnN0IGJ5dGUgKmluYnVmICkKK3sKKyAgc3RydWN0IF9kZXNfY3R4ICpjdHggPSAoc3RydWN0IF9kZXNfY3R4ICopIGNvbnRleHQ7CisKKyAgZGVzX2VjYl9kZWNyeXB0ICggY3R4LCBpbmJ1Ziwgb3V0YnVmICk7CisgIF9nY3J5X2J1cm5fc3RhY2sgKDMyKTsKK30KKworCisKKwwKKy8qIAorICAgICBTZWxmLXRlc3Qgc2VjdGlvbi4KKyAqLworCisKKy8qIFNlbGZ0ZXN0IGZvciBUcmlwbGVERVMuICAqLworc3RhdGljIGdwZ19lcnJfY29kZV90CitzZWxmdGVzdF9maXBzIChpbnQgZXh0ZW5kZWQsIHNlbGZ0ZXN0X3JlcG9ydF9mdW5jX3QgcmVwb3J0KQoreworICBjb25zdCBjaGFyICp3aGF0OworICBjb25zdCBjaGFyICplcnJ0eHQ7CisgIAorICAodm9pZClleHRlbmRlZDsgLyogTm8gZXh0ZW5kZWQgdGVzdHMgYXZhaWxhYmxlLiAgKi8KKworICB3aGF0ID0gImxvdy1sZXZlbCI7CisgIGVycnR4dCA9IHNlbGZ0ZXN0ICgpOworICBpZiAoZXJydHh0KQorICAgIGdvdG8gZmFpbGVkOworCisgIC8qIFRoZSBsb3ctbGV2ZWwgc2VsZi10ZXN0cyBhcmUgcXVpdGUgZXh0ZW5zaXZlIGFuZCB0aHVzIHdlIGNhbiBkbworICAgICB3aXRob3V0IGhpZ2ggbGV2ZWwgdGVzdHMuICBUaGlzIGlzIGFsc28ganVzdGlmaWVkIGJlY2F1c2Ugd2UgaGF2ZQorICAgICBubyBjdXN0b20gYmxvY2sgY29kZSBpbXBsZW1lbnRhdGlvbiBmb3IgM2RlcyBidXQgYWx3YXlzIHVzZSB0aGUKKyAgICAgc3RhbmRhcmQgaGlnaCBsZXZlbCBibG9jayBjb2RlLiAgKi8KKworICByZXR1cm4gMDsgLyogU3VjY2VlZGVkLiAqLworCisgZmFpbGVkOgorICBpZiAocmVwb3J0KQorICAgIHJlcG9ydCAoImNpcGhlciIsIEdDUllfQ0lQSEVSXzNERVMsIHdoYXQsIGVycnR4dCk7CisgIHJldHVybiBHUEdfRVJSX1NFTEZURVNUX0ZBSUxFRDsKK30KKworCisKKy8qIFJ1biBhIGZ1bGwgc2VsZi10ZXN0IGZvciBBTEdPIGFuZCByZXR1cm4gMCBvbiBzdWNjZXNzLiAgKi8KK3N0YXRpYyBncGdfZXJyX2NvZGVfdAorcnVuX3NlbGZ0ZXN0cyAoaW50IGFsZ28sIGludCBleHRlbmRlZCwgc2VsZnRlc3RfcmVwb3J0X2Z1bmNfdCByZXBvcnQpCit7CisgIGdwZ19lcnJfY29kZV90IGVjOworCisgIHN3aXRjaCAoYWxnbykKKyAgICB7CisgICAgY2FzZSBHQ1JZX0NJUEhFUl8zREVTOgorICAgICAgZWMgPSBzZWxmdGVzdF9maXBzIChleHRlbmRlZCwgcmVwb3J0KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBlYyA9IEdQR19FUlJfQ0lQSEVSX0FMR087CisgICAgICBicmVhazsKKyAgICAgICAgCisgICAgfQorICByZXR1cm4gZWM7Cit9CisKKworDAorZ2NyeV9jaXBoZXJfc3BlY190IF9nY3J5X2NpcGhlcl9zcGVjX2RlcyA9CisgIHsKKyAgICAiREVTIiwgTlVMTCwgTlVMTCwgOCwgNjQsIHNpemVvZiAoc3RydWN0IF9kZXNfY3R4KSwKKyAgICBkb19kZXNfc2V0a2V5LCBkb19kZXNfZW5jcnlwdCwgZG9fZGVzX2RlY3J5cHQKKyAgfTsKKworc3RhdGljIGdjcnlfY2lwaGVyX29pZF9zcGVjX3Qgb2lkc190cmlwbGVkZXNbXSA9CisgIHsKKyAgICB7ICIxLjIuODQwLjExMzU0OS4zLjciLCBHQ1JZX0NJUEhFUl9NT0RFX0NCQyB9LAorICAgIC8qIFRlbGV0cnVzdCBzcGVjaWZpYyBPSUQgZm9yIDNERVMuICovCisgICAgeyAiMS4zLjM2LjMuMS4zLjIuMSIsICAgR0NSWV9DSVBIRVJfTU9ERV9DQkMgfSwKKyAgICAvKiBwYmVXaXRoU0hBQW5kM19LZXlUcmlwbGVERVNfQ0JDICovCisgICAgeyAiMS4yLjg0MC4xMTM1NDkuMS4xMi4xLjMiLCBHQ1JZX0NJUEhFUl9NT0RFX0NCQyB9LAorICAgIHsgTlVMTCB9CisgIH07CisKK2djcnlfY2lwaGVyX3NwZWNfdCBfZ2NyeV9jaXBoZXJfc3BlY190cmlwbGVkZXMgPQorICB7CisgICAgIjNERVMiLCBOVUxMLCBvaWRzX3RyaXBsZWRlcywgOCwgMTkyLCBzaXplb2YgKHN0cnVjdCBfdHJpcGxlZGVzX2N0eCksCisgICAgZG9fdHJpcGxlZGVzX3NldGtleSwgZG9fdHJpcGxlZGVzX2VuY3J5cHQsIGRvX3RyaXBsZWRlc19kZWNyeXB0CisgIH07CisKK2NpcGhlcl9leHRyYV9zcGVjX3QgX2djcnlfY2lwaGVyX2V4dHJhc3BlY190cmlwbGVkZXMgPSAKKyAgeworICAgIHJ1bl9zZWxmdGVzdHMsCisgICAgZG9fdHJpcGxlZGVzX3NldF9leHRyYV9pbmZvCisgIH07CmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvY2lwaGVyL2RzYS5jIGIvbGliZ2NyeXB0LTEuNC42L2NpcGhlci9kc2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWI5NDk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L2NpcGhlci9kc2EuYwpAQCAtMCwwICsxLDExODIgQEAKKy8qIGRzYS5jIC0gRFNBIHNpZ25hdHVyZSBhbGdvcml0aG0KKyAqIENvcHlyaWdodCAoQykgMTk5OCwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywKKyAqICAgICAgICAgICAgICAgMjAwNiwgMjAwOCAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZzEwbGliLmgiCisjaW5jbHVkZSAibXBpLmgiCisjaW5jbHVkZSAiY2lwaGVyLmgiCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGdjcnlfbXBpX3QgcDsJICAgIC8qIHByaW1lICovCisgIGdjcnlfbXBpX3QgcTsJICAgIC8qIGdyb3VwIG9yZGVyICovCisgIGdjcnlfbXBpX3QgZzsJICAgIC8qIGdyb3VwIGdlbmVyYXRvciAqLworICBnY3J5X21waV90IHk7CSAgICAvKiBnXnggbW9kIHAgKi8KK30gRFNBX3B1YmxpY19rZXk7CisKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgZ2NyeV9tcGlfdCBwOwkgICAgLyogcHJpbWUgKi8KKyAgZ2NyeV9tcGlfdCBxOwkgICAgLyogZ3JvdXAgb3JkZXIgKi8KKyAgZ2NyeV9tcGlfdCBnOwkgICAgLyogZ3JvdXAgZ2VuZXJhdG9yICovCisgIGdjcnlfbXBpX3QgeTsJICAgIC8qIGdeeCBtb2QgcCAqLworICBnY3J5X21waV90IHg7CSAgICAvKiBzZWNyZXQgZXhwb25lbnQgKi8KK30gRFNBX3NlY3JldF9rZXk7CisKKworLyogQSBzdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGRvbWFpbiBwYXJhbWV0ZXJzLiAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIGdjcnlfbXBpX3QgcDsJICAgIC8qIHByaW1lICovCisgIGdjcnlfbXBpX3QgcTsJICAgIC8qIGdyb3VwIG9yZGVyICovCisgIGdjcnlfbXBpX3QgZzsJICAgIC8qIGdyb3VwIGdlbmVyYXRvciAqLworfSBkc2FfZG9tYWluX3Q7CisKKworLyogQSBzYW1wbGUgMTAyNCBiaXQgRFNBIGtleSB1c2VkIGZvciB0aGUgc2VsZnRlc3RzLiAgKi8KK3N0YXRpYyBjb25zdCBjaGFyIHNhbXBsZV9zZWNyZXRfa2V5W10gPQorIihwcml2YXRlLWtleSIKKyIgKGRzYSIKKyIgIChwICMwMEFEN0MwMDI1QkExQTE1Rjc3NUYzRjJENjczNzE4MzkxRDAwNDU2OTc4RDM0N0IzM0Q3QjQ5RTdGMzJFREFCIgorIiAgICAgIDk2MjczODk5REQ4QjJCQjQ2Q0Q2RUNBMjYzRkFGMDRBMjg5MDM1MDNENTkwNjJBODg2NUQyQUU4QURGQjUxOTEiCisiICAgICAgQ0YzNkZGQjU2MkQwRTJGNTgwOTgwMUExRjY3NURBRTU5Njk4QTlFMDFFRkU4RDdEQ0ZDQTA4NEY0QzZGNUE0NCIKKyIgICAgICA0NEQ0OTlBMDZGRkFFQTVFOEVGNUUwMUYyRkQyMEE3QjdFRjNGNjk2OEFGQkExRkI4RDkxRjE1NTlENTJEODc3N0IjKSIKKyIgIChxICMwMEVCN0I1NzUxRDI1RUJCQjdCRDU5RDkyMDMxNUZEODQwRTE5QUVCRjkjKSIKKyIgIChnICMxNTc0MzYzMzg3RkRGRDFEREYzOEY0RkJFMTM1QkIyMEM3RUU0NzcyRkI5NEMzMzdBRjg2RUE4RTQ5NjY2NTAzIgorIiAgICAgIEFFMDRCNkJFODFBMkY4REQwOTUzMTFFMDIxN0FDQTY5OEExMUU2QzVEMzNDQ0RBRTcxNDk4RUQzNUQxMzk5MUUiCisiICAgICAgQjAyRjA5QUI0MEJEOEY0QzVFRDhDNzVEQTc3OUQwQUUxMDRCQzM0Qzk2MEIwMDIzNzcwNjhBQjRCNUExRjk4NCIKKyIgICAgICAzRkJBOTFGNTM3RjFCN0NBQzREOERENkQ4OUIwRDg2M0FGNzAyNUQ1NDlGOUM3NjVEMkZDMDdFRTIwOEY4RDE1IykiCisiICAoeSAjNjRCMTFFRjg4NzFCRTRBQjU3MkFBODEwRDVEM0NBMTFBNkNEQkM2MzdBODAxNDYwMkM3Mjk2MERCMTM1QkY0NiIKKyIgICAgICBBMTgxNkE3MjRDMzRGODczMzBGQzlFMTg3QzVENjY4OTdBMDQ1MzVDQzJBQzkxNjRBNzE1MEFCRkE4MTc5ODI3IgorIiAgICAgIDZFNDU4MzFBQjgxMUVFRTg0OEVCQjI0RDlGNUYyODgzQjZFNUREQzRDNjU5REVGOTQ0RENGRDgwQkY0RDBBMjAiCisiICAgICAgNDJDQUE3REMyODlGMEM1QTlEMTU1RjAyRDNENTUxREI3NDFBODE2OTVCNzRENEM4RjQ3N0Y5Qzc4MzhFQjBGQiMpIgorIiAgKHggIzExRDU0RTRBREJEMzAzNDE2MEYyQ0VENEI3Q0QyOTJBNEVCRjNFQzAjKSkpIjsKKy8qIEEgc2FtcGxlIDEwMjQgYml0IERTQSBrZXkgdXNlZCBmb3IgdGhlIHNlbGZ0ZXN0cyAocHVibGljIG9ubHkpLiAgKi8KK3N0YXRpYyBjb25zdCBjaGFyIHNhbXBsZV9wdWJsaWNfa2V5W10gPSAKKyIocHVibGljLWtleSIKKyIgKGRzYSIKKyIgIChwICMwMEFEN0MwMDI1QkExQTE1Rjc3NUYzRjJENjczNzE4MzkxRDAwNDU2OTc4RDM0N0IzM0Q3QjQ5RTdGMzJFREFCIgorIiAgICAgIDk2MjczODk5REQ4QjJCQjQ2Q0Q2RUNBMjYzRkFGMDRBMjg5MDM1MDNENTkwNjJBODg2NUQyQUU4QURGQjUxOTEiCisiICAgICAgQ0YzNkZGQjU2MkQwRTJGNTgwOTgwMUExRjY3NURBRTU5Njk4QTlFMDFFRkU4RDdEQ0ZDQTA4NEY0QzZGNUE0NCIKKyIgICAgICA0NEQ0OTlBMDZGRkFFQTVFOEVGNUUwMUYyRkQyMEE3QjdFRjNGNjk2OEFGQkExRkI4RDkxRjE1NTlENTJEODc3N0IjKSIKKyIgIChxICMwMEVCN0I1NzUxRDI1RUJCQjdCRDU5RDkyMDMxNUZEODQwRTE5QUVCRjkjKSIKKyIgIChnICMxNTc0MzYzMzg3RkRGRDFEREYzOEY0RkJFMTM1QkIyMEM3RUU0NzcyRkI5NEMzMzdBRjg2RUE4RTQ5NjY2NTAzIgorIiAgICAgIEFFMDRCNkJFODFBMkY4REQwOTUzMTFFMDIxN0FDQTY5OEExMUU2QzVEMzNDQ0RBRTcxNDk4RUQzNUQxMzk5MUUiCisiICAgICAgQjAyRjA5QUI0MEJEOEY0QzVFRDhDNzVEQTc3OUQwQUUxMDRCQzM0Qzk2MEIwMDIzNzcwNjhBQjRCNUExRjk4NCIKKyIgICAgICAzRkJBOTFGNTM3RjFCN0NBQzREOERENkQ4OUIwRDg2M0FGNzAyNUQ1NDlGOUM3NjVEMkZDMDdFRTIwOEY4RDE1IykiCisiICAoeSAjNjRCMTFFRjg4NzFCRTRBQjU3MkFBODEwRDVEM0NBMTFBNkNEQkM2MzdBODAxNDYwMkM3Mjk2MERCMTM1QkY0NiIKKyIgICAgICBBMTgxNkE3MjRDMzRGODczMzBGQzlFMTg3QzVENjY4OTdBMDQ1MzVDQzJBQzkxNjRBNzE1MEFCRkE4MTc5ODI3IgorIiAgICAgIDZFNDU4MzFBQjgxMUVFRTg0OEVCQjI0RDlGNUYyODgzQjZFNUREQzRDNjU5REVGOTQ0RENGRDgwQkY0RDBBMjAiCisiICAgICAgNDJDQUE3REMyODlGMEM1QTlEMTU1RjAyRDNENTUxREI3NDFBODE2OTVCNzRENEM4RjQ3N0Y5Qzc4MzhFQjBGQiMpKSkiOworCisKKworDAorc3RhdGljIGdjcnlfbXBpX3QgZ2VuX2sgKGdjcnlfbXBpX3QgcSk7CitzdGF0aWMgaW50IHRlc3Rfa2V5cyAoRFNBX3NlY3JldF9rZXkgKnNrLCB1bnNpZ25lZCBpbnQgcWJpdHMpOworc3RhdGljIGludCBjaGVja19zZWNyZXRfa2V5IChEU0Ffc2VjcmV0X2tleSAqc2spOworc3RhdGljIGdwZ19lcnJfY29kZV90IGdlbmVyYXRlIChEU0Ffc2VjcmV0X2tleSAqc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHFiaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJhbnNpZW50X2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHNhX2RvbWFpbl90ICpkb21haW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfbXBpX3QgKipyZXRfZmFjdG9ycyk7CitzdGF0aWMgdm9pZCBzaWduIChnY3J5X21waV90IHIsIGdjcnlfbXBpX3QgcywgZ2NyeV9tcGlfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgIERTQV9zZWNyZXRfa2V5ICpza2V5KTsKK3N0YXRpYyBpbnQgdmVyaWZ5IChnY3J5X21waV90IHIsIGdjcnlfbXBpX3QgcywgZ2NyeV9tcGlfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICBEU0FfcHVibGljX2tleSAqcGtleSk7CisKK3N0YXRpYyB2b2lkICgqcHJvZ3Jlc3NfY2IpICh2b2lkICosY29uc3QgY2hhciAqLCBpbnQsIGludCwgaW50ICk7CitzdGF0aWMgdm9pZCAqcHJvZ3Jlc3NfY2JfZGF0YTsKKworCit2b2lkCitfZ2NyeV9yZWdpc3Rlcl9wa19kc2FfcHJvZ3Jlc3MgKHZvaWQgKCpjYikgKHZvaWQgKiwgY29uc3QgY2hhciAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQsIGludCwgaW50KSwKKwkJCQl2b2lkICpjYl9kYXRhKQoreworICBwcm9ncmVzc19jYiA9IGNiOworICBwcm9ncmVzc19jYl9kYXRhID0gY2JfZGF0YTsKK30KKworCitzdGF0aWMgdm9pZAorcHJvZ3Jlc3MgKGludCBjKQoreworICBpZiAocHJvZ3Jlc3NfY2IpCisgICAgcHJvZ3Jlc3NfY2IgKHByb2dyZXNzX2NiX2RhdGEsICJwa19kc2EiLCBjLCAwLCAwKTsKK30KKworCisvKgorICogR2VuZXJhdGUgYSByYW5kb20gc2VjcmV0IGV4cG9uZW50IGsgbGVzcyB0aGFuIHEuCisgKi8KK3N0YXRpYyBnY3J5X21waV90CitnZW5fayggZ2NyeV9tcGlfdCBxICkKK3sKKyAgZ2NyeV9tcGlfdCBrID0gbXBpX2FsbG9jX3NlY3VyZSggbXBpX2dldF9ubGltYnMocSkgKTsKKyAgdW5zaWduZWQgaW50IG5iaXRzID0gbXBpX2dldF9uYml0cyhxKTsKKyAgdW5zaWduZWQgaW50IG5ieXRlcyA9IChuYml0cys3KS84OworICBjaGFyICpybmRidWYgPSBOVUxMOworCisgIGlmICggREJHX0NJUEhFUiApCisgICAgbG9nX2RlYnVnKCJjaG9vc2luZyBhIHJhbmRvbSBrICIpOworICBmb3IgKDs7KSAKKyAgICB7CisgICAgICBpZiggREJHX0NJUEhFUiApCisgICAgICAgIHByb2dyZXNzKCcuJyk7CisKKyAgICAgIGlmICggIXJuZGJ1ZiB8fCBuYml0cyA8IDMyICkgCisgICAgICAgIHsKKyAgICAgICAgICBnY3J5X2ZyZWUocm5kYnVmKTsKKyAgICAgICAgICBybmRidWYgPSBnY3J5X3JhbmRvbV9ieXRlc19zZWN1cmUoIChuYml0cys3KS84LCBHQ1JZX1NUUk9OR19SQU5ET00gKTsKKwl9CisgICAgICBlbHNlCisgICAgICAgIHsgLyogQ2hhbmdlIG9ubHkgc29tZSBvZiB0aGUgaGlnaGVyIGJpdHMuICBXZSBjb3VsZCBpbXByb3ZlCisJICAgICB0aGlzIGJ5IGRpcmVjdGx5IHJlcXVlc3RpbmcgbW9yZSBtZW1vcnkgYXQgdGhlIGZpcnN0IGNhbGwKKwkgICAgIHRvIGdldF9yYW5kb21fYnl0ZXMoKSBhbmQgdXNlIHRoaXMgdGhlIGhlcmUgbWF5YmUgaXQgaXMKKwkgICAgIGVhc2llciB0byBkbyB0aGlzIGRpcmVjdGx5IGluIHJhbmRvbS5jLiAqLworICAgICAgICAgIGNoYXIgKnBwID0gZ2NyeV9yYW5kb21fYnl0ZXNfc2VjdXJlKCA0LCBHQ1JZX1NUUk9OR19SQU5ET00gKTsKKyAgICAgICAgICBtZW1jcHkoIHJuZGJ1ZixwcCwgNCApOworICAgICAgICAgIGdjcnlfZnJlZShwcCk7CisJfQorICAgICAgX2djcnlfbXBpX3NldF9idWZmZXIoIGssIHJuZGJ1ZiwgbmJ5dGVzLCAwICk7CisgICAgICBpZiAoIG1waV90ZXN0X2JpdCggaywgbmJpdHMtMSApICkKKyAgICAgICAgbXBpX3NldF9oaWdoYml0KCBrLCBuYml0cy0xICk7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBtcGlfc2V0X2hpZ2hiaXQoIGssIG5iaXRzLTEgKTsKKyAgICAgICAgICBtcGlfY2xlYXJfYml0KCBrLCBuYml0cy0xICk7CisJfQorCisgICAgICBpZiggIShtcGlfY21wKCBrLCBxICkgPCAwKSApIC8qIGNoZWNrOiBrIDwgcSAqLworICAgICAgICB7CQorICAgICAgICAgIGlmKCBEQkdfQ0lQSEVSICkKKyAgICAgICAgICAgIHByb2dyZXNzKCcrJyk7CisgICAgICAgICAgY29udGludWU7IC8qIG5vICAqLworICAgICAgICB9CisgICAgICBpZiggIShtcGlfY21wX3VpKCBrLCAwICkgPiAwKSApICAvKiBjaGVjazogayA+IDAgKi8KKyAgICAgICAgeworICAgICAgICAgIGlmKCBEQkdfQ0lQSEVSICkKKyAgICAgICAgICAgIHByb2dyZXNzKCctJyk7CisgICAgICAgICAgY29udGludWU7IC8qIG5vICovCisgICAgICAgIH0KKyAgICAgIGJyZWFrOwkvKiBva2F5ICovCisgICAgfQorICBnY3J5X2ZyZWUocm5kYnVmKTsKKyAgaWYoIERCR19DSVBIRVIgKQorICAgIHByb2dyZXNzKCdcbicpOworICAKKyAgcmV0dXJuIGs7Cit9CisKKworLyogQ2hlY2sgdGhhdCBhIGZyZXNobHkgZ2VuZXJhdGVkIGtleSBhY3R1YWxseSB3b3Jrcy4gIFJldHVybnMgMCBvbiBzdWNjZXNzLiAqLworc3RhdGljIGludAordGVzdF9rZXlzIChEU0Ffc2VjcmV0X2tleSAqc2ssIHVuc2lnbmVkIGludCBxYml0cykKK3sKKyAgaW50IHJlc3VsdCA9IC0xOyAgLyogRGVmYXVsdCB0byBmYWlsdXJlLiAgKi8KKyAgRFNBX3B1YmxpY19rZXkgcGs7CisgIGdjcnlfbXBpX3QgZGF0YSAgPSBnY3J5X21waV9uZXcgKHFiaXRzKTsKKyAgZ2NyeV9tcGlfdCBzaWdfYSA9IGdjcnlfbXBpX25ldyAocWJpdHMpOworICBnY3J5X21waV90IHNpZ19iID0gZ2NyeV9tcGlfbmV3IChxYml0cyk7CisKKyAgLyogUHV0IHRoZSByZWxldmFudCBwYXJhbWV0ZXJzIGludG8gYSBwdWJsaWMga2V5IHN0cnVjdHVyZS4gICovCisgIHBrLnAgPSBzay0+cDsKKyAgcGsucSA9IHNrLT5xOworICBway5nID0gc2stPmc7CisgIHBrLnkgPSBzay0+eTsKKworICAvKiBDcmVhdGUgYSByYW5kb20gcGxhaW50ZXh0LiAgKi8KKyAgZ2NyeV9tcGlfcmFuZG9taXplIChkYXRhLCBxYml0cywgR0NSWV9XRUFLX1JBTkRPTSk7CisKKyAgLyogU2lnbiBEQVRBIHVzaW5nIHRoZSBzZWNyZXQga2V5LiAgKi8KKyAgc2lnbiAoc2lnX2EsIHNpZ19iLCBkYXRhLCBzayk7CisKKyAgLyogVmVyaWZ5IHRoZSBzaWduYXR1cmUgdXNpbmcgdGhlIHB1YmxpYyBrZXkuICAqLworICBpZiAoICF2ZXJpZnkgKHNpZ19hLCBzaWdfYiwgZGF0YSwgJnBrKSApCisgICAgZ290byBsZWF2ZTsgLyogU2lnbmF0dXJlIGRvZXMgbm90IG1hdGNoLiAgKi8KKworICAvKiBNb2RpZnkgdGhlIGRhdGEgYW5kIGNoZWNrIHRoYXQgdGhlIHNpZ25pbmcgZmFpbHMuICAqLworICBnY3J5X21waV9hZGRfdWkgKGRhdGEsIGRhdGEsIDEpOworICBpZiAoIHZlcmlmeSAoc2lnX2EsIHNpZ19iLCBkYXRhLCAmcGspICkKKyAgICBnb3RvIGxlYXZlOyAvKiBTaWduYXR1cmUgbWF0Y2hlcyBidXQgc2hvdWxkIG5vdC4gICovCisKKyAgcmVzdWx0ID0gMDsgLyogVGhlIHRlc3Qgc3VjY2VlZGVkLiAgKi8KKworIGxlYXZlOgorICBnY3J5X21waV9yZWxlYXNlIChzaWdfYik7CisgIGdjcnlfbXBpX3JlbGVhc2UgKHNpZ19hKTsKKyAgZ2NyeV9tcGlfcmVsZWFzZSAoZGF0YSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKworCisvKgorICAgR2VuZXJhdGUgYSBEU0Ega2V5IHBhaXIgd2l0aCBhIGtleSBvZiBzaXplIE5CSVRTLiAgSWYgdHJhbnNpZW50X2tleQorICAgaXMgdHJ1ZSB0aGUga2V5IGlzIGdlbmVyYXRlZCB1c2luZyB0aGUgc3RhbmRhcmQgUk5HIGFuZCBub3QgdGhlCisgICB2ZXJ5IHNlY3VyZSBvbmUuCisKKyAgIFJldHVybnM6IDIgc3RydWN0dXJlcyBmaWxsZWQgd2l0aCBhbGwgbmVlZGVkIHZhbHVlcworIAkgICAgYW5kIGFuIGFycmF5IHdpdGggdGhlIG4tMSBmYWN0b3JzIG9mIChwLTEpCisgKi8KK3N0YXRpYyBncGdfZXJyX2NvZGVfdAorZ2VuZXJhdGUgKERTQV9zZWNyZXRfa2V5ICpzaywgdW5zaWduZWQgaW50IG5iaXRzLCB1bnNpZ25lZCBpbnQgcWJpdHMsCisgICAgICAgICAgaW50IHRyYW5zaWVudF9rZXksIGRzYV9kb21haW5fdCAqZG9tYWluLCBnY3J5X21waV90ICoqcmV0X2ZhY3RvcnMgKQoreworICBnY3J5X21waV90IHA7ICAgIC8qIHRoZSBwcmltZSAqLworICBnY3J5X21waV90IHE7ICAgIC8qIHRoZSAxNjAgYml0IHByaW1lIGZhY3RvciAqLworICBnY3J5X21waV90IGc7ICAgIC8qIHRoZSBnZW5lcmF0b3IgKi8KKyAgZ2NyeV9tcGlfdCB5OyAgICAvKiBnXnggbW9kIHAgKi8KKyAgZ2NyeV9tcGlfdCB4OyAgICAvKiB0aGUgc2VjcmV0IGV4cG9uZW50ICovCisgIGdjcnlfbXBpX3QgaCwgZTsgIC8qIGhlbHBlciAqLworICB1bnNpZ25lZCBjaGFyICpybmRidWY7CisgIGdjcnlfcmFuZG9tX2xldmVsX3QgcmFuZG9tX2xldmVsOworCisgIGlmIChxYml0cykKKyAgICA7IC8qIENhbGxlciBzdXBwbGllZCBxYml0cy4gIFVzZSB0aGlzIHZhbHVlLiAgKi8KKyAgZWxzZSBpZiAoIG5iaXRzID49IDUxMiAmJiBuYml0cyA8PSAxMDI0ICkKKyAgICBxYml0cyA9IDE2MDsKKyAgZWxzZSBpZiAoIG5iaXRzID09IDIwNDggKQorICAgIHFiaXRzID0gMjI0OworICBlbHNlIGlmICggbmJpdHMgPT0gMzA3MiApCisgICAgcWJpdHMgPSAyNTY7CisgIGVsc2UgaWYgKCBuYml0cyA9PSA3NjgwICkKKyAgICBxYml0cyA9IDM4NDsKKyAgZWxzZSBpZiAoIG5iaXRzID09IDE1MzYwICkKKyAgICBxYml0cyA9IDUxMjsKKyAgZWxzZQorICAgIHJldHVybiBHUEdfRVJSX0lOVl9WQUxVRTsKKworICBpZiAocWJpdHMgPCAxNjAgfHwgcWJpdHMgPiA1MTIgfHwgKHFiaXRzJTgpICkKKyAgICByZXR1cm4gR1BHX0VSUl9JTlZfVkFMVUU7CisgIGlmIChuYml0cyA8IDIqcWJpdHMgfHwgbmJpdHMgPiAxNTM2MCkKKyAgICByZXR1cm4gR1BHX0VSUl9JTlZfVkFMVUU7CisKKyAgaWYgKGZpcHNfbW9kZSAoKSkKKyAgICB7CisgICAgICBpZiAobmJpdHMgPCAxMDI0KQorICAgICAgICByZXR1cm4gR1BHX0VSUl9JTlZfVkFMVUU7CisgICAgICBpZiAodHJhbnNpZW50X2tleSkKKyAgICAgICAgcmV0dXJuIEdQR19FUlJfSU5WX1ZBTFVFOworICAgIH0KKworICBpZiAoZG9tYWluLT5wICYmIGRvbWFpbi0+cSAmJiBkb21haW4tPmcpCisgICAgeworICAgICAgLyogRG9tYWluIHBhcmFtZXRlcnMgYXJlIGdpdmVuOyB1c2UgdGhlbS4gICovCisgICAgICBwID0gbXBpX2NvcHkgKGRvbWFpbi0+cCk7CisgICAgICBxID0gbXBpX2NvcHkgKGRvbWFpbi0+cSk7CisgICAgICBnID0gbXBpX2NvcHkgKGRvbWFpbi0+Zyk7CisgICAgICBnY3J5X2Fzc2VydCAobXBpX2dldF9uYml0cyAocCkgPT0gbmJpdHMpOworICAgICAgZ2NyeV9hc3NlcnQgKG1waV9nZXRfbmJpdHMgKHEpID09IHFiaXRzKTsKKyAgICAgIGggPSBtcGlfYWxsb2MgKDApOworICAgICAgZSA9IE5VTEw7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogR2VuZXJhdGUgbmV3IGRvbWFpbiBwYXJhbWV0ZXJzLiAgKi8KKyAgICAgIHAgPSBfZ2NyeV9nZW5lcmF0ZV9lbGdfcHJpbWUgKDEsIG5iaXRzLCBxYml0cywgTlVMTCwgcmV0X2ZhY3RvcnMpOworICAgICAgLyogR2V0IHEgb3V0IG9mIGZhY3RvcnMuICAqLworICAgICAgcSA9IG1waV9jb3B5ICgoKnJldF9mYWN0b3JzKVswXSk7CisgICAgICBnY3J5X2Fzc2VydCAobXBpX2dldF9uYml0cyAocSkgPT0gcWJpdHMpOworCisgICAgICAvKiBGaW5kIGEgZ2VuZXJhdG9yIGcgKGggYW5kIGUgYXJlIGhlbHBlcnMpLgorICAgICAgICAgZSA9IChwLTEpL3EgKi8KKyAgICAgIGUgPSBtcGlfYWxsb2MgKG1waV9nZXRfbmxpbWJzIChwKSk7CisgICAgICBtcGlfc3ViX3VpIChlLCBwLCAxKTsKKyAgICAgIG1waV9mZGl2X3EgKGUsIGUsIHEpOworICAgICAgZyA9IG1waV9hbGxvYyAobXBpX2dldF9ubGltYnMgKHApKTsKKyAgICAgIGggPSBtcGlfYWxsb2Nfc2V0X3VpICgxKTsgLyogKFdlIHN0YXJ0IHdpdGggMi4pICovCisgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgbXBpX2FkZF91aSAoaCwgaCwgMSk7CisgICAgICAgICAgLyogZyA9IGheZSBtb2QgcCAqLworICAgICAgICAgIGdjcnlfbXBpX3Bvd20gKGcsIGgsIGUsIHApOworICAgICAgICB9IAorICAgICAgd2hpbGUgKCFtcGlfY21wX3VpIChnLCAxKSk7ICAvKiBDb250aW51ZSB1bnRpbCBnICE9IDEuICovCisgICAgfQorCisgIC8qIFNlbGVjdCBhIHJhbmRvbSBudW1iZXIgWCB3aXRoIHRoZSBwcm9wZXJ0eToKKyAgICoJIDAgPCB4IDwgcS0xCisgICAqIFRoaXMgbXVzdCBiZSBhIHZlcnkgZ29vZCByYW5kb20gbnVtYmVyIGJlY2F1c2UgdGhpcyBpcyB0aGUgc2VjcmV0CisgICAqIHBhcnQuICBUaGUgcmFuZG9tIHF1YWxpdHkgZGVwZW5kcyBvbiB0aGUgdHJhbnNpZW50X2tleSBmbGFnLiAgKi8KKyAgcmFuZG9tX2xldmVsID0gdHJhbnNpZW50X2tleSA/IEdDUllfU1RST05HX1JBTkRPTSA6IEdDUllfVkVSWV9TVFJPTkdfUkFORE9NOworICBpZiAoREJHX0NJUEhFUikKKyAgICBsb2dfZGVidWcoImNob29zaW5nIGEgcmFuZG9tIHglcyIsIHRyYW5zaWVudF9rZXk/ICIgKHRyYW5zaWVudC1rZXkpIjoiIik7CisgIGdjcnlfYXNzZXJ0KCBxYml0cyA+PSAxNjAgKTsKKyAgeCA9IG1waV9hbGxvY19zZWN1cmUoIG1waV9nZXRfbmxpbWJzKHEpICk7CisgIG1waV9zdWJfdWkoIGgsIHEsIDEgKTsgIC8qIHB1dCBxLTEgaW50byBoICovCisgIHJuZGJ1ZiA9IE5VTEw7CisgIGRvIAorICAgIHsKKyAgICAgIGlmKCBEQkdfQ0lQSEVSICkKKyAgICAgICAgcHJvZ3Jlc3MoJy4nKTsKKyAgICAgIGlmKCAhcm5kYnVmICkKKyAgICAgICAgcm5kYnVmID0gZ2NyeV9yYW5kb21fYnl0ZXNfc2VjdXJlICgocWJpdHMrNykvOCwgcmFuZG9tX2xldmVsKTsKKyAgICAgIGVsc2UgCisgICAgICAgIHsgLyogQ2hhbmdlIG9ubHkgc29tZSBvZiB0aGUgaGlnaGVyIGJpdHMgKD0gMiBieXRlcykqLworICAgICAgICAgIGNoYXIgKnIgPSBnY3J5X3JhbmRvbV9ieXRlc19zZWN1cmUgKDIsIHJhbmRvbV9sZXZlbCk7CisgICAgICAgICAgbWVtY3B5KHJuZGJ1ZiwgciwgMiApOworICAgICAgICAgIGdjcnlfZnJlZShyKTsKKyAgICAgICAgfQorCisgICAgICBfZ2NyeV9tcGlfc2V0X2J1ZmZlciggeCwgcm5kYnVmLCAocWJpdHMrNykvOCwgMCApOworICAgICAgbXBpX2NsZWFyX2hpZ2hiaXQoIHgsIHFiaXRzKzEgKTsKKyAgICB9IAorICB3aGlsZSAoICEoIG1waV9jbXBfdWkoIHgsIDAgKT4wICYmIG1waV9jbXAoIHgsIGggKTwwICkgKTsKKyAgZ2NyeV9mcmVlKHJuZGJ1Zik7CisgIG1waV9mcmVlKCBlICk7CisgIG1waV9mcmVlKCBoICk7CisKKyAgLyogeSA9IGdeeCBtb2QgcCAqLworICB5ID0gbXBpX2FsbG9jKCBtcGlfZ2V0X25saW1icyhwKSApOworICBnY3J5X21waV9wb3dtKCB5LCBnLCB4LCBwICk7CisKKyAgaWYoIERCR19DSVBIRVIgKSAKKyAgICB7CisgICAgICBwcm9ncmVzcygnXG4nKTsKKyAgICAgIGxvZ19tcGlkdW1wKCJkc2EgIHAiLCBwICk7CisgICAgICBsb2dfbXBpZHVtcCgiZHNhICBxIiwgcSApOworICAgICAgbG9nX21waWR1bXAoImRzYSAgZyIsIGcgKTsKKyAgICAgIGxvZ19tcGlkdW1wKCJkc2EgIHkiLCB5ICk7CisgICAgICBsb2dfbXBpZHVtcCgiZHNhICB4IiwgeCApOworICAgIH0KKworICAvKiBDb3B5IHRoZSBzdHVmZiB0byB0aGUga2V5IHN0cnVjdHVyZXMuICovCisgIHNrLT5wID0gcDsKKyAgc2stPnEgPSBxOworICBzay0+ZyA9IGc7CisgIHNrLT55ID0geTsKKyAgc2stPnggPSB4OworCisgIC8qIE5vdyB3ZSBjYW4gdGVzdCBvdXIga2V5cyAodGhpcyBzaG91bGQgbmV2ZXIgZmFpbCEpLiAqLworICBpZiAoIHRlc3Rfa2V5cyAoc2ssIHFiaXRzKSApCisgICAgeworICAgICAgZ2NyeV9tcGlfcmVsZWFzZSAoc2stPnApOyBzay0+cCA9IE5VTEw7CisgICAgICBnY3J5X21waV9yZWxlYXNlIChzay0+cSk7IHNrLT5xID0gTlVMTDsKKyAgICAgIGdjcnlfbXBpX3JlbGVhc2UgKHNrLT5nKTsgc2stPmcgPSBOVUxMOworICAgICAgZ2NyeV9tcGlfcmVsZWFzZSAoc2stPnkpOyBzay0+eSA9IE5VTEw7CisgICAgICBnY3J5X21waV9yZWxlYXNlIChzay0+eCk7IHNrLT54ID0gTlVMTDsKKyAgICAgIGZpcHNfc2lnbmFsX2Vycm9yICgic2VsZi10ZXN0IGFmdGVyIGtleSBnZW5lcmF0aW9uIGZhaWxlZCIpOworICAgICAgcmV0dXJuIEdQR19FUlJfU0VMRlRFU1RfRkFJTEVEOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKKworLyogR2VuZXJhdGUgYSBEU0Ega2V5IHBhaXIgd2l0aCBhIGtleSBvZiBzaXplIE5CSVRTIHVzaW5nIHRoZQorICAgYWxnb3JpdGhtIGdpdmVuIGluIEZJUFMtMTg2LTMuICBJZiBVU0VfRklQUzE4Nl8yIGlzIHRydWUsCisgICBGSVBTLTE4Ni0yIGlzIHVzZWQgYW5kIHRodXMgdGhlIGxlbmd0aCBpcyByZXN0cmljdGVkIHRvIDEwMjQvMTYwLgorICAgSWYgREVSSVZFUEFSTVMgaXMgbm90IE5VTEwgaXQgbWF5IGNvbnRhaW4gYSBzZWVkIHZhbHVlLiAgSWYgZG9tYWluCisgICBwYXJhbWV0ZXJzIGFyZSBzcGVjaWZpZWQgaW4gRE9NQUlOLCBERVJJVkVQQVJNUyBtYXkgbm90IGJlIGdpdmVuCisgICBhbmQgTkJJVFMgYW5kIFFCSVRTIG11c3QgbWF0Y2ggdGhlIHNwZWNpZmllZCBkb21haW4gcGFyYW1ldGVycy4gICovCitzdGF0aWMgZ3BnX2Vycl9jb2RlX3QKK2dlbmVyYXRlX2ZpcHMxODYgKERTQV9zZWNyZXRfa2V5ICpzaywgdW5zaWduZWQgaW50IG5iaXRzLCB1bnNpZ25lZCBpbnQgcWJpdHMsCisgICAgICAgICAgICAgICAgICBnY3J5X3NleHBfdCBkZXJpdmVwYXJtcywgaW50IHVzZV9maXBzMTg2XzIsCisgICAgICAgICAgICAgICAgICBkc2FfZG9tYWluX3QgKmRvbWFpbiwKKyAgICAgICAgICAgICAgICAgIGludCAqcl9jb3VudGVyLCB2b2lkICoqcl9zZWVkLCBzaXplX3QgKnJfc2VlZGxlbiwKKyAgICAgICAgICAgICAgICAgIGdjcnlfbXBpX3QgKnJfaCkKK3sKKyAgZ3BnX2Vycl9jb2RlX3QgZWM7CisgIHN0cnVjdCB7CisgICAgZ2NyeV9zZXhwX3Qgc2V4cDsKKyAgICBjb25zdCB2b2lkICpzZWVkOworICAgIHNpemVfdCBzZWVkbGVuOworICB9IGluaXRpYWxfc2VlZCA9IHsgTlVMTCwgTlVMTCwgMCB9OworICBnY3J5X21waV90IHByaW1lX3EgPSBOVUxMOyAKKyAgZ2NyeV9tcGlfdCBwcmltZV9wID0gTlVMTDsgCisgIGdjcnlfbXBpX3QgdmFsdWVfZyA9IE5VTEw7IC8qIFRoZSBnZW5lcmF0b3IuICovCisgIGdjcnlfbXBpX3QgdmFsdWVfeSA9IE5VTEw7IC8qIGdeeCBtb2QgcCAqLworICBnY3J5X21waV90IHZhbHVlX3ggPSBOVUxMOyAvKiBUaGUgc2VjcmV0IGV4cG9uZW50LiAqLworICBnY3J5X21waV90IHZhbHVlX2ggPSBOVUxMOyAvKiBIZWxwZXIuICAqLworICBnY3J5X21waV90IHZhbHVlX2UgPSBOVUxMOyAvKiBIZWxwZXIuICAqLworCisgIC8qIFByZXNldCByZXR1cm4gdmFsdWVzLiAgKi8KKyAgKnJfY291bnRlciA9IDA7CisgICpyX3NlZWQgPSBOVUxMOworICAqcl9zZWVkbGVuID0gMDsKKyAgKnJfaCA9IE5VTEw7CisKKyAgLyogRGVyaXZlIFFCSVRTIGZyb20gTkJJVFMgaWYgcmVxdWVzdGVkICAqLworICBpZiAoIXFiaXRzKQorICAgIHsKKyAgICAgIGlmIChuYml0cyA9PSAxMDI0KQorICAgICAgICBxYml0cyA9IDE2MDsKKyAgICAgIGVsc2UgaWYgKG5iaXRzID09IDIwNDgpCisgICAgICAgIHFiaXRzID0gMjI0OworICAgICAgZWxzZSBpZiAobmJpdHMgPT0gMzA3MikKKyAgICAgICAgcWJpdHMgPSAyNTY7CisgICAgfQorCisgIC8qIENoZWNrIHRoYXQgUUJJVFMgYW5kIE5CSVRTIG1hdGNoIHRoZSBzdGFuZGFyZC4gIE5vdGUgdGhhdCBGSVBTCisgICAgIDE4Ni0zIHVzZXMgTiBmb3IgUUJJVFMgYW5kIEwgZm9yIE5CSVRTLiAgKi8KKyAgaWYgKG5iaXRzID09IDEwMjQgJiYgcWJpdHMgPT0gMTYwKQorICAgIDsKKyAgZWxzZSBpZiAobmJpdHMgPT0gMjA0OCAmJiBxYml0cyA9PSAyMjQpCisgICAgOworICBlbHNlIGlmIChuYml0cyA9PSAyMDQ4ICYmIHFiaXRzID09IDI1NikKKyAgICA7CisgIGVsc2UgaWYgKG5iaXRzID09IDMwNzIgJiYgcWJpdHMgPT0gMjU2KQorICAgIDsKKyAgZWxzZQorICAgIHJldHVybiBHUEdfRVJSX0lOVl9WQUxVRTsKKworICBpZiAoZG9tYWluLT5wICYmIGRvbWFpbi0+cSAmJiBkb21haW4tPmcpCisgICAgeworICAgICAgLyogRG9tYWluIHBhcmFtZXRlcnMgYXJlIGdpdmVuOyB1c2UgdGhlbS4gICovCisgICAgICBwcmltZV9wID0gbXBpX2NvcHkgKGRvbWFpbi0+cCk7CisgICAgICBwcmltZV9xID0gbXBpX2NvcHkgKGRvbWFpbi0+cSk7CisgICAgICB2YWx1ZV9nID0gbXBpX2NvcHkgKGRvbWFpbi0+Zyk7CisgICAgICBnY3J5X2Fzc2VydCAobXBpX2dldF9uYml0cyAocHJpbWVfcCkgPT0gbmJpdHMpOworICAgICAgZ2NyeV9hc3NlcnQgKG1waV9nZXRfbmJpdHMgKHByaW1lX3EpID09IHFiaXRzKTsKKyAgICAgIGdjcnlfYXNzZXJ0ICghZGVyaXZlcGFybXMpOworICAgICAgZWMgPSAwOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEdlbmVyYXRlIG5ldyBkb21haW4gcGFyYW1ldGVycy4gICovCisKKyAgICAgIC8qIEdldCBhbiBpbml0aWFsIHNlZWQgdmFsdWUuICAqLworICAgICAgaWYgKGRlcml2ZXBhcm1zKQorICAgICAgICB7CisgICAgICAgICAgaW5pdGlhbF9zZWVkLnNleHAgPSBnY3J5X3NleHBfZmluZF90b2tlbiAoZGVyaXZlcGFybXMsICJzZWVkIiwgMCk7CisgICAgICAgICAgaWYgKGluaXRpYWxfc2VlZC5zZXhwKQorICAgICAgICAgICAgaW5pdGlhbF9zZWVkLnNlZWQgPSBnY3J5X3NleHBfbnRoX2RhdGEgKGluaXRpYWxfc2VlZC5zZXhwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbml0aWFsX3NlZWQuc2VlZGxlbik7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgLyogRml4bWU6IEVuYWJsZSAxODYtMyBhZnRlciBpdCBoYXMgYmVlbiBhcHByb3ZlZCBhbmQgYWZ0ZXIgZml4aW5nCisgICAgICAgICB0aGUgZ2VuZXJhdGlvbiBmdW5jdGlvbi4gICovCisgICAgICAvKiAgIGlmICh1c2VfZmlwczE4Nl8yKSAqLworICAgICAgKHZvaWQpdXNlX2ZpcHMxODZfMjsKKyAgICAgIGVjID0gX2djcnlfZ2VuZXJhdGVfZmlwczE4Nl8yX3ByaW1lIChuYml0cywgcWJpdHMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfc2VlZC5zZWVkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsX3NlZWQuc2VlZGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJpbWVfcSwgJnByaW1lX3AsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJfY291bnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByX3NlZWQsIHJfc2VlZGxlbik7CisgICAgICAvKiAgIGVsc2UgKi8KKyAgICAgIC8qICAgICBlYyA9IF9nY3J5X2dlbmVyYXRlX2ZpcHMxODZfM19wcmltZSAobmJpdHMsIHFiaXRzLCBOVUxMLCAwLCAqLworICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJpbWVfcSwgJnByaW1lX3AsICovCisgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJfY291bnRlciwgKi8KKyAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcl9zZWVkLCByX3NlZWRsZW4sIE5VTEwpOyAqLworICAgICAgZ2NyeV9zZXhwX3JlbGVhc2UgKGluaXRpYWxfc2VlZC5zZXhwKTsKKyAgICAgIGlmIChlYykKKyAgICAgICAgZ290byBsZWF2ZTsKKworICAgICAgLyogRmluZCBhIGdlbmVyYXRvciBnIChoIGFuZCBlIGFyZSBoZWxwZXJzKS4KKyAgICAgICAgIGUgPSAocC0xKS9xICovCisgICAgICB2YWx1ZV9lID0gbXBpX2FsbG9jX2xpa2UgKHByaW1lX3ApOworICAgICAgbXBpX3N1Yl91aSAodmFsdWVfZSwgcHJpbWVfcCwgMSk7CisgICAgICBtcGlfZmRpdl9xICh2YWx1ZV9lLCB2YWx1ZV9lLCBwcmltZV9xICk7CisgICAgICB2YWx1ZV9nID0gbXBpX2FsbG9jX2xpa2UgKHByaW1lX3ApOworICAgICAgdmFsdWVfaCA9IG1waV9hbGxvY19zZXRfdWkgKDEpOyAKKyAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICBtcGlfYWRkX3VpICh2YWx1ZV9oLCB2YWx1ZV9oLCAxKTsKKyAgICAgICAgICAvKiBnID0gaF5lIG1vZCBwICovCisgICAgICAgICAgbXBpX3Bvd20gKHZhbHVlX2csIHZhbHVlX2gsIHZhbHVlX2UsIHByaW1lX3ApOworICAgICAgICB9IAorICAgICAgd2hpbGUgKCFtcGlfY21wX3VpICh2YWx1ZV9nLCAxKSk7ICAvKiBDb250aW51ZSB1bnRpbCBnICE9IDEuICAqLworICAgIH0KKworCisgIC8qIFNlbGVjdCBhIHJhbmRvbSBudW1iZXIgeCB3aXRoOiAgMCA8IHggPCBxICAqLworICB2YWx1ZV94ID0gZ2NyeV9tcGlfc25ldyAocWJpdHMpOworICBkbyAKKyAgICB7CisgICAgICBpZiggREJHX0NJUEhFUiApCisgICAgICAgIHByb2dyZXNzKCcuJyk7CisgICAgICBnY3J5X21waV9yYW5kb21pemUgKHZhbHVlX3gsIHFiaXRzLCBHQ1JZX1ZFUllfU1RST05HX1JBTkRPTSk7CisgICAgICBtcGlfY2xlYXJfaGlnaGJpdCAodmFsdWVfeCwgcWJpdHMrMSk7CisgICAgfSAKKyAgd2hpbGUgKCEobXBpX2NtcF91aSAodmFsdWVfeCwgMCkgPiAwICYmIG1waV9jbXAgKHZhbHVlX3gsIHByaW1lX3EpIDwgMCkpOworCisgIC8qIHkgPSBnXnggbW9kIHAgKi8KKyAgdmFsdWVfeSA9IG1waV9hbGxvY19saWtlIChwcmltZV9wKTsKKyAgZ2NyeV9tcGlfcG93bSAodmFsdWVfeSwgdmFsdWVfZywgdmFsdWVfeCwgcHJpbWVfcCk7CisKKyAgaWYgKERCR19DSVBIRVIpIAorICAgIHsKKyAgICAgIHByb2dyZXNzKCdcbicpOworICAgICAgbG9nX21waWR1bXAoImRzYSAgcCIsIHByaW1lX3AgKTsKKyAgICAgIGxvZ19tcGlkdW1wKCJkc2EgIHEiLCBwcmltZV9xICk7CisgICAgICBsb2dfbXBpZHVtcCgiZHNhICBnIiwgdmFsdWVfZyApOworICAgICAgbG9nX21waWR1bXAoImRzYSAgeSIsIHZhbHVlX3kgKTsKKyAgICAgIGxvZ19tcGlkdW1wKCJkc2EgIHgiLCB2YWx1ZV94ICk7CisgICAgICBsb2dfbXBpZHVtcCgiZHNhICBoIiwgdmFsdWVfaCApOworICAgIH0KKworICAvKiBDb3B5IHRoZSBzdHVmZiB0byB0aGUga2V5IHN0cnVjdHVyZXMuICovCisgIHNrLT5wID0gcHJpbWVfcDsgcHJpbWVfcCA9IE5VTEw7CisgIHNrLT5xID0gcHJpbWVfcTsgcHJpbWVfcSA9IE5VTEw7CisgIHNrLT5nID0gdmFsdWVfZzsgdmFsdWVfZyA9IE5VTEw7CisgIHNrLT55ID0gdmFsdWVfeTsgdmFsdWVfeSA9IE5VTEw7CisgIHNrLT54ID0gdmFsdWVfeDsgdmFsdWVfeCA9IE5VTEw7CisgICpyX2ggPSB2YWx1ZV9oOyB2YWx1ZV9oID0gTlVMTDsKKworIGxlYXZlOgorICBnY3J5X21waV9yZWxlYXNlIChwcmltZV9wKTsKKyAgZ2NyeV9tcGlfcmVsZWFzZSAocHJpbWVfcSk7CisgIGdjcnlfbXBpX3JlbGVhc2UgKHZhbHVlX2cpOworICBnY3J5X21waV9yZWxlYXNlICh2YWx1ZV95KTsKKyAgZ2NyeV9tcGlfcmVsZWFzZSAodmFsdWVfeCk7CisgIGdjcnlfbXBpX3JlbGVhc2UgKHZhbHVlX2gpOworICBnY3J5X21waV9yZWxlYXNlICh2YWx1ZV9lKTsKKworICAvKiBBcyBhIGxhc3Qgc3RlcCB0ZXN0IHRoaXMga2V5cyAodGhpcyBzaG91bGQgbmV2ZXIgZmFpbCBvZiBjb3Vyc2UpLiAqLworICBpZiAoIWVjICYmIHRlc3Rfa2V5cyAoc2ssIHFiaXRzKSApCisgICAgeworICAgICAgZ2NyeV9tcGlfcmVsZWFzZSAoc2stPnApOyBzay0+cCA9IE5VTEw7CisgICAgICBnY3J5X21waV9yZWxlYXNlIChzay0+cSk7IHNrLT5xID0gTlVMTDsKKyAgICAgIGdjcnlfbXBpX3JlbGVhc2UgKHNrLT5nKTsgc2stPmcgPSBOVUxMOworICAgICAgZ2NyeV9tcGlfcmVsZWFzZSAoc2stPnkpOyBzay0+eSA9IE5VTEw7CisgICAgICBnY3J5X21waV9yZWxlYXNlIChzay0+eCk7IHNrLT54ID0gTlVMTDsKKyAgICAgIGZpcHNfc2lnbmFsX2Vycm9yICgic2VsZi10ZXN0IGFmdGVyIGtleSBnZW5lcmF0aW9uIGZhaWxlZCIpOworICAgICAgZWMgPSBHUEdfRVJSX1NFTEZURVNUX0ZBSUxFRDsKKyAgICB9CisKKyAgaWYgKGVjKQorICAgIHsKKyAgICAgICpyX2NvdW50ZXIgPSAwOworICAgICAgZ2NyeV9mcmVlICgqcl9zZWVkKTsgKnJfc2VlZCA9IE5VTEw7CisgICAgICAqcl9zZWVkbGVuID0gMDsKKyAgICAgIGdjcnlfbXBpX3JlbGVhc2UgKCpyX2gpOyAqcl9oID0gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIGVjOworfQorCisKKworLyoKKyAgIFRlc3Qgd2hldGhlciB0aGUgc2VjcmV0IGtleSBpcyB2YWxpZC4KKyAgIFJldHVybnM6IGlmIHRoaXMgaXMgYSB2YWxpZCBrZXkuCisgKi8KK3N0YXRpYyBpbnQKK2NoZWNrX3NlY3JldF9rZXkoIERTQV9zZWNyZXRfa2V5ICpzayApCit7CisgIGludCByYzsKKyAgZ2NyeV9tcGlfdCB5ID0gbXBpX2FsbG9jKCBtcGlfZ2V0X25saW1icyhzay0+eSkgKTsKKworICBnY3J5X21waV9wb3dtKCB5LCBzay0+Zywgc2stPngsIHNrLT5wICk7CisgIHJjID0gIW1waV9jbXAoIHksIHNrLT55ICk7CisgIG1waV9mcmVlKCB5ICk7CisgIHJldHVybiByYzsKK30KKworCisKKy8qCisgICBNYWtlIGEgRFNBIHNpZ25hdHVyZSBmcm9tIEhBU0ggYW5kIHB1dCBpdCBpbnRvIHIgYW5kIHMuCisgKi8KK3N0YXRpYyB2b2lkCitzaWduKGdjcnlfbXBpX3QgciwgZ2NyeV9tcGlfdCBzLCBnY3J5X21waV90IGhhc2gsIERTQV9zZWNyZXRfa2V5ICpza2V5ICkKK3sKKyAgZ2NyeV9tcGlfdCBrOworICBnY3J5X21waV90IGtpbnY7CisgIGdjcnlfbXBpX3QgdG1wOworCisgIC8qIFNlbGVjdCBhIHJhbmRvbSBrIHdpdGggMCA8IGsgPCBxICovCisgIGsgPSBnZW5fayggc2tleS0+cSApOworCisgIC8qIHIgPSAoYV5rIG1vZCBwKSBtb2QgcSAqLworICBnY3J5X21waV9wb3dtKCByLCBza2V5LT5nLCBrLCBza2V5LT5wICk7CisgIG1waV9mZGl2X3IoIHIsIHIsIHNrZXktPnEgKTsKKworICAvKiBraW52ID0ga14oLTEpIG1vZCBxICovCisgIGtpbnYgPSBtcGlfYWxsb2MoIG1waV9nZXRfbmxpbWJzKGspICk7CisgIG1waV9pbnZtKGtpbnYsIGssIHNrZXktPnEgKTsKKworICAvKiBzID0gKGtpbnYgKiAoIGhhc2ggKyB4ICogcikpIG1vZCBxICovCisgIHRtcCA9IG1waV9hbGxvYyggbXBpX2dldF9ubGltYnMoc2tleS0+cCkgKTsKKyAgbXBpX211bCggdG1wLCBza2V5LT54LCByICk7CisgIG1waV9hZGQoIHRtcCwgdG1wLCBoYXNoICk7CisgIG1waV9tdWxtKCBzICwga2ludiwgdG1wLCBza2V5LT5xICk7CisKKyAgbXBpX2ZyZWUoayk7CisgIG1waV9mcmVlKGtpbnYpOworICBtcGlfZnJlZSh0bXApOworfQorCisKKy8qCisgICBSZXR1cm5zIHRydWUgaWYgdGhlIHNpZ25hdHVyZSBjb21wb3NlZCBmcm9tIFIgYW5kIFMgaXMgdmFsaWQuCisgKi8KK3N0YXRpYyBpbnQKK3ZlcmlmeSAoZ2NyeV9tcGlfdCByLCBnY3J5X21waV90IHMsIGdjcnlfbXBpX3QgaGFzaCwgRFNBX3B1YmxpY19rZXkgKnBrZXkgKQoreworICBpbnQgcmM7CisgIGdjcnlfbXBpX3QgdywgdTEsIHUyLCB2OworICBnY3J5X21waV90IGJhc2VbM107CisgIGdjcnlfbXBpX3QgZXhbM107CisKKyAgaWYoICEobXBpX2NtcF91aSggciwgMCApID4gMCAmJiBtcGlfY21wKCByLCBwa2V5LT5xICkgPCAwKSApCisgICAgcmV0dXJuIDA7IC8qIGFzc2VydGlvbgkwIDwgciA8IHEgIGZhaWxlZCAqLworICBpZiggIShtcGlfY21wX3VpKCBzLCAwICkgPiAwICYmIG1waV9jbXAoIHMsIHBrZXktPnEgKSA8IDApICkKKyAgICByZXR1cm4gMDsgLyogYXNzZXJ0aW9uCTAgPCBzIDwgcSAgZmFpbGVkICovCisKKyAgdyAgPSBtcGlfYWxsb2MoIG1waV9nZXRfbmxpbWJzKHBrZXktPnEpICk7CisgIHUxID0gbXBpX2FsbG9jKCBtcGlfZ2V0X25saW1icyhwa2V5LT5xKSApOworICB1MiA9IG1waV9hbGxvYyggbXBpX2dldF9ubGltYnMocGtleS0+cSkgKTsKKyAgdiAgPSBtcGlfYWxsb2MoIG1waV9nZXRfbmxpbWJzKHBrZXktPnApICk7CisKKyAgLyogdyA9IHNeKC0xKSBtb2QgcSAqLworICBtcGlfaW52bSggdywgcywgcGtleS0+cSApOworCisgIC8qIHUxID0gKGhhc2ggKiB3KSBtb2QgcSAqLworICBtcGlfbXVsbSggdTEsIGhhc2gsIHcsIHBrZXktPnEgKTsKKworICAvKiB1MiA9IHIgKiB3IG1vZCBxICAqLworICBtcGlfbXVsbSggdTIsIHIsIHcsIHBrZXktPnEgKTsKKworICAvKiB2ID0gIGdedTEgKiB5XnUyIG1vZCBwIG1vZCBxICovCisgIGJhc2VbMF0gPSBwa2V5LT5nOyBleFswXSA9IHUxOworICBiYXNlWzFdID0gcGtleS0+eTsgZXhbMV0gPSB1MjsKKyAgYmFzZVsyXSA9IE5VTEw7ICAgIGV4WzJdID0gTlVMTDsKKyAgbXBpX211bHBvd20oIHYsIGJhc2UsIGV4LCBwa2V5LT5wICk7CisgIG1waV9mZGl2X3IoIHYsIHYsIHBrZXktPnEgKTsKKworICByYyA9ICFtcGlfY21wKCB2LCByICk7CisKKyAgbXBpX2ZyZWUodyk7CisgIG1waV9mcmVlKHUxKTsKKyAgbXBpX2ZyZWUodTIpOworICBtcGlfZnJlZSh2KTsKKworICByZXR1cm4gcmM7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqICBpbnRlcmZhY2UgICoqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGdjcnlfZXJyX2NvZGVfdAorZHNhX2dlbmVyYXRlX2V4dCAoaW50IGFsZ28sIHVuc2lnbmVkIGludCBuYml0cywgdW5zaWduZWQgbG9uZyBldmFsdWUsCisgICAgICAgICAgICAgICAgICBjb25zdCBnY3J5X3NleHBfdCBnZW5wYXJtcywKKyAgICAgICAgICAgICAgICAgIGdjcnlfbXBpX3QgKnNrZXksIGdjcnlfbXBpX3QgKipyZXRmYWN0b3JzLAorICAgICAgICAgICAgICAgICAgZ2NyeV9zZXhwX3QgKnJfZXh0cmFpbmZvKQoreworICBncGdfZXJyX2NvZGVfdCBlYzsKKyAgRFNBX3NlY3JldF9rZXkgc2s7CisgIGdjcnlfc2V4cF90IGwxOworICB1bnNpZ25lZCBpbnQgcWJpdHMgPSAwOworICBnY3J5X3NleHBfdCBkZXJpdmVwYXJtcyA9IE5VTEw7CisgIGdjcnlfc2V4cF90IHNlZWRpbmZvID0gTlVMTDsKKyAgaW50IHRyYW5zaWVudF9rZXkgPSAwOworICBpbnQgdXNlX2ZpcHMxODZfMiA9IDA7CisgIGludCB1c2VfZmlwczE4NiA9IDA7CisgIGRzYV9kb21haW5fdCBkb21haW47CisgCisgICh2b2lkKWFsZ287ICAgIC8qIE5vIG5lZWQgdG8gY2hlY2sgaXQuICAqLworICAodm9pZClldmFsdWU7ICAvKiBOb3QgcmVxdWlyZWQgZm9yIERTQS4gKi8KKworICBtZW1zZXQgKCZkb21haW4sIDAsIHNpemVvZiBkb21haW4pOworCisgIGlmIChnZW5wYXJtcykKKyAgICB7CisgICAgICBnY3J5X3NleHBfdCBkb21haW5zZXhwOworICAKKyAgICAgIC8qIFBhcnNlIHRoZSBvcHRpb25hbCBxYml0cyBlbGVtZW50LiAgKi8KKyAgICAgIGwxID0gZ2NyeV9zZXhwX2ZpbmRfdG9rZW4gKGdlbnBhcm1zLCAicWJpdHMiLCAwKTsKKyAgICAgIGlmIChsMSkKKyAgICAgICAgeworICAgICAgICAgIGNoYXIgYnVmWzUwXTsKKyAgICAgICAgICBjb25zdCBjaGFyICpzOworICAgICAgICAgIHNpemVfdCBuOworICAgICAgICAgIAorICAgICAgICAgIHMgPSBnY3J5X3NleHBfbnRoX2RhdGEgKGwxLCAxLCAmbik7CisgICAgICAgICAgaWYgKCFzIHx8IG4gPj0gRElNIChidWYpIC0gMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGdjcnlfc2V4cF9yZWxlYXNlIChsMSk7CisgICAgICAgICAgICAgIHJldHVybiBHUEdfRVJSX0lOVl9PQko7IC8qIE5vIHZhbHVlIG9yIHZhbHVlIHRvbyBsYXJnZS4gICovCisgICAgICAgICAgICB9CisgICAgICAgICAgbWVtY3B5IChidWYsIHMsIG4pOworICAgICAgICAgIGJ1ZltuXSA9IDA7CisgICAgICAgICAgcWJpdHMgPSAodW5zaWduZWQgaW50KXN0cnRvdWwgKGJ1ZiwgTlVMTCwgMCk7CisgICAgICAgICAgZ2NyeV9zZXhwX3JlbGVhc2UgKGwxKTsKKyAgICAgICAgfQorCisgICAgICAvKiBQYXJzZSB0aGUgb3B0aW9uYWwgdHJhbnNpZW50LWtleSBmbGFnLiAgKi8KKyAgICAgIGwxID0gZ2NyeV9zZXhwX2ZpbmRfdG9rZW4gKGdlbnBhcm1zLCAidHJhbnNpZW50LWtleSIsIDApOworICAgICAgaWYgKGwxKQorICAgICAgICB7CisgICAgICAgICAgdHJhbnNpZW50X2tleSA9IDE7CisgICAgICAgICAgZ2NyeV9zZXhwX3JlbGVhc2UgKGwxKTsKKyAgICAgICAgfQorCisgICAgICAvKiBHZXQgdGhlIG9wdGlvbmFsIGRlcml2ZSBwYXJhbWV0ZXJzLiAgKi8KKyAgICAgIGRlcml2ZXBhcm1zID0gZ2NyeV9zZXhwX2ZpbmRfdG9rZW4gKGdlbnBhcm1zLCAiZGVyaXZlLXBhcm1zIiwgMCk7CisKKyAgICAgIC8qIFBhcnNlIHRoZSBvcHRpb25hbCAidXNlLWZpcHMxODYiIGZsYWdzLiAgKi8KKyAgICAgIGwxID0gZ2NyeV9zZXhwX2ZpbmRfdG9rZW4gKGdlbnBhcm1zLCAidXNlLWZpcHMxODYiLCAwKTsKKyAgICAgIGlmIChsMSkKKyAgICAgICAgeworICAgICAgICAgIHVzZV9maXBzMTg2ID0gMTsKKyAgICAgICAgICBnY3J5X3NleHBfcmVsZWFzZSAobDEpOworICAgICAgICB9CisgICAgICBsMSA9IGdjcnlfc2V4cF9maW5kX3Rva2VuIChnZW5wYXJtcywgInVzZS1maXBzMTg2LTIiLCAwKTsKKyAgICAgIGlmIChsMSkKKyAgICAgICAgeworICAgICAgICAgIHVzZV9maXBzMTg2XzIgPSAxOworICAgICAgICAgIGdjcnlfc2V4cF9yZWxlYXNlIChsMSk7CisgICAgICAgIH0KKworICAgICAgLyogQ2hlY2sgd2hldGhlciBkb21haW4gcGFyYW1ldGVycyBhcmUgZ2l2ZW4uICAqLworICAgICAgZG9tYWluc2V4cCA9IGdjcnlfc2V4cF9maW5kX3Rva2VuIChnZW5wYXJtcywgImRvbWFpbiIsIDApOworICAgICAgaWYgKGRvbWFpbnNleHApCisgICAgICAgIHsKKyAgICAgICAgICAvKiBERVJJVkVQQVJNUyBjYW4ndCBiZSB1c2VkIHRvZ2V0aGVyIHdpdGggZG9tYWluCisgICAgICAgICAgICAgcGFyYW1ldGVycy4gIE5CSVRTIGFibmQgUUJJVFMgbWF5IG5vdCBiZSBzcGVjaWZpZWQKKyAgICAgICAgICAgICBiZWNhdXNlIHRoZXJlIHZhbHVlcyBhcmUgZGVyaXZlZCBmcm9tIHRoZSBkb21haW4KKyAgICAgICAgICAgICBwYXJhbWV0ZXJzLiAgKi8KKyAgICAgICAgICBpZiAoZGVyaXZlcGFybXMgfHwgcWJpdHMgfHwgbmJpdHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGdjcnlfc2V4cF9yZWxlYXNlIChkb21haW5zZXhwKTsKKyAgICAgICAgICAgICAgZ2NyeV9zZXhwX3JlbGVhc2UgKGRlcml2ZXBhcm1zKTsKKyAgICAgICAgICAgICAgcmV0dXJuIEdQR19FUlJfSU5WX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIC8qIFB1dCBhbGwgZG9tYWluIHBhcmFtZXRlcnMgaW50byB0aGUgZG9tYWluIG9iamVjdC4gICovCisgICAgICAgICAgbDEgPSBnY3J5X3NleHBfZmluZF90b2tlbiAoZG9tYWluc2V4cCwgInAiLCAwKTsKKyAgICAgICAgICBkb21haW4ucCA9IGdjcnlfc2V4cF9udGhfbXBpIChsMSwgMSwgR0NSWU1QSV9GTVRfVVNHKTsKKyAgICAgICAgICBnY3J5X3NleHBfcmVsZWFzZSAobDEpOworICAgICAgICAgIGwxID0gZ2NyeV9zZXhwX2ZpbmRfdG9rZW4gKGRvbWFpbnNleHAsICJxIiwgMCk7CisgICAgICAgICAgZG9tYWluLnEgPSBnY3J5X3NleHBfbnRoX21waSAobDEsIDEsIEdDUllNUElfRk1UX1VTRyk7CisgICAgICAgICAgZ2NyeV9zZXhwX3JlbGVhc2UgKGwxKTsKKyAgICAgICAgICBsMSA9IGdjcnlfc2V4cF9maW5kX3Rva2VuIChkb21haW5zZXhwLCAiZyIsIDApOworICAgICAgICAgIGRvbWFpbi5nID0gZ2NyeV9zZXhwX250aF9tcGkgKGwxLCAxLCBHQ1JZTVBJX0ZNVF9VU0cpOworICAgICAgICAgIGdjcnlfc2V4cF9yZWxlYXNlIChsMSk7CisgICAgICAgICAgZ2NyeV9zZXhwX3JlbGVhc2UgKGRvbWFpbnNleHApOworCisgICAgICAgICAgLyogQ2hlY2sgdGhhdCBhbGwgZG9tYWluIHBhcmFtZXRlcnMgYXJlIGF2YWlsYWJsZS4gICovCisgICAgICAgICAgaWYgKCFkb21haW4ucCB8fCAhZG9tYWluLnEgfHwgIWRvbWFpbi5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBnY3J5X21waV9yZWxlYXNlIChkb21haW4ucCk7CisgICAgICAgICAgICAgIGdjcnlfbXBpX3JlbGVhc2UgKGRvbWFpbi5xKTsKKyAgICAgICAgICAgICAgZ2NyeV9tcGlfcmVsZWFzZSAoZG9tYWluLmcpOworICAgICAgICAgICAgICBnY3J5X3NleHBfcmVsZWFzZSAoZGVyaXZlcGFybXMpOworICAgICAgICAgICAgICByZXR1cm4gR1BHX0VSUl9NSVNTSU5HX1ZBTFVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgLyogR2V0IE5CSVRTIGFuZCBRQklUUyBmcm9tIHRoZSBkb21haW4gcGFyYW1ldGVycy4gICovCisgICAgICAgICAgbmJpdHMgPSBtcGlfZ2V0X25iaXRzIChkb21haW4ucCk7CisgICAgICAgICAgcWJpdHMgPSBtcGlfZ2V0X25iaXRzIChkb21haW4ucSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKGRlcml2ZXBhcm1zIHx8IHVzZV9maXBzMTg2IHx8IHVzZV9maXBzMTg2XzIgfHwgZmlwc19tb2RlICgpKQorICAgIHsKKyAgICAgIGludCBjb3VudGVyOworICAgICAgdm9pZCAqc2VlZDsKKyAgICAgIHNpemVfdCBzZWVkbGVuOworICAgICAgZ2NyeV9tcGlfdCBoX3ZhbHVlOworCisgICAgICBlYyA9IGdlbmVyYXRlX2ZpcHMxODYgKCZzaywgbmJpdHMsIHFiaXRzLCBkZXJpdmVwYXJtcywgdXNlX2ZpcHMxODZfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRvbWFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvdW50ZXIsICZzZWVkLCAmc2VlZGxlbiwgJmhfdmFsdWUpOworICAgICAgZ2NyeV9zZXhwX3JlbGVhc2UgKGRlcml2ZXBhcm1zKTsKKyAgICAgIGlmICghZWMgJiYgaF92YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgIC8qIEZvcm1hdCB0aGUgc2VlZC12YWx1ZXMgdW5sZXNzIGRvbWFpbiBwYXJhbWV0ZXJzIGFyZSB1c2VkCisgICAgICAgICAgICAgZm9yIHdoaWNoIGEgSF9WQUxVRSBvZiBOVUxMIGlzIGFuIGluZGljYXRpb24uICAqLworICAgICAgICAgIGVjID0gZ3BnX2Vycl9jb2RlIChnY3J5X3NleHBfYnVpbGQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgmc2VlZGluZm8sIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKHNlZWQtdmFsdWVzKGNvdW50ZXIgJWQpKHNlZWQgJWIpKGggJW0pKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyLCAoaW50KXNlZWRsZW4sIHNlZWQsIGhfdmFsdWUpKTsKKyAgICAgICAgICBpZiAoZWMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGdjcnlfbXBpX3JlbGVhc2UgKHNrLnApOyBzay5wID0gTlVMTDsKKyAgICAgICAgICAgICAgZ2NyeV9tcGlfcmVsZWFzZSAoc2sucSk7IHNrLnEgPSBOVUxMOworICAgICAgICAgICAgICBnY3J5X21waV9yZWxlYXNlIChzay5nKTsgc2suZyA9IE5VTEw7CisgICAgICAgICAgICAgIGdjcnlfbXBpX3JlbGVhc2UgKHNrLnkpOyBzay55ID0gTlVMTDsKKyAgICAgICAgICAgICAgZ2NyeV9tcGlfcmVsZWFzZSAoc2sueCk7IHNrLnggPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgIGdjcnlfZnJlZSAoc2VlZCk7CisgICAgICAgICAgZ2NyeV9tcGlfcmVsZWFzZSAoaF92YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBlYyA9IGdlbmVyYXRlICgmc2ssIG5iaXRzLCBxYml0cywgdHJhbnNpZW50X2tleSwgJmRvbWFpbiwgcmV0ZmFjdG9ycyk7CisgICAgfQorCisgIGdjcnlfbXBpX3JlbGVhc2UgKGRvbWFpbi5wKTsKKyAgZ2NyeV9tcGlfcmVsZWFzZSAoZG9tYWluLnEpOworICBnY3J5X21waV9yZWxlYXNlIChkb21haW4uZyk7CisKKyAgaWYgKCFlYykKKyAgICB7CisgICAgICBza2V5WzBdID0gc2sucDsKKyAgICAgIHNrZXlbMV0gPSBzay5xOworICAgICAgc2tleVsyXSA9IHNrLmc7CisgICAgICBza2V5WzNdID0gc2sueTsKKyAgICAgIHNrZXlbNF0gPSBzay54OworCisgICAgICBpZiAoIXJfZXh0cmFpbmZvKQorICAgICAgICB7CisgICAgICAgICAgLyogT2xkIHN0eWxlIGludGVyZmFjZSAtIHJldHVybiB0aGUgZmFjdG9ycyAtIGlmIGFueSAtIGF0CisgICAgICAgICAgICAgcmV0ZmFjdG9ycy4gICovCisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCEqcmV0ZmFjdG9ycyAmJiAhc2VlZGluZm8pCisgICAgICAgIHsKKyAgICAgICAgICAvKiBObyBmYWN0b3JzIGFuZCBubyBzZWVkaW5mbywgdGh1cyB0aGVyZSBpcyBub3RoaW5nIHRvIHJldHVybi4gICovCisgICAgICAgICAgKnJfZXh0cmFpbmZvID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogUHV0IHRoZSBmYWN0b3JzIGludG8gZXh0cmFpbmZvIGFuZCBzZXQgcmV0ZmFjdG9ycyB0byBOVUxMCisgICAgICAgICAgICAgdG8gbWFrZSB1c2Ugb2YgdGhlIG5ldyBpbnRlcmZhY2UuICBOb3RlIHRoYXQgdGhlIGZhY3RvcnMKKyAgICAgICAgICAgICBhcmUgbm90IGNvbmZpZGVudGlhbCB0aHVzIHdlIGNhbiBzdG9yZSB0aGVtIGluIHN0YW5kYXJkCisgICAgICAgICAgICAgbWVtb3J5LiAgKi8KKyAgICAgICAgICBpbnQgbmZhY3RvcnMsIGksIGo7CisgICAgICAgICAgY2hhciAqcDsKKyAgICAgICAgICBjaGFyICpmb3JtYXQgPSBOVUxMOworICAgICAgICAgIHZvaWQgKiphcmdfbGlzdCA9IE5VTEw7CisKKyAgICAgICAgICBmb3IgKG5mYWN0b3JzPTA7ICpyZXRmYWN0b3JzICYmICgqcmV0ZmFjdG9ycylbbmZhY3RvcnNdOyBuZmFjdG9ycysrKQorICAgICAgICAgICAgOworICAgICAgICAgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgZm9ybWF0IHN0cmluZzoKKyAgICAgICAgICAgICAgICIobWlzYy1rZXktaW5mbyVTKHBtMS1mYWN0b3JzJW0pKSIKKyAgICAgICAgICAgICB3aXRoIG9uZSAiJW0iIGZvciBlYWNoIGZhY3RvciBhbmQgY29uc3RydWN0IGl0LiAgKi8KKyAgICAgICAgICBmb3JtYXQgPSBnY3J5X21hbGxvYyAoNTAgKyAyKm5mYWN0b3JzKTsKKyAgICAgICAgICBpZiAoIWZvcm1hdCkKKyAgICAgICAgICAgIGVjID0gZ3BnX2Vycl9jb2RlX2Zyb21fc3lzZXJyb3IgKCk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBwID0gc3RwY3B5IChmb3JtYXQsICIobWlzYy1rZXktaW5mbyIpOworICAgICAgICAgICAgICBpZiAoc2VlZGluZm8pCisgICAgICAgICAgICAgICAgcCA9IHN0cGNweSAocCwgIiVTIik7CisgICAgICAgICAgICAgIGlmIChuZmFjdG9ycykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwID0gc3RwY3B5IChwLCAiKHBtMS1mYWN0b3JzIik7CisgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IG5mYWN0b3JzOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHAgPSBzdHBjcHkgKHAsICIlbSIpOworICAgICAgICAgICAgICAgICAgcCA9IHN0cGNweSAocCwgIikiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHAgPSBzdHBjcHkgKHAsICIpIik7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGxpc3Qgb2YgZmFjdG9ycyBwbHVzIG9uZSBmb3IKKyAgICAgICAgICAgICAgICAgYW4gUy1leHByZXNzaW9uIHBsdXMgYW4gZXh0cmEgTlVMTCBlbnRyeSBmb3Igc2FmZXR5CisgICAgICAgICAgICAgICAgIGFuZCBmaWxsIGl0IHdpdGggdGhlIGZhY3RvcnMuICAqLworICAgICAgICAgICAgICBhcmdfbGlzdCA9IGdjcnlfY2FsbG9jIChuZmFjdG9ycysxKzEsIHNpemVvZiAqYXJnX2xpc3QpOworICAgICAgICAgICAgICBpZiAoIWFyZ19saXN0KQorICAgICAgICAgICAgICAgIGVjID0gZ3BnX2Vycl9jb2RlX2Zyb21fc3lzZXJyb3IgKCk7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgICAgICAgICAgIGlmIChzZWVkaW5mbykKKyAgICAgICAgICAgICAgICAgICAgYXJnX2xpc3RbaSsrXSA9ICZzZWVkaW5mbzsKKyAgICAgICAgICAgICAgICAgIGZvciAoaj0wOyBqIDwgbmZhY3RvcnM7IGorKykKKyAgICAgICAgICAgICAgICAgICAgYXJnX2xpc3RbaSsrXSA9ICgqcmV0ZmFjdG9ycykgKyBqOworICAgICAgICAgICAgICAgICAgYXJnX2xpc3RbaV0gPSBOVUxMOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICBlYyA9IGdwZ19lcnJfY29kZSAoZ2NyeV9zZXhwX2J1aWxkX2FycmF5IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyX2V4dHJhaW5mbywgTlVMTCwgZm9ybWF0LCBhcmdfbGlzdCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGdjcnlfZnJlZSAoYXJnX2xpc3QpOworICAgICAgICAgIGdjcnlfZnJlZSAoZm9ybWF0KTsKKyAgICAgICAgICBmb3IgKGk9MDsgaSA8IG5mYWN0b3JzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGdjcnlfbXBpX3JlbGVhc2UgKCgqcmV0ZmFjdG9ycylbaV0pOworICAgICAgICAgICAgICAoKnJldGZhY3RvcnMpW2ldID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBnY3J5X2ZyZWUgKCpyZXRmYWN0b3JzKTsKKyAgICAgICAgICAqcmV0ZmFjdG9ycyA9IE5VTEw7CisgICAgICAgICAgaWYgKGVjKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IDU7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBnY3J5X21waV9yZWxlYXNlIChza2V5W2ldKTsKKyAgICAgICAgICAgICAgICAgIHNrZXlbaV0gPSBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICBnY3J5X3NleHBfcmVsZWFzZSAoc2VlZGluZm8pOworICByZXR1cm4gZWM7Cit9CisKKworc3RhdGljIGdjcnlfZXJyX2NvZGVfdAorZHNhX2dlbmVyYXRlIChpbnQgYWxnbywgdW5zaWduZWQgaW50IG5iaXRzLCB1bnNpZ25lZCBsb25nIGV2YWx1ZSwKKyAgICAgICAgICAgICAgZ2NyeV9tcGlfdCAqc2tleSwgZ2NyeV9tcGlfdCAqKnJldGZhY3RvcnMpCit7CisgICh2b2lkKWV2YWx1ZTsKKyAgcmV0dXJuIGRzYV9nZW5lcmF0ZV9leHQgKGFsZ28sIG5iaXRzLCAwLCBOVUxMLCBza2V5LCByZXRmYWN0b3JzLCBOVUxMKTsKK30KKworCisKK3N0YXRpYyBnY3J5X2Vycl9jb2RlX3QKK2RzYV9jaGVja19zZWNyZXRfa2V5IChpbnQgYWxnbywgZ2NyeV9tcGlfdCAqc2tleSkKK3sKKyAgZ2NyeV9lcnJfY29kZV90IGVyciA9IEdQR19FUlJfTk9fRVJST1I7CisgIERTQV9zZWNyZXRfa2V5IHNrOworCisgICh2b2lkKWFsZ287CisKKyAgaWYgKCghIHNrZXlbMF0pIHx8ICghIHNrZXlbMV0pIHx8ICghIHNrZXlbMl0pIHx8ICghIHNrZXlbM10pIHx8ICghIHNrZXlbNF0pKQorICAgIGVyciA9IEdQR19FUlJfQkFEX01QSTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHNrLnAgPSBza2V5WzBdOworICAgICAgc2sucSA9IHNrZXlbMV07CisgICAgICBzay5nID0gc2tleVsyXTsKKyAgICAgIHNrLnkgPSBza2V5WzNdOworICAgICAgc2sueCA9IHNrZXlbNF07CisgICAgICBpZiAoISBjaGVja19zZWNyZXRfa2V5ICgmc2spKQorCWVyciA9IEdQR19FUlJfQkFEX1NFQ0tFWTsKKyAgICB9CisKKyAgcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgZ2NyeV9lcnJfY29kZV90Citkc2Ffc2lnbiAoaW50IGFsZ28sIGdjcnlfbXBpX3QgKnJlc2FyciwgZ2NyeV9tcGlfdCBkYXRhLCBnY3J5X21waV90ICpza2V5KQoreworICBnY3J5X2Vycl9jb2RlX3QgZXJyID0gR1BHX0VSUl9OT19FUlJPUjsKKyAgRFNBX3NlY3JldF9rZXkgc2s7CisKKyAgKHZvaWQpYWxnbzsKKworICBpZiAoKCEgZGF0YSkKKyAgICAgIHx8ICghIHNrZXlbMF0pIHx8ICghIHNrZXlbMV0pIHx8ICghIHNrZXlbMl0pCisgICAgICB8fCAoISBza2V5WzNdKSB8fCAoISBza2V5WzRdKSkKKyAgICBlcnIgPSBHUEdfRVJSX0JBRF9NUEk7CisgIGVsc2UKKyAgICB7CisgICAgICBzay5wID0gc2tleVswXTsKKyAgICAgIHNrLnEgPSBza2V5WzFdOworICAgICAgc2suZyA9IHNrZXlbMl07CisgICAgICBzay55ID0gc2tleVszXTsKKyAgICAgIHNrLnggPSBza2V5WzRdOworICAgICAgcmVzYXJyWzBdID0gbXBpX2FsbG9jIChtcGlfZ2V0X25saW1icyAoc2sucCkpOworICAgICAgcmVzYXJyWzFdID0gbXBpX2FsbG9jIChtcGlfZ2V0X25saW1icyAoc2sucCkpOworICAgICAgc2lnbiAocmVzYXJyWzBdLCByZXNhcnJbMV0sIGRhdGEsICZzayk7CisgICAgfQorICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgZ2NyeV9lcnJfY29kZV90Citkc2FfdmVyaWZ5IChpbnQgYWxnbywgZ2NyeV9tcGlfdCBoYXNoLCBnY3J5X21waV90ICpkYXRhLCBnY3J5X21waV90ICpwa2V5LAorICAgICAgICAgICAgaW50ICgqY21wKSAodm9pZCAqLCBnY3J5X21waV90KSwgdm9pZCAqb3BhcXVldikKK3sKKyAgZ2NyeV9lcnJfY29kZV90IGVyciA9IEdQR19FUlJfTk9fRVJST1I7CisgIERTQV9wdWJsaWNfa2V5IHBrOworCisgICh2b2lkKWFsZ287CisgICh2b2lkKWNtcDsKKyAgKHZvaWQpb3BhcXVldjsKKworICBpZiAoKCEgZGF0YVswXSkgfHwgKCEgZGF0YVsxXSkgfHwgKCEgaGFzaCkKKyAgICAgIHx8ICghIHBrZXlbMF0pIHx8ICghIHBrZXlbMV0pIHx8ICghIHBrZXlbMl0pIHx8ICghIHBrZXlbM10pKQorICAgIGVyciA9IEdQR19FUlJfQkFEX01QSTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHBrLnAgPSBwa2V5WzBdOworICAgICAgcGsucSA9IHBrZXlbMV07CisgICAgICBway5nID0gcGtleVsyXTsKKyAgICAgIHBrLnkgPSBwa2V5WzNdOworICAgICAgaWYgKCEgdmVyaWZ5IChkYXRhWzBdLCBkYXRhWzFdLCBoYXNoLCAmcGspKQorCWVyciA9IEdQR19FUlJfQkFEX1NJR05BVFVSRTsKKyAgICB9CisgIHJldHVybiBlcnI7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGludAorZHNhX2dldF9uYml0cyAoaW50IGFsZ28sIGdjcnlfbXBpX3QgKnBrZXkpCit7CisgICh2b2lkKWFsZ287CisKKyAgcmV0dXJuIG1waV9nZXRfbmJpdHMgKHBrZXlbMF0pOworfQorCisKKwwKKy8qIAorICAgICBTZWxmLXRlc3Qgc2VjdGlvbi4KKyAqLworCitzdGF0aWMgY29uc3QgY2hhciAqCitzZWxmdGVzdF9zaWduXzEwMjQgKGdjcnlfc2V4cF90IHBrZXksIGdjcnlfc2V4cF90IHNrZXkpCit7CisgIHN0YXRpYyBjb25zdCBjaGFyIHNhbXBsZV9kYXRhW10gPSAKKyAgICAiKGRhdGEgKGZsYWdzIHBrY3MxKSIKKyAgICAiIChoYXNoIHNoYTEgI2EwYjFjMmQzZTRmNTAwMTAyMDMwNDA1MDYwNzA4MDkwYTFiMmMzZDQjKSkiOworICBzdGF0aWMgY29uc3QgY2hhciBzYW1wbGVfZGF0YV9iYWRbXSA9IAorICAgICIoZGF0YSAoZmxhZ3MgcGtjczEpIgorICAgICIgKGhhc2ggc2hhMSAjYTBiMWMyZDNlNGY1MTAxMDIwMzA0MDUwNjA3MDgwOTBhMWIyYzNkNCMpKSI7CisKKyAgY29uc3QgY2hhciAqZXJydHh0ID0gTlVMTDsKKyAgZ2NyeV9lcnJvcl90IGVycjsKKyAgZ2NyeV9zZXhwX3QgZGF0YSA9IE5VTEw7CisgIGdjcnlfc2V4cF90IGRhdGFfYmFkID0gTlVMTDsKKyAgZ2NyeV9zZXhwX3Qgc2lnID0gTlVMTDsKKworICBlcnIgPSBnY3J5X3NleHBfc3NjYW4gKCZkYXRhLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZV9kYXRhLCBzdHJsZW4gKHNhbXBsZV9kYXRhKSk7CisgIGlmICghZXJyKQorICAgIGVyciA9IGdjcnlfc2V4cF9zc2NhbiAoJmRhdGFfYmFkLCBOVUxMLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZV9kYXRhX2JhZCwgc3RybGVuIChzYW1wbGVfZGF0YV9iYWQpKTsKKyAgaWYgKGVycikKKyAgICB7CisgICAgICBlcnJ0eHQgPSAiY29udmVydGluZyBkYXRhIGZhaWxlZCI7CisgICAgICBnb3RvIGxlYXZlOworICAgIH0KKworICBlcnIgPSBnY3J5X3BrX3NpZ24gKCZzaWcsIGRhdGEsIHNrZXkpOworICBpZiAoZXJyKQorICAgIHsKKyAgICAgIGVycnR4dCA9ICJzaWduaW5nIGZhaWxlZCI7CisgICAgICBnb3RvIGxlYXZlOworICAgIH0KKyAgZXJyID0gZ2NyeV9wa192ZXJpZnkgKHNpZywgZGF0YSwgcGtleSk7CisgIGlmIChlcnIpCisgICAgeworICAgICAgZXJydHh0ID0gInZlcmlmeSBmYWlsZWQiOworICAgICAgZ290byBsZWF2ZTsKKyAgICB9CisgIGVyciA9IGdjcnlfcGtfdmVyaWZ5IChzaWcsIGRhdGFfYmFkLCBwa2V5KTsKKyAgaWYgKGdjcnlfZXJyX2NvZGUgKGVycikgIT0gR1BHX0VSUl9CQURfU0lHTkFUVVJFKQorICAgIHsKKyAgICAgIGVycnR4dCA9ICJiYWQgc2lnbmF0dXJlIG5vdCBkZXRlY3RlZCI7CisgICAgICBnb3RvIGxlYXZlOworICAgIH0KKworCisgbGVhdmU6CisgIGdjcnlfc2V4cF9yZWxlYXNlIChzaWcpOworICBnY3J5X3NleHBfcmVsZWFzZSAoZGF0YV9iYWQpOworICBnY3J5X3NleHBfcmVsZWFzZSAoZGF0YSk7CisgIHJldHVybiBlcnJ0eHQ7Cit9CisKKworc3RhdGljIGdwZ19lcnJfY29kZV90CitzZWxmdGVzdHNfZHNhIChzZWxmdGVzdF9yZXBvcnRfZnVuY190IHJlcG9ydCkKK3sKKyAgY29uc3QgY2hhciAqd2hhdDsKKyAgY29uc3QgY2hhciAqZXJydHh0OworICBnY3J5X2Vycm9yX3QgZXJyOworICBnY3J5X3NleHBfdCBza2V5ID0gTlVMTDsKKyAgZ2NyeV9zZXhwX3QgcGtleSA9IE5VTEw7CisKKyAgLyogQ29udmVydCB0aGUgUy1leHByZXNzaW9ucyBpbnRvIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbi4gICovCisgIHdoYXQgPSAiY29udmVydCI7CisgIGVyciA9IGdjcnlfc2V4cF9zc2NhbiAoJnNrZXksIE5VTEwsIAorICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZV9zZWNyZXRfa2V5LCBzdHJsZW4gKHNhbXBsZV9zZWNyZXRfa2V5KSk7CisgIGlmICghZXJyKQorICAgIGVyciA9IGdjcnlfc2V4cF9zc2NhbiAoJnBrZXksIE5VTEwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlX3B1YmxpY19rZXksIHN0cmxlbiAoc2FtcGxlX3B1YmxpY19rZXkpKTsKKyAgaWYgKGVycikKKyAgICB7CisgICAgICBlcnJ0eHQgPSBnY3J5X3N0cmVycm9yIChlcnIpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIHdoYXQgPSAia2V5IGNvbnNpc3RlbmN5IjsKKyAgZXJyID0gZ2NyeV9wa190ZXN0a2V5IChza2V5KTsKKyAgaWYgKGVycikKKyAgICB7CisgICAgICBlcnJ0eHQgPSBnY3J5X3N0cmVycm9yIChlcnIpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIHdoYXQgPSAic2lnbiI7CisgIGVycnR4dCA9IHNlbGZ0ZXN0X3NpZ25fMTAyNCAocGtleSwgc2tleSk7CisgIGlmIChlcnJ0eHQpCisgICAgZ290byBmYWlsZWQ7CisKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKHBrZXkpOworICBnY3J5X3NleHBfcmVsZWFzZSAoc2tleSk7CisgIHJldHVybiAwOyAvKiBTdWNjZWVkZWQuICovCisKKyBmYWlsZWQ6CisgIGdjcnlfc2V4cF9yZWxlYXNlIChwa2V5KTsKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKHNrZXkpOworICBpZiAocmVwb3J0KQorICAgIHJlcG9ydCAoInB1YmtleSIsIEdDUllfUEtfRFNBLCB3aGF0LCBlcnJ0eHQpOworICByZXR1cm4gR1BHX0VSUl9TRUxGVEVTVF9GQUlMRUQ7Cit9CisKKworLyogUnVuIGEgZnVsbCBzZWxmLXRlc3QgZm9yIEFMR08gYW5kIHJldHVybiAwIG9uIHN1Y2Nlc3MuICAqLworc3RhdGljIGdwZ19lcnJfY29kZV90CitydW5fc2VsZnRlc3RzIChpbnQgYWxnbywgaW50IGV4dGVuZGVkLCBzZWxmdGVzdF9yZXBvcnRfZnVuY190IHJlcG9ydCkKK3sKKyAgZ3BnX2Vycl9jb2RlX3QgZWM7CisKKyAgKHZvaWQpZXh0ZW5kZWQ7CisKKyAgc3dpdGNoIChhbGdvKQorICAgIHsKKyAgICBjYXNlIEdDUllfUEtfRFNBOgorICAgICAgZWMgPSBzZWxmdGVzdHNfZHNhIChyZXBvcnQpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGVjID0gR1BHX0VSUl9QVUJLRVlfQUxHTzsKKyAgICAgIGJyZWFrOworICAgICAgICAKKyAgICB9CisgIHJldHVybiBlYzsKK30KKworCisKKwwKK3N0YXRpYyBjb25zdCBjaGFyICpkc2FfbmFtZXNbXSA9CisgIHsKKyAgICAiZHNhIiwKKyAgICAib3BlbnBncC1kc2EiLAorICAgIE5VTEwsCisgIH07CisKK2djcnlfcGtfc3BlY190IF9nY3J5X3B1YmtleV9zcGVjX2RzYSA9CisgIHsKKyAgICAiRFNBIiwgZHNhX25hbWVzLCAKKyAgICAicHFneSIsICJwcWd5eCIsICIiLCAicnMiLCAicHFneSIsCisgICAgR0NSWV9QS19VU0FHRV9TSUdOLAorICAgIGRzYV9nZW5lcmF0ZSwKKyAgICBkc2FfY2hlY2tfc2VjcmV0X2tleSwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgZHNhX3NpZ24sCisgICAgZHNhX3ZlcmlmeSwKKyAgICBkc2FfZ2V0X25iaXRzCisgIH07Citwa19leHRyYV9zcGVjX3QgX2djcnlfcHVia2V5X2V4dHJhc3BlY19kc2EgPSAKKyAgeworICAgIHJ1bl9zZWxmdGVzdHMsCisgICAgZHNhX2dlbmVyYXRlX2V4dAorICB9OworCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvY2lwaGVyL2VjYy5jIGIvbGliZ2NyeXB0LTEuNC42L2NpcGhlci9lY2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2JkOGUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L2NpcGhlci9lY2MuYwpAQCAtMCwwICsxLDEzOTAgQEAKKy8qIGVjYy5jICAtICBFbGxpcHRpYyBDdXJ2ZSBDcnlwdG9ncmFwaHkKKyAgIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICAKKyAgIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgIAorICAgTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgIAorICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAorICAgVVNBLiAgKi8KKworLyogVGhpcyBjb2RlIGlzIG9yaWdpbmFsbHkgYmFzZWQgb24gdGhlIFBhdGNoIDAuMS42IGZvciB0aGUgZ251cGcKKyAgIDEuNC54IGJyYW5jaCBhcyByZXRyaWV2ZWQgb24gMjAwNy0wMy0yMSBmcm9tCisgICBodHRwOi8vd3d3LmNhbGN1cmNvLmNhdC9lY2NHbnVQRy9zcmMvZ251cGctMS40LjYtZWNjMC4yLjBiZXRhMS5kaWZmLmJ6MgorICAgVGhlIG9yaWdpbmFsIGF1dGhvcnMgYXJlOgorICAgICBXcml0dGVuIGJ5CisgICAgICBTZXJnaSBCbGFuY2ggaSBUb3JuZSA8ZDQzNzIyMTEgYXQgYWx1bW5lcy5ldXAudWRsLmVzPiwKKyAgICAgIFJhbWlybyBNb3Jlbm8gQ2hpcmFsIDxyYW1pcm8gYXQgZXVwLnVkbC5lcz4KKyAgICAgTWFpbnRhaW5lcnMKKyAgICAgIFNlcmdpIEJsYW5jaCBpIFRvcm5lCisgICAgICBSYW1pcm8gTW9yZW5vIENoaXJhbAorICAgICAgTWlrYWVsIE15bG5pa292IChtbXIpCisgIEZvciB1c2UgaW4gTGliZ2NyeXB0IHRoZSBjb2RlIGhhcyBiZWVuIGhlYXZpbHkgbW9kaWZpZWQgYW5kIGNsZWFuZWQKKyAgdXAuIEluIGZhY3QgdGhlcmUgaXMgbm90IG11Y2ggbGVmdCBvZiB0aGUgb3JnaW5hbGx5IGNvZGUgZXhjZXB0IGZvcgorICBzb21lIHZhcmlhYmxlIG5hbWVzIGFuZCB0aGUgdGV4dCBib29rIGltcGxlbWVudGFpb24gb2YgdGhlIHNpZ24gYW5kCisgIHZlcmlmaWNhdGlvbiBhbGdvcml0aG1zLiAgVGhlIGFyaXRobWV0aWMgZnVuY3Rpb25zIGhhdmUgZW50aXJlbHkKKyAgYmVlbiByZXdyaXR0ZW4gYW5kIG1vdmVkIHRvIG1waS9lYy5jLiAgKi8KKworCisvKiBUT0RPOgorCisgIC0gSWYgd2Ugc3VwcG9ydCBwb2ludCBjb21wcmVzc2lvbiB3ZSBuZWVkIHRvIGRlY2lkZSBob3cgdG8gY29tcHV0ZQorICAgIHRoZSBrZXlncmlwIC0gaXQgc2hvdWxkIG5vdCBjaGFuZ2UgZHVlIHRvIGNvbXByZXNzaW9uLgorCisgIC0gSW4gbXBpL2VjLmMgd2UgdXNlIG1waV9wb3dtIGZvciB4XjIgbW9kIHA6IEVpdGhlciBpbXBsZW1lbnQgYQorICAgIHNwZWNpYWwgY2FzZSBpbiBtcGlfcG93bSBvciBjaGVjayB3aGV0aGVyIG1waV9tdWxtIGlzIGZhc3Rlci4KKworICAtIERlY2lkZSB3aGV0aGVyIHdlIHNob3VsZCBoaWRlIHRoZSBtcGlfcG9pbnRfdCBkZWZpbml0aW9uLgorCisgIC0gU3VwcG9ydCBtb3JlIHRoYW4ganVzdCBFQ0RTQS4KKyovCisKKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnMTBsaWIuaCIKKyNpbmNsdWRlICJtcGkuaCIKKyNpbmNsdWRlICJjaXBoZXIuaCIKKworCisvKiBEZWZpbml0aW9uIG9mIGEgY3VydmUuICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgZ2NyeV9tcGlfdCBwOyAgIC8qIFByaW1lIHNwZWNpZnlpbmcgdGhlIGZpZWxkIEdGKHApLiAgKi8KKyAgZ2NyeV9tcGlfdCBhOyAgIC8qIEZpcnN0IGNvZWZmaWNpZW50IG9mIHRoZSBXZWllcnN0cmFzcyBlcXVhdGlvbi4gICovCisgIGdjcnlfbXBpX3QgYjsgICAvKiBTZWNvbmQgY29lZmZpY2llbnQgb2YgdGhlIFdlaWVyc3RyYXNzIGVxdWF0aW9uLiAgKi8KKyAgbXBpX3BvaW50X3QgRzsgIC8qIEJhc2UgcG9pbnQgKGdlbmVyYXRvcikuICAqLworICBnY3J5X21waV90IG47ICAgLyogT3JkZXIgb2YgRy4gICovCit9IGVsbGlwdGljX2N1cnZlX3Q7IAorCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGVsbGlwdGljX2N1cnZlX3QgRTsKKyAgbXBpX3BvaW50X3QgUTsgIC8qIFEgPSBbZF1HICAqLworfSBFQ0NfcHVibGljX2tleTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgZWxsaXB0aWNfY3VydmVfdCBFOworICBtcGlfcG9pbnRfdCBROworICBnY3J5X21waV90IGQ7Cit9IEVDQ19zZWNyZXRfa2V5OworCisKKy8qIFRoaXMgdGFibGVzIGRlZmluZXMgYWxpYXNlcyBmb3IgY3VydmUgbmFtZXMuICAqLworc3RhdGljIGNvbnN0IHN0cnVjdAoreworICBjb25zdCBjaGFyICpuYW1lOyAgLyogT3VyIG5hbWUuICAqLworICBjb25zdCBjaGFyICpvdGhlcjsgLyogT3RoZXIgbmFtZS4gKi8KK30gY3VydmVfYWxpYXNlc1tdID0gCisgIHsKKyAgICB7ICJOSVNUIFAtMTkyIiwgIjEuMi44NDAuMTAwNDUuMy4xLjEiIH0sIC8qIFg5LjYyIE9JRCAgKi8KKyAgICB7ICJOSVNUIFAtMTkyIiwgInByaW1lMTkydjEiIH0sICAgICAgICAgIC8qIFg5LjYyIG5hbWUuICAqLworICAgIHsgIk5JU1QgUC0xOTIiLCAic2VjcDE5MnIxIiAgfSwgICAgICAgICAgLyogU0VDUCBuYW1lLiAgKi8KKworICAgIHsgIk5JU1QgUC0yMjQiLCAic2VjcDIyNHIxIiB9LAorICAgIHsgIk5JU1QgUC0yMjQiLCAiMS4zLjEzMi4wLjMzIiB9LCAgICAgICAgLyogU0VDUCBPSUQuICAqLworCisgICAgeyAiTklTVCBQLTI1NiIsICIxLjIuODQwLjEwMDQ1LjMuMS43IiB9LCAvKiBGcm9tIE5JU1QgU1AgODAwLTc4LTEuICAqLworICAgIHsgIk5JU1QgUC0yNTYiLCAicHJpbWUyNTZ2MSIgfSwgICAgICAgICAgCisgICAgeyAiTklTVCBQLTI1NiIsICJzZWNwMjU2cjEiICB9LAorCisgICAgeyAiTklTVCBQLTM4NCIsICJzZWNwMzg0cjEiIH0sCisgICAgeyAiTklTVCBQLTM4NCIsICIxLjMuMTMyLjAuMzQiIH0sICAgICAgIAorCisgICAgeyAiTklTVCBQLTUyMSIsICJzZWNwNTIxcjEiIH0sCisgICAgeyAiTklTVCBQLTUyMSIsICIxLjMuMTMyLjAuMzUiIH0sCisKKyAgICB7ICJicmFpbnBvb2xQMTYwcjEiLCAiMS4zLjM2LjMuMy4yLjguMS4xLjEiIH0sCisgICAgeyAiYnJhaW5wb29sUDE5MnIxIiwgIjEuMy4zNi4zLjMuMi44LjEuMS4zIiB9LAorICAgIHsgImJyYWlucG9vbFAyMjRyMSIsICIxLjMuMzYuMy4zLjIuOC4xLjEuNSIgfSwKKyAgICB7ICJicmFpbnBvb2xQMjU2cjEiLCAiMS4zLjM2LjMuMy4yLjguMS4xLjciIH0sCisgICAgeyAiYnJhaW5wb29sUDMyMHIxIiwgIjEuMy4zNi4zLjMuMi44LjEuMS45IiB9LAorICAgIHsgImJyYWlucG9vbFAzODRyMSIsICIxLjMuMzYuMy4zLjIuOC4xLjEuMTEifSwKKyAgICB7ICJicmFpbnBvb2xQNTEycjEiLCAiMS4zLjM2LjMuMy4yLjguMS4xLjEzIn0sCisKKyAgICB7IE5VTEwsIE5VTEx9CisgIH07CisKKworCisvKiBUaGlzIHN0YXRpYyB0YWJsZSBkZWZpbmVzIGFsbCBhdmFpbGFibGUgY3VydmVzLiAgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QKK3sKKyAgY29uc3QgY2hhciAqZGVzYzsgICAgICAgICAgIC8qIERlc2NyaXB0aW9uIG9mIHRoZSBjdXJ2ZS4gICovCisgIHVuc2lnbmVkIGludCBuYml0czsgICAgICAgICAvKiBOdW1iZXIgb2YgYml0cy4gICovCisgIHVuc2lnbmVkIGludCBmaXBzOjE7ICAgICAgICAvKiBUcnVlIGlmIHRoaXMgaXMgYSBGSVBTMTQwLTIgYXBwcm92ZWQgY3VydmUuICovCisgIGNvbnN0IGNoYXIgICpwOyAgICAgICAgICAgICAvKiBPcmRlciBvZiB0aGUgcHJpbWUgZmllbGQuICAqLworICBjb25zdCBjaGFyICphLCAqYjsgICAgICAgICAgLyogVGhlIGNvZWZmaWNpZW50cy4gKi8KKyAgY29uc3QgY2hhciAqbjsgICAgICAgICAgICAgIC8qIFRoZSBvcmRlciBvZiB0aGUgYmFzZSBwb2ludC4gICovCisgIGNvbnN0IGNoYXIgKmdfeCwgKmdfeTsgICAgICAvKiBCYXNlIHBvaW50LiAgKi8KK30gZG9tYWluX3Bhcm1zW10gPQorICB7CisgICAgeworICAgICAgIk5JU1QgUC0xOTIiLCAxOTIsIDEsCisgICAgICAiMHhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZWZmZmZmZmZmZmZmZmZmZmYiLAorICAgICAgIjB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmVmZmZmZmZmZmZmZmZmZmZjIiwKKyAgICAgICIweDY0MjEwNTE5ZTU5YzgwZTcwZmE3ZTlhYjcyMjQzMDQ5ZmViOGRlZWNjMTQ2YjliMSIsCisgICAgICAiMHhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmY5OWRlZjgzNjE0NmJjOWIxYjRkMjI4MzEiLAorCisgICAgICAiMHgxODhkYTgwZWIwMzA5MGY2N2NiZjIwZWI0M2ExODgwMGY0ZmYwYWZkODJmZjEwMTIiLAorICAgICAgIjB4MDcxOTJiOTVmZmM4ZGE3ODYzMTAxMWVkNmIyNGNkZDU3M2Y5NzdhMTFlNzk0ODExIgorICAgIH0sCisgICAgeworICAgICAgIk5JU1QgUC0yMjQiLCAyMjQsIDEsCisgICAgICAiMHhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSIsCisgICAgICAiMHhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZWZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZSIsCisgICAgICAiMHhiNDA1MGE4NTBjMDRiM2FiZjU0MTMyNTY1MDQ0YjBiN2Q3YmZkOGJhMjcwYjM5NDMyMzU1ZmZiNCIsCisgICAgICAiMHhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTZhMmUwYjhmMDNlMTNkZDI5NDU1YzVjMmEzZCIgLAorCisgICAgICAiMHhiNzBlMGNiZDZiYjRiZjdmMzIxMzkwYjk0YTAzYzFkMzU2YzIxMTIyMzQzMjgwZDYxMTVjMWQyMSIsCisgICAgICAiMHhiZDM3NjM4OGI1ZjcyM2ZiNGMyMmRmZTZjZDQzNzVhMDVhMDc0NzY0NDRkNTgxOTk4NTAwN2UzNCIKKyAgICB9LAorICAgIHsKKyAgICAgICJOSVNUIFAtMjU2IiwgMjU2LCAxLAorICAgICAgIjB4ZmZmZmZmZmYwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZiIsCisgICAgICAiMHhmZmZmZmZmZjAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjIiwKKyAgICAgICIweDVhYzYzNWQ4YWEzYTkzZTdiM2ViYmQ1NTc2OTg4NmJjNjUxZDA2YjBjYzUzYjBmNjNiY2UzYzNlMjdkMjYwNGIiLAorICAgICAgIjB4ZmZmZmZmZmYwMDAwMDAwMGZmZmZmZmZmZmZmZmZmZmZiY2U2ZmFhZGE3MTc5ZTg0ZjNiOWNhYzJmYzYzMjU1MSIsCisKKyAgICAgICIweDZiMTdkMWYyZTEyYzQyNDdmOGJjZTZlNTYzYTQ0MGYyNzcwMzdkODEyZGViMzNhMGY0YTEzOTQ1ZDg5OGMyOTYiLAorICAgICAgIjB4NGZlMzQyZTJmZTFhN2Y5YjhlZTdlYjRhN2MwZjllMTYyYmNlMzM1NzZiMzE1ZWNlY2JiNjQwNjgzN2JmNTFmNSIKKyAgICB9LAorICAgIHsKKyAgICAgICJOSVNUIFAtMzg0IiwgMzg0LCAxLAorICAgICAgIjB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZSIKKyAgICAgICJmZmZmZmZmZjAwMDAwMDAwMDAwMDAwMDBmZmZmZmZmZiIsCisgICAgICAiMHhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZlIgorICAgICAgImZmZmZmZmZmMDAwMDAwMDAwMDAwMDAwMGZmZmZmZmZjIiwKKyAgICAgICIweGIzMzEyZmE3ZTIzZWU3ZTQ5ODhlMDU2YmUzZjgyZDE5MTgxZDljNmVmZTgxNDExMjAzMTQwODhmNTAxMzg3NWEiCisgICAgICAiYzY1NjM5OGQ4YTJlZDE5ZDJhODVjOGVkZDNlYzJhZWYiLAorICAgICAgIjB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYzc2MzRkODFmNDM3MmRkZiIKKyAgICAgICI1ODFhMGRiMjQ4YjBhNzdhZWNlYzE5NmFjY2M1Mjk3MyIsCisKKyAgICAgICIweGFhODdjYTIyYmU4YjA1Mzc4ZWIxYzcxZWYzMjBhZDc0NmUxZDNiNjI4YmE3OWI5ODU5Zjc0MWUwODI1NDJhMzgiCisgICAgICAiNTUwMmYyNWRiZjU1Mjk2YzNhNTQ1ZTM4NzI3NjBhYjciLAorICAgICAgIjB4MzYxN2RlNGE5NjI2MmM2ZjVkOWU5OGJmOTI5MmRjMjlmOGY0MWRiZDI4OWExNDdjZTlkYTMxMTNiNWYwYjhjMCIKKyAgICAgICIwYTYwYjFjZTFkN2U4MTlkN2E0MzFkN2M5MGVhMGU1ZiIKKyAgICB9LAorICAgIHsKKyAgICAgICJOSVNUIFAtNTIxIiwgNTIxLCAxLAorICAgICAgIjB4MDFmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZiIKKyAgICAgICJmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZiIsCisgICAgICAiMHgwMWZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmIgorICAgICAgImZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjIiwKKyAgICAgICIweDA1MTk1M2ViOTYxOGUxYzlhMWY5MjlhMjFhMGI2ODU0MGVlYTJkYTcyNWI5OWIzMTVmM2I4YjQ4OTkxOGVmMTAiCisgICAgICAiOWUxNTYxOTM5NTFlYzdlOTM3YjE2NTJjMGJkM2JiMWJmMDczNTczZGY4ODNkMmMzNGYxZWY0NTFmZDQ2YjUwM2YwMCIsCisgICAgICAiMHgxZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmIgorICAgICAgImZmYTUxODY4NzgzYmYyZjk2NmI3ZmNjMDE0OGY3MDlhNWQwM2JiNWM5Yjg4OTljNDdhZWJiNmZiNzFlOTEzODY0MDkiLAorCisgICAgICAiMHhjNjg1OGUwNmI3MDQwNGU5Y2Q5ZTNlY2I2NjIzOTViNDQyOWM2NDgxMzkwNTNmYjUyMWY4MjhhZjYwNmI0ZDNkIgorICAgICAgImJhYTE0YjVlNzdlZmU3NTkyOGZlMWRjMTI3YTJmZmE4ZGUzMzQ4YjNjMTg1NmE0MjliZjk3ZTdlMzFjMmU1YmQ2NiIsCisgICAgICAiMHgxMTgzOTI5NmE3ODlhM2JjMDA0NWM4YTVmYjQyYzdkMWJkOTk4ZjU0NDQ5NTc5YjQ0NjgxN2FmYmQxNzI3M2U2IgorICAgICAgIjYyYzk3ZWU3Mjk5NWVmNDI2NDBjNTUwYjkwMTNmYWQwNzYxMzUzYzcwODZhMjcyYzI0MDg4YmU5NDc2OWZkMTY2NTAiCisgICAgfSwKKworICAgIHsgImJyYWlucG9vbFAxNjByMSIsIDE2MCwgMCwgCisgICAgICAiMHhlOTVlNGE1ZjczNzA1OWRjNjBkZmM3YWQ5NWIzZDgxMzk1MTU2MjBmIiwKKyAgICAgICIweDM0MGU3YmUyYTI4MGViNzRlMmJlNjFiYWRhNzQ1ZDk3ZThmN2MzMDAiLAorICAgICAgIjB4MWU1ODlhODU5NTQyMzQxMjEzNGZhYTJkYmRlYzk1YzhkODY3NWU1OCIsCisgICAgICAiMHhlOTVlNGE1ZjczNzA1OWRjNjBkZjU5OTFkNDUwMjk0MDllNjBmYzA5IiwKKyAgICAgICIweGJlZDVhZjE2ZWEzZjZhNGY2MjkzOGM0NjMxZWI1YWY3YmRiY2RiYzMiLAorICAgICAgIjB4MTY2N2NiNDc3YTFhOGVjMzM4Zjk0NzQxNjY5Yzk3NjMxNmRhNjMyMSIKKyAgICB9LAorCisgICAgeyAiYnJhaW5wb29sUDE5MnIxIiwgMTkyLCAwLCAKKyAgICAgICIweGMzMDJmNDFkOTMyYTM2Y2RhN2EzNDYzMDkzZDE4ZGI3OGZjZTQ3NmRlMWE4NjI5NyIsCisgICAgICAiMHg2YTkxMTc0MDc2YjFlMGUxOWMzOWMwMzFmZTg2ODVjMWNhZTA0MGU1YzY5YTI4ZWYiLAorICAgICAgIjB4NDY5YTI4ZWY3YzI4Y2NhM2RjNzIxZDA0NGY0NDk2YmNjYTdlZjQxNDZmYmYyNWM5IiwKKyAgICAgICIweGMzMDJmNDFkOTMyYTM2Y2RhN2EzNDYyZjllOWU5MTZiNWJlOGYxMDI5YWM0YWNjMSIsCisgICAgICAiMHhjMGEwNjQ3ZWFhYjZhNDg3NTNiMDMzYzU2Y2IwZjA5MDBhMmY1YzQ4NTMzNzVmZDYiLAorICAgICAgIjB4MTRiNjkwODY2YWJkNWJiODhiNWY0ODI4YzE0OTAwMDJlNjc3M2ZhMmZhMjk5YjhmIgorICAgIH0sCisKKyAgICB7ICJicmFpbnBvb2xQMjI0cjEiLCAyMjQsIDAsCisgICAgICAiMHhkN2MxMzRhYTI2NDM2Njg2MmExODMwMjU3NWQxZDc4N2IwOWYwNzU3OTdkYTg5ZjU3ZWM4YzBmZiIsCisgICAgICAiMHg2OGE1ZTYyY2E5Y2U2YzFjMjk5ODAzYTZjMTUzMGI1MTRlMTgyYWQ4YjAwNDJhNTljYWQyOWY0MyIsCisgICAgICAiMHgyNTgwZjYzY2NmZTQ0MTM4ODcwNzEzYjFhOTIzNjllMzNlMjEzNWQyNjZkYmIzNzIzODZjNDAwYiIsCisgICAgICAiMHhkN2MxMzRhYTI2NDM2Njg2MmExODMwMjU3NWQwZmI5OGQxMTZiYzRiNmRkZWJjYTNhNWE3OTM5ZiIsCisgICAgICAiMHgwZDkwMjlhZDJjN2U1Y2Y0MzQwODIzYjJhODdkYzY4YzllNGNlMzE3NGMxZTZlZmRlZTEyYzA3ZCIsCisgICAgICAiMHg1OGFhNTZmNzcyYzA3MjZmMjRjNmI4OWU0ZWNkYWMyNDM1NGI5ZTk5Y2FhM2Y2ZDM3NjE0MDJjZCIKKyAgICB9LAorCisgICAgeyAiYnJhaW5wb29sUDI1NnIxIiwgMjU2LCAwLAorICAgICAgIjB4YTlmYjU3ZGJhMWVlYTliYzNlNjYwYTkwOWQ4MzhkNzI2ZTNiZjYyM2Q1MjYyMDI4MjAxMzQ4MWQxZjZlNTM3NyIsCisgICAgICAiMHg3ZDVhMDk3NWZjMmMzMDU3ZWVmNjc1MzA0MTdhZmZlN2ZiODA1NWMxMjZkYzVjNmNlOTRhNGI0NGYzMzBiNWQ5IiwKKyAgICAgICIweDI2ZGM1YzZjZTk0YTRiNDRmMzMwYjVkOWJiZDc3Y2JmOTU4NDE2Mjk1Y2Y3ZTFjZTZiY2NkYzE4ZmY4YzA3YjYiLAorICAgICAgIjB4YTlmYjU3ZGJhMWVlYTliYzNlNjYwYTkwOWQ4MzhkNzE4YzM5N2FhM2I1NjFhNmY3OTAxZTBlODI5NzQ4NTZhNyIsCisgICAgICAiMHg4YmQyYWViOWNiN2U1N2NiMmM0YjQ4MmZmYzgxYjdhZmI5ZGUyN2UxZTNiZDIzYzIzYTQ0NTNiZDlhY2UzMjYyIiwKKyAgICAgICIweDU0N2VmODM1YzNkYWM0ZmQ5N2Y4NDYxYTE0NjExZGM5YzI3NzQ1MTMyZGVkOGU1NDVjMWQ1NGM3MmYwNDY5OTciCisgICAgfSwKKworICAgIHsgImJyYWlucG9vbFAzMjByMSIsIDMyMCwgMCwKKyAgICAgICIweGQzNWU0NzIwMzZiYzRmYjdlMTNjNzg1ZWQyMDFlMDY1Zjk4ZmNmYTZmNmY0MGRlZjRmOTJiOWVjNzg5M2VjMjgiCisgICAgICAiZmNkNDEyYjFmMWIzMmUyNyIsCisgICAgICAiMHgzZWUzMGI1NjhmYmFiMGY4ODNjY2ViZDQ2ZDNmM2JiOGEyYTczNTEzZjVlYjc5ZGE2NjE5MGViMDg1ZmZhOWY0IgorICAgICAgIjkyZjM3NWE5N2Q4NjBlYjQiLAorICAgICAgIjB4NTIwODgzOTQ5ZGZkYmM0MmQzYWQxOTg2NDA2ODhhNmZlMTNmNDEzNDk1NTRiNDlhY2MzMWRjY2Q4ODQ1Mzk4MSIKKyAgICAgICI2ZjVlYjRhYzhmYjFmMWE2IiwKKyAgICAgICIweGQzNWU0NzIwMzZiYzRmYjdlMTNjNzg1ZWQyMDFlMDY1Zjk4ZmNmYTViNjhmMTJhMzJkNDgyZWM3ZWU4NjU4ZTkiCisgICAgICAiODY5MTU1NWI0NGM1OTMxMSIsCisgICAgICAiMHg0M2JkN2U5YWZiNTNkOGI4NTI4OWJjYzQ4ZWU1YmZlNmYyMDEzN2QxMGEwODdlYjZlNzg3MWUyYTEwYTU5OWM3IgorICAgICAgIjEwYWY4ZDBkMzllMjA2MTEiLAorICAgICAgIjB4MTRmZGQwNTU0NWVjMWNjOGFiNDA5MzI0N2Y3NzI3NWUwNzQzZmZlZDExNzE4MmVhYTljNzc4NzdhYWFjNmFjNyIKKyAgICAgICJkMzUyNDVkMTY5MmU4ZWUxIgorICAgIH0sCisKKyAgICB7ICJicmFpbnBvb2xQMzg0cjEiLCAzODQsIDAsCisgICAgICAiMHg4Y2I5MWU4MmEzMzg2ZDI4MGY1ZDZmN2U1MGU2NDFkZjE1MmY3MTA5ZWQ1NDU2YjQxMmIxZGExOTdmYjcxMTIzIgorICAgICAgImFjZDNhNzI5OTAxZDFhNzE4NzQ3MDAxMzMxMDdlYzUzIiwKKyAgICAgICIweDdiYzM4MmM2M2Q4YzE1MGMzYzcyMDgwYWNlMDVhZmEwYzJiZWEyOGU0ZmIyMjc4NzEzOTE2NWVmYmE5MWY5MGYiCisgICAgICAiOGFhNTgxNGE1MDNhZDRlYjA0YThjN2RkMjJjZTI4MjYiLAorICAgICAgIjB4MDRhOGM3ZGQyMmNlMjgyNjhiMzliNTU0MTZmMDQ0N2MyZmI3N2RlMTA3ZGNkMmE2MmU4ODBlYTUzZWViNjJkNSIKKyAgICAgICI3Y2I0MzkwMjk1ZGJjOTk0M2FiNzg2OTZmYTUwNGMxMSIsCisgICAgICAiMHg4Y2I5MWU4MmEzMzg2ZDI4MGY1ZDZmN2U1MGU2NDFkZjE1MmY3MTA5ZWQ1NDU2YjMxZjE2NmU2Y2FjMDQyNWE3IgorICAgICAgImNmM2FiNmFmNmI3ZmMzMTAzYjg4MzIwMmU5MDQ2NTY1IiwKKyAgICAgICIweDFkMWM2NGYwNjhjZjQ1ZmZhMmE2M2E4MWI3YzEzZjZiODg0N2EzZTc3ZWYxNGZlM2RiN2ZjYWZlMGNiZDEwZTgiCisgICAgICAiZTgyNmUwMzQzNmQ2NDZhYWVmODdiMmUyNDdkNGFmMWUiLAorICAgICAgIjB4OGFiZTFkNzUyMGY5YzJhNDVjYjFlYjhlOTVjZmQ1NTI2MmI3MGIyOWZlZWM1ODY0ZTE5YzA1NGZmOTkxMjkyOCIKKyAgICAgICIwZTQ2NDYyMTc3OTE4MTExNDI4MjAzNDEyNjNjNTMxNSIKKyAgICB9LAorCisgICAgeyAiYnJhaW5wb29sUDUxMnIxIiwgNTEyLCAwLAorICAgICAgIjB4YWFkZDlkYjhkYmU5YzQ4YjNmZDRlNmFlMzNjOWZjMDdjYjMwOGRiM2IzYzlkMjBlZDY2MzljY2E3MDMzMDg3MSIKKyAgICAgICI3ZDRkOWIwMDliYzY2ODQyYWVjZGExMmFlNmEzODBlNjI4ODFmZjJmMmQ4MmM2ODUyOGFhNjA1NjU4M2E0OGYzIiwKKyAgICAgICIweDc4MzBhMzMxOGI2MDNiODllMjMyNzE0NWFjMjM0Y2M1OTRjYmRkOGQzZGY5MTYxMGE4MzQ0MWNhZWE5ODYzYmMiCisgICAgICAiMmRlZDVkNWFhODI1M2FhMTBhMmVmMWM5OGI5YWM4YjU3ZjExMTdhNzJiZjJjN2I5ZTdjMWFjNGQ3N2ZjOTRjYSIsCisgICAgICAiMHgzZGY5MTYxMGE4MzQ0MWNhZWE5ODYzYmMyZGVkNWQ1YWE4MjUzYWExMGEyZWYxYzk4YjlhYzhiNTdmMTExN2E3IgorICAgICAgIjJiZjJjN2I5ZTdjMWFjNGQ3N2ZjOTRjYWRjMDgzZTY3OTg0MDUwYjc1ZWJhZTVkZDI4MDliZDYzODAxNmY3MjMiLAorICAgICAgIjB4YWFkZDlkYjhkYmU5YzQ4YjNmZDRlNmFlMzNjOWZjMDdjYjMwOGRiM2IzYzlkMjBlZDY2MzljY2E3MDMzMDg3MCIKKyAgICAgICI1NTNlNWM0MTRjYTkyNjE5NDE4NjYxMTk3ZmFjMTA0NzFkYjFkMzgxMDg1ZGRhZGRiNTg3OTY4MjljYTkwMDY5IiwKKyAgICAgICIweDgxYWVlNGJkZDgyZWQ5NjQ1YTIxMzIyZTljNGM2YTkzODVlZDlmNzBiNWQ5MTZjMWI0M2I2MmVlZjRkMDA5OGUiCisgICAgICAiZmYzYjFmNzhlMmQwZDQ4ZDUwZDE2ODdiOTNiOTdkNWY3YzZkNTA0NzQwNmE1ZTY4OGIzNTIyMDliY2I5ZjgyMiIsCisgICAgICAiMHg3ZGRlMzg1ZDU2NjMzMmVjYzBlYWJmYTljZjc4MjJmZGYyMDlmNzAwMjRhNTdiMWFhMDAwYzU1Yjg4MWY4MTExIgorICAgICAgImIyZGNkZTQ5NGE1ZjQ4NWU1YmNhNGJkODhhMjc2M2FlZDFjYTJiMmZhOGYwNTQwNjc4Y2QxZTBmM2FkODA4OTIiCisgICAgfSwKKworICAgIHsgTlVMTCwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9CisgIH07CisKKworLyogUmVnaXN0ZXJlZCBwcm9ncmVzcyBmdW5jdGlvbiBhbmQgaXRzIGNhbGxiYWNrIHZhbHVlLiAqLworc3RhdGljIHZvaWQgKCpwcm9ncmVzc19jYikgKHZvaWQgKiwgY29uc3QgY2hhciosIGludCwgaW50LCBpbnQpOworc3RhdGljIHZvaWQgKnByb2dyZXNzX2NiX2RhdGE7CisKKworI2RlZmluZSBwb2ludF9pbml0KGEpICBfZ2NyeV9tcGlfZWNfcG9pbnRfaW5pdCAoKGEpKQorI2RlZmluZSBwb2ludF9mcmVlKGEpICBfZ2NyeV9tcGlfZWNfcG9pbnRfZnJlZSAoKGEpKQorCisKKwwKKy8qIExvY2FsIHByb3RvdHlwZXMuICovCitzdGF0aWMgZ2NyeV9tcGlfdCBnZW5fayAoZ2NyeV9tcGlfdCBwLCBpbnQgc2VjdXJpdHlfbGV2ZWwpOworc3RhdGljIHZvaWQgdGVzdF9rZXlzIChFQ0Nfc2VjcmV0X2tleSAqIHNrLCB1bnNpZ25lZCBpbnQgbmJpdHMpOworc3RhdGljIGludCBjaGVja19zZWNyZXRfa2V5IChFQ0Nfc2VjcmV0X2tleSAqIHNrKTsKK3N0YXRpYyBncGdfZXJyX2NvZGVfdCBzaWduIChnY3J5X21waV90IGlucHV0LCBFQ0Nfc2VjcmV0X2tleSAqc2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X21waV90IHIsIGdjcnlfbXBpX3Qgcyk7CitzdGF0aWMgZ3BnX2Vycl9jb2RlX3QgdmVyaWZ5IChnY3J5X21waV90IGlucHV0LCBFQ0NfcHVibGljX2tleSAqcGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfbXBpX3QgciwgZ2NyeV9tcGlfdCBzKTsKKworCitzdGF0aWMgZ2NyeV9tcGlfdCBnZW5feV8yIChnY3J5X21waV90IHgsIGVsbGlwdGljX2N1cnZlX3QgKiBiYXNlKTsKKworCisKKwwKK3ZvaWQKK19nY3J5X3JlZ2lzdGVyX3BrX2VjY19wcm9ncmVzcyAodm9pZCAoKmNiKSAodm9pZCAqLCBjb25zdCBjaGFyICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCwgaW50LCBpbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjYl9kYXRhKQoreworICBwcm9ncmVzc19jYiA9IGNiOworICBwcm9ncmVzc19jYl9kYXRhID0gY2JfZGF0YTsKK30KKworLyogc3RhdGljIHZvaWQgKi8KKy8qIHByb2dyZXNzIChpbnQgYykgKi8KKy8qIHsgKi8KKy8qICAgaWYgKHByb2dyZXNzX2NiKSAqLworLyogICAgIHByb2dyZXNzX2NiIChwcm9ncmVzc19jYl9kYXRhLCAicGtfZWNjIiwgYywgMCwgMCk7ICovCisvKiB9ICovCisKKworDAorCisvKiBTZXQgdGhlIHZhbHVlIGZyb20gUyBpbnRvIEQuICAqLworc3RhdGljIHZvaWQKK3BvaW50X3NldCAobXBpX3BvaW50X3QgKmQsIG1waV9wb2ludF90ICpzKQoreworICBtcGlfc2V0IChkLT54LCBzLT54KTsKKyAgbXBpX3NldCAoZC0+eSwgcy0+eSk7CisgIG1waV9zZXQgKGQtPnosIHMtPnopOworfQorCisKKy8qCisgKiBSZWxlYXNlIGEgY3VydmUgb2JqZWN0LgorICovCitzdGF0aWMgdm9pZAorY3VydmVfZnJlZSAoZWxsaXB0aWNfY3VydmVfdCAqRSkKK3sKKyAgbXBpX2ZyZWUgKEUtPnApOyBFLT5wID0gTlVMTDsKKyAgbXBpX2ZyZWUgKEUtPmEpOyBFLT5hID0gTlVMTDsKKyAgbXBpX2ZyZWUgKEUtPmIpOyAgRS0+YiA9IE5VTEw7CisgIHBvaW50X2ZyZWUgKCZFLT5HKTsKKyAgbXBpX2ZyZWUgKEUtPm4pOyAgRS0+biA9IE5VTEw7Cit9CisKKworLyoKKyAqIFJldHVybiBhIGNvcHkgb2YgYSBjdXJ2ZSBvYmplY3QuCisgKi8KK3N0YXRpYyBlbGxpcHRpY19jdXJ2ZV90CitjdXJ2ZV9jb3B5IChlbGxpcHRpY19jdXJ2ZV90IEUpCit7CisgIGVsbGlwdGljX2N1cnZlX3QgUjsKKworICBSLnAgPSBtcGlfY29weSAoRS5wKTsKKyAgUi5hID0gbXBpX2NvcHkgKEUuYSk7CisgIFIuYiA9IG1waV9jb3B5IChFLmIpOworICBwb2ludF9pbml0ICgmUi5HKTsKKyAgcG9pbnRfc2V0ICgmUi5HLCAmRS5HKTsKKyAgUi5uID0gbXBpX2NvcHkgKEUubik7CisKKyAgcmV0dXJuIFI7Cit9CisKKworCisvKiBIZWxwZXIgdG8gc2NhbiBhIGhleCBzdHJpbmcuICovCitzdGF0aWMgZ2NyeV9tcGlfdAorc2NhbnZhbCAoY29uc3QgY2hhciAqc3RyaW5nKQoreworICBncGdfZXJyb3JfdCBlcnI7CisgIGdjcnlfbXBpX3QgdmFsOworCisgIGVyciA9IGdjcnlfbXBpX3NjYW4gKCZ2YWwsIEdDUllNUElfRk1UX0hFWCwgc3RyaW5nLCAwLCBOVUxMKTsKKyAgaWYgKGVycikKKyAgICBsb2dfZmF0YWwgKCJzY2FubmluZyBFQ0MgcGFyYW1ldGVyIGZhaWxlZDogJXNcbiIsIGdwZ19zdHJlcnJvciAoZXJyKSk7CisgIHJldHVybiB2YWw7Cit9CisKKworCisMCisKKy8qKioqKioqKioqKioqKioqCisgKiBTb2x2ZSB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgZXF1YXRpb24gdGhhdCBkZWZpbmVzIGEgY3VydmUuCisgKi8KK3N0YXRpYyBnY3J5X21waV90CitnZW5feV8yIChnY3J5X21waV90IHgsIGVsbGlwdGljX2N1cnZlX3QgKmJhc2UpCit7CisgIGdjcnlfbXBpX3QgdGhyZWUsIHhfMywgYXhiLCB5OworCisgIHRocmVlID0gbXBpX2FsbG9jX3NldF91aSAoMyk7CisgIHhfMyA9IG1waV9uZXcgKDApOworICBheGIgPSBtcGlfbmV3ICgwKTsKKyAgeSAgID0gbXBpX25ldyAoMCk7CisKKyAgbXBpX3Bvd20gKHhfMywgeCwgdGhyZWUsIGJhc2UtPnApOyAgCisgIG1waV9tdWxtIChheGIsIGJhc2UtPmEsIHgsIGJhc2UtPnApOyAKKyAgbXBpX2FkZG0gKGF4YiwgYXhiLCBiYXNlLT5iLCBiYXNlLT5wKTsgICAgIAorICBtcGlfYWRkbSAoeSwgeF8zLCBheGIsIGJhc2UtPnApOyAgICAKKworICBtcGlfZnJlZSAoeF8zKTsKKyAgbXBpX2ZyZWUgKGF4Yik7CisgIG1waV9mcmVlICh0aHJlZSk7CisgIHJldHVybiB5OyAvKiBUaGUgcXVhZHJhdGljIHZhbHVlIG9mIHRoZSBjb29yZGluYXRlIGlmIGl0IGV4aXN0LiAqLworfQorCisKKworCisKKy8qIEdlbmVyYXRlIGEgcmFuZG9tIHNlY3JldCBzY2FsYXIgayB3aXRoIGFuIG9yZGVyIG9mIHAKKworICAgQXQgdGhlIGJlZ2lubmluZyB0aGlzIHdhcyBpZGVudGljYWwgdG8gdGhlIGNvZGUgaXMgaW4gZWxnYW1hbC5jLgorICAgTGF0ZXIgaW1wb3J2ZWQgYnkgbW1yLiAgIEZ1cnRoZXIgc2ltcGxpZmllZCBieSB3ay4gICovCitzdGF0aWMgZ2NyeV9tcGlfdAorZ2VuX2sgKGdjcnlfbXBpX3QgcCwgaW50IHNlY3VyaXR5X2xldmVsKQoreworICBnY3J5X21waV90IGs7CisgIHVuc2lnbmVkIGludCBuYml0czsKKworICBuYml0cyA9IG1waV9nZXRfbmJpdHMgKHApOworICBrID0gbXBpX3NuZXcgKG5iaXRzKTsKKyAgaWYgKERCR19DSVBIRVIpCisgICAgbG9nX2RlYnVnICgiY2hvb3NpbmcgYSByYW5kb20gayBvZiAldSBiaXRzXG4iLCBuYml0cyk7CisKKyAgZ2NyeV9tcGlfcmFuZG9taXplIChrLCBuYml0cywgc2VjdXJpdHlfbGV2ZWwpOworCisgIG1waV9tb2QgKGssIGssIHApOyAgLyogIGsgPSBrIG1vZCBwICAqLworCisgIHJldHVybiBrOworfQorCisvKioqKioqKioqKioqKioqKgorICogR2VuZXJhdGUgdGhlIGNyeXB0byBzeXN0ZW0gc2V0dXAuCisgKiBBcyBvZiBub3cgdGhlIGZpeCBOSVNUIHJlY29tbWVuZGVkIHZhbHVlcyBhcmUgdXNlZC4KKyAqIFRoZSBzdWJncm91cCBnZW5lcmF0b3IgcG9pbnQgaXMgaW4gYW5vdGhlciBmdW5jdGlvbjogZ2VuX2JpZ19wb2ludC4KKyAqLworc3RhdGljIGdwZ19lcnJfY29kZV90CitnZW5lcmF0ZV9jdXJ2ZSAodW5zaWduZWQgaW50IG5iaXRzLCBjb25zdCBjaGFyICpuYW1lLCAKKyAgICAgICAgICAgICAgICBlbGxpcHRpY19jdXJ2ZV90ICpjdXJ2ZSwgdW5zaWduZWQgaW50ICpyX25iaXRzKQoreworICBpbnQgaWR4LCBhbGlhc25vOworCisgIGlmIChuYW1lKQorICAgIHsKKyAgICAgIC8qIEZpcnN0IGNoZWNrIG5vciBuYXRpdmUgY3VydmVzLiAgKi8KKyAgICAgIGZvciAoaWR4ID0gMDsgZG9tYWluX3Bhcm1zW2lkeF0uZGVzYzsgaWR4KyspCisgICAgICAgIGlmICghc3RyY21wIChuYW1lLCBkb21haW5fcGFybXNbaWR4XS5kZXNjKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgIC8qIElmIG5vdCBmb3VuZCBjb25zdWx0IHRoZSBhbGlhcyB0YWJsZS4gICovCisgICAgICBpZiAoIWRvbWFpbl9wYXJtc1tpZHhdLmRlc2MpCisgICAgICAgIHsKKyAgICAgICAgICBmb3IgKGFsaWFzbm8gPSAwOyBjdXJ2ZV9hbGlhc2VzW2FsaWFzbm9dLm5hbWU7IGFsaWFzbm8rKykKKyAgICAgICAgICAgIGlmICghc3RyY21wIChuYW1lLCBjdXJ2ZV9hbGlhc2VzW2FsaWFzbm9dLm90aGVyKSkKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgaWYgKGN1cnZlX2FsaWFzZXNbYWxpYXNub10ubmFtZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZm9yIChpZHggPSAwOyBkb21haW5fcGFybXNbaWR4XS5kZXNjOyBpZHgrKykKKyAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcCAoY3VydmVfYWxpYXNlc1thbGlhc25vXS5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21haW5fcGFybXNbaWR4XS5kZXNjKSkKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZm9yIChpZHggPSAwOyBkb21haW5fcGFybXNbaWR4XS5kZXNjOyBpZHgrKykKKyAgICAgICAgaWYgKG5iaXRzID09IGRvbWFpbl9wYXJtc1tpZHhdLm5iaXRzKQorICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgaWYgKCFkb21haW5fcGFybXNbaWR4XS5kZXNjKQorICAgIHJldHVybiBHUEdfRVJSX0lOVl9WQUxVRTsKKworICAvKiBJbiBmaXBzIG1vZGUgd2Ugb25seSBzdXBwb3J0IE5JU1QgY3VydmVzLiAgTm90ZSB0aGF0IGl0IGlzCisgICAgIHBvc3NpYmxlIHRvIGJ5cGFzcyB0aGlzIGNoZWNrIGJ5IHNwZWNpZnlpbmcgdGhlIGN1cnZlIHBhcmFtZXRlcnMKKyAgICAgZGlyZWN0bHkuICAqLworICBpZiAoZmlwc19tb2RlICgpICYmICFkb21haW5fcGFybXNbaWR4XS5maXBzICkKKyAgICByZXR1cm4gR1BHX0VSUl9OT1RfU1VQUE9SVEVEOyAKKyAgCisKKyAgKnJfbmJpdHMgPSBkb21haW5fcGFybXNbaWR4XS5uYml0czsKKyAgY3VydmUtPnAgPSBzY2FudmFsIChkb21haW5fcGFybXNbaWR4XS5wKTsKKyAgY3VydmUtPmEgPSBzY2FudmFsIChkb21haW5fcGFybXNbaWR4XS5hKTsKKyAgY3VydmUtPmIgPSBzY2FudmFsIChkb21haW5fcGFybXNbaWR4XS5iKTsKKyAgY3VydmUtPm4gPSBzY2FudmFsIChkb21haW5fcGFybXNbaWR4XS5uKTsKKyAgY3VydmUtPkcueCA9IHNjYW52YWwgKGRvbWFpbl9wYXJtc1tpZHhdLmdfeCk7CisgIGN1cnZlLT5HLnkgPSBzY2FudmFsIChkb21haW5fcGFybXNbaWR4XS5nX3kpOworICBjdXJ2ZS0+Ry56ID0gbXBpX2FsbG9jX3NldF91aSAoMSk7CisKKyAgcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIEZpcnN0IG9idGFpbiB0aGUgc2V0dXAuICBPdmVyIHRoZSBmaW5pdGUgZmllbGQgcmFuZG9taXplIGFuIHNjYWxhcgorICogc2VjcmV0IHZhbHVlLCBhbmQgY2FsY3VsYXRlIHRoZSBwdWJsaWMgcG9pbnQuCisgKi8KK3N0YXRpYyBncGdfZXJyX2NvZGVfdAorZ2VuZXJhdGVfa2V5IChFQ0Nfc2VjcmV0X2tleSAqc2ssIHVuc2lnbmVkIGludCBuYml0cywgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgZ2NyeV9tcGlfdCBnX3gsIGdjcnlfbXBpX3QgZ195LAorICAgICAgICAgICAgICBnY3J5X21waV90IHFfeCwgZ2NyeV9tcGlfdCBxX3kpCit7CisgIGdwZ19lcnJfY29kZV90IGVycjsKKyAgZWxsaXB0aWNfY3VydmVfdCBFOworICBnY3J5X21waV90IGQ7CisgIG1waV9wb2ludF90IFE7CisgIG1waV9lY190IGN0eDsKKworICBlcnIgPSBnZW5lcmF0ZV9jdXJ2ZSAobmJpdHMsIG5hbWUsICZFLCAmbmJpdHMpOworICBpZiAoZXJyKQorICAgIHJldHVybiBlcnI7CisKKyAgaWYgKERCR19DSVBIRVIpCisgICAgeworICAgICAgbG9nX21waWR1bXAgKCJlY2MgZ2VuZXJhdGlvbiAgIHAiLCBFLnApOworICAgICAgbG9nX21waWR1bXAgKCJlY2MgZ2VuZXJhdGlvbiAgIGEiLCBFLmEpOworICAgICAgbG9nX21waWR1bXAgKCJlY2MgZ2VuZXJhdGlvbiAgIGIiLCBFLmIpOworICAgICAgbG9nX21waWR1bXAgKCJlY2MgZ2VuZXJhdGlvbiAgIG4iLCBFLm4pOworICAgICAgbG9nX21waWR1bXAgKCJlY2MgZ2VuZXJhdGlvbiAgR3giLCBFLkcueCk7CisgICAgICBsb2dfbXBpZHVtcCAoImVjYyBnZW5lcmF0aW9uICBHeSIsIEUuRy55KTsKKyAgICAgIGxvZ19tcGlkdW1wICgiZWNjIGdlbmVyYXRpb24gIEd6IiwgRS5HLnopOworICAgIH0KKworICBpZiAoREJHX0NJUEhFUikKKyAgICBsb2dfZGVidWcgKCJjaG9vc2luZyBhIHJhbmRvbSB4IG9mIHNpemUgJXVcbiIsIG5iaXRzKTsKKyAgZCA9IGdlbl9rIChFLm4sIEdDUllfVkVSWV9TVFJPTkdfUkFORE9NKTsgCisKKyAgLyogQ29tcHV0ZSBRLiAgKi8KKyAgcG9pbnRfaW5pdCAoJlEpOworICBjdHggPSBfZ2NyeV9tcGlfZWNfaW5pdCAoRS5wLCBFLmEpOworICBfZ2NyeV9tcGlfZWNfbXVsX3BvaW50ICgmUSwgZCwgJkUuRywgY3R4KTsKKworICAvKiBDb3B5IHRoZSBzdHVmZiB0byB0aGUga2V5IHN0cnVjdHVyZXMuICovCisgIHNrLT5FLnAgPSBtcGlfY29weSAoRS5wKTsKKyAgc2stPkUuYSA9IG1waV9jb3B5IChFLmEpOworICBzay0+RS5iID0gbXBpX2NvcHkgKEUuYik7CisgIHBvaW50X2luaXQgKCZzay0+RS5HKTsKKyAgcG9pbnRfc2V0ICgmc2stPkUuRywgJkUuRyk7CisgIHNrLT5FLm4gPSBtcGlfY29weSAoRS5uKTsKKyAgcG9pbnRfaW5pdCAoJnNrLT5RKTsKKyAgcG9pbnRfc2V0ICgmc2stPlEsICZRKTsKKyAgc2stPmQgICAgPSBtcGlfY29weSAoZCk7CisgIC8qIFdlIGFsc28gcmV0dXJuIGNvcGllcyBvZiBHIGFuZCBRIGluIGFmZmluZSBjb29yZGluYXRlcyBpZgorICAgICByZXF1ZXN0ZWQuICAqLworICBpZiAoZ194ICYmIGdfeSkKKyAgICB7CisgICAgICBpZiAoX2djcnlfbXBpX2VjX2dldF9hZmZpbmUgKGdfeCwgZ195LCAmc2stPkUuRywgY3R4KSkKKyAgICAgICAgbG9nX2ZhdGFsICgiZWNjIGdlbmVyYXRlOiBGYWlsZWQgdG8gZ2V0IGFmZmluZSBjb29yZGluYXRlc1xuIik7CisgICAgfQorICBpZiAocV94ICYmIHFfeSkKKyAgICB7CisgICAgICBpZiAoX2djcnlfbXBpX2VjX2dldF9hZmZpbmUgKHFfeCwgcV95LCAmc2stPlEsIGN0eCkpCisgICAgICAgIGxvZ19mYXRhbCAoImVjYyBnZW5lcmF0ZTogRmFpbGVkIHRvIGdldCBhZmZpbmUgY29vcmRpbmF0ZXNcbiIpOworICAgIH0KKyAgX2djcnlfbXBpX2VjX2ZyZWUgKGN0eCk7CisKKyAgcG9pbnRfZnJlZSAoJlEpOworICBtcGlfZnJlZSAoZCk7CisgIGN1cnZlX2ZyZWUgKCZFKTsKKworICAvKiBOb3cgd2UgY2FuIHRlc3Qgb3VyIGtleXMgKHRoaXMgc2hvdWxkIG5ldmVyIGZhaWwhKS4gKi8KKyAgdGVzdF9rZXlzIChzaywgbmJpdHMgLSA2NCk7CisKKyAgcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioKKyAqIFRvIHZlcmlmeSBjb3JyZWN0IHNrZXkgaXQgdXNlIGEgcmFuZG9tIGluZm9ybWF0aW9uLgorICogRmlyc3QsIGVuY3J5cHQgYW5kIGRlY3J5cHQgdGhpcyBkdW1teSB2YWx1ZSwKKyAqIHRlc3QgaWYgdGhlIGluZm9ybWF0aW9uIGlzIHJlY3VwZXJhdGVkLgorICogU2Vjb25kLCB0ZXN0IHdpdGggdGhlIHNpZ24gYW5kIHZlcmlmeSBmdW5jdGlvbnMuCisgKi8KK3N0YXRpYyB2b2lkCit0ZXN0X2tleXMgKEVDQ19zZWNyZXRfa2V5ICpzaywgdW5zaWduZWQgaW50IG5iaXRzKQoreworICBFQ0NfcHVibGljX2tleSBwazsKKyAgZ2NyeV9tcGlfdCB0ZXN0ID0gbXBpX25ldyAobmJpdHMpOworICBtcGlfcG9pbnRfdCBSXzsKKyAgZ2NyeV9tcGlfdCBjID0gbXBpX25ldyAobmJpdHMpOworICBnY3J5X21waV90IG91dCA9IG1waV9uZXcgKG5iaXRzKTsKKyAgZ2NyeV9tcGlfdCByID0gbXBpX25ldyAobmJpdHMpOworICBnY3J5X21waV90IHMgPSBtcGlfbmV3IChuYml0cyk7CisKKyAgaWYgKERCR19DSVBIRVIpCisgICAgbG9nX2RlYnVnICgiVGVzdGluZyBrZXkuXG4iKTsKKworICBwb2ludF9pbml0ICgmUl8pOworCisgIHBrLkUgPSBjdXJ2ZV9jb3B5IChzay0+RSk7CisgIHBvaW50X2luaXQgKCZway5RKTsKKyAgcG9pbnRfc2V0ICgmcGsuUSwgJnNrLT5RKTsKKworICBnY3J5X21waV9yYW5kb21pemUgKHRlc3QsIG5iaXRzLCBHQ1JZX1dFQUtfUkFORE9NKTsKKworICBpZiAoc2lnbiAodGVzdCwgc2ssIHIsIHMpICkKKyAgICBsb2dfZmF0YWwgKCJFQ0RTQSBvcGVyYXRpb246IHNpZ24gZmFpbGVkXG4iKTsKKworICBpZiAodmVyaWZ5ICh0ZXN0LCAmcGssIHIsIHMpKQorICAgIHsKKyAgICAgIGxvZ19mYXRhbCAoIkVDRFNBIG9wZXJhdGlvbjogc2lnbiwgdmVyaWZ5IGZhaWxlZFxuIik7CisgICAgfQorCisgIGlmIChEQkdfQ0lQSEVSKQorICAgIGxvZ19kZWJ1ZyAoIkVDRFNBIG9wZXJhdGlvbjogc2lnbiwgdmVyaWZ5IG9rLlxuIik7CisKKyAgcG9pbnRfZnJlZSAoJnBrLlEpOworICBjdXJ2ZV9mcmVlICgmcGsuRSk7CisKKyAgcG9pbnRfZnJlZSAoJlJfKTsKKyAgbXBpX2ZyZWUgKHMpOworICBtcGlfZnJlZSAocik7CisgIG1waV9mcmVlIChvdXQpOworICBtcGlfZnJlZSAoYyk7CisgIG1waV9mcmVlICh0ZXN0KTsKK30KKworLyoqKioqKioqKioqKioqKioKKyAqIFRvIGNoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgdmFsdWUsIHJlY2FsY3VsYXRlIHRoZSBjb3JyZXNwb25kZW5jZQorICogYmV0d2VlbiB0aGUgcHVibGljIHZhbHVlIGFuZCB0aGUgc2VjcmV0IG9uZS4KKyAqLworc3RhdGljIGludAorY2hlY2tfc2VjcmV0X2tleSAoRUNDX3NlY3JldF9rZXkgKiBzaykKK3sKKyAgbXBpX3BvaW50X3QgUTsKKyAgZ2NyeV9tcGlfdCB5XzIsIHkyID0gbXBpX2FsbG9jICgwKTsKKyAgbXBpX2VjX3QgY3R4OworCisgIC8qID9wcmltYXJpdHkgdGVzdCBvZiAncCcgKi8KKyAgLyogICguLi4pIC8vISEgKi8KKyAgLyogRyBpbiBFKEZfcCkgKi8KKyAgeV8yID0gZ2VuX3lfMiAoc2stPkUuRy54LCAmc2stPkUpOyAgIC8qICB5XjI9eF4zK2EqeCtiICovCisgIG1waV9tdWxtICh5Miwgc2stPkUuRy55LCBzay0+RS5HLnksIHNrLT5FLnApOyAgICAgIC8qICB5XjI9eSp5ICovCisgIGlmIChtcGlfY21wICh5XzIsIHkyKSkKKyAgICB7CisgICAgICBpZiAoREJHX0NJUEhFUikKKyAgICAgICAgbG9nX2RlYnVnICgiQmFkIGNoZWNrOiBQb2ludCAnRycgZG9lcyBub3QgYmVsb25nIHRvIGN1cnZlICdFJyFcbiIpOworICAgICAgcmV0dXJuICgxKTsKKyAgICB9CisgIC8qIEcgIT0gUGFJICovCisgIGlmICghbXBpX2NtcF91aSAoc2stPkUuRy56LCAwKSkKKyAgICB7CisgICAgICBpZiAoREJHX0NJUEhFUikKKyAgICAgICAgbG9nX2RlYnVnICgiQmFkIGNoZWNrOiAnRycgY2Fubm90IGJlIFBvaW50IGF0IEluZmluaXR5IVxuIik7CisgICAgICByZXR1cm4gKDEpOworICAgIH0KKworICBwb2ludF9pbml0ICgmUSk7CisgIGN0eCA9IF9nY3J5X21waV9lY19pbml0IChzay0+RS5wLCBzay0+RS5hKTsKKyAgX2djcnlfbXBpX2VjX211bF9wb2ludCAoJlEsIHNrLT5FLm4sICZzay0+RS5HLCBjdHgpOworICBpZiAobXBpX2NtcF91aSAoUS56LCAwKSkKKyAgICB7CisgICAgICBpZiAoREJHX0NJUEhFUikKKyAgICAgICAgbG9nX2RlYnVnICgiY2hlY2tfc2VjcmV0X2tleTogRSBpcyBub3QgYSBjdXJ2ZSBvZiBvcmRlciBuXG4iKTsKKyAgICAgIHBvaW50X2ZyZWUgKCZRKTsKKyAgICAgIF9nY3J5X21waV9lY19mcmVlIChjdHgpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAvKiBwdWJrZXkgY2Fubm90IGJlIFBhSSAqLworICBpZiAoIW1waV9jbXBfdWkgKHNrLT5RLnosIDApKQorICAgIHsKKyAgICAgIGlmIChEQkdfQ0lQSEVSKQorICAgICAgICBsb2dfZGVidWcgKCJCYWQgY2hlY2s6IFEgY2FuIG5vdCBiZSBhIFBvaW50IGF0IEluZmluaXR5IVxuIik7CisgICAgICBfZ2NyeV9tcGlfZWNfZnJlZSAoY3R4KTsKKyAgICAgIHJldHVybiAoMSk7CisgICAgfQorICAvKiBwdWJrZXkgPSBbZF1HIG92ZXIgRSAqLworICBfZ2NyeV9tcGlfZWNfbXVsX3BvaW50ICgmUSwgc2stPmQsICZzay0+RS5HLCBjdHgpOworICBpZiAoKFEueCA9PSBzay0+US54KSAmJiAoUS55ID09IHNrLT5RLnkpICYmIChRLnogPT0gc2stPlEueikpCisgICAgeworICAgICAgaWYgKERCR19DSVBIRVIpCisgICAgICAgIGxvZ19kZWJ1ZworICAgICAgICAgICgiQmFkIGNoZWNrOiBUaGVyZSBpcyBOTyBjb3JyZXNwb25kZW5jZSBiZXR3ZWVuICdkJyBhbmQgJ1EnIVxuIik7CisgICAgICBfZ2NyeV9tcGlfZWNfZnJlZSAoY3R4KTsKKyAgICAgIHJldHVybiAoMSk7CisgICAgfQorICBfZ2NyeV9tcGlfZWNfZnJlZSAoY3R4KTsKKyAgcG9pbnRfZnJlZSAoJlEpOworICByZXR1cm4gMDsKK30KKworCisvKgorICogUmV0dXJuIHRoZSBzaWduYXR1cmUgc3RydWN0IChyLHMpIGZyb20gdGhlIG1lc3NhZ2UgaGFzaC4gIFRoZSBjYWxsZXIKKyAqIG11c3QgaGF2ZSBhbGxvY2F0ZWQgUiBhbmQgUy4KKyAqLworc3RhdGljIGdwZ19lcnJfY29kZV90CitzaWduIChnY3J5X21waV90IGlucHV0LCBFQ0Nfc2VjcmV0X2tleSAqc2tleSwgZ2NyeV9tcGlfdCByLCBnY3J5X21waV90IHMpCit7CisgIGdwZ19lcnJfY29kZV90IGVyciA9IDA7CisgIGdjcnlfbXBpX3QgaywgZHIsIHN1bSwga18xLCB4OworICBtcGlfcG9pbnRfdCBJOworICBtcGlfZWNfdCBjdHg7CisKKyAgayA9IE5VTEw7CisgIGRyID0gbXBpX2FsbG9jICgwKTsKKyAgc3VtID0gbXBpX2FsbG9jICgwKTsKKyAga18xID0gbXBpX2FsbG9jICgwKTsKKyAgeCA9IG1waV9hbGxvYyAoMCk7CisgIHBvaW50X2luaXQgKCZJKTsKKworICBtcGlfc2V0X3VpIChzLCAwKTsKKyAgbXBpX3NldF91aSAociwgMCk7CisKKyAgY3R4ID0gX2djcnlfbXBpX2VjX2luaXQgKHNrZXktPkUucCwgc2tleS0+RS5hKTsKKworICB3aGlsZSAoIW1waV9jbXBfdWkgKHMsIDApKSAvKiBzID09IDAgKi8KKyAgICB7CisgICAgICB3aGlsZSAoIW1waV9jbXBfdWkgKHIsIDApKSAvKiByID09IDAgKi8KKyAgICAgICAgeworICAgICAgICAgIC8qIE5vdGUsIHRoYXQgd2UgYXJlIGd1YXJhbnRlZWQgdG8gZW50ZXIgdGhpcyBsb29wIGF0IGxlYXN0CisgICAgICAgICAgICAgb25jZSBiZWNhdXNlIHIgaGFzIGJlZW4gaW50aWFsaXplZCB0byAwLiAgV2UgY2FuJ3QgdXNlIGEKKyAgICAgICAgICAgICBkb193aGlsZSBiZWNhdXNlIHdlIHdhbnQgdG8ga2VlcCB0aGUgdmFsdWUgb2YgUiBldmVuIGlmIFMKKyAgICAgICAgICAgICBoYXMgdG8gYmUgcmVjb21wdXRlZC4gICovCisgICAgICAgICAgbXBpX2ZyZWUgKGspOworICAgICAgICAgIGsgPSBnZW5fayAoc2tleS0+RS5uLCBHQ1JZX1NUUk9OR19SQU5ET00pOworICAgICAgICAgIF9nY3J5X21waV9lY19tdWxfcG9pbnQgKCZJLCBrLCAmc2tleS0+RS5HLCBjdHgpOyAKKyAgICAgICAgICBpZiAoX2djcnlfbXBpX2VjX2dldF9hZmZpbmUgKHgsIE5VTEwsICZJLCBjdHgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoREJHX0NJUEhFUikKKyAgICAgICAgICAgICAgICBsb2dfZGVidWcgKCJlY2Mgc2lnbjogRmFpbGVkIHRvIGdldCBhZmZpbmUgY29vcmRpbmF0ZXNcbiIpOworICAgICAgICAgICAgICBlcnIgPSBHUEdfRVJSX0JBRF9TSUdOQVRVUkU7CisgICAgICAgICAgICAgIGdvdG8gbGVhdmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgbXBpX21vZCAociwgeCwgc2tleS0+RS5uKTsgIC8qIHIgPSB4IG1vZCBuICovCisgICAgICAgIH0KKyAgICAgIG1waV9tdWxtIChkciwgc2tleS0+ZCwgciwgc2tleS0+RS5uKTsgLyogZHIgPSBkKnIgbW9kIG4gICovCisgICAgICBtcGlfYWRkbSAoc3VtLCBpbnB1dCwgZHIsIHNrZXktPkUubik7IC8qIHN1bSA9IGhhc2ggKyAoZCpyKSBtb2QgbiAgKi8KKyAgICAgIG1waV9pbnZtIChrXzEsIGssIHNrZXktPkUubik7ICAgICAgICAgLyoga18xID0ga14oLTEpIG1vZCBuICAqLworICAgICAgbXBpX211bG0gKHMsIGtfMSwgc3VtLCBza2V5LT5FLm4pOyAgICAvKiBzID0ga14oLTEpKihoYXNoKyhkKnIpKSBtb2QgbiAqLworICAgIH0KKworIGxlYXZlOgorICBfZ2NyeV9tcGlfZWNfZnJlZSAoY3R4KTsKKyAgcG9pbnRfZnJlZSAoJkkpOworICBtcGlfZnJlZSAoeCk7CisgIG1waV9mcmVlIChrXzEpOworICBtcGlfZnJlZSAoc3VtKTsKKyAgbXBpX2ZyZWUgKGRyKTsKKyAgbXBpX2ZyZWUgKGspOworCisgIHJldHVybiBlcnI7Cit9CisKKy8qCisgKiBDaGVjayBpZiBSIGFuZCBTIHZlcmlmaWVzIElOUFVULgorICovCitzdGF0aWMgZ3BnX2Vycl9jb2RlX3QKK3ZlcmlmeSAoZ2NyeV9tcGlfdCBpbnB1dCwgRUNDX3B1YmxpY19rZXkgKnBrZXksIGdjcnlfbXBpX3QgciwgZ2NyeV9tcGlfdCBzKQoreworICBncGdfZXJyX2NvZGVfdCBlcnIgPSAwOworICBnY3J5X21waV90IGgsIGgxLCBoMiwgeCwgeTsKKyAgbXBpX3BvaW50X3QgUSwgUTEsIFEyOworICBtcGlfZWNfdCBjdHg7CisKKyAgaWYoICEobXBpX2NtcF91aSAociwgMCkgPiAwICYmIG1waV9jbXAgKHIsIHBrZXktPkUubikgPCAwKSApCisgICAgcmV0dXJuIEdQR19FUlJfQkFEX1NJR05BVFVSRTsgLyogQXNzZXJ0aW9uCTAgPCByIDwgbiAgZmFpbGVkLiAgKi8KKyAgaWYoICEobXBpX2NtcF91aSAocywgMCkgPiAwICYmIG1waV9jbXAgKHMsIHBrZXktPkUubikgPCAwKSApCisgICAgcmV0dXJuIEdQR19FUlJfQkFEX1NJR05BVFVSRTsgLyogQXNzZXJ0aW9uCTAgPCBzIDwgbiAgZmFpbGVkLiAgKi8KKworICBoICA9IG1waV9hbGxvYyAoMCk7CisgIGgxID0gbXBpX2FsbG9jICgwKTsKKyAgaDIgPSBtcGlfYWxsb2MgKDApOworICB4ID0gbXBpX2FsbG9jICgwKTsKKyAgeSA9IG1waV9hbGxvYyAoMCk7CisgIHBvaW50X2luaXQgKCZRKTsKKyAgcG9pbnRfaW5pdCAoJlExKTsKKyAgcG9pbnRfaW5pdCAoJlEyKTsKKworICBjdHggPSBfZ2NyeV9tcGlfZWNfaW5pdCAocGtleS0+RS5wLCBwa2V5LT5FLmEpOworCisgIC8qIGggID0gc14oLTEpIChtb2QgbikgKi8KKyAgbXBpX2ludm0gKGgsIHMsIHBrZXktPkUubik7CisvKiAgIGxvZ19tcGlkdW1wICgiICAgaCIsIGgpOyAqLworICAvKiBoMSA9IGhhc2ggKiBzXigtMSkgKG1vZCBuKSAqLworICBtcGlfbXVsbSAoaDEsIGlucHV0LCBoLCBwa2V5LT5FLm4pOworLyogICBsb2dfbXBpZHVtcCAoIiAgaDEiLCBoMSk7ICovCisgIC8qIFExID0gWyBoYXNoICogc14oLTEpIF1HICAqLworICBfZ2NyeV9tcGlfZWNfbXVsX3BvaW50ICgmUTEsIGgxLCAmcGtleS0+RS5HLCBjdHgpOworLyogICBsb2dfbXBpZHVtcCAoIlExLngiLCBRMS54KTsgKi8KKy8qICAgbG9nX21waWR1bXAgKCJRMS55IiwgUTEueSk7ICovCisvKiAgIGxvZ19tcGlkdW1wICgiUTEueiIsIFExLnopOyAqLworICAvKiBoMiA9IHIgKiBzXigtMSkgKG1vZCBuKSAqLworICBtcGlfbXVsbSAoaDIsIHIsIGgsIHBrZXktPkUubik7CisvKiAgIGxvZ19tcGlkdW1wICgiICBoMiIsIGgyKTsgKi8KKyAgLyogUTIgPSBbIHIgKiBzXigtMSkgXVEgKi8KKyAgX2djcnlfbXBpX2VjX211bF9wb2ludCAoJlEyLCBoMiwgJnBrZXktPlEsIGN0eCk7CisvKiAgIGxvZ19tcGlkdW1wICgiUTIueCIsIFEyLngpOyAqLworLyogICBsb2dfbXBpZHVtcCAoIlEyLnkiLCBRMi55KTsgKi8KKy8qICAgbG9nX21waWR1bXAgKCJRMi56IiwgUTIueik7ICovCisgIC8qIFEgID0gKFtoYXNoICogc14oLTEpXUcpICsgKFtyICogc14oLTEpXVEpICovCisgIF9nY3J5X21waV9lY19hZGRfcG9pbnRzICgmUSwgJlExLCAmUTIsIGN0eCk7CisvKiAgIGxvZ19tcGlkdW1wICgiIFEueCIsIFEueCk7ICovCisvKiAgIGxvZ19tcGlkdW1wICgiIFEueSIsIFEueSk7ICovCisvKiAgIGxvZ19tcGlkdW1wICgiIFEueiIsIFEueik7ICovCisKKyAgaWYgKCFtcGlfY21wX3VpIChRLnosIDApKQorICAgIHsKKyAgICAgIGlmIChEQkdfQ0lQSEVSKQorICAgICAgICAgIGxvZ19kZWJ1ZyAoImVjYyB2ZXJpZnk6IFJlamVjdGVkXG4iKTsKKyAgICAgIGVyciA9IEdQR19FUlJfQkFEX1NJR05BVFVSRTsKKyAgICAgIGdvdG8gbGVhdmU7CisgICAgfQorICBpZiAoX2djcnlfbXBpX2VjX2dldF9hZmZpbmUgKHgsIHksICZRLCBjdHgpKQorICAgIHsKKyAgICAgIGlmIChEQkdfQ0lQSEVSKQorICAgICAgICBsb2dfZGVidWcgKCJlY2MgdmVyaWZ5OiBGYWlsZWQgdG8gZ2V0IGFmZmluZSBjb29yZGluYXRlc1xuIik7CisgICAgICBlcnIgPSBHUEdfRVJSX0JBRF9TSUdOQVRVUkU7CisgICAgICBnb3RvIGxlYXZlOworICAgIH0KKyAgbXBpX21vZCAoeCwgeCwgcGtleS0+RS5uKTsgLyogeCA9IHggbW9kIEVfbiAqLworICBpZiAobXBpX2NtcCAoeCwgcikpICAgLyogeCAhPSByICovCisgICAgeworICAgICAgaWYgKERCR19DSVBIRVIpCisgICAgICAgIHsKKyAgICAgICAgICBsb2dfbXBpZHVtcCAoIiAgIHgiLCB4KTsKKyAgICAgICAgICBsb2dfbXBpZHVtcCAoIiAgIHkiLCB5KTsKKyAgICAgICAgICBsb2dfbXBpZHVtcCAoIiAgIHIiLCByKTsKKyAgICAgICAgICBsb2dfbXBpZHVtcCAoIiAgIHMiLCBzKTsKKyAgICAgICAgICBsb2dfZGVidWcgKCJlY2MgdmVyaWZ5OiBOb3QgdmVyaWZpZWRcbiIpOworICAgICAgICB9CisgICAgICBlcnIgPSBHUEdfRVJSX0JBRF9TSUdOQVRVUkU7CisgICAgICBnb3RvIGxlYXZlOworICAgIH0KKyAgaWYgKERCR19DSVBIRVIpCisgICAgbG9nX2RlYnVnICgiZWNjIHZlcmlmeTogQWNjZXB0ZWRcbiIpOworCisgbGVhdmU6CisgIF9nY3J5X21waV9lY19mcmVlIChjdHgpOworICBwb2ludF9mcmVlICgmUTIpOworICBwb2ludF9mcmVlICgmUTEpOworICBwb2ludF9mcmVlICgmUSk7CisgIG1waV9mcmVlICh5KTsKKyAgbXBpX2ZyZWUgKHgpOworICBtcGlfZnJlZSAoaDIpOworICBtcGlfZnJlZSAoaDEpOworICBtcGlfZnJlZSAoaCk7CisgIHJldHVybiBlcnI7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKiogIGludGVyZmFjZSAgKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGdjcnlfbXBpX3QKK2VjMm9zIChnY3J5X21waV90IHgsIGdjcnlfbXBpX3QgeSwgZ2NyeV9tcGlfdCBwKQoreworICBncGdfZXJyb3JfdCBlcnI7CisgIGludCBwYnl0ZXMgPSAobXBpX2dldF9uYml0cyAocCkrNykvODsKKyAgc2l6ZV90IG47CisgIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgKnB0cjsKKyAgZ2NyeV9tcGlfdCByZXN1bHQ7CisKKyAgYnVmID0gZ2NyeV94bWFsbG9jICggMSArIDIqcGJ5dGVzICk7CisgICpidWYgPSAwNDsgLyogVW5jb21wcmVzc2VkIHBvaW50LiAgKi8KKyAgcHRyID0gYnVmKzE7CisgIGVyciA9IGdjcnlfbXBpX3ByaW50IChHQ1JZTVBJX0ZNVF9VU0csIHB0ciwgcGJ5dGVzLCAmbiwgeCk7CisgIGlmIChlcnIpCisgICAgbG9nX2ZhdGFsICgibXBpX3ByaW50IGZhaWxlZDogJXNcbiIsIGdwZ19zdHJlcnJvciAoZXJyKSk7CisgIGlmIChuIDwgcGJ5dGVzKQorICAgIHsKKyAgICAgIG1lbW1vdmUgKHB0cisocGJ5dGVzLW4pLCBwdHIsIG4pOworICAgICAgbWVtc2V0IChwdHIsIDAsIChwYnl0ZXMtbikpOworICAgIH0KKyAgcHRyICs9IHBieXRlczsKKyAgZXJyID0gZ2NyeV9tcGlfcHJpbnQgKEdDUllNUElfRk1UX1VTRywgcHRyLCBwYnl0ZXMsICZuLCB5KTsKKyAgaWYgKGVycikKKyAgICBsb2dfZmF0YWwgKCJtcGlfcHJpbnQgZmFpbGVkOiAlc1xuIiwgZ3BnX3N0cmVycm9yIChlcnIpKTsKKyAgaWYgKG4gPCBwYnl0ZXMpCisgICAgeworICAgICAgbWVtbW92ZSAocHRyKyhwYnl0ZXMtbiksIHB0ciwgbik7CisgICAgICBtZW1zZXQgKHB0ciwgMCwgKHBieXRlcy1uKSk7CisgICAgfQorICAKKyAgZXJyID0gZ2NyeV9tcGlfc2NhbiAoJnJlc3VsdCwgR0NSWU1QSV9GTVRfVVNHLCBidWYsIDErMipwYnl0ZXMsIE5VTEwpOworICBpZiAoZXJyKQorICAgIGxvZ19mYXRhbCAoIm1waV9zY2FuIGZhaWxlZDogJXNcbiIsIGdwZ19zdHJlcnJvciAoZXJyKSk7CisgIGdjcnlfZnJlZSAoYnVmKTsKKworICBtcGlfZnJlZSAoeCk7CisgIG1waV9mcmVlICh5KTsKKworICByZXR1cm4gcmVzdWx0OworfQorCisvKiBSRVNVTFQgbXVzdCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgYW5kIGlzIHNldCBvbiBzdWNjZXNzIHRvIHRoZQorICAgcG9pbnQgZ2l2ZW4gYnkgVkFMVUUuICAqLworc3RhdGljIGdjcnlfZXJyb3JfdAorb3MyZWMgKG1waV9wb2ludF90ICpyZXN1bHQsIGdjcnlfbXBpX3QgdmFsdWUpCit7CisgIGdjcnlfZXJyb3JfdCBlcnI7CisgIHNpemVfdCBuOworICB1bnNpZ25lZCBjaGFyICpidWY7CisgIGdjcnlfbXBpX3QgeCwgeTsKKworICBuID0gKG1waV9nZXRfbmJpdHMgKHZhbHVlKSs3KS84OworICBidWYgPSBnY3J5X3htYWxsb2MgKG4pOworICBlcnIgPSBnY3J5X21waV9wcmludCAoR0NSWU1QSV9GTVRfVVNHLCBidWYsIG4sICZuLCB2YWx1ZSk7CisgIGlmIChlcnIpCisgICAgeworICAgICAgZ2NyeV9mcmVlIChidWYpOworICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgIGlmIChuIDwgMSkgCisgICAgeworICAgICAgZ2NyeV9mcmVlIChidWYpOworICAgICAgcmV0dXJuIEdQR19FUlJfSU5WX09CSjsKKyAgICB9CisgIGlmICgqYnVmICE9IDQpCisgICAgeworICAgICAgZ2NyeV9mcmVlIChidWYpOworICAgICAgcmV0dXJuIEdQR19FUlJfTk9UX0lNUExFTUVOVEVEOyAvKiBObyBzdXBwb3J0IGZvciBwb2ludCBjb21wcmVzc2lvbi4gICovCisgICAgfQorICBpZiAoICgobi0xKSUyKSApIAorICAgIHsKKyAgICAgIGdjcnlfZnJlZSAoYnVmKTsKKyAgICAgIHJldHVybiBHUEdfRVJSX0lOVl9PQko7CisgICAgfQorICBuID0gKG4tMSkvMjsKKyAgZXJyID0gZ2NyeV9tcGlfc2NhbiAoJngsIEdDUllNUElfRk1UX1VTRywgYnVmKzEsIG4sIE5VTEwpOworICBpZiAoZXJyKQorICAgIHsKKyAgICAgIGdjcnlfZnJlZSAoYnVmKTsKKyAgICAgIHJldHVybiBlcnI7CisgICAgfQorICBlcnIgPSBnY3J5X21waV9zY2FuICgmeSwgR0NSWU1QSV9GTVRfVVNHLCBidWYrMStuLCBuLCBOVUxMKTsKKyAgZ2NyeV9mcmVlIChidWYpOworICBpZiAoZXJyKQorICAgIHsKKyAgICAgIG1waV9mcmVlICh4KTsKKyAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgIG1waV9zZXQgKHJlc3VsdC0+eCwgeCk7CisgIG1waV9zZXQgKHJlc3VsdC0+eSwgeSk7CisgIG1waV9zZXRfdWkgKHJlc3VsdC0+eiwgMSk7CisKKyAgbXBpX2ZyZWUgKHgpOworICBtcGlfZnJlZSAoeSk7CisgIAorICByZXR1cm4gMDsKK30KKworCisvKiBFeHRlbmRlZCB2ZXJzaW9uIG9mIGVjY19nZW5lcmF0ZS4gICovCitzdGF0aWMgZ2NyeV9lcnJfY29kZV90CitlY2NfZ2VuZXJhdGVfZXh0IChpbnQgYWxnbywgdW5zaWduZWQgaW50IG5iaXRzLCB1bnNpZ25lZCBsb25nIGV2YWx1ZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGdjcnlfc2V4cF90IGdlbnBhcm1zLAorICAgICAgICAgICAgICAgICAgZ2NyeV9tcGlfdCAqc2tleSwgZ2NyeV9tcGlfdCAqKnJldGZhY3RvcnMsCisgICAgICAgICAgICAgICAgICBnY3J5X3NleHBfdCAqcl9leHRyYWluZm8pCit7CisgIGdwZ19lcnJfY29kZV90IGVjOworICBFQ0Nfc2VjcmV0X2tleSBzazsKKyAgZ2NyeV9tcGlfdCBnX3gsIGdfeSwgcV94LCBxX3k7CisgIGNoYXIgKmN1cnZlX25hbWUgPSBOVUxMOworICBnY3J5X3NleHBfdCBsMTsKKworICAodm9pZClhbGdvOworICAodm9pZClldmFsdWU7CisgICh2b2lkKXJfZXh0cmFpbmZvOworCisgIGlmIChnZW5wYXJtcykKKyAgICB7CisgICAgICAvKiBQYXJzZSB0aGUgb3B0aW9uYWwgImN1cnZlIiBwYXJhbWV0ZXIuICovCisgICAgICBsMSA9IGdjcnlfc2V4cF9maW5kX3Rva2VuIChnZW5wYXJtcywgImN1cnZlIiwgMCk7CisgICAgICBpZiAobDEpCisgICAgICAgIHsKKyAgICAgICAgICBjdXJ2ZV9uYW1lID0gX2djcnlfc2V4cF9udGhfc3RyaW5nIChsMSwgMSk7CisgICAgICAgICAgZ2NyeV9zZXhwX3JlbGVhc2UgKGwxKTsKKyAgICAgICAgICBpZiAoIWN1cnZlX25hbWUpCisgICAgICAgICAgICByZXR1cm4gR1BHX0VSUl9JTlZfT0JKOyAvKiBObyBjdXJ2ZSBuYW1lIG9yIHZhbHVlIHRvbyBsYXJnZS4gKi8KKyAgICAgICAgfQorICAgIH0KKworICAvKiBOQklUUyBpcyByZXF1aXJlZCBpZiBubyBjdXJ2ZSBuYW1lIGhhcyBiZWVuIGdpdmVuLiAgKi8KKyAgaWYgKCFuYml0cyAmJiAhY3VydmVfbmFtZSkKKyAgICByZXR1cm4gR1BHX0VSUl9OT19PQko7IC8qIE5vIE5CSVRTIHBhcmFtZXRlci4gKi8KKworICBnX3ggPSBtcGlfbmV3ICgwKTsKKyAgZ195ID0gbXBpX25ldyAoMCk7CisgIHFfeCA9IG1waV9uZXcgKDApOworICBxX3kgPSBtcGlfbmV3ICgwKTsKKyAgZWMgPSBnZW5lcmF0ZV9rZXkgKCZzaywgbmJpdHMsIGN1cnZlX25hbWUsIGdfeCwgZ195LCBxX3gsIHFfeSk7CisgIGdjcnlfZnJlZSAoY3VydmVfbmFtZSk7CisgIGlmIChlYykKKyAgICByZXR1cm4gZWM7CisKKyAgc2tleVswXSA9IHNrLkUucDsKKyAgc2tleVsxXSA9IHNrLkUuYTsKKyAgc2tleVsyXSA9IHNrLkUuYjsKKyAgLyogVGhlIGZ1bmN0aW9uIGVjMm9zIHJlbGVhc2VzIGdfeCBhbmQgZ195LiAgKi8KKyAgc2tleVszXSA9IGVjMm9zIChnX3gsIGdfeSwgc2suRS5wKTsKKyAgc2tleVs0XSA9IHNrLkUubjsKKyAgLyogVGhlIGZ1bmN0aW9uIGVjMm9zIHJlbGVhc2VzIGdfeCBhbmQgZ195LiAgKi8KKyAgc2tleVs1XSA9IGVjMm9zIChxX3gsIHFfeSwgc2suRS5wKTsKKyAgc2tleVs2XSA9IHNrLmQ7CisKKyAgcG9pbnRfZnJlZSAoJnNrLkUuRyk7CisgIHBvaW50X2ZyZWUgKCZzay5RKTsKKworICAvKiBNYWtlIGFuIGVtcHR5IGxpc3Qgb2YgZmFjdG9ycy4gICovCisgICpyZXRmYWN0b3JzID0gZ2NyeV9jYWxsb2MgKCAxLCBzaXplb2YgKipyZXRmYWN0b3JzICk7CisgIGlmICghKnJldGZhY3RvcnMpCisgICAgcmV0dXJuIGdwZ19lcnJfY29kZV9mcm9tX3N5c2Vycm9yICgpOworCisgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBnY3J5X2Vycl9jb2RlX3QKK2VjY19nZW5lcmF0ZSAoaW50IGFsZ28sIHVuc2lnbmVkIGludCBuYml0cywgdW5zaWduZWQgbG9uZyBldmFsdWUsCisgICAgICAgICAgICAgIGdjcnlfbXBpX3QgKnNrZXksIGdjcnlfbXBpX3QgKipyZXRmYWN0b3JzKQoreworICAodm9pZClldmFsdWU7CisgIHJldHVybiBlY2NfZ2VuZXJhdGVfZXh0IChhbGdvLCBuYml0cywgMCwgTlVMTCwgc2tleSwgcmV0ZmFjdG9ycywgTlVMTCk7Cit9CisKKworLyogUmV0dXJuIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBjdXJ2ZSBOQU1FLiAgKi8KK3N0YXRpYyBnY3J5X2Vycl9jb2RlX3QKK2VjY19nZXRfcGFyYW0gKGNvbnN0IGNoYXIgKm5hbWUsIGdjcnlfbXBpX3QgKnBrZXkpCit7CisgIGdwZ19lcnJfY29kZV90IGVycjsKKyAgdW5zaWduZWQgaW50IG5iaXRzOworICBlbGxpcHRpY19jdXJ2ZV90IEU7CisgIG1waV9lY190IGN0eDsKKyAgZ2NyeV9tcGlfdCBnX3gsIGdfeTsKKyAgCisgIGVyciA9IGdlbmVyYXRlX2N1cnZlICgwLCBuYW1lLCAmRSwgJm5iaXRzKTsKKyAgaWYgKGVycikKKyAgICByZXR1cm4gZXJyOworCisgIGdfeCA9IG1waV9uZXcgKDApOworICBnX3kgPSBtcGlfbmV3ICgwKTsKKyAgY3R4ID0gX2djcnlfbXBpX2VjX2luaXQgKEUucCwgRS5hKTsKKyAgaWYgKF9nY3J5X21waV9lY19nZXRfYWZmaW5lIChnX3gsIGdfeSwgJkUuRywgY3R4KSkKKyAgICBsb2dfZmF0YWwgKCJlY2MgZ2V0IHBhcmFtOiBGYWlsZWQgdG8gZ2V0IGFmZmluZSBjb29yZGluYXRlc1xuIik7CisgIF9nY3J5X21waV9lY19mcmVlIChjdHgpOworICBwb2ludF9mcmVlICgmRS5HKTsKKworICBwa2V5WzBdID0gRS5wOworICBwa2V5WzFdID0gRS5hOworICBwa2V5WzJdID0gRS5iOworICBwa2V5WzNdID0gZWMyb3MgKGdfeCwgZ195LCBFLnApOworICBwa2V5WzRdID0gRS5uOworICBwa2V5WzVdID0gTlVMTDsKKworICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgZ2NyeV9lcnJfY29kZV90CitlY2NfY2hlY2tfc2VjcmV0X2tleSAoaW50IGFsZ28sIGdjcnlfbXBpX3QgKnNrZXkpCit7CisgIGdwZ19lcnJfY29kZV90IGVycjsKKyAgRUNDX3NlY3JldF9rZXkgc2s7CisKKyAgKHZvaWQpYWxnbzsKKworICBpZiAoIXNrZXlbMF0gfHwgIXNrZXlbMV0gfHwgIXNrZXlbMl0gfHwgIXNrZXlbM10gfHwgIXNrZXlbNF0gfHwgIXNrZXlbNV0KKyAgICAgIHx8ICFza2V5WzZdIHx8ICFza2V5WzddIHx8ICFza2V5WzhdIHx8ICFza2V5WzldIHx8ICFza2V5WzEwXSkKKyAgICByZXR1cm4gR1BHX0VSUl9CQURfTVBJOworCisgIHNrLkUucCA9IHNrZXlbMF07CisgIHNrLkUuYSA9IHNrZXlbMV07CisgIHNrLkUuYiA9IHNrZXlbMl07CisgIHBvaW50X2luaXQgKCZzay5FLkcpOworICBlcnIgPSBvczJlYyAoJnNrLkUuRywgc2tleVszXSk7CisgIGlmIChlcnIpCisgICAgeworICAgICAgcG9pbnRfZnJlZSAoJnNrLkUuRyk7CisgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgc2suRS5uID0gc2tleVs0XTsKKyAgcG9pbnRfaW5pdCAoJnNrLlEpOworICBlcnIgPSBvczJlYyAoJnNrLlEsIHNrZXlbNV0pOworICBpZiAoZXJyKQorICAgIHsKKyAgICAgIHBvaW50X2ZyZWUgKCZzay5FLkcpOworICAgICAgcG9pbnRfZnJlZSAoJnNrLlEpOworICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgc2suZCA9IHNrZXlbNl07CisKKyAgaWYgKGNoZWNrX3NlY3JldF9rZXkgKCZzaykpCisgICAgeworICAgICAgcG9pbnRfZnJlZSAoJnNrLkUuRyk7CisgICAgICBwb2ludF9mcmVlICgmc2suUSk7CisgICAgICByZXR1cm4gR1BHX0VSUl9CQURfU0VDS0VZOworICAgIH0KKyAgcG9pbnRfZnJlZSAoJnNrLkUuRyk7CisgIHBvaW50X2ZyZWUgKCZzay5RKTsKKyAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGdjcnlfZXJyX2NvZGVfdAorZWNjX3NpZ24gKGludCBhbGdvLCBnY3J5X21waV90ICpyZXNhcnIsIGdjcnlfbXBpX3QgZGF0YSwgZ2NyeV9tcGlfdCAqc2tleSkKK3sKKyAgZ3BnX2Vycl9jb2RlX3QgZXJyOworICBFQ0Nfc2VjcmV0X2tleSBzazsKKworICAodm9pZClhbGdvOworCisgIGlmICghZGF0YSB8fCAhc2tleVswXSB8fCAhc2tleVsxXSB8fCAhc2tleVsyXSB8fCAhc2tleVszXSB8fCAhc2tleVs0XQorICAgICAgfHwgIXNrZXlbNV0gfHwgIXNrZXlbNl0gKQorICAgIHJldHVybiBHUEdfRVJSX0JBRF9NUEk7CisKKyAgc2suRS5wID0gc2tleVswXTsKKyAgc2suRS5hID0gc2tleVsxXTsKKyAgc2suRS5iID0gc2tleVsyXTsKKyAgcG9pbnRfaW5pdCAoJnNrLkUuRyk7CisgIGVyciA9IG9zMmVjICgmc2suRS5HLCBza2V5WzNdKTsKKyAgaWYgKGVycikKKyAgICB7CisgICAgICBwb2ludF9mcmVlICgmc2suRS5HKTsKKyAgICAgIHJldHVybiBlcnI7CisgICAgfQorICBzay5FLm4gPSBza2V5WzRdOworICBwb2ludF9pbml0ICgmc2suUSk7CisgIGVyciA9IG9zMmVjICgmc2suUSwgc2tleVs1XSk7CisgIGlmIChlcnIpCisgICAgeworICAgICAgcG9pbnRfZnJlZSAoJnNrLkUuRyk7CisgICAgICBwb2ludF9mcmVlICgmc2suUSk7CisgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgc2suZCA9IHNrZXlbNl07CisKKyAgcmVzYXJyWzBdID0gbXBpX2FsbG9jIChtcGlfZ2V0X25saW1icyAoc2suRS5wKSk7CisgIHJlc2FyclsxXSA9IG1waV9hbGxvYyAobXBpX2dldF9ubGltYnMgKHNrLkUucCkpOworICBlcnIgPSBzaWduIChkYXRhLCAmc2ssIHJlc2FyclswXSwgcmVzYXJyWzFdKTsKKyAgaWYgKGVycikKKyAgICB7CisgICAgICBtcGlfZnJlZSAocmVzYXJyWzBdKTsKKyAgICAgIG1waV9mcmVlIChyZXNhcnJbMV0pOworICAgICAgcmVzYXJyWzBdID0gTlVMTDsgLyogTWFyayBhcnJheSBhcyByZWxlYXNlZC4gICovCisgICAgfQorICBwb2ludF9mcmVlICgmc2suRS5HKTsKKyAgcG9pbnRfZnJlZSAoJnNrLlEpOworICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgZ2NyeV9lcnJfY29kZV90CitlY2NfdmVyaWZ5IChpbnQgYWxnbywgZ2NyeV9tcGlfdCBoYXNoLCBnY3J5X21waV90ICpkYXRhLCBnY3J5X21waV90ICpwa2V5LAorICAgICAgICAgICAgaW50ICgqY21wKSh2b2lkICosIGdjcnlfbXBpX3QpLCB2b2lkICpvcGFxdWV2KQoreworICBncGdfZXJyX2NvZGVfdCBlcnI7CisgIEVDQ19wdWJsaWNfa2V5IHBrOworCisgICh2b2lkKWFsZ287CisgICh2b2lkKWNtcDsKKyAgKHZvaWQpb3BhcXVldjsKKworICBpZiAoIWRhdGFbMF0gfHwgIWRhdGFbMV0gfHwgIWhhc2ggfHwgIXBrZXlbMF0gfHwgIXBrZXlbMV0gfHwgIXBrZXlbMl0KKyAgICAgIHx8ICFwa2V5WzNdIHx8ICFwa2V5WzRdIHx8ICFwa2V5WzVdICkKKyAgICByZXR1cm4gR1BHX0VSUl9CQURfTVBJOworCisgIHBrLkUucCA9IHBrZXlbMF07CisgIHBrLkUuYSA9IHBrZXlbMV07CisgIHBrLkUuYiA9IHBrZXlbMl07CisgIHBvaW50X2luaXQgKCZway5FLkcpOworICBlcnIgPSBvczJlYyAoJnBrLkUuRywgcGtleVszXSk7CisgIGlmIChlcnIpCisgICAgeworICAgICAgcG9pbnRfZnJlZSAoJnBrLkUuRyk7CisgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgcGsuRS5uID0gcGtleVs0XTsKKyAgcG9pbnRfaW5pdCAoJnBrLlEpOworICBlcnIgPSBvczJlYyAoJnBrLlEsIHBrZXlbNV0pOworICBpZiAoZXJyKQorICAgIHsKKyAgICAgIHBvaW50X2ZyZWUgKCZway5FLkcpOworICAgICAgcG9pbnRfZnJlZSAoJnBrLlEpOworICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgZXJyID0gdmVyaWZ5IChoYXNoLCAmcGssIGRhdGFbMF0sIGRhdGFbMV0pOworCisgIHBvaW50X2ZyZWUgKCZway5FLkcpOworICBwb2ludF9mcmVlICgmcGsuUSk7CisgIHJldHVybiBlcnI7Cit9CisKKworCitzdGF0aWMgdW5zaWduZWQgaW50CitlY2NfZ2V0X25iaXRzIChpbnQgYWxnbywgZ2NyeV9tcGlfdCAqcGtleSkKK3sKKyAgKHZvaWQpYWxnbzsKKworICByZXR1cm4gbXBpX2dldF9uYml0cyAocGtleVswXSk7Cit9CisKKworCisvKiBTZWUgcnNhLmMgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhpcyBmdW5jdGlvbi4gICovCitzdGF0aWMgZ3BnX2Vycl9jb2RlX3QKK2NvbXB1dGVfa2V5Z3JpcCAoZ2NyeV9tZF9oZF90IG1kLCBnY3J5X3NleHBfdCBrZXlwYXJhbSkKK3sKKyAgc3RhdGljIGNvbnN0IGNoYXIgbmFtZXNbXSA9ICJwYWJnbnEiOworICBncGdfZXJyX2NvZGVfdCBlYyA9IDA7CisgIGdjcnlfc2V4cF90IGwxOworICBnY3J5X21waV90IHZhbHVlc1s2XTsKKyAgaW50IGlkeDsKKworICAvKiBDbGVhciB0aGUgdmFsdWVzIGZvciBlYXNpZXIgZXJyb3IgY2xlYW51cC4gICovCisgIGZvciAoaWR4PTA7IGlkeCA8IDY7IGlkeCsrKQorICAgIHZhbHVlc1tpZHhdID0gTlVMTDsKKyAgICAKKyAgLyogRmlsbCB2YWx1ZXMgd2l0aCBhbGwgYXZhaWxhYmxlIHBhcmFtZXRlcnMuICAqLworICBmb3IgKGlkeD0wOyBpZHggPCA2OyBpZHgrKykKKyAgICB7CisgICAgICBsMSA9IGdjcnlfc2V4cF9maW5kX3Rva2VuIChrZXlwYXJhbSwgbmFtZXMraWR4LCAxKTsKKyAgICAgIGlmIChsMSkKKyAgICAgICAgeworICAgICAgICAgIHZhbHVlc1tpZHhdID0gZ2NyeV9zZXhwX250aF9tcGkgKGwxLCAxLCBHQ1JZTVBJX0ZNVF9VU0cpOworCSAgZ2NyeV9zZXhwX3JlbGVhc2UgKGwxKTsKKwkgIGlmICghdmFsdWVzW2lkeF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGVjID0gR1BHX0VSUl9JTlZfT0JKOworICAgICAgICAgICAgICBnb3RvIGxlYXZlOworICAgICAgICAgICAgfQorCX0KKyAgICB9CisgIAorICAvKiBDaGVjayB3aGV0aGVyIGEgY3VydmUgcGFyYW1ldGVyIGlzIGF2YWlsYWJsZSBhbmQgdXNlIHRoYXQgdG8gZmlsbAorICAgICBpbiBtaXNzaW5nIHZhbHVlcy4gICovCisgIGwxID0gZ2NyeV9zZXhwX2ZpbmRfdG9rZW4gKGtleXBhcmFtLCAiY3VydmUiLCA1KTsKKyAgaWYgKGwxKQorICAgIHsKKyAgICAgIGNoYXIgKmN1cnZlOworICAgICAgZ2NyeV9tcGlfdCB0bXB2YWx1ZXNbNl07CisgICAgICAKKyAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgNjsgaWR4KyspCisgICAgICAgIHRtcHZhbHVlc1tpZHhdID0gTlVMTDsKKworICAgICAgY3VydmUgPSBfZ2NyeV9zZXhwX250aF9zdHJpbmcgKGwxLCAxKTsKKyAgICAgIGlmICghY3VydmUpCisgICAgICAgIHsKKyAgICAgICAgICBlYyA9IEdQR19FUlJfSU5WX09CSjsgLyogTmFtZSBtaXNzaW5nIG9yIG91dCBvZiBjb3JlLiAqLworICAgICAgICAgIGdvdG8gbGVhdmU7CisgICAgICAgIH0KKyAgICAgIGVjID0gZWNjX2dldF9wYXJhbSAoY3VydmUsIHRtcHZhbHVlcyk7CisgICAgICBnY3J5X2ZyZWUgKGN1cnZlKTsKKyAgICAgIGlmIChlYykKKyAgICAgICAgZ290byBsZWF2ZTsKKworICAgICAgZm9yIChpZHggPSAwOyBpZHggPCA2OyBpZHgrKykKKyAgICAgICAgeworICAgICAgICAgIGlmICghdmFsdWVzW2lkeF0pCisgICAgICAgICAgICB2YWx1ZXNbaWR4XSA9IHRtcHZhbHVlc1tpZHhdOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1waV9mcmVlICh0bXB2YWx1ZXNbaWR4XSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgLyogQ2hlY2sgdGhhdCBhbGwgcGFyYW1ldGVycyBhcmUga25vd24gYW5kIG5vcm1hbGl6ZSBhbGwgTVBJcyAodGhhdAorICAgICBzaG91bGQgbm90IGJlIHJlcXVpcmVkIGJ1dCB3ZSB1c2UgYW4gaW50ZXJuYWwgZnVjbnRpb24gbGF0ZXIgYW5kCisgICAgIHRodXMgd2UgYmV0dGVyIG1ha2UgMTAwJSBzdXJlIHRoYXQgdGhleSBhcmUgbm9ybWFsaXplZCkuICovCisgIGZvciAoaWR4ID0gMDsgaWR4IDwgNjsgaWR4KyspCisgICAgaWYgKCF2YWx1ZXNbaWR4XSkKKyAgICAgIHsKKyAgICAgICAgZWMgPSBHUEdfRVJSX05PX09CSjsKKyAgICAgICAgZ290byBsZWF2ZTsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICBfZ2NyeV9tcGlfbm9ybWFsaXplICh2YWx1ZXNbaWR4XSk7CisgICAgICAKKyAgLyogSGFzaCB0aGVtIGFsbC4gICovCisgIGZvciAoaWR4ID0gMDsgaWR4IDwgNjsgaWR4KyspCisgICAgeworICAgICAgY2hhciBidWZbMzBdOworICAgICAgdW5zaWduZWQgY2hhciAqcmF3bXBpOworICAgICAgdW5zaWduZWQgaW50IHJhd21waWxlbjsKKyAgICAgIAorICAgICAgcmF3bXBpID0gX2djcnlfbXBpX2dldF9idWZmZXIgKHZhbHVlc1tpZHhdLCAmcmF3bXBpbGVuLCBOVUxMKTsKKyAgICAgIGlmICghcmF3bXBpKQorICAgICAgICB7CisgICAgICAgICAgZWMgPSBncGdfZXJyX2NvZGVfZnJvbV9zeXNlcnJvciAoKTsKKyAgICAgICAgICBnb3RvIGxlYXZlOworICAgICAgICB9CisgICAgICBzbnByaW50ZiAoYnVmLCBzaXplb2YgYnVmLCAiKDE6JWMldToiLCBuYW1lc1tpZHhdLCByYXdtcGlsZW4pOworICAgICAgZ2NyeV9tZF93cml0ZSAobWQsIGJ1Ziwgc3RybGVuIChidWYpKTsKKyAgICAgIGdjcnlfbWRfd3JpdGUgKG1kLCByYXdtcGksIHJhd21waWxlbik7CisgICAgICBnY3J5X21kX3dyaXRlIChtZCwgIikiLCAxKTsKKyAgICAgIGdjcnlfZnJlZSAocmF3bXBpKTsKKyAgICB9CisKKyBsZWF2ZToKKyAgZm9yIChpZHggPSAwOyBpZHggPCA2OyBpZHgrKykKKyAgICBfZ2NyeV9tcGlfcmVsZWFzZSAodmFsdWVzW2lkeF0pOworICAKKyAgcmV0dXJuIGVjOworfQorCisKKworCisMCisvKiAKKyAgICAgU2VsZi10ZXN0IHNlY3Rpb24uCisgKi8KKworCitzdGF0aWMgZ3BnX2Vycl9jb2RlX3QKK3NlbGZ0ZXN0c19lY2RzYSAoc2VsZnRlc3RfcmVwb3J0X2Z1bmNfdCByZXBvcnQpCit7CisgIGNvbnN0IGNoYXIgKndoYXQ7CisgIGNvbnN0IGNoYXIgKmVycnR4dDsKKyAgCisgIHdoYXQgPSAibG93LWxldmVsIjsKKyAgZXJydHh0ID0gTlVMTDsgLypzZWxmdGVzdCAoKTsqLworICBpZiAoZXJydHh0KQorICAgIGdvdG8gZmFpbGVkOworCisgIC8qIEZJWE1FOiAgbmVlZCBtb3JlIHRlc3RzLiAgKi8KKworICByZXR1cm4gMDsgLyogU3VjY2VlZGVkLiAqLworCisgZmFpbGVkOgorICBpZiAocmVwb3J0KQorICAgIHJlcG9ydCAoInB1YmtleSIsIEdDUllfUEtfRUNEU0EsIHdoYXQsIGVycnR4dCk7CisgIHJldHVybiBHUEdfRVJSX1NFTEZURVNUX0ZBSUxFRDsKK30KKworCisvKiBSdW4gYSBmdWxsIHNlbGYtdGVzdCBmb3IgQUxHTyBhbmQgcmV0dXJuIDAgb24gc3VjY2Vzcy4gICovCitzdGF0aWMgZ3BnX2Vycl9jb2RlX3QKK3J1bl9zZWxmdGVzdHMgKGludCBhbGdvLCBpbnQgZXh0ZW5kZWQsIHNlbGZ0ZXN0X3JlcG9ydF9mdW5jX3QgcmVwb3J0KQoreworICBncGdfZXJyX2NvZGVfdCBlYzsKKworICAodm9pZClleHRlbmRlZDsKKworICBzd2l0Y2ggKGFsZ28pCisgICAgeworICAgIGNhc2UgR0NSWV9QS19FQ0RTQToKKyAgICAgIGVjID0gc2VsZnRlc3RzX2VjZHNhIChyZXBvcnQpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGVjID0gR1BHX0VSUl9QVUJLRVlfQUxHTzsKKyAgICAgIGJyZWFrOworICAgICAgICAKKyAgICB9CisgIHJldHVybiBlYzsKK30KKworCisKKwwKK3N0YXRpYyBjb25zdCBjaGFyICplY2RzYV9uYW1lc1tdID0KKyAgeworICAgICJlY2RzYSIsCisgICAgImVjYyIsCisgICAgTlVMTCwKKyAgfTsKKworZ2NyeV9wa19zcGVjX3QgX2djcnlfcHVia2V5X3NwZWNfZWNkc2EgPQorICB7CisgICAgIkVDRFNBIiwgZWNkc2FfbmFtZXMsCisgICAgInBhYmducSIsICJwYWJnbnFkIiwgIiIsICJycyIsICJwYWJnbnEiLAorICAgIEdDUllfUEtfVVNBR0VfU0lHTiwKKyAgICBlY2NfZ2VuZXJhdGUsCisgICAgZWNjX2NoZWNrX3NlY3JldF9rZXksCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIGVjY19zaWduLAorICAgIGVjY192ZXJpZnksCisgICAgZWNjX2dldF9uYml0cworICB9OworCitwa19leHRyYV9zcGVjX3QgX2djcnlfcHVia2V5X2V4dHJhc3BlY19lY2RzYSA9IAorICB7CisgICAgcnVuX3NlbGZ0ZXN0cywKKyAgICBlY2NfZ2VuZXJhdGVfZXh0LAorICAgIGNvbXB1dGVfa2V5Z3JpcCwKKyAgICBlY2NfZ2V0X3BhcmFtCisgIH07CisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9jaXBoZXIvZWxnYW1hbC5jIGIvbGliZ2NyeXB0LTEuNC42L2NpcGhlci9lbGdhbWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIwYzA3YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9jaXBoZXIvZWxnYW1hbC5jCkBAIC0wLDAgKzEsODQ2IEBACisvKiBFbGdhbWFsLmMgIC0gIEVsZ2FtYWwgUHVibGljIEtleSBlbmNyeXB0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgsIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsCisgKiAgICAgICAgICAgICAgIDIwMDggIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKiBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgYWxnb3JpdGhtLCBzZWU6CisgKiAgIEJydWNlIFNjaG5laWVyOiBBcHBsaWVkIENyeXB0b2dyYXBoeS4gSm9obiBXaWxleSAmIFNvbnMsIDE5OTYuCisgKiAgIElTQk4gMC00NzEtMTE3MDktOS4gUGFnZXMgNDc2IGZmLgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImcxMGxpYi5oIgorI2luY2x1ZGUgIm1waS5oIgorI2luY2x1ZGUgImNpcGhlci5oIgorCit0eXBlZGVmIHN0cnVjdAoreworICBnY3J5X21waV90IHA7CSAgICAvKiBwcmltZSAqLworICBnY3J5X21waV90IGc7CSAgICAvKiBncm91cCBnZW5lcmF0b3IgKi8KKyAgZ2NyeV9tcGlfdCB5OwkgICAgLyogZ154IG1vZCBwICovCit9IEVMR19wdWJsaWNfa2V5OworCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGdjcnlfbXBpX3QgcDsJICAgIC8qIHByaW1lICovCisgIGdjcnlfbXBpX3QgZzsJICAgIC8qIGdyb3VwIGdlbmVyYXRvciAqLworICBnY3J5X21waV90IHk7CSAgICAvKiBnXnggbW9kIHAgKi8KKyAgZ2NyeV9tcGlfdCB4OwkgICAgLyogc2VjcmV0IGV4cG9uZW50ICovCit9IEVMR19zZWNyZXRfa2V5OworCisKK3N0YXRpYyBpbnQgdGVzdF9rZXlzIChFTEdfc2VjcmV0X2tleSAqc2ssIHVuc2lnbmVkIGludCBuYml0cywgaW50IG5vZGllKTsKK3N0YXRpYyBnY3J5X21waV90IGdlbl9rIChnY3J5X21waV90IHAsIGludCBzbWFsbF9rKTsKK3N0YXRpYyB2b2lkIGdlbmVyYXRlIChFTEdfc2VjcmV0X2tleSAqc2ssIHVuc2lnbmVkIG5iaXRzLCBnY3J5X21waV90ICoqZmFjdG9ycyk7CitzdGF0aWMgaW50ICBjaGVja19zZWNyZXRfa2V5IChFTEdfc2VjcmV0X2tleSAqc2spOworc3RhdGljIHZvaWQgZG9fZW5jcnlwdCAoZ2NyeV9tcGlfdCBhLCBnY3J5X21waV90IGIsIGdjcnlfbXBpX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICBFTEdfcHVibGljX2tleSAqcGtleSk7CitzdGF0aWMgdm9pZCBkZWNyeXB0IChnY3J5X21waV90IG91dHB1dCwgZ2NyeV9tcGlfdCBhLCBnY3J5X21waV90IGIsCisgICAgICAgICAgICAgICAgICAgICBFTEdfc2VjcmV0X2tleSAqc2tleSk7CitzdGF0aWMgdm9pZCBzaWduIChnY3J5X21waV90IGEsIGdjcnlfbXBpX3QgYiwgZ2NyeV9tcGlfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgIEVMR19zZWNyZXRfa2V5ICpza2V5KTsKK3N0YXRpYyBpbnQgIHZlcmlmeSAoZ2NyeV9tcGlfdCBhLCBnY3J5X21waV90IGIsIGdjcnlfbXBpX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgIEVMR19wdWJsaWNfa2V5ICpwa2V5KTsKKworCitzdGF0aWMgdm9pZCAoKnByb2dyZXNzX2NiKSAodm9pZCAqLCBjb25zdCBjaGFyICosIGludCwgaW50LCBpbnQpOworc3RhdGljIHZvaWQgKnByb2dyZXNzX2NiX2RhdGE7CisKK3ZvaWQKK19nY3J5X3JlZ2lzdGVyX3BrX2VsZ19wcm9ncmVzcyAodm9pZCAoKmNiKSAodm9pZCAqLCBjb25zdCBjaGFyICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCwgaW50LCBpbnQpLAorCQkJCXZvaWQgKmNiX2RhdGEpCit7CisgIHByb2dyZXNzX2NiID0gY2I7CisgIHByb2dyZXNzX2NiX2RhdGEgPSBjYl9kYXRhOworfQorCisKK3N0YXRpYyB2b2lkCitwcm9ncmVzcyAoaW50IGMpCit7CisgIGlmIChwcm9ncmVzc19jYikKKyAgICBwcm9ncmVzc19jYiAocHJvZ3Jlc3NfY2JfZGF0YSwgInBrX2VsZyIsIGMsIDAsIDApOworfQorCisKKy8qKioqKioqKioqKioqKioqCisgKiBNaWNoYWVsIFdpZW5lcidzIHRhYmxlIG9uIHN1Ymdyb3VwIHNpemVzIHRvIG1hdGNoIGZpZWxkIHNpemVzLgorICogKGZsb2F0aW5nIGFyb3VuZCBzb21ld2hlcmUsIHByb2JhYmx5IGJhc2VkIG9uIHRoZSBwYXBlciBmcm9tCisgKiBFdXJvY3J5cHQgOTYsIHBhZ2UgMzMyKQorICovCitzdGF0aWMgdW5zaWduZWQgaW50Cit3aWVuZXJfbWFwKCB1bnNpZ25lZCBpbnQgbiApCit7CisgIHN0YXRpYyBzdHJ1Y3QgeyB1bnNpZ25lZCBpbnQgcF9uLCBxX247IH0gdFtdID0KKyAgICB7IC8qICAgcAkgIHEJIGF0dGFjayBjb3N0ICovCisgICAgICB7ICA1MTIsIDExOSB9LAkvKiA5IHggMTBeMTcgKi8KKyAgICAgIHsgIDc2OCwgMTQ1IH0sCS8qIDYgeCAxMF4yMSAqLworICAgICAgeyAxMDI0LCAxNjUgfSwJLyogNyB4IDEwXjI0ICovCisgICAgICB7IDEyODAsIDE4MyB9LAkvKiAzIHggMTBeMjcgKi8KKyAgICAgIHsgMTUzNiwgMTk4IH0sCS8qIDcgeCAxMF4yOSAqLworICAgICAgeyAxNzkyLCAyMTIgfSwJLyogOSB4IDEwXjMxICovCisgICAgICB7IDIwNDgsIDIyNSB9LAkvKiA4IHggMTBeMzMgKi8KKyAgICAgIHsgMjMwNCwgMjM3IH0sCS8qIDUgeCAxMF4zNSAqLworICAgICAgeyAyNTYwLCAyNDkgfSwJLyogMyB4IDEwXjM3ICovCisgICAgICB7IDI4MTYsIDI1OSB9LAkvKiAxIHggMTBeMzkgKi8KKyAgICAgIHsgMzA3MiwgMjY5IH0sCS8qIDMgeCAxMF40MCAqLworICAgICAgeyAzMzI4LCAyNzkgfSwJLyogOCB4IDEwXjQxICovCisgICAgICB7IDM1ODQsIDI4OCB9LAkvKiAyIHggMTBeNDMgKi8KKyAgICAgIHsgMzg0MCwgMjk2IH0sCS8qIDQgeCAxMF40NCAqLworICAgICAgeyA0MDk2LCAzMDUgfSwJLyogNyB4IDEwXjQ1ICovCisgICAgICB7IDQzNTIsIDMxMyB9LAkvKiAxIHggMTBeNDcgKi8KKyAgICAgIHsgNDYwOCwgMzIwIH0sCS8qIDIgeCAxMF40OCAqLworICAgICAgeyA0ODY0LCAzMjggfSwJLyogMiB4IDEwXjQ5ICovCisgICAgICB7IDUxMjAsIDMzNSB9LAkvKiAzIHggMTBeNTAgKi8KKyAgICAgIHsgMCwgMCB9CisgICAgfTsKKyAgaW50IGk7CisKKyAgZm9yKGk9MDsgdFtpXS5wX247IGkrKyApICAKKyAgICB7CisgICAgICBpZiggbiA8PSB0W2ldLnBfbiApCisgICAgICAgIHJldHVybiB0W2ldLnFfbjsKKyAgICB9CisgIC8qIE5vdCBpbiB0YWJsZSAtIHVzZSBhbiBhcmJpdHJhcnkgaGlnaCBudW1iZXIuICovCisgIHJldHVybiAgbiAvIDggKyAyMDA7Cit9CisKK3N0YXRpYyBpbnQKK3Rlc3Rfa2V5cyAoIEVMR19zZWNyZXRfa2V5ICpzaywgdW5zaWduZWQgaW50IG5iaXRzLCBpbnQgbm9kaWUgKQoreworICBFTEdfcHVibGljX2tleSBwazsKKyAgZ2NyeV9tcGlfdCB0ZXN0ID0gZ2NyeV9tcGlfbmV3ICggMCApOworICBnY3J5X21waV90IG91dDFfYSA9IGdjcnlfbXBpX25ldyAoIG5iaXRzICk7CisgIGdjcnlfbXBpX3Qgb3V0MV9iID0gZ2NyeV9tcGlfbmV3ICggbmJpdHMgKTsKKyAgZ2NyeV9tcGlfdCBvdXQyID0gZ2NyeV9tcGlfbmV3ICggbmJpdHMgKTsKKyAgaW50IGZhaWxlZCA9IDA7CisKKyAgcGsucCA9IHNrLT5wOworICBway5nID0gc2stPmc7CisgIHBrLnkgPSBzay0+eTsKKworICBnY3J5X21waV9yYW5kb21pemUgKCB0ZXN0LCBuYml0cywgR0NSWV9XRUFLX1JBTkRPTSApOworCisgIGRvX2VuY3J5cHQgKCBvdXQxX2EsIG91dDFfYiwgdGVzdCwgJnBrICk7CisgIGRlY3J5cHQgKCBvdXQyLCBvdXQxX2EsIG91dDFfYiwgc2sgKTsKKyAgaWYgKCBtcGlfY21wKCB0ZXN0LCBvdXQyICkgKQorICAgIGZhaWxlZCB8PSAxOworCisgIHNpZ24gKCBvdXQxX2EsIG91dDFfYiwgdGVzdCwgc2sgKTsKKyAgaWYgKCAhdmVyaWZ5KCBvdXQxX2EsIG91dDFfYiwgdGVzdCwgJnBrICkgKQorICAgIGZhaWxlZCB8PSAyOworCisgIGdjcnlfbXBpX3JlbGVhc2UgKCB0ZXN0ICk7CisgIGdjcnlfbXBpX3JlbGVhc2UgKCBvdXQxX2EgKTsKKyAgZ2NyeV9tcGlfcmVsZWFzZSAoIG91dDFfYiApOworICBnY3J5X21waV9yZWxlYXNlICggb3V0MiApOworCisgIGlmIChmYWlsZWQgJiYgIW5vZGllKQorICAgIGxvZ19mYXRhbCAoIkVsZ2FtYWwgdGVzdCBrZXkgZm9yICVzICVzIGZhaWxlZFxuIiwKKyAgICAgICAgICAgICAgIChmYWlsZWQgJiAxKT8gImVuY3J5cHQrZGVjcnlwdCI6IiIsCisgICAgICAgICAgICAgICAoZmFpbGVkICYgMik/ICJzaWduK3ZlcmlmeSI6IiIpOworICBpZiAoZmFpbGVkICYmIERCR19DSVBIRVIpIAorICAgIGxvZ19kZWJ1ZyAoIkVsZ2FtYWwgdGVzdCBrZXkgZm9yICVzICVzIGZhaWxlZFxuIiwKKyAgICAgICAgICAgICAgIChmYWlsZWQgJiAxKT8gImVuY3J5cHQrZGVjcnlwdCI6IiIsCisgICAgICAgICAgICAgICAoZmFpbGVkICYgMik/ICJzaWduK3ZlcmlmeSI6IiIpOworCisgIHJldHVybiBmYWlsZWQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioKKyAqIEdlbmVyYXRlIGEgcmFuZG9tIHNlY3JldCBleHBvbmVudCBrIGZyb20gcHJpbWUgcCwgc28gdGhhdCBrIGlzCisgKiByZWxhdGl2ZWx5IHByaW1lIHRvIHAtMS4gIFdpdGggU01BTExfSyBzZXQsIGsgd2lsbCBiZSBzZWxlY3RlZCBmb3IKKyAqIGJldHRlciBlbmNyeXB0aW9uIHBlcmZvcm1hbmNlIC0gdGhpcyBtdXN0IG5ldmVyIGJlIHVzZWQgc2lnbmluZyEKKyAqLworc3RhdGljIGdjcnlfbXBpX3QKK2dlbl9rKCBnY3J5X21waV90IHAsIGludCBzbWFsbF9rICkKK3sKKyAgZ2NyeV9tcGlfdCBrID0gbXBpX2FsbG9jX3NlY3VyZSggMCApOworICBnY3J5X21waV90IHRlbXAgPSBtcGlfYWxsb2MoIG1waV9nZXRfbmxpbWJzKHApICk7CisgIGdjcnlfbXBpX3QgcF8xID0gbXBpX2NvcHkocCk7CisgIHVuc2lnbmVkIGludCBvcmlnX25iaXRzID0gbXBpX2dldF9uYml0cyhwKTsKKyAgdW5zaWduZWQgaW50IG5iaXRzLCBuYnl0ZXM7CisgIGNoYXIgKnJuZGJ1ZiA9IE5VTEw7CisKKyAgaWYgKHNtYWxsX2spCisgICAgeworICAgICAgLyogVXNpbmcgYSBrIG11Y2ggbGVzc2VyIHRoYW4gcCBpcyBzdWZmaWNpZW50IGZvciBlbmNyeXB0aW9uIGFuZAorICAgICAgICogaXQgZ3JlYXRseSBpbXByb3ZlcyB0aGUgZW5jcnlwdGlvbiBwZXJmb3JtYW5jZS4gIFdlIHVzZQorICAgICAgICogV2llbmVyJ3MgdGFibGUgYW5kIGFkZCBhIGxhcmdlIHNhZmV0eSBtYXJnaW4uICovCisgICAgICBuYml0cyA9IHdpZW5lcl9tYXAoIG9yaWdfbmJpdHMgKSAqIDMgLyAyOworICAgICAgaWYoIG5iaXRzID49IG9yaWdfbmJpdHMgKQorICAgICAgICBCVUcoKTsKKyAgICB9CisgIGVsc2UKKyAgICBuYml0cyA9IG9yaWdfbmJpdHM7CisKKworICBuYnl0ZXMgPSAobmJpdHMrNykvODsKKyAgaWYoIERCR19DSVBIRVIgKQorICAgIGxvZ19kZWJ1ZygiY2hvb3NpbmcgYSByYW5kb20gayAiKTsKKyAgbXBpX3N1Yl91aSggcF8xLCBwLCAxKTsKKyAgZm9yKDs7KSAKKyAgICB7CisgICAgICBpZiggIXJuZGJ1ZiB8fCBuYml0cyA8IDMyICkgCisgICAgICAgIHsKKyAgICAgICAgICBnY3J5X2ZyZWUocm5kYnVmKTsKKyAgICAgICAgICBybmRidWYgPSBnY3J5X3JhbmRvbV9ieXRlc19zZWN1cmUoIG5ieXRlcywgR0NSWV9TVFJPTkdfUkFORE9NICk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeyAKKyAgICAgICAgICAvKiBDaGFuZ2Ugb25seSBzb21lIG9mIHRoZSBoaWdoZXIgYml0cy4gIFdlIGNvdWxkIGltcHJvdmUKKyAgICAgICAgICAgICB0aGlzIGJ5IGRpcmVjdGx5IHJlcXVlc3RpbmcgbW9yZSBtZW1vcnkgYXQgdGhlIGZpcnN0IGNhbGwKKyAgICAgICAgICAgICB0byBnZXRfcmFuZG9tX2J5dGVzKCkgYW5kIHVzZSB0aGlzIHRoZSBoZXJlIG1heWJlIGl0IGlzCisgICAgICAgICAgICAgZWFzaWVyIHRvIGRvIHRoaXMgZGlyZWN0bHkgaW4gcmFuZG9tLmMgQW55d2F5LCBpdCBpcworICAgICAgICAgICAgIGhpZ2hseSBpbmxpa2VseSB0aGF0IHdlIHdpbGwgZXZlciByZWFjaCB0aGlzIGNvZGUuICovCisgICAgICAgICAgY2hhciAqcHAgPSBnY3J5X3JhbmRvbV9ieXRlc19zZWN1cmUoIDQsIEdDUllfU1RST05HX1JBTkRPTSApOworICAgICAgICAgIG1lbWNweSggcm5kYnVmLCBwcCwgNCApOworICAgICAgICAgIGdjcnlfZnJlZShwcCk7CisJfQorICAgICAgX2djcnlfbXBpX3NldF9idWZmZXIoIGssIHJuZGJ1ZiwgbmJ5dGVzLCAwICk7CisgICAgICAgIAorICAgICAgZm9yKDs7KQorICAgICAgICB7CisgICAgICAgICAgaWYoICEobXBpX2NtcCggaywgcF8xICkgPCAwKSApICAvKiBjaGVjazogayA8IChwLTEpICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmKCBEQkdfQ0lQSEVSICkKKyAgICAgICAgICAgICAgICBwcm9ncmVzcygnKycpOworICAgICAgICAgICAgICBicmVhazsgLyogbm8gICovCisgICAgICAgICAgICB9CisgICAgICAgICAgaWYoICEobXBpX2NtcF91aSggaywgMCApID4gMCkgKSAgLyogY2hlY2s6IGsgPiAwICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmKCBEQkdfQ0lQSEVSICkKKyAgICAgICAgICAgICAgICBwcm9ncmVzcygnLScpOworICAgICAgICAgICAgICBicmVhazsgLyogbm8gKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoZ2NyeV9tcGlfZ2NkKCB0ZW1wLCBrLCBwXzEgKSkKKyAgICAgICAgICAgIGdvdG8gZm91bmQ7ICAvKiBva2F5LCBrIGlzIHJlbGF0aXZlIHByaW1lIHRvIChwLTEpICovCisgICAgICAgICAgbXBpX2FkZF91aSggaywgaywgMSApOworICAgICAgICAgIGlmKCBEQkdfQ0lQSEVSICkKKyAgICAgICAgICAgIHByb2dyZXNzKCcuJyk7CisJfQorICAgIH0KKyBmb3VuZDoKKyAgZ2NyeV9mcmVlKHJuZGJ1Zik7CisgIGlmKCBEQkdfQ0lQSEVSICkKKyAgICBwcm9ncmVzcygnXG4nKTsKKyAgbXBpX2ZyZWUocF8xKTsKKyAgbXBpX2ZyZWUodGVtcCk7CisKKyAgcmV0dXJuIGs7Cit9CisKKy8qKioqKioqKioqKioqKioqCisgKiBHZW5lcmF0ZSBhIGtleSBwYWlyIHdpdGggYSBrZXkgb2Ygc2l6ZSBOQklUUworICogUmV0dXJuczogMiBzdHJ1Y3R1cmVzIGZpbGxlZCB3aXRoIGFsbCBuZWVkZWQgdmFsdWVzCisgKgkgICAgYW5kIGFuIGFycmF5IHdpdGggbi0xIGZhY3RvcnMgb2YgKHAtMSkKKyAqLworc3RhdGljIHZvaWQKK2dlbmVyYXRlICggRUxHX3NlY3JldF9rZXkgKnNrLCB1bnNpZ25lZCBpbnQgbmJpdHMsIGdjcnlfbXBpX3QgKipyZXRfZmFjdG9ycyApCit7CisgIGdjcnlfbXBpX3QgcDsgICAgLyogdGhlIHByaW1lICovCisgIGdjcnlfbXBpX3QgcF9taW4xOworICBnY3J5X21waV90IGc7CisgIGdjcnlfbXBpX3QgeDsgICAgLyogdGhlIHNlY3JldCBleHBvbmVudCAqLworICBnY3J5X21waV90IHk7CisgIHVuc2lnbmVkIGludCBxYml0czsKKyAgdW5zaWduZWQgaW50IHhiaXRzOworICBieXRlICpybmRidWY7CisKKyAgcF9taW4xID0gZ2NyeV9tcGlfbmV3ICggbmJpdHMgKTsKKyAgcWJpdHMgPSB3aWVuZXJfbWFwKCBuYml0cyApOworICBpZiggcWJpdHMgJiAxICkgLyogYmV0dGVyIGhhdmUgYSBldmVuIG9uZSAqLworICAgIHFiaXRzKys7CisgIGcgPSBtcGlfYWxsb2MoMSk7CisgIHAgPSBfZ2NyeV9nZW5lcmF0ZV9lbGdfcHJpbWUoIDAsIG5iaXRzLCBxYml0cywgZywgcmV0X2ZhY3RvcnMgKTsKKyAgbXBpX3N1Yl91aShwX21pbjEsIHAsIDEpOworCisKKyAgLyogU2VsZWN0IGEgcmFuZG9tIG51bWJlciB3aGljaCBoYXMgdGhlc2UgcHJvcGVydGllczoKKyAgICoJIDAgPCB4IDwgcC0xCisgICAqIFRoaXMgbXVzdCBiZSBhIHZlcnkgZ29vZCByYW5kb20gbnVtYmVyIGJlY2F1c2UgdGhpcyBpcyB0aGUKKyAgICogc2VjcmV0IHBhcnQuICBUaGUgcHJpbWUgaXMgcHVibGljIGFuZCBtYXkgYmUgc2hhcmVkIGFueXdheSwKKyAgICogc28gYSByYW5kb20gZ2VuZXJhdG9yIGxldmVsIG9mIDEgaXMgdXNlZCBmb3IgdGhlIHByaW1lLgorICAgKgorICAgKiBJIGRvbid0IHNlZSBhIHJlYXNvbiB0byBoYXZlIGEgeCBvZiBhYm91dCB0aGUgc2FtZSBzaXplCisgICAqIGFzIHRoZSBwLiAgSXQgc2hvdWxkIGJlIHN1ZmZpY2llbnQgdG8gaGF2ZSBvbmUgYWJvdXQgdGhlIHNpemUKKyAgICogb2YgcSBvciB0aGUgbGF0ZXIgdXNlZCBrIHBsdXMgYSBsYXJnZSBzYWZldHkgbWFyZ2luLiBEZWNyeXB0aW9uCisgICAqIHdpbGwgYmUgbXVjaCBmYXN0ZXIgd2l0aCBzdWNoIGFuIHguCisgICAqLworICB4Yml0cyA9IHFiaXRzICogMyAvIDI7CisgIGlmKCB4Yml0cyA+PSBuYml0cyApCisgICAgQlVHKCk7CisgIHggPSBnY3J5X21waV9zbmV3ICggeGJpdHMgKTsKKyAgaWYoIERCR19DSVBIRVIgKQorICAgIGxvZ19kZWJ1ZygiY2hvb3NpbmcgYSByYW5kb20geCBvZiBzaXplICV1IiwgeGJpdHMgKTsKKyAgcm5kYnVmID0gTlVMTDsKKyAgZG8gCisgICAgeworICAgICAgaWYoIERCR19DSVBIRVIgKQorICAgICAgICBwcm9ncmVzcygnLicpOworICAgICAgaWYoIHJuZGJ1ZiApCisgICAgICAgIHsgLyogQ2hhbmdlIG9ubHkgc29tZSBvZiB0aGUgaGlnaGVyIGJpdHMgKi8KKyAgICAgICAgICBpZiggeGJpdHMgPCAxNiApIC8qIHNob3VsZCBuZXZlciBoYXBwZW4gLi4uICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGdjcnlfZnJlZShybmRidWYpOworICAgICAgICAgICAgICBybmRidWYgPSBnY3J5X3JhbmRvbV9ieXRlc19zZWN1cmUoICh4Yml0cys3KS84LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDUllfVkVSWV9TVFJPTkdfUkFORE9NICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjaGFyICpyID0gZ2NyeV9yYW5kb21fYnl0ZXNfc2VjdXJlKCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ1JZX1ZFUllfU1RST05HX1JBTkRPTSApOworICAgICAgICAgICAgICBtZW1jcHkocm5kYnVmLCByLCAyICk7CisgICAgICAgICAgICAgIGdjcnlfZnJlZShyKTsKKyAgICAgICAgICAgIH0KKwl9CisgICAgICBlbHNlIAorICAgICAgICB7CisgICAgICAgICAgcm5kYnVmID0gZ2NyeV9yYW5kb21fYnl0ZXNfc2VjdXJlKCAoeGJpdHMrNykvOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDUllfVkVSWV9TVFJPTkdfUkFORE9NICk7CisJfQorICAgICAgX2djcnlfbXBpX3NldF9idWZmZXIoIHgsIHJuZGJ1ZiwgKHhiaXRzKzcpLzgsIDAgKTsKKyAgICAgIG1waV9jbGVhcl9oaWdoYml0KCB4LCB4Yml0cysxICk7CisgICAgfSAKKyAgd2hpbGUoICEoIG1waV9jbXBfdWkoIHgsIDAgKT4wICYmIG1waV9jbXAoIHgsIHBfbWluMSApPDAgKSApOworICBnY3J5X2ZyZWUocm5kYnVmKTsKKworICB5ID0gZ2NyeV9tcGlfbmV3IChuYml0cyk7CisgIGdjcnlfbXBpX3Bvd20oIHksIGcsIHgsIHAgKTsKKworICBpZiggREJHX0NJUEhFUiApIAorICAgIHsKKyAgICAgIHByb2dyZXNzKCdcbicpOworICAgICAgbG9nX21waWR1bXAoImVsZyAgcD0gIiwgcCApOworICAgICAgbG9nX21waWR1bXAoImVsZyAgZz0gIiwgZyApOworICAgICAgbG9nX21waWR1bXAoImVsZyAgeT0gIiwgeSApOworICAgICAgbG9nX21waWR1bXAoImVsZyAgeD0gIiwgeCApOworICAgIH0KKworICAvKiBDb3B5IHRoZSBzdHVmZiB0byB0aGUga2V5IHN0cnVjdHVyZXMgKi8KKyAgc2stPnAgPSBwOworICBzay0+ZyA9IGc7CisgIHNrLT55ID0geTsKKyAgc2stPnggPSB4OworCisgIGdjcnlfbXBpX3JlbGVhc2UgKCBwX21pbjEgKTsKKworICAvKiBOb3cgd2UgY2FuIHRlc3Qgb3VyIGtleXMgKHRoaXMgc2hvdWxkIG5ldmVyIGZhaWwhKSAqLworICB0ZXN0X2tleXMgKCBzaywgbmJpdHMgLSA2NCwgMCApOworfQorCisKKy8qIEdlbmVyYXRlIGEga2V5IHBhaXIgd2l0aCBhIGtleSBvZiBzaXplIE5CSVRTIG5vdCB1c2luZyBhIHJhbmRvbQorICAgdmFsdWUgZm9yIHRoZSBzZWNyZXQga2V5IGJ1dCB0aGUgb25lIGdpdmVuIGFzIFguICBUaGlzIGlzIHVzZWZ1bCB0bworICAgaW1wbGVtZW50IGEgcGFzc3BocmFzZSBiYXNlZCBkZWNyeXB0aW9uIGZvciBhIHB1YmxpYyBrZXkgYmFzZWQKKyAgIGVuY3J5cHRpb24uICBJdCBoYXMgYXBwbGlhY3Rpb25zIGluIGJhY2t1cCBzeXN0ZW1zLgorIAorICAgUmV0dXJuczogQSBzdHJ1Y3R1cmUgZmlsbGVkIHdpdGggYWxsIG5lZWRlZCB2YWx1ZXMgYW5kIGFuIGFycmF5CisgCSAgICB3aXRoIG4tMSBmYWN0b3JzIG9mIChwLTEpLiAgKi8KK3N0YXRpYyBnY3J5X2Vycl9jb2RlX3QKK2dlbmVyYXRlX3VzaW5nX3ggKEVMR19zZWNyZXRfa2V5ICpzaywgdW5zaWduZWQgaW50IG5iaXRzLCBnY3J5X21waV90IHgsCisgICAgICAgICAgICAgICAgICBnY3J5X21waV90ICoqcmV0X2ZhY3RvcnMgKQoreworICBnY3J5X21waV90IHA7ICAgICAgLyogVGhlIHByaW1lLiAgKi8KKyAgZ2NyeV9tcGlfdCBwX21pbjE7IC8qIFRoZSBwcmltZSBtaW51cyAxLiAgKi8KKyAgZ2NyeV9tcGlfdCBnOyAgICAgIC8qIFRoZSBnZW5lcmF0b3IuICAqLworICBnY3J5X21waV90IHk7ICAgICAgLyogZ154IG1vZCBwLiAgKi8KKyAgdW5zaWduZWQgaW50IHFiaXRzOworICB1bnNpZ25lZCBpbnQgeGJpdHM7CisKKyAgc2stPnAgPSBOVUxMOworICBzay0+ZyA9IE5VTEw7CisgIHNrLT55ID0gTlVMTDsKKyAgc2stPnggPSBOVUxMOworCisgIC8qIERvIGEgcXVpY2sgY2hlY2sgdG8gc2VlIHdoZXRoZXIgWCBpcyBzdWl0YWJsZS4gICovCisgIHhiaXRzID0gbXBpX2dldF9uYml0cyAoeCk7CisgIGlmICggeGJpdHMgPCA2NCB8fCB4Yml0cyA+PSBuYml0cyApCisgICAgcmV0dXJuIEdQR19FUlJfSU5WX1ZBTFVFOworCisgIHBfbWluMSA9IGdjcnlfbXBpX25ldyAoIG5iaXRzICk7CisgIHFiaXRzICA9IHdpZW5lcl9tYXAgKCBuYml0cyApOworICBpZiAoIChxYml0cyAmIDEpICkgLyogQmV0dGVyIGhhdmUgYW4gZXZlbiBvbmUuICAqLworICAgIHFiaXRzKys7CisgIGcgPSBtcGlfYWxsb2MgKDEpOworICBwID0gX2djcnlfZ2VuZXJhdGVfZWxnX3ByaW1lICggMCwgbmJpdHMsIHFiaXRzLCBnLCByZXRfZmFjdG9ycyApOworICBtcGlfc3ViX3VpIChwX21pbjEsIHAsIDEpOworCisgIGlmIChEQkdfQ0lQSEVSKQorICAgIGxvZ19kZWJ1ZyAoInVzaW5nIGEgc3VwcGxpZWQgeCBvZiBzaXplICV1IiwgeGJpdHMgKTsKKyAgaWYgKCAhKG1waV9jbXBfdWkgKCB4LCAwICkgPiAwICYmIG1waV9jbXAgKCB4LCBwX21pbjEgKSA8MCApICkKKyAgICB7CisgICAgICBnY3J5X21waV9yZWxlYXNlICggcF9taW4xICk7CisgICAgICBnY3J5X21waV9yZWxlYXNlICggcCApOworICAgICAgZ2NyeV9tcGlfcmVsZWFzZSAoIGcgKTsKKyAgICAgIHJldHVybiBHUEdfRVJSX0lOVl9WQUxVRTsKKyAgICB9CisKKyAgeSA9IGdjcnlfbXBpX25ldyAobmJpdHMpOworICBnY3J5X21waV9wb3dtICggeSwgZywgeCwgcCApOworCisgIGlmICggREJHX0NJUEhFUiApIAorICAgIHsKKyAgICAgIHByb2dyZXNzICgnXG4nKTsKKyAgICAgIGxvZ19tcGlkdW1wICgiZWxnICBwPSAiLCBwICk7CisgICAgICBsb2dfbXBpZHVtcCAoImVsZyAgZz0gIiwgZyApOworICAgICAgbG9nX21waWR1bXAgKCJlbGcgIHk9ICIsIHkgKTsKKyAgICAgIGxvZ19tcGlkdW1wICgiZWxnICB4PSAiLCB4ICk7CisgICAgfQorCisgIC8qIENvcHkgdGhlIHN0dWZmIHRvIHRoZSBrZXkgc3RydWN0dXJlcyAqLworICBzay0+cCA9IHA7CisgIHNrLT5nID0gZzsKKyAgc2stPnkgPSB5OworICBzay0+eCA9IGdjcnlfbXBpX2NvcHkgKHgpOworCisgIGdjcnlfbXBpX3JlbGVhc2UgKCBwX21pbjEgKTsKKworICAvKiBOb3cgd2UgY2FuIHRlc3Qgb3VyIGtleXMuICovCisgIGlmICggdGVzdF9rZXlzICggc2ssIG5iaXRzIC0gNjQsIDEgKSApCisgICAgeworICAgICAgZ2NyeV9tcGlfcmVsZWFzZSAoIHNrLT5wICk7IHNrLT5wID0gTlVMTDsKKyAgICAgIGdjcnlfbXBpX3JlbGVhc2UgKCBzay0+ZyApOyBzay0+ZyA9IE5VTEw7CisgICAgICBnY3J5X21waV9yZWxlYXNlICggc2stPnkgKTsgc2stPnkgPSBOVUxMOworICAgICAgZ2NyeV9tcGlfcmVsZWFzZSAoIHNrLT54ICk7IHNrLT54ID0gTlVMTDsKKyAgICAgIHJldHVybiBHUEdfRVJSX0JBRF9TRUNLRVk7CisgICAgfQorCisgIHJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqCisgKiBUZXN0IHdoZXRoZXIgdGhlIHNlY3JldCBrZXkgaXMgdmFsaWQuCisgKiBSZXR1cm5zOiBpZiB0aGlzIGlzIGEgdmFsaWQga2V5LgorICovCitzdGF0aWMgaW50CitjaGVja19zZWNyZXRfa2V5KCBFTEdfc2VjcmV0X2tleSAqc2sgKQoreworICBpbnQgcmM7CisgIGdjcnlfbXBpX3QgeSA9IG1waV9hbGxvYyggbXBpX2dldF9ubGltYnMoc2stPnkpICk7CisKKyAgZ2NyeV9tcGlfcG93bSggeSwgc2stPmcsIHNrLT54LCBzay0+cCApOworICByYyA9ICFtcGlfY21wKCB5LCBzay0+eSApOworICBtcGlfZnJlZSggeSApOworICByZXR1cm4gcmM7Cit9CisKKworc3RhdGljIHZvaWQKK2RvX2VuY3J5cHQoZ2NyeV9tcGlfdCBhLCBnY3J5X21waV90IGIsIGdjcnlfbXBpX3QgaW5wdXQsIEVMR19wdWJsaWNfa2V5ICpwa2V5ICkKK3sKKyAgZ2NyeV9tcGlfdCBrOworCisgIC8qIE5vdGU6IG1heWJlIHdlIHNob3VsZCBjaGFuZ2UgdGhlIGludGVyZmFjZSwgc28gdGhhdCBpdAorICAgKiBpcyBwb3NzaWJsZSB0byBjaGVjayB0aGF0IGlucHV0IGlzIDwgcCBhbmQgcmV0dXJuIGFuCisgICAqIGVycm9yIGNvZGUuCisgICAqLworCisgIGsgPSBnZW5fayggcGtleS0+cCwgMSApOworICBnY3J5X21waV9wb3dtKCBhLCBwa2V5LT5nLCBrLCBwa2V5LT5wICk7CisgIC8qIGIgPSAoeV5rICogaW5wdXQpIG1vZCBwCisgICAqCSA9ICgoeV5rIG1vZCBwKSAqIChpbnB1dCBtb2QgcCkpIG1vZCBwCisgICAqIGFuZCBiZWNhdXNlIGlucHV0IGlzIDwgcAorICAgKgkgPSAoKHleayBtb2QgcCkgKiBpbnB1dCkgbW9kIHAKKyAgICovCisgIGdjcnlfbXBpX3Bvd20oIGIsIHBrZXktPnksIGssIHBrZXktPnAgKTsKKyAgZ2NyeV9tcGlfbXVsbSggYiwgYiwgaW5wdXQsIHBrZXktPnAgKTsKKyNpZiAwCisgIGlmKCBEQkdfQ0lQSEVSICkKKyAgICB7CisgICAgICBsb2dfbXBpZHVtcCgiZWxnIGVuY3J5cHRlZCB5PSAiLCBwa2V5LT55KTsKKyAgICAgIGxvZ19tcGlkdW1wKCJlbGcgZW5jcnlwdGVkIHA9ICIsIHBrZXktPnApOworICAgICAgbG9nX21waWR1bXAoImVsZyBlbmNyeXB0ZWQgaz0gIiwgayk7CisgICAgICBsb2dfbXBpZHVtcCgiZWxnIGVuY3J5cHRlZCBNPSAiLCBpbnB1dCk7CisgICAgICBsb2dfbXBpZHVtcCgiZWxnIGVuY3J5cHRlZCBhPSAiLCBhKTsKKyAgICAgIGxvZ19tcGlkdW1wKCJlbGcgZW5jcnlwdGVkIGI9ICIsIGIpOworICAgIH0KKyNlbmRpZgorICBtcGlfZnJlZShrKTsKK30KKworCisKKworc3RhdGljIHZvaWQKK2RlY3J5cHQoZ2NyeV9tcGlfdCBvdXRwdXQsIGdjcnlfbXBpX3QgYSwgZ2NyeV9tcGlfdCBiLCBFTEdfc2VjcmV0X2tleSAqc2tleSApCit7CisgIGdjcnlfbXBpX3QgdDEgPSBtcGlfYWxsb2Nfc2VjdXJlKCBtcGlfZ2V0X25saW1icyggc2tleS0+cCApICk7CisKKyAgLyogb3V0cHV0ID0gYi8oYV54KSBtb2QgcCAqLworICBnY3J5X21waV9wb3dtKCB0MSwgYSwgc2tleS0+eCwgc2tleS0+cCApOworICBtcGlfaW52bSggdDEsIHQxLCBza2V5LT5wICk7CisgIG1waV9tdWxtKCBvdXRwdXQsIGIsIHQxLCBza2V5LT5wICk7CisjaWYgMAorICBpZiggREJHX0NJUEhFUiApIAorICAgIHsKKyAgICAgIGxvZ19tcGlkdW1wKCJlbGcgZGVjcnlwdGVkIHg9ICIsIHNrZXktPngpOworICAgICAgbG9nX21waWR1bXAoImVsZyBkZWNyeXB0ZWQgcD0gIiwgc2tleS0+cCk7CisgICAgICBsb2dfbXBpZHVtcCgiZWxnIGRlY3J5cHRlZCBhPSAiLCBhKTsKKyAgICAgIGxvZ19tcGlkdW1wKCJlbGcgZGVjcnlwdGVkIGI9ICIsIGIpOworICAgICAgbG9nX21waWR1bXAoImVsZyBkZWNyeXB0ZWQgTT0gIiwgb3V0cHV0KTsKKyAgICB9CisjZW5kaWYKKyAgbXBpX2ZyZWUodDEpOworfQorCisKKy8qKioqKioqKioqKioqKioqCisgKiBNYWtlIGFuIEVsZ2FtYWwgc2lnbmF0dXJlIG91dCBvZiBJTlBVVAorICovCisKK3N0YXRpYyB2b2lkCitzaWduKGdjcnlfbXBpX3QgYSwgZ2NyeV9tcGlfdCBiLCBnY3J5X21waV90IGlucHV0LCBFTEdfc2VjcmV0X2tleSAqc2tleSApCit7CisgICAgZ2NyeV9tcGlfdCBrOworICAgIGdjcnlfbXBpX3QgdCAgID0gbXBpX2FsbG9jKCBtcGlfZ2V0X25saW1icyhhKSApOworICAgIGdjcnlfbXBpX3QgaW52ID0gbXBpX2FsbG9jKCBtcGlfZ2V0X25saW1icyhhKSApOworICAgIGdjcnlfbXBpX3QgcF8xID0gbXBpX2NvcHkoc2tleS0+cCk7CisKKyAgIC8qCisgICAgKiBiID0gKHQgKiBpbnYpIG1vZCAocC0xKQorICAgICogYiA9ICh0ICogaW52KGssKHAtMSksKHAtMSkpIG1vZCAocC0xKQorICAgICogYiA9ICgoKE0teCphKSBtb2QgKHAtMSkpICogaW52KGssKHAtMSksKHAtMSkpKSBtb2QgKHAtMSkKKyAgICAqCisgICAgKi8KKyAgICBtcGlfc3ViX3VpKHBfMSwgcF8xLCAxKTsKKyAgICBrID0gZ2VuX2soIHNrZXktPnAsIDAgLyogbm8gc21hbGwgSyAhICovICk7CisgICAgZ2NyeV9tcGlfcG93bSggYSwgc2tleS0+Zywgaywgc2tleS0+cCApOworICAgIG1waV9tdWwodCwgc2tleS0+eCwgYSApOworICAgIG1waV9zdWJtKHQsIGlucHV0LCB0LCBwXzEgKTsKKyAgICBtcGlfaW52bShpbnYsIGssIHBfMSApOworICAgIG1waV9tdWxtKGIsIHQsIGludiwgcF8xICk7CisKKyNpZiAwCisgICAgaWYoIERCR19DSVBIRVIgKSAKKyAgICAgIHsKKwlsb2dfbXBpZHVtcCgiZWxnIHNpZ24gcD0gIiwgc2tleS0+cCk7CisJbG9nX21waWR1bXAoImVsZyBzaWduIGc9ICIsIHNrZXktPmcpOworCWxvZ19tcGlkdW1wKCJlbGcgc2lnbiB5PSAiLCBza2V5LT55KTsKKwlsb2dfbXBpZHVtcCgiZWxnIHNpZ24geD0gIiwgc2tleS0+eCk7CisJbG9nX21waWR1bXAoImVsZyBzaWduIGs9ICIsIGspOworCWxvZ19tcGlkdW1wKCJlbGcgc2lnbiBNPSAiLCBpbnB1dCk7CisJbG9nX21waWR1bXAoImVsZyBzaWduIGE9ICIsIGEpOworCWxvZ19tcGlkdW1wKCJlbGcgc2lnbiBiPSAiLCBiKTsKKyAgICAgIH0KKyNlbmRpZgorICAgIG1waV9mcmVlKGspOworICAgIG1waV9mcmVlKHQpOworICAgIG1waV9mcmVlKGludik7CisgICAgbXBpX2ZyZWUocF8xKTsKK30KKworCisvKioqKioqKioqKioqKioqKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBzaWduYXR1cmUgY29tcG9zZWQgb2YgQSBhbmQgQiBpcyB2YWxpZC4KKyAqLworc3RhdGljIGludAordmVyaWZ5KGdjcnlfbXBpX3QgYSwgZ2NyeV9tcGlfdCBiLCBnY3J5X21waV90IGlucHV0LCBFTEdfcHVibGljX2tleSAqcGtleSApCit7CisgIGludCByYzsKKyAgZ2NyeV9tcGlfdCB0MTsKKyAgZ2NyeV9tcGlfdCB0MjsKKyAgZ2NyeV9tcGlfdCBiYXNlWzRdOworICBnY3J5X21waV90IGV4WzRdOworCisgIGlmKCAhKG1waV9jbXBfdWkoIGEsIDAgKSA+IDAgJiYgbXBpX2NtcCggYSwgcGtleS0+cCApIDwgMCkgKQorICAgIHJldHVybiAwOyAvKiBhc3NlcnRpb24JMCA8IGEgPCBwICBmYWlsZWQgKi8KKworICB0MSA9IG1waV9hbGxvYyggbXBpX2dldF9ubGltYnMoYSkgKTsKKyAgdDIgPSBtcGlfYWxsb2MoIG1waV9nZXRfbmxpbWJzKGEpICk7CisKKyNpZiAwCisgIC8qIHQxID0gKHleYSBtb2QgcCkgKiAoYV5iIG1vZCBwKSBtb2QgcCAqLworICBnY3J5X21waV9wb3dtKCB0MSwgcGtleS0+eSwgYSwgcGtleS0+cCApOworICBnY3J5X21waV9wb3dtKCB0MiwgYSwgYiwgcGtleS0+cCApOworICBtcGlfbXVsbSggdDEsIHQxLCB0MiwgcGtleS0+cCApOworCisgIC8qIHQyID0gZyBeIGlucHV0IG1vZCBwICovCisgIGdjcnlfbXBpX3Bvd20oIHQyLCBwa2V5LT5nLCBpbnB1dCwgcGtleS0+cCApOworCisgIHJjID0gIW1waV9jbXAoIHQxLCB0MiApOworI2VsaWYgMAorICAvKiB0MSA9ICh5XmEgbW9kIHApICogKGFeYiBtb2QgcCkgbW9kIHAgKi8KKyAgYmFzZVswXSA9IHBrZXktPnk7IGV4WzBdID0gYTsKKyAgYmFzZVsxXSA9IGE7ICAgICAgIGV4WzFdID0gYjsKKyAgYmFzZVsyXSA9IE5VTEw7ICAgIGV4WzJdID0gTlVMTDsKKyAgbXBpX211bHBvd20oIHQxLCBiYXNlLCBleCwgcGtleS0+cCApOworCisgIC8qIHQyID0gZyBeIGlucHV0IG1vZCBwICovCisgIGdjcnlfbXBpX3Bvd20oIHQyLCBwa2V5LT5nLCBpbnB1dCwgcGtleS0+cCApOworCisgIHJjID0gIW1waV9jbXAoIHQxLCB0MiApOworI2Vsc2UKKyAgLyogdDEgPSBnIF4gLSBpbnB1dCAqIHkgXiBhICogYSBeIGIgIG1vZCBwICovCisgIG1waV9pbnZtKHQyLCBwa2V5LT5nLCBwa2V5LT5wICk7CisgIGJhc2VbMF0gPSB0MiAgICAgOyBleFswXSA9IGlucHV0OworICBiYXNlWzFdID0gcGtleS0+eTsgZXhbMV0gPSBhOworICBiYXNlWzJdID0gYTsgICAgICAgZXhbMl0gPSBiOworICBiYXNlWzNdID0gTlVMTDsgICAgZXhbM10gPSBOVUxMOworICBtcGlfbXVscG93bSggdDEsIGJhc2UsIGV4LCBwa2V5LT5wICk7CisgIHJjID0gIW1waV9jbXBfdWkoIHQxLCAxICk7CisKKyNlbmRpZgorCisgIG1waV9mcmVlKHQxKTsKKyAgbXBpX2ZyZWUodDIpOworICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKiAgaW50ZXJmYWNlICAqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBncGdfZXJyX2NvZGVfdAorZWxnX2dlbmVyYXRlX2V4dCAoaW50IGFsZ28sIHVuc2lnbmVkIGludCBuYml0cywgdW5zaWduZWQgbG9uZyBldmFsdWUsCisgICAgICAgICAgICAgICAgICBjb25zdCBnY3J5X3NleHBfdCBnZW5wYXJtcywKKyAgICAgICAgICAgICAgICAgIGdjcnlfbXBpX3QgKnNrZXksIGdjcnlfbXBpX3QgKipyZXRmYWN0b3JzLAorICAgICAgICAgICAgICAgICAgZ2NyeV9zZXhwX3QgKnJfZXh0cmFpbmZvKQoreworICBncGdfZXJyX2NvZGVfdCBlYzsKKyAgRUxHX3NlY3JldF9rZXkgc2s7CisgIGdjcnlfbXBpX3QgeHZhbHVlID0gTlVMTDsKKyAgZ2NyeV9zZXhwX3QgbDE7CisKKyAgKHZvaWQpYWxnbzsKKyAgKHZvaWQpZXZhbHVlOworICAodm9pZClyX2V4dHJhaW5mbzsKKworICBpZiAoZ2VucGFybXMpCisgICAgeworICAgICAgLyogUGFyc2UgdGhlIG9wdGlvbmFsIHh2YWx1ZSBlbGVtZW50LiAqLworICAgICAgbDEgPSBnY3J5X3NleHBfZmluZF90b2tlbiAoZ2VucGFybXMsICJ4dmFsdWUiLCAwKTsKKyAgICAgIGlmIChsMSkKKyAgICAgICAgeworICAgICAgICAgIHh2YWx1ZSA9IGdjcnlfc2V4cF9udGhfbXBpIChsMSwgMSwgMCk7CisgICAgICAgICAgZ2NyeV9zZXhwX3JlbGVhc2UgKGwxKTsKKyAgICAgICAgICBpZiAoIXh2YWx1ZSkKKyAgICAgICAgICAgIHJldHVybiBHUEdfRVJSX0JBRF9NUEk7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKHh2YWx1ZSkKKyAgICBlYyA9IGdlbmVyYXRlX3VzaW5nX3ggKCZzaywgbmJpdHMsIHh2YWx1ZSwgcmV0ZmFjdG9ycyk7CisgIGVsc2UKKyAgICB7CisgICAgICBnZW5lcmF0ZSAoJnNrLCBuYml0cywgcmV0ZmFjdG9ycyk7CisgICAgICBlYyA9IDA7CisgICAgfQorCisgIHNrZXlbMF0gPSBzay5wOworICBza2V5WzFdID0gc2suZzsKKyAgc2tleVsyXSA9IHNrLnk7CisgIHNrZXlbM10gPSBzay54OworICAKKyAgcmV0dXJuIGVjOworfQorCisKK3N0YXRpYyBnY3J5X2Vycl9jb2RlX3QKK2VsZ19nZW5lcmF0ZSAoaW50IGFsZ28sIHVuc2lnbmVkIGludCBuYml0cywgdW5zaWduZWQgbG9uZyBldmFsdWUsCisgICAgICAgICAgICAgIGdjcnlfbXBpX3QgKnNrZXksIGdjcnlfbXBpX3QgKipyZXRmYWN0b3JzKQoreworICBFTEdfc2VjcmV0X2tleSBzazsKKworICAodm9pZClhbGdvOworICAodm9pZClldmFsdWU7CisKKyAgZ2VuZXJhdGUgKCZzaywgbmJpdHMsIHJldGZhY3RvcnMpOworICBza2V5WzBdID0gc2sucDsKKyAgc2tleVsxXSA9IHNrLmc7CisgIHNrZXlbMl0gPSBzay55OworICBza2V5WzNdID0gc2sueDsKKyAgCisgIHJldHVybiBHUEdfRVJSX05PX0VSUk9SOworfQorCisKK3N0YXRpYyBnY3J5X2Vycl9jb2RlX3QKK2VsZ19jaGVja19zZWNyZXRfa2V5IChpbnQgYWxnbywgZ2NyeV9tcGlfdCAqc2tleSkKK3sKKyAgZ2NyeV9lcnJfY29kZV90IGVyciA9IEdQR19FUlJfTk9fRVJST1I7CisgIEVMR19zZWNyZXRfa2V5IHNrOworCisgICh2b2lkKWFsZ287CisKKyAgaWYgKCghIHNrZXlbMF0pIHx8ICghIHNrZXlbMV0pIHx8ICghIHNrZXlbMl0pIHx8ICghIHNrZXlbM10pKQorICAgIGVyciA9IEdQR19FUlJfQkFEX01QSTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHNrLnAgPSBza2V5WzBdOworICAgICAgc2suZyA9IHNrZXlbMV07CisgICAgICBzay55ID0gc2tleVsyXTsKKyAgICAgIHNrLnggPSBza2V5WzNdOworICAgICAgCisgICAgICBpZiAoISBjaGVja19zZWNyZXRfa2V5ICgmc2spKQorCWVyciA9IEdQR19FUlJfQkFEX1NFQ0tFWTsKKyAgICB9CisKKyAgcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgZ2NyeV9lcnJfY29kZV90CitlbGdfZW5jcnlwdCAoaW50IGFsZ28sIGdjcnlfbXBpX3QgKnJlc2FyciwKKyAgICAgICAgICAgICBnY3J5X21waV90IGRhdGEsIGdjcnlfbXBpX3QgKnBrZXksIGludCBmbGFncykKK3sKKyAgZ2NyeV9lcnJfY29kZV90IGVyciA9IEdQR19FUlJfTk9fRVJST1I7CisgIEVMR19wdWJsaWNfa2V5IHBrOworCisgICh2b2lkKWFsZ287CisgICh2b2lkKWZsYWdzOworCisgIGlmICgoISBkYXRhKSB8fCAoISBwa2V5WzBdKSB8fCAoISBwa2V5WzFdKSB8fCAoISBwa2V5WzJdKSkKKyAgICBlcnIgPSBHUEdfRVJSX0JBRF9NUEk7CisgIGVsc2UKKyAgICB7CisgICAgICBway5wID0gcGtleVswXTsKKyAgICAgIHBrLmcgPSBwa2V5WzFdOworICAgICAgcGsueSA9IHBrZXlbMl07CisgICAgICByZXNhcnJbMF0gPSBtcGlfYWxsb2MgKG1waV9nZXRfbmxpbWJzIChway5wKSk7CisgICAgICByZXNhcnJbMV0gPSBtcGlfYWxsb2MgKG1waV9nZXRfbmxpbWJzIChway5wKSk7CisgICAgICBkb19lbmNyeXB0IChyZXNhcnJbMF0sIHJlc2FyclsxXSwgZGF0YSwgJnBrKTsKKyAgICB9CisgIHJldHVybiBlcnI7Cit9CisKKworc3RhdGljIGdjcnlfZXJyX2NvZGVfdAorZWxnX2RlY3J5cHQgKGludCBhbGdvLCBnY3J5X21waV90ICpyZXN1bHQsCisgICAgICAgICAgICAgZ2NyeV9tcGlfdCAqZGF0YSwgZ2NyeV9tcGlfdCAqc2tleSwgaW50IGZsYWdzKQoreworICBnY3J5X2Vycl9jb2RlX3QgZXJyID0gR1BHX0VSUl9OT19FUlJPUjsKKyAgRUxHX3NlY3JldF9rZXkgc2s7CisKKyAgKHZvaWQpYWxnbzsKKyAgKHZvaWQpZmxhZ3M7CisKKyAgaWYgKCghIGRhdGFbMF0pIHx8ICghIGRhdGFbMV0pCisgICAgICB8fCAoISBza2V5WzBdKSB8fCAoISBza2V5WzFdKSB8fCAoISBza2V5WzJdKSB8fCAoISBza2V5WzNdKSkKKyAgICBlcnIgPSBHUEdfRVJSX0JBRF9NUEk7CisgIGVsc2UKKyAgICB7CisgICAgICBzay5wID0gc2tleVswXTsKKyAgICAgIHNrLmcgPSBza2V5WzFdOworICAgICAgc2sueSA9IHNrZXlbMl07CisgICAgICBzay54ID0gc2tleVszXTsKKyAgICAgICpyZXN1bHQgPSBtcGlfYWxsb2Nfc2VjdXJlIChtcGlfZ2V0X25saW1icyAoc2sucCkpOworICAgICAgZGVjcnlwdCAoKnJlc3VsdCwgZGF0YVswXSwgZGF0YVsxXSwgJnNrKTsKKyAgICB9CisgIHJldHVybiBlcnI7Cit9CisKKworc3RhdGljIGdjcnlfZXJyX2NvZGVfdAorZWxnX3NpZ24gKGludCBhbGdvLCBnY3J5X21waV90ICpyZXNhcnIsIGdjcnlfbXBpX3QgZGF0YSwgZ2NyeV9tcGlfdCAqc2tleSkKK3sKKyAgZ2NyeV9lcnJfY29kZV90IGVyciA9IEdQR19FUlJfTk9fRVJST1I7CisgIEVMR19zZWNyZXRfa2V5IHNrOworCisgICh2b2lkKWFsZ287CisKKyAgaWYgKCghIGRhdGEpCisgICAgICB8fCAoISBza2V5WzBdKSB8fCAoISBza2V5WzFdKSB8fCAoISBza2V5WzJdKSB8fCAoISBza2V5WzNdKSkKKyAgICBlcnIgPSBHUEdfRVJSX0JBRF9NUEk7CisgIGVsc2UKKyAgICB7CisgICAgICBzay5wID0gc2tleVswXTsKKyAgICAgIHNrLmcgPSBza2V5WzFdOworICAgICAgc2sueSA9IHNrZXlbMl07CisgICAgICBzay54ID0gc2tleVszXTsKKyAgICAgIHJlc2FyclswXSA9IG1waV9hbGxvYyAobXBpX2dldF9ubGltYnMgKHNrLnApKTsKKyAgICAgIHJlc2FyclsxXSA9IG1waV9hbGxvYyAobXBpX2dldF9ubGltYnMgKHNrLnApKTsKKyAgICAgIHNpZ24gKHJlc2FyclswXSwgcmVzYXJyWzFdLCBkYXRhLCAmc2spOworICAgIH0KKyAgCisgIHJldHVybiBlcnI7Cit9CisKKworc3RhdGljIGdjcnlfZXJyX2NvZGVfdAorZWxnX3ZlcmlmeSAoaW50IGFsZ28sIGdjcnlfbXBpX3QgaGFzaCwgZ2NyeV9tcGlfdCAqZGF0YSwgZ2NyeV9tcGlfdCAqcGtleSwKKyAgICAgICAgICAgIGludCAoKmNtcCkgKHZvaWQgKiwgZ2NyeV9tcGlfdCksIHZvaWQgKm9wYXF1ZXYpCit7CisgIGdjcnlfZXJyX2NvZGVfdCBlcnIgPSBHUEdfRVJSX05PX0VSUk9SOworICBFTEdfcHVibGljX2tleSBwazsKKworICAodm9pZClhbGdvOworICAodm9pZCljbXA7CisgICh2b2lkKW9wYXF1ZXY7CisKKyAgaWYgKCghIGRhdGFbMF0pIHx8ICghIGRhdGFbMV0pIHx8ICghIGhhc2gpCisgICAgICB8fCAoISBwa2V5WzBdKSB8fCAoISBwa2V5WzFdKSB8fCAoISBwa2V5WzJdKSkKKyAgICBlcnIgPSBHUEdfRVJSX0JBRF9NUEk7CisgIGVsc2UKKyAgICB7CisgICAgICBway5wID0gcGtleVswXTsKKyAgICAgIHBrLmcgPSBwa2V5WzFdOworICAgICAgcGsueSA9IHBrZXlbMl07CisgICAgICBpZiAoISB2ZXJpZnkgKGRhdGFbMF0sIGRhdGFbMV0sIGhhc2gsICZwaykpCisJZXJyID0gR1BHX0VSUl9CQURfU0lHTkFUVVJFOworICAgIH0KKworICByZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2VsZ19nZXRfbmJpdHMgKGludCBhbGdvLCBnY3J5X21waV90ICpwa2V5KQoreworICAodm9pZClhbGdvOworCisgIHJldHVybiBtcGlfZ2V0X25iaXRzIChwa2V5WzBdKTsKK30KKworCitzdGF0aWMgY29uc3QgY2hhciAqZWxnX25hbWVzW10gPQorICB7CisgICAgImVsZyIsCisgICAgIm9wZW5wZ3AtZWxnIiwKKyAgICAib3BlbnBncC1lbGctc2lnIiwKKyAgICBOVUxMLAorICB9OworCisKK2djcnlfcGtfc3BlY190IF9nY3J5X3B1YmtleV9zcGVjX2VsZyA9CisgIHsKKyAgICAiRUxHIiwgZWxnX25hbWVzLAorICAgICJwZ3kiLCAicGd5eCIsICJhYiIsICJycyIsICJwZ3kiLAorICAgIEdDUllfUEtfVVNBR0VfU0lHTiB8IEdDUllfUEtfVVNBR0VfRU5DUiwKKyAgICBlbGdfZ2VuZXJhdGUsCisgICAgZWxnX2NoZWNrX3NlY3JldF9rZXksCisgICAgZWxnX2VuY3J5cHQsCisgICAgZWxnX2RlY3J5cHQsCisgICAgZWxnX3NpZ24sCisgICAgZWxnX3ZlcmlmeSwKKyAgICBlbGdfZ2V0X25iaXRzCisgIH07CisKK3BrX2V4dHJhX3NwZWNfdCBfZ2NyeV9wdWJrZXlfZXh0cmFzcGVjX2VsZyA9IAorICB7CisgICAgTlVMTCwKKyAgICBlbGdfZ2VuZXJhdGVfZXh0LAorICAgIE5VTEwKKyAgfTsKKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L2NpcGhlci9oYXNoLWNvbW1vbi5jIGIvbGliZ2NyeXB0LTEuNC42L2NpcGhlci9oYXNoLWNvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NmUxODAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvY2lwaGVyL2hhc2gtY29tbW9uLmMKQEAgLTAsMCArMSw5NCBAQAorLyogaGFzaC1jb21tb24uYyAtIENvbW1vbiBjb2RlIGZvciBoYXNoIGFsZ29yaXRobXMKKyAqIENvcHlyaWdodCAoQykgMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWZkZWYgSEFWRV9TVERJTlRfSCAKKyMgaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgImcxMGxpYi5oIgorI2luY2x1ZGUgImhhc2gtY29tbW9uLmgiCisKKworLyogUnVuIGEgc2VsZnRlc3QgZm9yIGhhc2ggYWxnb3JpdGhtIEFMR08uICBJZiB0aGUgcmVzdWx0aW5nIGRpZ2VzdAorICAgbWF0Y2hlcyBFWFBFQ1QvRVhQRUNUTEVOIGFuZCBldmVyeXRoaW5nIGVsc2UgaXMgZmluZSBhcyB3ZWxsLAorICAgcmV0dXJuIE5VTEwuICBJZiBhbiBlcnJvciBvY2N1cnMsIHJldHVybiBhIHN0YXRpYyB0ZXh0IHN0cmluZworICAgZGVzY3JpYmluZyB0aGUgZXJyb3IuCisKKyAgIERBVEFNT0RFIGNvbnRyb2xzIHdoYXQgd2lsbCBiZSBoYXNoZWQgYWNjb3JkaW5nIHRvIHRoaXMgdGFibGU6CisgICAKKyAgICAgMCAtIEhhc2ggdGhlIHN1cHBsaWVkIERBVEEgb2YgREFUQUxFTi4KKyAgICAgMSAtIEhhc2ggb25lIG1pbGxpb24gdGltZXMgYSAnYScuICBEQVRBIGFuZCBEQVRBTEVOIGFyZSBpZ25vcmVkLgorICAgCisqLworY29uc3QgY2hhciAqCitfZ2NyeV9oYXNoX3NlbGZ0ZXN0X2NoZWNrX29uZSAoaW50IGFsZ28sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRhdGFtb2RlLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgZGF0YWxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpleHBlY3QsIHNpemVfdCBleHBlY3RsZW4pCit7CisgIGNvbnN0IGNoYXIgKnJlc3VsdCA9IE5VTEw7CisgIGdjcnlfZXJyb3JfdCBlcnIgPSAwOworICBnY3J5X21kX2hkX3QgaGQ7CisgIHVuc2lnbmVkIGNoYXIgKmRpZ2VzdDsKKyAgCisgIGlmIChfZ2NyeV9tZF9nZXRfYWxnb19kbGVuIChhbGdvKSAhPSBleHBlY3RsZW4pCisgICAgcmV0dXJuICJkaWdlc3Qgc2l6ZSBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCBzaXplIjsKKyAgICAKKyAgZXJyID0gX2djcnlfbWRfb3BlbiAoJmhkLCBhbGdvLCAwKTsKKyAgaWYgKGVycikKKyAgICByZXR1cm4gImdjcnlfbWRfb3BlbiBmYWlsZWQiOworICAKKyAgc3dpdGNoIChkYXRhbW9kZSkKKyAgICB7CisgICAgY2FzZSAwOgorICAgICAgX2djcnlfbWRfd3JpdGUgKGhkLCBkYXRhLCBkYXRhbGVuKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAxOiAvKiBIYXNoIG9uZSBtaWxsaW9uIHRpbWVzIGFuICJhIi4gKi8KKyAgICAgIHsJCQorICAgICAgICBjaGFyIGFhYVsxMDAwXTsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgLyogV3JpdGUgaW4gb2RkIHNpemUgY2h1bmtzIHNvIHRoYXQgd2UgdGVzdCB0aGUgYnVmZmVyaW5nLiAgKi8KKyAgICAgICAgbWVtc2V0IChhYWEsICdhJywgMTAwMCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMDAwOyBpKyspCisgICAgICAgICAgX2djcnlfbWRfd3JpdGUgKGhkLCBhYWEsIDEwMDApOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmVzdWx0ID0gImludmFsaWQgREFUQU1PREUiOworICAgIH0KKworICBpZiAoIXJlc3VsdCkKKyAgICB7CisgICAgICBkaWdlc3QgPSBfZ2NyeV9tZF9yZWFkIChoZCwgYWxnbyk7CisgICAgICAKKyAgICAgIGlmICggbWVtY21wIChkaWdlc3QsIGV4cGVjdCwgZXhwZWN0bGVuKSApCisgICAgICAgIHJlc3VsdCA9ICJkaWdlc3QgbWlzbWF0Y2giOworICAgIH0KKworICBfZ2NyeV9tZF9jbG9zZSAoaGQpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9jaXBoZXIvaGFzaC1jb21tb24uaCBiL2xpYmdjcnlwdC0xLjQuNi9jaXBoZXIvaGFzaC1jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzRlMzMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L2NpcGhlci9oYXNoLWNvbW1vbi5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qIGhhc2gtY29tbW9uLmggLSBEZWNsYXJhdGlvbnMgb2YgY29tbW9uIGNvZGUgZm9yIGhhc2ggYWxnb3JpdGhtcy4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBHQ1JZX0hBU0hfQ09NTU9OX0gKKyNkZWZpbmUgR0NSWV9IQVNIX0NPTU1PTl9ICisKKworY29uc3QgY2hhciAqIF9nY3J5X2hhc2hfc2VsZnRlc3RfY2hlY2tfb25lIAorLyoqLyAgICAgICAgIChpbnQgYWxnbywgCisgICAgICAgICAgICAgIGludCBkYXRhbW9kZSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFsZW4sCisgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmV4cGVjdCwgc2l6ZV90IGV4cGVjdGxlbik7CisgICAgIAorCisKKworCisjZW5kaWYgLypHQ1JZX0hBU0hfQ09NTU9OX0gqLwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L2NpcGhlci9obWFjLXRlc3RzLmMgYi9saWJnY3J5cHQtMS40LjYvY2lwaGVyL2htYWMtdGVzdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmM5YjIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L2NpcGhlci9obWFjLXRlc3RzLmMKQEAgLTAsMCArMSw3MzIgQEAKKy8qIGhtYWMtdGVzdHMuYyAtIEhNQUMgc2VsZnRlc3RzLgorICogQ29weXJpZ2h0IChDKSAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisvKiAKKyAgIEFsdGhvdWdoIGFsZ29yaXRobSBzZWxmLXRlc3RzIGFyZSB1c3VhbGx5IGltcGxlbWVudGVkIGluIHRoZSBtb2R1bGUKKyAgIGltcGxlbWVudGluZyB0aGUgYWxnb3JpdGhtLCB0aGUgY2FzZSBmb3IgSE1BQyBpcyBkaWZmZXJlbnQgYmVjYXVzZQorICAgSE1BQyBpcyBpbXBsZW1uZXRkIG9uIGEgaGlnaGVyIGxldmVsIHVzaW5nIGEgc3BlY2lhbCBmZWF0dXJlIG9mIHRoZQorICAgZ2NyeV9tZF8gZnVuY3Rpb25zLiAgSXQgd291bGQgYmUgcG9zc2libGUgdG8gZG8gdGhpcyBhbHNvIGluIHRoZQorICAgZGlnZXN0IGFsZ29yaXRobSBtb2R1bGVzLCBidXQgdGhhdCB3b3VsZCBibG93IHVwIHRoZSBjb2RlIHRvbyBtdWNoCisgICBhbmQgc3ByZWFkIHRoZSBobWFjIHRlc3RzIG92ZXIgc2V2ZXJhbCBtb2R1bGVzLgorCisgICBUaHVzIHdlIGltcGxlbWVudCBhbGwgSE1BQyB0ZXN0cyBpbiB0aGlzIHRlc3QgbW9kdWxlIGFuZCBwcm92aWRlIGEKKyAgIGZ1bmN0aW9uIHRvIHJ1biB0aGUgdGVzdHMuCisqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZmRlZiBIQVZFX1NURElOVF9IIAorIyBpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZzEwbGliLmgiCisjaW5jbHVkZSAiY2lwaGVyLmgiCisjaW5jbHVkZSAiaG1hYzI1Ni5oIgorCisvKiBDaGVjayBvbmUgSE1BQyB3aXRoIGRpZ2VzdCBBTEdPIHVzaW5nIHRoZSByZWd1YWxyIEhBTUMKKyAgIEFQSS4gKERBVEEsREFUQUxFTikgaXMgdGhlIGRhdGEgdG8gYmUgTUFDZWQsIChLRVksS0VZTEVOKSB0aGUga2V5CisgICBhbmQgKEVYUEVDVCxFWFBFQ1RMRU4pIHRoZSBleHBlY3RlZCByZXN1bHQuICBSZXR1cm5zIE5VTEwgb24KKyAgIHN1Y2NkZXNzIG9yIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGZhaWx1cmUuICAqLworc3RhdGljIGNvbnN0IGNoYXIgKgorY2hlY2tfb25lIChpbnQgYWxnbywKKyAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFsZW4sIAorICAgICAgICAgICBjb25zdCB2b2lkICprZXksIHNpemVfdCBrZXlsZW4sCisgICAgICAgICAgIGNvbnN0IHZvaWQgKmV4cGVjdCwgc2l6ZV90IGV4cGVjdGxlbikKK3sKKyAgZ2NyeV9tZF9oZF90IGhkOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpkaWdlc3Q7CisKKy8qICAgcHJpbnRmICgiSE1BQyBhbGdvICVkXG4iLCBhbGdvKTsgKi8KKyAgaWYgKF9nY3J5X21kX2dldF9hbGdvX2RsZW4gKGFsZ28pICE9IGV4cGVjdGxlbikKKyAgICByZXR1cm4gImludmFsaWQgdGVzdHMgZGF0YSI7CisgIGlmIChfZ2NyeV9tZF9vcGVuICgmaGQsIGFsZ28sIEdDUllfTURfRkxBR19ITUFDKSkKKyAgICByZXR1cm4gImdjcnlfbWRfb3BlbiBmYWlsZWQiOworICBpZiAoX2djcnlfbWRfc2V0a2V5IChoZCwga2V5LCBrZXlsZW4pKQorICAgIHsKKyAgICAgIF9nY3J5X21kX2Nsb3NlIChoZCk7CisgICAgICByZXR1cm4gImdjcnlfbWRfc2V0a2V5IGZhaWxlZCI7CisgICAgfQorICBfZ2NyeV9tZF93cml0ZSAoaGQsIGRhdGEsIGRhdGFsZW4pOworICBkaWdlc3QgPSBfZ2NyeV9tZF9yZWFkIChoZCwgYWxnbyk7CisgIGlmICghZGlnZXN0KQorICAgIHsKKyAgICAgIF9nY3J5X21kX2Nsb3NlIChoZCk7CisgICAgICByZXR1cm4gImdjcnlfbWRfcmVhZCBmYWlsZWQiOworICAgIH0KKyAgaWYgKG1lbWNtcCAoZGlnZXN0LCBleHBlY3QsIGV4cGVjdGxlbikpCisgICAgeworLyogICAgICAgaW50IGk7ICovCisKKy8qICAgICAgIGZwdXRzICgiICAgICAgICB7Iiwgc3Rkb3V0KTsgKi8KKy8qICAgICAgIGZvciAoaT0wOyBpIDwgZXhwZWN0bGVuLTE7IGkrKykgKi8KKy8qICAgICAgICAgeyAqLworLyogICAgICAgICAgIGlmIChpICYmICEoaSAlIDgpKSAqLworLyogICAgICAgICAgICAgZnB1dHMgKCJcbiAgICAgICAgICIsIHN0ZG91dCk7ICovCisvKiAgICAgICAgICAgcHJpbnRmICgiIDB4JTAyeCwiLCBkaWdlc3RbaV0pOyAqLworLyogICAgICAgICB9ICovCisvKiAgICAgICBwcmludGYgKCIgMHglMDJ4IH0gfSxcbiIsIGRpZ2VzdFtpXSk7ICovCisKKyAgICAgIF9nY3J5X21kX2Nsb3NlIChoZCk7CisgICAgICByZXR1cm4gImRvZXMgbm90IG1hdGNoIjsKKyAgICB9CisgIF9nY3J5X21kX2Nsb3NlIChoZCk7CisgIHJldHVybiBOVUxMOyAgCit9CisKKworc3RhdGljIGdwZ19lcnJfY29kZV90CitzZWxmdGVzdHNfc2hhMSAoaW50IGV4dGVuZGVkLCBzZWxmdGVzdF9yZXBvcnRfZnVuY190IHJlcG9ydCkKK3sKKyAgY29uc3QgY2hhciAqd2hhdDsKKyAgY29uc3QgY2hhciAqZXJydHh0OworICB1bnNpZ25lZCBjaGFyIGtleVsxMjhdOworICBpbnQgaSwgajsKKworICB3aGF0ID0gIkZJUFMtMTk4YSwgQS4xIjsKKyAgZm9yIChpPTA7IGkgPCA2NDsgaSsrKQorICAgIGtleVtpXSA9IGk7CisgIGVycnR4dCA9IGNoZWNrX29uZSAoR0NSWV9NRF9TSEExLAorICAgICAgICAgICAgICAgICAgICAgICJTYW1wbGUgIzEiLCA5LAorICAgICAgICAgICAgICAgICAgICAgIGtleSwgNjQsCisgICAgICAgICAgICAgICAgICAgICAgIlx4NGZceDRjXHhhM1x4ZDVceGQ2XHg4Ylx4YTdceGNjXHgwYVx4MTIiCisgICAgICAgICAgICAgICAgICAgICAgIlx4MDhceGM5XHhjNlx4MWVceDljXHg1ZFx4YTBceDQwXHgzY1x4MGEiLCAyMCk7CisgIGlmIChlcnJ0eHQpCisgICAgZ290byBmYWlsZWQ7CisKKyAgaWYgKGV4dGVuZGVkKQorICAgIHsKKyAgICAgIHdoYXQgPSAiRklQUy0xOThhLCBBLjIiOworICAgICAgZm9yIChpPTAsIGo9MHgzMDsgaSA8IDIwOyBpKyspCisgICAgICAgIGtleVtpXSA9IGorKzsKKyAgICAgIGVycnR4dCA9IGNoZWNrX29uZSAoR0NSWV9NRF9TSEExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiU2FtcGxlICMyIiwgOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LCAyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4MDlceDIyXHhkM1x4NDBceDVmXHhhYVx4M2RceDE5XHg0Zlx4ODIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceGE0XHg1OFx4MzBceDczXHg3ZFx4NWNceGM2XHhjN1x4NWRceDI0IiwgMjApOworICAgICAgaWYgKGVycnR4dCkKKyAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAKKyAgICAgIHdoYXQgPSAiRklQUy0xOThhLCBBLjMiOworICAgICAgZm9yIChpPTAsIGo9MHg1MDsgaSA8IDEwMDsgaSsrKQorICAgICAgICBrZXlbaV0gPSBqKys7CisgICAgICBlcnJ0eHQgPSBjaGVja19vbmUgKEdDUllfTURfU0hBMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlNhbXBsZSAjMyIsIDksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSwgMTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhiY1x4ZjRceDFlXHhhYlx4OGJceGIyXHhkOFx4MDJceGYzXHhkMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4NWNceGFmXHg3Y1x4YjBceDkyXHhlY1x4ZjhceGQxXHhhM1x4YWEiLCAyMCApOworICAgICAgaWYgKGVycnR4dCkKKyAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAKKyAgICAgIHdoYXQgPSAiRklQUy0xOThhLCBBLjQiOworICAgICAgZm9yIChpPTAsIGo9MHg3MDsgaSA8IDQ5OyBpKyspCisgICAgICAgIGtleVtpXSA9IGorKzsKKyAgICAgIGVycnR4dCA9IGNoZWNrX29uZSAoR0NSWV9NRF9TSEExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiU2FtcGxlICM0IiwgOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LCA0OSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4OWVceGE4XHg4Nlx4ZWZceGUyXHg2OFx4ZGJceGVjXHhjZVx4NDIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceDBjXHg3NVx4MjRceGRmXHgzMlx4ZTBceDc1XHgxYVx4MmFceDI2IiwgMjAgKTsKKyAgICAgIGlmIChlcnJ0eHQpCisgICAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICByZXR1cm4gMDsgLyogU3VjY2VlZGVkLiAqLworCisgZmFpbGVkOgorICBpZiAocmVwb3J0KQorICAgIHJlcG9ydCAoImhtYWMiLCBHQ1JZX01EX1NIQTEsIHdoYXQsIGVycnR4dCk7CisgIHJldHVybiBHUEdfRVJSX1NFTEZURVNUX0ZBSUxFRDsKK30KKworCisKK3N0YXRpYyBncGdfZXJyX2NvZGVfdAorc2VsZnRlc3RzX3NoYTIyNCAoaW50IGV4dGVuZGVkLCBzZWxmdGVzdF9yZXBvcnRfZnVuY190IHJlcG9ydCkKK3sKKyAgc3RhdGljIHN0cnVjdCAKKyAgeworICAgIGNvbnN0IGNoYXIgKiBjb25zdCBkZXNjOworICAgIGNvbnN0IGNoYXIgKiBjb25zdCBkYXRhOworICAgIGNvbnN0IGNoYXIgKiBjb25zdCBrZXk7CisgICAgY29uc3QgY2hhciBleHBlY3RbMjhdOworICB9IHR2W10gPQorICAgIHsKKyAgICAgIHsgImRhdGEtMjgga2V5LTQiLAorICAgICAgICAid2hhdCBkbyB5YSB3YW50IGZvciBub3RoaW5nPyIsIAorICAgICAgICAiSmVmZSIsCisgICAgICAgIHsgMHhhMywgMHgwZSwgMHgwMSwgMHgwOSwgMHg4YiwgMHhjNiwgMHhkYiwgMHhiZiwKKyAgICAgICAgICAweDQ1LCAweDY5LCAweDBmLCAweDNhLCAweDdlLCAweDllLCAweDZkLCAweDBmLAorICAgICAgICAgIDB4OGIsIDB4YmUsIDB4YTIsIDB4YTMsIDB4OWUsIDB4NjEsIDB4NDgsIDB4MDAsCisgICAgICAgICAgMHg4ZiwgMHhkMCwgMHg1ZSwgMHg0NCB9IH0sCisKKyAgICAgIHsgImRhdGEtOSBrZXktMjAiLAorICAgICAgICAiSGkgVGhlcmUiLAorCSJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiIgorICAgICAgICAiXHgwYlx4MGJceDBiXHgwYiIsCisgICAgICAgIHsgMHg4OSwgMHg2ZiwgMHhiMSwgMHgxMiwgMHg4YSwgMHhiYiwgMHhkZiwgMHgxOSwKKyAgICAgICAgICAweDY4LCAweDMyLCAweDEwLCAweDdjLCAweGQ0LCAweDlkLCAweGYzLCAweDNmLAorICAgICAgICAgIDB4NDcsIDB4YjQsIDB4YjEsIDB4MTYsIDB4OTksIDB4MTIsIDB4YmEsIDB4NGYsCisgICAgICAgICAgMHg1MywgMHg2OCwgMHg0YiwgMHgyMiB9IH0sCisKKyAgICAgIHsgImRhdGEtNTAga2V5LTIwIiwKKyAgICAgICAgIlx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGQiCisgICAgICAgICJceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkIgorICAgICAgICAiXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZCIKKyAgICAgICAgIlx4ZGRceGRkIiwKKwkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKyAgICAgICAgIlx4YWFceGFhXHhhYVx4YWEiLAorICAgICAgICB7IDB4N2YsIDB4YjMsIDB4Y2IsIDB4MzUsIDB4ODgsIDB4YzYsIDB4YzEsIDB4ZjYsCisgICAgICAgICAgMHhmZiwgMHhhOSwgMHg2OSwgMHg0ZCwgMHg3ZCwgMHg2YSwgMHhkMiwgMHg2NCwKKyAgICAgICAgICAweDkzLCAweDY1LCAweGIwLCAweGMxLCAweGY2LCAweDVkLCAweDY5LCAweGQxLAorICAgICAgICAgIDB4ZWMsIDB4ODMsIDB4MzMsIDB4ZWEgfSB9LAorCisgICAgICB7ICJkYXRhLTUwIGtleS0yNiIsCisgICAgICAgICJceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkIgorICAgICAgICAiXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZCIKKyAgICAgICAgIlx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2QiCisgICAgICAgICJceGNkXHhjZCIsCisJIlx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDdceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZlx4MTAiCisgICAgICAgICJceDExXHgxMlx4MTNceDE0XHgxNVx4MTZceDE3XHgxOFx4MTkiLAorICAgICAgICB7IDB4NmMsIDB4MTEsIDB4NTAsIDB4NjgsIDB4NzQsIDB4MDEsIDB4M2MsIDB4YWMsCisgICAgICAgICAgMHg2YSwgMHgyYSwgMHhiYywgMHgxYiwgMHhiMywgMHg4MiwgMHg2MiwgMHg3YywKKyAgICAgICAgICAweGVjLCAweDZhLCAweDkwLCAweGQ4LCAweDZlLCAweGZjLCAweDAxLCAweDJkLAorICAgICAgICAgIDB4ZTcsIDB4YWYsIDB4ZWMsIDB4NWEgfSB9LAorCisgICAgICB7ICJkYXRhLTU0IGtleS0xMzEiLAorICAgICAgICAiVGVzdCBVc2luZyBMYXJnZXIgVGhhbiBCbG9jay1TaXplIEtleSAtIEhhc2ggS2V5IEZpcnN0IiwKKwkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKyAgICAgICAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisgICAgICAgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorICAgICAgICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKyAgICAgICAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisgICAgICAgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorICAgICAgICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKyAgICAgICAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisgICAgICAgICJceGFhXHhhYVx4YWEiLAorICAgICAgICB7IDB4OTUsIDB4ZTksIDB4YTAsIDB4ZGIsIDB4OTYsIDB4MjAsIDB4OTUsIDB4YWQsCisgICAgICAgICAgMHhhZSwgMHhiZSwgMHg5YiwgMHgyZCwgMHg2ZiwgMHgwZCwgMHhiYywgMHhlMiwKKyAgICAgICAgICAweGQ0LCAweDk5LCAweGYxLCAweDEyLCAweGYyLCAweGQyLCAweGI3LCAweDI3LAorICAgICAgICAgIDB4M2YsIDB4YTYsIDB4ODcsIDB4MGUgfSB9LAorCisgICAgICB7ICJkYXRhLTE1MiBrZXktMTMxIiwKKyAgICAgICAgIlRoaXMgaXMgYSB0ZXN0IHVzaW5nIGEgbGFyZ2VyIHRoYW4gYmxvY2stc2l6ZSBrZXkgYW5kIGEgbGFyZ2VyICIKKyAgICAgICAgInRoYW4gYmxvY2stc2l6ZSBkYXRhLiBUaGUga2V5IG5lZWRzIHRvIGJlIGhhc2hlZCBiZWZvcmUgYmVpbmcgIgorICAgICAgICAidXNlZCBieSB0aGUgSE1BQyBhbGdvcml0aG0uIiwKKwkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKyAgICAgICAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisgICAgICAgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorICAgICAgICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKyAgICAgICAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisgICAgICAgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorICAgICAgICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKyAgICAgICAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisgICAgICAgICJceGFhXHhhYVx4YWEiLAorICAgICAgICB7IDB4M2EsIDB4ODUsIDB4NDEsIDB4NjYsIDB4YWMsIDB4NWQsIDB4OWYsIDB4MDIsCisgICAgICAgICAgMHgzZiwgMHg1NCwgMHhkNSwgMHgxNywgMHhkMCwgMHhiMywgMHg5ZCwgMHhiZCwKKyAgICAgICAgICAweDk0LCAweDY3LCAweDcwLCAweGRiLCAweDljLCAweDJiLCAweDk1LCAweGM5LAorICAgICAgICAgIDB4ZjYsIDB4ZjUsIDB4NjUsIDB4ZDEgfSB9LAorCisgICAgICB7IE5VTEwgfQorICAgIH07CisgIGNvbnN0IGNoYXIgKndoYXQ7CisgIGNvbnN0IGNoYXIgKmVycnR4dDsKKyAgaW50IHR2aWR4OworICAKKyAgZm9yICh0dmlkeD0wOyB0dlt0dmlkeF0uZGVzYzsgdHZpZHgrKykKKyAgICB7CisgICAgICB3aGF0ID0gdHZbdHZpZHhdLmRlc2M7CisgICAgICBlcnJ0eHQgPSBjaGVja19vbmUgKEdDUllfTURfU0hBMjI0LAorICAgICAgICAgICAgICAgICAgICAgICAgICB0dlt0dmlkeF0uZGF0YSwgc3RybGVuICh0dlt0dmlkeF0uZGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR2W3R2aWR4XS5rZXksIHN0cmxlbiAodHZbdHZpZHhdLmtleSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR2W3R2aWR4XS5leHBlY3QsIERJTSAodHZbdHZpZHhdLmV4cGVjdCkgKTsKKyAgICAgIGlmIChlcnJ0eHQpCisgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgaWYgKCFleHRlbmRlZCkKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgIHJldHVybiAwOyAvKiBTdWNjZWVkZWQuICovCisKKyBmYWlsZWQ6CisgIGlmIChyZXBvcnQpCisgICAgcmVwb3J0ICgiaG1hYyIsIEdDUllfTURfU0hBMjI0LCB3aGF0LCBlcnJ0eHQpOworICByZXR1cm4gR1BHX0VSUl9TRUxGVEVTVF9GQUlMRUQ7Cit9CisKKworc3RhdGljIGdwZ19lcnJfY29kZV90CitzZWxmdGVzdHNfc2hhMjU2IChpbnQgZXh0ZW5kZWQsIHNlbGZ0ZXN0X3JlcG9ydF9mdW5jX3QgcmVwb3J0KQoreworICBzdGF0aWMgc3RydWN0IAorICB7CisgICAgY29uc3QgY2hhciAqIGNvbnN0IGRlc2M7CisgICAgY29uc3QgY2hhciAqIGNvbnN0IGRhdGE7CisgICAgY29uc3QgY2hhciAqIGNvbnN0IGtleTsKKyAgICBjb25zdCBjaGFyIGV4cGVjdFszMl07CisgIH0gdHZbXSA9CisgICAgeworICAgICAgeyAiZGF0YS0yOCBrZXktNCIsCisgICAgICAgICJ3aGF0IGRvIHlhIHdhbnQgZm9yIG5vdGhpbmc/IiwgCisgICAgICAgICJKZWZlIiwKKwl7IDB4NWIsIDB4ZGMsIDB4YzEsIDB4NDYsIDB4YmYsIDB4NjAsIDB4NzUsIDB4NGUsCisgICAgICAgICAgMHg2YSwgMHgwNCwgMHgyNCwgMHgyNiwgMHgwOCwgMHg5NSwgMHg3NSwgMHhjNywKKyAgICAgICAgICAweDVhLCAweDAwLCAweDNmLCAweDA4LCAweDlkLCAweDI3LCAweDM5LCAweDgzLAorICAgICAgICAgIDB4OWQsIDB4ZWMsIDB4NTgsIDB4YjksIDB4NjQsIDB4ZWMsIDB4MzgsIDB4NDMgfSB9LAorCisgICAgICB7ICJkYXRhLTkga2V5LTIwIiwKKyAgICAgICAgIkhpIFRoZXJlIiwKKwkiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYiIKKyAgICAgICAgIlx4MGJceDBiXHgwYlx4MGIiLAorICAgICAgICB7IDB4YjAsIDB4MzQsIDB4NGMsIDB4NjEsIDB4ZDgsIDB4ZGIsIDB4MzgsIDB4NTMsCisgICAgICAgICAgMHg1YywgMHhhOCwgMHhhZiwgMHhjZSwgMHhhZiwgMHgwYiwgMHhmMSwgMHgyYiwKKyAgICAgICAgICAweDg4LCAweDFkLCAweGMyLCAweDAwLCAweGM5LCAweDgzLCAweDNkLCAweGE3LAorICAgICAgICAgIDB4MjYsIDB4ZTksIDB4MzcsIDB4NmMsIDB4MmUsIDB4MzIsIDB4Y2YsIDB4ZjcgfSB9LAorCisgICAgICB7ICJkYXRhLTUwIGtleS0yMCIsCisgICAgICAgICJceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkIgorICAgICAgICAiXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZCIKKyAgICAgICAgIlx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGQiCisgICAgICAgICJceGRkXHhkZCIsCisJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisgICAgICAgICJceGFhXHhhYVx4YWFceGFhIiwKKyAgICAgICAgeyAweDc3LCAweDNlLCAweGE5LCAweDFlLCAweDM2LCAweDgwLCAweDBlLCAweDQ2LAorICAgICAgICAgIDB4ODUsIDB4NGQsIDB4YjgsIDB4ZWIsIDB4ZDAsIDB4OTEsIDB4ODEsIDB4YTcsCisgICAgICAgICAgMHgyOSwgMHg1OSwgMHgwOSwgMHg4YiwgMHgzZSwgMHhmOCwgMHhjMSwgMHgyMiwKKyAgICAgICAgICAweGQ5LCAweDYzLCAweDU1LCAweDE0LCAweGNlLCAweGQ1LCAweDY1LCAweGZlIH0gfSwKKworICAgICAgeyAiZGF0YS01MCBrZXktMjYiLAorICAgICAgICAiXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZCIKKyAgICAgICAgIlx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2QiCisgICAgICAgICJceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkIgorICAgICAgICAiXHhjZFx4Y2QiLAorCSJceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3XHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGZceDEwIgorICAgICAgICAiXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxN1x4MThceDE5IiwKKwl7IDB4ODIsIDB4NTUsIDB4OGEsIDB4MzgsIDB4OWEsIDB4NDQsIDB4M2MsIDB4MGUsCisgICAgICAgICAgMHhhNCwgMHhjYywgMHg4MSwgMHg5OCwgMHg5OSwgMHhmMiwgMHgwOCwgMHgzYSwKKyAgICAgICAgICAweDg1LCAweGYwLCAweGZhLCAweGEzLCAweGU1LCAweDc4LCAweGY4LCAweDA3LAorICAgICAgICAgIDB4N2EsIDB4MmUsIDB4M2YsIDB4ZjQsIDB4NjcsIDB4MjksIDB4NjYsIDB4NWIgfSB9LAorCisgICAgICB7ICJkYXRhLTU0IGtleS0xMzEiLAorICAgICAgICAiVGVzdCBVc2luZyBMYXJnZXIgVGhhbiBCbG9jay1TaXplIEtleSAtIEhhc2ggS2V5IEZpcnN0IiwKKwkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKyAgICAgICAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisgICAgICAgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorICAgICAgICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKyAgICAgICAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisgICAgICAgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorICAgICAgICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKyAgICAgICAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisgICAgICAgICJceGFhXHhhYVx4YWEiLAorCXsgMHg2MCwgMHhlNCwgMHgzMSwgMHg1OSwgMHgxZSwgMHhlMCwgMHhiNiwgMHg3ZiwKKyAgICAgICAgICAweDBkLCAweDhhLCAweDI2LCAweGFhLCAweGNiLCAweGY1LCAweGI3LCAweDdmLAorICAgICAgICAgIDB4OGUsIDB4MGIsIDB4YzYsIDB4MjEsIDB4MzcsIDB4MjgsIDB4YzUsIDB4MTQsCisgICAgICAgICAgMHgwNSwgMHg0NiwgMHgwNCwgMHgwZiwgMHgwZSwgMHhlMywgMHg3ZiwgMHg1NCB9IH0sCisKKyAgICAgIHsgImRhdGEtMTUyIGtleS0xMzEiLAorICAgICAgICAiVGhpcyBpcyBhIHRlc3QgdXNpbmcgYSBsYXJnZXIgdGhhbiBibG9jay1zaXplIGtleSBhbmQgYSBsYXJnZXIgIgorICAgICAgICAidGhhbiBibG9jay1zaXplIGRhdGEuIFRoZSBrZXkgbmVlZHMgdG8gYmUgaGFzaGVkIGJlZm9yZSBiZWluZyAiCisgICAgICAgICJ1c2VkIGJ5IHRoZSBITUFDIGFsZ29yaXRobS4iLAorCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorICAgICAgICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKyAgICAgICAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisgICAgICAgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorICAgICAgICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKyAgICAgICAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisgICAgICAgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorICAgICAgICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKyAgICAgICAgIlx4YWFceGFhXHhhYSIsCisJeyAweDliLCAweDA5LCAweGZmLCAweGE3LCAweDFiLCAweDk0LCAweDJmLCAweGNiLAorICAgICAgICAgIDB4MjcsIDB4NjMsIDB4NWYsIDB4YmMsIDB4ZDUsIDB4YjAsIDB4ZTksIDB4NDQsCisgICAgICAgICAgMHhiZiwgMHhkYywgMHg2MywgMHg2NCwgMHg0ZiwgMHgwNywgMHgxMywgMHg5MywKKyAgICAgICAgICAweDhhLCAweDdmLCAweDUxLCAweDUzLCAweDVjLCAweDNhLCAweDM1LCAweGUyIH0gfSwKKworICAgICAgeyBOVUxMIH0KKyAgICB9OworICBjb25zdCBjaGFyICp3aGF0OworICBjb25zdCBjaGFyICplcnJ0eHQ7CisgIGludCB0dmlkeDsKKyAgCisgIGZvciAodHZpZHg9MDsgdHZbdHZpZHhdLmRlc2M7IHR2aWR4KyspCisgICAgeworICAgICAgaG1hYzI1Nl9jb250ZXh0X3QgaG1hY2hkOworICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGlnZXN0OworICAgICAgc2l6ZV90IGRsZW47CisKKyAgICAgIHdoYXQgPSB0dlt0dmlkeF0uZGVzYzsKKyAgICAgIGVycnR4dCA9IGNoZWNrX29uZSAoR0NSWV9NRF9TSEEyNTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR2W3R2aWR4XS5kYXRhLCBzdHJsZW4gKHR2W3R2aWR4XS5kYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHZbdHZpZHhdLmtleSwgc3RybGVuICh0dlt0dmlkeF0ua2V5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHZbdHZpZHhdLmV4cGVjdCwgRElNICh0dlt0dmlkeF0uZXhwZWN0KSApOworICAgICAgaWYgKGVycnR4dCkKKyAgICAgICAgZ290byBmYWlsZWQ7CisKKyAgICAgIGhtYWNoZCA9IF9nY3J5X2htYWMyNTZfbmV3ICh0dlt0dmlkeF0ua2V5LCBzdHJsZW4gKHR2W3R2aWR4XS5rZXkpKTsKKyAgICAgIGlmICghaG1hY2hkKQorICAgICAgICB7CisgICAgICAgICAgZXJydHh0ID0gIl9nY3J5X2htYWMyNTZfbmV3IGZhaWxlZCI7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICAgIF9nY3J5X2htYWMyNTZfdXBkYXRlIChobWFjaGQsIHR2W3R2aWR4XS5kYXRhLCBzdHJsZW4gKHR2W3R2aWR4XS5kYXRhKSk7CisgICAgICBkaWdlc3QgPSBfZ2NyeV9obWFjMjU2X2ZpbmFsaXplIChobWFjaGQsICZkbGVuKTsKKyAgICAgIGlmICghZGlnZXN0KQorICAgICAgICB7CisgICAgICAgICAgZXJydHh0ID0gIl9nY3J5X2htYWMyNTZfZmluYWxpemUgZmFpbGVkIjsKKyAgICAgICAgICBfZ2NyeV9obWFjMjU2X3JlbGVhc2UgKGhtYWNoZCk7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICAgIGlmIChkbGVuICE9IERJTSAodHZbdHZpZHhdLmV4cGVjdCkKKyAgICAgICAgICB8fCBtZW1jbXAgKGRpZ2VzdCwgdHZbdHZpZHhdLmV4cGVjdCwgRElNICh0dlt0dmlkeF0uZXhwZWN0KSkpCisgICAgICAgIHsKKyAgICAgICAgICBlcnJ0eHQgPSAiZG9lcyBub3QgbWF0Y2ggaW4gc2Vjb25kIGltcGxlbWVudGF0aW9uIjsKKyAgICAgICAgICBfZ2NyeV9obWFjMjU2X3JlbGVhc2UgKGhtYWNoZCk7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICAgIF9nY3J5X2htYWMyNTZfcmVsZWFzZSAoaG1hY2hkKTsKKworICAgICAgaWYgKCFleHRlbmRlZCkKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgIHJldHVybiAwOyAvKiBTdWNjZWVkZWQuICovCisKKyBmYWlsZWQ6CisgIGlmIChyZXBvcnQpCisgICAgcmVwb3J0ICgiaG1hYyIsIEdDUllfTURfU0hBMjU2LCB3aGF0LCBlcnJ0eHQpOworICByZXR1cm4gR1BHX0VSUl9TRUxGVEVTVF9GQUlMRUQ7Cit9CisKKworc3RhdGljIGdwZ19lcnJfY29kZV90CitzZWxmdGVzdHNfc2hhMzg0IChpbnQgZXh0ZW5kZWQsIHNlbGZ0ZXN0X3JlcG9ydF9mdW5jX3QgcmVwb3J0KQoreworICBzdGF0aWMgc3RydWN0IAorICB7CisgICAgY29uc3QgY2hhciAqIGNvbnN0IGRlc2M7CisgICAgY29uc3QgY2hhciAqIGNvbnN0IGRhdGE7CisgICAgY29uc3QgY2hhciAqIGNvbnN0IGtleTsKKyAgICBjb25zdCBjaGFyIGV4cGVjdFs0OF07CisgIH0gdHZbXSA9CisgICAgeworICAgICAgeyAiZGF0YS0yOCBrZXktNCIsCisgICAgICAgICJ3aGF0IGRvIHlhIHdhbnQgZm9yIG5vdGhpbmc/IiwgCisgICAgICAgICJKZWZlIiwKKyAgICAgICAgeyAweGFmLCAweDQ1LCAweGQyLCAweGUzLCAweDc2LCAweDQ4LCAweDQwLCAweDMxLAorICAgICAgICAgIDB4NjEsIDB4N2YsIDB4NzgsIDB4ZDIsIDB4YjUsIDB4OGEsIDB4NmIsIDB4MWIsCisgICAgICAgICAgMHg5YywgMHg3ZSwgMHhmNCwgMHg2NCwgMHhmNSwgMHhhMCwgMHgxYiwgMHg0NywKKyAgICAgICAgICAweGU0LCAweDJlLCAweGMzLCAweDczLCAweDYzLCAweDIyLCAweDQ0LCAweDVlLAorICAgICAgICAgIDB4OGUsIDB4MjIsIDB4NDAsIDB4Y2EsIDB4NWUsIDB4NjksIDB4ZTIsIDB4YzcsCisgICAgICAgICAgMHg4YiwgMHgzMiwgMHgzOSwgMHhlYywgMHhmYSwgMHhiMiwgMHgxNiwgMHg0OSB9IH0sCisKKyAgICAgIHsgImRhdGEtOSBrZXktMjAiLAorICAgICAgICAiSGkgVGhlcmUiLAorCSJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiIgorICAgICAgICAiXHgwYlx4MGJceDBiXHgwYiIsCisgICAgICAgIHsgMHhhZiwgMHhkMCwgMHgzOSwgMHg0NCwgMHhkOCwgMHg0OCwgMHg5NSwgMHg2MiwKKyAgICAgICAgICAweDZiLCAweDA4LCAweDI1LCAweGY0LCAweGFiLCAweDQ2LCAweDkwLCAweDdmLAorICAgICAgICAgIDB4MTUsIDB4ZjksIDB4ZGEsIDB4ZGIsIDB4ZTQsIDB4MTAsIDB4MWUsIDB4YzYsCisgICAgICAgICAgMHg4MiwgMHhhYSwgMHgwMywgMHg0YywgMHg3YywgMHhlYiwgMHhjNSwgMHg5YywKKyAgICAgICAgICAweGZhLCAweGVhLCAweDllLCAweGE5LCAweDA3LCAweDZlLCAweGRlLCAweDdmLAorICAgICAgICAgIDB4NGEsIDB4ZjEsIDB4NTIsIDB4ZTgsIDB4YjIsIDB4ZmEsIDB4OWMsIDB4YjYgfSB9LAorCisgICAgICB7ICJkYXRhLTUwIGtleS0yMCIsCisgICAgICAgICJceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkIgorICAgICAgICAiXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZCIKKyAgICAgICAgIlx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGQiCisgICAgICAgICJceGRkXHhkZCIsCisJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisgICAgICAgICJceGFhXHhhYVx4YWFceGFhIiwKKyAgICAgICAgeyAweDg4LCAweDA2LCAweDI2LCAweDA4LCAweGQzLCAweGU2LCAweGFkLCAweDhhLAorICAgICAgICAgIDB4MGEsIDB4YTIsIDB4YWMsIDB4ZTAsIDB4MTQsIDB4YzgsIDB4YTgsIDB4NmYsCisgICAgICAgICAgMHgwYSwgMHhhNiwgMHgzNSwgMHhkOSwgMHg0NywgMHhhYywgMHg5ZiwgMHhlYiwKKyAgICAgICAgICAweGU4LCAweDNlLCAweGY0LCAweGU1LCAweDU5LCAweDY2LCAweDE0LCAweDRiLAorICAgICAgICAgIDB4MmEsIDB4NWEsIDB4YjMsIDB4OWQsIDB4YzEsIDB4MzgsIDB4MTQsIDB4YjksCisgICAgICAgICAgMHg0ZSwgMHgzYSwgMHhiNiwgMHhlMSwgMHgwMSwgMHhhMywgMHg0ZiwgMHgyNyB9IH0sCisKKyAgICAgIHsgImRhdGEtNTAga2V5LTI2IiwKKyAgICAgICAgIlx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2QiCisgICAgICAgICJceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkIgorICAgICAgICAiXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZCIKKyAgICAgICAgIlx4Y2RceGNkIiwKKwkiXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwN1x4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmXHgxMCIKKyAgICAgICAgIlx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTdceDE4XHgxOSIsCisgICAgICAgIHsgMHgzZSwgMHg4YSwgMHg2OSwgMHhiNywgMHg3OCwgMHgzYywgMHgyNSwgMHg4NSwKKyAgICAgICAgICAweDE5LCAweDMzLCAweGFiLCAweDYyLCAweDkwLCAweGFmLCAweDZjLCAweGE3LAorICAgICAgICAgIDB4N2EsIDB4OTksIDB4ODEsIDB4NDgsIDB4MDgsIDB4NTAsIDB4MDAsIDB4OWMsCisgICAgICAgICAgMHhjNSwgMHg1NywgMHg3YywgMHg2ZSwgMHgxZiwgMHg1NywgMHgzYiwgMHg0ZSwKKyAgICAgICAgICAweDY4LCAweDAxLCAweGRkLCAweDIzLCAweGM0LCAweGE3LCAweGQ2LCAweDc5LAorICAgICAgICAgIDB4Y2MsIDB4ZjgsIDB4YTMsIDB4ODYsIDB4YzYsIDB4NzQsIDB4Y2YsIDB4ZmIgfSB9LAorCisgICAgICB7ICJkYXRhLTU0IGtleS0xMzEiLAorICAgICAgICAiVGVzdCBVc2luZyBMYXJnZXIgVGhhbiBCbG9jay1TaXplIEtleSAtIEhhc2ggS2V5IEZpcnN0IiwKKwkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKyAgICAgICAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisgICAgICAgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorICAgICAgICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKyAgICAgICAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisgICAgICAgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorICAgICAgICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKyAgICAgICAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisgICAgICAgICJceGFhXHhhYVx4YWEiLAorICAgICAgICB7IDB4NGUsIDB4Y2UsIDB4MDgsIDB4NDQsIDB4ODUsIDB4ODEsIDB4M2UsIDB4OTAsCisgICAgICAgICAgMHg4OCwgMHhkMiwgMHhjNiwgMHgzYSwgMHgwNCwgMHgxYiwgMHhjNSwgMHhiNCwKKyAgICAgICAgICAweDRmLCAweDllLCAweGYxLCAweDAxLCAweDJhLCAweDJiLCAweDU4LCAweDhmLAorICAgICAgICAgIDB4M2MsIDB4ZDEsIDB4MWYsIDB4MDUsIDB4MDMsIDB4M2EsIDB4YzQsIDB4YzYsCisgICAgICAgICAgMHgwYywgMHgyZSwgMHhmNiwgMHhhYiwgMHg0MCwgMHgzMCwgMHhmZSwgMHg4MiwKKyAgICAgICAgICAweDk2LCAweDI0LCAweDhkLCAweGYxLCAweDYzLCAweGY0LCAweDQ5LCAweDUyIH0gfSwKKworICAgICAgeyAiZGF0YS0xNTIga2V5LTEzMSIsCisgICAgICAgICJUaGlzIGlzIGEgdGVzdCB1c2luZyBhIGxhcmdlciB0aGFuIGJsb2NrLXNpemUga2V5IGFuZCBhIGxhcmdlciAiCisgICAgICAgICJ0aGFuIGJsb2NrLXNpemUgZGF0YS4gVGhlIGtleSBuZWVkcyB0byBiZSBoYXNoZWQgYmVmb3JlIGJlaW5nICIKKyAgICAgICAgInVzZWQgYnkgdGhlIEhNQUMgYWxnb3JpdGhtLiIsCisJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisgICAgICAgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorICAgICAgICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKyAgICAgICAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisgICAgICAgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorICAgICAgICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKyAgICAgICAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisgICAgICAgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorICAgICAgICAiXHhhYVx4YWFceGFhIiwKKyAgICAgICAgeyAweDY2LCAweDE3LCAweDE3LCAweDhlLCAweDk0LCAweDFmLCAweDAyLCAweDBkLAorICAgICAgICAgIDB4MzUsIDB4MWUsIDB4MmYsIDB4MjUsIDB4NGUsIDB4OGYsIDB4ZDMsIDB4MmMsCisgICAgICAgICAgMHg2MCwgMHgyNCwgMHgyMCwgMHhmZSwgMHhiMCwgMHhiOCwgMHhmYiwgMHg5YSwKKyAgICAgICAgICAweGRjLCAweGNlLCAweGJiLCAweDgyLCAweDQ2LCAweDFlLCAweDk5LCAweGM1LAorICAgICAgICAgIDB4YTYsIDB4NzgsIDB4Y2MsIDB4MzEsIDB4ZTcsIDB4OTksIDB4MTcsIDB4NmQsCisgICAgICAgICAgMHgzOCwgMHg2MCwgMHhlNiwgMHgxMSwgMHgwYywgMHg0NiwgMHg1MiwgMHgzZSB9IH0sCisKKyAgICAgIHsgTlVMTCB9CisgICAgfTsKKyAgY29uc3QgY2hhciAqd2hhdDsKKyAgY29uc3QgY2hhciAqZXJydHh0OworICBpbnQgdHZpZHg7CisgIAorICBmb3IgKHR2aWR4PTA7IHR2W3R2aWR4XS5kZXNjOyB0dmlkeCsrKQorICAgIHsKKyAgICAgIHdoYXQgPSB0dlt0dmlkeF0uZGVzYzsKKyAgICAgIGVycnR4dCA9IGNoZWNrX29uZSAoR0NSWV9NRF9TSEEzODQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR2W3R2aWR4XS5kYXRhLCBzdHJsZW4gKHR2W3R2aWR4XS5kYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHZbdHZpZHhdLmtleSwgc3RybGVuICh0dlt0dmlkeF0ua2V5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHZbdHZpZHhdLmV4cGVjdCwgRElNICh0dlt0dmlkeF0uZXhwZWN0KSApOworICAgICAgaWYgKGVycnR4dCkKKyAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICBpZiAoIWV4dGVuZGVkKQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgcmV0dXJuIDA7IC8qIFN1Y2NlZWRlZC4gKi8KKworIGZhaWxlZDoKKyAgaWYgKHJlcG9ydCkKKyAgICByZXBvcnQgKCJobWFjIiwgR0NSWV9NRF9TSEEzODQsIHdoYXQsIGVycnR4dCk7CisgIHJldHVybiBHUEdfRVJSX1NFTEZURVNUX0ZBSUxFRDsKK30KKworCitzdGF0aWMgZ3BnX2Vycl9jb2RlX3QKK3NlbGZ0ZXN0c19zaGE1MTIgKGludCBleHRlbmRlZCwgc2VsZnRlc3RfcmVwb3J0X2Z1bmNfdCByZXBvcnQpCit7CisgIHN0YXRpYyBzdHJ1Y3QgCisgIHsKKyAgICBjb25zdCBjaGFyICogY29uc3QgZGVzYzsKKyAgICBjb25zdCBjaGFyICogY29uc3QgZGF0YTsKKyAgICBjb25zdCBjaGFyICogY29uc3Qga2V5OworICAgIGNvbnN0IGNoYXIgZXhwZWN0WzY0XTsKKyAgfSB0dltdID0KKyAgICB7CisgICAgICB7ICJkYXRhLTI4IGtleS00IiwKKyAgICAgICAgIndoYXQgZG8geWEgd2FudCBmb3Igbm90aGluZz8iLCAKKyAgICAgICAgIkplZmUiLAorICAgICAgICB7IDB4MTYsIDB4NGIsIDB4N2EsIDB4N2IsIDB4ZmMsIDB4ZjgsIDB4MTksIDB4ZTIsCisgICAgICAgICAgMHhlMywgMHg5NSwgMHhmYiwgMHhlNywgMHgzYiwgMHg1NiwgMHhlMCwgMHhhMywKKyAgICAgICAgICAweDg3LCAweGJkLCAweDY0LCAweDIyLCAweDJlLCAweDgzLCAweDFmLCAweGQ2LAorICAgICAgICAgIDB4MTAsIDB4MjcsIDB4MGMsIDB4ZDcsIDB4ZWEsIDB4MjUsIDB4MDUsIDB4NTQsCisgICAgICAgICAgMHg5NywgMHg1OCwgMHhiZiwgMHg3NSwgMHhjMCwgMHg1YSwgMHg5OSwgMHg0YSwKKyAgICAgICAgICAweDZkLCAweDAzLCAweDRmLCAweDY1LCAweGY4LCAweGYwLCAweGU2LCAweGZkLAorICAgICAgICAgIDB4Y2EsIDB4ZWEsIDB4YjEsIDB4YTMsIDB4NGQsIDB4NGEsIDB4NmIsIDB4NGIsCisgICAgICAgICAgMHg2MywgMHg2ZSwgMHgwNywgMHgwYSwgMHgzOCwgMHhiYywgMHhlNywgMHgzNyB9IH0sCisKKyAgICAgIHsgImRhdGEtOSBrZXktMjAiLAorICAgICAgICAiSGkgVGhlcmUiLAorCSJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiIgorICAgICAgICAiXHgwYlx4MGJceDBiXHgwYiIsCisgICAgICAgIHsgMHg4NywgMHhhYSwgMHg3YywgMHhkZSwgMHhhNSwgMHhlZiwgMHg2MSwgMHg5ZCwKKyAgICAgICAgICAweDRmLCAweGYwLCAweGI0LCAweDI0LCAweDFhLCAweDFkLCAweDZjLCAweGIwLAorICAgICAgICAgIDB4MjMsIDB4NzksIDB4ZjQsIDB4ZTIsIDB4Y2UsIDB4NGUsIDB4YzIsIDB4NzgsCisgICAgICAgICAgMHg3YSwgMHhkMCwgMHhiMywgMHgwNSwgMHg0NSwgMHhlMSwgMHg3YywgMHhkZSwKKyAgICAgICAgICAweGRhLCAweGE4LCAweDMzLCAweGI3LCAweGQ2LCAweGI4LCAweGE3LCAweDAyLAorICAgICAgICAgIDB4MDMsIDB4OGIsIDB4MjcsIDB4NGUsIDB4YWUsIDB4YTMsIDB4ZjQsIDB4ZTQsCisgICAgICAgICAgMHhiZSwgMHg5ZCwgMHg5MSwgMHg0ZSwgMHhlYiwgMHg2MSwgMHhmMSwgMHg3MCwKKyAgICAgICAgICAweDJlLCAweDY5LCAweDZjLCAweDIwLCAweDNhLCAweDEyLCAweDY4LCAweDU0IH0gfSwKKworICAgICAgeyAiZGF0YS01MCBrZXktMjAiLAorICAgICAgICAiXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZCIKKyAgICAgICAgIlx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGQiCisgICAgICAgICJceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkIgorICAgICAgICAiXHhkZFx4ZGQiLAorCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorICAgICAgICAiXHhhYVx4YWFceGFhXHhhYSIsCisgICAgICAgIHsgMHhmYSwgMHg3MywgMHhiMCwgMHgwOCwgMHg5ZCwgMHg1NiwgMHhhMiwgMHg4NCwKKyAgICAgICAgICAweGVmLCAweGIwLCAweGYwLCAweDc1LCAweDZjLCAweDg5LCAweDBiLCAweGU5LAorICAgICAgICAgIDB4YjEsIDB4YjUsIDB4ZGIsIDB4ZGQsIDB4OGUsIDB4ZTgsIDB4MWEsIDB4MzYsCisgICAgICAgICAgMHg1NSwgMHhmOCwgMHgzZSwgMHgzMywgMHhiMiwgMHgyNywgMHg5ZCwgMHgzOSwKKyAgICAgICAgICAweGJmLCAweDNlLCAweDg0LCAweDgyLCAweDc5LCAweGE3LCAweDIyLCAweGM4LAorICAgICAgICAgIDB4MDYsIDB4YjQsIDB4ODUsIDB4YTQsIDB4N2UsIDB4NjcsIDB4YzgsIDB4MDcsCisgICAgICAgICAgMHhiOSwgMHg0NiwgMHhhMywgMHgzNywgMHhiZSwgMHhlOCwgMHg5NCwgMHgyNiwKKyAgICAgICAgICAweDc0LCAweDI3LCAweDg4LCAweDU5LCAweGUxLCAweDMyLCAweDkyLCAweGZiIH0gfSwKKworICAgICAgeyAiZGF0YS01MCBrZXktMjYiLAorICAgICAgICAiXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZCIKKyAgICAgICAgIlx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2QiCisgICAgICAgICJceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkIgorICAgICAgICAiXHhjZFx4Y2QiLAorCSJceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3XHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGZceDEwIgorICAgICAgICAiXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxN1x4MThceDE5IiwKKyAgICAgICAgeyAweGIwLCAweGJhLCAweDQ2LCAweDU2LCAweDM3LCAweDQ1LCAweDhjLCAweDY5LAorICAgICAgICAgIDB4OTAsIDB4ZTUsIDB4YTgsIDB4YzUsIDB4ZjYsIDB4MWQsIDB4NGEsIDB4ZjcsCisgICAgICAgICAgMHhlNSwgMHg3NiwgMHhkOSwgMHg3ZiwgMHhmOSwgMHg0YiwgMHg4NywgMHgyZCwKKyAgICAgICAgICAweGU3LCAweDZmLCAweDgwLCAweDUwLCAweDM2LCAweDFlLCAweGUzLCAweGRiLAorICAgICAgICAgIDB4YTksIDB4MWMsIDB4YTUsIDB4YzEsIDB4MWEsIDB4YTIsIDB4NWUsIDB4YjQsCisgICAgICAgICAgMHhkNiwgMHg3OSwgMHgyNywgMHg1YywgMHhjNSwgMHg3OCwgMHg4MCwgMHg2MywKKyAgICAgICAgICAweGE1LCAweGYxLCAweDk3LCAweDQxLCAweDEyLCAweDBjLCAweDRmLCAweDJkLAorICAgICAgICAgIDB4ZTIsIDB4YWQsIDB4ZWIsIDB4ZWIsIDB4MTAsIDB4YTIsIDB4OTgsIDB4ZGQgfSB9LAorCisgICAgICB7ICJkYXRhLTU0IGtleS0xMzEiLAorICAgICAgICAiVGVzdCBVc2luZyBMYXJnZXIgVGhhbiBCbG9jay1TaXplIEtleSAtIEhhc2ggS2V5IEZpcnN0IiwKKwkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKyAgICAgICAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisgICAgICAgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorICAgICAgICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKyAgICAgICAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisgICAgICAgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorICAgICAgICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKyAgICAgICAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisgICAgICAgICJceGFhXHhhYVx4YWEiLAorICAgICAgICB7IDB4ODAsIDB4YjIsIDB4NDIsIDB4NjMsIDB4YzcsIDB4YzEsIDB4YTMsIDB4ZWIsCisgICAgICAgICAgMHhiNywgMHgxNCwgMHg5MywgMHhjMSwgMHhkZCwgMHg3YiwgMHhlOCwgMHhiNCwKKyAgICAgICAgICAweDliLCAweDQ2LCAweGQxLCAweGY0LCAweDFiLCAweDRhLCAweGVlLCAweGMxLAorICAgICAgICAgIDB4MTIsIDB4MWIsIDB4MDEsIDB4MzcsIDB4ODMsIDB4ZjgsIDB4ZjMsIDB4NTIsCisgICAgICAgICAgMHg2YiwgMHg1NiwgMHhkMCwgMHgzNywgMHhlMCwgMHg1ZiwgMHgyNSwgMHg5OCwKKyAgICAgICAgICAweGJkLCAweDBmLCAweGQyLCAweDIxLCAweDVkLCAweDZhLCAweDFlLCAweDUyLAorICAgICAgICAgIDB4OTUsIDB4ZTYsIDB4NGYsIDB4NzMsIDB4ZjYsIDB4M2YsIDB4MGEsIDB4ZWMsCisgICAgICAgICAgMHg4YiwgMHg5MSwgMHg1YSwgMHg5OCwgMHg1ZCwgMHg3OCwgMHg2NSwgMHg5OCB9IH0sCisKKyAgICAgIHsgImRhdGEtMTUyIGtleS0xMzEiLAorICAgICAgICAiVGhpcyBpcyBhIHRlc3QgdXNpbmcgYSBsYXJnZXIgdGhhbiBibG9jay1zaXplIGtleSBhbmQgYSBsYXJnZXIgIgorICAgICAgICAidGhhbiBibG9jay1zaXplIGRhdGEuIFRoZSBrZXkgbmVlZHMgdG8gYmUgaGFzaGVkIGJlZm9yZSBiZWluZyAiCisgICAgICAgICJ1c2VkIGJ5IHRoZSBITUFDIGFsZ29yaXRobS4iLAorCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorICAgICAgICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKyAgICAgICAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisgICAgICAgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorICAgICAgICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKyAgICAgICAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisgICAgICAgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorICAgICAgICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKyAgICAgICAgIlx4YWFceGFhXHhhYSIsCisgICAgICAgIHsgMHhlMywgMHg3YiwgMHg2YSwgMHg3NywgMHg1ZCwgMHhjOCwgMHg3ZCwgMHhiYSwKKyAgICAgICAgICAweGE0LCAweGRmLCAweGE5LCAweGY5LCAweDZlLCAweDVlLCAweDNmLCAweGZkLAorICAgICAgICAgIDB4ZGUsIDB4YmQsIDB4NzEsIDB4ZjgsIDB4ODYsIDB4NzIsIDB4ODksIDB4ODYsCisgICAgICAgICAgMHg1ZCwgMHhmNSwgMHhhMywgMHgyZCwgMHgyMCwgMHhjZCwgMHhjOSwgMHg0NCwKKyAgICAgICAgICAweGI2LCAweDAyLCAweDJjLCAweGFjLCAweDNjLCAweDQ5LCAweDgyLCAweGIxLAorICAgICAgICAgIDB4MGQsIDB4NWUsIDB4ZWIsIDB4NTUsIDB4YzMsIDB4ZTQsIDB4ZGUsIDB4MTUsCisgICAgICAgICAgMHgxMywgMHg0NiwgMHg3NiwgMHhmYiwgMHg2ZCwgMHhlMCwgMHg0NCwgMHg2MCwKKyAgICAgICAgICAweDY1LCAweGM5LCAweDc0LCAweDQwLCAweGZhLCAweDhjLCAweDZhLCAweDU4IH0gfSwKKworICAgICAgeyBOVUxMIH0KKyAgICB9OworICBjb25zdCBjaGFyICp3aGF0OworICBjb25zdCBjaGFyICplcnJ0eHQ7CisgIGludCB0dmlkeDsKKyAgCisgIGZvciAodHZpZHg9MDsgdHZbdHZpZHhdLmRlc2M7IHR2aWR4KyspCisgICAgeworICAgICAgd2hhdCA9IHR2W3R2aWR4XS5kZXNjOworICAgICAgZXJydHh0ID0gY2hlY2tfb25lIChHQ1JZX01EX1NIQTUxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHZbdHZpZHhdLmRhdGEsIHN0cmxlbiAodHZbdHZpZHhdLmRhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0dlt0dmlkeF0ua2V5LCBzdHJsZW4gKHR2W3R2aWR4XS5rZXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0dlt0dmlkeF0uZXhwZWN0LCBESU0gKHR2W3R2aWR4XS5leHBlY3QpICk7CisgICAgICBpZiAoZXJydHh0KQorICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgIGlmICghZXh0ZW5kZWQpCisgICAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm4gMDsgLyogU3VjY2VlZGVkLiAqLworCisgZmFpbGVkOgorICBpZiAocmVwb3J0KQorICAgIHJlcG9ydCAoImhtYWMiLCBHQ1JZX01EX1NIQTUxMiwgd2hhdCwgZXJydHh0KTsKKyAgcmV0dXJuIEdQR19FUlJfU0VMRlRFU1RfRkFJTEVEOworfQorCisKKworLyogUnVuIGEgZnVsbCBzZWxmLXRlc3QgZm9yIEFMR08gYW5kIHJldHVybiAwIG9uIHN1Y2Nlc3MuICAqLworc3RhdGljIGdwZ19lcnJfY29kZV90CitydW5fc2VsZnRlc3RzIChpbnQgYWxnbywgaW50IGV4dGVuZGVkLCBzZWxmdGVzdF9yZXBvcnRfZnVuY190IHJlcG9ydCkKK3sKKyAgZ3BnX2Vycl9jb2RlX3QgZWM7CisKKyAgc3dpdGNoIChhbGdvKQorICAgIHsKKyAgICBjYXNlIEdDUllfTURfU0hBMToKKyAgICAgIGVjID0gc2VsZnRlc3RzX3NoYTEgKGV4dGVuZGVkLCByZXBvcnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHQ1JZX01EX1NIQTIyNDoKKyAgICAgIGVjID0gc2VsZnRlc3RzX3NoYTIyNCAoZXh0ZW5kZWQsIHJlcG9ydCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdDUllfTURfU0hBMjU2OgorICAgICAgZWMgPSBzZWxmdGVzdHNfc2hhMjU2IChleHRlbmRlZCwgcmVwb3J0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR0NSWV9NRF9TSEEzODQ6CisgICAgICBlYyA9IHNlbGZ0ZXN0c19zaGEzODQgKGV4dGVuZGVkLCByZXBvcnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHQ1JZX01EX1NIQTUxMjoKKyAgICAgIGVjID0gc2VsZnRlc3RzX3NoYTUxMiAoZXh0ZW5kZWQsIHJlcG9ydCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZWMgPSBHUEdfRVJSX0RJR0VTVF9BTEdPOworICAgICAgYnJlYWs7CisgICAgfQorICByZXR1cm4gZWM7Cit9CisKKworCisKKy8qIFJ1biB0aGUgc2VsZnRlc3RzIGZvciBITUFDIHdpdGggZGlnZXN0IGFsZ29yaXRobSBBTEdPIHdpdGggb3B0aW9uYWwKKyAgIHJlcG9ydGluZyBmdW5jdGlvbiBSRVBPUlQuICAqLworZ3BnX2Vycm9yX3QKK19nY3J5X2htYWNfc2VsZnRlc3QgKGludCBhbGdvLCBpbnQgZXh0ZW5kZWQsIHNlbGZ0ZXN0X3JlcG9ydF9mdW5jX3QgcmVwb3J0KQoreworICBnY3J5X2Vycl9jb2RlX3QgZWMgPSAwOworCisgIGlmICghZ2NyeV9tZF90ZXN0X2FsZ28gKGFsZ28pKQorICAgIHsKKyAgICAgIGVjID0gcnVuX3NlbGZ0ZXN0cyAoYWxnbywgZXh0ZW5kZWQsIHJlcG9ydCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZWMgPSBHUEdfRVJSX0RJR0VTVF9BTEdPOworICAgICAgaWYgKHJlcG9ydCkKKyAgICAgICAgcmVwb3J0ICgiaG1hYyIsIGFsZ28sICJtb2R1bGUiLCAiYWxnb3JpdGhtIG5vdCBhdmFpbGFibGUiKTsKKyAgICB9CisgIHJldHVybiBncGdfZXJyb3IgKGVjKTsKK30KZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9jaXBoZXIvbWQuYyBiL2xpYmdjcnlwdC0xLjQuNi9jaXBoZXIvbWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGM3Nzk5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L2NpcGhlci9tZC5jCkBAIC0wLDAgKzEsMTM4MiBAQAorLyogbWQuYyAgLSAgbWVzc2FnZSBkaWdlc3QgZGlzcGF0Y2hlcgorICogQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAyLCAyMDAzLCAyMDA2LAorICogICAgICAgICAgICAgICAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIGdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSAiZzEwbGliLmgiCisjaW5jbHVkZSAiY2lwaGVyLmgiCisjaW5jbHVkZSAiYXRoLmgiCisKKyNpbmNsdWRlICJybWQuaCIKKworLyogQSBkdW1teSBleHRyYXNwZWMgc28gdGhhdCB3ZSBkbyBub3QgbmVlZCB0byB0ZXN0cyB0aGUgZXh0cmFzcGVjCisgICBmaWVsZCBmcm9tIHRoZSBtb2R1bGUgc3BlY2lmaWNhdGlvbiBhZ2FpbnN0IE5VTEwgYW5kIGluc3RlYWQKKyAgIGRpcmVjdGx5IHRlc3QgdGhlIHJlc3BlY3RpdmUgZmllbGRzIG9mIGV4dHJhc3BlY3MuICAqLworc3RhdGljIG1kX2V4dHJhX3NwZWNfdCBkdW1teV9leHRyYV9zcGVjOworCisKKy8qIFRoaXMgaXMgdGhlIGxpc3Qgb2YgdGhlIGRpZ2VzdCBpbXBsZW1lbnRhdGlvbnMgaW5jbHVkZWQgaW4KKyAgIGxpYmdjcnlwdC4gICovCitzdGF0aWMgc3RydWN0IGRpZ2VzdF90YWJsZV9lbnRyeQoreworICBnY3J5X21kX3NwZWNfdCAqZGlnZXN0OworICBtZF9leHRyYV9zcGVjX3QgKmV4dHJhc3BlYzsKKyAgdW5zaWduZWQgaW50IGFsZ29yaXRobTsKKyAgaW50IGZpcHNfYWxsb3dlZDsgCit9IGRpZ2VzdF90YWJsZVtdID0KKyAgeworI2lmIFVTRV9DUkMgICAgCisgICAgLyogV2UgYWxsb3cgdGhlIENSQyBhbGdvcml0aG1zIGV2ZW4gaW4gRklQUyBtb2RlIGJlY2F1c2UgdGhleSBhcmUKKyAgICAgICBhY3R1YWxseSBubyBjcnlwdG9ncmFwaGljIHByaW1pdGl2ZXMuICAqLworICAgIHsgJl9nY3J5X2RpZ2VzdF9zcGVjX2NyYzMyLCAgIAorICAgICAgJmR1bW15X2V4dHJhX3NwZWMsICAgICAgICAgICAgICAgICBHQ1JZX01EX0NSQzMyLCAxIH0sCisgICAgeyAmX2djcnlfZGlnZXN0X3NwZWNfY3JjMzJfcmZjMTUxMCwgIAorICAgICAgJmR1bW15X2V4dHJhX3NwZWMsICAgICAgICAgICAgICAgICBHQ1JZX01EX0NSQzMyX1JGQzE1MTAsIDEgfSwKKyAgICB7ICZfZ2NyeV9kaWdlc3Rfc3BlY19jcmMyNF9yZmMyNDQwLAorICAgICAgJmR1bW15X2V4dHJhX3NwZWMsICAgICAgICAgICAgICAgICBHQ1JZX01EX0NSQzI0X1JGQzI0NDAsIDEgfSwKKyNlbmRpZgorI2lmIFVTRV9NRDQKKyAgICB7ICZfZ2NyeV9kaWdlc3Rfc3BlY19tZDQsCisgICAgICAmZHVtbXlfZXh0cmFfc3BlYywgICAgICAgICAgICAgICAgIEdDUllfTURfTUQ0IH0sCisjZW5kaWYKKyNpZiBVU0VfTUQ1CisgICAgeyAmX2djcnlfZGlnZXN0X3NwZWNfbWQ1LAorICAgICAgJmR1bW15X2V4dHJhX3NwZWMsICAgICAgICAgICAgICAgICBHQ1JZX01EX01ENSwgMSB9LAorI2VuZGlmCisjaWYgVVNFX1JNRDE2MAorICAgIHsgJl9nY3J5X2RpZ2VzdF9zcGVjX3JtZDE2MCwKKyAgICAgICZkdW1teV9leHRyYV9zcGVjLCAgICAgICAgICAgICAgICAgR0NSWV9NRF9STUQxNjAgfSwKKyNlbmRpZgorI2lmIFVTRV9TSEExCisgICAgeyAmX2djcnlfZGlnZXN0X3NwZWNfc2hhMSwgCisgICAgICAmX2djcnlfZGlnZXN0X2V4dHJhc3BlY19zaGExLCAgICAgIEdDUllfTURfU0hBMSwgMSB9LAorI2VuZGlmCisjaWYgVVNFX1NIQTI1NgorICAgIHsgJl9nY3J5X2RpZ2VzdF9zcGVjX3NoYTI1NiwKKyAgICAgICZfZ2NyeV9kaWdlc3RfZXh0cmFzcGVjX3NoYTI1NiwgICAgR0NSWV9NRF9TSEEyNTYsIDEgfSwKKyAgICB7ICZfZ2NyeV9kaWdlc3Rfc3BlY19zaGEyMjQsCisgICAgICAmX2djcnlfZGlnZXN0X2V4dHJhc3BlY19zaGEyMjQsICAgIEdDUllfTURfU0hBMjI0LCAxIH0sCisjZW5kaWYKKyNpZiBVU0VfU0hBNTEyCisgICAgeyAmX2djcnlfZGlnZXN0X3NwZWNfc2hhNTEyLAorICAgICAgJl9nY3J5X2RpZ2VzdF9leHRyYXNwZWNfc2hhNTEyLCAgICBHQ1JZX01EX1NIQTUxMiwgMSB9LAorICAgIHsgJl9nY3J5X2RpZ2VzdF9zcGVjX3NoYTM4NCwKKyAgICAgICZfZ2NyeV9kaWdlc3RfZXh0cmFzcGVjX3NoYTM4NCwgICAgR0NSWV9NRF9TSEEzODQsIDEgfSwKKyNlbmRpZgorI2lmIFVTRV9USUdFUgorICAgIHsgJl9nY3J5X2RpZ2VzdF9zcGVjX3RpZ2VyLAorICAgICAgJmR1bW15X2V4dHJhX3NwZWMsICAgICAgICAgICAgICAgICBHQ1JZX01EX1RJR0VSIH0sCisgICAgeyAmX2djcnlfZGlnZXN0X3NwZWNfdGlnZXIxLAorICAgICAgJmR1bW15X2V4dHJhX3NwZWMsICAgICAgICAgICAgICAgICBHQ1JZX01EX1RJR0VSMSB9LAorICAgIHsgJl9nY3J5X2RpZ2VzdF9zcGVjX3RpZ2VyMiwKKyAgICAgICZkdW1teV9leHRyYV9zcGVjLCAgICAgICAgICAgICAgICAgR0NSWV9NRF9USUdFUjIgfSwKKyNlbmRpZgorI2lmIFVTRV9XSElSTFBPT0wKKyAgICB7ICZfZ2NyeV9kaWdlc3Rfc3BlY193aGlybHBvb2wsCisgICAgICAmZHVtbXlfZXh0cmFfc3BlYywgICAgICAgICAgICAgICAgIEdDUllfTURfV0hJUkxQT09MIH0sCisjZW5kaWYKKyAgICB7IE5VTEwgfSwKKyAgfTsKKworLyogTGlzdCBvZiByZWdpc3RlcmVkIGRpZ2VzdHMuICAqLworc3RhdGljIGdjcnlfbW9kdWxlX3QgZGlnZXN0c19yZWdpc3RlcmVkOworCisvKiBUaGlzIGlzIHRoZSBsb2NrIHByb3RlY3RpbmcgRElHRVNUU19SRUdJU1RFUkVELiAgKi8KK3N0YXRpYyBhdGhfbXV0ZXhfdCBkaWdlc3RzX3JlZ2lzdGVyZWRfbG9jayA9IEFUSF9NVVRFWF9JTklUSUFMSVpFUjsKKworLyogRmxhZyB0byBjaGVjayB3ZXRoZXIgdGhlIGRlZmF1bHQgY2lwaGVycyBoYXZlIGFscmVhZHkgYmVlbgorICAgcmVnaXN0ZXJlZC4gICovCitzdGF0aWMgaW50IGRlZmF1bHRfZGlnZXN0c19yZWdpc3RlcmVkOworCit0eXBlZGVmIHN0cnVjdCBnY3J5X21kX2xpc3QKK3sKKyAgZ2NyeV9tZF9zcGVjX3QgKmRpZ2VzdDsKKyAgZ2NyeV9tb2R1bGVfdCBtb2R1bGU7CisgIHN0cnVjdCBnY3J5X21kX2xpc3QgKm5leHQ7CisgIHNpemVfdCBhY3R1YWxfc3RydWN0X3NpemU7ICAgICAvKiBBbGxvY2F0ZWQgc2l6ZSBvZiB0aGlzIHN0cnVjdHVyZS4gKi8KKyAgUFJPUEVSTFlfQUxJR05FRF9UWVBFIGNvbnRleHQ7Cit9IEdjcnlEaWdlc3RFbnRyeTsKKworLyogdGhpcyBzdHJ1Y3R1cmUgaXMgcHV0IHJpZ2h0IGFmdGVyIHRoZSBnY3J5X21kX2hkX3QgYnVmZmVyLCBzbyB0aGF0CisgKiBvbmx5IG9uZSBtZW1vcnkgYmxvY2sgaXMgbmVlZGVkLiAqLworc3RydWN0IGdjcnlfbWRfY29udGV4dAoreworICBpbnQgIG1hZ2ljOworICBzaXplX3QgYWN0dWFsX2hhbmRsZV9zaXplOyAgICAgLyogQWxsb2NhdGVkIHNpemUgb2YgdGhpcyBoYW5kbGUuICovCisgIGludCAgc2VjdXJlOworICBGSUxFICAqZGVidWc7CisgIGludCBmaW5hbGl6ZWQ7CisgIEdjcnlEaWdlc3RFbnRyeSAqbGlzdDsKKyAgYnl0ZSAqbWFjcGFkczsKKyAgaW50IG1hY3BhZHNfQnNpemU7ICAgICAgICAgICAgIC8qIEJsb2Nrc2l6ZSBhcyB1c2VkIGZvciB0aGUgSE1BQyBwYWRzLiAqLworfTsKKworCisjZGVmaW5lIENUWF9NQUdJQ19OT1JNQUwgMHgxMTA3MTk2MQorI2RlZmluZSBDVFhfTUFHSUNfU0VDVVJFIDB4MTY5MTcwMTEKKworLyogQ29udmVuaWVudCBtYWNybyBmb3IgcmVnaXN0ZXJpbmcgdGhlIGRlZmF1bHQgZGlnZXN0cy4gICovCisjZGVmaW5lIFJFR0lTVEVSX0RFRkFVTFRfRElHRVNUUyAgICAgICAgICAgICAgICAgICBcCisgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBhdGhfbXV0ZXhfbG9jayAoJmRpZ2VzdHNfcmVnaXN0ZXJlZF9sb2NrKTsgICBcCisgICAgICBpZiAoISBkZWZhdWx0X2RpZ2VzdHNfcmVnaXN0ZXJlZCkgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbWRfcmVnaXN0ZXJfZGVmYXVsdCAoKTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZGVmYXVsdF9kaWdlc3RzX3JlZ2lzdGVyZWQgPSAxOyAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBhdGhfbXV0ZXhfdW5sb2NrICgmZGlnZXN0c19yZWdpc3RlcmVkX2xvY2spOyBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHdoaWxlICgwKQorCisKK3N0YXRpYyBjb25zdCBjaGFyICogZGlnZXN0X2FsZ29fdG9fc3RyaW5nKCBpbnQgYWxnbyApOworc3RhdGljIGdjcnlfZXJyX2NvZGVfdCBjaGVja19kaWdlc3RfYWxnbyAoaW50IGFsZ28pOworc3RhdGljIGdjcnlfZXJyX2NvZGVfdCBtZF9vcGVuIChnY3J5X21kX2hkX3QgKmgsIGludCBhbGdvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2VjdXJlLCBpbnQgaG1hYyk7CitzdGF0aWMgZ2NyeV9lcnJfY29kZV90IG1kX2VuYWJsZSAoZ2NyeV9tZF9oZF90IGhkLCBpbnQgYWxnbyk7CitzdGF0aWMgZ2NyeV9lcnJfY29kZV90IG1kX2NvcHkgKGdjcnlfbWRfaGRfdCBhLCBnY3J5X21kX2hkX3QgKmIpOworc3RhdGljIHZvaWQgbWRfY2xvc2UgKGdjcnlfbWRfaGRfdCBhKTsKK3N0YXRpYyB2b2lkIG1kX3dyaXRlIChnY3J5X21kX2hkX3QgYSwgY29uc3Qgdm9pZCAqaW5idWYsIHNpemVfdCBpbmxlbik7CitzdGF0aWMgdm9pZCBtZF9maW5hbChnY3J5X21kX2hkX3QgYSk7CitzdGF0aWMgYnl0ZSAqbWRfcmVhZCggZ2NyeV9tZF9oZF90IGEsIGludCBhbGdvICk7CitzdGF0aWMgaW50IG1kX2dldF9hbGdvKCBnY3J5X21kX2hkX3QgYSApOworc3RhdGljIGludCBtZF9kaWdlc3RfbGVuZ3RoKCBpbnQgYWxnbyApOworc3RhdGljIGNvbnN0IGJ5dGUgKm1kX2Fzbl9vaWQoIGludCBhbGdvLCBzaXplX3QgKmFzbmxlbiwgc2l6ZV90ICptZGxlbiApOworc3RhdGljIHZvaWQgbWRfc3RhcnRfZGVidWcgKCBnY3J5X21kX2hkX3QgYSwgY29uc3QgY2hhciAqc3VmZml4ICk7CitzdGF0aWMgdm9pZCBtZF9zdG9wX2RlYnVnICggZ2NyeV9tZF9oZF90IGEgKTsKKworCisKKworLyogSW50ZXJuYWwgZnVuY3Rpb24uICBSZWdpc3RlciBhbGwgdGhlIGNpcGhlcnMgaW5jbHVkZWQgaW4KKyAgIENJUEhFUl9UQUJMRS4gIFJldHVybnMgemVybyBvbiBzdWNjZXNzIG9yIGFuIGVycm9yIGNvZGUuICAqLworc3RhdGljIHZvaWQKK21kX3JlZ2lzdGVyX2RlZmF1bHQgKHZvaWQpCit7CisgIGdjcnlfZXJyX2NvZGVfdCBlcnIgPSAwOworICBpbnQgaTsKKyAgCisgIGZvciAoaSA9IDA7ICFlcnIgJiYgZGlnZXN0X3RhYmxlW2ldLmRpZ2VzdDsgaSsrKQorICAgIHsKKyAgICAgIGlmICggZmlwc19tb2RlICgpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFkaWdlc3RfdGFibGVbaV0uZmlwc19hbGxvd2VkKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgaWYgKGRpZ2VzdF90YWJsZVtpXS5hbGdvcml0aG0gPT0gR0NSWV9NRF9NRDUKKyAgICAgICAgICAgICAgJiYgX2djcnlfZW5mb3JjZWRfZmlwc19tb2RlICgpICkKKyAgICAgICAgICAgIGNvbnRpbnVlOyAgLyogRG8gbm90IHJlZ2lzdGVyIGluIGVuZm9yY2VkIGZpcHMgbW9kZS4gICovCisgICAgICAgIH0KKworICAgICAgZXJyID0gX2djcnlfbW9kdWxlX2FkZCAoJmRpZ2VzdHNfcmVnaXN0ZXJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZ2VzdF90YWJsZVtpXS5hbGdvcml0aG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSBkaWdlc3RfdGFibGVbaV0uZGlnZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgZGlnZXN0X3RhYmxlW2ldLmV4dHJhc3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIH0KKworICBpZiAoZXJyKQorICAgIEJVRyAoKTsKK30KKworLyogSW50ZXJuYWwgY2FsbGJhY2sgZnVuY3Rpb24uICAqLworc3RhdGljIGludAorZ2NyeV9tZF9sb29rdXBfZnVuY19uYW1lICh2b2lkICpzcGVjLCB2b2lkICpkYXRhKQoreworICBnY3J5X21kX3NwZWNfdCAqZGlnZXN0ID0gKGdjcnlfbWRfc3BlY190ICopIHNwZWM7CisgIGNoYXIgKm5hbWUgPSAoY2hhciAqKSBkYXRhOworCisgIHJldHVybiAoISBzdHJpY21wIChkaWdlc3QtPm5hbWUsIG5hbWUpKTsKK30KKworLyogSW50ZXJuYWwgY2FsbGJhY2sgZnVuY3Rpb24uICBVc2VkIHZpYSBfZ2NyeV9tb2R1bGVfbG9va3VwLiAgKi8KK3N0YXRpYyBpbnQKK2djcnlfbWRfbG9va3VwX2Z1bmNfb2lkICh2b2lkICpzcGVjLCB2b2lkICpkYXRhKQoreworICBnY3J5X21kX3NwZWNfdCAqZGlnZXN0ID0gKGdjcnlfbWRfc3BlY190ICopIHNwZWM7CisgIGNoYXIgKm9pZCA9IChjaGFyICopIGRhdGE7CisgIGdjcnlfbWRfb2lkX3NwZWNfdCAqb2lkX3NwZWNzID0gZGlnZXN0LT5vaWRzOworICBpbnQgcmV0ID0gMCwgaTsKKworICBpZiAob2lkX3NwZWNzKQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IG9pZF9zcGVjc1tpXS5vaWRzdHJpbmcgJiYgKCEgcmV0KTsgaSsrKQorICAgICAgICBpZiAoISBzdHJpY21wIChvaWQsIG9pZF9zcGVjc1tpXS5vaWRzdHJpbmcpKQorICAgICAgICAgIHJldCA9IDE7CisgICAgfQorCisgIHJldHVybiByZXQ7Cit9CisKKy8qIEludGVybmFsIGZ1bmN0aW9uLiAgTG9va3VwIGEgZGlnZXN0IGVudHJ5IGJ5IGl0J3MgbmFtZS4gICovCitzdGF0aWMgZ2NyeV9tb2R1bGVfdCAKK2djcnlfbWRfbG9va3VwX25hbWUgKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIGdjcnlfbW9kdWxlX3QgZGlnZXN0OworCisgIGRpZ2VzdCA9IF9nY3J5X21vZHVsZV9sb29rdXAgKGRpZ2VzdHNfcmVnaXN0ZXJlZCwgKHZvaWQgKikgbmFtZSwKKwkJCQlnY3J5X21kX2xvb2t1cF9mdW5jX25hbWUpOworCisgIHJldHVybiBkaWdlc3Q7Cit9CisKKy8qIEludGVybmFsIGZ1bmN0aW9uLiAgTG9va3VwIGEgY2lwaGVyIGVudHJ5IGJ5IGl0J3Mgb2lkLiAgKi8KK3N0YXRpYyBnY3J5X21vZHVsZV90CitnY3J5X21kX2xvb2t1cF9vaWQgKGNvbnN0IGNoYXIgKm9pZCkKK3sKKyAgZ2NyeV9tb2R1bGVfdCBkaWdlc3Q7CisKKyAgZGlnZXN0ID0gX2djcnlfbW9kdWxlX2xvb2t1cCAoZGlnZXN0c19yZWdpc3RlcmVkLCAodm9pZCAqKSBvaWQsCisJCQkJZ2NyeV9tZF9sb29rdXBfZnVuY19vaWQpOworCisgIHJldHVybiBkaWdlc3Q7Cit9CisKKy8qIFJlZ2lzdGVyIGEgbmV3IGRpZ2VzdCBtb2R1bGUgd2hvc2Ugc3BlY2lmaWNhdGlvbiBjYW4gYmUgZm91bmQgaW4KKyAgIERJR0VTVC4gIE9uIHN1Y2Nlc3MsIGEgbmV3IGFsZ29yaXRobSBJRCBpcyBzdG9yZWQgaW4gQUxHT1JJVEhNX0lECisgICBhbmQgYSBwb2ludGVyIHJlcHJlc2VudGhpbmcgdGhpcyBtb2R1bGUgaXMgc3RvcmVkIGluIE1PRFVMRS4gICovCitnY3J5X2Vycm9yX3QKK19nY3J5X21kX3JlZ2lzdGVyIChnY3J5X21kX3NwZWNfdCAqZGlnZXN0LAorICAgICAgICAgICAgICAgICAgIG1kX2V4dHJhX3NwZWNfdCAqZXh0cmFzcGVjLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqYWxnb3JpdGhtX2lkLAorICAgICAgICAgICAgICAgICAgIGdjcnlfbW9kdWxlX3QgKm1vZHVsZSkKK3sKKyAgZ2NyeV9lcnJfY29kZV90IGVyciA9IDA7CisgIGdjcnlfbW9kdWxlX3QgbW9kOworCisgIC8qIFdlIGRvIG5vdCBzdXBwb3J0IG1vZHVsZSBsb2FkaW5nIGluIGZpcHMgbW9kZS4gICovCisgIGlmIChmaXBzX21vZGUgKCkpCisgICAgcmV0dXJuIGdwZ19lcnJvciAoR1BHX0VSUl9OT1RfU1VQUE9SVEVEKTsKKworICBhdGhfbXV0ZXhfbG9jayAoJmRpZ2VzdHNfcmVnaXN0ZXJlZF9sb2NrKTsKKyAgZXJyID0gX2djcnlfbW9kdWxlX2FkZCAoJmRpZ2VzdHNfcmVnaXN0ZXJlZCwgMCwKKwkJCSAgKHZvaWQgKikgZGlnZXN0LCAKKwkJCSAgKHZvaWQgKikoZXh0cmFzcGVjPyBleHRyYXNwZWMgOiAmZHVtbXlfZXh0cmFfc3BlYyksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kKTsKKyAgYXRoX211dGV4X3VubG9jayAoJmRpZ2VzdHNfcmVnaXN0ZXJlZF9sb2NrKTsKKyAgCisgIGlmICghIGVycikKKyAgICB7CisgICAgICAqbW9kdWxlID0gbW9kOworICAgICAgKmFsZ29yaXRobV9pZCA9IG1vZC0+bW9kX2lkOworICAgIH0KKworICByZXR1cm4gZ2NyeV9lcnJvciAoZXJyKTsKK30KKworLyogVW5yZWdpc3RlciB0aGUgZGlnZXN0IGlkZW50aWZpZWQgYnkgSUQsIHdoaWNoIG11c3QgaGF2ZSBiZWVuCisgICByZWdpc3RlcmVkIHdpdGggZ2NyeV9kaWdlc3RfcmVnaXN0ZXIuICAqLwordm9pZAorZ2NyeV9tZF91bnJlZ2lzdGVyIChnY3J5X21vZHVsZV90IG1vZHVsZSkKK3sKKyAgYXRoX211dGV4X2xvY2sgKCZkaWdlc3RzX3JlZ2lzdGVyZWRfbG9jayk7CisgIF9nY3J5X21vZHVsZV9yZWxlYXNlIChtb2R1bGUpOworICBhdGhfbXV0ZXhfdW5sb2NrICgmZGlnZXN0c19yZWdpc3RlcmVkX2xvY2spOworfQorCisKK3N0YXRpYyBpbnQgCitzZWFyY2hfb2lkIChjb25zdCBjaGFyICpvaWQsIGludCAqYWxnb3JpdGhtLCBnY3J5X21kX29pZF9zcGVjX3QgKm9pZF9zcGVjKQoreworICBnY3J5X21vZHVsZV90IG1vZHVsZTsKKyAgaW50IHJldCA9IDA7CisKKyAgaWYgKG9pZCAmJiAoKCEgc3RybmNtcCAob2lkLCAib2lkLiIsIDQpKQorCSAgICAgIHx8ICghIHN0cm5jbXAgKG9pZCwgIk9JRC4iLCA0KSkpKQorICAgIG9pZCArPSA0OworCisgIG1vZHVsZSA9IGdjcnlfbWRfbG9va3VwX29pZCAob2lkKTsKKyAgaWYgKG1vZHVsZSkKKyAgICB7CisgICAgICBnY3J5X21kX3NwZWNfdCAqZGlnZXN0ID0gbW9kdWxlLT5zcGVjOworICAgICAgaW50IGk7CisKKyAgICAgIGZvciAoaSA9IDA7IGRpZ2VzdC0+b2lkc1tpXS5vaWRzdHJpbmcgJiYgIXJldDsgaSsrKQorCWlmICghIHN0cmljbXAgKG9pZCwgZGlnZXN0LT5vaWRzW2ldLm9pZHN0cmluZykpCisJICB7CisJICAgIGlmIChhbGdvcml0aG0pCisJICAgICAgKmFsZ29yaXRobSA9IG1vZHVsZS0+bW9kX2lkOworCSAgICBpZiAob2lkX3NwZWMpCisJICAgICAgKm9pZF9zcGVjID0gZGlnZXN0LT5vaWRzW2ldOworCSAgICByZXQgPSAxOworCSAgfQorICAgICAgX2djcnlfbW9kdWxlX3JlbGVhc2UgKG1vZHVsZSk7CisgICAgfQorCisgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqCisgKiBNYXAgYSBzdHJpbmcgdG8gdGhlIGRpZ2VzdCBhbGdvCisgKi8KK2ludAorZ2NyeV9tZF9tYXBfbmFtZSAoY29uc3QgY2hhciAqc3RyaW5nKQoreworICBnY3J5X21vZHVsZV90IGRpZ2VzdDsKKyAgaW50IHJldCwgYWxnb3JpdGhtID0gMDsKKworICBpZiAoISBzdHJpbmcpCisgICAgcmV0dXJuIDA7CisKKyAgUkVHSVNURVJfREVGQVVMVF9ESUdFU1RTOworCisgIC8qIElmIHRoZSBzdHJpbmcgc3RhcnRzIHdpdGggYSBkaWdpdCAob3B0aW9uYWxseSBwcmVmaXhlZCB3aXRoCisgICAgIGVpdGhlciAiT0lELiIgb3IgIm9pZC4iKSwgd2UgZmlyc3QgbG9vayBpbnRvIG91ciB0YWJsZSBvZiBBU04uMQorICAgICBvYmplY3QgaWRlbnRpZmllcnMgdG8gZmlndXJlIG91dCB0aGUgYWxnb3JpdGhtICovCisKKyAgYXRoX211dGV4X2xvY2sgKCZkaWdlc3RzX3JlZ2lzdGVyZWRfbG9jayk7CisKKyAgcmV0ID0gc2VhcmNoX29pZCAoc3RyaW5nLCAmYWxnb3JpdGhtLCBOVUxMKTsKKyAgaWYgKCEgcmV0KQorICAgIHsKKyAgICAgIC8qIE5vdCBmb3VuZCwgc2VhcmNoIGEgbWF0Y2hpbmcgZGlnZXN0IG5hbWUuICAqLworICAgICAgZGlnZXN0ID0gZ2NyeV9tZF9sb29rdXBfbmFtZSAoc3RyaW5nKTsKKyAgICAgIGlmIChkaWdlc3QpCisJeworCSAgYWxnb3JpdGhtID0gZGlnZXN0LT5tb2RfaWQ7CisJICBfZ2NyeV9tb2R1bGVfcmVsZWFzZSAoZGlnZXN0KTsKKwl9CisgICAgfQorICBhdGhfbXV0ZXhfdW5sb2NrICgmZGlnZXN0c19yZWdpc3RlcmVkX2xvY2spOworCisgIHJldHVybiBhbGdvcml0aG07Cit9CisKKworLyoqKioqKioqKioqKioqKioKKyAqIE1hcCBhIGRpZ2VzdCBhbGdvIHRvIGEgc3RyaW5nCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICoKK2RpZ2VzdF9hbGdvX3RvX3N0cmluZyAoaW50IGFsZ29yaXRobSkKK3sKKyAgY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7CisgIGdjcnlfbW9kdWxlX3QgZGlnZXN0OworCisgIFJFR0lTVEVSX0RFRkFVTFRfRElHRVNUUzsKKworICBhdGhfbXV0ZXhfbG9jayAoJmRpZ2VzdHNfcmVnaXN0ZXJlZF9sb2NrKTsKKyAgZGlnZXN0ID0gX2djcnlfbW9kdWxlX2xvb2t1cF9pZCAoZGlnZXN0c19yZWdpc3RlcmVkLCBhbGdvcml0aG0pOworICBpZiAoZGlnZXN0KQorICAgIHsKKyAgICAgIG5hbWUgPSAoKGdjcnlfbWRfc3BlY190ICopIGRpZ2VzdC0+c3BlYyktPm5hbWU7CisgICAgICBfZ2NyeV9tb2R1bGVfcmVsZWFzZSAoZGlnZXN0KTsKKyAgICB9CisgIGF0aF9tdXRleF91bmxvY2sgKCZkaWdlc3RzX3JlZ2lzdGVyZWRfbG9jayk7CisKKyAgcmV0dXJuIG5hbWU7Cit9CisKKy8qKioqKioqKioqKioqKioqCisgKiBUaGlzIGZ1bmN0aW9uIHNpbXBseSByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBhbGdvcml0aG0gb3Igc29tZSBjb25zdGFudAorICogc3RyaW5nIHdoZW4gdGhlcmUgaXMgbm8gYWxnby4gIEl0IHdpbGwgbmV2ZXIgcmV0dXJuIE5VTEwuCisgKiBVc2UJdGhlIG1hY3JvIGdjcnlfbWRfdGVzdF9hbGdvKCkgdG8gY2hlY2sgd2hldGhlciB0aGUgYWxnb3JpdGhtCisgKiBpcyB2YWxpZC4KKyAqLworY29uc3QgY2hhciAqCitnY3J5X21kX2FsZ29fbmFtZSAoaW50IGFsZ29yaXRobSkKK3sKKyAgY29uc3QgY2hhciAqcyA9IGRpZ2VzdF9hbGdvX3RvX3N0cmluZyAoYWxnb3JpdGhtKTsKKyAgcmV0dXJuIHMgPyBzIDogIj8iOworfQorCisKK3N0YXRpYyBnY3J5X2Vycl9jb2RlX3QKK2NoZWNrX2RpZ2VzdF9hbGdvIChpbnQgYWxnb3JpdGhtKQoreworICBnY3J5X2Vycl9jb2RlX3QgcmMgPSAwOworICBnY3J5X21vZHVsZV90IGRpZ2VzdDsKKworICBSRUdJU1RFUl9ERUZBVUxUX0RJR0VTVFM7CisKKyAgYXRoX211dGV4X2xvY2sgKCZkaWdlc3RzX3JlZ2lzdGVyZWRfbG9jayk7CisgIGRpZ2VzdCA9IF9nY3J5X21vZHVsZV9sb29rdXBfaWQgKGRpZ2VzdHNfcmVnaXN0ZXJlZCwgYWxnb3JpdGhtKTsKKyAgaWYgKGRpZ2VzdCkKKyAgICBfZ2NyeV9tb2R1bGVfcmVsZWFzZSAoZGlnZXN0KTsKKyAgZWxzZQorICAgIHJjID0gR1BHX0VSUl9ESUdFU1RfQUxHTzsKKyAgYXRoX211dGV4X3VubG9jayAoJmRpZ2VzdHNfcmVnaXN0ZXJlZF9sb2NrKTsKKworICByZXR1cm4gcmM7Cit9CisKKworCisvKioqKioqKioqKioqKioqKgorICogT3BlbiBhIG1lc3NhZ2UgZGlnZXN0IGhhbmRsZSBmb3IgdXNlIHdpdGggYWxnb3JpdGhtIEFMR08uCisgKiBNb3JlIGFsZ29yaXRobXMgbWF5IGJlIGFkZGVkIGJ5IG1kX2VuYWJsZSgpLiBUaGUgaW5pdGlhbCBhbGdvcml0aG0KKyAqIG1heSBiZSAwLgorICovCitzdGF0aWMgZ2NyeV9lcnJfY29kZV90CittZF9vcGVuIChnY3J5X21kX2hkX3QgKmgsIGludCBhbGdvLCBpbnQgc2VjdXJlLCBpbnQgaG1hYykKK3sKKyAgZ2NyeV9lcnJfY29kZV90IGVyciA9IEdQR19FUlJfTk9fRVJST1I7CisgIGludCBidWZzaXplID0gc2VjdXJlID8gNTEyIDogMTAyNDsKKyAgc3RydWN0IGdjcnlfbWRfY29udGV4dCAqY3R4OworICBnY3J5X21kX2hkX3QgaGQ7CisgIHNpemVfdCBuOworCisgIC8qIEFsbG9jYXRlIGEgbWVtb3J5IGFyZWEgdG8gaG9sZCB0aGUgY2FsbGVyIHZpc2libGUgYnVmZmVyIHdpdGggaXQncworICAgKiBjb250cm9sIGluZm9ybWF0aW9uIGFuZCB0aGUgZGF0YSByZXF1aXJlZCBieSB0aGlzIG1vZHVsZS4gU2V0IHRoZQorICAgKiBjb250ZXh0IHBvaW50ZXIgYXQgdGhlIGJlZ2lubmluZyB0byB0aGlzIGFyZWEuCisgICAqIFdlIGhhdmUgdG8gdXNlIHRoaXMgc3RyYW5nZSBzY2hlbWUgYmVjYXVzZSB3ZSB3YW50IHRvIGhpZGUgdGhlCisgICAqIGludGVybmFsIGRhdGEgYnV0IGhhdmUgYSB2YXJpYWJsZSBzaXplZCBidWZmZXIuCisgICAqCisgICAqCSstLS0rLS0tLS0tKy0tLS4uLi4uLi4uLS0tLS0tKy0tLS0tLS0tLS0tLS0rCisgICAqCSFjdHghIGJjdGwgISAgYnVmZmVyCSAgICAgISBwcml2YXRlCSAgICEKKyAgICoJKy0tLSstLS0tLS0rLS0tLi4uLi4uLi4tLS0tLS0rLS0tLS0tLS0tLS0tLSsKKyAgICoJICAhCQkJICAgICAgXgorICAgKgkgICEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0hCisgICAqCisgICAqIFdlIGhhdmUgdG8gbWFrZSBzdXJlIHRoYXQgcHJpdmF0ZSBpcyB3ZWxsIGFsaWduZWQuCisgICAqLworICBuID0gc2l6ZW9mIChzdHJ1Y3QgZ2NyeV9tZF9oYW5kbGUpICsgYnVmc2l6ZTsKKyAgbiA9ICgobiArIHNpemVvZiAoUFJPUEVSTFlfQUxJR05FRF9UWVBFKSAtIDEpCisgICAgICAgLyBzaXplb2YgKFBST1BFUkxZX0FMSUdORURfVFlQRSkpICogc2l6ZW9mIChQUk9QRVJMWV9BTElHTkVEX1RZUEUpOworCisgIC8qIEFsbG9jYXRlIGFuZCBzZXQgdGhlIENvbnRleHQgcG9pbnRlciB0byB0aGUgcHJpdmF0ZSBkYXRhICovCisgIGlmIChzZWN1cmUpCisgICAgaGQgPSBnY3J5X21hbGxvY19zZWN1cmUgKG4gKyBzaXplb2YgKHN0cnVjdCBnY3J5X21kX2NvbnRleHQpKTsKKyAgZWxzZQorICAgIGhkID0gZ2NyeV9tYWxsb2MgKG4gKyBzaXplb2YgKHN0cnVjdCBnY3J5X21kX2NvbnRleHQpKTsKKworICBpZiAoISBoZCkKKyAgICBlcnIgPSBncGdfZXJyX2NvZGVfZnJvbV9lcnJubyAoZXJybm8pOworCisgIGlmICghIGVycikKKyAgICB7CisgICAgICBoZC0+Y3R4ID0gY3R4ID0gKHN0cnVjdCBnY3J5X21kX2NvbnRleHQgKikgKChjaGFyICopIGhkICsgbik7CisgICAgICAvKiBTZXR1cCB0aGUgZ2xvYmFsbHkgdmlzaWJsZSBkYXRhIChiY3RsIGluIHRoZSBkaWFncmFtKS4qLworICAgICAgaGQtPmJ1ZnNpemUgPSBuIC0gc2l6ZW9mIChzdHJ1Y3QgZ2NyeV9tZF9oYW5kbGUpICsgMTsKKyAgICAgIGhkLT5idWZwb3MgPSAwOworCisgICAgICAvKiBJbml0aWFsaXplIHRoZSBwcml2YXRlIGRhdGEuICovCisgICAgICBtZW1zZXQgKGhkLT5jdHgsIDAsIHNpemVvZiAqaGQtPmN0eCk7CisgICAgICBjdHgtPm1hZ2ljID0gc2VjdXJlID8gQ1RYX01BR0lDX1NFQ1VSRSA6IENUWF9NQUdJQ19OT1JNQUw7CisgICAgICBjdHgtPmFjdHVhbF9oYW5kbGVfc2l6ZSA9IG4gKyBzaXplb2YgKHN0cnVjdCBnY3J5X21kX2NvbnRleHQpOworICAgICAgY3R4LT5zZWN1cmUgPSBzZWN1cmU7CisKKyAgICAgIGlmIChobWFjKQorCXsKKwkgIHN3aXRjaCAoYWxnbykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY2FzZSBHQ1JZX01EX1NIQTM4NDoKKyAgICAgICAgICAgICAgY2FzZSBHQ1JZX01EX1NIQTUxMjoKKyAgICAgICAgICAgICAgICBjdHgtPm1hY3BhZHNfQnNpemUgPSAxMjg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgY3R4LT5tYWNwYWRzX0JzaXplID0gNjQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgY3R4LT5tYWNwYWRzID0gZ2NyeV9tYWxsb2Nfc2VjdXJlICgyKihjdHgtPm1hY3BhZHNfQnNpemUpKTsKKwkgIGlmICghY3R4LT5tYWNwYWRzKQorCSAgICB7CisJICAgICAgZXJyID0gZ3BnX2Vycl9jb2RlX2Zyb21fZXJybm8gKGVycm5vKTsKKwkgICAgICBtZF9jbG9zZSAoaGQpOworCSAgICB9CisJfQorICAgIH0KKworICBpZiAoISBlcnIpCisgICAgeworICAgICAgLyogSG1tbSwgc2hvdWxkIHdlIHJlYWxseSBkbyB0aGF0PyAtIHllcyBbLXdrXSAqLworICAgICAgX2djcnlfZmFzdF9yYW5kb21fcG9sbCAoKTsKKworICAgICAgaWYgKGFsZ28pCisJeworCSAgZXJyID0gbWRfZW5hYmxlIChoZCwgYWxnbyk7CisJICBpZiAoZXJyKQorCSAgICBtZF9jbG9zZSAoaGQpOworCX0KKyAgICB9CisKKyAgaWYgKCEgZXJyKQorICAgICpoID0gaGQ7CisKKyAgcmV0dXJuIGVycjsKK30KKworLyogQ3JlYXRlIGEgbWVzc2FnZSBkaWdlc3Qgb2JqZWN0IGZvciBhbGdvcml0aG0gQUxHTy4gIEZMQUdTIG1heSBiZQorICAgZ2l2ZW4gYXMgYW4gYml0d2lzZSBPUiBvZiB0aGUgZ2NyeV9tZF9mbGFncyB2YWx1ZXMuICBBTEdPIG1heSBiZQorICAgZ2l2ZW4gYXMgMCBpZiB0aGUgYWxnb3JpdGhtcyB0byBiZSB1c2VkIGFyZSBsYXRlciBzZXQgdXNpbmcKKyAgIGdjcnlfbWRfZW5hYmxlLiBIIGlzIGd1YXJhbnRlZWQgdG8gYmUgYSB2YWxpZCBoYW5kbGUgb3IgTlVMTCBvbgorICAgZXJyb3IuICAqLworZ2NyeV9lcnJvcl90CitnY3J5X21kX29wZW4gKGdjcnlfbWRfaGRfdCAqaCwgaW50IGFsZ28sIHVuc2lnbmVkIGludCBmbGFncykKK3sKKyAgZ2NyeV9lcnJfY29kZV90IGVyciA9IEdQR19FUlJfTk9fRVJST1I7CisgIGdjcnlfbWRfaGRfdCBoZDsKKworICBpZiAoKGZsYWdzICYgfihHQ1JZX01EX0ZMQUdfU0VDVVJFIHwgR0NSWV9NRF9GTEFHX0hNQUMpKSkKKyAgICBlcnIgPSBHUEdfRVJSX0lOVl9BUkc7CisgIGVsc2UKKyAgICB7CisgICAgICBlcnIgPSBtZF9vcGVuICgmaGQsIGFsZ28sIChmbGFncyAmIEdDUllfTURfRkxBR19TRUNVUkUpLAorCQkgICAgIChmbGFncyAmIEdDUllfTURfRkxBR19ITUFDKSk7CisgICAgfQorCisgICpoID0gZXJyPyBOVUxMIDogaGQ7CisgIHJldHVybiBnY3J5X2Vycm9yIChlcnIpOworfQorCisKKworc3RhdGljIGdjcnlfZXJyX2NvZGVfdAorbWRfZW5hYmxlIChnY3J5X21kX2hkX3QgaGQsIGludCBhbGdvcml0aG0pCit7CisgIHN0cnVjdCBnY3J5X21kX2NvbnRleHQgKmggPSBoZC0+Y3R4OworICBnY3J5X21kX3NwZWNfdCAqZGlnZXN0ID0gTlVMTDsKKyAgR2NyeURpZ2VzdEVudHJ5ICplbnRyeTsKKyAgZ2NyeV9tb2R1bGVfdCBtb2R1bGU7CisgIGdjcnlfZXJyX2NvZGVfdCBlcnIgPSAwOworCisgIGZvciAoZW50cnkgPSBoLT5saXN0OyBlbnRyeTsgZW50cnkgPSBlbnRyeS0+bmV4dCkKKyAgICBpZiAoZW50cnktPm1vZHVsZS0+bW9kX2lkID09IGFsZ29yaXRobSkKKyAgICAgIHJldHVybiBlcnI7IC8qIGFscmVhZHkgZW5hYmxlZCAqLworCisgIFJFR0lTVEVSX0RFRkFVTFRfRElHRVNUUzsKKworICBhdGhfbXV0ZXhfbG9jayAoJmRpZ2VzdHNfcmVnaXN0ZXJlZF9sb2NrKTsKKyAgbW9kdWxlID0gX2djcnlfbW9kdWxlX2xvb2t1cF9pZCAoZGlnZXN0c19yZWdpc3RlcmVkLCBhbGdvcml0aG0pOworICBhdGhfbXV0ZXhfdW5sb2NrICgmZGlnZXN0c19yZWdpc3RlcmVkX2xvY2spOworICBpZiAoISBtb2R1bGUpCisgICAgeworICAgICAgbG9nX2RlYnVnICgibWRfZW5hYmxlOiBhbGdvcml0aG0gJWQgbm90IGF2YWlsYWJsZVxuIiwgYWxnb3JpdGhtKTsKKyAgICAgIGVyciA9IEdQR19FUlJfRElHRVNUX0FMR087CisgICAgfQorIGVsc2UKKyAgICBkaWdlc3QgPSAoZ2NyeV9tZF9zcGVjX3QgKikgbW9kdWxlLT5zcGVjOworCisgIAorICBpZiAoIWVyciAmJiBhbGdvcml0aG0gPT0gR0NSWV9NRF9NRDUgJiYgZmlwc19tb2RlICgpKQorICAgIHsKKyAgICAgIF9nY3J5X2luYWN0aXZhdGVfZmlwc19tb2RlICgiTUQ1IHVzZWQiKTsKKyAgICAgIGlmIChfZ2NyeV9lbmZvcmNlZF9maXBzX21vZGUgKCkgKQorICAgICAgICB7CisgICAgICAgICAgLyogV2Ugc2hvdWxkIG5ldmVyIGdldCB0byBoZXJlIGJlY2F1c2Ugd2UgZG8gbm90IHJlZ2lzdGVyCisgICAgICAgICAgICAgTUQ1IGluIGVuZm9yY2VkIGZpcHMgbW9kZS4gQnV0IGJldHRlciB0aHJvdyBhbiBlcnJvci4gICovCisgICAgICAgICAgZXJyID0gR1BHX0VSUl9ESUdFU1RfQUxHTzsKKyAgICAgICAgfQorICAgIH0KKyAgCisgIGlmICghZXJyKQorICAgIHsKKyAgICAgIHNpemVfdCBzaXplID0gKHNpemVvZiAoKmVudHJ5KQorICAgICAgICAgICAgICAgICAgICAgKyBkaWdlc3QtPmNvbnRleHRzaXplCisgICAgICAgICAgICAgICAgICAgICAtIHNpemVvZiAoZW50cnktPmNvbnRleHQpKTsKKworICAgICAgLyogQW5kIGFsbG9jYXRlIGEgbmV3IGxpc3QgZW50cnkuICovCisgICAgICBpZiAoaC0+c2VjdXJlKQorCWVudHJ5ID0gZ2NyeV9tYWxsb2Nfc2VjdXJlIChzaXplKTsKKyAgICAgIGVsc2UKKwllbnRyeSA9IGdjcnlfbWFsbG9jIChzaXplKTsKKworICAgICAgaWYgKCEgZW50cnkpCisJZXJyID0gZ3BnX2Vycl9jb2RlX2Zyb21fZXJybm8gKGVycm5vKTsKKyAgICAgIGVsc2UKKwl7CisJICBlbnRyeS0+ZGlnZXN0ID0gZGlnZXN0OworCSAgZW50cnktPm1vZHVsZSA9IG1vZHVsZTsKKwkgIGVudHJ5LT5uZXh0ID0gaC0+bGlzdDsKKyAgICAgICAgICBlbnRyeS0+YWN0dWFsX3N0cnVjdF9zaXplID0gc2l6ZTsKKwkgIGgtPmxpc3QgPSBlbnRyeTsKKworCSAgLyogQW5kIGluaXQgdGhpcyBpbnN0YW5jZS4gKi8KKwkgIGVudHJ5LT5kaWdlc3QtPmluaXQgKCZlbnRyeS0+Y29udGV4dC5jKTsKKwl9CisgICAgfQorCisgIGlmIChlcnIpCisgICAgeworICAgICAgaWYgKG1vZHVsZSkKKwl7CisJICAgYXRoX211dGV4X2xvY2sgKCZkaWdlc3RzX3JlZ2lzdGVyZWRfbG9jayk7CisJICAgX2djcnlfbW9kdWxlX3JlbGVhc2UgKG1vZHVsZSk7CisJICAgYXRoX211dGV4X3VubG9jayAoJmRpZ2VzdHNfcmVnaXN0ZXJlZF9sb2NrKTsKKwl9CisgICAgfQorCisgIHJldHVybiBlcnI7Cit9CisKKworZ2NyeV9lcnJvcl90CitnY3J5X21kX2VuYWJsZSAoZ2NyeV9tZF9oZF90IGhkLCBpbnQgYWxnb3JpdGhtKQoreworICByZXR1cm4gZ2NyeV9lcnJvciAobWRfZW5hYmxlIChoZCwgYWxnb3JpdGhtKSk7Cit9CisKK3N0YXRpYyBnY3J5X2Vycl9jb2RlX3QKK21kX2NvcHkgKGdjcnlfbWRfaGRfdCBhaGQsIGdjcnlfbWRfaGRfdCAqYl9oZCkKK3sKKyAgZ2NyeV9lcnJfY29kZV90IGVyciA9IEdQR19FUlJfTk9fRVJST1I7CisgIHN0cnVjdCBnY3J5X21kX2NvbnRleHQgKmEgPSBhaGQtPmN0eDsKKyAgc3RydWN0IGdjcnlfbWRfY29udGV4dCAqYjsKKyAgR2NyeURpZ2VzdEVudHJ5ICphciwgKmJyOworICBnY3J5X21kX2hkX3QgYmhkOworICBzaXplX3QgbjsKKyAgCisgIGlmIChhaGQtPmJ1ZnBvcykKKyAgICBtZF93cml0ZSAoYWhkLCBOVUxMLCAwKTsKKworICBuID0gKGNoYXIgKikgYWhkLT5jdHggLSAoY2hhciAqKSBhaGQ7CisgIGlmIChhLT5zZWN1cmUpCisgICAgYmhkID0gZ2NyeV9tYWxsb2Nfc2VjdXJlIChuICsgc2l6ZW9mIChzdHJ1Y3QgZ2NyeV9tZF9jb250ZXh0KSk7CisgIGVsc2UKKyAgICBiaGQgPSBnY3J5X21hbGxvYyAobiArIHNpemVvZiAoc3RydWN0IGdjcnlfbWRfY29udGV4dCkpOworCisgIGlmICghIGJoZCkKKyAgICBlcnIgPSBncGdfZXJyX2NvZGVfZnJvbV9lcnJubyAoZXJybm8pOworCisgIGlmICghIGVycikKKyAgICB7CisgICAgICBiaGQtPmN0eCA9IGIgPSAoc3RydWN0IGdjcnlfbWRfY29udGV4dCAqKSAoKGNoYXIgKikgYmhkICsgbik7CisgICAgICAvKiBObyBuZWVkIHRvIGNvcHkgdGhlIGJ1ZmZlciBkdWUgdG8gdGhlIHdyaXRlIGFib3ZlLiAqLworICAgICAgZ2NyeV9hc3NlcnQgKGFoZC0+YnVmc2l6ZSA9PSAobiAtIHNpemVvZiAoc3RydWN0IGdjcnlfbWRfaGFuZGxlKSArIDEpKTsKKyAgICAgIGJoZC0+YnVmc2l6ZSA9IGFoZC0+YnVmc2l6ZTsKKyAgICAgIGJoZC0+YnVmcG9zID0gMDsKKyAgICAgIGdjcnlfYXNzZXJ0ICghIGFoZC0+YnVmcG9zKTsKKyAgICAgIG1lbWNweSAoYiwgYSwgc2l6ZW9mICphKTsKKyAgICAgIGItPmxpc3QgPSBOVUxMOworICAgICAgYi0+ZGVidWcgPSBOVUxMOworICAgICAgaWYgKGEtPm1hY3BhZHMpCisJeworCSAgYi0+bWFjcGFkcyA9IGdjcnlfbWFsbG9jX3NlY3VyZSAoMiooYS0+bWFjcGFkc19Cc2l6ZSkpOworCSAgaWYgKCEgYi0+bWFjcGFkcykKKwkgICAgeworCSAgICAgIGVyciA9IGdwZ19lcnJfY29kZV9mcm9tX2Vycm5vIChlcnJubyk7CisJICAgICAgbWRfY2xvc2UgKGJoZCk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgbWVtY3B5IChiLT5tYWNwYWRzLCBhLT5tYWNwYWRzLCAoMiooYS0+bWFjcGFkc19Cc2l6ZSkpKTsKKwl9CisgICAgfQorCisgIC8qIENvcHkgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgYWxnb3JpdGhtcy4gIFRoZSBjb3BpZWQgbGlzdCBpcworICAgICByZXZlcnNlZCwgYnV0IHRoYXQgZG9lc24ndCBtYXR0ZXIuICovCisgIGlmICghZXJyKQorICAgIHsKKyAgICAgIGZvciAoYXIgPSBhLT5saXN0OyBhcjsgYXIgPSBhci0+bmV4dCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChhLT5zZWN1cmUpCisgICAgICAgICAgICBiciA9IGdjcnlfbWFsbG9jX3NlY3VyZSAoc2l6ZW9mICpicgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYXItPmRpZ2VzdC0+Y29udGV4dHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHNpemVvZihhci0+Y29udGV4dCkpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJyID0gZ2NyeV9tYWxsb2MgKHNpemVvZiAqYnIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYXItPmRpZ2VzdC0+Y29udGV4dHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gc2l6ZW9mIChhci0+Y29udGV4dCkpOworICAgICAgICAgIGlmICghYnIpCisgICAgICAgICAgICB7CisJICAgICAgZXJyID0gZ3BnX2Vycl9jb2RlX2Zyb21fZXJybm8gKGVycm5vKTsKKyAgICAgICAgICAgICAgbWRfY2xvc2UgKGJoZCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgbWVtY3B5IChiciwgYXIsIChzaXplb2YgKCpicikgKyBhci0+ZGlnZXN0LT5jb250ZXh0c2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBzaXplb2YgKGFyLT5jb250ZXh0KSkpOworICAgICAgICAgIGJyLT5uZXh0ID0gYi0+bGlzdDsKKyAgICAgICAgICBiLT5saXN0ID0gYnI7CisgICAgICAgICAgCisgICAgICAgICAgLyogQWRkIGEgcmVmZXJlbmNlIHRvIHRoZSBtb2R1bGUuICAqLworICAgICAgICAgIGF0aF9tdXRleF9sb2NrICgmZGlnZXN0c19yZWdpc3RlcmVkX2xvY2spOworICAgICAgICAgIF9nY3J5X21vZHVsZV91c2UgKGJyLT5tb2R1bGUpOworICAgICAgICAgIGF0aF9tdXRleF91bmxvY2sgKCZkaWdlc3RzX3JlZ2lzdGVyZWRfbG9jayk7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKGEtPmRlYnVnICYmICFlcnIpCisgICAgbWRfc3RhcnRfZGVidWcgKGJoZCwgInVua25vd24iKTsKKworICBpZiAoIWVycikKKyAgICAqYl9oZCA9IGJoZDsKKworICByZXR1cm4gZXJyOworfQorCitnY3J5X2Vycm9yX3QKK2djcnlfbWRfY29weSAoZ2NyeV9tZF9oZF90ICpoYW5kbGUsIGdjcnlfbWRfaGRfdCBoZCkKK3sKKyAgZ2NyeV9lcnJfY29kZV90IGVycjsKKworICBlcnIgPSBtZF9jb3B5IChoZCwgaGFuZGxlKTsKKyAgaWYgKGVycikKKyAgICAqaGFuZGxlID0gTlVMTDsKKyAgcmV0dXJuIGdjcnlfZXJyb3IgKGVycik7Cit9CisKKy8qCisgKiBSZXNldCBhbGwgY29udGV4dHMgYW5kIGRpc2NhcmQgYW55IGJ1ZmZlcmVkIHN0dWZmLiAgVGhpcyBtYXkgYmUgdXNlZAorICogaW5zdGVhZCBvZiBhIG1kX2Nsb3NlKCk7IG1kX29wZW4oKS4KKyAqLwordm9pZAorZ2NyeV9tZF9yZXNldCAoZ2NyeV9tZF9oZF90IGEpCit7CisgIEdjcnlEaWdlc3RFbnRyeSAqcjsKKworICAvKiBOb3RlOiBXZSBhbGxvdyB0aGlzIGV2ZW4gaW4gZmlwcyBub24gb3BlcmF0aW9uYWwgbW9kZS4gICovCisKKyAgYS0+YnVmcG9zID0gYS0+Y3R4LT5maW5hbGl6ZWQgPSAwOworCisgIGZvciAociA9IGEtPmN0eC0+bGlzdDsgcjsgciA9IHItPm5leHQpCisgICAgeworICAgICAgbWVtc2V0IChyLT5jb250ZXh0LmMsIDAsIHItPmRpZ2VzdC0+Y29udGV4dHNpemUpOworICAgICAgKCpyLT5kaWdlc3QtPmluaXQpICgmci0+Y29udGV4dC5jKTsKKyAgICB9CisgIGlmIChhLT5jdHgtPm1hY3BhZHMpCisgICAgbWRfd3JpdGUgKGEsIGEtPmN0eC0+bWFjcGFkcywgYS0+Y3R4LT5tYWNwYWRzX0JzaXplKTsgLyogaW5uZXIgcGFkICovCit9CisKK3N0YXRpYyB2b2lkCittZF9jbG9zZSAoZ2NyeV9tZF9oZF90IGEpCit7CisgIEdjcnlEaWdlc3RFbnRyeSAqciwgKnIyOworCisgIGlmICghIGEpCisgICAgcmV0dXJuOworICBpZiAoYS0+Y3R4LT5kZWJ1ZykKKyAgICBtZF9zdG9wX2RlYnVnIChhKTsKKyAgZm9yIChyID0gYS0+Y3R4LT5saXN0OyByOyByID0gcjIpCisgICAgeworICAgICAgcjIgPSByLT5uZXh0OworICAgICAgYXRoX211dGV4X2xvY2sgKCZkaWdlc3RzX3JlZ2lzdGVyZWRfbG9jayk7CisgICAgICBfZ2NyeV9tb2R1bGVfcmVsZWFzZSAoci0+bW9kdWxlKTsKKyAgICAgIGF0aF9tdXRleF91bmxvY2sgKCZkaWdlc3RzX3JlZ2lzdGVyZWRfbG9jayk7CisgICAgICB3aXBlbWVtb3J5IChyLCByLT5hY3R1YWxfc3RydWN0X3NpemUpOworICAgICAgZ2NyeV9mcmVlIChyKTsKKyAgICB9CisKKyAgaWYgKGEtPmN0eC0+bWFjcGFkcykKKyAgICB7CisgICAgICB3aXBlbWVtb3J5IChhLT5jdHgtPm1hY3BhZHMsIDIqKGEtPmN0eC0+bWFjcGFkc19Cc2l6ZSkpOworICAgICAgZ2NyeV9mcmVlKGEtPmN0eC0+bWFjcGFkcyk7CisgICAgfQorCisgIHdpcGVtZW1vcnkgKGEsIGEtPmN0eC0+YWN0dWFsX2hhbmRsZV9zaXplKTsKKyAgZ2NyeV9mcmVlKGEpOworfQorCit2b2lkCitnY3J5X21kX2Nsb3NlIChnY3J5X21kX2hkX3QgaGQpCit7CisgIC8qIE5vdGU6IFdlIGFsbG93IHRoaXMgZXZlbiBpbiBmaXBzIG5vbiBvcGVyYXRpb25hbCBtb2RlLiAgKi8KKyAgbWRfY2xvc2UgKGhkKTsKK30KKworc3RhdGljIHZvaWQKK21kX3dyaXRlIChnY3J5X21kX2hkX3QgYSwgY29uc3Qgdm9pZCAqaW5idWYsIHNpemVfdCBpbmxlbikKK3sKKyAgR2NyeURpZ2VzdEVudHJ5ICpyOworICAKKyAgaWYgKGEtPmN0eC0+ZGVidWcpCisgICAgeworICAgICAgaWYgKGEtPmJ1ZnBvcyAmJiBmd3JpdGUgKGEtPmJ1ZiwgYS0+YnVmcG9zLCAxLCBhLT5jdHgtPmRlYnVnKSAhPSAxKQorCUJVRygpOworICAgICAgaWYgKGlubGVuICYmIGZ3cml0ZSAoaW5idWYsIGlubGVuLCAxLCBhLT5jdHgtPmRlYnVnKSAhPSAxKQorCUJVRygpOworICAgIH0KKworICBmb3IgKHIgPSBhLT5jdHgtPmxpc3Q7IHI7IHIgPSByLT5uZXh0KQorICAgIHsKKyAgICAgIGlmIChhLT5idWZwb3MpCisJKCpyLT5kaWdlc3QtPndyaXRlKSAoJnItPmNvbnRleHQuYywgYS0+YnVmLCBhLT5idWZwb3MpOworICAgICAgKCpyLT5kaWdlc3QtPndyaXRlKSAoJnItPmNvbnRleHQuYywgaW5idWYsIGlubGVuKTsKKyAgICB9CisgIGEtPmJ1ZnBvcyA9IDA7Cit9CisKK3ZvaWQKK2djcnlfbWRfd3JpdGUgKGdjcnlfbWRfaGRfdCBoZCwgY29uc3Qgdm9pZCAqaW5idWYsIHNpemVfdCBpbmxlbikKK3sKKyAgbWRfd3JpdGUgKGhkLCBpbmJ1ZiwgaW5sZW4pOworfQorCitzdGF0aWMgdm9pZAorbWRfZmluYWwgKGdjcnlfbWRfaGRfdCBhKQoreworICBHY3J5RGlnZXN0RW50cnkgKnI7CisKKyAgaWYgKGEtPmN0eC0+ZmluYWxpemVkKQorICAgIHJldHVybjsKKworICBpZiAoYS0+YnVmcG9zKQorICAgIG1kX3dyaXRlIChhLCBOVUxMLCAwKTsKKworICBmb3IgKHIgPSBhLT5jdHgtPmxpc3Q7IHI7IHIgPSByLT5uZXh0KQorICAgICgqci0+ZGlnZXN0LT5maW5hbCkgKCZyLT5jb250ZXh0LmMpOworCisgIGEtPmN0eC0+ZmluYWxpemVkID0gMTsKKworICBpZiAoYS0+Y3R4LT5tYWNwYWRzKQorICAgIHsKKyAgICAgIC8qIEZpbmlzaCB0aGUgaG1hYy4gKi8KKyAgICAgIGludCBhbGdvID0gbWRfZ2V0X2FsZ28gKGEpOworICAgICAgYnl0ZSAqcCA9IG1kX3JlYWQgKGEsIGFsZ28pOworICAgICAgc2l6ZV90IGRsZW4gPSBtZF9kaWdlc3RfbGVuZ3RoIChhbGdvKTsKKyAgICAgIGdjcnlfbWRfaGRfdCBvbTsKKyAgICAgIGdjcnlfZXJyX2NvZGVfdCBlcnIgPSBtZF9vcGVuICgmb20sIGFsZ28sIGEtPmN0eC0+c2VjdXJlLCAwKTsKKworICAgICAgaWYgKGVycikKKwlfZ2NyeV9mYXRhbF9lcnJvciAoZXJyLCBOVUxMKTsKKyAgICAgIG1kX3dyaXRlIChvbSwgCisgICAgICAgICAgICAgICAgKGEtPmN0eC0+bWFjcGFkcykrKGEtPmN0eC0+bWFjcGFkc19Cc2l6ZSksIAorICAgICAgICAgICAgICAgIGEtPmN0eC0+bWFjcGFkc19Cc2l6ZSk7CisgICAgICBtZF93cml0ZSAob20sIHAsIGRsZW4pOworICAgICAgbWRfZmluYWwgKG9tKTsKKyAgICAgIC8qIFJlcGxhY2Ugb3VyIGRpZ2VzdCB3aXRoIHRoZSBtYWMgKHRoZXkgaGF2ZSB0aGUgc2FtZSBzaXplKS4gKi8KKyAgICAgIG1lbWNweSAocCwgbWRfcmVhZCAob20sIGFsZ28pLCBkbGVuKTsKKyAgICAgIG1kX2Nsb3NlIChvbSk7CisgICAgfQorfQorCitzdGF0aWMgZ2NyeV9lcnJfY29kZV90CitwcmVwYXJlX21hY3BhZHMgKGdjcnlfbWRfaGRfdCBoZCwgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBzaXplX3Qga2V5bGVuKQoreworICBpbnQgaTsKKyAgaW50IGFsZ28gPSBtZF9nZXRfYWxnbyAoaGQpOworICB1bnNpZ25lZCBjaGFyICpoZWxwa2V5ID0gTlVMTDsKKyAgdW5zaWduZWQgY2hhciAqaXBhZCwgKm9wYWQ7CisKKyAgaWYgKCFhbGdvKQorICAgIHJldHVybiBHUEdfRVJSX0RJR0VTVF9BTEdPOyAvKiBNaWdodCBoYXBwZW4gaWYgbm8gYWxnbyBpcyBlbmFibGVkLiAgKi8KKworICBpZiAoIGtleWxlbiA+IGhkLT5jdHgtPm1hY3BhZHNfQnNpemUgKSAKKyAgICB7CisgICAgICBoZWxwa2V5ID0gZ2NyeV9tYWxsb2Nfc2VjdXJlIChtZF9kaWdlc3RfbGVuZ3RoIChhbGdvKSk7CisgICAgICBpZiAoIWhlbHBrZXkpCisgICAgICAgIHJldHVybiBncGdfZXJyX2NvZGVfZnJvbV9lcnJubyAoZXJybm8pOworICAgICAgZ2NyeV9tZF9oYXNoX2J1ZmZlciAoYWxnbywgaGVscGtleSwga2V5LCBrZXlsZW4pOworICAgICAga2V5ID0gaGVscGtleTsKKyAgICAgIGtleWxlbiA9IG1kX2RpZ2VzdF9sZW5ndGggKGFsZ28pOworICAgICAgZ2NyeV9hc3NlcnQgKCBrZXlsZW4gPD0gaGQtPmN0eC0+bWFjcGFkc19Cc2l6ZSApOworICAgIH0KKworICBtZW1zZXQgKCBoZC0+Y3R4LT5tYWNwYWRzLCAwLCAyKihoZC0+Y3R4LT5tYWNwYWRzX0JzaXplKSApOworICBpcGFkID0gaGQtPmN0eC0+bWFjcGFkczsKKyAgb3BhZCA9IChoZC0+Y3R4LT5tYWNwYWRzKSsoaGQtPmN0eC0+bWFjcGFkc19Cc2l6ZSk7CisgIG1lbWNweSAoIGlwYWQsIGtleSwga2V5bGVuICk7CisgIG1lbWNweSAoIG9wYWQsIGtleSwga2V5bGVuICk7CisgIGZvciAoaT0wOyBpIDwgaGQtPmN0eC0+bWFjcGFkc19Cc2l6ZTsgaSsrICkgCisgICAgeworICAgICAgaXBhZFtpXSBePSAweDM2OworICAgICAgb3BhZFtpXSBePSAweDVjOworICAgIH0KKyAgZ2NyeV9mcmVlIChoZWxwa2V5KTsKKworICByZXR1cm4gR1BHX0VSUl9OT19FUlJPUjsKK30KKworZ2NyeV9lcnJvcl90CitnY3J5X21kX2N0bCAoZ2NyeV9tZF9oZF90IGhkLCBpbnQgY21kLCB2b2lkICpidWZmZXIsIHNpemVfdCBidWZsZW4pCit7CisgIGdjcnlfZXJyX2NvZGVfdCByYyA9IDA7CisgIAorICBzd2l0Y2ggKGNtZCkKKyAgICB7CisgICAgY2FzZSBHQ1JZQ1RMX0ZJTkFMSVpFOgorICAgICAgbWRfZmluYWwgKGhkKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR0NSWUNUTF9TRVRfS0VZOgorICAgICAgcmMgPSBnY3J5X2Vycl9jb2RlIChnY3J5X21kX3NldGtleSAoaGQsIGJ1ZmZlciwgYnVmbGVuKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdDUllDVExfU1RBUlRfRFVNUDoKKyAgICAgIG1kX3N0YXJ0X2RlYnVnIChoZCwgYnVmZmVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR0NSWUNUTF9TVE9QX0RVTVA6CisgICAgICBtZF9zdG9wX2RlYnVnICggaGQgKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByYyA9IEdQR19FUlJfSU5WX09QOworICAgIH0KKyAgcmV0dXJuIGdjcnlfZXJyb3IgKHJjKTsKK30KKworZ2NyeV9lcnJvcl90CitnY3J5X21kX3NldGtleSAoZ2NyeV9tZF9oZF90IGhkLCBjb25zdCB2b2lkICprZXksIHNpemVfdCBrZXlsZW4pCit7CisgIGdjcnlfZXJyX2NvZGVfdCByYyA9IEdQR19FUlJfTk9fRVJST1I7CisKKyAgaWYgKCFoZC0+Y3R4LT5tYWNwYWRzKQorICAgIHJjID0gR1BHX0VSUl9DT05GTElDVDsKKyAgZWxzZQorICAgIHsKKyAgICAgIHJjID0gcHJlcGFyZV9tYWNwYWRzIChoZCwga2V5LCBrZXlsZW4pOworICAgICAgaWYgKCEgcmMpCisJZ2NyeV9tZF9yZXNldCAoaGQpOworICAgIH0KKworICByZXR1cm4gZ2NyeV9lcnJvciAocmMpOworfQorCisvKiBUaGUgbmV3IGRlYnVnIGludGVyZmFjZS4gIElmIFNVRkZJWCBpcyBhIHN0cmluZyBpdCBjcmVhdGVzIGFuIGRlYnVnCisgICBmaWxlIGZvciB0aGUgY29udGV4dCBIRC4gIElGIHN1ZmZpeCBpcyBOVUxMLCB0aGUgZmlsZSBpcyBjbG9zZWQgYW5kCisgICBkZWJ1Z2dpbmcgaXMgc3RvcHBlZC4gICovCit2b2lkCitnY3J5X21kX2RlYnVnIChnY3J5X21kX2hkX3QgaGQsIGNvbnN0IGNoYXIgKnN1ZmZpeCkKK3sKKyAgaWYgKHN1ZmZpeCkKKyAgICBtZF9zdGFydF9kZWJ1ZyAoaGQsIHN1ZmZpeCk7CisgIGVsc2UKKyAgICBtZF9zdG9wX2RlYnVnIChoZCk7Cit9CisKKworCisvKioqKioqKioqKioqKioqKgorICogaWYgQUxHTyBpcyBudWxsIGdldCB0aGUgZGlnZXN0IGZvciB0aGUgdXNlZCBhbGdvICh3aGljaCBzaG91bGQgYmUgb25seSBvbmUpCisgKi8KK3N0YXRpYyBieXRlICoKK21kX3JlYWQoIGdjcnlfbWRfaGRfdCBhLCBpbnQgYWxnbyApCit7CisgIEdjcnlEaWdlc3RFbnRyeSAqciA9IGEtPmN0eC0+bGlzdDsKKworICBpZiAoISBhbGdvKQorICAgIHsKKyAgICAgIC8qIFJldHVybiB0aGUgZmlyc3QgYWxnb3JpdGhtLiAgKi8KKyAgICAgIGlmIChyKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHItPm5leHQpCisgICAgICAgICAgICBsb2dfZGVidWcgKCJtb3JlIHRoYW4gb25lIGFsZ29yaXRobSBpbiBtZF9yZWFkKDApXG4iKTsKKyAgICAgICAgICByZXR1cm4gci0+ZGlnZXN0LT5yZWFkKCAmci0+Y29udGV4dC5jICk7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmb3IgKHIgPSBhLT5jdHgtPmxpc3Q7IHI7IHIgPSByLT5uZXh0KQorCWlmIChyLT5tb2R1bGUtPm1vZF9pZCA9PSBhbGdvKQorCSAgcmV0dXJuIHItPmRpZ2VzdC0+cmVhZCAoJnItPmNvbnRleHQuYyk7CisgICAgfQorICBCVUcoKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBSZWFkIG91dCB0aGUgY29tcGxldGUgZGlnZXN0LCB0aGlzIGZ1bmN0aW9uIGltcGxpY3RseSBmaW5hbGl6ZXMKKyAqIHRoZSBoYXNoLgorICovCitieXRlICoKK2djcnlfbWRfcmVhZCAoZ2NyeV9tZF9oZF90IGhkLCBpbnQgYWxnbykKK3sKKyAgLyogVGhpcyBmdW5jdGlvbiBpcyBleHBlY3RlZCB0byBhbHdheXMgcmV0dXJuIGEgZGlnZXN0LCB0aHVzIHdlCisgICAgIGNhbid0IHJldHVybiBhbiBlcnJvciB3aGljaCB3ZSBhY3R1YWxseSBzaG91bGQgZG8gaW4KKyAgICAgbm9uLW9wZXJhdGlvbmFsIHN0YXRlLiAgKi8KKyAgZ2NyeV9tZF9jdGwgKGhkLCBHQ1JZQ1RMX0ZJTkFMSVpFLCBOVUxMLCAwKTsKKyAgcmV0dXJuIG1kX3JlYWQgKGhkLCBhbGdvKTsKK30KKworCisvKgorICogUmVhZCBvdXQgYW4gaW50ZXJtZWRpYXRlIGRpZ2VzdC4gIE5vdCB5ZXQgZnVuY3Rpb25hbC4KKyAqLworZ2NyeV9lcnJfY29kZV90CitnY3J5X21kX2dldCAoZ2NyeV9tZF9oZF90IGhkLCBpbnQgYWxnbywgYnl0ZSAqYnVmZmVyLCBpbnQgYnVmbGVuKQoreworICAodm9pZCloZDsKKyAgKHZvaWQpYWxnbzsKKyAgKHZvaWQpYnVmZmVyOworICAodm9pZClidWZsZW47CisKKyAgLyptZF9kaWdlc3QgLi4uICovCisgIGZpcHNfc2lnbmFsX2Vycm9yICgidW5pbXBsZW1lbnRlZCBmdW5jdGlvbiBjYWxsZWQiKTsKKyAgcmV0dXJuIEdQR19FUlJfSU5URVJOQUw7Cit9CisKKworLyoKKyAqIFNob3J0Y3V0IGZ1bmN0aW9uIHRvIGhhc2ggYSBidWZmZXIgd2l0aCBhIGdpdmVuIGFsZ28uIFRoZSBvbmx5CisgKiBndWFyYW50ZWVkIHN1cHBvcnRlZCBhbGdvcml0aG1zIGFyZSBSSVBFLU1EMTYwIGFuZCBTSEEtMS4gVGhlCisgKiBzdXBwbGllZCBkaWdlc3QgYnVmZmVyIG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIHN0b3JlIHRoZSByZXN1bHRpbmcKKyAqIGhhc2guICBObyBlcnJvciBpcyByZXR1cm5lZCwgdGhlIGZ1bmN0aW9uIHdpbGwgYWJvcnQgb24gYW4gaW52YWxpZAorICogYWxnby4gIERJU0FCTEVEX0FMR09TIGFyZSBpZ25vcmVkIGhlcmUuICAqLwordm9pZAorZ2NyeV9tZF9oYXNoX2J1ZmZlciAoaW50IGFsZ28sIHZvaWQgKmRpZ2VzdCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkKK3sKKyAgaWYgKGFsZ28gPT0gR0NSWV9NRF9TSEExKQorICAgIF9nY3J5X3NoYTFfaGFzaF9idWZmZXIgKGRpZ2VzdCwgYnVmZmVyLCBsZW5ndGgpOworICBlbHNlIGlmIChhbGdvID09IEdDUllfTURfUk1EMTYwICYmICFmaXBzX21vZGUgKCkgKQorICAgIF9nY3J5X3JtZDE2MF9oYXNoX2J1ZmZlciAoZGlnZXN0LCBidWZmZXIsIGxlbmd0aCk7CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBGb3IgdGhlIG90aGVycyB3ZSBkbyBub3QgaGF2ZSBhIGZhc3QgZnVuY3Rpb24sIHNvIHdlIHVzZSB0aGUKKwkgbm9ybWFsIGZ1bmN0aW9ucy4gKi8KKyAgICAgIGdjcnlfbWRfaGRfdCBoOworICAgICAgZ3BnX2Vycl9jb2RlX3QgZXJyOworCisgICAgICBpZiAoYWxnbyA9PSBHQ1JZX01EX01ENSAmJiBmaXBzX21vZGUgKCkpCisgICAgICAgIHsKKyAgICAgICAgICBfZ2NyeV9pbmFjdGl2YXRlX2ZpcHNfbW9kZSAoIk1ENSB1c2VkIik7CisgICAgICAgICAgaWYgKF9nY3J5X2VuZm9yY2VkX2ZpcHNfbW9kZSAoKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIFdlIHNob3VsZCBuZXZlciBnZXQgdG8gaGVyZSBiZWNhdXNlIHdlIGRvIG5vdCByZWdpc3RlcgorICAgICAgICAgICAgICAgICBNRDUgaW4gZW5mb3JjZWQgZmlwcyBtb2RlLiAgKi8KKyAgICAgICAgICAgICAgX2djcnlfZmlwc19ub3JldHVybiAoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBlcnIgPSBtZF9vcGVuICgmaCwgYWxnbywgMCwgMCk7CisgICAgICBpZiAoZXJyKQorCWxvZ19idWcgKCJnY3J5X21kX29wZW4gZmFpbGVkIGZvciBhbGdvICVkOiAlcyIsCisgICAgICAgICAgICAgICAgIGFsZ28sIGdwZ19zdHJlcnJvciAoZ2NyeV9lcnJvcihlcnIpKSk7CisgICAgICBtZF93cml0ZSAoaCwgKGJ5dGUgKikgYnVmZmVyLCBsZW5ndGgpOworICAgICAgbWRfZmluYWwgKGgpOworICAgICAgbWVtY3B5IChkaWdlc3QsIG1kX3JlYWQgKGgsIGFsZ28pLCBtZF9kaWdlc3RfbGVuZ3RoIChhbGdvKSk7CisgICAgICBtZF9jbG9zZSAoaCk7CisgICAgfQorfQorCitzdGF0aWMgaW50CittZF9nZXRfYWxnbyAoZ2NyeV9tZF9oZF90IGEpCit7CisgIEdjcnlEaWdlc3RFbnRyeSAqciA9IGEtPmN0eC0+bGlzdDsKKworICBpZiAociAmJiByLT5uZXh0KQorICAgIHsKKyAgICAgIGZpcHNfc2lnbmFsX2Vycm9yICgicG9zc2libGUgdXNhZ2UgZXJyb3IiKTsKKyAgICAgIGxvZ19lcnJvciAoIldBUk5JTkc6IG1vcmUgdGhhbiBvbmUgYWxnb3JpdGhtIGluIG1kX2dldF9hbGdvKClcbiIpOworICAgIH0KKyAgcmV0dXJuIHIgPyByLT5tb2R1bGUtPm1vZF9pZCA6IDA7Cit9CisKK2ludAorZ2NyeV9tZF9nZXRfYWxnbyAoZ2NyeV9tZF9oZF90IGhkKQoreworICByZXR1cm4gbWRfZ2V0X2FsZ28gKGhkKTsKK30KKworCisvKioqKioqKioqKioqKioqKgorICogUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGRpZ2VzdAorICovCitzdGF0aWMgaW50CittZF9kaWdlc3RfbGVuZ3RoIChpbnQgYWxnb3JpdGhtKQoreworICBnY3J5X21vZHVsZV90IGRpZ2VzdDsKKyAgaW50IG1kbGVuID0gMDsKKworICBSRUdJU1RFUl9ERUZBVUxUX0RJR0VTVFM7CisKKyAgYXRoX211dGV4X2xvY2sgKCZkaWdlc3RzX3JlZ2lzdGVyZWRfbG9jayk7CisgIGRpZ2VzdCA9IF9nY3J5X21vZHVsZV9sb29rdXBfaWQgKGRpZ2VzdHNfcmVnaXN0ZXJlZCwgYWxnb3JpdGhtKTsKKyAgaWYgKGRpZ2VzdCkKKyAgICB7CisgICAgICBtZGxlbiA9ICgoZ2NyeV9tZF9zcGVjX3QgKikgZGlnZXN0LT5zcGVjKS0+bWRsZW47CisgICAgICBfZ2NyeV9tb2R1bGVfcmVsZWFzZSAoZGlnZXN0KTsKKyAgICB9CisgIGF0aF9tdXRleF91bmxvY2sgKCZkaWdlc3RzX3JlZ2lzdGVyZWRfbG9jayk7CisKKyAgcmV0dXJuIG1kbGVuOworfQorCisvKioqKioqKioqKioqKioqKgorICogUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGRpZ2VzdCBpbiBieXRlcy4KKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gMCBpbiBjYXNlIG9mIGVycm9ycy4KKyAqLwordW5zaWduZWQgaW50CitnY3J5X21kX2dldF9hbGdvX2RsZW4gKGludCBhbGdvcml0aG0pCit7CisgIHJldHVybiBtZF9kaWdlc3RfbGVuZ3RoIChhbGdvcml0aG0pOworfQorCisKKy8qIEhtbW06IGFkZCBhIG1vZGUgdG8gZW51bWVyYXRlIHRoZSBPSURzCisgKgl0byBtYWtlIGcxMC9zaWctY2hlY2suYyBtb3JlIHBvcnRhYmxlICovCitzdGF0aWMgY29uc3QgYnl0ZSAqCittZF9hc25fb2lkIChpbnQgYWxnb3JpdGhtLCBzaXplX3QgKmFzbmxlbiwgc2l6ZV90ICptZGxlbikKK3sKKyAgY29uc3QgYnl0ZSAqYXNub2lkID0gTlVMTDsKKyAgZ2NyeV9tb2R1bGVfdCBkaWdlc3Q7CisKKyAgUkVHSVNURVJfREVGQVVMVF9ESUdFU1RTOworCisgIGF0aF9tdXRleF9sb2NrICgmZGlnZXN0c19yZWdpc3RlcmVkX2xvY2spOworICBkaWdlc3QgPSBfZ2NyeV9tb2R1bGVfbG9va3VwX2lkIChkaWdlc3RzX3JlZ2lzdGVyZWQsIGFsZ29yaXRobSk7CisgIGlmIChkaWdlc3QpCisgICAgeworICAgICAgaWYgKGFzbmxlbikKKwkqYXNubGVuID0gKChnY3J5X21kX3NwZWNfdCAqKSBkaWdlc3QtPnNwZWMpLT5hc25sZW47CisgICAgICBpZiAobWRsZW4pCisJKm1kbGVuID0gKChnY3J5X21kX3NwZWNfdCAqKSBkaWdlc3QtPnNwZWMpLT5tZGxlbjsKKyAgICAgIGFzbm9pZCA9ICgoZ2NyeV9tZF9zcGVjX3QgKikgZGlnZXN0LT5zcGVjKS0+YXNub2lkOworICAgICAgX2djcnlfbW9kdWxlX3JlbGVhc2UgKGRpZ2VzdCk7CisgICAgfQorICBlbHNlCisgICAgbG9nX2J1ZyAoIm5vIEFTTi4xIE9JRCBmb3IgbWQgYWxnbyAlZFxuIiwgYWxnb3JpdGhtKTsKKyAgYXRoX211dGV4X3VubG9jayAoJmRpZ2VzdHNfcmVnaXN0ZXJlZF9sb2NrKTsKKworICByZXR1cm4gYXNub2lkOworfQorCisKKworLyoqKioqKioqKioqKioqKioKKyAqIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZ2l2ZW4gY2lwaGVyIGFsZ29yaXRobQorICogV0hBVCBzZWxlY3QgdGhlIGtpbmQgb2YgaW5mb3JtYXRpb24gcmV0dXJuZWQ6CisgKiAgR0NSWUNUTF9URVNUX0FMR086CisgKglSZXR1cm5zIDAgd2hlbiB0aGUgc3BlY2lmaWVkIGFsZ29yaXRobSBpcyBhdmFpbGFibGUgZm9yIHVzZS4KKyAqCWJ1ZmZlciBhbmQgbmJ5dGVzIG11c3QgYmUgemVyby4KKyAqICBHQ1JZQ1RMX0dFVF9BU05PSUQ6CisgKglSZXR1cm4gdGhlIEFTTk9JRCBvZiB0aGUgYWxnb3JpdGhtIGluIGJ1ZmZlci4gaWYgYnVmZmVyIGlzIE5VTEwsIG9ubHkKKyAqCXRoZSByZXF1aXJlZCBsZW5ndGggaXMgcmV0dXJuZWQuCisgKgorICogTm90ZTogIEJlY2F1c2UgdGhpcyBmdW5jdGlvbiBpcyBpbiBtb3N0IGNhc2VzIHVzZWQgdG8gcmV0dXJuIGFuCisgKiBpbnRlZ2VyIHZhbHVlLCB3ZSBjYW4gbWFrZSBpdCBlYXNpZXIgZm9yIHRoZSBjYWxsZXIgdG8ganVzdCBsb29rIGF0CisgKiB0aGUgcmV0dXJuIHZhbHVlLiAgVGhlIGNhbGxlciB3aWxsIGluIGFsbCBjYXNlcyBjb25zdWx0IHRoZSB2YWx1ZQorICogYW5kIHRoZXJlYnkgZGV0ZWN0aW5nIHdoZXRoZXIgYSBlcnJvciBvY2N1cmVkIG9yIG5vdCAoaS5lLiB3aGlsZSBjaGVja2luZworICogdGhlIGJsb2NrIHNpemUpCisgKi8KK2djcnlfZXJyb3JfdAorZ2NyeV9tZF9hbGdvX2luZm8gKGludCBhbGdvLCBpbnQgd2hhdCwgdm9pZCAqYnVmZmVyLCBzaXplX3QgKm5ieXRlcykKK3sKKyAgZ2NyeV9lcnJfY29kZV90IGVyciA9IEdQR19FUlJfTk9fRVJST1I7CisKKyAgc3dpdGNoICh3aGF0KQorICAgIHsKKyAgICBjYXNlIEdDUllDVExfVEVTVF9BTEdPOgorICAgICAgaWYgKGJ1ZmZlciB8fCBuYnl0ZXMpCisJZXJyID0gR1BHX0VSUl9JTlZfQVJHOworICAgICAgZWxzZQorCWVyciA9IGNoZWNrX2RpZ2VzdF9hbGdvIChhbGdvKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBHQ1JZQ1RMX0dFVF9BU05PSUQ6CisgICAgICAvKiBXZSBuZWVkIHRvIGNoZWNrIHRoYXQgdGhlIGFsZ28gaXMgYXZhaWxhYmxlIGJlY2F1c2UKKyAgICAgICAgIG1kX2Fzbl9vaWQgd291bGQgb3RoZXJ3aXNlIHJhaXNlIGFuIGFzc2VydGlvbi4gKi8KKyAgICAgIGVyciA9IGNoZWNrX2RpZ2VzdF9hbGdvIChhbGdvKTsKKyAgICAgIGlmICghZXJyKQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgY2hhciB1bnNpZ25lZCAqYXNuOworICAgICAgICAgIHNpemVfdCBhc25sZW47CisgICAgICAgICAgCisgICAgICAgICAgYXNuID0gbWRfYXNuX29pZCAoYWxnbywgJmFzbmxlbiwgTlVMTCk7CisgICAgICAgICAgaWYgKGJ1ZmZlciAmJiAoKm5ieXRlcyA+PSBhc25sZW4pKQorCSAgeworCSAgICBtZW1jcHkgKGJ1ZmZlciwgYXNuLCBhc25sZW4pOworCSAgICAqbmJ5dGVzID0gYXNubGVuOworCSAgfQorICAgICAgICAgIGVsc2UgaWYgKCFidWZmZXIgJiYgbmJ5dGVzKQorICAgICAgICAgICAgKm5ieXRlcyA9IGFzbmxlbjsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChidWZmZXIpCisgICAgICAgICAgICAgICAgZXJyID0gR1BHX0VSUl9UT09fU0hPUlQ7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBlcnIgPSBHUEdfRVJSX0lOVl9BUkc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgZXJyID0gR1BHX0VSUl9JTlZfT1A7CisgIH0KKworICByZXR1cm4gZ2NyeV9lcnJvciAoZXJyKTsKK30KKworCitzdGF0aWMgdm9pZAorbWRfc3RhcnRfZGVidWcgKCBnY3J5X21kX2hkX3QgbWQsIGNvbnN0IGNoYXIgKnN1ZmZpeCApCit7CisgIHN0YXRpYyBpbnQgaWR4PTA7CisgIGNoYXIgYnVmWzUwXTsKKworICBpZiAoZmlwc19tb2RlICgpKQorICAgIHJldHVybjsKKyAgCisgIGlmICggbWQtPmN0eC0+ZGVidWcgKQorICAgIHsKKyAgICAgIGxvZ19kZWJ1ZygiT29wczogbWQgZGVidWcgYWxyZWFkeSBzdGFydGVkXG4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGlkeCsrOworICBzbnByaW50ZiAoYnVmLCBESU0oYnVmKS0xLCAiZGJnbWQtJTA1ZC4lLjEwcyIsIGlkeCwgc3VmZml4ICk7CisgIG1kLT5jdHgtPmRlYnVnID0gZm9wZW4oYnVmLCAidyIpOworICBpZiAoICFtZC0+Y3R4LT5kZWJ1ZyApCisgICAgbG9nX2RlYnVnKCJtZCBkZWJ1ZzogY2FuJ3Qgb3BlbiAlc1xuIiwgYnVmICk7Cit9CisKK3N0YXRpYyB2b2lkCittZF9zdG9wX2RlYnVnKCBnY3J5X21kX2hkX3QgbWQgKQoreworICBpZiAoIG1kLT5jdHgtPmRlYnVnICkKKyAgICB7CisgICAgICBpZiAoIG1kLT5idWZwb3MgKQorICAgICAgICBtZF93cml0ZSAoIG1kLCBOVUxMLCAwICk7CisgICAgICBmY2xvc2UgKG1kLT5jdHgtPmRlYnVnKTsKKyAgICAgIG1kLT5jdHgtPmRlYnVnID0gTlVMTDsKKyAgICB9CisKKyNpZmRlZiBIQVZFX1U2NF9UWVBFREVGCisgIHsgIC8qIGEga2x1ZGdlIHRvIHB1bGwgaW4gdGhlIF9fbXVsZGkzIGZvciBTb2xhcmlzICovCisgICAgdm9sYXRpbGUgdTMyIGEgPSAodTMyKSh1bG9uZyltZDsKKyAgICB2b2xhdGlsZSB1NjQgYiA9IDQyOworICAgIHZvbGF0aWxlIHU2NCBjOworICAgIGMgPSBhICogYjsKKyAgfQorI2VuZGlmCit9CisKKworCisvKgorICogUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkaWdlc3QgaGFuZGxlLgorICogIEdDUllDVExfSVNfU0VDVVJFOgorICoJUmV0dXJucyAxIHdoZW4gdGhlIGhhbmRsZSB3b3JrcyBvbiBzZWN1cmVkIG1lbW9yeQorICoJb3RoZXJ3aXNlIDAgaXMgcmV0dXJuZWQuICBUaGVyZSBpcyBubyBlcnJvciByZXR1cm4uCisgKiAgR0NSWUNUTF9JU19BTEdPX0VOQUJMRUQ6CisgKiAgICAgUmV0dXJucyAxIGlmIHRoZSBhbGdvIGlzIGVuYWJsZWQgZm9yIHRoYXQgaGFuZGxlLgorICogICAgIFRoZSBhbGdvIG11c3QgYmUgcGFzc2VkIGFzIHRoZSBhZGRyZXNzIG9mIGFuIGludC4KKyAqLworZ2NyeV9lcnJvcl90CitnY3J5X21kX2luZm8gKGdjcnlfbWRfaGRfdCBoLCBpbnQgY21kLCB2b2lkICpidWZmZXIsIHNpemVfdCAqbmJ5dGVzKQoreworICBnY3J5X2Vycl9jb2RlX3QgZXJyID0gR1BHX0VSUl9OT19FUlJPUjsKKworICBzd2l0Y2ggKGNtZCkKKyAgICB7CisgICAgY2FzZSBHQ1JZQ1RMX0lTX1NFQ1VSRToKKyAgICAgICpuYnl0ZXMgPSBoLT5jdHgtPnNlY3VyZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBHQ1JZQ1RMX0lTX0FMR09fRU5BQkxFRDoKKyAgICAgIHsKKwlHY3J5RGlnZXN0RW50cnkgKnI7CisJaW50IGFsZ287CisKKwlpZiAoICFidWZmZXIgfHwgKG5ieXRlcyAmJiAoKm5ieXRlcyAhPSBzaXplb2YgKGludCkpKSkKKwkgIGVyciA9IEdQR19FUlJfSU5WX0FSRzsKKwllbHNlCisJICB7CisJICAgIGFsZ28gPSAqKGludCopYnVmZmVyOworCSAgICAKKwkgICAgKm5ieXRlcyA9IDA7CisJICAgIGZvcihyPWgtPmN0eC0+bGlzdDsgcjsgciA9IHItPm5leHQgKSB7CisJICAgICAgaWYgKHItPm1vZHVsZS0+bW9kX2lkID09IGFsZ28pCisJCXsKKwkJICAqbmJ5dGVzID0gMTsKKwkJICBicmVhazsKKwkJfQorCSAgICB9CisJICB9CisJYnJlYWs7CisgICAgICB9CisKKyAgZGVmYXVsdDoKKyAgICBlcnIgPSBHUEdfRVJSX0lOVl9PUDsKKyAgfQorCisgIHJldHVybiBnY3J5X2Vycm9yIChlcnIpOworfQorCisKKy8qIEV4cGxpY2l0bHkgaW5pdGlhbGl6ZSB0aGlzIG1vZHVsZS4gICovCitnY3J5X2Vycl9jb2RlX3QKK19nY3J5X21kX2luaXQgKHZvaWQpCit7CisgIGdjcnlfZXJyX2NvZGVfdCBlcnIgPSBHUEdfRVJSX05PX0VSUk9SOworCisgIFJFR0lTVEVSX0RFRkFVTFRfRElHRVNUUzsKKworICByZXR1cm4gZXJyOworfQorCisKK2ludAorZ2NyeV9tZF9pc19zZWN1cmUgKGdjcnlfbWRfaGRfdCBhKSAKK3sKKyAgc2l6ZV90IHZhbHVlOworCisgIGlmIChnY3J5X21kX2luZm8gKGEsIEdDUllDVExfSVNfU0VDVVJFLCBOVUxMLCAmdmFsdWUpKQorICAgIHZhbHVlID0gMTsgLyogSXQgc2VlbXMgdG8gYmUgYmV0dGVyIHRvIGFzc3VtZSBzZWN1cmUgbWVtb3J5IG9uCisgICAgICAgICAgICAgICAgICBlcnJvci4gKi8KKyAgcmV0dXJuIHZhbHVlOworfQorCisKK2ludAorZ2NyeV9tZF9pc19lbmFibGVkIChnY3J5X21kX2hkX3QgYSwgaW50IGFsZ28pIAoreworICBzaXplX3QgdmFsdWU7CisKKyAgdmFsdWUgPSBzaXplb2YgYWxnbzsKKyAgaWYgKGdjcnlfbWRfaW5mbyAoYSwgR0NSWUNUTF9JU19BTEdPX0VOQUJMRUQsICZhbGdvLCAmdmFsdWUpKQorICAgIHZhbHVlID0gMDsKKyAgcmV0dXJuIHZhbHVlOworfQorCisvKiBHZXQgYSBsaXN0IGNvbnNpc3Rpbmcgb2YgdGhlIElEcyBvZiB0aGUgbG9hZGVkIG1lc3NhZ2UgZGlnZXN0CisgICBtb2R1bGVzLiAgSWYgTElTVCBpcyB6ZXJvLCB3cml0ZSB0aGUgbnVtYmVyIG9mIGxvYWRlZCBtZXNzYWdlCisgICBkaWdlc3QgbW9kdWxlcyB0byBMSVNUX0xFTkdUSCBhbmQgcmV0dXJuLiAgSWYgTElTVCBpcyBub24temVybywgdGhlCisgICBmaXJzdCAqTElTVF9MRU5HVEggYWxnb3JpdGhtIElEcyBhcmUgc3RvcmVkIGluIExJU1QsIHdoaWNoIG11c3QgYmUKKyAgIG9mIGFjY29yZGluZyBzaXplLiAgSW4gY2FzZSB0aGVyZSBhcmUgbGVzcyBtZXNzYWdlIGRpZ2VzdCBtb2R1bGVzCisgICB0aGFuICpMSVNUX0xFTkdUSCwgKkxJU1RfTEVOR1RIIGlzIHVwZGF0ZWQgdG8gdGhlIGNvcnJlY3QKKyAgIG51bWJlci4gICovCitnY3J5X2Vycm9yX3QKK2djcnlfbWRfbGlzdCAoaW50ICpsaXN0LCBpbnQgKmxpc3RfbGVuZ3RoKQoreworICBnY3J5X2Vycl9jb2RlX3QgZXJyID0gR1BHX0VSUl9OT19FUlJPUjsKKworICBhdGhfbXV0ZXhfbG9jayAoJmRpZ2VzdHNfcmVnaXN0ZXJlZF9sb2NrKTsKKyAgZXJyID0gX2djcnlfbW9kdWxlX2xpc3QgKGRpZ2VzdHNfcmVnaXN0ZXJlZCwgbGlzdCwgbGlzdF9sZW5ndGgpOworICBhdGhfbXV0ZXhfdW5sb2NrICgmZGlnZXN0c19yZWdpc3RlcmVkX2xvY2spOworCisgIHJldHVybiBlcnI7Cit9CisKKworLyogUnVuIHRoZSBzZWxmdGVzdHMgZm9yIGRpZ2VzdCBhbGdvcml0aG0gQUxHTyB3aXRoIG9wdGlvbmFsIHJlcG9ydGluZworICAgZnVuY3Rpb24gUkVQT1JULiAgKi8KK2dwZ19lcnJvcl90CitfZ2NyeV9tZF9zZWxmdGVzdCAoaW50IGFsZ28sIGludCBleHRlbmRlZCwgc2VsZnRlc3RfcmVwb3J0X2Z1bmNfdCByZXBvcnQpCit7CisgIGdjcnlfbW9kdWxlX3QgbW9kdWxlID0gTlVMTDsKKyAgY2lwaGVyX2V4dHJhX3NwZWNfdCAqZXh0cmFzcGVjID0gTlVMTDsKKyAgZ2NyeV9lcnJfY29kZV90IGVjID0gMDsKKworICBSRUdJU1RFUl9ERUZBVUxUX0RJR0VTVFM7CisKKyAgYXRoX211dGV4X2xvY2sgKCZkaWdlc3RzX3JlZ2lzdGVyZWRfbG9jayk7CisgIG1vZHVsZSA9IF9nY3J5X21vZHVsZV9sb29rdXBfaWQgKGRpZ2VzdHNfcmVnaXN0ZXJlZCwgYWxnbyk7CisgIGlmIChtb2R1bGUgJiYgIShtb2R1bGUtPmZsYWdzICYgRkxBR19NT0RVTEVfRElTQUJMRUQpKQorICAgIGV4dHJhc3BlYyA9IG1vZHVsZS0+ZXh0cmFzcGVjOworICBhdGhfbXV0ZXhfdW5sb2NrICgmZGlnZXN0c19yZWdpc3RlcmVkX2xvY2spOworICBpZiAoZXh0cmFzcGVjICYmIGV4dHJhc3BlYy0+c2VsZnRlc3QpCisgICAgZWMgPSBleHRyYXNwZWMtPnNlbGZ0ZXN0IChhbGdvLCBleHRlbmRlZCwgcmVwb3J0KTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGVjID0gR1BHX0VSUl9ESUdFU1RfQUxHTzsKKyAgICAgIGlmIChyZXBvcnQpCisgICAgICAgIHJlcG9ydCAoImRpZ2VzdCIsIGFsZ28sICJtb2R1bGUiLCAKKyAgICAgICAgICAgICAgICBtb2R1bGUgJiYgIShtb2R1bGUtPmZsYWdzICYgRkxBR19NT0RVTEVfRElTQUJMRUQpPworICAgICAgICAgICAgICAgICJubyBzZWxmdGVzdCBhdmFpbGFibGUiIDoKKyAgICAgICAgICAgICAgICBtb2R1bGU/ICJhbGdvcml0aG0gZGlzYWJsZWQiIDogImFsZ29yaXRobSBub3QgZm91bmQiKTsKKyAgICB9CisKKyAgaWYgKG1vZHVsZSkKKyAgICB7CisgICAgICBhdGhfbXV0ZXhfbG9jayAoJmRpZ2VzdHNfcmVnaXN0ZXJlZF9sb2NrKTsKKyAgICAgIF9nY3J5X21vZHVsZV9yZWxlYXNlIChtb2R1bGUpOworICAgICAgYXRoX211dGV4X3VubG9jayAoJmRpZ2VzdHNfcmVnaXN0ZXJlZF9sb2NrKTsKKyAgICB9CisgIHJldHVybiBncGdfZXJyb3IgKGVjKTsKK30KZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9jaXBoZXIvbWQ0LmMgYi9saWJnY3J5cHQtMS40LjYvY2lwaGVyL21kNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MGNmODcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvY2lwaGVyL21kNC5jCkBAIC0wLDAgKzEsMzI4IEBACisvKiBtZDQuYyAtIE1ENCBNZXNzYWdlLURpZ2VzdCBBbGdvcml0aG0KKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKgorICogQmFzZWQgb24gbWQ1LmMgaW4gbGliZ2NyeXB0LCBidXQgcmV3cml0dGVuIHRvIGNvbXB1dGUgbWQ0IGNoZWNrc3VtcworICogdXNpbmcgYSBwdWJsaWMgZG9tYWluIG1kNCBpbXBsZW1lbnRhdGlvbiB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWVudHM6CisgKgorICogTW9kaWZpZWQgYnkgV2VpIERhaSBmcm9tIEFuZHJldyBNLiBLdWNobGluZydzIG1kNC5jCisgKiBUaGUgb3JpZ2luYWwgY29kZSBhbmQgYWxsIG1vZGlmaWNhdGlvbnMgYXJlIGluIHRoZSBwdWJsaWMgZG9tYWluLgorICoKKyAqIFRoaXMgaXMgdGhlIG9yaWdpbmFsIGludHJvZHVjdG9yeSBjb21tZW50OgorICoKKyAqICBtZDQuYyA6IE1ENCBoYXNoIGFsZ29yaXRobS4KKyAqCisgKiBQYXJ0IG9mIHRoZSBQeXRob24gQ3J5cHRvZ3JhcGh5IFRvb2xraXQsIHZlcnNpb24gMS4xCisgKgorICogRGlzdHJpYnV0ZSBhbmQgdXNlIGZyZWVseTsgdGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucyBvbiBmdXJ0aGVyCisgKiBkaXNzZW1pbmF0aW9uIGFuZCB1c2FnZSBleGNlcHQgdGhvc2UgaW1wb3NlZCBieSB0aGUgbGF3cyBvZiB5b3VyCisgKiBjb3VudHJ5IG9mIHJlc2lkZW5jZS4KKyAqCisgKi8KKworLyogTUQ0IHRlc3Qgc3VpdGU6CisgKiBNRDQgKCIiKSA9IDMxZDZjZmUwZDE2YWU5MzFiNzNjNTlkN2UwYzA4OWMwCisgKiBNRDQgKCJhIikgPSBiZGU1MmNiMzFkZTMzZTQ2MjQ1ZTA1ZmJkYmQ2ZmIyNAorICogTUQ0ICgiYWJjIikgPSBhNDQ4MDE3YWFmMjFkODUyNWZjMTBhZTg3YWE2NzI5ZAorICogTUQ0ICgibWVzc2FnZSBkaWdlc3QiKSA9IGQ5MTMwYTgxNjQ1NDlmZTgxODg3NDgwNmUxYzcwMTRiCisgKiBNRDQgKCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIpID0gZDc5ZTFjMzA4YWE1YmJjZGVlYThlZDYzZGY0MTJkYTkKKyAqIE1ENCAoIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5IikgPQorICogMDQzZjg1ODJmMjQxZGIzNTFjZTYyN2UxNTNlN2YwZTQKKyAqIE1ENCAoIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1NgorICogNzg5MDEyMzQ1Njc4OTAiKSA9IGUzM2I0ZGRjOWMzOGYyMTk5YzNlN2IxNjRmY2MwNTM2CisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnMTBsaWIuaCIKKyNpbmNsdWRlICJtZW1vcnkuaCIKKyNpbmNsdWRlICJjaXBoZXIuaCIKKworI2luY2x1ZGUgImJpdGhlbHAuaCIKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdTMyIEEsQixDLEQ7CSAgLyogY2hhaW5pbmcgdmFyaWFibGVzICovCisgICAgdTMyICBuYmxvY2tzOworICAgIGJ5dGUgYnVmWzY0XTsKKyAgICBpbnQgIGNvdW50OworfSBNRDRfQ09OVEVYVDsKKworCitzdGF0aWMgdm9pZAorbWQ0X2luaXQoIHZvaWQgKmNvbnRleHQgKQoreworICBNRDRfQ09OVEVYVCAqY3R4ID0gY29udGV4dDsKKworICBjdHgtPkEgPSAweDY3NDUyMzAxOworICBjdHgtPkIgPSAweGVmY2RhYjg5OworICBjdHgtPkMgPSAweDk4YmFkY2ZlOworICBjdHgtPkQgPSAweDEwMzI1NDc2OworCisgIGN0eC0+bmJsb2NrcyA9IDA7CisgIGN0eC0+Y291bnQgPSAwOworfQorCisjZGVmaW5lIEYoeCwgeSwgeikgKCh6KSBeICgoeCkgJiAoKHkpIF4gKHopKSkpCisjZGVmaW5lIEcoeCwgeSwgeikgKCgoeCkgJiAoeSkpIHwgKCh4KSAmICh6KSkgfCAoKHkpICYgKHopKSkKKyNkZWZpbmUgSCh4LCB5LCB6KSAoKHgpIF4gKHkpIF4gKHopKQorCisKKy8qKioqKioqKioqKioqKioqCisgKiB0cmFuc2Zvcm0gNjQgYnl0ZXMKKyAqLworc3RhdGljIHZvaWQKK3RyYW5zZm9ybSAoIE1ENF9DT05URVhUICpjdHgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEgKQoreworICB1MzIgaW5bMTZdOworICByZWdpc3RlciB1MzIgQSA9IGN0eC0+QTsKKyAgcmVnaXN0ZXIgdTMyIEIgPSBjdHgtPkI7CisgIHJlZ2lzdGVyIHUzMiBDID0gY3R4LT5DOworICByZWdpc3RlciB1MzIgRCA9IGN0eC0+RDsKKworI2lmZGVmIFdPUkRTX0JJR0VORElBTgorICB7CisgICAgaW50IGk7CisgICAgYnl0ZSAqcDIsICpwMTsKKyAgICBmb3IoaT0wLCBwMT1kYXRhLCBwMj0oYnl0ZSopaW47IGkgPCAxNjsgaSsrLCBwMiArPSA0ICkKKyAgICAgIHsKKwlwMlszXSA9ICpwMSsrOworCXAyWzJdID0gKnAxKys7CisJcDJbMV0gPSAqcDErKzsKKwlwMlswXSA9ICpwMSsrOworICAgICAgfQorICB9CisjZWxzZQorICBtZW1jcHkgKGluLCBkYXRhLCA2NCk7CisjZW5kaWYKKworICAvKiBSb3VuZCAxLiAgKi8KKyNkZWZpbmUgZnVuY3Rpb24oYSxiLGMsZCxrLHMpIGE9cm9sKGErRihiLGMsZCkraW5ba10scyk7CisgIGZ1bmN0aW9uKEEsQixDLEQsIDAsIDMpOworICBmdW5jdGlvbihELEEsQixDLCAxLCA3KTsKKyAgZnVuY3Rpb24oQyxELEEsQiwgMiwxMSk7CisgIGZ1bmN0aW9uKEIsQyxELEEsIDMsMTkpOworICBmdW5jdGlvbihBLEIsQyxELCA0LCAzKTsKKyAgZnVuY3Rpb24oRCxBLEIsQywgNSwgNyk7CisgIGZ1bmN0aW9uKEMsRCxBLEIsIDYsMTEpOworICBmdW5jdGlvbihCLEMsRCxBLCA3LDE5KTsKKyAgZnVuY3Rpb24oQSxCLEMsRCwgOCwgMyk7CisgIGZ1bmN0aW9uKEQsQSxCLEMsIDksIDcpOworICBmdW5jdGlvbihDLEQsQSxCLDEwLDExKTsKKyAgZnVuY3Rpb24oQixDLEQsQSwxMSwxOSk7CisgIGZ1bmN0aW9uKEEsQixDLEQsMTIsIDMpOworICBmdW5jdGlvbihELEEsQixDLDEzLCA3KTsKKyAgZnVuY3Rpb24oQyxELEEsQiwxNCwxMSk7CisgIGZ1bmN0aW9uKEIsQyxELEEsMTUsMTkpOworCisjdW5kZWYgZnVuY3Rpb24KKworICAvKiBSb3VuZCAyLiAgKi8KKyNkZWZpbmUgZnVuY3Rpb24oYSxiLGMsZCxrLHMpIGE9cm9sKGErRyhiLGMsZCkraW5ba10rMHg1YTgyNzk5OSxzKTsKKworICBmdW5jdGlvbihBLEIsQyxELCAwLCAzKTsKKyAgZnVuY3Rpb24oRCxBLEIsQywgNCwgNSk7CisgIGZ1bmN0aW9uKEMsRCxBLEIsIDgsIDkpOworICBmdW5jdGlvbihCLEMsRCxBLDEyLDEzKTsKKyAgZnVuY3Rpb24oQSxCLEMsRCwgMSwgMyk7CisgIGZ1bmN0aW9uKEQsQSxCLEMsIDUsIDUpOworICBmdW5jdGlvbihDLEQsQSxCLCA5LCA5KTsKKyAgZnVuY3Rpb24oQixDLEQsQSwxMywxMyk7CisgIGZ1bmN0aW9uKEEsQixDLEQsIDIsIDMpOworICBmdW5jdGlvbihELEEsQixDLCA2LCA1KTsKKyAgZnVuY3Rpb24oQyxELEEsQiwxMCwgOSk7CisgIGZ1bmN0aW9uKEIsQyxELEEsMTQsMTMpOworICBmdW5jdGlvbihBLEIsQyxELCAzLCAzKTsKKyAgZnVuY3Rpb24oRCxBLEIsQywgNywgNSk7CisgIGZ1bmN0aW9uKEMsRCxBLEIsMTEsIDkpOworICBmdW5jdGlvbihCLEMsRCxBLDE1LDEzKTsKKworI3VuZGVmIGZ1bmN0aW9uCisKKyAgLyogUm91bmQgMy4gICovCisjZGVmaW5lIGZ1bmN0aW9uKGEsYixjLGQsayxzKSBhPXJvbChhK0goYixjLGQpK2luW2tdKzB4NmVkOWViYTEscyk7CisKKyAgZnVuY3Rpb24oQSxCLEMsRCwgMCwgMyk7CisgIGZ1bmN0aW9uKEQsQSxCLEMsIDgsIDkpOworICBmdW5jdGlvbihDLEQsQSxCLCA0LDExKTsKKyAgZnVuY3Rpb24oQixDLEQsQSwxMiwxNSk7CisgIGZ1bmN0aW9uKEEsQixDLEQsIDIsIDMpOworICBmdW5jdGlvbihELEEsQixDLDEwLCA5KTsKKyAgZnVuY3Rpb24oQyxELEEsQiwgNiwxMSk7CisgIGZ1bmN0aW9uKEIsQyxELEEsMTQsMTUpOworICBmdW5jdGlvbihBLEIsQyxELCAxLCAzKTsKKyAgZnVuY3Rpb24oRCxBLEIsQywgOSwgOSk7CisgIGZ1bmN0aW9uKEMsRCxBLEIsIDUsMTEpOworICBmdW5jdGlvbihCLEMsRCxBLDEzLDE1KTsKKyAgZnVuY3Rpb24oQSxCLEMsRCwgMywgMyk7CisgIGZ1bmN0aW9uKEQsQSxCLEMsMTEsIDkpOworICBmdW5jdGlvbihDLEQsQSxCLCA3LDExKTsKKyAgZnVuY3Rpb24oQixDLEQsQSwxNSwxNSk7CisKKworICAvKiBQdXQgY2hlY2tzdW0gaW4gY29udGV4dCBnaXZlbiBhcyBhcmd1bWVudC4gICovCisgIGN0eC0+QSArPSBBOworICBjdHgtPkIgKz0gQjsKKyAgY3R4LT5DICs9IEM7CisgIGN0eC0+RCArPSBEOworfQorCisKKworLyogVGhlIHJvdXRpbmUgdXBkYXRlcyB0aGUgbWVzc2FnZS1kaWdlc3QgY29udGV4dCB0bworICogYWNjb3VudCBmb3IgdGhlIHByZXNlbmNlIG9mIGVhY2ggb2YgdGhlIGNoYXJhY3RlcnMgaW5CdWZbMC4uaW5MZW4tMV0KKyAqIGluIHRoZSBtZXNzYWdlIHdob3NlIGRpZ2VzdCBpcyBiZWluZyBjb21wdXRlZC4KKyAqLworc3RhdGljIHZvaWQKK21kNF93cml0ZSAoIHZvaWQgKmNvbnRleHQsIGNvbnN0IHZvaWQgKmluYnVmX2FyZywgc2l6ZV90IGlubGVuKQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICppbmJ1ZiA9IGluYnVmX2FyZzsKKyAgTUQ0X0NPTlRFWFQgKmhkID0gY29udGV4dDsKKworICBpZiggaGQtPmNvdW50ID09IDY0ICkgLyogZmx1c2ggdGhlIGJ1ZmZlciAqLworICAgIHsgCisgICAgICB0cmFuc2Zvcm0oIGhkLCBoZC0+YnVmICk7CisgICAgICBfZ2NyeV9idXJuX3N0YWNrICg4MCs2KnNpemVvZih2b2lkKikpOworICAgICAgaGQtPmNvdW50ID0gMDsKKyAgICAgIGhkLT5uYmxvY2tzKys7CisgICAgfQorICBpZiggIWluYnVmICkKKyAgICByZXR1cm47CisKKyAgaWYoIGhkLT5jb3VudCApCisgICAgeworICAgICAgZm9yKCA7IGlubGVuICYmIGhkLT5jb3VudCA8IDY0OyBpbmxlbi0tICkKKyAgICAgICAgaGQtPmJ1ZltoZC0+Y291bnQrK10gPSAqaW5idWYrKzsKKyAgICAgIG1kNF93cml0ZSggaGQsIE5VTEwsIDAgKTsKKyAgICAgIGlmKCAhaW5sZW4gKQorICAgICAgICByZXR1cm47CisgICAgfQorICBfZ2NyeV9idXJuX3N0YWNrICg4MCs2KnNpemVvZih2b2lkKikpOworCisgIHdoaWxlKCBpbmxlbiA+PSA2NCApCisgICAgeworICAgICAgdHJhbnNmb3JtKCBoZCwgaW5idWYgKTsKKyAgICAgIGhkLT5jb3VudCA9IDA7CisgICAgICBoZC0+bmJsb2NrcysrOworICAgICAgaW5sZW4gLT0gNjQ7CisgICAgICBpbmJ1ZiArPSA2NDsKKyAgICB9CisgIGZvciggOyBpbmxlbiAmJiBoZC0+Y291bnQgPCA2NDsgaW5sZW4tLSApCisgICAgaGQtPmJ1ZltoZC0+Y291bnQrK10gPSAqaW5idWYrKzsKK30KKworCisKKy8qIFRoZSByb3V0aW5lIGZpbmFsIHRlcm1pbmF0ZXMgdGhlIG1lc3NhZ2UtZGlnZXN0IGNvbXB1dGF0aW9uIGFuZAorICogZW5kcyB3aXRoIHRoZSBkZXNpcmVkIG1lc3NhZ2UgZGlnZXN0IGluIG1kQ29udGV4dC0+ZGlnZXN0WzAuLi4xNV0uCisgKiBUaGUgaGFuZGxlIGlzIHByZXBhcmVkIGZvciBhIG5ldyBNRDQgY3ljbGUuCisgKiBSZXR1cm5zIDE2IGJ5dGVzIHJlcHJlc2VudGluZyB0aGUgZGlnZXN0LgorICovCisKK3N0YXRpYyB2b2lkCittZDRfZmluYWwoIHZvaWQgKmNvbnRleHQgKQoreworICBNRDRfQ09OVEVYVCAqaGQgPSBjb250ZXh0OworICB1MzIgdCwgbXNiLCBsc2I7CisgIGJ5dGUgKnA7CisKKyAgbWQ0X3dyaXRlKGhkLCBOVUxMLCAwKTsgLyogZmx1c2ggKi87CisKKyAgdCA9IGhkLT5uYmxvY2tzOworICAvKiBtdWx0aXBseSBieSA2NCB0byBtYWtlIGEgYnl0ZSBjb3VudCAqLworICBsc2IgPSB0IDw8IDY7CisgIG1zYiA9IHQgPj4gMjY7CisgIC8qIGFkZCB0aGUgY291bnQgKi8KKyAgdCA9IGxzYjsKKyAgaWYoIChsc2IgKz0gaGQtPmNvdW50KSA8IHQgKQorICAgIG1zYisrOworICAvKiBtdWx0aXBseSBieSA4IHRvIG1ha2UgYSBiaXQgY291bnQgKi8KKyAgdCA9IGxzYjsKKyAgbHNiIDw8PSAzOworICBtc2IgPDw9IDM7CisgIG1zYiB8PSB0ID4+IDI5OworICAKKyAgaWYoIGhkLT5jb3VudCA8IDU2ICkgIC8qIGVub3VnaCByb29tICovCisgICAgeworICAgICAgaGQtPmJ1ZltoZC0+Y291bnQrK10gPSAweDgwOyAvKiBwYWQgKi8KKyAgICAgIHdoaWxlKCBoZC0+Y291bnQgPCA1NiApCisgICAgICAgIGhkLT5idWZbaGQtPmNvdW50KytdID0gMDsgIC8qIHBhZCAqLworICAgIH0KKyAgZWxzZSAvKiBuZWVkIG9uZSBleHRyYSBibG9jayAqLyAKKyAgICB7IAorICAgICAgaGQtPmJ1ZltoZC0+Y291bnQrK10gPSAweDgwOyAvKiBwYWQgY2hhcmFjdGVyICovCisgICAgICB3aGlsZSggaGQtPmNvdW50IDwgNjQgKQorICAgICAgICBoZC0+YnVmW2hkLT5jb3VudCsrXSA9IDA7CisgICAgICBtZDRfd3JpdGUoaGQsIE5VTEwsIDApOyAgLyogZmx1c2ggKi87CisgICAgICBtZW1zZXQoaGQtPmJ1ZiwgMCwgNTYgKTsgLyogZmlsbCBuZXh0IGJsb2NrIHdpdGggemVyb2VzICovCisgICAgfQorICAvKiBhcHBlbmQgdGhlIDY0IGJpdCBjb3VudCAqLworICBoZC0+YnVmWzU2XSA9IGxzYgkgICA7CisgIGhkLT5idWZbNTddID0gbHNiID4+ICA4OworICBoZC0+YnVmWzU4XSA9IGxzYiA+PiAxNjsKKyAgaGQtPmJ1Zls1OV0gPSBsc2IgPj4gMjQ7CisgIGhkLT5idWZbNjBdID0gbXNiCSAgIDsKKyAgaGQtPmJ1Zls2MV0gPSBtc2IgPj4gIDg7CisgIGhkLT5idWZbNjJdID0gbXNiID4+IDE2OworICBoZC0+YnVmWzYzXSA9IG1zYiA+PiAyNDsKKyAgdHJhbnNmb3JtKCBoZCwgaGQtPmJ1ZiApOworICBfZ2NyeV9idXJuX3N0YWNrICg4MCs2KnNpemVvZih2b2lkKikpOworCisgIHAgPSBoZC0+YnVmOworI2lmZGVmIFdPUkRTX0JJR0VORElBTgorI2RlZmluZSBYKGEpIGRvIHsgKnArKyA9IGhkLT5hICAgICAgOyAqcCsrID0gaGQtPmEgPj4gODsgICAgICBcCisJCSAgKnArKyA9IGhkLT5hID4+IDE2OyAqcCsrID0gaGQtPmEgPj4gMjQ7IH0gd2hpbGUoMCkKKyNlbHNlIC8qIGxpdHRsZSBlbmRpYW4gKi8KKyNkZWZpbmUgWChhKSBkbyB7ICoodTMyKilwID0gKCpoZCkuYSA7IHAgKz0gNDsgfSB3aGlsZSgwKQorI2VuZGlmCisgIFgoQSk7CisgIFgoQik7CisgIFgoQyk7CisgIFgoRCk7CisjdW5kZWYgWAorCit9CisKK3N0YXRpYyBieXRlICoKK21kNF9yZWFkICh2b2lkICpjb250ZXh0KQoreworICBNRDRfQ09OVEVYVCAqaGQgPSBjb250ZXh0OworICByZXR1cm4gaGQtPmJ1ZjsKK30KKworc3RhdGljIGJ5dGUgYXNuWzE4XSA9IC8qIE9iamVjdCBJRCBpcyAxLjIuODQwLjExMzU0OS4yLjQgKi8KKyAgeyAweDMwLCAweDIwLCAweDMwLCAweDBjLCAweDA2LCAweDA4LCAweDJhLCAweDg2LDB4NDgsCisgICAgMHg4NiwgMHhmNywgMHgwZCwgMHgwMiwgMHgwNCwgMHgwNSwgMHgwMCwgMHgwNCwgMHgxMCB9OworCitzdGF0aWMgZ2NyeV9tZF9vaWRfc3BlY190IG9pZF9zcGVjX21kNFtdID0KKyAgeworICAgIC8qIGlzby5tZW1iZXItYm9keS51cy5yc2Fkc2kuZGlnZXN0QWxnb3JpdGhtLm1kNCAqLworICAgIHsgIjEuMi44NDAuMTEzNTQ5LjIuNCIgfSwKKyAgICB7IE5VTEwgfSwKKyAgfTsKKworZ2NyeV9tZF9zcGVjX3QgX2djcnlfZGlnZXN0X3NwZWNfbWQ0ID0KKyAgeworICAgICJNRDQiLCBhc24sIERJTSAoYXNuKSwgb2lkX3NwZWNfbWQ0LDE2LAorICAgIG1kNF9pbml0LCBtZDRfd3JpdGUsIG1kNF9maW5hbCwgbWQ0X3JlYWQsCisgICAgc2l6ZW9mIChNRDRfQ09OVEVYVCkKKyAgfTsKKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L2NpcGhlci9tZDUuYyBiL2xpYmdjcnlwdC0xLjQuNi9jaXBoZXIvbWQ1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk5ZGNlOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9jaXBoZXIvbWQ1LmMKQEAgLTAsMCArMSwzNTUgQEAKKy8qIG1kNS5jIC0gTUQ1IE1lc3NhZ2UtRGlnZXN0IEFsZ29yaXRobQorICogQ29weXJpZ2h0IChDKSAxOTk1LDE5OTYsMTk5OCwxOTk5LDIwMDEsMjAwMiwKKyAqICAgICAgICAgICAgICAgMjAwMyAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICoKKyAqIEFjY29yZGluZyB0byB0aGUgZGVmaW5pdGlvbiBvZiBNRDUgaW4gUkZDIDEzMjEgZnJvbSBBcHJpbCAxOTkyLgorICogTk9URTogVGhpcyBpcyAqbm90KiB0aGUgc2FtZSBmaWxlIGFzIHRoZSBvbmUgZnJvbSBnbGliYy4KKyAqIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+LCAxOTk1LiAKKyAqIGhlYXZpbHkgbW9kaWZpZWQgZm9yIEdudVBHIGJ5IFdlcm5lciBLb2NoIDx3a0BnbnVwZy5vcmc+IAorICovCisKKy8qIFRlc3QgdmFsdWVzOgorICogIiIgICAgICAgICAgICAgICAgICBENCAxRCA4QyBEOSA4RiAwMCBCMiAwNCAgRTkgODAgMDkgOTggRUMgRjggNDIgN0UKKyAqICJhIiAgICAgICAgICAgICAgICAgMEMgQzEgNzUgQjkgQzAgRjEgQjYgQTggIDMxIEMzIDk5IEUyIDY5IDc3IDI2IDYxCisgKiAiYWJjICAgICAgICAgICAgICAgIDkwIDAxIDUwIDk4IDNDIEQyIDRGIEIwICBENiA5NiAzRiA3RCAyOCBFMSA3RiA3MgorICogIm1lc3NhZ2UgZGlnZXN0IiAgICBGOSA2QiA2OSA3RCA3QyBCNyA5MyA4RCAgNTIgNUEgMkYgMzEgQUEgRjEgNjEgRDAKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImcxMGxpYi5oIgorI2luY2x1ZGUgIm1lbW9yeS5oIgorI2luY2x1ZGUgImNpcGhlci5oIgorCisjaW5jbHVkZSAiYml0aGVscC5oIgorCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1MzIgQSxCLEMsRDsJICAvKiBjaGFpbmluZyB2YXJpYWJsZXMgKi8KKyAgICB1MzIgIG5ibG9ja3M7CisgICAgYnl0ZSBidWZbNjRdOworICAgIGludCAgY291bnQ7Cit9IE1ENV9DT05URVhUOworCisKK3N0YXRpYyB2b2lkCittZDVfaW5pdCggdm9pZCAqY29udGV4dCApCit7CisgIE1ENV9DT05URVhUICpjdHggPSBjb250ZXh0OworCisgIGN0eC0+QSA9IDB4Njc0NTIzMDE7CisgIGN0eC0+QiA9IDB4ZWZjZGFiODk7CisgIGN0eC0+QyA9IDB4OThiYWRjZmU7CisgIGN0eC0+RCA9IDB4MTAzMjU0NzY7CisKKyAgY3R4LT5uYmxvY2tzID0gMDsKKyAgY3R4LT5jb3VudCA9IDA7Cit9CisKKworLyogVGhlc2UgYXJlIHRoZSBmb3VyIGZ1bmN0aW9ucyB1c2VkIGluIHRoZSBmb3VyIHN0ZXBzIG9mIHRoZSBNRDUgYWxnb3JpdGhtCisgICBhbmQgZGVmaW5lZCBpbiB0aGUgUkZDIDEzMjEuICBUaGUgZmlyc3QgZnVuY3Rpb24gaXMgYSBsaXR0bGUgYml0IG9wdGltaXplZAorICAgKGFzIGZvdW5kIGluIENvbGluIFBsdW1icyBwdWJsaWMgZG9tYWluIGltcGxlbWVudGF0aW9uKS4gICovCisvKiAjZGVmaW5lIEZGKGIsIGMsIGQpICgoYiAmIGMpIHwgKH5iICYgZCkpICovCisjZGVmaW5lIEZGKGIsIGMsIGQpIChkIF4gKGIgJiAoYyBeIGQpKSkKKyNkZWZpbmUgRkcoYiwgYywgZCkgRkYgKGQsIGIsIGMpCisjZGVmaW5lIEZIKGIsIGMsIGQpIChiIF4gYyBeIGQpCisjZGVmaW5lIEZJKGIsIGMsIGQpIChjIF4gKGIgfCB+ZCkpCisKKworLyoqKioqKioqKioqKioqKioKKyAqIHRyYW5zZm9ybSBuKjY0IGJ5dGVzCisgKi8KK3N0YXRpYyB2b2lkCit0cmFuc2Zvcm0gKCBNRDVfQ09OVEVYVCAqY3R4LCBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhICkKK3sKKyAgdTMyIGNvcnJlY3Rfd29yZHNbMTZdOworICByZWdpc3RlciB1MzIgQSA9IGN0eC0+QTsKKyAgcmVnaXN0ZXIgdTMyIEIgPSBjdHgtPkI7CisgIHJlZ2lzdGVyIHUzMiBDID0gY3R4LT5DOworICByZWdpc3RlciB1MzIgRCA9IGN0eC0+RDsKKyAgdTMyICpjd3AgPSBjb3JyZWN0X3dvcmRzOworICAgIAorI2lmZGVmIFdPUkRTX0JJR0VORElBTgorICB7IAorICAgIGludCBpOworICAgIGJ5dGUgKnAyLCAqcDE7CisgICAgZm9yKGk9MCwgcDE9ZGF0YSwgcDI9KGJ5dGUqKWNvcnJlY3Rfd29yZHM7IGkgPCAxNjsgaSsrLCBwMiArPSA0ICkKKyAgICAgIHsKKyAgICAgICAgcDJbM10gPSAqcDErKzsKKwlwMlsyXSA9ICpwMSsrOworCXAyWzFdID0gKnAxKys7CisJcDJbMF0gPSAqcDErKzsKKyAgICAgIH0KKyAgfQorI2Vsc2UKKyAgbWVtY3B5KCBjb3JyZWN0X3dvcmRzLCBkYXRhLCA2NCApOworI2VuZGlmCisKKworI2RlZmluZSBPUChhLCBiLCBjLCBkLCBzLCBUKSBcCisgIGRvCQkJICAgICAgICAgCSAgIFwKKyAgICB7CQkJCQkgICBcCisgICAgICBhICs9IEZGIChiLCBjLCBkKSArICgqY3dwKyspICsgVDsgICAgXAorICAgICAgYSA9IHJvbChhLCBzKTsJCQkgICBcCisgICAgICBhICs9IGI7CQkJCSAgIFwKKyAgICB9CQkJCQkgICBcCisgIHdoaWxlICgwKQorCisgIC8qIEJlZm9yZSB3ZSBzdGFydCwgb25lIHdvcmQgYWJvdXQgdGhlIHN0cmFuZ2UgY29uc3RhbnRzLgorICAgICBUaGV5IGFyZSBkZWZpbmVkIGluIFJGQyAxMzIxIGFzCisKKyAgICAgVFtpXSA9IChpbnQpICg0Mjk0OTY3Mjk2LjAgKiBmYWJzIChzaW4gKGkpKSksIGk9MS4uNjQKKyAgKi8KKworICAvKiBSb3VuZCAxLiAgKi8KKyAgT1AgKEEsIEIsIEMsIEQsICA3LCAweGQ3NmFhNDc4KTsKKyAgT1AgKEQsIEEsIEIsIEMsIDEyLCAweGU4YzdiNzU2KTsKKyAgT1AgKEMsIEQsIEEsIEIsIDE3LCAweDI0MjA3MGRiKTsKKyAgT1AgKEIsIEMsIEQsIEEsIDIyLCAweGMxYmRjZWVlKTsKKyAgT1AgKEEsIEIsIEMsIEQsICA3LCAweGY1N2MwZmFmKTsKKyAgT1AgKEQsIEEsIEIsIEMsIDEyLCAweDQ3ODdjNjJhKTsKKyAgT1AgKEMsIEQsIEEsIEIsIDE3LCAweGE4MzA0NjEzKTsKKyAgT1AgKEIsIEMsIEQsIEEsIDIyLCAweGZkNDY5NTAxKTsKKyAgT1AgKEEsIEIsIEMsIEQsICA3LCAweDY5ODA5OGQ4KTsKKyAgT1AgKEQsIEEsIEIsIEMsIDEyLCAweDhiNDRmN2FmKTsKKyAgT1AgKEMsIEQsIEEsIEIsIDE3LCAweGZmZmY1YmIxKTsKKyAgT1AgKEIsIEMsIEQsIEEsIDIyLCAweDg5NWNkN2JlKTsKKyAgT1AgKEEsIEIsIEMsIEQsICA3LCAweDZiOTAxMTIyKTsKKyAgT1AgKEQsIEEsIEIsIEMsIDEyLCAweGZkOTg3MTkzKTsKKyAgT1AgKEMsIEQsIEEsIEIsIDE3LCAweGE2Nzk0MzhlKTsKKyAgT1AgKEIsIEMsIEQsIEEsIDIyLCAweDQ5YjQwODIxKTsKKworI3VuZGVmIE9QCisjZGVmaW5lIE9QKGYsIGEsIGIsIGMsIGQsIGssIHMsIFQpICBcCisgICAgZG8JCQkJCQkJCSAgICAgIFwKKyAgICAgIHsgCQkJCQkJCSAgICAgIFwKKwlhICs9IGYgKGIsIGMsIGQpICsgY29ycmVjdF93b3Jkc1trXSArIFQ7CQkgICAgICBcCisJYSA9IHJvbChhLCBzKTsJCQkJCQkgICAgICBcCisJYSArPSBiOyAJCQkJCQkgICAgICBcCisgICAgICB9IAkJCQkJCQkgICAgICBcCisgICAgd2hpbGUgKDApCisKKyAgLyogUm91bmQgMi4gICovCisgIE9QIChGRywgQSwgQiwgQywgRCwgIDEsICA1LCAweGY2MWUyNTYyKTsKKyAgT1AgKEZHLCBELCBBLCBCLCBDLCAgNiwgIDksIDB4YzA0MGIzNDApOworICBPUCAoRkcsIEMsIEQsIEEsIEIsIDExLCAxNCwgMHgyNjVlNWE1MSk7CisgIE9QIChGRywgQiwgQywgRCwgQSwgIDAsIDIwLCAweGU5YjZjN2FhKTsKKyAgT1AgKEZHLCBBLCBCLCBDLCBELCAgNSwgIDUsIDB4ZDYyZjEwNWQpOworICBPUCAoRkcsIEQsIEEsIEIsIEMsIDEwLCAgOSwgMHgwMjQ0MTQ1Myk7CisgIE9QIChGRywgQywgRCwgQSwgQiwgMTUsIDE0LCAweGQ4YTFlNjgxKTsKKyAgT1AgKEZHLCBCLCBDLCBELCBBLCAgNCwgMjAsIDB4ZTdkM2ZiYzgpOworICBPUCAoRkcsIEEsIEIsIEMsIEQsICA5LCAgNSwgMHgyMWUxY2RlNik7CisgIE9QIChGRywgRCwgQSwgQiwgQywgMTQsICA5LCAweGMzMzcwN2Q2KTsKKyAgT1AgKEZHLCBDLCBELCBBLCBCLCAgMywgMTQsIDB4ZjRkNTBkODcpOworICBPUCAoRkcsIEIsIEMsIEQsIEEsICA4LCAyMCwgMHg0NTVhMTRlZCk7CisgIE9QIChGRywgQSwgQiwgQywgRCwgMTMsICA1LCAweGE5ZTNlOTA1KTsKKyAgT1AgKEZHLCBELCBBLCBCLCBDLCAgMiwgIDksIDB4ZmNlZmEzZjgpOworICBPUCAoRkcsIEMsIEQsIEEsIEIsICA3LCAxNCwgMHg2NzZmMDJkOSk7CisgIE9QIChGRywgQiwgQywgRCwgQSwgMTIsIDIwLCAweDhkMmE0YzhhKTsKKworICAvKiBSb3VuZCAzLiAgKi8KKyAgT1AgKEZILCBBLCBCLCBDLCBELCAgNSwgIDQsIDB4ZmZmYTM5NDIpOworICBPUCAoRkgsIEQsIEEsIEIsIEMsICA4LCAxMSwgMHg4NzcxZjY4MSk7CisgIE9QIChGSCwgQywgRCwgQSwgQiwgMTEsIDE2LCAweDZkOWQ2MTIyKTsKKyAgT1AgKEZILCBCLCBDLCBELCBBLCAxNCwgMjMsIDB4ZmRlNTM4MGMpOworICBPUCAoRkgsIEEsIEIsIEMsIEQsICAxLCAgNCwgMHhhNGJlZWE0NCk7CisgIE9QIChGSCwgRCwgQSwgQiwgQywgIDQsIDExLCAweDRiZGVjZmE5KTsKKyAgT1AgKEZILCBDLCBELCBBLCBCLCAgNywgMTYsIDB4ZjZiYjRiNjApOworICBPUCAoRkgsIEIsIEMsIEQsIEEsIDEwLCAyMywgMHhiZWJmYmM3MCk7CisgIE9QIChGSCwgQSwgQiwgQywgRCwgMTMsICA0LCAweDI4OWI3ZWM2KTsKKyAgT1AgKEZILCBELCBBLCBCLCBDLCAgMCwgMTEsIDB4ZWFhMTI3ZmEpOworICBPUCAoRkgsIEMsIEQsIEEsIEIsICAzLCAxNiwgMHhkNGVmMzA4NSk7CisgIE9QIChGSCwgQiwgQywgRCwgQSwgIDYsIDIzLCAweDA0ODgxZDA1KTsKKyAgT1AgKEZILCBBLCBCLCBDLCBELCAgOSwgIDQsIDB4ZDlkNGQwMzkpOworICBPUCAoRkgsIEQsIEEsIEIsIEMsIDEyLCAxMSwgMHhlNmRiOTllNSk7CisgIE9QIChGSCwgQywgRCwgQSwgQiwgMTUsIDE2LCAweDFmYTI3Y2Y4KTsKKyAgT1AgKEZILCBCLCBDLCBELCBBLCAgMiwgMjMsIDB4YzRhYzU2NjUpOworCisgIC8qIFJvdW5kIDQuICAqLworICBPUCAoRkksIEEsIEIsIEMsIEQsICAwLCAgNiwgMHhmNDI5MjI0NCk7CisgIE9QIChGSSwgRCwgQSwgQiwgQywgIDcsIDEwLCAweDQzMmFmZjk3KTsKKyAgT1AgKEZJLCBDLCBELCBBLCBCLCAxNCwgMTUsIDB4YWI5NDIzYTcpOworICBPUCAoRkksIEIsIEMsIEQsIEEsICA1LCAyMSwgMHhmYzkzYTAzOSk7CisgIE9QIChGSSwgQSwgQiwgQywgRCwgMTIsICA2LCAweDY1NWI1OWMzKTsKKyAgT1AgKEZJLCBELCBBLCBCLCBDLCAgMywgMTAsIDB4OGYwY2NjOTIpOworICBPUCAoRkksIEMsIEQsIEEsIEIsIDEwLCAxNSwgMHhmZmVmZjQ3ZCk7CisgIE9QIChGSSwgQiwgQywgRCwgQSwgIDEsIDIxLCAweDg1ODQ1ZGQxKTsKKyAgT1AgKEZJLCBBLCBCLCBDLCBELCAgOCwgIDYsIDB4NmZhODdlNGYpOworICBPUCAoRkksIEQsIEEsIEIsIEMsIDE1LCAxMCwgMHhmZTJjZTZlMCk7CisgIE9QIChGSSwgQywgRCwgQSwgQiwgIDYsIDE1LCAweGEzMDE0MzE0KTsKKyAgT1AgKEZJLCBCLCBDLCBELCBBLCAxMywgMjEsIDB4NGUwODExYTEpOworICBPUCAoRkksIEEsIEIsIEMsIEQsICA0LCAgNiwgMHhmNzUzN2U4Mik7CisgIE9QIChGSSwgRCwgQSwgQiwgQywgMTEsIDEwLCAweGJkM2FmMjM1KTsKKyAgT1AgKEZJLCBDLCBELCBBLCBCLCAgMiwgMTUsIDB4MmFkN2QyYmIpOworICBPUCAoRkksIEIsIEMsIEQsIEEsICA5LCAyMSwgMHhlYjg2ZDM5MSk7CisKKyAgLyogUHV0IGNoZWNrc3VtIGluIGNvbnRleHQgZ2l2ZW4gYXMgYXJndW1lbnQuICAqLworICBjdHgtPkEgKz0gQTsKKyAgY3R4LT5CICs9IEI7CisgIGN0eC0+QyArPSBDOworICBjdHgtPkQgKz0gRDsKK30KKworCisKKy8qIFRoZSByb3V0aW5lIHVwZGF0ZXMgdGhlIG1lc3NhZ2UtZGlnZXN0IGNvbnRleHQgdG8KKyAqIGFjY291bnQgZm9yIHRoZSBwcmVzZW5jZSBvZiBlYWNoIG9mIHRoZSBjaGFyYWN0ZXJzIGluQnVmWzAuLmluTGVuLTFdCisgKiBpbiB0aGUgbWVzc2FnZSB3aG9zZSBkaWdlc3QgaXMgYmVpbmcgY29tcHV0ZWQuCisgKi8KK3N0YXRpYyB2b2lkCittZDVfd3JpdGUoIHZvaWQgKmNvbnRleHQsIGNvbnN0IHZvaWQgKmluYnVmX2FyZyAsIHNpemVfdCBpbmxlbikKK3sKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqaW5idWYgPSBpbmJ1Zl9hcmc7CisgIE1ENV9DT05URVhUICpoZCA9IGNvbnRleHQ7CisgIAorICBpZiggaGQtPmNvdW50ID09IDY0ICkgIC8qIGZsdXNoIHRoZSBidWZmZXIgKi8KKyAgICB7CisgICAgICB0cmFuc2Zvcm0oIGhkLCBoZC0+YnVmICk7CisgICAgICBfZ2NyeV9idXJuX3N0YWNrICg4MCs2KnNpemVvZih2b2lkKikpOworICAgICAgaGQtPmNvdW50ID0gMDsKKyAgICAgIGhkLT5uYmxvY2tzKys7CisgICAgfQorICBpZiggIWluYnVmICkKKyAgICByZXR1cm47CisKKyAgaWYoIGhkLT5jb3VudCApCisgICAgeworICAgICAgZm9yKCA7IGlubGVuICYmIGhkLT5jb3VudCA8IDY0OyBpbmxlbi0tICkKKyAgICAgICAgaGQtPmJ1ZltoZC0+Y291bnQrK10gPSAqaW5idWYrKzsKKyAgICAgIG1kNV93cml0ZSggaGQsIE5VTEwsIDAgKTsKKyAgICAgIGlmKCAhaW5sZW4gKQorICAgICAgICByZXR1cm47CisgICAgfQorICBfZ2NyeV9idXJuX3N0YWNrICg4MCs2KnNpemVvZih2b2lkKikpOworCisgIHdoaWxlKCBpbmxlbiA+PSA2NCApIAorICAgIHsKKyAgICAgIHRyYW5zZm9ybSggaGQsIGluYnVmICk7CisgICAgICBoZC0+Y291bnQgPSAwOworICAgICAgaGQtPm5ibG9ja3MrKzsKKyAgICAgIGlubGVuIC09IDY0OworICAgICAgaW5idWYgKz0gNjQ7CisgICAgfQorICBmb3IoIDsgaW5sZW4gJiYgaGQtPmNvdW50IDwgNjQ7IGlubGVuLS0gKQorICAgIGhkLT5idWZbaGQtPmNvdW50KytdID0gKmluYnVmKys7CisKK30KKworCisKKy8qIFRoZSByb3V0aW5lIGZpbmFsIHRlcm1pbmF0ZXMgdGhlIG1lc3NhZ2UtZGlnZXN0IGNvbXB1dGF0aW9uIGFuZAorICogZW5kcyB3aXRoIHRoZSBkZXNpcmVkIG1lc3NhZ2UgZGlnZXN0IGluIG1kQ29udGV4dC0+ZGlnZXN0WzAuLi4xNV0uCisgKiBUaGUgaGFuZGxlIGlzIHByZXBhcmVkIGZvciBhIG5ldyBNRDUgY3ljbGUuCisgKiBSZXR1cm5zIDE2IGJ5dGVzIHJlcHJlc2VudGluZyB0aGUgZGlnZXN0LgorICovCisKK3N0YXRpYyB2b2lkCittZDVfZmluYWwoIHZvaWQgKmNvbnRleHQpCit7CisgIE1ENV9DT05URVhUICpoZCA9IGNvbnRleHQ7CisgIHUzMiB0LCBtc2IsIGxzYjsKKyAgYnl0ZSAqcDsKKyAgCisgIG1kNV93cml0ZShoZCwgTlVMTCwgMCk7IC8qIGZsdXNoICovOworCisgIHQgPSBoZC0+bmJsb2NrczsKKyAgLyogbXVsdGlwbHkgYnkgNjQgdG8gbWFrZSBhIGJ5dGUgY291bnQgKi8KKyAgbHNiID0gdCA8PCA2OworICBtc2IgPSB0ID4+IDI2OworICAvKiBhZGQgdGhlIGNvdW50ICovCisgIHQgPSBsc2I7CisgIGlmKCAobHNiICs9IGhkLT5jb3VudCkgPCB0ICkKKyAgICBtc2IrKzsKKyAgLyogbXVsdGlwbHkgYnkgOCB0byBtYWtlIGEgYml0IGNvdW50ICovCisgIHQgPSBsc2I7CisgIGxzYiA8PD0gMzsKKyAgbXNiIDw8PSAzOworICBtc2IgfD0gdCA+PiAyOTsKKworICBpZiggaGQtPmNvdW50IDwgNTYgKSAgLyogZW5vdWdoIHJvb20gKi8KKyAgICB7CisgICAgICBoZC0+YnVmW2hkLT5jb3VudCsrXSA9IDB4ODA7IC8qIHBhZCAqLworICAgICAgd2hpbGUoIGhkLT5jb3VudCA8IDU2ICkKKyAgICAgICAgaGQtPmJ1ZltoZC0+Y291bnQrK10gPSAwOyAgLyogcGFkICovCisgICAgfQorICBlbHNlICAvKiBuZWVkIG9uZSBleHRyYSBibG9jayAqLworICAgIHsKKyAgICAgIGhkLT5idWZbaGQtPmNvdW50KytdID0gMHg4MDsgLyogcGFkIGNoYXJhY3RlciAqLworICAgICAgd2hpbGUoIGhkLT5jb3VudCA8IDY0ICkKKyAgICAgICAgaGQtPmJ1ZltoZC0+Y291bnQrK10gPSAwOworICAgICAgbWQ1X3dyaXRlKGhkLCBOVUxMLCAwKTsgIC8qIGZsdXNoICovOworICAgICAgbWVtc2V0KGhkLT5idWYsIDAsIDU2ICk7IC8qIGZpbGwgbmV4dCBibG9jayB3aXRoIHplcm9lcyAqLworICAgIH0KKyAgLyogYXBwZW5kIHRoZSA2NCBiaXQgY291bnQgKi8KKyAgaGQtPmJ1Zls1Nl0gPSBsc2IJICAgOworICBoZC0+YnVmWzU3XSA9IGxzYiA+PiAgODsKKyAgaGQtPmJ1Zls1OF0gPSBsc2IgPj4gMTY7CisgIGhkLT5idWZbNTldID0gbHNiID4+IDI0OworICBoZC0+YnVmWzYwXSA9IG1zYgkgICA7CisgIGhkLT5idWZbNjFdID0gbXNiID4+ICA4OworICBoZC0+YnVmWzYyXSA9IG1zYiA+PiAxNjsKKyAgaGQtPmJ1Zls2M10gPSBtc2IgPj4gMjQ7CisgIHRyYW5zZm9ybSggaGQsIGhkLT5idWYgKTsKKyAgX2djcnlfYnVybl9zdGFjayAoODArNipzaXplb2Yodm9pZCopKTsKKworICBwID0gaGQtPmJ1ZjsKKyNpZmRlZiBXT1JEU19CSUdFTkRJQU4KKyNkZWZpbmUgWChhKSBkbyB7ICpwKysgPSBoZC0+YSAgICAgIDsgKnArKyA9IGhkLT5hID4+IDg7ICAgICAgXAorCSAgICAgICAgICAqcCsrID0gaGQtPmEgPj4gMTY7ICpwKysgPSBoZC0+YSA+PiAyNDsgfSB3aGlsZSgwKQorI2Vsc2UgLyogbGl0dGxlIGVuZGlhbiAqLworI2RlZmluZSBYKGEpIGRvIHsgKih1MzIqKXAgPSAoKmhkKS5hIDsgcCArPSA0OyB9IHdoaWxlKDApCisjZW5kaWYKKyAgWChBKTsKKyAgWChCKTsKKyAgWChDKTsKKyAgWChEKTsKKyN1bmRlZiBYCisKK30KKworc3RhdGljIGJ5dGUgKgorbWQ1X3JlYWQoIHZvaWQgKmNvbnRleHQgKQoreworICBNRDVfQ09OVEVYVCAqaGQgPSAoTUQ1X0NPTlRFWFQgKikgY29udGV4dDsKKyAgcmV0dXJuIGhkLT5idWY7Cit9CisKK3N0YXRpYyBieXRlIGFzblsxOF0gPSAvKiBPYmplY3QgSUQgaXMgMS4yLjg0MC4xMTM1NDkuMi41ICovCisgIHsgMHgzMCwgMHgyMCwgMHgzMCwgMHgwYywgMHgwNiwgMHgwOCwgMHgyYSwgMHg4NiwweDQ4LAorICAgIDB4ODYsIDB4ZjcsIDB4MGQsIDB4MDIsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDQsIDB4MTAgfTsKKworc3RhdGljIGdjcnlfbWRfb2lkX3NwZWNfdCBvaWRfc3BlY19tZDVbXSA9CisgIHsKKyAgICAvKiBpc28ubWVtYmVyLWJvZHkudXMucnNhZHNpLnBrY3MucGtjcy0xLjQgKG1kNVdpdGhSU0FFbmNyeXB0aW9uKSAqLworICAgIHsgIjEuMi44NDAuMTEzNTQ5LjEuMS40IiB9LAorICAgIC8qIFJTQURTSSBkaWdlc3RBbGdvcml0aG0gTUQ1ICovCisgICAgeyAiMS4yLjg0MC4xMTM1NDkuMi41IiB9LAorICAgIHsgTlVMTCB9LAorICB9OworCitnY3J5X21kX3NwZWNfdCBfZ2NyeV9kaWdlc3Rfc3BlY19tZDUgPQorICB7CisgICAgIk1ENSIsIGFzbiwgRElNIChhc24pLCBvaWRfc3BlY19tZDUsIDE2LAorICAgIG1kNV9pbml0LCBtZDVfd3JpdGUsIG1kNV9maW5hbCwgbWQ1X3JlYWQsCisgICAgc2l6ZW9mIChNRDVfQ09OVEVYVCkKKyAgfTsKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9jaXBoZXIvcHJpbWVnZW4uYyBiL2xpYmdjcnlwdC0xLjQuNi9jaXBoZXIvcHJpbWVnZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODY5YmVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L2NpcGhlci9wcmltZWdlbi5jCkBAIC0wLDAgKzEsMTg2MiBAQAorLyogcHJpbWVnZW4uYyAtIHByaW1lIG51bWJlciBnZW5lcmF0b3IKKyAqIENvcHlyaWdodCAoQykgMTk5OCwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMworICogICAgICAgICAgICAgICAyMDA0LCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIGdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlICJnMTBsaWIuaCIKKyNpbmNsdWRlICJtcGkuaCIKKyNpbmNsdWRlICJjaXBoZXIuaCIKKyNpbmNsdWRlICJhdGguaCIKKworc3RhdGljIGdjcnlfbXBpX3QgZ2VuX3ByaW1lICh1bnNpZ25lZCBpbnQgbmJpdHMsIGludCBzZWNyZXQsIGludCByYW5kb21sZXZlbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAoKmV4dHJhX2NoZWNrKSh2b2lkICosIGdjcnlfbXBpX3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpleHRyYV9jaGVja19hcmcpOworc3RhdGljIGludCBjaGVja19wcmltZSggZ2NyeV9tcGlfdCBwcmltZSwgZ2NyeV9tcGlfdCB2YWxfMiwgaW50IHJtX3JvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfcHJpbWVfY2hlY2tfZnVuY190IGNiX2Z1bmMsIHZvaWQgKmNiX2FyZyApOworc3RhdGljIGludCBpc19wcmltZSAoZ2NyeV9tcGlfdCBuLCBpbnQgc3RlcHMsIHVuc2lnbmVkIGludCAqY291bnQpOworc3RhdGljIHZvaWQgbV9vdXRfb2ZfbiggY2hhciAqYXJyYXksIGludCBtLCBpbnQgbiApOworCitzdGF0aWMgdm9pZCAoKnByb2dyZXNzX2NiKSAodm9pZCAqLGNvbnN0IGNoYXIqLGludCxpbnQsIGludCApOworc3RhdGljIHZvaWQgKnByb2dyZXNzX2NiX2RhdGE7CisKKy8qIE5vdGU6IDIgaXMgbm90IGluY2x1ZGVkIGJlY2F1c2UgaXQgY2FuIGJlIHRlc3RlZCBtb3JlIGVhc2lseSBieQorICAgbG9va2luZyBhdCBiaXQgMC4gVGhlIGxhc3QgZW50cnkgaW4gdGhpcyBsaXN0IGlzIG1hcmtlZCBieSBhIHplcm8gKi8KK3N0YXRpYyB1c2hvcnQgc21hbGxfcHJpbWVfbnVtYmVyc1tdID0geworICAgIDMsIDUsIDcsIDExLCAxMywgMTcsIDE5LCAyMywgMjksIDMxLCAzNywgNDEsIDQzLAorICAgIDQ3LCA1MywgNTksIDYxLCA2NywgNzEsIDczLCA3OSwgODMsIDg5LCA5NywgMTAxLAorICAgIDEwMywgMTA3LCAxMDksIDExMywgMTI3LCAxMzEsIDEzNywgMTM5LCAxNDksIDE1MSwKKyAgICAxNTcsIDE2MywgMTY3LCAxNzMsIDE3OSwgMTgxLCAxOTEsIDE5MywgMTk3LCAxOTksCisgICAgMjExLCAyMjMsIDIyNywgMjI5LCAyMzMsIDIzOSwgMjQxLCAyNTEsIDI1NywgMjYzLAorICAgIDI2OSwgMjcxLCAyNzcsIDI4MSwgMjgzLCAyOTMsIDMwNywgMzExLCAzMTMsIDMxNywKKyAgICAzMzEsIDMzNywgMzQ3LCAzNDksIDM1MywgMzU5LCAzNjcsIDM3MywgMzc5LCAzODMsCisgICAgMzg5LCAzOTcsIDQwMSwgNDA5LCA0MTksIDQyMSwgNDMxLCA0MzMsIDQzOSwgNDQzLAorICAgIDQ0OSwgNDU3LCA0NjEsIDQ2MywgNDY3LCA0NzksIDQ4NywgNDkxLCA0OTksIDUwMywKKyAgICA1MDksIDUyMSwgNTIzLCA1NDEsIDU0NywgNTU3LCA1NjMsIDU2OSwgNTcxLCA1NzcsCisgICAgNTg3LCA1OTMsIDU5OSwgNjAxLCA2MDcsIDYxMywgNjE3LCA2MTksIDYzMSwgNjQxLAorICAgIDY0MywgNjQ3LCA2NTMsIDY1OSwgNjYxLCA2NzMsIDY3NywgNjgzLCA2OTEsIDcwMSwKKyAgICA3MDksIDcxOSwgNzI3LCA3MzMsIDczOSwgNzQzLCA3NTEsIDc1NywgNzYxLCA3NjksCisgICAgNzczLCA3ODcsIDc5NywgODA5LCA4MTEsIDgyMSwgODIzLCA4MjcsIDgyOSwgODM5LAorICAgIDg1MywgODU3LCA4NTksIDg2MywgODc3LCA4ODEsIDg4MywgODg3LCA5MDcsIDkxMSwKKyAgICA5MTksIDkyOSwgOTM3LCA5NDEsIDk0NywgOTUzLCA5NjcsIDk3MSwgOTc3LCA5ODMsCisgICAgOTkxLCA5OTcsIDEwMDksIDEwMTMsIDEwMTksIDEwMjEsIDEwMzEsIDEwMzMsCisgICAgMTAzOSwgMTA0OSwgMTA1MSwgMTA2MSwgMTA2MywgMTA2OSwgMTA4NywgMTA5MSwKKyAgICAxMDkzLCAxMDk3LCAxMTAzLCAxMTA5LCAxMTE3LCAxMTIzLCAxMTI5LCAxMTUxLAorICAgIDExNTMsIDExNjMsIDExNzEsIDExODEsIDExODcsIDExOTMsIDEyMDEsIDEyMTMsCisgICAgMTIxNywgMTIyMywgMTIyOSwgMTIzMSwgMTIzNywgMTI0OSwgMTI1OSwgMTI3NywKKyAgICAxMjc5LCAxMjgzLCAxMjg5LCAxMjkxLCAxMjk3LCAxMzAxLCAxMzAzLCAxMzA3LAorICAgIDEzMTksIDEzMjEsIDEzMjcsIDEzNjEsIDEzNjcsIDEzNzMsIDEzODEsIDEzOTksCisgICAgMTQwOSwgMTQyMywgMTQyNywgMTQyOSwgMTQzMywgMTQzOSwgMTQ0NywgMTQ1MSwKKyAgICAxNDUzLCAxNDU5LCAxNDcxLCAxNDgxLCAxNDgzLCAxNDg3LCAxNDg5LCAxNDkzLAorICAgIDE0OTksIDE1MTEsIDE1MjMsIDE1MzEsIDE1NDMsIDE1NDksIDE1NTMsIDE1NTksCisgICAgMTU2NywgMTU3MSwgMTU3OSwgMTU4MywgMTU5NywgMTYwMSwgMTYwNywgMTYwOSwKKyAgICAxNjEzLCAxNjE5LCAxNjIxLCAxNjI3LCAxNjM3LCAxNjU3LCAxNjYzLCAxNjY3LAorICAgIDE2NjksIDE2OTMsIDE2OTcsIDE2OTksIDE3MDksIDE3MjEsIDE3MjMsIDE3MzMsCisgICAgMTc0MSwgMTc0NywgMTc1MywgMTc1OSwgMTc3NywgMTc4MywgMTc4NywgMTc4OSwKKyAgICAxODAxLCAxODExLCAxODIzLCAxODMxLCAxODQ3LCAxODYxLCAxODY3LCAxODcxLAorICAgIDE4NzMsIDE4NzcsIDE4NzksIDE4ODksIDE5MDEsIDE5MDcsIDE5MTMsIDE5MzEsCisgICAgMTkzMywgMTk0OSwgMTk1MSwgMTk3MywgMTk3OSwgMTk4NywgMTk5MywgMTk5NywKKyAgICAxOTk5LCAyMDAzLCAyMDExLCAyMDE3LCAyMDI3LCAyMDI5LCAyMDM5LCAyMDUzLAorICAgIDIwNjMsIDIwNjksIDIwODEsIDIwODMsIDIwODcsIDIwODksIDIwOTksIDIxMTEsCisgICAgMjExMywgMjEyOSwgMjEzMSwgMjEzNywgMjE0MSwgMjE0MywgMjE1MywgMjE2MSwKKyAgICAyMTc5LCAyMjAzLCAyMjA3LCAyMjEzLCAyMjIxLCAyMjM3LCAyMjM5LCAyMjQzLAorICAgIDIyNTEsIDIyNjcsIDIyNjksIDIyNzMsIDIyODEsIDIyODcsIDIyOTMsIDIyOTcsCisgICAgMjMwOSwgMjMxMSwgMjMzMywgMjMzOSwgMjM0MSwgMjM0NywgMjM1MSwgMjM1NywKKyAgICAyMzcxLCAyMzc3LCAyMzgxLCAyMzgzLCAyMzg5LCAyMzkzLCAyMzk5LCAyNDExLAorICAgIDI0MTcsIDI0MjMsIDI0MzcsIDI0NDEsIDI0NDcsIDI0NTksIDI0NjcsIDI0NzMsCisgICAgMjQ3NywgMjUwMywgMjUyMSwgMjUzMSwgMjUzOSwgMjU0MywgMjU0OSwgMjU1MSwKKyAgICAyNTU3LCAyNTc5LCAyNTkxLCAyNTkzLCAyNjA5LCAyNjE3LCAyNjIxLCAyNjMzLAorICAgIDI2NDcsIDI2NTcsIDI2NTksIDI2NjMsIDI2NzEsIDI2NzcsIDI2ODMsIDI2ODcsCisgICAgMjY4OSwgMjY5MywgMjY5OSwgMjcwNywgMjcxMSwgMjcxMywgMjcxOSwgMjcyOSwKKyAgICAyNzMxLCAyNzQxLCAyNzQ5LCAyNzUzLCAyNzY3LCAyNzc3LCAyNzg5LCAyNzkxLAorICAgIDI3OTcsIDI4MDEsIDI4MDMsIDI4MTksIDI4MzMsIDI4MzcsIDI4NDMsIDI4NTEsCisgICAgMjg1NywgMjg2MSwgMjg3OSwgMjg4NywgMjg5NywgMjkwMywgMjkwOSwgMjkxNywKKyAgICAyOTI3LCAyOTM5LCAyOTUzLCAyOTU3LCAyOTYzLCAyOTY5LCAyOTcxLCAyOTk5LAorICAgIDMwMDEsIDMwMTEsIDMwMTksIDMwMjMsIDMwMzcsIDMwNDEsIDMwNDksIDMwNjEsCisgICAgMzA2NywgMzA3OSwgMzA4MywgMzA4OSwgMzEwOSwgMzExOSwgMzEyMSwgMzEzNywKKyAgICAzMTYzLCAzMTY3LCAzMTY5LCAzMTgxLCAzMTg3LCAzMTkxLCAzMjAzLCAzMjA5LAorICAgIDMyMTcsIDMyMjEsIDMyMjksIDMyNTEsIDMyNTMsIDMyNTcsIDMyNTksIDMyNzEsCisgICAgMzI5OSwgMzMwMSwgMzMwNywgMzMxMywgMzMxOSwgMzMyMywgMzMyOSwgMzMzMSwKKyAgICAzMzQzLCAzMzQ3LCAzMzU5LCAzMzYxLCAzMzcxLCAzMzczLCAzMzg5LCAzMzkxLAorICAgIDM0MDcsIDM0MTMsIDM0MzMsIDM0NDksIDM0NTcsIDM0NjEsIDM0NjMsIDM0NjcsCisgICAgMzQ2OSwgMzQ5MSwgMzQ5OSwgMzUxMSwgMzUxNywgMzUyNywgMzUyOSwgMzUzMywKKyAgICAzNTM5LCAzNTQxLCAzNTQ3LCAzNTU3LCAzNTU5LCAzNTcxLCAzNTgxLCAzNTgzLAorICAgIDM1OTMsIDM2MDcsIDM2MTMsIDM2MTcsIDM2MjMsIDM2MzEsIDM2MzcsIDM2NDMsCisgICAgMzY1OSwgMzY3MSwgMzY3MywgMzY3NywgMzY5MSwgMzY5NywgMzcwMSwgMzcwOSwKKyAgICAzNzE5LCAzNzI3LCAzNzMzLCAzNzM5LCAzNzYxLCAzNzY3LCAzNzY5LCAzNzc5LAorICAgIDM3OTMsIDM3OTcsIDM4MDMsIDM4MjEsIDM4MjMsIDM4MzMsIDM4NDcsIDM4NTEsCisgICAgMzg1MywgMzg2MywgMzg3NywgMzg4MSwgMzg4OSwgMzkwNywgMzkxMSwgMzkxNywKKyAgICAzOTE5LCAzOTIzLCAzOTI5LCAzOTMxLCAzOTQzLCAzOTQ3LCAzOTY3LCAzOTg5LAorICAgIDQwMDEsIDQwMDMsIDQwMDcsIDQwMTMsIDQwMTksIDQwMjEsIDQwMjcsIDQwNDksCisgICAgNDA1MSwgNDA1NywgNDA3MywgNDA3OSwgNDA5MSwgNDA5MywgNDA5OSwgNDExMSwKKyAgICA0MTI3LCA0MTI5LCA0MTMzLCA0MTM5LCA0MTUzLCA0MTU3LCA0MTU5LCA0MTc3LAorICAgIDQyMDEsIDQyMTEsIDQyMTcsIDQyMTksIDQyMjksIDQyMzEsIDQyNDEsIDQyNDMsCisgICAgNDI1MywgNDI1OSwgNDI2MSwgNDI3MSwgNDI3MywgNDI4MywgNDI4OSwgNDI5NywKKyAgICA0MzI3LCA0MzM3LCA0MzM5LCA0MzQ5LCA0MzU3LCA0MzYzLCA0MzczLCA0MzkxLAorICAgIDQzOTcsIDQ0MDksIDQ0MjEsIDQ0MjMsIDQ0NDEsIDQ0NDcsIDQ0NTEsIDQ0NTcsCisgICAgNDQ2MywgNDQ4MSwgNDQ4MywgNDQ5MywgNDUwNywgNDUxMywgNDUxNywgNDUxOSwKKyAgICA0NTIzLCA0NTQ3LCA0NTQ5LCA0NTYxLCA0NTY3LCA0NTgzLCA0NTkxLCA0NTk3LAorICAgIDQ2MDMsIDQ2MjEsIDQ2MzcsIDQ2MzksIDQ2NDMsIDQ2NDksIDQ2NTEsIDQ2NTcsCisgICAgNDY2MywgNDY3MywgNDY3OSwgNDY5MSwgNDcwMywgNDcyMSwgNDcyMywgNDcyOSwKKyAgICA0NzMzLCA0NzUxLCA0NzU5LCA0NzgzLCA0Nzg3LCA0Nzg5LCA0NzkzLCA0Nzk5LAorICAgIDQ4MDEsIDQ4MTMsIDQ4MTcsIDQ4MzEsIDQ4NjEsIDQ4NzEsIDQ4NzcsIDQ4ODksCisgICAgNDkwMywgNDkwOSwgNDkxOSwgNDkzMSwgNDkzMywgNDkzNywgNDk0MywgNDk1MSwKKyAgICA0OTU3LCA0OTY3LCA0OTY5LCA0OTczLCA0OTg3LCA0OTkzLCA0OTk5LAorICAgIDAKK307CitzdGF0aWMgaW50IG5vX29mX3NtYWxsX3ByaW1lX251bWJlcnMgPSBESU0gKHNtYWxsX3ByaW1lX251bWJlcnMpIC0gMTsKKworCisMCisvKiBBbiBvYmplY3QgYW5kIGEgbGlzdCB0byBidWlsZCB1cCBhIGdsb2JhbCBwb29sIG9mIHByaW1lcy4gIFNlZQorICAgc2F2ZV9wb29sX3ByaW1lIGFuZCBnZXRfcG9vbF9wcmltZS4gKi8KK3N0cnVjdCBwcmltZXBvb2xfcyAKK3sKKyAgc3RydWN0IHByaW1lcG9vbF9zICpuZXh0OworICBnY3J5X21waV90IHByaW1lOyAgICAgIC8qIElmIHRoaXMgaXMgTlVMTCB0aGUgZW50cnkgaXMgbm90IHVzZWQuICovCisgIHVuc2lnbmVkIGludCBuYml0czsKKyAgZ2NyeV9yYW5kb21fbGV2ZWxfdCByYW5kb21sZXZlbDsKK307CitzdHJ1Y3QgcHJpbWVwb29sX3MgKnByaW1lcG9vbDsKKy8qIE11dGV4IHVzZWQgdG8gcHJvdGVjdCBhY2Nlc3MgdG8gdGhlIHByaW1lcG9vbC4gICovCitzdGF0aWMgYXRoX211dGV4X3QgcHJpbWVwb29sX2xvY2sgPSBBVEhfTVVURVhfSU5JVElBTElaRVI7CisKKworCisvKiBTYXZlIFBSSU1FIHdoaWNoIGhhcyBiZWVuIGdlbmVyYXRlZCBhdCBSQU5ET01MRVZFTCBmb3IgbGF0ZXIKKyAgIHVzZS4gTmVlZHMgdG8gYmUgY2FsbGVkIHdoaWxlIHByaW1lcG9vbF9sb2NrIGlzIGJlaW5nIGhvbGQuICBOb3RlCisgICB0aGF0IFBSSU1FIHNob3VsZCBiZSBjb25zaWRlcmVkIHJlbGVhc2VkIGFmdGVyIGNhbGxpbmcgdGhpcworICAgZnVuY3Rpb24uICovCitzdGF0aWMgdm9pZAorc2F2ZV9wb29sX3ByaW1lIChnY3J5X21waV90IHByaW1lLCBnY3J5X3JhbmRvbV9sZXZlbF90IHJhbmRvbWxldmVsKQoreworICBzdHJ1Y3QgcHJpbWVwb29sX3MgKml0ZW0sICppdGVtMjsKKyAgc2l6ZV90IG47CisKKyAgZm9yIChuPTAsIGl0ZW0gPSBwcmltZXBvb2w7IGl0ZW07IGl0ZW0gPSBpdGVtLT5uZXh0LCBuKyspCisgICAgaWYgKCFpdGVtLT5wcmltZSkKKyAgICAgIGJyZWFrOworICBpZiAoIWl0ZW0gJiYgbiA+IDEwMCkKKyAgICB7CisgICAgICAvKiBSZW1vdmUgc29tZSBvZiB0aGUgZW50cmllcy4gIE91ciBzdHJhdGVneSBpcyByZW1vdmluZworICAgICAgICAgdGhlIGxhc3QgdGhpcmQgZnJvbSB0aGUgbGlzdC4gKi8KKyAgICAgIGludCBpOworICAgICAgCisgICAgICBmb3IgKGk9MCwgaXRlbTIgPSBwcmltZXBvb2w7IGl0ZW0yOyBpdGVtMiA9IGl0ZW0yLT5uZXh0KQorICAgICAgICB7CisgICAgICAgICAgaWYgKGkgPj0gbi8zKjIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGdjcnlfbXBpX3JlbGVhc2UgKGl0ZW0yLT5wcmltZSk7CisgICAgICAgICAgICAgIGl0ZW0yLT5wcmltZSA9IE5VTEw7CisgICAgICAgICAgICAgIGlmICghaXRlbSkKKyAgICAgICAgICAgICAgICBpdGVtID0gaXRlbTI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgIGlmICghaXRlbSkKKyAgICB7CisgICAgICBpdGVtID0gZ2NyeV9jYWxsb2MgKDEsIHNpemVvZiAqaXRlbSk7CisgICAgICBpZiAoIWl0ZW0pCisgICAgICAgIHsKKyAgICAgICAgICAvKiBPdXQgb2YgbWVtb3J5LiAgU2lsZW50bHkgZ2l2aW5nIHVwLiAqLworICAgICAgICAgIGdjcnlfbXBpX3JlbGVhc2UgKHByaW1lKTsKKyAgICAgICAgICByZXR1cm47IAorICAgICAgICB9CisgICAgICBpdGVtLT5uZXh0ID0gcHJpbWVwb29sOworICAgICAgcHJpbWVwb29sID0gaXRlbTsKKyAgICB9CisgIGl0ZW0tPnByaW1lID0gcHJpbWU7CisgIGl0ZW0tPm5iaXRzID0gbXBpX2dldF9uYml0cyAocHJpbWUpOworICBpdGVtLT5yYW5kb21sZXZlbCA9IHJhbmRvbWxldmVsOworfQorCisKKy8qIFJldHVybiBhIHByaW1lIGZvciB0aGUgcHJpbWUgcG9vbCBvciBOVUxMIGlmIG5vbmUgaGFzIGJlZW4gZm91bmQuCisgICBUaGUgcHJpbWUgbmVlZHMgdG8gbWF0Y2ggTkJJVFMgYW5kIHJhbmRvbWxldmVsLiBUaGlzIGZ1bmN0aW9uIG5lZWRzCisgICB0byBiZSBjYWxsZWQgd2h5IHRoZSBwcmltZXBvb2xfbG9vayBpcyBiZWluZyBob2xkLiAqLworc3RhdGljIGdjcnlfbXBpX3QKK2dldF9wb29sX3ByaW1lICh1bnNpZ25lZCBpbnQgbmJpdHMsIGdjcnlfcmFuZG9tX2xldmVsX3QgcmFuZG9tbGV2ZWwpCit7CisgIHN0cnVjdCBwcmltZXBvb2xfcyAqaXRlbTsKKworICBmb3IgKGl0ZW0gPSBwcmltZXBvb2w7IGl0ZW07IGl0ZW0gPSBpdGVtLT5uZXh0KQorICAgIGlmIChpdGVtLT5wcmltZQorICAgICAgICAmJiBpdGVtLT5uYml0cyA9PSBuYml0cyAmJiBpdGVtLT5yYW5kb21sZXZlbCA9PSByYW5kb21sZXZlbCkKKyAgICAgIHsKKyAgICAgICAgZ2NyeV9tcGlfdCBwcmltZSA9IGl0ZW0tPnByaW1lOworICAgICAgICBpdGVtLT5wcmltZSA9IE5VTEw7CisgICAgICAgIGdjcnlfYXNzZXJ0IChuYml0cyA9PSBtcGlfZ2V0X25iaXRzIChwcmltZSkpOworICAgICAgICByZXR1cm4gcHJpbWU7CisgICAgICB9CisgIHJldHVybiBOVUxMOworfQorCisKKworCisKKwwKK3ZvaWQKK19nY3J5X3JlZ2lzdGVyX3ByaW1lZ2VuX3Byb2dyZXNzICggdm9pZCAoKmNiKSh2b2lkICosY29uc3QgY2hhciosaW50LGludCxpbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjYl9kYXRhICkKK3sKKyAgcHJvZ3Jlc3NfY2IgPSBjYjsKKyAgcHJvZ3Jlc3NfY2JfZGF0YSA9IGNiX2RhdGE7Cit9CisKKworc3RhdGljIHZvaWQKK3Byb2dyZXNzKCBpbnQgYyApCit7CisgIGlmICggcHJvZ3Jlc3NfY2IgKQorICAgIHByb2dyZXNzX2NiICggcHJvZ3Jlc3NfY2JfZGF0YSwgInByaW1lZ2VuIiwgYywgMCwgMCApOworfQorCisKKy8qKioqKioqKioqKioqKioqCisgKiBHZW5lcmF0ZSBhIHByaW1lIG51bWJlciAoc3RvcmVkIGluIHNlY3VyZSBtZW1vcnkpCisgKi8KK2djcnlfbXBpX3QKK19nY3J5X2dlbmVyYXRlX3NlY3JldF9wcmltZSAodW5zaWduZWQgaW50IG5iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X3JhbmRvbV9sZXZlbF90IHJhbmRvbV9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICgqZXh0cmFfY2hlY2spKHZvaWQqLCBnY3J5X21waV90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZXh0cmFfY2hlY2tfYXJnKQoreworICBnY3J5X21waV90IHByaW1lOworCisgIHByaW1lID0gZ2VuX3ByaW1lIChuYml0cywgMSwgcmFuZG9tX2xldmVsLCBleHRyYV9jaGVjaywgZXh0cmFfY2hlY2tfYXJnKTsKKyAgcHJvZ3Jlc3MoJ1xuJyk7CisgIHJldHVybiBwcmltZTsKK30KKworCisvKiBHZW5lcmF0ZSBhIHByaW1lIG51bWJlciB3aGljaCBtYXkgYmUgcHVibGljLCBpLmUuIG5vdCBhbGxvY2F0ZWQgaW4KKyAgIHNlY3VyZSBtZW1vcnkuICAqLworZ2NyeV9tcGlfdAorX2djcnlfZ2VuZXJhdGVfcHVibGljX3ByaW1lICh1bnNpZ25lZCBpbnQgbmJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfcmFuZG9tX2xldmVsX3QgcmFuZG9tX2xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKCpleHRyYV9jaGVjaykodm9pZCosIGdjcnlfbXBpX3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpleHRyYV9jaGVja19hcmcpCit7CisgIGdjcnlfbXBpX3QgcHJpbWU7CisKKyAgcHJpbWUgPSBnZW5fcHJpbWUgKG5iaXRzLCAwLCByYW5kb21fbGV2ZWwsIGV4dHJhX2NoZWNrLCBleHRyYV9jaGVja19hcmcpOworICBwcm9ncmVzcygnXG4nKTsKKyAgcmV0dXJuIHByaW1lOworfQorCisKKy8qIENvcmUgcHJpbWUgZ2VuZXJhdGlvbiBmdW5jdGlvbi4gIFRoZSBhbGdvcml0aG0gdXNlZCB0byBnZW5lcmF0ZQorICAgcHJhY3RpY2FsbHkgc2F2ZSBwcmltZXMgaXMgZHVlIHRvIExpbSBhbmQgTGVlIGFzIGRlc2NyaWJlZCBpbiB0aGUKKyAgIENSWVBUTyAnOTcgcHJvY2VlZGluZ3MgKElTQk4zNTQwNjMzODQ3KSBwYWdlIDI2MC4KKworICAgTkVFRF9RX0ZBQ1RPUjogSWYgdHJ1ZSBtYWtlIHN1cmUgdGhhdCBhdCBsZWFzdCBvbmUgZmFjdG9yIGlzIG9mCisgICAgICAgICAgICAgICAgICBzaXplIHFiaXRzLiAgVGhpcyBpcyBmb3IgZXhhbXBsZSByZXF1aXJlZCBmb3IgRFNBLgorICAgUFJJTUVfR0VORVJBVEVEOiBBZHJlc3NzIG9mIGEgdmFyaWFibGUgd2hlcmUgdGhlIHJlc3VsdGluZyBwcmltZQorICAgICAgICAgICAgICAgICAgICBudW1iZXIgd2lsbCBiZSBzdG9yZWQuCisgICBQQklUUzogUmVxdWVzdGVkIHNpemUgb2YgdGhlIHByaW1lIG51bWJlci4gIEF0IGxlYXN0IDQ4LgorICAgUUJJVFM6IE9uZSBmYWN0b3Igb2YgdGhlIHByaW1lIG5lZWRzIHRvIGJlIG9mIHRoaXMgc2l6ZS4gIE1heWJlIDAKKyAgICAgICAgICBpZiB0aGlzIGlzIG5vdCByZXF1aXJlZC4gIFNlZSBhbHNvIE1PREUuCisgICBHOiBJZiBub3QgTlVMTCBhbiBNUEkgd2hpY2ggd2lsbCByZWNlaXZlIGEgZ2VuZXJhdG9yIGZvciB0aGUgcHJpbWUKKyAgICAgIGZvciB1c2Ugd2l0aCBFbGdhbWFsLgorICAgUkVUX0ZBQ1RPUlM6IGlmIG5vdCBOVUxMLCBhbiBhcnJheSB3aXRoIGFsbCBmYWN0b3JzIGFyZSBzdG9yZWQgYXQKKyAgICAgICAgICAgICAgICB0aGF0IGFkZHJlc3MuCisgICBBTExfRkFDVE9SUzogSWYgc2V0IHRvIHRydWUgYWxsIGZhY3RvcnMgb2YgcHJpbWUtMSBhcmUgcmV0dXJuZWQuCisgICBSQU5ET01MRVZFTDogIEhvdyBzdHJvbmcgc2hvdWxkIHRoZSByYW5kb20gbnVtZXJzIGJlLgorICAgRkxBR1M6IFByaW1lIGdlbmVyYXRpb24gYml0IGZsYWdzLiBDdXJyZW50bHkgc3VwcG9ydGVkOgorICAgICAgICAgIEdDUllfUFJJTUVfRkxBR19TRUNSRVQgLSBUaGUgcHJpbWUgbmVlZHMgdG8gYmUga2VwdCBzZWNyZXQuCisgICBDQl9GVU5DLCBDQl9BUkc6ICBDYWxsYmFjayB0byBiZSB1c2VkIGZvciBleHRyYSBjaGVja3MuCisKKyAqLworc3RhdGljIGdjcnlfZXJyX2NvZGVfdAorcHJpbWVfZ2VuZXJhdGVfaW50ZXJuYWwgKGludCBuZWVkX3FfZmFjdG9yLAorCQkJIGdjcnlfbXBpX3QgKnByaW1lX2dlbmVyYXRlZCwgdW5zaWduZWQgaW50IHBiaXRzLAorCQkJIHVuc2lnbmVkIGludCBxYml0cywgZ2NyeV9tcGlfdCBnLAorCQkJIGdjcnlfbXBpX3QgKipyZXRfZmFjdG9ycywKKwkJCSBnY3J5X3JhbmRvbV9sZXZlbF90IHJhbmRvbWxldmVsLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsbF9mYWN0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfcHJpbWVfY2hlY2tfZnVuY190IGNiX2Z1bmMsIHZvaWQgKmNiX2FyZykKK3sKKyAgZ2NyeV9lcnJfY29kZV90IGVyciA9IDA7CisgIGdjcnlfbXBpX3QgKmZhY3RvcnNfbmV3ID0gTlVMTDsgLyogRmFjdG9ycyB0byByZXR1cm4gdG8gdGhlCisJCQkJICAgICBjYWxsZXIuICAqLworICBnY3J5X21waV90ICpmYWN0b3JzID0gTlVMTDsJLyogQ3VycmVudCBmYWN0b3JzLiAgKi8KKyAgZ2NyeV9yYW5kb21fbGV2ZWxfdCBwb29scmFuZG9tbGV2ZWw7IC8qIFJhbmRvbSBsZXZlbCB1c2VkIGZvciBwb29sIHByaW1lcy4gKi8KKyAgZ2NyeV9tcGlfdCAqcG9vbCA9IE5VTEw7CS8qIFBvb2wgb2YgcHJpbWVzLiAgKi8KKyAgaW50ICpwb29sX2luX3VzZSA9IE5VTEw7ICAgICAgLyogQXJyYXkgd2l0aCBjdXJyZW50bHkgdXNlZCBQT09MIGVsZW1lbnRzLiAqLworICB1bnNpZ25lZCBjaGFyICpwZXJtcyA9IE5VTEw7CS8qIFBlcm11dGF0aW9ucyBvZiBQT09MLiAgKi8KKyAgZ2NyeV9tcGlfdCBxX2ZhY3RvciA9IE5VTEw7CS8qIFVzZWQgaWYgUUJJVFMgaXMgbm9uLXplcm8uICAqLworICB1bnNpZ25lZCBpbnQgZmJpdHMgPSAwOwkvKiBMZW5ndGggb2YgcHJpbWUgZmFjdG9ycy4gICovCisgIHVuc2lnbmVkIGludCBuID0gMDsJCS8qIE51bWJlciBvZiBmYWN0b3JzLiAgKi8KKyAgdW5zaWduZWQgaW50IG0gPSAwOwkJLyogTnVtYmVyIG9mIHByaW1lcyBpbiBwb29sLiAgKi8KKyAgZ2NyeV9tcGlfdCBxID0gTlVMTDsJCS8qIEZpcnN0IHByaW1lIGZhY3Rvci4gICovCisgIGdjcnlfbXBpX3QgcHJpbWUgPSBOVUxMOwkvKiBQcmltZSBjYW5kaWRhdGUuICAqLworICB1bnNpZ25lZCBpbnQgbnByaW1lID0gMDsJLyogQml0cyBvZiBQUklNRS4gICovCisgIHVuc2lnbmVkIGludCByZXFfcWJpdHM7ICAgICAgIC8qIFRoZSBvcmlnaW5hbCBRQklUUyB2YWx1ZS4gICovCisgIGdjcnlfbXBpX3QgdmFsXzI7ICAgICAgICAgICAgIC8qIEZvciBjaGVja19wcmltZSgpLiAgKi8KKyAgaW50IGlzX2xvY2tlZCA9IDA7ICAgICAgICAgICAgLyogRmxhZyB0byBoZWxwIHVubG9ja2luZyB0aGUgcHJpbWVwb29sLiAqLworICB1bnNpZ25lZCBpbnQgaXNfc2VjcmV0ID0gKGZsYWdzICYgR0NSWV9QUklNRV9GTEFHX1NFQ1JFVCk7CisgIHVuc2lnbmVkIGludCBjb3VudDEgPSAwLCBjb3VudDIgPSAwOworICB1bnNpZ25lZCBpbnQgaSA9IDAsIGogPSAwOworCisgIGlmIChwYml0cyA8IDQ4KQorICAgIHJldHVybiBHUEdfRVJSX0lOVl9BUkc7CisKKyAgLyogV2Ugd29uJ3QgdXNlIGEgdG9vIHN0cm9uZyByYW5kb20gZWx2ZWwgZm9yIHRoZSBwb29sZWQgc3VicHJpbWVzLiAqLworICBwb29scmFuZG9tbGV2ZWwgPSAocmFuZG9tbGV2ZWwgPiBHQ1JZX1NUUk9OR19SQU5ET00/CisgICAgICAgICAgICAgICAgICAgICBHQ1JZX1NUUk9OR19SQU5ET00gOiByYW5kb21sZXZlbCk7CisKKworICAvKiBJZiBRQklUUyBpcyBub3QgZ2l2ZW4sIGFzc3VtZSBhIHJlYXNvbmFibGUgdmFsdWUuICovCisgIGlmICghcWJpdHMpCisgICAgcWJpdHMgPSBwYml0cyAvIDM7CisKKyAgcmVxX3FiaXRzID0gcWJpdHM7CisKKyAgLyogRmluZCBudW1iZXIgb2YgbmVlZGVkIHByaW1lIGZhY3RvcnMgTi4gICovCisgIGZvciAobiA9IDE7IChwYml0cyAtIHFiaXRzIC0gMSkgLyBuICA+PSBxYml0czsgbisrKQorICAgIDsKKyAgbi0tOworCisgIHZhbF8yID0gbXBpX2FsbG9jX3NldF91aSAoMik7CisKKyAgaWYgKCghIG4pIHx8ICgobmVlZF9xX2ZhY3RvcikgJiYgKG4gPCAyKSkpCisgICAgeworICAgICAgZXJyID0gR1BHX0VSUl9JTlZfQVJHOworICAgICAgZ290byBsZWF2ZTsKKyAgICB9CisKKyAgaWYgKG5lZWRfcV9mYWN0b3IpCisgICAgeworICAgICAgbi0tOyAgLyogTmVlZCBvbmUgZmFjdG9yIGxlc3MgYmVjYXVzZSB3ZSB3YW50IGEgc3BlY2lmaWMgUS1GQUNUT1IuICovCisgICAgICBmYml0cyA9IChwYml0cyAtIDIgKiByZXFfcWJpdHMgLTEpIC8gbjsKKyAgICAgIHFiaXRzID0gIHBiaXRzIC0gcmVxX3FiaXRzIC0gbiAqIGZiaXRzOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGZiaXRzID0gKHBiaXRzIC0gcmVxX3FiaXRzIC0xKSAvIG47CisgICAgICBxYml0cyA9IHBiaXRzIC0gbiAqIGZiaXRzOworICAgIH0KKyAgCisgIGlmIChEQkdfQ0lQSEVSKQorICAgIGxvZ19kZWJ1ZyAoImdlbiBwcmltZTogcGJpdHM9JXUgcWJpdHM9JXUgZmJpdHM9JXUvJXUgbj0lZFxuIiwKKyAgICAgICAgICAgICAgIHBiaXRzLCByZXFfcWJpdHMsIHFiaXRzLCBmYml0cywgbik7CisKKyAgLyogQWxsb2NhdGUgYW4gaW50ZWdlciB0byBvbGQgdGhlIG5ldyBwcmltZS4gKi8KKyAgcHJpbWUgPSBnY3J5X21waV9uZXcgKHBiaXRzKTsKKworICAvKiBHZW5lcmF0ZSBmaXJzdCBwcmltZSBmYWN0b3IuICAqLworICBxID0gZ2VuX3ByaW1lIChxYml0cywgaXNfc2VjcmV0LCByYW5kb21sZXZlbCwgTlVMTCwgTlVMTCk7CisKKyAgLyogR2VuZXJhdGUgYSBzcGVjaWZpYyBRLUZhY3RvciBpZiByZXF1ZXN0ZWQuICovCisgIGlmIChuZWVkX3FfZmFjdG9yKQorICAgIHFfZmFjdG9yID0gZ2VuX3ByaW1lIChyZXFfcWJpdHMsIGlzX3NlY3JldCwgcmFuZG9tbGV2ZWwsIE5VTEwsIE5VTEwpOworICAKKyAgLyogQWxsb2NhdGUgYW4gYXJyYXkgdG8gaG9sZCBhbGwgZmFjdG9ycyArIDIgZm9yIGxhdGVyIHVzYWdlLiAgKi8KKyAgZmFjdG9ycyA9IGdjcnlfY2FsbG9jIChuICsgMiwgc2l6ZW9mICgqZmFjdG9ycykpOworICBpZiAoIWZhY3RvcnMpCisgICAgeworICAgICAgZXJyID0gZ3BnX2Vycl9jb2RlX2Zyb21fZXJybm8gKGVycm5vKTsKKyAgICAgIGdvdG8gbGVhdmU7CisgICAgfQorCisgIC8qIEFsbG9jYXRlIGFuIGFycmF5IHRvIHRyYWNrIHBvb2wgdXNhZ2UuICovCisgIHBvb2xfaW5fdXNlID0gZ2NyeV9tYWxsb2MgKG4gKiBzaXplb2YgKnBvb2xfaW5fdXNlKTsKKyAgaWYgKCFwb29sX2luX3VzZSkKKyAgICB7CisgICAgICBlcnIgPSBncGdfZXJyX2NvZGVfZnJvbV9lcnJubyAoZXJybm8pOworICAgICAgZ290byBsZWF2ZTsKKyAgICB9CisgIGZvciAoaT0wOyBpIDwgbjsgaSsrKQorICAgIHBvb2xfaW5fdXNlW2ldID0gLTE7CisgICAgICAKKyAgLyogTWFrZSBhIHBvb2wgb2YgM24rNSBwcmltZXMgKHRoaXMgaXMgYW4gYXJiaXRyYXJ5IHZhbHVlKS4gIFdlCisgICAgIHJlcXVpcmUgYXQgbGVhc3QgMzAgcHJpbWVzIGZvciBhcmUgdXNlZnVsIHNlbGVjdGlvbiBwcm9jZXNzLiAKKyAgICAgCisgICAgIEZpeG1lOiBXZSBuZWVkIHRvIHJlc2VhcmNoIHRoZSBiZXN0IGZvcm11bGEgZm9yIHNpemluZyB0aGUgcG9vbC4KKyAgKi8KKyAgbSA9IG4gKiAzICsgNTsKKyAgaWYgKG5lZWRfcV9mYWN0b3IpIC8qIE5lZWQgc29tZSBtb3JlIGluIHRoaXMgY2FzZS4gKi8KKyAgICBtICs9IDU7CisgIGlmIChtIDwgMzApCisgICAgbSA9IDMwOworICBwb29sID0gZ2NyeV9jYWxsb2MgKG0gLCBzaXplb2YgKCpwb29sKSk7CisgIGlmICghIHBvb2wpCisgICAgeworICAgICAgZXJyID0gZ3BnX2Vycl9jb2RlX2Zyb21fZXJybm8gKGVycm5vKTsKKyAgICAgIGdvdG8gbGVhdmU7CisgICAgfQorCisgIC8qIFBlcm11dGF0ZSBvdmVyIHRoZSBwb29sIG9mIHByaW1lcyB1bnRpbCB3ZSBmaW5kIGEgcHJpbWUgb2YgdGhlCisgICAgIHJlcXVlc3RlZCBsZW5ndGguICAqLworICBkbworICAgIHsKKyAgICBuZXh0X3RyeToKKyAgICAgIGZvciAoaT0wOyBpIDwgbjsgaSsrKQorICAgICAgICBwb29sX2luX3VzZVtpXSA9IC0xOworCisgICAgICBpZiAoIXBlcm1zKQorICAgICAgICB7CisgICAgICAgICAgLyogQWxsb2NhdGUgbmV3IHByaW1lcy4gIFRoaXMgaXMgZG9uZSByaWdodCBhdCB0aGUgYmVnaW5uaW5nCisgICAgICAgICAgICAgb2YgdGhlIGxvb3AgYW5kIGlmIHdlIGhhdmUgbGF0ZXIgcnVuIG91dCBvZiBwcmltZXMuICovCisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG07IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbXBpX2ZyZWUgKHBvb2xbaV0pOworICAgICAgICAgICAgICBwb29sW2ldID0gTlVMTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIC8qIEluaXQgbV9vdXRfb2ZfbigpLiAgKi8KKyAgICAgICAgICBwZXJtcyA9IGdjcnlfY2FsbG9jICgxLCBtKTsKKyAgICAgICAgICBpZiAoIXBlcm1zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBlcnIgPSBncGdfZXJyX2NvZGVfZnJvbV9lcnJubyAoZXJybm8pOworICAgICAgICAgICAgICBnb3RvIGxlYXZlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGF0aF9tdXRleF9sb2NrICgmcHJpbWVwb29sX2xvY2spKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBlcnIgPSBHUEdfRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgICBnb3RvIGxlYXZlOworICAgICAgICAgICAgfQorICAgICAgICAgIGlzX2xvY2tlZCA9IDE7CisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcGVybXNbaV0gPSAxOyAKKyAgICAgICAgICAgICAgLyogQXQgYSBtYXhpbXVtIHdlIHVzZSBzdHJvbmcgcmFuZG9tIGZvciB0aGUgZmFjdG9ycy4KKyAgICAgICAgICAgICAgICAgVGhpcyBzYXZlcyB1cyBhIGxvdCBvZiBlbnRyb3B5LiBHaXZlbiB0aGF0IFEgYW5kCisgICAgICAgICAgICAgICAgIHBvc3NpYmxlIFEtZmFjdG9yIGFyZSBhbHNvIHVzZWQgaW4gdGhlIGZpbmFsIHByaW1lCisgICAgICAgICAgICAgICAgIHRoaXMgc2hvdWxkIGJlIGFjY2VwdGFibGUuICBXZSBhbHNvIGRvbid0IGFsbG9jYXRlIGluCisgICAgICAgICAgICAgICAgIHNlY3VyZSBtZW1vcnkgdG8gc2F2ZSBvbiB0aGF0IHNjYXJlIHJlc291cmNlIHRvby4gIElmCisgICAgICAgICAgICAgICAgIFEgaGFzIGJlZW4gYWxsb2NhdGVkIGluIHNlY3VyZSBtZW1vcnksIHRoZSBmaW5hbAorICAgICAgICAgICAgICAgICBwcmltZSB3aWxsIGJlIHNhdmVkIHRoZXJlIGFueXdheS4gIFRoaXMgaXMgYmVjYXVzZQorICAgICAgICAgICAgICAgICBvdXIgTVBJIHJvdXRpbmVzIHRha2UgY2FyZSBvZiB0aGF0LiAgR251UEcgaGFzIHdvcmtlZAorICAgICAgICAgICAgICAgICB0aGlzIHdheSBldmVyIHNpbmNlLiAgKi8KKyAgICAgICAgICAgICAgcG9vbFtpXSA9IE5VTEw7CisgICAgICAgICAgICAgIGlmIChpc19sb2NrZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcG9vbFtpXSA9IGdldF9wb29sX3ByaW1lIChmYml0cywgcG9vbHJhbmRvbWxldmVsKTsKKyAgICAgICAgICAgICAgICAgIGlmICghcG9vbFtpXSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIGlmIChhdGhfbXV0ZXhfdW5sb2NrICgmcHJpbWVwb29sX2xvY2spKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBHUEdfRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGxlYXZlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIGlzX2xvY2tlZCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmICghcG9vbFtpXSkKKyAgICAgICAgICAgICAgICBwb29sW2ldID0gZ2VuX3ByaW1lIChmYml0cywgMCwgcG9vbHJhbmRvbWxldmVsLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICAgICAgcG9vbF9pbl91c2VbaV0gPSBpOworICAgICAgICAgICAgICBmYWN0b3JzW2ldID0gcG9vbFtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoaXNfbG9ja2VkICYmIGF0aF9tdXRleF91bmxvY2sgKCZwcmltZXBvb2xfbG9jaykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGVyciA9IEdQR19FUlJfSU5URVJOQUw7CisgICAgICAgICAgICAgIGdvdG8gbGVhdmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgaXNfbG9ja2VkID0gMDsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogR2V0IG5leHQgcGVybXV0YXRpb24uICovCisgICAgICAgICAgbV9vdXRfb2ZfbiAoIChjaGFyKilwZXJtcywgbiwgbSk7CisgICAgICAgICAgaWYgKGF0aF9tdXRleF9sb2NrICgmcHJpbWVwb29sX2xvY2spKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBlcnIgPSBHUEdfRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgICBnb3RvIGxlYXZlOworICAgICAgICAgICAgfQorICAgICAgICAgIGlzX2xvY2tlZCA9IDE7CisgICAgICAgICAgZm9yIChpID0gaiA9IDA7IChpIDwgbSkgJiYgKGogPCBuKTsgaSsrKQorICAgICAgICAgICAgaWYgKHBlcm1zW2ldKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogSWYgdGhlIHN1YnByaW1lIGhhcyBub3QgeWV0IGJlZWQgZ2VuZXJhdGVkIGRvIGl0IG5vdy4gKi8KKyAgICAgICAgICAgICAgICBpZiAoIXBvb2xbaV0gJiYgaXNfbG9ja2VkKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwb29sW2ldID0gZ2V0X3Bvb2xfcHJpbWUgKGZiaXRzLCBwb29scmFuZG9tbGV2ZWwpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXBvb2xbaV0pCisgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF0aF9tdXRleF91bmxvY2sgKCZwcmltZXBvb2xfbG9jaykpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBHUEdfRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbGVhdmU7CisgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlzX2xvY2tlZCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghcG9vbFtpXSkKKyAgICAgICAgICAgICAgICAgIHBvb2xbaV0gPSBnZW5fcHJpbWUgKGZiaXRzLCAwLCBwb29scmFuZG9tbGV2ZWwsIE5VTEwsIE5VTEwpOworICAgICAgICAgICAgICAgIHBvb2xfaW5fdXNlW2pdID0gaTsKKyAgICAgICAgICAgICAgICBmYWN0b3JzW2orK10gPSBwb29sW2ldOworICAgICAgICAgICAgICB9CisgICAgICAgICAgaWYgKGlzX2xvY2tlZCAmJiBhdGhfbXV0ZXhfdW5sb2NrICgmcHJpbWVwb29sX2xvY2spKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBlcnIgPSBHUEdfRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgICBnb3RvIGxlYXZlOworICAgICAgICAgICAgfQorICAgICAgICAgIGlzX2xvY2tlZCA9IDA7CisgICAgICAgICAgaWYgKGkgPT0gbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogUmFuIG91dCBvZiBwZXJtdXRhdGlvbnM6IEFsbG9jYXRlIG5ldyBwcmltZXMuICAqLworICAgICAgICAgICAgICBnY3J5X2ZyZWUgKHBlcm1zKTsKKyAgICAgICAgICAgICAgcGVybXMgPSBOVUxMOworICAgICAgICAgICAgICBwcm9ncmVzcyAoJyEnKTsKKyAgICAgICAgICAgICAgZ290byBuZXh0X3RyeTsJCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCS8qIEdlbmVyYXRlIG5leHQgcHJpbWUgY2FuZGlkYXRlOgorCSAgIHAgPSAyICogcSBbICogcV9mYWN0b3JdICogZmFjdG9yXzAgKiBmYWN0b3JfMSAqIC4uLiAqIGZhY3Rvcl9uICsgMS4gCisgICAgICAgICAqLworCW1waV9zZXQgKHByaW1lLCBxKTsKKwltcGlfbXVsX3VpIChwcmltZSwgcHJpbWUsIDIpOworCWlmIChuZWVkX3FfZmFjdG9yKQorCSAgbXBpX211bCAocHJpbWUsIHByaW1lLCBxX2ZhY3Rvcik7CisJZm9yKGkgPSAwOyBpIDwgbjsgaSsrKQorCSAgbXBpX211bCAocHJpbWUsIHByaW1lLCBmYWN0b3JzW2ldKTsKKwltcGlfYWRkX3VpIChwcmltZSwgcHJpbWUsIDEpOworCW5wcmltZSA9IG1waV9nZXRfbmJpdHMgKHByaW1lKTsKKworCWlmIChucHJpbWUgPCBwYml0cykKKwkgIHsKKwkgICAgaWYgKCsrY291bnQxID4gMjApCisJICAgICAgeworCQljb3VudDEgPSAwOworCQlxYml0cysrOworCQlwcm9ncmVzcygnPicpOworCQltcGlfZnJlZSAocSk7CisJCXEgPSBnZW5fcHJpbWUgKHFiaXRzLCBpc19zZWNyZXQsIHJhbmRvbWxldmVsLCBOVUxMLCBOVUxMKTsKKwkJZ290byBuZXh0X3RyeTsKKwkgICAgICB9CisJICB9CisJZWxzZQorCSAgY291bnQxID0gMDsKKyAgICAgICAgCisJaWYgKG5wcmltZSA+IHBiaXRzKQorCSAgeworCSAgICBpZiAoKytjb3VudDIgPiAyMCkKKwkgICAgICB7CisJCWNvdW50MiA9IDA7CisJCXFiaXRzLS07CisJCXByb2dyZXNzKCc8Jyk7CisJCW1waV9mcmVlIChxKTsKKwkJcSA9IGdlbl9wcmltZSAocWJpdHMsIGlzX3NlY3JldCwgcmFuZG9tbGV2ZWwsIE5VTEwsIE5VTEwpOworCQlnb3RvIG5leHRfdHJ5OworCSAgICAgIH0KKwkgIH0KKwllbHNlCisJICBjb3VudDIgPSAwOworICAgIH0KKyAgd2hpbGUgKCEgKChucHJpbWUgPT0gcGJpdHMpICYmIGNoZWNrX3ByaW1lIChwcmltZSwgdmFsXzIsIDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2JfZnVuYywgY2JfYXJnKSkpOworCisgIGlmIChEQkdfQ0lQSEVSKQorICAgIHsKKyAgICAgIHByb2dyZXNzICgnXG4nKTsKKyAgICAgIGxvZ19tcGlkdW1wICgicHJpbWUgICAgOiAiLCBwcmltZSk7CisgICAgICBsb2dfbXBpZHVtcCAoImZhY3RvciAgcTogIiwgcSk7CisgICAgICBpZiAobmVlZF9xX2ZhY3RvcikKKyAgICAgICAgbG9nX21waWR1bXAgKCJmYWN0b3IgcTA6ICIsIHFfZmFjdG9yKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgIGxvZ19tcGlkdW1wICgiZmFjdG9yIHBpOiAiLCBmYWN0b3JzW2ldKTsKKyAgICAgIGxvZ19kZWJ1ZyAoImJpdCBzaXplczogcHJpbWU9JXUsIHE9JXUiLAorICAgICAgICAgICAgICAgICBtcGlfZ2V0X25iaXRzIChwcmltZSksIG1waV9nZXRfbmJpdHMgKHEpKTsKKyAgICAgIGlmIChuZWVkX3FfZmFjdG9yKQorICAgICAgICBsb2dfZGVidWcgKCIsIHEwPSV1IiwgbXBpX2dldF9uYml0cyAocV9mYWN0b3IpKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgIGxvZ19kZWJ1ZyAoIiwgcCVkPSV1IiwgaSwgbXBpX2dldF9uYml0cyAoZmFjdG9yc1tpXSkpOworICAgICAgcHJvZ3Jlc3MoJ1xuJyk7CisgICAgfQorCisgIGlmIChyZXRfZmFjdG9ycykKKyAgICB7CisgICAgICAvKiBDYWxsZXIgd2FudHMgdGhlIGZhY3RvcnMuICAqLworICAgICAgZmFjdG9yc19uZXcgPSBnY3J5X2NhbGxvYyAobiArIDQsIHNpemVvZiAoKmZhY3RvcnNfbmV3KSk7CisgICAgICBpZiAoISBmYWN0b3JzX25ldykKKyAgICAgICAgeworICAgICAgICAgIGVyciA9IGdwZ19lcnJfY29kZV9mcm9tX2Vycm5vIChlcnJubyk7CisgICAgICAgICAgZ290byBsZWF2ZTsKKyAgICAgICAgfQorCisgICAgICBpZiAoYWxsX2ZhY3RvcnMpCisgICAgICAgIHsKKyAgICAgICAgICBpID0gMDsKKyAgICAgICAgICBmYWN0b3JzX25ld1tpKytdID0gZ2NyeV9tcGlfc2V0X3VpIChOVUxMLCAyKTsKKyAgICAgICAgICBmYWN0b3JzX25ld1tpKytdID0gbXBpX2NvcHkgKHEpOworICAgICAgICAgIGlmIChuZWVkX3FfZmFjdG9yKQorICAgICAgICAgICAgZmFjdG9yc19uZXdbaSsrXSA9IG1waV9jb3B5IChxX2ZhY3Rvcik7CisgICAgICAgICAgZm9yKGo9MDsgaiA8IG47IGorKykKKyAgICAgICAgICAgIGZhY3RvcnNfbmV3W2krK10gPSBtcGlfY29weSAoZmFjdG9yc1tqXSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGkgPSAwOworICAgICAgICAgIGlmIChuZWVkX3FfZmFjdG9yKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmYWN0b3JzX25ld1tpKytdID0gbXBpX2NvcHkgKHFfZmFjdG9yKTsKKyAgICAgICAgICAgICAgZm9yICg7IGkgPD0gbjsgaSsrKQorICAgICAgICAgICAgICAgIGZhY3RvcnNfbmV3W2ldID0gbXBpX2NvcHkgKGZhY3RvcnNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZvciAoOyBpIDwgbjsgaSsrICkKKyAgICAgICAgICAgICAgZmFjdG9yc19uZXdbaV0gPSBtcGlfY29weSAoZmFjdG9yc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisgIAorICBpZiAoZykKKyAgICB7CisgICAgICAvKiBDcmVhdGUgYSBnZW5lcmF0b3IgKHN0YXJ0IHdpdGggMykuICAqLworICAgICAgZ2NyeV9tcGlfdCB0bXAgPSBtcGlfYWxsb2MgKG1waV9nZXRfbmxpbWJzIChwcmltZSkpOworICAgICAgZ2NyeV9tcGlfdCBiID0gbXBpX2FsbG9jIChtcGlfZ2V0X25saW1icyAocHJpbWUpKTsKKyAgICAgIGdjcnlfbXBpX3QgcG1pbjEgPSBtcGlfYWxsb2MgKG1waV9nZXRfbmxpbWJzIChwcmltZSkpOworICAgICAgCisgICAgICBpZiAobmVlZF9xX2ZhY3RvcikKKyAgICAgICAgZXJyID0gR1BHX0VSUl9OT1RfSU1QTEVNRU5URUQ7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBmYWN0b3JzW25dID0gcTsKKyAgICAgICAgICBmYWN0b3JzW24gKyAxXSA9IG1waV9hbGxvY19zZXRfdWkgKDIpOworICAgICAgICAgIG1waV9zdWJfdWkgKHBtaW4xLCBwcmltZSwgMSk7CisgICAgICAgICAgbXBpX3NldF91aSAoZywgMik7CisgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbXBpX2FkZF91aSAoZywgZywgMSk7CisgICAgICAgICAgICAgIGlmIChEQkdfQ0lQSEVSKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGxvZ19kZWJ1ZyAoImNoZWNraW5nIGc6Iik7CisgICAgICAgICAgICAgICAgICBnY3J5X21waV9kdW1wIChnKTsKKyAgICAgICAgICAgICAgICAgIGxvZ19wcmludGYgKCJcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHByb2dyZXNzKCdeJyk7CisgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuICsgMjsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIG1waV9mZGl2X3EgKHRtcCwgcG1pbjEsIGZhY3RvcnNbaV0pOworICAgICAgICAgICAgICAgICAgLyogTm8gbXBpX3BvdygpLCBidXQgaXQgaXMgb2theSB0byB1c2UgdGhpcyB3aXRoIG1vZAorICAgICAgICAgICAgICAgICAgICAgcHJpbWUuICAqLworICAgICAgICAgICAgICAgICAgZ2NyeV9tcGlfcG93bSAoYiwgZywgdG1wLCBwcmltZSk7CisgICAgICAgICAgICAgICAgICBpZiAoISBtcGlfY21wX3VpIChiLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiAoREJHX0NJUEhFUikKKyAgICAgICAgICAgICAgICBwcm9ncmVzcygnXG4nKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgICAgd2hpbGUgKGkgPCBuICsgMik7CisKKyAgICAgICAgICBtcGlfZnJlZSAoZmFjdG9yc1tuKzFdKTsKKyAgICAgICAgICBtcGlfZnJlZSAodG1wKTsKKyAgICAgICAgICBtcGlfZnJlZSAoYik7CisgICAgICAgICAgbXBpX2ZyZWUgKHBtaW4xKTsKKyAgICAgICAgfQorICAgIH0KKyAgCisgIGlmICghIERCR19DSVBIRVIpCisgICAgcHJvZ3Jlc3MgKCdcbicpOworCisKKyBsZWF2ZToKKyAgaWYgKHBvb2wpCisgICAgeworICAgICAgaXNfbG9ja2VkID0gIWF0aF9tdXRleF9sb2NrICgmcHJpbWVwb29sX2xvY2spOworICAgICAgZm9yKGkgPSAwOyBpIDwgbTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHBvb2xbaV0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZvciAoaj0wOyBqIDwgbjsgaisrKQorICAgICAgICAgICAgICAgIGlmIChwb29sX2luX3VzZVtqXSA9PSBpKQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGlmIChqID09IG4gJiYgaXNfbG9ja2VkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qIFRoaXMgcG9vbGVkIHN1YnByaW1lIGhhcyBub3QgYmVlbiB1c2VkLiAqLworICAgICAgICAgICAgICAgICAgc2F2ZV9wb29sX3ByaW1lIChwb29sW2ldLCBwb29scmFuZG9tbGV2ZWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1waV9mcmVlIChwb29sW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgaWYgKGlzX2xvY2tlZCAmJiBhdGhfbXV0ZXhfdW5sb2NrICgmcHJpbWVwb29sX2xvY2spKQorICAgICAgICBlcnIgPSBHUEdfRVJSX0lOVEVSTkFMOworICAgICAgaXNfbG9ja2VkID0gMDsKKyAgICAgIGdjcnlfZnJlZSAocG9vbCk7CisgICAgfQorICBnY3J5X2ZyZWUgKHBvb2xfaW5fdXNlKTsKKyAgaWYgKGZhY3RvcnMpCisgICAgZ2NyeV9mcmVlIChmYWN0b3JzKTsgIC8qIEZhY3RvcnMgYXJlIHNoYWxsb3cgY29waWVzLiAgKi8KKyAgaWYgKHBlcm1zKQorICAgIGdjcnlfZnJlZSAocGVybXMpOworCisgIG1waV9mcmVlICh2YWxfMik7CisgIG1waV9mcmVlIChxKTsKKyAgbXBpX2ZyZWUgKHFfZmFjdG9yKTsKKworICBpZiAoISBlcnIpCisgICAgeworICAgICAgKnByaW1lX2dlbmVyYXRlZCA9IHByaW1lOworICAgICAgaWYgKHJldF9mYWN0b3JzKQorCSpyZXRfZmFjdG9ycyA9IGZhY3RvcnNfbmV3OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChmYWN0b3JzX25ldykKKwl7CisJICBmb3IgKGkgPSAwOyBmYWN0b3JzX25ld1tpXTsgaSsrKQorCSAgICBtcGlfZnJlZSAoZmFjdG9yc19uZXdbaV0pOworCSAgZ2NyeV9mcmVlIChmYWN0b3JzX25ldyk7CisJfQorICAgICAgbXBpX2ZyZWUgKHByaW1lKTsKKyAgICB9CisKKyAgcmV0dXJuIGVycjsKK30KKworCisvKiBHZW5lcmF0ZSBhIHByaW1lIHVzZWQgZm9yIGRpc2NyZXRlIGxvZ2FyaXRobSBhbGdvcml0aG1zOyBpLmUuIHRoaXMKKyAgIHByaW1lIHdpbGwgYmUgcHVibGljIGFuZCBubyBzdHJvbmcgcmFuZG9tIGlzIHJlcXVpcmVkLiAgKi8KK2djcnlfbXBpX3QKK19nY3J5X2dlbmVyYXRlX2VsZ19wcmltZSAoaW50IG1vZGUsIHVuc2lnbmVkIHBiaXRzLCB1bnNpZ25lZCBxYml0cywKKwkJCSAgZ2NyeV9tcGlfdCBnLCBnY3J5X21waV90ICoqcmV0X2ZhY3RvcnMpCit7CisgIGdjcnlfZXJyX2NvZGVfdCBlcnIgPSBHUEdfRVJSX05PX0VSUk9SOworICBnY3J5X21waV90IHByaW1lID0gTlVMTDsKKyAgCisgIGVyciA9IHByaW1lX2dlbmVyYXRlX2ludGVybmFsICgobW9kZSA9PSAxKSwgJnByaW1lLCBwYml0cywgcWJpdHMsIGcsCisJCQkJIHJldF9mYWN0b3JzLCBHQ1JZX1dFQUtfUkFORE9NLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7CisKKyAgcmV0dXJuIHByaW1lOworfQorCisKK3N0YXRpYyBnY3J5X21waV90CitnZW5fcHJpbWUgKHVuc2lnbmVkIGludCBuYml0cywgaW50IHNlY3JldCwgaW50IHJhbmRvbWxldmVsLCAKKyAgICAgICAgICAgaW50ICgqZXh0cmFfY2hlY2spKHZvaWQgKiwgZ2NyeV9tcGlfdCksIHZvaWQgKmV4dHJhX2NoZWNrX2FyZykKK3sKKyAgZ2NyeV9tcGlfdCBwcmltZSwgcHRlc3QsIHBtaW51czEsIHZhbF8yLCB2YWxfMywgcmVzdWx0OworICBpbnQgaTsKKyAgdW5zaWduZWQgaW50IHgsIHN0ZXA7CisgIHVuc2lnbmVkIGludCBjb3VudDEsIGNvdW50MjsKKyAgaW50ICptb2RzOworICAKKy8qICAgaWYgKCAgREJHX0NJUEhFUiApICovCisvKiAgICAgbG9nX2RlYnVnICgiZ2VuZXJhdGUgYSBwcmltZSBvZiAldSBiaXRzICIsIG5iaXRzICk7ICovCisKKyAgaWYgKG5iaXRzIDwgMTYpCisgICAgbG9nX2ZhdGFsICgiY2FuJ3QgZ2VuZXJhdGUgYSBwcmltZSB3aXRoIGxlc3MgdGhhbiAlZCBiaXRzXG4iLCAxNik7CisKKyAgbW9kcyA9IGdjcnlfeG1hbGxvYyggbm9fb2Zfc21hbGxfcHJpbWVfbnVtYmVycyAqIHNpemVvZiAqbW9kcyApOworICAvKiBNYWtlIG5iaXRzIGZpdCBpbnRvIGdjcnlfbXBpX3QgaW1wbGVtZW50YXRpb24uICovCisgIHZhbF8yICA9IG1waV9hbGxvY19zZXRfdWkoIDIgKTsKKyAgdmFsXzMgPSBtcGlfYWxsb2Nfc2V0X3VpKCAzKTsKKyAgcHJpbWUgID0gc2VjcmV0PyBnY3J5X21waV9zbmV3ICggbmJpdHMgKTogZ2NyeV9tcGlfbmV3ICggbmJpdHMgKTsKKyAgcmVzdWx0ID0gbXBpX2FsbG9jX2xpa2UoIHByaW1lICk7CisgIHBtaW51czE9IG1waV9hbGxvY19saWtlKCBwcmltZSApOworICBwdGVzdCAgPSBtcGlfYWxsb2NfbGlrZSggcHJpbWUgKTsKKyAgY291bnQxID0gY291bnQyID0gMDsKKyAgZm9yICg7OykKKyAgICB7ICAvKiB0cnkgZm9ydmV2ZXIgKi8KKyAgICAgIGludCBkb3Rjb3VudD0wOworICAgICAgCisgICAgICAvKiBnZW5lcmF0ZSBhIHJhbmRvbSBudW1iZXIgKi8KKyAgICAgIGdjcnlfbXBpX3JhbmRvbWl6ZSggcHJpbWUsIG5iaXRzLCByYW5kb21sZXZlbCApOworICAgICAgCisgICAgICAvKiBTZXQgaGlnaCBvcmRlciBiaXQgdG8gMSwgc2V0IGxvdyBvcmRlciBiaXQgdG8gMS4gIElmIHdlIGFyZQorICAgICAgICAgZ2VuZXJhdGluZyBhIHNlY3JldCBwcmltZSB3ZSBhcmUgbW9zdCBwcm9iYWJseSBkb2luZyB0aGF0CisgICAgICAgICBmb3IgUlNBLCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgbW9kdWx1cyBkb2VzIGhhdmUgdGhlCisgICAgICAgICByZXF1ZXN0ZWQga2V5IHNpemUgd2Ugc2V0IHRoZSAyIGhpZ2ggb3JkZXIgYml0cy4gKi8KKyAgICAgIG1waV9zZXRfaGlnaGJpdCAocHJpbWUsIG5iaXRzLTEpOworICAgICAgaWYgKHNlY3JldCkKKyAgICAgICAgbXBpX3NldF9iaXQgKHByaW1lLCBuYml0cy0yKTsKKyAgICAgIG1waV9zZXRfYml0KHByaW1lLCAwKTsKKyAgICAgIAorICAgICAgLyogQ2FsY3VsYXRlIGFsbCByZW1haW5kZXJzLiAqLworICAgICAgZm9yIChpPTA7ICh4ID0gc21hbGxfcHJpbWVfbnVtYmVyc1tpXSk7IGkrKyApCisgICAgICAgIG1vZHNbaV0gPSBtcGlfZmRpdl9yX3VpKE5VTEwsIHByaW1lLCB4KTsKKyAgICAgIAorICAgICAgLyogTm93IHRyeSBzb21lIHByaW1lcyBzdGFydGluZyB3aXRoIHByaW1lLiAqLworICAgICAgZm9yKHN0ZXA9MDsgc3RlcCA8IDIwMDAwOyBzdGVwICs9IDIgKSAKKyAgICAgICAgeworICAgICAgICAgIC8qIENoZWNrIGFnYWluc3QgYWxsIHRoZSBzbWFsbCBwcmltZXMgd2UgaGF2ZSBpbiBtb2RzLiAqLworICAgICAgICAgIGNvdW50MSsrOworICAgICAgICAgIGZvciAoaT0wOyAoeCA9IHNtYWxsX3ByaW1lX251bWJlcnNbaV0pOyBpKysgKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgd2hpbGUgKCBtb2RzW2ldICsgc3RlcCA+PSB4ICkKKyAgICAgICAgICAgICAgICBtb2RzW2ldIC09IHg7CisgICAgICAgICAgICAgIGlmICggIShtb2RzW2ldICsgc3RlcCkgKQorICAgICAgICAgICAgICAgIGJyZWFrOworCSAgICB9CisgICAgICAgICAgaWYgKCB4ICkKKyAgICAgICAgICAgIGNvbnRpbnVlOyAgIC8qIEZvdW5kIGEgbXVsdGlwbGUgb2YgYW4gYWxyZWFkeSBrbm93biBwcmltZS4gKi8KKyAgICAgICAgICAKKyAgICAgICAgICBtcGlfYWRkX3VpKCBwdGVzdCwgcHJpbWUsIHN0ZXAgKTsKKworICAgICAgICAgIC8qIERvIGEgZmFzdCBGZXJtYXQgdGVzdCBub3cuICovCisgICAgICAgICAgY291bnQyKys7CisgICAgICAgICAgbXBpX3N1Yl91aSggcG1pbnVzMSwgcHRlc3QsIDEpOworICAgICAgICAgIGdjcnlfbXBpX3Bvd20oIHJlc3VsdCwgdmFsXzIsIHBtaW51czEsIHB0ZXN0ICk7CisgICAgICAgICAgaWYgKCAhbXBpX2NtcF91aSggcmVzdWx0LCAxICkgKQorICAgICAgICAgICAgeyAKKyAgICAgICAgICAgICAgLyogTm90IGNvbXBvc2l0ZSwgcGVyZm9ybSBzdHJvbmdlciB0ZXN0cyAqLworICAgICAgICAgICAgICBpZiAoaXNfcHJpbWUocHRlc3QsIDUsICZjb3VudDIgKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAoIW1waV90ZXN0X2JpdCggcHRlc3QsIG5iaXRzLTEtc2VjcmV0ICkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcygnXG4nKTsKKyAgICAgICAgICAgICAgICAgICAgICBsb2dfZGVidWcgKCJvdmVyZmxvdyBpbiBwcmltZSBnZW5lcmF0aW9uXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsgLyogU3RvcCBsb29wLCBjb250aW51ZSB3aXRoIGEgbmV3IHByaW1lLiAqLworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9jaGVjayAmJiBleHRyYV9jaGVjayAoZXh0cmFfY2hlY2tfYXJnLCBwdGVzdCkpCisgICAgICAgICAgICAgICAgICAgIHsgCisgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIGV4dHJhIGNoZWNrIHRvbGQgdXMgdGhhdCB0aGlzIHByaW1lIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgbm90IG9mIHRoZSBjYWxsZXIncyB0YXN0ZS4gKi8KKyAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcyAoJy8nKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7IAorICAgICAgICAgICAgICAgICAgICAgIC8qIEdvdCBpdC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICBtcGlfZnJlZSh2YWxfMik7CisgICAgICAgICAgICAgICAgICAgICAgbXBpX2ZyZWUodmFsXzMpOworICAgICAgICAgICAgICAgICAgICAgIG1waV9mcmVlKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgICAgbXBpX2ZyZWUocG1pbnVzMSk7CisgICAgICAgICAgICAgICAgICAgICAgbXBpX2ZyZWUocHJpbWUpOworICAgICAgICAgICAgICAgICAgICAgIGdjcnlfZnJlZShtb2RzKTsKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHRlc3Q7IAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCSAgICB9CisgICAgICAgICAgaWYgKCsrZG90Y291bnQgPT0gMTAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBwcm9ncmVzcygnLicpOworICAgICAgICAgICAgICBkb3Rjb3VudCA9IDA7CisJICAgIH0KKwl9CisgICAgICBwcm9ncmVzcygnOicpOyAvKiByZXN0YXJ0IHdpdGggYSBuZXcgcmFuZG9tIHZhbHVlICovCisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKgorICogUmV0dXJuczogdHJ1ZSBpZiB0aGlzIG1heSBiZSBhIHByaW1lCisgKiBSTV9ST1VORFMgZ2l2ZXMgdGhlIG51bWJlciBvZiBSYWJpbi1NaWxsZXIgdGVzdHMgdG8gcnVuLgorICovCitzdGF0aWMgaW50CitjaGVja19wcmltZSggZ2NyeV9tcGlfdCBwcmltZSwgZ2NyeV9tcGlfdCB2YWxfMiwgaW50IHJtX3JvdW5kcywKKyAgICAgICAgICAgICBnY3J5X3ByaW1lX2NoZWNrX2Z1bmNfdCBjYl9mdW5jLCB2b2lkICpjYl9hcmcpCit7CisgIGludCBpOworICB1bnNpZ25lZCBpbnQgeDsKKyAgdW5zaWduZWQgaW50IGNvdW50PTA7CisKKyAgLyogQ2hlY2sgYWdhaW5zdCBzbWFsbCBwcmltZXMuICovCisgIGZvciAoaT0wOyAoeCA9IHNtYWxsX3ByaW1lX251bWJlcnNbaV0pOyBpKysgKQorICAgIHsKKyAgICAgIGlmICggbXBpX2RpdmlzaWJsZV91aSggcHJpbWUsIHggKSApCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAvKiBBIHF1aWNrIEZlcm1hdCB0ZXN0LiAqLworICB7CisgICAgZ2NyeV9tcGlfdCByZXN1bHQgPSBtcGlfYWxsb2NfbGlrZSggcHJpbWUgKTsKKyAgICBnY3J5X21waV90IHBtaW51czEgPSBtcGlfYWxsb2NfbGlrZSggcHJpbWUgKTsKKyAgICBtcGlfc3ViX3VpKCBwbWludXMxLCBwcmltZSwgMSk7CisgICAgZ2NyeV9tcGlfcG93bSggcmVzdWx0LCB2YWxfMiwgcG1pbnVzMSwgcHJpbWUgKTsKKyAgICBtcGlfZnJlZSggcG1pbnVzMSApOworICAgIGlmICggbXBpX2NtcF91aSggcmVzdWx0LCAxICkgKQorICAgICAgeyAKKyAgICAgICAgLyogSXMgY29tcG9zaXRlLiAqLworICAgICAgICBtcGlfZnJlZSggcmVzdWx0ICk7CisgICAgICAgIHByb2dyZXNzKCcuJyk7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgIG1waV9mcmVlKCByZXN1bHQgKTsKKyAgfQorCisgIGlmICghY2JfZnVuYyB8fCBjYl9mdW5jIChjYl9hcmcsIEdDUllfUFJJTUVfQ0hFQ0tfQVRfTUFZQkVfUFJJTUUsIHByaW1lKSkKKyAgICB7CisgICAgICAvKiBQZXJmb3JtIHN0cm9uZ2VyIHRlc3RzLiAqLworICAgICAgaWYgKCBpc19wcmltZSggcHJpbWUsIHJtX3JvdW5kcywgJmNvdW50ICkgKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFjYl9mdW5jCisgICAgICAgICAgICAgIHx8IGNiX2Z1bmMgKGNiX2FyZywgR0NSWV9QUklNRV9DSEVDS19BVF9HT1RfUFJJTUUsIHByaW1lKSkKKyAgICAgICAgICAgIHJldHVybiAxOyAvKiBQcm9iYWJseSBhIHByaW1lLiAqLworICAgICAgICB9CisgICAgfQorICBwcm9ncmVzcygnLicpOworICByZXR1cm4gMDsKK30KKworCisvKgorICogUmV0dXJuIHRydWUgaWYgbiBpcyBwcm9iYWJseSBhIHByaW1lCisgKi8KK3N0YXRpYyBpbnQKK2lzX3ByaW1lIChnY3J5X21waV90IG4sIGludCBzdGVwcywgdW5zaWduZWQgaW50ICpjb3VudCkKK3sKKyAgZ2NyeV9tcGlfdCB4ID0gbXBpX2FsbG9jKCBtcGlfZ2V0X25saW1icyggbiApICk7CisgIGdjcnlfbXBpX3QgeSA9IG1waV9hbGxvYyggbXBpX2dldF9ubGltYnMoIG4gKSApOworICBnY3J5X21waV90IHogPSBtcGlfYWxsb2MoIG1waV9nZXRfbmxpbWJzKCBuICkgKTsKKyAgZ2NyeV9tcGlfdCBubWludXMxID0gbXBpX2FsbG9jKCBtcGlfZ2V0X25saW1icyggbiApICk7CisgIGdjcnlfbXBpX3QgYTIgPSBtcGlfYWxsb2Nfc2V0X3VpKCAyICk7CisgIGdjcnlfbXBpX3QgcTsKKyAgdW5zaWduZWQgaSwgaiwgazsKKyAgaW50IHJjID0gMDsKKyAgdW5zaWduZWQgbmJpdHMgPSBtcGlfZ2V0X25iaXRzKCBuICk7CisKKyAgaWYgKHN0ZXBzIDwgNSkgLyogTWFrZSBzdXJlIHRoYXQgd2UgZG8gYXQgbGVhc3QgNSByb3VuZHMuICovCisgICAgc3RlcHMgPSA1OyAKKworICBtcGlfc3ViX3VpKCBubWludXMxLCBuLCAxICk7CisKKyAgLyogRmluZCBxIGFuZCBrLCBzbyB0aGF0IG4gPSAxICsgMl5rICogcSAuICovCisgIHEgPSBtcGlfY29weSAoIG5taW51czEgKTsKKyAgayA9IG1waV90cmFpbGluZ196ZXJvcyAoIHEgKTsKKyAgbXBpX3RkaXZfcV8yZXhwIChxLCBxLCBrKTsKKworICBmb3IgKGk9MCA7IGkgPCBzdGVwczsgaSsrICkKKyAgICB7CisgICAgICArKypjb3VudDsKKyAgICAgIGlmKCAhaSApCisgICAgICAgIHsKKyAgICAgICAgICBtcGlfc2V0X3VpKCB4LCAyICk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGdjcnlfbXBpX3JhbmRvbWl6ZSggeCwgbmJpdHMsIEdDUllfV0VBS19SQU5ET00gKTsKKworICAgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBudW1iZXIgaXMgc21hbGxlciB0aGFuIHRoZSBwcmltZSBhbmQKKyAgICAgICAgICAgICBrZWVwIHRoZSByYW5kb21uZXNzIG9mIHRoZSBoaWdoIGJpdC4gKi8KKyAgICAgICAgICBpZiAoIG1waV90ZXN0X2JpdCAoIHgsIG5iaXRzLTIpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbXBpX3NldF9oaWdoYml0ICggeCwgbmJpdHMtMik7IC8qIENsZWFyIGFsbCBoaWdoZXIgYml0cy4gKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIG1waV9zZXRfaGlnaGJpdCggeCwgbmJpdHMtMiApOworICAgICAgICAgICAgICBtcGlfY2xlYXJfYml0KCB4LCBuYml0cy0yICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgZ2NyeV9hc3NlcnQgKG1waV9jbXAgKHgsIG5taW51czEpIDwgMCAmJiBtcGlfY21wX3VpICh4LCAxKSA+IDApOworCX0KKyAgICAgIGdjcnlfbXBpX3Bvd20gKCB5LCB4LCBxLCBuKTsKKyAgICAgIGlmICggbXBpX2NtcF91aSh5LCAxKSAmJiBtcGlfY21wKCB5LCBubWludXMxICkgKQorICAgICAgICB7CisgICAgICAgICAgZm9yICggaj0xOyBqIDwgayAmJiBtcGlfY21wKCB5LCBubWludXMxICk7IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGdjcnlfbXBpX3Bvd20oeSwgeSwgYTIsIG4pOworICAgICAgICAgICAgICBpZiggIW1waV9jbXBfdWkoIHksIDEgKSApCisgICAgICAgICAgICAgICAgZ290byBsZWF2ZTsgLyogTm90IGEgcHJpbWUuICovCisgICAgICAgICAgICB9CisgICAgICAgICAgaWYgKG1waV9jbXAoIHksIG5taW51czEgKSApCisgICAgICAgICAgICBnb3RvIGxlYXZlOyAvKiBOb3QgYSBwcmltZS4gKi8KKwl9CisgICAgICBwcm9ncmVzcygnKycpOworICAgIH0KKyAgcmMgPSAxOyAvKiBNYXkgYmUgYSBwcmltZS4gKi8KKworIGxlYXZlOgorICBtcGlfZnJlZSggeCApOworICBtcGlfZnJlZSggeSApOworICBtcGlfZnJlZSggeiApOworICBtcGlfZnJlZSggbm1pbnVzMSApOworICBtcGlfZnJlZSggcSApOworICBtcGlfZnJlZSggYTIgKTsKKworICByZXR1cm4gcmM7Cit9CisKKworLyogR2l2ZW4gQVJSQVkgb2Ygc2l6ZSBOIHdpdGggTSBlbGVtZW50cyBzZXQgdG8gdHJ1ZSBwcm9kdWNlIGEKKyAgIG1vZGlmaWVkIGFycmF5IHdpdGggdGhlIG5leHQgcGVybXV0YXRpb24gb2YgTSBlbGVtZW50cy4gIE5vdGUsIHRoYXQKKyAgIEFSUkFZIGlzIHVzZWQgaW4gYSBvbmUtYml0LXBlci1ieXRlIGFwcHJvYWNoLiAgVG8gZGV0ZWN0ZWQgdGhlIGxhc3QKKyAgIHBlcm11dGF0aW9uIGl0IGlzIHVzZWZ1bCB0byBpbnRpYWxpemUgdGhlIGFycmF5IHdpdGggdGhlIGZpcnN0IE0KKyAgIGVsZW1lbnQgc2V0IHRvIHRydWUgYW5kIHVzZSB0aGlzIHRlc3Q6CisgICAgICAgbV9vdXRfb2ZfbiAoYXJyYXksIG0sIG4pOworICAgICAgIGZvciAoaSA9IGogPSAwOyBpIDwgbiAmJiBqIDwgbTsgaSsrKQorICAgICAgICAgaWYgKGFycmF5W2ldKQorICAgICAgICAgICBqKys7CisgICAgICAgaWYgKGogPT0gbSkKKyAgICAgICAgIGdvdG8gcmVhZHk7CisgICAgIAorICAgVGhpcyBjb2RlIGlzIGJhc2VkIG9uIHRoZSBhbGdvcml0aG0gNDUyIGZyb20gdGhlICJDb2xsZWN0ZWQKKyAgIEFsZ29yaXRobXMgRnJvbSBBQ00sIFZvbHVtZSBJSSIgYnkgQy4gTi4gTGl1IGFuZCBELiBULiBUYW5nLgorKi8KK3N0YXRpYyB2b2lkCittX291dF9vZl9uICggY2hhciAqYXJyYXksIGludCBtLCBpbnQgbiApCit7CisgIGludCBpPTAsIGkxPTAsIGo9MCwganA9MCwgIGoxPTAsIGsxPTAsIGsyPTA7CisKKyAgaWYoICFtIHx8IG0gPj0gbiApCisgICAgcmV0dXJuOworCisgIC8qIE5lZWQgdG8gaGFuZGxlIHRoaXMgc2ltcGxlIGNhc2Ugc2VwYXJhdGVseS4gKi8KKyAgaWYoIG0gPT0gMSApCisgICAgeyAKKyAgICAgIGZvciAoaT0wOyBpIDwgbjsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgIGlmICggYXJyYXlbaV0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBhcnJheVtpKytdID0gMDsKKyAgICAgICAgICAgICAgaWYoIGkgPj0gbiApCisgICAgICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICAgIGFycmF5W2ldID0gMTsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBCVUcoKTsKKyAgICB9CisKKworICBmb3IgKGo9MTsgaiA8IG47IGorKyApCisgICAgeworICAgICAgaWYgKCBhcnJheVtuLTFdID09IGFycmF5W24tai0xXSkKKyAgICAgICAgY29udGludWU7CisgICAgICBqMSA9IGo7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgaWYgKCAobSAmIDEpICkKKyAgICB7CisgICAgICAvKiBNIGlzIG9kZC4gKi8KKyAgICAgIGlmKCBhcnJheVtuLTFdICkKKyAgICAgICAgeworICAgICAgICAgIGlmKCBqMSAmIDEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBrMSA9IG4gLSBqMTsKKyAgICAgICAgICAgICAgazIgPSBrMSsyOworICAgICAgICAgICAgICBpZiggazIgPiBuICkKKyAgICAgICAgICAgICAgICBrMiA9IG47CisgICAgICAgICAgICAgIGdvdG8gbGVhdmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgZ290byBzY2FuOworICAgICAgICB9CisgICAgICBrMiA9IG4gLSBqMSAtIDE7CisgICAgICBpZiggazIgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICBrMSA9IGk7CisgICAgICAgICAgazIgPSBuIC0gajE7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYoIGFycmF5W2syXSAmJiBhcnJheVtrMi0xXSApCisgICAgICAgIGsxID0gbjsKKyAgICAgIGVsc2UKKyAgICAgICAgazEgPSBrMiArIDE7CisgICAgfQorICBlbHNlIAorICAgIHsKKyAgICAgIC8qIE0gaXMgZXZlbi4gKi8KKyAgICAgIGlmKCAhYXJyYXlbbi0xXSApCisgICAgICAgIHsKKyAgICAgICAgICBrMSA9IG4gLSBqMTsKKyAgICAgICAgICBrMiA9IGsxICsgMTsKKyAgICAgICAgICBnb3RvIGxlYXZlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgaWYoICEoajEgJiAxKSApCisgICAgICAgIHsKKyAgICAgICAgICBrMSA9IG4gLSBqMTsKKyAgICAgICAgICBrMiA9IGsxKzI7CisgICAgICAgICAgaWYoIGsyID4gbiApCisgICAgICAgICAgICBrMiA9IG47CisgICAgICAgICAgZ290byBsZWF2ZTsKKyAgICAgICAgfQorICAgIHNjYW46CisgICAgICBqcCA9IG4gLSBqMSAtIDE7CisgICAgICBmb3IgKGk9MTsgaSA8PSBqcDsgaSsrICkgCisgICAgICAgIHsKKyAgICAgICAgICBpMSA9IGpwICsgMiAtIGk7CisgICAgICAgICAgaWYoIGFycmF5W2kxLTFdICApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmKCBhcnJheVtpMS0yXSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgazEgPSBpMSAtIDE7CisgICAgICAgICAgICAgICAgICBrMiA9IG4gLSBqMTsKKwkJfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgazEgPSBpMSAtIDE7CisgICAgICAgICAgICAgICAgICBrMiA9IG4gKyAxIC0gajE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBnb3RvIGxlYXZlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBrMSA9IDE7CisgICAgICBrMiA9IG4gKyAxIC0gbTsKKyAgICB9CisgbGVhdmU6CisgIC8qIE5vdyBjb21wbGVtZW50IHRoZSB0d28gc2VsZWN0ZWQgYml0cy4gKi8KKyAgYXJyYXlbazEtMV0gPSAhYXJyYXlbazEtMV07CisgIGFycmF5W2syLTFdID0gIWFycmF5W2syLTFdOworfQorCisKKy8qIEdlbmVyYXRlIGEgbmV3IHByaW1lIG51bWJlciBvZiBQUklNRV9CSVRTIGJpdHMgYW5kIHN0b3JlIGl0IGluCisgICBQUklNRS4gIElmIEZBQ1RPUl9CSVRTIGlzIG5vbi16ZXJvLCBvbmUgb2YgdGhlIHByaW1lIGZhY3RvcnMgb2YKKyAgIChwcmltZSAtIDEpIC8gMiBtdXN0IGJlIEZBQ1RPUl9CSVRTIGJpdHMgbG9uZy4gIElmIEZBQ1RPUlMgaXMKKyAgIG5vbi16ZXJvLCBhbGxvY2F0ZSBhIG5ldywgTlVMTC10ZXJtaW5hdGVkIGFycmF5IGhvbGRpbmcgdGhlIHByaW1lCisgICBmYWN0b3JzIGFuZCBzdG9yZSBpdCBpbiBGQUNUT1JTLiAgRkxBR1MgbWlnaHQgYmUgdXNlZCB0byBpbmZsdWVuY2UKKyAgIHRoZSBwcmltZSBudW1iZXIgZ2VuZXJhdGlvbiBwcm9jZXNzLiAgKi8KK2djcnlfZXJyb3JfdAorZ2NyeV9wcmltZV9nZW5lcmF0ZSAoZ2NyeV9tcGlfdCAqcHJpbWUsIHVuc2lnbmVkIGludCBwcmltZV9iaXRzLAorCQkgICAgIHVuc2lnbmVkIGludCBmYWN0b3JfYml0cywgZ2NyeV9tcGlfdCAqKmZhY3RvcnMsCisJCSAgICAgZ2NyeV9wcmltZV9jaGVja19mdW5jX3QgY2JfZnVuYywgdm9pZCAqY2JfYXJnLAorCQkgICAgIGdjcnlfcmFuZG9tX2xldmVsX3QgcmFuZG9tX2xldmVsLAorCQkgICAgIHVuc2lnbmVkIGludCBmbGFncykKK3sKKyAgZ2NyeV9lcnJfY29kZV90IGVyciA9IEdQR19FUlJfTk9fRVJST1I7CisgIGdjcnlfbXBpX3QgKmZhY3RvcnNfZ2VuZXJhdGVkID0gTlVMTDsKKyAgZ2NyeV9tcGlfdCBwcmltZV9nZW5lcmF0ZWQgPSBOVUxMOworICB1bnNpZ25lZCBpbnQgbW9kZSA9IDA7CisKKyAgaWYgKCFwcmltZSkKKyAgICByZXR1cm4gZ3BnX2Vycm9yIChHUEdfRVJSX0lOVl9BUkcpOworICAqcHJpbWUgPSBOVUxMOyAKKworICBpZiAoZmxhZ3MgJiBHQ1JZX1BSSU1FX0ZMQUdfU1BFQ0lBTF9GQUNUT1IpCisgICAgbW9kZSA9IDE7CisKKyAgLyogR2VuZXJhdGUuICAqLworICBlcnIgPSBwcmltZV9nZW5lcmF0ZV9pbnRlcm5hbCAoKG1vZGU9PTEpLCAmcHJpbWVfZ2VuZXJhdGVkLCBwcmltZV9iaXRzLAorCQkJCSBmYWN0b3JfYml0cywgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnM/ICZmYWN0b3JzX2dlbmVyYXRlZCA6IE5VTEwsCisJCQkJIHJhbmRvbV9sZXZlbCwgZmxhZ3MsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYl9mdW5jLCBjYl9hcmcpOworCisgIGlmICghIGVycikKKyAgICBpZiAoY2JfZnVuYykKKyAgICAgIHsKKwkvKiBBZGRpdGlvbmFsIGNoZWNrLiAqLworCWlmICggIWNiX2Z1bmMgKGNiX2FyZywgR0NSWV9QUklNRV9DSEVDS19BVF9GSU5JU0gsIHByaW1lX2dlbmVyYXRlZCkpCisJICB7CisJICAgIC8qIEZhaWxlZCwgZGVhbGxvY2F0ZSByZXNvdXJjZXMuICAqLworCSAgICB1bnNpZ25lZCBpbnQgaTsKKworCSAgICBtcGlfZnJlZSAocHJpbWVfZ2VuZXJhdGVkKTsKKyAgICAgICAgICAgIGlmIChmYWN0b3JzKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgZmFjdG9yc19nZW5lcmF0ZWRbaV07IGkrKykKKyAgICAgICAgICAgICAgICAgIG1waV9mcmVlIChmYWN0b3JzX2dlbmVyYXRlZFtpXSk7CisgICAgICAgICAgICAgICAgZ2NyeV9mcmVlIChmYWN0b3JzX2dlbmVyYXRlZCk7CisgICAgICAgICAgICAgIH0KKwkgICAgZXJyID0gR1BHX0VSUl9HRU5FUkFMOyAKKwkgIH0KKyAgICAgIH0KKworICBpZiAoISBlcnIpCisgICAgeworICAgICAgaWYgKGZhY3RvcnMpCisgICAgICAgICpmYWN0b3JzID0gZmFjdG9yc19nZW5lcmF0ZWQ7CisgICAgICAqcHJpbWUgPSBwcmltZV9nZW5lcmF0ZWQ7CisgICAgfQorCisgIHJldHVybiBnY3J5X2Vycm9yIChlcnIpOworfQorCisvKiBDaGVjayB3ZXRoZXIgdGhlIG51bWJlciBYIGlzIHByaW1lLiAgKi8KK2djcnlfZXJyb3JfdAorZ2NyeV9wcmltZV9jaGVjayAoZ2NyeV9tcGlfdCB4LCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisgIGdjcnlfZXJyX2NvZGVfdCBlcnIgPSBHUEdfRVJSX05PX0VSUk9SOworICBnY3J5X21waV90IHZhbF8yID0gbXBpX2FsbG9jX3NldF91aSAoMik7IC8qIFVzZWQgYnkgdGhlIEZlcm1hdCB0ZXN0LiAqLworCisgICh2b2lkKWZsYWdzOworCisgIC8qIFdlIHVzZSA2NCByb3VuZHMgYmVjYXVzZSB0aGUgcHJpbWUgd2UgYXJlIGdvaW5nIHRvIHRlc3QgaXMgbm90CisgICAgIGd1YXJhbnRlZWQgdG8gYmUgYSByYW5kb20gb25lLiAqLworICBpZiAoISBjaGVja19wcmltZSAoeCwgdmFsXzIsIDY0LCBOVUxMLCBOVUxMKSkKKyAgICBlcnIgPSBHUEdfRVJSX05PX1BSSU1FOworCisgIG1waV9mcmVlICh2YWxfMik7CisKKyAgcmV0dXJuIGdjcnlfZXJyb3IgKGVycik7Cit9CisKKy8qIEZpbmQgYSBnZW5lcmF0b3IgZm9yIFBSSU1FIHdoZXJlIHRoZSBmYWN0b3JpemF0aW9uIG9mIChwcmltZS0xKSBpcworICAgaW4gdGhlIE5VTEwgdGVybWluYXRlZCBhcnJheSBGQUNUT1JTLiBSZXR1cm4gdGhlIGdlbmVyYXRvciBhcyBhCisgICBuZXdseSBhbGxvY2F0ZWQgTVBJIGluIFJfRy4gIElmIFNUQVJUX0cgaXMgbm90IE5VTEwsIHVzZSB0aGlzIGFzIHMKKyAgIGF0YXJ0IGZvciB0aGUgc2VhcmNoLiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4qLworZ2NyeV9lcnJvcl90CitnY3J5X3ByaW1lX2dyb3VwX2dlbmVyYXRvciAoZ2NyeV9tcGlfdCAqcl9nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfbXBpX3QgcHJpbWUsIGdjcnlfbXBpX3QgKmZhY3RvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NyeV9tcGlfdCBzdGFydF9nKQoreworICBnY3J5X21waV90IHRtcCA9IGdjcnlfbXBpX25ldyAoMCk7CisgIGdjcnlfbXBpX3QgYiA9IGdjcnlfbXBpX25ldyAoMCk7CisgIGdjcnlfbXBpX3QgcG1pbjEgPSBnY3J5X21waV9uZXcgKDApOworICBnY3J5X21waV90IGcgPSBzdGFydF9nPyBnY3J5X21waV9jb3B5IChzdGFydF9nKSA6IGdjcnlfbXBpX3NldF91aSAoTlVMTCwgMyk7CisgIGludCBmaXJzdCA9IDE7CisgIGludCBpLCBuOworCisgIGlmICghZmFjdG9ycyB8fCAhcl9nIHx8ICFwcmltZSkKKyAgICByZXR1cm4gZ3BnX2Vycm9yIChHUEdfRVJSX0lOVl9BUkcpOworICAqcl9nID0gTlVMTDsgCisKKyAgZm9yIChuPTA7IGZhY3RvcnNbbl07IG4rKykKKyAgICA7CisgIGlmIChuIDwgMikKKyAgICByZXR1cm4gZ3BnX2Vycm9yIChHUEdfRVJSX0lOVl9BUkcpOworCisgIC8qIEV4dHJhIHNhbml0eSBjaGVjayAtIHVzdWFsbHkgZGlzYWJsZWQuICovICAKKy8qICAgbXBpX3NldCAodG1wLCBmYWN0b3JzWzBdKTsgKi8KKy8qICAgZm9yKGkgPSAxOyBpIDwgbjsgaSsrKSAqLworLyogICAgIG1waV9tdWwgKHRtcCwgdG1wLCBmYWN0b3JzW2ldKTsgKi8KKy8qICAgbXBpX2FkZF91aSAodG1wLCB0bXAsIDEpOyAqLworLyogICBpZiAobXBpX2NtcCAocHJpbWUsIHRtcCkpICovCisvKiAgICAgcmV0dXJuIGdwZ19lcnJvciAoR1BHX0VSUl9JTlZfQVJHKTsgKi8KKyAgCisgIGdjcnlfbXBpX3N1Yl91aSAocG1pbjEsIHByaW1lLCAxKTsgICAgICAKKyAgZG8gICAgICAgICAKKyAgICB7CisgICAgICBpZiAoZmlyc3QpCisgICAgICAgIGZpcnN0ID0gMDsKKyAgICAgIGVsc2UKKyAgICAgICAgZ2NyeV9tcGlfYWRkX3VpIChnLCBnLCAxKTsKKyAgICAgIAorICAgICAgaWYgKERCR19DSVBIRVIpCisgICAgICAgIHsKKyAgICAgICAgICBsb2dfZGVidWcgKCJjaGVja2luZyBnOiIpOworICAgICAgICAgIGdjcnlfbXBpX2R1bXAgKGcpOworICAgICAgICAgIGxvZ19kZWJ1ZyAoIlxuIik7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcHJvZ3Jlc3MoJ14nKTsKKyAgICAgIAorICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgeworICAgICAgICAgIG1waV9mZGl2X3EgKHRtcCwgcG1pbjEsIGZhY3RvcnNbaV0pOworICAgICAgICAgIGdjcnlfbXBpX3Bvd20gKGIsIGcsIHRtcCwgcHJpbWUpOworICAgICAgICAgIGlmICghIG1waV9jbXBfdWkgKGIsIDEpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGlmIChEQkdfQ0lQSEVSKQorICAgICAgICBwcm9ncmVzcygnXG4nKTsKKyAgICB9CisgIHdoaWxlIChpIDwgbik7CisgIAorICBnY3J5X21waV9yZWxlYXNlICh0bXApOworICBnY3J5X21waV9yZWxlYXNlIChiKTsgCisgIGdjcnlfbXBpX3JlbGVhc2UgKHBtaW4xKTsgCisgICpyX2cgPSBnOyAKKworICByZXR1cm4gMDsgCit9CisKKy8qIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIHJlbGVhc2UgdGhlIGZhY3RvcnMgYXJyYXkuICovCit2b2lkCitnY3J5X3ByaW1lX3JlbGVhc2VfZmFjdG9ycyAoZ2NyeV9tcGlfdCAqZmFjdG9ycykKK3sKKyAgaWYgKGZhY3RvcnMpCisgICAgeworICAgICAgaW50IGk7CisgICAgICAKKyAgICAgIGZvciAoaT0wOyBmYWN0b3JzW2ldOyBpKyspCisgICAgICAgIG1waV9mcmVlIChmYWN0b3JzW2ldKTsKKyAgICAgIGdjcnlfZnJlZSAoZmFjdG9ycyk7CisgICAgfQorfQorCisKKwwKKy8qIEhlbHBlciBmb3IgX2djcnlfZGVyaXZlX3g5MzFfcHJpbWUuICAqLworc3RhdGljIGdjcnlfbXBpX3QKK2ZpbmRfeDkzMV9wcmltZSAoY29uc3QgZ2NyeV9tcGlfdCBwZmlyc3QpCit7CisgIGdjcnlfbXBpX3QgdmFsXzIgPSBtcGlfYWxsb2Nfc2V0X3VpICgyKTsgCisgIGdjcnlfbXBpX3QgcHJpbWU7CisgIAorICBwcmltZSA9IGdjcnlfbXBpX2NvcHkgKHBmaXJzdCk7CisgIC8qIElmIFAgaXMgZXZlbiBhZGQgMS4gICovIAorICBtcGlfc2V0X2JpdCAocHJpbWUsIDApOworCisgIC8qIFdlIHVzZSA2NCBSYWJpbi1NaWxsZXIgcm91bmRzIHdoaWNoIGlzIGJldHRlciBhbmQgdGh1cworICAgICBzdWZmaWNpZW50LiAgV2UgZG8gbm90IGhhdmUgYSBMdWNhcyB0ZXN0IGltcGxlbWVudGFpb24gdGh1cyB3ZQorICAgICBjYW4ndCBkbyBpdCBpbiB0aGUgWDkuMzEgcHJlZmVycmVkIHdheSBvZiBydW5uaW5nIGEgZmV3CisgICAgIFJhYmluLU1pbGxlciBmb2xsb3dlZCBieSBvbmUgTHVjYXMgdGVzdC4gICovCisgIHdoaWxlICggIWNoZWNrX3ByaW1lIChwcmltZSwgdmFsXzIsIDY0LCBOVUxMLCBOVUxMKSApCisgICAgbXBpX2FkZF91aSAocHJpbWUsIHByaW1lLCAyKTsKKworICBtcGlfZnJlZSAodmFsXzIpOworCisgIHJldHVybiBwcmltZTsKK30KKworCisvKiBHZW5lcmF0ZSBhIHByaW1lIHVzaW5nIHRoZSBhbGdvcml0aG0gZnJvbSBYOS4zMSBhcHBlbmRpeCBCLjQuIAorCisgICBUaGlzIGZ1bmN0aW9uIHJlcXVpcmVzIHRoYXQgdGhlIHByb3ZpZGVkIHB1YmxpYyBleHBvbmVudCBFIGlzIG9kZC4KKyAgIFhQLCBYUDEgYW5kIFhQMiBhcmUgdGhlIHNlZWQgdmFsdWVzLiAgQWxsIHZhbHVlcyBhcmUgbWFuZGF0b3J5LgorCisgICBPbiBzdWNjZXNzIHRoZSBwcmltZSBpcyByZXR1cm5lZC4gIElmIFJfUDEgb3IgUl9QMiBhcmUgZ2l2ZW4gdGhlCisgICBpbnRlcm5hbCB2YWx1ZXMgUDEgYW5kIFAyIGFyZSBzYXZlZCBhdCB0aGVzZSBhZGRyZXNzZXMuICBPbiBlcnJvcgorICAgTlVMTCBpcyByZXR1cm5lZC4gICovCitnY3J5X21waV90CitfZ2NyeV9kZXJpdmVfeDkzMV9wcmltZSAoY29uc3QgZ2NyeV9tcGlfdCB4cCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NyeV9tcGlfdCB4cDEsIGNvbnN0IGdjcnlfbXBpX3QgeHAyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjcnlfbXBpX3QgZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X21waV90ICpyX3AxLCBnY3J5X21waV90ICpyX3AyKQoreworICBnY3J5X21waV90IHAxLCBwMiwgcDFwMiwgeXAwOworCisgIGlmICgheHAgfHwgIXhwMSB8fCAheHAyKQorICAgIHJldHVybiBOVUxMOworICBpZiAoIWUgfHwgIW1waV90ZXN0X2JpdCAoZSwgMCkpCisgICAgcmV0dXJuIE5VTEw7ICAvKiBXZSBzdXBwb3J0IG9ubHkgb2RkIHZhbHVlcyBmb3IgRS4gICovCisKKyAgcDEgPSBmaW5kX3g5MzFfcHJpbWUgKHhwMSk7CisgIHAyID0gZmluZF94OTMxX3ByaW1lICh4cDIpOworICBwMXAyID0gbXBpX2FsbG9jX2xpa2UgKHhwKTsKKyAgbXBpX211bCAocDFwMiwgcDEsIHAyKTsKKworICB7CisgICAgZ2NyeV9tcGlfdCByMSwgdG1wOworICAKKyAgICAvKiByMSA9IChwMl57LTF9IG1vZCBwMSlwMiAtIChwMV57LTF9IG1vZCBwMikgKi8KKyAgICB0bXAgPSBtcGlfYWxsb2NfbGlrZSAocDEpOworICAgIG1waV9pbnZtICh0bXAsIHAyLCBwMSk7CisgICAgbXBpX211bCAodG1wLCB0bXAsIHAyKTsKKyAgICByMSA9IHRtcDsKKyAgICAKKyAgICB0bXAgPSBtcGlfYWxsb2NfbGlrZSAocDIpOworICAgIG1waV9pbnZtICh0bXAsIHAxLCBwMik7CisgICAgbXBpX211bCAodG1wLCB0bXAsIHAxKTsKKyAgICBtcGlfc3ViIChyMSwgcjEsIHRtcCk7CisKKyAgICAvKiBGaXh1cCBhIG5lZ2F0aXZlIHZhbHVlLiAgKi8KKyAgICBpZiAobXBpX2lzX25lZyAocjEpKSAKKyAgICAgIG1waV9hZGQgKHIxLCByMSwgcDFwMik7CisKKyAgICAvKiB5cDAgPSB4cCArIChyMSAtIHhwIG1vZCBwMSpwMikgICovCisgICAgeXAwID0gdG1wOyB0bXAgPSBOVUxMOworICAgIG1waV9zdWJtICh5cDAsIHIxLCB4cCwgcDFwMik7CisgICAgbXBpX2FkZCAoeXAwLCB5cDAsIHhwKTsKKyAgICBtcGlfZnJlZSAocjEpOworCisgICAgLyogRml4dXAgYSBuZWdhdGl2ZSB2YWx1ZS4gICovCisgICAgaWYgKG1waV9jbXAgKHlwMCwgeHApIDwgMCApIAorICAgICAgbXBpX2FkZCAoeXAwLCB5cDAsIHAxcDIpOworICB9CisKKyAgLyogeXAwIGlzIG5vdyB0aGUgZmlyc3QgaW50ZWdlciBncmVhdGVyIHRoYW4geHAgd2l0aCBwMSBiZWluZyBhCisgICAgIGxhcmdlIHByaW1lIGZhY3RvciBvZiB5cDAtMSBhbmQgcDIgYSBsYXJnZSBwcmltZSBmYWN0b3Igb2YgeXAwKzEuICAqLworCisgIC8qIE5vdGUgdGhhdCB0aGUgZmlyc3QgZXhhbXBsZSBmcm9tIFg5LjMxIChELjEuMSkgd2hpY2ggdXNlcworICAgICAgIChYcTEgIzFBNUNGNzJFRTc3MERFNTBDQjA5QUNDRUE5IykKKyAgICAgICAoWHEyICMxMzRFNENBQTE2RDIzNTBBMjFENzc1QzQwNCMpCisgICAgICAgKFhxICAjQ0MxMDkyNDk1RDg2N0U2NDA2NURFRTNFNzk1NUYyRUJDN0Q0N0EyRAorICAgICAgICAgICAgIDdDOTk1MzM4OEY5N0REREMzRTFDQTE5QzM1Q0E2NTlFREMyRkMzMjUKKyAgICAgICAgICAgICA2RDI5QzI2Mjc0NzlDMDg2QTY5OUE0OUM0QzlDRUU3RUY3QkQxQjM0CisgICAgICAgICAgICAgMzIxREUzNEEjKSkpKQorICAgICByZXR1cm5zIGFuIHlwMCBvZgorICAgICAgICAgICAgI0NDMTA5MjQ5NUQ4NjdFNjQwNjVERUUzRTc5NTVGMkVCQzdENDdBMkQKKyAgICAgICAgICAgICA3Qzk5NTMzODhGOTdERERDM0UxQ0ExOUMzNUNBNjU5RURDMkZDNEUzCisgICAgICAgICAgICAgQkYyMENCODk2RUUzN0UwOThBOTA2MzEzMjcxNDIyMTYyQ0I2QzY0MgorICAgICAgICAgICAgIDc1QzEyMDFGIworICAgICBhbmQgbm90CisgICAgICAgICAgICAjQ0MxMDkyNDk1RDg2N0U2NDA2NURFRTNFNzk1NUYyRUJDN0Q0N0EyRAorICAgICAgICAgICAgIDdDOTk1MzM4OEY5N0REREMzRTFDQTE5QzM1Q0E2NTlFREMyRkMyRTYKKyAgICAgICAgICAgICBDODhGRTI5OUQ1MkQ3OEJFNDA1QTk3RTAxRkQ3MURENzgxOUVDQjkxCisgICAgICAgICAgICAgRkE4NUEwNzYjCisgICAgIGFzIHN0YXRlZCBpbiB0aGUgc3RhbmRhcmQuICBUaGlzIHNlZW1zIHRvIGJlIGEgYnVnIGluIFg5LjMxLgorICAgKi8KKworICB7CisgICAgZ2NyeV9tcGlfdCB2YWxfMiA9IG1waV9hbGxvY19zZXRfdWkgKDIpOyAKKyAgICBnY3J5X21waV90IGdjZHRtcCA9IG1waV9hbGxvY19saWtlICh5cDApOworICAgIGludCBnY2RyZXM7CisgIAorICAgIG1waV9zdWJfdWkgKHAxcDIsIHAxcDIsIDEpOyAvKiBBZGp1c3QgZm9yIGxvb3AgYm9keS4gICovCisgICAgbXBpX3N1Yl91aSAoeXAwLCB5cDAsIDEpOyAgIC8qIERpdHRvLiAgKi8KKyAgICBmb3IgKDs7KQorICAgICAgeworICAgICAgICBnY2RyZXMgPSBnY3J5X21waV9nY2QgKGdjZHRtcCwgZSwgeXAwKTsKKyAgICAgICAgbXBpX2FkZF91aSAoeXAwLCB5cDAsIDEpOworICAgICAgICBpZiAoIWdjZHJlcykKKyAgICAgICAgICBwcm9ncmVzcyAoJy8nKTsgIC8qIGdjZCAoZSwgeXAwLTEpICE9IDEgICovCisgICAgICAgIGVsc2UgaWYgKGNoZWNrX3ByaW1lICh5cDAsIHZhbF8yLCA2NCwgTlVMTCwgTlVMTCkpCisgICAgICAgICAgYnJlYWs7IC8qIEZvdW5kLiAgKi8KKyAgICAgICAgLyogV2UgYWRkIHAxcDItMSBiZWNhdXNlIHlwMCBpcyBpbmNyZW1lbnRlZCBhZnRlciB0aGUgZ2NkIHRlc3QuICAqLworICAgICAgICBtcGlfYWRkICh5cDAsIHlwMCwgcDFwMik7CisgICAgICB9CisgICAgbXBpX2ZyZWUgKGdjZHRtcCk7CisgICAgbXBpX2ZyZWUgKHZhbF8yKTsKKyAgfQorCisgIG1waV9mcmVlIChwMXAyKTsKKworICBwcm9ncmVzcygnXG4nKTsKKyAgaWYgKHJfcDEpCisgICAgKnJfcDEgPSBwMTsKKyAgZWxzZQorICAgIG1waV9mcmVlIChwMSk7CisgIGlmIChyX3AyKQorICAgICpyX3AyID0gcDI7CisgIGVsc2UKKyAgICBtcGlfZnJlZSAocDIpOworICByZXR1cm4geXAwOworfQorCisKKwwKKy8qIEdlbmVyYXRlIHRoZSB0d28gcHJpbWUgdXNlZCBmb3IgRFNBIHVzaW5nIHRoZSBhbGdvcml0aG0gc3BlY2lmaWVkCisgICBpbiBGSVBTIDE4Ni0yLiAgUEJJVFMgaXMgdGhlIGRlc2lyZWQgbGVuZ3RoIG9mIHRoZSBwcmltZSBQIGFuZCBhCisgICBRQklUUyB0aGUgbGVuZ3RoIG9mIHRoZSBwcmltZSBRLiAgSWYgU0VFRCBpcyBub3Qgc3VwcGxpZWQgYW5kCisgICBTRUVETEVOIGlzIDAgdGhlIGZ1bmN0aW9uIGdlbmVyYXRlcyBhbiBhcHByb3ByaWF0ZSBTRUVELiAgT24KKyAgIHN1Y2Nlc3MgdGhlIGdlbmVyYXRlZCBwcmltZXMgYXJlIHN0b3JlZCBhdCBSX1EgYW5kIFJfUCwgdGhlIGNvdW50ZXIKKyAgIHZhbHVlIGlzIHN0b3JlZCBhdCBSX0NPVU5URVIgYW5kIHRoZSBzZWVkIGFjdHVhbGx5IHVzZWQgZm9yCisgICBnZW5lcmF0aW9uIGlzIHN0b3JlZCBhdCBSX1NFRUQgYW5kIFJfU0VFRFZBTFVFLiAgKi8KK2dwZ19lcnJfY29kZV90CitfZ2NyeV9nZW5lcmF0ZV9maXBzMTg2XzJfcHJpbWUgKHVuc2lnbmVkIGludCBwYml0cywgdW5zaWduZWQgaW50IHFiaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpzZWVkLCBzaXplX3Qgc2VlZGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NyeV9tcGlfdCAqcl9xLCBnY3J5X21waV90ICpyX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqcl9jb3VudGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqcl9zZWVkLCBzaXplX3QgKnJfc2VlZGxlbikKK3sKKyAgZ3BnX2Vycl9jb2RlX3QgZWM7CisgIHVuc2lnbmVkIGNoYXIgc2VlZF9oZWxwX2J1ZmZlclsxNjAvOF07ICAvKiBVc2VkIHRvIGhvbGQgYSBnZW5lcmF0ZWQgU0VFRC4gKi8KKyAgdW5zaWduZWQgY2hhciAqc2VlZF9wbHVzOyAgICAgLyogTWFsbG9jZWQgYnVmZmVyIHRvIGhvbGQgU0VFRCt4LiAgKi8KKyAgdW5zaWduZWQgY2hhciBkaWdlc3RbMTYwLzhdOyAgLyogSGVscGVyIGJ1ZmZlciBmb3IgU0hBLTEgZGlnZXN0LiAgKi8KKyAgZ2NyeV9tcGlfdCB2YWxfMiA9IE5VTEw7ICAgICAgLyogSGVscGVyIGZvciB0aGUgcHJpbWUgdGVzdC4gICovCisgIGdjcnlfbXBpX3QgdG1wdmFsID0gTlVMTDsgICAgIC8qIEhlbHBlciB2YXJpYWJsZS4gICovCisgIGludCBpOworCisgIHVuc2lnbmVkIGNoYXIgdmFsdWVfdVsxNjAvOF07CisgIGludCB2YWx1ZV9uLCB2YWx1ZV9iLCB2YWx1ZV9rOworICBpbnQgY291bnRlcjsKKyAgZ2NyeV9tcGlfdCB2YWx1ZV93ID0gTlVMTDsKKyAgZ2NyeV9tcGlfdCB2YWx1ZV94ID0gTlVMTDsKKyAgZ2NyeV9tcGlfdCBwcmltZV9xID0gTlVMTDsKKyAgZ2NyeV9tcGlfdCBwcmltZV9wID0gTlVMTDsKKworICAvKiBGSVBTIDE4Ni0yIGFsbG93cyBvbmx5IGZvciAxMDI0LzE2MCBiaXQuICAqLworICBpZiAocGJpdHMgIT0gMTAyNCB8fCBxYml0cyAhPSAxNjApCisgICAgcmV0dXJuIEdQR19FUlJfSU5WX0tFWUxFTjsKKworICBpZiAoIXNlZWQgJiYgIXNlZWRsZW4pCisgICAgOyAvKiBObyBzZWVkIHZhbHVlIGdpdmVuOiAgV2UgYXJlIGFza2VkIHRvIGdlbmVyYXRlIGl0LiAgKi8KKyAgZWxzZSBpZiAoIXNlZWQgfHwgc2VlZGxlbiA8IHFiaXRzLzgpCisgICAgcmV0dXJuIEdQR19FUlJfSU5WX0FSRzsKKyAgCisgIC8qIEFsbG9jYXRlIGEgYnVmZmVyIHRvIGxhdGVyIGNvbXB1dGUgU0VFRCtzb21lX2luY3JlbWVudC4gKi8KKyAgc2VlZF9wbHVzID0gZ2NyeV9tYWxsb2MgKHNlZWRsZW4gPCAyMD8gMjA6c2VlZGxlbik7CisgIGlmICghc2VlZF9wbHVzKQorICAgIHsKKyAgICAgIGVjID0gZ3BnX2Vycl9jb2RlX2Zyb21fc3lzZXJyb3IgKCk7CisgICAgICBnb3RvIGxlYXZlOworICAgIH0KKworICB2YWxfMiAgID0gbXBpX2FsbG9jX3NldF91aSAoMik7CisgIHZhbHVlX24gPSAocGJpdHMgLSAxKSAvIHFiaXRzOworICB2YWx1ZV9iID0gKHBiaXRzIC0gMSkgLSB2YWx1ZV9uICogcWJpdHM7CisgIHZhbHVlX3cgPSBnY3J5X21waV9uZXcgKHBiaXRzKTsKKyAgdmFsdWVfeCA9IGdjcnlfbXBpX25ldyAocGJpdHMpOworCisgcmVzdGFydDogIAorICAvKiBHZW5lcmF0ZSBRLiAgKi8KKyAgZm9yICg7OykKKyAgICB7CisgICAgICAvKiBTdGVwIDE6IEdlbmVyYXRlIGEgKG5ldykgc2VlZCB1bmxlc3Mgb25lIGhhcyBiZWVuIHN1cHBsaWVkLiAgKi8KKyAgICAgIGlmICghc2VlZCkKKyAgICAgICAgeworICAgICAgICAgIHNlZWRsZW4gPSBzaXplb2Ygc2VlZF9oZWxwX2J1ZmZlcjsKKyAgICAgICAgICBnY3J5X2NyZWF0ZV9ub25jZSAoc2VlZF9oZWxwX2J1ZmZlciwgc2VlZGxlbik7CisgICAgICAgICAgc2VlZCA9IHNlZWRfaGVscF9idWZmZXI7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgLyogU3RlcCAyOiBVID0gc2hhMShzZWVkKSBeIHNoYTEoKHNlZWQrMSkgbW9kIDJee3FiaXRzfSkgICovCisgICAgICBtZW1jcHkgKHNlZWRfcGx1cywgc2VlZCwgc2VlZGxlbik7CisgICAgICBmb3IgKGk9c2VlZGxlbi0xOyBpID49IDA7IGktLSkKKyAgICAgICAgeworICAgICAgICAgIHNlZWRfcGx1c1tpXSsrOworICAgICAgICAgIGlmIChzZWVkX3BsdXNbaV0pCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgZ2NyeV9tZF9oYXNoX2J1ZmZlciAoR0NSWV9NRF9TSEExLCB2YWx1ZV91LCBzZWVkLCBzZWVkbGVuKTsKKyAgICAgIGdjcnlfbWRfaGFzaF9idWZmZXIgKEdDUllfTURfU0hBMSwgZGlnZXN0LCBzZWVkX3BsdXMsIHNlZWRsZW4pOworICAgICAgZm9yIChpPTA7IGkgPCBzaXplb2YgdmFsdWVfdTsgaSsrKQorICAgICAgICB2YWx1ZV91W2ldIF49IGRpZ2VzdFtpXTsKKyAgCisgICAgICAvKiBTdGVwIDM6ICBGb3JtIHEgZnJvbSBVICAqLworICAgICAgZ2NyeV9tcGlfcmVsZWFzZSAocHJpbWVfcSk7IHByaW1lX3EgPSBOVUxMOworICAgICAgZWMgPSBncGdfZXJyX2NvZGUgKGdjcnlfbXBpX3NjYW4gKCZwcmltZV9xLCBHQ1JZTVBJX0ZNVF9VU0csIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3UsIHNpemVvZiB2YWx1ZV91LCBOVUxMKSk7CisgICAgICBpZiAoZWMpCisgICAgICAgIGdvdG8gbGVhdmU7CisgICAgICBtcGlfc2V0X2hpZ2hiaXQgKHByaW1lX3EsIHFiaXRzLTEgKTsKKyAgICAgIG1waV9zZXRfYml0IChwcmltZV9xLCAwKTsKKyAgICAgIAorICAgICAgLyogU3RlcCA0OiAgVGVzdCB3aGV0aGVyIFEgaXMgcHJpbWUgdXNpbmcgNjQgcm91bmQgb2YgUmFiaW4tTWlsbGVyLiAgKi8KKyAgICAgIGlmIChjaGVja19wcmltZSAocHJpbWVfcSwgdmFsXzIsIDY0LCBOVUxMLCBOVUxMKSkKKyAgICAgICAgYnJlYWs7IC8qIFllcywgUSBpcyBwcmltZS4gICovCisKKyAgICAgIC8qIFN0ZXAgNS4gICovCisgICAgICBzZWVkID0gTlVMTDsgIC8qIEZvcmNlIGEgbmV3IHNlZWQgYXQgU3RlcCAxLiAgKi8KKyAgICB9CisgIAorICAvKiBTdGVwIDYuICBOb3RlIHRoYXQgd2UgZG8gbm8gdXNlIGFuIGV4cGxpY2l0IG9mZnNldCBidXQgaW5jcmVtZW50CisgICAgIFNFRURfUExVUyBhY2NvcmRpbmdseS4gIFNFRURfUExVUyBpcyBjdXJyZW50bHkgU0VFRCsxLiAgKi8KKyAgY291bnRlciA9IDA7CisKKyAgLyogR2VuZXJhdGUgUC4gKi8KKyAgcHJpbWVfcCA9IGdjcnlfbXBpX25ldyAocGJpdHMpOworICBmb3IgKDs7KQorICAgIHsKKyAgICAgIC8qIFN0ZXAgNzogRm9yIGsgPSAwLC4uLm4gbGV0IAorICAgICAgICAgICAgICAgICAgIFZfayA9IHNoYTEoc2VlZCtvZmZzZXQraykgbW9kIDJee3FiaXRzfSAgCisgICAgICAgICBTdGVwIDg6IFcgPSBWXzAgKyBWXzEqMl4xNjAgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAuLi4gCisgICAgICAgICAgICAgICAgICAgICAgICAgKyBWX3tuLTF9KjJeeyhuLTEpKjE2MH0KKyAgICAgICAgICAgICAgICAgICAgICAgICArIChWX3tufSBtb2QgMl5iKSoyXntuKjE2MH0gICAgICAgICAgICAgICAgCisgICAgICAgKi8KKyAgICAgIG1waV9zZXRfdWkgKHZhbHVlX3csIDApOworICAgICAgZm9yICh2YWx1ZV9rPTA7IHZhbHVlX2sgPD0gdmFsdWVfbjsgdmFsdWVfaysrKQorICAgICAgICB7CisgICAgICAgICAgLyogVGhlcmUgaXMgbm8gbmVlZCB0byBoYXZlIGFuIGV4cGxpY2l0IG9mZnNldCB2YXJpYWJsZTogIEluCisgICAgICAgICAgICAgdGhlIGZpcnN0IHJvdW5kIHdlIHNoYWxsIGhhdmUgYW4gb2Zmc2V0IG9mIDIsIHRoaXMgaXMKKyAgICAgICAgICAgICBhY2hpZXZlZCBieSB1c2luZyBTRUVEX1BMVVMgd2hpY2ggaXMgYWxyZWFkeSBhdCBTRUVEKzEsCisgICAgICAgICAgICAgdGh1cyB3ZSBqdXN0IG5lZWQgdG8gaW5jcmVtZW50IGl0IG9uY2UgYWdhaW4uICBUaGUKKyAgICAgICAgICAgICByZXF1aXJlbWVudCBmb3IgdGhlIG5leHQgcm91bmQgaXMgdG8gdXBkYXRlIG9mZnNldCBieSBOLAorICAgICAgICAgICAgIHdoaWNoIHdlIGltcGxpY3RseSBkaWQgYXQgdGhlIGVuZCBvZiB0aGlzIGxvb3AsIGFuZCB0aGVuCisgICAgICAgICAgICAgdG8gYWRkIG9uZTsgdGhpcyBvbmUgaXMgdGhlIHNhbWUgYXMgaW4gdGhlIGZpcnN0IHJvdW5kLiAgKi8KKyAgICAgICAgICBmb3IgKGk9c2VlZGxlbi0xOyBpID49IDA7IGktLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgc2VlZF9wbHVzW2ldKys7CisgICAgICAgICAgICAgIGlmIChzZWVkX3BsdXNbaV0pCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgZ2NyeV9tZF9oYXNoX2J1ZmZlciAoR0NSWV9NRF9TSEExLCBkaWdlc3QsIHNlZWRfcGx1cywgc2VlZGxlbik7CisgICAgICAgICAgCisgICAgICAgICAgZ2NyeV9tcGlfcmVsZWFzZSAodG1wdmFsKTsgdG1wdmFsID0gTlVMTDsKKyAgICAgICAgICBlYyA9IGdwZ19lcnJfY29kZSAoZ2NyeV9tcGlfc2NhbiAoJnRtcHZhbCwgR0NSWU1QSV9GTVRfVVNHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdlc3QsIHNpemVvZiBkaWdlc3QsIE5VTEwpKTsKKyAgICAgICAgICBpZiAoZWMpCisgICAgICAgICAgICBnb3RvIGxlYXZlOworICAgICAgICAgIGlmICh2YWx1ZV9rID09IHZhbHVlX24pCisgICAgICAgICAgICBtcGlfY2xlYXJfaGlnaGJpdCAodG1wdmFsLCB2YWx1ZV9iKTsgLyogKFZfbiBtb2QgMl5iKSAqLworICAgICAgICAgIG1waV9sc2hpZnQgKHRtcHZhbCwgdG1wdmFsLCB2YWx1ZV9rKnFiaXRzKTsKKyAgICAgICAgICBtcGlfYWRkICh2YWx1ZV93LCB2YWx1ZV93LCB0bXB2YWwpOworICAgICAgICB9CisKKyAgICAgIC8qIFN0ZXAgOCBjb250aW51ZWQ6IFggPSBXICsgMl57TC0xfSAgKi8KKyAgICAgIG1waV9zZXRfdWkgKHZhbHVlX3gsIDApOworICAgICAgbXBpX3NldF9oaWdoYml0ICh2YWx1ZV94LCBwYml0cy0xKTsKKyAgICAgIG1waV9hZGQgKHZhbHVlX3gsIHZhbHVlX3gsIHZhbHVlX3cpOworCisgICAgICAvKiBTdGVwIDk6ICBjID0gWCBtb2QgMnEsICBwID0gWCAtIChjIC0gMSkgICovCisgICAgICBtcGlfbXVsXzJleHAgKHRtcHZhbCwgcHJpbWVfcSwgMSk7CisgICAgICBtcGlfbW9kICh0bXB2YWwsIHZhbHVlX3gsIHRtcHZhbCk7CisgICAgICBtcGlfc3ViX3VpICh0bXB2YWwsIHRtcHZhbCwgMSk7CisgICAgICBtcGlfc3ViIChwcmltZV9wLCB2YWx1ZV94LCB0bXB2YWwpOworCisgICAgICAvKiBTdGVwIDEwOiBJZiAgcCA8IDJee0wtMX0gIHNraXAgdGhlIHByaW1hbGl0eSB0ZXN0LiAgKi8KKyAgICAgIC8qIFN0ZXAgMTEgYW5kIDEyOiBQcmltYWxpdHkgdGVzdC4gICovCisgICAgICBpZiAobXBpX2dldF9uYml0cyAocHJpbWVfcCkgPj0gcGJpdHMtMQorICAgICAgICAgICYmIGNoZWNrX3ByaW1lIChwcmltZV9wLCB2YWxfMiwgNjQsIE5VTEwsIE5VTEwpICkKKyAgICAgICAgYnJlYWs7IC8qIFllcywgUCBpcyBwcmltZSwgY29udGludWUgd2l0aCBTdGVwIDE1LiAgKi8KKworICAgICAgLyogU3RlcCAxMzogY291bnRlciA9IGNvdW50ZXIgKyAxLCBvZmZzZXQgPSBvZmZzZXQgKyBuICsgMS4gKi8KKyAgICAgIGNvdW50ZXIrKzsKKworICAgICAgLyogU3RlcCAxNDogSWYgY291bnRlciA+PSAyXjEyICBnb3RvIFN0ZXAgMS4gICovCisgICAgICBpZiAoY291bnRlciA+PSA0MDk2KQorICAgICAgICBnb3RvIHJlc3RhcnQ7CisgICAgfQorCisgIC8qIFN0ZXAgMTU6ICBTYXZlIHAsIHEsIGNvdW50ZXIgYW5kIHNlZWQuICAqLworLyogICBsb2dfZGVidWcgKCJmaXBzMTg2LTIgcGJpdHMgcD0ldSBxPSV1IGNvdW50ZXI9JWRcbiIsICovCisvKiAgICAgICAgICAgICAgbXBpX2dldF9uYml0cyAocHJpbWVfcCksIG1waV9nZXRfbmJpdHMgKHByaW1lX3EpLCBjb3VudGVyKTsgKi8KKy8qICAgbG9nX3ByaW50aGV4KCJmaXBzMTg2LTIgc2VlZDoiLCBzZWVkLCBzZWVkbGVuKTsgKi8KKy8qICAgbG9nX21waWR1bXAgKCJmaXBzMTg2LTIgcHJpbWUgcCIsIHByaW1lX3ApOyAqLworLyogICBsb2dfbXBpZHVtcCAoImZpcHMxODYtMiBwcmltZSBxIiwgcHJpbWVfcSk7ICovCisgIGlmIChyX3EpCisgICAgeworICAgICAgKnJfcSA9IHByaW1lX3E7CisgICAgICBwcmltZV9xID0gTlVMTDsKKyAgICB9CisgIGlmIChyX3ApCisgICAgeworICAgICAgKnJfcCA9IHByaW1lX3A7CisgICAgICBwcmltZV9wID0gTlVMTDsKKyAgICB9CisgIGlmIChyX2NvdW50ZXIpCisgICAgKnJfY291bnRlciA9IGNvdW50ZXI7CisgIGlmIChyX3NlZWQgJiYgcl9zZWVkbGVuKQorICAgIHsKKyAgICAgIG1lbWNweSAoc2VlZF9wbHVzLCBzZWVkLCBzZWVkbGVuKTsKKyAgICAgICpyX3NlZWQgPSBzZWVkX3BsdXM7CisgICAgICBzZWVkX3BsdXMgPSBOVUxMOworICAgICAgKnJfc2VlZGxlbiA9IHNlZWRsZW47CisgICAgfQorCisKKyBsZWF2ZToKKyAgZ2NyeV9tcGlfcmVsZWFzZSAodG1wdmFsKTsKKyAgZ2NyeV9tcGlfcmVsZWFzZSAodmFsdWVfeCk7CisgIGdjcnlfbXBpX3JlbGVhc2UgKHZhbHVlX3cpOworICBnY3J5X21waV9yZWxlYXNlIChwcmltZV9wKTsKKyAgZ2NyeV9tcGlfcmVsZWFzZSAocHJpbWVfcSk7CisgIGdjcnlfZnJlZSAoc2VlZF9wbHVzKTsKKyAgZ2NyeV9tcGlfcmVsZWFzZSAodmFsXzIpOworICByZXR1cm4gZWM7Cit9CisKKworDAorLyogV0FSTklORzogVGhlIGNvZGUgYmVsb3cgaGFzIG5vdCB5ZXQgYmVlbiB0ZXN0ZWQhICBIb3dldmVyLCBpdCBpcworICAgbm90IHlldCB1c2VkLiAgV2UgbmVlZCB0byB3YWl0IGZvciBGSVBTIDE4Ni0zIGZpbmFsIGFuZCBmb3IgdGVzdAorICAgdmVjdG9ycy4KKworICAgR2VuZXJhdGUgdGhlIHR3byBwcmltZSB1c2VkIGZvciBEU0EgdXNpbmcgdGhlIGFsZ29yaXRobSBzcGVjaWZpZWQKKyAgIGluIEZJUFMgMTg2LTMsIEEuMS4xLjIuICBQQklUUyBpcyB0aGUgZGVzaXJlZCBsZW5ndGggb2YgdGhlIHByaW1lIFAKKyAgIGFuZCBhIFFCSVRTIHRoZSBsZW5ndGggb2YgdGhlIHByaW1lIFEuICBJZiBTRUVEIGlzIG5vdCBzdXBwbGllZCBhbmQKKyAgIFNFRURMRU4gaXMgMCB0aGUgZnVuY3Rpb24gZ2VuZXJhdGVzIGFuIGFwcHJvcHJpYXRlIFNFRUQuICBPbgorICAgc3VjY2VzcyB0aGUgZ2VuZXJhdGVkIHByaW1lcyBhcmUgc3RvcmVkIGF0IFJfUSBhbmQgUl9QLCB0aGUgY291bnRlcgorICAgdmFsdWUgaXMgc3RvcmVkIGF0IFJfQ09VTlRFUiBhbmQgdGhlIHNlZWQgYWN0dWFsbHkgdXNlZCBmb3IKKyAgIGdlbmVyYXRpb24gaXMgc3RvcmVkIGF0IFJfU0VFRCBhbmQgUl9TRUVEVkFMVUUuICBUaGUgaGFzaCBhbGdvcml0aG0KKyAgIHVzZWQgaXMgc3RvcmVkIGF0IFJfSEFTSEFMR08uCisgICAKKyAgIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIHZlcnkgc2ltaWxhciB0byB0aGUgZmlwczE4Nl8yIGNvZGUuICBEdWUKKyAgIHRvIHRoZSBtaW5vciBkaWZmZXJlbmNlcywgb3RoZXIgYnVmZmVyIHNpemVzIGFuZCBmb3IgZG9jdW1lbnRhcmlvbiwKKyAgIHdlIHVzZSBhIHNlcGFyYXRlIGZ1bmN0aW9uLgorKi8KK2dwZ19lcnJfY29kZV90CitfZ2NyeV9nZW5lcmF0ZV9maXBzMTg2XzNfcHJpbWUgKHVuc2lnbmVkIGludCBwYml0cywgdW5zaWduZWQgaW50IHFiaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpzZWVkLCBzaXplX3Qgc2VlZGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NyeV9tcGlfdCAqcl9xLCBnY3J5X21waV90ICpyX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqcl9jb3VudGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqcl9zZWVkLCBzaXplX3QgKnJfc2VlZGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpyX2hhc2hhbGdvKQoreworICBncGdfZXJyX2NvZGVfdCBlYzsKKyAgdW5zaWduZWQgY2hhciBzZWVkX2hlbHBfYnVmZmVyWzI1Ni84XTsgIC8qIFVzZWQgdG8gaG9sZCBhIGdlbmVyYXRlZCBTRUVELiAqLworICB1bnNpZ25lZCBjaGFyICpzZWVkX3BsdXM7ICAgICAvKiBNYWxsb2NlZCBidWZmZXIgdG8gaG9sZCBTRUVEK3guICAqLworICB1bnNpZ25lZCBjaGFyIGRpZ2VzdFsyNTYvOF07ICAvKiBIZWxwZXIgYnVmZmVyIGZvciBTSEEtMSBkaWdlc3QuICAqLworICBnY3J5X21waV90IHZhbF8yID0gTlVMTDsgICAgICAvKiBIZWxwZXIgZm9yIHRoZSBwcmltZSB0ZXN0LiAgKi8KKyAgZ2NyeV9tcGlfdCB0bXB2YWwgPSBOVUxMOyAgICAgLyogSGVscGVyIHZhcmlhYmxlLiAgKi8KKyAgaW50IGhhc2hhbGdvOyAgICAgICAgICAgICAgICAgLyogVGhlIGlkIG9mIHRoZSBBcHByb3ZlZCBIYXNoIEZ1bmN0aW9uLiAgKi8KKyAgaW50IGk7CisgIAorICB1bnNpZ25lZCBjaGFyIHZhbHVlX3VbMjU2LzhdOworICBpbnQgdmFsdWVfbiwgdmFsdWVfYiwgdmFsdWVfajsKKyAgaW50IGNvdW50ZXI7CisgIGdjcnlfbXBpX3QgdmFsdWVfdyA9IE5VTEw7CisgIGdjcnlfbXBpX3QgdmFsdWVfeCA9IE5VTEw7CisgIGdjcnlfbXBpX3QgcHJpbWVfcSA9IE5VTEw7CisgIGdjcnlfbXBpX3QgcHJpbWVfcCA9IE5VTEw7CisKKyAgZ2NyeV9hc3NlcnQgKHNpemVvZiBzZWVkX2hlbHBfYnVmZmVyID09IHNpemVvZiBkaWdlc3QKKyAgICAgICAgICAgICAgICYmIHNpemVvZiBzZWVkX2hlbHBfYnVmZmVyID09IHNpemVvZiB2YWx1ZV91KTsKKworICAvKiBTdGVwIDE6ICBDaGVjayB0aGUgcmVxdWVzdGVkIHByaW1lIGxlbmd0aHMuICAqLworICAvKiBOb3RlIHRoYXQgZHVlIHRvIHRoZSBzaXplIG9mIG91ciBidWZmZXJzIFFCSVRTIGlzIGxpbWl0ZWQgdG8gMjU2LiAgKi8KKyAgaWYgKHBiaXRzID09IDEwMjQgJiYgcWJpdHMgPT0gMTYwKQorICAgIGhhc2hhbGdvID0gR0NSWV9NRF9TSEExOworICBlbHNlIGlmIChwYml0cyA9PSAyMDQ4ICYmIHFiaXRzID09IDIyNCkKKyAgICBoYXNoYWxnbyA9IEdDUllfTURfU0hBMjI0OworICBlbHNlIGlmIChwYml0cyA9PSAyMDQ4ICYmIHFiaXRzID09IDI1NikKKyAgICBoYXNoYWxnbyA9IEdDUllfTURfU0hBMjU2OworICBlbHNlIGlmIChwYml0cyA9PSAzMDcyICYmIHFiaXRzID09IDI1NikKKyAgICBoYXNoYWxnbyA9IEdDUllfTURfU0hBMjU2OworICBlbHNlCisgICAgcmV0dXJuIEdQR19FUlJfSU5WX0tFWUxFTjsKKworICAvKiBBbHNvIGNoZWNrIHRoYXQgdGhlIGhhc2ggYWxnb3JpdGhtIGlzIGF2YWlsYWJsZS4gICovCisgIGVjID0gZ3BnX2Vycl9jb2RlIChnY3J5X21kX3Rlc3RfYWxnbyAoaGFzaGFsZ28pKTsKKyAgaWYgKGVjKQorICAgIHJldHVybiBlYzsKKyAgZ2NyeV9hc3NlcnQgKHFiaXRzLzggPD0gc2l6ZW9mIGRpZ2VzdCk7CisgIGdjcnlfYXNzZXJ0IChnY3J5X21kX2dldF9hbGdvX2RsZW4gKGhhc2hhbGdvKSA9PSBxYml0cy84KTsKKworCisgIC8qIFN0ZXAgMjogIENoZWNrIHNlZWRsZW4uICAqLworICBpZiAoIXNlZWQgJiYgIXNlZWRsZW4pCisgICAgOyAvKiBObyBzZWVkIHZhbHVlIGdpdmVuOiAgV2UgYXJlIGFza2VkIHRvIGdlbmVyYXRlIGl0LiAgKi8KKyAgZWxzZSBpZiAoIXNlZWQgfHwgc2VlZGxlbiA8IHFiaXRzLzgpCisgICAgcmV0dXJuIEdQR19FUlJfSU5WX0FSRzsKKyAgCisgIC8qIEFsbG9jYXRlIGEgYnVmZmVyIHRvIGxhdGVyIGNvbXB1dGUgU0VFRCtzb21lX2luY3JlbWVudCBhbmQgYSBmZXcKKyAgICAgaGVscGVyIHZhcmlhYmxlcy4gICovCisgIHNlZWRfcGx1cyA9IGdjcnlfbWFsbG9jIChzZWVkbGVuIDwgc2l6ZW9mIHNlZWRfaGVscF9idWZmZXI/IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIHNlZWRfaGVscF9idWZmZXIgOiBzZWVkbGVuKTsKKyAgaWYgKCFzZWVkX3BsdXMpCisgICAgeworICAgICAgZWMgPSBncGdfZXJyX2NvZGVfZnJvbV9zeXNlcnJvciAoKTsKKyAgICAgIGdvdG8gbGVhdmU7CisgICAgfQorICB2YWxfMiAgID0gbXBpX2FsbG9jX3NldF91aSAoMik7CisgIHZhbHVlX3cgPSBnY3J5X21waV9uZXcgKHBiaXRzKTsKKyAgdmFsdWVfeCA9IGdjcnlfbXBpX25ldyAocGJpdHMpOworCisgIC8qIFN0ZXAgMzogbiA9IFxsY2VpbCBMIC8gb3V0bGVuIFxyY2VpbCAtIDEgICovCisgIHZhbHVlX24gPSAocGJpdHMgKyBxYml0cyAtIDEpIC8gcWJpdHMgLSAxOworICAvKiBTdGVwIDQ6IGIgPSBMIC0gMSAtIChuICogb3V0bGVuKSAgKi8KKyAgdmFsdWVfYiA9IHBiaXRzIC0gMSAtICh2YWx1ZV9uICogcWJpdHMpOworCisgcmVzdGFydDogIAorICAvKiBHZW5lcmF0ZSBRLiAgKi8KKyAgZm9yICg7OykKKyAgICB7CisgICAgICAvKiBTdGVwIDU6ICBHZW5lcmF0ZSBhIChuZXcpIHNlZWQgdW5sZXNzIG9uZSBoYXMgYmVlbiBzdXBwbGllZC4gICovCisgICAgICBpZiAoIXNlZWQpCisgICAgICAgIHsKKyAgICAgICAgICBzZWVkbGVuID0gcWJpdHMvODsKKyAgICAgICAgICBnY3J5X2Fzc2VydCAoc2VlZGxlbiA8PSBzaXplb2Ygc2VlZF9oZWxwX2J1ZmZlcik7CisgICAgICAgICAgZ2NyeV9jcmVhdGVfbm9uY2UgKHNlZWRfaGVscF9idWZmZXIsIHNlZWRsZW4pOworICAgICAgICAgIHNlZWQgPSBzZWVkX2hlbHBfYnVmZmVyOworICAgICAgICB9CisgICAgICAKKyAgICAgIC8qIFN0ZXAgNjogIFUgPSBoYXNoKHNlZWQpICAqLworICAgICAgZ2NyeV9tZF9oYXNoX2J1ZmZlciAoaGFzaGFsZ28sIHZhbHVlX3UsIHNlZWQsIHNlZWRsZW4pOworCisgICAgICAvKiBTdGVwIDc6ICBxID0gMl57Ti0xfSArIFUgKyAxIC0gKFUgbW9kIDIpICAqLworICAgICAgaWYgKCAhKHZhbHVlX3VbcWJpdHMvOC0xXSAmIDB4MDEpICkKKyAgICAgICAgeworICAgICAgICAgIGZvciAoaT1xYml0cy84LTE7IGkgPj0gMDsgaS0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICB2YWx1ZV91W2ldKys7CisgICAgICAgICAgICAgIGlmICh2YWx1ZV91W2ldKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBnY3J5X21waV9yZWxlYXNlIChwcmltZV9xKTsgcHJpbWVfcSA9IE5VTEw7CisgICAgICBlYyA9IGdwZ19lcnJfY29kZSAoZ2NyeV9tcGlfc2NhbiAoJnByaW1lX3EsIEdDUllNUElfRk1UX1VTRywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdSwgc2l6ZW9mIHZhbHVlX3UsIE5VTEwpKTsKKyAgICAgIGlmIChlYykKKyAgICAgICAgZ290byBsZWF2ZTsKKyAgICAgIG1waV9zZXRfaGlnaGJpdCAocHJpbWVfcSwgcWJpdHMtMSApOworICAgICAgCisgICAgICAvKiBTdGVwIDg6ICBUZXN0IHdoZXRoZXIgUSBpcyBwcmltZSB1c2luZyA2NCByb3VuZCBvZiBSYWJpbi1NaWxsZXIuCisgICAgICAgICAgICAgICAgICBBY2NvcmRpbmcgdG8gdGFibGUgQy4xIHRoaXMgaXMgc3VmZmljaWVudCBmb3IgYWxsCisgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQgcHJpbWUgc2l6ZXMgKGkuZS4gdXAgMzA3Mi8yNTYpLiAgKi8KKyAgICAgIGlmIChjaGVja19wcmltZSAocHJpbWVfcSwgdmFsXzIsIDY0LCBOVUxMLCBOVUxMKSkKKyAgICAgICAgYnJlYWs7IC8qIFllcywgUSBpcyBwcmltZS4gICovCisKKyAgICAgIC8qIFN0ZXAgOC4gICovCisgICAgICBzZWVkID0gTlVMTDsgIC8qIEZvcmNlIGEgbmV3IHNlZWQgYXQgU3RlcCA1LiAgKi8KKyAgICB9CisgIAorICAvKiBTdGVwIDExLiAgTm90ZSB0aGF0IHdlIGRvIG5vIHVzZSBhbiBleHBsaWNpdCBvZmZzZXQgYnV0IGluY3JlbWVudAorICAgICBTRUVEX1BMVVMgYWNjb3JkaW5nbHkuICAqLworICBtZW1jcHkgKHNlZWRfcGx1cywgc2VlZCwgc2VlZGxlbik7CisgIGNvdW50ZXIgPSAwOworCisgIC8qIEdlbmVyYXRlIFAuICovCisgIHByaW1lX3AgPSBnY3J5X21waV9uZXcgKHBiaXRzKTsKKyAgZm9yICg7OykKKyAgICB7CisgICAgICAvKiBTdGVwIDExLjE6IEZvciBqID0gMCwuLi5uIGxldCAKKyAgICAgICAgICAgICAgICAgICAgICBWX2ogPSBoYXNoKHNlZWQrb2Zmc2V0K2opICAKKyAgICAgICAgIFN0ZXAgMTEuMjogVyA9IFZfMCArIFZfMSoyXm91dGxlbiArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFZfe24tMX0qMl57KG4tMSkqb3V0bGVufQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKFZfe259IG1vZCAyXmIpKjJee24qb3V0bGVufSAgICAgICAgICAgICAgICAKKyAgICAgICAqLworICAgICAgbXBpX3NldF91aSAodmFsdWVfdywgMCk7CisgICAgICBmb3IgKHZhbHVlX2o9MDsgdmFsdWVfaiA8PSB2YWx1ZV9uOyB2YWx1ZV9qKyspCisgICAgICAgIHsKKyAgICAgICAgICAvKiBUaGVyZSBpcyBubyBuZWVkIHRvIGhhdmUgYW4gZXhwbGljaXQgb2Zmc2V0IHZhcmlhYmxlOiBJbgorICAgICAgICAgICAgIHRoZSBmaXJzdCByb3VuZCB3ZSBzaGFsbCBoYXZlIGFuIG9mZnNldCBvZiAxIGFuZCBhIGogb2YKKyAgICAgICAgICAgICAwLiAgVGhpcyBpcyBhY2hpZXZlZCBieSBpbmNyZW1lbnRpbmcgU0VFRF9QTFVTIGhlcmUuICBGb3IKKyAgICAgICAgICAgICB0aGUgbmV4dCByb3VuZCBvZmZzZXQgaXMgaW1wbGljaXRseSB1cGRhdGVkIGJ5IHVzaW5nCisgICAgICAgICAgICAgU0VFRF9QTFVTIGFnYWluLiAgKi8KKyAgICAgICAgICBmb3IgKGk9c2VlZGxlbi0xOyBpID49IDA7IGktLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgc2VlZF9wbHVzW2ldKys7CisgICAgICAgICAgICAgIGlmIChzZWVkX3BsdXNbaV0pCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgZ2NyeV9tZF9oYXNoX2J1ZmZlciAoR0NSWV9NRF9TSEExLCBkaWdlc3QsIHNlZWRfcGx1cywgc2VlZGxlbik7CisgICAgICAgICAgCisgICAgICAgICAgZ2NyeV9tcGlfcmVsZWFzZSAodG1wdmFsKTsgdG1wdmFsID0gTlVMTDsKKyAgICAgICAgICBlYyA9IGdwZ19lcnJfY29kZSAoZ2NyeV9tcGlfc2NhbiAoJnRtcHZhbCwgR0NSWU1QSV9GTVRfVVNHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdlc3QsIHNpemVvZiBkaWdlc3QsIE5VTEwpKTsKKyAgICAgICAgICBpZiAoZWMpCisgICAgICAgICAgICBnb3RvIGxlYXZlOworICAgICAgICAgIGlmICh2YWx1ZV9qID09IHZhbHVlX24pCisgICAgICAgICAgICBtcGlfY2xlYXJfaGlnaGJpdCAodG1wdmFsLCB2YWx1ZV9iKTsgLyogKFZfbiBtb2QgMl5iKSAqLworICAgICAgICAgIG1waV9sc2hpZnQgKHRtcHZhbCwgdG1wdmFsLCB2YWx1ZV9qKnFiaXRzKTsKKyAgICAgICAgICBtcGlfYWRkICh2YWx1ZV93LCB2YWx1ZV93LCB0bXB2YWwpOworICAgICAgICB9CisKKyAgICAgIC8qIFN0ZXAgMTEuMzogWCA9IFcgKyAyXntMLTF9ICAqLworICAgICAgbXBpX3NldF91aSAodmFsdWVfeCwgMCk7CisgICAgICBtcGlfc2V0X2hpZ2hiaXQgKHZhbHVlX3gsIHBiaXRzLTEpOworICAgICAgbXBpX2FkZCAodmFsdWVfeCwgdmFsdWVfeCwgdmFsdWVfdyk7CisKKyAgICAgIC8qIFN0ZXAgMTEuNDogIGMgPSBYIG1vZCAycSAgKi8KKyAgICAgIG1waV9tdWxfMmV4cCAodG1wdmFsLCBwcmltZV9xLCAxKTsKKyAgICAgIG1waV9tb2QgKHRtcHZhbCwgdmFsdWVfeCwgdG1wdmFsKTsKKworICAgICAgLyogU3RlcCAxMS41OiAgcCA9IFggLSAoYyAtIDEpICAqLworICAgICAgbXBpX3N1Yl91aSAodG1wdmFsLCB0bXB2YWwsIDEpOworICAgICAgbXBpX3N1YiAocHJpbWVfcCwgdmFsdWVfeCwgdG1wdmFsKTsKKworICAgICAgLyogU3RlcCAxMS42OiBJZiAgcCA8IDJee0wtMX0gIHNraXAgdGhlIHByaW1hbGl0eSB0ZXN0LiAgKi8KKyAgICAgIC8qIFN0ZXAgMTEuNyBhbmQgMTEuODogUHJpbWFsaXR5IHRlc3QuICAqLworICAgICAgaWYgKG1waV9nZXRfbmJpdHMgKHByaW1lX3ApID49IHBiaXRzLTEKKyAgICAgICAgICAmJiBjaGVja19wcmltZSAocHJpbWVfcCwgdmFsXzIsIDY0LCBOVUxMLCBOVUxMKSApCisgICAgICAgIGJyZWFrOyAvKiBZZXMsIFAgaXMgcHJpbWUsIGNvbnRpbnVlIHdpdGggU3RlcCAxNS4gICovCisgICAgICAKKyAgICAgIC8qIFN0ZXAgMTEuOTogY291bnRlciA9IGNvdW50ZXIgKyAxLCBvZmZzZXQgPSBvZmZzZXQgKyBuICsgMS4KKyAgICAgICAgICAgICAgICAgICAgSWYgY291bnRlciA+PSA0TCAgZ290byBTdGVwIDUuICAqLworICAgICAgY291bnRlcisrOworICAgICAgaWYgKGNvdW50ZXIgPj0gNCpwYml0cykKKyAgICAgICAgZ290byByZXN0YXJ0OworICAgIH0KKworICAvKiBTdGVwIDEyOiAgU2F2ZSBwLCBxLCBjb3VudGVyIGFuZCBzZWVkLiAgKi8KKyAgbG9nX2RlYnVnICgiZmlwczE4Ni0zIHBiaXRzIHA9JXUgcT0ldSBjb3VudGVyPSVkXG4iLAorICAgICAgICAgICAgIG1waV9nZXRfbmJpdHMgKHByaW1lX3ApLCBtcGlfZ2V0X25iaXRzIChwcmltZV9xKSwgY291bnRlcik7CisgIGxvZ19wcmludGhleCgiZmlwczE4Ni0zIHNlZWQ6Iiwgc2VlZCwgc2VlZGxlbik7CisgIGxvZ19tcGlkdW1wICgiZmlwczE4Ni0zIHByaW1lIHAiLCBwcmltZV9wKTsKKyAgbG9nX21waWR1bXAgKCJmaXBzMTg2LTMgcHJpbWUgcSIsIHByaW1lX3EpOworICBpZiAocl9xKQorICAgIHsKKyAgICAgICpyX3EgPSBwcmltZV9xOworICAgICAgcHJpbWVfcSA9IE5VTEw7CisgICAgfQorICBpZiAocl9wKQorICAgIHsKKyAgICAgICpyX3AgPSBwcmltZV9wOworICAgICAgcHJpbWVfcCA9IE5VTEw7CisgICAgfQorICBpZiAocl9jb3VudGVyKQorICAgICpyX2NvdW50ZXIgPSBjb3VudGVyOworICBpZiAocl9zZWVkICYmIHJfc2VlZGxlbikKKyAgICB7CisgICAgICBtZW1jcHkgKHNlZWRfcGx1cywgc2VlZCwgc2VlZGxlbik7CisgICAgICAqcl9zZWVkID0gc2VlZF9wbHVzOworICAgICAgc2VlZF9wbHVzID0gTlVMTDsKKyAgICAgICpyX3NlZWRsZW4gPSBzZWVkbGVuOworICAgIH0KKyAgaWYgKHJfaGFzaGFsZ28pCisgICAgKnJfaGFzaGFsZ28gPSBoYXNoYWxnbzsKKworIGxlYXZlOgorICBnY3J5X21waV9yZWxlYXNlICh0bXB2YWwpOworICBnY3J5X21waV9yZWxlYXNlICh2YWx1ZV94KTsKKyAgZ2NyeV9tcGlfcmVsZWFzZSAodmFsdWVfdyk7CisgIGdjcnlfbXBpX3JlbGVhc2UgKHByaW1lX3ApOworICBnY3J5X21waV9yZWxlYXNlIChwcmltZV9xKTsKKyAgZ2NyeV9mcmVlIChzZWVkX3BsdXMpOworICBnY3J5X21waV9yZWxlYXNlICh2YWxfMik7CisgIHJldHVybiBlYzsKK30KKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L2NpcGhlci9wdWJrZXkuYyBiL2xpYmdjcnlwdC0xLjQuNi9jaXBoZXIvcHVia2V5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhhYmNiZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9jaXBoZXIvcHVia2V5LmMKQEAgLTAsMCArMSwyNzQ5IEBACisvKiBwdWJrZXkuYyAgLQlwdWJrZXkgZGlzcGF0Y2hlcgorICogQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAwLCAyMDAyLCAyMDAzLCAyMDA1LCAKKyAqICAgICAgICAgICAgICAgMjAwNywgMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBnZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgImcxMGxpYi5oIgorI2luY2x1ZGUgIm1waS5oIgorI2luY2x1ZGUgImNpcGhlci5oIgorI2luY2x1ZGUgImF0aC5oIgorCisKK3N0YXRpYyBnY3J5X2Vycl9jb2RlX3QgcHVia2V5X2RlY3J5cHQgKGludCBhbGdvLCBnY3J5X21waV90ICpyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X21waV90ICpkYXRhLCBnY3J5X21waV90ICpza2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKTsKK3N0YXRpYyBnY3J5X2Vycl9jb2RlX3QgcHVia2V5X3NpZ24gKGludCBhbGdvLCBnY3J5X21waV90ICpyZXNhcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X21waV90IGhhc2gsIGdjcnlfbXBpX3QgKnNrZXkpOworc3RhdGljIGdjcnlfZXJyX2NvZGVfdCBwdWJrZXlfdmVyaWZ5IChpbnQgYWxnbywgZ2NyeV9tcGlfdCBoYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X21waV90ICpkYXRhLCBnY3J5X21waV90ICpwa2V5LAorCQkJCSAgICAgaW50ICgqY21wKSAodm9pZCAqLCBnY3J5X21waV90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqb3BhcXVlKTsKKworCisvKiBBIGR1bW15IGV4dHJhc3BlYyBzbyB0aGF0IHdlIGRvIG5vdCBuZWVkIHRvIHRlc3RzIHRoZSBleHRyYXNwZWMKKyAgIGZpZWxkIGZyb20gdGhlIG1vZHVsZSBzcGVjaWZpY2F0aW9uIGFnYWluc3QgTlVMTCBhbmQgaW5zdGVhZAorICAgZGlyZWN0bHkgdGVzdCB0aGUgcmVzcGVjdGl2ZSBmaWVsZHMgb2YgZXh0cmFzcGVjcy4gICovCitzdGF0aWMgcGtfZXh0cmFfc3BlY190IGR1bW15X2V4dHJhX3NwZWM7CisKKworLyogVGhpcyBpcyB0aGUgbGlzdCBvZiB0aGUgZGVmYXVsdCBwdWJsaWMta2V5IGNpcGhlcnMgaW5jbHVkZWQgaW4KKyAgIGxpYmdjcnlwdC4gIEZJUFNfQUxMT1dFRCBpbmRpY2F0ZWQgd2hldGhlciB0aGUgYWxnb3JpdGhtIGlzIHVzZWQgaW4KKyAgIEZJUFMgbW9kZS4gKi8KK3N0YXRpYyBzdHJ1Y3QgcHVia2V5X3RhYmxlX2VudHJ5Cit7CisgIGdjcnlfcGtfc3BlY190ICpwdWJrZXk7CisgIHBrX2V4dHJhX3NwZWNfdCAqZXh0cmFzcGVjOworICB1bnNpZ25lZCBpbnQgYWxnb3JpdGhtOworICBpbnQgZmlwc19hbGxvd2VkOyAKK30gcHVia2V5X3RhYmxlW10gPQorICB7CisjaWYgVVNFX1JTQQorICAgIHsgJl9nY3J5X3B1YmtleV9zcGVjX3JzYSwKKyAgICAgICZfZ2NyeV9wdWJrZXlfZXh0cmFzcGVjX3JzYSwgICBHQ1JZX1BLX1JTQSwgMX0sCisjZW5kaWYKKyNpZiBVU0VfRUxHQU1BTAorICAgIHsgJl9nY3J5X3B1YmtleV9zcGVjX2VsZywKKyAgICAgICZfZ2NyeV9wdWJrZXlfZXh0cmFzcGVjX2VsZywgICAgR0NSWV9QS19FTEcgICB9LAorICAgIHsgJl9nY3J5X3B1YmtleV9zcGVjX2VsZywKKyAgICAgICZfZ2NyeV9wdWJrZXlfZXh0cmFzcGVjX2VsZywgICAgR0NSWV9QS19FTEdfRSB9LAorI2VuZGlmCisjaWYgVVNFX0RTQQorICAgIHsgJl9nY3J5X3B1YmtleV9zcGVjX2RzYSwKKyAgICAgICZfZ2NyeV9wdWJrZXlfZXh0cmFzcGVjX2RzYSwgICBHQ1JZX1BLX0RTQSwgMSAgIH0sCisjZW5kaWYKKyNpZiBVU0VfRUNDCisgICAgeyAmX2djcnlfcHVia2V5X3NwZWNfZWNkc2EsCisgICAgICAmX2djcnlfcHVia2V5X2V4dHJhc3BlY19lY2RzYSwgR0NSWV9QS19FQ0RTQSwgMCB9LAorI2VuZGlmCisgICAgeyBOVUxMLCAwIH0sCisgIH07CisKKy8qIExpc3Qgb2YgcmVnaXN0ZXJlZCBjaXBoZXJzLiAgKi8KK3N0YXRpYyBnY3J5X21vZHVsZV90IHB1YmtleXNfcmVnaXN0ZXJlZDsKKworLyogVGhpcyBpcyB0aGUgbG9jayBwcm90ZWN0aW5nIFBVQktFWVNfUkVHSVNURVJFRC4gICovCitzdGF0aWMgYXRoX211dGV4X3QgcHVia2V5c19yZWdpc3RlcmVkX2xvY2sgPSBBVEhfTVVURVhfSU5JVElBTElaRVI7OworCisvKiBGbGFnIHRvIGNoZWNrIHdldGhlciB0aGUgZGVmYXVsdCBwdWJrZXlzIGhhdmUgYWxyZWFkeSBiZWVuCisgICByZWdpc3RlcmVkLiAgKi8KK3N0YXRpYyBpbnQgZGVmYXVsdF9wdWJrZXlzX3JlZ2lzdGVyZWQ7CisKKy8qIENvbnZlbmllbnQgbWFjcm8gZm9yIHJlZ2lzdGVyaW5nIHRoZSBkZWZhdWx0IGRpZ2VzdHMuICAqLworI2RlZmluZSBSRUdJU1RFUl9ERUZBVUxUX1BVQktFWVMgICAgICAgICAgICAgICAgICAgXAorICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgYXRoX211dGV4X2xvY2sgKCZwdWJrZXlzX3JlZ2lzdGVyZWRfbG9jayk7ICAgXAorICAgICAgaWYgKCEgZGVmYXVsdF9wdWJrZXlzX3JlZ2lzdGVyZWQpICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHBrX3JlZ2lzdGVyX2RlZmF1bHQgKCk7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGRlZmF1bHRfcHVia2V5c19yZWdpc3RlcmVkID0gMTsgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgYXRoX211dGV4X3VubG9jayAoJnB1YmtleXNfcmVnaXN0ZXJlZF9sb2NrKTsgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB3aGlsZSAoMCkKKworLyogVGhlc2UgZHVtbXkgZnVuY3Rpb25zIGFyZSB1c2VkIGluIGNhc2UgYSBjaXBoZXIgaW1wbGVtZW50YXRpb24KKyAgIHJlZnVzZXMgdG8gcHJvdmlkZSBpdCdzIG93biBmdW5jdGlvbnMuICAqLworCitzdGF0aWMgZ2NyeV9lcnJfY29kZV90CitkdW1teV9nZW5lcmF0ZSAoaW50IGFsZ29yaXRobSwgdW5zaWduZWQgaW50IG5iaXRzLCB1bnNpZ25lZCBsb25nIGR1bW15LAorICAgICAgICAgICAgICAgIGdjcnlfbXBpX3QgKnNrZXksIGdjcnlfbXBpX3QgKipyZXRmYWN0b3JzKQoreworICAodm9pZClhbGdvcml0aG07CisgICh2b2lkKW5iaXRzOworICAodm9pZClkdW1teTsKKyAgKHZvaWQpc2tleTsKKyAgKHZvaWQpcmV0ZmFjdG9yczsKKyAgZmlwc19zaWduYWxfZXJyb3IgKCJ1c2luZyBkdW1teSBwdWJsaWMga2V5IGZ1bmN0aW9uIik7CisgIHJldHVybiBHUEdfRVJSX05PVF9JTVBMRU1FTlRFRDsKK30KKworc3RhdGljIGdjcnlfZXJyX2NvZGVfdAorZHVtbXlfY2hlY2tfc2VjcmV0X2tleSAoaW50IGFsZ29yaXRobSwgZ2NyeV9tcGlfdCAqc2tleSkKK3sKKyAgKHZvaWQpYWxnb3JpdGhtOworICAodm9pZClza2V5OworICBmaXBzX3NpZ25hbF9lcnJvciAoInVzaW5nIGR1bW15IHB1YmxpYyBrZXkgZnVuY3Rpb24iKTsKKyAgcmV0dXJuIEdQR19FUlJfTk9UX0lNUExFTUVOVEVEOworfQorCitzdGF0aWMgZ2NyeV9lcnJfY29kZV90CitkdW1teV9lbmNyeXB0IChpbnQgYWxnb3JpdGhtLCBnY3J5X21waV90ICpyZXNhcnIsIGdjcnlfbXBpX3QgZGF0YSwKKyAgICAgICAgICAgICAgIGdjcnlfbXBpX3QgKnBrZXksIGludCBmbGFncykKK3sKKyAgKHZvaWQpYWxnb3JpdGhtOworICAodm9pZClyZXNhcnI7CisgICh2b2lkKWRhdGE7CisgICh2b2lkKXBrZXk7CisgICh2b2lkKWZsYWdzOworICBmaXBzX3NpZ25hbF9lcnJvciAoInVzaW5nIGR1bW15IHB1YmxpYyBrZXkgZnVuY3Rpb24iKTsKKyAgcmV0dXJuIEdQR19FUlJfTk9UX0lNUExFTUVOVEVEOworfQorCitzdGF0aWMgZ2NyeV9lcnJfY29kZV90CitkdW1teV9kZWNyeXB0IChpbnQgYWxnb3JpdGhtLCBnY3J5X21waV90ICpyZXN1bHQsIGdjcnlfbXBpX3QgKmRhdGEsCisgICAgICAgICAgICAgICBnY3J5X21waV90ICpza2V5LCBpbnQgZmxhZ3MpCit7CisgICh2b2lkKWFsZ29yaXRobTsKKyAgKHZvaWQpcmVzdWx0OworICAodm9pZClkYXRhOworICAodm9pZClza2V5OworICAodm9pZClmbGFnczsKKyAgZmlwc19zaWduYWxfZXJyb3IgKCJ1c2luZyBkdW1teSBwdWJsaWMga2V5IGZ1bmN0aW9uIik7CisgIHJldHVybiBHUEdfRVJSX05PVF9JTVBMRU1FTlRFRDsKK30KKworc3RhdGljIGdjcnlfZXJyX2NvZGVfdAorZHVtbXlfc2lnbiAoaW50IGFsZ29yaXRobSwgZ2NyeV9tcGlfdCAqcmVzYXJyLCBnY3J5X21waV90IGRhdGEsCisgICAgICAgICAgICBnY3J5X21waV90ICpza2V5KQoreworICAodm9pZClhbGdvcml0aG07CisgICh2b2lkKXJlc2FycjsKKyAgKHZvaWQpZGF0YTsKKyAgKHZvaWQpc2tleTsKKyAgZmlwc19zaWduYWxfZXJyb3IgKCJ1c2luZyBkdW1teSBwdWJsaWMga2V5IGZ1bmN0aW9uIik7CisgIHJldHVybiBHUEdfRVJSX05PVF9JTVBMRU1FTlRFRDsKK30KKworc3RhdGljIGdjcnlfZXJyX2NvZGVfdAorZHVtbXlfdmVyaWZ5IChpbnQgYWxnb3JpdGhtLCBnY3J5X21waV90IGhhc2gsIGdjcnlfbXBpX3QgKmRhdGEsCisgICAgICAgICAgICAgIGdjcnlfbXBpX3QgKnBrZXksCisJICAgICAgaW50ICgqY21wKSAodm9pZCAqLCBnY3J5X21waV90KSwgdm9pZCAqb3BhcXVldikKK3sKKyAgKHZvaWQpYWxnb3JpdGhtOworICAodm9pZCloYXNoOworICAodm9pZClkYXRhOworICAodm9pZClwa2V5OworICAodm9pZCljbXA7CisgICh2b2lkKW9wYXF1ZXY7CisgIGZpcHNfc2lnbmFsX2Vycm9yICgidXNpbmcgZHVtbXkgcHVibGljIGtleSBmdW5jdGlvbiIpOworICByZXR1cm4gR1BHX0VSUl9OT1RfSU1QTEVNRU5URUQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZAorZHVtbXlfZ2V0X25iaXRzIChpbnQgYWxnb3JpdGhtLCBnY3J5X21waV90ICpwa2V5KQoreworICAodm9pZClhbGdvcml0aG07CisgICh2b2lkKXBrZXk7CisgIGZpcHNfc2lnbmFsX2Vycm9yICgidXNpbmcgZHVtbXkgcHVibGljIGtleSBmdW5jdGlvbiIpOworICByZXR1cm4gMDsKK30KKworLyogSW50ZXJuYWwgZnVuY3Rpb24uICBSZWdpc3RlciBhbGwgdGhlIHB1YmtleXMgaW5jbHVkZWQgaW4KKyAgIFBVQktFWV9UQUJMRS4gIFJldHVybnMgemVybyBvbiBzdWNjZXNzIG9yIGFuIGVycm9yIGNvZGUuICAqLworc3RhdGljIHZvaWQKK3BrX3JlZ2lzdGVyX2RlZmF1bHQgKHZvaWQpCit7CisgIGdjcnlfZXJyX2NvZGVfdCBlcnIgPSAwOworICBpbnQgaTsKKyAgCisgIGZvciAoaSA9IDA7ICghIGVycikgJiYgcHVia2V5X3RhYmxlW2ldLnB1YmtleTsgaSsrKQorICAgIHsKKyNkZWZpbmUgcHVia2V5X3VzZV9kdW1teShmdW5jKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYgKCEgcHVia2V5X3RhYmxlW2ldLnB1YmtleS0+ZnVuYykgICAgICAgICAgICBcCisJcHVia2V5X3RhYmxlW2ldLnB1YmtleS0+ZnVuYyA9IGR1bW15XyMjZnVuYzsKKworICAgICAgcHVia2V5X3VzZV9kdW1teSAoZ2VuZXJhdGUpOworICAgICAgcHVia2V5X3VzZV9kdW1teSAoY2hlY2tfc2VjcmV0X2tleSk7CisgICAgICBwdWJrZXlfdXNlX2R1bW15IChlbmNyeXB0KTsKKyAgICAgIHB1YmtleV91c2VfZHVtbXkgKGRlY3J5cHQpOworICAgICAgcHVia2V5X3VzZV9kdW1teSAoc2lnbik7CisgICAgICBwdWJrZXlfdXNlX2R1bW15ICh2ZXJpZnkpOworICAgICAgcHVia2V5X3VzZV9kdW1teSAoZ2V0X25iaXRzKTsKKyN1bmRlZiBwdWJrZXlfdXNlX2R1bW15CisKKyAgICAgIGVyciA9IF9nY3J5X21vZHVsZV9hZGQgKCZwdWJrZXlzX3JlZ2lzdGVyZWQsCisJCQkgICAgICBwdWJrZXlfdGFibGVbaV0uYWxnb3JpdGhtLAorCQkJICAgICAgKHZvaWQgKikgcHVia2V5X3RhYmxlW2ldLnB1YmtleSwgCisJCQkgICAgICAodm9pZCAqKSBwdWJrZXlfdGFibGVbaV0uZXh0cmFzcGVjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIH0KKworICBpZiAoZXJyKQorICAgIEJVRyAoKTsKK30KKworLyogSW50ZXJuYWwgY2FsbGJhY2sgZnVuY3Rpb24uICBVc2VkIHZpYSBfZ2NyeV9tb2R1bGVfbG9va3VwLiAgKi8KK3N0YXRpYyBpbnQKK2djcnlfcGtfbG9va3VwX2Z1bmNfbmFtZSAodm9pZCAqc3BlYywgdm9pZCAqZGF0YSkKK3sKKyAgZ2NyeV9wa19zcGVjX3QgKnB1YmtleSA9IChnY3J5X3BrX3NwZWNfdCAqKSBzcGVjOworICBjaGFyICpuYW1lID0gKGNoYXIgKikgZGF0YTsKKyAgY29uc3QgY2hhciAqKmFsaWFzZXMgPSBwdWJrZXktPmFsaWFzZXM7CisgIGludCByZXQgPSBzdHJpY21wIChuYW1lLCBwdWJrZXktPm5hbWUpOworCisgIHdoaWxlIChyZXQgJiYgKmFsaWFzZXMpCisgICAgcmV0ID0gc3RyaWNtcCAobmFtZSwgKmFsaWFzZXMrKyk7CisKKyAgcmV0dXJuICEgcmV0OworfQorCisvKiBJbnRlcm5hbCBmdW5jdGlvbi4gIExvb2t1cCBhIHB1YmtleSBlbnRyeSBieSBpdCdzIG5hbWUuICAqLworc3RhdGljIGdjcnlfbW9kdWxlX3QgCitnY3J5X3BrX2xvb2t1cF9uYW1lIChjb25zdCBjaGFyICpuYW1lKQoreworICBnY3J5X21vZHVsZV90IHB1YmtleTsKKworICBwdWJrZXkgPSBfZ2NyeV9tb2R1bGVfbG9va3VwIChwdWJrZXlzX3JlZ2lzdGVyZWQsICh2b2lkICopIG5hbWUsCisJCQkJZ2NyeV9wa19sb29rdXBfZnVuY19uYW1lKTsKKworICByZXR1cm4gcHVia2V5OworfQorCisvKiBSZWdpc3RlciBhIG5ldyBwdWJrZXkgbW9kdWxlIHdob3NlIHNwZWNpZmljYXRpb24gY2FuIGJlIGZvdW5kIGluCisgICBQVUJLRVkuICBPbiBzdWNjZXNzLCBhIG5ldyBhbGdvcml0aG0gSUQgaXMgc3RvcmVkIGluIEFMR09SSVRITV9JRAorICAgYW5kIGEgcG9pbnRlciByZXByZXNlbnRoaW5nIHRoaXMgbW9kdWxlIGlzIHN0b3JlZCBpbiBNT0RVTEUuICAqLworZ2NyeV9lcnJvcl90CitfZ2NyeV9wa19yZWdpc3RlciAoZ2NyeV9wa19zcGVjX3QgKnB1YmtleSwKKyAgICAgICAgICAgICAgICAgICBwa19leHRyYV9zcGVjX3QgKmV4dHJhc3BlYywKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmFsZ29yaXRobV9pZCwKKyAgICAgICAgICAgICAgICAgICBnY3J5X21vZHVsZV90ICptb2R1bGUpCit7CisgIGdjcnlfZXJyX2NvZGVfdCBlcnIgPSBHUEdfRVJSX05PX0VSUk9SOworICBnY3J5X21vZHVsZV90IG1vZDsKKworICAvKiBXZSBkbyBub3Qgc3VwcG9ydCBtb2R1bGUgbG9hZGluZyBpbiBmaXBzIG1vZGUuICAqLworICBpZiAoZmlwc19tb2RlICgpKQorICAgIHJldHVybiBncGdfZXJyb3IgKEdQR19FUlJfTk9UX1NVUFBPUlRFRCk7CisKKyAgYXRoX211dGV4X2xvY2sgKCZwdWJrZXlzX3JlZ2lzdGVyZWRfbG9jayk7CisgIGVyciA9IF9nY3J5X21vZHVsZV9hZGQgKCZwdWJrZXlzX3JlZ2lzdGVyZWQsIDAsCisJCQkgICh2b2lkICopIHB1YmtleSwgCisJCQkgICh2b2lkICopKGV4dHJhc3BlYz8gZXh0cmFzcGVjIDogJmR1bW15X2V4dHJhX3NwZWMpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZCk7CisgIGF0aF9tdXRleF91bmxvY2sgKCZwdWJrZXlzX3JlZ2lzdGVyZWRfbG9jayk7CisKKyAgaWYgKCEgZXJyKQorICAgIHsKKyAgICAgICptb2R1bGUgPSBtb2Q7CisgICAgICAqYWxnb3JpdGhtX2lkID0gbW9kLT5tb2RfaWQ7CisgICAgfQorCisgIHJldHVybiBlcnI7Cit9CisKKy8qIFVucmVnaXN0ZXIgdGhlIHB1YmtleSBpZGVudGlmaWVkIGJ5IElELCB3aGljaCBtdXN0IGhhdmUgYmVlbgorICAgcmVnaXN0ZXJlZCB3aXRoIGdjcnlfcGtfcmVnaXN0ZXIuICAqLwordm9pZAorZ2NyeV9wa191bnJlZ2lzdGVyIChnY3J5X21vZHVsZV90IG1vZHVsZSkKK3sKKyAgYXRoX211dGV4X2xvY2sgKCZwdWJrZXlzX3JlZ2lzdGVyZWRfbG9jayk7CisgIF9nY3J5X21vZHVsZV9yZWxlYXNlIChtb2R1bGUpOworICBhdGhfbXV0ZXhfdW5sb2NrICgmcHVia2V5c19yZWdpc3RlcmVkX2xvY2spOworfQorCitzdGF0aWMgdm9pZAorcmVsZWFzZV9tcGlfYXJyYXkgKGdjcnlfbXBpX3QgKmFycmF5KQoreworICBmb3IgKDsgKmFycmF5OyBhcnJheSsrKQorICAgIHsKKyAgICAgIG1waV9mcmVlKCphcnJheSk7CisgICAgICAqYXJyYXkgPSBOVUxMOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioKKyAqIE1hcCBhIHN0cmluZyB0byB0aGUgcHVia2V5IGFsZ28KKyAqLworaW50CitnY3J5X3BrX21hcF9uYW1lIChjb25zdCBjaGFyICpzdHJpbmcpCit7CisgIGdjcnlfbW9kdWxlX3QgcHVia2V5OworICBpbnQgYWxnb3JpdGhtID0gMDsKKworICBpZiAoIXN0cmluZykKKyAgICByZXR1cm4gMDsKKworICBSRUdJU1RFUl9ERUZBVUxUX1BVQktFWVM7CisKKyAgYXRoX211dGV4X2xvY2sgKCZwdWJrZXlzX3JlZ2lzdGVyZWRfbG9jayk7CisgIHB1YmtleSA9IGdjcnlfcGtfbG9va3VwX25hbWUgKHN0cmluZyk7CisgIGlmIChwdWJrZXkpCisgICAgeworICAgICAgYWxnb3JpdGhtID0gcHVia2V5LT5tb2RfaWQ7CisgICAgICBfZ2NyeV9tb2R1bGVfcmVsZWFzZSAocHVia2V5KTsKKyAgICB9CisgIGF0aF9tdXRleF91bmxvY2sgKCZwdWJrZXlzX3JlZ2lzdGVyZWRfbG9jayk7CisKKyAgcmV0dXJuIGFsZ29yaXRobTsKK30KKworCisvKiBNYXAgdGhlIHB1YmxpYyBrZXkgYWxnb3JpdGhtIHdob3NlIElEIGlzIGNvbnRhaW5lZCBpbiBBTEdPUklUSE0gdG8KKyAgIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhbGdvcml0aG0gbmFtZS4gIEZvciB1bmtub3duCisgICBhbGdvcml0aG0gSURzIHRoaXMgZnVuY3Rpb25zIHJldHVybnMgIj8iLiAqLworY29uc3QgY2hhciAqCitnY3J5X3BrX2FsZ29fbmFtZSAoaW50IGFsZ29yaXRobSkKK3sKKyAgZ2NyeV9tb2R1bGVfdCBwdWJrZXk7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisKKyAgUkVHSVNURVJfREVGQVVMVF9QVUJLRVlTOworCisgIGF0aF9tdXRleF9sb2NrICgmcHVia2V5c19yZWdpc3RlcmVkX2xvY2spOworICBwdWJrZXkgPSBfZ2NyeV9tb2R1bGVfbG9va3VwX2lkIChwdWJrZXlzX3JlZ2lzdGVyZWQsIGFsZ29yaXRobSk7CisgIGlmIChwdWJrZXkpCisgICAgeworICAgICAgbmFtZSA9ICgoZ2NyeV9wa19zcGVjX3QgKikgcHVia2V5LT5zcGVjKS0+bmFtZTsKKyAgICAgIF9nY3J5X21vZHVsZV9yZWxlYXNlIChwdWJrZXkpOworICAgIH0KKyAgZWxzZQorICAgIG5hbWUgPSAiPyI7CisgIGF0aF9tdXRleF91bmxvY2sgKCZwdWJrZXlzX3JlZ2lzdGVyZWRfbG9jayk7CisKKyAgcmV0dXJuIG5hbWU7Cit9CisKKworLyogQSBzcGVjaWFsIHZlcnNpb24gb2YgZ2NyeV9wa19hbGdvIG5hbWUgdG8gcmV0dXJuIHRoZSBmaXJzdCBhbGlhc2VkCisgICBuYW1lIG9mIHRoZSBhbGdvcml0aG0uICBUaGlzIGlzIHJlcXVpcmVkIHRvIGFkaGVyZSB0byB0aGUgc3BraQorICAgc3BlY3Mgd2hlcmUgdGhlIGFsZ29yaXRobSBuYW1lcyBhcmUgbG93ZXJjYXNlLiAqLworY29uc3QgY2hhciAqCitfZ2NyeV9wa19hbGlhc2VkX2FsZ29fbmFtZSAoaW50IGFsZ29yaXRobSkKK3sKKyAgY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7CisgIGdjcnlfbW9kdWxlX3QgbW9kdWxlOworCisgIFJFR0lTVEVSX0RFRkFVTFRfUFVCS0VZUzsKKworICBhdGhfbXV0ZXhfbG9jayAoJnB1YmtleXNfcmVnaXN0ZXJlZF9sb2NrKTsKKyAgbW9kdWxlID0gX2djcnlfbW9kdWxlX2xvb2t1cF9pZCAocHVia2V5c19yZWdpc3RlcmVkLCBhbGdvcml0aG0pOworICBpZiAobW9kdWxlKQorICAgIHsKKyAgICAgIGdjcnlfcGtfc3BlY190ICpwdWJrZXkgPSAoZ2NyeV9wa19zcGVjX3QgKikgbW9kdWxlLT5zcGVjOworCisgICAgICBuYW1lID0gcHVia2V5LT5hbGlhc2VzPyAqcHVia2V5LT5hbGlhc2VzIDogTlVMTDsKKyAgICAgIGlmICghbmFtZSB8fCAhKm5hbWUpCisgICAgICAgIG5hbWUgPSBwdWJrZXktPm5hbWU7CisgICAgICBfZ2NyeV9tb2R1bGVfcmVsZWFzZSAobW9kdWxlKTsKKyAgICB9CisgIGF0aF9tdXRleF91bmxvY2sgKCZwdWJrZXlzX3JlZ2lzdGVyZWRfbG9jayk7CisKKyAgcmV0dXJuIG5hbWU7Cit9CisKKworc3RhdGljIHZvaWQKK2Rpc2FibGVfcHVia2V5X2FsZ28gKGludCBhbGdvcml0aG0pCit7CisgIGdjcnlfbW9kdWxlX3QgcHVia2V5OworCisgIGF0aF9tdXRleF9sb2NrICgmcHVia2V5c19yZWdpc3RlcmVkX2xvY2spOworICBwdWJrZXkgPSBfZ2NyeV9tb2R1bGVfbG9va3VwX2lkIChwdWJrZXlzX3JlZ2lzdGVyZWQsIGFsZ29yaXRobSk7CisgIGlmIChwdWJrZXkpCisgICAgeworICAgICAgaWYgKCEgKHB1YmtleS0+IGZsYWdzICYgRkxBR19NT0RVTEVfRElTQUJMRUQpKQorCXB1YmtleS0+ZmxhZ3MgfD0gRkxBR19NT0RVTEVfRElTQUJMRUQ7CisgICAgICBfZ2NyeV9tb2R1bGVfcmVsZWFzZSAocHVia2V5KTsKKyAgICB9CisgIGF0aF9tdXRleF91bmxvY2sgKCZwdWJrZXlzX3JlZ2lzdGVyZWRfbG9jayk7Cit9CisKKworLyoqKioqKioqKioqKioqKioKKyAqIEEgVVNFIG9mIDAgbWVhbnM6IGRvbid0IGNhcmUuCisgKi8KK3N0YXRpYyBnY3J5X2Vycl9jb2RlX3QKK2NoZWNrX3B1YmtleV9hbGdvIChpbnQgYWxnb3JpdGhtLCB1bnNpZ25lZCB1c2UpCit7CisgIGdjcnlfZXJyX2NvZGVfdCBlcnIgPSBHUEdfRVJSX05PX0VSUk9SOworICBnY3J5X3BrX3NwZWNfdCAqcHVia2V5OworICBnY3J5X21vZHVsZV90IG1vZHVsZTsKKworICBSRUdJU1RFUl9ERUZBVUxUX1BVQktFWVM7CisKKyAgYXRoX211dGV4X2xvY2sgKCZwdWJrZXlzX3JlZ2lzdGVyZWRfbG9jayk7CisgIG1vZHVsZSA9IF9nY3J5X21vZHVsZV9sb29rdXBfaWQgKHB1YmtleXNfcmVnaXN0ZXJlZCwgYWxnb3JpdGhtKTsKKyAgaWYgKG1vZHVsZSkKKyAgICB7CisgICAgICBwdWJrZXkgPSAoZ2NyeV9wa19zcGVjX3QgKikgbW9kdWxlLT5zcGVjOworCisgICAgICBpZiAoKCh1c2UgJiBHQ1JZX1BLX1VTQUdFX1NJR04pCisJICAgJiYgKCEgKHB1YmtleS0+dXNlICYgR0NSWV9QS19VU0FHRV9TSUdOKSkpCisJICB8fCAoKHVzZSAmIEdDUllfUEtfVVNBR0VfRU5DUikKKwkgICAgICAmJiAoISAocHVia2V5LT51c2UgJiBHQ1JZX1BLX1VTQUdFX0VOQ1IpKSkpCisJZXJyID0gR1BHX0VSUl9XUk9OR19QVUJLRVlfQUxHTzsKKyAgICAgIGVsc2UgaWYgKG1vZHVsZS0+ZmxhZ3MgJiBGTEFHX01PRFVMRV9ESVNBQkxFRCkKKwllcnIgPSBHUEdfRVJSX1BVQktFWV9BTEdPOworICAgICAgX2djcnlfbW9kdWxlX3JlbGVhc2UgKG1vZHVsZSk7CisgICAgfQorICBlbHNlCisgICAgZXJyID0gR1BHX0VSUl9QVUJLRVlfQUxHTzsKKyAgYXRoX211dGV4X3VubG9jayAoJnB1YmtleXNfcmVnaXN0ZXJlZF9sb2NrKTsKKworICByZXR1cm4gZXJyOworfQorCisKKy8qKioqKioqKioqKioqKioqCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBwdWJsaWMga2V5IG1hdGVyaWFsIG51bWJlcnMKKyAqLworc3RhdGljIGludAorcHVia2V5X2dldF9ucGtleSAoaW50IGFsZ29yaXRobSkKK3sKKyAgZ2NyeV9tb2R1bGVfdCBwdWJrZXk7CisgIGludCBucGtleSA9IDA7CisKKyAgUkVHSVNURVJfREVGQVVMVF9QVUJLRVlTOworCisgIGF0aF9tdXRleF9sb2NrICgmcHVia2V5c19yZWdpc3RlcmVkX2xvY2spOworICBwdWJrZXkgPSBfZ2NyeV9tb2R1bGVfbG9va3VwX2lkIChwdWJrZXlzX3JlZ2lzdGVyZWQsIGFsZ29yaXRobSk7CisgIGlmIChwdWJrZXkpCisgICAgeworICAgICAgbnBrZXkgPSBzdHJsZW4gKCgoZ2NyeV9wa19zcGVjX3QgKikgcHVia2V5LT5zcGVjKS0+ZWxlbWVudHNfcGtleSk7CisgICAgICBfZ2NyeV9tb2R1bGVfcmVsZWFzZSAocHVia2V5KTsKKyAgICB9CisgIGF0aF9tdXRleF91bmxvY2sgKCZwdWJrZXlzX3JlZ2lzdGVyZWRfbG9jayk7CisKKyAgcmV0dXJuIG5wa2V5OworfQorCisvKioqKioqKioqKioqKioqKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygc2VjcmV0IGtleSBtYXRlcmlhbCBudW1iZXJzCisgKi8KK3N0YXRpYyBpbnQKK3B1YmtleV9nZXRfbnNrZXkgKGludCBhbGdvcml0aG0pCit7CisgIGdjcnlfbW9kdWxlX3QgcHVia2V5OworICBpbnQgbnNrZXkgPSAwOworCisgIFJFR0lTVEVSX0RFRkFVTFRfUFVCS0VZUzsKKworICBhdGhfbXV0ZXhfbG9jayAoJnB1YmtleXNfcmVnaXN0ZXJlZF9sb2NrKTsKKyAgcHVia2V5ID0gX2djcnlfbW9kdWxlX2xvb2t1cF9pZCAocHVia2V5c19yZWdpc3RlcmVkLCBhbGdvcml0aG0pOworICBpZiAocHVia2V5KQorICAgIHsKKyAgICAgIG5za2V5ID0gc3RybGVuICgoKGdjcnlfcGtfc3BlY190ICopIHB1YmtleS0+c3BlYyktPmVsZW1lbnRzX3NrZXkpOworICAgICAgX2djcnlfbW9kdWxlX3JlbGVhc2UgKHB1YmtleSk7CisgICAgfQorICBhdGhfbXV0ZXhfdW5sb2NrICgmcHVia2V5c19yZWdpc3RlcmVkX2xvY2spOworCisgIHJldHVybiBuc2tleTsKK30KKworLyoqKioqKioqKioqKioqKioKKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHNpZ25hdHVyZSBtYXRlcmlhbCBudW1iZXJzCisgKi8KK3N0YXRpYyBpbnQKK3B1YmtleV9nZXRfbnNpZyAoaW50IGFsZ29yaXRobSkKK3sKKyAgZ2NyeV9tb2R1bGVfdCBwdWJrZXk7CisgIGludCBuc2lnID0gMDsKKworICBSRUdJU1RFUl9ERUZBVUxUX1BVQktFWVM7CisKKyAgYXRoX211dGV4X2xvY2sgKCZwdWJrZXlzX3JlZ2lzdGVyZWRfbG9jayk7CisgIHB1YmtleSA9IF9nY3J5X21vZHVsZV9sb29rdXBfaWQgKHB1YmtleXNfcmVnaXN0ZXJlZCwgYWxnb3JpdGhtKTsKKyAgaWYgKHB1YmtleSkKKyAgICB7CisgICAgICBuc2lnID0gc3RybGVuICgoKGdjcnlfcGtfc3BlY190ICopIHB1YmtleS0+c3BlYyktPmVsZW1lbnRzX3NpZyk7CisgICAgICBfZ2NyeV9tb2R1bGVfcmVsZWFzZSAocHVia2V5KTsKKyAgICB9CisgIGF0aF9tdXRleF91bmxvY2sgKCZwdWJrZXlzX3JlZ2lzdGVyZWRfbG9jayk7CisKKyAgcmV0dXJuIG5zaWc7Cit9CisKKy8qKioqKioqKioqKioqKioqCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBlbmNyeXB0aW9uIG1hdGVyaWFsIG51bWJlcnMKKyAqLworc3RhdGljIGludAorcHVia2V5X2dldF9uZW5jIChpbnQgYWxnb3JpdGhtKQoreworICBnY3J5X21vZHVsZV90IHB1YmtleTsKKyAgaW50IG5lbmMgPSAwOworCisgIFJFR0lTVEVSX0RFRkFVTFRfUFVCS0VZUzsKKworICBhdGhfbXV0ZXhfbG9jayAoJnB1YmtleXNfcmVnaXN0ZXJlZF9sb2NrKTsKKyAgcHVia2V5ID0gX2djcnlfbW9kdWxlX2xvb2t1cF9pZCAocHVia2V5c19yZWdpc3RlcmVkLCBhbGdvcml0aG0pOworICBpZiAocHVia2V5KQorICAgIHsKKyAgICAgIG5lbmMgPSBzdHJsZW4gKCgoZ2NyeV9wa19zcGVjX3QgKikgcHVia2V5LT5zcGVjKS0+ZWxlbWVudHNfZW5jKTsKKyAgICAgIF9nY3J5X21vZHVsZV9yZWxlYXNlIChwdWJrZXkpOworICAgIH0KKyAgYXRoX211dGV4X3VubG9jayAoJnB1YmtleXNfcmVnaXN0ZXJlZF9sb2NrKTsKKworICByZXR1cm4gbmVuYzsKK30KKworCisvKiBHZW5lcmF0ZSBhIG5ldyBwdWJsaWMga2V5IHdpdGggYWxnb3JpdGhtIEFMR09SSVRITSBvZiBzaXplIE5CSVRTCisgICBhbmQgcmV0dXJuIGl0IGF0IFNLRVkuICBVU0VfRSBkZXBlbmRzIG9uIHRoZSBBTEdPUklUSE0uICBHRU5QQVJNUworICAgaXMgcGFzc2VkIHRvIHRoZSBhbGdvcml0aG0gbW9kdWxlIGlmIGl0IGZlYXR1cmVzIGFuIGV4dGVuZGVkCisgICBnZW5lcmF0aW9uIGZ1bmN0aW9uLiAgUkVURkFDVE9SIGlzIHVzZWQgYnkgc29tZSBhbGdvcml0aG1zIHRvCisgICByZXR1cm4gY2VydGFpbiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHdoaWNoIGFyZSBpbiBnZW5lcmFsIG5vdAorICAgcmVxdWlyZWQuCisKKyAgIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBlcnJvciBjb2RlIG51bWJlciBvciAwIG9uIHN1Y2Nlc3MuICovCitzdGF0aWMgZ2NyeV9lcnJfY29kZV90CitwdWJrZXlfZ2VuZXJhdGUgKGludCBhbGdvcml0aG0sCisgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuYml0cywKKyAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyB1c2VfZSwKKyAgICAgICAgICAgICAgICAgZ2NyeV9zZXhwX3QgZ2VucGFybXMsCisgICAgICAgICAgICAgICAgIGdjcnlfbXBpX3QgKnNrZXksIGdjcnlfbXBpX3QgKipyZXRmYWN0b3JzLAorICAgICAgICAgICAgICAgICBnY3J5X3NleHBfdCAqcl9leHRyYWluZm8pCit7CisgIGdjcnlfZXJyX2NvZGVfdCBlYyA9IEdQR19FUlJfUFVCS0VZX0FMR087CisgIGdjcnlfbW9kdWxlX3QgcHVia2V5OworCisgIFJFR0lTVEVSX0RFRkFVTFRfUFVCS0VZUzsKKworICBhdGhfbXV0ZXhfbG9jayAoJnB1YmtleXNfcmVnaXN0ZXJlZF9sb2NrKTsKKyAgcHVia2V5ID0gX2djcnlfbW9kdWxlX2xvb2t1cF9pZCAocHVia2V5c19yZWdpc3RlcmVkLCBhbGdvcml0aG0pOworICBpZiAocHVia2V5KQorICAgIHsKKyAgICAgIHBrX2V4dHJhX3NwZWNfdCAqZXh0cmFzcGVjID0gcHVia2V5LT5leHRyYXNwZWM7CisKKyAgICAgIGlmIChleHRyYXNwZWMgJiYgZXh0cmFzcGVjLT5leHRfZ2VuZXJhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBVc2UgdGhlIGV4dGVuZGVkIGdlbmVyYXRlIGZ1bmN0aW9uLiAgKi8KKyAgICAgICAgICBlYyA9IGV4dHJhc3BlYy0+ZXh0X2dlbmVyYXRlIAorICAgICAgICAgICAgKGFsZ29yaXRobSwgbmJpdHMsIHVzZV9lLCBnZW5wYXJtcywgc2tleSwgcmV0ZmFjdG9ycywgcl9leHRyYWluZm8pOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBVc2UgdGhlIHN0YW5kYXJkIGdlbmVyYXRlIGZ1bmN0aW9uLiAgKi8KKyAgICAgICAgICBlYyA9ICgoZ2NyeV9wa19zcGVjX3QgKikgcHVia2V5LT5zcGVjKS0+Z2VuZXJhdGUgCisgICAgICAgICAgICAoYWxnb3JpdGhtLCBuYml0cywgdXNlX2UsIHNrZXksIHJldGZhY3RvcnMpOworICAgICAgICB9CisgICAgICBfZ2NyeV9tb2R1bGVfcmVsZWFzZSAocHVia2V5KTsKKyAgICB9CisgIGF0aF9tdXRleF91bmxvY2sgKCZwdWJrZXlzX3JlZ2lzdGVyZWRfbG9jayk7CisKKyAgcmV0dXJuIGVjOworfQorCisKK3N0YXRpYyBnY3J5X2Vycl9jb2RlX3QKK3B1YmtleV9jaGVja19zZWNyZXRfa2V5IChpbnQgYWxnb3JpdGhtLCBnY3J5X21waV90ICpza2V5KQoreworICBnY3J5X2Vycl9jb2RlX3QgZXJyID0gR1BHX0VSUl9QVUJLRVlfQUxHTzsKKyAgZ2NyeV9tb2R1bGVfdCBwdWJrZXk7CisKKyAgUkVHSVNURVJfREVGQVVMVF9QVUJLRVlTOworCisgIGF0aF9tdXRleF9sb2NrICgmcHVia2V5c19yZWdpc3RlcmVkX2xvY2spOworICBwdWJrZXkgPSBfZ2NyeV9tb2R1bGVfbG9va3VwX2lkIChwdWJrZXlzX3JlZ2lzdGVyZWQsIGFsZ29yaXRobSk7CisgIGlmIChwdWJrZXkpCisgICAgeworICAgICAgZXJyID0gKChnY3J5X3BrX3NwZWNfdCAqKSBwdWJrZXktPnNwZWMpLT5jaGVja19zZWNyZXRfa2V5CisgICAgICAgIChhbGdvcml0aG0sIHNrZXkpOworICAgICAgX2djcnlfbW9kdWxlX3JlbGVhc2UgKHB1YmtleSk7CisgICAgfQorICBhdGhfbXV0ZXhfdW5sb2NrICgmcHVia2V5c19yZWdpc3RlcmVkX2xvY2spOworCisgIHJldHVybiBlcnI7Cit9CisKKworLyoqKioqKioqKioqKioqKioKKyAqIFRoaXMgaXMgdGhlIGludGVyZmFjZSB0byB0aGUgcHVibGljIGtleSBlbmNyeXB0aW9uLiAgRW5jcnlwdCBEQVRBCisgKiB3aXRoIFBLRVkgYW5kIHB1dCBpdCBpbnRvIFJFU0FSUiB3aGljaCBzaG91bGQgYmUgYW4gYXJyYXkgb2YgTVBJcworICogb2Ygc2l6ZSBQVUJLRVlfTUFYX05FTkMgKG9yIGxlc3MgaWYgdGhlIGFsZ29yaXRobSBhbGxvd3MgdGhpcyAtCisgKiBjaGVjayB3aXRoIHB1YmtleV9nZXRfbmVuYygpICkKKyAqLworc3RhdGljIGdjcnlfZXJyX2NvZGVfdAorcHVia2V5X2VuY3J5cHQgKGludCBhbGdvcml0aG0sIGdjcnlfbXBpX3QgKnJlc2FyciwgZ2NyeV9tcGlfdCBkYXRhLAorICAgICAgICAgICAgICAgIGdjcnlfbXBpX3QgKnBrZXksIGludCBmbGFncykKK3sKKyAgZ2NyeV9wa19zcGVjX3QgKnB1YmtleTsKKyAgZ2NyeV9tb2R1bGVfdCBtb2R1bGU7CisgIGdjcnlfZXJyX2NvZGVfdCByYzsKKyAgaW50IGk7CisKKyAgLyogTm90ZTogSW4gZmlwcyBtb2RlIERCR19DSVBIRVIgd2lsbCBlbnZlciBldmFsdWF0ZSB0byB0cnVlIGJ1dCBhcworICAgICBhbiBleHRyYSBmYWlsc2FmZSBwcm90ZWN0aW9uIHdlIGV4cGxpY2l0bHkgdGVzdCBmb3IgZmlwcyBtb2RlCisgICAgIGhlcmUuICovIAorICBpZiAoREJHX0NJUEhFUiAmJiAhZmlwc19tb2RlICgpKQorICAgIHsKKyAgICAgIGxvZ19kZWJ1ZyAoInB1YmtleV9lbmNyeXB0OiBhbGdvPSVkXG4iLCBhbGdvcml0aG0pOworICAgICAgZm9yKGkgPSAwOyBpIDwgcHVia2V5X2dldF9ucGtleSAoYWxnb3JpdGhtKTsgaSsrKQorCWxvZ19tcGlkdW1wICgiICBwa2V5OiIsIHBrZXlbaV0pOworICAgICAgbG9nX21waWR1bXAgKCIgIGRhdGE6IiwgZGF0YSk7CisgICAgfQorCisgIGF0aF9tdXRleF9sb2NrICgmcHVia2V5c19yZWdpc3RlcmVkX2xvY2spOworICBtb2R1bGUgPSBfZ2NyeV9tb2R1bGVfbG9va3VwX2lkIChwdWJrZXlzX3JlZ2lzdGVyZWQsIGFsZ29yaXRobSk7CisgIGlmIChtb2R1bGUpCisgICAgeworICAgICAgcHVia2V5ID0gKGdjcnlfcGtfc3BlY190ICopIG1vZHVsZS0+c3BlYzsKKyAgICAgIHJjID0gcHVia2V5LT5lbmNyeXB0IChhbGdvcml0aG0sIHJlc2FyciwgZGF0YSwgcGtleSwgZmxhZ3MpOworICAgICAgX2djcnlfbW9kdWxlX3JlbGVhc2UgKG1vZHVsZSk7CisgICAgICBnb3RvIHJlYWR5OworICAgIH0KKyAgcmMgPSBHUEdfRVJSX1BVQktFWV9BTEdPOworCisgcmVhZHk6CisgIGF0aF9tdXRleF91bmxvY2sgKCZwdWJrZXlzX3JlZ2lzdGVyZWRfbG9jayk7CisKKyAgaWYgKCFyYyAmJiBEQkdfQ0lQSEVSICYmICFmaXBzX21vZGUgKCkpCisgICAgeworICAgICAgZm9yKGkgPSAwOyBpIDwgcHVia2V5X2dldF9uZW5jIChhbGdvcml0aG0pOyBpKyspCisJbG9nX21waWR1bXAoIiAgZW5jcjoiLCByZXNhcnJbaV0gKTsKKyAgICB9CisgIHJldHVybiByYzsKK30KKworCisvKioqKioqKioqKioqKioqKgorICogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIHRvIHRoZSBwdWJsaWMga2V5IGRlY3J5cHRpb24uCisgKiBBTEdPIGdpdmVzIHRoZSBhbGdvcml0aG0gdG8gdXNlIGFuZCB0aGlzIGltcGxpY2l0bHkgZGV0ZXJtaW5lcworICogdGhlIHNpemUgb2YgdGhlIGFycmF5cy4KKyAqIHJlc3VsdCBpcyBhIHBvaW50ZXIgdG8gYSBtcGkgdmFyaWFibGUgd2hpY2ggd2lsbCByZWNlaXZlIGEKKyAqIG5ld2x5IGFsbG9jYXRlZCBtcGkgb3IgTlVMTCBpbiBjYXNlIG9mIGFuIGVycm9yLgorICovCitzdGF0aWMgZ2NyeV9lcnJfY29kZV90CitwdWJrZXlfZGVjcnlwdCAoaW50IGFsZ29yaXRobSwgZ2NyeV9tcGlfdCAqcmVzdWx0LCBnY3J5X21waV90ICpkYXRhLAorICAgICAgICAgICAgICAgIGdjcnlfbXBpX3QgKnNrZXksIGludCBmbGFncykKK3sKKyAgZ2NyeV9wa19zcGVjX3QgKnB1YmtleTsKKyAgZ2NyeV9tb2R1bGVfdCBtb2R1bGU7CisgIGdjcnlfZXJyX2NvZGVfdCByYzsKKyAgaW50IGk7CisKKyAgKnJlc3VsdCA9IE5VTEw7IC8qIHNvIHRoZSBjYWxsZXIgY2FuIGFsd2F5cyBkbyBhIG1waV9mcmVlICovCisgIGlmIChEQkdfQ0lQSEVSICYmICFmaXBzX21vZGUgKCkpCisgICAgeworICAgICAgbG9nX2RlYnVnICgicHVia2V5X2RlY3J5cHQ6IGFsZ289JWRcbiIsIGFsZ29yaXRobSk7CisgICAgICBmb3IoaSA9IDA7IGkgPCBwdWJrZXlfZ2V0X25za2V5IChhbGdvcml0aG0pOyBpKyspCisJbG9nX21waWR1bXAgKCIgIHNrZXk6Iiwgc2tleVtpXSk7CisgICAgICBmb3IoaSA9IDA7IGkgPCBwdWJrZXlfZ2V0X25lbmMgKGFsZ29yaXRobSk7IGkrKykKKwlsb2dfbXBpZHVtcCAoIiAgZGF0YToiLCBkYXRhW2ldKTsKKyAgICB9CisKKyAgYXRoX211dGV4X2xvY2sgKCZwdWJrZXlzX3JlZ2lzdGVyZWRfbG9jayk7CisgIG1vZHVsZSA9IF9nY3J5X21vZHVsZV9sb29rdXBfaWQgKHB1YmtleXNfcmVnaXN0ZXJlZCwgYWxnb3JpdGhtKTsKKyAgaWYgKG1vZHVsZSkKKyAgICB7CisgICAgICBwdWJrZXkgPSAoZ2NyeV9wa19zcGVjX3QgKikgbW9kdWxlLT5zcGVjOworICAgICAgcmMgPSBwdWJrZXktPmRlY3J5cHQgKGFsZ29yaXRobSwgcmVzdWx0LCBkYXRhLCBza2V5LCBmbGFncyk7CisgICAgICBfZ2NyeV9tb2R1bGVfcmVsZWFzZSAobW9kdWxlKTsKKyAgICAgIGdvdG8gcmVhZHk7CisgICAgfQorCisgIHJjID0gR1BHX0VSUl9QVUJLRVlfQUxHTzsKKyAgCisgcmVhZHk6CisgIGF0aF9tdXRleF91bmxvY2sgKCZwdWJrZXlzX3JlZ2lzdGVyZWRfbG9jayk7CisKKyAgaWYgKCFyYyAmJiBEQkdfQ0lQSEVSICYmICFmaXBzX21vZGUgKCkpCisgICAgbG9nX21waWR1bXAgKCIgcGxhaW46IiwgKnJlc3VsdCk7CisKKyAgcmV0dXJuIHJjOworfQorCisKKy8qKioqKioqKioqKioqKioqCisgKiBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgdG8gdGhlIHB1YmxpYyBrZXkgc2lnbmluZy4KKyAqIFNpZ24gZGF0YSB3aXRoIHNrZXkgYW5kIHB1dCB0aGUgcmVzdWx0IGludG8gcmVzYXJyIHdoaWNoCisgKiBzaG91bGQgYmUgYW4gYXJyYXkgb2YgTVBJcyBvZiBzaXplIFBVQktFWV9NQVhfTlNJRyAob3IgbGVzcyBpZiB0aGUKKyAqIGFsZ29yaXRobSBhbGxvd3MgdGhpcyAtIGNoZWNrIHdpdGggcHVia2V5X2dldF9uc2lnKCkgKQorICovCitzdGF0aWMgZ2NyeV9lcnJfY29kZV90CitwdWJrZXlfc2lnbiAoaW50IGFsZ29yaXRobSwgZ2NyeV9tcGlfdCAqcmVzYXJyLCBnY3J5X21waV90IGRhdGEsCisgICAgICAgICAgICAgZ2NyeV9tcGlfdCAqc2tleSkKK3sKKyAgZ2NyeV9wa19zcGVjX3QgKnB1YmtleTsKKyAgZ2NyeV9tb2R1bGVfdCBtb2R1bGU7CisgIGdjcnlfZXJyX2NvZGVfdCByYzsKKyAgaW50IGk7CisKKyAgaWYgKERCR19DSVBIRVIgJiYgIWZpcHNfbW9kZSAoKSkKKyAgICB7CisgICAgICBsb2dfZGVidWcgKCJwdWJrZXlfc2lnbjogYWxnbz0lZFxuIiwgYWxnb3JpdGhtKTsKKyAgICAgIGZvcihpID0gMDsgaSA8IHB1YmtleV9nZXRfbnNrZXkgKGFsZ29yaXRobSk7IGkrKykKKwlsb2dfbXBpZHVtcCAoIiAgc2tleToiLCBza2V5W2ldKTsKKyAgICAgIGxvZ19tcGlkdW1wKCIgIGRhdGE6IiwgZGF0YSApOworICAgIH0KKworICBhdGhfbXV0ZXhfbG9jayAoJnB1YmtleXNfcmVnaXN0ZXJlZF9sb2NrKTsKKyAgbW9kdWxlID0gX2djcnlfbW9kdWxlX2xvb2t1cF9pZCAocHVia2V5c19yZWdpc3RlcmVkLCBhbGdvcml0aG0pOworICBpZiAobW9kdWxlKQorICAgIHsKKyAgICAgIHB1YmtleSA9IChnY3J5X3BrX3NwZWNfdCAqKSBtb2R1bGUtPnNwZWM7CisgICAgICByYyA9IHB1YmtleS0+c2lnbiAoYWxnb3JpdGhtLCByZXNhcnIsIGRhdGEsIHNrZXkpOworICAgICAgX2djcnlfbW9kdWxlX3JlbGVhc2UgKG1vZHVsZSk7CisgICAgICBnb3RvIHJlYWR5OworICAgIH0KKworICByYyA9IEdQR19FUlJfUFVCS0VZX0FMR087CisKKyByZWFkeToKKyAgYXRoX211dGV4X3VubG9jayAoJnB1YmtleXNfcmVnaXN0ZXJlZF9sb2NrKTsKKworICBpZiAoIXJjICYmIERCR19DSVBIRVIgJiYgIWZpcHNfbW9kZSAoKSkKKyAgICBmb3IgKGkgPSAwOyBpIDwgcHVia2V5X2dldF9uc2lnIChhbGdvcml0aG0pOyBpKyspCisgICAgICBsb2dfbXBpZHVtcCAoIiAgIHNpZzoiLCByZXNhcnJbaV0pOworCisgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioKKyAqIFZlcmlmeSBhIHB1YmxpYyBrZXkgc2lnbmF0dXJlLgorICogUmV0dXJuIDAgaWYgdGhlIHNpZ25hdHVyZSBpcyBnb29kCisgKi8KK3N0YXRpYyBnY3J5X2Vycl9jb2RlX3QKK3B1YmtleV92ZXJpZnkgKGludCBhbGdvcml0aG0sIGdjcnlfbXBpX3QgaGFzaCwgZ2NyeV9tcGlfdCAqZGF0YSwKKyAgICAgICAgICAgICAgIGdjcnlfbXBpX3QgKnBrZXksCisJICAgICAgIGludCAoKmNtcCkodm9pZCAqLCBnY3J5X21waV90KSwgdm9pZCAqb3BhcXVldikKK3sKKyAgZ2NyeV9wa19zcGVjX3QgKnB1YmtleTsKKyAgZ2NyeV9tb2R1bGVfdCBtb2R1bGU7CisgIGdjcnlfZXJyX2NvZGVfdCByYzsKKyAgaW50IGk7CisKKyAgaWYgKERCR19DSVBIRVIgJiYgIWZpcHNfbW9kZSAoKSkKKyAgICB7CisgICAgICBsb2dfZGVidWcgKCJwdWJrZXlfdmVyaWZ5OiBhbGdvPSVkXG4iLCBhbGdvcml0aG0pOworICAgICAgZm9yIChpID0gMDsgaSA8IHB1YmtleV9nZXRfbnBrZXkgKGFsZ29yaXRobSk7IGkrKykKKwlsb2dfbXBpZHVtcCAoIiAgcGtleToiLCBwa2V5W2ldKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBwdWJrZXlfZ2V0X25zaWcgKGFsZ29yaXRobSk7IGkrKykKKwlsb2dfbXBpZHVtcCAoIiAgIHNpZzoiLCBkYXRhW2ldKTsKKyAgICAgIGxvZ19tcGlkdW1wICgiICBoYXNoOiIsIGhhc2gpOworICAgIH0KKworICBhdGhfbXV0ZXhfbG9jayAoJnB1YmtleXNfcmVnaXN0ZXJlZF9sb2NrKTsKKyAgbW9kdWxlID0gX2djcnlfbW9kdWxlX2xvb2t1cF9pZCAocHVia2V5c19yZWdpc3RlcmVkLCBhbGdvcml0aG0pOworICBpZiAobW9kdWxlKQorICAgIHsKKyAgICAgIHB1YmtleSA9IChnY3J5X3BrX3NwZWNfdCAqKSBtb2R1bGUtPnNwZWM7CisgICAgICByYyA9IHB1YmtleS0+dmVyaWZ5IChhbGdvcml0aG0sIGhhc2gsIGRhdGEsIHBrZXksIGNtcCwgb3BhcXVldik7CisgICAgICBfZ2NyeV9tb2R1bGVfcmVsZWFzZSAobW9kdWxlKTsKKyAgICAgIGdvdG8gcmVhZHk7CisgICAgfQorCisgIHJjID0gR1BHX0VSUl9QVUJLRVlfQUxHTzsKKworIHJlYWR5OgorICBhdGhfbXV0ZXhfdW5sb2NrICgmcHVia2V5c19yZWdpc3RlcmVkX2xvY2spOworICByZXR1cm4gcmM7Cit9CisKKworLyogSW50ZXJuYWwgZnVuY3Rpb24uICAgKi8KK3N0YXRpYyBnY3J5X2Vycl9jb2RlX3QKK3NleHBfZWxlbWVudHNfZXh0cmFjdCAoZ2NyeV9zZXhwX3Qga2V5X3NleHAsIGNvbnN0IGNoYXIgKmVsZW1lbnRfbmFtZXMsCisJCSAgICAgICBnY3J5X21waV90ICplbGVtZW50cywgY29uc3QgY2hhciAqYWxnb19uYW1lKQoreworICBnY3J5X2Vycl9jb2RlX3QgZXJyID0gMDsKKyAgaW50IGksIGlkeDsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgZ2NyeV9zZXhwX3QgbGlzdDsKKworICBmb3IgKG5hbWUgPSBlbGVtZW50X25hbWVzLCBpZHggPSAwOyAqbmFtZSAmJiAhZXJyOyBuYW1lKyssIGlkeCsrKQorICAgIHsKKyAgICAgIGxpc3QgPSBnY3J5X3NleHBfZmluZF90b2tlbiAoa2V5X3NleHAsIG5hbWUsIDEpOworICAgICAgaWYgKCFsaXN0KQorCWVsZW1lbnRzW2lkeF0gPSBOVUxMOworICAgICAgZWxzZQorCXsKKwkgIGVsZW1lbnRzW2lkeF0gPSBnY3J5X3NleHBfbnRoX21waSAobGlzdCwgMSwgR0NSWU1QSV9GTVRfVVNHKTsKKwkgIGdjcnlfc2V4cF9yZWxlYXNlIChsaXN0KTsKKwkgIGlmICghZWxlbWVudHNbaWR4XSkKKwkgICAgZXJyID0gR1BHX0VSUl9JTlZfT0JKOworCX0KKyAgICB9CisKKyAgaWYgKCFlcnIpCisgICAgeworICAgICAgLyogQ2hlY2sgdGhhdCBhbGwgZWxlbWVudHMgYXJlIGF2YWlsYWJsZS4gICovCisgICAgICBmb3IgKG5hbWUgPSBlbGVtZW50X25hbWVzLCBpZHggPSAwOyAqbmFtZTsgbmFtZSsrLCBpZHgrKykKKyAgICAgICAgaWYgKCFlbGVtZW50c1tpZHhdKQorICAgICAgICAgIGJyZWFrOworICAgICAgaWYgKCpuYW1lKQorICAgICAgICB7CisgICAgICAgICAgZXJyID0gR1BHX0VSUl9OT19PQko7CisgICAgICAgICAgLyogU29tZSBhcmUgbWlzc2luZy4gIEJlZm9yZSBiYWlsaW5nIG91dCB3ZSB0ZXN0IGZvcgorICAgICAgICAgICAgIG9wdGlvbmFsIHBhcmFtZXRlcnMuICAqLworICAgICAgICAgIGlmIChhbGdvX25hbWUgJiYgIXN0cmNtcCAoYWxnb19uYW1lLCAiUlNBIikKKyAgICAgICAgICAgICAgJiYgIXN0cmNtcCAoZWxlbWVudF9uYW1lcywgIm5lZHBxdSIpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogVGhpcyBpcyBSU0EuICBUZXN0IHdoZXRoZXIgd2UgZ290IE4sIEUgYW5kIEQgYW5kIHRoYXQKKyAgICAgICAgICAgICAgICAgdGhlIG9wdGlvbmFsIFAsIFEgYW5kIFUgYXJlIGFsbCBtaXNzaW5nLiAgKi8KKyAgICAgICAgICAgICAgaWYgKGVsZW1lbnRzWzBdICYmIGVsZW1lbnRzWzFdICYmIGVsZW1lbnRzWzJdCisgICAgICAgICAgICAgICAgICAmJiAhZWxlbWVudHNbM10gJiYgIWVsZW1lbnRzWzRdICYmICFlbGVtZW50c1s1XSkKKyAgICAgICAgICAgICAgICBlcnIgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgaWYgKGVycikKKyAgICB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgaWR4OyBpKyspCisgICAgICAgIGlmIChlbGVtZW50c1tpXSkKKyAgICAgICAgICBnY3J5X2ZyZWUgKGVsZW1lbnRzW2ldKTsKKyAgICB9CisgIHJldHVybiBlcnI7Cit9CisKKworLyogSW50ZXJuYWwgZnVuY3Rpb24gdXNlZCBmb3IgZWNjLiAgTm90ZSwgdGhhdCB0aGlzIGZ1bmN0aW9uIG1ha2VzIHVzZQorICAgb2YgaXRzIGludGltYXRlIGtub3dsZWRnZSBhYm91dCB0aGUgRUNDIHBhcmFtZXRlcnMgZnJvbSBlY2MuYy4gKi8KK3N0YXRpYyBnY3J5X2Vycl9jb2RlX3QKK3NleHBfZWxlbWVudHNfZXh0cmFjdF9lY2MgKGdjcnlfc2V4cF90IGtleV9zZXhwLCBjb25zdCBjaGFyICplbGVtZW50X25hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NyeV9tcGlfdCAqZWxlbWVudHMsIHBrX2V4dHJhX3NwZWNfdCAqZXh0cmFzcGVjKQorCit7CisgIGdjcnlfZXJyX2NvZGVfdCBlcnIgPSAwOworICBpbnQgaWR4OworICBjb25zdCBjaGFyICpuYW1lOworICBnY3J5X3NleHBfdCBsaXN0OworCisgIC8qIENsZWFyIHRoZSBhcnJheSBmb3IgZWFzaWVyIGVycm9yIGNsZWFudXAuICovCisgIGZvciAobmFtZSA9IGVsZW1lbnRfbmFtZXMsIGlkeCA9IDA7ICpuYW1lOyBuYW1lKyssIGlkeCsrKQorICAgIGVsZW1lbnRzW2lkeF0gPSBOVUxMOworICBnY3J5X2Fzc2VydCAoaWR4ID49IDYpOyAvKiBXZSBrbm93IHRoYXQgRUNDIGhhcyBhdCBsZWFzdCA2IGVsZW1lbnRzLiAgKi8KKworICAvKiBJbml0IHRoZSBhcnJheSB3aXRoIHRoZSBhdmFpbGFibGUgY3VydmUgcGFyYW1ldGVycy4gKi8KKyAgZm9yIChuYW1lID0gZWxlbWVudF9uYW1lcywgaWR4ID0gMDsgKm5hbWUgJiYgIWVycjsgbmFtZSsrLCBpZHgrKykKKyAgICB7CisgICAgICBsaXN0ID0gZ2NyeV9zZXhwX2ZpbmRfdG9rZW4gKGtleV9zZXhwLCBuYW1lLCAxKTsKKyAgICAgIGlmICghbGlzdCkKKwllbGVtZW50c1tpZHhdID0gTlVMTDsKKyAgICAgIGVsc2UKKwl7CisJICBlbGVtZW50c1tpZHhdID0gZ2NyeV9zZXhwX250aF9tcGkgKGxpc3QsIDEsIEdDUllNUElfRk1UX1VTRyk7CisJICBnY3J5X3NleHBfcmVsZWFzZSAobGlzdCk7CisJICBpZiAoIWVsZW1lbnRzW2lkeF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGVyciA9IEdQR19FUlJfSU5WX09CSjsKKyAgICAgICAgICAgICAgZ290byBsZWF2ZTsKKyAgICAgICAgICAgIH0KKwl9CisgICAgfQorCisgIC8qIENoZWNrIHdoZXRoZXIgYSBjdXJ2ZSBwYXJhbWV0ZXIgaGFzIGJlZW4gZ2l2ZW4gYW5kIHRoZW4gZmlsbCBhbnkKKyAgICAgbWlzc2luZyBlbGVtZW50cy4gICovCisgIGxpc3QgPSBnY3J5X3NleHBfZmluZF90b2tlbiAoa2V5X3NleHAsICJjdXJ2ZSIsIDUpOworICBpZiAobGlzdCkKKyAgICB7CisgICAgICBpZiAoZXh0cmFzcGVjLT5nZXRfcGFyYW0pCisgICAgICAgIHsKKyAgICAgICAgICBjaGFyICpjdXJ2ZTsKKyAgICAgICAgICBnY3J5X21waV90IHBhcmFtc1s2XTsKKyAgICAgICAgICAKKyAgICAgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IERJTShwYXJhbXMpOyBpZHgrKykKKyAgICAgICAgICAgIHBhcmFtc1tpZHhdID0gTlVMTDsKKyAgICAgICAgICAKKyAgICAgICAgICBjdXJ2ZSA9IF9nY3J5X3NleHBfbnRoX3N0cmluZyAobGlzdCwgMSk7CisgICAgICAgICAgZ2NyeV9zZXhwX3JlbGVhc2UgKGxpc3QpOworICAgICAgICAgIGlmICghY3VydmUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIE5vIGN1cnZlIG5hbWUgZ2l2ZW4gKG9yIG91dCBvZiBjb3JlKS4gKi8KKyAgICAgICAgICAgICAgZXJyID0gR1BHX0VSUl9JTlZfT0JKOyAKKyAgICAgICAgICAgICAgZ290byBsZWF2ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlcnIgPSBleHRyYXNwZWMtPmdldF9wYXJhbSAoY3VydmUsIHBhcmFtcyk7CisgICAgICAgICAgZ2NyeV9mcmVlIChjdXJ2ZSk7CisgICAgICAgICAgaWYgKGVycikKKyAgICAgICAgICAgIGdvdG8gbGVhdmU7CisgICAgICAgICAgCisgICAgICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBESU0ocGFyYW1zKTsgaWR4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICghZWxlbWVudHNbaWR4XSkKKyAgICAgICAgICAgICAgICBlbGVtZW50c1tpZHhdID0gcGFyYW1zW2lkeF07CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtcGlfZnJlZSAocGFyYW1zW2lkeF0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBnY3J5X3NleHBfcmVsZWFzZSAobGlzdCk7CisgICAgICAgICAgZXJyID0gR1BHX0VSUl9JTlZfT0JKOyAvKiAiY3VydmUiIGdpdmVuIGJ1dCBFQ0Mgbm90IHN1cHBvcnRlZC4gKi8KKyAgICAgICAgICBnb3RvIGxlYXZlOworICAgICAgICB9CisgICAgfQorCisgIC8qIENoZWNrIHRoYXQgYWxsIHBhcmFtZXRlcnMgYXJlIGtub3duLiAgKi8KKyAgZm9yIChuYW1lID0gZWxlbWVudF9uYW1lcywgaWR4ID0gMDsgKm5hbWU7IG5hbWUrKywgaWR4KyspCisgICAgaWYgKCFlbGVtZW50c1tpZHhdKQorICAgICAgeworICAgICAgICBlcnIgPSBHUEdfRVJSX05PX09CSjsKKyAgICAgICAgZ290byBsZWF2ZTsKKyAgICAgIH0KKyAgCisgbGVhdmU6CisgIGlmIChlcnIpCisgICAgeworICAgICAgZm9yIChuYW1lID0gZWxlbWVudF9uYW1lcywgaWR4ID0gMDsgKm5hbWU7IG5hbWUrKywgaWR4KyspCisgICAgICAgIGlmIChlbGVtZW50c1tpZHhdKQorICAgICAgICAgIGdjcnlfZnJlZSAoZWxlbWVudHNbaWR4XSk7CisgICAgfQorICByZXR1cm4gZXJyOworfQorCisKKworLyoqKioqKioqKioqKioqKioKKyAqIENvbnZlcnQgYSBTLUV4cCB3aXRoIGVpdGhlciBhIHByaXZhdGUgb3IgYSBwdWJsaWMga2V5IHRvIG91cgorICogaW50ZXJuYWwgZm9ybWF0LiBDdXJyZW50bHkgd2UgZG8gb25seSBzdXBwb3J0IHRoZSBmb2xsb3dpbmcKKyAqIGFsZ29yaXRobXM6CisgKiAgICBkc2EKKyAqICAgIHJzYQorICogICAgb3BlbnBncC1kc2EKKyAqICAgIG9wZW5wZ3AtcnNhCisgKiAgICBvcGVucGdwLWVsZworICogICAgb3BlbnBncC1lbGctc2lnCisgKiAgICBlY2RzYQorICogUHJvdmlkZSBhIFNFIHdpdGggdGhlIGZpcnN0IGVsZW1lbnQgYmUgZWl0aGVyICJwcml2YXRlLWtleSIgb3IKKyAqIG9yICJwdWJsaWMta2V5Ii4gSXQgaXMgZm9sbG93ZWQgYnkgYSBsaXN0IHdpdGggaXRzIGZpcnN0IGVsZW1lbnQKKyAqIGJlIG9uZSBvZiB0aGUgYWJvdmUgYWxnb3JpdGhtIGlkZW50aWZpZXJzIGFuZCB0aGUgcmVtYW5pbmcKKyAqIGVsZW1lbnRzIGFyZSBwYWlycyB3aXRoIHBhcmFtZXRlci1pZCBhbmQgdmFsdWUuCisgKiBOT1RFOiB3ZSBsb29rIHRocm91Z2ggdGhlIGxpc3QgdG8gZmluZCBhIGxpc3QgYmVnaW5uaW5nIHdpdGgKKyAqICJwcml2YXRlLWtleSIgb3IgInB1YmxpYy1rZXkiIC0gdGhlIGZpcnN0IG9uZSBmb3VuZCBpcyB1c2VkLgorICoKKyAqIFJldHVybnM6IEEgcG9pbnRlciB0byBhbiBhbGxvY2F0ZWQgYXJyYXkgb2YgTVBJcyBpZiB0aGUgcmV0dXJuIHZhbHVlIGlzCisgKgkgICAgemVybzsgdGhlIGNhbGxlciBoYXMgdG8gcmVsZWFzZSB0aGlzIGFycmF5LgorICoKKyAqIEV4YW1wbGUgb2YgYSBEU0EgcHVibGljIGtleToKKyAqICAocHJpdmF0ZS1rZXkKKyAqICAgIChkc2EKKyAqCShwIDxtcGk+KQorICoJKGcgPG1waT4pCisgKgkoeSA8bXBpPikKKyAqCSh4IDxtcGk+KQorICogICAgKQorICogICkKKyAqIFRoZSA8bXBpPiBhcmUgZXhwZWN0ZWQgdG8gYmUgaW4gR0NSWU1QSV9GTVRfVVNHCisgKi8KK3N0YXRpYyBnY3J5X2Vycl9jb2RlX3QKK3NleHBfdG9fa2V5IChnY3J5X3NleHBfdCBzZXhwLCBpbnQgd2FudF9wcml2YXRlLCBnY3J5X21waV90ICoqcmV0YXJyYXksCisgICAgICAgICAgICAgZ2NyeV9tb2R1bGVfdCAqcmV0YWxnbykKK3sKKyAgZ2NyeV9lcnJfY29kZV90IGVyciA9IDA7CisgIGdjcnlfc2V4cF90IGxpc3QsIGwyOworICBjaGFyICpuYW1lOworICBjb25zdCBjaGFyICplbGVtczsKKyAgZ2NyeV9tcGlfdCAqYXJyYXk7CisgIGdjcnlfbW9kdWxlX3QgbW9kdWxlOworICBnY3J5X3BrX3NwZWNfdCAqcHVia2V5OworICBwa19leHRyYV9zcGVjX3QgKmV4dHJhc3BlYzsKKyAgaW50IGlzX2VjYzsKKworICAvKiBDaGVjayB0aGF0IHRoZSBmaXJzdCBlbGVtZW50IGlzIHZhbGlkLiAgKi8KKyAgbGlzdCA9IGdjcnlfc2V4cF9maW5kX3Rva2VuIChzZXhwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YW50X3ByaXZhdGU/ICJwcml2YXRlLWtleSI6InB1YmxpYy1rZXkiLCAwKTsKKyAgaWYgKCFsaXN0KQorICAgIHJldHVybiBHUEdfRVJSX0lOVl9PQko7IC8qIERvZXMgbm90IGNvbnRhaW4gYSBrZXkgb2JqZWN0LiAgKi8KKworICBsMiA9IGdjcnlfc2V4cF9jYWRyKCBsaXN0ICk7CisgIGdjcnlfc2V4cF9yZWxlYXNlICggbGlzdCApOworICBsaXN0ID0gbDI7CisgIG5hbWUgPSBfZ2NyeV9zZXhwX250aF9zdHJpbmcgKGxpc3QsIDApOworICBpZiAoIW5hbWUpCisgICAgeworICAgICAgZ2NyeV9zZXhwX3JlbGVhc2UgKCBsaXN0ICk7CisgICAgICByZXR1cm4gR1BHX0VSUl9JTlZfT0JKOyAgICAgIC8qIEludmFsaWQgc3RydWN0dXJlIG9mIG9iamVjdC4gKi8KKyAgICB9CisKKyAgYXRoX211dGV4X2xvY2sgKCZwdWJrZXlzX3JlZ2lzdGVyZWRfbG9jayk7CisgIG1vZHVsZSA9IGdjcnlfcGtfbG9va3VwX25hbWUgKG5hbWUpOworICBhdGhfbXV0ZXhfdW5sb2NrICgmcHVia2V5c19yZWdpc3RlcmVkX2xvY2spOworICAKKyAgLyogRml4bWU6IFdlIHNob3VsZCBtYWtlIHN1cmUgdGhhdCBhbiBFQ0Mga2V5IGlzIGFsd2F5cyBuYW1lZCAiZWNjIgorICAgICBhbmQgbm90ICJlY2RzYSIuICAiZWNkc2EiIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgc2lnbmF0dXJlCisgICAgIGl0c2VsZi4gIFdlIG5lZWQgYSBmdW5jdGlvbiB0byB0ZXN0IHdoZXRoZXIgYW4gYWxnb3JpdGhtIGdpdmVuCisgICAgIHdpdGggYSBrZXkgaXMgY29tcGF0aWJsZSB3aXRoIGFuIGFwcGxpY2F0aW9uIG9mIHRoZSBrZXkgKHNpZ25pbmcsCisgICAgIGVuY3J5cHRpb24pLiAgRm9yIFJTQSB0aGlzIGlzIGVhc3ksIGJ1dCBFQ0MgaXMgdGhlIGZpcnN0CisgICAgIGFsZ29yaXRobSB3aGljaCBoYXMgbWFueSBmbGF2b3Vycy4gKi8KKyAgaXNfZWNjID0gKCAhc3RyY21wIChuYW1lLCAiZWNkc2EiKSB8fCAhc3RyY21wIChuYW1lLCAiZWNjIikgKTsKKyAgZ2NyeV9mcmVlIChuYW1lKTsKKyAgCisgIGlmICghbW9kdWxlKQorICAgIHsKKyAgICAgIGdjcnlfc2V4cF9yZWxlYXNlIChsaXN0KTsKKyAgICAgIHJldHVybiBHUEdfRVJSX1BVQktFWV9BTEdPOyAvKiBVbmtub3duIGFsZ29yaXRobS4gKi8KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBwdWJrZXkgPSAoZ2NyeV9wa19zcGVjX3QgKikgbW9kdWxlLT5zcGVjOworICAgICAgZXh0cmFzcGVjID0gbW9kdWxlLT5leHRyYXNwZWM7CisgICAgfQorCisgIGVsZW1zID0gd2FudF9wcml2YXRlID8gcHVia2V5LT5lbGVtZW50c19za2V5IDogcHVia2V5LT5lbGVtZW50c19wa2V5OworICBhcnJheSA9IGdjcnlfY2FsbG9jIChzdHJsZW4gKGVsZW1zKSArIDEsIHNpemVvZiAoKmFycmF5KSk7CisgIGlmICghYXJyYXkpCisgICAgZXJyID0gZ3BnX2Vycl9jb2RlX2Zyb21fZXJybm8gKGVycm5vKTsKKyAgaWYgKCFlcnIpCisgICAgeworICAgICAgaWYgKGlzX2VjYykKKyAgICAgICAgZXJyID0gc2V4cF9lbGVtZW50c19leHRyYWN0X2VjYyAobGlzdCwgZWxlbXMsIGFycmF5LCBleHRyYXNwZWMpOworICAgICAgZWxzZQorICAgICAgICBlcnIgPSBzZXhwX2VsZW1lbnRzX2V4dHJhY3QgKGxpc3QsIGVsZW1zLCBhcnJheSwgcHVia2V5LT5uYW1lKTsKKyAgICB9CisgIAorICBnY3J5X3NleHBfcmVsZWFzZSAobGlzdCk7CisgIAorICBpZiAoZXJyKQorICAgIHsKKyAgICAgIGdjcnlfZnJlZSAoYXJyYXkpOworCisgICAgICBhdGhfbXV0ZXhfbG9jayAoJnB1YmtleXNfcmVnaXN0ZXJlZF9sb2NrKTsKKyAgICAgIF9nY3J5X21vZHVsZV9yZWxlYXNlIChtb2R1bGUpOworICAgICAgYXRoX211dGV4X3VubG9jayAoJnB1YmtleXNfcmVnaXN0ZXJlZF9sb2NrKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAqcmV0YXJyYXkgPSBhcnJheTsKKyAgICAgICpyZXRhbGdvID0gbW9kdWxlOworICAgIH0KKyAgCisgIHJldHVybiBlcnI7Cit9CisKKworc3RhdGljIGdjcnlfZXJyX2NvZGVfdAorc2V4cF90b19zaWcgKGdjcnlfc2V4cF90IHNleHAsIGdjcnlfbXBpX3QgKipyZXRhcnJheSwKKwkgICAgIGdjcnlfbW9kdWxlX3QgKnJldGFsZ28pCit7CisgIGdjcnlfZXJyX2NvZGVfdCBlcnIgPSAwOworICBnY3J5X3NleHBfdCBsaXN0LCBsMjsKKyAgY2hhciAqbmFtZTsKKyAgY29uc3QgY2hhciAqZWxlbXM7CisgIGdjcnlfbXBpX3QgKmFycmF5OworICBnY3J5X21vZHVsZV90IG1vZHVsZTsKKyAgZ2NyeV9wa19zcGVjX3QgKnB1YmtleTsKKyAgCisgIC8qIENoZWNrIHRoYXQgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdmFsaWQuICAqLworICBsaXN0ID0gZ2NyeV9zZXhwX2ZpbmRfdG9rZW4oIHNleHAsICJzaWctdmFsIiAsIDAgKTsKKyAgaWYgKCFsaXN0KQorICAgIHJldHVybiBHUEdfRVJSX0lOVl9PQko7IC8qIERvZXMgbm90IGNvbnRhaW4gYSBzaWduYXR1cmUgdmFsdWUgb2JqZWN0LiAgKi8KKworICBsMiA9IGdjcnlfc2V4cF9udGggKGxpc3QsIDEpOworICBpZiAoIWwyKQorICAgIHsKKyAgICAgIGdjcnlfc2V4cF9yZWxlYXNlIChsaXN0KTsKKyAgICAgIHJldHVybiBHUEdfRVJSX05PX09CSjsgICAvKiBObyBjYWRyIGZvciB0aGUgc2lnIG9iamVjdC4gICovCisgICAgfQorICBuYW1lID0gX2djcnlfc2V4cF9udGhfc3RyaW5nIChsMiwgMCk7CisgIGlmICghbmFtZSkKKyAgICB7CisgICAgICBnY3J5X3NleHBfcmVsZWFzZSAobGlzdCk7CisgICAgICBnY3J5X3NleHBfcmVsZWFzZSAobDIpOworICAgICAgcmV0dXJuIEdQR19FUlJfSU5WX09CSjsgIC8qIEludmFsaWQgc3RydWN0dXJlIG9mIG9iamVjdC4gICovCisgICAgfQorICBlbHNlIGlmICghc3RyY21wIChuYW1lLCAiZmxhZ3MiKSkgCisgICAgeworICAgICAgLyogU2tpcCBmbGFncywgc2luY2UgdGhleSBhcmUgbm90IHVzZWQgYnV0IGhlcmUganVzdCBmb3IgdGhlCisJIHNha2Ugb2YgY29uc2lzdGVudCBTLWV4cHJlc3Npb25zLiAgKi8KKyAgICAgIGdjcnlfZnJlZSAobmFtZSk7CisgICAgICBnY3J5X3NleHBfcmVsZWFzZSAobDIpOworICAgICAgbDIgPSBnY3J5X3NleHBfbnRoIChsaXN0LCAyKTsKKyAgICAgIGlmICghbDIpCisJeworCSAgZ2NyeV9zZXhwX3JlbGVhc2UgKGxpc3QpOworCSAgcmV0dXJuIEdQR19FUlJfSU5WX09CSjsKKwl9CisgICAgICBuYW1lID0gX2djcnlfc2V4cF9udGhfc3RyaW5nIChsMiwgMCk7CisgICAgfQorICAgICAgCisgIGF0aF9tdXRleF9sb2NrICgmcHVia2V5c19yZWdpc3RlcmVkX2xvY2spOworICBtb2R1bGUgPSBnY3J5X3BrX2xvb2t1cF9uYW1lIChuYW1lKTsKKyAgYXRoX211dGV4X3VubG9jayAoJnB1YmtleXNfcmVnaXN0ZXJlZF9sb2NrKTsKKyAgZ2NyeV9mcmVlIChuYW1lKTsKKyAgbmFtZSA9IE5VTEw7CisKKyAgaWYgKCFtb2R1bGUpCisgICAgeworICAgICAgZ2NyeV9zZXhwX3JlbGVhc2UgKGwyKTsKKyAgICAgIGdjcnlfc2V4cF9yZWxlYXNlIChsaXN0KTsKKyAgICAgIHJldHVybiBHUEdfRVJSX1BVQktFWV9BTEdPOyAgLyogVW5rbm93biBhbGdvcml0aG0uICovCisgICAgfQorICBlbHNlCisgICAgcHVia2V5ID0gKGdjcnlfcGtfc3BlY190ICopIG1vZHVsZS0+c3BlYzsKKworICBlbGVtcyA9IHB1YmtleS0+ZWxlbWVudHNfc2lnOworICBhcnJheSA9IGdjcnlfY2FsbG9jIChzdHJsZW4gKGVsZW1zKSArIDEgLCBzaXplb2YgKmFycmF5ICk7CisgIGlmICghYXJyYXkpCisgICAgZXJyID0gZ3BnX2Vycl9jb2RlX2Zyb21fZXJybm8gKGVycm5vKTsKKworICBpZiAoIWVycikKKyAgICBlcnIgPSBzZXhwX2VsZW1lbnRzX2V4dHJhY3QgKGxpc3QsIGVsZW1zLCBhcnJheSwgTlVMTCk7CisKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKGwyKTsKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKGxpc3QpOworCisgIGlmIChlcnIpCisgICAgeworICAgICAgYXRoX211dGV4X2xvY2sgKCZwdWJrZXlzX3JlZ2lzdGVyZWRfbG9jayk7CisgICAgICBfZ2NyeV9tb2R1bGVfcmVsZWFzZSAobW9kdWxlKTsKKyAgICAgIGF0aF9tdXRleF91bmxvY2sgKCZwdWJrZXlzX3JlZ2lzdGVyZWRfbG9jayk7CisgICAgICAKKyAgICAgIGdjcnlfZnJlZSAoYXJyYXkpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgICpyZXRhcnJheSA9IGFycmF5OworICAgICAgKnJldGFsZ28gPSBtb2R1bGU7CisgICAgfQorICAKKyAgcmV0dXJuIGVycjsKK30KKworCisvKioqKioqKioqKioqKioqKgorICogVGFrZSBzZXhwIGFuZCByZXR1cm4gYW4gYXJyYXkgb2YgTVBJIGFzIHVzZWQgZm9yIG91ciBpbnRlcm5hbCBkZWNyeXB0CisgKiBmdW5jdGlvbi4KKyAqIHNfZGF0YSA9IChlbmMtdmFsCisgKiAgICAgICAgICAgWyhmbGFncyBbcGtjczFdKV0KKyAqCSAgICAgICg8YWxnbz4KKyAqCQkoPHBhcmFtX25hbWUxPiA8bXBpPikKKyAqCQkuLi4KKyAqCQkoPHBhcmFtX25hbWVuPiA8bXBpPikKKyAqCSAgICAgICkpCisgKiBSRVRfTU9ERVJOIGlzIHNldCB0byB0cnVlIHdoZW4gYXQgbGVhc3QgYW4gZW1wdHkgZmxhZ3MgbGlzdCBoYXMgYmVlbiBmb3VuZC4KKyAqLworc3RhdGljIGdjcnlfZXJyX2NvZGVfdAorc2V4cF90b19lbmMgKGdjcnlfc2V4cF90IHNleHAsIGdjcnlfbXBpX3QgKipyZXRhcnJheSwgZ2NyeV9tb2R1bGVfdCAqcmV0YWxnbywKKyAgICAgICAgICAgICBpbnQgKnJldF9tb2Rlcm4sIGludCAqcmV0X3dhbnRfcGtjczEsIGludCAqZmxhZ3MpCit7CisgIGdjcnlfZXJyX2NvZGVfdCBlcnIgPSAwOworICBnY3J5X3NleHBfdCBsaXN0ID0gTlVMTCwgbDIgPSBOVUxMOworICBnY3J5X3BrX3NwZWNfdCAqcHVia2V5ID0gTlVMTDsKKyAgZ2NyeV9tb2R1bGVfdCBtb2R1bGUgPSBOVUxMOworICBjaGFyICpuYW1lID0gTlVMTDsKKyAgc2l6ZV90IG47CisgIGludCBwYXJzZWRfZmxhZ3MgPSAwOworICBjb25zdCBjaGFyICplbGVtczsKKyAgZ2NyeV9tcGlfdCAqYXJyYXkgPSBOVUxMOworCisgICpyZXRfd2FudF9wa2NzMSA9IDA7CisgICpyZXRfbW9kZXJuID0gMDsKKworICAvKiBDaGVjayB0aGF0IHRoZSBmaXJzdCBlbGVtZW50IGlzIHZhbGlkLiAgKi8KKyAgbGlzdCA9IGdjcnlfc2V4cF9maW5kX3Rva2VuIChzZXhwLCAiZW5jLXZhbCIgLCAwKTsKKyAgaWYgKCFsaXN0KQorICAgIHsKKyAgICAgIGVyciA9IEdQR19FUlJfSU5WX09CSjsgLyogRG9lcyBub3QgY29udGFpbiBhbiBlbmNyeXB0ZWQgdmFsdWUgb2JqZWN0LiAgKi8KKyAgICAgIGdvdG8gbGVhdmU7CisgICAgfQorCisgIGwyID0gZ2NyeV9zZXhwX250aCAobGlzdCwgMSk7CisgIGlmICghbDIpCisgICAgeworICAgICAgZXJyID0gR1BHX0VSUl9OT19PQko7IC8qIE5vIGNkciBmb3IgdGhlIGRhdGEgb2JqZWN0LiAgKi8KKyAgICAgIGdvdG8gbGVhdmU7CisgICAgfQorCisgIC8qIEV4dHJhY3QgaWRlbnRpZmllciBvZiBzdWJsaXN0LiAgKi8KKyAgbmFtZSA9IF9nY3J5X3NleHBfbnRoX3N0cmluZyAobDIsIDApOworICBpZiAoIW5hbWUpCisgICAgeworICAgICAgZXJyID0gR1BHX0VSUl9JTlZfT0JKOyAvKiBJbnZhbGlkIHN0cnVjdHVyZSBvZiBvYmplY3QuICAqLworICAgICAgZ290byBsZWF2ZTsKKyAgICB9CisgIAorICBpZiAoIXN0cmNtcCAobmFtZSwgImZsYWdzIikpCisgICAgeworICAgICAgLyogVGhlcmUgaXMgYSBmbGFncyBlbGVtZW50IC0gcHJvY2VzcyBpdC4gICovCisgICAgICBjb25zdCBjaGFyICpzOworICAgICAgaW50IGk7CisgICAgICAKKyAgICAgICpyZXRfbW9kZXJuID0gMTsKKyAgICAgIGZvciAoaSA9IGdjcnlfc2V4cF9sZW5ndGggKGwyKSAtIDE7IGkgPiAwOyBpLS0pCisgICAgICAgIHsKKyAgICAgICAgICBzID0gZ2NyeV9zZXhwX250aF9kYXRhIChsMiwgaSwgJm4pOworICAgICAgICAgIGlmICghIHMpCisgICAgICAgICAgICA7IC8qIE5vdCBhIGRhdGEgZWxlbWVudCAtIGlnbm9yZS4gICovCisgICAgICAgICAgZWxzZSBpZiAobiA9PSAzICYmICFtZW1jbXAgKHMsICJyYXciLCAzKSkKKyAgICAgICAgICAgIDsgLyogVGhpcyBpcyBqdXN0IGEgZHVtbXkgYXMgaXQgaXMgdGhlIGRlZmF1bHQuICAqLworICAgICAgICAgIGVsc2UgaWYgKG4gPT0gNSAmJiAhbWVtY21wIChzLCAicGtjczEiLCA1KSkKKyAgICAgICAgICAgICpyZXRfd2FudF9wa2NzMSA9IDE7CisgICAgICAgICAgZWxzZSBpZiAobiA9PSAxMSAmJiAhIG1lbWNtcCAocywgIm5vLWJsaW5kaW5nIiwgMTEpKQorICAgICAgICAgICAgcGFyc2VkX2ZsYWdzIHw9IFBVQktFWV9GTEFHX05PX0JMSU5ESU5HOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZXJyID0gR1BHX0VSUl9JTlZfRkxBRzsKKyAgICAgICAgICAgICAgZ290byBsZWF2ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgCisgICAgICAvKiBHZXQgdGhlIG5leHQgd2hpY2ggaGFzIHRoZSBhY3R1YWwgZGF0YS4gKi8KKyAgICAgIGdjcnlfc2V4cF9yZWxlYXNlIChsMik7CisgICAgICBsMiA9IGdjcnlfc2V4cF9udGggKGxpc3QsIDIpOworICAgICAgaWYgKCFsMikKKyAgICAgICAgeworICAgICAgICAgIGVyciA9IEdQR19FUlJfTk9fT0JKOyAvKiBObyBjZHIgZm9yIHRoZSBkYXRhIG9iamVjdC4gKi8KKyAgICAgICAgICBnb3RvIGxlYXZlOworICAgICAgICB9CisKKyAgICAgIC8qIEV4dHJhY3Qgc3VibGlzdCBpZGVudGlmaWVyLiAgKi8KKyAgICAgIGdjcnlfZnJlZSAobmFtZSk7CisgICAgICBuYW1lID0gX2djcnlfc2V4cF9udGhfc3RyaW5nIChsMiwgMCk7CisgICAgICBpZiAoIW5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICBlcnIgPSBHUEdfRVJSX0lOVl9PQko7IC8qIEludmFsaWQgc3RydWN0dXJlIG9mIG9iamVjdC4gKi8KKyAgICAgICAgICBnb3RvIGxlYXZlOworICAgICAgICB9CisKKyAgICAgIGdjcnlfc2V4cF9yZWxlYXNlIChsaXN0KTsKKyAgICAgIGxpc3QgPSBsMjsKKyAgICAgIGwyID0gTlVMTDsKKyAgICB9CisKKyAgYXRoX211dGV4X2xvY2sgKCZwdWJrZXlzX3JlZ2lzdGVyZWRfbG9jayk7CisgIG1vZHVsZSA9IGdjcnlfcGtfbG9va3VwX25hbWUgKG5hbWUpOworICBhdGhfbXV0ZXhfdW5sb2NrICgmcHVia2V5c19yZWdpc3RlcmVkX2xvY2spOworICAKKyAgaWYgKCFtb2R1bGUpCisgICAgeworICAgICAgZXJyID0gR1BHX0VSUl9QVUJLRVlfQUxHTzsgLyogVW5rbm93biBhbGdvcml0aG0uICAqLworICAgICAgZ290byBsZWF2ZTsKKyAgICB9CisgIHB1YmtleSA9IChnY3J5X3BrX3NwZWNfdCAqKSBtb2R1bGUtPnNwZWM7CisKKyAgZWxlbXMgPSBwdWJrZXktPmVsZW1lbnRzX2VuYzsKKyAgYXJyYXkgPSBnY3J5X2NhbGxvYyAoc3RybGVuIChlbGVtcykgKyAxLCBzaXplb2YgKCphcnJheSkpOworICBpZiAoIWFycmF5KQorICAgIHsKKyAgICAgIGVyciA9IGdwZ19lcnJfY29kZV9mcm9tX2Vycm5vIChlcnJubyk7CisgICAgICBnb3RvIGxlYXZlOworICAgIH0KKworICBlcnIgPSBzZXhwX2VsZW1lbnRzX2V4dHJhY3QgKGxpc3QsIGVsZW1zLCBhcnJheSwgTlVMTCk7CisKKyBsZWF2ZToKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKGxpc3QpOworICBnY3J5X3NleHBfcmVsZWFzZSAobDIpOworICBnY3J5X2ZyZWUgKG5hbWUpOworCisgIGlmIChlcnIpCisgICAgeworICAgICAgYXRoX211dGV4X2xvY2sgKCZwdWJrZXlzX3JlZ2lzdGVyZWRfbG9jayk7CisgICAgICBfZ2NyeV9tb2R1bGVfcmVsZWFzZSAobW9kdWxlKTsKKyAgICAgIGF0aF9tdXRleF91bmxvY2sgKCZwdWJrZXlzX3JlZ2lzdGVyZWRfbG9jayk7CisgICAgICBnY3J5X2ZyZWUgKGFycmF5KTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAqcmV0YXJyYXkgPSBhcnJheTsKKyAgICAgICpyZXRhbGdvID0gbW9kdWxlOworICAgICAgKmZsYWdzID0gcGFyc2VkX2ZsYWdzOworICAgIH0KKworICByZXR1cm4gZXJyOworfQorCisvKiBUYWtlIHRoZSBoYXNoIHZhbHVlIGFuZCBjb252ZXJ0IGludG8gYW4gTVBJLCBzdWl0YWJsZSBmb3IKKyAgIHBhc3NpbmcgdG8gdGhlIGxvdyBsZXZlbCBmdW5jdGlvbnMuICBXZSBjdXJyZW50bHkgc3VwcG9ydCB0aGUKKyAgIG9sZCBzdHlsZSB3YXkgb2YgcGFzc2luZyBqdXN0IGEgTVBJIGFuZCB0aGUgbW9kZXJuIGludGVyZmFjZSB3aGljaAorICAgYWxsb3dzIHRvIHBhc3MgZmxhZ3Mgc28gdGhhdCB3ZSBjYW4gY2hvb3NlIGJldHdlZW4gcmF3IGFuZCBwa2NzMQorICAgcGFkZGluZyAtIG1heSBiZSBtb3JlIHBhZGRpbmcgb3B0aW9ucyBsYXRlci4gCisKKyAgICg8bXBpPikKKyAgIG9yCisgICAoZGF0YQorICAgIFsoZmxhZ3MgW3BrY3MxXSldCisgICAgWyhoYXNoIDxhbGdvPiA8dmFsdWU+KV0KKyAgICBbKHZhbHVlIDx0ZXh0PildCisgICApCisgICAKKyAgIEVpdGhlciB0aGUgVkFMVUUgb3IgdGhlIEhBU0ggZWxlbWVudCBtdXN0IGJlIHByZXNlbnQgZm9yIHVzZQorICAgd2l0aCBzaWduYXR1cmVzLiAgVkFMVUUgaXMgdXNlZCBmb3IgZW5jcnlwdGlvbi4KKworICAgTkJJVFMgaXMgdGhlIGxlbmd0aCBvZiB0aGUga2V5IGluIGJpdHMuIAorCisqLworc3RhdGljIGdjcnlfZXJyX2NvZGVfdAorc2V4cF9kYXRhX3RvX21waSAoZ2NyeV9zZXhwX3QgaW5wdXQsIHVuc2lnbmVkIGludCBuYml0cywgZ2NyeV9tcGlfdCAqcmV0X21waSwKKyAgICAgICAgICAgICAgICAgIGludCBmb3JfZW5jcnlwdGlvbiwgaW50ICpmbGFncykKK3sKKyAgZ2NyeV9lcnJfY29kZV90IHJjID0gMDsKKyAgZ2NyeV9zZXhwX3QgbGRhdGEsIGxoYXNoLCBsdmFsdWU7CisgIGludCBpOworICBzaXplX3QgbjsKKyAgY29uc3QgY2hhciAqczsKKyAgaW50IGlzX3JhdyA9IDAsIGlzX3BrY3MxID0gMCwgdW5rbm93bl9mbGFnPTA7IAorICBpbnQgcGFyc2VkX2ZsYWdzID0gMCwgZHVtbXlfZmxhZ3M7CisKKyAgaWYgKCEgZmxhZ3MpCisgICAgZmxhZ3MgPSAmZHVtbXlfZmxhZ3M7CisgIAorICAqcmV0X21waSA9IE5VTEw7CisgIGxkYXRhID0gZ2NyeV9zZXhwX2ZpbmRfdG9rZW4gKGlucHV0LCAiZGF0YSIsIDApOworICBpZiAoIWxkYXRhKQorICAgIHsgLyogYXNzdW1lIG9sZCBzdHlsZSAqLworICAgICAgKnJldF9tcGkgPSBnY3J5X3NleHBfbnRoX21waSAoaW5wdXQsIDAsIDApOworICAgICAgcmV0dXJuICpyZXRfbXBpID8gR1BHX0VSUl9OT19FUlJPUiA6IEdQR19FUlJfSU5WX09CSjsKKyAgICB9CisKKyAgLyogc2VlIHdoZXRoZXIgdGhlcmUgaXMgYSBmbGFncyBvYmplY3QgKi8KKyAgeworICAgIGdjcnlfc2V4cF90IGxmbGFncyA9IGdjcnlfc2V4cF9maW5kX3Rva2VuIChsZGF0YSwgImZsYWdzIiwgMCk7CisgICAgaWYgKGxmbGFncykKKyAgICAgIHsgLyogcGFyc2UgdGhlIGZsYWdzIGxpc3QuICovCisgICAgICAgIGZvciAoaT1nY3J5X3NleHBfbGVuZ3RoIChsZmxhZ3MpLTE7IGkgPiAwOyBpLS0pCisgICAgICAgICAgeworICAgICAgICAgICAgcyA9IGdjcnlfc2V4cF9udGhfZGF0YSAobGZsYWdzLCBpLCAmbik7CisgICAgICAgICAgICBpZiAoIXMpCisgICAgICAgICAgICAgIDsgLyogbm90IGEgZGF0YSBlbGVtZW50Ki8KKyAgICAgICAgICAgIGVsc2UgaWYgKCBuID09IDMgJiYgIW1lbWNtcCAocywgInJhdyIsIDMpKQorICAgICAgICAgICAgICBpc19yYXcgPSAxOworICAgICAgICAgICAgZWxzZSBpZiAoIG4gPT0gNSAmJiAhbWVtY21wIChzLCAicGtjczEiLCA1KSkKKyAgICAgICAgICAgICAgaXNfcGtjczEgPSAxOworCSAgICBlbHNlIGlmIChuID09IDExICYmICEgbWVtY21wIChzLCAibm8tYmxpbmRpbmciLCAxMSkpCisJICAgICAgcGFyc2VkX2ZsYWdzIHw9IFBVQktFWV9GTEFHX05PX0JMSU5ESU5HOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB1bmtub3duX2ZsYWcgPSAxOworICAgICAgICAgIH0KKyAgICAgICAgZ2NyeV9zZXhwX3JlbGVhc2UgKGxmbGFncyk7CisgICAgICB9CisgIH0KKworICBpZiAoIWlzX3BrY3MxICYmICFpc19yYXcpCisgICAgaXNfcmF3ID0gMTsgLyogZGVmYXVsdCB0byByYXcgKi8KKworICAvKiBHZXQgSEFTSCBvciBNUEkgKi8KKyAgbGhhc2ggPSBnY3J5X3NleHBfZmluZF90b2tlbiAobGRhdGEsICJoYXNoIiwgMCk7CisgIGx2YWx1ZSA9IGxoYXNoPyBOVUxMIDogZ2NyeV9zZXhwX2ZpbmRfdG9rZW4gKGxkYXRhLCAidmFsdWUiLCAwKTsKKworICBpZiAoISghbGhhc2ggXiAhbHZhbHVlKSkKKyAgICByYyA9IEdQR19FUlJfSU5WX09CSjsgLyogbm9uZSBvciBib3RoIGdpdmVuICovCisgIGVsc2UgaWYgKHVua25vd25fZmxhZykKKyAgICByYyA9IEdQR19FUlJfSU5WX0ZMQUc7CisgIGVsc2UgaWYgKGlzX3JhdyAmJiBpc19wa2NzMSAmJiAhZm9yX2VuY3J5cHRpb24pCisgICAgcmMgPSBHUEdfRVJSX0NPTkZMSUNUOworICBlbHNlIGlmIChpc19yYXcgJiYgbHZhbHVlKQorICAgIHsKKyAgICAgICpyZXRfbXBpID0gZ2NyeV9zZXhwX250aF9tcGkgKGx2YWx1ZSwgMSwgMCk7CisgICAgICBpZiAoISpyZXRfbXBpKQorICAgICAgICByYyA9IEdQR19FUlJfSU5WX09CSjsKKyAgICB9CisgIGVsc2UgaWYgKGlzX3BrY3MxICYmIGx2YWx1ZSAmJiBmb3JfZW5jcnlwdGlvbikKKyAgICB7IAorICAgICAgLyogQ3JlYXRlIHBrY3MjMSBibG9jayB0eXBlIDIgcGFkZGluZy4gKi8KKyAgICAgIHVuc2lnbmVkIGNoYXIgKmZyYW1lID0gTlVMTDsKKyAgICAgIHNpemVfdCBuZnJhbWUgPSAobmJpdHMrNykgLyA4OworICAgICAgY29uc3Qgdm9pZCAqIHZhbHVlOworICAgICAgc2l6ZV90IHZhbHVlbGVuOworICAgICAgdW5zaWduZWQgY2hhciAqcDsKKworICAgICAgaWYgKCAhKHZhbHVlPWdjcnlfc2V4cF9udGhfZGF0YSAobHZhbHVlLCAxLCAmdmFsdWVsZW4pKSB8fCAhdmFsdWVsZW4gKQorICAgICAgICByYyA9IEdQR19FUlJfSU5WX09CSjsKKyAgICAgIGVsc2UgaWYgKHZhbHVlbGVuICsgNyA+IG5mcmFtZSB8fCAhbmZyYW1lKQorICAgICAgICB7CisgICAgICAgICAgLyogQ2FuJ3QgZW5jb2RlIGEgVkFMVUVMRU4gdmFsdWUgaW4gYSBORlJBTUUgYnl0ZXMgZnJhbWUuICovCisgICAgICAgICAgcmMgPSBHUEdfRVJSX1RPT19TSE9SVDsgLyogdGhlIGtleSBpcyB0b28gc2hvcnQgKi8KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoICEoZnJhbWUgPSBnY3J5X21hbGxvY19zZWN1cmUgKG5mcmFtZSkpKQorICAgICAgICByYyA9IGdwZ19lcnJfY29kZV9mcm9tX2Vycm5vIChlcnJubyk7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBuID0gMDsKKyAgICAgICAgICBmcmFtZVtuKytdID0gMDsKKyAgICAgICAgICBmcmFtZVtuKytdID0gMjsgLyogYmxvY2sgdHlwZSAqLworICAgICAgICAgIGkgPSBuZnJhbWUgLSAzIC0gdmFsdWVsZW47CisgICAgICAgICAgZ2NyeV9hc3NlcnQgKGkgPiAwKTsKKyAgICAgICAgICBwID0gZ2NyeV9yYW5kb21fYnl0ZXNfc2VjdXJlIChpLCBHQ1JZX1NUUk9OR19SQU5ET00pOworICAgICAgICAgIC8qIFJlcGxhY2UgemVybyBieXRlcyBieSBuZXcgdmFsdWVzLiAqLworICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGludCBqLCBrOworICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwcDsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIC8qIENvdW50IHRoZSB6ZXJvIGJ5dGVzLiAqLworICAgICAgICAgICAgICBmb3IgKGo9az0wOyBqIDwgaTsgaisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmICghcFtqXSkKKyAgICAgICAgICAgICAgICAgICAgaysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYgKCFrKQorICAgICAgICAgICAgICAgIGJyZWFrOyAvKiBPa2F5OiBubyAobW9yZSkgemVybyBieXRlcy4gKi8KKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGsgKz0gay8xMjggKyAzOyAvKiBCZXR0ZXIgZ2V0IHNvbWUgbW9yZS4gKi8KKyAgICAgICAgICAgICAgcHAgPSBnY3J5X3JhbmRvbV9ieXRlc19zZWN1cmUgKGssIEdDUllfU1RST05HX1JBTkRPTSk7CisgICAgICAgICAgICAgIGZvciAoaj0wOyBqIDwgaSAmJiBrOyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaWYgKCFwW2pdKQorICAgICAgICAgICAgICAgICAgICBwW2pdID0gcHBbLS1rXTsKKyAgICAgICAgICAgICAgICAgIGlmIChwW2pdKQorICAgICAgICAgICAgICAgICAgICBqKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBnY3J5X2ZyZWUgKHBwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBtZW1jcHkgKGZyYW1lK24sIHAsIGkpOworICAgICAgICAgIG4gKz0gaTsKKyAgICAgICAgICBnY3J5X2ZyZWUgKHApOworICAgICAgICAgIAorICAgICAgICAgIGZyYW1lW24rK10gPSAwOworICAgICAgICAgIG1lbWNweSAoZnJhbWUrbiwgdmFsdWUsIHZhbHVlbGVuKTsKKyAgICAgICAgICBuICs9IHZhbHVlbGVuOworICAgICAgICAgIGdjcnlfYXNzZXJ0IChuID09IG5mcmFtZSk7CisKKwkgIC8qIEZJWE1FLCBlcnJvciBjaGVja2luZz8gICovCisgICAgICAgICAgZ2NyeV9tcGlfc2NhbiAocmV0X21waSwgR0NSWU1QSV9GTVRfVVNHLCBmcmFtZSwgbiwgJm5mcmFtZSk7CisgICAgICAgIH0KKworICAgICAgZ2NyeV9mcmVlKGZyYW1lKTsKKyAgICB9CisgIGVsc2UgaWYgKGlzX3BrY3MxICYmIGxoYXNoICYmICFmb3JfZW5jcnlwdGlvbikKKyAgICB7IAorICAgICAgLyogQ3JlYXRlIHBrY3MjMSBibG9jayB0eXBlIDEgcGFkZGluZy4gKi8KKyAgICAgIGlmIChnY3J5X3NleHBfbGVuZ3RoIChsaGFzaCkgIT0gMykKKyAgICAgICAgcmMgPSBHUEdfRVJSX0lOVl9PQko7CisgICAgICBlbHNlIGlmICggIShzPWdjcnlfc2V4cF9udGhfZGF0YSAobGhhc2gsIDEsICZuKSkgfHwgIW4gKQorICAgICAgICByYyA9IEdQR19FUlJfSU5WX09CSjsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHN0YXRpYyBzdHJ1Y3QgeyBjb25zdCBjaGFyICpuYW1lOyBpbnQgYWxnbzsgfSBoYXNobmFtZXNbXSA9IAorICAgICAgICAgIHsgeyAic2hhMSIsICAgR0NSWV9NRF9TSEExIH0sCisgICAgICAgICAgICB7ICJtZDUiLCAgICBHQ1JZX01EX01ENSB9LAorICAgICAgICAgICAgeyAic2hhMjU2IiwgR0NSWV9NRF9TSEEyNTYgfSwKKyAgICAgICAgICAgIHsgInJpcGVtZDE2MCIsIEdDUllfTURfUk1EMTYwIH0sCisgICAgICAgICAgICB7ICJybWQxNjAiLCBHQ1JZX01EX1JNRDE2MCB9LAorICAgICAgICAgICAgeyAic2hhMzg0IiwgR0NSWV9NRF9TSEEzODQgfSwKKyAgICAgICAgICAgIHsgInNoYTUxMiIsIEdDUllfTURfU0hBNTEyIH0sCisgICAgICAgICAgICB7ICJzaGEyMjQiLCBHQ1JZX01EX1NIQTIyNCB9LAorICAgICAgICAgICAgeyAibWQyIiwgICAgR0NSWV9NRF9NRDIgfSwKKyAgICAgICAgICAgIHsgIm1kNCIsICAgIEdDUllfTURfTUQ0IH0sCisgICAgICAgICAgICB7ICJ0aWdlciIsICBHQ1JZX01EX1RJR0VSIH0sCisgICAgICAgICAgICB7ICJoYXZhbCIsICBHQ1JZX01EX0hBVkFMIH0sCisgICAgICAgICAgICB7IE5VTEwsIDAgfQorICAgICAgICAgIH07CisgICAgICAgICAgaW50IGFsZ287CisgICAgICAgICAgYnl0ZSBhc25bMTAwXTsKKyAgICAgICAgICBieXRlICpmcmFtZSA9IE5VTEw7CisgICAgICAgICAgc2l6ZV90IG5mcmFtZSA9IChuYml0cys3KSAvIDg7CisgICAgICAgICAgY29uc3Qgdm9pZCAqIHZhbHVlOworICAgICAgICAgIHNpemVfdCB2YWx1ZWxlbjsKKyAgICAgICAgICBzaXplX3QgYXNubGVuLCBkbGVuOworICAgICAgICAgICAgCisgICAgICAgICAgZm9yIChpPTA7IGhhc2huYW1lc1tpXS5uYW1lOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICggc3RybGVuIChoYXNobmFtZXNbaV0ubmFtZSkgPT0gbgorICAgICAgICAgICAgICAgICAgICYmICFtZW1jbXAgKGhhc2huYW1lc1tpXS5uYW1lLCBzLCBuKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoaGFzaG5hbWVzW2ldLm5hbWUpCisgICAgICAgICAgICBhbGdvID0gaGFzaG5hbWVzW2ldLmFsZ287CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBJbiBjYXNlIG9mIG5vdCBsaXN0ZWQgb3IgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGhhc2gKKyAgICAgICAgICAgICAgICAgYWxnb3JpdGhtIHdlIGZhbGwgYmFjayB0byB0aGlzIHNvbWV3aGF0IHNsb3dlcgorICAgICAgICAgICAgICAgICBtZXRob2QuICBGdXJ0aGVyLCBpdCBhbHNvIGFsbG93cyB0byB1c2UgT0lEcyBhcworICAgICAgICAgICAgICAgICBhbGdvcml0aG0gbmFtZXMuICovCisgICAgICAgICAgICAgIGNoYXIgKnRtcG5hbWU7CisKKyAgICAgICAgICAgICAgdG1wbmFtZSA9IGdjcnlfbWFsbG9jIChuKzEpOworICAgICAgICAgICAgICBpZiAoIXRtcG5hbWUpCisgICAgICAgICAgICAgICAgYWxnbyA9IDA7ICAvKiBPdXQgb2YgY29yZSAtIHNpbGVudGx5IGdpdmUgdXAuICAqLworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgbWVtY3B5ICh0bXBuYW1lLCBzLCBuKTsKKyAgICAgICAgICAgICAgICAgIHRtcG5hbWVbbl0gPSAwOworICAgICAgICAgICAgICAgICAgYWxnbyA9IGdjcnlfbWRfbWFwX25hbWUgKHRtcG5hbWUpOworICAgICAgICAgICAgICAgICAgZ2NyeV9mcmVlICh0bXBuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBhc25sZW4gPSBESU0oYXNuKTsKKyAgICAgICAgICBkbGVuID0gZ2NyeV9tZF9nZXRfYWxnb19kbGVuIChhbGdvKTsKKworICAgICAgICAgIGlmICghYWxnbykKKyAgICAgICAgICAgIHJjID0gR1BHX0VSUl9ESUdFU1RfQUxHTzsKKyAgICAgICAgICBlbHNlIGlmICggISh2YWx1ZT1nY3J5X3NleHBfbnRoX2RhdGEgKGxoYXNoLCAyLCAmdmFsdWVsZW4pKQorICAgICAgICAgICAgICAgICAgICB8fCAhdmFsdWVsZW4gKQorICAgICAgICAgICAgcmMgPSBHUEdfRVJSX0lOVl9PQko7CisgICAgICAgICAgZWxzZSBpZiAoZ2NyeV9tZF9hbGdvX2luZm8gKGFsZ28sIEdDUllDVExfR0VUX0FTTk9JRCwgYXNuLCAmYXNubGVuKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogV2UgZG9uJ3QgaGF2ZSB5ZXQgYWxsIG9mIHRoZSBhYm92ZSBhbGdvcml0aG1zLiAgKi8KKyAgICAgICAgICAgICAgcmMgPSBHUEdfRVJSX05PVF9JTVBMRU1FTlRFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmICggdmFsdWVsZW4gIT0gZGxlbiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIEhhc2ggdmFsdWUgZG9lcyBub3QgbWF0Y2ggdGhlIGxlbmd0aCBvZiBkaWdlc3QgZm9yCisgICAgICAgICAgICAgICAgIHRoZSBnaXZlbiBhbGdvcml0aG0uICovCisgICAgICAgICAgICAgIHJjID0gR1BHX0VSUl9DT05GTElDVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmKCAhZGxlbiB8fCBkbGVuICsgYXNubGVuICsgNCA+IG5mcmFtZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogQ2FuJ3QgZW5jb2RlIGFuIERMRU4gYnl0ZSBkaWdlc3QgTUQgaW50byBhIE5GUkFNRQorICAgICAgICAgICAgICAgICBieXRlIGZyYW1lLiAqLworICAgICAgICAgICAgICByYyA9IEdQR19FUlJfVE9PX1NIT1JUOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKCAhKGZyYW1lID0gZ2NyeV9tYWxsb2MgKG5mcmFtZSkpICkKKyAgICAgICAgICAgIHJjID0gZ3BnX2Vycl9jb2RlX2Zyb21fZXJybm8gKGVycm5vKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7IC8qIEFzc2VtYmxlIHRoZSBwa2NzIzEgYmxvY2sgdHlwZSAxLiAqLworICAgICAgICAgICAgICBuID0gMDsKKyAgICAgICAgICAgICAgZnJhbWVbbisrXSA9IDA7CisgICAgICAgICAgICAgIGZyYW1lW24rK10gPSAxOyAvKiBibG9jayB0eXBlICovCisgICAgICAgICAgICAgIGkgPSBuZnJhbWUgLSB2YWx1ZWxlbiAtIGFzbmxlbiAtIDMgOworICAgICAgICAgICAgICBnY3J5X2Fzc2VydCAoaSA+IDEpOworICAgICAgICAgICAgICBtZW1zZXQgKGZyYW1lK24sIDB4ZmYsIGkgKTsKKyAgICAgICAgICAgICAgbiArPSBpOworICAgICAgICAgICAgICBmcmFtZVtuKytdID0gMDsKKyAgICAgICAgICAgICAgbWVtY3B5IChmcmFtZStuLCBhc24sIGFzbmxlbik7CisgICAgICAgICAgICAgIG4gKz0gYXNubGVuOworICAgICAgICAgICAgICBtZW1jcHkgKGZyYW1lK24sIHZhbHVlLCB2YWx1ZWxlbiApOworICAgICAgICAgICAgICBuICs9IHZhbHVlbGVuOworICAgICAgICAgICAgICBnY3J5X2Fzc2VydCAobiA9PSBuZnJhbWUpOworICAgICAgCisgICAgICAgICAgICAgIC8qIENvbnZlcnQgaXQgaW50byBhbiBNUEkuICBGSVhNRTogZXJyb3IgY2hlY2tpbmc/ICAqLworICAgICAgICAgICAgICBnY3J5X21waV9zY2FuIChyZXRfbXBpLCBHQ1JZTVBJX0ZNVF9VU0csIGZyYW1lLCBuLCAmbmZyYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBnY3J5X2ZyZWUgKGZyYW1lKTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHJjID0gR1BHX0VSUl9DT05GTElDVDsKKyAgIAorICBnY3J5X3NleHBfcmVsZWFzZSAobGRhdGEpOworICBnY3J5X3NleHBfcmVsZWFzZSAobGhhc2gpOworICBnY3J5X3NleHBfcmVsZWFzZSAobHZhbHVlKTsKKworICBpZiAoIXJjKQorICAgICpmbGFncyA9IHBhcnNlZF9mbGFnczsKKworICByZXR1cm4gcmM7Cit9CisKKworLyoKKyAgIERvIGEgUEsgZW5jcnlwdCBvcGVyYXRpb24KKyAgCisgICBDYWxsZXIgaGFzIHRvIHByb3ZpZGUgYSBwdWJsaWMga2V5IGFzIHRoZSBTRVhQIHBrZXkgYW5kIGRhdGEgYXMgYQorICAgU0VYUCB3aXRoIGp1c3Qgb25lIE1QSSBpbiBpdC4gQWx0ZXJuYXRpdmx5IFNfREFUQSBtaWdodCBiZSBhCisgICBjb21wbGV4IFMtRXhwcmVzc2lvbiwgc2ltaWxhciB0byB0aGUgb25lIHVzZWQgZm9yIHNpZ25hdHVyZQorICAgdmVyaWZpY2F0aW9uLiAgVGhpcyBwcm92aWRlcyBhIGZsYWcgd2hpY2ggYWxsb3dzIHRvIGhhbmRsZSBQS0NTIzEKKyAgIGJsb2NrIHR5cGUgMiBwYWRkaW5nLiAgVGhlIGZ1bmN0aW9uIHJldHVybnMgYSBhIHNleHAgd2hpY2ggbWF5IGJlCisgICBwYXNzZWQgdG8gdG8gcGtfZGVjcnlwdC4KKyAgCisgICBSZXR1cm5zOiAwIG9yIGFuIGVycm9yY29kZS4KKyAgCisgICBzX2RhdGEgPSBTZWUgY29tbWVudCBmb3Igc2V4cF9kYXRhX3RvX21waQorICAgc19wa2V5ID0gPGtleS1hcy1kZWZpbmVkLWluLXNleHBfdG9fa2V5PgorICAgcl9jaXBoID0gKGVuYy12YWwKKyAgICAgICAgICAgICAgICg8YWxnbz4KKyAgICAgICAgICAgICAgICAgKDxwYXJhbV9uYW1lMT4gPG1waT4pCisgICAgICAgICAgICAgICAgIC4uLgorICAgICAgICAgICAgICAgICAoPHBhcmFtX25hbWVuPiA8bXBpPikKKyAgICAgICAgICAgICAgICkpCisKKyovCitnY3J5X2Vycm9yX3QKK2djcnlfcGtfZW5jcnlwdCAoZ2NyeV9zZXhwX3QgKnJfY2lwaCwgZ2NyeV9zZXhwX3Qgc19kYXRhLCBnY3J5X3NleHBfdCBzX3BrZXkpCit7CisgIGdjcnlfbXBpX3QgKnBrZXkgPSBOVUxMLCBkYXRhID0gTlVMTCwgKmNpcGggPSBOVUxMOworICBjb25zdCBjaGFyICphbGdvX25hbWUsICphbGdvX2VsZW1zOworICBpbnQgZmxhZ3M7CisgIGdjcnlfZXJyX2NvZGVfdCByYzsKKyAgZ2NyeV9wa19zcGVjX3QgKnB1YmtleSA9IE5VTEw7CisgIGdjcnlfbW9kdWxlX3QgbW9kdWxlID0gTlVMTDsKKworICAqcl9jaXBoID0gTlVMTDsKKworICBSRUdJU1RFUl9ERUZBVUxUX1BVQktFWVM7CisKKyAgLyogR2V0IHRoZSBrZXkuICovCisgIHJjID0gc2V4cF90b19rZXkgKHNfcGtleSwgMCwgJnBrZXksICZtb2R1bGUpOworICBpZiAocmMpCisgICAgZ290byBsZWF2ZTsKKworICBnY3J5X2Fzc2VydCAobW9kdWxlKTsKKyAgcHVia2V5ID0gKGdjcnlfcGtfc3BlY190ICopIG1vZHVsZS0+c3BlYzsKKworICAvKiBJZiBhbGlhc2VzIGZvciB0aGUgYWxnb3JpdGhtIG5hbWUgZXhpc3RzLCB0YWtlIHRoZSBmaXJzdCBvbmUKKyAgICAgaW5zdGVhZCBvZiB0aGUgcmVndWxhciBuYW1lIHRvIGFkaGVyZSB0byBTUEtJIGNvbnZlbnRpb25zLiAgV2UKKyAgICAgYXNzdW1lIHRoYXQgdGhlIGZpcnN0IGFsaWFzIG5hbWUgaXMgdGhlIGxvd2VyY2FzZSB2ZXJzaW9uIG9mIHRoZQorICAgICByZWd1bGFyIG9uZS4gIFRoaXMgY2hhbmdlIGlzIHJlcXVpcmVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGgKKyAgICAgMS4xLjEyIGdlbmVyYXRlZCBTLWV4cHJlc3Npb25zLiAqLworICBhbGdvX25hbWUgPSBwdWJrZXktPmFsaWFzZXM/ICpwdWJrZXktPmFsaWFzZXMgOiBOVUxMOworICBpZiAoIWFsZ29fbmFtZSB8fCAhKmFsZ29fbmFtZSkKKyAgICBhbGdvX25hbWUgPSBwdWJrZXktPm5hbWU7CisgIAorICBhbGdvX2VsZW1zID0gcHVia2V5LT5lbGVtZW50c19lbmM7CisgIAorICAvKiBHZXQgdGhlIHN0dWZmIHdlIHdhbnQgdG8gZW5jcnlwdC4gKi8KKyAgcmMgPSBzZXhwX2RhdGFfdG9fbXBpIChzX2RhdGEsIGdjcnlfcGtfZ2V0X25iaXRzIChzX3BrZXkpLCAmZGF0YSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpOworICBpZiAocmMpCisgICAgZ290byBsZWF2ZTsKKworICAvKiBOb3cgd2UgY2FuIGVuY3J5cHQgREFUQSB0byBDSVBILiAqLworICBjaXBoID0gZ2NyeV9jYWxsb2MgKHN0cmxlbiAoYWxnb19lbGVtcykgKyAxLCBzaXplb2YgKCpjaXBoKSk7CisgIGlmICghY2lwaCkKKyAgICB7CisgICAgICByYyA9IGdwZ19lcnJfY29kZV9mcm9tX2Vycm5vIChlcnJubyk7CisgICAgICBnb3RvIGxlYXZlOworICAgIH0KKyAgcmMgPSBwdWJrZXlfZW5jcnlwdCAobW9kdWxlLT5tb2RfaWQsIGNpcGgsIGRhdGEsIHBrZXksIGZsYWdzKTsKKyAgbXBpX2ZyZWUgKGRhdGEpOworICBkYXRhID0gTlVMTDsKKyAgaWYgKHJjKQorICAgIGdvdG8gbGVhdmU7CisKKyAgLyogV2UgZGlkIGl0LiAgTm93IGJ1aWxkIHRoZSByZXR1cm4gbGlzdCAqLworICB7CisgICAgY2hhciAqc3RyaW5nLCAqcDsKKyAgICBpbnQgaTsKKyAgICBzaXplX3QgbmVsZW0gPSBzdHJsZW4gKGFsZ29fZWxlbXMpOworICAgIHNpemVfdCBuZWVkZWQgPSAxOSArIHN0cmxlbiAoYWxnb19uYW1lKSArIChuZWxlbSAqIDUpOworICAgIHZvaWQgKiphcmdfbGlzdDsKKyAgICAKKyAgICAvKiBCdWlsZCB0aGUgc3RyaW5nLiAgKi8KKyAgICBzdHJpbmcgPSBwID0gZ2NyeV9tYWxsb2MgKG5lZWRlZCk7CisgICAgaWYgKCFzdHJpbmcpCisgICAgICB7CisgICAgICAgIHJjID0gZ3BnX2Vycl9jb2RlX2Zyb21fZXJybm8gKGVycm5vKTsKKyAgICAgICAgZ290byBsZWF2ZTsKKyAgICAgIH0KKyAgICBwID0gc3RwY3B5ICggcCwgIihlbmMtdmFsKCIgKTsKKyAgICBwID0gc3RwY3B5ICggcCwgYWxnb19uYW1lICk7CisgICAgZm9yIChpPTA7IGFsZ29fZWxlbXNbaV07IGkrKyApCisgICAgICB7CisgICAgICAgICpwKysgPSAnKCc7CisgICAgICAgICpwKysgPSBhbGdvX2VsZW1zW2ldOworICAgICAgICBwID0gc3RwY3B5ICggcCwgIiVtKSIgKTsKKyAgICAgIH0KKyAgICBzdHJjcHkgKCBwLCAiKSkiICk7CisgICAgCisgICAgLyogQW5kIG5vdyB0aGUgdWdseSBwYXJ0OiBXZSBkb24ndCBoYXZlIGEgZnVuY3Rpb24gdG8gcGFzcyBhbgorICAgICAqIGFycmF5IHRvIGEgZm9ybWF0IHN0cmluZywgc28gd2UgaGF2ZSB0byBkbyBpdCB0aGlzIHdheSA6LSguICAqLworICAgIC8qIEZJWE1FOiBUaGVyZSBpcyBub3cgc3VjaCBhIGZvcm1hdCBzcGVjaWZpZXIsIHNvIHdlIGNhbgorICAgICAgIGNoYW5nZSB0aGUgY29kZSB0byBiZSBtb3JlIGNsZWFyLiAqLworICAgIGFyZ19saXN0ID0gbWFsbG9jIChuZWxlbSAqIHNpemVvZiAqYXJnX2xpc3QpOworICAgIGlmICghYXJnX2xpc3QpCisgICAgICB7CisgICAgICAgIHJjID0gZ3BnX2Vycl9jb2RlX2Zyb21fZXJybm8gKGVycm5vKTsKKyAgICAgICAgZ290byBsZWF2ZTsKKyAgICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBuZWxlbTsgaSsrKQorICAgICAgYXJnX2xpc3RbaV0gPSBjaXBoICsgaTsKKyAgICAKKyAgICByYyA9IGdjcnlfc2V4cF9idWlsZF9hcnJheSAocl9jaXBoLCBOVUxMLCBzdHJpbmcsIGFyZ19saXN0KTsKKyAgICBmcmVlIChhcmdfbGlzdCk7CisgICAgaWYgKHJjKQorICAgICAgQlVHICgpOworICAgIGdjcnlfZnJlZSAoc3RyaW5nKTsKKyAgfQorCisgbGVhdmU6CisgIGlmIChwa2V5KQorICAgIHsKKyAgICAgIHJlbGVhc2VfbXBpX2FycmF5IChwa2V5KTsKKyAgICAgIGdjcnlfZnJlZSAocGtleSk7CisgICAgfQorCisgIGlmIChjaXBoKQorICAgIHsKKyAgICAgIHJlbGVhc2VfbXBpX2FycmF5IChjaXBoKTsKKyAgICAgIGdjcnlfZnJlZSAoY2lwaCk7CisgICAgfQorCisgIGlmIChtb2R1bGUpCisgICAgeworICAgICAgYXRoX211dGV4X2xvY2sgKCZwdWJrZXlzX3JlZ2lzdGVyZWRfbG9jayk7CisgICAgICBfZ2NyeV9tb2R1bGVfcmVsZWFzZSAobW9kdWxlKTsKKyAgICAgIGF0aF9tdXRleF91bmxvY2sgKCZwdWJrZXlzX3JlZ2lzdGVyZWRfbG9jayk7CisgICAgfQorCisgIHJldHVybiBnY3J5X2Vycm9yIChyYyk7Cit9CisKKy8qIAorICAgRG8gYSBQSyBkZWNyeXB0IG9wZXJhdGlvbgorICAKKyAgIENhbGxlciBoYXMgdG8gcHJvdmlkZSBhIHNlY3JldCBrZXkgYXMgdGhlIFNFWFAgc2tleSBhbmQgZGF0YSBpbiBhCisgICBmb3JtYXQgYXMgY3JlYXRlZCBieSBnY3J5X3BrX2VuY3J5cHQuICBGb3IgaGlzdG9yaWMgcmVhc29ucyB0aGUKKyAgIGZ1bmN0aW9uIHJldHVybnMgc2ltcGx5IGFuIE1QSSBhcyBhbiBTLWV4cHJlc3Npb24gcGFydDsgdGhpcyBpcworICAgZGVwcmVjYXRlZCBhbmQgdGhlIG5ldyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgd2hpY2ggcmV0dXJucyBhIHJlYWwKKyAgIFMtZXhwcmVzc2lvbmwgdGhpcyBpcyBzZWxlY3RlZCBieSBhZGRpbmcgYXQgbGVhc3QgYW4gZW1wdHkgZmxhZ3MKKyAgIGxpc3QgdG8gU19EQVRBLgorICAgCisgICBSZXR1cm5zOiAwIG9yIGFuIGVycm9yY29kZS4KKyAgCisgICBzX2RhdGEgPSAoZW5jLXZhbAorICAgICAgICAgICAgICBbKGZsYWdzKV0KKyAgICAgICAgICAgICAgKDxhbGdvPgorICAgICAgICAgICAgICAgICg8cGFyYW1fbmFtZTE+IDxtcGk+KQorICAgICAgICAgICAgICAgIC4uLgorICAgICAgICAgICAgICAgICg8cGFyYW1fbmFtZW4+IDxtcGk+KQorICAgICAgICAgICAgICApKQorICAgc19za2V5ID0gPGtleS1hcy1kZWZpbmVkLWluLXNleHBfdG9fa2V5PgorICAgcl9wbGFpbj0gRWl0aGVyIGFuIGluY29tcGxldGUgUy1leHByZXNzaW9uIHdpdGhvdXQgdGhlIHBhcmVudGhlc2VzCisgICAgICAgICAgICBvciBpZiB0aGUgZmxhZ3MgbGlzdCBpcyB1c2VkIChldmVuIGlmIGVtcHR5KSBhIHJlYWwgUy1leHByZXNzaW9uOgorICAgICAgICAgICAgKHZhbHVlIFBMQUlOKS4gCisgKi8KK2djcnlfZXJyb3JfdAorZ2NyeV9wa19kZWNyeXB0IChnY3J5X3NleHBfdCAqcl9wbGFpbiwgZ2NyeV9zZXhwX3Qgc19kYXRhLCBnY3J5X3NleHBfdCBzX3NrZXkpCit7CisgIGdjcnlfbXBpX3QgKnNrZXkgPSBOVUxMLCAqZGF0YSA9IE5VTEwsIHBsYWluID0gTlVMTDsKKyAgaW50IG1vZGVybiwgd2FudF9wa2NzMSwgZmxhZ3M7CisgIGdjcnlfZXJyX2NvZGVfdCByYzsKKyAgZ2NyeV9tb2R1bGVfdCBtb2R1bGVfZW5jID0gTlVMTCwgbW9kdWxlX2tleSA9IE5VTEw7CisgIGdjcnlfcGtfc3BlY190ICpwdWJrZXkgPSBOVUxMOworCisgICpyX3BsYWluID0gTlVMTDsKKworICBSRUdJU1RFUl9ERUZBVUxUX1BVQktFWVM7CisKKyAgcmMgPSBzZXhwX3RvX2tleSAoc19za2V5LCAxLCAmc2tleSwgJm1vZHVsZV9rZXkpOworICBpZiAocmMpCisgICAgZ290byBsZWF2ZTsKKworICByYyA9IHNleHBfdG9fZW5jIChzX2RhdGEsICZkYXRhLCAmbW9kdWxlX2VuYywgJm1vZGVybiwgJndhbnRfcGtjczEsICZmbGFncyk7CisgIGlmIChyYykKKyAgICBnb3RvIGxlYXZlOworICAKKyAgaWYgKG1vZHVsZV9rZXktPm1vZF9pZCAhPSBtb2R1bGVfZW5jLT5tb2RfaWQpCisgICAgeworICAgICAgcmMgPSBHUEdfRVJSX0NPTkZMSUNUOyAvKiBLZXkgYWxnbyBkb2VzIG5vdCBtYXRjaCBkYXRhIGFsZ28uICovCisgICAgICBnb3RvIGxlYXZlOworICAgIH0KKworICBwdWJrZXkgPSAoZ2NyeV9wa19zcGVjX3QgKikgbW9kdWxlX2tleS0+c3BlYzsKKworICByYyA9IHB1YmtleV9kZWNyeXB0IChtb2R1bGVfa2V5LT5tb2RfaWQsICZwbGFpbiwgZGF0YSwgc2tleSwgZmxhZ3MpOworICBpZiAocmMpCisgICAgZ290byBsZWF2ZTsKKworICBpZiAoZ2NyeV9zZXhwX2J1aWxkIChyX3BsYWluLCBOVUxMLCBtb2Rlcm4/ICIodmFsdWUgJW0pIiA6ICIlbSIsIHBsYWluKSkKKyAgICBCVUcgKCk7CisgIAorIGxlYXZlOgorICBpZiAoc2tleSkKKyAgICB7CisgICAgICByZWxlYXNlX21waV9hcnJheSAoc2tleSk7CisgICAgICBnY3J5X2ZyZWUgKHNrZXkpOworICAgIH0KKworICBpZiAocGxhaW4pCisgICAgbXBpX2ZyZWUgKHBsYWluKTsKKworICBpZiAoZGF0YSkKKyAgICB7CisgICAgICByZWxlYXNlX21waV9hcnJheSAoZGF0YSk7CisgICAgICBnY3J5X2ZyZWUgKGRhdGEpOworICAgIH0KKworICBpZiAobW9kdWxlX2tleSB8fCBtb2R1bGVfZW5jKQorICAgIHsKKyAgICAgIGF0aF9tdXRleF9sb2NrICgmcHVia2V5c19yZWdpc3RlcmVkX2xvY2spOworICAgICAgaWYgKG1vZHVsZV9rZXkpCisJX2djcnlfbW9kdWxlX3JlbGVhc2UgKG1vZHVsZV9rZXkpOworICAgICAgaWYgKG1vZHVsZV9lbmMpCisJX2djcnlfbW9kdWxlX3JlbGVhc2UgKG1vZHVsZV9lbmMpOworICAgICAgYXRoX211dGV4X3VubG9jayAoJnB1YmtleXNfcmVnaXN0ZXJlZF9sb2NrKTsKKyAgICB9CisKKyAgcmV0dXJuIGdjcnlfZXJyb3IgKHJjKTsKK30KKworCisKKy8qCisgICBDcmVhdGUgYSBzaWduYXR1cmUuCisgIAorICAgQ2FsbGVyIGhhcyB0byBwcm92aWRlIGEgc2VjcmV0IGtleSBhcyB0aGUgU0VYUCBza2V5IGFuZCBkYXRhCisgICBleHByZXNzZWQgYXMgYSBTRVhQIGxpc3QgaGFzaCB3aXRoIG9ubHkgb25lIGVsZW1lbnQgd2hpY2ggc2hvdWxkCisgICBpbnN0YW50bHkgYmUgYXZhaWxhYmxlIGFzIGEgTVBJLiBBbHRlcm5hdGl2ZWx5IHRoZSBzdHJ1Y3R1cmUgZ2l2ZW4KKyAgIGJlbG93IG1heSBiZSB1c2VkIGZvciBTX0hBU0gsIGl0IHByb3ZpZGVzIHRoZSBhYmlsaXkgdG8gcGFzcyBmbGFncworICAgdG8gdGhlIG9wZXJhdGlvbjsgdGhlIG9ubHkgZmxhZyBkZWZpbmVkIGJ5IG5vdyBpcyAicGtjczEiIHdoaWNoCisgICBkb2VzIFBLQ1MjMSBibG9jayB0eXBlIDEgc3R5bGUgcGFkZGluZy4KKyAgCisgICBSZXR1cm5zOiAwIG9yIGFuIGVycm9yY29kZS4KKyAgICAgICAgICAgIEluIGNhc2Ugb2YgMCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIG5ldyBTRVhQIHdpdGggdGhlCisgICAgICAgICAgICBzaWduYXR1cmUgdmFsdWU7IHRoZSBzdHJ1Y3R1cmUgb2YgdGhpcyBzaWduYXR1cmUgZGVwZW5kcyBvbiB0aGUKKyAgICAgICAgICAgIG90aGVyIGFyZ3VtZW50cyBidXQgaXMgYWx3YXlzIHN1aXRhYmxlIHRvIGJlIHBhc3NlZCB0bworICAgICAgICAgICAgZ2NyeV9wa192ZXJpZnkKKyAgCisgICBzX2hhc2ggPSBTZWUgY29tbWVudCBmb3Igc2V4cF9kYXRhX3RvX21waQorICAgICAgICAgICAgICAgCisgICBzX3NrZXkgPSA8a2V5LWFzLWRlZmluZWQtaW4tc2V4cF90b19rZXk+CisgICByX3NpZyAgPSAoc2lnLXZhbAorICAgICAgICAgICAgICAoPGFsZ28+CisgICAgICAgICAgICAgICAgKDxwYXJhbV9uYW1lMT4gPG1waT4pCisgICAgICAgICAgICAgICAgLi4uCisgICAgICAgICAgICAgICAgKDxwYXJhbV9uYW1lbj4gPG1waT4pKQorICAgICAgICAgICAgIFsoaGFzaCBhbGdvKV0pIAorCisgIE5vdGUgdGhhdCAoaGFzaCBhbGdvKSBpbiBSX1NJRyBpcyBub3QgdXNlZC4KKyovCitnY3J5X2Vycm9yX3QKK2djcnlfcGtfc2lnbiAoZ2NyeV9zZXhwX3QgKnJfc2lnLCBnY3J5X3NleHBfdCBzX2hhc2gsIGdjcnlfc2V4cF90IHNfc2tleSkKK3sKKyAgZ2NyeV9tcGlfdCAqc2tleSA9IE5VTEwsIGhhc2ggPSBOVUxMLCAqcmVzdWx0ID0gTlVMTDsKKyAgZ2NyeV9wa19zcGVjX3QgKnB1YmtleSA9IE5VTEw7CisgIGdjcnlfbW9kdWxlX3QgbW9kdWxlID0gTlVMTDsKKyAgY29uc3QgY2hhciAqYWxnb19uYW1lLCAqYWxnb19lbGVtczsKKyAgaW50IGk7CisgIGdjcnlfZXJyX2NvZGVfdCByYzsKKworICAqcl9zaWcgPSBOVUxMOworCisgIFJFR0lTVEVSX0RFRkFVTFRfUFVCS0VZUzsKKworICByYyA9IHNleHBfdG9fa2V5IChzX3NrZXksIDEsICZza2V5LCAmbW9kdWxlKTsKKyAgaWYgKHJjKQorICAgIGdvdG8gbGVhdmU7CisKKyAgZ2NyeV9hc3NlcnQgKG1vZHVsZSk7CisgIHB1YmtleSA9IChnY3J5X3BrX3NwZWNfdCAqKSBtb2R1bGUtPnNwZWM7CisgIGFsZ29fbmFtZSA9IHB1YmtleS0+YWxpYXNlcz8gKnB1YmtleS0+YWxpYXNlcyA6IE5VTEw7CisgIGlmICghYWxnb19uYW1lIHx8ICEqYWxnb19uYW1lKQorICAgIGFsZ29fbmFtZSA9IHB1YmtleS0+bmFtZTsKKyAgCisgIGFsZ29fZWxlbXMgPSBwdWJrZXktPmVsZW1lbnRzX3NpZzsKKworICAvKiBHZXQgdGhlIHN0dWZmIHdlIHdhbnQgdG8gc2lnbi4gIE5vdGUgdGhhdCBwa19nZXRfbmJpdHMgZG9lcyBhbHNvCisgICAgICB3b3JrIG9uIGEgcHJpdmF0ZSBrZXkuICovCisgIHJjID0gc2V4cF9kYXRhX3RvX21waSAoc19oYXNoLCBnY3J5X3BrX2dldF9uYml0cyAoc19za2V5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhhc2gsIDAsIE5VTEwpOworICBpZiAocmMpCisgICAgZ290byBsZWF2ZTsKKworICByZXN1bHQgPSBnY3J5X2NhbGxvYyAoc3RybGVuIChhbGdvX2VsZW1zKSArIDEsIHNpemVvZiAoKnJlc3VsdCkpOworICBpZiAoIXJlc3VsdCkKKyAgICB7CisgICAgICByYyA9IGdwZ19lcnJfY29kZV9mcm9tX2Vycm5vIChlcnJubyk7CisgICAgICBnb3RvIGxlYXZlOworICAgIH0KKyAgcmMgPSBwdWJrZXlfc2lnbiAobW9kdWxlLT5tb2RfaWQsIHJlc3VsdCwgaGFzaCwgc2tleSk7CisgIGlmIChyYykKKyAgICBnb3RvIGxlYXZlOworCisgIHsKKyAgICBjaGFyICpzdHJpbmcsICpwOworICAgIHNpemVfdCBuZWxlbSwgbmVlZGVkID0gc3RybGVuIChhbGdvX25hbWUpICsgMjA7CisgICAgdm9pZCAqKmFyZ19saXN0OworCisgICAgbmVsZW0gPSBzdHJsZW4gKGFsZ29fZWxlbXMpOworICAgIAorICAgIC8qIENvdW50IGVsZW1lbnRzLCBzbyB0aGF0IHdlIGNhbiBhbGxvY2F0ZSBlbm91Z2ggc3BhY2UuICovCisgICAgbmVlZGVkICs9IDEwICogbmVsZW07CisKKyAgICAvKiBCdWlsZCB0aGUgc3RyaW5nLiAqLworICAgIHN0cmluZyA9IHAgPSBnY3J5X21hbGxvYyAobmVlZGVkKTsKKyAgICBpZiAoIXN0cmluZykKKyAgICAgIHsKKyAgICAgICAgcmMgPSBncGdfZXJyX2NvZGVfZnJvbV9lcnJubyAoZXJybm8pOworICAgICAgICBnb3RvIGxlYXZlOworICAgICAgfQorICAgIHAgPSBzdHBjcHkgKHAsICIoc2lnLXZhbCgiKTsKKyAgICBwID0gc3RwY3B5IChwLCBhbGdvX25hbWUpOworICAgIGZvciAoaSA9IDA7IGFsZ29fZWxlbXNbaV07IGkrKykKKyAgICAgIHsKKyAgICAgICAgKnArKyA9ICcoJzsKKyAgICAgICAgKnArKyA9IGFsZ29fZWxlbXNbaV07CisgICAgICAgIHAgPSBzdHBjcHkgKHAsICIlbSkiKTsKKyAgICAgIH0KKyAgICBzdHJjcHkgKHAsICIpKSIpOworCisgICAgYXJnX2xpc3QgPSBtYWxsb2MgKG5lbGVtICogc2l6ZW9mICphcmdfbGlzdCk7CisgICAgaWYgKCFhcmdfbGlzdCkKKyAgICAgIHsKKyAgICAgICAgcmMgPSBncGdfZXJyX2NvZGVfZnJvbV9lcnJubyAoZXJybm8pOworICAgICAgICBnb3RvIGxlYXZlOworICAgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IG5lbGVtOyBpKyspCisgICAgICBhcmdfbGlzdFtpXSA9IHJlc3VsdCArIGk7CisKKyAgICByYyA9IGdjcnlfc2V4cF9idWlsZF9hcnJheSAocl9zaWcsIE5VTEwsIHN0cmluZywgYXJnX2xpc3QpOworICAgIGZyZWUgKGFyZ19saXN0KTsKKyAgICBpZiAocmMpCisgICAgICBCVUcgKCk7CisgICAgZ2NyeV9mcmVlIChzdHJpbmcpOworICB9CisKKyBsZWF2ZToKKyAgaWYgKHNrZXkpCisgICAgeworICAgICAgcmVsZWFzZV9tcGlfYXJyYXkgKHNrZXkpOworICAgICAgZ2NyeV9mcmVlIChza2V5KTsKKyAgICB9CisKKyAgaWYgKGhhc2gpCisgICAgbXBpX2ZyZWUgKGhhc2gpOworCisgIGlmIChyZXN1bHQpCisgICAgeworICAgICAgcmVsZWFzZV9tcGlfYXJyYXkgKHJlc3VsdCk7CisgICAgICBnY3J5X2ZyZWUgKHJlc3VsdCk7CisgICAgfQorCisgIHJldHVybiBnY3J5X2Vycm9yIChyYyk7Cit9CisKKworLyoKKyAgIFZlcmlmeSBhIHNpZ25hdHVyZS4KKworICAgQ2FsbGVyIGhhcyB0byBzdXBwbHkgdGhlIHB1YmxpYyBrZXkgcGtleSwgdGhlIHNpZ25hdHVyZSBzaWcgYW5kIGhpcworICAgaGFzaHZhbHVlIGRhdGEuICBQdWJsaWMga2V5IGhhcyB0byBiZSBhIHN0YW5kYXJkIHB1YmxpYyBrZXkgZ2l2ZW4KKyAgIGFzIGFuIFMtRXhwLCBzaWcgaXMgYSBTLUV4cCBhcyByZXR1cm5lZCBmcm9tIGdjcnlfcGtfc2lnbiBhbmQgZGF0YQorICAgbXVzdCBiZSBhbiBTLUV4cCBsaWtlIHRoZSBvbmUgaW4gc2lnbiB0b28uICAqLworZ2NyeV9lcnJvcl90CitnY3J5X3BrX3ZlcmlmeSAoZ2NyeV9zZXhwX3Qgc19zaWcsIGdjcnlfc2V4cF90IHNfaGFzaCwgZ2NyeV9zZXhwX3Qgc19wa2V5KQoreworICBnY3J5X21vZHVsZV90IG1vZHVsZV9rZXkgPSBOVUxMLCBtb2R1bGVfc2lnID0gTlVMTDsKKyAgZ2NyeV9tcGlfdCAqcGtleSA9IE5VTEwsIGhhc2ggPSBOVUxMLCAqc2lnID0gTlVMTDsKKyAgZ2NyeV9lcnJfY29kZV90IHJjOworCisgIFJFR0lTVEVSX0RFRkFVTFRfUFVCS0VZUzsKKyAKKyAgcmMgPSBzZXhwX3RvX2tleSAoc19wa2V5LCAwLCAmcGtleSwgJm1vZHVsZV9rZXkpOworICBpZiAocmMpCisgICAgZ290byBsZWF2ZTsKKworICByYyA9IHNleHBfdG9fc2lnIChzX3NpZywgJnNpZywgJm1vZHVsZV9zaWcpOworICBpZiAocmMpCisgICAgZ290byBsZWF2ZTsKKworICAvKiBGaXhtZTogQ2hlY2sgdGhhdCB0aGUgYWxnb3JpdGhtIG9mIFNfU0lHIGlzIGNvbXBhdGlibGUgdG8gdGhlIG9uZQorICAgICBvZiBTX1BLRVkuICAqLworCisgIGlmIChtb2R1bGVfa2V5LT5tb2RfaWQgIT0gbW9kdWxlX3NpZy0+bW9kX2lkKQorICAgIHsKKyAgICAgIHJjID0gR1BHX0VSUl9DT05GTElDVDsKKyAgICAgIGdvdG8gbGVhdmU7CisgICAgfQorCisgIHJjID0gc2V4cF9kYXRhX3RvX21waSAoc19oYXNoLCBnY3J5X3BrX2dldF9uYml0cyAoc19wa2V5KSwgJmhhc2gsIDAsIDApOworICBpZiAocmMpCisgICAgZ290byBsZWF2ZTsKKworICByYyA9IHB1YmtleV92ZXJpZnkgKG1vZHVsZV9rZXktPm1vZF9pZCwgaGFzaCwgc2lnLCBwa2V5LCBOVUxMLCBOVUxMKTsKKworIGxlYXZlOgorICBpZiAocGtleSkKKyAgICB7CisgICAgICByZWxlYXNlX21waV9hcnJheSAocGtleSk7CisgICAgICBnY3J5X2ZyZWUgKHBrZXkpOworICAgIH0KKyAgaWYgKHNpZykKKyAgICB7CisgICAgICByZWxlYXNlX21waV9hcnJheSAoc2lnKTsKKyAgICAgIGdjcnlfZnJlZSAoc2lnKTsKKyAgICB9CisgIGlmIChoYXNoKQorICAgIG1waV9mcmVlIChoYXNoKTsKKworICBpZiAobW9kdWxlX2tleSB8fCBtb2R1bGVfc2lnKQorICAgIHsKKyAgICAgIGF0aF9tdXRleF9sb2NrICgmcHVia2V5c19yZWdpc3RlcmVkX2xvY2spOworICAgICAgaWYgKG1vZHVsZV9rZXkpCisJX2djcnlfbW9kdWxlX3JlbGVhc2UgKG1vZHVsZV9rZXkpOworICAgICAgaWYgKG1vZHVsZV9zaWcpCisJX2djcnlfbW9kdWxlX3JlbGVhc2UgKG1vZHVsZV9zaWcpOworICAgICAgYXRoX211dGV4X3VubG9jayAoJnB1YmtleXNfcmVnaXN0ZXJlZF9sb2NrKTsKKyAgICB9CisKKyAgcmV0dXJuIGdjcnlfZXJyb3IgKHJjKTsKK30KKworCisvKgorICAgVGVzdCBhIGtleS4KKworICAgVGhpcyBtYXkgYmUgdXNlZCBlaXRoZXIgZm9yIGEgcHVibGljIG9yIGEgc2VjcmV0IGtleSB0byBzZWUgd2hldGhlcgorICAgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBva2F5LgorICAKKyAgIFJldHVybnM6IDAgb3IgYW4gZXJyb3Jjb2RlLgorICAKKyAgIHNfa2V5ID0gPGtleS1hcy1kZWZpbmVkLWluLXNleHBfdG9fa2V5PiAqLworZ2NyeV9lcnJvcl90CitnY3J5X3BrX3Rlc3RrZXkgKGdjcnlfc2V4cF90IHNfa2V5KQoreworICBnY3J5X21vZHVsZV90IG1vZHVsZSA9IE5VTEw7CisgIGdjcnlfbXBpX3QgKmtleSA9IE5VTEw7CisgIGdjcnlfZXJyX2NvZGVfdCByYzsKKyAgCisgIFJFR0lTVEVSX0RFRkFVTFRfUFVCS0VZUzsKKworICAvKiBOb3RlIHdlIGN1cnJlbnRseSBzdXBwb3J0IG9ubHkgc2VjcmV0IGtleSBjaGVja2luZy4gKi8KKyAgcmMgPSBzZXhwX3RvX2tleSAoc19rZXksIDEsICZrZXksICZtb2R1bGUpOworICBpZiAoISByYykKKyAgICB7CisgICAgICByYyA9IHB1YmtleV9jaGVja19zZWNyZXRfa2V5IChtb2R1bGUtPm1vZF9pZCwga2V5KTsKKyAgICAgIHJlbGVhc2VfbXBpX2FycmF5IChrZXkpOworICAgICAgZ2NyeV9mcmVlIChrZXkpOworICAgIH0KKyAgcmV0dXJuIGdjcnlfZXJyb3IgKHJjKTsKK30KKworCisvKgorICBDcmVhdGUgYSBwdWJsaWMga2V5IHBhaXIgYW5kIHJldHVybiBpdCBpbiByX2tleS4KKyAgSG93IHRoZSBrZXkgaXMgY3JlYXRlZCBkZXBlbmRzIG9uIHNfcGFybXM6CisgIChnZW5rZXkKKyAgIChhbGdvCisgICAgIChwYXJhbWV0ZXJfbmFtZV8xIC4uLi4pCisgICAgICAuLi4uCisgICAgIChwYXJhbWV0ZXJfbmFtZV9uIC4uLi4pCisgICkpCisgIFRoZSBrZXkgaXMgcmV0dXJuZWQgaW4gYSBmb3JtYXQgZGVwZW5kaW5nIG9uIHRoZQorICBhbGdvcml0aG0uIEJvdGgsIHByaXZhdGUgYW5kIHNlY3JldCBrZXlzIGFyZSByZXR1cm5lZAorICBhbmQgb3B0aW9uYWxseSBzb21lIGFkZGl0aW9uYWwgaW5mb3JtYXRpbi4KKyAgRm9yIGVsZ2FtYWwgd2UgcmV0dXJuIHRoaXMgc3RydWN0dXJlOgorICAoa2V5LWRhdGEKKyAgIChwdWJsaWMta2V5CisgICAgIChlbGcKKyAJKHAgPG1waT4pCisgCShnIDxtcGk+KQorIAkoeSA8bXBpPikKKyAgICAgKQorICAgKQorICAgKHByaXZhdGUta2V5CisgICAgIChlbGcKKyAJKHAgPG1waT4pCisgCShnIDxtcGk+KQorIAkoeSA8bXBpPikKKyAJKHggPG1waT4pCisgICAgICkKKyAgICkKKyAgIChtaXNjLWtleS1pbmZvCisgICAgICAocG0xLWZhY3RvcnMgbjEgbjIgLi4uIG5uKQorICAgKSkKKyAqLworZ2NyeV9lcnJvcl90CitnY3J5X3BrX2dlbmtleSAoZ2NyeV9zZXhwX3QgKnJfa2V5LCBnY3J5X3NleHBfdCBzX3Bhcm1zKQoreworICBnY3J5X3BrX3NwZWNfdCAqcHVia2V5ID0gTlVMTDsKKyAgZ2NyeV9tb2R1bGVfdCBtb2R1bGUgPSBOVUxMOworICBnY3J5X3NleHBfdCBsaXN0ID0gTlVMTDsKKyAgZ2NyeV9zZXhwX3QgbDIgPSBOVUxMOworICBnY3J5X3NleHBfdCBsMyA9IE5VTEw7CisgIGNoYXIgKm5hbWUgPSBOVUxMOworICBzaXplX3QgbjsKKyAgZ2NyeV9lcnJfY29kZV90IHJjID0gR1BHX0VSUl9OT19FUlJPUjsKKyAgaW50IGk7CisgIGNvbnN0IGNoYXIgKmFsZ29fbmFtZSA9IE5VTEw7CisgIGludCBhbGdvOworICBjb25zdCBjaGFyICpzZWNfZWxlbXMgPSBOVUxMLCAqcHViX2VsZW1zID0gTlVMTDsKKyAgZ2NyeV9tcGlfdCBza2V5WzEyXTsKKyAgZ2NyeV9tcGlfdCAqZmFjdG9ycyA9IE5VTEw7CisgIGdjcnlfc2V4cF90IGV4dHJhaW5mbyA9IE5VTEw7CisgIHVuc2lnbmVkIGludCBuYml0cyA9IDA7CisgIHVuc2lnbmVkIGxvbmcgdXNlX2UgPSAwOworCisgIHNrZXlbMF0gPSBOVUxMOworICAqcl9rZXkgPSBOVUxMOworCisgIFJFR0lTVEVSX0RFRkFVTFRfUFVCS0VZUzsKKworICBsaXN0ID0gZ2NyeV9zZXhwX2ZpbmRfdG9rZW4gKHNfcGFybXMsICJnZW5rZXkiLCAwKTsKKyAgaWYgKCFsaXN0KQorICAgIHsKKyAgICAgIHJjID0gR1BHX0VSUl9JTlZfT0JKOyAvKiBEb2VzIG5vdCBjb250YWluIGdlbmtleSBkYXRhLiAqLworICAgICAgZ290byBsZWF2ZTsKKyAgICB9CisKKyAgbDIgPSBnY3J5X3NleHBfY2FkciAobGlzdCk7CisgIGdjcnlfc2V4cF9yZWxlYXNlIChsaXN0KTsKKyAgbGlzdCA9IGwyOworICBsMiA9IE5VTEw7CisgIGlmICghIGxpc3QpCisgICAgeworICAgICAgcmMgPSBHUEdfRVJSX05PX09CSjsgLyogTm8gY2RyIGZvciB0aGUgZ2Vua2V5LiAqLworICAgICAgZ290byBsZWF2ZTsKKyAgICB9CisKKyAgbmFtZSA9IF9nY3J5X3NleHBfbnRoX3N0cmluZyAobGlzdCwgMCk7CisgIGlmICghbmFtZSkKKyAgICB7CisgICAgICByYyA9IEdQR19FUlJfSU5WX09CSjsgLyogQWxnbyBzdHJpbmcgbWlzc2luZy4gICovCisgICAgICBnb3RvIGxlYXZlOworICAgIH0KKyAgCisgIGF0aF9tdXRleF9sb2NrICgmcHVia2V5c19yZWdpc3RlcmVkX2xvY2spOworICBtb2R1bGUgPSBnY3J5X3BrX2xvb2t1cF9uYW1lIChuYW1lKTsKKyAgYXRoX211dGV4X3VubG9jayAoJnB1YmtleXNfcmVnaXN0ZXJlZF9sb2NrKTsKKyAgZ2NyeV9mcmVlIChuYW1lKTsKKyAgbmFtZSA9IE5VTEw7CisgIGlmICghbW9kdWxlKQorICAgIHsKKyAgICAgIHJjID0gR1BHX0VSUl9QVUJLRVlfQUxHTzsgLyogVW5rbm93biBhbGdvcml0aG0uICAqLworICAgICAgZ290byBsZWF2ZTsKKyAgICB9CisgIAorICBwdWJrZXkgPSAoZ2NyeV9wa19zcGVjX3QgKikgbW9kdWxlLT5zcGVjOworICBhbGdvID0gbW9kdWxlLT5tb2RfaWQ7CisgIGFsZ29fbmFtZSA9IHB1YmtleS0+YWxpYXNlcz8gKnB1YmtleS0+YWxpYXNlcyA6IE5VTEw7CisgIGlmICghYWxnb19uYW1lIHx8ICEqYWxnb19uYW1lKQorICAgIGFsZ29fbmFtZSA9IHB1YmtleS0+bmFtZTsKKyAgcHViX2VsZW1zID0gcHVia2V5LT5lbGVtZW50c19wa2V5OworICBzZWNfZWxlbXMgPSBwdWJrZXktPmVsZW1lbnRzX3NrZXk7CisgIGlmIChzdHJsZW4gKHNlY19lbGVtcykgPj0gRElNKHNrZXkpKQorICAgIEJVRyAoKTsKKworICAvKiBIYW5kbGUgdGhlIG9wdGlvbmFsIHJzYS11c2UtZSBlbGVtZW50LiAgQWN0dWFsbHkgdGhpcyBiZWxvbmcgaW50bworICAgICB0aGUgYWxnb3JpdGhtIG1vZHVsZSBidXQgd2UgaGF2ZSB0aGlzIHBhcmFtZXRlciBpbiB0aGUgcHVibGljCisgICAgIG1vZHVsZSBBUEksIHNvIHdlIG5lZWQgdG8gcGFyc2UgaXQgcmlnaHQgaGVyZS4gICovCisgIGwyID0gZ2NyeV9zZXhwX2ZpbmRfdG9rZW4gKGxpc3QsICJyc2EtdXNlLWUiLCAwKTsKKyAgaWYgKGwyKQorICAgIHsKKyAgICAgIGNoYXIgYnVmWzUwXTsKKyAgICAgIGNvbnN0IGNoYXIgKnM7CisKKyAgICAgIHMgPSBnY3J5X3NleHBfbnRoX2RhdGEgKGwyLCAxLCAmbik7CisgICAgICBpZiAoICFzIHx8IG4gPj0gRElNIChidWYpIC0gMSApCisgICAgICAgIHsKKyAgICAgICAgICByYyA9IEdQR19FUlJfSU5WX09CSjsgLyogTm8gdmFsdWUgb3IgdmFsdWUgdG9vIGxhcmdlLiAgKi8KKyAgICAgICAgICBnb3RvIGxlYXZlOworICAgICAgICB9CisgICAgICBtZW1jcHkgKGJ1Ziwgcywgbik7CisgICAgICBidWZbbl0gPSAwOworICAgICAgdXNlX2UgPSBzdHJ0b3VsIChidWYsIE5VTEwsIDApOworICAgICAgZ2NyeV9zZXhwX3JlbGVhc2UgKGwyKTsKKyAgICAgIGwyID0gTlVMTDsKKyAgICB9CisgIGVsc2UKKyAgICB1c2VfZSA9IDY1NTM3OyAvKiBOb3QgZ2l2ZW4sIHVzZSB0aGUgdmFsdWUgZ2VuZXJhdGVkIGJ5IG9sZCB2ZXJzaW9ucy4gKi8KKworCisgIC8qIEdldCB0aGUgIm5iaXRzIiBwYXJhbWV0ZXIuICAqLworICBsMiA9IGdjcnlfc2V4cF9maW5kX3Rva2VuIChsaXN0LCAibmJpdHMiLCAwKTsKKyAgaWYgKGwyKQorICAgIHsKKyAgICAgIGNoYXIgYnVmWzUwXTsKKyAgICAgIGNvbnN0IGNoYXIgKnM7CisKKyAgICAgIHMgPSBnY3J5X3NleHBfbnRoX2RhdGEgKGwyLCAxLCAmbik7CisgICAgICBpZiAoIXMgfHwgbiA+PSBESU0gKGJ1ZikgLSAxICkKKyAgICAgICAgeworICAgICAgICAgIHJjID0gR1BHX0VSUl9JTlZfT0JKOyAvKiBOQklUUyBnaXZlbiB3aXRob3V0IGEgY2RyLiAgKi8KKyAgICAgICAgICBnb3RvIGxlYXZlOworICAgICAgICB9CisgICAgICBtZW1jcHkgKGJ1Ziwgcywgbik7CisgICAgICBidWZbbl0gPSAwOworICAgICAgbmJpdHMgPSAodW5zaWduZWQgaW50KXN0cnRvdWwgKGJ1ZiwgTlVMTCwgMCk7CisgICAgICBnY3J5X3NleHBfcmVsZWFzZSAobDIpOyBsMiA9IE5VTEw7CisgICAgfQorICBlbHNlIAorICAgIG5iaXRzID0gMDsKKworICAvKiBQYXNzIGNvbnRyb2wgdG8gdGhlIGFsZ29yaXRobSBtb2R1bGUuICovCisgIHJjID0gcHVia2V5X2dlbmVyYXRlIChtb2R1bGUtPm1vZF9pZCwgbmJpdHMsIHVzZV9lLCBsaXN0LCBza2V5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICZmYWN0b3JzLCAmZXh0cmFpbmZvKTsKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKGxpc3QpOyBsaXN0ID0gTlVMTDsKKyAgaWYgKHJjKQorICAgIGdvdG8gbGVhdmU7CisKKyAgLyogS2V5IGdlbmVyYXRpb24gc3VjY2VlZGVkOiBCdWlsZCBhbiBTLWV4cHJlc3Npb24uICAqLworICB7CisgICAgY2hhciAqc3RyaW5nLCAqcDsKKyAgICBzaXplX3QgbmVsZW09MCwgbmVsZW1fY3AgPSAwLCBuZWVkZWQ9MDsKKyAgICBnY3J5X21waV90IG1waXNbMzBdOworICAgIAorICAgIC8qIEVzdGltYXRlIHNpemUgb2YgZm9ybWF0IHN0cmluZy4gICovCisgICAgbmVsZW0gPSBzdHJsZW4gKHB1Yl9lbGVtcykgKyBzdHJsZW4gKHNlY19lbGVtcyk7CisgICAgaWYgKGZhY3RvcnMpCisgICAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGZhY3RvcnNbaV07IGkrKykKKyAgICAgICAgICBuZWxlbSsrOworICAgICAgfQorICAgIG5lbGVtX2NwID0gbmVsZW07CisKKyAgICBuZWVkZWQgKz0gbmVsZW0gKiAxMDsKKyAgICAvKiAoKzUgaXMgZm9yIEVYVFJBSU5GTyAoIiVTIikpLiAgKi8KKyAgICBuZWVkZWQgKz0gMiAqIHN0cmxlbiAoYWxnb19uYW1lKSArIDMwMCArIDU7CisgICAgaWYgKG5lbGVtID4gRElNIChtcGlzKSkKKyAgICAgIEJVRyAoKTsKKworICAgIC8qIEJ1aWxkIHRoZSBzdHJpbmcuICovCisgICAgbmVsZW0gPSAwOworICAgIHN0cmluZyA9IHAgPSBnY3J5X21hbGxvYyAobmVlZGVkKTsKKyAgICBpZiAoIXN0cmluZykKKyAgICAgIHsKKyAgICAgICAgcmMgPSBncGdfZXJyX2NvZGVfZnJvbV9lcnJubyAoZXJybm8pOworICAgICAgICBnb3RvIGxlYXZlOworICAgICAgfQorICAgIHAgPSBzdHBjcHkgKHAsICIoa2V5LWRhdGEiKTsKKyAgICBwID0gc3RwY3B5IChwLCAiKHB1YmxpYy1rZXkoIik7CisgICAgcCA9IHN0cGNweSAocCwgYWxnb19uYW1lKTsKKyAgICBmb3IoaSA9IDA7IHB1Yl9lbGVtc1tpXTsgaSsrKQorICAgICAgeworICAgICAgICAqcCsrID0gJygnOworICAgICAgICAqcCsrID0gcHViX2VsZW1zW2ldOworICAgICAgICBwID0gc3RwY3B5IChwLCAiJW0pIik7CisgICAgICAgIG1waXNbbmVsZW0rK10gPSBza2V5W2ldOworICAgICAgfQorICAgIHAgPSBzdHBjcHkgKHAsICIpKSIpOworICAgIHAgPSBzdHBjcHkgKHAsICIocHJpdmF0ZS1rZXkoIik7CisgICAgcCA9IHN0cGNweSAocCwgYWxnb19uYW1lKTsKKyAgICBmb3IgKGkgPSAwOyBzZWNfZWxlbXNbaV07IGkrKykKKyAgICAgIHsKKyAgICAgICAgKnArKyA9ICcoJzsKKyAgICAgICAgKnArKyA9IHNlY19lbGVtc1tpXTsKKyAgICAgICAgcCA9IHN0cGNweSAocCwgIiVtKSIpOworICAgICAgICBtcGlzW25lbGVtKytdID0gc2tleVtpXTsKKyAgICAgIH0KKyAgICBwID0gc3RwY3B5IChwLCAiKSkiKTsKKworICAgIC8qIEhhY2sgdG8gbWFrZSByZWxlYXNlX21waV9hcnJheSgpIHdvcmsuICAqLworICAgIHNrZXlbaV0gPSBOVUxMOworCisgICAgaWYgKGV4dHJhaW5mbykKKyAgICAgIHsKKyAgICAgICAgLyogSWYgd2UgaGF2ZSBleHRyYWluZm8gd2Ugc2hvdWxkIG5vdCBoYXZlIGFueSBmYWN0b3JzLiAgKi8KKyAgICAgICAgcCA9IHN0cGNweSAocCwgIiVTIik7CisgICAgICB9CisgICAgZWxzZSBpZiAoZmFjdG9ycyAmJiBmYWN0b3JzWzBdKQorICAgICAgeworICAgICAgICBwID0gc3RwY3B5IChwLCAiKG1pc2Mta2V5LWluZm8ocG0xLWZhY3RvcnMiKTsKKyAgICAgICAgZm9yKGkgPSAwOyBmYWN0b3JzW2ldOyBpKyspCisgICAgICAgICAgeworICAgICAgICAgICAgcCA9IHN0cGNweSAocCwgIiVtIik7CisgICAgICAgICAgICBtcGlzW25lbGVtKytdID0gZmFjdG9yc1tpXTsKKyAgICAgICAgICB9CisgICAgICAgIHAgPSBzdHBjcHkgKHAsICIpKSIpOworICAgICAgfQorICAgIHN0cmNweSAocCwgIikiKTsKKyAgICBnY3J5X2Fzc2VydCAocCAtIHN0cmluZyA8IG5lZWRlZCk7CisKKyAgICB3aGlsZSAobmVsZW0gPCBESU0gKG1waXMpKQorICAgICAgbXBpc1tuZWxlbSsrXSA9IE5VTEw7CisKKyAgICB7CisgICAgICBpbnQgZWxlbV9uID0gc3RybGVuIChwdWJfZWxlbXMpICsgc3RybGVuIChzZWNfZWxlbXMpOworICAgICAgdm9pZCAqKmFyZ19saXN0OworCisgICAgICAvKiBBbGxvY2F0ZSBvbmUgZXh0cmEgZm9yIEVYVFJBSU5GTyAoIiVTIikuICAqLworICAgICAgYXJnX2xpc3QgPSBnY3J5X2NhbGxvYyAobmVsZW1fY3ArMSwgc2l6ZW9mICphcmdfbGlzdCk7CisgICAgICBpZiAoIWFyZ19saXN0KQorICAgICAgICB7CisgICAgICAgICAgcmMgPSBncGdfZXJyX2NvZGVfZnJvbV9lcnJubyAoZXJybm8pOworICAgICAgICAgIGdvdG8gbGVhdmU7CisgICAgICAgIH0KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBlbGVtX247IGkrKykKKyAgICAgICAgYXJnX2xpc3RbaV0gPSBtcGlzICsgaTsKKyAgICAgIGlmIChleHRyYWluZm8pCisgICAgICAgIGFyZ19saXN0W2ldID0gJmV4dHJhaW5mbzsKKyAgICAgIGVsc2UgaWYgKGZhY3RvcnMgJiYgZmFjdG9yc1swXSkKKyAgICAgICAgeworICAgICAgICAgIGZvciAoOyBpIDwgbmVsZW1fY3A7IGkrKykKKyAgICAgICAgICAgIGFyZ19saXN0W2ldID0gZmFjdG9ycyArIGkgLSBlbGVtX247CisgICAgICAgIH0KKyAgICAgIAorICAgICAgcmMgPSBnY3J5X3NleHBfYnVpbGRfYXJyYXkgKHJfa2V5LCBOVUxMLCBzdHJpbmcsIGFyZ19saXN0KTsKKyAgICAgIGdjcnlfZnJlZSAoYXJnX2xpc3QpOworICAgICAgaWYgKHJjKQorCUJVRyAoKTsKKyAgICAgIGdjcnlfYXNzZXJ0IChESU0gKG1waXMpID09IDMwKTsgLyogUmVtaW5kZXIgdG8gbWFrZSBzdXJlIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFycmF5IGdldHMgaW5jcmVhc2VkIGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBwYXJhbWV0ZXJzIGFyZSBhZGRlZC4gKi8KKyAgICB9CisgICAgZ2NyeV9mcmVlIChzdHJpbmcpOworICB9CisKKyBsZWF2ZToKKyAgZ2NyeV9mcmVlIChuYW1lKTsKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKGV4dHJhaW5mbyk7CisgIHJlbGVhc2VfbXBpX2FycmF5IChza2V5KTsKKyAgLyogRG9uJ3QgZnJlZSBTS0VZIGl0c2VsZiwgaXQgaXMgYW4gc3RhY2sgYWxsb2NhdGVkIGFycmF5LiAqLworCisgIGlmIChmYWN0b3JzKQorICAgIHsKKyAgICAgIHJlbGVhc2VfbXBpX2FycmF5ICggZmFjdG9ycyApOworICAgICAgZ2NyeV9mcmVlIChmYWN0b3JzKTsKKyAgICB9CisgIAorICBnY3J5X3NleHBfcmVsZWFzZSAobDMpOworICBnY3J5X3NleHBfcmVsZWFzZSAobDIpOworICBnY3J5X3NleHBfcmVsZWFzZSAobGlzdCk7CisKKyAgaWYgKG1vZHVsZSkKKyAgICB7CisgICAgICBhdGhfbXV0ZXhfbG9jayAoJnB1YmtleXNfcmVnaXN0ZXJlZF9sb2NrKTsKKyAgICAgIF9nY3J5X21vZHVsZV9yZWxlYXNlIChtb2R1bGUpOworICAgICAgYXRoX211dGV4X3VubG9jayAoJnB1YmtleXNfcmVnaXN0ZXJlZF9sb2NrKTsKKyAgICB9CisKKyAgcmV0dXJuIGdjcnlfZXJyb3IgKHJjKTsKK30KKworCisvKiAKKyAgIEdldCB0aGUgbnVtYmVyIG9mIG5iaXRzIGZyb20gdGhlIHB1YmxpYyBrZXkuCisKKyAgIEhtbW06IFNob3VsZCB3ZSBoYXZlIHJlYWxseSB0aGlzIGZ1bmN0aW9uIG9yIGlzIGl0IGJldHRlciB0byBoYXZlIGEKKyAgIG1vcmUgZ2VuZXJhbCBmdW5jdGlvbiB0byByZXRyaWV2ZSBkaWZmZXJlbnQgcHJvcGVydGllcyBvZiB0aGUga2V5PyAgKi8KK3Vuc2lnbmVkIGludAorZ2NyeV9wa19nZXRfbmJpdHMgKGdjcnlfc2V4cF90IGtleSkKK3sKKyAgZ2NyeV9tb2R1bGVfdCBtb2R1bGUgPSBOVUxMOworICBnY3J5X3BrX3NwZWNfdCAqcHVia2V5OworICBnY3J5X21waV90ICprZXlhcnIgPSBOVUxMOworICB1bnNpZ25lZCBpbnQgbmJpdHMgPSAwOworICBnY3J5X2Vycl9jb2RlX3QgcmM7CisKKyAgUkVHSVNURVJfREVGQVVMVF9QVUJLRVlTOworCisgIHJjID0gc2V4cF90b19rZXkgKGtleSwgMCwgJmtleWFyciwgJm1vZHVsZSk7CisgIGlmIChyYyA9PSBHUEdfRVJSX0lOVl9PQkopCisgICAgcmMgPSBzZXhwX3RvX2tleSAoa2V5LCAxLCAma2V5YXJyLCAmbW9kdWxlKTsKKyAgaWYgKHJjKQorICAgIHJldHVybiAwOyAvKiBFcnJvciAtIDAgaXMgYSBzdWl0YWJsZSBpbmRpY2F0aW9uIGZvciB0aGF0LiAqLworCisgIHB1YmtleSA9IChnY3J5X3BrX3NwZWNfdCAqKSBtb2R1bGUtPnNwZWM7CisgIG5iaXRzID0gKCpwdWJrZXktPmdldF9uYml0cykgKG1vZHVsZS0+bW9kX2lkLCBrZXlhcnIpOworICAKKyAgYXRoX211dGV4X2xvY2sgKCZwdWJrZXlzX3JlZ2lzdGVyZWRfbG9jayk7CisgIF9nY3J5X21vZHVsZV9yZWxlYXNlIChtb2R1bGUpOworICBhdGhfbXV0ZXhfdW5sb2NrICgmcHVia2V5c19yZWdpc3RlcmVkX2xvY2spOworCisgIHJlbGVhc2VfbXBpX2FycmF5IChrZXlhcnIpOworICBnY3J5X2ZyZWUgKGtleWFycik7CisKKyAgcmV0dXJuIG5iaXRzOworfQorCisKKy8qIFJldHVybiB0aGUgc28gY2FsbGVkIEtFWUdSSVAgd2hpY2ggaXMgdGhlIFNIQS0xIGhhc2ggb2YgdGhlIHB1YmxpYworICAga2V5IHBhcmFtZXRlcnMgZXhwcmVzc2VkIGluIGEgd2F5IGRlcGVuZGVkIG9uIHRoZSBhbGdvcml0aG0uCisKKyAgIEFSUkFZIG11c3QgZWl0aGVyIGJlIDIwIGJ5dGVzIGxvbmcgb3IgTlVMTDsgaW4gdGhlIGxhdHRlciBjYXNlIGEKKyAgIG5ld2x5IGFsbG9jYXRlZCBhcnJheSBvZiB0aGF0IHNpemUgaXMgcmV0dXJuZWQsIG90aGVyd2lzZSBBUlJBWSBvcgorICAgTlVMTCBpcyByZXR1cm5lZCB0byBpbmRpY2F0ZSBhbiBlcnJvciB3aGljaCBpcyBtb3N0IGxpa2VseSBhbgorICAgdW5rbm93biBhbGdvcml0aG0uICBUaGUgZnVuY3Rpb24gYWNjZXB0cyBwdWJsaWMgb3Igc2VjcmV0IGtleXMuICovCit1bnNpZ25lZCBjaGFyICoKK2djcnlfcGtfZ2V0X2tleWdyaXAgKGdjcnlfc2V4cF90IGtleSwgdW5zaWduZWQgY2hhciAqYXJyYXkpCit7CisgIGdjcnlfc2V4cF90IGxpc3QgPSBOVUxMLCBsMiA9IE5VTEw7CisgIGdjcnlfcGtfc3BlY190ICpwdWJrZXkgPSBOVUxMOworICBnY3J5X21vZHVsZV90IG1vZHVsZSA9IE5VTEw7CisgIHBrX2V4dHJhX3NwZWNfdCAqZXh0cmFzcGVjOworICBjb25zdCBjaGFyICpzOworICBjaGFyICpuYW1lID0gTlVMTDsKKyAgaW50IGlkeDsKKyAgY29uc3QgY2hhciAqZWxlbXM7CisgIGdjcnlfbWRfaGRfdCBtZCA9IE5VTEw7CisKKyAgUkVHSVNURVJfREVGQVVMVF9QVUJLRVlTOworCisgIC8qIENoZWNrIHRoYXQgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdmFsaWQuICovCisgIGxpc3QgPSBnY3J5X3NleHBfZmluZF90b2tlbiAoa2V5LCAicHVibGljLWtleSIsIDApOworICBpZiAoISBsaXN0KQorICAgIGxpc3QgPSBnY3J5X3NleHBfZmluZF90b2tlbiAoa2V5LCAicHJpdmF0ZS1rZXkiLCAwKTsKKyAgaWYgKCEgbGlzdCkKKyAgICBsaXN0ID0gZ2NyeV9zZXhwX2ZpbmRfdG9rZW4gKGtleSwgInByb3RlY3RlZC1wcml2YXRlLWtleSIsIDApOworICBpZiAoISBsaXN0KQorICAgIGxpc3QgPSBnY3J5X3NleHBfZmluZF90b2tlbiAoa2V5LCAic2hhZG93ZWQtcHJpdmF0ZS1rZXkiLCAwKTsKKyAgaWYgKCEgbGlzdCkKKyAgICByZXR1cm4gTlVMTDsgLyogTm8gcHVibGljLSBvciBwcml2YXRlLWtleSBvYmplY3QuICovCisKKyAgbDIgPSBnY3J5X3NleHBfY2FkciAobGlzdCk7CisgIGdjcnlfc2V4cF9yZWxlYXNlIChsaXN0KTsKKyAgbGlzdCA9IGwyOworICBsMiA9IE5VTEw7CisKKyAgbmFtZSA9IF9nY3J5X3NleHBfbnRoX3N0cmluZyAobGlzdCwgMCk7CisgIGlmICghbmFtZSkKKyAgICBnb3RvIGZhaWw7IC8qIEludmFsaWQgc3RydWN0dXJlIG9mIG9iamVjdC4gKi8KKworICBhdGhfbXV0ZXhfbG9jayAoJnB1YmtleXNfcmVnaXN0ZXJlZF9sb2NrKTsKKyAgbW9kdWxlID0gZ2NyeV9wa19sb29rdXBfbmFtZSAobmFtZSk7CisgIGF0aF9tdXRleF91bmxvY2sgKCZwdWJrZXlzX3JlZ2lzdGVyZWRfbG9jayk7CisKKyAgaWYgKCFtb2R1bGUpCisgICAgZ290byBmYWlsOyAvKiBVbmtub3duIGFsZ29yaXRobS4gICovCisKKyAgcHVia2V5ID0gKGdjcnlfcGtfc3BlY190ICopIG1vZHVsZS0+c3BlYzsKKyAgZXh0cmFzcGVjID0gbW9kdWxlLT5leHRyYXNwZWM7CisKKyAgZWxlbXMgPSBwdWJrZXktPmVsZW1lbnRzX2dyaXA7CisgIGlmICghZWxlbXMpCisgICAgZ290byBmYWlsOyAvKiBObyBncmlwIHBhcmFtZXRlci4gICovCisgICAgCisgIGlmIChnY3J5X21kX29wZW4gKCZtZCwgR0NSWV9NRF9TSEExLCAwKSkKKyAgICBnb3RvIGZhaWw7CisKKyAgaWYgKGV4dHJhc3BlYyAmJiBleHRyYXNwZWMtPmNvbXBfa2V5Z3JpcCkKKyAgICB7CisgICAgICAvKiBNb2R1bGUgc3BlY2lmaWMgbWV0aG9kIHRvIGNvbXB1dGUgYSBrZXlncmlwLiAgKi8KKyAgICAgIGlmIChleHRyYXNwZWMtPmNvbXBfa2V5Z3JpcCAobWQsIGxpc3QpKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogR2VuZXJpYyBtZXRob2QgdG8gY29tcHV0ZSBhIGtleWdyaXAuICAqLworICAgICAgZm9yIChpZHggPSAwLCBzID0gZWxlbXM7ICpzOyBzKyssIGlkeCsrKQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgY2hhciAqZGF0YTsKKyAgICAgICAgICBzaXplX3QgZGF0YWxlbjsKKyAgICAgICAgICBjaGFyIGJ1ZlszMF07CisgICAgICAgICAgCisgICAgICAgICAgbDIgPSBnY3J5X3NleHBfZmluZF90b2tlbiAobGlzdCwgcywgMSk7CisgICAgICAgICAgaWYgKCEgbDIpCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgZGF0YSA9IGdjcnlfc2V4cF9udGhfZGF0YSAobDIsIDEsICZkYXRhbGVuKTsKKyAgICAgICAgICBpZiAoISBkYXRhKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgIAorICAgICAgICAgIHNucHJpbnRmIChidWYsIHNpemVvZiBidWYsICIoMTolYyV1OiIsICpzLCAodW5zaWduZWQgaW50KWRhdGFsZW4pOworICAgICAgICAgIGdjcnlfbWRfd3JpdGUgKG1kLCBidWYsIHN0cmxlbiAoYnVmKSk7CisgICAgICAgICAgZ2NyeV9tZF93cml0ZSAobWQsIGRhdGEsIGRhdGFsZW4pOworICAgICAgICAgIGdjcnlfc2V4cF9yZWxlYXNlIChsMik7CisgICAgICAgICAgZ2NyeV9tZF93cml0ZSAobWQsICIpIiwgMSk7CisgICAgICAgIH0KKyAgICB9CisgIAorICBpZiAoIWFycmF5KQorICAgIHsKKyAgICAgIGFycmF5ID0gZ2NyeV9tYWxsb2MgKDIwKTsKKyAgICAgIGlmICghIGFycmF5KQorICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgIG1lbWNweSAoYXJyYXksIGdjcnlfbWRfcmVhZCAobWQsIEdDUllfTURfU0hBMSksIDIwKTsKKyAgZ2NyeV9tZF9jbG9zZSAobWQpOworICBnY3J5X3NleHBfcmVsZWFzZSAobGlzdCk7CisgIHJldHVybiBhcnJheTsKKworIGZhaWw6CisgIGdjcnlfZnJlZSAobmFtZSk7CisgIGdjcnlfc2V4cF9yZWxlYXNlIChsMik7CisgIGdjcnlfbWRfY2xvc2UgKG1kKTsKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKGxpc3QpOworICByZXR1cm4gTlVMTDsKK30KKworCitnY3J5X2Vycm9yX3QKK2djcnlfcGtfY3RsIChpbnQgY21kLCB2b2lkICpidWZmZXIsIHNpemVfdCBidWZsZW4pCit7CisgIGdjcnlfZXJyX2NvZGVfdCBlcnIgPSBHUEdfRVJSX05PX0VSUk9SOworCisgIFJFR0lTVEVSX0RFRkFVTFRfUFVCS0VZUzsKKworICBzd2l0Y2ggKGNtZCkKKyAgICB7CisgICAgY2FzZSBHQ1JZQ1RMX0RJU0FCTEVfQUxHTzoKKyAgICAgIC8qIFRoaXMgb25lIGV4cGVjdHMgYSBidWZmZXIgcG9pbnRpbmcgdG8gYW4gaW50ZWdlciB3aXRoIHRoZQorICAgICAgICAgYWxnbyBudW1iZXIuICAqLworICAgICAgaWYgKCghIGJ1ZmZlcikgfHwgKGJ1ZmxlbiAhPSBzaXplb2YgKGludCkpKQorCWVyciA9IEdQR19FUlJfSU5WX0FSRzsKKyAgICAgIGVsc2UKKwlkaXNhYmxlX3B1YmtleV9hbGdvICgqKChpbnQgKikgYnVmZmVyKSk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBlcnIgPSBHUEdfRVJSX0lOVl9PUDsKKyAgICB9CisKKyAgcmV0dXJuIGdjcnlfZXJyb3IgKGVycik7Cit9CisKKworLyogUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSBnaXZlbiBhbGdvcml0aG0KKworICAgV0hBVCBzZWxlY3RzIHRoZSBraW5kIG9mIGluZm9ybWF0aW9uIHJldHVybmVkOgorCisgICAgR0NSWUNUTF9URVNUX0FMR086CisgICAgICAgIFJldHVybnMgMCB3aGVuIHRoZSBzcGVjaWZpZWQgYWxnb3JpdGhtIGlzIGF2YWlsYWJsZSBmb3IgdXNlLgorICAgICAgICBCdWZmZXIgbXVzdCBiZSBOVUxMLCBuYnl0ZXMgIG1heSBoYXZlIHRoZSBhZGRyZXNzIG9mIGEgdmFyaWFibGUKKyAgICAgICAgd2l0aCB0aGUgcmVxdWlyZWQgdXNhZ2Ugb2YgdGhlIGFsZ29yaXRobS4gSXQgbWF5IGJlIDAgZm9yIGRvbid0CisgICAgICAgIGNhcmUgb3IgYSBjb21iaW5hdGlvbiBvZiB0aGUgR0NSWV9QS19VU0FHRV94eHggZmxhZ3M7CisKKyAgICBHQ1JZQ1RMX0dFVF9BTEdPX1VTQUdFOgorICAgICAgICBSZXR1cm4gdGhlIHVzYWdlIGdsYWZzIGZvciB0aGUgZ2l2ZSBhbGdvLiAgQW4gaW52YWxpZCBhbG9nCisgICAgICAgIGRvZXMgcmV0dXJuIDAuICBEaXNhYmxlZCBhbGdvcyBhcmUgaWdub3JlZCBoZXJlIGJlY3Vhc2Ugd2UKKyAgICAgICAgb25seSB3YW50IHRvIGtub3cgd2hldGhlciB0aGUgYWxnbyBpcyBhdCBhbGwgY2FwYWJsZSBvZgorICAgICAgICB0aGUgdXNhZ2UuCisgIAorICAgTm90ZTogQmVjYXVzZSB0aGlzIGZ1bmN0aW9uIGlzIGluIG1vc3QgY2FzZXMgdXNlZCB0byByZXR1cm4gYW4KKyAgIGludGVnZXIgdmFsdWUsIHdlIGNhbiBtYWtlIGl0IGVhc2llciBmb3IgdGhlIGNhbGxlciB0byBqdXN0IGxvb2sgYXQKKyAgIHRoZSByZXR1cm4gdmFsdWUuICBUaGUgY2FsbGVyIHdpbGwgaW4gYWxsIGNhc2VzIGNvbnN1bHQgdGhlIHZhbHVlCisgICBhbmQgdGhlcmVieSBkZXRlY3Rpbmcgd2hldGhlciBhIGVycm9yIG9jY3VyZWQgb3Igbm90IChpLmUuIHdoaWxlCisgICBjaGVja2luZyB0aGUgYmxvY2sgc2l6ZSkgKi8KK2djcnlfZXJyb3JfdAorZ2NyeV9wa19hbGdvX2luZm8gKGludCBhbGdvcml0aG0sIGludCB3aGF0LCB2b2lkICpidWZmZXIsIHNpemVfdCAqbmJ5dGVzKQoreworICBnY3J5X2Vycl9jb2RlX3QgZXJyID0gR1BHX0VSUl9OT19FUlJPUjsKKworICBzd2l0Y2ggKHdoYXQpCisgICAgeworICAgIGNhc2UgR0NSWUNUTF9URVNUX0FMR086CisgICAgICB7CisJaW50IHVzZSA9IG5ieXRlcyA/ICpuYnl0ZXMgOiAwOworCWlmIChidWZmZXIpCisJICBlcnIgPSBHUEdfRVJSX0lOVl9BUkc7CisJZWxzZSBpZiAoY2hlY2tfcHVia2V5X2FsZ28gKGFsZ29yaXRobSwgdXNlKSkKKwkgIGVyciA9IEdQR19FUlJfUFVCS0VZX0FMR087CisJYnJlYWs7CisgICAgICB9CisKKyAgICBjYXNlIEdDUllDVExfR0VUX0FMR09fVVNBR0U6CisgICAgICB7CisJZ2NyeV9tb2R1bGVfdCBwdWJrZXk7CisJaW50IHVzZSA9IDA7CisKKwlSRUdJU1RFUl9ERUZBVUxUX1BVQktFWVM7CisKKwlhdGhfbXV0ZXhfbG9jayAoJnB1YmtleXNfcmVnaXN0ZXJlZF9sb2NrKTsKKwlwdWJrZXkgPSBfZ2NyeV9tb2R1bGVfbG9va3VwX2lkIChwdWJrZXlzX3JlZ2lzdGVyZWQsIGFsZ29yaXRobSk7CisJaWYgKHB1YmtleSkKKwkgIHsKKwkgICAgdXNlID0gKChnY3J5X3BrX3NwZWNfdCAqKSBwdWJrZXktPnNwZWMpLT51c2U7CisJICAgIF9nY3J5X21vZHVsZV9yZWxlYXNlIChwdWJrZXkpOworCSAgfQorCWF0aF9tdXRleF91bmxvY2sgKCZwdWJrZXlzX3JlZ2lzdGVyZWRfbG9jayk7CisKKwkvKiBGSVhNRT8gKi8KKwkqbmJ5dGVzID0gdXNlOworCisJYnJlYWs7CisgICAgICB9CisKKyAgICBjYXNlIEdDUllDVExfR0VUX0FMR09fTlBLRVk6CisgICAgICB7CisJLyogRklYTUU/ICAqLworCWludCBucGtleSA9IHB1YmtleV9nZXRfbnBrZXkgKGFsZ29yaXRobSk7CisJKm5ieXRlcyA9IG5wa2V5OworCWJyZWFrOworICAgICAgfQorICAgIGNhc2UgR0NSWUNUTF9HRVRfQUxHT19OU0tFWToKKyAgICAgIHsKKwkvKiBGSVhNRT8gICovCisJaW50IG5za2V5ID0gcHVia2V5X2dldF9uc2tleSAoYWxnb3JpdGhtKTsKKwkqbmJ5dGVzID0gbnNrZXk7CisJYnJlYWs7CisgICAgICB9CisgICAgY2FzZSBHQ1JZQ1RMX0dFVF9BTEdPX05TSUdOOgorICAgICAgeworCS8qIEZJWE1FPyAgKi8KKwlpbnQgbnNpZ24gPSBwdWJrZXlfZ2V0X25zaWcgKGFsZ29yaXRobSk7CisJKm5ieXRlcyA9IG5zaWduOworCWJyZWFrOworICAgICAgfQorICAgIGNhc2UgR0NSWUNUTF9HRVRfQUxHT19ORU5DUjoKKyAgICAgIHsKKwkvKiBGSVhNRT8gICovCisJaW50IG5lbmNyID0gcHVia2V5X2dldF9uZW5jIChhbGdvcml0aG0pOworCSpuYnl0ZXMgPSBuZW5jcjsKKwlicmVhazsKKyAgICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICBlcnIgPSBHUEdfRVJSX0lOVl9PUDsKKyAgICB9CisKKyAgcmV0dXJuIGdjcnlfZXJyb3IgKGVycik7Cit9CisKKworLyogRXhwbGljaXRseSBpbml0aWFsaXplIHRoaXMgbW9kdWxlLiAgKi8KK2djcnlfZXJyX2NvZGVfdAorX2djcnlfcGtfaW5pdCAodm9pZCkKK3sKKyAgZ2NyeV9lcnJfY29kZV90IGVyciA9IEdQR19FUlJfTk9fRVJST1I7CisKKyAgUkVHSVNURVJfREVGQVVMVF9QVUJLRVlTOworCisgIHJldHVybiBlcnI7Cit9CisKKworZ2NyeV9lcnJfY29kZV90CitfZ2NyeV9wa19tb2R1bGVfbG9va3VwIChpbnQgYWxnb3JpdGhtLCBnY3J5X21vZHVsZV90ICptb2R1bGUpCit7CisgIGdjcnlfZXJyX2NvZGVfdCBlcnIgPSBHUEdfRVJSX05PX0VSUk9SOworICBnY3J5X21vZHVsZV90IHB1YmtleTsKKworICBSRUdJU1RFUl9ERUZBVUxUX1BVQktFWVM7CisKKyAgYXRoX211dGV4X2xvY2sgKCZwdWJrZXlzX3JlZ2lzdGVyZWRfbG9jayk7CisgIHB1YmtleSA9IF9nY3J5X21vZHVsZV9sb29rdXBfaWQgKHB1YmtleXNfcmVnaXN0ZXJlZCwgYWxnb3JpdGhtKTsKKyAgaWYgKHB1YmtleSkKKyAgICAqbW9kdWxlID0gcHVia2V5OworICBlbHNlCisgICAgZXJyID0gR1BHX0VSUl9QVUJLRVlfQUxHTzsKKyAgYXRoX211dGV4X3VubG9jayAoJnB1YmtleXNfcmVnaXN0ZXJlZF9sb2NrKTsKKworICByZXR1cm4gZXJyOworfQorCisKK3ZvaWQKK19nY3J5X3BrX21vZHVsZV9yZWxlYXNlIChnY3J5X21vZHVsZV90IG1vZHVsZSkKK3sKKyAgYXRoX211dGV4X2xvY2sgKCZwdWJrZXlzX3JlZ2lzdGVyZWRfbG9jayk7CisgIF9nY3J5X21vZHVsZV9yZWxlYXNlIChtb2R1bGUpOworICBhdGhfbXV0ZXhfdW5sb2NrICgmcHVia2V5c19yZWdpc3RlcmVkX2xvY2spOworfQorCisvKiBHZXQgYSBsaXN0IGNvbnNpc3Rpbmcgb2YgdGhlIElEcyBvZiB0aGUgbG9hZGVkIHB1YmtleSBtb2R1bGVzLiAgSWYKKyAgIExJU1QgaXMgemVybywgd3JpdGUgdGhlIG51bWJlciBvZiBsb2FkZWQgcHVia2V5IG1vZHVsZXMgdG8KKyAgIExJU1RfTEVOR1RIIGFuZCByZXR1cm4uICBJZiBMSVNUIGlzIG5vbi16ZXJvLCB0aGUgZmlyc3QKKyAgICpMSVNUX0xFTkdUSCBhbGdvcml0aG0gSURzIGFyZSBzdG9yZWQgaW4gTElTVCwgd2hpY2ggbXVzdCBiZSBvZgorICAgYWNjb3JkaW5nIHNpemUuICBJbiBjYXNlIHRoZXJlIGFyZSBsZXNzIHB1YmtleSBtb2R1bGVzIHRoYW4KKyAgICpMSVNUX0xFTkdUSCwgKkxJU1RfTEVOR1RIIGlzIHVwZGF0ZWQgdG8gdGhlIGNvcnJlY3QgbnVtYmVyLiAgKi8KK2djcnlfZXJyb3JfdAorZ2NyeV9wa19saXN0IChpbnQgKmxpc3QsIGludCAqbGlzdF9sZW5ndGgpCit7CisgIGdjcnlfZXJyX2NvZGVfdCBlcnIgPSBHUEdfRVJSX05PX0VSUk9SOworCisgIGF0aF9tdXRleF9sb2NrICgmcHVia2V5c19yZWdpc3RlcmVkX2xvY2spOworICBlcnIgPSBfZ2NyeV9tb2R1bGVfbGlzdCAocHVia2V5c19yZWdpc3RlcmVkLCBsaXN0LCBsaXN0X2xlbmd0aCk7CisgIGF0aF9tdXRleF91bmxvY2sgKCZwdWJrZXlzX3JlZ2lzdGVyZWRfbG9jayk7CisKKyAgcmV0dXJuIGVycjsKK30KKworCisvKiBSdW4gdGhlIHNlbGZ0ZXN0cyBmb3IgcHVia2V5IGFsZ29yaXRobSBBTEdPIHdpdGggb3B0aW9uYWwgcmVwb3J0aW5nCisgICBmdW5jdGlvbiBSRVBPUlQuICAqLworZ3BnX2Vycm9yX3QKK19nY3J5X3BrX3NlbGZ0ZXN0IChpbnQgYWxnbywgaW50IGV4dGVuZGVkLCBzZWxmdGVzdF9yZXBvcnRfZnVuY190IHJlcG9ydCkKK3sKKyAgZ2NyeV9tb2R1bGVfdCBtb2R1bGUgPSBOVUxMOworICBwa19leHRyYV9zcGVjX3QgKmV4dHJhc3BlYyA9IE5VTEw7CisgIGdjcnlfZXJyX2NvZGVfdCBlYyA9IDA7CisKKyAgUkVHSVNURVJfREVGQVVMVF9QVUJLRVlTOworCisgIGF0aF9tdXRleF9sb2NrICgmcHVia2V5c19yZWdpc3RlcmVkX2xvY2spOworICBtb2R1bGUgPSBfZ2NyeV9tb2R1bGVfbG9va3VwX2lkIChwdWJrZXlzX3JlZ2lzdGVyZWQsIGFsZ28pOworICBpZiAobW9kdWxlICYmICEobW9kdWxlLT5mbGFncyAmIEZMQUdfTU9EVUxFX0RJU0FCTEVEKSkKKyAgICBleHRyYXNwZWMgPSBtb2R1bGUtPmV4dHJhc3BlYzsKKyAgYXRoX211dGV4X3VubG9jayAoJnB1YmtleXNfcmVnaXN0ZXJlZF9sb2NrKTsKKyAgaWYgKGV4dHJhc3BlYyAmJiBleHRyYXNwZWMtPnNlbGZ0ZXN0KQorICAgIGVjID0gZXh0cmFzcGVjLT5zZWxmdGVzdCAoYWxnbywgZXh0ZW5kZWQsIHJlcG9ydCk7CisgIGVsc2UKKyAgICB7CisgICAgICBlYyA9IEdQR19FUlJfUFVCS0VZX0FMR087CisgICAgICBpZiAocmVwb3J0KQorICAgICAgICByZXBvcnQgKCJwdWJrZXkiLCBhbGdvLCAibW9kdWxlIiwgCisgICAgICAgICAgICAgICAgbW9kdWxlICYmICEobW9kdWxlLT5mbGFncyAmIEZMQUdfTU9EVUxFX0RJU0FCTEVEKT8KKyAgICAgICAgICAgICAgICAibm8gc2VsZnRlc3QgYXZhaWxhYmxlIiA6CisgICAgICAgICAgICAgICAgbW9kdWxlPyAiYWxnb3JpdGhtIGRpc2FibGVkIiA6ICJhbGdvcml0aG0gbm90IGZvdW5kIik7CisgICAgfQorCisgIGlmIChtb2R1bGUpCisgICAgeworICAgICAgYXRoX211dGV4X2xvY2sgKCZwdWJrZXlzX3JlZ2lzdGVyZWRfbG9jayk7CisgICAgICBfZ2NyeV9tb2R1bGVfcmVsZWFzZSAobW9kdWxlKTsKKyAgICAgIGF0aF9tdXRleF91bmxvY2sgKCZwdWJrZXlzX3JlZ2lzdGVyZWRfbG9jayk7CisgICAgfQorICByZXR1cm4gZ3BnX2Vycm9yIChlYyk7Cit9CisKKworLyogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IHVzZWQgYnkgYWMuYyEgICovCitnY3J5X2Vycl9jb2RlX3QKK19nY3J5X3BrX2dldF9lbGVtZW50cyAoaW50IGFsZ28sIGNoYXIgKiplbmMsIGNoYXIgKipzaWcpCit7CisgIGdjcnlfbW9kdWxlX3QgcHVia2V5OworICBnY3J5X3BrX3NwZWNfdCAqc3BlYzsKKyAgZ2NyeV9lcnJfY29kZV90IGVycjsKKyAgY2hhciAqZW5jX2NwOworICBjaGFyICpzaWdfY3A7CisKKyAgUkVHSVNURVJfREVGQVVMVF9QVUJLRVlTOworCisgIGVuY19jcCA9IE5VTEw7CisgIHNpZ19jcCA9IE5VTEw7CisgIHNwZWMgPSBOVUxMOworCisgIHB1YmtleSA9IF9nY3J5X21vZHVsZV9sb29rdXBfaWQgKHB1YmtleXNfcmVnaXN0ZXJlZCwgYWxnbyk7CisgIGlmICghIHB1YmtleSkKKyAgICB7CisgICAgICBlcnIgPSBHUEdfRVJSX0lOVEVSTkFMOworICAgICAgZ290byBvdXQ7CisgICAgfQorICBzcGVjID0gcHVia2V5LT5zcGVjOworCisgIGlmIChlbmMpCisgICAgeworICAgICAgZW5jX2NwID0gc3RyZHVwIChzcGVjLT5lbGVtZW50c19lbmMpOworICAgICAgaWYgKCEgZW5jX2NwKQorCXsKKwkgIGVyciA9IGdwZ19lcnJfY29kZV9mcm9tX2Vycm5vIChlcnJubyk7CisJICBnb3RvIG91dDsKKwl9CisgICAgfQorICAKKyAgaWYgKHNpZykKKyAgICB7CisgICAgICBzaWdfY3AgPSBzdHJkdXAgKHNwZWMtPmVsZW1lbnRzX3NpZyk7CisgICAgICBpZiAoISBzaWdfY3ApCisJeworCSAgZXJyID0gZ3BnX2Vycl9jb2RlX2Zyb21fZXJybm8gKGVycm5vKTsKKwkgIGdvdG8gb3V0OworCX0KKyAgICB9CisKKyAgaWYgKGVuYykKKyAgICAqZW5jID0gZW5jX2NwOworICBpZiAoc2lnKQorICAgICpzaWcgPSBzaWdfY3A7CisgIGVyciA9IDA7CisKKyBvdXQ6CisKKyAgX2djcnlfbW9kdWxlX3JlbGVhc2UgKHB1YmtleSk7CisgIGlmIChlcnIpCisgICAgeworICAgICAgZnJlZSAoZW5jX2NwKTsKKyAgICAgIGZyZWUgKHNpZ19jcCk7CisgICAgfQorCisgIHJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvY2lwaGVyL3JmYzIyNjguYyBiL2xpYmdjcnlwdC0xLjQuNi9jaXBoZXIvcmZjMjI2OC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNjNmY2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvY2lwaGVyL3JmYzIyNjguYwpAQCAtMCwwICsxLDM0NSBAQAorLyogcmZjMjI2OC5jICAtIFRoZSBjaXBoZXIgZGVzY3JpYmVkIGluIHJmYzIyNjg7IGFrYSBSb24ncyBDaXBoZXIgMi4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBOaWtvcyBNYXZyb3lhbm9wb3Vsb3MKKyAqIENvcHlyaWdodCAoQykgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQKKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIGdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqLworCisvKiBUaGlzIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIGJ5IE5pa29zIE1hdnJveWFub3BvdWxvcyBmb3IgR05VVExTCisgKiBhcyBhIExpYmdjcnlwdCBtb2R1bGUgKGdudXRscy9saWIveDUwOS9yYzIuYykgYW5kIGxhdGVyIGFkYXB0ZWQgZm9yCisgKiBkaXJlY3QgdXNlIGJ5IExpYmdjcnlwdCBieSBXZXJuZXIgS29jaC4gIFRoaXMgaW1wbGVtZW50YXRpb24gaXMKKyAqIG9ubHkgdXNlZnVsIGZvciBwa2NzIzEyIGRlc2NyeXB0aW9uLgorICoKKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiBoZXJlIGlzIGJhc2VkIG9uIFBldGVyIEd1dG1hbm4ncyBSUkMuMiBwYXBlci4KKyAqLworCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImcxMGxpYi5oIgorI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAiY2lwaGVyLmgiCisKKyNkZWZpbmUgUkZDMjI2OF9CTE9DS1NJWkUgOAorCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgdTE2IFNbNjRdOworfSBSRkMyMjY4X2NvbnRleHQ7CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHJmYzIyNjhfc2JveFtdID0geyAKKyAgMjE3LCAxMjAsIDI0OSwgMTk2LCAgMjUsIDIyMSwgMTgxLCAyMzcsIAorICAgNDAsIDIzMywgMjUzLCAxMjEsICA3NCwgMTYwLCAyMTYsIDE1NywKKyAgMTk4LCAxMjYsICA1NSwgMTMxLCAgNDMsIDExOCwgIDgzLCAxNDIsIAorICAgOTgsICA3NiwgMTAwLCAxMzYsICA2OCwgMTM5LCAyNTEsIDE2MiwKKyAgIDIzLCAxNTQsICA4OSwgMjQ1LCAxMzUsIDE3OSwgIDc5LCAgMTksCisgICA5NywgIDY5LCAxMDksIDE0MSwgICA5LCAxMjksIDEyNSwgIDUwLAorICAxODksIDE0MywgIDY0LCAyMzUsIDEzNCwgMTgzLCAxMjMsICAxMSwKKyAgMjQwLCAxNDksICAzMywgIDM0LCAgOTIsIDEwNywgIDc4LCAxMzAsCisgICA4NCwgMjE0LCAxMDEsIDE0NywgMjA2LCAgOTYsIDE3OCwgIDI4LAorICAxMTUsICA4NiwgMTkyLCAgMjAsIDE2NywgMTQwLCAyNDEsIDIyMCwKKyAgIDE4LCAxMTcsIDIwMiwgIDMxLCAgNTksIDE5MCwgMjI4LCAyMDksCisgICA2NiwgIDYxLCAyMTIsICA0OCwgMTYzLCAgNjAsIDE4MiwgIDM4LAorICAxMTEsIDE5MSwgIDE0LCAyMTgsICA3MCwgMTA1LCAgIDcsICA4NywKKyAgIDM5LCAyNDIsICAyOSwgMTU1LCAxODgsIDE0OCwgIDY3LCAgIDMsCisgIDI0OCwgIDE3LCAxOTksIDI0NiwgMTQ0LCAyMzksICA2MiwgMjMxLAorICAgIDYsIDE5NSwgMjEzLCAgNDcsIDIwMCwgMTAyLCAgMzAsIDIxNSwKKyAgICA4LCAyMzIsIDIzNCwgMjIyLCAxMjgsICA4MiwgMjM4LCAyNDcsCisgIDEzMiwgMTcwLCAxMTQsIDE3MiwgIDUzLCAgNzcsIDEwNiwgIDQyLAorICAxNTAsICAyNiwgMjEwLCAxMTMsICA5MCwgIDIxLCAgNzMsIDExNiwKKyAgIDc1LCAxNTksIDIwOCwgIDk0LCAgIDQsICAyNCwgMTY0LCAyMzYsCisgIDE5NCwgMjI0LCAgNjUsIDExMCwgIDE1LCAgODEsIDIwMywgMjA0LAorICAgMzYsIDE0NSwgMTc1LCAgODAsIDE2MSwgMjQ0LCAxMTIsICA1NywKKyAgMTUzLCAxMjQsICA1OCwgMTMzLCAgMzUsIDE4NCwgMTgwLCAxMjIsCisgIDI1MiwgICAyLCAgNTQsICA5MSwgIDM3LCAgODUsIDE1MSwgIDQ5LAorICAgNDUsICA5MywgMjUwLCAxNTIsIDIyNywgMTM4LCAxNDYsIDE3NCwKKyAgICA1LCAyMjMsICA0MSwgIDE2LCAxMDMsIDEwOCwgMTg2LCAyMDEsCisgIDIxMSwgICAwLCAyMzAsIDIwNywgMjI1LCAxNTgsIDE2OCwgIDQ0LAorICAgOTksICAyMiwgICAxLCAgNjMsICA4OCwgMjI2LCAxMzcsIDE2OSwKKyAgIDEzLCAgNTYsICA1MiwgIDI3LCAxNzEsICA1MSwgMjU1LCAxNzYsCisgIDE4NywgIDcyLCAgMTIsICA5NSwgMTg1LCAxNzcsIDIwNSwgIDQ2LAorICAxOTcsIDI0MywgMjE5LCAgNzEsIDIyOSwgMTY1LCAxNTYsIDExOSwKKyAgIDEwLCAxNjYsICAzMiwgMTA0LCAyNTQsIDEyNywgMTkzLCAxNzMKK307CisKKyNkZWZpbmUgcm90bDE2KHgsbikgICAoKCh4KSA8PCAoKHUxNikobikpKSB8ICgoeCkgPj4gKDE2IC0gKHUxNikobikpKSkKKyNkZWZpbmUgcm90cjE2KHgsbikgICAoKCh4KSA+PiAoKHUxNikobikpKSB8ICgoeCkgPDwgKDE2IC0gKHUxNikobikpKSkKKworc3RhdGljIGNvbnN0IGNoYXIgKnNlbGZ0ZXN0ICh2b2lkKTsKKworCitzdGF0aWMgdm9pZAorZG9fZW5jcnlwdCAodm9pZCAqY29udGV4dCwgdW5zaWduZWQgY2hhciAqb3V0YnVmLCBjb25zdCB1bnNpZ25lZCBjaGFyICppbmJ1ZikKK3sKKyAgUkZDMjI2OF9jb250ZXh0ICpjdHggPSBjb250ZXh0OworICByZWdpc3RlciBpbnQgaSwgajsKKyAgdTE2IHdvcmQwID0gMCwgd29yZDEgPSAwLCB3b3JkMiA9IDAsIHdvcmQzID0gMDsKKworICB3b3JkMCA9ICh3b3JkMCA8PCA4KSB8IGluYnVmWzFdOworICB3b3JkMCA9ICh3b3JkMCA8PCA4KSB8IGluYnVmWzBdOworICB3b3JkMSA9ICh3b3JkMSA8PCA4KSB8IGluYnVmWzNdOworICB3b3JkMSA9ICh3b3JkMSA8PCA4KSB8IGluYnVmWzJdOworICB3b3JkMiA9ICh3b3JkMiA8PCA4KSB8IGluYnVmWzVdOworICB3b3JkMiA9ICh3b3JkMiA8PCA4KSB8IGluYnVmWzRdOworICB3b3JkMyA9ICh3b3JkMyA8PCA4KSB8IGluYnVmWzddOworICB3b3JkMyA9ICh3b3JkMyA8PCA4KSB8IGluYnVmWzZdOworCisgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgIHsKKyAgICAgIGogPSBpICogNDsKKyAgICAgIC8qIEZvciBzb21lIHJlYXNvbiBJIGNhbm5vdCBjb21iaW5lIHRob3NlIHN0ZXBzLiAqLworICAgICAgd29yZDAgKz0gKHdvcmQxICYgfndvcmQzKSArICh3b3JkMiAmIHdvcmQzKSArIGN0eC0+U1tqXTsKKyAgICAgIHdvcmQwID0gcm90bDE2KHdvcmQwLCAxKTsKKwkJCisgICAgICB3b3JkMSArPSAod29yZDIgJiB+d29yZDApICsgKHdvcmQzICYgd29yZDApICsgY3R4LT5TW2ogKyAxXTsKKyAgICAgIHdvcmQxID0gcm90bDE2KHdvcmQxLCAyKTsKKwkJCisgICAgICB3b3JkMiArPSAod29yZDMgJiB+d29yZDEpICsgKHdvcmQwICYgd29yZDEpICsgY3R4LT5TW2ogKyAyXTsKKyAgICAgIHdvcmQyID0gcm90bDE2KHdvcmQyLCAzKTsKKworICAgICAgd29yZDMgKz0gKHdvcmQwICYgfndvcmQyKSArICh3b3JkMSAmIHdvcmQyKSArIGN0eC0+U1tqICsgM107CisgICAgICB3b3JkMyA9IHJvdGwxNih3b3JkMywgNSk7CisKKyAgICAgIGlmIChpID09IDQgfHwgaSA9PSAxMCkKKyAgICAgICAgeworICAgICAgICAgIHdvcmQwICs9IGN0eC0+U1t3b3JkMyAmIDYzXTsKKyAgICAgICAgICB3b3JkMSArPSBjdHgtPlNbd29yZDAgJiA2M107CisgICAgICAgICAgd29yZDIgKz0gY3R4LT5TW3dvcmQxICYgNjNdOworICAgICAgICAgIHdvcmQzICs9IGN0eC0+U1t3b3JkMiAmIDYzXTsKKyAgICAgICAgfQorCisgICAgfQorCisgIG91dGJ1ZlswXSA9IHdvcmQwICYgMjU1OworICBvdXRidWZbMV0gPSB3b3JkMCA+PiA4OworICBvdXRidWZbMl0gPSB3b3JkMSAmIDI1NTsKKyAgb3V0YnVmWzNdID0gd29yZDEgPj4gODsKKyAgb3V0YnVmWzRdID0gd29yZDIgJiAyNTU7CisgIG91dGJ1Zls1XSA9IHdvcmQyID4+IDg7CisgIG91dGJ1Zls2XSA9IHdvcmQzICYgMjU1OworICBvdXRidWZbN10gPSB3b3JkMyA+PiA4OworfQorCitzdGF0aWMgdm9pZAorZG9fZGVjcnlwdCAodm9pZCAqY29udGV4dCwgdW5zaWduZWQgY2hhciAqb3V0YnVmLCBjb25zdCB1bnNpZ25lZCBjaGFyICppbmJ1ZikKK3sKKyAgUkZDMjI2OF9jb250ZXh0ICpjdHggPSBjb250ZXh0OworICByZWdpc3RlciBpbnQgaSwgajsKKyAgdTE2IHdvcmQwID0gMCwgd29yZDEgPSAwLCB3b3JkMiA9IDAsIHdvcmQzID0gMDsKKworICB3b3JkMCA9ICh3b3JkMCA8PCA4KSB8IGluYnVmWzFdOworICB3b3JkMCA9ICh3b3JkMCA8PCA4KSB8IGluYnVmWzBdOworICB3b3JkMSA9ICh3b3JkMSA8PCA4KSB8IGluYnVmWzNdOworICB3b3JkMSA9ICh3b3JkMSA8PCA4KSB8IGluYnVmWzJdOworICB3b3JkMiA9ICh3b3JkMiA8PCA4KSB8IGluYnVmWzVdOworICB3b3JkMiA9ICh3b3JkMiA8PCA4KSB8IGluYnVmWzRdOworICB3b3JkMyA9ICh3b3JkMyA8PCA4KSB8IGluYnVmWzddOworICB3b3JkMyA9ICh3b3JkMyA8PCA4KSB8IGluYnVmWzZdOworCisgIGZvciAoaSA9IDE1OyBpID49IDA7IGktLSkgCisgICAgeworICAgICAgaiA9IGkgKiA0OworCisgICAgICB3b3JkMyA9IHJvdHIxNih3b3JkMywgNSk7CisgICAgICB3b3JkMyAtPSAod29yZDAgJiB+d29yZDIpICsgKHdvcmQxICYgd29yZDIpICsgY3R4LT5TW2ogKyAzXTsKKworICAgICAgd29yZDIgPSByb3RyMTYod29yZDIsIDMpOworICAgICAgd29yZDIgLT0gKHdvcmQzICYgfndvcmQxKSArICh3b3JkMCAmIHdvcmQxKSArIGN0eC0+U1tqICsgMl07CisKKyAgICAgIHdvcmQxID0gcm90cjE2KHdvcmQxLCAyKTsKKyAgICAgIHdvcmQxIC09ICh3b3JkMiAmIH53b3JkMCkgKyAod29yZDMgJiB3b3JkMCkgKyBjdHgtPlNbaiArIDFdOworCisgICAgICB3b3JkMCA9IHJvdHIxNih3b3JkMCwgMSk7CisgICAgICB3b3JkMCAtPSAod29yZDEgJiB+d29yZDMpICsgKHdvcmQyICYgd29yZDMpICsgY3R4LT5TW2pdOworCisgICAgICBpZiAoaSA9PSA1IHx8IGkgPT0gMTEpIAorICAgICAgICB7CisgICAgICAgICAgd29yZDMgPSB3b3JkMyAtIGN0eC0+U1t3b3JkMiAmIDYzXTsKKyAgICAgICAgICB3b3JkMiA9IHdvcmQyIC0gY3R4LT5TW3dvcmQxICYgNjNdOworICAgICAgICAgIHdvcmQxID0gd29yZDEgLSBjdHgtPlNbd29yZDAgJiA2M107CisgICAgICAgICAgd29yZDAgPSB3b3JkMCAtIGN0eC0+U1t3b3JkMyAmIDYzXTsKKyAgICAgICAgfQorCisgICAgfQorCisgIG91dGJ1ZlswXSA9IHdvcmQwICYgMjU1OworICBvdXRidWZbMV0gPSB3b3JkMCA+PiA4OworICBvdXRidWZbMl0gPSB3b3JkMSAmIDI1NTsKKyAgb3V0YnVmWzNdID0gd29yZDEgPj4gODsKKyAgb3V0YnVmWzRdID0gd29yZDIgJiAyNTU7CisgIG91dGJ1Zls1XSA9IHdvcmQyID4+IDg7CisgIG91dGJ1Zls2XSA9IHdvcmQzICYgMjU1OworICBvdXRidWZbN10gPSB3b3JkMyA+PiA4OworfQorCisKK3N0YXRpYyBncGdfZXJyX2NvZGVfdAorc2V0a2V5X2NvcmUgKHZvaWQgKmNvbnRleHQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgdW5zaWduZWQgaW50IGtleWxlbiwgaW50IHdpdGhfcGhhc2UyKQoreworICBzdGF0aWMgaW50IGluaXRpYWxpemVkOworICBzdGF0aWMgY29uc3QgY2hhciAqc2VsZnRlc3RfZmFpbGVkOworICBSRkMyMjY4X2NvbnRleHQgKmN0eCA9IGNvbnRleHQ7CisgIHVuc2lnbmVkIGludCBpOworICB1bnNpZ25lZCBjaGFyICpTLCB4OworICBpbnQgbGVuOworICBpbnQgYml0cyA9IGtleWxlbiAqIDg7CisKKyAgaWYgKCFpbml0aWFsaXplZCkKKyAgICB7CisgICAgICBpbml0aWFsaXplZCA9IDE7CisgICAgICBzZWxmdGVzdF9mYWlsZWQgPSBzZWxmdGVzdCAoKTsKKyAgICAgIGlmIChzZWxmdGVzdF9mYWlsZWQpCisgICAgICAgIGxvZ19lcnJvciAoIlJGQzIyNjggc2VsZnRlc3QgZmFpbGVkICglcykuXG4iLCBzZWxmdGVzdF9mYWlsZWQpOworICAgIH0KKyAgaWYgKHNlbGZ0ZXN0X2ZhaWxlZCkKKyAgICByZXR1cm4gR1BHX0VSUl9TRUxGVEVTVF9GQUlMRUQ7CisKKyAgaWYgKGtleWxlbiA8IDQwIC8gOCkJLyogV2Ugd2FudCBhdCBsZWFzdCA0MCBiaXRzLiAqLworICAgIHJldHVybiBHUEdfRVJSX0lOVl9LRVlMRU47CisKKyAgUyA9ICh1bnNpZ25lZCBjaGFyICopIGN0eC0+UzsKKyAgCisgIGZvciAoaSA9IDA7IGkgPCBrZXlsZW47IGkrKykKKyAgICBTW2ldID0ga2V5W2ldOworCisgIGZvciAoaSA9IGtleWxlbjsgaSA8IDEyODsgaSsrKQorICAgIFNbaV0gPSByZmMyMjY4X3Nib3hbKFNbaSAtIGtleWxlbl0gKyBTW2kgLSAxXSkgJiAyNTVdOworCisgIFNbMF0gPSByZmMyMjY4X3Nib3hbU1swXV07CisKKyAgLyogUGhhc2UgMiAtIHJlZHVjZSBlZmZlY3RpdmUga2V5IHNpemUgdG8gImJpdHMiLiBUaGlzIHdhcyBub3QKKyAgICogZGlzY3Vzc2VkIGluIEd1dG1hbm4ncyBwYXBlci4gSSd2ZSBjb3BpZWQgdGhhdCBmcm9tIHRoZSBwdWJsaWMKKyAgICogZG9tYWluIGNvZGUgcG9zdGVkIGluIHNjaS5jcnlwdC4gKi8KKyAgaWYgKHdpdGhfcGhhc2UyKQorICAgIHsKKyAgICAgIGxlbiA9IChiaXRzICsgNykgPj4gMzsKKyAgICAgIGkgPSAxMjggLSBsZW47CisgICAgICB4ID0gcmZjMjI2OF9zYm94W1NbaV0gJiAoMjU1ID4+ICg3ICYgLWJpdHMpKV07CisgICAgICBTW2ldID0geDsKKyAgICAgIAorICAgICAgd2hpbGUgKGktLSkgCisgICAgICAgIHsKKyAgICAgICAgICB4ID0gcmZjMjI2OF9zYm94W3ggXiBTW2kgKyBsZW5dXTsKKyAgICAgICAgICBTW2ldID0geDsKKyAgICAgICAgfQorICAgIH0KKworICAvKiBNYWtlIHRoZSBleHBhbmRlZCBrZXksIGVuZGlhbiBpbmRlcGVuZGVudC4gKi8KKyAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIAorICAgIGN0eC0+U1tpXSA9ICggKHUxNikgU1tpICogMl0gfCAoKCh1MTYpIFNbaSAqIDIgKyAxXSkgPDwgOCkpOworCisgIHJldHVybiAwOworfQorCitzdGF0aWMgZ3BnX2Vycl9jb2RlX3QKK2RvX3NldGtleSAodm9pZCAqY29udGV4dCwgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuKQoreworICByZXR1cm4gc2V0a2V5X2NvcmUgKGNvbnRleHQsIGtleSwga2V5bGVuLCAxKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKgorc2VsZnRlc3QgKHZvaWQpCit7CisgIFJGQzIyNjhfY29udGV4dCBjdHg7CisgIHVuc2lnbmVkIGNoYXIgc2NyYXRjaFsxNl07CisKKyAgLyogVGVzdCB2ZWN0b3JzIGZyb20gUGV0ZXIgR3V0bWFubidzIHBhcGVyLiAqLworICBzdGF0aWMgdW5zaWduZWQgY2hhciBrZXlfMVtdID0KKyAgICB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCisgICAgfTsKKyAgc3RhdGljIHVuc2lnbmVkIGNoYXIgcGxhaW50ZXh0XzFbXSA9CisgICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH07CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGNpcGhlcnRleHRfMVtdID0KKyAgICB7IDB4MUMsIDB4MTksIDB4OEEsIDB4ODMsIDB4OEQsIDB4RjAsIDB4MjgsIDB4QjcgfTsKKworICBzdGF0aWMgdW5zaWduZWQgY2hhciBrZXlfMltdID0KKyAgICB7IDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCisgICAgICAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDBGCisgICAgfTsKKyAgc3RhdGljIHVuc2lnbmVkIGNoYXIgcGxhaW50ZXh0XzJbXSA9CisgICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH07CisgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGNpcGhlcnRleHRfMltdID0KKyAgICB7IDB4NTAsIDB4REMsIDB4MDEsIDB4NjIsIDB4QkQsIDB4NzUsIDB4N0YsIDB4MzEgfTsKKworICAvKiBUaGlzIG9uZSB3YXMgY2hlY2tlZCBhZ2FpbnN0IGxpYm1jcnlwdCdzIFJGQzIyNjguICovCisgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGtleV8zW10gPQorICAgIHsgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKKyAgICB9OworICBzdGF0aWMgdW5zaWduZWQgY2hhciBwbGFpbnRleHRfM1tdID0KKyAgICB7IDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfTsKKyAgc3RhdGljIHVuc2lnbmVkIGNoYXIgY2lwaGVydGV4dF8zW10gPQorICAgIHsgMHg4ZiwgMHhkMSwgMHgwMywgMHg4OSwgMHgzMywgMHg2YiwgMHhmOSwgMHg1ZSB9OworCisKKyAgLyogRmlyc3QgdGVzdC4gKi8KKyAgc2V0a2V5X2NvcmUgKCZjdHgsIGtleV8xLCBzaXplb2Yoa2V5XzEpLCAwKTsKKyAgZG9fZW5jcnlwdCAoJmN0eCwgc2NyYXRjaCwgcGxhaW50ZXh0XzEpOworCisgIGlmIChtZW1jbXAgKHNjcmF0Y2gsIGNpcGhlcnRleHRfMSwgc2l6ZW9mKGNpcGhlcnRleHRfMSkpKQorICAgIHJldHVybiAiUkZDMjI2OCBlbmNyeXB0aW9uIHRlc3QgMSBmYWlsZWQuIjsKKworICBzZXRrZXlfY29yZSAoJmN0eCwga2V5XzEsIHNpemVvZihrZXlfMSksIDApOworICBkb19kZWNyeXB0ICgmY3R4LCBzY3JhdGNoLCBzY3JhdGNoKTsgCisgIGlmIChtZW1jbXAgKHNjcmF0Y2gsIHBsYWludGV4dF8xLCBzaXplb2YocGxhaW50ZXh0XzEpKSkKKyAgICByZXR1cm4gIlJGQzIyNjggZGVjcnlwdGlvbiB0ZXN0IDEgZmFpbGVkLiI7CisKKyAgLyogU2Vjb25kIHRlc3QuICovCisgIHNldGtleV9jb3JlICgmY3R4LCBrZXlfMiwgc2l6ZW9mKGtleV8yKSwgMCk7CisgIGRvX2VuY3J5cHQgKCZjdHgsIHNjcmF0Y2gsIHBsYWludGV4dF8yKTsKKyAgaWYgKG1lbWNtcCAoc2NyYXRjaCwgY2lwaGVydGV4dF8yLCBzaXplb2YoY2lwaGVydGV4dF8yKSkpCisgICAgcmV0dXJuICJSRkMyMjY4IGVuY3J5cHRpb24gdGVzdCAyIGZhaWxlZC4iOworCisgIHNldGtleV9jb3JlICgmY3R4LCBrZXlfMiwgc2l6ZW9mKGtleV8yKSwgMCk7CisgIGRvX2RlY3J5cHQgKCZjdHgsIHNjcmF0Y2gsIHNjcmF0Y2gpOyAKKyAgaWYgKG1lbWNtcCAoc2NyYXRjaCwgcGxhaW50ZXh0XzIsIHNpemVvZihwbGFpbnRleHRfMikpKQorICAgIHJldHVybiAiUkZDMjI2OCBkZWNyeXB0aW9uIHRlc3QgMiBmYWlsZWQuIjsKKworICAvKiBUaGlyZCB0ZXN0LiAqLworICBzZXRrZXlfY29yZSgmY3R4LCBrZXlfMywgc2l6ZW9mKGtleV8zKSwgMCk7CisgIGRvX2VuY3J5cHQoJmN0eCwgc2NyYXRjaCwgcGxhaW50ZXh0XzMpOworCisgIGlmIChtZW1jbXAoc2NyYXRjaCwgY2lwaGVydGV4dF8zLCBzaXplb2YoY2lwaGVydGV4dF8zKSkpCisgICAgcmV0dXJuICJSRkMyMjY4IGVuY3J5cHRpb24gdGVzdCAzIGZhaWxlZC4iOworCisgIHNldGtleV9jb3JlICgmY3R4LCBrZXlfMywgc2l6ZW9mKGtleV8zKSwgMCk7CisgIGRvX2RlY3J5cHQgKCZjdHgsIHNjcmF0Y2gsIHNjcmF0Y2gpOyAKKyAgaWYgKG1lbWNtcChzY3JhdGNoLCBwbGFpbnRleHRfMywgc2l6ZW9mKHBsYWludGV4dF8zKSkpCisgICAgcmV0dXJuICJSRkMyMjY4IGRlY3J5cHRpb24gdGVzdCAzIGZhaWxlZC4iOworCisgIHJldHVybiBOVUxMOworfQorCisKKworc3RhdGljIGdjcnlfY2lwaGVyX29pZF9zcGVjX3Qgb2lkc19yZmMyMjY4XzQwW10gPQorICB7CisgICAgLyp7ICIxLjIuODQwLjExMzU0OS4zLjIiLCBHQ1JZX0NJUEhFUl9NT0RFX0NCQyB9LCovCisgICAgLyogcGJlV2l0aFNIQUFuZDQwQml0UkMyX0NCQyAqLworICAgIHsgIjEuMi44NDAuMTEzNTQ5LjEuMTIuMS42IiwgR0NSWV9DSVBIRVJfTU9ERV9DQkMgfSwKKyAgICB7IE5VTEwgfQorICB9OworCitnY3J5X2NpcGhlcl9zcGVjX3QgX2djcnlfY2lwaGVyX3NwZWNfcmZjMjI2OF80MCA9IHsKKyAgIlJGQzIyNjhfNDAiLCBOVUxMLCBvaWRzX3JmYzIyNjhfNDAsCisgIFJGQzIyNjhfQkxPQ0tTSVpFLCA0MCwgc2l6ZW9mKFJGQzIyNjhfY29udGV4dCksCisgIGRvX3NldGtleSwgZG9fZW5jcnlwdCwgZG9fZGVjcnlwdAorfTsKKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L2NpcGhlci9yaWpuZGFlbC10YWJsZXMuaCBiL2xpYmdjcnlwdC0xLjQuNi9jaXBoZXIvcmlqbmRhZWwtdGFibGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzliNmQ3NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9jaXBoZXIvcmlqbmRhZWwtdGFibGVzLmgKQEAgLTAsMCArMSwxNjg3IEBACisvKiByaWpuZGFlbC10YWJsZXMuaCAtIFJpam5kYWVsIChBRVMpIGZvciBHbnVQRywgCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDcsCisgKiAgICAgICAgICAgICAgIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKy8qIFRvIGtlZXAgdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBhdCBhIHJlYWRhYmxlIHNpemUgd2UgdXNlIHRoaXMKKyAgIGluY2x1ZGUgZmlsZSB0byBkZWZpbmUgdGhlIHRhYmxlcy4gICovCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNbMjU2XSA9IAorICB7CisgICAgIDk5LCAxMjQsIDExOSwgMTIzLCAyNDIsIDEwNywgMTExLCAxOTcsCisgICAgIDQ4LCAgIDEsIDEwMywgIDQzLCAyNTQsIDIxNSwgMTcxLCAxMTgsIAorICAgIDIwMiwgMTMwLCAyMDEsIDEyNSwgMjUwLCAgODksICA3MSwgMjQwLAorICAgIDE3MywgMjEyLCAxNjIsIDE3NSwgMTU2LCAxNjQsIDExNCwgMTkyLCAKKyAgICAxODMsIDI1MywgMTQ3LCAgMzgsICA1NCwgIDYzLCAyNDcsIDIwNCwKKyAgICAgNTIsIDE2NSwgMjI5LCAyNDEsIDExMywgMjE2LCAgNDksICAyMSwgCisgICAgICA0LCAxOTksICAzNSwgMTk1LCAgMjQsIDE1MCwgICA1LCAxNTQsCisgICAgICA3LCAgMTgsIDEyOCwgMjI2LCAyMzUsICAzOSwgMTc4LCAxMTcsIAorICAgICAgOSwgMTMxLCAgNDQsICAyNiwgIDI3LCAxMTAsICA5MCwgMTYwLCAKKyAgICAgODIsICA1OSwgMjE0LCAxNzksICA0MSwgMjI3LCAgNDcsIDEzMiwgCisgICAgIDgzLCAyMDksICAgMCwgMjM3LCAgMzIsIDI1MiwgMTc3LCAgOTEsCisgICAgMTA2LCAyMDMsIDE5MCwgIDU3LCAgNzQsICA3NiwgIDg4LCAyMDcsIAorICAgIDIwOCwgMjM5LCAxNzAsIDI1MSwgIDY3LCAgNzcsICA1MSwgMTMzLAorICAgICA2OSwgMjQ5LCAgIDIsIDEyNywgIDgwLCAgNjAsIDE1OSwgMTY4LCAKKyAgICAgODEsIDE2MywgIDY0LCAxNDMsIDE0NiwgMTU3LCAgNTYsIDI0NSwKKyAgICAxODgsIDE4MiwgMjE4LCAgMzMsICAxNiwgMjU1LCAyNDMsIDIxMCwgCisgICAgMjA1LCAgMTIsICAxOSwgMjM2LCAgOTUsIDE1MSwgIDY4LCAgMjMsCisgICAgMTk2LCAxNjcsIDEyNiwgIDYxLCAxMDAsICA5MywgIDI1LCAxMTUsIAorICAgICA5NiwgMTI5LCAgNzksIDIyMCwgIDM0LCAgNDIsIDE0NCwgMTM2LAorICAgICA3MCwgMjM4LCAxODQsICAyMCwgMjIyLCAgOTQsICAxMSwgMjE5LCAKKyAgICAyMjQsICA1MCwgIDU4LCAgMTAsICA3MywgICA2LCAgMzYsICA5MiwKKyAgICAxOTQsIDIxMSwgMTcyLCAgOTgsIDE0NSwgMTQ5LCAyMjgsIDEyMSwgCisgICAgMjMxLCAyMDAsICA1NSwgMTA5LCAxNDEsIDIxMywgIDc4LCAxNjksIAorICAgIDEwOCwgIDg2LCAyNDQsIDIzNCwgMTAxLCAxMjIsIDE3NCwgICA4LCAKKyAgICAxODYsIDEyMCwgIDM3LCAgNDYsICAyOCwgMTY2LCAxODAsIDE5OCwgCisgICAgMjMyLCAyMjEsIDExNiwgIDMxLCAgNzUsIDE4OSwgMTM5LCAxMzgsIAorICAgIDExMiwgIDYyLCAxODEsIDEwMiwgIDcyLCAgIDMsIDI0NiwgIDE0LAorICAgICA5NywgIDUzLCAgODcsIDE4NSwgMTM0LCAxOTMsICAyOSwgMTU4LCAKKyAgICAyMjUsIDI0OCwgMTUyLCAgMTcsIDEwNSwgMjE3LCAxNDIsIDE0OCwKKyAgICAxNTUsICAzMCwgMTM1LCAyMzMsIDIwNiwgIDg1LCAgNDAsIDIyMywgCisgICAgMTQwLCAxNjEsIDEzNywgIDEzLCAxOTEsIDIzMCwgIDY2LCAxMDQsIAorICAgICA2NSwgMTUzLCAgNDUsICAxNSwgMTc2LCAgODQsIDE4NywgIDIyCisgIH07CisKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgVDFbMjU2XVs0XSA9IAorICB7CisgICAgeyAweGM2LDB4NjMsMHg2MywweGE1IH0sIHsgMHhmOCwweDdjLDB4N2MsMHg4NCB9LAorICAgIHsgMHhlZSwweDc3LDB4NzcsMHg5OSB9LCB7IDB4ZjYsMHg3YiwweDdiLDB4OGQgfSwgCisgICAgeyAweGZmLDB4ZjIsMHhmMiwweDBkIH0sIHsgMHhkNiwweDZiLDB4NmIsMHhiZCB9LAorICAgIHsgMHhkZSwweDZmLDB4NmYsMHhiMSB9LCB7IDB4OTEsMHhjNSwweGM1LDB4NTQgfSwgCisgICAgeyAweDYwLDB4MzAsMHgzMCwweDUwIH0sIHsgMHgwMiwweDAxLDB4MDEsMHgwMyB9LAorICAgIHsgMHhjZSwweDY3LDB4NjcsMHhhOSB9LCB7IDB4NTYsMHgyYiwweDJiLDB4N2QgfSwgCisgICAgeyAweGU3LDB4ZmUsMHhmZSwweDE5IH0sIHsgMHhiNSwweGQ3LDB4ZDcsMHg2MiB9LAorICAgIHsgMHg0ZCwweGFiLDB4YWIsMHhlNiB9LCB7IDB4ZWMsMHg3NiwweDc2LDB4OWEgfSwgCisgICAgeyAweDhmLDB4Y2EsMHhjYSwweDQ1IH0sIHsgMHgxZiwweDgyLDB4ODIsMHg5ZCB9LAorICAgIHsgMHg4OSwweGM5LDB4YzksMHg0MCB9LCB7IDB4ZmEsMHg3ZCwweDdkLDB4ODcgfSwgCisgICAgeyAweGVmLDB4ZmEsMHhmYSwweDE1IH0sIHsgMHhiMiwweDU5LDB4NTksMHhlYiB9LCAKKyAgICB7IDB4OGUsMHg0NywweDQ3LDB4YzkgfSwgeyAweGZiLDB4ZjAsMHhmMCwweDBiIH0sIAorICAgIHsgMHg0MSwweGFkLDB4YWQsMHhlYyB9LCB7IDB4YjMsMHhkNCwweGQ0LDB4NjcgfSwKKyAgICB7IDB4NWYsMHhhMiwweGEyLDB4ZmQgfSwgeyAweDQ1LDB4YWYsMHhhZiwweGVhIH0sIAorICAgIHsgMHgyMywweDljLDB4OWMsMHhiZiB9LCB7IDB4NTMsMHhhNCwweGE0LDB4ZjcgfSwKKyAgICB7IDB4ZTQsMHg3MiwweDcyLDB4OTYgfSwgeyAweDliLDB4YzAsMHhjMCwweDViIH0sIAorICAgIHsgMHg3NSwweGI3LDB4YjcsMHhjMiB9LCB7IDB4ZTEsMHhmZCwweGZkLDB4MWMgfSwKKyAgICB7IDB4M2QsMHg5MywweDkzLDB4YWUgfSwgeyAweDRjLDB4MjYsMHgyNiwweDZhIH0sIAorICAgIHsgMHg2YywweDM2LDB4MzYsMHg1YSB9LCB7IDB4N2UsMHgzZiwweDNmLDB4NDEgfSwKKyAgICB7IDB4ZjUsMHhmNywweGY3LDB4MDIgfSwgeyAweDgzLDB4Y2MsMHhjYywweDRmIH0sIAorICAgIHsgMHg2OCwweDM0LDB4MzQsMHg1YyB9LCB7IDB4NTEsMHhhNSwweGE1LDB4ZjQgfSwgCisgICAgeyAweGQxLDB4ZTUsMHhlNSwweDM0IH0sIHsgMHhmOSwweGYxLDB4ZjEsMHgwOCB9LCAKKyAgICB7IDB4ZTIsMHg3MSwweDcxLDB4OTMgfSwgeyAweGFiLDB4ZDgsMHhkOCwweDczIH0sCisgICAgeyAweDYyLDB4MzEsMHgzMSwweDUzIH0sIHsgMHgyYSwweDE1LDB4MTUsMHgzZiB9LCAKKyAgICB7IDB4MDgsMHgwNCwweDA0LDB4MGMgfSwgeyAweDk1LDB4YzcsMHhjNywweDUyIH0sCisgICAgeyAweDQ2LDB4MjMsMHgyMywweDY1IH0sIHsgMHg5ZCwweGMzLDB4YzMsMHg1ZSB9LCAKKyAgICB7IDB4MzAsMHgxOCwweDE4LDB4MjggfSwgeyAweDM3LDB4OTYsMHg5NiwweGExIH0sCisgICAgeyAweDBhLDB4MDUsMHgwNSwweDBmIH0sIHsgMHgyZiwweDlhLDB4OWEsMHhiNSB9LCAKKyAgICB7IDB4MGUsMHgwNywweDA3LDB4MDkgfSwgeyAweDI0LDB4MTIsMHgxMiwweDM2IH0sCisgICAgeyAweDFiLDB4ODAsMHg4MCwweDliIH0sIHsgMHhkZiwweGUyLDB4ZTIsMHgzZCB9LCAKKyAgICB7IDB4Y2QsMHhlYiwweGViLDB4MjYgfSwgeyAweDRlLDB4MjcsMHgyNywweDY5IH0sCisgICAgeyAweDdmLDB4YjIsMHhiMiwweGNkIH0sIHsgMHhlYSwweDc1LDB4NzUsMHg5ZiB9LCAKKyAgICB7IDB4MTIsMHgwOSwweDA5LDB4MWIgfSwgeyAweDFkLDB4ODMsMHg4MywweDllIH0sCisgICAgeyAweDU4LDB4MmMsMHgyYywweDc0IH0sIHsgMHgzNCwweDFhLDB4MWEsMHgyZSB9LCAKKyAgICB7IDB4MzYsMHgxYiwweDFiLDB4MmQgfSwgeyAweGRjLDB4NmUsMHg2ZSwweGIyIH0sIAorICAgIHsgMHhiNCwweDVhLDB4NWEsMHhlZSB9LCB7IDB4NWIsMHhhMCwweGEwLDB4ZmIgfSwgCisgICAgeyAweGE0LDB4NTIsMHg1MiwweGY2IH0sIHsgMHg3NiwweDNiLDB4M2IsMHg0ZCB9LAorICAgIHsgMHhiNywweGQ2LDB4ZDYsMHg2MSB9LCB7IDB4N2QsMHhiMywweGIzLDB4Y2UgfSwgCisgICAgeyAweDUyLDB4MjksMHgyOSwweDdiIH0sIHsgMHhkZCwweGUzLDB4ZTMsMHgzZSB9LCAKKyAgICB7IDB4NWUsMHgyZiwweDJmLDB4NzEgfSwgeyAweDEzLDB4ODQsMHg4NCwweDk3IH0sIAorICAgIHsgMHhhNiwweDUzLDB4NTMsMHhmNSB9LCB7IDB4YjksMHhkMSwweGQxLDB4NjggfSwgCisgICAgeyAweDAwLDB4MDAsMHgwMCwweDAwIH0sIHsgMHhjMSwweGVkLDB4ZWQsMHgyYyB9LCAKKyAgICB7IDB4NDAsMHgyMCwweDIwLDB4NjAgfSwgeyAweGUzLDB4ZmMsMHhmYywweDFmIH0sCisgICAgeyAweDc5LDB4YjEsMHhiMSwweGM4IH0sIHsgMHhiNiwweDViLDB4NWIsMHhlZCB9LCAKKyAgICB7IDB4ZDQsMHg2YSwweDZhLDB4YmUgfSwgeyAweDhkLDB4Y2IsMHhjYiwweDQ2IH0sCisgICAgeyAweDY3LDB4YmUsMHhiZSwweGQ5IH0sIHsgMHg3MiwweDM5LDB4MzksMHg0YiB9LCAKKyAgICB7IDB4OTQsMHg0YSwweDRhLDB4ZGUgfSwgeyAweDk4LDB4NGMsMHg0YywweGQ0IH0sCisgICAgeyAweGIwLDB4NTgsMHg1OCwweGU4IH0sIHsgMHg4NSwweGNmLDB4Y2YsMHg0YSB9LCAKKyAgICB7IDB4YmIsMHhkMCwweGQwLDB4NmIgfSwgeyAweGM1LDB4ZWYsMHhlZiwweDJhIH0sCisgICAgeyAweDRmLDB4YWEsMHhhYSwweGU1IH0sIHsgMHhlZCwweGZiLDB4ZmIsMHgxNiB9LCAKKyAgICB7IDB4ODYsMHg0MywweDQzLDB4YzUgfSwgeyAweDlhLDB4NGQsMHg0ZCwweGQ3IH0sCisgICAgeyAweDY2LDB4MzMsMHgzMywweDU1IH0sIHsgMHgxMSwweDg1LDB4ODUsMHg5NCB9LCAKKyAgICB7IDB4OGEsMHg0NSwweDQ1LDB4Y2YgfSwgeyAweGU5LDB4ZjksMHhmOSwweDEwIH0sCisgICAgeyAweDA0LDB4MDIsMHgwMiwweDA2IH0sIHsgMHhmZSwweDdmLDB4N2YsMHg4MSB9LCAKKyAgICB7IDB4YTAsMHg1MCwweDUwLDB4ZjAgfSwgeyAweDc4LDB4M2MsMHgzYywweDQ0IH0sCisgICAgeyAweDI1LDB4OWYsMHg5ZiwweGJhIH0sIHsgMHg0YiwweGE4LDB4YTgsMHhlMyB9LCAKKyAgICB7IDB4YTIsMHg1MSwweDUxLDB4ZjMgfSwgeyAweDVkLDB4YTMsMHhhMywweGZlIH0sCisgICAgeyAweDgwLDB4NDAsMHg0MCwweGMwIH0sIHsgMHgwNSwweDhmLDB4OGYsMHg4YSB9LCAKKyAgICB7IDB4M2YsMHg5MiwweDkyLDB4YWQgfSwgeyAweDIxLDB4OWQsMHg5ZCwweGJjIH0sCisgICAgeyAweDcwLDB4MzgsMHgzOCwweDQ4IH0sIHsgMHhmMSwweGY1LDB4ZjUsMHgwNCB9LCAKKyAgICB7IDB4NjMsMHhiYywweGJjLDB4ZGYgfSwgeyAweDc3LDB4YjYsMHhiNiwweGMxIH0sCisgICAgeyAweGFmLDB4ZGEsMHhkYSwweDc1IH0sIHsgMHg0MiwweDIxLDB4MjEsMHg2MyB9LCAKKyAgICB7IDB4MjAsMHgxMCwweDEwLDB4MzAgfSwgeyAweGU1LDB4ZmYsMHhmZiwweDFhIH0sCisgICAgeyAweGZkLDB4ZjMsMHhmMywweDBlIH0sIHsgMHhiZiwweGQyLDB4ZDIsMHg2ZCB9LCAKKyAgICB7IDB4ODEsMHhjZCwweGNkLDB4NGMgfSwgeyAweDE4LDB4MGMsMHgwYywweDE0IH0sCisgICAgeyAweDI2LDB4MTMsMHgxMywweDM1IH0sIHsgMHhjMywweGVjLDB4ZWMsMHgyZiB9LCAKKyAgICB7IDB4YmUsMHg1ZiwweDVmLDB4ZTEgfSwgeyAweDM1LDB4OTcsMHg5NywweGEyIH0sCisgICAgeyAweDg4LDB4NDQsMHg0NCwweGNjIH0sIHsgMHgyZSwweDE3LDB4MTcsMHgzOSB9LCAKKyAgICB7IDB4OTMsMHhjNCwweGM0LDB4NTcgfSwgeyAweDU1LDB4YTcsMHhhNywweGYyIH0sCisgICAgeyAweGZjLDB4N2UsMHg3ZSwweDgyIH0sIHsgMHg3YSwweDNkLDB4M2QsMHg0NyB9LCAKKyAgICB7IDB4YzgsMHg2NCwweDY0LDB4YWMgfSwgeyAweGJhLDB4NWQsMHg1ZCwweGU3IH0sCisgICAgeyAweDMyLDB4MTksMHgxOSwweDJiIH0sIHsgMHhlNiwweDczLDB4NzMsMHg5NSB9LCAKKyAgICB7IDB4YzAsMHg2MCwweDYwLDB4YTAgfSwgeyAweDE5LDB4ODEsMHg4MSwweDk4IH0sCisgICAgeyAweDllLDB4NGYsMHg0ZiwweGQxIH0sIHsgMHhhMywweGRjLDB4ZGMsMHg3ZiB9LCAKKyAgICB7IDB4NDQsMHgyMiwweDIyLDB4NjYgfSwgeyAweDU0LDB4MmEsMHgyYSwweDdlIH0sCisgICAgeyAweDNiLDB4OTAsMHg5MCwweGFiIH0sIHsgMHgwYiwweDg4LDB4ODgsMHg4MyB9LCAKKyAgICB7IDB4OGMsMHg0NiwweDQ2LDB4Y2EgfSwgeyAweGM3LDB4ZWUsMHhlZSwweDI5IH0sCisgICAgeyAweDZiLDB4YjgsMHhiOCwweGQzIH0sIHsgMHgyOCwweDE0LDB4MTQsMHgzYyB9LCAKKyAgICB7IDB4YTcsMHhkZSwweGRlLDB4NzkgfSwgeyAweGJjLDB4NWUsMHg1ZSwweGUyIH0sCisgICAgeyAweDE2LDB4MGIsMHgwYiwweDFkIH0sIHsgMHhhZCwweGRiLDB4ZGIsMHg3NiB9LCAKKyAgICB7IDB4ZGIsMHhlMCwweGUwLDB4M2IgfSwgeyAweDY0LDB4MzIsMHgzMiwweDU2IH0sCisgICAgeyAweDc0LDB4M2EsMHgzYSwweDRlIH0sIHsgMHgxNCwweDBhLDB4MGEsMHgxZSB9LCAKKyAgICB7IDB4OTIsMHg0OSwweDQ5LDB4ZGIgfSwgeyAweDBjLDB4MDYsMHgwNiwweDBhIH0sCisgICAgeyAweDQ4LDB4MjQsMHgyNCwweDZjIH0sIHsgMHhiOCwweDVjLDB4NWMsMHhlNCB9LCAKKyAgICB7IDB4OWYsMHhjMiwweGMyLDB4NWQgfSwgeyAweGJkLDB4ZDMsMHhkMywweDZlIH0sCisgICAgeyAweDQzLDB4YWMsMHhhYywweGVmIH0sIHsgMHhjNCwweDYyLDB4NjIsMHhhNiB9LCAKKyAgICB7IDB4MzksMHg5MSwweDkxLDB4YTggfSwgeyAweDMxLDB4OTUsMHg5NSwweGE0IH0sCisgICAgeyAweGQzLDB4ZTQsMHhlNCwweDM3IH0sIHsgMHhmMiwweDc5LDB4NzksMHg4YiB9LCAKKyAgICB7IDB4ZDUsMHhlNywweGU3LDB4MzIgfSwgeyAweDhiLDB4YzgsMHhjOCwweDQzIH0sCisgICAgeyAweDZlLDB4MzcsMHgzNywweDU5IH0sIHsgMHhkYSwweDZkLDB4NmQsMHhiNyB9LCAKKyAgICB7IDB4MDEsMHg4ZCwweDhkLDB4OGMgfSwgeyAweGIxLDB4ZDUsMHhkNSwweDY0IH0sCisgICAgeyAweDljLDB4NGUsMHg0ZSwweGQyIH0sIHsgMHg0OSwweGE5LDB4YTksMHhlMCB9LCAKKyAgICB7IDB4ZDgsMHg2YywweDZjLDB4YjQgfSwgeyAweGFjLDB4NTYsMHg1NiwweGZhIH0sCisgICAgeyAweGYzLDB4ZjQsMHhmNCwweDA3IH0sIHsgMHhjZiwweGVhLDB4ZWEsMHgyNSB9LCAKKyAgICB7IDB4Y2EsMHg2NSwweDY1LDB4YWYgfSwgeyAweGY0LDB4N2EsMHg3YSwweDhlIH0sCisgICAgeyAweDQ3LDB4YWUsMHhhZSwweGU5IH0sIHsgMHgxMCwweDA4LDB4MDgsMHgxOCB9LCAKKyAgICB7IDB4NmYsMHhiYSwweGJhLDB4ZDUgfSwgeyAweGYwLDB4NzgsMHg3OCwweDg4IH0sCisgICAgeyAweDRhLDB4MjUsMHgyNSwweDZmIH0sIHsgMHg1YywweDJlLDB4MmUsMHg3MiB9LCAKKyAgICB7IDB4MzgsMHgxYywweDFjLDB4MjQgfSwgeyAweDU3LDB4YTYsMHhhNiwweGYxIH0sCisgICAgeyAweDczLDB4YjQsMHhiNCwweGM3IH0sIHsgMHg5NywweGM2LDB4YzYsMHg1MSB9LCAKKyAgICB7IDB4Y2IsMHhlOCwweGU4LDB4MjMgfSwgeyAweGExLDB4ZGQsMHhkZCwweDdjIH0sCisgICAgeyAweGU4LDB4NzQsMHg3NCwweDljIH0sIHsgMHgzZSwweDFmLDB4MWYsMHgyMSB9LCAKKyAgICB7IDB4OTYsMHg0YiwweDRiLDB4ZGQgfSwgeyAweDYxLDB4YmQsMHhiZCwweGRjIH0sIAorICAgIHsgMHgwZCwweDhiLDB4OGIsMHg4NiB9LCB7IDB4MGYsMHg4YSwweDhhLDB4ODUgfSwgCisgICAgeyAweGUwLDB4NzAsMHg3MCwweDkwIH0sIHsgMHg3YywweDNlLDB4M2UsMHg0MiB9LAorICAgIHsgMHg3MSwweGI1LDB4YjUsMHhjNCB9LCB7IDB4Y2MsMHg2NiwweDY2LDB4YWEgfSwgCisgICAgeyAweDkwLDB4NDgsMHg0OCwweGQ4IH0sIHsgMHgwNiwweDAzLDB4MDMsMHgwNSB9LAorICAgIHsgMHhmNywweGY2LDB4ZjYsMHgwMSB9LCB7IDB4MWMsMHgwZSwweDBlLDB4MTIgfSwgCisgICAgeyAweGMyLDB4NjEsMHg2MSwweGEzIH0sIHsgMHg2YSwweDM1LDB4MzUsMHg1ZiB9LAorICAgIHsgMHhhZSwweDU3LDB4NTcsMHhmOSB9LCB7IDB4NjksMHhiOSwweGI5LDB4ZDAgfSwgCisgICAgeyAweDE3LDB4ODYsMHg4NiwweDkxIH0sIHsgMHg5OSwweGMxLDB4YzEsMHg1OCB9LAorICAgIHsgMHgzYSwweDFkLDB4MWQsMHgyNyB9LCB7IDB4MjcsMHg5ZSwweDllLDB4YjkgfSwgCisgICAgeyAweGQ5LDB4ZTEsMHhlMSwweDM4IH0sIHsgMHhlYiwweGY4LDB4ZjgsMHgxMyB9LAorICAgIHsgMHgyYiwweDk4LDB4OTgsMHhiMyB9LCB7IDB4MjIsMHgxMSwweDExLDB4MzMgfSwgCisgICAgeyAweGQyLDB4NjksMHg2OSwweGJiIH0sIHsgMHhhOSwweGQ5LDB4ZDksMHg3MCB9LAorICAgIHsgMHgwNywweDhlLDB4OGUsMHg4OSB9LCB7IDB4MzMsMHg5NCwweDk0LDB4YTcgfSwgCisgICAgeyAweDJkLDB4OWIsMHg5YiwweGI2IH0sIHsgMHgzYywweDFlLDB4MWUsMHgyMiB9LAorICAgIHsgMHgxNSwweDg3LDB4ODcsMHg5MiB9LCB7IDB4YzksMHhlOSwweGU5LDB4MjAgfSwgCisgICAgeyAweDg3LDB4Y2UsMHhjZSwweDQ5IH0sIHsgMHhhYSwweDU1LDB4NTUsMHhmZiB9LAorICAgIHsgMHg1MCwweDI4LDB4MjgsMHg3OCB9LCB7IDB4YTUsMHhkZiwweGRmLDB4N2EgfSwgCisgICAgeyAweDAzLDB4OGMsMHg4YywweDhmIH0sIHsgMHg1OSwweGExLDB4YTEsMHhmOCB9LAorICAgIHsgMHgwOSwweDg5LDB4ODksMHg4MCB9LCB7IDB4MWEsMHgwZCwweDBkLDB4MTcgfSwgCisgICAgeyAweDY1LDB4YmYsMHhiZiwweGRhIH0sIHsgMHhkNywweGU2LDB4ZTYsMHgzMSB9LAorICAgIHsgMHg4NCwweDQyLDB4NDIsMHhjNiB9LCB7IDB4ZDAsMHg2OCwweDY4LDB4YjggfSwgCisgICAgeyAweDgyLDB4NDEsMHg0MSwweGMzIH0sIHsgMHgyOSwweDk5LDB4OTksMHhiMCB9LAorICAgIHsgMHg1YSwweDJkLDB4MmQsMHg3NyB9LCB7IDB4MWUsMHgwZiwweDBmLDB4MTEgfSwgCisgICAgeyAweDdiLDB4YjAsMHhiMCwweGNiIH0sIHsgMHhhOCwweDU0LDB4NTQsMHhmYyB9LAorICAgIHsgMHg2ZCwweGJiLDB4YmIsMHhkNiB9LCB7IDB4MmMsMHgxNiwweDE2LDB4M2EgfQorICB9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBUMlsyNTZdWzRdID0gCisgIHsKKyAgICB7IDB4YTUsMHhjNiwweDYzLDB4NjMgfSwgeyAweDg0LDB4ZjgsMHg3YywweDdjIH0sCisgICAgeyAweDk5LDB4ZWUsMHg3NywweDc3IH0sIHsgMHg4ZCwweGY2LDB4N2IsMHg3YiB9LCAKKyAgICB7IDB4MGQsMHhmZiwweGYyLDB4ZjIgfSwgeyAweGJkLDB4ZDYsMHg2YiwweDZiIH0sCisgICAgeyAweGIxLDB4ZGUsMHg2ZiwweDZmIH0sIHsgMHg1NCwweDkxLDB4YzUsMHhjNSB9LCAKKyAgICB7IDB4NTAsMHg2MCwweDMwLDB4MzAgfSwgeyAweDAzLDB4MDIsMHgwMSwweDAxIH0sCisgICAgeyAweGE5LDB4Y2UsMHg2NywweDY3IH0sIHsgMHg3ZCwweDU2LDB4MmIsMHgyYiB9LCAKKyAgICB7IDB4MTksMHhlNywweGZlLDB4ZmUgfSwgeyAweDYyLDB4YjUsMHhkNywweGQ3IH0sIAorICAgIHsgMHhlNiwweDRkLDB4YWIsMHhhYiB9LCB7IDB4OWEsMHhlYywweDc2LDB4NzYgfSwgCisgICAgeyAweDQ1LDB4OGYsMHhjYSwweGNhIH0sIHsgMHg5ZCwweDFmLDB4ODIsMHg4MiB9LCAKKyAgICB7IDB4NDAsMHg4OSwweGM5LDB4YzkgfSwgeyAweDg3LDB4ZmEsMHg3ZCwweDdkIH0sIAorICAgIHsgMHgxNSwweGVmLDB4ZmEsMHhmYSB9LCB7IDB4ZWIsMHhiMiwweDU5LDB4NTkgfSwgCisgICAgeyAweGM5LDB4OGUsMHg0NywweDQ3IH0sIHsgMHgwYiwweGZiLDB4ZjAsMHhmMCB9LCAKKyAgICB7IDB4ZWMsMHg0MSwweGFkLDB4YWQgfSwgeyAweDY3LDB4YjMsMHhkNCwweGQ0IH0sIAorICAgIHsgMHhmZCwweDVmLDB4YTIsMHhhMiB9LCB7IDB4ZWEsMHg0NSwweGFmLDB4YWYgfSwgCisgICAgeyAweGJmLDB4MjMsMHg5YywweDljIH0sIHsgMHhmNywweDUzLDB4YTQsMHhhNCB9LCAKKyAgICB7IDB4OTYsMHhlNCwweDcyLDB4NzIgfSwgeyAweDViLDB4OWIsMHhjMCwweGMwIH0sIAorICAgIHsgMHhjMiwweDc1LDB4YjcsMHhiNyB9LCB7IDB4MWMsMHhlMSwweGZkLDB4ZmQgfSwgCisgICAgeyAweGFlLDB4M2QsMHg5MywweDkzIH0sIHsgMHg2YSwweDRjLDB4MjYsMHgyNiB9LCAKKyAgICB7IDB4NWEsMHg2YywweDM2LDB4MzYgfSwgeyAweDQxLDB4N2UsMHgzZiwweDNmIH0sCisgICAgeyAweDAyLDB4ZjUsMHhmNywweGY3IH0sIHsgMHg0ZiwweDgzLDB4Y2MsMHhjYyB9LCAKKyAgICB7IDB4NWMsMHg2OCwweDM0LDB4MzQgfSwgeyAweGY0LDB4NTEsMHhhNSwweGE1IH0sCisgICAgeyAweDM0LDB4ZDEsMHhlNSwweGU1IH0sIHsgMHgwOCwweGY5LDB4ZjEsMHhmMSB9LCAKKyAgICB7IDB4OTMsMHhlMiwweDcxLDB4NzEgfSwgeyAweDczLDB4YWIsMHhkOCwweGQ4IH0sCisgICAgeyAweDUzLDB4NjIsMHgzMSwweDMxIH0sIHsgMHgzZiwweDJhLDB4MTUsMHgxNSB9LCAKKyAgICB7IDB4MGMsMHgwOCwweDA0LDB4MDQgfSwgeyAweDUyLDB4OTUsMHhjNywweGM3IH0sIAorICAgIHsgMHg2NSwweDQ2LDB4MjMsMHgyMyB9LCB7IDB4NWUsMHg5ZCwweGMzLDB4YzMgfSwgCisgICAgeyAweDI4LDB4MzAsMHgxOCwweDE4IH0sIHsgMHhhMSwweDM3LDB4OTYsMHg5NiB9LCAKKyAgICB7IDB4MGYsMHgwYSwweDA1LDB4MDUgfSwgeyAweGI1LDB4MmYsMHg5YSwweDlhIH0sIAorICAgIHsgMHgwOSwweDBlLDB4MDcsMHgwNyB9LCB7IDB4MzYsMHgyNCwweDEyLDB4MTIgfSwKKyAgICB7IDB4OWIsMHgxYiwweDgwLDB4ODAgfSwgeyAweDNkLDB4ZGYsMHhlMiwweGUyIH0sIAorICAgIHsgMHgyNiwweGNkLDB4ZWIsMHhlYiB9LCB7IDB4NjksMHg0ZSwweDI3LDB4MjcgfSwgCisgICAgeyAweGNkLDB4N2YsMHhiMiwweGIyIH0sIHsgMHg5ZiwweGVhLDB4NzUsMHg3NSB9LCAKKyAgICB7IDB4MWIsMHgxMiwweDA5LDB4MDkgfSwgeyAweDllLDB4MWQsMHg4MywweDgzIH0sCisgICAgeyAweDc0LDB4NTgsMHgyYywweDJjIH0sIHsgMHgyZSwweDM0LDB4MWEsMHgxYSB9LCAKKyAgICB7IDB4MmQsMHgzNiwweDFiLDB4MWIgfSwgeyAweGIyLDB4ZGMsMHg2ZSwweDZlIH0sCisgICAgeyAweGVlLDB4YjQsMHg1YSwweDVhIH0sIHsgMHhmYiwweDViLDB4YTAsMHhhMCB9LCAKKyAgICB7IDB4ZjYsMHhhNCwweDUyLDB4NTIgfSwgeyAweDRkLDB4NzYsMHgzYiwweDNiIH0sCisgICAgeyAweDYxLDB4YjcsMHhkNiwweGQ2IH0sIHsgMHhjZSwweDdkLDB4YjMsMHhiMyB9LCAKKyAgICB7IDB4N2IsMHg1MiwweDI5LDB4MjkgfSwgeyAweDNlLDB4ZGQsMHhlMywweGUzIH0sIAorICAgIHsgMHg3MSwweDVlLDB4MmYsMHgyZiB9LCB7IDB4OTcsMHgxMywweDg0LDB4ODQgfSwgCisgICAgeyAweGY1LDB4YTYsMHg1MywweDUzIH0sIHsgMHg2OCwweGI5LDB4ZDEsMHhkMSB9LCAKKyAgICB7IDB4MDAsMHgwMCwweDAwLDB4MDAgfSwgeyAweDJjLDB4YzEsMHhlZCwweGVkIH0sIAorICAgIHsgMHg2MCwweDQwLDB4MjAsMHgyMCB9LCB7IDB4MWYsMHhlMywweGZjLDB4ZmMgfSwgCisgICAgeyAweGM4LDB4NzksMHhiMSwweGIxIH0sIHsgMHhlZCwweGI2LDB4NWIsMHg1YiB9LCAKKyAgICB7IDB4YmUsMHhkNCwweDZhLDB4NmEgfSwgeyAweDQ2LDB4OGQsMHhjYiwweGNiIH0sIAorICAgIHsgMHhkOSwweDY3LDB4YmUsMHhiZSB9LCB7IDB4NGIsMHg3MiwweDM5LDB4MzkgfSwgCisgICAgeyAweGRlLDB4OTQsMHg0YSwweDRhIH0sIHsgMHhkNCwweDk4LDB4NGMsMHg0YyB9LCAKKyAgICB7IDB4ZTgsMHhiMCwweDU4LDB4NTggfSwgeyAweDRhLDB4ODUsMHhjZiwweGNmIH0sIAorICAgIHsgMHg2YiwweGJiLDB4ZDAsMHhkMCB9LCB7IDB4MmEsMHhjNSwweGVmLDB4ZWYgfSwKKyAgICB7IDB4ZTUsMHg0ZiwweGFhLDB4YWEgfSwgeyAweDE2LDB4ZWQsMHhmYiwweGZiIH0sIAorICAgIHsgMHhjNSwweDg2LDB4NDMsMHg0MyB9LCB7IDB4ZDcsMHg5YSwweDRkLDB4NGQgfSwgCisgICAgeyAweDU1LDB4NjYsMHgzMywweDMzIH0sIHsgMHg5NCwweDExLDB4ODUsMHg4NSB9LCAKKyAgICB7IDB4Y2YsMHg4YSwweDQ1LDB4NDUgfSwgeyAweDEwLDB4ZTksMHhmOSwweGY5IH0sIAorICAgIHsgMHgwNiwweDA0LDB4MDIsMHgwMiB9LCB7IDB4ODEsMHhmZSwweDdmLDB4N2YgfSwgCisgICAgeyAweGYwLDB4YTAsMHg1MCwweDUwIH0sIHsgMHg0NCwweDc4LDB4M2MsMHgzYyB9LAorICAgIHsgMHhiYSwweDI1LDB4OWYsMHg5ZiB9LCB7IDB4ZTMsMHg0YiwweGE4LDB4YTggfSwgCisgICAgeyAweGYzLDB4YTIsMHg1MSwweDUxIH0sIHsgMHhmZSwweDVkLDB4YTMsMHhhMyB9LAorICAgIHsgMHhjMCwweDgwLDB4NDAsMHg0MCB9LCB7IDB4OGEsMHgwNSwweDhmLDB4OGYgfSwgCisgICAgeyAweGFkLDB4M2YsMHg5MiwweDkyIH0sIHsgMHhiYywweDIxLDB4OWQsMHg5ZCB9LAorICAgIHsgMHg0OCwweDcwLDB4MzgsMHgzOCB9LCB7IDB4MDQsMHhmMSwweGY1LDB4ZjUgfSwgCisgICAgeyAweGRmLDB4NjMsMHhiYywweGJjIH0sIHsgMHhjMSwweDc3LDB4YjYsMHhiNiB9LAorICAgIHsgMHg3NSwweGFmLDB4ZGEsMHhkYSB9LCB7IDB4NjMsMHg0MiwweDIxLDB4MjEgfSwgCisgICAgeyAweDMwLDB4MjAsMHgxMCwweDEwIH0sIHsgMHgxYSwweGU1LDB4ZmYsMHhmZiB9LAorICAgIHsgMHgwZSwweGZkLDB4ZjMsMHhmMyB9LCB7IDB4NmQsMHhiZiwweGQyLDB4ZDIgfSwgCisgICAgeyAweDRjLDB4ODEsMHhjZCwweGNkIH0sIHsgMHgxNCwweDE4LDB4MGMsMHgwYyB9LAorICAgIHsgMHgzNSwweDI2LDB4MTMsMHgxMyB9LCB7IDB4MmYsMHhjMywweGVjLDB4ZWMgfSwgCisgICAgeyAweGUxLDB4YmUsMHg1ZiwweDVmIH0sIHsgMHhhMiwweDM1LDB4OTcsMHg5NyB9LAorICAgIHsgMHhjYywweDg4LDB4NDQsMHg0NCB9LCB7IDB4MzksMHgyZSwweDE3LDB4MTcgfSwgCisgICAgeyAweDU3LDB4OTMsMHhjNCwweGM0IH0sIHsgMHhmMiwweDU1LDB4YTcsMHhhNyB9LAorICAgIHsgMHg4MiwweGZjLDB4N2UsMHg3ZSB9LCB7IDB4NDcsMHg3YSwweDNkLDB4M2QgfSwgCisgICAgeyAweGFjLDB4YzgsMHg2NCwweDY0IH0sIHsgMHhlNywweGJhLDB4NWQsMHg1ZCB9LAorICAgIHsgMHgyYiwweDMyLDB4MTksMHgxOSB9LCB7IDB4OTUsMHhlNiwweDczLDB4NzMgfSwgCisgICAgeyAweGEwLDB4YzAsMHg2MCwweDYwIH0sIHsgMHg5OCwweDE5LDB4ODEsMHg4MSB9LCAKKyAgICB7IDB4ZDEsMHg5ZSwweDRmLDB4NGYgfSwgeyAweDdmLDB4YTMsMHhkYywweGRjIH0sIAorICAgIHsgMHg2NiwweDQ0LDB4MjIsMHgyMiB9LCB7IDB4N2UsMHg1NCwweDJhLDB4MmEgfSwgCisgICAgeyAweGFiLDB4M2IsMHg5MCwweDkwIH0sIHsgMHg4MywweDBiLDB4ODgsMHg4OCB9LCAKKyAgICB7IDB4Y2EsMHg4YywweDQ2LDB4NDYgfSwgeyAweDI5LDB4YzcsMHhlZSwweGVlIH0sCisgICAgeyAweGQzLDB4NmIsMHhiOCwweGI4IH0sIHsgMHgzYywweDI4LDB4MTQsMHgxNCB9LCAKKyAgICB7IDB4NzksMHhhNywweGRlLDB4ZGUgfSwgeyAweGUyLDB4YmMsMHg1ZSwweDVlIH0sCisgICAgeyAweDFkLDB4MTYsMHgwYiwweDBiIH0sIHsgMHg3NiwweGFkLDB4ZGIsMHhkYiB9LCAKKyAgICB7IDB4M2IsMHhkYiwweGUwLDB4ZTAgfSwgeyAweDU2LDB4NjQsMHgzMiwweDMyIH0sCisgICAgeyAweDRlLDB4NzQsMHgzYSwweDNhIH0sIHsgMHgxZSwweDE0LDB4MGEsMHgwYSB9LCAKKyAgICB7IDB4ZGIsMHg5MiwweDQ5LDB4NDkgfSwgeyAweDBhLDB4MGMsMHgwNiwweDA2IH0sCisgICAgeyAweDZjLDB4NDgsMHgyNCwweDI0IH0sIHsgMHhlNCwweGI4LDB4NWMsMHg1YyB9LCAKKyAgICB7IDB4NWQsMHg5ZiwweGMyLDB4YzIgfSwgeyAweDZlLDB4YmQsMHhkMywweGQzIH0sIAorICAgIHsgMHhlZiwweDQzLDB4YWMsMHhhYyB9LCB7IDB4YTYsMHhjNCwweDYyLDB4NjIgfSwgCisgICAgeyAweGE4LDB4MzksMHg5MSwweDkxIH0sIHsgMHhhNCwweDMxLDB4OTUsMHg5NSB9LAorICAgIHsgMHgzNywweGQzLDB4ZTQsMHhlNCB9LCB7IDB4OGIsMHhmMiwweDc5LDB4NzkgfSwgCisgICAgeyAweDMyLDB4ZDUsMHhlNywweGU3IH0sIHsgMHg0MywweDhiLDB4YzgsMHhjOCB9LAorICAgIHsgMHg1OSwweDZlLDB4MzcsMHgzNyB9LCB7IDB4YjcsMHhkYSwweDZkLDB4NmQgfSwgCisgICAgeyAweDhjLDB4MDEsMHg4ZCwweDhkIH0sIHsgMHg2NCwweGIxLDB4ZDUsMHhkNSB9LAorICAgIHsgMHhkMiwweDljLDB4NGUsMHg0ZSB9LCB7IDB4ZTAsMHg0OSwweGE5LDB4YTkgfSwgCisgICAgeyAweGI0LDB4ZDgsMHg2YywweDZjIH0sIHsgMHhmYSwweGFjLDB4NTYsMHg1NiB9LAorICAgIHsgMHgwNywweGYzLDB4ZjQsMHhmNCB9LCB7IDB4MjUsMHhjZiwweGVhLDB4ZWEgfSwgCisgICAgeyAweGFmLDB4Y2EsMHg2NSwweDY1IH0sIHsgMHg4ZSwweGY0LDB4N2EsMHg3YSB9LAorICAgIHsgMHhlOSwweDQ3LDB4YWUsMHhhZSB9LCB7IDB4MTgsMHgxMCwweDA4LDB4MDggfSwgCisgICAgeyAweGQ1LDB4NmYsMHhiYSwweGJhIH0sIHsgMHg4OCwweGYwLDB4NzgsMHg3OCB9LCAKKyAgICB7IDB4NmYsMHg0YSwweDI1LDB4MjUgfSwgeyAweDcyLDB4NWMsMHgyZSwweDJlIH0sIAorICAgIHsgMHgyNCwweDM4LDB4MWMsMHgxYyB9LCB7IDB4ZjEsMHg1NywweGE2LDB4YTYgfSwgCisgICAgeyAweGM3LDB4NzMsMHhiNCwweGI0IH0sIHsgMHg1MSwweDk3LDB4YzYsMHhjNiB9LCAKKyAgICB7IDB4MjMsMHhjYiwweGU4LDB4ZTggfSwgeyAweDdjLDB4YTEsMHhkZCwweGRkIH0sCisgICAgeyAweDljLDB4ZTgsMHg3NCwweDc0IH0sIHsgMHgyMSwweDNlLDB4MWYsMHgxZiB9LCAKKyAgICB7IDB4ZGQsMHg5NiwweDRiLDB4NGIgfSwgeyAweGRjLDB4NjEsMHhiZCwweGJkIH0sCisgICAgeyAweDg2LDB4MGQsMHg4YiwweDhiIH0sIHsgMHg4NSwweDBmLDB4OGEsMHg4YSB9LCAKKyAgICB7IDB4OTAsMHhlMCwweDcwLDB4NzAgfSwgeyAweDQyLDB4N2MsMHgzZSwweDNlIH0sIAorICAgIHsgMHhjNCwweDcxLDB4YjUsMHhiNSB9LCB7IDB4YWEsMHhjYywweDY2LDB4NjYgfSwgCisgICAgeyAweGQ4LDB4OTAsMHg0OCwweDQ4IH0sIHsgMHgwNSwweDA2LDB4MDMsMHgwMyB9LAorICAgIHsgMHgwMSwweGY3LDB4ZjYsMHhmNiB9LCB7IDB4MTIsMHgxYywweDBlLDB4MGUgfSwgCisgICAgeyAweGEzLDB4YzIsMHg2MSwweDYxIH0sIHsgMHg1ZiwweDZhLDB4MzUsMHgzNSB9LAorICAgIHsgMHhmOSwweGFlLDB4NTcsMHg1NyB9LCB7IDB4ZDAsMHg2OSwweGI5LDB4YjkgfSwgCisgICAgeyAweDkxLDB4MTcsMHg4NiwweDg2IH0sIHsgMHg1OCwweDk5LDB4YzEsMHhjMSB9LCAKKyAgICB7IDB4MjcsMHgzYSwweDFkLDB4MWQgfSwgeyAweGI5LDB4MjcsMHg5ZSwweDllIH0sIAorICAgIHsgMHgzOCwweGQ5LDB4ZTEsMHhlMSB9LCB7IDB4MTMsMHhlYiwweGY4LDB4ZjggfSwKKyAgICB7IDB4YjMsMHgyYiwweDk4LDB4OTggfSwgeyAweDMzLDB4MjIsMHgxMSwweDExIH0sIAorICAgIHsgMHhiYiwweGQyLDB4NjksMHg2OSB9LCB7IDB4NzAsMHhhOSwweGQ5LDB4ZDkgfSwKKyAgICB7IDB4ODksMHgwNywweDhlLDB4OGUgfSwgeyAweGE3LDB4MzMsMHg5NCwweDk0IH0sIAorICAgIHsgMHhiNiwweDJkLDB4OWIsMHg5YiB9LCB7IDB4MjIsMHgzYywweDFlLDB4MWUgfSwKKyAgICB7IDB4OTIsMHgxNSwweDg3LDB4ODcgfSwgeyAweDIwLDB4YzksMHhlOSwweGU5IH0sIAorICAgIHsgMHg0OSwweDg3LDB4Y2UsMHhjZSB9LCB7IDB4ZmYsMHhhYSwweDU1LDB4NTUgfSwKKyAgICB7IDB4NzgsMHg1MCwweDI4LDB4MjggfSwgeyAweDdhLDB4YTUsMHhkZiwweGRmIH0sIAorICAgIHsgMHg4ZiwweDAzLDB4OGMsMHg4YyB9LCB7IDB4ZjgsMHg1OSwweGExLDB4YTEgfSwgCisgICAgeyAweDgwLDB4MDksMHg4OSwweDg5IH0sIHsgMHgxNywweDFhLDB4MGQsMHgwZCB9LCAKKyAgICB7IDB4ZGEsMHg2NSwweGJmLDB4YmYgfSwgeyAweDMxLDB4ZDcsMHhlNiwweGU2IH0sCisgICAgeyAweGM2LDB4ODQsMHg0MiwweDQyIH0sIHsgMHhiOCwweGQwLDB4NjgsMHg2OCB9LCAKKyAgICB7IDB4YzMsMHg4MiwweDQxLDB4NDEgfSwgeyAweGIwLDB4MjksMHg5OSwweDk5IH0sIAorICAgIHsgMHg3NywweDVhLDB4MmQsMHgyZCB9LCB7IDB4MTEsMHgxZSwweDBmLDB4MGYgfSwgCisgICAgeyAweGNiLDB4N2IsMHhiMCwweGIwIH0sIHsgMHhmYywweGE4LDB4NTQsMHg1NCB9LCAKKyAgICB7IDB4ZDYsMHg2ZCwweGJiLDB4YmIgfSwgeyAweDNhLDB4MmMsMHgxNiwweDE2IH0KKyAgfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgVDNbMjU2XVs0XSA9IAorICB7CisgICAgeyAweDYzLDB4YTUsMHhjNiwweDYzIH0sIHsgMHg3YywweDg0LDB4ZjgsMHg3YyB9LAorICAgIHsgMHg3NywweDk5LDB4ZWUsMHg3NyB9LCB7IDB4N2IsMHg4ZCwweGY2LDB4N2IgfSwgCisgICAgeyAweGYyLDB4MGQsMHhmZiwweGYyIH0sIHsgMHg2YiwweGJkLDB4ZDYsMHg2YiB9LAorICAgIHsgMHg2ZiwweGIxLDB4ZGUsMHg2ZiB9LCB7IDB4YzUsMHg1NCwweDkxLDB4YzUgfSwgCisgICAgeyAweDMwLDB4NTAsMHg2MCwweDMwIH0sIHsgMHgwMSwweDAzLDB4MDIsMHgwMSB9LAorICAgIHsgMHg2NywweGE5LDB4Y2UsMHg2NyB9LCB7IDB4MmIsMHg3ZCwweDU2LDB4MmIgfSwgCisgICAgeyAweGZlLDB4MTksMHhlNywweGZlIH0sIHsgMHhkNywweDYyLDB4YjUsMHhkNyB9LCAKKyAgICB7IDB4YWIsMHhlNiwweDRkLDB4YWIgfSwgeyAweDc2LDB4OWEsMHhlYywweDc2IH0sIAorICAgIHsgMHhjYSwweDQ1LDB4OGYsMHhjYSB9LCB7IDB4ODIsMHg5ZCwweDFmLDB4ODIgfSwKKyAgICB7IDB4YzksMHg0MCwweDg5LDB4YzkgfSwgeyAweDdkLDB4ODcsMHhmYSwweDdkIH0sIAorICAgIHsgMHhmYSwweDE1LDB4ZWYsMHhmYSB9LCB7IDB4NTksMHhlYiwweGIyLDB4NTkgfSwgCisgICAgeyAweDQ3LDB4YzksMHg4ZSwweDQ3IH0sIHsgMHhmMCwweDBiLDB4ZmIsMHhmMCB9LCAKKyAgICB7IDB4YWQsMHhlYywweDQxLDB4YWQgfSwgeyAweGQ0LDB4NjcsMHhiMywweGQ0IH0sIAorICAgIHsgMHhhMiwweGZkLDB4NWYsMHhhMiB9LCB7IDB4YWYsMHhlYSwweDQ1LDB4YWYgfSwgCisgICAgeyAweDljLDB4YmYsMHgyMywweDljIH0sIHsgMHhhNCwweGY3LDB4NTMsMHhhNCB9LAorICAgIHsgMHg3MiwweDk2LDB4ZTQsMHg3MiB9LCB7IDB4YzAsMHg1YiwweDliLDB4YzAgfSwgCisgICAgeyAweGI3LDB4YzIsMHg3NSwweGI3IH0sIHsgMHhmZCwweDFjLDB4ZTEsMHhmZCB9LCAKKyAgICB7IDB4OTMsMHhhZSwweDNkLDB4OTMgfSwgeyAweDI2LDB4NmEsMHg0YywweDI2IH0sIAorICAgIHsgMHgzNiwweDVhLDB4NmMsMHgzNiB9LCB7IDB4M2YsMHg0MSwweDdlLDB4M2YgfSwKKyAgICB7IDB4ZjcsMHgwMiwweGY1LDB4ZjcgfSwgeyAweGNjLDB4NGYsMHg4MywweGNjIH0sIAorICAgIHsgMHgzNCwweDVjLDB4NjgsMHgzNCB9LCB7IDB4YTUsMHhmNCwweDUxLDB4YTUgfSwKKyAgICB7IDB4ZTUsMHgzNCwweGQxLDB4ZTUgfSwgeyAweGYxLDB4MDgsMHhmOSwweGYxIH0sIAorICAgIHsgMHg3MSwweDkzLDB4ZTIsMHg3MSB9LCB7IDB4ZDgsMHg3MywweGFiLDB4ZDggfSwKKyAgICB7IDB4MzEsMHg1MywweDYyLDB4MzEgfSwgeyAweDE1LDB4M2YsMHgyYSwweDE1IH0sIAorICAgIHsgMHgwNCwweDBjLDB4MDgsMHgwNCB9LCB7IDB4YzcsMHg1MiwweDk1LDB4YzcgfSwgCisgICAgeyAweDIzLDB4NjUsMHg0NiwweDIzIH0sIHsgMHhjMywweDVlLDB4OWQsMHhjMyB9LCAKKyAgICB7IDB4MTgsMHgyOCwweDMwLDB4MTggfSwgeyAweDk2LDB4YTEsMHgzNywweDk2IH0sCisgICAgeyAweDA1LDB4MGYsMHgwYSwweDA1IH0sIHsgMHg5YSwweGI1LDB4MmYsMHg5YSB9LCAKKyAgICB7IDB4MDcsMHgwOSwweDBlLDB4MDcgfSwgeyAweDEyLDB4MzYsMHgyNCwweDEyIH0sIAorICAgIHsgMHg4MCwweDliLDB4MWIsMHg4MCB9LCB7IDB4ZTIsMHgzZCwweGRmLDB4ZTIgfSwgCisgICAgeyAweGViLDB4MjYsMHhjZCwweGViIH0sIHsgMHgyNywweDY5LDB4NGUsMHgyNyB9LAorICAgIHsgMHhiMiwweGNkLDB4N2YsMHhiMiB9LCB7IDB4NzUsMHg5ZiwweGVhLDB4NzUgfSwgCisgICAgeyAweDA5LDB4MWIsMHgxMiwweDA5IH0sIHsgMHg4MywweDllLDB4MWQsMHg4MyB9LAorICAgIHsgMHgyYywweDc0LDB4NTgsMHgyYyB9LCB7IDB4MWEsMHgyZSwweDM0LDB4MWEgfSwgCisgICAgeyAweDFiLDB4MmQsMHgzNiwweDFiIH0sIHsgMHg2ZSwweGIyLDB4ZGMsMHg2ZSB9LAorICAgIHsgMHg1YSwweGVlLDB4YjQsMHg1YSB9LCB7IDB4YTAsMHhmYiwweDViLDB4YTAgfSwgCisgICAgeyAweDUyLDB4ZjYsMHhhNCwweDUyIH0sIHsgMHgzYiwweDRkLDB4NzYsMHgzYiB9LAorICAgIHsgMHhkNiwweDYxLDB4YjcsMHhkNiB9LCB7IDB4YjMsMHhjZSwweDdkLDB4YjMgfSwgCisgICAgeyAweDI5LDB4N2IsMHg1MiwweDI5IH0sIHsgMHhlMywweDNlLDB4ZGQsMHhlMyB9LCAKKyAgICB7IDB4MmYsMHg3MSwweDVlLDB4MmYgfSwgeyAweDg0LDB4OTcsMHgxMywweDg0IH0sIAorICAgIHsgMHg1MywweGY1LDB4YTYsMHg1MyB9LCB7IDB4ZDEsMHg2OCwweGI5LDB4ZDEgfSwKKyAgICB7IDB4MDAsMHgwMCwweDAwLDB4MDAgfSwgeyAweGVkLDB4MmMsMHhjMSwweGVkIH0sIAorICAgIHsgMHgyMCwweDYwLDB4NDAsMHgyMCB9LCB7IDB4ZmMsMHgxZiwweGUzLDB4ZmMgfSwKKyAgICB7IDB4YjEsMHhjOCwweDc5LDB4YjEgfSwgeyAweDViLDB4ZWQsMHhiNiwweDViIH0sIAorICAgIHsgMHg2YSwweGJlLDB4ZDQsMHg2YSB9LCB7IDB4Y2IsMHg0NiwweDhkLDB4Y2IgfSwKKyAgICB7IDB4YmUsMHhkOSwweDY3LDB4YmUgfSwgeyAweDM5LDB4NGIsMHg3MiwweDM5IH0sIAorICAgIHsgMHg0YSwweGRlLDB4OTQsMHg0YSB9LCB7IDB4NGMsMHhkNCwweDk4LDB4NGMgfSwKKyAgICB7IDB4NTgsMHhlOCwweGIwLDB4NTggfSwgeyAweGNmLDB4NGEsMHg4NSwweGNmIH0sIAorICAgIHsgMHhkMCwweDZiLDB4YmIsMHhkMCB9LCB7IDB4ZWYsMHgyYSwweGM1LDB4ZWYgfSwKKyAgICB7IDB4YWEsMHhlNSwweDRmLDB4YWEgfSwgeyAweGZiLDB4MTYsMHhlZCwweGZiIH0sIAorICAgIHsgMHg0MywweGM1LDB4ODYsMHg0MyB9LCB7IDB4NGQsMHhkNywweDlhLDB4NGQgfSwKKyAgICB7IDB4MzMsMHg1NSwweDY2LDB4MzMgfSwgeyAweDg1LDB4OTQsMHgxMSwweDg1IH0sIAorICAgIHsgMHg0NSwweGNmLDB4OGEsMHg0NSB9LCB7IDB4ZjksMHgxMCwweGU5LDB4ZjkgfSwKKyAgICB7IDB4MDIsMHgwNiwweDA0LDB4MDIgfSwgeyAweDdmLDB4ODEsMHhmZSwweDdmIH0sIAorICAgIHsgMHg1MCwweGYwLDB4YTAsMHg1MCB9LCB7IDB4M2MsMHg0NCwweDc4LDB4M2MgfSwKKyAgICB7IDB4OWYsMHhiYSwweDI1LDB4OWYgfSwgeyAweGE4LDB4ZTMsMHg0YiwweGE4IH0sIAorICAgIHsgMHg1MSwweGYzLDB4YTIsMHg1MSB9LCB7IDB4YTMsMHhmZSwweDVkLDB4YTMgfSwKKyAgICB7IDB4NDAsMHhjMCwweDgwLDB4NDAgfSwgeyAweDhmLDB4OGEsMHgwNSwweDhmIH0sIAorICAgIHsgMHg5MiwweGFkLDB4M2YsMHg5MiB9LCB7IDB4OWQsMHhiYywweDIxLDB4OWQgfSwKKyAgICB7IDB4MzgsMHg0OCwweDcwLDB4MzggfSwgeyAweGY1LDB4MDQsMHhmMSwweGY1IH0sIAorICAgIHsgMHhiYywweGRmLDB4NjMsMHhiYyB9LCB7IDB4YjYsMHhjMSwweDc3LDB4YjYgfSwKKyAgICB7IDB4ZGEsMHg3NSwweGFmLDB4ZGEgfSwgeyAweDIxLDB4NjMsMHg0MiwweDIxIH0sIAorICAgIHsgMHgxMCwweDMwLDB4MjAsMHgxMCB9LCB7IDB4ZmYsMHgxYSwweGU1LDB4ZmYgfSwKKyAgICB7IDB4ZjMsMHgwZSwweGZkLDB4ZjMgfSwgeyAweGQyLDB4NmQsMHhiZiwweGQyIH0sIAorICAgIHsgMHhjZCwweDRjLDB4ODEsMHhjZCB9LCB7IDB4MGMsMHgxNCwweDE4LDB4MGMgfSwgCisgICAgeyAweDEzLDB4MzUsMHgyNiwweDEzIH0sIHsgMHhlYywweDJmLDB4YzMsMHhlYyB9LCAKKyAgICB7IDB4NWYsMHhlMSwweGJlLDB4NWYgfSwgeyAweDk3LDB4YTIsMHgzNSwweDk3IH0sCisgICAgeyAweDQ0LDB4Y2MsMHg4OCwweDQ0IH0sIHsgMHgxNywweDM5LDB4MmUsMHgxNyB9LCAKKyAgICB7IDB4YzQsMHg1NywweDkzLDB4YzQgfSwgeyAweGE3LDB4ZjIsMHg1NSwweGE3IH0sCisgICAgeyAweDdlLDB4ODIsMHhmYywweDdlIH0sIHsgMHgzZCwweDQ3LDB4N2EsMHgzZCB9LCAKKyAgICB7IDB4NjQsMHhhYywweGM4LDB4NjQgfSwgeyAweDVkLDB4ZTcsMHhiYSwweDVkIH0sCisgICAgeyAweDE5LDB4MmIsMHgzMiwweDE5IH0sIHsgMHg3MywweDk1LDB4ZTYsMHg3MyB9LCAKKyAgICB7IDB4NjAsMHhhMCwweGMwLDB4NjAgfSwgeyAweDgxLDB4OTgsMHgxOSwweDgxIH0sCisgICAgeyAweDRmLDB4ZDEsMHg5ZSwweDRmIH0sIHsgMHhkYywweDdmLDB4YTMsMHhkYyB9LCAKKyAgICB7IDB4MjIsMHg2NiwweDQ0LDB4MjIgfSwgeyAweDJhLDB4N2UsMHg1NCwweDJhIH0sCisgICAgeyAweDkwLDB4YWIsMHgzYiwweDkwIH0sIHsgMHg4OCwweDgzLDB4MGIsMHg4OCB9LCAKKyAgICB7IDB4NDYsMHhjYSwweDhjLDB4NDYgfSwgeyAweGVlLDB4MjksMHhjNywweGVlIH0sCisgICAgeyAweGI4LDB4ZDMsMHg2YiwweGI4IH0sIHsgMHgxNCwweDNjLDB4MjgsMHgxNCB9LCAKKyAgICB7IDB4ZGUsMHg3OSwweGE3LDB4ZGUgfSwgeyAweDVlLDB4ZTIsMHhiYywweDVlIH0sIAorICAgIHsgMHgwYiwweDFkLDB4MTYsMHgwYiB9LCB7IDB4ZGIsMHg3NiwweGFkLDB4ZGIgfSwgCisgICAgeyAweGUwLDB4M2IsMHhkYiwweGUwIH0sIHsgMHgzMiwweDU2LDB4NjQsMHgzMiB9LAorICAgIHsgMHgzYSwweDRlLDB4NzQsMHgzYSB9LCB7IDB4MGEsMHgxZSwweDE0LDB4MGEgfSwgCisgICAgeyAweDQ5LDB4ZGIsMHg5MiwweDQ5IH0sIHsgMHgwNiwweDBhLDB4MGMsMHgwNiB9LAorICAgIHsgMHgyNCwweDZjLDB4NDgsMHgyNCB9LCB7IDB4NWMsMHhlNCwweGI4LDB4NWMgfSwgCisgICAgeyAweGMyLDB4NWQsMHg5ZiwweGMyIH0sIHsgMHhkMywweDZlLDB4YmQsMHhkMyB9LAorICAgIHsgMHhhYywweGVmLDB4NDMsMHhhYyB9LCB7IDB4NjIsMHhhNiwweGM0LDB4NjIgfSwgCisgICAgeyAweDkxLDB4YTgsMHgzOSwweDkxIH0sIHsgMHg5NSwweGE0LDB4MzEsMHg5NSB9LAorICAgIHsgMHhlNCwweDM3LDB4ZDMsMHhlNCB9LCB7IDB4NzksMHg4YiwweGYyLDB4NzkgfSwgCisgICAgeyAweGU3LDB4MzIsMHhkNSwweGU3IH0sIHsgMHhjOCwweDQzLDB4OGIsMHhjOCB9LCAKKyAgICB7IDB4MzcsMHg1OSwweDZlLDB4MzcgfSwgeyAweDZkLDB4YjcsMHhkYSwweDZkIH0sIAorICAgIHsgMHg4ZCwweDhjLDB4MDEsMHg4ZCB9LCB7IDB4ZDUsMHg2NCwweGIxLDB4ZDUgfSwgCisgICAgeyAweDRlLDB4ZDIsMHg5YywweDRlIH0sIHsgMHhhOSwweGUwLDB4NDksMHhhOSB9LCAKKyAgICB7IDB4NmMsMHhiNCwweGQ4LDB4NmMgfSwgeyAweDU2LDB4ZmEsMHhhYywweDU2IH0sCisgICAgeyAweGY0LDB4MDcsMHhmMywweGY0IH0sIHsgMHhlYSwweDI1LDB4Y2YsMHhlYSB9LCAKKyAgICB7IDB4NjUsMHhhZiwweGNhLDB4NjUgfSwgeyAweDdhLDB4OGUsMHhmNCwweDdhIH0sIAorICAgIHsgMHhhZSwweGU5LDB4NDcsMHhhZSB9LCB7IDB4MDgsMHgxOCwweDEwLDB4MDggfSwgCisgICAgeyAweGJhLDB4ZDUsMHg2ZiwweGJhIH0sIHsgMHg3OCwweDg4LDB4ZjAsMHg3OCB9LCAKKyAgICB7IDB4MjUsMHg2ZiwweDRhLDB4MjUgfSwgeyAweDJlLDB4NzIsMHg1YywweDJlIH0sIAorICAgIHsgMHgxYywweDI0LDB4MzgsMHgxYyB9LCB7IDB4YTYsMHhmMSwweDU3LDB4YTYgfSwgCisgICAgeyAweGI0LDB4YzcsMHg3MywweGI0IH0sIHsgMHhjNiwweDUxLDB4OTcsMHhjNiB9LCAKKyAgICB7IDB4ZTgsMHgyMywweGNiLDB4ZTggfSwgeyAweGRkLDB4N2MsMHhhMSwweGRkIH0sCisgICAgeyAweDc0LDB4OWMsMHhlOCwweDc0IH0sIHsgMHgxZiwweDIxLDB4M2UsMHgxZiB9LCAKKyAgICB7IDB4NGIsMHhkZCwweDk2LDB4NGIgfSwgeyAweGJkLDB4ZGMsMHg2MSwweGJkIH0sCisgICAgeyAweDhiLDB4ODYsMHgwZCwweDhiIH0sIHsgMHg4YSwweDg1LDB4MGYsMHg4YSB9LCAKKyAgICB7IDB4NzAsMHg5MCwweGUwLDB4NzAgfSwgeyAweDNlLDB4NDIsMHg3YywweDNlIH0sCisgICAgeyAweGI1LDB4YzQsMHg3MSwweGI1IH0sIHsgMHg2NiwweGFhLDB4Y2MsMHg2NiB9LCAKKyAgICB7IDB4NDgsMHhkOCwweDkwLDB4NDggfSwgeyAweDAzLDB4MDUsMHgwNiwweDAzIH0sCisgICAgeyAweGY2LDB4MDEsMHhmNywweGY2IH0sIHsgMHgwZSwweDEyLDB4MWMsMHgwZSB9LCAKKyAgICB7IDB4NjEsMHhhMywweGMyLDB4NjEgfSwgeyAweDM1LDB4NWYsMHg2YSwweDM1IH0sCisgICAgeyAweDU3LDB4ZjksMHhhZSwweDU3IH0sIHsgMHhiOSwweGQwLDB4NjksMHhiOSB9LCAKKyAgICB7IDB4ODYsMHg5MSwweDE3LDB4ODYgfSwgeyAweGMxLDB4NTgsMHg5OSwweGMxIH0sIAorICAgIHsgMHgxZCwweDI3LDB4M2EsMHgxZCB9LCB7IDB4OWUsMHhiOSwweDI3LDB4OWUgfSwgCisgICAgeyAweGUxLDB4MzgsMHhkOSwweGUxIH0sIHsgMHhmOCwweDEzLDB4ZWIsMHhmOCB9LAorICAgIHsgMHg5OCwweGIzLDB4MmIsMHg5OCB9LCB7IDB4MTEsMHgzMywweDIyLDB4MTEgfSwgCisgICAgeyAweDY5LDB4YmIsMHhkMiwweDY5IH0sIHsgMHhkOSwweDcwLDB4YTksMHhkOSB9LAorICAgIHsgMHg4ZSwweDg5LDB4MDcsMHg4ZSB9LCB7IDB4OTQsMHhhNywweDMzLDB4OTQgfSwgCisgICAgeyAweDliLDB4YjYsMHgyZCwweDliIH0sIHsgMHgxZSwweDIyLDB4M2MsMHgxZSB9LAorICAgIHsgMHg4NywweDkyLDB4MTUsMHg4NyB9LCB7IDB4ZTksMHgyMCwweGM5LDB4ZTkgfSwgCisgICAgeyAweGNlLDB4NDksMHg4NywweGNlIH0sIHsgMHg1NSwweGZmLDB4YWEsMHg1NSB9LAorICAgIHsgMHgyOCwweDc4LDB4NTAsMHgyOCB9LCB7IDB4ZGYsMHg3YSwweGE1LDB4ZGYgfSwgCisgICAgeyAweDhjLDB4OGYsMHgwMywweDhjIH0sIHsgMHhhMSwweGY4LDB4NTksMHhhMSB9LAorICAgIHsgMHg4OSwweDgwLDB4MDksMHg4OSB9LCB7IDB4MGQsMHgxNywweDFhLDB4MGQgfSwgCisgICAgeyAweGJmLDB4ZGEsMHg2NSwweGJmIH0sIHsgMHhlNiwweDMxLDB4ZDcsMHhlNiB9LAorICAgIHsgMHg0MiwweGM2LDB4ODQsMHg0MiB9LCB7IDB4NjgsMHhiOCwweGQwLDB4NjggfSwgCisgICAgeyAweDQxLDB4YzMsMHg4MiwweDQxIH0sIHsgMHg5OSwweGIwLDB4MjksMHg5OSB9LAorICAgIHsgMHgyZCwweDc3LDB4NWEsMHgyZCB9LCB7IDB4MGYsMHgxMSwweDFlLDB4MGYgfSwgCisgICAgeyAweGIwLDB4Y2IsMHg3YiwweGIwIH0sIHsgMHg1NCwweGZjLDB4YTgsMHg1NCB9LAorICAgIHsgMHhiYiwweGQ2LDB4NmQsMHhiYiB9LCB7IDB4MTYsMHgzYSwweDJjLDB4MTYgfQorICB9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBUNFsyNTZdWzRdID0gCisgIHsKKyAgICB7IDB4NjMsMHg2MywweGE1LDB4YzYgfSwgeyAweDdjLDB4N2MsMHg4NCwweGY4IH0sCisgICAgeyAweDc3LDB4NzcsMHg5OSwweGVlIH0sIHsgMHg3YiwweDdiLDB4OGQsMHhmNiB9LCAKKyAgICB7IDB4ZjIsMHhmMiwweDBkLDB4ZmYgfSwgeyAweDZiLDB4NmIsMHhiZCwweGQ2IH0sIAorICAgIHsgMHg2ZiwweDZmLDB4YjEsMHhkZSB9LCB7IDB4YzUsMHhjNSwweDU0LDB4OTEgfSwgCisgICAgeyAweDMwLDB4MzAsMHg1MCwweDYwIH0sIHsgMHgwMSwweDAxLDB4MDMsMHgwMiB9LAorICAgIHsgMHg2NywweDY3LDB4YTksMHhjZSB9LCB7IDB4MmIsMHgyYiwweDdkLDB4NTYgfSwgCisgICAgeyAweGZlLDB4ZmUsMHgxOSwweGU3IH0sIHsgMHhkNywweGQ3LDB4NjIsMHhiNSB9LAorICAgIHsgMHhhYiwweGFiLDB4ZTYsMHg0ZCB9LCB7IDB4NzYsMHg3NiwweDlhLDB4ZWMgfSwgCisgICAgeyAweGNhLDB4Y2EsMHg0NSwweDhmIH0sIHsgMHg4MiwweDgyLDB4OWQsMHgxZiB9LAorICAgIHsgMHhjOSwweGM5LDB4NDAsMHg4OSB9LCB7IDB4N2QsMHg3ZCwweDg3LDB4ZmEgfSwgCisgICAgeyAweGZhLDB4ZmEsMHgxNSwweGVmIH0sIHsgMHg1OSwweDU5LDB4ZWIsMHhiMiB9LAorICAgIHsgMHg0NywweDQ3LDB4YzksMHg4ZSB9LCB7IDB4ZjAsMHhmMCwweDBiLDB4ZmIgfSwgCisgICAgeyAweGFkLDB4YWQsMHhlYywweDQxIH0sIHsgMHhkNCwweGQ0LDB4NjcsMHhiMyB9LAorICAgIHsgMHhhMiwweGEyLDB4ZmQsMHg1ZiB9LCB7IDB4YWYsMHhhZiwweGVhLDB4NDUgfSwgCisgICAgeyAweDljLDB4OWMsMHhiZiwweDIzIH0sIHsgMHhhNCwweGE0LDB4ZjcsMHg1MyB9LAorICAgIHsgMHg3MiwweDcyLDB4OTYsMHhlNCB9LCB7IDB4YzAsMHhjMCwweDViLDB4OWIgfSwgCisgICAgeyAweGI3LDB4YjcsMHhjMiwweDc1IH0sIHsgMHhmZCwweGZkLDB4MWMsMHhlMSB9LAorICAgIHsgMHg5MywweDkzLDB4YWUsMHgzZCB9LCB7IDB4MjYsMHgyNiwweDZhLDB4NGMgfSwgCisgICAgeyAweDM2LDB4MzYsMHg1YSwweDZjIH0sIHsgMHgzZiwweDNmLDB4NDEsMHg3ZSB9LAorICAgIHsgMHhmNywweGY3LDB4MDIsMHhmNSB9LCB7IDB4Y2MsMHhjYywweDRmLDB4ODMgfSwgCisgICAgeyAweDM0LDB4MzQsMHg1YywweDY4IH0sIHsgMHhhNSwweGE1LDB4ZjQsMHg1MSB9LAorICAgIHsgMHhlNSwweGU1LDB4MzQsMHhkMSB9LCB7IDB4ZjEsMHhmMSwweDA4LDB4ZjkgfSwgCisgICAgeyAweDcxLDB4NzEsMHg5MywweGUyIH0sIHsgMHhkOCwweGQ4LDB4NzMsMHhhYiB9LAorICAgIHsgMHgzMSwweDMxLDB4NTMsMHg2MiB9LCB7IDB4MTUsMHgxNSwweDNmLDB4MmEgfSwgCisgICAgeyAweDA0LDB4MDQsMHgwYywweDA4IH0sIHsgMHhjNywweGM3LDB4NTIsMHg5NSB9LAorICAgIHsgMHgyMywweDIzLDB4NjUsMHg0NiB9LCB7IDB4YzMsMHhjMywweDVlLDB4OWQgfSwgCisgICAgeyAweDE4LDB4MTgsMHgyOCwweDMwIH0sIHsgMHg5NiwweDk2LDB4YTEsMHgzNyB9LAorICAgIHsgMHgwNSwweDA1LDB4MGYsMHgwYSB9LCB7IDB4OWEsMHg5YSwweGI1LDB4MmYgfSwgCisgICAgeyAweDA3LDB4MDcsMHgwOSwweDBlIH0sIHsgMHgxMiwweDEyLDB4MzYsMHgyNCB9LAorICAgIHsgMHg4MCwweDgwLDB4OWIsMHgxYiB9LCB7IDB4ZTIsMHhlMiwweDNkLDB4ZGYgfSwgCisgICAgeyAweGViLDB4ZWIsMHgyNiwweGNkIH0sIHsgMHgyNywweDI3LDB4NjksMHg0ZSB9LAorICAgIHsgMHhiMiwweGIyLDB4Y2QsMHg3ZiB9LCB7IDB4NzUsMHg3NSwweDlmLDB4ZWEgfSwgCisgICAgeyAweDA5LDB4MDksMHgxYiwweDEyIH0sIHsgMHg4MywweDgzLDB4OWUsMHgxZCB9LAorICAgIHsgMHgyYywweDJjLDB4NzQsMHg1OCB9LCB7IDB4MWEsMHgxYSwweDJlLDB4MzQgfSwgCisgICAgeyAweDFiLDB4MWIsMHgyZCwweDM2IH0sIHsgMHg2ZSwweDZlLDB4YjIsMHhkYyB9LAorICAgIHsgMHg1YSwweDVhLDB4ZWUsMHhiNCB9LCB7IDB4YTAsMHhhMCwweGZiLDB4NWIgfSwgCisgICAgeyAweDUyLDB4NTIsMHhmNiwweGE0IH0sIHsgMHgzYiwweDNiLDB4NGQsMHg3NiB9LAorICAgIHsgMHhkNiwweGQ2LDB4NjEsMHhiNyB9LCB7IDB4YjMsMHhiMywweGNlLDB4N2QgfSwgCisgICAgeyAweDI5LDB4MjksMHg3YiwweDUyIH0sIHsgMHhlMywweGUzLDB4M2UsMHhkZCB9LAorICAgIHsgMHgyZiwweDJmLDB4NzEsMHg1ZSB9LCB7IDB4ODQsMHg4NCwweDk3LDB4MTMgfSwgCisgICAgeyAweDUzLDB4NTMsMHhmNSwweGE2IH0sIHsgMHhkMSwweGQxLDB4NjgsMHhiOSB9LAorICAgIHsgMHgwMCwweDAwLDB4MDAsMHgwMCB9LCB7IDB4ZWQsMHhlZCwweDJjLDB4YzEgfSwgCisgICAgeyAweDIwLDB4MjAsMHg2MCwweDQwIH0sIHsgMHhmYywweGZjLDB4MWYsMHhlMyB9LAorICAgIHsgMHhiMSwweGIxLDB4YzgsMHg3OSB9LCB7IDB4NWIsMHg1YiwweGVkLDB4YjYgfSwgCisgICAgeyAweDZhLDB4NmEsMHhiZSwweGQ0IH0sIHsgMHhjYiwweGNiLDB4NDYsMHg4ZCB9LAorICAgIHsgMHhiZSwweGJlLDB4ZDksMHg2NyB9LCB7IDB4MzksMHgzOSwweDRiLDB4NzIgfSwgCisgICAgeyAweDRhLDB4NGEsMHhkZSwweDk0IH0sIHsgMHg0YywweDRjLDB4ZDQsMHg5OCB9LAorICAgIHsgMHg1OCwweDU4LDB4ZTgsMHhiMCB9LCB7IDB4Y2YsMHhjZiwweDRhLDB4ODUgfSwgCisgICAgeyAweGQwLDB4ZDAsMHg2YiwweGJiIH0sIHsgMHhlZiwweGVmLDB4MmEsMHhjNSB9LAorICAgIHsgMHhhYSwweGFhLDB4ZTUsMHg0ZiB9LCB7IDB4ZmIsMHhmYiwweDE2LDB4ZWQgfSwgCisgICAgeyAweDQzLDB4NDMsMHhjNSwweDg2IH0sIHsgMHg0ZCwweDRkLDB4ZDcsMHg5YSB9LAorICAgIHsgMHgzMywweDMzLDB4NTUsMHg2NiB9LCB7IDB4ODUsMHg4NSwweDk0LDB4MTEgfSwgCisgICAgeyAweDQ1LDB4NDUsMHhjZiwweDhhIH0sIHsgMHhmOSwweGY5LDB4MTAsMHhlOSB9LAorICAgIHsgMHgwMiwweDAyLDB4MDYsMHgwNCB9LCB7IDB4N2YsMHg3ZiwweDgxLDB4ZmUgfSwgCisgICAgeyAweDUwLDB4NTAsMHhmMCwweGEwIH0sIHsgMHgzYywweDNjLDB4NDQsMHg3OCB9LAorICAgIHsgMHg5ZiwweDlmLDB4YmEsMHgyNSB9LCB7IDB4YTgsMHhhOCwweGUzLDB4NGIgfSwgCisgICAgeyAweDUxLDB4NTEsMHhmMywweGEyIH0sIHsgMHhhMywweGEzLDB4ZmUsMHg1ZCB9LAorICAgIHsgMHg0MCwweDQwLDB4YzAsMHg4MCB9LCB7IDB4OGYsMHg4ZiwweDhhLDB4MDUgfSwgCisgICAgeyAweDkyLDB4OTIsMHhhZCwweDNmIH0sIHsgMHg5ZCwweDlkLDB4YmMsMHgyMSB9LAorICAgIHsgMHgzOCwweDM4LDB4NDgsMHg3MCB9LCB7IDB4ZjUsMHhmNSwweDA0LDB4ZjEgfSwgCisgICAgeyAweGJjLDB4YmMsMHhkZiwweDYzIH0sIHsgMHhiNiwweGI2LDB4YzEsMHg3NyB9LAorICAgIHsgMHhkYSwweGRhLDB4NzUsMHhhZiB9LCB7IDB4MjEsMHgyMSwweDYzLDB4NDIgfSwgCisgICAgeyAweDEwLDB4MTAsMHgzMCwweDIwIH0sIHsgMHhmZiwweGZmLDB4MWEsMHhlNSB9LAorICAgIHsgMHhmMywweGYzLDB4MGUsMHhmZCB9LCB7IDB4ZDIsMHhkMiwweDZkLDB4YmYgfSwgCisgICAgeyAweGNkLDB4Y2QsMHg0YywweDgxIH0sIHsgMHgwYywweDBjLDB4MTQsMHgxOCB9LAorICAgIHsgMHgxMywweDEzLDB4MzUsMHgyNiB9LCB7IDB4ZWMsMHhlYywweDJmLDB4YzMgfSwgCisgICAgeyAweDVmLDB4NWYsMHhlMSwweGJlIH0sIHsgMHg5NywweDk3LDB4YTIsMHgzNSB9LAorICAgIHsgMHg0NCwweDQ0LDB4Y2MsMHg4OCB9LCB7IDB4MTcsMHgxNywweDM5LDB4MmUgfSwgCisgICAgeyAweGM0LDB4YzQsMHg1NywweDkzIH0sIHsgMHhhNywweGE3LDB4ZjIsMHg1NSB9LAorICAgIHsgMHg3ZSwweDdlLDB4ODIsMHhmYyB9LCB7IDB4M2QsMHgzZCwweDQ3LDB4N2EgfSwgCisgICAgeyAweDY0LDB4NjQsMHhhYywweGM4IH0sIHsgMHg1ZCwweDVkLDB4ZTcsMHhiYSB9LAorICAgIHsgMHgxOSwweDE5LDB4MmIsMHgzMiB9LCB7IDB4NzMsMHg3MywweDk1LDB4ZTYgfSwgCisgICAgeyAweDYwLDB4NjAsMHhhMCwweGMwIH0sIHsgMHg4MSwweDgxLDB4OTgsMHgxOSB9LAorICAgIHsgMHg0ZiwweDRmLDB4ZDEsMHg5ZSB9LCB7IDB4ZGMsMHhkYywweDdmLDB4YTMgfSwgCisgICAgeyAweDIyLDB4MjIsMHg2NiwweDQ0IH0sIHsgMHgyYSwweDJhLDB4N2UsMHg1NCB9LAorICAgIHsgMHg5MCwweDkwLDB4YWIsMHgzYiB9LCB7IDB4ODgsMHg4OCwweDgzLDB4MGIgfSwgCisgICAgeyAweDQ2LDB4NDYsMHhjYSwweDhjIH0sIHsgMHhlZSwweGVlLDB4MjksMHhjNyB9LAorICAgIHsgMHhiOCwweGI4LDB4ZDMsMHg2YiB9LCB7IDB4MTQsMHgxNCwweDNjLDB4MjggfSwgCisgICAgeyAweGRlLDB4ZGUsMHg3OSwweGE3IH0sIHsgMHg1ZSwweDVlLDB4ZTIsMHhiYyB9LAorICAgIHsgMHgwYiwweDBiLDB4MWQsMHgxNiB9LCB7IDB4ZGIsMHhkYiwweDc2LDB4YWQgfSwgCisgICAgeyAweGUwLDB4ZTAsMHgzYiwweGRiIH0sIHsgMHgzMiwweDMyLDB4NTYsMHg2NCB9LAorICAgIHsgMHgzYSwweDNhLDB4NGUsMHg3NCB9LCB7IDB4MGEsMHgwYSwweDFlLDB4MTQgfSwgCisgICAgeyAweDQ5LDB4NDksMHhkYiwweDkyIH0sIHsgMHgwNiwweDA2LDB4MGEsMHgwYyB9LAorICAgIHsgMHgyNCwweDI0LDB4NmMsMHg0OCB9LCB7IDB4NWMsMHg1YywweGU0LDB4YjggfSwgCisgICAgeyAweGMyLDB4YzIsMHg1ZCwweDlmIH0sIHsgMHhkMywweGQzLDB4NmUsMHhiZCB9LAorICAgIHsgMHhhYywweGFjLDB4ZWYsMHg0MyB9LCB7IDB4NjIsMHg2MiwweGE2LDB4YzQgfSwgCisgICAgeyAweDkxLDB4OTEsMHhhOCwweDM5IH0sIHsgMHg5NSwweDk1LDB4YTQsMHgzMSB9LAorICAgIHsgMHhlNCwweGU0LDB4MzcsMHhkMyB9LCB7IDB4NzksMHg3OSwweDhiLDB4ZjIgfSwgCisgICAgeyAweGU3LDB4ZTcsMHgzMiwweGQ1IH0sIHsgMHhjOCwweGM4LDB4NDMsMHg4YiB9LAorICAgIHsgMHgzNywweDM3LDB4NTksMHg2ZSB9LCB7IDB4NmQsMHg2ZCwweGI3LDB4ZGEgfSwgCisgICAgeyAweDhkLDB4OGQsMHg4YywweDAxIH0sIHsgMHhkNSwweGQ1LDB4NjQsMHhiMSB9LCAKKyAgICB7IDB4NGUsMHg0ZSwweGQyLDB4OWMgfSwgeyAweGE5LDB4YTksMHhlMCwweDQ5IH0sIAorICAgIHsgMHg2YywweDZjLDB4YjQsMHhkOCB9LCB7IDB4NTYsMHg1NiwweGZhLDB4YWMgfSwgCisgICAgeyAweGY0LDB4ZjQsMHgwNywweGYzIH0sIHsgMHhlYSwweGVhLDB4MjUsMHhjZiB9LCAKKyAgICB7IDB4NjUsMHg2NSwweGFmLDB4Y2EgfSwgeyAweDdhLDB4N2EsMHg4ZSwweGY0IH0sIAorICAgIHsgMHhhZSwweGFlLDB4ZTksMHg0NyB9LCB7IDB4MDgsMHgwOCwweDE4LDB4MTAgfSwgCisgICAgeyAweGJhLDB4YmEsMHhkNSwweDZmIH0sIHsgMHg3OCwweDc4LDB4ODgsMHhmMCB9LCAKKyAgICB7IDB4MjUsMHgyNSwweDZmLDB4NGEgfSwgeyAweDJlLDB4MmUsMHg3MiwweDVjIH0sIAorICAgIHsgMHgxYywweDFjLDB4MjQsMHgzOCB9LCB7IDB4YTYsMHhhNiwweGYxLDB4NTcgfSwKKyAgICB7IDB4YjQsMHhiNCwweGM3LDB4NzMgfSwgeyAweGM2LDB4YzYsMHg1MSwweDk3IH0sIAorICAgIHsgMHhlOCwweGU4LDB4MjMsMHhjYiB9LCB7IDB4ZGQsMHhkZCwweDdjLDB4YTEgfSwKKyAgICB7IDB4NzQsMHg3NCwweDljLDB4ZTggfSwgeyAweDFmLDB4MWYsMHgyMSwweDNlIH0sIAorICAgIHsgMHg0YiwweDRiLDB4ZGQsMHg5NiB9LCB7IDB4YmQsMHhiZCwweGRjLDB4NjEgfSwKKyAgICB7IDB4OGIsMHg4YiwweDg2LDB4MGQgfSwgeyAweDhhLDB4OGEsMHg4NSwweDBmIH0sIAorICAgIHsgMHg3MCwweDcwLDB4OTAsMHhlMCB9LCB7IDB4M2UsMHgzZSwweDQyLDB4N2MgfSwKKyAgICB7IDB4YjUsMHhiNSwweGM0LDB4NzEgfSwgeyAweDY2LDB4NjYsMHhhYSwweGNjIH0sIAorICAgIHsgMHg0OCwweDQ4LDB4ZDgsMHg5MCB9LCB7IDB4MDMsMHgwMywweDA1LDB4MDYgfSwKKyAgICB7IDB4ZjYsMHhmNiwweDAxLDB4ZjcgfSwgeyAweDBlLDB4MGUsMHgxMiwweDFjIH0sIAorICAgIHsgMHg2MSwweDYxLDB4YTMsMHhjMiB9LCB7IDB4MzUsMHgzNSwweDVmLDB4NmEgfSwKKyAgICB7IDB4NTcsMHg1NywweGY5LDB4YWUgfSwgeyAweGI5LDB4YjksMHhkMCwweDY5IH0sIAorICAgIHsgMHg4NiwweDg2LDB4OTEsMHgxNyB9LCB7IDB4YzEsMHhjMSwweDU4LDB4OTkgfSwKKyAgICB7IDB4MWQsMHgxZCwweDI3LDB4M2EgfSwgeyAweDllLDB4OWUsMHhiOSwweDI3IH0sIAorICAgIHsgMHhlMSwweGUxLDB4MzgsMHhkOSB9LCB7IDB4ZjgsMHhmOCwweDEzLDB4ZWIgfSwKKyAgICB7IDB4OTgsMHg5OCwweGIzLDB4MmIgfSwgeyAweDExLDB4MTEsMHgzMywweDIyIH0sIAorICAgIHsgMHg2OSwweDY5LDB4YmIsMHhkMiB9LCB7IDB4ZDksMHhkOSwweDcwLDB4YTkgfSwKKyAgICB7IDB4OGUsMHg4ZSwweDg5LDB4MDcgfSwgeyAweDk0LDB4OTQsMHhhNywweDMzIH0sIAorICAgIHsgMHg5YiwweDliLDB4YjYsMHgyZCB9LCB7IDB4MWUsMHgxZSwweDIyLDB4M2MgfSwKKyAgICB7IDB4ODcsMHg4NywweDkyLDB4MTUgfSwgeyAweGU5LDB4ZTksMHgyMCwweGM5IH0sIAorICAgIHsgMHhjZSwweGNlLDB4NDksMHg4NyB9LCB7IDB4NTUsMHg1NSwweGZmLDB4YWEgfSwKKyAgICB7IDB4MjgsMHgyOCwweDc4LDB4NTAgfSwgeyAweGRmLDB4ZGYsMHg3YSwweGE1IH0sIAorICAgIHsgMHg4YywweDhjLDB4OGYsMHgwMyB9LCB7IDB4YTEsMHhhMSwweGY4LDB4NTkgfSwKKyAgICB7IDB4ODksMHg4OSwweDgwLDB4MDkgfSwgeyAweDBkLDB4MGQsMHgxNywweDFhIH0sIAorICAgIHsgMHhiZiwweGJmLDB4ZGEsMHg2NSB9LCB7IDB4ZTYsMHhlNiwweDMxLDB4ZDcgfSwgCisgICAgeyAweDQyLDB4NDIsMHhjNiwweDg0IH0sIHsgMHg2OCwweDY4LDB4YjgsMHhkMCB9LCAKKyAgICB7IDB4NDEsMHg0MSwweGMzLDB4ODIgfSwgeyAweDk5LDB4OTksMHhiMCwweDI5IH0sCisgICAgeyAweDJkLDB4MmQsMHg3NywweDVhIH0sIHsgMHgwZiwweDBmLDB4MTEsMHgxZSB9LCAKKyAgICB7IDB4YjAsMHhiMCwweGNiLDB4N2IgfSwgeyAweDU0LDB4NTQsMHhmYywweGE4IH0sCisgICAgeyAweGJiLDB4YmIsMHhkNiwweDZkIH0sIHsgMHgxNiwweDE2LDB4M2EsMHgyYyB9CisgIH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFQ1WzI1Nl1bNF0gPSAKKyAgeworICAgIHsgMHg1MSwweGY0LDB4YTcsMHg1MCB9LCB7IDB4N2UsMHg0MSwweDY1LDB4NTMgfSwgCisgICAgeyAweDFhLDB4MTcsMHhhNCwweGMzIH0sIHsgMHgzYSwweDI3LDB4NWUsMHg5NiB9LCAKKyAgICB7IDB4M2IsMHhhYiwweDZiLDB4Y2IgfSwgeyAweDFmLDB4OWQsMHg0NSwweGYxIH0sCisgICAgeyAweGFjLDB4ZmEsMHg1OCwweGFiIH0sIHsgMHg0YiwweGUzLDB4MDMsMHg5MyB9LCAKKyAgICB7IDB4MjAsMHgzMCwweGZhLDB4NTUgfSwgeyAweGFkLDB4NzYsMHg2ZCwweGY2IH0sCisgICAgeyAweDg4LDB4Y2MsMHg3NiwweDkxIH0sIHsgMHhmNSwweDAyLDB4NGMsMHgyNSB9LCAKKyAgICB7IDB4NGYsMHhlNSwweGQ3LDB4ZmMgfSwgeyAweGM1LDB4MmEsMHhjYiwweGQ3IH0sCisgICAgeyAweDI2LDB4MzUsMHg0NCwweDgwIH0sIHsgMHhiNSwweDYyLDB4YTMsMHg4ZiB9LCAKKyAgICB7IDB4ZGUsMHhiMSwweDVhLDB4NDkgfSwgeyAweDI1LDB4YmEsMHgxYiwweDY3IH0sCisgICAgeyAweDQ1LDB4ZWEsMHgwZSwweDk4IH0sIHsgMHg1ZCwweGZlLDB4YzAsMHhlMSB9LCAKKyAgICB7IDB4YzMsMHgyZiwweDc1LDB4MDIgfSwgeyAweDgxLDB4NGMsMHhmMCwweDEyIH0sCisgICAgeyAweDhkLDB4NDYsMHg5NywweGEzIH0sIHsgMHg2YiwweGQzLDB4ZjksMHhjNiB9LCAKKyAgICB7IDB4MDMsMHg4ZiwweDVmLDB4ZTcgfSwgeyAweDE1LDB4OTIsMHg5YywweDk1IH0sCisgICAgeyAweGJmLDB4NmQsMHg3YSwweGViIH0sIHsgMHg5NSwweDUyLDB4NTksMHhkYSB9LCAKKyAgICB7IDB4ZDQsMHhiZSwweDgzLDB4MmQgfSwgeyAweDU4LDB4NzQsMHgyMSwweGQzIH0sCisgICAgeyAweDQ5LDB4ZTAsMHg2OSwweDI5IH0sIHsgMHg4ZSwweGM5LDB4YzgsMHg0NCB9LCAKKyAgICB7IDB4NzUsMHhjMiwweDg5LDB4NmEgfSwgeyAweGY0LDB4OGUsMHg3OSwweDc4IH0sCisgICAgeyAweDk5LDB4NTgsMHgzZSwweDZiIH0sIHsgMHgyNywweGI5LDB4NzEsMHhkZCB9LCAKKyAgICB7IDB4YmUsMHhlMSwweDRmLDB4YjYgfSwgeyAweGYwLDB4ODgsMHhhZCwweDE3IH0sCisgICAgeyAweGM5LDB4MjAsMHhhYywweDY2IH0sIHsgMHg3ZCwweGNlLDB4M2EsMHhiNCB9LCAKKyAgICB7IDB4NjMsMHhkZiwweDRhLDB4MTggfSwgeyAweGU1LDB4MWEsMHgzMSwweDgyIH0sCisgICAgeyAweDk3LDB4NTEsMHgzMywweDYwIH0sIHsgMHg2MiwweDUzLDB4N2YsMHg0NSB9LCAKKyAgICB7IDB4YjEsMHg2NCwweDc3LDB4ZTAgfSwgeyAweGJiLDB4NmIsMHhhZSwweDg0IH0sIAorICAgIHsgMHhmZSwweDgxLDB4YTAsMHgxYyB9LCB7IDB4ZjksMHgwOCwweDJiLDB4OTQgfSwgCisgICAgeyAweDcwLDB4NDgsMHg2OCwweDU4IH0sIHsgMHg4ZiwweDQ1LDB4ZmQsMHgxOSB9LCAKKyAgICB7IDB4OTQsMHhkZSwweDZjLDB4ODcgfSwgeyAweDUyLDB4N2IsMHhmOCwweGI3IH0sIAorICAgIHsgMHhhYiwweDczLDB4ZDMsMHgyMyB9LCB7IDB4NzIsMHg0YiwweDAyLDB4ZTIgfSwKKyAgICB7IDB4ZTMsMHgxZiwweDhmLDB4NTcgfSwgeyAweDY2LDB4NTUsMHhhYiwweDJhIH0sIAorICAgIHsgMHhiMiwweGViLDB4MjgsMHgwNyB9LCB7IDB4MmYsMHhiNSwweGMyLDB4MDMgfSwKKyAgICB7IDB4ODYsMHhjNSwweDdiLDB4OWEgfSwgeyAweGQzLDB4MzcsMHgwOCwweGE1IH0sIAorICAgIHsgMHgzMCwweDI4LDB4ODcsMHhmMiB9LCB7IDB4MjMsMHhiZiwweGE1LDB4YjIgfSwKKyAgICB7IDB4MDIsMHgwMywweDZhLDB4YmEgfSwgeyAweGVkLDB4MTYsMHg4MiwweDVjIH0sIAorICAgIHsgMHg4YSwweGNmLDB4MWMsMHgyYiB9LCB7IDB4YTcsMHg3OSwweGI0LDB4OTIgfSwKKyAgICB7IDB4ZjMsMHgwNywweGYyLDB4ZjAgfSwgeyAweDRlLDB4NjksMHhlMiwweGExIH0sIAorICAgIHsgMHg2NSwweGRhLDB4ZjQsMHhjZCB9LCB7IDB4MDYsMHgwNSwweGJlLDB4ZDUgfSwKKyAgICB7IDB4ZDEsMHgzNCwweDYyLDB4MWYgfSwgeyAweGM0LDB4YTYsMHhmZSwweDhhIH0sIAorICAgIHsgMHgzNCwweDJlLDB4NTMsMHg5ZCB9LCB7IDB4YTIsMHhmMywweDU1LDB4YTAgfSwKKyAgICB7IDB4MDUsMHg4YSwweGUxLDB4MzIgfSwgeyAweGE0LDB4ZjYsMHhlYiwweDc1IH0sIAorICAgIHsgMHgwYiwweDgzLDB4ZWMsMHgzOSB9LCB7IDB4NDAsMHg2MCwweGVmLDB4YWEgfSwKKyAgICB7IDB4NWUsMHg3MSwweDlmLDB4MDYgfSwgeyAweGJkLDB4NmUsMHgxMCwweDUxIH0sIAorICAgIHsgMHgzZSwweDIxLDB4OGEsMHhmOSB9LCB7IDB4OTYsMHhkZCwweDA2LDB4M2QgfSwgCisgICAgeyAweGRkLDB4M2UsMHgwNSwweGFlIH0sIHsgMHg0ZCwweGU2LDB4YmQsMHg0NiB9LCAKKyAgICB7IDB4OTEsMHg1NCwweDhkLDB4YjUgfSwgeyAweDcxLDB4YzQsMHg1ZCwweDA1IH0sIAorICAgIHsgMHgwNCwweDA2LDB4ZDQsMHg2ZiB9LCB7IDB4NjAsMHg1MCwweDE1LDB4ZmYgfSwgCisgICAgeyAweDE5LDB4OTgsMHhmYiwweDI0IH0sIHsgMHhkNiwweGJkLDB4ZTksMHg5NyB9LAorICAgIHsgMHg4OSwweDQwLDB4NDMsMHhjYyB9LCB7IDB4NjcsMHhkOSwweDllLDB4NzcgfSwgCisgICAgeyAweGIwLDB4ZTgsMHg0MiwweGJkIH0sIHsgMHgwNywweDg5LDB4OGIsMHg4OCB9LAorICAgIHsgMHhlNywweDE5LDB4NWIsMHgzOCB9LCB7IDB4NzksMHhjOCwweGVlLDB4ZGIgfSwgCisgICAgeyAweGExLDB4N2MsMHgwYSwweDQ3IH0sIHsgMHg3YywweDQyLDB4MGYsMHhlOSB9LAorICAgIHsgMHhmOCwweDg0LDB4MWUsMHhjOSB9LCB7IDB4MDAsMHgwMCwweDAwLDB4MDAgfSwgCisgICAgeyAweDA5LDB4ODAsMHg4NiwweDgzIH0sIHsgMHgzMiwweDJiLDB4ZWQsMHg0OCB9LAorICAgIHsgMHgxZSwweDExLDB4NzAsMHhhYyB9LCB7IDB4NmMsMHg1YSwweDcyLDB4NGUgfSwgCisgICAgeyAweGZkLDB4MGUsMHhmZiwweGZiIH0sIHsgMHgwZiwweDg1LDB4MzgsMHg1NiB9LAorICAgIHsgMHgzZCwweGFlLDB4ZDUsMHgxZSB9LCB7IDB4MzYsMHgyZCwweDM5LDB4MjcgfSwgCisgICAgeyAweDBhLDB4MGYsMHhkOSwweDY0IH0sIHsgMHg2OCwweDVjLDB4YTYsMHgyMSB9LAorICAgIHsgMHg5YiwweDViLDB4NTQsMHhkMSB9LCB7IDB4MjQsMHgzNiwweDJlLDB4M2EgfSwgCisgICAgeyAweDBjLDB4MGEsMHg2NywweGIxIH0sIHsgMHg5MywweDU3LDB4ZTcsMHgwZiB9LAorICAgIHsgMHhiNCwweGVlLDB4OTYsMHhkMiB9LCB7IDB4MWIsMHg5YiwweDkxLDB4OWUgfSwgCisgICAgeyAweDgwLDB4YzAsMHhjNSwweDRmIH0sIHsgMHg2MSwweGRjLDB4MjAsMHhhMiB9LAorICAgIHsgMHg1YSwweDc3LDB4NGIsMHg2OSB9LCB7IDB4MWMsMHgxMiwweDFhLDB4MTYgfSwgCisgICAgeyAweGUyLDB4OTMsMHhiYSwweDBhIH0sIHsgMHhjMCwweGEwLDB4MmEsMHhlNSB9LCAKKyAgICB7IDB4M2MsMHgyMiwweGUwLDB4NDMgfSwgeyAweDEyLDB4MWIsMHgxNywweDFkIH0sIAorICAgIHsgMHgwZSwweDA5LDB4MGQsMHgwYiB9LCB7IDB4ZjIsMHg4YiwweGM3LDB4YWQgfSwgCisgICAgeyAweDJkLDB4YjYsMHhhOCwweGI5IH0sIHsgMHgxNCwweDFlLDB4YTksMHhjOCB9LCAKKyAgICB7IDB4NTcsMHhmMSwweDE5LDB4ODUgfSwgeyAweGFmLDB4NzUsMHgwNywweDRjIH0sIAorICAgIHsgMHhlZSwweDk5LDB4ZGQsMHhiYiB9LCB7IDB4YTMsMHg3ZiwweDYwLDB4ZmQgfSwgCisgICAgeyAweGY3LDB4MDEsMHgyNiwweDlmIH0sIHsgMHg1YywweDcyLDB4ZjUsMHhiYyB9LAorICAgIHsgMHg0NCwweDY2LDB4M2IsMHhjNSB9LCB7IDB4NWIsMHhmYiwweDdlLDB4MzQgfSwgCisgICAgeyAweDhiLDB4NDMsMHgyOSwweDc2IH0sIHsgMHhjYiwweDIzLDB4YzYsMHhkYyB9LAorICAgIHsgMHhiNiwweGVkLDB4ZmMsMHg2OCB9LCB7IDB4YjgsMHhlNCwweGYxLDB4NjMgfSwgCisgICAgeyAweGQ3LDB4MzEsMHhkYywweGNhIH0sIHsgMHg0MiwweDYzLDB4ODUsMHgxMCB9LAorICAgIHsgMHgxMywweDk3LDB4MjIsMHg0MCB9LCB7IDB4ODQsMHhjNiwweDExLDB4MjAgfSwgCisgICAgeyAweDg1LDB4NGEsMHgyNCwweDdkIH0sIHsgMHhkMiwweGJiLDB4M2QsMHhmOCB9LCAKKyAgICB7IDB4YWUsMHhmOSwweDMyLDB4MTEgfSwgeyAweGM3LDB4MjksMHhhMSwweDZkIH0sIAorICAgIHsgMHgxZCwweDllLDB4MmYsMHg0YiB9LCB7IDB4ZGMsMHhiMiwweDMwLDB4ZjMgfSwKKyAgICB7IDB4MGQsMHg4NiwweDUyLDB4ZWMgfSwgeyAweDc3LDB4YzEsMHhlMywweGQwIH0sIAorICAgIHsgMHgyYiwweGIzLDB4MTYsMHg2YyB9LCB7IDB4YTksMHg3MCwweGI5LDB4OTkgfSwKKyAgICB7IDB4MTEsMHg5NCwweDQ4LDB4ZmEgfSwgeyAweDQ3LDB4ZTksMHg2NCwweDIyIH0sIAorICAgIHsgMHhhOCwweGZjLDB4OGMsMHhjNCB9LCB7IDB4YTAsMHhmMCwweDNmLDB4MWEgfSwKKyAgICB7IDB4NTYsMHg3ZCwweDJjLDB4ZDggfSwgeyAweDIyLDB4MzMsMHg5MCwweGVmIH0sIAorICAgIHsgMHg4NywweDQ5LDB4NGUsMHhjNyB9LCB7IDB4ZDksMHgzOCwweGQxLDB4YzEgfSwgCisgICAgeyAweDhjLDB4Y2EsMHhhMiwweGZlIH0sIHsgMHg5OCwweGQ0LDB4MGIsMHgzNiB9LCAKKyAgICB7IDB4YTYsMHhmNSwweDgxLDB4Y2YgfSwgeyAweGE1LDB4N2EsMHhkZSwweDI4IH0sIAorICAgIHsgMHhkYSwweGI3LDB4OGUsMHgyNiB9LCB7IDB4M2YsMHhhZCwweGJmLDB4YTQgfSwgCisgICAgeyAweDJjLDB4M2EsMHg5ZCwweGU0IH0sIHsgMHg1MCwweDc4LDB4OTIsMHgwZCB9LCAKKyAgICB7IDB4NmEsMHg1ZiwweGNjLDB4OWIgfSwgeyAweDU0LDB4N2UsMHg0NiwweDYyIH0sIAorICAgIHsgMHhmNiwweDhkLDB4MTMsMHhjMiB9LCB7IDB4OTAsMHhkOCwweGI4LDB4ZTggfSwgCisgICAgeyAweDJlLDB4MzksMHhmNywweDVlIH0sIHsgMHg4MiwweGMzLDB4YWYsMHhmNSB9LCAKKyAgICB7IDB4OWYsMHg1ZCwweDgwLDB4YmUgfSwgeyAweDY5LDB4ZDAsMHg5MywweDdjIH0sCisgICAgeyAweDZmLDB4ZDUsMHgyZCwweGE5IH0sIHsgMHhjZiwweDI1LDB4MTIsMHhiMyB9LCAKKyAgICB7IDB4YzgsMHhhYywweDk5LDB4M2IgfSwgeyAweDEwLDB4MTgsMHg3ZCwweGE3IH0sCisgICAgeyAweGU4LDB4OWMsMHg2MywweDZlIH0sIHsgMHhkYiwweDNiLDB4YmIsMHg3YiB9LCAKKyAgICB7IDB4Y2QsMHgyNiwweDc4LDB4MDkgfSwgeyAweDZlLDB4NTksMHgxOCwweGY0IH0sCisgICAgeyAweGVjLDB4OWEsMHhiNywweDAxIH0sIHsgMHg4MywweDRmLDB4OWEsMHhhOCB9LCAKKyAgICB7IDB4ZTYsMHg5NSwweDZlLDB4NjUgfSwgeyAweGFhLDB4ZmYsMHhlNiwweDdlIH0sIAorICAgIHsgMHgyMSwweGJjLDB4Y2YsMHgwOCB9LCB7IDB4ZWYsMHgxNSwweGU4LDB4ZTYgfSwgCisgICAgeyAweGJhLDB4ZTcsMHg5YiwweGQ5IH0sIHsgMHg0YSwweDZmLDB4MzYsMHhjZSB9LCAKKyAgICB7IDB4ZWEsMHg5ZiwweDA5LDB4ZDQgfSwgeyAweDI5LDB4YjAsMHg3YywweGQ2IH0sIAorICAgIHsgMHgzMSwweGE0LDB4YjIsMHhhZiB9LCB7IDB4MmEsMHgzZiwweDIzLDB4MzEgfSwgCisgICAgeyAweGM2LDB4YTUsMHg5NCwweDMwIH0sIHsgMHgzNSwweGEyLDB4NjYsMHhjMCB9LCAKKyAgICB7IDB4NzQsMHg0ZSwweGJjLDB4MzcgfSwgeyAweGZjLDB4ODIsMHhjYSwweGE2IH0sIAorICAgIHsgMHhlMCwweDkwLDB4ZDAsMHhiMCB9LCB7IDB4MzMsMHhhNywweGQ4LDB4MTUgfSwgCisgICAgeyAweGYxLDB4MDQsMHg5OCwweDRhIH0sIHsgMHg0MSwweGVjLDB4ZGEsMHhmNyB9LAorICAgIHsgMHg3ZiwweGNkLDB4NTAsMHgwZSB9LCB7IDB4MTcsMHg5MSwweGY2LDB4MmYgfSwgCisgICAgeyAweDc2LDB4NGQsMHhkNiwweDhkIH0sIHsgMHg0MywweGVmLDB4YjAsMHg0ZCB9LAorICAgIHsgMHhjYywweGFhLDB4NGQsMHg1NCB9LCB7IDB4ZTQsMHg5NiwweDA0LDB4ZGYgfSwgCisgICAgeyAweDllLDB4ZDEsMHhiNSwweGUzIH0sIHsgMHg0YywweDZhLDB4ODgsMHgxYiB9LAorICAgIHsgMHhjMSwweDJjLDB4MWYsMHhiOCB9LCB7IDB4NDYsMHg2NSwweDUxLDB4N2YgfSwgCisgICAgeyAweDlkLDB4NWUsMHhlYSwweDA0IH0sIHsgMHgwMSwweDhjLDB4MzUsMHg1ZCB9LAorICAgIHsgMHhmYSwweDg3LDB4NzQsMHg3MyB9LCB7IDB4ZmIsMHgwYiwweDQxLDB4MmUgfSwgCisgICAgeyAweGIzLDB4NjcsMHgxZCwweDVhIH0sIHsgMHg5MiwweGRiLDB4ZDIsMHg1MiB9LAorICAgIHsgMHhlOSwweDEwLDB4NTYsMHgzMyB9LCB7IDB4NmQsMHhkNiwweDQ3LDB4MTMgfSwgCisgICAgeyAweDlhLDB4ZDcsMHg2MSwweDhjIH0sIHsgMHgzNywweGExLDB4MGMsMHg3YSB9LAorICAgIHsgMHg1OSwweGY4LDB4MTQsMHg4ZSB9LCB7IDB4ZWIsMHgxMywweDNjLDB4ODkgfSwgCisgICAgeyAweGNlLDB4YTksMHgyNywweGVlIH0sIHsgMHhiNywweDYxLDB4YzksMHgzNSB9LAorICAgIHsgMHhlMSwweDFjLDB4ZTUsMHhlZCB9LCB7IDB4N2EsMHg0NywweGIxLDB4M2MgfSwgCisgICAgeyAweDljLDB4ZDIsMHhkZiwweDU5IH0sIHsgMHg1NSwweGYyLDB4NzMsMHgzZiB9LCAKKyAgICB7IDB4MTgsMHgxNCwweGNlLDB4NzkgfSwgeyAweDczLDB4YzcsMHgzNywweGJmIH0sIAorICAgIHsgMHg1MywweGY3LDB4Y2QsMHhlYSB9LCB7IDB4NWYsMHhmZCwweGFhLDB4NWIgfSwKKyAgICB7IDB4ZGYsMHgzZCwweDZmLDB4MTQgfSwgeyAweDc4LDB4NDQsMHhkYiwweDg2IH0sIAorICAgIHsgMHhjYSwweGFmLDB4ZjMsMHg4MSB9LCB7IDB4YjksMHg2OCwweGM0LDB4M2UgfSwgCisgICAgeyAweDM4LDB4MjQsMHgzNCwweDJjIH0sIHsgMHhjMiwweGEzLDB4NDAsMHg1ZiB9LCAKKyAgICB7IDB4MTYsMHgxZCwweGMzLDB4NzIgfSwgeyAweGJjLDB4ZTIsMHgyNSwweDBjIH0sIAorICAgIHsgMHgyOCwweDNjLDB4NDksMHg4YiB9LCB7IDB4ZmYsMHgwZCwweDk1LDB4NDEgfSwgCisgICAgeyAweDM5LDB4YTgsMHgwMSwweDcxIH0sIHsgMHgwOCwweDBjLDB4YjMsMHhkZSB9LCAKKyAgICB7IDB4ZDgsMHhiNCwweGU0LDB4OWMgfSwgeyAweDY0LDB4NTYsMHhjMSwweDkwIH0sIAorICAgIHsgMHg3YiwweGNiLDB4ODQsMHg2MSB9LCB7IDB4ZDUsMHgzMiwweGI2LDB4NzAgfSwKKyAgICB7IDB4NDgsMHg2YywweDVjLDB4NzQgfSwgeyAweGQwLDB4YjgsMHg1NywweDQyIH0KKyAgfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgVDZbMjU2XVs0XSA9IAorICB7CisgICAgeyAweDUwLDB4NTEsMHhmNCwweGE3IH0sIHsgMHg1MywweDdlLDB4NDEsMHg2NSB9LCAKKyAgICB7IDB4YzMsMHgxYSwweDE3LDB4YTQgfSwgeyAweDk2LDB4M2EsMHgyNywweDVlIH0sIAorICAgIHsgMHhjYiwweDNiLDB4YWIsMHg2YiB9LCB7IDB4ZjEsMHgxZiwweDlkLDB4NDUgfSwKKyAgICB7IDB4YWIsMHhhYywweGZhLDB4NTggfSwgeyAweDkzLDB4NGIsMHhlMywweDAzIH0sIAorICAgIHsgMHg1NSwweDIwLDB4MzAsMHhmYSB9LCB7IDB4ZjYsMHhhZCwweDc2LDB4NmQgfSwKKyAgICB7IDB4OTEsMHg4OCwweGNjLDB4NzYgfSwgeyAweDI1LDB4ZjUsMHgwMiwweDRjIH0sIAorICAgIHsgMHhmYywweDRmLDB4ZTUsMHhkNyB9LCB7IDB4ZDcsMHhjNSwweDJhLDB4Y2IgfSwKKyAgICB7IDB4ODAsMHgyNiwweDM1LDB4NDQgfSwgeyAweDhmLDB4YjUsMHg2MiwweGEzIH0sIAorICAgIHsgMHg0OSwweGRlLDB4YjEsMHg1YSB9LCB7IDB4NjcsMHgyNSwweGJhLDB4MWIgfSwgCisgICAgeyAweDk4LDB4NDUsMHhlYSwweDBlIH0sIHsgMHhlMSwweDVkLDB4ZmUsMHhjMCB9LCAKKyAgICB7IDB4MDIsMHhjMywweDJmLDB4NzUgfSwgeyAweDEyLDB4ODEsMHg0YywweGYwIH0sCisgICAgeyAweGEzLDB4OGQsMHg0NiwweDk3IH0sIHsgMHhjNiwweDZiLDB4ZDMsMHhmOSB9LCAKKyAgICB7IDB4ZTcsMHgwMywweDhmLDB4NWYgfSwgeyAweDk1LDB4MTUsMHg5MiwweDljIH0sCisgICAgeyAweGViLDB4YmYsMHg2ZCwweDdhIH0sIHsgMHhkYSwweDk1LDB4NTIsMHg1OSB9LCAKKyAgICB7IDB4MmQsMHhkNCwweGJlLDB4ODMgfSwgeyAweGQzLDB4NTgsMHg3NCwweDIxIH0sCisgICAgeyAweDI5LDB4NDksMHhlMCwweDY5IH0sIHsgMHg0NCwweDhlLDB4YzksMHhjOCB9LCAKKyAgICB7IDB4NmEsMHg3NSwweGMyLDB4ODkgfSwgeyAweDc4LDB4ZjQsMHg4ZSwweDc5IH0sCisgICAgeyAweDZiLDB4OTksMHg1OCwweDNlIH0sIHsgMHhkZCwweDI3LDB4YjksMHg3MSB9LCAKKyAgICB7IDB4YjYsMHhiZSwweGUxLDB4NGYgfSwgeyAweDE3LDB4ZjAsMHg4OCwweGFkIH0sCisgICAgeyAweDY2LDB4YzksMHgyMCwweGFjIH0sIHsgMHhiNCwweDdkLDB4Y2UsMHgzYSB9LCAKKyAgICB7IDB4MTgsMHg2MywweGRmLDB4NGEgfSwgeyAweDgyLDB4ZTUsMHgxYSwweDMxIH0sCisgICAgeyAweDYwLDB4OTcsMHg1MSwweDMzIH0sIHsgMHg0NSwweDYyLDB4NTMsMHg3ZiB9LCAKKyAgICB7IDB4ZTAsMHhiMSwweDY0LDB4NzcgfSwgeyAweDg0LDB4YmIsMHg2YiwweGFlIH0sCisgICAgeyAweDFjLDB4ZmUsMHg4MSwweGEwIH0sIHsgMHg5NCwweGY5LDB4MDgsMHgyYiB9LCAKKyAgICB7IDB4NTgsMHg3MCwweDQ4LDB4NjggfSwgeyAweDE5LDB4OGYsMHg0NSwweGZkIH0sCisgICAgeyAweDg3LDB4OTQsMHhkZSwweDZjIH0sIHsgMHhiNywweDUyLDB4N2IsMHhmOCB9LCAKKyAgICB7IDB4MjMsMHhhYiwweDczLDB4ZDMgfSwgeyAweGUyLDB4NzIsMHg0YiwweDAyIH0sCisgICAgeyAweDU3LDB4ZTMsMHgxZiwweDhmIH0sIHsgMHgyYSwweDY2LDB4NTUsMHhhYiB9LCAKKyAgICB7IDB4MDcsMHhiMiwweGViLDB4MjggfSwgeyAweDAzLDB4MmYsMHhiNSwweGMyIH0sCisgICAgeyAweDlhLDB4ODYsMHhjNSwweDdiIH0sIHsgMHhhNSwweGQzLDB4MzcsMHgwOCB9LCAKKyAgICB7IDB4ZjIsMHgzMCwweDI4LDB4ODcgfSwgeyAweGIyLDB4MjMsMHhiZiwweGE1IH0sCisgICAgeyAweGJhLDB4MDIsMHgwMywweDZhIH0sIHsgMHg1YywweGVkLDB4MTYsMHg4MiB9LCAKKyAgICB7IDB4MmIsMHg4YSwweGNmLDB4MWMgfSwgeyAweDkyLDB4YTcsMHg3OSwweGI0IH0sCisgICAgeyAweGYwLDB4ZjMsMHgwNywweGYyIH0sIHsgMHhhMSwweDRlLDB4NjksMHhlMiB9LCAKKyAgICB7IDB4Y2QsMHg2NSwweGRhLDB4ZjQgfSwgeyAweGQ1LDB4MDYsMHgwNSwweGJlIH0sCisgICAgeyAweDFmLDB4ZDEsMHgzNCwweDYyIH0sIHsgMHg4YSwweGM0LDB4YTYsMHhmZSB9LCAKKyAgICB7IDB4OWQsMHgzNCwweDJlLDB4NTMgfSwgeyAweGEwLDB4YTIsMHhmMywweDU1IH0sCisgICAgeyAweDMyLDB4MDUsMHg4YSwweGUxIH0sIHsgMHg3NSwweGE0LDB4ZjYsMHhlYiB9LCAKKyAgICB7IDB4MzksMHgwYiwweDgzLDB4ZWMgfSwgeyAweGFhLDB4NDAsMHg2MCwweGVmIH0sCisgICAgeyAweDA2LDB4NWUsMHg3MSwweDlmIH0sIHsgMHg1MSwweGJkLDB4NmUsMHgxMCB9LCAKKyAgICB7IDB4ZjksMHgzZSwweDIxLDB4OGEgfSwgeyAweDNkLDB4OTYsMHhkZCwweDA2IH0sCisgICAgeyAweGFlLDB4ZGQsMHgzZSwweDA1IH0sIHsgMHg0NiwweDRkLDB4ZTYsMHhiZCB9LCAKKyAgICB7IDB4YjUsMHg5MSwweDU0LDB4OGQgfSwgeyAweDA1LDB4NzEsMHhjNCwweDVkIH0sCisgICAgeyAweDZmLDB4MDQsMHgwNiwweGQ0IH0sIHsgMHhmZiwweDYwLDB4NTAsMHgxNSB9LCAKKyAgICB7IDB4MjQsMHgxOSwweDk4LDB4ZmIgfSwgeyAweDk3LDB4ZDYsMHhiZCwweGU5IH0sCisgICAgeyAweGNjLDB4ODksMHg0MCwweDQzIH0sIHsgMHg3NywweDY3LDB4ZDksMHg5ZSB9LCAKKyAgICB7IDB4YmQsMHhiMCwweGU4LDB4NDIgfSwgeyAweDg4LDB4MDcsMHg4OSwweDhiIH0sCisgICAgeyAweDM4LDB4ZTcsMHgxOSwweDViIH0sIHsgMHhkYiwweDc5LDB4YzgsMHhlZSB9LCAKKyAgICB7IDB4NDcsMHhhMSwweDdjLDB4MGEgfSwgeyAweGU5LDB4N2MsMHg0MiwweDBmIH0sCisgICAgeyAweGM5LDB4ZjgsMHg4NCwweDFlIH0sIHsgMHgwMCwweDAwLDB4MDAsMHgwMCB9LCAKKyAgICB7IDB4ODMsMHgwOSwweDgwLDB4ODYgfSwgeyAweDQ4LDB4MzIsMHgyYiwweGVkIH0sCisgICAgeyAweGFjLDB4MWUsMHgxMSwweDcwIH0sIHsgMHg0ZSwweDZjLDB4NWEsMHg3MiB9LCAKKyAgICB7IDB4ZmIsMHhmZCwweDBlLDB4ZmYgfSwgeyAweDU2LDB4MGYsMHg4NSwweDM4IH0sCisgICAgeyAweDFlLDB4M2QsMHhhZSwweGQ1IH0sIHsgMHgyNywweDM2LDB4MmQsMHgzOSB9LCAKKyAgICB7IDB4NjQsMHgwYSwweDBmLDB4ZDkgfSwgeyAweDIxLDB4NjgsMHg1YywweGE2IH0sCisgICAgeyAweGQxLDB4OWIsMHg1YiwweDU0IH0sIHsgMHgzYSwweDI0LDB4MzYsMHgyZSB9LCAKKyAgICB7IDB4YjEsMHgwYywweDBhLDB4NjcgfSwgeyAweDBmLDB4OTMsMHg1NywweGU3IH0sCisgICAgeyAweGQyLDB4YjQsMHhlZSwweDk2IH0sIHsgMHg5ZSwweDFiLDB4OWIsMHg5MSB9LCAKKyAgICB7IDB4NGYsMHg4MCwweGMwLDB4YzUgfSwgeyAweGEyLDB4NjEsMHhkYywweDIwIH0sIAorICAgIHsgMHg2OSwweDVhLDB4NzcsMHg0YiB9LCB7IDB4MTYsMHgxYywweDEyLDB4MWEgfSwgCisgICAgeyAweDBhLDB4ZTIsMHg5MywweGJhIH0sIHsgMHhlNSwweGMwLDB4YTAsMHgyYSB9LAorICAgIHsgMHg0MywweDNjLDB4MjIsMHhlMCB9LCB7IDB4MWQsMHgxMiwweDFiLDB4MTcgfSwgCisgICAgeyAweDBiLDB4MGUsMHgwOSwweDBkIH0sIHsgMHhhZCwweGYyLDB4OGIsMHhjNyB9LAorICAgIHsgMHhiOSwweDJkLDB4YjYsMHhhOCB9LCB7IDB4YzgsMHgxNCwweDFlLDB4YTkgfSwgCisgICAgeyAweDg1LDB4NTcsMHhmMSwweDE5IH0sIHsgMHg0YywweGFmLDB4NzUsMHgwNyB9LAorICAgIHsgMHhiYiwweGVlLDB4OTksMHhkZCB9LCB7IDB4ZmQsMHhhMywweDdmLDB4NjAgfSwgCisgICAgeyAweDlmLDB4ZjcsMHgwMSwweDI2IH0sIHsgMHhiYywweDVjLDB4NzIsMHhmNSB9LAorICAgIHsgMHhjNSwweDQ0LDB4NjYsMHgzYiB9LCB7IDB4MzQsMHg1YiwweGZiLDB4N2UgfSwgCisgICAgeyAweDc2LDB4OGIsMHg0MywweDI5IH0sIHsgMHhkYywweGNiLDB4MjMsMHhjNiB9LAorICAgIHsgMHg2OCwweGI2LDB4ZWQsMHhmYyB9LCB7IDB4NjMsMHhiOCwweGU0LDB4ZjEgfSwgCisgICAgeyAweGNhLDB4ZDcsMHgzMSwweGRjIH0sIHsgMHgxMCwweDQyLDB4NjMsMHg4NSB9LAorICAgIHsgMHg0MCwweDEzLDB4OTcsMHgyMiB9LCB7IDB4MjAsMHg4NCwweGM2LDB4MTEgfSwgCisgICAgeyAweDdkLDB4ODUsMHg0YSwweDI0IH0sIHsgMHhmOCwweGQyLDB4YmIsMHgzZCB9LAorICAgIHsgMHgxMSwweGFlLDB4ZjksMHgzMiB9LCB7IDB4NmQsMHhjNywweDI5LDB4YTEgfSwgCisgICAgeyAweDRiLDB4MWQsMHg5ZSwweDJmIH0sIHsgMHhmMywweGRjLDB4YjIsMHgzMCB9LAorICAgIHsgMHhlYywweDBkLDB4ODYsMHg1MiB9LCB7IDB4ZDAsMHg3NywweGMxLDB4ZTMgfSwgCisgICAgeyAweDZjLDB4MmIsMHhiMywweDE2IH0sIHsgMHg5OSwweGE5LDB4NzAsMHhiOSB9LCAKKyAgICB7IDB4ZmEsMHgxMSwweDk0LDB4NDggfSwgeyAweDIyLDB4NDcsMHhlOSwweDY0IH0sIAorICAgIHsgMHhjNCwweGE4LDB4ZmMsMHg4YyB9LCB7IDB4MWEsMHhhMCwweGYwLDB4M2YgfSwgCisgICAgeyAweGQ4LDB4NTYsMHg3ZCwweDJjIH0sIHsgMHhlZiwweDIyLDB4MzMsMHg5MCB9LCAKKyAgICB7IDB4YzcsMHg4NywweDQ5LDB4NGUgfSwgeyAweGMxLDB4ZDksMHgzOCwweGQxIH0sCisgICAgeyAweGZlLDB4OGMsMHhjYSwweGEyIH0sIHsgMHgzNiwweDk4LDB4ZDQsMHgwYiB9LCAKKyAgICB7IDB4Y2YsMHhhNiwweGY1LDB4ODEgfSwgeyAweDI4LDB4YTUsMHg3YSwweGRlIH0sIAorICAgIHsgMHgyNiwweGRhLDB4YjcsMHg4ZSB9LCB7IDB4YTQsMHgzZiwweGFkLDB4YmYgfSwgCisgICAgeyAweGU0LDB4MmMsMHgzYSwweDlkIH0sIHsgMHgwZCwweDUwLDB4NzgsMHg5MiB9LCAKKyAgICB7IDB4OWIsMHg2YSwweDVmLDB4Y2MgfSwgeyAweDYyLDB4NTQsMHg3ZSwweDQ2IH0sIAorICAgIHsgMHhjMiwweGY2LDB4OGQsMHgxMyB9LCB7IDB4ZTgsMHg5MCwweGQ4LDB4YjggfSwgCisgICAgeyAweDVlLDB4MmUsMHgzOSwweGY3IH0sIHsgMHhmNSwweDgyLDB4YzMsMHhhZiB9LCAKKyAgICB7IDB4YmUsMHg5ZiwweDVkLDB4ODAgfSwgeyAweDdjLDB4NjksMHhkMCwweDkzIH0sCisgICAgeyAweGE5LDB4NmYsMHhkNSwweDJkIH0sIHsgMHhiMywweGNmLDB4MjUsMHgxMiB9LCAKKyAgICB7IDB4M2IsMHhjOCwweGFjLDB4OTkgfSwgeyAweGE3LDB4MTAsMHgxOCwweDdkIH0sIAorICAgIHsgMHg2ZSwweGU4LDB4OWMsMHg2MyB9LCB7IDB4N2IsMHhkYiwweDNiLDB4YmIgfSwgCisgICAgeyAweDA5LDB4Y2QsMHgyNiwweDc4IH0sIHsgMHhmNCwweDZlLDB4NTksMHgxOCB9LAorICAgIHsgMHgwMSwweGVjLDB4OWEsMHhiNyB9LCB7IDB4YTgsMHg4MywweDRmLDB4OWEgfSwgCisgICAgeyAweDY1LDB4ZTYsMHg5NSwweDZlIH0sIHsgMHg3ZSwweGFhLDB4ZmYsMHhlNiB9LCAKKyAgICB7IDB4MDgsMHgyMSwweGJjLDB4Y2YgfSwgeyAweGU2LDB4ZWYsMHgxNSwweGU4IH0sIAorICAgIHsgMHhkOSwweGJhLDB4ZTcsMHg5YiB9LCB7IDB4Y2UsMHg0YSwweDZmLDB4MzYgfSwKKyAgICB7IDB4ZDQsMHhlYSwweDlmLDB4MDkgfSwgeyAweGQ2LDB4MjksMHhiMCwweDdjIH0sIAorICAgIHsgMHhhZiwweDMxLDB4YTQsMHhiMiB9LCB7IDB4MzEsMHgyYSwweDNmLDB4MjMgfSwKKyAgICB7IDB4MzAsMHhjNiwweGE1LDB4OTQgfSwgeyAweGMwLDB4MzUsMHhhMiwweDY2IH0sIAorICAgIHsgMHgzNywweDc0LDB4NGUsMHhiYyB9LCB7IDB4YTYsMHhmYywweDgyLDB4Y2EgfSwgCisgICAgeyAweGIwLDB4ZTAsMHg5MCwweGQwIH0sIHsgMHgxNSwweDMzLDB4YTcsMHhkOCB9LCAKKyAgICB7IDB4NGEsMHhmMSwweDA0LDB4OTggfSwgeyAweGY3LDB4NDEsMHhlYywweGRhIH0sCisgICAgeyAweDBlLDB4N2YsMHhjZCwweDUwIH0sIHsgMHgyZiwweDE3LDB4OTEsMHhmNiB9LCAKKyAgICB7IDB4OGQsMHg3NiwweDRkLDB4ZDYgfSwgeyAweDRkLDB4NDMsMHhlZiwweGIwIH0sCisgICAgeyAweDU0LDB4Y2MsMHhhYSwweDRkIH0sIHsgMHhkZiwweGU0LDB4OTYsMHgwNCB9LCAKKyAgICB7IDB4ZTMsMHg5ZSwweGQxLDB4YjUgfSwgeyAweDFiLDB4NGMsMHg2YSwweDg4IH0sCisgICAgeyAweGI4LDB4YzEsMHgyYywweDFmIH0sIHsgMHg3ZiwweDQ2LDB4NjUsMHg1MSB9LCAKKyAgICB7IDB4MDQsMHg5ZCwweDVlLDB4ZWEgfSwgeyAweDVkLDB4MDEsMHg4YywweDM1IH0sCisgICAgeyAweDczLDB4ZmEsMHg4NywweDc0IH0sIHsgMHgyZSwweGZiLDB4MGIsMHg0MSB9LCAKKyAgICB7IDB4NWEsMHhiMywweDY3LDB4MWQgfSwgeyAweDUyLDB4OTIsMHhkYiwweGQyIH0sCisgICAgeyAweDMzLDB4ZTksMHgxMCwweDU2IH0sIHsgMHgxMywweDZkLDB4ZDYsMHg0NyB9LCAKKyAgICB7IDB4OGMsMHg5YSwweGQ3LDB4NjEgfSwgeyAweDdhLDB4MzcsMHhhMSwweDBjIH0sIAorICAgIHsgMHg4ZSwweDU5LDB4ZjgsMHgxNCB9LCB7IDB4ODksMHhlYiwweDEzLDB4M2MgfSwgCisgICAgeyAweGVlLDB4Y2UsMHhhOSwweDI3IH0sIHsgMHgzNSwweGI3LDB4NjEsMHhjOSB9LAorICAgIHsgMHhlZCwweGUxLDB4MWMsMHhlNSB9LCB7IDB4M2MsMHg3YSwweDQ3LDB4YjEgfSwgCisgICAgeyAweDU5LDB4OWMsMHhkMiwweGRmIH0sIHsgMHgzZiwweDU1LDB4ZjIsMHg3MyB9LAorICAgIHsgMHg3OSwweDE4LDB4MTQsMHhjZSB9LCB7IDB4YmYsMHg3MywweGM3LDB4MzcgfSwgCisgICAgeyAweGVhLDB4NTMsMHhmNywweGNkIH0sIHsgMHg1YiwweDVmLDB4ZmQsMHhhYSB9LAorICAgIHsgMHgxNCwweGRmLDB4M2QsMHg2ZiB9LCB7IDB4ODYsMHg3OCwweDQ0LDB4ZGIgfSwgCisgICAgeyAweDgxLDB4Y2EsMHhhZiwweGYzIH0sIHsgMHgzZSwweGI5LDB4NjgsMHhjNCB9LAorICAgIHsgMHgyYywweDM4LDB4MjQsMHgzNCB9LCB7IDB4NWYsMHhjMiwweGEzLDB4NDAgfSwgCisgICAgeyAweDcyLDB4MTYsMHgxZCwweGMzIH0sIHsgMHgwYywweGJjLDB4ZTIsMHgyNSB9LAorICAgIHsgMHg4YiwweDI4LDB4M2MsMHg0OSB9LCB7IDB4NDEsMHhmZiwweDBkLDB4OTUgfSwgCisgICAgeyAweDcxLDB4MzksMHhhOCwweDAxIH0sIHsgMHhkZSwweDA4LDB4MGMsMHhiMyB9LAorICAgIHsgMHg5YywweGQ4LDB4YjQsMHhlNCB9LCB7IDB4OTAsMHg2NCwweDU2LDB4YzEgfSwgCisgICAgeyAweDYxLDB4N2IsMHhjYiwweDg0IH0sIHsgMHg3MCwweGQ1LDB4MzIsMHhiNiB9LAorICAgIHsgMHg3NCwweDQ4LDB4NmMsMHg1YyB9LCB7IDB4NDIsMHhkMCwweGI4LDB4NTcgfQorICB9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBUN1syNTZdWzRdID0gCisgIHsKKyAgICB7IDB4YTcsMHg1MCwweDUxLDB4ZjQgfSwgeyAweDY1LDB4NTMsMHg3ZSwweDQxIH0sCisgICAgeyAweGE0LDB4YzMsMHgxYSwweDE3IH0sIHsgMHg1ZSwweDk2LDB4M2EsMHgyNyB9LCAKKyAgICB7IDB4NmIsMHhjYiwweDNiLDB4YWIgfSwgeyAweDQ1LDB4ZjEsMHgxZiwweDlkIH0sCisgICAgeyAweDU4LDB4YWIsMHhhYywweGZhIH0sIHsgMHgwMywweDkzLDB4NGIsMHhlMyB9LCAKKyAgICB7IDB4ZmEsMHg1NSwweDIwLDB4MzAgfSwgeyAweDZkLDB4ZjYsMHhhZCwweDc2IH0sCisgICAgeyAweDc2LDB4OTEsMHg4OCwweGNjIH0sIHsgMHg0YywweDI1LDB4ZjUsMHgwMiB9LCAKKyAgICB7IDB4ZDcsMHhmYywweDRmLDB4ZTUgfSwgeyAweGNiLDB4ZDcsMHhjNSwweDJhIH0sCisgICAgeyAweDQ0LDB4ODAsMHgyNiwweDM1IH0sIHsgMHhhMywweDhmLDB4YjUsMHg2MiB9LCAKKyAgICB7IDB4NWEsMHg0OSwweGRlLDB4YjEgfSwgeyAweDFiLDB4NjcsMHgyNSwweGJhIH0sIAorICAgIHsgMHgwZSwweDk4LDB4NDUsMHhlYSB9LCB7IDB4YzAsMHhlMSwweDVkLDB4ZmUgfSwgCisgICAgeyAweDc1LDB4MDIsMHhjMywweDJmIH0sIHsgMHhmMCwweDEyLDB4ODEsMHg0YyB9LAorICAgIHsgMHg5NywweGEzLDB4OGQsMHg0NiB9LCB7IDB4ZjksMHhjNiwweDZiLDB4ZDMgfSwgCisgICAgeyAweDVmLDB4ZTcsMHgwMywweDhmIH0sIHsgMHg5YywweDk1LDB4MTUsMHg5MiB9LAorICAgIHsgMHg3YSwweGViLDB4YmYsMHg2ZCB9LCB7IDB4NTksMHhkYSwweDk1LDB4NTIgfSwgCisgICAgeyAweDgzLDB4MmQsMHhkNCwweGJlIH0sIHsgMHgyMSwweGQzLDB4NTgsMHg3NCB9LAorICAgIHsgMHg2OSwweDI5LDB4NDksMHhlMCB9LCB7IDB4YzgsMHg0NCwweDhlLDB4YzkgfSwgCisgICAgeyAweDg5LDB4NmEsMHg3NSwweGMyIH0sIHsgMHg3OSwweDc4LDB4ZjQsMHg4ZSB9LCAKKyAgICB7IDB4M2UsMHg2YiwweDk5LDB4NTggfSwgeyAweDcxLDB4ZGQsMHgyNywweGI5IH0sIAorICAgIHsgMHg0ZiwweGI2LDB4YmUsMHhlMSB9LCB7IDB4YWQsMHgxNywweGYwLDB4ODggfSwKKyAgICB7IDB4YWMsMHg2NiwweGM5LDB4MjAgfSwgeyAweDNhLDB4YjQsMHg3ZCwweGNlIH0sIAorICAgIHsgMHg0YSwweDE4LDB4NjMsMHhkZiB9LCB7IDB4MzEsMHg4MiwweGU1LDB4MWEgfSwKKyAgICB7IDB4MzMsMHg2MCwweDk3LDB4NTEgfSwgeyAweDdmLDB4NDUsMHg2MiwweDUzIH0sIAorICAgIHsgMHg3NywweGUwLDB4YjEsMHg2NCB9LCB7IDB4YWUsMHg4NCwweGJiLDB4NmIgfSwKKyAgICB7IDB4YTAsMHgxYywweGZlLDB4ODEgfSwgeyAweDJiLDB4OTQsMHhmOSwweDA4IH0sIAorICAgIHsgMHg2OCwweDU4LDB4NzAsMHg0OCB9LCB7IDB4ZmQsMHgxOSwweDhmLDB4NDUgfSwKKyAgICB7IDB4NmMsMHg4NywweDk0LDB4ZGUgfSwgeyAweGY4LDB4YjcsMHg1MiwweDdiIH0sIAorICAgIHsgMHhkMywweDIzLDB4YWIsMHg3MyB9LCB7IDB4MDIsMHhlMiwweDcyLDB4NGIgfSwKKyAgICB7IDB4OGYsMHg1NywweGUzLDB4MWYgfSwgeyAweGFiLDB4MmEsMHg2NiwweDU1IH0sIAorICAgIHsgMHgyOCwweDA3LDB4YjIsMHhlYiB9LCB7IDB4YzIsMHgwMywweDJmLDB4YjUgfSwKKyAgICB7IDB4N2IsMHg5YSwweDg2LDB4YzUgfSwgeyAweDA4LDB4YTUsMHhkMywweDM3IH0sIAorICAgIHsgMHg4NywweGYyLDB4MzAsMHgyOCB9LCB7IDB4YTUsMHhiMiwweDIzLDB4YmYgfSwKKyAgICB7IDB4NmEsMHhiYSwweDAyLDB4MDMgfSwgeyAweDgyLDB4NWMsMHhlZCwweDE2IH0sIAorICAgIHsgMHgxYywweDJiLDB4OGEsMHhjZiB9LCB7IDB4YjQsMHg5MiwweGE3LDB4NzkgfSwgCisgICAgeyAweGYyLDB4ZjAsMHhmMywweDA3IH0sIHsgMHhlMiwweGExLDB4NGUsMHg2OSB9LCAKKyAgICB7IDB4ZjQsMHhjZCwweDY1LDB4ZGEgfSwgeyAweGJlLDB4ZDUsMHgwNiwweDA1IH0sCisgICAgeyAweDYyLDB4MWYsMHhkMSwweDM0IH0sIHsgMHhmZSwweDhhLDB4YzQsMHhhNiB9LCAKKyAgICB7IDB4NTMsMHg5ZCwweDM0LDB4MmUgfSwgeyAweDU1LDB4YTAsMHhhMiwweGYzIH0sCisgICAgeyAweGUxLDB4MzIsMHgwNSwweDhhIH0sIHsgMHhlYiwweDc1LDB4YTQsMHhmNiB9LCAKKyAgICB7IDB4ZWMsMHgzOSwweDBiLDB4ODMgfSwgeyAweGVmLDB4YWEsMHg0MCwweDYwIH0sCisgICAgeyAweDlmLDB4MDYsMHg1ZSwweDcxIH0sIHsgMHgxMCwweDUxLDB4YmQsMHg2ZSB9LCAKKyAgICB7IDB4OGEsMHhmOSwweDNlLDB4MjEgfSwgeyAweDA2LDB4M2QsMHg5NiwweGRkIH0sCisgICAgeyAweDA1LDB4YWUsMHhkZCwweDNlIH0sIHsgMHhiZCwweDQ2LDB4NGQsMHhlNiB9LCAKKyAgICB7IDB4OGQsMHhiNSwweDkxLDB4NTQgfSwgeyAweDVkLDB4MDUsMHg3MSwweGM0IH0sCisgICAgeyAweGQ0LDB4NmYsMHgwNCwweDA2IH0sIHsgMHgxNSwweGZmLDB4NjAsMHg1MCB9LCAKKyAgICB7IDB4ZmIsMHgyNCwweDE5LDB4OTggfSwgeyAweGU5LDB4OTcsMHhkNiwweGJkIH0sIAorICAgIHsgMHg0MywweGNjLDB4ODksMHg0MCB9LCB7IDB4OWUsMHg3NywweDY3LDB4ZDkgfSwgCisgICAgeyAweDQyLDB4YmQsMHhiMCwweGU4IH0sIHsgMHg4YiwweDg4LDB4MDcsMHg4OSB9LAorICAgIHsgMHg1YiwweDM4LDB4ZTcsMHgxOSB9LCB7IDB4ZWUsMHhkYiwweDc5LDB4YzggfSwgCisgICAgeyAweDBhLDB4NDcsMHhhMSwweDdjIH0sIHsgMHgwZiwweGU5LDB4N2MsMHg0MiB9LAorICAgIHsgMHgxZSwweGM5LDB4ZjgsMHg4NCB9LCB7IDB4MDAsMHgwMCwweDAwLDB4MDAgfSwgCisgICAgeyAweDg2LDB4ODMsMHgwOSwweDgwIH0sIHsgMHhlZCwweDQ4LDB4MzIsMHgyYiB9LAorICAgIHsgMHg3MCwweGFjLDB4MWUsMHgxMSB9LCB7IDB4NzIsMHg0ZSwweDZjLDB4NWEgfSwgCisgICAgeyAweGZmLDB4ZmIsMHhmZCwweDBlIH0sIHsgMHgzOCwweDU2LDB4MGYsMHg4NSB9LAorICAgIHsgMHhkNSwweDFlLDB4M2QsMHhhZSB9LCB7IDB4MzksMHgyNywweDM2LDB4MmQgfSwgCisgICAgeyAweGQ5LDB4NjQsMHgwYSwweDBmIH0sIHsgMHhhNiwweDIxLDB4NjgsMHg1YyB9LAorICAgIHsgMHg1NCwweGQxLDB4OWIsMHg1YiB9LCB7IDB4MmUsMHgzYSwweDI0LDB4MzYgfSwgCisgICAgeyAweDY3LDB4YjEsMHgwYywweDBhIH0sIHsgMHhlNywweDBmLDB4OTMsMHg1NyB9LAorICAgIHsgMHg5NiwweGQyLDB4YjQsMHhlZSB9LCB7IDB4OTEsMHg5ZSwweDFiLDB4OWIgfSwgCisgICAgeyAweGM1LDB4NGYsMHg4MCwweGMwIH0sIHsgMHgyMCwweGEyLDB4NjEsMHhkYyB9LAorICAgIHsgMHg0YiwweDY5LDB4NWEsMHg3NyB9LCB7IDB4MWEsMHgxNiwweDFjLDB4MTIgfSwgCisgICAgeyAweGJhLDB4MGEsMHhlMiwweDkzIH0sIHsgMHgyYSwweGU1LDB4YzAsMHhhMCB9LAorICAgIHsgMHhlMCwweDQzLDB4M2MsMHgyMiB9LCB7IDB4MTcsMHgxZCwweDEyLDB4MWIgfSwgCisgICAgeyAweDBkLDB4MGIsMHgwZSwweDA5IH0sIHsgMHhjNywweGFkLDB4ZjIsMHg4YiB9LAorICAgIHsgMHhhOCwweGI5LDB4MmQsMHhiNiB9LCB7IDB4YTksMHhjOCwweDE0LDB4MWUgfSwgCisgICAgeyAweDE5LDB4ODUsMHg1NywweGYxIH0sIHsgMHgwNywweDRjLDB4YWYsMHg3NSB9LAorICAgIHsgMHhkZCwweGJiLDB4ZWUsMHg5OSB9LCB7IDB4NjAsMHhmZCwweGEzLDB4N2YgfSwgCisgICAgeyAweDI2LDB4OWYsMHhmNywweDAxIH0sIHsgMHhmNSwweGJjLDB4NWMsMHg3MiB9LAorICAgIHsgMHgzYiwweGM1LDB4NDQsMHg2NiB9LCB7IDB4N2UsMHgzNCwweDViLDB4ZmIgfSwgCisgICAgeyAweDI5LDB4NzYsMHg4YiwweDQzIH0sIHsgMHhjNiwweGRjLDB4Y2IsMHgyMyB9LAorICAgIHsgMHhmYywweDY4LDB4YjYsMHhlZCB9LCB7IDB4ZjEsMHg2MywweGI4LDB4ZTQgfSwgCisgICAgeyAweGRjLDB4Y2EsMHhkNywweDMxIH0sIHsgMHg4NSwweDEwLDB4NDIsMHg2MyB9LAorICAgIHsgMHgyMiwweDQwLDB4MTMsMHg5NyB9LCB7IDB4MTEsMHgyMCwweDg0LDB4YzYgfSwgCisgICAgeyAweDI0LDB4N2QsMHg4NSwweDRhIH0sIHsgMHgzZCwweGY4LDB4ZDIsMHhiYiB9LAorICAgIHsgMHgzMiwweDExLDB4YWUsMHhmOSB9LCB7IDB4YTEsMHg2ZCwweGM3LDB4MjkgfSwgCisgICAgeyAweDJmLDB4NGIsMHgxZCwweDllIH0sIHsgMHgzMCwweGYzLDB4ZGMsMHhiMiB9LAorICAgIHsgMHg1MiwweGVjLDB4MGQsMHg4NiB9LCB7IDB4ZTMsMHhkMCwweDc3LDB4YzEgfSwgCisgICAgeyAweDE2LDB4NmMsMHgyYiwweGIzIH0sIHsgMHhiOSwweDk5LDB4YTksMHg3MCB9LAorICAgIHsgMHg0OCwweGZhLDB4MTEsMHg5NCB9LCB7IDB4NjQsMHgyMiwweDQ3LDB4ZTkgfSwgCisgICAgeyAweDhjLDB4YzQsMHhhOCwweGZjIH0sIHsgMHgzZiwweDFhLDB4YTAsMHhmMCB9LAorICAgIHsgMHgyYywweGQ4LDB4NTYsMHg3ZCB9LCB7IDB4OTAsMHhlZiwweDIyLDB4MzMgfSwgCisgICAgeyAweDRlLDB4YzcsMHg4NywweDQ5IH0sIHsgMHhkMSwweGMxLDB4ZDksMHgzOCB9LAorICAgIHsgMHhhMiwweGZlLDB4OGMsMHhjYSB9LCB7IDB4MGIsMHgzNiwweDk4LDB4ZDQgfSwgCisgICAgeyAweDgxLDB4Y2YsMHhhNiwweGY1IH0sIHsgMHhkZSwweDI4LDB4YTUsMHg3YSB9LAorICAgIHsgMHg4ZSwweDI2LDB4ZGEsMHhiNyB9LCB7IDB4YmYsMHhhNCwweDNmLDB4YWQgfSwgCisgICAgeyAweDlkLDB4ZTQsMHgyYywweDNhIH0sIHsgMHg5MiwweDBkLDB4NTAsMHg3OCB9LAorICAgIHsgMHhjYywweDliLDB4NmEsMHg1ZiB9LCB7IDB4NDYsMHg2MiwweDU0LDB4N2UgfSwgCisgICAgeyAweDEzLDB4YzIsMHhmNiwweDhkIH0sIHsgMHhiOCwweGU4LDB4OTAsMHhkOCB9LAorICAgIHsgMHhmNywweDVlLDB4MmUsMHgzOSB9LCB7IDB4YWYsMHhmNSwweDgyLDB4YzMgfSwgCisgICAgeyAweDgwLDB4YmUsMHg5ZiwweDVkIH0sIHsgMHg5MywweDdjLDB4NjksMHhkMCB9LAorICAgIHsgMHgyZCwweGE5LDB4NmYsMHhkNSB9LCB7IDB4MTIsMHhiMywweGNmLDB4MjUgfSwgCisgICAgeyAweDk5LDB4M2IsMHhjOCwweGFjIH0sIHsgMHg3ZCwweGE3LDB4MTAsMHgxOCB9LAorICAgIHsgMHg2MywweDZlLDB4ZTgsMHg5YyB9LCB7IDB4YmIsMHg3YiwweGRiLDB4M2IgfSwgCisgICAgeyAweDc4LDB4MDksMHhjZCwweDI2IH0sIHsgMHgxOCwweGY0LDB4NmUsMHg1OSB9LCAKKyAgICB7IDB4YjcsMHgwMSwweGVjLDB4OWEgfSwgeyAweDlhLDB4YTgsMHg4MywweDRmIH0sIAorICAgIHsgMHg2ZSwweDY1LDB4ZTYsMHg5NSB9LCB7IDB4ZTYsMHg3ZSwweGFhLDB4ZmYgfSwKKyAgICB7IDB4Y2YsMHgwOCwweDIxLDB4YmMgfSwgeyAweGU4LDB4ZTYsMHhlZiwweDE1IH0sIAorICAgIHsgMHg5YiwweGQ5LDB4YmEsMHhlNyB9LCB7IDB4MzYsMHhjZSwweDRhLDB4NmYgfSwKKyAgICB7IDB4MDksMHhkNCwweGVhLDB4OWYgfSwgeyAweDdjLDB4ZDYsMHgyOSwweGIwIH0sIAorICAgIHsgMHhiMiwweGFmLDB4MzEsMHhhNCB9LCB7IDB4MjMsMHgzMSwweDJhLDB4M2YgfSwKKyAgICB7IDB4OTQsMHgzMCwweGM2LDB4YTUgfSwgeyAweDY2LDB4YzAsMHgzNSwweGEyIH0sIAorICAgIHsgMHhiYywweDM3LDB4NzQsMHg0ZSB9LCB7IDB4Y2EsMHhhNiwweGZjLDB4ODIgfSwKKyAgICB7IDB4ZDAsMHhiMCwweGUwLDB4OTAgfSwgeyAweGQ4LDB4MTUsMHgzMywweGE3IH0sIAorICAgIHsgMHg5OCwweDRhLDB4ZjEsMHgwNCB9LCB7IDB4ZGEsMHhmNywweDQxLDB4ZWMgfSwKKyAgICB7IDB4NTAsMHgwZSwweDdmLDB4Y2QgfSwgeyAweGY2LDB4MmYsMHgxNywweDkxIH0sIAorICAgIHsgMHhkNiwweDhkLDB4NzYsMHg0ZCB9LCB7IDB4YjAsMHg0ZCwweDQzLDB4ZWYgfSwgCisgICAgeyAweDRkLDB4NTQsMHhjYywweGFhIH0sIHsgMHgwNCwweGRmLDB4ZTQsMHg5NiB9LCAKKyAgICB7IDB4YjUsMHhlMywweDllLDB4ZDEgfSwgeyAweDg4LDB4MWIsMHg0YywweDZhIH0sCisgICAgeyAweDFmLDB4YjgsMHhjMSwweDJjIH0sIHsgMHg1MSwweDdmLDB4NDYsMHg2NSB9LCAKKyAgICB7IDB4ZWEsMHgwNCwweDlkLDB4NWUgfSwgeyAweDM1LDB4NWQsMHgwMSwweDhjIH0sCisgICAgeyAweDc0LDB4NzMsMHhmYSwweDg3IH0sIHsgMHg0MSwweDJlLDB4ZmIsMHgwYiB9LCAKKyAgICB7IDB4MWQsMHg1YSwweGIzLDB4NjcgfSwgeyAweGQyLDB4NTIsMHg5MiwweGRiIH0sCisgICAgeyAweDU2LDB4MzMsMHhlOSwweDEwIH0sIHsgMHg0NywweDEzLDB4NmQsMHhkNiB9LCAKKyAgICB7IDB4NjEsMHg4YywweDlhLDB4ZDcgfSwgeyAweDBjLDB4N2EsMHgzNywweGExIH0sCisgICAgeyAweDE0LDB4OGUsMHg1OSwweGY4IH0sIHsgMHgzYywweDg5LDB4ZWIsMHgxMyB9LCAKKyAgICB7IDB4MjcsMHhlZSwweGNlLDB4YTkgfSwgeyAweGM5LDB4MzUsMHhiNywweDYxIH0sCisgICAgeyAweGU1LDB4ZWQsMHhlMSwweDFjIH0sIHsgMHhiMSwweDNjLDB4N2EsMHg0NyB9LCAKKyAgICB7IDB4ZGYsMHg1OSwweDljLDB4ZDIgfSwgeyAweDczLDB4M2YsMHg1NSwweGYyIH0sCisgICAgeyAweGNlLDB4NzksMHgxOCwweDE0IH0sIHsgMHgzNywweGJmLDB4NzMsMHhjNyB9LCAKKyAgICB7IDB4Y2QsMHhlYSwweDUzLDB4ZjcgfSwgeyAweGFhLDB4NWIsMHg1ZiwweGZkIH0sCisgICAgeyAweDZmLDB4MTQsMHhkZiwweDNkIH0sIHsgMHhkYiwweDg2LDB4NzgsMHg0NCB9LCAKKyAgICB7IDB4ZjMsMHg4MSwweGNhLDB4YWYgfSwgeyAweGM0LDB4M2UsMHhiOSwweDY4IH0sCisgICAgeyAweDM0LDB4MmMsMHgzOCwweDI0IH0sIHsgMHg0MCwweDVmLDB4YzIsMHhhMyB9LCAKKyAgICB7IDB4YzMsMHg3MiwweDE2LDB4MWQgfSwgeyAweDI1LDB4MGMsMHhiYywweGUyIH0sCisgICAgeyAweDQ5LDB4OGIsMHgyOCwweDNjIH0sIHsgMHg5NSwweDQxLDB4ZmYsMHgwZCB9LCAKKyAgICB7IDB4MDEsMHg3MSwweDM5LDB4YTggfSwgeyAweGIzLDB4ZGUsMHgwOCwweDBjIH0sCisgICAgeyAweGU0LDB4OWMsMHhkOCwweGI0IH0sIHsgMHhjMSwweDkwLDB4NjQsMHg1NiB9LCAKKyAgICB7IDB4ODQsMHg2MSwweDdiLDB4Y2IgfSwgeyAweGI2LDB4NzAsMHhkNSwweDMyIH0sCisgICAgeyAweDVjLDB4NzQsMHg0OCwweDZjIH0sIHsgMHg1NywweDQyLDB4ZDAsMHhiOCB9CisgIH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFQ4WzI1Nl1bNF0gPSAKKyAgeworICAgIHsgMHhmNCwweGE3LDB4NTAsMHg1MSB9LCB7IDB4NDEsMHg2NSwweDUzLDB4N2UgfSwKKyAgICB7IDB4MTcsMHhhNCwweGMzLDB4MWEgfSwgeyAweDI3LDB4NWUsMHg5NiwweDNhIH0sIAorICAgIHsgMHhhYiwweDZiLDB4Y2IsMHgzYiB9LCB7IDB4OWQsMHg0NSwweGYxLDB4MWYgfSwKKyAgICB7IDB4ZmEsMHg1OCwweGFiLDB4YWMgfSwgeyAweGUzLDB4MDMsMHg5MywweDRiIH0sIAorICAgIHsgMHgzMCwweGZhLDB4NTUsMHgyMCB9LCB7IDB4NzYsMHg2ZCwweGY2LDB4YWQgfSwKKyAgICB7IDB4Y2MsMHg3NiwweDkxLDB4ODggfSwgeyAweDAyLDB4NGMsMHgyNSwweGY1IH0sIAorICAgIHsgMHhlNSwweGQ3LDB4ZmMsMHg0ZiB9LCB7IDB4MmEsMHhjYiwweGQ3LDB4YzUgfSwKKyAgICB7IDB4MzUsMHg0NCwweDgwLDB4MjYgfSwgeyAweDYyLDB4YTMsMHg4ZiwweGI1IH0sIAorICAgIHsgMHhiMSwweDVhLDB4NDksMHhkZSB9LCB7IDB4YmEsMHgxYiwweDY3LDB4MjUgfSwKKyAgICB7IDB4ZWEsMHgwZSwweDk4LDB4NDUgfSwgeyAweGZlLDB4YzAsMHhlMSwweDVkIH0sIAorICAgIHsgMHgyZiwweDc1LDB4MDIsMHhjMyB9LCB7IDB4NGMsMHhmMCwweDEyLDB4ODEgfSwKKyAgICB7IDB4NDYsMHg5NywweGEzLDB4OGQgfSwgeyAweGQzLDB4ZjksMHhjNiwweDZiIH0sIAorICAgIHsgMHg4ZiwweDVmLDB4ZTcsMHgwMyB9LCB7IDB4OTIsMHg5YywweDk1LDB4MTUgfSwKKyAgICB7IDB4NmQsMHg3YSwweGViLDB4YmYgfSwgeyAweDUyLDB4NTksMHhkYSwweDk1IH0sIAorICAgIHsgMHhiZSwweDgzLDB4MmQsMHhkNCB9LCB7IDB4NzQsMHgyMSwweGQzLDB4NTggfSwKKyAgICB7IDB4ZTAsMHg2OSwweDI5LDB4NDkgfSwgeyAweGM5LDB4YzgsMHg0NCwweDhlIH0sIAorICAgIHsgMHhjMiwweDg5LDB4NmEsMHg3NSB9LCB7IDB4OGUsMHg3OSwweDc4LDB4ZjQgfSwKKyAgICB7IDB4NTgsMHgzZSwweDZiLDB4OTkgfSwgeyAweGI5LDB4NzEsMHhkZCwweDI3IH0sIAorICAgIHsgMHhlMSwweDRmLDB4YjYsMHhiZSB9LCB7IDB4ODgsMHhhZCwweDE3LDB4ZjAgfSwKKyAgICB7IDB4MjAsMHhhYywweDY2LDB4YzkgfSwgeyAweGNlLDB4M2EsMHhiNCwweDdkIH0sIAorICAgIHsgMHhkZiwweDRhLDB4MTgsMHg2MyB9LCB7IDB4MWEsMHgzMSwweDgyLDB4ZTUgfSwKKyAgICB7IDB4NTEsMHgzMywweDYwLDB4OTcgfSwgeyAweDUzLDB4N2YsMHg0NSwweDYyIH0sIAorICAgIHsgMHg2NCwweDc3LDB4ZTAsMHhiMSB9LCB7IDB4NmIsMHhhZSwweDg0LDB4YmIgfSwKKyAgICB7IDB4ODEsMHhhMCwweDFjLDB4ZmUgfSwgeyAweDA4LDB4MmIsMHg5NCwweGY5IH0sIAorICAgIHsgMHg0OCwweDY4LDB4NTgsMHg3MCB9LCB7IDB4NDUsMHhmZCwweDE5LDB4OGYgfSwKKyAgICB7IDB4ZGUsMHg2YywweDg3LDB4OTQgfSwgeyAweDdiLDB4ZjgsMHhiNywweDUyIH0sIAorICAgIHsgMHg3MywweGQzLDB4MjMsMHhhYiB9LCB7IDB4NGIsMHgwMiwweGUyLDB4NzIgfSwKKyAgICB7IDB4MWYsMHg4ZiwweDU3LDB4ZTMgfSwgeyAweDU1LDB4YWIsMHgyYSwweDY2IH0sIAorICAgIHsgMHhlYiwweDI4LDB4MDcsMHhiMiB9LCB7IDB4YjUsMHhjMiwweDAzLDB4MmYgfSwKKyAgICB7IDB4YzUsMHg3YiwweDlhLDB4ODYgfSwgeyAweDM3LDB4MDgsMHhhNSwweGQzIH0sIAorICAgIHsgMHgyOCwweDg3LDB4ZjIsMHgzMCB9LCB7IDB4YmYsMHhhNSwweGIyLDB4MjMgfSwKKyAgICB7IDB4MDMsMHg2YSwweGJhLDB4MDIgfSwgeyAweDE2LDB4ODIsMHg1YywweGVkIH0sIAorICAgIHsgMHhjZiwweDFjLDB4MmIsMHg4YSB9LCB7IDB4NzksMHhiNCwweDkyLDB4YTcgfSwKKyAgICB7IDB4MDcsMHhmMiwweGYwLDB4ZjMgfSwgeyAweDY5LDB4ZTIsMHhhMSwweDRlIH0sIAorICAgIHsgMHhkYSwweGY0LDB4Y2QsMHg2NSB9LCB7IDB4MDUsMHhiZSwweGQ1LDB4MDYgfSwKKyAgICB7IDB4MzQsMHg2MiwweDFmLDB4ZDEgfSwgeyAweGE2LDB4ZmUsMHg4YSwweGM0IH0sIAorICAgIHsgMHgyZSwweDUzLDB4OWQsMHgzNCB9LCB7IDB4ZjMsMHg1NSwweGEwLDB4YTIgfSwKKyAgICB7IDB4OGEsMHhlMSwweDMyLDB4MDUgfSwgeyAweGY2LDB4ZWIsMHg3NSwweGE0IH0sIAorICAgIHsgMHg4MywweGVjLDB4MzksMHgwYiB9LCB7IDB4NjAsMHhlZiwweGFhLDB4NDAgfSwKKyAgICB7IDB4NzEsMHg5ZiwweDA2LDB4NWUgfSwgeyAweDZlLDB4MTAsMHg1MSwweGJkIH0sIAorICAgIHsgMHgyMSwweDhhLDB4ZjksMHgzZSB9LCB7IDB4ZGQsMHgwNiwweDNkLDB4OTYgfSwKKyAgICB7IDB4M2UsMHgwNSwweGFlLDB4ZGQgfSwgeyAweGU2LDB4YmQsMHg0NiwweDRkIH0sIAorICAgIHsgMHg1NCwweDhkLDB4YjUsMHg5MSB9LCB7IDB4YzQsMHg1ZCwweDA1LDB4NzEgfSwKKyAgICB7IDB4MDYsMHhkNCwweDZmLDB4MDQgfSwgeyAweDUwLDB4MTUsMHhmZiwweDYwIH0sIAorICAgIHsgMHg5OCwweGZiLDB4MjQsMHgxOSB9LCB7IDB4YmQsMHhlOSwweDk3LDB4ZDYgfSwKKyAgICB7IDB4NDAsMHg0MywweGNjLDB4ODkgfSwgeyAweGQ5LDB4OWUsMHg3NywweDY3IH0sIAorICAgIHsgMHhlOCwweDQyLDB4YmQsMHhiMCB9LCB7IDB4ODksMHg4YiwweDg4LDB4MDcgfSwKKyAgICB7IDB4MTksMHg1YiwweDM4LDB4ZTcgfSwgeyAweGM4LDB4ZWUsMHhkYiwweDc5IH0sIAorICAgIHsgMHg3YywweDBhLDB4NDcsMHhhMSB9LCB7IDB4NDIsMHgwZiwweGU5LDB4N2MgfSwKKyAgICB7IDB4ODQsMHgxZSwweGM5LDB4ZjggfSwgeyAweDAwLDB4MDAsMHgwMCwweDAwIH0sIAorICAgIHsgMHg4MCwweDg2LDB4ODMsMHgwOSB9LCB7IDB4MmIsMHhlZCwweDQ4LDB4MzIgfSwKKyAgICB7IDB4MTEsMHg3MCwweGFjLDB4MWUgfSwgeyAweDVhLDB4NzIsMHg0ZSwweDZjIH0sIAorICAgIHsgMHgwZSwweGZmLDB4ZmIsMHhmZCB9LCB7IDB4ODUsMHgzOCwweDU2LDB4MGYgfSwgCisgICAgeyAweGFlLDB4ZDUsMHgxZSwweDNkIH0sIHsgMHgyZCwweDM5LDB4MjcsMHgzNiB9LCAKKyAgICB7IDB4MGYsMHhkOSwweDY0LDB4MGEgfSwgeyAweDVjLDB4YTYsMHgyMSwweDY4IH0sCisgICAgeyAweDViLDB4NTQsMHhkMSwweDliIH0sIHsgMHgzNiwweDJlLDB4M2EsMHgyNCB9LCAKKyAgICB7IDB4MGEsMHg2NywweGIxLDB4MGMgfSwgeyAweDU3LDB4ZTcsMHgwZiwweDkzIH0sCisgICAgeyAweGVlLDB4OTYsMHhkMiwweGI0IH0sIHsgMHg5YiwweDkxLDB4OWUsMHgxYiB9LCAKKyAgICB7IDB4YzAsMHhjNSwweDRmLDB4ODAgfSwgeyAweGRjLDB4MjAsMHhhMiwweDYxIH0sCisgICAgeyAweDc3LDB4NGIsMHg2OSwweDVhIH0sIHsgMHgxMiwweDFhLDB4MTYsMHgxYyB9LCAKKyAgICB7IDB4OTMsMHhiYSwweDBhLDB4ZTIgfSwgeyAweGEwLDB4MmEsMHhlNSwweGMwIH0sCisgICAgeyAweDIyLDB4ZTAsMHg0MywweDNjIH0sIHsgMHgxYiwweDE3LDB4MWQsMHgxMiB9LCAKKyAgICB7IDB4MDksMHgwZCwweDBiLDB4MGUgfSwgeyAweDhiLDB4YzcsMHhhZCwweGYyIH0sCisgICAgeyAweGI2LDB4YTgsMHhiOSwweDJkIH0sIHsgMHgxZSwweGE5LDB4YzgsMHgxNCB9LCAKKyAgICB7IDB4ZjEsMHgxOSwweDg1LDB4NTcgfSwgeyAweDc1LDB4MDcsMHg0YywweGFmIH0sCisgICAgeyAweDk5LDB4ZGQsMHhiYiwweGVlIH0sIHsgMHg3ZiwweDYwLDB4ZmQsMHhhMyB9LCAKKyAgICB7IDB4MDEsMHgyNiwweDlmLDB4ZjcgfSwgeyAweDcyLDB4ZjUsMHhiYywweDVjIH0sCisgICAgeyAweDY2LDB4M2IsMHhjNSwweDQ0IH0sIHsgMHhmYiwweDdlLDB4MzQsMHg1YiB9LCAKKyAgICB7IDB4NDMsMHgyOSwweDc2LDB4OGIgfSwgeyAweDIzLDB4YzYsMHhkYywweGNiIH0sCisgICAgeyAweGVkLDB4ZmMsMHg2OCwweGI2IH0sIHsgMHhlNCwweGYxLDB4NjMsMHhiOCB9LCAKKyAgICB7IDB4MzEsMHhkYywweGNhLDB4ZDcgfSwgeyAweDYzLDB4ODUsMHgxMCwweDQyIH0sCisgICAgeyAweDk3LDB4MjIsMHg0MCwweDEzIH0sIHsgMHhjNiwweDExLDB4MjAsMHg4NCB9LCAKKyAgICB7IDB4NGEsMHgyNCwweDdkLDB4ODUgfSwgeyAweGJiLDB4M2QsMHhmOCwweGQyIH0sIAorICAgIHsgMHhmOSwweDMyLDB4MTEsMHhhZSB9LCB7IDB4MjksMHhhMSwweDZkLDB4YzcgfSwgCisgICAgeyAweDllLDB4MmYsMHg0YiwweDFkIH0sIHsgMHhiMiwweDMwLDB4ZjMsMHhkYyB9LAorICAgIHsgMHg4NiwweDUyLDB4ZWMsMHgwZCB9LCB7IDB4YzEsMHhlMywweGQwLDB4NzcgfSwgCisgICAgeyAweGIzLDB4MTYsMHg2YywweDJiIH0sIHsgMHg3MCwweGI5LDB4OTksMHhhOSB9LAorICAgIHsgMHg5NCwweDQ4LDB4ZmEsMHgxMSB9LCB7IDB4ZTksMHg2NCwweDIyLDB4NDcgfSwgCisgICAgeyAweGZjLDB4OGMsMHhjNCwweGE4IH0sIHsgMHhmMCwweDNmLDB4MWEsMHhhMCB9LAorICAgIHsgMHg3ZCwweDJjLDB4ZDgsMHg1NiB9LCB7IDB4MzMsMHg5MCwweGVmLDB4MjIgfSwgCisgICAgeyAweDQ5LDB4NGUsMHhjNywweDg3IH0sIHsgMHgzOCwweGQxLDB4YzEsMHhkOSB9LAorICAgIHsgMHhjYSwweGEyLDB4ZmUsMHg4YyB9LCB7IDB4ZDQsMHgwYiwweDM2LDB4OTggfSwgCisgICAgeyAweGY1LDB4ODEsMHhjZiwweGE2IH0sIHsgMHg3YSwweGRlLDB4MjgsMHhhNSB9LAorICAgIHsgMHhiNywweDhlLDB4MjYsMHhkYSB9LCB7IDB4YWQsMHhiZiwweGE0LDB4M2YgfSwgCisgICAgeyAweDNhLDB4OWQsMHhlNCwweDJjIH0sIHsgMHg3OCwweDkyLDB4MGQsMHg1MCB9LAorICAgIHsgMHg1ZiwweGNjLDB4OWIsMHg2YSB9LCB7IDB4N2UsMHg0NiwweDYyLDB4NTQgfSwgCisgICAgeyAweDhkLDB4MTMsMHhjMiwweGY2IH0sIHsgMHhkOCwweGI4LDB4ZTgsMHg5MCB9LAorICAgIHsgMHgzOSwweGY3LDB4NWUsMHgyZSB9LCB7IDB4YzMsMHhhZiwweGY1LDB4ODIgfSwgCisgICAgeyAweDVkLDB4ODAsMHhiZSwweDlmIH0sIHsgMHhkMCwweDkzLDB4N2MsMHg2OSB9LAorICAgIHsgMHhkNSwweDJkLDB4YTksMHg2ZiB9LCB7IDB4MjUsMHgxMiwweGIzLDB4Y2YgfSwgCisgICAgeyAweGFjLDB4OTksMHgzYiwweGM4IH0sIHsgMHgxOCwweDdkLDB4YTcsMHgxMCB9LAorICAgIHsgMHg5YywweDYzLDB4NmUsMHhlOCB9LCB7IDB4M2IsMHhiYiwweDdiLDB4ZGIgfSwgCisgICAgeyAweDI2LDB4NzgsMHgwOSwweGNkIH0sIHsgMHg1OSwweDE4LDB4ZjQsMHg2ZSB9LAorICAgIHsgMHg5YSwweGI3LDB4MDEsMHhlYyB9LCB7IDB4NGYsMHg5YSwweGE4LDB4ODMgfSwgCisgICAgeyAweDk1LDB4NmUsMHg2NSwweGU2IH0sIHsgMHhmZiwweGU2LDB4N2UsMHhhYSB9LAorICAgIHsgMHhiYywweGNmLDB4MDgsMHgyMSB9LCB7IDB4MTUsMHhlOCwweGU2LDB4ZWYgfSwgCisgICAgeyAweGU3LDB4OWIsMHhkOSwweGJhIH0sIHsgMHg2ZiwweDM2LDB4Y2UsMHg0YSB9LAorICAgIHsgMHg5ZiwweDA5LDB4ZDQsMHhlYSB9LCB7IDB4YjAsMHg3YywweGQ2LDB4MjkgfSwgCisgICAgeyAweGE0LDB4YjIsMHhhZiwweDMxIH0sIHsgMHgzZiwweDIzLDB4MzEsMHgyYSB9LAorICAgIHsgMHhhNSwweDk0LDB4MzAsMHhjNiB9LCB7IDB4YTIsMHg2NiwweGMwLDB4MzUgfSwgCisgICAgeyAweDRlLDB4YmMsMHgzNywweDc0IH0sIHsgMHg4MiwweGNhLDB4YTYsMHhmYyB9LAorICAgIHsgMHg5MCwweGQwLDB4YjAsMHhlMCB9LCB7IDB4YTcsMHhkOCwweDE1LDB4MzMgfSwgCisgICAgeyAweDA0LDB4OTgsMHg0YSwweGYxIH0sIHsgMHhlYywweGRhLDB4ZjcsMHg0MSB9LAorICAgIHsgMHhjZCwweDUwLDB4MGUsMHg3ZiB9LCB7IDB4OTEsMHhmNiwweDJmLDB4MTcgfSwgCisgICAgeyAweDRkLDB4ZDYsMHg4ZCwweDc2IH0sIHsgMHhlZiwweGIwLDB4NGQsMHg0MyB9LCAKKyAgICB7IDB4YWEsMHg0ZCwweDU0LDB4Y2MgfSwgeyAweDk2LDB4MDQsMHhkZiwweGU0IH0sIAorICAgIHsgMHhkMSwweGI1LDB4ZTMsMHg5ZSB9LCB7IDB4NmEsMHg4OCwweDFiLDB4NGMgfSwKKyAgICB7IDB4MmMsMHgxZiwweGI4LDB4YzEgfSwgeyAweDY1LDB4NTEsMHg3ZiwweDQ2IH0sIAorICAgIHsgMHg1ZSwweGVhLDB4MDQsMHg5ZCB9LCB7IDB4OGMsMHgzNSwweDVkLDB4MDEgfSwKKyAgICB7IDB4ODcsMHg3NCwweDczLDB4ZmEgfSwgeyAweDBiLDB4NDEsMHgyZSwweGZiIH0sIAorICAgIHsgMHg2NywweDFkLDB4NWEsMHhiMyB9LCB7IDB4ZGIsMHhkMiwweDUyLDB4OTIgfSwKKyAgICB7IDB4MTAsMHg1NiwweDMzLDB4ZTkgfSwgeyAweGQ2LDB4NDcsMHgxMywweDZkIH0sIAorICAgIHsgMHhkNywweDYxLDB4OGMsMHg5YSB9LCB7IDB4YTEsMHgwYywweDdhLDB4MzcgfSwKKyAgICB7IDB4ZjgsMHgxNCwweDhlLDB4NTkgfSwgeyAweDEzLDB4M2MsMHg4OSwweGViIH0sIAorICAgIHsgMHhhOSwweDI3LDB4ZWUsMHhjZSB9LCB7IDB4NjEsMHhjOSwweDM1LDB4YjcgfSwKKyAgICB7IDB4MWMsMHhlNSwweGVkLDB4ZTEgfSwgeyAweDQ3LDB4YjEsMHgzYywweDdhIH0sIAorICAgIHsgMHhkMiwweGRmLDB4NTksMHg5YyB9LCB7IDB4ZjIsMHg3MywweDNmLDB4NTUgfSwKKyAgICB7IDB4MTQsMHhjZSwweDc5LDB4MTggfSwgeyAweGM3LDB4MzcsMHhiZiwweDczIH0sIAorICAgIHsgMHhmNywweGNkLDB4ZWEsMHg1MyB9LCB7IDB4ZmQsMHhhYSwweDViLDB4NWYgfSwKKyAgICB7IDB4M2QsMHg2ZiwweDE0LDB4ZGYgfSwgeyAweDQ0LDB4ZGIsMHg4NiwweDc4IH0sIAorICAgIHsgMHhhZiwweGYzLDB4ODEsMHhjYSB9LCB7IDB4NjgsMHhjNCwweDNlLDB4YjkgfSwKKyAgICB7IDB4MjQsMHgzNCwweDJjLDB4MzggfSwgeyAweGEzLDB4NDAsMHg1ZiwweGMyIH0sIAorICAgIHsgMHgxZCwweGMzLDB4NzIsMHgxNiB9LCB7IDB4ZTIsMHgyNSwweDBjLDB4YmMgfSwKKyAgICB7IDB4M2MsMHg0OSwweDhiLDB4MjggfSwgeyAweDBkLDB4OTUsMHg0MSwweGZmIH0sIAorICAgIHsgMHhhOCwweDAxLDB4NzEsMHgzOSB9LCB7IDB4MGMsMHhiMywweGRlLDB4MDggfSwKKyAgICB7IDB4YjQsMHhlNCwweDljLDB4ZDggfSwgeyAweDU2LDB4YzEsMHg5MCwweDY0IH0sIAorICAgIHsgMHhjYiwweDg0LDB4NjEsMHg3YiB9LCB7IDB4MzIsMHhiNiwweDcwLDB4ZDUgfSwKKyAgICB7IDB4NmMsMHg1YywweDc0LDB4NDggfSwgeyAweGI4LDB4NTcsMHg0MiwweGQwIH0KKyAgfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgUzVbMjU2XSA9IAorICB7CisgICAgMHg1MiwweDA5LDB4NmEsMHhkNSwweDMwLDB4MzYsMHhhNSwweDM4LAorICAgIDB4YmYsMHg0MCwweGEzLDB4OWUsMHg4MSwweGYzLDB4ZDcsMHhmYiwKKyAgICAweDdjLDB4ZTMsMHgzOSwweDgyLDB4OWIsMHgyZiwweGZmLDB4ODcsCisgICAgMHgzNCwweDhlLDB4NDMsMHg0NCwweGM0LDB4ZGUsMHhlOSwweGNiLAorICAgIDB4NTQsMHg3YiwweDk0LDB4MzIsMHhhNiwweGMyLDB4MjMsMHgzZCwKKyAgICAweGVlLDB4NGMsMHg5NSwweDBiLDB4NDIsMHhmYSwweGMzLDB4NGUsCisgICAgMHgwOCwweDJlLDB4YTEsMHg2NiwweDI4LDB4ZDksMHgyNCwweGIyLAorICAgIDB4NzYsMHg1YiwweGEyLDB4NDksMHg2ZCwweDhiLDB4ZDEsMHgyNSwKKyAgICAweDcyLDB4ZjgsMHhmNiwweDY0LDB4ODYsMHg2OCwweDk4LDB4MTYsCisgICAgMHhkNCwweGE0LDB4NWMsMHhjYywweDVkLDB4NjUsMHhiNiwweDkyLAorICAgIDB4NmMsMHg3MCwweDQ4LDB4NTAsMHhmZCwweGVkLDB4YjksMHhkYSwKKyAgICAweDVlLDB4MTUsMHg0NiwweDU3LDB4YTcsMHg4ZCwweDlkLDB4ODQsCisgICAgMHg5MCwweGQ4LDB4YWIsMHgwMCwweDhjLDB4YmMsMHhkMywweDBhLAorICAgIDB4ZjcsMHhlNCwweDU4LDB4MDUsMHhiOCwweGIzLDB4NDUsMHgwNiwKKyAgICAweGQwLDB4MmMsMHgxZSwweDhmLDB4Y2EsMHgzZiwweDBmLDB4MDIsCisgICAgMHhjMSwweGFmLDB4YmQsMHgwMywweDAxLDB4MTMsMHg4YSwweDZiLAorICAgIDB4M2EsMHg5MSwweDExLDB4NDEsMHg0ZiwweDY3LDB4ZGMsMHhlYSwKKyAgICAweDk3LDB4ZjIsMHhjZiwweGNlLDB4ZjAsMHhiNCwweGU2LDB4NzMsCisgICAgMHg5NiwweGFjLDB4NzQsMHgyMiwweGU3LDB4YWQsMHgzNSwweDg1LAorICAgIDB4ZTIsMHhmOSwweDM3LDB4ZTgsMHgxYywweDc1LDB4ZGYsMHg2ZSwKKyAgICAweDQ3LDB4ZjEsMHgxYSwweDcxLDB4MWQsMHgyOSwweGM1LDB4ODksCisgICAgMHg2ZiwweGI3LDB4NjIsMHgwZSwweGFhLDB4MTgsMHhiZSwweDFiLAorICAgIDB4ZmMsMHg1NiwweDNlLDB4NGIsMHhjNiwweGQyLDB4NzksMHgyMCwKKyAgICAweDlhLDB4ZGIsMHhjMCwweGZlLDB4NzgsMHhjZCwweDVhLDB4ZjQsCisgICAgMHgxZiwweGRkLDB4YTgsMHgzMywweDg4LDB4MDcsMHhjNywweDMxLAorICAgIDB4YjEsMHgxMiwweDEwLDB4NTksMHgyNywweDgwLDB4ZWMsMHg1ZiwKKyAgICAweDYwLDB4NTEsMHg3ZiwweGE5LDB4MTksMHhiNSwweDRhLDB4MGQsCisgICAgMHgyZCwweGU1LDB4N2EsMHg5ZiwweDkzLDB4YzksMHg5YywweGVmLAorICAgIDB4YTAsMHhlMCwweDNiLDB4NGQsMHhhZSwweDJhLDB4ZjUsMHhiMCwKKyAgICAweGM4LDB4ZWIsMHhiYiwweDNjLDB4ODMsMHg1MywweDk5LDB4NjEsCisgICAgMHgxNywweDJiLDB4MDQsMHg3ZSwweGJhLDB4NzcsMHhkNiwweDI2LAorICAgIDB4ZTEsMHg2OSwweDE0LDB4NjMsMHg1NSwweDIxLDB4MGMsMHg3ZAorICB9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBVMVsyNTZdWzRdID0gCisgIHsKKyAgICB7IDB4MDAsMHgwMCwweDAwLDB4MDAgfSwgeyAweDBlLDB4MDksMHgwZCwweDBiIH0sCisgICAgeyAweDFjLDB4MTIsMHgxYSwweDE2IH0sIHsgMHgxMiwweDFiLDB4MTcsMHgxZCB9LCAKKyAgICB7IDB4MzgsMHgyNCwweDM0LDB4MmMgfSwgeyAweDM2LDB4MmQsMHgzOSwweDI3IH0sCisgICAgeyAweDI0LDB4MzYsMHgyZSwweDNhIH0sIHsgMHgyYSwweDNmLDB4MjMsMHgzMSB9LCAKKyAgICB7IDB4NzAsMHg0OCwweDY4LDB4NTggfSwgeyAweDdlLDB4NDEsMHg2NSwweDUzIH0sCisgICAgeyAweDZjLDB4NWEsMHg3MiwweDRlIH0sIHsgMHg2MiwweDUzLDB4N2YsMHg0NSB9LCAKKyAgICB7IDB4NDgsMHg2YywweDVjLDB4NzQgfSwgeyAweDQ2LDB4NjUsMHg1MSwweDdmIH0sCisgICAgeyAweDU0LDB4N2UsMHg0NiwweDYyIH0sIHsgMHg1YSwweDc3LDB4NGIsMHg2OSB9LCAKKyAgICB7IDB4ZTAsMHg5MCwweGQwLDB4YjAgfSwgeyAweGVlLDB4OTksMHhkZCwweGJiIH0sCisgICAgeyAweGZjLDB4ODIsMHhjYSwweGE2IH0sIHsgMHhmMiwweDhiLDB4YzcsMHhhZCB9LCAKKyAgICB7IDB4ZDgsMHhiNCwweGU0LDB4OWMgfSwgeyAweGQ2LDB4YmQsMHhlOSwweDk3IH0sCisgICAgeyAweGM0LDB4YTYsMHhmZSwweDhhIH0sIHsgMHhjYSwweGFmLDB4ZjMsMHg4MSB9LCAKKyAgICB7IDB4OTAsMHhkOCwweGI4LDB4ZTggfSwgeyAweDllLDB4ZDEsMHhiNSwweGUzIH0sCisgICAgeyAweDhjLDB4Y2EsMHhhMiwweGZlIH0sIHsgMHg4MiwweGMzLDB4YWYsMHhmNSB9LCAKKyAgICB7IDB4YTgsMHhmYywweDhjLDB4YzQgfSwgeyAweGE2LDB4ZjUsMHg4MSwweGNmIH0sCisgICAgeyAweGI0LDB4ZWUsMHg5NiwweGQyIH0sIHsgMHhiYSwweGU3LDB4OWIsMHhkOSB9LCAKKyAgICB7IDB4ZGIsMHgzYiwweGJiLDB4N2IgfSwgeyAweGQ1LDB4MzIsMHhiNiwweDcwIH0sCisgICAgeyAweGM3LDB4MjksMHhhMSwweDZkIH0sIHsgMHhjOSwweDIwLDB4YWMsMHg2NiB9LCAKKyAgICB7IDB4ZTMsMHgxZiwweDhmLDB4NTcgfSwgeyAweGVkLDB4MTYsMHg4MiwweDVjIH0sCisgICAgeyAweGZmLDB4MGQsMHg5NSwweDQxIH0sIHsgMHhmMSwweDA0LDB4OTgsMHg0YSB9LCAKKyAgICB7IDB4YWIsMHg3MywweGQzLDB4MjMgfSwgeyAweGE1LDB4N2EsMHhkZSwweDI4IH0sCisgICAgeyAweGI3LDB4NjEsMHhjOSwweDM1IH0sIHsgMHhiOSwweDY4LDB4YzQsMHgzZSB9LCAKKyAgICB7IDB4OTMsMHg1NywweGU3LDB4MGYgfSwgeyAweDlkLDB4NWUsMHhlYSwweDA0IH0sCisgICAgeyAweDhmLDB4NDUsMHhmZCwweDE5IH0sIHsgMHg4MSwweDRjLDB4ZjAsMHgxMiB9LCAKKyAgICB7IDB4M2IsMHhhYiwweDZiLDB4Y2IgfSwgeyAweDM1LDB4YTIsMHg2NiwweGMwIH0sCisgICAgeyAweDI3LDB4YjksMHg3MSwweGRkIH0sIHsgMHgyOSwweGIwLDB4N2MsMHhkNiB9LCAKKyAgICB7IDB4MDMsMHg4ZiwweDVmLDB4ZTcgfSwgeyAweDBkLDB4ODYsMHg1MiwweGVjIH0sCisgICAgeyAweDFmLDB4OWQsMHg0NSwweGYxIH0sIHsgMHgxMSwweDk0LDB4NDgsMHhmYSB9LCAKKyAgICB7IDB4NGIsMHhlMywweDAzLDB4OTMgfSwgeyAweDQ1LDB4ZWEsMHgwZSwweDk4IH0sCisgICAgeyAweDU3LDB4ZjEsMHgxOSwweDg1IH0sIHsgMHg1OSwweGY4LDB4MTQsMHg4ZSB9LCAKKyAgICB7IDB4NzMsMHhjNywweDM3LDB4YmYgfSwgeyAweDdkLDB4Y2UsMHgzYSwweGI0IH0sCisgICAgeyAweDZmLDB4ZDUsMHgyZCwweGE5IH0sIHsgMHg2MSwweGRjLDB4MjAsMHhhMiB9LCAKKyAgICB7IDB4YWQsMHg3NiwweDZkLDB4ZjYgfSwgeyAweGEzLDB4N2YsMHg2MCwweGZkIH0sCisgICAgeyAweGIxLDB4NjQsMHg3NywweGUwIH0sIHsgMHhiZiwweDZkLDB4N2EsMHhlYiB9LCAKKyAgICB7IDB4OTUsMHg1MiwweDU5LDB4ZGEgfSwgeyAweDliLDB4NWIsMHg1NCwweGQxIH0sCisgICAgeyAweDg5LDB4NDAsMHg0MywweGNjIH0sIHsgMHg4NywweDQ5LDB4NGUsMHhjNyB9LCAKKyAgICB7IDB4ZGQsMHgzZSwweDA1LDB4YWUgfSwgeyAweGQzLDB4MzcsMHgwOCwweGE1IH0sCisgICAgeyAweGMxLDB4MmMsMHgxZiwweGI4IH0sIHsgMHhjZiwweDI1LDB4MTIsMHhiMyB9LCAKKyAgICB7IDB4ZTUsMHgxYSwweDMxLDB4ODIgfSwgeyAweGViLDB4MTMsMHgzYywweDg5IH0sCisgICAgeyAweGY5LDB4MDgsMHgyYiwweDk0IH0sIHsgMHhmNywweDAxLDB4MjYsMHg5ZiB9LCAKKyAgICB7IDB4NGQsMHhlNiwweGJkLDB4NDYgfSwgeyAweDQzLDB4ZWYsMHhiMCwweDRkIH0sCisgICAgeyAweDUxLDB4ZjQsMHhhNywweDUwIH0sIHsgMHg1ZiwweGZkLDB4YWEsMHg1YiB9LCAKKyAgICB7IDB4NzUsMHhjMiwweDg5LDB4NmEgfSwgeyAweDdiLDB4Y2IsMHg4NCwweDYxIH0sCisgICAgeyAweDY5LDB4ZDAsMHg5MywweDdjIH0sIHsgMHg2NywweGQ5LDB4OWUsMHg3NyB9LCAKKyAgICB7IDB4M2QsMHhhZSwweGQ1LDB4MWUgfSwgeyAweDMzLDB4YTcsMHhkOCwweDE1IH0sCisgICAgeyAweDIxLDB4YmMsMHhjZiwweDA4IH0sIHsgMHgyZiwweGI1LDB4YzIsMHgwMyB9LCAKKyAgICB7IDB4MDUsMHg4YSwweGUxLDB4MzIgfSwgeyAweDBiLDB4ODMsMHhlYywweDM5IH0sCisgICAgeyAweDE5LDB4OTgsMHhmYiwweDI0IH0sIHsgMHgxNywweDkxLDB4ZjYsMHgyZiB9LCAKKyAgICB7IDB4NzYsMHg0ZCwweGQ2LDB4OGQgfSwgeyAweDc4LDB4NDQsMHhkYiwweDg2IH0sCisgICAgeyAweDZhLDB4NWYsMHhjYywweDliIH0sIHsgMHg2NCwweDU2LDB4YzEsMHg5MCB9LCAKKyAgICB7IDB4NGUsMHg2OSwweGUyLDB4YTEgfSwgeyAweDQwLDB4NjAsMHhlZiwweGFhIH0sCisgICAgeyAweDUyLDB4N2IsMHhmOCwweGI3IH0sIHsgMHg1YywweDcyLDB4ZjUsMHhiYyB9LCAKKyAgICB7IDB4MDYsMHgwNSwweGJlLDB4ZDUgfSwgeyAweDA4LDB4MGMsMHhiMywweGRlIH0sCisgICAgeyAweDFhLDB4MTcsMHhhNCwweGMzIH0sIHsgMHgxNCwweDFlLDB4YTksMHhjOCB9LCAKKyAgICB7IDB4M2UsMHgyMSwweDhhLDB4ZjkgfSwgeyAweDMwLDB4MjgsMHg4NywweGYyIH0sCisgICAgeyAweDIyLDB4MzMsMHg5MCwweGVmIH0sIHsgMHgyYywweDNhLDB4OWQsMHhlNCB9LCAKKyAgICB7IDB4OTYsMHhkZCwweDA2LDB4M2QgfSwgeyAweDk4LDB4ZDQsMHgwYiwweDM2IH0sCisgICAgeyAweDhhLDB4Y2YsMHgxYywweDJiIH0sIHsgMHg4NCwweGM2LDB4MTEsMHgyMCB9LCAKKyAgICB7IDB4YWUsMHhmOSwweDMyLDB4MTEgfSwgeyAweGEwLDB4ZjAsMHgzZiwweDFhIH0sCisgICAgeyAweGIyLDB4ZWIsMHgyOCwweDA3IH0sIHsgMHhiYywweGUyLDB4MjUsMHgwYyB9LCAKKyAgICB7IDB4ZTYsMHg5NSwweDZlLDB4NjUgfSwgeyAweGU4LDB4OWMsMHg2MywweDZlIH0sCisgICAgeyAweGZhLDB4ODcsMHg3NCwweDczIH0sIHsgMHhmNCwweDhlLDB4NzksMHg3OCB9LCAKKyAgICB7IDB4ZGUsMHhiMSwweDVhLDB4NDkgfSwgeyAweGQwLDB4YjgsMHg1NywweDQyIH0sCisgICAgeyAweGMyLDB4YTMsMHg0MCwweDVmIH0sIHsgMHhjYywweGFhLDB4NGQsMHg1NCB9LCAKKyAgICB7IDB4NDEsMHhlYywweGRhLDB4ZjcgfSwgeyAweDRmLDB4ZTUsMHhkNywweGZjIH0sCisgICAgeyAweDVkLDB4ZmUsMHhjMCwweGUxIH0sIHsgMHg1MywweGY3LDB4Y2QsMHhlYSB9LCAKKyAgICB7IDB4NzksMHhjOCwweGVlLDB4ZGIgfSwgeyAweDc3LDB4YzEsMHhlMywweGQwIH0sCisgICAgeyAweDY1LDB4ZGEsMHhmNCwweGNkIH0sIHsgMHg2YiwweGQzLDB4ZjksMHhjNiB9LCAKKyAgICB7IDB4MzEsMHhhNCwweGIyLDB4YWYgfSwgeyAweDNmLDB4YWQsMHhiZiwweGE0IH0sCisgICAgeyAweDJkLDB4YjYsMHhhOCwweGI5IH0sIHsgMHgyMywweGJmLDB4YTUsMHhiMiB9LCAKKyAgICB7IDB4MDksMHg4MCwweDg2LDB4ODMgfSwgeyAweDA3LDB4ODksMHg4YiwweDg4IH0sCisgICAgeyAweDE1LDB4OTIsMHg5YywweDk1IH0sIHsgMHgxYiwweDliLDB4OTEsMHg5ZSB9LCAKKyAgICB7IDB4YTEsMHg3YywweDBhLDB4NDcgfSwgeyAweGFmLDB4NzUsMHgwNywweDRjIH0sCisgICAgeyAweGJkLDB4NmUsMHgxMCwweDUxIH0sIHsgMHhiMywweDY3LDB4MWQsMHg1YSB9LCAKKyAgICB7IDB4OTksMHg1OCwweDNlLDB4NmIgfSwgeyAweDk3LDB4NTEsMHgzMywweDYwIH0sCisgICAgeyAweDg1LDB4NGEsMHgyNCwweDdkIH0sIHsgMHg4YiwweDQzLDB4MjksMHg3NiB9LCAKKyAgICB7IDB4ZDEsMHgzNCwweDYyLDB4MWYgfSwgeyAweGRmLDB4M2QsMHg2ZiwweDE0IH0sCisgICAgeyAweGNkLDB4MjYsMHg3OCwweDA5IH0sIHsgMHhjMywweDJmLDB4NzUsMHgwMiB9LCAKKyAgICB7IDB4ZTksMHgxMCwweDU2LDB4MzMgfSwgeyAweGU3LDB4MTksMHg1YiwweDM4IH0sCisgICAgeyAweGY1LDB4MDIsMHg0YywweDI1IH0sIHsgMHhmYiwweDBiLDB4NDEsMHgyZSB9LCAKKyAgICB7IDB4OWEsMHhkNywweDYxLDB4OGMgfSwgeyAweDk0LDB4ZGUsMHg2YywweDg3IH0sIAorICAgIHsgMHg4NiwweGM1LDB4N2IsMHg5YSB9LCB7IDB4ODgsMHhjYywweDc2LDB4OTEgfSwgCisgICAgeyAweGEyLDB4ZjMsMHg1NSwweGEwIH0sIHsgMHhhYywweGZhLDB4NTgsMHhhYiB9LAorICAgIHsgMHhiZSwweGUxLDB4NGYsMHhiNiB9LCB7IDB4YjAsMHhlOCwweDQyLDB4YmQgfSwgCisgICAgeyAweGVhLDB4OWYsMHgwOSwweGQ0IH0sIHsgMHhlNCwweDk2LDB4MDQsMHhkZiB9LAorICAgIHsgMHhmNiwweDhkLDB4MTMsMHhjMiB9LCB7IDB4ZjgsMHg4NCwweDFlLDB4YzkgfSwgCisgICAgeyAweGQyLDB4YmIsMHgzZCwweGY4IH0sIHsgMHhkYywweGIyLDB4MzAsMHhmMyB9LAorICAgIHsgMHhjZSwweGE5LDB4MjcsMHhlZSB9LCB7IDB4YzAsMHhhMCwweDJhLDB4ZTUgfSwgCisgICAgeyAweDdhLDB4NDcsMHhiMSwweDNjIH0sIHsgMHg3NCwweDRlLDB4YmMsMHgzNyB9LCAKKyAgICB7IDB4NjYsMHg1NSwweGFiLDB4MmEgfSwgeyAweDY4LDB4NWMsMHhhNiwweDIxIH0sIAorICAgIHsgMHg0MiwweDYzLDB4ODUsMHgxMCB9LCB7IDB4NGMsMHg2YSwweDg4LDB4MWIgfSwKKyAgICB7IDB4NWUsMHg3MSwweDlmLDB4MDYgfSwgeyAweDUwLDB4NzgsMHg5MiwweDBkIH0sIAorICAgIHsgMHgwYSwweDBmLDB4ZDksMHg2NCB9LCB7IDB4MDQsMHgwNiwweGQ0LDB4NmYgfSwKKyAgICB7IDB4MTYsMHgxZCwweGMzLDB4NzIgfSwgeyAweDE4LDB4MTQsMHhjZSwweDc5IH0sIAorICAgIHsgMHgzMiwweDJiLDB4ZWQsMHg0OCB9LCB7IDB4M2MsMHgyMiwweGUwLDB4NDMgfSwKKyAgICB7IDB4MmUsMHgzOSwweGY3LDB4NWUgfSwgeyAweDIwLDB4MzAsMHhmYSwweDU1IH0sIAorICAgIHsgMHhlYywweDlhLDB4YjcsMHgwMSB9LCB7IDB4ZTIsMHg5MywweGJhLDB4MGEgfSwKKyAgICB7IDB4ZjAsMHg4OCwweGFkLDB4MTcgfSwgeyAweGZlLDB4ODEsMHhhMCwweDFjIH0sIAorICAgIHsgMHhkNCwweGJlLDB4ODMsMHgyZCB9LCB7IDB4ZGEsMHhiNywweDhlLDB4MjYgfSwKKyAgICB7IDB4YzgsMHhhYywweDk5LDB4M2IgfSwgeyAweGM2LDB4YTUsMHg5NCwweDMwIH0sIAorICAgIHsgMHg5YywweGQyLDB4ZGYsMHg1OSB9LCB7IDB4OTIsMHhkYiwweGQyLDB4NTIgfSwKKyAgICB7IDB4ODAsMHhjMCwweGM1LDB4NGYgfSwgeyAweDhlLDB4YzksMHhjOCwweDQ0IH0sIAorICAgIHsgMHhhNCwweGY2LDB4ZWIsMHg3NSB9LCB7IDB4YWEsMHhmZiwweGU2LDB4N2UgfSwKKyAgICB7IDB4YjgsMHhlNCwweGYxLDB4NjMgfSwgeyAweGI2LDB4ZWQsMHhmYywweDY4IH0sIAorICAgIHsgMHgwYywweDBhLDB4NjcsMHhiMSB9LCB7IDB4MDIsMHgwMywweDZhLDB4YmEgfSwKKyAgICB7IDB4MTAsMHgxOCwweDdkLDB4YTcgfSwgeyAweDFlLDB4MTEsMHg3MCwweGFjIH0sIAorICAgIHsgMHgzNCwweDJlLDB4NTMsMHg5ZCB9LCB7IDB4M2EsMHgyNywweDVlLDB4OTYgfSwKKyAgICB7IDB4MjgsMHgzYywweDQ5LDB4OGIgfSwgeyAweDI2LDB4MzUsMHg0NCwweDgwIH0sIAorICAgIHsgMHg3YywweDQyLDB4MGYsMHhlOSB9LCB7IDB4NzIsMHg0YiwweDAyLDB4ZTIgfSwKKyAgICB7IDB4NjAsMHg1MCwweDE1LDB4ZmYgfSwgeyAweDZlLDB4NTksMHgxOCwweGY0IH0sIAorICAgIHsgMHg0NCwweDY2LDB4M2IsMHhjNSB9LCB7IDB4NGEsMHg2ZiwweDM2LDB4Y2UgfSwKKyAgICB7IDB4NTgsMHg3NCwweDIxLDB4ZDMgfSwgeyAweDU2LDB4N2QsMHgyYywweGQ4IH0sIAorICAgIHsgMHgzNywweGExLDB4MGMsMHg3YSB9LCB7IDB4MzksMHhhOCwweDAxLDB4NzEgfSwKKyAgICB7IDB4MmIsMHhiMywweDE2LDB4NmMgfSwgeyAweDI1LDB4YmEsMHgxYiwweDY3IH0sIAorICAgIHsgMHgwZiwweDg1LDB4MzgsMHg1NiB9LCB7IDB4MDEsMHg4YywweDM1LDB4NWQgfSwKKyAgICB7IDB4MTMsMHg5NywweDIyLDB4NDAgfSwgeyAweDFkLDB4OWUsMHgyZiwweDRiIH0sIAorICAgIHsgMHg0NywweGU5LDB4NjQsMHgyMiB9LCB7IDB4NDksMHhlMCwweDY5LDB4MjkgfSwKKyAgICB7IDB4NWIsMHhmYiwweDdlLDB4MzQgfSwgeyAweDU1LDB4ZjIsMHg3MywweDNmIH0sIAorICAgIHsgMHg3ZiwweGNkLDB4NTAsMHgwZSB9LCB7IDB4NzEsMHhjNCwweDVkLDB4MDUgfSwKKyAgICB7IDB4NjMsMHhkZiwweDRhLDB4MTggfSwgeyAweDZkLDB4ZDYsMHg0NywweDEzIH0sIAorICAgIHsgMHhkNywweDMxLDB4ZGMsMHhjYSB9LCB7IDB4ZDksMHgzOCwweGQxLDB4YzEgfSwKKyAgICB7IDB4Y2IsMHgyMywweGM2LDB4ZGMgfSwgeyAweGM1LDB4MmEsMHhjYiwweGQ3IH0sIAorICAgIHsgMHhlZiwweDE1LDB4ZTgsMHhlNiB9LCB7IDB4ZTEsMHgxYywweGU1LDB4ZWQgfSwKKyAgICB7IDB4ZjMsMHgwNywweGYyLDB4ZjAgfSwgeyAweGZkLDB4MGUsMHhmZiwweGZiIH0sIAorICAgIHsgMHhhNywweDc5LDB4YjQsMHg5MiB9LCB7IDB4YTksMHg3MCwweGI5LDB4OTkgfSwKKyAgICB7IDB4YmIsMHg2YiwweGFlLDB4ODQgfSwgeyAweGI1LDB4NjIsMHhhMywweDhmIH0sIAorICAgIHsgMHg5ZiwweDVkLDB4ODAsMHhiZSB9LCB7IDB4OTEsMHg1NCwweDhkLDB4YjUgfSwKKyAgICB7IDB4ODMsMHg0ZiwweDlhLDB4YTggfSwgeyAweDhkLDB4NDYsMHg5NywweGEzIH0KKyAgfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgVTJbMjU2XVs0XSA9IAorICB7CisgICAgeyAweDAwLDB4MDAsMHgwMCwweDAwIH0sIHsgMHgwYiwweDBlLDB4MDksMHgwZCB9LAorICAgIHsgMHgxNiwweDFjLDB4MTIsMHgxYSB9LCB7IDB4MWQsMHgxMiwweDFiLDB4MTcgfSwgCisgICAgeyAweDJjLDB4MzgsMHgyNCwweDM0IH0sIHsgMHgyNywweDM2LDB4MmQsMHgzOSB9LAorICAgIHsgMHgzYSwweDI0LDB4MzYsMHgyZSB9LCB7IDB4MzEsMHgyYSwweDNmLDB4MjMgfSwgCisgICAgeyAweDU4LDB4NzAsMHg0OCwweDY4IH0sIHsgMHg1MywweDdlLDB4NDEsMHg2NSB9LCAKKyAgICB7IDB4NGUsMHg2YywweDVhLDB4NzIgfSwgeyAweDQ1LDB4NjIsMHg1MywweDdmIH0sIAorICAgIHsgMHg3NCwweDQ4LDB4NmMsMHg1YyB9LCB7IDB4N2YsMHg0NiwweDY1LDB4NTEgfSwKKyAgICB7IDB4NjIsMHg1NCwweDdlLDB4NDYgfSwgeyAweDY5LDB4NWEsMHg3NywweDRiIH0sIAorICAgIHsgMHhiMCwweGUwLDB4OTAsMHhkMCB9LCB7IDB4YmIsMHhlZSwweDk5LDB4ZGQgfSwgCisgICAgeyAweGE2LDB4ZmMsMHg4MiwweGNhIH0sIHsgMHhhZCwweGYyLDB4OGIsMHhjNyB9LCAKKyAgICB7IDB4OWMsMHhkOCwweGI0LDB4ZTQgfSwgeyAweDk3LDB4ZDYsMHhiZCwweGU5IH0sIAorICAgIHsgMHg4YSwweGM0LDB4YTYsMHhmZSB9LCB7IDB4ODEsMHhjYSwweGFmLDB4ZjMgfSwgCisgICAgeyAweGU4LDB4OTAsMHhkOCwweGI4IH0sIHsgMHhlMywweDllLDB4ZDEsMHhiNSB9LAorICAgIHsgMHhmZSwweDhjLDB4Y2EsMHhhMiB9LCB7IDB4ZjUsMHg4MiwweGMzLDB4YWYgfSwgCisgICAgeyAweGM0LDB4YTgsMHhmYywweDhjIH0sIHsgMHhjZiwweGE2LDB4ZjUsMHg4MSB9LCAKKyAgICB7IDB4ZDIsMHhiNCwweGVlLDB4OTYgfSwgeyAweGQ5LDB4YmEsMHhlNywweDliIH0sIAorICAgIHsgMHg3YiwweGRiLDB4M2IsMHhiYiB9LCB7IDB4NzAsMHhkNSwweDMyLDB4YjYgfSwgCisgICAgeyAweDZkLDB4YzcsMHgyOSwweGExIH0sIHsgMHg2NiwweGM5LDB4MjAsMHhhYyB9LCAKKyAgICB7IDB4NTcsMHhlMywweDFmLDB4OGYgfSwgeyAweDVjLDB4ZWQsMHgxNiwweDgyIH0sIAorICAgIHsgMHg0MSwweGZmLDB4MGQsMHg5NSB9LCB7IDB4NGEsMHhmMSwweDA0LDB4OTggfSwgCisgICAgeyAweDIzLDB4YWIsMHg3MywweGQzIH0sIHsgMHgyOCwweGE1LDB4N2EsMHhkZSB9LAorICAgIHsgMHgzNSwweGI3LDB4NjEsMHhjOSB9LCB7IDB4M2UsMHhiOSwweDY4LDB4YzQgfSwgCisgICAgeyAweDBmLDB4OTMsMHg1NywweGU3IH0sIHsgMHgwNCwweDlkLDB4NWUsMHhlYSB9LAorICAgIHsgMHgxOSwweDhmLDB4NDUsMHhmZCB9LCB7IDB4MTIsMHg4MSwweDRjLDB4ZjAgfSwgCisgICAgeyAweGNiLDB4M2IsMHhhYiwweDZiIH0sIHsgMHhjMCwweDM1LDB4YTIsMHg2NiB9LAorICAgIHsgMHhkZCwweDI3LDB4YjksMHg3MSB9LCB7IDB4ZDYsMHgyOSwweGIwLDB4N2MgfSwgCisgICAgeyAweGU3LDB4MDMsMHg4ZiwweDVmIH0sIHsgMHhlYywweDBkLDB4ODYsMHg1MiB9LAorICAgIHsgMHhmMSwweDFmLDB4OWQsMHg0NSB9LCB7IDB4ZmEsMHgxMSwweDk0LDB4NDggfSwgCisgICAgeyAweDkzLDB4NGIsMHhlMywweDAzIH0sIHsgMHg5OCwweDQ1LDB4ZWEsMHgwZSB9LCAKKyAgICB7IDB4ODUsMHg1NywweGYxLDB4MTkgfSwgeyAweDhlLDB4NTksMHhmOCwweDE0IH0sIAorICAgIHsgMHhiZiwweDczLDB4YzcsMHgzNyB9LCB7IDB4YjQsMHg3ZCwweGNlLDB4M2EgfSwKKyAgICB7IDB4YTksMHg2ZiwweGQ1LDB4MmQgfSwgeyAweGEyLDB4NjEsMHhkYywweDIwIH0sIAorICAgIHsgMHhmNiwweGFkLDB4NzYsMHg2ZCB9LCB7IDB4ZmQsMHhhMywweDdmLDB4NjAgfSwgCisgICAgeyAweGUwLDB4YjEsMHg2NCwweDc3IH0sIHsgMHhlYiwweGJmLDB4NmQsMHg3YSB9LCAKKyAgICB7IDB4ZGEsMHg5NSwweDUyLDB4NTkgfSwgeyAweGQxLDB4OWIsMHg1YiwweDU0IH0sIAorICAgIHsgMHhjYywweDg5LDB4NDAsMHg0MyB9LCB7IDB4YzcsMHg4NywweDQ5LDB4NGUgfSwgCisgICAgeyAweGFlLDB4ZGQsMHgzZSwweDA1IH0sIHsgMHhhNSwweGQzLDB4MzcsMHgwOCB9LAorICAgIHsgMHhiOCwweGMxLDB4MmMsMHgxZiB9LCB7IDB4YjMsMHhjZiwweDI1LDB4MTIgfSwgCisgICAgeyAweDgyLDB4ZTUsMHgxYSwweDMxIH0sIHsgMHg4OSwweGViLDB4MTMsMHgzYyB9LAorICAgIHsgMHg5NCwweGY5LDB4MDgsMHgyYiB9LCB7IDB4OWYsMHhmNywweDAxLDB4MjYgfSwgCisgICAgeyAweDQ2LDB4NGQsMHhlNiwweGJkIH0sIHsgMHg0ZCwweDQzLDB4ZWYsMHhiMCB9LAorICAgIHsgMHg1MCwweDUxLDB4ZjQsMHhhNyB9LCB7IDB4NWIsMHg1ZiwweGZkLDB4YWEgfSwgCisgICAgeyAweDZhLDB4NzUsMHhjMiwweDg5IH0sIHsgMHg2MSwweDdiLDB4Y2IsMHg4NCB9LAorICAgIHsgMHg3YywweDY5LDB4ZDAsMHg5MyB9LCB7IDB4NzcsMHg2NywweGQ5LDB4OWUgfSwgCisgICAgeyAweDFlLDB4M2QsMHhhZSwweGQ1IH0sIHsgMHgxNSwweDMzLDB4YTcsMHhkOCB9LAorICAgIHsgMHgwOCwweDIxLDB4YmMsMHhjZiB9LCB7IDB4MDMsMHgyZiwweGI1LDB4YzIgfSwgCisgICAgeyAweDMyLDB4MDUsMHg4YSwweGUxIH0sIHsgMHgzOSwweDBiLDB4ODMsMHhlYyB9LAorICAgIHsgMHgyNCwweDE5LDB4OTgsMHhmYiB9LCB7IDB4MmYsMHgxNywweDkxLDB4ZjYgfSwgCisgICAgeyAweDhkLDB4NzYsMHg0ZCwweGQ2IH0sIHsgMHg4NiwweDc4LDB4NDQsMHhkYiB9LAorICAgIHsgMHg5YiwweDZhLDB4NWYsMHhjYyB9LCB7IDB4OTAsMHg2NCwweDU2LDB4YzEgfSwgCisgICAgeyAweGExLDB4NGUsMHg2OSwweGUyIH0sIHsgMHhhYSwweDQwLDB4NjAsMHhlZiB9LAorICAgIHsgMHhiNywweDUyLDB4N2IsMHhmOCB9LCB7IDB4YmMsMHg1YywweDcyLDB4ZjUgfSwgCisgICAgeyAweGQ1LDB4MDYsMHgwNSwweGJlIH0sIHsgMHhkZSwweDA4LDB4MGMsMHhiMyB9LAorICAgIHsgMHhjMywweDFhLDB4MTcsMHhhNCB9LCB7IDB4YzgsMHgxNCwweDFlLDB4YTkgfSwgCisgICAgeyAweGY5LDB4M2UsMHgyMSwweDhhIH0sIHsgMHhmMiwweDMwLDB4MjgsMHg4NyB9LAorICAgIHsgMHhlZiwweDIyLDB4MzMsMHg5MCB9LCB7IDB4ZTQsMHgyYywweDNhLDB4OWQgfSwgCisgICAgeyAweDNkLDB4OTYsMHhkZCwweDA2IH0sIHsgMHgzNiwweDk4LDB4ZDQsMHgwYiB9LAorICAgIHsgMHgyYiwweDhhLDB4Y2YsMHgxYyB9LCB7IDB4MjAsMHg4NCwweGM2LDB4MTEgfSwgCisgICAgeyAweDExLDB4YWUsMHhmOSwweDMyIH0sIHsgMHgxYSwweGEwLDB4ZjAsMHgzZiB9LAorICAgIHsgMHgwNywweGIyLDB4ZWIsMHgyOCB9LCB7IDB4MGMsMHhiYywweGUyLDB4MjUgfSwgCisgICAgeyAweDY1LDB4ZTYsMHg5NSwweDZlIH0sIHsgMHg2ZSwweGU4LDB4OWMsMHg2MyB9LAorICAgIHsgMHg3MywweGZhLDB4ODcsMHg3NCB9LCB7IDB4NzgsMHhmNCwweDhlLDB4NzkgfSwgCisgICAgeyAweDQ5LDB4ZGUsMHhiMSwweDVhIH0sIHsgMHg0MiwweGQwLDB4YjgsMHg1NyB9LAorICAgIHsgMHg1ZiwweGMyLDB4YTMsMHg0MCB9LCB7IDB4NTQsMHhjYywweGFhLDB4NGQgfSwgCisgICAgeyAweGY3LDB4NDEsMHhlYywweGRhIH0sIHsgMHhmYywweDRmLDB4ZTUsMHhkNyB9LAorICAgIHsgMHhlMSwweDVkLDB4ZmUsMHhjMCB9LCB7IDB4ZWEsMHg1MywweGY3LDB4Y2QgfSwgCisgICAgeyAweGRiLDB4NzksMHhjOCwweGVlIH0sIHsgMHhkMCwweDc3LDB4YzEsMHhlMyB9LAorICAgIHsgMHhjZCwweDY1LDB4ZGEsMHhmNCB9LCB7IDB4YzYsMHg2YiwweGQzLDB4ZjkgfSwgCisgICAgeyAweGFmLDB4MzEsMHhhNCwweGIyIH0sIHsgMHhhNCwweDNmLDB4YWQsMHhiZiB9LAorICAgIHsgMHhiOSwweDJkLDB4YjYsMHhhOCB9LCB7IDB4YjIsMHgyMywweGJmLDB4YTUgfSwgCisgICAgeyAweDgzLDB4MDksMHg4MCwweDg2IH0sIHsgMHg4OCwweDA3LDB4ODksMHg4YiB9LAorICAgIHsgMHg5NSwweDE1LDB4OTIsMHg5YyB9LCB7IDB4OWUsMHgxYiwweDliLDB4OTEgfSwgCisgICAgeyAweDQ3LDB4YTEsMHg3YywweDBhIH0sIHsgMHg0YywweGFmLDB4NzUsMHgwNyB9LAorICAgIHsgMHg1MSwweGJkLDB4NmUsMHgxMCB9LCB7IDB4NWEsMHhiMywweDY3LDB4MWQgfSwgCisgICAgeyAweDZiLDB4OTksMHg1OCwweDNlIH0sIHsgMHg2MCwweDk3LDB4NTEsMHgzMyB9LAorICAgIHsgMHg3ZCwweDg1LDB4NGEsMHgyNCB9LCB7IDB4NzYsMHg4YiwweDQzLDB4MjkgfSwgCisgICAgeyAweDFmLDB4ZDEsMHgzNCwweDYyIH0sIHsgMHgxNCwweGRmLDB4M2QsMHg2ZiB9LAorICAgIHsgMHgwOSwweGNkLDB4MjYsMHg3OCB9LCB7IDB4MDIsMHhjMywweDJmLDB4NzUgfSwgCisgICAgeyAweDMzLDB4ZTksMHgxMCwweDU2IH0sIHsgMHgzOCwweGU3LDB4MTksMHg1YiB9LAorICAgIHsgMHgyNSwweGY1LDB4MDIsMHg0YyB9LCB7IDB4MmUsMHhmYiwweDBiLDB4NDEgfSwgCisgICAgeyAweDhjLDB4OWEsMHhkNywweDYxIH0sIHsgMHg4NywweDk0LDB4ZGUsMHg2YyB9LAorICAgIHsgMHg5YSwweDg2LDB4YzUsMHg3YiB9LCB7IDB4OTEsMHg4OCwweGNjLDB4NzYgfSwgCisgICAgeyAweGEwLDB4YTIsMHhmMywweDU1IH0sIHsgMHhhYiwweGFjLDB4ZmEsMHg1OCB9LAorICAgIHsgMHhiNiwweGJlLDB4ZTEsMHg0ZiB9LCB7IDB4YmQsMHhiMCwweGU4LDB4NDIgfSwgCisgICAgeyAweGQ0LDB4ZWEsMHg5ZiwweDA5IH0sIHsgMHhkZiwweGU0LDB4OTYsMHgwNCB9LAorICAgIHsgMHhjMiwweGY2LDB4OGQsMHgxMyB9LCB7IDB4YzksMHhmOCwweDg0LDB4MWUgfSwgCisgICAgeyAweGY4LDB4ZDIsMHhiYiwweDNkIH0sIHsgMHhmMywweGRjLDB4YjIsMHgzMCB9LAorICAgIHsgMHhlZSwweGNlLDB4YTksMHgyNyB9LCB7IDB4ZTUsMHhjMCwweGEwLDB4MmEgfSwgCisgICAgeyAweDNjLDB4N2EsMHg0NywweGIxIH0sIHsgMHgzNywweDc0LDB4NGUsMHhiYyB9LAorICAgIHsgMHgyYSwweDY2LDB4NTUsMHhhYiB9LCB7IDB4MjEsMHg2OCwweDVjLDB4YTYgfSwgCisgICAgeyAweDEwLDB4NDIsMHg2MywweDg1IH0sIHsgMHgxYiwweDRjLDB4NmEsMHg4OCB9LAorICAgIHsgMHgwNiwweDVlLDB4NzEsMHg5ZiB9LCB7IDB4MGQsMHg1MCwweDc4LDB4OTIgfSwgCisgICAgeyAweDY0LDB4MGEsMHgwZiwweGQ5IH0sIHsgMHg2ZiwweDA0LDB4MDYsMHhkNCB9LAorICAgIHsgMHg3MiwweDE2LDB4MWQsMHhjMyB9LCB7IDB4NzksMHgxOCwweDE0LDB4Y2UgfSwgCisgICAgeyAweDQ4LDB4MzIsMHgyYiwweGVkIH0sIHsgMHg0MywweDNjLDB4MjIsMHhlMCB9LAorICAgIHsgMHg1ZSwweDJlLDB4MzksMHhmNyB9LCB7IDB4NTUsMHgyMCwweDMwLDB4ZmEgfSwgCisgICAgeyAweDAxLDB4ZWMsMHg5YSwweGI3IH0sIHsgMHgwYSwweGUyLDB4OTMsMHhiYSB9LAorICAgIHsgMHgxNywweGYwLDB4ODgsMHhhZCB9LCB7IDB4MWMsMHhmZSwweDgxLDB4YTAgfSwgCisgICAgeyAweDJkLDB4ZDQsMHhiZSwweDgzIH0sIHsgMHgyNiwweGRhLDB4YjcsMHg4ZSB9LAorICAgIHsgMHgzYiwweGM4LDB4YWMsMHg5OSB9LCB7IDB4MzAsMHhjNiwweGE1LDB4OTQgfSwgCisgICAgeyAweDU5LDB4OWMsMHhkMiwweGRmIH0sIHsgMHg1MiwweDkyLDB4ZGIsMHhkMiB9LAorICAgIHsgMHg0ZiwweDgwLDB4YzAsMHhjNSB9LCB7IDB4NDQsMHg4ZSwweGM5LDB4YzggfSwgCisgICAgeyAweDc1LDB4YTQsMHhmNiwweGViIH0sIHsgMHg3ZSwweGFhLDB4ZmYsMHhlNiB9LAorICAgIHsgMHg2MywweGI4LDB4ZTQsMHhmMSB9LCB7IDB4NjgsMHhiNiwweGVkLDB4ZmMgfSwgCisgICAgeyAweGIxLDB4MGMsMHgwYSwweDY3IH0sIHsgMHhiYSwweDAyLDB4MDMsMHg2YSB9LAorICAgIHsgMHhhNywweDEwLDB4MTgsMHg3ZCB9LCB7IDB4YWMsMHgxZSwweDExLDB4NzAgfSwgCisgICAgeyAweDlkLDB4MzQsMHgyZSwweDUzIH0sIHsgMHg5NiwweDNhLDB4MjcsMHg1ZSB9LAorICAgIHsgMHg4YiwweDI4LDB4M2MsMHg0OSB9LCB7IDB4ODAsMHgyNiwweDM1LDB4NDQgfSwgCisgICAgeyAweGU5LDB4N2MsMHg0MiwweDBmIH0sIHsgMHhlMiwweDcyLDB4NGIsMHgwMiB9LAorICAgIHsgMHhmZiwweDYwLDB4NTAsMHgxNSB9LCB7IDB4ZjQsMHg2ZSwweDU5LDB4MTggfSwgCisgICAgeyAweGM1LDB4NDQsMHg2NiwweDNiIH0sIHsgMHhjZSwweDRhLDB4NmYsMHgzNiB9LAorICAgIHsgMHhkMywweDU4LDB4NzQsMHgyMSB9LCB7IDB4ZDgsMHg1NiwweDdkLDB4MmMgfSwgCisgICAgeyAweDdhLDB4MzcsMHhhMSwweDBjIH0sIHsgMHg3MSwweDM5LDB4YTgsMHgwMSB9LAorICAgIHsgMHg2YywweDJiLDB4YjMsMHgxNiB9LCB7IDB4NjcsMHgyNSwweGJhLDB4MWIgfSwgCisgICAgeyAweDU2LDB4MGYsMHg4NSwweDM4IH0sIHsgMHg1ZCwweDAxLDB4OGMsMHgzNSB9LAorICAgIHsgMHg0MCwweDEzLDB4OTcsMHgyMiB9LCB7IDB4NGIsMHgxZCwweDllLDB4MmYgfSwgCisgICAgeyAweDIyLDB4NDcsMHhlOSwweDY0IH0sIHsgMHgyOSwweDQ5LDB4ZTAsMHg2OSB9LAorICAgIHsgMHgzNCwweDViLDB4ZmIsMHg3ZSB9LCB7IDB4M2YsMHg1NSwweGYyLDB4NzMgfSwgCisgICAgeyAweDBlLDB4N2YsMHhjZCwweDUwIH0sIHsgMHgwNSwweDcxLDB4YzQsMHg1ZCB9LAorICAgIHsgMHgxOCwweDYzLDB4ZGYsMHg0YSB9LCB7IDB4MTMsMHg2ZCwweGQ2LDB4NDcgfSwgCisgICAgeyAweGNhLDB4ZDcsMHgzMSwweGRjIH0sIHsgMHhjMSwweGQ5LDB4MzgsMHhkMSB9LAorICAgIHsgMHhkYywweGNiLDB4MjMsMHhjNiB9LCB7IDB4ZDcsMHhjNSwweDJhLDB4Y2IgfSwgCisgICAgeyAweGU2LDB4ZWYsMHgxNSwweGU4IH0sIHsgMHhlZCwweGUxLDB4MWMsMHhlNSB9LAorICAgIHsgMHhmMCwweGYzLDB4MDcsMHhmMiB9LCB7IDB4ZmIsMHhmZCwweDBlLDB4ZmYgfSwgCisgICAgeyAweDkyLDB4YTcsMHg3OSwweGI0IH0sIHsgMHg5OSwweGE5LDB4NzAsMHhiOSB9LAorICAgIHsgMHg4NCwweGJiLDB4NmIsMHhhZSB9LCB7IDB4OGYsMHhiNSwweDYyLDB4YTMgfSwgCisgICAgeyAweGJlLDB4OWYsMHg1ZCwweDgwIH0sIHsgMHhiNSwweDkxLDB4NTQsMHg4ZCB9LAorICAgIHsgMHhhOCwweDgzLDB4NGYsMHg5YSB9LCB7IDB4YTMsMHg4ZCwweDQ2LDB4OTcgfQorICB9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBVM1syNTZdWzRdID0gCisgIHsKKyAgICB7IDB4MDAsMHgwMCwweDAwLDB4MDAgfSwgeyAweDBkLDB4MGIsMHgwZSwweDA5IH0sCisgICAgeyAweDFhLDB4MTYsMHgxYywweDEyIH0sIHsgMHgxNywweDFkLDB4MTIsMHgxYiB9LCAKKyAgICB7IDB4MzQsMHgyYywweDM4LDB4MjQgfSwgeyAweDM5LDB4MjcsMHgzNiwweDJkIH0sCisgICAgeyAweDJlLDB4M2EsMHgyNCwweDM2IH0sIHsgMHgyMywweDMxLDB4MmEsMHgzZiB9LCAKKyAgICB7IDB4NjgsMHg1OCwweDcwLDB4NDggfSwgeyAweDY1LDB4NTMsMHg3ZSwweDQxIH0sCisgICAgeyAweDcyLDB4NGUsMHg2YywweDVhIH0sIHsgMHg3ZiwweDQ1LDB4NjIsMHg1MyB9LCAKKyAgICB7IDB4NWMsMHg3NCwweDQ4LDB4NmMgfSwgeyAweDUxLDB4N2YsMHg0NiwweDY1IH0sCisgICAgeyAweDQ2LDB4NjIsMHg1NCwweDdlIH0sIHsgMHg0YiwweDY5LDB4NWEsMHg3NyB9LCAKKyAgICB7IDB4ZDAsMHhiMCwweGUwLDB4OTAgfSwgeyAweGRkLDB4YmIsMHhlZSwweDk5IH0sCisgICAgeyAweGNhLDB4YTYsMHhmYywweDgyIH0sIHsgMHhjNywweGFkLDB4ZjIsMHg4YiB9LCAKKyAgICB7IDB4ZTQsMHg5YywweGQ4LDB4YjQgfSwgeyAweGU5LDB4OTcsMHhkNiwweGJkIH0sCisgICAgeyAweGZlLDB4OGEsMHhjNCwweGE2IH0sIHsgMHhmMywweDgxLDB4Y2EsMHhhZiB9LCAKKyAgICB7IDB4YjgsMHhlOCwweDkwLDB4ZDggfSwgeyAweGI1LDB4ZTMsMHg5ZSwweGQxIH0sCisgICAgeyAweGEyLDB4ZmUsMHg4YywweGNhIH0sIHsgMHhhZiwweGY1LDB4ODIsMHhjMyB9LCAKKyAgICB7IDB4OGMsMHhjNCwweGE4LDB4ZmMgfSwgeyAweDgxLDB4Y2YsMHhhNiwweGY1IH0sCisgICAgeyAweDk2LDB4ZDIsMHhiNCwweGVlIH0sIHsgMHg5YiwweGQ5LDB4YmEsMHhlNyB9LCAKKyAgICB7IDB4YmIsMHg3YiwweGRiLDB4M2IgfSwgeyAweGI2LDB4NzAsMHhkNSwweDMyIH0sCisgICAgeyAweGExLDB4NmQsMHhjNywweDI5IH0sIHsgMHhhYywweDY2LDB4YzksMHgyMCB9LCAKKyAgICB7IDB4OGYsMHg1NywweGUzLDB4MWYgfSwgeyAweDgyLDB4NWMsMHhlZCwweDE2IH0sCisgICAgeyAweDk1LDB4NDEsMHhmZiwweDBkIH0sIHsgMHg5OCwweDRhLDB4ZjEsMHgwNCB9LCAKKyAgICB7IDB4ZDMsMHgyMywweGFiLDB4NzMgfSwgeyAweGRlLDB4MjgsMHhhNSwweDdhIH0sCisgICAgeyAweGM5LDB4MzUsMHhiNywweDYxIH0sIHsgMHhjNCwweDNlLDB4YjksMHg2OCB9LCAKKyAgICB7IDB4ZTcsMHgwZiwweDkzLDB4NTcgfSwgeyAweGVhLDB4MDQsMHg5ZCwweDVlIH0sCisgICAgeyAweGZkLDB4MTksMHg4ZiwweDQ1IH0sIHsgMHhmMCwweDEyLDB4ODEsMHg0YyB9LCAKKyAgICB7IDB4NmIsMHhjYiwweDNiLDB4YWIgfSwgeyAweDY2LDB4YzAsMHgzNSwweGEyIH0sCisgICAgeyAweDcxLDB4ZGQsMHgyNywweGI5IH0sIHsgMHg3YywweGQ2LDB4MjksMHhiMCB9LCAKKyAgICB7IDB4NWYsMHhlNywweDAzLDB4OGYgfSwgeyAweDUyLDB4ZWMsMHgwZCwweDg2IH0sCisgICAgeyAweDQ1LDB4ZjEsMHgxZiwweDlkIH0sIHsgMHg0OCwweGZhLDB4MTEsMHg5NCB9LCAKKyAgICB7IDB4MDMsMHg5MywweDRiLDB4ZTMgfSwgeyAweDBlLDB4OTgsMHg0NSwweGVhIH0sCisgICAgeyAweDE5LDB4ODUsMHg1NywweGYxIH0sIHsgMHgxNCwweDhlLDB4NTksMHhmOCB9LCAKKyAgICB7IDB4MzcsMHhiZiwweDczLDB4YzcgfSwgeyAweDNhLDB4YjQsMHg3ZCwweGNlIH0sIAorICAgIHsgMHgyZCwweGE5LDB4NmYsMHhkNSB9LCB7IDB4MjAsMHhhMiwweDYxLDB4ZGMgfSwgCisgICAgeyAweDZkLDB4ZjYsMHhhZCwweDc2IH0sIHsgMHg2MCwweGZkLDB4YTMsMHg3ZiB9LAorICAgIHsgMHg3NywweGUwLDB4YjEsMHg2NCB9LCB7IDB4N2EsMHhlYiwweGJmLDB4NmQgfSwgCisgICAgeyAweDU5LDB4ZGEsMHg5NSwweDUyIH0sIHsgMHg1NCwweGQxLDB4OWIsMHg1YiB9LAorICAgIHsgMHg0MywweGNjLDB4ODksMHg0MCB9LCB7IDB4NGUsMHhjNywweDg3LDB4NDkgfSwgCisgICAgeyAweDA1LDB4YWUsMHhkZCwweDNlIH0sIHsgMHgwOCwweGE1LDB4ZDMsMHgzNyB9LAorICAgIHsgMHgxZiwweGI4LDB4YzEsMHgyYyB9LCB7IDB4MTIsMHhiMywweGNmLDB4MjUgfSwgCisgICAgeyAweDMxLDB4ODIsMHhlNSwweDFhIH0sIHsgMHgzYywweDg5LDB4ZWIsMHgxMyB9LCAKKyAgICB7IDB4MmIsMHg5NCwweGY5LDB4MDggfSwgeyAweDI2LDB4OWYsMHhmNywweDAxIH0sIAorICAgIHsgMHhiZCwweDQ2LDB4NGQsMHhlNiB9LCB7IDB4YjAsMHg0ZCwweDQzLDB4ZWYgfSwgCisgICAgeyAweGE3LDB4NTAsMHg1MSwweGY0IH0sIHsgMHhhYSwweDViLDB4NWYsMHhmZCB9LCAKKyAgICB7IDB4ODksMHg2YSwweDc1LDB4YzIgfSwgeyAweDg0LDB4NjEsMHg3YiwweGNiIH0sIAorICAgIHsgMHg5MywweDdjLDB4NjksMHhkMCB9LCB7IDB4OWUsMHg3NywweDY3LDB4ZDkgfSwgCisgICAgeyAweGQ1LDB4MWUsMHgzZCwweGFlIH0sIHsgMHhkOCwweDE1LDB4MzMsMHhhNyB9LAorICAgIHsgMHhjZiwweDA4LDB4MjEsMHhiYyB9LCB7IDB4YzIsMHgwMywweDJmLDB4YjUgfSwgCisgICAgeyAweGUxLDB4MzIsMHgwNSwweDhhIH0sIHsgMHhlYywweDM5LDB4MGIsMHg4MyB9LAorICAgIHsgMHhmYiwweDI0LDB4MTksMHg5OCB9LCB7IDB4ZjYsMHgyZiwweDE3LDB4OTEgfSwgCisgICAgeyAweGQ2LDB4OGQsMHg3NiwweDRkIH0sIHsgMHhkYiwweDg2LDB4NzgsMHg0NCB9LCAKKyAgICB7IDB4Y2MsMHg5YiwweDZhLDB4NWYgfSwgeyAweGMxLDB4OTAsMHg2NCwweDU2IH0sIAorICAgIHsgMHhlMiwweGExLDB4NGUsMHg2OSB9LCB7IDB4ZWYsMHhhYSwweDQwLDB4NjAgfSwgCisgICAgeyAweGY4LDB4YjcsMHg1MiwweDdiIH0sIHsgMHhmNSwweGJjLDB4NWMsMHg3MiB9LCAKKyAgICB7IDB4YmUsMHhkNSwweDA2LDB4MDUgfSwgeyAweGIzLDB4ZGUsMHgwOCwweDBjIH0sIAorICAgIHsgMHhhNCwweGMzLDB4MWEsMHgxNyB9LCB7IDB4YTksMHhjOCwweDE0LDB4MWUgfSwgCisgICAgeyAweDhhLDB4ZjksMHgzZSwweDIxIH0sIHsgMHg4NywweGYyLDB4MzAsMHgyOCB9LAorICAgIHsgMHg5MCwweGVmLDB4MjIsMHgzMyB9LCB7IDB4OWQsMHhlNCwweDJjLDB4M2EgfSwgCisgICAgeyAweDA2LDB4M2QsMHg5NiwweGRkIH0sIHsgMHgwYiwweDM2LDB4OTgsMHhkNCB9LAorICAgIHsgMHgxYywweDJiLDB4OGEsMHhjZiB9LCB7IDB4MTEsMHgyMCwweDg0LDB4YzYgfSwgCisgICAgeyAweDMyLDB4MTEsMHhhZSwweGY5IH0sIHsgMHgzZiwweDFhLDB4YTAsMHhmMCB9LAorICAgIHsgMHgyOCwweDA3LDB4YjIsMHhlYiB9LCB7IDB4MjUsMHgwYywweGJjLDB4ZTIgfSwgCisgICAgeyAweDZlLDB4NjUsMHhlNiwweDk1IH0sIHsgMHg2MywweDZlLDB4ZTgsMHg5YyB9LAorICAgIHsgMHg3NCwweDczLDB4ZmEsMHg4NyB9LCB7IDB4NzksMHg3OCwweGY0LDB4OGUgfSwgCisgICAgeyAweDVhLDB4NDksMHhkZSwweGIxIH0sIHsgMHg1NywweDQyLDB4ZDAsMHhiOCB9LAorICAgIHsgMHg0MCwweDVmLDB4YzIsMHhhMyB9LCB7IDB4NGQsMHg1NCwweGNjLDB4YWEgfSwgCisgICAgeyAweGRhLDB4ZjcsMHg0MSwweGVjIH0sIHsgMHhkNywweGZjLDB4NGYsMHhlNSB9LAorICAgIHsgMHhjMCwweGUxLDB4NWQsMHhmZSB9LCB7IDB4Y2QsMHhlYSwweDUzLDB4ZjcgfSwgCisgICAgeyAweGVlLDB4ZGIsMHg3OSwweGM4IH0sIHsgMHhlMywweGQwLDB4NzcsMHhjMSB9LAorICAgIHsgMHhmNCwweGNkLDB4NjUsMHhkYSB9LCB7IDB4ZjksMHhjNiwweDZiLDB4ZDMgfSwgCisgICAgeyAweGIyLDB4YWYsMHgzMSwweGE0IH0sIHsgMHhiZiwweGE0LDB4M2YsMHhhZCB9LAorICAgIHsgMHhhOCwweGI5LDB4MmQsMHhiNiB9LCB7IDB4YTUsMHhiMiwweDIzLDB4YmYgfSwgCisgICAgeyAweDg2LDB4ODMsMHgwOSwweDgwIH0sIHsgMHg4YiwweDg4LDB4MDcsMHg4OSB9LAorICAgIHsgMHg5YywweDk1LDB4MTUsMHg5MiB9LCB7IDB4OTEsMHg5ZSwweDFiLDB4OWIgfSwgCisgICAgeyAweDBhLDB4NDcsMHhhMSwweDdjIH0sIHsgMHgwNywweDRjLDB4YWYsMHg3NSB9LAorICAgIHsgMHgxMCwweDUxLDB4YmQsMHg2ZSB9LCB7IDB4MWQsMHg1YSwweGIzLDB4NjcgfSwgCisgICAgeyAweDNlLDB4NmIsMHg5OSwweDU4IH0sIHsgMHgzMywweDYwLDB4OTcsMHg1MSB9LAorICAgIHsgMHgyNCwweDdkLDB4ODUsMHg0YSB9LCB7IDB4MjksMHg3NiwweDhiLDB4NDMgfSwgCisgICAgeyAweDYyLDB4MWYsMHhkMSwweDM0IH0sIHsgMHg2ZiwweDE0LDB4ZGYsMHgzZCB9LAorICAgIHsgMHg3OCwweDA5LDB4Y2QsMHgyNiB9LCB7IDB4NzUsMHgwMiwweGMzLDB4MmYgfSwgCisgICAgeyAweDU2LDB4MzMsMHhlOSwweDEwIH0sIHsgMHg1YiwweDM4LDB4ZTcsMHgxOSB9LAorICAgIHsgMHg0YywweDI1LDB4ZjUsMHgwMiB9LCB7IDB4NDEsMHgyZSwweGZiLDB4MGIgfSwgCisgICAgeyAweDYxLDB4OGMsMHg5YSwweGQ3IH0sIHsgMHg2YywweDg3LDB4OTQsMHhkZSB9LAorICAgIHsgMHg3YiwweDlhLDB4ODYsMHhjNSB9LCB7IDB4NzYsMHg5MSwweDg4LDB4Y2MgfSwgCisgICAgeyAweDU1LDB4YTAsMHhhMiwweGYzIH0sIHsgMHg1OCwweGFiLDB4YWMsMHhmYSB9LAorICAgIHsgMHg0ZiwweGI2LDB4YmUsMHhlMSB9LCB7IDB4NDIsMHhiZCwweGIwLDB4ZTggfSwgCisgICAgeyAweDA5LDB4ZDQsMHhlYSwweDlmIH0sIHsgMHgwNCwweGRmLDB4ZTQsMHg5NiB9LAorICAgIHsgMHgxMywweGMyLDB4ZjYsMHg4ZCB9LCB7IDB4MWUsMHhjOSwweGY4LDB4ODQgfSwgCisgICAgeyAweDNkLDB4ZjgsMHhkMiwweGJiIH0sIHsgMHgzMCwweGYzLDB4ZGMsMHhiMiB9LAorICAgIHsgMHgyNywweGVlLDB4Y2UsMHhhOSB9LCB7IDB4MmEsMHhlNSwweGMwLDB4YTAgfSwgCisgICAgeyAweGIxLDB4M2MsMHg3YSwweDQ3IH0sIHsgMHhiYywweDM3LDB4NzQsMHg0ZSB9LAorICAgIHsgMHhhYiwweDJhLDB4NjYsMHg1NSB9LCB7IDB4YTYsMHgyMSwweDY4LDB4NWMgfSwgCisgICAgeyAweDg1LDB4MTAsMHg0MiwweDYzIH0sIHsgMHg4OCwweDFiLDB4NGMsMHg2YSB9LAorICAgIHsgMHg5ZiwweDA2LDB4NWUsMHg3MSB9LCB7IDB4OTIsMHgwZCwweDUwLDB4NzggfSwgCisgICAgeyAweGQ5LDB4NjQsMHgwYSwweDBmIH0sIHsgMHhkNCwweDZmLDB4MDQsMHgwNiB9LAorICAgIHsgMHhjMywweDcyLDB4MTYsMHgxZCB9LCB7IDB4Y2UsMHg3OSwweDE4LDB4MTQgfSwgCisgICAgeyAweGVkLDB4NDgsMHgzMiwweDJiIH0sIHsgMHhlMCwweDQzLDB4M2MsMHgyMiB9LAorICAgIHsgMHhmNywweDVlLDB4MmUsMHgzOSB9LCB7IDB4ZmEsMHg1NSwweDIwLDB4MzAgfSwgCisgICAgeyAweGI3LDB4MDEsMHhlYywweDlhIH0sIHsgMHhiYSwweDBhLDB4ZTIsMHg5MyB9LAorICAgIHsgMHhhZCwweDE3LDB4ZjAsMHg4OCB9LCB7IDB4YTAsMHgxYywweGZlLDB4ODEgfSwgCisgICAgeyAweDgzLDB4MmQsMHhkNCwweGJlIH0sIHsgMHg4ZSwweDI2LDB4ZGEsMHhiNyB9LAorICAgIHsgMHg5OSwweDNiLDB4YzgsMHhhYyB9LCB7IDB4OTQsMHgzMCwweGM2LDB4YTUgfSwgCisgICAgeyAweGRmLDB4NTksMHg5YywweGQyIH0sIHsgMHhkMiwweDUyLDB4OTIsMHhkYiB9LAorICAgIHsgMHhjNSwweDRmLDB4ODAsMHhjMCB9LCB7IDB4YzgsMHg0NCwweDhlLDB4YzkgfSwgCisgICAgeyAweGViLDB4NzUsMHhhNCwweGY2IH0sIHsgMHhlNiwweDdlLDB4YWEsMHhmZiB9LAorICAgIHsgMHhmMSwweDYzLDB4YjgsMHhlNCB9LCB7IDB4ZmMsMHg2OCwweGI2LDB4ZWQgfSwgCisgICAgeyAweDY3LDB4YjEsMHgwYywweDBhIH0sIHsgMHg2YSwweGJhLDB4MDIsMHgwMyB9LAorICAgIHsgMHg3ZCwweGE3LDB4MTAsMHgxOCB9LCB7IDB4NzAsMHhhYywweDFlLDB4MTEgfSwgCisgICAgeyAweDUzLDB4OWQsMHgzNCwweDJlIH0sIHsgMHg1ZSwweDk2LDB4M2EsMHgyNyB9LAorICAgIHsgMHg0OSwweDhiLDB4MjgsMHgzYyB9LCB7IDB4NDQsMHg4MCwweDI2LDB4MzUgfSwgCisgICAgeyAweDBmLDB4ZTksMHg3YywweDQyIH0sIHsgMHgwMiwweGUyLDB4NzIsMHg0YiB9LAorICAgIHsgMHgxNSwweGZmLDB4NjAsMHg1MCB9LCB7IDB4MTgsMHhmNCwweDZlLDB4NTkgfSwgCisgICAgeyAweDNiLDB4YzUsMHg0NCwweDY2IH0sIHsgMHgzNiwweGNlLDB4NGEsMHg2ZiB9LAorICAgIHsgMHgyMSwweGQzLDB4NTgsMHg3NCB9LCB7IDB4MmMsMHhkOCwweDU2LDB4N2QgfSwgCisgICAgeyAweDBjLDB4N2EsMHgzNywweGExIH0sIHsgMHgwMSwweDcxLDB4MzksMHhhOCB9LAorICAgIHsgMHgxNiwweDZjLDB4MmIsMHhiMyB9LCB7IDB4MWIsMHg2NywweDI1LDB4YmEgfSwgCisgICAgeyAweDM4LDB4NTYsMHgwZiwweDg1IH0sIHsgMHgzNSwweDVkLDB4MDEsMHg4YyB9LAorICAgIHsgMHgyMiwweDQwLDB4MTMsMHg5NyB9LCB7IDB4MmYsMHg0YiwweDFkLDB4OWUgfSwgCisgICAgeyAweDY0LDB4MjIsMHg0NywweGU5IH0sIHsgMHg2OSwweDI5LDB4NDksMHhlMCB9LAorICAgIHsgMHg3ZSwweDM0LDB4NWIsMHhmYiB9LCB7IDB4NzMsMHgzZiwweDU1LDB4ZjIgfSwgCisgICAgeyAweDUwLDB4MGUsMHg3ZiwweGNkIH0sIHsgMHg1ZCwweDA1LDB4NzEsMHhjNCB9LAorICAgIHsgMHg0YSwweDE4LDB4NjMsMHhkZiB9LCB7IDB4NDcsMHgxMywweDZkLDB4ZDYgfSwgCisgICAgeyAweGRjLDB4Y2EsMHhkNywweDMxIH0sIHsgMHhkMSwweGMxLDB4ZDksMHgzOCB9LAorICAgIHsgMHhjNiwweGRjLDB4Y2IsMHgyMyB9LCB7IDB4Y2IsMHhkNywweGM1LDB4MmEgfSwgCisgICAgeyAweGU4LDB4ZTYsMHhlZiwweDE1IH0sIHsgMHhlNSwweGVkLDB4ZTEsMHgxYyB9LAorICAgIHsgMHhmMiwweGYwLDB4ZjMsMHgwNyB9LCB7IDB4ZmYsMHhmYiwweGZkLDB4MGUgfSwgCisgICAgeyAweGI0LDB4OTIsMHhhNywweDc5IH0sIHsgMHhiOSwweDk5LDB4YTksMHg3MCB9LAorICAgIHsgMHhhZSwweDg0LDB4YmIsMHg2YiB9LCB7IDB4YTMsMHg4ZiwweGI1LDB4NjIgfSwgCisgICAgeyAweDgwLDB4YmUsMHg5ZiwweDVkIH0sIHsgMHg4ZCwweGI1LDB4OTEsMHg1NCB9LAorICAgIHsgMHg5YSwweGE4LDB4ODMsMHg0ZiB9LCB7IDB4OTcsMHhhMywweDhkLDB4NDYgfQorICB9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBVNFsyNTZdWzRdID0KKyAgeworICAgIHsgMHgwMCwweDAwLDB4MDAsMHgwMCB9LCB7IDB4MDksMHgwZCwweDBiLDB4MGUgfSwKKyAgICB7IDB4MTIsMHgxYSwweDE2LDB4MWMgfSwgeyAweDFiLDB4MTcsMHgxZCwweDEyIH0sIAorICAgIHsgMHgyNCwweDM0LDB4MmMsMHgzOCB9LCB7IDB4MmQsMHgzOSwweDI3LDB4MzYgfSwKKyAgICB7IDB4MzYsMHgyZSwweDNhLDB4MjQgfSwgeyAweDNmLDB4MjMsMHgzMSwweDJhIH0sIAorICAgIHsgMHg0OCwweDY4LDB4NTgsMHg3MCB9LCB7IDB4NDEsMHg2NSwweDUzLDB4N2UgfSwKKyAgICB7IDB4NWEsMHg3MiwweDRlLDB4NmMgfSwgeyAweDUzLDB4N2YsMHg0NSwweDYyIH0sIAorICAgIHsgMHg2YywweDVjLDB4NzQsMHg0OCB9LCB7IDB4NjUsMHg1MSwweDdmLDB4NDYgfSwKKyAgICB7IDB4N2UsMHg0NiwweDYyLDB4NTQgfSwgeyAweDc3LDB4NGIsMHg2OSwweDVhIH0sIAorICAgIHsgMHg5MCwweGQwLDB4YjAsMHhlMCB9LCB7IDB4OTksMHhkZCwweGJiLDB4ZWUgfSwKKyAgICB7IDB4ODIsMHhjYSwweGE2LDB4ZmMgfSwgeyAweDhiLDB4YzcsMHhhZCwweGYyIH0sIAorICAgIHsgMHhiNCwweGU0LDB4OWMsMHhkOCB9LCB7IDB4YmQsMHhlOSwweDk3LDB4ZDYgfSwKKyAgICB7IDB4YTYsMHhmZSwweDhhLDB4YzQgfSwgeyAweGFmLDB4ZjMsMHg4MSwweGNhIH0sIAorICAgIHsgMHhkOCwweGI4LDB4ZTgsMHg5MCB9LCB7IDB4ZDEsMHhiNSwweGUzLDB4OWUgfSwKKyAgICB7IDB4Y2EsMHhhMiwweGZlLDB4OGMgfSwgeyAweGMzLDB4YWYsMHhmNSwweDgyIH0sIAorICAgIHsgMHhmYywweDhjLDB4YzQsMHhhOCB9LCB7IDB4ZjUsMHg4MSwweGNmLDB4YTYgfSwKKyAgICB7IDB4ZWUsMHg5NiwweGQyLDB4YjQgfSwgeyAweGU3LDB4OWIsMHhkOSwweGJhIH0sIAorICAgIHsgMHgzYiwweGJiLDB4N2IsMHhkYiB9LCB7IDB4MzIsMHhiNiwweDcwLDB4ZDUgfSwKKyAgICB7IDB4MjksMHhhMSwweDZkLDB4YzcgfSwgeyAweDIwLDB4YWMsMHg2NiwweGM5IH0sIAorICAgIHsgMHgxZiwweDhmLDB4NTcsMHhlMyB9LCB7IDB4MTYsMHg4MiwweDVjLDB4ZWQgfSwKKyAgICB7IDB4MGQsMHg5NSwweDQxLDB4ZmYgfSwgeyAweDA0LDB4OTgsMHg0YSwweGYxIH0sIAorICAgIHsgMHg3MywweGQzLDB4MjMsMHhhYiB9LCB7IDB4N2EsMHhkZSwweDI4LDB4YTUgfSwKKyAgICB7IDB4NjEsMHhjOSwweDM1LDB4YjcgfSwgeyAweDY4LDB4YzQsMHgzZSwweGI5IH0sIAorICAgIHsgMHg1NywweGU3LDB4MGYsMHg5MyB9LCB7IDB4NWUsMHhlYSwweDA0LDB4OWQgfSwKKyAgICB7IDB4NDUsMHhmZCwweDE5LDB4OGYgfSwgeyAweDRjLDB4ZjAsMHgxMiwweDgxIH0sIAorICAgIHsgMHhhYiwweDZiLDB4Y2IsMHgzYiB9LCB7IDB4YTIsMHg2NiwweGMwLDB4MzUgfSwKKyAgICB7IDB4YjksMHg3MSwweGRkLDB4MjcgfSwgeyAweGIwLDB4N2MsMHhkNiwweDI5IH0sIAorICAgIHsgMHg4ZiwweDVmLDB4ZTcsMHgwMyB9LCB7IDB4ODYsMHg1MiwweGVjLDB4MGQgfSwKKyAgICB7IDB4OWQsMHg0NSwweGYxLDB4MWYgfSwgeyAweDk0LDB4NDgsMHhmYSwweDExIH0sIAorICAgIHsgMHhlMywweDAzLDB4OTMsMHg0YiB9LCB7IDB4ZWEsMHgwZSwweDk4LDB4NDUgfSwKKyAgICB7IDB4ZjEsMHgxOSwweDg1LDB4NTcgfSwgeyAweGY4LDB4MTQsMHg4ZSwweDU5IH0sIAorICAgIHsgMHhjNywweDM3LDB4YmYsMHg3MyB9LCB7IDB4Y2UsMHgzYSwweGI0LDB4N2QgfSwKKyAgICB7IDB4ZDUsMHgyZCwweGE5LDB4NmYgfSwgeyAweGRjLDB4MjAsMHhhMiwweDYxIH0sIAorICAgIHsgMHg3NiwweDZkLDB4ZjYsMHhhZCB9LCB7IDB4N2YsMHg2MCwweGZkLDB4YTMgfSwKKyAgICB7IDB4NjQsMHg3NywweGUwLDB4YjEgfSwgeyAweDZkLDB4N2EsMHhlYiwweGJmIH0sIAorICAgIHsgMHg1MiwweDU5LDB4ZGEsMHg5NSB9LCB7IDB4NWIsMHg1NCwweGQxLDB4OWIgfSwKKyAgICB7IDB4NDAsMHg0MywweGNjLDB4ODkgfSwgeyAweDQ5LDB4NGUsMHhjNywweDg3IH0sIAorICAgIHsgMHgzZSwweDA1LDB4YWUsMHhkZCB9LCB7IDB4MzcsMHgwOCwweGE1LDB4ZDMgfSwKKyAgICB7IDB4MmMsMHgxZiwweGI4LDB4YzEgfSwgeyAweDI1LDB4MTIsMHhiMywweGNmIH0sIAorICAgIHsgMHgxYSwweDMxLDB4ODIsMHhlNSB9LCB7IDB4MTMsMHgzYywweDg5LDB4ZWIgfSwKKyAgICB7IDB4MDgsMHgyYiwweDk0LDB4ZjkgfSwgeyAweDAxLDB4MjYsMHg5ZiwweGY3IH0sIAorICAgIHsgMHhlNiwweGJkLDB4NDYsMHg0ZCB9LCB7IDB4ZWYsMHhiMCwweDRkLDB4NDMgfSwKKyAgICB7IDB4ZjQsMHhhNywweDUwLDB4NTEgfSwgeyAweGZkLDB4YWEsMHg1YiwweDVmIH0sIAorICAgIHsgMHhjMiwweDg5LDB4NmEsMHg3NSB9LCB7IDB4Y2IsMHg4NCwweDYxLDB4N2IgfSwKKyAgICB7IDB4ZDAsMHg5MywweDdjLDB4NjkgfSwgeyAweGQ5LDB4OWUsMHg3NywweDY3IH0sIAorICAgIHsgMHhhZSwweGQ1LDB4MWUsMHgzZCB9LCB7IDB4YTcsMHhkOCwweDE1LDB4MzMgfSwKKyAgICB7IDB4YmMsMHhjZiwweDA4LDB4MjEgfSwgeyAweGI1LDB4YzIsMHgwMywweDJmIH0sIAorICAgIHsgMHg4YSwweGUxLDB4MzIsMHgwNSB9LCB7IDB4ODMsMHhlYywweDM5LDB4MGIgfSwKKyAgICB7IDB4OTgsMHhmYiwweDI0LDB4MTkgfSwgeyAweDkxLDB4ZjYsMHgyZiwweDE3IH0sIAorICAgIHsgMHg0ZCwweGQ2LDB4OGQsMHg3NiB9LCB7IDB4NDQsMHhkYiwweDg2LDB4NzggfSwKKyAgICB7IDB4NWYsMHhjYywweDliLDB4NmEgfSwgeyAweDU2LDB4YzEsMHg5MCwweDY0IH0sIAorICAgIHsgMHg2OSwweGUyLDB4YTEsMHg0ZSB9LCB7IDB4NjAsMHhlZiwweGFhLDB4NDAgfSwKKyAgICB7IDB4N2IsMHhmOCwweGI3LDB4NTIgfSwgeyAweDcyLDB4ZjUsMHhiYywweDVjIH0sIAorICAgIHsgMHgwNSwweGJlLDB4ZDUsMHgwNiB9LCB7IDB4MGMsMHhiMywweGRlLDB4MDggfSwKKyAgICB7IDB4MTcsMHhhNCwweGMzLDB4MWEgfSwgeyAweDFlLDB4YTksMHhjOCwweDE0IH0sIAorICAgIHsgMHgyMSwweDhhLDB4ZjksMHgzZSB9LCB7IDB4MjgsMHg4NywweGYyLDB4MzAgfSwKKyAgICB7IDB4MzMsMHg5MCwweGVmLDB4MjIgfSwgeyAweDNhLDB4OWQsMHhlNCwweDJjIH0sIAorICAgIHsgMHhkZCwweDA2LDB4M2QsMHg5NiB9LCB7IDB4ZDQsMHgwYiwweDM2LDB4OTggfSwKKyAgICB7IDB4Y2YsMHgxYywweDJiLDB4OGEgfSwgeyAweGM2LDB4MTEsMHgyMCwweDg0IH0sIAorICAgIHsgMHhmOSwweDMyLDB4MTEsMHhhZSB9LCB7IDB4ZjAsMHgzZiwweDFhLDB4YTAgfSwKKyAgICB7IDB4ZWIsMHgyOCwweDA3LDB4YjIgfSwgeyAweGUyLDB4MjUsMHgwYywweGJjIH0sIAorICAgIHsgMHg5NSwweDZlLDB4NjUsMHhlNiB9LCB7IDB4OWMsMHg2MywweDZlLDB4ZTggfSwKKyAgICB7IDB4ODcsMHg3NCwweDczLDB4ZmEgfSwgeyAweDhlLDB4NzksMHg3OCwweGY0IH0sIAorICAgIHsgMHhiMSwweDVhLDB4NDksMHhkZSB9LCB7IDB4YjgsMHg1NywweDQyLDB4ZDAgfSwKKyAgICB7IDB4YTMsMHg0MCwweDVmLDB4YzIgfSwgeyAweGFhLDB4NGQsMHg1NCwweGNjIH0sIAorICAgIHsgMHhlYywweGRhLDB4ZjcsMHg0MSB9LCB7IDB4ZTUsMHhkNywweGZjLDB4NGYgfSwKKyAgICB7IDB4ZmUsMHhjMCwweGUxLDB4NWQgfSwgeyAweGY3LDB4Y2QsMHhlYSwweDUzIH0sIAorICAgIHsgMHhjOCwweGVlLDB4ZGIsMHg3OSB9LCB7IDB4YzEsMHhlMywweGQwLDB4NzcgfSwKKyAgICB7IDB4ZGEsMHhmNCwweGNkLDB4NjUgfSwgeyAweGQzLDB4ZjksMHhjNiwweDZiIH0sIAorICAgIHsgMHhhNCwweGIyLDB4YWYsMHgzMSB9LCB7IDB4YWQsMHhiZiwweGE0LDB4M2YgfSwKKyAgICB7IDB4YjYsMHhhOCwweGI5LDB4MmQgfSwgeyAweGJmLDB4YTUsMHhiMiwweDIzIH0sIAorICAgIHsgMHg4MCwweDg2LDB4ODMsMHgwOSB9LCB7IDB4ODksMHg4YiwweDg4LDB4MDcgfSwKKyAgICB7IDB4OTIsMHg5YywweDk1LDB4MTUgfSwgeyAweDliLDB4OTEsMHg5ZSwweDFiIH0sIAorICAgIHsgMHg3YywweDBhLDB4NDcsMHhhMSB9LCB7IDB4NzUsMHgwNywweDRjLDB4YWYgfSwKKyAgICB7IDB4NmUsMHgxMCwweDUxLDB4YmQgfSwgeyAweDY3LDB4MWQsMHg1YSwweGIzIH0sIAorICAgIHsgMHg1OCwweDNlLDB4NmIsMHg5OSB9LCB7IDB4NTEsMHgzMywweDYwLDB4OTcgfSwKKyAgICB7IDB4NGEsMHgyNCwweDdkLDB4ODUgfSwgeyAweDQzLDB4MjksMHg3NiwweDhiIH0sIAorICAgIHsgMHgzNCwweDYyLDB4MWYsMHhkMSB9LCB7IDB4M2QsMHg2ZiwweDE0LDB4ZGYgfSwKKyAgICB7IDB4MjYsMHg3OCwweDA5LDB4Y2QgfSwgeyAweDJmLDB4NzUsMHgwMiwweGMzIH0sIAorICAgIHsgMHgxMCwweDU2LDB4MzMsMHhlOSB9LCB7IDB4MTksMHg1YiwweDM4LDB4ZTcgfSwKKyAgICB7IDB4MDIsMHg0YywweDI1LDB4ZjUgfSwgeyAweDBiLDB4NDEsMHgyZSwweGZiIH0sIAorICAgIHsgMHhkNywweDYxLDB4OGMsMHg5YSB9LCB7IDB4ZGUsMHg2YywweDg3LDB4OTQgfSwKKyAgICB7IDB4YzUsMHg3YiwweDlhLDB4ODYgfSwgeyAweGNjLDB4NzYsMHg5MSwweDg4IH0sIAorICAgIHsgMHhmMywweDU1LDB4YTAsMHhhMiB9LCB7IDB4ZmEsMHg1OCwweGFiLDB4YWMgfSwKKyAgICB7IDB4ZTEsMHg0ZiwweGI2LDB4YmUgfSwgeyAweGU4LDB4NDIsMHhiZCwweGIwIH0sIAorICAgIHsgMHg5ZiwweDA5LDB4ZDQsMHhlYSB9LCB7IDB4OTYsMHgwNCwweGRmLDB4ZTQgfSwKKyAgICB7IDB4OGQsMHgxMywweGMyLDB4ZjYgfSwgeyAweDg0LDB4MWUsMHhjOSwweGY4IH0sIAorICAgIHsgMHhiYiwweDNkLDB4ZjgsMHhkMiB9LCB7IDB4YjIsMHgzMCwweGYzLDB4ZGMgfSwKKyAgICB7IDB4YTksMHgyNywweGVlLDB4Y2UgfSwgeyAweGEwLDB4MmEsMHhlNSwweGMwIH0sIAorICAgIHsgMHg0NywweGIxLDB4M2MsMHg3YSB9LCB7IDB4NGUsMHhiYywweDM3LDB4NzQgfSwKKyAgICB7IDB4NTUsMHhhYiwweDJhLDB4NjYgfSwgeyAweDVjLDB4YTYsMHgyMSwweDY4IH0sIAorICAgIHsgMHg2MywweDg1LDB4MTAsMHg0MiB9LCB7IDB4NmEsMHg4OCwweDFiLDB4NGMgfSwKKyAgICB7IDB4NzEsMHg5ZiwweDA2LDB4NWUgfSwgeyAweDc4LDB4OTIsMHgwZCwweDUwIH0sIAorICAgIHsgMHgwZiwweGQ5LDB4NjQsMHgwYSB9LCB7IDB4MDYsMHhkNCwweDZmLDB4MDQgfSwKKyAgICB7IDB4MWQsMHhjMywweDcyLDB4MTYgfSwgeyAweDE0LDB4Y2UsMHg3OSwweDE4IH0sIAorICAgIHsgMHgyYiwweGVkLDB4NDgsMHgzMiB9LCB7IDB4MjIsMHhlMCwweDQzLDB4M2MgfSwKKyAgICB7IDB4MzksMHhmNywweDVlLDB4MmUgfSwgeyAweDMwLDB4ZmEsMHg1NSwweDIwIH0sIAorICAgIHsgMHg5YSwweGI3LDB4MDEsMHhlYyB9LCB7IDB4OTMsMHhiYSwweDBhLDB4ZTIgfSwgCisgICAgeyAweDg4LDB4YWQsMHgxNywweGYwIH0sIHsgMHg4MSwweGEwLDB4MWMsMHhmZSB9LCAKKyAgICB7IDB4YmUsMHg4MywweDJkLDB4ZDQgfSwgeyAweGI3LDB4OGUsMHgyNiwweGRhIH0sCisgICAgeyAweGFjLDB4OTksMHgzYiwweGM4IH0sIHsgMHhhNSwweDk0LDB4MzAsMHhjNiB9LCAKKyAgICB7IDB4ZDIsMHhkZiwweDU5LDB4OWMgfSwgeyAweGRiLDB4ZDIsMHg1MiwweDkyIH0sIAorICAgIHsgMHhjMCwweGM1LDB4NGYsMHg4MCB9LCB7IDB4YzksMHhjOCwweDQ0LDB4OGUgfSwgCisgICAgeyAweGY2LDB4ZWIsMHg3NSwweGE0IH0sIHsgMHhmZiwweGU2LDB4N2UsMHhhYSB9LAorICAgIHsgMHhlNCwweGYxLDB4NjMsMHhiOCB9LCB7IDB4ZWQsMHhmYywweDY4LDB4YjYgfSwgCisgICAgeyAweDBhLDB4NjcsMHhiMSwweDBjIH0sIHsgMHgwMywweDZhLDB4YmEsMHgwMiB9LAorICAgIHsgMHgxOCwweDdkLDB4YTcsMHgxMCB9LCB7IDB4MTEsMHg3MCwweGFjLDB4MWUgfSwgCisgICAgeyAweDJlLDB4NTMsMHg5ZCwweDM0IH0sIHsgMHgyNywweDVlLDB4OTYsMHgzYSB9LAorICAgIHsgMHgzYywweDQ5LDB4OGIsMHgyOCB9LCB7IDB4MzUsMHg0NCwweDgwLDB4MjYgfSwgCisgICAgeyAweDQyLDB4MGYsMHhlOSwweDdjIH0sIHsgMHg0YiwweDAyLDB4ZTIsMHg3MiB9LCAKKyAgICB7IDB4NTAsMHgxNSwweGZmLDB4NjAgfSwgeyAweDU5LDB4MTgsMHhmNCwweDZlIH0sIAorICAgIHsgMHg2NiwweDNiLDB4YzUsMHg0NCB9LCB7IDB4NmYsMHgzNiwweGNlLDB4NGEgfSwKKyAgICB7IDB4NzQsMHgyMSwweGQzLDB4NTggfSwgeyAweDdkLDB4MmMsMHhkOCwweDU2IH0sIAorICAgIHsgMHhhMSwweDBjLDB4N2EsMHgzNyB9LCB7IDB4YTgsMHgwMSwweDcxLDB4MzkgfSwKKyAgICB7IDB4YjMsMHgxNiwweDZjLDB4MmIgfSwgeyAweGJhLDB4MWIsMHg2NywweDI1IH0sIAorICAgIHsgMHg4NSwweDM4LDB4NTYsMHgwZiB9LCB7IDB4OGMsMHgzNSwweDVkLDB4MDEgfSwKKyAgICB7IDB4OTcsMHgyMiwweDQwLDB4MTMgfSwgeyAweDllLDB4MmYsMHg0YiwweDFkIH0sIAorICAgIHsgMHhlOSwweDY0LDB4MjIsMHg0NyB9LCB7IDB4ZTAsMHg2OSwweDI5LDB4NDkgfSwgCisgICAgeyAweGZiLDB4N2UsMHgzNCwweDViIH0sIHsgMHhmMiwweDczLDB4M2YsMHg1NSB9LCAKKyAgICB7IDB4Y2QsMHg1MCwweDBlLDB4N2YgfSwgeyAweGM0LDB4NWQsMHgwNSwweDcxIH0sCisgICAgeyAweGRmLDB4NGEsMHgxOCwweDYzIH0sIHsgMHhkNiwweDQ3LDB4MTMsMHg2ZCB9LCAKKyAgICB7IDB4MzEsMHhkYywweGNhLDB4ZDcgfSwgeyAweDM4LDB4ZDEsMHhjMSwweGQ5IH0sCisgICAgeyAweDIzLDB4YzYsMHhkYywweGNiIH0sIHsgMHgyYSwweGNiLDB4ZDcsMHhjNSB9LCAKKyAgICB7IDB4MTUsMHhlOCwweGU2LDB4ZWYgfSwgeyAweDFjLDB4ZTUsMHhlZCwweGUxIH0sCisgICAgeyAweDA3LDB4ZjIsMHhmMCwweGYzIH0sIHsgMHgwZSwweGZmLDB4ZmIsMHhmZCB9LCAKKyAgICB7IDB4NzksMHhiNCwweDkyLDB4YTcgfSwgeyAweDcwLDB4YjksMHg5OSwweGE5IH0sCisgICAgeyAweDZiLDB4YWUsMHg4NCwweGJiIH0sIHsgMHg2MiwweGEzLDB4OGYsMHhiNSB9LCAKKyAgICB7IDB4NWQsMHg4MCwweGJlLDB4OWYgfSwgeyAweDU0LDB4OGQsMHhiNSwweDkxIH0sCisgICAgeyAweDRmLDB4OWEsMHhhOCwweDgzIH0sIHsgMHg0NiwweDk3LDB4YTMsMHg4ZCB9CisgIH07CisKK3N0YXRpYyBjb25zdCB1MzIgcmNvblszMF0gPSAKKyAgeyAKKyAgICAweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwLCAweDFiLCAweDM2LCAweDZjLAorICAgIDB4ZDgsIDB4YWIsIDB4NGQsIDB4OWEsIDB4MmYsIDB4NWUsIDB4YmMsIDB4NjMsIDB4YzYsIDB4OTcsIDB4MzUsCisgICAgMHg2YSwgMHhkNCwgMHhiMywgMHg3ZCwgMHhmYSwgMHhlZiwgMHhjNSwgMHg5MQorICB9OworCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvY2lwaGVyL3Jpam5kYWVsLmMgYi9saWJnY3J5cHQtMS40LjYvY2lwaGVyL3Jpam5kYWVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQzYjM0OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9jaXBoZXIvcmlqbmRhZWwuYwpAQCAtMCwwICsxLDEyNTMgQEAKKy8qIFJpam5kYWVsIChBRVMpIGZvciBHbnVQRworICogQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA3LAorICogICAgICAgICAgICAgICAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGUgY29kZSBoZXJlIGlzIGJhc2VkIG9uIHRoZSBvcHRpbWl6ZWQgaW1wbGVtZW50YXRpb24gdGFrZW4gZnJvbQorICogaHR0cDovL3d3dy5lc2F0Lmt1bGV1dmVuLmFjLmJlL35yaWptZW4vcmlqbmRhZWwvIG9uIE9jdCAyLCAyMDAwLAorICogd2hpY2ggY2FycmllcyB0aGlzIG5vdGljZToKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiByaWpuZGFlbC1hbGctZnN0LmMgICB2Mi4zICAgQXByaWwgJzIwMDAKKyAqCisgKiBPcHRpbWlzZWQgQU5TSSBDIGNvZGUKKyAqCisgKiBhdXRob3JzOiB2MS4wOiBBbnRvb24gQm9zc2VsYWVycworICogICAgICAgICAgdjIuMDogVmluY2VudCBSaWptZW4KKyAqICAgICAgICAgIHYyLjM6IFBhdWxvIEJhcnJldG8KKyAqCisgKiBUaGlzIGNvZGUgaXMgcGxhY2VkIGluIHRoZSBwdWJsaWMgZG9tYWluLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBUaGUgU1A4MDAtMzhhIGRvY3VtZW50IGlzIGF2YWlsYWJsZSBhdDoKKyAqICAgaHR0cDovL2NzcmMubmlzdC5nb3YvcHVibGljYXRpb25zL25pc3RwdWJzLzgwMC0zOGEvc3A4MDAtMzhhLnBkZgorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4gLyogZm9yIG1lbWNtcCgpICovCisKKyNpbmNsdWRlICJ0eXBlcy5oIiAgLyogZm9yIGJ5dGUgYW5kIHUzMiB0eXBlZGVmcyAqLworI2luY2x1ZGUgImcxMGxpYi5oIgorI2luY2x1ZGUgImNpcGhlci5oIgorCisjZGVmaW5lIE1BWEtDCQkJKDI1Ni8zMikKKyNkZWZpbmUgTUFYUk9VTkRTCQkxNAorI2RlZmluZSBCTE9DS1NJWkUgICAgICAgICAgICAgICAoMTI4LzgpCisKKworLyogVVNFX1BBRExPQ0sgaW5kaWNhdGVzIHdoZXRoZXIgdG8gY29tcGlsZSB0aGUgcGFkbG9jayBzcGVjaWZpYworICAgY29kZS4gICovCisjdW5kZWYgVVNFX1BBRExPQ0sKKyNpZmRlZiBFTkFCTEVfUEFETE9DS19TVVBQT1JUCisjIGlmIGRlZmluZWQgKF9faTM4Nl9fKSAmJiBTSVpFT0ZfVU5TSUdORURfTE9ORyA9PSA0ICYmIGRlZmluZWQgKF9fR05VQ19fKQorIyBkZWZpbmUgVVNFX1BBRExPQ0sKKyMgZW5kaWYKKyNlbmRpZiAvKkVOQUJMRV9QQURMT0NLX1NVUFBPUlQqLworCitzdGF0aWMgY29uc3QgY2hhciAqc2VsZnRlc3Qodm9pZCk7CisKK3R5cGVkZWYgc3RydWN0IAoreworICBpbnQgICBST1VORFM7ICAgICAgICAgICAgIC8qIEtleS1sZW5ndGgtZGVwZW5kZW50IG51bWJlciBvZiByb3VuZHMuICAqLworICBpbnQgZGVjcnlwdGlvbl9wcmVwYXJlZDsgIC8qIFRoZSBkZWNyeXB0aW9uIGtleSBzY2hlZHVsZSBpcyBhdmFpbGFibGUuICAqLworI2lmZGVmIFVTRV9QQURMT0NLCisgIGludCB1c2VfcGFkbG9jazsgICAgICAgICAgLyogUGFkbG9jayBzaGFsbCBiZSB1c2VkLiAgKi8KKyAgLyogVGhlIGtleSBhcyBwYXNzZWQgdG8gdGhlIHBhZGxvY2sgZW5naW5lLiAgKi8KKyAgdW5zaWduZWQgY2hhciBwYWRsb2NrX2tleVsxNl0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDE2KSkpOworI2VuZGlmCisgIHVuaW9uCisgIHsKKyAgICBQUk9QRVJMWV9BTElHTkVEX1RZUEUgZHVtbXk7CisgICAgYnl0ZSBrZXlzY2hlZHVsZVtNQVhST1VORFMrMV1bNF1bNF07CisgIH0gdTE7CisgIHVuaW9uCisgIHsKKyAgICBQUk9QRVJMWV9BTElHTkVEX1RZUEUgZHVtbXk7CisgICAgYnl0ZSBrZXlzY2hlZHVsZVtNQVhST1VORFMrMV1bNF1bNF07CQorICB9IHUyOworfSBSSUpOREFFTF9jb250ZXh0OworCisjZGVmaW5lIGtleVNjaGVkICB1MS5rZXlzY2hlZHVsZQorI2RlZmluZSBrZXlTY2hlZDIgdTIua2V5c2NoZWR1bGUKKworLyogQWxsIHRoZSBudW1iZXJzLiAgKi8KKyNpbmNsdWRlICJyaWpuZGFlbC10YWJsZXMuaCIKKworCisvKiBQZXJmb3JtIHRoZSBrZXkgc2V0dXAuICAqLyAgCitzdGF0aWMgZ2NyeV9lcnJfY29kZV90Citkb19zZXRrZXkgKFJJSk5EQUVMX2NvbnRleHQgKmN0eCwgY29uc3QgYnl0ZSAqa2V5LCBjb25zdCB1bnNpZ25lZCBrZXlsZW4pCit7CisgIHN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOworICBzdGF0aWMgY29uc3QgY2hhciAqc2VsZnRlc3RfZmFpbGVkPTA7CisgIGludCBST1VORFM7CisgIGludCBpLGosIHIsIHQsIHJjb25wb2ludGVyID0gMDsKKyAgaW50IEtDOworICB1bmlvbgorICB7CisgICAgUFJPUEVSTFlfQUxJR05FRF9UWVBFIGR1bW15OworICAgIGJ5dGUga1tNQVhLQ11bNF07CisgIH0gazsKKyNkZWZpbmUgayBrLmsKKyAgdW5pb24KKyAgeworICAgIFBST1BFUkxZX0FMSUdORURfVFlQRSBkdW1teTsKKyAgICBieXRlIHRrW01BWEtDXVs0XTsKKyAgfSB0azsKKyNkZWZpbmUgdGsgdGsudGsgIAorCisgIC8qIFRoZSBvbi10aGUtZmx5IHNlbGYgdGVzdHMgYXJlIG9ubHkgcnVuIGluIG5vbi1maXBzIG1vZGUuIEluIGZpcHMKKyAgICAgbW9kZSBleHBsaWNpdCBzZWxmLXRlc3RzIGFyZSByZXF1aXJlZC4gIEFjdHVhbGx5IHRoZSBvbi10aGUtZmx5CisgICAgIHNlbGYtdGVzdHMgYXJlIG5vdCBmdWxseSB0aHJlYWQtc2FmZSBhbmQgaXQgbWlnaHQgaGFwcGVuIHRoYXQgYQorICAgICBmYWlsZWQgc2VsZi10ZXN0IHdvbid0IGdldCBub3RpY2VkIGluIGFub3RoZXIgdGhyZWFkLiAgCisKKyAgICAgRklYTUU6IFdlIG1pZ2h0IHdhbnQgdG8gaGF2ZSBhIGNlbnRyYWwgcmVnaXN0cnkgb2Ygc3VjY2VlZGVkCisgICAgIHNlbGYtdGVzdHMuICovCisgIGlmICghZmlwc19tb2RlICgpICYmICFpbml0aWFsaXplZCkKKyAgICB7CisgICAgICBpbml0aWFsaXplZCA9IDE7CisgICAgICBzZWxmdGVzdF9mYWlsZWQgPSBzZWxmdGVzdCAoKTsKKyAgICAgIGlmIChzZWxmdGVzdF9mYWlsZWQpCisgICAgICAgIGxvZ19lcnJvciAoIiVzXG4iLCBzZWxmdGVzdF9mYWlsZWQgKTsKKyAgICB9CisgIGlmIChzZWxmdGVzdF9mYWlsZWQpCisgICAgcmV0dXJuIEdQR19FUlJfU0VMRlRFU1RfRkFJTEVEOworCisgIGN0eC0+ZGVjcnlwdGlvbl9wcmVwYXJlZCA9IDA7CisjaWZkZWYgVVNFX1BBRExPQ0sKKyAgY3R4LT51c2VfcGFkbG9jayA9IDA7CisjZW5kaWYKKworICBpZigga2V5bGVuID09IDEyOC84ICkKKyAgICB7CisgICAgICBST1VORFMgPSAxMDsKKyAgICAgIEtDID0gNDsKKyNpZmRlZiBVU0VfUEFETE9DSworICAgICAgaWYgKChfZ2NyeV9nZXRfaHdfZmVhdHVyZXMgKCkgJiBIV0ZfUEFETE9DS19BRVMpKQorICAgICAgICB7CisgICAgICAgICAgY3R4LT51c2VfcGFkbG9jayA9IDE7CisgICAgICAgICAgbWVtY3B5IChjdHgtPnBhZGxvY2tfa2V5LCBrZXksIGtleWxlbik7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgZWxzZSBpZiAoIGtleWxlbiA9PSAxOTIvOCApCisgICAgeworICAgICAgUk9VTkRTID0gMTI7CisgICAgICBLQyA9IDY7CisgICAgfQorICBlbHNlIGlmICgga2V5bGVuID09IDI1Ni84ICkKKyAgICB7CisgICAgICBST1VORFMgPSAxNDsKKyAgICAgIEtDID0gODsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gR1BHX0VSUl9JTlZfS0VZTEVOOworCisgIGN0eC0+Uk9VTkRTID0gUk9VTkRTOworCisjaWZkZWYgVVNFX1BBRExPQ0sKKyAgaWYgKGN0eC0+dXNlX3BhZGxvY2spCisgICAgeworICAgICAgLyogTm90aGluZyB0byBkbyBhcyB3ZSBzdXBwb3J0IG9ubHkgaGFyZHdhcmUga2V5IGdlbmVyYXRpb24gZm9yCisgICAgICAgICBub3cuICAqLworICAgIH0KKyAgZWxzZQorI2VuZGlmIC8qVVNFX1BBRExPQ0sqLworICAgIHsKKyNkZWZpbmUgVyAoY3R4LT5rZXlTY2hlZCkKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBrZXlsZW47IGkrKykgCisgICAgICAgIHsKKyAgICAgICAgICBrW2kgPj4gMl1baSAmIDNdID0ga2V5W2ldOyAKKyAgICAgICAgfQorICAgICAgCisgICAgICBmb3IgKGogPSBLQy0xOyBqID49IDA7IGotLSkgCisgICAgICAgIHsKKyAgICAgICAgICAqKCh1MzIqKXRrW2pdKSA9ICooKHUzMiopa1tqXSk7CisgICAgICAgIH0KKyAgICAgIHIgPSAwOworICAgICAgdCA9IDA7CisgICAgICAvKiBDb3B5IHZhbHVlcyBpbnRvIHJvdW5kIGtleSBhcnJheS4gICovCisgICAgICBmb3IgKGogPSAwOyAoaiA8IEtDKSAmJiAociA8IFJPVU5EUyArIDEpOyApCisgICAgICAgIHsKKyAgICAgICAgICBmb3IgKDsgKGogPCBLQykgJiYgKHQgPCA0KTsgaisrLCB0KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICooKHUzMiopV1tyXVt0XSkgPSAqKCh1MzIqKXRrW2pdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBpZiAodCA9PSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICByKys7CisgICAgICAgICAgICAgIHQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAKKyAgICAgIHdoaWxlIChyIDwgUk9VTkRTICsgMSkKKyAgICAgICAgeworICAgICAgICAgIC8qIFdoaWxlIG5vdCBlbm91Z2ggcm91bmQga2V5IG1hdGVyaWFsIGNhbGN1bGF0ZWQgY2FsY3VsYXRlCisgICAgICAgICAgICAgbmV3IHZhbHVlcy4gICovCisgICAgICAgICAgdGtbMF1bMF0gXj0gU1t0a1tLQy0xXVsxXV07CisgICAgICAgICAgdGtbMF1bMV0gXj0gU1t0a1tLQy0xXVsyXV07CisgICAgICAgICAgdGtbMF1bMl0gXj0gU1t0a1tLQy0xXVszXV07CisgICAgICAgICAgdGtbMF1bM10gXj0gU1t0a1tLQy0xXVswXV07CisgICAgICAgICAgdGtbMF1bMF0gXj0gcmNvbltyY29ucG9pbnRlcisrXTsKKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoS0MgIT0gOCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZm9yIChqID0gMTsgaiA8IEtDOyBqKyspIAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICooKHUzMiopdGtbal0pIF49ICooKHUzMiopdGtbai0xXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSAKKyAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmb3IgKGogPSAxOyBqIDwgS0MvMjsgaisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICooKHUzMiopdGtbal0pIF49ICooKHUzMiopdGtbai0xXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB0a1tLQy8yXVswXSBePSBTW3RrW0tDLzIgLSAxXVswXV07CisgICAgICAgICAgICAgIHRrW0tDLzJdWzFdIF49IFNbdGtbS0MvMiAtIDFdWzFdXTsKKyAgICAgICAgICAgICAgdGtbS0MvMl1bMl0gXj0gU1t0a1tLQy8yIC0gMV1bMl1dOworICAgICAgICAgICAgICB0a1tLQy8yXVszXSBePSBTW3RrW0tDLzIgLSAxXVszXV07CisgICAgICAgICAgICAgIGZvciAoaiA9IEtDLzIgKyAxOyBqIDwgS0M7IGorKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAqKCh1MzIqKXRrW2pdKSBePSAqKCh1MzIqKXRrW2otMV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICAvKiBDb3B5IHZhbHVlcyBpbnRvIHJvdW5kIGtleSBhcnJheS4gICovCisgICAgICAgICAgZm9yIChqID0gMDsgKGogPCBLQykgJiYgKHIgPCBST1VORFMgKyAxKTsgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmb3IgKDsgKGogPCBLQykgJiYgKHQgPCA0KTsgaisrLCB0KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgKigodTMyKilXW3JdW3RdKSA9ICooKHUzMiopdGtbal0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYgKHQgPT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICByKys7CisgICAgICAgICAgICAgICAgICB0ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0JCQorI3VuZGVmIFcgICAgCisgICAgfQorCisgIHJldHVybiAwOworI3VuZGVmIHRrCisjdW5kZWYgaworfQorCisKK3N0YXRpYyBnY3J5X2Vycl9jb2RlX3QKK3Jpam5kYWVsX3NldGtleSAodm9pZCAqY29udGV4dCwgY29uc3QgYnl0ZSAqa2V5LCBjb25zdCB1bnNpZ25lZCBrZXlsZW4pCit7CisgIFJJSk5EQUVMX2NvbnRleHQgKmN0eCA9IGNvbnRleHQ7CisKKyAgaW50IHJjID0gZG9fc2V0a2V5IChjdHgsIGtleSwga2V5bGVuKTsKKyAgX2djcnlfYnVybl9zdGFjayAoIDEwMCArIDE2KnNpemVvZihpbnQpKTsKKyAgcmV0dXJuIHJjOworfQorCisKKy8qIE1ha2UgYSBkZWNyeXB0aW9uIGtleSBmcm9tIGFuIGVuY3J5cHRpb24ga2V5LiAqLworc3RhdGljIHZvaWQKK3ByZXBhcmVfZGVjcnlwdGlvbiggUklKTkRBRUxfY29udGV4dCAqY3R4ICkKK3sKKyAgaW50IHI7CisgIHVuaW9uCisgIHsKKyAgICBQUk9QRVJMWV9BTElHTkVEX1RZUEUgZHVtbXk7CisgICAgYnl0ZSAqdzsKKyAgfSB3OworI2RlZmluZSB3IHcudworCisgIGZvciAocj0wOyByIDwgTUFYUk9VTkRTKzE7IHIrKyApCisgICAgeworICAgICAgKigodTMyKiljdHgtPmtleVNjaGVkMltyXVswXSkgPSAqKCh1MzIqKWN0eC0+a2V5U2NoZWRbcl1bMF0pOworICAgICAgKigodTMyKiljdHgtPmtleVNjaGVkMltyXVsxXSkgPSAqKCh1MzIqKWN0eC0+a2V5U2NoZWRbcl1bMV0pOworICAgICAgKigodTMyKiljdHgtPmtleVNjaGVkMltyXVsyXSkgPSAqKCh1MzIqKWN0eC0+a2V5U2NoZWRbcl1bMl0pOworICAgICAgKigodTMyKiljdHgtPmtleVNjaGVkMltyXVszXSkgPSAqKCh1MzIqKWN0eC0+a2V5U2NoZWRbcl1bM10pOworICAgIH0KKyNkZWZpbmUgVyAoY3R4LT5rZXlTY2hlZDIpCisgIGZvciAociA9IDE7IHIgPCBjdHgtPlJPVU5EUzsgcisrKQorICAgIHsKKyAgICAgIHcgPSBXW3JdWzBdOworICAgICAgKigodTMyKil3KSA9ICooKHUzMiopVTFbd1swXV0pIF4gKigodTMyKilVMlt3WzFdXSkKKyAgICAgICAgXiAqKCh1MzIqKVUzW3dbMl1dKSBeICooKHUzMiopVTRbd1szXV0pOworICAgICAgIAorICAgICAgdyA9IFdbcl1bMV07CisgICAgICAqKCh1MzIqKXcpID0gKigodTMyKilVMVt3WzBdXSkgXiAqKCh1MzIqKVUyW3dbMV1dKQorICAgICAgICBeICooKHUzMiopVTNbd1syXV0pIF4gKigodTMyKilVNFt3WzNdXSk7CisgICAgICAgIAorICAgICAgdyA9IFdbcl1bMl07CisgICAgICAqKCh1MzIqKXcpID0gKigodTMyKilVMVt3WzBdXSkgXiAqKCh1MzIqKVUyW3dbMV1dKQorICAgICAgICBeICooKHUzMiopVTNbd1syXV0pIF4gKigodTMyKilVNFt3WzNdXSk7CisgICAgICAgIAorICAgICAgdyA9IFdbcl1bM107CisgICAgICAqKCh1MzIqKXcpID0gKigodTMyKilVMVt3WzBdXSkgXiAqKCh1MzIqKVUyW3dbMV1dKQorICAgICAgICBeICooKHUzMiopVTNbd1syXV0pIF4gKigodTMyKilVNFt3WzNdXSk7CisgICAgfQorI3VuZGVmIFcKKyN1bmRlZiB3Cit9CQorCisKKwwKKy8qIEVuY3J5cHQgb25lIGJsb2NrLiAgQSBhbmQgQiBuZWVkIHRvIGJlIGFsaWduZWQgb24gYSA0IGJ5dGUKKyAgIGJvdW5kYXJ5LiAgQSBhbmQgQiBtYXkgYmUgdGhlIHNhbWUuICovCitzdGF0aWMgdm9pZAorZG9fZW5jcnlwdF9hbGlnbmVkIChjb25zdCBSSUpOREFFTF9jb250ZXh0ICpjdHgsIAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpiLCBjb25zdCB1bnNpZ25lZCBjaGFyICphKQoreworI2RlZmluZSByayAoY3R4LT5rZXlTY2hlZCkKKyAgaW50IFJPVU5EUyA9IGN0eC0+Uk9VTkRTOworICBpbnQgcjsKKyAgdW5pb24KKyAgeworICAgIHUzMiAgdGVtcHUzMls0XTsgIC8qIEZvcmNlIGNvcnJlY3QgYWxpZ25tZW50LiAqLworICAgIGJ5dGUgdGVtcFs0XVs0XTsKKyAgfSB1OworCisgICooKHUzMiopdS50ZW1wWzBdKSA9ICooKHUzMiopKGEgICApKSBeICooKHUzMiopcmtbMF1bMF0pOworICAqKCh1MzIqKXUudGVtcFsxXSkgPSAqKCh1MzIqKShhKyA0KSkgXiAqKCh1MzIqKXJrWzBdWzFdKTsKKyAgKigodTMyKil1LnRlbXBbMl0pID0gKigodTMyKikoYSsgOCkpIF4gKigodTMyKilya1swXVsyXSk7CisgICooKHUzMiopdS50ZW1wWzNdKSA9ICooKHUzMiopKGErMTIpKSBeICooKHUzMiopcmtbMF1bM10pOworICAqKCh1MzIqKShiICAgICkpICAgPSAoKigodTMyKilUMVt1LnRlbXBbMF1bMF1dKQorICAgICAgICAgICAgICAgICAgICAgICAgXiAqKCh1MzIqKVQyW3UudGVtcFsxXVsxXV0pCisgICAgICAgICAgICAgICAgICAgICAgICBeICooKHUzMiopVDNbdS50ZW1wWzJdWzJdXSkgCisgICAgICAgICAgICAgICAgICAgICAgICBeICooKHUzMiopVDRbdS50ZW1wWzNdWzNdXSkpOworICAqKCh1MzIqKShiICsgNCkpICAgPSAoKigodTMyKilUMVt1LnRlbXBbMV1bMF1dKQorICAgICAgICAgICAgICAgICAgICAgICAgXiAqKCh1MzIqKVQyW3UudGVtcFsyXVsxXV0pCisgICAgICAgICAgICAgICAgICAgICAgICBeICooKHUzMiopVDNbdS50ZW1wWzNdWzJdXSkgCisgICAgICAgICAgICAgICAgICAgICAgICBeICooKHUzMiopVDRbdS50ZW1wWzBdWzNdXSkpOworICAqKCh1MzIqKShiICsgOCkpICAgPSAoKigodTMyKilUMVt1LnRlbXBbMl1bMF1dKQorICAgICAgICAgICAgICAgICAgICAgICAgXiAqKCh1MzIqKVQyW3UudGVtcFszXVsxXV0pCisgICAgICAgICAgICAgICAgICAgICAgICBeICooKHUzMiopVDNbdS50ZW1wWzBdWzJdXSkgCisgICAgICAgICAgICAgICAgICAgICAgICBeICooKHUzMiopVDRbdS50ZW1wWzFdWzNdXSkpOworICAqKCh1MzIqKShiICsxMikpICAgPSAoKigodTMyKilUMVt1LnRlbXBbM11bMF1dKQorICAgICAgICAgICAgICAgICAgICAgICAgXiAqKCh1MzIqKVQyW3UudGVtcFswXVsxXV0pCisgICAgICAgICAgICAgICAgICAgICAgICBeICooKHUzMiopVDNbdS50ZW1wWzFdWzJdXSkgCisgICAgICAgICAgICAgICAgICAgICAgICBeICooKHUzMiopVDRbdS50ZW1wWzJdWzNdXSkpOworCisgIGZvciAociA9IDE7IHIgPCBST1VORFMtMTsgcisrKQorICAgIHsKKyAgICAgICooKHUzMiopdS50ZW1wWzBdKSA9ICooKHUzMiopKGIgICApKSBeICooKHUzMiopcmtbcl1bMF0pOworICAgICAgKigodTMyKil1LnRlbXBbMV0pID0gKigodTMyKikoYisgNCkpIF4gKigodTMyKilya1tyXVsxXSk7CisgICAgICAqKCh1MzIqKXUudGVtcFsyXSkgPSAqKCh1MzIqKShiKyA4KSkgXiAqKCh1MzIqKXJrW3JdWzJdKTsKKyAgICAgICooKHUzMiopdS50ZW1wWzNdKSA9ICooKHUzMiopKGIrMTIpKSBeICooKHUzMiopcmtbcl1bM10pOworCisgICAgICAqKCh1MzIqKShiICAgICkpICAgPSAoKigodTMyKilUMVt1LnRlbXBbMF1bMF1dKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4gKigodTMyKilUMlt1LnRlbXBbMV1bMV1dKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4gKigodTMyKilUM1t1LnRlbXBbMl1bMl1dKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBeICooKHUzMiopVDRbdS50ZW1wWzNdWzNdXSkpOworICAgICAgKigodTMyKikoYiArIDQpKSAgID0gKCooKHUzMiopVDFbdS50ZW1wWzFdWzBdXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBeICooKHUzMiopVDJbdS50ZW1wWzJdWzFdXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBeICooKHUzMiopVDNbdS50ZW1wWzNdWzJdXSkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgXiAqKCh1MzIqKVQ0W3UudGVtcFswXVszXV0pKTsKKyAgICAgICooKHUzMiopKGIgKyA4KSkgICA9ICgqKCh1MzIqKVQxW3UudGVtcFsyXVswXV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgXiAqKCh1MzIqKVQyW3UudGVtcFszXVsxXV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgXiAqKCh1MzIqKVQzW3UudGVtcFswXVsyXV0pIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4gKigodTMyKilUNFt1LnRlbXBbMV1bM11dKSk7CisgICAgICAqKCh1MzIqKShiICsxMikpICAgPSAoKigodTMyKilUMVt1LnRlbXBbM11bMF1dKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4gKigodTMyKilUMlt1LnRlbXBbMF1bMV1dKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4gKigodTMyKilUM1t1LnRlbXBbMV1bMl1dKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBeICooKHUzMiopVDRbdS50ZW1wWzJdWzNdXSkpOworICAgIH0KKworICAvKiBMYXN0IHJvdW5kIGlzIHNwZWNpYWwuICovICAgCisgICooKHUzMiopdS50ZW1wWzBdKSA9ICooKHUzMiopKGIgICApKSBeICooKHUzMiopcmtbUk9VTkRTLTFdWzBdKTsKKyAgKigodTMyKil1LnRlbXBbMV0pID0gKigodTMyKikoYisgNCkpIF4gKigodTMyKilya1tST1VORFMtMV1bMV0pOworICAqKCh1MzIqKXUudGVtcFsyXSkgPSAqKCh1MzIqKShiKyA4KSkgXiAqKCh1MzIqKXJrW1JPVU5EUy0xXVsyXSk7CisgICooKHUzMiopdS50ZW1wWzNdKSA9ICooKHUzMiopKGIrMTIpKSBeICooKHUzMiopcmtbUk9VTkRTLTFdWzNdKTsKKyAgYlsgMF0gPSBUMVt1LnRlbXBbMF1bMF1dWzFdOworICBiWyAxXSA9IFQxW3UudGVtcFsxXVsxXV1bMV07CisgIGJbIDJdID0gVDFbdS50ZW1wWzJdWzJdXVsxXTsKKyAgYlsgM10gPSBUMVt1LnRlbXBbM11bM11dWzFdOworICBiWyA0XSA9IFQxW3UudGVtcFsxXVswXV1bMV07CisgIGJbIDVdID0gVDFbdS50ZW1wWzJdWzFdXVsxXTsKKyAgYlsgNl0gPSBUMVt1LnRlbXBbM11bMl1dWzFdOworICBiWyA3XSA9IFQxW3UudGVtcFswXVszXV1bMV07CisgIGJbIDhdID0gVDFbdS50ZW1wWzJdWzBdXVsxXTsKKyAgYlsgOV0gPSBUMVt1LnRlbXBbM11bMV1dWzFdOworICBiWzEwXSA9IFQxW3UudGVtcFswXVsyXV1bMV07CisgIGJbMTFdID0gVDFbdS50ZW1wWzFdWzNdXVsxXTsKKyAgYlsxMl0gPSBUMVt1LnRlbXBbM11bMF1dWzFdOworICBiWzEzXSA9IFQxW3UudGVtcFswXVsxXV1bMV07CisgIGJbMTRdID0gVDFbdS50ZW1wWzFdWzJdXVsxXTsKKyAgYlsxNV0gPSBUMVt1LnRlbXBbMl1bM11dWzFdOworICAqKCh1MzIqKShiICAgKSkgXj0gKigodTMyKilya1tST1VORFNdWzBdKTsKKyAgKigodTMyKikoYisgNCkpIF49ICooKHUzMiopcmtbUk9VTkRTXVsxXSk7CisgICooKHUzMiopKGIrIDgpKSBePSAqKCh1MzIqKXJrW1JPVU5EU11bMl0pOworICAqKCh1MzIqKShiKzEyKSkgXj0gKigodTMyKilya1tST1VORFNdWzNdKTsKKyN1bmRlZiByaworfQorCisKK3N0YXRpYyB2b2lkCitkb19lbmNyeXB0IChjb25zdCBSSUpOREFFTF9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpieCwgY29uc3QgdW5zaWduZWQgY2hhciAqYXgpCit7CisgIC8qIEJYIGFuZCBBWCBhcmUgbm90IG5lY2Vzc2FyeSBjb3JyZWN0bHkgYWxpZ25lZC4gIFRodXMgd2UgbmVlZCB0bworICAgICBjb3B5IHRoZW0gaGVyZS4gKi8KKyAgdW5pb24KKyAgeworICAgIHUzMiAgZHVtbXlbNF07IAorICAgIGJ5dGUgYVsxNl07CisgIH0gYTsKKyAgdW5pb24KKyAgeworICAgIHUzMiAgZHVtbXlbNF07IAorICAgIGJ5dGUgYlsxNl07CisgIH0gYjsKKworICBtZW1jcHkgKGEuYSwgYXgsIDE2KTsKKyAgZG9fZW5jcnlwdF9hbGlnbmVkIChjdHgsIGIuYiwgYS5hKTsKKyAgbWVtY3B5IChieCwgYi5iLCAxNik7Cit9CisKKworLyogRW5jcnlwdCBvciBkZWNyeXB0IG9uZSBibG9jayB1c2luZyB0aGUgcGFkbG9jayBlbmdpbmUuICBBIGFuZCBCIG1heQorICAgYmUgdGhlIHNhbWUuICovCisjaWZkZWYgVVNFX1BBRExPQ0sKK3N0YXRpYyB2b2lkCitkb19wYWRsb2NrIChjb25zdCBSSUpOREFFTF9jb250ZXh0ICpjdHgsIGludCBkZWNyeXB0X2ZsYWcsCisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpieCwgY29uc3QgdW5zaWduZWQgY2hhciAqYXgpCit7CisgIC8qIEJYIGFuZCBBWCBhcmUgbm90IG5lY2Vzc2FyeSBjb3JyZWN0bHkgYWxpZ25lZC4gIFRodXMgd2UgbmVlZCB0bworICAgICBjb3B5IHRoZW0gaGVyZS4gKi8KKyAgdW5zaWduZWQgY2hhciBhWzE2XSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoMTYpKSk7CisgIHVuc2lnbmVkIGNoYXIgYlsxNl0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDE2KSkpOworICB1bnNpZ25lZCBpbnQgY3dvcmRbNF0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDE2KSkpOworCisgIC8qIFRoZSBjb250cm9sIHdvcmQgZmllbGRzIGFyZToKKyAgICAgIDEyNzoxMiAgIDExOjEwIDkgICAgIDggICAgIDcgICAgIDYgICAgIDUgICAgIDQgICAgIDM6MAorICAgICAgUkVTRVJWRUQgS1NJWkUgQ1JZUFQgSU5URVIgS0VZR04gQ0lQSFIgQUxJR04gREdFU1QgUk9VTkQgICovCisgIGN3b3JkWzBdID0gKGN0eC0+Uk9VTkRTICYgMTUpOyAgLyogKFRoZSBtYXNrIGlzIGp1c3QgYSBzYWZlZ3VhcmQuKSAgKi8KKyAgY3dvcmRbMV0gPSAwOworICBjd29yZFsyXSA9IDA7CisgIGN3b3JkWzNdID0gMDsKKyAgaWYgKGRlY3J5cHRfZmxhZykKKyAgICBjd29yZFswXSB8PSAweDAwMDAwMjAwOworCisgIG1lbWNweSAoYSwgYXgsIDE2KTsKKyAgIAorICBhc20gdm9sYXRpbGUgCisgICAgKCJwdXNoZmxcblx0IiAgICAgICAgICAvKiBGb3JjZSBrZXkgcmVsb2FkLiAgKi8gICAgICAgICAgICAKKyAgICAgInBvcGZsXG5cdCIKKyAgICAgInhjaGcgJTMsICUlZWJ4XG5cdCIgIC8qIExvYWQga2V5LiAgKi8KKyAgICAgIm1vdmwgJDEsICUlZWN4XG5cdCIgIC8qIEluaXQgY291bnRlciBmb3IganVzdCBvbmUgYmxvY2suICAqLworICAgICAiLmJ5dGUgMHhmMywgMHgwZiwgMHhhNywgMHhjOFxuXHQiIC8qIFJFUCBYU1RPUkUgRUNCLiAqLworICAgICAieGNoZyAlMywgJSVlYnhcbiIgICAgLyogUmVzdG9yZSBHT1QgcmVnaXN0ZXIuICAqLworICAgICA6IC8qIE5vIG91dHB1dCAqLworICAgICA6ICJTIiAoYSksICJEIiAoYiksICJkIiAoY3dvcmQpLCAiciIgKGN0eC0+cGFkbG9ja19rZXkpCisgICAgIDogIiVlY3giLCAiY2MiLCAibWVtb3J5IgorICAgICApOworCisgIG1lbWNweSAoYngsIGIsIDE2KTsKKworfQorI2VuZGlmIC8qVVNFX1BBRExPQ0sqLworCisKK3N0YXRpYyB2b2lkCityaWpuZGFlbF9lbmNyeXB0ICh2b2lkICpjb250ZXh0LCBieXRlICpiLCBjb25zdCBieXRlICphKQoreworICBSSUpOREFFTF9jb250ZXh0ICpjdHggPSBjb250ZXh0OworCisjaWZkZWYgVVNFX1BBRExPQ0sKKyAgaWYgKGN0eC0+dXNlX3BhZGxvY2spCisgICAgeworICAgICAgZG9fcGFkbG9jayAoY3R4LCAwLCBiLCBhKTsKKyAgICAgIF9nY3J5X2J1cm5fc3RhY2sgKDQ4ICsgMTUgLyogcG9zc2libGUgcGFkZGluZyBmb3IgYWxpZ25tZW50ICovKTsKKyAgICB9CisgIGVsc2UKKyNlbmRpZiAvKlVTRV9QQURMT0NLKi8KKyAgICB7CisgICAgICBkb19lbmNyeXB0IChjdHgsIGIsIGEpOworICAgICAgX2djcnlfYnVybl9zdGFjayAoNDggKyAyKnNpemVvZihpbnQpKTsKKyAgICB9Cit9CisKKworLyogQnVsayBlbmNyeXB0aW9uIG9mIGNvbXBsZXRlIGJsb2NrcyBpbiBDRkIgbW9kZS4gIENhbGxlciBuZWVkcyB0bworICAgbWFrZSBzdXJlIHRoYXQgSVYgaXMgYWxpZ25lZCBvbiBhbiB1bnNpZ25lZCBsb25nIGJvdW5kYXJ5LiAgVGhpcworICAgZnVuY3Rpb24gaXMgb25seSBpbnRlbmRlZCBmb3IgdGhlIGJ1bGsgZW5jcnlwdGlvbiBmZWF0dXJlIG9mCisgICBjaXBoZXIuYy4gKi8KK3ZvaWQKK19nY3J5X2Flc19jZmJfZW5jICh2b2lkICpjb250ZXh0LCB1bnNpZ25lZCBjaGFyICppdiwgCisgICAgICAgICAgICAgICAgICAgdm9pZCAqb3V0YnVmX2FyZywgY29uc3Qgdm9pZCAqaW5idWZfYXJnLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuYmxvY2tzKQoreworICBSSUpOREFFTF9jb250ZXh0ICpjdHggPSBjb250ZXh0OworICB1bnNpZ25lZCBjaGFyICpvdXRidWYgPSBvdXRidWZfYXJnOworICBjb25zdCB1bnNpZ25lZCBjaGFyICppbmJ1ZiA9IGluYnVmX2FyZzsKKyAgdW5zaWduZWQgY2hhciAqaXZwOworICBpbnQgaTsKKworI2lmZGVmIFVTRV9QQURMT0NLCisgIGlmIChjdHgtPnVzZV9wYWRsb2NrKQorICAgIHsKKyAgICAgIC8qIEZpeG1lOiBMZXQgUGFkbG9jayBkbyB0aGUgQ0ZCaW5nLiAgKi8KKyAgICAgIGZvciAoIDtuYmxvY2tzOyBuYmxvY2tzLS0gKQorICAgICAgICB7CisgICAgICAgICAgLyogRW5jcnlwdCB0aGUgSVYuICovCisgICAgICAgICAgZG9fcGFkbG9jayAoY3R4LCAwLCBpdiwgaXYpOworICAgICAgICAgIC8qIFhPUiB0aGUgaW5wdXQgd2l0aCB0aGUgSVYgYW5kIHN0b3JlIGlucHV0IGludG8gSVYuICAqLworICAgICAgICAgIGZvciAoaXZwPWl2LGk9MDsgaSA8IEJMT0NLU0laRTsgaSsrICkKKyAgICAgICAgICAgICpvdXRidWYrKyA9ICgqaXZwKysgXj0gKmluYnVmKyspOworICAgICAgICB9CisgICAgfQorICBlbHNlCisjZW5kaWYgLyogVVNFX1BBRExPQ0sqLworICAgIHsKKyAgICAgIGZvciAoIDtuYmxvY2tzOyBuYmxvY2tzLS0gKQorICAgICAgICB7CisgICAgICAgICAgLyogRW5jcnlwdCB0aGUgSVYuICovCisgICAgICAgICAgZG9fZW5jcnlwdF9hbGlnbmVkIChjdHgsIGl2LCBpdik7CisgICAgICAgICAgLyogWE9SIHRoZSBpbnB1dCB3aXRoIHRoZSBJViBhbmQgc3RvcmUgaW5wdXQgaW50byBJVi4gICovCisgICAgICAgICAgZm9yIChpdnA9aXYsaT0wOyBpIDwgQkxPQ0tTSVpFOyBpKysgKQorICAgICAgICAgICAgKm91dGJ1ZisrID0gKCppdnArKyBePSAqaW5idWYrKyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgX2djcnlfYnVybl9zdGFjayAoNDggKyAyKnNpemVvZihpbnQpKTsKK30KKworCisvKiBCdWxrIGVuY3J5cHRpb24gb2YgY29tcGxldGUgYmxvY2tzIGluIENCQyBtb2RlLiAgQ2FsbGVyIG5lZWRzIHRvCisgICBtYWtlIHN1cmUgdGhhdCBJViBpcyBhbGlnbmVkIG9uIGFuIHVuc2lnbmVkIGxvbmcgYm91bmRhcnkuICBUaGlzCisgICBmdW5jdGlvbiBpcyBvbmx5IGludGVuZGVkIGZvciB0aGUgYnVsayBlbmNyeXB0aW9uIGZlYXR1cmUgb2YKKyAgIGNpcGhlci5jLiAqLwordm9pZAorX2djcnlfYWVzX2NiY19lbmMgKHZvaWQgKmNvbnRleHQsIHVuc2lnbmVkIGNoYXIgKml2LCAKKyAgICAgICAgICAgICAgICAgICB2b2lkICpvdXRidWZfYXJnLCBjb25zdCB2b2lkICppbmJ1Zl9hcmcsCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5ibG9ja3MsIGludCBjYmNfbWFjKQoreworICBSSUpOREFFTF9jb250ZXh0ICpjdHggPSBjb250ZXh0OworICB1bnNpZ25lZCBjaGFyICpvdXRidWYgPSBvdXRidWZfYXJnOworICBjb25zdCB1bnNpZ25lZCBjaGFyICppbmJ1ZiA9IGluYnVmX2FyZzsKKyAgdW5zaWduZWQgY2hhciAqaXZwOworICBpbnQgaTsKKworICBmb3IgKCA7bmJsb2NrczsgbmJsb2Nrcy0tICkKKyAgICB7CisgICAgICBmb3IgKGl2cD1pdiwgaT0wOyBpIDwgQkxPQ0tTSVpFOyBpKysgKQorICAgICAgICBvdXRidWZbaV0gPSBpbmJ1ZltpXSBeICppdnArKzsKKworI2lmZGVmIFVTRV9QQURMT0NLCisgICAgICBpZiAoY3R4LT51c2VfcGFkbG9jaykKKyAgICAgICAgZG9fcGFkbG9jayAoY3R4LCAwLCBvdXRidWYsIG91dGJ1Zik7CisgICAgICBlbHNlCisjZW5kaWYgLypVU0VfUEFETE9DSyovCisgICAgICAgIGRvX2VuY3J5cHQgKGN0eCwgb3V0YnVmLCBvdXRidWYgKTsKKworICAgICAgbWVtY3B5IChpdiwgb3V0YnVmLCBCTE9DS1NJWkUpOworICAgICAgaW5idWYgKz0gQkxPQ0tTSVpFOworICAgICAgaWYgKCFjYmNfbWFjKQorICAgICAgICBvdXRidWYgKz0gQkxPQ0tTSVpFOworICAgIH0KKworICBfZ2NyeV9idXJuX3N0YWNrICg0OCArIDIqc2l6ZW9mKGludCkpOworfQorCisKKwwKKy8qIERlY3J5cHQgb25lIGJsb2NrLiAgQSBhbmQgQiBuZWVkIHRvIGJlIGFsaWduZWQgb24gYSA0IGJ5dGUgYm91bmRhcnkKKyAgIGFuZCB0aGUgZGVjcnlwdGlvbiBtdXN0IGhhdmUgYmVlbiBwcmVwYXJlZC4gIEEgYW5kIEIgbWF5IGJlIHRoZQorICAgc2FtZS4gKi8KK3N0YXRpYyB2b2lkCitkb19kZWNyeXB0X2FsaWduZWQgKFJJSk5EQUVMX2NvbnRleHQgKmN0eCwgCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmIsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmEpCit7CisjZGVmaW5lIHJrICAoY3R4LT5rZXlTY2hlZDIpCisgIGludCBST1VORFMgPSBjdHgtPlJPVU5EUzsgCisgIGludCByOworICB1bmlvbiAKKyAgeworICAgIHUzMiAgdGVtcHUzMls0XTsgIC8qIEZvcmNlIGNvcnJlY3QgYWxpZ25tZW50LiAqLworICAgIGJ5dGUgdGVtcFs0XVs0XTsKKyAgfSB1OworCisKKyAgKigodTMyKil1LnRlbXBbMF0pID0gKigodTMyKikoYSAgICkpIF4gKigodTMyKilya1tST1VORFNdWzBdKTsKKyAgKigodTMyKil1LnRlbXBbMV0pID0gKigodTMyKikoYSsgNCkpIF4gKigodTMyKilya1tST1VORFNdWzFdKTsKKyAgKigodTMyKil1LnRlbXBbMl0pID0gKigodTMyKikoYSsgOCkpIF4gKigodTMyKilya1tST1VORFNdWzJdKTsKKyAgKigodTMyKil1LnRlbXBbM10pID0gKigodTMyKikoYSsxMikpIF4gKigodTMyKilya1tST1VORFNdWzNdKTsKKyAgCisgICooKHUzMiopKGIgICApKSAgICA9ICgqKCh1MzIqKVQ1W3UudGVtcFswXVswXV0pCisgICAgICAgICAgICAgICAgICAgICAgICBeICooKHUzMiopVDZbdS50ZW1wWzNdWzFdXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIF4gKigodTMyKilUN1t1LnRlbXBbMl1bMl1dKSAKKyAgICAgICAgICAgICAgICAgICAgICAgIF4gKigodTMyKilUOFt1LnRlbXBbMV1bM11dKSk7CisgICooKHUzMiopKGIrIDQpKSAgICA9ICgqKCh1MzIqKVQ1W3UudGVtcFsxXVswXV0pCisgICAgICAgICAgICAgICAgICAgICAgICBeICooKHUzMiopVDZbdS50ZW1wWzBdWzFdXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIF4gKigodTMyKilUN1t1LnRlbXBbM11bMl1dKSAKKyAgICAgICAgICAgICAgICAgICAgICAgIF4gKigodTMyKilUOFt1LnRlbXBbMl1bM11dKSk7CisgICooKHUzMiopKGIrIDgpKSAgICA9ICgqKCh1MzIqKVQ1W3UudGVtcFsyXVswXV0pCisgICAgICAgICAgICAgICAgICAgICAgICBeICooKHUzMiopVDZbdS50ZW1wWzFdWzFdXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIF4gKigodTMyKilUN1t1LnRlbXBbMF1bMl1dKSAKKyAgICAgICAgICAgICAgICAgICAgICAgIF4gKigodTMyKilUOFt1LnRlbXBbM11bM11dKSk7CisgICooKHUzMiopKGIrMTIpKSAgICA9ICgqKCh1MzIqKVQ1W3UudGVtcFszXVswXV0pCisgICAgICAgICAgICAgICAgICAgICAgICBeICooKHUzMiopVDZbdS50ZW1wWzJdWzFdXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIF4gKigodTMyKilUN1t1LnRlbXBbMV1bMl1dKSAKKyAgICAgICAgICAgICAgICAgICAgICAgIF4gKigodTMyKilUOFt1LnRlbXBbMF1bM11dKSk7CisKKyAgZm9yIChyID0gUk9VTkRTLTE7IHIgPiAxOyByLS0pCisgICAgeworICAgICAgKigodTMyKil1LnRlbXBbMF0pID0gKigodTMyKikoYiAgICkpIF4gKigodTMyKilya1tyXVswXSk7CisgICAgICAqKCh1MzIqKXUudGVtcFsxXSkgPSAqKCh1MzIqKShiKyA0KSkgXiAqKCh1MzIqKXJrW3JdWzFdKTsKKyAgICAgICooKHUzMiopdS50ZW1wWzJdKSA9ICooKHUzMiopKGIrIDgpKSBeICooKHUzMiopcmtbcl1bMl0pOworICAgICAgKigodTMyKil1LnRlbXBbM10pID0gKigodTMyKikoYisxMikpIF4gKigodTMyKilya1tyXVszXSk7CisgICAgICAqKCh1MzIqKShiICAgKSkgICAgPSAoKigodTMyKilUNVt1LnRlbXBbMF1bMF1dKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4gKigodTMyKilUNlt1LnRlbXBbM11bMV1dKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4gKigodTMyKilUN1t1LnRlbXBbMl1bMl1dKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBeICooKHUzMiopVDhbdS50ZW1wWzFdWzNdXSkpOworICAgICAgKigodTMyKikoYisgNCkpICAgID0gKCooKHUzMiopVDVbdS50ZW1wWzFdWzBdXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBeICooKHUzMiopVDZbdS50ZW1wWzBdWzFdXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBeICooKHUzMiopVDdbdS50ZW1wWzNdWzJdXSkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgXiAqKCh1MzIqKVQ4W3UudGVtcFsyXVszXV0pKTsKKyAgICAgICooKHUzMiopKGIrIDgpKSAgICA9ICgqKCh1MzIqKVQ1W3UudGVtcFsyXVswXV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgXiAqKCh1MzIqKVQ2W3UudGVtcFsxXVsxXV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgXiAqKCh1MzIqKVQ3W3UudGVtcFswXVsyXV0pIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4gKigodTMyKilUOFt1LnRlbXBbM11bM11dKSk7CisgICAgICAqKCh1MzIqKShiKzEyKSkgICAgPSAoKigodTMyKilUNVt1LnRlbXBbM11bMF1dKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4gKigodTMyKilUNlt1LnRlbXBbMl1bMV1dKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4gKigodTMyKilUN1t1LnRlbXBbMV1bMl1dKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBeICooKHUzMiopVDhbdS50ZW1wWzBdWzNdXSkpOworICAgIH0KKworICAvKiBMYXN0IHJvdW5kIGlzIHNwZWNpYWwuICovICAgCisgICooKHUzMiopdS50ZW1wWzBdKSA9ICooKHUzMiopKGIgICApKSBeICooKHUzMiopcmtbMV1bMF0pOworICAqKCh1MzIqKXUudGVtcFsxXSkgPSAqKCh1MzIqKShiKyA0KSkgXiAqKCh1MzIqKXJrWzFdWzFdKTsKKyAgKigodTMyKil1LnRlbXBbMl0pID0gKigodTMyKikoYisgOCkpIF4gKigodTMyKilya1sxXVsyXSk7CisgICooKHUzMiopdS50ZW1wWzNdKSA9ICooKHUzMiopKGIrMTIpKSBeICooKHUzMiopcmtbMV1bM10pOworICBiWyAwXSA9IFM1W3UudGVtcFswXVswXV07CisgIGJbIDFdID0gUzVbdS50ZW1wWzNdWzFdXTsKKyAgYlsgMl0gPSBTNVt1LnRlbXBbMl1bMl1dOworICBiWyAzXSA9IFM1W3UudGVtcFsxXVszXV07CisgIGJbIDRdID0gUzVbdS50ZW1wWzFdWzBdXTsKKyAgYlsgNV0gPSBTNVt1LnRlbXBbMF1bMV1dOworICBiWyA2XSA9IFM1W3UudGVtcFszXVsyXV07CisgIGJbIDddID0gUzVbdS50ZW1wWzJdWzNdXTsKKyAgYlsgOF0gPSBTNVt1LnRlbXBbMl1bMF1dOworICBiWyA5XSA9IFM1W3UudGVtcFsxXVsxXV07CisgIGJbMTBdID0gUzVbdS50ZW1wWzBdWzJdXTsKKyAgYlsxMV0gPSBTNVt1LnRlbXBbM11bM11dOworICBiWzEyXSA9IFM1W3UudGVtcFszXVswXV07CisgIGJbMTNdID0gUzVbdS50ZW1wWzJdWzFdXTsKKyAgYlsxNF0gPSBTNVt1LnRlbXBbMV1bMl1dOworICBiWzE1XSA9IFM1W3UudGVtcFswXVszXV07CisgICooKHUzMiopKGIgICApKSBePSAqKCh1MzIqKXJrWzBdWzBdKTsKKyAgKigodTMyKikoYisgNCkpIF49ICooKHUzMiopcmtbMF1bMV0pOworICAqKCh1MzIqKShiKyA4KSkgXj0gKigodTMyKilya1swXVsyXSk7CisgICooKHUzMiopKGIrMTIpKSBePSAqKCh1MzIqKXJrWzBdWzNdKTsKKyN1bmRlZiByaworfQorCisKKy8qIERlY3J5cHQgb25lIGJsb2NrLiAgQVggYW5kIEJYIG1heSBiZSB0aGUgc2FtZS4gKi8KK3N0YXRpYyB2b2lkCitkb19kZWNyeXB0IChSSUpOREFFTF9jb250ZXh0ICpjdHgsIGJ5dGUgKmJ4LCBjb25zdCBieXRlICpheCkKK3sKKyAgLyogQlggYW5kIEFYIGFyZSBub3QgbmVjZXNzYXJ5IGNvcnJlY3RseSBhbGlnbmVkLiAgVGh1cyB3ZSBuZWVkIHRvCisgICAgIGNvcHkgdGhlbSBoZXJlLiAqLworICB1bmlvbgorICB7CisgICAgdTMyICBkdW1teVs0XTsgCisgICAgYnl0ZSBhWzE2XTsKKyAgfSBhOworICB1bmlvbgorICB7CisgICAgdTMyICBkdW1teVs0XTsgCisgICAgYnl0ZSBiWzE2XTsKKyAgfSBiOworCisgIGlmICggIWN0eC0+ZGVjcnlwdGlvbl9wcmVwYXJlZCApCisgICAgeworICAgICAgcHJlcGFyZV9kZWNyeXB0aW9uICggY3R4ICk7CisgICAgICBfZ2NyeV9idXJuX3N0YWNrICg2NCk7CisgICAgICBjdHgtPmRlY3J5cHRpb25fcHJlcGFyZWQgPSAxOworICAgIH0KKworICBtZW1jcHkgKGEuYSwgYXgsIDE2KTsKKyAgZG9fZGVjcnlwdF9hbGlnbmVkIChjdHgsIGIuYiwgYS5hKTsKKyAgbWVtY3B5IChieCwgYi5iLCAxNik7CisjdW5kZWYgcmsKK30KKyAgICAKKworCisKK3N0YXRpYyB2b2lkCityaWpuZGFlbF9kZWNyeXB0ICh2b2lkICpjb250ZXh0LCBieXRlICpiLCBjb25zdCBieXRlICphKQoreworICBSSUpOREFFTF9jb250ZXh0ICpjdHggPSBjb250ZXh0OworCisjaWZkZWYgVVNFX1BBRExPQ0sKKyAgaWYgKGN0eC0+dXNlX3BhZGxvY2spCisgICAgeworICAgICAgZG9fcGFkbG9jayAoY3R4LCAxLCBiLCBhKTsKKyAgICAgIF9nY3J5X2J1cm5fc3RhY2sgKDQ4ICsgMipzaXplb2YoaW50KSAvKiBGSVhNRSAqLyk7CisgICAgfQorICBlbHNlCisjZW5kaWYgLypVU0VfUEFETE9DSyovCisgICAgeworICAgICAgZG9fZGVjcnlwdCAoY3R4LCBiLCBhKTsKKyAgICAgIF9nY3J5X2J1cm5fc3RhY2sgKDQ4KzIqc2l6ZW9mKGludCkpOworICAgIH0KK30KKworCisvKiBCdWxrIGRlY3J5cHRpb24gb2YgY29tcGxldGUgYmxvY2tzIGluIENGQiBtb2RlLiAgQ2FsbGVyIG5lZWRzIHRvCisgICBtYWtlIHN1cmUgdGhhdCBJViBpcyBhbGlnbmVkIG9uIGFuIHVuaXNnbmVkIGxvbmhnIGJvdW5kYXJ5LiAgVGhpcworICAgZnVuY3Rpb24gaXMgb25seSBpbnRlbmRlZCBmb3IgdGhlIGJ1bGsgZW5jcnlwdGlvbiBmZWF0dXJlIG9mCisgICBjaXBoZXIuYy4gKi8KK3ZvaWQKK19nY3J5X2Flc19jZmJfZGVjICh2b2lkICpjb250ZXh0LCB1bnNpZ25lZCBjaGFyICppdiwgCisgICAgICAgICAgICAgICAgICAgdm9pZCAqb3V0YnVmX2FyZywgY29uc3Qgdm9pZCAqaW5idWZfYXJnLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuYmxvY2tzKQoreworICBSSUpOREFFTF9jb250ZXh0ICpjdHggPSBjb250ZXh0OworICB1bnNpZ25lZCBjaGFyICpvdXRidWYgPSBvdXRidWZfYXJnOworICBjb25zdCB1bnNpZ25lZCBjaGFyICppbmJ1ZiA9IGluYnVmX2FyZzsKKyAgdW5zaWduZWQgY2hhciAqaXZwOworICB1bnNpZ25lZCBjaGFyIHRlbXA7CisgIGludCBpOworCisjaWZkZWYgVVNFX1BBRExPQ0sKKyAgaWYgKGN0eC0+dXNlX3BhZGxvY2spCisgICAgeworICAgICAgLyogRml4bWU6ICBMZXQgUGFkbG9jayBkbyB0aGUgQ0ZCaW5nLiAgKi8KKyAgICAgIGZvciAoIDtuYmxvY2tzOyBuYmxvY2tzLS0gKQorICAgICAgICB7CisgICAgICAgICAgZG9fcGFkbG9jayAoY3R4LCAwLCBpdiwgaXYpOworICAgICAgICAgIGZvciAoaXZwPWl2LGk9MDsgaSA8IEJMT0NLU0laRTsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgdGVtcCA9ICppbmJ1ZisrOworICAgICAgICAgICAgICAqb3V0YnVmKysgPSAqaXZwIF4gdGVtcDsKKyAgICAgICAgICAgICAgKml2cCsrID0gdGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorI2VuZGlmIC8qVVNFX1BBRExPQ0sqLworICAgIHsKKyAgICAgIGZvciAoIDtuYmxvY2tzOyBuYmxvY2tzLS0gKQorICAgICAgICB7CisgICAgICAgICAgZG9fZW5jcnlwdF9hbGlnbmVkIChjdHgsIGl2LCBpdik7CisgICAgICAgICAgZm9yIChpdnA9aXYsaT0wOyBpIDwgQkxPQ0tTSVpFOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICB0ZW1wID0gKmluYnVmKys7CisgICAgICAgICAgICAgICpvdXRidWYrKyA9ICppdnAgXiB0ZW1wOworICAgICAgICAgICAgICAqaXZwKysgPSB0ZW1wOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgIF9nY3J5X2J1cm5fc3RhY2sgKDQ4ICsgMipzaXplb2YoaW50KSk7Cit9CisKKworLyogQnVsayBkZWNyeXB0aW9uIG9mIGNvbXBsZXRlIGJsb2NrcyBpbiBDQkMgbW9kZS4gIENhbGxlciBuZWVkcyB0bworICAgbWFrZSBzdXJlIHRoYXQgSVYgaXMgYWxpZ25lZCBvbiBhbiB1bnNpZ25lZCBsb25nIGJvdW5kYXJ5LiAgVGhpcworICAgZnVuY3Rpb24gaXMgb25seSBpbnRlbmRlZCBmb3IgdGhlIGJ1bGsgZW5jcnlwdGlvbiBmZWF0dXJlIG9mCisgICBjaXBoZXIuYy4gKi8KK3ZvaWQKK19nY3J5X2Flc19jYmNfZGVjICh2b2lkICpjb250ZXh0LCB1bnNpZ25lZCBjaGFyICppdiwgCisgICAgICAgICAgICAgICAgICAgdm9pZCAqb3V0YnVmX2FyZywgY29uc3Qgdm9pZCAqaW5idWZfYXJnLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuYmxvY2tzKQoreworICBSSUpOREFFTF9jb250ZXh0ICpjdHggPSBjb250ZXh0OworICB1bnNpZ25lZCBjaGFyICpvdXRidWYgPSBvdXRidWZfYXJnOworICBjb25zdCB1bnNpZ25lZCBjaGFyICppbmJ1ZiA9IGluYnVmX2FyZzsKKyAgdW5zaWduZWQgY2hhciAqaXZwOworICBpbnQgaTsKKyAgdW5zaWduZWQgY2hhciBzYXZlYnVmW0JMT0NLU0laRV07CisKKyAgZm9yICggO25ibG9ja3M7IG5ibG9ja3MtLSApCisgICAgeworICAgICAgLyogV2UgbmVlZCB0byBzYXZlIElOQlVGIGF3YXkgYmVjYXVzZSBpdCBtYXkgYmUgaWRlbnRpY2FsIHRvCisgICAgICAgICBPVVRCVUYuICAqLworICAgICAgbWVtY3B5IChzYXZlYnVmLCBpbmJ1ZiwgQkxPQ0tTSVpFKTsKKworI2lmZGVmIFVTRV9QQURMT0NLCisgICAgICBpZiAoY3R4LT51c2VfcGFkbG9jaykKKyAgICAgICAgZG9fcGFkbG9jayAoY3R4LCAxLCBvdXRidWYsIGluYnVmKTsKKyAgICAgIGVsc2UKKyNlbmRpZiAvKlVTRV9QQURMT0NLKi8KKyAgICAgICAgZG9fZGVjcnlwdCAoY3R4LCBvdXRidWYsIGluYnVmKTsKKworICAgICAgZm9yIChpdnA9aXYsIGk9MDsgaSA8IEJMT0NLU0laRTsgaSsrICkKKyAgICAgICAgb3V0YnVmW2ldIF49ICppdnArKzsKKyAgICAgIG1lbWNweSAoaXYsIHNhdmVidWYsIEJMT0NLU0laRSk7CisgICAgICBpbmJ1ZiArPSBCTE9DS1NJWkU7CisgICAgICBvdXRidWYgKz0gQkxPQ0tTSVpFOworICAgIH0KKworICBfZ2NyeV9idXJuX3N0YWNrICg0OCArIDIqc2l6ZW9mKGludCkgKyBCTE9DS1NJWkUgKyA0KnNpemVvZiAoY2hhciopKTsKK30KKworCisKKwwKKy8qIFJ1biB0aGUgc2VsZi10ZXN0cyBmb3IgQUVTIDEyOC4gIFJldHVybnMgTlVMTCBvbiBzdWNjZXNzLiAqLworc3RhdGljIGNvbnN0IGNoYXIqCitzZWxmdGVzdF9iYXNpY18xMjggKHZvaWQpCit7CisgIFJJSk5EQUVMX2NvbnRleHQgY3R4OworICB1bnNpZ25lZCBjaGFyIHNjcmF0Y2hbMTZdOwkgICAKKworICAvKiBUaGUgdGVzdCB2ZWN0b3JzIGFyZSBmcm9tIHRoZSBBRVMgc3VwcGxpZWQgb25lczsgbW9yZSBvciBsZXNzCisgICAgIHJhbmRvbWx5IHRha2VuIGZyb20gZWNiX3RibC50eHQgKEk9NDIsODEsMTQpICovCisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHBsYWludGV4dF8xMjhbMTZdID0gCisgICAgeworICAgICAgMHgwMSwweDRCLDB4QUYsMHgyMiwweDc4LDB4QTYsMHg5RCwweDMzLAorICAgICAgMHgxRCwweDUxLDB4ODAsMHgxMCwweDM2LDB4NDMsMHhFOSwweDlBCisgICAgfTsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIga2V5XzEyOFsxNl0gPQorICAgIHsKKyAgICAgIDB4RTgsMHhFOSwweEVBLDB4RUIsMHhFRCwweEVFLDB4RUYsMHhGMCwKKyAgICAgIDB4RjIsMHhGMywweEY0LDB4RjUsMHhGNywweEY4LDB4RjksMHhGQQorICAgIH07CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGNpcGhlcnRleHRfMTI4WzE2XSA9CisgICAgeworICAgICAgMHg2NywweDQzLDB4QzMsMHhEMSwweDUxLDB4OUEsMHhCNCwweEYyLAorICAgICAgMHhDRCwweDlBLDB4NzgsMHhBQiwweDA5LDB4QTUsMHgxMSwweEJECisgICAgfTsKKyAgCisgIHJpam5kYWVsX3NldGtleSAoJmN0eCwga2V5XzEyOCwgc2l6ZW9mIChrZXlfMTI4KSk7CisgIHJpam5kYWVsX2VuY3J5cHQgKCZjdHgsIHNjcmF0Y2gsIHBsYWludGV4dF8xMjgpOworICBpZiAobWVtY21wIChzY3JhdGNoLCBjaXBoZXJ0ZXh0XzEyOCwgc2l6ZW9mIChjaXBoZXJ0ZXh0XzEyOCkpKQorICAgICByZXR1cm4gIkFFUy0xMjggdGVzdCBlbmNyeXB0aW9uIGZhaWxlZC4iOworICByaWpuZGFlbF9kZWNyeXB0ICgmY3R4LCBzY3JhdGNoLCBzY3JhdGNoKTsKKyAgaWYgKG1lbWNtcCAoc2NyYXRjaCwgcGxhaW50ZXh0XzEyOCwgc2l6ZW9mIChwbGFpbnRleHRfMTI4KSkpCisgICAgcmV0dXJuICJBRVMtMTI4IHRlc3QgZGVjcnlwdGlvbiBmYWlsZWQuIjsKKyAgCisgIHJldHVybiBOVUxMOworfQorCisvKiBSdW4gdGhlIHNlbGYtdGVzdHMgZm9yIEFFUyAxOTIuICBSZXR1cm5zIE5VTEwgb24gc3VjY2Vzcy4gKi8KK3N0YXRpYyBjb25zdCBjaGFyKgorc2VsZnRlc3RfYmFzaWNfMTkyICh2b2lkKQoreworICBSSUpOREFFTF9jb250ZXh0IGN0eDsKKyAgdW5zaWduZWQgY2hhciBzY3JhdGNoWzE2XTsJICAgCisgIAorICBzdGF0aWMgdW5zaWduZWQgY2hhciBwbGFpbnRleHRfMTkyWzE2XSA9IAorICAgIHsKKyAgICAgIDB4NzYsMHg3NywweDc0LDB4NzUsMHhGMSwweEYyLDB4RjMsMHhGNCwKKyAgICAgIDB4RjgsMHhGOSwweEU2LDB4RTcsMHg3NywweDcwLDB4NzEsMHg3MgorICAgIH07CisgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGtleV8xOTJbMjRdID0gCisgICAgeworICAgICAgMHgwNCwweDA1LDB4MDYsMHgwNywweDA5LDB4MEEsMHgwQiwweDBDLAorICAgICAgMHgwRSwweDBGLDB4MTAsMHgxMSwweDEzLDB4MTQsMHgxNSwweDE2LAorICAgICAgMHgxOCwweDE5LDB4MUEsMHgxQiwweDFELDB4MUUsMHgxRiwweDIwCisgICAgfTsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgY2lwaGVydGV4dF8xOTJbMTZdID0KKyAgICB7CisgICAgICAweDVELDB4MUUsMHhGMiwweDBELDB4Q0UsMHhENiwweEJDLDB4QkMsCisgICAgICAweDEyLDB4MTMsMHgxQSwweEM3LDB4QzUsMHg0NywweDg4LDB4QUEKKyAgICB9OworICAgIAorICByaWpuZGFlbF9zZXRrZXkgKCZjdHgsIGtleV8xOTIsIHNpemVvZihrZXlfMTkyKSk7CisgIHJpam5kYWVsX2VuY3J5cHQgKCZjdHgsIHNjcmF0Y2gsIHBsYWludGV4dF8xOTIpOworICBpZiAobWVtY21wIChzY3JhdGNoLCBjaXBoZXJ0ZXh0XzE5Miwgc2l6ZW9mIChjaXBoZXJ0ZXh0XzE5MikpKQorICAgIHJldHVybiAiQUVTLTE5MiB0ZXN0IGVuY3J5cHRpb24gZmFpbGVkLiI7CisgIHJpam5kYWVsX2RlY3J5cHQgKCZjdHgsIHNjcmF0Y2gsIHNjcmF0Y2gpOworICBpZiAobWVtY21wIChzY3JhdGNoLCBwbGFpbnRleHRfMTkyLCBzaXplb2YgKHBsYWludGV4dF8xOTIpKSkKKyAgICByZXR1cm4gIkFFUy0xOTIgdGVzdCBkZWNyeXB0aW9uIGZhaWxlZC4iOworICAKKyAgcmV0dXJuIE5VTEw7Cit9CisKKworLyogUnVuIHRoZSBzZWxmLXRlc3RzIGZvciBBRVMgMjU2LiAgUmV0dXJucyBOVUxMIG9uIHN1Y2Nlc3MuICovCitzdGF0aWMgY29uc3QgY2hhcioKK3NlbGZ0ZXN0X2Jhc2ljXzI1NiAodm9pZCkKK3sKKyAgUklKTkRBRUxfY29udGV4dCBjdHg7CisgIHVuc2lnbmVkIGNoYXIgc2NyYXRjaFsxNl07CSAgIAorCisgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHBsYWludGV4dF8yNTZbMTZdID0gCisgICAgeworICAgICAgMHgwNiwweDlBLDB4MDAsMHg3RiwweEM3LDB4NkEsMHg0NSwweDlGLAorICAgICAgMHg5OCwweEJBLDB4RjksMHgxNywweEZFLDB4REYsMHg5NSwweDIxCisgICAgfTsKKyAgc3RhdGljIHVuc2lnbmVkIGNoYXIga2V5XzI1NlszMl0gPSAKKyAgICB7CisgICAgICAweDA4LDB4MDksMHgwQSwweDBCLDB4MEQsMHgwRSwweDBGLDB4MTAsCisgICAgICAweDEyLDB4MTMsMHgxNCwweDE1LDB4MTcsMHgxOCwweDE5LDB4MUEsCisgICAgICAweDFDLDB4MUQsMHgxRSwweDFGLDB4MjEsMHgyMiwweDIzLDB4MjQsCisgICAgICAweDI2LDB4MjcsMHgyOCwweDI5LDB4MkIsMHgyQywweDJELDB4MkUKKyAgICB9OworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBjaXBoZXJ0ZXh0XzI1NlsxNl0gPSAKKyAgICB7CisgICAgICAweDA4LDB4MEUsMHg5NSwweDE3LDB4RUIsMHgxNiwweDc3LDB4NzEsCisgICAgICAweDlBLDB4Q0YsMHg3MiwweDgwLDB4ODYsMHgwNCwweDBBLDB4RTMKKyAgICB9OworCisgIHJpam5kYWVsX3NldGtleSAoJmN0eCwga2V5XzI1Niwgc2l6ZW9mKGtleV8yNTYpKTsKKyAgcmlqbmRhZWxfZW5jcnlwdCAoJmN0eCwgc2NyYXRjaCwgcGxhaW50ZXh0XzI1Nik7CisgIGlmIChtZW1jbXAgKHNjcmF0Y2gsIGNpcGhlcnRleHRfMjU2LCBzaXplb2YgKGNpcGhlcnRleHRfMjU2KSkpCisgICAgcmV0dXJuICJBRVMtMjU2IHRlc3QgZW5jcnlwdGlvbiBmYWlsZWQuIjsKKyAgcmlqbmRhZWxfZGVjcnlwdCAoJmN0eCwgc2NyYXRjaCwgc2NyYXRjaCk7CisgIGlmIChtZW1jbXAgKHNjcmF0Y2gsIHBsYWludGV4dF8yNTYsIHNpemVvZiAocGxhaW50ZXh0XzI1NikpKQorICAgIHJldHVybiAiQUVTLTI1NiB0ZXN0IGRlY3J5cHRpb24gZmFpbGVkLiI7CisgICAgCisgIHJldHVybiBOVUxMOworfQorCisvKiBSdW4gYWxsIHRoZSBzZWxmLXRlc3RzIGFuZCByZXR1cm4gTlVMTCBvbiBzdWNjZXNzLiAgVGhpcyBmdW5jdGlvbgorICAgaXMgdXNlZCBmb3IgdGhlIG9uLXRoZS1mbHkgc2VsZi10ZXN0cy4gKi8KK3N0YXRpYyBjb25zdCBjaGFyICoKK3NlbGZ0ZXN0ICh2b2lkKQoreworICBjb25zdCBjaGFyICpyOworCisgIGlmICggKHIgPSBzZWxmdGVzdF9iYXNpY18xMjggKCkpCisgICAgICAgfHwgKHIgPSBzZWxmdGVzdF9iYXNpY18xOTIgKCkpCisgICAgICAgfHwgKHIgPSBzZWxmdGVzdF9iYXNpY18yNTYgKCkpICkKKyAgICByZXR1cm4gcjsKKworICByZXR1cm4gcjsKK30KKworCisvKiBTUDgwMC0zOGEucGRmIGZvciBBRVMtMTI4LiAgKi8KK3N0YXRpYyBjb25zdCBjaGFyICoKK3NlbGZ0ZXN0X2ZpcHNfMTI4XzM4YSAoaW50IHJlcXVlc3RlZF9tb2RlKQoreworICBzdHJ1Y3QgdHYKKyAgeworICAgIGludCBtb2RlOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIga2V5WzE2XTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGl2WzE2XTsKKyAgICBzdHJ1Y3QgCisgICAgeworICAgICAgY29uc3QgdW5zaWduZWQgY2hhciBpbnB1dFsxNl07CisgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyIG91dHB1dFsxNl07CisgICAgfSBkYXRhWzRdOworICB9IHR2WzJdID0KKyAgICB7CisgICAgICB7CisgICAgICAgIEdDUllfQ0lQSEVSX01PREVfQ0ZCLCAgLyogRi4zLjEzLCBDRkIxMjgtQUVTMTI4ICovCisgICAgICAgIHsgMHgyYiwgMHg3ZSwgMHgxNSwgMHgxNiwgMHgyOCwgMHhhZSwgMHhkMiwgMHhhNiwKKyAgICAgICAgICAweGFiLCAweGY3LCAweDE1LCAweDg4LCAweDA5LCAweGNmLCAweDRmLCAweDNjIH0sCisgICAgICAgIHsgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgCisgICAgICAgICAgMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiB9LAorICAgICAgICB7CisgICAgICAgICAgeyB7IDB4NmIsIDB4YzEsIDB4YmUsIDB4ZTIsIDB4MmUsIDB4NDAsIDB4OWYsIDB4OTYsCisgICAgICAgICAgICAgIDB4ZTksIDB4M2QsIDB4N2UsIDB4MTEsIDB4NzMsIDB4OTMsIDB4MTcsIDB4MmEgfSwKKyAgICAgICAgICAgIHsgMHgzYiwgMHgzZiwgMHhkOSwgMHgyZSwgMHhiNywgMHgyZCwgMHhhZCwgMHgyMCwKKyAgICAgICAgICAgICAgMHgzMywgMHgzNCwgMHg0OSwgMHhmOCwgMHhlOCwgMHgzYywgMHhmYiwgMHg0YSB9IH0sCisgICAgICAgICAgCisgICAgICAgICAgeyB7IDB4YWUsIDB4MmQsIDB4OGEsIDB4NTcsIDB4MWUsIDB4MDMsIDB4YWMsIDB4OWMsCisgICAgICAgICAgICAgIDB4OWUsIDB4YjcsIDB4NmYsIDB4YWMsIDB4NDUsIDB4YWYsIDB4OGUsIDB4NTEgfSwKKyAgICAgICAgICAgIHsgMHhjOCwgMHhhNiwgMHg0NSwgMHgzNywgMHhhMCwgMHhiMywgMHhhOSwgMHgzZiwKKyAgICAgICAgICAgICAgMHhjZCwgMHhlMywgMHhjZCwgMHhhZCwgMHg5ZiwgMHgxYywgMHhlNSwgMHg4YiB9IH0sCisgICAgICAgICAgCisgICAgICAgICAgeyB7IDB4MzAsIDB4YzgsIDB4MWMsIDB4NDYsIDB4YTMsIDB4NWMsIDB4ZTQsIDB4MTEsIAorICAgICAgICAgICAgICAweGU1LCAweGZiLCAweGMxLCAweDE5LCAweDFhLCAweDBhLCAweDUyLCAweGVmIH0sCisgICAgICAgICAgICB7IDB4MjYsIDB4NzUsIDB4MWYsIDB4NjcsIDB4YTMsIDB4Y2IsIDB4YjEsIDB4NDAsCisgICAgICAgICAgICAgIDB4YjEsIDB4ODAsIDB4OGMsIDB4ZjEsIDB4ODcsIDB4YTQsIDB4ZjQsIDB4ZGYgfSB9LAorICAgICAgICAgIAorICAgICAgICAgIHsgeyAweGY2LCAweDlmLCAweDI0LCAweDQ1LCAweGRmLCAweDRmLCAweDliLCAweDE3LAorICAgICAgICAgICAgICAweGFkLCAweDJiLCAweDQxLCAweDdiLCAweGU2LCAweDZjLCAweDM3LCAweDEwIH0sCisgICAgICAgICAgICB7IDB4YzAsIDB4NGIsIDB4MDUsIDB4MzUsIDB4N2MsIDB4NWQsIDB4MWMsIDB4MGUsCisgICAgICAgICAgICAgIDB4ZWEsIDB4YzQsIDB4YzYsIDB4NmYsIDB4OWYsIDB4ZjcsIDB4ZjIsIDB4ZTYgfSB9CisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICB7CisgICAgICAgIEdDUllfQ0lQSEVSX01PREVfT0ZCLAorICAgICAgICB7IDB4MmIsIDB4N2UsIDB4MTUsIDB4MTYsIDB4MjgsIDB4YWUsIDB4ZDIsIDB4YTYsCisgICAgICAgICAgMHhhYiwgMHhmNywgMHgxNSwgMHg4OCwgMHgwOSwgMHhjZiwgMHg0ZiwgMHgzYyB9LAorICAgICAgICB7IDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIAorICAgICAgICAgIDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYgfSwKKyAgICAgICAgeworICAgICAgICAgIHsgeyAweDZiLCAweGMxLCAweGJlLCAweGUyLCAweDJlLCAweDQwLCAweDlmLCAweDk2LAorICAgICAgICAgICAgICAweGU5LCAweDNkLCAweDdlLCAweDExLCAweDczLCAweDkzLCAweDE3LCAweDJhIH0sCisgICAgICAgICAgICB7IDB4M2IsIDB4M2YsIDB4ZDksIDB4MmUsIDB4YjcsIDB4MmQsIDB4YWQsIDB4MjAsCisgICAgICAgICAgICAgIDB4MzMsIDB4MzQsIDB4NDksIDB4ZjgsIDB4ZTgsIDB4M2MsIDB4ZmIsIDB4NGEgfSB9LAorCisgICAgICAgICAgeyB7IDB4YWUsIDB4MmQsIDB4OGEsIDB4NTcsIDB4MWUsIDB4MDMsIDB4YWMsIDB4OWMsCisgICAgICAgICAgICAgIDB4OWUsIDB4YjcsIDB4NmYsIDB4YWMsIDB4NDUsIDB4YWYsIDB4OGUsIDB4NTEgfSwKKyAgICAgICAgICAgIHsgMHg3NywgMHg4OSwgMHg1MCwgMHg4ZCwgMHgxNiwgMHg5MSwgMHg4ZiwgMHgwMywKKyAgICAgICAgICAgICAgMHhmNSwgMHgzYywgMHg1MiwgMHhkYSwgMHhjNSwgMHg0ZSwgMHhkOCwgMHgyNSB9IH0sCisgICAgICAgICAgCisgICAgICAgICAgeyB7IDB4MzAsIDB4YzgsIDB4MWMsIDB4NDYsIDB4YTMsIDB4NWMsIDB4ZTQsIDB4MTEsCisgICAgICAgICAgICAgIDB4ZTUsIDB4ZmIsIDB4YzEsIDB4MTksIDB4MWEsIDB4MGEsIDB4NTIsIDB4ZWYgfSwKKyAgICAgICAgICAgIHsgMHg5NywgMHg0MCwgMHgwNSwgMHgxZSwgMHg5YywgMHg1ZiwgMHhlYywgMHhmNiwKKyAgICAgICAgICAgICAgMHg0MywgMHg0NCwgMHhmNywgMHhhOCwgMHgyMiwgMHg2MCwgMHhlZCwgMHhjYyB9IH0sCisKKyAgICAgICAgICB7IHsgMHhmNiwgMHg5ZiwgMHgyNCwgMHg0NSwgMHhkZiwgMHg0ZiwgMHg5YiwgMHgxNywKKyAgICAgICAgICAgICAgMHhhZCwgMHgyYiwgMHg0MSwgMHg3YiwgMHhlNiwgMHg2YywgMHgzNywgMHgxMCB9LAorICAgICAgICAgICAgeyAweDMwLCAweDRjLCAweDY1LCAweDI4LCAweGY2LCAweDU5LCAweGM3LCAweDc4LAorICAgICAgICAgICAgICAweDY2LCAweGE1LCAweDEwLCAweGQ5LCAweGMxLCAweGQ2LCAweGFlLCAweDVlIH0gfSwKKyAgICAgICAgfQorICAgICAgfQorICAgIH07CisgIHVuc2lnbmVkIGNoYXIgc2NyYXRjaFsxNl07CisgIGdwZ19lcnJvcl90IGVycjsKKyAgaW50IHR2aSwgaWR4OworICBnY3J5X2NpcGhlcl9oZF90IGhkZW5jID0gTlVMTDsKKyAgZ2NyeV9jaXBoZXJfaGRfdCBoZGRlYyA9IE5VTEw7CisKKyNkZWZpbmUgRmFpbChhKSBkbyB7ICAgICAgICAgICBcCisgICAgX2djcnlfY2lwaGVyX2Nsb3NlIChoZGVuYyk7ICBcCisgICAgX2djcnlfY2lwaGVyX2Nsb3NlIChoZGRlYyk7ICBcCisgICAgcmV0dXJuIGE7ICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyAgZ2NyeV9hc3NlcnQgKHNpemVvZiB0dlswXS5kYXRhWzBdLmlucHV0ID09IHNpemVvZiBzY3JhdGNoKTsKKyAgZ2NyeV9hc3NlcnQgKHNpemVvZiB0dlswXS5kYXRhWzBdLm91dHB1dCA9PSBzaXplb2Ygc2NyYXRjaCk7CisKKyAgZm9yICh0dmk9MDsgdHZpIDwgRElNICh0dik7IHR2aSsrKQorICAgIGlmICh0dlt0dmldLm1vZGUgPT0gcmVxdWVzdGVkX21vZGUpCisgICAgICBicmVhazsKKyAgaWYgKHR2aSA9PSBESU0gKHR2KSkKKyAgICBGYWlsICgibm8gdGVzdCBkYXRhIGZvciB0aGlzIG1vZGUiKTsKKworICBlcnIgPSBfZ2NyeV9jaXBoZXJfb3BlbiAoJmhkZW5jLCBHQ1JZX0NJUEhFUl9BRVMsIHR2W3R2aV0ubW9kZSwgMCk7CisgIGlmIChlcnIpCisgICAgRmFpbCAoIm9wZW4iKTsKKyAgZXJyID0gX2djcnlfY2lwaGVyX29wZW4gKCZoZGRlYywgR0NSWV9DSVBIRVJfQUVTLCB0dlt0dmldLm1vZGUsIDApOworICBpZiAoZXJyKQorICAgIEZhaWwgKCJvcGVuIik7CisgIGVyciA9IF9nY3J5X2NpcGhlcl9zZXRrZXkgKGhkZW5jLCB0dlt0dmldLmtleSwgIHNpemVvZiB0dlt0dmldLmtleSk7CisgIGlmICghZXJyKQorICAgIGVyciA9IF9nY3J5X2NpcGhlcl9zZXRrZXkgKGhkZGVjLCB0dlt0dmldLmtleSwgc2l6ZW9mIHR2W3R2aV0ua2V5KTsKKyAgaWYgKGVycikKKyAgICBGYWlsICgic2V0IGtleSIpOworICBlcnIgPSBfZ2NyeV9jaXBoZXJfc2V0aXYgKGhkZW5jLCB0dlt0dmldLml2LCBzaXplb2YgdHZbdHZpXS5pdik7CisgIGlmICghZXJyKQorICAgIGVyciA9IF9nY3J5X2NpcGhlcl9zZXRpdiAoaGRkZWMsIHR2W3R2aV0uaXYsIHNpemVvZiB0dlt0dmldLml2KTsKKyAgaWYgKGVycikKKyAgICBGYWlsICgic2V0IElWIik7CisgIGZvciAoaWR4PTA7IGlkeCA8IERJTSAodHZbdHZpXS5kYXRhKTsgaWR4KyspCisgICAgeworICAgICAgZXJyID0gX2djcnlfY2lwaGVyX2VuY3J5cHQgKGhkZW5jLCBzY3JhdGNoLCBzaXplb2Ygc2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dlt0dmldLmRhdGFbaWR4XS5pbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgdHZbdHZpXS5kYXRhW2lkeF0uaW5wdXQpOworICAgICAgaWYgKGVycikKKyAgICAgICAgRmFpbCAoImVuY3J5cHQgY29tbWFuZCIpOworICAgICAgaWYgKG1lbWNtcCAoc2NyYXRjaCwgdHZbdHZpXS5kYXRhW2lkeF0ub3V0cHV0LCBzaXplb2Ygc2NyYXRjaCkpCisgICAgICAgIEZhaWwgKCJlbmNyeXB0IG1pc21hdGNoIik7CisgICAgICBlcnIgPSBfZ2NyeV9jaXBoZXJfZGVjcnlwdCAoaGRkZWMsIHNjcmF0Y2gsIHNpemVvZiBzY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR2W3R2aV0uZGF0YVtpZHhdLm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgdHZbdHZpXS5kYXRhW2lkeF0ub3V0cHV0KTsKKyAgICAgIGlmIChlcnIpCisgICAgICAgIEZhaWwgKCJkZWNyeXB0IGNvbW1hbmQiKTsKKyAgICAgIGlmIChtZW1jbXAgKHNjcmF0Y2gsIHR2W3R2aV0uZGF0YVtpZHhdLmlucHV0LCBzaXplb2Ygc2NyYXRjaCkpCisgICAgICAgIEZhaWwgKCJkZWNyeXB0IG1pc21hdGNoIik7CisgICAgfQorCisjdW5kZWYgRmFpbAorICBfZ2NyeV9jaXBoZXJfY2xvc2UgKGhkZW5jKTsKKyAgX2djcnlfY2lwaGVyX2Nsb3NlIChoZGRlYyk7IAorICByZXR1cm4gTlVMTDsKK30KKworCisvKiBDb21wbGV0ZSBzZWxmdGVzdCBmb3IgQUVTLTEyOCB3aXRoIGFsbCBtb2RlcyBhbmQgZHJpdmVyIGNvZGUuICAqLworc3RhdGljIGdwZ19lcnJfY29kZV90CitzZWxmdGVzdF9maXBzXzEyOCAoaW50IGV4dGVuZGVkLCBzZWxmdGVzdF9yZXBvcnRfZnVuY190IHJlcG9ydCkKK3sKKyAgY29uc3QgY2hhciAqd2hhdDsKKyAgY29uc3QgY2hhciAqZXJydHh0OworICAKKyAgd2hhdCA9ICJsb3ctbGV2ZWwiOworICBlcnJ0eHQgPSBzZWxmdGVzdF9iYXNpY18xMjggKCk7CisgIGlmIChlcnJ0eHQpCisgICAgZ290byBmYWlsZWQ7CisKKyAgaWYgKGV4dGVuZGVkKQorICAgIHsKKyAgICAgIHdoYXQgPSAiY2ZiIjsKKyAgICAgIGVycnR4dCA9IHNlbGZ0ZXN0X2ZpcHNfMTI4XzM4YSAoR0NSWV9DSVBIRVJfTU9ERV9DRkIpOworICAgICAgaWYgKGVycnR4dCkKKyAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAKKyAgICAgIHdoYXQgPSAib2ZiIjsKKyAgICAgIGVycnR4dCA9IHNlbGZ0ZXN0X2ZpcHNfMTI4XzM4YSAoR0NSWV9DSVBIRVJfTU9ERV9PRkIpOworICAgICAgaWYgKGVycnR4dCkKKyAgICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIHJldHVybiAwOyAvKiBTdWNjZWVkZWQuICovCisKKyBmYWlsZWQ6CisgIGlmIChyZXBvcnQpCisgICAgcmVwb3J0ICgiY2lwaGVyIiwgR0NSWV9DSVBIRVJfQUVTMTI4LCB3aGF0LCBlcnJ0eHQpOworICByZXR1cm4gR1BHX0VSUl9TRUxGVEVTVF9GQUlMRUQ7Cit9CisKKy8qIENvbXBsZXRlIHNlbGZ0ZXN0IGZvciBBRVMtMTkyLiAgKi8KK3N0YXRpYyBncGdfZXJyX2NvZGVfdAorc2VsZnRlc3RfZmlwc18xOTIgKGludCBleHRlbmRlZCwgc2VsZnRlc3RfcmVwb3J0X2Z1bmNfdCByZXBvcnQpCit7CisgIGNvbnN0IGNoYXIgKndoYXQ7CisgIGNvbnN0IGNoYXIgKmVycnR4dDsKKworICAodm9pZClleHRlbmRlZDsgLyogTm8gZXh0ZW5kZWQgdGVzdHMgYXZhaWxhYmxlLiAgKi8KKworICB3aGF0ID0gImxvdy1sZXZlbCI7CisgIGVycnR4dCA9IHNlbGZ0ZXN0X2Jhc2ljXzE5MiAoKTsKKyAgaWYgKGVycnR4dCkKKyAgICBnb3RvIGZhaWxlZDsKKworCisgIHJldHVybiAwOyAvKiBTdWNjZWVkZWQuICovCisKKyBmYWlsZWQ6CisgIGlmIChyZXBvcnQpCisgICAgcmVwb3J0ICgiY2lwaGVyIiwgR0NSWV9DSVBIRVJfQUVTMTkyLCB3aGF0LCBlcnJ0eHQpOworICByZXR1cm4gR1BHX0VSUl9TRUxGVEVTVF9GQUlMRUQ7Cit9CisKKworLyogQ29tcGxldGUgc2VsZnRlc3QgZm9yIEFFUy0yNTYuICAqLworc3RhdGljIGdwZ19lcnJfY29kZV90CitzZWxmdGVzdF9maXBzXzI1NiAoaW50IGV4dGVuZGVkLCBzZWxmdGVzdF9yZXBvcnRfZnVuY190IHJlcG9ydCkKK3sKKyAgY29uc3QgY2hhciAqd2hhdDsKKyAgY29uc3QgY2hhciAqZXJydHh0OworICAKKyAgKHZvaWQpZXh0ZW5kZWQ7IC8qIE5vIGV4dGVuZGVkIHRlc3RzIGF2YWlsYWJsZS4gICovCisKKyAgd2hhdCA9ICJsb3ctbGV2ZWwiOworICBlcnJ0eHQgPSBzZWxmdGVzdF9iYXNpY18yNTYgKCk7CisgIGlmIChlcnJ0eHQpCisgICAgZ290byBmYWlsZWQ7CisKKyAgcmV0dXJuIDA7IC8qIFN1Y2NlZWRlZC4gKi8KKworIGZhaWxlZDoKKyAgaWYgKHJlcG9ydCkKKyAgICByZXBvcnQgKCJjaXBoZXIiLCBHQ1JZX0NJUEhFUl9BRVMyNTYsIHdoYXQsIGVycnR4dCk7CisgIHJldHVybiBHUEdfRVJSX1NFTEZURVNUX0ZBSUxFRDsKK30KKworCisKKy8qIFJ1biBhIGZ1bGwgc2VsZi10ZXN0IGZvciBBTEdPIGFuZCByZXR1cm4gMCBvbiBzdWNjZXNzLiAgKi8KK3N0YXRpYyBncGdfZXJyX2NvZGVfdAorcnVuX3NlbGZ0ZXN0cyAoaW50IGFsZ28sIGludCBleHRlbmRlZCwgc2VsZnRlc3RfcmVwb3J0X2Z1bmNfdCByZXBvcnQpCit7CisgIGdwZ19lcnJfY29kZV90IGVjOworCisgIHN3aXRjaCAoYWxnbykKKyAgICB7CisgICAgY2FzZSBHQ1JZX0NJUEhFUl9BRVMxMjg6CisgICAgICBlYyA9IHNlbGZ0ZXN0X2ZpcHNfMTI4IChleHRlbmRlZCwgcmVwb3J0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR0NSWV9DSVBIRVJfQUVTMTkyOgorICAgICAgZWMgPSBzZWxmdGVzdF9maXBzXzE5MiAoZXh0ZW5kZWQsIHJlcG9ydCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdDUllfQ0lQSEVSX0FFUzI1NjoKKyAgICAgIGVjID0gc2VsZnRlc3RfZmlwc18yNTYgKGV4dGVuZGVkLCByZXBvcnQpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGVjID0gR1BHX0VSUl9DSVBIRVJfQUxHTzsKKyAgICAgIGJyZWFrOworICAgICAgICAKKyAgICB9CisgIHJldHVybiBlYzsKK30KKworCisMCisKK3N0YXRpYyBjb25zdCBjaGFyICpyaWpuZGFlbF9uYW1lc1tdID0KKyAgeworICAgICJSSUpOREFFTCIsCisgICAgIkFFUzEyOCIsCisgICAgIkFFUy0xMjgiLAorICAgIE5VTEwKKyAgfTsKKworc3RhdGljIGdjcnlfY2lwaGVyX29pZF9zcGVjX3QgcmlqbmRhZWxfb2lkc1tdID0KKyAgeworICAgIHsgIjIuMTYuODQwLjEuMTAxLjMuNC4xLjEiLCBHQ1JZX0NJUEhFUl9NT0RFX0VDQiB9LAorICAgIHsgIjIuMTYuODQwLjEuMTAxLjMuNC4xLjIiLCBHQ1JZX0NJUEhFUl9NT0RFX0NCQyB9LAorICAgIHsgIjIuMTYuODQwLjEuMTAxLjMuNC4xLjMiLCBHQ1JZX0NJUEhFUl9NT0RFX09GQiB9LAorICAgIHsgIjIuMTYuODQwLjEuMTAxLjMuNC4xLjQiLCBHQ1JZX0NJUEhFUl9NT0RFX0NGQiB9LAorICAgIHsgTlVMTCB9CisgIH07CisKK2djcnlfY2lwaGVyX3NwZWNfdCBfZ2NyeV9jaXBoZXJfc3BlY19hZXMgPQorICB7CisgICAgIkFFUyIsIHJpam5kYWVsX25hbWVzLCByaWpuZGFlbF9vaWRzLCAxNiwgMTI4LCBzaXplb2YgKFJJSk5EQUVMX2NvbnRleHQpLAorICAgIHJpam5kYWVsX3NldGtleSwgcmlqbmRhZWxfZW5jcnlwdCwgcmlqbmRhZWxfZGVjcnlwdAorICB9OworY2lwaGVyX2V4dHJhX3NwZWNfdCBfZ2NyeV9jaXBoZXJfZXh0cmFzcGVjX2FlcyA9IAorICB7CisgICAgcnVuX3NlbGZ0ZXN0cworICB9OworCitzdGF0aWMgY29uc3QgY2hhciAqcmlqbmRhZWwxOTJfbmFtZXNbXSA9CisgIHsKKyAgICAiUklKTkRBRUwxOTIiLAorICAgICJBRVMtMTkyIiwKKyAgICBOVUxMCisgIH07CisKK3N0YXRpYyBnY3J5X2NpcGhlcl9vaWRfc3BlY190IHJpam5kYWVsMTkyX29pZHNbXSA9CisgIHsKKyAgICB7ICIyLjE2Ljg0MC4xLjEwMS4zLjQuMS4yMSIsIEdDUllfQ0lQSEVSX01PREVfRUNCIH0sCisgICAgeyAiMi4xNi44NDAuMS4xMDEuMy40LjEuMjIiLCBHQ1JZX0NJUEhFUl9NT0RFX0NCQyB9LAorICAgIHsgIjIuMTYuODQwLjEuMTAxLjMuNC4xLjIzIiwgR0NSWV9DSVBIRVJfTU9ERV9PRkIgfSwKKyAgICB7ICIyLjE2Ljg0MC4xLjEwMS4zLjQuMS4yNCIsIEdDUllfQ0lQSEVSX01PREVfQ0ZCIH0sCisgICAgeyBOVUxMIH0KKyAgfTsKKworZ2NyeV9jaXBoZXJfc3BlY190IF9nY3J5X2NpcGhlcl9zcGVjX2FlczE5MiA9CisgIHsKKyAgICAiQUVTMTkyIiwgcmlqbmRhZWwxOTJfbmFtZXMsIHJpam5kYWVsMTkyX29pZHMsIDE2LCAxOTIsIHNpemVvZiAoUklKTkRBRUxfY29udGV4dCksCisgICAgcmlqbmRhZWxfc2V0a2V5LCByaWpuZGFlbF9lbmNyeXB0LCByaWpuZGFlbF9kZWNyeXB0CisgIH07CitjaXBoZXJfZXh0cmFfc3BlY190IF9nY3J5X2NpcGhlcl9leHRyYXNwZWNfYWVzMTkyID0gCisgIHsKKyAgICBydW5fc2VsZnRlc3RzCisgIH07CisKK3N0YXRpYyBjb25zdCBjaGFyICpyaWpuZGFlbDI1Nl9uYW1lc1tdID0KKyAgeworICAgICJSSUpOREFFTDI1NiIsCisgICAgIkFFUy0yNTYiLAorICAgIE5VTEwKKyAgfTsKKworc3RhdGljIGdjcnlfY2lwaGVyX29pZF9zcGVjX3QgcmlqbmRhZWwyNTZfb2lkc1tdID0KKyAgeworICAgIHsgIjIuMTYuODQwLjEuMTAxLjMuNC4xLjQxIiwgR0NSWV9DSVBIRVJfTU9ERV9FQ0IgfSwKKyAgICB7ICIyLjE2Ljg0MC4xLjEwMS4zLjQuMS40MiIsIEdDUllfQ0lQSEVSX01PREVfQ0JDIH0sCisgICAgeyAiMi4xNi44NDAuMS4xMDEuMy40LjEuNDMiLCBHQ1JZX0NJUEhFUl9NT0RFX09GQiB9LAorICAgIHsgIjIuMTYuODQwLjEuMTAxLjMuNC4xLjQ0IiwgR0NSWV9DSVBIRVJfTU9ERV9DRkIgfSwKKyAgICB7IE5VTEwgfQorICB9OworCitnY3J5X2NpcGhlcl9zcGVjX3QgX2djcnlfY2lwaGVyX3NwZWNfYWVzMjU2ID0KKyAgeworICAgICJBRVMyNTYiLCByaWpuZGFlbDI1Nl9uYW1lcywgcmlqbmRhZWwyNTZfb2lkcywgMTYsIDI1NiwKKyAgICBzaXplb2YgKFJJSk5EQUVMX2NvbnRleHQpLAorICAgIHJpam5kYWVsX3NldGtleSwgcmlqbmRhZWxfZW5jcnlwdCwgcmlqbmRhZWxfZGVjcnlwdAorICB9OworCitjaXBoZXJfZXh0cmFfc3BlY190IF9nY3J5X2NpcGhlcl9leHRyYXNwZWNfYWVzMjU2ID0gCisgIHsKKyAgICBydW5fc2VsZnRlc3RzCisgIH07CmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvY2lwaGVyL3JtZC5oIGIvbGliZ2NyeXB0LTEuNC42L2NpcGhlci9ybWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGNlOWM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L2NpcGhlci9ybWQuaApAQCAtMCwwICsxLDM3IEBACisvKiBybWQuaCAtIFJJUEUtTUQgaGFzaCBmdW5jdGlvbnMKKyAqCUNvcHlyaWdodCAoQykgMTk5OCwgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKi8KKyNpZm5kZWYgRzEwX1JNRF9ICisjZGVmaW5lIEcxMF9STURfSAorCisKKy8qIFdlIG5lZWQgdGhpcyBoZXJlIGJlY2F1c2UgcmFuZG9tLmMgbXVzdCBoYXZlIGRpcmVjdCBhY2Nlc3MuICovCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgdTMyICBoMCxoMSxoMixoMyxoNDsKKyAgdTMyICBuYmxvY2tzOworICBieXRlIGJ1Zls2NF07CisgIGludCAgY291bnQ7Cit9IFJNRDE2MF9DT05URVhUOworCit2b2lkIF9nY3J5X3JtZDE2MF9pbml0ICggdm9pZCAqY29udGV4dCApOwordm9pZCBfZ2NyeV9ybWQxNjBfbWl4YmxvY2sgKCBSTUQxNjBfQ09OVEVYVCAqaGQsIHZvaWQgKmJsb2Nrb2Y2NGJ5dGUgKTsKKworI2VuZGlmIC8qRzEwX1JNRF9IKi8KKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L2NpcGhlci9ybWQxNjAuYyBiL2xpYmdjcnlwdC0xLjQuNi9jaXBoZXIvcm1kMTYwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgwNWJmNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9jaXBoZXIvcm1kMTYwLmMKQEAgLTAsMCArMSw1NzIgQEAKKy8qIHJtZDE2MC5jICAtCVJJUEUtTUQxNjAKKyAqIENvcHlyaWdodCAoQykgMTk5OCwgMjAwMSwgMjAwMiwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnMTBsaWIuaCIKKyNpbmNsdWRlICJtZW1vcnkuaCIKKyNpbmNsdWRlICJybWQuaCIKKyNpbmNsdWRlICJjaXBoZXIuaCIgLyogT25seSB1c2VkIGZvciB0aGUgcm1kMTYwX2hhc2hfYnVmZmVyKCkgcHJvdG90eXBlLiAqLworCisjaW5jbHVkZSAiYml0aGVscC5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSSVBFTUQtMTYwIGlzIG5vdCBwYXRlbnRlZCwgc2VlIChhcyBvZiAyNS4xMC45NykKKyAqICAgaHR0cDovL3d3dy5lc2F0Lmt1bGV1dmVuLmFjLmJlL35ib3NzZWxhZS9yaXBlbWQxNjAuaHRtbAorICogTm90ZSB0aGF0IHRoZSBjb2RlIHVzZXMgTGl0dGxlIEVuZGlhbiBieXRlb3JkZXIsIHdoaWNoIGlzIGdvb2QgZm9yCisgKiAzODYgZXRjLCBidXQgd2UgbXVzdCBhZGQgc29tZSBjb252ZXJzaW9uIHdoZW4gdXNlZCBvbiBhIGJpZyBlbmRpYW4gYm94LgorICoKKyAqCisgKiBQc2V1ZG8tY29kZSBmb3IgUklQRU1ELTE2MAorICoKKyAqIFJJUEVNRC0xNjAgaXMgYW4gaXRlcmF0aXZlIGhhc2ggZnVuY3Rpb24gdGhhdCBvcGVyYXRlcyBvbiAzMi1iaXQgd29yZHMuCisgKiBUaGUgcm91bmQgZnVuY3Rpb24gdGFrZXMgYXMgaW5wdXQgYSA1LXdvcmQgY2hhaW5pbmcgdmFyaWFibGUgYW5kIGEgMTYtd29yZAorICogbWVzc2FnZSBibG9jayBhbmQgbWFwcyB0aGlzIHRvIGEgbmV3IGNoYWluaW5nIHZhcmlhYmxlLiBBbGwgb3BlcmF0aW9ucyBhcmUKKyAqIGRlZmluZWQgb24gMzItYml0IHdvcmRzLiBQYWRkaW5nIGlzIGlkZW50aWNhbCB0byB0aGF0IG9mIE1ENC4KKyAqCisgKgorICogUklQRU1ELTE2MDogZGVmaW5pdGlvbnMKKyAqCisgKgorICogICBub25saW5lYXIgZnVuY3Rpb25zIGF0IGJpdCBsZXZlbDogZXhvciwgbXV4LCAtLCBtdXgsIC0KKyAqCisgKiAgIGYoaiwgeCwgeSwgeikgPSB4IFhPUiB5IFhPUiB6CQkgICgwIDw9IGogPD0gMTUpCisgKiAgIGYoaiwgeCwgeSwgeikgPSAoeCBBTkQgeSkgT1IgKE5PVCh4KSBBTkQgeikgICgxNiA8PSBqIDw9IDMxKQorICogICBmKGosIHgsIHksIHopID0gKHggT1IgTk9UKHkpKSBYT1IgegkgICgzMiA8PSBqIDw9IDQ3KQorICogICBmKGosIHgsIHksIHopID0gKHggQU5EIHopIE9SICh5IEFORCBOT1QoeikpICAoNDggPD0gaiA8PSA2MykKKyAqICAgZihqLCB4LCB5LCB6KSA9IHggWE9SICh5IE9SIE5PVCh6KSkJICAoNjQgPD0gaiA8PSA3OSkKKyAqCisgKgorICogICBhZGRlZCBjb25zdGFudHMgKGhleGFkZWNpbWFsKQorICoKKyAqICAgSyhqKSA9IDB4MDAwMDAwMDAJICAgICgwIDw9IGogPD0gMTUpCisgKiAgIEsoaikgPSAweDVBODI3OTk5CSAgICgxNiA8PSBqIDw9IDMxKQlpbnQoMioqMzAgeCBzcXJ0KDIpKQorICogICBLKGopID0gMHg2RUQ5RUJBMQkgICAoMzIgPD0gaiA8PSA0NykJaW50KDIqKjMwIHggc3FydCgzKSkKKyAqICAgSyhqKSA9IDB4OEYxQkJDREMJICAgKDQ4IDw9IGogPD0gNjMpCWludCgyKiozMCB4IHNxcnQoNSkpCisgKiAgIEsoaikgPSAweEE5NTNGRDRFCSAgICg2NCA8PSBqIDw9IDc5KQlpbnQoMioqMzAgeCBzcXJ0KDcpKQorICogICBLJyhqKSA9IDB4NTBBMjhCRTYgICAgICgwIDw9IGogPD0gMTUpICAgICAgaW50KDIqKjMwIHggY2JydCgyKSkKKyAqICAgSycoaikgPSAweDVDNEREMTI0ICAgICgxNiA8PSBqIDw9IDMxKSAgICAgIGludCgyKiozMCB4IGNicnQoMykpCisgKiAgIEsnKGopID0gMHg2RDcwM0VGMyAgICAoMzIgPD0gaiA8PSA0NykgICAgICBpbnQoMioqMzAgeCBjYnJ0KDUpKQorICogICBLJyhqKSA9IDB4N0E2RDc2RTkgICAgKDQ4IDw9IGogPD0gNjMpICAgICAgaW50KDIqKjMwIHggY2JydCg3KSkKKyAqICAgSycoaikgPSAweDAwMDAwMDAwICAgICg2NCA8PSBqIDw9IDc5KQorICoKKyAqCisgKiAgIHNlbGVjdGlvbiBvZiBtZXNzYWdlIHdvcmQKKyAqCisgKiAgIHIoaikgICAgICA9IGoJCSAgICAgICgwIDw9IGogPD0gMTUpCisgKiAgIHIoMTYuLjMxKSA9IDcsIDQsIDEzLCAxLCAxMCwgNiwgMTUsIDMsIDEyLCAwLCA5LCA1LCAyLCAxNCwgMTEsIDgKKyAqICAgcigzMi4uNDcpID0gMywgMTAsIDE0LCA0LCA5LCAxNSwgOCwgMSwgMiwgNywgMCwgNiwgMTMsIDExLCA1LCAxMgorICogICByKDQ4Li42MykgPSAxLCA5LCAxMSwgMTAsIDAsIDgsIDEyLCA0LCAxMywgMywgNywgMTUsIDE0LCA1LCA2LCAyCisgKiAgIHIoNjQuLjc5KSA9IDQsIDAsIDUsIDksIDcsIDEyLCAyLCAxMCwgMTQsIDEsIDMsIDgsIDExLCA2LCAxNSwgMTMKKyAqICAgcjAoMC4uMTUpID0gNSwgMTQsIDcsIDAsIDksIDIsIDExLCA0LCAxMywgNiwgMTUsIDgsIDEsIDEwLCAzLCAxMgorICogICByMCgxNi4uMzEpPSA2LCAxMSwgMywgNywgMCwgMTMsIDUsIDEwLCAxNCwgMTUsIDgsIDEyLCA0LCA5LCAxLCAyCisgKiAgIHIwKDMyLi40Nyk9IDE1LCA1LCAxLCAzLCA3LCAxNCwgNiwgOSwgMTEsIDgsIDEyLCAyLCAxMCwgMCwgNCwgMTMKKyAqICAgcjAoNDguLjYzKT0gOCwgNiwgNCwgMSwgMywgMTEsIDE1LCAwLCA1LCAxMiwgMiwgMTMsIDksIDcsIDEwLCAxNAorICogICByMCg2NC4uNzkpPSAxMiwgMTUsIDEwLCA0LCAxLCA1LCA4LCA3LCA2LCAyLCAxMywgMTQsIDAsIDMsIDksIDExCisgKgorICoKKyAqICAgYW1vdW50IGZvciByb3RhdGUgbGVmdCAocm9sKQorICoKKyAqICAgcygwLi4xNSkgID0gMTEsIDE0LCAxNSwgMTIsIDUsIDgsIDcsIDksIDExLCAxMywgMTQsIDE1LCA2LCA3LCA5LCA4CisgKiAgIHMoMTYuLjMxKSA9IDcsIDYsIDgsIDEzLCAxMSwgOSwgNywgMTUsIDcsIDEyLCAxNSwgOSwgMTEsIDcsIDEzLCAxMgorICogICBzKDMyLi40NykgPSAxMSwgMTMsIDYsIDcsIDE0LCA5LCAxMywgMTUsIDE0LCA4LCAxMywgNiwgNSwgMTIsIDcsIDUKKyAqICAgcyg0OC4uNjMpID0gMTEsIDEyLCAxNCwgMTUsIDE0LCAxNSwgOSwgOCwgOSwgMTQsIDUsIDYsIDgsIDYsIDUsIDEyCisgKiAgIHMoNjQuLjc5KSA9IDksIDE1LCA1LCAxMSwgNiwgOCwgMTMsIDEyLCA1LCAxMiwgMTMsIDE0LCAxMSwgOCwgNSwgNgorICogICBzJygwLi4xNSkgPSA4LCA5LCA5LCAxMSwgMTMsIDE1LCAxNSwgNSwgNywgNywgOCwgMTEsIDE0LCAxNCwgMTIsIDYKKyAqICAgcycoMTYuLjMxKT0gOSwgMTMsIDE1LCA3LCAxMiwgOCwgOSwgMTEsIDcsIDcsIDEyLCA3LCA2LCAxNSwgMTMsIDExCisgKiAgIHMnKDMyLi40Nyk9IDksIDcsIDE1LCAxMSwgOCwgNiwgNiwgMTQsIDEyLCAxMywgNSwgMTQsIDEzLCAxMywgNywgNQorICogICBzJyg0OC4uNjMpPSAxNSwgNSwgOCwgMTEsIDE0LCAxNCwgNiwgMTQsIDYsIDksIDEyLCA5LCAxMiwgNSwgMTUsIDgKKyAqICAgcycoNjQuLjc5KT0gOCwgNSwgMTIsIDksIDEyLCA1LCAxNCwgNiwgOCwgMTMsIDYsIDUsIDE1LCAxMywgMTEsIDExCisgKgorICoKKyAqICAgaW5pdGlhbCB2YWx1ZSAoaGV4YWRlY2ltYWwpCisgKgorICogICBoMCA9IDB4Njc0NTIzMDE7IGgxID0gMHhFRkNEQUI4OTsgaDIgPSAweDk4QkFEQ0ZFOyBoMyA9IDB4MTAzMjU0NzY7CisgKgkJCQkJCQloNCA9IDB4QzNEMkUxRjA7CisgKgorICoKKyAqIFJJUEVNRC0xNjA6IHBzZXVkby1jb2RlCisgKgorICogICBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIG1lc3NhZ2UgYWZ0ZXIgcGFkZGluZyBjb25zaXN0cyBvZiB0IDE2LXdvcmQgYmxvY2tzCisgKiAgIHRoYXQgd2lsbCBiZSBkZW5vdGVkIHdpdGggWFtpXVtqXSwgd2l0aCAwIDw9IGkgPD0gdC0xIGFuZCAwIDw9IGogPD0gMTUuCisgKiAgIFRoZSBzeW1ib2wgWytdIGRlbm90ZXMgYWRkaXRpb24gbW9kdWxvIDIqKjMyIGFuZCByb2xfcyBkZW5vdGVzIGN5Y2xpYyBsZWZ0CisgKiAgIHNoaWZ0IChyb3RhdGUpIG92ZXIgcyBwb3NpdGlvbnMuCisgKgorICoKKyAqICAgZm9yIGkgOj0gMCB0byB0LTEgeworICoJIEEgOj0gaDA7IEIgOj0gaDE7IEMgOj0gaDI7IEQgPSBoMzsgRSA9IGg0OworICoJIEEnIDo9IGgwOyBCJyA6PSBoMTsgQycgOj0gaDI7IEQnID0gaDM7IEUnID0gaDQ7CisgKgkgZm9yIGogOj0gMCB0byA3OSB7CisgKgkgICAgIFQgOj0gcm9sX3MoaikoQSBbK10gZihqLCBCLCBDLCBEKSBbK10gWFtpXVtyKGopXSBbK10gSyhqKSkgWytdIEU7CisgKgkgICAgIEEgOj0gRTsgRSA6PSBEOyBEIDo9IHJvbF8xMChDKTsgQyA6PSBCOyBCIDo9IFQ7CisgKgkgICAgIFQgOj0gcm9sX3MnKGopKEEnIFsrXSBmKDc5LWosIEInLCBDJywgRCcpIFsrXSBYW2ldW3InKGopXQorCQkJCQkJICAgICAgIFsrXSBLJyhqKSkgWytdIEUnOworICoJICAgICBBJyA6PSBFJzsgRScgOj0gRCc7IEQnIDo9IHJvbF8xMChDJyk7IEMnIDo9IEInOyBCJyA6PSBUOworICoJIH0KKyAqCSBUIDo9IGgxIFsrXSBDIFsrXSBEJzsgaDEgOj0gaDIgWytdIEQgWytdIEUnOyBoMiA6PSBoMyBbK10gRSBbK10gQSc7CisgKgkgaDMgOj0gaDQgWytdIEEgWytdIEInOyBoNCA6PSBoMCBbK10gQiBbK10gQyc7IGgwIDo9IFQ7CisgKiAgIH0KKyAqLworCisvKiBTb21lIGV4YW1wbGVzOgorICogIiIgICAgICAgICAgICAgICAgICAgIDljMTE4NWE1YzVlOWZjNTQ2MTI4MDg5NzdlZThmNTQ4YjIyNThkMzEKKyAqICJhIiAgICAgICAgICAgICAgICAgICAwYmRjOWQyZDI1NmIzZWU5ZGFhZTM0N2JlNmY0ZGM4MzVhNDY3ZmZlCisgKiAiYWJjIiAgICAgICAgICAgICAgICAgOGViMjA4ZjdlMDVkOTg3YTliMDQ0YThlOThjNmIwODdmMTVhMGJmYworICogIm1lc3NhZ2UgZGlnZXN0IiAgICAgIDVkMDY4OWVmNDlkMmZhZTU3MmI4ODFiMTIzYTg1ZmZhMjE1OTVmMzYKKyAqICJhLi4ueiIgICAgICAgICAgICAgICBmNzFjMjcxMDljNjkyYzFiNTZiYmRjZWI1YjlkMjg2NWIzNzA4ZGJjCisgKiAiYWJjZGJjZGUuLi5ub3BxIiAgICAgMTJhMDUzMzg0YTljMGM4OGU0MDVhMDZjMjdkY2Y0OWFkYTYyZWIyYgorICogIkEuLi5aYS4uLnowLi4uOSIgICAgIGIwZTIwYjZlMzExNjY0MDI4NmVkM2E4N2E1NzEzMDc5YjIxZjUxODkKKyAqIDggdGltZXMgIjEyMzQ1Njc4OTAiICA5Yjc1MmU0NTU3M2Q0YjM5ZjRkYmQzMzIzY2FiODJiZjYzMzI2YmZiCisgKiAxIG1pbGxpb24gdGltZXMgImEiICAgNTI3ODMyNDNjMTY5N2JkYmUxNmQzN2Y5N2Y2OGYwODMyNWRjMTUyOAorICovCisKKwordm9pZAorX2djcnlfcm1kMTYwX2luaXQgKHZvaWQgKmNvbnRleHQpCit7CisgIFJNRDE2MF9DT05URVhUICpoZCA9IGNvbnRleHQ7CisKKyAgaGQtPmgwID0gMHg2NzQ1MjMwMTsKKyAgaGQtPmgxID0gMHhFRkNEQUI4OTsKKyAgaGQtPmgyID0gMHg5OEJBRENGRTsKKyAgaGQtPmgzID0gMHgxMDMyNTQ3NjsKKyAgaGQtPmg0ID0gMHhDM0QyRTFGMDsKKyAgaGQtPm5ibG9ja3MgPSAwOworICBoZC0+Y291bnQgPSAwOworfQorCisKKworLyoqKioqKioqKioqKioqKioKKyAqIFRyYW5zZm9ybSB0aGUgbWVzc2FnZSBYIHdoaWNoIGNvbnNpc3RzIG9mIDE2IDMyLWJpdC13b3JkcworICovCitzdGF0aWMgdm9pZAordHJhbnNmb3JtICggUk1EMTYwX0NPTlRFWFQgKmhkLCBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhICkKK3sKKyAgcmVnaXN0ZXIgdTMyIGEsYixjLGQsZTsKKyAgdTMyIGFhLGJiLGNjLGRkLGVlLHQ7CisjaWZkZWYgV09SRFNfQklHRU5ESUFOCisgIHUzMiB4WzE2XTsKKyAgeworICAgIGludCBpOworICAgIGJ5dGUgKnAyLCAqcDE7CisgICAgZm9yIChpPTAsIHAxPWRhdGEsIHAyPShieXRlKil4OyBpIDwgMTY7IGkrKywgcDIgKz0gNCApCisgICAgICB7CisgICAgICAgIHAyWzNdID0gKnAxKys7CisgICAgICAgIHAyWzJdID0gKnAxKys7CisgICAgICAgIHAyWzFdID0gKnAxKys7CisgICAgICAgIHAyWzBdID0gKnAxKys7CisgICAgICB9CisgIH0KKyNlbHNlCisgIC8qIFRoaXMgdmVyc2lvbiBpcyBiZXR0ZXIgYmVjYXVzZSBpdCBpcyBhbHdheXMgYWxpZ25lZDsKKyAgICogVGhlIHBlcmZvcm1hbmNlIHBlbmFsdHkgb24gYSA1ODYtMTAwIGlzIGFib3V0IDYlIHdoaWNoCisgICAqIGlzIGFjY2VwdGFibGUgLSBiZWNhdXNlIHRoZSBkYXRhIGlzIG1vcmUgbG9jYWwgaXQgbWlnaHQKKyAgICogYWxzbyBiZSBwb3NzaWJsZSB0aGF0IHRoaXMgaXMgZmFzdGVyIG9uIHNvbWUgbWFjaGluZXMuCisgICAqIFRoaXMgZnVuY3Rpb24gKHdoZW4gY29tcGlsZWQgd2l0aCAtMDIgb24gZ2NjIDIuNy4yKQorICAgKiBleGVjdXRlcyBvbiBhIDU4Ni0xMDAgKDM5LjczIGJvZ29taXBzKSBhdCBhYm91dCAxOTAwa2Ivc2VjOworICAgKiBbbWVhc3VyZWQgd2l0aCBhIDRNQiBkYXRhIGFuZCAiZ3BnbSAtLXByaW50LW1kIHJtZDE2MCJdICovCisgIHUzMiB4WzE2XTsKKyAgbWVtY3B5KCB4LCBkYXRhLCA2NCApOworI2VuZGlmCisKKworI2RlZmluZSBLMCAgMHgwMDAwMDAwMAorI2RlZmluZSBLMSAgMHg1QTgyNzk5OQorI2RlZmluZSBLMiAgMHg2RUQ5RUJBMQorI2RlZmluZSBLMyAgMHg4RjFCQkNEQworI2RlZmluZSBLNCAgMHhBOTUzRkQ0RQorI2RlZmluZSBLSzAgMHg1MEEyOEJFNgorI2RlZmluZSBLSzEgMHg1QzRERDEyNAorI2RlZmluZSBLSzIgMHg2RDcwM0VGMworI2RlZmluZSBLSzMgMHg3QTZENzZFOQorI2RlZmluZSBLSzQgMHgwMDAwMDAwMAorI2RlZmluZSBGMCh4LHkseikgICAoICh4KSBeICh5KSBeICh6KSApCisjZGVmaW5lIEYxKHgseSx6KSAgICggKCh4KSAmICh5KSkgfCAofih4KSAmICh6KSkgKQorI2RlZmluZSBGMih4LHkseikgICAoICgoeCkgfCB+KHkpKSBeICh6KSApCisjZGVmaW5lIEYzKHgseSx6KSAgICggKCh4KSAmICh6KSkgfCAoKHkpICYgfih6KSkgKQorI2RlZmluZSBGNCh4LHkseikgICAoICh4KSBeICgoeSkgfCB+KHopKSApCisjZGVmaW5lIFIoYSxiLGMsZCxlLGYsayxyLHMpIGRvIHsgdCA9IGEgKyBmKGIsYyxkKSArIGsgKyB4W3JdOyBcCisJCQkJICBhID0gcm9sKHQscykgKyBlOwkgICAgICAgXAorCQkJCSAgYyA9IHJvbChjLDEwKTsJICAgICAgIFwKKwkJCQl9IHdoaWxlKDApCisKKyAgLyogbGVmdCBsYW5lICovCisgIGEgPSBoZC0+aDA7CisgIGIgPSBoZC0+aDE7CisgIGMgPSBoZC0+aDI7CisgIGQgPSBoZC0+aDM7CisgIGUgPSBoZC0+aDQ7CisgIFIoIGEsIGIsIGMsIGQsIGUsIEYwLCBLMCwgIDAsIDExICk7CisgIFIoIGUsIGEsIGIsIGMsIGQsIEYwLCBLMCwgIDEsIDE0ICk7CisgIFIoIGQsIGUsIGEsIGIsIGMsIEYwLCBLMCwgIDIsIDE1ICk7CisgIFIoIGMsIGQsIGUsIGEsIGIsIEYwLCBLMCwgIDMsIDEyICk7CisgIFIoIGIsIGMsIGQsIGUsIGEsIEYwLCBLMCwgIDQsICA1ICk7CisgIFIoIGEsIGIsIGMsIGQsIGUsIEYwLCBLMCwgIDUsICA4ICk7CisgIFIoIGUsIGEsIGIsIGMsIGQsIEYwLCBLMCwgIDYsICA3ICk7CisgIFIoIGQsIGUsIGEsIGIsIGMsIEYwLCBLMCwgIDcsICA5ICk7CisgIFIoIGMsIGQsIGUsIGEsIGIsIEYwLCBLMCwgIDgsIDExICk7CisgIFIoIGIsIGMsIGQsIGUsIGEsIEYwLCBLMCwgIDksIDEzICk7CisgIFIoIGEsIGIsIGMsIGQsIGUsIEYwLCBLMCwgMTAsIDE0ICk7CisgIFIoIGUsIGEsIGIsIGMsIGQsIEYwLCBLMCwgMTEsIDE1ICk7CisgIFIoIGQsIGUsIGEsIGIsIGMsIEYwLCBLMCwgMTIsICA2ICk7CisgIFIoIGMsIGQsIGUsIGEsIGIsIEYwLCBLMCwgMTMsICA3ICk7CisgIFIoIGIsIGMsIGQsIGUsIGEsIEYwLCBLMCwgMTQsICA5ICk7CisgIFIoIGEsIGIsIGMsIGQsIGUsIEYwLCBLMCwgMTUsICA4ICk7CisgIFIoIGUsIGEsIGIsIGMsIGQsIEYxLCBLMSwgIDcsICA3ICk7CisgIFIoIGQsIGUsIGEsIGIsIGMsIEYxLCBLMSwgIDQsICA2ICk7CisgIFIoIGMsIGQsIGUsIGEsIGIsIEYxLCBLMSwgMTMsICA4ICk7CisgIFIoIGIsIGMsIGQsIGUsIGEsIEYxLCBLMSwgIDEsIDEzICk7CisgIFIoIGEsIGIsIGMsIGQsIGUsIEYxLCBLMSwgMTAsIDExICk7CisgIFIoIGUsIGEsIGIsIGMsIGQsIEYxLCBLMSwgIDYsICA5ICk7CisgIFIoIGQsIGUsIGEsIGIsIGMsIEYxLCBLMSwgMTUsICA3ICk7CisgIFIoIGMsIGQsIGUsIGEsIGIsIEYxLCBLMSwgIDMsIDE1ICk7CisgIFIoIGIsIGMsIGQsIGUsIGEsIEYxLCBLMSwgMTIsICA3ICk7CisgIFIoIGEsIGIsIGMsIGQsIGUsIEYxLCBLMSwgIDAsIDEyICk7CisgIFIoIGUsIGEsIGIsIGMsIGQsIEYxLCBLMSwgIDksIDE1ICk7CisgIFIoIGQsIGUsIGEsIGIsIGMsIEYxLCBLMSwgIDUsICA5ICk7CisgIFIoIGMsIGQsIGUsIGEsIGIsIEYxLCBLMSwgIDIsIDExICk7CisgIFIoIGIsIGMsIGQsIGUsIGEsIEYxLCBLMSwgMTQsICA3ICk7CisgIFIoIGEsIGIsIGMsIGQsIGUsIEYxLCBLMSwgMTEsIDEzICk7CisgIFIoIGUsIGEsIGIsIGMsIGQsIEYxLCBLMSwgIDgsIDEyICk7CisgIFIoIGQsIGUsIGEsIGIsIGMsIEYyLCBLMiwgIDMsIDExICk7CisgIFIoIGMsIGQsIGUsIGEsIGIsIEYyLCBLMiwgMTAsIDEzICk7CisgIFIoIGIsIGMsIGQsIGUsIGEsIEYyLCBLMiwgMTQsICA2ICk7CisgIFIoIGEsIGIsIGMsIGQsIGUsIEYyLCBLMiwgIDQsICA3ICk7CisgIFIoIGUsIGEsIGIsIGMsIGQsIEYyLCBLMiwgIDksIDE0ICk7CisgIFIoIGQsIGUsIGEsIGIsIGMsIEYyLCBLMiwgMTUsICA5ICk7CisgIFIoIGMsIGQsIGUsIGEsIGIsIEYyLCBLMiwgIDgsIDEzICk7CisgIFIoIGIsIGMsIGQsIGUsIGEsIEYyLCBLMiwgIDEsIDE1ICk7CisgIFIoIGEsIGIsIGMsIGQsIGUsIEYyLCBLMiwgIDIsIDE0ICk7CisgIFIoIGUsIGEsIGIsIGMsIGQsIEYyLCBLMiwgIDcsICA4ICk7CisgIFIoIGQsIGUsIGEsIGIsIGMsIEYyLCBLMiwgIDAsIDEzICk7CisgIFIoIGMsIGQsIGUsIGEsIGIsIEYyLCBLMiwgIDYsICA2ICk7CisgIFIoIGIsIGMsIGQsIGUsIGEsIEYyLCBLMiwgMTMsICA1ICk7CisgIFIoIGEsIGIsIGMsIGQsIGUsIEYyLCBLMiwgMTEsIDEyICk7CisgIFIoIGUsIGEsIGIsIGMsIGQsIEYyLCBLMiwgIDUsICA3ICk7CisgIFIoIGQsIGUsIGEsIGIsIGMsIEYyLCBLMiwgMTIsICA1ICk7CisgIFIoIGMsIGQsIGUsIGEsIGIsIEYzLCBLMywgIDEsIDExICk7CisgIFIoIGIsIGMsIGQsIGUsIGEsIEYzLCBLMywgIDksIDEyICk7CisgIFIoIGEsIGIsIGMsIGQsIGUsIEYzLCBLMywgMTEsIDE0ICk7CisgIFIoIGUsIGEsIGIsIGMsIGQsIEYzLCBLMywgMTAsIDE1ICk7CisgIFIoIGQsIGUsIGEsIGIsIGMsIEYzLCBLMywgIDAsIDE0ICk7CisgIFIoIGMsIGQsIGUsIGEsIGIsIEYzLCBLMywgIDgsIDE1ICk7CisgIFIoIGIsIGMsIGQsIGUsIGEsIEYzLCBLMywgMTIsICA5ICk7CisgIFIoIGEsIGIsIGMsIGQsIGUsIEYzLCBLMywgIDQsICA4ICk7CisgIFIoIGUsIGEsIGIsIGMsIGQsIEYzLCBLMywgMTMsICA5ICk7CisgIFIoIGQsIGUsIGEsIGIsIGMsIEYzLCBLMywgIDMsIDE0ICk7CisgIFIoIGMsIGQsIGUsIGEsIGIsIEYzLCBLMywgIDcsICA1ICk7CisgIFIoIGIsIGMsIGQsIGUsIGEsIEYzLCBLMywgMTUsICA2ICk7CisgIFIoIGEsIGIsIGMsIGQsIGUsIEYzLCBLMywgMTQsICA4ICk7CisgIFIoIGUsIGEsIGIsIGMsIGQsIEYzLCBLMywgIDUsICA2ICk7CisgIFIoIGQsIGUsIGEsIGIsIGMsIEYzLCBLMywgIDYsICA1ICk7CisgIFIoIGMsIGQsIGUsIGEsIGIsIEYzLCBLMywgIDIsIDEyICk7CisgIFIoIGIsIGMsIGQsIGUsIGEsIEY0LCBLNCwgIDQsICA5ICk7CisgIFIoIGEsIGIsIGMsIGQsIGUsIEY0LCBLNCwgIDAsIDE1ICk7CisgIFIoIGUsIGEsIGIsIGMsIGQsIEY0LCBLNCwgIDUsICA1ICk7CisgIFIoIGQsIGUsIGEsIGIsIGMsIEY0LCBLNCwgIDksIDExICk7CisgIFIoIGMsIGQsIGUsIGEsIGIsIEY0LCBLNCwgIDcsICA2ICk7CisgIFIoIGIsIGMsIGQsIGUsIGEsIEY0LCBLNCwgMTIsICA4ICk7CisgIFIoIGEsIGIsIGMsIGQsIGUsIEY0LCBLNCwgIDIsIDEzICk7CisgIFIoIGUsIGEsIGIsIGMsIGQsIEY0LCBLNCwgMTAsIDEyICk7CisgIFIoIGQsIGUsIGEsIGIsIGMsIEY0LCBLNCwgMTQsICA1ICk7CisgIFIoIGMsIGQsIGUsIGEsIGIsIEY0LCBLNCwgIDEsIDEyICk7CisgIFIoIGIsIGMsIGQsIGUsIGEsIEY0LCBLNCwgIDMsIDEzICk7CisgIFIoIGEsIGIsIGMsIGQsIGUsIEY0LCBLNCwgIDgsIDE0ICk7CisgIFIoIGUsIGEsIGIsIGMsIGQsIEY0LCBLNCwgMTEsIDExICk7CisgIFIoIGQsIGUsIGEsIGIsIGMsIEY0LCBLNCwgIDYsICA4ICk7CisgIFIoIGMsIGQsIGUsIGEsIGIsIEY0LCBLNCwgMTUsICA1ICk7CisgIFIoIGIsIGMsIGQsIGUsIGEsIEY0LCBLNCwgMTMsICA2ICk7CisKKyAgYWEgPSBhOyBiYiA9IGI7IGNjID0gYzsgZGQgPSBkOyBlZSA9IGU7CisKKyAgLyogcmlnaHQgbGFuZSAqLworICBhID0gaGQtPmgwOworICBiID0gaGQtPmgxOworICBjID0gaGQtPmgyOworICBkID0gaGQtPmgzOworICBlID0gaGQtPmg0OworICBSKCBhLCBiLCBjLCBkLCBlLCBGNCwgS0swLAk1LCAgOCk7CisgIFIoIGUsIGEsIGIsIGMsIGQsIEY0LCBLSzAsIDE0LCAgOSk7CisgIFIoIGQsIGUsIGEsIGIsIGMsIEY0LCBLSzAsCTcsICA5KTsKKyAgUiggYywgZCwgZSwgYSwgYiwgRjQsIEtLMCwJMCwgMTEpOworICBSKCBiLCBjLCBkLCBlLCBhLCBGNCwgS0swLAk5LCAxMyk7CisgIFIoIGEsIGIsIGMsIGQsIGUsIEY0LCBLSzAsCTIsIDE1KTsKKyAgUiggZSwgYSwgYiwgYywgZCwgRjQsIEtLMCwgMTEsIDE1KTsKKyAgUiggZCwgZSwgYSwgYiwgYywgRjQsIEtLMCwJNCwgIDUpOworICBSKCBjLCBkLCBlLCBhLCBiLCBGNCwgS0swLCAxMywgIDcpOworICBSKCBiLCBjLCBkLCBlLCBhLCBGNCwgS0swLAk2LCAgNyk7CisgIFIoIGEsIGIsIGMsIGQsIGUsIEY0LCBLSzAsIDE1LCAgOCk7CisgIFIoIGUsIGEsIGIsIGMsIGQsIEY0LCBLSzAsCTgsIDExKTsKKyAgUiggZCwgZSwgYSwgYiwgYywgRjQsIEtLMCwJMSwgMTQpOworICBSKCBjLCBkLCBlLCBhLCBiLCBGNCwgS0swLCAxMCwgMTQpOworICBSKCBiLCBjLCBkLCBlLCBhLCBGNCwgS0swLAkzLCAxMik7CisgIFIoIGEsIGIsIGMsIGQsIGUsIEY0LCBLSzAsIDEyLCAgNik7CisgIFIoIGUsIGEsIGIsIGMsIGQsIEYzLCBLSzEsCTYsICA5KTsKKyAgUiggZCwgZSwgYSwgYiwgYywgRjMsIEtLMSwgMTEsIDEzKTsKKyAgUiggYywgZCwgZSwgYSwgYiwgRjMsIEtLMSwJMywgMTUpOworICBSKCBiLCBjLCBkLCBlLCBhLCBGMywgS0sxLAk3LCAgNyk7CisgIFIoIGEsIGIsIGMsIGQsIGUsIEYzLCBLSzEsCTAsIDEyKTsKKyAgUiggZSwgYSwgYiwgYywgZCwgRjMsIEtLMSwgMTMsICA4KTsKKyAgUiggZCwgZSwgYSwgYiwgYywgRjMsIEtLMSwJNSwgIDkpOworICBSKCBjLCBkLCBlLCBhLCBiLCBGMywgS0sxLCAxMCwgMTEpOworICBSKCBiLCBjLCBkLCBlLCBhLCBGMywgS0sxLCAxNCwgIDcpOworICBSKCBhLCBiLCBjLCBkLCBlLCBGMywgS0sxLCAxNSwgIDcpOworICBSKCBlLCBhLCBiLCBjLCBkLCBGMywgS0sxLAk4LCAxMik7CisgIFIoIGQsIGUsIGEsIGIsIGMsIEYzLCBLSzEsIDEyLCAgNyk7CisgIFIoIGMsIGQsIGUsIGEsIGIsIEYzLCBLSzEsCTQsICA2KTsKKyAgUiggYiwgYywgZCwgZSwgYSwgRjMsIEtLMSwJOSwgMTUpOworICBSKCBhLCBiLCBjLCBkLCBlLCBGMywgS0sxLAkxLCAxMyk7CisgIFIoIGUsIGEsIGIsIGMsIGQsIEYzLCBLSzEsCTIsIDExKTsKKyAgUiggZCwgZSwgYSwgYiwgYywgRjIsIEtLMiwgMTUsICA5KTsKKyAgUiggYywgZCwgZSwgYSwgYiwgRjIsIEtLMiwJNSwgIDcpOworICBSKCBiLCBjLCBkLCBlLCBhLCBGMiwgS0syLAkxLCAxNSk7CisgIFIoIGEsIGIsIGMsIGQsIGUsIEYyLCBLSzIsCTMsIDExKTsKKyAgUiggZSwgYSwgYiwgYywgZCwgRjIsIEtLMiwJNywgIDgpOworICBSKCBkLCBlLCBhLCBiLCBjLCBGMiwgS0syLCAxNCwgIDYpOworICBSKCBjLCBkLCBlLCBhLCBiLCBGMiwgS0syLAk2LCAgNik7CisgIFIoIGIsIGMsIGQsIGUsIGEsIEYyLCBLSzIsCTksIDE0KTsKKyAgUiggYSwgYiwgYywgZCwgZSwgRjIsIEtLMiwgMTEsIDEyKTsKKyAgUiggZSwgYSwgYiwgYywgZCwgRjIsIEtLMiwJOCwgMTMpOworICBSKCBkLCBlLCBhLCBiLCBjLCBGMiwgS0syLCAxMiwgIDUpOworICBSKCBjLCBkLCBlLCBhLCBiLCBGMiwgS0syLAkyLCAxNCk7CisgIFIoIGIsIGMsIGQsIGUsIGEsIEYyLCBLSzIsIDEwLCAxMyk7CisgIFIoIGEsIGIsIGMsIGQsIGUsIEYyLCBLSzIsCTAsIDEzKTsKKyAgUiggZSwgYSwgYiwgYywgZCwgRjIsIEtLMiwJNCwgIDcpOworICBSKCBkLCBlLCBhLCBiLCBjLCBGMiwgS0syLCAxMywgIDUpOworICBSKCBjLCBkLCBlLCBhLCBiLCBGMSwgS0szLAk4LCAxNSk7CisgIFIoIGIsIGMsIGQsIGUsIGEsIEYxLCBLSzMsCTYsICA1KTsKKyAgUiggYSwgYiwgYywgZCwgZSwgRjEsIEtLMywJNCwgIDgpOworICBSKCBlLCBhLCBiLCBjLCBkLCBGMSwgS0szLAkxLCAxMSk7CisgIFIoIGQsIGUsIGEsIGIsIGMsIEYxLCBLSzMsCTMsIDE0KTsKKyAgUiggYywgZCwgZSwgYSwgYiwgRjEsIEtLMywgMTEsIDE0KTsKKyAgUiggYiwgYywgZCwgZSwgYSwgRjEsIEtLMywgMTUsICA2KTsKKyAgUiggYSwgYiwgYywgZCwgZSwgRjEsIEtLMywJMCwgMTQpOworICBSKCBlLCBhLCBiLCBjLCBkLCBGMSwgS0szLAk1LCAgNik7CisgIFIoIGQsIGUsIGEsIGIsIGMsIEYxLCBLSzMsIDEyLCAgOSk7CisgIFIoIGMsIGQsIGUsIGEsIGIsIEYxLCBLSzMsCTIsIDEyKTsKKyAgUiggYiwgYywgZCwgZSwgYSwgRjEsIEtLMywgMTMsICA5KTsKKyAgUiggYSwgYiwgYywgZCwgZSwgRjEsIEtLMywJOSwgMTIpOworICBSKCBlLCBhLCBiLCBjLCBkLCBGMSwgS0szLAk3LCAgNSk7CisgIFIoIGQsIGUsIGEsIGIsIGMsIEYxLCBLSzMsIDEwLCAxNSk7CisgIFIoIGMsIGQsIGUsIGEsIGIsIEYxLCBLSzMsIDE0LCAgOCk7CisgIFIoIGIsIGMsIGQsIGUsIGEsIEYwLCBLSzQsIDEyLCAgOCk7CisgIFIoIGEsIGIsIGMsIGQsIGUsIEYwLCBLSzQsIDE1LCAgNSk7CisgIFIoIGUsIGEsIGIsIGMsIGQsIEYwLCBLSzQsIDEwLCAxMik7CisgIFIoIGQsIGUsIGEsIGIsIGMsIEYwLCBLSzQsCTQsICA5KTsKKyAgUiggYywgZCwgZSwgYSwgYiwgRjAsIEtLNCwJMSwgMTIpOworICBSKCBiLCBjLCBkLCBlLCBhLCBGMCwgS0s0LAk1LCAgNSk7CisgIFIoIGEsIGIsIGMsIGQsIGUsIEYwLCBLSzQsCTgsIDE0KTsKKyAgUiggZSwgYSwgYiwgYywgZCwgRjAsIEtLNCwJNywgIDYpOworICBSKCBkLCBlLCBhLCBiLCBjLCBGMCwgS0s0LAk2LCAgOCk7CisgIFIoIGMsIGQsIGUsIGEsIGIsIEYwLCBLSzQsCTIsIDEzKTsKKyAgUiggYiwgYywgZCwgZSwgYSwgRjAsIEtLNCwgMTMsICA2KTsKKyAgUiggYSwgYiwgYywgZCwgZSwgRjAsIEtLNCwgMTQsICA1KTsKKyAgUiggZSwgYSwgYiwgYywgZCwgRjAsIEtLNCwJMCwgMTUpOworICBSKCBkLCBlLCBhLCBiLCBjLCBGMCwgS0s0LAkzLCAxMyk7CisgIFIoIGMsIGQsIGUsIGEsIGIsIEYwLCBLSzQsCTksIDExKTsKKyAgUiggYiwgYywgZCwgZSwgYSwgRjAsIEtLNCwgMTEsIDExKTsKKworCisgIHQJICAgPSBoZC0+aDEgKyBkICsgY2M7CisgIGhkLT5oMSA9IGhkLT5oMiArIGUgKyBkZDsKKyAgaGQtPmgyID0gaGQtPmgzICsgYSArIGVlOworICBoZC0+aDMgPSBoZC0+aDQgKyBiICsgYWE7CisgIGhkLT5oNCA9IGhkLT5oMCArIGMgKyBiYjsKKyAgaGQtPmgwID0gdDsKK30KKworCisvKiBVcGRhdGUgdGhlIG1lc3NhZ2UgZGlnZXN0IHdpdGggdGhlIGNvbnRlbnRzCisgKiBvZiBJTkJVRiB3aXRoIGxlbmd0aCBJTkxFTi4KKyAqLworc3RhdGljIHZvaWQKK3JtZDE2MF93cml0ZSAoIHZvaWQgKmNvbnRleHQsIGNvbnN0IHZvaWQgKmluYnVmX2FyZywgc2l6ZV90IGlubGVuKQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICppbmJ1ZiA9IGluYnVmX2FyZzsKKyAgUk1EMTYwX0NPTlRFWFQgKmhkID0gY29udGV4dDsKKworICBpZiggaGQtPmNvdW50ID09IDY0ICkgIC8qIGZsdXNoIHRoZSBidWZmZXIgKi8KKyAgICB7CisgICAgICB0cmFuc2Zvcm0oIGhkLCBoZC0+YnVmICk7CisgICAgICBfZ2NyeV9idXJuX3N0YWNrICgxMDgrNSpzaXplb2Yodm9pZCopKTsKKyAgICAgIGhkLT5jb3VudCA9IDA7CisgICAgICBoZC0+bmJsb2NrcysrOworICAgIH0KKyAgaWYoICFpbmJ1ZiApCisgICAgcmV0dXJuOworICBpZiggaGQtPmNvdW50ICkgCisgICAgeworICAgICAgZm9yKCA7IGlubGVuICYmIGhkLT5jb3VudCA8IDY0OyBpbmxlbi0tICkKKyAgICAgICAgaGQtPmJ1ZltoZC0+Y291bnQrK10gPSAqaW5idWYrKzsKKyAgICAgIHJtZDE2MF93cml0ZSggaGQsIE5VTEwsIDAgKTsKKyAgICAgIGlmKCAhaW5sZW4gKQorICAgICAgICByZXR1cm47CisgICAgfQorCisgIHdoaWxlKCBpbmxlbiA+PSA2NCApCisgICAgeworICAgICAgdHJhbnNmb3JtKCBoZCwgaW5idWYgKTsKKyAgICAgIGhkLT5jb3VudCA9IDA7CisgICAgICBoZC0+bmJsb2NrcysrOworICAgICAgaW5sZW4gLT0gNjQ7CisgICAgICBpbmJ1ZiArPSA2NDsKKyAgICB9CisgIF9nY3J5X2J1cm5fc3RhY2sgKDEwOCs1KnNpemVvZih2b2lkKikpOworICBmb3IoIDsgaW5sZW4gJiYgaGQtPmNvdW50IDwgNjQ7IGlubGVuLS0gKQorICAgIGhkLT5idWZbaGQtPmNvdW50KytdID0gKmluYnVmKys7Cit9CisKKy8qKioqKioqKioqKioqKioqCisgKiBBcHBseSB0aGUgcm1kMTYwIHRyYW5zZm9ybSBmdW5jdGlvbiBvbiB0aGUgYnVmZmVyIHdoaWNoIG11c3QgaGF2ZQorICogYSBsZW5ndGggNjQgYnl0ZXMuIERvIG5vdCB1c2UgdGhpcyBmdW5jdGlvbiB0b2dldGhlciB3aXRoIHRoZQorICogb3RoZXIgZnVuY3Rpb25zLCB1c2Ugcm1kMTYwX2luaXQgdG8gaW5pdGlhbGl6ZSBpbnRlcm5hbCB2YXJpYWJsZXMuCisgKiBSZXR1cm5zOiAxNiBieXRlcyBpbiBidWZmZXIgd2l0aCB0aGUgbWl4ZWQgY29udGVudGVzIG9mIGJ1ZmZlci4KKyAqLwordm9pZAorX2djcnlfcm1kMTYwX21peGJsb2NrICggUk1EMTYwX0NPTlRFWFQgKmhkLCB2b2lkICpibG9ja29mNjRieXRlICkKK3sKKyAgY2hhciAqcCA9IGJsb2Nrb2Y2NGJ5dGU7CisKKyAgdHJhbnNmb3JtICggaGQsIGJsb2Nrb2Y2NGJ5dGUgKTsKKyNkZWZpbmUgWChhKSBkbyB7ICoodTMyKilwID0gaGQtPmgjI2EgOyBwICs9IDQ7IH0gd2hpbGUoMCkKKyAgWCgwKTsKKyAgWCgxKTsKKyAgWCgyKTsKKyAgWCgzKTsKKyAgWCg0KTsKKyN1bmRlZiBYCit9CisKKworLyogVGhlIHJvdXRpbmUgdGVybWluYXRlcyB0aGUgY29tcHV0YXRpb24KKyAqLworCitzdGF0aWMgdm9pZAorcm1kMTYwX2ZpbmFsKCB2b2lkICpjb250ZXh0ICkKK3sKKyAgUk1EMTYwX0NPTlRFWFQgKmhkID0gY29udGV4dDsKKyAgdTMyIHQsIG1zYiwgbHNiOworICBieXRlICpwOworICAKKyAgcm1kMTYwX3dyaXRlKGhkLCBOVUxMLCAwKTsgLyogZmx1c2ggKi87CisKKyAgdCA9IGhkLT5uYmxvY2tzOworICAvKiBtdWx0aXBseSBieSA2NCB0byBtYWtlIGEgYnl0ZSBjb3VudCAqLworICBsc2IgPSB0IDw8IDY7CisgIG1zYiA9IHQgPj4gMjY7CisgIC8qIGFkZCB0aGUgY291bnQgKi8KKyAgdCA9IGxzYjsKKyAgaWYoIChsc2IgKz0gaGQtPmNvdW50KSA8IHQgKQorICAgIG1zYisrOworICAvKiBtdWx0aXBseSBieSA4IHRvIG1ha2UgYSBiaXQgY291bnQgKi8KKyAgdCA9IGxzYjsKKyAgbHNiIDw8PSAzOworICBtc2IgPDw9IDM7CisgIG1zYiB8PSB0ID4+IDI5OworCisgIGlmKCBoZC0+Y291bnQgPCA1NiApICAvKiBlbm91Z2ggcm9vbSAqLworICAgIHsKKyAgICAgIGhkLT5idWZbaGQtPmNvdW50KytdID0gMHg4MDsgLyogcGFkICovCisgICAgICB3aGlsZSggaGQtPmNvdW50IDwgNTYgKQorICAgICAgICBoZC0+YnVmW2hkLT5jb3VudCsrXSA9IDA7ICAvKiBwYWQgKi8KKyAgICB9CisgIGVsc2UgIC8qIG5lZWQgb25lIGV4dHJhIGJsb2NrICovCisgICAgeworICAgICAgaGQtPmJ1ZltoZC0+Y291bnQrK10gPSAweDgwOyAvKiBwYWQgY2hhcmFjdGVyICovCisgICAgICB3aGlsZSggaGQtPmNvdW50IDwgNjQgKQorICAgICAgICBoZC0+YnVmW2hkLT5jb3VudCsrXSA9IDA7CisgICAgICBybWQxNjBfd3JpdGUoaGQsIE5VTEwsIDApOyAgLyogZmx1c2ggKi87CisgICAgICBtZW1zZXQoaGQtPmJ1ZiwgMCwgNTYgKTsgLyogZmlsbCBuZXh0IGJsb2NrIHdpdGggemVyb2VzICovCisgICAgfQorICAvKiBhcHBlbmQgdGhlIDY0IGJpdCBjb3VudCAqLworICBoZC0+YnVmWzU2XSA9IGxzYgkgICA7CisgIGhkLT5idWZbNTddID0gbHNiID4+ICA4OworICBoZC0+YnVmWzU4XSA9IGxzYiA+PiAxNjsKKyAgaGQtPmJ1Zls1OV0gPSBsc2IgPj4gMjQ7CisgIGhkLT5idWZbNjBdID0gbXNiCSAgIDsKKyAgaGQtPmJ1Zls2MV0gPSBtc2IgPj4gIDg7CisgIGhkLT5idWZbNjJdID0gbXNiID4+IDE2OworICBoZC0+YnVmWzYzXSA9IG1zYiA+PiAyNDsKKyAgdHJhbnNmb3JtKCBoZCwgaGQtPmJ1ZiApOworICBfZ2NyeV9idXJuX3N0YWNrICgxMDgrNSpzaXplb2Yodm9pZCopKTsKKworICBwID0gaGQtPmJ1ZjsKKyNpZmRlZiBXT1JEU19CSUdFTkRJQU4KKyNkZWZpbmUgWChhKSBkbyB7ICpwKysgPSBoZC0+aCMjYQkgICA7ICpwKysgPSBoZC0+aCMjYSA+PiA4OwlcCisJICAgICAgICAgICpwKysgPSBoZC0+aCMjYSA+PiAxNjsgKnArKyA9IGhkLT5oIyNhID4+IDI0OyB9IHdoaWxlKDApCisjZWxzZSAvKiBsaXR0bGUgZW5kaWFuICovCisjZGVmaW5lIFgoYSkgZG8geyAqKHUzMiopcCA9IGhkLT5oIyNhIDsgcCArPSA0OyB9IHdoaWxlKDApCisjZW5kaWYKKyAgWCgwKTsKKyAgWCgxKTsKKyAgWCgyKTsKKyAgWCgzKTsKKyAgWCg0KTsKKyN1bmRlZiBYCit9CisKK3N0YXRpYyBieXRlICoKK3JtZDE2MF9yZWFkKCB2b2lkICpjb250ZXh0ICkKK3sKKyAgUk1EMTYwX0NPTlRFWFQgKmhkID0gY29udGV4dDsKKworICByZXR1cm4gaGQtPmJ1ZjsKK30KKworCisKKy8qKioqKioqKioqKioqKioqCisgKiBTaG9ydGN1dCBmdW5jdGlvbnMgd2hpY2ggcHV0cyB0aGUgaGFzaCB2YWx1ZSBvZiB0aGUgc3VwcGxpZWQgYnVmZmVyCisgKiBpbnRvIG91dGJ1ZiB3aGljaCBtdXN0IGhhdmUgYSBzaXplIG9mIDIwIGJ5dGVzLgorICovCit2b2lkCitfZ2NyeV9ybWQxNjBfaGFzaF9idWZmZXIgKHZvaWQgKm91dGJ1ZiwgY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoICkKK3sKKyAgUk1EMTYwX0NPTlRFWFQgaGQ7CisKKyAgX2djcnlfcm1kMTYwX2luaXQgKCAmaGQgKTsKKyAgcm1kMTYwX3dyaXRlICggJmhkLCBidWZmZXIsIGxlbmd0aCApOworICBybWQxNjBfZmluYWwgKCAmaGQgKTsKKyAgbWVtY3B5ICggb3V0YnVmLCBoZC5idWYsIDIwICk7Cit9CisKK3N0YXRpYyBieXRlIGFzblsxNV0gPSAvKiBPYmplY3QgSUQgaXMgMS4zLjM2LjMuMi4xICovCisgIHsgMHgzMCwgMHgyMSwgMHgzMCwgMHgwOSwgMHgwNiwgMHgwNSwgMHgyYiwgMHgyNCwgMHgwMywKKyAgICAweDAyLCAweDAxLCAweDA1LCAweDAwLCAweDA0LCAweDE0IH07CisKK3N0YXRpYyBnY3J5X21kX29pZF9zcGVjX3Qgb2lkX3NwZWNfcm1kMTYwW10gPQorICB7CisgICAgLyogcnNhU2lnbmF0dXJlV2l0aHJpcGVtZDE2MCAqLworICAgIHsgIjEuMy4zNi4zLjMuMS4yIiB9LAorICAgIC8qIFRlbGVUcnVzdCBoYXNoIGFsZ29yaXRobS4gICovCisgICAgeyAiMS4zLjM2LjMuMi4xIiB9LAorICAgIHsgTlVMTCB9CisgIH07CisKK2djcnlfbWRfc3BlY190IF9nY3J5X2RpZ2VzdF9zcGVjX3JtZDE2MCA9CisgIHsKKyAgICAiUklQRU1EMTYwIiwgYXNuLCBESU0gKGFzbiksIG9pZF9zcGVjX3JtZDE2MCwgMjAsCisgICAgX2djcnlfcm1kMTYwX2luaXQsIHJtZDE2MF93cml0ZSwgcm1kMTYwX2ZpbmFsLCBybWQxNjBfcmVhZCwKKyAgICBzaXplb2YgKFJNRDE2MF9DT05URVhUKQorICB9OwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L2NpcGhlci9yc2EuYyBiL2xpYmdjcnlwdC0xLjQuNi9jaXBoZXIvcnNhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YyNzhjMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9jaXBoZXIvcnNhLmMKQEAgLTAsMCArMSwxMzc5IEBACisvKiByc2EuYyAtIFJTQSBpbXBsZW1lbnRhdGlvbgorICogQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5IGJ5IFdlcm5lciBLb2NoIChkZDlqbikKKyAqIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworLyogVGhpcyBjb2RlIHVzZXMgYW4gYWxnb3JpdGhtIHByb3RlY3RlZCBieSBVLlMuIFBhdGVudCAjNCw0MDUsODI5CisgICB3aGljaCBleHBpcmVkIG9uIFNlcHRlbWJlciAyMCwgMjAwMC4gIFRoZSBwYXRlbnQgaG9sZGVyIHBsYWNlZCB0aGF0CisgICBwYXRlbnQgaW50byB0aGUgcHVibGljIGRvbWFpbiBvbiBTZXAgNnRoLCAyMDAwLgorKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgImcxMGxpYi5oIgorI2luY2x1ZGUgIm1waS5oIgorI2luY2x1ZGUgImNpcGhlci5oIgorCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGdjcnlfbXBpX3QgbjsJICAgIC8qIG1vZHVsdXMgKi8KKyAgZ2NyeV9tcGlfdCBlOwkgICAgLyogZXhwb25lbnQgKi8KK30gUlNBX3B1YmxpY19rZXk7CisKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgZ2NyeV9tcGlfdCBuOwkgICAgLyogcHVibGljIG1vZHVsdXMgKi8KKyAgZ2NyeV9tcGlfdCBlOwkgICAgLyogcHVibGljIGV4cG9uZW50ICovCisgIGdjcnlfbXBpX3QgZDsJICAgIC8qIGV4cG9uZW50ICovCisgIGdjcnlfbXBpX3QgcDsJICAgIC8qIHByaW1lICBwLiAqLworICBnY3J5X21waV90IHE7CSAgICAvKiBwcmltZSAgcS4gKi8KKyAgZ2NyeV9tcGlfdCB1OwkgICAgLyogaW52ZXJzZSBvZiBwIG1vZCBxLiAqLworfSBSU0Ffc2VjcmV0X2tleTsKKworCisvKiBBIHNhbXBsZSAxMDI0IGJpdCBSU0Ega2V5IHVzZWQgZm9yIHRoZSBzZWxmdGVzdHMuICAqLworc3RhdGljIGNvbnN0IGNoYXIgc2FtcGxlX3NlY3JldF9rZXlbXSA9CisiKHByaXZhdGUta2V5IgorIiAocnNhIgorIiAgKG4gIzAwZTBjZTk2ZjkwYjZjOWUwMmYzOTIyYmVhZGE5M2ZlNTBhODc1ZWFjNmJjYzE4YmI5YTljZjJlODQ5NjVjYWEiCisiICAgICAgMmQxZmY5NWE3ZjU0MjQ2NWM2YzBjMTlkMjc2ZTQ1MjZjZTA0ODg2OGE3YTkxNGZkMzQzY2MzYTg3ZGQ3NDI5MSIKKyIgICAgICBmZmM1NjU1MDZkNWJiYjI1Y2JhYzZhMGUyZGQxZjhiY2FhYjBkNGEyOWMyZjM3Yzk1MGYzNjM0ODRiZjI2OWY3IgorIiAgICAgIDg5MTQ0MDQ2NGJhZjc5ODI3ZTAzYTM2ZTcwYjgxNDkzOGVlYmRjNjNlOTY0MjQ3YmU3NWRjNThiMDE0YjdlYTI1MSMpIgorIiAgKGUgIzAxMDAwMSMpIgorIiAgKGQgIzA0NjEyOWYyNDg5ZDcxNTc5YmUwYTc1ZmUwMjliZDZjZGI1NzRlYmY1N2VhOGE1YjBmZGE5NDJjYWI5NDNiMTEiCisiICAgICAgN2Q3YmI5NWU1ZDI4ODc1ZTBmOWZjNWZjYzA2YTcyZjZkNTAyNDY0ZGFiZGVkNzhlZjZiNzE2MTc3YjgzZDViZCIKKyIgICAgICBjNTQzZGM1ZDNmZWQ5MzJlNTlmNTg5N2U5MmU2ZjU4YTBmMzM0MjQxMDZhM2I2ZmEyY2JmODc3NTEwZTRhYzIxIgorIiAgICAgIGMzZWU0Nzg1MWU5N2QxMjk5NjIyMmFjMzU2NmQ0Y2NiMGI4M2QxNjQwNzRhYmY3ZGU2NTVmYzI0NDZkYTE3ODEjKSIKKyIgIChwICMwMGU4NjFiNzAwZTE3ZThhZmU2ODM3ZTc1MTJlMzViNmNhMTFkMGFlNDdkOGI4NTE2MWM2N2JhZjY0Mzc3MjEzIgorIiAgICAgIGZlNTJkNzcyZjIwMzViM2NhODMwYWY0MWQ4YTQxMjBlMWMxYzcwZDEyY2MyMmYwMGQyOGQzMWRkNDhhOGQ0MjRmMSMpIgorIiAgKHEgIzAwZjdhN2NhNTM2N2M2NjFmOGU2MmRmMzRmMGQwNWMxMGM4OGU1NDkyMzQ4ZGQ3YmRkYzk0MmM5YThmMzY5ZjkiCisiICAgICAgMzVhMDc3ODVkMmRiODA1MjE1ZWQ3ODZlNDI4NWRmMTY1OGVlZDNjZTg0ZjQ2OWI4MWI1MGQzNTg0MDdiNGFkMzYxIykiCisiICAodSAjMzA0NTU5YTllYWQ1NmQyMzA5ZDIwMzgxMWE2NDFiYjFhMDk2MjZiYzhlYjM2ZmZmYTIzYzk2OGVjNWJkODkxZSIKKyIgICAgICBlYmJhZmM3M2FlNjY2ZTAxYmE3Yzg5OTBiYWUwNmNjMmJiZTEwYjc1ZTY5ZmNhY2IzNTNhNjQ3MzA3OWQ4ZTliIykpKSI7CisvKiBBIHNhbXBsZSAxMDI0IGJpdCBSU0Ega2V5IHVzZWQgZm9yIHRoZSBzZWxmdGVzdHMgKHB1YmxpYyBvbmx5KS4gICovCitzdGF0aWMgY29uc3QgY2hhciBzYW1wbGVfcHVibGljX2tleVtdID0gCisiKHB1YmxpYy1rZXkiCisiIChyc2EiCisiICAobiAjMDBlMGNlOTZmOTBiNmM5ZTAyZjM5MjJiZWFkYTkzZmU1MGE4NzVlYWM2YmNjMThiYjlhOWNmMmU4NDk2NWNhYSIKKyIgICAgICAyZDFmZjk1YTdmNTQyNDY1YzZjMGMxOWQyNzZlNDUyNmNlMDQ4ODY4YTdhOTE0ZmQzNDNjYzNhODdkZDc0MjkxIgorIiAgICAgIGZmYzU2NTUwNmQ1YmJiMjVjYmFjNmEwZTJkZDFmOGJjYWFiMGQ0YTI5YzJmMzdjOTUwZjM2MzQ4NGJmMjY5ZjciCisiICAgICAgODkxNDQwNDY0YmFmNzk4MjdlMDNhMzZlNzBiODE0OTM4ZWViZGM2M2U5NjQyNDdiZTc1ZGM1OGIwMTRiN2VhMjUxIykiCisiICAoZSAjMDEwMDAxIykpKSI7CisKKworCisMCitzdGF0aWMgaW50IHRlc3Rfa2V5cyAoUlNBX3NlY3JldF9rZXkgKnNrLCB1bnNpZ25lZCBuYml0cyk7CitzdGF0aWMgaW50ICBjaGVja19zZWNyZXRfa2V5IChSU0Ffc2VjcmV0X2tleSAqc2spOworc3RhdGljIHZvaWQgcHVibGljIChnY3J5X21waV90IG91dHB1dCwgZ2NyeV9tcGlfdCBpbnB1dCwgUlNBX3B1YmxpY19rZXkgKnNrZXkpOworc3RhdGljIHZvaWQgc2VjcmV0IChnY3J5X21waV90IG91dHB1dCwgZ2NyeV9tcGlfdCBpbnB1dCwgUlNBX3NlY3JldF9rZXkgKnNrZXkpOworCisKKy8qIENoZWNrIHRoYXQgYSBmcmVzaGx5IGdlbmVyYXRlZCBrZXkgYWN0dWFsbHkgd29ya3MuICBSZXR1cm5zIDAgb24gc3VjY2Vzcy4gKi8KK3N0YXRpYyBpbnQKK3Rlc3Rfa2V5cyAoUlNBX3NlY3JldF9rZXkgKnNrLCB1bnNpZ25lZCBpbnQgbmJpdHMpCit7CisgIGludCByZXN1bHQgPSAtMTsgLyogRGVmYXVsdCB0byBmYWlsdXJlLiAgKi8KKyAgUlNBX3B1YmxpY19rZXkgcGs7CisgIGdjcnlfbXBpX3QgcGxhaW50ZXh0ID0gZ2NyeV9tcGlfbmV3IChuYml0cyk7CisgIGdjcnlfbXBpX3QgY2lwaGVydGV4dCA9IGdjcnlfbXBpX25ldyAobmJpdHMpOworICBnY3J5X21waV90IGRlY3JfcGxhaW50ZXh0ID0gZ2NyeV9tcGlfbmV3IChuYml0cyk7CisgIGdjcnlfbXBpX3Qgc2lnbmF0dXJlID0gZ2NyeV9tcGlfbmV3IChuYml0cyk7CisKKyAgLyogUHV0IHRoZSByZWxldmFudCBwYXJhbWV0ZXJzIGludG8gYSBwdWJsaWMga2V5IHN0cnVjdHVyZS4gICovCisgIHBrLm4gPSBzay0+bjsKKyAgcGsuZSA9IHNrLT5lOworCisgIC8qIENyZWF0ZSBhIHJhbmRvbSBwbGFpbnRleHQuICAqLworICBnY3J5X21waV9yYW5kb21pemUgKHBsYWludGV4dCwgbmJpdHMsIEdDUllfV0VBS19SQU5ET00pOworCisgIC8qIEVuY3J5cHQgdXNpbmcgdGhlIHB1YmxpYyBrZXkuICAqLworICBwdWJsaWMgKGNpcGhlcnRleHQsIHBsYWludGV4dCwgJnBrKTsKKworICAvKiBDaGVjayB0aGF0IHRoZSBjaXBoZXIgdGV4dCBkb2VzIG5vdCBtYXRjaCB0aGUgcGxhaW50ZXh0LiAgKi8KKyAgaWYgKCFnY3J5X21waV9jbXAgKGNpcGhlcnRleHQsIHBsYWludGV4dCkpCisgICAgZ290byBsZWF2ZTsgLyogQ2lwaGVydGV4dCBpcyBpZGVudGljYWwgdG8gdGhlIHBsYWludGV4dC4gICovCisKKyAgLyogRGVjcnlwdCB1c2luZyB0aGUgc2VjcmV0IGtleS4gICovCisgIHNlY3JldCAoZGVjcl9wbGFpbnRleHQsIGNpcGhlcnRleHQsIHNrKTsKKworICAvKiBDaGVjayB0aGF0IHRoZSBkZWNyeXB0ZWQgcGxhaW50ZXh0IG1hdGNoZXMgdGhlIG9yaWdpbmFsIHBsYWludGV4dC4gICovCisgIGlmIChnY3J5X21waV9jbXAgKGRlY3JfcGxhaW50ZXh0LCBwbGFpbnRleHQpKQorICAgIGdvdG8gbGVhdmU7IC8qIFBsYWludGV4dCBkb2VzIG5vdCBtYXRjaC4gICovCisKKyAgLyogQ3JlYXRlIGFub3RoZXIgcmFuZG9tIHBsYWludGV4dCBhcyBkYXRhIGZvciBzaWduYXR1cmUgY2hlY2tpbmcuICAqLworICBnY3J5X21waV9yYW5kb21pemUgKHBsYWludGV4dCwgbmJpdHMsIEdDUllfV0VBS19SQU5ET00pOworCisgIC8qIFVzZSB0aGUgUlNBIHNlY3JldCBmdW5jdGlvbiB0byBjcmVhdGUgYSBzaWduYXR1cmUgb2YgdGhlIHBsYWludGV4dC4gICovCisgIHNlY3JldCAoc2lnbmF0dXJlLCBwbGFpbnRleHQsIHNrKTsKKyAgCisgIC8qIFVzZSB0aGUgUlNBIHB1YmxpYyBmdW5jdGlvbiB0byB2ZXJpZnkgdGhpcyBzaWduYXR1cmUuICAqLworICBwdWJsaWMgKGRlY3JfcGxhaW50ZXh0LCBzaWduYXR1cmUsICZwayk7CisgIGlmIChnY3J5X21waV9jbXAgKGRlY3JfcGxhaW50ZXh0LCBwbGFpbnRleHQpKQorICAgIGdvdG8gbGVhdmU7IC8qIFNpZ25hdHVyZSBkb2VzIG5vdCBtYXRjaC4gICovCisKKyAgLyogTW9kaWZ5IHRoZSBzaWduYXR1cmUgYW5kIGNoZWNrIHRoYXQgdGhlIHNpZ25pbmcgZmFpbHMuICAqLworICBnY3J5X21waV9hZGRfdWkgKHNpZ25hdHVyZSwgc2lnbmF0dXJlLCAxKTsKKyAgcHVibGljIChkZWNyX3BsYWludGV4dCwgc2lnbmF0dXJlLCAmcGspOworICBpZiAoIWdjcnlfbXBpX2NtcCAoZGVjcl9wbGFpbnRleHQsIHBsYWludGV4dCkpCisgICAgZ290byBsZWF2ZTsgLyogU2lnbmF0dXJlIG1hdGNoZXMgYnV0IHNob3VsZCBub3QuICAqLworCisgIHJlc3VsdCA9IDA7IC8qIEFsbCB0ZXN0cyBzdWNjZWVkZWQuICAqLworCisgbGVhdmU6CisgIGdjcnlfbXBpX3JlbGVhc2UgKHNpZ25hdHVyZSk7CisgIGdjcnlfbXBpX3JlbGVhc2UgKGRlY3JfcGxhaW50ZXh0KTsKKyAgZ2NyeV9tcGlfcmVsZWFzZSAoY2lwaGVydGV4dCk7CisgIGdjcnlfbXBpX3JlbGVhc2UgKHBsYWludGV4dCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKworLyogQ2FsbGJhY2sgdXNlZCBieSB0aGUgcHJpbWUgZ2VuZXJhdGlvbiB0byB0ZXN0IHdoZXRoZXIgdGhlIGV4cG9uZW50CisgICBpcyBzdWl0YWJsZS4gUmV0dXJucyAwIGlmIHRoZSB0ZXN0IGhhcyBiZWVuIHBhc3NlZC4gKi8KK3N0YXRpYyBpbnQKK2NoZWNrX2V4cG9uZW50ICh2b2lkICphcmcsIGdjcnlfbXBpX3QgYSkKK3sKKyAgZ2NyeV9tcGlfdCBlID0gYXJnOworICBnY3J5X21waV90IHRtcDsKKyAgaW50IHJlc3VsdDsKKyAgCisgIG1waV9zdWJfdWkgKGEsIGEsIDEpOworICB0bXAgPSBfZ2NyeV9tcGlfYWxsb2NfbGlrZSAoYSk7CisgIHJlc3VsdCA9ICFnY3J5X21waV9nY2QodG1wLCBlLCBhKTsgLyogR0NEIGlzIG5vdCAxLiAqLworICBnY3J5X21waV9yZWxlYXNlICh0bXApOworICBtcGlfYWRkX3VpIChhLCBhLCAxKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqKioqKioqKioqKioqKioKKyAqIEdlbmVyYXRlIGEga2V5IHBhaXIgd2l0aCBhIGtleSBvZiBzaXplIE5CSVRTLiAgCisgKiBVU0VfRSA9IDAgbGV0IExpYmNncnlwdCBkZWNpZGUgd2hhdCBleHBvbmVudCB0byB1c2UuCisgKiAgICAgICA9IDEgcmVxdWVzdCB0aGUgdXNlIG9mIGEgInNlY3VyZSIgZXhwb25lbnQ7IHRoaXMgaXMgcmVxdWlyZWQgYnkgc29tZSAKKyAqICAgICAgICAgICBzcGVjaWZpY2F0aW9uIHRvIGJlIDY1NTM3LgorICogICAgICAgPiAyIFVzZSB0aGlzIHB1YmxpYyBleHBvbmVudC4gIElmIHRoZSBnaXZlbiBleHBvbmVudAorICogICAgICAgICAgIGlzIG5vdCBvZGQgb25lIGlzIGludGVybmFsbHkgYWRkZWQgdG8gaXQuIAorICogVFJBTlNJRU5UX0tFWTogIElmIHRydWUsIGdlbmVyYXRlIHRoZSBwcmltZXMgdXNpbmcgdGhlIHN0YW5kYXJkIFJORy4KKyAqIFJldHVybnM6IDIgc3RydWN0dXJlcyBmaWxsZWQgd2l0aCBhbGwgbmVlZGVkIHZhbHVlcworICovCitzdGF0aWMgZ3BnX2Vycl9jb2RlX3QKK2dlbmVyYXRlX3N0ZCAoUlNBX3NlY3JldF9rZXkgKnNrLCB1bnNpZ25lZCBpbnQgbmJpdHMsIHVuc2lnbmVkIGxvbmcgdXNlX2UsCisgICAgICAgICAgICAgIGludCB0cmFuc2llbnRfa2V5KQoreworICBnY3J5X21waV90IHAsIHE7IC8qIHRoZSB0d28gcHJpbWVzICovCisgIGdjcnlfbXBpX3QgZDsgICAgLyogdGhlIHByaXZhdGUga2V5ICovCisgIGdjcnlfbXBpX3QgdTsKKyAgZ2NyeV9tcGlfdCB0MSwgdDI7CisgIGdjcnlfbXBpX3QgbjsgICAgLyogdGhlIHB1YmxpYyBrZXkgKi8KKyAgZ2NyeV9tcGlfdCBlOyAgICAvKiB0aGUgZXhwb25lbnQgKi8KKyAgZ2NyeV9tcGlfdCBwaGk7ICAvKiBoZWxwZXI6IChwLTEpKHEtMSkgKi8KKyAgZ2NyeV9tcGlfdCBnOworICBnY3J5X21waV90IGY7CisgIGdjcnlfcmFuZG9tX2xldmVsX3QgcmFuZG9tX2xldmVsOworCisgIGlmIChmaXBzX21vZGUgKCkpCisgICAgeworICAgICAgaWYgKG5iaXRzIDwgMTAyNCkKKyAgICAgICAgcmV0dXJuIEdQR19FUlJfSU5WX1ZBTFVFOworICAgICAgaWYgKHRyYW5zaWVudF9rZXkpCisgICAgICAgIHJldHVybiBHUEdfRVJSX0lOVl9WQUxVRTsKKyAgICB9CisKKyAgLyogVGhlIHJhbmRvbSBxdWFsaXR5IGRlcGVuZHMgb24gdGhlIHRyYW5zaWVudF9rZXkgZmxhZy4gICovCisgIHJhbmRvbV9sZXZlbCA9IHRyYW5zaWVudF9rZXkgPyBHQ1JZX1NUUk9OR19SQU5ET00gOiBHQ1JZX1ZFUllfU1RST05HX1JBTkRPTTsKKworICAvKiBNYWtlIHN1cmUgdGhhdCBuYml0cyBpcyBldmVuIHNvIHRoYXQgd2UgZ2VuZXJhdGUgcCwgcSBvZiBlcXVhbCBzaXplLiAqLworICBpZiAoIChuYml0cyYxKSApCisgICAgbmJpdHMrKzsgCisKKyAgaWYgKHVzZV9lID09IDEpICAgLyogQWxpYXMgZm9yIGEgc2VjdXJlIHZhbHVlICovCisgICAgdXNlX2UgPSA2NTUzNzsgIC8qIGFzIGRlbWFuZGVkIGJ5IFNwaGlueC4gKi8KKworICAvKiBQdWJsaWMgZXhwb25lbnQ6CisgICAgIEluIGdlbmVyYWwgd2UgdXNlIDQxIGFzIHRoaXMgaXMgcXVpdGUgZmFzdCBhbmQgbW9yZSBzZWN1cmUgdGhhbiB0aGUKKyAgICAgY29tbW9ubHkgdXNlZCAxNy4gIEJlbmNobWFya2luZyB0aGUgUlNBIHZlcmlmeSBmdW5jdGlvbgorICAgICB3aXRoIGEgMTAyNCBiaXQga2V5IHlpZWxkcyAoMjAwMS0xMS0wOCk6IAorICAgICBlPTE3ICAgIDAuNTQgbXMKKyAgICAgZT00MSAgICAwLjc1IG1zCisgICAgIGU9MjU3ICAgMC45NSBtcworICAgICBlPTY1NTM3IDEuODAgbXMKKyAgKi8KKyAgZSA9IG1waV9hbGxvYyggKDMyK0JJVFNfUEVSX01QSV9MSU1CLTEpL0JJVFNfUEVSX01QSV9MSU1CICk7CisgIGlmICghdXNlX2UpCisgICAgbXBpX3NldF91aSAoZSwgNDEpOyAgICAgLyogVGhpcyBpcyBhIHJlYXNvbmFibGUgc2VjdXJlIGFuZCBmYXN0IHZhbHVlICovCisgIGVsc2UgCisgICAgeworICAgICAgdXNlX2UgfD0gMTsgLyogbWFrZSBzdXJlIHRoaXMgaXMgb2RkICovCisgICAgICBtcGlfc2V0X3VpIChlLCB1c2VfZSk7IAorICAgIH0KKyAgICAKKyAgbiA9IGdjcnlfbXBpX25ldyAobmJpdHMpOworCisgIHAgPSBxID0gTlVMTDsKKyAgZG8KKyAgICB7CisgICAgICAvKiBzZWxlY3QgdHdvICh2ZXJ5IHNlY3JldCkgcHJpbWVzICovCisgICAgICBpZiAocCkKKyAgICAgICAgZ2NyeV9tcGlfcmVsZWFzZSAocCk7CisgICAgICBpZiAocSkKKyAgICAgICAgZ2NyeV9tcGlfcmVsZWFzZSAocSk7CisgICAgICBpZiAodXNlX2UpCisgICAgICAgIHsgLyogRG8gYW4gZXh0cmEgdGVzdCB0byBlbnN1cmUgdGhhdCB0aGUgZ2l2ZW4gZXhwb25lbnQgaXMKKyAgICAgICAgICAgICBzdWl0YWJsZS4gKi8KKyAgICAgICAgICBwID0gX2djcnlfZ2VuZXJhdGVfc2VjcmV0X3ByaW1lIChuYml0cy8yLCByYW5kb21fbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfZXhwb25lbnQsIGUpOworICAgICAgICAgIHEgPSBfZ2NyeV9nZW5lcmF0ZV9zZWNyZXRfcHJpbWUgKG5iaXRzLzIsIHJhbmRvbV9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19leHBvbmVudCwgZSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeyAvKiBXZSBjaGVjayB0aGUgZXhwb25lbnQgbGF0ZXIuICovCisgICAgICAgICAgcCA9IF9nY3J5X2dlbmVyYXRlX3NlY3JldF9wcmltZSAobmJpdHMvMiwgcmFuZG9tX2xldmVsLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICBxID0gX2djcnlfZ2VuZXJhdGVfc2VjcmV0X3ByaW1lIChuYml0cy8yLCByYW5kb21fbGV2ZWwsIE5VTEwsIE5VTEwpOworICAgICAgICB9CisgICAgICBpZiAobXBpX2NtcCAocCwgcSkgPiAwICkgLyogcCBzaGFsbCBiZSBzbWFsbGVyIHRoYW4gcSAoZm9yIGNhbGMgb2YgdSkqLworICAgICAgICBtcGlfc3dhcChwLHEpOworICAgICAgLyogY2FsY3VsYXRlIHRoZSBtb2R1bHVzICovCisgICAgICBtcGlfbXVsKCBuLCBwLCBxICk7CisgICAgfQorICB3aGlsZSAoIG1waV9nZXRfbmJpdHMobikgIT0gbmJpdHMgKTsKKworICAvKiBjYWxjdWxhdGUgRXVsZXIgdG90aWVudDogcGhpID0gKHAtMSkocS0xKSAqLworICB0MSA9IG1waV9hbGxvY19zZWN1cmUoIG1waV9nZXRfbmxpbWJzKHApICk7CisgIHQyID0gbXBpX2FsbG9jX3NlY3VyZSggbXBpX2dldF9ubGltYnMocCkgKTsKKyAgcGhpID0gZ2NyeV9tcGlfc25ldyAoIG5iaXRzICk7CisgIGcJPSBnY3J5X21waV9zbmV3ICggbmJpdHMgKTsKKyAgZgk9IGdjcnlfbXBpX3NuZXcgKCBuYml0cyApOworICBtcGlfc3ViX3VpKCB0MSwgcCwgMSApOworICBtcGlfc3ViX3VpKCB0MiwgcSwgMSApOworICBtcGlfbXVsKCBwaGksIHQxLCB0MiApOworICBnY3J5X21waV9nY2QoZywgdDEsIHQyKTsKKyAgbXBpX2ZkaXZfcShmLCBwaGksIGcpOworCisgIHdoaWxlICghZ2NyeV9tcGlfZ2NkKHQxLCBlLCBwaGkpKSAvKiAod2hpbGUgZ2NkIGlzIG5vdCAxKSAqLworICAgIHsKKyAgICAgIGlmICh1c2VfZSkKKyAgICAgICAgQlVHICgpOyAvKiBUaGUgcHJpbWUgZ2VuZXJhdG9yIGFscmVhZHkgbWFkZSBzdXJlIHRoYXQgd2UKKyAgICAgICAgICAgICAgICAgICBuZXZlciBjYW4gZ2V0IHRvIGhlcmUuICovCisgICAgICBtcGlfYWRkX3VpIChlLCBlLCAyKTsKKyAgICB9CisKKyAgLyogY2FsY3VsYXRlIHRoZSBzZWNyZXQga2V5IGQgPSBlXjEgbW9kIHBoaSAqLworICBkID0gZ2NyeV9tcGlfc25ldyAoIG5iaXRzICk7CisgIG1waV9pbnZtKGQsIGUsIGYgKTsKKyAgLyogY2FsY3VsYXRlIHRoZSBpbnZlcnNlIG9mIHAgYW5kIHEgKHVzZWQgZm9yIGNoaW5lc2UgcmVtYWluZGVyIHRoZW9yZW0pKi8KKyAgdSA9IGdjcnlfbXBpX3NuZXcgKCBuYml0cyApOworICBtcGlfaW52bSh1LCBwLCBxICk7CisKKyAgaWYoIERCR19DSVBIRVIgKQorICAgIHsKKyAgICAgIGxvZ19tcGlkdW1wKCIgIHA9ICIsIHAgKTsKKyAgICAgIGxvZ19tcGlkdW1wKCIgIHE9ICIsIHEgKTsKKyAgICAgIGxvZ19tcGlkdW1wKCJwaGk9ICIsIHBoaSApOworICAgICAgbG9nX21waWR1bXAoIiAgZz0gIiwgZyApOworICAgICAgbG9nX21waWR1bXAoIiAgZj0gIiwgZiApOworICAgICAgbG9nX21waWR1bXAoIiAgbj0gIiwgbiApOworICAgICAgbG9nX21waWR1bXAoIiAgZT0gIiwgZSApOworICAgICAgbG9nX21waWR1bXAoIiAgZD0gIiwgZCApOworICAgICAgbG9nX21waWR1bXAoIiAgdT0gIiwgdSApOworICAgIH0KKworICBnY3J5X21waV9yZWxlYXNlICh0MSk7CisgIGdjcnlfbXBpX3JlbGVhc2UgKHQyKTsKKyAgZ2NyeV9tcGlfcmVsZWFzZSAocGhpKTsKKyAgZ2NyeV9tcGlfcmVsZWFzZSAoZik7CisgIGdjcnlfbXBpX3JlbGVhc2UgKGcpOworCisgIHNrLT5uID0gbjsKKyAgc2stPmUgPSBlOworICBzay0+cCA9IHA7CisgIHNrLT5xID0gcTsKKyAgc2stPmQgPSBkOworICBzay0+dSA9IHU7CisKKyAgLyogTm93IHdlIGNhbiB0ZXN0IG91ciBrZXlzLiAqLworICBpZiAodGVzdF9rZXlzIChzaywgbmJpdHMgLSA2NCkpCisgICAgeworICAgICAgZ2NyeV9tcGlfcmVsZWFzZSAoc2stPm4pOyBzay0+biA9IE5VTEw7CisgICAgICBnY3J5X21waV9yZWxlYXNlIChzay0+ZSk7IHNrLT5lID0gTlVMTDsKKyAgICAgIGdjcnlfbXBpX3JlbGVhc2UgKHNrLT5wKTsgc2stPnAgPSBOVUxMOworICAgICAgZ2NyeV9tcGlfcmVsZWFzZSAoc2stPnEpOyBzay0+cSA9IE5VTEw7CisgICAgICBnY3J5X21waV9yZWxlYXNlIChzay0+ZCk7IHNrLT5kID0gTlVMTDsKKyAgICAgIGdjcnlfbXBpX3JlbGVhc2UgKHNrLT51KTsgc2stPnUgPSBOVUxMOworICAgICAgZmlwc19zaWduYWxfZXJyb3IgKCJzZWxmLXRlc3QgYWZ0ZXIga2V5IGdlbmVyYXRpb24gZmFpbGVkIik7CisgICAgICByZXR1cm4gR1BHX0VSUl9TRUxGVEVTVF9GQUlMRUQ7CisgICAgfQorCisgIHJldHVybiAwOworfQorCisKKy8qIEhlbHBlciBmb3IgZ2VuZXJhdGVfeDkzMS4gICovCitzdGF0aWMgZ2NyeV9tcGlfdCAKK2dlbl94OTMxX3Bhcm1feHAgKHVuc2lnbmVkIGludCBuYml0cykKK3sKKyAgZ2NyeV9tcGlfdCB4cDsKKworICB4cCA9IGdjcnlfbXBpX3NuZXcgKG5iaXRzKTsKKyAgZ2NyeV9tcGlfcmFuZG9taXplICh4cCwgbmJpdHMsIEdDUllfVkVSWV9TVFJPTkdfUkFORE9NKTsKKyAgICAgIAorICAvKiBUaGUgcmVxdWlyZW1lbnQgZm9yIFhwIGlzOgorCisgICAgICAgc3FydHsyfSoyXntuYml0cy0xfSA8PSB4cCA8PSAyXntuYml0c30gLSAxCisKKyAgICAgV2Ugc2V0IHRoZSB0d28gaGlnaCBvcmRlciBiaXRzIHRvIDEgdG8gc2F0aXNmeSB0aGUgbG93ZXIgYm91bmQuCisgICAgIEJ5IHVzaW5nIG1waV9zZXRfaGlnaGJpdCB3ZSBtYWtlIHN1cmUgdGhhdCB0aGUgdXBwZXIgYm91bmQgaXMKKyAgICAgc2F0aXNmaWVkIGFzIHdlbGwuICAqLworICBtcGlfc2V0X2hpZ2hiaXQgKHhwLCBuYml0cy0xKTsKKyAgbXBpX3NldF9iaXQgKHhwLCBuYml0cy0yKTsKKyAgZ2NyeV9hc3NlcnQgKCBtcGlfZ2V0X25iaXRzICh4cCkgPT0gbmJpdHMgKTsKKyAgCisgIHJldHVybiB4cDsKK30gICAgIAorCisKKy8qIEhlbHBlciBmb3IgZ2VuZXJhdGVfeDkzMS4gICovCitzdGF0aWMgZ2NyeV9tcGlfdCAKK2dlbl94OTMxX3Bhcm1feGkgKHZvaWQpCit7CisgIGdjcnlfbXBpX3QgeGk7CisKKyAgeGkgPSBnY3J5X21waV9zbmV3ICgxMDEpOworICBnY3J5X21waV9yYW5kb21pemUgKHhpLCAxMDEsIEdDUllfVkVSWV9TVFJPTkdfUkFORE9NKTsKKyAgbXBpX3NldF9oaWdoYml0ICh4aSwgMTAwKTsKKyAgZ2NyeV9hc3NlcnQgKCBtcGlfZ2V0X25iaXRzICh4aSkgPT0gMTAxICk7CisgIAorICByZXR1cm4geGk7Cit9ICAgICAKKworCisKKy8qIFZhcmlhbnQgb2YgdGhlIHN0YW5kYXJkIGtleSBnZW5lcmF0aW9uIGNvZGUgdXNpbmcgdGhlIGFsZ29yaXRobQorICAgZnJvbSBYOS4zMS4gIFVzaW5nIHRoaXMgYWxnb3JpdGhtIGhhcyB0aGUgYWR2YW50YWdlIHRoYXQgdGhlCisgICBnZW5lcmF0aW9uIGNhbiBiZSBtYWRlIGRldGVybWluaXN0aWMgd2hpY2ggaXMgcmVxdWlyZWQgZm9yIENBVlMKKyAgIHRlc3RpbmcuICAqLworc3RhdGljIGdwZ19lcnJfY29kZV90CitnZW5lcmF0ZV94OTMxIChSU0Ffc2VjcmV0X2tleSAqc2ssIHVuc2lnbmVkIGludCBuYml0cywgdW5zaWduZWQgbG9uZyBlX3ZhbHVlLAorICAgICAgICAgICAgICAgZ2NyeV9zZXhwX3QgZGVyaXZlcGFybXMsIGludCAqc3dhcHBlZCkKK3sKKyAgZ2NyeV9tcGlfdCBwLCBxOyAvKiBUaGUgdHdvIHByaW1lcy4gICovCisgIGdjcnlfbXBpX3QgZTsgICAgLyogVGhlIHB1YmxpYyBleHBvbmVudC4gICovCisgIGdjcnlfbXBpX3QgbjsgICAgLyogVGhlIHB1YmxpYyBrZXkuICAqLworICBnY3J5X21waV90IGQ7ICAgIC8qIFRoZSBwcml2YXRlIGtleSAqLworICBnY3J5X21waV90IHU7ICAgIC8qIFRoZSBpbnZlcnNlIG9mIHAgYW5kIHEuICAqLworICBnY3J5X21waV90IHBtMTsgIC8qIHAgLSAxICAqLworICBnY3J5X21waV90IHFtMTsgIC8qIHEgLSAxICAqLworICBnY3J5X21waV90IHBoaTsgIC8qIEV1bGVyIHRvdGllbnQuICAqLworICBnY3J5X21waV90IGYsIGc7IC8qIEhlbHBlci4gICovCisKKyAgKnN3YXBwZWQgPSAwOworCisgIGlmIChlX3ZhbHVlID09IDEpICAgLyogQWxpYXMgZm9yIGEgc2VjdXJlIHZhbHVlLiAqLworICAgIGVfdmFsdWUgPSA2NTUzNzsgCisKKyAgLyogUG9pbnQgMSBvZiBzZWN0aW9uIDQuMTogIGsgPSAxMDI0ICsgMjU2cyB3aXRoIFMgPj0gMCAgKi8KKyAgaWYgKG5iaXRzIDwgMTAyNCB8fCAobmJpdHMgJSAyNTYpKQorICAgIHJldHVybiBHUEdfRVJSX0lOVl9WQUxVRTsKKyAgCisgIC8qIFBvaW50IDI6ICAyIDw9IGJpdGxlbmd0aChlKSA8IDJee2stMn0KKyAgICAgTm90ZSB0aGF0IHdlIGRvIG5vdCBuZWVkIHRvIGNoZWNrIHRoZSB1cHBlciBib3VuZCBiZWNhdXNlIHdlIHVzZQorICAgICBhbiB1bnNpZ25lZCBsb25nIGZvciBFIGFuZCB0aHVzIHRoZXJlIGlzIG5vIHdheSBmb3IgRSB0byByZWFjaAorICAgICB0aGF0IGxpbWl0LiAgKi8KKyAgaWYgKGVfdmFsdWUgPCAzKQorICAgIHJldHVybiBHUEdfRVJSX0lOVl9WQUxVRTsKKyAgICAgCisgIC8qIE91ciBpbXBsZW1lbnRhaW9uIHJlcXVpcmVzIEUgdG8gYmUgb2RkLiAgKi8KKyAgaWYgKCEoZV92YWx1ZSAmIDEpKQorICAgIHJldHVybiBHUEdfRVJSX0lOVl9WQUxVRTsKKworICAvKiBQb2ludCAzOiAgZSA+IDAgb3IgZSAwIGlmIGl0IGlzIHRvIGJlIHJhbmRvbWx5IGdlbmVyYXRlZC4KKyAgICAgV2Ugc3VwcG9ydCBvbmx5IGEgZml4ZWQgRSBhbmQgdGh1cyB0aGVyZSBpcyBubyBuZWVkIGZvciBhbiBleHRyYSB0ZXN0LiAgKi8KKworCisgIC8qIENvbXB1dGUgb3IgZXh0cmFjdCB0aGUgZGVyaXZlIHBhcmFtZXRlcnMuICAqLworICB7CisgICAgZ2NyeV9tcGlfdCB4cDEgPSBOVUxMOworICAgIGdjcnlfbXBpX3QgeHAyID0gTlVMTDsKKyAgICBnY3J5X21waV90IHhwICA9IE5VTEw7CisgICAgZ2NyeV9tcGlfdCB4cTEgPSBOVUxMOworICAgIGdjcnlfbXBpX3QgeHEyID0gTlVMTDsKKyAgICBnY3J5X21waV90IHhxICA9IE5VTEw7CisgICAgZ2NyeV9tcGlfdCB0bXB2YWw7CisKKyAgICBpZiAoIWRlcml2ZXBhcm1zKQorICAgICAgeworICAgICAgICAvKiBOb3QgZ2l2ZW46IEdlbmVyYXRlIHRoZW0uICAqLworICAgICAgICB4cCA9IGdlbl94OTMxX3Bhcm1feHAgKG5iaXRzLzIpOworICAgICAgICAvKiBNYWtlIHN1cmUgdGhhdCB8eHAgLSB4cXwgPiAyXntuYml0cyAtIDEwMH0gaG9sZHMuICAqLworICAgICAgICB0bXB2YWwgPSBnY3J5X21waV9zbmV3IChuYml0cy8yKTsKKyAgICAgICAgZG8KKyAgICAgICAgICB7CisgICAgICAgICAgICBnY3J5X21waV9yZWxlYXNlICh4cSk7CisgICAgICAgICAgICB4cSA9IGdlbl94OTMxX3Bhcm1feHAgKG5iaXRzLzIpOworICAgICAgICAgICAgbXBpX3N1YiAodG1wdmFsLCB4cCwgeHEpOworICAgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKG1waV9nZXRfbmJpdHMgKHRtcHZhbCkgPD0gKG5iaXRzLzIgLSAxMDApKTsKKyAgICAgICAgZ2NyeV9tcGlfcmVsZWFzZSAodG1wdmFsKTsKKworICAgICAgICB4cDEgPSBnZW5feDkzMV9wYXJtX3hpICgpOworICAgICAgICB4cDIgPSBnZW5feDkzMV9wYXJtX3hpICgpOworICAgICAgICB4cTEgPSBnZW5feDkzMV9wYXJtX3hpICgpOworICAgICAgICB4cTIgPSBnZW5feDkzMV9wYXJtX3hpICgpOworCisgICAgICB9CisgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBQYXJhbWV0ZXJzIHRvIGRlcml2ZSB0aGUga2V5IGFyZSBnaXZlbi4gICovCisgICAgICAgIHN0cnVjdCB7IGNvbnN0IGNoYXIgKm5hbWU7IGdjcnlfbXBpX3QgKnZhbHVlOyB9IHRibFtdID0geworICAgICAgICAgIHsgIlhwMSIsICZ4cDEgfSwKKyAgICAgICAgICB7ICJYcDIiLCAmeHAyIH0sCisgICAgICAgICAgeyAiWHAiLCAgJnhwICB9LAorICAgICAgICAgIHsgIlhxMSIsICZ4cTEgfSwKKyAgICAgICAgICB7ICJYcTIiLCAmeHEyIH0sCisgICAgICAgICAgeyAiWHEiLCAgJnhxICB9LAorICAgICAgICAgIHsgTlVMTCwgIE5VTEwgfQorICAgICAgICB9OworICAgICAgICBpbnQgaWR4OworICAgICAgICBnY3J5X3NleHBfdCBvbmVwYXJtOworICAgICAgICAKKyAgICAgICAgZm9yIChpZHg9MDsgdGJsW2lkeF0ubmFtZTsgaWR4KyspCisgICAgICAgICAgeworICAgICAgICAgICAgb25lcGFybSA9IGdjcnlfc2V4cF9maW5kX3Rva2VuIChkZXJpdmVwYXJtcywgdGJsW2lkeF0ubmFtZSwgMCk7CisgICAgICAgICAgICBpZiAob25lcGFybSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICp0YmxbaWR4XS52YWx1ZSA9IGdjcnlfc2V4cF9udGhfbXBpIChvbmVwYXJtLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ1JZTVBJX0ZNVF9VU0cpOworICAgICAgICAgICAgICAgIGdjcnlfc2V4cF9yZWxlYXNlIChvbmVwYXJtKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgZm9yIChpZHg9MDsgdGJsW2lkeF0ubmFtZTsgaWR4KyspCisgICAgICAgICAgaWYgKCEqdGJsW2lkeF0udmFsdWUpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKHRibFtpZHhdLm5hbWUpCisgICAgICAgICAgeworICAgICAgICAgICAgLyogQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBtaXNzaW5nLiAgKi8KKyAgICAgICAgICAgIGZvciAoaWR4PTA7IHRibFtpZHhdLm5hbWU7IGlkeCsrKQorICAgICAgICAgICAgICBnY3J5X21waV9yZWxlYXNlICgqdGJsW2lkeF0udmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIEdQR19FUlJfTUlTU0lOR19WQUxVRTsKKyAgICAgICAgICB9CisgICAgICB9CisgICAgCisgICAgZSA9IG1waV9hbGxvY19zZXRfdWkgKGVfdmFsdWUpOyAKKworICAgIC8qIEZpbmQgdHdvIHByaW1lIG51bWJlcnMuICAqLworICAgIHAgPSBfZ2NyeV9kZXJpdmVfeDkzMV9wcmltZSAoeHAsIHhwMSwgeHAyLCBlLCBOVUxMLCBOVUxMKTsKKyAgICBxID0gX2djcnlfZGVyaXZlX3g5MzFfcHJpbWUgKHhxLCB4cTEsIHhxMiwgZSwgTlVMTCwgTlVMTCk7CisgICAgZ2NyeV9tcGlfcmVsZWFzZSAoeHApOyAgeHAgID0gTlVMTDsKKyAgICBnY3J5X21waV9yZWxlYXNlICh4cDEpOyB4cDEgPSBOVUxMOworICAgIGdjcnlfbXBpX3JlbGVhc2UgKHhwMik7IHhwMiA9IE5VTEw7CisgICAgZ2NyeV9tcGlfcmVsZWFzZSAoeHEpOyAgeHEgID0gTlVMTDsgCisgICAgZ2NyeV9tcGlfcmVsZWFzZSAoeHExKTsgeHExID0gTlVMTDsKKyAgICBnY3J5X21waV9yZWxlYXNlICh4cTIpOyB4cTIgPSBOVUxMOworICAgIGlmICghcCB8fCAhcSkKKyAgICAgIHsKKyAgICAgICAgZ2NyeV9tcGlfcmVsZWFzZSAocCk7CisgICAgICAgIGdjcnlfbXBpX3JlbGVhc2UgKHEpOworICAgICAgICBnY3J5X21waV9yZWxlYXNlIChlKTsKKyAgICAgICAgcmV0dXJuIEdQR19FUlJfTk9fUFJJTUU7CisgICAgICB9CisgIH0KKworCisgIC8qIENvbXB1dGUgdGhlIHB1YmxpYyBtb2R1bHVzLiAgV2UgbWFrZSBzdXJlIHRoYXQgcCBpcyBzbWFsbGVyIHRoYW4KKyAgICAgcSB0byBhbGxvdyB0aGUgdXNlIG9mIHRoZSBDUlQuICAqLworICBpZiAobXBpX2NtcCAocCwgcSkgPiAwICkKKyAgICB7CisgICAgICBtcGlfc3dhcCAocCwgcSk7CisgICAgICAqc3dhcHBlZCA9IDE7CisgICAgfQorICBuID0gZ2NyeV9tcGlfbmV3IChuYml0cyk7CisgIG1waV9tdWwgKG4sIHAsIHEpOworCisgIC8qIENvbXB1dGUgdGhlIEV1bGVyIHRvdGllbnQ6ICBwaGkgPSAocC0xKShxLTEpICAqLworICBwbTEgPSBnY3J5X21waV9zbmV3IChuYml0cy8yKTsKKyAgcW0xID0gZ2NyeV9tcGlfc25ldyAobmJpdHMvMik7CisgIHBoaSA9IGdjcnlfbXBpX3NuZXcgKG5iaXRzKTsKKyAgbXBpX3N1Yl91aSAocG0xLCBwLCAxKTsKKyAgbXBpX3N1Yl91aSAocW0xLCBxLCAxKTsKKyAgbXBpX211bCAocGhpLCBwbTEsIHFtMSk7CisKKyAgZyA9IGdjcnlfbXBpX3NuZXcgKG5iaXRzKTsKKyAgZ2NyeV9hc3NlcnQgKGdjcnlfbXBpX2djZCAoZywgZSwgcGhpKSk7CisKKyAgLyogQ29tcHV0ZTogZiA9IGxjbShwLTEscS0xKSA9IHBoaSAvIGdjZChwLTEscS0xKSAqLworICBnY3J5X21waV9nY2QgKGcsIHBtMSwgcW0xKTsKKyAgZiA9IHBtMTsgcG0xID0gTlVMTDsKKyAgZ2NyeV9tcGlfcmVsZWFzZSAocW0xKTsgcW0xID0gTlVMTDsKKyAgbXBpX2ZkaXZfcSAoZiwgcGhpLCBnKTsKKyAgZ2NyeV9tcGlfcmVsZWFzZSAocGhpKTsgcGhpID0gTlVMTDsKKyAgZCA9IGc7IGcgPSBOVUxMOworICAvKiBDb21wdXRlIHRoZSBzZWNyZXQga2V5OiAgZCA9IGVeey0xfSBtb2QgbGNtKHAtMSxxLTEpICovCisgIG1waV9pbnZtIChkLCBlLCBmKTsKKworICAvKiBDb21wdXRlIHRoZSBpbnZlcnNlIG9mIHAgYW5kIHEuICAqLworICB1ID0gZjsgZiA9IE5VTEw7CisgIG1waV9pbnZtICh1LCBwLCBxICk7CisKKyAgaWYoIERCR19DSVBIRVIgKQorICAgIHsKKyAgICAgIGlmICgqc3dhcHBlZCkKKyAgICAgICAgbG9nX2RlYnVnICgicCBhbmQgcSBhcmUgc3dhcHBlZFxuIik7CisgICAgICBsb2dfbXBpZHVtcCgiICBwIiwgcCApOworICAgICAgbG9nX21waWR1bXAoIiAgcSIsIHEgKTsKKyAgICAgIGxvZ19tcGlkdW1wKCIgIG4iLCBuICk7CisgICAgICBsb2dfbXBpZHVtcCgiICBlIiwgZSApOworICAgICAgbG9nX21waWR1bXAoIiAgZCIsIGQgKTsKKyAgICAgIGxvZ19tcGlkdW1wKCIgIHUiLCB1ICk7CisgICAgfQorCisKKyAgc2stPm4gPSBuOworICBzay0+ZSA9IGU7CisgIHNrLT5wID0gcDsKKyAgc2stPnEgPSBxOworICBzay0+ZCA9IGQ7CisgIHNrLT51ID0gdTsKKworICAvKiBOb3cgd2UgY2FuIHRlc3Qgb3VyIGtleXMuICovCisgIGlmICh0ZXN0X2tleXMgKHNrLCBuYml0cyAtIDY0KSkKKyAgICB7CisgICAgICBnY3J5X21waV9yZWxlYXNlIChzay0+bik7IHNrLT5uID0gTlVMTDsKKyAgICAgIGdjcnlfbXBpX3JlbGVhc2UgKHNrLT5lKTsgc2stPmUgPSBOVUxMOworICAgICAgZ2NyeV9tcGlfcmVsZWFzZSAoc2stPnApOyBzay0+cCA9IE5VTEw7CisgICAgICBnY3J5X21waV9yZWxlYXNlIChzay0+cSk7IHNrLT5xID0gTlVMTDsKKyAgICAgIGdjcnlfbXBpX3JlbGVhc2UgKHNrLT5kKTsgc2stPmQgPSBOVUxMOworICAgICAgZ2NyeV9tcGlfcmVsZWFzZSAoc2stPnUpOyBzay0+dSA9IE5VTEw7CisgICAgICBmaXBzX3NpZ25hbF9lcnJvciAoInNlbGYtdGVzdCBhZnRlciBrZXkgZ2VuZXJhdGlvbiBmYWlsZWQiKTsKKyAgICAgIHJldHVybiBHUEdfRVJSX1NFTEZURVNUX0ZBSUxFRDsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioKKyAqIFRlc3Qgd2V0aGVyIHRoZSBzZWNyZXQga2V5IGlzIHZhbGlkLgorICogUmV0dXJuczogdHJ1ZSBpZiB0aGlzIGlzIGEgdmFsaWQga2V5LgorICovCitzdGF0aWMgaW50CitjaGVja19zZWNyZXRfa2V5KCBSU0Ffc2VjcmV0X2tleSAqc2sgKQoreworICBpbnQgcmM7CisgIGdjcnlfbXBpX3QgdGVtcCA9IG1waV9hbGxvYyggbXBpX2dldF9ubGltYnMoc2stPnApKjIgKTsKKyAgCisgIG1waV9tdWwodGVtcCwgc2stPnAsIHNrLT5xICk7CisgIHJjID0gbXBpX2NtcCggdGVtcCwgc2stPm4gKTsKKyAgbXBpX2ZyZWUodGVtcCk7CisgIHJldHVybiAhcmM7Cit9CisKKworCisvKioqKioqKioqKioqKioqKgorICogUHVibGljIGtleSBvcGVyYXRpb24uIEVuY3J5cHQgSU5QVVQgd2l0aCBQS0VZIGFuZCBwdXQgcmVzdWx0IGludG8gT1VUUFVULgorICoKKyAqCWMgPSBtXmUgbW9kIG4KKyAqCisgKiBXaGVyZSBjIGlzIE9VVFBVVCwgbSBpcyBJTlBVVCBhbmQgZSxuIGFyZSBlbGVtZW50cyBvZiBQS0VZLgorICovCitzdGF0aWMgdm9pZAorcHVibGljKGdjcnlfbXBpX3Qgb3V0cHV0LCBnY3J5X21waV90IGlucHV0LCBSU0FfcHVibGljX2tleSAqcGtleSApCit7CisgIGlmKCBvdXRwdXQgPT0gaW5wdXQgKSAgLyogcG93bSBkb2Vzbid0IGxpa2Ugb3V0cHV0IGFuZCBpbnB1dCB0aGUgc2FtZSAqLworICAgIHsKKyAgICAgIGdjcnlfbXBpX3QgeCA9IG1waV9hbGxvYyggbXBpX2dldF9ubGltYnMoaW5wdXQpKjIgKTsKKyAgICAgIG1waV9wb3dtKCB4LCBpbnB1dCwgcGtleS0+ZSwgcGtleS0+biApOworICAgICAgbXBpX3NldChvdXRwdXQsIHgpOworICAgICAgbXBpX2ZyZWUoeCk7CisgICAgfQorICBlbHNlCisgICAgbXBpX3Bvd20oIG91dHB1dCwgaW5wdXQsIHBrZXktPmUsIHBrZXktPm4gKTsKK30KKworI2lmIDAKK3N0YXRpYyB2b2lkCitzdHJvbmdlcl9rZXlfY2hlY2sgKCBSU0Ffc2VjcmV0X2tleSAqc2tleSApCit7CisgIGdjcnlfbXBpX3QgdCA9IG1waV9hbGxvY19zZWN1cmUgKCAwICk7CisgIGdjcnlfbXBpX3QgdDEgPSBtcGlfYWxsb2Nfc2VjdXJlICggMCApOworICBnY3J5X21waV90IHQyID0gbXBpX2FsbG9jX3NlY3VyZSAoIDAgKTsKKyAgZ2NyeV9tcGlfdCBwaGkgPSBtcGlfYWxsb2Nfc2VjdXJlICggMCApOworCisgIC8qIGNoZWNrIHRoYXQgbiA9PSBwICogcSAqLworICBtcGlfbXVsKCB0LCBza2V5LT5wLCBza2V5LT5xKTsKKyAgaWYgKG1waV9jbXAoIHQsIHNrZXktPm4pICkKKyAgICBsb2dfaW5mbyAoICJSU0EgT29wczogbiAhPSBwICogcVxuIiApOworCisgIC8qIGNoZWNrIHRoYXQgcCBpcyBsZXNzIHRoYW4gcSAqLworICBpZiggbXBpX2NtcCggc2tleS0+cCwgc2tleS0+cSApID4gMCApCisgICAgeworICAgICAgbG9nX2luZm8gKCJSU0EgT29wczogcCA+PSBxIC0gZml4ZWRcbiIpOworICAgICAgX2djcnlfbXBpX3N3YXAgKCBza2V5LT5wLCBza2V5LT5xKTsKKyAgICB9CisKKyAgICAvKiBjaGVjayB0aGF0IGUgZGl2aWRlcyBuZWl0aGVyIHAtMSBub3IgcS0xICovCisgICAgbXBpX3N1Yl91aSh0LCBza2V5LT5wLCAxICk7CisgICAgbXBpX2ZkaXZfcih0LCB0LCBza2V5LT5lICk7CisgICAgaWYgKCAhbXBpX2NtcF91aSggdCwgMCkgKQorICAgICAgICBsb2dfaW5mbyAoICJSU0EgT29wczogZSBkaXZpZGVzIHAtMVxuIiApOworICAgIG1waV9zdWJfdWkodCwgc2tleS0+cSwgMSApOworICAgIG1waV9mZGl2X3IodCwgdCwgc2tleS0+ZSApOworICAgIGlmICggIW1waV9jbXBfdWkoIHQsIDApICkKKyAgICAgICAgbG9nX2luZm8gKCAiUlNBIE9vcHM6IGUgZGl2aWRlcyBxLTFcbiIgKTsKKworICAgIC8qIGNoZWNrIHRoYXQgZCBpcyBjb3JyZWN0ICovCisgICAgbXBpX3N1Yl91aSggdDEsIHNrZXktPnAsIDEgKTsKKyAgICBtcGlfc3ViX3VpKCB0Miwgc2tleS0+cSwgMSApOworICAgIG1waV9tdWwoIHBoaSwgdDEsIHQyICk7CisgICAgZ2NyeV9tcGlfZ2NkKHQsIHQxLCB0Mik7CisgICAgbXBpX2ZkaXZfcSh0LCBwaGksIHQpOworICAgIG1waV9pbnZtKHQsIHNrZXktPmUsIHQgKTsKKyAgICBpZiAoIG1waV9jbXAodCwgc2tleS0+ZCApICkKKyAgICAgIHsKKyAgICAgICAgbG9nX2luZm8gKCAiUlNBIE9vcHM6IGQgaXMgd3JvbmcgLSBmaXhlZFxuIik7CisgICAgICAgIG1waV9zZXQgKHNrZXktPmQsIHQpOworICAgICAgICBfZ2NyeV9sb2dfbXBpZHVtcCAoIiAgZml4ZWQgZCIsIHNrZXktPmQpOworICAgICAgfQorCisgICAgLyogY2hlY2sgZm9yIGNvcnJlY3RuZXNzIG9mIHUgKi8KKyAgICBtcGlfaW52bSh0LCBza2V5LT5wLCBza2V5LT5xICk7CisgICAgaWYgKCBtcGlfY21wKHQsIHNrZXktPnUgKSApCisgICAgICB7CisgICAgICAgIGxvZ19pbmZvICggIlJTQSBPb3BzOiB1IGlzIHdyb25nIC0gZml4ZWRcbiIpOworICAgICAgICBtcGlfc2V0IChza2V5LT51LCB0KTsKKyAgICAgICAgX2djcnlfbG9nX21waWR1bXAgKCIgIGZpeGVkIHUiLCBza2V5LT51KTsKKyAgICAgIH0KKworICAgIGxvZ19pbmZvICggIlJTQSBzZWNyZXQga2V5IGNoZWNrIGZpbmlzaGVkXG4iKTsKKworICAgIG1waV9mcmVlICh0KTsKKyAgICBtcGlfZnJlZSAodDEpOworICAgIG1waV9mcmVlICh0Mik7CisgICAgbXBpX2ZyZWUgKHBoaSk7Cit9CisjZW5kaWYKKworCisKKy8qKioqKioqKioqKioqKioqCisgKiBTZWNyZXQga2V5IG9wZXJhdGlvbi4gRW5jcnlwdCBJTlBVVCB3aXRoIFNLRVkgYW5kIHB1dCByZXN1bHQgaW50byBPVVRQVVQuCisgKgorICoJbSA9IGNeZCBtb2QgbgorICoKKyAqIE9yIGZhc3RlcjoKKyAqCisgKiAgICAgIG0xID0gYyBeIChkIG1vZCAocC0xKSkgbW9kIHAgCisgKiAgICAgIG0yID0gYyBeIChkIG1vZCAocS0xKSkgbW9kIHEgCisgKiAgICAgIGggPSB1ICogKG0yIC0gbTEpIG1vZCBxIAorICogICAgICBtID0gbTEgKyBoICogcAorICoKKyAqIFdoZXJlIG0gaXMgT1VUUFVULCBjIGlzIElOUFVUIGFuZCBkLG4scCxxLHUgYXJlIGVsZW1lbnRzIG9mIFNLRVkuCisgKi8KK3N0YXRpYyB2b2lkCitzZWNyZXQoZ2NyeV9tcGlfdCBvdXRwdXQsIGdjcnlfbXBpX3QgaW5wdXQsIFJTQV9zZWNyZXRfa2V5ICpza2V5ICkKK3sKKyAgaWYgKCFza2V5LT5wIHx8ICFza2V5LT5xIHx8ICFza2V5LT51KQorICAgIHsKKyAgICAgIG1waV9wb3dtIChvdXRwdXQsIGlucHV0LCBza2V5LT5kLCBza2V5LT5uKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBnY3J5X21waV90IG0xID0gbXBpX2FsbG9jX3NlY3VyZSggbXBpX2dldF9ubGltYnMoc2tleS0+bikrMSApOworICAgICAgZ2NyeV9tcGlfdCBtMiA9IG1waV9hbGxvY19zZWN1cmUoIG1waV9nZXRfbmxpbWJzKHNrZXktPm4pKzEgKTsKKyAgICAgIGdjcnlfbXBpX3QgaCAgPSBtcGlfYWxsb2Nfc2VjdXJlKCBtcGlfZ2V0X25saW1icyhza2V5LT5uKSsxICk7CisgICAgICAKKyAgICAgIC8qIG0xID0gYyBeIChkIG1vZCAocC0xKSkgbW9kIHAgKi8KKyAgICAgIG1waV9zdWJfdWkoIGgsIHNrZXktPnAsIDEgICk7CisgICAgICBtcGlfZmRpdl9yKCBoLCBza2V5LT5kLCBoICk7ICAgCisgICAgICBtcGlfcG93bSggbTEsIGlucHV0LCBoLCBza2V5LT5wICk7CisgICAgICAvKiBtMiA9IGMgXiAoZCBtb2QgKHEtMSkpIG1vZCBxICovCisgICAgICBtcGlfc3ViX3VpKCBoLCBza2V5LT5xLCAxICApOworICAgICAgbXBpX2ZkaXZfciggaCwgc2tleS0+ZCwgaCApOworICAgICAgbXBpX3Bvd20oIG0yLCBpbnB1dCwgaCwgc2tleS0+cSApOworICAgICAgLyogaCA9IHUgKiAoIG0yIC0gbTEgKSBtb2QgcSAqLworICAgICAgbXBpX3N1YiggaCwgbTIsIG0xICk7CisgICAgICBpZiAoIG1waV9pc19uZWcoIGggKSApIAorICAgICAgICBtcGlfYWRkICggaCwgaCwgc2tleS0+cSApOworICAgICAgbXBpX211bG0oIGgsIHNrZXktPnUsIGgsIHNrZXktPnEgKTsgCisgICAgICAvKiBtID0gbTIgKyBoICogcCAqLworICAgICAgbXBpX211bCAoIGgsIGgsIHNrZXktPnAgKTsKKyAgICAgIG1waV9hZGQgKCBvdXRwdXQsIG0xLCBoICk7CisgICAgCisgICAgICBtcGlfZnJlZSAoIGggKTsKKyAgICAgIG1waV9mcmVlICggbTEgKTsKKyAgICAgIG1waV9mcmVlICggbTIgKTsKKyAgICB9Cit9CisKKworCisvKiBQZXJmb3JtIFJTQSBibGluZGluZy4gICovCitzdGF0aWMgZ2NyeV9tcGlfdAorcnNhX2JsaW5kIChnY3J5X21waV90IHgsIGdjcnlfbXBpX3QgciwgZ2NyeV9tcGlfdCBlLCBnY3J5X21waV90IG4pCit7CisgIC8qIEEgaGVscGVyLiAgKi8KKyAgZ2NyeV9tcGlfdCBhOworCisgIC8qIFJlc3VsdC4gICovCisgIGdjcnlfbXBpX3QgeTsKKworICBhID0gZ2NyeV9tcGlfc25ldyAoZ2NyeV9tcGlfZ2V0X25iaXRzIChuKSk7CisgIHkgPSBnY3J5X21waV9zbmV3IChnY3J5X21waV9nZXRfbmJpdHMgKG4pKTsKKyAgCisgIC8qIE5vdyB3ZSBjYWxjdWxhdGU6IHkgPSAoeCAqIHJeZSkgbW9kIG4sIHdoZXJlIHIgaXMgdGhlIHJhbmRvbQorICAgICBudW1iZXIsIGUgaXMgdGhlIHB1YmxpYyBleHBvbmVudCwgeCBpcyB0aGUgbm9uLWJsaW5kZWQgZGF0YSBhbmQgbgorICAgICBpcyB0aGUgUlNBIG1vZHVsdXMuICAqLworICBnY3J5X21waV9wb3dtIChhLCByLCBlLCBuKTsKKyAgZ2NyeV9tcGlfbXVsbSAoeSwgYSwgeCwgbik7CisKKyAgZ2NyeV9tcGlfcmVsZWFzZSAoYSk7CisKKyAgcmV0dXJuIHk7Cit9CisKKy8qIFVuZG8gUlNBIGJsaW5kaW5nLiAgKi8KK3N0YXRpYyBnY3J5X21waV90Cityc2FfdW5ibGluZCAoZ2NyeV9tcGlfdCB4LCBnY3J5X21waV90IHJpLCBnY3J5X21waV90IG4pCit7CisgIGdjcnlfbXBpX3QgeTsKKworICB5ID0gZ2NyeV9tcGlfc25ldyAoZ2NyeV9tcGlfZ2V0X25iaXRzIChuKSk7CisKKyAgLyogSGVyZSB3ZSBjYWxjdWxhdGU6IHkgPSAoeCAqIHJeLTEpIG1vZCBuLCB3aGVyZSB4IGlzIHRoZSBibGluZGVkCisgICAgIGRlY3J5cHRlZCBkYXRhLCByaSBpcyB0aGUgbW9kdWxhciBtdWx0aXBsaWNhdGl2ZSBpbnZlcnNlIG9mIHIgYW5kCisgICAgIG4gaXMgdGhlIFJTQSBtb2R1bHVzLiAgKi8KKworICBnY3J5X21waV9tdWxtICh5LCByaSwgeCwgbik7CisKKyAgcmV0dXJuIHk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKiAgaW50ZXJmYWNlICAqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBnY3J5X2Vycl9jb2RlX3QKK3JzYV9nZW5lcmF0ZV9leHQgKGludCBhbGdvLCB1bnNpZ25lZCBpbnQgbmJpdHMsIHVuc2lnbmVkIGxvbmcgZXZhbHVlLAorICAgICAgICAgICAgICAgICAgY29uc3QgZ2NyeV9zZXhwX3QgZ2VucGFybXMsCisgICAgICAgICAgICAgICAgICBnY3J5X21waV90ICpza2V5LCBnY3J5X21waV90ICoqcmV0ZmFjdG9ycywKKyAgICAgICAgICAgICAgICAgIGdjcnlfc2V4cF90ICpyX2V4dHJhaW5mbykKK3sKKyAgUlNBX3NlY3JldF9rZXkgc2s7CisgIGdwZ19lcnJfY29kZV90IGVjOworICBnY3J5X3NleHBfdCBkZXJpdmVwYXJtczsKKyAgaW50IHRyYW5zaWVudF9rZXkgPSAwOworICBpbnQgdXNlX3g5MzEgPSAwOworICBnY3J5X3NleHBfdCBsMTsKKworICAodm9pZClhbGdvOworICAKKyAgKnJldGZhY3RvcnMgPSBOVUxMOyAvKiBXZSBkb24ndCByZXR1cm4gdGhlbS4gICovCisKKyAgZGVyaXZlcGFybXMgPSAoZ2VucGFybXM/CisgICAgICAgICAgICAgICAgIGdjcnlfc2V4cF9maW5kX3Rva2VuIChnZW5wYXJtcywgImRlcml2ZS1wYXJtcyIsIDApIDogTlVMTCk7CisgIGlmICghZGVyaXZlcGFybXMpCisgICAgeworICAgICAgLyogUGFyc2UgdGhlIG9wdGlvbmFsICJ1c2UteDkzMSIgZmxhZy4gKi8KKyAgICAgIGwxID0gZ2NyeV9zZXhwX2ZpbmRfdG9rZW4gKGdlbnBhcm1zLCAidXNlLXg5MzEiLCAwKTsKKyAgICAgIGlmIChsMSkKKyAgICAgICAgeworICAgICAgICAgIHVzZV94OTMxID0gMTsKKyAgICAgICAgICBnY3J5X3NleHBfcmVsZWFzZSAobDEpOworICAgICAgICB9CisgICAgfQorCisgIGlmIChkZXJpdmVwYXJtcyB8fCB1c2VfeDkzMSB8fCBmaXBzX21vZGUgKCkpCisgICAgeworICAgICAgaW50IHN3YXBwZWQ7CisgICAgICBlYyA9IGdlbmVyYXRlX3g5MzEgKCZzaywgbmJpdHMsIGV2YWx1ZSwgZGVyaXZlcGFybXMsICZzd2FwcGVkKTsKKyAgICAgIGdjcnlfc2V4cF9yZWxlYXNlIChkZXJpdmVwYXJtcyk7CisgICAgICBpZiAoIWVjICYmIHJfZXh0cmFpbmZvICYmIHN3YXBwZWQpCisgICAgICAgIHsKKyAgICAgICAgICBlYyA9IGdjcnlfc2V4cF9uZXcgKHJfZXh0cmFpbmZvLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIobWlzYy1rZXktaW5mbyhwLXEtc3dhcHBlZCkpIiwgMCwgMSk7CisgICAgICAgICAgaWYgKGVjKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBnY3J5X21waV9yZWxlYXNlIChzay5uKTsgc2subiA9IE5VTEw7CisgICAgICAgICAgICAgIGdjcnlfbXBpX3JlbGVhc2UgKHNrLmUpOyBzay5lID0gTlVMTDsKKyAgICAgICAgICAgICAgZ2NyeV9tcGlfcmVsZWFzZSAoc2sucCk7IHNrLnAgPSBOVUxMOworICAgICAgICAgICAgICBnY3J5X21waV9yZWxlYXNlIChzay5xKTsgc2sucSA9IE5VTEw7CisgICAgICAgICAgICAgIGdjcnlfbXBpX3JlbGVhc2UgKHNrLmQpOyBzay5kID0gTlVMTDsKKyAgICAgICAgICAgICAgZ2NyeV9tcGlfcmVsZWFzZSAoc2sudSk7IHNrLnUgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogUGFyc2UgdGhlIG9wdGlvbmFsICJ0cmFuc2llbnQta2V5IiBmbGFnLiAqLworICAgICAgbDEgPSBnY3J5X3NleHBfZmluZF90b2tlbiAoZ2VucGFybXMsICJ0cmFuc2llbnQta2V5IiwgMCk7CisgICAgICBpZiAobDEpCisgICAgICAgIHsKKyAgICAgICAgICB0cmFuc2llbnRfa2V5ID0gMTsKKyAgICAgICAgICBnY3J5X3NleHBfcmVsZWFzZSAobDEpOworICAgICAgICB9CisgICAgICAvKiBHZW5lcmF0ZS4gICovCisgICAgICBlYyA9IGdlbmVyYXRlX3N0ZCAoJnNrLCBuYml0cywgZXZhbHVlLCB0cmFuc2llbnRfa2V5KTsKKyAgICB9CisKKyAgaWYgKCFlYykKKyAgICB7CisgICAgICBza2V5WzBdID0gc2subjsKKyAgICAgIHNrZXlbMV0gPSBzay5lOworICAgICAgc2tleVsyXSA9IHNrLmQ7CisgICAgICBza2V5WzNdID0gc2sucDsKKyAgICAgIHNrZXlbNF0gPSBzay5xOworICAgICAgc2tleVs1XSA9IHNrLnU7CisgICAgfQorICAKKyAgcmV0dXJuIGVjOworfQorCisKK3N0YXRpYyBnY3J5X2Vycl9jb2RlX3QKK3JzYV9nZW5lcmF0ZSAoaW50IGFsZ28sIHVuc2lnbmVkIGludCBuYml0cywgdW5zaWduZWQgbG9uZyBldmFsdWUsCisgICAgICAgICAgICAgIGdjcnlfbXBpX3QgKnNrZXksIGdjcnlfbXBpX3QgKipyZXRmYWN0b3JzKQoreworICByZXR1cm4gcnNhX2dlbmVyYXRlX2V4dCAoYWxnbywgbmJpdHMsIGV2YWx1ZSwgTlVMTCwgc2tleSwgcmV0ZmFjdG9ycywgTlVMTCk7Cit9CisKKworc3RhdGljIGdjcnlfZXJyX2NvZGVfdAorcnNhX2NoZWNrX3NlY3JldF9rZXkgKGludCBhbGdvLCBnY3J5X21waV90ICpza2V5KQoreworICBnY3J5X2Vycl9jb2RlX3QgZXJyID0gR1BHX0VSUl9OT19FUlJPUjsKKyAgUlNBX3NlY3JldF9rZXkgc2s7CisKKyAgKHZvaWQpYWxnbzsKKworICBzay5uID0gc2tleVswXTsKKyAgc2suZSA9IHNrZXlbMV07CisgIHNrLmQgPSBza2V5WzJdOworICBzay5wID0gc2tleVszXTsKKyAgc2sucSA9IHNrZXlbNF07CisgIHNrLnUgPSBza2V5WzVdOworCisgIGlmICghc2sucCB8fCAhc2sucSB8fCAhc2sudSkKKyAgICBlcnIgPSBHUEdfRVJSX05PX09CSjsgIC8qIFRvIGNoZWNrIHRoZSBrZXkgd2UgbmVlZCB0aGUgb3B0aW9uYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMuICovCisgIGVsc2UgaWYgKCFjaGVja19zZWNyZXRfa2V5ICgmc2spKQorICAgIGVyciA9IEdQR19FUlJfUFVCS0VZX0FMR087CisKKyAgcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgZ2NyeV9lcnJfY29kZV90Cityc2FfZW5jcnlwdCAoaW50IGFsZ28sIGdjcnlfbXBpX3QgKnJlc2FyciwgZ2NyeV9tcGlfdCBkYXRhLAorICAgICAgICAgICAgIGdjcnlfbXBpX3QgKnBrZXksIGludCBmbGFncykKK3sKKyAgUlNBX3B1YmxpY19rZXkgcGs7CisKKyAgKHZvaWQpYWxnbzsKKyAgKHZvaWQpZmxhZ3M7CisgIAorICBway5uID0gcGtleVswXTsKKyAgcGsuZSA9IHBrZXlbMV07CisgIHJlc2FyclswXSA9IG1waV9hbGxvYyAobXBpX2dldF9ubGltYnMgKHBrLm4pKTsKKyAgcHVibGljIChyZXNhcnJbMF0sIGRhdGEsICZwayk7CisgIAorICByZXR1cm4gR1BHX0VSUl9OT19FUlJPUjsKK30KKworCitzdGF0aWMgZ2NyeV9lcnJfY29kZV90Cityc2FfZGVjcnlwdCAoaW50IGFsZ28sIGdjcnlfbXBpX3QgKnJlc3VsdCwgZ2NyeV9tcGlfdCAqZGF0YSwKKyAgICAgICAgICAgICBnY3J5X21waV90ICpza2V5LCBpbnQgZmxhZ3MpCit7CisgIFJTQV9zZWNyZXRfa2V5IHNrOworICBnY3J5X21waV90IHIgPSBNUElfTlVMTDsJLyogUmFuZG9tIG51bWJlciBuZWVkZWQgZm9yIGJsaW5kaW5nLiAgKi8KKyAgZ2NyeV9tcGlfdCByaSA9IE1QSV9OVUxMOwkvKiBNb2R1bGFyIG11bHRpcGxpY2F0aXZlIGludmVyc2Ugb2YKKwkJCQkgICByLiAgKi8KKyAgZ2NyeV9tcGlfdCB4ID0gTVBJX05VTEw7CS8qIERhdGEgdG8gZGVjcnlwdC4gICovCisgIGdjcnlfbXBpX3QgeTsJCQkvKiBSZXN1bHQuICAqLworCisgICh2b2lkKWFsZ287CisKKyAgLyogRXh0cmFjdCBwcml2YXRlIGtleS4gICovCisgIHNrLm4gPSBza2V5WzBdOworICBzay5lID0gc2tleVsxXTsKKyAgc2suZCA9IHNrZXlbMl07CisgIHNrLnAgPSBza2V5WzNdOyAvKiBPcHRpb25hbC4gKi8KKyAgc2sucSA9IHNrZXlbNF07IC8qIE9wdGlvbmFsLiAqLworICBzay51ID0gc2tleVs1XTsgLyogT3B0aW9uYWwuICovCisKKyAgeSA9IGdjcnlfbXBpX3NuZXcgKGdjcnlfbXBpX2dldF9uYml0cyAoc2subikpOworCisgIC8qIFdlIHVzZSBibGluZGluZyBieSBkZWZhdWx0IHRvIG1pdGlnYXRlIHRpbWluZyBhdHRhY2tzIHdoaWNoIGNhbgorICAgICBiZSBwcmFjdGljYWxseSBtb3VudGVkIG92ZXIgdGhlIG5ldHdvcmsgYXMgc2hvd24gYnkgQnJ1bWxleSBhbmQKKyAgICAgQm9uZXkgaW4gMjAwMy4gICovIAorICBpZiAoISAoZmxhZ3MgJiBQVUJLRVlfRkxBR19OT19CTElORElORykpCisgICAgeworICAgICAgLyogSW5pdGlhbGl6ZSBibGluZGluZy4gICovCisgICAgICAKKyAgICAgIC8qIEZpcnN0LCB3ZSBuZWVkIGEgcmFuZG9tIG51bWJlciByIGJldHdlZW4gMCBhbmQgbiAtIDEsIHdoaWNoCisJIGlzIHJlbGF0aXZlbHkgcHJpbWUgdG8gbiAoaS5lLiBpdCBpcyBuZWl0aGVyIHAgbm9yIHEpLiAgVGhlCisJIHJhbmRvbSBudW1iZXIgbmVlZHMgdG8gYmUgb25seSB1bnByZWRpY3RhYmxlLCB0aHVzIHdlIGVtcGxveQorCSB0aGUgZ2NyeV9jcmVhdGVfbm9uY2UgZnVuY3Rpb24gYnkgdXNpbmcgR0NSWV9XRUFLX1JBTkRPTSB3aXRoCisJIGdjcnlfbXBpX3JhbmRvbWl6ZS4gICovCisgICAgICByID0gZ2NyeV9tcGlfc25ldyAoZ2NyeV9tcGlfZ2V0X25iaXRzIChzay5uKSk7CisgICAgICByaSA9IGdjcnlfbXBpX3NuZXcgKGdjcnlfbXBpX2dldF9uYml0cyAoc2subikpOworICAgICAgCisgICAgICBnY3J5X21waV9yYW5kb21pemUgKHIsIGdjcnlfbXBpX2dldF9uYml0cyAoc2subiksIEdDUllfV0VBS19SQU5ET00pOworICAgICAgZ2NyeV9tcGlfbW9kIChyLCByLCBzay5uKTsKKworICAgICAgLyogQ2FsY3VsYXRlIGludmVyc2Ugb2Ygci4gIEl0IHByYWN0aWNhbGx5IGltcG9zc2libGUgdGhhdCB0aGUKKyAgICAgICAgIGZvbGx3aW5nIHRlc3QgZmFpbHMsIHRodXMgd2UgZG8gbm90IGFkZCBjb2RlIHRvIHJlbGVhc2UKKyAgICAgICAgIGFsbG9jYXRlZCByZXNvdXJjZXMuICAqLworICAgICAgaWYgKCFnY3J5X21waV9pbnZtIChyaSwgciwgc2subikpCisJcmV0dXJuIEdQR19FUlJfSU5URVJOQUw7CisgICAgfQorCisgIGlmICghIChmbGFncyAmIFBVQktFWV9GTEFHX05PX0JMSU5ESU5HKSkKKyAgICB4ID0gcnNhX2JsaW5kIChkYXRhWzBdLCByLCBzay5lLCBzay5uKTsKKyAgZWxzZQorICAgIHggPSBkYXRhWzBdOworCisgIC8qIERvIHRoZSBlbmNyeXB0aW9uLiAgKi8KKyAgc2VjcmV0ICh5LCB4LCAmc2spOworCisgIGlmICghIChmbGFncyAmIFBVQktFWV9GTEFHX05PX0JMSU5ESU5HKSkKKyAgICB7CisgICAgICAvKiBVbmRvIGJsaW5kaW5nLiAgKi8KKyAgICAgIGdjcnlfbXBpX3QgYSA9IGdjcnlfbXBpX2NvcHkgKHkpOworICAgICAgCisgICAgICBnY3J5X21waV9yZWxlYXNlICh5KTsKKyAgICAgIHkgPSByc2FfdW5ibGluZCAoYSwgcmksIHNrLm4pOworCisgICAgICBnY3J5X21waV9yZWxlYXNlIChhKTsKKyAgICB9CisKKyAgaWYgKCEgKGZsYWdzICYgUFVCS0VZX0ZMQUdfTk9fQkxJTkRJTkcpKQorICAgIHsKKyAgICAgIC8qIERlYWxsb2NhdGUgcmVzb3VyY2VzIG5lZWRlZCBmb3IgYmxpbmRpbmcuICAqLworICAgICAgZ2NyeV9tcGlfcmVsZWFzZSAoeCk7CisgICAgICBnY3J5X21waV9yZWxlYXNlIChyKTsKKyAgICAgIGdjcnlfbXBpX3JlbGVhc2UgKHJpKTsKKyAgICB9CisKKyAgLyogQ29weSBvdXQgcmVzdWx0LiAgKi8KKyAgKnJlc3VsdCA9IHk7CisgIAorICByZXR1cm4gR1BHX0VSUl9OT19FUlJPUjsKK30KKworCitzdGF0aWMgZ2NyeV9lcnJfY29kZV90Cityc2Ffc2lnbiAoaW50IGFsZ28sIGdjcnlfbXBpX3QgKnJlc2FyciwgZ2NyeV9tcGlfdCBkYXRhLCBnY3J5X21waV90ICpza2V5KQoreworICBSU0Ffc2VjcmV0X2tleSBzazsKKworICAodm9pZClhbGdvOworICAKKyAgc2subiA9IHNrZXlbMF07CisgIHNrLmUgPSBza2V5WzFdOworICBzay5kID0gc2tleVsyXTsKKyAgc2sucCA9IHNrZXlbM107CisgIHNrLnEgPSBza2V5WzRdOworICBzay51ID0gc2tleVs1XTsKKyAgcmVzYXJyWzBdID0gbXBpX2FsbG9jKCBtcGlfZ2V0X25saW1icyAoc2subikpOworICBzZWNyZXQgKHJlc2FyclswXSwgZGF0YSwgJnNrKTsKKworICByZXR1cm4gR1BHX0VSUl9OT19FUlJPUjsKK30KKworCitzdGF0aWMgZ2NyeV9lcnJfY29kZV90Cityc2FfdmVyaWZ5IChpbnQgYWxnbywgZ2NyeV9tcGlfdCBoYXNoLCBnY3J5X21waV90ICpkYXRhLCBnY3J5X21waV90ICpwa2V5LAorCQkgIGludCAoKmNtcCkgKHZvaWQgKm9wYXF1ZSwgZ2NyeV9tcGlfdCB0bXApLAorCQkgIHZvaWQgKm9wYXF1ZXYpCit7CisgIFJTQV9wdWJsaWNfa2V5IHBrOworICBnY3J5X21waV90IHJlc3VsdDsKKyAgZ2NyeV9lcnJfY29kZV90IHJjOworCisgICh2b2lkKWFsZ287CisgICh2b2lkKWNtcDsKKyAgKHZvaWQpb3BhcXVldjsKKworICBway5uID0gcGtleVswXTsKKyAgcGsuZSA9IHBrZXlbMV07CisgIHJlc3VsdCA9IGdjcnlfbXBpX25ldyAoIDE2MCApOworICBwdWJsaWMoIHJlc3VsdCwgZGF0YVswXSwgJnBrICk7CisjaWZkZWYgSVNfREVWRUxPUE1FTlRfVkVSU0lPTgorICBpZiAoREJHX0NJUEhFUikKKyAgICB7CisgICAgICBsb2dfbXBpZHVtcCAoInJzYSB2ZXJpZnkgcmVzdWx0OiIsIHJlc3VsdCApOworICAgICAgbG9nX21waWR1bXAgKCIgICAgICAgICAgICAgaGFzaDoiLCBoYXNoICk7CisgICAgfQorI2VuZGlmIC8qSVNfREVWRUxPUE1FTlRfVkVSU0lPTiovCisgIC8qcmMgPSAoKmNtcCkoIG9wYXF1ZXYsIHJlc3VsdCApOyovCisgIHJjID0gbXBpX2NtcCAocmVzdWx0LCBoYXNoKSA/IEdQR19FUlJfQkFEX1NJR05BVFVSRSA6IEdQR19FUlJfTk9fRVJST1I7CisgIGdjcnlfbXBpX3JlbGVhc2UgKHJlc3VsdCk7CisgIAorICByZXR1cm4gcmM7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGludAorcnNhX2dldF9uYml0cyAoaW50IGFsZ28sIGdjcnlfbXBpX3QgKnBrZXkpCit7CisgICh2b2lkKWFsZ287CisKKyAgcmV0dXJuIG1waV9nZXRfbmJpdHMgKHBrZXlbMF0pOworfQorCisKKy8qIENvbXB1dGUgYSBrZXlncmlwLiAgTUQgaXMgdGhlIGhhc2ggY29udGV4dCB3aGljaCB3ZSBhcmUgZ29pbmcgdG8KKyAgIHVwZGF0ZS4gIEtFWVBBUkFNIGlzIGFuIFMtZXhwcmVzc2lvbiB3aXRoIHRoZSBrZXkgcGFyYW1ldGVycywgdGhpcworICAgaXMgdXN1YWxseSBhIHB1YmxpYyBrZXkgYnV0IG1heSBhbHNvIGJlIGEgc2VjcmV0IGtleS4gIEFuIGV4YW1wbGUKKyAgIG9mIHN1Y2ggYW4gUy1leHByZXNzaW9uIGlzOgorCisgICAgICAocnNhCisgICAgICAgIChuICMwMEIuLi4jKQorICAgICAgICAoZSAjMDEwMDAxIykpCisgICAgICAgIAorICAgUEtDUy0xNSBzYXlzIHRoYXQgZm9yIFJTQSBvbmx5IHRoZSBtb2R1bHVzIHNob3VsZCBiZSBoYXNoZWQgLQorICAgaG93ZXZlciwgaXQgaXMgbm90IGNsZWFyIHdldGhlciB0aGlzIGlzIG1lYW50IHRvIHVzZSB0aGUgcmF3IGJ5dGVzCisgICAoYXNzdW1pbmcgdGhpcyBpcyBhbiB1bnNpZ25lZCBpbnRlZ2VyKSBvciB3aGV0aGVyIHRoZSBERVIgcmVxdWlyZWQKKyAgIDAgc2hvdWxkIGJlIHByZWZpeGVkLiAgV2UgaGFzaCB0aGUgcmF3IGJ5dGVzLiAgKi8KK3N0YXRpYyBncGdfZXJyX2NvZGVfdAorY29tcHV0ZV9rZXlncmlwIChnY3J5X21kX2hkX3QgbWQsIGdjcnlfc2V4cF90IGtleXBhcmFtKQoreworICBnY3J5X3NleHBfdCBsMTsKKyAgY29uc3QgY2hhciAqZGF0YTsKKyAgc2l6ZV90IGRhdGFsZW47CisKKyAgbDEgPSBnY3J5X3NleHBfZmluZF90b2tlbiAoa2V5cGFyYW0sICJuIiwgMSk7CisgIGlmICghbDEpCisgICAgcmV0dXJuIEdQR19FUlJfTk9fT0JKOworCisgIGRhdGEgPSBnY3J5X3NleHBfbnRoX2RhdGEgKGwxLCAxLCAmZGF0YWxlbik7CisgIGlmICghZGF0YSkKKyAgICB7CisgICAgICBnY3J5X3NleHBfcmVsZWFzZSAobDEpOworICAgICAgcmV0dXJuIEdQR19FUlJfTk9fT0JKOworICAgIH0KKworICBnY3J5X21kX3dyaXRlIChtZCwgZGF0YSwgZGF0YWxlbik7CisgIGdjcnlfc2V4cF9yZWxlYXNlIChsMSk7CisKKyAgcmV0dXJuIDA7Cit9CisKKworCisMCisvKiAKKyAgICAgU2VsZi10ZXN0IHNlY3Rpb24uCisgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKgorc2VsZnRlc3Rfc2lnbl8xMDI0IChnY3J5X3NleHBfdCBwa2V5LCBnY3J5X3NleHBfdCBza2V5KQoreworICBzdGF0aWMgY29uc3QgY2hhciBzYW1wbGVfZGF0YVtdID0gCisgICAgIihkYXRhIChmbGFncyBwa2NzMSkiCisgICAgIiAoaGFzaCBzaGExICMxMTIyMzM0NDU1NjY3Nzg4OTkwMGFhYmJjY2RkZWVmZjEwMjAzMDQwIykpIjsKKyAgc3RhdGljIGNvbnN0IGNoYXIgc2FtcGxlX2RhdGFfYmFkW10gPSAKKyAgICAiKGRhdGEgKGZsYWdzIHBrY3MxKSIKKyAgICAiIChoYXNoIHNoYTEgIzExMjIzMzQ0NTU2Njc3ODg5OTAwYWFiYmNjZGRlZWZmODAyMDMwNDAjKSkiOworCisgIGNvbnN0IGNoYXIgKmVycnR4dCA9IE5VTEw7CisgIGdjcnlfZXJyb3JfdCBlcnI7CisgIGdjcnlfc2V4cF90IGRhdGEgPSBOVUxMOworICBnY3J5X3NleHBfdCBkYXRhX2JhZCA9IE5VTEw7CisgIGdjcnlfc2V4cF90IHNpZyA9IE5VTEw7CisKKyAgZXJyID0gZ2NyeV9zZXhwX3NzY2FuICgmZGF0YSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVfZGF0YSwgc3RybGVuIChzYW1wbGVfZGF0YSkpOworICBpZiAoIWVycikKKyAgICBlcnIgPSBnY3J5X3NleHBfc3NjYW4gKCZkYXRhX2JhZCwgTlVMTCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVfZGF0YV9iYWQsIHN0cmxlbiAoc2FtcGxlX2RhdGFfYmFkKSk7CisgIGlmIChlcnIpCisgICAgeworICAgICAgZXJydHh0ID0gImNvbnZlcnRpbmcgZGF0YSBmYWlsZWQiOworICAgICAgZ290byBsZWF2ZTsKKyAgICB9CisKKyAgZXJyID0gZ2NyeV9wa19zaWduICgmc2lnLCBkYXRhLCBza2V5KTsKKyAgaWYgKGVycikKKyAgICB7CisgICAgICBlcnJ0eHQgPSAic2lnbmluZyBmYWlsZWQiOworICAgICAgZ290byBsZWF2ZTsKKyAgICB9CisgIGVyciA9IGdjcnlfcGtfdmVyaWZ5IChzaWcsIGRhdGEsIHBrZXkpOworICBpZiAoZXJyKQorICAgIHsKKyAgICAgIGVycnR4dCA9ICJ2ZXJpZnkgZmFpbGVkIjsKKyAgICAgIGdvdG8gbGVhdmU7CisgICAgfQorICBlcnIgPSBnY3J5X3BrX3ZlcmlmeSAoc2lnLCBkYXRhX2JhZCwgcGtleSk7CisgIGlmIChnY3J5X2Vycl9jb2RlIChlcnIpICE9IEdQR19FUlJfQkFEX1NJR05BVFVSRSkKKyAgICB7CisgICAgICBlcnJ0eHQgPSAiYmFkIHNpZ25hdHVyZSBub3QgZGV0ZWN0ZWQiOworICAgICAgZ290byBsZWF2ZTsKKyAgICB9CisKKworIGxlYXZlOgorICBnY3J5X3NleHBfcmVsZWFzZSAoc2lnKTsKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKGRhdGFfYmFkKTsKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKGRhdGEpOworICByZXR1cm4gZXJydHh0OworfQorCisKKworLyogR2l2ZW4gYW4gUy1leHByZXNzaW9uIEVOQ1JfREFUQSBvZiB0aGUgZm9ybToKKworICAgKGVuYy12YWwKKyAgICAocnNhCisgICAgIChhIGEtdmFsdWUpKSkKKworICAgYXMgcmV0dXJuZWQgYnkgZ2NyeV9wa19kZWNyeXB0LCByZXR1cm4gdGhlIHRoZSBBLVZBTFVFLiAgT24gZXJyb3IsCisgICByZXR1cm4gTlVMTC4gICovCitzdGF0aWMgZ2NyeV9tcGlfdAorZXh0cmFjdF9hX2Zyb21fc2V4cCAoZ2NyeV9zZXhwX3QgZW5jcl9kYXRhKQoreworICBnY3J5X3NleHBfdCBsMSwgbDIsIGwzOworICBnY3J5X21waV90IGFfdmFsdWU7CisKKyAgbDEgPSBnY3J5X3NleHBfZmluZF90b2tlbiAoZW5jcl9kYXRhLCAiZW5jLXZhbCIsIDApOworICBpZiAoIWwxKQorICAgIHJldHVybiBOVUxMOworICBsMiA9IGdjcnlfc2V4cF9maW5kX3Rva2VuIChsMSwgInJzYSIsIDApOworICBnY3J5X3NleHBfcmVsZWFzZSAobDEpOworICBpZiAoIWwyKQorICAgIHJldHVybiBOVUxMOworICBsMyA9IGdjcnlfc2V4cF9maW5kX3Rva2VuIChsMiwgImEiLCAwKTsKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKGwyKTsKKyAgaWYgKCFsMykKKyAgICByZXR1cm4gTlVMTDsKKyAgYV92YWx1ZSA9IGdjcnlfc2V4cF9udGhfbXBpIChsMywgMSwgMCk7CisgIGdjcnlfc2V4cF9yZWxlYXNlIChsMyk7CisKKyAgcmV0dXJuIGFfdmFsdWU7Cit9CisKKworc3RhdGljIGNvbnN0IGNoYXIgKgorc2VsZnRlc3RfZW5jcl8xMDI0IChnY3J5X3NleHBfdCBwa2V5LCBnY3J5X3NleHBfdCBza2V5KQoreworICBjb25zdCBjaGFyICplcnJ0eHQgPSBOVUxMOworICBnY3J5X2Vycm9yX3QgZXJyOworICBjb25zdCB1bnNpZ25lZCBpbnQgbmJpdHMgPSAxMDAwOyAvKiBFbmNyeXB0IDEwMDAgcmFuZG9tIGJpdHMuICAqLworICBnY3J5X21waV90IHBsYWludGV4dCA9IE5VTEw7CisgIGdjcnlfc2V4cF90IHBsYWluID0gTlVMTDsKKyAgZ2NyeV9zZXhwX3QgZW5jciAgPSBOVUxMOworICBnY3J5X21waV90ICBjaXBoZXJ0ZXh0ID0gTlVMTDsKKyAgZ2NyeV9zZXhwX3QgZGVjciAgPSBOVUxMOworICBnY3J5X21waV90ICBkZWNyX3BsYWludGV4dCA9IE5VTEw7CisgIGdjcnlfc2V4cF90IHRtcGxpc3QgPSBOVUxMOworCisgIC8qIENyZWF0ZSBwbGFpbnRleHQuICBUaGUgcGxhaW50ZXh0IGlzIGFjdHVhbGx5IGEgYmlnIGludGVnZXIgbnVtYmVyLiAgKi8KKyAgcGxhaW50ZXh0ID0gZ2NyeV9tcGlfbmV3IChuYml0cyk7CisgIGdjcnlfbXBpX3JhbmRvbWl6ZSAocGxhaW50ZXh0LCBuYml0cywgR0NSWV9XRUFLX1JBTkRPTSk7CisgIAorICAvKiBQdXQgdGhlIHBsYWludGV4dCBpbnRvIGFuIFMtZXhwcmVzc2lvbi4gICovCisgIGVyciA9IGdjcnlfc2V4cF9idWlsZCAoJnBsYWluLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICIoZGF0YSAoZmxhZ3MgcmF3KSAodmFsdWUgJW0pKSIsIHBsYWludGV4dCk7CisgIGlmIChlcnIpCisgICAgeworICAgICAgZXJydHh0ID0gImNvbnZlcnRpbmcgZGF0YSBmYWlsZWQiOworICAgICAgZ290byBsZWF2ZTsKKyAgICB9CisKKyAgLyogRW5jcnlwdC4gICovCisgIGVyciA9IGdjcnlfcGtfZW5jcnlwdCAoJmVuY3IsIHBsYWluLCBwa2V5KTsKKyAgaWYgKGVycikKKyAgICB7CisgICAgICBlcnJ0eHQgPSAiZW5jcnlwdCBmYWlsZWQiOworICAgICAgZ290byBsZWF2ZTsKKyAgICB9CisKKyAgLyogRXh0cmF4dCB0aGUgY2lwaGVydGV4dCBmcm9tIHRoZSByZXR1cm5lZCBTLWV4cHJlc3Npb24uICAqLworICAvKmdjcnlfc2V4cF9kdW1wIChlbmNyKTsqLworICBjaXBoZXJ0ZXh0ID0gZXh0cmFjdF9hX2Zyb21fc2V4cCAoZW5jcik7CisgIGlmICghY2lwaGVydGV4dCkKKyAgICB7CisgICAgICBlcnJ0eHQgPSAiZ2NyeV9wa19kZWNyeXB0IHJldHVybmVkIGdhcmJhZ2UiOworICAgICAgZ290byBsZWF2ZTsKKyAgICB9CisKKyAgLyogQ2hlY2sgdGhhdCB0aGUgY2lwaGVydGV4dCBkb2VzIG5vIG1hdGNoIHRoZSBwbGFpbnRleHQuICAqLworICAvKiBfZ2NyeV9sb2dfbXBpZHVtcCAoInBsYWludGV4dCIsIHBsYWludGV4dCk7ICovCisgIC8qIF9nY3J5X2xvZ19tcGlkdW1wICgiY2lwaGVydHh0IiwgY2lwaGVydGV4dCk7ICovCisgIGlmICghZ2NyeV9tcGlfY21wIChwbGFpbnRleHQsIGNpcGhlcnRleHQpKQorICAgIHsKKyAgICAgIGVycnR4dCA9ICJjaXBoZXJ0ZXh0IG1hdGNoZXMgcGxhaW50ZXh0IjsKKyAgICAgIGdvdG8gbGVhdmU7CisgICAgfQorCisgIC8qIERlY3J5cHQuICAqLworICBlcnIgPSBnY3J5X3BrX2RlY3J5cHQgKCZkZWNyLCBlbmNyLCBza2V5KTsKKyAgaWYgKGVycikKKyAgICB7CisgICAgICBlcnJ0eHQgPSAiZGVjcnlwdCBmYWlsZWQiOworICAgICAgZ290byBsZWF2ZTsKKyAgICB9CisKKyAgLyogRXh0cmFjdCB0aGUgZGVjcnlwdGVkIGRhdGEgZnJvbSB0aGUgUy1leHByZXNzaW9uLiAgTm90ZSB0aGF0IHRoZQorICAgICBvdXRwdXQgb2YgZ2NyeV9wa19kZWNyeXB0IGRlcGVuZHMgb24gd2hldGhlciBhIGZsYWdzIGxpc3RzIG9jY3VycworICAgICBpbiBpdHMgaW5wdXQgZGF0YS4gIEJlY2F1c2Ugd2UgcGFzc2VkIHRoZSBvdXRwdXQgb2YKKyAgICAgZ2NyeV9wa19lbmNyeXB0IGRpcmVjdGx5IHRvIGdjcnlfcGtfZGVjcnlwdCwgc3VjaCBhIGZsYWcgdmFsdWUKKyAgICAgd29uJ3QgYmUgdGhlcmUgYXMgb2YgdG9kYXkuICBUbyBiZSBwcmVwYXJlZCBmb3IgZnV0dXJlIGNoYW5nZXMgd2UKKyAgICAgdGFrZSBjYXJlIG9mIGl0IGFueXdheS4gICovCisgIHRtcGxpc3QgPSBnY3J5X3NleHBfZmluZF90b2tlbiAoZGVjciwgInZhbHVlIiwgMCk7CisgIGlmICh0bXBsaXN0KQorICAgIGRlY3JfcGxhaW50ZXh0ID0gZ2NyeV9zZXhwX250aF9tcGkgKHRtcGxpc3QsIDEsIEdDUllNUElfRk1UX1VTRyk7CisgIGVsc2UKKyAgICBkZWNyX3BsYWludGV4dCA9IGdjcnlfc2V4cF9udGhfbXBpIChkZWNyLCAwLCBHQ1JZTVBJX0ZNVF9VU0cpOworICBpZiAoIWRlY3JfcGxhaW50ZXh0KQorICAgIHsKKyAgICAgIGVycnR4dCA9ICJkZWNyeXB0IHJldHVybmVkIG5vIHBsYWludGV4dCI7CisgICAgICBnb3RvIGxlYXZlOworICAgIH0KKyAgCisgIC8qIENoZWNrIHRoYXQgdGhlIGRlY3J5cHRlZCBwbGFpbnRleHQgbWF0Y2hlcyB0aGUgb3JpZ2luYWwgIHBsYWludGV4dC4gICovCisgIGlmIChnY3J5X21waV9jbXAgKHBsYWludGV4dCwgZGVjcl9wbGFpbnRleHQpKQorICAgIHsKKyAgICAgIGVycnR4dCA9ICJtaXNtYXRjaCI7CisgICAgICBnb3RvIGxlYXZlOworICAgIH0KKworIGxlYXZlOgorICBnY3J5X3NleHBfcmVsZWFzZSAodG1wbGlzdCk7CisgIGdjcnlfbXBpX3JlbGVhc2UgKGRlY3JfcGxhaW50ZXh0KTsKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKGRlY3IpOworICBnY3J5X21waV9yZWxlYXNlIChjaXBoZXJ0ZXh0KTsKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKGVuY3IpOworICBnY3J5X3NleHBfcmVsZWFzZSAocGxhaW4pOworICBnY3J5X21waV9yZWxlYXNlIChwbGFpbnRleHQpOworICByZXR1cm4gZXJydHh0OworfQorCisKK3N0YXRpYyBncGdfZXJyX2NvZGVfdAorc2VsZnRlc3RzX3JzYSAoc2VsZnRlc3RfcmVwb3J0X2Z1bmNfdCByZXBvcnQpCit7CisgIGNvbnN0IGNoYXIgKndoYXQ7CisgIGNvbnN0IGNoYXIgKmVycnR4dDsKKyAgZ2NyeV9lcnJvcl90IGVycjsKKyAgZ2NyeV9zZXhwX3Qgc2tleSA9IE5VTEw7CisgIGdjcnlfc2V4cF90IHBrZXkgPSBOVUxMOworICAKKyAgLyogQ29udmVydCB0aGUgUy1leHByZXNzaW9ucyBpbnRvIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbi4gICovCisgIHdoYXQgPSAiY29udmVydCI7CisgIGVyciA9IGdjcnlfc2V4cF9zc2NhbiAoJnNrZXksIE5VTEwsIAorICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZV9zZWNyZXRfa2V5LCBzdHJsZW4gKHNhbXBsZV9zZWNyZXRfa2V5KSk7CisgIGlmICghZXJyKQorICAgIGVyciA9IGdjcnlfc2V4cF9zc2NhbiAoJnBrZXksIE5VTEwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlX3B1YmxpY19rZXksIHN0cmxlbiAoc2FtcGxlX3B1YmxpY19rZXkpKTsKKyAgaWYgKGVycikKKyAgICB7CisgICAgICBlcnJ0eHQgPSBnY3J5X3N0cmVycm9yIChlcnIpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIHdoYXQgPSAia2V5IGNvbnNpc3RlbmN5IjsKKyAgZXJyID0gZ2NyeV9wa190ZXN0a2V5IChza2V5KTsKKyAgaWYgKGVycikKKyAgICB7CisgICAgICBlcnJ0eHQgPSBnY3J5X3N0cmVycm9yIChlcnIpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIHdoYXQgPSAic2lnbiI7CisgIGVycnR4dCA9IHNlbGZ0ZXN0X3NpZ25fMTAyNCAocGtleSwgc2tleSk7CisgIGlmIChlcnJ0eHQpCisgICAgZ290byBmYWlsZWQ7CisKKyAgd2hhdCA9ICJlbmNyeXB0IjsKKyAgZXJydHh0ID0gc2VsZnRlc3RfZW5jcl8xMDI0IChwa2V5LCBza2V5KTsKKyAgaWYgKGVycnR4dCkKKyAgICBnb3RvIGZhaWxlZDsKKworICBnY3J5X3NleHBfcmVsZWFzZSAocGtleSk7CisgIGdjcnlfc2V4cF9yZWxlYXNlIChza2V5KTsKKyAgcmV0dXJuIDA7IC8qIFN1Y2NlZWRlZC4gKi8KKworIGZhaWxlZDoKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKHBrZXkpOworICBnY3J5X3NleHBfcmVsZWFzZSAoc2tleSk7CisgIGlmIChyZXBvcnQpCisgICAgcmVwb3J0ICgicHVia2V5IiwgR0NSWV9QS19SU0EsIHdoYXQsIGVycnR4dCk7CisgIHJldHVybiBHUEdfRVJSX1NFTEZURVNUX0ZBSUxFRDsKK30KKworCisvKiBSdW4gYSBmdWxsIHNlbGYtdGVzdCBmb3IgQUxHTyBhbmQgcmV0dXJuIDAgb24gc3VjY2Vzcy4gICovCitzdGF0aWMgZ3BnX2Vycl9jb2RlX3QKK3J1bl9zZWxmdGVzdHMgKGludCBhbGdvLCBpbnQgZXh0ZW5kZWQsIHNlbGZ0ZXN0X3JlcG9ydF9mdW5jX3QgcmVwb3J0KQoreworICBncGdfZXJyX2NvZGVfdCBlYzsKKworICAodm9pZClleHRlbmRlZDsKKworICBzd2l0Y2ggKGFsZ28pCisgICAgeworICAgIGNhc2UgR0NSWV9QS19SU0E6CisgICAgICBlYyA9IHNlbGZ0ZXN0c19yc2EgKHJlcG9ydCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZWMgPSBHUEdfRVJSX1BVQktFWV9BTEdPOworICAgICAgYnJlYWs7CisgICAgICAgIAorICAgIH0KKyAgcmV0dXJuIGVjOworfQorCisKKworDAorc3RhdGljIGNvbnN0IGNoYXIgKnJzYV9uYW1lc1tdID0KKyAgeworICAgICJyc2EiLAorICAgICJvcGVucGdwLXJzYSIsCisgICAgIm9pZC4xLjIuODQwLjExMzU0OS4xLjEuMSIsCisgICAgTlVMTCwKKyAgfTsKKworZ2NyeV9wa19zcGVjX3QgX2djcnlfcHVia2V5X3NwZWNfcnNhID0KKyAgeworICAgICJSU0EiLCByc2FfbmFtZXMsCisgICAgIm5lIiwgIm5lZHBxdSIsICJhIiwgInMiLCAibiIsCisgICAgR0NSWV9QS19VU0FHRV9TSUdOIHwgR0NSWV9QS19VU0FHRV9FTkNSLAorICAgIHJzYV9nZW5lcmF0ZSwKKyAgICByc2FfY2hlY2tfc2VjcmV0X2tleSwKKyAgICByc2FfZW5jcnlwdCwKKyAgICByc2FfZGVjcnlwdCwKKyAgICByc2Ffc2lnbiwKKyAgICByc2FfdmVyaWZ5LAorICAgIHJzYV9nZXRfbmJpdHMsCisgIH07Citwa19leHRyYV9zcGVjX3QgX2djcnlfcHVia2V5X2V4dHJhc3BlY19yc2EgPSAKKyAgeworICAgIHJ1bl9zZWxmdGVzdHMsCisgICAgcnNhX2dlbmVyYXRlX2V4dCwKKyAgICBjb21wdXRlX2tleWdyaXAKKyAgfTsKKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L2NpcGhlci9zZWVkLmMgYi9saWJnY3J5cHQtMS40LjYvY2lwaGVyL3NlZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDk4MGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L2NpcGhlci9zZWVkLmMKQEAgLTAsMCArMSw0NzggQEAKKy8qIFNFRUQgZm9yIGxpYmdjcnlwdAorICoJQ29weXJpZ2h0IChDKSAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqCisgKiAtLQorICogVGhpcyBpbXBsZW1lbnRhdGlvbiB3YXMgcHJvdmlkZWQgZm9yIGxpYmdjcnlwdCBpbiBwdWJsaWMgZG9tYWluCisgKiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+LCBKdWx5IDIwMDYuCisgKi8KKwwKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAidHlwZXMuaCIgIC8qIGZvciBieXRlIGFuZCB1MzIgdHlwZWRlZnMgKi8KKyNpbmNsdWRlICJnMTBsaWIuaCIKKyNpbmNsdWRlICJjaXBoZXIuaCIKKworI2RlZmluZSBOVU1LQwkxNgorCisjZGVmaW5lIEdFVFUzMihwdCkgKCgodTMyKShwdClbMF0gPDwgMjQpIF4gKCh1MzIpKHB0KVsxXSA8PCAxNikgXiBcCisJCSAgICAoKHUzMikocHQpWzJdIDw8ICA4KSBeICgodTMyKShwdClbM10pKQorI2RlZmluZSBQVVRVMzIoY3QsIHN0KSB7IChjdClbMF0gPSAoYnl0ZSkoKHN0KSA+PiAyNCk7IFwKKwkJCSAoY3QpWzFdID0gKGJ5dGUpKChzdCkgPj4gMTYpOyBcCisJCQkgKGN0KVsyXSA9IChieXRlKSgoc3QpID4+ICA4KTsgXAorCQkJIChjdClbM10gPSAoYnl0ZSkoc3QpOyB9CisKK3VuaW9uIHdvcmRidWYKK3sKKyAgdTMyIHc7CisgIGJ5dGUgYls0XTsKK307CisKKyNpZmRlZiBXT1JEU19CSUdFTkRJQU4KKyNkZWZpbmUgYjAgIGJbM10KKyNkZWZpbmUgYjEgIGJbMl0KKyNkZWZpbmUgYjIgIGJbMV0KKyNkZWZpbmUgYjMgIGJbMF0KKyNlbHNlCisjZGVmaW5lIGIwICBiWzBdCisjZGVmaW5lIGIxICBiWzFdCisjZGVmaW5lIGIyICBiWzJdCisjZGVmaW5lIGIzICBiWzNdCisjZW5kaWYKKworc3RhdGljIGNvbnN0IGNoYXIgKnNlbGZ0ZXN0KHZvaWQpOworCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgdTMyIGtleXNjaGVkdWxlWzMyXTsKK30gU0VFRF9jb250ZXh0OworCitzdGF0aWMgY29uc3QgdTMyIFNTMFsyNTZdID0geworICAgIDB4Mjk4OWExYTgsIDB4MDU4NTgxODQsIDB4MTZjNmQyZDQsIDB4MTNjM2QzZDAsIDB4MTQ0NDUwNTQsIDB4MWQwZDExMWMsCisgICAgMHgyYzhjYTBhYywgMHgyNTA1MjEyNCwgMHgxZDRkNTE1YywgMHgwMzQzNDM0MCwgMHgxODA4MTAxOCwgMHgxZTBlMTIxYywKKyAgICAweDExNDE1MTUwLCAweDNjY2NmMGZjLCAweDBhY2FjMmM4LCAweDIzNDM2MzYwLCAweDI4MDgyMDI4LCAweDA0NDQ0MDQ0LAorICAgIDB4MjAwMDIwMjAsIDB4MWQ4ZDkxOWMsIDB4MjBjMGUwZTAsIDB4MjJjMmUyZTAsIDB4MDhjOGMwYzgsIDB4MTcwNzEzMTQsCisgICAgMHgyNTg1YTFhNCwgMHgwZjhmODM4YywgMHgwMzAzMDMwMCwgMHgzYjRiNzM3OCwgMHgzYjhiYjNiOCwgMHgxMzAzMTMxMCwKKyAgICAweDEyYzJkMmQwLCAweDJlY2VlMmVjLCAweDMwNDA3MDcwLCAweDBjOGM4MDhjLCAweDNmMGYzMzNjLCAweDI4ODhhMGE4LAorICAgIDB4MzIwMjMyMzAsIDB4MWRjZGQxZGMsIDB4MzZjNmYyZjQsIDB4MzQ0NDcwNzQsIDB4MmNjY2UwZWMsIDB4MTU4NTkxOTQsCisgICAgMHgwYjBiMDMwOCwgMHgxNzQ3NTM1NCwgMHgxYzRjNTA1YywgMHgxYjRiNTM1OCwgMHgzZDhkYjFiYywgMHgwMTAxMDEwMCwKKyAgICAweDI0MDQyMDI0LCAweDFjMGMxMDFjLCAweDMzNDM3MzcwLCAweDE4ODg5MDk4LCAweDEwMDAxMDEwLCAweDBjY2NjMGNjLAorICAgIDB4MzJjMmYyZjAsIDB4MTljOWQxZDgsIDB4MmMwYzIwMmMsIDB4MjdjN2UzZTQsIDB4MzI0MjcyNzAsIDB4MDM4MzgzODAsCisgICAgMHgxYjhiOTM5OCwgMHgxMWMxZDFkMCwgMHgwNjg2ODI4NCwgMHgwOWM5YzFjOCwgMHgyMDQwNjA2MCwgMHgxMDQwNTA1MCwKKyAgICAweDIzODNhM2EwLCAweDJiY2JlM2U4LCAweDBkMGQwMTBjLCAweDM2ODZiMmI0LCAweDFlOGU5MjljLCAweDBmNGY0MzRjLAorICAgIDB4Mzc4N2IzYjQsIDB4MWE0YTUyNTgsIDB4MDZjNmMyYzQsIDB4Mzg0ODcwNzgsIDB4MjY4NmEyYTQsIDB4MTIwMjEyMTAsCisgICAgMHgyZjhmYTNhYywgMHgxNWM1ZDFkNCwgMHgyMTQxNjE2MCwgMHgwM2MzYzNjMCwgMHgzNDg0YjBiNCwgMHgwMTQxNDE0MCwKKyAgICAweDEyNDI1MjUwLCAweDNkNGQ3MTdjLCAweDBkOGQ4MThjLCAweDA4MDgwMDA4LCAweDFmMGYxMzFjLCAweDE5ODk5MTk4LAorICAgIDB4MDAwMDAwMDAsIDB4MTkwOTExMTgsIDB4MDQwNDAwMDQsIDB4MTM0MzUzNTAsIDB4MzdjN2YzZjQsIDB4MjFjMWUxZTAsCisgICAgMHgzZGNkZjFmYywgMHgzNjQ2NzI3NCwgMHgyZjBmMjMyYywgMHgyNzA3MjMyNCwgMHgzMDgwYjBiMCwgMHgwYjhiODM4OCwKKyAgICAweDBlMGUwMjBjLCAweDJiOGJhM2E4LCAweDIyODJhMmEwLCAweDJlNGU2MjZjLCAweDEzODM5MzkwLCAweDBkNGQ0MTRjLAorICAgIDB4Mjk0OTYxNjgsIDB4M2M0YzcwN2MsIDB4MDkwOTAxMDgsIDB4MGEwYTAyMDgsIDB4M2Y4ZmIzYmMsIDB4MmZjZmUzZWMsCisgICAgMHgzM2MzZjNmMCwgMHgwNWM1YzFjNCwgMHgwNzg3ODM4NCwgMHgxNDA0MTAxNCwgMHgzZWNlZjJmYywgMHgyNDQ0NjA2NCwKKyAgICAweDFlY2VkMmRjLCAweDJlMGUyMjJjLCAweDBiNGI0MzQ4LCAweDFhMGExMjE4LCAweDA2MDYwMjA0LCAweDIxMDEyMTIwLAorICAgIDB4MmI0YjYzNjgsIDB4MjY0NjYyNjQsIDB4MDIwMjAyMDAsIDB4MzVjNWYxZjQsIDB4MTI4MjkyOTAsIDB4MGE4YTgyODgsCisgICAgMHgwYzBjMDAwYywgMHgzMzgzYjNiMCwgMHgzZTRlNzI3YywgMHgxMGMwZDBkMCwgMHgzYTRhNzI3OCwgMHgwNzQ3NDM0NCwKKyAgICAweDE2ODY5Mjk0LCAweDI1YzVlMWU0LCAweDI2MDYyMjI0LCAweDAwODA4MDgwLCAweDJkOGRhMWFjLCAweDFmY2ZkM2RjLAorICAgIDB4MjE4MWExYTAsIDB4MzAwMDMwMzAsIDB4MzcwNzMzMzQsIDB4MmU4ZWEyYWMsIDB4MzYwNjMyMzQsIDB4MTUwNTExMTQsCisgICAgMHgyMjAyMjIyMCwgMHgzODA4MzAzOCwgMHgzNGM0ZjBmNCwgMHgyNzg3YTNhNCwgMHgwNTQ1NDE0NCwgMHgwYzRjNDA0YywKKyAgICAweDAxODE4MTgwLCAweDI5YzllMWU4LCAweDA0ODQ4MDg0LCAweDE3ODc5Mzk0LCAweDM1MDUzMTM0LCAweDBiY2JjM2M4LAorICAgIDB4MGVjZWMyY2MsIDB4M2MwYzMwM2MsIDB4MzE0MTcxNzAsIDB4MTEwMTExMTAsIDB4MDdjN2MzYzQsIDB4MDk4OTgxODgsCisgICAgMHgzNTQ1NzE3NCwgMHgzYmNiZjNmOCwgMHgxYWNhZDJkOCwgMHgzOGM4ZjBmOCwgMHgxNDg0OTA5NCwgMHgxOTQ5NTE1OCwKKyAgICAweDAyODI4MjgwLCAweDA0YzRjMGM0LCAweDNmY2ZmM2ZjLCAweDA5NDk0MTQ4LCAweDM5MDkzMTM4LCAweDI3NDc2MzY0LAorICAgIDB4MDBjMGMwYzAsIDB4MGZjZmMzY2MsIDB4MTdjN2QzZDQsIDB4Mzg4OGIwYjgsIDB4MGYwZjAzMGMsIDB4MGU4ZTgyOGMsCisgICAgMHgwMjQyNDI0MCwgMHgyMzAzMjMyMCwgMHgxMTgxOTE5MCwgMHgyYzRjNjA2YywgMHgxYmNiZDNkOCwgMHgyNDg0YTBhNCwKKyAgICAweDM0MDQzMDM0LCAweDMxYzFmMWYwLCAweDA4NDg0MDQ4LCAweDAyYzJjMmMwLCAweDJmNGY2MzZjLCAweDNkMGQzMTNjLAorICAgIDB4MmQwZDIxMmMsIDB4MDA0MDQwNDAsIDB4M2U4ZWIyYmMsIDB4M2UwZTMyM2MsIDB4M2M4Y2IwYmMsIDB4MDFjMWMxYzAsCisgICAgMHgyYThhYTJhOCwgMHgzYThhYjJiOCwgMHgwZTRlNDI0YywgMHgxNTQ1NTE1NCwgMHgzYjBiMzMzOCwgMHgxY2NjZDBkYywKKyAgICAweDI4NDg2MDY4LCAweDNmNGY3MzdjLCAweDFjOGM5MDljLCAweDE4YzhkMGQ4LCAweDBhNGE0MjQ4LCAweDE2NDY1MjU0LAorICAgIDB4Mzc0NzczNzQsIDB4MjA4MGEwYTAsIDB4MmRjZGUxZWMsIDB4MDY0NjQyNDQsIDB4MzU4NWIxYjQsIDB4MmIwYjIzMjgsCisgICAgMHgyNTQ1NjE2NCwgMHgzYWNhZjJmOCwgMHgyM2MzZTNlMCwgMHgzOTg5YjFiOCwgMHgzMTgxYjFiMCwgMHgxZjhmOTM5YywKKyAgICAweDFlNGU1MjVjLCAweDM5YzlmMWY4LCAweDI2YzZlMmU0LCAweDMyODJiMmIwLCAweDMxMDEzMTMwLCAweDJhY2FlMmU4LAorICAgIDB4MmQ0ZDYxNmMsIDB4MWY0ZjUzNWMsIDB4MjRjNGUwZTQsIDB4MzBjMGYwZjAsIDB4MGRjZGMxY2MsIDB4MDg4ODgwODgsCisgICAgMHgxNjA2MTIxNCwgMHgzYTBhMzIzOCwgMHgxODQ4NTA1OCwgMHgxNGM0ZDBkNCwgMHgyMjQyNjI2MCwgMHgyOTA5MjEyOCwKKyAgICAweDA3MDcwMzA0LCAweDMzMDMzMzMwLCAweDI4YzhlMGU4LCAweDFiMGIxMzE4LCAweDA1MDUwMTA0LCAweDM5NDk3MTc4LAorICAgIDB4MTA4MDkwOTAsIDB4MmE0YTYyNjgsIDB4MmEwYTIyMjgsIDB4MWE4YTkyOTgsCit9OworCitzdGF0aWMgY29uc3QgdTMyIFNTMVsyNTZdID0geworICAgIDB4MzgzODA4MzAsIDB4ZTgyOGM4ZTAsIDB4MmMyZDBkMjEsIDB4YTQyNjg2YTIsIDB4Y2MwZmNmYzMsIDB4ZGMxZWNlZDIsCisgICAgMHhiMDMzODNiMywgMHhiODM4ODhiMCwgMHhhYzJmOGZhMywgMHg2MDIwNDA2MCwgMHg1NDE1NDU1MSwgMHhjNDA3YzdjMywKKyAgICAweDQ0MDQ0NDQwLCAweDZjMmY0ZjYzLCAweDY4MmI0YjYzLCAweDU4MWI0YjUzLCAweGMwMDNjM2MzLCAweDYwMjI0MjYyLAorICAgIDB4MzAzMzAzMzMsIDB4YjQzNTg1YjEsIDB4MjgyOTA5MjEsIDB4YTAyMDgwYTAsIDB4ZTAyMmMyZTIsIDB4YTQyNzg3YTMsCisgICAgMHhkMDEzYzNkMywgMHg5MDExODE5MSwgMHgxMDExMDExMSwgMHgwNDA2MDYwMiwgMHgxYzFjMGMxMCwgMHhiYzNjOGNiMCwKKyAgICAweDM0MzYwNjMyLCAweDQ4MGI0YjQzLCAweGVjMmZjZmUzLCAweDg4MDg4ODgwLCAweDZjMmM0YzYwLCAweGE4Mjg4OGEwLAorICAgIDB4MTQxNzA3MTMsIDB4YzQwNGM0YzAsIDB4MTQxNjA2MTIsIDB4ZjQzNGM0ZjAsIDB4YzAwMmMyYzIsIDB4NDQwNTQ1NDEsCisgICAgMHhlMDIxYzFlMSwgMHhkNDE2YzZkMiwgMHgzYzNmMGYzMywgMHgzYzNkMGQzMSwgMHg4YzBlOGU4MiwgMHg5ODE4ODg5MCwKKyAgICAweDI4MjgwODIwLCAweDRjMGU0ZTQyLCAweGY0MzZjNmYyLCAweDNjM2UwZTMyLCAweGE0MjU4NWExLCAweGY4MzljOWYxLAorICAgIDB4MGMwZDBkMDEsIDB4ZGMxZmNmZDMsIDB4ZDgxOGM4ZDAsIDB4MjgyYjBiMjMsIDB4NjQyNjQ2NjIsIDB4NzgzYTRhNzIsCisgICAgMHgyNDI3MDcyMywgMHgyYzJmMGYyMywgMHhmMDMxYzFmMSwgMHg3MDMyNDI3MiwgMHg0MDAyNDI0MiwgMHhkNDE0YzRkMCwKKyAgICAweDQwMDE0MTQxLCAweGMwMDBjMGMwLCAweDcwMzM0MzczLCAweDY0Mjc0NzYzLCAweGFjMmM4Y2EwLCAweDg4MGI4YjgzLAorICAgIDB4ZjQzN2M3ZjMsIDB4YWMyZDhkYTEsIDB4ODAwMDgwODAsIDB4MWMxZjBmMTMsIDB4YzgwYWNhYzIsIDB4MmMyYzBjMjAsCisgICAgMHhhODJhOGFhMiwgMHgzNDM0MDQzMCwgMHhkMDEyYzJkMiwgMHgwODBiMGIwMywgMHhlYzJlY2VlMiwgMHhlODI5YzllMSwKKyAgICAweDVjMWQ0ZDUxLCAweDk0MTQ4NDkwLCAweDE4MTgwODEwLCAweGY4MzhjOGYwLCAweDU0MTc0NzUzLCAweGFjMmU4ZWEyLAorICAgIDB4MDgwODA4MDAsIDB4YzQwNWM1YzEsIDB4MTAxMzAzMTMsIDB4Y2MwZGNkYzEsIDB4ODQwNjg2ODIsIDB4YjgzOTg5YjEsCisgICAgMHhmYzNmY2ZmMywgMHg3YzNkNGQ3MSwgMHhjMDAxYzFjMSwgMHgzMDMxMDEzMSwgMHhmNDM1YzVmMSwgMHg4ODBhOGE4MiwKKyAgICAweDY4MmE0YTYyLCAweGIwMzE4MWIxLCAweGQwMTFjMWQxLCAweDIwMjAwMDIwLCAweGQ0MTdjN2QzLCAweDAwMDIwMjAyLAorICAgIDB4MjAyMjAyMjIsIDB4MDQwNDA0MDAsIDB4NjgyODQ4NjAsIDB4NzAzMTQxNzEsIDB4MDQwNzA3MDMsIDB4ZDgxYmNiZDMsCisgICAgMHg5YzFkOGQ5MSwgMHg5ODE5ODk5MSwgMHg2MDIxNDE2MSwgMHhiYzNlOGViMiwgMHhlNDI2YzZlMiwgMHg1ODE5NDk1MSwKKyAgICAweGRjMWRjZGQxLCAweDUwMTE0MTUxLCAweDkwMTA4MDkwLCAweGRjMWNjY2QwLCAweDk4MWE4YTkyLCAweGEwMjM4M2EzLAorICAgIDB4YTgyYjhiYTMsIDB4ZDAxMGMwZDAsIDB4ODAwMTgxODEsIDB4MGMwZjBmMDMsIDB4NDQwNzQ3NDMsIDB4MTgxYTBhMTIsCisgICAgMHhlMDIzYzNlMywgMHhlYzJjY2NlMCwgMHg4YzBkOGQ4MSwgMHhiYzNmOGZiMywgMHg5NDE2ODY5MiwgMHg3ODNiNGI3MywKKyAgICAweDVjMWM0YzUwLCAweGEwMjI4MmEyLCAweGEwMjE4MWExLCAweDYwMjM0MzYzLCAweDIwMjMwMzIzLCAweDRjMGQ0ZDQxLAorICAgIDB4YzgwOGM4YzAsIDB4OWMxZThlOTIsIDB4OWMxYzhjOTAsIDB4MzgzYTBhMzIsIDB4MGMwYzBjMDAsIDB4MmMyZTBlMjIsCisgICAgMHhiODNhOGFiMiwgMHg2YzJlNGU2MiwgMHg5YzFmOGY5MywgMHg1ODFhNGE1MiwgMHhmMDMyYzJmMiwgMHg5MDEyODI5MiwKKyAgICAweGYwMzNjM2YzLCAweDQ4MDk0OTQxLCAweDc4Mzg0ODcwLCAweGNjMGNjY2MwLCAweDE0MTUwNTExLCAweGY4M2JjYmYzLAorICAgIDB4NzAzMDQwNzAsIDB4NzQzNTQ1NzEsIDB4N2MzZjRmNzMsIDB4MzQzNTA1MzEsIDB4MTAxMDAwMTAsIDB4MDAwMzAzMDMsCisgICAgMHg2NDI0NDQ2MCwgMHg2YzJkNGQ2MSwgMHhjNDA2YzZjMiwgMHg3NDM0NDQ3MCwgMHhkNDE1YzVkMSwgMHhiNDM0ODRiMCwKKyAgICAweGU4MmFjYWUyLCAweDA4MDkwOTAxLCAweDc0MzY0NjcyLCAweDE4MTkwOTExLCAweGZjM2VjZWYyLCAweDQwMDA0MDQwLAorICAgIDB4MTAxMjAyMTIsIDB4ZTAyMGMwZTAsIDB4YmMzZDhkYjEsIDB4MDQwNTA1MDEsIDB4ZjgzYWNhZjIsIDB4MDAwMTAxMDEsCisgICAgMHhmMDMwYzBmMCwgMHgyODJhMGEyMiwgMHg1YzFlNGU1MiwgMHhhODI5ODlhMSwgMHg1NDE2NDY1MiwgMHg0MDAzNDM0MywKKyAgICAweDg0MDU4NTgxLCAweDE0MTQwNDEwLCAweDg4MDk4OTgxLCAweDk4MWI4YjkzLCAweGIwMzA4MGIwLCAweGU0MjVjNWUxLAorICAgIDB4NDgwODQ4NDAsIDB4NzgzOTQ5NzEsIDB4OTQxNzg3OTMsIDB4ZmMzY2NjZjAsIDB4MWMxZTBlMTIsIDB4ODAwMjgyODIsCisgICAgMHgyMDIxMDEyMSwgMHg4YzBjOGM4MCwgMHgxODFiMGIxMywgMHg1YzFmNGY1MywgMHg3NDM3NDc3MywgMHg1NDE0NDQ1MCwKKyAgICAweGIwMzI4MmIyLCAweDFjMWQwZDExLCAweDI0MjUwNTIxLCAweDRjMGY0ZjQzLCAweDAwMDAwMDAwLCAweDQ0MDY0NjQyLAorICAgIDB4ZWMyZGNkZTEsIDB4NTgxODQ4NTAsIDB4NTAxMjQyNTIsIDB4ZTgyYmNiZTMsIDB4N2MzZTRlNzIsIDB4ZDgxYWNhZDIsCisgICAgMHhjODA5YzljMSwgMHhmYzNkY2RmMSwgMHgzMDMwMDAzMCwgMHg5NDE1ODU5MSwgMHg2NDI1NDU2MSwgMHgzYzNjMGMzMCwKKyAgICAweGI0MzY4NmIyLCAweGU0MjRjNGUwLCAweGI4M2I4YmIzLCAweDdjM2M0YzcwLCAweDBjMGUwZTAyLCAweDUwMTA0MDUwLAorICAgIDB4MzgzOTA5MzEsIDB4MjQyNjA2MjIsIDB4MzAzMjAyMzIsIDB4ODQwNDg0ODAsIDB4NjgyOTQ5NjEsIDB4OTAxMzgzOTMsCisgICAgMHgzNDM3MDczMywgMHhlNDI3YzdlMywgMHgyNDI0MDQyMCwgMHhhNDI0ODRhMCwgMHhjODBiY2JjMywgMHg1MDEzNDM1MywKKyAgICAweDA4MGEwYTAyLCAweDg0MDc4NzgzLCAweGQ4MTljOWQxLCAweDRjMGM0YzQwLCAweDgwMDM4MzgzLCAweDhjMGY4ZjgzLAorICAgIDB4Y2MwZWNlYzIsIDB4MzgzYjBiMzMsIDB4NDgwYTRhNDIsIDB4YjQzNzg3YjMsCit9OworCitzdGF0aWMgY29uc3QgdTMyIFNTMlsyNTZdID0geworICAgIDB4YTFhODI5ODksIDB4ODE4NDA1ODUsIDB4ZDJkNDE2YzYsIDB4ZDNkMDEzYzMsIDB4NTA1NDE0NDQsIDB4MTExYzFkMGQsCisgICAgMHhhMGFjMmM4YywgMHgyMTI0MjUwNSwgMHg1MTVjMWQ0ZCwgMHg0MzQwMDM0MywgMHgxMDE4MTgwOCwgMHgxMjFjMWUwZSwKKyAgICAweDUxNTAxMTQxLCAweGYwZmMzY2NjLCAweGMyYzgwYWNhLCAweDYzNjAyMzQzLCAweDIwMjgyODA4LCAweDQwNDQwNDQ0LAorICAgIDB4MjAyMDIwMDAsIDB4OTE5YzFkOGQsIDB4ZTBlMDIwYzAsIDB4ZTJlMDIyYzIsIDB4YzBjODA4YzgsIDB4MTMxNDE3MDcsCisgICAgMHhhMWE0MjU4NSwgMHg4MzhjMGY4ZiwgMHgwMzAwMDMwMywgMHg3Mzc4M2I0YiwgMHhiM2I4M2I4YiwgMHgxMzEwMTMwMywKKyAgICAweGQyZDAxMmMyLCAweGUyZWMyZWNlLCAweDcwNzAzMDQwLCAweDgwOGMwYzhjLCAweDMzM2MzZjBmLCAweGEwYTgyODg4LAorICAgIDB4MzIzMDMyMDIsIDB4ZDFkYzFkY2QsIDB4ZjJmNDM2YzYsIDB4NzA3NDM0NDQsIDB4ZTBlYzJjY2MsIDB4OTE5NDE1ODUsCisgICAgMHgwMzA4MGIwYiwgMHg1MzU0MTc0NywgMHg1MDVjMWM0YywgMHg1MzU4MWI0YiwgMHhiMWJjM2Q4ZCwgMHgwMTAwMDEwMSwKKyAgICAweDIwMjQyNDA0LCAweDEwMWMxYzBjLCAweDczNzAzMzQzLCAweDkwOTgxODg4LCAweDEwMTAxMDAwLCAweGMwY2MwY2NjLAorICAgIDB4ZjJmMDMyYzIsIDB4ZDFkODE5YzksIDB4MjAyYzJjMGMsIDB4ZTNlNDI3YzcsIDB4NzI3MDMyNDIsIDB4ODM4MDAzODMsCisgICAgMHg5Mzk4MWI4YiwgMHhkMWQwMTFjMSwgMHg4Mjg0MDY4NiwgMHhjMWM4MDljOSwgMHg2MDYwMjA0MCwgMHg1MDUwMTA0MCwKKyAgICAweGEzYTAyMzgzLCAweGUzZTgyYmNiLCAweDAxMGMwZDBkLCAweGIyYjQzNjg2LCAweDkyOWMxZThlLCAweDQzNGMwZjRmLAorICAgIDB4YjNiNDM3ODcsIDB4NTI1ODFhNGEsIDB4YzJjNDA2YzYsIDB4NzA3ODM4NDgsIDB4YTJhNDI2ODYsIDB4MTIxMDEyMDIsCisgICAgMHhhM2FjMmY4ZiwgMHhkMWQ0MTVjNSwgMHg2MTYwMjE0MSwgMHhjM2MwMDNjMywgMHhiMGI0MzQ4NCwgMHg0MTQwMDE0MSwKKyAgICAweDUyNTAxMjQyLCAweDcxN2MzZDRkLCAweDgxOGMwZDhkLCAweDAwMDgwODA4LCAweDEzMWMxZjBmLCAweDkxOTgxOTg5LAorICAgIDB4MDAwMDAwMDAsIDB4MTExODE5MDksIDB4MDAwNDA0MDQsIDB4NTM1MDEzNDMsIDB4ZjNmNDM3YzcsIDB4ZTFlMDIxYzEsCisgICAgMHhmMWZjM2RjZCwgMHg3Mjc0MzY0NiwgMHgyMzJjMmYwZiwgMHgyMzI0MjcwNywgMHhiMGIwMzA4MCwgMHg4Mzg4MGI4YiwKKyAgICAweDAyMGMwZTBlLCAweGEzYTgyYjhiLCAweGEyYTAyMjgyLCAweDYyNmMyZTRlLCAweDkzOTAxMzgzLCAweDQxNGMwZDRkLAorICAgIDB4NjE2ODI5NDksIDB4NzA3YzNjNGMsIDB4MDEwODA5MDksIDB4MDIwODBhMGEsIDB4YjNiYzNmOGYsIDB4ZTNlYzJmY2YsCisgICAgMHhmM2YwMzNjMywgMHhjMWM0MDVjNSwgMHg4Mzg0MDc4NywgMHgxMDE0MTQwNCwgMHhmMmZjM2VjZSwgMHg2MDY0MjQ0NCwKKyAgICAweGQyZGMxZWNlLCAweDIyMmMyZTBlLCAweDQzNDgwYjRiLCAweDEyMTgxYTBhLCAweDAyMDQwNjA2LCAweDIxMjAyMTAxLAorICAgIDB4NjM2ODJiNGIsIDB4NjI2NDI2NDYsIDB4MDIwMDAyMDIsIDB4ZjFmNDM1YzUsIDB4OTI5MDEyODIsIDB4ODI4ODBhOGEsCisgICAgMHgwMDBjMGMwYywgMHhiM2IwMzM4MywgMHg3MjdjM2U0ZSwgMHhkMGQwMTBjMCwgMHg3Mjc4M2E0YSwgMHg0MzQ0MDc0NywKKyAgICAweDkyOTQxNjg2LCAweGUxZTQyNWM1LCAweDIyMjQyNjA2LCAweDgwODAwMDgwLCAweGExYWMyZDhkLCAweGQzZGMxZmNmLAorICAgIDB4YTFhMDIxODEsIDB4MzAzMDMwMDAsIDB4MzMzNDM3MDcsIDB4YTJhYzJlOGUsIDB4MzIzNDM2MDYsIDB4MTExNDE1MDUsCisgICAgMHgyMjIwMjIwMiwgMHgzMDM4MzgwOCwgMHhmMGY0MzRjNCwgMHhhM2E0Mjc4NywgMHg0MTQ0MDU0NSwgMHg0MDRjMGM0YywKKyAgICAweDgxODAwMTgxLCAweGUxZTgyOWM5LCAweDgwODQwNDg0LCAweDkzOTQxNzg3LCAweDMxMzQzNTA1LCAweGMzYzgwYmNiLAorICAgIDB4YzJjYzBlY2UsIDB4MzAzYzNjMGMsIDB4NzE3MDMxNDEsIDB4MTExMDExMDEsIDB4YzNjNDA3YzcsIDB4ODE4ODA5ODksCisgICAgMHg3MTc0MzU0NSwgMHhmM2Y4M2JjYiwgMHhkMmQ4MWFjYSwgMHhmMGY4MzhjOCwgMHg5MDk0MTQ4NCwgMHg1MTU4MTk0OSwKKyAgICAweDgyODAwMjgyLCAweGMwYzQwNGM0LCAweGYzZmMzZmNmLCAweDQxNDgwOTQ5LCAweDMxMzgzOTA5LCAweDYzNjQyNzQ3LAorICAgIDB4YzBjMDAwYzAsIDB4YzNjYzBmY2YsIDB4ZDNkNDE3YzcsIDB4YjBiODM4ODgsIDB4MDMwYzBmMGYsIDB4ODI4YzBlOGUsCisgICAgMHg0MjQwMDI0MiwgMHgyMzIwMjMwMywgMHg5MTkwMTE4MSwgMHg2MDZjMmM0YywgMHhkM2Q4MWJjYiwgMHhhMGE0MjQ4NCwKKyAgICAweDMwMzQzNDA0LCAweGYxZjAzMWMxLCAweDQwNDgwODQ4LCAweGMyYzAwMmMyLCAweDYzNmMyZjRmLCAweDMxM2MzZDBkLAorICAgIDB4MjEyYzJkMGQsIDB4NDA0MDAwNDAsIDB4YjJiYzNlOGUsIDB4MzIzYzNlMGUsIDB4YjBiYzNjOGMsIDB4YzFjMDAxYzEsCisgICAgMHhhMmE4MmE4YSwgMHhiMmI4M2E4YSwgMHg0MjRjMGU0ZSwgMHg1MTU0MTU0NSwgMHgzMzM4M2IwYiwgMHhkMGRjMWNjYywKKyAgICAweDYwNjgyODQ4LCAweDczN2MzZjRmLCAweDkwOWMxYzhjLCAweGQwZDgxOGM4LCAweDQyNDgwYTRhLCAweDUyNTQxNjQ2LAorICAgIDB4NzM3NDM3NDcsIDB4YTBhMDIwODAsIDB4ZTFlYzJkY2QsIDB4NDI0NDA2NDYsIDB4YjFiNDM1ODUsIDB4MjMyODJiMGIsCisgICAgMHg2MTY0MjU0NSwgMHhmMmY4M2FjYSwgMHhlM2UwMjNjMywgMHhiMWI4Mzk4OSwgMHhiMWIwMzE4MSwgMHg5MzljMWY4ZiwKKyAgICAweDUyNWMxZTRlLCAweGYxZjgzOWM5LCAweGUyZTQyNmM2LCAweGIyYjAzMjgyLCAweDMxMzAzMTAxLCAweGUyZTgyYWNhLAorICAgIDB4NjE2YzJkNGQsIDB4NTM1YzFmNGYsIDB4ZTBlNDI0YzQsIDB4ZjBmMDMwYzAsIDB4YzFjYzBkY2QsIDB4ODA4ODA4ODgsCisgICAgMHgxMjE0MTYwNiwgMHgzMjM4M2EwYSwgMHg1MDU4MTg0OCwgMHhkMGQ0MTRjNCwgMHg2MjYwMjI0MiwgMHgyMTI4MjkwOSwKKyAgICAweDAzMDQwNzA3LCAweDMzMzAzMzAzLCAweGUwZTgyOGM4LCAweDEzMTgxYjBiLCAweDAxMDQwNTA1LCAweDcxNzgzOTQ5LAorICAgIDB4OTA5MDEwODAsIDB4NjI2ODJhNGEsIDB4MjIyODJhMGEsIDB4OTI5ODFhOGEsCit9OworCitzdGF0aWMgY29uc3QgdTMyIFNTM1syNTZdID0geworICAgIDB4MDgzMDM4MzgsIDB4YzhlMGU4MjgsIDB4MGQyMTJjMmQsIDB4ODZhMmE0MjYsIDB4Y2ZjM2NjMGYsIDB4Y2VkMmRjMWUsCisgICAgMHg4M2IzYjAzMywgMHg4OGIwYjgzOCwgMHg4ZmEzYWMyZiwgMHg0MDYwNjAyMCwgMHg0NTUxNTQxNSwgMHhjN2MzYzQwNywKKyAgICAweDQ0NDA0NDA0LCAweDRmNjM2YzJmLCAweDRiNjM2ODJiLCAweDRiNTM1ODFiLCAweGMzYzNjMDAzLCAweDQyNjI2MDIyLAorICAgIDB4MDMzMzMwMzMsIDB4ODViMWI0MzUsIDB4MDkyMTI4MjksIDB4ODBhMGEwMjAsIDB4YzJlMmUwMjIsIDB4ODdhM2E0MjcsCisgICAgMHhjM2QzZDAxMywgMHg4MTkxOTAxMSwgMHgwMTExMTAxMSwgMHgwNjAyMDQwNiwgMHgwYzEwMWMxYywgMHg4Y2IwYmMzYywKKyAgICAweDA2MzIzNDM2LCAweDRiNDM0ODBiLCAweGNmZTNlYzJmLCAweDg4ODA4ODA4LCAweDRjNjA2YzJjLCAweDg4YTBhODI4LAorICAgIDB4MDcxMzE0MTcsIDB4YzRjMGM0MDQsIDB4MDYxMjE0MTYsIDB4YzRmMGY0MzQsIDB4YzJjMmMwMDIsIDB4NDU0MTQ0MDUsCisgICAgMHhjMWUxZTAyMSwgMHhjNmQyZDQxNiwgMHgwZjMzM2MzZiwgMHgwZDMxM2MzZCwgMHg4ZTgyOGMwZSwgMHg4ODkwOTgxOCwKKyAgICAweDA4MjAyODI4LCAweDRlNDI0YzBlLCAweGM2ZjJmNDM2LCAweDBlMzIzYzNlLCAweDg1YTFhNDI1LCAweGM5ZjFmODM5LAorICAgIDB4MGQwMTBjMGQsIDB4Y2ZkM2RjMWYsIDB4YzhkMGQ4MTgsIDB4MGIyMzI4MmIsIDB4NDY2MjY0MjYsIDB4NGE3Mjc4M2EsCisgICAgMHgwNzIzMjQyNywgMHgwZjIzMmMyZiwgMHhjMWYxZjAzMSwgMHg0MjcyNzAzMiwgMHg0MjQyNDAwMiwgMHhjNGQwZDQxNCwKKyAgICAweDQxNDE0MDAxLCAweGMwYzBjMDAwLCAweDQzNzM3MDMzLCAweDQ3NjM2NDI3LCAweDhjYTBhYzJjLCAweDhiODM4ODBiLAorICAgIDB4YzdmM2Y0MzcsIDB4OGRhMWFjMmQsIDB4ODA4MDgwMDAsIDB4MGYxMzFjMWYsIDB4Y2FjMmM4MGEsIDB4MGMyMDJjMmMsCisgICAgMHg4YWEyYTgyYSwgMHgwNDMwMzQzNCwgMHhjMmQyZDAxMiwgMHgwYjAzMDgwYiwgMHhjZWUyZWMyZSwgMHhjOWUxZTgyOSwKKyAgICAweDRkNTE1YzFkLCAweDg0OTA5NDE0LCAweDA4MTAxODE4LCAweGM4ZjBmODM4LCAweDQ3NTM1NDE3LCAweDhlYTJhYzJlLAorICAgIDB4MDgwMDA4MDgsIDB4YzVjMWM0MDUsIDB4MDMxMzEwMTMsIDB4Y2RjMWNjMGQsIDB4ODY4Mjg0MDYsIDB4ODliMWI4MzksCisgICAgMHhjZmYzZmMzZiwgMHg0ZDcxN2MzZCwgMHhjMWMxYzAwMSwgMHgwMTMxMzAzMSwgMHhjNWYxZjQzNSwgMHg4YTgyODgwYSwKKyAgICAweDRhNjI2ODJhLCAweDgxYjFiMDMxLCAweGMxZDFkMDExLCAweDAwMjAyMDIwLCAweGM3ZDNkNDE3LCAweDAyMDIwMDAyLAorICAgIDB4MDIyMjIwMjIsIDB4MDQwMDA0MDQsIDB4NDg2MDY4MjgsIDB4NDE3MTcwMzEsIDB4MDcwMzA0MDcsIDB4Y2JkM2Q4MWIsCisgICAgMHg4ZDkxOWMxZCwgMHg4OTkxOTgxOSwgMHg0MTYxNjAyMSwgMHg4ZWIyYmMzZSwgMHhjNmUyZTQyNiwgMHg0OTUxNTgxOSwKKyAgICAweGNkZDFkYzFkLCAweDQxNTE1MDExLCAweDgwOTA5MDEwLCAweGNjZDBkYzFjLCAweDhhOTI5ODFhLCAweDgzYTNhMDIzLAorICAgIDB4OGJhM2E4MmIsIDB4YzBkMGQwMTAsIDB4ODE4MTgwMDEsIDB4MGYwMzBjMGYsIDB4NDc0MzQ0MDcsIDB4MGExMjE4MWEsCisgICAgMHhjM2UzZTAyMywgMHhjY2UwZWMyYywgMHg4ZDgxOGMwZCwgMHg4ZmIzYmMzZiwgMHg4NjkyOTQxNiwgMHg0YjczNzgzYiwKKyAgICAweDRjNTA1YzFjLCAweDgyYTJhMDIyLCAweDgxYTFhMDIxLCAweDQzNjM2MDIzLCAweDAzMjMyMDIzLCAweDRkNDE0YzBkLAorICAgIDB4YzhjMGM4MDgsIDB4OGU5MjljMWUsIDB4OGM5MDljMWMsIDB4MGEzMjM4M2EsIDB4MGMwMDBjMGMsIDB4MGUyMjJjMmUsCisgICAgMHg4YWIyYjgzYSwgMHg0ZTYyNmMyZSwgMHg4ZjkzOWMxZiwgMHg0YTUyNTgxYSwgMHhjMmYyZjAzMiwgMHg4MjkyOTAxMiwKKyAgICAweGMzZjNmMDMzLCAweDQ5NDE0ODA5LCAweDQ4NzA3ODM4LCAweGNjYzBjYzBjLCAweDA1MTExNDE1LCAweGNiZjNmODNiLAorICAgIDB4NDA3MDcwMzAsIDB4NDU3MTc0MzUsIDB4NGY3MzdjM2YsIDB4MDUzMTM0MzUsIDB4MDAxMDEwMTAsIDB4MDMwMzAwMDMsCisgICAgMHg0NDYwNjQyNCwgMHg0ZDYxNmMyZCwgMHhjNmMyYzQwNiwgMHg0NDcwNzQzNCwgMHhjNWQxZDQxNSwgMHg4NGIwYjQzNCwKKyAgICAweGNhZTJlODJhLCAweDA5MDEwODA5LCAweDQ2NzI3NDM2LCAweDA5MTExODE5LCAweGNlZjJmYzNlLCAweDQwNDA0MDAwLAorICAgIDB4MDIxMjEwMTIsIDB4YzBlMGUwMjAsIDB4OGRiMWJjM2QsIDB4MDUwMTA0MDUsIDB4Y2FmMmY4M2EsIDB4MDEwMTAwMDEsCisgICAgMHhjMGYwZjAzMCwgMHgwYTIyMjgyYSwgMHg0ZTUyNWMxZSwgMHg4OWExYTgyOSwgMHg0NjUyNTQxNiwgMHg0MzQzNDAwMywKKyAgICAweDg1ODE4NDA1LCAweDA0MTAxNDE0LCAweDg5ODE4ODA5LCAweDhiOTM5ODFiLCAweDgwYjBiMDMwLCAweGM1ZTFlNDI1LAorICAgIDB4NDg0MDQ4MDgsIDB4NDk3MTc4MzksIDB4ODc5Mzk0MTcsIDB4Y2NmMGZjM2MsIDB4MGUxMjFjMWUsIDB4ODI4MjgwMDIsCisgICAgMHgwMTIxMjAyMSwgMHg4YzgwOGMwYywgMHgwYjEzMTgxYiwgMHg0ZjUzNWMxZiwgMHg0NzczNzQzNywgMHg0NDUwNTQxNCwKKyAgICAweDgyYjJiMDMyLCAweDBkMTExYzFkLCAweDA1MjEyNDI1LCAweDRmNDM0YzBmLCAweDAwMDAwMDAwLCAweDQ2NDI0NDA2LAorICAgIDB4Y2RlMWVjMmQsIDB4NDg1MDU4MTgsIDB4NDI1MjUwMTIsIDB4Y2JlM2U4MmIsIDB4NGU3MjdjM2UsIDB4Y2FkMmQ4MWEsCisgICAgMHhjOWMxYzgwOSwgMHhjZGYxZmMzZCwgMHgwMDMwMzAzMCwgMHg4NTkxOTQxNSwgMHg0NTYxNjQyNSwgMHgwYzMwM2MzYywKKyAgICAweDg2YjJiNDM2LCAweGM0ZTBlNDI0LCAweDhiYjNiODNiLCAweDRjNzA3YzNjLCAweDBlMDIwYzBlLCAweDQwNTA1MDEwLAorICAgIDB4MDkzMTM4MzksIDB4MDYyMjI0MjYsIDB4MDIzMjMwMzIsIDB4ODQ4MDg0MDQsIDB4NDk2MTY4MjksIDB4ODM5MzkwMTMsCisgICAgMHgwNzMzMzQzNywgMHhjN2UzZTQyNywgMHgwNDIwMjQyNCwgMHg4NGEwYTQyNCwgMHhjYmMzYzgwYiwgMHg0MzUzNTAxMywKKyAgICAweDBhMDIwODBhLCAweDg3ODM4NDA3LCAweGM5ZDFkODE5LCAweDRjNDA0YzBjLCAweDgzODM4MDAzLCAweDhmODM4YzBmLAorICAgIDB4Y2VjMmNjMGUsIDB4MGIzMzM4M2IsIDB4NGE0MjQ4MGEsIDB4ODdiM2I0MzcsCit9OworCitzdGF0aWMgY29uc3QgdTMyIEtDW05VTUtDXSA9IHsKKyAgICAweDllMzc3OWI5LCAweDNjNmVmMzczLCAweDc4ZGRlNmU2LCAweGYxYmJjZGNjLAorICAgIDB4ZTM3NzliOTksIDB4YzZlZjM3MzMsIDB4OGRkZTZlNjcsIDB4MWJiY2RjY2YsCisgICAgMHgzNzc5Yjk5ZSwgMHg2ZWYzNzMzYywgMHhkZGU2ZTY3OCwgMHhiYmNkY2NmMSwKKyAgICAweDc3OWI5OWUzLCAweGVmMzczM2M2LCAweGRlNmU2NzhkLCAweGJjZGNjZjFiLAorfTsKKwwKKworCisvKiBQZXJmb3JtIHRoZSBrZXkgc2V0dXAuCisgKi8gIAorc3RhdGljIGdjcnlfZXJyX2NvZGVfdAorZG9fc2V0a2V5IChTRUVEX2NvbnRleHQgKmN0eCwgY29uc3QgYnl0ZSAqa2V5LCBjb25zdCB1bnNpZ25lZCBrZXlsZW4pCit7CisgIHN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOworICBzdGF0aWMgY29uc3QgY2hhciAqc2VsZnRlc3RfZmFpbGVkPTA7CisgIHUzMiB4MSwgeDIsIHgzLCB4NDsKKyAgdW5pb24gd29yZGJ1ZiB0MCwgdDE7CisgIHUzMiAqa2V5b3V0ID0gY3R4LT5rZXlzY2hlZHVsZTsKKyAgaW50IGk7CisKKyAgaWYgKCFpbml0aWFsaXplZCkKKyAgICB7CisgICAgICBpbml0aWFsaXplZCA9IDE7CisgICAgICBzZWxmdGVzdF9mYWlsZWQgPSBzZWxmdGVzdCAoKTsKKyAgICAgIGlmKCBzZWxmdGVzdF9mYWlsZWQgKQorICAgICAgICBsb2dfZXJyb3IgKCIlc1xuIiwgc2VsZnRlc3RfZmFpbGVkICk7CisgICAgfQorICBpZiAoc2VsZnRlc3RfZmFpbGVkKQorICAgIHJldHVybiBHUEdfRVJSX1NFTEZURVNUX0ZBSUxFRDsKKworICBpZiAoa2V5bGVuICE9IDE2KQorICAgIHJldHVybiBHUEdfRVJSX0lOVl9LRVlMRU47CisKKyAgeDEgPSBHRVRVMzIgKGtleSk7CisgIHgyID0gR0VUVTMyIChrZXkrNCk7CisgIHgzID0gR0VUVTMyIChrZXkrOCk7CisgIHg0ID0gR0VUVTMyIChrZXkrMTIpOworCisgIGZvciAoaSA9IDA7IGkgPCBOVU1LQzsgaSsrKQorICAgIHsKKyAgICAgIHQwLncgPSB4MSArIHgzIC0gS0NbaV07CisgICAgICB0MS53ID0geDIgKyBLQ1tpXSAtIHg0OworICAgICAgKihrZXlvdXQrKykgPSBTUzBbdDAuYjBdIF4gU1MxW3QwLmIxXSBeIFNTMlt0MC5iMl0gXiBTUzNbdDAuYjNdOworICAgICAgKihrZXlvdXQrKykgPSBTUzBbdDEuYjBdIF4gU1MxW3QxLmIxXSBeIFNTMlt0MS5iMl0gXiBTUzNbdDEuYjNdOworCisgICAgICBpZiAoaSAlIDIgPT0gMCkKKwl7CisJICB0MC53ID0geDE7CisJICB4MSA9ICh4MT4+OCkgXiAoeDI8PDI0KTsKKwkgIHgyID0gKHgyPj44KSBeICh0MC53PDwyNCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHQwLncgPSB4MzsKKwkgIHgzID0gKHgzPDw4KSBeICh4ND4+MjQpOworCSAgeDQgPSAoeDQ8PDgpIF4gKHQwLnc+PjI0KTsKKwl9CisgICAgfQorCisgIHJldHVybiAwOworfQorCitzdGF0aWMgZ2NyeV9lcnJfY29kZV90CitzZWVkX3NldGtleSAodm9pZCAqY29udGV4dCwgY29uc3QgYnl0ZSAqa2V5LCBjb25zdCB1bnNpZ25lZCBrZXlsZW4pCit7CisgIFNFRURfY29udGV4dCAqY3R4ID0gY29udGV4dDsKKworICBpbnQgcmMgPSBkb19zZXRrZXkgKGN0eCwga2V5LCBrZXlsZW4pOworICBfZ2NyeV9idXJuX3N0YWNrICg0KjYgKyBzaXplb2Yodm9pZCopKjIgKyBzaXplb2YoaW50KSoyKTsKKyAgcmV0dXJuIHJjOworfQorCisKKwwKKyNkZWZpbmUgT1AoWDEsIFgyLCBYMywgWDQsIHJiYXNlKQkJCQlcCisgICAgdDAudyA9IFgzIF4gY3R4LT5rZXlzY2hlZHVsZVtyYmFzZV07CQkJXAorICAgIHQxLncgPSBYNCBeIGN0eC0+a2V5c2NoZWR1bGVbcmJhc2UrMV07CQkJXAorICAgIHQxLncgXj0gdDAudzsJCQkJCQlcCisgICAgdDEudyA9IFNTMFt0MS5iMF0gXiBTUzFbdDEuYjFdIF4gU1MyW3QxLmIyXSBeIFNTM1t0MS5iM107CVwKKyAgICB0MC53ICs9IHQxLnc7CQkJCQkJXAorICAgIHQwLncgPSBTUzBbdDAuYjBdIF4gU1MxW3QwLmIxXSBeIFNTMlt0MC5iMl0gXiBTUzNbdDAuYjNdOwlcCisgICAgdDEudyArPSB0MC53OwkJCQkJCVwKKyAgICB0MS53ID0gU1MwW3QxLmIwXSBeIFNTMVt0MS5iMV0gXiBTUzJbdDEuYjJdIF4gU1MzW3QxLmIzXTsJXAorICAgIHQwLncgKz0gdDEudzsJCQkJCQlcCisgICAgWDEgXj0gdDAudzsJCQkJCQkJXAorICAgIFgyIF49IHQxLnc7CisKKy8qIEVuY3J5cHQgb25lIGJsb2NrLiAgaW5idWYgYW5kIG91dGJ1ZiBtYXkgYmUgdGhlIHNhbWUuICovCitzdGF0aWMgdm9pZAorZG9fZW5jcnlwdCAoY29uc3QgU0VFRF9jb250ZXh0ICpjdHgsIGJ5dGUgKm91dGJ1ZiwgY29uc3QgYnl0ZSAqaW5idWYpCit7CisgIHUzMiB4MSwgeDIsIHgzLCB4NDsKKyAgdW5pb24gd29yZGJ1ZiB0MCwgdDE7CisKKyAgeDEgPSBHRVRVMzIgKGluYnVmKTsKKyAgeDIgPSBHRVRVMzIgKGluYnVmKzQpOworICB4MyA9IEdFVFUzMiAoaW5idWYrOCk7CisgIHg0ID0gR0VUVTMyIChpbmJ1ZisxMik7CisKKyAgT1AgKHgxLCB4MiwgeDMsIHg0LCAwKTsKKyAgT1AgKHgzLCB4NCwgeDEsIHgyLCAyKTsKKyAgT1AgKHgxLCB4MiwgeDMsIHg0LCA0KTsKKyAgT1AgKHgzLCB4NCwgeDEsIHgyLCA2KTsKKyAgT1AgKHgxLCB4MiwgeDMsIHg0LCA4KTsKKyAgT1AgKHgzLCB4NCwgeDEsIHgyLCAxMCk7CisgIE9QICh4MSwgeDIsIHgzLCB4NCwgMTIpOworICBPUCAoeDMsIHg0LCB4MSwgeDIsIDE0KTsKKyAgT1AgKHgxLCB4MiwgeDMsIHg0LCAxNik7CisgIE9QICh4MywgeDQsIHgxLCB4MiwgMTgpOworICBPUCAoeDEsIHgyLCB4MywgeDQsIDIwKTsKKyAgT1AgKHgzLCB4NCwgeDEsIHgyLCAyMik7CisgIE9QICh4MSwgeDIsIHgzLCB4NCwgMjQpOworICBPUCAoeDMsIHg0LCB4MSwgeDIsIDI2KTsKKyAgT1AgKHgxLCB4MiwgeDMsIHg0LCAyOCk7CisgIE9QICh4MywgeDQsIHgxLCB4MiwgMzApOworCisgIFBVVFUzMiAob3V0YnVmLCB4Myk7CisgIFBVVFUzMiAob3V0YnVmKzQsIHg0KTsKKyAgUFVUVTMyIChvdXRidWYrOCwgeDEpOworICBQVVRVMzIgKG91dGJ1ZisxMiwgeDIpOworfQorCitzdGF0aWMgdm9pZAorc2VlZF9lbmNyeXB0ICh2b2lkICpjb250ZXh0LCBieXRlICpvdXRidWYsIGNvbnN0IGJ5dGUgKmluYnVmKQoreworICBTRUVEX2NvbnRleHQgKmN0eCA9IGNvbnRleHQ7CisKKyAgZG9fZW5jcnlwdCAoY3R4LCBvdXRidWYsIGluYnVmKTsKKyAgX2djcnlfYnVybl9zdGFjayAoNCo2KTsKK30KKworCisMCisvKiBEZWNyeXB0IG9uZSBibG9jay4gIGluYnVmIGFuZCBvdXRidWYgbWF5IGJlIHRoZSBzYW1lLiAqLworc3RhdGljIHZvaWQKK2RvX2RlY3J5cHQgKFNFRURfY29udGV4dCAqY3R4LCBieXRlICpvdXRidWYsIGNvbnN0IGJ5dGUgKmluYnVmKQoreworICB1MzIgeDEsIHgyLCB4MywgeDQ7CisgIHVuaW9uIHdvcmRidWYgdDAsIHQxOworCisgIHgxID0gR0VUVTMyIChpbmJ1Zik7CisgIHgyID0gR0VUVTMyIChpbmJ1Zis0KTsKKyAgeDMgPSBHRVRVMzIgKGluYnVmKzgpOworICB4NCA9IEdFVFUzMiAoaW5idWYrMTIpOworCisgIE9QICh4MSwgeDIsIHgzLCB4NCwgMzApOworICBPUCAoeDMsIHg0LCB4MSwgeDIsIDI4KTsKKyAgT1AgKHgxLCB4MiwgeDMsIHg0LCAyNik7CisgIE9QICh4MywgeDQsIHgxLCB4MiwgMjQpOworICBPUCAoeDEsIHgyLCB4MywgeDQsIDIyKTsKKyAgT1AgKHgzLCB4NCwgeDEsIHgyLCAyMCk7CisgIE9QICh4MSwgeDIsIHgzLCB4NCwgMTgpOworICBPUCAoeDMsIHg0LCB4MSwgeDIsIDE2KTsKKyAgT1AgKHgxLCB4MiwgeDMsIHg0LCAxNCk7CisgIE9QICh4MywgeDQsIHgxLCB4MiwgMTIpOworICBPUCAoeDEsIHgyLCB4MywgeDQsIDEwKTsKKyAgT1AgKHgzLCB4NCwgeDEsIHgyLCA4KTsKKyAgT1AgKHgxLCB4MiwgeDMsIHg0LCA2KTsKKyAgT1AgKHgzLCB4NCwgeDEsIHgyLCA0KTsKKyAgT1AgKHgxLCB4MiwgeDMsIHg0LCAyKTsKKyAgT1AgKHgzLCB4NCwgeDEsIHgyLCAwKTsKKworICBQVVRVMzIgKG91dGJ1ZiwgeDMpOworICBQVVRVMzIgKG91dGJ1Zis0LCB4NCk7CisgIFBVVFUzMiAob3V0YnVmKzgsIHgxKTsKKyAgUFVUVTMyIChvdXRidWYrMTIsIHgyKTsKK30KKworc3RhdGljIHZvaWQKK3NlZWRfZGVjcnlwdCAodm9pZCAqY29udGV4dCwgYnl0ZSAqb3V0YnVmLCBjb25zdCBieXRlICppbmJ1ZikKK3sKKyAgU0VFRF9jb250ZXh0ICpjdHggPSBjb250ZXh0OworCisgIGRvX2RlY3J5cHQgKGN0eCwgb3V0YnVmLCBpbmJ1Zik7CisgIF9nY3J5X2J1cm5fc3RhY2sgKDQqNik7Cit9CisKKwwKKy8qIFRlc3QgYSBzaW5nbGUgZW5jcnlwdGlvbiBhbmQgZGVjcnlwdGlvbiB3aXRoIGVhY2gga2V5IHNpemUuICovCitzdGF0aWMgY29uc3QgY2hhcioKK3NlbGZ0ZXN0ICh2b2lkKQoreworICBTRUVEX2NvbnRleHQgY3R4OworICBieXRlIHNjcmF0Y2hbMTZdOwkgICAKKworICAvKiBUaGUgdGVzdCB2ZWN0b3IgaXMgdGFrZW4gZnJvbSB0aGUgYXBwZW5kaXggc2VjdGlvbiBCLjMgb2YgUkZDNDI2OS4KKyAgICovCisgIHN0YXRpYyBjb25zdCBieXRlIHBsYWludGV4dFsxNl0gPSB7CisgICAgMHg4MywgMHhBMiwgMHhGOCwgMHhBMiwgMHg4OCwgMHg2NCwgMHgxRiwgMHhCOSwKKyAgICAweEE0LCAweEU5LCAweEE1LCAweENDLCAweDJGLCAweDEzLCAweDFDLCAweDdECisgIH07CisgIHN0YXRpYyBjb25zdCBieXRlIGtleVsxNl0gPSB7CisgICAgMHg0NywgMHgwNiwgMHg0OCwgMHgwOCwgMHg1MSwgMHhFNiwgMHgxQiwgMHhFOCwKKyAgICAweDVELCAweDc0LCAweEJGLCAweEIzLCAweEZELCAweDk1LCAweDYxLCAweDg1CisgIH07CisgIHN0YXRpYyBjb25zdCBieXRlIGNpcGhlcnRleHRbMTZdID0geworICAgIDB4RUUsIDB4NTQsIDB4RDEsIDB4M0UsIDB4QkMsIDB4QUUsIDB4NzAsIDB4NkQsCisgICAgMHgyMiwgMHg2QiwgMHhDMywgMHgxNCwgMHgyQywgMHhENCwgMHgwRCwgMHg0QSwKKyAgfTsKKworICBzZWVkX3NldGtleSAoJmN0eCwga2V5LCBzaXplb2Yoa2V5KSk7CisgIHNlZWRfZW5jcnlwdCAoJmN0eCwgc2NyYXRjaCwgcGxhaW50ZXh0KTsKKyAgaWYgKG1lbWNtcCAoc2NyYXRjaCwgY2lwaGVydGV4dCwgc2l6ZW9mIChjaXBoZXJ0ZXh0KSkpCisgICAgcmV0dXJuICJTRUVEIHRlc3QgZW5jcnlwdGlvbiBmYWlsZWQuIjsKKyAgc2VlZF9kZWNyeXB0ICgmY3R4LCBzY3JhdGNoLCBzY3JhdGNoKTsKKyAgaWYgKG1lbWNtcCAoc2NyYXRjaCwgcGxhaW50ZXh0LCBzaXplb2YgKHBsYWludGV4dCkpKQorICAgIHJldHVybiAiU0VFRCB0ZXN0IGRlY3J5cHRpb24gZmFpbGVkLiI7CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKKwwKKworc3RhdGljIGdjcnlfY2lwaGVyX29pZF9zcGVjX3Qgc2VlZF9vaWRzW10gPQorICB7CisgICAgeyAiMS4yLjQxMC4yMDAwMDQuMS4zIiwgR0NSWV9DSVBIRVJfTU9ERV9FQ0IgfSwKKyAgICB7ICIxLjIuNDEwLjIwMDAwNC4xLjQiLCBHQ1JZX0NJUEhFUl9NT0RFX0NCQyB9LAorICAgIHsgIjEuMi40MTAuMjAwMDA0LjEuNSIsIEdDUllfQ0lQSEVSX01PREVfQ0ZCIH0sCisgICAgeyAiMS4yLjQxMC4yMDAwMDQuMS42IiwgR0NSWV9DSVBIRVJfTU9ERV9PRkIgfSwKKyAgICB7IE5VTEwgfQorICB9OworCitnY3J5X2NpcGhlcl9zcGVjX3QgX2djcnlfY2lwaGVyX3NwZWNfc2VlZCA9CisgIHsKKyAgICAiU0VFRCIsIE5VTEwsIHNlZWRfb2lkcywgMTYsIDEyOCwgc2l6ZW9mIChTRUVEX2NvbnRleHQpLAorICAgIHNlZWRfc2V0a2V5LCBzZWVkX2VuY3J5cHQsIHNlZWRfZGVjcnlwdCwKKyAgfTsKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9jaXBoZXIvc2VycGVudC5jIGIvbGliZ2NyeXB0LTEuNC42L2NpcGhlci9zZXJwZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI3ZTY1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9jaXBoZXIvc2VycGVudC5jCkBAIC0wLDAgKzEsOTc4IEBACisvKiBzZXJwZW50LmMgLSBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU2VycGVudCBlbmNyeXB0aW9uIGFsZ29yaXRobS4KKyAqCUNvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBnZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAqIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlICJnMTBsaWIuaCIKKyNpbmNsdWRlICJjaXBoZXIuaCIKKyNpbmNsdWRlICJiaXRoZWxwLmgiCisKKy8qIE51bWJlciBvZiByb3VuZHMgcGVyIFNlcnBlbnQgZW5jcnlwdC9kZWNyeXB0IG9wZXJhdGlvbi4gICovCisjZGVmaW5lIFJPVU5EUyAzMgorCisvKiBNYWdpYyBudW1iZXIsIHVzZWQgZHVyaW5nIGdlbmVyYXRpbmcgb2YgdGhlIHN1YmtleXMuICAqLworI2RlZmluZSBQSEkgMHg5RTM3NzlCOQorCisvKiBTZXJwZW50IHdvcmtzIG9uIDEyOCBiaXQgYmxvY2tzLiAgKi8KK3R5cGVkZWYgdTMyIHNlcnBlbnRfYmxvY2tfdFs0XTsKKworLyogU2VycGVudCBrZXksIHByb3ZpZGVkIGJ5IHRoZSB1c2VyLiAgSWYgdGhlIG9yaWdpbmFsIGtleSBpcyBzaG9ydGVyCisgICB0aGFuIDI1NiBiaXRzLCBpdCBpcyBwYWRkZWQuICAqLwordHlwZWRlZiB1MzIgc2VycGVudF9rZXlfdFs4XTsKKworLyogVGhlIGtleSBzY2hlZHVsZSBjb25zaXN0cyBvZiAzMyAxMjggYml0IHN1YmtleXMuICAqLwordHlwZWRlZiB1MzIgc2VycGVudF9zdWJrZXlzX3RbUk9VTkRTICsgMV1bNF07CisKKy8qIEEgU2VycGVudCBjb250ZXh0LiAgKi8KK3R5cGVkZWYgc3RydWN0IHNlcnBlbnRfY29udGV4dAoreworICBzZXJwZW50X3N1YmtleXNfdCBrZXlzOwkvKiBHZW5lcmF0ZWQgc3Via2V5cy4gICovCit9IHNlcnBlbnRfY29udGV4dF90OworCisKKy8qIEEgcHJvdG90eXBlLiAgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpzZXJwZW50X3Rlc3QgKHZvaWQpOworICAgICAgCisKKyNkZWZpbmUgYnl0ZV9zd2FwXzMyKHgpIFwKKyAgKDAgXAorICAgfCAoKCh4KSAmIDB4ZmYwMDAwMDApID4+IDI0KSB8ICgoKHgpICYgMHgwMGZmMDAwMCkgPj4gIDgpIFwKKyAgIHwgKCgoeCkgJiAweDAwMDBmZjAwKSA8PCAgOCkgfCAoKCh4KSAmIDB4MDAwMDAwZmYpIDw8IDI0KSkKKworLyogVGhlc2UgYXJlIHRoZSBTLUJveGVzIG9mIFNlcnBlbnQuICBUaGV5IGFyZSBjb3BpZWQgZnJvbSBTZXJwZW50cworICAgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uICh0aGUgb3B0aW1pemVkIG9uZSwgY29udGFpbmVkIGluCisgICBgZmxvcHB5MicpIGFuZCBhcmUgdGhlcmVmb3JlOgorCisgICAgIENvcHlyaWdodCAoQykgMTk5OCBSb3NzIEFuZGVyc29uLCBFbGkgQmloYW0sIExhcnMgS251ZHNlbi4KKworICBUbyBxdW90ZSB0aGUgU2VycGVudCBob21lcGFnZQorICAoaHR0cDovL3d3dy5jbC5jYW0uYWMudWsvfnJqYTE0L3NlcnBlbnQuaHRtbCk6CisKKyAgIlNlcnBlbnQgaXMgbm93IGNvbXBsZXRlbHkgaW4gdGhlIHB1YmxpYyBkb21haW4sIGFuZCB3ZSBpbXBvc2Ugbm8KKyAgIHJlc3RyaWN0aW9ucyBvbiBpdHMgdXNlLiAgVGhpcyB3YXMgYW5ub3VuY2VkIG9uIHRoZSAyMXN0IEF1Z3VzdCBhdAorICAgdGhlIEZpcnN0IEFFUyBDYW5kaWRhdGUgQ29uZmVyZW5jZS4gVGhlIG9wdGltaXNlZCBpbXBsZW1lbnRhdGlvbnMKKyAgIGluIHRoZSBzdWJtaXNzaW9uIHBhY2thZ2UgYXJlIG5vdyB1bmRlciB0aGUgR05VIFBVQkxJQyBMSUNFTlNFCisgICAoR1BMKSwgYWx0aG91Z2ggc29tZSBjb21tZW50cyBpbiB0aGUgY29kZSBzdGlsbCBzYXkgb3RoZXJ3aXNlLiBZb3UKKyAgIGFyZSB3ZWxjb21lIHRvIHVzZSBTZXJwZW50IGZvciBhbnkgYXBwbGljYXRpb24uIiAgKi8KKworI2RlZmluZSBTQk9YMChhLCBiLCBjLCBkLCB3LCB4LCB5LCB6KSBcCisgIHsgXAorICAgIHUzMiB0MDIsIHQwMywgdDA1LCB0MDYsIHQwNywgdDA4LCB0MDk7IFwKKyAgICB1MzIgdDExLCB0MTIsIHQxMywgdDE0LCB0MTUsIHQxNywgdDAxOyBcCisgICAgdDAxID0gYiAgIF4gYyAgOyBcCisgICAgdDAyID0gYSAgIHwgZCAgOyBcCisgICAgdDAzID0gYSAgIF4gYiAgOyBcCisgICAgeiAgID0gdDAyIF4gdDAxOyBcCisgICAgdDA1ID0gYyAgIHwgeiAgOyBcCisgICAgdDA2ID0gYSAgIF4gZCAgOyBcCisgICAgdDA3ID0gYiAgIHwgYyAgOyBcCisgICAgdDA4ID0gZCAgICYgdDA1OyBcCisgICAgdDA5ID0gdDAzICYgdDA3OyBcCisgICAgeSAgID0gdDA5IF4gdDA4OyBcCisgICAgdDExID0gdDA5ICYgeSAgOyBcCisgICAgdDEyID0gYyAgIF4gZCAgOyBcCisgICAgdDEzID0gdDA3IF4gdDExOyBcCisgICAgdDE0ID0gYiAgICYgdDA2OyBcCisgICAgdDE1ID0gdDA2IF4gdDEzOyBcCisgICAgdyAgID0gICAgIH4gdDE1OyBcCisgICAgdDE3ID0gdyAgIF4gdDE0OyBcCisgICAgeCAgID0gdDEyIF4gdDE3OyBcCisgIH0KKworI2RlZmluZSBTQk9YMF9JTlZFUlNFKGEsIGIsIGMsIGQsIHcsIHgsIHksIHopIFwKKyAgeyBcCisgICAgdTMyIHQwMiwgdDAzLCB0MDQsIHQwNSwgdDA2LCB0MDgsIHQwOSwgdDEwOyBcCisgICAgdTMyIHQxMiwgdDEzLCB0MTQsIHQxNSwgdDE3LCB0MTgsIHQwMTsgXAorICAgIHQwMSA9IGMgICBeIGQgIDsgXAorICAgIHQwMiA9IGEgICB8IGIgIDsgXAorICAgIHQwMyA9IGIgICB8IGMgIDsgXAorICAgIHQwNCA9IGMgICAmIHQwMTsgXAorICAgIHQwNSA9IHQwMiBeIHQwMTsgXAorICAgIHQwNiA9IGEgICB8IHQwNDsgXAorICAgIHkgICA9ICAgICB+IHQwNTsgXAorICAgIHQwOCA9IGIgICBeIGQgIDsgXAorICAgIHQwOSA9IHQwMyAmIHQwODsgXAorICAgIHQxMCA9IGQgICB8IHkgIDsgXAorICAgIHggICA9IHQwOSBeIHQwNjsgXAorICAgIHQxMiA9IGEgICB8IHQwNTsgXAorICAgIHQxMyA9IHggICBeIHQxMjsgXAorICAgIHQxNCA9IHQwMyBeIHQxMDsgXAorICAgIHQxNSA9IGEgICBeIGMgIDsgXAorICAgIHogICA9IHQxNCBeIHQxMzsgXAorICAgIHQxNyA9IHQwNSAmIHQxMzsgXAorICAgIHQxOCA9IHQxNCB8IHQxNzsgXAorICAgIHcgICA9IHQxNSBeIHQxODsgXAorICB9CisKKyNkZWZpbmUgU0JPWDEoYSwgYiwgYywgZCwgdywgeCwgeSwgeikgXAorICB7IFwKKyAgICB1MzIgdDAyLCB0MDMsIHQwNCwgdDA1LCB0MDYsIHQwNywgdDA4OyBcCisgICAgdTMyIHQxMCwgdDExLCB0MTIsIHQxMywgdDE2LCB0MTcsIHQwMTsgXAorICAgIHQwMSA9IGEgICB8IGQgIDsgXAorICAgIHQwMiA9IGMgICBeIGQgIDsgXAorICAgIHQwMyA9ICAgICB+IGIgIDsgXAorICAgIHQwNCA9IGEgICBeIGMgIDsgXAorICAgIHQwNSA9IGEgICB8IHQwMzsgXAorICAgIHQwNiA9IGQgICAmIHQwNDsgXAorICAgIHQwNyA9IHQwMSAmIHQwMjsgXAorICAgIHQwOCA9IGIgICB8IHQwNjsgXAorICAgIHkgICA9IHQwMiBeIHQwNTsgXAorICAgIHQxMCA9IHQwNyBeIHQwODsgXAorICAgIHQxMSA9IHQwMSBeIHQxMDsgXAorICAgIHQxMiA9IHkgICBeIHQxMTsgXAorICAgIHQxMyA9IGIgICAmIGQgIDsgXAorICAgIHogICA9ICAgICB+IHQxMDsgXAorICAgIHggICA9IHQxMyBeIHQxMjsgXAorICAgIHQxNiA9IHQxMCB8IHggIDsgXAorICAgIHQxNyA9IHQwNSAmIHQxNjsgXAorICAgIHcgICA9IGMgICBeIHQxNzsgXAorICB9CisKKyNkZWZpbmUgU0JPWDFfSU5WRVJTRShhLCBiLCBjLCBkLCB3LCB4LCB5LCB6KSBcCisgIHsgXAorICAgIHUzMiB0MDIsIHQwMywgdDA0LCB0MDUsIHQwNiwgdDA3LCB0MDg7IFwKKyAgICB1MzIgdDA5LCB0MTAsIHQxMSwgdDE0LCB0MTUsIHQxNywgdDAxOyBcCisgICAgdDAxID0gYSAgIF4gYiAgOyBcCisgICAgdDAyID0gYiAgIHwgZCAgOyBcCisgICAgdDAzID0gYSAgICYgYyAgOyBcCisgICAgdDA0ID0gYyAgIF4gdDAyOyBcCisgICAgdDA1ID0gYSAgIHwgdDA0OyBcCisgICAgdDA2ID0gdDAxICYgdDA1OyBcCisgICAgdDA3ID0gZCAgIHwgdDAzOyBcCisgICAgdDA4ID0gYiAgIF4gdDA2OyBcCisgICAgdDA5ID0gdDA3IF4gdDA2OyBcCisgICAgdDEwID0gdDA0IHwgdDAzOyBcCisgICAgdDExID0gZCAgICYgdDA4OyBcCisgICAgeSAgID0gICAgIH4gdDA5OyBcCisgICAgeCAgID0gdDEwIF4gdDExOyBcCisgICAgdDE0ID0gYSAgIHwgeSAgOyBcCisgICAgdDE1ID0gdDA2IF4geCAgOyBcCisgICAgeiAgID0gdDAxIF4gdDA0OyBcCisgICAgdDE3ID0gYyAgIF4gdDE1OyBcCisgICAgdyAgID0gdDE0IF4gdDE3OyBcCisgIH0KKworI2RlZmluZSBTQk9YMihhLCBiLCBjLCBkLCB3LCB4LCB5LCB6KSBcCisgIHsgXAorICAgIHUzMiB0MDIsIHQwMywgdDA1LCB0MDYsIHQwNywgdDA4OyBcCisgICAgdTMyIHQwOSwgdDEwLCB0MTIsIHQxMywgdDE0LCB0MDE7IFwKKyAgICB0MDEgPSBhICAgfCBjICA7IFwKKyAgICB0MDIgPSBhICAgXiBiICA7IFwKKyAgICB0MDMgPSBkICAgXiB0MDE7IFwKKyAgICB3ICAgPSB0MDIgXiB0MDM7IFwKKyAgICB0MDUgPSBjICAgXiB3ICA7IFwKKyAgICB0MDYgPSBiICAgXiB0MDU7IFwKKyAgICB0MDcgPSBiICAgfCB0MDU7IFwKKyAgICB0MDggPSB0MDEgJiB0MDY7IFwKKyAgICB0MDkgPSB0MDMgXiB0MDc7IFwKKyAgICB0MTAgPSB0MDIgfCB0MDk7IFwKKyAgICB4ICAgPSB0MTAgXiB0MDg7IFwKKyAgICB0MTIgPSBhICAgfCBkICA7IFwKKyAgICB0MTMgPSB0MDkgXiB4ICA7IFwKKyAgICB0MTQgPSBiICAgXiB0MTM7IFwKKyAgICB6ICAgPSAgICAgfiB0MDk7IFwKKyAgICB5ICAgPSB0MTIgXiB0MTQ7IFwKKyAgfQorCisjZGVmaW5lIFNCT1gyX0lOVkVSU0UoYSwgYiwgYywgZCwgdywgeCwgeSwgeikgXAorICB7IFwKKyAgICB1MzIgdDAyLCB0MDMsIHQwNCwgdDA2LCB0MDcsIHQwOCwgdDA5OyBcCisgICAgdTMyIHQxMCwgdDExLCB0MTIsIHQxNSwgdDE2LCB0MTcsIHQwMTsgXAorICAgIHQwMSA9IGEgICBeIGQgIDsgXAorICAgIHQwMiA9IGMgICBeIGQgIDsgXAorICAgIHQwMyA9IGEgICAmIGMgIDsgXAorICAgIHQwNCA9IGIgICB8IHQwMjsgXAorICAgIHcgICA9IHQwMSBeIHQwNDsgXAorICAgIHQwNiA9IGEgICB8IGMgIDsgXAorICAgIHQwNyA9IGQgICB8IHcgIDsgXAorICAgIHQwOCA9ICAgICB+IGQgIDsgXAorICAgIHQwOSA9IGIgICAmIHQwNjsgXAorICAgIHQxMCA9IHQwOCB8IHQwMzsgXAorICAgIHQxMSA9IGIgICAmIHQwNzsgXAorICAgIHQxMiA9IHQwNiAmIHQwMjsgXAorICAgIHogICA9IHQwOSBeIHQxMDsgXAorICAgIHggICA9IHQxMiBeIHQxMTsgXAorICAgIHQxNSA9IGMgICAmIHogIDsgXAorICAgIHQxNiA9IHcgICBeIHggIDsgXAorICAgIHQxNyA9IHQxMCBeIHQxNTsgXAorICAgIHkgICA9IHQxNiBeIHQxNzsgXAorICB9CisKKyNkZWZpbmUgU0JPWDMoYSwgYiwgYywgZCwgdywgeCwgeSwgeikgXAorICB7IFwKKyAgICB1MzIgdDAyLCB0MDMsIHQwNCwgdDA1LCB0MDYsIHQwNywgdDA4OyBcCisgICAgdTMyIHQwOSwgdDEwLCB0MTEsIHQxMywgdDE0LCB0MTUsIHQwMTsgXAorICAgIHQwMSA9IGEgICBeIGMgIDsgXAorICAgIHQwMiA9IGEgICB8IGQgIDsgXAorICAgIHQwMyA9IGEgICAmIGQgIDsgXAorICAgIHQwNCA9IHQwMSAmIHQwMjsgXAorICAgIHQwNSA9IGIgICB8IHQwMzsgXAorICAgIHQwNiA9IGEgICAmIGIgIDsgXAorICAgIHQwNyA9IGQgICBeIHQwNDsgXAorICAgIHQwOCA9IGMgICB8IHQwNjsgXAorICAgIHQwOSA9IGIgICBeIHQwNzsgXAorICAgIHQxMCA9IGQgICAmIHQwNTsgXAorICAgIHQxMSA9IHQwMiBeIHQxMDsgXAorICAgIHogICA9IHQwOCBeIHQwOTsgXAorICAgIHQxMyA9IGQgICB8IHogIDsgXAorICAgIHQxNCA9IGEgICB8IHQwNzsgXAorICAgIHQxNSA9IGIgICAmIHQxMzsgXAorICAgIHkgICA9IHQwOCBeIHQxMTsgXAorICAgIHcgICA9IHQxNCBeIHQxNTsgXAorICAgIHggICA9IHQwNSBeIHQwNDsgXAorICB9CisKKyNkZWZpbmUgU0JPWDNfSU5WRVJTRShhLCBiLCBjLCBkLCB3LCB4LCB5LCB6KSBcCisgIHsgXAorICAgIHUzMiB0MDIsIHQwMywgdDA0LCB0MDUsIHQwNiwgdDA3LCB0MDk7IFwKKyAgICB1MzIgdDExLCB0MTIsIHQxMywgdDE0LCB0MTYsIHQwMTsgXAorICAgIHQwMSA9IGMgICB8IGQgIDsgXAorICAgIHQwMiA9IGEgICB8IGQgIDsgXAorICAgIHQwMyA9IGMgICBeIHQwMjsgXAorICAgIHQwNCA9IGIgICBeIHQwMjsgXAorICAgIHQwNSA9IGEgICBeIGQgIDsgXAorICAgIHQwNiA9IHQwNCAmIHQwMzsgXAorICAgIHQwNyA9IGIgICAmIHQwMTsgXAorICAgIHkgICA9IHQwNSBeIHQwNjsgXAorICAgIHQwOSA9IGEgICBeIHQwMzsgXAorICAgIHcgICA9IHQwNyBeIHQwMzsgXAorICAgIHQxMSA9IHcgICB8IHQwNTsgXAorICAgIHQxMiA9IHQwOSAmIHQxMTsgXAorICAgIHQxMyA9IGEgICAmIHkgIDsgXAorICAgIHQxNCA9IHQwMSBeIHQwNTsgXAorICAgIHggICA9IGIgICBeIHQxMjsgXAorICAgIHQxNiA9IGIgICB8IHQxMzsgXAorICAgIHogICA9IHQxNCBeIHQxNjsgXAorICB9CisKKyNkZWZpbmUgU0JPWDQoYSwgYiwgYywgZCwgdywgeCwgeSwgeikgXAorICB7IFwKKyAgICB1MzIgdDAyLCB0MDMsIHQwNCwgdDA1LCB0MDYsIHQwOCwgdDA5OyBcCisgICAgdTMyIHQxMCwgdDExLCB0MTIsIHQxMywgdDE0LCB0MTUsIHQxNiwgdDAxOyBcCisgICAgdDAxID0gYSAgIHwgYiAgOyBcCisgICAgdDAyID0gYiAgIHwgYyAgOyBcCisgICAgdDAzID0gYSAgIF4gdDAyOyBcCisgICAgdDA0ID0gYiAgIF4gZCAgOyBcCisgICAgdDA1ID0gZCAgIHwgdDAzOyBcCisgICAgdDA2ID0gZCAgICYgdDAxOyBcCisgICAgeiAgID0gdDAzIF4gdDA2OyBcCisgICAgdDA4ID0geiAgICYgdDA0OyBcCisgICAgdDA5ID0gdDA0ICYgdDA1OyBcCisgICAgdDEwID0gYyAgIF4gdDA2OyBcCisgICAgdDExID0gYiAgICYgYyAgOyBcCisgICAgdDEyID0gdDA0IF4gdDA4OyBcCisgICAgdDEzID0gdDExIHwgdDAzOyBcCisgICAgdDE0ID0gdDEwIF4gdDA5OyBcCisgICAgdDE1ID0gYSAgICYgdDA1OyBcCisgICAgdDE2ID0gdDExIHwgdDEyOyBcCisgICAgeSAgID0gdDEzIF4gdDA4OyBcCisgICAgeCAgID0gdDE1IF4gdDE2OyBcCisgICAgdyAgID0gICAgIH4gdDE0OyBcCisgIH0KKworI2RlZmluZSBTQk9YNF9JTlZFUlNFKGEsIGIsIGMsIGQsIHcsIHgsIHksIHopIFwKKyAgeyBcCisgICAgdTMyIHQwMiwgdDAzLCB0MDQsIHQwNSwgdDA2LCB0MDcsIHQwOTsgXAorICAgIHUzMiB0MTAsIHQxMSwgdDEyLCB0MTMsIHQxNSwgdDAxOyBcCisgICAgdDAxID0gYiAgIHwgZCAgOyBcCisgICAgdDAyID0gYyAgIHwgZCAgOyBcCisgICAgdDAzID0gYSAgICYgdDAxOyBcCisgICAgdDA0ID0gYiAgIF4gdDAyOyBcCisgICAgdDA1ID0gYyAgIF4gZCAgOyBcCisgICAgdDA2ID0gICAgIH4gdDAzOyBcCisgICAgdDA3ID0gYSAgICYgdDA0OyBcCisgICAgeCAgID0gdDA1IF4gdDA3OyBcCisgICAgdDA5ID0geCAgIHwgdDA2OyBcCisgICAgdDEwID0gYSAgIF4gdDA3OyBcCisgICAgdDExID0gdDAxIF4gdDA5OyBcCisgICAgdDEyID0gZCAgIF4gdDA0OyBcCisgICAgdDEzID0gYyAgIHwgdDEwOyBcCisgICAgeiAgID0gdDAzIF4gdDEyOyBcCisgICAgdDE1ID0gYSAgIF4gdDA0OyBcCisgICAgeSAgID0gdDExIF4gdDEzOyBcCisgICAgdyAgID0gdDE1IF4gdDA5OyBcCisgIH0KKworI2RlZmluZSBTQk9YNShhLCBiLCBjLCBkLCB3LCB4LCB5LCB6KSBcCisgIHsgXAorICAgIHUzMiB0MDIsIHQwMywgdDA0LCB0MDUsIHQwNywgdDA4LCB0MDk7IFwKKyAgICB1MzIgdDEwLCB0MTEsIHQxMiwgdDEzLCB0MTQsIHQwMTsgXAorICAgIHQwMSA9IGIgICBeIGQgIDsgXAorICAgIHQwMiA9IGIgICB8IGQgIDsgXAorICAgIHQwMyA9IGEgICAmIHQwMTsgXAorICAgIHQwNCA9IGMgICBeIHQwMjsgXAorICAgIHQwNSA9IHQwMyBeIHQwNDsgXAorICAgIHcgICA9ICAgICB+IHQwNTsgXAorICAgIHQwNyA9IGEgICBeIHQwMTsgXAorICAgIHQwOCA9IGQgICB8IHcgIDsgXAorICAgIHQwOSA9IGIgICB8IHQwNTsgXAorICAgIHQxMCA9IGQgICBeIHQwODsgXAorICAgIHQxMSA9IGIgICB8IHQwNzsgXAorICAgIHQxMiA9IHQwMyB8IHcgIDsgXAorICAgIHQxMyA9IHQwNyB8IHQxMDsgXAorICAgIHQxNCA9IHQwMSBeIHQxMTsgXAorICAgIHkgICA9IHQwOSBeIHQxMzsgXAorICAgIHggICA9IHQwNyBeIHQwODsgXAorICAgIHogICA9IHQxMiBeIHQxNDsgXAorICB9CisKKyNkZWZpbmUgU0JPWDVfSU5WRVJTRShhLCBiLCBjLCBkLCB3LCB4LCB5LCB6KSBcCisgIHsgXAorICAgIHUzMiB0MDIsIHQwMywgdDA0LCB0MDUsIHQwNywgdDA4LCB0MDk7IFwKKyAgICB1MzIgdDEwLCB0MTIsIHQxMywgdDE1LCB0MTYsIHQwMTsgXAorICAgIHQwMSA9IGEgICAmIGQgIDsgXAorICAgIHQwMiA9IGMgICBeIHQwMTsgXAorICAgIHQwMyA9IGEgICBeIGQgIDsgXAorICAgIHQwNCA9IGIgICAmIHQwMjsgXAorICAgIHQwNSA9IGEgICAmIGMgIDsgXAorICAgIHcgICA9IHQwMyBeIHQwNDsgXAorICAgIHQwNyA9IGEgICAmIHcgIDsgXAorICAgIHQwOCA9IHQwMSBeIHcgIDsgXAorICAgIHQwOSA9IGIgICB8IHQwNTsgXAorICAgIHQxMCA9ICAgICB+IGIgIDsgXAorICAgIHggICA9IHQwOCBeIHQwOTsgXAorICAgIHQxMiA9IHQxMCB8IHQwNzsgXAorICAgIHQxMyA9IHcgICB8IHggIDsgXAorICAgIHogICA9IHQwMiBeIHQxMjsgXAorICAgIHQxNSA9IHQwMiBeIHQxMzsgXAorICAgIHQxNiA9IGIgICBeIGQgIDsgXAorICAgIHkgICA9IHQxNiBeIHQxNTsgXAorICB9CisKKyNkZWZpbmUgU0JPWDYoYSwgYiwgYywgZCwgdywgeCwgeSwgeikgXAorICB7IFwKKyAgICB1MzIgdDAyLCB0MDMsIHQwNCwgdDA1LCB0MDcsIHQwOCwgdDA5LCB0MTA7IFwKKyAgICB1MzIgdDExLCB0MTIsIHQxMywgdDE1LCB0MTcsIHQxOCwgdDAxOyBcCisgICAgdDAxID0gYSAgICYgZCAgOyBcCisgICAgdDAyID0gYiAgIF4gYyAgOyBcCisgICAgdDAzID0gYSAgIF4gZCAgOyBcCisgICAgdDA0ID0gdDAxIF4gdDAyOyBcCisgICAgdDA1ID0gYiAgIHwgYyAgOyBcCisgICAgeCAgID0gICAgIH4gdDA0OyBcCisgICAgdDA3ID0gdDAzICYgdDA1OyBcCisgICAgdDA4ID0gYiAgICYgeCAgOyBcCisgICAgdDA5ID0gYSAgIHwgYyAgOyBcCisgICAgdDEwID0gdDA3IF4gdDA4OyBcCisgICAgdDExID0gYiAgIHwgZCAgOyBcCisgICAgdDEyID0gYyAgIF4gdDExOyBcCisgICAgdDEzID0gdDA5IF4gdDEwOyBcCisgICAgeSAgID0gICAgIH4gdDEzOyBcCisgICAgdDE1ID0geCAgICYgdDAzOyBcCisgICAgeiAgID0gdDEyIF4gdDA3OyBcCisgICAgdDE3ID0gYSAgIF4gYiAgOyBcCisgICAgdDE4ID0geSAgIF4gdDE1OyBcCisgICAgdyAgID0gdDE3IF4gdDE4OyBcCisgIH0KKworI2RlZmluZSBTQk9YNl9JTlZFUlNFKGEsIGIsIGMsIGQsIHcsIHgsIHksIHopIFwKKyAgeyBcCisgICAgdTMyIHQwMiwgdDAzLCB0MDQsIHQwNSwgdDA2LCB0MDcsIHQwOCwgdDA5OyBcCisgICAgdTMyIHQxMiwgdDEzLCB0MTQsIHQxNSwgdDE2LCB0MTcsIHQwMTsgXAorICAgIHQwMSA9IGEgICBeIGMgIDsgXAorICAgIHQwMiA9ICAgICB+IGMgIDsgXAorICAgIHQwMyA9IGIgICAmIHQwMTsgXAorICAgIHQwNCA9IGIgICB8IHQwMjsgXAorICAgIHQwNSA9IGQgICB8IHQwMzsgXAorICAgIHQwNiA9IGIgICBeIGQgIDsgXAorICAgIHQwNyA9IGEgICAmIHQwNDsgXAorICAgIHQwOCA9IGEgICB8IHQwMjsgXAorICAgIHQwOSA9IHQwNyBeIHQwNTsgXAorICAgIHggICA9IHQwNiBeIHQwODsgXAorICAgIHcgICA9ICAgICB+IHQwOTsgXAorICAgIHQxMiA9IGIgICAmIHcgIDsgXAorICAgIHQxMyA9IHQwMSAmIHQwNTsgXAorICAgIHQxNCA9IHQwMSBeIHQxMjsgXAorICAgIHQxNSA9IHQwNyBeIHQxMzsgXAorICAgIHQxNiA9IGQgICB8IHQwMjsgXAorICAgIHQxNyA9IGEgICBeIHggIDsgXAorICAgIHogICA9IHQxNyBeIHQxNTsgXAorICAgIHkgICA9IHQxNiBeIHQxNDsgXAorICB9CisKKyNkZWZpbmUgU0JPWDcoYSwgYiwgYywgZCwgdywgeCwgeSwgeikgXAorICB7IFwKKyAgICB1MzIgdDAyLCB0MDMsIHQwNCwgdDA1LCB0MDYsIHQwOCwgdDA5LCB0MTA7IFwKKyAgICB1MzIgdDExLCB0MTMsIHQxNCwgdDE1LCB0MTYsIHQxNywgdDAxOyBcCisgICAgdDAxID0gYSAgICYgYyAgOyBcCisgICAgdDAyID0gICAgIH4gZCAgOyBcCisgICAgdDAzID0gYSAgICYgdDAyOyBcCisgICAgdDA0ID0gYiAgIHwgdDAxOyBcCisgICAgdDA1ID0gYSAgICYgYiAgOyBcCisgICAgdDA2ID0gYyAgIF4gdDA0OyBcCisgICAgeiAgID0gdDAzIF4gdDA2OyBcCisgICAgdDA4ID0gYyAgIHwgeiAgOyBcCisgICAgdDA5ID0gZCAgIHwgdDA1OyBcCisgICAgdDEwID0gYSAgIF4gdDA4OyBcCisgICAgdDExID0gdDA0ICYgeiAgOyBcCisgICAgeCAgID0gdDA5IF4gdDEwOyBcCisgICAgdDEzID0gYiAgIF4geCAgOyBcCisgICAgdDE0ID0gdDAxIF4geCAgOyBcCisgICAgdDE1ID0gYyAgIF4gdDA1OyBcCisgICAgdDE2ID0gdDExIHwgdDEzOyBcCisgICAgdDE3ID0gdDAyIHwgdDE0OyBcCisgICAgdyAgID0gdDE1IF4gdDE3OyBcCisgICAgeSAgID0gYSAgIF4gdDE2OyBcCisgIH0KKworI2RlZmluZSBTQk9YN19JTlZFUlNFKGEsIGIsIGMsIGQsIHcsIHgsIHksIHopIFwKKyAgeyBcCisgICAgdTMyIHQwMiwgdDAzLCB0MDQsIHQwNiwgdDA3LCB0MDgsIHQwOTsgXAorICAgIHUzMiB0MTAsIHQxMSwgdDEzLCB0MTQsIHQxNSwgdDE2LCB0MDE7IFwKKyAgICB0MDEgPSBhICAgJiBiICA7IFwKKyAgICB0MDIgPSBhICAgfCBiICA7IFwKKyAgICB0MDMgPSBjICAgfCB0MDE7IFwKKyAgICB0MDQgPSBkICAgJiB0MDI7IFwKKyAgICB6ICAgPSB0MDMgXiB0MDQ7IFwKKyAgICB0MDYgPSBiICAgXiB0MDQ7IFwKKyAgICB0MDcgPSBkICAgXiB6ICA7IFwKKyAgICB0MDggPSAgICAgfiB0MDc7IFwKKyAgICB0MDkgPSB0MDYgfCB0MDg7IFwKKyAgICB0MTAgPSBiICAgXiBkICA7IFwKKyAgICB0MTEgPSBhICAgfCBkICA7IFwKKyAgICB4ICAgPSBhICAgXiB0MDk7IFwKKyAgICB0MTMgPSBjICAgXiB0MDY7IFwKKyAgICB0MTQgPSBjICAgJiB0MTE7IFwKKyAgICB0MTUgPSBkICAgfCB4ICA7IFwKKyAgICB0MTYgPSB0MDEgfCB0MTA7IFwKKyAgICB3ICAgPSB0MTMgXiB0MTU7IFwKKyAgICB5ICAgPSB0MTQgXiB0MTY7IFwKKyAgfQorCisvKiBYT1IgQkxPQ0sxIGludG8gQkxPQ0swLiAgKi8KKyNkZWZpbmUgQkxPQ0tfWE9SKGJsb2NrMCwgYmxvY2sxKSBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJsb2NrMFswXSBePSBibG9jazFbMF07ICAgICAgIFwKKyAgICBibG9jazBbMV0gXj0gYmxvY2sxWzFdOyAgICAgICBcCisgICAgYmxvY2swWzJdIF49IGJsb2NrMVsyXTsgICAgICAgXAorICAgIGJsb2NrMFszXSBePSBibG9jazFbM107ICAgICAgIFwKKyAgfQorCisvKiBDb3B5IEJMT0NLX1NSQyB0byBCTE9DS19EU1QuICAqLworI2RlZmluZSBCTE9DS19DT1BZKGJsb2NrX2RzdCwgYmxvY2tfc3JjKSBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBibG9ja19kc3RbMF0gPSBibG9ja19zcmNbMF07ICAgICAgICAgXAorICAgIGJsb2NrX2RzdFsxXSA9IGJsb2NrX3NyY1sxXTsgICAgICAgICBcCisgICAgYmxvY2tfZHN0WzJdID0gYmxvY2tfc3JjWzJdOyAgICAgICAgIFwKKyAgICBibG9ja19kc3RbM10gPSBibG9ja19zcmNbM107ICAgICAgICAgXAorICB9CisKKy8qIEFwcGx5IFNCT1ggbnVtYmVyIFdISUNIIHRvIHRvIHRoZSBibG9jayBmb3VuZCBpbiBBUlJBWTAgYXQgaW5kZXgKKyAgIElOREVYLCB3cml0aW5nIHRoZSBvdXRwdXQgdG8gdGhlIGJsb2NrIGZvdW5kIGluIEFSUkFZMSBhdCBpbmRleAorICAgSU5ERVguICAqLworI2RlZmluZSBTQk9YKHdoaWNoLCBhcnJheTAsIGFycmF5MSwgaW5kZXgpICAgICAgICAgICAgXAorICBTQk9YIyN3aGljaCAoYXJyYXkwW2luZGV4ICsgMF0sIGFycmF5MFtpbmRleCArIDFdLCAgXAorICAgICAgICAgICAgICAgYXJyYXkwW2luZGV4ICsgMl0sIGFycmF5MFtpbmRleCArIDNdLCAgXAorICAgICAgICAgICAgICAgYXJyYXkxW2luZGV4ICsgMF0sIGFycmF5MVtpbmRleCArIDFdLCAgXAorICAgICAgICAgICAgICAgYXJyYXkxW2luZGV4ICsgMl0sIGFycmF5MVtpbmRleCArIDNdKTsKKworLyogQXBwbHkgaW52ZXJzZSBTQk9YIG51bWJlciBXSElDSCB0byB0byB0aGUgYmxvY2sgZm91bmQgaW4gQVJSQVkwIGF0CisgICBpbmRleCBJTkRFWCwgd3JpdGluZyB0aGUgb3V0cHV0IHRvIHRoZSBibG9jayBmb3VuZCBpbiBBUlJBWTEgYXQKKyAgIGluZGV4IElOREVYLiAgKi8KKyNkZWZpbmUgU0JPWF9JTlZFUlNFKHdoaWNoLCBhcnJheTAsIGFycmF5MSwgaW5kZXgpICAgICAgICAgICAgICBcCisgIFNCT1gjI3doaWNoIyNfSU5WRVJTRSAoYXJyYXkwW2luZGV4ICsgMF0sIGFycmF5MFtpbmRleCArIDFdLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5MFtpbmRleCArIDJdLCBhcnJheTBbaW5kZXggKyAzXSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheTFbaW5kZXggKyAwXSwgYXJyYXkxW2luZGV4ICsgMV0sICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkxW2luZGV4ICsgMl0sIGFycmF5MVtpbmRleCArIDNdKTsKKworLyogQXBwbHkgdGhlIGxpbmVhciB0cmFuc2Zvcm1hdGlvbiB0byBCTE9DSy4gICovCisjZGVmaW5lIExJTkVBUl9UUkFOU0ZPUk1BVElPTihibG9jaykgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYmxvY2tbMF0gPSByb2wgKGJsb2NrWzBdLCAxMyk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgYmxvY2tbMl0gPSByb2wgKGJsb2NrWzJdLCAzKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgYmxvY2tbMV0gPSBibG9ja1sxXSBeIGJsb2NrWzBdIF4gYmxvY2tbMl07ICAgICAgICBcCisgICAgYmxvY2tbM10gPSBibG9ja1szXSBeIGJsb2NrWzJdIF4gKGJsb2NrWzBdIDw8IDMpOyBcCisgICAgYmxvY2tbMV0gPSByb2wgKGJsb2NrWzFdLCAxKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgYmxvY2tbM10gPSByb2wgKGJsb2NrWzNdLCA3KTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgYmxvY2tbMF0gPSBibG9ja1swXSBeIGJsb2NrWzFdIF4gYmxvY2tbM107ICAgICAgICBcCisgICAgYmxvY2tbMl0gPSBibG9ja1syXSBeIGJsb2NrWzNdIF4gKGJsb2NrWzFdIDw8IDcpOyBcCisgICAgYmxvY2tbMF0gPSByb2wgKGJsb2NrWzBdLCA1KTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgYmxvY2tbMl0gPSByb2wgKGJsb2NrWzJdLCAyMik7ICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworLyogQXBwbHkgdGhlIGludmVyc2UgbGluZWFyIHRyYW5zZm9ybWF0aW9uIHRvIEJMT0NLLiAgKi8KKyNkZWZpbmUgTElORUFSX1RSQU5TRk9STUFUSU9OX0lOVkVSU0UoYmxvY2spICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBibG9ja1syXSA9IHJvciAoYmxvY2tbMl0sIDIyKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBibG9ja1swXSA9IHJvciAoYmxvY2tbMF0gLCA1KTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBibG9ja1syXSA9IGJsb2NrWzJdIF4gYmxvY2tbM10gXiAoYmxvY2tbMV0gPDwgNyk7IFwKKyAgICBibG9ja1swXSA9IGJsb2NrWzBdIF4gYmxvY2tbMV0gXiBibG9ja1szXTsgICAgICAgIFwKKyAgICBibG9ja1szXSA9IHJvciAoYmxvY2tbM10sIDcpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBibG9ja1sxXSA9IHJvciAoYmxvY2tbMV0sIDEpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBibG9ja1szXSA9IGJsb2NrWzNdIF4gYmxvY2tbMl0gXiAoYmxvY2tbMF0gPDwgMyk7IFwKKyAgICBibG9ja1sxXSA9IGJsb2NrWzFdIF4gYmxvY2tbMF0gXiBibG9ja1syXTsgICAgICAgIFwKKyAgICBibG9ja1syXSA9IHJvciAoYmxvY2tbMl0sIDMpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBibG9ja1swXSA9IHJvciAoYmxvY2tbMF0sIDEzKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisvKiBBcHBseSBhIFNlcnBlbnQgcm91bmQgdG8gQkxPQ0ssIHVzaW5nIHRoZSBTQk9YIG51bWJlciBXSElDSCBhbmQgdGhlCisgICBzdWJrZXlzIGNvbnRhaW5lZCBpbiBTVUJLRVlTLiAgVXNlIEJMT0NLX1RNUCBhcyB0ZW1wb3Jhcnkgc3RvcmFnZS4KKyAgIFRoaXMgbWFjcm8gaW5jcmVtZW50cyBgcm91bmQnLiAgKi8KKyNkZWZpbmUgUk9VTkQod2hpY2gsIHN1YmtleXMsIGJsb2NrLCBibG9ja190bXApIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCTE9DS19YT1IgKGJsb2NrLCBzdWJrZXlzW3JvdW5kXSk7ICAgICAgICAgIFwKKyAgICByb3VuZCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTQk9YICh3aGljaCwgYmxvY2ssIGJsb2NrX3RtcCwgMCk7ICAgICAgICAgIFwKKyAgICBMSU5FQVJfVFJBTlNGT1JNQVRJT04gKGJsb2NrX3RtcCk7ICAgICAgICAgIFwKKyAgICBCTE9DS19DT1BZIChibG9jaywgYmxvY2tfdG1wKTsgICAgICAgICAgICAgIFwKKyAgfQorCisvKiBBcHBseSB0aGUgbGFzdCBTZXJwZW50IHJvdW5kIHRvIEJMT0NLLCB1c2luZyB0aGUgU0JPWCBudW1iZXIgV0hJQ0gKKyAgIGFuZCB0aGUgc3Via2V5cyBjb250YWluZWQgaW4gU1VCS0VZUy4gIFVzZSBCTE9DS19UTVAgYXMgdGVtcG9yYXJ5CisgICBzdG9yYWdlLiAgVGhlIHJlc3VsdCB3aWxsIGJlIHN0b3JlZCBpbiBCTE9DS19UTVAuICBUaGlzIG1hY3JvCisgICBpbmNyZW1lbnRzIGByb3VuZCcuICAqLworI2RlZmluZSBST1VORF9MQVNUKHdoaWNoLCBzdWJrZXlzLCBibG9jaywgYmxvY2tfdG1wKSBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCTE9DS19YT1IgKGJsb2NrLCBzdWJrZXlzW3JvdW5kXSk7ICAgICAgICAgICAgICAgXAorICAgIHJvdW5kKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU0JPWCAod2hpY2gsIGJsb2NrLCBibG9ja190bXAsIDApOyAgICAgICAgICAgICAgIFwKKyAgICBCTE9DS19YT1IgKGJsb2NrX3RtcCwgc3Via2V5c1tyb3VuZF0pOyAgICAgICAgICAgXAorICAgIHJvdW5kKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworLyogQXBwbHkgYW4gaW52ZXJzZSBTZXJwZW50IHJvdW5kIHRvIEJMT0NLLCB1c2luZyB0aGUgU0JPWCBudW1iZXIKKyAgIFdISUNIIGFuZCB0aGUgc3Via2V5cyBjb250YWluZWQgaW4gU1VCS0VZUy4gIFVzZSBCTE9DS19UTVAgYXMKKyAgIHRlbXBvcmFyeSBzdG9yYWdlLiAgVGhpcyBtYWNybyBpbmNyZW1lbnRzIGByb3VuZCcuICAqLworI2RlZmluZSBST1VORF9JTlZFUlNFKHdoaWNoLCBzdWJrZXksIGJsb2NrLCBibG9ja190bXApIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTElORUFSX1RSQU5TRk9STUFUSU9OX0lOVkVSU0UgKGJsb2NrKTsgICAgICAgICAgICAgXAorICAgIFNCT1hfSU5WRVJTRSAod2hpY2gsIGJsb2NrLCBibG9ja190bXAsIDApOyAgICAgICAgIFwKKyAgICBCTE9DS19YT1IgKGJsb2NrX3RtcCwgc3Via2V5W3JvdW5kXSk7ICAgICAgICAgICAgICBcCisgICAgcm91bmQtLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEJMT0NLX0NPUFkgKGJsb2NrLCBibG9ja190bXApOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisvKiBBcHBseSB0aGUgZmlyc3QgU2VycGVudCByb3VuZCB0byBCTE9DSywgdXNpbmcgdGhlIFNCT1ggbnVtYmVyIFdISUNICisgICBhbmQgdGhlIHN1YmtleXMgY29udGFpbmVkIGluIFNVQktFWVMuICBVc2UgQkxPQ0tfVE1QIGFzIHRlbXBvcmFyeQorICAgc3RvcmFnZS4gIFRoZSByZXN1bHQgd2lsbCBiZSBzdG9yZWQgaW4gQkxPQ0tfVE1QLiAgVGhpcyBtYWNybworICAgaW5jcmVtZW50cyBgcm91bmQnLiAgKi8KKyNkZWZpbmUgUk9VTkRfRklSU1RfSU5WRVJTRSh3aGljaCwgc3Via2V5cywgYmxvY2ssIGJsb2NrX3RtcCkgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQkxPQ0tfWE9SIChibG9jaywgc3Via2V5c1tyb3VuZF0pOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByb3VuZC0tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNCT1hfSU5WRVJTRSAod2hpY2gsIGJsb2NrLCBibG9ja190bXAsIDApOyAgICAgICAgICAgICAgICBcCisgICAgQkxPQ0tfWE9SIChibG9ja190bXAsIHN1YmtleXNbcm91bmRdKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICByb3VuZC0tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKy8qIENvbnZlcnQgdGhlIHVzZXIgcHJvdmlkZWQga2V5IEtFWSBvZiBLRVlfTEVOR1RIIGJ5dGVzIGludG8gdGhlCisgICBpbnRlcm5hbGx5IHVzZWQgZm9ybWF0LiAgKi8KK3N0YXRpYyB2b2lkCitzZXJwZW50X2tleV9wcmVwYXJlIChjb25zdCBieXRlICprZXksIHVuc2lnbmVkIGludCBrZXlfbGVuZ3RoLAorCQkgICAgIHNlcnBlbnRfa2V5X3Qga2V5X3ByZXBhcmVkKQoreworICBpbnQgaTsKKworICAvKiBDb3B5IGtleS4gICovCisgIGZvciAoaSA9IDA7IGkgPCBrZXlfbGVuZ3RoIC8gNDsgaSsrKQorICAgIHsKKyNpZmRlZiBXT1JEU19CSUdFTkRJQU4KKyAgICAgIGtleV9wcmVwYXJlZFtpXSA9IGJ5dGVfc3dhcF8zMiAoKCh1MzIgKikga2V5KVtpXSk7CisjZWxzZQorICAgICAga2V5X3ByZXBhcmVkW2ldID0gKCh1MzIgKikga2V5KVtpXTsKKyNlbmRpZgorICAgIH0KKworICBpZiAoaSA8IDgpCisgICAgeworICAgICAgLyogS2V5IG11c3QgYmUgcGFkZGVkIGFjY29yZGluZyB0byB0aGUgU2VycGVudAorCSBzcGVjaWZpY2F0aW9uLiAgKi8KKyAgICAgIGtleV9wcmVwYXJlZFtpXSA9IDB4MDAwMDAwMDE7CisKKyAgICAgIGZvciAoaSsrOyBpIDwgODsgaSsrKQorCWtleV9wcmVwYXJlZFtpXSA9IDA7CisgICAgfQorfQorCisvKiBEZXJpdmUgdGhlIDMzIHN1YmtleXMgZnJvbSBLRVkgYW5kIHN0b3JlIHRoZW0gaW4gU1VCS0VZUy4gICovCitzdGF0aWMgdm9pZAorc2VycGVudF9zdWJrZXlzX2dlbmVyYXRlIChzZXJwZW50X2tleV90IGtleSwgc2VycGVudF9zdWJrZXlzX3Qgc3Via2V5cykKK3sKKyAgdTMyIHdfcmVhbFsxNDBdOwkJLyogVGhlIGBwcmVrZXknLiAgKi8KKyAgdTMyIGtbMTMyXTsKKyAgdTMyICp3ID0gJndfcmVhbFs4XTsKKyAgaW50IGksIGo7CisKKyAgLyogSW5pdGlhbGl6ZSB3aXRoIGtleSB2YWx1ZXMuICAqLworICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgIHdbaSAtIDhdID0ga2V5W2ldOworCisgIC8qIEV4cGFuZCB0byBpbnRlcm1lZGlhdGUga2V5IHVzaW5nIHRoZSBhZmZpbmUgcmVjdXJyZW5jZS4gICovCisgIGZvciAoaSA9IDA7IGkgPCAxMzI7IGkrKykKKyAgICB3W2ldID0gcm9sICh3W2kgLSA4XSBeIHdbaSAtIDVdIF4gd1tpIC0gM10gXiB3W2kgLSAxXSBeIFBISSBeIGksIDExKTsKKworICAvKiBDYWxjdWxhdGUgc3Via2V5cyB2aWEgUy1Cb3hlcywgaW4gYml0c2xpY2UgbW9kZS4gICovCisgIFNCT1ggKDMsIHcsIGssICAgMCk7CisgIFNCT1ggKDIsIHcsIGssICAgNCk7CisgIFNCT1ggKDEsIHcsIGssICAgOCk7CisgIFNCT1ggKDAsIHcsIGssICAxMik7CisgIFNCT1ggKDcsIHcsIGssICAxNik7CisgIFNCT1ggKDYsIHcsIGssICAyMCk7CisgIFNCT1ggKDUsIHcsIGssICAyNCk7CisgIFNCT1ggKDQsIHcsIGssICAyOCk7CisgIFNCT1ggKDMsIHcsIGssICAzMik7CisgIFNCT1ggKDIsIHcsIGssICAzNik7CisgIFNCT1ggKDEsIHcsIGssICA0MCk7CisgIFNCT1ggKDAsIHcsIGssICA0NCk7CisgIFNCT1ggKDcsIHcsIGssICA0OCk7CisgIFNCT1ggKDYsIHcsIGssICA1Mik7CisgIFNCT1ggKDUsIHcsIGssICA1Nik7CisgIFNCT1ggKDQsIHcsIGssICA2MCk7CisgIFNCT1ggKDMsIHcsIGssICA2NCk7CisgIFNCT1ggKDIsIHcsIGssICA2OCk7CisgIFNCT1ggKDEsIHcsIGssICA3Mik7CisgIFNCT1ggKDAsIHcsIGssICA3Nik7CisgIFNCT1ggKDcsIHcsIGssICA4MCk7CisgIFNCT1ggKDYsIHcsIGssICA4NCk7CisgIFNCT1ggKDUsIHcsIGssICA4OCk7CisgIFNCT1ggKDQsIHcsIGssICA5Mik7CisgIFNCT1ggKDMsIHcsIGssICA5Nik7CisgIFNCT1ggKDIsIHcsIGssIDEwMCk7CisgIFNCT1ggKDEsIHcsIGssIDEwNCk7CisgIFNCT1ggKDAsIHcsIGssIDEwOCk7CisgIFNCT1ggKDcsIHcsIGssIDExMik7CisgIFNCT1ggKDYsIHcsIGssIDExNik7CisgIFNCT1ggKDUsIHcsIGssIDEyMCk7CisgIFNCT1ggKDQsIHcsIGssIDEyNCk7CisgIFNCT1ggKDMsIHcsIGssIDEyOCk7CisKKyAgLyogUmVudW1iZXIgc3Via2V5cy4gICovCisgIGZvciAoaSA9IDA7IGkgPCBST1VORFMgKyAxOyBpKyspCisgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKyAgICAgIHN1YmtleXNbaV1bal0gPSBrWzQgKiBpICsgal07Cit9CisKKy8qIEluaXRpYWxpemUgQ09OVEVYVCB3aXRoIHRoZSBrZXkgS0VZIG9mIEtFWV9MRU5HVEggYml0cy4gICovCitzdGF0aWMgdm9pZAorc2VycGVudF9zZXRrZXlfaW50ZXJuYWwgKHNlcnBlbnRfY29udGV4dF90ICpjb250ZXh0LAorCQkJIGNvbnN0IGJ5dGUgKmtleSwgdW5zaWduZWQgaW50IGtleV9sZW5ndGgpCit7CisgIHNlcnBlbnRfa2V5X3Qga2V5X3ByZXBhcmVkOworCisgIHNlcnBlbnRfa2V5X3ByZXBhcmUgKGtleSwga2V5X2xlbmd0aCwga2V5X3ByZXBhcmVkKTsKKyAgc2VycGVudF9zdWJrZXlzX2dlbmVyYXRlIChrZXlfcHJlcGFyZWQsIGNvbnRleHQtPmtleXMpOworICBfZ2NyeV9idXJuX3N0YWNrICgyNzIgKiBzaXplb2YgKHUzMikpOworfQorCisvKiBJbml0aWFsaXplIENUWCB3aXRoIHRoZSBrZXkgS0VZIG9mIEtFWV9MRU5HVEggYnl0ZXMuICAqLworc3RhdGljIGdjcnlfZXJyX2NvZGVfdAorc2VycGVudF9zZXRrZXkgKHZvaWQgKmN0eCwKKwkJY29uc3QgYnl0ZSAqa2V5LCB1bnNpZ25lZCBpbnQga2V5X2xlbmd0aCkKK3sKKyAgc2VycGVudF9jb250ZXh0X3QgKmNvbnRleHQgPSBjdHg7CisgIHN0YXRpYyBjb25zdCBjaGFyICpzZXJwZW50X3Rlc3RfcmV0OworICBzdGF0aWMgaW50IHNlcnBlbnRfaW5pdF9kb25lOworICBnY3J5X2Vycl9jb2RlX3QgcmV0ID0gR1BHX0VSUl9OT19FUlJPUjsKKyAgCisgIGlmICghIHNlcnBlbnRfaW5pdF9kb25lKQorICAgIHsKKyAgICAgIC8qIEV4ZWN1dGUgYSBzZWxmLXRlc3QgdGhlIGZpcnN0IHRpbWUsIFNlcnBlbnQgaXMgdXNlZC4gICovCisgICAgICBzZXJwZW50X3Rlc3RfcmV0ID0gc2VycGVudF90ZXN0ICgpOworICAgICAgaWYgKHNlcnBlbnRfdGVzdF9yZXQpCisJbG9nX2Vycm9yICgiU2VycGVudCB0ZXN0IGZhaWx1cmU6ICVzXG4iLCBzZXJwZW50X3Rlc3RfcmV0KTsKKyAgICAgIHNlcnBlbnRfaW5pdF9kb25lID0gMTsKKyAgICB9CisKKyAgaWYgKHNlcnBlbnRfdGVzdF9yZXQpCisgICAgcmV0ID0gR1BHX0VSUl9TRUxGVEVTVF9GQUlMRUQ7CisgIGVsc2UKKyAgICB7CisgICAgICBzZXJwZW50X3NldGtleV9pbnRlcm5hbCAoY29udGV4dCwga2V5LCBrZXlfbGVuZ3RoKTsKKyAgICAgIF9nY3J5X2J1cm5fc3RhY2sgKHNpemVvZiAoc2VycGVudF9rZXlfdCkpOworICAgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorc2VycGVudF9lbmNyeXB0X2ludGVybmFsIChzZXJwZW50X2NvbnRleHRfdCAqY29udGV4dCwKKwkJCSAgY29uc3Qgc2VycGVudF9ibG9ja190IGlucHV0LCBzZXJwZW50X2Jsb2NrX3Qgb3V0cHV0KQoreworICBzZXJwZW50X2Jsb2NrX3QgYiwgYl9uZXh0OworICBpbnQgcm91bmQgPSAwOworCisjaWZkZWYgV09SRFNfQklHRU5ESUFOCisgIGJbMF0gPSBieXRlX3N3YXBfMzIgKGlucHV0WzBdKTsKKyAgYlsxXSA9IGJ5dGVfc3dhcF8zMiAoaW5wdXRbMV0pOworICBiWzJdID0gYnl0ZV9zd2FwXzMyIChpbnB1dFsyXSk7CisgIGJbM10gPSBieXRlX3N3YXBfMzIgKGlucHV0WzNdKTsKKyNlbHNlCisgIGJbMF0gPSBpbnB1dFswXTsKKyAgYlsxXSA9IGlucHV0WzFdOworICBiWzJdID0gaW5wdXRbMl07CisgIGJbM10gPSBpbnB1dFszXTsKKyNlbmRpZgorCisgIFJPVU5EICgwLCBjb250ZXh0LT5rZXlzLCBiLCBiX25leHQpOworICBST1VORCAoMSwgY29udGV4dC0+a2V5cywgYiwgYl9uZXh0KTsKKyAgUk9VTkQgKDIsIGNvbnRleHQtPmtleXMsIGIsIGJfbmV4dCk7CisgIFJPVU5EICgzLCBjb250ZXh0LT5rZXlzLCBiLCBiX25leHQpOworICBST1VORCAoNCwgY29udGV4dC0+a2V5cywgYiwgYl9uZXh0KTsKKyAgUk9VTkQgKDUsIGNvbnRleHQtPmtleXMsIGIsIGJfbmV4dCk7CisgIFJPVU5EICg2LCBjb250ZXh0LT5rZXlzLCBiLCBiX25leHQpOworICBST1VORCAoNywgY29udGV4dC0+a2V5cywgYiwgYl9uZXh0KTsKKyAgUk9VTkQgKDAsIGNvbnRleHQtPmtleXMsIGIsIGJfbmV4dCk7CisgIFJPVU5EICgxLCBjb250ZXh0LT5rZXlzLCBiLCBiX25leHQpOworICBST1VORCAoMiwgY29udGV4dC0+a2V5cywgYiwgYl9uZXh0KTsKKyAgUk9VTkQgKDMsIGNvbnRleHQtPmtleXMsIGIsIGJfbmV4dCk7CisgIFJPVU5EICg0LCBjb250ZXh0LT5rZXlzLCBiLCBiX25leHQpOworICBST1VORCAoNSwgY29udGV4dC0+a2V5cywgYiwgYl9uZXh0KTsKKyAgUk9VTkQgKDYsIGNvbnRleHQtPmtleXMsIGIsIGJfbmV4dCk7CisgIFJPVU5EICg3LCBjb250ZXh0LT5rZXlzLCBiLCBiX25leHQpOworICBST1VORCAoMCwgY29udGV4dC0+a2V5cywgYiwgYl9uZXh0KTsKKyAgUk9VTkQgKDEsIGNvbnRleHQtPmtleXMsIGIsIGJfbmV4dCk7CisgIFJPVU5EICgyLCBjb250ZXh0LT5rZXlzLCBiLCBiX25leHQpOworICBST1VORCAoMywgY29udGV4dC0+a2V5cywgYiwgYl9uZXh0KTsKKyAgUk9VTkQgKDQsIGNvbnRleHQtPmtleXMsIGIsIGJfbmV4dCk7CisgIFJPVU5EICg1LCBjb250ZXh0LT5rZXlzLCBiLCBiX25leHQpOworICBST1VORCAoNiwgY29udGV4dC0+a2V5cywgYiwgYl9uZXh0KTsKKyAgUk9VTkQgKDcsIGNvbnRleHQtPmtleXMsIGIsIGJfbmV4dCk7CisgIFJPVU5EICgwLCBjb250ZXh0LT5rZXlzLCBiLCBiX25leHQpOworICBST1VORCAoMSwgY29udGV4dC0+a2V5cywgYiwgYl9uZXh0KTsKKyAgUk9VTkQgKDIsIGNvbnRleHQtPmtleXMsIGIsIGJfbmV4dCk7CisgIFJPVU5EICgzLCBjb250ZXh0LT5rZXlzLCBiLCBiX25leHQpOworICBST1VORCAoNCwgY29udGV4dC0+a2V5cywgYiwgYl9uZXh0KTsKKyAgUk9VTkQgKDUsIGNvbnRleHQtPmtleXMsIGIsIGJfbmV4dCk7CisgIFJPVU5EICg2LCBjb250ZXh0LT5rZXlzLCBiLCBiX25leHQpOworCisgIFJPVU5EX0xBU1QgKDcsIGNvbnRleHQtPmtleXMsIGIsIGJfbmV4dCk7CisKKyNpZmRlZiBXT1JEU19CSUdFTkRJQU4KKyAgb3V0cHV0WzBdID0gYnl0ZV9zd2FwXzMyIChiX25leHRbMF0pOworICBvdXRwdXRbMV0gPSBieXRlX3N3YXBfMzIgKGJfbmV4dFsxXSk7CisgIG91dHB1dFsyXSA9IGJ5dGVfc3dhcF8zMiAoYl9uZXh0WzJdKTsKKyAgb3V0cHV0WzNdID0gYnl0ZV9zd2FwXzMyIChiX25leHRbM10pOworI2Vsc2UKKyAgb3V0cHV0WzBdID0gYl9uZXh0WzBdOworICBvdXRwdXRbMV0gPSBiX25leHRbMV07CisgIG91dHB1dFsyXSA9IGJfbmV4dFsyXTsKKyAgb3V0cHV0WzNdID0gYl9uZXh0WzNdOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCitzZXJwZW50X2RlY3J5cHRfaW50ZXJuYWwgKHNlcnBlbnRfY29udGV4dF90ICpjb250ZXh0LAorCQkJICBjb25zdCBzZXJwZW50X2Jsb2NrX3QgaW5wdXQsIHNlcnBlbnRfYmxvY2tfdCBvdXRwdXQpCit7CisgIHNlcnBlbnRfYmxvY2tfdCBiLCBiX25leHQ7CisgIGludCByb3VuZCA9IFJPVU5EUzsKKworI2lmZGVmIFdPUkRTX0JJR0VORElBTgorICBiX25leHRbMF0gPSBieXRlX3N3YXBfMzIgKGlucHV0WzBdKTsKKyAgYl9uZXh0WzFdID0gYnl0ZV9zd2FwXzMyIChpbnB1dFsxXSk7CisgIGJfbmV4dFsyXSA9IGJ5dGVfc3dhcF8zMiAoaW5wdXRbMl0pOworICBiX25leHRbM10gPSBieXRlX3N3YXBfMzIgKGlucHV0WzNdKTsKKyNlbHNlCisgIGJfbmV4dFswXSA9IGlucHV0WzBdOworICBiX25leHRbMV0gPSBpbnB1dFsxXTsKKyAgYl9uZXh0WzJdID0gaW5wdXRbMl07CisgIGJfbmV4dFszXSA9IGlucHV0WzNdOworI2VuZGlmCisKKyAgUk9VTkRfRklSU1RfSU5WRVJTRSAoNywgY29udGV4dC0+a2V5cywgYl9uZXh0LCBiKTsKKworICBST1VORF9JTlZFUlNFICg2LCBjb250ZXh0LT5rZXlzLCBiLCBiX25leHQpOworICBST1VORF9JTlZFUlNFICg1LCBjb250ZXh0LT5rZXlzLCBiLCBiX25leHQpOworICBST1VORF9JTlZFUlNFICg0LCBjb250ZXh0LT5rZXlzLCBiLCBiX25leHQpOworICBST1VORF9JTlZFUlNFICgzLCBjb250ZXh0LT5rZXlzLCBiLCBiX25leHQpOworICBST1VORF9JTlZFUlNFICgyLCBjb250ZXh0LT5rZXlzLCBiLCBiX25leHQpOworICBST1VORF9JTlZFUlNFICgxLCBjb250ZXh0LT5rZXlzLCBiLCBiX25leHQpOworICBST1VORF9JTlZFUlNFICgwLCBjb250ZXh0LT5rZXlzLCBiLCBiX25leHQpOworICBST1VORF9JTlZFUlNFICg3LCBjb250ZXh0LT5rZXlzLCBiLCBiX25leHQpOworICBST1VORF9JTlZFUlNFICg2LCBjb250ZXh0LT5rZXlzLCBiLCBiX25leHQpOworICBST1VORF9JTlZFUlNFICg1LCBjb250ZXh0LT5rZXlzLCBiLCBiX25leHQpOworICBST1VORF9JTlZFUlNFICg0LCBjb250ZXh0LT5rZXlzLCBiLCBiX25leHQpOworICBST1VORF9JTlZFUlNFICgzLCBjb250ZXh0LT5rZXlzLCBiLCBiX25leHQpOworICBST1VORF9JTlZFUlNFICgyLCBjb250ZXh0LT5rZXlzLCBiLCBiX25leHQpOworICBST1VORF9JTlZFUlNFICgxLCBjb250ZXh0LT5rZXlzLCBiLCBiX25leHQpOworICBST1VORF9JTlZFUlNFICgwLCBjb250ZXh0LT5rZXlzLCBiLCBiX25leHQpOworICBST1VORF9JTlZFUlNFICg3LCBjb250ZXh0LT5rZXlzLCBiLCBiX25leHQpOworICBST1VORF9JTlZFUlNFICg2LCBjb250ZXh0LT5rZXlzLCBiLCBiX25leHQpOworICBST1VORF9JTlZFUlNFICg1LCBjb250ZXh0LT5rZXlzLCBiLCBiX25leHQpOworICBST1VORF9JTlZFUlNFICg0LCBjb250ZXh0LT5rZXlzLCBiLCBiX25leHQpOworICBST1VORF9JTlZFUlNFICgzLCBjb250ZXh0LT5rZXlzLCBiLCBiX25leHQpOworICBST1VORF9JTlZFUlNFICgyLCBjb250ZXh0LT5rZXlzLCBiLCBiX25leHQpOworICBST1VORF9JTlZFUlNFICgxLCBjb250ZXh0LT5rZXlzLCBiLCBiX25leHQpOworICBST1VORF9JTlZFUlNFICgwLCBjb250ZXh0LT5rZXlzLCBiLCBiX25leHQpOworICBST1VORF9JTlZFUlNFICg3LCBjb250ZXh0LT5rZXlzLCBiLCBiX25leHQpOworICBST1VORF9JTlZFUlNFICg2LCBjb250ZXh0LT5rZXlzLCBiLCBiX25leHQpOworICBST1VORF9JTlZFUlNFICg1LCBjb250ZXh0LT5rZXlzLCBiLCBiX25leHQpOworICBST1VORF9JTlZFUlNFICg0LCBjb250ZXh0LT5rZXlzLCBiLCBiX25leHQpOworICBST1VORF9JTlZFUlNFICgzLCBjb250ZXh0LT5rZXlzLCBiLCBiX25leHQpOworICBST1VORF9JTlZFUlNFICgyLCBjb250ZXh0LT5rZXlzLCBiLCBiX25leHQpOworICBST1VORF9JTlZFUlNFICgxLCBjb250ZXh0LT5rZXlzLCBiLCBiX25leHQpOworICBST1VORF9JTlZFUlNFICgwLCBjb250ZXh0LT5rZXlzLCBiLCBiX25leHQpOworCisKKyNpZmRlZiBXT1JEU19CSUdFTkRJQU4KKyAgb3V0cHV0WzBdID0gYnl0ZV9zd2FwXzMyIChiX25leHRbMF0pOworICBvdXRwdXRbMV0gPSBieXRlX3N3YXBfMzIgKGJfbmV4dFsxXSk7CisgIG91dHB1dFsyXSA9IGJ5dGVfc3dhcF8zMiAoYl9uZXh0WzJdKTsKKyAgb3V0cHV0WzNdID0gYnl0ZV9zd2FwXzMyIChiX25leHRbM10pOworI2Vsc2UKKyAgb3V0cHV0WzBdID0gYl9uZXh0WzBdOworICBvdXRwdXRbMV0gPSBiX25leHRbMV07CisgIG91dHB1dFsyXSA9IGJfbmV4dFsyXTsKKyAgb3V0cHV0WzNdID0gYl9uZXh0WzNdOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCitzZXJwZW50X2VuY3J5cHQgKHZvaWQgKmN0eCwgYnl0ZSAqYnVmZmVyX291dCwgY29uc3QgYnl0ZSAqYnVmZmVyX2luKQoreworICBzZXJwZW50X2NvbnRleHRfdCAqY29udGV4dCA9IGN0eDsKKworICBzZXJwZW50X2VuY3J5cHRfaW50ZXJuYWwgKGNvbnRleHQsCisJCQkgICAgKGNvbnN0IHUzMiAqKSBidWZmZXJfaW4sICh1MzIgKikgYnVmZmVyX291dCk7CisgIF9nY3J5X2J1cm5fc3RhY2sgKDIgKiBzaXplb2YgKHNlcnBlbnRfYmxvY2tfdCkpOworfQorCitzdGF0aWMgdm9pZAorc2VycGVudF9kZWNyeXB0ICh2b2lkICpjdHgsIGJ5dGUgKmJ1ZmZlcl9vdXQsIGNvbnN0IGJ5dGUgKmJ1ZmZlcl9pbikKK3sKKyAgc2VycGVudF9jb250ZXh0X3QgKmNvbnRleHQgPSBjdHg7CisKKyAgc2VycGVudF9kZWNyeXB0X2ludGVybmFsIChjb250ZXh0LAorCQkJICAgIChjb25zdCB1MzIgKikgYnVmZmVyX2luLAorCQkJICAgICh1MzIgKikgYnVmZmVyX291dCk7CisgIF9nY3J5X2J1cm5fc3RhY2sgKDIgKiBzaXplb2YgKHNlcnBlbnRfYmxvY2tfdCkpOworfQorCisMCisKKy8qIFNlcnBlbnQgdGVzdC4gICovCisKK3N0YXRpYyBjb25zdCBjaGFyICoKK3NlcnBlbnRfdGVzdCAodm9pZCkKK3sKKyAgc2VycGVudF9jb250ZXh0X3QgY29udGV4dDsKKyAgdW5zaWduZWQgY2hhciBzY3JhdGNoWzE2XTsKKyAgdW5zaWduZWQgaW50IGk7CisKKyAgc3RhdGljIHN0cnVjdCB0ZXN0CisgIHsKKyAgICBpbnQga2V5X2xlbmd0aDsKKyAgICB1bnNpZ25lZCBjaGFyIGtleVszMl07CisgICAgdW5zaWduZWQgY2hhciB0ZXh0X3BsYWluWzE2XTsKKyAgICB1bnNpZ25lZCBjaGFyIHRleHRfY2lwaGVyWzE2XTsKKyAgfSB0ZXN0X2RhdGFbXSA9CisgICAgeworICAgICAgeworCTE2LAorCSJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKKwkiXHhEMlx4OURceDU3XHg2Rlx4Q0VceEEzXHhBM1x4QTdceEVEXHg5MFx4OTlceEYyXHg5Mlx4NzNceEQ3XHg4RSIsCisJIlx4QjJceDI4XHg4Qlx4OTZceDhBXHhFOFx4QjBceDg2XHg0OFx4RDFceENFXHg5Nlx4MDZceEZEXHg5OVx4MkQiCisgICAgICB9LAorICAgICAgeworCTI0LAorCSJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorCSJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsCisJIlx4RDJceDlEXHg1N1x4NkZceENFXHhBQlx4QTNceEE3XHhFRFx4OThceDk5XHhGMlx4OTJceDdCXHhEN1x4OEUiLAorCSJceDEzXHgwRVx4MzVceDNFXHgxMFx4MzdceEMyXHgyNFx4MDVceEU4XHhGQVx4RUZceEIyXHhDM1x4QzNceEU5IgorICAgICAgfSwKKyAgICAgIHsKKwkzMiwKKwkiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKKwkiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsCisJIlx4RDBceDk1XHg1N1x4NkZceENFXHhBM1x4RTNceEE3XHhFRFx4OThceEQ5XHhGMlx4OTBceDczXHhEN1x4OEUiLAorCSJceEI5XHgwRVx4RTVceDg2XHgyRFx4RTZceDkxXHg2OFx4RjJceEJEXHhENVx4MTJceDVCXHg0NVx4NDdceDJCIgorICAgICAgfSwKKyAgICAgIHsKKwkzMiwKKwkiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKKwkiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsCisJIlx4MDBceDAwXHgwMFx4MDBceDAxXHgwMFx4MDBceDAwXHgwMlx4MDBceDAwXHgwMFx4MDNceDAwXHgwMFx4MDAiLAorCSJceDIwXHg2MVx4QTRceDI3XHg4Mlx4QkRceDUyXHhFQ1x4NjlceDFFXHhDM1x4ODNceEIwXHgzQlx4QTdceDdDIgorICAgICAgfSwKKyAgICAgIHsKKwkwCisgICAgICB9LAorICAgIH07CisKKyAgZm9yIChpID0gMDsgdGVzdF9kYXRhW2ldLmtleV9sZW5ndGg7IGkrKykKKyAgICB7CisgICAgICBzZXJwZW50X3NldGtleV9pbnRlcm5hbCAoJmNvbnRleHQsIHRlc3RfZGF0YVtpXS5rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9kYXRhW2ldLmtleV9sZW5ndGgpOworICAgICAgc2VycGVudF9lbmNyeXB0X2ludGVybmFsICgmY29udGV4dCwKKwkJCQkoY29uc3QgdTMyICopIHRlc3RfZGF0YVtpXS50ZXh0X3BsYWluLAorCQkJCSh1MzIgKikgc2NyYXRjaCk7CisKKyAgICAgIGlmIChtZW1jbXAgKHNjcmF0Y2gsIHRlc3RfZGF0YVtpXS50ZXh0X2NpcGhlciwgc2l6ZW9mIChzZXJwZW50X2Jsb2NrX3QpKSkKKwlzd2l0Y2ggKHRlc3RfZGF0YVtpXS5rZXlfbGVuZ3RoKQorCSAgeworCSAgY2FzZSAxNjoKKwkgICAgcmV0dXJuICJTZXJwZW50LTEyOCB0ZXN0IGVuY3J5cHRpb24gZmFpbGVkLiI7CisJICBjYXNlICAyNDoKKwkgICAgcmV0dXJuICJTZXJwZW50LTE5MiB0ZXN0IGVuY3J5cHRpb24gZmFpbGVkLiI7CisJICBjYXNlIDMyOgorCSAgICByZXR1cm4gIlNlcnBlbnQtMjU2IHRlc3QgZW5jcnlwdGlvbiBmYWlsZWQuIjsKKwkgIH0KKworICAgIHNlcnBlbnRfZGVjcnlwdF9pbnRlcm5hbCAoJmNvbnRleHQsCisJCQkgICAgICAoY29uc3QgdTMyICopIHRlc3RfZGF0YVtpXS50ZXh0X2NpcGhlciwKKwkJCSAgICAgICh1MzIgKikgc2NyYXRjaCk7CisgICAgaWYgKG1lbWNtcCAoc2NyYXRjaCwgdGVzdF9kYXRhW2ldLnRleHRfcGxhaW4sIHNpemVvZiAoc2VycGVudF9ibG9ja190KSkpCisgICAgICBzd2l0Y2ggKHRlc3RfZGF0YVtpXS5rZXlfbGVuZ3RoKQorCXsKKwljYXNlIDE2OgorCSAgcmV0dXJuICJTZXJwZW50LTEyOCB0ZXN0IGRlY3J5cHRpb24gZmFpbGVkLiI7CisJY2FzZSAgMjQ6CisJICByZXR1cm4gIlNlcnBlbnQtMTkyIHRlc3QgZGVjcnlwdGlvbiBmYWlsZWQuIjsKKwljYXNlIDMyOgorCSAgcmV0dXJuICJTZXJwZW50LTI1NiB0ZXN0IGRlY3J5cHRpb24gZmFpbGVkLiI7CisJfQorICAgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworDAorCisvKiAiU0VSUEVOVCIgaXMgYW4gYWxpYXMgZm9yICJTRVJQRU5UMTI4Ii4gICovCitzdGF0aWMgY29uc3QgY2hhciAqY2lwaGVyX3NwZWNfc2VycGVudDEyOF9hbGlhc2VzW10gPQorICB7CisgICAgIlNFUlBFTlQiLAorICAgIE5VTEwKKyAgfTsKKworZ2NyeV9jaXBoZXJfc3BlY190IF9nY3J5X2NpcGhlcl9zcGVjX3NlcnBlbnQxMjggPQorICB7CisgICAgIlNFUlBFTlQxMjgiLCBjaXBoZXJfc3BlY19zZXJwZW50MTI4X2FsaWFzZXMsIE5VTEwsIDE2LCAxMjgsCisgICAgc2l6ZW9mIChzZXJwZW50X2NvbnRleHRfdCksCisgICAgc2VycGVudF9zZXRrZXksIHNlcnBlbnRfZW5jcnlwdCwgc2VycGVudF9kZWNyeXB0CisgIH07CisKK2djcnlfY2lwaGVyX3NwZWNfdCBfZ2NyeV9jaXBoZXJfc3BlY19zZXJwZW50MTkyID0KKyAgeworICAgICJTRVJQRU5UMTkyIiwgTlVMTCwgTlVMTCwgMTYsIDE5MiwKKyAgICBzaXplb2YgKHNlcnBlbnRfY29udGV4dF90KSwKKyAgICBzZXJwZW50X3NldGtleSwgc2VycGVudF9lbmNyeXB0LCBzZXJwZW50X2RlY3J5cHQKKyAgfTsKKworZ2NyeV9jaXBoZXJfc3BlY190IF9nY3J5X2NpcGhlcl9zcGVjX3NlcnBlbnQyNTYgPQorICB7CisgICAgIlNFUlBFTlQyNTYiLCBOVUxMLCBOVUxMLCAxNiwgMjU2LAorICAgIHNpemVvZiAoc2VycGVudF9jb250ZXh0X3QpLAorICAgIHNlcnBlbnRfc2V0a2V5LCBzZXJwZW50X2VuY3J5cHQsIHNlcnBlbnRfZGVjcnlwdAorICB9OwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L2NpcGhlci9zaGExLmMgYi9saWJnY3J5cHQtMS40LjYvY2lwaGVyL3NoYTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODYyYzY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L2NpcGhlci9zaGExLmMKQEAgLTAsMCArMSw0NzkgQEAKKy8qIHNoYTEuYyAtIFNIQTEgaGFzaCBmdW5jdGlvbgorICogQ29weXJpZ2h0IChDKSAxOTk4LCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisKKy8qICBUZXN0IHZlY3RvcnM6CisgKgorICogICJhYmMiCisgKiAgQTk5OSAzRTM2IDQ3MDYgODE2QSBCQTNFICAyNTcxIDc4NTAgQzI2QyA5Q0QwIEQ4OUQKKyAqCisgKiAgImFiY2RiY2RlY2RlZmRlZmdlZmdoZmdoaWdoaWpoaWpraWprbGprbG1rbG1ubG1ub21ub3Bub3BxIgorICogIDg0OTggM0U0NCAxQzNCIEQyNkUgQkFBRSAgNEFBMSBGOTUxIDI5RTUgRTU0NiA3MEYxCisgKi8KKworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZmRlZiBIQVZFX1NURElOVF9IIAorIyBpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZzEwbGliLmgiCisjaW5jbHVkZSAibWVtb3J5LmgiCisjaW5jbHVkZSAiYml0aGVscC5oIgorI2luY2x1ZGUgImNpcGhlci5oIgorI2luY2x1ZGUgImhhc2gtY29tbW9uLmgiCisKKworLyogQSBtYWNybyB0byB0ZXN0IHdoZXRoZXIgUCBpcyBwcm9wZXJseSBhbGlnbmVkIGZvciBhbiB1MzIgdHlwZS4KKyAgIE5vdGUgdGhhdCBjb25maWcuaCBwcm92aWRlcyBhIHN1aXRhYmxlIHJlcGxhY2VtZW50IGZvciB1aW50cHRyX3QgaWYKKyAgIGl0IGRvZXMgbm90IGV4aXN0IGluIHN0ZGludC5oLiAgKi8KKy8qICNpZiBfX0dOVUNfXyA+PSAyICovCisvKiAjIGRlZmluZSBVMzJfQUxJR05FRF9QKHApICghKCgodWludHB0cl90KXApICUgX19hbGlnbm9mX18gKHUzMikpKSAqLworLyogI2Vsc2UgKi8KKy8qICMgZGVmaW5lIFUzMl9BTElHTkVEX1AocCkgKCEoKCh1aW50cHRyX3QpcCkgJSBzaXplb2YgKHUzMikpKSAqLworLyogI2VuZGlmICovCisKKyNkZWZpbmUgVFJBTlNGT1JNKHgsZCxuKSB0cmFuc2Zvcm0gKCh4KSwgKGQpLCAobikpCisKKwordHlwZWRlZiBzdHJ1Y3QgCit7CisgIHUzMiAgICAgICAgICAgaDAsaDEsaDIsaDMsaDQ7CisgIHUzMiAgICAgICAgICAgbmJsb2NrczsKKyAgdW5zaWduZWQgY2hhciBidWZbNjRdOworICBpbnQgICAgICAgICAgIGNvdW50OworfSBTSEExX0NPTlRFWFQ7CisKKworCitzdGF0aWMgdm9pZAorc2hhMV9pbml0ICh2b2lkICpjb250ZXh0KQoreworICBTSEExX0NPTlRFWFQgKmhkID0gY29udGV4dDsKKworICBoZC0+aDAgPSAweDY3NDUyMzAxOworICBoZC0+aDEgPSAweGVmY2RhYjg5OworICBoZC0+aDIgPSAweDk4YmFkY2ZlOworICBoZC0+aDMgPSAweDEwMzI1NDc2OworICBoZC0+aDQgPSAweGMzZDJlMWYwOworICBoZC0+bmJsb2NrcyA9IDA7CisgIGhkLT5jb3VudCA9IDA7Cit9CisKKworLyogUm91bmQgZnVuY3Rpb24gbWFjcm9zLiAqLworI2RlZmluZSBLMSAgMHg1QTgyNzk5OUwKKyNkZWZpbmUgSzIgIDB4NkVEOUVCQTFMCisjZGVmaW5lIEszICAweDhGMUJCQ0RDTAorI2RlZmluZSBLNCAgMHhDQTYyQzFENkwKKyNkZWZpbmUgRjEoeCx5LHopICAgKCB6IF4gKCB4ICYgKCB5IF4geiApICkgKQorI2RlZmluZSBGMih4LHkseikgICAoIHggXiB5IF4geiApCisjZGVmaW5lIEYzKHgseSx6KSAgICggKCB4ICYgeSApIHwgKCB6ICYgKCB4IHwgeSApICkgKQorI2RlZmluZSBGNCh4LHkseikgICAoIHggXiB5IF4geiApCisjZGVmaW5lIE0oaSkgKCB0bSA9ICAgIHhbIGkgICAgJjB4MGZdICBcCisgICAgICAgICAgICAgICAgICAgICBeIHhbKGktMTQpJjB4MGZdICBcCisJIAkgICAgIF4geFsoaS04KSAmMHgwZl0gIFwKKyAgICAgICAgICAgICAgICAgICAgIF4geFsoaS0zKSAmMHgwZl0sIFwKKyAgICAgICAgICAgICAgICAgICAgICh4W2kmMHgwZl0gPSByb2wodG0sIDEpKSkKKyNkZWZpbmUgUihhLGIsYyxkLGUsZixrLG0pICBkbyB7IGUgKz0gcm9sKCBhLCA1ICkgICAgIFwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGYoIGIsIGMsIGQgKSAgXAorCQkgCQkgICAgICArIGsJICAgICAgXAorCQkJIAkgICAgICArIG07CSAgICAgIFwKKwkJCQkgYiA9IHJvbCggYiwgMzAgKTsgICAgXAorCQkJICAgICAgIH0gd2hpbGUoMCkKKworCisvKgorICogVHJhbnNmb3JtIE5CTE9DS1Mgb2YgZWFjaCA2NCBieXRlcyAoMTYgMzItYml0IHdvcmRzKSBhdCBEQVRBLgorICovCitzdGF0aWMgdm9pZAordHJhbnNmb3JtIChTSEExX0NPTlRFWFQgKmhkLCBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCBzaXplX3QgbmJsb2NrcykKK3sKKyAgcmVnaXN0ZXIgdTMyIGEsIGIsIGMsIGQsIGU7IC8qIExvY2FsIGNvcGllcyBvZiB0aGUgY2hhaW5pbmcgdmFyaWFibGVzLiAgKi8KKyAgcmVnaXN0ZXIgdTMyIHRtOyAgICAgICAgICAgIC8qIEhlbHBlci4gICovCisgIHUzMiB4WzE2XTsgICAgICAgICAgICAgICAgICAvKiBUaGUgYXJyYXkgd2Ugd29yayBvbi4gKi8KKyAgCisgIC8qIExvb3Agb3ZlciBhbGwgYmxvY2tzLiAgKi8KKyAgZm9yICggO25ibG9ja3M7IG5ibG9ja3MtLSkKKyAgICB7CisjaWZkZWYgV09SRFNfQklHRU5ESUFOCisgICAgICBtZW1jcHkgKHgsIGRhdGEsIDY0KTsKKyAgICAgIGRhdGEgKz0gNjQ7CisjZWxzZQorICAgICAgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgdW5zaWduZWQgY2hhciAqcDsKKworICAgICAgICBmb3IoaT0wLCBwPSh1bnNpZ25lZCBjaGFyKil4OyBpIDwgMTY7IGkrKywgcCArPSA0ICkKKyAgICAgICAgICB7CisgICAgICAgICAgICBwWzNdID0gKmRhdGErKzsKKyAgICAgICAgICAgIHBbMl0gPSAqZGF0YSsrOworICAgICAgICAgICAgcFsxXSA9ICpkYXRhKys7CisgICAgICAgICAgICBwWzBdID0gKmRhdGErKzsKKyAgICAgICAgICB9CisgICAgICB9CisjZW5kaWYKKyAgICAgIC8qIEdldCB0aGUgdmFsdWVzIG9mIHRoZSBjaGFpbmluZyB2YXJpYWJsZXMuICovCisgICAgICBhID0gaGQtPmgwOworICAgICAgYiA9IGhkLT5oMTsKKyAgICAgIGMgPSBoZC0+aDI7CisgICAgICBkID0gaGQtPmgzOworICAgICAgZSA9IGhkLT5oNDsKKworICAgICAgLyogVHJhbnNmb3JtLiAqLworICAgICAgUiggYSwgYiwgYywgZCwgZSwgRjEsIEsxLCB4WyAwXSApOworICAgICAgUiggZSwgYSwgYiwgYywgZCwgRjEsIEsxLCB4WyAxXSApOworICAgICAgUiggZCwgZSwgYSwgYiwgYywgRjEsIEsxLCB4WyAyXSApOworICAgICAgUiggYywgZCwgZSwgYSwgYiwgRjEsIEsxLCB4WyAzXSApOworICAgICAgUiggYiwgYywgZCwgZSwgYSwgRjEsIEsxLCB4WyA0XSApOworICAgICAgUiggYSwgYiwgYywgZCwgZSwgRjEsIEsxLCB4WyA1XSApOworICAgICAgUiggZSwgYSwgYiwgYywgZCwgRjEsIEsxLCB4WyA2XSApOworICAgICAgUiggZCwgZSwgYSwgYiwgYywgRjEsIEsxLCB4WyA3XSApOworICAgICAgUiggYywgZCwgZSwgYSwgYiwgRjEsIEsxLCB4WyA4XSApOworICAgICAgUiggYiwgYywgZCwgZSwgYSwgRjEsIEsxLCB4WyA5XSApOworICAgICAgUiggYSwgYiwgYywgZCwgZSwgRjEsIEsxLCB4WzEwXSApOworICAgICAgUiggZSwgYSwgYiwgYywgZCwgRjEsIEsxLCB4WzExXSApOworICAgICAgUiggZCwgZSwgYSwgYiwgYywgRjEsIEsxLCB4WzEyXSApOworICAgICAgUiggYywgZCwgZSwgYSwgYiwgRjEsIEsxLCB4WzEzXSApOworICAgICAgUiggYiwgYywgZCwgZSwgYSwgRjEsIEsxLCB4WzE0XSApOworICAgICAgUiggYSwgYiwgYywgZCwgZSwgRjEsIEsxLCB4WzE1XSApOworICAgICAgUiggZSwgYSwgYiwgYywgZCwgRjEsIEsxLCBNKDE2KSApOworICAgICAgUiggZCwgZSwgYSwgYiwgYywgRjEsIEsxLCBNKDE3KSApOworICAgICAgUiggYywgZCwgZSwgYSwgYiwgRjEsIEsxLCBNKDE4KSApOworICAgICAgUiggYiwgYywgZCwgZSwgYSwgRjEsIEsxLCBNKDE5KSApOworICAgICAgUiggYSwgYiwgYywgZCwgZSwgRjIsIEsyLCBNKDIwKSApOworICAgICAgUiggZSwgYSwgYiwgYywgZCwgRjIsIEsyLCBNKDIxKSApOworICAgICAgUiggZCwgZSwgYSwgYiwgYywgRjIsIEsyLCBNKDIyKSApOworICAgICAgUiggYywgZCwgZSwgYSwgYiwgRjIsIEsyLCBNKDIzKSApOworICAgICAgUiggYiwgYywgZCwgZSwgYSwgRjIsIEsyLCBNKDI0KSApOworICAgICAgUiggYSwgYiwgYywgZCwgZSwgRjIsIEsyLCBNKDI1KSApOworICAgICAgUiggZSwgYSwgYiwgYywgZCwgRjIsIEsyLCBNKDI2KSApOworICAgICAgUiggZCwgZSwgYSwgYiwgYywgRjIsIEsyLCBNKDI3KSApOworICAgICAgUiggYywgZCwgZSwgYSwgYiwgRjIsIEsyLCBNKDI4KSApOworICAgICAgUiggYiwgYywgZCwgZSwgYSwgRjIsIEsyLCBNKDI5KSApOworICAgICAgUiggYSwgYiwgYywgZCwgZSwgRjIsIEsyLCBNKDMwKSApOworICAgICAgUiggZSwgYSwgYiwgYywgZCwgRjIsIEsyLCBNKDMxKSApOworICAgICAgUiggZCwgZSwgYSwgYiwgYywgRjIsIEsyLCBNKDMyKSApOworICAgICAgUiggYywgZCwgZSwgYSwgYiwgRjIsIEsyLCBNKDMzKSApOworICAgICAgUiggYiwgYywgZCwgZSwgYSwgRjIsIEsyLCBNKDM0KSApOworICAgICAgUiggYSwgYiwgYywgZCwgZSwgRjIsIEsyLCBNKDM1KSApOworICAgICAgUiggZSwgYSwgYiwgYywgZCwgRjIsIEsyLCBNKDM2KSApOworICAgICAgUiggZCwgZSwgYSwgYiwgYywgRjIsIEsyLCBNKDM3KSApOworICAgICAgUiggYywgZCwgZSwgYSwgYiwgRjIsIEsyLCBNKDM4KSApOworICAgICAgUiggYiwgYywgZCwgZSwgYSwgRjIsIEsyLCBNKDM5KSApOworICAgICAgUiggYSwgYiwgYywgZCwgZSwgRjMsIEszLCBNKDQwKSApOworICAgICAgUiggZSwgYSwgYiwgYywgZCwgRjMsIEszLCBNKDQxKSApOworICAgICAgUiggZCwgZSwgYSwgYiwgYywgRjMsIEszLCBNKDQyKSApOworICAgICAgUiggYywgZCwgZSwgYSwgYiwgRjMsIEszLCBNKDQzKSApOworICAgICAgUiggYiwgYywgZCwgZSwgYSwgRjMsIEszLCBNKDQ0KSApOworICAgICAgUiggYSwgYiwgYywgZCwgZSwgRjMsIEszLCBNKDQ1KSApOworICAgICAgUiggZSwgYSwgYiwgYywgZCwgRjMsIEszLCBNKDQ2KSApOworICAgICAgUiggZCwgZSwgYSwgYiwgYywgRjMsIEszLCBNKDQ3KSApOworICAgICAgUiggYywgZCwgZSwgYSwgYiwgRjMsIEszLCBNKDQ4KSApOworICAgICAgUiggYiwgYywgZCwgZSwgYSwgRjMsIEszLCBNKDQ5KSApOworICAgICAgUiggYSwgYiwgYywgZCwgZSwgRjMsIEszLCBNKDUwKSApOworICAgICAgUiggZSwgYSwgYiwgYywgZCwgRjMsIEszLCBNKDUxKSApOworICAgICAgUiggZCwgZSwgYSwgYiwgYywgRjMsIEszLCBNKDUyKSApOworICAgICAgUiggYywgZCwgZSwgYSwgYiwgRjMsIEszLCBNKDUzKSApOworICAgICAgUiggYiwgYywgZCwgZSwgYSwgRjMsIEszLCBNKDU0KSApOworICAgICAgUiggYSwgYiwgYywgZCwgZSwgRjMsIEszLCBNKDU1KSApOworICAgICAgUiggZSwgYSwgYiwgYywgZCwgRjMsIEszLCBNKDU2KSApOworICAgICAgUiggZCwgZSwgYSwgYiwgYywgRjMsIEszLCBNKDU3KSApOworICAgICAgUiggYywgZCwgZSwgYSwgYiwgRjMsIEszLCBNKDU4KSApOworICAgICAgUiggYiwgYywgZCwgZSwgYSwgRjMsIEszLCBNKDU5KSApOworICAgICAgUiggYSwgYiwgYywgZCwgZSwgRjQsIEs0LCBNKDYwKSApOworICAgICAgUiggZSwgYSwgYiwgYywgZCwgRjQsIEs0LCBNKDYxKSApOworICAgICAgUiggZCwgZSwgYSwgYiwgYywgRjQsIEs0LCBNKDYyKSApOworICAgICAgUiggYywgZCwgZSwgYSwgYiwgRjQsIEs0LCBNKDYzKSApOworICAgICAgUiggYiwgYywgZCwgZSwgYSwgRjQsIEs0LCBNKDY0KSApOworICAgICAgUiggYSwgYiwgYywgZCwgZSwgRjQsIEs0LCBNKDY1KSApOworICAgICAgUiggZSwgYSwgYiwgYywgZCwgRjQsIEs0LCBNKDY2KSApOworICAgICAgUiggZCwgZSwgYSwgYiwgYywgRjQsIEs0LCBNKDY3KSApOworICAgICAgUiggYywgZCwgZSwgYSwgYiwgRjQsIEs0LCBNKDY4KSApOworICAgICAgUiggYiwgYywgZCwgZSwgYSwgRjQsIEs0LCBNKDY5KSApOworICAgICAgUiggYSwgYiwgYywgZCwgZSwgRjQsIEs0LCBNKDcwKSApOworICAgICAgUiggZSwgYSwgYiwgYywgZCwgRjQsIEs0LCBNKDcxKSApOworICAgICAgUiggZCwgZSwgYSwgYiwgYywgRjQsIEs0LCBNKDcyKSApOworICAgICAgUiggYywgZCwgZSwgYSwgYiwgRjQsIEs0LCBNKDczKSApOworICAgICAgUiggYiwgYywgZCwgZSwgYSwgRjQsIEs0LCBNKDc0KSApOworICAgICAgUiggYSwgYiwgYywgZCwgZSwgRjQsIEs0LCBNKDc1KSApOworICAgICAgUiggZSwgYSwgYiwgYywgZCwgRjQsIEs0LCBNKDc2KSApOworICAgICAgUiggZCwgZSwgYSwgYiwgYywgRjQsIEs0LCBNKDc3KSApOworICAgICAgUiggYywgZCwgZSwgYSwgYiwgRjQsIEs0LCBNKDc4KSApOworICAgICAgUiggYiwgYywgZCwgZSwgYSwgRjQsIEs0LCBNKDc5KSApOworCisgICAgICAvKiBVcGRhdGUgdGhlIGNoYWluaW5nIHZhcmlhYmxlcy4gKi8KKyAgICAgIGhkLT5oMCArPSBhOworICAgICAgaGQtPmgxICs9IGI7CisgICAgICBoZC0+aDIgKz0gYzsKKyAgICAgIGhkLT5oMyArPSBkOworICAgICAgaGQtPmg0ICs9IGU7CisgICAgfQorfQorCisKKy8qIFVwZGF0ZSB0aGUgbWVzc2FnZSBkaWdlc3Qgd2l0aCB0aGUgY29udGVudHMKKyAqIG9mIElOQlVGIHdpdGggbGVuZ3RoIElOTEVOLgorICovCitzdGF0aWMgdm9pZAorc2hhMV93cml0ZSggdm9pZCAqY29udGV4dCwgY29uc3Qgdm9pZCAqaW5idWZfYXJnLCBzaXplX3QgaW5sZW4pCit7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluYnVmID0gaW5idWZfYXJnOworICBTSEExX0NPTlRFWFQgKmhkID0gY29udGV4dDsKKyAgc2l6ZV90IG5ibG9ja3M7CisKKyAgaWYgKGhkLT5jb3VudCA9PSA2NCkgIC8qIEZsdXNoIHRoZSBidWZmZXIuICovCisgICAgeworICAgICAgVFJBTlNGT1JNKCBoZCwgaGQtPmJ1ZiwgMSApOworICAgICAgX2djcnlfYnVybl9zdGFjayAoODgrNCpzaXplb2Yodm9pZCopKTsKKyAgICAgIGhkLT5jb3VudCA9IDA7CisgICAgICBoZC0+bmJsb2NrcysrOworICAgIH0KKyAgaWYgKCFpbmJ1ZikKKyAgICByZXR1cm47CisKKyAgaWYgKGhkLT5jb3VudCkKKyAgICB7CisgICAgICBmb3IgKDsgaW5sZW4gJiYgaGQtPmNvdW50IDwgNjQ7IGlubGVuLS0pCisgICAgICAgIGhkLT5idWZbaGQtPmNvdW50KytdID0gKmluYnVmKys7CisgICAgICBzaGExX3dyaXRlIChoZCwgTlVMTCwgMCk7CisgICAgICBpZiAoIWlubGVuKQorICAgICAgICByZXR1cm47CisgICAgfQorCisgIG5ibG9ja3MgPSBpbmxlbiAvIDY0OworICBpZiAobmJsb2NrcykKKyAgICB7CisgICAgICBUUkFOU0ZPUk0gKGhkLCBpbmJ1ZiwgbmJsb2Nrcyk7CisgICAgICBoZC0+Y291bnQgPSAwOworICAgICAgaGQtPm5ibG9ja3MgKz0gbmJsb2NrczsKKyAgICAgIGlubGVuIC09IG5ibG9ja3MgKiA2NDsKKyAgICAgIGluYnVmICs9IG5ibG9ja3MgKiA2NDsKKyAgICB9CisgIF9nY3J5X2J1cm5fc3RhY2sgKDg4KzQqc2l6ZW9mKHZvaWQqKSk7CisKKyAgLyogU2F2ZSByZW1haW5pbmcgYnl0ZXMuICAqLworICBmb3IgKDsgaW5sZW4gJiYgaGQtPmNvdW50IDwgNjQ7IGlubGVuLS0pCisgICAgaGQtPmJ1ZltoZC0+Y291bnQrK10gPSAqaW5idWYrKzsKK30KKworCisvKiBUaGUgcm91dGluZSBmaW5hbCB0ZXJtaW5hdGVzIHRoZSBjb21wdXRhdGlvbiBhbmQKKyAqIHJldHVybnMgdGhlIGRpZ2VzdC4KKyAqIFRoZSBoYW5kbGUgaXMgcHJlcGFyZWQgZm9yIGEgbmV3IGN5Y2xlLCBidXQgYWRkaW5nIGJ5dGVzIHRvIHRoZQorICogaGFuZGxlIHdpbGwgdGhlIGRlc3Ryb3kgdGhlIHJldHVybmVkIGJ1ZmZlci4KKyAqIFJldHVybnM6IDIwIGJ5dGVzIHJlcHJlc2VudGluZyB0aGUgZGlnZXN0LgorICovCisKK3N0YXRpYyB2b2lkCitzaGExX2ZpbmFsKHZvaWQgKmNvbnRleHQpCit7CisgIFNIQTFfQ09OVEVYVCAqaGQgPSBjb250ZXh0OworICAKKyAgdTMyIHQsIG1zYiwgbHNiOworICB1bnNpZ25lZCBjaGFyICpwOworCisgIHNoYTFfd3JpdGUoaGQsIE5VTEwsIDApOyAvKiBmbHVzaCAqLzsKKworICB0ID0gaGQtPm5ibG9ja3M7CisgIC8qIG11bHRpcGx5IGJ5IDY0IHRvIG1ha2UgYSBieXRlIGNvdW50ICovCisgIGxzYiA9IHQgPDwgNjsKKyAgbXNiID0gdCA+PiAyNjsKKyAgLyogYWRkIHRoZSBjb3VudCAqLworICB0ID0gbHNiOworICBpZiggKGxzYiArPSBoZC0+Y291bnQpIDwgdCApCisgICAgbXNiKys7CisgIC8qIG11bHRpcGx5IGJ5IDggdG8gbWFrZSBhIGJpdCBjb3VudCAqLworICB0ID0gbHNiOworICBsc2IgPDw9IDM7CisgIG1zYiA8PD0gMzsKKyAgbXNiIHw9IHQgPj4gMjk7CisKKyAgaWYoIGhkLT5jb3VudCA8IDU2ICkgIC8qIGVub3VnaCByb29tICovCisgICAgeworICAgICAgaGQtPmJ1ZltoZC0+Y291bnQrK10gPSAweDgwOyAvKiBwYWQgKi8KKyAgICAgIHdoaWxlKCBoZC0+Y291bnQgPCA1NiApCisgICAgICAgIGhkLT5idWZbaGQtPmNvdW50KytdID0gMDsgIC8qIHBhZCAqLworICAgIH0KKyAgZWxzZSAgLyogbmVlZCBvbmUgZXh0cmEgYmxvY2sgKi8KKyAgICB7CisgICAgICBoZC0+YnVmW2hkLT5jb3VudCsrXSA9IDB4ODA7IC8qIHBhZCBjaGFyYWN0ZXIgKi8KKyAgICAgIHdoaWxlKCBoZC0+Y291bnQgPCA2NCApCisgICAgICAgIGhkLT5idWZbaGQtPmNvdW50KytdID0gMDsKKyAgICAgIHNoYTFfd3JpdGUoaGQsIE5VTEwsIDApOyAgLyogZmx1c2ggKi87CisgICAgICBtZW1zZXQoaGQtPmJ1ZiwgMCwgNTYgKTsgLyogZmlsbCBuZXh0IGJsb2NrIHdpdGggemVyb2VzICovCisgICAgfQorICAvKiBhcHBlbmQgdGhlIDY0IGJpdCBjb3VudCAqLworICBoZC0+YnVmWzU2XSA9IG1zYiA+PiAyNDsKKyAgaGQtPmJ1Zls1N10gPSBtc2IgPj4gMTY7CisgIGhkLT5idWZbNThdID0gbXNiID4+ICA4OworICBoZC0+YnVmWzU5XSA9IG1zYgkgICA7CisgIGhkLT5idWZbNjBdID0gbHNiID4+IDI0OworICBoZC0+YnVmWzYxXSA9IGxzYiA+PiAxNjsKKyAgaGQtPmJ1Zls2Ml0gPSBsc2IgPj4gIDg7CisgIGhkLT5idWZbNjNdID0gbHNiCSAgIDsKKyAgVFJBTlNGT1JNKCBoZCwgaGQtPmJ1ZiwgMSApOworICBfZ2NyeV9idXJuX3N0YWNrICg4OCs0KnNpemVvZih2b2lkKikpOworCisgIHAgPSBoZC0+YnVmOworI2lmZGVmIFdPUkRTX0JJR0VORElBTgorI2RlZmluZSBYKGEpIGRvIHsgKih1MzIqKXAgPSBoZC0+aCMjYSA7IHAgKz0gNDsgfSB3aGlsZSgwKQorI2Vsc2UgLyogbGl0dGxlIGVuZGlhbiAqLworI2RlZmluZSBYKGEpIGRvIHsgKnArKyA9IGhkLT5oIyNhID4+IDI0OyAqcCsrID0gaGQtPmgjI2EgPj4gMTY7CSBcCisgICAgICAgICAgICAgICAgICAqcCsrID0gaGQtPmgjI2EgPj4gODsgKnArKyA9IGhkLT5oIyNhOyB9IHdoaWxlKDApCisjZW5kaWYKKyAgWCgwKTsKKyAgWCgxKTsKKyAgWCgyKTsKKyAgWCgzKTsKKyAgWCg0KTsKKyN1bmRlZiBYCisKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKgorc2hhMV9yZWFkKCB2b2lkICpjb250ZXh0ICkKK3sKKyAgU0hBMV9DT05URVhUICpoZCA9IGNvbnRleHQ7CisKKyAgcmV0dXJuIGhkLT5idWY7Cit9CisKKy8qKioqKioqKioqKioqKioqCisgKiBTaG9ydGN1dCBmdW5jdGlvbnMgd2hpY2ggcHV0cyB0aGUgaGFzaCB2YWx1ZSBvZiB0aGUgc3VwcGxpZWQgYnVmZmVyCisgKiBpbnRvIG91dGJ1ZiB3aGljaCBtdXN0IGhhdmUgYSBzaXplIG9mIDIwIGJ5dGVzLgorICovCit2b2lkCitfZ2NyeV9zaGExX2hhc2hfYnVmZmVyICh2b2lkICpvdXRidWYsIGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkKK3sKKyAgU0hBMV9DT05URVhUIGhkOworCisgIHNoYTFfaW5pdCAoJmhkKTsKKyAgc2hhMV93cml0ZSAoJmhkLCBidWZmZXIsIGxlbmd0aCk7CisgIHNoYTFfZmluYWwgKCZoZCk7CisgIG1lbWNweSAob3V0YnVmLCBoZC5idWYsIDIwKTsKK30KKworCisMCisvKiAKKyAgICAgU2VsZi10ZXN0IHNlY3Rpb24uCisgKi8KKworCitzdGF0aWMgZ3BnX2Vycl9jb2RlX3QKK3NlbGZ0ZXN0c19zaGExIChpbnQgZXh0ZW5kZWQsIHNlbGZ0ZXN0X3JlcG9ydF9mdW5jX3QgcmVwb3J0KQoreworICBjb25zdCBjaGFyICp3aGF0OworICBjb25zdCBjaGFyICplcnJ0eHQ7CisgIAorICB3aGF0ID0gInNob3J0IHN0cmluZyI7CisgIGVycnR4dCA9IF9nY3J5X2hhc2hfc2VsZnRlc3RfY2hlY2tfb25lCisgICAgKEdDUllfTURfU0hBMSwgMCwgCisgICAgICJhYmMiLCAzLAorICAgICAiXHhBOVx4OTlceDNFXHgzNlx4NDdceDA2XHg4MVx4NkFceEJBXHgzRSIKKyAgICAgIlx4MjVceDcxXHg3OFx4NTBceEMyXHg2Q1x4OUNceEQwXHhEOFx4OUQiLCAyMCk7CisgIGlmIChlcnJ0eHQpCisgICAgZ290byBmYWlsZWQ7CisKKyAgaWYgKGV4dGVuZGVkKQorICAgIHsKKyAgICAgIHdoYXQgPSAibG9uZyBzdHJpbmciOworICAgICAgZXJydHh0ID0gX2djcnlfaGFzaF9zZWxmdGVzdF9jaGVja19vbmUKKyAgICAgICAgKEdDUllfTURfU0hBMSwgMCwgCisgICAgICAgICAiYWJjZGJjZGVjZGVmZGVmZ2VmZ2hmZ2hpZ2hpamhpamtpamtsamtsbWtsbW5sbW5vbW5vcG5vcHEiLCA1NiwKKyAgICAgICAgICJceDg0XHg5OFx4M0VceDQ0XHgxQ1x4M0JceEQyXHg2RVx4QkFceEFFIgorICAgICAgICAgIlx4NEFceEExXHhGOVx4NTFceDI5XHhFNVx4RTVceDQ2XHg3MFx4RjEiLCAyMCk7CisgICAgICBpZiAoZXJydHh0KQorICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgIAorICAgICAgd2hhdCA9ICJvbmUgbWlsbGlvbiBcImFcIiI7CisgICAgICBlcnJ0eHQgPSBfZ2NyeV9oYXNoX3NlbGZ0ZXN0X2NoZWNrX29uZQorICAgICAgICAoR0NSWV9NRF9TSEExLCAxLAorICAgICAgICAgTlVMTCwgMCwKKyAgICAgICAgICJceDM0XHhBQVx4OTdceDNDXHhENFx4QzRceERBXHhBNFx4RjZceDFFIgorICAgICAgICAgIlx4RUJceDJCXHhEQlx4QURceDI3XHgzMVx4NjVceDM0XHgwMVx4NkYiLCAyMCk7CisgICAgICBpZiAoZXJydHh0KQorICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgcmV0dXJuIDA7IC8qIFN1Y2NlZWRlZC4gKi8KKworIGZhaWxlZDoKKyAgaWYgKHJlcG9ydCkKKyAgICByZXBvcnQgKCJkaWdlc3QiLCBHQ1JZX01EX1NIQTEsIHdoYXQsIGVycnR4dCk7CisgIHJldHVybiBHUEdfRVJSX1NFTEZURVNUX0ZBSUxFRDsKK30KKworCisvKiBSdW4gYSBmdWxsIHNlbGYtdGVzdCBmb3IgQUxHTyBhbmQgcmV0dXJuIDAgb24gc3VjY2Vzcy4gICovCitzdGF0aWMgZ3BnX2Vycl9jb2RlX3QKK3J1bl9zZWxmdGVzdHMgKGludCBhbGdvLCBpbnQgZXh0ZW5kZWQsIHNlbGZ0ZXN0X3JlcG9ydF9mdW5jX3QgcmVwb3J0KQoreworICBncGdfZXJyX2NvZGVfdCBlYzsKKworICBzd2l0Y2ggKGFsZ28pCisgICAgeworICAgIGNhc2UgR0NSWV9NRF9TSEExOgorICAgICAgZWMgPSBzZWxmdGVzdHNfc2hhMSAoZXh0ZW5kZWQsIHJlcG9ydCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZWMgPSBHUEdfRVJSX0RJR0VTVF9BTEdPOworICAgICAgYnJlYWs7CisgICAgICAgIAorICAgIH0KKyAgcmV0dXJuIGVjOworfQorCisKKworDAorc3RhdGljIHVuc2lnbmVkIGNoYXIgYXNuWzE1XSA9IC8qIE9iamVjdCBJRCBpcyAxLjMuMTQuMy4yLjI2ICovCisgIHsgMHgzMCwgMHgyMSwgMHgzMCwgMHgwOSwgMHgwNiwgMHgwNSwgMHgyYiwgMHgwZSwgMHgwMywKKyAgICAweDAyLCAweDFhLCAweDA1LCAweDAwLCAweDA0LCAweDE0IH07CisKK3N0YXRpYyBnY3J5X21kX29pZF9zcGVjX3Qgb2lkX3NwZWNfc2hhMVtdID0KKyAgeworICAgIC8qIGlzby5tZW1iZXItYm9keS51cy5yc2Fkc2kucGtjcy5wa2NzLTEuNSAoc2hhMVdpdGhSU0FFbmNyeXB0aW9uKSAqLworICAgIHsgIjEuMi44NDAuMTEzNTQ5LjEuMS41IiB9LAorICAgIC8qIGlzby5tZW1iZXItYm9keS51cy54OS01Ny54OWNtLjMgKGRzYVdpdGhTaGExKSovCisgICAgeyAiMS4yLjg0MC4xMDA0MC40LjMiIH0sCisgICAgLyogZnJvbSBOSVNUJ3MgT0lXICAoc2hhMSkgKi8KKyAgICB7ICIxLjMuMTQuMy4yLjI2IiB9LAorICAgIC8qIGZyb20gTklTVCBPSVcgKHNoYS0xV2l0aFJTQUVuY3J5cHRpb24pICovCisgICAgeyAiMS4zLjE0LjMuMi4yOSIgfSwKKyAgICAvKiBpc28ubWVtYmVyLWJvZHkudXMuYW5zaS14OS02Mi5zaWduYXR1cmVzLmVjZHNhLXdpdGgtc2hhMSAqLworICAgIHsgIjEuMi44NDAuMTAwNDUuNC4xIiB9LAorICAgIHsgTlVMTCB9LAorICB9OworCitnY3J5X21kX3NwZWNfdCBfZ2NyeV9kaWdlc3Rfc3BlY19zaGExID0KKyAgeworICAgICJTSEExIiwgYXNuLCBESU0gKGFzbiksIG9pZF9zcGVjX3NoYTEsIDIwLAorICAgIHNoYTFfaW5pdCwgc2hhMV93cml0ZSwgc2hhMV9maW5hbCwgc2hhMV9yZWFkLAorICAgIHNpemVvZiAoU0hBMV9DT05URVhUKQorICB9OworbWRfZXh0cmFfc3BlY190IF9nY3J5X2RpZ2VzdF9leHRyYXNwZWNfc2hhMSA9IAorICB7CisgICAgcnVuX3NlbGZ0ZXN0cworICB9OworCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvY2lwaGVyL3NoYTI1Ni5jIGIvbGliZ2NyeXB0LTEuNC42L2NpcGhlci9zaGEyNTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDYzNTkyCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L2NpcGhlci9zaGEyNTYuYwpAQCAtMCwwICsxLDU1NCBAQAorLyogc2hhMjU2LmMgLSBTSEEyNTYgaGFzaCBmdW5jdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA2LCAyMDA4LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisKKy8qICBUZXN0IHZlY3RvcnM6CisgICAgCisgICAgImFiYyIKKyAgICBTSEEyMjQ6IDIzMDk3ZDIyIDM0MDVkODIyIDg2NDJhNDc3IGJkYTI1NWIzIDJhYWRiY2U0IGJkYTBiM2Y3IGUzNmM5ZGE3CisgICAgU0hBMjU2OiBiYTc4MTZiZiA4ZjAxY2ZlYSA0MTQxNDBkZSA1ZGFlMjIyMyBiMDAzNjFhMyA5NjE3N2E5YyBiNDEwZmY2MSBmMjAwMTVhZAorCisgICAgImFiY2RiY2RlY2RlZmRlZmdlZmdoZmdoaWdoaWpoaWpraWprbGprbG1rbG1ubG1ub21ub3Bub3BxIgorICAgIFNIQTIyNDogNzUzODhiMTYgNTEyNzc2Y2MgNWRiYTVkYTEgZmQ4OTAxNTAgYjBjNjQ1NWMgYjRmNThiMTkgNTI1MjI1MjUKKyAgICBTSEEyNTY6IDI0OGQ2YTYxIGQyMDYzOGI4IGU1YzAyNjkzIDBjM2U2MDM5IGEzM2NlNDU5IDY0ZmYyMTY3IGY2ZWNlZGQ0IDE5ZGIwNmMxCisgCisgICAgImEiIG9uZSBtaWxsaW9uIHRpbWVzCisgICAgU0hBMjI0OiAyMDc5NDY1NSA5ODBjOTFkOCBiYmI0YzFlYSA5NzYxOGE0YiBmMDNmNDI1OCAxOTQ4YjJlZSA0ZWU3YWQ2NworICAgIFNIQTI1NjogY2RjNzZlNWMgOTkxNGZiOTIgODFhMWM3ZTIgODRkNzNlNjcgZjE4MDlhNDggYTQ5NzIwMGUgMDQ2ZDM5Y2MgYzcxMTJjZDAKKworICovCisKKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnMTBsaWIuaCIKKyNpbmNsdWRlICJiaXRoZWxwLmgiCisjaW5jbHVkZSAiY2lwaGVyLmgiCisjaW5jbHVkZSAiaGFzaC1jb21tb24uaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1MzIgIGgwLGgxLGgyLGgzLGg0LGg1LGg2LGg3OworICB1MzIgIG5ibG9ja3M7CisgIGJ5dGUgYnVmWzY0XTsKKyAgaW50ICBjb3VudDsKK30gU0hBMjU2X0NPTlRFWFQ7CisKKworc3RhdGljIHZvaWQKK3NoYTI1Nl9pbml0ICh2b2lkICpjb250ZXh0KQoreworICBTSEEyNTZfQ09OVEVYVCAqaGQgPSBjb250ZXh0OworCisgIGhkLT5oMCA9IDB4NmEwOWU2Njc7CisgIGhkLT5oMSA9IDB4YmI2N2FlODU7CisgIGhkLT5oMiA9IDB4M2M2ZWYzNzI7CisgIGhkLT5oMyA9IDB4YTU0ZmY1M2E7CisgIGhkLT5oNCA9IDB4NTEwZTUyN2Y7CisgIGhkLT5oNSA9IDB4OWIwNTY4OGM7CisgIGhkLT5oNiA9IDB4MWY4M2Q5YWI7CisgIGhkLT5oNyA9IDB4NWJlMGNkMTk7CisKKyAgaGQtPm5ibG9ja3MgPSAwOworICBoZC0+Y291bnQgPSAwOworfQorCisKK3N0YXRpYyB2b2lkCitzaGEyMjRfaW5pdCAodm9pZCAqY29udGV4dCkKK3sKKyAgU0hBMjU2X0NPTlRFWFQgKmhkID0gY29udGV4dDsKKworICBoZC0+aDAgPSAweGMxMDU5ZWQ4OworICBoZC0+aDEgPSAweDM2N2NkNTA3OworICBoZC0+aDIgPSAweDMwNzBkZDE3OworICBoZC0+aDMgPSAweGY3MGU1OTM5OworICBoZC0+aDQgPSAweGZmYzAwYjMxOworICBoZC0+aDUgPSAweDY4NTgxNTExOworICBoZC0+aDYgPSAweDY0Zjk4ZmE3OworICBoZC0+aDcgPSAweGJlZmE0ZmE0OworCisgIGhkLT5uYmxvY2tzID0gMDsKKyAgaGQtPmNvdW50ID0gMDsKK30KKworCisvKgorICBUcmFuc2Zvcm0gdGhlIG1lc3NhZ2UgWCB3aGljaCBjb25zaXN0cyBvZiAxNiAzMi1iaXQtd29yZHMuIFNlZSBGSVBTCisgIDE4MC0yIGZvciBkZXRhaWxzLiAgKi8KKyNkZWZpbmUgUzAoeCkgKHJvciAoKHgpLCA3KSBeIHJvciAoKHgpLCAxOCkgXiAoKHgpID4+IDMpKSAgICAgICAvKiAoNC42KSAqLworI2RlZmluZSBTMSh4KSAocm9yICgoeCksIDE3KSBeIHJvciAoKHgpLCAxOSkgXiAoKHgpID4+IDEwKSkgICAgIC8qICg0LjcpICovCisjZGVmaW5lIFIoYSxiLGMsZCxlLGYsZyxoLGssdykgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0MSA9IChoKSArIFN1bTEoKGUpKSArIENobygoZSksKGYpLChnKSkgKyAoaykgKyAodyk7ICBcCisgICAgICAgICAgICB0MiA9IFN1bTAoKGEpKSArIE1haigoYSksKGIpLChjKSk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBoID0gZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBnID0gZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmID0gZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBlID0gZCArIHQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkID0gYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjID0gYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBiID0gYTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhID0gdDEgKyB0MjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgfSB3aGlsZSAoMCkKKworLyogKDQuMikgc2FtZSBhcyBTSEEtMSdzIEYxLiAgKi8KK3N0YXRpYyBpbmxpbmUgdTMyCitDaG8gKHUzMiB4LCB1MzIgeSwgdTMyIHopCit7CisgIHJldHVybiAoeiBeICh4ICYgKHkgXiB6KSkpOworfQorCisvKiAoNC4zKSBzYW1lIGFzIFNIQS0xJ3MgRjMgKi8KK3N0YXRpYyBpbmxpbmUgdTMyCitNYWogKHUzMiB4LCB1MzIgeSwgdTMyIHopCit7CisgIHJldHVybiAoKHggJiB5KSB8ICh6ICYgKHh8eSkpKTsKK30KKyAgCisvKiAoNC40KSAqLworc3RhdGljIGlubGluZSB1MzIKK1N1bTAgKHUzMiB4KQoreworICByZXR1cm4gKHJvciAoeCwgMikgXiByb3IgKHgsIDEzKSBeIHJvciAoeCwgMjIpKTsKK30KKworLyogKDQuNSkgKi8KK3N0YXRpYyBpbmxpbmUgdTMyCitTdW0xICh1MzIgeCkKK3sKKyAgcmV0dXJuIChyb3IgKHgsIDYpIF4gcm9yICh4LCAxMSkgXiByb3IgKHgsIDI1KSk7Cit9CisKKyAKK3N0YXRpYyB2b2lkCit0cmFuc2Zvcm0gKFNIQTI1Nl9DT05URVhUICpoZCwgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSkKK3sKKyAgc3RhdGljIGNvbnN0IHUzMiBLWzY0XSA9IHsKKyAgICAweDQyOGEyZjk4LCAweDcxMzc0NDkxLCAweGI1YzBmYmNmLCAweGU5YjVkYmE1LAorICAgIDB4Mzk1NmMyNWIsIDB4NTlmMTExZjEsIDB4OTIzZjgyYTQsIDB4YWIxYzVlZDUsCisgICAgMHhkODA3YWE5OCwgMHgxMjgzNWIwMSwgMHgyNDMxODViZSwgMHg1NTBjN2RjMywKKyAgICAweDcyYmU1ZDc0LCAweDgwZGViMWZlLCAweDliZGMwNmE3LCAweGMxOWJmMTc0LCAKKyAgICAweGU0OWI2OWMxLCAweGVmYmU0Nzg2LCAweDBmYzE5ZGM2LCAweDI0MGNhMWNjLAorICAgIDB4MmRlOTJjNmYsIDB4NGE3NDg0YWEsIDB4NWNiMGE5ZGMsIDB4NzZmOTg4ZGEsCisgICAgMHg5ODNlNTE1MiwgMHhhODMxYzY2ZCwgMHhiMDAzMjdjOCwgMHhiZjU5N2ZjNywKKyAgICAweGM2ZTAwYmYzLCAweGQ1YTc5MTQ3LCAweDA2Y2E2MzUxLCAweDE0MjkyOTY3LAorICAgIDB4MjdiNzBhODUsIDB4MmUxYjIxMzgsIDB4NGQyYzZkZmMsIDB4NTMzODBkMTMsCisgICAgMHg2NTBhNzM1NCwgMHg3NjZhMGFiYiwgMHg4MWMyYzkyZSwgMHg5MjcyMmM4NSwKKyAgICAweGEyYmZlOGExLCAweGE4MWE2NjRiLCAweGMyNGI4YjcwLCAweGM3NmM1MWEzLAorICAgIDB4ZDE5MmU4MTksIDB4ZDY5OTA2MjQsIDB4ZjQwZTM1ODUsIDB4MTA2YWEwNzAsCisgICAgMHgxOWE0YzExNiwgMHgxZTM3NmMwOCwgMHgyNzQ4Nzc0YywgMHgzNGIwYmNiNSwKKyAgICAweDM5MWMwY2IzLCAweDRlZDhhYTRhLCAweDViOWNjYTRmLCAweDY4MmU2ZmYzLAorICAgIDB4NzQ4ZjgyZWUsIDB4NzhhNTYzNmYsIDB4ODRjODc4MTQsIDB4OGNjNzAyMDgsCisgICAgMHg5MGJlZmZmYSwgMHhhNDUwNmNlYiwgMHhiZWY5YTNmNywgMHhjNjcxNzhmMgorICB9OworCisgIHUzMiBhLGIsYyxkLGUsZixnLGgsdDEsdDI7CisgIHUzMiB4WzE2XTsKKyAgdTMyIHdbNjRdOworICBpbnQgaTsKKyAgCisgIGEgPSBoZC0+aDA7CisgIGIgPSBoZC0+aDE7CisgIGMgPSBoZC0+aDI7CisgIGQgPSBoZC0+aDM7CisgIGUgPSBoZC0+aDQ7CisgIGYgPSBoZC0+aDU7CisgIGcgPSBoZC0+aDY7CisgIGggPSBoZC0+aDc7CisgIAorI2lmZGVmIFdPUkRTX0JJR0VORElBTgorICBtZW1jcHkgKHgsIGRhdGEsIDY0KTsKKyNlbHNlCisgIHsgCisgICAgYnl0ZSAqcDI7CisgIAorICAgIGZvciAoaT0wLCBwMj0oYnl0ZSopeDsgaSA8IDE2OyBpKyssIHAyICs9IDQgKSAKKyAgICAgIHsKKyAgICAgICAgcDJbM10gPSAqZGF0YSsrOworICAgICAgICBwMlsyXSA9ICpkYXRhKys7CisgICAgICAgIHAyWzFdID0gKmRhdGErKzsKKyAgICAgICAgcDJbMF0gPSAqZGF0YSsrOworICAgICAgfQorICB9CisjZW5kaWYKKworICBmb3IgKGk9MDsgaSA8IDE2OyBpKyspCisgICAgd1tpXSA9IHhbaV07CisgIGZvciAoOyBpIDwgNjQ7IGkrKykKKyAgICB3W2ldID0gUzEod1tpLTJdKSArIHdbaS03XSArIFMwKHdbaS0xNV0pICsgd1tpLTE2XTsKKworICBmb3IgKGk9MDsgaSA8IDY0OykKKyAgICB7CisjaWYgMAorICAgICAgUihhLGIsYyxkLGUsZixnLGgsS1tpXSx3W2ldKTsKKyAgICAgIGkrKzsKKyNlbHNlCisgICAgICB0MSA9IGggKyBTdW0xIChlKSArIENobyAoZSwgZiwgZykgKyBLW2ldICsgd1tpXTsgICAKKyAgICAgIHQyID0gU3VtMCAoYSkgKyBNYWogKGEsIGIsIGMpOworICAgICAgZCArPSB0MTsKKyAgICAgIGggID0gdDEgKyB0MjsKKworICAgICAgdDEgPSBnICsgU3VtMSAoZCkgKyBDaG8gKGQsIGUsIGYpICsgS1tpKzFdICsgd1tpKzFdOworICAgICAgdDIgPSBTdW0wIChoKSArIE1haiAoaCwgYSwgYik7CisgICAgICBjICs9IHQxOworICAgICAgZyAgPSB0MSArIHQyOworCisgICAgICB0MSA9IGYgKyBTdW0xIChjKSArIENobyAoYywgZCwgZSkgKyBLW2krMl0gKyB3W2krMl07CisgICAgICB0MiA9IFN1bTAgKGcpICsgTWFqIChnLCBoLCBhKTsKKyAgICAgIGIgKz0gdDE7CisgICAgICBmICA9IHQxICsgdDI7CisKKyAgICAgIHQxID0gZSArIFN1bTEgKGIpICsgQ2hvIChiLCBjLCBkKSArIEtbaSszXSArIHdbaSszXTsKKyAgICAgIHQyID0gU3VtMCAoZikgKyBNYWogKGYsIGcsIGgpOworICAgICAgYSArPSB0MTsKKyAgICAgIGUgID0gdDEgKyB0MjsKKworICAgICAgdDEgPSBkICsgU3VtMSAoYSkgKyBDaG8gKGEsIGIsIGMpICsgS1tpKzRdICsgd1tpKzRdOworICAgICAgdDIgPSBTdW0wIChlKSArIE1haiAoZSwgZiwgZyk7CisgICAgICBoICs9IHQxOworICAgICAgZCAgPSB0MSArIHQyOworCisgICAgICB0MSA9IGMgKyBTdW0xIChoKSArIENobyAoaCwgYSwgYikgKyBLW2krNV0gKyB3W2krNV07CisgICAgICB0MiA9IFN1bTAgKGQpICsgTWFqIChkLCBlLCBmKTsKKyAgICAgIGcgKz0gdDE7CisgICAgICBjICA9IHQxICsgdDI7CisKKyAgICAgIHQxID0gYiArIFN1bTEgKGcpICsgQ2hvIChnLCBoLCBhKSArIEtbaSs2XSArIHdbaSs2XTsKKyAgICAgIHQyID0gU3VtMCAoYykgKyBNYWogKGMsIGQsIGUpOworICAgICAgZiArPSB0MTsKKyAgICAgIGIgID0gdDEgKyB0MjsKKworICAgICAgdDEgPSBhICsgU3VtMSAoZikgKyBDaG8gKGYsIGcsIGgpICsgS1tpKzddICsgd1tpKzddOworICAgICAgdDIgPSBTdW0wIChiKSArIE1haiAoYiwgYywgZCk7CisgICAgICBlICs9IHQxOworICAgICAgYSAgPSB0MSArIHQyOworCisgICAgICBpICs9IDg7CisjZW5kaWYKKyAgICB9CisKKyAgaGQtPmgwICs9IGE7CisgIGhkLT5oMSArPSBiOworICBoZC0+aDIgKz0gYzsKKyAgaGQtPmgzICs9IGQ7CisgIGhkLT5oNCArPSBlOworICBoZC0+aDUgKz0gZjsKKyAgaGQtPmg2ICs9IGc7CisgIGhkLT5oNyArPSBoOworfQorI3VuZGVmIFMwCisjdW5kZWYgUzEKKyN1bmRlZiBSCisKKworLyogVXBkYXRlIHRoZSBtZXNzYWdlIGRpZ2VzdCB3aXRoIHRoZSBjb250ZW50cyBvZiBJTkJVRiB3aXRoIGxlbmd0aAorICBJTkxFTi4gICovCitzdGF0aWMgdm9pZAorc2hhMjU2X3dyaXRlICh2b2lkICpjb250ZXh0LCBjb25zdCB2b2lkICppbmJ1Zl9hcmcsIHNpemVfdCBpbmxlbikKK3sKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqaW5idWYgPSBpbmJ1Zl9hcmc7CisgIFNIQTI1Nl9DT05URVhUICpoZCA9IGNvbnRleHQ7CisKKyAgaWYgKGhkLT5jb3VudCA9PSA2NCkKKyAgICB7IC8qIGZsdXNoIHRoZSBidWZmZXIgKi8KKyAgICAgIHRyYW5zZm9ybSAoaGQsIGhkLT5idWYpOworICAgICAgX2djcnlfYnVybl9zdGFjayAoNzQqNCszMik7CisgICAgICBoZC0+Y291bnQgPSAwOworICAgICAgaGQtPm5ibG9ja3MrKzsKKyAgICB9CisgIGlmICghaW5idWYpCisgICAgcmV0dXJuOworICBpZiAoaGQtPmNvdW50KQorICAgIHsKKyAgICAgIGZvciAoOyBpbmxlbiAmJiBoZC0+Y291bnQgPCA2NDsgaW5sZW4tLSkKKyAgICAgICAgaGQtPmJ1ZltoZC0+Y291bnQrK10gPSAqaW5idWYrKzsKKyAgICAgIHNoYTI1Nl93cml0ZSAoaGQsIE5VTEwsIDApOworICAgICAgaWYgKCFpbmxlbikKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICB3aGlsZSAoaW5sZW4gPj0gNjQpCisgICAgeworICAgICAgdHJhbnNmb3JtIChoZCwgaW5idWYpOworICAgICAgaGQtPmNvdW50ID0gMDsKKyAgICAgIGhkLT5uYmxvY2tzKys7CisgICAgICBpbmxlbiAtPSA2NDsKKyAgICAgIGluYnVmICs9IDY0OworICAgIH0KKyAgX2djcnlfYnVybl9zdGFjayAoNzQqNCszMik7CisgIGZvciAoOyBpbmxlbiAmJiBoZC0+Y291bnQgPCA2NDsgaW5sZW4tLSkKKyAgICBoZC0+YnVmW2hkLT5jb3VudCsrXSA9ICppbmJ1ZisrOworfQorCisKKy8qCisgICBUaGUgcm91dGluZSBmaW5hbGx5IHRlcm1pbmF0ZXMgdGhlIGNvbXB1dGF0aW9uIGFuZCByZXR1cm5zIHRoZQorICAgZGlnZXN0LiAgVGhlIGhhbmRsZSBpcyBwcmVwYXJlZCBmb3IgYSBuZXcgY3ljbGUsIGJ1dCBhZGRpbmcgYnl0ZXMKKyAgIHRvIHRoZSBoYW5kbGUgd2lsbCB0aGUgZGVzdHJveSB0aGUgcmV0dXJuZWQgYnVmZmVyLiAgUmV0dXJuczogMzIKKyAgIGJ5dGVzIHdpdGggdGhlIG1lc3NhZ2UgdGhlIGRpZ2VzdC4gICovCitzdGF0aWMgdm9pZAorc2hhMjU2X2ZpbmFsKHZvaWQgKmNvbnRleHQpCit7CisgIFNIQTI1Nl9DT05URVhUICpoZCA9IGNvbnRleHQ7CisgIHUzMiB0LCBtc2IsIGxzYjsKKyAgYnl0ZSAqcDsKKyAgCisgIHNoYTI1Nl93cml0ZSAoaGQsIE5VTEwsIDApOyAvKiBmbHVzaCAqLzsKKworICB0ID0gaGQtPm5ibG9ja3M7CisgIC8qIG11bHRpcGx5IGJ5IDY0IHRvIG1ha2UgYSBieXRlIGNvdW50ICovCisgIGxzYiA9IHQgPDwgNjsKKyAgbXNiID0gdCA+PiAyNjsKKyAgLyogYWRkIHRoZSBjb3VudCAqLworICB0ID0gbHNiOworICBpZiAoKGxzYiArPSBoZC0+Y291bnQpIDwgdCkKKyAgICBtc2IrKzsKKyAgLyogbXVsdGlwbHkgYnkgOCB0byBtYWtlIGEgYml0IGNvdW50ICovCisgIHQgPSBsc2I7CisgIGxzYiA8PD0gMzsKKyAgbXNiIDw8PSAzOworICBtc2IgfD0gdCA+PiAyOTsKKworICBpZiAoaGQtPmNvdW50IDwgNTYpCisgICAgeyAvKiBlbm91Z2ggcm9vbSAqLworICAgICAgaGQtPmJ1ZltoZC0+Y291bnQrK10gPSAweDgwOyAvKiBwYWQgKi8KKyAgICAgIHdoaWxlIChoZC0+Y291bnQgPCA1NikKKyAgICAgICAgaGQtPmJ1ZltoZC0+Y291bnQrK10gPSAwOyAgLyogcGFkICovCisgICAgfQorICBlbHNlCisgICAgeyAvKiBuZWVkIG9uZSBleHRyYSBibG9jayAqLworICAgICAgaGQtPmJ1ZltoZC0+Y291bnQrK10gPSAweDgwOyAvKiBwYWQgY2hhcmFjdGVyICovCisgICAgICB3aGlsZSAoaGQtPmNvdW50IDwgNjQpCisgICAgICAgIGhkLT5idWZbaGQtPmNvdW50KytdID0gMDsKKyAgICAgIHNoYTI1Nl93cml0ZSAoaGQsIE5VTEwsIDApOyAgLyogZmx1c2ggKi87CisgICAgICBtZW1zZXQgKGhkLT5idWYsIDAsIDU2ICk7IC8qIGZpbGwgbmV4dCBibG9jayB3aXRoIHplcm9lcyAqLworICAgIH0KKyAgLyogYXBwZW5kIHRoZSA2NCBiaXQgY291bnQgKi8KKyAgaGQtPmJ1Zls1Nl0gPSBtc2IgPj4gMjQ7CisgIGhkLT5idWZbNTddID0gbXNiID4+IDE2OworICBoZC0+YnVmWzU4XSA9IG1zYiA+PiAgODsKKyAgaGQtPmJ1Zls1OV0gPSBtc2I7CisgIGhkLT5idWZbNjBdID0gbHNiID4+IDI0OworICBoZC0+YnVmWzYxXSA9IGxzYiA+PiAxNjsKKyAgaGQtPmJ1Zls2Ml0gPSBsc2IgPj4gIDg7CisgIGhkLT5idWZbNjNdID0gbHNiOworICB0cmFuc2Zvcm0gKGhkLCBoZC0+YnVmKTsKKyAgX2djcnlfYnVybl9zdGFjayAoNzQqNCszMik7CisKKyAgcCA9IGhkLT5idWY7CisjaWZkZWYgV09SRFNfQklHRU5ESUFOCisjZGVmaW5lIFgoYSkgZG8geyAqKHUzMiopcCA9IGhkLT5oIyNhIDsgcCArPSA0OyB9IHdoaWxlKDApCisjZWxzZSAvKiBsaXR0bGUgZW5kaWFuICovCisjZGVmaW5lIFgoYSkgZG8geyAqcCsrID0gaGQtPmgjI2EgPj4gMjQ7ICpwKysgPSBoZC0+aCMjYSA+PiAxNjsJIFwKKwkJICAqcCsrID0gaGQtPmgjI2EgPj4gODsgKnArKyA9IGhkLT5oIyNhOyB9IHdoaWxlKDApCisjZW5kaWYKKyAgWCgwKTsKKyAgWCgxKTsKKyAgWCgyKTsKKyAgWCgzKTsKKyAgWCg0KTsKKyAgWCg1KTsKKyAgWCg2KTsKKyAgWCg3KTsKKyN1bmRlZiBYCit9CisKK3N0YXRpYyBieXRlICoKK3NoYTI1Nl9yZWFkICh2b2lkICpjb250ZXh0KQoreworICBTSEEyNTZfQ09OVEVYVCAqaGQgPSBjb250ZXh0OworCisgIHJldHVybiBoZC0+YnVmOworfQorCisKKwwKKy8qIAorICAgICBTZWxmLXRlc3Qgc2VjdGlvbi4KKyAqLworCisKK3N0YXRpYyBncGdfZXJyX2NvZGVfdAorc2VsZnRlc3RzX3NoYTIyNCAoaW50IGV4dGVuZGVkLCBzZWxmdGVzdF9yZXBvcnRfZnVuY190IHJlcG9ydCkKK3sKKyAgY29uc3QgY2hhciAqd2hhdDsKKyAgY29uc3QgY2hhciAqZXJydHh0OworICAKKyAgd2hhdCA9ICJzaG9ydCBzdHJpbmciOworICBlcnJ0eHQgPSBfZ2NyeV9oYXNoX3NlbGZ0ZXN0X2NoZWNrX29uZQorICAgIChHQ1JZX01EX1NIQTIyNCwgMCwgCisgICAgICJhYmMiLCAzLAorICAgICAiXHgyM1x4MDlceDdkXHgyMlx4MzRceDA1XHhkOFx4MjJceDg2XHg0Mlx4YTRceDc3XHhiZFx4YTJceDU1XHhiMyIKKyAgICAgIlx4MmFceGFkXHhiY1x4ZTRceGJkXHhhMFx4YjNceGY3XHhlM1x4NmNceDlkXHhhNyIsIDI4KTsKKyAgaWYgKGVycnR4dCkKKyAgICBnb3RvIGZhaWxlZDsKKworICBpZiAoZXh0ZW5kZWQpCisgICAgeworICAgICAgd2hhdCA9ICJsb25nIHN0cmluZyI7CisgICAgICBlcnJ0eHQgPSBfZ2NyeV9oYXNoX3NlbGZ0ZXN0X2NoZWNrX29uZQorICAgICAgICAoR0NSWV9NRF9TSEEyMjQsIDAsIAorICAgICAgICAgImFiY2RiY2RlY2RlZmRlZmdlZmdoZmdoaWdoaWpoaWpraWprbGprbG1rbG1ubG1ub21ub3Bub3BxIiwgNTYsCisgICAgICAgICAiXHg3NVx4MzhceDhiXHgxNlx4NTFceDI3XHg3Nlx4Y2NceDVkXHhiYVx4NWRceGExXHhmZFx4ODlceDAxXHg1MCIKKyAgICAgICAgICJceGIwXHhjNlx4NDVceDVjXHhiNFx4ZjVceDhiXHgxOVx4NTJceDUyXHgyNVx4MjUiLCAyOCk7CisgICAgICBpZiAoZXJydHh0KQorICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgIAorICAgICAgd2hhdCA9ICJvbmUgbWlsbGlvbiBcImFcIiI7CisgICAgICBlcnJ0eHQgPSBfZ2NyeV9oYXNoX3NlbGZ0ZXN0X2NoZWNrX29uZQorICAgICAgICAoR0NSWV9NRF9TSEEyMjQsIDEsCisgICAgICAgICBOVUxMLCAwLAorICAgICAgICAgIlx4MjBceDc5XHg0Nlx4NTVceDk4XHgwY1x4OTFceGQ4XHhiYlx4YjRceGMxXHhlYVx4OTdceDYxXHg4YVx4NGIiCisgICAgICAgICAiXHhmMFx4M2ZceDQyXHg1OFx4MTlceDQ4XHhiMlx4ZWVceDRlXHhlN1x4YWRceDY3IiwgMjgpOworICAgICAgaWYgKGVycnR4dCkKKyAgICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIHJldHVybiAwOyAvKiBTdWNjZWVkZWQuICovCisKKyBmYWlsZWQ6CisgIGlmIChyZXBvcnQpCisgICAgcmVwb3J0ICgiZGlnZXN0IiwgR0NSWV9NRF9TSEEyMjQsIHdoYXQsIGVycnR4dCk7CisgIHJldHVybiBHUEdfRVJSX1NFTEZURVNUX0ZBSUxFRDsKK30KKworc3RhdGljIGdwZ19lcnJfY29kZV90CitzZWxmdGVzdHNfc2hhMjU2IChpbnQgZXh0ZW5kZWQsIHNlbGZ0ZXN0X3JlcG9ydF9mdW5jX3QgcmVwb3J0KQoreworICBjb25zdCBjaGFyICp3aGF0OworICBjb25zdCBjaGFyICplcnJ0eHQ7CisgIAorICB3aGF0ID0gInNob3J0IHN0cmluZyI7CisgIGVycnR4dCA9IF9nY3J5X2hhc2hfc2VsZnRlc3RfY2hlY2tfb25lCisgICAgKEdDUllfTURfU0hBMjU2LCAwLCAKKyAgICAgImFiYyIsIDMsCisgICAgICJceGJhXHg3OFx4MTZceGJmXHg4Zlx4MDFceGNmXHhlYVx4NDFceDQxXHg0MFx4ZGVceDVkXHhhZVx4MjJceDIzIgorICAgICAiXHhiMFx4MDNceDYxXHhhM1x4OTZceDE3XHg3YVx4OWNceGI0XHgxMFx4ZmZceDYxXHhmMlx4MDBceDE1XHhhZCIsIDMyKTsKKyAgaWYgKGVycnR4dCkKKyAgICBnb3RvIGZhaWxlZDsKKworICBpZiAoZXh0ZW5kZWQpCisgICAgeworICAgICAgd2hhdCA9ICJsb25nIHN0cmluZyI7CisgICAgICBlcnJ0eHQgPSBfZ2NyeV9oYXNoX3NlbGZ0ZXN0X2NoZWNrX29uZQorICAgICAgICAoR0NSWV9NRF9TSEEyNTYsIDAsIAorICAgICAgICAgImFiY2RiY2RlY2RlZmRlZmdlZmdoZmdoaWdoaWpoaWpraWprbGprbG1rbG1ubG1ub21ub3Bub3BxIiwgNTYsCisgICAgICAgICAiXHgyNFx4OGRceDZhXHg2MVx4ZDJceDA2XHgzOFx4YjhceGU1XHhjMFx4MjZceDkzXHgwY1x4M2VceDYwXHgzOSIKKyAgICAgICAgICJceGEzXHgzY1x4ZTRceDU5XHg2NFx4ZmZceDIxXHg2N1x4ZjZceGVjXHhlZFx4ZDRceDE5XHhkYlx4MDZceGMxIiwKKyAgICAgICAgIDMyKTsKKyAgICAgIGlmIChlcnJ0eHQpCisgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgCisgICAgICB3aGF0ID0gIm9uZSBtaWxsaW9uIFwiYVwiIjsKKyAgICAgIGVycnR4dCA9IF9nY3J5X2hhc2hfc2VsZnRlc3RfY2hlY2tfb25lCisgICAgICAgIChHQ1JZX01EX1NIQTI1NiwgMSwKKyAgICAgICAgIE5VTEwsIDAsCisgICAgICAgICAiXHhjZFx4YzdceDZlXHg1Y1x4OTlceDE0XHhmYlx4OTJceDgxXHhhMVx4YzdceGUyXHg4NFx4ZDdceDNlXHg2NyIKKyAgICAgICAgICJceGYxXHg4MFx4OWFceDQ4XHhhNFx4OTdceDIwXHgwZVx4MDRceDZkXHgzOVx4Y2NceGM3XHgxMVx4MmNceGQwIiwKKyAgICAgICAgIDMyKTsKKyAgICAgIGlmIChlcnJ0eHQpCisgICAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICByZXR1cm4gMDsgLyogU3VjY2VlZGVkLiAqLworCisgZmFpbGVkOgorICBpZiAocmVwb3J0KQorICAgIHJlcG9ydCAoImRpZ2VzdCIsIEdDUllfTURfU0hBMjU2LCB3aGF0LCBlcnJ0eHQpOworICByZXR1cm4gR1BHX0VSUl9TRUxGVEVTVF9GQUlMRUQ7Cit9CisKKworLyogUnVuIGEgZnVsbCBzZWxmLXRlc3QgZm9yIEFMR08gYW5kIHJldHVybiAwIG9uIHN1Y2Nlc3MuICAqLworc3RhdGljIGdwZ19lcnJfY29kZV90CitydW5fc2VsZnRlc3RzIChpbnQgYWxnbywgaW50IGV4dGVuZGVkLCBzZWxmdGVzdF9yZXBvcnRfZnVuY190IHJlcG9ydCkKK3sKKyAgZ3BnX2Vycl9jb2RlX3QgZWM7CisKKyAgc3dpdGNoIChhbGdvKQorICAgIHsKKyAgICBjYXNlIEdDUllfTURfU0hBMjI0OgorICAgICAgZWMgPSBzZWxmdGVzdHNfc2hhMjI0IChleHRlbmRlZCwgcmVwb3J0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR0NSWV9NRF9TSEEyNTY6CisgICAgICBlYyA9IHNlbGZ0ZXN0c19zaGEyNTYgKGV4dGVuZGVkLCByZXBvcnQpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGVjID0gR1BHX0VSUl9ESUdFU1RfQUxHTzsKKyAgICAgIGJyZWFrOworICAgICAgICAKKyAgICB9CisgIHJldHVybiBlYzsKK30KKworCisKKwwKK3N0YXRpYyBieXRlIGFzbjIyNFsxOV0gPSAvKiBPYmplY3QgSUQgaXMgMi4xNi44NDAuMS4xMDEuMy40LjIuNCAqLworICB7IDB4MzAsIDB4MkQsIDB4MzAsIDB4MGQsIDB4MDYsIDB4MDksIDB4NjAsIDB4ODYsIDB4NDgsCisgICAgMHgwMSwgMHg2NSwgMHgwMywgMHgwNCwgMHgwMiwgMHgwNCwgMHgwNSwgMHgwMCwgMHgwNCwKKyAgICAweDFDCisgIH07CisKK3N0YXRpYyBnY3J5X21kX29pZF9zcGVjX3Qgb2lkX3NwZWNfc2hhMjI0W10gPQorICB7CisgICAgLyogRnJvbSBSRkMzODc0LCBTZWN0aW9uIDQgKi8KKyAgICB7ICIyLjE2Ljg0MC4xLjEwMS4zLjQuMi40IiB9LCAKKyAgICB7IE5VTEwgfSwKKyAgfTsKKworc3RhdGljIGJ5dGUgYXNuMjU2WzE5XSA9IC8qIE9iamVjdCBJRCBpcyAgMi4xNi44NDAuMS4xMDEuMy40LjIuMSAqLworICB7IDB4MzAsIDB4MzEsIDB4MzAsIDB4MGQsIDB4MDYsIDB4MDksIDB4NjAsIDB4ODYsCisgICAgMHg0OCwgMHgwMSwgMHg2NSwgMHgwMywgMHgwNCwgMHgwMiwgMHgwMSwgMHgwNSwKKyAgICAweDAwLCAweDA0LCAweDIwIH07CisKK3N0YXRpYyBnY3J5X21kX29pZF9zcGVjX3Qgb2lkX3NwZWNfc2hhMjU2W10gPQorICB7CisgICAgLyogQWNjb3JkaW5nIHRvIHRoZSBPcGVuUEdQIGRyYWZ0IHJmYzI0NDAtYmlzMDYgKi8KKyAgICB7ICIyLjE2Ljg0MC4xLjEwMS4zLjQuMi4xIiB9LCAKKyAgICAvKiBQS0NTIzEgc2hhMjU2V2l0aFJTQUVuY3J5cHRpb24gKi8KKyAgICB7ICIxLjIuODQwLjExMzU0OS4xLjEuMTEiIH0sCisKKyAgICB7IE5VTEwgfSwKKyAgfTsKKworZ2NyeV9tZF9zcGVjX3QgX2djcnlfZGlnZXN0X3NwZWNfc2hhMjI0ID0KKyAgeworICAgICJTSEEyMjQiLCBhc24yMjQsIERJTSAoYXNuMjI0KSwgb2lkX3NwZWNfc2hhMjI0LCAyOCwKKyAgICBzaGEyMjRfaW5pdCwgc2hhMjU2X3dyaXRlLCBzaGEyNTZfZmluYWwsIHNoYTI1Nl9yZWFkLAorICAgIHNpemVvZiAoU0hBMjU2X0NPTlRFWFQpCisgIH07CittZF9leHRyYV9zcGVjX3QgX2djcnlfZGlnZXN0X2V4dHJhc3BlY19zaGEyMjQgPSAKKyAgeworICAgIHJ1bl9zZWxmdGVzdHMKKyAgfTsKKworZ2NyeV9tZF9zcGVjX3QgX2djcnlfZGlnZXN0X3NwZWNfc2hhMjU2ID0KKyAgeworICAgICJTSEEyNTYiLCBhc24yNTYsIERJTSAoYXNuMjU2KSwgb2lkX3NwZWNfc2hhMjU2LCAzMiwKKyAgICBzaGEyNTZfaW5pdCwgc2hhMjU2X3dyaXRlLCBzaGEyNTZfZmluYWwsIHNoYTI1Nl9yZWFkLAorICAgIHNpemVvZiAoU0hBMjU2X0NPTlRFWFQpCisgIH07CittZF9leHRyYV9zcGVjX3QgX2djcnlfZGlnZXN0X2V4dHJhc3BlY19zaGEyNTYgPSAKKyAgeworICAgIHJ1bl9zZWxmdGVzdHMKKyAgfTsKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9jaXBoZXIvc2hhNTEyLmMgYi9saWJnY3J5cHQtMS40LjYvY2lwaGVyL3NoYTUxMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YzNlNjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvY2lwaGVyL3NoYTUxMi5jCkBAIC0wLDAgKzEsNjI5IEBACisvKiBzaGE1MTIuYyAtIFNIQTM4NCBhbmQgU0hBNTEyIGhhc2ggZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDgsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgZ2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKworLyogIFRlc3QgdmVjdG9ycyBmcm9tIEZJUFMtMTgwLTI6CisgKgorICogICJhYmMiCisgKiAzODQ6CisgKiAgQ0IwMDc1M0YgNDVBMzVFOEIgQjVBMDNENjkgOUFDNjUwMDcgMjcyQzMyQUIgMEVERUQxNjMKKyAqICAxQThCNjA1QSA0M0ZGNUJFRCA4MDg2MDcyQiBBMUU3Q0MyMyA1OEJBRUNBMSAzNEM4MjVBNworICogNTEyOgorICogIEREQUYzNUExIDkzNjE3QUJBIENDNDE3MzQ5IEFFMjA0MTMxIDEyRTZGQTRFIDg5QTk3RUEyIDBBOUVFRUU2IDRCNTVEMzlBCisgKiAgMjE5Mjk5MkEgMjc0RkMxQTggMzZCQTNDMjMgQTNGRUVCQkQgNDU0RDQ0MjMgNjQzQ0U4MEUgMkE5QUM5NEYgQTU0Q0E0OUYKKyAqCisgKiAgImFiY2RlZmdoYmNkZWZnaGljZGVmZ2hpamRlZmdoaWprZWZnaGlqa2xmZ2hpamtsbWdoaWprbG1uaGlqa2xtbm9pamtsbW5vcGprbG1ub3Bxa2xtbm9wcXJsbW5vcHFyc21ub3BxcnN0bm9wcXJzdHUiCisgKiAzODQ6CisgKiAgMDkzMzBDMzMgRjcxMTQ3RTggM0QxOTJGQzcgODJDRDFCNDcgNTMxMTFCMTcgM0IzQjA1RDIKKyAqICAyRkEwODA4NiBFM0IwRjcxMiBGQ0M3QzcxQSA1NTdFMkRCOSA2NkMzRTlGQSA5MTc0NjAzOQorICogNTEyOgorICogIDhFOTU5Qjc1IERBRTMxM0RBIDhDRjRGNzI4IDE0RkMxNDNGIDhGNzc3OUM2IEVCOUY3RkExIDcyOTlBRUFEIEI2ODg5MDE4CisgKiAgNTAxRDI4OUUgNDkwMEY3RTQgMzMxQjk5REUgQzRCNTQzM0EgQzdEMzI5RUUgQjZERDI2NTQgNUU5NkU1NUIgODc0QkU5MDkKKyAqCisgKiAgImEiIHggMTAwMDAwMAorICogMzg0OgorICogIDlEMEUxODA5IDcxNjQ3NENCIDA4NkU4MzRFIDMxMEE0QTFDIEVEMTQ5RTlDIDAwRjI0ODUyCisgKiAgNzk3MkNFQzUgNzA0QzJBNUIgMDdCOEIzREMgMzhFQ0M0RUIgQUU5N0RERDggN0YzRDg5ODUKKyAqIDUxMjoKKyAqICBFNzE4NDgzRCAwQ0U3Njk2NCA0RTJFNDJDNyBCQzE1QjQ2MyA4RTFGOThCMSAzQjIwNDQyOCA1NjMyQTgwMyBBRkE5NzNFQgorICogIERFMEZGMjQ0IDg3N0VBNjBBIDRDQjA0MzJDIEU1NzdDMzFCIEVCMDA5QzVDIDJDNDlBQTJFIDRFQURCMjE3IEFEOENDMDlCCisgKi8KKworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiZzEwbGliLmgiCisjaW5jbHVkZSAiYml0aGVscC5oIgorI2luY2x1ZGUgImNpcGhlci5oIgorI2luY2x1ZGUgImhhc2gtY29tbW9uLmgiCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIHU2NCBoMCwgaDEsIGgyLCBoMywgaDQsIGg1LCBoNiwgaDc7CisgIHU2NCBuYmxvY2tzOworICBieXRlIGJ1ZlsxMjhdOworICBpbnQgY291bnQ7Cit9IFNIQTUxMl9DT05URVhUOworCitzdGF0aWMgdm9pZAorc2hhNTEyX2luaXQgKHZvaWQgKmNvbnRleHQpCit7CisgIFNIQTUxMl9DT05URVhUICpoZCA9IGNvbnRleHQ7CisKKyAgaGQtPmgwID0gVTY0X0MoMHg2YTA5ZTY2N2YzYmNjOTA4KTsKKyAgaGQtPmgxID0gVTY0X0MoMHhiYjY3YWU4NTg0Y2FhNzNiKTsKKyAgaGQtPmgyID0gVTY0X0MoMHgzYzZlZjM3MmZlOTRmODJiKTsKKyAgaGQtPmgzID0gVTY0X0MoMHhhNTRmZjUzYTVmMWQzNmYxKTsKKyAgaGQtPmg0ID0gVTY0X0MoMHg1MTBlNTI3ZmFkZTY4MmQxKTsKKyAgaGQtPmg1ID0gVTY0X0MoMHg5YjA1Njg4YzJiM2U2YzFmKTsKKyAgaGQtPmg2ID0gVTY0X0MoMHgxZjgzZDlhYmZiNDFiZDZiKTsKKyAgaGQtPmg3ID0gVTY0X0MoMHg1YmUwY2QxOTEzN2UyMTc5KTsKKworICBoZC0+bmJsb2NrcyA9IDA7CisgIGhkLT5jb3VudCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCitzaGEzODRfaW5pdCAodm9pZCAqY29udGV4dCkKK3sKKyAgU0hBNTEyX0NPTlRFWFQgKmhkID0gY29udGV4dDsKKworICBoZC0+aDAgPSBVNjRfQygweGNiYmI5ZDVkYzEwNTllZDgpOworICBoZC0+aDEgPSBVNjRfQygweDYyOWEyOTJhMzY3Y2Q1MDcpOworICBoZC0+aDIgPSBVNjRfQygweDkxNTkwMTVhMzA3MGRkMTcpOworICBoZC0+aDMgPSBVNjRfQygweDE1MmZlY2Q4ZjcwZTU5MzkpOworICBoZC0+aDQgPSBVNjRfQygweDY3MzMyNjY3ZmZjMDBiMzEpOworICBoZC0+aDUgPSBVNjRfQygweDhlYjQ0YTg3Njg1ODE1MTEpOworICBoZC0+aDYgPSBVNjRfQygweGRiMGMyZTBkNjRmOThmYTcpOworICBoZC0+aDcgPSBVNjRfQygweDQ3YjU0ODFkYmVmYTRmYTQpOworCisgIGhkLT5uYmxvY2tzID0gMDsKKyAgaGQtPmNvdW50ID0gMDsKK30KKworCitzdGF0aWMgaW5saW5lIHU2NAorUk9UUiAodTY0IHgsIHU2NCBuKQoreworICByZXR1cm4gKCh4ID4+IG4pIHwgKHggPDwgKDY0IC0gbikpKTsKK30KKworc3RhdGljIGlubGluZSB1NjQKK0NoICh1NjQgeCwgdTY0IHksIHU2NCB6KQoreworICByZXR1cm4gKCh4ICYgeSkgXiAoIH54ICYgeikpOworfQorCitzdGF0aWMgaW5saW5lIHU2NAorTWFqICh1NjQgeCwgdTY0IHksIHU2NCB6KQoreworICByZXR1cm4gKCh4ICYgeSkgXiAoeCAmIHopIF4gKHkgJiB6KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTY0CitTdW0wICh1NjQgeCkKK3sKKyAgcmV0dXJuIChST1RSICh4LCAyOCkgXiBST1RSICh4LCAzNCkgXiBST1RSICh4LCAzOSkpOworfQorCitzdGF0aWMgaW5saW5lIHU2NAorU3VtMSAodTY0IHgpCit7CisgIHJldHVybiAoUk9UUiAoeCwgMTQpIF4gUk9UUiAoeCwgMTgpIF4gUk9UUiAoeCwgNDEpKTsKK30KKworLyoqKioqKioqKioqKioqKioKKyAqIFRyYW5zZm9ybSB0aGUgbWVzc2FnZSBXIHdoaWNoIGNvbnNpc3RzIG9mIDE2IDY0LWJpdC13b3JkcworICovCitzdGF0aWMgdm9pZAordHJhbnNmb3JtIChTSEE1MTJfQ09OVEVYVCAqaGQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEpCit7CisgIHU2NCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoOworICB1NjQgd1s4MF07CisgIGludCB0OworICBzdGF0aWMgY29uc3QgdTY0IGtbXSA9CisgICAgeworICAgICAgVTY0X0MoMHg0MjhhMmY5OGQ3MjhhZTIyKSwgVTY0X0MoMHg3MTM3NDQ5MTIzZWY2NWNkKSwKKyAgICAgIFU2NF9DKDB4YjVjMGZiY2ZlYzRkM2IyZiksIFU2NF9DKDB4ZTliNWRiYTU4MTg5ZGJiYyksCisgICAgICBVNjRfQygweDM5NTZjMjViZjM0OGI1MzgpLCBVNjRfQygweDU5ZjExMWYxYjYwNWQwMTkpLAorICAgICAgVTY0X0MoMHg5MjNmODJhNGFmMTk0ZjliKSwgVTY0X0MoMHhhYjFjNWVkNWRhNmQ4MTE4KSwKKyAgICAgIFU2NF9DKDB4ZDgwN2FhOThhMzAzMDI0MiksIFU2NF9DKDB4MTI4MzViMDE0NTcwNmZiZSksCisgICAgICBVNjRfQygweDI0MzE4NWJlNGVlNGIyOGMpLCBVNjRfQygweDU1MGM3ZGMzZDVmZmI0ZTIpLAorICAgICAgVTY0X0MoMHg3MmJlNWQ3NGYyN2I4OTZmKSwgVTY0X0MoMHg4MGRlYjFmZTNiMTY5NmIxKSwKKyAgICAgIFU2NF9DKDB4OWJkYzA2YTcyNWM3MTIzNSksIFU2NF9DKDB4YzE5YmYxNzRjZjY5MjY5NCksCisgICAgICBVNjRfQygweGU0OWI2OWMxOWVmMTRhZDIpLCBVNjRfQygweGVmYmU0Nzg2Mzg0ZjI1ZTMpLAorICAgICAgVTY0X0MoMHgwZmMxOWRjNjhiOGNkNWI1KSwgVTY0X0MoMHgyNDBjYTFjYzc3YWM5YzY1KSwKKyAgICAgIFU2NF9DKDB4MmRlOTJjNmY1OTJiMDI3NSksIFU2NF9DKDB4NGE3NDg0YWE2ZWE2ZTQ4MyksCisgICAgICBVNjRfQygweDVjYjBhOWRjYmQ0MWZiZDQpLCBVNjRfQygweDc2Zjk4OGRhODMxMTUzYjUpLAorICAgICAgVTY0X0MoMHg5ODNlNTE1MmVlNjZkZmFiKSwgVTY0X0MoMHhhODMxYzY2ZDJkYjQzMjEwKSwKKyAgICAgIFU2NF9DKDB4YjAwMzI3Yzg5OGZiMjEzZiksIFU2NF9DKDB4YmY1OTdmYzdiZWVmMGVlNCksCisgICAgICBVNjRfQygweGM2ZTAwYmYzM2RhODhmYzIpLCBVNjRfQygweGQ1YTc5MTQ3OTMwYWE3MjUpLAorICAgICAgVTY0X0MoMHgwNmNhNjM1MWUwMDM4MjZmKSwgVTY0X0MoMHgxNDI5Mjk2NzBhMGU2ZTcwKSwKKyAgICAgIFU2NF9DKDB4MjdiNzBhODU0NmQyMmZmYyksIFU2NF9DKDB4MmUxYjIxMzg1YzI2YzkyNiksCisgICAgICBVNjRfQygweDRkMmM2ZGZjNWFjNDJhZWQpLCBVNjRfQygweDUzMzgwZDEzOWQ5NWIzZGYpLAorICAgICAgVTY0X0MoMHg2NTBhNzM1NDhiYWY2M2RlKSwgVTY0X0MoMHg3NjZhMGFiYjNjNzdiMmE4KSwKKyAgICAgIFU2NF9DKDB4ODFjMmM5MmU0N2VkYWVlNiksIFU2NF9DKDB4OTI3MjJjODUxNDgyMzUzYiksCisgICAgICBVNjRfQygweGEyYmZlOGExNGNmMTAzNjQpLCBVNjRfQygweGE4MWE2NjRiYmM0MjMwMDEpLAorICAgICAgVTY0X0MoMHhjMjRiOGI3MGQwZjg5NzkxKSwgVTY0X0MoMHhjNzZjNTFhMzA2NTRiZTMwKSwKKyAgICAgIFU2NF9DKDB4ZDE5MmU4MTlkNmVmNTIxOCksIFU2NF9DKDB4ZDY5OTA2MjQ1NTY1YTkxMCksCisgICAgICBVNjRfQygweGY0MGUzNTg1NTc3MTIwMmEpLCBVNjRfQygweDEwNmFhMDcwMzJiYmQxYjgpLAorICAgICAgVTY0X0MoMHgxOWE0YzExNmI4ZDJkMGM4KSwgVTY0X0MoMHgxZTM3NmMwODUxNDFhYjUzKSwKKyAgICAgIFU2NF9DKDB4Mjc0ODc3NGNkZjhlZWI5OSksIFU2NF9DKDB4MzRiMGJjYjVlMTliNDhhOCksCisgICAgICBVNjRfQygweDM5MWMwY2IzYzVjOTVhNjMpLCBVNjRfQygweDRlZDhhYTRhZTM0MThhY2IpLAorICAgICAgVTY0X0MoMHg1YjljY2E0Zjc3NjNlMzczKSwgVTY0X0MoMHg2ODJlNmZmM2Q2YjJiOGEzKSwKKyAgICAgIFU2NF9DKDB4NzQ4ZjgyZWU1ZGVmYjJmYyksIFU2NF9DKDB4NzhhNTYzNmY0MzE3MmY2MCksCisgICAgICBVNjRfQygweDg0Yzg3ODE0YTFmMGFiNzIpLCBVNjRfQygweDhjYzcwMjA4MWE2NDM5ZWMpLAorICAgICAgVTY0X0MoMHg5MGJlZmZmYTIzNjMxZTI4KSwgVTY0X0MoMHhhNDUwNmNlYmRlODJiZGU5KSwKKyAgICAgIFU2NF9DKDB4YmVmOWEzZjdiMmM2NzkxNSksIFU2NF9DKDB4YzY3MTc4ZjJlMzcyNTMyYiksCisgICAgICBVNjRfQygweGNhMjczZWNlZWEyNjYxOWMpLCBVNjRfQygweGQxODZiOGM3MjFjMGMyMDcpLAorICAgICAgVTY0X0MoMHhlYWRhN2RkNmNkZTBlYjFlKSwgVTY0X0MoMHhmNTdkNGY3ZmVlNmVkMTc4KSwKKyAgICAgIFU2NF9DKDB4MDZmMDY3YWE3MjE3NmZiYSksIFU2NF9DKDB4MGE2MzdkYzVhMmM4OThhNiksCisgICAgICBVNjRfQygweDExM2Y5ODA0YmVmOTBkYWUpLCBVNjRfQygweDFiNzEwYjM1MTMxYzQ3MWIpLAorICAgICAgVTY0X0MoMHgyOGRiNzdmNTIzMDQ3ZDg0KSwgVTY0X0MoMHgzMmNhYWI3YjQwYzcyNDkzKSwKKyAgICAgIFU2NF9DKDB4M2M5ZWJlMGExNWM5YmViYyksIFU2NF9DKDB4NDMxZDY3YzQ5YzEwMGQ0YyksCisgICAgICBVNjRfQygweDRjYzVkNGJlY2IzZTQyYjYpLCBVNjRfQygweDU5N2YyOTljZmM2NTdlMmEpLAorICAgICAgVTY0X0MoMHg1ZmNiNmZhYjNhZDZmYWVjKSwgVTY0X0MoMHg2YzQ0MTk4YzRhNDc1ODE3KQorICAgIH07CisKKyAgLyogZ2V0IHZhbHVlcyBmcm9tIHRoZSBjaGFpbmluZyB2YXJzICovCisgIGEgPSBoZC0+aDA7CisgIGIgPSBoZC0+aDE7CisgIGMgPSBoZC0+aDI7CisgIGQgPSBoZC0+aDM7CisgIGUgPSBoZC0+aDQ7CisgIGYgPSBoZC0+aDU7CisgIGcgPSBoZC0+aDY7CisgIGggPSBoZC0+aDc7CisKKyNpZmRlZiBXT1JEU19CSUdFTkRJQU4KKyAgbWVtY3B5ICh3LCBkYXRhLCAxMjgpOworI2Vsc2UKKyAgeworICAgIGludCBpOworICAgIGJ5dGUgKnAyOworCisgICAgZm9yIChpID0gMCwgcDIgPSAoYnl0ZSAqKSB3OyBpIDwgMTY7IGkrKywgcDIgKz0gOCkKKyAgICAgIHsKKwlwMls3XSA9ICpkYXRhKys7CisJcDJbNl0gPSAqZGF0YSsrOworCXAyWzVdID0gKmRhdGErKzsKKwlwMls0XSA9ICpkYXRhKys7CisJcDJbM10gPSAqZGF0YSsrOworCXAyWzJdID0gKmRhdGErKzsKKwlwMlsxXSA9ICpkYXRhKys7CisJcDJbMF0gPSAqZGF0YSsrOworICAgICAgfQorICB9CisjZW5kaWYKKworI2RlZmluZSBTMCh4KSAoUk9UUigoeCksMSkgXiBST1RSKCh4KSw4KSBeICgoeCk+PjcpKQorI2RlZmluZSBTMSh4KSAoUk9UUigoeCksMTkpIF4gUk9UUigoeCksNjEpIF4gKCh4KT4+NikpCisKKyAgZm9yICh0ID0gMTY7IHQgPCA4MDsgdCsrKQorICAgIHdbdF0gPSBTMSAod1t0IC0gMl0pICsgd1t0IC0gN10gKyBTMCAod1t0IC0gMTVdKSArIHdbdCAtIDE2XTsKKworCisgIGZvciAodCA9IDA7IHQgPCA4MDsgKQorICAgIHsKKyAgICAgIHU2NCB0MSwgdDI7CisKKyAgICAgIC8qIFBlcmZvcm1hbmNlIG9uIGEgQU1EIEF0aGxvbih0bSkgRHVhbCBDb3JlIFByb2Nlc3NvciA0MDUwZQorICAgICAgICAgd2l0aCBnY2MgNC4zLjMgdXNpbmcgZ2NyeV9tZF9oYXNoX2J1ZmZlciBvZiBlYWNoIDEwMDAwIGJ5dGVzCisgICAgICAgICBpbml0aWFsaXplZCB0byAwLDEsMiwzLi4uMjU1LDAsLi4uIGFuZCAxMDAwIGl0ZXJhdGlvbnM6CisKKyAgICAgICAgIE5vdCB1bnJvbGxlZCB3aXRoIG1hY3JvczogIDQ0MG1zCisgICAgICAgICBVbnJvbGxlZCB3aXRoIG1hY3JvczogICAgICAzNTBtcworICAgICAgICAgVW5yb2xsZWQgd2l0aCBpbmxpbmU6ICAgICAgMzMwbXMKKyAgICAgICovCisjaWYgMCAvKiBOb3QgdW5yb2xsZWQuICAqLworICAgICAgdDEgPSBoICsgU3VtMSAoZSkgKyBDaCAoZSwgZiwgZykgKyBrW3RdICsgd1t0XTsKKyAgICAgIHQyID0gU3VtMCAoYSkgKyBNYWogKGEsIGIsIGMpOworICAgICAgaCA9IGc7CisgICAgICBnID0gZjsKKyAgICAgIGYgPSBlOworICAgICAgZSA9IGQgKyB0MTsKKyAgICAgIGQgPSBjOworICAgICAgYyA9IGI7CisgICAgICBiID0gYTsKKyAgICAgIGEgPSB0MSArIHQyOworICAgICAgdCsrOworI2Vsc2UgLyogVW5yb2xsZWQgdG8gaW50ZXJ3ZWF2ZSB0aGUgY2hhaW4gdmFyaWFibGVzLiAgKi8KKyAgICAgIHQxID0gaCArIFN1bTEgKGUpICsgQ2ggKGUsIGYsIGcpICsga1t0XSArIHdbdF07CisgICAgICB0MiA9IFN1bTAgKGEpICsgTWFqIChhLCBiLCBjKTsKKyAgICAgIGQgKz0gdDE7CisgICAgICBoICA9IHQxICsgdDI7CisKKyAgICAgIHQxID0gZyArIFN1bTEgKGQpICsgQ2ggKGQsIGUsIGYpICsga1t0KzFdICsgd1t0KzFdOworICAgICAgdDIgPSBTdW0wIChoKSArIE1haiAoaCwgYSwgYik7CisgICAgICBjICs9IHQxOworICAgICAgZyAgPSB0MSArIHQyOworCisgICAgICB0MSA9IGYgKyBTdW0xIChjKSArIENoIChjLCBkLCBlKSArIGtbdCsyXSArIHdbdCsyXTsKKyAgICAgIHQyID0gU3VtMCAoZykgKyBNYWogKGcsIGgsIGEpOworICAgICAgYiArPSB0MTsKKyAgICAgIGYgID0gdDEgKyB0MjsKKworICAgICAgdDEgPSBlICsgU3VtMSAoYikgKyBDaCAoYiwgYywgZCkgKyBrW3QrM10gKyB3W3QrM107CisgICAgICB0MiA9IFN1bTAgKGYpICsgTWFqIChmLCBnLCBoKTsKKyAgICAgIGEgKz0gdDE7CisgICAgICBlICA9IHQxICsgdDI7CisKKyAgICAgIHQxID0gZCArIFN1bTEgKGEpICsgQ2ggKGEsIGIsIGMpICsga1t0KzRdICsgd1t0KzRdOworICAgICAgdDIgPSBTdW0wIChlKSArIE1haiAoZSwgZiwgZyk7CisgICAgICBoICs9IHQxOworICAgICAgZCAgPSB0MSArIHQyOworCisgICAgICB0MSA9IGMgKyBTdW0xIChoKSArIENoIChoLCBhLCBiKSArIGtbdCs1XSArIHdbdCs1XTsKKyAgICAgIHQyID0gU3VtMCAoZCkgKyBNYWogKGQsIGUsIGYpOworICAgICAgZyArPSB0MTsKKyAgICAgIGMgID0gdDEgKyB0MjsKKworICAgICAgdDEgPSBiICsgU3VtMSAoZykgKyBDaCAoZywgaCwgYSkgKyBrW3QrNl0gKyB3W3QrNl07CisgICAgICB0MiA9IFN1bTAgKGMpICsgTWFqIChjLCBkLCBlKTsKKyAgICAgIGYgKz0gdDE7CisgICAgICBiICA9IHQxICsgdDI7CisKKyAgICAgIHQxID0gYSArIFN1bTEgKGYpICsgQ2ggKGYsIGcsIGgpICsga1t0KzddICsgd1t0KzddOworICAgICAgdDIgPSBTdW0wIChiKSArIE1haiAoYiwgYywgZCk7CisgICAgICBlICs9IHQxOworICAgICAgYSAgPSB0MSArIHQyOworICAgICAgCisgICAgICB0ICs9IDg7CisjZW5kaWYKKyAgICB9CisKKyAgLyogVXBkYXRlIGNoYWluaW5nIHZhcnMuICAqLworICBoZC0+aDAgKz0gYTsKKyAgaGQtPmgxICs9IGI7CisgIGhkLT5oMiArPSBjOworICBoZC0+aDMgKz0gZDsKKyAgaGQtPmg0ICs9IGU7CisgIGhkLT5oNSArPSBmOworICBoZC0+aDYgKz0gZzsKKyAgaGQtPmg3ICs9IGg7Cit9CisKKworLyogVXBkYXRlIHRoZSBtZXNzYWdlIGRpZ2VzdCB3aXRoIHRoZSBjb250ZW50cworICogb2YgSU5CVUYgd2l0aCBsZW5ndGggSU5MRU4uCisgKi8KK3N0YXRpYyB2b2lkCitzaGE1MTJfd3JpdGUgKHZvaWQgKmNvbnRleHQsIGNvbnN0IHZvaWQgKmluYnVmX2FyZywgc2l6ZV90IGlubGVuKQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICppbmJ1ZiA9IGluYnVmX2FyZzsKKyAgU0hBNTEyX0NPTlRFWFQgKmhkID0gY29udGV4dDsKKworICBpZiAoaGQtPmNvdW50ID09IDEyOCkKKyAgICB7CQkJCS8qIGZsdXNoIHRoZSBidWZmZXIgKi8KKyAgICAgIHRyYW5zZm9ybSAoaGQsIGhkLT5idWYpOworICAgICAgX2djcnlfYnVybl9zdGFjayAoNzY4KTsKKyAgICAgIGhkLT5jb3VudCA9IDA7CisgICAgICBoZC0+bmJsb2NrcysrOworICAgIH0KKyAgaWYgKCFpbmJ1ZikKKyAgICByZXR1cm47CisgIGlmIChoZC0+Y291bnQpCisgICAgeworICAgICAgZm9yICg7IGlubGVuICYmIGhkLT5jb3VudCA8IDEyODsgaW5sZW4tLSkKKwloZC0+YnVmW2hkLT5jb3VudCsrXSA9ICppbmJ1ZisrOworICAgICAgc2hhNTEyX3dyaXRlIChjb250ZXh0LCBOVUxMLCAwKTsKKyAgICAgIGlmICghaW5sZW4pCisJcmV0dXJuOworICAgIH0KKworICB3aGlsZSAoaW5sZW4gPj0gMTI4KQorICAgIHsKKyAgICAgIHRyYW5zZm9ybSAoaGQsIGluYnVmKTsKKyAgICAgIGhkLT5jb3VudCA9IDA7CisgICAgICBoZC0+bmJsb2NrcysrOworICAgICAgaW5sZW4gLT0gMTI4OworICAgICAgaW5idWYgKz0gMTI4OworICAgIH0KKyAgX2djcnlfYnVybl9zdGFjayAoNzY4KTsKKyAgZm9yICg7IGlubGVuICYmIGhkLT5jb3VudCA8IDEyODsgaW5sZW4tLSkKKyAgICBoZC0+YnVmW2hkLT5jb3VudCsrXSA9ICppbmJ1ZisrOworfQorCisKKy8qIFRoZSByb3V0aW5lIGZpbmFsIHRlcm1pbmF0ZXMgdGhlIGNvbXB1dGF0aW9uIGFuZAorICogcmV0dXJucyB0aGUgZGlnZXN0LgorICogVGhlIGhhbmRsZSBpcyBwcmVwYXJlZCBmb3IgYSBuZXcgY3ljbGUsIGJ1dCBhZGRpbmcgYnl0ZXMgdG8gdGhlCisgKiBoYW5kbGUgd2lsbCB0aGUgZGVzdHJveSB0aGUgcmV0dXJuZWQgYnVmZmVyLgorICogUmV0dXJuczogNjQgYnl0ZXMgcmVwcmVzZW50aW5nIHRoZSBkaWdlc3QuICBXaGVuIHVzZWQgZm9yIHNoYTM4NCwKKyAqIHdlIHRha2UgdGhlIGxlZnRtb3N0IDQ4IG9mIHRob3NlIGJ5dGVzLgorICovCisKK3N0YXRpYyB2b2lkCitzaGE1MTJfZmluYWwgKHZvaWQgKmNvbnRleHQpCit7CisgIFNIQTUxMl9DT05URVhUICpoZCA9IGNvbnRleHQ7CisgIHU2NCB0LCBtc2IsIGxzYjsKKyAgYnl0ZSAqcDsKKworICBzaGE1MTJfd3JpdGUgKGNvbnRleHQsIE5VTEwsIDApOyAvKiBmbHVzaCAqLyA7CisKKyAgdCA9IGhkLT5uYmxvY2tzOworICAvKiBtdWx0aXBseSBieSAxMjggdG8gbWFrZSBhIGJ5dGUgY291bnQgKi8KKyAgbHNiID0gdCA8PCA3OworICBtc2IgPSB0ID4+IDU3OworICAvKiBhZGQgdGhlIGNvdW50ICovCisgIHQgPSBsc2I7CisgIGlmICgobHNiICs9IGhkLT5jb3VudCkgPCB0KQorICAgIG1zYisrOworICAvKiBtdWx0aXBseSBieSA4IHRvIG1ha2UgYSBiaXQgY291bnQgKi8KKyAgdCA9IGxzYjsKKyAgbHNiIDw8PSAzOworICBtc2IgPDw9IDM7CisgIG1zYiB8PSB0ID4+IDYxOworCisgIGlmIChoZC0+Y291bnQgPCAxMTIpCisgICAgewkJCQkvKiBlbm91Z2ggcm9vbSAqLworICAgICAgaGQtPmJ1ZltoZC0+Y291bnQrK10gPSAweDgwOwkvKiBwYWQgKi8KKyAgICAgIHdoaWxlIChoZC0+Y291bnQgPCAxMTIpCisJaGQtPmJ1ZltoZC0+Y291bnQrK10gPSAwOwkvKiBwYWQgKi8KKyAgICB9CisgIGVsc2UKKyAgICB7CQkJCS8qIG5lZWQgb25lIGV4dHJhIGJsb2NrICovCisgICAgICBoZC0+YnVmW2hkLT5jb3VudCsrXSA9IDB4ODA7CS8qIHBhZCBjaGFyYWN0ZXIgKi8KKyAgICAgIHdoaWxlIChoZC0+Y291bnQgPCAxMjgpCisJaGQtPmJ1ZltoZC0+Y291bnQrK10gPSAwOworICAgICAgc2hhNTEyX3dyaXRlIChjb250ZXh0LCBOVUxMLCAwKTsgLyogZmx1c2ggKi8gOworICAgICAgbWVtc2V0IChoZC0+YnVmLCAwLCAxMTIpOwkvKiBmaWxsIG5leHQgYmxvY2sgd2l0aCB6ZXJvZXMgKi8KKyAgICB9CisgIC8qIGFwcGVuZCB0aGUgMTI4IGJpdCBjb3VudCAqLworICBoZC0+YnVmWzExMl0gPSBtc2IgPj4gNTY7CisgIGhkLT5idWZbMTEzXSA9IG1zYiA+PiA0ODsKKyAgaGQtPmJ1ZlsxMTRdID0gbXNiID4+IDQwOworICBoZC0+YnVmWzExNV0gPSBtc2IgPj4gMzI7CisgIGhkLT5idWZbMTE2XSA9IG1zYiA+PiAyNDsKKyAgaGQtPmJ1ZlsxMTddID0gbXNiID4+IDE2OworICBoZC0+YnVmWzExOF0gPSBtc2IgPj4gODsKKyAgaGQtPmJ1ZlsxMTldID0gbXNiOworCisgIGhkLT5idWZbMTIwXSA9IGxzYiA+PiA1NjsKKyAgaGQtPmJ1ZlsxMjFdID0gbHNiID4+IDQ4OworICBoZC0+YnVmWzEyMl0gPSBsc2IgPj4gNDA7CisgIGhkLT5idWZbMTIzXSA9IGxzYiA+PiAzMjsKKyAgaGQtPmJ1ZlsxMjRdID0gbHNiID4+IDI0OworICBoZC0+YnVmWzEyNV0gPSBsc2IgPj4gMTY7CisgIGhkLT5idWZbMTI2XSA9IGxzYiA+PiA4OworICBoZC0+YnVmWzEyN10gPSBsc2I7CisgIHRyYW5zZm9ybSAoaGQsIGhkLT5idWYpOworICBfZ2NyeV9idXJuX3N0YWNrICg3NjgpOworCisgIHAgPSBoZC0+YnVmOworI2lmZGVmIFdPUkRTX0JJR0VORElBTgorI2RlZmluZSBYKGEpIGRvIHsgKih1NjQqKXAgPSBoZC0+aCMjYSA7IHAgKz0gODsgfSB3aGlsZSAoMCkKKyNlbHNlIC8qIGxpdHRsZSBlbmRpYW4gKi8KKyNkZWZpbmUgWChhKSBkbyB7ICpwKysgPSBoZC0+aCMjYSA+PiA1NjsgKnArKyA9IGhkLT5oIyNhID4+IDQ4OwkgICAgICBcCisgICAgICAgICAgICAgICAgICAqcCsrID0gaGQtPmgjI2EgPj4gNDA7ICpwKysgPSBoZC0+aCMjYSA+PiAzMjsJICAgICAgXAorICAgICAgICAgICAgICAgICAgKnArKyA9IGhkLT5oIyNhID4+IDI0OyAqcCsrID0gaGQtPmgjI2EgPj4gMTY7CSAgICAgIFwKKyAgICAgICAgICAgICAgICAgICpwKysgPSBoZC0+aCMjYSA+PiA4OyAgKnArKyA9IGhkLT5oIyNhOyB9IHdoaWxlICgwKQorI2VuZGlmCisgIFggKDApOworICBYICgxKTsKKyAgWCAoMik7CisgIFggKDMpOworICBYICg0KTsKKyAgWCAoNSk7CisgIC8qIE5vdGUgdGhhdCB0aGVzZSBsYXN0IHR3byBjaHVua3MgYXJlIGluY2x1ZGVkIGV2ZW4gZm9yIFNIQTM4NC4KKyAgICAgV2UganVzdCBpZ25vcmUgdGhlbS4gKi8KKyAgWCAoNik7CisgIFggKDcpOworI3VuZGVmIFgKK30KKworc3RhdGljIGJ5dGUgKgorc2hhNTEyX3JlYWQgKHZvaWQgKmNvbnRleHQpCit7CisgIFNIQTUxMl9DT05URVhUICpoZCA9IChTSEE1MTJfQ09OVEVYVCAqKSBjb250ZXh0OworICByZXR1cm4gaGQtPmJ1ZjsKK30KKworCisMCisvKiAKKyAgICAgU2VsZi10ZXN0IHNlY3Rpb24uCisgKi8KKworCitzdGF0aWMgZ3BnX2Vycl9jb2RlX3QKK3NlbGZ0ZXN0c19zaGEzODQgKGludCBleHRlbmRlZCwgc2VsZnRlc3RfcmVwb3J0X2Z1bmNfdCByZXBvcnQpCit7CisgIGNvbnN0IGNoYXIgKndoYXQ7CisgIGNvbnN0IGNoYXIgKmVycnR4dDsKKyAgCisgIHdoYXQgPSAic2hvcnQgc3RyaW5nIjsKKyAgZXJydHh0ID0gX2djcnlfaGFzaF9zZWxmdGVzdF9jaGVja19vbmUKKyAgICAoR0NSWV9NRF9TSEEzODQsIDAsIAorICAgICAiYWJjIiwgMywKKyAgICAgIlx4Y2JceDAwXHg3NVx4M2ZceDQ1XHhhM1x4NWVceDhiXHhiNVx4YTBceDNkXHg2OVx4OWFceGM2XHg1MFx4MDciCisgICAgICJceDI3XHgyY1x4MzJceGFiXHgwZVx4ZGVceGQxXHg2M1x4MWFceDhiXHg2MFx4NWFceDQzXHhmZlx4NWJceGVkIgorICAgICAiXHg4MFx4ODZceDA3XHgyYlx4YTFceGU3XHhjY1x4MjNceDU4XHhiYVx4ZWNceGExXHgzNFx4YzhceDI1XHhhNyIsIDQ4KTsKKyAgaWYgKGVycnR4dCkKKyAgICBnb3RvIGZhaWxlZDsKKworICBpZiAoZXh0ZW5kZWQpCisgICAgeworICAgICAgd2hhdCA9ICJsb25nIHN0cmluZyI7CisgICAgICBlcnJ0eHQgPSBfZ2NyeV9oYXNoX3NlbGZ0ZXN0X2NoZWNrX29uZQorICAgICAgICAoR0NSWV9NRF9TSEEzODQsIDAsIAorICAgICAgICAgImFiY2RlZmdoYmNkZWZnaGljZGVmZ2hpamRlZmdoaWprZWZnaGlqa2xmZ2hpamtsbWdoaWprbG1uIgorICAgICAgICAgImhpamtsbW5vaWprbG1ub3Bqa2xtbm9wcWtsbW5vcHFybG1ub3BxcnNtbm9wcXJzdG5vcHFyc3R1IiwgMTEyLCAKKyAgICAgICAgICJceDA5XHgzM1x4MENceDMzXHhGN1x4MTFceDQ3XHhFOFx4M0RceDE5XHgyRlx4QzdceDgyXHhDRFx4MUJceDQ3IgorICAgICAgICAgIlx4NTNceDExXHgxQlx4MTdceDNCXHgzQlx4MDVceEQyXHgyRlx4QTBceDgwXHg4Nlx4RTNceEIwXHhGN1x4MTIiCisgICAgICAgICAiXHhGQ1x4QzdceEM3XHgxQVx4NTVceDdFXHgyRFx4QjlceDY2XHhDM1x4RTlceEZBXHg5MVx4NzRceDYwXHgzOSIsCisgICAgICAgICA0OCk7CisgICAgICBpZiAoZXJydHh0KQorICAgICAgICBnb3RvIGZhaWxlZDsKKworICAgICAgd2hhdCA9ICJvbmUgbWlsbGlvbiBcImFcIiI7CisgICAgICBlcnJ0eHQgPSBfZ2NyeV9oYXNoX3NlbGZ0ZXN0X2NoZWNrX29uZQorICAgICAgICAoR0NSWV9NRF9TSEEzODQsIDEsCisgICAgICAgICBOVUxMLCAwLAorICAgICAgICAgIlx4OURceDBFXHgxOFx4MDlceDcxXHg2NFx4NzRceENCXHgwOFx4NkVceDgzXHg0RVx4MzFceDBBXHg0QVx4MUMiCisgICAgICAgICAiXHhFRFx4MTRceDlFXHg5Q1x4MDBceEYyXHg0OFx4NTJceDc5XHg3Mlx4Q0VceEM1XHg3MFx4NENceDJBXHg1QiIKKyAgICAgICAgICJceDA3XHhCOFx4QjNceERDXHgzOFx4RUNceEM0XHhFQlx4QUVceDk3XHhERFx4RDhceDdGXHgzRFx4ODlceDg1IiwKKyAgICAgICAgIDQ4KTsKKyAgICAgIGlmIChlcnJ0eHQpCisgICAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICByZXR1cm4gMDsgLyogU3VjY2VlZGVkLiAqLworCisgZmFpbGVkOgorICBpZiAocmVwb3J0KQorICAgIHJlcG9ydCAoImRpZ2VzdCIsIEdDUllfTURfU0hBMzg0LCB3aGF0LCBlcnJ0eHQpOworICByZXR1cm4gR1BHX0VSUl9TRUxGVEVTVF9GQUlMRUQ7Cit9CisKK3N0YXRpYyBncGdfZXJyX2NvZGVfdAorc2VsZnRlc3RzX3NoYTUxMiAoaW50IGV4dGVuZGVkLCBzZWxmdGVzdF9yZXBvcnRfZnVuY190IHJlcG9ydCkKK3sKKyAgY29uc3QgY2hhciAqd2hhdDsKKyAgY29uc3QgY2hhciAqZXJydHh0OworICAKKyAgd2hhdCA9ICJzaG9ydCBzdHJpbmciOworICBlcnJ0eHQgPSBfZ2NyeV9oYXNoX3NlbGZ0ZXN0X2NoZWNrX29uZQorICAgIChHQ1JZX01EX1NIQTUxMiwgMCwgCisgICAgICJhYmMiLCAzLAorICAgICAiXHhERFx4QUZceDM1XHhBMVx4OTNceDYxXHg3QVx4QkFceENDXHg0MVx4NzNceDQ5XHhBRVx4MjBceDQxXHgzMSIKKyAgICAgIlx4MTJceEU2XHhGQVx4NEVceDg5XHhBOVx4N0VceEEyXHgwQVx4OUVceEVFXHhFNlx4NEJceDU1XHhEM1x4OUEiCisgICAgICJceDIxXHg5Mlx4OTlceDJBXHgyN1x4NEZceEMxXHhBOFx4MzZceEJBXHgzQ1x4MjNceEEzXHhGRVx4RUJceEJEIgorICAgICAiXHg0NVx4NERceDQ0XHgyM1x4NjRceDNDXHhFOFx4MEVceDJBXHg5QVx4QzlceDRGXHhBNVx4NENceEE0XHg5RiIsIDY0KTsKKyAgaWYgKGVycnR4dCkKKyAgICBnb3RvIGZhaWxlZDsKKworICBpZiAoZXh0ZW5kZWQpCisgICAgeworICAgICAgd2hhdCA9ICJsb25nIHN0cmluZyI7CisgICAgICBlcnJ0eHQgPSBfZ2NyeV9oYXNoX3NlbGZ0ZXN0X2NoZWNrX29uZQorICAgICAgICAoR0NSWV9NRF9TSEE1MTIsIDAsIAorICAgICAgICAgImFiY2RlZmdoYmNkZWZnaGljZGVmZ2hpamRlZmdoaWprZWZnaGlqa2xmZ2hpamtsbWdoaWprbG1uIgorICAgICAgICAgImhpamtsbW5vaWprbG1ub3Bqa2xtbm9wcWtsbW5vcHFybG1ub3BxcnNtbm9wcXJzdG5vcHFyc3R1IiwgMTEyLCAKKyAgICAgICAgICJceDhFXHg5NVx4OUJceDc1XHhEQVx4RTNceDEzXHhEQVx4OENceEY0XHhGN1x4MjhceDE0XHhGQ1x4MTRceDNGIgorICAgICAgICAgIlx4OEZceDc3XHg3OVx4QzZceEVCXHg5Rlx4N0ZceEExXHg3Mlx4OTlceEFFXHhBRFx4QjZceDg4XHg5MFx4MTgiCisgICAgICAgICAiXHg1MFx4MURceDI4XHg5RVx4NDlceDAwXHhGN1x4RTRceDMzXHgxQlx4OTlceERFXHhDNFx4QjVceDQzXHgzQSIKKyAgICAgICAgICJceEM3XHhEM1x4MjlceEVFXHhCNlx4RERceDI2XHg1NFx4NUVceDk2XHhFNVx4NUJceDg3XHg0Qlx4RTlceDA5IiwKKyAgICAgICAgIDY0KTsKKyAgICAgIGlmIChlcnJ0eHQpCisgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgCisgICAgICB3aGF0ID0gIm9uZSBtaWxsaW9uIFwiYVwiIjsKKyAgICAgIGVycnR4dCA9IF9nY3J5X2hhc2hfc2VsZnRlc3RfY2hlY2tfb25lCisgICAgICAgIChHQ1JZX01EX1NIQTUxMiwgMSwKKyAgICAgICAgIE5VTEwsIDAsCisgICAgICAgICAiXHhFN1x4MThceDQ4XHgzRFx4MENceEU3XHg2OVx4NjRceDRFXHgyRVx4NDJceEM3XHhCQ1x4MTVceEI0XHg2MyIKKyAgICAgICAgICJceDhFXHgxRlx4OThceEIxXHgzQlx4MjBceDQ0XHgyOFx4NTZceDMyXHhBOFx4MDNceEFGXHhBOVx4NzNceEVCIgorICAgICAgICAgIlx4REVceDBGXHhGMlx4NDRceDg3XHg3RVx4QTZceDBBXHg0Q1x4QjBceDQzXHgyQ1x4RTVceDc3XHhDM1x4MUIiCisgICAgICAgICAiXHhFQlx4MDBceDlDXHg1Q1x4MkNceDQ5XHhBQVx4MkVceDRFXHhBRFx4QjJceDE3XHhBRFx4OENceEMwXHg5QiIsCisgICAgICAgICA2NCk7CisgICAgICBpZiAoZXJydHh0KQorICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgcmV0dXJuIDA7IC8qIFN1Y2NlZWRlZC4gKi8KKworIGZhaWxlZDoKKyAgaWYgKHJlcG9ydCkKKyAgICByZXBvcnQgKCJkaWdlc3QiLCBHQ1JZX01EX1NIQTUxMiwgd2hhdCwgZXJydHh0KTsKKyAgcmV0dXJuIEdQR19FUlJfU0VMRlRFU1RfRkFJTEVEOworfQorCisKKy8qIFJ1biBhIGZ1bGwgc2VsZi10ZXN0IGZvciBBTEdPIGFuZCByZXR1cm4gMCBvbiBzdWNjZXNzLiAgKi8KK3N0YXRpYyBncGdfZXJyX2NvZGVfdAorcnVuX3NlbGZ0ZXN0cyAoaW50IGFsZ28sIGludCBleHRlbmRlZCwgc2VsZnRlc3RfcmVwb3J0X2Z1bmNfdCByZXBvcnQpCit7CisgIGdwZ19lcnJfY29kZV90IGVjOworCisgIHN3aXRjaCAoYWxnbykKKyAgICB7CisgICAgY2FzZSBHQ1JZX01EX1NIQTM4NDoKKyAgICAgIGVjID0gc2VsZnRlc3RzX3NoYTM4NCAoZXh0ZW5kZWQsIHJlcG9ydCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdDUllfTURfU0hBNTEyOgorICAgICAgZWMgPSBzZWxmdGVzdHNfc2hhNTEyIChleHRlbmRlZCwgcmVwb3J0KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBlYyA9IEdQR19FUlJfRElHRVNUX0FMR087CisgICAgICBicmVhazsKKyAgICAgICAgCisgICAgfQorICByZXR1cm4gZWM7Cit9CisKKworCisMCitzdGF0aWMgYnl0ZSBzaGE1MTJfYXNuW10gPQkvKiBPYmplY3QgSUQgaXMgMi4xNi44NDAuMS4xMDEuMy40LjIuMyAqLworICB7CisgICAgMHgzMCwgMHg1MSwgMHgzMCwgMHgwZCwgMHgwNiwgMHgwOSwgMHg2MCwgMHg4NiwKKyAgICAweDQ4LCAweDAxLCAweDY1LCAweDAzLCAweDA0LCAweDAyLCAweDAzLCAweDA1LAorICAgIDB4MDAsIDB4MDQsIDB4NDAKKyAgfTsKKworc3RhdGljIGdjcnlfbWRfb2lkX3NwZWNfdCBvaWRfc3BlY19zaGE1MTJbXSA9CisgIHsKKyAgICB7ICIyLjE2Ljg0MC4xLjEwMS4zLjQuMi4zIiB9LAorCisgICAgLyogUEtDUyMxIHNoYTUxMldpdGhSU0FFbmNyeXB0aW9uICovCisgICAgeyAiMS4yLjg0MC4xMTM1NDkuMS4xLjEzIiB9LAorCisgICAgeyBOVUxMIH0KKyAgfTsKKworZ2NyeV9tZF9zcGVjX3QgX2djcnlfZGlnZXN0X3NwZWNfc2hhNTEyID0gCisgIHsKKyAgICAiU0hBNTEyIiwgc2hhNTEyX2FzbiwgRElNIChzaGE1MTJfYXNuKSwgb2lkX3NwZWNfc2hhNTEyLCA2NCwKKyAgICBzaGE1MTJfaW5pdCwgc2hhNTEyX3dyaXRlLCBzaGE1MTJfZmluYWwsIHNoYTUxMl9yZWFkLAorICAgIHNpemVvZiAoU0hBNTEyX0NPTlRFWFQpLAorICB9OworbWRfZXh0cmFfc3BlY190IF9nY3J5X2RpZ2VzdF9leHRyYXNwZWNfc2hhNTEyID0gCisgIHsKKyAgICBydW5fc2VsZnRlc3RzCisgIH07CisKK3N0YXRpYyBieXRlIHNoYTM4NF9hc25bXSA9CS8qIE9iamVjdCBJRCBpcyAyLjE2Ljg0MC4xLjEwMS4zLjQuMi4yICovCisgIHsKKyAgICAweDMwLCAweDQxLCAweDMwLCAweDBkLCAweDA2LCAweDA5LCAweDYwLCAweDg2LAorICAgIDB4NDgsIDB4MDEsIDB4NjUsIDB4MDMsIDB4MDQsIDB4MDIsIDB4MDIsIDB4MDUsCisgICAgMHgwMCwgMHgwNCwgMHgzMAorICB9OworCitzdGF0aWMgZ2NyeV9tZF9vaWRfc3BlY190IG9pZF9zcGVjX3NoYTM4NFtdID0KKyAgeworICAgIHsgIjIuMTYuODQwLjEuMTAxLjMuNC4yLjIiIH0sIAorCisgICAgLyogUEtDUyMxIHNoYTM4NFdpdGhSU0FFbmNyeXB0aW9uICovCisgICAgeyAiMS4yLjg0MC4xMTM1NDkuMS4xLjEyIiB9LAorCisgICAgeyBOVUxMIH0sCisgIH07CisKK2djcnlfbWRfc3BlY190IF9nY3J5X2RpZ2VzdF9zcGVjX3NoYTM4NCA9IAorICB7CisgICAgIlNIQTM4NCIsIHNoYTM4NF9hc24sIERJTSAoc2hhMzg0X2FzbiksIG9pZF9zcGVjX3NoYTM4NCwgNDgsCisgICAgc2hhMzg0X2luaXQsIHNoYTUxMl93cml0ZSwgc2hhNTEyX2ZpbmFsLCBzaGE1MTJfcmVhZCwKKyAgICBzaXplb2YgKFNIQTUxMl9DT05URVhUKSwKKyAgfTsKK21kX2V4dHJhX3NwZWNfdCBfZ2NyeV9kaWdlc3RfZXh0cmFzcGVjX3NoYTM4NCA9IAorICB7CisgICAgcnVuX3NlbGZ0ZXN0cworICB9OwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L2NpcGhlci90aWdlci5jIGIvbGliZ2NyeXB0LTEuNC42L2NpcGhlci90aWdlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZmViMzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvY2lwaGVyL3RpZ2VyLmMKQEAgLTAsMCArMSw5MTMgQEAKKy8qIHRpZ2VyLmMgIC0gIFRoZSBUSUdFUiBoYXNoIGZ1bmN0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKy8qIFNlZSBodHRwOi8vd3d3LmNzLnRlY2huaW9uLmFjLmlsL35iaWhhbS9SZXBvcnRzL1RpZ2VyLyAgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnMTBsaWIuaCIKKyNpbmNsdWRlICJtZW1vcnkuaCIKKyNpbmNsdWRlICJjaXBoZXIuaCIKKworI2lmZGVmIEhBVkVfVTY0X1RZUEVERUYKKworLyogd2UgcmVhbGx5IG5lZWQgaXQgaGVyZSwgYnV0IGFzIHRoaXMgaXMgb25seSBleHBlcmltZW50IHdlCisgKiBjYW4gbGl2ZSB3aXRob3V0IFRpZ2VyICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1NjQgIGEsIGIsIGM7CisgICAgYnl0ZSBidWZbNjRdOworICAgIGludCAgY291bnQ7CisgICAgdTMyICBuYmxvY2tzOworICAgIGludCAgdmFyaWFudDsgIC8qIDAgPSBvbGQgY29kZSwgMSA9IGZpeGVkIGNvZGUsIDIgLSBUSUdFUjIuICAqLworfSBUSUdFUl9DT05URVhUOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9rYXksIG9rYXksIHRoaXMgaXMgbm90IHRoZSBmYXN0ZXN0IGNvZGUgLSBpbXByb3ZlbWVudHMgYXJlIHdlbGNvbWUuCisgKgorICovCisKKy8qIFNvbWUgdGVzdCB2ZWN0b3JzOgorICogIiIgICAgICAgICAgICAgICAgICAgMjRGMDEzMEM2M0FDOTMzMiAxNjE2NkU3NkIxQkI5MjVGIEYzNzNERTJENDk1ODRFN0EKKyAqICJhYmMiICAgICAgICAgICAgICAgIEYyNThDMUU4ODQxNEFCMkEgNTI3QUI1NDFGRkM1QjhCRiA5MzVGN0I5NTFDMTMyOTUxCisgKiAiVGlnZXIiICAgICAgICAgICAgICA5RjAwRjU5OTA3MjMwMEREIDI3NkFCQjM4QzhFQjZERUMgMzc3OTBDMTE2RjlEMkJERgorICogIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky0iCisgKgkJCTg3RkIyQTkwODM4NTFDRjcgNDcwRDJDRjgxMEU2REY5RSBCNTg2NDQ1MDM0QTVBMzg2CisgKiAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVo9YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXorMDEyMzQ1Njc4OSIKKyAqCQkJNDY3REI4MDg2M0VCQ0U0OCA4REYxQ0QxMjYxNjU1REU5IDU3ODk2NTY1OTc1RjkxOTcKKyAqICJUaWdlciAtIEEgRmFzdCBOZXcgSGFzaCBGdW5jdGlvbiwgYnkgUm9zcyBBbmRlcnNvbiBhbmQgRWxpIEJpaGFtIgorICoJCQkwQzQxMEEwNDI5Njg4NjhBIDE2NzFEQTVBM0ZEMjlBNzIgNUVDMUU0NTdEM0NEQjMwMworICogIlRpZ2VyIC0gQSBGYXN0IE5ldyBIYXNoIEZ1bmN0aW9uLCBieSBSb3NzIEFuZGVyc29uIGFuZCBFbGkgQmloYW0sIHByb2MiCisgKiAiZWVkaW5ncyBvZiBGYXN0IFNvZnR3YXJlIEVuY3J5cHRpb24gMywgQ2FtYnJpZGdlLiIKKyAqCQkJRUJGNTkxRDVBRkE2NTVDRSA3RjIyODk0RkY4N0Y1NEFDIDg5QzgxMUI2QjBEQTMxOTMKKyAqICJUaWdlciAtIEEgRmFzdCBOZXcgSGFzaCBGdW5jdGlvbiwgYnkgUm9zcyBBbmRlcnNvbiBhbmQgRWxpIEJpaGFtLCBwcm9jIgorICogImVlZGluZ3Mgb2YgRmFzdCBTb2Z0d2FyZSBFbmNyeXB0aW9uIDMsIENhbWJyaWRnZSwgMTk5Ni4iCisgKgkJCTNEOUFFQjAzRDFCRDFBNjMgNTdCMjc3NERGRDZENUIyNCBERDY4MTUxRDUwMzk3NEZDCisgKiAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLUFCQ0RFRiIKKyAqICJHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSstIgorICoJCQkwMEI4M0VCNEU1MzQ0MEM1IDc2QUM2QUFFRTBBNzQ4NTggMjVGRDE1RTcwQTU5RkZFNAorICovCisKK3N0YXRpYyB1NjQgc2JveDFbMjU2XSA9IHsKKyAgVTY0X0MoMHgwMmFhYjE3Y2Y3ZTkwYzVlKSAvKiAgICAwICovLCBVNjRfQygweGFjNDI0YjAzZTI0M2E4ZWMpIC8qICAgIDEgKi8sCisgIFU2NF9DKDB4NzJjZDViZTMwZGQ1ZmNkMykgLyogICAgMiAqLywgVTY0X0MoMHg2ZDAxOWI5M2Y2Zjk3ZjNhKSAvKiAgICAzICovLAorICBVNjRfQygweGNkOTk3OGZmZDIxZjkxOTMpIC8qICAgIDQgKi8sIFU2NF9DKDB4NzU3M2ExYzk3MDgwMjllMikgLyogICAgNSAqLywKKyAgVTY0X0MoMHhiMTY0MzI2YjkyMmE4M2MzKSAvKiAgICA2ICovLCBVNjRfQygweDQ2ODgzZWVlMDQ5MTU4NzApIC8qICAgIDcgKi8sCisgIFU2NF9DKDB4ZWFhY2UzMDU3MTAzZWNlNikgLyogICAgOCAqLywgVTY0X0MoMHhjNTQxNjliODA4YTM1MzVjKSAvKiAgICA5ICovLAorICBVNjRfQygweDRjZTc1NDkxOGRkZWM0N2MpIC8qICAgMTAgKi8sIFU2NF9DKDB4MGFhMmY0ZGZkYzBkZjQwYykgLyogICAxMSAqLywKKyAgVTY0X0MoMHgxMGI3NmYxOGE3NGRiZWZhKSAvKiAgIDEyICovLCBVNjRfQygweGM2Y2NiNjIzNWFkMWFiNmEpIC8qICAgMTMgKi8sCisgIFU2NF9DKDB4MTM3MjYxMjE1NzJmZTJmZikgLyogICAxNCAqLywgVTY0X0MoMHgxYTQ4OGM2ZjE5OWQ5MjFlKSAvKiAgIDE1ICovLAorICBVNjRfQygweDRiYzlmOWY0ZGEwMDA3Y2EpIC8qICAgMTYgKi8sIFU2NF9DKDB4MjZmNWU2ZjZlODUyNDFjNykgLyogICAxNyAqLywKKyAgVTY0X0MoMHg4NTkwNzlkYmVhNTk0N2I2KSAvKiAgIDE4ICovLCBVNjRfQygweDRmMTg4NWM1Yzk5ZThjOTIpIC8qICAgMTkgKi8sCisgIFU2NF9DKDB4ZDc4ZTc2MWVhOTZmODY0YikgLyogICAyMCAqLywgVTY0X0MoMHg4ZTM2NDI4YzUyYjVjMTdkKSAvKiAgIDIxICovLAorICBVNjRfQygweDY5Y2Y2ODI3MzczMDYzYzEpIC8qICAgMjIgKi8sIFU2NF9DKDB4YjYwN2M5M2Q5YmI0YzU2ZSkgLyogICAyMyAqLywKKyAgVTY0X0MoMHg3ZDgyMGU3NjBlNzZiNWVhKSAvKiAgIDI0ICovLCBVNjRfQygweDY0NWM5Y2M2ZjA3ZmRjNDIpIC8qICAgMjUgKi8sCisgIFU2NF9DKDB4YmYzOGEwNzgyNDMzNDJlMCkgLyogICAyNiAqLywgVTY0X0MoMHg1ZjZiMzQzYzlkMmU3ZDA0KSAvKiAgIDI3ICovLAorICBVNjRfQygweGYyYzI4YWViNjAwYjBlYzYpIC8qICAgMjggKi8sIFU2NF9DKDB4NmMwZWQ4NWY3MjU0YmNhYykgLyogICAyOSAqLywKKyAgVTY0X0MoMHg3MTU5MjI4MWE0ZGI0ZmU1KSAvKiAgIDMwICovLCBVNjRfQygweDE5NjdmYTY5Y2UwZmVkOWYpIC8qICAgMzEgKi8sCisgIFU2NF9DKDB4ZmQ1MjkzZjhiOTY1NDVkYikgLyogICAzMiAqLywgVTY0X0MoMHhjODc5ZTlkN2YyYTc2MDBiKSAvKiAgIDMzICovLAorICBVNjRfQygweDg2MDI0ODkyMDE5MzE5NGUpIC8qICAgMzQgKi8sIFU2NF9DKDB4YTRmOTUzM2IyZDljYzBiMykgLyogICAzNSAqLywKKyAgVTY0X0MoMHg5MDUzODM2YzE1OTU3NjEzKSAvKiAgIDM2ICovLCBVNjRfQygweGRiNmRjZjhhZmMzNTdiZjEpIC8qICAgMzcgKi8sCisgIFU2NF9DKDB4MThiZWVhN2E3YTM3MGY1NykgLyogICAzOCAqLywgVTY0X0MoMHgwMzcxMTdjYTUwYjk5MDY2KSAvKiAgIDM5ICovLAorICBVNjRfQygweDZhYjMwYTk3NzQ0MjRhMzUpIC8qICAgNDAgKi8sIFU2NF9DKDB4ZjRlOTJmMDJlMzI1MjQ5YikgLyogICA0MSAqLywKKyAgVTY0X0MoMHg3NzM5ZGIwNzA2MWNjYWUxKSAvKiAgIDQyICovLCBVNjRfQygweGQ4ZjNiNDljZWNhNDJhMDUpIC8qICAgNDMgKi8sCisgIFU2NF9DKDB4YmQ1NmJlM2Y1MTM4MmY3MykgLyogICA0NCAqLywgVTY0X0MoMHg0NWZhZWQ1ODQzYjBiYjI4KSAvKiAgIDQ1ICovLAorICBVNjRfQygweDFjODEzZDVjMTFiZjFmODMpIC8qICAgNDYgKi8sIFU2NF9DKDB4OGFmMGU0YjZkNzVmYTE2OSkgLyogICA0NyAqLywKKyAgVTY0X0MoMHgzM2VlMThhNDg3YWQ5OTk5KSAvKiAgIDQ4ICovLCBVNjRfQygweDNjMjZlOGVhYjFjOTQ0MTApIC8qICAgNDkgKi8sCisgIFU2NF9DKDB4YjUxMDEwMmJjMGE4MjJmOSkgLyogICA1MCAqLywgVTY0X0MoMHgxNDFlZWYzMTBjZTYxMjNiKSAvKiAgIDUxICovLAorICBVNjRfQygweGZjNjViOTAwNTlkZGIxNTQpIC8qICAgNTIgKi8sIFU2NF9DKDB4ZTAxNTg2NDBjNWUwZTYwNykgLyogICA1MyAqLywKKyAgVTY0X0MoMHg4ODRlMDc5ODI2YzNhM2NmKSAvKiAgIDU0ICovLCBVNjRfQygweDkzMGQwZDk1MjNjNTM1ZmQpIC8qICAgNTUgKi8sCisgIFU2NF9DKDB4MzU2MzhkNzU0ZTlhMmIwMCkgLyogICA1NiAqLywgVTY0X0MoMHg0MDg1ZmNjZjQwNDY5ZGQ1KSAvKiAgIDU3ICovLAorICBVNjRfQygweGM0YjE3YWQyOGJlMjNhNGMpIC8qICAgNTggKi8sIFU2NF9DKDB4Y2FiMmYwZmM2YTNlNmEyZSkgLyogICA1OSAqLywKKyAgVTY0X0MoMHgyODYwOTcxYTZiOTQzZmNkKSAvKiAgIDYwICovLCBVNjRfQygweDNkZGU2ZWUyMTJlMzA0NDYpIC8qICAgNjEgKi8sCisgIFU2NF9DKDB4NjIyMmYzMmFlMDE3NjVhZSkgLyogICA2MiAqLywgVTY0X0MoMHg1ZDU1MGJiNTQ3ODMwOGZlKSAvKiAgIDYzICovLAorICBVNjRfQygweGE5ZWZhOThkYTBlZGEyMmEpIC8qICAgNjQgKi8sIFU2NF9DKDB4YzM1MWE3MTY4NmM0MGRhNykgLyogICA2NSAqLywKKyAgVTY0X0MoMHgxMTA1NTg2ZDljODY3Yzg0KSAvKiAgIDY2ICovLCBVNjRfQygweGRjZmZlZTg1ZmRhMjI4NTMpIC8qICAgNjcgKi8sCisgIFU2NF9DKDB4Y2NmYmQwMjYyYzVlZWY3NikgLyogICA2OCAqLywgVTY0X0MoMHhiYWYyOTRjYjg5OTBkMjAxKSAvKiAgIDY5ICovLAorICBVNjRfQygweGU2OTQ2NGY1MmFmYWQ5NzUpIC8qICAgNzAgKi8sIFU2NF9DKDB4OTRiMDEzYWZkZjEzM2UxNCkgLyogICA3MSAqLywKKyAgVTY0X0MoMHgwNmE3ZDFhMzI4MjNjOTU4KSAvKiAgIDcyICovLCBVNjRfQygweDZmOTVmZTUxMzBmNjExMTkpIC8qICAgNzMgKi8sCisgIFU2NF9DKDB4ZDkyYWIzNGU0NjJjMDZjMCkgLyogICA3NCAqLywgVTY0X0MoMHhlZDdiZGUzMzg4N2M3MWQyKSAvKiAgIDc1ICovLAorICBVNjRfQygweDc5NzQ2ZDZlNjUxODM5M2UpIC8qICAgNzYgKi8sIFU2NF9DKDB4NWJhNDE5Mzg1ZDcxMzMyOSkgLyogICA3NyAqLywKKyAgVTY0X0MoMHg3YzFiYTZiOTQ4YTk3NTY0KSAvKiAgIDc4ICovLCBVNjRfQygweDMxOTg3YzE5N2JmZGFjNjcpIC8qICAgNzkgKi8sCisgIFU2NF9DKDB4ZGU2YzIzYzQ0YjA1M2QwMikgLyogICA4MCAqLywgVTY0X0MoMHg1ODFjNDlmZWQwMDJkNjRkKSAvKiAgIDgxICovLAorICBVNjRfQygweGRkNDc0ZDYzMzgyNjE1NzEpIC8qICAgODIgKi8sIFU2NF9DKDB4YWE0NTQ2YzNlNDczZDA2MikgLyogICA4MyAqLywKKyAgVTY0X0MoMHg5MjhmY2UzNDk0NTVmODYwKSAvKiAgIDg0ICovLCBVNjRfQygweDQ4MTYxYmJhY2FhYjk0ZDkpIC8qICAgODUgKi8sCisgIFU2NF9DKDB4NjM5MTI0MzA3NzBlNmY2OCkgLyogICA4NiAqLywgVTY0X0MoMHg2ZWM4YTVlNjAyYzY2NDFjKSAvKiAgIDg3ICovLAorICBVNjRfQygweDg3MjgyNTE1MzM3ZGRkMmIpIC8qICAgODggKi8sIFU2NF9DKDB4MmNkYTZiNDIwMzRiNzAxYikgLyogICA4OSAqLywKKyAgVTY0X0MoMHhiMDNkMzdjMTgxY2IwOTZkKSAvKiAgIDkwICovLCBVNjRfQygweGUxMDg0MzgyNjZjNzFjNmYpIC8qICAgOTEgKi8sCisgIFU2NF9DKDB4MmIzMTgwYzdlYjUxYjI1NSkgLyogICA5MiAqLywgVTY0X0MoMHhkZjkyYjgyZjk2YzA4YmJjKSAvKiAgIDkzICovLAorICBVNjRfQygweDVjNjhjOGMwYTYzMmYzYmEpIC8qICAgOTQgKi8sIFU2NF9DKDB4NTUwNGNjODYxYzNkMDU1NikgLyogICA5NSAqLywKKyAgVTY0X0MoMHhhYmJmYTRlNTVmYjI2YjhmKSAvKiAgIDk2ICovLCBVNjRfQygweDQxODQ4YjBhYjNiYWNlYjQpIC8qICAgOTcgKi8sCisgIFU2NF9DKDB4YjMzNGEyNzNhYTQ0NWQzMikgLyogICA5OCAqLywgVTY0X0MoMHhiY2E2OTZmMGE4NWFkODgxKSAvKiAgIDk5ICovLAorICBVNjRfQygweDI0ZjZlYzY1YjUyOGQ1NmMpIC8qICAxMDAgKi8sIFU2NF9DKDB4MGNlMTUxMmU5MGY0NTI0YSkgLyogIDEwMSAqLywKKyAgVTY0X0MoMHg0ZTlkZDc5ZDU1MDZkMzVhKSAvKiAgMTAyICovLCBVNjRfQygweDI1ODkwNWZhYzZjZTk3NzkpIC8qICAxMDMgKi8sCisgIFU2NF9DKDB4MjAxOTI5NWIzZTEwOWIzMykgLyogIDEwNCAqLywgVTY0X0MoMHhmOGE5NDc4YjczYTA1NGNjKSAvKiAgMTA1ICovLAorICBVNjRfQygweDI5MjRmMmY5MzQ0MTdlYjApIC8qICAxMDYgKi8sIFU2NF9DKDB4Mzk5MzM1N2Q1MzZkMWJjNCkgLyogIDEwNyAqLywKKyAgVTY0X0MoMHgzOGE4MWFjMjFkYjZmZjhiKSAvKiAgMTA4ICovLCBVNjRfQygweDQ3YzRmYmYxN2Q2MDE2YmYpIC8qICAxMDkgKi8sCisgIFU2NF9DKDB4MWUwZmFhZGQ3NjY3ZTNmNSkgLyogIDExMCAqLywgVTY0X0MoMHg3YWJjZmY2MjkzOGJlYjk2KSAvKiAgMTExICovLAorICBVNjRfQygweGE3OGRhZDk0OGZjMTc5YzkpIC8qICAxMTIgKi8sIFU2NF9DKDB4OGYxZjk4YjcyOTExZTUwZCkgLyogIDExMyAqLywKKyAgVTY0X0MoMHg2MWU0OGVhZTI3MTIxYTkxKSAvKiAgMTE0ICovLCBVNjRfQygweDRkNjJmN2FkMzE4NTk4MDgpIC8qICAxMTUgKi8sCisgIFU2NF9DKDB4ZWNlYmEzNDVlZjVjZWFlYikgLyogIDExNiAqLywgVTY0X0MoMHhmNWNlYjI1ZWJjOTY4NGNlKSAvKiAgMTE3ICovLAorICBVNjRfQygweGY2MzNlMjBjYjdmNzYyMjEpIC8qICAxMTggKi8sIFU2NF9DKDB4YTMyY2RmMDZhYjgyOTNlNCkgLyogIDExOSAqLywKKyAgVTY0X0MoMHg5ODVhMjAyY2E1ZWUyY2E0KSAvKiAgMTIwICovLCBVNjRfQygweGNmMGI4NDQ3Y2M4YThmYjEpIC8qICAxMjEgKi8sCisgIFU2NF9DKDB4OWY3NjUyNDQ5Nzk4NTlhMykgLyogIDEyMiAqLywgVTY0X0MoMHhhOGQ1MTZiMWExMjQwMDE3KSAvKiAgMTIzICovLAorICBVNjRfQygweDBiZDdiYTNlYmI1ZGM3MjYpIC8qICAxMjQgKi8sIFU2NF9DKDB4ZTU0YmNhNTViODZhZGIzOSkgLyogIDEyNSAqLywKKyAgVTY0X0MoMHgxZDdhM2FmZDZjNDc4MDYzKSAvKiAgMTI2ICovLCBVNjRfQygweDUxOWVjNjA4ZTc2NjllZGQpIC8qICAxMjcgKi8sCisgIFU2NF9DKDB4MGU1NzE1YTJkMTQ5YWEyMykgLyogIDEyOCAqLywgVTY0X0MoMHgxNzdkNDU3MTg0OGZmMTk0KSAvKiAgMTI5ICovLAorICBVNjRfQygweGVlYjU1ZjMyNDEwMTRjMjIpIC8qICAxMzAgKi8sIFU2NF9DKDB4MGY1ZTVjYTEzYTZlMmVjMikgLyogIDEzMSAqLywKKyAgVTY0X0MoMHg4MDI5OTI3Yjc1ZjVjMzYxKSAvKiAgMTMyICovLCBVNjRfQygweGFkMTM5ZmFiYzNkNmU0MzYpIC8qICAxMzMgKi8sCisgIFU2NF9DKDB4MGQ1ZGYxYTk0Y2NmNDAyZikgLyogIDEzNCAqLywgVTY0X0MoMHgzZThiZDk0OGJlYTVkZmM4KSAvKiAgMTM1ICovLAorICBVNjRfQygweGE1YTBkMzU3YmQzZmY3N2UpIC8qICAxMzYgKi8sIFU2NF9DKDB4YTJkMTJlMjUxZjc0ZjY0NSkgLyogIDEzNyAqLywKKyAgVTY0X0MoMHg2NmZkOWU1MjVlODFhMDgyKSAvKiAgMTM4ICovLCBVNjRfQygweDJlMGM5MGNlN2Y2ODdhNDkpIC8qICAxMzkgKi8sCisgIFU2NF9DKDB4YzJlOGJjYmViYTk3M2JjNSkgLyogIDE0MCAqLywgVTY0X0MoMHgwMDAwMDFiY2U1MDk3NDVmKSAvKiAgMTQxICovLAorICBVNjRfQygweDQyMzc3N2JiZTZkYWIzZDYpIC8qICAxNDIgKi8sIFU2NF9DKDB4ZDE2NjFjN2VhZWYwNmViNSkgLyogIDE0MyAqLywKKyAgVTY0X0MoMHhhMTc4MWYzNTRkYWFjZmQ4KSAvKiAgMTQ0ICovLCBVNjRfQygweDJkMTEyODRhMmIxNmFmZmMpIC8qICAxNDUgKi8sCisgIFU2NF9DKDB4ZjFmYzRmNjdmYTg5MWQxZikgLyogIDE0NiAqLywgVTY0X0MoMHg3M2VjYzI1ZGNiOTIwYWRhKSAvKiAgMTQ3ICovLAorICBVNjRfQygweGFlNjEwYzIyYzJhMTI2NTEpIC8qICAxNDggKi8sIFU2NF9DKDB4OTZlMGE4MTBkMzU2Yjc4YSkgLyogIDE0OSAqLywKKyAgVTY0X0MoMHg1YTlhMzgxZjJmZTc4NzBmKSAvKiAgMTUwICovLCBVNjRfQygweGQ1YWQ2MmVkZTk0ZTU1MzApIC8qICAxNTEgKi8sCisgIFU2NF9DKDB4ZDIyNWU1ZTgzNjhkMTQyNykgLyogIDE1MiAqLywgVTY0X0MoMHg2NTk3N2I3MGM3YWY0NjMxKSAvKiAgMTUzICovLAorICBVNjRfQygweDk5Zjg4OWIyZGUzOWQ3NGYpIC8qICAxNTQgKi8sIFU2NF9DKDB4MjMzZjMwYmY1NGUxZDE0MykgLyogIDE1NSAqLywKKyAgVTY0X0MoMHg5YTk2NzVkM2Q5YTYzYzk3KSAvKiAgMTU2ICovLCBVNjRfQygweDU0NzA1NTRmZjMzNGY5YTgpIC8qICAxNTcgKi8sCisgIFU2NF9DKDB4MTY2YWNiNzQ0YTRmNTY4OCkgLyogIDE1OCAqLywgVTY0X0MoMHg3MGM3NGNhYWIyZTRhZWFkKSAvKiAgMTU5ICovLAorICBVNjRfQygweGYwZDA5MTY0NmYyOTRkMTIpIC8qICAxNjAgKi8sIFU2NF9DKDB4NTdiODJhODk2ODQwMzFkMSkgLyogIDE2MSAqLywKKyAgVTY0X0MoMHhlZmQ5NWE1YTYxYmUwYjZiKSAvKiAgMTYyICovLCBVNjRfQygweDJmYmQxMmU5NjlmMmYyOWEpIC8qICAxNjMgKi8sCisgIFU2NF9DKDB4OWJkMzcwMTNmZWZmOWZlOCkgLyogIDE2NCAqLywgVTY0X0MoMHgzZjliMDQwNGQ2MDg1YTA2KSAvKiAgMTY1ICovLAorICBVNjRfQygweDQ5NDBjMWYzMTY2Y2ZlMTUpIC8qICAxNjYgKi8sIFU2NF9DKDB4MDk1NDJjNGRjZGYzZGVmYikgLyogIDE2NyAqLywKKyAgVTY0X0MoMHhiNGM1MjE4Mzg1Y2Q1Y2UzKSAvKiAgMTY4ICovLCBVNjRfQygweGM5MzViN2RjNDQ2MmE2NDEpIC8qICAxNjkgKi8sCisgIFU2NF9DKDB4MzQxN2Y4YTY4ZWQzYjYzZikgLyogIDE3MCAqLywgVTY0X0MoMHhiODA5NTkyOTViMjE1YjQwKSAvKiAgMTcxICovLAorICBVNjRfQygweGY5OWNkYWVmM2I4Yzg1NzIpIC8qICAxNzIgKi8sIFU2NF9DKDB4MDE4YzA2MTRmOGZjYjk1ZCkgLyogIDE3MyAqLywKKyAgVTY0X0MoMHgxYjE0YWNjZDFhM2FjZGYzKSAvKiAgMTc0ICovLCBVNjRfQygweDg0ZDQ3MWYyMDBiYjczMmQpIC8qICAxNzUgKi8sCisgIFU2NF9DKDB4YzFhMzExMGU5NWU4ZGExNikgLyogIDE3NiAqLywgVTY0X0MoMHg0MzBhNzIyMGJmMWE4MmI4KSAvKiAgMTc3ICovLAorICBVNjRfQygweGI3N2UwOTBkMzlkZjIxMGUpIC8qICAxNzggKi8sIFU2NF9DKDB4NWVmNGJkOWYzY2QwNWU5ZCkgLyogIDE3OSAqLywKKyAgVTY0X0MoMHg5ZDRmZjZkYTdlNTdhNDQ0KSAvKiAgMTgwICovLCBVNjRfQygweGRhMWQ2MGUxODNkNGE1ZjgpIC8qICAxODEgKi8sCisgIFU2NF9DKDB4YjI4N2MzODQxNzk5OGU0NykgLyogIDE4MiAqLywgVTY0X0MoMHhmZTNlZGMxMjFiYjMxODg2KSAvKiAgMTgzICovLAorICBVNjRfQygweGM3ZmUzY2NjOTgwY2NiZWYpIC8qICAxODQgKi8sIFU2NF9DKDB4ZTQ2ZmI1OTAxODliZmQwMykgLyogIDE4NSAqLywKKyAgVTY0X0MoMHgzNzMyZmQ0NjlhNGM1N2RjKSAvKiAgMTg2ICovLCBVNjRfQygweDdlZjcwMGEwN2NmMWFkNjUpIC8qICAxODcgKi8sCisgIFU2NF9DKDB4NTljNjQ0NjhhMzFkODg1OSkgLyogIDE4OCAqLywgVTY0X0MoMHg3NjJmYjBiNGQ0NWI2MWY2KSAvKiAgMTg5ICovLAorICBVNjRfQygweDE1NWJhZWQwOTkwNDc3MTgpIC8qICAxOTAgKi8sIFU2NF9DKDB4Njg3NTVlNGMzZDUwYmFhNikgLyogIDE5MSAqLywKKyAgVTY0X0MoMHhlOTIxNGU3ZjIyZDhiNGRmKSAvKiAgMTkyICovLCBVNjRfQygweDJhZGRiZjUzMmVhYzk1ZjQpIC8qICAxOTMgKi8sCisgIFU2NF9DKDB4MzJhZTM5MDliNGJkMDEwOSkgLyogIDE5NCAqLywgVTY0X0MoMHg4MzRkZjUzN2IwOGUzNDUwKSAvKiAgMTk1ICovLAorICBVNjRfQygweGZhMjA5ZGE4NDIyMDcyOGQpIC8qICAxOTYgKi8sIFU2NF9DKDB4OWU2OTFkOWI5ZWZlMjNmNykgLyogIDE5NyAqLywKKyAgVTY0X0MoMHgwNDQ2ZDI4OGM0YWU4ZDdmKSAvKiAgMTk4ICovLCBVNjRfQygweDdiNGNjNTI0ZTE2OTc4NWIpIC8qICAxOTkgKi8sCisgIFU2NF9DKDB4MjFkODdmMDEzNWNhMTM4NSkgLyogIDIwMCAqLywgVTY0X0MoMHhjZWJiNDAwZjEzN2I4YWE1KSAvKiAgMjAxICovLAorICBVNjRfQygweDI3MmUyYjY2NTgwNzk2YmUpIC8qICAyMDIgKi8sIFU2NF9DKDB4MzYxMjI2NDEyNWMyYjBkZSkgLyogIDIwMyAqLywKKyAgVTY0X0MoMHgwNTc3MDJiZGFkMWVmYmIyKSAvKiAgMjA0ICovLCBVNjRfQygweGQ0YmFiYjhlYWNmODRiZTkpIC8qICAyMDUgKi8sCisgIFU2NF9DKDB4OTE1ODMxMzk2NDFiYzY3YikgLyogIDIwNiAqLywgVTY0X0MoMHg4YmRjMmRlMDgwMzZlMDI0KSAvKiAgMjA3ICovLAorICBVNjRfQygweDYwM2M4MTU2ZjQ5ZjY4ZWQpIC8qICAyMDggKi8sIFU2NF9DKDB4ZjdkMjM2ZjdkYmVmNTExMSkgLyogIDIwOSAqLywKKyAgVTY0X0MoMHg5NzI3YzQ1OThhZDIxZTgwKSAvKiAgMjEwICovLCBVNjRfQygweGEwOGEwODk2NjcwYTVmZDcpIC8qICAyMTEgKi8sCisgIFU2NF9DKDB4Y2I0YThmNDMwOWViYTljYikgLyogIDIxMiAqLywgVTY0X0MoMHg4MWFmNTY0YjBmNzAzNmExKSAvKiAgMjEzICovLAorICBVNjRfQygweGMwYjk5YWE3NzgxOTlhYmQpIC8qICAyMTQgKi8sIFU2NF9DKDB4OTU5ZjFlYzgzZmM4ZTk1MikgLyogIDIxNSAqLywKKyAgVTY0X0MoMHg4YzUwNTA3Nzc5NGE4MWI5KSAvKiAgMjE2ICovLCBVNjRfQygweDNhY2FhZjhmMDU2MzM4ZjApIC8qICAyMTcgKi8sCisgIFU2NF9DKDB4MDdiNDNmNTA2MjdhNjc3OCkgLyogIDIxOCAqLywgVTY0X0MoMHg0YTQ0YWI0OWY1ZWNjYzc3KSAvKiAgMjE5ICovLAorICBVNjRfQygweDNiYzNkNmU0YjY3OWVlOTgpIC8qICAyMjAgKi8sIFU2NF9DKDB4OWNjMGQ0ZDFjZjE0MTA4YykgLyogIDIyMSAqLywKKyAgVTY0X0MoMHg0NDA2YzAwYjIwNmJjOGEwKSAvKiAgMjIyICovLCBVNjRfQygweDgyYTE4ODU0YzhkNzJkODkpIC8qICAyMjMgKi8sCisgIFU2NF9DKDB4NjdlMzY2YjM1YzNjNDMyYykgLyogIDIyNCAqLywgVTY0X0MoMHhiOTIzZGQ2MTEwMmIzN2YyKSAvKiAgMjI1ICovLAorICBVNjRfQygweDU2YWIyNzc5ZDg4NDI3MWQpIC8qICAyMjYgKi8sIFU2NF9DKDB4YmU4M2UxYjBmZjE1MjVhZikgLyogIDIyNyAqLywKKyAgVTY0X0MoMHhmYjdjNjVkNDIxN2U0OWE5KSAvKiAgMjI4ICovLCBVNjRfQygweDZiZGJlMGU3NmQ0OGU3ZDQpIC8qICAyMjkgKi8sCisgIFU2NF9DKDB4MDhkZjgyODc0NWQ5MTc5ZSkgLyogIDIzMCAqLywgVTY0X0MoMHgyMmVhNmE5YWRkNTNiZDM0KSAvKiAgMjMxICovLAorICBVNjRfQygweGUzNmUxNDFjNTYyMjIwMGEpIC8qICAyMzIgKi8sIFU2NF9DKDB4N2Y4MDVkMWI4Y2I3NTBlZSkgLyogIDIzMyAqLywKKyAgVTY0X0MoMHhhZmU1YzdhNTlmNThlODM3KSAvKiAgMjM0ICovLCBVNjRfQygweGUyN2Y5OTZhNGZiMWMyM2MpIC8qICAyMzUgKi8sCisgIFU2NF9DKDB4ZDM4NjdkZmIwNzc1ZjBkMCkgLyogIDIzNiAqLywgVTY0X0MoMHhkMGU2NzNkZTZlODg4OTFhKSAvKiAgMjM3ICovLAorICBVNjRfQygweDEyM2FlYjllYWZiODZjMjUpIC8qICAyMzggKi8sIFU2NF9DKDB4MzBmMWQ1ZDVjMTQ1Yjg5NSkgLyogIDIzOSAqLywKKyAgVTY0X0MoMHhiYjQzNGEyZGVlNzI2OWU3KSAvKiAgMjQwICovLCBVNjRfQygweDc4Y2I2N2VjZjkzMWZhMzgpIC8qICAyNDEgKi8sCisgIFU2NF9DKDB4ZjMzYjAzNzIzMjNiYmY5YykgLyogIDI0MiAqLywgVTY0X0MoMHg1MmQ2NjMzNmZiMjc5Yzc0KSAvKiAgMjQzICovLAorICBVNjRfQygweDUwNWYzM2FjMGFmYjRlYWEpIC8qICAyNDQgKi8sIFU2NF9DKDB4ZThhNWNkOTlhMmNjZTE4NykgLyogIDI0NSAqLywKKyAgVTY0X0MoMHg1MzQ5NzQ4MDFlMmQzMGJiKSAvKiAgMjQ2ICovLCBVNjRfQygweDhkMmQ1NzExZDU4NzZkOTApIC8qICAyNDcgKi8sCisgIFU2NF9DKDB4MWYxYTQxMjg5MWJjMDM4ZSkgLyogIDI0OCAqLywgVTY0X0MoMHhkNmUyZTcxZDgyZTU2NjQ4KSAvKiAgMjQ5ICovLAorICBVNjRfQygweDc0MDM2YzNhNDk3NzMyYjcpIC8qICAyNTAgKi8sIFU2NF9DKDB4ODliNjdlZDk2MzYxZjVhYikgLyogIDI1MSAqLywKKyAgVTY0X0MoMHhmZmVkOTVkOGYxZWEwMmEyKSAvKiAgMjUyICovLCBVNjRfQygweGU3MmIzYmQ2MTQ2NGQ0M2QpIC8qICAyNTMgKi8sCisgIFU2NF9DKDB4YTYzMDBmMTcwYmRjNDgyMCkgLyogIDI1NCAqLywgVTY0X0MoMHhlYmMxODc2MGVkNzhhNzdhKSAvKiAgMjU1ICovCit9Oworc3RhdGljIHU2NCBzYm94MlsyNTZdID0geworICBVNjRfQygweGU2YTZiZTVhMDVhMTIxMzgpIC8qICAyNTYgKi8sIFU2NF9DKDB4YjVhMTIyYTViNGY4N2M5OCkgLyogIDI1NyAqLywKKyAgVTY0X0MoMHg1NjNjNjA4OTE0MGI2OTkwKSAvKiAgMjU4ICovLCBVNjRfQygweDRjNDZjYjJlMzkxZjVkZDUpIC8qICAyNTkgKi8sCisgIFU2NF9DKDB4ZDkzMmFkZGJjOWI3OTQzNCkgLyogIDI2MCAqLywgVTY0X0MoMHgwOGVhNzBlNDIwMTVhZmY1KSAvKiAgMjYxICovLAorICBVNjRfQygweGQ3NjVhNjY3M2U0NzhjZjEpIC8qICAyNjIgKi8sIFU2NF9DKDB4YzRmYjc1N2VhYjI3OGQ5OSkgLyogIDI2MyAqLywKKyAgVTY0X0MoMHhkZjExYzY4NjJkNmUwNjkyKSAvKiAgMjY0ICovLCBVNjRfQygweGRkZWI4NGYxMGQ3ZjNiMTYpIC8qICAyNjUgKi8sCisgIFU2NF9DKDB4NmYyZWY2MDRhNjY1ZWEwNCkgLyogIDI2NiAqLywgVTY0X0MoMHg0YThlMGYwZmYwZTBkZmIzKSAvKiAgMjY3ICovLAorICBVNjRfQygweGE1ZWRlZWY4M2RiY2JhNTEpIC8qICAyNjggKi8sIFU2NF9DKDB4ZmM0ZjBhMmEwZWE0MzcxZSkgLyogIDI2OSAqLywKKyAgVTY0X0MoMHhlODNlMWRhODVjYjM4NDI5KSAvKiAgMjcwICovLCBVNjRfQygweGRjOGZmODgyYmExYjFjZTIpIC8qICAyNzEgKi8sCisgIFU2NF9DKDB4Y2Q0NTUwNWU4MzUzZTgwZCkgLyogIDI3MiAqLywgVTY0X0MoMHgxOGQxOWEwMGQ0ZGIwNzE3KSAvKiAgMjczICovLAorICBVNjRfQygweDM0YTBjZmVkYTVmMzgxMDEpIC8qICAyNzQgKi8sIFU2NF9DKDB4MGJlNzdlNTE4ODg3Y2FmMikgLyogIDI3NSAqLywKKyAgVTY0X0MoMHgxZTM0MTQzOGIzYzQ1MTM2KSAvKiAgMjc2ICovLCBVNjRfQygweGUwNTc5N2Y0OTA4OWNjZjkpIC8qICAyNzcgKi8sCisgIFU2NF9DKDB4ZmZkMjNmOWRmMjU5MWQxNCkgLyogIDI3OCAqLywgVTY0X0MoMHg1NDNkZGEyMjg1OTVjNWNkKSAvKiAgMjc5ICovLAorICBVNjRfQygweDY2MWY4MWZkOTkwNTJhMzMpIC8qICAyODAgKi8sIFU2NF9DKDB4ODczNmU2NDFkYjBmN2I3NikgLyogIDI4MSAqLywKKyAgVTY0X0MoMHgxNTIyNzcyNTQxOGU1MzA3KSAvKiAgMjgyICovLCBVNjRfQygweGUyNWY3ZjQ2MTYyZWIyZmEpIC8qICAyODMgKi8sCisgIFU2NF9DKDB4NDhhOGIyMTI2YzEzZDlmZSkgLyogIDI4NCAqLywgVTY0X0MoMHhhZmRjNTQxNzkyZTc2ZWVhKSAvKiAgMjg1ICovLAorICBVNjRfQygweDAzZDkxMmJmYzZkMTg5OGYpIC8qICAyODYgKi8sIFU2NF9DKDB4MzFiMWFhZmExYjgzZjUxYikgLyogIDI4NyAqLywKKyAgVTY0X0MoMHhmMWFjMjc5NmU0MmFiN2Q5KSAvKiAgMjg4ICovLCBVNjRfQygweDQwYTNhN2Q3ZmNkMmViYWMpIC8qICAyODkgKi8sCisgIFU2NF9DKDB4MTA1NjEzNmQwYWZiYmNjNSkgLyogIDI5MCAqLywgVTY0X0MoMHg3ODg5ZTFkZDlhNmQwYzg1KSAvKiAgMjkxICovLAorICBVNjRfQygweGQzMzUyNTc4MmE3OTc0YWEpIC8qICAyOTIgKi8sIFU2NF9DKDB4YTdlMjVkMDkwNzhhYzA5YikgLyogIDI5MyAqLywKKyAgVTY0X0MoMHhiZDQxMzhiM2VhYzZlZGQwKSAvKiAgMjk0ICovLCBVNjRfQygweDkyMGFiZmJlNzFlYjllNzApIC8qICAyOTUgKi8sCisgIFU2NF9DKDB4YTJhNWQwZjU0ZmMyNjI1YykgLyogIDI5NiAqLywgVTY0X0MoMHhjMDU0ZTM2YjBiMTI5MGEzKSAvKiAgMjk3ICovLAorICBVNjRfQygweGY2ZGQ1OWZmNjJmZTkzMmIpIC8qICAyOTggKi8sIFU2NF9DKDB4MzUzNzM1NDUxMWE4YWM3ZCkgLyogIDI5OSAqLywKKyAgVTY0X0MoMHhjYTg0NWU5MTcyZmFkY2Q0KSAvKiAgMzAwICovLCBVNjRfQygweDg0ZjgyYjYwMzI5ZDIwZGMpIC8qICAzMDEgKi8sCisgIFU2NF9DKDB4NzljNjJjZTFjZDY3MmYxOCkgLyogIDMwMiAqLywgVTY0X0MoMHg4YjA5YTJhZGQxMjQ2NDJjKSAvKiAgMzAzICovLAorICBVNjRfQygweGQwYzFlOTZhMTlkOWU3MjYpIC8qICAzMDQgKi8sIFU2NF9DKDB4NWE3ODZhOWI0YmE5NTAwYykgLyogIDMwNSAqLywKKyAgVTY0X0MoMHgwZTAyMDMzNjYzNGM0M2YzKSAvKiAgMzA2ICovLCBVNjRfQygweGMxN2I0NzRhZWI2NmQ4MjIpIC8qICAzMDcgKi8sCisgIFU2NF9DKDB4NmE3MzFhZTNlYzliYWFjMikgLyogIDMwOCAqLywgVTY0X0MoMHg4MjI2NjY3YWUwODQwMjU4KSAvKiAgMzA5ICovLAorICBVNjRfQygweDY3ZDQ1Njc2OTFjYWVjYTUpIC8qICAzMTAgKi8sIFU2NF9DKDB4MWQ5NDE1NWM0ODc1YWRiNSkgLyogIDMxMSAqLywKKyAgVTY0X0MoMHg2ZDAwZmQ5ODViODEzZmRmKSAvKiAgMzEyICovLCBVNjRfQygweDUxMjg2ZWZjYjc3NGNkMDYpIC8qICAzMTMgKi8sCisgIFU2NF9DKDB4NWU4ODM0NDcxZmE3NDRhZikgLyogIDMxNCAqLywgVTY0X0MoMHhmNzJjYTBhZWU3NjFhZTJlKSAvKiAgMzE1ICovLAorICBVNjRfQygweGJlNDBlNGNkYWVlOGUwOWEpIC8qICAzMTYgKi8sIFU2NF9DKDB4ZTk5NzBiYmI1MTE4ZjY2NSkgLyogIDMxNyAqLywKKyAgVTY0X0MoMHg3MjZlNGJlYjMzZGYxOTY0KSAvKiAgMzE4ICovLCBVNjRfQygweDcwM2IwMDA3MjkxOTk3NjIpIC8qICAzMTkgKi8sCisgIFU2NF9DKDB4NDYzMWQ4MTZmNWVmMzBhNykgLyogIDMyMCAqLywgVTY0X0MoMHhiODgwYjViNTE1MDRhNmJlKSAvKiAgMzIxICovLAorICBVNjRfQygweDY0MTc5M2MzN2VkODRiNmMpIC8qICAzMjIgKi8sIFU2NF9DKDB4N2IyMWVkNzdmNmU5N2Q5NikgLyogIDMyMyAqLywKKyAgVTY0X0MoMHg3NzYzMDYzMTJlZjk2YjczKSAvKiAgMzI0ICovLCBVNjRfQygweGFlNTI4OTQ4ZTg2ZmYzZjQpIC8qICAzMjUgKi8sCisgIFU2NF9DKDB4NTNkYmQ3ZjI4NmEzZjhmOCkgLyogIDMyNiAqLywgVTY0X0MoMHgxNmNhZGNlNzRjZmMxMDYzKSAvKiAgMzI3ICovLAorICBVNjRfQygweDAwNWMxOWJkZmE1MmM2ZGQpIC8qICAzMjggKi8sIFU2NF9DKDB4Njg4NjhmNWQ2NGQ0NmFkMykgLyogIDMyOSAqLywKKyAgVTY0X0MoMHgzYTlkNTEyY2NmMWUxODZhKSAvKiAgMzMwICovLCBVNjRfQygweDM2N2U2MmMyMzg1NjYwYWUpIC8qICAzMzEgKi8sCisgIFU2NF9DKDB4ZTM1OWU3ZWE3N2RjYjFkNykgLyogIDMzMiAqLywgVTY0X0MoMHg1MjZjMDc3Mzc0OWFiZTZlKSAvKiAgMzMzICovLAorICBVNjRfQygweDczNWFlNWY5ZDA5ZjczNGIpIC8qICAzMzQgKi8sIFU2NF9DKDB4NDkzZmM3Y2M4YTU1OGJhOCkgLyogIDMzNSAqLywKKyAgVTY0X0MoMHhiMGI5YzE1MzMwNDFhYjQ1KSAvKiAgMzM2ICovLCBVNjRfQygweDMyMTk1OGJhNDcwYTU5YmQpIC8qICAzMzcgKi8sCisgIFU2NF9DKDB4ODUyZGIwMGI1ZjQ2YzM5MykgLyogIDMzOCAqLywgVTY0X0MoMHg5MTIwOWIyYmQzMzZiMGU1KSAvKiAgMzM5ICovLAorICBVNjRfQygweDZlNjA0ZjdkNjU5ZWYxOWYpIC8qICAzNDAgKi8sIFU2NF9DKDB4Yjk5YThhZTI3ODJjY2IyNCkgLyogIDM0MSAqLywKKyAgVTY0X0MoMHhjY2Y1MmFiNmM4MTRjNGM3KSAvKiAgMzQyICovLCBVNjRfQygweDQ3MjdkOWFmYmUxMTcyN2IpIC8qICAzNDMgKi8sCisgIFU2NF9DKDB4N2U5NTBkMGMwMTIxYjM0ZCkgLyogIDM0NCAqLywgVTY0X0MoMHg3NTZmNDM1NjcwYWQ0NzFmKSAvKiAgMzQ1ICovLAorICBVNjRfQygweGY1YWRkNDQyNjE1YTY4NDkpIC8qICAzNDYgKi8sIFU2NF9DKDB4NGU4N2UwOTk4MGI5OTU3YSkgLyogIDM0NyAqLywKKyAgVTY0X0MoMHgyYWNmYTFkZjUwYWVlMzU1KSAvKiAgMzQ4ICovLCBVNjRfQygweGQ4OTgyNjNhZmQyZmQ1NTYpIC8qICAzNDkgKi8sCisgIFU2NF9DKDB4YzhmNDkyNGRkODBjOGZkNikgLyogIDM1MCAqLywgVTY0X0MoMHhjZjk5Y2EzZDc1NGExNzNhKSAvKiAgMzUxICovLAorICBVNjRfQygweGZlNDc3YmFjYWY5MWJmM2MpIC8qICAzNTIgKi8sIFU2NF9DKDB4ZWQ1MzcxZjZkNjkwYzEyZCkgLyogIDM1MyAqLywKKyAgVTY0X0MoMHg4MzFhNWMyODVlNjg3MDk0KSAvKiAgMzU0ICovLCBVNjRfQygweGM1ZDNjOTBhMzcwOGEwYTQpIC8qICAzNTUgKi8sCisgIFU2NF9DKDB4MGY3ZjkwMzcxN2QwNjU4MCkgLyogIDM1NiAqLywgVTY0X0MoMHgxOWY5YmIxM2I4ZmRmMjdmKSAvKiAgMzU3ICovLAorICBVNjRfQygweGIxYmQ2ZjFiNGQ1MDI4NDMpIC8qICAzNTggKi8sIFU2NF9DKDB4MWM3NjFiYTM4ZmZmNDAxMikgLyogIDM1OSAqLywKKyAgVTY0X0MoMHgwZDE1MzBjNGUyZTIxZjNiKSAvKiAgMzYwICovLCBVNjRfQygweDg5NDNjZTY5YTczNzJjOGEpIC8qICAzNjEgKi8sCisgIFU2NF9DKDB4ZTUxODRlMTFmZWI1Y2U2NikgLyogIDM2MiAqLywgVTY0X0MoMHg2MThiZGI4MGJkNzM2NjIxKSAvKiAgMzYzICovLAorICBVNjRfQygweDdkMjliYWQ2OGI1NzRkMGIpIC8qICAzNjQgKi8sIFU2NF9DKDB4ODFiYjYxM2UyNWU2ZmU1YikgLyogIDM2NSAqLywKKyAgVTY0X0MoMHgwNzFjOWMxMGJjMDc5MTNmKSAvKiAgMzY2ICovLCBVNjRfQygweGM3YmVlYjc5MDlhYzJkOTcpIC8qICAzNjcgKi8sCisgIFU2NF9DKDB4YzNlNThkMzUzYmM1ZDc1NykgLyogIDM2OCAqLywgVTY0X0MoMHhlYjAxNzg5MmYzOGY2MWU4KSAvKiAgMzY5ICovLAorICBVNjRfQygweGQ0ZWZmYjljOWIxY2MyMWEpIC8qICAzNzAgKi8sIFU2NF9DKDB4OTk3MjdkMjZmNDk0ZjdhYikgLyogIDM3MSAqLywKKyAgVTY0X0MoMHhhM2UwNjNhMjk1NmIzZTAzKSAvKiAgMzcyICovLCBVNjRfQygweDlkNGE4YjlhNGFhMDljMzApIC8qICAzNzMgKi8sCisgIFU2NF9DKDB4M2Y2YWI3ZDUwMDA5MGZiNCkgLyogIDM3NCAqLywgVTY0X0MoMHg5Y2MwZjJhMDU3MjY4YWMwKSAvKiAgMzc1ICovLAorICBVNjRfQygweDNkZWU5ZDJkZWRiZjQyZDEpIC8qICAzNzYgKi8sIFU2NF9DKDB4MzMwZjQ5Yzg3OTYwYTk3MikgLyogIDM3NyAqLywKKyAgVTY0X0MoMHhjNmIyNzIwMjg3NDIxYjQxKSAvKiAgMzc4ICovLCBVNjRfQygweDBhYzU5ZWMwN2MwMDM2OWMpIC8qICAzNzkgKi8sCisgIFU2NF9DKDB4ZWY0ZWFjNDljYjM1MzQyNSkgLyogIDM4MCAqLywgVTY0X0MoMHhmNDUwMjQ0ZWVmMDEyOWQ4KSAvKiAgMzgxICovLAorICBVNjRfQygweDhhY2M0NmU1Y2FmNGRlYjYpIC8qICAzODIgKi8sIFU2NF9DKDB4MmZmZWFiNjM5ODkyNjNmNykgLyogIDM4MyAqLywKKyAgVTY0X0MoMHg4ZjdjYjlmZTVkN2E0NTc4KSAvKiAgMzg0ICovLCBVNjRfQygweDViZDhmNzY0NGU2MzQ2MzUpIC8qICAzODUgKi8sCisgIFU2NF9DKDB4NDI3YTczMTViZjJkYzkwMCkgLyogIDM4NiAqLywgVTY0X0MoMHgxN2QwYzRhYTIxMjUyNjFjKSAvKiAgMzg3ICovLAorICBVNjRfQygweDM5OTI0ODZjOTM1MThlNTApIC8qICAzODggKi8sIFU2NF9DKDB4YjRjYmZlZTBhMmQ3ZDRjMykgLyogIDM4OSAqLywKKyAgVTY0X0MoMHg3Yzc1ZDYyMDJjNWRkZDhkKSAvKiAgMzkwICovLCBVNjRfQygweGRiYzI5NWQ4ZTM1YjZjNjEpIC8qICAzOTEgKi8sCisgIFU2NF9DKDB4NjBiMzY5ZDMwMjAzMmIxOSkgLyogIDM5MiAqLywgVTY0X0MoMHhjZTQyNjg1ZmRjZTQ0MTMyKSAvKiAgMzkzICovLAorICBVNjRfQygweDA2ZjNkZGI5ZGRmNjU2MTApIC8qICAzOTQgKi8sIFU2NF9DKDB4OGVhNGQyMWRiNWUxNDhmMCkgLyogIDM5NSAqLywKKyAgVTY0X0MoMHgyMGIwZmNlNjJmY2Q0OTZmKSAvKiAgMzk2ICovLCBVNjRfQygweDJjMWI5MTIzNThiMGVlMzEpIC8qICAzOTcgKi8sCisgIFU2NF9DKDB4YjI4MzE3YjgxOGY1YTMwOCkgLyogIDM5OCAqLywgVTY0X0MoMHhhODljMWUxODljYTZkMmNmKSAvKiAgMzk5ICovLAorICBVNjRfQygweDBjNmIxODU3NmFhYWRiYzgpIC8qICA0MDAgKi8sIFU2NF9DKDB4YjY1ZGVhYTkxMjk5ZmFlMykgLyogIDQwMSAqLywKKyAgVTY0X0MoMHhmYjJiNzk0YjdmMTAyN2U3KSAvKiAgNDAyICovLCBVNjRfQygweDA0ZTQzMTdmNDQzYjViZWIpIC8qICA0MDMgKi8sCisgIFU2NF9DKDB4NGI4NTJkMzI1OTM5ZDBhNikgLyogIDQwNCAqLywgVTY0X0MoMHhkNWFlNmJlZWZiMjA3ZmZjKSAvKiAgNDA1ICovLAorICBVNjRfQygweDMwOTY4MmIyODFjN2QzNzQpIC8qICA0MDYgKi8sIFU2NF9DKDB4YmFlMzA5YTE5NGMzYjQ3NSkgLyogIDQwNyAqLywKKyAgVTY0X0MoMHg4Y2MzZjk3YjEzYjQ5ZjA1KSAvKiAgNDA4ICovLCBVNjRfQygweDk4YTk0MjJmZjgyOTM5NjcpIC8qICA0MDkgKi8sCisgIFU2NF9DKDB4MjQ0YjE2YjAxMDc2ZmY3YykgLyogIDQxMCAqLywgVTY0X0MoMHhmOGJmNTcxYzY2M2Q2N2VlKSAvKiAgNDExICovLAorICBVNjRfQygweDFmMGQ2NzU4ZWVlMzBkYTEpIC8qICA0MTIgKi8sIFU2NF9DKDB4YzliNjExZDk3YWRlYjliNykgLyogIDQxMyAqLywKKyAgVTY0X0MoMHhiN2FmZDU4ODdiNmM1N2EyKSAvKiAgNDE0ICovLCBVNjRfQygweDYyOTBhZTg0NmI5ODRmZTEpIC8qICA0MTUgKi8sCisgIFU2NF9DKDB4OTRkZjRjZGVhY2MxYTVmZCkgLyogIDQxNiAqLywgVTY0X0MoMHgwNThhNWJkMWM1NDgzYWZmKSAvKiAgNDE3ICovLAorICBVNjRfQygweDYzMTY2Y2MxNDJiYTNjMzcpIC8qICA0MTggKi8sIFU2NF9DKDB4OGRiODUyNmViMmY3NmY0MCkgLyogIDQxOSAqLywKKyAgVTY0X0MoMHhlMTA4ODAwMzZmMGQ2ZDRlKSAvKiAgNDIwICovLCBVNjRfQygweDllMDUyM2M5OTcxZDMxMWQpIC8qICA0MjEgKi8sCisgIFU2NF9DKDB4NDVlYzI4MjRjYzdjZDY5MSkgLyogIDQyMiAqLywgVTY0X0MoMHg1NzViODM1OWU2MjM4MmM5KSAvKiAgNDIzICovLAorICBVNjRfQygweGZhOWU0MDBkYzQ4ODk5OTUpIC8qICA0MjQgKi8sIFU2NF9DKDB4ZDE4MjNlY2I0NTcyMTU2OCkgLyogIDQyNSAqLywKKyAgVTY0X0MoMHhkYWZkOTgzYjgyMDYwODJmKSAvKiAgNDI2ICovLCBVNjRfQygweGFhN2QyOTA4MjM4NmE4Y2IpIC8qICA0MjcgKi8sCisgIFU2NF9DKDB4MjY5ZmNkNDQwM2I4NzU4OCkgLyogIDQyOCAqLywgVTY0X0MoMHgxYjkxZjVmNzI4YmRkMWUwKSAvKiAgNDI5ICovLAorICBVNjRfQygweGU0NjY5ZjM5MDQwMjAxZjYpIC8qICA0MzAgKi8sIFU2NF9DKDB4N2ExZDdjMjE4Y2YwNGFkZSkgLyogIDQzMSAqLywKKyAgVTY0X0MoMHg2NTYyM2MyOWQ3OWNlNWNlKSAvKiAgNDMyICovLCBVNjRfQygweDIzNjg0NDkwOTZjMDBiYjEpIC8qICA0MzMgKi8sCisgIFU2NF9DKDB4YWI5YmYxODc5ZGE1MDNiYSkgLyogIDQzNCAqLywgVTY0X0MoMHhiYzIzZWNiMWE0NTgwNThlKSAvKiAgNDM1ICovLAorICBVNjRfQygweDlhNThkZjAxYmI0MDFlY2MpIC8qICA0MzYgKi8sIFU2NF9DKDB4YTA3MGU4NjhhODVmMTQzZCkgLyogIDQzNyAqLywKKyAgVTY0X0MoMHg0ZmYxODgzMDdkZjIyMzllKSAvKiAgNDM4ICovLCBVNjRfQygweDE0ZDU2NWI0MWE2NDExODMpIC8qICA0MzkgKi8sCisgIFU2NF9DKDB4ZWUxMzMzNzQ1MjcwMTYwMikgLyogIDQ0MCAqLywgVTY0X0MoMHg5NTBlM2RjZjNmMjg1ZTA5KSAvKiAgNDQxICovLAorICBVNjRfQygweDU5OTMwMjU0YjljODA5NTMpIC8qICA0NDIgKi8sIFU2NF9DKDB4M2JmMjk5NDA4OTMwZGE2ZCkgLyogIDQ0MyAqLywKKyAgVTY0X0MoMHhhOTU1OTQzZjUzNjkxMzg3KSAvKiAgNDQ0ICovLCBVNjRfQygweGExNWVkZWNhYTljYjg3ODQpIC8qICA0NDUgKi8sCisgIFU2NF9DKDB4MjkxNDIxMjczNTJiZTlhMCkgLyogIDQ0NiAqLywgVTY0X0MoMHg3NmYwMzcxZmZmNGU3YWZiKSAvKiAgNDQ3ICovLAorICBVNjRfQygweDAyMzlmNDUwMjc0ZjIyMjgpIC8qICA0NDggKi8sIFU2NF9DKDB4YmIwNzNhZjAxZDVlODY4YikgLyogIDQ0OSAqLywKKyAgVTY0X0MoMHhiZmM4MDU3MWMxMGU5NmMxKSAvKiAgNDUwICovLCBVNjRfQygweGQyNjcwODg1NjgyMjJlMjMpIC8qICA0NTEgKi8sCisgIFU2NF9DKDB4OTY3MWEzZDQ4ZTgwYjViMCkgLyogIDQ1MiAqLywgVTY0X0MoMHg1NWI1ZDM4YWUxOTNiYjgxKSAvKiAgNDUzICovLAorICBVNjRfQygweDY5M2FlMmQwYTE4YjA0YjgpIC8qICA0NTQgKi8sIFU2NF9DKDB4NWM0OGI0ZWNhZGQ1MzM1ZikgLyogIDQ1NSAqLywKKyAgVTY0X0MoMHhmZDc0M2IxOTQ5MTZhMWNhKSAvKiAgNDU2ICovLCBVNjRfQygweDI1NzcwMTgxMzRiZTk4YzQpIC8qICA0NTcgKi8sCisgIFU2NF9DKDB4ZTc3OTg3ZTgzYzU0YTRhZCkgLyogIDQ1OCAqLywgVTY0X0MoMHgyOGUxMTAxNGRhMzNlMWI5KSAvKiAgNDU5ICovLAorICBVNjRfQygweDI3MGNjNTllMjI2YWEyMTMpIC8qICA0NjAgKi8sIFU2NF9DKDB4NzE0OTVmNzU2ZDFhNWY2MCkgLyogIDQ2MSAqLywKKyAgVTY0X0MoMHg5YmU4NTNmYjYwYWZlZjc3KSAvKiAgNDYyICovLCBVNjRfQygweGFkYzc4NmE3Zjc0NDNkYmYpIC8qICA0NjMgKi8sCisgIFU2NF9DKDB4MDkwNDQ1NjE3M2IyOWE4MikgLyogIDQ2NCAqLywgVTY0X0MoMHg1OGJjN2E2NmMyMzJiZDVlKSAvKiAgNDY1ICovLAorICBVNjRfQygweGYzMDY1NThjNjczYWM4YjIpIC8qICA0NjYgKi8sIFU2NF9DKDB4NDFmNjM5YzZiNmM5NzcyYSkgLyogIDQ2NyAqLywKKyAgVTY0X0MoMHgyMTZkZWZlOTlmZGEzNWRhKSAvKiAgNDY4ICovLCBVNjRfQygweDExNjQwY2M3MWM3YmU2MTUpIC8qICA0NjkgKi8sCisgIFU2NF9DKDB4OTNjNDM2OTQ1NjVjNTUyNykgLyogIDQ3MCAqLywgVTY0X0MoMHhlYTAzOGU2MjQ2Nzc3ODM5KSAvKiAgNDcxICovLAorICBVNjRfQygweGY5YWJmM2NlNWEzZTI0NjkpIC8qICA0NzIgKi8sIFU2NF9DKDB4NzQxZTc2OGQwZmQzMTJkMikgLyogIDQ3MyAqLywKKyAgVTY0X0MoMHgwMTQ0Yjg4M2NlZDY1MmM2KSAvKiAgNDc0ICovLCBVNjRfQygweGMyMGI1YTViYTMzZjg1NTIpIC8qICA0NzUgKi8sCisgIFU2NF9DKDB4MWFlNjk2MzNjMzQzNWE5ZCkgLyogIDQ3NiAqLywgVTY0X0MoMHg5N2EyOGNhNDA4OGNmZGVjKSAvKiAgNDc3ICovLAorICBVNjRfQygweDg4MjRhNDNjMWU5NmY0MjApIC8qICA0NzggKi8sIFU2NF9DKDB4Mzc2MTJmYTY2ZWVlYTc0NikgLyogIDQ3OSAqLywKKyAgVTY0X0MoMHg2YjRjYjE2NWY5Y2YwZTVhKSAvKiAgNDgwICovLCBVNjRfQygweDQzYWExYzA2YTBhYmZiNGEpIC8qICA0ODEgKi8sCisgIFU2NF9DKDB4N2Y0ZGMyNmZmMTYyNzk2YikgLyogIDQ4MiAqLywgVTY0X0MoMHg2Y2JhY2M4ZTU0ZWQ5YjBmKSAvKiAgNDgzICovLAorICBVNjRfQygweGE2YjdmZmVmZDJiYjI1M2UpIC8qICA0ODQgKi8sIFU2NF9DKDB4MmUyNWJjOTViMGEyOWQ0ZikgLyogIDQ4NSAqLywKKyAgVTY0X0MoMHg4NmQ2YTU4YmRlZjEzODhjKSAvKiAgNDg2ICovLCBVNjRfQygweGRlZDc0YWM1NzZiNmYwNTQpIC8qICA0ODcgKi8sCisgIFU2NF9DKDB4ODAzMGJkYmMyYjQ1ODA1ZCkgLyogIDQ4OCAqLywgVTY0X0MoMHgzYzgxYWY3MGU5NGQ5Mjg5KSAvKiAgNDg5ICovLAorICBVNjRfQygweDNlZmY2ZGRhOWUzMTAwZGIpIC8qICA0OTAgKi8sIFU2NF9DKDB4YjM4ZGMzOWZkZmNjODg0NykgLyogIDQ5MSAqLywKKyAgVTY0X0MoMHgxMjM4ODU1MjhkMTdiODdlKSAvKiAgNDkyICovLCBVNjRfQygweGYyZGEwZWQyNDBiMWI2NDIpIC8qICA0OTMgKi8sCisgIFU2NF9DKDB4NDRjZWZhZGNkNTRiZjlhOSkgLyogIDQ5NCAqLywgVTY0X0MoMHgxMzEyMjAwZTQzM2M3ZWU2KSAvKiAgNDk1ICovLAorICBVNjRfQygweDlmZmNjODRmM2E3OGM3NDgpIC8qICA0OTYgKi8sIFU2NF9DKDB4ZjBjZDFmNzIyNDg1NzZiYikgLyogIDQ5NyAqLywKKyAgVTY0X0MoMHhlYzY5NzQwNTM2MzhjZmU0KSAvKiAgNDk4ICovLCBVNjRfQygweDJiYTdiNjdjMGNlYzRlNGMpIC8qICA0OTkgKi8sCisgIFU2NF9DKDB4YWMyZjRkZjNlNWNlMzJlZCkgLyogIDUwMCAqLywgVTY0X0MoMHhjYjMzZDE0MzI2ZWE0YzExKSAvKiAgNTAxICovLAorICBVNjRfQygweGE0ZTkwNDRjYzc3ZTU4YmMpIC8qICA1MDIgKi8sIFU2NF9DKDB4NWY1MTMyOTNkOTM0ZmNlZikgLyogIDUwMyAqLywKKyAgVTY0X0MoMHg1ZGM5NjQ1NTA2ZTU1NDQ0KSAvKiAgNTA0ICovLCBVNjRfQygweDUwZGU0MThmMzE3ZGU0MGEpIC8qICA1MDUgKi8sCisgIFU2NF9DKDB4Mzg4Y2IzMWE2OWRkZTI1OSkgLyogIDUwNiAqLywgVTY0X0MoMHgyZGI0YTgzNDU1ODIwYTg2KSAvKiAgNTA3ICovLAorICBVNjRfQygweDkwMTBhOTFlODQ3MTFhZTkpIC8qICA1MDggKi8sIFU2NF9DKDB4NGRmN2YwYjdiMTQ5ODM3MSkgLyogIDUwOSAqLywKKyAgVTY0X0MoMHhkNjJhMmVhYmMwOTc3MTc5KSAvKiAgNTEwICovLCBVNjRfQygweDIyZmFjMDk3YWE4ZDVjMGUpIC8qICA1MTEgKi8KK307CitzdGF0aWMgdTY0IHNib3gzWzI1Nl0gPSB7CisgIFU2NF9DKDB4ZjQ5ZmNjMmZmMWRhZjM5YikgLyogIDUxMiAqLywgVTY0X0MoMHg0ODdmZDVjNjZmZjI5MjgxKSAvKiAgNTEzICovLAorICBVNjRfQygweGU4YTMwNjY3ZmNkY2E4M2YpIC8qICA1MTQgKi8sIFU2NF9DKDB4MmM5YjRiZTNkMmZjY2U2MykgLyogIDUxNSAqLywKKyAgVTY0X0MoMHhkYTNmZjc0YjkzZmJiYmMyKSAvKiAgNTE2ICovLCBVNjRfQygweDJmYTE2NWQyZmU3MGJhNjYpIC8qICA1MTcgKi8sCisgIFU2NF9DKDB4YTEwM2UyNzk5NzBlOTNkNCkgLyogIDUxOCAqLywgVTY0X0MoMHhiZWNkZWM3N2IwZTQ1ZTcxKSAvKiAgNTE5ICovLAorICBVNjRfQygweGNmYjQxZTcyMzk4NWU0OTcpIC8qICA1MjAgKi8sIFU2NF9DKDB4YjcwYWFhMDI1ZWY3NTAxNykgLyogIDUyMSAqLywKKyAgVTY0X0MoMHhkNDIzMDlmMDM4NDBiOGUwKSAvKiAgNTIyICovLCBVNjRfQygweDhlZmMxYWQwMzU4OTg1NzkpIC8qICA1MjMgKi8sCisgIFU2NF9DKDB4OTZjNjkyMGJlMmIyYWJjNSkgLyogIDUyNCAqLywgVTY0X0MoMHg2NmFmNDE2MzM3NWE5MTcyKSAvKiAgNTI1ICovLAorICBVNjRfQygweDIxNzRhYmRjY2E3MTI3ZmIpIC8qICA1MjYgKi8sIFU2NF9DKDB4YjMzY2NlYTY0YTcyZmY0MSkgLyogIDUyNyAqLywKKyAgVTY0X0MoMHhmMDRhNDkzMzA4MzA2NmE1KSAvKiAgNTI4ICovLCBVNjRfQygweDhkOTcwYWNkZDcyODlhZjUpIC8qICA1MjkgKi8sCisgIFU2NF9DKDB4OGY5NmU4ZTAzMWM4YzI1ZSkgLyogIDUzMCAqLywgVTY0X0MoMHhmM2ZlYzAyMjc2ODc1ZDQ3KSAvKiAgNTMxICovLAorICBVNjRfQygweGVjN2JmMzEwMDU2MTkwZGQpIC8qICA1MzIgKi8sIFU2NF9DKDB4ZjVhZGIwYWViYjBmMTQ5MSkgLyogIDUzMyAqLywKKyAgVTY0X0MoMHg5YjUwZjg4NTBmZDU4ODkyKSAvKiAgNTM0ICovLCBVNjRfQygweDQ5NzU0ODgzNThiNzRkZTgpIC8qICA1MzUgKi8sCisgIFU2NF9DKDB4YTMzNTRmZjY5MTUzMWM2MSkgLyogIDUzNiAqLywgVTY0X0MoMHgwNzAyYmJlNDgxZDJjNmVlKSAvKiAgNTM3ICovLAorICBVNjRfQygweDg5ZmIyNDA1N2RlZGVkOTgpIC8qICA1MzggKi8sIFU2NF9DKDB4YWMzMDc1MTM4NTk2ZTkwMikgLyogIDUzOSAqLywKKyAgVTY0X0MoMHgxZDJkMzU4MDE3Mjc3MmVkKSAvKiAgNTQwICovLCBVNjRfQygweGViNzM4ZmMyOGU2YmMzMGQpIC8qICA1NDEgKi8sCisgIFU2NF9DKDB4NTg1NGVmOGY2MzA0NDMyNikgLyogIDU0MiAqLywgVTY0X0MoMHg5ZTVjNTIzMjVhZGQzYmJlKSAvKiAgNTQzICovLAorICBVNjRfQygweDkwYWE1M2NmMzI1YzQ2MjMpIC8qICA1NDQgKi8sIFU2NF9DKDB4YzFkMjRkNTEzNDlkZDA2NykgLyogIDU0NSAqLywKKyAgVTY0X0MoMHgyMDUxY2ZlZWE2OWVhNjI0KSAvKiAgNTQ2ICovLCBVNjRfQygweDEzMjIwZjBhODYyZTdlNGYpIC8qICA1NDcgKi8sCisgIFU2NF9DKDB4Y2UzOTM5OTQwNGUwNDg2NCkgLyogIDU0OCAqLywgVTY0X0MoMHhkOWM0MmNhNDcwODZmY2I3KSAvKiAgNTQ5ICovLAorICBVNjRfQygweDY4NWFkMjIzOGEwM2U3Y2MpIC8qICA1NTAgKi8sIFU2NF9DKDB4MDY2NDg0YjJhYjJmZjFkYikgLyogIDU1MSAqLywKKyAgVTY0X0MoMHhmZTlkNWQ3MGVmYmY3OWVjKSAvKiAgNTUyICovLCBVNjRfQygweDViMTNiOWRkOWM0ODE4NTQpIC8qICA1NTMgKi8sCisgIFU2NF9DKDB4MTVmMGQ0NzVlZDE1MDlhZCkgLyogIDU1NCAqLywgVTY0X0MoMHgwYmViY2QwNjBlYzc5ODUxKSAvKiAgNTU1ICovLAorICBVNjRfQygweGQ1OGM2NzkxMTgzYWI3ZjgpIC8qICA1NTYgKi8sIFU2NF9DKDB4ZDExODdjNTA1MmYzZWVlNCkgLyogIDU1NyAqLywKKyAgVTY0X0MoMHhjOTVkMTE5MmU1NGU4MmZmKSAvKiAgNTU4ICovLCBVNjRfQygweDg2ZWVhMTRjYjlhYzZjYTIpIC8qICA1NTkgKi8sCisgIFU2NF9DKDB4MzQ4NWJlYjE1MzY3N2Q1ZCkgLyogIDU2MCAqLywgVTY0X0MoMHhkZDE5MWQ3ODFmOGM0OTJhKSAvKiAgNTYxICovLAorICBVNjRfQygweGY2MDg2NmJhYTc4NGViZjkpIC8qICA1NjIgKi8sIFU2NF9DKDB4NTE4ZjY0M2JhMmQwOGM3NCkgLyogIDU2MyAqLywKKyAgVTY0X0MoMHg4ODUyZTk1NmUxMDg3YzIyKSAvKiAgNTY0ICovLCBVNjRfQygweGE3NjhjYjhkYzQxMGFlOGQpIC8qICA1NjUgKi8sCisgIFU2NF9DKDB4MzgwNDc3MjZiZmVjOGUxYSkgLyogIDU2NiAqLywgVTY0X0MoMHhhNjc3MzhiNGNkM2I0NWFhKSAvKiAgNTY3ICovLAorICBVNjRfQygweGFkMTY2OTFjZWMwZGRlMTkpIC8qICA1NjggKi8sIFU2NF9DKDB4YzZkNDMxOTM4MDQ2MmUwNykgLyogIDU2OSAqLywKKyAgVTY0X0MoMHhjNWE1ODc2ZDBiYTYxOTM4KSAvKiAgNTcwICovLCBVNjRfQygweDE2YjlmYTFmYTU4ZmQ4NDApIC8qICA1NzEgKi8sCisgIFU2NF9DKDB4MTg4YWIxMTczY2E3NGYxOCkgLyogIDU3MiAqLywgVTY0X0MoMHhhYmRhMmY5OGM5OWMwMjFmKSAvKiAgNTczICovLAorICBVNjRfQygweDNlMDU4MGFiMTM0YWU4MTYpIC8qICA1NzQgKi8sIFU2NF9DKDB4NWYzYjA1Yjc3MzY0NWFiYikgLyogIDU3NSAqLywKKyAgVTY0X0MoMHgyNTAxYTJiZTU1NzVmMmY2KSAvKiAgNTc2ICovLCBVNjRfQygweDFiMmY3NDAwNGU3ZThiYTkpIC8qICA1NzcgKi8sCisgIFU2NF9DKDB4MWNkNzU4MDM3MWU4ZDk1MykgLyogIDU3OCAqLywgVTY0X0MoMHg3ZjZlZDg5NTYyNzY0ZTMwKSAvKiAgNTc5ICovLAorICBVNjRfQygweGIxNTkyNmZmNTk2ZjAwM2QpIC8qICA1ODAgKi8sIFU2NF9DKDB4OWY2NTI5M2RhOGM1ZDZiOSkgLyogIDU4MSAqLywKKyAgVTY0X0MoMHg2ZWNlZjA0ZGQ2OTBmODRjKSAvKiAgNTgyICovLCBVNjRfQygweDQ3ODIyNzVmZmYzM2FmODgpIC8qICA1ODMgKi8sCisgIFU2NF9DKDB4ZTQxNDMzMDgzZjgyMDgwMSkgLyogIDU4NCAqLywgVTY0X0MoMHhmZDBkZmU0MDlhMWFmOWI1KSAvKiAgNTg1ICovLAorICBVNjRfQygweDQzMjVhMzM0MmNkYjM5NmIpIC8qICA1ODYgKi8sIFU2NF9DKDB4OGFlNzdlNjJiMzAxYjI1MikgLyogIDU4NyAqLywKKyAgVTY0X0MoMHhjMzZmOWU5ZjY2NTU2MTVhKSAvKiAgNTg4ICovLCBVNjRfQygweDg1NDU1YTJkOTJkMzJjMDkpIC8qICA1ODkgKi8sCisgIFU2NF9DKDB4ZjJjN2RlYTk0OTQ3NzQ4NSkgLyogIDU5MCAqLywgVTY0X0MoMHg2M2NmYjRjMTMzYTM5ZWJhKSAvKiAgNTkxICovLAorICBVNjRfQygweDgzYjA0MGNjNmViYzU0NjIpIC8qICA1OTIgKi8sIFU2NF9DKDB4M2I5NDU0YzhmZGIzMjZiMCkgLyogIDU5MyAqLywKKyAgVTY0X0MoMHg1NmY1NmE5ZTg3ZmZkNzhjKSAvKiAgNTk0ICovLCBVNjRfQygweDJkYzI5NDBkOTlmNDJiYzYpIC8qICA1OTUgKi8sCisgIFU2NF9DKDB4OThmN2RmMDk2YjA5NmUyZCkgLyogIDU5NiAqLywgVTY0X0MoMHgxOWE2ZTAxZTNhZDg1MmJmKSAvKiAgNTk3ICovLAorICBVNjRfQygweDQyYTk5Y2NiZGJkNGI0MGIpIC8qICA1OTggKi8sIFU2NF9DKDB4YTU5OTk4YWY0NWU5YzU1OSkgLyogIDU5OSAqLywKKyAgVTY0X0MoMHgzNjYyOTVlODA3ZDkzMTg2KSAvKiAgNjAwICovLCBVNjRfQygweDZiNDgxODFiZmFhMWY3NzMpIC8qICA2MDEgKi8sCisgIFU2NF9DKDB4MWZlYzU3ZTIxNTdhMGExZCkgLyogIDYwMiAqLywgVTY0X0MoMHg0NjY3NDQ2YWY2MjAxYWQ1KSAvKiAgNjAzICovLAorICBVNjRfQygweGU2MTVlYmNhY2ZiMGYwNzUpIC8qICA2MDQgKi8sIFU2NF9DKDB4YjhmMzFmNGY2ODI5MDc3OCkgLyogIDYwNSAqLywKKyAgVTY0X0MoMHgyMjcxM2VkNmNlMjJkMTFlKSAvKiAgNjA2ICovLCBVNjRfQygweDMwNTdjMWE3MmVjM2M5M2IpIC8qICA2MDcgKi8sCisgIFU2NF9DKDB4Y2I0NmFjYzM3YzNmMWYyZikgLyogIDYwOCAqLywgVTY0X0MoMHhkYmI4OTNmZDAyYWFmNTBlKSAvKiAgNjA5ICovLAorICBVNjRfQygweDMzMWZkOTJlNjAwYjlmY2YpIC8qICA2MTAgKi8sIFU2NF9DKDB4YTQ5OGY5NjE0OGVhM2FkNikgLyogIDYxMSAqLywKKyAgVTY0X0MoMHhhOGQ4NDI2ZThiNmE4M2VhKSAvKiAgNjEyICovLCBVNjRfQygweGEwODliMjc0Yjc3MzVjZGMpIC8qICA2MTMgKi8sCisgIFU2NF9DKDB4ODdmNmIzNzMxZTUyNGExMSkgLyogIDYxNCAqLywgVTY0X0MoMHgxMTg4MDhlNWNiYzk2NzQ5KSAvKiAgNjE1ICovLAorICBVNjRfQygweDk5MDZlNGM3YjE5YmQzOTQpIC8qICA2MTYgKi8sIFU2NF9DKDB4YWZlZDdmN2U5YjI0YTIwYykgLyogIDYxNyAqLywKKyAgVTY0X0MoMHg2NTA5ZWFkZWViMzY0NGE3KSAvKiAgNjE4ICovLCBVNjRfQygweDZjMWVmMWQzZThlZjBlZGUpIC8qICA2MTkgKi8sCisgIFU2NF9DKDB4YjljOTdkNDNlOTc5OGZiNCkgLyogIDYyMCAqLywgVTY0X0MoMHhhMmYyZDc4NDc0MGMyOGEzKSAvKiAgNjIxICovLAorICBVNjRfQygweDdiODQ5NjQ3NjE5NzU2NmYpIC8qICA2MjIgKi8sIFU2NF9DKDB4N2E1YmUzZTZiNjVmMDY5ZCkgLyogIDYyMyAqLywKKyAgVTY0X0MoMHhmOTYzMzBlZDc4YmU2ZjEwKSAvKiAgNjI0ICovLCBVNjRfQygweGVlZTYwZGU3N2EwNzZhMTUpIC8qICA2MjUgKi8sCisgIFU2NF9DKDB4MmI0YmVlNGFhMDhiOWJkMCkgLyogIDYyNiAqLywgVTY0X0MoMHg2YTU2YTYzZWM3Yjg4OTRlKSAvKiAgNjI3ICovLAorICBVNjRfQygweDAyMTIxMzU5YmEzNGZlZjQpIC8qICA2MjggKi8sIFU2NF9DKDB4NGNiZjk5ZjgyODM3MDNmYykgLyogIDYyOSAqLywKKyAgVTY0X0MoMHgzOTgwNzEzNTBjYWYzMGM4KSAvKiAgNjMwICovLCBVNjRfQygweGQwYTc3YTg5ZjAxNzY4N2EpIC8qICA2MzEgKi8sCisgIFU2NF9DKDB4ZjFjMWE5ZWI5ZTQyMzU2OSkgLyogIDYzMiAqLywgVTY0X0MoMHg4Yzc5NzYyODJkZWU4MTk5KSAvKiAgNjMzICovLAorICBVNjRfQygweDVkMTczN2E1ZGQxZjdhYmQpIC8qICA2MzQgKi8sIFU2NF9DKDB4NGY1MzQzM2MwOWE5ZmE4MCkgLyogIDYzNSAqLywKKyAgVTY0X0MoMHhmYThiMGM1M2RmN2NhMWQ5KSAvKiAgNjM2ICovLCBVNjRfQygweDNmZDlkY2JjODg2Y2NiNzcpIC8qICA2MzcgKi8sCisgIFU2NF9DKDB4YzA0MDkxN2NhOTFiNDcyMCkgLyogIDYzOCAqLywgVTY0X0MoMHg3ZGQwMDE0MmY5ZDFkY2RmKSAvKiAgNjM5ICovLAorICBVNjRfQygweDg0NzZmYzFkNGYzODdiNTgpIC8qICA2NDAgKi8sIFU2NF9DKDB4MjNmOGU3YzVmMzMxNjUwMykgLyogIDY0MSAqLywKKyAgVTY0X0MoMHgwMzJhMjI0NGU3ZTM3MzM5KSAvKiAgNjQyICovLCBVNjRfQygweDVjODdhNWQ3NTBmNWE3NGIpIC8qICA2NDMgKi8sCisgIFU2NF9DKDB4MDgyYjRjYzQzNjk4OTkyZSkgLyogIDY0NCAqLywgVTY0X0MoMHhkZjkxN2JlY2I4NThmNjNjKSAvKiAgNjQ1ICovLAorICBVNjRfQygweDMyNzBiOGZjNWJmODZkZGEpIC8qICA2NDYgKi8sIFU2NF9DKDB4MTBhZTcyYmIyOWI1ZGQ3NikgLyogIDY0NyAqLywKKyAgVTY0X0MoMHg1NzZhYzk0ZTc3MDAzNjJiKSAvKiAgNjQ4ICovLCBVNjRfQygweDFhZDExMmRhYzYxZWZiOGYpIC8qICA2NDkgKi8sCisgIFU2NF9DKDB4NjkxYmMzMGVjNWZhYTQyNykgLyogIDY1MCAqLywgVTY0X0MoMHhmZjI0NjMxMWNjMzI3MTQzKSAvKiAgNjUxICovLAorICBVNjRfQygweDMxNDIzNjhlMzBlNTMyMDYpIC8qICA2NTIgKi8sIFU2NF9DKDB4NzEzODBlMzFlMDJjYTM5NikgLyogIDY1MyAqLywKKyAgVTY0X0MoMHg5NThkNWM5NjBhYWQ3NmYxKSAvKiAgNjU0ICovLCBVNjRfQygweGY4ZDZmNDMwYzE2ZGE1MzYpIC8qICA2NTUgKi8sCisgIFU2NF9DKDB4YzhmZmQxM2YxYmU3ZTFkMikgLyogIDY1NiAqLywgVTY0X0MoMHg3NTc4YWU2NjAwNGRkYmUxKSAvKiAgNjU3ICovLAorICBVNjRfQygweDA1ODMzZjAxMDY3YmU2NDYpIC8qICA2NTggKi8sIFU2NF9DKDB4YmIzNGI1YWQzYmZlNTg2ZCkgLyogIDY1OSAqLywKKyAgVTY0X0MoMHgwOTVmMzRjOWExMmI5N2YwKSAvKiAgNjYwICovLCBVNjRfQygweDI0N2FiNjQ1MjVkNjBjYTgpIC8qICA2NjEgKi8sCisgIFU2NF9DKDB4ZGNkYmM2ZjMwMTc0NzdkMSkgLyogIDY2MiAqLywgVTY0X0MoMHg0YTJlMTRkNGRlY2FkMjRkKSAvKiAgNjYzICovLAorICBVNjRfQygweGJkYjVlNmQ5YmUwYTFlZWIpIC8qICA2NjQgKi8sIFU2NF9DKDB4MmE3ZTcwZjc3OTQzMDFhYikgLyogIDY2NSAqLywKKyAgVTY0X0MoMHhkZWY0MmQ4YTI3MDU0MGZkKSAvKiAgNjY2ICovLCBVNjRfQygweDAxMDc4ZWMwYTM0YzIyYzEpIC8qICA2NjcgKi8sCisgIFU2NF9DKDB4ZTVkZTUxMWFmNGMxNjM4NykgLyogIDY2OCAqLywgVTY0X0MoMHg3ZWJiM2E1MmJkOWEzMzBhKSAvKiAgNjY5ICovLAorICBVNjRfQygweDc3Njk3ODU3YWE3ZDY0MzUpIC8qICA2NzAgKi8sIFU2NF9DKDB4MDA0ZTgzMTYwM2FlNGMzMikgLyogIDY3MSAqLywKKyAgVTY0X0MoMHhlN2EyMTAyMGFkNzhlMzEyKSAvKiAgNjcyICovLCBVNjRfQygweDlkNDFhNzBjNmFiNDIwZjIpIC8qICA2NzMgKi8sCisgIFU2NF9DKDB4MjhlMDZjMThlYTExNDFlNikgLyogIDY3NCAqLywgVTY0X0MoMHhkMmIyOGNiZDk4NGY2YjI4KSAvKiAgNjc1ICovLAorICBVNjRfQygweDI2Yjc1ZjZjNDQ2ZTlkODMpIC8qICA2NzYgKi8sIFU2NF9DKDB4YmE0NzU2OGM0ZDQxOGQ3ZikgLyogIDY3NyAqLywKKyAgVTY0X0MoMHhkODBiYWRiZmU2MTgzZDhlKSAvKiAgNjc4ICovLCBVNjRfQygweDBlMjA2ZDdmNWYxNjYwNDQpIC8qICA2NzkgKi8sCisgIFU2NF9DKDB4ZTI1OGE0MzkxMWNiY2EzZSkgLyogIDY4MCAqLywgVTY0X0MoMHg3MjNhMTc0NmIyMWRjMGJjKSAvKiAgNjgxICovLAorICBVNjRfQygweGM3Y2FhODU0ZjVkN2NkZDMpIC8qICA2ODIgKi8sIFU2NF9DKDB4N2NhYzMyODgzZDI2MWQ5YykgLyogIDY4MyAqLywKKyAgVTY0X0MoMHg3NjkwYzI2NDIzYmE5NDJjKSAvKiAgNjg0ICovLCBVNjRfQygweDE3ZTU1NTI0NDc4MDQyYjgpIC8qICA2ODUgKi8sCisgIFU2NF9DKDB4ZTBiZTQ3NzY1NmEyMzg5ZikgLyogIDY4NiAqLywgVTY0X0MoMHg0ZDI4OWI1ZTY3YWIyZGEwKSAvKiAgNjg3ICovLAorICBVNjRfQygweDQ0ODYyYjljOGZiYmZkMzEpIC8qICA2ODggKi8sIFU2NF9DKDB4YjQ3Y2M4MDQ5ZDE0MTM2NSkgLyogIDY4OSAqLywKKyAgVTY0X0MoMHg4MjJjMWIzNjJiOTFjNzkzKSAvKiAgNjkwICovLCBVNjRfQygweDRlYjE0NjU1ZmIxM2RmZDgpIC8qICA2OTEgKi8sCisgIFU2NF9DKDB4MWVjYmJhMDcxNGUyYTk3YikgLyogIDY5MiAqLywgVTY0X0MoMHg2MTQzNDU5ZDVjZGU1ZjE0KSAvKiAgNjkzICovLAorICBVNjRfQygweDUzYThmYmYxZDVmMGFjODkpIC8qICA2OTQgKi8sIFU2NF9DKDB4OTdlYTA0ZDgxYzVlNWIwMCkgLyogIDY5NSAqLywKKyAgVTY0X0MoMHg2MjIxODFhOGQ0ZmRiM2YzKSAvKiAgNjk2ICovLCBVNjRfQygweGU5YmNkMzQxNTcyYTEyMDgpIC8qICA2OTcgKi8sCisgIFU2NF9DKDB4MTQxMTI1ODY0M2NjZTU4YSkgLyogIDY5OCAqLywgVTY0X0MoMHg5MTQ0YzVmZWE0YzZlMGE0KSAvKiAgNjk5ICovLAorICBVNjRfQygweDBkMzNkMDY1NjVjZjYyMGYpIC8qICA3MDAgKi8sIFU2NF9DKDB4NTRhNDhkNDg5ZjIxOWNhMSkgLyogIDcwMSAqLywKKyAgVTY0X0MoMHhjNDNlNWVhYzZkNjNjODIxKSAvKiAgNzAyICovLCBVNjRfQygweGE5NzI4YjNhNzI3NzBkYWYpIC8qICA3MDMgKi8sCisgIFU2NF9DKDB4ZDc5MzRlN2IyMGRmODdlZikgLyogIDcwNCAqLywgVTY0X0MoMHhlMzU1MDNiNjFhM2U4NmU1KSAvKiAgNzA1ICovLAorICBVNjRfQygweGNhZTMyMWZiYzgxOWQ1MDQpIC8qICA3MDYgKi8sIFU2NF9DKDB4MTI5YTUwYjNhYzYwYmZhNikgLyogIDcwNyAqLywKKyAgVTY0X0MoMHhjZDVlNjhlYTdlOWZiNmMzKSAvKiAgNzA4ICovLCBVNjRfQygweGIwMWM5MDE5OTQ4M2IxYzcpIC8qICA3MDkgKi8sCisgIFU2NF9DKDB4M2RlOTNjZDVjMjk1Mzc2YykgLyogIDcxMCAqLywgVTY0X0MoMHhhZWQ1MmVkZjJhYjlhZDEzKSAvKiAgNzExICovLAorICBVNjRfQygweDJlNjBmNTEyYzBhMDc4ODQpIC8qICA3MTIgKi8sIFU2NF9DKDB4YmMzZDg2YTNlMzYyMTBjOSkgLyogIDcxMyAqLywKKyAgVTY0X0MoMHgzNTI2OWQ5YjE2Mzk1MWNlKSAvKiAgNzE0ICovLCBVNjRfQygweDBjN2Q2ZTJhZDBjZGI1ZmEpIC8qICA3MTUgKi8sCisgIFU2NF9DKDB4NTllODYyOTdkODdmNTczMykgLyogIDcxNiAqLywgVTY0X0MoMHgyOThlZjIyMTg5OGRiMGU3KSAvKiAgNzE3ICovLAorICBVNjRfQygweDU1MDAwMDI5ZDFhNWFhN2UpIC8qICA3MTggKi8sIFU2NF9DKDB4OGJjMDhhZTFiNTA2MWI0NSkgLyogIDcxOSAqLywKKyAgVTY0X0MoMHhjMmMzMWMyYjZjOTI3MDNhKSAvKiAgNzIwICovLCBVNjRfQygweDk0Y2M1OTZiYWYyNWVmNDIpIC8qICA3MjEgKi8sCisgIFU2NF9DKDB4MGExZDczZGIyMjU0MDQ1NikgLyogIDcyMiAqLywgVTY0X0MoMHgwNGI2YTBmOWQ5YzQxNzlhKSAvKiAgNzIzICovLAorICBVNjRfQygweGVmZmRhZmEyYWUzZDNjNjApIC8qICA3MjQgKi8sIFU2NF9DKDB4ZjdjODA3NWJiNDk0OTZjNCkgLyogIDcyNSAqLywKKyAgVTY0X0MoMHg5Y2M1YzcxNDFkMWNkNGUzKSAvKiAgNzI2ICovLCBVNjRfQygweDc4YmQxNjM4MjE4ZTU1MzQpIC8qICA3MjcgKi8sCisgIFU2NF9DKDB4YjJmMTE1NjhmODUwMjQ2YSkgLyogIDcyOCAqLywgVTY0X0MoMHhlZGZhYmNmYTk1MDJiYzI5KSAvKiAgNzI5ICovLAorICBVNjRfQygweDc5NmNlNWYyZGEyMzA1MWIpIC8qICA3MzAgKi8sIFU2NF9DKDB4YWFlMTI4YjBkYzkzNTM3YykgLyogIDczMSAqLywKKyAgVTY0X0MoMHgzYTQ5M2RhMGVlNGIyOWFlKSAvKiAgNzMyICovLCBVNjRfQygweGI1ZGY2YjJjNDE2ODk1ZDcpIC8qICA3MzMgKi8sCisgIFU2NF9DKDB4ZmNhYmJkMjUxMjJkN2YzNykgLyogIDczNCAqLywgVTY0X0MoMHg3MDgxMGI1ODEwNWRjNGIxKSAvKiAgNzM1ICovLAorICBVNjRfQygweGUxMGZkZDM3Zjc4ODJhOTApIC8qICA3MzYgKi8sIFU2NF9DKDB4NTI0ZGNhYjU1MThhM2Y1YykgLyogIDczNyAqLywKKyAgVTY0X0MoMHgzYzllODU4Nzg0NTEyNTViKSAvKiAgNzM4ICovLCBVNjRfQygweDQwMjk4MjgxMTliZDM0ZTIpIC8qICA3MzkgKi8sCisgIFU2NF9DKDB4NzRhMDViNmY1ZDNjZWNjYikgLyogIDc0MCAqLywgVTY0X0MoMHhiNjEwMDIxNTQyZTEzZWNhKSAvKiAgNzQxICovLAorICBVNjRfQygweDBmZjk3OWQxMmY1OWUyYWMpIC8qICA3NDIgKi8sIFU2NF9DKDB4NjAzN2RhMjdlNGY5Y2M1MCkgLyogIDc0MyAqLywKKyAgVTY0X0MoMHg1ZTkyOTc1YTBkZjE4NDdkKSAvKiAgNzQ0ICovLCBVNjRfQygweGQ2NmRlMTkwZDNlNjIzZmUpIC8qICA3NDUgKi8sCisgIFU2NF9DKDB4NTAzMmQ2Yjg3YjU2ODA0OCkgLyogIDc0NiAqLywgVTY0X0MoMHg5YTM2YjdjZTgyMzUyMTZlKSAvKiAgNzQ3ICovLAorICBVNjRfQygweDgwMjcyYTdhMjRmNjRiNGEpIC8qICA3NDggKi8sIFU2NF9DKDB4OTNlZmVkOGI4YzY5MTZmNykgLyogIDc0OSAqLywKKyAgVTY0X0MoMHgzN2RkYmZmNDRjY2UxNTU1KSAvKiAgNzUwICovLCBVNjRfQygweDRiOTVkYjVkNGI5OWJkMjUpIC8qICA3NTEgKi8sCisgIFU2NF9DKDB4OTJkM2ZkYTE2OTgxMmZjMCkgLyogIDc1MiAqLywgVTY0X0MoMHhmYjFhNGE5YTkwNjYwYmI2KSAvKiAgNzUzICovLAorICBVNjRfQygweDczMGMxOTY5NDZhNGI5YjIpIC8qICA3NTQgKi8sIFU2NF9DKDB4ODFlMjg5YWE3ZjQ5ZGE2OCkgLyogIDc1NSAqLywKKyAgVTY0X0MoMHg2NDY2OWEwZjgzYjFhMDVmKSAvKiAgNzU2ICovLCBVNjRfQygweDI3YjNmZjdkOTY0NGY0OGIpIC8qICA3NTcgKi8sCisgIFU2NF9DKDB4Y2M2YjYxNWM4ZGI2NzViMykgLyogIDc1OCAqLywgVTY0X0MoMHg2NzRmMjBiOWJjZWJiZTk1KSAvKiAgNzU5ICovLAorICBVNjRfQygweDZmMzEyMzgyNzU2NTU5ODIpIC8qICA3NjAgKi8sIFU2NF9DKDB4NWFlNDg4NzEzZTQ1Y2YwNSkgLyogIDc2MSAqLywKKyAgVTY0X0MoMHhiZjYxOWY5OTU0YzIxMTU3KSAvKiAgNzYyICovLCBVNjRfQygweGVhYmFjNDYwNDBhOGVhZTkpIC8qICA3NjMgKi8sCisgIFU2NF9DKDB4NDU0YzZmZTlmMmMwYzFjZCkgLyogIDc2NCAqLywgVTY0X0MoMHg0MTljZjY0OTY0MTI2OTFjKSAvKiAgNzY1ICovLAorICBVNjRfQygweGQzZGMzYmVmMjY1YjBmNzApIC8qICA3NjYgKi8sIFU2NF9DKDB4NmQwZTYwZjVjMzU3OGE5ZSkgLyogIDc2NyAqLworfTsKK3N0YXRpYyB1NjQgc2JveDRbMjU2XSA9IHsKKyAgVTY0X0MoMHg1YjBlNjA4NTI2MzIzYzU1KSAvKiAgNzY4ICovLCBVNjRfQygweDFhNDZjMWE5ZmExYjU5ZjUpIC8qICA3NjkgKi8sCisgIFU2NF9DKDB4YTllMjQ1YTE3YzRjOGZmYSkgLyogIDc3MCAqLywgVTY0X0MoMHg2NWNhNTE1OWRiMjk1NWQ3KSAvKiAgNzcxICovLAorICBVNjRfQygweDA1ZGIwYTc2Y2UzNWFmYzIpIC8qICA3NzIgKi8sIFU2NF9DKDB4ODFlYWM3N2VhOTExM2Q0NSkgLyogIDc3MyAqLywKKyAgVTY0X0MoMHg1MjhlZjg4YWI2YWMwYTBkKSAvKiAgNzc0ICovLCBVNjRfQygweGEwOWVhMjUzNTk3YmUzZmYpIC8qICA3NzUgKi8sCisgIFU2NF9DKDB4NDMwZGRmYjNhYzQ4Y2Q1NikgLyogIDc3NiAqLywgVTY0X0MoMHhjNGIzYTY3YWY0NWNlNDZmKSAvKiAgNzc3ICovLAorICBVNjRfQygweDRlY2VjZmQ4ZmJlMmQwNWUpIC8qICA3NzggKi8sIFU2NF9DKDB4M2VmNTZmMTBiMzk5MzVmMCkgLyogIDc3OSAqLywKKyAgVTY0X0MoMHgwYjIyZDY4MjljZDYxOWM2KSAvKiAgNzgwICovLCBVNjRfQygweDE3ZmQ0NjBhNzRkZjIwNjkpIC8qICA3ODEgKi8sCisgIFU2NF9DKDB4NmNmOGNjOGU4NTEwZWQ0MCkgLyogIDc4MiAqLywgVTY0X0MoMHhkNmM4MjRiZjNhNmVjYWE3KSAvKiAgNzgzICovLAorICBVNjRfQygweDYxMjQzZDU4MWE4MTcwNDkpIC8qICA3ODQgKi8sIFU2NF9DKDB4MDQ4YmFjYjZiYmMxNjNhMikgLyogIDc4NSAqLywKKyAgVTY0X0MoMHhkOWEzOGFjMjdkNDRjYzMyKSAvKiAgNzg2ICovLCBVNjRfQygweDdmZGRmZjViYWFmNDEwYWIpIC8qICA3ODcgKi8sCisgIFU2NF9DKDB4YWQ2ZDQ5NWFhODA0ODI0YikgLyogIDc4OCAqLywgVTY0X0MoMHhlMWE2YTc0ZjJkOGM5Zjk0KSAvKiAgNzg5ICovLAorICBVNjRfQygweGQ0Zjc4NTEyMzVkZWU4ZTMpIC8qICA3OTAgKi8sIFU2NF9DKDB4ZmQ0YjdmODg2NTQwZDg5MykgLyogIDc5MSAqLywKKyAgVTY0X0MoMHgyNDdjMjAwNDJhYTRiZmRhKSAvKiAgNzkyICovLCBVNjRfQygweDA5NmVhMWM1MTdkMTMyN2MpIC8qICA3OTMgKi8sCisgIFU2NF9DKDB4ZDU2OTY2YjQzNjFhNjY4NSkgLyogIDc5NCAqLywgVTY0X0MoMHgyNzdkYTVjMzEyMjEwNTdkKSAvKiAgNzk1ICovLAorICBVNjRfQygweDk0ZDU5ODkzYTQzYWNmZjcpIC8qICA3OTYgKi8sIFU2NF9DKDB4NjRmMGM1MWNjZGMwMjI4MSkgLyogIDc5NyAqLywKKyAgVTY0X0MoMHgzZDMzYmNjNGZmNjE4OWRiKSAvKiAgNzk4ICovLCBVNjRfQygweGUwMDVjYjE4NGNlNjZhZjEpIC8qICA3OTkgKi8sCisgIFU2NF9DKDB4ZmY1Y2NkMWQxZGI5OWJlYSkgLyogIDgwMCAqLywgVTY0X0MoMHhiMGI4NTRhN2ZlNDI5ODBmKSAvKiAgODAxICovLAorICBVNjRfQygweDdiZDQ2YTZhNzE4ZDRiOWYpIC8qICA4MDIgKi8sIFU2NF9DKDB4ZDEwZmE4Y2MyMmE1ZmQ4YykgLyogIDgwMyAqLywKKyAgVTY0X0MoMHhkMzE0ODQ5NTJiZTRiZDMxKSAvKiAgODA0ICovLCBVNjRfQygweGM3ZmE5NzVmY2IyNDM4NDcpIC8qICA4MDUgKi8sCisgIFU2NF9DKDB4NDg4NmVkMWU1ODQ2YzQwNykgLyogIDgwNiAqLywgVTY0X0MoMHgyOGNkZGI3OTFlYjcwYjA0KSAvKiAgODA3ICovLAorICBVNjRfQygweGMyYjAwYmUyZjU3MzQxN2YpIC8qICA4MDggKi8sIFU2NF9DKDB4NWM5NTkwNDUyMTgwZjg3NykgLyogIDgwOSAqLywKKyAgVTY0X0MoMHg3YTZiZGRmZmYzNzBlYjAwKSAvKiAgODEwICovLCBVNjRfQygweGNlNTA5ZTM4ZDZkOWQ2YTQpIC8qICA4MTEgKi8sCisgIFU2NF9DKDB4ZWJlYjBmMDA2NDdmYTcwMikgLyogIDgxMiAqLywgVTY0X0MoMHgxZGNjMDZjZjc2NjA2ZjA2KSAvKiAgODEzICovLAorICBVNjRfQygweGU0ZDlmMjhiYTI4NmZmMGEpIC8qICA4MTQgKi8sIFU2NF9DKDB4ZDg1YTMwNWRjOTE4YzI2MikgLyogIDgxNSAqLywKKyAgVTY0X0MoMHg0NzViMWQ4NzMyMjI1ZjU0KSAvKiAgODE2ICovLCBVNjRfQygweDJkNGZiNTE2NjhjY2I1ZmUpIC8qICA4MTcgKi8sCisgIFU2NF9DKDB4YTY3OWI5ZDlkNzJiYmEyMCkgLyogIDgxOCAqLywgVTY0X0MoMHg1Mzg0MWMwZDkxMmQ0M2E1KSAvKiAgODE5ICovLAorICBVNjRfQygweDNiN2VhYTQ4YmYxMmE0ZTgpIC8qICA4MjAgKi8sIFU2NF9DKDB4NzgxZTBlNDdmMjJmMWRkZikgLyogIDgyMSAqLywKKyAgVTY0X0MoMHhlZmYyMGNlNjBhYjUwOTczKSAvKiAgODIyICovLCBVNjRfQygweDIwZDI2MWQxOWRmZmI3NDIpIC8qICA4MjMgKi8sCisgIFU2NF9DKDB4MTZhMTJiMDMwNjJhMmUzOSkgLyogIDgyNCAqLywgVTY0X0MoMHgxOTYwZWIyMjM5NjUwNDk1KSAvKiAgODI1ICovLAorICBVNjRfQygweDI1MWMxNmZlZDUwZWI4YjgpIC8qICA4MjYgKi8sIFU2NF9DKDB4OWFjMGMzMzBmODI2MDE2ZSkgLyogIDgyNyAqLywKKyAgVTY0X0MoMHhlZDE1MjY2NTk1M2U3NjcxKSAvKiAgODI4ICovLCBVNjRfQygweDAyZDYzMTk0YTYzNjk1NzApIC8qICA4MjkgKi8sCisgIFU2NF9DKDB4NTA3NGYwODM5NGIxYzk4NykgLyogIDgzMCAqLywgVTY0X0MoMHg3MGJhNTk4YzkwYjI1Y2UxKSAvKiAgODMxICovLAorICBVNjRfQygweDc5NGExNTgxMGI5NzQyZjYpIC8qICA4MzIgKi8sIFU2NF9DKDB4MGQ1OTI1ZTlmY2FmOGM2YykgLyogIDgzMyAqLywKKyAgVTY0X0MoMHgzMDY3NzE2Y2Q4Njg3NDRlKSAvKiAgODM0ICovLCBVNjRfQygweDkxMGFiMDc3ZThkNzczMWIpIC8qICA4MzUgKi8sCisgIFU2NF9DKDB4NmE2MWJiZGI1YWM0MmY2MSkgLyogIDgzNiAqLywgVTY0X0MoMHg5MzUxM2VmYmYwODUxNTY3KSAvKiAgODM3ICovLAorICBVNjRfQygweGY0OTQ3MjRiOWU4M2U5ZDUpIC8qICA4MzggKi8sIFU2NF9DKDB4ZTg4N2UxOTg1YzA5NjQ4ZCkgLyogIDgzOSAqLywKKyAgVTY0X0MoMHgzNGIxZDNjNjc1MzcwY2ZkKSAvKiAgODQwICovLCBVNjRfQygweGRjMzVlNDMzYmMwZDI1NWQpIC8qICA4NDEgKi8sCisgIFU2NF9DKDB4ZDBhYWI4NDIzNDEzMWJlMCkgLyogIDg0MiAqLywgVTY0X0MoMHgwODA0MmE1MGI0OGI3ZWFmKSAvKiAgODQzICovLAorICBVNjRfQygweDk5OTdjNGVlNDRhM2FiMzUpIC8qICA4NDQgKi8sIFU2NF9DKDB4ODI5YTdiNDkyMDE3OTlkMCkgLyogIDg0NSAqLywKKyAgVTY0X0MoMHgyNjNiODMwN2I3YzU0NDQxKSAvKiAgODQ2ICovLCBVNjRfQygweDc1MmY5NWY0ZmQ2YTZjYTYpIC8qICA4NDcgKi8sCisgIFU2NF9DKDB4OTI3MjE3NDAyYzA4YzZlNSkgLyogIDg0OCAqLywgVTY0X0MoMHgyYThhYjc1NGE3OTVkOWVlKSAvKiAgODQ5ICovLAorICBVNjRfQygweGE0NDJmNzU1MmY3Mjk0M2QpIC8qICA4NTAgKi8sIFU2NF9DKDB4MmMzMTMzNGUxOTc4MTIwOCkgLyogIDg1MSAqLywKKyAgVTY0X0MoMHg0ZmE5OGQ3Y2VhZWU2MjkxKSAvKiAgODUyICovLCBVNjRfQygweDU1YzM4NjJmNjY1ZGIzMDkpIC8qICA4NTMgKi8sCisgIFU2NF9DKDB4YmQwNjEwMTc1ZDUzYjFmMykgLyogIDg1NCAqLywgVTY0X0MoMHg0NmZlNmNiODQwNDEzZjI3KSAvKiAgODU1ICovLAorICBVNjRfQygweDNmZTAzNzkyZGYwY2ZhNTkpIC8qICA4NTYgKi8sIFU2NF9DKDB4Y2ZlNzAwMzcyZWI4NWU4ZikgLyogIDg1NyAqLywKKyAgVTY0X0MoMHhhN2JlMjllN2FkYmNlMTE4KSAvKiAgODU4ICovLCBVNjRfQygweGU1NDRlZTVjZGU4NDMxZGQpIC8qICA4NTkgKi8sCisgIFU2NF9DKDB4OGE3ODFiMWI0MWYxODczZSkgLyogIDg2MCAqLywgVTY0X0MoMHhhNWM5NGM3OGEwZDJmMGU3KSAvKiAgODYxICovLAorICBVNjRfQygweDM5NDEyZTI4NzdiNjA3MjgpIC8qICA4NjIgKi8sIFU2NF9DKDB4YTEyNjVlZjNhZmM5YTYyYykgLyogIDg2MyAqLywKKyAgVTY0X0MoMHhiY2MyNzcwYzZhMjUwNmM1KSAvKiAgODY0ICovLCBVNjRfQygweDNhYjY2ZGQ1ZGNlMWNlMTIpIC8qICA4NjUgKi8sCisgIFU2NF9DKDB4ZTY1NDk5ZDA0YTY3NWIzNykgLyogIDg2NiAqLywgVTY0X0MoMHg3ZDhmNTIzNDgxYmZkMjE2KSAvKiAgODY3ICovLAorICBVNjRfQygweDBmNmY2NGZjZWMxNWYzODkpIC8qICA4NjggKi8sIFU2NF9DKDB4NzRlZmJlNjE4YjViMTNjOCkgLyogIDg2OSAqLywKKyAgVTY0X0MoMHhhY2RjODJiNzE0MjczZTFkKSAvKiAgODcwICovLCBVNjRfQygweGRkNDBiZmUwMDMxOTlkMTcpIC8qICA4NzEgKi8sCisgIFU2NF9DKDB4MzdlOTkyNTdlN2UwNjFmOCkgLyogIDg3MiAqLywgVTY0X0MoMHhmYTUyNjI2OTA0Nzc1YWFhKSAvKiAgODczICovLAorICBVNjRfQygweDhiYmJmNjNhNDYzZDU2ZjkpIC8qICA4NzQgKi8sIFU2NF9DKDB4ZjAwMTNmMTU0M2EyNmU2NCkgLyogIDg3NSAqLywKKyAgVTY0X0MoMHhhODMwN2U5Zjg3OWVjODk4KSAvKiAgODc2ICovLCBVNjRfQygweGNjNGMyN2E0MTUwMTc3Y2MpIC8qICA4NzcgKi8sCisgIFU2NF9DKDB4MWI0MzJmMmNjYTFkMzM0OCkgLyogIDg3OCAqLywgVTY0X0MoMHhkZTFkMWY4ZjlmNmZhMDEzKSAvKiAgODc5ICovLAorICBVNjRfQygweDYwNjYwMmEwNDdhN2RkZDYpIC8qICA4ODAgKi8sIFU2NF9DKDB4ZDIzN2FiNjRjYzFjYjJjNykgLyogIDg4MSAqLywKKyAgVTY0X0MoMHg5YjkzOGU3MjI1ZmNkMWQzKSAvKiAgODgyICovLCBVNjRfQygweGVjNGUwMzcwOGUwZmY0NzYpIC8qICA4ODMgKi8sCisgIFU2NF9DKDB4ZmViMmZiZGEzZDAzYzEyZCkgLyogIDg4NCAqLywgVTY0X0MoMHhhZTBiY2VkMmVlNDM4ODlhKSAvKiAgODg1ICovLAorICBVNjRfQygweDIyY2I4OTIzZWJmYjRmNDMpIC8qICA4ODYgKi8sIFU2NF9DKDB4NjkzNjBkMDEzY2Y3Mzk2ZCkgLyogIDg4NyAqLywKKyAgVTY0X0MoMHg4NTVlMzYwMmQyZDRlMDIyKSAvKiAgODg4ICovLCBVNjRfQygweDA3MzgwNWJhZDAxZjc4NGMpIC8qICA4ODkgKi8sCisgIFU2NF9DKDB4MzNlMTdhMTMzODUyZjU0NikgLyogIDg5MCAqLywgVTY0X0MoMHhkZjQ4NzQwNThhYzdiNjM4KSAvKiAgODkxICovLAorICBVNjRfQygweGJhOTJiMjljNjc4YWExNGEpIC8qICA4OTIgKi8sIFU2NF9DKDB4MGNlODlmYzc2Y2ZhYWRjZCkgLyogIDg5MyAqLywKKyAgVTY0X0MoMHg1ZjlkNGUwOTA4MzM5ZTM0KSAvKiAgODk0ICovLCBVNjRfQygweGYxYWZlOTI5MWY1OTIzYjkpIC8qICA4OTUgKi8sCisgIFU2NF9DKDB4NmUzNDgwZjYwZjRhMjY1ZikgLyogIDg5NiAqLywgVTY0X0MoMHhlZWJmM2EyYWIyOWI4NDFjKSAvKiAgODk3ICovLAorICBVNjRfQygweGUyMTkzOGE4OGY5MWI0YWQpIC8qICA4OTggKi8sIFU2NF9DKDB4NTdkZmVmZjg0NWM2ZDNjMykgLyogIDg5OSAqLywKKyAgVTY0X0MoMHgyZjAwNmIwYmY2MmNhYWYyKSAvKiAgOTAwICovLCBVNjRfQygweDYyZjQ3OWVmNmY3NWVlNzgpIC8qICA5MDEgKi8sCisgIFU2NF9DKDB4MTFhNTVhZDQxYzg5MTZhOSkgLyogIDkwMiAqLywgVTY0X0MoMHhmMjI5ZDI5MDg0ZmVkNDUzKSAvKiAgOTAzICovLAorICBVNjRfQygweDQyZjFjMjdiMTZiMDAwZTYpIC8qICA5MDQgKi8sIFU2NF9DKDB4MmIxZjc2NzQ5ODIzYzA3NCkgLyogIDkwNSAqLywKKyAgVTY0X0MoMHg0Yjc2ZWNhM2MyNzQ1MzYwKSAvKiAgOTA2ICovLCBVNjRfQygweDhjOThmNDYzYjkxNjkxYmQpIC8qICA5MDcgKi8sCisgIFU2NF9DKDB4MTRiY2M5M2NmMWFkZTY2YSkgLyogIDkwOCAqLywgVTY0X0MoMHg4ODg1MjEzZTZkNDU4Mzk3KSAvKiAgOTA5ICovLAorICBVNjRfQygweDhlMTc3ZGYwMjc0ZDQ3MTEpIC8qICA5MTAgKi8sIFU2NF9DKDB4YjQ5YjczYjU1MDNmMjk1MSkgLyogIDkxMSAqLywKKyAgVTY0X0MoMHgxMDE2ODE2OGMzZjk2YjZiKSAvKiAgOTEyICovLCBVNjRfQygweDBlM2Q5NjNiNjNjYWIwYWUpIC8qICA5MTMgKi8sCisgIFU2NF9DKDB4OGRmYzRiNTY1NWExZGIxNCkgLyogIDkxNCAqLywgVTY0X0MoMHhmNzg5ZjEzNTZlMTRkZTVjKSAvKiAgOTE1ICovLAorICBVNjRfQygweDY4M2U2OGFmNGU1MWRhYzEpIC8qICA5MTYgKi8sIFU2NF9DKDB4YzlhODRmOWQ4ZDRiMGZkOSkgLyogIDkxNyAqLywKKyAgVTY0X0MoMHgzNjkxZTAzZjUyYTBmOWQxKSAvKiAgOTE4ICovLCBVNjRfQygweDVlZDg2ZTQ2ZTE4NzhlODApIC8qICA5MTkgKi8sCisgIFU2NF9DKDB4M2M3MTFhMGU5OWQwNzE1MCkgLyogIDkyMCAqLywgVTY0X0MoMHg1YTA4NjViMjBjNGU5MzEwKSAvKiAgOTIxICovLAorICBVNjRfQygweDU2ZmJmYzFmZTRmMDY4MmUpIC8qICA5MjIgKi8sIFU2NF9DKDB4ZWE4ZDVkZTMxMDVlZGY5YikgLyogIDkyMyAqLywKKyAgVTY0X0MoMHg3MWFiZmRiMTIzNzkxODdhKSAvKiAgOTI0ICovLCBVNjRfQygweDJlYjk5ZGUxYmVlNzdiOWMpIC8qICA5MjUgKi8sCisgIFU2NF9DKDB4MjFlY2MwZWEzM2NmNDUyMykgLyogIDkyNiAqLywgVTY0X0MoMHg1OWE0ZDc1MjE4MDVjN2ExKSAvKiAgOTI3ICovLAorICBVNjRfQygweDM4OTZmNWViNTZhZTdjNzIpIC8qICA5MjggKi8sIFU2NF9DKDB4YWE2MzhmM2RiMThmNzVkYykgLyogIDkyOSAqLywKKyAgVTY0X0MoMHg5ZjM5MzU4ZGFiZTk4MDhlKSAvKiAgOTMwICovLCBVNjRfQygweGI3ZGVmYTkxYzAwYjcyYWMpIC8qICA5MzEgKi8sCisgIFU2NF9DKDB4NmI1NTQxZmQ2MjQ5MmQ5MikgLyogIDkzMiAqLywgVTY0X0MoMHg2ZGM2ZGVlOGY5MmU0ZDViKSAvKiAgOTMzICovLAorICBVNjRfQygweDM1M2Y1N2FiYzRiZWVhN2UpIC8qICA5MzQgKi8sIFU2NF9DKDB4NzM1NzY5ZDZkYTU2OTBjZSkgLyogIDkzNSAqLywKKyAgVTY0X0MoMHgwYTIzNGFhNjQyMzkxNDg0KSAvKiAgOTM2ICovLCBVNjRfQygweGY2Zjk1MDgwMjhmODBkOWQpIC8qICA5MzcgKi8sCisgIFU2NF9DKDB4YjhlMzE5YTI3YWIzZjIxNSkgLyogIDkzOCAqLywgVTY0X0MoMHgzMWFkOWMxMTUxMzQxYTRkKSAvKiAgOTM5ICovLAorICBVNjRfQygweDc3M2MyMmE1N2JlZjU4MDUpIC8qICA5NDAgKi8sIFU2NF9DKDB4NDVjNzU2MWEwNzk2ODYzMykgLyogIDk0MSAqLywKKyAgVTY0X0MoMHhmOTEzZGE5ZTI0OWRiZTM2KSAvKiAgOTQyICovLCBVNjRfQygweGRhNjUyZDliNzhhNjRjNjgpIC8qICA5NDMgKi8sCisgIFU2NF9DKDB4NGMyN2E5N2YzYmMzMzRlZikgLyogIDk0NCAqLywgVTY0X0MoMHg3NjYyMTIyMGU2NmIxN2Y0KSAvKiAgOTQ1ICovLAorICBVNjRfQygweDk2Nzc0Mzg5OWFjZDdkMGIpIC8qICA5NDYgKi8sIFU2NF9DKDB4ZjNlZTViY2FlMGVkNjc4MikgLyogIDk0NyAqLywKKyAgVTY0X0MoMHg0MDlmNzUzNjAwYzg3OWZjKSAvKiAgOTQ4ICovLCBVNjRfQygweDA2ZDA5YTM5YjU5MjZkYjYpIC8qICA5NDkgKi8sCisgIFU2NF9DKDB4NmY4M2FlYjAzMTdhYzU4OCkgLyogIDk1MCAqLywgVTY0X0MoMHgwMWU2Y2E0YTg2MzgxZjIxKSAvKiAgOTUxICovLAorICBVNjRfQygweDY2ZmYzNDYyZDE5ZjMwMjUpIC8qICA5NTIgKi8sIFU2NF9DKDB4NzIyMDdjMjRkZGZkM2JmYikgLyogIDk1MyAqLywKKyAgVTY0X0MoMHg0YWY2YjZkM2UyZWNlMmViKSAvKiAgOTU0ICovLCBVNjRfQygweDljOTk0ZGJlYzdlYTA4ZGUpIC8qICA5NTUgKi8sCisgIFU2NF9DKDB4NDlhY2U1OTdiMDlhOGJjNCkgLyogIDk1NiAqLywgVTY0X0MoMHhiMzhjNDc2NmNmMDc5N2JhKSAvKiAgOTU3ICovLAorICBVNjRfQygweDEzMWI5MzczYzU3YzJhNzUpIC8qICA5NTggKi8sIFU2NF9DKDB4YjE4MjJjY2U2MTkzMWU1OCkgLyogIDk1OSAqLywKKyAgVTY0X0MoMHg5ZDc1NTViOTA5YmExYzBjKSAvKiAgOTYwICovLCBVNjRfQygweDEyN2ZhZmRkOTM3ZDExZDIpIC8qICA5NjEgKi8sCisgIFU2NF9DKDB4MjlkYTNiYWRjNjZkOTJlNCkgLyogIDk2MiAqLywgVTY0X0MoMHhhMmMxZDU3MTU0YzJlY2JjKSAvKiAgOTYzICovLAorICBVNjRfQygweDU4YzUxMzRkODJmNmZlMjQpIC8qICA5NjQgKi8sIFU2NF9DKDB4MWMzYWUzNTE1YjYyMjc0ZikgLyogIDk2NSAqLywKKyAgVTY0X0MoMHhlOTA3YzgyZTAxY2I4MTI2KSAvKiAgOTY2ICovLCBVNjRfQygweGY4ZWQwOTE5MTNlMzdmY2IpIC8qICA5NjcgKi8sCisgIFU2NF9DKDB4MzI0OWQ4ZjljODAwNDZjOSkgLyogIDk2OCAqLywgVTY0X0MoMHg4MGNmOWJlZGUzODhmYjYzKSAvKiAgOTY5ICovLAorICBVNjRfQygweDE4ODE1MzlhMTE2Y2YxOWUpIC8qICA5NzAgKi8sIFU2NF9DKDB4NTEwM2YzZjc2YmQ1MjQ1NykgLyogIDk3MSAqLywKKyAgVTY0X0MoMHgxNWI3ZTZmNWFlNDdmN2E4KSAvKiAgOTcyICovLCBVNjRfQygweGRiZDdjNmRlZDQ3ZTljY2YpIC8qICA5NzMgKi8sCisgIFU2NF9DKDB4NDRlNTVjNDEwMjI4YmIxYSkgLyogIDk3NCAqLywgVTY0X0MoMHhiNjQ3ZDQyNTVlZGI0ZTk5KSAvKiAgOTc1ICovLAorICBVNjRfQygweDVkMTE4ODJiYjhhYWZjMzApIC8qICA5NzYgKi8sIFU2NF9DKDB4ZjUwOThiYmIyOWQzMjEyYSkgLyogIDk3NyAqLywKKyAgVTY0X0MoMHg4ZmI1ZWExNGU5MDI5NmIzKSAvKiAgOTc4ICovLCBVNjRfQygweDY3N2I5NDIxNTdkZDAyNWEpIC8qICA5NzkgKi8sCisgIFU2NF9DKDB4ZmI1OGU3YzBhMzkwYWNiNSkgLyogIDk4MCAqLywgVTY0X0MoMHg4OWQzNjc0YzgzYmQ0YTAxKSAvKiAgOTgxICovLAorICBVNjRfQygweDllMmRhNGRmNGJmM2I5M2IpIC8qICA5ODIgKi8sIFU2NF9DKDB4ZmNjNDFlMzI4Y2FiNDgyOSkgLyogIDk4MyAqLywKKyAgVTY0X0MoMHgwM2YzOGM5NmJhNTgyYzUyKSAvKiAgOTg0ICovLCBVNjRfQygweGNhZDFiZGJkN2ZkODVkYjIpIC8qICA5ODUgKi8sCisgIFU2NF9DKDB4YmJiNDQyYzE2MDgyYWU4MykgLyogIDk4NiAqLywgVTY0X0MoMHhiOTVmZTg2YmE1ZGE5YWIwKSAvKiAgOTg3ICovLAorICBVNjRfQygweGIyMmUwNDY3Mzc3MWE5M2YpIC8qICA5ODggKi8sIFU2NF9DKDB4ODQ1MzU4Yzk0OTMxNTJkOCkgLyogIDk4OSAqLywKKyAgVTY0X0MoMHhiZTJhNDg4Njk3YjQ1NDFlKSAvKiAgOTkwICovLCBVNjRfQygweDk1YTJkYzJkZDM4ZTY5NjYpIC8qICA5OTEgKi8sCisgIFU2NF9DKDB4YzAyYzExYWM5MjNjODUyYikgLyogIDk5MiAqLywgVTY0X0MoMHgyMzg4YjE5OTBkZjJhODdiKSAvKiAgOTkzICovLAorICBVNjRfQygweDdjODAwOGZhMWI0ZjM3YmUpIC8qICA5OTQgKi8sIFU2NF9DKDB4MWY3MGQwYzg0ZDU0ZTUwMykgLyogIDk5NSAqLywKKyAgVTY0X0MoMHg1NDkwYWRlYzdlY2U1N2Q0KSAvKiAgOTk2ICovLCBVNjRfQygweDAwMmIzYzI3ZDkwNjNhM2EpIC8qICA5OTcgKi8sCisgIFU2NF9DKDB4N2VhZWEzODQ4MDMwYTJiZikgLyogIDk5OCAqLywgVTY0X0MoMHhjNjAyMzI2ZGVkMjAwM2MwKSAvKiAgOTk5ICovLAorICBVNjRfQygweDgzYTcyODdkNjlhOTQwODYpIC8qIDEwMDAgKi8sIFU2NF9DKDB4YzU3YTVmY2IzMGY1N2E4YSkgLyogMTAwMSAqLywKKyAgVTY0X0MoMHhiNTY4NDRlNDc5ZWJlNzc5KSAvKiAxMDAyICovLCBVNjRfQygweGEzNzNiNDBmMDVkY2JjZTkpIC8qIDEwMDMgKi8sCisgIFU2NF9DKDB4ZDcxYTc4NmU4ODU3MGVlMikgLyogMTAwNCAqLywgVTY0X0MoMHg4NzljYmFjZGJkZThmNmEwKSAvKiAxMDA1ICovLAorICBVNjRfQygweDk3NmFkMWJjYzE2NGEzMmYpIC8qIDEwMDYgKi8sIFU2NF9DKDB4YWIyMWUyNWU5NjY2ZDc4YikgLyogMTAwNyAqLywKKyAgVTY0X0MoMHg5MDEwNjNhYWU1ZTVjMzNjKSAvKiAxMDA4ICovLCBVNjRfQygweDk4MThiMzQ0NDg2OThkOTApIC8qIDEwMDkgKi8sCisgIFU2NF9DKDB4ZTM2NDg3YWUzZTFlOGFiYikgLyogMTAxMCAqLywgVTY0X0MoMHhhZmJkZjkzMTg5M2JkY2I0KSAvKiAxMDExICovLAorICBVNjRfQygweDYzNDVhMGRjNWZiYmQ1MTkpIC8qIDEwMTIgKi8sIFU2NF9DKDB4ODYyOGZlMjY5Yjk0NjVjYSkgLyogMTAxMyAqLywKKyAgVTY0X0MoMHgxZTVkMDE2MDNmOWM1MWVjKSAvKiAxMDE0ICovLCBVNjRfQygweDRkZTQ0MDA2YTE1MDQ5YjcpIC8qIDEwMTUgKi8sCisgIFU2NF9DKDB4YmY2YzcwZTVmNzc2Y2JiMSkgLyogMTAxNiAqLywgVTY0X0MoMHg0MTEyMThmMmVmNTUyYmVkKSAvKiAxMDE3ICovLAorICBVNjRfQygweGNiMGMwNzA4NzA1YTM2YTMpIC8qIDEwMTggKi8sIFU2NF9DKDB4ZTc0ZDE0NzU0Zjk4NjA0NCkgLyogMTAxOSAqLywKKyAgVTY0X0MoMHhjZDU2ZDk0MzBlYTgyODBlKSAvKiAxMDIwICovLCBVNjRfQygweGMxMjU5MWQ3NTM1ZjUwNjUpIC8qIDEwMjEgKi8sCisgIFU2NF9DKDB4YzgzMjIzZjE3MjBhZWY5NikgLyogMTAyMiAqLywgVTY0X0MoMHhjM2EwMzk2ZjczNjNhNTFmKSAvKiAxMDIzICovCit9OworCitzdGF0aWMgdm9pZAorZG9faW5pdCAodm9pZCAqY29udGV4dCwgaW50IHZhcmlhbnQpCit7CisgIFRJR0VSX0NPTlRFWFQgKmhkID0gY29udGV4dDsKKworICBoZC0+YSA9IDB4MDEyMzQ1Njc4OWFiY2RlZkxMOworICBoZC0+YiA9IDB4ZmVkY2JhOTg3NjU0MzIxMExMOworICBoZC0+YyA9IDB4ZjA5NmE1YjRjM2IyZTE4N0xMOworICBoZC0+bmJsb2NrcyA9IDA7CisgIGhkLT5jb3VudCA9IDA7CisgIGhkLT52YXJpYW50ID0gdmFyaWFudDsKK30KKworc3RhdGljIHZvaWQKK3RpZ2VyX2luaXQoIHZvaWQgKmNvbnRleHQgKQoreworICBkb19pbml0IChjb250ZXh0LCAwKTsKK30KKworc3RhdGljIHZvaWQKK3RpZ2VyMV9pbml0KCB2b2lkICpjb250ZXh0ICkKK3sKKyAgZG9faW5pdCAoY29udGV4dCwgMSk7Cit9CisKK3N0YXRpYyB2b2lkCit0aWdlcjJfaW5pdCggdm9pZCAqY29udGV4dCApCit7CisgIGRvX2luaXQgKGNvbnRleHQsIDIpOworfQorCitzdGF0aWMgdm9pZAordGlnZXJfcm91bmQoIHU2NCAqcmEsIHU2NCAqcmIsIHU2NCAqcmMsIHU2NCB4LCBpbnQgbXVsICkKK3sKKyAgdTY0IGEgPSAqcmE7CisgIHU2NCBiID0gKnJiOworICB1NjQgYyA9ICpyYzsKKyAgCisgIGMgXj0geDsKKyAgYSAtPSAoICBzYm94MVsgIGMgICAgICAgICYgMHhmZiBdIF4gc2JveDJbIChjID4+IDE2KSAmIDB4ZmYgXQorICAgICAgICBeIHNib3gzWyAoYyA+PiAzMikgJiAweGZmIF0gXiBzYm94NFsgKGMgPj4gNDgpICYgMHhmZiBdKTsKKyAgYiArPSAoICBzYm94NFsgKGMgPj4gIDgpICYgMHhmZiBdIF4gc2JveDNbIChjID4+IDI0KSAmIDB4ZmYgXQorICAgICAgICBeIHNib3gyWyAoYyA+PiA0MCkgJiAweGZmIF0gXiBzYm94MVsgKGMgPj4gNTYpICYgMHhmZiBdKTsKKyAgYiAqPSBtdWw7CisgIAorICAqcmEgPSBhOworICAqcmIgPSBiOworICAqcmMgPSBjOworfQorCisKK3N0YXRpYyB2b2lkCitwYXNzKCB1NjQgKnJhLCB1NjQgKnJiLCB1NjQgKnJjLCB1NjQgKngsIGludCBtdWwgKQoreworICB1NjQgYSA9ICpyYTsKKyAgdTY0IGIgPSAqcmI7CisgIHU2NCBjID0gKnJjOworCisgIHRpZ2VyX3JvdW5kKCAmYSwgJmIsICZjLCB4WzBdLCBtdWwgKTsKKyAgdGlnZXJfcm91bmQoICZiLCAmYywgJmEsIHhbMV0sIG11bCApOworICB0aWdlcl9yb3VuZCggJmMsICZhLCAmYiwgeFsyXSwgbXVsICk7CisgIHRpZ2VyX3JvdW5kKCAmYSwgJmIsICZjLCB4WzNdLCBtdWwgKTsKKyAgdGlnZXJfcm91bmQoICZiLCAmYywgJmEsIHhbNF0sIG11bCApOworICB0aWdlcl9yb3VuZCggJmMsICZhLCAmYiwgeFs1XSwgbXVsICk7CisgIHRpZ2VyX3JvdW5kKCAmYSwgJmIsICZjLCB4WzZdLCBtdWwgKTsKKyAgdGlnZXJfcm91bmQoICZiLCAmYywgJmEsIHhbN10sIG11bCApOworCisgICpyYSA9IGE7CisgICpyYiA9IGI7CisgICpyYyA9IGM7Cit9CisKKworc3RhdGljIHZvaWQKK2tleV9zY2hlZHVsZSggdTY0ICp4ICkKK3sKKyAgeFswXSAtPSB4WzddIF4gMHhhNWE1YTVhNWE1YTVhNWE1TEw7CisgIHhbMV0gXj0geFswXTsKKyAgeFsyXSArPSB4WzFdOworICB4WzNdIC09IHhbMl0gXiAoKH54WzFdKSA8PCAxOSApOworICB4WzRdIF49IHhbM107CisgIHhbNV0gKz0geFs0XTsKKyAgeFs2XSAtPSB4WzVdIF4gKCh+eFs0XSkgPj4gMjMgKTsKKyAgeFs3XSBePSB4WzZdOworICB4WzBdICs9IHhbN107CisgIHhbMV0gLT0geFswXSBeICgofnhbN10pIDw8IDE5ICk7CisgIHhbMl0gXj0geFsxXTsKKyAgeFszXSArPSB4WzJdOworICB4WzRdIC09IHhbM10gXiAoKH54WzJdKSA+PiAyMyApOworICB4WzVdIF49IHhbNF07CisgIHhbNl0gKz0geFs1XTsKKyAgeFs3XSAtPSB4WzZdIF4gMHgwMTIzNDU2Nzg5YWJjZGVmTEw7Cit9CisKKworLyoqKioqKioqKioqKioqKioKKyAqIFRyYW5zZm9ybSB0aGUgbWVzc2FnZSBEQVRBIHdoaWNoIGNvbnNpc3RzIG9mIDUxMiBieXRlcyAoOCB3b3JkcykKKyAqLworc3RhdGljIHZvaWQKK3RyYW5zZm9ybSAoIFRJR0VSX0NPTlRFWFQgKmhkLCBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhICkKK3sKKyAgdTY0IGEsYixjLGFhLGJiLGNjOworICB1NjQgeFs4XTsKKyNpZmRlZiBXT1JEU19CSUdFTkRJQU4KKyNkZWZpbmUgTUtXT1JEKGQsbikgXAorCQkoICAoKHU2NCkoZClbOCoobikrN10pIDw8IDU2IHwgKCh1NjQpKGQpWzgqKG4pKzZdKSA8PCA0OCAgXAorCQkgfCAoKHU2NCkoZClbOCoobikrNV0pIDw8IDQwIHwgKCh1NjQpKGQpWzgqKG4pKzRdKSA8PCAzMiAgXAorCQkgfCAoKHU2NCkoZClbOCoobikrM10pIDw8IDI0IHwgKCh1NjQpKGQpWzgqKG4pKzJdKSA8PCAxNiAgXAorCQkgfCAoKHU2NCkoZClbOCoobikrMV0pIDw8IDggIHwgKCh1NjQpKGQpWzgqKG4pCV0pCSApCisgIHhbMF0gPSBNS1dPUkQoZGF0YSwgMCk7CisgIHhbMV0gPSBNS1dPUkQoZGF0YSwgMSk7CisgIHhbMl0gPSBNS1dPUkQoZGF0YSwgMik7CisgIHhbM10gPSBNS1dPUkQoZGF0YSwgMyk7CisgIHhbNF0gPSBNS1dPUkQoZGF0YSwgNCk7CisgIHhbNV0gPSBNS1dPUkQoZGF0YSwgNSk7CisgIHhbNl0gPSBNS1dPUkQoZGF0YSwgNik7CisgIHhbN10gPSBNS1dPUkQoZGF0YSwgNyk7CisjdW5kZWYgTUtXT1JECisjZWxzZQorICBtZW1jcHkoICZ4WzBdLCBkYXRhLCA2NCApOworI2VuZGlmCisKKyAgLyogc2F2ZSAqLworICBhID0gYWEgPSBoZC0+YTsKKyAgYiA9IGJiID0gaGQtPmI7CisgIGMgPSBjYyA9IGhkLT5jOworCisgIHBhc3MoICZhLCAmYiwgJmMsIHgsIDUpOworICBrZXlfc2NoZWR1bGUoIHggKTsKKyAgcGFzcyggJmMsICZhLCAmYiwgeCwgNyk7CisgIGtleV9zY2hlZHVsZSggeCApOworICBwYXNzKCAmYiwgJmMsICZhLCB4LCA5KTsKKworICAvKiBmZWVkZm9yd2FyZCAqLworICBhIF49IGFhOworICBiIC09IGJiOworICBjICs9IGNjOworICAvKiBzdG9yZSAqLworICBoZC0+YSA9IGE7CisgIGhkLT5iID0gYjsKKyAgaGQtPmMgPSBjOworfQorCisKKworLyogVXBkYXRlIHRoZSBtZXNzYWdlIGRpZ2VzdCB3aXRoIHRoZSBjb250ZW50cworICogb2YgSU5CVUYgd2l0aCBsZW5ndGggSU5MRU4uCisgKi8KK3N0YXRpYyB2b2lkCit0aWdlcl93cml0ZSAoIHZvaWQgKmNvbnRleHQsIGNvbnN0IHZvaWQgKmluYnVmX2FyZywgc2l6ZV90IGlubGVuKQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICppbmJ1ZiA9IGluYnVmX2FyZzsKKyAgVElHRVJfQ09OVEVYVCAqaGQgPSBjb250ZXh0OworCisgIGlmKCBoZC0+Y291bnQgPT0gNjQgKSAvKiBmbHVzaCB0aGUgYnVmZmVyICovCisgICAgeworICAgICAgdHJhbnNmb3JtKCBoZCwgaGQtPmJ1ZiApOworICAgICAgX2djcnlfYnVybl9zdGFjayAoMjEqOCsxMSpzaXplb2Yodm9pZCopKTsKKyAgICAgIGhkLT5jb3VudCA9IDA7CisgICAgICBoZC0+bmJsb2NrcysrOworICAgIH0KKyAgaWYoICFpbmJ1ZiApCisgICAgcmV0dXJuOworICBpZiggaGQtPmNvdW50ICkgCisgICAgeworICAgICAgZm9yKCA7IGlubGVuICYmIGhkLT5jb3VudCA8IDY0OyBpbmxlbi0tICkKKyAgICAgICAgaGQtPmJ1ZltoZC0+Y291bnQrK10gPSAqaW5idWYrKzsKKyAgICAgIHRpZ2VyX3dyaXRlKCBoZCwgTlVMTCwgMCApOworICAgICAgaWYoICFpbmxlbiApCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgd2hpbGUoIGlubGVuID49IDY0ICkKKyAgICB7CisgICAgICB0cmFuc2Zvcm0oIGhkLCBpbmJ1ZiApOworICAgICAgaGQtPmNvdW50ID0gMDsKKyAgICAgIGhkLT5uYmxvY2tzKys7CisgICAgICBpbmxlbiAtPSA2NDsKKyAgICAgIGluYnVmICs9IDY0OworICAgIH0KKyAgX2djcnlfYnVybl9zdGFjayAoMjEqOCsxMSpzaXplb2Yodm9pZCopKTsKKyAgZm9yKCA7IGlubGVuICYmIGhkLT5jb3VudCA8IDY0OyBpbmxlbi0tICkKKyAgICBoZC0+YnVmW2hkLT5jb3VudCsrXSA9ICppbmJ1ZisrOworfQorCisKKworLyogVGhlIHJvdXRpbmUgdGVybWluYXRlcyB0aGUgY29tcHV0YXRpb24KKyAqLworc3RhdGljIHZvaWQKK3RpZ2VyX2ZpbmFsKCB2b2lkICpjb250ZXh0ICkKK3sKKyAgVElHRVJfQ09OVEVYVCAqaGQgPSBjb250ZXh0OworICB1MzIgdCwgbXNiLCBsc2I7CisgIGJ5dGUgKnA7CisgIGJ5dGUgcGFkID0gaGQtPnZhcmlhbnQgPT0gMj8gMHg4MCA6IDB4MDE7CisKKyAgdGlnZXJfd3JpdGUoaGQsIE5VTEwsIDApOyAvKiBmbHVzaCAqLzsKKworICB0ID0gaGQtPm5ibG9ja3M7CisgIC8qIG11bHRpcGx5IGJ5IDY0IHRvIG1ha2UgYSBieXRlIGNvdW50ICovCisgIGxzYiA9IHQgPDwgNjsKKyAgbXNiID0gdCA+PiAyNjsKKyAgLyogYWRkIHRoZSBjb3VudCAqLworICB0ID0gbHNiOworICBpZiggKGxzYiArPSBoZC0+Y291bnQpIDwgdCApCisgICAgbXNiKys7CisgIC8qIG11bHRpcGx5IGJ5IDggdG8gbWFrZSBhIGJpdCBjb3VudCAqLworICB0ID0gbHNiOworICBsc2IgPDw9IDM7CisgIG1zYiA8PD0gMzsKKyAgbXNiIHw9IHQgPj4gMjk7CisKKyAgaWYoIGhkLT5jb3VudCA8IDU2ICkgIC8qIGVub3VnaCByb29tICovCisgICAgeworICAgICAgaGQtPmJ1ZltoZC0+Y291bnQrK10gPSBwYWQ7CisgICAgICB3aGlsZSggaGQtPmNvdW50IDwgNTYgKQorICAgICAgICBoZC0+YnVmW2hkLT5jb3VudCsrXSA9IDA7ICAvKiBwYWQgKi8KKyAgICB9CisgIGVsc2UgIC8qIG5lZWQgb25lIGV4dHJhIGJsb2NrICovCisgICAgeworICAgICAgaGQtPmJ1ZltoZC0+Y291bnQrK10gPSBwYWQ7CisgICAgICB3aGlsZSggaGQtPmNvdW50IDwgNjQgKQorICAgICAgICBoZC0+YnVmW2hkLT5jb3VudCsrXSA9IDA7CisgICAgICB0aWdlcl93cml0ZShoZCwgTlVMTCwgMCk7ICAvKiBmbHVzaCAqLzsKKyAgICAgIG1lbXNldChoZC0+YnVmLCAwLCA1NiApOyAvKiBmaWxsIG5leHQgYmxvY2sgd2l0aCB6ZXJvZXMgKi8KKyAgICB9CisgIC8qIGFwcGVuZCB0aGUgNjQgYml0IGNvdW50ICovCisgIGhkLT5idWZbNTZdID0gbHNiCSAgIDsKKyAgaGQtPmJ1Zls1N10gPSBsc2IgPj4gIDg7CisgIGhkLT5idWZbNThdID0gbHNiID4+IDE2OworICBoZC0+YnVmWzU5XSA9IGxzYiA+PiAyNDsKKyAgaGQtPmJ1Zls2MF0gPSBtc2IJICAgOworICBoZC0+YnVmWzYxXSA9IG1zYiA+PiAgODsKKyAgaGQtPmJ1Zls2Ml0gPSBtc2IgPj4gMTY7CisgIGhkLT5idWZbNjNdID0gbXNiID4+IDI0OworICB0cmFuc2Zvcm0oIGhkLCBoZC0+YnVmICk7CisgIF9nY3J5X2J1cm5fc3RhY2sgKDIxKjgrMTEqc2l6ZW9mKHZvaWQqKSk7CisKKyAgcCA9IGhkLT5idWY7CisjaWZkZWYgV09SRFNfQklHRU5ESUFOCisjZGVmaW5lIFgoYSkgZG8geyAqKHU2NCopcCA9IGhkLT5hIDsgcCArPSA4OyB9IHdoaWxlKDApCisjZWxzZSAvKiBsaXR0bGUgZW5kaWFuICovCisjZGVmaW5lIFgoYSkgZG8geyAqcCsrID0gaGQtPmEgPj4gNTY7ICpwKysgPSBoZC0+YSA+PiA0ODsgXAorCSAgICAgICAgICAqcCsrID0gaGQtPmEgPj4gNDA7ICpwKysgPSBoZC0+YSA+PiAzMjsgXAorCSAgICAgICAgICAqcCsrID0gaGQtPmEgPj4gMjQ7ICpwKysgPSBoZC0+YSA+PiAxNjsgXAorCSAgICAgICAgICAqcCsrID0gaGQtPmEgPj4gIDg7ICpwKysgPSBoZC0+YTsgICAgICAgfSB3aGlsZSgwKQorI2VuZGlmCisjZGVmaW5lIFkoYSkgZG8geyAqcCsrID0gaGQtPmEgICAgICA7ICpwKysgPSBoZC0+YSA+PiA4OyAgXAorCSAgICAgICAgICAqcCsrID0gaGQtPmEgPj4gMTY7ICpwKysgPSBoZC0+YSA+PiAyNDsgXAorCSAgICAgICAgICAqcCsrID0gaGQtPmEgPj4gMzI7ICpwKysgPSBoZC0+YSA+PiA0MDsgXAorCSAgICAgICAgICAqcCsrID0gaGQtPmEgPj4gNDg7ICpwKysgPSBoZC0+YSA+PiA1NjsgfSB3aGlsZSgwKQorICBpZiAoaGQtPnZhcmlhbnQgPT0gMCkKKyAgICB7CisgICAgICBYKGEpOworICAgICAgWChiKTsKKyAgICAgIFgoYyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgWShhKTsKKyAgICAgIFkoYik7CisgICAgICBZKGMpOworICAgIH0KKyN1bmRlZiBYCisjdW5kZWYgWQorfQorCitzdGF0aWMgYnl0ZSAqCit0aWdlcl9yZWFkKCB2b2lkICpjb250ZXh0ICkKK3sKKyAgVElHRVJfQ09OVEVYVCAqaGQgPSBjb250ZXh0OworCisgIHJldHVybiBoZC0+YnVmOworfQorCisKKy8qIFRoaXMgaXMgdGhlIG9sZCBUSUdFUiB2YXJpYW50IGJhc2VkIG9uIHRoZSB1bmZpeGVkIHJlZmVyZW5jZQorICAgaW1wbGVtZW50YXRpb24uICBJdCB3YXMgdXNlZCBpbiBHbnVQRyB1cCB0byAxLjMuMi4gIFdlIGRvbid0IHByb3ZpZGUKKyAgIGFuIE9JRCBhbnltb3JlIGJlY2F1c2UgdGhhdCB3b3VsZCBub3QgYmUgY29ycmVjdC4gICovCitnY3J5X21kX3NwZWNfdCBfZ2NyeV9kaWdlc3Rfc3BlY190aWdlciA9CisgIHsKKyAgICAiVElHRVIxOTIiLCBOVUxMLCAwLCBOVUxMLCAyNCwKKyAgICB0aWdlcl9pbml0LCB0aWdlcl93cml0ZSwgdGlnZXJfZmluYWwsIHRpZ2VyX3JlYWQsCisgICAgc2l6ZW9mIChUSUdFUl9DT05URVhUKQorICB9OworCisKKwwKKy8qIFRoaXMgaXMgdGhlIGZpeGVkIFRJR0VSIGltcGxlbWVudGF0aW9uLiAgKi8KK3N0YXRpYyBieXRlIGFzbjFbMTldID0gLyogT2JqZWN0IElEIGlzIDEuMy42LjEuNC4xLjExNTkxLjEyLjIgKi8KKyAgeyAweDMwLCAweDI5LCAweDMwLCAweDBkLCAweDA2LCAweDA5LCAweDJiLCAweDA2LAorICAgIDB4MDEsIDB4MDQsIDB4MDEsIDB4ZGEsIDB4NDcsIDB4MGMsIDB4MDIsCisgICAgMHgwNSwgMHgwMCwgMHgwNCwgMHgxOCB9OworCitzdGF0aWMgZ2NyeV9tZF9vaWRfc3BlY190IG9pZF9zcGVjX3RpZ2VyMVtdID0KKyAgeworICAgIC8qIEdOVS5kaWdlc3RBbGdvcml0aG0gVElHRVIgKi8KKyAgICB7ICIxLjMuNi4xLjQuMS4xMTU5MS4xMi4yIiB9LAorICAgIHsgTlVMTCB9CisgIH07CisKK2djcnlfbWRfc3BlY190IF9nY3J5X2RpZ2VzdF9zcGVjX3RpZ2VyMSA9CisgIHsKKyAgICAiVElHRVIiLCBhc24xLCBESU0gKGFzbjEpLCBvaWRfc3BlY190aWdlcjEsIDI0LAorICAgIHRpZ2VyMV9pbml0LCB0aWdlcl93cml0ZSwgdGlnZXJfZmluYWwsIHRpZ2VyX3JlYWQsCisgICAgc2l6ZW9mIChUSUdFUl9DT05URVhUKQorICB9OworCisKKwwKKy8qIFRoaXMgaXMgVElHRVIyIHdoaWNoIHVzZXMgYSBjaGFuZ2VkIHBhZGRpbmcgYWxnb3JpdGhtLiAgKi8KK2djcnlfbWRfc3BlY190IF9nY3J5X2RpZ2VzdF9zcGVjX3RpZ2VyMiA9CisgIHsKKyAgICAiVElHRVIyIiwgTlVMTCwgMCwgTlVMTCwgMjQsCisgICAgdGlnZXIyX2luaXQsIHRpZ2VyX3dyaXRlLCB0aWdlcl9maW5hbCwgdGlnZXJfcmVhZCwKKyAgICBzaXplb2YgKFRJR0VSX0NPTlRFWFQpCisgIH07CisKKworCisjZW5kaWYgLyogSEFWRV9VNjRfVFlQRURFRiAqLwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L2NpcGhlci90d29maXNoLmMgYi9saWJnY3J5cHQtMS40LjYvY2lwaGVyL3R3b2Zpc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Mjc0YzQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L2NpcGhlci90d29maXNoLmMKQEAgLTAsMCArMSwxMDQwIEBACisvKiBUd29maXNoIGZvciBHUEcKKyAqIENvcHlyaWdodCAoQykgMTk5OCwgMjAwMiwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqIFdyaXR0ZW4gYnkgTWF0dGhldyBTa2FsYSA8bXNrYWxhQGFuc3V6LnNvb2tlLmJjLmNhPiwgSnVseSAyNiwgMTk5OAorICogMjU2LWJpdCBrZXkgbGVuZ3RoIGFkZGVkIE1hcmNoIDIwLCAxOTk5CisgKiBTb21lIG1vZGlmaWNhdGlvbnMgdG8gcmVkdWNlIHRoZSB0ZXh0IHNpemUgYnkgV2VybmVyIEtvY2gsIEFwcmlsLCAxOTk4CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVGhpcyBjb2RlIGlzIGEgImNsZWFuIHJvb20iIGltcGxlbWVudGF0aW9uLCB3cml0dGVuIGZyb20gdGhlIHBhcGVyCisgKiBfVHdvZmlzaDogQSAxMjgtQml0IEJsb2NrIENpcGhlcl8gYnkgQnJ1Y2UgU2NobmVpZXIsIEpvaG4gS2Vsc2V5LAorICogRG91ZyBXaGl0aW5nLCBEYXZpZCBXYWduZXIsIENocmlzIEhhbGwsIGFuZCBOaWVscyBGZXJndXNvbiwgYXZhaWxhYmxlCisgKiB0aHJvdWdoIGh0dHA6Ly93d3cuY291bnRlcnBhbmUuY29tL3R3b2Zpc2guaHRtbAorICoKKyAqIEZvciBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIG9uIG11bHRpcGxpY2F0aW9uIGluIGZpbml0ZSBmaWVsZHMsIHVzZWQgZm9yCisgKiB0aGUgbWF0cml4IG9wZXJhdGlvbnMgaW4gdGhlIGtleSBzY2hlZHVsZSwgc2VlIHRoZSBib29rIF9Db250ZW1wb3JhcnkKKyAqIEFic3RyYWN0IEFsZ2VicmFfIGJ5IEpvc2VwaCBBLiBHYWxsaWFuLCBlc3BlY2lhbGx5IGNoYXB0ZXIgMjIgaW4gdGhlCisgKiBUaGlyZCBFZGl0aW9uLgorICoKKyAqIE9ubHkgdGhlIDEyOC0gYW5kIDI1Ni1iaXQga2V5IHNpemVzIGFyZSBzdXBwb3J0ZWQuICBUaGlzIGNvZGUgaXMgaW50ZW5kZWQKKyAqIGZvciBHTlUgQyBvbiBhIDMyLWJpdCBzeXN0ZW0sIGJ1dCBpdCBzaG91bGQgd29yayBhbG1vc3QgYW55d2hlcmUuICBMb29wcworICogYXJlIHVucm9sbGVkLCBwcmVjb21wdXRhdGlvbiB0YWJsZXMgYXJlIHVzZWQsIGV0Yy4sIGZvciBtYXhpbXVtIHNwZWVkIGF0CisgKiBzb21lIGNvc3QgaW4gbWVtb3J5IGNvbnN1bXB0aW9uLiAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4gLyogZm9yIG1lbWNtcCgpICovCisKKyNpbmNsdWRlICJ0eXBlcy5oIiAgLyogZm9yIGJ5dGUgYW5kIHUzMiB0eXBlZGVmcyAqLworI2luY2x1ZGUgImcxMGxpYi5oIgorI2luY2x1ZGUgImNpcGhlci5oIgorCisvKiBQcm90b3R5cGUgZm9yIHRoZSBzZWxmLXRlc3QgZnVuY3Rpb24uICovCitzdGF0aWMgY29uc3QgY2hhciAqc2VsZnRlc3Qodm9pZCk7CisKKy8qIFN0cnVjdHVyZSBmb3IgYW4gZXhwYW5kZWQgVHdvZmlzaCBrZXkuICBzIGNvbnRhaW5zIHRoZSBrZXktZGVwZW5kZW50CisgKiBTLWJveGVzIGNvbXBvc2VkIHdpdGggdGhlIE1EUyBtYXRyaXg7IHcgY29udGFpbnMgdGhlIGVpZ2h0ICJ3aGl0ZW5pbmciCisgKiBzdWJrZXlzLCBLWzBdIHRocm91Z2ggS1s3XS4JayBob2xkcyB0aGUgcmVtYWluaW5nLCAicm91bmQiIHN1YmtleXMuICBOb3RlCisgKiB0aGF0IGtbaV0gY29ycmVzcG9uZHMgdG8gd2hhdCB0aGUgVHdvZmlzaCBwYXBlciBjYWxscyBLW2krOF0uICovCit0eXBlZGVmIHN0cnVjdCB7CisgICB1MzIgc1s0XVsyNTZdLCB3WzhdLCBrWzMyXTsKK30gVFdPRklTSF9jb250ZXh0OworDAorLyogVGhlc2UgdHdvIHRhYmxlcyBhcmUgdGhlIHEwIGFuZCBxMSBwZXJtdXRhdGlvbnMsIGV4YWN0bHkgYXMgZGVzY3JpYmVkIGluCisgKiB0aGUgVHdvZmlzaCBwYXBlci4gKi8KKworc3RhdGljIGNvbnN0IGJ5dGUgcTBbMjU2XSA9IHsKKyAgIDB4QTksIDB4NjcsIDB4QjMsIDB4RTgsIDB4MDQsIDB4RkQsIDB4QTMsIDB4NzYsIDB4OUEsIDB4OTIsIDB4ODAsIDB4NzgsCisgICAweEU0LCAweERELCAweEQxLCAweDM4LCAweDBELCAweEM2LCAweDM1LCAweDk4LCAweDE4LCAweEY3LCAweEVDLCAweDZDLAorICAgMHg0MywgMHg3NSwgMHgzNywgMHgyNiwgMHhGQSwgMHgxMywgMHg5NCwgMHg0OCwgMHhGMiwgMHhEMCwgMHg4QiwgMHgzMCwKKyAgIDB4ODQsIDB4NTQsIDB4REYsIDB4MjMsIDB4MTksIDB4NUIsIDB4M0QsIDB4NTksIDB4RjMsIDB4QUUsIDB4QTIsIDB4ODIsCisgICAweDYzLCAweDAxLCAweDgzLCAweDJFLCAweEQ5LCAweDUxLCAweDlCLCAweDdDLCAweEE2LCAweEVCLCAweEE1LCAweEJFLAorICAgMHgxNiwgMHgwQywgMHhFMywgMHg2MSwgMHhDMCwgMHg4QywgMHgzQSwgMHhGNSwgMHg3MywgMHgyQywgMHgyNSwgMHgwQiwKKyAgIDB4QkIsIDB4NEUsIDB4ODksIDB4NkIsIDB4NTMsIDB4NkEsIDB4QjQsIDB4RjEsIDB4RTEsIDB4RTYsIDB4QkQsIDB4NDUsCisgICAweEUyLCAweEY0LCAweEI2LCAweDY2LCAweENDLCAweDk1LCAweDAzLCAweDU2LCAweEQ0LCAweDFDLCAweDFFLCAweEQ3LAorICAgMHhGQiwgMHhDMywgMHg4RSwgMHhCNSwgMHhFOSwgMHhDRiwgMHhCRiwgMHhCQSwgMHhFQSwgMHg3NywgMHgzOSwgMHhBRiwKKyAgIDB4MzMsIDB4QzksIDB4NjIsIDB4NzEsIDB4ODEsIDB4NzksIDB4MDksIDB4QUQsIDB4MjQsIDB4Q0QsIDB4RjksIDB4RDgsCisgICAweEU1LCAweEM1LCAweEI5LCAweDRELCAweDQ0LCAweDA4LCAweDg2LCAweEU3LCAweEExLCAweDFELCAweEFBLCAweEVELAorICAgMHgwNiwgMHg3MCwgMHhCMiwgMHhEMiwgMHg0MSwgMHg3QiwgMHhBMCwgMHgxMSwgMHgzMSwgMHhDMiwgMHgyNywgMHg5MCwKKyAgIDB4MjAsIDB4RjYsIDB4NjAsIDB4RkYsIDB4OTYsIDB4NUMsIDB4QjEsIDB4QUIsIDB4OUUsIDB4OUMsIDB4NTIsIDB4MUIsCisgICAweDVGLCAweDkzLCAweDBBLCAweEVGLCAweDkxLCAweDg1LCAweDQ5LCAweEVFLCAweDJELCAweDRGLCAweDhGLCAweDNCLAorICAgMHg0NywgMHg4NywgMHg2RCwgMHg0NiwgMHhENiwgMHgzRSwgMHg2OSwgMHg2NCwgMHgyQSwgMHhDRSwgMHhDQiwgMHgyRiwKKyAgIDB4RkMsIDB4OTcsIDB4MDUsIDB4N0EsIDB4QUMsIDB4N0YsIDB4RDUsIDB4MUEsIDB4NEIsIDB4MEUsIDB4QTcsIDB4NUEsCisgICAweDI4LCAweDE0LCAweDNGLCAweDI5LCAweDg4LCAweDNDLCAweDRDLCAweDAyLCAweEI4LCAweERBLCAweEIwLCAweDE3LAorICAgMHg1NSwgMHgxRiwgMHg4QSwgMHg3RCwgMHg1NywgMHhDNywgMHg4RCwgMHg3NCwgMHhCNywgMHhDNCwgMHg5RiwgMHg3MiwKKyAgIDB4N0UsIDB4MTUsIDB4MjIsIDB4MTIsIDB4NTgsIDB4MDcsIDB4OTksIDB4MzQsIDB4NkUsIDB4NTAsIDB4REUsIDB4NjgsCisgICAweDY1LCAweEJDLCAweERCLCAweEY4LCAweEM4LCAweEE4LCAweDJCLCAweDQwLCAweERDLCAweEZFLCAweDMyLCAweEE0LAorICAgMHhDQSwgMHgxMCwgMHgyMSwgMHhGMCwgMHhEMywgMHg1RCwgMHgwRiwgMHgwMCwgMHg2RiwgMHg5RCwgMHgzNiwgMHg0MiwKKyAgIDB4NEEsIDB4NUUsIDB4QzEsIDB4RTAKK307CisKK3N0YXRpYyBjb25zdCBieXRlIHExWzI1Nl0gPSB7CisgICAweDc1LCAweEYzLCAweEM2LCAweEY0LCAweERCLCAweDdCLCAweEZCLCAweEM4LCAweDRBLCAweEQzLCAweEU2LCAweDZCLAorICAgMHg0NSwgMHg3RCwgMHhFOCwgMHg0QiwgMHhENiwgMHgzMiwgMHhEOCwgMHhGRCwgMHgzNywgMHg3MSwgMHhGMSwgMHhFMSwKKyAgIDB4MzAsIDB4MEYsIDB4RjgsIDB4MUIsIDB4ODcsIDB4RkEsIDB4MDYsIDB4M0YsIDB4NUUsIDB4QkEsIDB4QUUsIDB4NUIsCisgICAweDhBLCAweDAwLCAweEJDLCAweDlELCAweDZELCAweEMxLCAweEIxLCAweDBFLCAweDgwLCAweDVELCAweEQyLCAweEQ1LAorICAgMHhBMCwgMHg4NCwgMHgwNywgMHgxNCwgMHhCNSwgMHg5MCwgMHgyQywgMHhBMywgMHhCMiwgMHg3MywgMHg0QywgMHg1NCwKKyAgIDB4OTIsIDB4NzQsIDB4MzYsIDB4NTEsIDB4MzgsIDB4QjAsIDB4QkQsIDB4NUEsIDB4RkMsIDB4NjAsIDB4NjIsIDB4OTYsCisgICAweDZDLCAweDQyLCAweEY3LCAweDEwLCAweDdDLCAweDI4LCAweDI3LCAweDhDLCAweDEzLCAweDk1LCAweDlDLCAweEM3LAorICAgMHgyNCwgMHg0NiwgMHgzQiwgMHg3MCwgMHhDQSwgMHhFMywgMHg4NSwgMHhDQiwgMHgxMSwgMHhEMCwgMHg5MywgMHhCOCwKKyAgIDB4QTYsIDB4ODMsIDB4MjAsIDB4RkYsIDB4OUYsIDB4NzcsIDB4QzMsIDB4Q0MsIDB4MDMsIDB4NkYsIDB4MDgsIDB4QkYsCisgICAweDQwLCAweEU3LCAweDJCLCAweEUyLCAweDc5LCAweDBDLCAweEFBLCAweDgyLCAweDQxLCAweDNBLCAweEVBLCAweEI5LAorICAgMHhFNCwgMHg5QSwgMHhBNCwgMHg5NywgMHg3RSwgMHhEQSwgMHg3QSwgMHgxNywgMHg2NiwgMHg5NCwgMHhBMSwgMHgxRCwKKyAgIDB4M0QsIDB4RjAsIDB4REUsIDB4QjMsIDB4MEIsIDB4NzIsIDB4QTcsIDB4MUMsIDB4RUYsIDB4RDEsIDB4NTMsIDB4M0UsCisgICAweDhGLCAweDMzLCAweDI2LCAweDVGLCAweEVDLCAweDc2LCAweDJBLCAweDQ5LCAweDgxLCAweDg4LCAweEVFLCAweDIxLAorICAgMHhDNCwgMHgxQSwgMHhFQiwgMHhEOSwgMHhDNSwgMHgzOSwgMHg5OSwgMHhDRCwgMHhBRCwgMHgzMSwgMHg4QiwgMHgwMSwKKyAgIDB4MTgsIDB4MjMsIDB4REQsIDB4MUYsIDB4NEUsIDB4MkQsIDB4RjksIDB4NDgsIDB4NEYsIDB4RjIsIDB4NjUsIDB4OEUsCisgICAweDc4LCAweDVDLCAweDU4LCAweDE5LCAweDhELCAweEU1LCAweDk4LCAweDU3LCAweDY3LCAweDdGLCAweDA1LCAweDY0LAorICAgMHhBRiwgMHg2MywgMHhCNiwgMHhGRSwgMHhGNSwgMHhCNywgMHgzQywgMHhBNSwgMHhDRSwgMHhFOSwgMHg2OCwgMHg0NCwKKyAgIDB4RTAsIDB4NEQsIDB4NDMsIDB4NjksIDB4MjksIDB4MkUsIDB4QUMsIDB4MTUsIDB4NTksIDB4QTgsIDB4MEEsIDB4OUUsCisgICAweDZFLCAweDQ3LCAweERGLCAweDM0LCAweDM1LCAweDZBLCAweENGLCAweERDLCAweDIyLCAweEM5LCAweEMwLCAweDlCLAorICAgMHg4OSwgMHhENCwgMHhFRCwgMHhBQiwgMHgxMiwgMHhBMiwgMHgwRCwgMHg1MiwgMHhCQiwgMHgwMiwgMHgyRiwgMHhBOSwKKyAgIDB4RDcsIDB4NjEsIDB4MUUsIDB4QjQsIDB4NTAsIDB4MDQsIDB4RjYsIDB4QzIsIDB4MTYsIDB4MjUsIDB4ODYsIDB4NTYsCisgICAweDU1LCAweDA5LCAweEJFLCAweDkxCit9OworDAorLyogVGhlc2UgTURTIHRhYmxlcyBhcmUgYWN0dWFsbHkgdGFibGVzIG9mIE1EUyBjb21wb3NlZCB3aXRoIHEwIGFuZCBxMSwKKyAqIGJlY2F1c2UgaXQgaXMgb25seSBldmVyIHVzZWQgdGhhdCB3YXkgYW5kIHdlIGNhbiBzYXZlIHNvbWUgdGltZSBieQorICogcHJlY29tcHV0aW5nLiAgT2YgY291cnNlIHRoZSBtYWluIHNhdmluZyBjb21lcyBmcm9tIHByZWNvbXB1dGluZyB0aGUKKyAqIEdGKDJeOCkgbXVsdGlwbGljYXRpb24gaW52b2x2ZWQgaW4gdGhlIE1EUyBtYXRyaXggbXVsdGlwbHk7IGJ5IGxvb2tpbmcKKyAqIHRoaW5ncyB1cCBpbiB0aGVzZSB0YWJsZXMgd2UgcmVkdWNlIHRoZSBtYXRyaXggbXVsdGlwbHkgdG8gZm91ciBsb29rdXBzCisgKiBhbmQgdGhyZWUgWE9Scy4gIFNlbWktZm9ybWFsbHksIHRoZSBkZWZpbml0aW9uIG9mIHRoZXNlIHRhYmxlcyBpczoKKyAqIG1kc1swXVtpXSA9IE1EUyAocTFbaV0gMCAwIDApXlQgIG1kc1sxXVtpXSA9IE1EUyAoMCBxMFtpXSAwIDApXlQKKyAqIG1kc1syXVtpXSA9IE1EUyAoMCAwIHExW2ldIDApXlQgIG1kc1szXVtpXSA9IE1EUyAoMCAwIDAgcTBbaV0pXlQKKyAqIHdoZXJlIF5UIG1lYW5zICJ0cmFuc3Bvc2UiLCB0aGUgbWF0cml4IG11bHRpcGx5IGlzIHBlcmZvcm1lZCBpbiBHRigyXjgpCisgKiByZXByZXNlbnRlZCBhcyBHRigyKVt4XS92KHgpIHdoZXJlIHYoeCk9eF44K3heNit4XjUreF4zKzEgYXMgZGVzY3JpYmVkCisgKiBieSBTY2huZWllciBldCBhbCwgYW5kIEknbSBjYXN1YWxseSBnbG9zc2luZyBvdmVyIHRoZSBieXRlL3dvcmQKKyAqIGNvbnZlcnNpb24gaXNzdWVzLiAqLworCitzdGF0aWMgY29uc3QgdTMyIG1kc1s0XVsyNTZdID0geworICAgezB4QkNCQzMyNzUsIDB4RUNFQzIxRjMsIDB4MjAyMDQzQzYsIDB4QjNCM0M5RjQsIDB4REFEQTAzREIsIDB4MDIwMjhCN0IsCisgICAgMHhFMkUyMkJGQiwgMHg5RTlFRkFDOCwgMHhDOUM5RUM0QSwgMHhENEQ0MDlEMywgMHgxODE4NkJFNiwgMHgxRTFFOUY2QiwKKyAgICAweDk4OTgwRTQ1LCAweEIyQjIzODdELCAweEE2QTZEMkU4LCAweDI2MjZCNzRCLCAweDNDM0M1N0Q2LCAweDkzOTM4QTMyLAorICAgIDB4ODI4MkVFRDgsIDB4NTI1Mjk4RkQsIDB4N0I3QkQ0MzcsIDB4QkJCQjM3NzEsIDB4NUI1Qjk3RjEsIDB4NDc0NzgzRTEsCisgICAgMHgyNDI0M0MzMCwgMHg1MTUxRTIwRiwgMHhCQUJBQzZGOCwgMHg0QTRBRjMxQiwgMHhCRkJGNDg4NywgMHgwRDBENzBGQSwKKyAgICAweEIwQjBCMzA2LCAweDc1NzVERTNGLCAweEQyRDJGRDVFLCAweDdEN0QyMEJBLCAweDY2NjYzMUFFLCAweDNBM0FBMzVCLAorICAgIDB4NTk1OTFDOEEsIDB4MDAwMDAwMDAsIDB4Q0RDRDkzQkMsIDB4MUExQUUwOUQsIDB4QUVBRTJDNkQsIDB4N0Y3RkFCQzEsCisgICAgMHgyQjJCQzdCMSwgMHhCRUJFQjkwRSwgMHhFMEUwQTA4MCwgMHg4QThBMTA1RCwgMHgzQjNCNTJEMiwgMHg2NDY0QkFENSwKKyAgICAweEQ4RDg4OEEwLCAweEU3RTdBNTg0LCAweDVGNUZFODA3LCAweDFCMUIxMTE0LCAweDJDMkNDMkI1LCAweEZDRkNCNDkwLAorICAgIDB4MzEzMTI3MkMsIDB4ODA4MDY1QTMsIDB4NzM3MzJBQjIsIDB4MEMwQzgxNzMsIDB4Nzk3OTVGNEMsIDB4NkI2QjQxNTQsCisgICAgMHg0QjRCMDI5MiwgMHg1MzUzNjk3NCwgMHg5NDk0OEYzNiwgMHg4MzgzMUY1MSwgMHgyQTJBMzYzOCwgMHhDNEM0OUNCMCwKKyAgICAweDIyMjJDOEJELCAweEQ1RDVGODVBLCAweEJEQkRDM0ZDLCAweDQ4NDg3ODYwLCAweEZGRkZDRTYyLCAweDRDNEMwNzk2LAorICAgIDB4NDE0MTc3NkMsIDB4QzdDN0U2NDIsIDB4RUJFQjI0RjcsIDB4MUMxQzE0MTAsIDB4NUQ1RDYzN0MsIDB4MzYzNjIyMjgsCisgICAgMHg2NzY3QzAyNywgMHhFOUU5QUY4QywgMHg0NDQ0RjkxMywgMHgxNDE0RUE5NSwgMHhGNUY1QkI5QywgMHhDRkNGMThDNywKKyAgICAweDNGM0YyRDI0LCAweEMwQzBFMzQ2LCAweDcyNzJEQjNCLCAweDU0NTQ2QzcwLCAweDI5Mjk0Q0NBLCAweEYwRjAzNUUzLAorICAgIDB4MDgwOEZFODUsIDB4QzZDNjE3Q0IsIDB4RjNGMzRGMTEsIDB4OEM4Q0U0RDAsIDB4QTRBNDU5OTMsIDB4Q0FDQTk2QjgsCisgICAgMHg2ODY4M0JBNiwgMHhCOEI4NEQ4MywgMHgzODM4MjgyMCwgMHhFNUU1MkVGRiwgMHhBREFENTY5RiwgMHgwQjBCODQ3NywKKyAgICAweEM4QzgxREMzLCAweDk5OTlGRkNDLCAweDU4NThFRDAzLCAweDE5MTk5QTZGLCAweDBFMEUwQTA4LCAweDk1OTU3RUJGLAorICAgIDB4NzA3MDUwNDAsIDB4RjdGNzMwRTcsIDB4NkU2RUNGMkIsIDB4MUYxRjZFRTIsIDB4QjVCNTNENzksIDB4MDkwOTBGMEMsCisgICAgMHg2MTYxMzRBQSwgMHg1NzU3MTY4MiwgMHg5RjlGMEI0MSwgMHg5RDlEODAzQSwgMHgxMTExNjRFQSwgMHgyNTI1Q0RCOSwKKyAgICAweEFGQUZEREU0LCAweDQ1NDUwODlBLCAweERGREY4REE0LCAweEEzQTM1Qzk3LCAweEVBRUFENTdFLCAweDM1MzU1OERBLAorICAgIDB4RURFREQwN0EsIDB4NDM0M0ZDMTcsIDB4RjhGOENCNjYsIDB4RkJGQkIxOTQsIDB4MzczN0QzQTEsIDB4RkFGQTQwMUQsCisgICAgMHhDMkMyNjgzRCwgMHhCNEI0Q0NGMCwgMHgzMjMyNURERSwgMHg5QzlDNzFCMywgMHg1NjU2RTcwQiwgMHhFM0UzREE3MiwKKyAgICAweDg3ODc2MEE3LCAweDE1MTUxQjFDLCAweEY5RjkzQUVGLCAweDYzNjNCRkQxLCAweDM0MzRBOTUzLCAweDlBOUE4NTNFLAorICAgIDB4QjFCMTQyOEYsIDB4N0M3Q0QxMzMsIDB4ODg4ODlCMjYsIDB4M0QzREE2NUYsIDB4QTFBMUQ3RUMsIDB4RTRFNERGNzYsCisgICAgMHg4MTgxOTQyQSwgMHg5MTkxMDE0OSwgMHgwRjBGRkI4MSwgMHhFRUVFQUE4OCwgMHgxNjE2NjFFRSwgMHhEN0Q3NzMyMSwKKyAgICAweDk3OTdGNUM0LCAweEE1QTVBODFBLCAweEZFRkUzRkVCLCAweDZENkRCNUQ5LCAweDc4NzhBRUM1LCAweEM1QzU2RDM5LAorICAgIDB4MUQxREU1OTksIDB4NzY3NkE0Q0QsIDB4M0UzRURDQUQsIDB4Q0JDQjY3MzEsIDB4QjZCNjQ3OEIsIDB4RUZFRjVCMDEsCisgICAgMHgxMjEyMUUxOCwgMHg2MDYwQzUyMywgMHg2QTZBQjBERCwgMHg0RDRERjYxRiwgMHhDRUNFRTk0RSwgMHhERURFN0MyRCwKKyAgICAweDU1NTU5REY5LCAweDdFN0U1QTQ4LCAweDIxMjFCMjRGLCAweDAzMDM3QUYyLCAweEEwQTAyNjY1LCAweDVFNUUxOThFLAorICAgIDB4NUE1QTY2NzgsIDB4NjU2NTRCNUMsIDB4NjI2MjRFNTgsIDB4RkRGRDQ1MTksIDB4MDYwNkY0OEQsIDB4NDA0MDg2RTUsCisgICAgMHhGMkYyQkU5OCwgMHgzMzMzQUM1NywgMHgxNzE3OTA2NywgMHgwNTA1OEU3RiwgMHhFOEU4NUUwNSwgMHg0RjRGN0Q2NCwKKyAgICAweDg5ODk2QUFGLCAweDEwMTA5NTYzLCAweDc0NzQyRkI2LCAweDBBMEE3NUZFLCAweDVDNUM5MkY1LCAweDlCOUI3NEI3LAorICAgIDB4MkQyRDMzM0MsIDB4MzAzMEQ2QTUsIDB4MkUyRTQ5Q0UsIDB4NDk0OTg5RTksIDB4NDY0NjcyNjgsIDB4Nzc3NzU1NDQsCisgICAgMHhBOEE4RDhFMCwgMHg5Njk2MDQ0RCwgMHgyODI4QkQ0MywgMHhBOUE5Mjk2OSwgMHhEOUQ5NzkyOSwgMHg4Njg2OTEyRSwKKyAgICAweEQxRDE4N0FDLCAweEY0RjQ0QTE1LCAweDhEOEQxNTU5LCAweEQ2RDY4MkE4LCAweEI5QjlCQzBBLCAweDQyNDIwRDlFLAorICAgIDB4RjZGNkMxNkUsIDB4MkYyRkI4NDcsIDB4RERERDA2REYsIDB4MjMyMzM5MzQsIDB4Q0NDQzYyMzUsIDB4RjFGMUM0NkEsCisgICAgMHhDMUMxMTJDRiwgMHg4NTg1RUJEQywgMHg4RjhGOUUyMiwgMHg3MTcxQTFDOSwgMHg5MDkwRjBDMCwgMHhBQUFBNTM5QiwKKyAgICAweDAxMDFGMTg5LCAweDhCOEJFMUQ0LCAweDRFNEU4Q0VELCAweDhFOEU2RkFCLCAweEFCQUJBMjEyLCAweDZGNkYzRUEyLAorICAgIDB4RTZFNjU0MEQsIDB4REJEQkYyNTIsIDB4OTI5MjdCQkIsIDB4QjdCN0I2MDIsIDB4Njk2OUNBMkYsIDB4MzkzOUQ5QTksCisgICAgMHhEM0QzMENENywgMHhBN0E3MjM2MSwgMHhBMkEyQUQxRSwgMHhDM0MzOTlCNCwgMHg2QzZDNDQ1MCwgMHgwNzA3MDUwNCwKKyAgICAweDA0MDQ3RkY2LCAweDI3Mjc0NkMyLCAweEFDQUNBNzE2LCAweEQwRDA3NjI1LCAweDUwNTAxMzg2LCAweERDRENGNzU2LAorICAgIDB4ODQ4NDFBNTUsIDB4RTFFMTUxMDksIDB4N0E3QTI1QkUsIDB4MTMxM0VGOTF9LAorCisgICB7MHhBOUQ5MzkzOSwgMHg2NzkwMTcxNywgMHhCMzcxOUM5QywgMHhFOEQyQTZBNiwgMHgwNDA1MDcwNywgMHhGRDk4NTI1MiwKKyAgICAweEEzNjU4MDgwLCAweDc2REZFNEU0LCAweDlBMDg0NTQ1LCAweDkyMDI0QjRCLCAweDgwQTBFMEUwLCAweDc4NjY1QTVBLAorICAgIDB4RTREREFGQUYsIDB4RERCMDZBNkEsIDB4RDFCRjYzNjMsIDB4MzgzNjJBMkEsIDB4MEQ1NEU2RTYsIDB4QzY0MzIwMjAsCisgICAgMHgzNTYyQ0NDQywgMHg5OEJFRjJGMiwgMHgxODFFMTIxMiwgMHhGNzI0RUJFQiwgMHhFQ0Q3QTFBMSwgMHg2Qzc3NDE0MSwKKyAgICAweDQzQkQyODI4LCAweDc1MzJCQ0JDLCAweDM3RDQ3QjdCLCAweDI2OUI4ODg4LCAweEZBNzAwRDBELCAweDEzRjk0NDQ0LAorICAgIDB4OTRCMUZCRkIsIDB4NDg1QTdFN0UsIDB4RjI3QTAzMDMsIDB4RDBFNDhDOEMsIDB4OEI0N0I2QjYsIDB4MzAzQzI0MjQsCisgICAgMHg4NEE1RTdFNywgMHg1NDQxNkI2QiwgMHhERjA2RERERCwgMHgyM0M1NjA2MCwgMHgxOTQ1RkRGRCwgMHg1QkEzM0EzQSwKKyAgICAweDNENjhDMkMyLCAweDU5MTU4RDhELCAweEYzMjFFQ0VDLCAweEFFMzE2NjY2LCAweEEyM0U2RjZGLCAweDgyMTY1NzU3LAorICAgIDB4NjM5NTEwMTAsIDB4MDE1QkVGRUYsIDB4ODM0REI4QjgsIDB4MkU5MTg2ODYsIDB4RDlCNTZENkQsIDB4NTExRjgzODMsCisgICAgMHg5QjUzQUFBQSwgMHg3QzYzNUQ1RCwgMHhBNjNCNjg2OCwgMHhFQjNGRkVGRSwgMHhBNUQ2MzAzMCwgMHhCRTI1N0E3QSwKKyAgICAweDE2QTdBQ0FDLCAweDBDMEYwOTA5LCAweEUzMzVGMEYwLCAweDYxMjNBN0E3LCAweEMwRjA5MDkwLCAweDhDQUZFOUU5LAorICAgIDB4M0E4MDlEOUQsIDB4RjU5MjVDNUMsIDB4NzM4MTBDMEMsIDB4MkMyNzMxMzEsIDB4MjU3NkQwRDAsIDB4MEJFNzU2NTYsCisgICAgMHhCQjdCOTI5MiwgMHg0RUU5Q0VDRSwgMHg4OUYxMDEwMSwgMHg2QjlGMUUxRSwgMHg1M0E5MzQzNCwgMHg2QUM0RjFGMSwKKyAgICAweEI0OTlDM0MzLCAweEYxOTc1QjVCLCAweEUxODM0NzQ3LCAweEU2NkIxODE4LCAweEJEQzgyMjIyLCAweDQ1MEU5ODk4LAorICAgIDB4RTI2RTFGMUYsIDB4RjRDOUIzQjMsIDB4QjYyRjc0NzQsIDB4NjZDQkY4RjgsIDB4Q0NGRjk5OTksIDB4OTVFQTE0MTQsCisgICAgMHgwM0VENTg1OCwgMHg1NkY3RENEQywgMHhENEUxOEI4QiwgMHgxQzFCMTUxNSwgMHgxRUFEQTJBMiwgMHhENzBDRDNEMywKKyAgICAweEZCMkJFMkUyLCAweEMzMURDOEM4LCAweDhFMTk1RTVFLCAweEI1QzIyQzJDLCAweEU5ODk0OTQ5LCAweENGMTJDMUMxLAorICAgIDB4QkY3RTk1OTUsIDB4QkEyMDdEN0QsIDB4RUE2NDExMTEsIDB4Nzc4NDBCMEIsIDB4Mzk2REM1QzUsIDB4QUY2QTg5ODksCisgICAgMHgzM0QxN0M3QywgMHhDOUExNzE3MSwgMHg2MkNFRkZGRiwgMHg3MTM3QkJCQiwgMHg4MUZCMEYwRiwgMHg3OTNEQjVCNSwKKyAgICAweDA5NTFFMUUxLCAweEFEREMzRTNFLCAweDI0MkQzRjNGLCAweENEQTQ3Njc2LCAweEY5OUQ1NTU1LCAweEQ4RUU4MjgyLAorICAgIDB4RTU4NjQwNDAsIDB4QzVBRTc4NzgsIDB4QjlDRDI1MjUsIDB4NEQwNDk2OTYsIDB4NDQ1NTc3NzcsIDB4MDgwQTBFMEUsCisgICAgMHg4NjEzNTA1MCwgMHhFNzMwRjdGNywgMHhBMUQzMzczNywgMHgxRDQwRkFGQSwgMHhBQTM0NjE2MSwgMHhFRDhDNEU0RSwKKyAgICAweDA2QjNCMEIwLCAweDcwNkM1NDU0LCAweEIyMkE3MzczLCAweEQyNTIzQjNCLCAweDQxMEI5RjlGLCAweDdCOEIwMjAyLAorICAgIDB4QTA4OEQ4RDgsIDB4MTE0RkYzRjMsIDB4MzE2N0NCQ0IsIDB4QzI0NjI3MjcsIDB4MjdDMDY3NjcsIDB4OTBCNEZDRkMsCisgICAgMHgyMDI4MzgzOCwgMHhGNjdGMDQwNCwgMHg2MDc4NDg0OCwgMHhGRjJFRTVFNSwgMHg5NjA3NEM0QywgMHg1QzRCNjU2NSwKKyAgICAweEIxQzcyQjJCLCAweEFCNkY4RThFLCAweDlFMEQ0MjQyLCAweDlDQkJGNUY1LCAweDUyRjJEQkRCLCAweDFCRjM0QTRBLAorICAgIDB4NUZBNjNEM0QsIDB4OTM1OUE0QTQsIDB4MEFCQ0I5QjksIDB4RUYzQUY5RjksIDB4OTFFRjEzMTMsIDB4ODVGRTA4MDgsCisgICAgMHg0OTAxOTE5MSwgMHhFRTYxMTYxNiwgMHgyRDdDREVERSwgMHg0RkIyMjEyMSwgMHg4RjQyQjFCMSwgMHgzQkRCNzI3MiwKKyAgICAweDQ3QjgyRjJGLCAweDg3NDhCRkJGLCAweDZEMkNBRUFFLCAweDQ2RTNDMEMwLCAweEQ2NTczQzNDLCAweDNFODU5QTlBLAorICAgIDB4NjkyOUE5QTksIDB4NjQ3RDRGNEYsIDB4MkE5NDgxODEsIDB4Q0U0OTJFMkUsIDB4Q0IxN0M2QzYsIDB4MkZDQTY5NjksCisgICAgMHhGQ0MzQkRCRCwgMHg5NzVDQTNBMywgMHgwNTVFRThFOCwgMHg3QUQwRURFRCwgMHhBQzg3RDFEMSwgMHg3RjhFMDUwNSwKKyAgICAweEQ1QkE2NDY0LCAweDFBQThBNUE1LCAweDRCQjcyNjI2LCAweDBFQjlCRUJFLCAweEE3NjA4Nzg3LCAweDVBRjhENUQ1LAorICAgIDB4MjgyMjM2MzYsIDB4MTQxMTFCMUIsIDB4M0ZERTc1NzUsIDB4Mjk3OUQ5RDksIDB4ODhBQUVFRUUsIDB4M0MzMzJEMkQsCisgICAgMHg0QzVGNzk3OSwgMHgwMkI2QjdCNywgMHhCODk2Q0FDQSwgMHhEQTU4MzUzNSwgMHhCMDlDQzRDNCwgMHgxN0ZDNDM0MywKKyAgICAweDU1MUE4NDg0LCAweDFGRjY0RDRELCAweDhBMUM1OTU5LCAweDdEMzhCMkIyLCAweDU3QUMzMzMzLCAweEM3MThDRkNGLAorICAgIDB4OERGNDA2MDYsIDB4NzQ2OTUzNTMsIDB4Qjc3NDlCOUIsIDB4QzRGNTk3OTcsIDB4OUY1NkFEQUQsIDB4NzJEQUUzRTMsCisgICAgMHg3RUQ1RUFFQSwgMHgxNTRBRjRGNCwgMHgyMjlFOEY4RiwgMHgxMkEyQUJBQiwgMHg1ODRFNjI2MiwgMHgwN0U4NUY1RiwKKyAgICAweDk5RTUxRDFELCAweDM0MzkyMzIzLCAweDZFQzFGNkY2LCAweDUwNDQ2QzZDLCAweERFNUQzMjMyLCAweDY4NzI0NjQ2LAorICAgIDB4NjUyNkEwQTAsIDB4QkM5M0NEQ0QsIDB4REIwM0RBREEsIDB4RjhDNkJBQkEsIDB4QzhGQTlFOUUsIDB4QTg4MkQ2RDYsCisgICAgMHgyQkNGNkU2RSwgMHg0MDUwNzA3MCwgMHhEQ0VCODU4NSwgMHhGRTc1MEEwQSwgMHgzMjhBOTM5MywgMHhBNDhEREZERiwKKyAgICAweENBNEMyOTI5LCAweDEwMTQxQzFDLCAweDIxNzNEN0Q3LCAweEYwQ0NCNEI0LCAweEQzMDlENEQ0LCAweDVEMTA4QThBLAorICAgIDB4MEZFMjUxNTEsIDB4MDAwMDAwMDAsIDB4NkY5QTE5MTksIDB4OURFMDFBMUEsIDB4MzY4Rjk0OTQsIDB4NDJFNkM3QzcsCisgICAgMHg0QUVDQzlDOSwgMHg1RUZERDJEMiwgMHhDMUFCN0Y3RiwgMHhFMEQ4QThBOH0sCisKKyAgIHsweEJDNzVCQzMyLCAweEVDRjNFQzIxLCAweDIwQzYyMDQzLCAweEIzRjRCM0M5LCAweERBREJEQTAzLCAweDAyN0IwMjhCLAorICAgIDB4RTJGQkUyMkIsIDB4OUVDODlFRkEsIDB4Qzk0QUM5RUMsIDB4RDREM0Q0MDksIDB4MThFNjE4NkIsIDB4MUU2QjFFOUYsCisgICAgMHg5ODQ1OTgwRSwgMHhCMjdEQjIzOCwgMHhBNkU4QTZEMiwgMHgyNjRCMjZCNywgMHgzQ0Q2M0M1NywgMHg5MzMyOTM4QSwKKyAgICAweDgyRDg4MkVFLCAweDUyRkQ1Mjk4LCAweDdCMzc3QkQ0LCAweEJCNzFCQjM3LCAweDVCRjE1Qjk3LCAweDQ3RTE0NzgzLAorICAgIDB4MjQzMDI0M0MsIDB4NTEwRjUxRTIsIDB4QkFGOEJBQzYsIDB4NEExQjRBRjMsIDB4QkY4N0JGNDgsIDB4MERGQTBENzAsCisgICAgMHhCMDA2QjBCMywgMHg3NTNGNzVERSwgMHhEMjVFRDJGRCwgMHg3REJBN0QyMCwgMHg2NkFFNjYzMSwgMHgzQTVCM0FBMywKKyAgICAweDU5OEE1OTFDLCAweDAwMDAwMDAwLCAweENEQkNDRDkzLCAweDFBOUQxQUUwLCAweEFFNkRBRTJDLCAweDdGQzE3RkFCLAorICAgIDB4MkJCMTJCQzcsIDB4QkUwRUJFQjksIDB4RTA4MEUwQTAsIDB4OEE1RDhBMTAsIDB4M0JEMjNCNTIsIDB4NjRENTY0QkEsCisgICAgMHhEOEEwRDg4OCwgMHhFNzg0RTdBNSwgMHg1RjA3NUZFOCwgMHgxQjE0MUIxMSwgMHgyQ0I1MkNDMiwgMHhGQzkwRkNCNCwKKyAgICAweDMxMkMzMTI3LCAweDgwQTM4MDY1LCAweDczQjI3MzJBLCAweDBDNzMwQzgxLCAweDc5NEM3OTVGLCAweDZCNTQ2QjQxLAorICAgIDB4NEI5MjRCMDIsIDB4NTM3NDUzNjksIDB4OTQzNjk0OEYsIDB4ODM1MTgzMUYsIDB4MkEzODJBMzYsIDB4QzRCMEM0OUMsCisgICAgMHgyMkJEMjJDOCwgMHhENTVBRDVGOCwgMHhCREZDQkRDMywgMHg0ODYwNDg3OCwgMHhGRjYyRkZDRSwgMHg0Qzk2NEMwNywKKyAgICAweDQxNkM0MTc3LCAweEM3NDJDN0U2LCAweEVCRjdFQjI0LCAweDFDMTAxQzE0LCAweDVEN0M1RDYzLCAweDM2MjgzNjIyLAorICAgIDB4NjcyNzY3QzAsIDB4RTk4Q0U5QUYsIDB4NDQxMzQ0RjksIDB4MTQ5NTE0RUEsIDB4RjU5Q0Y1QkIsIDB4Q0ZDN0NGMTgsCisgICAgMHgzRjI0M0YyRCwgMHhDMDQ2QzBFMywgMHg3MjNCNzJEQiwgMHg1NDcwNTQ2QywgMHgyOUNBMjk0QywgMHhGMEUzRjAzNSwKKyAgICAweDA4ODUwOEZFLCAweEM2Q0JDNjE3LCAweEYzMTFGMzRGLCAweDhDRDA4Q0U0LCAweEE0OTNBNDU5LCAweENBQjhDQTk2LAorICAgIDB4NjhBNjY4M0IsIDB4Qjg4M0I4NEQsIDB4MzgyMDM4MjgsIDB4RTVGRkU1MkUsIDB4QUQ5RkFENTYsIDB4MEI3NzBCODQsCisgICAgMHhDOEMzQzgxRCwgMHg5OUNDOTlGRiwgMHg1ODAzNThFRCwgMHgxOTZGMTk5QSwgMHgwRTA4MEUwQSwgMHg5NUJGOTU3RSwKKyAgICAweDcwNDA3MDUwLCAweEY3RTdGNzMwLCAweDZFMkI2RUNGLCAweDFGRTIxRjZFLCAweEI1NzlCNTNELCAweDA5MEMwOTBGLAorICAgIDB4NjFBQTYxMzQsIDB4NTc4MjU3MTYsIDB4OUY0MTlGMEIsIDB4OUQzQTlEODAsIDB4MTFFQTExNjQsIDB4MjVCOTI1Q0QsCisgICAgMHhBRkU0QUZERCwgMHg0NTlBNDUwOCwgMHhERkE0REY4RCwgMHhBMzk3QTM1QywgMHhFQTdFRUFENSwgMHgzNURBMzU1OCwKKyAgICAweEVEN0FFREQwLCAweDQzMTc0M0ZDLCAweEY4NjZGOENCLCAweEZCOTRGQkIxLCAweDM3QTEzN0QzLCAweEZBMURGQTQwLAorICAgIDB4QzIzREMyNjgsIDB4QjRGMEI0Q0MsIDB4MzJERTMyNUQsIDB4OUNCMzlDNzEsIDB4NTYwQjU2RTcsIDB4RTM3MkUzREEsCisgICAgMHg4N0E3ODc2MCwgMHgxNTFDMTUxQiwgMHhGOUVGRjkzQSwgMHg2M0QxNjNCRiwgMHgzNDUzMzRBOSwgMHg5QTNFOUE4NSwKKyAgICAweEIxOEZCMTQyLCAweDdDMzM3Q0QxLCAweDg4MjY4ODlCLCAweDNENUYzREE2LCAweEExRUNBMUQ3LCAweEU0NzZFNERGLAorICAgIDB4ODEyQTgxOTQsIDB4OTE0OTkxMDEsIDB4MEY4MTBGRkIsIDB4RUU4OEVFQUEsIDB4MTZFRTE2NjEsIDB4RDcyMUQ3NzMsCisgICAgMHg5N0M0OTdGNSwgMHhBNTFBQTVBOCwgMHhGRUVCRkUzRiwgMHg2REQ5NkRCNSwgMHg3OEM1NzhBRSwgMHhDNTM5QzU2RCwKKyAgICAweDFEOTkxREU1LCAweDc2Q0Q3NkE0LCAweDNFQUQzRURDLCAweENCMzFDQjY3LCAweEI2OEJCNjQ3LCAweEVGMDFFRjVCLAorICAgIDB4MTIxODEyMUUsIDB4NjAyMzYwQzUsIDB4NkFERDZBQjAsIDB4NEQxRjRERjYsIDB4Q0U0RUNFRTksIDB4REUyRERFN0MsCisgICAgMHg1NUY5NTU5RCwgMHg3RTQ4N0U1QSwgMHgyMTRGMjFCMiwgMHgwM0YyMDM3QSwgMHhBMDY1QTAyNiwgMHg1RThFNUUxOSwKKyAgICAweDVBNzg1QTY2LCAweDY1NUM2NTRCLCAweDYyNTg2MjRFLCAweEZEMTlGRDQ1LCAweDA2OEQwNkY0LCAweDQwRTU0MDg2LAorICAgIDB4RjI5OEYyQkUsIDB4MzM1NzMzQUMsIDB4MTc2NzE3OTAsIDB4MDU3RjA1OEUsIDB4RTgwNUU4NUUsIDB4NEY2NDRGN0QsCisgICAgMHg4OUFGODk2QSwgMHgxMDYzMTA5NSwgMHg3NEI2NzQyRiwgMHgwQUZFMEE3NSwgMHg1Q0Y1NUM5MiwgMHg5QkI3OUI3NCwKKyAgICAweDJEM0MyRDMzLCAweDMwQTUzMEQ2LCAweDJFQ0UyRTQ5LCAweDQ5RTk0OTg5LCAweDQ2Njg0NjcyLCAweDc3NDQ3NzU1LAorICAgIDB4QThFMEE4RDgsIDB4OTY0RDk2MDQsIDB4Mjg0MzI4QkQsIDB4QTk2OUE5MjksIDB4RDkyOUQ5NzksIDB4ODYyRTg2OTEsCisgICAgMHhEMUFDRDE4NywgMHhGNDE1RjQ0QSwgMHg4RDU5OEQxNSwgMHhENkE4RDY4MiwgMHhCOTBBQjlCQywgMHg0MjlFNDIwRCwKKyAgICAweEY2NkVGNkMxLCAweDJGNDcyRkI4LCAweEREREZERDA2LCAweDIzMzQyMzM5LCAweENDMzVDQzYyLCAweEYxNkFGMUM0LAorICAgIDB4QzFDRkMxMTIsIDB4ODVEQzg1RUIsIDB4OEYyMjhGOUUsIDB4NzFDOTcxQTEsIDB4OTBDMDkwRjAsIDB4QUE5QkFBNTMsCisgICAgMHgwMTg5MDFGMSwgMHg4QkQ0OEJFMSwgMHg0RUVENEU4QywgMHg4RUFCOEU2RiwgMHhBQjEyQUJBMiwgMHg2RkEyNkYzRSwKKyAgICAweEU2MERFNjU0LCAweERCNTJEQkYyLCAweDkyQkI5MjdCLCAweEI3MDJCN0I2LCAweDY5MkY2OUNBLCAweDM5QTkzOUQ5LAorICAgIDB4RDNEN0QzMEMsIDB4QTc2MUE3MjMsIDB4QTIxRUEyQUQsIDB4QzNCNEMzOTksIDB4NkM1MDZDNDQsIDB4MDcwNDA3MDUsCisgICAgMHgwNEY2MDQ3RiwgMHgyN0MyMjc0NiwgMHhBQzE2QUNBNywgMHhEMDI1RDA3NiwgMHg1MDg2NTAxMywgMHhEQzU2RENGNywKKyAgICAweDg0NTU4NDFBLCAweEUxMDlFMTUxLCAweDdBQkU3QTI1LCAweDEzOTExM0VGfSwKKworICAgezB4RDkzOUE5RDksIDB4OTAxNzY3OTAsIDB4NzE5Q0IzNzEsIDB4RDJBNkU4RDIsIDB4MDUwNzA0MDUsIDB4OTg1MkZEOTgsCisgICAgMHg2NTgwQTM2NSwgMHhERkU0NzZERiwgMHgwODQ1OUEwOCwgMHgwMjRCOTIwMiwgMHhBMEUwODBBMCwgMHg2NjVBNzg2NiwKKyAgICAweEREQUZFNERELCAweEIwNkFEREIwLCAweEJGNjNEMUJGLCAweDM2MkEzODM2LCAweDU0RTYwRDU0LCAweDQzMjBDNjQzLAorICAgIDB4NjJDQzM1NjIsIDB4QkVGMjk4QkUsIDB4MUUxMjE4MUUsIDB4MjRFQkY3MjQsIDB4RDdBMUVDRDcsIDB4Nzc0MTZDNzcsCisgICAgMHhCRDI4NDNCRCwgMHgzMkJDNzUzMiwgMHhENDdCMzdENCwgMHg5Qjg4MjY5QiwgMHg3MDBERkE3MCwgMHhGOTQ0MTNGOSwKKyAgICAweEIxRkI5NEIxLCAweDVBN0U0ODVBLCAweDdBMDNGMjdBLCAweEU0OENEMEU0LCAweDQ3QjY4QjQ3LCAweDNDMjQzMDNDLAorICAgIDB4QTVFNzg0QTUsIDB4NDE2QjU0NDEsIDB4MDZERERGMDYsIDB4QzU2MDIzQzUsIDB4NDVGRDE5NDUsIDB4QTMzQTVCQTMsCisgICAgMHg2OEMyM0Q2OCwgMHgxNThENTkxNSwgMHgyMUVDRjMyMSwgMHgzMTY2QUUzMSwgMHgzRTZGQTIzRSwgMHgxNjU3ODIxNiwKKyAgICAweDk1MTA2Mzk1LCAweDVCRUYwMTVCLCAweDREQjg4MzRELCAweDkxODYyRTkxLCAweEI1NkREOUI1LCAweDFGODM1MTFGLAorICAgIDB4NTNBQTlCNTMsIDB4NjM1RDdDNjMsIDB4M0I2OEE2M0IsIDB4M0ZGRUVCM0YsIDB4RDYzMEE1RDYsIDB4MjU3QUJFMjUsCisgICAgMHhBN0FDMTZBNywgMHgwRjA5MEMwRiwgMHgzNUYwRTMzNSwgMHgyM0E3NjEyMywgMHhGMDkwQzBGMCwgMHhBRkU5OENBRiwKKyAgICAweDgwOUQzQTgwLCAweDkyNUNGNTkyLCAweDgxMEM3MzgxLCAweDI3MzEyQzI3LCAweDc2RDAyNTc2LCAweEU3NTYwQkU3LAorICAgIDB4N0I5MkJCN0IsIDB4RTlDRTRFRTksIDB4RjEwMTg5RjEsIDB4OUYxRTZCOUYsIDB4QTkzNDUzQTksIDB4QzRGMTZBQzQsCisgICAgMHg5OUMzQjQ5OSwgMHg5NzVCRjE5NywgMHg4MzQ3RTE4MywgMHg2QjE4RTY2QiwgMHhDODIyQkRDOCwgMHgwRTk4NDUwRSwKKyAgICAweDZFMUZFMjZFLCAweEM5QjNGNEM5LCAweDJGNzRCNjJGLCAweENCRjg2NkNCLCAweEZGOTlDQ0ZGLCAweEVBMTQ5NUVBLAorICAgIDB4RUQ1ODAzRUQsIDB4RjdEQzU2RjcsIDB4RTE4QkQ0RTEsIDB4MUIxNTFDMUIsIDB4QURBMjFFQUQsIDB4MENEM0Q3MEMsCisgICAgMHgyQkUyRkIyQiwgMHgxREM4QzMxRCwgMHgxOTVFOEUxOSwgMHhDMjJDQjVDMiwgMHg4OTQ5RTk4OSwgMHgxMkMxQ0YxMiwKKyAgICAweDdFOTVCRjdFLCAweDIwN0RCQTIwLCAweDY0MTFFQTY0LCAweDg0MEI3Nzg0LCAweDZEQzUzOTZELCAweDZBODlBRjZBLAorICAgIDB4RDE3QzMzRDEsIDB4QTE3MUM5QTEsIDB4Q0VGRjYyQ0UsIDB4MzdCQjcxMzcsIDB4RkIwRjgxRkIsIDB4M0RCNTc5M0QsCisgICAgMHg1MUUxMDk1MSwgMHhEQzNFQUREQywgMHgyRDNGMjQyRCwgMHhBNDc2Q0RBNCwgMHg5RDU1Rjk5RCwgMHhFRTgyRDhFRSwKKyAgICAweDg2NDBFNTg2LCAweEFFNzhDNUFFLCAweENEMjVCOUNELCAweDA0OTY0RDA0LCAweDU1Nzc0NDU1LCAweDBBMEUwODBBLAorICAgIDB4MTM1MDg2MTMsIDB4MzBGN0U3MzAsIDB4RDMzN0ExRDMsIDB4NDBGQTFENDAsIDB4MzQ2MUFBMzQsIDB4OEM0RUVEOEMsCisgICAgMHhCM0IwMDZCMywgMHg2QzU0NzA2QywgMHgyQTczQjIyQSwgMHg1MjNCRDI1MiwgMHgwQjlGNDEwQiwgMHg4QjAyN0I4QiwKKyAgICAweDg4RDhBMDg4LCAweDRGRjMxMTRGLCAweDY3Q0IzMTY3LCAweDQ2MjdDMjQ2LCAweEMwNjcyN0MwLCAweEI0RkM5MEI0LAorICAgIDB4MjgzODIwMjgsIDB4N0YwNEY2N0YsIDB4Nzg0ODYwNzgsIDB4MkVFNUZGMkUsIDB4MDc0Qzk2MDcsIDB4NEI2NTVDNEIsCisgICAgMHhDNzJCQjFDNywgMHg2RjhFQUI2RiwgMHgwRDQyOUUwRCwgMHhCQkY1OUNCQiwgMHhGMkRCNTJGMiwgMHhGMzRBMUJGMywKKyAgICAweEE2M0Q1RkE2LCAweDU5QTQ5MzU5LCAweEJDQjkwQUJDLCAweDNBRjlFRjNBLCAweEVGMTM5MUVGLCAweEZFMDg4NUZFLAorICAgIDB4MDE5MTQ5MDEsIDB4NjExNkVFNjEsIDB4N0NERTJEN0MsIDB4QjIyMTRGQjIsIDB4NDJCMThGNDIsIDB4REI3MjNCREIsCisgICAgMHhCODJGNDdCOCwgMHg0OEJGODc0OCwgMHgyQ0FFNkQyQywgMHhFM0MwNDZFMywgMHg1NzNDRDY1NywgMHg4NTlBM0U4NSwKKyAgICAweDI5QTk2OTI5LCAweDdENEY2NDdELCAweDk0ODEyQTk0LCAweDQ5MkVDRTQ5LCAweDE3QzZDQjE3LCAweENBNjkyRkNBLAorICAgIDB4QzNCREZDQzMsIDB4NUNBMzk3NUMsIDB4NUVFODA1NUUsIDB4RDBFRDdBRDAsIDB4ODdEMUFDODcsIDB4OEUwNTdGOEUsCisgICAgMHhCQTY0RDVCQSwgMHhBOEE1MUFBOCwgMHhCNzI2NEJCNywgMHhCOUJFMEVCOSwgMHg2MDg3QTc2MCwgMHhGOEQ1NUFGOCwKKyAgICAweDIyMzYyODIyLCAweDExMUIxNDExLCAweERFNzUzRkRFLCAweDc5RDkyOTc5LCAweEFBRUU4OEFBLCAweDMzMkQzQzMzLAorICAgIDB4NUY3OTRDNUYsIDB4QjZCNzAyQjYsIDB4OTZDQUI4OTYsIDB4NTgzNURBNTgsIDB4OUNDNEIwOUMsIDB4RkM0MzE3RkMsCisgICAgMHgxQTg0NTUxQSwgMHhGNjREMUZGNiwgMHgxQzU5OEExQywgMHgzOEIyN0QzOCwgMHhBQzMzNTdBQywgMHgxOENGQzcxOCwKKyAgICAweEY0MDY4REY0LCAweDY5NTM3NDY5LCAweDc0OUJCNzc0LCAweEY1OTdDNEY1LCAweDU2QUQ5RjU2LCAweERBRTM3MkRBLAorICAgIDB4RDVFQTdFRDUsIDB4NEFGNDE1NEEsIDB4OUU4RjIyOUUsIDB4QTJBQjEyQTIsIDB4NEU2MjU4NEUsIDB4RTg1RjA3RTgsCisgICAgMHhFNTFEOTlFNSwgMHgzOTIzMzQzOSwgMHhDMUY2NkVDMSwgMHg0NDZDNTA0NCwgMHg1RDMyREU1RCwgMHg3MjQ2Njg3MiwKKyAgICAweDI2QTA2NTI2LCAweDkzQ0RCQzkzLCAweDAzREFEQjAzLCAweEM2QkFGOEM2LCAweEZBOUVDOEZBLCAweDgyRDZBODgyLAorICAgIDB4Q0Y2RTJCQ0YsIDB4NTA3MDQwNTAsIDB4RUI4NURDRUIsIDB4NzUwQUZFNzUsIDB4OEE5MzMyOEEsIDB4OERERkE0OEQsCisgICAgMHg0QzI5Q0E0QywgMHgxNDFDMTAxNCwgMHg3M0Q3MjE3MywgMHhDQ0I0RjBDQywgMHgwOUQ0RDMwOSwgMHgxMDhBNUQxMCwKKyAgICAweEUyNTEwRkUyLCAweDAwMDAwMDAwLCAweDlBMTk2RjlBLCAweEUwMUE5REUwLCAweDhGOTQzNjhGLCAweEU2Qzc0MkU2LAorICAgIDB4RUNDOTRBRUMsIDB4RkREMjVFRkQsIDB4QUI3RkMxQUIsIDB4RDhBOEUwRDh9Cit9OworDAorLyogVGhlIGV4cF90b19wb2x5IGFuZCBwb2x5X3RvX2V4cCB0YWJsZXMgYXJlIHVzZWQgdG8gcGVyZm9ybSBlZmZpY2llbnQKKyAqIG9wZXJhdGlvbnMgaW4gR0YoMl44KSByZXByZXNlbnRlZCBhcyBHRigyKVt4XS93KHgpIHdoZXJlCisgKiB3KHgpPXheOCt4XjYreF4zK3heMisxLiAgV2UgY2FyZSBhYm91dCBkb2luZyB0aGF0IGJlY2F1c2UgaXQncyBwYXJ0IG9mIHRoZQorICogZGVmaW5pdGlvbiBvZiB0aGUgUlMgbWF0cml4IGluIHRoZSBrZXkgc2NoZWR1bGUuICBFbGVtZW50cyBvZiB0aGF0IGZpZWxkCisgKiBhcmUgcG9seW5vbWlhbHMgb2YgZGVncmVlIG5vdCBncmVhdGVyIHRoYW4gNyBhbmQgYWxsIGNvZWZmaWNpZW50cyAwIG9yIDEsCisgKiB3aGljaCBjYW4gYmUgcmVwcmVzZW50ZWQgbmF0dXJhbGx5IGJ5IGJ5dGVzIChqdXN0IHN1YnN0aXR1dGUgeD0yKS4gIEluIHRoYXQKKyAqIGZvcm0sIEdGKDJeOCkgYWRkaXRpb24gaXMgdGhlIHNhbWUgYXMgYml0d2lzZSBYT1IsIGJ1dCBHRigyXjgpCisgKiBtdWx0aXBsaWNhdGlvbiBpcyBpbmVmZmljaWVudCB3aXRob3V0IGhhcmR3YXJlIHN1cHBvcnQuICBUbyBtdWx0aXBseQorICogZmFzdGVyLCBJIG1ha2UgdXNlIG9mIHRoZSBmYWN0IHggaXMgYSBnZW5lcmF0b3IgZm9yIHRoZSBub256ZXJvIGVsZW1lbnRzLAorICogc28gdGhhdCBldmVyeSBlbGVtZW50IHAgb2YgR0YoMilbeF0vdyh4KSBpcyBlaXRoZXIgMCBvciBlcXVhbCB0byAoeClebiBmb3IKKyAqIHNvbWUgbiBpbiAwLi4yNTQuICBOb3RlIHRoYXQgdGhhdCBjYXJldCBpcyBleHBvbmVudGlhdGlvbiBpbiBHRigyXjgpLAorICogKm5vdCogcG9seW5vbWlhbCBub3RhdGlvbi4gIFNvIGlmIEkgd2FudCB0byBjb21wdXRlIHBxIHdoZXJlIHAgYW5kIHEgYXJlCisgKiBpbiBHRigyXjgpLCBJIGNhbiBqdXN0IHNheToKKyAqICAgIDEuIGlmIHA9MCBvciBxPTAgdGhlbiBwcT0wCisgKiAgICAyLiBvdGhlcndpc2UsIGZpbmQgbSBhbmQgbiBzdWNoIHRoYXQgcD14Xm0gYW5kIHE9eF5uCisgKiAgICAzLiBwcT0oeF5tKSh4Xm4pPXheKG0rbiksIHNvIGFkZCBtIGFuZCBuIGFuZCBmaW5kIHBxCisgKiBUaGUgdHJhbnNsYXRpb25zIGluIHN0ZXBzIDIgYW5kIDMgYXJlIGxvb2tlZCB1cCBpbiB0aGUgdGFibGVzCisgKiBwb2x5X3RvX2V4cCAoZm9yIHN0ZXAgMikgYW5kIGV4cF90b19wb2x5IChmb3Igc3RlcCAzKS4gIFRvIHNlZSB0aGlzCisgKiBpbiBhY3Rpb24sIGxvb2sgYXQgdGhlIENBTENfUyBtYWNyby4gIEFzIGFkZGl0aW9uYWwgd3JpbmtsZXMsIG5vdGUgdGhhdAorICogb25lIG9mIG15IG9wZXJhbmRzIGlzIGFsd2F5cyBhIGNvbnN0YW50LCBzbyB0aGUgcG9seV90b19leHAgbG9va3VwIG9uIGl0CisgKiBpcyBkb25lIGluIGFkdmFuY2U7IEkgaW5jbHVkZWQgdGhlIG9yaWdpbmFsIHZhbHVlcyBpbiB0aGUgY29tbWVudHMgc28KKyAqIHJlYWRlcnMgY2FuIGhhdmUgc29tZSBjaGFuY2Ugb2YgcmVjb2duaXppbmcgdGhhdCB0aGlzICppcyogdGhlIFJTIG1hdHJpeAorICogZnJvbSB0aGUgVHdvZmlzaCBwYXBlci4gIEkndmUgb25seSBpbmNsdWRlZCB0aGUgdGFibGUgZW50cmllcyBJIGFjdHVhbGx5CisgKiBuZWVkOyBJIG5ldmVyIGRvIGEgbG9va3VwIG9uIGEgdmFyaWFibGUgaW5wdXQgb2YgemVybyBhbmQgdGhlIGJpZ2dlc3QKKyAqIGV4cG9uZW50cyBJJ2xsIGV2ZXIgc2VlIGFyZSAyNTQgKHZhcmlhYmxlKSBhbmQgMjM3IChjb25zdGFudCksIHNvIHRoZXknbGwKKyAqIG5ldmVyIHN1bSB0byBtb3JlIHRoYW4gNDkxLglJJ20gcmVwZWF0aW5nIHBhcnQgb2YgdGhlIGV4cF90b19wb2x5IHRhYmxlCisgKiBzbyB0aGF0IEkgZG9uJ3QgaGF2ZSB0byBkbyBtb2QtMjU1IHJlZHVjdGlvbiBpbiB0aGUgZXhwb25lbnQgYXJpdGhtZXRpYy4KKyAqIFNpbmNlIEkga25vdyBteSBjb25zdGFudCBvcGVyYW5kcyBhcmUgbmV2ZXIgemVybywgSSBvbmx5IGhhdmUgdG8gd29ycnkKKyAqIGFib3V0IHplcm8gdmFsdWVzIGluIHRoZSB2YXJpYWJsZSBvcGVyYW5kLCBhbmQgSSBkbyBpdCB3aXRoIGEgc2ltcGxlCisgKiBjb25kaXRpb25hbCBicmFuY2guCUkga25vdyBjb25kaXRpb25hbHMgYXJlIGV4cGVuc2l2ZSwgYnV0IEkgY291bGRuJ3QKKyAqIHNlZSBhIG5vbi1ob3JyaWJsZSB3YXkgb2YgYXZvaWRpbmcgdGhlbSwgYW5kIEkgZGlkIG1hbmFnZSB0byBncm91cCB0aGUKKyAqIHN0YXRlbWVudHMgc28gdGhhdCBlYWNoIGlmIGNvdmVycyBmb3VyIGdyb3VwIG11bHRpcGxpY2F0aW9ucy4gKi8KKworc3RhdGljIGNvbnN0IGJ5dGUgcG9seV90b19leHBbMjU1XSA9IHsKKyAgIDB4MDAsIDB4MDEsIDB4MTcsIDB4MDIsIDB4MkUsIDB4MTgsIDB4NTMsIDB4MDMsIDB4NkEsIDB4MkYsIDB4OTMsIDB4MTksCisgICAweDM0LCAweDU0LCAweDQ1LCAweDA0LCAweDVDLCAweDZCLCAweEI2LCAweDMwLCAweEE2LCAweDk0LCAweDRCLCAweDFBLAorICAgMHg4QywgMHgzNSwgMHg4MSwgMHg1NSwgMHhBQSwgMHg0NiwgMHgwRCwgMHgwNSwgMHgyNCwgMHg1RCwgMHg4NywgMHg2QywKKyAgIDB4OUIsIDB4QjcsIDB4QzEsIDB4MzEsIDB4MkIsIDB4QTcsIDB4QTMsIDB4OTUsIDB4OTgsIDB4NEMsIDB4Q0EsIDB4MUIsCisgICAweEU2LCAweDhELCAweDczLCAweDM2LCAweENELCAweDgyLCAweDEyLCAweDU2LCAweDYyLCAweEFCLCAweEYwLCAweDQ3LAorICAgMHg0RiwgMHgwRSwgMHhCRCwgMHgwNiwgMHhENCwgMHgyNSwgMHhEMiwgMHg1RSwgMHgyNywgMHg4OCwgMHg2NiwgMHg2RCwKKyAgIDB4RDYsIDB4OUMsIDB4NzksIDB4QjgsIDB4MDgsIDB4QzIsIDB4REYsIDB4MzIsIDB4NjgsIDB4MkMsIDB4RkQsIDB4QTgsCisgICAweDhBLCAweEE0LCAweDVBLCAweDk2LCAweDI5LCAweDk5LCAweDIyLCAweDRELCAweDYwLCAweENCLCAweEU0LCAweDFDLAorICAgMHg3QiwgMHhFNywgMHgzQiwgMHg4RSwgMHg5RSwgMHg3NCwgMHhGNCwgMHgzNywgMHhEOCwgMHhDRSwgMHhGOSwgMHg4MywKKyAgIDB4NkYsIDB4MTMsIDB4QjIsIDB4NTcsIDB4RTEsIDB4NjMsIDB4REMsIDB4QUMsIDB4QzQsIDB4RjEsIDB4QUYsIDB4NDgsCisgICAweDBBLCAweDUwLCAweDQyLCAweDBGLCAweEJBLCAweEJFLCAweEM3LCAweDA3LCAweERFLCAweEQ1LCAweDc4LCAweDI2LAorICAgMHg2NSwgMHhEMywgMHhEMSwgMHg1RiwgMHhFMywgMHgyOCwgMHgyMSwgMHg4OSwgMHg1OSwgMHg2NywgMHhGQywgMHg2RSwKKyAgIDB4QjEsIDB4RDcsIDB4RjgsIDB4OUQsIDB4RjMsIDB4N0EsIDB4M0EsIDB4QjksIDB4QzYsIDB4MDksIDB4NDEsIDB4QzMsCisgICAweEFFLCAweEUwLCAweERCLCAweDMzLCAweDQ0LCAweDY5LCAweDkyLCAweDJELCAweDUyLCAweEZFLCAweDE2LCAweEE5LAorICAgMHgwQywgMHg4QiwgMHg4MCwgMHhBNSwgMHg0QSwgMHg1QiwgMHhCNSwgMHg5NywgMHhDOSwgMHgyQSwgMHhBMiwgMHg5QSwKKyAgIDB4QzAsIDB4MjMsIDB4ODYsIDB4NEUsIDB4QkMsIDB4NjEsIDB4RUYsIDB4Q0MsIDB4MTEsIDB4RTUsIDB4NzIsIDB4MUQsCisgICAweDNELCAweDdDLCAweEVCLCAweEU4LCAweEU5LCAweDNDLCAweEVBLCAweDhGLCAweDdELCAweDlGLCAweEVDLCAweDc1LAorICAgMHgxRSwgMHhGNSwgMHgzRSwgMHgzOCwgMHhGNiwgMHhEOSwgMHgzRiwgMHhDRiwgMHg3NiwgMHhGQSwgMHgxRiwgMHg4NCwKKyAgIDB4QTAsIDB4NzAsIDB4RUQsIDB4MTQsIDB4OTAsIDB4QjMsIDB4N0UsIDB4NTgsIDB4RkIsIDB4RTIsIDB4MjAsIDB4NjQsCisgICAweEQwLCAweERELCAweDc3LCAweEFELCAweERBLCAweEM1LCAweDQwLCAweEYyLCAweDM5LCAweEIwLCAweEY3LCAweDQ5LAorICAgMHhCNCwgMHgwQiwgMHg3RiwgMHg1MSwgMHgxNSwgMHg0MywgMHg5MSwgMHgxMCwgMHg3MSwgMHhCQiwgMHhFRSwgMHhCRiwKKyAgIDB4ODUsIDB4QzgsIDB4QTEKK307CisKK3N0YXRpYyBjb25zdCBieXRlIGV4cF90b19wb2x5WzQ5Ml0gPSB7CisgICAweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwLCAweDRELCAweDlBLCAweDc5LCAweEYyLAorICAgMHhBOSwgMHgxRiwgMHgzRSwgMHg3QywgMHhGOCwgMHhCRCwgMHgzNywgMHg2RSwgMHhEQywgMHhGNSwgMHhBNywgMHgwMywKKyAgIDB4MDYsIDB4MEMsIDB4MTgsIDB4MzAsIDB4NjAsIDB4QzAsIDB4Q0QsIDB4RDcsIDB4RTMsIDB4OEIsIDB4NUIsIDB4QjYsCisgICAweDIxLCAweDQyLCAweDg0LCAweDQ1LCAweDhBLCAweDU5LCAweEIyLCAweDI5LCAweDUyLCAweEE0LCAweDA1LCAweDBBLAorICAgMHgxNCwgMHgyOCwgMHg1MCwgMHhBMCwgMHgwRCwgMHgxQSwgMHgzNCwgMHg2OCwgMHhEMCwgMHhFRCwgMHg5NywgMHg2MywKKyAgIDB4QzYsIDB4QzEsIDB4Q0YsIDB4RDMsIDB4RUIsIDB4OUIsIDB4N0IsIDB4RjYsIDB4QTEsIDB4MEYsIDB4MUUsIDB4M0MsCisgICAweDc4LCAweEYwLCAweEFELCAweDE3LCAweDJFLCAweDVDLCAweEI4LCAweDNELCAweDdBLCAweEY0LCAweEE1LCAweDA3LAorICAgMHgwRSwgMHgxQywgMHgzOCwgMHg3MCwgMHhFMCwgMHg4RCwgMHg1NywgMHhBRSwgMHgxMSwgMHgyMiwgMHg0NCwgMHg4OCwKKyAgIDB4NUQsIDB4QkEsIDB4MzksIDB4NzIsIDB4RTQsIDB4ODUsIDB4NDcsIDB4OEUsIDB4NTEsIDB4QTIsIDB4MDksIDB4MTIsCisgICAweDI0LCAweDQ4LCAweDkwLCAweDZELCAweERBLCAweEY5LCAweEJGLCAweDMzLCAweDY2LCAweENDLCAweEQ1LCAweEU3LAorICAgMHg4MywgMHg0QiwgMHg5NiwgMHg2MSwgMHhDMiwgMHhDOSwgMHhERiwgMHhGMywgMHhBQiwgMHgxQiwgMHgzNiwgMHg2QywKKyAgIDB4RDgsIDB4RkQsIDB4QjcsIDB4MjMsIDB4NDYsIDB4OEMsIDB4NTUsIDB4QUEsIDB4MTksIDB4MzIsIDB4NjQsIDB4QzgsCisgICAweERELCAweEY3LCAweEEzLCAweDBCLCAweDE2LCAweDJDLCAweDU4LCAweEIwLCAweDJELCAweDVBLCAweEI0LCAweDI1LAorICAgMHg0QSwgMHg5NCwgMHg2NSwgMHhDQSwgMHhEOSwgMHhGRiwgMHhCMywgMHgyQiwgMHg1NiwgMHhBQywgMHgxNSwgMHgyQSwKKyAgIDB4NTQsIDB4QTgsIDB4MUQsIDB4M0EsIDB4NzQsIDB4RTgsIDB4OUQsIDB4NzcsIDB4RUUsIDB4OTEsIDB4NkYsIDB4REUsCisgICAweEYxLCAweEFGLCAweDEzLCAweDI2LCAweDRDLCAweDk4LCAweDdELCAweEZBLCAweEI5LCAweDNGLCAweDdFLCAweEZDLAorICAgMHhCNSwgMHgyNywgMHg0RSwgMHg5QywgMHg3NSwgMHhFQSwgMHg5OSwgMHg3RiwgMHhGRSwgMHhCMSwgMHgyRiwgMHg1RSwKKyAgIDB4QkMsIDB4MzUsIDB4NkEsIDB4RDQsIDB4RTUsIDB4ODcsIDB4NDMsIDB4ODYsIDB4NDEsIDB4ODIsIDB4NDksIDB4OTIsCisgICAweDY5LCAweEQyLCAweEU5LCAweDlGLCAweDczLCAweEU2LCAweDgxLCAweDRGLCAweDlFLCAweDcxLCAweEUyLCAweDg5LAorICAgMHg1RiwgMHhCRSwgMHgzMSwgMHg2MiwgMHhDNCwgMHhDNSwgMHhDNywgMHhDMywgMHhDQiwgMHhEQiwgMHhGQiwgMHhCQiwKKyAgIDB4M0IsIDB4NzYsIDB4RUMsIDB4OTUsIDB4NjcsIDB4Q0UsIDB4RDEsIDB4RUYsIDB4OTMsIDB4NkIsIDB4RDYsIDB4RTEsCisgICAweDhGLCAweDUzLCAweEE2LCAweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwLCAweDRELAorICAgMHg5QSwgMHg3OSwgMHhGMiwgMHhBOSwgMHgxRiwgMHgzRSwgMHg3QywgMHhGOCwgMHhCRCwgMHgzNywgMHg2RSwgMHhEQywKKyAgIDB4RjUsIDB4QTcsIDB4MDMsIDB4MDYsIDB4MEMsIDB4MTgsIDB4MzAsIDB4NjAsIDB4QzAsIDB4Q0QsIDB4RDcsIDB4RTMsCisgICAweDhCLCAweDVCLCAweEI2LCAweDIxLCAweDQyLCAweDg0LCAweDQ1LCAweDhBLCAweDU5LCAweEIyLCAweDI5LCAweDUyLAorICAgMHhBNCwgMHgwNSwgMHgwQSwgMHgxNCwgMHgyOCwgMHg1MCwgMHhBMCwgMHgwRCwgMHgxQSwgMHgzNCwgMHg2OCwgMHhEMCwKKyAgIDB4RUQsIDB4OTcsIDB4NjMsIDB4QzYsIDB4QzEsIDB4Q0YsIDB4RDMsIDB4RUIsIDB4OUIsIDB4N0IsIDB4RjYsIDB4QTEsCisgICAweDBGLCAweDFFLCAweDNDLCAweDc4LCAweEYwLCAweEFELCAweDE3LCAweDJFLCAweDVDLCAweEI4LCAweDNELCAweDdBLAorICAgMHhGNCwgMHhBNSwgMHgwNywgMHgwRSwgMHgxQywgMHgzOCwgMHg3MCwgMHhFMCwgMHg4RCwgMHg1NywgMHhBRSwgMHgxMSwKKyAgIDB4MjIsIDB4NDQsIDB4ODgsIDB4NUQsIDB4QkEsIDB4MzksIDB4NzIsIDB4RTQsIDB4ODUsIDB4NDcsIDB4OEUsIDB4NTEsCisgICAweEEyLCAweDA5LCAweDEyLCAweDI0LCAweDQ4LCAweDkwLCAweDZELCAweERBLCAweEY5LCAweEJGLCAweDMzLCAweDY2LAorICAgMHhDQywgMHhENSwgMHhFNywgMHg4MywgMHg0QiwgMHg5NiwgMHg2MSwgMHhDMiwgMHhDOSwgMHhERiwgMHhGMywgMHhBQiwKKyAgIDB4MUIsIDB4MzYsIDB4NkMsIDB4RDgsIDB4RkQsIDB4QjcsIDB4MjMsIDB4NDYsIDB4OEMsIDB4NTUsIDB4QUEsIDB4MTksCisgICAweDMyLCAweDY0LCAweEM4LCAweERELCAweEY3LCAweEEzLCAweDBCLCAweDE2LCAweDJDLCAweDU4LCAweEIwLCAweDJELAorICAgMHg1QSwgMHhCNCwgMHgyNSwgMHg0QSwgMHg5NCwgMHg2NSwgMHhDQSwgMHhEOSwgMHhGRiwgMHhCMywgMHgyQiwgMHg1NiwKKyAgIDB4QUMsIDB4MTUsIDB4MkEsIDB4NTQsIDB4QTgsIDB4MUQsIDB4M0EsIDB4NzQsIDB4RTgsIDB4OUQsIDB4NzcsIDB4RUUsCisgICAweDkxLCAweDZGLCAweERFLCAweEYxLCAweEFGLCAweDEzLCAweDI2LCAweDRDLCAweDk4LCAweDdELCAweEZBLCAweEI5LAorICAgMHgzRiwgMHg3RSwgMHhGQywgMHhCNSwgMHgyNywgMHg0RSwgMHg5QywgMHg3NSwgMHhFQSwgMHg5OSwgMHg3RiwgMHhGRSwKKyAgIDB4QjEsIDB4MkYsIDB4NUUsIDB4QkMsIDB4MzUsIDB4NkEsIDB4RDQsIDB4RTUsIDB4ODcsIDB4NDMsIDB4ODYsIDB4NDEsCisgICAweDgyLCAweDQ5LCAweDkyLCAweDY5LCAweEQyLCAweEU5LCAweDlGLCAweDczLCAweEU2LCAweDgxLCAweDRGLCAweDlFLAorICAgMHg3MSwgMHhFMiwgMHg4OSwgMHg1RiwgMHhCRSwgMHgzMSwgMHg2MiwgMHhDNCwgMHhDNSwgMHhDNywgMHhDMywgMHhDQgorfTsKKwwKKworLyogVGhlIHRhYmxlIGNvbnN0YW50cyBhcmUgaW5kaWNlcyBvZgorICogUy1ib3ggZW50cmllcywgcHJlcHJvY2Vzc2VkIHRocm91Z2ggcTAgYW5kIHExLiAqLworc3RhdGljIGJ5dGUgY2FsY19zYl90YmxbNTEyXSA9IHsKKyAgICAweEE5LCAweDc1LCAweDY3LCAweEYzLCAweEIzLCAweEM2LCAweEU4LCAweEY0LAorICAgIDB4MDQsIDB4REIsIDB4RkQsIDB4N0IsIDB4QTMsIDB4RkIsIDB4NzYsIDB4QzgsCisgICAgMHg5QSwgMHg0QSwgMHg5MiwgMHhEMywgMHg4MCwgMHhFNiwgMHg3OCwgMHg2QiwKKyAgICAweEU0LCAweDQ1LCAweERELCAweDdELCAweEQxLCAweEU4LCAweDM4LCAweDRCLAorICAgIDB4MEQsIDB4RDYsIDB4QzYsIDB4MzIsIDB4MzUsIDB4RDgsIDB4OTgsIDB4RkQsCisgICAgMHgxOCwgMHgzNywgMHhGNywgMHg3MSwgMHhFQywgMHhGMSwgMHg2QywgMHhFMSwKKyAgICAweDQzLCAweDMwLCAweDc1LCAweDBGLCAweDM3LCAweEY4LCAweDI2LCAweDFCLAorICAgIDB4RkEsIDB4ODcsIDB4MTMsIDB4RkEsIDB4OTQsIDB4MDYsIDB4NDgsIDB4M0YsCisgICAgMHhGMiwgMHg1RSwgMHhEMCwgMHhCQSwgMHg4QiwgMHhBRSwgMHgzMCwgMHg1QiwKKyAgICAweDg0LCAweDhBLCAweDU0LCAweDAwLCAweERGLCAweEJDLCAweDIzLCAweDlELAorICAgIDB4MTksIDB4NkQsIDB4NUIsIDB4QzEsIDB4M0QsIDB4QjEsIDB4NTksIDB4MEUsCisgICAgMHhGMywgMHg4MCwgMHhBRSwgMHg1RCwgMHhBMiwgMHhEMiwgMHg4MiwgMHhENSwKKyAgICAweDYzLCAweEEwLCAweDAxLCAweDg0LCAweDgzLCAweDA3LCAweDJFLCAweDE0LAorICAgIDB4RDksIDB4QjUsIDB4NTEsIDB4OTAsIDB4OUIsIDB4MkMsIDB4N0MsIDB4QTMsCisgICAgMHhBNiwgMHhCMiwgMHhFQiwgMHg3MywgMHhBNSwgMHg0QywgMHhCRSwgMHg1NCwKKyAgICAweDE2LCAweDkyLCAweDBDLCAweDc0LCAweEUzLCAweDM2LCAweDYxLCAweDUxLAorICAgIDB4QzAsIDB4MzgsIDB4OEMsIDB4QjAsIDB4M0EsIDB4QkQsIDB4RjUsIDB4NUEsCisgICAgMHg3MywgMHhGQywgMHgyQywgMHg2MCwgMHgyNSwgMHg2MiwgMHgwQiwgMHg5NiwKKyAgICAweEJCLCAweDZDLCAweDRFLCAweDQyLCAweDg5LCAweEY3LCAweDZCLCAweDEwLAorICAgIDB4NTMsIDB4N0MsIDB4NkEsIDB4MjgsIDB4QjQsIDB4MjcsIDB4RjEsIDB4OEMsCisgICAgMHhFMSwgMHgxMywgMHhFNiwgMHg5NSwgMHhCRCwgMHg5QywgMHg0NSwgMHhDNywKKyAgICAweEUyLCAweDI0LCAweEY0LCAweDQ2LCAweEI2LCAweDNCLCAweDY2LCAweDcwLAorICAgIDB4Q0MsIDB4Q0EsIDB4OTUsIDB4RTMsIDB4MDMsIDB4ODUsIDB4NTYsIDB4Q0IsCisgICAgMHhENCwgMHgxMSwgMHgxQywgMHhEMCwgMHgxRSwgMHg5MywgMHhENywgMHhCOCwKKyAgICAweEZCLCAweEE2LCAweEMzLCAweDgzLCAweDhFLCAweDIwLCAweEI1LCAweEZGLAorICAgIDB4RTksIDB4OUYsIDB4Q0YsIDB4NzcsIDB4QkYsIDB4QzMsIDB4QkEsIDB4Q0MsCisgICAgMHhFQSwgMHgwMywgMHg3NywgMHg2RiwgMHgzOSwgMHgwOCwgMHhBRiwgMHhCRiwKKyAgICAweDMzLCAweDQwLCAweEM5LCAweEU3LCAweDYyLCAweDJCLCAweDcxLCAweEUyLAorICAgIDB4ODEsIDB4NzksIDB4NzksIDB4MEMsIDB4MDksIDB4QUEsIDB4QUQsIDB4ODIsCisgICAgMHgyNCwgMHg0MSwgMHhDRCwgMHgzQSwgMHhGOSwgMHhFQSwgMHhEOCwgMHhCOSwKKyAgICAweEU1LCAweEU0LCAweEM1LCAweDlBLCAweEI5LCAweEE0LCAweDRELCAweDk3LAorICAgIDB4NDQsIDB4N0UsIDB4MDgsIDB4REEsIDB4ODYsIDB4N0EsIDB4RTcsIDB4MTcsCisgICAgMHhBMSwgMHg2NiwgMHgxRCwgMHg5NCwgMHhBQSwgMHhBMSwgMHhFRCwgMHgxRCwKKyAgICAweDA2LCAweDNELCAweDcwLCAweEYwLCAweEIyLCAweERFLCAweEQyLCAweEIzLAorICAgIDB4NDEsIDB4MEIsIDB4N0IsIDB4NzIsIDB4QTAsIDB4QTcsIDB4MTEsIDB4MUMsCisgICAgMHgzMSwgMHhFRiwgMHhDMiwgMHhEMSwgMHgyNywgMHg1MywgMHg5MCwgMHgzRSwKKyAgICAweDIwLCAweDhGLCAweEY2LCAweDMzLCAweDYwLCAweDI2LCAweEZGLCAweDVGLAorICAgIDB4OTYsIDB4RUMsIDB4NUMsIDB4NzYsIDB4QjEsIDB4MkEsIDB4QUIsIDB4NDksCisgICAgMHg5RSwgMHg4MSwgMHg5QywgMHg4OCwgMHg1MiwgMHhFRSwgMHgxQiwgMHgyMSwKKyAgICAweDVGLCAweEM0LCAweDkzLCAweDFBLCAweDBBLCAweEVCLCAweEVGLCAweEQ5LAorICAgIDB4OTEsIDB4QzUsIDB4ODUsIDB4MzksIDB4NDksIDB4OTksIDB4RUUsIDB4Q0QsCisgICAgMHgyRCwgMHhBRCwgMHg0RiwgMHgzMSwgMHg4RiwgMHg4QiwgMHgzQiwgMHgwMSwKKyAgICAweDQ3LCAweDE4LCAweDg3LCAweDIzLCAweDZELCAweERELCAweDQ2LCAweDFGLAorICAgIDB4RDYsIDB4NEUsIDB4M0UsIDB4MkQsIDB4NjksIDB4RjksIDB4NjQsIDB4NDgsCisgICAgMHgyQSwgMHg0RiwgMHhDRSwgMHhGMiwgMHhDQiwgMHg2NSwgMHgyRiwgMHg4RSwKKyAgICAweEZDLCAweDc4LCAweDk3LCAweDVDLCAweDA1LCAweDU4LCAweDdBLCAweDE5LAorICAgIDB4QUMsIDB4OEQsIDB4N0YsIDB4RTUsIDB4RDUsIDB4OTgsIDB4MUEsIDB4NTcsCisgICAgMHg0QiwgMHg2NywgMHgwRSwgMHg3RiwgMHhBNywgMHgwNSwgMHg1QSwgMHg2NCwKKyAgICAweDI4LCAweEFGLCAweDE0LCAweDYzLCAweDNGLCAweEI2LCAweDI5LCAweEZFLAorICAgIDB4ODgsIDB4RjUsIDB4M0MsIDB4QjcsIDB4NEMsIDB4M0MsIDB4MDIsIDB4QTUsCisgICAgMHhCOCwgMHhDRSwgMHhEQSwgMHhFOSwgMHhCMCwgMHg2OCwgMHgxNywgMHg0NCwKKyAgICAweDU1LCAweEUwLCAweDFGLCAweDRELCAweDhBLCAweDQzLCAweDdELCAweDY5LAorICAgIDB4NTcsIDB4MjksIDB4QzcsIDB4MkUsIDB4OEQsIDB4QUMsIDB4NzQsIDB4MTUsCisgICAgMHhCNywgMHg1OSwgMHhDNCwgMHhBOCwgMHg5RiwgMHgwQSwgMHg3MiwgMHg5RSwKKyAgICAweDdFLCAweDZFLCAweDE1LCAweDQ3LCAweDIyLCAweERGLCAweDEyLCAweDM0LAorICAgIDB4NTgsIDB4MzUsIDB4MDcsIDB4NkEsIDB4OTksIDB4Q0YsIDB4MzQsIDB4REMsCisgICAgMHg2RSwgMHgyMiwgMHg1MCwgMHhDOSwgMHhERSwgMHhDMCwgMHg2OCwgMHg5QiwKKyAgICAweDY1LCAweDg5LCAweEJDLCAweEQ0LCAweERCLCAweEVELCAweEY4LCAweEFCLAorICAgIDB4QzgsIDB4MTIsIDB4QTgsIDB4QTIsIDB4MkIsIDB4MEQsIDB4NDAsIDB4NTIsCisgICAgMHhEQywgMHhCQiwgMHhGRSwgMHgwMiwgMHgzMiwgMHgyRiwgMHhBNCwgMHhBOSwKKyAgICAweENBLCAweEQ3LCAweDEwLCAweDYxLCAweDIxLCAweDFFLCAweEYwLCAweEI0LAorICAgIDB4RDMsIDB4NTAsIDB4NUQsIDB4MDQsIDB4MEYsIDB4RjYsIDB4MDAsIDB4QzIsCisgICAgMHg2RiwgMHgxNiwgMHg5RCwgMHgyNSwgMHgzNiwgMHg4NiwgMHg0MiwgMHg1NiwKKyAgICAweDRBLCAweDU1LCAweDVFLCAweDA5LCAweEMxLCAweEJFLCAweEUwLCAweDkxCit9OworLyogTWFjcm8gdG8gcGVyZm9ybSBvbmUgY29sdW1uIG9mIHRoZSBSUyBtYXRyaXggbXVsdGlwbGljYXRpb24uICBUaGUKKyAqIHBhcmFtZXRlcnMgYSwgYiwgYywgYW5kIGQgYXJlIHRoZSBmb3VyIGJ5dGVzIG9mIG91dHB1dDsgaSBpcyB0aGUgaW5kZXgKKyAqIG9mIHRoZSBrZXkgYnl0ZXMsIGFuZCB3LCB4LCB5LCBhbmQgeiwgYXJlIHRoZSBjb2x1bW4gb2YgY29uc3RhbnRzIGZyb20KKyAqIHRoZSBSUyBtYXRyaXgsIHByZXByb2Nlc3NlZCB0aHJvdWdoIHRoZSBwb2x5X3RvX2V4cCB0YWJsZS4gKi8KKworI2RlZmluZSBDQUxDX1MoYSwgYiwgYywgZCwgaSwgdywgeCwgeSwgeikgXAorICAgaWYgKGtleVtpXSkgeyBcCisgICAgICB0bXAgPSBwb2x5X3RvX2V4cFtrZXlbaV0gLSAxXTsgXAorICAgICAgKGEpIF49IGV4cF90b19wb2x5W3RtcCArICh3KV07IFwKKyAgICAgIChiKSBePSBleHBfdG9fcG9seVt0bXAgKyAoeCldOyBcCisgICAgICAoYykgXj0gZXhwX3RvX3BvbHlbdG1wICsgKHkpXTsgXAorICAgICAgKGQpIF49IGV4cF90b19wb2x5W3RtcCArICh6KV07IFwKKyAgIH0KKworLyogTWFjcm9zIHRvIGNhbGN1bGF0ZSB0aGUga2V5LWRlcGVuZGVudCBTLWJveGVzIGZvciBhIDEyOC1iaXQga2V5IHVzaW5nCisgKiB0aGUgUyB2ZWN0b3IgZnJvbSBDQUxDX1MuICBDQUxDX1NCXzIgY29tcHV0ZXMgYSBzaW5nbGUgZW50cnkgaW4gYWxsCisgKiBmb3VyIFMtYm94ZXMsIHdoZXJlIGkgaXMgdGhlIGluZGV4IG9mIHRoZSBlbnRyeSB0byBjb21wdXRlLCBhbmQgYSBhbmQgYgorICogYXJlIHRoZSBpbmRleCBudW1iZXJzIHByZXByb2Nlc3NlZCB0aHJvdWdoIHRoZSBxMCBhbmQgcTEgdGFibGVzCisgKiByZXNwZWN0aXZlbHkuICBDQUxDX1NCIGlzIHNpbXBseSBhIGNvbnZlbmllbmNlIHRvIG1ha2UgdGhlIGNvZGUgc2hvcnRlcjsKKyAqIGl0IGNhbGxzIENBTENfU0JfMiBmb3VyIHRpbWVzIHdpdGggY29uc2VjdXRpdmUgaW5kaWNlcyBmcm9tIGkgdG8gaSszLAorICogdXNpbmcgdGhlIHJlbWFpbmluZyBwYXJhbWV0ZXJzIHR3byBieSB0d28uICovCisKKyNkZWZpbmUgQ0FMQ19TQl8yKGksIGEsIGIpIFwKKyAgIGN0eC0+c1swXVtpXSA9IG1kc1swXVtxMFsoYSkgXiBzYV0gXiBzZV07IFwKKyAgIGN0eC0+c1sxXVtpXSA9IG1kc1sxXVtxMFsoYikgXiBzYl0gXiBzZl07IFwKKyAgIGN0eC0+c1syXVtpXSA9IG1kc1syXVtxMVsoYSkgXiBzY10gXiBzZ107IFwKKyAgIGN0eC0+c1szXVtpXSA9IG1kc1szXVtxMVsoYikgXiBzZF0gXiBzaF0KKworI2RlZmluZSBDQUxDX1NCKGksIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgpIFwKKyAgIENBTENfU0JfMiAoaSwgYSwgYik7IENBTENfU0JfMiAoKGkpKzEsIGMsIGQpOyBcCisgICBDQUxDX1NCXzIgKChpKSsyLCBlLCBmKTsgQ0FMQ19TQl8yICgoaSkrMywgZywgaCkKKworLyogTWFjcm9zIGV4YWN0bHkgbGlrZSBDQUxDX1NCIGFuZCBDQUxDX1NCXzIsIGJ1dCBmb3IgMjU2LWJpdCBrZXlzLiAqLworCisjZGVmaW5lIENBTENfU0IyNTZfMihpLCBhLCBiKSBcCisgICBjdHgtPnNbMF1baV0gPSBtZHNbMF1bcTBbcTBbcTFbKGIpIF4gc2FdIF4gc2VdIF4gc2ldIF4gc21dOyBcCisgICBjdHgtPnNbMV1baV0gPSBtZHNbMV1bcTBbcTFbcTFbKGEpIF4gc2JdIF4gc2ZdIF4gc2pdIF4gc25dOyBcCisgICBjdHgtPnNbMl1baV0gPSBtZHNbMl1bcTFbcTBbcTBbKGEpIF4gc2NdIF4gc2ddIF4gc2tdIF4gc29dOyBcCisgICBjdHgtPnNbM11baV0gPSBtZHNbM11bcTFbcTFbcTBbKGIpIF4gc2RdIF4gc2hdIF4gc2xdIF4gc3BdOworCisjZGVmaW5lIENBTENfU0IyNTYoaSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCkgXAorICAgQ0FMQ19TQjI1Nl8yIChpLCBhLCBiKTsgQ0FMQ19TQjI1Nl8yICgoaSkrMSwgYywgZCk7IFwKKyAgIENBTENfU0IyNTZfMiAoKGkpKzIsIGUsIGYpOyBDQUxDX1NCMjU2XzIgKChpKSszLCBnLCBoKQorCisvKiBNYWNyb3MgdG8gY2FsY3VsYXRlIHRoZSB3aGl0ZW5pbmcgYW5kIHJvdW5kIHN1YmtleXMuICBDQUxDX0tfMiBjb21wdXRlcyB0aGUKKyAqIGxhc3QgdHdvIHN0YWdlcyBvZiB0aGUgaCgpIGZ1bmN0aW9uIGZvciBhIGdpdmVuIGluZGV4IChlaXRoZXIgMmkgb3IgMmkrMSkuCisgKiBhLCBiLCBjLCBhbmQgZCBhcmUgdGhlIGZvdXIgYnl0ZXMgZ29pbmcgaW50byB0aGUgbGFzdCB0d28gc3RhZ2VzLiAgRm9yCisgKiAxMjgtYml0IGtleXMsIHRoaXMgaXMgdGhlIGVudGlyZSBoKCkgZnVuY3Rpb24gYW5kIGEgYW5kIGMgYXJlIHRoZSBpbmRleAorICogcHJlcHJvY2Vzc2VkIHRocm91Z2ggcTAgYW5kIHExIHJlc3BlY3RpdmVseTsgZm9yIGxvbmdlciBrZXlzIHRoZXkgYXJlIHRoZQorICogb3V0cHV0IG9mIHByZXZpb3VzIHN0YWdlcy4gIGogaXMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBrZXkgYnl0ZSB0byB1c2UuCisgKiBDQUxDX0sgY29tcHV0ZXMgYSBwYWlyIG9mIHN1YmtleXMgZm9yIDEyOC1iaXQgVHdvZmlzaCwgYnkgY2FsbGluZyBDQUxDX0tfMgorICogdHdpY2UsIGRvaW5nIHRoZSBQc3VlZG8tSGFkYW1hcmQgVHJhbnNmb3JtLCBhbmQgZG9pbmcgdGhlIG5lY2Vzc2FyeQorICogcm90YXRpb25zLiAgSXRzIHBhcmFtZXRlcnMgYXJlOiBhLCB0aGUgYXJyYXkgdG8gd3JpdGUgdGhlIHJlc3VsdHMgaW50bywKKyAqIGosIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb3V0cHV0IGVudHJ5LCBrIGFuZCBsLCB0aGUgcHJlcHJvY2Vzc2VkIGluZGljZXMKKyAqIGZvciBpbmRleCAyaSwgYW5kIG0gYW5kIG4sIHRoZSBwcmVwcm9jZXNzZWQgaW5kaWNlcyBmb3IgaW5kZXggMmkrMS4KKyAqIENBTENfSzI1Nl8yIGV4cGFuZHMgQ0FMQ19LXzIgdG8gaGFuZGxlIDI1Ni1iaXQga2V5cywgYnkgZG9pbmcgdHdvCisgKiBhZGRpdGlvbmFsIGxvb2t1cC1hbmQtWE9SIHN0YWdlcy4gIFRoZSBwYXJhbWV0ZXJzIGEgYW5kIGIgYXJlIHRoZSBpbmRleAorICogcHJlcHJvY2Vzc2VkIHRocm91Z2ggcTAgYW5kIHExIHJlc3BlY3RpdmVseTsgaiBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0CisgKiBrZXkgYnl0ZSB0byB1c2UuICBDQUxDX0syNTYgaXMgaWRlbnRpY2FsIHRvIENBTENfSyBidXQgZm9yIHVzaW5nIHRoZQorICogQ0FMQ19LMjU2XzIgbWFjcm8gaW5zdGVhZCBvZiBDQUxDX0tfMi4gKi8KKworI2RlZmluZSBDQUxDX0tfMihhLCBiLCBjLCBkLCBqKSBcCisgICAgIG1kc1swXVtxMFthIF4ga2V5WyhqKSArIDhdXSBeIGtleVtqXV0gXAorICAgXiBtZHNbMV1bcTBbYiBeIGtleVsoaikgKyA5XV0gXiBrZXlbKGopICsgMV1dIFwKKyAgIF4gbWRzWzJdW3ExW2MgXiBrZXlbKGopICsgMTBdXSBeIGtleVsoaikgKyAyXV0gXAorICAgXiBtZHNbM11bcTFbZCBeIGtleVsoaikgKyAxMV1dIF4ga2V5WyhqKSArIDNdXQorCisjZGVmaW5lIENBTENfSyhhLCBqLCBrLCBsLCBtLCBuKSBcCisgICB4ID0gQ0FMQ19LXzIgKGssIGwsIGssIGwsIDApOyBcCisgICB5ID0gQ0FMQ19LXzIgKG0sIG4sIG0sIG4sIDQpOyBcCisgICB5ID0gKHkgPDwgOCkgKyAoeSA+PiAyNCk7IFwKKyAgIHggKz0geTsgeSArPSB4OyBjdHgtPmFbal0gPSB4OyBcCisgICBjdHgtPmFbKGopICsgMV0gPSAoeSA8PCA5KSArICh5ID4+IDIzKQorCisjZGVmaW5lIENBTENfSzI1Nl8yKGEsIGIsIGopIFwKKyAgIENBTENfS18yIChxMFtxMVtiIF4ga2V5WyhqKSArIDI0XV0gXiBrZXlbKGopICsgMTZdXSwgXAorCSAgICAgcTFbcTFbYSBeIGtleVsoaikgKyAyNV1dIF4ga2V5WyhqKSArIDE3XV0sIFwKKwkgICAgIHEwW3EwW2EgXiBrZXlbKGopICsgMjZdXSBeIGtleVsoaikgKyAxOF1dLCBcCisJICAgICBxMVtxMFtiIF4ga2V5WyhqKSArIDI3XV0gXiBrZXlbKGopICsgMTldXSwgaikKKworI2RlZmluZSBDQUxDX0syNTYoYSwgaiwgaywgbCwgbSwgbikgXAorICAgeCA9IENBTENfSzI1Nl8yIChrLCBsLCAwKTsgXAorICAgeSA9IENBTENfSzI1Nl8yIChtLCBuLCA0KTsgXAorICAgeSA9ICh5IDw8IDgpICsgKHkgPj4gMjQpOyBcCisgICB4ICs9IHk7IHkgKz0geDsgY3R4LT5hW2pdID0geDsgXAorICAgY3R4LT5hWyhqKSArIDFdID0gKHkgPDwgOSkgKyAoeSA+PiAyMykKKwwKKworCisvKiBQZXJmb3JtIHRoZSBrZXkgc2V0dXAuICBOb3RlIHRoYXQgdGhpcyB3b3JrcyBvbmx5IHdpdGggMTI4LSBhbmQgMjU2LWJpdAorICoga2V5cywgZGVzcGl0ZSB0aGUgQVBJIHRoYXQgbG9va3MgbGlrZSBpdCBtaWdodCBzdXBwb3J0IG90aGVyIHNpemVzLiAqLworCitzdGF0aWMgZ2NyeV9lcnJfY29kZV90Citkb190d29maXNoX3NldGtleSAoVFdPRklTSF9jb250ZXh0ICpjdHgsIGNvbnN0IGJ5dGUgKmtleSwgY29uc3QgdW5zaWduZWQga2V5bGVuKQoreworICBpbnQgaSwgaiwgazsKKworICAvKiBUZW1wb3JhcmllcyBmb3IgQ0FMQ19LLiAqLworICB1MzIgeCwgeTsKKworICAvKiBUaGUgUyB2ZWN0b3IgdXNlZCB0byBrZXkgdGhlIFMtYm94ZXMsIHNwbGl0IHVwIGludG8gaW5kaXZpZHVhbCBieXRlcy4KKyAgICogMTI4LWJpdCBrZXlzIHVzZSBvbmx5IHNhIHRocm91Z2ggc2g7IDI1Ni1iaXQgdXNlIGFsbCBvZiB0aGVtLiAqLworICBieXRlIHNhID0gMCwgc2IgPSAwLCBzYyA9IDAsIHNkID0gMCwgc2UgPSAwLCBzZiA9IDAsIHNnID0gMCwgc2ggPSAwOworICBieXRlIHNpID0gMCwgc2ogPSAwLCBzayA9IDAsIHNsID0gMCwgc20gPSAwLCBzbiA9IDAsIHNvID0gMCwgc3AgPSAwOworICAKKyAgLyogVGVtcG9yYXJ5IGZvciBDQUxDX1MuICovCisgIGJ5dGUgdG1wOworICAKKyAgLyogRmxhZ3MgZm9yIHNlbGYtdGVzdC4gKi8KKyAgc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7CisgIHN0YXRpYyBjb25zdCBjaGFyICpzZWxmdGVzdF9mYWlsZWQ9MDsKKworICAvKiBDaGVjayBrZXkgbGVuZ3RoLiAqLworICBpZiggKCAoIGtleWxlbiAtIDE2ICkgfCAxNiApICE9IDE2ICkKKyAgICByZXR1cm4gR1BHX0VSUl9JTlZfS0VZTEVOOworCisgIC8qIERvIHNlbGYtdGVzdCBpZiBuZWNlc3NhcnkuICovCisgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgeworICAgICAgaW5pdGlhbGl6ZWQgPSAxOworICAgICAgc2VsZnRlc3RfZmFpbGVkID0gc2VsZnRlc3QgKCk7CisgICAgICBpZiggc2VsZnRlc3RfZmFpbGVkICkKKyAgICAgICAgbG9nX2Vycm9yKCIlc1xuIiwgc2VsZnRlc3RfZmFpbGVkICk7CisgICAgfQorICBpZiggc2VsZnRlc3RfZmFpbGVkICkKKyAgICByZXR1cm4gR1BHX0VSUl9TRUxGVEVTVF9GQUlMRUQ7CisKKyAgLyogQ29tcHV0ZSB0aGUgZmlyc3QgdHdvIHdvcmRzIG9mIHRoZSBTIHZlY3Rvci4gIFRoZSBtYWdpYyBudW1iZXJzIGFyZQorICAgKiB0aGUgZW50cmllcyBvZiB0aGUgUlMgbWF0cml4LCBwcmVwcm9jZXNzZWQgdGhyb3VnaCBwb2x5X3RvX2V4cC4JVGhlCisgICAqIG51bWJlcnMgaW4gdGhlIGNvbW1lbnRzIGFyZSB0aGUgb3JpZ2luYWwgKHBvbHlub21pYWwgZm9ybSkgbWF0cml4CisgICAqIGVudHJpZXMuICovCisgIENBTENfUyAoc2EsIHNiLCBzYywgc2QsIDAsIDB4MDAsIDB4MkQsIDB4MDEsIDB4MkQpOyAvKiAwMSBBNCAwMiBBNCAqLworICBDQUxDX1MgKHNhLCBzYiwgc2MsIHNkLCAxLCAweDJELCAweEE0LCAweDQ0LCAweDhBKTsgLyogQTQgNTYgQTEgNTUgKi8KKyAgQ0FMQ19TIChzYSwgc2IsIHNjLCBzZCwgMiwgMHg4QSwgMHhENSwgMHhCRiwgMHhEMSk7IC8qIDU1IDgyIEZDIDg3ICovCisgIENBTENfUyAoc2EsIHNiLCBzYywgc2QsIDMsIDB4RDEsIDB4N0YsIDB4M0QsIDB4OTkpOyAvKiA4NyBGMyBDMSA1QSAqLworICBDQUxDX1MgKHNhLCBzYiwgc2MsIHNkLCA0LCAweDk5LCAweDQ2LCAweDY2LCAweDk2KTsgLyogNUEgMUUgNDcgNTggKi8KKyAgQ0FMQ19TIChzYSwgc2IsIHNjLCBzZCwgNSwgMHg5NiwgMHgzQywgMHg1QiwgMHhFRCk7IC8qIDU4IEM2IEFFIERCICovCisgIENBTENfUyAoc2EsIHNiLCBzYywgc2QsIDYsIDB4RUQsIDB4MzcsIDB4NEYsIDB4RTApOyAvKiBEQiA2OCAzRCA5RSAqLworICBDQUxDX1MgKHNhLCBzYiwgc2MsIHNkLCA3LCAweEUwLCAweEQwLCAweDhDLCAweDE3KTsgLyogOUUgRTUgMTkgMDMgKi8KKyAgQ0FMQ19TIChzZSwgc2YsIHNnLCBzaCwgOCwgMHgwMCwgMHgyRCwgMHgwMSwgMHgyRCk7IC8qIDAxIEE0IDAyIEE0ICovCisgIENBTENfUyAoc2UsIHNmLCBzZywgc2gsIDksIDB4MkQsIDB4QTQsIDB4NDQsIDB4OEEpOyAvKiBBNCA1NiBBMSA1NSAqLworICBDQUxDX1MgKHNlLCBzZiwgc2csIHNoLCAxMCwgMHg4QSwgMHhENSwgMHhCRiwgMHhEMSk7IC8qIDU1IDgyIEZDIDg3ICovCisgIENBTENfUyAoc2UsIHNmLCBzZywgc2gsIDExLCAweEQxLCAweDdGLCAweDNELCAweDk5KTsgLyogODcgRjMgQzEgNUEgKi8KKyAgQ0FMQ19TIChzZSwgc2YsIHNnLCBzaCwgMTIsIDB4OTksIDB4NDYsIDB4NjYsIDB4OTYpOyAvKiA1QSAxRSA0NyA1OCAqLworICBDQUxDX1MgKHNlLCBzZiwgc2csIHNoLCAxMywgMHg5NiwgMHgzQywgMHg1QiwgMHhFRCk7IC8qIDU4IEM2IEFFIERCICovCisgIENBTENfUyAoc2UsIHNmLCBzZywgc2gsIDE0LCAweEVELCAweDM3LCAweDRGLCAweEUwKTsgLyogREIgNjggM0QgOUUgKi8KKyAgQ0FMQ19TIChzZSwgc2YsIHNnLCBzaCwgMTUsIDB4RTAsIDB4RDAsIDB4OEMsIDB4MTcpOyAvKiA5RSBFNSAxOSAwMyAqLworCisgIGlmIChrZXlsZW4gPT0gMzIpICAvKiAyNTYtYml0IGtleSAqLworICAgIHsKKyAgICAgIC8qIENhbGN1bGF0ZSB0aGUgcmVtYWluaW5nIHR3byB3b3JkcyBvZiB0aGUgUyB2ZWN0b3IgKi8KKyAgICAgIENBTENfUyAoc2ksIHNqLCBzaywgc2wsIDE2LCAweDAwLCAweDJELCAweDAxLCAweDJEKTsgLyogMDEgQTQgMDIgQTQgKi8KKyAgICAgIENBTENfUyAoc2ksIHNqLCBzaywgc2wsIDE3LCAweDJELCAweEE0LCAweDQ0LCAweDhBKTsgLyogQTQgNTYgQTEgNTUgKi8KKyAgICAgIENBTENfUyAoc2ksIHNqLCBzaywgc2wsIDE4LCAweDhBLCAweEQ1LCAweEJGLCAweEQxKTsgLyogNTUgODIgRkMgODcgKi8KKyAgICAgIENBTENfUyAoc2ksIHNqLCBzaywgc2wsIDE5LCAweEQxLCAweDdGLCAweDNELCAweDk5KTsgLyogODcgRjMgQzEgNUEgKi8KKyAgICAgIENBTENfUyAoc2ksIHNqLCBzaywgc2wsIDIwLCAweDk5LCAweDQ2LCAweDY2LCAweDk2KTsgLyogNUEgMUUgNDcgNTggKi8KKyAgICAgIENBTENfUyAoc2ksIHNqLCBzaywgc2wsIDIxLCAweDk2LCAweDNDLCAweDVCLCAweEVEKTsgLyogNTggQzYgQUUgREIgKi8KKyAgICAgIENBTENfUyAoc2ksIHNqLCBzaywgc2wsIDIyLCAweEVELCAweDM3LCAweDRGLCAweEUwKTsgLyogREIgNjggM0QgOUUgKi8KKyAgICAgIENBTENfUyAoc2ksIHNqLCBzaywgc2wsIDIzLCAweEUwLCAweEQwLCAweDhDLCAweDE3KTsgLyogOUUgRTUgMTkgMDMgKi8KKyAgICAgIENBTENfUyAoc20sIHNuLCBzbywgc3AsIDI0LCAweDAwLCAweDJELCAweDAxLCAweDJEKTsgLyogMDEgQTQgMDIgQTQgKi8KKyAgICAgIENBTENfUyAoc20sIHNuLCBzbywgc3AsIDI1LCAweDJELCAweEE0LCAweDQ0LCAweDhBKTsgLyogQTQgNTYgQTEgNTUgKi8KKyAgICAgIENBTENfUyAoc20sIHNuLCBzbywgc3AsIDI2LCAweDhBLCAweEQ1LCAweEJGLCAweEQxKTsgLyogNTUgODIgRkMgODcgKi8KKyAgICAgIENBTENfUyAoc20sIHNuLCBzbywgc3AsIDI3LCAweEQxLCAweDdGLCAweDNELCAweDk5KTsgLyogODcgRjMgQzEgNUEgKi8KKyAgICAgIENBTENfUyAoc20sIHNuLCBzbywgc3AsIDI4LCAweDk5LCAweDQ2LCAweDY2LCAweDk2KTsgLyogNUEgMUUgNDcgNTggKi8KKyAgICAgIENBTENfUyAoc20sIHNuLCBzbywgc3AsIDI5LCAweDk2LCAweDNDLCAweDVCLCAweEVEKTsgLyogNTggQzYgQUUgREIgKi8KKyAgICAgIENBTENfUyAoc20sIHNuLCBzbywgc3AsIDMwLCAweEVELCAweDM3LCAweDRGLCAweEUwKTsgLyogREIgNjggM0QgOUUgKi8KKyAgICAgIENBTENfUyAoc20sIHNuLCBzbywgc3AsIDMxLCAweEUwLCAweEQwLCAweDhDLCAweDE3KTsgLyogOUUgRTUgMTkgMDMgKi8KKworICAgICAgLyogQ29tcHV0ZSB0aGUgUy1ib3hlcy4gKi8KKyAgICAgIGZvcihpPWo9MCxrPTE7IGkgPCAyNTY7IGkrKywgaiArPSAyLCBrICs9IDIgKQorICAgICAgICB7CisgICAgICAgICAgQ0FMQ19TQjI1Nl8yKCBpLCBjYWxjX3NiX3RibFtqXSwgY2FsY19zYl90Ymxba10gKTsKKwl9CisKKyAgICAgIC8qIENhbGN1bGF0ZSB3aGl0ZW5pbmcgYW5kIHJvdW5kIHN1YmtleXMuICBUaGUgY29uc3RhbnRzIGFyZQorICAgICAgICogaW5kaWNlcyBvZiBzdWJrZXlzLCBwcmVwcm9jZXNzZWQgdGhyb3VnaCBxMCBhbmQgcTEuICovCisgICAgICBDQUxDX0syNTYgKHcsIDAsIDB4QTksIDB4NzUsIDB4NjcsIDB4RjMpOworICAgICAgQ0FMQ19LMjU2ICh3LCAyLCAweEIzLCAweEM2LCAweEU4LCAweEY0KTsKKyAgICAgIENBTENfSzI1NiAodywgNCwgMHgwNCwgMHhEQiwgMHhGRCwgMHg3Qik7CisgICAgICBDQUxDX0syNTYgKHcsIDYsIDB4QTMsIDB4RkIsIDB4NzYsIDB4QzgpOworICAgICAgQ0FMQ19LMjU2IChrLCAwLCAweDlBLCAweDRBLCAweDkyLCAweEQzKTsKKyAgICAgIENBTENfSzI1NiAoaywgMiwgMHg4MCwgMHhFNiwgMHg3OCwgMHg2Qik7CisgICAgICBDQUxDX0syNTYgKGssIDQsIDB4RTQsIDB4NDUsIDB4REQsIDB4N0QpOworICAgICAgQ0FMQ19LMjU2IChrLCA2LCAweEQxLCAweEU4LCAweDM4LCAweDRCKTsKKyAgICAgIENBTENfSzI1NiAoaywgOCwgMHgwRCwgMHhENiwgMHhDNiwgMHgzMik7CisgICAgICBDQUxDX0syNTYgKGssIDEwLCAweDM1LCAweEQ4LCAweDk4LCAweEZEKTsKKyAgICAgIENBTENfSzI1NiAoaywgMTIsIDB4MTgsIDB4MzcsIDB4RjcsIDB4NzEpOworICAgICAgQ0FMQ19LMjU2IChrLCAxNCwgMHhFQywgMHhGMSwgMHg2QywgMHhFMSk7CisgICAgICBDQUxDX0syNTYgKGssIDE2LCAweDQzLCAweDMwLCAweDc1LCAweDBGKTsKKyAgICAgIENBTENfSzI1NiAoaywgMTgsIDB4MzcsIDB4RjgsIDB4MjYsIDB4MUIpOworICAgICAgQ0FMQ19LMjU2IChrLCAyMCwgMHhGQSwgMHg4NywgMHgxMywgMHhGQSk7CisgICAgICBDQUxDX0syNTYgKGssIDIyLCAweDk0LCAweDA2LCAweDQ4LCAweDNGKTsKKyAgICAgIENBTENfSzI1NiAoaywgMjQsIDB4RjIsIDB4NUUsIDB4RDAsIDB4QkEpOworICAgICAgQ0FMQ19LMjU2IChrLCAyNiwgMHg4QiwgMHhBRSwgMHgzMCwgMHg1Qik7CisgICAgICBDQUxDX0syNTYgKGssIDI4LCAweDg0LCAweDhBLCAweDU0LCAweDAwKTsKKyAgICAgIENBTENfSzI1NiAoaywgMzAsIDB4REYsIDB4QkMsIDB4MjMsIDB4OUQpOworICAgIH0KKyAgZWxzZSAKKyAgICB7CisgICAgICAvKiBDb21wdXRlIHRoZSBTLWJveGVzLiAqLworICAgICAgZm9yKGk9aj0wLGs9MTsgaSA8IDI1NjsgaSsrLCBqICs9IDIsIGsgKz0gMiApCisgICAgICAgIHsKKyAgICAgICAgICBDQUxDX1NCXzIoIGksIGNhbGNfc2JfdGJsW2pdLCBjYWxjX3NiX3RibFtrXSApOworICAgICAgICB9CisKKyAgICAgIC8qIENhbGN1bGF0ZSB3aGl0ZW5pbmcgYW5kIHJvdW5kIHN1YmtleXMuICBUaGUgY29uc3RhbnRzIGFyZQorICAgICAgICogaW5kaWNlcyBvZiBzdWJrZXlzLCBwcmVwcm9jZXNzZWQgdGhyb3VnaCBxMCBhbmQgcTEuICovCisgICAgICBDQUxDX0sgKHcsIDAsIDB4QTksIDB4NzUsIDB4NjcsIDB4RjMpOworICAgICAgQ0FMQ19LICh3LCAyLCAweEIzLCAweEM2LCAweEU4LCAweEY0KTsKKyAgICAgIENBTENfSyAodywgNCwgMHgwNCwgMHhEQiwgMHhGRCwgMHg3Qik7CisgICAgICBDQUxDX0sgKHcsIDYsIDB4QTMsIDB4RkIsIDB4NzYsIDB4QzgpOworICAgICAgQ0FMQ19LIChrLCAwLCAweDlBLCAweDRBLCAweDkyLCAweEQzKTsKKyAgICAgIENBTENfSyAoaywgMiwgMHg4MCwgMHhFNiwgMHg3OCwgMHg2Qik7CisgICAgICBDQUxDX0sgKGssIDQsIDB4RTQsIDB4NDUsIDB4REQsIDB4N0QpOworICAgICAgQ0FMQ19LIChrLCA2LCAweEQxLCAweEU4LCAweDM4LCAweDRCKTsKKyAgICAgIENBTENfSyAoaywgOCwgMHgwRCwgMHhENiwgMHhDNiwgMHgzMik7CisgICAgICBDQUxDX0sgKGssIDEwLCAweDM1LCAweEQ4LCAweDk4LCAweEZEKTsKKyAgICAgIENBTENfSyAoaywgMTIsIDB4MTgsIDB4MzcsIDB4RjcsIDB4NzEpOworICAgICAgQ0FMQ19LIChrLCAxNCwgMHhFQywgMHhGMSwgMHg2QywgMHhFMSk7CisgICAgICBDQUxDX0sgKGssIDE2LCAweDQzLCAweDMwLCAweDc1LCAweDBGKTsKKyAgICAgIENBTENfSyAoaywgMTgsIDB4MzcsIDB4RjgsIDB4MjYsIDB4MUIpOworICAgICAgQ0FMQ19LIChrLCAyMCwgMHhGQSwgMHg4NywgMHgxMywgMHhGQSk7CisgICAgICBDQUxDX0sgKGssIDIyLCAweDk0LCAweDA2LCAweDQ4LCAweDNGKTsKKyAgICAgIENBTENfSyAoaywgMjQsIDB4RjIsIDB4NUUsIDB4RDAsIDB4QkEpOworICAgICAgQ0FMQ19LIChrLCAyNiwgMHg4QiwgMHhBRSwgMHgzMCwgMHg1Qik7CisgICAgICBDQUxDX0sgKGssIDI4LCAweDg0LCAweDhBLCAweDU0LCAweDAwKTsKKyAgICAgIENBTENfSyAoaywgMzAsIDB4REYsIDB4QkMsIDB4MjMsIDB4OUQpOworICAgIH0KKworICByZXR1cm4gMDsKK30KKworc3RhdGljIGdjcnlfZXJyX2NvZGVfdAordHdvZmlzaF9zZXRrZXkgKHZvaWQgKmNvbnRleHQsIGNvbnN0IGJ5dGUgKmtleSwgdW5zaWduZWQgaW50IGtleWxlbikKK3sKKyAgVFdPRklTSF9jb250ZXh0ICpjdHggPSBjb250ZXh0OworICBpbnQgcmMgPSBkb190d29maXNoX3NldGtleSAoY3R4LCBrZXksIGtleWxlbik7CisgIF9nY3J5X2J1cm5fc3RhY2sgKDIzKzYqc2l6ZW9mKHZvaWQqKSk7CisgIHJldHVybiByYzsKK30KKworCisMCisvKiBNYWNyb3MgdG8gY29tcHV0ZSB0aGUgZygpIGZ1bmN0aW9uIGluIHRoZSBlbmNyeXB0aW9uIGFuZCBkZWNyeXB0aW9uCisgKiByb3VuZHMuICBHMSBpcyB0aGUgc3RyYWlnaHQgZygpIGZ1bmN0aW9uOyBHMiBpbmNsdWRlcyB0aGUgOC1iaXQKKyAqIHJvdGF0aW9uIGZvciB0aGUgaGlnaCAzMi1iaXQgd29yZC4gKi8KKworI2RlZmluZSBHMShhKSBcCisgICAgIChjdHgtPnNbMF1bKGEpICYgMHhGRl0pIF4gKGN0eC0+c1sxXVsoKGEpID4+IDgpICYgMHhGRl0pIFwKKyAgIF4gKGN0eC0+c1syXVsoKGEpID4+IDE2KSAmIDB4RkZdKSBeIChjdHgtPnNbM11bKGEpID4+IDI0XSkKKworI2RlZmluZSBHMihiKSBcCisgICAgIChjdHgtPnNbMV1bKGIpICYgMHhGRl0pIF4gKGN0eC0+c1syXVsoKGIpID4+IDgpICYgMHhGRl0pIFwKKyAgIF4gKGN0eC0+c1szXVsoKGIpID4+IDE2KSAmIDB4RkZdKSBeIChjdHgtPnNbMF1bKGIpID4+IDI0XSkKKworLyogRW5jcnlwdGlvbiBhbmQgZGVjcnlwdGlvbiBGZWlzdGVsIHJvdW5kcy4gIEVhY2ggb25lIGNhbGxzIHRoZSB0d28gZygpCisgKiBtYWNyb3MsIGRvZXMgdGhlIFBIVCwgYW5kIHBlcmZvcm1zIHRoZSBYT1IgYW5kIHRoZSBhcHByb3ByaWF0ZSBiaXQKKyAqIHJvdGF0aW9ucy4gIFRoZSBwYXJhbWV0ZXJzIGFyZSB0aGUgcm91bmQgbnVtYmVyICh1c2VkIHRvIHNlbGVjdCBzdWJrZXlzKSwKKyAqIGFuZCB0aGUgZm91ciAzMi1iaXQgY2h1bmtzIG9mIHRoZSB0ZXh0LiAqLworCisjZGVmaW5lIEVOQ1JPVU5EKG4sIGEsIGIsIGMsIGQpIFwKKyAgIHggPSBHMSAoYSk7IHkgPSBHMiAoYik7IFwKKyAgIHggKz0geTsgeSArPSB4ICsgY3R4LT5rWzIgKiAobikgKyAxXTsgXAorICAgKGMpIF49IHggKyBjdHgtPmtbMiAqIChuKV07IFwKKyAgIChjKSA9ICgoYykgPj4gMSkgKyAoKGMpIDw8IDMxKTsgXAorICAgKGQpID0gKCgoZCkgPDwgMSkrKChkKSA+PiAzMSkpIF4geQorCisjZGVmaW5lIERFQ1JPVU5EKG4sIGEsIGIsIGMsIGQpIFwKKyAgIHggPSBHMSAoYSk7IHkgPSBHMiAoYik7IFwKKyAgIHggKz0geTsgeSArPSB4OyBcCisgICAoZCkgXj0geSArIGN0eC0+a1syICogKG4pICsgMV07IFwKKyAgIChkKSA9ICgoZCkgPj4gMSkgKyAoKGQpIDw8IDMxKTsgXAorICAgKGMpID0gKCgoYykgPDwgMSkrKChjKSA+PiAzMSkpOyBcCisgICAoYykgXj0gKHggKyBjdHgtPmtbMiAqIChuKV0pCisKKy8qIEVuY3J5cHRpb24gYW5kIGRlY3J5cHRpb24gY3ljbGVzOyBlYWNoIG9uZSBpcyBzaW1wbHkgdHdvIEZlaXN0ZWwgcm91bmRzCisgKiB3aXRoIHRoZSAzMi1iaXQgY2h1bmtzIHJlLW9yZGVyZWQgdG8gc2ltdWxhdGUgdGhlICJzd2FwIiAqLworCisjZGVmaW5lIEVOQ0NZQ0xFKG4pIFwKKyAgIEVOQ1JPVU5EICgyICogKG4pLCBhLCBiLCBjLCBkKTsgXAorICAgRU5DUk9VTkQgKDIgKiAobikgKyAxLCBjLCBkLCBhLCBiKQorCisjZGVmaW5lIERFQ0NZQ0xFKG4pIFwKKyAgIERFQ1JPVU5EICgyICogKG4pICsgMSwgYywgZCwgYSwgYik7IFwKKyAgIERFQ1JPVU5EICgyICogKG4pLCBhLCBiLCBjLCBkKQorCisvKiBNYWNyb3MgdG8gY29udmVydCB0aGUgaW5wdXQgYW5kIG91dHB1dCBieXRlcyBpbnRvIDMyLWJpdCB3b3JkcywKKyAqIGFuZCBzaW11bHRhbmVvdXNseSBwZXJmb3JtIHRoZSB3aGl0ZW5pbmcgc3RlcC4gIElOUEFDSyBwYWNrcyB3b3JkCisgKiBudW1iZXIgbiBpbnRvIHRoZSB2YXJpYWJsZSBuYW1lZCBieSB4LCB1c2luZyB3aGl0ZW5pbmcgc3Via2V5IG51bWJlciBtLgorICogT1VUVU5QQUNLIHVucGFja3Mgd29yZCBudW1iZXIgbiBmcm9tIHRoZSB2YXJpYWJsZSBuYW1lZCBieSB4LCB1c2luZworICogd2hpdGVuaW5nIHN1YmtleSBudW1iZXIgbS4gKi8KKworI2RlZmluZSBJTlBBQ0sobiwgeCwgbSkgXAorICAgeCA9IGluWzQgKiAobildIF4gKGluWzQgKiAobikgKyAxXSA8PCA4KSBcCisgICAgIF4gKGluWzQgKiAobikgKyAyXSA8PCAxNikgXiAoaW5bNCAqIChuKSArIDNdIDw8IDI0KSBeIGN0eC0+d1ttXQorCisjZGVmaW5lIE9VVFVOUEFDSyhuLCB4LCBtKSBcCisgICB4IF49IGN0eC0+d1ttXTsgXAorICAgb3V0WzQgKiAobildID0geDsgb3V0WzQgKiAobikgKyAxXSA9IHggPj4gODsgXAorICAgb3V0WzQgKiAobikgKyAyXSA9IHggPj4gMTY7IG91dFs0ICogKG4pICsgM10gPSB4ID4+IDI0CisMCisvKiBFbmNyeXB0IG9uZSBibG9jay4gIGluIGFuZCBvdXQgbWF5IGJlIHRoZSBzYW1lLiAqLworCitzdGF0aWMgdm9pZAorZG9fdHdvZmlzaF9lbmNyeXB0IChjb25zdCBUV09GSVNIX2NvbnRleHQgKmN0eCwgYnl0ZSAqb3V0LCBjb25zdCBieXRlICppbikKK3sKKyAgLyogVGhlIGZvdXIgMzItYml0IGNodW5rcyBvZiB0aGUgdGV4dC4gKi8KKyAgdTMyIGEsIGIsIGMsIGQ7CisKKyAgLyogVGVtcG9yYXJpZXMgdXNlZCBieSB0aGUgcm91bmQgZnVuY3Rpb24uICovCisgIHUzMiB4LCB5OworCisgIC8qIElucHV0IHdoaXRlbmluZyBhbmQgcGFja2luZy4gKi8KKyAgSU5QQUNLICgwLCBhLCAwKTsKKyAgSU5QQUNLICgxLCBiLCAxKTsKKyAgSU5QQUNLICgyLCBjLCAyKTsKKyAgSU5QQUNLICgzLCBkLCAzKTsKKworICAvKiBFbmNyeXB0aW9uIEZlaXN0ZWwgY3ljbGVzLiAqLworICBFTkNDWUNMRSAoMCk7CisgIEVOQ0NZQ0xFICgxKTsKKyAgRU5DQ1lDTEUgKDIpOworICBFTkNDWUNMRSAoMyk7CisgIEVOQ0NZQ0xFICg0KTsKKyAgRU5DQ1lDTEUgKDUpOworICBFTkNDWUNMRSAoNik7CisgIEVOQ0NZQ0xFICg3KTsKKworICAvKiBPdXRwdXQgd2hpdGVuaW5nIGFuZCB1bnBhY2tpbmcuICovCisgIE9VVFVOUEFDSyAoMCwgYywgNCk7CisgIE9VVFVOUEFDSyAoMSwgZCwgNSk7CisgIE9VVFVOUEFDSyAoMiwgYSwgNik7CisgIE9VVFVOUEFDSyAoMywgYiwgNyk7Cit9CisKK3N0YXRpYyB2b2lkCit0d29maXNoX2VuY3J5cHQgKHZvaWQgKmNvbnRleHQsIGJ5dGUgKm91dCwgY29uc3QgYnl0ZSAqaW4pCit7CisgIFRXT0ZJU0hfY29udGV4dCAqY3R4ID0gY29udGV4dDsKKyAgZG9fdHdvZmlzaF9lbmNyeXB0IChjdHgsIG91dCwgaW4pOworICBfZ2NyeV9idXJuX3N0YWNrICgyNCszKnNpemVvZiAodm9pZCopKTsKK30KKworDAorLyogRGVjcnlwdCBvbmUgYmxvY2suICBpbiBhbmQgb3V0IG1heSBiZSB0aGUgc2FtZS4gKi8KKworc3RhdGljIHZvaWQKK2RvX3R3b2Zpc2hfZGVjcnlwdCAoY29uc3QgVFdPRklTSF9jb250ZXh0ICpjdHgsIGJ5dGUgKm91dCwgY29uc3QgYnl0ZSAqaW4pCit7CisgIC8qIFRoZSBmb3VyIDMyLWJpdCBjaHVua3Mgb2YgdGhlIHRleHQuICovCisgIHUzMiBhLCBiLCBjLCBkOworCisgIC8qIFRlbXBvcmFyaWVzIHVzZWQgYnkgdGhlIHJvdW5kIGZ1bmN0aW9uLiAqLworICB1MzIgeCwgeTsKKworICAvKiBJbnB1dCB3aGl0ZW5pbmcgYW5kIHBhY2tpbmcuICovCisgIElOUEFDSyAoMCwgYywgNCk7CisgIElOUEFDSyAoMSwgZCwgNSk7CisgIElOUEFDSyAoMiwgYSwgNik7CisgIElOUEFDSyAoMywgYiwgNyk7CisKKyAgLyogRW5jcnlwdGlvbiBGZWlzdGVsIGN5Y2xlcy4gKi8KKyAgREVDQ1lDTEUgKDcpOworICBERUNDWUNMRSAoNik7CisgIERFQ0NZQ0xFICg1KTsKKyAgREVDQ1lDTEUgKDQpOworICBERUNDWUNMRSAoMyk7CisgIERFQ0NZQ0xFICgyKTsKKyAgREVDQ1lDTEUgKDEpOworICBERUNDWUNMRSAoMCk7CisKKyAgLyogT3V0cHV0IHdoaXRlbmluZyBhbmQgdW5wYWNraW5nLiAqLworICBPVVRVTlBBQ0sgKDAsIGEsIDApOworICBPVVRVTlBBQ0sgKDEsIGIsIDEpOworICBPVVRVTlBBQ0sgKDIsIGMsIDIpOworICBPVVRVTlBBQ0sgKDMsIGQsIDMpOworfQorCitzdGF0aWMgdm9pZAordHdvZmlzaF9kZWNyeXB0ICh2b2lkICpjb250ZXh0LCBieXRlICpvdXQsIGNvbnN0IGJ5dGUgKmluKQoreworICBUV09GSVNIX2NvbnRleHQgKmN0eCA9IGNvbnRleHQ7CisKKyAgZG9fdHdvZmlzaF9kZWNyeXB0IChjdHgsIG91dCwgaW4pOworICBfZ2NyeV9idXJuX3N0YWNrICgyNCszKnNpemVvZiAodm9pZCopKTsKK30KKworDAorLyogVGVzdCBhIHNpbmdsZSBlbmNyeXB0aW9uIGFuZCBkZWNyeXB0aW9uIHdpdGggZWFjaCBrZXkgc2l6ZS4gKi8KKworc3RhdGljIGNvbnN0IGNoYXIqCitzZWxmdGVzdCAodm9pZCkKK3sKKyAgVFdPRklTSF9jb250ZXh0IGN0eDsgLyogRXhwYW5kZWQga2V5LiAqLworICBieXRlIHNjcmF0Y2hbMTZdOwkvKiBFbmNyeXB0aW9uL2RlY3J5cHRpb24gcmVzdWx0IGJ1ZmZlci4gKi8KKworICAvKiBUZXN0IHZlY3RvcnMgZm9yIHNpbmdsZSBlbmNyeXB0aW9uL2RlY3J5cHRpb24uICBOb3RlIHRoYXQgSSBhbSB1c2luZworICAgKiB0aGUgdmVjdG9ycyBmcm9tIHRoZSBUd29maXNoIHBhcGVyJ3MgImtub3duIGFuc3dlciB0ZXN0IiwgST0zIGZvcgorICAgKiAxMjgtYml0IGFuZCBJPTQgZm9yIDI1Ni1iaXQsIGluc3RlYWQgb2YgdGhlIGFsbC0wIHZlY3RvcnMgZnJvbSB0aGUKKyAgICogImludGVybWVkaWF0ZSB2YWx1ZSB0ZXN0IiwgYmVjYXVzZSBhbiBhbGwtMCBrZXkgd291bGQgdHJpZ2dlciBhbGwgdGhlCisgICAqIHNwZWNpYWwgY2FzZXMgaW4gdGhlIFJTIG1hdHJpeCBtdWx0aXBseSwgbGVhdmluZyB0aGUgbWF0aCB1bnRlc3RlZC4gKi8KKyAgc3RhdGljICBieXRlIHBsYWludGV4dFsxNl0gPSB7CisgICAgMHhENCwgMHg5MSwgMHhEQiwgMHgxNiwgMHhFNywgMHhCMSwgMHhDMywgMHg5RSwKKyAgICAweDg2LCAweENCLCAweDA4LCAweDZCLCAweDc4LCAweDlGLCAweDU0LCAweDE5CisgIH07CisgIHN0YXRpYyBieXRlIGtleVsxNl0gPSB7CisgICAgMHg5RiwgMHg1OCwgMHg5RiwgMHg1QywgMHhGNiwgMHgxMiwgMHgyQywgMHgzMiwKKyAgICAweEI2LCAweEJGLCAweEVDLCAweDJGLCAweDJBLCAweEU4LCAweEMzLCAweDVBCisgIH07CisgIHN0YXRpYyBjb25zdCBieXRlIGNpcGhlcnRleHRbMTZdID0geworICAgIDB4MDEsIDB4OUYsIDB4OTgsIDB4MDksIDB4REUsIDB4MTcsIDB4MTEsIDB4ODUsCisgICAgMHg4RiwgMHhBQSwgMHhDMywgMHhBMywgMHhCQSwgMHgyMCwgMHhGQiwgMHhDMworICB9OworICBzdGF0aWMgYnl0ZSBwbGFpbnRleHRfMjU2WzE2XSA9IHsKKyAgICAweDkwLCAweEFGLCAweEU5LCAweDFCLCAweEIyLCAweDg4LCAweDU0LCAweDRGLAorICAgIDB4MkMsIDB4MzIsIDB4REMsIDB4MjMsIDB4OUIsIDB4MjYsIDB4MzUsIDB4RTYKKyAgfTsKKyAgc3RhdGljIGJ5dGUga2V5XzI1NlszMl0gPSB7CisgICAgMHhENCwgMHgzQiwgMHhCNywgMHg1NSwgMHg2RSwgMHhBMywgMHgyRSwgMHg0NiwKKyAgICAweEYyLCAweEEyLCAweDgyLCAweEI3LCAweEQ0LCAweDVCLCAweDRFLCAweDBELAorICAgIDB4NTcsIDB4RkYsIDB4NzMsIDB4OUQsIDB4NEQsIDB4QzksIDB4MkMsIDB4MUIsCisgICAgMHhENywgMHhGQywgMHgwMSwgMHg3MCwgMHgwQywgMHhDOCwgMHgyMSwgMHg2RgorICB9OworICBzdGF0aWMgY29uc3QgYnl0ZSBjaXBoZXJ0ZXh0XzI1NlsxNl0gPSB7CisgICAgMHg2QywgMHhCNCwgMHg1NiwgMHgxQywgMHg0MCwgMHhCRiwgMHgwQSwgMHg5NywKKyAgICAweDA1LCAweDkzLCAweDFDLCAweEI2LCAweEQ0LCAweDA4LCAweEU3LCAweEZBCisgIH07CisKKyAgdHdvZmlzaF9zZXRrZXkgKCZjdHgsIGtleSwgc2l6ZW9mKGtleSkpOworICB0d29maXNoX2VuY3J5cHQgKCZjdHgsIHNjcmF0Y2gsIHBsYWludGV4dCk7CisgIGlmIChtZW1jbXAgKHNjcmF0Y2gsIGNpcGhlcnRleHQsIHNpemVvZiAoY2lwaGVydGV4dCkpKQorICAgIHJldHVybiAiVHdvZmlzaC0xMjggdGVzdCBlbmNyeXB0aW9uIGZhaWxlZC4iOworICB0d29maXNoX2RlY3J5cHQgKCZjdHgsIHNjcmF0Y2gsIHNjcmF0Y2gpOworICBpZiAobWVtY21wIChzY3JhdGNoLCBwbGFpbnRleHQsIHNpemVvZiAocGxhaW50ZXh0KSkpCisgICAgcmV0dXJuICJUd29maXNoLTEyOCB0ZXN0IGRlY3J5cHRpb24gZmFpbGVkLiI7CisKKyAgdHdvZmlzaF9zZXRrZXkgKCZjdHgsIGtleV8yNTYsIHNpemVvZihrZXlfMjU2KSk7CisgIHR3b2Zpc2hfZW5jcnlwdCAoJmN0eCwgc2NyYXRjaCwgcGxhaW50ZXh0XzI1Nik7CisgIGlmIChtZW1jbXAgKHNjcmF0Y2gsIGNpcGhlcnRleHRfMjU2LCBzaXplb2YgKGNpcGhlcnRleHRfMjU2KSkpCisgICAgcmV0dXJuICJUd29maXNoLTI1NiB0ZXN0IGVuY3J5cHRpb24gZmFpbGVkLiI7CisgIHR3b2Zpc2hfZGVjcnlwdCAoJmN0eCwgc2NyYXRjaCwgc2NyYXRjaCk7CisgIGlmIChtZW1jbXAgKHNjcmF0Y2gsIHBsYWludGV4dF8yNTYsIHNpemVvZiAocGxhaW50ZXh0XzI1NikpKQorICAgIHJldHVybiAiVHdvZmlzaC0yNTYgdGVzdCBkZWNyeXB0aW9uIGZhaWxlZC4iOworCisgIHJldHVybiBOVUxMOworfQorDAorLyogTW9yZSBjb21wbGV0ZSB0ZXN0IHByb2dyYW0uCVRoaXMgZG9lcyAxMDAwIGVuY3J5cHRpb25zIGFuZCBkZWNyeXB0aW9ucworICogd2l0aCBlYWNoIG9mIDI1MCAxMjgtYml0IGtleXMgYW5kIDIwMDAgZW5jcnlwdGlvbnMgYW5kIGRlY3J5cHRpb25zIHdpdGgKKyAqIGVhY2ggb2YgMTI1IDI1Ni1iaXQga2V5cywgdXNpbmcgYSBmZWVkYmFjayBzY2hlbWUgc2ltaWxhciB0byBhIEZlaXN0ZWwKKyAqIGNpcGhlciwgc28gYXMgdG8gYmUgc3VyZSBvZiB0ZXN0aW5nIGFsbCB0aGUgdGFibGUgZW50cmllcyBwcmV0dHkKKyAqIHRob3JvdWdobHkuCVdlIGtlZXAgY2hhbmdpbmcgdGhlIGtleXMgc28gYXMgdG8gZ2V0IGEgbW9yZSBtZWFuaW5nZnVsCisgKiBwZXJmb3JtYW5jZSBudW1iZXIsIHNpbmNlIHRoZSBrZXkgc2V0dXAgaXMgbm9uLXRyaXZpYWwgZm9yIFR3b2Zpc2guICovCisKKyNpZmRlZiBURVNUCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworaW50CittYWluKCkKK3sKKyAgVFdPRklTSF9jb250ZXh0IGN0eDsgICAgIC8qIEV4cGFuZGVkIGtleS4gKi8KKyAgaW50IGksIGo7CQkgICAgLyogTG9vcCBjb3VudGVycy4gKi8KKworICBjb25zdCBjaGFyICplbmNyeXB0X21zZzsgLyogTWVzc2FnZSB0byBwcmludCByZWdhcmRpbmcgZW5jcnlwdGlvbiB0ZXN0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdGhlIHByaW50ZiBpcyBkb25lIG91dHNpZGUgdGhlIGxvb3AgdG8gYXZvaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHN0dWZmaW5nIHVwIHRoZSB0aW1pbmcuICovCisgIGNsb2NrX3QgdGltZXI7IC8qIEZvciBjb21wdXRpbmcgZWxhcHNlZCB0aW1lLiAqLworCisgIC8qIFRlc3QgYnVmZmVyLiAqLworICBieXRlIGJ1ZmZlcls0XVsxNl0gPSB7CisgICAgezB4MDAsIDB4MTEsIDB4MjIsIDB4MzMsIDB4NDQsIDB4NTUsIDB4NjYsIDB4NzcsCisgICAgIDB4ODgsIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0MsIDB4REQsIDB4RUUsIDB4RkZ9LAorICAgIHsweDBGLCAweDFFLCAweDJELCAweDNDLCAweDRCLCAweDVBLCAweDY5LCAweDc4LAorICAgICAweDg3LCAweDk2LCAweEE1LCAweEI0LCAweEMzLCAweEQyICwweEUxLCAweEYwfSwKKyAgICB7MHgwMSwgMHgyMywgMHg0NSwgMHg2NywgMHg4OSwgMHhBQiwgMHhDRCwgMHhFRiwKKyAgICAgMHhGRSwgMHhEQywgMHhCQSwgMHg5OCwgMHg3NiwgMHg1NCAsMHgzMiwgMHgxMH0sCisgICAgezB4MDEsIDB4MjMsIDB4NDUsIDB4NjcsIDB4NzYsIDB4NTQgLDB4MzIsIDB4MTAsCisgICAgIDB4ODksIDB4QUIsIDB4Q0QsIDB4RUYsIDB4RkUsIDB4REMsIDB4QkEsIDB4OTh9CisgIH07CisKKyAgLyogRXhwZWN0ZWQgb3V0cHV0cyBmb3IgdGhlIG1pbGxpb24tb3BlcmF0aW9uIHRlc3QgKi8KKyAgc3RhdGljIGNvbnN0IGJ5dGUgdGVzdF9lbmNyeXB0WzRdWzE2XSA9IHsKKyAgICB7MHhDOCwgMHgyMywgMHhCOCwgMHhCNywgMHg2QiwgMHhGRSwgMHg5MSwgMHgxMywKKyAgICAgMHgyRiwgMHhBNywgMHg1RSwgMHhFNiwgMHg5NCwgMHg3NywgMHg2RiwgMHg2Qn0sCisgICAgezB4OTAsIDB4MzYsIDB4RDgsIDB4MjksIDB4RDUsIDB4OTYsIDB4QzIsIDB4OEUsCisgICAgIDB4RTQsIDB4RkYsIDB4NzYsIDB4QkMsIDB4RTUsIDB4NzcsIDB4ODgsIDB4Mjd9LAorICAgIHsweEI4LCAweDc4LCAweDY5LCAweEFGLCAweDQyLCAweDhCLCAweDQ4LCAweDY0LAorICAgICAweEY3LCAweEU5LCAweEYzLCAweDlDLCAweDQyLCAweDE4LCAweDdCLCAweDczfSwKKyAgICB7MHg3QSwgMHg4OCwgMHhGQiwgMHhFQiwgMHg5MCwgMHhBNCwgMHhCNCwgMHhBOCwKKyAgICAgMHg0MywgMHhBMywgMHgxRCwgMHhGMSwgMHgyNiwgMHhDNCwgMHg1MywgMHg1N30KKyAgfTsKKyAgc3RhdGljIGNvbnN0IGJ5dGUgdGVzdF9kZWNyeXB0WzRdWzE2XSA9IHsKKyAgICB7MHgwMCwgMHgxMSwgMHgyMiwgMHgzMywgMHg0NCwgMHg1NSwgMHg2NiwgMHg3NywKKyAgICAgMHg4OCwgMHg5OSwgMHhBQSwgMHhCQiwgMHhDQywgMHhERCwgMHhFRSwgMHhGRn0sCisgICAgezB4MEYsIDB4MUUsIDB4MkQsIDB4M0MsIDB4NEIsIDB4NUEsIDB4NjksIDB4NzgsCisgICAgIDB4ODcsIDB4OTYsIDB4QTUsIDB4QjQsIDB4QzMsIDB4RDIgLDB4RTEsIDB4RjB9LAorICAgIHsweDAxLCAweDIzLCAweDQ1LCAweDY3LCAweDg5LCAweEFCLCAweENELCAweEVGLAorICAgICAweEZFLCAweERDLCAweEJBLCAweDk4LCAweDc2LCAweDU0ICwweDMyLCAweDEwfSwKKyAgICB7MHgwMSwgMHgyMywgMHg0NSwgMHg2NywgMHg3NiwgMHg1NCAsMHgzMiwgMHgxMCwKKyAgICAgMHg4OSwgMHhBQiwgMHhDRCwgMHhFRiwgMHhGRSwgMHhEQywgMHhCQSwgMHg5OH0KKyAgfTsKKworICAvKiBTdGFydCB0aGUgdGltZXIgdGlja2luZy4gKi8KKyAgdGltZXIgPSBjbG9jayAoKTsKKworICAvKiBFbmNyeXB0aW9uIHRlc3QuICovCisgIGZvciAoaSA9IDA7IGkgPCAxMjU7IGkrKykgCisgICAgeworICAgICAgdHdvZmlzaF9zZXRrZXkgKCZjdHgsIGJ1ZmZlclswXSwgc2l6ZW9mIChidWZmZXJbMF0pKTsKKyAgICAgIGZvciAoaiA9IDA7IGogPCAxMDAwOyBqKyspCisgICAgICAgIHR3b2Zpc2hfZW5jcnlwdCAoJmN0eCwgYnVmZmVyWzJdLCBidWZmZXJbMl0pOworICAgICAgdHdvZmlzaF9zZXRrZXkgKCZjdHgsIGJ1ZmZlclsxXSwgc2l6ZW9mIChidWZmZXJbMV0pKTsKKyAgICAgIGZvciAoaiA9IDA7IGogPCAxMDAwOyBqKyspCisgICAgICAgIHR3b2Zpc2hfZW5jcnlwdCAoJmN0eCwgYnVmZmVyWzNdLCBidWZmZXJbM10pOworICAgICAgdHdvZmlzaF9zZXRrZXkgKCZjdHgsIGJ1ZmZlclsyXSwgc2l6ZW9mIChidWZmZXJbMl0pKjIpOworICAgICAgZm9yIChqID0gMDsgaiA8IDEwMDA7IGorKykgeworICAgICAgICB0d29maXNoX2VuY3J5cHQgKCZjdHgsIGJ1ZmZlclswXSwgYnVmZmVyWzBdKTsKKyAgICAgICAgdHdvZmlzaF9lbmNyeXB0ICgmY3R4LCBidWZmZXJbMV0sIGJ1ZmZlclsxXSk7CisgICAgICB9CisgICAgfQorICBlbmNyeXB0X21zZyA9IG1lbWNtcCAoYnVmZmVyLCB0ZXN0X2VuY3J5cHQsIHNpemVvZiAodGVzdF9lbmNyeXB0KSkgPworICAgICJlbmNyeXB0aW9uIGZhaWx1cmUhXG4iIDogImVuY3J5cHRpb24gT0shXG4iOworCisgIC8qIERlY3J5cHRpb24gdGVzdC4gKi8KKyAgZm9yIChpID0gMDsgaSA8IDEyNTsgaSsrKSAKKyAgICB7CisgICAgICB0d29maXNoX3NldGtleSAoJmN0eCwgYnVmZmVyWzJdLCBzaXplb2YgKGJ1ZmZlclsyXSkqMik7CisgICAgICBmb3IgKGogPSAwOyBqIDwgMTAwMDsgaisrKSB7CisgICAgICAgIHR3b2Zpc2hfZGVjcnlwdCAoJmN0eCwgYnVmZmVyWzBdLCBidWZmZXJbMF0pOworICAgICAgICB0d29maXNoX2RlY3J5cHQgKCZjdHgsIGJ1ZmZlclsxXSwgYnVmZmVyWzFdKTsKKyAgICAgIH0KKyAgICAgIHR3b2Zpc2hfc2V0a2V5ICgmY3R4LCBidWZmZXJbMV0sIHNpemVvZiAoYnVmZmVyWzFdKSk7CisgICAgICBmb3IgKGogPSAwOyBqIDwgMTAwMDsgaisrKQorICAgICAgICB0d29maXNoX2RlY3J5cHQgKCZjdHgsIGJ1ZmZlclszXSwgYnVmZmVyWzNdKTsKKyAgICAgIHR3b2Zpc2hfc2V0a2V5ICgmY3R4LCBidWZmZXJbMF0sIHNpemVvZiAoYnVmZmVyWzBdKSk7CisgICAgICBmb3IgKGogPSAwOyBqIDwgMTAwMDsgaisrKQorICAgICAgICB0d29maXNoX2RlY3J5cHQgKCZjdHgsIGJ1ZmZlclsyXSwgYnVmZmVyWzJdKTsKKyAgICB9CisKKyAgLyogU3RvcCB0aGUgdGltZXIsIGFuZCBwcmludCByZXN1bHRzLiAqLworICB0aW1lciA9IGNsb2NrICgpIC0gdGltZXI7CisgIHByaW50ZiAoZW5jcnlwdF9tc2cpOworICBwcmludGYgKG1lbWNtcCAoYnVmZmVyLCB0ZXN0X2RlY3J5cHQsIHNpemVvZiAodGVzdF9kZWNyeXB0KSkgPworICAgICAgICAgICJkZWNyeXB0aW9uIGZhaWx1cmUhXG4iIDogImRlY3J5cHRpb24gT0shXG4iKTsKKyAgcHJpbnRmICgiZWxhcHNlZCB0aW1lOiAlLjFmIHMuXG4iLCAoZmxvYXQpIHRpbWVyIC8gQ0xPQ0tTX1BFUl9TRUMpOworCisgIHJldHVybiAwOworfQorCisjZW5kaWYgLyogVEVTVCAqLworCisMCisKK2djcnlfY2lwaGVyX3NwZWNfdCBfZ2NyeV9jaXBoZXJfc3BlY190d29maXNoID0KKyAgeworICAgICJUV09GSVNIIiwgTlVMTCwgTlVMTCwgMTYsIDI1Niwgc2l6ZW9mIChUV09GSVNIX2NvbnRleHQpLAorICAgIHR3b2Zpc2hfc2V0a2V5LCB0d29maXNoX2VuY3J5cHQsIHR3b2Zpc2hfZGVjcnlwdAorICB9OworCitnY3J5X2NpcGhlcl9zcGVjX3QgX2djcnlfY2lwaGVyX3NwZWNfdHdvZmlzaDEyOCA9CisgIHsKKyAgICAiVFdPRklTSDEyOCIsIE5VTEwsIE5VTEwsIDE2LCAxMjgsIHNpemVvZiAoVFdPRklTSF9jb250ZXh0KSwKKyAgICB0d29maXNoX3NldGtleSwgdHdvZmlzaF9lbmNyeXB0LCB0d29maXNoX2RlY3J5cHQKKyAgfTsKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9jaXBoZXIvd2hpcmxwb29sLmMgYi9saWJnY3J5cHQtMS40LjYvY2lwaGVyL3doaXJscG9vbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMDI5ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvY2lwaGVyL3doaXJscG9vbC5jCkBAIC0wLDAgKzEsMTQwNiBAQAorLyogd2hpcmxwb29sLmMgLSBXaGlybHBvb2wgaGFzaGluZyBhbGdvcml0aG0KKyAqIENvcHlyaWdodCAoQykgMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKgorICovCisKKy8qIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFdoaXJscG9vbCBoYXNoaW5nIGFsZ29yaXRobSwgd2hpY2gKKyAgIGhhcyBiZWVuIGRldmVsb3BlZCBieSBWaW5jZW50IFJpam1lbiBhbmQgUGF1bG8gUy4gTC4gTS4gQmFycmV0bzsKKyAgIGl0J3MgaG9tZXBhZ2UgaXMgbG9jYXRlZCBhdDoKKyAgIGh0dHA6Ly9wbGFuZXRhLnRlcnJhLmNvbS5ici9pbmZvcm1hdGljYS9wYXVsb2JhcnJldG8vV2hpcmxwb29sUGFnZS5odG1sLgorCisgICBUaGUgUy1Cb3hlcyBhbmQgdGhlIHN0cnVjdHVyZSBvZiB0aGUgbWFpbiB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiwKKyAgIHdoaWNoIGltcGxlbWVudHMgYW4gb3B0aW1pemVkIHZlcnNpb24gb2YgdGhlIGFsZ29yaXRobSwgaXMgdGFrZW4KKyAgIGZyb20gdGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBhdmFpbGFibGUgZnJvbQorICAgaHR0cDovL3BsYW5ldGEudGVycmEuY29tLmJyL2luZm9ybWF0aWNhL3BhdWxvYmFycmV0by93aGlybHBvb2wuemlwLiAgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJ0eXBlcy5oIgorI2luY2x1ZGUgImcxMGxpYi5oIgorI2luY2x1ZGUgIm1lbW9yeS5oIgorI2luY2x1ZGUgImNpcGhlci5oIgorCisjaW5jbHVkZSAiYml0aGVscC5oIgorCisvKiBTaXplIG9mIGEgd2hpcmxwb29sIGJsb2NrIChpbiBieXRlcykuICAqLworI2RlZmluZSBCTE9DS19TSVpFIDY0CisKKy8qIE51bWJlciBvZiByb3VuZHMuICAqLworI2RlZmluZSBSIDEwCisKKwwKKworLyogVHlwZXMuICAqLwordHlwZWRlZiB1NjQgd2hpcmxwb29sX2Jsb2NrX3RbQkxPQ0tfU0laRSAvIDhdOworCit0eXBlZGVmIHN0cnVjdCB7CisgIHdoaXJscG9vbF9ibG9ja190IGhhc2hfc3RhdGU7CisgIHVuc2lnbmVkIGNoYXIgYnVmZmVyW0JMT0NLX1NJWkVdOworICBzaXplX3QgY291bnQ7CisgIHVuc2lnbmVkIGNoYXIgbGVuZ3RoWzMyXTsKK30gd2hpcmxwb29sX2NvbnRleHRfdDsKKworDAorCisvKiBNYWNyb3MuICovCisKKy8qIENvbnZlcnQgdGhlIHRoZSBidWZmZXIgQlVGRkVSIGludG8gYSBibG9jayBCTE9DSywgdXNpbmcgSSBhcworICAgY291bnRlci4gICovCisjZGVmaW5lIGJ1ZmZlcl90b19ibG9jayhidWZmZXIsIGJsb2NrLCBpKSBcCisgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIFwKKyAgICAoYmxvY2spW2ldID0gKCh1NjQpICgwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB8ICgoKHU2NCkgKGJ1ZmZlcilbaSAqIDggKyAwXSkgPDwgNTYpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB8ICgoKHU2NCkgKGJ1ZmZlcilbaSAqIDggKyAxXSkgPDwgNDgpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB8ICgoKHU2NCkgKGJ1ZmZlcilbaSAqIDggKyAyXSkgPDwgNDApIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB8ICgoKHU2NCkgKGJ1ZmZlcilbaSAqIDggKyAzXSkgPDwgMzIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB8ICgoKHU2NCkgKGJ1ZmZlcilbaSAqIDggKyA0XSkgPDwgMjQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB8ICgoKHU2NCkgKGJ1ZmZlcilbaSAqIDggKyA1XSkgPDwgMTYpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB8ICgoKHU2NCkgKGJ1ZmZlcilbaSAqIDggKyA2XSkgPDwgIDgpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB8ICgoKHU2NCkgKGJ1ZmZlcilbaSAqIDggKyA3XSkgPDwgIDApKSk7CisKKy8qIENvbnZlcnQgdGhlIGJsb2NrIEJMT0NLIGludG8gYSBidWZmZXIgQlVGRkVSLCB1c2luZyBJIGFzCisgICBjb3VudGVyLiAgKi8KKyNkZWZpbmUgYmxvY2tfdG9fYnVmZmVyKGJ1ZmZlciwgYmxvY2ssIGkpIFwKKyAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgXAorICAgIHsgXAorICAgICAgKGJ1ZmZlcilbaSAqIDggKyAwXSA9IChibG9ja1tpXSA+PiA1NikgJiAweEZGOyBcCisgICAgICAoYnVmZmVyKVtpICogOCArIDFdID0gKGJsb2NrW2ldID4+IDQ4KSAmIDB4RkY7IFwKKyAgICAgIChidWZmZXIpW2kgKiA4ICsgMl0gPSAoYmxvY2tbaV0gPj4gNDApICYgMHhGRjsgXAorICAgICAgKGJ1ZmZlcilbaSAqIDggKyAzXSA9IChibG9ja1tpXSA+PiAzMikgJiAweEZGOyBcCisgICAgICAoYnVmZmVyKVtpICogOCArIDRdID0gKGJsb2NrW2ldID4+IDI0KSAmIDB4RkY7IFwKKyAgICAgIChidWZmZXIpW2kgKiA4ICsgNV0gPSAoYmxvY2tbaV0gPj4gMTYpICYgMHhGRjsgXAorICAgICAgKGJ1ZmZlcilbaSAqIDggKyA2XSA9IChibG9ja1tpXSA+PiAgOCkgJiAweEZGOyBcCisgICAgICAoYnVmZmVyKVtpICogOCArIDddID0gKGJsb2NrW2ldID4+ICAwKSAmIDB4RkY7IFwKKyAgICB9CisKKy8qIENvcHkgdGhlIGJsb2NrIEJMT0NLX1NSQyB0byBCTE9DS19EU1QsIHVzaW5nIEkgYXMgY291bnRlci4gICovCisjZGVmaW5lIGJsb2NrX2NvcHkoYmxvY2tfZHN0LCBibG9ja19zcmMsIGkpIFwKKyAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgXAorICAgIGJsb2NrX2RzdFtpXSA9IGJsb2NrX3NyY1tpXTsKKworLyogWE9SIHRoZSBibG9jayBCTE9DS19TUkMgaW50byBCTE9DS19EU1QsIHVzaW5nIEkgYXMgY291bnRlci4gICovCisjZGVmaW5lIGJsb2NrX3hvcihibG9ja19kc3QsIGJsb2NrX3NyYywgaSkgXAorICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSBcCisgICAgYmxvY2tfZHN0W2ldIF49IGJsb2NrX3NyY1tpXTsKKworDAorCisvKiBSb3VuZCBjb25zdGFudHMuICAqLworc3RhdGljIGNvbnN0IHU2NCByY1tSXSA9CisgIHsKKyAgICBVNjRfQyAoMHgxODIzYzZlODg3YjgwMTRmKSwKKyAgICBVNjRfQyAoMHgzNmE2ZDJmNTc5NmY5MTUyKSwKKyAgICBVNjRfQyAoMHg2MGJjOWI4ZWEzMGM3YjM1KSwKKyAgICBVNjRfQyAoMHgxZGUwZDdjMjJlNGJmZTU3KSwKKyAgICBVNjRfQyAoMHgxNTc3MzdlNTlmZjA0YWRhKSwKKyAgICBVNjRfQyAoMHg1OGM5MjkwYWIxYTA2Yjg1KSwKKyAgICBVNjRfQyAoMHhiZDVkMTBmNGNiM2UwNTY3KSwKKyAgICBVNjRfQyAoMHhlNDI3NDE4YmE3N2Q5NWQ4KSwKKyAgICBVNjRfQyAoMHhmYmVlN2M2NmRkMTc0NzllKSwKKyAgICBVNjRfQyAoMHhjYTJkYmYwN2FkNWE4MzMzKSwKKyAgfTsKKyAgCisMCisKKy8qIE1haW4gbG9va3VwIGJveGVzLiAgKi8KK3N0YXRpYyBjb25zdCB1NjQgQzBbMjU2XSA9CisgIHsKKyAgICBVNjRfQyAoMHgxODE4NjAxOGMwNzgzMGQ4KSwgVTY0X0MgKDB4MjMyMzhjMjMwNWFmNDYyNiksCisgICAgVTY0X0MgKDB4YzZjNjNmYzY3ZWY5OTFiOCksIFU2NF9DICgweGU4ZTg4N2U4MTM2ZmNkZmIpLAorICAgIFU2NF9DICgweDg3ODcyNjg3NGNhMTEzY2IpLCBVNjRfQyAoMHhiOGI4ZGFiOGE5NjI2ZDExKSwKKyAgICBVNjRfQyAoMHgwMTAxMDQwMTA4MDUwMjA5KSwgVTY0X0MgKDB4NGY0ZjIxNGY0MjZlOWUwZCksCisgICAgVTY0X0MgKDB4MzYzNmQ4MzZhZGVlNmM5YiksIFU2NF9DICgweGE2YTZhMmE2NTkwNDUxZmYpLAorICAgIFU2NF9DICgweGQyZDI2ZmQyZGViZGI5MGMpLCBVNjRfQyAoMHhmNWY1ZjNmNWZiMDZmNzBlKSwKKyAgICBVNjRfQyAoMHg3OTc5Zjk3OWVmODBmMjk2KSwgVTY0X0MgKDB4NmY2ZmExNmY1ZmNlZGUzMCksCisgICAgVTY0X0MgKDB4OTE5MTdlOTFmY2VmM2Y2ZCksIFU2NF9DICgweDUyNTI1NTUyYWEwN2E0ZjgpLAorICAgIFU2NF9DICgweDYwNjA5ZDYwMjdmZGMwNDcpLCBVNjRfQyAoMHhiY2JjY2FiYzg5NzY2NTM1KSwKKyAgICBVNjRfQyAoMHg5YjliNTY5YmFjY2QyYjM3KSwgVTY0X0MgKDB4OGU4ZTAyOGUwNDhjMDE4YSksCisgICAgVTY0X0MgKDB4YTNhM2I2YTM3MTE1NWJkMiksIFU2NF9DICgweDBjMGMzMDBjNjAzYzE4NmMpLAorICAgIFU2NF9DICgweDdiN2JmMTdiZmY4YWY2ODQpLCBVNjRfQyAoMHgzNTM1ZDQzNWI1ZTE2YTgwKSwKKyAgICBVNjRfQyAoMHgxZDFkNzQxZGU4NjkzYWY1KSwgVTY0X0MgKDB4ZTBlMGE3ZTA1MzQ3ZGRiMyksCisgICAgVTY0X0MgKDB4ZDdkNzdiZDdmNmFjYjMyMSksIFU2NF9DICgweGMyYzIyZmMyNWVlZDk5OWMpLAorICAgIFU2NF9DICgweDJlMmViODJlNmQ5NjVjNDMpLCBVNjRfQyAoMHg0YjRiMzE0YjYyN2E5NjI5KSwKKyAgICBVNjRfQyAoMHhmZWZlZGZmZWEzMjFlMTVkKSwgVTY0X0MgKDB4NTc1NzQxNTc4MjE2YWVkNSksCisgICAgVTY0X0MgKDB4MTUxNTU0MTVhODQxMmFiZCksIFU2NF9DICgweDc3NzdjMTc3OWZiNmVlZTgpLAorICAgIFU2NF9DICgweDM3MzdkYzM3YTVlYjZlOTIpLCBVNjRfQyAoMHhlNWU1YjNlNTdiNTZkNzllKSwKKyAgICBVNjRfQyAoMHg5ZjlmNDY5ZjhjZDkyMzEzKSwgVTY0X0MgKDB4ZjBmMGU3ZjBkMzE3ZmQyMyksCisgICAgVTY0X0MgKDB4NGE0YTM1NGE2YTdmOTQyMCksIFU2NF9DICgweGRhZGE0ZmRhOWU5NWE5NDQpLAorICAgIFU2NF9DICgweDU4NTg3ZDU4ZmEyNWIwYTIpLCBVNjRfQyAoMHhjOWM5MDNjOTA2Y2E4ZmNmKSwKKyAgICBVNjRfQyAoMHgyOTI5YTQyOTU1OGQ1MjdjKSwgVTY0X0MgKDB4MGEwYTI4MGE1MDIyMTQ1YSksCisgICAgVTY0X0MgKDB4YjFiMWZlYjFlMTRmN2Y1MCksIFU2NF9DICgweGEwYTBiYWEwNjkxYTVkYzkpLAorICAgIFU2NF9DICgweDZiNmJiMTZiN2ZkYWQ2MTQpLCBVNjRfQyAoMHg4NTg1MmU4NTVjYWIxN2Q5KSwKKyAgICBVNjRfQyAoMHhiZGJkY2ViZDgxNzM2NzNjKSwgVTY0X0MgKDB4NWQ1ZDY5NWRkMjM0YmE4ZiksCisgICAgVTY0X0MgKDB4MTAxMDQwMTA4MDUwMjA5MCksIFU2NF9DICgweGY0ZjRmN2Y0ZjMwM2Y1MDcpLAorICAgIFU2NF9DICgweGNiY2IwYmNiMTZjMDhiZGQpLCBVNjRfQyAoMHgzZTNlZjgzZWVkYzY3Y2QzKSwKKyAgICBVNjRfQyAoMHgwNTA1MTQwNTI4MTEwYTJkKSwgVTY0X0MgKDB4Njc2NzgxNjcxZmU2Y2U3OCksCisgICAgVTY0X0MgKDB4ZTRlNGI3ZTQ3MzUzZDU5NyksIFU2NF9DICgweDI3Mjc5YzI3MjViYjRlMDIpLAorICAgIFU2NF9DICgweDQxNDExOTQxMzI1ODgyNzMpLCBVNjRfQyAoMHg4YjhiMTY4YjJjOWQwYmE3KSwKKyAgICBVNjRfQyAoMHhhN2E3YTZhNzUxMDE1M2Y2KSwgVTY0X0MgKDB4N2Q3ZGU5N2RjZjk0ZmFiMiksCisgICAgVTY0X0MgKDB4OTU5NTZlOTVkY2ZiMzc0OSksIFU2NF9DICgweGQ4ZDg0N2Q4OGU5ZmFkNTYpLAorICAgIFU2NF9DICgweGZiZmJjYmZiOGIzMGViNzApLCBVNjRfQyAoMHhlZWVlOWZlZTIzNzFjMWNkKSwKKyAgICBVNjRfQyAoMHg3YzdjZWQ3Y2M3OTFmOGJiKSwgVTY0X0MgKDB4NjY2Njg1NjYxN2UzY2M3MSksCisgICAgVTY0X0MgKDB4ZGRkZDUzZGRhNjhlYTc3YiksIFU2NF9DICgweDE3MTc1YzE3Yjg0YjJlYWYpLAorICAgIFU2NF9DICgweDQ3NDcwMTQ3MDI0NjhlNDUpLCBVNjRfQyAoMHg5ZTllNDI5ZTg0ZGMyMTFhKSwKKyAgICBVNjRfQyAoMHhjYWNhMGZjYTFlYzU4OWQ0KSwgVTY0X0MgKDB4MmQyZGI0MmQ3NTk5NWE1OCksCisgICAgVTY0X0MgKDB4YmZiZmM2YmY5MTc5NjMyZSksIFU2NF9DICgweDA3MDcxYzA3MzgxYjBlM2YpLAorICAgIFU2NF9DICgweGFkYWQ4ZWFkMDEyMzQ3YWMpLCBVNjRfQyAoMHg1YTVhNzU1YWVhMmZiNGIwKSwKKyAgICBVNjRfQyAoMHg4MzgzMzY4MzZjYjUxYmVmKSwgVTY0X0MgKDB4MzMzM2NjMzM4NWZmNjZiNiksCisgICAgVTY0X0MgKDB4NjM2MzkxNjMzZmYyYzY1YyksIFU2NF9DICgweDAyMDIwODAyMTAwYTA0MTIpLAorICAgIFU2NF9DICgweGFhYWE5MmFhMzkzODQ5OTMpLCBVNjRfQyAoMHg3MTcxZDk3MWFmYThlMmRlKSwKKyAgICBVNjRfQyAoMHhjOGM4MDdjODBlY2Y4ZGM2KSwgVTY0X0MgKDB4MTkxOTY0MTljODdkMzJkMSksCisgICAgVTY0X0MgKDB4NDk0OTM5NDk3MjcwOTIzYiksIFU2NF9DICgweGQ5ZDk0M2Q5ODY5YWFmNWYpLAorICAgIFU2NF9DICgweGYyZjJlZmYyYzMxZGY5MzEpLCBVNjRfQyAoMHhlM2UzYWJlMzRiNDhkYmE4KSwKKyAgICBVNjRfQyAoMHg1YjViNzE1YmUyMmFiNmI5KSwgVTY0X0MgKDB4ODg4ODFhODgzNDkyMGRiYyksCisgICAgVTY0X0MgKDB4OWE5YTUyOWFhNGM4MjkzZSksIFU2NF9DICgweDI2MjY5ODI2MmRiZTRjMGIpLAorICAgIFU2NF9DICgweDMyMzJjODMyOGRmYTY0YmYpLCBVNjRfQyAoMHhiMGIwZmFiMGU5NGE3ZDU5KSwKKyAgICBVNjRfQyAoMHhlOWU5ODNlOTFiNmFjZmYyKSwgVTY0X0MgKDB4MGYwZjNjMGY3ODMzMWU3NyksCisgICAgVTY0X0MgKDB4ZDVkNTczZDVlNmE2YjczMyksIFU2NF9DICgweDgwODAzYTgwNzRiYTFkZjQpLAorICAgIFU2NF9DICgweGJlYmVjMmJlOTk3YzYxMjcpLCBVNjRfQyAoMHhjZGNkMTNjZDI2ZGU4N2ViKSwKKyAgICBVNjRfQyAoMHgzNDM0ZDAzNGJkZTQ2ODg5KSwgVTY0X0MgKDB4NDg0ODNkNDg3YTc1OTAzMiksCisgICAgVTY0X0MgKDB4ZmZmZmRiZmZhYjI0ZTM1NCksIFU2NF9DICgweDdhN2FmNTdhZjc4ZmY0OGQpLAorICAgIFU2NF9DICgweDkwOTA3YTkwZjRlYTNkNjQpLCBVNjRfQyAoMHg1ZjVmNjE1ZmMyM2ViZTlkKSwKKyAgICBVNjRfQyAoMHgyMDIwODAyMDFkYTA0MDNkKSwgVTY0X0MgKDB4Njg2OGJkNjg2N2Q1ZDAwZiksCisgICAgVTY0X0MgKDB4MWExYTY4MWFkMDcyMzRjYSksIFU2NF9DICgweGFlYWU4MmFlMTkyYzQxYjcpLAorICAgIFU2NF9DICgweGI0YjRlYWI0Yzk1ZTc1N2QpLCBVNjRfQyAoMHg1NDU0NGQ1NDlhMTlhOGNlKSwKKyAgICBVNjRfQyAoMHg5MzkzNzY5M2VjZTUzYjdmKSwgVTY0X0MgKDB4MjIyMjg4MjIwZGFhNDQyZiksCisgICAgVTY0X0MgKDB4NjQ2NDhkNjQwN2U5Yzg2MyksIFU2NF9DICgweGYxZjFlM2YxZGIxMmZmMmEpLAorICAgIFU2NF9DICgweDczNzNkMTczYmZhMmU2Y2MpLCBVNjRfQyAoMHgxMjEyNDgxMjkwNWEyNDgyKSwKKyAgICBVNjRfQyAoMHg0MDQwMWQ0MDNhNWQ4MDdhKSwgVTY0X0MgKDB4MDgwODIwMDg0MDI4MTA0OCksCisgICAgVTY0X0MgKDB4YzNjMzJiYzM1NmU4OWI5NSksIFU2NF9DICgweGVjZWM5N2VjMzM3YmM1ZGYpLAorICAgIFU2NF9DICgweGRiZGI0YmRiOTY5MGFiNGQpLCBVNjRfQyAoMHhhMWExYmVhMTYxMWY1ZmMwKSwKKyAgICBVNjRfQyAoMHg4ZDhkMGU4ZDFjODMwNzkxKSwgVTY0X0MgKDB4M2QzZGY0M2RmNWM5N2FjOCksCisgICAgVTY0X0MgKDB4OTc5NzY2OTdjY2YxMzM1YiksIFU2NF9DICgweDAwMDAwMDAwMDAwMDAwMDApLAorICAgIFU2NF9DICgweGNmY2YxYmNmMzZkNDgzZjkpLCBVNjRfQyAoMHgyYjJiYWMyYjQ1ODc1NjZlKSwKKyAgICBVNjRfQyAoMHg3Njc2YzU3Njk3YjNlY2UxKSwgVTY0X0MgKDB4ODI4MjMyODI2NGIwMTllNiksCisgICAgVTY0X0MgKDB4ZDZkNjdmZDZmZWE5YjEyOCksIFU2NF9DICgweDFiMWI2YzFiZDg3NzM2YzMpLAorICAgIFU2NF9DICgweGI1YjVlZWI1YzE1Yjc3NzQpLCBVNjRfQyAoMHhhZmFmODZhZjExMjk0M2JlKSwKKyAgICBVNjRfQyAoMHg2YTZhYjU2YTc3ZGZkNDFkKSwgVTY0X0MgKDB4NTA1MDVkNTBiYTBkYTBlYSksCisgICAgVTY0X0MgKDB4NDU0NTA5NDUxMjRjOGE1NyksIFU2NF9DICgweGYzZjNlYmYzY2IxOGZiMzgpLAorICAgIFU2NF9DICgweDMwMzBjMDMwOWRmMDYwYWQpLCBVNjRfQyAoMHhlZmVmOWJlZjJiNzRjM2M0KSwKKyAgICBVNjRfQyAoMHgzZjNmZmMzZmU1YzM3ZWRhKSwgVTY0X0MgKDB4NTU1NTQ5NTU5MjFjYWFjNyksCisgICAgVTY0X0MgKDB4YTJhMmIyYTI3OTEwNTlkYiksIFU2NF9DICgweGVhZWE4ZmVhMDM2NWM5ZTkpLAorICAgIFU2NF9DICgweDY1NjU4OTY1MGZlY2NhNmEpLCBVNjRfQyAoMHhiYWJhZDJiYWI5Njg2OTAzKSwKKyAgICBVNjRfQyAoMHgyZjJmYmMyZjY1OTM1ZTRhKSwgVTY0X0MgKDB4YzBjMDI3YzA0ZWU3OWQ4ZSksCisgICAgVTY0X0MgKDB4ZGVkZTVmZGViZTgxYTE2MCksIFU2NF9DICgweDFjMWM3MDFjZTA2YzM4ZmMpLAorICAgIFU2NF9DICgweGZkZmRkM2ZkYmIyZWU3NDYpLCBVNjRfQyAoMHg0ZDRkMjk0ZDUyNjQ5YTFmKSwKKyAgICBVNjRfQyAoMHg5MjkyNzI5MmU0ZTAzOTc2KSwgVTY0X0MgKDB4NzU3NWM5NzU4ZmJjZWFmYSksCisgICAgVTY0X0MgKDB4MDYwNjE4MDYzMDFlMGMzNiksIFU2NF9DICgweDhhOGExMjhhMjQ5ODA5YWUpLAorICAgIFU2NF9DICgweGIyYjJmMmIyZjk0MDc5NGIpLCBVNjRfQyAoMHhlNmU2YmZlNjYzNTlkMTg1KSwKKyAgICBVNjRfQyAoMHgwZTBlMzgwZTcwMzYxYzdlKSwgVTY0X0MgKDB4MWYxZjdjMWZmODYzM2VlNyksCisgICAgVTY0X0MgKDB4NjI2Mjk1NjIzN2Y3YzQ1NSksIFU2NF9DICgweGQ0ZDQ3N2Q0ZWVhM2I1M2EpLAorICAgIFU2NF9DICgweGE4YTg5YWE4MjkzMjRkODEpLCBVNjRfQyAoMHg5Njk2NjI5NmM0ZjQzMTUyKSwKKyAgICBVNjRfQyAoMHhmOWY5YzNmOTliM2FlZjYyKSwgVTY0X0MgKDB4YzVjNTMzYzU2NmY2OTdhMyksCisgICAgVTY0X0MgKDB4MjUyNTk0MjUzNWIxNGExMCksIFU2NF9DICgweDU5NTk3OTU5ZjIyMGIyYWIpLAorICAgIFU2NF9DICgweDg0ODQyYTg0NTRhZTE1ZDApLCBVNjRfQyAoMHg3MjcyZDU3MmI3YTdlNGM1KSwKKyAgICBVNjRfQyAoMHgzOTM5ZTQzOWQ1ZGQ3MmVjKSwgVTY0X0MgKDB4NGM0YzJkNGM1YTYxOTgxNiksCisgICAgVTY0X0MgKDB4NWU1ZTY1NWVjYTNiYmM5NCksIFU2NF9DICgweDc4NzhmZDc4ZTc4NWYwOWYpLAorICAgIFU2NF9DICgweDM4MzhlMDM4ZGRkODcwZTUpLCBVNjRfQyAoMHg4YzhjMGE4YzE0ODYwNTk4KSwKKyAgICBVNjRfQyAoMHhkMWQxNjNkMWM2YjJiZjE3KSwgVTY0X0MgKDB4YTVhNWFlYTU0MTBiNTdlNCksCisgICAgVTY0X0MgKDB4ZTJlMmFmZTI0MzRkZDlhMSksIFU2NF9DICgweDYxNjE5OTYxMmZmOGMyNGUpLAorICAgIFU2NF9DICgweGIzYjNmNmIzZjE0NTdiNDIpLCBVNjRfQyAoMHgyMTIxODQyMTE1YTU0MjM0KSwKKyAgICBVNjRfQyAoMHg5YzljNGE5Yzk0ZDYyNTA4KSwgVTY0X0MgKDB4MWUxZTc4MWVmMDY2M2NlZSksCisgICAgVTY0X0MgKDB4NDM0MzExNDMyMjUyODY2MSksIFU2NF9DICgweGM3YzczYmM3NzZmYzkzYjEpLAorICAgIFU2NF9DICgweGZjZmNkN2ZjYjMyYmU1NGYpLCBVNjRfQyAoMHgwNDA0MTAwNDIwMTQwODI0KSwKKyAgICBVNjRfQyAoMHg1MTUxNTk1MWIyMDhhMmUzKSwgVTY0X0MgKDB4OTk5OTVlOTliY2M3MmYyNSksCisgICAgVTY0X0MgKDB4NmQ2ZGE5NmQ0ZmM0ZGEyMiksIFU2NF9DICgweDBkMGQzNDBkNjgzOTFhNjUpLAorICAgIFU2NF9DICgweGZhZmFjZmZhODMzNWU5NzkpLCBVNjRfQyAoMHhkZmRmNWJkZmI2ODRhMzY5KSwKKyAgICBVNjRfQyAoMHg3ZTdlZTU3ZWQ3OWJmY2E5KSwgVTY0X0MgKDB4MjQyNDkwMjQzZGI0NDgxOSksCisgICAgVTY0X0MgKDB4M2IzYmVjM2JjNWQ3NzZmZSksIFU2NF9DICgweGFiYWI5NmFiMzEzZDRiOWEpLAorICAgIFU2NF9DICgweGNlY2UxZmNlM2VkMTgxZjApLCBVNjRfQyAoMHgxMTExNDQxMTg4NTUyMjk5KSwKKyAgICBVNjRfQyAoMHg4ZjhmMDY4ZjBjODkwMzgzKSwgVTY0X0MgKDB4NGU0ZTI1NGU0YTZiOWMwNCksCisgICAgVTY0X0MgKDB4YjdiN2U2YjdkMTUxNzM2NiksIFU2NF9DICgweGViZWI4YmViMGI2MGNiZTApLAorICAgIFU2NF9DICgweDNjM2NmMDNjZmRjYzc4YzEpLCBVNjRfQyAoMHg4MTgxM2U4MTdjYmYxZmZkKSwKKyAgICBVNjRfQyAoMHg5NDk0NmE5NGQ0ZmUzNTQwKSwgVTY0X0MgKDB4ZjdmN2ZiZjdlYjBjZjMxYyksCisgICAgVTY0X0MgKDB4YjliOWRlYjlhMTY3NmYxOCksIFU2NF9DICgweDEzMTM0YzEzOTg1ZjI2OGIpLAorICAgIFU2NF9DICgweDJjMmNiMDJjN2Q5YzU4NTEpLCBVNjRfQyAoMHhkM2QzNmJkM2Q2YjhiYjA1KSwKKyAgICBVNjRfQyAoMHhlN2U3YmJlNzZiNWNkMzhjKSwgVTY0X0MgKDB4NmU2ZWE1NmU1N2NiZGMzOSksCisgICAgVTY0X0MgKDB4YzRjNDM3YzQ2ZWYzOTVhYSksIFU2NF9DICgweDAzMDMwYzAzMTgwZjA2MWIpLAorICAgIFU2NF9DICgweDU2NTY0NTU2OGExM2FjZGMpLCBVNjRfQyAoMHg0NDQ0MGQ0NDFhNDk4ODVlKSwKKyAgICBVNjRfQyAoMHg3ZjdmZTE3ZmRmOWVmZWEwKSwgVTY0X0MgKDB4YTlhOTllYTkyMTM3NGY4OCksCisgICAgVTY0X0MgKDB4MmEyYWE4MmE0ZDgyNTQ2NyksIFU2NF9DICgweGJiYmJkNmJiYjE2ZDZiMGEpLAorICAgIFU2NF9DICgweGMxYzEyM2MxNDZlMjlmODcpLCBVNjRfQyAoMHg1MzUzNTE1M2EyMDJhNmYxKSwKKyAgICBVNjRfQyAoMHhkY2RjNTdkY2FlOGJhNTcyKSwgVTY0X0MgKDB4MGIwYjJjMGI1ODI3MTY1MyksCisgICAgVTY0X0MgKDB4OWQ5ZDRlOWQ5Y2QzMjcwMSksIFU2NF9DICgweDZjNmNhZDZjNDdjMWQ4MmIpLAorICAgIFU2NF9DICgweDMxMzFjNDMxOTVmNTYyYTQpLCBVNjRfQyAoMHg3NDc0Y2Q3NDg3YjllOGYzKSwKKyAgICBVNjRfQyAoMHhmNmY2ZmZmNmUzMDlmMTE1KSwgVTY0X0MgKDB4NDY0NjA1NDYwYTQzOGM0YyksCisgICAgVTY0X0MgKDB4YWNhYzhhYWMwOTI2NDVhNSksIFU2NF9DICgweDg5ODkxZTg5M2M5NzBmYjUpLAorICAgIFU2NF9DICgweDE0MTQ1MDE0YTA0NDI4YjQpLCBVNjRfQyAoMHhlMWUxYTNlMTViNDJkZmJhKSwKKyAgICBVNjRfQyAoMHgxNjE2NTgxNmIwNGUyY2E2KSwgVTY0X0MgKDB4M2EzYWU4M2FjZGQyNzRmNyksCisgICAgVTY0X0MgKDB4Njk2OWI5Njk2ZmQwZDIwNiksIFU2NF9DICgweDA5MDkyNDA5NDgyZDEyNDEpLAorICAgIFU2NF9DICgweDcwNzBkZDcwYTdhZGUwZDcpLCBVNjRfQyAoMHhiNmI2ZTJiNmQ5NTQ3MTZmKSwKKyAgICBVNjRfQyAoMHhkMGQwNjdkMGNlYjdiZDFlKSwgVTY0X0MgKDB4ZWRlZDkzZWQzYjdlYzdkNiksCisgICAgVTY0X0MgKDB4Y2NjYzE3Y2MyZWRiODVlMiksIFU2NF9DICgweDQyNDIxNTQyMmE1Nzg0NjgpLAorICAgIFU2NF9DICgweDk4OTg1YTk4YjRjMjJkMmMpLCBVNjRfQyAoMHhhNGE0YWFhNDQ5MGU1NWVkKSwKKyAgICBVNjRfQyAoMHgyODI4YTAyODVkODg1MDc1KSwgVTY0X0MgKDB4NWM1YzZkNWNkYTMxYjg4NiksCisgICAgVTY0X0MgKDB4ZjhmOGM3Zjg5MzNmZWQ2YiksIFU2NF9DICgweDg2ODYyMjg2NDRhNDExYzIpLAorICB9OworCitzdGF0aWMgY29uc3QgdTY0IEMxWzI1Nl0gPQorICB7CisgICAgVTY0X0MgKDB4ZDgxODE4NjAxOGMwNzgzMCksIFU2NF9DICgweDI2MjMyMzhjMjMwNWFmNDYpLAorICAgIFU2NF9DICgweGI4YzZjNjNmYzY3ZWY5OTEpLCBVNjRfQyAoMHhmYmU4ZTg4N2U4MTM2ZmNkKSwKKyAgICBVNjRfQyAoMHhjYjg3ODcyNjg3NGNhMTEzKSwgVTY0X0MgKDB4MTFiOGI4ZGFiOGE5NjI2ZCksCisgICAgVTY0X0MgKDB4MDkwMTAxMDQwMTA4MDUwMiksIFU2NF9DICgweDBkNGY0ZjIxNGY0MjZlOWUpLAorICAgIFU2NF9DICgweDliMzYzNmQ4MzZhZGVlNmMpLCBVNjRfQyAoMHhmZmE2YTZhMmE2NTkwNDUxKSwKKyAgICBVNjRfQyAoMHgwY2QyZDI2ZmQyZGViZGI5KSwgVTY0X0MgKDB4MGVmNWY1ZjNmNWZiMDZmNyksCisgICAgVTY0X0MgKDB4OTY3OTc5Zjk3OWVmODBmMiksIFU2NF9DICgweDMwNmY2ZmExNmY1ZmNlZGUpLAorICAgIFU2NF9DICgweDZkOTE5MTdlOTFmY2VmM2YpLCBVNjRfQyAoMHhmODUyNTI1NTUyYWEwN2E0KSwKKyAgICBVNjRfQyAoMHg0NzYwNjA5ZDYwMjdmZGMwKSwgVTY0X0MgKDB4MzViY2JjY2FiYzg5NzY2NSksCisgICAgVTY0X0MgKDB4Mzc5YjliNTY5YmFjY2QyYiksIFU2NF9DICgweDhhOGU4ZTAyOGUwNDhjMDEpLAorICAgIFU2NF9DICgweGQyYTNhM2I2YTM3MTE1NWIpLCBVNjRfQyAoMHg2YzBjMGMzMDBjNjAzYzE4KSwKKyAgICBVNjRfQyAoMHg4NDdiN2JmMTdiZmY4YWY2KSwgVTY0X0MgKDB4ODAzNTM1ZDQzNWI1ZTE2YSksCisgICAgVTY0X0MgKDB4ZjUxZDFkNzQxZGU4NjkzYSksIFU2NF9DICgweGIzZTBlMGE3ZTA1MzQ3ZGQpLAorICAgIFU2NF9DICgweDIxZDdkNzdiZDdmNmFjYjMpLCBVNjRfQyAoMHg5Y2MyYzIyZmMyNWVlZDk5KSwKKyAgICBVNjRfQyAoMHg0MzJlMmViODJlNmQ5NjVjKSwgVTY0X0MgKDB4Mjk0YjRiMzE0YjYyN2E5NiksCisgICAgVTY0X0MgKDB4NWRmZWZlZGZmZWEzMjFlMSksIFU2NF9DICgweGQ1NTc1NzQxNTc4MjE2YWUpLAorICAgIFU2NF9DICgweGJkMTUxNTU0MTVhODQxMmEpLCBVNjRfQyAoMHhlODc3NzdjMTc3OWZiNmVlKSwKKyAgICBVNjRfQyAoMHg5MjM3MzdkYzM3YTVlYjZlKSwgVTY0X0MgKDB4OWVlNWU1YjNlNTdiNTZkNyksCisgICAgVTY0X0MgKDB4MTM5ZjlmNDY5ZjhjZDkyMyksIFU2NF9DICgweDIzZjBmMGU3ZjBkMzE3ZmQpLAorICAgIFU2NF9DICgweDIwNGE0YTM1NGE2YTdmOTQpLCBVNjRfQyAoMHg0NGRhZGE0ZmRhOWU5NWE5KSwKKyAgICBVNjRfQyAoMHhhMjU4NTg3ZDU4ZmEyNWIwKSwgVTY0X0MgKDB4Y2ZjOWM5MDNjOTA2Y2E4ZiksCisgICAgVTY0X0MgKDB4N2MyOTI5YTQyOTU1OGQ1MiksIFU2NF9DICgweDVhMGEwYTI4MGE1MDIyMTQpLAorICAgIFU2NF9DICgweDUwYjFiMWZlYjFlMTRmN2YpLCBVNjRfQyAoMHhjOWEwYTBiYWEwNjkxYTVkKSwKKyAgICBVNjRfQyAoMHgxNDZiNmJiMTZiN2ZkYWQ2KSwgVTY0X0MgKDB4ZDk4NTg1MmU4NTVjYWIxNyksCisgICAgVTY0X0MgKDB4M2NiZGJkY2ViZDgxNzM2NyksIFU2NF9DICgweDhmNWQ1ZDY5NWRkMjM0YmEpLAorICAgIFU2NF9DICgweDkwMTAxMDQwMTA4MDUwMjApLCBVNjRfQyAoMHgwN2Y0ZjRmN2Y0ZjMwM2Y1KSwKKyAgICBVNjRfQyAoMHhkZGNiY2IwYmNiMTZjMDhiKSwgVTY0X0MgKDB4ZDMzZTNlZjgzZWVkYzY3YyksCisgICAgVTY0X0MgKDB4MmQwNTA1MTQwNTI4MTEwYSksIFU2NF9DICgweDc4Njc2NzgxNjcxZmU2Y2UpLAorICAgIFU2NF9DICgweDk3ZTRlNGI3ZTQ3MzUzZDUpLCBVNjRfQyAoMHgwMjI3Mjc5YzI3MjViYjRlKSwKKyAgICBVNjRfQyAoMHg3MzQxNDExOTQxMzI1ODgyKSwgVTY0X0MgKDB4YTc4YjhiMTY4YjJjOWQwYiksCisgICAgVTY0X0MgKDB4ZjZhN2E3YTZhNzUxMDE1MyksIFU2NF9DICgweGIyN2Q3ZGU5N2RjZjk0ZmEpLAorICAgIFU2NF9DICgweDQ5OTU5NTZlOTVkY2ZiMzcpLCBVNjRfQyAoMHg1NmQ4ZDg0N2Q4OGU5ZmFkKSwKKyAgICBVNjRfQyAoMHg3MGZiZmJjYmZiOGIzMGViKSwgVTY0X0MgKDB4Y2RlZWVlOWZlZTIzNzFjMSksCisgICAgVTY0X0MgKDB4YmI3YzdjZWQ3Y2M3OTFmOCksIFU2NF9DICgweDcxNjY2Njg1NjYxN2UzY2MpLAorICAgIFU2NF9DICgweDdiZGRkZDUzZGRhNjhlYTcpLCBVNjRfQyAoMHhhZjE3MTc1YzE3Yjg0YjJlKSwKKyAgICBVNjRfQyAoMHg0NTQ3NDcwMTQ3MDI0NjhlKSwgVTY0X0MgKDB4MWE5ZTllNDI5ZTg0ZGMyMSksCisgICAgVTY0X0MgKDB4ZDRjYWNhMGZjYTFlYzU4OSksIFU2NF9DICgweDU4MmQyZGI0MmQ3NTk5NWEpLAorICAgIFU2NF9DICgweDJlYmZiZmM2YmY5MTc5NjMpLCBVNjRfQyAoMHgzZjA3MDcxYzA3MzgxYjBlKSwKKyAgICBVNjRfQyAoMHhhY2FkYWQ4ZWFkMDEyMzQ3KSwgVTY0X0MgKDB4YjA1YTVhNzU1YWVhMmZiNCksCisgICAgVTY0X0MgKDB4ZWY4MzgzMzY4MzZjYjUxYiksIFU2NF9DICgweGI2MzMzM2NjMzM4NWZmNjYpLAorICAgIFU2NF9DICgweDVjNjM2MzkxNjMzZmYyYzYpLCBVNjRfQyAoMHgxMjAyMDIwODAyMTAwYTA0KSwKKyAgICBVNjRfQyAoMHg5M2FhYWE5MmFhMzkzODQ5KSwgVTY0X0MgKDB4ZGU3MTcxZDk3MWFmYThlMiksCisgICAgVTY0X0MgKDB4YzZjOGM4MDdjODBlY2Y4ZCksIFU2NF9DICgweGQxMTkxOTY0MTljODdkMzIpLAorICAgIFU2NF9DICgweDNiNDk0OTM5NDk3MjcwOTIpLCBVNjRfQyAoMHg1ZmQ5ZDk0M2Q5ODY5YWFmKSwKKyAgICBVNjRfQyAoMHgzMWYyZjJlZmYyYzMxZGY5KSwgVTY0X0MgKDB4YThlM2UzYWJlMzRiNDhkYiksCisgICAgVTY0X0MgKDB4Yjk1YjViNzE1YmUyMmFiNiksIFU2NF9DICgweGJjODg4ODFhODgzNDkyMGQpLAorICAgIFU2NF9DICgweDNlOWE5YTUyOWFhNGM4MjkpLCBVNjRfQyAoMHgwYjI2MjY5ODI2MmRiZTRjKSwKKyAgICBVNjRfQyAoMHhiZjMyMzJjODMyOGRmYTY0KSwgVTY0X0MgKDB4NTliMGIwZmFiMGU5NGE3ZCksCisgICAgVTY0X0MgKDB4ZjJlOWU5ODNlOTFiNmFjZiksIFU2NF9DICgweDc3MGYwZjNjMGY3ODMzMWUpLAorICAgIFU2NF9DICgweDMzZDVkNTczZDVlNmE2YjcpLCBVNjRfQyAoMHhmNDgwODAzYTgwNzRiYTFkKSwKKyAgICBVNjRfQyAoMHgyN2JlYmVjMmJlOTk3YzYxKSwgVTY0X0MgKDB4ZWJjZGNkMTNjZDI2ZGU4NyksCisgICAgVTY0X0MgKDB4ODkzNDM0ZDAzNGJkZTQ2OCksIFU2NF9DICgweDMyNDg0ODNkNDg3YTc1OTApLAorICAgIFU2NF9DICgweDU0ZmZmZmRiZmZhYjI0ZTMpLCBVNjRfQyAoMHg4ZDdhN2FmNTdhZjc4ZmY0KSwKKyAgICBVNjRfQyAoMHg2NDkwOTA3YTkwZjRlYTNkKSwgVTY0X0MgKDB4OWQ1ZjVmNjE1ZmMyM2ViZSksCisgICAgVTY0X0MgKDB4M2QyMDIwODAyMDFkYTA0MCksIFU2NF9DICgweDBmNjg2OGJkNjg2N2Q1ZDApLAorICAgIFU2NF9DICgweGNhMWExYTY4MWFkMDcyMzQpLCBVNjRfQyAoMHhiN2FlYWU4MmFlMTkyYzQxKSwKKyAgICBVNjRfQyAoMHg3ZGI0YjRlYWI0Yzk1ZTc1KSwgVTY0X0MgKDB4Y2U1NDU0NGQ1NDlhMTlhOCksCisgICAgVTY0X0MgKDB4N2Y5MzkzNzY5M2VjZTUzYiksIFU2NF9DICgweDJmMjIyMjg4MjIwZGFhNDQpLAorICAgIFU2NF9DICgweDYzNjQ2NDhkNjQwN2U5YzgpLCBVNjRfQyAoMHgyYWYxZjFlM2YxZGIxMmZmKSwKKyAgICBVNjRfQyAoMHhjYzczNzNkMTczYmZhMmU2KSwgVTY0X0MgKDB4ODIxMjEyNDgxMjkwNWEyNCksCisgICAgVTY0X0MgKDB4N2E0MDQwMWQ0MDNhNWQ4MCksIFU2NF9DICgweDQ4MDgwODIwMDg0MDI4MTApLAorICAgIFU2NF9DICgweDk1YzNjMzJiYzM1NmU4OWIpLCBVNjRfQyAoMHhkZmVjZWM5N2VjMzM3YmM1KSwKKyAgICBVNjRfQyAoMHg0ZGRiZGI0YmRiOTY5MGFiKSwgVTY0X0MgKDB4YzBhMWExYmVhMTYxMWY1ZiksCisgICAgVTY0X0MgKDB4OTE4ZDhkMGU4ZDFjODMwNyksIFU2NF9DICgweGM4M2QzZGY0M2RmNWM5N2EpLAorICAgIFU2NF9DICgweDViOTc5NzY2OTdjY2YxMzMpLCBVNjRfQyAoMHgwMDAwMDAwMDAwMDAwMDAwKSwKKyAgICBVNjRfQyAoMHhmOWNmY2YxYmNmMzZkNDgzKSwgVTY0X0MgKDB4NmUyYjJiYWMyYjQ1ODc1NiksCisgICAgVTY0X0MgKDB4ZTE3Njc2YzU3Njk3YjNlYyksIFU2NF9DICgweGU2ODI4MjMyODI2NGIwMTkpLAorICAgIFU2NF9DICgweDI4ZDZkNjdmZDZmZWE5YjEpLCBVNjRfQyAoMHhjMzFiMWI2YzFiZDg3NzM2KSwKKyAgICBVNjRfQyAoMHg3NGI1YjVlZWI1YzE1Yjc3KSwgVTY0X0MgKDB4YmVhZmFmODZhZjExMjk0MyksCisgICAgVTY0X0MgKDB4MWQ2YTZhYjU2YTc3ZGZkNCksIFU2NF9DICgweGVhNTA1MDVkNTBiYTBkYTApLAorICAgIFU2NF9DICgweDU3NDU0NTA5NDUxMjRjOGEpLCBVNjRfQyAoMHgzOGYzZjNlYmYzY2IxOGZiKSwKKyAgICBVNjRfQyAoMHhhZDMwMzBjMDMwOWRmMDYwKSwgVTY0X0MgKDB4YzRlZmVmOWJlZjJiNzRjMyksCisgICAgVTY0X0MgKDB4ZGEzZjNmZmMzZmU1YzM3ZSksIFU2NF9DICgweGM3NTU1NTQ5NTU5MjFjYWEpLAorICAgIFU2NF9DICgweGRiYTJhMmIyYTI3OTEwNTkpLCBVNjRfQyAoMHhlOWVhZWE4ZmVhMDM2NWM5KSwKKyAgICBVNjRfQyAoMHg2YTY1NjU4OTY1MGZlY2NhKSwgVTY0X0MgKDB4MDNiYWJhZDJiYWI5Njg2OSksCisgICAgVTY0X0MgKDB4NGEyZjJmYmMyZjY1OTM1ZSksIFU2NF9DICgweDhlYzBjMDI3YzA0ZWU3OWQpLAorICAgIFU2NF9DICgweDYwZGVkZTVmZGViZTgxYTEpLCBVNjRfQyAoMHhmYzFjMWM3MDFjZTA2YzM4KSwKKyAgICBVNjRfQyAoMHg0NmZkZmRkM2ZkYmIyZWU3KSwgVTY0X0MgKDB4MWY0ZDRkMjk0ZDUyNjQ5YSksCisgICAgVTY0X0MgKDB4NzY5MjkyNzI5MmU0ZTAzOSksIFU2NF9DICgweGZhNzU3NWM5NzU4ZmJjZWEpLAorICAgIFU2NF9DICgweDM2MDYwNjE4MDYzMDFlMGMpLCBVNjRfQyAoMHhhZThhOGExMjhhMjQ5ODA5KSwKKyAgICBVNjRfQyAoMHg0YmIyYjJmMmIyZjk0MDc5KSwgVTY0X0MgKDB4ODVlNmU2YmZlNjYzNTlkMSksCisgICAgVTY0X0MgKDB4N2UwZTBlMzgwZTcwMzYxYyksIFU2NF9DICgweGU3MWYxZjdjMWZmODYzM2UpLAorICAgIFU2NF9DICgweDU1NjI2Mjk1NjIzN2Y3YzQpLCBVNjRfQyAoMHgzYWQ0ZDQ3N2Q0ZWVhM2I1KSwKKyAgICBVNjRfQyAoMHg4MWE4YTg5YWE4MjkzMjRkKSwgVTY0X0MgKDB4NTI5Njk2NjI5NmM0ZjQzMSksCisgICAgVTY0X0MgKDB4NjJmOWY5YzNmOTliM2FlZiksIFU2NF9DICgweGEzYzVjNTMzYzU2NmY2OTcpLAorICAgIFU2NF9DICgweDEwMjUyNTk0MjUzNWIxNGEpLCBVNjRfQyAoMHhhYjU5NTk3OTU5ZjIyMGIyKSwKKyAgICBVNjRfQyAoMHhkMDg0ODQyYTg0NTRhZTE1KSwgVTY0X0MgKDB4YzU3MjcyZDU3MmI3YTdlNCksCisgICAgVTY0X0MgKDB4ZWMzOTM5ZTQzOWQ1ZGQ3MiksIFU2NF9DICgweDE2NGM0YzJkNGM1YTYxOTgpLAorICAgIFU2NF9DICgweDk0NWU1ZTY1NWVjYTNiYmMpLCBVNjRfQyAoMHg5Zjc4NzhmZDc4ZTc4NWYwKSwKKyAgICBVNjRfQyAoMHhlNTM4MzhlMDM4ZGRkODcwKSwgVTY0X0MgKDB4OTg4YzhjMGE4YzE0ODYwNSksCisgICAgVTY0X0MgKDB4MTdkMWQxNjNkMWM2YjJiZiksIFU2NF9DICgweGU0YTVhNWFlYTU0MTBiNTcpLAorICAgIFU2NF9DICgweGExZTJlMmFmZTI0MzRkZDkpLCBVNjRfQyAoMHg0ZTYxNjE5OTYxMmZmOGMyKSwKKyAgICBVNjRfQyAoMHg0MmIzYjNmNmIzZjE0NTdiKSwgVTY0X0MgKDB4MzQyMTIxODQyMTE1YTU0MiksCisgICAgVTY0X0MgKDB4MDg5YzljNGE5Yzk0ZDYyNSksIFU2NF9DICgweGVlMWUxZTc4MWVmMDY2M2MpLAorICAgIFU2NF9DICgweDYxNDM0MzExNDMyMjUyODYpLCBVNjRfQyAoMHhiMWM3YzczYmM3NzZmYzkzKSwKKyAgICBVNjRfQyAoMHg0ZmZjZmNkN2ZjYjMyYmU1KSwgVTY0X0MgKDB4MjQwNDA0MTAwNDIwMTQwOCksCisgICAgVTY0X0MgKDB4ZTM1MTUxNTk1MWIyMDhhMiksIFU2NF9DICgweDI1OTk5OTVlOTliY2M3MmYpLAorICAgIFU2NF9DICgweDIyNmQ2ZGE5NmQ0ZmM0ZGEpLCBVNjRfQyAoMHg2NTBkMGQzNDBkNjgzOTFhKSwKKyAgICBVNjRfQyAoMHg3OWZhZmFjZmZhODMzNWU5KSwgVTY0X0MgKDB4NjlkZmRmNWJkZmI2ODRhMyksCisgICAgVTY0X0MgKDB4YTk3ZTdlZTU3ZWQ3OWJmYyksIFU2NF9DICgweDE5MjQyNDkwMjQzZGI0NDgpLAorICAgIFU2NF9DICgweGZlM2IzYmVjM2JjNWQ3NzYpLCBVNjRfQyAoMHg5YWFiYWI5NmFiMzEzZDRiKSwKKyAgICBVNjRfQyAoMHhmMGNlY2UxZmNlM2VkMTgxKSwgVTY0X0MgKDB4OTkxMTExNDQxMTg4NTUyMiksCisgICAgVTY0X0MgKDB4ODM4ZjhmMDY4ZjBjODkwMyksIFU2NF9DICgweDA0NGU0ZTI1NGU0YTZiOWMpLAorICAgIFU2NF9DICgweDY2YjdiN2U2YjdkMTUxNzMpLCBVNjRfQyAoMHhlMGViZWI4YmViMGI2MGNiKSwKKyAgICBVNjRfQyAoMHhjMTNjM2NmMDNjZmRjYzc4KSwgVTY0X0MgKDB4ZmQ4MTgxM2U4MTdjYmYxZiksCisgICAgVTY0X0MgKDB4NDA5NDk0NmE5NGQ0ZmUzNSksIFU2NF9DICgweDFjZjdmN2ZiZjdlYjBjZjMpLAorICAgIFU2NF9DICgweDE4YjliOWRlYjlhMTY3NmYpLCBVNjRfQyAoMHg4YjEzMTM0YzEzOTg1ZjI2KSwKKyAgICBVNjRfQyAoMHg1MTJjMmNiMDJjN2Q5YzU4KSwgVTY0X0MgKDB4MDVkM2QzNmJkM2Q2YjhiYiksCisgICAgVTY0X0MgKDB4OGNlN2U3YmJlNzZiNWNkMyksIFU2NF9DICgweDM5NmU2ZWE1NmU1N2NiZGMpLAorICAgIFU2NF9DICgweGFhYzRjNDM3YzQ2ZWYzOTUpLCBVNjRfQyAoMHgxYjAzMDMwYzAzMTgwZjA2KSwKKyAgICBVNjRfQyAoMHhkYzU2NTY0NTU2OGExM2FjKSwgVTY0X0MgKDB4NWU0NDQ0MGQ0NDFhNDk4OCksCisgICAgVTY0X0MgKDB4YTA3ZjdmZTE3ZmRmOWVmZSksIFU2NF9DICgweDg4YTlhOTllYTkyMTM3NGYpLAorICAgIFU2NF9DICgweDY3MmEyYWE4MmE0ZDgyNTQpLCBVNjRfQyAoMHgwYWJiYmJkNmJiYjE2ZDZiKSwKKyAgICBVNjRfQyAoMHg4N2MxYzEyM2MxNDZlMjlmKSwgVTY0X0MgKDB4ZjE1MzUzNTE1M2EyMDJhNiksCisgICAgVTY0X0MgKDB4NzJkY2RjNTdkY2FlOGJhNSksIFU2NF9DICgweDUzMGIwYjJjMGI1ODI3MTYpLAorICAgIFU2NF9DICgweDAxOWQ5ZDRlOWQ5Y2QzMjcpLCBVNjRfQyAoMHgyYjZjNmNhZDZjNDdjMWQ4KSwKKyAgICBVNjRfQyAoMHhhNDMxMzFjNDMxOTVmNTYyKSwgVTY0X0MgKDB4ZjM3NDc0Y2Q3NDg3YjllOCksCisgICAgVTY0X0MgKDB4MTVmNmY2ZmZmNmUzMDlmMSksIFU2NF9DICgweDRjNDY0NjA1NDYwYTQzOGMpLAorICAgIFU2NF9DICgweGE1YWNhYzhhYWMwOTI2NDUpLCBVNjRfQyAoMHhiNTg5ODkxZTg5M2M5NzBmKSwKKyAgICBVNjRfQyAoMHhiNDE0MTQ1MDE0YTA0NDI4KSwgVTY0X0MgKDB4YmFlMWUxYTNlMTViNDJkZiksCisgICAgVTY0X0MgKDB4YTYxNjE2NTgxNmIwNGUyYyksIFU2NF9DICgweGY3M2EzYWU4M2FjZGQyNzQpLAorICAgIFU2NF9DICgweDA2Njk2OWI5Njk2ZmQwZDIpLCBVNjRfQyAoMHg0MTA5MDkyNDA5NDgyZDEyKSwKKyAgICBVNjRfQyAoMHhkNzcwNzBkZDcwYTdhZGUwKSwgVTY0X0MgKDB4NmZiNmI2ZTJiNmQ5NTQ3MSksCisgICAgVTY0X0MgKDB4MWVkMGQwNjdkMGNlYjdiZCksIFU2NF9DICgweGQ2ZWRlZDkzZWQzYjdlYzcpLAorICAgIFU2NF9DICgweGUyY2NjYzE3Y2MyZWRiODUpLCBVNjRfQyAoMHg2ODQyNDIxNTQyMmE1Nzg0KSwKKyAgICBVNjRfQyAoMHgyYzk4OTg1YTk4YjRjMjJkKSwgVTY0X0MgKDB4ZWRhNGE0YWFhNDQ5MGU1NSksCisgICAgVTY0X0MgKDB4NzUyODI4YTAyODVkODg1MCksIFU2NF9DICgweDg2NWM1YzZkNWNkYTMxYjgpLAorICAgIFU2NF9DICgweDZiZjhmOGM3Zjg5MzNmZWQpLCBVNjRfQyAoMHhjMjg2ODYyMjg2NDRhNDExKSwKKyAgfTsKKworc3RhdGljIGNvbnN0IHU2NCBDMlsyNTZdID0KKyAgeworICAgIFU2NF9DICgweDMwZDgxODE4NjAxOGMwNzgpLCBVNjRfQyAoMHg0NjI2MjMyMzhjMjMwNWFmKSwKKyAgICBVNjRfQyAoMHg5MWI4YzZjNjNmYzY3ZWY5KSwgVTY0X0MgKDB4Y2RmYmU4ZTg4N2U4MTM2ZiksCisgICAgVTY0X0MgKDB4MTNjYjg3ODcyNjg3NGNhMSksIFU2NF9DICgweDZkMTFiOGI4ZGFiOGE5NjIpLAorICAgIFU2NF9DICgweDAyMDkwMTAxMDQwMTA4MDUpLCBVNjRfQyAoMHg5ZTBkNGY0ZjIxNGY0MjZlKSwKKyAgICBVNjRfQyAoMHg2YzliMzYzNmQ4MzZhZGVlKSwgVTY0X0MgKDB4NTFmZmE2YTZhMmE2NTkwNCksCisgICAgVTY0X0MgKDB4YjkwY2QyZDI2ZmQyZGViZCksIFU2NF9DICgweGY3MGVmNWY1ZjNmNWZiMDYpLAorICAgIFU2NF9DICgweGYyOTY3OTc5Zjk3OWVmODApLCBVNjRfQyAoMHhkZTMwNmY2ZmExNmY1ZmNlKSwKKyAgICBVNjRfQyAoMHgzZjZkOTE5MTdlOTFmY2VmKSwgVTY0X0MgKDB4YTRmODUyNTI1NTUyYWEwNyksCisgICAgVTY0X0MgKDB4YzA0NzYwNjA5ZDYwMjdmZCksIFU2NF9DICgweDY1MzViY2JjY2FiYzg5NzYpLAorICAgIFU2NF9DICgweDJiMzc5YjliNTY5YmFjY2QpLCBVNjRfQyAoMHgwMThhOGU4ZTAyOGUwNDhjKSwKKyAgICBVNjRfQyAoMHg1YmQyYTNhM2I2YTM3MTE1KSwgVTY0X0MgKDB4MTg2YzBjMGMzMDBjNjAzYyksCisgICAgVTY0X0MgKDB4ZjY4NDdiN2JmMTdiZmY4YSksIFU2NF9DICgweDZhODAzNTM1ZDQzNWI1ZTEpLAorICAgIFU2NF9DICgweDNhZjUxZDFkNzQxZGU4NjkpLCBVNjRfQyAoMHhkZGIzZTBlMGE3ZTA1MzQ3KSwKKyAgICBVNjRfQyAoMHhiMzIxZDdkNzdiZDdmNmFjKSwgVTY0X0MgKDB4OTk5Y2MyYzIyZmMyNWVlZCksCisgICAgVTY0X0MgKDB4NWM0MzJlMmViODJlNmQ5NiksIFU2NF9DICgweDk2Mjk0YjRiMzE0YjYyN2EpLAorICAgIFU2NF9DICgweGUxNWRmZWZlZGZmZWEzMjEpLCBVNjRfQyAoMHhhZWQ1NTc1NzQxNTc4MjE2KSwKKyAgICBVNjRfQyAoMHgyYWJkMTUxNTU0MTVhODQxKSwgVTY0X0MgKDB4ZWVlODc3NzdjMTc3OWZiNiksCisgICAgVTY0X0MgKDB4NmU5MjM3MzdkYzM3YTVlYiksIFU2NF9DICgweGQ3OWVlNWU1YjNlNTdiNTYpLAorICAgIFU2NF9DICgweDIzMTM5ZjlmNDY5ZjhjZDkpLCBVNjRfQyAoMHhmZDIzZjBmMGU3ZjBkMzE3KSwKKyAgICBVNjRfQyAoMHg5NDIwNGE0YTM1NGE2YTdmKSwgVTY0X0MgKDB4YTk0NGRhZGE0ZmRhOWU5NSksCisgICAgVTY0X0MgKDB4YjBhMjU4NTg3ZDU4ZmEyNSksIFU2NF9DICgweDhmY2ZjOWM5MDNjOTA2Y2EpLAorICAgIFU2NF9DICgweDUyN2MyOTI5YTQyOTU1OGQpLCBVNjRfQyAoMHgxNDVhMGEwYTI4MGE1MDIyKSwKKyAgICBVNjRfQyAoMHg3ZjUwYjFiMWZlYjFlMTRmKSwgVTY0X0MgKDB4NWRjOWEwYTBiYWEwNjkxYSksCisgICAgVTY0X0MgKDB4ZDYxNDZiNmJiMTZiN2ZkYSksIFU2NF9DICgweDE3ZDk4NTg1MmU4NTVjYWIpLAorICAgIFU2NF9DICgweDY3M2NiZGJkY2ViZDgxNzMpLCBVNjRfQyAoMHhiYThmNWQ1ZDY5NWRkMjM0KSwKKyAgICBVNjRfQyAoMHgyMDkwMTAxMDQwMTA4MDUwKSwgVTY0X0MgKDB4ZjUwN2Y0ZjRmN2Y0ZjMwMyksCisgICAgVTY0X0MgKDB4OGJkZGNiY2IwYmNiMTZjMCksIFU2NF9DICgweDdjZDMzZTNlZjgzZWVkYzYpLAorICAgIFU2NF9DICgweDBhMmQwNTA1MTQwNTI4MTEpLCBVNjRfQyAoMHhjZTc4Njc2NzgxNjcxZmU2KSwKKyAgICBVNjRfQyAoMHhkNTk3ZTRlNGI3ZTQ3MzUzKSwgVTY0X0MgKDB4NGUwMjI3Mjc5YzI3MjViYiksCisgICAgVTY0X0MgKDB4ODI3MzQxNDExOTQxMzI1OCksIFU2NF9DICgweDBiYTc4YjhiMTY4YjJjOWQpLAorICAgIFU2NF9DICgweDUzZjZhN2E3YTZhNzUxMDEpLCBVNjRfQyAoMHhmYWIyN2Q3ZGU5N2RjZjk0KSwKKyAgICBVNjRfQyAoMHgzNzQ5OTU5NTZlOTVkY2ZiKSwgVTY0X0MgKDB4YWQ1NmQ4ZDg0N2Q4OGU5ZiksCisgICAgVTY0X0MgKDB4ZWI3MGZiZmJjYmZiOGIzMCksIFU2NF9DICgweGMxY2RlZWVlOWZlZTIzNzEpLAorICAgIFU2NF9DICgweGY4YmI3YzdjZWQ3Y2M3OTEpLCBVNjRfQyAoMHhjYzcxNjY2Njg1NjYxN2UzKSwKKyAgICBVNjRfQyAoMHhhNzdiZGRkZDUzZGRhNjhlKSwgVTY0X0MgKDB4MmVhZjE3MTc1YzE3Yjg0YiksCisgICAgVTY0X0MgKDB4OGU0NTQ3NDcwMTQ3MDI0NiksIFU2NF9DICgweDIxMWE5ZTllNDI5ZTg0ZGMpLAorICAgIFU2NF9DICgweDg5ZDRjYWNhMGZjYTFlYzUpLCBVNjRfQyAoMHg1YTU4MmQyZGI0MmQ3NTk5KSwKKyAgICBVNjRfQyAoMHg2MzJlYmZiZmM2YmY5MTc5KSwgVTY0X0MgKDB4MGUzZjA3MDcxYzA3MzgxYiksCisgICAgVTY0X0MgKDB4NDdhY2FkYWQ4ZWFkMDEyMyksIFU2NF9DICgweGI0YjA1YTVhNzU1YWVhMmYpLAorICAgIFU2NF9DICgweDFiZWY4MzgzMzY4MzZjYjUpLCBVNjRfQyAoMHg2NmI2MzMzM2NjMzM4NWZmKSwKKyAgICBVNjRfQyAoMHhjNjVjNjM2MzkxNjMzZmYyKSwgVTY0X0MgKDB4MDQxMjAyMDIwODAyMTAwYSksCisgICAgVTY0X0MgKDB4NDk5M2FhYWE5MmFhMzkzOCksIFU2NF9DICgweGUyZGU3MTcxZDk3MWFmYTgpLAorICAgIFU2NF9DICgweDhkYzZjOGM4MDdjODBlY2YpLCBVNjRfQyAoMHgzMmQxMTkxOTY0MTljODdkKSwKKyAgICBVNjRfQyAoMHg5MjNiNDk0OTM5NDk3MjcwKSwgVTY0X0MgKDB4YWY1ZmQ5ZDk0M2Q5ODY5YSksCisgICAgVTY0X0MgKDB4ZjkzMWYyZjJlZmYyYzMxZCksIFU2NF9DICgweGRiYThlM2UzYWJlMzRiNDgpLAorICAgIFU2NF9DICgweGI2Yjk1YjViNzE1YmUyMmEpLCBVNjRfQyAoMHgwZGJjODg4ODFhODgzNDkyKSwKKyAgICBVNjRfQyAoMHgyOTNlOWE5YTUyOWFhNGM4KSwgVTY0X0MgKDB4NGMwYjI2MjY5ODI2MmRiZSksCisgICAgVTY0X0MgKDB4NjRiZjMyMzJjODMyOGRmYSksIFU2NF9DICgweDdkNTliMGIwZmFiMGU5NGEpLAorICAgIFU2NF9DICgweGNmZjJlOWU5ODNlOTFiNmEpLCBVNjRfQyAoMHgxZTc3MGYwZjNjMGY3ODMzKSwKKyAgICBVNjRfQyAoMHhiNzMzZDVkNTczZDVlNmE2KSwgVTY0X0MgKDB4MWRmNDgwODAzYTgwNzRiYSksCisgICAgVTY0X0MgKDB4NjEyN2JlYmVjMmJlOTk3YyksIFU2NF9DICgweDg3ZWJjZGNkMTNjZDI2ZGUpLAorICAgIFU2NF9DICgweDY4ODkzNDM0ZDAzNGJkZTQpLCBVNjRfQyAoMHg5MDMyNDg0ODNkNDg3YTc1KSwKKyAgICBVNjRfQyAoMHhlMzU0ZmZmZmRiZmZhYjI0KSwgVTY0X0MgKDB4ZjQ4ZDdhN2FmNTdhZjc4ZiksCisgICAgVTY0X0MgKDB4M2Q2NDkwOTA3YTkwZjRlYSksIFU2NF9DICgweGJlOWQ1ZjVmNjE1ZmMyM2UpLAorICAgIFU2NF9DICgweDQwM2QyMDIwODAyMDFkYTApLCBVNjRfQyAoMHhkMDBmNjg2OGJkNjg2N2Q1KSwKKyAgICBVNjRfQyAoMHgzNGNhMWExYTY4MWFkMDcyKSwgVTY0X0MgKDB4NDFiN2FlYWU4MmFlMTkyYyksCisgICAgVTY0X0MgKDB4NzU3ZGI0YjRlYWI0Yzk1ZSksIFU2NF9DICgweGE4Y2U1NDU0NGQ1NDlhMTkpLAorICAgIFU2NF9DICgweDNiN2Y5MzkzNzY5M2VjZTUpLCBVNjRfQyAoMHg0NDJmMjIyMjg4MjIwZGFhKSwKKyAgICBVNjRfQyAoMHhjODYzNjQ2NDhkNjQwN2U5KSwgVTY0X0MgKDB4ZmYyYWYxZjFlM2YxZGIxMiksCisgICAgVTY0X0MgKDB4ZTZjYzczNzNkMTczYmZhMiksIFU2NF9DICgweDI0ODIxMjEyNDgxMjkwNWEpLAorICAgIFU2NF9DICgweDgwN2E0MDQwMWQ0MDNhNWQpLCBVNjRfQyAoMHgxMDQ4MDgwODIwMDg0MDI4KSwKKyAgICBVNjRfQyAoMHg5Yjk1YzNjMzJiYzM1NmU4KSwgVTY0X0MgKDB4YzVkZmVjZWM5N2VjMzM3YiksCisgICAgVTY0X0MgKDB4YWI0ZGRiZGI0YmRiOTY5MCksIFU2NF9DICgweDVmYzBhMWExYmVhMTYxMWYpLAorICAgIFU2NF9DICgweDA3OTE4ZDhkMGU4ZDFjODMpLCBVNjRfQyAoMHg3YWM4M2QzZGY0M2RmNWM5KSwKKyAgICBVNjRfQyAoMHgzMzViOTc5NzY2OTdjY2YxKSwgVTY0X0MgKDB4MDAwMDAwMDAwMDAwMDAwMCksCisgICAgVTY0X0MgKDB4ODNmOWNmY2YxYmNmMzZkNCksIFU2NF9DICgweDU2NmUyYjJiYWMyYjQ1ODcpLAorICAgIFU2NF9DICgweGVjZTE3Njc2YzU3Njk3YjMpLCBVNjRfQyAoMHgxOWU2ODI4MjMyODI2NGIwKSwKKyAgICBVNjRfQyAoMHhiMTI4ZDZkNjdmZDZmZWE5KSwgVTY0X0MgKDB4MzZjMzFiMWI2YzFiZDg3NyksCisgICAgVTY0X0MgKDB4Nzc3NGI1YjVlZWI1YzE1YiksIFU2NF9DICgweDQzYmVhZmFmODZhZjExMjkpLAorICAgIFU2NF9DICgweGQ0MWQ2YTZhYjU2YTc3ZGYpLCBVNjRfQyAoMHhhMGVhNTA1MDVkNTBiYTBkKSwKKyAgICBVNjRfQyAoMHg4YTU3NDU0NTA5NDUxMjRjKSwgVTY0X0MgKDB4ZmIzOGYzZjNlYmYzY2IxOCksCisgICAgVTY0X0MgKDB4NjBhZDMwMzBjMDMwOWRmMCksIFU2NF9DICgweGMzYzRlZmVmOWJlZjJiNzQpLAorICAgIFU2NF9DICgweDdlZGEzZjNmZmMzZmU1YzMpLCBVNjRfQyAoMHhhYWM3NTU1NTQ5NTU5MjFjKSwKKyAgICBVNjRfQyAoMHg1OWRiYTJhMmIyYTI3OTEwKSwgVTY0X0MgKDB4YzllOWVhZWE4ZmVhMDM2NSksCisgICAgVTY0X0MgKDB4Y2E2YTY1NjU4OTY1MGZlYyksIFU2NF9DICgweDY5MDNiYWJhZDJiYWI5NjgpLAorICAgIFU2NF9DICgweDVlNGEyZjJmYmMyZjY1OTMpLCBVNjRfQyAoMHg5ZDhlYzBjMDI3YzA0ZWU3KSwKKyAgICBVNjRfQyAoMHhhMTYwZGVkZTVmZGViZTgxKSwgVTY0X0MgKDB4MzhmYzFjMWM3MDFjZTA2YyksCisgICAgVTY0X0MgKDB4ZTc0NmZkZmRkM2ZkYmIyZSksIFU2NF9DICgweDlhMWY0ZDRkMjk0ZDUyNjQpLAorICAgIFU2NF9DICgweDM5NzY5MjkyNzI5MmU0ZTApLCBVNjRfQyAoMHhlYWZhNzU3NWM5NzU4ZmJjKSwKKyAgICBVNjRfQyAoMHgwYzM2MDYwNjE4MDYzMDFlKSwgVTY0X0MgKDB4MDlhZThhOGExMjhhMjQ5OCksCisgICAgVTY0X0MgKDB4Nzk0YmIyYjJmMmIyZjk0MCksIFU2NF9DICgweGQxODVlNmU2YmZlNjYzNTkpLAorICAgIFU2NF9DICgweDFjN2UwZTBlMzgwZTcwMzYpLCBVNjRfQyAoMHgzZWU3MWYxZjdjMWZmODYzKSwKKyAgICBVNjRfQyAoMHhjNDU1NjI2Mjk1NjIzN2Y3KSwgVTY0X0MgKDB4YjUzYWQ0ZDQ3N2Q0ZWVhMyksCisgICAgVTY0X0MgKDB4NGQ4MWE4YTg5YWE4MjkzMiksIFU2NF9DICgweDMxNTI5Njk2NjI5NmM0ZjQpLAorICAgIFU2NF9DICgweGVmNjJmOWY5YzNmOTliM2EpLCBVNjRfQyAoMHg5N2EzYzVjNTMzYzU2NmY2KSwKKyAgICBVNjRfQyAoMHg0YTEwMjUyNTk0MjUzNWIxKSwgVTY0X0MgKDB4YjJhYjU5NTk3OTU5ZjIyMCksCisgICAgVTY0X0MgKDB4MTVkMDg0ODQyYTg0NTRhZSksIFU2NF9DICgweGU0YzU3MjcyZDU3MmI3YTcpLAorICAgIFU2NF9DICgweDcyZWMzOTM5ZTQzOWQ1ZGQpLCBVNjRfQyAoMHg5ODE2NGM0YzJkNGM1YTYxKSwKKyAgICBVNjRfQyAoMHhiYzk0NWU1ZTY1NWVjYTNiKSwgVTY0X0MgKDB4ZjA5Zjc4NzhmZDc4ZTc4NSksCisgICAgVTY0X0MgKDB4NzBlNTM4MzhlMDM4ZGRkOCksIFU2NF9DICgweDA1OTg4YzhjMGE4YzE0ODYpLAorICAgIFU2NF9DICgweGJmMTdkMWQxNjNkMWM2YjIpLCBVNjRfQyAoMHg1N2U0YTVhNWFlYTU0MTBiKSwKKyAgICBVNjRfQyAoMHhkOWExZTJlMmFmZTI0MzRkKSwgVTY0X0MgKDB4YzI0ZTYxNjE5OTYxMmZmOCksCisgICAgVTY0X0MgKDB4N2I0MmIzYjNmNmIzZjE0NSksIFU2NF9DICgweDQyMzQyMTIxODQyMTE1YTUpLAorICAgIFU2NF9DICgweDI1MDg5YzljNGE5Yzk0ZDYpLCBVNjRfQyAoMHgzY2VlMWUxZTc4MWVmMDY2KSwKKyAgICBVNjRfQyAoMHg4NjYxNDM0MzExNDMyMjUyKSwgVTY0X0MgKDB4OTNiMWM3YzczYmM3NzZmYyksCisgICAgVTY0X0MgKDB4ZTU0ZmZjZmNkN2ZjYjMyYiksIFU2NF9DICgweDA4MjQwNDA0MTAwNDIwMTQpLAorICAgIFU2NF9DICgweGEyZTM1MTUxNTk1MWIyMDgpLCBVNjRfQyAoMHgyZjI1OTk5OTVlOTliY2M3KSwKKyAgICBVNjRfQyAoMHhkYTIyNmQ2ZGE5NmQ0ZmM0KSwgVTY0X0MgKDB4MWE2NTBkMGQzNDBkNjgzOSksCisgICAgVTY0X0MgKDB4ZTk3OWZhZmFjZmZhODMzNSksIFU2NF9DICgweGEzNjlkZmRmNWJkZmI2ODQpLAorICAgIFU2NF9DICgweGZjYTk3ZTdlZTU3ZWQ3OWIpLCBVNjRfQyAoMHg0ODE5MjQyNDkwMjQzZGI0KSwKKyAgICBVNjRfQyAoMHg3NmZlM2IzYmVjM2JjNWQ3KSwgVTY0X0MgKDB4NGI5YWFiYWI5NmFiMzEzZCksCisgICAgVTY0X0MgKDB4ODFmMGNlY2UxZmNlM2VkMSksIFU2NF9DICgweDIyOTkxMTExNDQxMTg4NTUpLAorICAgIFU2NF9DICgweDAzODM4ZjhmMDY4ZjBjODkpLCBVNjRfQyAoMHg5YzA0NGU0ZTI1NGU0YTZiKSwKKyAgICBVNjRfQyAoMHg3MzY2YjdiN2U2YjdkMTUxKSwgVTY0X0MgKDB4Y2JlMGViZWI4YmViMGI2MCksCisgICAgVTY0X0MgKDB4NzhjMTNjM2NmMDNjZmRjYyksIFU2NF9DICgweDFmZmQ4MTgxM2U4MTdjYmYpLAorICAgIFU2NF9DICgweDM1NDA5NDk0NmE5NGQ0ZmUpLCBVNjRfQyAoMHhmMzFjZjdmN2ZiZjdlYjBjKSwKKyAgICBVNjRfQyAoMHg2ZjE4YjliOWRlYjlhMTY3KSwgVTY0X0MgKDB4MjY4YjEzMTM0YzEzOTg1ZiksCisgICAgVTY0X0MgKDB4NTg1MTJjMmNiMDJjN2Q5YyksIFU2NF9DICgweGJiMDVkM2QzNmJkM2Q2YjgpLAorICAgIFU2NF9DICgweGQzOGNlN2U3YmJlNzZiNWMpLCBVNjRfQyAoMHhkYzM5NmU2ZWE1NmU1N2NiKSwKKyAgICBVNjRfQyAoMHg5NWFhYzRjNDM3YzQ2ZWYzKSwgVTY0X0MgKDB4MDYxYjAzMDMwYzAzMTgwZiksCisgICAgVTY0X0MgKDB4YWNkYzU2NTY0NTU2OGExMyksIFU2NF9DICgweDg4NWU0NDQ0MGQ0NDFhNDkpLAorICAgIFU2NF9DICgweGZlYTA3ZjdmZTE3ZmRmOWUpLCBVNjRfQyAoMHg0Zjg4YTlhOTllYTkyMTM3KSwKKyAgICBVNjRfQyAoMHg1NDY3MmEyYWE4MmE0ZDgyKSwgVTY0X0MgKDB4NmIwYWJiYmJkNmJiYjE2ZCksCisgICAgVTY0X0MgKDB4OWY4N2MxYzEyM2MxNDZlMiksIFU2NF9DICgweGE2ZjE1MzUzNTE1M2EyMDIpLAorICAgIFU2NF9DICgweGE1NzJkY2RjNTdkY2FlOGIpLCBVNjRfQyAoMHgxNjUzMGIwYjJjMGI1ODI3KSwKKyAgICBVNjRfQyAoMHgyNzAxOWQ5ZDRlOWQ5Y2QzKSwgVTY0X0MgKDB4ZDgyYjZjNmNhZDZjNDdjMSksCisgICAgVTY0X0MgKDB4NjJhNDMxMzFjNDMxOTVmNSksIFU2NF9DICgweGU4ZjM3NDc0Y2Q3NDg3YjkpLAorICAgIFU2NF9DICgweGYxMTVmNmY2ZmZmNmUzMDkpLCBVNjRfQyAoMHg4YzRjNDY0NjA1NDYwYTQzKSwKKyAgICBVNjRfQyAoMHg0NWE1YWNhYzhhYWMwOTI2KSwgVTY0X0MgKDB4MGZiNTg5ODkxZTg5M2M5NyksCisgICAgVTY0X0MgKDB4MjhiNDE0MTQ1MDE0YTA0NCksIFU2NF9DICgweGRmYmFlMWUxYTNlMTViNDIpLAorICAgIFU2NF9DICgweDJjYTYxNjE2NTgxNmIwNGUpLCBVNjRfQyAoMHg3NGY3M2EzYWU4M2FjZGQyKSwKKyAgICBVNjRfQyAoMHhkMjA2Njk2OWI5Njk2ZmQwKSwgVTY0X0MgKDB4MTI0MTA5MDkyNDA5NDgyZCksCisgICAgVTY0X0MgKDB4ZTBkNzcwNzBkZDcwYTdhZCksIFU2NF9DICgweDcxNmZiNmI2ZTJiNmQ5NTQpLAorICAgIFU2NF9DICgweGJkMWVkMGQwNjdkMGNlYjcpLCBVNjRfQyAoMHhjN2Q2ZWRlZDkzZWQzYjdlKSwKKyAgICBVNjRfQyAoMHg4NWUyY2NjYzE3Y2MyZWRiKSwgVTY0X0MgKDB4ODQ2ODQyNDIxNTQyMmE1NyksCisgICAgVTY0X0MgKDB4MmQyYzk4OTg1YTk4YjRjMiksIFU2NF9DICgweDU1ZWRhNGE0YWFhNDQ5MGUpLAorICAgIFU2NF9DICgweDUwNzUyODI4YTAyODVkODgpLCBVNjRfQyAoMHhiODg2NWM1YzZkNWNkYTMxKSwKKyAgICBVNjRfQyAoMHhlZDZiZjhmOGM3Zjg5MzNmKSwgVTY0X0MgKDB4MTFjMjg2ODYyMjg2NDRhNCksCisgIH07CisKK3N0YXRpYyBjb25zdCB1NjQgQzNbMjU2XSA9CisgIHsKKyAgICBVNjRfQyAoMHg3ODMwZDgxODE4NjAxOGMwKSwgVTY0X0MgKDB4YWY0NjI2MjMyMzhjMjMwNSksCisgICAgVTY0X0MgKDB4Zjk5MWI4YzZjNjNmYzY3ZSksIFU2NF9DICgweDZmY2RmYmU4ZTg4N2U4MTMpLAorICAgIFU2NF9DICgweGExMTNjYjg3ODcyNjg3NGMpLCBVNjRfQyAoMHg2MjZkMTFiOGI4ZGFiOGE5KSwKKyAgICBVNjRfQyAoMHgwNTAyMDkwMTAxMDQwMTA4KSwgVTY0X0MgKDB4NmU5ZTBkNGY0ZjIxNGY0MiksCisgICAgVTY0X0MgKDB4ZWU2YzliMzYzNmQ4MzZhZCksIFU2NF9DICgweDA0NTFmZmE2YTZhMmE2NTkpLAorICAgIFU2NF9DICgweGJkYjkwY2QyZDI2ZmQyZGUpLCBVNjRfQyAoMHgwNmY3MGVmNWY1ZjNmNWZiKSwKKyAgICBVNjRfQyAoMHg4MGYyOTY3OTc5Zjk3OWVmKSwgVTY0X0MgKDB4Y2VkZTMwNmY2ZmExNmY1ZiksCisgICAgVTY0X0MgKDB4ZWYzZjZkOTE5MTdlOTFmYyksIFU2NF9DICgweDA3YTRmODUyNTI1NTUyYWEpLAorICAgIFU2NF9DICgweGZkYzA0NzYwNjA5ZDYwMjcpLCBVNjRfQyAoMHg3NjY1MzViY2JjY2FiYzg5KSwKKyAgICBVNjRfQyAoMHhjZDJiMzc5YjliNTY5YmFjKSwgVTY0X0MgKDB4OGMwMThhOGU4ZTAyOGUwNCksCisgICAgVTY0X0MgKDB4MTU1YmQyYTNhM2I2YTM3MSksIFU2NF9DICgweDNjMTg2YzBjMGMzMDBjNjApLAorICAgIFU2NF9DICgweDhhZjY4NDdiN2JmMTdiZmYpLCBVNjRfQyAoMHhlMTZhODAzNTM1ZDQzNWI1KSwKKyAgICBVNjRfQyAoMHg2OTNhZjUxZDFkNzQxZGU4KSwgVTY0X0MgKDB4NDdkZGIzZTBlMGE3ZTA1MyksCisgICAgVTY0X0MgKDB4YWNiMzIxZDdkNzdiZDdmNiksIFU2NF9DICgweGVkOTk5Y2MyYzIyZmMyNWUpLAorICAgIFU2NF9DICgweDk2NWM0MzJlMmViODJlNmQpLCBVNjRfQyAoMHg3YTk2Mjk0YjRiMzE0YjYyKSwKKyAgICBVNjRfQyAoMHgyMWUxNWRmZWZlZGZmZWEzKSwgVTY0X0MgKDB4MTZhZWQ1NTc1NzQxNTc4MiksCisgICAgVTY0X0MgKDB4NDEyYWJkMTUxNTU0MTVhOCksIFU2NF9DICgweGI2ZWVlODc3NzdjMTc3OWYpLAorICAgIFU2NF9DICgweGViNmU5MjM3MzdkYzM3YTUpLCBVNjRfQyAoMHg1NmQ3OWVlNWU1YjNlNTdiKSwKKyAgICBVNjRfQyAoMHhkOTIzMTM5ZjlmNDY5ZjhjKSwgVTY0X0MgKDB4MTdmZDIzZjBmMGU3ZjBkMyksCisgICAgVTY0X0MgKDB4N2Y5NDIwNGE0YTM1NGE2YSksIFU2NF9DICgweDk1YTk0NGRhZGE0ZmRhOWUpLAorICAgIFU2NF9DICgweDI1YjBhMjU4NTg3ZDU4ZmEpLCBVNjRfQyAoMHhjYThmY2ZjOWM5MDNjOTA2KSwKKyAgICBVNjRfQyAoMHg4ZDUyN2MyOTI5YTQyOTU1KSwgVTY0X0MgKDB4MjIxNDVhMGEwYTI4MGE1MCksCisgICAgVTY0X0MgKDB4NGY3ZjUwYjFiMWZlYjFlMSksIFU2NF9DICgweDFhNWRjOWEwYTBiYWEwNjkpLAorICAgIFU2NF9DICgweGRhZDYxNDZiNmJiMTZiN2YpLCBVNjRfQyAoMHhhYjE3ZDk4NTg1MmU4NTVjKSwKKyAgICBVNjRfQyAoMHg3MzY3M2NiZGJkY2ViZDgxKSwgVTY0X0MgKDB4MzRiYThmNWQ1ZDY5NWRkMiksCisgICAgVTY0X0MgKDB4NTAyMDkwMTAxMDQwMTA4MCksIFU2NF9DICgweDAzZjUwN2Y0ZjRmN2Y0ZjMpLAorICAgIFU2NF9DICgweGMwOGJkZGNiY2IwYmNiMTYpLCBVNjRfQyAoMHhjNjdjZDMzZTNlZjgzZWVkKSwKKyAgICBVNjRfQyAoMHgxMTBhMmQwNTA1MTQwNTI4KSwgVTY0X0MgKDB4ZTZjZTc4Njc2NzgxNjcxZiksCisgICAgVTY0X0MgKDB4NTNkNTk3ZTRlNGI3ZTQ3MyksIFU2NF9DICgweGJiNGUwMjI3Mjc5YzI3MjUpLAorICAgIFU2NF9DICgweDU4ODI3MzQxNDExOTQxMzIpLCBVNjRfQyAoMHg5ZDBiYTc4YjhiMTY4YjJjKSwKKyAgICBVNjRfQyAoMHgwMTUzZjZhN2E3YTZhNzUxKSwgVTY0X0MgKDB4OTRmYWIyN2Q3ZGU5N2RjZiksCisgICAgVTY0X0MgKDB4ZmIzNzQ5OTU5NTZlOTVkYyksIFU2NF9DICgweDlmYWQ1NmQ4ZDg0N2Q4OGUpLAorICAgIFU2NF9DICgweDMwZWI3MGZiZmJjYmZiOGIpLCBVNjRfQyAoMHg3MWMxY2RlZWVlOWZlZTIzKSwKKyAgICBVNjRfQyAoMHg5MWY4YmI3YzdjZWQ3Y2M3KSwgVTY0X0MgKDB4ZTNjYzcxNjY2Njg1NjYxNyksCisgICAgVTY0X0MgKDB4OGVhNzdiZGRkZDUzZGRhNiksIFU2NF9DICgweDRiMmVhZjE3MTc1YzE3YjgpLAorICAgIFU2NF9DICgweDQ2OGU0NTQ3NDcwMTQ3MDIpLCBVNjRfQyAoMHhkYzIxMWE5ZTllNDI5ZTg0KSwKKyAgICBVNjRfQyAoMHhjNTg5ZDRjYWNhMGZjYTFlKSwgVTY0X0MgKDB4OTk1YTU4MmQyZGI0MmQ3NSksCisgICAgVTY0X0MgKDB4Nzk2MzJlYmZiZmM2YmY5MSksIFU2NF9DICgweDFiMGUzZjA3MDcxYzA3MzgpLAorICAgIFU2NF9DICgweDIzNDdhY2FkYWQ4ZWFkMDEpLCBVNjRfQyAoMHgyZmI0YjA1YTVhNzU1YWVhKSwKKyAgICBVNjRfQyAoMHhiNTFiZWY4MzgzMzY4MzZjKSwgVTY0X0MgKDB4ZmY2NmI2MzMzM2NjMzM4NSksCisgICAgVTY0X0MgKDB4ZjJjNjVjNjM2MzkxNjMzZiksIFU2NF9DICgweDBhMDQxMjAyMDIwODAyMTApLAorICAgIFU2NF9DICgweDM4NDk5M2FhYWE5MmFhMzkpLCBVNjRfQyAoMHhhOGUyZGU3MTcxZDk3MWFmKSwKKyAgICBVNjRfQyAoMHhjZjhkYzZjOGM4MDdjODBlKSwgVTY0X0MgKDB4N2QzMmQxMTkxOTY0MTljOCksCisgICAgVTY0X0MgKDB4NzA5MjNiNDk0OTM5NDk3MiksIFU2NF9DICgweDlhYWY1ZmQ5ZDk0M2Q5ODYpLAorICAgIFU2NF9DICgweDFkZjkzMWYyZjJlZmYyYzMpLCBVNjRfQyAoMHg0OGRiYThlM2UzYWJlMzRiKSwKKyAgICBVNjRfQyAoMHgyYWI2Yjk1YjViNzE1YmUyKSwgVTY0X0MgKDB4OTIwZGJjODg4ODFhODgzNCksCisgICAgVTY0X0MgKDB4YzgyOTNlOWE5YTUyOWFhNCksIFU2NF9DICgweGJlNGMwYjI2MjY5ODI2MmQpLAorICAgIFU2NF9DICgweGZhNjRiZjMyMzJjODMyOGQpLCBVNjRfQyAoMHg0YTdkNTliMGIwZmFiMGU5KSwKKyAgICBVNjRfQyAoMHg2YWNmZjJlOWU5ODNlOTFiKSwgVTY0X0MgKDB4MzMxZTc3MGYwZjNjMGY3OCksCisgICAgVTY0X0MgKDB4YTZiNzMzZDVkNTczZDVlNiksIFU2NF9DICgweGJhMWRmNDgwODAzYTgwNzQpLAorICAgIFU2NF9DICgweDdjNjEyN2JlYmVjMmJlOTkpLCBVNjRfQyAoMHhkZTg3ZWJjZGNkMTNjZDI2KSwKKyAgICBVNjRfQyAoMHhlNDY4ODkzNDM0ZDAzNGJkKSwgVTY0X0MgKDB4NzU5MDMyNDg0ODNkNDg3YSksCisgICAgVTY0X0MgKDB4MjRlMzU0ZmZmZmRiZmZhYiksIFU2NF9DICgweDhmZjQ4ZDdhN2FmNTdhZjcpLAorICAgIFU2NF9DICgweGVhM2Q2NDkwOTA3YTkwZjQpLCBVNjRfQyAoMHgzZWJlOWQ1ZjVmNjE1ZmMyKSwKKyAgICBVNjRfQyAoMHhhMDQwM2QyMDIwODAyMDFkKSwgVTY0X0MgKDB4ZDVkMDBmNjg2OGJkNjg2NyksCisgICAgVTY0X0MgKDB4NzIzNGNhMWExYTY4MWFkMCksIFU2NF9DICgweDJjNDFiN2FlYWU4MmFlMTkpLAorICAgIFU2NF9DICgweDVlNzU3ZGI0YjRlYWI0YzkpLCBVNjRfQyAoMHgxOWE4Y2U1NDU0NGQ1NDlhKSwKKyAgICBVNjRfQyAoMHhlNTNiN2Y5MzkzNzY5M2VjKSwgVTY0X0MgKDB4YWE0NDJmMjIyMjg4MjIwZCksCisgICAgVTY0X0MgKDB4ZTljODYzNjQ2NDhkNjQwNyksIFU2NF9DICgweDEyZmYyYWYxZjFlM2YxZGIpLAorICAgIFU2NF9DICgweGEyZTZjYzczNzNkMTczYmYpLCBVNjRfQyAoMHg1YTI0ODIxMjEyNDgxMjkwKSwKKyAgICBVNjRfQyAoMHg1ZDgwN2E0MDQwMWQ0MDNhKSwgVTY0X0MgKDB4MjgxMDQ4MDgwODIwMDg0MCksCisgICAgVTY0X0MgKDB4ZTg5Yjk1YzNjMzJiYzM1NiksIFU2NF9DICgweDdiYzVkZmVjZWM5N2VjMzMpLAorICAgIFU2NF9DICgweDkwYWI0ZGRiZGI0YmRiOTYpLCBVNjRfQyAoMHgxZjVmYzBhMWExYmVhMTYxKSwKKyAgICBVNjRfQyAoMHg4MzA3OTE4ZDhkMGU4ZDFjKSwgVTY0X0MgKDB4Yzk3YWM4M2QzZGY0M2RmNSksCisgICAgVTY0X0MgKDB4ZjEzMzViOTc5NzY2OTdjYyksIFU2NF9DICgweDAwMDAwMDAwMDAwMDAwMDApLAorICAgIFU2NF9DICgweGQ0ODNmOWNmY2YxYmNmMzYpLCBVNjRfQyAoMHg4NzU2NmUyYjJiYWMyYjQ1KSwKKyAgICBVNjRfQyAoMHhiM2VjZTE3Njc2YzU3Njk3KSwgVTY0X0MgKDB4YjAxOWU2ODI4MjMyODI2NCksCisgICAgVTY0X0MgKDB4YTliMTI4ZDZkNjdmZDZmZSksIFU2NF9DICgweDc3MzZjMzFiMWI2YzFiZDgpLAorICAgIFU2NF9DICgweDViNzc3NGI1YjVlZWI1YzEpLCBVNjRfQyAoMHgyOTQzYmVhZmFmODZhZjExKSwKKyAgICBVNjRfQyAoMHhkZmQ0MWQ2YTZhYjU2YTc3KSwgVTY0X0MgKDB4MGRhMGVhNTA1MDVkNTBiYSksCisgICAgVTY0X0MgKDB4NGM4YTU3NDU0NTA5NDUxMiksIFU2NF9DICgweDE4ZmIzOGYzZjNlYmYzY2IpLAorICAgIFU2NF9DICgweGYwNjBhZDMwMzBjMDMwOWQpLCBVNjRfQyAoMHg3NGMzYzRlZmVmOWJlZjJiKSwKKyAgICBVNjRfQyAoMHhjMzdlZGEzZjNmZmMzZmU1KSwgVTY0X0MgKDB4MWNhYWM3NTU1NTQ5NTU5MiksCisgICAgVTY0X0MgKDB4MTA1OWRiYTJhMmIyYTI3OSksIFU2NF9DICgweDY1YzllOWVhZWE4ZmVhMDMpLAorICAgIFU2NF9DICgweGVjY2E2YTY1NjU4OTY1MGYpLCBVNjRfQyAoMHg2ODY5MDNiYWJhZDJiYWI5KSwKKyAgICBVNjRfQyAoMHg5MzVlNGEyZjJmYmMyZjY1KSwgVTY0X0MgKDB4ZTc5ZDhlYzBjMDI3YzA0ZSksCisgICAgVTY0X0MgKDB4ODFhMTYwZGVkZTVmZGViZSksIFU2NF9DICgweDZjMzhmYzFjMWM3MDFjZTApLAorICAgIFU2NF9DICgweDJlZTc0NmZkZmRkM2ZkYmIpLCBVNjRfQyAoMHg2NDlhMWY0ZDRkMjk0ZDUyKSwKKyAgICBVNjRfQyAoMHhlMDM5NzY5MjkyNzI5MmU0KSwgVTY0X0MgKDB4YmNlYWZhNzU3NWM5NzU4ZiksCisgICAgVTY0X0MgKDB4MWUwYzM2MDYwNjE4MDYzMCksIFU2NF9DICgweDk4MDlhZThhOGExMjhhMjQpLAorICAgIFU2NF9DICgweDQwNzk0YmIyYjJmMmIyZjkpLCBVNjRfQyAoMHg1OWQxODVlNmU2YmZlNjYzKSwKKyAgICBVNjRfQyAoMHgzNjFjN2UwZTBlMzgwZTcwKSwgVTY0X0MgKDB4NjMzZWU3MWYxZjdjMWZmOCksCisgICAgVTY0X0MgKDB4ZjdjNDU1NjI2Mjk1NjIzNyksIFU2NF9DICgweGEzYjUzYWQ0ZDQ3N2Q0ZWUpLAorICAgIFU2NF9DICgweDMyNGQ4MWE4YTg5YWE4MjkpLCBVNjRfQyAoMHhmNDMxNTI5Njk2NjI5NmM0KSwKKyAgICBVNjRfQyAoMHgzYWVmNjJmOWY5YzNmOTliKSwgVTY0X0MgKDB4ZjY5N2EzYzVjNTMzYzU2NiksCisgICAgVTY0X0MgKDB4YjE0YTEwMjUyNTk0MjUzNSksIFU2NF9DICgweDIwYjJhYjU5NTk3OTU5ZjIpLAorICAgIFU2NF9DICgweGFlMTVkMDg0ODQyYTg0NTQpLCBVNjRfQyAoMHhhN2U0YzU3MjcyZDU3MmI3KSwKKyAgICBVNjRfQyAoMHhkZDcyZWMzOTM5ZTQzOWQ1KSwgVTY0X0MgKDB4NjE5ODE2NGM0YzJkNGM1YSksCisgICAgVTY0X0MgKDB4M2JiYzk0NWU1ZTY1NWVjYSksIFU2NF9DICgweDg1ZjA5Zjc4NzhmZDc4ZTcpLAorICAgIFU2NF9DICgweGQ4NzBlNTM4MzhlMDM4ZGQpLCBVNjRfQyAoMHg4NjA1OTg4YzhjMGE4YzE0KSwKKyAgICBVNjRfQyAoMHhiMmJmMTdkMWQxNjNkMWM2KSwgVTY0X0MgKDB4MGI1N2U0YTVhNWFlYTU0MSksCisgICAgVTY0X0MgKDB4NGRkOWExZTJlMmFmZTI0MyksIFU2NF9DICgweGY4YzI0ZTYxNjE5OTYxMmYpLAorICAgIFU2NF9DICgweDQ1N2I0MmIzYjNmNmIzZjEpLCBVNjRfQyAoMHhhNTQyMzQyMTIxODQyMTE1KSwKKyAgICBVNjRfQyAoMHhkNjI1MDg5YzljNGE5Yzk0KSwgVTY0X0MgKDB4NjYzY2VlMWUxZTc4MWVmMCksCisgICAgVTY0X0MgKDB4NTI4NjYxNDM0MzExNDMyMiksIFU2NF9DICgweGZjOTNiMWM3YzczYmM3NzYpLAorICAgIFU2NF9DICgweDJiZTU0ZmZjZmNkN2ZjYjMpLCBVNjRfQyAoMHgxNDA4MjQwNDA0MTAwNDIwKSwKKyAgICBVNjRfQyAoMHgwOGEyZTM1MTUxNTk1MWIyKSwgVTY0X0MgKDB4YzcyZjI1OTk5OTVlOTliYyksCisgICAgVTY0X0MgKDB4YzRkYTIyNmQ2ZGE5NmQ0ZiksIFU2NF9DICgweDM5MWE2NTBkMGQzNDBkNjgpLAorICAgIFU2NF9DICgweDM1ZTk3OWZhZmFjZmZhODMpLCBVNjRfQyAoMHg4NGEzNjlkZmRmNWJkZmI2KSwKKyAgICBVNjRfQyAoMHg5YmZjYTk3ZTdlZTU3ZWQ3KSwgVTY0X0MgKDB4YjQ0ODE5MjQyNDkwMjQzZCksCisgICAgVTY0X0MgKDB4ZDc3NmZlM2IzYmVjM2JjNSksIFU2NF9DICgweDNkNGI5YWFiYWI5NmFiMzEpLAorICAgIFU2NF9DICgweGQxODFmMGNlY2UxZmNlM2UpLCBVNjRfQyAoMHg1NTIyOTkxMTExNDQxMTg4KSwKKyAgICBVNjRfQyAoMHg4OTAzODM4ZjhmMDY4ZjBjKSwgVTY0X0MgKDB4NmI5YzA0NGU0ZTI1NGU0YSksCisgICAgVTY0X0MgKDB4NTE3MzY2YjdiN2U2YjdkMSksIFU2NF9DICgweDYwY2JlMGViZWI4YmViMGIpLAorICAgIFU2NF9DICgweGNjNzhjMTNjM2NmMDNjZmQpLCBVNjRfQyAoMHhiZjFmZmQ4MTgxM2U4MTdjKSwKKyAgICBVNjRfQyAoMHhmZTM1NDA5NDk0NmE5NGQ0KSwgVTY0X0MgKDB4MGNmMzFjZjdmN2ZiZjdlYiksCisgICAgVTY0X0MgKDB4Njc2ZjE4YjliOWRlYjlhMSksIFU2NF9DICgweDVmMjY4YjEzMTM0YzEzOTgpLAorICAgIFU2NF9DICgweDljNTg1MTJjMmNiMDJjN2QpLCBVNjRfQyAoMHhiOGJiMDVkM2QzNmJkM2Q2KSwKKyAgICBVNjRfQyAoMHg1Y2QzOGNlN2U3YmJlNzZiKSwgVTY0X0MgKDB4Y2JkYzM5NmU2ZWE1NmU1NyksCisgICAgVTY0X0MgKDB4ZjM5NWFhYzRjNDM3YzQ2ZSksIFU2NF9DICgweDBmMDYxYjAzMDMwYzAzMTgpLAorICAgIFU2NF9DICgweDEzYWNkYzU2NTY0NTU2OGEpLCBVNjRfQyAoMHg0OTg4NWU0NDQ0MGQ0NDFhKSwKKyAgICBVNjRfQyAoMHg5ZWZlYTA3ZjdmZTE3ZmRmKSwgVTY0X0MgKDB4Mzc0Zjg4YTlhOTllYTkyMSksCisgICAgVTY0X0MgKDB4ODI1NDY3MmEyYWE4MmE0ZCksIFU2NF9DICgweDZkNmIwYWJiYmJkNmJiYjEpLAorICAgIFU2NF9DICgweGUyOWY4N2MxYzEyM2MxNDYpLCBVNjRfQyAoMHgwMmE2ZjE1MzUzNTE1M2EyKSwKKyAgICBVNjRfQyAoMHg4YmE1NzJkY2RjNTdkY2FlKSwgVTY0X0MgKDB4MjcxNjUzMGIwYjJjMGI1OCksCisgICAgVTY0X0MgKDB4ZDMyNzAxOWQ5ZDRlOWQ5YyksIFU2NF9DICgweGMxZDgyYjZjNmNhZDZjNDcpLAorICAgIFU2NF9DICgweGY1NjJhNDMxMzFjNDMxOTUpLCBVNjRfQyAoMHhiOWU4ZjM3NDc0Y2Q3NDg3KSwKKyAgICBVNjRfQyAoMHgwOWYxMTVmNmY2ZmZmNmUzKSwgVTY0X0MgKDB4NDM4YzRjNDY0NjA1NDYwYSksCisgICAgVTY0X0MgKDB4MjY0NWE1YWNhYzhhYWMwOSksIFU2NF9DICgweDk3MGZiNTg5ODkxZTg5M2MpLAorICAgIFU2NF9DICgweDQ0MjhiNDE0MTQ1MDE0YTApLCBVNjRfQyAoMHg0MmRmYmFlMWUxYTNlMTViKSwKKyAgICBVNjRfQyAoMHg0ZTJjYTYxNjE2NTgxNmIwKSwgVTY0X0MgKDB4ZDI3NGY3M2EzYWU4M2FjZCksCisgICAgVTY0X0MgKDB4ZDBkMjA2Njk2OWI5Njk2ZiksIFU2NF9DICgweDJkMTI0MTA5MDkyNDA5NDgpLAorICAgIFU2NF9DICgweGFkZTBkNzcwNzBkZDcwYTcpLCBVNjRfQyAoMHg1NDcxNmZiNmI2ZTJiNmQ5KSwKKyAgICBVNjRfQyAoMHhiN2JkMWVkMGQwNjdkMGNlKSwgVTY0X0MgKDB4N2VjN2Q2ZWRlZDkzZWQzYiksCisgICAgVTY0X0MgKDB4ZGI4NWUyY2NjYzE3Y2MyZSksIFU2NF9DICgweDU3ODQ2ODQyNDIxNTQyMmEpLAorICAgIFU2NF9DICgweGMyMmQyYzk4OTg1YTk4YjQpLCBVNjRfQyAoMHgwZTU1ZWRhNGE0YWFhNDQ5KSwKKyAgICBVNjRfQyAoMHg4ODUwNzUyODI4YTAyODVkKSwgVTY0X0MgKDB4MzFiODg2NWM1YzZkNWNkYSksCisgICAgVTY0X0MgKDB4M2ZlZDZiZjhmOGM3Zjg5MyksIFU2NF9DICgweGE0MTFjMjg2ODYyMjg2NDQpLAorICB9OworCitzdGF0aWMgY29uc3QgdTY0IEM0WzI1Nl0gPQorICB7CisgICAgVTY0X0MgKDB4YzA3ODMwZDgxODE4NjAxOCksIFU2NF9DICgweDA1YWY0NjI2MjMyMzhjMjMpLAorICAgIFU2NF9DICgweDdlZjk5MWI4YzZjNjNmYzYpLCBVNjRfQyAoMHgxMzZmY2RmYmU4ZTg4N2U4KSwKKyAgICBVNjRfQyAoMHg0Y2ExMTNjYjg3ODcyNjg3KSwgVTY0X0MgKDB4YTk2MjZkMTFiOGI4ZGFiOCksCisgICAgVTY0X0MgKDB4MDgwNTAyMDkwMTAxMDQwMSksIFU2NF9DICgweDQyNmU5ZTBkNGY0ZjIxNGYpLAorICAgIFU2NF9DICgweGFkZWU2YzliMzYzNmQ4MzYpLCBVNjRfQyAoMHg1OTA0NTFmZmE2YTZhMmE2KSwKKyAgICBVNjRfQyAoMHhkZWJkYjkwY2QyZDI2ZmQyKSwgVTY0X0MgKDB4ZmIwNmY3MGVmNWY1ZjNmNSksCisgICAgVTY0X0MgKDB4ZWY4MGYyOTY3OTc5Zjk3OSksIFU2NF9DICgweDVmY2VkZTMwNmY2ZmExNmYpLAorICAgIFU2NF9DICgweGZjZWYzZjZkOTE5MTdlOTEpLCBVNjRfQyAoMHhhYTA3YTRmODUyNTI1NTUyKSwKKyAgICBVNjRfQyAoMHgyN2ZkYzA0NzYwNjA5ZDYwKSwgVTY0X0MgKDB4ODk3NjY1MzViY2JjY2FiYyksCisgICAgVTY0X0MgKDB4YWNjZDJiMzc5YjliNTY5YiksIFU2NF9DICgweDA0OGMwMThhOGU4ZTAyOGUpLAorICAgIFU2NF9DICgweDcxMTU1YmQyYTNhM2I2YTMpLCBVNjRfQyAoMHg2MDNjMTg2YzBjMGMzMDBjKSwKKyAgICBVNjRfQyAoMHhmZjhhZjY4NDdiN2JmMTdiKSwgVTY0X0MgKDB4YjVlMTZhODAzNTM1ZDQzNSksCisgICAgVTY0X0MgKDB4ZTg2OTNhZjUxZDFkNzQxZCksIFU2NF9DICgweDUzNDdkZGIzZTBlMGE3ZTApLAorICAgIFU2NF9DICgweGY2YWNiMzIxZDdkNzdiZDcpLCBVNjRfQyAoMHg1ZWVkOTk5Y2MyYzIyZmMyKSwKKyAgICBVNjRfQyAoMHg2ZDk2NWM0MzJlMmViODJlKSwgVTY0X0MgKDB4NjI3YTk2Mjk0YjRiMzE0YiksCisgICAgVTY0X0MgKDB4YTMyMWUxNWRmZWZlZGZmZSksIFU2NF9DICgweDgyMTZhZWQ1NTc1NzQxNTcpLAorICAgIFU2NF9DICgweGE4NDEyYWJkMTUxNTU0MTUpLCBVNjRfQyAoMHg5ZmI2ZWVlODc3NzdjMTc3KSwKKyAgICBVNjRfQyAoMHhhNWViNmU5MjM3MzdkYzM3KSwgVTY0X0MgKDB4N2I1NmQ3OWVlNWU1YjNlNSksCisgICAgVTY0X0MgKDB4OGNkOTIzMTM5ZjlmNDY5ZiksIFU2NF9DICgweGQzMTdmZDIzZjBmMGU3ZjApLAorICAgIFU2NF9DICgweDZhN2Y5NDIwNGE0YTM1NGEpLCBVNjRfQyAoMHg5ZTk1YTk0NGRhZGE0ZmRhKSwKKyAgICBVNjRfQyAoMHhmYTI1YjBhMjU4NTg3ZDU4KSwgVTY0X0MgKDB4MDZjYThmY2ZjOWM5MDNjOSksCisgICAgVTY0X0MgKDB4NTU4ZDUyN2MyOTI5YTQyOSksIFU2NF9DICgweDUwMjIxNDVhMGEwYTI4MGEpLAorICAgIFU2NF9DICgweGUxNGY3ZjUwYjFiMWZlYjEpLCBVNjRfQyAoMHg2OTFhNWRjOWEwYTBiYWEwKSwKKyAgICBVNjRfQyAoMHg3ZmRhZDYxNDZiNmJiMTZiKSwgVTY0X0MgKDB4NWNhYjE3ZDk4NTg1MmU4NSksCisgICAgVTY0X0MgKDB4ODE3MzY3M2NiZGJkY2ViZCksIFU2NF9DICgweGQyMzRiYThmNWQ1ZDY5NWQpLAorICAgIFU2NF9DICgweDgwNTAyMDkwMTAxMDQwMTApLCBVNjRfQyAoMHhmMzAzZjUwN2Y0ZjRmN2Y0KSwKKyAgICBVNjRfQyAoMHgxNmMwOGJkZGNiY2IwYmNiKSwgVTY0X0MgKDB4ZWRjNjdjZDMzZTNlZjgzZSksCisgICAgVTY0X0MgKDB4MjgxMTBhMmQwNTA1MTQwNSksIFU2NF9DICgweDFmZTZjZTc4Njc2NzgxNjcpLAorICAgIFU2NF9DICgweDczNTNkNTk3ZTRlNGI3ZTQpLCBVNjRfQyAoMHgyNWJiNGUwMjI3Mjc5YzI3KSwKKyAgICBVNjRfQyAoMHgzMjU4ODI3MzQxNDExOTQxKSwgVTY0X0MgKDB4MmM5ZDBiYTc4YjhiMTY4YiksCisgICAgVTY0X0MgKDB4NTEwMTUzZjZhN2E3YTZhNyksIFU2NF9DICgweGNmOTRmYWIyN2Q3ZGU5N2QpLAorICAgIFU2NF9DICgweGRjZmIzNzQ5OTU5NTZlOTUpLCBVNjRfQyAoMHg4ZTlmYWQ1NmQ4ZDg0N2Q4KSwKKyAgICBVNjRfQyAoMHg4YjMwZWI3MGZiZmJjYmZiKSwgVTY0X0MgKDB4MjM3MWMxY2RlZWVlOWZlZSksCisgICAgVTY0X0MgKDB4Yzc5MWY4YmI3YzdjZWQ3YyksIFU2NF9DICgweDE3ZTNjYzcxNjY2Njg1NjYpLAorICAgIFU2NF9DICgweGE2OGVhNzdiZGRkZDUzZGQpLCBVNjRfQyAoMHhiODRiMmVhZjE3MTc1YzE3KSwKKyAgICBVNjRfQyAoMHgwMjQ2OGU0NTQ3NDcwMTQ3KSwgVTY0X0MgKDB4ODRkYzIxMWE5ZTllNDI5ZSksCisgICAgVTY0X0MgKDB4MWVjNTg5ZDRjYWNhMGZjYSksIFU2NF9DICgweDc1OTk1YTU4MmQyZGI0MmQpLAorICAgIFU2NF9DICgweDkxNzk2MzJlYmZiZmM2YmYpLCBVNjRfQyAoMHgzODFiMGUzZjA3MDcxYzA3KSwKKyAgICBVNjRfQyAoMHgwMTIzNDdhY2FkYWQ4ZWFkKSwgVTY0X0MgKDB4ZWEyZmI0YjA1YTVhNzU1YSksCisgICAgVTY0X0MgKDB4NmNiNTFiZWY4MzgzMzY4MyksIFU2NF9DICgweDg1ZmY2NmI2MzMzM2NjMzMpLAorICAgIFU2NF9DICgweDNmZjJjNjVjNjM2MzkxNjMpLCBVNjRfQyAoMHgxMDBhMDQxMjAyMDIwODAyKSwKKyAgICBVNjRfQyAoMHgzOTM4NDk5M2FhYWE5MmFhKSwgVTY0X0MgKDB4YWZhOGUyZGU3MTcxZDk3MSksCisgICAgVTY0X0MgKDB4MGVjZjhkYzZjOGM4MDdjOCksIFU2NF9DICgweGM4N2QzMmQxMTkxOTY0MTkpLAorICAgIFU2NF9DICgweDcyNzA5MjNiNDk0OTM5NDkpLCBVNjRfQyAoMHg4NjlhYWY1ZmQ5ZDk0M2Q5KSwKKyAgICBVNjRfQyAoMHhjMzFkZjkzMWYyZjJlZmYyKSwgVTY0X0MgKDB4NGI0OGRiYThlM2UzYWJlMyksCisgICAgVTY0X0MgKDB4ZTIyYWI2Yjk1YjViNzE1YiksIFU2NF9DICgweDM0OTIwZGJjODg4ODFhODgpLAorICAgIFU2NF9DICgweGE0YzgyOTNlOWE5YTUyOWEpLCBVNjRfQyAoMHgyZGJlNGMwYjI2MjY5ODI2KSwKKyAgICBVNjRfQyAoMHg4ZGZhNjRiZjMyMzJjODMyKSwgVTY0X0MgKDB4ZTk0YTdkNTliMGIwZmFiMCksCisgICAgVTY0X0MgKDB4MWI2YWNmZjJlOWU5ODNlOSksIFU2NF9DICgweDc4MzMxZTc3MGYwZjNjMGYpLAorICAgIFU2NF9DICgweGU2YTZiNzMzZDVkNTczZDUpLCBVNjRfQyAoMHg3NGJhMWRmNDgwODAzYTgwKSwKKyAgICBVNjRfQyAoMHg5OTdjNjEyN2JlYmVjMmJlKSwgVTY0X0MgKDB4MjZkZTg3ZWJjZGNkMTNjZCksCisgICAgVTY0X0MgKDB4YmRlNDY4ODkzNDM0ZDAzNCksIFU2NF9DICgweDdhNzU5MDMyNDg0ODNkNDgpLAorICAgIFU2NF9DICgweGFiMjRlMzU0ZmZmZmRiZmYpLCBVNjRfQyAoMHhmNzhmZjQ4ZDdhN2FmNTdhKSwKKyAgICBVNjRfQyAoMHhmNGVhM2Q2NDkwOTA3YTkwKSwgVTY0X0MgKDB4YzIzZWJlOWQ1ZjVmNjE1ZiksCisgICAgVTY0X0MgKDB4MWRhMDQwM2QyMDIwODAyMCksIFU2NF9DICgweDY3ZDVkMDBmNjg2OGJkNjgpLAorICAgIFU2NF9DICgweGQwNzIzNGNhMWExYTY4MWEpLCBVNjRfQyAoMHgxOTJjNDFiN2FlYWU4MmFlKSwKKyAgICBVNjRfQyAoMHhjOTVlNzU3ZGI0YjRlYWI0KSwgVTY0X0MgKDB4OWExOWE4Y2U1NDU0NGQ1NCksCisgICAgVTY0X0MgKDB4ZWNlNTNiN2Y5MzkzNzY5MyksIFU2NF9DICgweDBkYWE0NDJmMjIyMjg4MjIpLAorICAgIFU2NF9DICgweDA3ZTljODYzNjQ2NDhkNjQpLCBVNjRfQyAoMHhkYjEyZmYyYWYxZjFlM2YxKSwKKyAgICBVNjRfQyAoMHhiZmEyZTZjYzczNzNkMTczKSwgVTY0X0MgKDB4OTA1YTI0ODIxMjEyNDgxMiksCisgICAgVTY0X0MgKDB4M2E1ZDgwN2E0MDQwMWQ0MCksIFU2NF9DICgweDQwMjgxMDQ4MDgwODIwMDgpLAorICAgIFU2NF9DICgweDU2ZTg5Yjk1YzNjMzJiYzMpLCBVNjRfQyAoMHgzMzdiYzVkZmVjZWM5N2VjKSwKKyAgICBVNjRfQyAoMHg5NjkwYWI0ZGRiZGI0YmRiKSwgVTY0X0MgKDB4NjExZjVmYzBhMWExYmVhMSksCisgICAgVTY0X0MgKDB4MWM4MzA3OTE4ZDhkMGU4ZCksIFU2NF9DICgweGY1Yzk3YWM4M2QzZGY0M2QpLAorICAgIFU2NF9DICgweGNjZjEzMzViOTc5NzY2OTcpLCBVNjRfQyAoMHgwMDAwMDAwMDAwMDAwMDAwKSwKKyAgICBVNjRfQyAoMHgzNmQ0ODNmOWNmY2YxYmNmKSwgVTY0X0MgKDB4NDU4NzU2NmUyYjJiYWMyYiksCisgICAgVTY0X0MgKDB4OTdiM2VjZTE3Njc2YzU3NiksIFU2NF9DICgweDY0YjAxOWU2ODI4MjMyODIpLAorICAgIFU2NF9DICgweGZlYTliMTI4ZDZkNjdmZDYpLCBVNjRfQyAoMHhkODc3MzZjMzFiMWI2YzFiKSwKKyAgICBVNjRfQyAoMHhjMTViNzc3NGI1YjVlZWI1KSwgVTY0X0MgKDB4MTEyOTQzYmVhZmFmODZhZiksCisgICAgVTY0X0MgKDB4NzdkZmQ0MWQ2YTZhYjU2YSksIFU2NF9DICgweGJhMGRhMGVhNTA1MDVkNTApLAorICAgIFU2NF9DICgweDEyNGM4YTU3NDU0NTA5NDUpLCBVNjRfQyAoMHhjYjE4ZmIzOGYzZjNlYmYzKSwKKyAgICBVNjRfQyAoMHg5ZGYwNjBhZDMwMzBjMDMwKSwgVTY0X0MgKDB4MmI3NGMzYzRlZmVmOWJlZiksCisgICAgVTY0X0MgKDB4ZTVjMzdlZGEzZjNmZmMzZiksIFU2NF9DICgweDkyMWNhYWM3NTU1NTQ5NTUpLAorICAgIFU2NF9DICgweDc5MTA1OWRiYTJhMmIyYTIpLCBVNjRfQyAoMHgwMzY1YzllOWVhZWE4ZmVhKSwKKyAgICBVNjRfQyAoMHgwZmVjY2E2YTY1NjU4OTY1KSwgVTY0X0MgKDB4Yjk2ODY5MDNiYWJhZDJiYSksCisgICAgVTY0X0MgKDB4NjU5MzVlNGEyZjJmYmMyZiksIFU2NF9DICgweDRlZTc5ZDhlYzBjMDI3YzApLAorICAgIFU2NF9DICgweGJlODFhMTYwZGVkZTVmZGUpLCBVNjRfQyAoMHhlMDZjMzhmYzFjMWM3MDFjKSwKKyAgICBVNjRfQyAoMHhiYjJlZTc0NmZkZmRkM2ZkKSwgVTY0X0MgKDB4NTI2NDlhMWY0ZDRkMjk0ZCksCisgICAgVTY0X0MgKDB4ZTRlMDM5NzY5MjkyNzI5MiksIFU2NF9DICgweDhmYmNlYWZhNzU3NWM5NzUpLAorICAgIFU2NF9DICgweDMwMWUwYzM2MDYwNjE4MDYpLCBVNjRfQyAoMHgyNDk4MDlhZThhOGExMjhhKSwKKyAgICBVNjRfQyAoMHhmOTQwNzk0YmIyYjJmMmIyKSwgVTY0X0MgKDB4NjM1OWQxODVlNmU2YmZlNiksCisgICAgVTY0X0MgKDB4NzAzNjFjN2UwZTBlMzgwZSksIFU2NF9DICgweGY4NjMzZWU3MWYxZjdjMWYpLAorICAgIFU2NF9DICgweDM3ZjdjNDU1NjI2Mjk1NjIpLCBVNjRfQyAoMHhlZWEzYjUzYWQ0ZDQ3N2Q0KSwKKyAgICBVNjRfQyAoMHgyOTMyNGQ4MWE4YTg5YWE4KSwgVTY0X0MgKDB4YzRmNDMxNTI5Njk2NjI5NiksCisgICAgVTY0X0MgKDB4OWIzYWVmNjJmOWY5YzNmOSksIFU2NF9DICgweDY2ZjY5N2EzYzVjNTMzYzUpLAorICAgIFU2NF9DICgweDM1YjE0YTEwMjUyNTk0MjUpLCBVNjRfQyAoMHhmMjIwYjJhYjU5NTk3OTU5KSwKKyAgICBVNjRfQyAoMHg1NGFlMTVkMDg0ODQyYTg0KSwgVTY0X0MgKDB4YjdhN2U0YzU3MjcyZDU3MiksCisgICAgVTY0X0MgKDB4ZDVkZDcyZWMzOTM5ZTQzOSksIFU2NF9DICgweDVhNjE5ODE2NGM0YzJkNGMpLAorICAgIFU2NF9DICgweGNhM2JiYzk0NWU1ZTY1NWUpLCBVNjRfQyAoMHhlNzg1ZjA5Zjc4NzhmZDc4KSwKKyAgICBVNjRfQyAoMHhkZGQ4NzBlNTM4MzhlMDM4KSwgVTY0X0MgKDB4MTQ4NjA1OTg4YzhjMGE4YyksCisgICAgVTY0X0MgKDB4YzZiMmJmMTdkMWQxNjNkMSksIFU2NF9DICgweDQxMGI1N2U0YTVhNWFlYTUpLAorICAgIFU2NF9DICgweDQzNGRkOWExZTJlMmFmZTIpLCBVNjRfQyAoMHgyZmY4YzI0ZTYxNjE5OTYxKSwKKyAgICBVNjRfQyAoMHhmMTQ1N2I0MmIzYjNmNmIzKSwgVTY0X0MgKDB4MTVhNTQyMzQyMTIxODQyMSksCisgICAgVTY0X0MgKDB4OTRkNjI1MDg5YzljNGE5YyksIFU2NF9DICgweGYwNjYzY2VlMWUxZTc4MWUpLAorICAgIFU2NF9DICgweDIyNTI4NjYxNDM0MzExNDMpLCBVNjRfQyAoMHg3NmZjOTNiMWM3YzczYmM3KSwKKyAgICBVNjRfQyAoMHhiMzJiZTU0ZmZjZmNkN2ZjKSwgVTY0X0MgKDB4MjAxNDA4MjQwNDA0MTAwNCksCisgICAgVTY0X0MgKDB4YjIwOGEyZTM1MTUxNTk1MSksIFU2NF9DICgweGJjYzcyZjI1OTk5OTVlOTkpLAorICAgIFU2NF9DICgweDRmYzRkYTIyNmQ2ZGE5NmQpLCBVNjRfQyAoMHg2ODM5MWE2NTBkMGQzNDBkKSwKKyAgICBVNjRfQyAoMHg4MzM1ZTk3OWZhZmFjZmZhKSwgVTY0X0MgKDB4YjY4NGEzNjlkZmRmNWJkZiksCisgICAgVTY0X0MgKDB4ZDc5YmZjYTk3ZTdlZTU3ZSksIFU2NF9DICgweDNkYjQ0ODE5MjQyNDkwMjQpLAorICAgIFU2NF9DICgweGM1ZDc3NmZlM2IzYmVjM2IpLCBVNjRfQyAoMHgzMTNkNGI5YWFiYWI5NmFiKSwKKyAgICBVNjRfQyAoMHgzZWQxODFmMGNlY2UxZmNlKSwgVTY0X0MgKDB4ODg1NTIyOTkxMTExNDQxMSksCisgICAgVTY0X0MgKDB4MGM4OTAzODM4ZjhmMDY4ZiksIFU2NF9DICgweDRhNmI5YzA0NGU0ZTI1NGUpLAorICAgIFU2NF9DICgweGQxNTE3MzY2YjdiN2U2YjcpLCBVNjRfQyAoMHgwYjYwY2JlMGViZWI4YmViKSwKKyAgICBVNjRfQyAoMHhmZGNjNzhjMTNjM2NmMDNjKSwgVTY0X0MgKDB4N2NiZjFmZmQ4MTgxM2U4MSksCisgICAgVTY0X0MgKDB4ZDRmZTM1NDA5NDk0NmE5NCksIFU2NF9DICgweGViMGNmMzFjZjdmN2ZiZjcpLAorICAgIFU2NF9DICgweGExNjc2ZjE4YjliOWRlYjkpLCBVNjRfQyAoMHg5ODVmMjY4YjEzMTM0YzEzKSwKKyAgICBVNjRfQyAoMHg3ZDljNTg1MTJjMmNiMDJjKSwgVTY0X0MgKDB4ZDZiOGJiMDVkM2QzNmJkMyksCisgICAgVTY0X0MgKDB4NmI1Y2QzOGNlN2U3YmJlNyksIFU2NF9DICgweDU3Y2JkYzM5NmU2ZWE1NmUpLAorICAgIFU2NF9DICgweDZlZjM5NWFhYzRjNDM3YzQpLCBVNjRfQyAoMHgxODBmMDYxYjAzMDMwYzAzKSwKKyAgICBVNjRfQyAoMHg4YTEzYWNkYzU2NTY0NTU2KSwgVTY0X0MgKDB4MWE0OTg4NWU0NDQ0MGQ0NCksCisgICAgVTY0X0MgKDB4ZGY5ZWZlYTA3ZjdmZTE3ZiksIFU2NF9DICgweDIxMzc0Zjg4YTlhOTllYTkpLAorICAgIFU2NF9DICgweDRkODI1NDY3MmEyYWE4MmEpLCBVNjRfQyAoMHhiMTZkNmIwYWJiYmJkNmJiKSwKKyAgICBVNjRfQyAoMHg0NmUyOWY4N2MxYzEyM2MxKSwgVTY0X0MgKDB4YTIwMmE2ZjE1MzUzNTE1MyksCisgICAgVTY0X0MgKDB4YWU4YmE1NzJkY2RjNTdkYyksIFU2NF9DICgweDU4MjcxNjUzMGIwYjJjMGIpLAorICAgIFU2NF9DICgweDljZDMyNzAxOWQ5ZDRlOWQpLCBVNjRfQyAoMHg0N2MxZDgyYjZjNmNhZDZjKSwKKyAgICBVNjRfQyAoMHg5NWY1NjJhNDMxMzFjNDMxKSwgVTY0X0MgKDB4ODdiOWU4ZjM3NDc0Y2Q3NCksCisgICAgVTY0X0MgKDB4ZTMwOWYxMTVmNmY2ZmZmNiksIFU2NF9DICgweDBhNDM4YzRjNDY0NjA1NDYpLAorICAgIFU2NF9DICgweDA5MjY0NWE1YWNhYzhhYWMpLCBVNjRfQyAoMHgzYzk3MGZiNTg5ODkxZTg5KSwKKyAgICBVNjRfQyAoMHhhMDQ0MjhiNDE0MTQ1MDE0KSwgVTY0X0MgKDB4NWI0MmRmYmFlMWUxYTNlMSksCisgICAgVTY0X0MgKDB4YjA0ZTJjYTYxNjE2NTgxNiksIFU2NF9DICgweGNkZDI3NGY3M2EzYWU4M2EpLAorICAgIFU2NF9DICgweDZmZDBkMjA2Njk2OWI5NjkpLCBVNjRfQyAoMHg0ODJkMTI0MTA5MDkyNDA5KSwKKyAgICBVNjRfQyAoMHhhN2FkZTBkNzcwNzBkZDcwKSwgVTY0X0MgKDB4ZDk1NDcxNmZiNmI2ZTJiNiksCisgICAgVTY0X0MgKDB4Y2ViN2JkMWVkMGQwNjdkMCksIFU2NF9DICgweDNiN2VjN2Q2ZWRlZDkzZWQpLAorICAgIFU2NF9DICgweDJlZGI4NWUyY2NjYzE3Y2MpLCBVNjRfQyAoMHgyYTU3ODQ2ODQyNDIxNTQyKSwKKyAgICBVNjRfQyAoMHhiNGMyMmQyYzk4OTg1YTk4KSwgVTY0X0MgKDB4NDkwZTU1ZWRhNGE0YWFhNCksCisgICAgVTY0X0MgKDB4NWQ4ODUwNzUyODI4YTAyOCksIFU2NF9DICgweGRhMzFiODg2NWM1YzZkNWMpLAorICAgIFU2NF9DICgweDkzM2ZlZDZiZjhmOGM3ZjgpLCBVNjRfQyAoMHg0NGE0MTFjMjg2ODYyMjg2KSwKKyAgfTsKKworc3RhdGljIGNvbnN0IHU2NCBDNVsyNTZdID0KKyAgeworICAgIFU2NF9DICgweDE4YzA3ODMwZDgxODE4NjApLCBVNjRfQyAoMHgyMzA1YWY0NjI2MjMyMzhjKSwKKyAgICBVNjRfQyAoMHhjNjdlZjk5MWI4YzZjNjNmKSwgVTY0X0MgKDB4ZTgxMzZmY2RmYmU4ZTg4NyksCisgICAgVTY0X0MgKDB4ODc0Y2ExMTNjYjg3ODcyNiksIFU2NF9DICgweGI4YTk2MjZkMTFiOGI4ZGEpLAorICAgIFU2NF9DICgweDAxMDgwNTAyMDkwMTAxMDQpLCBVNjRfQyAoMHg0ZjQyNmU5ZTBkNGY0ZjIxKSwKKyAgICBVNjRfQyAoMHgzNmFkZWU2YzliMzYzNmQ4KSwgVTY0X0MgKDB4YTY1OTA0NTFmZmE2YTZhMiksCisgICAgVTY0X0MgKDB4ZDJkZWJkYjkwY2QyZDI2ZiksIFU2NF9DICgweGY1ZmIwNmY3MGVmNWY1ZjMpLAorICAgIFU2NF9DICgweDc5ZWY4MGYyOTY3OTc5ZjkpLCBVNjRfQyAoMHg2ZjVmY2VkZTMwNmY2ZmExKSwKKyAgICBVNjRfQyAoMHg5MWZjZWYzZjZkOTE5MTdlKSwgVTY0X0MgKDB4NTJhYTA3YTRmODUyNTI1NSksCisgICAgVTY0X0MgKDB4NjAyN2ZkYzA0NzYwNjA5ZCksIFU2NF9DICgweGJjODk3NjY1MzViY2JjY2EpLAorICAgIFU2NF9DICgweDliYWNjZDJiMzc5YjliNTYpLCBVNjRfQyAoMHg4ZTA0OGMwMThhOGU4ZTAyKSwKKyAgICBVNjRfQyAoMHhhMzcxMTU1YmQyYTNhM2I2KSwgVTY0X0MgKDB4MGM2MDNjMTg2YzBjMGMzMCksCisgICAgVTY0X0MgKDB4N2JmZjhhZjY4NDdiN2JmMSksIFU2NF9DICgweDM1YjVlMTZhODAzNTM1ZDQpLAorICAgIFU2NF9DICgweDFkZTg2OTNhZjUxZDFkNzQpLCBVNjRfQyAoMHhlMDUzNDdkZGIzZTBlMGE3KSwKKyAgICBVNjRfQyAoMHhkN2Y2YWNiMzIxZDdkNzdiKSwgVTY0X0MgKDB4YzI1ZWVkOTk5Y2MyYzIyZiksCisgICAgVTY0X0MgKDB4MmU2ZDk2NWM0MzJlMmViOCksIFU2NF9DICgweDRiNjI3YTk2Mjk0YjRiMzEpLAorICAgIFU2NF9DICgweGZlYTMyMWUxNWRmZWZlZGYpLCBVNjRfQyAoMHg1NzgyMTZhZWQ1NTc1NzQxKSwKKyAgICBVNjRfQyAoMHgxNWE4NDEyYWJkMTUxNTU0KSwgVTY0X0MgKDB4Nzc5ZmI2ZWVlODc3NzdjMSksCisgICAgVTY0X0MgKDB4MzdhNWViNmU5MjM3MzdkYyksIFU2NF9DICgweGU1N2I1NmQ3OWVlNWU1YjMpLAorICAgIFU2NF9DICgweDlmOGNkOTIzMTM5ZjlmNDYpLCBVNjRfQyAoMHhmMGQzMTdmZDIzZjBmMGU3KSwKKyAgICBVNjRfQyAoMHg0YTZhN2Y5NDIwNGE0YTM1KSwgVTY0X0MgKDB4ZGE5ZTk1YTk0NGRhZGE0ZiksCisgICAgVTY0X0MgKDB4NThmYTI1YjBhMjU4NTg3ZCksIFU2NF9DICgweGM5MDZjYThmY2ZjOWM5MDMpLAorICAgIFU2NF9DICgweDI5NTU4ZDUyN2MyOTI5YTQpLCBVNjRfQyAoMHgwYTUwMjIxNDVhMGEwYTI4KSwKKyAgICBVNjRfQyAoMHhiMWUxNGY3ZjUwYjFiMWZlKSwgVTY0X0MgKDB4YTA2OTFhNWRjOWEwYTBiYSksCisgICAgVTY0X0MgKDB4NmI3ZmRhZDYxNDZiNmJiMSksIFU2NF9DICgweDg1NWNhYjE3ZDk4NTg1MmUpLAorICAgIFU2NF9DICgweGJkODE3MzY3M2NiZGJkY2UpLCBVNjRfQyAoMHg1ZGQyMzRiYThmNWQ1ZDY5KSwKKyAgICBVNjRfQyAoMHgxMDgwNTAyMDkwMTAxMDQwKSwgVTY0X0MgKDB4ZjRmMzAzZjUwN2Y0ZjRmNyksCisgICAgVTY0X0MgKDB4Y2IxNmMwOGJkZGNiY2IwYiksIFU2NF9DICgweDNlZWRjNjdjZDMzZTNlZjgpLAorICAgIFU2NF9DICgweDA1MjgxMTBhMmQwNTA1MTQpLCBVNjRfQyAoMHg2NzFmZTZjZTc4Njc2NzgxKSwKKyAgICBVNjRfQyAoMHhlNDczNTNkNTk3ZTRlNGI3KSwgVTY0X0MgKDB4MjcyNWJiNGUwMjI3Mjc5YyksCisgICAgVTY0X0MgKDB4NDEzMjU4ODI3MzQxNDExOSksIFU2NF9DICgweDhiMmM5ZDBiYTc4YjhiMTYpLAorICAgIFU2NF9DICgweGE3NTEwMTUzZjZhN2E3YTYpLCBVNjRfQyAoMHg3ZGNmOTRmYWIyN2Q3ZGU5KSwKKyAgICBVNjRfQyAoMHg5NWRjZmIzNzQ5OTU5NTZlKSwgVTY0X0MgKDB4ZDg4ZTlmYWQ1NmQ4ZDg0NyksCisgICAgVTY0X0MgKDB4ZmI4YjMwZWI3MGZiZmJjYiksIFU2NF9DICgweGVlMjM3MWMxY2RlZWVlOWYpLAorICAgIFU2NF9DICgweDdjYzc5MWY4YmI3YzdjZWQpLCBVNjRfQyAoMHg2NjE3ZTNjYzcxNjY2Njg1KSwKKyAgICBVNjRfQyAoMHhkZGE2OGVhNzdiZGRkZDUzKSwgVTY0X0MgKDB4MTdiODRiMmVhZjE3MTc1YyksCisgICAgVTY0X0MgKDB4NDcwMjQ2OGU0NTQ3NDcwMSksIFU2NF9DICgweDllODRkYzIxMWE5ZTllNDIpLAorICAgIFU2NF9DICgweGNhMWVjNTg5ZDRjYWNhMGYpLCBVNjRfQyAoMHgyZDc1OTk1YTU4MmQyZGI0KSwKKyAgICBVNjRfQyAoMHhiZjkxNzk2MzJlYmZiZmM2KSwgVTY0X0MgKDB4MDczODFiMGUzZjA3MDcxYyksCisgICAgVTY0X0MgKDB4YWQwMTIzNDdhY2FkYWQ4ZSksIFU2NF9DICgweDVhZWEyZmI0YjA1YTVhNzUpLAorICAgIFU2NF9DICgweDgzNmNiNTFiZWY4MzgzMzYpLCBVNjRfQyAoMHgzMzg1ZmY2NmI2MzMzM2NjKSwKKyAgICBVNjRfQyAoMHg2MzNmZjJjNjVjNjM2MzkxKSwgVTY0X0MgKDB4MDIxMDBhMDQxMjAyMDIwOCksCisgICAgVTY0X0MgKDB4YWEzOTM4NDk5M2FhYWE5MiksIFU2NF9DICgweDcxYWZhOGUyZGU3MTcxZDkpLAorICAgIFU2NF9DICgweGM4MGVjZjhkYzZjOGM4MDcpLCBVNjRfQyAoMHgxOWM4N2QzMmQxMTkxOTY0KSwKKyAgICBVNjRfQyAoMHg0OTcyNzA5MjNiNDk0OTM5KSwgVTY0X0MgKDB4ZDk4NjlhYWY1ZmQ5ZDk0MyksCisgICAgVTY0X0MgKDB4ZjJjMzFkZjkzMWYyZjJlZiksIFU2NF9DICgweGUzNGI0OGRiYThlM2UzYWIpLAorICAgIFU2NF9DICgweDViZTIyYWI2Yjk1YjViNzEpLCBVNjRfQyAoMHg4ODM0OTIwZGJjODg4ODFhKSwKKyAgICBVNjRfQyAoMHg5YWE0YzgyOTNlOWE5YTUyKSwgVTY0X0MgKDB4MjYyZGJlNGMwYjI2MjY5OCksCisgICAgVTY0X0MgKDB4MzI4ZGZhNjRiZjMyMzJjOCksIFU2NF9DICgweGIwZTk0YTdkNTliMGIwZmEpLAorICAgIFU2NF9DICgweGU5MWI2YWNmZjJlOWU5ODMpLCBVNjRfQyAoMHgwZjc4MzMxZTc3MGYwZjNjKSwKKyAgICBVNjRfQyAoMHhkNWU2YTZiNzMzZDVkNTczKSwgVTY0X0MgKDB4ODA3NGJhMWRmNDgwODAzYSksCisgICAgVTY0X0MgKDB4YmU5OTdjNjEyN2JlYmVjMiksIFU2NF9DICgweGNkMjZkZTg3ZWJjZGNkMTMpLAorICAgIFU2NF9DICgweDM0YmRlNDY4ODkzNDM0ZDApLCBVNjRfQyAoMHg0ODdhNzU5MDMyNDg0ODNkKSwKKyAgICBVNjRfQyAoMHhmZmFiMjRlMzU0ZmZmZmRiKSwgVTY0X0MgKDB4N2FmNzhmZjQ4ZDdhN2FmNSksCisgICAgVTY0X0MgKDB4OTBmNGVhM2Q2NDkwOTA3YSksIFU2NF9DICgweDVmYzIzZWJlOWQ1ZjVmNjEpLAorICAgIFU2NF9DICgweDIwMWRhMDQwM2QyMDIwODApLCBVNjRfQyAoMHg2ODY3ZDVkMDBmNjg2OGJkKSwKKyAgICBVNjRfQyAoMHgxYWQwNzIzNGNhMWExYTY4KSwgVTY0X0MgKDB4YWUxOTJjNDFiN2FlYWU4MiksCisgICAgVTY0X0MgKDB4YjRjOTVlNzU3ZGI0YjRlYSksIFU2NF9DICgweDU0OWExOWE4Y2U1NDU0NGQpLAorICAgIFU2NF9DICgweDkzZWNlNTNiN2Y5MzkzNzYpLCBVNjRfQyAoMHgyMjBkYWE0NDJmMjIyMjg4KSwKKyAgICBVNjRfQyAoMHg2NDA3ZTljODYzNjQ2NDhkKSwgVTY0X0MgKDB4ZjFkYjEyZmYyYWYxZjFlMyksCisgICAgVTY0X0MgKDB4NzNiZmEyZTZjYzczNzNkMSksIFU2NF9DICgweDEyOTA1YTI0ODIxMjEyNDgpLAorICAgIFU2NF9DICgweDQwM2E1ZDgwN2E0MDQwMWQpLCBVNjRfQyAoMHgwODQwMjgxMDQ4MDgwODIwKSwKKyAgICBVNjRfQyAoMHhjMzU2ZTg5Yjk1YzNjMzJiKSwgVTY0X0MgKDB4ZWMzMzdiYzVkZmVjZWM5NyksCisgICAgVTY0X0MgKDB4ZGI5NjkwYWI0ZGRiZGI0YiksIFU2NF9DICgweGExNjExZjVmYzBhMWExYmUpLAorICAgIFU2NF9DICgweDhkMWM4MzA3OTE4ZDhkMGUpLCBVNjRfQyAoMHgzZGY1Yzk3YWM4M2QzZGY0KSwKKyAgICBVNjRfQyAoMHg5N2NjZjEzMzViOTc5NzY2KSwgVTY0X0MgKDB4MDAwMDAwMDAwMDAwMDAwMCksCisgICAgVTY0X0MgKDB4Y2YzNmQ0ODNmOWNmY2YxYiksIFU2NF9DICgweDJiNDU4NzU2NmUyYjJiYWMpLAorICAgIFU2NF9DICgweDc2OTdiM2VjZTE3Njc2YzUpLCBVNjRfQyAoMHg4MjY0YjAxOWU2ODI4MjMyKSwKKyAgICBVNjRfQyAoMHhkNmZlYTliMTI4ZDZkNjdmKSwgVTY0X0MgKDB4MWJkODc3MzZjMzFiMWI2YyksCisgICAgVTY0X0MgKDB4YjVjMTViNzc3NGI1YjVlZSksIFU2NF9DICgweGFmMTEyOTQzYmVhZmFmODYpLAorICAgIFU2NF9DICgweDZhNzdkZmQ0MWQ2YTZhYjUpLCBVNjRfQyAoMHg1MGJhMGRhMGVhNTA1MDVkKSwKKyAgICBVNjRfQyAoMHg0NTEyNGM4YTU3NDU0NTA5KSwgVTY0X0MgKDB4ZjNjYjE4ZmIzOGYzZjNlYiksCisgICAgVTY0X0MgKDB4MzA5ZGYwNjBhZDMwMzBjMCksIFU2NF9DICgweGVmMmI3NGMzYzRlZmVmOWIpLAorICAgIFU2NF9DICgweDNmZTVjMzdlZGEzZjNmZmMpLCBVNjRfQyAoMHg1NTkyMWNhYWM3NTU1NTQ5KSwKKyAgICBVNjRfQyAoMHhhMjc5MTA1OWRiYTJhMmIyKSwgVTY0X0MgKDB4ZWEwMzY1YzllOWVhZWE4ZiksCisgICAgVTY0X0MgKDB4NjUwZmVjY2E2YTY1NjU4OSksIFU2NF9DICgweGJhYjk2ODY5MDNiYWJhZDIpLAorICAgIFU2NF9DICgweDJmNjU5MzVlNGEyZjJmYmMpLCBVNjRfQyAoMHhjMDRlZTc5ZDhlYzBjMDI3KSwKKyAgICBVNjRfQyAoMHhkZWJlODFhMTYwZGVkZTVmKSwgVTY0X0MgKDB4MWNlMDZjMzhmYzFjMWM3MCksCisgICAgVTY0X0MgKDB4ZmRiYjJlZTc0NmZkZmRkMyksIFU2NF9DICgweDRkNTI2NDlhMWY0ZDRkMjkpLAorICAgIFU2NF9DICgweDkyZTRlMDM5NzY5MjkyNzIpLCBVNjRfQyAoMHg3NThmYmNlYWZhNzU3NWM5KSwKKyAgICBVNjRfQyAoMHgwNjMwMWUwYzM2MDYwNjE4KSwgVTY0X0MgKDB4OGEyNDk4MDlhZThhOGExMiksCisgICAgVTY0X0MgKDB4YjJmOTQwNzk0YmIyYjJmMiksIFU2NF9DICgweGU2NjM1OWQxODVlNmU2YmYpLAorICAgIFU2NF9DICgweDBlNzAzNjFjN2UwZTBlMzgpLCBVNjRfQyAoMHgxZmY4NjMzZWU3MWYxZjdjKSwKKyAgICBVNjRfQyAoMHg2MjM3ZjdjNDU1NjI2Mjk1KSwgVTY0X0MgKDB4ZDRlZWEzYjUzYWQ0ZDQ3NyksCisgICAgVTY0X0MgKDB4YTgyOTMyNGQ4MWE4YTg5YSksIFU2NF9DICgweDk2YzRmNDMxNTI5Njk2NjIpLAorICAgIFU2NF9DICgweGY5OWIzYWVmNjJmOWY5YzMpLCBVNjRfQyAoMHhjNTY2ZjY5N2EzYzVjNTMzKSwKKyAgICBVNjRfQyAoMHgyNTM1YjE0YTEwMjUyNTk0KSwgVTY0X0MgKDB4NTlmMjIwYjJhYjU5NTk3OSksCisgICAgVTY0X0MgKDB4ODQ1NGFlMTVkMDg0ODQyYSksIFU2NF9DICgweDcyYjdhN2U0YzU3MjcyZDUpLAorICAgIFU2NF9DICgweDM5ZDVkZDcyZWMzOTM5ZTQpLCBVNjRfQyAoMHg0YzVhNjE5ODE2NGM0YzJkKSwKKyAgICBVNjRfQyAoMHg1ZWNhM2JiYzk0NWU1ZTY1KSwgVTY0X0MgKDB4NzhlNzg1ZjA5Zjc4NzhmZCksCisgICAgVTY0X0MgKDB4MzhkZGQ4NzBlNTM4MzhlMCksIFU2NF9DICgweDhjMTQ4NjA1OTg4YzhjMGEpLAorICAgIFU2NF9DICgweGQxYzZiMmJmMTdkMWQxNjMpLCBVNjRfQyAoMHhhNTQxMGI1N2U0YTVhNWFlKSwKKyAgICBVNjRfQyAoMHhlMjQzNGRkOWExZTJlMmFmKSwgVTY0X0MgKDB4NjEyZmY4YzI0ZTYxNjE5OSksCisgICAgVTY0X0MgKDB4YjNmMTQ1N2I0MmIzYjNmNiksIFU2NF9DICgweDIxMTVhNTQyMzQyMTIxODQpLAorICAgIFU2NF9DICgweDljOTRkNjI1MDg5YzljNGEpLCBVNjRfQyAoMHgxZWYwNjYzY2VlMWUxZTc4KSwKKyAgICBVNjRfQyAoMHg0MzIyNTI4NjYxNDM0MzExKSwgVTY0X0MgKDB4Yzc3NmZjOTNiMWM3YzczYiksCisgICAgVTY0X0MgKDB4ZmNiMzJiZTU0ZmZjZmNkNyksIFU2NF9DICgweDA0MjAxNDA4MjQwNDA0MTApLAorICAgIFU2NF9DICgweDUxYjIwOGEyZTM1MTUxNTkpLCBVNjRfQyAoMHg5OWJjYzcyZjI1OTk5OTVlKSwKKyAgICBVNjRfQyAoMHg2ZDRmYzRkYTIyNmQ2ZGE5KSwgVTY0X0MgKDB4MGQ2ODM5MWE2NTBkMGQzNCksCisgICAgVTY0X0MgKDB4ZmE4MzM1ZTk3OWZhZmFjZiksIFU2NF9DICgweGRmYjY4NGEzNjlkZmRmNWIpLAorICAgIFU2NF9DICgweDdlZDc5YmZjYTk3ZTdlZTUpLCBVNjRfQyAoMHgyNDNkYjQ0ODE5MjQyNDkwKSwKKyAgICBVNjRfQyAoMHgzYmM1ZDc3NmZlM2IzYmVjKSwgVTY0X0MgKDB4YWIzMTNkNGI5YWFiYWI5NiksCisgICAgVTY0X0MgKDB4Y2UzZWQxODFmMGNlY2UxZiksIFU2NF9DICgweDExODg1NTIyOTkxMTExNDQpLAorICAgIFU2NF9DICgweDhmMGM4OTAzODM4ZjhmMDYpLCBVNjRfQyAoMHg0ZTRhNmI5YzA0NGU0ZTI1KSwKKyAgICBVNjRfQyAoMHhiN2QxNTE3MzY2YjdiN2U2KSwgVTY0X0MgKDB4ZWIwYjYwY2JlMGViZWI4YiksCisgICAgVTY0X0MgKDB4M2NmZGNjNzhjMTNjM2NmMCksIFU2NF9DICgweDgxN2NiZjFmZmQ4MTgxM2UpLAorICAgIFU2NF9DICgweDk0ZDRmZTM1NDA5NDk0NmEpLCBVNjRfQyAoMHhmN2ViMGNmMzFjZjdmN2ZiKSwKKyAgICBVNjRfQyAoMHhiOWExNjc2ZjE4YjliOWRlKSwgVTY0X0MgKDB4MTM5ODVmMjY4YjEzMTM0YyksCisgICAgVTY0X0MgKDB4MmM3ZDljNTg1MTJjMmNiMCksIFU2NF9DICgweGQzZDZiOGJiMDVkM2QzNmIpLAorICAgIFU2NF9DICgweGU3NmI1Y2QzOGNlN2U3YmIpLCBVNjRfQyAoMHg2ZTU3Y2JkYzM5NmU2ZWE1KSwKKyAgICBVNjRfQyAoMHhjNDZlZjM5NWFhYzRjNDM3KSwgVTY0X0MgKDB4MDMxODBmMDYxYjAzMDMwYyksCisgICAgVTY0X0MgKDB4NTY4YTEzYWNkYzU2NTY0NSksIFU2NF9DICgweDQ0MWE0OTg4NWU0NDQ0MGQpLAorICAgIFU2NF9DICgweDdmZGY5ZWZlYTA3ZjdmZTEpLCBVNjRfQyAoMHhhOTIxMzc0Zjg4YTlhOTllKSwKKyAgICBVNjRfQyAoMHgyYTRkODI1NDY3MmEyYWE4KSwgVTY0X0MgKDB4YmJiMTZkNmIwYWJiYmJkNiksCisgICAgVTY0X0MgKDB4YzE0NmUyOWY4N2MxYzEyMyksIFU2NF9DICgweDUzYTIwMmE2ZjE1MzUzNTEpLAorICAgIFU2NF9DICgweGRjYWU4YmE1NzJkY2RjNTcpLCBVNjRfQyAoMHgwYjU4MjcxNjUzMGIwYjJjKSwKKyAgICBVNjRfQyAoMHg5ZDljZDMyNzAxOWQ5ZDRlKSwgVTY0X0MgKDB4NmM0N2MxZDgyYjZjNmNhZCksCisgICAgVTY0X0MgKDB4MzE5NWY1NjJhNDMxMzFjNCksIFU2NF9DICgweDc0ODdiOWU4ZjM3NDc0Y2QpLAorICAgIFU2NF9DICgweGY2ZTMwOWYxMTVmNmY2ZmYpLCBVNjRfQyAoMHg0NjBhNDM4YzRjNDY0NjA1KSwKKyAgICBVNjRfQyAoMHhhYzA5MjY0NWE1YWNhYzhhKSwgVTY0X0MgKDB4ODkzYzk3MGZiNTg5ODkxZSksCisgICAgVTY0X0MgKDB4MTRhMDQ0MjhiNDE0MTQ1MCksIFU2NF9DICgweGUxNWI0MmRmYmFlMWUxYTMpLAorICAgIFU2NF9DICgweDE2YjA0ZTJjYTYxNjE2NTgpLCBVNjRfQyAoMHgzYWNkZDI3NGY3M2EzYWU4KSwKKyAgICBVNjRfQyAoMHg2OTZmZDBkMjA2Njk2OWI5KSwgVTY0X0MgKDB4MDk0ODJkMTI0MTA5MDkyNCksCisgICAgVTY0X0MgKDB4NzBhN2FkZTBkNzcwNzBkZCksIFU2NF9DICgweGI2ZDk1NDcxNmZiNmI2ZTIpLAorICAgIFU2NF9DICgweGQwY2ViN2JkMWVkMGQwNjcpLCBVNjRfQyAoMHhlZDNiN2VjN2Q2ZWRlZDkzKSwKKyAgICBVNjRfQyAoMHhjYzJlZGI4NWUyY2NjYzE3KSwgVTY0X0MgKDB4NDIyYTU3ODQ2ODQyNDIxNSksCisgICAgVTY0X0MgKDB4OThiNGMyMmQyYzk4OTg1YSksIFU2NF9DICgweGE0NDkwZTU1ZWRhNGE0YWEpLAorICAgIFU2NF9DICgweDI4NWQ4ODUwNzUyODI4YTApLCBVNjRfQyAoMHg1Y2RhMzFiODg2NWM1YzZkKSwKKyAgICBVNjRfQyAoMHhmODkzM2ZlZDZiZjhmOGM3KSwgVTY0X0MgKDB4ODY0NGE0MTFjMjg2ODYyMiksCisgIH07CisKK3N0YXRpYyBjb25zdCB1NjQgQzZbMjU2XSA9CisgIHsKKyAgICBVNjRfQyAoMHg2MDE4YzA3ODMwZDgxODE4KSwgVTY0X0MgKDB4OGMyMzA1YWY0NjI2MjMyMyksCisgICAgVTY0X0MgKDB4M2ZjNjdlZjk5MWI4YzZjNiksIFU2NF9DICgweDg3ZTgxMzZmY2RmYmU4ZTgpLAorICAgIFU2NF9DICgweDI2ODc0Y2ExMTNjYjg3ODcpLCBVNjRfQyAoMHhkYWI4YTk2MjZkMTFiOGI4KSwKKyAgICBVNjRfQyAoMHgwNDAxMDgwNTAyMDkwMTAxKSwgVTY0X0MgKDB4MjE0ZjQyNmU5ZTBkNGY0ZiksCisgICAgVTY0X0MgKDB4ZDgzNmFkZWU2YzliMzYzNiksIFU2NF9DICgweGEyYTY1OTA0NTFmZmE2YTYpLAorICAgIFU2NF9DICgweDZmZDJkZWJkYjkwY2QyZDIpLCBVNjRfQyAoMHhmM2Y1ZmIwNmY3MGVmNWY1KSwKKyAgICBVNjRfQyAoMHhmOTc5ZWY4MGYyOTY3OTc5KSwgVTY0X0MgKDB4YTE2ZjVmY2VkZTMwNmY2ZiksCisgICAgVTY0X0MgKDB4N2U5MWZjZWYzZjZkOTE5MSksIFU2NF9DICgweDU1NTJhYTA3YTRmODUyNTIpLAorICAgIFU2NF9DICgweDlkNjAyN2ZkYzA0NzYwNjApLCBVNjRfQyAoMHhjYWJjODk3NjY1MzViY2JjKSwKKyAgICBVNjRfQyAoMHg1NjliYWNjZDJiMzc5YjliKSwgVTY0X0MgKDB4MDI4ZTA0OGMwMThhOGU4ZSksCisgICAgVTY0X0MgKDB4YjZhMzcxMTU1YmQyYTNhMyksIFU2NF9DICgweDMwMGM2MDNjMTg2YzBjMGMpLAorICAgIFU2NF9DICgweGYxN2JmZjhhZjY4NDdiN2IpLCBVNjRfQyAoMHhkNDM1YjVlMTZhODAzNTM1KSwKKyAgICBVNjRfQyAoMHg3NDFkZTg2OTNhZjUxZDFkKSwgVTY0X0MgKDB4YTdlMDUzNDdkZGIzZTBlMCksCisgICAgVTY0X0MgKDB4N2JkN2Y2YWNiMzIxZDdkNyksIFU2NF9DICgweDJmYzI1ZWVkOTk5Y2MyYzIpLAorICAgIFU2NF9DICgweGI4MmU2ZDk2NWM0MzJlMmUpLCBVNjRfQyAoMHgzMTRiNjI3YTk2Mjk0YjRiKSwKKyAgICBVNjRfQyAoMHhkZmZlYTMyMWUxNWRmZWZlKSwgVTY0X0MgKDB4NDE1NzgyMTZhZWQ1NTc1NyksCisgICAgVTY0X0MgKDB4NTQxNWE4NDEyYWJkMTUxNSksIFU2NF9DICgweGMxNzc5ZmI2ZWVlODc3NzcpLAorICAgIFU2NF9DICgweGRjMzdhNWViNmU5MjM3MzcpLCBVNjRfQyAoMHhiM2U1N2I1NmQ3OWVlNWU1KSwKKyAgICBVNjRfQyAoMHg0NjlmOGNkOTIzMTM5ZjlmKSwgVTY0X0MgKDB4ZTdmMGQzMTdmZDIzZjBmMCksCisgICAgVTY0X0MgKDB4MzU0YTZhN2Y5NDIwNGE0YSksIFU2NF9DICgweDRmZGE5ZTk1YTk0NGRhZGEpLAorICAgIFU2NF9DICgweDdkNThmYTI1YjBhMjU4NTgpLCBVNjRfQyAoMHgwM2M5MDZjYThmY2ZjOWM5KSwKKyAgICBVNjRfQyAoMHhhNDI5NTU4ZDUyN2MyOTI5KSwgVTY0X0MgKDB4MjgwYTUwMjIxNDVhMGEwYSksCisgICAgVTY0X0MgKDB4ZmViMWUxNGY3ZjUwYjFiMSksIFU2NF9DICgweGJhYTA2OTFhNWRjOWEwYTApLAorICAgIFU2NF9DICgweGIxNmI3ZmRhZDYxNDZiNmIpLCBVNjRfQyAoMHgyZTg1NWNhYjE3ZDk4NTg1KSwKKyAgICBVNjRfQyAoMHhjZWJkODE3MzY3M2NiZGJkKSwgVTY0X0MgKDB4Njk1ZGQyMzRiYThmNWQ1ZCksCisgICAgVTY0X0MgKDB4NDAxMDgwNTAyMDkwMTAxMCksIFU2NF9DICgweGY3ZjRmMzAzZjUwN2Y0ZjQpLAorICAgIFU2NF9DICgweDBiY2IxNmMwOGJkZGNiY2IpLCBVNjRfQyAoMHhmODNlZWRjNjdjZDMzZTNlKSwKKyAgICBVNjRfQyAoMHgxNDA1MjgxMTBhMmQwNTA1KSwgVTY0X0MgKDB4ODE2NzFmZTZjZTc4Njc2NyksCisgICAgVTY0X0MgKDB4YjdlNDczNTNkNTk3ZTRlNCksIFU2NF9DICgweDljMjcyNWJiNGUwMjI3MjcpLAorICAgIFU2NF9DICgweDE5NDEzMjU4ODI3MzQxNDEpLCBVNjRfQyAoMHgxNjhiMmM5ZDBiYTc4YjhiKSwKKyAgICBVNjRfQyAoMHhhNmE3NTEwMTUzZjZhN2E3KSwgVTY0X0MgKDB4ZTk3ZGNmOTRmYWIyN2Q3ZCksCisgICAgVTY0X0MgKDB4NmU5NWRjZmIzNzQ5OTU5NSksIFU2NF9DICgweDQ3ZDg4ZTlmYWQ1NmQ4ZDgpLAorICAgIFU2NF9DICgweGNiZmI4YjMwZWI3MGZiZmIpLCBVNjRfQyAoMHg5ZmVlMjM3MWMxY2RlZWVlKSwKKyAgICBVNjRfQyAoMHhlZDdjYzc5MWY4YmI3YzdjKSwgVTY0X0MgKDB4ODU2NjE3ZTNjYzcxNjY2NiksCisgICAgVTY0X0MgKDB4NTNkZGE2OGVhNzdiZGRkZCksIFU2NF9DICgweDVjMTdiODRiMmVhZjE3MTcpLAorICAgIFU2NF9DICgweDAxNDcwMjQ2OGU0NTQ3NDcpLCBVNjRfQyAoMHg0MjllODRkYzIxMWE5ZTllKSwKKyAgICBVNjRfQyAoMHgwZmNhMWVjNTg5ZDRjYWNhKSwgVTY0X0MgKDB4YjQyZDc1OTk1YTU4MmQyZCksCisgICAgVTY0X0MgKDB4YzZiZjkxNzk2MzJlYmZiZiksIFU2NF9DICgweDFjMDczODFiMGUzZjA3MDcpLAorICAgIFU2NF9DICgweDhlYWQwMTIzNDdhY2FkYWQpLCBVNjRfQyAoMHg3NTVhZWEyZmI0YjA1YTVhKSwKKyAgICBVNjRfQyAoMHgzNjgzNmNiNTFiZWY4MzgzKSwgVTY0X0MgKDB4Y2MzMzg1ZmY2NmI2MzMzMyksCisgICAgVTY0X0MgKDB4OTE2MzNmZjJjNjVjNjM2MyksIFU2NF9DICgweDA4MDIxMDBhMDQxMjAyMDIpLAorICAgIFU2NF9DICgweDkyYWEzOTM4NDk5M2FhYWEpLCBVNjRfQyAoMHhkOTcxYWZhOGUyZGU3MTcxKSwKKyAgICBVNjRfQyAoMHgwN2M4MGVjZjhkYzZjOGM4KSwgVTY0X0MgKDB4NjQxOWM4N2QzMmQxMTkxOSksCisgICAgVTY0X0MgKDB4Mzk0OTcyNzA5MjNiNDk0OSksIFU2NF9DICgweDQzZDk4NjlhYWY1ZmQ5ZDkpLAorICAgIFU2NF9DICgweGVmZjJjMzFkZjkzMWYyZjIpLCBVNjRfQyAoMHhhYmUzNGI0OGRiYThlM2UzKSwKKyAgICBVNjRfQyAoMHg3MTViZTIyYWI2Yjk1YjViKSwgVTY0X0MgKDB4MWE4ODM0OTIwZGJjODg4OCksCisgICAgVTY0X0MgKDB4NTI5YWE0YzgyOTNlOWE5YSksIFU2NF9DICgweDk4MjYyZGJlNGMwYjI2MjYpLAorICAgIFU2NF9DICgweGM4MzI4ZGZhNjRiZjMyMzIpLCBVNjRfQyAoMHhmYWIwZTk0YTdkNTliMGIwKSwKKyAgICBVNjRfQyAoMHg4M2U5MWI2YWNmZjJlOWU5KSwgVTY0X0MgKDB4M2MwZjc4MzMxZTc3MGYwZiksCisgICAgVTY0X0MgKDB4NzNkNWU2YTZiNzMzZDVkNSksIFU2NF9DICgweDNhODA3NGJhMWRmNDgwODApLAorICAgIFU2NF9DICgweGMyYmU5OTdjNjEyN2JlYmUpLCBVNjRfQyAoMHgxM2NkMjZkZTg3ZWJjZGNkKSwKKyAgICBVNjRfQyAoMHhkMDM0YmRlNDY4ODkzNDM0KSwgVTY0X0MgKDB4M2Q0ODdhNzU5MDMyNDg0OCksCisgICAgVTY0X0MgKDB4ZGJmZmFiMjRlMzU0ZmZmZiksIFU2NF9DICgweGY1N2FmNzhmZjQ4ZDdhN2EpLAorICAgIFU2NF9DICgweDdhOTBmNGVhM2Q2NDkwOTApLCBVNjRfQyAoMHg2MTVmYzIzZWJlOWQ1ZjVmKSwKKyAgICBVNjRfQyAoMHg4MDIwMWRhMDQwM2QyMDIwKSwgVTY0X0MgKDB4YmQ2ODY3ZDVkMDBmNjg2OCksCisgICAgVTY0X0MgKDB4NjgxYWQwNzIzNGNhMWExYSksIFU2NF9DICgweDgyYWUxOTJjNDFiN2FlYWUpLAorICAgIFU2NF9DICgweGVhYjRjOTVlNzU3ZGI0YjQpLCBVNjRfQyAoMHg0ZDU0OWExOWE4Y2U1NDU0KSwKKyAgICBVNjRfQyAoMHg3NjkzZWNlNTNiN2Y5MzkzKSwgVTY0X0MgKDB4ODgyMjBkYWE0NDJmMjIyMiksCisgICAgVTY0X0MgKDB4OGQ2NDA3ZTljODYzNjQ2NCksIFU2NF9DICgweGUzZjFkYjEyZmYyYWYxZjEpLAorICAgIFU2NF9DICgweGQxNzNiZmEyZTZjYzczNzMpLCBVNjRfQyAoMHg0ODEyOTA1YTI0ODIxMjEyKSwKKyAgICBVNjRfQyAoMHgxZDQwM2E1ZDgwN2E0MDQwKSwgVTY0X0MgKDB4MjAwODQwMjgxMDQ4MDgwOCksCisgICAgVTY0X0MgKDB4MmJjMzU2ZTg5Yjk1YzNjMyksIFU2NF9DICgweDk3ZWMzMzdiYzVkZmVjZWMpLAorICAgIFU2NF9DICgweDRiZGI5NjkwYWI0ZGRiZGIpLCBVNjRfQyAoMHhiZWExNjExZjVmYzBhMWExKSwKKyAgICBVNjRfQyAoMHgwZThkMWM4MzA3OTE4ZDhkKSwgVTY0X0MgKDB4ZjQzZGY1Yzk3YWM4M2QzZCksCisgICAgVTY0X0MgKDB4NjY5N2NjZjEzMzViOTc5NyksIFU2NF9DICgweDAwMDAwMDAwMDAwMDAwMDApLAorICAgIFU2NF9DICgweDFiY2YzNmQ0ODNmOWNmY2YpLCBVNjRfQyAoMHhhYzJiNDU4NzU2NmUyYjJiKSwKKyAgICBVNjRfQyAoMHhjNTc2OTdiM2VjZTE3Njc2KSwgVTY0X0MgKDB4MzI4MjY0YjAxOWU2ODI4MiksCisgICAgVTY0X0MgKDB4N2ZkNmZlYTliMTI4ZDZkNiksIFU2NF9DICgweDZjMWJkODc3MzZjMzFiMWIpLAorICAgIFU2NF9DICgweGVlYjVjMTViNzc3NGI1YjUpLCBVNjRfQyAoMHg4NmFmMTEyOTQzYmVhZmFmKSwKKyAgICBVNjRfQyAoMHhiNTZhNzdkZmQ0MWQ2YTZhKSwgVTY0X0MgKDB4NWQ1MGJhMGRhMGVhNTA1MCksCisgICAgVTY0X0MgKDB4MDk0NTEyNGM4YTU3NDU0NSksIFU2NF9DICgweGViZjNjYjE4ZmIzOGYzZjMpLAorICAgIFU2NF9DICgweGMwMzA5ZGYwNjBhZDMwMzApLCBVNjRfQyAoMHg5YmVmMmI3NGMzYzRlZmVmKSwKKyAgICBVNjRfQyAoMHhmYzNmZTVjMzdlZGEzZjNmKSwgVTY0X0MgKDB4NDk1NTkyMWNhYWM3NTU1NSksCisgICAgVTY0X0MgKDB4YjJhMjc5MTA1OWRiYTJhMiksIFU2NF9DICgweDhmZWEwMzY1YzllOWVhZWEpLAorICAgIFU2NF9DICgweDg5NjUwZmVjY2E2YTY1NjUpLCBVNjRfQyAoMHhkMmJhYjk2ODY5MDNiYWJhKSwKKyAgICBVNjRfQyAoMHhiYzJmNjU5MzVlNGEyZjJmKSwgVTY0X0MgKDB4MjdjMDRlZTc5ZDhlYzBjMCksCisgICAgVTY0X0MgKDB4NWZkZWJlODFhMTYwZGVkZSksIFU2NF9DICgweDcwMWNlMDZjMzhmYzFjMWMpLAorICAgIFU2NF9DICgweGQzZmRiYjJlZTc0NmZkZmQpLCBVNjRfQyAoMHgyOTRkNTI2NDlhMWY0ZDRkKSwKKyAgICBVNjRfQyAoMHg3MjkyZTRlMDM5NzY5MjkyKSwgVTY0X0MgKDB4Yzk3NThmYmNlYWZhNzU3NSksCisgICAgVTY0X0MgKDB4MTgwNjMwMWUwYzM2MDYwNiksIFU2NF9DICgweDEyOGEyNDk4MDlhZThhOGEpLAorICAgIFU2NF9DICgweGYyYjJmOTQwNzk0YmIyYjIpLCBVNjRfQyAoMHhiZmU2NjM1OWQxODVlNmU2KSwKKyAgICBVNjRfQyAoMHgzODBlNzAzNjFjN2UwZTBlKSwgVTY0X0MgKDB4N2MxZmY4NjMzZWU3MWYxZiksCisgICAgVTY0X0MgKDB4OTU2MjM3ZjdjNDU1NjI2MiksIFU2NF9DICgweDc3ZDRlZWEzYjUzYWQ0ZDQpLAorICAgIFU2NF9DICgweDlhYTgyOTMyNGQ4MWE4YTgpLCBVNjRfQyAoMHg2Mjk2YzRmNDMxNTI5Njk2KSwKKyAgICBVNjRfQyAoMHhjM2Y5OWIzYWVmNjJmOWY5KSwgVTY0X0MgKDB4MzNjNTY2ZjY5N2EzYzVjNSksCisgICAgVTY0X0MgKDB4OTQyNTM1YjE0YTEwMjUyNSksIFU2NF9DICgweDc5NTlmMjIwYjJhYjU5NTkpLAorICAgIFU2NF9DICgweDJhODQ1NGFlMTVkMDg0ODQpLCBVNjRfQyAoMHhkNTcyYjdhN2U0YzU3MjcyKSwKKyAgICBVNjRfQyAoMHhlNDM5ZDVkZDcyZWMzOTM5KSwgVTY0X0MgKDB4MmQ0YzVhNjE5ODE2NGM0YyksCisgICAgVTY0X0MgKDB4NjU1ZWNhM2JiYzk0NWU1ZSksIFU2NF9DICgweGZkNzhlNzg1ZjA5Zjc4NzgpLAorICAgIFU2NF9DICgweGUwMzhkZGQ4NzBlNTM4MzgpLCBVNjRfQyAoMHgwYThjMTQ4NjA1OTg4YzhjKSwKKyAgICBVNjRfQyAoMHg2M2QxYzZiMmJmMTdkMWQxKSwgVTY0X0MgKDB4YWVhNTQxMGI1N2U0YTVhNSksCisgICAgVTY0X0MgKDB4YWZlMjQzNGRkOWExZTJlMiksIFU2NF9DICgweDk5NjEyZmY4YzI0ZTYxNjEpLAorICAgIFU2NF9DICgweGY2YjNmMTQ1N2I0MmIzYjMpLCBVNjRfQyAoMHg4NDIxMTVhNTQyMzQyMTIxKSwKKyAgICBVNjRfQyAoMHg0YTljOTRkNjI1MDg5YzljKSwgVTY0X0MgKDB4NzgxZWYwNjYzY2VlMWUxZSksCisgICAgVTY0X0MgKDB4MTE0MzIyNTI4NjYxNDM0MyksIFU2NF9DICgweDNiYzc3NmZjOTNiMWM3YzcpLAorICAgIFU2NF9DICgweGQ3ZmNiMzJiZTU0ZmZjZmMpLCBVNjRfQyAoMHgxMDA0MjAxNDA4MjQwNDA0KSwKKyAgICBVNjRfQyAoMHg1OTUxYjIwOGEyZTM1MTUxKSwgVTY0X0MgKDB4NWU5OWJjYzcyZjI1OTk5OSksCisgICAgVTY0X0MgKDB4YTk2ZDRmYzRkYTIyNmQ2ZCksIFU2NF9DICgweDM0MGQ2ODM5MWE2NTBkMGQpLAorICAgIFU2NF9DICgweGNmZmE4MzM1ZTk3OWZhZmEpLCBVNjRfQyAoMHg1YmRmYjY4NGEzNjlkZmRmKSwKKyAgICBVNjRfQyAoMHhlNTdlZDc5YmZjYTk3ZTdlKSwgVTY0X0MgKDB4OTAyNDNkYjQ0ODE5MjQyNCksCisgICAgVTY0X0MgKDB4ZWMzYmM1ZDc3NmZlM2IzYiksIFU2NF9DICgweDk2YWIzMTNkNGI5YWFiYWIpLAorICAgIFU2NF9DICgweDFmY2UzZWQxODFmMGNlY2UpLCBVNjRfQyAoMHg0NDExODg1NTIyOTkxMTExKSwKKyAgICBVNjRfQyAoMHgwNjhmMGM4OTAzODM4ZjhmKSwgVTY0X0MgKDB4MjU0ZTRhNmI5YzA0NGU0ZSksCisgICAgVTY0X0MgKDB4ZTZiN2QxNTE3MzY2YjdiNyksIFU2NF9DICgweDhiZWIwYjYwY2JlMGViZWIpLAorICAgIFU2NF9DICgweGYwM2NmZGNjNzhjMTNjM2MpLCBVNjRfQyAoMHgzZTgxN2NiZjFmZmQ4MTgxKSwKKyAgICBVNjRfQyAoMHg2YTk0ZDRmZTM1NDA5NDk0KSwgVTY0X0MgKDB4ZmJmN2ViMGNmMzFjZjdmNyksCisgICAgVTY0X0MgKDB4ZGViOWExNjc2ZjE4YjliOSksIFU2NF9DICgweDRjMTM5ODVmMjY4YjEzMTMpLAorICAgIFU2NF9DICgweGIwMmM3ZDljNTg1MTJjMmMpLCBVNjRfQyAoMHg2YmQzZDZiOGJiMDVkM2QzKSwKKyAgICBVNjRfQyAoMHhiYmU3NmI1Y2QzOGNlN2U3KSwgVTY0X0MgKDB4YTU2ZTU3Y2JkYzM5NmU2ZSksCisgICAgVTY0X0MgKDB4MzdjNDZlZjM5NWFhYzRjNCksIFU2NF9DICgweDBjMDMxODBmMDYxYjAzMDMpLAorICAgIFU2NF9DICgweDQ1NTY4YTEzYWNkYzU2NTYpLCBVNjRfQyAoMHgwZDQ0MWE0OTg4NWU0NDQ0KSwKKyAgICBVNjRfQyAoMHhlMTdmZGY5ZWZlYTA3ZjdmKSwgVTY0X0MgKDB4OWVhOTIxMzc0Zjg4YTlhOSksCisgICAgVTY0X0MgKDB4YTgyYTRkODI1NDY3MmEyYSksIFU2NF9DICgweGQ2YmJiMTZkNmIwYWJiYmIpLAorICAgIFU2NF9DICgweDIzYzE0NmUyOWY4N2MxYzEpLCBVNjRfQyAoMHg1MTUzYTIwMmE2ZjE1MzUzKSwKKyAgICBVNjRfQyAoMHg1N2RjYWU4YmE1NzJkY2RjKSwgVTY0X0MgKDB4MmMwYjU4MjcxNjUzMGIwYiksCisgICAgVTY0X0MgKDB4NGU5ZDljZDMyNzAxOWQ5ZCksIFU2NF9DICgweGFkNmM0N2MxZDgyYjZjNmMpLAorICAgIFU2NF9DICgweGM0MzE5NWY1NjJhNDMxMzEpLCBVNjRfQyAoMHhjZDc0ODdiOWU4ZjM3NDc0KSwKKyAgICBVNjRfQyAoMHhmZmY2ZTMwOWYxMTVmNmY2KSwgVTY0X0MgKDB4MDU0NjBhNDM4YzRjNDY0NiksCisgICAgVTY0X0MgKDB4OGFhYzA5MjY0NWE1YWNhYyksIFU2NF9DICgweDFlODkzYzk3MGZiNTg5ODkpLAorICAgIFU2NF9DICgweDUwMTRhMDQ0MjhiNDE0MTQpLCBVNjRfQyAoMHhhM2UxNWI0MmRmYmFlMWUxKSwKKyAgICBVNjRfQyAoMHg1ODE2YjA0ZTJjYTYxNjE2KSwgVTY0X0MgKDB4ZTgzYWNkZDI3NGY3M2EzYSksCisgICAgVTY0X0MgKDB4Yjk2OTZmZDBkMjA2Njk2OSksIFU2NF9DICgweDI0MDk0ODJkMTI0MTA5MDkpLAorICAgIFU2NF9DICgweGRkNzBhN2FkZTBkNzcwNzApLCBVNjRfQyAoMHhlMmI2ZDk1NDcxNmZiNmI2KSwKKyAgICBVNjRfQyAoMHg2N2QwY2ViN2JkMWVkMGQwKSwgVTY0X0MgKDB4OTNlZDNiN2VjN2Q2ZWRlZCksCisgICAgVTY0X0MgKDB4MTdjYzJlZGI4NWUyY2NjYyksIFU2NF9DICgweDE1NDIyYTU3ODQ2ODQyNDIpLAorICAgIFU2NF9DICgweDVhOThiNGMyMmQyYzk4OTgpLCBVNjRfQyAoMHhhYWE0NDkwZTU1ZWRhNGE0KSwKKyAgICBVNjRfQyAoMHhhMDI4NWQ4ODUwNzUyODI4KSwgVTY0X0MgKDB4NmQ1Y2RhMzFiODg2NWM1YyksCisgICAgVTY0X0MgKDB4YzdmODkzM2ZlZDZiZjhmOCksIFU2NF9DICgweDIyODY0NGE0MTFjMjg2ODYpLAorICB9OworCitzdGF0aWMgY29uc3QgdTY0IEM3WzI1Nl0gPQorICB7CisgICAgVTY0X0MgKDB4MTg2MDE4YzA3ODMwZDgxOCksIFU2NF9DICgweDIzOGMyMzA1YWY0NjI2MjMpLAorICAgIFU2NF9DICgweGM2M2ZjNjdlZjk5MWI4YzYpLCBVNjRfQyAoMHhlODg3ZTgxMzZmY2RmYmU4KSwKKyAgICBVNjRfQyAoMHg4NzI2ODc0Y2ExMTNjYjg3KSwgVTY0X0MgKDB4YjhkYWI4YTk2MjZkMTFiOCksCisgICAgVTY0X0MgKDB4MDEwNDAxMDgwNTAyMDkwMSksIFU2NF9DICgweDRmMjE0ZjQyNmU5ZTBkNGYpLAorICAgIFU2NF9DICgweDM2ZDgzNmFkZWU2YzliMzYpLCBVNjRfQyAoMHhhNmEyYTY1OTA0NTFmZmE2KSwKKyAgICBVNjRfQyAoMHhkMjZmZDJkZWJkYjkwY2QyKSwgVTY0X0MgKDB4ZjVmM2Y1ZmIwNmY3MGVmNSksCisgICAgVTY0X0MgKDB4NzlmOTc5ZWY4MGYyOTY3OSksIFU2NF9DICgweDZmYTE2ZjVmY2VkZTMwNmYpLAorICAgIFU2NF9DICgweDkxN2U5MWZjZWYzZjZkOTEpLCBVNjRfQyAoMHg1MjU1NTJhYTA3YTRmODUyKSwKKyAgICBVNjRfQyAoMHg2MDlkNjAyN2ZkYzA0NzYwKSwgVTY0X0MgKDB4YmNjYWJjODk3NjY1MzViYyksCisgICAgVTY0X0MgKDB4OWI1NjliYWNjZDJiMzc5YiksIFU2NF9DICgweDhlMDI4ZTA0OGMwMThhOGUpLAorICAgIFU2NF9DICgweGEzYjZhMzcxMTU1YmQyYTMpLCBVNjRfQyAoMHgwYzMwMGM2MDNjMTg2YzBjKSwKKyAgICBVNjRfQyAoMHg3YmYxN2JmZjhhZjY4NDdiKSwgVTY0X0MgKDB4MzVkNDM1YjVlMTZhODAzNSksCisgICAgVTY0X0MgKDB4MWQ3NDFkZTg2OTNhZjUxZCksIFU2NF9DICgweGUwYTdlMDUzNDdkZGIzZTApLAorICAgIFU2NF9DICgweGQ3N2JkN2Y2YWNiMzIxZDcpLCBVNjRfQyAoMHhjMjJmYzI1ZWVkOTk5Y2MyKSwKKyAgICBVNjRfQyAoMHgyZWI4MmU2ZDk2NWM0MzJlKSwgVTY0X0MgKDB4NGIzMTRiNjI3YTk2Mjk0YiksCisgICAgVTY0X0MgKDB4ZmVkZmZlYTMyMWUxNWRmZSksIFU2NF9DICgweDU3NDE1NzgyMTZhZWQ1NTcpLAorICAgIFU2NF9DICgweDE1NTQxNWE4NDEyYWJkMTUpLCBVNjRfQyAoMHg3N2MxNzc5ZmI2ZWVlODc3KSwKKyAgICBVNjRfQyAoMHgzN2RjMzdhNWViNmU5MjM3KSwgVTY0X0MgKDB4ZTViM2U1N2I1NmQ3OWVlNSksCisgICAgVTY0X0MgKDB4OWY0NjlmOGNkOTIzMTM5ZiksIFU2NF9DICgweGYwZTdmMGQzMTdmZDIzZjApLAorICAgIFU2NF9DICgweDRhMzU0YTZhN2Y5NDIwNGEpLCBVNjRfQyAoMHhkYTRmZGE5ZTk1YTk0NGRhKSwKKyAgICBVNjRfQyAoMHg1ODdkNThmYTI1YjBhMjU4KSwgVTY0X0MgKDB4YzkwM2M5MDZjYThmY2ZjOSksCisgICAgVTY0X0MgKDB4MjlhNDI5NTU4ZDUyN2MyOSksIFU2NF9DICgweDBhMjgwYTUwMjIxNDVhMGEpLAorICAgIFU2NF9DICgweGIxZmViMWUxNGY3ZjUwYjEpLCBVNjRfQyAoMHhhMGJhYTA2OTFhNWRjOWEwKSwKKyAgICBVNjRfQyAoMHg2YmIxNmI3ZmRhZDYxNDZiKSwgVTY0X0MgKDB4ODUyZTg1NWNhYjE3ZDk4NSksCisgICAgVTY0X0MgKDB4YmRjZWJkODE3MzY3M2NiZCksIFU2NF9DICgweDVkNjk1ZGQyMzRiYThmNWQpLAorICAgIFU2NF9DICgweDEwNDAxMDgwNTAyMDkwMTApLCBVNjRfQyAoMHhmNGY3ZjRmMzAzZjUwN2Y0KSwKKyAgICBVNjRfQyAoMHhjYjBiY2IxNmMwOGJkZGNiKSwgVTY0X0MgKDB4M2VmODNlZWRjNjdjZDMzZSksCisgICAgVTY0X0MgKDB4MDUxNDA1MjgxMTBhMmQwNSksIFU2NF9DICgweDY3ODE2NzFmZTZjZTc4NjcpLAorICAgIFU2NF9DICgweGU0YjdlNDczNTNkNTk3ZTQpLCBVNjRfQyAoMHgyNzljMjcyNWJiNGUwMjI3KSwKKyAgICBVNjRfQyAoMHg0MTE5NDEzMjU4ODI3MzQxKSwgVTY0X0MgKDB4OGIxNjhiMmM5ZDBiYTc4YiksCisgICAgVTY0X0MgKDB4YTdhNmE3NTEwMTUzZjZhNyksIFU2NF9DICgweDdkZTk3ZGNmOTRmYWIyN2QpLAorICAgIFU2NF9DICgweDk1NmU5NWRjZmIzNzQ5OTUpLCBVNjRfQyAoMHhkODQ3ZDg4ZTlmYWQ1NmQ4KSwKKyAgICBVNjRfQyAoMHhmYmNiZmI4YjMwZWI3MGZiKSwgVTY0X0MgKDB4ZWU5ZmVlMjM3MWMxY2RlZSksCisgICAgVTY0X0MgKDB4N2NlZDdjYzc5MWY4YmI3YyksIFU2NF9DICgweDY2ODU2NjE3ZTNjYzcxNjYpLAorICAgIFU2NF9DICgweGRkNTNkZGE2OGVhNzdiZGQpLCBVNjRfQyAoMHgxNzVjMTdiODRiMmVhZjE3KSwKKyAgICBVNjRfQyAoMHg0NzAxNDcwMjQ2OGU0NTQ3KSwgVTY0X0MgKDB4OWU0MjllODRkYzIxMWE5ZSksCisgICAgVTY0X0MgKDB4Y2EwZmNhMWVjNTg5ZDRjYSksIFU2NF9DICgweDJkYjQyZDc1OTk1YTU4MmQpLAorICAgIFU2NF9DICgweGJmYzZiZjkxNzk2MzJlYmYpLCBVNjRfQyAoMHgwNzFjMDczODFiMGUzZjA3KSwKKyAgICBVNjRfQyAoMHhhZDhlYWQwMTIzNDdhY2FkKSwgVTY0X0MgKDB4NWE3NTVhZWEyZmI0YjA1YSksCisgICAgVTY0X0MgKDB4ODMzNjgzNmNiNTFiZWY4MyksIFU2NF9DICgweDMzY2MzMzg1ZmY2NmI2MzMpLAorICAgIFU2NF9DICgweDYzOTE2MzNmZjJjNjVjNjMpLCBVNjRfQyAoMHgwMjA4MDIxMDBhMDQxMjAyKSwKKyAgICBVNjRfQyAoMHhhYTkyYWEzOTM4NDk5M2FhKSwgVTY0X0MgKDB4NzFkOTcxYWZhOGUyZGU3MSksCisgICAgVTY0X0MgKDB4YzgwN2M4MGVjZjhkYzZjOCksIFU2NF9DICgweDE5NjQxOWM4N2QzMmQxMTkpLAorICAgIFU2NF9DICgweDQ5Mzk0OTcyNzA5MjNiNDkpLCBVNjRfQyAoMHhkOTQzZDk4NjlhYWY1ZmQ5KSwKKyAgICBVNjRfQyAoMHhmMmVmZjJjMzFkZjkzMWYyKSwgVTY0X0MgKDB4ZTNhYmUzNGI0OGRiYThlMyksCisgICAgVTY0X0MgKDB4NWI3MTViZTIyYWI2Yjk1YiksIFU2NF9DICgweDg4MWE4ODM0OTIwZGJjODgpLAorICAgIFU2NF9DICgweDlhNTI5YWE0YzgyOTNlOWEpLCBVNjRfQyAoMHgyNjk4MjYyZGJlNGMwYjI2KSwKKyAgICBVNjRfQyAoMHgzMmM4MzI4ZGZhNjRiZjMyKSwgVTY0X0MgKDB4YjBmYWIwZTk0YTdkNTliMCksCisgICAgVTY0X0MgKDB4ZTk4M2U5MWI2YWNmZjJlOSksIFU2NF9DICgweDBmM2MwZjc4MzMxZTc3MGYpLAorICAgIFU2NF9DICgweGQ1NzNkNWU2YTZiNzMzZDUpLCBVNjRfQyAoMHg4MDNhODA3NGJhMWRmNDgwKSwKKyAgICBVNjRfQyAoMHhiZWMyYmU5OTdjNjEyN2JlKSwgVTY0X0MgKDB4Y2QxM2NkMjZkZTg3ZWJjZCksCisgICAgVTY0X0MgKDB4MzRkMDM0YmRlNDY4ODkzNCksIFU2NF9DICgweDQ4M2Q0ODdhNzU5MDMyNDgpLAorICAgIFU2NF9DICgweGZmZGJmZmFiMjRlMzU0ZmYpLCBVNjRfQyAoMHg3YWY1N2FmNzhmZjQ4ZDdhKSwKKyAgICBVNjRfQyAoMHg5MDdhOTBmNGVhM2Q2NDkwKSwgVTY0X0MgKDB4NWY2MTVmYzIzZWJlOWQ1ZiksCisgICAgVTY0X0MgKDB4MjA4MDIwMWRhMDQwM2QyMCksIFU2NF9DICgweDY4YmQ2ODY3ZDVkMDBmNjgpLAorICAgIFU2NF9DICgweDFhNjgxYWQwNzIzNGNhMWEpLCBVNjRfQyAoMHhhZTgyYWUxOTJjNDFiN2FlKSwKKyAgICBVNjRfQyAoMHhiNGVhYjRjOTVlNzU3ZGI0KSwgVTY0X0MgKDB4NTQ0ZDU0OWExOWE4Y2U1NCksCisgICAgVTY0X0MgKDB4OTM3NjkzZWNlNTNiN2Y5MyksIFU2NF9DICgweDIyODgyMjBkYWE0NDJmMjIpLAorICAgIFU2NF9DICgweDY0OGQ2NDA3ZTljODYzNjQpLCBVNjRfQyAoMHhmMWUzZjFkYjEyZmYyYWYxKSwKKyAgICBVNjRfQyAoMHg3M2QxNzNiZmEyZTZjYzczKSwgVTY0X0MgKDB4MTI0ODEyOTA1YTI0ODIxMiksCisgICAgVTY0X0MgKDB4NDAxZDQwM2E1ZDgwN2E0MCksIFU2NF9DICgweDA4MjAwODQwMjgxMDQ4MDgpLAorICAgIFU2NF9DICgweGMzMmJjMzU2ZTg5Yjk1YzMpLCBVNjRfQyAoMHhlYzk3ZWMzMzdiYzVkZmVjKSwKKyAgICBVNjRfQyAoMHhkYjRiZGI5NjkwYWI0ZGRiKSwgVTY0X0MgKDB4YTFiZWExNjExZjVmYzBhMSksCisgICAgVTY0X0MgKDB4OGQwZThkMWM4MzA3OTE4ZCksIFU2NF9DICgweDNkZjQzZGY1Yzk3YWM4M2QpLAorICAgIFU2NF9DICgweDk3NjY5N2NjZjEzMzViOTcpLCBVNjRfQyAoMHgwMDAwMDAwMDAwMDAwMDAwKSwKKyAgICBVNjRfQyAoMHhjZjFiY2YzNmQ0ODNmOWNmKSwgVTY0X0MgKDB4MmJhYzJiNDU4NzU2NmUyYiksCisgICAgVTY0X0MgKDB4NzZjNTc2OTdiM2VjZTE3NiksIFU2NF9DICgweDgyMzI4MjY0YjAxOWU2ODIpLAorICAgIFU2NF9DICgweGQ2N2ZkNmZlYTliMTI4ZDYpLCBVNjRfQyAoMHgxYjZjMWJkODc3MzZjMzFiKSwKKyAgICBVNjRfQyAoMHhiNWVlYjVjMTViNzc3NGI1KSwgVTY0X0MgKDB4YWY4NmFmMTEyOTQzYmVhZiksCisgICAgVTY0X0MgKDB4NmFiNTZhNzdkZmQ0MWQ2YSksIFU2NF9DICgweDUwNWQ1MGJhMGRhMGVhNTApLAorICAgIFU2NF9DICgweDQ1MDk0NTEyNGM4YTU3NDUpLCBVNjRfQyAoMHhmM2ViZjNjYjE4ZmIzOGYzKSwKKyAgICBVNjRfQyAoMHgzMGMwMzA5ZGYwNjBhZDMwKSwgVTY0X0MgKDB4ZWY5YmVmMmI3NGMzYzRlZiksCisgICAgVTY0X0MgKDB4M2ZmYzNmZTVjMzdlZGEzZiksIFU2NF9DICgweDU1NDk1NTkyMWNhYWM3NTUpLAorICAgIFU2NF9DICgweGEyYjJhMjc5MTA1OWRiYTIpLCBVNjRfQyAoMHhlYThmZWEwMzY1YzllOWVhKSwKKyAgICBVNjRfQyAoMHg2NTg5NjUwZmVjY2E2YTY1KSwgVTY0X0MgKDB4YmFkMmJhYjk2ODY5MDNiYSksCisgICAgVTY0X0MgKDB4MmZiYzJmNjU5MzVlNGEyZiksIFU2NF9DICgweGMwMjdjMDRlZTc5ZDhlYzApLAorICAgIFU2NF9DICgweGRlNWZkZWJlODFhMTYwZGUpLCBVNjRfQyAoMHgxYzcwMWNlMDZjMzhmYzFjKSwKKyAgICBVNjRfQyAoMHhmZGQzZmRiYjJlZTc0NmZkKSwgVTY0X0MgKDB4NGQyOTRkNTI2NDlhMWY0ZCksCisgICAgVTY0X0MgKDB4OTI3MjkyZTRlMDM5NzY5MiksIFU2NF9DICgweDc1Yzk3NThmYmNlYWZhNzUpLAorICAgIFU2NF9DICgweDA2MTgwNjMwMWUwYzM2MDYpLCBVNjRfQyAoMHg4YTEyOGEyNDk4MDlhZThhKSwKKyAgICBVNjRfQyAoMHhiMmYyYjJmOTQwNzk0YmIyKSwgVTY0X0MgKDB4ZTZiZmU2NjM1OWQxODVlNiksCisgICAgVTY0X0MgKDB4MGUzODBlNzAzNjFjN2UwZSksIFU2NF9DICgweDFmN2MxZmY4NjMzZWU3MWYpLAorICAgIFU2NF9DICgweDYyOTU2MjM3ZjdjNDU1NjIpLCBVNjRfQyAoMHhkNDc3ZDRlZWEzYjUzYWQ0KSwKKyAgICBVNjRfQyAoMHhhODlhYTgyOTMyNGQ4MWE4KSwgVTY0X0MgKDB4OTY2Mjk2YzRmNDMxNTI5NiksCisgICAgVTY0X0MgKDB4ZjljM2Y5OWIzYWVmNjJmOSksIFU2NF9DICgweGM1MzNjNTY2ZjY5N2EzYzUpLAorICAgIFU2NF9DICgweDI1OTQyNTM1YjE0YTEwMjUpLCBVNjRfQyAoMHg1OTc5NTlmMjIwYjJhYjU5KSwKKyAgICBVNjRfQyAoMHg4NDJhODQ1NGFlMTVkMDg0KSwgVTY0X0MgKDB4NzJkNTcyYjdhN2U0YzU3MiksCisgICAgVTY0X0MgKDB4MzllNDM5ZDVkZDcyZWMzOSksIFU2NF9DICgweDRjMmQ0YzVhNjE5ODE2NGMpLAorICAgIFU2NF9DICgweDVlNjU1ZWNhM2JiYzk0NWUpLCBVNjRfQyAoMHg3OGZkNzhlNzg1ZjA5Zjc4KSwKKyAgICBVNjRfQyAoMHgzOGUwMzhkZGQ4NzBlNTM4KSwgVTY0X0MgKDB4OGMwYThjMTQ4NjA1OTg4YyksCisgICAgVTY0X0MgKDB4ZDE2M2QxYzZiMmJmMTdkMSksIFU2NF9DICgweGE1YWVhNTQxMGI1N2U0YTUpLAorICAgIFU2NF9DICgweGUyYWZlMjQzNGRkOWExZTIpLCBVNjRfQyAoMHg2MTk5NjEyZmY4YzI0ZTYxKSwKKyAgICBVNjRfQyAoMHhiM2Y2YjNmMTQ1N2I0MmIzKSwgVTY0X0MgKDB4MjE4NDIxMTVhNTQyMzQyMSksCisgICAgVTY0X0MgKDB4OWM0YTljOTRkNjI1MDg5YyksIFU2NF9DICgweDFlNzgxZWYwNjYzY2VlMWUpLAorICAgIFU2NF9DICgweDQzMTE0MzIyNTI4NjYxNDMpLCBVNjRfQyAoMHhjNzNiYzc3NmZjOTNiMWM3KSwKKyAgICBVNjRfQyAoMHhmY2Q3ZmNiMzJiZTU0ZmZjKSwgVTY0X0MgKDB4MDQxMDA0MjAxNDA4MjQwNCksCisgICAgVTY0X0MgKDB4NTE1OTUxYjIwOGEyZTM1MSksIFU2NF9DICgweDk5NWU5OWJjYzcyZjI1OTkpLAorICAgIFU2NF9DICgweDZkYTk2ZDRmYzRkYTIyNmQpLCBVNjRfQyAoMHgwZDM0MGQ2ODM5MWE2NTBkKSwKKyAgICBVNjRfQyAoMHhmYWNmZmE4MzM1ZTk3OWZhKSwgVTY0X0MgKDB4ZGY1YmRmYjY4NGEzNjlkZiksCisgICAgVTY0X0MgKDB4N2VlNTdlZDc5YmZjYTk3ZSksIFU2NF9DICgweDI0OTAyNDNkYjQ0ODE5MjQpLAorICAgIFU2NF9DICgweDNiZWMzYmM1ZDc3NmZlM2IpLCBVNjRfQyAoMHhhYjk2YWIzMTNkNGI5YWFiKSwKKyAgICBVNjRfQyAoMHhjZTFmY2UzZWQxODFmMGNlKSwgVTY0X0MgKDB4MTE0NDExODg1NTIyOTkxMSksCisgICAgVTY0X0MgKDB4OGYwNjhmMGM4OTAzODM4ZiksIFU2NF9DICgweDRlMjU0ZTRhNmI5YzA0NGUpLAorICAgIFU2NF9DICgweGI3ZTZiN2QxNTE3MzY2YjcpLCBVNjRfQyAoMHhlYjhiZWIwYjYwY2JlMGViKSwKKyAgICBVNjRfQyAoMHgzY2YwM2NmZGNjNzhjMTNjKSwgVTY0X0MgKDB4ODEzZTgxN2NiZjFmZmQ4MSksCisgICAgVTY0X0MgKDB4OTQ2YTk0ZDRmZTM1NDA5NCksIFU2NF9DICgweGY3ZmJmN2ViMGNmMzFjZjcpLAorICAgIFU2NF9DICgweGI5ZGViOWExNjc2ZjE4YjkpLCBVNjRfQyAoMHgxMzRjMTM5ODVmMjY4YjEzKSwKKyAgICBVNjRfQyAoMHgyY2IwMmM3ZDljNTg1MTJjKSwgVTY0X0MgKDB4ZDM2YmQzZDZiOGJiMDVkMyksCisgICAgVTY0X0MgKDB4ZTdiYmU3NmI1Y2QzOGNlNyksIFU2NF9DICgweDZlYTU2ZTU3Y2JkYzM5NmUpLAorICAgIFU2NF9DICgweGM0MzdjNDZlZjM5NWFhYzQpLCBVNjRfQyAoMHgwMzBjMDMxODBmMDYxYjAzKSwKKyAgICBVNjRfQyAoMHg1NjQ1NTY4YTEzYWNkYzU2KSwgVTY0X0MgKDB4NDQwZDQ0MWE0OTg4NWU0NCksCisgICAgVTY0X0MgKDB4N2ZlMTdmZGY5ZWZlYTA3ZiksIFU2NF9DICgweGE5OWVhOTIxMzc0Zjg4YTkpLAorICAgIFU2NF9DICgweDJhYTgyYTRkODI1NDY3MmEpLCBVNjRfQyAoMHhiYmQ2YmJiMTZkNmIwYWJiKSwKKyAgICBVNjRfQyAoMHhjMTIzYzE0NmUyOWY4N2MxKSwgVTY0X0MgKDB4NTM1MTUzYTIwMmE2ZjE1MyksCisgICAgVTY0X0MgKDB4ZGM1N2RjYWU4YmE1NzJkYyksIFU2NF9DICgweDBiMmMwYjU4MjcxNjUzMGIpLAorICAgIFU2NF9DICgweDlkNGU5ZDljZDMyNzAxOWQpLCBVNjRfQyAoMHg2Y2FkNmM0N2MxZDgyYjZjKSwKKyAgICBVNjRfQyAoMHgzMWM0MzE5NWY1NjJhNDMxKSwgVTY0X0MgKDB4NzRjZDc0ODdiOWU4ZjM3NCksCisgICAgVTY0X0MgKDB4ZjZmZmY2ZTMwOWYxMTVmNiksIFU2NF9DICgweDQ2MDU0NjBhNDM4YzRjNDYpLAorICAgIFU2NF9DICgweGFjOGFhYzA5MjY0NWE1YWMpLCBVNjRfQyAoMHg4OTFlODkzYzk3MGZiNTg5KSwKKyAgICBVNjRfQyAoMHgxNDUwMTRhMDQ0MjhiNDE0KSwgVTY0X0MgKDB4ZTFhM2UxNWI0MmRmYmFlMSksCisgICAgVTY0X0MgKDB4MTY1ODE2YjA0ZTJjYTYxNiksIFU2NF9DICgweDNhZTgzYWNkZDI3NGY3M2EpLAorICAgIFU2NF9DICgweDY5Yjk2OTZmZDBkMjA2NjkpLCBVNjRfQyAoMHgwOTI0MDk0ODJkMTI0MTA5KSwKKyAgICBVNjRfQyAoMHg3MGRkNzBhN2FkZTBkNzcwKSwgVTY0X0MgKDB4YjZlMmI2ZDk1NDcxNmZiNiksCisgICAgVTY0X0MgKDB4ZDA2N2QwY2ViN2JkMWVkMCksIFU2NF9DICgweGVkOTNlZDNiN2VjN2Q2ZWQpLAorICAgIFU2NF9DICgweGNjMTdjYzJlZGI4NWUyY2MpLCBVNjRfQyAoMHg0MjE1NDIyYTU3ODQ2ODQyKSwKKyAgICBVNjRfQyAoMHg5ODVhOThiNGMyMmQyYzk4KSwgVTY0X0MgKDB4YTRhYWE0NDkwZTU1ZWRhNCksCisgICAgVTY0X0MgKDB4MjhhMDI4NWQ4ODUwNzUyOCksIFU2NF9DICgweDVjNmQ1Y2RhMzFiODg2NWMpLAorICAgIFU2NF9DICgweGY4YzdmODkzM2ZlZDZiZjgpLCBVNjRfQyAoMHg4NjIyODY0NGE0MTFjMjg2KSwKKyAgfTsKKworDAorCitzdGF0aWMgdm9pZAord2hpcmxwb29sX2luaXQgKHZvaWQgKmN0eCkKK3sKKyAgd2hpcmxwb29sX2NvbnRleHRfdCAqY29udGV4dCA9IGN0eDsKKworICBtZW1zZXQgKGNvbnRleHQsIDAsIHNpemVvZiAoKmNvbnRleHQpKTsKK30KKworCisvKgorICogVHJhbnNmb3JtIGJsb2NrLgorICovCitzdGF0aWMgdm9pZAord2hpcmxwb29sX3RyYW5zZm9ybSAod2hpcmxwb29sX2NvbnRleHRfdCAqY29udGV4dCwgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSkKK3sKKyAgd2hpcmxwb29sX2Jsb2NrX3QgZGF0YV9ibG9jazsKKyAgd2hpcmxwb29sX2Jsb2NrX3Qga2V5OworICB3aGlybHBvb2xfYmxvY2tfdCBzdGF0ZTsKKyAgd2hpcmxwb29sX2Jsb2NrX3QgYmxvY2s7CisgIHVuc2lnbmVkIGludCByOworICB1bnNpZ25lZCBpbnQgaTsKKworICBidWZmZXJfdG9fYmxvY2sgKGRhdGEsIGRhdGFfYmxvY2ssIGkpOworICBibG9ja19jb3B5IChrZXksIGNvbnRleHQtPmhhc2hfc3RhdGUsIGkpOworICBibG9ja19jb3B5IChzdGF0ZSwgY29udGV4dC0+aGFzaF9zdGF0ZSwgaSk7CisgIGJsb2NrX3hvciAoc3RhdGUsIGRhdGFfYmxvY2ssIGkpOworCisgIGZvciAociA9IDA7IHIgPCBSOyByKyspCisgICAgeworICAgICAgLyogQ29tcHV0ZSByb3VuZCBrZXkgS15yLiAgKi8KKworICAgICAgYmxvY2tbMF0gPSAoQzBbKGtleVswXSA+PiA1NikgJiAweEZGXSBeIEMxWyhrZXlbN10gPj4gNDgpICYgMHhGRl0gXgorCQkgIEMyWyhrZXlbNl0gPj4gNDApICYgMHhGRl0gXiBDM1soa2V5WzVdID4+IDMyKSAmIDB4RkZdIF4KKwkJICBDNFsoa2V5WzRdID4+IDI0KSAmIDB4RkZdIF4gQzVbKGtleVszXSA+PiAxNikgJiAweEZGXSBeCisJCSAgQzZbKGtleVsyXSA+PiAgOCkgJiAweEZGXSBeIEM3WyhrZXlbMV0gPj4gIDApICYgMHhGRl0gXiByY1tyXSk7CisgICAgICBibG9ja1sxXSA9IChDMFsoa2V5WzFdID4+IDU2KSAmIDB4RkZdIF4gQzFbKGtleVswXSA+PiA0OCkgJiAweEZGXSBeCisJCSAgQzJbKGtleVs3XSA+PiA0MCkgJiAweEZGXSBeIEMzWyhrZXlbNl0gPj4gMzIpICYgMHhGRl0gXgorCQkgIEM0WyhrZXlbNV0gPj4gMjQpICYgMHhGRl0gXiBDNVsoa2V5WzRdID4+IDE2KSAmIDB4RkZdIF4KKwkJICBDNlsoa2V5WzNdID4+ICA4KSAmIDB4RkZdIF4gQzdbKGtleVsyXSA+PiAgMCkgJiAweEZGXSk7CisgICAgICBibG9ja1syXSA9IChDMFsoa2V5WzJdID4+IDU2KSAmIDB4RkZdIF4gQzFbKGtleVsxXSA+PiA0OCkgJiAweEZGXSBeCisJCSAgQzJbKGtleVswXSA+PiA0MCkgJiAweEZGXSBeIEMzWyhrZXlbN10gPj4gMzIpICYgMHhGRl0gXgorCQkgIEM0WyhrZXlbNl0gPj4gMjQpICYgMHhGRl0gXiBDNVsoa2V5WzVdID4+IDE2KSAmIDB4RkZdIF4KKwkJICBDNlsoa2V5WzRdID4+ICA4KSAmIDB4RkZdIF4gQzdbKGtleVszXSA+PiAgMCkgJiAweEZGXSk7CisgICAgICBibG9ja1szXSA9IChDMFsoa2V5WzNdID4+IDU2KSAmIDB4RkZdIF4gQzFbKGtleVsyXSA+PiA0OCkgJiAweEZGXSBeCisJCSAgQzJbKGtleVsxXSA+PiA0MCkgJiAweEZGXSBeIEMzWyhrZXlbMF0gPj4gMzIpICYgMHhGRl0gXgorCQkgIEM0WyhrZXlbN10gPj4gMjQpICYgMHhGRl0gXiBDNVsoa2V5WzZdID4+IDE2KSAmIDB4RkZdIF4KKwkJICBDNlsoa2V5WzVdID4+ICA4KSAmIDB4RkZdIF4gQzdbKGtleVs0XSA+PiAgMCkgJiAweEZGXSk7CisgICAgICBibG9ja1s0XSA9IChDMFsoa2V5WzRdID4+IDU2KSAmIDB4RkZdIF4gQzFbKGtleVszXSA+PiA0OCkgJiAweEZGXSBeCisJCSAgQzJbKGtleVsyXSA+PiA0MCkgJiAweEZGXSBeIEMzWyhrZXlbMV0gPj4gMzIpICYgMHhGRl0gXgorCQkgIEM0WyhrZXlbMF0gPj4gMjQpICYgMHhGRl0gXiBDNVsoa2V5WzddID4+IDE2KSAmIDB4RkZdIF4KKwkJICBDNlsoa2V5WzZdID4+ICA4KSAmIDB4RkZdIF4gQzdbKGtleVs1XSA+PiAgMCkgJiAweEZGXSk7CisgICAgICBibG9ja1s1XSA9IChDMFsoa2V5WzVdID4+IDU2KSAmIDB4RkZdIF4gQzFbKGtleVs0XSA+PiA0OCkgJiAweEZGXSBeCisJCSAgQzJbKGtleVszXSA+PiA0MCkgJiAweEZGXSBeIEMzWyhrZXlbMl0gPj4gMzIpICYgMHhGRl0gXgorCQkgIEM0WyhrZXlbMV0gPj4gMjQpICYgMHhGRl0gXiBDNVsoa2V5WzBdID4+IDE2KSAmIDB4RkZdIF4KKwkJICBDNlsoa2V5WzddID4+ICA4KSAmIDB4RkZdIF4gQzdbKGtleVs2XSA+PiAgMCkgJiAweEZGXSk7CisgICAgICBibG9ja1s2XSA9IChDMFsoa2V5WzZdID4+IDU2KSAmIDB4RkZdIF4gQzFbKGtleVs1XSA+PiA0OCkgJiAweEZGXSBeCisJCSAgQzJbKGtleVs0XSA+PiA0MCkgJiAweEZGXSBeIEMzWyhrZXlbM10gPj4gMzIpICYgMHhGRl0gXgorCQkgIEM0WyhrZXlbMl0gPj4gMjQpICYgMHhGRl0gXiBDNVsoa2V5WzFdID4+IDE2KSAmIDB4RkZdIF4KKwkJICBDNlsoa2V5WzBdID4+ICA4KSAmIDB4RkZdIF4gQzdbKGtleVs3XSA+PiAgMCkgJiAweEZGXSk7CisgICAgICBibG9ja1s3XSA9IChDMFsoa2V5WzddID4+IDU2KSAmIDB4RkZdIF4gQzFbKGtleVs2XSA+PiA0OCkgJiAweEZGXSBeCisJCSAgQzJbKGtleVs1XSA+PiA0MCkgJiAweEZGXSBeIEMzWyhrZXlbNF0gPj4gMzIpICYgMHhGRl0gXgorCQkgIEM0WyhrZXlbM10gPj4gMjQpICYgMHhGRl0gXiBDNVsoa2V5WzJdID4+IDE2KSAmIDB4RkZdIF4KKwkJICBDNlsoa2V5WzFdID4+ICA4KSAmIDB4RkZdIF4gQzdbKGtleVswXSA+PiAgMCkgJiAweEZGXSk7CisgICAgICBibG9ja19jb3B5IChrZXksIGJsb2NrLCBpKTsKKworICAgICAgLyogQXBwbHkgci10aCByb3VuZCB0cmFuc2Zvcm1hdGlvbi4gICovCisKKyAgICAgIGJsb2NrWzBdID0gKEMwWyhzdGF0ZVswXSA+PiA1NikgJiAweEZGXSBeIEMxWyhzdGF0ZVs3XSA+PiA0OCkgJiAweEZGXSBeCisJCSAgQzJbKHN0YXRlWzZdID4+IDQwKSAmIDB4RkZdIF4gQzNbKHN0YXRlWzVdID4+IDMyKSAmIDB4RkZdIF4KKwkJICBDNFsoc3RhdGVbNF0gPj4gMjQpICYgMHhGRl0gXiBDNVsoc3RhdGVbM10gPj4gMTYpICYgMHhGRl0gXgorCQkgIEM2WyhzdGF0ZVsyXSA+PiAgOCkgJiAweEZGXSBeIEM3WyhzdGF0ZVsxXSA+PiAgMCkgJiAweEZGXSBeIGtleVswXSk7CisgICAgICBibG9ja1sxXSA9IChDMFsoc3RhdGVbMV0gPj4gNTYpICYgMHhGRl0gXiBDMVsoc3RhdGVbMF0gPj4gNDgpICYgMHhGRl0gXgorCQkgIEMyWyhzdGF0ZVs3XSA+PiA0MCkgJiAweEZGXSBeIEMzWyhzdGF0ZVs2XSA+PiAzMikgJiAweEZGXSBeCisJCSAgQzRbKHN0YXRlWzVdID4+IDI0KSAmIDB4RkZdIF4gQzVbKHN0YXRlWzRdID4+IDE2KSAmIDB4RkZdIF4KKwkJICBDNlsoc3RhdGVbM10gPj4gIDgpICYgMHhGRl0gXiBDN1soc3RhdGVbMl0gPj4gIDApICYgMHhGRl0gXiBrZXlbMV0pOworICAgICAgYmxvY2tbMl0gPSAoQzBbKHN0YXRlWzJdID4+IDU2KSAmIDB4RkZdIF4gQzFbKHN0YXRlWzFdID4+IDQ4KSAmIDB4RkZdIF4KKwkJICBDMlsoc3RhdGVbMF0gPj4gNDApICYgMHhGRl0gXiBDM1soc3RhdGVbN10gPj4gMzIpICYgMHhGRl0gXgorCQkgIEM0WyhzdGF0ZVs2XSA+PiAyNCkgJiAweEZGXSBeIEM1WyhzdGF0ZVs1XSA+PiAxNikgJiAweEZGXSBeCisJCSAgQzZbKHN0YXRlWzRdID4+ICA4KSAmIDB4RkZdIF4gQzdbKHN0YXRlWzNdID4+ICAwKSAmIDB4RkZdIF4ga2V5WzJdKTsKKyAgICAgIGJsb2NrWzNdID0gKEMwWyhzdGF0ZVszXSA+PiA1NikgJiAweEZGXSBeIEMxWyhzdGF0ZVsyXSA+PiA0OCkgJiAweEZGXSBeCisJCSAgQzJbKHN0YXRlWzFdID4+IDQwKSAmIDB4RkZdIF4gQzNbKHN0YXRlWzBdID4+IDMyKSAmIDB4RkZdIF4KKwkJICBDNFsoc3RhdGVbN10gPj4gMjQpICYgMHhGRl0gXiBDNVsoc3RhdGVbNl0gPj4gMTYpICYgMHhGRl0gXgorCQkgIEM2WyhzdGF0ZVs1XSA+PiAgOCkgJiAweEZGXSBeIEM3WyhzdGF0ZVs0XSA+PiAgMCkgJiAweEZGXSBeIGtleVszXSk7CisgICAgICBibG9ja1s0XSA9IChDMFsoc3RhdGVbNF0gPj4gNTYpICYgMHhGRl0gXiBDMVsoc3RhdGVbM10gPj4gNDgpICYgMHhGRl0gXgorCQkgIEMyWyhzdGF0ZVsyXSA+PiA0MCkgJiAweEZGXSBeIEMzWyhzdGF0ZVsxXSA+PiAzMikgJiAweEZGXSBeCisJCSAgQzRbKHN0YXRlWzBdID4+IDI0KSAmIDB4RkZdIF4gQzVbKHN0YXRlWzddID4+IDE2KSAmIDB4RkZdIF4KKwkJICBDNlsoc3RhdGVbNl0gPj4gIDgpICYgMHhGRl0gXiBDN1soc3RhdGVbNV0gPj4gIDApICYgMHhGRl0gXiBrZXlbNF0pOworICAgICAgYmxvY2tbNV0gPSAoQzBbKHN0YXRlWzVdID4+IDU2KSAmIDB4RkZdIF4gQzFbKHN0YXRlWzRdID4+IDQ4KSAmIDB4RkZdIF4KKwkJICBDMlsoc3RhdGVbM10gPj4gNDApICYgMHhGRl0gXiBDM1soc3RhdGVbMl0gPj4gMzIpICYgMHhGRl0gXgorCQkgIEM0WyhzdGF0ZVsxXSA+PiAyNCkgJiAweEZGXSBeIEM1WyhzdGF0ZVswXSA+PiAxNikgJiAweEZGXSBeCisJCSAgQzZbKHN0YXRlWzddID4+ICA4KSAmIDB4RkZdIF4gQzdbKHN0YXRlWzZdID4+ICAwKSAmIDB4RkZdIF4ga2V5WzVdKTsKKyAgICAgIGJsb2NrWzZdID0gKEMwWyhzdGF0ZVs2XSA+PiA1NikgJiAweEZGXSBeIEMxWyhzdGF0ZVs1XSA+PiA0OCkgJiAweEZGXSBeCisJCSAgQzJbKHN0YXRlWzRdID4+IDQwKSAmIDB4RkZdIF4gQzNbKHN0YXRlWzNdID4+IDMyKSAmIDB4RkZdIF4KKwkJICBDNFsoc3RhdGVbMl0gPj4gMjQpICYgMHhGRl0gXiBDNVsoc3RhdGVbMV0gPj4gMTYpICYgMHhGRl0gXgorCQkgIEM2WyhzdGF0ZVswXSA+PiAgOCkgJiAweEZGXSBeIEM3WyhzdGF0ZVs3XSA+PiAgMCkgJiAweEZGXSBeIGtleVs2XSk7CisgICAgICBibG9ja1s3XSA9IChDMFsoc3RhdGVbN10gPj4gNTYpICYgMHhGRl0gXiBDMVsoc3RhdGVbNl0gPj4gNDgpICYgMHhGRl0gXgorCQkgIEMyWyhzdGF0ZVs1XSA+PiA0MCkgJiAweEZGXSBeIEMzWyhzdGF0ZVs0XSA+PiAzMikgJiAweEZGXSBeCisJCSAgQzRbKHN0YXRlWzNdID4+IDI0KSAmIDB4RkZdIF4gQzVbKHN0YXRlWzJdID4+IDE2KSAmIDB4RkZdIF4KKwkJICBDNlsoc3RhdGVbMV0gPj4gIDgpICYgMHhGRl0gXiBDN1soc3RhdGVbMF0gPj4gIDApICYgMHhGRl0gXiBrZXlbN10pOworICAgICAgYmxvY2tfY29weSAoc3RhdGUsIGJsb2NrLCBpKTsKKyAgICB9CisKKyAgLyogQ29tcHJlc3Npb24uICAqLworCisgIGJsb2NrX3hvciAoY29udGV4dC0+aGFzaF9zdGF0ZSwgZGF0YV9ibG9jaywgaSk7CisgIGJsb2NrX3hvciAoY29udGV4dC0+aGFzaF9zdGF0ZSwgc3RhdGUsIGkpOworfQorCitzdGF0aWMgdm9pZAord2hpcmxwb29sX2FkZCAod2hpcmxwb29sX2NvbnRleHRfdCAqY29udGV4dCwKKwkgICAgICAgY29uc3Qgdm9pZCAqYnVmZmVyX2FyZywgc2l6ZV90IGJ1ZmZlcl9uKQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWZmZXIgPSBidWZmZXJfYXJnOworICB1NjQgYnVmZmVyX3NpemU7CisgIHVuc2lnbmVkIGludCBjYXJyeTsKKyAgdW5zaWduZWQgaW50IGk7CisKKyAgYnVmZmVyX3NpemUgPSBidWZmZXJfbjsKKworICBpZiAoY29udGV4dC0+Y291bnQgPT0gQkxPQ0tfU0laRSkKKyAgICB7CisgICAgICAvKiBGbHVzaCB0aGUgYnVmZmVyLiAgKi8KKyAgICAgIHdoaXJscG9vbF90cmFuc2Zvcm0gKGNvbnRleHQsIGNvbnRleHQtPmJ1ZmZlcik7CisgICAgICAvKl9nY3J5X2J1cm5fc3RhY2sgKDgwKzYqc2l6ZW9mKHZvaWQqKSk7Ki8gLyogRklYTUUgKi8KKyAgICAgIGNvbnRleHQtPmNvdW50ID0gMDsKKyAgICB9CisgIGlmICghIGJ1ZmZlcikKKyAgICByZXR1cm47IC8qIE5vdGhpbmcgdG8gYWRkLiAgKi8KKworICBpZiAoY29udGV4dC0+Y291bnQpCisgICAgeworICAgICAgd2hpbGUgKGJ1ZmZlcl9uICYmIChjb250ZXh0LT5jb3VudCA8IEJMT0NLX1NJWkUpKQorCXsKKwkgIGNvbnRleHQtPmJ1ZmZlcltjb250ZXh0LT5jb3VudCsrXSA9ICpidWZmZXIrKzsKKwkgIGJ1ZmZlcl9uLS07CisJfQorICAgICAgd2hpcmxwb29sX2FkZCAoY29udGV4dCwgTlVMTCwgMCk7CisgICAgICBpZiAoIWJ1ZmZlcl9uKQorCS8qIERvbmUuICAqLworICAgICAgICByZXR1cm47CisgICAgfQorICAvKl9nY3J5X2J1cm5fc3RhY2sgKDgwKzYqc2l6ZW9mKHZvaWQqKSk7Ki8gLyogRklYTUUgKi8KKworICB3aGlsZSAoYnVmZmVyX24gPj0gQkxPQ0tfU0laRSkgCisgICAgeworICAgICAgd2hpcmxwb29sX3RyYW5zZm9ybSAoY29udGV4dCwgYnVmZmVyKTsKKyAgICAgIGNvbnRleHQtPmNvdW50ID0gMDsKKyAgICAgIGJ1ZmZlcl9uIC09IEJMT0NLX1NJWkU7CisgICAgICBidWZmZXIgKz0gQkxPQ0tfU0laRTsKKyAgICB9CisgIHdoaWxlIChidWZmZXJfbiAmJiAoY29udGV4dC0+Y291bnQgPCBCTE9DS19TSVpFKSkKKyAgICB7CisgICAgICBjb250ZXh0LT5idWZmZXJbY29udGV4dC0+Y291bnQrK10gPSAqYnVmZmVyKys7CisgICAgICBidWZmZXJfbi0tOworICAgIH0KKworICAvKiBVcGRhdGUgYml0IGNvdW50ZXIuICAqLworICBjYXJyeSA9IDA7CisgIGJ1ZmZlcl9zaXplIDw8PSAzOworICBmb3IgKGkgPSAxOyBpIDw9IDMyOyBpKyspCisgICAgeworICAgICAgaWYgKCEgKGJ1ZmZlcl9zaXplIHx8IGNhcnJ5KSkKKwlicmVhazsKKworICAgICAgY2FycnkgKz0gY29udGV4dC0+bGVuZ3RoWzMyIC0gaV0gKyAoYnVmZmVyX3NpemUgJiAweEZGKTsKKyAgICAgIGNvbnRleHQtPmxlbmd0aFszMiAtIGldID0gY2Fycnk7CisgICAgICBidWZmZXJfc2l6ZSA+Pj0gODsKKyAgICAgIGNhcnJ5ID4+PSA4OworICAgIH0KKyAgZ2NyeV9hc3NlcnQgKCEgKGJ1ZmZlcl9zaXplIHx8IGNhcnJ5KSk7Cit9CisKK3N0YXRpYyB2b2lkCit3aGlybHBvb2xfd3JpdGUgKHZvaWQgKmN0eCwgY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnVmZmVyX24pCit7CisgIHdoaXJscG9vbF9jb250ZXh0X3QgKmNvbnRleHQgPSBjdHg7CisKKyAgd2hpcmxwb29sX2FkZCAoY29udGV4dCwgYnVmZmVyLCBidWZmZXJfbik7Cit9CisKK3N0YXRpYyB2b2lkCit3aGlybHBvb2xfZmluYWwgKHZvaWQgKmN0eCkKK3sKKyAgd2hpcmxwb29sX2NvbnRleHRfdCAqY29udGV4dCA9IGN0eDsKKyAgdW5zaWduZWQgaW50IGk7CisKKyAgLyogRmx1c2guICAqLworICB3aGlybHBvb2xfYWRkIChjb250ZXh0LCBOVUxMLCAwKTsKKworICAvKiBQYWQuICAqLworICBjb250ZXh0LT5idWZmZXJbY29udGV4dC0+Y291bnQrK10gPSAweDgwOworCisgIGlmIChjb250ZXh0LT5jb3VudCA+IDMyKQorICAgIHsKKyAgICAgIC8qIEFuIGV4dHJhIGJsb2NrIGlzIG5lY2Vzc2FyeS4gICovCisgICAgICB3aGlsZSAoY29udGV4dC0+Y291bnQgPCA2NCkKKwljb250ZXh0LT5idWZmZXJbY29udGV4dC0+Y291bnQrK10gPSAwOworICAgICAgd2hpcmxwb29sX2FkZCAoY29udGV4dCwgTlVMTCwgMCk7CisgICAgfQorICB3aGlsZSAoY29udGV4dC0+Y291bnQgPCAzMikKKyAgICBjb250ZXh0LT5idWZmZXJbY29udGV4dC0+Y291bnQrK10gPSAwOworCisgIC8qIEFkZCBsZW5ndGggb2YgbWVzc2FnZS4gICovCisgIG1lbWNweSAoY29udGV4dC0+YnVmZmVyICsgY29udGV4dC0+Y291bnQsIGNvbnRleHQtPmxlbmd0aCwgMzIpOworICBjb250ZXh0LT5jb3VudCArPSAzMjsKKyAgd2hpcmxwb29sX2FkZCAoY29udGV4dCwgTlVMTCwgMCk7CisKKyAgYmxvY2tfdG9fYnVmZmVyIChjb250ZXh0LT5idWZmZXIsIGNvbnRleHQtPmhhc2hfc3RhdGUsIGkpOworfQorCitzdGF0aWMgYnl0ZSAqCit3aGlybHBvb2xfcmVhZCAodm9pZCAqY3R4KQoreworICB3aGlybHBvb2xfY29udGV4dF90ICpjb250ZXh0ID0gY3R4OworCisgIHJldHVybiBjb250ZXh0LT5idWZmZXI7Cit9CisKK2djcnlfbWRfc3BlY190IF9nY3J5X2RpZ2VzdF9zcGVjX3doaXJscG9vbCA9CisgIHsKKyAgICAiV0hJUkxQT09MIiwgTlVMTCwgMCwgTlVMTCwgNjQsCisgICAgd2hpcmxwb29sX2luaXQsIHdoaXJscG9vbF93cml0ZSwgd2hpcmxwb29sX2ZpbmFsLCB3aGlybHBvb2xfcmVhZCwKKyAgICBzaXplb2YgKHdoaXJscG9vbF9jb250ZXh0X3QpCisgIH07CmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvY29tcGlsZSBiL2xpYmdjcnlwdC0xLjQuNi9jb21waWxlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFiMWQyMzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvY29tcGlsZQpAQCAtMCwwICsxLDE0MiBAQAorIyEgL2Jpbi9zaAorIyBXcmFwcGVyIGZvciBjb21waWxlcnMgd2hpY2ggZG8gbm90IHVuZGVyc3RhbmQgYC1jIC1vJy4KKworc2NyaXB0dmVyc2lvbj0yMDA1LTA1LTE0LjIyCisKKyMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAzLCAyMDA0LCAyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBXcml0dGVuIGJ5IFRvbSBUcm9tZXkgPHRyb21leUBjeWdudXMuY29tPi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIyBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisjIFRoaXMgZmlsZSBpcyBtYWludGFpbmVkIGluIEF1dG9tYWtlLCBwbGVhc2UgcmVwb3J0CisjIGJ1Z3MgdG8gPGJ1Zy1hdXRvbWFrZUBnbnUub3JnPiBvciBzZW5kIHBhdGNoZXMgdG8KKyMgPGF1dG9tYWtlLXBhdGNoZXNAZ251Lm9yZz4uCisKK2Nhc2UgJDEgaW4KKyAgJycpCisgICAgIGVjaG8gIiQwOiBObyBjb21tYW5kLiAgVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDE+JjIKKyAgICAgZXhpdCAxOworICAgICA7OworICAtaCB8IC0taCopCisgICAgY2F0IDw8XEVPRgorVXNhZ2U6IGNvbXBpbGUgWy0taGVscF0gWy0tdmVyc2lvbl0gUFJPR1JBTSBbQVJHU10KKworV3JhcHBlciBmb3IgY29tcGlsZXJzIHdoaWNoIGRvIG5vdCB1bmRlcnN0YW5kIGAtYyAtbycuCitSZW1vdmUgYC1vIGRlc3QubycgZnJvbSBBUkdTLCBydW4gUFJPR1JBTSB3aXRoIHRoZSByZW1haW5pbmcKK2FyZ3VtZW50cywgYW5kIHJlbmFtZSB0aGUgb3V0cHV0IGFzIGV4cGVjdGVkLgorCitJZiB5b3UgYXJlIHRyeWluZyB0byBidWlsZCBhIHdob2xlIHBhY2thZ2UgdGhpcyBpcyBub3QgdGhlCityaWdodCBzY3JpcHQgdG8gcnVuOiBwbGVhc2Ugc3RhcnQgYnkgcmVhZGluZyB0aGUgZmlsZSBgSU5TVEFMTCcuCisKK1JlcG9ydCBidWdzIHRvIDxidWctYXV0b21ha2VAZ251Lm9yZz4uCitFT0YKKyAgICBleGl0ICQ/CisgICAgOzsKKyAgLXYgfCAtLXYqKQorICAgIGVjaG8gImNvbXBpbGUgJHNjcmlwdHZlcnNpb24iCisgICAgZXhpdCAkPworICAgIDs7Citlc2FjCisKK29maWxlPQorY2ZpbGU9CitlYXQ9CisKK2ZvciBhcmcKK2RvCisgIGlmIHRlc3QgLW4gIiRlYXQiOyB0aGVuCisgICAgZWF0PQorICBlbHNlCisgICAgY2FzZSAkMSBpbgorICAgICAgLW8pCisJIyBjb25maWd1cmUgbWlnaHQgY2hvb3NlIHRvIHJ1biBjb21waWxlIGFzIGBjb21waWxlIGNjIC1vIGZvbyBmb28uYycuCisJIyBTbyB3ZSBzdHJpcCBgLW8gYXJnJyBvbmx5IGlmIGFyZyBpcyBhbiBvYmplY3QuCisJZWF0PTEKKwljYXNlICQyIGluCisJICAqLm8gfCAqLm9iaikKKwkgICAgb2ZpbGU9JDIKKwkgICAgOzsKKwkgICopCisJICAgIHNldCB4ICIkQCIgLW8gIiQyIgorCSAgICBzaGlmdAorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgKi5jKQorCWNmaWxlPSQxCisJc2V0IHggIiRAIiAiJDEiCisJc2hpZnQKKwk7OworICAgICAgKikKKwlzZXQgeCAiJEAiICIkMSIKKwlzaGlmdAorCTs7CisgICAgZXNhYworICBmaQorICBzaGlmdAorZG9uZQorCitpZiB0ZXN0IC16ICIkb2ZpbGUiIHx8IHRlc3QgLXogIiRjZmlsZSI7IHRoZW4KKyAgIyBJZiBubyBgLW8nIG9wdGlvbiB3YXMgc2VlbiB0aGVuIHdlIG1pZ2h0IGhhdmUgYmVlbiBpbnZva2VkIGZyb20gYQorICAjIHBhdHRlcm4gcnVsZSB3aGVyZSB3ZSBkb24ndCBuZWVkIG9uZS4gIFRoYXQgaXMgb2sgLS0gdGhpcyBpcyBhCisgICMgbm9ybWFsIGNvbXBpbGF0aW9uIHRoYXQgdGhlIGxvc2luZyBjb21waWxlciBjYW4gaGFuZGxlLiAgSWYgbm8KKyAgIyBgLmMnIGZpbGUgd2FzIHNlZW4gdGhlbiB3ZSBhcmUgcHJvYmFibHkgbGlua2luZy4gIFRoYXQgaXMgYWxzbworICAjIG9rLgorICBleGVjICIkQCIKK2ZpCisKKyMgTmFtZSBvZiBmaWxlIHdlIGV4cGVjdCBjb21waWxlciB0byBjcmVhdGUuCitjb2ZpbGU9YGVjaG8gIiRjZmlsZSIgfCBzZWQgLWUgJ3N8Xi4qL3x8JyAtZSAncy9cLmMkLy5vLydgCisKKyMgQ3JlYXRlIHRoZSBsb2NrIGRpcmVjdG9yeS4KKyMgTm90ZTogdXNlIGBbLy4tXScgaGVyZSB0byBlbnN1cmUgdGhhdCB3ZSBkb24ndCB1c2UgdGhlIHNhbWUgbmFtZQorIyB0aGF0IHdlIGFyZSB1c2luZyBmb3IgdGhlIC5vIGZpbGUuICBBbHNvLCBiYXNlIHRoZSBuYW1lIG9uIHRoZSBleHBlY3RlZAorIyBvYmplY3QgZmlsZSBuYW1lLCBzaW5jZSB0aGF0IGlzIHdoYXQgbWF0dGVycyB3aXRoIGEgcGFyYWxsZWwgYnVpbGQuCitsb2NrZGlyPWBlY2hvICIkY29maWxlIiB8IHNlZCAtZSAnc3xbLy4tXXxffGcnYC5kCit3aGlsZSB0cnVlOyBkbworICBpZiBta2RpciAiJGxvY2tkaXIiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgIGJyZWFrCisgIGZpCisgIHNsZWVwIDEKK2RvbmUKKyMgRklYTUU6IHJhY2UgY29uZGl0aW9uIGhlcmUgaWYgdXNlciBraWxscyBiZXR3ZWVuIG1rZGlyIGFuZCB0cmFwLgordHJhcCAicm1kaXIgJyRsb2NrZGlyJzsgZXhpdCAxIiAxIDIgMTUKKworIyBSdW4gdGhlIGNvbXBpbGUuCisiJEAiCityZXQ9JD8KKworaWYgdGVzdCAtZiAiJGNvZmlsZSI7IHRoZW4KKyAgbXYgIiRjb2ZpbGUiICIkb2ZpbGUiCitlbGlmIHRlc3QgLWYgIiR7Y29maWxlfWJqIjsgdGhlbgorICBtdiAiJHtjb2ZpbGV9YmoiICIkb2ZpbGUiCitmaQorCitybWRpciAiJGxvY2tkaXIiCitleGl0ICRyZXQKKworIyBMb2NhbCBWYXJpYWJsZXM6CisjIG1vZGU6IHNoZWxsLXNjcmlwdAorIyBzaC1pbmRlbnRhdGlvbjogMgorIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCisjIHRpbWUtc3RhbXAtc3RhcnQ6ICJzY3JpcHR2ZXJzaW9uPSIKKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkLiUwMkgiCisjIHRpbWUtc3RhbXAtZW5kOiAiJCIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L2NvbmZpZy5ndWVzcyBiL2xpYmdjcnlwdC0xLjQuNi9jb25maWcuZ3Vlc3MKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2ZlZjFhMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9jb25maWcuZ3Vlc3MKQEAgLTAsMCArMSwxNTE2IEBACisjISAvYmluL3NoCisjIEF0dGVtcHQgdG8gZ3Vlc3MgYSBjYW5vbmljYWwgc3lzdGVtIG5hbWUuCisjICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LAorIyAgIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyAgIEluYy4KKwordGltZXN0YW1wPScyMDA3LTExLTE5JworCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisjIDAyMTEwLTEzMDEsIFVTQS4KKyMKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisKKyMgT3JpZ2luYWxseSB3cml0dGVuIGJ5IFBlciBCb3RobmVyIDxwZXJAYm90aG5lci5jb20+LgorIyBQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4gIFN1Ym1pdCBhIGNvbnRleHQKKyMgZGlmZiBhbmQgYSBwcm9wZXJseSBmb3JtYXR0ZWQgQ2hhbmdlTG9nIGVudHJ5LgorIworIyBUaGlzIHNjcmlwdCBhdHRlbXB0cyB0byBndWVzcyBhIGNhbm9uaWNhbCBzeXN0ZW0gbmFtZSBzaW1pbGFyIHRvCisjIGNvbmZpZy5zdWIuICBJZiBpdCBzdWNjZWVkcywgaXQgcHJpbnRzIHRoZSBzeXN0ZW0gbmFtZSBvbiBzdGRvdXQsIGFuZAorIyBleGl0cyB3aXRoIDAuICBPdGhlcndpc2UsIGl0IGV4aXRzIHdpdGggMS4KKyMKKyMgVGhlIHBsYW4gaXMgdGhhdCB0aGlzIGNhbiBiZSBjYWxsZWQgYnkgY29uZmlndXJlIHNjcmlwdHMgaWYgeW91CisjIGRvbid0IHNwZWNpZnkgYW4gZXhwbGljaXQgYnVpbGQgc3lzdGVtIHR5cGUuCisKK21lPWBlY2hvICIkMCIgfCBzZWQgLWUgJ3MsLiovLCwnYAorCit1c2FnZT0iXAorVXNhZ2U6ICQwIFtPUFRJT05dCisKK091dHB1dCB0aGUgY29uZmlndXJhdGlvbiBuYW1lIG9mIHRoZSBzeXN0ZW0gXGAkbWUnIGlzIHJ1biBvbi4KKworT3BlcmF0aW9uIG1vZGVzOgorICAtaCwgLS1oZWxwICAgICAgICAgcHJpbnQgdGhpcyBoZWxwLCB0aGVuIGV4aXQKKyAgLXQsIC0tdGltZS1zdGFtcCAgIHByaW50IGRhdGUgb2YgbGFzdCBtb2RpZmljYXRpb24sIHRoZW4gZXhpdAorICAtdiwgLS12ZXJzaW9uICAgICAgcHJpbnQgdmVyc2lvbiBudW1iZXIsIHRoZW4gZXhpdAorCitSZXBvcnQgYnVncyBhbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uIgorCit2ZXJzaW9uPSJcCitHTlUgY29uZmlnLmd1ZXNzICgkdGltZXN0YW1wKQorCitPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgUGVyIEJvdGhuZXIuCitDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOTword2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIgorCitoZWxwPSIKK1RyeSBcYCRtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKKworIyBQYXJzZSBjb21tYW5kIGxpbmUKK3doaWxlIHRlc3QgJCMgLWd0IDAgOyBkbworICBjYXNlICQxIGluCisgICAgLS10aW1lLXN0YW1wIHwgLS10aW1lKiB8IC10ICkKKyAgICAgICBlY2hvICIkdGltZXN0YW1wIiA7IGV4aXQgOzsKKyAgICAtLXZlcnNpb24gfCAtdiApCisgICAgICAgZWNobyAiJHZlcnNpb24iIDsgZXhpdCA7OworICAgIC0taGVscCB8IC0taCogfCAtaCApCisgICAgICAgZWNobyAiJHVzYWdlIjsgZXhpdCA7OworICAgIC0tICkgICAgICMgU3RvcCBvcHRpb24gcHJvY2Vzc2luZworICAgICAgIHNoaWZ0OyBicmVhayA7OworICAgIC0gKQkjIFVzZSBzdGRpbiBhcyBpbnB1dC4KKyAgICAgICBicmVhayA7OworICAgIC0qICkKKyAgICAgICBlY2hvICIkbWU6IGludmFsaWQgb3B0aW9uICQxJGhlbHAiID4mMgorICAgICAgIGV4aXQgMSA7OworICAgICogKQorICAgICAgIGJyZWFrIDs7CisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAkIyAhPSAwOyB0aGVuCisgIGVjaG8gIiRtZTogdG9vIG1hbnkgYXJndW1lbnRzJGhlbHAiID4mMgorICBleGl0IDEKK2ZpCisKK3RyYXAgJ2V4aXQgMScgMSAyIDE1CisKKyMgQ0NfRk9SX0JVSUxEIC0tIGNvbXBpbGVyIHVzZWQgYnkgdGhpcyBzY3JpcHQuIE5vdGUgdGhhdCB0aGUgdXNlIG9mIGEKKyMgY29tcGlsZXIgdG8gYWlkIGluIHN5c3RlbSBkZXRlY3Rpb24gaXMgZGlzY291cmFnZWQgYXMgaXQgcmVxdWlyZXMKKyMgdGVtcG9yYXJ5IGZpbGVzIHRvIGJlIGNyZWF0ZWQgYW5kLCBhcyB5b3UgY2FuIHNlZSBiZWxvdywgaXQgaXMgYQorIyBoZWFkYWNoZSB0byBkZWFsIHdpdGggaW4gYSBwb3J0YWJsZSBmYXNoaW9uLgorCisjIEhpc3RvcmljYWxseSwgYENDX0ZPUl9CVUlMRCcgdXNlZCB0byBiZSBuYW1lZCBgSE9TVF9DQycuIFdlIHN0aWxsCisjIHVzZSBgSE9TVF9DQycgaWYgZGVmaW5lZCwgYnV0IGl0IGlzIGRlcHJlY2F0ZWQuCisKKyMgUG9ydGFibGUgdG1wIGRpcmVjdG9yeSBjcmVhdGlvbiBpbnNwaXJlZCBieSB0aGUgQXV0b2NvbmYgdGVhbS4KKworc2V0X2NjX2Zvcl9idWlsZD0nCit0cmFwICJleGl0Y29kZT1cJD87IChybSAtZiBcJHRtcGZpbGVzIDI+L2Rldi9udWxsOyBybWRpciBcJHRtcCAyPi9kZXYvbnVsbCkgJiYgZXhpdCBcJGV4aXRjb2RlIiAwIDsKK3RyYXAgInJtIC1mIFwkdG1wZmlsZXMgMj4vZGV2L251bGw7IHJtZGlyIFwkdG1wIDI+L2Rldi9udWxsOyBleGl0IDEiIDEgMiAxMyAxNSA7Cis6ICR7VE1QRElSPS90bXB9IDsKKyB7IHRtcD1gKHVtYXNrIDA3NyAmJiBta3RlbXAgLWQgIiRUTVBESVIvY2dYWFhYWFgiKSAyPi9kZXYvbnVsbGAgJiYgdGVzdCAtbiAiJHRtcCIgJiYgdGVzdCAtZCAiJHRtcCIgOyB9IHx8CisgeyB0ZXN0IC1uICIkUkFORE9NIiAmJiB0bXA9JFRNUERJUi9jZyQkLSRSQU5ET00gJiYgKHVtYXNrIDA3NyAmJiBta2RpciAkdG1wKSA7IH0gfHwKKyB7IHRtcD0kVE1QRElSL2NnLSQkICYmICh1bWFzayAwNzcgJiYgbWtkaXIgJHRtcCkgJiYgZWNobyAiV2FybmluZzogY3JlYXRpbmcgaW5zZWN1cmUgdGVtcCBkaXJlY3RvcnkiID4mMiA7IH0gfHwKKyB7IGVjaG8gIiRtZTogY2Fubm90IGNyZWF0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgaW4gJFRNUERJUiIgPiYyIDsgZXhpdCAxIDsgfSA7CitkdW1teT0kdG1wL2R1bW15IDsKK3RtcGZpbGVzPSIkZHVtbXkuYyAkZHVtbXkubyAkZHVtbXkucmVsICRkdW1teSIgOworY2FzZSAkQ0NfRk9SX0JVSUxELCRIT1NUX0NDLCRDQyBpbgorICwsKSAgICBlY2hvICJpbnQgeDsiID4gJGR1bW15LmMgOworCWZvciBjIGluIGNjIGdjYyBjODkgYzk5IDsgZG8KKwkgIGlmICgkYyAtYyAtbyAkZHVtbXkubyAkZHVtbXkuYykgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgorCSAgICAgQ0NfRk9SX0JVSUxEPSIkYyI7IGJyZWFrIDsKKwkgIGZpIDsKKwlkb25lIDsKKwlpZiB0ZXN0IHgiJENDX0ZPUl9CVUlMRCIgPSB4IDsgdGhlbgorCSAgQ0NfRk9SX0JVSUxEPW5vX2NvbXBpbGVyX2ZvdW5kIDsKKwlmaQorCTs7CisgLCwqKSAgIENDX0ZPUl9CVUlMRD0kQ0MgOzsKKyAsKiwqKSAgQ0NfRk9SX0JVSUxEPSRIT1NUX0NDIDs7Citlc2FjIDsgc2V0X2NjX2Zvcl9idWlsZD0gOycKKworIyBUaGlzIGlzIG5lZWRlZCB0byBmaW5kIHVuYW1lIG9uIGEgUHlyYW1pZCBPU3ggd2hlbiBydW4gaW4gdGhlIEJTRCB1bml2ZXJzZS4KKyMgKGdoYXppQG5vYy5ydXRnZXJzLmVkdSAxOTk0LTA4LTI0KQoraWYgKHRlc3QgLWYgLy5hdHRiaW4vdW5hbWUpID4vZGV2L251bGwgMj4mMSA7IHRoZW4KKwlQQVRIPSRQQVRIOi8uYXR0YmluIDsgZXhwb3J0IFBBVEgKK2ZpCisKK1VOQU1FX01BQ0hJTkU9YCh1bmFtZSAtbSkgMj4vZGV2L251bGxgIHx8IFVOQU1FX01BQ0hJTkU9dW5rbm93bgorVU5BTUVfUkVMRUFTRT1gKHVuYW1lIC1yKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfUkVMRUFTRT11bmtub3duCitVTkFNRV9TWVNURU09YCh1bmFtZSAtcykgMj4vZGV2L251bGxgICB8fCBVTkFNRV9TWVNURU09dW5rbm93bgorVU5BTUVfVkVSU0lPTj1gKHVuYW1lIC12KSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfVkVSU0lPTj11bmtub3duCisKKyMgTm90ZTogb3JkZXIgaXMgc2lnbmlmaWNhbnQgLSB0aGUgY2FzZSBicmFuY2hlcyBhcmUgbm90IGV4Y2x1c2l2ZS4KKworY2FzZSAiJHtVTkFNRV9NQUNISU5FfToke1VOQU1FX1NZU1RFTX06JHtVTkFNRV9SRUxFQVNFfToke1VOQU1FX1ZFUlNJT059IiBpbgorICAgICo6TmV0QlNEOio6KikKKwkjIE5ldEJTRCAobmJzZCkgdGFyZ2V0cyBzaG91bGQgKHdoZXJlIGFwcGxpY2FibGUpIG1hdGNoIG9uZSBvcgorCSMgbW9yZSBvZiB0aGUgdHVwcGxlczogKi0qLW5ldGJzZGVsZiosICotKi1uZXRic2Rhb3V0KiwKKwkjICotKi1uZXRic2RlY29mZiogYW5kICotKi1uZXRic2QqLiAgRm9yIHRhcmdldHMgdGhhdCByZWNlbnRseQorCSMgc3dpdGNoZWQgdG8gRUxGLCAqLSotbmV0YnNkKiB3b3VsZCBzZWxlY3QgdGhlIG9sZAorCSMgb2JqZWN0IGZpbGUgZm9ybWF0LiAgVGhpcyBwcm92aWRlcyBib3RoIGZvcndhcmQKKwkjIGNvbXBhdGliaWxpdHkgYW5kIGEgY29uc2lzdGVudCBtZWNoYW5pc20gZm9yIHNlbGVjdGluZyB0aGUKKwkjIG9iamVjdCBmaWxlIGZvcm1hdC4KKwkjCisJIyBOb3RlOiBOZXRCU0QgZG9lc24ndCBwYXJ0aWN1bGFybHkgY2FyZSBhYm91dCB0aGUgdmVuZG9yCisJIyBwb3J0aW9uIG9mIHRoZSBuYW1lLiAgV2UgYWx3YXlzIHNldCBpdCB0byAidW5rbm93biIuCisJc3lzY3RsPSJzeXNjdGwgLW4gaHcubWFjaGluZV9hcmNoIgorCVVOQU1FX01BQ0hJTkVfQVJDSD1gKC9zYmluLyRzeXNjdGwgMj4vZGV2L251bGwgfHwgXAorCSAgICAvdXNyL3NiaW4vJHN5c2N0bCAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd24pYAorCWNhc2UgIiR7VU5BTUVfTUFDSElORV9BUkNIfSIgaW4KKwkgICAgYXJtZWIpIG1hY2hpbmU9YXJtZWItdW5rbm93biA7OworCSAgICBhcm0qKSBtYWNoaW5lPWFybS11bmtub3duIDs7CisJICAgIHNoM2VsKSBtYWNoaW5lPXNobC11bmtub3duIDs7CisJICAgIHNoM2ViKSBtYWNoaW5lPXNoLXVua25vd24gOzsKKwkgICAgc2g1ZWwpIG1hY2hpbmU9c2g1bGUtdW5rbm93biA7OworCSAgICAqKSBtYWNoaW5lPSR7VU5BTUVfTUFDSElORV9BUkNIfS11bmtub3duIDs7CisJZXNhYworCSMgVGhlIE9wZXJhdGluZyBTeXN0ZW0gaW5jbHVkaW5nIG9iamVjdCBmb3JtYXQsIGlmIGl0IGhhcyBzd2l0Y2hlZAorCSMgdG8gRUxGIHJlY2VudGx5LCBvciB3aWxsIGluIHRoZSBmdXR1cmUuCisJY2FzZSAiJHtVTkFNRV9NQUNISU5FX0FSQ0h9IiBpbgorCSAgICBhcm0qfGkzODZ8bTY4a3xuczMya3xzaDMqfHNwYXJjfHZheCkKKwkJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCQlpZiBlY2hvIF9fRUxGX18gfCAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwgXAorCQkJfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbAorCQl0aGVuCisJCSAgICAjIE9uY2UgYWxsIHV0aWxpdGllcyBjYW4gYmUgRUNPRkYgKG5ldGJzZGVjb2ZmKSBvciBhLm91dCAobmV0YnNkYW91dCkuCisJCSAgICAjIFJldHVybiBuZXRic2QgZm9yIGVpdGhlci4gIEZJWD8KKwkJICAgIG9zPW5ldGJzZAorCQllbHNlCisJCSAgICBvcz1uZXRic2RlbGYKKwkJZmkKKwkJOzsKKwkgICAgKikKKwkgICAgICAgIG9zPW5ldGJzZAorCQk7OworCWVzYWMKKwkjIFRoZSBPUyByZWxlYXNlCisJIyBEZWJpYW4gR05VL05ldEJTRCBtYWNoaW5lcyBoYXZlIGEgZGlmZmVyZW50IHVzZXJsYW5kLCBhbmQKKwkjIHRodXMsIG5lZWQgYSBkaXN0aW5jdCB0cmlwbGV0LiBIb3dldmVyLCB0aGV5IGRvIG5vdCBuZWVkCisJIyBrZXJuZWwgdmVyc2lvbiBpbmZvcm1hdGlvbiwgc28gaXQgY2FuIGJlIHJlcGxhY2VkIHdpdGggYQorCSMgc3VpdGFibGUgdGFnLCBpbiB0aGUgc3R5bGUgb2YgbGludXgtZ251LgorCWNhc2UgIiR7VU5BTUVfVkVSU0lPTn0iIGluCisJICAgIERlYmlhbiopCisJCXJlbGVhc2U9Jy1nbnUnCisJCTs7CisJICAgICopCisJCXJlbGVhc2U9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy1fXS4qL1wuLydgCisJCTs7CisJZXNhYworCSMgU2luY2UgQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLUtFUk5FTC1PUEVSQVRJTkdfU1lTVEVNOgorCSMgY29udGFpbnMgcmVkdW5kYW50IGluZm9ybWF0aW9uLCB0aGUgc2hvcnRlciBmb3JtOgorCSMgQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLU9QRVJBVElOR19TWVNURU0gaXMgdXNlZC4KKwllY2hvICIke21hY2hpbmV9LSR7b3N9JHtyZWxlYXNlfSIKKwlleGl0IDs7CisgICAgKjpPcGVuQlNEOio6KikKKwlVTkFNRV9NQUNISU5FX0FSQ0g9YGFyY2ggfCBzZWQgJ3MvT3BlbkJTRC4vLydgCisJZWNobyAke1VOQU1FX01BQ0hJTkVfQVJDSH0tdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOmVra29CU0Q6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWVra29ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6U29saWRCU0Q6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXNvbGlkYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBtYWNwcGM6TWlyQlNEOio6KikKKwllY2hvIHBvd2VycGMtdW5rbm93bi1taXJic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6TWlyQlNEOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1taXJic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIGFscGhhOk9TRjE6KjoqKQorCWNhc2UgJFVOQU1FX1JFTEVBU0UgaW4KKwkqNC4wKQorCQlVTkFNRV9SRUxFQVNFPWAvdXNyL3NiaW4vc2l6ZXIgLXYgfCBhd2sgJ3twcmludCAkM30nYAorCQk7OworCSo1LiopCisJICAgICAgICBVTkFNRV9SRUxFQVNFPWAvdXNyL3NiaW4vc2l6ZXIgLXYgfCBhd2sgJ3twcmludCAkNH0nYAorCQk7OworCWVzYWMKKwkjIEFjY29yZGluZyB0byBDb21wYXEsIC91c3Ivc2Jpbi9wc3JpbmZvIGhhcyBiZWVuIGF2YWlsYWJsZSBvbgorCSMgT1NGLzEgYW5kIFRydTY0IHN5c3RlbXMgcHJvZHVjZWQgc2luY2UgMTk5NS4gIEkgaG9wZSB0aGF0CisJIyBjb3ZlcnMgbW9zdCBzeXN0ZW1zIHJ1bm5pbmcgdG9kYXkuICBUaGlzIGNvZGUgcGlwZXMgdGhlIENQVQorCSMgdHlwZXMgdGhyb3VnaCBoZWFkIC1uIDEsIHNvIHdlIG9ubHkgZGV0ZWN0IHRoZSB0eXBlIG9mIENQVSAwLgorCUFMUEhBX0NQVV9UWVBFPWAvdXNyL3NiaW4vcHNyaW5mbyAtdiB8IHNlZCAtbiAtZSAncy9eICBUaGUgYWxwaGEgXCguKlwpIHByb2Nlc3Nvci4qJC9cMS9wJyB8IGhlYWQgLW4gMWAKKwljYXNlICIkQUxQSEFfQ1BVX1RZUEUiIGluCisJICAgICJFVjQgKDIxMDY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhIiA7OworCSAgICAiRVY0LjUgKDIxMDY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhIiA7OworCSAgICAiTENBNCAoMjEwNjYvMjEwNjgpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGEiIDs7CisJICAgICJFVjUgKDIxMTY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1IiA7OworCSAgICAiRVY1LjYgKDIxMTY0QSkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NTYiIDs7CisJICAgICJFVjUuNiAoMjExNjRQQykiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYXBjYTU2IiA7OworCSAgICAiRVY1LjcgKDIxMTY0UEMpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFwY2E1NyIgOzsKKwkgICAgIkVWNiAoMjEyNjQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjYiIDs7CisJICAgICJFVjYuNyAoMjEyNjRBKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2NyIgOzsKKwkgICAgIkVWNi44Q0IgKDIxMjY0QykiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjgiIDs7CisJICAgICJFVjYuOEFMICgyMTI2NEIpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY4IiA7OworCSAgICAiRVY2LjhDWCAoMjEyNjREKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OCIgOzsKKwkgICAgIkVWNi45QSAoMjEyNjQvRVY2OUEpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY5IiA7OworCSAgICAiRVY3ICgyMTM2NCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NyIgOzsKKwkgICAgIkVWNy45ICgyMTM2NEEpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjc5IiA7OworCWVzYWMKKwkjIEEgUG4ubiB2ZXJzaW9uIGlzIGEgcGF0Y2hlZCB2ZXJzaW9uLgorCSMgQSBWbi5uIHZlcnNpb24gaXMgYSByZWxlYXNlZCB2ZXJzaW9uLgorCSMgQSBUbi5uIHZlcnNpb24gaXMgYSByZWxlYXNlZCBmaWVsZCB0ZXN0IHZlcnNpb24uCisJIyBBIFhuLm4gdmVyc2lvbiBpcyBhbiB1bnJlbGVhc2VkIGV4cGVyaW1lbnRhbCBiYXNlbGV2ZWwuCisJIyAxLjIgdXNlcyAiMS4yIiBmb3IgdW5hbWUgLXIuCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWRlYy1vc2ZgZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL15bUFZUWF0vLycgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisJZXhpdCA7OworICAgIEFscGhhXCAqOldpbmRvd3NfTlQqOiopCisJIyBIb3cgZG8gd2Uga25vdyBpdCdzIEludGVyaXggcmF0aGVyIHRoYW4gdGhlIGdlbmVyaWMgUE9TSVggc3Vic3lzdGVtPworCSMgU2hvdWxkIHdlIGNoYW5nZSBVTkFNRV9NQUNISU5FIGJhc2VkIG9uIHRoZSBvdXRwdXQgb2YgdW5hbWUgaW5zdGVhZAorCSMgb2YgdGhlIHNwZWNpZmljIEFscGhhIG1vZGVsPworCWVjaG8gYWxwaGEtcGMtaW50ZXJpeAorCWV4aXQgOzsKKyAgICAyMTA2NDpXaW5kb3dzX05UOjUwOjMpCisJZWNobyBhbHBoYS1kZWMtd2lubnQzLjUKKwlleGl0IDs7CisgICAgQW1pZ2EqOlVOSVhfU3lzdGVtX1Y6NC4wOiopCisJZWNobyBtNjhrLXVua25vd24tc3lzdjQKKwlleGl0IDs7CisgICAgKjpbQWFdbWlnYVtPb11bU3NdOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1hbWlnYW9zCisJZXhpdCA7OworICAgICo6W01tXW9ycGhbT29dW1NzXToqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbW9ycGhvcworCWV4aXQgOzsKKyAgICAqOk9TLzM5MDoqOiopCisJZWNobyBpMzcwLWlibS1vcGVuZWRpdGlvbgorCWV4aXQgOzsKKyAgICAqOnovVk06KjoqKQorCWVjaG8gczM5MC1pYm0tenZtb2UKKwlleGl0IDs7CisgICAgKjpPUzQwMDoqOiopCisgICAgICAgIGVjaG8gcG93ZXJwYy1pYm0tb3M0MDAKKwlleGl0IDs7CisgICAgYXJtOlJJU0MqOjEuWzAxMl0qOip8YXJtOnJpc2NpeDoxLlswMTJdKjoqKQorCWVjaG8gYXJtLWFjb3JuLXJpc2NpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgYXJtOnJpc2NvczoqOip8YXJtOlJJU0NPUzoqOiopCisJZWNobyBhcm0tdW5rbm93bi1yaXNjb3MKKwlleGl0IDs7CisgICAgU1IyPzAxOkhJLVVYL01QUDoqOiogfCBTUjgwMDA6SEktVVgvTVBQOio6KikKKwllY2hvIGhwcGExLjEtaGl0YWNoaS1oaXV4bXBwCisJZXhpdCA7OworICAgIFB5cmFtaWQqOk9TeCo6KjoqIHwgTUlTKjpPU3gqOio6KiB8IE1JUyo6U01QX0RDLU9TeCo6KjoqKQorCSMgYWtlZUB3cGRpczAzLndwYWZiLmFmLm1pbCAoRWFybGUgRi4gQWtlKSBjb250cmlidXRlZCBNSVMgYW5kIE5JTEUuCisJaWYgdGVzdCAiYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbGAiID0gYXR0IDsgdGhlbgorCQllY2hvIHB5cmFtaWQtcHlyYW1pZC1zeXN2MworCWVsc2UKKwkJZWNobyBweXJhbWlkLXB5cmFtaWQtYnNkCisJZmkKKwlleGl0IDs7CisgICAgTklMRSo6KjoqOmRjb3N4KQorCWVjaG8gcHlyYW1pZC1weXJhbWlkLXN2cjQKKwlleGl0IDs7CisgICAgRFJTPzYwMDA6dW5peDo0LjA6NiopCisJZWNobyBzcGFyYy1pY2wtbng2CisJZXhpdCA7OworICAgIERSUz82MDAwOlVOSVhfU1Y6NC4yKjo3KiB8IERSUz82MDAwOmlzaXM6NC4yKjo3KikKKwljYXNlIGAvdXNyL2Jpbi91bmFtZSAtcGAgaW4KKwkgICAgc3BhcmMpIGVjaG8gc3BhcmMtaWNsLW54NzsgZXhpdCA7OworCWVzYWMgOzsKKyAgICBzdW40SDpTdW5PUzo1Lio6KikKKwllY2hvIHNwYXJjLWhhbC1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgOzsKKyAgICBzdW40KjpTdW5PUzo1Lio6KiB8IHRhZHBvbGUqOlN1bk9TOjUuKjoqKQorCWVjaG8gc3BhcmMtc3VuLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCA7OworICAgIGk4NnBjOlN1bk9TOjUuKjoqIHwgaTg2eGVuOlN1bk9TOjUuKjoqKQorCWVjaG8gaTM4Ni1wYy1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgOzsKKyAgICBzdW40KjpTdW5PUzo2KjoqKQorCSMgQWNjb3JkaW5nIHRvIGNvbmZpZy5zdWIsIHRoaXMgaXMgdGhlIHByb3BlciB3YXkgdG8gY2Fub25pY2FsaXplCisJIyBTdW5PUzYuICBIYXJkIHRvIGd1ZXNzIGV4YWN0bHkgd2hhdCBTdW5PUzYgd2lsbCBiZSBsaWtlLCBidXQKKwkjIGl0J3MgbGlrZWx5IHRvIGJlIG1vcmUgbGlrZSBTb2xhcmlzIHRoYW4gU3VuT1M0LgorCWVjaG8gc3BhcmMtc3VuLXNvbGFyaXMzYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCA7OworICAgIHN1bjQqOlN1bk9TOio6KikKKwljYXNlICJgL3Vzci9iaW4vYXJjaCAta2AiIGluCisJICAgIFNlcmllcyp8UzQqKQorCQlVTkFNRV9SRUxFQVNFPWB1bmFtZSAtdmAKKwkJOzsKKwllc2FjCisJIyBKYXBhbmVzZSBMYW5ndWFnZSB2ZXJzaW9ucyBoYXZlIGEgdmVyc2lvbiBudW1iZXIgbGlrZSBgNC4xLjMtSkwnLgorCWVjaG8gc3BhcmMtc3VuLXN1bm9zYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvLS9fLydgCisJZXhpdCA7OworICAgIHN1bjMqOlN1bk9TOio6KikKKwllY2hvIG02OGstc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBzdW4qOio6NC4yQlNEOiopCisJVU5BTUVfUkVMRUFTRT1gKHNlZCAxcSAvZXRjL21vdGQgfCBhd2sgJ3twcmludCBzdWJzdHIoJDUsMSwzKX0nKSAyPi9kZXYvbnVsbGAKKwl0ZXN0ICJ4JHtVTkFNRV9SRUxFQVNFfSIgPSAieCIgJiYgVU5BTUVfUkVMRUFTRT0zCisJY2FzZSAiYC9iaW4vYXJjaGAiIGluCisJICAgIHN1bjMpCisJCWVjaG8gbTY4ay1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9CisJCTs7CisJICAgIHN1bjQpCisJCWVjaG8gc3BhcmMtc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCQk7OworCWVzYWMKKwlleGl0IDs7CisgICAgYXVzaHA6U3VuT1M6KjoqKQorCWVjaG8gc3BhcmMtYXVzcGV4LXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAjIFRoZSBzaXR1YXRpb24gZm9yIE1pTlQgaXMgYSBsaXR0bGUgY29uZnVzaW5nLiAgVGhlIG1hY2hpbmUgbmFtZQorICAgICMgY2FuIGJlIHZpcnR1YWxseSBldmVyeXRoaW5nIChldmVyeXRoaW5nIHdoaWNoIGlzIG5vdAorICAgICMgImF0YXJpc3QiIG9yICJhdGFyaXN0ZSIgYXQgbGVhc3Qgc2hvdWxkIGhhdmUgYSBwcm9jZXNzb3IKKyAgICAjID4gbTY4MDAwKS4gIFRoZSBzeXN0ZW0gbmFtZSByYW5nZXMgZnJvbSAiTWlOVCIgb3ZlciAiRnJlZU1pTlQiCisgICAgIyB0byB0aGUgbG93ZXJjYXNlIHZlcnNpb24gIm1pbnQiIChvciAiZnJlZW1pbnQiKS4gIEZpbmFsbHkKKyAgICAjIHRoZSBzeXN0ZW0gbmFtZSAiVE9TIiBkZW5vdGVzIGEgc3lzdGVtIHdoaWNoIGlzIGFjdHVhbGx5IG5vdAorICAgICMgTWlOVC4gIEJ1dCBNaU5UIGlzIGRvd253YXJkIGNvbXBhdGlibGUgdG8gVE9TLCBzbyB0aGlzIHNob3VsZAorICAgICMgYmUgbm8gcHJvYmxlbS4KKyAgICBhdGFyaXN0W2VdOipNaU5UOio6KiB8IGF0YXJpc3RbZV06Km1pbnQ6KjoqIHwgYXRhcmlzdFtlXToqVE9TOio6KikKKyAgICAgICAgZWNobyBtNjhrLWF0YXJpLW1pbnQke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIGF0YXJpKjoqTWlOVDoqOiogfCBhdGFyaSo6Km1pbnQ6KjoqIHwgYXRhcmlzdFtlXToqVE9TOio6KikKKwllY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KKyAgICAgICAgZXhpdCA7OworICAgICpmYWxjb24qOipNaU5UOio6KiB8ICpmYWxjb24qOiptaW50Oio6KiB8ICpmYWxjb24qOipUT1M6KjoqKQorICAgICAgICBlY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgbWlsYW4qOipNaU5UOio6KiB8IG1pbGFuKjoqbWludDoqOiogfCAqbWlsYW4qOipUT1M6KjoqKQorICAgICAgICBlY2hvIG02OGstbWlsYW4tbWludCR7VU5BTUVfUkVMRUFTRX0KKyAgICAgICAgZXhpdCA7OworICAgIGhhZGVzKjoqTWlOVDoqOiogfCBoYWRlcyo6Km1pbnQ6KjoqIHwgKmhhZGVzKjoqVE9TOio6KikKKyAgICAgICAgZWNobyBtNjhrLWhhZGVzLW1pbnQke1VOQU1FX1JFTEVBU0V9CisgICAgICAgIGV4aXQgOzsKKyAgICAqOipNaU5UOio6KiB8ICo6Km1pbnQ6KjoqIHwgKjoqVE9TOio6KikKKyAgICAgICAgZWNobyBtNjhrLXVua25vd24tbWludCR7VU5BTUVfUkVMRUFTRX0KKyAgICAgICAgZXhpdCA7OworICAgIG02OGs6bWFjaHRlbjoqOiopCisJZWNobyBtNjhrLWFwcGxlLW1hY2h0ZW4ke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIHBvd2VycGM6bWFjaHRlbjoqOiopCisJZWNobyBwb3dlcnBjLWFwcGxlLW1hY2h0ZW4ke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFJJU0MqOk1hY2g6KjoqKQorCWVjaG8gbWlwcy1kZWMtbWFjaF9ic2Q0LjMKKwlleGl0IDs7CisgICAgUklTQyo6VUxUUklYOio6KikKKwllY2hvIG1pcHMtZGVjLXVsdHJpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgVkFYKjpVTFRSSVgqOio6KikKKwllY2hvIHZheC1kZWMtdWx0cml4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAyMDIwOkNMSVg6KjoqIHwgMjQzMDpDTElYOio6KikKKwllY2hvIGNsaXBwZXItaW50ZXJncmFwaC1jbGl4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBtaXBzOio6KjpVTUlQUyB8IG1pcHM6KjoqOlJJU0NvcykKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKKyNpZmRlZiBfX2NwbHVzcGx1cworI2luY2x1ZGUgPHN0ZGlvLmg+ICAvKiBmb3IgcHJpbnRmKCkgcHJvdG90eXBlICovCisJaW50IG1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKKyNlbHNlCisJaW50IG1haW4gKGFyZ2MsIGFyZ3YpIGludCBhcmdjOyBjaGFyICphcmd2W107IHsKKyNlbmRpZgorCSNpZiBkZWZpbmVkIChob3N0X21pcHMpICYmIGRlZmluZWQgKE1JUFNFQikKKwkjaWYgZGVmaW5lZCAoU1lTVFlQRV9TWVNWKQorCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzc3lzdlxuIiwgYXJndlsxXSk7IGV4aXQgKDApOworCSNlbmRpZgorCSNpZiBkZWZpbmVkIChTWVNUWVBFX1NWUjQpCisJICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNzdnI0XG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7CisJI2VuZGlmCisJI2lmIGRlZmluZWQgKFNZU1RZUEVfQlNENDMpIHx8IGRlZmluZWQoU1lTVFlQRV9CU0QpCisJICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNic2RcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKKwkjZW5kaWYKKwkjZW5kaWYKKwkgIGV4aXQgKC0xKTsKKwl9CitFT0YKKwkkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAmJgorCSAgZHVtbXlhcmc9YGVjaG8gIiR7VU5BTUVfUkVMRUFTRX0iIHwgc2VkIC1uICdzL1woWzAtOV0qXCkuKi9cMS9wJ2AgJiYKKwkgIFNZU1RFTV9OQU1FPWAkZHVtbXkgJGR1bW15YXJnYCAmJgorCSAgICB7IGVjaG8gIiRTWVNURU1fTkFNRSI7IGV4aXQ7IH0KKwllY2hvIG1pcHMtbWlwcy1yaXNjb3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIE1vdG9yb2xhOlBvd2VyTUFYX09TOio6KikKKwllY2hvIHBvd2VycGMtbW90b3JvbGEtcG93ZXJtYXgKKwlleGl0IDs7CisgICAgTW90b3JvbGE6Kjo0LjM6UEw4LSopCisJZWNobyBwb3dlcnBjLWhhcnJpcy1wb3dlcm1heAorCWV4aXQgOzsKKyAgICBOaWdodF9IYXdrOio6KjpQb3dlck1BWF9PUyB8IFN5bmVyZ3k6UG93ZXJNQVhfT1M6KjoqKQorCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJtYXgKKwlleGl0IDs7CisgICAgTmlnaHRfSGF3azpQb3dlcl9VTklYOio6KikKKwllY2hvIHBvd2VycGMtaGFycmlzLXBvd2VydW5peAorCWV4aXQgOzsKKyAgICBtODhrOkNYL1VYOjcqOiopCisJZWNobyBtODhrLWhhcnJpcy1jeHV4NworCWV4aXQgOzsKKyAgICBtODhrOio6NCo6UjQqKQorCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2NAorCWV4aXQgOzsKKyAgICBtODhrOio6Myo6UjMqKQorCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2MworCWV4aXQgOzsKKyAgICBBVmlpT046ZGd1eDoqOiopCisgICAgICAgICMgREcvVVggcmV0dXJucyBBVmlpT04gZm9yIGFsbCBhcmNoaXRlY3R1cmVzCisgICAgICAgIFVOQU1FX1BST0NFU1NPUj1gL3Vzci9iaW4vdW5hbWUgLXBgCisJaWYgWyAkVU5BTUVfUFJPQ0VTU09SID0gbWM4ODEwMCBdIHx8IFsgJFVOQU1FX1BST0NFU1NPUiA9IG1jODgxMTAgXQorCXRoZW4KKwkgICAgaWYgWyAke1RBUkdFVF9CSU5BUllfSU5URVJGQUNFfXggPSBtODhrZGd1eGVsZnggXSB8fCBcCisJICAgICAgIFsgJHtUQVJHRVRfQklOQVJZX0lOVEVSRkFDRX14ID0geCBdCisJICAgIHRoZW4KKwkJZWNobyBtODhrLWRnLWRndXgke1VOQU1FX1JFTEVBU0V9CisJICAgIGVsc2UKKwkJZWNobyBtODhrLWRnLWRndXhiY3Mke1VOQU1FX1JFTEVBU0V9CisJICAgIGZpCisJZWxzZQorCSAgICBlY2hvIGk1ODYtZGctZGd1eCR7VU5BTUVfUkVMRUFTRX0KKwlmaQorIAlleGl0IDs7CisgICAgTTg4KjpEb2xwaGluT1M6KjoqKQkjIERvbHBoaW5PUyAoU1ZSMykKKwllY2hvIG04OGstZG9scGhpbi1zeXN2MworCWV4aXQgOzsKKyAgICBNODgqOio6UjMqOiopCisJIyBEZWx0YSA4OGsgc3lzdGVtIHJ1bm5pbmcgU1ZSMworCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2MworCWV4aXQgOzsKKyAgICBYRDg4KjoqOio6KikgIyBUZWt0cm9uaXggWEQ4OCBzeXN0ZW0gcnVubmluZyBVVGVrViAoU1ZSMykKKwllY2hvIG04OGstdGVrdHJvbml4LXN5c3YzCisJZXhpdCA7OworICAgIFRlazQzWzAtOV1bMC05XTpVVGVrOio6KikgIyBUZWt0cm9uaXggNDMwMCBzeXN0ZW0gcnVubmluZyBVVGVrIChCU0QpCisJZWNobyBtNjhrLXRla3Ryb25peC1ic2QKKwlleGl0IDs7CisgICAgKjpJUklYKjoqOiopCisJZWNobyBtaXBzLXNnaS1pcml4YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvLS9fL2cnYAorCWV4aXQgOzsKKyAgICA/Pz8/Pz8/PzpBSVg/OlsxMl0uMToyKSAgICMgQUlYIDIuMi4xIG9yIEFJWCAyLjEuMSBpcyBSVC9QQyBBSVguCisJZWNobyByb21wLWlibS1haXggICAgICMgdW5hbWUgLW0gZ2l2ZXMgYW4gOCBoZXgtY29kZSBDUFUgaWQKKwlleGl0IDs7ICAgICAgICAgICAgICAgIyBOb3RlIHRoYXQ6IGVjaG8gIidgdW5hbWUgLXNgJyIgZ2l2ZXMgJ0FJWCAnCisgICAgaSo4NjpBSVg6KjoqKQorCWVjaG8gaTM4Ni1pYm0tYWl4CisJZXhpdCA7OworICAgIGlhNjQ6QUlYOio6KikKKwlpZiBbIC14IC91c3IvYmluL29zbGV2ZWwgXSA7IHRoZW4KKwkJSUJNX1JFVj1gL3Vzci9iaW4vb3NsZXZlbGAKKwllbHNlCisJCUlCTV9SRVY9JHtVTkFNRV9WRVJTSU9OfS4ke1VOQU1FX1JFTEVBU0V9CisJZmkKKwllY2hvICR7VU5BTUVfTUFDSElORX0taWJtLWFpeCR7SUJNX1JFVn0KKwlleGl0IDs7CisgICAgKjpBSVg6MjozKQorCWlmIGdyZXAgYm9zMzI1IC91c3IvaW5jbHVkZS9zdGRpby5oID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJCXNlZCAncy9eCQkvLycgPDwgRU9GID4kZHVtbXkuYworCQkjaW5jbHVkZSA8c3lzL3N5c3RlbWNmZy5oPgorCisJCW1haW4oKQorCQkJeworCQkJaWYgKCFfX3Bvd2VyX3BjKCkpCisJCQkJZXhpdCgxKTsKKwkJCXB1dHMoInBvd2VycGMtaWJtLWFpeDMuMi41Iik7CisJCQlleGl0KDApOworCQkJfQorRU9GCisJCWlmICRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jICYmIFNZU1RFTV9OQU1FPWAkZHVtbXlgCisJCXRoZW4KKwkJCWVjaG8gIiRTWVNURU1fTkFNRSIKKwkJZWxzZQorCQkJZWNobyByczYwMDAtaWJtLWFpeDMuMi41CisJCWZpCisJZWxpZiBncmVwIGJvczMyNCAvdXNyL2luY2x1ZGUvc3RkaW8uaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkJZWNobyByczYwMDAtaWJtLWFpeDMuMi40CisJZWxzZQorCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yCisJZmkKKwlleGl0IDs7CisgICAgKjpBSVg6KjpbNDVdKQorCUlCTV9DUFVfSUQ9YC91c3Ivc2Jpbi9sc2RldiAtQyAtYyBwcm9jZXNzb3IgLVMgYXZhaWxhYmxlIHwgc2VkIDFxIHwgYXdrICd7IHByaW50ICQxIH0nYAorCWlmIC91c3Ivc2Jpbi9sc2F0dHIgLUVsICR7SUJNX0NQVV9JRH0gfCBncmVwICcgUE9XRVInID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQlJQk1fQVJDSD1yczYwMDAKKwllbHNlCisJCUlCTV9BUkNIPXBvd2VycGMKKwlmaQorCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgorCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYAorCWVsc2UKKwkJSUJNX1JFVj0ke1VOQU1FX1ZFUlNJT059LiR7VU5BTUVfUkVMRUFTRX0KKwlmaQorCWVjaG8gJHtJQk1fQVJDSH0taWJtLWFpeCR7SUJNX1JFVn0KKwlleGl0IDs7CisgICAgKjpBSVg6KjoqKQorCWVjaG8gcnM2MDAwLWlibS1haXgKKwlleGl0IDs7CisgICAgaWJtcnQ6NC40QlNEOip8cm9tcC1pYm06QlNEOiopCisJZWNobyByb21wLWlibS1ic2Q0LjQKKwlleGl0IDs7CisgICAgaWJtcnQ6KkJTRDoqfHJvbXAtaWJtOkJTRDoqKSAgICAgICAgICAgICMgY292ZXJzIFJUL1BDIEJTRCBhbmQKKwllY2hvIHJvbXAtaWJtLWJzZCR7VU5BTUVfUkVMRUFTRX0gICAjIDQuMyB3aXRoIHVuYW1lIGFkZGVkIHRvCisJZXhpdCA7OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXBvcnQ6IHJvbXAtaWJtIEJTRCA0LjMKKyAgICAqOkJPU1g6KjoqKQorCWVjaG8gcnM2MDAwLWJ1bGwtYm9zeAorCWV4aXQgOzsKKyAgICBEUFgvMj8wMDpCLk8uUy46KjoqKQorCWVjaG8gbTY4ay1idWxsLXN5c3YzCisJZXhpdCA7OworICAgIDkwMDAvWzM0XT8/OjQuM2JzZDoxLio6KikKKwllY2hvIG02OGstaHAtYnNkCisJZXhpdCA7OworICAgIGhwMzAwOjQuNEJTRDoqOiogfCA5MDAwL1szNF0/Pzo0LjNic2Q6Mi4qOiopCisJZWNobyBtNjhrLWhwLWJzZDQuNAorCWV4aXQgOzsKKyAgICA5MDAwL1szNDY3OF0/PzpIUC1VWDoqOiopCisJSFBVWF9SRVY9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSouWzBCXSovLydgCisJY2FzZSAiJHtVTkFNRV9NQUNISU5FfSIgaW4KKwkgICAgOTAwMC8zMT8gKSAgICAgICAgICAgIEhQX0FSQ0g9bTY4MDAwIDs7CisJICAgIDkwMDAvWzM0XT8/ICkgICAgICAgICBIUF9BUkNIPW02OGsgOzsKKwkgICAgOTAwMC9bNjc4XVswLTldWzAtOV0pCisJCWlmIFsgLXggL3Vzci9iaW4vZ2V0Y29uZiBdOyB0aGVuCisJCSAgICBzY19jcHVfdmVyc2lvbj1gL3Vzci9iaW4vZ2V0Y29uZiBTQ19DUFVfVkVSU0lPTiAyPi9kZXYvbnVsbGAKKyAgICAgICAgICAgICAgICAgICAgc2Nfa2VybmVsX2JpdHM9YC91c3IvYmluL2dldGNvbmYgU0NfS0VSTkVMX0JJVFMgMj4vZGV2L251bGxgCisgICAgICAgICAgICAgICAgICAgIGNhc2UgIiR7c2NfY3B1X3ZlcnNpb259IiBpbgorICAgICAgICAgICAgICAgICAgICAgIDUyMykgSFBfQVJDSD0iaHBwYTEuMCIgOzsgIyBDUFVfUEFfUklTQzFfMAorICAgICAgICAgICAgICAgICAgICAgIDUyOCkgSFBfQVJDSD0iaHBwYTEuMSIgOzsgIyBDUFVfUEFfUklTQzFfMQorICAgICAgICAgICAgICAgICAgICAgIDUzMikgICAgICAgICAgICAgICAgICAgICAgIyBDUFVfUEFfUklTQzJfMAorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiJHtzY19rZXJuZWxfYml0c30iIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgIDMyKSBIUF9BUkNIPSJocHBhMi4wbiIgOzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgNjQpIEhQX0FSQ0g9ImhwcGEyLjB3IiA7OworCQkJICAnJykgSFBfQVJDSD0iaHBwYTIuMCIgOzsgICAjIEhQLVVYIDEwLjIwCisgICAgICAgICAgICAgICAgICAgICAgICBlc2FjIDs7CisgICAgICAgICAgICAgICAgICAgIGVzYWMKKwkJZmkKKwkJaWYgWyAiJHtIUF9BUkNIfSIgPSAiIiBdOyB0aGVuCisJCSAgICBldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJCSAgICBzZWQgJ3MvXiAgICAgICAgICAgICAgLy8nIDw8IEVPRiA+JGR1bW15LmMKKworICAgICAgICAgICAgICAjZGVmaW5lIF9IUFVYX1NPVVJDRQorICAgICAgICAgICAgICAjaW5jbHVkZSA8c3RkbGliLmg+CisgICAgICAgICAgICAgICNpbmNsdWRlIDx1bmlzdGQuaD4KKworICAgICAgICAgICAgICBpbnQgbWFpbiAoKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICNpZiBkZWZpbmVkKF9TQ19LRVJORUxfQklUUykKKyAgICAgICAgICAgICAgICAgIGxvbmcgYml0cyA9IHN5c2NvbmYoX1NDX0tFUk5FTF9CSVRTKTsKKyAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgICBsb25nIGNwdSAgPSBzeXNjb25mIChfU0NfQ1BVX1ZFUlNJT04pOworCisgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNwdSkKKyAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgCWNhc2UgQ1BVX1BBX1JJU0MxXzA6IHB1dHMgKCJocHBhMS4wIik7IGJyZWFrOworICAgICAgICAgICAgICAJY2FzZSBDUFVfUEFfUklTQzFfMTogcHV0cyAoImhwcGExLjEiKTsgYnJlYWs7CisgICAgICAgICAgICAgIAljYXNlIENQVV9QQV9SSVNDMl8wOgorICAgICAgICAgICAgICAjaWYgZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpCisgICAgICAgICAgICAgIAkgICAgc3dpdGNoIChiaXRzKQorICAgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgICAgCQljYXNlIDY0OiBwdXRzICgiaHBwYTIuMHciKTsgYnJlYWs7CisgICAgICAgICAgICAgIAkJY2FzZSAzMjogcHV0cyAoImhwcGEyLjBuIik7IGJyZWFrOworICAgICAgICAgICAgICAJCWRlZmF1bHQ6IHB1dHMgKCJocHBhMi4wIik7IGJyZWFrOworICAgICAgICAgICAgICAJCX0gYnJlYWs7CisgICAgICAgICAgICAgICNlbHNlICAvKiAhZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpICovCisgICAgICAgICAgICAgIAkgICAgcHV0cyAoImhwcGEyLjAiKTsgYnJlYWs7CisgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAJZGVmYXVsdDogcHV0cyAoImhwcGExLjAiKTsgYnJlYWs7CisgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICBleGl0ICgwKTsKKyAgICAgICAgICAgICAgfQorRU9GCisJCSAgICAoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAyPi9kZXYvbnVsbCkgJiYgSFBfQVJDSD1gJGR1bW15YAorCQkgICAgdGVzdCAteiAiJEhQX0FSQ0giICYmIEhQX0FSQ0g9aHBwYQorCQlmaSA7OworCWVzYWMKKwlpZiBbICR7SFBfQVJDSH0gPSAiaHBwYTIuMHciIF0KKwl0aGVuCisJICAgIGV2YWwgJHNldF9jY19mb3JfYnVpbGQKKworCSAgICAjIGhwcGEyLjB3LWhwLWhwdXgqIGhhcyBhIDY0LWJpdCBrZXJuZWwgYW5kIGEgY29tcGlsZXIgZ2VuZXJhdGluZworCSAgICAjIDMyLWJpdCBjb2RlLiAgaHBwYTY0LWhwLWhwdXgqIGhhcyB0aGUgc2FtZSBrZXJuZWwgYW5kIGEgY29tcGlsZXIKKwkgICAgIyBnZW5lcmF0aW5nIDY0LWJpdCBjb2RlLiAgR05VIGFuZCBIUCB1c2UgZGlmZmVyZW50IG5vbWVuY2xhdHVyZToKKwkgICAgIworCSAgICAjICQgQ0NfRk9SX0JVSUxEPWNjIC4vY29uZmlnLmd1ZXNzCisJICAgICMgPT4gaHBwYTIuMHctaHAtaHB1eDExLjIzCisJICAgICMgJCBDQ19GT1JfQlVJTEQ9ImNjICtEQTIuMHciIC4vY29uZmlnLmd1ZXNzCisJICAgICMgPT4gaHBwYTY0LWhwLWhwdXgxMS4yMworCisJICAgIGlmIGVjaG8gX19MUDY0X18gfCAoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwpIHwKKwkJZ3JlcCBfX0xQNjRfXyA+L2Rldi9udWxsCisJICAgIHRoZW4KKwkJSFBfQVJDSD0iaHBwYTIuMHciCisJICAgIGVsc2UKKwkJSFBfQVJDSD0iaHBwYTY0IgorCSAgICBmaQorCWZpCisJZWNobyAke0hQX0FSQ0h9LWhwLWhwdXgke0hQVVhfUkVWfQorCWV4aXQgOzsKKyAgICBpYTY0OkhQLVVYOio6KikKKwlIUFVYX1JFVj1gZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi5bMEJdKi8vJ2AKKwllY2hvIGlhNjQtaHAtaHB1eCR7SFBVWF9SRVZ9CisJZXhpdCA7OworICAgIDMwNTAqOkhJLVVYOio6KikKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKKwkjaW5jbHVkZSA8dW5pc3RkLmg+CisJaW50CisJbWFpbiAoKQorCXsKKwkgIGxvbmcgY3B1ID0gc3lzY29uZiAoX1NDX0NQVV9WRVJTSU9OKTsKKwkgIC8qIFRoZSBvcmRlciBtYXR0ZXJzLCBiZWNhdXNlIENQVV9JU19IUF9NQzY4SyBlcnJvbmVvdXNseSByZXR1cm5zCisJICAgICB0cnVlIGZvciBDUFVfUEFfUklTQzFfMC4gIENQVV9JU19QQV9SSVNDIHJldHVybnMgY29ycmVjdAorCSAgICAgcmVzdWx0cywgaG93ZXZlci4gICovCisJICBpZiAoQ1BVX0lTX1BBX1JJU0MgKGNwdSkpCisJICAgIHsKKwkgICAgICBzd2l0Y2ggKGNwdSkKKwkJeworCQkgIGNhc2UgQ1BVX1BBX1JJU0MxXzA6IHB1dHMgKCJocHBhMS4wLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKKwkJICBjYXNlIENQVV9QQV9SSVNDMV8xOiBwdXRzICgiaHBwYTEuMS1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCSAgY2FzZSBDUFVfUEFfUklTQzJfMDogcHV0cyAoImhwcGEyLjAtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOworCQkgIGRlZmF1bHQ6IHB1dHMgKCJocHBhLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKKwkJfQorCSAgICB9CisJICBlbHNlIGlmIChDUFVfSVNfSFBfTUM2OEsgKGNwdSkpCisJICAgIHB1dHMgKCJtNjhrLWhpdGFjaGktaGl1eHdlMiIpOworCSAgZWxzZSBwdXRzICgidW5rbm93bi1oaXRhY2hpLWhpdXh3ZTIiKTsKKwkgIGV4aXQgKDApOworCX0KK0VPRgorCSRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jICYmIFNZU1RFTV9OQU1FPWAkZHVtbXlgICYmCisJCXsgZWNobyAiJFNZU1RFTV9OQU1FIjsgZXhpdDsgfQorCWVjaG8gdW5rbm93bi1oaXRhY2hpLWhpdXh3ZTIKKwlleGl0IDs7CisgICAgOTAwMC83Pz86NC4zYnNkOio6KiB8IDkwMDAvOD9bNzldOjQuM2JzZDoqOiogKQorCWVjaG8gaHBwYTEuMS1ocC1ic2QKKwlleGl0IDs7CisgICAgOTAwMC84Pz86NC4zYnNkOio6KikKKwllY2hvIGhwcGExLjAtaHAtYnNkCisJZXhpdCA7OworICAgICo5Pz8qOk1QRS9pWDoqOiogfCAqMzAwMCo6TVBFL2lYOio6KikKKwllY2hvIGhwcGExLjAtaHAtbXBlaXgKKwlleGl0IDs7CisgICAgaHA3Pz86T1NGMToqOiogfCBocDg/Wzc5XTpPU0YxOio6KiApCisJZWNobyBocHBhMS4xLWhwLW9zZgorCWV4aXQgOzsKKyAgICBocDg/PzpPU0YxOio6KikKKwllY2hvIGhwcGExLjAtaHAtb3NmCisJZXhpdCA7OworICAgIGkqODY6T1NGMToqOiopCisJaWYgWyAteCAvdXNyL3NiaW4vc3lzdmVyc2lvbiBdIDsgdGhlbgorCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vc2YxbWsKKwllbHNlCisJICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9zZjEKKwlmaQorCWV4aXQgOzsKKyAgICBwYXJpc2MqOkxpdGVzKjoqOiopCisJZWNobyBocHBhMS4xLWhwLWxpdGVzCisJZXhpdCA7OworICAgIEMxKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzEqOiopCisJZWNobyBjMS1jb252ZXgtYnNkCisgICAgICAgIGV4aXQgOzsKKyAgICBDMio6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMyKjoqKQorCWlmIGdldHN5c2luZm8gLWYgc2NhbGFyX2FjYworCXRoZW4gZWNobyBjMzItY29udmV4LWJzZAorCWVsc2UgZWNobyBjMi1jb252ZXgtYnNkCisJZmkKKyAgICAgICAgZXhpdCA7OworICAgIEMzNCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMzNCo6KikKKwllY2hvIGMzNC1jb252ZXgtYnNkCisgICAgICAgIGV4aXQgOzsKKyAgICBDMzgqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMzgqOiopCisJZWNobyBjMzgtY29udmV4LWJzZAorICAgICAgICBleGl0IDs7CisgICAgQzQqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDNCo6KikKKwllY2hvIGM0LWNvbnZleC1ic2QKKyAgICAgICAgZXhpdCA7OworICAgIENSQVkqWS1NUDoqOio6KikKKwllY2hvIHltcC1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICBDUkFZKltBLVpdOTA6KjoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSBcCisJfCBzZWQgLWUgJ3MvQ1JBWS4qXChbQS1aXTkwXCkvXDEvJyBcCisJICAgICAgLWUgeS9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei8gXAorCSAgICAgIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDs7CisgICAgQ1JBWSpUUzoqOio6KikKKwllY2hvIHQ5MC1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICBDUkFZKlQzRToqOio6KikKKwllY2hvIGFscGhhZXY1LWNyYXktdW5pY29zbWske1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDs7CisgICAgQ1JBWSpTVjE6KjoqOiopCisJZWNobyBzdjEtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDs7CisgICAgKjpVTklDT1MvbXA6KjoqKQorCWVjaG8gY3JheW52LWNyYXktdW5pY29zbXAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDs7CisgICAgRjMwWzAxXTpVTklYX1N5c3RlbV9WOio6KiB8IEY3MDA6VU5JWF9TeXN0ZW1fVjoqOiopCisJRlVKSVRTVV9QUk9DPWB1bmFtZSAtbSB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKyAgICAgICAgRlVKSVRTVV9TWVM9YHVuYW1lIC1wIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonIHwgc2VkIC1lICdzL1wvLy8nYAorICAgICAgICBGVUpJVFNVX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzLyAvXy8nYAorICAgICAgICBlY2hvICIke0ZVSklUU1VfUFJPQ30tZnVqaXRzdS0ke0ZVSklUU1VfU1lTfSR7RlVKSVRTVV9SRUx9IgorICAgICAgICBleGl0IDs7CisgICAgNTAwMDpVTklYX1N5c3RlbV9WOjQuKjoqKQorICAgICAgICBGVUpJVFNVX1NZUz1gdW5hbWUgLXAgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvXC8vLydgCisgICAgICAgIEZVSklUU1VfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvIC9fLydgCisgICAgICAgIGVjaG8gInNwYXJjLWZ1aml0c3UtJHtGVUpJVFNVX1NZU30ke0ZVSklUU1VfUkVMfSIKKwlleGl0IDs7CisgICAgaSo4NjpCU0QvMzg2Oio6KiB8IGkqODY6QlNEL09TOio6KiB8ICo6QXNjZW5kXCBFbWJlZGRlZC9PUzoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWJzZGkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIHNwYXJjKjpCU0QvT1M6KjoqKQorCWVjaG8gc3BhcmMtdW5rbm93bi1ic2RpJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOkJTRC9PUzoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYnNkaSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpGcmVlQlNEOio6KikKKwljYXNlICR7VU5BTUVfTUFDSElORX0gaW4KKwkgICAgcGM5OCkKKwkJZWNobyBpMzg2LXVua25vd24tZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AgOzsKKwkgICAgYW1kNjQpCisJCWVjaG8geDg2XzY0LXVua25vd24tZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AgOzsKKwkgICAgKikKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AgOzsKKwllc2FjCisJZXhpdCA7OworICAgIGkqOkNZR1dJTio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtY3lnd2luCisJZXhpdCA7OworICAgICo6TUlOR1cqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1pbmd3MzIKKwlleGl0IDs7CisgICAgaSo6d2luZG93czMyKjoqKQorICAgIAkjIHVuYW1lIC1tIGluY2x1ZGVzICItcGMiIG9uIHRoaXMgc3lzdGVtLgorICAgIAllY2hvICR7VU5BTUVfTUFDSElORX0tbWluZ3czMgorCWV4aXQgOzsKKyAgICBpKjpQVyo6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtcHczMgorCWV4aXQgOzsKKyAgICAqOkludGVyaXgqOlszNDU2XSopCisgICAgCWNhc2UgJHtVTkFNRV9NQUNISU5FfSBpbgorCSAgICB4ODYpCisJCWVjaG8gaTU4Ni1wYy1pbnRlcml4JHtVTkFNRV9SRUxFQVNFfQorCQlleGl0IDs7CisJICAgIEVNNjRUIHwgYXV0aGVudGljYW1kKQorCQllY2hvIHg4Nl82NC11bmtub3duLWludGVyaXgke1VOQU1FX1JFTEVBU0V9CisJCWV4aXQgOzsKKwllc2FjIDs7CisgICAgWzM0NV04NjpXaW5kb3dzXzk1OiogfCBbMzQ1XTg2OldpbmRvd3NfOTg6KiB8IFszNDVdODY6V2luZG93c19OVDoqKQorCWVjaG8gaSR7VU5BTUVfTUFDSElORX0tcGMtbWtzCisJZXhpdCA7OworICAgIGkqOldpbmRvd3NfTlQqOiogfCBQZW50aXVtKjpXaW5kb3dzX05UKjoqKQorCSMgSG93IGRvIHdlIGtub3cgaXQncyBJbnRlcml4IHJhdGhlciB0aGFuIHRoZSBnZW5lcmljIFBPU0lYIHN1YnN5c3RlbT8KKwkjIEl0IGFsc28gY29uZmxpY3RzIHdpdGggcHJlLTIuMCB2ZXJzaW9ucyBvZiBBVCZUIFVXSU4uIFNob3VsZCB3ZQorCSMgVU5BTUVfTUFDSElORSBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIHVuYW1lIGluc3RlYWQgb2YgaTM4Nj8KKwllY2hvIGk1ODYtcGMtaW50ZXJpeAorCWV4aXQgOzsKKyAgICBpKjpVV0lOKjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy11d2luCisJZXhpdCA7OworICAgIGFtZDY0OkNZR1dJTio6KjoqIHwgeDg2XzY0OkNZR1dJTio6KjoqKQorCWVjaG8geDg2XzY0LXVua25vd24tY3lnd2luCisJZXhpdCA7OworICAgIHAqOkNZR1dJTio6KikKKwllY2hvIHBvd2VycGNsZS11bmtub3duLWN5Z3dpbgorCWV4aXQgOzsKKyAgICBwcmVwKjpTdW5PUzo1Lio6KikKKwllY2hvIHBvd2VycGNsZS11bmtub3duLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCA7OworICAgICo6R05VOio6KikKKwkjIHRoZSBHTlUgc3lzdGVtCisJZWNobyBgZWNobyAke1VOQU1FX01BQ0hJTkV9fHNlZCAtZSAncyxbLS9dLiokLCwnYC11bmtub3duLWdudWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLC8uKiQsLCdgCisJZXhpdCA7OworICAgICo6R05VLyo6KjoqKQorCSMgb3RoZXIgc3lzdGVtcyB3aXRoIEdOVSBsaWJjIGFuZCB1c2VybGFuZAorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWBlY2hvICR7VU5BTUVfU1lTVEVNfSB8IHNlZCAncyxeW14vXSovLCwnIHwgdHIgJ1tBLVpdJyAnW2Etel0nYGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AtZ251CisJZXhpdCA7OworICAgIGkqODY6TWluaXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1taW5peAorCWV4aXQgOzsKKyAgICBhcm0qOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgYXZyMzIqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgY3JpczpMaW51eDoqOiopCisJZWNobyBjcmlzLWF4aXMtbGludXgtZ251CisJZXhpdCA7OworICAgIGNyaXN2MzI6TGludXg6KjoqKQorCWVjaG8gY3Jpc3YzMi1heGlzLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBmcnY6TGludXg6KjoqKQorICAgIAllY2hvIGZydi11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBpYTY0OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgbTMycio6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBtNjgqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgbWlwczpMaW51eDoqOiopCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCisJI3VuZGVmIENQVQorCSN1bmRlZiBtaXBzCisJI3VuZGVmIG1pcHNlbAorCSNpZiBkZWZpbmVkKF9fTUlQU0VMX18pIHx8IGRlZmluZWQoX19NSVBTRUwpIHx8IGRlZmluZWQoX01JUFNFTCkgfHwgZGVmaW5lZChNSVBTRUwpCisJQ1BVPW1pcHNlbAorCSNlbHNlCisJI2lmIGRlZmluZWQoX19NSVBTRUJfXykgfHwgZGVmaW5lZChfX01JUFNFQikgfHwgZGVmaW5lZChfTUlQU0VCKSB8fCBkZWZpbmVkKE1JUFNFQikKKwlDUFU9bWlwcworCSNlbHNlCisJQ1BVPQorCSNlbmRpZgorCSNlbmRpZgorRU9GCisJZXZhbCAiYCRDQ19GT1JfQlVJTEQgLUUgJGR1bW15LmMgMj4vZGV2L251bGwgfCBzZWQgLW4gJworCSAgICAvXkNQVS97CisJCXM6IDo6ZworCQlwCisJICAgIH0nYCIKKwl0ZXN0IHgiJHtDUFV9IiAhPSB4ICYmIHsgZWNobyAiJHtDUFV9LXVua25vd24tbGludXgtZ251IjsgZXhpdDsgfQorCTs7CisgICAgbWlwczY0OkxpbnV4Oio6KikKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKKwkjdW5kZWYgQ1BVCisJI3VuZGVmIG1pcHM2NAorCSN1bmRlZiBtaXBzNjRlbAorCSNpZiBkZWZpbmVkKF9fTUlQU0VMX18pIHx8IGRlZmluZWQoX19NSVBTRUwpIHx8IGRlZmluZWQoX01JUFNFTCkgfHwgZGVmaW5lZChNSVBTRUwpCisJQ1BVPW1pcHM2NGVsCisJI2Vsc2UKKwkjaWYgZGVmaW5lZChfX01JUFNFQl9fKSB8fCBkZWZpbmVkKF9fTUlQU0VCKSB8fCBkZWZpbmVkKF9NSVBTRUIpIHx8IGRlZmluZWQoTUlQU0VCKQorCUNQVT1taXBzNjQKKwkjZWxzZQorCUNQVT0KKwkjZW5kaWYKKwkjZW5kaWYKK0VPRgorCWV2YWwgImAkQ0NfRk9SX0JVSUxEIC1FICRkdW1teS5jIDI+L2Rldi9udWxsIHwgc2VkIC1uICcKKwkgICAgL15DUFUveworCQlzOiA6OmcKKwkJcAorCSAgICB9J2AiCisJdGVzdCB4IiR7Q1BVfSIgIT0geCAmJiB7IGVjaG8gIiR7Q1BVfS11bmtub3duLWxpbnV4LWdudSI7IGV4aXQ7IH0KKwk7OworICAgIG9yMzI6TGludXg6KjoqKQorCWVjaG8gb3IzMi11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBwcGM6TGludXg6KjoqKQorCWVjaG8gcG93ZXJwYy11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBwcGM2NDpMaW51eDoqOiopCisJZWNobyBwb3dlcnBjNjQtdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgYWxwaGE6TGludXg6KjoqKQorCWNhc2UgYHNlZCAtbiAnL15jcHUgbW9kZWwvcy9eLio6IFwoLipcKS9cMS9wJyA8IC9wcm9jL2NwdWluZm9gIGluCisJICBFVjUpICAgVU5BTUVfTUFDSElORT1hbHBoYWV2NSA7OworCSAgRVY1NikgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjU2IDs7CisJICBQQ0E1NikgVU5BTUVfTUFDSElORT1hbHBoYXBjYTU2IDs7CisJICBQQ0E1NykgVU5BTUVfTUFDSElORT1hbHBoYXBjYTU2IDs7CisJICBFVjYpICAgVU5BTUVfTUFDSElORT1hbHBoYWV2NiA7OworCSAgRVY2NykgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjY3IDs7CisJICBFVjY4KikgVU5BTUVfTUFDSElORT1hbHBoYWV2NjggOzsKKyAgICAgICAgZXNhYworCW9iamR1bXAgLS1wcml2YXRlLWhlYWRlcnMgL2Jpbi9zaCB8IGdyZXAgbGQuc28uMSA+L2Rldi9udWxsCisJaWYgdGVzdCAiJD8iID0gMCA7IHRoZW4gTElCQz0ibGliYzEiIDsgZWxzZSBMSUJDPSIiIDsgZmkKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUke0xJQkN9CisJZXhpdCA7OworICAgIHBhcmlzYzpMaW51eDoqOiogfCBocHBhOkxpbnV4Oio6KikKKwkjIExvb2sgZm9yIENQVSBsZXZlbAorCWNhc2UgYGdyZXAgJ15jcHVbXmEtel0qOicgL3Byb2MvY3B1aW5mbyAyPi9kZXYvbnVsbCB8IGN1dCAtZCcgJyAtZjJgIGluCisJICBQQTcqKSBlY2hvIGhwcGExLjEtdW5rbm93bi1saW51eC1nbnUgOzsKKwkgIFBBOCopIGVjaG8gaHBwYTIuMC11bmtub3duLWxpbnV4LWdudSA7OworCSAgKikgICAgZWNobyBocHBhLXVua25vd24tbGludXgtZ251IDs7CisJZXNhYworCWV4aXQgOzsKKyAgICBwYXJpc2M2NDpMaW51eDoqOiogfCBocHBhNjQ6TGludXg6KjoqKQorCWVjaG8gaHBwYTY0LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIHMzOTA6TGludXg6KjoqIHwgczM5MHg6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1pYm0tbGludXgKKwlleGl0IDs7CisgICAgc2g2NCo6TGludXg6KjoqKQorICAgIAllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgc2gqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgc3BhcmM6TGludXg6KjoqIHwgc3BhcmM2NDpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIHZheDpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWRlYy1saW51eC1nbnUKKwlleGl0IDs7CisgICAgeDg2XzY0OkxpbnV4Oio6KikKKwllY2hvIHg4Nl82NC11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICB4dGVuc2EqOkxpbnV4Oio6KikKKyAgICAJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIGkqODY6TGludXg6KjoqKQorCSMgVGhlIEJGRCBsaW5rZXIga25vd3Mgd2hhdCB0aGUgZGVmYXVsdCBvYmplY3QgZmlsZSBmb3JtYXQgaXMsIHNvCisJIyBmaXJzdCBzZWUgaWYgaXQgd2lsbCB0ZWxsIHVzLiBjZCB0byB0aGUgcm9vdCBkaXJlY3RvcnkgdG8gcHJldmVudAorCSMgcHJvYmxlbXMgd2l0aCBvdGhlciBwcm9ncmFtcyBvciBkaXJlY3RvcmllcyBjYWxsZWQgYGxkJyBpbiB0aGUgcGF0aC4KKwkjIFNldCBMQ19BTEw9QyB0byBlbnN1cmUgbGQgb3V0cHV0cyBtZXNzYWdlcyBpbiBFbmdsaXNoLgorCWxkX3N1cHBvcnRlZF90YXJnZXRzPWBjZCAvOyBMQ19BTEw9QyBsZCAtLWhlbHAgMj4mMSBcCisJCQkgfCBzZWQgLW5lICcvc3VwcG9ydGVkIHRhcmdldHM6LyFkCisJCQkJICAgIHMvWyAJXVsgCV0qLyAvZworCQkJCSAgICBzLy4qc3VwcG9ydGVkIHRhcmdldHM6ICovLworCQkJCSAgICBzLyAuKi8vCisJCQkJICAgIHAnYAorICAgICAgICBjYXNlICIkbGRfc3VwcG9ydGVkX3RhcmdldHMiIGluCisJICBlbGYzMi1pMzg2KQorCQlURU5UQVRJVkU9IiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251IgorCQk7OworCSAgYS5vdXQtaTM4Ni1saW51eCkKKwkJZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnVhb3V0IgorCQlleGl0IDs7CisJICBjb2ZmLWkzODYpCisJCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251Y29mZiIKKwkJZXhpdCA7OworCSAgIiIpCisJCSMgRWl0aGVyIGEgcHJlLUJGRCBhLm91dCBsaW5rZXIgKGxpbnV4LWdudW9sZGxkKSBvcgorCQkjIG9uZSB0aGF0IGRvZXMgbm90IGdpdmUgdXMgdXNlZnVsIC0taGVscC4KKwkJZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnVvbGRsZCIKKwkJZXhpdCA7OworCWVzYWMKKwkjIERldGVybWluZSB3aGV0aGVyIHRoZSBkZWZhdWx0IGNvbXBpbGVyIGlzIGEub3V0IG9yIGVsZgorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYworCSNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCSNpZmRlZiBfX0VMRl9fCisJIyBpZmRlZiBfX0dMSUJDX18KKwkjICBpZiBfX0dMSUJDX18gPj0gMgorCUxJQkM9Z251CisJIyAgZWxzZQorCUxJQkM9Z251bGliYzEKKwkjICBlbmRpZgorCSMgZWxzZQorCUxJQkM9Z251bGliYzEKKwkjIGVuZGlmCisJI2Vsc2UKKwkjaWYgZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKSB8fCBkZWZpbmVkKF9fUEdJKSB8fCBkZWZpbmVkKF9fU1VOUFJPX0MpIHx8IGRlZmluZWQoX19TVU5QUk9fQ0MpCisJTElCQz1nbnUKKwkjZWxzZQorCUxJQkM9Z251YW91dAorCSNlbmRpZgorCSNlbmRpZgorCSNpZmRlZiBfX2RpZXRsaWJjX18KKwlMSUJDPWRpZXRsaWJjCisJI2VuZGlmCitFT0YKKwlldmFsICJgJENDX0ZPUl9CVUlMRCAtRSAkZHVtbXkuYyAyPi9kZXYvbnVsbCB8IHNlZCAtbiAnCisJICAgIC9eTElCQy97CisJCXM6IDo6ZworCQlwCisJICAgIH0nYCIKKwl0ZXN0IHgiJHtMSUJDfSIgIT0geCAmJiB7CisJCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtJHtMSUJDfSIKKwkJZXhpdAorCX0KKwl0ZXN0IHgiJHtURU5UQVRJVkV9IiAhPSB4ICYmIHsgZWNobyAiJHtURU5UQVRJVkV9IjsgZXhpdDsgfQorCTs7CisgICAgaSo4NjpEWU5JWC9wdHg6NCo6KikKKwkjIHB0eCA0LjAgZG9lcyB1bmFtZSAtcyBjb3JyZWN0bHksIHdpdGggRFlOSVgvcHR4IGluIHRoZXJlLgorCSMgZWFybGllciB2ZXJzaW9ucyBhcmUgbWVzc2VkIHVwIGFuZCBwdXQgdGhlIG5vZGVuYW1lIGluIGJvdGgKKwkjIHN5c25hbWUgYW5kIG5vZGVuYW1lLgorCWVjaG8gaTM4Ni1zZXF1ZW50LXN5c3Y0CisJZXhpdCA7OworICAgIGkqODY6VU5JWF9TVjo0LjJNUDoyLiopCisgICAgICAgICMgVW5peHdhcmUgaXMgYW4gb2Zmc2hvb3Qgb2YgU1ZSNCwgYnV0IGl0IGhhcyBpdHMgb3duIHZlcnNpb24KKyAgICAgICAgIyBudW1iZXIgc2VyaWVzIHN0YXJ0aW5nIHdpdGggMi4uLgorICAgICAgICAjIEkgYW0gbm90IHBvc2l0aXZlIHRoYXQgb3RoZXIgU1ZSNCBzeXN0ZW1zIHdvbid0IG1hdGNoIHRoaXMsCisJIyBJIGp1c3QgaGF2ZSB0byBob3BlLiAgLS0gcm1zLgorICAgICAgICAjIFVzZSBzeXN2NC4ydXcuLi4gc28gdGhhdCBzeXN2NCogbWF0Y2hlcyBpdC4KKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjQuMnV3JHtVTkFNRV9WRVJTSU9OfQorCWV4aXQgOzsKKyAgICBpKjg2Ok9TLzI6KjoqKQorCSMgSWYgd2Ugd2VyZSBhYmxlIHRvIGZpbmQgYHVuYW1lJywgdGhlbiBFTVggVW5peCBjb21wYXRpYmlsaXR5CisJIyBpcyBwcm9iYWJseSBpbnN0YWxsZWQuCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW9zMi1lbXgKKwlleGl0IDs7CisgICAgaSo4NjpYVFMtMzAwOio6U1RPUCkKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1zdG9wCisJZXhpdCA7OworICAgIGkqODY6YXRoZW9zOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1hdGhlb3MKKwlleGl0IDs7CisgICAgaSo4NjpzeWxsYWJsZToqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5bGxhYmxlCisJZXhpdCA7OworICAgIGkqODY6THlueE9TOjIuKjoqIHwgaSo4NjpMeW54T1M6My5bMDFdKjoqIHwgaSo4NjpMeW54T1M6NC4wKjoqKQorCWVjaG8gaTM4Ni11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgaSo4NjoqRE9TOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbXNkb3NkamdwcAorCWV4aXQgOzsKKyAgICBpKjg2Oio6NC4qOiogfCBpKjg2OlNZU1RFTV9WOjQuKjoqKQorCVVOQU1FX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkICdzL1wvTVAkLy8nYAorCWlmIGdyZXAgTm92ZWxsIC91c3IvaW5jbHVkZS9saW5rLmggPi9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgorCQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5pdmVsLXN5c3Yke1VOQU1FX1JFTH0KKwllbHNlCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2JHtVTkFNRV9SRUx9CisJZmkKKwlleGl0IDs7CisgICAgaSo4NjoqOjU6WzY3OF0qKQorICAgIAkjIFVuaXhXYXJlIDcueCwgT3BlblVOSVggYW5kIE9wZW5TZXJ2ZXIgNi4KKwljYXNlIGAvYmluL3VuYW1lIC1YIHwgZ3JlcCAiXk1hY2hpbmUiYCBpbgorCSAgICAqNDg2KikJICAgICBVTkFNRV9NQUNISU5FPWk0ODYgOzsKKwkgICAgKlBlbnRpdW0pCSAgICAgVU5BTUVfTUFDSElORT1pNTg2IDs7CisJICAgICpQZW50KnwqQ2VsZXJvbikgVU5BTUVfTUFDSElORT1pNjg2IDs7CisJZXNhYworCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9JHtVTkFNRV9TWVNURU19JHtVTkFNRV9WRVJTSU9OfQorCWV4aXQgOzsKKyAgICBpKjg2Oio6My4yOiopCisJaWYgdGVzdCAtZiAvdXNyL29wdGlvbnMvY2IubmFtZTsgdGhlbgorCQlVTkFNRV9SRUw9YHNlZCAtbiAncy8uKlZlcnNpb24gLy9wJyA8L3Vzci9vcHRpb25zL2NiLm5hbWVgCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1pc2MkVU5BTUVfUkVMCisJZWxpZiAvYmluL3VuYW1lIC1YIDI+L2Rldi9udWxsID4vZGV2L251bGwgOyB0aGVuCisJCVVOQU1FX1JFTD1gKC9iaW4vdW5hbWUgLVh8Z3JlcCBSZWxlYXNlfHNlZCAtZSAncy8uKj0gLy8nKWAKKwkJKC9iaW4vdW5hbWUgLVh8Z3JlcCBpODA0ODYgPi9kZXYvbnVsbCkgJiYgVU5BTUVfTUFDSElORT1pNDg2CisJCSgvYmluL3VuYW1lIC1YfGdyZXAgJ15NYWNoaW5lLipQZW50aXVtJyA+L2Rldi9udWxsKSBcCisJCQkmJiBVTkFNRV9NQUNISU5FPWk1ODYKKwkJKC9iaW4vdW5hbWUgLVh8Z3JlcCAnXk1hY2hpbmUuKlBlbnQgKklJJyA+L2Rldi9udWxsKSBcCisJCQkmJiBVTkFNRV9NQUNISU5FPWk2ODYKKwkJKC9iaW4vdW5hbWUgLVh8Z3JlcCAnXk1hY2hpbmUuKlBlbnRpdW0gUHJvJyA+L2Rldi9udWxsKSBcCisJCQkmJiBVTkFNRV9NQUNISU5FPWk2ODYKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXNjbyRVTkFNRV9SRUwKKwllbHNlCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2MzIKKwlmaQorCWV4aXQgOzsKKyAgICBwYzoqOio6KikKKwkjIExlZnQgaGVyZSBmb3IgY29tcGF0aWJpbGl0eToKKyAgICAgICAgIyB1bmFtZSAtbSBwcmludHMgZm9yIERKR1BQIGFsd2F5cyAncGMnLCBidXQgaXQgcHJpbnRzIG5vdGhpbmcgYWJvdXQKKyAgICAgICAgIyB0aGUgcHJvY2Vzc29yLCBzbyB3ZSBwbGF5IHNhZmUgYnkgYXNzdW1pbmcgaTM4Ni4KKwllY2hvIGkzODYtcGMtbXNkb3NkamdwcAorICAgICAgICBleGl0IDs7CisgICAgSW50ZWw6TWFjaDozKjoqKQorCWVjaG8gaTM4Ni1wYy1tYWNoMworCWV4aXQgOzsKKyAgICBwYXJhZ29uOio6KjoqKQorCWVjaG8gaTg2MC1pbnRlbC1vc2YxCisJZXhpdCA7OworICAgIGk4NjA6Kjo0Lio6KikgIyBpODYwLVNWUjQKKwlpZiBncmVwIFN0YXJkZW50IC91c3IvaW5jbHVkZS9zeXMvdWFkbWluLmggPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgorCSAgZWNobyBpODYwLXN0YXJkZW50LXN5c3Yke1VOQU1FX1JFTEVBU0V9ICMgU3RhcmRlbnQgVmlzdHJhIGk4NjAtU1ZSNAorCWVsc2UgIyBBZGQgb3RoZXIgaTg2MC1TVlI0IHZlbmRvcnMgYmVsb3cgYXMgdGhleSBhcmUgZGlzY292ZXJlZC4KKwkgIGVjaG8gaTg2MC11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9ICAjIFVua25vd24gaTg2MC1TVlI0CisJZmkKKwlleGl0IDs7CisgICAgbWluaSo6Q1RJWDpTWVMqNToqKQorCSMgIm1pbmlmcmFtZSIKKwllY2hvIG02ODAxMC1jb252ZXJnZW50LXN5c3YKKwlleGl0IDs7CisgICAgbWM2OGs6VU5JWDpTWVNURU01OjMuNTFtKQorCWVjaG8gbTY4ay1jb252ZXJnZW50LXN5c3YKKwlleGl0IDs7CisgICAgTTY4MD8wOkQtTklYOjUuMzoqKQorCWVjaG8gbTY4ay1kaWFiLWRuaXgKKwlleGl0IDs7CisgICAgTTY4KjoqOlIzVls1Njc4XSo6KikKKwl0ZXN0IC1yIC9zeXNWNjggJiYgeyBlY2hvICdtNjhrLW1vdG9yb2xhLXN5c3YnOyBleGl0OyB9IDs7CisgICAgM1szNDVdPz86Kjo0LjA6My4wIHwgM1szNF0/P0E6Kjo0LjA6My4wIHwgM1szNF0/PywqOio6NC4wOjMuMCB8IDNbMzRdPz8vKjoqOjQuMDozLjAgfCA0NDAwOio6NC4wOjMuMCB8IDQ4NTA6Kjo0LjA6My4wIHwgU0tBNDA6Kjo0LjA6My4wIHwgU0RTMjoqOjQuMDozLjAgfCBTSEcyOio6NC4wOjMuMCB8IFM3NTAxKjoqOjQuMDozLjApCisJT1NfUkVMPScnCisJdGVzdCAtciAvZXRjLy5yZWxpZCBcCisJJiYgT1NfUkVMPS5gc2VkIC1uICdzL1teIF0qIFteIF0qIFwoWzAtOV1bMC05XVwpLiovXDEvcCcgPCAvZXRjLy5yZWxpZGAKKwkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgZ3JlcCA4NiA+L2Rldi9udWxsIFwKKwkgICYmIHsgZWNobyBpNDg2LW5jci1zeXN2NC4zJHtPU19SRUx9OyBleGl0OyB9CisJL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IC9iaW4vZ3JlcCBlbnRpdW0gPi9kZXYvbnVsbCBcCisJICAmJiB7IGVjaG8gaTU4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfSA7OworICAgIDNbMzRdPz86Kjo0LjA6KiB8IDNbMzRdPz8sKjoqOjQuMDoqKQorICAgICAgICAvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgZ3JlcCA4NiA+L2Rldi9udWxsIFwKKyAgICAgICAgICAmJiB7IGVjaG8gaTQ4Ni1uY3Itc3lzdjQ7IGV4aXQ7IH0gOzsKKyAgICBtNjgqOkx5bnhPUzoyLio6KiB8IG02OCo6THlueE9TOjMuMCo6KikKKwllY2hvIG02OGstdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIG1jNjgwMzA6VU5JWF9TeXN0ZW1fVjo0Lio6KikKKwllY2hvIG02OGstYXRhcmktc3lzdjQKKwlleGl0IDs7CisgICAgVFNVTkFNSTpMeW54T1M6Mi4qOiopCisJZWNobyBzcGFyYy11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgcnM2MDAwOkx5bnhPUzoyLio6KikKKwllY2hvIHJzNjAwMC11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgUG93ZXJQQzpMeW54T1M6Mi4qOiogfCBQb3dlclBDOkx5bnhPUzozLlswMV0qOiogfCBQb3dlclBDOkx5bnhPUzo0LjAqOiopCisJZWNobyBwb3dlcnBjLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBTTVtCRV1TOlVOSVhfU1Y6KjoqKQorCWVjaG8gbWlwcy1kZGUtc3lzdiR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgUk0qOlJlbGlhbnRVTklYLSo6KjoqKQorCWVjaG8gbWlwcy1zbmktc3lzdjQKKwlleGl0IDs7CisgICAgUk0qOlNJTklYLSo6KjoqKQorCWVjaG8gbWlwcy1zbmktc3lzdjQKKwlleGl0IDs7CisgICAgKjpTSU5JWC0qOio6KikKKwlpZiB1bmFtZSAtcCAyPi9kZXYvbnVsbCA+L2Rldi9udWxsIDsgdGhlbgorCQlVTkFNRV9NQUNISU5FPWAodW5hbWUgLXApIDI+L2Rldi9udWxsYAorCQllY2hvICR7VU5BTUVfTUFDSElORX0tc25pLXN5c3Y0CisJZWxzZQorCQllY2hvIG5zMzJrLXNuaS1zeXN2CisJZmkKKwlleGl0IDs7CisgICAgUEVOVElVTToqOjQuMCo6KikgIyBVbmlzeXMgYENsZWFyUGF0aCBITVAgSVggNDAwMCcgU1ZSNC9NUCBlZmZvcnQKKyAgICAgICAgICAgICAgICAgICAgICAjIHNheXMgPFJpY2hhcmQuTS5CYXJ0ZWxAY2NNYWlsLkNlbnN1cy5HT1Y+CisgICAgICAgIGVjaG8gaTU4Ni11bmlzeXMtc3lzdjQKKyAgICAgICAgZXhpdCA7OworICAgICo6VU5JWF9TeXN0ZW1fVjo0KjpGVFgqKQorCSMgRnJvbSBHZXJhbGQgSGV3ZXMgPGhld2VzQG9wZW5tYXJrZXQuY29tPi4KKwkjIEhvdyBhYm91dCBkaWZmZXJlbnRpYXRpbmcgYmV0d2VlbiBzdHJhdHVzIGFyY2hpdGVjdHVyZXM/IC1kam0KKwllY2hvIGhwcGExLjEtc3RyYXR1cy1zeXN2NAorCWV4aXQgOzsKKyAgICAqOio6KjpGVFgqKQorCSMgRnJvbSBzZWFuZkBzd2RjLnN0cmF0dXMuY29tLgorCWVjaG8gaTg2MC1zdHJhdHVzLXN5c3Y0CisJZXhpdCA7OworICAgIGkqODY6Vk9TOio6KikKKwkjIEZyb20gUGF1bC5HcmVlbkBzdHJhdHVzLmNvbS4KKwllY2hvICR7VU5BTUVfTUFDSElORX0tc3RyYXR1cy12b3MKKwlleGl0IDs7CisgICAgKjpWT1M6KjoqKQorCSMgRnJvbSBQYXVsLkdyZWVuQHN0cmF0dXMuY29tLgorCWVjaG8gaHBwYTEuMS1zdHJhdHVzLXZvcworCWV4aXQgOzsKKyAgICBtYzY4KjpBL1VYOio6KikKKwllY2hvIG02OGstYXBwbGUtYXV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBuZXdzKjpORVdTLU9TOjYqOiopCisJZWNobyBtaXBzLXNvbnktbmV3c29zNgorCWV4aXQgOzsKKyAgICBSWzM0XTAwMDoqU3lzdGVtX1YqOio6KiB8IFI0MDAwOlVOSVhfU1lTVjoqOiogfCBSKjAwMDpVTklYX1NWOio6KikKKwlpZiBbIC1kIC91c3IvbmVjIF07IHRoZW4KKwkgICAgICAgIGVjaG8gbWlwcy1uZWMtc3lzdiR7VU5BTUVfUkVMRUFTRX0KKwllbHNlCisJICAgICAgICBlY2hvIG1pcHMtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfQorCWZpCisgICAgICAgIGV4aXQgOzsKKyAgICBCZUJveDpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gaGFyZHdhcmUgbWFkZSBieSBCZSwgUFBDIG9ubHkuCisJZWNobyBwb3dlcnBjLWJlLWJlb3MKKwlleGl0IDs7CisgICAgQmVNYWM6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIE1hYyBvciBNYWMgY2xvbmUsIFBQQyBvbmx5LgorCWVjaG8gcG93ZXJwYy1hcHBsZS1iZW9zCisJZXhpdCA7OworICAgIEJlUEM6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIEludGVsIFBDIGNvbXBhdGlibGUuCisJZWNobyBpNTg2LXBjLWJlb3MKKwlleGl0IDs7CisgICAgU1gtNDpTVVBFUi1VWDoqOiopCisJZWNobyBzeDQtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFNYLTU6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g1LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBTWC02OlNVUEVSLVVYOio6KikKKwllY2hvIHN4Ni1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgU1gtNzpTVVBFUi1VWDoqOiopCisJZWNobyBzeDctbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFNYLTg6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g4LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBTWC04UjpTVVBFUi1VWDoqOiopCisJZWNobyBzeDhyLW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBQb3dlcio6UmhhcHNvZHk6KjoqKQorCWVjaG8gcG93ZXJwYy1hcHBsZS1yaGFwc29keSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpSaGFwc29keToqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWFwcGxlLXJoYXBzb2R5JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOkRhcndpbjoqOiopCisJVU5BTUVfUFJPQ0VTU09SPWB1bmFtZSAtcGAgfHwgVU5BTUVfUFJPQ0VTU09SPXVua25vd24KKwljYXNlICRVTkFNRV9QUk9DRVNTT1IgaW4KKwkgICAgdW5rbm93bikgVU5BTUVfUFJPQ0VTU09SPXBvd2VycGMgOzsKKwllc2FjCisJZWNobyAke1VOQU1FX1BST0NFU1NPUn0tYXBwbGUtZGFyd2luJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOnByb2NudG8qOio6KiB8ICo6UU5YOlswMTIzNDU2Nzg5XSo6KikKKwlVTkFNRV9QUk9DRVNTT1I9YHVuYW1lIC1wYAorCWlmIHRlc3QgIiRVTkFNRV9QUk9DRVNTT1IiID0gIng4NiI7IHRoZW4KKwkJVU5BTUVfUFJPQ0VTU09SPWkzODYKKwkJVU5BTUVfTUFDSElORT1wYworCWZpCisJZWNobyAke1VOQU1FX1BST0NFU1NPUn0tJHtVTkFNRV9NQUNISU5FfS1udG8tcW54JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOlFOWDoqOjQqKQorCWVjaG8gaTM4Ni1wYy1xbngKKwlleGl0IDs7CisgICAgTlNFLT86Tk9OU1RPUF9LRVJORUw6KjoqKQorCWVjaG8gbnNlLXRhbmRlbS1uc2ske1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIE5TUi0/Ok5PTlNUT1BfS0VSTkVMOio6KikKKwllY2hvIG5zci10YW5kZW0tbnNrJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOk5vblN0b3AtVVg6KjoqKQorCWVjaG8gbWlwcy1jb21wYXEtbm9uc3RvcHV4CisJZXhpdCA7OworICAgIEJTMjAwMDpQT1NJWCo6KjoqKQorCWVjaG8gYnMyMDAwLXNpZW1lbnMtc3lzdgorCWV4aXQgOzsKKyAgICBEUy8qOlVOSVhfU3lzdGVtX1Y6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS0ke1VOQU1FX1NZU1RFTX0tJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOlBsYW45Oio6KikKKwkjICJ1bmFtZSAtbSIgaXMgbm90IGNvbnNpc3RlbnQsIHNvIHVzZSAkY3B1dHlwZSBpbnN0ZWFkLiAzODYKKwkjIGlzIGNvbnZlcnRlZCB0byBpMzg2IGZvciBjb25zaXN0ZW5jeSB3aXRoIG90aGVyIHg4NgorCSMgb3BlcmF0aW5nIHN5c3RlbXMuCisJaWYgdGVzdCAiJGNwdXR5cGUiID0gIjM4NiI7IHRoZW4KKwkgICAgVU5BTUVfTUFDSElORT1pMzg2CisJZWxzZQorCSAgICBVTkFNRV9NQUNISU5FPSIkY3B1dHlwZSIKKwlmaQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXBsYW45CisJZXhpdCA7OworICAgICo6VE9QUy0xMDoqOiopCisJZWNobyBwZHAxMC11bmtub3duLXRvcHMxMAorCWV4aXQgOzsKKyAgICAqOlRFTkVYOio6KikKKwllY2hvIHBkcDEwLXVua25vd24tdGVuZXgKKwlleGl0IDs7CisgICAgS1MxMDpUT1BTLTIwOio6KiB8IEtMMTA6VE9QUy0yMDoqOiogfCBUWVBFNDpUT1BTLTIwOio6KikKKwllY2hvIHBkcDEwLWRlYy10b3BzMjAKKwlleGl0IDs7CisgICAgWEtMLTE6VE9QUy0yMDoqOiogfCBUWVBFNTpUT1BTLTIwOio6KikKKwllY2hvIHBkcDEwLXhrbC10b3BzMjAKKwlleGl0IDs7CisgICAgKjpUT1BTLTIwOio6KikKKwllY2hvIHBkcDEwLXVua25vd24tdG9wczIwCisJZXhpdCA7OworICAgICo6SVRTOio6KikKKwllY2hvIHBkcDEwLXVua25vd24taXRzCisJZXhpdCA7OworICAgIFNFSToqOio6U0VJVVgpCisgICAgICAgIGVjaG8gbWlwcy1zZWktc2VpdXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6RHJhZ29uRmx5Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1kcmFnb25mbHlgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgCisJZXhpdCA7OworICAgICo6KlZNUzoqOiopCisgICAgCVVOQU1FX01BQ0hJTkU9YCh1bmFtZSAtcCkgMj4vZGV2L251bGxgCisJY2FzZSAiJHtVTkFNRV9NQUNISU5FfSIgaW4KKwkgICAgQSopIGVjaG8gYWxwaGEtZGVjLXZtcyA7IGV4aXQgOzsKKwkgICAgSSopIGVjaG8gaWE2NC1kZWMtdm1zIDsgZXhpdCA7OworCSAgICBWKikgZWNobyB2YXgtZGVjLXZtcyA7IGV4aXQgOzsKKwllc2FjIDs7CisgICAgKjpYRU5JWDoqOlN5c1YpCisJZWNobyBpMzg2LXBjLXhlbml4CisJZXhpdCA7OworICAgIGkqODY6c2t5b3M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1za3lvc2BlY2hvICR7VU5BTUVfUkVMRUFTRX1gIHwgc2VkIC1lICdzLyAuKiQvLycKKwlleGl0IDs7CisgICAgaSo4NjpyZG9zOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtcmRvcworCWV4aXQgOzsKK2VzYWMKKworI2VjaG8gJyhObyB1bmFtZSBjb21tYW5kIG9yIHVuYW1lIG91dHB1dCBub3QgcmVjb2duaXplZC4pJyAxPiYyCisjZWNobyAiJHtVTkFNRV9NQUNISU5FfToke1VOQU1FX1NZU1RFTX06JHtVTkFNRV9SRUxFQVNFfToke1VOQU1FX1ZFUlNJT059IiAxPiYyCisKK2V2YWwgJHNldF9jY19mb3JfYnVpbGQKK2NhdCA+JGR1bW15LmMgPDxFT0YKKyNpZmRlZiBfU0VRVUVOVF8KKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjIGluY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisjZW5kaWYKK21haW4gKCkKK3sKKyNpZiBkZWZpbmVkIChzb255KQorI2lmIGRlZmluZWQgKE1JUFNFQikKKyAgLyogQkZEIHdhbnRzICJic2QiIGluc3RlYWQgb2YgIm5ld3NvcyIuICBQZXJoYXBzIEJGRCBzaG91bGQgYmUgY2hhbmdlZCwKKyAgICAgSSBkb24ndCBrbm93Li4uLiAgKi8KKyAgcHJpbnRmICgibWlwcy1zb255LWJzZFxuIik7IGV4aXQgKDApOworI2Vsc2UKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyAgcHJpbnRmICgibTY4ay1zb255LW5ld3NvcyVzXG4iLAorI2lmZGVmIE5FV1NPUzQKKyAgICAgICAgICAiNCIKKyNlbHNlCisJICAiIgorI2VuZGlmCisgICAgICAgICApOyBleGl0ICgwKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX2FybSkgJiYgZGVmaW5lZCAoX19hY29ybikgJiYgZGVmaW5lZCAoX191bml4KQorICBwcmludGYgKCJhcm0tYWNvcm4tcmlzY2l4XG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKGhwMzAwKSAmJiAhZGVmaW5lZCAoaHB1eCkKKyAgcHJpbnRmICgibTY4ay1ocC1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoTmVYVCkKKyNpZiAhZGVmaW5lZCAoX19BUkNISVRFQ1RVUkVfXykKKyNkZWZpbmUgX19BUkNISVRFQ1RVUkVfXyAibTY4ayIKKyNlbmRpZgorICBpbnQgdmVyc2lvbjsKKyAgdmVyc2lvbj1gKGhvc3RpbmZvIHwgc2VkIC1uICdzLy4qTmVYVCBNYWNoIFwoWzAtOV0qXCkuKi9cMS9wJykgMj4vZGV2L251bGxgOworICBpZiAodmVyc2lvbiA8IDQpCisgICAgcHJpbnRmICgiJXMtbmV4dC1uZXh0c3RlcCVkXG4iLCBfX0FSQ0hJVEVDVFVSRV9fLCB2ZXJzaW9uKTsKKyAgZWxzZQorICAgIHByaW50ZiAoIiVzLW5leHQtb3BlbnN0ZXAlZFxuIiwgX19BUkNISVRFQ1RVUkVfXywgdmVyc2lvbik7CisgIGV4aXQgKDApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChNVUxUSU1BWCkgfHwgZGVmaW5lZCAobjE2KQorI2lmIGRlZmluZWQgKFVNQVhWKQorICBwcmludGYgKCJuczMyay1lbmNvcmUtc3lzdlxuIik7IGV4aXQgKDApOworI2Vsc2UKKyNpZiBkZWZpbmVkIChDTVUpCisgIHByaW50ZiAoIm5zMzJrLWVuY29yZS1tYWNoXG4iKTsgZXhpdCAoMCk7CisjZWxzZQorICBwcmludGYgKCJuczMyay1lbmNvcmUtYnNkXG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfXzM4NkJTRF9fKQorICBwcmludGYgKCJpMzg2LXBjLWJzZFxuIik7IGV4aXQgKDApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChzZXF1ZW50KQorI2lmIGRlZmluZWQgKGkzODYpCisgIHByaW50ZiAoImkzODYtc2VxdWVudC1keW5peFxuIik7IGV4aXQgKDApOworI2VuZGlmCisjaWYgZGVmaW5lZCAobnMzMjAwMCkKKyAgcHJpbnRmICgibnMzMmstc2VxdWVudC1keW5peFxuIik7IGV4aXQgKDApOworI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TRVFVRU5UXykKKyAgICBzdHJ1Y3QgdXRzbmFtZSB1bjsKKworICAgIHVuYW1lKCZ1bik7CisKKyAgICBpZiAoc3RybmNtcCh1bi52ZXJzaW9uLCAiVjIiLCAyKSA9PSAwKSB7CisJcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eDJcbiIpOyBleGl0ICgwKTsKKyAgICB9CisgICAgaWYgKHN0cm5jbXAodW4udmVyc2lvbiwgIlYxIiwgMikgPT0gMCkgeyAvKiBYWFggaXMgVjEgY29ycmVjdD8gKi8KKwlwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4MVxuIik7IGV4aXQgKDApOworICAgIH0KKyAgICBwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4XG4iKTsgZXhpdCAoMCk7CisKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAodmF4KQorIyBpZiAhZGVmaW5lZCAodWx0cml4KQorIyAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjICBpZiBkZWZpbmVkIChCU0QpCisjICAgaWYgQlNEID09IDQzCisgICAgICBwcmludGYgKCJ2YXgtZGVjLWJzZDQuM1xuIik7IGV4aXQgKDApOworIyAgIGVsc2UKKyMgICAgaWYgQlNEID09IDE5OTAwNgorICAgICAgcHJpbnRmICgidmF4LWRlYy1ic2Q0LjNyZW5vXG4iKTsgZXhpdCAoMCk7CisjICAgIGVsc2UKKyAgICAgIHByaW50ZiAoInZheC1kZWMtYnNkXG4iKTsgZXhpdCAoMCk7CisjICAgIGVuZGlmCisjICAgZW5kaWYKKyMgIGVsc2UKKyAgICBwcmludGYgKCJ2YXgtZGVjLWJzZFxuIik7IGV4aXQgKDApOworIyAgZW5kaWYKKyMgZWxzZQorICAgIHByaW50ZiAoInZheC1kZWMtdWx0cml4XG4iKTsgZXhpdCAoMCk7CisjIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKGFsbGlhbnQpICYmIGRlZmluZWQgKGk4NjApCisgIHByaW50ZiAoImk4NjAtYWxsaWFudC1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorCisgIGV4aXQgKDEpOworfQorRU9GCisKKyRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jIDI+L2Rldi9udWxsICYmIFNZU1RFTV9OQU1FPWAkZHVtbXlgICYmCisJeyBlY2hvICIkU1lTVEVNX05BTUUiOyBleGl0OyB9CisKKyMgQXBvbGxvcyBwdXQgdGhlIHN5c3RlbSB0eXBlIGluIHRoZSBlbnZpcm9ubWVudC4KKwordGVzdCAtZCAvdXNyL2Fwb2xsbyAmJiB7IGVjaG8gJHtJU1B9LWFwb2xsby0ke1NZU1RZUEV9OyBleGl0OyB9CisKKyMgQ29udmV4IHZlcnNpb25zIHRoYXQgcHJlZGF0ZSB1bmFtZSBjYW4gdXNlIGdldHN5c2luZm8oMSkKKworaWYgWyAteCAvdXNyL2NvbnZleC9nZXRzeXNpbmZvIF0KK3RoZW4KKyAgICBjYXNlIGBnZXRzeXNpbmZvIC1mIGNwdV90eXBlYCBpbgorICAgIGMxKikKKwllY2hvIGMxLWNvbnZleC1ic2QKKwlleGl0IDs7CisgICAgYzIqKQorCWlmIGdldHN5c2luZm8gLWYgc2NhbGFyX2FjYworCXRoZW4gZWNobyBjMzItY29udmV4LWJzZAorCWVsc2UgZWNobyBjMi1jb252ZXgtYnNkCisJZmkKKwlleGl0IDs7CisgICAgYzM0KikKKwllY2hvIGMzNC1jb252ZXgtYnNkCisJZXhpdCA7OworICAgIGMzOCopCisJZWNobyBjMzgtY29udmV4LWJzZAorCWV4aXQgOzsKKyAgICBjNCopCisJZWNobyBjNC1jb252ZXgtYnNkCisJZXhpdCA7OworICAgIGVzYWMKK2ZpCisKK2NhdCA+JjIgPDxFT0YKKyQwOiB1bmFibGUgdG8gZ3Vlc3Mgc3lzdGVtIHR5cGUKKworVGhpcyBzY3JpcHQsIGxhc3QgbW9kaWZpZWQgJHRpbWVzdGFtcCwgaGFzIGZhaWxlZCB0byByZWNvZ25pemUKK3RoZSBvcGVyYXRpbmcgc3lzdGVtIHlvdSBhcmUgdXNpbmcuIEl0IGlzIGFkdmlzZWQgdGhhdCB5b3UKK2Rvd25sb2FkIHRoZSBtb3N0IHVwIHRvIGRhdGUgdmVyc2lvbiBvZiB0aGUgY29uZmlnIHNjcmlwdHMgZnJvbQorCisgIGh0dHA6Ly9zYXZhbm5haC5nbnUub3JnL2NnaS1iaW4vdmlld2N2cy8qY2hlY2tvdXQqL2NvbmZpZy9jb25maWcvY29uZmlnLmd1ZXNzCithbmQKKyAgaHR0cDovL3NhdmFubmFoLmdudS5vcmcvY2dpLWJpbi92aWV3Y3ZzLypjaGVja291dCovY29uZmlnL2NvbmZpZy9jb25maWcuc3ViCisKK0lmIHRoZSB2ZXJzaW9uIHlvdSBydW4gKCQwKSBpcyBhbHJlYWR5IHVwIHRvIGRhdGUsIHBsZWFzZQorc2VuZCB0aGUgZm9sbG93aW5nIGRhdGEgYW5kIGFueSBpbmZvcm1hdGlvbiB5b3UgdGhpbmsgbWlnaHQgYmUKK3BlcnRpbmVudCB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4gaW4gb3JkZXIgdG8gcHJvdmlkZSB0aGUgbmVlZGVkCitpbmZvcm1hdGlvbiB0byBoYW5kbGUgeW91ciBzeXN0ZW0uCisKK2NvbmZpZy5ndWVzcyB0aW1lc3RhbXAgPSAkdGltZXN0YW1wCisKK3VuYW1lIC1tID0gYCh1bmFtZSAtbSkgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXIgPSBgKHVuYW1lIC1yKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtcyA9IGAodW5hbWUgLXMpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC12ID0gYCh1bmFtZSAtdikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAorCisvdXNyL2Jpbi91bmFtZSAtcCA9IGAoL3Vzci9iaW4vdW5hbWUgLXApIDI+L2Rldi9udWxsYAorL2Jpbi91bmFtZSAtWCAgICAgPSBgKC9iaW4vdW5hbWUgLVgpIDI+L2Rldi9udWxsYAorCitob3N0aW5mbyAgICAgICAgICAgICAgID0gYChob3N0aW5mbykgMj4vZGV2L251bGxgCisvYmluL3VuaXZlcnNlICAgICAgICAgID0gYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbGAKKy91c3IvYmluL2FyY2ggLWsgICAgICAgPSBgKC91c3IvYmluL2FyY2ggLWspIDI+L2Rldi9udWxsYAorL2Jpbi9hcmNoICAgICAgICAgICAgICA9IGAoL2Jpbi9hcmNoKSAyPi9kZXYvbnVsbGAKKy91c3IvYmluL29zbGV2ZWwgICAgICAgPSBgKC91c3IvYmluL29zbGV2ZWwpIDI+L2Rldi9udWxsYAorL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyA9IGAoL3Vzci9jb252ZXgvZ2V0c3lzaW5mbykgMj4vZGV2L251bGxgCisKK1VOQU1FX01BQ0hJTkUgPSAke1VOQU1FX01BQ0hJTkV9CitVTkFNRV9SRUxFQVNFID0gJHtVTkFNRV9SRUxFQVNFfQorVU5BTUVfU1lTVEVNICA9ICR7VU5BTUVfU1lTVEVNfQorVU5BTUVfVkVSU0lPTiA9ICR7VU5BTUVfVkVSU0lPTn0KK0VPRgorCitleGl0IDEKKworIyBMb2NhbCB2YXJpYWJsZXM6CisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInRpbWVzdGFtcD0nIgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQiCisjIHRpbWUtc3RhbXAtZW5kOiAiJyIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L2NvbmZpZy5oLmluIGIvbGliZ2NyeXB0LTEuNC42L2NvbmZpZy5oLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YzFjODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvY29uZmlnLmguaW4KQEAgLTAsMCArMSw0MjggQEAKKy8qIGNvbmZpZy5oLmluLiAgR2VuZXJhdGVkIGZyb20gY29uZmlndXJlLmFjIGJ5IGF1dG9oZWFkZXIuICAqLworCisKKyNpZm5kZWYgX0dDUllQVF9DT05GSUdfSF9JTkNMVURFRAorI2RlZmluZSBfR0NSWVBUX0NPTkZJR19IX0lOQ0xVREVECisvKiBuZWVkIHRoaXMsIGJlY2F1c2Ugc29tZSBhdXRvY29uZiB0ZXN0cyByZWx5IG9uIHRoaXMgKGUuZy4gc3RwY3B5KQorICogYW5kIGl0IHNob3VsZCBiZSB1c2VkIGZvciBuZXcgcHJvZ3JhbXMgICovCisjZGVmaW5lIF9HTlVfU09VUkNFICAxCisKKworLyogRGVmaW5lIGlmIGJ1aWxkaW5nIHVuaXZlcnNhbCAoaW50ZXJuYWwgaGVscGVyIG1hY3JvKSAqLworI3VuZGVmIEFDX0FQUExFX1VOSVZFUlNBTF9CVUlMRAorCisvKiBTdWJ2ZXJzaW9uIHJldmlzaW9uIHVzZWQgdG8gYnVpbGQgdGhpcyBwYWNrYWdlICovCisjdW5kZWYgQlVJTERfUkVWSVNJT04KKworLyogY29uZmlndXJlIGRpZCBub3QgdGVzdCBmb3IgZW5kaWFuZXNzICovCisjdW5kZWYgRElTQUJMRURfRU5ESUFOX0NIRUNLCisKKy8qIERlZmluZSBpZiB5b3UgZG9uJ3Qgd2FudCB0aGUgZGVmYXVsdCBFR0Qgc29ja2V0IG5hbWUuIEZvciBkZXRhaWxzIHNlZQorICAgY2lwaGVyL3JuZGVnZC5jICovCisjdW5kZWYgRUdEX1NPQ0tFVF9OQU1FCisKKy8qIERlZmluZSB0byBzdXBwb3J0IGFuIEhNQUMgYmFzZWQgaW50ZWdyaXR5IGNoZWNrICovCisjdW5kZWYgRU5BQkxFX0hNQUNfQklOQVJZX0NIRUNLCisKKy8qIEVuYWJsZSBzdXBwb3J0IGZvciB0aGUgUGFkTG9jayBlbmdpbmUuICovCisjdW5kZWYgRU5BQkxFX1BBRExPQ0tfU1VQUE9SVAorCisvKiBEZWZpbmUgdG8gdXNlIHRoZSBHTlUgQyB2aXNpYmlsaXR5IGF0dHJpYnV0ZS4gKi8KKyN1bmRlZiBHQ1JZX1VTRV9WSVNJQklMSVRZCisKKy8qIFRoZSBkZWZhdWx0IGVycm9yIHNvdXJjZSBmb3IgbGliZ2NyeXB0LiAqLworI3VuZGVmIEdQR19FUlJfU09VUkNFX0RFRkFVTFQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBhdGV4aXQnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfQVRFWElUCisKKy8qIERlZmluZWQgaWYgdGhlIG1sb2NrKCkgY2FsbCBkb2VzIG5vdCB3b3JrICovCisjdW5kZWYgSEFWRV9CUk9LRU5fTUxPQ0sKKworLyogRGVmaW5lZCBpZiBhIGBieXRlJyBpcyB0eXBlZGVmJ2QgKi8KKyN1bmRlZiBIQVZFX0JZVEVfVFlQRURFRgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGNsb2NrX2dldHRpbWUnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfQ0xPQ0tfR0VUVElNRQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgZGVjbGFyYXRpb24gb2YgYHN5c19zaWdsaXN0JywgYW5kIHRvIDAgaWYgeW91CisgICBkb24ndC4gKi8KKyN1bmRlZiBIQVZFX0RFQ0xfU1lTX1NJR0xJU1QKKworLyogZGVmaW5lZCBpZiB0aGUgc3lzdGVtIHN1cHBvcnRzIGEgcmFuZG9tIGRldmljZSAqLworI3VuZGVmIEhBVkVfREVWX1JBTkRPTQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGRsZmNuLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfRExGQ05fSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgZG9uJ3QgaGF2ZSBgdnByaW50ZicgYnV0IGRvIGhhdmUgYF9kb3BybnQuJyAqLworI3VuZGVmIEhBVkVfRE9QUk5UCisKKy8qIGRlZmluZWQgaWYgd2UgcnVuIG9uIHNvbWUgb2YgdGhlIFBDRE9TIGxpa2Ugc3lzdGVtcyAoRE9TLCBXaW5kb3plLiBPUy8yKQorICAgd2l0aCBzcGVjaWFsIHByb3BlcnRpZXMgbGlrZSBubyBmaWxlIG1vZGVzICovCisjdW5kZWYgSEFWRV9ET1NJU0hfU1lTVEVNCisKKy8qIGRlZmluZWQgaWYgd2UgbXVzdCBydW4gb24gYSBzdHVwaWQgZmlsZSBzeXN0ZW0gKi8KKyN1bmRlZiBIQVZFX0RSSVZFX0xFVFRFUlMKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmY250bCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9GQ05UTAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZ0cnVuY2F0ZScgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9GVFJVTkNBVEUKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRocnRpbWUnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfR0VUSFJUSU1FCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0cGFnZXNpemUnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRydXNhZ2UnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfR0VUUlVTQUdFCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0dGltZW9mZGF5JyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0dFVFRJTUVPRkRBWQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGludHR5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfSU5UVFlQRVNfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHJ0JyBsaWJyYXJ5ICgtbHJ0KS4gKi8KKyN1bmRlZiBIQVZFX0xJQlJUCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbWVtbW92ZScgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9NRU1NT1ZFCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bWVtb3J5Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfTUVNT1JZX0gKKworLyogRGVmaW5lZCBpZiB0aGUgc3lzdGVtIHN1cHBvcnRzIGFuIG1sb2NrKCkgY2FsbCAqLworI3VuZGVmIEhBVkVfTUxPQ0sKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBtbWFwJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX01NQVAKKworLyogRGVmaW5lZCBpZiB0aGUgR05VIFB0aCBpcyBhdmFpbGFibGUgKi8KKyN1bmRlZiBIQVZFX1BUSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHJhaXNlJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1JBSVNFCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcmFuZCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9SQU5ECisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkaW50Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1RESU5UX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TVERMSUJfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cGNweScgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TVFBDUFkKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJjYXNlY21wJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NUUkNBU0VDTVAKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJlcnJvcicgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TVFJFUlJPUgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmljbXAnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU1RSSUNNUAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TVFJJTkdTX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TVFJJTkdfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cnRvdWwnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU1RSVE9VTAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN5c2NvbmYnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU1lTQ09ORgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN5c2xvZycgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TWVNMT0cKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvY2FwYWJpbGl0eS5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19DQVBBQklMSVRZX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvbW1hbi5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19NTUFOX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc2VsZWN0Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1NFTEVDVF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3NvY2tldC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19TT0NLRVRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zdGF0Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1NUQVRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19UWVBFU19ICisKKy8qIERlZmluZWQgaWYgYSBgdTE2JyBpcyB0eXBlZGVmJ2QgKi8KKyN1bmRlZiBIQVZFX1UxNl9UWVBFREVGCisKKy8qIERlZmluZWQgaWYgYSBgdTMyJyBpcyB0eXBlZGVmJ2QgKi8KKyN1bmRlZiBIQVZFX1UzMl9UWVBFREVGCisKKy8qIERlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGB1aW50cHRyX3QnLiAqLworI3VuZGVmIEhBVkVfVUlOVFBUUl9UCisKKy8qIERlZmluZWQgaWYgYSBgdWxvbmcnIGlzIHR5cGVkZWYnZCAqLworI3VuZGVmIEhBVkVfVUxPTkdfVFlQRURFRgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1VOSVNURF9ICisKKy8qIERlZmluZWQgaWYgYSBgdXNob3J0JyBpcyB0eXBlZGVmJ2QgKi8KKyN1bmRlZiBIQVZFX1VTSE9SVF9UWVBFREVGCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdnByaW50ZicgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9WUFJJTlRGCisKKy8qIERlZmluZWQgaWYgd2UgcnVuIG9uIGEgVzMyIEFQSSBiYXNlZCBzeXN0ZW0gKi8KKyN1bmRlZiBIQVZFX1czMl9TWVNURU0KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB3YWl0NCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9XQUlUNAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHdhaXRwaWQnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfV0FJVFBJRAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHdpbnNvY2syLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfV0lOU09DSzJfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHdzMnRjcGlwLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfV1MyVENQSVBfSAorCisvKiBEZWZpbmVkIGlmIHRoaXMgaXMgbm90IGEgcmVndWxhciByZWxlYXNlICovCisjdW5kZWYgSVNfREVWRUxPUE1FTlRfVkVSU0lPTgorCisvKiBMaXN0IG9mIGF2YWlsYWJsZSBjaXBoZXIgYWxnb3JpdGhtcyAqLworI3VuZGVmIExJQkdDUllQVF9DSVBIRVJTCisKKy8qIExpc3Qgb2YgYXZhaWxhYmxlIGRpZ2VzdCBhbGdvcml0aG1zICovCisjdW5kZWYgTElCR0NSWVBUX0RJR0VTVFMKKworLyogTGlzdCBvZiBhdmFpbGFibGUgcHVibGljIGtleSBjaXBoZXIgYWxnb3JpdGhtcyAqLworI3VuZGVmIExJQkdDUllQVF9QVUJLRVlfQ0lQSEVSUworCisvKiBEZWZpbmUgdG8gdXNlIHRoZSAob2Jzb2xldGUpIG1hbGxvYyBndWFyZGluZyBmZWF0dXJlICovCisjdW5kZWYgTV9HVUFSRAorCisvKiBkZWZpbmVkIHRvIHRoZSBuYW1lIG9mIHRoZSBzdHJvbmcgcmFuZG9tIGRldmljZSAqLworI3VuZGVmIE5BTUVfT0ZfREVWX1JBTkRPTQorCisvKiBkZWZpbmVkIHRvIHRoZSBuYW1lIG9mIHRoZSB3ZWFrZXIgcmFuZG9tIGRldmljZSAqLworI3VuZGVmIE5BTUVfT0ZfREVWX1VSQU5ET00KKworLyogRGVmaW5lIHRvIDEgaWYgeW91ciBDIGNvbXBpbGVyIGRvZXNuJ3QgYWNjZXB0IC1jIGFuZCAtbyB0b2dldGhlci4gKi8KKyN1bmRlZiBOT19NSU5VU19DX01JTlVTX08KKworLyogTmFtZSBvZiB0aGlzIHBhY2thZ2UgKi8KKyN1bmRlZiBQQUNLQUdFCisKKy8qIERlZmluZSB0byB0aGUgYWRkcmVzcyB3aGVyZSBidWcgcmVwb3J0cyBmb3IgdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBzZW50LiAqLworI3VuZGVmIFBBQ0tBR0VfQlVHUkVQT1JUCisKKy8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KKyN1bmRlZiBQQUNLQUdFX05BTUUKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgYW5kIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVmIFBBQ0tBR0VfU1RSSU5HCisKKy8qIERlZmluZSB0byB0aGUgb25lIHN5bWJvbCBzaG9ydCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KKyN1bmRlZiBQQUNLQUdFX1RBUk5BTUUKKworLyogRGVmaW5lIHRvIHRoZSBob21lIHBhZ2UgZm9yIHRoaXMgcGFja2FnZS4gKi8KKyN1bmRlZiBQQUNLQUdFX1VSTAorCisvKiBEZWZpbmUgdG8gdGhlIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVmIFBBQ0tBR0VfVkVSU0lPTgorCisvKiBBIGh1bWFuIHJlYWRhYmxlIHRleHQgd2l0aCB0aGUgbmFtZSBvZiB0aGUgT1MgKi8KKyN1bmRlZiBQUklOVEFCTEVfT1NfTkFNRQorCisvKiBEZWZpbmUgYXMgdGhlIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyAoYGludCcgb3IgYHZvaWQnKS4gKi8KKyN1bmRlZiBSRVRTSUdUWVBFCisKKy8qIFRoZSBzaXplIG9mIGB1bnNpZ25lZCBpbnQnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisjdW5kZWYgU0laRU9GX1VOU0lHTkVEX0lOVAorCisvKiBUaGUgc2l6ZSBvZiBgdW5zaWduZWQgbG9uZycsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyN1bmRlZiBTSVpFT0ZfVU5TSUdORURfTE9ORworCisvKiBUaGUgc2l6ZSBvZiBgdW5zaWduZWQgbG9uZyBsb25nJywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworI3VuZGVmIFNJWkVPRl9VTlNJR05FRF9MT05HX0xPTkcKKworLyogVGhlIHNpemUgb2YgYHVuc2lnbmVkIHNob3J0JywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworI3VuZGVmIFNJWkVPRl9VTlNJR05FRF9TSE9SVAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gKi8KKyN1bmRlZiBTVERDX0hFQURFUlMKKworLyogRGVmaW5lZCBpZiB0aGlzIG1vZHVsZSBzaG91bGQgYmUgaW5jbHVkZWQgKi8KKyN1bmRlZiBVU0VfQUVTCisKKy8qIERlZmluZWQgaWYgdGhpcyBtb2R1bGUgc2hvdWxkIGJlIGluY2x1ZGVkICovCisjdW5kZWYgVVNFX0FSQ0ZPVVIKKworLyogRGVmaW5lZCBpZiB0aGlzIG1vZHVsZSBzaG91bGQgYmUgaW5jbHVkZWQgKi8KKyN1bmRlZiBVU0VfQkxPV0ZJU0gKKworLyogRGVmaW5lZCBpZiB0aGlzIG1vZHVsZSBzaG91bGQgYmUgaW5jbHVkZWQgKi8KKyN1bmRlZiBVU0VfQ0FNRUxMSUEKKworLyogZGVmaW5lIGlmIGNhcGFiaWxpdGllcyBzaG91bGQgYmUgdXNlZCAqLworI3VuZGVmIFVTRV9DQVBBQklMSVRJRVMKKworLyogRGVmaW5lZCBpZiB0aGlzIG1vZHVsZSBzaG91bGQgYmUgaW5jbHVkZWQgKi8KKyN1bmRlZiBVU0VfQ0FTVDUKKworLyogRGVmaW5lZCBpZiB0aGlzIG1vZHVsZSBzaG91bGQgYmUgaW5jbHVkZWQgKi8KKyN1bmRlZiBVU0VfQ1JDCisKKy8qIERlZmluZWQgaWYgdGhpcyBtb2R1bGUgc2hvdWxkIGJlIGluY2x1ZGVkICovCisjdW5kZWYgVVNFX0RFUworCisvKiBEZWZpbmVkIGlmIHRoaXMgbW9kdWxlIHNob3VsZCBiZSBpbmNsdWRlZCAqLworI3VuZGVmIFVTRV9EU0EKKworLyogRGVmaW5lZCBpZiB0aGlzIG1vZHVsZSBzaG91bGQgYmUgaW5jbHVkZWQgKi8KKyN1bmRlZiBVU0VfRUNDCisKKy8qIERlZmluZWQgaWYgdGhpcyBtb2R1bGUgc2hvdWxkIGJlIGluY2x1ZGVkICovCisjdW5kZWYgVVNFX0VMR0FNQUwKKworLyogRGVmaW5lZCBpZiB0aGUgR05VIFBvcnRhYmxlIFRocmVhZCBMaWJyYXJ5IHNob3VsZCBiZSB1c2VkICovCisjdW5kZWYgVVNFX0dOVV9QVEgKKworLyogRGVmaW5lZCBpZiB0aGlzIG1vZHVsZSBzaG91bGQgYmUgaW5jbHVkZWQgKi8KKyN1bmRlZiBVU0VfTUQ0CisKKy8qIERlZmluZWQgaWYgdGhpcyBtb2R1bGUgc2hvdWxkIGJlIGluY2x1ZGVkICovCisjdW5kZWYgVVNFX01ENQorCisvKiBzZXQgdGhpcyB0byBsaW1pdCBmaWxlbmFtZXMgdG8gdGhlIDguMyBmb3JtYXQgKi8KKyN1bmRlZiBVU0VfT05MWV84RE9UMworCisvKiBEZWZpbmUgdG8gc3VwcG9ydCB0aGUgZXhwZXJpbWVudGFsIHJhbmRvbSBkYWVtb24gKi8KKyN1bmRlZiBVU0VfUkFORE9NX0RBRU1PTgorCisvKiBEZWZpbmVkIGlmIHRoaXMgbW9kdWxlIHNob3VsZCBiZSBpbmNsdWRlZCAqLworI3VuZGVmIFVTRV9SRkMyMjY4CisKKy8qIERlZmluZWQgaWYgdGhpcyBtb2R1bGUgc2hvdWxkIGJlIGluY2x1ZGVkICovCisjdW5kZWYgVVNFX1JNRDE2MAorCisvKiBEZWZpbmVkIGlmIHRoZSBFR0QgYmFzZWQgUk5HIHNob3VsZCBiZSB1c2VkLiAqLworI3VuZGVmIFVTRV9STkRFR0QKKworLyogRGVmaW5lZCBpZiB0aGUgL2Rldi9yYW5kb20gUk5HIHNob3VsZCBiZSB1c2VkLiAqLworI3VuZGVmIFVTRV9STkRMSU5VWAorCisvKiBEZWZpbmVkIGlmIHRoZSBkZWZhdWx0IFVuaXggUk5HIHNob3VsZCBiZSB1c2VkLiAqLworI3VuZGVmIFVTRV9STkRVTklYCisKKy8qIERlZmluZWQgaWYgdGhlIFdpbmRvd3Mgc3BlY2lmaWMgUk5HIHNob3VsZCBiZSB1c2VkLiAqLworI3VuZGVmIFVTRV9STkRXMzIKKworLyogRGVmaW5lZCBpZiB0aGlzIG1vZHVsZSBzaG91bGQgYmUgaW5jbHVkZWQgKi8KKyN1bmRlZiBVU0VfUlNBCisKKy8qIERlZmluZWQgaWYgdGhpcyBtb2R1bGUgc2hvdWxkIGJlIGluY2x1ZGVkICovCisjdW5kZWYgVVNFX1NFRUQKKworLyogRGVmaW5lZCBpZiB0aGlzIG1vZHVsZSBzaG91bGQgYmUgaW5jbHVkZWQgKi8KKyN1bmRlZiBVU0VfU0VSUEVOVAorCisvKiBEZWZpbmVkIGlmIHRoaXMgbW9kdWxlIHNob3VsZCBiZSBpbmNsdWRlZCAqLworI3VuZGVmIFVTRV9TSEExCisKKy8qIERlZmluZWQgaWYgdGhpcyBtb2R1bGUgc2hvdWxkIGJlIGluY2x1ZGVkICovCisjdW5kZWYgVVNFX1NIQTI1NgorCisvKiBEZWZpbmVkIGlmIHRoaXMgbW9kdWxlIHNob3VsZCBiZSBpbmNsdWRlZCAqLworI3VuZGVmIFVTRV9TSEE1MTIKKworLyogRGVmaW5lZCBpZiB0aGlzIG1vZHVsZSBzaG91bGQgYmUgaW5jbHVkZWQgKi8KKyN1bmRlZiBVU0VfVElHRVIKKworLyogRGVmaW5lZCBpZiB0aGlzIG1vZHVsZSBzaG91bGQgYmUgaW5jbHVkZWQgKi8KKyN1bmRlZiBVU0VfVFdPRklTSAorCisvKiBEZWZpbmVkIGlmIHRoaXMgbW9kdWxlIHNob3VsZCBiZSBpbmNsdWRlZCAqLworI3VuZGVmIFVTRV9XSElSTFBPT0wKKworLyogVmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UgKi8KKyN1bmRlZiBWRVJTSU9OCisKKy8qIERlZmluZWQgaWYgY29tcGlsZWQgc3ltYm9scyBoYXZlIGEgbGVhZGluZyB1bmRlcnNjb3JlICovCisjdW5kZWYgV0lUSF9TWU1CT0xfVU5ERVJTQ09SRQorCisvKiBEZWZpbmUgV09SRFNfQklHRU5ESUFOIHRvIDEgaWYgeW91ciBwcm9jZXNzb3Igc3RvcmVzIHdvcmRzIHdpdGggdGhlIG1vc3QKKyAgIHNpZ25pZmljYW50IGJ5dGUgZmlyc3QgKGxpa2UgTW90b3JvbGEgYW5kIFNQQVJDLCB1bmxpa2UgSW50ZWwpLiAqLworI2lmIGRlZmluZWQgQUNfQVBQTEVfVU5JVkVSU0FMX0JVSUxECisjIGlmIGRlZmluZWQgX19CSUdfRU5ESUFOX18KKyMgIGRlZmluZSBXT1JEU19CSUdFTkRJQU4gMQorIyBlbmRpZgorI2Vsc2UKKyMgaWZuZGVmIFdPUkRTX0JJR0VORElBTgorIyAgdW5kZWYgV09SRFNfQklHRU5ESUFOCisjIGVuZGlmCisjZW5kaWYKKworLyogVG8gYWxsb3cgdGhlIHVzZSBvZiBMaWJnY3J5cHQgaW4gbXVsdGl0aHJlYWRlZCBwcm9ncmFtcyB3ZSBoYXZlIHRvIHVzZQorICAgIHNwZWNpYWwgZmVhdHVyZXMgZnJvbSB0aGUgbGlicmFyeS4gKi8KKyNpZm5kZWYgX1JFRU5UUkFOVAorIyBkZWZpbmUgX1JFRU5UUkFOVCAxCisjZW5kaWYKKworCisvKiBEZWZpbmUgdG8gZW1wdHkgaWYgYGNvbnN0JyBkb2VzIG5vdCBjb25mb3JtIHRvIEFOU0kgQy4gKi8KKyN1bmRlZiBjb25zdAorCisvKiBEZWZpbmUgdG8gYF9faW5saW5lX18nIG9yIGBfX2lubGluZScgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIKKyAgIGNhbGxzIGl0LCBvciB0byBub3RoaW5nIGlmICdpbmxpbmUnIGlzIG5vdCBzdXBwb3J0ZWQgdW5kZXIgYW55IG5hbWUuICAqLworI2lmbmRlZiBfX2NwbHVzcGx1cworI3VuZGVmIGlubGluZQorI2VuZGlmCisKKy8qIERlZmluZSB0byBgdW5zaWduZWQgaW50JyBpZiA8c3lzL3R5cGVzLmg+IGRvZXMgbm90IGRlZmluZS4gKi8KKyN1bmRlZiBzaXplX3QKKworLyogdHlwZSB0byB1c2UgaW4gcGxhY2Ugb2Ygc29ja2xlbl90IGlmIG5vdCBkZWZpbmVkICovCisjdW5kZWYgc29ja2xlbl90CisKKy8qIERlZmluZSB0byB0aGUgdHlwZSBvZiBhbiB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUgd2lkZSBlbm91Z2ggdG8gaG9sZCBhCisgICBwb2ludGVyLCBpZiBzdWNoIGEgdHlwZSBleGlzdHMsIGFuZCBpZiB0aGUgc3lzdGVtIGRvZXMgbm90IGRlZmluZSBpdC4gKi8KKyN1bmRlZiB1aW50cHRyX3QKKworCisjZGVmaW5lIF9HQ1JZUFRfSU5fTElCR0NSWVBUIDEKKworLyogSWYgdGhlIGNvbmZpZ3VyZSBjaGVjayBmb3IgZW5kaWFubmVzcyBoYXMgYmVlbiBkaXNhYmxlZCwgZ2V0IGl0IGZyb20KKyAgIE9TIG1hY3Jvcy4gIFRoaXMgaXMgaW50ZW5kZWQgZm9yIG1ha2luZyBmYXQgYmluYXJ5IGJ1aWxkcyBvbiBPUyBYLiAgKi8KKyNpZmRlZiBESVNBQkxFRF9FTkRJQU5fQ0hFQ0sKKyMgaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fXykKKyMgIGRlZmluZSBXT1JEU19CSUdFTkRJQU4gMQorIyBlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX18pCisjICB1bmRlZiBXT1JEU19CSUdFTkRJQU4KKyMgZWxzZQorIyAgZXJyb3IgIk5vIGVuZGlhbm5lc3MgZm91bmQiCisjIGVuZGlmCisjZW5kaWYgLypESVNBQkxFRF9FTkRJQU5fQ0hFQ0sqLworCisvKiBXZSBiYXNpY2FsbHkgdXNlIHRoZSBvcmlnaW5hbCBDYW1lbGxpYSBzb3VyY2UuICBNYWtlIHN1cmUgdGhlIHN5bWJvbHMgCisgICBwcm9wZXJseSBwcmVmaXhlZC4gICovCisjZGVmaW5lIENBTUVMTElBX0VYVF9TWU1fUFJFRklYIF9nY3J5XworCisvKiBUaGlzIGVycm9yIGNvZGUgaXMgb25seSBhdmFpbGFibGUgd2l0aCBncGctZXJyb3IgMS43LiAgVGh1cworICAgd2UgZGVmaW5lIGl0IGhlcmUgd2l0aCB0aGUgdXN1YWwgZ2NyeSBwcmVmaXguICAqLworI2RlZmluZSBHQ1JZX0dQR19FUlJfTk9UX09QRVJBVElPTkFMICAxNzYKKworCisjZW5kaWYgLypfR0NSWVBUX0NPTkZJR19IX0lOQ0xVREVEKi8KKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L2NvbmZpZy5zdWIgYi9saWJnY3J5cHQtMS40LjYvY29uZmlnLnN1YgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41MTkwNDYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L2NvbmZpZy5zdWIKQEAgLTAsMCArMSwxNjMwIEBACisjISAvYmluL3NoCisjIENvbmZpZ3VyYXRpb24gdmFsaWRhdGlvbiBzdWJyb3V0aW5lIHNjcmlwdC4KKyMgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksCisjICAgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjICAgSW5jLgorCit0aW1lc3RhbXA9JzIwMDctMTEtMTknCisKKyMgVGhpcyBmaWxlIGlzIChpbiBwcmluY2lwbGUpIGNvbW1vbiB0byBBTEwgR05VIHNvZnR3YXJlLgorIyBUaGUgcHJlc2VuY2Ugb2YgYSBtYWNoaW5lIGluIHRoaXMgZmlsZSBzdWdnZXN0cyB0aGF0IFNPTUUgR05VIHNvZnR3YXJlCisjIGNhbiBoYW5kbGUgdGhhdCBtYWNoaW5lLiAgSXQgZG9lcyBub3QgaW1wbHkgQUxMIEdOVSBzb2Z0d2FyZSBjYW4uCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisjIDAyMTEwLTEzMDEsIFVTQS4KKyMKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisKKyMgUGxlYXNlIHNlbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uICBTdWJtaXQgYSBjb250ZXh0CisjIGRpZmYgYW5kIGEgcHJvcGVybHkgZm9ybWF0dGVkIENoYW5nZUxvZyBlbnRyeS4KKyMKKyMgQ29uZmlndXJhdGlvbiBzdWJyb3V0aW5lIHRvIHZhbGlkYXRlIGFuZCBjYW5vbmljYWxpemUgYSBjb25maWd1cmF0aW9uIHR5cGUuCisjIFN1cHBseSB0aGUgc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24gdHlwZSBhcyBhbiBhcmd1bWVudC4KKyMgSWYgaXQgaXMgaW52YWxpZCwgd2UgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZSBvbiBzdGRlcnIgYW5kIGV4aXQgd2l0aCBjb2RlIDEuCisjIE90aGVyd2lzZSwgd2UgcHJpbnQgdGhlIGNhbm9uaWNhbCBjb25maWcgdHlwZSBvbiBzdGRvdXQgYW5kIHN1Y2NlZWQuCisKKyMgVGhpcyBmaWxlIGlzIHN1cHBvc2VkIHRvIGJlIHRoZSBzYW1lIGZvciBhbGwgR05VIHBhY2thZ2VzCisjIGFuZCByZWNvZ25pemUgYWxsIHRoZSBDUFUgdHlwZXMsIHN5c3RlbSB0eXBlcyBhbmQgYWxpYXNlcworIyB0aGF0IGFyZSBtZWFuaW5nZnVsIHdpdGggKmFueSogR05VIHNvZnR3YXJlLgorIyBFYWNoIHBhY2thZ2UgaXMgcmVzcG9uc2libGUgZm9yIHJlcG9ydGluZyB3aGljaCB2YWxpZCBjb25maWd1cmF0aW9ucworIyBpdCBkb2VzIG5vdCBzdXBwb3J0LiAgVGhlIHVzZXIgc2hvdWxkIGJlIGFibGUgdG8gZGlzdGluZ3Vpc2gKKyMgYSBmYWlsdXJlIHRvIHN1cHBvcnQgYSB2YWxpZCBjb25maWd1cmF0aW9uIGZyb20gYSBtZWFuaW5nbGVzcworIyBjb25maWd1cmF0aW9uLgorCisjIFRoZSBnb2FsIG9mIHRoaXMgZmlsZSBpcyB0byBtYXAgYWxsIHRoZSB2YXJpb3VzIHZhcmlhdGlvbnMgb2YgYSBnaXZlbgorIyBtYWNoaW5lIHNwZWNpZmljYXRpb24gaW50byBhIHNpbmdsZSBzcGVjaWZpY2F0aW9uIGluIHRoZSBmb3JtOgorIwlDUFVfVFlQRS1NQU5VRkFDVFVSRVItT1BFUkFUSU5HX1NZU1RFTQorIyBvciBpbiBzb21lIGNhc2VzLCB0aGUgbmV3ZXIgZm91ci1wYXJ0IGZvcm06CisjCUNQVV9UWVBFLU1BTlVGQUNUVVJFUi1LRVJORUwtT1BFUkFUSU5HX1NZU1RFTQorIyBJdCBpcyB3cm9uZyB0byBlY2hvIGFueSBvdGhlciB0eXBlIG9mIHNwZWNpZmljYXRpb24uCisKK21lPWBlY2hvICIkMCIgfCBzZWQgLWUgJ3MsLiovLCwnYAorCit1c2FnZT0iXAorVXNhZ2U6ICQwIFtPUFRJT05dIENQVS1NRlItT1BTWVMKKyAgICAgICAkMCBbT1BUSU9OXSBBTElBUworCitDYW5vbmljYWxpemUgYSBjb25maWd1cmF0aW9uIG5hbWUuCisKK09wZXJhdGlvbiBtb2RlczoKKyAgLWgsIC0taGVscCAgICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0CisgIC10LCAtLXRpbWUtc3RhbXAgICBwcmludCBkYXRlIG9mIGxhc3QgbW9kaWZpY2F0aW9uLCB0aGVuIGV4aXQKKyAgLXYsIC0tdmVyc2lvbiAgICAgIHByaW50IHZlcnNpb24gbnVtYmVyLCB0aGVuIGV4aXQKKworUmVwb3J0IGJ1Z3MgYW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiIKKwordmVyc2lvbj0iXAorR05VIGNvbmZpZy5zdWIgKCR0aW1lc3RhbXApCisKK0NvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNQorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PCit3YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4iCisKK2hlbHA9IgorVHJ5IFxgJG1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorCisjIFBhcnNlIGNvbW1hbmQgbGluZQord2hpbGUgdGVzdCAkIyAtZ3QgMCA7IGRvCisgIGNhc2UgJDEgaW4KKyAgICAtLXRpbWUtc3RhbXAgfCAtLXRpbWUqIHwgLXQgKQorICAgICAgIGVjaG8gIiR0aW1lc3RhbXAiIDsgZXhpdCA7OworICAgIC0tdmVyc2lvbiB8IC12ICkKKyAgICAgICBlY2hvICIkdmVyc2lvbiIgOyBleGl0IDs7CisgICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKKyAgICAgICBlY2hvICIkdXNhZ2UiOyBleGl0IDs7CisgICAgLS0gKSAgICAgIyBTdG9wIG9wdGlvbiBwcm9jZXNzaW5nCisgICAgICAgc2hpZnQ7IGJyZWFrIDs7CisgICAgLSApCSMgVXNlIHN0ZGluIGFzIGlucHV0LgorICAgICAgIGJyZWFrIDs7CisgICAgLSogKQorICAgICAgIGVjaG8gIiRtZTogaW52YWxpZCBvcHRpb24gJDEkaGVscCIKKyAgICAgICBleGl0IDEgOzsKKworICAgICpsb2NhbCopCisgICAgICAgIyBGaXJzdCBwYXNzIHRocm91Z2ggYW55IGxvY2FsIG1hY2hpbmUgdHlwZXMuCisgICAgICAgZWNobyAkMQorICAgICAgIGV4aXQgOzsKKworICAgICogKQorICAgICAgIGJyZWFrIDs7CisgIGVzYWMKK2RvbmUKKworY2FzZSAkIyBpbgorIDApIGVjaG8gIiRtZTogbWlzc2luZyBhcmd1bWVudCRoZWxwIiA+JjIKKyAgICBleGl0IDE7OworIDEpIDs7CisgKikgZWNobyAiJG1lOiB0b28gbWFueSBhcmd1bWVudHMkaGVscCIgPiYyCisgICAgZXhpdCAxOzsKK2VzYWMKKworIyBTZXBhcmF0ZSB3aGF0IHRoZSB1c2VyIGdhdmUgaW50byBDUFUtQ09NUEFOWSBhbmQgT1Mgb3IgS0VSTkVMLU9TIChpZiBhbnkpLgorIyBIZXJlIHdlIG11c3QgcmVjb2duaXplIGFsbCB0aGUgdmFsaWQgS0VSTkVMLU9TIGNvbWJpbmF0aW9ucy4KK21heWJlX29zPWBlY2hvICQxIHwgc2VkICdzL15cKC4qXCktXChbXi1dKi1bXi1dKlwpJC9cMi8nYAorY2FzZSAkbWF5YmVfb3MgaW4KKyAgbnRvLXFueCogfCBsaW51eC1nbnUqIHwgbGludXgtZGlldGxpYmMgfCBsaW51eC1uZXdsaWIqIHwgbGludXgtdWNsaWJjKiB8IFwKKyAgdWNsaW51eC11Y2xpYmMqIHwgdWNsaW51eC1nbnUqIHwga2ZyZWVic2QqLWdudSogfCBrbmV0YnNkKi1nbnUqIHwgbmV0YnNkKi1nbnUqIHwgXAorICBzdG9ybS1jaGFvcyogfCBvczItZW14KiB8IHJ0bWstbm92YSopCisgICAgb3M9LSRtYXliZV9vcworICAgIGJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wxLydgCisgICAgOzsKKyAgKikKKyAgICBiYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkICdzLy1bXi1dKiQvLydgCisgICAgaWYgWyAkYmFzaWNfbWFjaGluZSAhPSAkMSBdCisgICAgdGhlbiBvcz1gZWNobyAkMSB8IHNlZCAncy8uKi0vLS8nYAorICAgIGVsc2Ugb3M9OyBmaQorICAgIDs7Citlc2FjCisKKyMjIyBMZXQncyByZWNvZ25pemUgY29tbW9uIG1hY2hpbmVzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcyBzbworIyMjIHRoYXQgdGhpbmdzIGxpa2UgY29uZmlnLnN1YiBkZWNzdGF0aW9uLTMxMDAgd29yay4gIFdlIGFsc28KKyMjIyByZWNvZ25pemUgc29tZSBtYW51ZmFjdHVyZXJzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcywgc28gd2UKKyMjIyBjYW4gcHJvdmlkZSBkZWZhdWx0IG9wZXJhdGluZyBzeXN0ZW1zIGJlbG93LgorY2FzZSAkb3MgaW4KKwktc3VuKm9zKikKKwkJIyBQcmV2ZW50IGZvbGxvd2luZyBjbGF1c2UgZnJvbSBoYW5kbGluZyB0aGlzIGludmFsaWQgaW5wdXQuCisJCTs7CisJLWRlYyogfCAtbWlwcyogfCAtc2VxdWVudCogfCAtZW5jb3JlKiB8IC1wYzUzMiogfCAtc2dpKiB8IC1zb255KiB8IFwKKwktYXR0KiB8IC03MzAwKiB8IC0zMzAwKiB8IC1kZWx0YSogfCAtbW90b3JvbGEqIHwgLXN1blsyMzRdKiB8IFwKKwktdW5pY29tKiB8IC1pYm0qIHwgLW5leHQgfCAtaHAgfCAtaXNpKiB8IC1hcG9sbG8gfCAtYWx0b3MqIHwgXAorCS1jb252ZXJnZW50KiB8IC1uY3IqIHwgLW5ld3MgfCAtMzIqIHwgLTM2MDAqIHwgLTMxMDAqIHwgLWhpdGFjaGkqIHxcCisJLWNbMTIzXSogfCAtY29udmV4KiB8IC1zdW4gfCAtY3JkcyB8IC1vbXJvbiogfCAtZGcgfCAtdWx0cmEgfCAtdHRpKiB8IFwKKwktaGFycmlzIHwgLWRvbHBoaW4gfCAtaGlnaGxldmVsIHwgLWdvdWxkIHwgLWNibSB8IC1ucyB8IC1tYXNzY29tcCB8IFwKKwktYXBwbGUgfCAtYXhpcyB8IC1rbnV0aCB8IC1jcmF5KQorCQlvcz0KKwkJYmFzaWNfbWFjaGluZT0kMQorCQk7OworCS1zaW0gfCAtY2lzY28gfCAtb2tpIHwgLXdlYyB8IC13aW5ib25kKQorCQlvcz0KKwkJYmFzaWNfbWFjaGluZT0kMQorCQk7OworCS1zY291dCkKKwkJOzsKKwktd3JzKQorCQlvcz0tdnh3b3JrcworCQliYXNpY19tYWNoaW5lPSQxCisJCTs7CisJLWNob3J1c29zKikKKwkJb3M9LWNob3J1c29zCisJCWJhc2ljX21hY2hpbmU9JDEKKwkJOzsKKyAJLWNob3J1c3JkYikKKyAJCW9zPS1jaG9ydXNyZGIKKwkJYmFzaWNfbWFjaGluZT0kMQorIAkJOzsKKwktaGl1eCopCisJCW9zPS1oaXV4d2UyCisJCTs7CisJLXNjbzYpCisJCW9zPS1zY281djYKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY281KQorCQlvcz0tc2NvMy4ydjUKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY280KQorCQlvcz0tc2NvMy4ydjQKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY28zLjIuWzQtOV0qKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3Mvc2NvMy4yLi9zY28zLjJ2LydgCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvMy4ydls0LTldKikKKwkJIyBEb24ndCBmb3JnZXQgdmVyc2lvbiBpZiBpdCBpcyAzLjJ2NCBvciBuZXdlci4KKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY281djYqKQorCQkjIERvbid0IGZvcmdldCB2ZXJzaW9uIGlmIGl0IGlzIDMuMnY0IG9yIG5ld2VyLgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbyopCisJCW9zPS1zY28zLjJ2MgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXVkayopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktaXNjKQorCQlvcz0taXNjMi4yCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktY2xpeCopCisJCWJhc2ljX21hY2hpbmU9Y2xpcHBlci1pbnRlcmdyYXBoCisJCTs7CisJLWlzYyopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktbHlueCopCisJCW9zPS1seW54b3MKKwkJOzsKKwktcHR4KikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1zZXF1ZW50LydgCisJCTs7CisJLXdpbmRvd3NudCopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAncy93aW5kb3dzbnQvd2lubnQvJ2AKKwkJOzsKKwktcHNvcyopCisJCW9zPS1wc29zCisJCTs7CisJLW1pbnQgfCAtbWludFswLTldKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWF0YXJpCisJCW9zPS1taW50CisJCTs7Citlc2FjCisKKyMgRGVjb2RlIGFsaWFzZXMgZm9yIGNlcnRhaW4gQ1BVLUNPTVBBTlkgY29tYmluYXRpb25zLgorY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCSMgUmVjb2duaXplIHRoZSBiYXNpYyBDUFUgdHlwZXMgd2l0aG91dCBjb21wYW55IG5hbWUuCisJIyBTb21lIGFyZSBvbWl0dGVkIGhlcmUgYmVjYXVzZSB0aGV5IGhhdmUgc3BlY2lhbCBtZWFuaW5ncyBiZWxvdy4KKwkxNzUwYSB8IDU4MCBcCisJfCBhMjlrIFwKKwl8IGFscGhhIHwgYWxwaGFldls0LThdIHwgYWxwaGFldjU2IHwgYWxwaGFldjZbNzhdIHwgYWxwaGFwY2E1WzY3XSBcCisJfCBhbHBoYTY0IHwgYWxwaGE2NGV2WzQtOF0gfCBhbHBoYTY0ZXY1NiB8IGFscGhhNjRldjZbNzhdIHwgYWxwaGE2NHBjYTVbNjddIFwKKwl8IGFtMzNfMi4wIFwKKwl8IGFyYyB8IGFybSB8IGFybVtibF1lIHwgYXJtZVtsYl0gfCBhcm12WzIzNDVdIHwgYXJtdlszNDVdW2xiXSB8IGF2ciB8IGF2cjMyIFwKKwl8IGJmaW4gXAorCXwgYzR4IHwgY2xpcHBlciBcCisJfCBkMTB2IHwgZDMwdiB8IGRseCB8IGRzcDE2eHggXAorCXwgZmlkbyB8IGZyMzAgfCBmcnYgXAorCXwgaDgzMDAgfCBoODUwMCB8IGhwcGEgfCBocHBhMS5bMDFdIHwgaHBwYTIuMCB8IGhwcGEyLjBbbnddIHwgaHBwYTY0IFwKKwl8IGkzNzAgfCBpODYwIHwgaTk2MCB8IGlhNjQgXAorCXwgaXAyayB8IGlxMjAwMCBcCisJfCBtMzJjIHwgbTMyciB8IG0zMnJsZSB8IG02ODAwMCB8IG02OGsgfCBtODhrIFwKKwl8IG1heHEgfCBtYiB8IG1pY3JvYmxhemUgfCBtY29yZSB8IG1lcCBcCisJfCBtaXBzIHwgbWlwc2JlIHwgbWlwc2ViIHwgbWlwc2VsIHwgbWlwc2xlIFwKKwl8IG1pcHMxNiBcCisJfCBtaXBzNjQgfCBtaXBzNjRlbCBcCisJfCBtaXBzNjR2ciB8IG1pcHM2NHZyZWwgXAorCXwgbWlwczY0b3Jpb24gfCBtaXBzNjRvcmlvbmVsIFwKKwl8IG1pcHM2NHZyNDEwMCB8IG1pcHM2NHZyNDEwMGVsIFwKKwl8IG1pcHM2NHZyNDMwMCB8IG1pcHM2NHZyNDMwMGVsIFwKKwl8IG1pcHM2NHZyNTAwMCB8IG1pcHM2NHZyNTAwMGVsIFwKKwl8IG1pcHM2NHZyNTkwMCB8IG1pcHM2NHZyNTkwMGVsIFwKKwl8IG1pcHNpc2EzMiB8IG1pcHNpc2EzMmVsIFwKKwl8IG1pcHNpc2EzMnIyIHwgbWlwc2lzYTMycjJlbCBcCisJfCBtaXBzaXNhNjQgfCBtaXBzaXNhNjRlbCBcCisJfCBtaXBzaXNhNjRyMiB8IG1pcHNpc2E2NHIyZWwgXAorCXwgbWlwc2lzYTY0c2IxIHwgbWlwc2lzYTY0c2IxZWwgXAorCXwgbWlwc2lzYTY0c3I3MWsgfCBtaXBzaXNhNjRzcjcxa2VsIFwKKwl8IG1pcHN0eDM5IHwgbWlwc3R4MzllbCBcCisJfCBtbjEwMjAwIHwgbW4xMDMwMCBcCisJfCBtdCBcCisJfCBtc3A0MzAgXAorCXwgbmlvcyB8IG5pb3MyIFwKKwl8IG5zMTZrIHwgbnMzMmsgXAorCXwgb3IzMiBcCisJfCBwZHAxMCB8IHBkcDExIHwgcGogfCBwamwgXAorCXwgcG93ZXJwYyB8IHBvd2VycGM2NCB8IHBvd2VycGM2NGxlIHwgcG93ZXJwY2xlIHwgcHBjYmUgXAorCXwgcHlyYW1pZCBcCisJfCBzY29yZSBcCisJfCBzaCB8IHNoWzEyMzRdIHwgc2hbMjRdYSB8IHNoWzIzXWUgfCBzaFszNF1lYiB8IHNoZWIgfCBzaGJlIHwgc2hsZSB8IHNoWzEyMzRdbGUgfCBzaDNlbGUgXAorCXwgc2g2NCB8IHNoNjRsZSBcCisJfCBzcGFyYyB8IHNwYXJjNjQgfCBzcGFyYzY0YiB8IHNwYXJjNjR2IHwgc3BhcmM4NnggfCBzcGFyY2xldCB8IHNwYXJjbGl0ZSBcCisJfCBzcGFyY3Y4IHwgc3BhcmN2OSB8IHNwYXJjdjliIHwgc3BhcmN2OXYgXAorCXwgc3B1IHwgc3Ryb25nYXJtIFwKKwl8IHRhaG9lIHwgdGh1bWIgfCB0aWM0eCB8IHRpYzgwIHwgdHJvbiBcCisJfCB2ODUwIHwgdjg1MGUgXAorCXwgd2UzMmsgXAorCXwgeDg2IHwgeGMxNnggfCB4c2NhbGUgfCB4c2NhbGVlW2JsXSB8IHhzdG9ybXkxNiB8IHh0ZW5zYSBcCisJfCB6OGspCisJCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgorCQk7OworCW02ODExIHwgbTY4aGMxMSB8IG02ODEyIHwgbTY4aGMxMikKKwkJIyBNb3Rvcm9sYSA2OEhDMTEvMTIuCisJCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgorCQlvcz0tbm9uZQorCQk7OworCW04ODExMCB8IG02ODBbMTIzNDZdMCB8IG02ODM/MiB8IG02ODM2MCB8IG01MjAwIHwgdjcwIHwgdzY1IHwgejhrKQorCQk7OworCW1zMSkKKwkJYmFzaWNfbWFjaGluZT1tdC11bmtub3duCisJCTs7CisKKwkjIFdlIHVzZSBgcGMnIHJhdGhlciB0aGFuIGB1bmtub3duJworCSMgYmVjYXVzZSAoMSkgdGhhdCdzIHdoYXQgdGhleSBub3JtYWxseSBhcmUsIGFuZAorCSMgKDIpIHRoZSB3b3JkICJ1bmtub3duIiB0ZW5kcyB0byBjb25mdXNlIGJlZ2lubmluZyB1c2Vycy4KKwlpKjg2IHwgeDg2XzY0KQorCSAgYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS1wYworCSAgOzsKKwkjIE9iamVjdCBpZiBtb3JlIHRoYW4gb25lIGNvbXBhbnkgbmFtZSB3b3JkLgorCSotKi0qKQorCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IG1hY2hpbmUgXGAkYmFzaWNfbWFjaGluZVwnIG5vdCByZWNvZ25pemVkIDE+JjIKKwkJZXhpdCAxCisJCTs7CisJIyBSZWNvZ25pemUgdGhlIGJhc2ljIENQVSB0eXBlcyB3aXRoIGNvbXBhbnkgbmFtZS4KKwk1ODAtKiBcCisJfCBhMjlrLSogXAorCXwgYWxwaGEtKiB8IGFscGhhZXZbNC04XS0qIHwgYWxwaGFldjU2LSogfCBhbHBoYWV2Nls3OF0tKiBcCisJfCBhbHBoYTY0LSogfCBhbHBoYTY0ZXZbNC04XS0qIHwgYWxwaGE2NGV2NTYtKiB8IGFscGhhNjRldjZbNzhdLSogXAorCXwgYWxwaGFwY2E1WzY3XS0qIHwgYWxwaGE2NHBjYTVbNjddLSogfCBhcmMtKiBcCisJfCBhcm0tKiAgfCBhcm1iZS0qIHwgYXJtbGUtKiB8IGFybWViLSogfCBhcm12Ki0qIFwKKwl8IGF2ci0qIHwgYXZyMzItKiBcCisJfCBiZmluLSogfCBiczIwMDAtKiBcCisJfCBjWzEyM10qIHwgYzMwLSogfCBbY2p0XTkwLSogfCBjNHgtKiB8IGM1NHgtKiB8IGM1NXgtKiB8IGM2eC0qIFwKKwl8IGNsaXBwZXItKiB8IGNyYXludi0qIHwgY3lkcmEtKiBcCisJfCBkMTB2LSogfCBkMzB2LSogfCBkbHgtKiBcCisJfCBlbHhzaS0qIFwKKwl8IGYzMFswMV0tKiB8IGY3MDAtKiB8IGZpZG8tKiB8IGZyMzAtKiB8IGZydi0qIHwgZng4MC0qIFwKKwl8IGg4MzAwLSogfCBoODUwMC0qIFwKKwl8IGhwcGEtKiB8IGhwcGExLlswMV0tKiB8IGhwcGEyLjAtKiB8IGhwcGEyLjBbbnddLSogfCBocHBhNjQtKiBcCisJfCBpKjg2LSogfCBpODYwLSogfCBpOTYwLSogfCBpYTY0LSogXAorCXwgaXAyay0qIHwgaXEyMDAwLSogXAorCXwgbTMyYy0qIHwgbTMyci0qIHwgbTMycmxlLSogXAorCXwgbTY4MDAwLSogfCBtNjgwWzAxMjM0Nl0wLSogfCBtNjgzNjAtKiB8IG02ODM/Mi0qIHwgbTY4ay0qIFwKKwl8IG04ODExMC0qIHwgbTg4ay0qIHwgbWF4cS0qIHwgbWNvcmUtKiBcCisJfCBtaXBzLSogfCBtaXBzYmUtKiB8IG1pcHNlYi0qIHwgbWlwc2VsLSogfCBtaXBzbGUtKiBcCisJfCBtaXBzMTYtKiBcCisJfCBtaXBzNjQtKiB8IG1pcHM2NGVsLSogXAorCXwgbWlwczY0dnItKiB8IG1pcHM2NHZyZWwtKiBcCisJfCBtaXBzNjRvcmlvbi0qIHwgbWlwczY0b3Jpb25lbC0qIFwKKwl8IG1pcHM2NHZyNDEwMC0qIHwgbWlwczY0dnI0MTAwZWwtKiBcCisJfCBtaXBzNjR2cjQzMDAtKiB8IG1pcHM2NHZyNDMwMGVsLSogXAorCXwgbWlwczY0dnI1MDAwLSogfCBtaXBzNjR2cjUwMDBlbC0qIFwKKwl8IG1pcHM2NHZyNTkwMC0qIHwgbWlwczY0dnI1OTAwZWwtKiBcCisJfCBtaXBzaXNhMzItKiB8IG1pcHNpc2EzMmVsLSogXAorCXwgbWlwc2lzYTMycjItKiB8IG1pcHNpc2EzMnIyZWwtKiBcCisJfCBtaXBzaXNhNjQtKiB8IG1pcHNpc2E2NGVsLSogXAorCXwgbWlwc2lzYTY0cjItKiB8IG1pcHNpc2E2NHIyZWwtKiBcCisJfCBtaXBzaXNhNjRzYjEtKiB8IG1pcHNpc2E2NHNiMWVsLSogXAorCXwgbWlwc2lzYTY0c3I3MWstKiB8IG1pcHNpc2E2NHNyNzFrZWwtKiBcCisJfCBtaXBzdHgzOS0qIHwgbWlwc3R4MzllbC0qIFwKKwl8IG1taXgtKiBcCisJfCBtdC0qIFwKKwl8IG1zcDQzMC0qIFwKKwl8IG5pb3MtKiB8IG5pb3MyLSogXAorCXwgbm9uZS0qIHwgbnAxLSogfCBuczE2ay0qIHwgbnMzMmstKiBcCisJfCBvcmlvbi0qIFwKKwl8IHBkcDEwLSogfCBwZHAxMS0qIHwgcGotKiB8IHBqbC0qIHwgcG4tKiB8IHBvd2VyLSogXAorCXwgcG93ZXJwYy0qIHwgcG93ZXJwYzY0LSogfCBwb3dlcnBjNjRsZS0qIHwgcG93ZXJwY2xlLSogfCBwcGNiZS0qIFwKKwl8IHB5cmFtaWQtKiBcCisJfCByb21wLSogfCByczYwMDAtKiBcCisJfCBzaC0qIHwgc2hbMTIzNF0tKiB8IHNoWzI0XWEtKiB8IHNoWzIzXWUtKiB8IHNoWzM0XWViLSogfCBzaGViLSogfCBzaGJlLSogXAorCXwgc2hsZS0qIHwgc2hbMTIzNF1sZS0qIHwgc2gzZWxlLSogfCBzaDY0LSogfCBzaDY0bGUtKiBcCisJfCBzcGFyYy0qIHwgc3BhcmM2NC0qIHwgc3BhcmM2NGItKiB8IHNwYXJjNjR2LSogfCBzcGFyYzg2eC0qIHwgc3BhcmNsZXQtKiBcCisJfCBzcGFyY2xpdGUtKiBcCisJfCBzcGFyY3Y4LSogfCBzcGFyY3Y5LSogfCBzcGFyY3Y5Yi0qIHwgc3BhcmN2OXYtKiB8IHN0cm9uZ2FybS0qIHwgc3YxLSogfCBzeD8tKiBcCisJfCB0YWhvZS0qIHwgdGh1bWItKiBcCisJfCB0aWMzMC0qIHwgdGljNHgtKiB8IHRpYzU0eC0qIHwgdGljNTV4LSogfCB0aWM2eC0qIHwgdGljODAtKiBcCisJfCB0cm9uLSogXAorCXwgdjg1MC0qIHwgdjg1MGUtKiB8IHZheC0qIFwKKwl8IHdlMzJrLSogXAorCXwgeDg2LSogfCB4ODZfNjQtKiB8IHhjMTZ4LSogfCB4cHMxMDAtKiB8IHhzY2FsZS0qIHwgeHNjYWxlZVtibF0tKiBcCisJfCB4c3Rvcm15MTYtKiB8IHh0ZW5zYSotKiBcCisJfCB5bXAtKiBcCisJfCB6OGstKikKKwkJOzsKKwkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGhvdXQgY29tcGFueSBuYW1lLCB3aXRoIGdsb2IgbWF0Y2guCisJeHRlbnNhKikKKwkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCisJCTs7CisJIyBSZWNvZ25pemUgdGhlIHZhcmlvdXMgbWFjaGluZSBuYW1lcyBhbmQgYWxpYXNlcyB3aGljaCBzdGFuZAorCSMgZm9yIGEgQ1BVIHR5cGUgYW5kIGEgY29tcGFueSBhbmQgc29tZXRpbWVzIGV2ZW4gYW4gT1MuCisJMzg2YnNkKQorCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgorCQlvcz0tYnNkCisJCTs7CisJM2IxIHwgNzMwMCB8IDczMDAtYXR0IHwgYXR0LTczMDAgfCBwYzczMDAgfCBzYWZhcmkgfCB1bml4cGMpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWF0dAorCQk7OworCTNiKikKKwkJYmFzaWNfbWFjaGluZT13ZTMyay1hdHQKKwkJOzsKKwlhMjlraGlmKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS11ZGkKKwkJOzsKKyAgICAJYWJhY3VzKQorCQliYXNpY19tYWNoaW5lPWFiYWN1cy11bmtub3duCisJCTs7CisJYWRvYmU2OGspCisJCWJhc2ljX21hY2hpbmU9bTY4MDEwLWFkb2JlCisJCW9zPS1zY291dAorCQk7OworCWFsbGlhbnQgfCBmeDgwKQorCQliYXNpY19tYWNoaW5lPWZ4ODAtYWxsaWFudAorCQk7OworCWFsdG9zIHwgYWx0b3MzMDY4KQorCQliYXNpY19tYWNoaW5lPW02OGstYWx0b3MKKwkJOzsKKwlhbTI5aykKKwkJYmFzaWNfbWFjaGluZT1hMjlrLW5vbmUKKwkJb3M9LWJzZAorCQk7OworCWFtZDY0KQorCQliYXNpY19tYWNoaW5lPXg4Nl82NC1wYworCQk7OworCWFtZDY0LSopCisJCWJhc2ljX21hY2hpbmU9eDg2XzY0LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJYW1kYWhsKQorCQliYXNpY19tYWNoaW5lPTU4MC1hbWRhaGwKKwkJb3M9LXN5c3YKKwkJOzsKKwlhbWlnYSB8IGFtaWdhLSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCisJCTs7CisJYW1pZ2FvcyB8IGFtaWdhZG9zKQorCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgorCQlvcz0tYW1pZ2FvcworCQk7OworCWFtaWdhdW5peCB8IGFtaXgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCisJCW9zPS1zeXN2NAorCQk7OworCWFwb2xsbzY4KQorCQliYXNpY19tYWNoaW5lPW02OGstYXBvbGxvCisJCW9zPS1zeXN2CisJCTs7CisJYXBvbGxvNjhic2QpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hcG9sbG8KKwkJb3M9LWJzZAorCQk7OworCWF1eCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFwcGxlCisJCW9zPS1hdXgKKwkJOzsKKwliYWxhbmNlKQorCQliYXNpY19tYWNoaW5lPW5zMzJrLXNlcXVlbnQKKwkJb3M9LWR5bml4CisJCTs7CisJYzkwKQorCQliYXNpY19tYWNoaW5lPWM5MC1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwljb252ZXgtYzEpCisJCWJhc2ljX21hY2hpbmU9YzEtY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljb252ZXgtYzIpCisJCWJhc2ljX21hY2hpbmU9YzItY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljb252ZXgtYzMyKQorCQliYXNpY19tYWNoaW5lPWMzMi1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNvbnZleC1jMzQpCisJCWJhc2ljX21hY2hpbmU9YzM0LWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY29udmV4LWMzOCkKKwkJYmFzaWNfbWFjaGluZT1jMzgtY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljcmF5IHwgajkwKQorCQliYXNpY19tYWNoaW5lPWo5MC1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwljcmF5bnYpCisJCWJhc2ljX21hY2hpbmU9Y3JheW52LWNyYXkKKwkJb3M9LXVuaWNvc21wCisJCTs7CisJY3IxNikKKwkJYmFzaWNfbWFjaGluZT1jcjE2LXVua25vd24KKwkJb3M9LWVsZgorCQk7OworCWNyZHMgfCB1bm9zKQorCQliYXNpY19tYWNoaW5lPW02OGstY3JkcworCQk7OworCWNyaXN2MzIgfCBjcmlzdjMyLSogfCBldHJheGZzKikKKwkJYmFzaWNfbWFjaGluZT1jcmlzdjMyLWF4aXMKKwkJOzsKKwljcmlzIHwgY3Jpcy0qIHwgZXRyYXgqKQorCQliYXNpY19tYWNoaW5lPWNyaXMtYXhpcworCQk7OworCWNyeCkKKwkJYmFzaWNfbWFjaGluZT1jcngtdW5rbm93bgorCQlvcz0tZWxmCisJCTs7CisJZGEzMCB8IGRhMzAtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWRhMzAKKwkJOzsKKwlkZWNzdGF0aW9uIHwgZGVjc3RhdGlvbi0zMTAwIHwgcG1heCB8IHBtYXgtKiB8IHBtaW4gfCBkZWMzMTAwIHwgZGVjc3RhdG4pCisJCWJhc2ljX21hY2hpbmU9bWlwcy1kZWMKKwkJOzsKKwlkZWNzeXN0ZW0xMCogfCBkZWMxMCopCisJCWJhc2ljX21hY2hpbmU9cGRwMTAtZGVjCisJCW9zPS10b3BzMTAKKwkJOzsKKwlkZWNzeXN0ZW0yMCogfCBkZWMyMCopCisJCWJhc2ljX21hY2hpbmU9cGRwMTAtZGVjCisJCW9zPS10b3BzMjAKKwkJOzsKKwlkZWx0YSB8IDMzMDAgfCBtb3Rvcm9sYS0zMzAwIHwgbW90b3JvbGEtZGVsdGEgXAorCSAgICAgIHwgMzMwMC1tb3Rvcm9sYSB8IGRlbHRhLW1vdG9yb2xhKQorCQliYXNpY19tYWNoaW5lPW02OGstbW90b3JvbGEKKwkJOzsKKwlkZWx0YTg4KQorCQliYXNpY19tYWNoaW5lPW04OGstbW90b3JvbGEKKwkJb3M9LXN5c3YzCisJCTs7CisJZGpncHApCisJCWJhc2ljX21hY2hpbmU9aTU4Ni1wYworCQlvcz0tbXNkb3NkamdwcAorCQk7OworCWRweDIwIHwgZHB4MjAtKikKKwkJYmFzaWNfbWFjaGluZT1yczYwMDAtYnVsbAorCQlvcz0tYm9zeAorCQk7OworCWRweDIqIHwgZHB4MiotYnVsbCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWJ1bGwKKwkJb3M9LXN5c3YzCisJCTs7CisJZWJtb24yOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LWVibW9uCisJCTs7CisJZWx4c2kpCisJCWJhc2ljX21hY2hpbmU9ZWx4c2ktZWx4c2kKKwkJb3M9LWJzZAorCQk7OworCWVuY29yZSB8IHVtYXggfCBtbWF4KQorCQliYXNpY19tYWNoaW5lPW5zMzJrLWVuY29yZQorCQk7OworCWVzMTgwMCB8IE9TRTY4ayB8IG9zZTY4ayB8IG9zZSB8IE9TRSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWVyaWNzc29uCisJCW9zPS1vc2UKKwkJOzsKKwlmeDI4MDApCisJCWJhc2ljX21hY2hpbmU9aTg2MC1hbGxpYW50CisJCTs7CisJZ2VuaXgpCisJCWJhc2ljX21hY2hpbmU9bnMzMmstbnMKKwkJOzsKKwlnbWljcm8pCisJCWJhc2ljX21hY2hpbmU9dHJvbi1nbWljcm8KKwkJb3M9LXN5c3YKKwkJOzsKKwlnbzMyKQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJb3M9LWdvMzIKKwkJOzsKKwloMzA1MHIqIHwgaGl1eCopCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1oaXRhY2hpCisJCW9zPS1oaXV4d2UyCisJCTs7CisJaDgzMDBobXMpCisJCWJhc2ljX21hY2hpbmU9aDgzMDAtaGl0YWNoaQorCQlvcz0taG1zCisJCTs7CisJaDgzMDB4cmF5KQorCQliYXNpY19tYWNoaW5lPWg4MzAwLWhpdGFjaGkKKwkJb3M9LXhyYXkKKwkJOzsKKwloODUwMGhtcykKKwkJYmFzaWNfbWFjaGluZT1oODUwMC1oaXRhY2hpCisJCW9zPS1obXMKKwkJOzsKKwloYXJyaXMpCisJCWJhc2ljX21hY2hpbmU9bTg4ay1oYXJyaXMKKwkJb3M9LXN5c3YzCisJCTs7CisJaHAzMDAtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCisJCTs7CisJaHAzMDBic2QpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQlvcz0tYnNkCisJCTs7CisJaHAzMDBocHV4KQorCQliYXNpY19tYWNoaW5lPW02OGstaHAKKwkJb3M9LWhwdXgKKwkJOzsKKwlocDNrOVswLTldWzAtOV0gfCBocDlbMC05XVswLTldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKKwkJOzsKKwlocDlrMlswLTldWzAtOV0gfCBocDlrMzFbMC05XSkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtaHAKKwkJOzsKKwlocDlrM1syLTldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQk7OworCWhwOWs2WzAtOV1bMC05XSB8IGhwNlswLTldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAorCQk7OworCWhwOWs3WzAtNzldWzAtOV0gfCBocDdbMC03OV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCTs7CisJaHA5azc4WzAtOV0gfCBocDc4WzAtOV0pCisJCSMgRklYTUU6IHJlYWxseSBocHBhMi4wLWhwCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQk7OworCWhwOWs4WzY3XTEgfCBocDhbNjddMSB8IGhwOWs4MFsyNF0gfCBocDgwWzI0XSB8IGhwOWs4Wzc4XTkgfCBocDhbNzhdOSB8IGhwOWs4OTMgfCBocDg5MykKKwkJIyBGSVhNRTogcmVhbGx5IGhwcGEyLjAtaHAKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCTs7CisJaHA5azhbMC05XVsxMzY3OV0gfCBocDhbMC05XVsxMzY3OV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQk7OworCWhwOWs4WzAtOV1bMC05XSB8IGhwOFswLTldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAorCQk7OworCWhwcGEtbmV4dCkKKwkJb3M9LW5leHRzdGVwMworCQk7OworCWhwcGFvc2YpCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQlvcz0tb3NmCisJCTs7CisJaHBwcm8pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQlvcz0tcHJvZWxmCisJCTs7CisJaTM3MC1pYm0qIHwgaWJtKikKKwkJYmFzaWNfbWFjaGluZT1pMzcwLWlibQorCQk7OworIyBJJ20gbm90IHN1cmUgd2hhdCAiU3lzdjMyIiBtZWFucy4gIFNob3VsZCB0aGlzIGJlIHN5c3YzLjI/CisJaSo4NnYzMikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCisJCW9zPS1zeXN2MzIKKwkJOzsKKwlpKjg2djQqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKKwkJb3M9LXN5c3Y0CisJCTs7CisJaSo4NnYpCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAorCQlvcz0tc3lzdgorCQk7OworCWkqODZzb2wyKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKKwkJb3M9LXNvbGFyaXMyCisJCTs7CisJaTM4Nm1hY2gpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1tYWNoCisJCW9zPS1tYWNoCisJCTs7CisJaTM4Ni12c3RhIHwgdnN0YSkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KKwkJb3M9LXZzdGEKKwkJOzsKKwlpcmlzIHwgaXJpczRkKQorCQliYXNpY19tYWNoaW5lPW1pcHMtc2dpCisJCWNhc2UgJG9zIGluCisJCSAgICAtaXJpeCopCisJCQk7OworCQkgICAgKikKKwkJCW9zPS1pcml4NAorCQkJOzsKKwkJZXNhYworCQk7OworCWlzaTY4IHwgaXNpKQorCQliYXNpY19tYWNoaW5lPW02OGstaXNpCisJCW9zPS1zeXN2CisJCTs7CisJbTg4ay1vbXJvbiopCisJCWJhc2ljX21hY2hpbmU9bTg4ay1vbXJvbgorCQk7OworCW1hZ251bSB8IG0zMjMwKQorCQliYXNpY19tYWNoaW5lPW1pcHMtbWlwcworCQlvcz0tc3lzdgorCQk7OworCW1lcmxpbikKKwkJYmFzaWNfbWFjaGluZT1uczMyay11dGVrCisJCW9zPS1zeXN2CisJCTs7CisJbWluZ3czMikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCW9zPS1taW5ndzMyCisJCTs7CisJbWluZ3czMmNlKQorCQliYXNpY19tYWNoaW5lPWFybS11bmtub3duCisJCW9zPS1taW5ndzMyY2UKKwkJOzsKKwltaW5pZnJhbWUpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWNvbnZlcmdlbnQKKwkJOzsKKwkqbWludCB8IC1taW50WzAtOV0qIHwgKk1pTlQgfCAqTWlOVFswLTldKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWF0YXJpCisJCW9zPS1taW50CisJCTs7CisJbWlwczMqLSopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbWlwczMvbWlwczY0LydgCisJCTs7CisJbWlwczMqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21pcHMzL21pcHM2NC8nYC11bmtub3duCisJCTs7CisJbW9uaXRvcikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXJvbTY4aworCQlvcz0tY29mZgorCQk7OworCW1vcnBob3MpCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYy11bmtub3duCisJCW9zPS1tb3JwaG9zCisJCTs7CisJbXNkb3MpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQlvcz0tbXNkb3MKKwkJOzsKKwltczEtKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9tczEtL210LS8nYAorCQk7OworCW12cykKKwkJYmFzaWNfbWFjaGluZT1pMzcwLWlibQorCQlvcz0tbXZzCisJCTs7CisJbmNyMzAwMCkKKwkJYmFzaWNfbWFjaGluZT1pNDg2LW5jcgorCQlvcz0tc3lzdjQKKwkJOzsKKwluZXRic2QzODYpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCisJCW9zPS1uZXRic2QKKwkJOzsKKwluZXR3aW5kZXIpCisJCWJhc2ljX21hY2hpbmU9YXJtdjRsLXJlYmVsCisJCW9zPS1saW51eAorCQk7OworCW5ld3MgfCBuZXdzNzAwIHwgbmV3czgwMCB8IG5ld3M5MDApCisJCWJhc2ljX21hY2hpbmU9bTY4ay1zb255CisJCW9zPS1uZXdzb3MKKwkJOzsKKwluZXdzMTAwMCkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMzAtc29ueQorCQlvcz0tbmV3c29zCisJCTs7CisJbmV3cy0zNjAwIHwgcmlzYy1uZXdzKQorCQliYXNpY19tYWNoaW5lPW1pcHMtc29ueQorCQlvcz0tbmV3c29zCisJCTs7CisJbmVjdjcwKQorCQliYXNpY19tYWNoaW5lPXY3MC1uZWMKKwkJb3M9LXN5c3YKKwkJOzsKKwluZXh0IHwgbSotbmV4dCApCisJCWJhc2ljX21hY2hpbmU9bTY4ay1uZXh0CisJCWNhc2UgJG9zIGluCisJCSAgICAtbmV4dHN0ZXAqICkKKwkJCTs7CisJCSAgICAtbnMyKikKKwkJICAgICAgb3M9LW5leHRzdGVwMgorCQkJOzsKKwkJICAgICopCisJCSAgICAgIG9zPS1uZXh0c3RlcDMKKwkJCTs7CisJCWVzYWMKKwkJOzsKKwluaDMwMDApCisJCWJhc2ljX21hY2hpbmU9bTY4ay1oYXJyaXMKKwkJb3M9LWN4dXgKKwkJOzsKKwluaFs0NV0wMDApCisJCWJhc2ljX21hY2hpbmU9bTg4ay1oYXJyaXMKKwkJb3M9LWN4dXgKKwkJOzsKKwluaW5keTk2MCkKKwkJYmFzaWNfbWFjaGluZT1pOTYwLWludGVsCisJCW9zPS1uaW5keQorCQk7OworCW1vbjk2MCkKKwkJYmFzaWNfbWFjaGluZT1pOTYwLWludGVsCisJCW9zPS1tb245NjAKKwkJOzsKKwlub25zdG9wdXgpCisJCWJhc2ljX21hY2hpbmU9bWlwcy1jb21wYXEKKwkJb3M9LW5vbnN0b3B1eAorCQk7OworCW5wMSkKKwkJYmFzaWNfbWFjaGluZT1ucDEtZ291bGQKKwkJOzsKKwluc3ItdGFuZGVtKQorCQliYXNpY19tYWNoaW5lPW5zci10YW5kZW0KKwkJOzsKKwlvcDUwbi0qIHwgb3A2MGMtKikKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQorCQlvcz0tcHJvZWxmCisJCTs7CisJb3BlbnJpc2MgfCBvcGVucmlzYy0qKQorCQliYXNpY19tYWNoaW5lPW9yMzItdW5rbm93bgorCQk7OworCW9zNDAwKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGMtaWJtCisJCW9zPS1vczQwMAorCQk7OworCU9TRTY4MDAwIHwgb3NlNjgwMDApCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWVyaWNzc29uCisJCW9zPS1vc2UKKwkJOzsKKwlvczY4aykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLW5vbmUKKwkJb3M9LW9zNjhrCisJCTs7CisJcGEtaGl0YWNoaSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhpdGFjaGkKKwkJb3M9LWhpdXh3ZTIKKwkJOzsKKwlwYXJhZ29uKQorCQliYXNpY19tYWNoaW5lPWk4NjAtaW50ZWwKKwkJb3M9LW9zZgorCQk7OworCXBiZCkKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy10dGkKKwkJOzsKKwlwYmIpCisJCWJhc2ljX21hY2hpbmU9bTY4ay10dGkKKwkJOzsKKwlwYzUzMiB8IHBjNTMyLSopCisJCWJhc2ljX21hY2hpbmU9bnMzMmstcGM1MzIKKwkJOzsKKwlwYzk4KQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJOzsKKwlwYzk4LSopCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBlbnRpdW0gfCBwNSB8IGs1IHwgazYgfCBuZXhnZW4gfCB2aWFjMykKKwkJYmFzaWNfbWFjaGluZT1pNTg2LXBjCisJCTs7CisJcGVudGl1bXBybyB8IHA2IHwgNng4NiB8IGF0aGxvbiB8IGF0aGxvbl8qKQorCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKKwkJOzsKKwlwZW50aXVtaWkgfCBwZW50aXVtMiB8IHBlbnRpdW1paWkgfCBwZW50aXVtMykKKwkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCisJCTs7CisJcGVudGl1bTQpCisJCWJhc2ljX21hY2hpbmU9aTc4Ni1wYworCQk7OworCXBlbnRpdW0tKiB8IHA1LSogfCBrNS0qIHwgazYtKiB8IG5leGdlbi0qIHwgdmlhYzMtKikKKwkJYmFzaWNfbWFjaGluZT1pNTg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcGVudGl1bXByby0qIHwgcDYtKiB8IDZ4ODYtKiB8IGF0aGxvbi0qKQorCQliYXNpY19tYWNoaW5lPWk2ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwZW50aXVtaWktKiB8IHBlbnRpdW0yLSogfCBwZW50aXVtaWlpLSogfCBwZW50aXVtMy0qKQorCQliYXNpY19tYWNoaW5lPWk2ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwZW50aXVtNC0qKQorCQliYXNpY19tYWNoaW5lPWk3ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwbikKKwkJYmFzaWNfbWFjaGluZT1wbi1nb3VsZAorCQk7OworCXBvd2VyKQliYXNpY19tYWNoaW5lPXBvd2VyLWlibQorCQk7OworCXBwYykJYmFzaWNfbWFjaGluZT1wb3dlcnBjLXVua25vd24KKwkJOzsKKwlwcGMtKikJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcHBjbGUgfCBwb3dlcnBjbGl0dGxlIHwgcHBjLWxlIHwgcG93ZXJwYy1saXR0bGUpCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwY2xlLXVua25vd24KKwkJOzsKKwlwcGNsZS0qIHwgcG93ZXJwY2xpdHRsZS0qKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGNsZS1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBwYzY0KQliYXNpY19tYWNoaW5lPXBvd2VycGM2NC11bmtub3duCisJCTs7CisJcHBjNjQtKikgYmFzaWNfbWFjaGluZT1wb3dlcnBjNjQtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwcGM2NGxlIHwgcG93ZXJwYzY0bGl0dGxlIHwgcHBjNjQtbGUgfCBwb3dlcnBjNjQtbGl0dGxlKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGM2NGxlLXVua25vd24KKwkJOzsKKwlwcGM2NGxlLSogfCBwb3dlcnBjNjRsaXR0bGUtKikKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjNjRsZS1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBzMikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LWlibQorCQk7OworCXB3MzIpCisJCWJhc2ljX21hY2hpbmU9aTU4Ni11bmtub3duCisJCW9zPS1wdzMyCisJCTs7CisJcmRvcykKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCW9zPS1yZG9zCisJCTs7CisJcm9tNjhrKQorCQliYXNpY19tYWNoaW5lPW02OGstcm9tNjhrCisJCW9zPS1jb2ZmCisJCTs7CisJcm1bNDZdMDApCisJCWJhc2ljX21hY2hpbmU9bWlwcy1zaWVtZW5zCisJCTs7CisJcnRwYyB8IHJ0cGMtKikKKwkJYmFzaWNfbWFjaGluZT1yb21wLWlibQorCQk7OworCXMzOTAgfCBzMzkwLSopCisJCWJhc2ljX21hY2hpbmU9czM5MC1pYm0KKwkJOzsKKwlzMzkweCB8IHMzOTB4LSopCisJCWJhc2ljX21hY2hpbmU9czM5MHgtaWJtCisJCTs7CisJc2EyOTIwMCkKKwkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAorCQlvcz0tdWRpCisJCTs7CisJc2IxKQorCQliYXNpY19tYWNoaW5lPW1pcHNpc2E2NHNiMS11bmtub3duCisJCTs7CisJc2IxZWwpCisJCWJhc2ljX21hY2hpbmU9bWlwc2lzYTY0c2IxZWwtdW5rbm93bgorCQk7OworCXNkZSkKKwkJYmFzaWNfbWFjaGluZT1taXBzaXNhMzItc2RlCisJCW9zPS1lbGYKKwkJOzsKKwlzZWkpCisJCWJhc2ljX21hY2hpbmU9bWlwcy1zZWkKKwkJb3M9LXNlaXV4CisJCTs7CisJc2VxdWVudCkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXNlcXVlbnQKKwkJOzsKKwlzaCkKKwkJYmFzaWNfbWFjaGluZT1zaC1oaXRhY2hpCisJCW9zPS1obXMKKwkJOzsKKwlzaDVlbCkKKwkJYmFzaWNfbWFjaGluZT1zaDVsZS11bmtub3duCisJCTs7CisJc2g2NCkKKwkJYmFzaWNfbWFjaGluZT1zaDY0LXVua25vd24KKwkJOzsKKwlzcGFyY2xpdGUtd3JzIHwgc2ltc28td3JzKQorCQliYXNpY19tYWNoaW5lPXNwYXJjbGl0ZS13cnMKKwkJb3M9LXZ4d29ya3MKKwkJOzsKKwlzcHM3KQorCQliYXNpY19tYWNoaW5lPW02OGstYnVsbAorCQlvcz0tc3lzdjIKKwkJOzsKKwlzcHVyKQorCQliYXNpY19tYWNoaW5lPXNwdXItdW5rbm93bgorCQk7OworCXN0MjAwMCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXRhbmRlbQorCQk7OworCXN0cmF0dXMpCisJCWJhc2ljX21hY2hpbmU9aTg2MC1zdHJhdHVzCisJCW9zPS1zeXN2NAorCQk7OworCXN1bjIpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgorCQk7OworCXN1bjJvczMpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgorCQlvcz0tc3Vub3MzCisJCTs7CisJc3VuMm9zNCkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCisJCW9zPS1zdW5vczQKKwkJOzsKKwlzdW4zb3MzKQorCQliYXNpY19tYWNoaW5lPW02OGstc3VuCisJCW9zPS1zdW5vczMKKwkJOzsKKwlzdW4zb3M0KQorCQliYXNpY19tYWNoaW5lPW02OGstc3VuCisJCW9zPS1zdW5vczQKKwkJOzsKKwlzdW40b3MzKQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgorCQlvcz0tc3Vub3MzCisJCTs7CisJc3VuNG9zNCkKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJb3M9LXN1bm9zNAorCQk7OworCXN1bjRzb2wyKQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgorCQlvcz0tc29sYXJpczIKKwkJOzsKKwlzdW4zIHwgc3VuMy0qKQorCQliYXNpY19tYWNoaW5lPW02OGstc3VuCisJCTs7CisJc3VuNCkKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJOzsKKwlzdW4zODYgfCBzdW4zODZpIHwgcm9hZHJ1bm5lcikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXN1bgorCQk7OworCXN2MSkKKwkJYmFzaWNfbWFjaGluZT1zdjEtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJc3ltbWV0cnkpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1zZXF1ZW50CisJCW9zPS1keW5peAorCQk7OworCXQzZSkKKwkJYmFzaWNfbWFjaGluZT1hbHBoYWV2NS1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwl0OTApCisJCWJhc2ljX21hY2hpbmU9dDkwLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCXRpYzU0eCB8IGM1NHgqKQorCQliYXNpY19tYWNoaW5lPXRpYzU0eC11bmtub3duCisJCW9zPS1jb2ZmCisJCTs7CisJdGljNTV4IHwgYzU1eCopCisJCWJhc2ljX21hY2hpbmU9dGljNTV4LXVua25vd24KKwkJb3M9LWNvZmYKKwkJOzsKKwl0aWM2eCB8IGM2eCopCisJCWJhc2ljX21hY2hpbmU9dGljNngtdW5rbm93bgorCQlvcz0tY29mZgorCQk7OworCXR4MzkpCisJCWJhc2ljX21hY2hpbmU9bWlwc3R4MzktdW5rbm93bgorCQk7OworCXR4MzllbCkKKwkJYmFzaWNfbWFjaGluZT1taXBzdHgzOWVsLXVua25vd24KKwkJOzsKKwl0b2FkMSkKKwkJYmFzaWNfbWFjaGluZT1wZHAxMC14a2wKKwkJb3M9LXRvcHMyMAorCQk7OworCXRvd2VyIHwgdG93ZXItMzIpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1uY3IKKwkJOzsKKwl0cGYpCisJCWJhc2ljX21hY2hpbmU9czM5MHgtaWJtCisJCW9zPS10cGYKKwkJOzsKKwl1ZGkyOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LXVkaQorCQk7OworCXVsdHJhMykKKwkJYmFzaWNfbWFjaGluZT1hMjlrLW55dQorCQlvcz0tc3ltMQorCQk7OworCXY4MTAgfCBuZWN2ODEwKQorCQliYXNpY19tYWNoaW5lPXY4MTAtbmVjCisJCW9zPS1ub25lCisJCTs7CisJdmF4dikKKwkJYmFzaWNfbWFjaGluZT12YXgtZGVjCisJCW9zPS1zeXN2CisJCTs7CisJdm1zKQorCQliYXNpY19tYWNoaW5lPXZheC1kZWMKKwkJb3M9LXZtcworCQk7OworCXZwcCp8dnh8dngtKikKKwkJYmFzaWNfbWFjaGluZT1mMzAxLWZ1aml0c3UKKwkJOzsKKwl2eHdvcmtzOTYwKQorCQliYXNpY19tYWNoaW5lPWk5NjAtd3JzCisJCW9zPS12eHdvcmtzCisJCTs7CisJdnh3b3JrczY4KQorCQliYXNpY19tYWNoaW5lPW02OGstd3JzCisJCW9zPS12eHdvcmtzCisJCTs7CisJdnh3b3JrczI5aykKKwkJYmFzaWNfbWFjaGluZT1hMjlrLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXc2NSopCisJCWJhc2ljX21hY2hpbmU9dzY1LXdkYworCQlvcz0tbm9uZQorCQk7OworCXc4OWstKikKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLXdpbmJvbmQKKwkJb3M9LXByb2VsZgorCQk7OworCXhib3gpCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1wYworCQlvcz0tbWluZ3czMgorCQk7OworCXhwcyB8IHhwczEwMCkKKwkJYmFzaWNfbWFjaGluZT14cHMxMDAtaG9uZXl3ZWxsCisJCTs7CisJeW1wKQorCQliYXNpY19tYWNoaW5lPXltcC1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwl6OGstKi1jb2ZmKQorCQliYXNpY19tYWNoaW5lPXo4ay11bmtub3duCisJCW9zPS1zaW0KKwkJOzsKKwlub25lKQorCQliYXNpY19tYWNoaW5lPW5vbmUtbm9uZQorCQlvcz0tbm9uZQorCQk7OworCisjIEhlcmUgd2UgaGFuZGxlIHRoZSBkZWZhdWx0IG1hbnVmYWN0dXJlciBvZiBjZXJ0YWluIENQVSB0eXBlcy4gIEl0IGlzIGluCisjIHNvbWUgY2FzZXMgdGhlIG9ubHkgbWFudWZhY3R1cmVyLCBpbiBvdGhlcnMsIGl0IGlzIHRoZSBtb3N0IHBvcHVsYXIuCisJdzg5aykKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLXdpbmJvbmQKKwkJOzsKKwlvcDUwbikKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQorCQk7OworCW9wNjBjKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCisJCTs7CisJcm9tcCkKKwkJYmFzaWNfbWFjaGluZT1yb21wLWlibQorCQk7OworCW1taXgpCisJCWJhc2ljX21hY2hpbmU9bW1peC1rbnV0aAorCQk7OworCXJzNjAwMCkKKwkJYmFzaWNfbWFjaGluZT1yczYwMDAtaWJtCisJCTs7CisJdmF4KQorCQliYXNpY19tYWNoaW5lPXZheC1kZWMKKwkJOzsKKwlwZHAxMCkKKwkJIyB0aGVyZSBhcmUgbWFueSBjbG9uZXMsIHNvIERFQyBpcyBub3QgYSBzYWZlIGJldAorCQliYXNpY19tYWNoaW5lPXBkcDEwLXVua25vd24KKwkJOzsKKwlwZHAxMSkKKwkJYmFzaWNfbWFjaGluZT1wZHAxMS1kZWMKKwkJOzsKKwl3ZTMyaykKKwkJYmFzaWNfbWFjaGluZT13ZTMyay1hdHQKKwkJOzsKKwlzaFsxMjM0XSB8IHNoWzI0XWEgfCBzaFszNF1lYiB8IHNoWzEyMzRdbGUgfCBzaFsyM11lbGUpCisJCWJhc2ljX21hY2hpbmU9c2gtdW5rbm93bgorCQk7OworCXNwYXJjIHwgc3BhcmN2OCB8IHNwYXJjdjkgfCBzcGFyY3Y5YiB8IHNwYXJjdjl2KQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgorCQk7OworCWN5ZHJhKQorCQliYXNpY19tYWNoaW5lPWN5ZHJhLWN5ZHJvbWUKKwkJOzsKKwlvcmlvbikKKwkJYmFzaWNfbWFjaGluZT1vcmlvbi1oaWdobGV2ZWwKKwkJOzsKKwlvcmlvbjEwNSkKKwkJYmFzaWNfbWFjaGluZT1jbGlwcGVyLWhpZ2hsZXZlbAorCQk7OworCW1hYyB8IG1wdyB8IG1hYy1tcHcpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hcHBsZQorCQk7OworCXBtYWMgfCBwbWFjLW1wdykKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWFwcGxlCisJCTs7CisJKi11bmtub3duKQorCQkjIE1ha2Ugc3VyZSB0byBtYXRjaCBhbiBhbHJlYWR5LWNhbm9uaWNhbGl6ZWQgbWFjaGluZSBuYW1lLgorCQk7OworCSopCisJCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogbWFjaGluZSBcYCRiYXNpY19tYWNoaW5lXCcgbm90IHJlY29nbml6ZWQgMT4mMgorCQlleGl0IDEKKwkJOzsKK2VzYWMKKworIyBIZXJlIHdlIGNhbm9uaWNhbGl6ZSBjZXJ0YWluIGFsaWFzZXMgZm9yIG1hbnVmYWN0dXJlcnMuCitjYXNlICRiYXNpY19tYWNoaW5lIGluCisJKi1kaWdpdGFsKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9kaWdpdGFsLiovZGVjLydgCisJCTs7CisJKi1jb21tb2RvcmUqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL2NvbW1vZG9yZS4qL2NibS8nYAorCQk7OworCSopCisJCTs7Citlc2FjCisKKyMgRGVjb2RlIG1hbnVmYWN0dXJlci1zcGVjaWZpYyBhbGlhc2VzIGZvciBjZXJ0YWluIG9wZXJhdGluZyBzeXN0ZW1zLgorCitpZiBbIHgiJG9zIiAhPSB4IiIgXQordGhlbgorY2FzZSAkb3MgaW4KKyAgICAgICAgIyBGaXJzdCBtYXRjaCBzb21lIHN5c3RlbSB0eXBlIGFsaWFzZXMKKyAgICAgICAgIyB0aGF0IG1pZ2h0IGdldCBjb25mdXNlZCB3aXRoIHZhbGlkIHN5c3RlbSB0eXBlcy4KKwkjIC1zb2xhcmlzKiBpcyBhIGJhc2ljIHN5c3RlbSB0eXBlLCB3aXRoIHRoaXMgb25lIGV4Y2VwdGlvbi4KKwktc29sYXJpczEgfCAtc29sYXJpczEuKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHNvbGFyaXMxfHN1bm9zNHwnYAorCQk7OworCS1zb2xhcmlzKQorCQlvcz0tc29sYXJpczIKKwkJOzsKKwktc3ZyNCopCisJCW9zPS1zeXN2NAorCQk7OworCS11bml4d2FyZSopCisJCW9zPS1zeXN2NC4ydXcKKwkJOzsKKwktZ251L2xpbnV4KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfGdudS9saW51eHxsaW51eC1nbnV8J2AKKwkJOzsKKwkjIEZpcnN0IGFjY2VwdCB0aGUgYmFzaWMgc3lzdGVtIHR5cGVzLgorCSMgVGhlIHBvcnRhYmxlIHN5c3RlbXMgY29tZXMgZmlyc3QuCisJIyBFYWNoIGFsdGVybmF0aXZlIE1VU1QgRU5EIElOIEEgKiwgdG8gbWF0Y2ggYSB2ZXJzaW9uIG51bWJlci4KKwkjIC1zeXN2KiBpcyBub3QgaGVyZSBiZWNhdXNlIGl0IGNvbWVzIGxhdGVyLCBhZnRlciBzeXN2cjQuCisJLWdudSogfCAtYnNkKiB8IC1tYWNoKiB8IC1taW5peCogfCAtZ2VuaXgqIHwgLXVsdHJpeCogfCAtaXJpeCogXAorCSAgICAgIHwgLSp2bXMqIHwgLXNjbyogfCAtZXNpeCogfCAtaXNjKiB8IC1haXgqIHwgLXN1bm9zIHwgLXN1bm9zWzM0XSpcCisJICAgICAgfCAtaHB1eCogfCAtdW5vcyogfCAtb3NmKiB8IC1sdW5hKiB8IC1kZ3V4KiB8IC1zb2xhcmlzKiB8IC1zeW0qIFwKKwkgICAgICB8IC1hbWlnYW9zKiB8IC1hbWlnYWRvcyogfCAtbXNkb3MqIHwgLW5ld3NvcyogfCAtdW5pY29zKiB8IC1hb2YqIFwKKwkgICAgICB8IC1hb3MqIFwKKwkgICAgICB8IC1uaW5keSogfCAtdnhzaW0qIHwgLXZ4d29ya3MqIHwgLWVibW9uKiB8IC1obXMqIHwgLW12cyogXAorCSAgICAgIHwgLWNsaXgqIHwgLXJpc2NvcyogfCAtdW5pcGx1cyogfCAtaXJpcyogfCAtcnR1KiB8IC14ZW5peCogXAorCSAgICAgIHwgLWhpdXgqIHwgLTM4NmJzZCogfCAta25ldGJzZCogfCAtbWlyYnNkKiB8IC1uZXRic2QqIFwKKwkgICAgICB8IC1vcGVuYnNkKiB8IC1zb2xpZGJzZCogXAorCSAgICAgIHwgLWVra29ic2QqIHwgLWtmcmVlYnNkKiB8IC1mcmVlYnNkKiB8IC1yaXNjaXgqIHwgLWx5bnhvcyogXAorCSAgICAgIHwgLWJvc3gqIHwgLW5leHRzdGVwKiB8IC1jeHV4KiB8IC1hb3V0KiB8IC1lbGYqIHwgLW9hYmkqIFwKKwkgICAgICB8IC1wdHgqIHwgLWNvZmYqIHwgLWVjb2ZmKiB8IC13aW5udCogfCAtZG9tYWluKiB8IC12c3RhKiBcCisJICAgICAgfCAtdWRpKiB8IC1lYWJpKiB8IC1saXRlcyogfCAtaWVlZSogfCAtZ28zMiogfCAtYXV4KiBcCisJICAgICAgfCAtY2hvcnVzb3MqIHwgLWNob3J1c3JkYiogXAorCSAgICAgIHwgLWN5Z3dpbiogfCAtcGUqIHwgLXBzb3MqIHwgLW1vc3MqIHwgLXByb2VsZiogfCAtcnRlbXMqIFwKKwkgICAgICB8IC1taW5ndzMyKiB8IC1saW51eC1nbnUqIHwgLWxpbnV4LW5ld2xpYiogfCAtbGludXgtdWNsaWJjKiBcCisJICAgICAgfCAtdXhwdiogfCAtYmVvcyogfCAtbXBlaXgqIHwgLXVkayogXAorCSAgICAgIHwgLWludGVyaXgqIHwgLXV3aW4qIHwgLW1rcyogfCAtcmhhcHNvZHkqIHwgLWRhcndpbiogfCAtb3BlbmVkKiBcCisJICAgICAgfCAtb3BlbnN0ZXAqIHwgLW9za2l0KiB8IC1jb25peCogfCAtcHczMiogfCAtbm9uc3RvcHV4KiBcCisJICAgICAgfCAtc3Rvcm0tY2hhb3MqIHwgLXRvcHMxMCogfCAtdGVuZXgqIHwgLXRvcHMyMCogfCAtaXRzKiBcCisJICAgICAgfCAtb3MyKiB8IC12b3MqIHwgLXBhbG1vcyogfCAtdWNsaW51eCogfCAtbnVjbGV1cyogXAorCSAgICAgIHwgLW1vcnBob3MqIHwgLXN1cGVydXgqIHwgLXJ0bWsqIHwgLXJ0bWstbm92YSogfCAtd2luZGlzcyogXAorCSAgICAgIHwgLXBvd2VybWF4KiB8IC1kbml4KiB8IC1ueDYgfCAtbng3IHwgLXNlaSogfCAtZHJhZ29uZmx5KiBcCisJICAgICAgfCAtc2t5b3MqIHwgLWhhaWt1KiB8IC1yZG9zKiB8IC10b3BwZXJzKiB8IC1kcm9wcyopCisJIyBSZW1lbWJlciwgZWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiAqLCB0byBtYXRjaCBhIHZlcnNpb24gbnVtYmVyLgorCQk7OworCS1xbngqKQorCQljYXNlICRiYXNpY19tYWNoaW5lIGluCisJCSAgICB4ODYtKiB8IGkqODYtKikKKwkJCTs7CisJCSAgICAqKQorCQkJb3M9LW50byRvcworCQkJOzsKKwkJZXNhYworCQk7OworCS1udG8tcW54KikKKwkJOzsKKwktbnRvKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfG50b3xudG8tcW54fCdgCisJCTs7CisJLXNpbSB8IC1lczE4MDAqIHwgLWhtcyogfCAteHJheSB8IC1vczY4ayogfCAtbm9uZSogfCAtdjg4ciogXAorCSAgICAgIHwgLXdpbmRvd3MqIHwgLW9zeCB8IC1hYnVnIHwgLW5ldHdhcmUqIHwgLW9zOSogfCAtYmVvcyogfCAtaGFpa3UqIFwKKwkgICAgICB8IC1tYWNvcyogfCAtbXB3KiB8IC1tYWdpYyogfCAtbW1peHdhcmUqIHwgLW1vbjk2MCogfCAtbG5ld3MqKQorCQk7OworCS1tYWMqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bWFjfG1hY29zfCdgCisJCTs7CisJLWxpbnV4LWRpZXRsaWJjKQorCQlvcz0tbGludXgtZGlldGxpYmMKKwkJOzsKKwktbGludXgqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bGludXh8bGludXgtZ251fCdgCisJCTs7CisJLXN1bm9zNSopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzdW5vczV8c29sYXJpczJ8J2AKKwkJOzsKKwktc3Vub3M2KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHN1bm9zNnxzb2xhcmlzM3wnYAorCQk7OworCS1vcGVuZWQqKQorCQlvcz0tb3BlbmVkaXRpb24KKwkJOzsKKyAgICAgICAgLW9zNDAwKikKKwkJb3M9LW9zNDAwCisJCTs7CisJLXdpbmNlKikKKwkJb3M9LXdpbmNlCisJCTs7CisJLW9zZnJvc2UqKQorCQlvcz0tb3Nmcm9zZQorCQk7OworCS1vc2YqKQorCQlvcz0tb3NmCisJCTs7CisJLXV0ZWsqKQorCQlvcz0tYnNkCisJCTs7CisJLWR5bml4KikKKwkJb3M9LWJzZAorCQk7OworCS1hY2lzKikKKwkJb3M9LWFvcworCQk7OworCS1hdGhlb3MqKQorCQlvcz0tYXRoZW9zCisJCTs7CisJLXN5bGxhYmxlKikKKwkJb3M9LXN5bGxhYmxlCisJCTs7CisJLTM4NmJzZCkKKwkJb3M9LWJzZAorCQk7OworCS1jdGl4KiB8IC11dHMqKQorCQlvcz0tc3lzdgorCQk7OworCS1ub3ZhKikKKwkJb3M9LXJ0bWstbm92YQorCQk7OworCS1uczIgKQorCQlvcz0tbmV4dHN0ZXAyCisJCTs7CisJLW5zayopCisJCW9zPS1uc2sKKwkJOzsKKwkjIFByZXNlcnZlIHRoZSB2ZXJzaW9uIG51bWJlciBvZiBzaW5peDUuCisJLXNpbml4NS4qKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c2luaXh8c3lzdnwnYAorCQk7OworCS1zaW5peCopCisJCW9zPS1zeXN2NAorCQk7OworICAgICAgICAtdHBmKikKKwkJb3M9LXRwZgorCQk7OworCS10cml0b24qKQorCQlvcz0tc3lzdjMKKwkJOzsKKwktb3NzKikKKwkJb3M9LXN5c3YzCisJCTs7CisJLXN2cjQpCisJCW9zPS1zeXN2NAorCQk7OworCS1zdnIzKQorCQlvcz0tc3lzdjMKKwkJOzsKKwktc3lzdnI0KQorCQlvcz0tc3lzdjQKKwkJOzsKKwkjIFRoaXMgbXVzdCBjb21lIGFmdGVyIC1zeXN2cjQuCisJLXN5c3YqKQorCQk7OworCS1vc2UqKQorCQlvcz0tb3NlCisJCTs7CisJLWVzMTgwMCopCisJCW9zPS1vc2UKKwkJOzsKKwkteGVuaXgpCisJCW9zPS14ZW5peAorCQk7OworCS0qbWludCB8IC1taW50WzAtOV0qIHwgLSpNaU5UIHwgLU1pTlRbMC05XSopCisJCW9zPS1taW50CisJCTs7CisJLWFyb3MqKQorCQlvcz0tYXJvcworCQk7OworCS1rYW9zKikKKwkJb3M9LWthb3MKKwkJOzsKKwktenZtb2UpCisJCW9zPS16dm1vZQorCQk7OworCS1ub25lKQorCQk7OworCSopCisJCSMgR2V0IHJpZCBvZiB0aGUgYC0nIGF0IHRoZSBiZWdpbm5pbmcgb2YgJG9zLgorCQlvcz1gZWNobyAkb3MgfCBzZWQgJ3MvW14tXSotLy8nYAorCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IHN5c3RlbSBcYCRvc1wnIG5vdCByZWNvZ25pemVkIDE+JjIKKwkJZXhpdCAxCisJCTs7Citlc2FjCitlbHNlCisKKyMgSGVyZSB3ZSBoYW5kbGUgdGhlIGRlZmF1bHQgb3BlcmF0aW5nIHN5c3RlbXMgdGhhdCBjb21lIHdpdGggdmFyaW91cyBtYWNoaW5lcy4KKyMgVGhlIHZhbHVlIHNob3VsZCBiZSB3aGF0IHRoZSB2ZW5kb3IgY3VycmVudGx5IHNoaXBzIG91dCB0aGUgZG9vciB3aXRoIHRoZWlyCisjIG1hY2hpbmUgb3IgcHV0IGFub3RoZXIgd2F5LCB0aGUgbW9zdCBwb3B1bGFyIG9zIHByb3ZpZGVkIHdpdGggdGhlIG1hY2hpbmUuCisKKyMgTm90ZSB0aGF0IGlmIHlvdSdyZSBnb2luZyB0byB0cnkgdG8gbWF0Y2ggIi1NQU5VRkFDVFVSRVIiIGhlcmUgKHNheSwKKyMgIi1zdW4iKSwgdGhlbiB5b3UgaGF2ZSB0byB0ZWxsIHRoZSBjYXNlIHN0YXRlbWVudCB1cCB0b3dhcmRzIHRoZSB0b3AKKyMgdGhhdCBNQU5VRkFDVFVSRVIgaXNuJ3QgYW4gb3BlcmF0aW5nIHN5c3RlbS4gIE90aGVyd2lzZSwgY29kZSBhYm92ZQorIyB3aWxsIHNpZ25hbCBhbiBlcnJvciBzYXlpbmcgdGhhdCBNQU5VRkFDVFVSRVIgaXNuJ3QgYW4gb3BlcmF0aW5nCisjIHN5c3RlbSwgYW5kIHdlJ2xsIG5ldmVyIGdldCB0byB0aGlzIHBvaW50LgorCitjYXNlICRiYXNpY19tYWNoaW5lIGluCisgICAgICAgIHNjb3JlLSopCisJCW9zPS1lbGYKKwkJOzsKKyAgICAgICAgc3B1LSopCisJCW9zPS1lbGYKKwkJOzsKKwkqLWFjb3JuKQorCQlvcz0tcmlzY2l4MS4yCisJCTs7CisJYXJtKi1yZWJlbCkKKwkJb3M9LWxpbnV4CisJCTs7CisJYXJtKi1zZW1pKQorCQlvcz0tYW91dAorCQk7OworICAgICAgICBjNHgtKiB8IHRpYzR4LSopCisgICAgICAgIAlvcz0tY29mZgorCQk7OworCSMgVGhpcyBtdXN0IGNvbWUgYmVmb3JlIHRoZSAqLWRlYyBlbnRyeS4KKwlwZHAxMC0qKQorCQlvcz0tdG9wczIwCisJCTs7CisJcGRwMTEtKikKKwkJb3M9LW5vbmUKKwkJOzsKKwkqLWRlYyB8IHZheC0qKQorCQlvcz0tdWx0cml4NC4yCisJCTs7CisJbTY4Ki1hcG9sbG8pCisJCW9zPS1kb21haW4KKwkJOzsKKwlpMzg2LXN1bikKKwkJb3M9LXN1bm9zNC4wLjIKKwkJOzsKKwltNjgwMDAtc3VuKQorCQlvcz0tc3Vub3MzCisJCSMgVGhpcyBhbHNvIGV4aXN0cyBpbiB0aGUgY29uZmlndXJlIHByb2dyYW0sIGJ1dCB3YXMgbm90IHRoZQorCQkjIGRlZmF1bHQuCisJCSMgb3M9LXN1bm9zNAorCQk7OworCW02OCotY2lzY28pCisJCW9zPS1hb3V0CisJCTs7CisgICAgICAgIG1lcC0qKQorCQlvcz0tZWxmCisJCTs7CisJbWlwcyotY2lzY28pCisJCW9zPS1lbGYKKwkJOzsKKwltaXBzKi0qKQorCQlvcz0tZWxmCisJCTs7CisJb3IzMi0qKQorCQlvcz0tY29mZgorCQk7OworCSotdHRpKQkjIG11c3QgYmUgYmVmb3JlIHNwYXJjIGVudHJ5IG9yIHdlIGdldCB0aGUgd3Jvbmcgb3MuCisJCW9zPS1zeXN2MworCQk7OworCXNwYXJjLSogfCAqLXN1bikKKwkJb3M9LXN1bm9zNC4xLjEKKwkJOzsKKwkqLWJlKQorCQlvcz0tYmVvcworCQk7OworCSotaGFpa3UpCisJCW9zPS1oYWlrdQorCQk7OworCSotaWJtKQorCQlvcz0tYWl4CisJCTs7CisgICAgCSota251dGgpCisJCW9zPS1tbWl4d2FyZQorCQk7OworCSotd2VjKQorCQlvcz0tcHJvZWxmCisJCTs7CisJKi13aW5ib25kKQorCQlvcz0tcHJvZWxmCisJCTs7CisJKi1va2kpCisJCW9zPS1wcm9lbGYKKwkJOzsKKwkqLWhwKQorCQlvcz0taHB1eAorCQk7OworCSotaGl0YWNoaSkKKwkJb3M9LWhpdXgKKwkJOzsKKwlpODYwLSogfCAqLWF0dCB8ICotbmNyIHwgKi1hbHRvcyB8ICotbW90b3JvbGEgfCAqLWNvbnZlcmdlbnQpCisJCW9zPS1zeXN2CisJCTs7CisJKi1jYm0pCisJCW9zPS1hbWlnYW9zCisJCTs7CisJKi1kZykKKwkJb3M9LWRndXgKKwkJOzsKKwkqLWRvbHBoaW4pCisJCW9zPS1zeXN2MworCQk7OworCW02OGstY2N1cikKKwkJb3M9LXJ0dQorCQk7OworCW04OGstb21yb24qKQorCQlvcz0tbHVuYQorCQk7OworCSotbmV4dCApCisJCW9zPS1uZXh0c3RlcAorCQk7OworCSotc2VxdWVudCkKKwkJb3M9LXB0eAorCQk7OworCSotY3JkcykKKwkJb3M9LXVub3MKKwkJOzsKKwkqLW5zKQorCQlvcz0tZ2VuaXgKKwkJOzsKKwlpMzcwLSopCisJCW9zPS1tdnMKKwkJOzsKKwkqLW5leHQpCisJCW9zPS1uZXh0c3RlcDMKKwkJOzsKKwkqLWdvdWxkKQorCQlvcz0tc3lzdgorCQk7OworCSotaGlnaGxldmVsKQorCQlvcz0tYnNkCisJCTs7CisJKi1lbmNvcmUpCisJCW9zPS1ic2QKKwkJOzsKKwkqLXNnaSkKKwkJb3M9LWlyaXgKKwkJOzsKKwkqLXNpZW1lbnMpCisJCW9zPS1zeXN2NAorCQk7OworCSotbWFzc2NvbXApCisJCW9zPS1ydHUKKwkJOzsKKwlmMzBbMDFdLWZ1aml0c3UgfCBmNzAwLWZ1aml0c3UpCisJCW9zPS11eHB2CisJCTs7CisJKi1yb202OGspCisJCW9zPS1jb2ZmCisJCTs7CisJKi0qYnVnKQorCQlvcz0tY29mZgorCQk7OworCSotYXBwbGUpCisJCW9zPS1tYWNvcworCQk7OworCSotYXRhcmkqKQorCQlvcz0tbWludAorCQk7OworCSopCisJCW9zPS1ub25lCisJCTs7Citlc2FjCitmaQorCisjIEhlcmUgd2UgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGtub3cgdGhlIG9zLCBhbmQgdGhlIENQVSB0eXBlLCBidXQgbm90IHRoZQorIyBtYW51ZmFjdHVyZXIuICBXZSBwaWNrIHRoZSBsb2dpY2FsIG1hbnVmYWN0dXJlci4KK3ZlbmRvcj11bmtub3duCitjYXNlICRiYXNpY19tYWNoaW5lIGluCisJKi11bmtub3duKQorCQljYXNlICRvcyBpbgorCQkJLXJpc2NpeCopCisJCQkJdmVuZG9yPWFjb3JuCisJCQkJOzsKKwkJCS1zdW5vcyopCisJCQkJdmVuZG9yPXN1bgorCQkJCTs7CisJCQktYWl4KikKKwkJCQl2ZW5kb3I9aWJtCisJCQkJOzsKKwkJCS1iZW9zKikKKwkJCQl2ZW5kb3I9YmUKKwkJCQk7OworCQkJLWhwdXgqKQorCQkJCXZlbmRvcj1ocAorCQkJCTs7CisJCQktbXBlaXgqKQorCQkJCXZlbmRvcj1ocAorCQkJCTs7CisJCQktaGl1eCopCisJCQkJdmVuZG9yPWhpdGFjaGkKKwkJCQk7OworCQkJLXVub3MqKQorCQkJCXZlbmRvcj1jcmRzCisJCQkJOzsKKwkJCS1kZ3V4KikKKwkJCQl2ZW5kb3I9ZGcKKwkJCQk7OworCQkJLWx1bmEqKQorCQkJCXZlbmRvcj1vbXJvbgorCQkJCTs7CisJCQktZ2VuaXgqKQorCQkJCXZlbmRvcj1ucworCQkJCTs7CisJCQktbXZzKiB8IC1vcGVuZWQqKQorCQkJCXZlbmRvcj1pYm0KKwkJCQk7OworCQkJLW9zNDAwKikKKwkJCQl2ZW5kb3I9aWJtCisJCQkJOzsKKwkJCS1wdHgqKQorCQkJCXZlbmRvcj1zZXF1ZW50CisJCQkJOzsKKwkJCS10cGYqKQorCQkJCXZlbmRvcj1pYm0KKwkJCQk7OworCQkJLXZ4c2ltKiB8IC12eHdvcmtzKiB8IC13aW5kaXNzKikKKwkJCQl2ZW5kb3I9d3JzCisJCQkJOzsKKwkJCS1hdXgqKQorCQkJCXZlbmRvcj1hcHBsZQorCQkJCTs7CisJCQktaG1zKikKKwkJCQl2ZW5kb3I9aGl0YWNoaQorCQkJCTs7CisJCQktbXB3KiB8IC1tYWNvcyopCisJCQkJdmVuZG9yPWFwcGxlCisJCQkJOzsKKwkJCS0qbWludCB8IC1taW50WzAtOV0qIHwgLSpNaU5UIHwgLU1pTlRbMC05XSopCisJCQkJdmVuZG9yPWF0YXJpCisJCQkJOzsKKwkJCS12b3MqKQorCQkJCXZlbmRvcj1zdHJhdHVzCisJCQkJOzsKKwkJZXNhYworCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICJzL3Vua25vd24vJHZlbmRvci8iYAorCQk7OworZXNhYworCitlY2hvICRiYXNpY19tYWNoaW5lJG9zCitleGl0CisKKyMgTG9jYWwgdmFyaWFibGVzOgorIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCisjIHRpbWUtc3RhbXAtc3RhcnQ6ICJ0aW1lc3RhbXA9JyIKKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkIgorIyB0aW1lLXN0YW1wLWVuZDogIiciCisjIEVuZDoKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9jb25maWd1cmUgYi9saWJnY3J5cHQtMS40LjYvY29uZmlndXJlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJmNWQ2NDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvY29uZmlndXJlCkBAIC0wLDAgKzEsMjQ4NDcgQEAKKyMhIC9iaW4vc2gKKyMgRnJvbSBjb25maWd1cmUuYWMgUmV2aXNpb246IDE0MzggLgorIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgorIyBHZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjQgZm9yIGxpYmdjcnlwdCAxLjQuNi4KKyMKKyMgUmVwb3J0IGJ1Z3MgdG8gPGJ1Zy1saWJnY3J5cHRAZ251cGcub3JnPi4KKyMKKyMgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLAorIyAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5IEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgTTRzaCBJbml0aWFsaXphdGlvbi4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisKKyMgQmUgbW9yZSBCb3VybmUgY29tcGF0aWJsZQorRFVBTENBU0U9MTsgZXhwb3J0IERVQUxDQVNFICMgZm9yIE1LUyBzaAoraWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKyAgZW11bGF0ZSBzaAorICBOVUxMQ01EPToKKyAgIyBQcmUtNC4yIHZlcnNpb25zIG9mIFpzaCBkbyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCisgICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCisgIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJworICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorZWxzZQorICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4gIygKKyAgKnBvc2l4KikgOgorICAgIHNldCAtbyBwb3NpeCA7OyAjKAorICAqKSA6CisgICAgIDs7Citlc2FjCitmaQorCisKK2FzX25sPScKKycKK2V4cG9ydCBhc19ubAorIyBQcmludGluZyBhIGxvbmcgc3RyaW5nIGNyYXNoZXMgU29sYXJpcyA3IC91c3IvYmluL3ByaW50Zi4KK2FzX2VjaG89J1xcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFwnCithc19lY2hvPSRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8KK2FzX2VjaG89JGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvCisjIFByZWZlciBhIGtzaCBzaGVsbCBidWlsdGluIG92ZXIgYW4gZXh0ZXJuYWwgcHJpbnRmIHByb2dyYW0gb24gU29sYXJpcywKKyMgYnV0IHdpdGhvdXQgd2FzdGluZyBmb3JrcyBmb3IgYmFzaCBvciB6c2guCitpZiB0ZXN0IC16ICIkQkFTSF9WRVJTSU9OJFpTSF9WRVJTSU9OIiBcCisgICAgJiYgKHRlc3QgIlhgcHJpbnQgLXIgLS0gJGFzX2VjaG9gIiA9ICJYJGFzX2VjaG8iKSAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19lY2hvPSdwcmludCAtciAtLScKKyAgYXNfZWNob19uPSdwcmludCAtcm4gLS0nCitlbGlmICh0ZXN0ICJYYHByaW50ZiAlcyAkYXNfZWNob2AiID0gIlgkYXNfZWNobyIpIDI+L2Rldi9udWxsOyB0aGVuCisgIGFzX2VjaG89J3ByaW50ZiAlc1xuJworICBhc19lY2hvX249J3ByaW50ZiAlcycKK2Vsc2UKKyAgaWYgdGVzdCAiWGAoL3Vzci91Y2IvZWNobyAtbiAtbiAkYXNfZWNobykgMj4vZGV2L251bGxgIiA9ICJYLW4gJGFzX2VjaG8iOyB0aGVuCisgICAgYXNfZWNob19ib2R5PSdldmFsIC91c3IvdWNiL2VjaG8gLW4gIiQxJGFzX25sIicKKyAgICBhc19lY2hvX249Jy91c3IvdWNiL2VjaG8gLW4nCisgIGVsc2UKKyAgICBhc19lY2hvX2JvZHk9J2V2YWwgZXhwciAiWCQxIiA6ICJYXFwoLipcXCkiJworICAgIGFzX2VjaG9fbl9ib2R5PSdldmFsCisgICAgICBhcmc9JDE7CisgICAgICBjYXNlICRhcmcgaW4gIygKKyAgICAgICoiJGFzX25sIiopCisJZXhwciAiWCRhcmciIDogIlhcXCguKlxcKSRhc19ubCI7CisJYXJnPWBleHByICJYJGFyZyIgOiAiLiokYXNfbmxcXCguKlxcKSJgOzsKKyAgICAgIGVzYWM7CisgICAgICBleHByICJYJGFyZyIgOiAiWFxcKC4qXFwpIiB8IHRyIC1kICIkYXNfbmwiCisgICAgJworICAgIGV4cG9ydCBhc19lY2hvX25fYm9keQorICAgIGFzX2VjaG9fbj0nc2ggLWMgJGFzX2VjaG9fbl9ib2R5IGFzX2VjaG8nCisgIGZpCisgIGV4cG9ydCBhc19lY2hvX2JvZHkKKyAgYXNfZWNobz0nc2ggLWMgJGFzX2VjaG9fYm9keSBhc19lY2hvJworZmkKKworIyBUaGUgdXNlciBpcyBhbHdheXMgcmlnaHQuCitpZiB0ZXN0ICIke1BBVEhfU0VQQVJBVE9SK3NldH0iICE9IHNldDsgdGhlbgorICBQQVRIX1NFUEFSQVRPUj06CisgIChQQVRIPScvYmluOy9iaW4nOyBGUEFUSD0kUEFUSDsgc2ggLWMgOikgPi9kZXYvbnVsbCAyPiYxICYmIHsKKyAgICAoUEFUSD0nL2JpbjovYmluJzsgRlBBVEg9JFBBVEg7IHNoIC1jIDopID4vZGV2L251bGwgMj4mMSB8fAorICAgICAgUEFUSF9TRVBBUkFUT1I9JzsnCisgIH0KK2ZpCisKKworIyBJRlMKKyMgV2UgbmVlZCBzcGFjZSwgdGFiIGFuZCBuZXcgbGluZSwgaW4gcHJlY2lzZWx5IHRoYXQgb3JkZXIuICBRdW90aW5nIGlzCisjIHRoZXJlIHRvIHByZXZlbnQgZWRpdG9ycyBmcm9tIGNvbXBsYWluaW5nIGFib3V0IHNwYWNlLXRhYi4KKyMgKElmIF9BU19QQVRIX1dBTEsgd2VyZSBjYWxsZWQgd2l0aCBJRlMgdW5zZXQsIGl0IHdvdWxkIGRpc2FibGUgd29yZAorIyBzcGxpdHRpbmcgYnkgc2V0dGluZyBJRlMgdG8gZW1wdHkgdmFsdWUuKQorSUZTPSIgIiIJJGFzX25sIgorCisjIEZpbmQgd2hvIHdlIGFyZS4gIExvb2sgaW4gdGhlIHBhdGggaWYgd2UgY29udGFpbiBubyBkaXJlY3Rvcnkgc2VwYXJhdG9yLgorY2FzZSAkMCBpbiAjKCgKKyAgKltcXC9dKiApIGFzX215c2VsZj0kMCA7OworICAqKSBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgdGVzdCAtciAiJGFzX2Rpci8kMCIgJiYgYXNfbXlzZWxmPSRhc19kaXIvJDAgJiYgYnJlYWsKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgICAgIDs7Citlc2FjCisjIFdlIGRpZCBub3QgZmluZCBvdXJzZWx2ZXMsIG1vc3QgcHJvYmFibHkgd2Ugd2VyZSBydW4gYXMgYHNoIENPTU1BTkQnCisjIGluIHdoaWNoIGNhc2Ugd2UgYXJlIG5vdCB0byBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KK2lmIHRlc3QgIngkYXNfbXlzZWxmIiA9IHg7IHRoZW4KKyAgYXNfbXlzZWxmPSQwCitmaQoraWYgdGVzdCAhIC1mICIkYXNfbXlzZWxmIjsgdGhlbgorICAkYXNfZWNobyAiJGFzX215c2VsZjogZXJyb3I6IGNhbm5vdCBmaW5kIG15c2VsZjsgcmVydW4gd2l0aCBhbiBhYnNvbHV0ZSBmaWxlIG5hbWUiID4mMgorICBleGl0IDEKK2ZpCisKKyMgVW5zZXQgdmFyaWFibGVzIHRoYXQgd2UgZG8gbm90IG5lZWQgYW5kIHdoaWNoIGNhdXNlIGJ1Z3MgKGUuZy4gaW4KKyMgcHJlLTMuMCBVV0lOIGtzaCkuICBCdXQgZG8gbm90IGNhdXNlIGJ1Z3MgaW4gYmFzaCAyLjAxOyB0aGUgInx8IGV4aXQgMSIKKyMgc3VwcHJlc3NlcyBhbnkgIlNlZ21lbnRhdGlvbiBmYXVsdCIgbWVzc2FnZSB0aGVyZS4gICcoKCcgY291bGQKKyMgdHJpZ2dlciBhIGJ1ZyBpbiBwZGtzaCA1LjIuMTQuCitmb3IgYXNfdmFyIGluIEJBU0hfRU5WIEVOViBNQUlMIE1BSUxQQVRICitkbyBldmFsIHRlc3QgeFwkeyRhc192YXIrc2V0fSA9IHhzZXQgXAorICAmJiAoICh1bnNldCAkYXNfdmFyKSB8fCBleGl0IDEpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCAkYXNfdmFyIHx8IDoKK2RvbmUKK1BTMT0nJCAnCitQUzI9Jz4gJworUFM0PScrICcKKworIyBOTFMgbnVpc2FuY2VzLgorTENfQUxMPUMKK2V4cG9ydCBMQ19BTEwKK0xBTkdVQUdFPUMKK2V4cG9ydCBMQU5HVUFHRQorCisjIENEUEFUSC4KKyh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKKworaWYgdGVzdCAieCRDT05GSUdfU0hFTEwiID0geDsgdGhlbgorICBhc19ib3VybmVfY29tcGF0aWJsZT0iaWYgdGVzdCAtbiBcIlwke1pTSF9WRVJTSU9OK3NldH1cIiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKyAgZW11bGF0ZSBzaAorICBOVUxMQ01EPToKKyAgIyBQcmUtNC4yIHZlcnNpb25zIG9mIFpzaCBkbyB3b3JkIHNwbGl0dGluZyBvbiBcJHsxK1wiXCRAXCJ9LCB3aGljaAorICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgorICBhbGlhcyAtZyAnXCR7MStcIlwkQFwifSc9J1wiXCRAXCInCisgIHNldG9wdCBOT19HTE9CX1NVQlNUCitlbHNlCisgIGNhc2UgXGAoc2V0IC1vKSAyPi9kZXYvbnVsbFxgIGluICMoCisgICpwb3NpeCopIDoKKyAgICBzZXQgLW8gcG9zaXggOzsgIygKKyAgKikgOgorICAgICA7OworZXNhYworZmkKKyIKKyAgYXNfcmVxdWlyZWQ9ImFzX2ZuX3JldHVybiAoKSB7IChleGl0IFwkMSk7IH0KK2FzX2ZuX3N1Y2Nlc3MgKCkgeyBhc19mbl9yZXR1cm4gMDsgfQorYXNfZm5fZmFpbHVyZSAoKSB7IGFzX2ZuX3JldHVybiAxOyB9Cithc19mbl9yZXRfc3VjY2VzcyAoKSB7IHJldHVybiAwOyB9Cithc19mbl9yZXRfZmFpbHVyZSAoKSB7IHJldHVybiAxOyB9CisKK2V4aXRjb2RlPTAKK2FzX2ZuX3N1Y2Nlc3MgfHwgeyBleGl0Y29kZT0xOyBlY2hvIGFzX2ZuX3N1Y2Nlc3MgZmFpbGVkLjsgfQorYXNfZm5fZmFpbHVyZSAmJiB7IGV4aXRjb2RlPTE7IGVjaG8gYXNfZm5fZmFpbHVyZSBzdWNjZWVkZWQuOyB9Cithc19mbl9yZXRfc3VjY2VzcyB8fCB7IGV4aXRjb2RlPTE7IGVjaG8gYXNfZm5fcmV0X3N1Y2Nlc3MgZmFpbGVkLjsgfQorYXNfZm5fcmV0X2ZhaWx1cmUgJiYgeyBleGl0Y29kZT0xOyBlY2hvIGFzX2ZuX3JldF9mYWlsdXJlIHN1Y2NlZWRlZC47IH0KK2lmICggc2V0IHg7IGFzX2ZuX3JldF9zdWNjZXNzIHkgJiYgdGVzdCB4ID0gXCJcJDFcIiApOyB0aGVuIDoKKworZWxzZQorICBleGl0Y29kZT0xOyBlY2hvIHBvc2l0aW9uYWwgcGFyYW1ldGVycyB3ZXJlIG5vdCBzYXZlZC4KK2ZpCit0ZXN0IHhcJGV4aXRjb2RlID0geDAgfHwgZXhpdCAxIgorICBhc19zdWdnZXN0ZWQ9IiAgYXNfbGluZW5vXzE9Ijthc19zdWdnZXN0ZWQ9JGFzX3N1Z2dlc3RlZCRMSU5FTk87YXNfc3VnZ2VzdGVkPSRhc19zdWdnZXN0ZWQiIGFzX2xpbmVub18xYT1cJExJTkVOTworICBhc19saW5lbm9fMj0iO2FzX3N1Z2dlc3RlZD0kYXNfc3VnZ2VzdGVkJExJTkVOTzthc19zdWdnZXN0ZWQ9JGFzX3N1Z2dlc3RlZCIgYXNfbGluZW5vXzJhPVwkTElORU5PCisgIGV2YWwgJ3Rlc3QgXCJ4XCRhc19saW5lbm9fMSdcJGFzX3J1bidcIiAhPSBcInhcJGFzX2xpbmVub18yJ1wkYXNfcnVuJ1wiICYmCisgIHRlc3QgXCJ4XGBleHByIFwkYXNfbGluZW5vXzEnXCRhc19ydW4nICsgMVxgXCIgPSBcInhcJGFzX2xpbmVub18yJ1wkYXNfcnVuJ1wiJyB8fCBleGl0IDEKK3Rlc3QgXCQoKCAxICsgMSApKSA9IDIgfHwgZXhpdCAxIgorICBpZiAoZXZhbCAiJGFzX3JlcXVpcmVkIikgMj4vZGV2L251bGw7IHRoZW4gOgorICBhc19oYXZlX3JlcXVpcmVkPXllcworZWxzZQorICBhc19oYXZlX3JlcXVpcmVkPW5vCitmaQorICBpZiB0ZXN0IHgkYXNfaGF2ZV9yZXF1aXJlZCA9IHh5ZXMgJiYgKGV2YWwgIiRhc19zdWdnZXN0ZWQiKSAyPi9kZXYvbnVsbDsgdGhlbiA6CisKK2Vsc2UKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorYXNfZm91bmQ9ZmFsc2UKK2ZvciBhc19kaXIgaW4gL2JpbiRQQVRIX1NFUEFSQVRPUi91c3IvYmluJFBBVEhfU0VQQVJBVE9SJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgYXNfZm91bmQ9OgorICBjYXNlICRhc19kaXIgaW4gIygKKwkgLyopCisJICAgZm9yIGFzX2Jhc2UgaW4gc2ggYmFzaCBrc2ggc2g1OyBkbworCSAgICAgIyBUcnkgb25seSBzaGVsbHMgdGhhdCBleGlzdCwgdG8gc2F2ZSBzZXZlcmFsIGZvcmtzLgorCSAgICAgYXNfc2hlbGw9JGFzX2Rpci8kYXNfYmFzZQorCSAgICAgaWYgeyB0ZXN0IC1mICIkYXNfc2hlbGwiIHx8IHRlc3QgLWYgIiRhc19zaGVsbC5leGUiOyB9ICYmCisJCSAgICB7ICRhc19lY2hvICIkYXNfYm91cm5lX2NvbXBhdGlibGUiIiRhc19yZXF1aXJlZCIgfCBhc19ydW49YSAiJGFzX3NoZWxsIjsgfSAyPi9kZXYvbnVsbDsgdGhlbiA6CisgIENPTkZJR19TSEVMTD0kYXNfc2hlbGwgYXNfaGF2ZV9yZXF1aXJlZD15ZXMKKwkJICAgaWYgeyAkYXNfZWNobyAiJGFzX2JvdXJuZV9jb21wYXRpYmxlIiIkYXNfc3VnZ2VzdGVkIiB8IGFzX3J1bj1hICIkYXNfc2hlbGwiOyB9IDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgYnJlYWsgMgorZmkKK2ZpCisJICAgZG9uZTs7CisgICAgICAgZXNhYworICBhc19mb3VuZD1mYWxzZQorZG9uZQorJGFzX2ZvdW5kIHx8IHsgaWYgeyB0ZXN0IC1mICIkU0hFTEwiIHx8IHRlc3QgLWYgIiRTSEVMTC5leGUiOyB9ICYmCisJICAgICAgeyAkYXNfZWNobyAiJGFzX2JvdXJuZV9jb21wYXRpYmxlIiIkYXNfcmVxdWlyZWQiIHwgYXNfcnVuPWEgIiRTSEVMTCI7IH0gMj4vZGV2L251bGw7IHRoZW4gOgorICBDT05GSUdfU0hFTEw9JFNIRUxMIGFzX2hhdmVfcmVxdWlyZWQ9eWVzCitmaTsgfQorSUZTPSRhc19zYXZlX0lGUworCisKKyAgICAgIGlmIHRlc3QgIngkQ09ORklHX1NIRUxMIiAhPSB4OyB0aGVuIDoKKyAgIyBXZSBjYW5ub3QgeWV0IGFzc3VtZSBhIGRlY2VudCBzaGVsbCwgc28gd2UgaGF2ZSB0byBwcm92aWRlIGEKKwkjIG5ldXRyYWxpemF0aW9uIHZhbHVlIGZvciBzaGVsbHMgd2l0aG91dCB1bnNldDsgYW5kIHRoaXMgYWxzbworCSMgd29ya3MgYXJvdW5kIHNoZWxscyB0aGF0IGNhbm5vdCB1bnNldCBub25leGlzdGVudCB2YXJpYWJsZXMuCisJQkFTSF9FTlY9L2Rldi9udWxsCisJRU5WPS9kZXYvbnVsbAorCSh1bnNldCBCQVNIX0VOVikgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IEJBU0hfRU5WIEVOVgorCWV4cG9ydCBDT05GSUdfU0hFTEwKKwlleGVjICIkQ09ORklHX1NIRUxMIiAiJGFzX215c2VsZiIgJHsxKyIkQCJ9CitmaQorCisgICAgaWYgdGVzdCB4JGFzX2hhdmVfcmVxdWlyZWQgPSB4bm87IHRoZW4gOgorICAkYXNfZWNobyAiJDA6IFRoaXMgc2NyaXB0IHJlcXVpcmVzIGEgc2hlbGwgbW9yZSBtb2Rlcm4gdGhhbiBhbGwiCisgICRhc19lY2hvICIkMDogdGhlIHNoZWxscyB0aGF0IEkgZm91bmQgb24geW91ciBzeXN0ZW0uIgorICBpZiB0ZXN0IHgke1pTSF9WRVJTSU9OK3NldH0gPSB4c2V0IDsgdGhlbgorICAgICRhc19lY2hvICIkMDogSW4gcGFydGljdWxhciwgenNoICRaU0hfVkVSU0lPTiBoYXMgYnVncyBhbmQgc2hvdWxkIgorICAgICRhc19lY2hvICIkMDogYmUgdXBncmFkZWQgdG8genNoIDQuMy40IG9yIGxhdGVyLiIKKyAgZWxzZQorICAgICRhc19lY2hvICIkMDogUGxlYXNlIHRlbGwgYnVnLWF1dG9jb25mQGdudS5vcmcgYW5kCiskMDogYnVnLWxpYmdjcnlwdEBnbnVwZy5vcmcgYWJvdXQgeW91ciBzeXN0ZW0sIGluY2x1ZGluZworJDA6IGFueSBlcnJvciBwb3NzaWJseSBvdXRwdXQgYmVmb3JlIHRoaXMgbWVzc2FnZS4gVGhlbgorJDA6IGluc3RhbGwgYSBtb2Rlcm4gc2hlbGwsIG9yIG1hbnVhbGx5IHJ1biB0aGUgc2NyaXB0CiskMDogdW5kZXIgc3VjaCBhIHNoZWxsIGlmIHlvdSBkbyBoYXZlIG9uZS4iCisgIGZpCisgIGV4aXQgMQorZmkKK2ZpCitmaQorU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KK2V4cG9ydCBTSEVMTAorIyBVbnNldCBtb3JlIHZhcmlhYmxlcyBrbm93biB0byBpbnRlcmZlcmUgd2l0aCBiZWhhdmlvciBvZiBjb21tb24gdG9vbHMuCitDTElDT0xPUl9GT1JDRT0gR1JFUF9PUFRJT05TPQordW5zZXQgQ0xJQ09MT1JfRk9SQ0UgR1JFUF9PUFRJT05TCisKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgTTRzaCBTaGVsbCBGdW5jdGlvbnMuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMgYXNfZm5fdW5zZXQgVkFSCisjIC0tLS0tLS0tLS0tLS0tLQorIyBQb3J0YWJseSB1bnNldCBWQVIuCithc19mbl91bnNldCAoKQoreworICB7IGV2YWwgJDE9OyB1bnNldCAkMTt9Cit9Cithc191bnNldD1hc19mbl91bnNldAorCisjIGFzX2ZuX3NldF9zdGF0dXMgU1RBVFVTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNldCAkPyB0byBTVEFUVVMsIHdpdGhvdXQgZm9ya2luZy4KK2FzX2ZuX3NldF9zdGF0dXMgKCkKK3sKKyAgcmV0dXJuICQxCit9ICMgYXNfZm5fc2V0X3N0YXR1cworCisjIGFzX2ZuX2V4aXQgU1RBVFVTCisjIC0tLS0tLS0tLS0tLS0tLS0tCisjIEV4aXQgdGhlIHNoZWxsIHdpdGggU1RBVFVTLCBldmVuIGluIGEgInRyYXAgMCIgb3IgInNldCAtZSIgY29udGV4dC4KK2FzX2ZuX2V4aXQgKCkKK3sKKyAgc2V0ICtlCisgIGFzX2ZuX3NldF9zdGF0dXMgJDEKKyAgZXhpdCAkMQorfSAjIGFzX2ZuX2V4aXQKKworIyBhc19mbl9ta2Rpcl9wCisjIC0tLS0tLS0tLS0tLS0KKyMgQ3JlYXRlICIkYXNfZGlyIiBhcyBhIGRpcmVjdG9yeSwgaW5jbHVkaW5nIHBhcmVudHMgaWYgbmVjZXNzYXJ5LgorYXNfZm5fbWtkaXJfcCAoKQoreworCisgIGNhc2UgJGFzX2RpciBpbiAjKAorICAtKikgYXNfZGlyPS4vJGFzX2Rpcjs7CisgIGVzYWMKKyAgdGVzdCAtZCAiJGFzX2RpciIgfHwgZXZhbCAkYXNfbWtkaXJfcCB8fCB7CisgICAgYXNfZGlycz0KKyAgICB3aGlsZSA6OyBkbworICAgICAgY2FzZSAkYXNfZGlyIGluICMoCisgICAgICAqXCcqKSBhc19xZGlyPWAkYXNfZWNobyAiJGFzX2RpciIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImA7OyAjJygKKyAgICAgICopIGFzX3FkaXI9JGFzX2Rpcjs7CisgICAgICBlc2FjCisgICAgICBhc19kaXJzPSInJGFzX3FkaXInICRhc19kaXJzIgorICAgICAgYXNfZGlyPWAkYXNfZGlybmFtZSAtLSAiJGFzX2RpciIgfHwKKyRhc19leHByIFgiJGFzX2RpciIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CiskYXNfZWNobyBYIiRhc19kaXIiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXClbXi9dLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorICAgICAgdGVzdCAtZCAiJGFzX2RpciIgJiYgYnJlYWsKKyAgICBkb25lCisgICAgdGVzdCAteiAiJGFzX2RpcnMiIHx8IGV2YWwgIm1rZGlyICRhc19kaXJzIgorICB9IHx8IHRlc3QgLWQgIiRhc19kaXIiIHx8IGFzX2ZuX2Vycm9yICJjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSAkYXNfZGlyIgorCisKK30gIyBhc19mbl9ta2Rpcl9wCisjIGFzX2ZuX2FwcGVuZCBWQVIgVkFMVUUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBcHBlbmQgdGhlIHRleHQgaW4gVkFMVUUgdG8gdGhlIGVuZCBvZiB0aGUgZGVmaW5pdGlvbiBjb250YWluZWQgaW4gVkFSLiBUYWtlCisjIGFkdmFudGFnZSBvZiBhbnkgc2hlbGwgb3B0aW1pemF0aW9ucyB0aGF0IGFsbG93IGFtb3J0aXplZCBsaW5lYXIgZ3Jvd3RoIG92ZXIKKyMgcmVwZWF0ZWQgYXBwZW5kcywgaW5zdGVhZCBvZiB0aGUgdHlwaWNhbCBxdWFkcmF0aWMgZ3Jvd3RoIHByZXNlbnQgaW4gbmFpdmUKKyMgaW1wbGVtZW50YXRpb25zLgoraWYgKGV2YWwgImFzX3Zhcj0xOyBhc192YXIrPTI7IHRlc3QgeFwkYXNfdmFyID0geDEyIikgMj4vZGV2L251bGw7IHRoZW4gOgorICBldmFsICdhc19mbl9hcHBlbmQgKCkKKyAgeworICAgIGV2YWwgJDErPVwkMgorICB9JworZWxzZQorICBhc19mbl9hcHBlbmQgKCkKKyAgeworICAgIGV2YWwgJDE9XCQkMVwkMgorICB9CitmaSAjIGFzX2ZuX2FwcGVuZAorCisjIGFzX2ZuX2FyaXRoIEFSRy4uLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0KKyMgUGVyZm9ybSBhcml0aG1ldGljIGV2YWx1YXRpb24gb24gdGhlIEFSR3MsIGFuZCBzdG9yZSB0aGUgcmVzdWx0IGluIHRoZQorIyBnbG9iYWwgJGFzX3ZhbC4gVGFrZSBhZHZhbnRhZ2Ugb2Ygc2hlbGxzIHRoYXQgY2FuIGF2b2lkIGZvcmtzLiBUaGUgYXJndW1lbnRzCisjIG11c3QgYmUgcG9ydGFibGUgYWNyb3NzICQoKCkpIGFuZCBleHByLgoraWYgKGV2YWwgInRlc3QgXCQoKCAxICsgMSApKSA9IDIiKSAyPi9kZXYvbnVsbDsgdGhlbiA6CisgIGV2YWwgJ2FzX2ZuX2FyaXRoICgpCisgIHsKKyAgICBhc192YWw9JCgoICQqICkpCisgIH0nCitlbHNlCisgIGFzX2ZuX2FyaXRoICgpCisgIHsKKyAgICBhc192YWw9YGV4cHIgIiRAIiB8fCB0ZXN0ICQ/IC1lcSAxYAorICB9CitmaSAjIGFzX2ZuX2FyaXRoCisKKworIyBhc19mbl9lcnJvciBFUlJPUiBbTElORU5PIExPR19GRF0KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE91dHB1dCAiYGJhc2VuYW1lICQwYDogZXJyb3I6IEVSUk9SIiB0byBzdGRlcnIuIElmIExJTkVOTyBhbmQgTE9HX0ZEIGFyZQorIyBwcm92aWRlZCwgYWxzbyBvdXRwdXQgdGhlIGVycm9yIHRvIExPR19GRCwgcmVmZXJlbmNpbmcgTElORU5PLiBUaGVuIGV4aXQgdGhlCisjIHNjcmlwdCB3aXRoIHN0YXR1cyAkPywgdXNpbmcgMSBpZiB0aGF0IHdhcyAwLgorYXNfZm5fZXJyb3IgKCkKK3sKKyAgYXNfc3RhdHVzPSQ/OyB0ZXN0ICRhc19zdGF0dXMgLWVxIDAgJiYgYXNfc3RhdHVzPTEKKyAgaWYgdGVzdCAiJDMiOyB0aGVuCisgICAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMiJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiAkMSIgPiYkMworICBmaQorICAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogJDEiID4mMgorICBhc19mbl9leGl0ICRhc19zdGF0dXMKK30gIyBhc19mbl9lcnJvcgorCitpZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMSAmJgorICAgdGVzdCAiWGBleHByIDAwMDAxIDogJy4qXCguLi5cKSdgIiA9IFgwMDE7IHRoZW4KKyAgYXNfZXhwcj1leHByCitlbHNlCisgIGFzX2V4cHI9ZmFsc2UKK2ZpCisKK2lmIChiYXNlbmFtZSAtLSAvKSA+L2Rldi9udWxsIDI+JjEgJiYgdGVzdCAiWGBiYXNlbmFtZSAtLSAvIDI+JjFgIiA9ICJYLyI7IHRoZW4KKyAgYXNfYmFzZW5hbWU9YmFzZW5hbWUKK2Vsc2UKKyAgYXNfYmFzZW5hbWU9ZmFsc2UKK2ZpCisKK2lmIChhc19kaXI9YGRpcm5hbWUgLS0gL2AgJiYgdGVzdCAiWCRhc19kaXIiID0gWC8pID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhc19kaXJuYW1lPWRpcm5hbWUKK2Vsc2UKKyAgYXNfZGlybmFtZT1mYWxzZQorZmkKKworYXNfbWU9YCRhc19iYXNlbmFtZSAtLSAiJDAiIHx8CiskYXNfZXhwciBYLyIkMCIgOiAnLiovXChbXi9dW14vXSpcKS8qJCcgXHwgXAorCSBYIiQwIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiQwIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyRhc19lY2hvIFgvIiQwIiB8CisgICAgc2VkICcvXi4qXC9cKFteL11bXi9dKlwpXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcL1woXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcL1woXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorCisjIEF2b2lkIGRlcGVuZGluZyB1cG9uIENoYXJhY3RlciBSYW5nZXMuCithc19jcl9sZXR0ZXJzPSdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicKK2FzX2NyX0xFVFRFUlM9J0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJworYXNfY3JfTGV0dGVycz0kYXNfY3JfbGV0dGVycyRhc19jcl9MRVRURVJTCithc19jcl9kaWdpdHM9JzAxMjM0NTY3ODknCithc19jcl9hbG51bT0kYXNfY3JfTGV0dGVycyRhc19jcl9kaWdpdHMKKworCisgIGFzX2xpbmVub18xPSRMSU5FTk8gYXNfbGluZW5vXzFhPSRMSU5FTk8KKyAgYXNfbGluZW5vXzI9JExJTkVOTyBhc19saW5lbm9fMmE9JExJTkVOTworICBldmFsICd0ZXN0ICJ4JGFzX2xpbmVub18xJyRhc19ydW4nIiAhPSAieCRhc19saW5lbm9fMickYXNfcnVuJyIgJiYKKyAgdGVzdCAieGBleHByICRhc19saW5lbm9fMSckYXNfcnVuJyArIDFgIiA9ICJ4JGFzX2xpbmVub18yJyRhc19ydW4nIicgfHwgeworICAjIEJsYW1lIExlZSBFLiBNY01haG9uICgxOTMxLTE5ODkpIGZvciBzZWQncyBzeW50YXguICA6LSkKKyAgc2VkIC1uICcKKyAgICBwCisgICAgL1skXUxJTkVOTy89CisgICcgPCRhc19teXNlbGYgfAorICAgIHNlZCAnCisgICAgICBzL1skXUxJTkVOTy4qLyYtLworICAgICAgdCBsaW5lbm8KKyAgICAgIGIKKyAgICAgIDpsaW5lbm8KKyAgICAgIE4KKyAgICAgIDpsb29wCisgICAgICBzL1skXUxJTkVOT1woW14nJGFzX2NyX2FsbnVtJ19dLipcblwpXCguKlwpL1wyXDFcMi8KKyAgICAgIHQgbG9vcAorICAgICAgcy8tXG4uKi8vCisgICAgJyA+JGFzX21lLmxpbmVubyAmJgorICBjaG1vZCAreCAiJGFzX21lLmxpbmVubyIgfHwKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY3JlYXRlICRhc19tZS5saW5lbm87IHJlcnVuIHdpdGggYSBQT1NJWCBzaGVsbCIgPiYyOyBhc19mbl9leGl0IDE7IH0KKworICAjIERvbid0IHRyeSB0byBleGVjIGFzIGl0IGNoYW5nZXMgJFswXSwgY2F1c2luZyBhbGwgc29ydCBvZiBwcm9ibGVtcworICAjICh0aGUgZGlybmFtZSBvZiAkWzBdIGlzIG5vdCB0aGUgcGxhY2Ugd2hlcmUgd2UgbWlnaHQgZmluZCB0aGUKKyAgIyBvcmlnaW5hbCBhbmQgc28gb24uICBBdXRvY29uZiBpcyBlc3BlY2lhbGx5IHNlbnNpdGl2ZSB0byB0aGlzKS4KKyAgLiAiLi8kYXNfbWUubGluZW5vIgorICAjIEV4aXQgc3RhdHVzIGlzIHRoYXQgb2YgdGhlIGxhc3QgY29tbWFuZC4KKyAgZXhpdAorfQorCitFQ0hPX0M9IEVDSE9fTj0gRUNIT19UPQorY2FzZSBgZWNobyAtbiB4YCBpbiAjKCgoKCgKKy1uKikKKyAgY2FzZSBgZWNobyAneHlcYydgIGluCisgICpjKikgRUNIT19UPScJJzs7CSMgRUNIT19UIGlzIHNpbmdsZSB0YWIgY2hhcmFjdGVyLgorICB4eSkgIEVDSE9fQz0nXGMnOzsKKyAgKikgICBlY2hvIGBlY2hvIGtzaDg4IGJ1ZyBvbiBBSVggNi4xYCA+IC9kZXYvbnVsbAorICAgICAgIEVDSE9fVD0nCSc7OworICBlc2FjOzsKKyopCisgIEVDSE9fTj0nLW4nOzsKK2VzYWMKKworcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKK2lmIHRlc3QgLWQgY29uZiQkLmRpcjsgdGhlbgorICBybSAtZiBjb25mJCQuZGlyL2NvbmYkJC5maWxlCitlbHNlCisgIHJtIC1mIGNvbmYkJC5kaXIKKyAgbWtkaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAorZmkKK2lmIChlY2hvID5jb25mJCQuZmlsZSkgMj4vZGV2L251bGw7IHRoZW4KKyAgaWYgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYXNfbG5fcz0nbG4gLXMnCisgICAgIyAuLi4gYnV0IHRoZXJlIGFyZSB0d28gZ290Y2hhczoKKyAgICAjIDEpIE9uIE1TWVMsIGJvdGggYGxuIC1zIGZpbGUgZGlyJyBhbmQgYGxuIGZpbGUgZGlyJyBmYWlsLgorICAgICMgMikgREpHUFAgPCAyLjA0IGhhcyBubyBzeW1saW5rczsgYGxuIC1zJyBjcmVhdGVzIGEgd3JhcHBlciBleGVjdXRhYmxlLgorICAgICMgSW4gYm90aCBjYXNlcywgd2UgaGF2ZSB0byBkZWZhdWx0IHRvIGBjcCAtcCcuCisgICAgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkLmRpciAyPi9kZXYvbnVsbCAmJiB0ZXN0ICEgLWYgY29uZiQkLmV4ZSB8fAorICAgICAgYXNfbG5fcz0nY3AgLXAnCisgIGVsaWYgbG4gY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYXNfbG5fcz1sbgorICBlbHNlCisgICAgYXNfbG5fcz0nY3AgLXAnCisgIGZpCitlbHNlCisgIGFzX2xuX3M9J2NwIC1wJworZmkKK3JtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUgY29uZiQkLmZpbGUKK3JtZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKKworaWYgbWtkaXIgLXAgLiAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19ta2Rpcl9wPSdta2RpciAtcCAiJGFzX2RpciInCitlbHNlCisgIHRlc3QgLWQgLi8tcCAmJiBybWRpciAuLy1wCisgIGFzX21rZGlyX3A9ZmFsc2UKK2ZpCisKK2lmIHRlc3QgLXggLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfdGVzdF94PSd0ZXN0IC14JworZWxzZQorICBpZiBscyAtZEwgLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICBhc19sc19MX29wdGlvbj1MCisgIGVsc2UKKyAgICBhc19sc19MX29wdGlvbj0KKyAgZmkKKyAgYXNfdGVzdF94PScKKyAgICBldmFsIHNoIC1jICdcJycKKyAgICAgIGlmIHRlc3QgLWQgIiQxIjsgdGhlbgorCXRlc3QgLWQgIiQxLy4iOworICAgICAgZWxzZQorCWNhc2UgJDEgaW4gIygKKwktKilzZXQgIi4vJDEiOzsKKwllc2FjOworCWNhc2UgYGxzIC1sZCckYXNfbHNfTF9vcHRpb24nICIkMSIgMj4vZGV2L251bGxgIGluICMoKAorCT8/P1tzeF0qKTo7OyopZmFsc2U7O2VzYWM7ZmkKKyAgICAnXCcnIHNoCisgICcKK2ZpCithc19leGVjdXRhYmxlX3A9JGFzX3Rlc3RfeAorCisjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgQ1BQIG5hbWUuCithc190cl9jcHA9ImV2YWwgc2VkICd5JSokYXNfY3JfbGV0dGVycyVQJGFzX2NyX0xFVFRFUlMlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgorCisjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgdmFyaWFibGUgbmFtZS4KK2FzX3RyX3NoPSJldmFsIHNlZCAneSUqKyVwcCU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCisKKwordGFnbmFtZXM9JHt0YWduYW1lcyske3RhZ25hbWVzfSx9UkMKKworCisjIENoZWNrIHRoYXQgd2UgYXJlIHJ1bm5pbmcgdW5kZXIgdGhlIGNvcnJlY3Qgc2hlbGwuCitTSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQorCitjYXNlIFgkRUNITyBpbgorWCotLWZhbGxiYWNrLWVjaG8pCisgICMgUmVtb3ZlIG9uZSBsZXZlbCBvZiBxdW90YXRpb24gKHdoaWNoIHdhcyByZXF1aXJlZCBmb3IgTWFrZSkuCisgIEVDSE89YGVjaG8gIiRFQ0hPIiB8IHNlZCAncyxcXFxcXCRcXCQwLCckMCcsJ2AKKyAgOzsKK2VzYWMKKworZWNobz0ke0VDSE8tZWNob30KK2lmIHRlc3QgIlgkMSIgPSBYLS1uby1yZWV4ZWM7IHRoZW4KKyAgIyBEaXNjYXJkIHRoZSAtLW5vLXJlZXhlYyBmbGFnLCBhbmQgY29udGludWUuCisgIHNoaWZ0CitlbGlmIHRlc3QgIlgkMSIgPSBYLS1mYWxsYmFjay1lY2hvOyB0aGVuCisgICMgQXZvaWQgaW5saW5lIGRvY3VtZW50IGhlcmUsIGl0IG1heSBiZSBsZWZ0IG92ZXIKKyAgOgorZWxpZiB0ZXN0ICJYYCgkZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgOyB0aGVuCisgICMgWWlwcGVlLCAkZWNobyB3b3JrcyEKKyAgOgorZWxzZQorICAjIFJlc3RhcnQgdW5kZXIgdGhlIGNvcnJlY3Qgc2hlbGwuCisgIGV4ZWMgJFNIRUxMICIkMCIgLS1uby1yZWV4ZWMgJHsxKyIkQCJ9CitmaQorCitpZiB0ZXN0ICJYJDEiID0gWC0tZmFsbGJhY2stZWNobzsgdGhlbgorICAjIHVzZWQgYXMgZmFsbGJhY2sgZWNobworICBzaGlmdAorICBjYXQgPDxFT0YKKyQqCitFT0YKKyAgZXhpdCAwCitmaQorCisjIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAorIyBpZiBDRFBBVEggaXMgc2V0LgoraWYgdGVzdCAiWCR7Q0RQQVRIK3NldH0iID0gWHNldDsgdGhlbiBDRFBBVEg9OjsgZXhwb3J0IENEUEFUSDsgZmkKKworaWYgdGVzdCAteiAiJEVDSE8iOyB0aGVuCitpZiB0ZXN0ICJYJHtlY2hvX3Rlc3Rfc3RyaW5nK3NldH0iICE9IFhzZXQ7IHRoZW4KKyMgZmluZCBhIHN0cmluZyBhcyBsYXJnZSBhcyBwb3NzaWJsZSwgYXMgbG9uZyBhcyB0aGUgc2hlbGwgY2FuIGNvcGUgd2l0aCBpdAorICBmb3IgY21kIGluICdzZWQgNTBxICIkMCInICdzZWQgMjBxICIkMCInICdzZWQgMTBxICIkMCInICdzZWQgMnEgIiQwIicgJ2VjaG8gdGVzdCc7IGRvCisgICAgIyBleHBlY3RlZCBzaXplczogbGVzcyB0aGFuIDJLYiwgMUtiLCA1MTIgYnl0ZXMsIDE2IGJ5dGVzLCAuLi4KKyAgICBpZiAoZWNob190ZXN0X3N0cmluZz0iYGV2YWwgJGNtZGAiKSAyPi9kZXYvbnVsbCAmJgorICAgICAgIGVjaG9fdGVzdF9zdHJpbmc9ImBldmFsICRjbWRgIiAmJgorICAgICAgICh0ZXN0ICJYJGVjaG9fdGVzdF9zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsCisgICAgdGhlbgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCitmaQorCitpZiB0ZXN0ICJYYCgkZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKKyAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKKyAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgorICA6CitlbHNlCisgICMgVGhlIFNvbGFyaXMsIEFJWCwgYW5kIERpZ2l0YWwgVW5peCBkZWZhdWx0IGVjaG8gcHJvZ3JhbXMgdW5xdW90ZQorICAjIGJhY2tzbGFzaGVzLiAgVGhpcyBtYWtlcyBpdCBpbXBvc3NpYmxlIHRvIHF1b3RlIGJhY2tzbGFzaGVzIHVzaW5nCisgICMgICBlY2hvICIkc29tZXRoaW5nIiB8IHNlZCAncy9cXC9cXFxcL2cnCisgICMKKyAgIyBTbywgZmlyc3Qgd2UgbG9vayBmb3IgYSB3b3JraW5nIGVjaG8gaW4gdGhlIHVzZXIncyBQQVRILgorCisgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICBmb3IgZGlyIGluICRQQVRIIC91c3IvdWNiOyBkbworICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgIGlmICh0ZXN0IC1mICRkaXIvZWNobyB8fCB0ZXN0IC1mICRkaXIvZWNobyRhY19leGVleHQpICYmCisgICAgICAgdGVzdCAiWGAoJGRpci9lY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgorICAgICAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkZGlyL2VjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCisgICAgICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCisgICAgICBlY2hvPSIkZGlyL2VjaG8iCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkbHRfc2F2ZV9pZnMiCisKKyAgaWYgdGVzdCAiWCRlY2hvIiA9IFhlY2hvOyB0aGVuCisgICAgIyBXZSBkaWRuJ3QgZmluZCBhIGJldHRlciBlY2hvLCBzbyBsb29rIGZvciBhbHRlcm5hdGl2ZXMuCisgICAgaWYgdGVzdCAiWGAocHJpbnQgLXIgJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCisgICAgICAgZWNob190ZXN0aW5nX3N0cmluZz1gKHByaW50IC1yICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgorICAgICAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgorICAgICAgIyBUaGlzIHNoZWxsIGhhcyBhIGJ1aWx0aW4gcHJpbnQgLXIgdGhhdCBkb2VzIHRoZSB0cmljay4KKyAgICAgIGVjaG89J3ByaW50IC1yJworICAgIGVsaWYgKHRlc3QgLWYgL2Jpbi9rc2ggfHwgdGVzdCAtZiAvYmluL2tzaCRhY19leGVleHQpICYmCisJIHRlc3QgIlgkQ09ORklHX1NIRUxMIiAhPSBYL2Jpbi9rc2g7IHRoZW4KKyAgICAgICMgSWYgd2UgaGF2ZSBrc2gsIHRyeSBydW5uaW5nIGNvbmZpZ3VyZSBhZ2FpbiB3aXRoIGl0LgorICAgICAgT1JJR0lOQUxfQ09ORklHX1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CisgICAgICBleHBvcnQgT1JJR0lOQUxfQ09ORklHX1NIRUxMCisgICAgICBDT05GSUdfU0hFTEw9L2Jpbi9rc2gKKyAgICAgIGV4cG9ydCBDT05GSUdfU0hFTEwKKyAgICAgIGV4ZWMgJENPTkZJR19TSEVMTCAiJDAiIC0tbm8tcmVleGVjICR7MSsiJEAifQorICAgIGVsc2UKKyAgICAgICMgVHJ5IHVzaW5nIHByaW50Zi4KKyAgICAgIGVjaG89J3ByaW50ZiAlc1xuJworICAgICAgaWYgdGVzdCAiWGAoJGVjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCisJIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKKwkgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCisJIyBDb29sLCBwcmludGYgd29ya3MKKwk6CisgICAgICBlbGlmIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkT1JJR0lOQUxfQ09ORklHX1NIRUxMICIkMCIgLS1mYWxsYmFjay1lY2hvICdcdCcpIDI+L2Rldi9udWxsYCAmJgorCSAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAnWFx0JyAmJgorCSAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkT1JJR0lOQUxfQ09ORklHX1NIRUxMICIkMCIgLS1mYWxsYmFjay1lY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgorCSAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgorCUNPTkZJR19TSEVMTD0kT1JJR0lOQUxfQ09ORklHX1NIRUxMCisJZXhwb3J0IENPTkZJR19TSEVMTAorCVNIRUxMPSIkQ09ORklHX1NIRUxMIgorCWV4cG9ydCBTSEVMTAorCWVjaG89IiRDT05GSUdfU0hFTEwgJDAgLS1mYWxsYmFjay1lY2hvIgorICAgICAgZWxpZiBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJENPTkZJR19TSEVMTCAiJDAiIC0tZmFsbGJhY2stZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAgJiYKKwkgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gJ1hcdCcgJiYKKwkgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJENPTkZJR19TSEVMTCAiJDAiIC0tZmFsbGJhY2stZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKKwkgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KKwllY2hvPSIkQ09ORklHX1NIRUxMICQwIC0tZmFsbGJhY2stZWNobyIKKyAgICAgIGVsc2UKKwkjIG1heWJlIHdpdGggYSBzbWFsbGVyIHN0cmluZy4uLgorCXByZXY9OgorCisJZm9yIGNtZCBpbiAnZWNobyB0ZXN0JyAnc2VkIDJxICIkMCInICdzZWQgMTBxICIkMCInICdzZWQgMjBxICIkMCInICdzZWQgNTBxICIkMCInOyBkbworCSAgaWYgKHRlc3QgIlgkZWNob190ZXN0X3N0cmluZyIgPSAiWGBldmFsICRjbWRgIikgMj4vZGV2L251bGwKKwkgIHRoZW4KKwkgICAgYnJlYWsKKwkgIGZpCisJICBwcmV2PSIkY21kIgorCWRvbmUKKworCWlmIHRlc3QgIiRwcmV2IiAhPSAnc2VkIDUwcSAiJDAiJzsgdGhlbgorCSAgZWNob190ZXN0X3N0cmluZz1gZXZhbCAkcHJldmAKKwkgIGV4cG9ydCBlY2hvX3Rlc3Rfc3RyaW5nCisJICBleGVjICR7T1JJR0lOQUxfQ09ORklHX1NIRUxMLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9fSAiJDAiICR7MSsiJEAifQorCWVsc2UKKwkgICMgT29wcy4gIFdlIGxvc3QgY29tcGxldGVseSwgc28ganVzdCBzdGljayB3aXRoIGVjaG8uCisJICBlY2hvPWVjaG8KKwlmaQorICAgICAgZmkKKyAgICBmaQorICBmaQorZmkKK2ZpCisKKyMgQ29weSBlY2hvIGFuZCBxdW90ZSB0aGUgY29weSBzdWl0YWJseSBmb3IgcGFzc2luZyB0byBsaWJ0b29sIGZyb20KKyMgdGhlIE1ha2VmaWxlLCBpbnN0ZWFkIG9mIHF1b3RpbmcgdGhlIG9yaWdpbmFsLCB3aGljaCBpcyB1c2VkIGxhdGVyLgorRUNITz0kZWNobworaWYgdGVzdCAiWCRFQ0hPIiA9ICJYJENPTkZJR19TSEVMTCAkMCAtLWZhbGxiYWNrLWVjaG8iOyB0aGVuCisgICBFQ0hPPSIkQ09ORklHX1NIRUxMIFxcXCRcJDAgLS1mYWxsYmFjay1lY2hvIgorZmkKKworCisKKwordGFnbmFtZXM9JHt0YWduYW1lcyske3RhZ25hbWVzfSx9Q1hYCisKK3RhZ25hbWVzPSR7dGFnbmFtZXMrJHt0YWduYW1lc30sfUY3NworCitleGVjIDc8JjAgPC9kZXYvbnVsbCA2PiYxCisKKyMgTmFtZSBvZiB0aGUgaG9zdC4KKyMgaG9zdG5hbWUgb24gc29tZSBzeXN0ZW1zIChTVlIzLjIsIExpbnV4KSByZXR1cm5zIGEgYm9ndXMgZXhpdCBzdGF0dXMsCisjIHNvIHVuYW1lIGdldHMgcnVuIHRvby4KK2FjX2hvc3RuYW1lPWAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAorCisjCisjIEluaXRpYWxpemF0aW9ucy4KKyMKK2FjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKK2FjX2NsZWFuX2ZpbGVzPQorYWNfY29uZmlnX2xpYm9ial9kaXI9LgorTElCT0JKUz0KK2Nyb3NzX2NvbXBpbGluZz1ubworc3ViZGlycz0KK01GTEFHUz0KK01BS0VGTEFHUz0KKworIyBJZGVudGl0eSBvZiB0aGlzIHBhY2thZ2UuCitQQUNLQUdFX05BTUU9J2xpYmdjcnlwdCcKK1BBQ0tBR0VfVEFSTkFNRT0nbGliZ2NyeXB0JworUEFDS0FHRV9WRVJTSU9OPScxLjQuNicKK1BBQ0tBR0VfU1RSSU5HPSdsaWJnY3J5cHQgMS40LjYnCitQQUNLQUdFX0JVR1JFUE9SVD0nYnVnLWxpYmdjcnlwdEBnbnVwZy5vcmcnCitQQUNLQUdFX1VSTD0nJworCithY191bmlxdWVfZmlsZT0ic3JjL2xpYmdjcnlwdC52ZXJzIgorIyBGYWN0b3JpbmcgZGVmYXVsdCBoZWFkZXJzIGZvciBtb3N0IHRlc3RzLgorYWNfaW5jbHVkZXNfZGVmYXVsdD0iXAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWZkZWYgSEFWRV9TWVNfVFlQRVNfSAorIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAorIyBpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisjaWZkZWYgU1REQ19IRUFERVJTCisjIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyBpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbHNlCisjIGlmZGVmIEhBVkVfU1RETElCX0gKKyMgIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgSEFWRV9TVFJJTkdfSAorIyBpZiAhZGVmaW5lZCBTVERDX0hFQURFUlMgJiYgZGVmaW5lZCBIQVZFX01FTU9SWV9ICisjICBpbmNsdWRlIDxtZW1vcnkuaD4KKyMgZW5kaWYKKyMgaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NUUklOR1NfSAorIyBpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKKyMgaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1RESU5UX0gKKyMgaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmIgorCithY19zdWJzdF92YXJzPSdMVExJQk9CSlMKK0xJQk9CSlMKK0JVSUxEX0ZJTEVWRVJTSU9OCitCVUlMRF9USU1FU1RBTVAKK0JVSUxEX1JFVklTSU9OCitMSUJHQ1JZUFRfRElHRVNUUworTElCR0NSWVBUX1BVQktFWV9DSVBIRVJTCitMSUJHQ1JZUFRfQ0lQSEVSUworR0NSWVBUX1JBTkRPTQorR0NSWVBUX0RJR0VTVFMKK0dDUllQVF9QVUJLRVlfQ0lQSEVSUworR0NSWVBUX0NJUEhFUlMKK0xJQkdDUllQVF9USFJFQURfTU9EVUxFUworTElCR0NSWVBUX0NPTkZJR19DRkxBR1MKK0xJQkdDUllQVF9DT05GSUdfTElCUworTElCR0NSWVBUX0NPTkZJR19BUElfVkVSU0lPTgorTk9FWEVDU1RBQ0tfRkxBR1MKK0NST1NTX0NPTVBJTElOR19GQUxTRQorQ1JPU1NfQ09NUElMSU5HX1RSVUUKK01QSV9NT0RfQ19VRElWX1FSTk5EX0ZBTFNFCitNUElfTU9EX0NfVURJVl9RUk5ORF9UUlVFCitNUElfTU9EX0NfVURJVl9GQUxTRQorTVBJX01PRF9DX1VESVZfVFJVRQorTVBJX01PRF9DX01QSUhfUlNISUZUX0ZBTFNFCitNUElfTU9EX0NfTVBJSF9SU0hJRlRfVFJVRQorTVBJX01PRF9DX01QSUhfTFNISUZUX0ZBTFNFCitNUElfTU9EX0NfTVBJSF9MU0hJRlRfVFJVRQorTVBJX01PRF9DX01QSUhfTVVMM19GQUxTRQorTVBJX01PRF9DX01QSUhfTVVMM19UUlVFCitNUElfTU9EX0NfTVBJSF9NVUwyX0ZBTFNFCitNUElfTU9EX0NfTVBJSF9NVUwyX1RSVUUKK01QSV9NT0RfQ19NUElIX01VTDFfRkFMU0UKK01QSV9NT0RfQ19NUElIX01VTDFfVFJVRQorTVBJX01PRF9DX01QSUhfU1VCMV9GQUxTRQorTVBJX01PRF9DX01QSUhfU1VCMV9UUlVFCitNUElfTU9EX0NfTVBJSF9BREQxX0ZBTFNFCitNUElfTU9EX0NfTVBJSF9BREQxX1RSVUUKK01QSV9NT0RfQVNNX1VESVZfUVJOTkRfRkFMU0UKK01QSV9NT0RfQVNNX1VESVZfUVJOTkRfVFJVRQorTVBJX01PRF9BU01fVURJVl9GQUxTRQorTVBJX01PRF9BU01fVURJVl9UUlVFCitNUElfTU9EX0FTTV9NUElIX1JTSElGVF9GQUxTRQorTVBJX01PRF9BU01fTVBJSF9SU0hJRlRfVFJVRQorTVBJX01PRF9BU01fTVBJSF9MU0hJRlRfRkFMU0UKK01QSV9NT0RfQVNNX01QSUhfTFNISUZUX1RSVUUKK01QSV9NT0RfQVNNX01QSUhfTVVMM19GQUxTRQorTVBJX01PRF9BU01fTVBJSF9NVUwzX1RSVUUKK01QSV9NT0RfQVNNX01QSUhfTVVMMl9GQUxTRQorTVBJX01PRF9BU01fTVBJSF9NVUwyX1RSVUUKK01QSV9NT0RfQVNNX01QSUhfTVVMMV9GQUxTRQorTVBJX01PRF9BU01fTVBJSF9NVUwxX1RSVUUKK01QSV9NT0RfQVNNX01QSUhfU1VCMV9GQUxTRQorTVBJX01PRF9BU01fTVBJSF9TVUIxX1RSVUUKK01QSV9NT0RfQVNNX01QSUhfQUREMV9GQUxTRQorTVBJX01PRF9BU01fTVBJSF9BREQxX1RSVUUKK01QSV9TRkxBR1MKK0RMX0xJQlMKK0ZBTExCQUNLX1NPQ0tMRU5fVAorU1lTX1NPQ0tFVF9ICitQVEhfTElCUworUFRIX0NGTEFHUworUFRIX0NPTkZJRworR1BHX0VSUk9SX0xJQlMKK0dQR19FUlJPUl9DRkxBR1MKK0dQR19FUlJPUl9DT05GSUcKK0hBVkVfTERfVkVSU0lPTl9TQ1JJUFRfRkFMU0UKK0hBVkVfTERfVkVSU0lPTl9TQ1JJUFRfVFJVRQorRU5BQkxFX09fRkxBR19NVU5HSU5HX0ZBTFNFCitFTkFCTEVfT19GTEFHX01VTkdJTkdfVFJVRQorVVNFX1JBTkRPTV9EQUVNT05fRkFMU0UKK1VTRV9SQU5ET01fREFFTU9OX1RSVUUKK0hBVkVfVzMyX1NZU1RFTV9GQUxTRQorSEFWRV9XMzJfU1lTVEVNX1RSVUUKK0xJQlRPT0wKK2FjX2N0X0Y3NworRkZMQUdTCitGNzcKK0NYWENQUAorYW1fX2Zhc3RkZXBDWFhfRkFMU0UKK2FtX19mYXN0ZGVwQ1hYX1RSVUUKK0NYWERFUE1PREUKK2FjX2N0X0NYWAorQ1hYRkxBR1MKK0NYWAorT0JKRFVNUAorQVMKK0RMTFRPT0wKK1JBTkxJQgorQVIKK0VDSE8KK0xOX1MKK0VHUkVQCitHUkVQCitSQworYW1fX2Zhc3RkZXBDQ0FTX0ZBTFNFCithbV9fZmFzdGRlcENDQVNfVFJVRQorQ0NBU0RFUE1PREUKK0NDQVNGTEFHUworQ0NBUworQ1BQCithbV9fZmFzdGRlcENDX0ZBTFNFCithbV9fZmFzdGRlcENDX1RSVUUKK0NDREVQTU9ERQorQU1ERVBCQUNLU0xBU0gKK0FNREVQX0ZBTFNFCitBTURFUF9UUlVFCithbV9fcXVvdGUKK2FtX19pbmNsdWRlCitERVBESVIKK09CSkVYVAorRVhFRVhUCithY19jdF9DQworQ1BQRkxBR1MKK0xERkxBR1MKK0NGTEFHUworQ0MKK0xJQkdDUllQVF9MVF9SRVZJU0lPTgorTElCR0NSWVBUX0xUX0FHRQorTElCR0NSWVBUX0xUX0NVUlJFTlQKK01BSU5UCitNQUlOVEFJTkVSX01PREVfRkFMU0UKK01BSU5UQUlORVJfTU9ERV9UUlVFCitob3N0X29zCitob3N0X3ZlbmRvcgoraG9zdF9jcHUKK2hvc3QKK2J1aWxkX29zCitidWlsZF92ZW5kb3IKK2J1aWxkX2NwdQorYnVpbGQKK2FtX191bnRhcgorYW1fX3RhcgorQU1UQVIKK2FtX19sZWFkaW5nX2RvdAorU0VUX01BS0UKK0FXSworbWtkaXJfcAorTUtESVJfUAorSU5TVEFMTF9TVFJJUF9QUk9HUkFNCitTVFJJUAoraW5zdGFsbF9zaAorTUFLRUlORk8KK0FVVE9IRUFERVIKK0FVVE9NQUtFCitBVVRPQ09ORgorQUNMT0NBTAorVkVSU0lPTgorUEFDS0FHRQorQ1lHUEFUSF9XCithbV9faXNyYworSU5TVEFMTF9EQVRBCitJTlNUQUxMX1NDUklQVAorSU5TVEFMTF9QUk9HUkFNCit0YXJnZXRfYWxpYXMKK2hvc3RfYWxpYXMKK2J1aWxkX2FsaWFzCitMSUJTCitFQ0hPX1QKK0VDSE9fTgorRUNIT19DCitERUZTCittYW5kaXIKK2xvY2FsZWRpcgorbGliZGlyCitwc2RpcgorcGRmZGlyCitkdmlkaXIKK2h0bWxkaXIKK2luZm9kaXIKK2RvY2Rpcgorb2xkaW5jbHVkZWRpcgoraW5jbHVkZWRpcgorbG9jYWxzdGF0ZWRpcgorc2hhcmVkc3RhdGVkaXIKK3N5c2NvbmZkaXIKK2RhdGFkaXIKK2RhdGFyb290ZGlyCitsaWJleGVjZGlyCitzYmluZGlyCitiaW5kaXIKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUKK3ByZWZpeAorZXhlY19wcmVmaXgKK1BBQ0tBR0VfVVJMCitQQUNLQUdFX0JVR1JFUE9SVAorUEFDS0FHRV9TVFJJTkcKK1BBQ0tBR0VfVkVSU0lPTgorUEFDS0FHRV9UQVJOQU1FCitQQUNLQUdFX05BTUUKK1BBVEhfU0VQQVJBVE9SCitTSEVMTCcKK2FjX3N1YnN0X2ZpbGVzPScnCithY191c2VyX29wdHM9JworZW5hYmxlX29wdGlvbl9jaGVja2luZworZW5hYmxlX21haW50YWluZXJfbW9kZQorZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmcKK2VuYWJsZV9zaGFyZWQKK2VuYWJsZV9zdGF0aWMKK2VuYWJsZV9mYXN0X2luc3RhbGwKK3dpdGhfZ251X2xkCitlbmFibGVfbGlidG9vbF9sb2NrCit3aXRoX3BpYword2l0aF90YWdzCitlbmFibGVfZW5kaWFuX2NoZWNrCitlbmFibGVfY2lwaGVycworZW5hYmxlX3B1YmtleV9jaXBoZXJzCitlbmFibGVfZGlnZXN0cworZW5hYmxlX3JhbmRvbQorZW5hYmxlX2Rldl9yYW5kb20KK3dpdGhfZWdkX3NvY2tldAorZW5hYmxlX3JhbmRvbV9kYWVtb24KK2VuYWJsZV9hc20KK2VuYWJsZV9tX2d1YXJkCit3aXRoX2NhcGFiaWxpdGllcworZW5hYmxlX2htYWNfYmluYXJ5X2NoZWNrCitlbmFibGVfcGFkbG9ja19zdXBwb3J0CitlbmFibGVfT19mbGFnX211bmdpbmcKK2VuYWJsZV9sZF92ZXJzaW9uX3NjcmlwdAord2l0aF9ncGdfZXJyb3JfcHJlZml4Cit3aXRoX3B0aF9wcmVmaXgKK2VuYWJsZV9tcGlfcGF0aAorZW5hYmxlX29wdGltaXphdGlvbgorZW5hYmxlX25vZXhlY3N0YWNrCisnCisgICAgICBhY19wcmVjaW91c192YXJzPSdidWlsZF9hbGlhcworaG9zdF9hbGlhcwordGFyZ2V0X2FsaWFzCitDQworQ0ZMQUdTCitMREZMQUdTCitMSUJTCitDUFBGTEFHUworQ1BQCitDQ0FTCitDQ0FTRkxBR1MKK0NYWAorQ1hYRkxBR1MKK0NDQworQ1hYQ1BQCitGNzcKK0ZGTEFHUycKKworCisjIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCithY19pbml0X2hlbHA9CithY19pbml0X3ZlcnNpb249ZmFsc2UKK2FjX3VucmVjb2duaXplZF9vcHRzPQorYWNfdW5yZWNvZ25pemVkX3NlcD0KKyMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCisjIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCitjYWNoZV9maWxlPS9kZXYvbnVsbAorZXhlY19wcmVmaXg9Tk9ORQorbm9fY3JlYXRlPQorbm9fcmVjdXJzaW9uPQorcHJlZml4PU5PTkUKK3Byb2dyYW1fcHJlZml4PU5PTkUKK3Byb2dyYW1fc3VmZml4PU5PTkUKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCitzaWxlbnQ9CitzaXRlPQorc3JjZGlyPQordmVyYm9zZT0KK3hfaW5jbHVkZXM9Tk9ORQoreF9saWJyYXJpZXM9Tk9ORQorCisjIEluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgb3B0aW9ucy4KKyMgVGhlc2UgYXJlIGxlZnQgdW5leHBhbmRlZCBzbyB1c2VycyBjYW4gIm1ha2UgaW5zdGFsbCBleGVjX3ByZWZpeD0vZm9vIgorIyBhbmQgYWxsIHRoZSB2YXJpYWJsZXMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgYmFzZWQgb24gZXhlY19wcmVmaXgKKyMgYnkgZGVmYXVsdCB3aWxsIGFjdHVhbGx5IGNoYW5nZS4KKyMgVXNlIGJyYWNlcyBpbnN0ZWFkIG9mIHBhcmVucyBiZWNhdXNlIHNoLCBwZXJsLCBldGMuIGFsc28gYWNjZXB0IHRoZW0uCisjIChUaGUgbGlzdCBmb2xsb3dzIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBHTlUgQ29kaW5nIFN0YW5kYXJkcy4pCitiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKK3NiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCitsaWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJworZGF0YXJvb3RkaXI9JyR7cHJlZml4fS9zaGFyZScKK2RhdGFkaXI9JyR7ZGF0YXJvb3RkaXJ9Jworc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKK3NoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJworbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKK2luY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJworb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJworZG9jZGlyPScke2RhdGFyb290ZGlyfS9kb2MvJHtQQUNLQUdFX1RBUk5BTUV9JworaW5mb2Rpcj0nJHtkYXRhcm9vdGRpcn0vaW5mbycKK2h0bWxkaXI9JyR7ZG9jZGlyfScKK2R2aWRpcj0nJHtkb2NkaXJ9JworcGRmZGlyPScke2RvY2Rpcn0nCitwc2Rpcj0nJHtkb2NkaXJ9JworbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCitsb2NhbGVkaXI9JyR7ZGF0YXJvb3RkaXJ9L2xvY2FsZScKK21hbmRpcj0nJHtkYXRhcm9vdGRpcn0vbWFuJworCithY19wcmV2PQorYWNfZGFzaGRhc2g9Citmb3IgYWNfb3B0aW9uCitkbworICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KKyAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgICAgZXZhbCAkYWNfcHJldj1cJGFjX29wdGlvbgorICAgIGFjX3ByZXY9CisgICAgY29udGludWUKKyAgZmkKKworICBjYXNlICRhY19vcHRpb24gaW4KKyAgKj0qKQlhY19vcHRhcmc9YGV4cHIgIlgkYWNfb3B0aW9uIiA6ICdbXj1dKj1cKC4qXCknYCA7OworICAqKQlhY19vcHRhcmc9eWVzIDs7CisgIGVzYWMKKworICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgorCisgIGNhc2UgJGFjX2Rhc2hkYXNoJGFjX29wdGlvbiBpbgorICAtLSkKKyAgICBhY19kYXNoZGFzaD15ZXMgOzsKKworICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQorICAgIGFjX3ByZXY9YmluZGlyIDs7CisgIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCisgICAgYmluZGlyPSRhY19vcHRhcmcgOzsKKworICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQorICAgIGFjX3ByZXY9YnVpbGRfYWxpYXMgOzsKKyAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCisgICAgYnVpbGRfYWxpYXM9JGFjX29wdGFyZyA7OworCisgIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKKyAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCisgICAgYWNfcHJldj1jYWNoZV9maWxlIDs7CisgIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAorICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQorICAgIGNhY2hlX2ZpbGU9JGFjX29wdGFyZyA7OworCisgIC0tY29uZmlnLWNhY2hlIHwgLUMpCisgICAgY2FjaGVfZmlsZT1jb25maWcuY2FjaGUgOzsKKworICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCkKKyAgICBhY19wcmV2PWRhdGFkaXIgOzsKKyAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KikKKyAgICBkYXRhZGlyPSRhY19vcHRhcmcgOzsKKworICAtZGF0YXJvb3RkaXIgfCAtLWRhdGFyb290ZGlyIHwgLS1kYXRhcm9vdGRpIHwgLS1kYXRhcm9vdGQgfCAtLWRhdGFyb290IFwKKyAgfCAtLWRhdGFyb28gfCAtLWRhdGFybyB8IC0tZGF0YXIpCisgICAgYWNfcHJldj1kYXRhcm9vdGRpciA7OworICAtZGF0YXJvb3RkaXI9KiB8IC0tZGF0YXJvb3RkaXI9KiB8IC0tZGF0YXJvb3RkaT0qIHwgLS1kYXRhcm9vdGQ9KiBcCisgIHwgLS1kYXRhcm9vdD0qIHwgLS1kYXRhcm9vPSogfCAtLWRhdGFybz0qIHwgLS1kYXRhcj0qKQorICAgIGRhdGFyb290ZGlyPSRhY19vcHRhcmcgOzsKKworICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCisgICAgYWNfdXNlcm9wdD1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKmRpc2FibGUtXCguKlwpJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgZXhwciAieCRhY191c2Vyb3B0IiA6ICIuKlteLSsuXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgIGFzX2ZuX2Vycm9yICJpbnZhbGlkIGZlYXR1cmUgbmFtZTogJGFjX3VzZXJvcHQiCisgICAgYWNfdXNlcm9wdF9vcmlnPSRhY191c2Vyb3B0CisgICAgYWNfdXNlcm9wdD1gJGFzX2VjaG8gIiRhY191c2Vyb3B0IiB8IHNlZCAncy9bLSsuXS9fL2cnYAorICAgIGNhc2UgJGFjX3VzZXJfb3B0cyBpbgorICAgICAgKiIKKyJlbmFibGVfJGFjX3VzZXJvcHQiCisiKikgOzsKKyAgICAgICopIGFjX3VucmVjb2duaXplZF9vcHRzPSIkYWNfdW5yZWNvZ25pemVkX29wdHMkYWNfdW5yZWNvZ25pemVkX3NlcC0tZGlzYWJsZS0kYWNfdXNlcm9wdF9vcmlnIgorCSBhY191bnJlY29nbml6ZWRfc2VwPScsICc7OworICAgIGVzYWMKKyAgICBldmFsIGVuYWJsZV8kYWNfdXNlcm9wdD1ubyA7OworCisgIC1kb2NkaXIgfCAtLWRvY2RpciB8IC0tZG9jZGkgfCAtLWRvYyB8IC0tZG8pCisgICAgYWNfcHJldj1kb2NkaXIgOzsKKyAgLWRvY2Rpcj0qIHwgLS1kb2NkaXI9KiB8IC0tZG9jZGk9KiB8IC0tZG9jPSogfCAtLWRvPSopCisgICAgZG9jZGlyPSRhY19vcHRhcmcgOzsKKworICAtZHZpZGlyIHwgLS1kdmlkaXIgfCAtLWR2aWRpIHwgLS1kdmlkIHwgLS1kdmkgfCAtLWR2KQorICAgIGFjX3ByZXY9ZHZpZGlyIDs7CisgIC1kdmlkaXI9KiB8IC0tZHZpZGlyPSogfCAtLWR2aWRpPSogfCAtLWR2aWQ9KiB8IC0tZHZpPSogfCAtLWR2PSopCisgICAgZHZpZGlyPSRhY19vcHRhcmcgOzsKKworICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQorICAgIGFjX3VzZXJvcHQ9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSplbmFibGUtXChbXj1dKlwpJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgZXhwciAieCRhY191c2Vyb3B0IiA6ICIuKlteLSsuXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgIGFzX2ZuX2Vycm9yICJpbnZhbGlkIGZlYXR1cmUgbmFtZTogJGFjX3VzZXJvcHQiCisgICAgYWNfdXNlcm9wdF9vcmlnPSRhY191c2Vyb3B0CisgICAgYWNfdXNlcm9wdD1gJGFzX2VjaG8gIiRhY191c2Vyb3B0IiB8IHNlZCAncy9bLSsuXS9fL2cnYAorICAgIGNhc2UgJGFjX3VzZXJfb3B0cyBpbgorICAgICAgKiIKKyJlbmFibGVfJGFjX3VzZXJvcHQiCisiKikgOzsKKyAgICAgICopIGFjX3VucmVjb2duaXplZF9vcHRzPSIkYWNfdW5yZWNvZ25pemVkX29wdHMkYWNfdW5yZWNvZ25pemVkX3NlcC0tZW5hYmxlLSRhY191c2Vyb3B0X29yaWciCisJIGFjX3VucmVjb2duaXplZF9zZXA9JywgJzs7CisgICAgZXNhYworICAgIGV2YWwgZW5hYmxlXyRhY191c2Vyb3B0PVwkYWNfb3B0YXJnIDs7CisKKyAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAorICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCisgIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQorICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKKyAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCisgIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCisgIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQorICAgIGV4ZWNfcHJlZml4PSRhY19vcHRhcmcgOzsKKworICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgorICAgIHdpdGhfZ2FzPXllcyA7OworCisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLWgpCisgICAgYWNfaW5pdF9oZWxwPWxvbmcgOzsKKyAgLWhlbHA9ciogfCAtLWhlbHA9ciogfCAtLWhlbD1yKiB8IC0taGU9ciogfCAtaHIqKQorICAgIGFjX2luaXRfaGVscD1yZWN1cnNpdmUgOzsKKyAgLWhlbHA9cyogfCAtLWhlbHA9cyogfCAtLWhlbD1zKiB8IC0taGU9cyogfCAtaHMqKQorICAgIGFjX2luaXRfaGVscD1zaG9ydCA7OworCisgIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQorICAgIGFjX3ByZXY9aG9zdF9hbGlhcyA7OworICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQorICAgIGhvc3RfYWxpYXM9JGFjX29wdGFyZyA7OworCisgIC1odG1sZGlyIHwgLS1odG1sZGlyIHwgLS1odG1sZGkgfCAtLWh0bWxkIHwgLS1odG1sIHwgLS1odG0gfCAtLWh0KQorICAgIGFjX3ByZXY9aHRtbGRpciA7OworICAtaHRtbGRpcj0qIHwgLS1odG1sZGlyPSogfCAtLWh0bWxkaT0qIHwgLS1odG1sZD0qIHwgLS1odG1sPSogfCAtLWh0bT0qIFwKKyAgfCAtLWh0PSopCisgICAgaHRtbGRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAorICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQorICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OworICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAorICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCisgICAgaW5jbHVkZWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKKyAgICBhY19wcmV2PWluZm9kaXIgOzsKKyAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKKyAgICBpbmZvZGlyPSRhY19vcHRhcmcgOzsKKworICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQorICAgIGFjX3ByZXY9bGliZGlyIDs7CisgIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKKyAgICBsaWJkaXI9JGFjX29wdGFyZyA7OworCisgIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKKyAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCisgICAgYWNfcHJldj1saWJleGVjZGlyIDs7CisgIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCisgIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQorICAgIGxpYmV4ZWNkaXI9JGFjX29wdGFyZyA7OworCisgIC1sb2NhbGVkaXIgfCAtLWxvY2FsZWRpciB8IC0tbG9jYWxlZGkgfCAtLWxvY2FsZWQgfCAtLWxvY2FsZSkKKyAgICBhY19wcmV2PWxvY2FsZWRpciA7OworICAtbG9jYWxlZGlyPSogfCAtLWxvY2FsZWRpcj0qIHwgLS1sb2NhbGVkaT0qIHwgLS1sb2NhbGVkPSogfCAtLWxvY2FsZT0qKQorICAgIGxvY2FsZWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAorICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCB8IC0tbG9jYWxzKQorICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OworICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKKyAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiB8IC0tbG9jYWxzPSopCisgICAgbG9jYWxzdGF0ZWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKKyAgICBhY19wcmV2PW1hbmRpciA7OworICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCisgICAgbWFuZGlyPSRhY19vcHRhcmcgOzsKKworICAtbmZwIHwgLS1uZnAgfCAtLW5mKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCisgICAgd2l0aF9mcD1ubyA7OworCisgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCisgIHwgLS1uby1jciB8IC0tbm8tYyB8IC1uKQorICAgIG5vX2NyZWF0ZT15ZXMgOzsKKworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCisgICAgbm9fcmVjdXJzaW9uPXllcyA7OworCisgIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKKyAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCisgIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKKyAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKKyAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCisgIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKKyAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKKyAgICBvbGRpbmNsdWRlZGlyPSRhY19vcHRhcmcgOzsKKworICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQorICAgIGFjX3ByZXY9cHJlZml4IDs7CisgIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKKyAgICBwcmVmaXg9JGFjX29wdGFyZyA7OworCisgIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCisgIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKKyAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCisgIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKKyAgICBwcm9ncmFtX3ByZWZpeD0kYWNfb3B0YXJnIDs7CisKKyAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKKyAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCisgICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OworICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKKyAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQorICAgIHByb2dyYW1fc3VmZml4PSRhY19vcHRhcmcgOzsKKworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKKyAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCisgIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKKyAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAorICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCisgICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0kYWNfb3B0YXJnIDs7CisKKyAgLXBkZmRpciB8IC0tcGRmZGlyIHwgLS1wZGZkaSB8IC0tcGRmZCB8IC0tcGRmIHwgLS1wZCkKKyAgICBhY19wcmV2PXBkZmRpciA7OworICAtcGRmZGlyPSogfCAtLXBkZmRpcj0qIHwgLS1wZGZkaT0qIHwgLS1wZGZkPSogfCAtLXBkZj0qIHwgLS1wZD0qKQorICAgIHBkZmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXBzZGlyIHwgLS1wc2RpciB8IC0tcHNkaSB8IC0tcHNkIHwgLS1wcykKKyAgICBhY19wcmV2PXBzZGlyIDs7CisgIC1wc2Rpcj0qIHwgLS1wc2Rpcj0qIHwgLS1wc2RpPSogfCAtLXBzZD0qIHwgLS1wcz0qKQorICAgIHBzZGlyPSRhY19vcHRhcmcgOzsKKworICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKKyAgICBzaWxlbnQ9eWVzIDs7CisKKyAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCisgICAgYWNfcHJldj1zYmluZGlyIDs7CisgIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCisgIHwgLS1zYmk9KiB8IC0tc2I9KikKKyAgICBzYmluZGlyPSRhY19vcHRhcmcgOzsKKworICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKKyAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCisgIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCisgIHwgLS1zaGEgfCAtLXNoKQorICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKKyAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCisgIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCisgIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAorICB8IC0tc2hhPSogfCAtLXNoPSopCisgICAgc2hhcmVkc3RhdGVkaXI9JGFjX29wdGFyZyA7OworCisgIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCisgICAgYWNfcHJldj1zaXRlIDs7CisgIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCisgICAgc2l0ZT0kYWNfb3B0YXJnIDs7CisKKyAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKKyAgICBhY19wcmV2PXNyY2RpciA7OworICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQorICAgIHNyY2Rpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAorICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKKyAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKKyAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKKyAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQorICAgIHN5c2NvbmZkaXI9JGFjX29wdGFyZyA7OworCisgIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCisgICAgYWNfcHJldj10YXJnZXRfYWxpYXMgOzsKKyAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQorICAgIHRhcmdldF9hbGlhcz0kYWNfb3B0YXJnIDs7CisKKyAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKKyAgICB2ZXJib3NlPXllcyA7OworCisgIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLVYpCisgICAgYWNfaW5pdF92ZXJzaW9uPTogOzsKKworICAtd2l0aC0qIHwgLS13aXRoLSopCisgICAgYWNfdXNlcm9wdD1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKndpdGgtXChbXj1dKlwpJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgZXhwciAieCRhY191c2Vyb3B0IiA6ICIuKlteLSsuXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgIGFzX2ZuX2Vycm9yICJpbnZhbGlkIHBhY2thZ2UgbmFtZTogJGFjX3VzZXJvcHQiCisgICAgYWNfdXNlcm9wdF9vcmlnPSRhY191c2Vyb3B0CisgICAgYWNfdXNlcm9wdD1gJGFzX2VjaG8gIiRhY191c2Vyb3B0IiB8IHNlZCAncy9bLSsuXS9fL2cnYAorICAgIGNhc2UgJGFjX3VzZXJfb3B0cyBpbgorICAgICAgKiIKKyJ3aXRoXyRhY191c2Vyb3B0IgorIiopIDs7CisgICAgICAqKSBhY191bnJlY29nbml6ZWRfb3B0cz0iJGFjX3VucmVjb2duaXplZF9vcHRzJGFjX3VucmVjb2duaXplZF9zZXAtLXdpdGgtJGFjX3VzZXJvcHRfb3JpZyIKKwkgYWNfdW5yZWNvZ25pemVkX3NlcD0nLCAnOzsKKyAgICBlc2FjCisgICAgZXZhbCB3aXRoXyRhY191c2Vyb3B0PVwkYWNfb3B0YXJnIDs7CisKKyAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQorICAgIGFjX3VzZXJvcHQ9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSp3aXRob3V0LVwoLipcKSdgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICBhc19mbl9lcnJvciAiaW52YWxpZCBwYWNrYWdlIG5hbWU6ICRhY191c2Vyb3B0IgorICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAorICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKKyAgICBjYXNlICRhY191c2VyX29wdHMgaW4KKyAgICAgICoiCisid2l0aF8kYWNfdXNlcm9wdCIKKyIqKSA7OworICAgICAgKikgYWNfdW5yZWNvZ25pemVkX29wdHM9IiRhY191bnJlY29nbml6ZWRfb3B0cyRhY191bnJlY29nbml6ZWRfc2VwLS13aXRob3V0LSRhY191c2Vyb3B0X29yaWciCisJIGFjX3VucmVjb2duaXplZF9zZXA9JywgJzs7CisgICAgZXNhYworICAgIGV2YWwgd2l0aF8kYWNfdXNlcm9wdD1ubyA7OworCisgIC0teCkKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCisgICAgd2l0aF94PXllcyA7OworCisgIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKKyAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKKyAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKKyAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKKyAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQorICAgIHhfaW5jbHVkZXM9JGFjX29wdGFyZyA7OworCisgIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCisgIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQorICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKKyAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAorICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKKyAgICB4X2xpYnJhcmllcz0kYWNfb3B0YXJnIDs7CisKKyAgLSopIGFzX2ZuX2Vycm9yICJ1bnJlY29nbml6ZWQgb3B0aW9uOiBcYCRhY19vcHRpb24nCitUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKKyAgICA7OworCisgICo9KikKKyAgICBhY19lbnZ2YXI9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4XChbXj1dKlwpPSdgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGNhc2UgJGFjX2VudnZhciBpbiAjKAorICAgICAgJycgfCBbMC05XSogfCAqWyFfJGFzX2NyX2FsbnVtXSogKQorICAgICAgYXNfZm5fZXJyb3IgImludmFsaWQgdmFyaWFibGUgbmFtZTogXGAkYWNfZW52dmFyJyIgOzsKKyAgICBlc2FjCisgICAgZXZhbCAkYWNfZW52dmFyPVwkYWNfb3B0YXJnCisgICAgZXhwb3J0ICRhY19lbnZ2YXIgOzsKKworICAqKQorICAgICMgRklYTUU6IHNob3VsZCBiZSByZW1vdmVkIGluIGF1dG9jb25mIDMuMC4KKyAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB5b3Ugc2hvdWxkIHVzZSAtLWJ1aWxkLCAtLWhvc3QsIC0tdGFyZ2V0IiA+JjIKKyAgICBleHByICJ4JGFjX29wdGlvbiIgOiAiLipbXi0uXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGludmFsaWQgaG9zdCB0eXBlOiAkYWNfb3B0aW9uIiA+JjIKKyAgICA6ICR7YnVpbGRfYWxpYXM9JGFjX29wdGlvbn0gJHtob3N0X2FsaWFzPSRhY19vcHRpb259ICR7dGFyZ2V0X2FsaWFzPSRhY19vcHRpb259CisgICAgOzsKKworICBlc2FjCitkb25lCisKK2lmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICBhY19vcHRpb249LS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgCisgIGFzX2ZuX2Vycm9yICJtaXNzaW5nIGFyZ3VtZW50IHRvICRhY19vcHRpb24iCitmaQorCitpZiB0ZXN0IC1uICIkYWNfdW5yZWNvZ25pemVkX29wdHMiOyB0aGVuCisgIGNhc2UgJGVuYWJsZV9vcHRpb25fY2hlY2tpbmcgaW4KKyAgICBubykgOzsKKyAgICBmYXRhbCkgYXNfZm5fZXJyb3IgInVucmVjb2duaXplZCBvcHRpb25zOiAkYWNfdW5yZWNvZ25pemVkX29wdHMiIDs7CisgICAgKikgICAgICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVucmVjb2duaXplZCBvcHRpb25zOiAkYWNfdW5yZWNvZ25pemVkX29wdHMiID4mMiA7OworICBlc2FjCitmaQorCisjIENoZWNrIGFsbCBkaXJlY3RvcnkgYXJndW1lbnRzIGZvciBjb25zaXN0ZW5jeS4KK2ZvciBhY192YXIgaW4JZXhlY19wcmVmaXggcHJlZml4IGJpbmRpciBzYmluZGlyIGxpYmV4ZWNkaXIgZGF0YXJvb3RkaXIgXAorCQlkYXRhZGlyIHN5c2NvbmZkaXIgc2hhcmVkc3RhdGVkaXIgbG9jYWxzdGF0ZWRpciBpbmNsdWRlZGlyIFwKKwkJb2xkaW5jbHVkZWRpciBkb2NkaXIgaW5mb2RpciBodG1sZGlyIGR2aWRpciBwZGZkaXIgcHNkaXIgXAorCQlsaWJkaXIgbG9jYWxlZGlyIG1hbmRpcgorZG8KKyAgZXZhbCBhY192YWw9XCQkYWNfdmFyCisgICMgUmVtb3ZlIHRyYWlsaW5nIHNsYXNoZXMuCisgIGNhc2UgJGFjX3ZhbCBpbgorICAgICovICkKKyAgICAgIGFjX3ZhbD1gZXhwciAiWCRhY192YWwiIDogJ1hcKC4qW14vXVwpJyBcfCAiWCRhY192YWwiIDogJ1hcKC4qXCknYAorICAgICAgZXZhbCAkYWNfdmFyPVwkYWNfdmFsOzsKKyAgZXNhYworICAjIEJlIHN1cmUgdG8gaGF2ZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZXMuCisgIGNhc2UgJGFjX3ZhbCBpbgorICAgIFtcXC8kXSogfCA/OltcXC9dKiApICBjb250aW51ZTs7CisgICAgTk9ORSB8ICcnICkgY2FzZSAkYWNfdmFyIGluICpwcmVmaXggKSBjb250aW51ZTs7IGVzYWM7OworICBlc2FjCisgIGFzX2ZuX2Vycm9yICJleHBlY3RlZCBhbiBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBmb3IgLS0kYWNfdmFyOiAkYWNfdmFsIgorZG9uZQorCisjIFRoZXJlIG1pZ2h0IGJlIHBlb3BsZSB3aG8gZGVwZW5kIG9uIHRoZSBvbGQgYnJva2VuIGJlaGF2aW9yOiBgJGhvc3QnCisjIHVzZWQgdG8gaG9sZCB0aGUgYXJndW1lbnQgb2YgLS1ob3N0IGV0Yy4KKyMgRklYTUU6IFRvIHJlbW92ZSBzb21lIGRheS4KK2J1aWxkPSRidWlsZF9hbGlhcworaG9zdD0kaG9zdF9hbGlhcwordGFyZ2V0PSR0YXJnZXRfYWxpYXMKKworIyBGSVhNRTogVG8gcmVtb3ZlIHNvbWUgZGF5LgoraWYgdGVzdCAieCRob3N0X2FsaWFzIiAhPSB4OyB0aGVuCisgIGlmIHRlc3QgIngkYnVpbGRfYWxpYXMiID0geDsgdGhlbgorICAgIGNyb3NzX2NvbXBpbGluZz1tYXliZQorICAgICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IElmIHlvdSB3YW50ZWQgdG8gc2V0IHRoZSAtLWJ1aWxkIHR5cGUsIGRvbid0IHVzZSAtLWhvc3QuCisgICAgSWYgYSBjcm9zcyBjb21waWxlciBpcyBkZXRlY3RlZCB0aGVuIGNyb3NzIGNvbXBpbGUgbW9kZSB3aWxsIGJlIHVzZWQuIiA+JjIKKyAgZWxpZiB0ZXN0ICJ4JGJ1aWxkX2FsaWFzIiAhPSAieCRob3N0X2FsaWFzIjsgdGhlbgorICAgIGNyb3NzX2NvbXBpbGluZz15ZXMKKyAgZmkKK2ZpCisKK2FjX3Rvb2xfcHJlZml4PQordGVzdCAtbiAiJGhvc3RfYWxpYXMiICYmIGFjX3Rvb2xfcHJlZml4PSRob3N0X2FsaWFzLQorCit0ZXN0ICIkc2lsZW50IiA9IHllcyAmJiBleGVjIDY+L2Rldi9udWxsCisKKworYWNfcHdkPWBwd2RgICYmIHRlc3QgLW4gIiRhY19wd2QiICYmCithY19sc19kaT1gbHMgLWRpIC5gICYmCithY19wd2RfbHNfZGk9YGNkICIkYWNfcHdkIiAmJiBscyAtZGkgLmAgfHwKKyAgYXNfZm5fZXJyb3IgIndvcmtpbmcgZGlyZWN0b3J5IGNhbm5vdCBiZSBkZXRlcm1pbmVkIgordGVzdCAiWCRhY19sc19kaSIgPSAiWCRhY19wd2RfbHNfZGkiIHx8CisgIGFzX2ZuX2Vycm9yICJwd2QgZG9lcyBub3QgcmVwb3J0IG5hbWUgb2Ygd29ya2luZyBkaXJlY3RvcnkiCisKKworIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgoraWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKKyAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIHRoZSBwYXJlbnQgZGlyZWN0b3J5LgorICBhY19jb25mZGlyPWAkYXNfZGlybmFtZSAtLSAiJGFzX215c2VsZiIgfHwKKyRhc19leHByIFgiJGFzX215c2VsZiIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkYXNfbXlzZWxmIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiRhc19teXNlbGYiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJGFzX215c2VsZiIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CiskYXNfZWNobyBYIiRhc19teXNlbGYiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXClbXi9dLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorICBzcmNkaXI9JGFjX2NvbmZkaXIKKyAgaWYgdGVzdCAhIC1yICIkc3JjZGlyLyRhY191bmlxdWVfZmlsZSI7IHRoZW4KKyAgICBzcmNkaXI9Li4KKyAgZmkKK2Vsc2UKKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubworZmkKK2lmIHRlc3QgISAtciAiJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGUiOyB0aGVuCisgIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllcyAmJiBzcmNkaXI9IiRhY19jb25mZGlyIG9yIC4uIgorICBhc19mbl9lcnJvciAiY2Fubm90IGZpbmQgc291cmNlcyAoJGFjX3VuaXF1ZV9maWxlKSBpbiAkc3JjZGlyIgorZmkKK2FjX21zZz0ic291cmNlcyBhcmUgaW4gJHNyY2RpciwgYnV0IFxgY2QgJHNyY2RpcicgZG9lcyBub3Qgd29yayIKK2FjX2Fic19jb25mZGlyPWAoCisJY2QgIiRzcmNkaXIiICYmIHRlc3QgLXIgIi4vJGFjX3VuaXF1ZV9maWxlIiB8fCBhc19mbl9lcnJvciAiJGFjX21zZyIKKwlwd2QpYAorIyBXaGVuIGJ1aWxkaW5nIGluIHBsYWNlLCBzZXQgc3JjZGlyPS4KK2lmIHRlc3QgIiRhY19hYnNfY29uZmRpciIgPSAiJGFjX3B3ZCI7IHRoZW4KKyAgc3JjZGlyPS4KK2ZpCisjIFJlbW92ZSB1bm5lY2Vzc2FyeSB0cmFpbGluZyBzbGFzaGVzIGZyb20gc3JjZGlyLgorIyBEb3VibGUgc2xhc2hlcyBpbiBmaWxlIG5hbWVzIGluIG9iamVjdCBmaWxlIGRlYnVnZ2luZyBpbmZvCisjIG1lc3MgdXAgTS14IGdkYiBpbiBFbWFjcy4KK2Nhc2UgJHNyY2RpciBpbgorKi8pIHNyY2Rpcj1gZXhwciAiWCRzcmNkaXIiIDogJ1hcKC4qW14vXVwpJyBcfCAiWCRzcmNkaXIiIDogJ1hcKC4qXCknYDs7Citlc2FjCitmb3IgYWNfdmFyIGluICRhY19wcmVjaW91c192YXJzOyBkbworICBldmFsIGFjX2Vudl8ke2FjX3Zhcn1fc2V0PVwkeyR7YWNfdmFyfStzZXR9CisgIGV2YWwgYWNfZW52XyR7YWNfdmFyfV92YWx1ZT1cJCR7YWNfdmFyfQorICBldmFsIGFjX2N2X2Vudl8ke2FjX3Zhcn1fc2V0PVwkeyR7YWNfdmFyfStzZXR9CisgIGV2YWwgYWNfY3ZfZW52XyR7YWNfdmFyfV92YWx1ZT1cJCR7YWNfdmFyfQorZG9uZQorCisjCisjIFJlcG9ydCB0aGUgLS1oZWxwIG1lc3NhZ2UuCisjCitpZiB0ZXN0ICIkYWNfaW5pdF9oZWxwIiA9ICJsb25nIjsgdGhlbgorICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KKyAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgorICBjYXQgPDxfQUNFT0YKK1xgY29uZmlndXJlJyBjb25maWd1cmVzIGxpYmdjcnlwdCAxLjQuNiB0byBhZGFwdCB0byBtYW55IGtpbmRzIG9mIHN5c3RlbXMuCisKK1VzYWdlOiAkMCBbT1BUSU9OXS4uLiBbVkFSPVZBTFVFXS4uLgorCitUbyBhc3NpZ24gZW52aXJvbm1lbnQgdmFyaWFibGVzIChlLmcuLCBDQywgQ0ZMQUdTLi4uKSwgc3BlY2lmeSB0aGVtIGFzCitWQVI9VkFMVUUuICBTZWUgYmVsb3cgZm9yIGRlc2NyaXB0aW9ucyBvZiBzb21lIG9mIHRoZSB1c2VmdWwgdmFyaWFibGVzLgorCitEZWZhdWx0cyBmb3IgdGhlIG9wdGlvbnMgYXJlIHNwZWNpZmllZCBpbiBicmFja2V0cy4KKworQ29uZmlndXJhdGlvbjoKKyAgLWgsIC0taGVscCAgICAgICAgICAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXQKKyAgICAgIC0taGVscD1zaG9ydCAgICAgICAgZGlzcGxheSBvcHRpb25zIHNwZWNpZmljIHRvIHRoaXMgcGFja2FnZQorICAgICAgLS1oZWxwPXJlY3Vyc2l2ZSAgICBkaXNwbGF5IHRoZSBzaG9ydCBoZWxwIG9mIGFsbCB0aGUgaW5jbHVkZWQgcGFja2FnZXMKKyAgLVYsIC0tdmVyc2lvbiAgICAgICAgICAgZGlzcGxheSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0CisgIC1xLCAtLXF1aWV0LCAtLXNpbGVudCAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcworICAgICAgLS1jYWNoZS1maWxlPUZJTEUgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRSBbZGlzYWJsZWRdCisgIC1DLCAtLWNvbmZpZy1jYWNoZSAgICAgIGFsaWFzIGZvciBcYC0tY2FjaGUtZmlsZT1jb25maWcuY2FjaGUnCisgIC1uLCAtLW5vLWNyZWF0ZSAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCisgICAgICAtLXNyY2Rpcj1ESVIgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIFxgLi4nXQorCitJbnN0YWxsYXRpb24gZGlyZWN0b3JpZXM6CisgIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQorICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYXQorCitCeSBkZWZhdWx0LCBcYG1ha2UgaW5zdGFsbCcgd2lsbCBpbnN0YWxsIGFsbCB0aGUgZmlsZXMgaW4KK1xgJGFjX2RlZmF1bHRfcHJlZml4L2JpbicsIFxgJGFjX2RlZmF1bHRfcHJlZml4L2xpYicgZXRjLiAgWW91IGNhbiBzcGVjaWZ5CithbiBpbnN0YWxsYXRpb24gcHJlZml4IG90aGVyIHRoYW4gXGAkYWNfZGVmYXVsdF9wcmVmaXgnIHVzaW5nIFxgLS1wcmVmaXgnLAorZm9yIGluc3RhbmNlIFxgLS1wcmVmaXg9XCRIT01FJy4KKworRm9yIGJldHRlciBjb250cm9sLCB1c2UgdGhlIG9wdGlvbnMgYmVsb3cuCisKK0ZpbmUgdHVuaW5nIG9mIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXM6CisgIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgW0VQUkVGSVgvYmluXQorICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgW0VQUkVGSVgvc2Jpbl0KKyAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBbRVBSRUZJWC9saWJleGVjXQorICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBbUFJFRklYL2V0Y10KKyAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBbUFJFRklYL2NvbV0KKyAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIFtQUkVGSVgvdmFyXQorICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgW0VQUkVGSVgvbGliXQorICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBbUFJFRklYL2luY2x1ZGVdCisgIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIFsvdXNyL2luY2x1ZGVdCisgIC0tZGF0YXJvb3RkaXI9RElSICAgICAgIHJlYWQtb25seSBhcmNoLi1pbmRlcGVuZGVudCBkYXRhIHJvb3QgW1BSRUZJWC9zaGFyZV0KKyAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIFtEQVRBUk9PVERJUl0KKyAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIFtEQVRBUk9PVERJUi9pbmZvXQorICAtLWxvY2FsZWRpcj1ESVIgICAgICAgICBsb2NhbGUtZGVwZW5kZW50IGRhdGEgW0RBVEFST09URElSL2xvY2FsZV0KKyAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gW0RBVEFST09URElSL21hbl0KKyAgLS1kb2NkaXI9RElSICAgICAgICAgICAgZG9jdW1lbnRhdGlvbiByb290IFtEQVRBUk9PVERJUi9kb2MvbGliZ2NyeXB0XQorICAtLWh0bWxkaXI9RElSICAgICAgICAgICBodG1sIGRvY3VtZW50YXRpb24gW0RPQ0RJUl0KKyAgLS1kdmlkaXI9RElSICAgICAgICAgICAgZHZpIGRvY3VtZW50YXRpb24gW0RPQ0RJUl0KKyAgLS1wZGZkaXI9RElSICAgICAgICAgICAgcGRmIGRvY3VtZW50YXRpb24gW0RPQ0RJUl0KKyAgLS1wc2Rpcj1ESVIgICAgICAgICAgICAgcHMgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQorX0FDRU9GCisKKyAgY2F0IDw8XF9BQ0VPRgorCitQcm9ncmFtIG5hbWVzOgorICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCAgICAgICAgICAgIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYICAgICAgICAgICAgYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTSAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworCitTeXN0ZW0gdHlwZXM6CisgIC0tYnVpbGQ9QlVJTEQgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW2d1ZXNzZWRdCisgIC0taG9zdD1IT1NUICAgICAgIGNyb3NzLWNvbXBpbGUgdG8gYnVpbGQgcHJvZ3JhbXMgdG8gcnVuIG9uIEhPU1QgW0JVSUxEXQorX0FDRU9GCitmaQorCitpZiB0ZXN0IC1uICIkYWNfaW5pdF9oZWxwIjsgdGhlbgorICBjYXNlICRhY19pbml0X2hlbHAgaW4KKyAgICAgc2hvcnQgfCByZWN1cnNpdmUgKSBlY2hvICJDb25maWd1cmF0aW9uIG9mIGxpYmdjcnlwdCAxLjQuNjoiOzsKKyAgIGVzYWMKKyAgY2F0IDw8XF9BQ0VPRgorCitPcHRpb25hbCBGZWF0dXJlczoKKyAgLS1kaXNhYmxlLW9wdGlvbi1jaGVja2luZyAgaWdub3JlIHVucmVjb2duaXplZCAtLWVuYWJsZS8tLXdpdGggb3B0aW9ucworICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCisgIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KKyAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlICBlbmFibGUgbWFrZSBydWxlcyBhbmQgZGVwZW5kZW5jaWVzIG5vdCB1c2VmdWwKKwkJCSAgKGFuZCBzb21ldGltZXMgY29uZnVzaW5nKSB0byB0aGUgY2FzdWFsIGluc3RhbGxlcgorICAtLWRpc2FibGUtZGVwZW5kZW5jeS10cmFja2luZyAgc3BlZWRzIHVwIG9uZS10aW1lIGJ1aWxkCisgIC0tZW5hYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgICBkbyBub3QgcmVqZWN0IHNsb3cgZGVwZW5kZW5jeSBleHRyYWN0b3JzCisgIC0tZW5hYmxlLXNoYXJlZFs9UEtHU10gIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXQorICAtLWVuYWJsZS1zdGF0aWNbPVBLR1NdICBidWlsZCBzdGF0aWMgbGlicmFyaWVzIFtkZWZhdWx0PXllc10KKyAgLS1lbmFibGUtZmFzdC1pbnN0YWxsWz1QS0dTXQorICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24gW2RlZmF1bHQ9eWVzXQorICAtLWRpc2FibGUtbGlidG9vbC1sb2NrICBhdm9pZCBsb2NraW5nIChtaWdodCBicmVhayBwYXJhbGxlbCBidWlsZHMpCisgIC0tZGlzYWJsZS1lbmRpYW4tY2hlY2sgIGRpc2FibGUgdGhlIGVuZGlhbiBjaGVjayBhbmQgdHJ1c3QgdGhlIE9TIHByb3ZpZGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvcworICAtLWVuYWJsZS1jaXBoZXJzPWNpcGhlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0IHRoZSBzeW1tZXRyaWMgY2lwaGVycyB0byBpbmNsdWRlCisgIC0tZW5hYmxlLXB1YmtleS1jaXBoZXJzPWNpcGhlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0IHRoZSBwdWJsaWMta2V5IGNpcGhlcnMgdG8gaW5jbHVkZQorICAtLWVuYWJsZS1kaWdlc3RzPWRpZ2VzdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0IHRoZSBtZXNzYWdlIGRpZ2VzdHMgdG8gaW5jbHVkZQorICAtLWVuYWJsZS1yYW5kb209bmFtZSAgICBzZWxlY3Qgd2hpY2ggcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgdG8gdXNlCisgIC0tZGlzYWJsZS1kZXYtcmFuZG9tICAgIGRpc2FibGUgdGhlIHVzZSBvZiBkZXYgcmFuZG9tCisgIC0tZW5hYmxlLXJhbmRvbS1kYWVtb24gIEJ1aWxkIGFuZCBzdXBwb3J0IHRoZSBleHBlcmltZW50YWwgZ2NyeXB0cm5kCisgIC0tZGlzYWJsZS1hc20gICAgICAgICAgIERpc2FibGUgTVBJIGFzc2VtYmxlciBtb2R1bGVzCisgIC0tZW5hYmxlLW0tZ3VhcmQgICAgICAgIEVuYWJsZSBtZW1vcnkgZ3VhcmQgZmFjaWxpdHkKKyAgLS1lbmFibGUtaG1hYy1iaW5hcnktY2hlY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRW5hYmxlIGxpYnJhcnkgaW50ZWdyaXR5IGNoZWNrCisgIC0tZGlzYWJsZS1wYWRsb2NrLXN1cHBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzYWJsZSBzdXBwb3J0IGZvciB0aGUgUGFkTG9jayBFbmdpbmUgb2YgVklBCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvcnMKKyAgLS1kaXNhYmxlLU8tZmxhZy1tdW5naW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgIERpc2FibGUgbW9kaWZpY2F0aW9uIG9mIHRoZSBjYyAtTyBmbGFnCisgIC0tZW5hYmxlLWxkLXZlcnNpb24tc2NyaXB0CisgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZS9kaXNhYmxlIHVzZSBvZiBsaW5rZXIgdmVyc2lvbiBzY3JpcHQuCisgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0IGlzIHN5c3RlbSBkZXBlbmRlbnQpCisgIC0tZW5hYmxlLW1waS1wYXRoPUVYVFJBX1BBVEgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlcGVuZCBFWFRSQV9QQVRIIHRvIGxpc3Qgb2YgQ1BVIHNwZWNpZmljCisgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXphdGlvbnMKKyAgLS1kaXNhYmxlLW9wdGltaXphdGlvbiAgZGlzYWJsZSBjb21waWxlciBvcHRpbWl6YXRpb24KKyAgLS1kaXNhYmxlLW5vZXhlY3N0YWNrICAgZGlzYWJsZSBub24gZXhlY3V0YWJsZSBzdGFjayBzdXBwb3J0CisKK09wdGlvbmFsIFBhY2thZ2VzOgorICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KKyAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQorICAtLXdpdGgtZ251LWxkICAgICAgICAgICBhc3N1bWUgdGhlIEMgY29tcGlsZXIgdXNlcyBHTlUgbGQgW2RlZmF1bHQ9bm9dCisgIC0td2l0aC1waWMgICAgICAgICAgICAgIHRyeSB0byB1c2Ugb25seSBQSUMvbm9uLVBJQyBvYmplY3RzIFtkZWZhdWx0PXVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICBib3RoXQorICAtLXdpdGgtdGFnc1s9VEFHU10gICAgICBpbmNsdWRlIGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbnMgW2F1dG9tYXRpY10KKyAgLS13aXRoLWVnZC1zb2NrZXQ9TkFNRSAgVXNlIE5BTUUgZm9yIHRoZSBFR0Qgc29ja2V0KQorICAtLXdpdGgtY2FwYWJpbGl0aWVzICAgICBVc2UgbGludXggY2FwYWJpbGl0aWVzIGRlZmF1bHQ9bm8KKyAgLS13aXRoLWdwZy1lcnJvci1wcmVmaXg9UEZYCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCB3aGVyZSBHUEcgRXJyb3IgaXMgaW5zdGFsbGVkIChvcHRpb25hbCkKKyAgLS13aXRoLXB0aC1wcmVmaXg9UEZYICAgcHJlZml4IHdoZXJlIEdOVSBQdGggaXMgaW5zdGFsbGVkIChvcHRpb25hbCkKKworU29tZSBpbmZsdWVudGlhbCBlbnZpcm9ubWVudCB2YXJpYWJsZXM6CisgIENDICAgICAgICAgIEMgY29tcGlsZXIgY29tbWFuZAorICBDRkxBR1MgICAgICBDIGNvbXBpbGVyIGZsYWdzCisgIExERkxBR1MgICAgIGxpbmtlciBmbGFncywgZS5nLiAtTDxsaWIgZGlyPiBpZiB5b3UgaGF2ZSBsaWJyYXJpZXMgaW4gYQorICAgICAgICAgICAgICBub25zdGFuZGFyZCBkaXJlY3RvcnkgPGxpYiBkaXI+CisgIExJQlMgICAgICAgIGxpYnJhcmllcyB0byBwYXNzIHRvIHRoZSBsaW5rZXIsIGUuZy4gLWw8bGlicmFyeT4KKyAgQ1BQRkxBR1MgICAgQy9DKysvT2JqZWN0aXZlIEMgcHJlcHJvY2Vzc29yIGZsYWdzLCBlLmcuIC1JPGluY2x1ZGUgZGlyPiBpZgorICAgICAgICAgICAgICB5b3UgaGF2ZSBoZWFkZXJzIGluIGEgbm9uc3RhbmRhcmQgZGlyZWN0b3J5IDxpbmNsdWRlIGRpcj4KKyAgQ1BQICAgICAgICAgQyBwcmVwcm9jZXNzb3IKKyAgQ0NBUyAgICAgICAgYXNzZW1ibGVyIGNvbXBpbGVyIGNvbW1hbmQgKGRlZmF1bHRzIHRvIENDKQorICBDQ0FTRkxBR1MgICBhc3NlbWJsZXIgY29tcGlsZXIgZmxhZ3MgKGRlZmF1bHRzIHRvIENGTEFHUykKKyAgQ1hYICAgICAgICAgQysrIGNvbXBpbGVyIGNvbW1hbmQKKyAgQ1hYRkxBR1MgICAgQysrIGNvbXBpbGVyIGZsYWdzCisgIENYWENQUCAgICAgIEMrKyBwcmVwcm9jZXNzb3IKKyAgRjc3ICAgICAgICAgRm9ydHJhbiA3NyBjb21waWxlciBjb21tYW5kCisgIEZGTEFHUyAgICAgIEZvcnRyYW4gNzcgY29tcGlsZXIgZmxhZ3MKKworVXNlIHRoZXNlIHZhcmlhYmxlcyB0byBvdmVycmlkZSB0aGUgY2hvaWNlcyBtYWRlIGJ5IGBjb25maWd1cmUnIG9yIHRvIGhlbHAKK2l0IHRvIGZpbmQgbGlicmFyaWVzIGFuZCBwcm9ncmFtcyB3aXRoIG5vbnN0YW5kYXJkIG5hbWVzL2xvY2F0aW9ucy4KKworUmVwb3J0IGJ1Z3MgdG8gPGJ1Zy1saWJnY3J5cHRAZ251cGcub3JnPi4KK19BQ0VPRgorYWNfc3RhdHVzPSQ/CitmaQorCitpZiB0ZXN0ICIkYWNfaW5pdF9oZWxwIiA9ICJyZWN1cnNpdmUiOyB0aGVuCisgICMgSWYgdGhlcmUgYXJlIHN1YmRpcnMsIHJlcG9ydCB0aGVpciBzcGVjaWZpYyAtLWhlbHAuCisgIGZvciBhY19kaXIgaW4gOiAkYWNfc3ViZGlyc19hbGw7IGRvIHRlc3QgIngkYWNfZGlyIiA9IHg6ICYmIGNvbnRpbnVlCisgICAgdGVzdCAtZCAiJGFjX2RpciIgfHwKKyAgICAgIHsgY2QgIiRzcmNkaXIiICYmIGFjX3B3ZD1gcHdkYCAmJiBzcmNkaXI9LiAmJiB0ZXN0IC1kICIkYWNfZGlyIjsgfSB8fAorICAgICAgY29udGludWUKKyAgICBhY19idWlsZGRpcj0uCisKK2Nhc2UgIiRhY19kaXIiIGluCisuKSBhY19kaXJfc3VmZml4PSBhY190b3BfYnVpbGRkaXJfc3ViPS4gYWNfdG9wX2J1aWxkX3ByZWZpeD0gOzsKKyopCisgIGFjX2Rpcl9zdWZmaXg9L2AkYXNfZWNobyAiJGFjX2RpciIgfCBzZWQgJ3N8XlwuW1xcL118fCdgCisgICMgQSAiLi4iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgYWNfdG9wX2J1aWxkZGlyX3N1Yj1gJGFzX2VjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAnc3wvW15cXC9dKnwvLi58ZztzfC98fCdgCisgIGNhc2UgJGFjX3RvcF9idWlsZGRpcl9zdWIgaW4KKyAgIiIpIGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OworICAqKSAgYWNfdG9wX2J1aWxkX3ByZWZpeD0kYWNfdG9wX2J1aWxkZGlyX3N1Yi8gOzsKKyAgZXNhYyA7OworZXNhYworYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfcHdkCithY19hYnNfYnVpbGRkaXI9JGFjX3B3ZCRhY19kaXJfc3VmZml4CisjIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OgorYWNfdG9wX2J1aWxkZGlyPSRhY190b3BfYnVpbGRfcHJlZml4CisKK2Nhc2UgJHNyY2RpciBpbgorICAuKSAgIyBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCisgICAgYWNfc3JjZGlyPS4KKyAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRkaXJfc3ViCisgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZCA7OworICBbXFwvXSogfCA/OltcXC9dKiApICAjIEFic29sdXRlIG5hbWUuCisgICAgYWNfc3JjZGlyPSRzcmNkaXIkYWNfZGlyX3N1ZmZpeDsKKyAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIKKyAgICBhY19hYnNfdG9wX3NyY2Rpcj0kc3JjZGlyIDs7CisgICopICMgUmVsYXRpdmUgbmFtZS4KKyAgICBhY19zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKKyAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRfcHJlZml4JHNyY2RpcgorICAgIGFjX2Fic190b3Bfc3JjZGlyPSRhY19wd2QvJHNyY2RpciA7OworZXNhYworYWNfYWJzX3NyY2Rpcj0kYWNfYWJzX3RvcF9zcmNkaXIkYWNfZGlyX3N1ZmZpeAorCisgICAgY2QgIiRhY19kaXIiIHx8IHsgYWNfc3RhdHVzPSQ/OyBjb250aW51ZTsgfQorICAgICMgQ2hlY2sgZm9yIGd1ZXN0ZWQgY29uZmlndXJlLgorICAgIGlmIHRlc3QgLWYgIiRhY19zcmNkaXIvY29uZmlndXJlLmdudSI7IHRoZW4KKyAgICAgIGVjaG8gJiYKKyAgICAgICRTSEVMTCAiJGFjX3NyY2Rpci9jb25maWd1cmUuZ251IiAtLWhlbHA9cmVjdXJzaXZlCisgICAgZWxpZiB0ZXN0IC1mICIkYWNfc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KKyAgICAgIGVjaG8gJiYKKyAgICAgICRTSEVMTCAiJGFjX3NyY2Rpci9jb25maWd1cmUiIC0taGVscD1yZWN1cnNpdmUKKyAgICBlbHNlCisgICAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBubyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGlzIGluICRhY19kaXIiID4mMgorICAgIGZpIHx8IGFjX3N0YXR1cz0kPworICAgIGNkICIkYWNfcHdkIiB8fCB7IGFjX3N0YXR1cz0kPzsgYnJlYWs7IH0KKyAgZG9uZQorZmkKKwordGVzdCAtbiAiJGFjX2luaXRfaGVscCIgJiYgZXhpdCAkYWNfc3RhdHVzCitpZiAkYWNfaW5pdF92ZXJzaW9uOyB0aGVuCisgIGNhdCA8PFxfQUNFT0YKK2xpYmdjcnlwdCBjb25maWd1cmUgMS40LjYKK2dlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42NAorCitDb3B5cmlnaHQgKEMpIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgorX0FDRU9GCisgIGV4aXQKK2ZpCisKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgQXV0b2NvbmYgaW5pdGlhbGl6YXRpb24uICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKworIyBhY19mbl9jX3RyeV9jb21waWxlIExJTkVOTworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUcnkgdG8gY29tcGlsZSBjb25mdGVzdC4kYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuCithY19mbl9jX3RyeV9jb21waWxlICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorICBpZiB7IHsgYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVycgorICBhY19zdGF0dXM9JD8KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQorICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1CisgICAgbXYgLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgorICBmaQorICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4gOgorICBhY19yZXR2YWw9MAorZWxzZQorICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX3JldHZhbD0xCitmaQorICBldmFsICRhc19saW5lbm9fc3RhY2s7IHRlc3QgIngkYXNfbGluZW5vX3N0YWNrIiA9IHggJiYgeyBhc19saW5lbm89OyB1bnNldCBhc19saW5lbm87fQorICByZXR1cm4gJGFjX3JldHZhbAorCit9ICMgYWNfZm5fY190cnlfY29tcGlsZQorCisjIGFjX2ZuX2NfdHJ5X2NwcCBMSU5FTk8KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUcnkgdG8gcHJlcHJvY2VzcyBjb25mdGVzdC4kYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuCithY19mbl9jX3RyeV9jcHAgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICBpZiB7IHsgYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXJyCisgIGFjX3N0YXR1cz0kPworICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIxCisgICAgY2F0IGNvbmZ0ZXN0LmVyMSA+JjUKKyAgICBtdiAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCisgIGZpCisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ID4vZGV2L251bGwgJiYgeworCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfTsgdGhlbiA6CisgIGFjX3JldHZhbD0wCitlbHNlCisgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisgICAgYWNfcmV0dmFsPTEKK2ZpCisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgdGVzdCAieCRhc19saW5lbm9fc3RhY2siID0geCAmJiB7IGFzX2xpbmVubz07IHVuc2V0IGFzX2xpbmVubzt9CisgIHJldHVybiAkYWNfcmV0dmFsCisKK30gIyBhY19mbl9jX3RyeV9jcHAKKworIyBhY19mbl9jX3RyeV9saW5rIExJTkVOTworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUcnkgdG8gbGluayBjb25mdGVzdC4kYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuCithY19mbl9jX3RyeV9saW5rICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKKyAgaWYgeyB7IGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcnIKKyAgYWNfc3RhdHVzPSQ/CisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKKyAgICBjYXQgY29uZnRlc3QuZXIxID4mNQorICAgIG12IC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKKyAgZmkKKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworCSB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyB8fAorCSAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorICAgICAgIH07IHRoZW4gOgorICBhY19yZXR2YWw9MAorZWxzZQorICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX3JldHZhbD0xCitmaQorICAjIERlbGV0ZSB0aGUgSVBBL0lQTyAoSW50ZXIgUHJvY2VkdXJhbCBBbmFseXNpcy9PcHRpbWl6YXRpb24pIGluZm9ybWF0aW9uCisgICMgY3JlYXRlZCBieSB0aGUgUEdJIGNvbXBpbGVyIChjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vKSwgYXMgaXQgd291bGQKKyAgIyBpbnRlcmZlcmUgd2l0aCB0aGUgbmV4dCBsaW5rIGNvbW1hbmQ7IGFsc28gZGVsZXRlIGEgZGlyZWN0b3J5IHRoYXQgaXMKKyAgIyBsZWZ0IGJlaGluZCBieSBBcHBsZSdzIGNvbXBpbGVyLiAgV2UgZG8gdGhpcyBiZWZvcmUgZXhlY3V0aW5nIHRoZSBhY3Rpb25zLgorICBybSAtcmYgY29uZnRlc3QuZFNZTSBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vCisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgdGVzdCAieCRhc19saW5lbm9fc3RhY2siID0geCAmJiB7IGFzX2xpbmVubz07IHVuc2V0IGFzX2xpbmVubzt9CisgIHJldHVybiAkYWNfcmV0dmFsCisKK30gIyBhY19mbl9jX3RyeV9saW5rCisKKyMgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCBMSU5FTk8gSEVBREVSIFZBUiBJTkNMVURFUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRlc3RzIHdoZXRoZXIgSEVBREVSIGV4aXN0cywgZ2l2aW5nIGEgd2FybmluZyBpZiBpdCBjYW5ub3QgYmUgY29tcGlsZWQgdXNpbmcKKyMgdGhlIGluY2x1ZGUgZmlsZXMgaW4gSU5DTFVERVMgYW5kIHNldHRpbmcgdGhlIGNhY2hlIHZhcmlhYmxlIFZBUgorIyBhY2NvcmRpbmdseS4KK2FjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICBpZiB7IGFzX3Zhcj0kMzsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbiA6CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4uLiAiID4mNjsgfQoraWYgeyBhc192YXI9JDM7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZmkKK2V2YWwgYWNfcmVzPVwkJDMKKwkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQorJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQorZWxzZQorICAjIElzIHRoZSBoZWFkZXIgY29tcGlsYWJsZT8KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgJDIgdXNhYmlsaXR5IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nICQyIHVzYWJpbGl0eS4uLiAiID4mNjsgfQorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJDQKKyNpbmNsdWRlIDwkMj4KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19oZWFkZXJfY29tcGlsZXI9eWVzCitlbHNlCisgIGFjX2hlYWRlcl9jb21waWxlcj1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQorJGFzX2VjaG8gIiRhY19oZWFkZXJfY29tcGlsZXIiID4mNjsgfQorCisjIElzIHRoZSBoZWFkZXIgcHJlc2VudD8KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgJDIgcHJlc2VuY2UiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgJDIgcHJlc2VuY2UuLi4gIiA+JjY7IH0KK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDwkMj4KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2hlYWRlcl9wcmVwcm9jPXllcworZWxzZQorICBhY19oZWFkZXJfcHJlcHJvYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjUKKyRhc19lY2hvICIkYWNfaGVhZGVyX3ByZXByb2MiID4mNjsgfQorCisjIFNvPyAgV2hhdCBhYm91dCB0aGlzIGhlYWRlcj8KK2Nhc2UgJGFjX2hlYWRlcl9jb21waWxlcjokYWNfaGVhZGVyX3ByZXByb2M6JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4gIygoCisgIHllczpubzogKQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mMjt9CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiYyO30KKyAgICA7OworICBubzp5ZXM6KiApCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mMjt9CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiYyO30KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiYyO30KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjI7fQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mMjt9CisoIGNhdCA8PFxfQVNCT1gKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBSZXBvcnQgdGhpcyB0byBidWctbGliZ2NyeXB0QGdudXBnLm9yZyAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKK19BU0JPWAorICAgICApIHwgc2VkICJzL14vJGFzX21lOiBXQVJOSU5HOiAgICAgLyIgPiYyCisgICAgOzsKK2VzYWMKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJDIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICQyLi4uICIgPiY2OyB9CitpZiB7IGFzX3Zhcj0kMzsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGV2YWwgIiQzPVwkYWNfaGVhZGVyX2NvbXBpbGVyIgorZmkKK2V2YWwgYWNfcmVzPVwkJDMKKwkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQorJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQorZmkKKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyB0ZXN0ICJ4JGFzX2xpbmVub19zdGFjayIgPSB4ICYmIHsgYXNfbGluZW5vPTsgdW5zZXQgYXNfbGluZW5vO30KKworfSAjIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwKKworIyBhY19mbl9jX3RyeV9ydW4gTElORU5PCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVHJ5IHRvIGxpbmsgY29uZnRlc3QuJGFjX2V4dCwgYW5kIHJldHVybiB3aGV0aGVyIHRoaXMgc3VjY2VlZGVkLiBBc3N1bWVzCisjIHRoYXQgZXhlY3V0YWJsZXMgKmNhbiogYmUgcnVuLgorYWNfZm5fY190cnlfcnVuICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgaWYgeyB7IGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JworICB7IHsgY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfdHJ5IikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IH07IHRoZW4gOgorICBhY19yZXR2YWw9MAorZWxzZQorICAkYXNfZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKKyAgICAgICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworICAgICAgIGFjX3JldHZhbD0kYWNfc3RhdHVzCitmaQorICBybSAtcmYgY29uZnRlc3QuZFNZTSBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vCisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgdGVzdCAieCRhc19saW5lbm9fc3RhY2siID0geCAmJiB7IGFzX2xpbmVubz07IHVuc2V0IGFzX2xpbmVubzt9CisgIHJldHVybiAkYWNfcmV0dmFsCisKK30gIyBhY19mbl9jX3RyeV9ydW4KKworIyBhY19mbl9jX2NoZWNrX2hlYWRlcl9jb21waWxlIExJTkVOTyBIRUFERVIgVkFSIElOQ0xVREVTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGVzdHMgd2hldGhlciBIRUFERVIgZXhpc3RzIGFuZCBjYW4gYmUgY29tcGlsZWQgdXNpbmcgdGhlIGluY2x1ZGUgZmlsZXMgaW4KKyMgSU5DTFVERVMsIHNldHRpbmcgdGhlIGNhY2hlIHZhcmlhYmxlIFZBUiBhY2NvcmRpbmdseS4KK2FjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkMiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJDIuLi4gIiA+JjY7IH0KK2lmIHsgYXNfdmFyPSQzOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJDQKKyNpbmNsdWRlIDwkMj4KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBldmFsICIkMz15ZXMiCitlbHNlCisgIGV2YWwgIiQzPW5vIgorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2V2YWwgYWNfcmVzPVwkJDMKKwkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQorJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQorICBldmFsICRhc19saW5lbm9fc3RhY2s7IHRlc3QgIngkYXNfbGluZW5vX3N0YWNrIiA9IHggJiYgeyBhc19saW5lbm89OyB1bnNldCBhc19saW5lbm87fQorCit9ICMgYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZQorCisjIGFjX2ZuX2NfY2hlY2tfZnVuYyBMSU5FTk8gRlVOQyBWQVIKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUZXN0cyB3aGV0aGVyIEZVTkMgZXhpc3RzLCBzZXR0aW5nIHRoZSBjYWNoZSB2YXJpYWJsZSBWQVIgYWNjb3JkaW5nbHkKK2FjX2ZuX2NfY2hlY2tfZnVuYyAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4uLiAiID4mNjsgfQoraWYgeyBhc192YXI9JDM7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisvKiBEZWZpbmUgJDIgdG8gYW4gaW5ub2N1b3VzIHZhcmlhbnQsIGluIGNhc2UgPGxpbWl0cy5oPiBkZWNsYXJlcyAkMi4KKyAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLworI2RlZmluZSAkMiBpbm5vY3VvdXNfJDIKKworLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJDIgKCk7IGJlbG93LgorICAgIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgICA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuICAqLworCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCisjdW5kZWYgJDIKKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciAkMiAoKTsKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgX19zdHViXyQyIHx8IGRlZmluZWQgX19zdHViX19fJDIKK2Nob2tlIG1lCisjZW5kaWYKKworaW50CittYWluICgpCit7CityZXR1cm4gJDIgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZXZhbCAiJDM9eWVzIgorZWxzZQorICBldmFsICIkMz1ubyIKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2V2YWwgYWNfcmVzPVwkJDMKKwkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQorJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQorICBldmFsICRhc19saW5lbm9fc3RhY2s7IHRlc3QgIngkYXNfbGluZW5vX3N0YWNrIiA9IHggJiYgeyBhc19saW5lbm89OyB1bnNldCBhc19saW5lbm87fQorCit9ICMgYWNfZm5fY19jaGVja19mdW5jCisKKyMgYWNfZm5fY3h4X3RyeV9jb21waWxlIExJTkVOTworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRyeSB0byBjb21waWxlIGNvbmZ0ZXN0LiRhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4KK2FjX2ZuX2N4eF90cnlfY29tcGlsZSAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKyAgaWYgeyB7IGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcnIKKyAgYWNfc3RhdHVzPSQ/CisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKKyAgICBjYXQgY29uZnRlc3QuZXIxID4mNQorICAgIG12IC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKKyAgZmkKKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4gOgorICBhY19yZXR2YWw9MAorZWxzZQorICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX3JldHZhbD0xCitmaQorICBldmFsICRhc19saW5lbm9fc3RhY2s7IHRlc3QgIngkYXNfbGluZW5vX3N0YWNrIiA9IHggJiYgeyBhc19saW5lbm89OyB1bnNldCBhc19saW5lbm87fQorICByZXR1cm4gJGFjX3JldHZhbAorCit9ICMgYWNfZm5fY3h4X3RyeV9jb21waWxlCisKKyMgYWNfZm5fY3h4X3RyeV9jcHAgTElORU5PCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUcnkgdG8gcHJlcHJvY2VzcyBjb25mdGVzdC4kYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuCithY19mbl9jeHhfdHJ5X2NwcCAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIGlmIHsgeyBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcnIKKyAgYWNfc3RhdHVzPSQ/CisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKKyAgICBjYXQgY29uZnRlc3QuZXIxID4mNQorICAgIG12IC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKKyAgZmkKKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gPi9kZXYvbnVsbCAmJiB7CisJIHRlc3QgLXogIiRhY19jeHhfcHJlcHJvY193YXJuX2ZsYWckYWNfY3h4X3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfTsgdGhlbiA6CisgIGFjX3JldHZhbD0wCitlbHNlCisgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisgICAgYWNfcmV0dmFsPTEKK2ZpCisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgdGVzdCAieCRhc19saW5lbm9fc3RhY2siID0geCAmJiB7IGFzX2xpbmVubz07IHVuc2V0IGFzX2xpbmVubzt9CisgIHJldHVybiAkYWNfcmV0dmFsCisKK30gIyBhY19mbl9jeHhfdHJ5X2NwcAorCisjIGFjX2ZuX2N4eF90cnlfbGluayBMSU5FTk8KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUcnkgdG8gbGluayBjb25mdGVzdC4kYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuCithY19mbl9jeHhfdHJ5X2xpbmsgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorICBpZiB7IHsgYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVycgorICBhY19zdGF0dXM9JD8KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQorICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1CisgICAgbXYgLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgorICBmaQorICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmIHsKKwkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKwkgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQKKyAgICAgICB9OyB0aGVuIDoKKyAgYWNfcmV0dmFsPTAKK2Vsc2UKKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19yZXR2YWw9MQorZmkKKyAgIyBEZWxldGUgdGhlIElQQS9JUE8gKEludGVyIFByb2NlZHVyYWwgQW5hbHlzaXMvT3B0aW1pemF0aW9uKSBpbmZvcm1hdGlvbgorICAjIGNyZWF0ZWQgYnkgdGhlIFBHSSBjb21waWxlciAoY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyksIGFzIGl0IHdvdWxkCisgICMgaW50ZXJmZXJlIHdpdGggdGhlIG5leHQgbGluayBjb21tYW5kOyBhbHNvIGRlbGV0ZSBhIGRpcmVjdG9yeSB0aGF0IGlzCisgICMgbGVmdCBiZWhpbmQgYnkgQXBwbGUncyBjb21waWxlci4gIFdlIGRvIHRoaXMgYmVmb3JlIGV4ZWN1dGluZyB0aGUgYWN0aW9ucy4KKyAgcm0gLXJmIGNvbmZ0ZXN0LmRTWU0gY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbworICBldmFsICRhc19saW5lbm9fc3RhY2s7IHRlc3QgIngkYXNfbGluZW5vX3N0YWNrIiA9IHggJiYgeyBhc19saW5lbm89OyB1bnNldCBhc19saW5lbm87fQorICByZXR1cm4gJGFjX3JldHZhbAorCit9ICMgYWNfZm5fY3h4X3RyeV9saW5rCisKKyMgYWNfZm5fY3h4X2NoZWNrX2Z1bmMgTElORU5PIEZVTkMgVkFSCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUZXN0cyB3aGV0aGVyIEZVTkMgZXhpc3RzLCBzZXR0aW5nIHRoZSBjYWNoZSB2YXJpYWJsZSBWQVIgYWNjb3JkaW5nbHkKK2FjX2ZuX2N4eF9jaGVja19mdW5jICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJDIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICQyLi4uICIgPiY2OyB9CitpZiB7IGFzX3Zhcj0kMzsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKy8qIERlZmluZSAkMiB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzICQyLgorICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCisjZGVmaW5lICQyIGlubm9jdW91c18kMgorCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkMiAoKTsgYmVsb3cuCisgICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCisKKyNpZmRlZiBfX1NURENfXworIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisKKyN1bmRlZiAkMgorCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyICQyICgpOworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCBfX3N0dWJfJDIgfHwgZGVmaW5lZCBfX3N0dWJfX18kMgorY2hva2UgbWUKKyNlbmRpZgorCitpbnQKK21haW4gKCkKK3sKK3JldHVybiAkMiAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY3h4X3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGV2YWwgIiQzPXllcyIKK2Vsc2UKKyAgZXZhbCAiJDM9bm8iCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitldmFsIGFjX3Jlcz1cJCQzCisJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyB0ZXN0ICJ4JGFzX2xpbmVub19zdGFjayIgPSB4ICYmIHsgYXNfbGluZW5vPTsgdW5zZXQgYXNfbGluZW5vO30KKworfSAjIGFjX2ZuX2N4eF9jaGVja19mdW5jCisKKyMgYWNfZm5fZjc3X3RyeV9jb21waWxlIExJTkVOTworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRyeSB0byBjb21waWxlIGNvbmZ0ZXN0LiRhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4KK2FjX2ZuX2Y3N190cnlfY29tcGlsZSAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKyAgaWYgeyB7IGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcnIKKyAgYWNfc3RhdHVzPSQ/CisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKKyAgICBjYXQgY29uZnRlc3QuZXIxID4mNQorICAgIG12IC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKKyAgZmkKKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfZjc3X3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4gOgorICBhY19yZXR2YWw9MAorZWxzZQorICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX3JldHZhbD0xCitmaQorICBldmFsICRhc19saW5lbm9fc3RhY2s7IHRlc3QgIngkYXNfbGluZW5vX3N0YWNrIiA9IHggJiYgeyBhc19saW5lbm89OyB1bnNldCBhc19saW5lbm87fQorICByZXR1cm4gJGFjX3JldHZhbAorCit9ICMgYWNfZm5fZjc3X3RyeV9jb21waWxlCisKKyMgYWNfZm5fZjc3X3RyeV9saW5rIExJTkVOTworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRyeSB0byBsaW5rIGNvbmZ0ZXN0LiRhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4KK2FjX2ZuX2Y3N190cnlfbGluayAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CisgIGlmIHsgeyBhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXJyCisgIGFjX3N0YXR1cz0kPworICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIxCisgICAgY2F0IGNvbmZ0ZXN0LmVyMSA+JjUKKyAgICBtdiAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCisgIGZpCisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Y3N193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworCSB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyB8fAorCSAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorICAgICAgIH07IHRoZW4gOgorICBhY19yZXR2YWw9MAorZWxzZQorICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX3JldHZhbD0xCitmaQorICAjIERlbGV0ZSB0aGUgSVBBL0lQTyAoSW50ZXIgUHJvY2VkdXJhbCBBbmFseXNpcy9PcHRpbWl6YXRpb24pIGluZm9ybWF0aW9uCisgICMgY3JlYXRlZCBieSB0aGUgUEdJIGNvbXBpbGVyIChjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vKSwgYXMgaXQgd291bGQKKyAgIyBpbnRlcmZlcmUgd2l0aCB0aGUgbmV4dCBsaW5rIGNvbW1hbmQ7IGFsc28gZGVsZXRlIGEgZGlyZWN0b3J5IHRoYXQgaXMKKyAgIyBsZWZ0IGJlaGluZCBieSBBcHBsZSdzIGNvbXBpbGVyLiAgV2UgZG8gdGhpcyBiZWZvcmUgZXhlY3V0aW5nIHRoZSBhY3Rpb25zLgorICBybSAtcmYgY29uZnRlc3QuZFNZTSBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vCisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgdGVzdCAieCRhc19saW5lbm9fc3RhY2siID0geCAmJiB7IGFzX2xpbmVubz07IHVuc2V0IGFzX2xpbmVubzt9CisgIHJldHVybiAkYWNfcmV0dmFsCisKK30gIyBhY19mbl9mNzdfdHJ5X2xpbmsKKworIyBhY19mbl9jX2NvbXB1dGVfaW50IExJTkVOTyBFWFBSIFZBUiBJTkNMVURFUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUcmllcyB0byBmaW5kIHRoZSBjb21waWxlLXRpbWUgdmFsdWUgb2YgRVhQUiBpbiBhIHByb2dyYW0gdGhhdCBpbmNsdWRlcworIyBJTkNMVURFUywgc2V0dGluZyBWQVIgYWNjb3JkaW5nbHkuIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgY291bGQgYmUKKyMgY29tcHV0ZWQKK2FjX2ZuX2NfY29tcHV0ZV9pbnQgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICAgICMgRGVwZW5kaW5nIHVwb24gdGhlIHNpemUsIGNvbXB1dGUgdGhlIGxvIGFuZCBoaSBib3VuZHMuCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNAoraW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoJDIpID49IDApXTsKK3Rlc3RfYXJyYXkgWzBdID0gMAorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfbG89MCBhY19taWQ9MAorICB3aGlsZSA6OyBkbworICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyQ0CitpbnQKK21haW4gKCkKK3sKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgkMikgPD0gJGFjX21pZCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19oaT0kYWNfbWlkOyBicmVhaworZWxzZQorICBhc19mbl9hcml0aCAkYWNfbWlkICsgMSAmJiBhY19sbz0kYXNfdmFsCisJCQlpZiB0ZXN0ICRhY19sbyAtbGUgJGFjX21pZDsgdGhlbgorCQkJICBhY19sbz0gYWNfaGk9CisJCQkgIGJyZWFrCisJCQlmaQorCQkJYXNfZm5fYXJpdGggMiAnKicgJGFjX21pZCArIDEgJiYgYWNfbWlkPSRhc192YWwKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgZG9uZQorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNAoraW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoJDIpIDwgMCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19oaT0tMSBhY19taWQ9LTEKKyAgd2hpbGUgOjsgZG8KKyAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNAoraW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoJDIpID49ICRhY19taWQpXTsKK3Rlc3RfYXJyYXkgWzBdID0gMAorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfbG89JGFjX21pZDsgYnJlYWsKK2Vsc2UKKyAgYXNfZm5fYXJpdGggJygnICRhY19taWQgJyknIC0gMSAmJiBhY19oaT0kYXNfdmFsCisJCQlpZiB0ZXN0ICRhY19taWQgLWxlICRhY19oaTsgdGhlbgorCQkJICBhY19sbz0gYWNfaGk9CisJCQkgIGJyZWFrCisJCQlmaQorCQkJYXNfZm5fYXJpdGggMiAnKicgJGFjX21pZCAmJiBhY19taWQ9JGFzX3ZhbAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICBkb25lCitlbHNlCisgIGFjX2xvPSBhY19oaT0KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyMgQmluYXJ5IHNlYXJjaCBiZXR3ZWVuIGxvIGFuZCBoaSBib3VuZHMuCit3aGlsZSB0ZXN0ICJ4JGFjX2xvIiAhPSAieCRhY19oaSI7IGRvCisgIGFzX2ZuX2FyaXRoICcoJyAkYWNfaGkgLSAkYWNfbG8gJyknIC8gMiArICRhY19sbyAmJiBhY19taWQ9JGFzX3ZhbAorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNAoraW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoJDIpIDw9ICRhY19taWQpXTsKK3Rlc3RfYXJyYXkgWzBdID0gMAorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfaGk9JGFjX21pZAorZWxzZQorICBhc19mbl9hcml0aCAnKCcgJGFjX21pZCAnKScgKyAxICYmIGFjX2xvPSRhc192YWwKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2RvbmUKK2Nhc2UgJGFjX2xvIGluICMoKAorPyopIGV2YWwgIiQzPVwkYWNfbG8iOyBhY19yZXR2YWw9MCA7OworJycpIGFjX3JldHZhbD0xIDs7Citlc2FjCisgIGVsc2UKKyAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNAorc3RhdGljIGxvbmcgaW50IGxvbmd2YWwgKCkgeyByZXR1cm4gJDI7IH0KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGludCB1bG9uZ3ZhbCAoKSB7IHJldHVybiAkMjsgfQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CitpbnQKK21haW4gKCkKK3sKKworICBGSUxFICpmID0gZm9wZW4gKCJjb25mdGVzdC52YWwiLCAidyIpOworICBpZiAoISBmKQorICAgIHJldHVybiAxOworICBpZiAoKCQyKSA8IDApCisgICAgeworICAgICAgbG9uZyBpbnQgaSA9IGxvbmd2YWwgKCk7CisgICAgICBpZiAoaSAhPSAoJDIpKQorCXJldHVybiAxOworICAgICAgZnByaW50ZiAoZiwgIiVsZCIsIGkpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgaW50IGkgPSB1bG9uZ3ZhbCAoKTsKKyAgICAgIGlmIChpICE9ICgkMikpCisJcmV0dXJuIDE7CisgICAgICBmcHJpbnRmIChmLCAiJWx1IiwgaSk7CisgICAgfQorICAvKiBEbyBub3Qgb3V0cHV0IGEgdHJhaWxpbmcgbmV3bGluZSwgYXMgdGhpcyBjYXVzZXMgXHJcbiBjb25mdXNpb24KKyAgICAgb24gc29tZSBwbGF0Zm9ybXMuICAqLworICByZXR1cm4gZmVycm9yIChmKSB8fCBmY2xvc2UgKGYpICE9IDA7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6CisgIGVjaG8gPj5jb25mdGVzdC52YWw7IHJlYWQgJDMgPGNvbmZ0ZXN0LnZhbDsgYWNfcmV0dmFsPTAKK2Vsc2UKKyAgYWNfcmV0dmFsPTEKK2ZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCisgIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb25mdGVzdC52YWwKKworICBmaQorICBldmFsICRhc19saW5lbm9fc3RhY2s7IHRlc3QgIngkYXNfbGluZW5vX3N0YWNrIiA9IHggJiYgeyBhc19saW5lbm89OyB1bnNldCBhc19saW5lbm87fQorICByZXR1cm4gJGFjX3JldHZhbAorCit9ICMgYWNfZm5fY19jb21wdXRlX2ludAorCisjIGFjX2ZuX2NfY2hlY2tfdHlwZSBMSU5FTk8gVFlQRSBWQVIgSU5DTFVERVMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUZXN0cyB3aGV0aGVyIFRZUEUgZXhpc3RzIGFmdGVyIGhhdmluZyBpbmNsdWRlZCBJTkNMVURFUywgc2V0dGluZyBjYWNoZQorIyB2YXJpYWJsZSBWQVIgYWNjb3JkaW5nbHkuCithY19mbl9jX2NoZWNrX3R5cGUgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkMiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJDIuLi4gIiA+JjY7IH0KK2lmIHsgYXNfdmFyPSQzOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgZXZhbCAiJDM9bm8iCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyQ0CitpbnQKK21haW4gKCkKK3sKK2lmIChzaXplb2YgKCQyKSkKKwkgcmV0dXJuIDA7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJDQKK2ludAorbWFpbiAoKQoreworaWYgKHNpemVvZiAoKCQyKSkpCisJICAgIHJldHVybiAwOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisKK2Vsc2UKKyAgZXZhbCAiJDM9eWVzIgorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2V2YWwgYWNfcmVzPVwkJDMKKwkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQorJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQorICBldmFsICRhc19saW5lbm9fc3RhY2s7IHRlc3QgIngkYXNfbGluZW5vX3N0YWNrIiA9IHggJiYgeyBhc19saW5lbm89OyB1bnNldCBhc19saW5lbm87fQorCit9ICMgYWNfZm5fY19jaGVja190eXBlCisKKyMgYWNfZm5fY19jaGVja19kZWNsIExJTkVOTyBTWU1CT0wgVkFSCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUZXN0cyB3aGV0aGVyIFNZTUJPTCBpcyBkZWNsYXJlZCwgc2V0dGluZyBjYWNoZSB2YXJpYWJsZSBWQVIgYWNjb3JkaW5nbHkuCithY19mbl9jX2NoZWNrX2RlY2wgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJDIgaXMgZGVjbGFyZWQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAkMiBpcyBkZWNsYXJlZC4uLiAiID4mNjsgfQoraWYgeyBhc192YXI9JDM7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNAoraW50CittYWluICgpCit7CisjaWZuZGVmICQyCisgICh2b2lkKSAkMjsKKyNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZXZhbCAiJDM9eWVzIgorZWxzZQorICBldmFsICIkMz1ubyIKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitldmFsIGFjX3Jlcz1cJCQzCisJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyB0ZXN0ICJ4JGFzX2xpbmVub19zdGFjayIgPSB4ICYmIHsgYXNfbGluZW5vPTsgdW5zZXQgYXNfbGluZW5vO30KKworfSAjIGFjX2ZuX2NfY2hlY2tfZGVjbAorY2F0ID5jb25maWcubG9nIDw8X0FDRU9GCitUaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQorcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KKworSXQgd2FzIGNyZWF0ZWQgYnkgbGliZ2NyeXB0ICRhc19tZSAxLjQuNiwgd2hpY2ggd2FzCitnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjQuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKKworICAkICQwICRACisKK19BQ0VPRgorZXhlYyA1Pj5jb25maWcubG9nCit7CitjYXQgPDxfQVNVTkFNRQorIyMgLS0tLS0tLS0tICMjCisjIyBQbGF0Zm9ybS4gIyMKKyMjIC0tLS0tLS0tLSAjIworCitob3N0bmFtZSA9IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAordW5hbWUgLW0gPSBgKHVuYW1lIC1tKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtciA9IGAodW5hbWUgLXIpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC1zID0gYCh1bmFtZSAtcykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXYgPSBgKHVuYW1lIC12KSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCisKKy91c3IvYmluL3VuYW1lIC1wID0gYCgvdXNyL2Jpbi91bmFtZSAtcCkgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAorL2Jpbi91bmFtZSAtWCAgICAgPSBgKC9iaW4vdW5hbWUgLVgpIDI+L2Rldi9udWxsICAgICB8fCBlY2hvIHVua25vd25gCisKKy9iaW4vYXJjaCAgICAgICAgICAgICAgPSBgKC9iaW4vYXJjaCkgMj4vZGV2L251bGwgICAgICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKy91c3IvYmluL2FyY2ggLWsgICAgICAgPSBgKC91c3IvYmluL2FyY2ggLWspIDI+L2Rldi9udWxsICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKy91c3IvY29udmV4L2dldHN5c2luZm8gPSBgKC91c3IvY29udmV4L2dldHN5c2luZm8pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKy91c3IvYmluL2hvc3RpbmZvICAgICAgPSBgKC91c3IvYmluL2hvc3RpbmZvKSAyPi9kZXYvbnVsbCAgICAgIHx8IGVjaG8gdW5rbm93bmAKKy9iaW4vbWFjaGluZSAgICAgICAgICAgPSBgKC9iaW4vbWFjaGluZSkgMj4vZGV2L251bGwgICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKy91c3IvYmluL29zbGV2ZWwgICAgICAgPSBgKC91c3IvYmluL29zbGV2ZWwpIDI+L2Rldi9udWxsICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKy9iaW4vdW5pdmVyc2UgICAgICAgICAgPSBgKC9iaW4vdW5pdmVyc2UpIDI+L2Rldi9udWxsICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKworX0FTVU5BTUUKKworYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgICRhc19lY2hvICJQQVRIOiAkYXNfZGlyIgorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK30gPiY1CisKK2NhdCA+JjUgPDxfQUNFT0YKKworCisjIyAtLS0tLS0tLS0tLSAjIworIyMgQ29yZSB0ZXN0cy4gIyMKKyMjIC0tLS0tLS0tLS0tICMjCisKK19BQ0VPRgorCisKKyMgS2VlcCBhIHRyYWNlIG9mIHRoZSBjb21tYW5kIGxpbmUuCisjIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KKyMgU3RyaXAgb3V0IC0tc2lsZW50IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byByZWNvcmQgaXQgZm9yIGZ1dHVyZSBydW5zLgorIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YS1jaGFyYWN0ZXJzLgorIyBNYWtlIHR3byBwYXNzZXMgdG8gYWxsb3cgZm9yIHByb3BlciBkdXBsaWNhdGUtYXJndW1lbnQgc3VwcHJlc3Npb24uCithY19jb25maWd1cmVfYXJncz0KK2FjX2NvbmZpZ3VyZV9hcmdzMD0KK2FjX2NvbmZpZ3VyZV9hcmdzMT0KK2FjX211c3Rfa2VlcF9uZXh0PWZhbHNlCitmb3IgYWNfcGFzcyBpbiAxIDIKK2RvCisgIGZvciBhY19hcmcKKyAgZG8KKyAgICBjYXNlICRhY19hcmcgaW4KKyAgICAtbm8tY3JlYXRlIHwgLS1uby1jKiB8IC1uIHwgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tciopIGNvbnRpbnVlIDs7CisgICAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKKyAgICAgIGNvbnRpbnVlIDs7CisgICAgKlwnKikKKyAgICAgIGFjX2FyZz1gJGFzX2VjaG8gIiRhY19hcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7CisgICAgZXNhYworICAgIGNhc2UgJGFjX3Bhc3MgaW4KKyAgICAxKSBhc19mbl9hcHBlbmQgYWNfY29uZmlndXJlX2FyZ3MwICIgJyRhY19hcmcnIiA7OworICAgIDIpCisgICAgICBhc19mbl9hcHBlbmQgYWNfY29uZmlndXJlX2FyZ3MxICIgJyRhY19hcmcnIgorICAgICAgaWYgdGVzdCAkYWNfbXVzdF9rZWVwX25leHQgPSB0cnVlOyB0aGVuCisJYWNfbXVzdF9rZWVwX25leHQ9ZmFsc2UgIyBHb3QgdmFsdWUsIGJhY2sgdG8gbm9ybWFsLgorICAgICAgZWxzZQorCWNhc2UgJGFjX2FyZyBpbgorCSAgKj0qIHwgLS1jb25maWctY2FjaGUgfCAtQyB8IC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKiBcCisJICB8IC1lbmFibGUtKiB8IC0tZW5hYmxlLSogfCAtZ2FzIHwgLS1nKiB8IC1uZnAgfCAtLW5mKiBcCisJICB8IC1xIHwgLXF1aWV0IHwgLS1xKiB8IC1zaWxlbnQgfCAtLXNpbCogfCAtdiB8IC12ZXJiKiBcCisJICB8IC13aXRoLSogfCAtLXdpdGgtKiB8IC13aXRob3V0LSogfCAtLXdpdGhvdXQtKiB8IC0teCkKKwkgICAgY2FzZSAiJGFjX2NvbmZpZ3VyZV9hcmdzMCAiIGluCisJICAgICAgIiRhY19jb25maWd1cmVfYXJnczEiKiIgJyRhY19hcmcnICIqICkgY29udGludWUgOzsKKwkgICAgZXNhYworCSAgICA7OworCSAgLSogKSBhY19tdXN0X2tlZXBfbmV4dD10cnVlIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGFzX2ZuX2FwcGVuZCBhY19jb25maWd1cmVfYXJncyAiICckYWNfYXJnJyIKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCitkb25lCit7IGFjX2NvbmZpZ3VyZV9hcmdzMD07IHVuc2V0IGFjX2NvbmZpZ3VyZV9hcmdzMDt9Cit7IGFjX2NvbmZpZ3VyZV9hcmdzMT07IHVuc2V0IGFjX2NvbmZpZ3VyZV9hcmdzMTt9CisKKyMgV2hlbiBpbnRlcnJ1cHRlZCBvciBleGl0J2QsIGNsZWFudXAgdGVtcG9yYXJ5IGZpbGVzLCBhbmQgY29tcGxldGUKKyMgY29uZmlnLmxvZy4gIFdlIHJlbW92ZSBjb21tZW50cyBiZWNhdXNlIGFueXdheSB0aGUgcXVvdGVzIGluIHRoZXJlCisjIHdvdWxkIGNhdXNlIHByb2JsZW1zIG9yIGxvb2sgdWdseS4KKyMgV0FSTklORzogVXNlICdcJycgdG8gcmVwcmVzZW50IGFuIGFwb3N0cm9waGUgd2l0aGluIHRoZSB0cmFwLgorIyBXQVJOSU5HOiBEbyBub3Qgc3RhcnQgdGhlIHRyYXAgY29kZSB3aXRoIGEgbmV3bGluZSwgZHVlIHRvIGEgRnJlZUJTRCA0LjAgYnVnLgordHJhcCAnZXhpdF9zdGF0dXM9JD8KKyAgIyBTYXZlIGludG8gY29uZmlnLmxvZyBzb21lIGluZm9ybWF0aW9uIHRoYXQgbWlnaHQgaGVscCBpbiBkZWJ1Z2dpbmcuCisgIHsKKyAgICBlY2hvCisKKyAgICBjYXQgPDxcX0FTQk9YCisjIyAtLS0tLS0tLS0tLS0tLS0tICMjCisjIyBDYWNoZSB2YXJpYWJsZXMuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tICMjCitfQVNCT1gKKyAgICBlY2hvCisgICAgIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKKygKKyAgZm9yIGFjX3ZhciBpbiBgKHNldCkgMj4mMSB8IHNlZCAtbiAnXCcncy9eXChbYS16QS1aX11bYS16QS1aMC05X10qXCk9LiovXDEvcCdcJydgOyBkbworICAgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgorICAgIGNhc2UgJGFjX3ZhbCBpbiAjKAorICAgICoke2FzX25sfSopCisgICAgICBjYXNlICRhY192YXIgaW4gIygKKyAgICAgICpfY3ZfKikgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBjYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBjYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZSIgPiYyO30gOzsKKyAgICAgIGVzYWMKKyAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAorICAgICAgXyB8IElGUyB8IGFzX25sKSA7OyAjKAorICAgICAgQkFTSF9BUkdWIHwgQkFTSF9TT1VSQ0UpIGV2YWwgJGFjX3Zhcj0gOzsgIygKKyAgICAgICopIHsgZXZhbCAkYWNfdmFyPTsgdW5zZXQgJGFjX3Zhcjt9IDs7CisgICAgICBlc2FjIDs7CisgICAgZXNhYworICBkb25lCisgIChzZXQpIDI+JjEgfAorICAgIGNhc2UgJGFzX25sYChhY19zcGFjZT0nXCcnICdcJyc7IHNldCkgMj4mMWAgaW4gIygKKyAgICAqJHthc19ubH1hY19zcGFjZT1cICopCisgICAgICBzZWQgLW4gXAorCSJzLydcJycvJ1wnJ1xcXFwnXCcnJ1wnJy9nOworCSAgcy9eXFwoW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qXFwpPVxcKC4qXFwpL1xcMT0nXCcnXFwyJ1wnJy9wIgorICAgICAgOzsgIygKKyAgICAqKQorICAgICAgc2VkIC1uICIvXltfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKj0vcCIKKyAgICAgIDs7CisgICAgZXNhYyB8CisgICAgc29ydAorKQorICAgIGVjaG8KKworICAgIGNhdCA8PFxfQVNCT1gKKyMjIC0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBPdXRwdXQgdmFyaWFibGVzLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMKK19BU0JPWAorICAgIGVjaG8KKyAgICBmb3IgYWNfdmFyIGluICRhY19zdWJzdF92YXJzCisgICAgZG8KKyAgICAgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgorICAgICAgY2FzZSAkYWNfdmFsIGluCisgICAgICAqXCdcJycqKSBhY192YWw9YCRhc19lY2hvICIkYWNfdmFsIiB8IHNlZCAicy8nXCcnLydcJydcXFxcXFxcXCdcJycnXCcnL2ciYDs7CisgICAgICBlc2FjCisgICAgICAkYXNfZWNobyAiJGFjX3Zhcj0nXCcnJGFjX3ZhbCdcJyciCisgICAgZG9uZSB8IHNvcnQKKyAgICBlY2hvCisKKyAgICBpZiB0ZXN0IC1uICIkYWNfc3Vic3RfZmlsZXMiOyB0aGVuCisgICAgICBjYXQgPDxcX0FTQk9YCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBGaWxlIHN1YnN0aXR1dGlvbnMuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjCitfQVNCT1gKKyAgICAgIGVjaG8KKyAgICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X2ZpbGVzCisgICAgICBkbworCWV2YWwgYWNfdmFsPVwkJGFjX3ZhcgorCWNhc2UgJGFjX3ZhbCBpbgorCSpcJ1wnJyopIGFjX3ZhbD1gJGFzX2VjaG8gIiRhY192YWwiIHwgc2VkICJzLydcJycvJ1wnJ1xcXFxcXFxcJ1wnJydcJycvZyJgOzsKKwllc2FjCisJJGFzX2VjaG8gIiRhY192YXI9J1wnJyRhY192YWwnXCcnIgorICAgICAgZG9uZSB8IHNvcnQKKyAgICAgIGVjaG8KKyAgICBmaQorCisgICAgaWYgdGVzdCAtcyBjb25mZGVmcy5oOyB0aGVuCisgICAgICBjYXQgPDxcX0FTQk9YCisjIyAtLS0tLS0tLS0tLSAjIworIyMgY29uZmRlZnMuaC4gIyMKKyMjIC0tLS0tLS0tLS0tICMjCitfQVNCT1gKKyAgICAgIGVjaG8KKyAgICAgIGNhdCBjb25mZGVmcy5oCisgICAgICBlY2hvCisgICAgZmkKKyAgICB0ZXN0ICIkYWNfc2lnbmFsIiAhPSAwICYmCisgICAgICAkYXNfZWNobyAiJGFzX21lOiBjYXVnaHQgc2lnbmFsICRhY19zaWduYWwiCisgICAgJGFzX2VjaG8gIiRhc19tZTogZXhpdCAkZXhpdF9zdGF0dXMiCisgIH0gPiY1CisgIHJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiAmJgorICAgIHJtIC1mIC1yIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29uZiQkKiAkYWNfY2xlYW5fZmlsZXMgJiYKKyAgICBleGl0ICRleGl0X3N0YXR1cworJyAwCitmb3IgYWNfc2lnbmFsIGluIDEgMiAxMyAxNTsgZG8KKyAgdHJhcCAnYWNfc2lnbmFsPSckYWNfc2lnbmFsJzsgYXNfZm5fZXhpdCAxJyAkYWNfc2lnbmFsCitkb25lCithY19zaWduYWw9MAorCisjIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgorcm0gLWYgLXIgY29uZnRlc3QqIGNvbmZkZWZzLmgKKworJGFzX2VjaG8gIi8qIGNvbmZkZWZzLmggKi8iID4gY29uZmRlZnMuaAorCisjIFByZWRlZmluZWQgcHJlcHJvY2Vzc29yIHZhcmlhYmxlcy4KKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX05BTUUgIiRQQUNLQUdFX05BTUUiCitfQUNFT0YKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX1RBUk5BTUUgIiRQQUNLQUdFX1RBUk5BTUUiCitfQUNFT0YKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIiRQQUNLQUdFX1ZFUlNJT04iCitfQUNFT0YKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX1NUUklORyAiJFBBQ0tBR0VfU1RSSU5HIgorX0FDRU9GCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgIiRQQUNLQUdFX0JVR1JFUE9SVCIKK19BQ0VPRgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfVVJMICIkUEFDS0FHRV9VUkwiCitfQUNFT0YKKworCisjIExldCB0aGUgc2l0ZSBmaWxlIHNlbGVjdCBhbiBhbHRlcm5hdGUgY2FjaGUgZmlsZSBpZiBpdCB3YW50cyB0by4KKyMgUHJlZmVyIGFuIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCithY19zaXRlX2ZpbGUxPU5PTkUKK2FjX3NpdGVfZmlsZTI9Tk9ORQoraWYgdGVzdCAtbiAiJENPTkZJR19TSVRFIjsgdGhlbgorICBhY19zaXRlX2ZpbGUxPSRDT05GSUdfU0lURQorZWxpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KKyAgYWNfc2l0ZV9maWxlMT0kcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlCisgIGFjX3NpdGVfZmlsZTI9JHByZWZpeC9ldGMvY29uZmlnLnNpdGUKK2Vsc2UKKyAgYWNfc2l0ZV9maWxlMT0kYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUKKyAgYWNfc2l0ZV9maWxlMj0kYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlCitmaQorZm9yIGFjX3NpdGVfZmlsZSBpbiAiJGFjX3NpdGVfZmlsZTEiICIkYWNfc2l0ZV9maWxlMiIKK2RvCisgIHRlc3QgIngkYWNfc2l0ZV9maWxlIiA9IHhOT05FICYmIGNvbnRpbnVlCisgIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogbG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIiA+JjY7fQorICAgIHNlZCAncy9eL3wgLycgIiRhY19zaXRlX2ZpbGUiID4mNQorICAgIC4gIiRhY19zaXRlX2ZpbGUiCisgIGZpCitkb25lCisKK2lmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgorICAjIFNvbWUgdmVyc2lvbnMgb2YgYmFzaCB3aWxsIGZhaWwgdG8gc291cmNlIC9kZXYvbnVsbCAoc3BlY2lhbAorICAjIGZpbGVzIGFjdHVhbGx5KSwgc28gd2UgYXZvaWQgZG9pbmcgdGhhdC4KKyAgaWYgdGVzdCAtZiAiJGNhY2hlX2ZpbGUiOyB0aGVuCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9CisgICAgY2FzZSAkY2FjaGVfZmlsZSBpbgorICAgICAgW1xcL10qIHwgPzpbXFwvXSogKSAuICIkY2FjaGVfZmlsZSI7OworICAgICAgKikgICAgICAgICAgICAgICAgICAgICAgLiAiLi8kY2FjaGVfZmlsZSI7OworICAgIGVzYWMKKyAgZmkKK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKyAgPiRjYWNoZV9maWxlCitmaQorCisjIENoZWNrIHRoYXQgdGhlIHByZWNpb3VzIHZhcmlhYmxlcyBzYXZlZCBpbiB0aGUgY2FjaGUgaGF2ZSBrZXB0IHRoZSBzYW1lCisjIHZhbHVlLgorYWNfY2FjaGVfY29ycnVwdGVkPWZhbHNlCitmb3IgYWNfdmFyIGluICRhY19wcmVjaW91c192YXJzOyBkbworICBldmFsIGFjX29sZF9zZXQ9XCRhY19jdl9lbnZfJHthY192YXJ9X3NldAorICBldmFsIGFjX25ld19zZXQ9XCRhY19lbnZfJHthY192YXJ9X3NldAorICBldmFsIGFjX29sZF92YWw9XCRhY19jdl9lbnZfJHthY192YXJ9X3ZhbHVlCisgIGV2YWwgYWNfbmV3X3ZhbD1cJGFjX2Vudl8ke2FjX3Zhcn1fdmFsdWUKKyAgY2FzZSAkYWNfb2xkX3NldCwkYWNfbmV3X3NldCBpbgorICAgIHNldCwpCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBcYCRhY192YXInIHdhcyBzZXQgdG8gXGAkYWNfb2xkX3ZhbCcgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogXGAkYWNfdmFyJyB3YXMgc2V0IHRvIFxgJGFjX29sZF92YWwnIGluIHRoZSBwcmV2aW91cyBydW4iID4mMjt9CisgICAgICBhY19jYWNoZV9jb3JydXB0ZWQ9OiA7OworICAgICxzZXQpCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBcYCRhY192YXInIHdhcyBub3Qgc2V0IGluIHRoZSBwcmV2aW91cyBydW4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIG5vdCBzZXQgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiYyO30KKyAgICAgIGFjX2NhY2hlX2NvcnJ1cHRlZD06IDs7CisgICAgLCk7OworICAgICopCisgICAgICBpZiB0ZXN0ICJ4JGFjX29sZF92YWwiICE9ICJ4JGFjX25ld192YWwiOyB0aGVuCisJIyBkaWZmZXJlbmNlcyBpbiB3aGl0ZXNwYWNlIGRvIG5vdCBsZWFkIHRvIGZhaWx1cmUuCisJYWNfb2xkX3ZhbF93PWBlY2hvIHggJGFjX29sZF92YWxgCisJYWNfbmV3X3ZhbF93PWBlY2hvIHggJGFjX25ld192YWxgCisJaWYgdGVzdCAiJGFjX29sZF92YWxfdyIgIT0gIiRhY19uZXdfdmFsX3ciOyB0aGVuCisJICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBcYCRhY192YXInIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjI7fQorCSAgYWNfY2FjaGVfY29ycnVwdGVkPToKKwllbHNlCisJICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHdhcm5pbmc6IGlnbm9yaW5nIHdoaXRlc3BhY2UgY2hhbmdlcyBpbiBcYCRhY192YXInIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IHdhcm5pbmc6IGlnbm9yaW5nIHdoaXRlc3BhY2UgY2hhbmdlcyBpbiBcYCRhY192YXInIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjI7fQorCSAgZXZhbCAkYWNfdmFyPVwkYWNfb2xkX3ZhbAorCWZpCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAgIGZvcm1lciB2YWx1ZTogIFxgJGFjX29sZF92YWwnIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6ICAgZm9ybWVyIHZhbHVlOiAgXGAkYWNfb2xkX3ZhbCciID4mMjt9CisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAgIGN1cnJlbnQgdmFsdWU6IFxgJGFjX25ld192YWwnIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6ICAgY3VycmVudCB2YWx1ZTogXGAkYWNfbmV3X3ZhbCciID4mMjt9CisgICAgICBmaTs7CisgIGVzYWMKKyAgIyBQYXNzIHByZWNpb3VzIHZhcmlhYmxlcyB0byBjb25maWcuc3RhdHVzLgorICBpZiB0ZXN0ICIkYWNfbmV3X3NldCIgPSBzZXQ7IHRoZW4KKyAgICBjYXNlICRhY19uZXdfdmFsIGluCisgICAgKlwnKikgYWNfYXJnPSRhY192YXI9YCRhc19lY2hvICIkYWNfbmV3X3ZhbCIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKKyAgICAqKSBhY19hcmc9JGFjX3Zhcj0kYWNfbmV3X3ZhbCA7OworICAgIGVzYWMKKyAgICBjYXNlICIgJGFjX2NvbmZpZ3VyZV9hcmdzICIgaW4KKyAgICAgICoiICckYWNfYXJnJyAiKikgOzsgIyBBdm9pZCBkdXBzLiAgVXNlIG9mIHF1b3RlcyBlbnN1cmVzIGFjY3VyYWN5LgorICAgICAgKikgYXNfZm5fYXBwZW5kIGFjX2NvbmZpZ3VyZV9hcmdzICIgJyRhY19hcmcnIiA7OworICAgIGVzYWMKKyAgZmkKK2RvbmUKK2lmICRhY19jYWNoZV9jb3JydXB0ZWQ7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBjaGFuZ2VzIGluIHRoZSBlbnZpcm9ubWVudCBjYW4gY29tcHJvbWlzZSB0aGUgYnVpbGQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNoYW5nZXMgaW4gdGhlIGVudmlyb25tZW50IGNhbiBjb21wcm9taXNlIHRoZSBidWlsZCIgPiYyO30KKyAgYXNfZm5fZXJyb3IgInJ1biBcYG1ha2UgZGlzdGNsZWFuJyBhbmQvb3IgXGBybSAkY2FjaGVfZmlsZScgYW5kIHN0YXJ0IG92ZXIiICIkTElORU5PIiA1CitmaQorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE1haW4gYm9keSBvZiBzY3JpcHQuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKKworIyBMVCBWZXJzaW9uIG51bWJlcnMsIHJlbWVtYmVyIHRvIGNoYW5nZSB0aGVtIGp1c3QgKmJlZm9yZSogYSByZWxlYXNlLgorIyAgIChJbnRlcmZhY2VzIHJlbW92ZWQ6ICAgIENVUlJFTlQrKywgQUdFPTAsIFJFVklTSU9OPTApCisjICAgKEludGVyZmFjZXMgYWRkZWQ6ICAgICAgQ1VSUkVOVCsrLCBBR0UrKywgUkVWSVNJT049MCkKKyMgICAoTm8gaW50ZXJmYWNlcyBjaGFuZ2VkOiAgICAgICAgICAgICAgICAgICBSRVZJU0lPTisrKQorTElCR0NSWVBUX0xUX0NVUlJFTlQ9MTcKK0xJQkdDUllQVF9MVF9BR0U9NgorTElCR0NSWVBUX0xUX1JFVklTSU9OPTAKKworCisjIElmIHRoZSBBUEkgaXMgY2hhbmdlZCBpbiBhbiBpbmNvbXBhdGlibGUgd2F5OiBpbmNyZW1lbnQgdGhlIG5leHQgY291bnRlci4KK0xJQkdDUllQVF9DT05GSUdfQVBJX1ZFUlNJT049MQorCitORUVEX0dQR19FUlJPUl9WRVJTSU9OPTEuNAorCitpc19kZXZlbG9wbWVudF92ZXJzaW9uPW5vCitCVUlMRF9SRVZJU0lPTj0xNDM4CitQQUNLQUdFPSRQQUNLQUdFX05BTUUKK1ZFUlNJT049JFBBQ0tBR0VfVkVSU0lPTgorCisKK2FtX19hcGlfdmVyc2lvbj0nMS4xMCcKKworYWNfYXV4X2Rpcj0KK2ZvciBhY19kaXIgaW4gIiRzcmNkaXIiICIkc3JjZGlyLy4uIiAiJHNyY2Rpci8uLi8uLiI7IGRvCisgIGZvciBhY190IGluIGluc3RhbGwtc2ggaW5zdGFsbC5zaCBzaHRvb2w7IGRvCisgICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfdCI7IHRoZW4KKyAgICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvJGFjX3QgLWMiCisgICAgICBicmVhayAyCisgICAgZmkKKyAgZG9uZQorZG9uZQoraWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCisgIGFzX2ZuX2Vycm9yICJjYW5ub3QgZmluZCBpbnN0YWxsLXNoLCBpbnN0YWxsLnNoLCBvciBzaHRvb2wgaW4gXCIkc3JjZGlyXCIgXCIkc3JjZGlyLy4uXCIgXCIkc3JjZGlyLy4uLy4uXCIiICIkTElORU5PIiA1CitmaQorCisjIFRoZXNlIHRocmVlIHZhcmlhYmxlcyBhcmUgdW5kb2N1bWVudGVkIGFuZCB1bnN1cHBvcnRlZCwKKyMgYW5kIGFyZSBpbnRlbmRlZCB0byBiZSB3aXRoZHJhd24gaW4gYSBmdXR1cmUgQXV0b2NvbmYgcmVsZWFzZS4KKyMgVGhleSBjYW4gY2F1c2Ugc2VyaW91cyBwcm9ibGVtcyBpZiBhIGJ1aWxkZXIncyBzb3VyY2UgdHJlZSBpcyBpbiBhIGRpcmVjdG9yeQorIyB3aG9zZSBmdWxsIG5hbWUgY29udGFpbnMgdW51c3VhbCBjaGFyYWN0ZXJzLgorYWNfY29uZmlnX2d1ZXNzPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzIiAgIyBQbGVhc2UgZG9uJ3QgdXNlIHRoaXMgdmFyLgorYWNfY29uZmlnX3N1Yj0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCithY19jb25maWd1cmU9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWd1cmUiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCisKKworIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCisjIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKKyMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgorIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKKyMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAorIyBJUklYIC9zYmluL2luc3RhbGwKKyMgQUlYIC9iaW4vaW5zdGFsbAorIyBBbWlnYU9TIC9DL2luc3RhbGwsIHdoaWNoIGluc3RhbGxzIGJvb3RibG9ja3Mgb24gZmxvcHB5IGRpc2NzCisjIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZworIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCisjIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCisjIE9TLzIncyBzeXN0ZW0gaW5zdGFsbCwgd2hpY2ggaGFzIGEgY29tcGxldGVseSBkaWZmZXJlbnQgc2VtYW50aWMKKyMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgorIyBSZWplY3QgaW5zdGFsbCBwcm9ncmFtcyB0aGF0IGNhbm5vdCBpbnN0YWxsIG11bHRpcGxlIGZpbGVzLgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgYSBCU0QtY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGwuLi4gIiA+JjY7IH0KK2lmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgoraWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCitjYXNlICRhc19kaXIvIGluICMoKAorICAuLyB8IC4vLyB8IC9bY0NdLyogfCBcCisgIC9ldGMvKiB8IC91c3Ivc2Jpbi8qIHwgL3Vzci9ldGMvKiB8IC9zYmluLyogfCAvdXNyL2Fmc3dzL2Jpbi8qIHwgXAorICA/OltcXC9db3MyW1xcL11pbnN0YWxsW1xcL10qIHwgPzpbXFwvXU9TMltcXC9dSU5TVEFMTFtcXC9dKiB8IFwKKyAgL3Vzci91Y2IvKiApIDs7CisgICopCisgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KKyAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKKyAgICAjIGJ5IGRlZmF1bHQuCisgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbworICAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisJaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKKwkgICAgZ3JlcCBkc3Btc2cgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCisJICAgIDoKKwkgIGVsaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKKwkgICAgZ3JlcCBwd3BsdXMgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgICAjIHByb2dyYW0tc3BlY2lmaWMgaW5zdGFsbCBzY3JpcHQgdXNlZCBieSBIUCBwd3BsdXMtLWRvbid0IHVzZS4KKwkgICAgOgorCSAgZWxzZQorCSAgICBybSAtcmYgY29uZnRlc3Qub25lIGNvbmZ0ZXN0LnR3byBjb25mdGVzdC5kaXIKKwkgICAgZWNobyBvbmUgPiBjb25mdGVzdC5vbmUKKwkgICAgZWNobyB0d28gPiBjb25mdGVzdC50d28KKwkgICAgbWtkaXIgY29uZnRlc3QuZGlyCisJICAgIGlmICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiAtYyBjb25mdGVzdC5vbmUgY29uZnRlc3QudHdvICJgcHdkYC9jb25mdGVzdC5kaXIiICYmCisJICAgICAgdGVzdCAtcyBjb25mdGVzdC5vbmUgJiYgdGVzdCAtcyBjb25mdGVzdC50d28gJiYKKwkgICAgICB0ZXN0IC1zIGNvbmZ0ZXN0LmRpci9jb25mdGVzdC5vbmUgJiYKKwkgICAgICB0ZXN0IC1zIGNvbmZ0ZXN0LmRpci9jb25mdGVzdC50d28KKwkgICAgdGhlbgorCSAgICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCAtYyIKKwkgICAgICBicmVhayAzCisJICAgIGZpCisJICBmaQorCWZpCisgICAgICBkb25lCisgICAgZG9uZQorICAgIDs7Citlc2FjCisKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitybSAtcmYgY29uZnRlc3Qub25lIGNvbmZ0ZXN0LnR3byBjb25mdGVzdC5kaXIKKworZmkKKyAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgICBJTlNUQUxMPSRhY19jdl9wYXRoX2luc3RhbGwKKyAgZWxzZQorICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIERvbid0IGNhY2hlIGEKKyAgICAjIHZhbHVlIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCisgICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKKyAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSB2YWx1ZSBpcyBhIHJlbGF0aXZlIG5hbWUuCisgICAgSU5TVEFMTD0kYWNfaW5zdGFsbF9zaAorICBmaQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkSU5TVEFMTCIgPiY1CiskYXNfZWNobyAiJElOU1RBTEwiID4mNjsgfQorCisjIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCisjIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgordGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JworCit0ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTEx9JworCit0ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUuLi4gIiA+JjY7IH0KKyMgSnVzdCBpbiBjYXNlCitzbGVlcCAxCitlY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0LmZpbGUKKyMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKKyMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQorIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcworIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKKyMgZGlyZWN0b3J5KS4KK2lmICgKKyAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZSAyPiAvZGV2L251bGxgCisgICBpZiB0ZXN0ICIkKiIgPSAiWCI7IHRoZW4KKyAgICAgICMgLUwgZGlkbid0IHdvcmsuCisgICAgICBzZXQgWCBgbHMgLXQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZWAKKyAgIGZpCisgICBybSAtZiBjb25mdGVzdC5maWxlCisgICBpZiB0ZXN0ICIkKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZSIgXAorICAgICAgJiYgdGVzdCAiJCoiICE9ICJYIGNvbmZ0ZXN0LmZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCisKKyAgICAgICMgSWYgbmVpdGhlciBtYXRjaGVkLCB0aGVuIHdlIGhhdmUgYSBicm9rZW4gbHMuICBUaGlzIGNhbiBoYXBwZW4KKyAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKKyAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKKyAgICAgICMgaGFwcGVuZWQuICBTdWNoIGEgc3lzdGVtIGNvdWxkIG5vdCBiZSBjb25zaWRlcmVkICJzYW5lIi4KKyAgICAgIGFzX2ZuX2Vycm9yICJscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCithbGlhcyBpbiB5b3VyIGVudmlyb25tZW50IiAiJExJTkVOTyIgNQorICAgZmkKKworICAgdGVzdCAiJDIiID0gY29uZnRlc3QuZmlsZQorICAgKQordGhlbgorICAgIyBPay4KKyAgIDoKK2Vsc2UKKyAgIGFzX2ZuX2Vycm9yICJuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKK0NoZWNrIHlvdXIgc3lzdGVtIGNsb2NrIiAiJExJTkVOTyIgNQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9Cit0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKKyAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyZeJiRwcm9ncmFtX3ByZWZpeCY7JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCisjIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KK3Rlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzJlwkJiRwcm9ncmFtX3N1ZmZpeCY7JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCisjIERvdWJsZSBhbnkgXCBvciAkLgorIyBCeSBkZWZhdWx0IHdhcyBgcyx4LHgnLCByZW1vdmUgaXQgaWYgdXNlbGVzcy4KK2FjX3NjcmlwdD0ncy9bXFwkXS8mJi9nO3MvO3MseCx4LCQvLycKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWU9YCRhc19lY2hvICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgfCBzZWQgIiRhY19zY3JpcHQiYAorCisjIGV4cGFuZCAkYWNfYXV4X2RpciB0byBhbiBhYnNvbHV0ZSBwYXRoCithbV9hdXhfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCisKK3Rlc3QgeCIke01JU1NJTkcrc2V0fSIgPSB4c2V0IHx8IE1JU1NJTkc9Ilwke1NIRUxMfSAkYW1fYXV4X2Rpci9taXNzaW5nIgorIyBVc2UgZXZhbCB0byBleHBhbmQgJFNIRUxMCitpZiBldmFsICIkTUlTU0lORyAtLXJ1biB0cnVlIjsgdGhlbgorICBhbV9taXNzaW5nX3J1bj0iJE1JU1NJTkcgLS1ydW4gIgorZWxzZQorICBhbV9taXNzaW5nX3J1bj0KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBcYG1pc3NpbmcnIHNjcmlwdCBpcyB0b28gb2xkIG9yIG1pc3NpbmciID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogXGBtaXNzaW5nJyBzY3JpcHQgaXMgdG9vIG9sZCBvciBtaXNzaW5nIiA+JjI7fQorZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgYSB0aHJlYWQtc2FmZSBta2RpciAtcCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgYSB0aHJlYWQtc2FmZSBta2RpciAtcC4uLiAiID4mNjsgfQoraWYgdGVzdCAteiAiJE1LRElSX1AiOyB0aGVuCisgIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9ta2RpcitzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1Ivb3B0L3Nmdy9iaW4KK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfcHJvZyBpbiBta2RpciBnbWtkaXI7IGRvCisJIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworCSAgIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCI7IH0gfHwgY29udGludWUKKwkgICBjYXNlIGAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgLS12ZXJzaW9uIDI+JjFgIGluICMoCisJICAgICAnbWtkaXIgKEdOVSBjb3JldXRpbHMpICcqIHwgXAorCSAgICAgJ21rZGlyIChjb3JldXRpbHMpICcqIHwgXAorCSAgICAgJ21rZGlyIChmaWxldXRpbHMpICc0LjEqKQorCSAgICAgICBhY19jdl9wYXRoX21rZGlyPSRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQKKwkgICAgICAgYnJlYWsgMzs7CisJICAgZXNhYworCSBkb25lCisgICAgICAgZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCisKKyAgaWYgdGVzdCAiJHthY19jdl9wYXRoX21rZGlyK3NldH0iID0gc2V0OyB0aGVuCisgICAgTUtESVJfUD0iJGFjX2N2X3BhdGhfbWtkaXIgLXAiCisgIGVsc2UKKyAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBEb24ndCBjYWNoZSBhCisgICAgIyB2YWx1ZSBmb3IgTUtESVJfUCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAorICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCisgICAgIyByZW1vdmVkLCBvciBpZiB0aGUgdmFsdWUgaXMgYSByZWxhdGl2ZSBuYW1lLgorICAgIHRlc3QgLWQgLi8tLXZlcnNpb24gJiYgcm1kaXIgLi8tLXZlcnNpb24KKyAgICBNS0RJUl9QPSIkYWNfaW5zdGFsbF9zaCAtZCIKKyAgZmkKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE1LRElSX1AiID4mNQorJGFzX2VjaG8gIiRNS0RJUl9QIiA+JjY7IH0KKworbWtkaXJfcD0iJE1LRElSX1AiCitjYXNlICRta2Rpcl9wIGluCisgIFtcXC8kXSogfCA/OltcXC9dKikgOzsKKyAgKi8qKSBta2Rpcl9wPSJcJCh0b3BfYnVpbGRkaXIpLyRta2Rpcl9wIiA7OworZXNhYworCitmb3IgYWNfcHJvZyBpbiBnYXdrIG1hd2sgbmF3ayBhd2sKK2RvCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19BV0src2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQVdLIjsgdGhlbgorICBhY19jdl9wcm9nX0FXSz0iJEFXSyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX0FXSz0iJGFjX3Byb2ciCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorQVdLPSRhY19jdl9wcm9nX0FXSworaWYgdGVzdCAtbiAiJEFXSyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRBV0siID4mNQorJGFzX2VjaG8gIiRBV0siID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICB0ZXN0IC1uICIkQVdLIiAmJiBicmVhaworZG9uZQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCQoTUFLRSkiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJChNQUtFKS4uLiAiID4mNjsgfQorc2V0IHggJHtNQUtFLW1ha2V9CithY19tYWtlPWAkYXNfZWNobyAiJDIiIHwgc2VkICdzLysvcC9nOyBzL1teYS16QS1aMC05X10vXy9nJ2AKK2lmIHsgYXNfdmFyPWFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldDsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QubWFrZSA8PFxfQUNFT0YKK1NIRUxMID0gL2Jpbi9zaAorYWxsOgorCUBlY2hvICdAQEAlJSU9JChNQUtFKT1AQEAlJSUnCitfQUNFT0YKKyMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgorY2FzZSBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0Lm1ha2UgMj4vZGV2L251bGxgIGluCisgICpAQEAlJSU9Pyo9QEBAJSUlKikKKyAgICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXM7OworICAqKQorICAgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vOzsKK2VzYWMKK3JtIC1mIGNvbmZ0ZXN0Lm1ha2UKK2ZpCitpZiBldmFsIHRlc3QgXCRhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQgPSB5ZXM7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKyAgU0VUX01BS0U9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCitmaQorCitybSAtcmYgLnRzdCAyPi9kZXYvbnVsbAorbWtkaXIgLnRzdCAyPi9kZXYvbnVsbAoraWYgdGVzdCAtZCAudHN0OyB0aGVuCisgIGFtX19sZWFkaW5nX2RvdD0uCitlbHNlCisgIGFtX19sZWFkaW5nX2RvdD1fCitmaQorcm1kaXIgLnRzdCAyPi9kZXYvbnVsbAorCitpZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiOyB0aGVuCisgICMgVXNlIC1JJChzcmNkaXIpIG9ubHkgd2hlbiAkKHNyY2RpcikgIT0gLiwgc28gdGhhdCBtYWtlJ3Mgb3V0cHV0CisgICMgaXMgbm90IHBvbGx1dGVkIHdpdGggcmVwZWF0ZWQgIi1JLiIKKyAgYW1fX2lzcmM9JyAtSSQoc3JjZGlyKScKKyAgIyB0ZXN0IHRvIHNlZSBpZiBzcmNkaXIgYWxyZWFkeSBjb25maWd1cmVkCisgIGlmIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCisgICAgYXNfZm5fZXJyb3IgInNvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gXCJtYWtlIGRpc3RjbGVhblwiIHRoZXJlIGZpcnN0IiAiJExJTkVOTyIgNQorICBmaQorZmkKKworIyB0ZXN0IHdoZXRoZXIgd2UgaGF2ZSBjeWdwYXRoCitpZiB0ZXN0IC16ICIkQ1lHUEFUSF9XIjsgdGhlbgorICBpZiAoY3lncGF0aCAtLXZlcnNpb24pID4vZGV2L251bGwgMj4vZGV2L251bGw7IHRoZW4KKyAgICBDWUdQQVRIX1c9J2N5Z3BhdGggLXcnCisgIGVsc2UKKyAgICBDWUdQQVRIX1c9ZWNobworICBmaQorZmkKKworCisjIERlZmluZSB0aGUgaWRlbnRpdHkgb2YgdGhlIHBhY2thZ2UuCisgUEFDS0FHRT0kUEFDS0FHRQorIFZFUlNJT049JFZFUlNJT04KKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0UgIiRQQUNLQUdFIgorX0FDRU9GCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBWRVJTSU9OICIkVkVSU0lPTiIKK19BQ0VPRgorCisjIFNvbWUgdG9vbHMgQXV0b21ha2UgbmVlZHMuCisKK0FDTE9DQUw9JHtBQ0xPQ0FMLSIke2FtX21pc3NpbmdfcnVufWFjbG9jYWwtJHthbV9fYXBpX3ZlcnNpb259In0KKworCitBVVRPQ09ORj0ke0FVVE9DT05GLSIke2FtX21pc3NpbmdfcnVufWF1dG9jb25mIn0KKworCitBVVRPTUFLRT0ke0FVVE9NQUtFLSIke2FtX21pc3NpbmdfcnVufWF1dG9tYWtlLSR7YW1fX2FwaV92ZXJzaW9ufSJ9CisKKworQVVUT0hFQURFUj0ke0FVVE9IRUFERVItIiR7YW1fbWlzc2luZ19ydW59YXV0b2hlYWRlciJ9CisKKworTUFLRUlORk89JHtNQUtFSU5GTy0iJHthbV9taXNzaW5nX3J1bn1tYWtlaW5mbyJ9CisKK2luc3RhbGxfc2g9JHtpbnN0YWxsX3NoLSJcJChTSEVMTCkgJGFtX2F1eF9kaXIvaW5zdGFsbC1zaCJ9CisKKyMgSW5zdGFsbGVkIGJpbmFyaWVzIGFyZSB1c3VhbGx5IHN0cmlwcGVkIHVzaW5nIGBzdHJpcCcgd2hlbiB0aGUgdXNlcgorIyBydW4gYG1ha2UgaW5zdGFsbC1zdHJpcCcuICBIb3dldmVyIGBzdHJpcCcgbWlnaHQgbm90IGJlIHRoZSByaWdodAorIyB0b29sIHRvIHVzZSBpbiBjcm9zcy1jb21waWxhdGlvbiBlbnZpcm9ubWVudHMsIHRoZXJlZm9yZSBBdXRvbWFrZQorIyB3aWxsIGhvbm9yIHRoZSBgU1RSSVAnIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIG92ZXJydWxlIHRoaXMgcHJvZ3JhbS4KK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciICE9IG5vOyB0aGVuCisgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXN0cmlwIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXN0cmlwOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19TVFJJUCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRTVFJJUCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19TVFJJUD0iJFNUUklQIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfU1RSSVA9IiR7YWNfdG9vbF9wcmVmaXh9c3RyaXAiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorU1RSSVA9JGFjX2N2X3Byb2dfU1RSSVAKK2lmIHRlc3QgLW4gIiRTVFJJUCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRTVFJJUCIgPiY1CiskYXNfZWNobyAiJFNUUklQIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19TVFJJUCI7IHRoZW4KKyAgYWNfY3RfU1RSSVA9JFNUUklQCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAic3RyaXAiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHN0cmlwOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9TVFJJUCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9TVFJJUCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9TVFJJUD0iJGFjX2N0X1NUUklQIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfU1RSSVA9InN0cmlwIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X1NUUklQPSRhY19jdl9wcm9nX2FjX2N0X1NUUklQCitpZiB0ZXN0IC1uICIkYWNfY3RfU1RSSVAiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfU1RSSVAiID4mNQorJGFzX2VjaG8gIiRhY19jdF9TVFJJUCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX2N0X1NUUklQIiA9IHg7IHRoZW4KKyAgICBTVFJJUD0iOiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBTVFJJUD0kYWNfY3RfU1RSSVAKKyAgZmkKK2Vsc2UKKyAgU1RSSVA9IiRhY19jdl9wcm9nX1NUUklQIgorZmkKKworZmkKK0lOU1RBTExfU1RSSVBfUFJPR1JBTT0iXCQoaW5zdGFsbF9zaCkgLWMgLXMiCisKKyMgV2UgbmVlZCBhd2sgZm9yIHRoZSAiY2hlY2siIHRhcmdldC4gIFRoZSBzeXN0ZW0gImF3ayIgaXMgYmFkIG9uCisjIHNvbWUgcGxhdGZvcm1zLgorIyBBbHdheXMgZGVmaW5lIEFNVEFSIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorCitBTVRBUj0ke0FNVEFSLSIke2FtX21pc3NpbmdfcnVufXRhciJ9CisKK2FtX190YXI9JyR7QU1UQVJ9IGNob2YgLSAiJCR0YXJkaXIiJzsgYW1fX3VudGFyPScke0FNVEFSfSB4ZiAtJworCisKKworCisKK2FjX2NvbmZpZ19oZWFkZXJzPSIkYWNfY29uZmlnX2hlYWRlcnMgY29uZmlnLmgiCisKKyMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KKyRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgc3VuNCA+L2Rldi9udWxsIDI+JjEgfHwKKyAgYXNfZm5fZXJyb3IgImNhbm5vdCBydW4gJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICIkTElORU5PIiA1CisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfYnVpbGQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19idWlsZF9hbGlhcz0kYnVpbGRfYWxpYXMKK3Rlc3QgIngkYWNfYnVpbGRfYWxpYXMiID0geCAmJgorICBhY19idWlsZF9hbGlhcz1gJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MiYAordGVzdCAieCRhY19idWlsZF9hbGlhcyIgPSB4ICYmCisgIGFzX2ZuX2Vycm9yICJjYW5ub3QgZ3Vlc3MgYnVpbGQgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiICIkTElORU5PIiA1CithY19jdl9idWlsZD1gJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAkYWNfYnVpbGRfYWxpYXNgIHx8CisgIGFzX2ZuX2Vycm9yICIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiAkYWNfYnVpbGRfYWxpYXMgZmFpbGVkIiAiJExJTkVOTyIgNQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9idWlsZCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2J1aWxkIiA+JjY7IH0KK2Nhc2UgJGFjX2N2X2J1aWxkIGluCisqLSotKikgOzsKKyopIGFzX2ZuX2Vycm9yICJpbnZhbGlkIHZhbHVlIG9mIGNhbm9uaWNhbCBidWlsZCIgIiRMSU5FTk8iIDU7OworZXNhYworYnVpbGQ9JGFjX2N2X2J1aWxkCithY19zYXZlX0lGUz0kSUZTOyBJRlM9Jy0nCitzZXQgeCAkYWNfY3ZfYnVpbGQKK3NoaWZ0CitidWlsZF9jcHU9JDEKK2J1aWxkX3ZlbmRvcj0kMgorc2hpZnQ7IHNoaWZ0CisjIFJlbWVtYmVyLCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIElGUyBpcyB1c2VkIHRvIGNyZWF0ZSAkKiwKKyMgZXhjZXB0IHdpdGggb2xkIHNoZWxsczoKK2J1aWxkX29zPSQqCitJRlM9JGFjX3NhdmVfSUZTCitjYXNlICRidWlsZF9vcyBpbiAqXCAqKSBidWlsZF9vcz1gZWNobyAiJGJ1aWxkX29zIiB8IHNlZCAncy8gLy0vZydgOzsgZXNhYworCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2hvc3Qrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0ICJ4JGhvc3RfYWxpYXMiID0geDsgdGhlbgorICBhY19jdl9ob3N0PSRhY19jdl9idWlsZAorZWxzZQorICBhY19jdl9ob3N0PWAkU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICRob3N0X2FsaWFzYCB8fAorICAgIGFzX2ZuX2Vycm9yICIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiAkaG9zdF9hbGlhcyBmYWlsZWQiICIkTElORU5PIiA1CitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9ob3N0IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfaG9zdCIgPiY2OyB9CitjYXNlICRhY19jdl9ob3N0IGluCisqLSotKikgOzsKKyopIGFzX2ZuX2Vycm9yICJpbnZhbGlkIHZhbHVlIG9mIGNhbm9uaWNhbCBob3N0IiAiJExJTkVOTyIgNTs7Citlc2FjCitob3N0PSRhY19jdl9ob3N0CithY19zYXZlX0lGUz0kSUZTOyBJRlM9Jy0nCitzZXQgeCAkYWNfY3ZfaG9zdAorc2hpZnQKK2hvc3RfY3B1PSQxCitob3N0X3ZlbmRvcj0kMgorc2hpZnQ7IHNoaWZ0CisjIFJlbWVtYmVyLCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIElGUyBpcyB1c2VkIHRvIGNyZWF0ZSAkKiwKKyMgZXhjZXB0IHdpdGggb2xkIHNoZWxsczoKK2hvc3Rfb3M9JCoKK0lGUz0kYWNfc2F2ZV9JRlMKK2Nhc2UgJGhvc3Rfb3MgaW4gKlwgKikgaG9zdF9vcz1gZWNobyAiJGhvc3Rfb3MiIHwgc2VkICdzLyAvLS9nJ2A7OyBlc2FjCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcy4uLiAiID4mNjsgfQorICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbWFpbnRhaW5lcl9tb2RlK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfbWFpbnRhaW5lcl9tb2RlOyBVU0VfTUFJTlRBSU5FUl9NT0RFPSRlbmFibGV2YWwKK2Vsc2UKKyAgVVNFX01BSU5UQUlORVJfTU9ERT1ubworZmkKKworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFVTRV9NQUlOVEFJTkVSX01PREUiID4mNQorJGFzX2VjaG8gIiRVU0VfTUFJTlRBSU5FUl9NT0RFIiA+JjY7IH0KKyAgIGlmIHRlc3QgJFVTRV9NQUlOVEFJTkVSX01PREUgPSB5ZXM7IHRoZW4KKyAgTUFJTlRBSU5FUl9NT0RFX1RSVUU9CisgIE1BSU5UQUlORVJfTU9ERV9GQUxTRT0nIycKK2Vsc2UKKyAgTUFJTlRBSU5FUl9NT0RFX1RSVUU9JyMnCisgIE1BSU5UQUlORVJfTU9ERV9GQUxTRT0KK2ZpCisKKyAgTUFJTlQ9JE1BSU5UQUlORVJfTU9ERV9UUlVFCisKKworCisKKworCisKKworCisKKworCisKKworCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUEFDS0FHRSAiJFBBQ0tBR0UiCitfQUNFT0YKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFZFUlNJT04gIiRWRVJTSU9OIgorX0FDRU9GCisKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyAgQmFzaWMgY2hlY2tzLiAgIyMjICh3ZSBuZWVkIHNvbWUgcmVzdWx0cyBsYXRlciBvbiAoZS5nLiAkR0NDKQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCQoTUFLRSkiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJChNQUtFKS4uLiAiID4mNjsgfQorc2V0IHggJHtNQUtFLW1ha2V9CithY19tYWtlPWAkYXNfZWNobyAiJDIiIHwgc2VkICdzLysvcC9nOyBzL1teYS16QS1aMC05X10vXy9nJ2AKK2lmIHsgYXNfdmFyPWFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldDsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QubWFrZSA8PFxfQUNFT0YKK1NIRUxMID0gL2Jpbi9zaAorYWxsOgorCUBlY2hvICdAQEAlJSU9JChNQUtFKT1AQEAlJSUnCitfQUNFT0YKKyMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgorY2FzZSBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0Lm1ha2UgMj4vZGV2L251bGxgIGluCisgICpAQEAlJSU9Pyo9QEBAJSUlKikKKyAgICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXM7OworICAqKQorICAgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vOzsKK2VzYWMKK3JtIC1mIGNvbmZ0ZXN0Lm1ha2UKK2ZpCitpZiBldmFsIHRlc3QgXCRhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQgPSB5ZXM7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKyAgU0VUX01BS0U9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCitmaQorCittaXNzaW5nX2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAorCitBQ0xPQ0FMPSR7QUNMT0NBTC0iJHthbV9taXNzaW5nX3J1bn1hY2xvY2FsIn0KKworCitBVVRPQ09ORj0ke0FVVE9DT05GLSIke2FtX21pc3NpbmdfcnVufWF1dG9jb25mIn0KKworCitBVVRPTUFLRT0ke0FVVE9NQUtFLSIke2FtX21pc3NpbmdfcnVufWF1dG9tYWtlIn0KKworCitBVVRPSEVBREVSPSR7QVVUT0hFQURFUi0iJHthbV9taXNzaW5nX3J1bn1hdXRvaGVhZGVyIn0KKworIyBBTV9NSVNTSU5HX1BST0coTUFLRUlORk8sIG1ha2VpbmZvLCAkbWlzc2luZ19kaXIpCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1nY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9Z2NjOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfQ0M9IiR7YWNfdG9vbF9wcmVmaXh9Z2NjIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0MiID4mNQorJGFzX2VjaG8gIiRDQyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQ0MiOyB0aGVuCisgIGFjX2N0X0NDPSRDQworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9DQytzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX2N0X0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9ImdjYyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9DQz0kYWNfY3ZfcHJvZ19hY19jdF9DQworaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfQ0MiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKyAgaWYgdGVzdCAieCRhY19jdF9DQyIgPSB4OyB0aGVuCisgICAgQ0M9IiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBDQz0kYWNfY3RfQ0MKKyAgZmkKK2Vsc2UKKyAgQ0M9IiRhY19jdl9wcm9nX0NDIgorZmkKKworaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAgICAgICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9Y2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9Y2M7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19DQz0iJHthY190b29sX3ByZWZpeH1jYyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitDQz0kYWNfY3ZfcHJvZ19DQworaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENDIiA+JjUKKyRhc19lY2hvICIkQ0MiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICBmaQorZmkKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBhY19wcm9nX3JlamVjdGVkPW5vCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBpZiB0ZXN0ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KKyAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcworICAgICAgIGNvbnRpbnVlCisgICAgIGZpCisgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2lmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KKyAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgorICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKKyAgc2hpZnQKKyAgaWYgdGVzdCAkIyAhPSAwOyB0aGVuCisgICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCisgICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgorICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgorICAgIHNoaWZ0CisgICAgYWNfY3ZfcHJvZ19DQz0iJGFzX2Rpci8kYWNfd29yZCR7MSsnICd9JEAiCisgIGZpCitmaQorZmkKK2ZpCitDQz0kYWNfY3ZfcHJvZ19DQworaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENDIiA+JjUKKyRhc19lY2hvICIkQ0MiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICBmb3IgYWNfcHJvZyBpbiBjbC5leGUKKyAgZG8KKyAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY190b29sX3ByZWZpeCRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX0NDPSIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitDQz0kYWNfY3ZfcHJvZ19DQworaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENDIiA+JjUKKyRhc19lY2hvICIkQ0MiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICAgIHRlc3QgLW4gIiRDQyIgJiYgYnJlYWsKKyAgZG9uZQorZmkKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgYWNfY3RfQ0M9JENDCisgIGZvciBhY19wcm9nIGluIGNsLmV4ZQorZG8KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X0NDK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfY3RfQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX3Byb2ciCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfQ0MKK2lmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1CiskYXNfZWNobyAiJGFjX2N0X0NDIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgdGVzdCAtbiAiJGFjX2N0X0NDIiAmJiBicmVhaworZG9uZQorCisgIGlmIHRlc3QgIngkYWNfY3RfQ0MiID0geDsgdGhlbgorICAgIENDPSIiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgQ0M9JGFjX2N0X0NDCisgIGZpCitmaQorCitmaQorCisKK3Rlc3QgLXogIiRDQyIgJiYgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciAibm8gYWNjZXB0YWJsZSBDIGNvbXBpbGVyIGZvdW5kIGluIFwkUEFUSAorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iICIkTElORU5PIiA1OyB9CisKKyMgUHJvdmlkZSBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21waWxlci4KKyRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBDIGNvbXBpbGVyIHZlcnNpb24iID4mNQorc2V0IFggJGFjX2NvbXBpbGUKK2FjX2NvbXBpbGVyPSQyCitmb3IgYWNfb3B0aW9uIGluIC0tdmVyc2lvbiAtdiAtViAtcXZlcnNpb247IGRvCisgIHsgeyBhY190cnk9IiRhY19jb21waWxlciAkYWNfb3B0aW9uID4mNSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGVyICRhY19vcHRpb24gPiY1IikgMj5jb25mdGVzdC5lcnIKKyAgYWNfc3RhdHVzPSQ/CisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgc2VkICcxMGFcCisuLi4gcmVzdCBvZiBzdGRlcnIgb3V0cHV0IGRlbGV0ZWQgLi4uCisgICAgICAgICAxMHEnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIxCisgICAgY2F0IGNvbmZ0ZXN0LmVyMSA+JjUKKyAgICBybSAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCisgIGZpCisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9Citkb25lCisKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgoraW50CittYWluICgpCit7CitGSUxFICpmID0gZm9wZW4gKCJjb25mdGVzdC5vdXQiLCAidyIpOworIHJldHVybiBmZXJyb3IgKGYpIHx8IGZjbG9zZSAoZikgIT0gMDsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCithY19jbGVhbl9maWxlc19zYXZlPSRhY19jbGVhbl9maWxlcworYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9maWxlcyBhLm91dCBhLm91dC5kU1lNIGEuZXhlIGIub3V0IGNvbmZ0ZXN0Lm91dCIKKyMgVHJ5IHRvIGNyZWF0ZSBhbiBleGVjdXRhYmxlIHdpdGhvdXQgLW8gZmlyc3QsIGRpc3JlZ2FyZCBhLm91dC4KKyMgSXQgd2lsbCBoZWxwIHVzIGRpYWdub3NlIGJyb2tlbiBjb21waWxlcnMsIGFuZCBmaW5kaW5nIG91dCBhbiBpbnR1aXRpb24KKyMgb2YgZXhlZXh0LgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQyBjb21waWxlciBkZWZhdWx0IG91dHB1dCBmaWxlIG5hbWUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgZGVmYXVsdCBvdXRwdXQgZmlsZSBuYW1lLi4uICIgPiY2OyB9CithY19saW5rX2RlZmF1bHQ9YCRhc19lY2hvICIkYWNfbGluayIgfCBzZWQgJ3MvIC1vICpjb25mdGVzdFteIF0qLy8nYAorCisjIFRoZSBwb3NzaWJsZSBvdXRwdXQgZmlsZXM6CithY19maWxlcz0iYS5vdXQgY29uZnRlc3QuZXhlIGNvbmZ0ZXN0IGEuZXhlIGFfb3V0LmV4ZSBiLm91dCBjb25mdGVzdC4qIgorCithY19ybWZpbGVzPQorZm9yIGFjX2ZpbGUgaW4gJGFjX2ZpbGVzCitkbworICBjYXNlICRhY19maWxlIGluCisgICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5kU1lNIHwgKi5vIHwgKi5vYmogKSA7OworICAgICogKSBhY19ybWZpbGVzPSIkYWNfcm1maWxlcyAkYWNfZmlsZSI7OworICBlc2FjCitkb25lCitybSAtZiAkYWNfcm1maWxlcworCitpZiB7IHsgYWNfdHJ5PSIkYWNfbGlua19kZWZhdWx0IgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfbGlua19kZWZhdWx0IikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4gOgorICAjIEF1dG9jb25mLTIuMTMgY291bGQgc2V0IHRoZSBhY19jdl9leGVleHQgdmFyaWFibGUgdG8gYG5vJy4KKyMgU28gaWdub3JlIGEgdmFsdWUgb2YgYG5vJywgb3RoZXJ3aXNlIHRoaXMgd291bGQgbGVhZCB0byBgRVhFRVhUID0gbm8nCisjIGluIGEgTWFrZWZpbGUuICBXZSBzaG91bGQgbm90IG92ZXJyaWRlIGFjX2N2X2V4ZWV4dCBpZiBpdCB3YXMgY2FjaGVkLAorIyBzbyB0aGF0IHRoZSB1c2VyIGNhbiBzaG9ydC1jaXJjdWl0IHRoaXMgdGVzdCBmb3IgY29tcGlsZXJzIHVua25vd24gdG8KKyMgQXV0b2NvbmYuCitmb3IgYWNfZmlsZSBpbiAkYWNfZmlsZXMgJycKK2RvCisgIHRlc3QgLWYgIiRhY19maWxlIiB8fCBjb250aW51ZQorICBjYXNlICRhY19maWxlIGluCisgICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5kU1lNIHwgKi5vIHwgKi5vYmogKQorCTs7CisgICAgW2FiXS5vdXQgKQorCSMgV2UgZm91bmQgdGhlIGRlZmF1bHQgZXhlY3V0YWJsZSwgYnV0IGV4ZWV4dD0nJyBpcyBtb3N0CisJIyBjZXJ0YWlubHkgcmlnaHQuCisJYnJlYWs7OworICAgICouKiApCisJaWYgdGVzdCAiJHthY19jdl9leGVleHQrc2V0fSIgPSBzZXQgJiYgdGVzdCAiJGFjX2N2X2V4ZWV4dCIgIT0gbm87CisJdGhlbiA6OyBlbHNlCisJICAgYWNfY3ZfZXhlZXh0PWBleHByICIkYWNfZmlsZSIgOiAnW14uXSpcKFwuLipcKSdgCisJZmkKKwkjIFdlIHNldCBhY19jdl9leGVleHQgaGVyZSBiZWNhdXNlIHRoZSBsYXRlciB0ZXN0IGZvciBpdCBpcyBub3QKKwkjIHNhZmU6IGNyb3NzIGNvbXBpbGVycyBtYXkgbm90IGFkZCB0aGUgc3VmZml4IGlmIGdpdmVuIGFuIGAtbycKKwkjIGFyZ3VtZW50LCBzbyB3ZSBtYXkgbmVlZCB0byBrbm93IGl0IGF0IHRoYXQgcG9pbnQgYWxyZWFkeS4KKwkjIEV2ZW4gaWYgdGhpcyBzZWN0aW9uIGxvb2tzIGNydWZ0eTogaXQgaGFzIHRoZSBhZHZhbnRhZ2Ugb2YKKwkjIGFjdHVhbGx5IHdvcmtpbmcuCisJYnJlYWs7OworICAgICogKQorCWJyZWFrOzsKKyAgZXNhYworZG9uZQordGVzdCAiJGFjX2N2X2V4ZWV4dCIgPSBubyAmJiBhY19jdl9leGVleHQ9CisKK2Vsc2UKKyAgYWNfZmlsZT0nJworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfZmlsZSIgPiY1CiskYXNfZWNobyAiJGFjX2ZpbGUiID4mNjsgfQoraWYgdGVzdCAteiAiJGFjX2ZpbGUiOyB0aGVuIDoKKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK3sgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQoreyBhc19mbl9zZXRfc3RhdHVzIDc3Cithc19mbl9lcnJvciAiQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgIiRMSU5FTk8iIDU7IH07IH0KK2ZpCithY19leGVleHQ9JGFjX2N2X2V4ZWV4dAorCisjIENoZWNrIHRoYXQgdGhlIGNvbXBpbGVyIHByb2R1Y2VzIGV4ZWN1dGFibGVzIHdlIGNhbiBydW4uICBJZiBub3QsIGVpdGhlcgorIyB0aGUgY29tcGlsZXIgaXMgYnJva2VuLCBvciB3ZSBjcm9zcyBjb21waWxlLgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIHdvcmtzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgd29ya3MuLi4gIiA+JjY7IH0KKyMgSWYgbm90IGNyb3NzIGNvbXBpbGluZywgY2hlY2sgdGhhdCB3ZSBjYW4gcnVuIGEgc2ltcGxlIHByb2dyYW0uCitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiAhPSB5ZXM7IHRoZW4KKyAgaWYgeyBhY190cnk9Jy4vJGFjX2ZpbGUnCisgIHsgeyBjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgfTsgdGhlbgorICAgIGNyb3NzX2NvbXBpbGluZz1ubworICBlbHNlCisgICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSBtYXliZTsgdGhlbgorCWNyb3NzX2NvbXBpbGluZz15ZXMKKyAgICBlbHNlCisJeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciAiY2Fubm90IHJ1biBDIGNvbXBpbGVkIHByb2dyYW1zLgorSWYgeW91IG1lYW50IHRvIGNyb3NzIGNvbXBpbGUsIHVzZSBcYC0taG9zdCcuCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgIiRMSU5FTk8iIDU7IH0KKyAgICBmaQorICBmaQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisKK3JtIC1mIC1yIGEub3V0IGEub3V0LmRTWU0gYS5leGUgY29uZnRlc3QkYWNfY3ZfZXhlZXh0IGIub3V0IGNvbmZ0ZXN0Lm91dAorYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKKyMgQ2hlY2sgdGhhdCB0aGUgY29tcGlsZXIgcHJvZHVjZXMgZXhlY3V0YWJsZXMgd2UgY2FuIHJ1bi4gIElmIG5vdCwgZWl0aGVyCisjIHRoZSBjb21waWxlciBpcyBicm9rZW4sIG9yIHdlIGNyb3NzIGNvbXBpbGUuCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIGNyb3NzIGNvbXBpbGluZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBjcm9zcyBjb21waWxpbmcuLi4gIiA+JjY7IH0KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkY3Jvc3NfY29tcGlsaW5nIiA+JjUKKyRhc19lY2hvICIkY3Jvc3NfY29tcGlsaW5nIiA+JjY7IH0KKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3VmZml4IG9mIGV4ZWN1dGFibGVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXMuLi4gIiA+JjY7IH0KK2lmIHsgeyBhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuIDoKKyAgIyBJZiBib3RoIGBjb25mdGVzdC5leGUnIGFuZCBgY29uZnRlc3QnIGFyZSBgcHJlc2VudCcgKHdlbGwsIG9ic2VydmFibGUpCisjIGNhdGNoIGBjb25mdGVzdC5leGUnLiAgRm9yIGluc3RhbmNlIHdpdGggQ3lnd2luLCBgbHMgY29uZnRlc3QnIHdpbGwKKyMgd29yayBwcm9wZXJseSAoaS5lLiwgcmVmZXIgdG8gYGNvbmZ0ZXN0LmV4ZScpLCB3aGlsZSBpdCB3b24ndCB3aXRoCisjIGBybScuCitmb3IgYWNfZmlsZSBpbiBjb25mdGVzdC5leGUgY29uZnRlc3QgY29uZnRlc3QuKjsgZG8KKyAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlCisgIGNhc2UgJGFjX2ZpbGUgaW4KKyAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLmRTWU0gfCAqLm8gfCAqLm9iaiApIDs7CisgICAgKi4qICkgYWNfY3ZfZXhlZXh0PWBleHByICIkYWNfZmlsZSIgOiAnW14uXSpcKFwuLipcKSdgCisJICBicmVhazs7CisgICAgKiApIGJyZWFrOzsKKyAgZXNhYworZG9uZQorZWxzZQorICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yICJjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2YgZXhlY3V0YWJsZXM6IGNhbm5vdCBjb21waWxlIGFuZCBsaW5rCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgIiRMSU5FTk8iIDU7IH0KK2ZpCitybSAtZiBjb25mdGVzdCRhY19jdl9leGVleHQKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfZXhlZXh0IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfZXhlZXh0IiA+JjY7IH0KKworcm0gLWYgY29uZnRlc3QuJGFjX2V4dAorRVhFRVhUPSRhY19jdl9leGVleHQKK2FjX2V4ZWV4dD0kRVhFRVhUCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X29iamV4dCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QubyBjb25mdGVzdC5vYmoKK2lmIHsgeyBhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuIDoKKyAgZm9yIGFjX2ZpbGUgaW4gY29uZnRlc3QubyBjb25mdGVzdC5vYmogY29uZnRlc3QuKjsgZG8KKyAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlOworICBjYXNlICRhY19maWxlIGluCisgICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5kU1lNICkgOzsKKyAgICAqKSBhY19jdl9vYmpleHQ9YGV4cHIgIiRhY19maWxlIiA6ICcuKlwuXCguKlwpJ2AKKyAgICAgICBicmVhazs7CisgIGVzYWMKK2RvbmUKK2Vsc2UKKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK3sgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgImNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXM6IGNhbm5vdCBjb21waWxlCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgIiRMSU5FTk8iIDU7IH0KK2ZpCitybSAtZiBjb25mdGVzdC4kYWNfY3Zfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X29iamV4dCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X29iamV4dCIgPiY2OyB9CitPQkpFWFQ9JGFjX2N2X29iamV4dAorYWNfb2JqZXh0PSRPQkpFWFQKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIGNvbXBpbGVyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBjb21waWxlci4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9jX2NvbXBpbGVyX2dudStzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisjaWZuZGVmIF9fR05VQ19fCisgICAgICAgY2hva2UgbWUKKyNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY29tcGlsZXJfZ251PXllcworZWxzZQorICBhY19jb21waWxlcl9nbnU9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2FjX2N2X2NfY29tcGlsZXJfZ251PSRhY19jb21waWxlcl9nbnUKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfY19jb21waWxlcl9nbnUiID4mNQorJGFzX2VjaG8gIiRhY19jdl9jX2NvbXBpbGVyX2dudSIgPiY2OyB9CitpZiB0ZXN0ICRhY19jb21waWxlcl9nbnUgPSB5ZXM7IHRoZW4KKyAgR0NDPXllcworZWxzZQorICBHQ0M9CitmaQorYWNfdGVzdF9DRkxBR1M9JHtDRkxBR1Mrc2V0fQorYWNfc2F2ZV9DRkxBR1M9JENGTEFHUworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1nIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWcuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19jY19nK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9jX3dlcnJvcl9mbGFnPSRhY19jX3dlcnJvcl9mbGFnCisgICBhY19jX3dlcnJvcl9mbGFnPXllcworICAgYWNfY3ZfcHJvZ19jY19nPW5vCisgICBDRkxBR1M9Ii1nIgorICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3Byb2dfY2NfZz15ZXMKK2Vsc2UKKyAgQ0ZMQUdTPSIiCisgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKworZWxzZQorICBhY19jX3dlcnJvcl9mbGFnPSRhY19zYXZlX2Nfd2Vycm9yX2ZsYWcKKwkgQ0ZMQUdTPSItZyIKKwkgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3Byb2dfY2NfZz15ZXMKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGFjX2Nfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY193ZXJyb3JfZmxhZworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcHJvZ19jY19nIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfcHJvZ19jY19nIiA+JjY7IH0KK2lmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KKyAgQ0ZMQUdTPSRhY19zYXZlX0NGTEFHUworZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1nIC1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0iLWciCisgIGZpCitlbHNlCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9CisgIGZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgSVNPIEM4OSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgSVNPIEM4OS4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wcm9nX2NjX2M4OStzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2N2X3Byb2dfY2NfYzg5PW5vCithY19zYXZlX0NDPSRDQworY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKy8qIE1vc3Qgb2YgdGhlIGZvbGxvd2luZyB0ZXN0cyBhcmUgc3RvbGVuIGZyb20gUkNTIDUuNydzIHNyYy9jb25mLnNoLiAgKi8KK3N0cnVjdCBidWYgeyBpbnQgeDsgfTsKK0ZJTEUgKiAoKnJjc29wZW4pIChzdHJ1Y3QgYnVmICosIHN0cnVjdCBzdGF0ICosIGludCk7CitzdGF0aWMgY2hhciAqZSAocCwgaSkKKyAgICAgY2hhciAqKnA7CisgICAgIGludCBpOworeworICByZXR1cm4gcFtpXTsKK30KK3N0YXRpYyBjaGFyICpmIChjaGFyICogKCpnKSAoY2hhciAqKiwgaW50KSwgY2hhciAqKnAsIC4uLikKK3sKKyAgY2hhciAqczsKKyAgdmFfbGlzdCB2OworICB2YV9zdGFydCAodixwKTsKKyAgcyA9IGcgKHAsIHZhX2FyZyAodixpbnQpKTsKKyAgdmFfZW5kICh2KTsKKyAgcmV0dXJuIHM7Cit9CisKKy8qIE9TRiA0LjAgQ29tcGFxIGNjIGlzIHNvbWUgc29ydCBvZiBhbG1vc3QtQU5TSSBieSBkZWZhdWx0LiAgSXQgaGFzCisgICBmdW5jdGlvbiBwcm90b3R5cGVzIGFuZCBzdHVmZiwgYnV0IG5vdCAnXHhISCcgaGV4IGNoYXJhY3RlciBjb25zdGFudHMuCisgICBUaGVzZSBkb24ndCBwcm92b2tlIGFuIGVycm9yIHVuZm9ydHVuYXRlbHksIGluc3RlYWQgYXJlIHNpbGVudGx5IHRyZWF0ZWQKKyAgIGFzICd4Jy4gIFRoZSBmb2xsb3dpbmcgaW5kdWNlcyBhbiBlcnJvciwgdW50aWwgLXN0ZCBpcyBhZGRlZCB0byBnZXQKKyAgIHByb3BlciBBTlNJIG1vZGUuICBDdXJpb3VzbHkgJ1x4MDAnIT0neCcgYWx3YXlzIGNvbWVzIG91dCB0cnVlLCBmb3IgYW4KKyAgIGFycmF5IHNpemUgYXQgbGVhc3QuICBJdCdzIG5lY2Vzc2FyeSB0byB3cml0ZSAnXHgwMCc9PTAgdG8gZ2V0IHNvbWV0aGluZworICAgdGhhdCdzIHRydWUgb25seSB3aXRoIC1zdGQuICAqLworaW50IG9zZjRfY2NfYXJyYXkgWydceDAwJyA9PSAwID8gMSA6IC0xXTsKKworLyogSUJNIEMgNiBmb3IgQUlYIGlzIGFsbW9zdC1BTlNJIGJ5IGRlZmF1bHQsIGJ1dCBpdCByZXBsYWNlcyBtYWNybyBwYXJhbWV0ZXJzCisgICBpbnNpZGUgc3RyaW5ncyBhbmQgY2hhcmFjdGVyIGNvbnN0YW50cy4gICovCisjZGVmaW5lIEZPTyh4KSAneCcKK2ludCB4bGM2X2NjX2FycmF5W0ZPTyhhKSA9PSAneCcgPyAxIDogLTFdOworCitpbnQgdGVzdCAoaW50IGksIGRvdWJsZSB4KTsKK3N0cnVjdCBzMSB7aW50ICgqZikgKGludCBhKTt9Oworc3RydWN0IHMyIHtpbnQgKCpmKSAoZG91YmxlIGEpO307CitpbnQgcGFpcm5hbWVzIChpbnQsIGNoYXIgKiosIEZJTEUgKigqKShzdHJ1Y3QgYnVmICosIHN0cnVjdCBzdGF0ICosIGludCksIGludCwgaW50KTsKK2ludCBhcmdjOworY2hhciAqKmFyZ3Y7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBmIChlLCBhcmd2LCAwKSAhPSBhcmd2WzBdICB8fCAgZiAoZSwgYXJndiwgMSkgIT0gYXJndlsxXTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorZm9yIGFjX2FyZyBpbiAnJyAtcWxhbmdsdmw9ZXh0Yzg5IC1xbGFuZ2x2bD1hbnNpIC1zdGQgXAorCS1BZSAiLUFhIC1EX0hQVVhfU09VUkNFIiAiLVhjIC1EX19FWFRFTlNJT05TX18iCitkbworICBDQz0iJGFjX3NhdmVfQ0MgJGFjX2FyZyIKKyAgaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9wcm9nX2NjX2M4OT0kYWNfYXJnCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dAorICB0ZXN0ICJ4JGFjX2N2X3Byb2dfY2NfYzg5IiAhPSAieG5vIiAmJiBicmVhaworZG9uZQorcm0gLWYgY29uZnRlc3QuJGFjX2V4dAorQ0M9JGFjX3NhdmVfQ0MKKworZmkKKyMgQUNfQ0FDSEVfVkFMCitjYXNlICJ4JGFjX2N2X3Byb2dfY2NfYzg5IiBpbgorICB4KQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBub25lIG5lZWRlZCIgPiY1CiskYXNfZWNobyAibm9uZSBuZWVkZWQiID4mNjsgfSA7OworICB4bm8pCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHVuc3VwcG9ydGVkIiA+JjUKKyRhc19lY2hvICJ1bnN1cHBvcnRlZCIgPiY2OyB9IDs7CisgICopCisgICAgQ0M9IiRDQyAkYWNfY3ZfcHJvZ19jY19jODkiCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wcm9nX2NjX2M4OSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3Byb2dfY2NfYzg5IiA+JjY7IH0gOzsKK2VzYWMKK2lmIHRlc3QgIngkYWNfY3ZfcHJvZ19jY19jODkiICE9IHhubzsgdGhlbiA6CisKK2ZpCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKK0RFUERJUj0iJHthbV9fbGVhZGluZ19kb3R9ZGVwcyIKKworYWNfY29uZmlnX2NvbW1hbmRzPSIkYWNfY29uZmlnX2NvbW1hbmRzIGRlcGZpbGVzIgorCisKK2FtX21ha2U9JHtNQUtFLW1ha2V9CitjYXQgPiBjb25maW5jIDw8ICdFTkQnCithbV9fZG9pdDoKKwlAZWNobyBkb25lCisuUEhPTlk6IGFtX19kb2l0CitFTkQKKyMgSWYgd2UgZG9uJ3QgZmluZCBhbiBpbmNsdWRlIGRpcmVjdGl2ZSwganVzdCBjb21tZW50IG91dCB0aGUgY29kZS4KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN0eWxlIG9mIGluY2x1ZGUgdXNlZCBieSAkYW1fbWFrZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igc3R5bGUgb2YgaW5jbHVkZSB1c2VkIGJ5ICRhbV9tYWtlLi4uICIgPiY2OyB9CithbV9faW5jbHVkZT0iIyIKK2FtX19xdW90ZT0KK19hbV9yZXN1bHQ9bm9uZQorIyBGaXJzdCB0cnkgR05VIG1ha2Ugc3R5bGUgaW5jbHVkZS4KK2VjaG8gImluY2x1ZGUgY29uZmluYyIgPiBjb25mbWYKKyMgV2UgZ3JlcCBvdXQgYEVudGVyaW5nIGRpcmVjdG9yeScgYW5kIGBMZWF2aW5nIGRpcmVjdG9yeScKKyMgbWVzc2FnZXMgd2hpY2ggY2FuIG9jY3VyIGlmIGB3JyBlbmRzIHVwIGluIE1BS0VGTEFHUy4KKyMgSW4gcGFydGljdWxhciB3ZSBkb24ndCBsb29rIGF0IGBebWFrZTonIGJlY2F1c2UgR05VIG1ha2UgbWlnaHQKKyMgYmUgaW52b2tlZCB1bmRlciBzb21lIG90aGVyIG5hbWUgKHVzdWFsbHkgImdtYWtlIiksIGluIHdoaWNoCisjIGNhc2UgaXQgcHJpbnRzIGl0cyBuZXcgbmFtZSBpbnN0ZWFkIG9mIGBtYWtlJy4KK2lmIHRlc3QgImAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsIHwgZ3JlcCAtdiAnaW5nIGRpcmVjdG9yeSdgIiA9ICJkb25lIjsgdGhlbgorICAgYW1fX2luY2x1ZGU9aW5jbHVkZQorICAgYW1fX3F1b3RlPQorICAgX2FtX3Jlc3VsdD1HTlUKK2ZpCisjIE5vdyB0cnkgQlNEIG1ha2Ugc3R5bGUgaW5jbHVkZS4KK2lmIHRlc3QgIiRhbV9faW5jbHVkZSIgPSAiIyI7IHRoZW4KKyAgIGVjaG8gJy5pbmNsdWRlICJjb25maW5jIicgPiBjb25mbWYKKyAgIGlmIHRlc3QgImAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsYCIgPSAiZG9uZSI7IHRoZW4KKyAgICAgIGFtX19pbmNsdWRlPS5pbmNsdWRlCisgICAgICBhbV9fcXVvdGU9IlwiIgorICAgICAgX2FtX3Jlc3VsdD1CU0QKKyAgIGZpCitmaQorCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkX2FtX3Jlc3VsdCIgPiY1CiskYXNfZWNobyAiJF9hbV9yZXN1bHQiID4mNjsgfQorcm0gLWYgY29uZmluYyBjb25mbWYKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZytzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmc7CitmaQorCitpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm87IHRoZW4KKyAgYW1fZGVwY29tcD0iJGFjX2F1eF9kaXIvZGVwY29tcCIKKyAgQU1ERVBCQUNLU0xBU0g9J1wnCitmaQorIGlmIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubzsgdGhlbgorICBBTURFUF9UUlVFPQorICBBTURFUF9GQUxTRT0nIycKK2Vsc2UKKyAgQU1ERVBfVFJVRT0nIycKKyAgQU1ERVBfRkFMU0U9CitmaQorCisKKworZGVwY2M9IiRDQyIgICBhbV9jb21waWxlcl9saXN0PQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGRlcGVuZGVuY3kgc3R5bGUgb2YgJGRlcGNjIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGRlcGVuZGVuY3kgc3R5bGUgb2YgJGRlcGNjLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAteiAiJEFNREVQX1RSVUUiICYmIHRlc3QgLWYgIiRhbV9kZXBjb21wIjsgdGhlbgorICAjIFdlIG1ha2UgYSBzdWJkaXIgYW5kIGRvIHRoZSB0ZXN0cyB0aGVyZS4gIE90aGVyd2lzZSB3ZSBjYW4gZW5kIHVwCisgICMgbWFraW5nIGJvZ3VzIGZpbGVzIHRoYXQgd2UgZG9uJ3Qga25vdyBhYm91dCBhbmQgbmV2ZXIgcmVtb3ZlLiAgRm9yCisgICMgaW5zdGFuY2UgaXQgd2FzIHJlcG9ydGVkIHRoYXQgb24gSFAtVVggdGhlIGdjYyB0ZXN0IHdpbGwgZW5kIHVwCisgICMgbWFraW5nIGEgZHVtbXkgZmlsZSBuYW1lZCBgRCcgLS0gYmVjYXVzZSBgLU1EJyBtZWFucyBgcHV0IHRoZSBvdXRwdXQKKyAgIyBpbiBEJy4KKyAgbWtkaXIgY29uZnRlc3QuZGlyCisgICMgQ29weSBkZXBjb21wIHRvIHN1YmRpciBiZWNhdXNlIG90aGVyd2lzZSB3ZSB3b24ndCBmaW5kIGl0IGlmIHdlJ3JlCisgICMgdXNpbmcgYSByZWxhdGl2ZSBkaXJlY3RvcnkuCisgIGNwICIkYW1fZGVwY29tcCIgY29uZnRlc3QuZGlyCisgIGNkIGNvbmZ0ZXN0LmRpcgorICAjIFdlIHdpbGwgYnVpbGQgb2JqZWN0cyBhbmQgZGVwZW5kZW5jaWVzIGluIGEgc3ViZGlyZWN0b3J5IGJlY2F1c2UKKyAgIyBpdCBoZWxwcyB0byBkZXRlY3QgaW5hcHBsaWNhYmxlIGRlcGVuZGVuY3kgbW9kZXMuICBGb3IgaW5zdGFuY2UKKyAgIyBib3RoIFRydTY0J3MgY2MgYW5kIElDQyBzdXBwb3J0IC1NRCB0byBvdXRwdXQgZGVwZW5kZW5jaWVzIGFzIGEKKyAgIyBzaWRlIGVmZmVjdCBvZiBjb21waWxhdGlvbiwgYnV0IElDQyB3aWxsIHB1dCB0aGUgZGVwZW5kZW5jaWVzIGluCisgICMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdoaWxlIFRydTY0IHdpbGwgcHV0IHRoZW0gaW4gdGhlIG9iamVjdAorICAjIGRpcmVjdG9yeS4KKyAgbWtkaXIgc3ViCisKKyAgYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9bm9uZQorICBpZiB0ZXN0ICIkYW1fY29tcGlsZXJfbGlzdCIgPSAiIjsgdGhlbgorICAgICBhbV9jb21waWxlcl9saXN0PWBzZWQgLW4gJ3MvXiMqXChbYS16QS1aMC05XSpcKSkkL1wxL3AnIDwgLi9kZXBjb21wYAorICBmaQorICBmb3IgZGVwbW9kZSBpbiAkYW1fY29tcGlsZXJfbGlzdDsgZG8KKyAgICAjIFNldHVwIGEgc291cmNlIHdpdGggbWFueSBkZXBlbmRlbmNpZXMsIGJlY2F1c2Ugc29tZSBjb21waWxlcnMKKyAgICAjIGxpa2UgdG8gd3JhcCBsYXJnZSBkZXBlbmRlbmN5IGxpc3RzIG9uIGNvbHVtbiA4MCAod2l0aCBcKSwgYW5kCisgICAgIyB3ZSBzaG91bGQgbm90IGNob29zZSBhIGRlcGNvbXAgbW9kZSB3aGljaCBpcyBjb25mdXNlZCBieSB0aGlzLgorICAgICMKKyAgICAjIFdlIG5lZWQgdG8gcmVjcmVhdGUgdGhlc2UgZmlsZXMgZm9yIGVhY2ggdGVzdCwgYXMgdGhlIGNvbXBpbGVyIG1heQorICAgICMgb3ZlcndyaXRlIHNvbWUgb2YgdGhlbSB3aGVuIHRlc3Rpbmcgd2l0aCBvYnNjdXJlIGNvbW1hbmQgbGluZXMuCisgICAgIyBUaGlzIGhhcHBlbnMgYXQgbGVhc3Qgd2l0aCB0aGUgQUlYIEMgY29tcGlsZXIuCisgICAgOiA+IHN1Yi9jb25mdGVzdC5jCisgICAgZm9yIGkgaW4gMSAyIDMgNCA1IDY7IGRvCisgICAgICBlY2hvICcjaW5jbHVkZSAiY29uZnRzdCckaScuaCInID4+IHN1Yi9jb25mdGVzdC5jCisgICAgICAjIFVzaW5nIGA6ID4gc3ViL2NvbmZ0c3QkaS5oJyBjcmVhdGVzIG9ubHkgc3ViL2NvbmZ0c3QxLmggd2l0aAorICAgICAgIyBTb2xhcmlzIDgncyB7L3Vzcix9L2Jpbi9zaC4KKyAgICAgIHRvdWNoIHN1Yi9jb25mdHN0JGkuaAorICAgIGRvbmUKKyAgICBlY2hvICIke2FtX19pbmNsdWRlfSAke2FtX19xdW90ZX1zdWIvY29uZnRlc3QuUG8ke2FtX19xdW90ZX0iID4gY29uZm1mCisKKyAgICBjYXNlICRkZXBtb2RlIGluCisgICAgbm9zaWRlZWZmZWN0KQorICAgICAgIyBhZnRlciB0aGlzIHRhZywgbWVjaGFuaXNtcyBhcmUgbm90IGJ5IHNpZGUtZWZmZWN0LCBzbyB0aGV5J2xsCisgICAgICAjIG9ubHkgYmUgdXNlZCB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkCisgICAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiA9IHh5ZXM7IHRoZW4KKwljb250aW51ZQorICAgICAgZWxzZQorCWJyZWFrCisgICAgICBmaQorICAgICAgOzsKKyAgICBub25lKSBicmVhayA7OworICAgIGVzYWMKKyAgICAjIFdlIGNoZWNrIHdpdGggYC1jJyBhbmQgYC1vJyBmb3IgdGhlIHNha2Ugb2YgdGhlICJkYXNobXN0ZG91dCIKKyAgICAjIG1vZGUuICBJdCB0dXJucyBvdXQgdGhhdCB0aGUgU3VuUHJvIEMrKyBjb21waWxlciBkb2VzIG5vdCBwcm9wZXJseQorICAgICMgaGFuZGxlIGAtTSAtbycsIGFuZCB3ZSBuZWVkIHRvIGRldGVjdCB0aGlzLgorICAgIGlmIGRlcG1vZGU9JGRlcG1vZGUgXAorICAgICAgIHNvdXJjZT1zdWIvY29uZnRlc3QuYyBvYmplY3Q9c3ViL2NvbmZ0ZXN0LiR7T0JKRVhULW99IFwKKyAgICAgICBkZXBmaWxlPXN1Yi9jb25mdGVzdC5QbyB0bXBkZXBmaWxlPXN1Yi9jb25mdGVzdC5UUG8gXAorICAgICAgICRTSEVMTCAuL2RlcGNvbXAgJGRlcGNjIC1jIC1vIHN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfSBzdWIvY29uZnRlc3QuYyBcCisgICAgICAgICA+L2Rldi9udWxsIDI+Y29uZnRlc3QuZXJyICYmCisgICAgICAgZ3JlcCBzdWIvY29uZnRzdDEuaCBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgorICAgICAgIGdyZXAgc3ViL2NvbmZ0c3Q2Lmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKKyAgICAgICBncmVwIHN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfSBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgorICAgICAgICR7TUFLRS1tYWtlfSAtcyAtZiBjb25mbWYgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorICAgICAgIyBpY2MgZG9lc24ndCBjaG9rZSBvbiB1bmtub3duIG9wdGlvbnMsIGl0IHdpbGwganVzdCBpc3N1ZSB3YXJuaW5ncworICAgICAgIyBvciByZW1hcmtzIChldmVuIHdpdGggLVdlcnJvcikuICBTbyB3ZSBncmVwIHN0ZGVyciBmb3IgYW55IG1lc3NhZ2UKKyAgICAgICMgdGhhdCBzYXlzIGFuIG9wdGlvbiB3YXMgaWdub3JlZCBvciBub3Qgc3VwcG9ydGVkLgorICAgICAgIyBXaGVuIGdpdmVuIC1NUCwgaWNjIDcuMCBhbmQgNy4xIGNvbXBsYWluIHRodXNseToKKyAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSB3YXJuaW5nOiBpZ25vcmluZyBvcHRpb24gJy1NJzsgbm8gYXJndW1lbnQgcmVxdWlyZWQKKyAgICAgICMgVGhlIGRpYWdub3NpcyBjaGFuZ2VkIGluIGljYyA4LjA6CisgICAgICAjICAgaWNjOiBDb21tYW5kIGxpbmUgcmVtYXJrOiBvcHRpb24gJy1NUCcgbm90IHN1cHBvcnRlZAorICAgICAgaWYgKGdyZXAgJ2lnbm9yaW5nIG9wdGlvbicgY29uZnRlc3QuZXJyIHx8CisgICAgICAgICAgZ3JlcCAnbm90IHN1cHBvcnRlZCcgY29uZnRlc3QuZXJyKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOjsgZWxzZQorICAgICAgICBhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT0kZGVwbW9kZQorICAgICAgICBicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisKKyAgY2QgLi4KKyAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgorZWxzZQorICBhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIgPiY1CiskYXNfZWNobyAiJGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA+JjY7IH0KK0NDREVQTU9ERT1kZXBtb2RlPSRhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZQorCisgaWYKKyAgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vIFwKKyAgJiYgdGVzdCAiJGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA9IGdjYzM7IHRoZW4KKyAgYW1fX2Zhc3RkZXBDQ19UUlVFPQorICBhbV9fZmFzdGRlcENDX0ZBTFNFPScjJworZWxzZQorICBhbV9fZmFzdGRlcENDX1RSVUU9JyMnCisgIGFtX19mYXN0ZGVwQ0NfRkFMU0U9CitmaQorCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IuLi4gIiA+JjY7IH0KKyMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCitpZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgorICBDUFA9CitmaQoraWYgdGVzdCAteiAiJENQUCI7IHRoZW4KKyAgaWYgdGVzdCAiJHthY19jdl9wcm9nX0NQUCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgICAgICAjIERvdWJsZSBxdW90ZXMgYmVjYXVzZSBDUFAgbmVlZHMgdG8gYmUgZXhwYW5kZWQKKyAgICBmb3IgQ1BQIGluICIkQ0MgLUUiICIkQ0MgLUUgLXRyYWRpdGlvbmFsLWNwcCIgIi9saWIvY3BwIgorICAgIGRvCisgICAgICBhY19wcmVwcm9jX29rPWZhbHNlCitmb3IgYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbiAnJyB5ZXMKK2RvCisgICMgVXNlIGEgaGVhZGVyIGZpbGUgdGhhdCBjb21lcyB3aXRoIGdjYywgc28gY29uZmlndXJpbmcgZ2xpYmMKKyAgIyB3aXRoIGEgZnJlc2ggY3Jvc3MtY29tcGlsZXIgd29ya3MuCisgICMgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorICAjIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4KKyAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKKyAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRjaCB0aGlzIGNhc2UuCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpZmRlZiBfX1NURENfXworIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisJCSAgICAgU3ludGF4IGVycm9yCitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgorCitlbHNlCisgICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KK2NvbnRpbnVlCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKworICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uZXhpc3RlbnQgaGVhZGVycworICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisgICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCitjb250aW51ZQorZWxzZQorICAjIFBhc3NlcyBib3RoIHRlc3RzLgorYWNfcHJlcHJvY19vaz06CiticmVhaworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CisKK2RvbmUKKyMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKK2lmICRhY19wcmVwcm9jX29rOyB0aGVuIDoKKyAgYnJlYWsKK2ZpCisKKyAgICBkb25lCisgICAgYWNfY3ZfcHJvZ19DUFA9JENQUAorCitmaQorICBDUFA9JGFjX2N2X3Byb2dfQ1BQCitlbHNlCisgIGFjX2N2X3Byb2dfQ1BQPSRDUFAKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENQUCIgPiY1CiskYXNfZWNobyAiJENQUCIgPiY2OyB9CithY19wcmVwcm9jX29rPWZhbHNlCitmb3IgYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbiAnJyB5ZXMKK2RvCisgICMgVXNlIGEgaGVhZGVyIGZpbGUgdGhhdCBjb21lcyB3aXRoIGdjYywgc28gY29uZmlndXJpbmcgZ2xpYmMKKyAgIyB3aXRoIGEgZnJlc2ggY3Jvc3MtY29tcGlsZXIgd29ya3MuCisgICMgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorICAjIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4KKyAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKKyAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRjaCB0aGlzIGNhc2UuCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpZmRlZiBfX1NURENfXworIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisJCSAgICAgU3ludGF4IGVycm9yCitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgorCitlbHNlCisgICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KK2NvbnRpbnVlCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKworICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uZXhpc3RlbnQgaGVhZGVycworICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisgICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCitjb250aW51ZQorZWxzZQorICAjIFBhc3NlcyBib3RoIHRlc3RzLgorYWNfcHJlcHJvY19vaz06CiticmVhaworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CisKK2RvbmUKKyMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKK2lmICRhY19wcmVwcm9jX29rOyB0aGVuIDoKKworZWxzZQorICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yICJDIHByZXByb2Nlc3NvciBcIiRDUFBcIiBmYWlscyBzYW5pdHkgY2hlY2sKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiAiJExJTkVOTyIgNTsgfQorZmkKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCitpZiB0ZXN0ICJ4JENDIiAhPSB4Y2M7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyICRDQyBhbmQgY2MgdW5kZXJzdGFuZCAtYyBhbmQgLW8gdG9nZXRoZXIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAkQ0MgYW5kIGNjIHVuZGVyc3RhbmQgLWMgYW5kIC1vIHRvZ2V0aGVyLi4uICIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBjYyB1bmRlcnN0YW5kcyAtYyBhbmQgLW8gdG9nZXRoZXIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBjYyB1bmRlcnN0YW5kcyAtYyBhbmQgLW8gdG9nZXRoZXIuLi4gIiA+JjY7IH0KK2ZpCitzZXQgZHVtbXkgJENDOyBhY19jYz1gJGFzX2VjaG8gIiQyIiB8CisJCSAgICAgIHNlZCAncy9bXmEtekEtWjAtOV9dL18vZztzL15bMC05XS9fLydgCitpZiB7IGFzX3Zhcj1hY19jdl9wcm9nX2NjXyR7YWNfY2N9X2NfbzsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorIyBNYWtlIHN1cmUgaXQgd29ya3MgYm90aCB3aXRoICRDQyBhbmQgd2l0aCBzaW1wbGUgY2MuCisjIFdlIGRvIHRoZSB0ZXN0IHR3aWNlIGJlY2F1c2Ugc29tZSBjb21waWxlcnMgcmVmdXNlIHRvIG92ZXJ3cml0ZSBhbgorIyBleGlzdGluZyAubyBmaWxlIHdpdGggLW8sIHRob3VnaCB0aGV5IHdpbGwgY3JlYXRlIG9uZS4KK2FjX3RyeT0nJENDIC1jIGNvbmZ0ZXN0LiRhY19leHQgLW8gY29uZnRlc3QyLiRhY19vYmpleHQgPiY1Jworcm0gLWYgY29uZnRlc3QyLioKK2lmIHsgeyBjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJgorICAgdGVzdCAtZiBjb25mdGVzdDIuJGFjX29iamV4dCAmJiB7IHsgY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfdHJ5IikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07Cit0aGVuCisgIGV2YWwgYWNfY3ZfcHJvZ19jY18ke2FjX2NjfV9jX289eWVzCisgIGlmIHRlc3QgIngkQ0MiICE9IHhjYzsgdGhlbgorICAgICMgVGVzdCBmaXJzdCB0aGF0IGNjIGV4aXN0cyBhdCBhbGwuCisgICAgaWYgeyBhY190cnk9J2NjIC1jIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworICB7IHsgY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfdHJ5IikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IH07IHRoZW4KKyAgICAgIGFjX3RyeT0nY2MgLWMgY29uZnRlc3QuJGFjX2V4dCAtbyBjb25mdGVzdDIuJGFjX29iamV4dCA+JjUnCisgICAgICBybSAtZiBjb25mdGVzdDIuKgorICAgICAgaWYgeyB7IGNhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmCisJIHRlc3QgLWYgY29uZnRlc3QyLiRhY19vYmpleHQgJiYgeyB7IGNhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OworICAgICAgdGhlbgorCSMgY2Mgd29ya3MgdG9vLgorCToKKyAgICAgIGVsc2UKKwkjIGNjIGV4aXN0cyBidXQgZG9lc24ndCBsaWtlIC1vLgorCWV2YWwgYWNfY3ZfcHJvZ19jY18ke2FjX2NjfV9jX289bm8KKyAgICAgIGZpCisgICAgZmkKKyAgZmkKK2Vsc2UKKyAgZXZhbCBhY19jdl9wcm9nX2NjXyR7YWNfY2N9X2Nfbz1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QqCisKK2ZpCitpZiBldmFsIHRlc3QgXCRhY19jdl9wcm9nX2NjXyR7YWNfY2N9X2NfbyA9IHllczsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKworJGFzX2VjaG8gIiNkZWZpbmUgTk9fTUlOVVNfQ19NSU5VU19PIDEiID4+Y29uZmRlZnMuaAorCitmaQorCisjIEZJWE1FOiB3ZSByZWx5IG9uIHRoZSBjYWNoZSB2YXJpYWJsZSBuYW1lIGJlY2F1c2UKKyMgdGhlcmUgaXMgbm8gb3RoZXIgd2F5Lgorc2V0IGR1bW15ICRDQworYW1fY2M9YGVjaG8gJDIgfCBzZWQgJ3MvW15hLXpBLVowLTlfXS9fL2c7cy9eWzAtOV0vXy8nYAorZXZhbCBhbV90PVwkYWNfY3ZfcHJvZ19jY18ke2FtX2NjfV9jX28KK2lmIHRlc3QgIiRhbV90IiAhPSB5ZXM7IHRoZW4KKyAgICMgTG9zaW5nIGNvbXBpbGVyLCBzbyBvdmVycmlkZSB3aXRoIHRoZSBzY3JpcHQuCisgICAjIEZJWE1FOiBJdCBpcyB3cm9uZyB0byByZXdyaXRlIENDLgorICAgIyBCdXQgaWYgd2UgZG9uJ3QgdGhlbiB3ZSBnZXQgaW50byB0cm91YmxlIG9mIG9uZSBzb3J0IG9yIGFub3RoZXIuCisgICAjIEEgbG9uZ2VyLXRlcm0gZml4IHdvdWxkIGJlIHRvIGhhdmUgYXV0b21ha2UgdXNlIGFtX19DQyBpbiB0aGlzIGNhc2UsCisgICAjIGFuZCB0aGVuIHdlIGNvdWxkIHNldCBhbV9fQ0M9IlwkKHRvcF9zcmNkaXIpL2NvbXBpbGUgXCQoQ0MpIgorICAgQ0M9IiRhbV9hdXhfZGlyL2NvbXBpbGUgJENDIgorZmkKKworCisjIEJ5IGRlZmF1bHQgd2Ugc2ltcGx5IHVzZSB0aGUgQyBjb21waWxlciB0byBidWlsZCBhc3NlbWJseSBjb2RlLgorCit0ZXN0ICIke0NDQVMrc2V0fSIgPSBzZXQgfHwgQ0NBUz0kQ0MKK3Rlc3QgIiR7Q0NBU0ZMQUdTK3NldH0iID0gc2V0IHx8IENDQVNGTEFHUz0kQ0ZMQUdTCisKKworCitkZXBjYz0iJENDQVMiICAgYW1fY29tcGlsZXJfbGlzdD0KKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjYyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjYy4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthbV9jdl9DQ0FTX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAteiAiJEFNREVQX1RSVUUiICYmIHRlc3QgLWYgIiRhbV9kZXBjb21wIjsgdGhlbgorICAjIFdlIG1ha2UgYSBzdWJkaXIgYW5kIGRvIHRoZSB0ZXN0cyB0aGVyZS4gIE90aGVyd2lzZSB3ZSBjYW4gZW5kIHVwCisgICMgbWFraW5nIGJvZ3VzIGZpbGVzIHRoYXQgd2UgZG9uJ3Qga25vdyBhYm91dCBhbmQgbmV2ZXIgcmVtb3ZlLiAgRm9yCisgICMgaW5zdGFuY2UgaXQgd2FzIHJlcG9ydGVkIHRoYXQgb24gSFAtVVggdGhlIGdjYyB0ZXN0IHdpbGwgZW5kIHVwCisgICMgbWFraW5nIGEgZHVtbXkgZmlsZSBuYW1lZCBgRCcgLS0gYmVjYXVzZSBgLU1EJyBtZWFucyBgcHV0IHRoZSBvdXRwdXQKKyAgIyBpbiBEJy4KKyAgbWtkaXIgY29uZnRlc3QuZGlyCisgICMgQ29weSBkZXBjb21wIHRvIHN1YmRpciBiZWNhdXNlIG90aGVyd2lzZSB3ZSB3b24ndCBmaW5kIGl0IGlmIHdlJ3JlCisgICMgdXNpbmcgYSByZWxhdGl2ZSBkaXJlY3RvcnkuCisgIGNwICIkYW1fZGVwY29tcCIgY29uZnRlc3QuZGlyCisgIGNkIGNvbmZ0ZXN0LmRpcgorICAjIFdlIHdpbGwgYnVpbGQgb2JqZWN0cyBhbmQgZGVwZW5kZW5jaWVzIGluIGEgc3ViZGlyZWN0b3J5IGJlY2F1c2UKKyAgIyBpdCBoZWxwcyB0byBkZXRlY3QgaW5hcHBsaWNhYmxlIGRlcGVuZGVuY3kgbW9kZXMuICBGb3IgaW5zdGFuY2UKKyAgIyBib3RoIFRydTY0J3MgY2MgYW5kIElDQyBzdXBwb3J0IC1NRCB0byBvdXRwdXQgZGVwZW5kZW5jaWVzIGFzIGEKKyAgIyBzaWRlIGVmZmVjdCBvZiBjb21waWxhdGlvbiwgYnV0IElDQyB3aWxsIHB1dCB0aGUgZGVwZW5kZW5jaWVzIGluCisgICMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdoaWxlIFRydTY0IHdpbGwgcHV0IHRoZW0gaW4gdGhlIG9iamVjdAorICAjIGRpcmVjdG9yeS4KKyAgbWtkaXIgc3ViCisKKyAgYW1fY3ZfQ0NBU19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCisgIGlmIHRlc3QgIiRhbV9jb21waWxlcl9saXN0IiA9ICIiOyB0aGVuCisgICAgIGFtX2NvbXBpbGVyX2xpc3Q9YHNlZCAtbiAncy9eIypcKFthLXpBLVowLTldKlwpKSQvXDEvcCcgPCAuL2RlcGNvbXBgCisgIGZpCisgIGZvciBkZXBtb2RlIGluICRhbV9jb21waWxlcl9saXN0OyBkbworICAgICMgU2V0dXAgYSBzb3VyY2Ugd2l0aCBtYW55IGRlcGVuZGVuY2llcywgYmVjYXVzZSBzb21lIGNvbXBpbGVycworICAgICMgbGlrZSB0byB3cmFwIGxhcmdlIGRlcGVuZGVuY3kgbGlzdHMgb24gY29sdW1uIDgwICh3aXRoIFwpLCBhbmQKKyAgICAjIHdlIHNob3VsZCBub3QgY2hvb3NlIGEgZGVwY29tcCBtb2RlIHdoaWNoIGlzIGNvbmZ1c2VkIGJ5IHRoaXMuCisgICAgIworICAgICMgV2UgbmVlZCB0byByZWNyZWF0ZSB0aGVzZSBmaWxlcyBmb3IgZWFjaCB0ZXN0LCBhcyB0aGUgY29tcGlsZXIgbWF5CisgICAgIyBvdmVyd3JpdGUgc29tZSBvZiB0aGVtIHdoZW4gdGVzdGluZyB3aXRoIG9ic2N1cmUgY29tbWFuZCBsaW5lcy4KKyAgICAjIFRoaXMgaGFwcGVucyBhdCBsZWFzdCB3aXRoIHRoZSBBSVggQyBjb21waWxlci4KKyAgICA6ID4gc3ViL2NvbmZ0ZXN0LmMKKyAgICBmb3IgaSBpbiAxIDIgMyA0IDUgNjsgZG8KKyAgICAgIGVjaG8gJyNpbmNsdWRlICJjb25mdHN0JyRpJy5oIicgPj4gc3ViL2NvbmZ0ZXN0LmMKKyAgICAgICMgVXNpbmcgYDogPiBzdWIvY29uZnRzdCRpLmgnIGNyZWF0ZXMgb25seSBzdWIvY29uZnRzdDEuaCB3aXRoCisgICAgICAjIFNvbGFyaXMgOCdzIHsvdXNyLH0vYmluL3NoLgorICAgICAgdG91Y2ggc3ViL2NvbmZ0c3QkaS5oCisgICAgZG9uZQorICAgIGVjaG8gIiR7YW1fX2luY2x1ZGV9ICR7YW1fX3F1b3RlfXN1Yi9jb25mdGVzdC5QbyR7YW1fX3F1b3RlfSIgPiBjb25mbWYKKworICAgIGNhc2UgJGRlcG1vZGUgaW4KKyAgICBub3NpZGVlZmZlY3QpCisgICAgICAjIGFmdGVyIHRoaXMgdGFnLCBtZWNoYW5pc21zIGFyZSBub3QgYnkgc2lkZS1lZmZlY3QsIHNvIHRoZXknbGwKKyAgICAgICMgb25seSBiZSB1c2VkIHdoZW4gZXhwbGljaXRseSByZXF1ZXN0ZWQKKyAgICAgIGlmIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciID0geHllczsgdGhlbgorCWNvbnRpbnVlCisgICAgICBlbHNlCisJYnJlYWsKKyAgICAgIGZpCisgICAgICA7OworICAgIG5vbmUpIGJyZWFrIDs7CisgICAgZXNhYworICAgICMgV2UgY2hlY2sgd2l0aCBgLWMnIGFuZCBgLW8nIGZvciB0aGUgc2FrZSBvZiB0aGUgImRhc2htc3Rkb3V0IgorICAgICMgbW9kZS4gIEl0IHR1cm5zIG91dCB0aGF0IHRoZSBTdW5Qcm8gQysrIGNvbXBpbGVyIGRvZXMgbm90IHByb3Blcmx5CisgICAgIyBoYW5kbGUgYC1NIC1vJywgYW5kIHdlIG5lZWQgdG8gZGV0ZWN0IHRoaXMuCisgICAgaWYgZGVwbW9kZT0kZGVwbW9kZSBcCisgICAgICAgc291cmNlPXN1Yi9jb25mdGVzdC5jIG9iamVjdD1zdWIvY29uZnRlc3QuJHtPQkpFWFQtb30gXAorICAgICAgIGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlBvIHRtcGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlRQbyBcCisgICAgICAgJFNIRUxMIC4vZGVwY29tcCAkZGVwY2MgLWMgLW8gc3ViL2NvbmZ0ZXN0LiR7T0JKRVhULW99IHN1Yi9jb25mdGVzdC5jIFwKKyAgICAgICAgID4vZGV2L251bGwgMj5jb25mdGVzdC5lcnIgJiYKKyAgICAgICBncmVwIHN1Yi9jb25mdHN0MS5oIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCisgICAgICAgZ3JlcCBzdWIvY29uZnRzdDYuaCBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgorICAgICAgIGdyZXAgc3ViL2NvbmZ0ZXN0LiR7T0JKRVhULW99IHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCisgICAgICAgJHtNQUtFLW1ha2V9IC1zIC1mIGNvbmZtZiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICAjIGljYyBkb2Vzbid0IGNob2tlIG9uIHVua25vd24gb3B0aW9ucywgaXQgd2lsbCBqdXN0IGlzc3VlIHdhcm5pbmdzCisgICAgICAjIG9yIHJlbWFya3MgKGV2ZW4gd2l0aCAtV2Vycm9yKS4gIFNvIHdlIGdyZXAgc3RkZXJyIGZvciBhbnkgbWVzc2FnZQorICAgICAgIyB0aGF0IHNheXMgYW4gb3B0aW9uIHdhcyBpZ25vcmVkIG9yIG5vdCBzdXBwb3J0ZWQuCisgICAgICAjIFdoZW4gZ2l2ZW4gLU1QLCBpY2MgNy4wIGFuZCA3LjEgY29tcGxhaW4gdGh1c2x5OgorICAgICAgIyAgIGljYzogQ29tbWFuZCBsaW5lIHdhcm5pbmc6IGlnbm9yaW5nIG9wdGlvbiAnLU0nOyBubyBhcmd1bWVudCByZXF1aXJlZAorICAgICAgIyBUaGUgZGlhZ25vc2lzIGNoYW5nZWQgaW4gaWNjIDguMDoKKyAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSByZW1hcms6IG9wdGlvbiAnLU1QJyBub3Qgc3VwcG9ydGVkCisgICAgICBpZiAoZ3JlcCAnaWdub3Jpbmcgb3B0aW9uJyBjb25mdGVzdC5lcnIgfHwKKyAgICAgICAgICBncmVwICdub3Qgc3VwcG9ydGVkJyBjb25mdGVzdC5lcnIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCisgICAgICAgIGFtX2N2X0NDQVNfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9JGRlcG1vZGUKKyAgICAgICAgYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorCisgIGNkIC4uCisgIHJtIC1yZiBjb25mdGVzdC5kaXIKK2Vsc2UKKyAgYW1fY3ZfQ0NBU19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhbV9jdl9DQ0FTX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA+JjUKKyRhc19lY2hvICIkYW1fY3ZfQ0NBU19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIgPiY2OyB9CitDQ0FTREVQTU9ERT1kZXBtb2RlPSRhbV9jdl9DQ0FTX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlCisKKyBpZgorICB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm8gXAorICAmJiB0ZXN0ICIkYW1fY3ZfQ0NBU19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIgPSBnY2MzOyB0aGVuCisgIGFtX19mYXN0ZGVwQ0NBU19UUlVFPQorICBhbV9fZmFzdGRlcENDQVNfRkFMU0U9JyMnCitlbHNlCisgIGFtX19mYXN0ZGVwQ0NBU19UUlVFPScjJworICBhbV9fZmFzdGRlcENDQVNfRkFMU0U9CitmaQorCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIHN0cmVycm9yIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgc3RyZXJyb3IuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX3N0cmVycm9yK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTPSRMSUJTCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgc3RyZXJyb3IgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBzdHJlcnJvciAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorZm9yIGFjX2xpYiBpbiAnJyBjcG9zaXg7IGRvCisgIGlmIHRlc3QgLXogIiRhY19saWIiOyB0aGVuCisgICAgYWNfcmVzPSJub25lIHJlcXVpcmVkIgorICBlbHNlCisgICAgYWNfcmVzPS1sJGFjX2xpYgorICAgIExJQlM9Ii1sJGFjX2xpYiAgJGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUyIKKyAgZmkKKyAgaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9zZWFyY2hfc3RyZXJyb3I9JGFjX3JlcworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dAorICBpZiB0ZXN0ICIke2FjX2N2X3NlYXJjaF9zdHJlcnJvcitzZXR9IiA9IHNldDsgdGhlbiA6CisgIGJyZWFrCitmaQorZG9uZQoraWYgdGVzdCAiJHthY19jdl9zZWFyY2hfc3RyZXJyb3Irc2V0fSIgPSBzZXQ7IHRoZW4gOgorCitlbHNlCisgIGFjX2N2X3NlYXJjaF9zdHJlcnJvcj1ubworZmkKK3JtIGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc2VhcmNoX3N0cmVycm9yIiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfc2VhcmNoX3N0cmVycm9yIiA+JjY7IH0KK2FjX3Jlcz0kYWNfY3Zfc2VhcmNoX3N0cmVycm9yCitpZiB0ZXN0ICIkYWNfcmVzIiAhPSBubzsgdGhlbiA6CisgIHRlc3QgIiRhY19yZXMiID0gIm5vbmUgcmVxdWlyZWQiIHx8IExJQlM9IiRhY19yZXMgJExJQlMiCisKK2ZpCisKKworZm9yIGFjX3Byb2cgaW4gZ2F3ayBtYXdrIG5hd2sgYXdrCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQVdLK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJEFXSyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19BV0s9IiRBV0siICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19BV0s9IiRhY19wcm9nIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0FXSz0kYWNfY3ZfcHJvZ19BV0sKK2lmIHRlc3QgLW4gIiRBV0siOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQVdLIiA+JjUKKyRhc19lY2hvICIkQVdLIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgdGVzdCAtbiAiJEFXSyIgJiYgYnJlYWsKK2RvbmUKKworCisKKworaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9d2luZHJlcyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH13aW5kcmVzOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19SQytzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRSQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19SQz0iJFJDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfUkM9IiR7YWNfdG9vbF9wcmVmaXh9d2luZHJlcyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitSQz0kYWNfY3ZfcHJvZ19SQworaWYgdGVzdCAtbiAiJFJDIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFJDIiA+JjUKKyRhc19lY2hvICIkUkMiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX1JDIjsgdGhlbgorICBhY19jdF9SQz0kUkMKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ3aW5kcmVzIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSB3aW5kcmVzOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9SQytzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9SQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9SQz0iJGFjX2N0X1JDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfUkM9IndpbmRyZXMiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfUkM9JGFjX2N2X3Byb2dfYWNfY3RfUkMKK2lmIHRlc3QgLW4gIiRhY19jdF9SQyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9SQyIgPiY1CiskYXNfZWNobyAiJGFjX2N0X1JDIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfY3RfUkMiID0geDsgdGhlbgorICAgIFJDPSJubyIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBSQz0kYWNfY3RfUkMKKyAgZmkKK2Vsc2UKKyAgUkM9IiRhY19jdl9wcm9nX1JDIgorZmkKKworCisKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaGFyZWQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2hhcmVkK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfc2hhcmVkOyBwPSR7UEFDS0FHRS1kZWZhdWx0fQorICAgIGNhc2UgJGVuYWJsZXZhbCBpbgorICAgIHllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKKyAgICBubykgZW5hYmxlX3NoYXJlZD1ubyA7OworICAgICopCisgICAgICBlbmFibGVfc2hhcmVkPW5vCisgICAgICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCisgICAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JFBBVEhfU0VQQVJBVE9SLCIKKyAgICAgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KKwlJRlM9IiRsdF9zYXZlX2lmcyIKKwlpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgorCSAgZW5hYmxlX3NoYXJlZD15ZXMKKwlmaQorICAgICAgZG9uZQorICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgICA7OworICAgIGVzYWMKK2Vsc2UKKyAgZW5hYmxlX3NoYXJlZD15ZXMKK2ZpCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXN0YXRpYyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zdGF0aWMrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9zdGF0aWM7IHA9JHtQQUNLQUdFLWRlZmF1bHR9CisgICAgY2FzZSAkZW5hYmxldmFsIGluCisgICAgeWVzKSBlbmFibGVfc3RhdGljPXllcyA7OworICAgIG5vKSBlbmFibGVfc3RhdGljPW5vIDs7CisgICAgKikKKyAgICAgZW5hYmxlX3N0YXRpYz1ubworICAgICAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgorICAgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCisgICAgICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisJSUZTPSIkbHRfc2F2ZV9pZnMiCisJaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKwkgIGVuYWJsZV9zdGF0aWM9eWVzCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICAgOzsKKyAgICBlc2FjCitlbHNlCisgIGVuYWJsZV9zdGF0aWM9eWVzCitmaQorCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1mYXN0LWluc3RhbGwgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfZmFzdF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfZmFzdF9pbnN0YWxsOyBwPSR7UEFDS0FHRS1kZWZhdWx0fQorICAgIGNhc2UgJGVuYWJsZXZhbCBpbgorICAgIHllcykgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMgOzsKKyAgICBubykgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubyA7OworICAgICopCisgICAgICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCisgICAgICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCisgICAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JFBBVEhfU0VQQVJBVE9SLCIKKyAgICAgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KKwlJRlM9IiRsdF9zYXZlX2lmcyIKKwlpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgorCSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKKwlmaQorICAgICAgZG9uZQorICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgICA7OworICAgIGVzYWMKK2Vsc2UKKyAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKK2ZpCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgYSBzZWQgdGhhdCBkb2VzIG5vdCB0cnVuY2F0ZSBvdXRwdXQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGEgc2VkIHRoYXQgZG9lcyBub3QgdHJ1bmNhdGUgb3V0cHV0Li4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2x0X2N2X3BhdGhfU0VEK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgIyBMb29wIHRocm91Z2ggdGhlIHVzZXIncyBwYXRoIGFuZCB0ZXN0IGZvciBzZWQgYW5kIGdzZWQuCisjIFRoZW4gdXNlIHRoYXQgbGlzdCBvZiBzZWQncyBhcyBvbmVzIHRvIHRlc3QgZm9yIHRydW5jYXRpb24uCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBsdF9hY19wcm9nIGluIHNlZCBnc2VkOyBkbworICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICAgICAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kbHRfYWNfcHJvZyRhY19leGVjX2V4dCI7IHRoZW4KKyAgICAgICAgbHRfYWNfc2VkX2xpc3Q9IiRsdF9hY19zZWRfbGlzdCAkYXNfZGlyLyRsdF9hY19wcm9nJGFjX2V4ZWNfZXh0IgorICAgICAgZmkKKyAgICBkb25lCisgIGRvbmUKK2RvbmUKK2x0X2FjX21heD0wCitsdF9hY19jb3VudD0wCisjIEFkZCAvdXNyL3hwZzQvYmluL3NlZCBhcyBpdCBpcyB0eXBpY2FsbHkgZm91bmQgb24gU29sYXJpcworIyBhbG9uZyB3aXRoIC9iaW4vc2VkIHRoYXQgdHJ1bmNhdGVzIG91dHB1dC4KK2ZvciBsdF9hY19zZWQgaW4gJGx0X2FjX3NlZF9saXN0IC91c3IveHBnNC9iaW4vc2VkOyBkbworICB0ZXN0ICEgLWYgJGx0X2FjX3NlZCAmJiBicmVhaworICBjYXQgL2Rldi9udWxsID4gY29uZnRlc3QuaW4KKyAgbHRfYWNfY291bnQ9MAorICBlY2hvICRFQ0hPX04gIjAxMjM0NTY3ODkkRUNIT19DIiA+Y29uZnRlc3QuaW4KKyAgIyBDaGVjayBmb3IgR05VIHNlZCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgorICBpZiAiJGx0X2FjX3NlZCIgLS12ZXJzaW9uIDI+JjEgPCAvZGV2L251bGwgfCBncmVwICdHTlUnID4gL2Rldi9udWxsOyB0aGVuCisgICAgbHRfY3ZfcGF0aF9TRUQ9JGx0X2FjX3NlZAorICAgIGJyZWFrCisgIGZpCisgIHdoaWxlIHRydWU7IGRvCisgICAgY2F0IGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LmluID5jb25mdGVzdC50bXAKKyAgICBtdiBjb25mdGVzdC50bXAgY29uZnRlc3QuaW4KKyAgICBjcCBjb25mdGVzdC5pbiBjb25mdGVzdC5ubAorICAgIGVjaG8gPj5jb25mdGVzdC5ubAorICAgICRsdF9hY19zZWQgLWUgJ3MvYSQvLycgPCBjb25mdGVzdC5ubCA+Y29uZnRlc3Qub3V0IHx8IGJyZWFrCisgICAgY21wIC1zIGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5ubCB8fCBicmVhaworICAgICMgMTAwMDAgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAorICAgIHRlc3QgJGx0X2FjX2NvdW50IC1ndCAxMCAmJiBicmVhaworICAgIGx0X2FjX2NvdW50PWBleHByICRsdF9hY19jb3VudCArIDFgCisgICAgaWYgdGVzdCAkbHRfYWNfY291bnQgLWd0ICRsdF9hY19tYXg7IHRoZW4KKyAgICAgIGx0X2FjX21heD0kbHRfYWNfY291bnQKKyAgICAgIGx0X2N2X3BhdGhfU0VEPSRsdF9hY19zZWQKKyAgICBmaQorICBkb25lCitkb25lCitTRUQ9JGx0X2N2X3BhdGhfU0VECisKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkU0VEIiA+JjUKKyRhc19lY2hvICIkU0VEIiA+JjY7IH0KKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZ3JlcCB0aGF0IGhhbmRsZXMgbG9uZyBsaW5lcyBhbmQgLWUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGdyZXAgdGhhdCBoYW5kbGVzIGxvbmcgbGluZXMgYW5kIC1lLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3BhdGhfR1JFUCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLXogIiRHUkVQIjsgdGhlbgorICBhY19wYXRoX0dSRVBfZm91bmQ9ZmFsc2UKKyAgIyBMb29wIHRocm91Z2ggdGhlIHVzZXIncyBwYXRoIGFuZCB0ZXN0IGZvciBlYWNoIG9mIFBST0dOQU1FLUxJU1QKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4KK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfcHJvZyBpbiBncmVwIGdncmVwOyBkbworICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICAgICAgYWNfcGF0aF9HUkVQPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IgorICAgICAgeyB0ZXN0IC1mICIkYWNfcGF0aF9HUkVQIiAmJiAkYXNfdGVzdF94ICIkYWNfcGF0aF9HUkVQIjsgfSB8fCBjb250aW51ZQorIyBDaGVjayBmb3IgR05VIGFjX3BhdGhfR1JFUCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgorICAjIENoZWNrIGZvciBHTlUgJGFjX3BhdGhfR1JFUAorY2FzZSBgIiRhY19wYXRoX0dSRVAiIC0tdmVyc2lvbiAyPiYxYCBpbgorKkdOVSopCisgIGFjX2N2X3BhdGhfR1JFUD0iJGFjX3BhdGhfR1JFUCIgYWNfcGF0aF9HUkVQX2ZvdW5kPTo7OworKikKKyAgYWNfY291bnQ9MAorICAkYXNfZWNob19uIDAxMjM0NTY3ODkgPiJjb25mdGVzdC5pbiIKKyAgd2hpbGUgOgorICBkbworICAgIGNhdCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5pbiIgPiJjb25mdGVzdC50bXAiCisgICAgbXYgImNvbmZ0ZXN0LnRtcCIgImNvbmZ0ZXN0LmluIgorICAgIGNwICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0Lm5sIgorICAgICRhc19lY2hvICdHUkVQJyA+PiAiY29uZnRlc3QubmwiCisgICAgIiRhY19wYXRoX0dSRVAiIC1lICdHUkVQJCcgLWUgJy0oY2Fubm90IG1hdGNoKS0nIDwgImNvbmZ0ZXN0Lm5sIiA+ImNvbmZ0ZXN0Lm91dCIgMj4vZGV2L251bGwgfHwgYnJlYWsKKyAgICBkaWZmICJjb25mdGVzdC5vdXQiICJjb25mdGVzdC5ubCIgPi9kZXYvbnVsbCAyPiYxIHx8IGJyZWFrCisgICAgYXNfZm5fYXJpdGggJGFjX2NvdW50ICsgMSAmJiBhY19jb3VudD0kYXNfdmFsCisgICAgaWYgdGVzdCAkYWNfY291bnQgLWd0ICR7YWNfcGF0aF9HUkVQX21heC0wfTsgdGhlbgorICAgICAgIyBCZXN0IG9uZSBzbyBmYXIsIHNhdmUgaXQgYnV0IGtlZXAgbG9va2luZyBmb3IgYSBiZXR0ZXIgb25lCisgICAgICBhY19jdl9wYXRoX0dSRVA9IiRhY19wYXRoX0dSRVAiCisgICAgICBhY19wYXRoX0dSRVBfbWF4PSRhY19jb3VudAorICAgIGZpCisgICAgIyAxMCooMl4xMCkgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAorICAgIHRlc3QgJGFjX2NvdW50IC1ndCAxMCAmJiBicmVhaworICBkb25lCisgIHJtIC1mIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LnRtcCBjb25mdGVzdC5ubCBjb25mdGVzdC5vdXQ7OworZXNhYworCisgICAgICAkYWNfcGF0aF9HUkVQX2ZvdW5kICYmIGJyZWFrIDMKKyAgICBkb25lCisgIGRvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworICBpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HUkVQIjsgdGhlbgorICAgIGFzX2ZuX2Vycm9yICJubyBhY2NlcHRhYmxlIGdyZXAgY291bGQgYmUgZm91bmQgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluIiAiJExJTkVOTyIgNQorICBmaQorZWxzZQorICBhY19jdl9wYXRoX0dSRVA9JEdSRVAKK2ZpCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3BhdGhfR1JFUCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3BhdGhfR1JFUCIgPiY2OyB9CisgR1JFUD0iJGFjX2N2X3BhdGhfR1JFUCIKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBlZ3JlcCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZWdyZXAuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9FR1JFUCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIGVjaG8gYSB8ICRHUkVQIC1FICcoYXxiKScgPi9kZXYvbnVsbCAyPiYxCisgICB0aGVuIGFjX2N2X3BhdGhfRUdSRVA9IiRHUkVQIC1FIgorICAgZWxzZQorICAgICBpZiB0ZXN0IC16ICIkRUdSRVAiOyB0aGVuCisgIGFjX3BhdGhfRUdSRVBfZm91bmQ9ZmFsc2UKKyAgIyBMb29wIHRocm91Z2ggdGhlIHVzZXIncyBwYXRoIGFuZCB0ZXN0IGZvciBlYWNoIG9mIFBST0dOQU1FLUxJU1QKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4KK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfcHJvZyBpbiBlZ3JlcDsgZG8KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgICAgIGFjX3BhdGhfRUdSRVA9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiCisgICAgICB7IHRlc3QgLWYgIiRhY19wYXRoX0VHUkVQIiAmJiAkYXNfdGVzdF94ICIkYWNfcGF0aF9FR1JFUCI7IH0gfHwgY29udGludWUKKyMgQ2hlY2sgZm9yIEdOVSBhY19wYXRoX0VHUkVQIGFuZCBzZWxlY3QgaXQgaWYgaXQgaXMgZm91bmQuCisgICMgQ2hlY2sgZm9yIEdOVSAkYWNfcGF0aF9FR1JFUAorY2FzZSBgIiRhY19wYXRoX0VHUkVQIiAtLXZlcnNpb24gMj4mMWAgaW4KKypHTlUqKQorICBhY19jdl9wYXRoX0VHUkVQPSIkYWNfcGF0aF9FR1JFUCIgYWNfcGF0aF9FR1JFUF9mb3VuZD06OzsKKyopCisgIGFjX2NvdW50PTAKKyAgJGFzX2VjaG9fbiAwMTIzNDU2Nzg5ID4iY29uZnRlc3QuaW4iCisgIHdoaWxlIDoKKyAgZG8KKyAgICBjYXQgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QuaW4iID4iY29uZnRlc3QudG1wIgorICAgIG12ICJjb25mdGVzdC50bXAiICJjb25mdGVzdC5pbiIKKyAgICBjcCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5ubCIKKyAgICAkYXNfZWNobyAnRUdSRVAnID4+ICJjb25mdGVzdC5ubCIKKyAgICAiJGFjX3BhdGhfRUdSRVAiICdFR1JFUCQnIDwgImNvbmZ0ZXN0Lm5sIiA+ImNvbmZ0ZXN0Lm91dCIgMj4vZGV2L251bGwgfHwgYnJlYWsKKyAgICBkaWZmICJjb25mdGVzdC5vdXQiICJjb25mdGVzdC5ubCIgPi9kZXYvbnVsbCAyPiYxIHx8IGJyZWFrCisgICAgYXNfZm5fYXJpdGggJGFjX2NvdW50ICsgMSAmJiBhY19jb3VudD0kYXNfdmFsCisgICAgaWYgdGVzdCAkYWNfY291bnQgLWd0ICR7YWNfcGF0aF9FR1JFUF9tYXgtMH07IHRoZW4KKyAgICAgICMgQmVzdCBvbmUgc28gZmFyLCBzYXZlIGl0IGJ1dCBrZWVwIGxvb2tpbmcgZm9yIGEgYmV0dGVyIG9uZQorICAgICAgYWNfY3ZfcGF0aF9FR1JFUD0iJGFjX3BhdGhfRUdSRVAiCisgICAgICBhY19wYXRoX0VHUkVQX21heD0kYWNfY291bnQKKyAgICBmaQorICAgICMgMTAqKDJeMTApIGNoYXJzIGFzIGlucHV0IHNlZW1zIG1vcmUgdGhhbiBlbm91Z2gKKyAgICB0ZXN0ICRhY19jb3VudCAtZ3QgMTAgJiYgYnJlYWsKKyAgZG9uZQorICBybSAtZiBjb25mdGVzdC5pbiBjb25mdGVzdC50bXAgY29uZnRlc3QubmwgY29uZnRlc3Qub3V0OzsKK2VzYWMKKworICAgICAgJGFjX3BhdGhfRUdSRVBfZm91bmQgJiYgYnJlYWsgMworICAgIGRvbmUKKyAgZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisgIGlmIHRlc3QgLXogIiRhY19jdl9wYXRoX0VHUkVQIjsgdGhlbgorICAgIGFzX2ZuX2Vycm9yICJubyBhY2NlcHRhYmxlIGVncmVwIGNvdWxkIGJlIGZvdW5kIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbiIgIiRMSU5FTk8iIDUKKyAgZmkKK2Vsc2UKKyAgYWNfY3ZfcGF0aF9FR1JFUD0kRUdSRVAKK2ZpCisKKyAgIGZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wYXRoX0VHUkVQIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfcGF0aF9FR1JFUCIgPiY2OyB9CisgRUdSRVA9IiRhY19jdl9wYXRoX0VHUkVQIgorCisKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1nbnUtbGQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2dudV9sZCtzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfZ251X2xkOyB0ZXN0ICIkd2l0aHZhbCIgPSBubyB8fCB3aXRoX2dudV9sZD15ZXMKK2Vsc2UKKyAgd2l0aF9nbnVfbGQ9bm8KK2ZpCisKK2FjX3Byb2c9bGQKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICMgQ2hlY2sgaWYgZ2NjIC1wcmludC1wcm9nLW5hbWU9bGQgZ2l2ZXMgYSBwYXRoLgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBsZCB1c2VkIGJ5ICRDQyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgbGQgdXNlZCBieSAkQ0MuLi4gIiA+JjY7IH0KKyAgY2FzZSAkaG9zdCBpbgorICAqLSotbWluZ3cqKQorICAgICMgZ2NjIGxlYXZlcyBhIHRyYWlsaW5nIGNhcnJpYWdlIHJldHVybiB3aGljaCB1cHNldHMgbWluZ3cKKyAgICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjUgfCB0ciAtZCAnXDAxNSdgIDs7CisgICopCisgICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YCA7OworICBlc2FjCisgIGNhc2UgJGFjX3Byb2cgaW4KKyAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KKyAgICBbXFwvXSogfCA/OltcXC9dKikKKyAgICAgIHJlX2RpcmVsdD0nL1teL11bXi9dKi9cLlwuLycKKyAgICAgICMgQ2Fub25pY2FsaXplIHRoZSBwYXRobmFtZSBvZiBsZAorICAgICAgYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgJFNFRCAncyVcXFxcJS8lZydgCisgICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KKwlhY19wcm9nPWBlY2hvICRhY19wcm9nfCAkU0VEICJzJSRyZV9kaXJlbHQlLyUiYAorICAgICAgZG9uZQorICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCisgICAgICA7OworICAiIikKKyAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KKyAgICBhY19wcm9nPWxkCisgICAgOzsKKyAgKikKKyAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCisgICAgd2l0aF9nbnVfbGQ9dW5rbm93bgorICAgIDs7CisgIGVzYWMKK2VsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBHTlUgbGQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEdOVSBsZC4uLiAiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBub24tR05VIGxkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBub24tR05VIGxkLi4uICIgPiY2OyB9CitmaQoraWYgdGVzdCAiJHtsdF9jdl9wYXRoX0xEK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAteiAiJExEIjsgdGhlbgorICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciIHx8IHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ckYWNfZXhlZXh0IjsgdGhlbgorICAgICAgbHRfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKKyAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKKyAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KKyAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgorICAgICAgY2FzZSBgIiRsdF9jdl9wYXRoX0xEIiAtdiAyPiYxIDwvZGV2L251bGxgIGluCisgICAgICAqR05VKiB8ICond2l0aCBCRkQnKikKKwl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCisJOzsKKyAgICAgICopCisJdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKKwk7OworICAgICAgZXNhYworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkbHRfc2F2ZV9pZnMiCitlbHNlCisgIGx0X2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCitmaQorZmkKKworTEQ9IiRsdF9jdl9wYXRoX0xEIgoraWYgdGVzdCAtbiAiJExEIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJExEIiA+JjUKKyRhc19lY2hvICIkTEQiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCit0ZXN0IC16ICIkTEQiICYmIGFzX2ZuX2Vycm9yICJubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSCIgIiRMSU5FTk8iIDUKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7bHRfY3ZfcHJvZ19nbnVfbGQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICAjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgorY2FzZSBgJExEIC12IDI+JjEgPC9kZXYvbnVsbGAgaW4KKypHTlUqIHwgKid3aXRoIEJGRCcqKQorICBsdF9jdl9wcm9nX2dudV9sZD15ZXMKKyAgOzsKKyopCisgIGx0X2N2X3Byb2dfZ251X2xkPW5vCisgIDs7Citlc2FjCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2dudV9sZCIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3Byb2dfZ251X2xkIiA+JjY7IH0KK3dpdGhfZ251X2xkPSRsdF9jdl9wcm9nX2dudV9sZAorCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRMRCBvcHRpb24gdG8gcmVsb2FkIG9iamVjdCBmaWxlcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJExEIG9wdGlvbiB0byByZWxvYWQgb2JqZWN0IGZpbGVzLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2x0X2N2X2xkX3JlbG9hZF9mbGFnK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfbGRfcmVsb2FkX2ZsYWc9Jy1yJworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfbGRfcmVsb2FkX2ZsYWciID4mNQorJGFzX2VjaG8gIiRsdF9jdl9sZF9yZWxvYWRfZmxhZyIgPiY2OyB9CityZWxvYWRfZmxhZz0kbHRfY3ZfbGRfcmVsb2FkX2ZsYWcKK2Nhc2UgJHJlbG9hZF9mbGFnIGluCisiIiB8ICIgIiopIDs7CisqKSByZWxvYWRfZmxhZz0iICRyZWxvYWRfZmxhZyIgOzsKK2VzYWMKK3JlbG9hZF9jbWRzPSckTEQkcmVsb2FkX2ZsYWcgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQlNELWNvbXBhdGlibGUgbm0iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEJTRC1jb21wYXRpYmxlIG5tLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2x0X2N2X3BhdGhfTk0rc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkTk0iOyB0aGVuCisgICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorICBsdF9jdl9wYXRoX05NPSIkTk0iCitlbHNlCisgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICBmb3IgYWNfZGlyIGluICRQQVRIIC91c3IvY2NzL2JpbiAvdXNyL3VjYiAvYmluOyBkbworICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgdG1wX25tPSIkYWNfZGlyLyR7YWNfdG9vbF9wcmVmaXh9bm0iCisgICAgaWYgdGVzdCAtZiAiJHRtcF9ubSIgfHwgdGVzdCAtZiAiJHRtcF9ubSRhY19leGVleHQiIDsgdGhlbgorICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCisgICAgICAjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgorICAgICAgIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAorICAgICAgIyBUcnU2NCdzIG5tIGNvbXBsYWlucyB0aGF0IC9kZXYvbnVsbCBpcyBhbiBpbnZhbGlkIG9iamVjdCBmaWxlCisgICAgICBjYXNlIGAiJHRtcF9ubSIgLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJ2AgaW4KKyAgICAgICovZGV2L251bGwqIHwgKidJbnZhbGlkIGZpbGUgb3Igb2JqZWN0IHR5cGUnKikKKwlsdF9jdl9wYXRoX05NPSIkdG1wX25tIC1CIgorCWJyZWFrCisgICAgICAgIDs7CisgICAgICAqKQorCWNhc2UgYCIkdG1wX25tIiAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnYCBpbgorCSovZGV2L251bGwqKQorCSAgbHRfY3ZfcGF0aF9OTT0iJHRtcF9ubSAtcCIKKwkgIGJyZWFrCisJICA7OworCSopCisJICBsdF9jdl9wYXRoX05NPSR7bHRfY3ZfcGF0aF9OTT0iJHRtcF9ubSJ9ICMga2VlcCB0aGUgZmlyc3QgbWF0Y2gsIGJ1dAorCSAgY29udGludWUgIyBzbyB0aGF0IHdlIGNhbiB0cnkgdG8gZmluZCBvbmUgdGhhdCBzdXBwb3J0cyBCU0QgZmxhZ3MKKwkgIDs7CisJZXNhYworICAgICAgZXNhYworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRsdF9jdl9wYXRoX05NIiAmJiBsdF9jdl9wYXRoX05NPW5tCitmaQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcGF0aF9OTSIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3BhdGhfTk0iID4mNjsgfQorTk09IiRsdF9jdl9wYXRoX05NIgorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3Jrcy4uLiAiID4mNjsgfQorTE5fUz0kYXNfbG5fcworaWYgdGVzdCAiJExOX1MiID0gImxuIC1zIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8sIHVzaW5nICRMTl9TIiA+JjUKKyRhc19lY2hvICJubywgdXNpbmcgJExOX1MiID4mNjsgfQorZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gcmVjb2duaXNlIGRlcGVuZGVudCBsaWJyYXJpZXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIHJlY29nbmlzZSBkZXBlbmRlbnQgbGlicmFyaWVzLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2x0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9JyRNQUdJQ19DTUQnCitsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0KK2x0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSd1bmtub3duJworIyBOZWVkIHRvIHNldCB0aGUgcHJlY2VkaW5nIHZhcmlhYmxlIG9uIGFsbCBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0CisjIGludGVybGlicmFyeSBkZXBlbmRlbmNpZXMuCisjICdub25lJyAtLSBkZXBlbmRlbmNpZXMgbm90IHN1cHBvcnRlZC4KKyMgYHVua25vd24nIC0tIHNhbWUgYXMgbm9uZSwgYnV0IGRvY3VtZW50cyB0aGF0IHdlIHJlYWxseSBkb24ndCBrbm93LgorIyAncGFzc19hbGwnIC0tIGFsbCBkZXBlbmRlbmNpZXMgcGFzc2VkIHdpdGggbm8gY2hlY2tzLgorIyAndGVzdF9jb21waWxlJyAtLSBjaGVjayBieSBtYWtpbmcgdGVzdCBwcm9ncmFtLgorIyAnZmlsZV9tYWdpYyBbW3JlZ2V4XV0nIC0tIGNoZWNrIGJ5IGxvb2tpbmcgZm9yIGZpbGVzIGluIGxpYnJhcnkgcGF0aAorIyB3aGljaCByZXNwb25kcyB0byB0aGUgJGZpbGVfbWFnaWNfY21kIHdpdGggYSBnaXZlbiBleHRlbmRlZCByZWdleC4KKyMgSWYgeW91IGhhdmUgYGZpbGUnIG9yIGVxdWl2YWxlbnQgb24geW91ciBzeXN0ZW0gYW5kIHlvdSdyZSBub3Qgc3VyZQorIyB3aGV0aGVyIGBwYXNzX2FsbCcgd2lsbCAqYWx3YXlzKiB3b3JrLCB5b3UgcHJvYmFibHkgd2FudCB0aGlzIG9uZS4KKworY2FzZSAkaG9zdF9vcyBpbgorYWl4NCogfCBhaXg1KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworYmVvcyopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK2JzZGk0KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFswLTldWzAtOV0qLWJpdCBbTUxdU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIpJworICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nL3Vzci9iaW4vZmlsZSAtTCcKKyAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3NobGliL2xpYmMuc28KKyAgOzsKKworY3lnd2luKikKKyAgIyBmdW5jX3dpbjMyX2xpYmlkIGlzIGEgc2hlbGwgZnVuY3Rpb24gZGVmaW5lZCBpbiBsdG1haW4uc2gKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgXng4NiBhcmNoaXZlIGltcG9ydHxeeDg2IERMTCcKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9J2Z1bmNfd2luMzJfbGliaWQnCisgIDs7CisKK21pbmd3KiB8IHB3MzIqKQorICAjIEJhc2UgTVNZUy9NaW5HVyBkbyBub3QgcHJvdmlkZSB0aGUgJ2ZpbGUnIGNvbW1hbmQgbmVlZGVkIGJ5CisgICMgZnVuY193aW4zMl9saWJpZCBzaGVsbCBmdW5jdGlvbiwgc28gdXNlIGEgd2Vha2VyIHRlc3QgYmFzZWQgb24gJ29iamR1bXAnLgorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBmaWxlIGZvcm1hdCBwZWkqLWkzODYoLiphcmNoaXRlY3R1cmU6IGkzODYpPycKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9JyRPQkpEVU1QIC1mJworICA7OworCitkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitmcmVlYnNkKiB8IGtmcmVlYnNkKi1nbnUpCisgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4gL2Rldi9udWxsOyB0aGVuCisgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICBpKjg2ICkKKyAgICAgICMgTm90IHN1cmUgd2hldGhlciB0aGUgcHJlc2VuY2Ugb2YgT3BlbkJTRCBoZXJlIHdhcyBhIG1pc3Rha2UuCisgICAgICAjIExldCdzIGFjY2VwdCBib3RoIG9mIHRoZW0gdW50aWwgdGhpcyBpcyBjbGVhcmVkIHVwLgorICAgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKEZyZWVCU0R8T3BlbkJTRCkvaVszLTldODYgKGNvbXBhY3QgKT9kZW1hbmQgcGFnZWQgc2hhcmVkIGxpYnJhcnknCisgICAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCisgICAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT1gZWNobyAvdXNyL2xpYi9saWJjLnNvLipgCisgICAgICA7OworICAgIGVzYWMKKyAgZWxzZQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIGZpCisgIDs7CisKK2dudSopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK2hwdXgxMC4yMCogfCBocHV4MTEqKQorICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCisgIGNhc2UgIiRob3N0X2NwdSIgaW4KKyAgaWE2NCopCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKHNbMC05XVswLTldWzAtOV18RUxGLVswLTldWzAtOV0pIHNoYXJlZCBvYmplY3QgZmlsZSAtIElBNjQnCisgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvaHB1eDMyL2xpYmMuc28KKyAgICA7OworICBocHBhKjY0KikKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoc1swLTldWzAtOV1bMC05XXxFTEYtWzAtOV1bMC05XSkgc2hhcmVkIG9iamVjdCBmaWxlIC0gUEEtUklTQyBbMC05XS5bMC05XScKKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9wYTIwXzY0L2xpYmMuc2wKKyAgICA7OworICAqKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChzWzAtOV1bMC05XVswLTldfFBBLVJJU0NbMC05XS5bMC05XSkgc2hhcmVkIGxpYnJhcnknCisgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvbGliYy5zbAorICAgIDs7CisgIGVzYWMKKyAgOzsKKworaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgY2FzZSAkTEQgaW4KKyAgKi0zMnwqIi0zMiAiKSBsaWJtYWdpYz0zMi1iaXQ7OworICAqLW4zMnwqIi1uMzIgIikgbGlibWFnaWM9TjMyOzsKKyAgKi02NHwqIi02NCAiKSBsaWJtYWdpYz02NC1iaXQ7OworICAqKSBsaWJtYWdpYz1uZXZlci1tYXRjaDs7CisgIGVzYWMKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworIyBUaGlzIG11c3QgYmUgTGludXggRUxGLgorbGludXgqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCituZXRic2QqIHwga25ldGJzZCotZ251KQorICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+IC9kZXYvbnVsbDsgdGhlbgorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbXi9dKyhcLnNvXC5bMC05XStcLlswLTldK3xfcGljXC5hKSQnCisgIGVsc2UKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW14vXSsoXC5zb3xfcGljXC5hKSQnCisgIGZpCisgIDs7CisKK25ld29zNiopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW01MXVNCIChleGVjdXRhYmxlfGR5bmFtaWMgbGliKScKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQorICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9saWJubHMuc28KKyAgOzsKKworbnRvLXFueCopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXVua25vd24KKyAgOzsKKworb3BlbmJzZCopCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKKyAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL3Vzci9saWIvbGliYy5zby4qYAorICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgWzAtOV1bMC05XSotYml0IFtMTV1TQiBzaGFyZWQgb2JqZWN0JworICBlbHNlCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgT3BlbkJTRC4qIHNoYXJlZCBsaWJyYXJ5JworICBmaQorICA7OworCitvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK3NjbzMuMnY1KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworc29sYXJpcyopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK3N5c3Y0IHwgc3lzdjQuMnV3MiogfCBzeXN2NC4zKiB8IHN5c3Y1KikKKyAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KKyAgbW90b3JvbGEpCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFswLTldWzAtOV0qLWJpdCBbTUxdU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIpIE1bMC05XVswLTldKiBWZXJzaW9uIFswLTldJworICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC91c3IvbGliL2xpYmMuc28qYAorICAgIDs7CisgIG5jcikKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICAgIDs7CisgIHNlcXVlbnQpCisgICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy9iaW4vZmlsZScKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgWzAtOV1bMC05XSotYml0IFtMTV1TQiAoc2hhcmVkIG9iamVjdHxkeW5hbWljIGxpYiApJworICAgIDs7CisgIHNuaSkKKyAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nL2Jpbi9maWxlJworICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSJmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW0xNXVNCIGR5bmFtaWMgbGliIgorICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS9saWIvbGliYy5zbworICAgIDs7CisgIHNpZW1lbnMpCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgICA7OworICBlc2FjCisgIDs7CisKK3N5c3Y1T3BlblVOSVg4KiB8IHN5c3Y1VW5peFdhcmU3KiB8IHN5c3Y1dXdbNzhdKiB8IHVuaXh3YXJlNyogfCBzeXN2NCp1dzIqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworZXNhYworCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZCIgPiY1CiskYXNfZWNobyAiJGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kIiA+JjY7IH0KK2ZpbGVfbWFnaWNfY21kPSRsdF9jdl9maWxlX21hZ2ljX2NtZAorZGVwbGlic19jaGVja19tZXRob2Q9JGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kCit0ZXN0IC16ICIkZGVwbGlic19jaGVja19tZXRob2QiICYmIGRlcGxpYnNfY2hlY2tfbWV0aG9kPXVua25vd24KKworCisKKworIyBJZiBubyBDIGNvbXBpbGVyIHdhcyBzcGVjaWZpZWQsIHVzZSBDQy4KK0xUQ0M9JHtMVENDLSIkQ0MifQorCisjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorY29tcGlsZXI9JENDCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1saWJ0b29sLWxvY2sgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbGlidG9vbF9sb2NrK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfbGlidG9vbF9sb2NrOworZmkKKwordGVzdCAieCRlbmFibGVfbGlidG9vbF9sb2NrIiAhPSB4bm8gJiYgZW5hYmxlX2xpYnRvb2xfbG9jaz15ZXMKKworIyBTb21lIGZsYWdzIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgY29tcGlsZXIgb3IgbGlua2VyIGZvciBnb29kCisjIGxpYnRvb2wgc3VwcG9ydC4KK2Nhc2UgJGhvc3QgaW4KK2lhNjQtKi1ocHV4KikKKyAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgorICBlY2hvICdpbnQgaTsnID4gY29uZnRlc3QuJGFjX2V4dAorICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfY29tcGlsZVwiIjsgfSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCisgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC4kYWNfb2JqZXh0YCBpbgorICAgICpFTEYtMzIqKQorICAgICAgSFBVWF9JQTY0X01PREU9IjMyIgorICAgICAgOzsKKyAgICAqRUxGLTY0KikKKyAgICAgIEhQVVhfSUE2NF9NT0RFPSI2NCIKKyAgICAgIDs7CisgICAgZXNhYworICBmaQorICBybSAtcmYgY29uZnRlc3QqCisgIDs7CisqLSotaXJpeDYqKQorICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCisgIGVjaG8gJyNsaW5lIDU4NDEgImNvbmZpZ3VyZSInID4gY29uZnRlc3QuJGFjX2V4dAorICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfY29tcGlsZVwiIjsgfSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCisgICBpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19nbnVfbGQiID0geWVzOyB0aGVuCisgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC4kYWNfb2JqZXh0YCBpbgorICAgICozMi1iaXQqKQorICAgICAgTEQ9IiR7TEQtbGR9IC1tZWxmMzJic21pcCIKKyAgICAgIDs7CisgICAgKk4zMiopCisgICAgICBMRD0iJHtMRC1sZH0gLW1lbGYzMmJtaXBuMzIiCisgICAgICA7OworICAgICo2NC1iaXQqKQorICAgICAgTEQ9IiR7TEQtbGR9IC1tZWxmNjRibWlwIgorICAgICAgOzsKKyAgICBlc2FjCisgICBlbHNlCisgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC4kYWNfb2JqZXh0YCBpbgorICAgICozMi1iaXQqKQorICAgICAgTEQ9IiR7TEQtbGR9IC0zMiIKKyAgICAgIDs7CisgICAgKk4zMiopCisgICAgICBMRD0iJHtMRC1sZH0gLW4zMiIKKyAgICAgIDs7CisgICAgKjY0LWJpdCopCisgICAgICBMRD0iJHtMRC1sZH0gLTY0IgorICAgICAgOzsKKyAgICBlc2FjCisgICBmaQorICBmaQorICBybSAtcmYgY29uZnRlc3QqCisgIDs7CisKK3g4Nl82NC0qbGludXgqfHBwYyotKmxpbnV4Knxwb3dlcnBjKi0qbGludXgqfHMzOTAqLSpsaW51eCp8c3BhcmMqLSpsaW51eCopCisgICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KKyAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2NvbXBpbGVcIiI7IH0gPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgorICAgIGNhc2UgImAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIiBpbgorICAgICozMi1iaXQqKQorICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgICB4ODZfNjQtKmxpbnV4KikKKyAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmX2kzODYiCisgICAgICAgICAgOzsKKyAgICAgICAgcHBjNjQtKmxpbnV4Knxwb3dlcnBjNjQtKmxpbnV4KikKKyAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmMzJwcGNsaW51eCIKKyAgICAgICAgICA7OworICAgICAgICBzMzkweC0qbGludXgqKQorICAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGZfczM5MCIKKyAgICAgICAgICA7OworICAgICAgICBzcGFyYzY0LSpsaW51eCopCisgICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjMyX3NwYXJjIgorICAgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICA7OworICAgICo2NC1iaXQqKQorICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgICB4ODZfNjQtKmxpbnV4KikKKyAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmX3g4Nl82NCIKKyAgICAgICAgICA7OworICAgICAgICBwcGMqLSpsaW51eCp8cG93ZXJwYyotKmxpbnV4KikKKyAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmNjRwcGMiCisgICAgICAgICAgOzsKKyAgICAgICAgczM5MCotKmxpbnV4KikKKyAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmNjRfczM5MCIKKyAgICAgICAgICA7OworICAgICAgICBzcGFyYyotKmxpbnV4KikKKyAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmNjRfc3BhcmMiCisgICAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisgICAgZXNhYworICBmaQorICBybSAtcmYgY29uZnRlc3QqCisgIDs7CisKKyotKi1zY28zLjJ2NSopCisgICMgT24gU0NPIE9wZW5TZXJ2ZXIgNSwgd2UgbmVlZCAtYmVsZiB0byBnZXQgZnVsbC1mZWF0dXJlZCBiaW5hcmllcy4KKyAgU0FWRV9DRkxBR1M9IiRDRkxBR1MiCisgIENGTEFHUz0iJENGTEFHUyAtYmVsZiIKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGYuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7bHRfY3ZfY2NfbmVlZHNfYmVsZitzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgbHRfY3ZfY2NfbmVlZHNfYmVsZj15ZXMKK2Vsc2UKKyAgbHRfY3ZfY2NfbmVlZHNfYmVsZj1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisgICAgIGFjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgPiY1CiskYXNfZWNobyAiJGx0X2N2X2NjX25lZWRzX2JlbGYiID4mNjsgfQorICBpZiB0ZXN0IHgiJGx0X2N2X2NjX25lZWRzX2JlbGYiICE9IHgieWVzIjsgdGhlbgorICAgICMgdGhpcyBpcyBwcm9iYWJseSBnY2MgMi44LjAsIGVnY3MgMS4wIG9yIG5ld2VyOyBubyBuZWVkIGZvciAtYmVsZgorICAgIENGTEFHUz0iJFNBVkVfQ0ZMQUdTIgorICBmaQorICA7OworKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqKQorICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1kbGx0b29sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2w7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wcm9nX0RMTFRPT0wrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19ETExUT09MPSIkRExMVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX0RMTFRPT0w9IiR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitETExUT09MPSRhY19jdl9wcm9nX0RMTFRPT0wKK2lmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJERMTFRPT0wiID4mNQorJGFzX2VjaG8gIiRETExUT09MIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19ETExUT09MIjsgdGhlbgorICBhY19jdF9ETExUT09MPSRETExUT09MCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZGxsdG9vbDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfRExMVE9PTCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9ETExUT09MIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0RMTFRPT0w9IiRhY19jdF9ETExUT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfRExMVE9PTD0iZGxsdG9vbCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9ETExUT09MPSRhY19jdl9wcm9nX2FjX2N0X0RMTFRPT0wKK2lmIHRlc3QgLW4gIiRhY19jdF9ETExUT09MIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0RMTFRPT0wiID4mNQorJGFzX2VjaG8gIiRhY19jdF9ETExUT09MIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfY3RfRExMVE9PTCIgPSB4OyB0aGVuCisgICAgRExMVE9PTD0iZmFsc2UiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgRExMVE9PTD0kYWNfY3RfRExMVE9PTAorICBmaQorZWxzZQorICBETExUT09MPSIkYWNfY3ZfcHJvZ19ETExUT09MIgorZmkKKworICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1hcyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1hczsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQVMrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQVMiOyB0aGVuCisgIGFjX2N2X3Byb2dfQVM9IiRBUyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX0FTPSIke2FjX3Rvb2xfcHJlZml4fWFzIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0FTPSRhY19jdl9wcm9nX0FTCitpZiB0ZXN0IC1uICIkQVMiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQVMiID4mNQorJGFzX2VjaG8gIiRBUyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVMiOyB0aGVuCisgIGFjX2N0X0FTPSRBUworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImFzIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBhczsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQVMrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfQVMiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfQVM9IiRhY19jdF9BUyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X0FTPSJhcyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9BUz0kYWNfY3ZfcHJvZ19hY19jdF9BUworaWYgdGVzdCAtbiAiJGFjX2N0X0FTIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0FTIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfQVMiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKyAgaWYgdGVzdCAieCRhY19jdF9BUyIgPSB4OyB0aGVuCisgICAgQVM9ImZhbHNlIgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIEFTPSRhY19jdF9BUworICBmaQorZWxzZQorICBBUz0iJGFjX2N2X3Byb2dfQVMiCitmaQorCisgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fW9iamR1bXAiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9b2JqZHVtcDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfT0JKRFVNUCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRPQkpEVU1QIjsgdGhlbgorICBhY19jdl9wcm9nX09CSkRVTVA9IiRPQkpEVU1QIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfT0JKRFVNUD0iJHthY190b29sX3ByZWZpeH1vYmpkdW1wIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK09CSkRVTVA9JGFjX2N2X3Byb2dfT0JKRFVNUAoraWYgdGVzdCAtbiAiJE9CSkRVTVAiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkT0JKRFVNUCIgPiY1CiskYXNfZWNobyAiJE9CSkRVTVAiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX09CSkRVTVAiOyB0aGVuCisgIGFjX2N0X09CSkRVTVA9JE9CSkRVTVAKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJvYmpkdW1wIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBvYmpkdW1wOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9PQkpEVU1QK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X09CSkRVTVAiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfT0JKRFVNUD0iJGFjX2N0X09CSkRVTVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9PQkpEVU1QPSJvYmpkdW1wIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X09CSkRVTVA9JGFjX2N2X3Byb2dfYWNfY3RfT0JKRFVNUAoraWYgdGVzdCAtbiAiJGFjX2N0X09CSkRVTVAiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfT0JKRFVNUCIgPiY1CiskYXNfZWNobyAiJGFjX2N0X09CSkRVTVAiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKyAgaWYgdGVzdCAieCRhY19jdF9PQkpEVU1QIiA9IHg7IHRoZW4KKyAgICBPQkpEVU1QPSJmYWxzZSIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBPQkpEVU1QPSRhY19jdF9PQkpEVU1QCisgIGZpCitlbHNlCisgIE9CSkRVTVA9IiRhY19jdl9wcm9nX09CSkRVTVAiCitmaQorCisgIDs7CisKK2VzYWMKKworbmVlZF9sb2Nrcz0iJGVuYWJsZV9saWJ0b29sX2xvY2siCisKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl9zdGRjK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCitlbHNlCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0cmluZy5oPgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisKK19BQ0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICAkRUdSRVAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgIDoKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWYgKCgnICcgJiAweDBGRikgPT0gMHgwMjApCisjIGRlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCisjIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCisjZWxzZQorIyBkZWZpbmUgSVNMT1dFUihjKSBcCisJCSAgICgoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ2knKSBcCisJCSAgICAgfHwgKCdqJyA8PSAoYykgJiYgKGMpIDw9ICdyJykgXAorCQkgICAgIHx8ICgncycgPD0gKGMpICYmIChjKSA8PSAneicpKQorIyBkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICgoYykgfCAweDQwKSA6IChjKSkKKyNlbmRpZgorCisjZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQoraW50CittYWluICgpCit7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKQorCXx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKQorICAgICAgcmV0dXJuIDI7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKKworZWxzZQorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKKyAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKK2ZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfc3RkYyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2hlYWRlcl9zdGRjIiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIFNURENfSEVBREVSUyAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworIyBPbiBJUklYIDUuMywgc3lzL3R5cGVzIGFuZCBpbnR0eXBlcy5oIGFyZSBjb25mbGljdGluZy4KK2ZvciBhY19oZWFkZXIgaW4gc3lzL3R5cGVzLmggc3lzL3N0YXQuaCBzdGRsaWIuaCBzdHJpbmcuaCBtZW1vcnkuaCBzdHJpbmdzLmggXAorCQkgIGludHR5cGVzLmggc3RkaW50LmggdW5pc3RkLmgKK2RvIDoKKyAgYXNfYWNfSGVhZGVyPWAkYXNfZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAorYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSAiJExJTkVOTyIgIiRhY19oZWFkZXIiICIkYXNfYWNfSGVhZGVyIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyIKK2V2YWwgYXNfdmFsPVwkJGFzX2FjX0hlYWRlcgorICAgaWYgdGVzdCAieCRhc192YWwiID0geCIieWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCisKK2ZvciBhY19oZWFkZXIgaW4gZGxmY24uaAorZG8gOgorICBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAiZGxmY24uaCIgImFjX2N2X2hlYWRlcl9kbGZjbl9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9kbGZjbl9oIiA9IHgiInllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9ETEZDTl9IIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKK2FjX2V4dD1jcHAKK2FjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251CitpZiB0ZXN0IC16ICIkQ1hYIjsgdGhlbgorICBpZiB0ZXN0IC1uICIkQ0NDIjsgdGhlbgorICAgIENYWD0kQ0NDCisgIGVsc2UKKyAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgIGZvciBhY19wcm9nIGluIGcrKyBjKysgZ3BwIGFDQyBDQyBjeHggY2MrKyBjbC5leGUgRkNDIEtDQyBSQ0MgeGxDX3IgeGxDCisgIGRvCisgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2c7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wcm9nX0NYWCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDWFgiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ1hYPSIkQ1hYIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfQ1hYPSIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitDWFg9JGFjX2N2X3Byb2dfQ1hYCitpZiB0ZXN0IC1uICIkQ1hYIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENYWCIgPiY1CiskYXNfZWNobyAiJENYWCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgICAgdGVzdCAtbiAiJENYWCIgJiYgYnJlYWsKKyAgZG9uZQorZmkKK2lmIHRlc3QgLXogIiRDWFgiOyB0aGVuCisgIGFjX2N0X0NYWD0kQ1hYCisgIGZvciBhY19wcm9nIGluIGcrKyBjKysgZ3BwIGFDQyBDQyBjeHggY2MrKyBjbC5leGUgRkNDIEtDQyBSQ0MgeGxDX3IgeGxDCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQ1hYK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0NYWCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9DWFg9IiRhY19jdF9DWFgiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9DWFg9IiRhY19wcm9nIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X0NYWD0kYWNfY3ZfcHJvZ19hY19jdF9DWFgKK2lmIHRlc3QgLW4gIiRhY19jdF9DWFgiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfQ1hYIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfQ1hYIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgdGVzdCAtbiAiJGFjX2N0X0NYWCIgJiYgYnJlYWsKK2RvbmUKKworICBpZiB0ZXN0ICJ4JGFjX2N0X0NYWCIgPSB4OyB0aGVuCisgICAgQ1hYPSJnKysiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgQ1hYPSRhY19jdF9DWFgKKyAgZmkKK2ZpCisKKyAgZmkKK2ZpCisjIFByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIuCiskYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQysrIGNvbXBpbGVyIHZlcnNpb24iID4mNQorc2V0IFggJGFjX2NvbXBpbGUKK2FjX2NvbXBpbGVyPSQyCitmb3IgYWNfb3B0aW9uIGluIC0tdmVyc2lvbiAtdiAtViAtcXZlcnNpb247IGRvCisgIHsgeyBhY190cnk9IiRhY19jb21waWxlciAkYWNfb3B0aW9uID4mNSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGVyICRhY19vcHRpb24gPiY1IikgMj5jb25mdGVzdC5lcnIKKyAgYWNfc3RhdHVzPSQ/CisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgc2VkICcxMGFcCisuLi4gcmVzdCBvZiBzdGRlcnIgb3V0cHV0IGRlbGV0ZWQgLi4uCisgICAgICAgICAxMHEnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIxCisgICAgY2F0IGNvbmZ0ZXN0LmVyMSA+JjUKKyAgICBybSAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCisgIGZpCisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9Citkb25lCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDKysgY29tcGlsZXIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDKysgY29tcGlsZXIuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfY3h4X2NvbXBpbGVyX2dudStzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisjaWZuZGVmIF9fR05VQ19fCisgICAgICAgY2hva2UgbWUKKyNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2N4eF90cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jb21waWxlcl9nbnU9eWVzCitlbHNlCisgIGFjX2NvbXBpbGVyX2dudT1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorYWNfY3ZfY3h4X2NvbXBpbGVyX2dudT0kYWNfY29tcGlsZXJfZ251CisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2N4eF9jb21waWxlcl9nbnUiID4mNQorJGFzX2VjaG8gIiRhY19jdl9jeHhfY29tcGlsZXJfZ251IiA+JjY7IH0KK2lmIHRlc3QgJGFjX2NvbXBpbGVyX2dudSA9IHllczsgdGhlbgorICBHWFg9eWVzCitlbHNlCisgIEdYWD0KK2ZpCithY190ZXN0X0NYWEZMQUdTPSR7Q1hYRkxBR1Mrc2V0fQorYWNfc2F2ZV9DWFhGTEFHUz0kQ1hYRkxBR1MKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAkQ1hYIGFjY2VwdHMgLWciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAkQ1hYIGFjY2VwdHMgLWcuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19jeHhfZytzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX3NhdmVfY3h4X3dlcnJvcl9mbGFnPSRhY19jeHhfd2Vycm9yX2ZsYWcKKyAgIGFjX2N4eF93ZXJyb3JfZmxhZz15ZXMKKyAgIGFjX2N2X3Byb2dfY3h4X2c9bm8KKyAgIENYWEZMQUdTPSItZyIKKyAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY3h4X3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3Byb2dfY3h4X2c9eWVzCitlbHNlCisgIENYWEZMQUdTPSIiCisgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2N4eF90cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorCitlbHNlCisgIGFjX2N4eF93ZXJyb3JfZmxhZz0kYWNfc2F2ZV9jeHhfd2Vycm9yX2ZsYWcKKwkgQ1hYRkxBR1M9Ii1nIgorCSBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2N4eF90cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9wcm9nX2N4eF9nPXllcworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICAgYWNfY3h4X3dlcnJvcl9mbGFnPSRhY19zYXZlX2N4eF93ZXJyb3JfZmxhZworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcHJvZ19jeHhfZyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3Byb2dfY3h4X2ciID4mNjsgfQoraWYgdGVzdCAiJGFjX3Rlc3RfQ1hYRkxBR1MiID0gc2V0OyB0aGVuCisgIENYWEZMQUdTPSRhY19zYXZlX0NYWEZMQUdTCitlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY3h4X2cgPSB5ZXM7IHRoZW4KKyAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICBDWFhGTEFHUz0iLWcgLU8yIgorICBlbHNlCisgICAgQ1hYRkxBR1M9Ii1nIgorICBmaQorZWxzZQorICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgIENYWEZMQUdTPSItTzIiCisgIGVsc2UKKyAgICBDWFhGTEFHUz0KKyAgZmkKK2ZpCithY19leHQ9Y3BwCithY19jcHA9JyRDWFhDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENYWCAtbyBjb25mdGVzdCRhY19leGVleHQgJENYWEZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY3h4X2NvbXBpbGVyX2dudQorCitkZXBjYz0iJENYWCIgIGFtX2NvbXBpbGVyX2xpc3Q9CisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZGVwZW5kZW5jeSBzdHlsZSBvZiAkZGVwY2MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZGVwZW5kZW5jeSBzdHlsZSBvZiAkZGVwY2MuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YW1fY3ZfQ1hYX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAteiAiJEFNREVQX1RSVUUiICYmIHRlc3QgLWYgIiRhbV9kZXBjb21wIjsgdGhlbgorICAjIFdlIG1ha2UgYSBzdWJkaXIgYW5kIGRvIHRoZSB0ZXN0cyB0aGVyZS4gIE90aGVyd2lzZSB3ZSBjYW4gZW5kIHVwCisgICMgbWFraW5nIGJvZ3VzIGZpbGVzIHRoYXQgd2UgZG9uJ3Qga25vdyBhYm91dCBhbmQgbmV2ZXIgcmVtb3ZlLiAgRm9yCisgICMgaW5zdGFuY2UgaXQgd2FzIHJlcG9ydGVkIHRoYXQgb24gSFAtVVggdGhlIGdjYyB0ZXN0IHdpbGwgZW5kIHVwCisgICMgbWFraW5nIGEgZHVtbXkgZmlsZSBuYW1lZCBgRCcgLS0gYmVjYXVzZSBgLU1EJyBtZWFucyBgcHV0IHRoZSBvdXRwdXQKKyAgIyBpbiBEJy4KKyAgbWtkaXIgY29uZnRlc3QuZGlyCisgICMgQ29weSBkZXBjb21wIHRvIHN1YmRpciBiZWNhdXNlIG90aGVyd2lzZSB3ZSB3b24ndCBmaW5kIGl0IGlmIHdlJ3JlCisgICMgdXNpbmcgYSByZWxhdGl2ZSBkaXJlY3RvcnkuCisgIGNwICIkYW1fZGVwY29tcCIgY29uZnRlc3QuZGlyCisgIGNkIGNvbmZ0ZXN0LmRpcgorICAjIFdlIHdpbGwgYnVpbGQgb2JqZWN0cyBhbmQgZGVwZW5kZW5jaWVzIGluIGEgc3ViZGlyZWN0b3J5IGJlY2F1c2UKKyAgIyBpdCBoZWxwcyB0byBkZXRlY3QgaW5hcHBsaWNhYmxlIGRlcGVuZGVuY3kgbW9kZXMuICBGb3IgaW5zdGFuY2UKKyAgIyBib3RoIFRydTY0J3MgY2MgYW5kIElDQyBzdXBwb3J0IC1NRCB0byBvdXRwdXQgZGVwZW5kZW5jaWVzIGFzIGEKKyAgIyBzaWRlIGVmZmVjdCBvZiBjb21waWxhdGlvbiwgYnV0IElDQyB3aWxsIHB1dCB0aGUgZGVwZW5kZW5jaWVzIGluCisgICMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdoaWxlIFRydTY0IHdpbGwgcHV0IHRoZW0gaW4gdGhlIG9iamVjdAorICAjIGRpcmVjdG9yeS4KKyAgbWtkaXIgc3ViCisKKyAgYW1fY3ZfQ1hYX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKKyAgaWYgdGVzdCAiJGFtX2NvbXBpbGVyX2xpc3QiID0gIiI7IHRoZW4KKyAgICAgYW1fY29tcGlsZXJfbGlzdD1gc2VkIC1uICdzL14jKlwoW2EtekEtWjAtOV0qXCkpJC9cMS9wJyA8IC4vZGVwY29tcGAKKyAgZmkKKyAgZm9yIGRlcG1vZGUgaW4gJGFtX2NvbXBpbGVyX2xpc3Q7IGRvCisgICAgIyBTZXR1cCBhIHNvdXJjZSB3aXRoIG1hbnkgZGVwZW5kZW5jaWVzLCBiZWNhdXNlIHNvbWUgY29tcGlsZXJzCisgICAgIyBsaWtlIHRvIHdyYXAgbGFyZ2UgZGVwZW5kZW5jeSBsaXN0cyBvbiBjb2x1bW4gODAgKHdpdGggXCksIGFuZAorICAgICMgd2Ugc2hvdWxkIG5vdCBjaG9vc2UgYSBkZXBjb21wIG1vZGUgd2hpY2ggaXMgY29uZnVzZWQgYnkgdGhpcy4KKyAgICAjCisgICAgIyBXZSBuZWVkIHRvIHJlY3JlYXRlIHRoZXNlIGZpbGVzIGZvciBlYWNoIHRlc3QsIGFzIHRoZSBjb21waWxlciBtYXkKKyAgICAjIG92ZXJ3cml0ZSBzb21lIG9mIHRoZW0gd2hlbiB0ZXN0aW5nIHdpdGggb2JzY3VyZSBjb21tYW5kIGxpbmVzLgorICAgICMgVGhpcyBoYXBwZW5zIGF0IGxlYXN0IHdpdGggdGhlIEFJWCBDIGNvbXBpbGVyLgorICAgIDogPiBzdWIvY29uZnRlc3QuYworICAgIGZvciBpIGluIDEgMiAzIDQgNSA2OyBkbworICAgICAgZWNobyAnI2luY2x1ZGUgImNvbmZ0c3QnJGknLmgiJyA+PiBzdWIvY29uZnRlc3QuYworICAgICAgIyBVc2luZyBgOiA+IHN1Yi9jb25mdHN0JGkuaCcgY3JlYXRlcyBvbmx5IHN1Yi9jb25mdHN0MS5oIHdpdGgKKyAgICAgICMgU29sYXJpcyA4J3Mgey91c3IsfS9iaW4vc2guCisgICAgICB0b3VjaCBzdWIvY29uZnRzdCRpLmgKKyAgICBkb25lCisgICAgZWNobyAiJHthbV9faW5jbHVkZX0gJHthbV9fcXVvdGV9c3ViL2NvbmZ0ZXN0LlBvJHthbV9fcXVvdGV9IiA+IGNvbmZtZgorCisgICAgY2FzZSAkZGVwbW9kZSBpbgorICAgIG5vc2lkZWVmZmVjdCkKKyAgICAgICMgYWZ0ZXIgdGhpcyB0YWcsIG1lY2hhbmlzbXMgYXJlIG5vdCBieSBzaWRlLWVmZmVjdCwgc28gdGhleSdsbAorICAgICAgIyBvbmx5IGJlIHVzZWQgd2hlbiBleHBsaWNpdGx5IHJlcXVlc3RlZAorICAgICAgaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgPSB4eWVzOyB0aGVuCisJY29udGludWUKKyAgICAgIGVsc2UKKwlicmVhaworICAgICAgZmkKKyAgICAgIDs7CisgICAgbm9uZSkgYnJlYWsgOzsKKyAgICBlc2FjCisgICAgIyBXZSBjaGVjayB3aXRoIGAtYycgYW5kIGAtbycgZm9yIHRoZSBzYWtlIG9mIHRoZSAiZGFzaG1zdGRvdXQiCisgICAgIyBtb2RlLiAgSXQgdHVybnMgb3V0IHRoYXQgdGhlIFN1blBybyBDKysgY29tcGlsZXIgZG9lcyBub3QgcHJvcGVybHkKKyAgICAjIGhhbmRsZSBgLU0gLW8nLCBhbmQgd2UgbmVlZCB0byBkZXRlY3QgdGhpcy4KKyAgICBpZiBkZXBtb2RlPSRkZXBtb2RlIFwKKyAgICAgICBzb3VyY2U9c3ViL2NvbmZ0ZXN0LmMgb2JqZWN0PXN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfSBcCisgICAgICAgZGVwZmlsZT1zdWIvY29uZnRlc3QuUG8gdG1wZGVwZmlsZT1zdWIvY29uZnRlc3QuVFBvIFwKKyAgICAgICAkU0hFTEwgLi9kZXBjb21wICRkZXBjYyAtYyAtbyBzdWIvY29uZnRlc3QuJHtPQkpFWFQtb30gc3ViL2NvbmZ0ZXN0LmMgXAorICAgICAgICAgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0LmVyciAmJgorICAgICAgIGdyZXAgc3ViL2NvbmZ0c3QxLmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKKyAgICAgICBncmVwIHN1Yi9jb25mdHN0Ni5oIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCisgICAgICAgZ3JlcCBzdWIvY29uZnRlc3QuJHtPQkpFWFQtb30gc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKKyAgICAgICAke01BS0UtbWFrZX0gLXMgLWYgY29uZm1mID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgICMgaWNjIGRvZXNuJ3QgY2hva2Ugb24gdW5rbm93biBvcHRpb25zLCBpdCB3aWxsIGp1c3QgaXNzdWUgd2FybmluZ3MKKyAgICAgICMgb3IgcmVtYXJrcyAoZXZlbiB3aXRoIC1XZXJyb3IpLiAgU28gd2UgZ3JlcCBzdGRlcnIgZm9yIGFueSBtZXNzYWdlCisgICAgICAjIHRoYXQgc2F5cyBhbiBvcHRpb24gd2FzIGlnbm9yZWQgb3Igbm90IHN1cHBvcnRlZC4KKyAgICAgICMgV2hlbiBnaXZlbiAtTVAsIGljYyA3LjAgYW5kIDcuMSBjb21wbGFpbiB0aHVzbHk6CisgICAgICAjICAgaWNjOiBDb21tYW5kIGxpbmUgd2FybmluZzogaWdub3Jpbmcgb3B0aW9uICctTSc7IG5vIGFyZ3VtZW50IHJlcXVpcmVkCisgICAgICAjIFRoZSBkaWFnbm9zaXMgY2hhbmdlZCBpbiBpY2MgOC4wOgorICAgICAgIyAgIGljYzogQ29tbWFuZCBsaW5lIHJlbWFyazogb3B0aW9uICctTVAnIG5vdCBzdXBwb3J0ZWQKKyAgICAgIGlmIChncmVwICdpZ25vcmluZyBvcHRpb24nIGNvbmZ0ZXN0LmVyciB8fAorICAgICAgICAgIGdyZXAgJ25vdCBzdXBwb3J0ZWQnIGNvbmZ0ZXN0LmVycikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDo7IGVsc2UKKyAgICAgICAgYW1fY3ZfQ1hYX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPSRkZXBtb2RlCisgICAgICAgIGJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKworICBjZCAuLgorICBybSAtcmYgY29uZnRlc3QuZGlyCitlbHNlCisgIGFtX2N2X0NYWF9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhbV9jdl9DWFhfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID4mNQorJGFzX2VjaG8gIiRhbV9jdl9DWFhfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID4mNjsgfQorQ1hYREVQTU9ERT1kZXBtb2RlPSRhbV9jdl9DWFhfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUKKworIGlmCisgIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubyBcCisgICYmIHRlc3QgIiRhbV9jdl9DWFhfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID0gZ2NjMzsgdGhlbgorICBhbV9fZmFzdGRlcENYWF9UUlVFPQorICBhbV9fZmFzdGRlcENYWF9GQUxTRT0nIycKK2Vsc2UKKyAgYW1fX2Zhc3RkZXBDWFhfVFJVRT0nIycKKyAgYW1fX2Zhc3RkZXBDWFhfRkFMU0U9CitmaQorCisKK2FjX2V4dD1jcHAKK2FjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMrKyBwcmVwcm9jZXNzb3IiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQysrIHByZXByb2Nlc3Nvci4uLiAiID4mNjsgfQoraWYgdGVzdCAteiAiJENYWENQUCI7IHRoZW4KKyAgaWYgdGVzdCAiJHthY19jdl9wcm9nX0NYWENQUCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgICAgICAjIERvdWJsZSBxdW90ZXMgYmVjYXVzZSBDWFhDUFAgbmVlZHMgdG8gYmUgZXhwYW5kZWQKKyAgICBmb3IgQ1hYQ1BQIGluICIkQ1hYIC1FIiAiL2xpYi9jcHAiCisgICAgZG8KKyAgICAgIGFjX3ByZXByb2Nfb2s9ZmFsc2UKK2ZvciBhY19jeHhfcHJlcHJvY193YXJuX2ZsYWcgaW4gJycgeWVzCitkbworICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCisgICMgd2l0aCBhIGZyZXNoIGNyb3NzLWNvbXBpbGVyIHdvcmtzLgorICAjIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCisgICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCisgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuICJTeW50YXggZXJyb3IiIGlzIGhlcmUgdG8gY2F0Y2ggdGhpcyBjYXNlLgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCQkgICAgIFN5bnRheCBlcnJvcgorX0FDRU9GCitpZiBhY19mbl9jeHhfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgorCitlbHNlCisgICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KK2NvbnRpbnVlCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKworICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uZXhpc3RlbnQgaGVhZGVycworICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KK19BQ0VPRgoraWYgYWNfZm5fY3h4X3RyeV9jcHAgIiRMSU5FTk8iOyB0aGVuIDoKKyAgIyBCcm9rZW46IHN1Y2Nlc3Mgb24gaW52YWxpZCBpbnB1dC4KK2NvbnRpbnVlCitlbHNlCisgICMgUGFzc2VzIGJvdGggdGVzdHMuCithY19wcmVwcm9jX29rPToKK2JyZWFrCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKworZG9uZQorIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAoraWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4gOgorICBicmVhaworZmkKKworICAgIGRvbmUKKyAgICBhY19jdl9wcm9nX0NYWENQUD0kQ1hYQ1BQCisKK2ZpCisgIENYWENQUD0kYWNfY3ZfcHJvZ19DWFhDUFAKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19DWFhDUFA9JENYWENQUAorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ1hYQ1BQIiA+JjUKKyRhc19lY2hvICIkQ1hYQ1BQIiA+JjY7IH0KK2FjX3ByZXByb2Nfb2s9ZmFsc2UKK2ZvciBhY19jeHhfcHJlcHJvY193YXJuX2ZsYWcgaW4gJycgeWVzCitkbworICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCisgICMgd2l0aCBhIGZyZXNoIGNyb3NzLWNvbXBpbGVyIHdvcmtzLgorICAjIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCisgICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCisgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuICJTeW50YXggZXJyb3IiIGlzIGhlcmUgdG8gY2F0Y2ggdGhpcyBjYXNlLgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCQkgICAgIFN5bnRheCBlcnJvcgorX0FDRU9GCitpZiBhY19mbl9jeHhfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgorCitlbHNlCisgICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KK2NvbnRpbnVlCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKworICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uZXhpc3RlbnQgaGVhZGVycworICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KK19BQ0VPRgoraWYgYWNfZm5fY3h4X3RyeV9jcHAgIiRMSU5FTk8iOyB0aGVuIDoKKyAgIyBCcm9rZW46IHN1Y2Nlc3Mgb24gaW52YWxpZCBpbnB1dC4KK2NvbnRpbnVlCitlbHNlCisgICMgUGFzc2VzIGJvdGggdGVzdHMuCithY19wcmVwcm9jX29rPToKK2JyZWFrCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKworZG9uZQorIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAoraWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4gOgorCitlbHNlCisgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgIkMrKyBwcmVwcm9jZXNzb3IgXCIkQ1hYQ1BQXCIgZmFpbHMgc2FuaXR5IGNoZWNrCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgIiRMSU5FTk8iIDU7IH0KK2ZpCisKK2FjX2V4dD1jcHAKK2FjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251CisKKworYWNfZXh0PWYKK2FjX2NvbXBpbGU9JyRGNzcgLWMgJEZGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRGNzcgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRGRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2Y3N19jb21waWxlcl9nbnUKK2lmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgZm9yIGFjX3Byb2cgaW4gZzc3IHhsZiBmNzcgZnJ0IHBnZjc3IGNmNzcgZm9ydDc3IGZsMzIgYWY3NyB4bGY5MCBmOTAgcGdmOTAgcGdocGYgZXBjZjkwIGdmb3J0cmFuIGc5NSB4bGY5NSBmOTUgZm9ydCBpZm9ydCBpZmMgZWZjIHBnZjk1IGxmOTUgZnRuCisgIGRvCisgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2c7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wcm9nX0Y3NytzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRGNzciOyB0aGVuCisgIGFjX2N2X3Byb2dfRjc3PSIkRjc3IiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfRjc3PSIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitGNzc9JGFjX2N2X3Byb2dfRjc3CitpZiB0ZXN0IC1uICIkRjc3IjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEY3NyIgPiY1CiskYXNfZWNobyAiJEY3NyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgICAgdGVzdCAtbiAiJEY3NyIgJiYgYnJlYWsKKyAgZG9uZQorZmkKK2lmIHRlc3QgLXogIiRGNzciOyB0aGVuCisgIGFjX2N0X0Y3Nz0kRjc3CisgIGZvciBhY19wcm9nIGluIGc3NyB4bGYgZjc3IGZydCBwZ2Y3NyBjZjc3IGZvcnQ3NyBmbDMyIGFmNzcgeGxmOTAgZjkwIHBnZjkwIHBnaHBmIGVwY2Y5MCBnZm9ydHJhbiBnOTUgeGxmOTUgZjk1IGZvcnQgaWZvcnQgaWZjIGVmYyBwZ2Y5NSBsZjk1IGZ0bgorZG8KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X0Y3NytzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9GNzciOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfRjc3PSIkYWNfY3RfRjc3IiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfRjc3PSIkYWNfcHJvZyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9GNzc9JGFjX2N2X3Byb2dfYWNfY3RfRjc3CitpZiB0ZXN0IC1uICIkYWNfY3RfRjc3IjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0Y3NyIgPiY1CiskYXNfZWNobyAiJGFjX2N0X0Y3NyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgIHRlc3QgLW4gIiRhY19jdF9GNzciICYmIGJyZWFrCitkb25lCisKKyAgaWYgdGVzdCAieCRhY19jdF9GNzciID0geDsgdGhlbgorICAgIEY3Nz0iIgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIEY3Nz0kYWNfY3RfRjc3CisgIGZpCitmaQorCisKKyMgUHJvdmlkZSBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21waWxlci4KKyRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBGb3J0cmFuIDc3IGNvbXBpbGVyIHZlcnNpb24iID4mNQorc2V0IFggJGFjX2NvbXBpbGUKK2FjX2NvbXBpbGVyPSQyCitmb3IgYWNfb3B0aW9uIGluIC0tdmVyc2lvbiAtdiAtViAtcXZlcnNpb247IGRvCisgIHsgeyBhY190cnk9IiRhY19jb21waWxlciAkYWNfb3B0aW9uID4mNSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGVyICRhY19vcHRpb24gPiY1IikgMj5jb25mdGVzdC5lcnIKKyAgYWNfc3RhdHVzPSQ/CisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgc2VkICcxMGFcCisuLi4gcmVzdCBvZiBzdGRlcnIgb3V0cHV0IGRlbGV0ZWQgLi4uCisgICAgICAgICAxMHEnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIxCisgICAgY2F0IGNvbmZ0ZXN0LmVyMSA+JjUKKyAgICBybSAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCisgIGZpCisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9Citkb25lCitybSAtZiBhLm91dAorCisjIElmIHdlIGRvbid0IHVzZSBgLkYnIGFzIGV4dGVuc2lvbiwgdGhlIHByZXByb2Nlc3NvciBpcyBub3QgcnVuIG9uIHRoZQorIyBpbnB1dCBmaWxlLiAgKE5vdGUgdGhhdCB0aGlzIG9ubHkgbmVlZHMgdG8gd29yayBmb3IgR05VIGNvbXBpbGVycy4pCithY19zYXZlX2V4dD0kYWNfZXh0CithY19leHQ9RgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEZvcnRyYW4gNzcgY29tcGlsZXIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBGb3J0cmFuIDc3IGNvbXBpbGVyLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2Y3N19jb21waWxlcl9nbnUrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisgICAgICBwcm9ncmFtIG1haW4KKyNpZm5kZWYgX19HTlVDX18KKyAgICAgICBjaG9rZSBtZQorI2VuZGlmCisKKyAgICAgIGVuZAorX0FDRU9GCitpZiBhY19mbl9mNzdfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY29tcGlsZXJfZ251PXllcworZWxzZQorICBhY19jb21waWxlcl9nbnU9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2FjX2N2X2Y3N19jb21waWxlcl9nbnU9JGFjX2NvbXBpbGVyX2dudQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9mNzdfY29tcGlsZXJfZ251IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfZjc3X2NvbXBpbGVyX2dudSIgPiY2OyB9CithY19leHQ9JGFjX3NhdmVfZXh0CithY190ZXN0X0ZGTEFHUz0ke0ZGTEFHUytzZXR9CithY19zYXZlX0ZGTEFHUz0kRkZMQUdTCitGRkxBR1M9Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJEY3NyBhY2NlcHRzIC1nIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJEY3NyBhY2NlcHRzIC1nLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfZjc3X2crc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBGRkxBR1M9LWcKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKyAgICAgIHByb2dyYW0gbWFpbgorCisgICAgICBlbmQKK19BQ0VPRgoraWYgYWNfZm5fZjc3X3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3Byb2dfZjc3X2c9eWVzCitlbHNlCisgIGFjX2N2X3Byb2dfZjc3X2c9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcHJvZ19mNzdfZyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3Byb2dfZjc3X2ciID4mNjsgfQoraWYgdGVzdCAiJGFjX3Rlc3RfRkZMQUdTIiA9IHNldDsgdGhlbgorICBGRkxBR1M9JGFjX3NhdmVfRkZMQUdTCitlbGlmIHRlc3QgJGFjX2N2X3Byb2dfZjc3X2cgPSB5ZXM7IHRoZW4KKyAgaWYgdGVzdCAieCRhY19jdl9mNzdfY29tcGlsZXJfZ251IiA9IHh5ZXM7IHRoZW4KKyAgICBGRkxBR1M9Ii1nIC1PMiIKKyAgZWxzZQorICAgIEZGTEFHUz0iLWciCisgIGZpCitlbHNlCisgIGlmIHRlc3QgIngkYWNfY3ZfZjc3X2NvbXBpbGVyX2dudSIgPSB4eWVzOyB0aGVuCisgICAgRkZMQUdTPSItTzIiCisgIGVsc2UKKyAgICBGRkxBR1M9CisgIGZpCitmaQorCitpZiB0ZXN0ICRhY19jb21waWxlcl9nbnUgPSB5ZXM7IHRoZW4KKyAgRzc3PXllcworZWxzZQorICBHNzc9CitmaQorYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCisKKworIyBBdXRvY29uZiAyLjEzJ3MgQUNfT0JKRVhUIGFuZCBBQ19FWEVFWFQgbWFjcm9zIG9ubHkgd29ya3MgZm9yIEMgY29tcGlsZXJzIQorCisjIGZpbmQgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7bHRfY3Zfc3lzX21heF9jbWRfbGVuK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgICBpPTAKKyAgdGVzdHN0cmluZz0iQUJDRCIKKworICBjYXNlICRidWlsZF9vcyBpbgorICBtc2Rvc2RqZ3BwKikKKyAgICAjIE9uIERKR1BQLCB0aGlzIHRlc3QgY2FuIGJsb3cgdXAgcHJldHR5IGJhZGx5IGR1ZSB0byBwcm9ibGVtcyBpbiBsaWJjCisgICAgIyAoYW55IHNpbmdsZSBhcmd1bWVudCBleGNlZWRpbmcgMjAwMCBieXRlcyBjYXVzZXMgYSBidWZmZXIgb3ZlcnJ1bgorICAgICMgZHVyaW5nIGdsb2IgZXhwYW5zaW9uKS4gIEV2ZW4gaWYgaXQgd2VyZSBmaXhlZCwgdGhlIHJlc3VsdCBvZiB0aGlzCisgICAgIyBjaGVjayB3b3VsZCBiZSBsYXJnZXIgdGhhbiBpdCBzaG91bGQgYmUuCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTEyMjg4OyAgICAjIDEySyBpcyBhYm91dCByaWdodAorICAgIDs7CisKKyAgZ251KikKKyAgICAjIFVuZGVyIEdOVSBIdXJkLCB0aGlzIHRlc3QgaXMgbm90IHJlcXVpcmVkIGJlY2F1c2UgdGhlcmUgaXMKKyAgICAjIG5vIGxpbWl0IHRvIHRoZSBsZW5ndGggb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KKyAgICAjIExpYnRvb2wgd2lsbCBpbnRlcnByZXQgLTEgYXMgbm8gbGltaXQgd2hhdHNvZXZlcgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0tMTsKKyAgICA7OworCisgIGN5Z3dpbiogfCBtaW5ndyopCisgICAgIyBPbiBXaW45eC9NRSwgdGhpcyB0ZXN0IGJsb3dzIHVwIC0tIGl0IHN1Y2NlZWRzLCBidXQgdGFrZXMKKyAgICAjIGFib3V0IDUgbWludXRlcyBhcyB0aGUgdGVzdHN0cmluZyBncm93cyBleHBvbmVudGlhbGx5LgorICAgICMgV29yc2UsIHNpbmNlIDl4L01FIGFyZSBub3QgcHJlLWVtcHRpdmVseSBtdWx0aXRhc2tpbmcsCisgICAgIyB5b3UgZW5kIHVwIHdpdGggYSAiZnJvemVuIiBjb21wdXRlciwgZXZlbiB0aG91Z2ggd2l0aCBwYXRpZW5jZQorICAgICMgdGhlIHRlc3QgZXZlbnR1YWxseSBzdWNjZWVkcyAod2l0aCBhIG1heCBsaW5lIGxlbmd0aCBvZiAyNTZrKS4KKyAgICAjIEluc3RlYWQsIGxldCdzIGp1c3QgcHVudDogdXNlIHRoZSBtaW5pbXVtIGxpbmVsZW5ndGggcmVwb3J0ZWQgYnkKKyAgICAjIGFsbCBvZiB0aGUgc3VwcG9ydGVkIHBsYXRmb3JtczogODE5MiAob24gTlQvMksvWFApLgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj04MTkyOworICAgIDs7CisKKyAgYW1pZ2FvcyopCisgICAgIyBPbiBBbWlnYU9TIHdpdGggcGRrc2gsIHRoaXMgdGVzdCB0YWtlcyBob3VycywgbGl0ZXJhbGx5LgorICAgICMgU28gd2UganVzdCBwdW50IGFuZCB1c2UgYSBtaW5pbXVtIGxpbmUgbGVuZ3RoIG9mIDgxOTIuCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTgxOTI7CisgICAgOzsKKworICopCisgICAgIyBJZiB0ZXN0IGlzIG5vdCBhIHNoZWxsIGJ1aWx0LWluLCB3ZSdsbCBwcm9iYWJseSBlbmQgdXAgY29tcHV0aW5nIGEKKyAgICAjIG1heGltdW0gbGVuZ3RoIHRoYXQgaXMgb25seSBoYWxmIG9mIHRoZSBhY3R1YWwgbWF4aW11bSBsZW5ndGgsIGJ1dAorICAgICMgd2UgY2FuJ3QgdGVsbC4KKyAgICB3aGlsZSAodGVzdCAiWCJgJENPTkZJR19TSEVMTCAkMCAtLWZhbGxiYWNrLWVjaG8gIlgkdGVzdHN0cmluZyIgMj4vZGV2L251bGxgIFwKKwkgICAgICAgPSAiWFgkdGVzdHN0cmluZyIpID4vZGV2L251bGwgMj4mMSAmJgorCSAgICBuZXdfcmVzdWx0PWBleHByICJYJHRlc3RzdHJpbmciIDogIi4qIiAyPiYxYCAmJgorCSAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49JG5ld19yZXN1bHQgJiYKKwkgICAgdGVzdCAkaSAhPSAxNyAjIDEvMiBNQiBzaG91bGQgYmUgZW5vdWdoCisgICAgZG8KKyAgICAgIGk9YGV4cHIgJGkgKyAxYAorICAgICAgdGVzdHN0cmluZz0kdGVzdHN0cmluZyR0ZXN0c3RyaW5nCisgICAgZG9uZQorICAgIHRlc3RzdHJpbmc9CisgICAgIyBBZGQgYSBzaWduaWZpY2FudCBzYWZldHkgZmFjdG9yIGJlY2F1c2UgQysrIGNvbXBpbGVycyBjYW4gdGFjayBvbiBtYXNzaXZlCisgICAgIyBhbW91bnRzIG9mIGFkZGl0aW9uYWwgYXJndW1lbnRzIGJlZm9yZSBwYXNzaW5nIHRoZW0gdG8gdGhlIGxpbmtlci4KKyAgICAjIEl0IGFwcGVhcnMgYXMgdGhvdWdoIDEvMiBpcyBhIHVzYWJsZSB2YWx1ZS4KKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcLyAyYAorICAgIDs7CisgIGVzYWMKKworZmkKKworaWYgdGVzdCAtbiAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIDsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3N5c19tYXhfY21kX2xlbiIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3N5c19tYXhfY21kX2xlbiIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBub25lIiA+JjUKKyRhc19lY2hvICJub25lIiA+JjY7IH0KK2ZpCisKKworCisKKyMgQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkIGJ5IEMgc3ltYm9sIGZyb20gbm0uCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGNvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dCBmcm9tICRjb21waWxlciBvYmplY3QiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0IGZyb20gJGNvbXBpbGVyIG9iamVjdC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHtsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworIyBUaGVzZSBhcmUgc2FuZSBkZWZhdWx0cyB0aGF0IHdvcmsgb24gYXQgbGVhc3QgYSBmZXcgb2xkIHN5c3RlbXMuCisjIFtUaGV5IGNvbWUgZnJvbSBVbHRyaXguICBXaGF0IGNvdWxkIGJlIG9sZGVyIHRoYW4gVWx0cml4PyEhIDspXQorCisjIENoYXJhY3RlciBjbGFzcyBkZXNjcmliaW5nIE5NIGdsb2JhbCBzeW1ib2wgY29kZXMuCitzeW1jb2RlPSdbQkNERUdSU1RdJworCisjIFJlZ2V4cCB0byBtYXRjaCBzeW1ib2xzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gQy4KK3N5bXBhdD0nXChbX0EtWmEtel1bX0EtWmEtejAtOV0qXCknCisKKyMgVHJhbnNmb3JtIHRoZSBhYm92ZSBpbnRvIGEgcmF3IHN5bWJvbCBhbmQgYSBDIHN5bWJvbC4KK3N5bXhmcm09J1wxIFwyXDMgXDMnCisKKyMgVHJhbnNmb3JtIGFuIGV4dHJhY3RlZCBzeW1ib2wgbGluZSBpbnRvIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gaW50IFwxOy9wJyIKKworIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gc3ltYm9sIG5hbWUgYW5kIHN5bWJvbCBhZGRyZXNzCitsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0ic2VkIC1uIC1lICdzL146IFwoW14gXSpcKSAkLyAge1xcXCJcMVxcXCIsIChsdF9wdHIpIDB9LC9wJyAtZSAncy9eJHN5bWNvZGUgXChbXiBdKlwpIFwoW14gXSpcKSQvICB7XCJcMlwiLCAobHRfcHRyKSBcJlwyfSwvcCciCisKKyMgRGVmaW5lIHN5c3RlbS1zcGVjaWZpYyB2YXJpYWJsZXMuCitjYXNlICRob3N0X29zIGluCithaXgqKQorICBzeW1jb2RlPSdbQkNEVF0nCisgIDs7CitjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisgIHN5bWNvZGU9J1tBQkNER0lTVFddJworICA7OworaHB1eCopICMgSXRzIGxpbmtlciBkaXN0aW5ndWlzaGVzIGRhdGEgZnJvbSBjb2RlIHN5bWJvbHMKKyAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKyAgICBzeW1jb2RlPSdbQUJDREVHUlNUXScKKyAgZmkKKyAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eVCAuKiBcKC4qXCkkL2V4dGVybiBpbnQgXDEoKTsvcCcgLWUgJ3MvXiRzeW1jb2RlKiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKKyAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9InNlZCAtbiAtZSAncy9eOiBcKFteIF0qXCkgJC8gIHtcXFwiXDFcXFwiLCAobHRfcHRyKSAwfSwvcCcgLWUgJ3MvXiRzeW1jb2RlKiBcKFteIF0qXCkgXChbXiBdKlwpJC8gIHtcIlwyXCIsIChsdF9wdHIpIFwmXDJ9LC9wJyIKKyAgOzsKK2lyaXgqIHwgbm9uc3RvcHV4KikKKyAgc3ltY29kZT0nW0JDREVHUlNUXScKKyAgOzsKK29zZiopCisgIHN5bWNvZGU9J1tCQ0RFR1FSU1RdJworICA7Oworc29sYXJpcyogfCBzeXN2NSopCisgIHN5bWNvZGU9J1tCRFJUXScKKyAgOzsKK3N5c3Y0KQorICBzeW1jb2RlPSdbREZOU1RVXScKKyAgOzsKK2VzYWMKKworIyBIYW5kbGUgQ1JMRiBpbiBtaW5ndyB0b29sIGNoYWluCitvcHRfY3I9CitjYXNlICRidWlsZF9vcyBpbgorbWluZ3cqKQorICBvcHRfY3I9YGVjaG8gJ3hcezAsMVx9JyB8IHRyIHggJ1wwMTUnYCAjIG9wdGlvbiBjciBpbiByZWdleHAKKyAgOzsKK2VzYWMKKworIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gdXNlIGl0cyBzdGFuZGFyZCBzeW1ib2wgY29kZXMuCitjYXNlIGAkTk0gLVYgMj4mMWAgaW4KKypHTlUqIHwgKid3aXRoIEJGRCcqKQorICBzeW1jb2RlPSdbQUJDREdJUlNUV10nIDs7Citlc2FjCisKKyMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJjb3JlLCB0aGVuIHdpdGggaXQuCitmb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCisKKyAgIyBXcml0ZSB0aGUgcmF3IGFuZCBDIGlkZW50aWZpZXJzLgorICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSJzZWQgLW4gLWUgJ3MvXi4qWyAJXVwoJHN5bWNvZGUkc3ltY29kZSpcKVsgCV1bIAldKlwoJGFjX3N5bXByZnhcKSRzeW1wYXQkb3B0X2NyJC8kc3lteGZybS9wJyIKKworICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBwaXBlIHdvcmtzIGNvcnJlY3RseS4KKyAgcGlwZV93b3Jrcz1ubworCisgIHJtIC1mIGNvbmZ0ZXN0KgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCitjaGFyIG5tX3Rlc3RfdmFyOwordm9pZCBubV90ZXN0X2Z1bmMoKXt9CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgoraW50IG1haW4oKXtubV90ZXN0X3Zhcj0nYSc7bm1fdGVzdF9mdW5jKCk7cmV0dXJuKDApO30KK0VPRgorCisgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19jb21waWxlXCIiOyB9ID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4KKyAgICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KKyAgICBubGlzdD1jb25mdGVzdC5ubQorICAgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRubGlzdFwiIjsgfSA+JjUKKyAgKGV2YWwgJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJG5saXN0KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB0ZXN0IC1zICIkbmxpc3QiOyB0aGVuCisgICAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgorICAgICAgaWYgc29ydCAiJG5saXN0IiB8IHVuaXEgPiAiJG5saXN0IlQ7IHRoZW4KKwltdiAtZiAiJG5saXN0IlQgIiRubGlzdCIKKyAgICAgIGVsc2UKKwlybSAtZiAiJG5saXN0IlQKKyAgICAgIGZpCisKKyAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2Ugc25hZ2dlZCBhbGwgdGhlIHN5bWJvbHMgd2UgbmVlZC4KKyAgICAgIGlmIGdyZXAgJyBubV90ZXN0X3ZhciQnICIkbmxpc3QiID4vZGV2L251bGw7IHRoZW4KKwlpZiBncmVwICcgbm1fdGVzdF9mdW5jJCcgIiRubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgorCSAgY2F0IDw8RU9GID4gY29uZnRlc3QuJGFjX2V4dAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitFT0YKKwkgICMgTm93IGdlbmVyYXRlIHRoZSBzeW1ib2wgZmlsZS4KKwkgIGV2YWwgIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCInIDwgIiRubGlzdCIgfCBncmVwIC12IG1haW4gPj4gY29uZnRlc3QuJGFjX2V4dCcKKworCSAgY2F0IDw8RU9GID4+IGNvbmZ0ZXN0LiRhY19leHQKKyNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KKyMgZGVmaW5lIGx0X3B0cl90IHZvaWQgKgorI2Vsc2UKKyMgZGVmaW5lIGx0X3B0cl90IGNoYXIgKgorIyBkZWZpbmUgY29uc3QKKyNlbmRpZgorCisvKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gKi8KK2NvbnN0IHN0cnVjdCB7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGx0X3B0cl90IGFkZHJlc3M7Cit9CitsdF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KK3sKK0VPRgorCSAgJFNFRCAicy9eJHN5bWNvZGUkc3ltY29kZSogXCguKlwpIFwoLipcKSQvICB7XCJcMlwiLCAobHRfcHRyX3QpIFwmXDJ9LC8iIDwgIiRubGlzdCIgfCBncmVwIC12IG1haW4gPj4gY29uZnRlc3QuJGFjX2V4dAorCSAgY2F0IDw8XEVPRiA+PiBjb25mdGVzdC4kYWNfZXh0CisgIHswLCAobHRfcHRyX3QpIDB9Cit9OworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorRU9GCisJICAjIE5vdyB0cnkgbGlua2luZyB0aGUgdHdvIGZpbGVzLgorCSAgbXYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdHN0bS4kYWNfb2JqZXh0CisJICBsdF9zYXZlX0xJQlM9IiRMSUJTIgorCSAgbHRfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisJICBMSUJTPSJjb25mdHN0bS4kYWNfb2JqZXh0IgorCSAgQ0ZMQUdTPSIkQ0ZMQUdTJGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnIgorCSAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2xpbmtcIiI7IH0gPiY1CisgIChldmFsICRhY19saW5rKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisJICAgIHBpcGVfd29ya3M9eWVzCisJICBmaQorCSAgTElCUz0iJGx0X3NhdmVfTElCUyIKKwkgIENGTEFHUz0iJGx0X3NhdmVfQ0ZMQUdTIgorCWVsc2UKKwkgIGVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkbmxpc3QiID4mNQorCWZpCisgICAgICBlbHNlCisJZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF92YXIgaW4gJG5saXN0IiA+JjUKKyAgICAgIGZpCisgICAgZWxzZQorICAgICAgZWNobyAiY2Fubm90IHJ1biAkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiY1CisgICAgZmkKKyAgZWxzZQorICAgIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgICAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIGZpCisgIHJtIC1mIGNvbmZ0ZXN0KiBjb25mdHN0KgorCisgICMgRG8gbm90IHVzZSB0aGUgZ2xvYmFsX3N5bWJvbF9waXBlIHVubGVzcyBpdCB3b3Jrcy4KKyAgaWYgdGVzdCAiJHBpcGVfd29ya3MiID0geWVzOyB0aGVuCisgICAgYnJlYWsKKyAgZWxzZQorICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9CisgIGZpCitkb25lCisKK2ZpCisKK2lmIHRlc3QgLXogIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgorICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0KK2ZpCitpZiB0ZXN0IC16ICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IGZhaWxlZCIgPiY1CiskYXNfZWNobyAiZmFpbGVkIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG9rIiA+JjUKKyRhc19lY2hvICJvayIgPiY2OyB9CitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBvYmpkaXIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIG9iamRpci4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHtsdF9jdl9vYmpkaXIrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBybSAtZiAubGlicyAyPi9kZXYvbnVsbAorbWtkaXIgLmxpYnMgMj4vZGV2L251bGwKK2lmIHRlc3QgLWQgLmxpYnM7IHRoZW4KKyAgbHRfY3Zfb2JqZGlyPS5saWJzCitlbHNlCisgICMgTVMtRE9TIGRvZXMgbm90IGFsbG93IGZpbGVuYW1lcyB0aGF0IGJlZ2luIHdpdGggYSBkb3QuCisgIGx0X2N2X29iamRpcj1fbGlicworZmkKK3JtZGlyIC5saWJzIDI+L2Rldi9udWxsCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9vYmpkaXIiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9vYmpkaXIiID4mNjsgfQorb2JqZGlyPSRsdF9jdl9vYmpkaXIKKworCisKKworCitjYXNlICRob3N0X29zIGluCithaXgzKikKKyAgIyBBSVggc29tZXRpbWVzIGhhcyBwcm9ibGVtcyB3aXRoIHRoZSBHQ0MgY29sbGVjdDIgcHJvZ3JhbS4gIEZvciBzb21lCisgICMgcmVhc29uLCBpZiB3ZSBzZXQgdGhlIENPTExFQ1RfTkFNRVMgZW52aXJvbm1lbnQgdmFyaWFibGUsIHRoZSBwcm9ibGVtcworICAjIHZhbmlzaCBpbiBhIHB1ZmYgb2Ygc21va2UuCisgIGlmIHRlc3QgIlgke0NPTExFQ1RfTkFNRVMrc2V0fSIgIT0gWHNldDsgdGhlbgorICAgIENPTExFQ1RfTkFNRVM9CisgICAgZXhwb3J0IENPTExFQ1RfTkFNRVMKKyAgZmkKKyAgOzsKK2VzYWMKKworIyBTZWQgc3Vic3RpdHV0aW9uIHRoYXQgaGVscHMgdXMgZG8gcm9idXN0IHF1b3RpbmcuICBJdCBiYWNrc2xhc2hpZmllcworIyBtZXRhY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluIGRvdWJsZS1xdW90ZWQgc3RyaW5ncy4KK1hzZWQ9J3NlZCAtZSBzL15YLy8nCitzZWRfcXVvdGVfc3Vic3Q9J3MvXChbXFwiXFxgJFxcXFxdXCkvXFxcMS9nJworCisjIFNhbWUgYXMgYWJvdmUsIGJ1dCBkbyBub3QgcXVvdGUgdmFyaWFibGUgcmVmZXJlbmNlcy4KK2RvdWJsZV9xdW90ZV9zdWJzdD0ncy9cKFtcXCJcXGBcXFxcXVwpL1xcXDEvZycKKworIyBTZWQgc3Vic3RpdHV0aW9uIHRvIGRlbGF5IGV4cGFuc2lvbiBvZiBhbiBlc2NhcGVkIHNoZWxsIHZhcmlhYmxlIGluIGEKKyMgZG91YmxlX3F1b3RlX3N1YnN0J2VkIHN0cmluZy4KK2RlbGF5X3ZhcmlhYmxlX3N1YnN0PSdzL1xcXFxcXFxcXFxcJC9cXFxcXFwkL2cnCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0byBhdm9pZCBhY2NpZGVudGFsIGdsb2JiaW5nIGluIGV2YWxlZCBleHByZXNzaW9ucworbm9fZ2xvYl9zdWJzdD0ncy9cKi9cXFwqL2cnCisKKyMgQ29uc3RhbnRzOgorcm09InJtIC1mIgorCisjIEdsb2JhbCB2YXJpYWJsZXM6CitkZWZhdWx0X29maWxlPWxpYnRvb2wKK2Nhbl9idWlsZF9zaGFyZWQ9eWVzCisKKyMgQWxsIGtub3duIGxpbmtlcnMgcmVxdWlyZSBhIGAuYScgYXJjaGl2ZSBmb3Igc3RhdGljIGxpbmtpbmcgKGV4Y2VwdCBNJFZDLAorIyB3aGljaCBuZWVkcyAnLmxpYicpLgorbGliZXh0PWEKK2x0bWFpbj0iJGFjX2F1eF9kaXIvbHRtYWluLnNoIgorb2ZpbGU9IiRkZWZhdWx0X29maWxlIgord2l0aF9nbnVfbGQ9IiRsdF9jdl9wcm9nX2dudV9sZCIKKworaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9YXIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9YXI7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wcm9nX0FSK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJEFSIjsgdGhlbgorICBhY19jdl9wcm9nX0FSPSIkQVIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19BUj0iJHthY190b29sX3ByZWZpeH1hciIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitBUj0kYWNfY3ZfcHJvZ19BUgoraWYgdGVzdCAtbiAiJEFSIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEFSIiA+JjUKKyRhc19lY2hvICIkQVIiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX0FSIjsgdGhlbgorICBhY19jdF9BUj0kQVIKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJhciIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgYXI7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X0FSK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0FSIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0FSPSIkYWNfY3RfQVIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9BUj0iYXIiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfQVI9JGFjX2N2X3Byb2dfYWNfY3RfQVIKK2lmIHRlc3QgLW4gIiRhY19jdF9BUiI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9BUiIgPiY1CiskYXNfZWNobyAiJGFjX2N0X0FSIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfY3RfQVIiID0geDsgdGhlbgorICAgIEFSPSJmYWxzZSIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBBUj0kYWNfY3RfQVIKKyAgZmkKK2Vsc2UKKyAgQVI9IiRhY19jdl9wcm9nX0FSIgorZmkKKworaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXJhbmxpYjsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfUkFOTElCK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19SQU5MSUI9IiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK1JBTkxJQj0kYWNfY3ZfcHJvZ19SQU5MSUIKK2lmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkUkFOTElCIiA+JjUKKyRhc19lY2hvICIkUkFOTElCIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiOyB0aGVuCisgIGFjX2N0X1JBTkxJQj0kUkFOTElCCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X1JBTkxJQitzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9SQU5MSUIiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCPSIkYWNfY3RfUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCPSJyYW5saWIiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfUkFOTElCPSRhY19jdl9wcm9nX2FjX2N0X1JBTkxJQgoraWYgdGVzdCAtbiAiJGFjX2N0X1JBTkxJQiI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9SQU5MSUIiID4mNQorJGFzX2VjaG8gIiRhY19jdF9SQU5MSUIiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKyAgaWYgdGVzdCAieCRhY19jdF9SQU5MSUIiID0geDsgdGhlbgorICAgIFJBTkxJQj0iOiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBSQU5MSUI9JGFjX2N0X1JBTkxJQgorICBmaQorZWxzZQorICBSQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKK2ZpCisKK2lmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXN0cmlwIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXN0cmlwOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19TVFJJUCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRTVFJJUCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19TVFJJUD0iJFNUUklQIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfU1RSSVA9IiR7YWNfdG9vbF9wcmVmaXh9c3RyaXAiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorU1RSSVA9JGFjX2N2X3Byb2dfU1RSSVAKK2lmIHRlc3QgLW4gIiRTVFJJUCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRTVFJJUCIgPiY1CiskYXNfZWNobyAiJFNUUklQIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19TVFJJUCI7IHRoZW4KKyAgYWNfY3RfU1RSSVA9JFNUUklQCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAic3RyaXAiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHN0cmlwOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9TVFJJUCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9TVFJJUCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9TVFJJUD0iJGFjX2N0X1NUUklQIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfU1RSSVA9InN0cmlwIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X1NUUklQPSRhY19jdl9wcm9nX2FjX2N0X1NUUklQCitpZiB0ZXN0IC1uICIkYWNfY3RfU1RSSVAiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfU1RSSVAiID4mNQorJGFzX2VjaG8gIiRhY19jdF9TVFJJUCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX2N0X1NUUklQIiA9IHg7IHRoZW4KKyAgICBTVFJJUD0iOiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBTVFJJUD0kYWNfY3RfU1RSSVAKKyAgZmkKK2Vsc2UKKyAgU1RSSVA9IiRhY19jdl9wcm9nX1NUUklQIgorZmkKKworCitvbGRfQ0M9IiRDQyIKK29sZF9DRkxBR1M9IiRDRkxBR1MiCisKKyMgU2V0IHNhbmUgZGVmYXVsdHMgZm9yIHZhcmlvdXMgdmFyaWFibGVzCit0ZXN0IC16ICIkQVIiICYmIEFSPWFyCit0ZXN0IC16ICIkQVJfRkxBR1MiICYmIEFSX0ZMQUdTPWNydQordGVzdCAteiAiJEFTIiAmJiBBUz1hcwordGVzdCAteiAiJENDIiAmJiBDQz1jYwordGVzdCAteiAiJExUQ0MiICYmIExUQ0M9JENDCit0ZXN0IC16ICIkRExMVE9PTCIgJiYgRExMVE9PTD1kbGx0b29sCit0ZXN0IC16ICIkTEQiICYmIExEPWxkCit0ZXN0IC16ICIkTE5fUyIgJiYgTE5fUz0ibG4gLXMiCit0ZXN0IC16ICIkTUFHSUNfQ01EIiAmJiBNQUdJQ19DTUQ9ZmlsZQordGVzdCAteiAiJE5NIiAmJiBOTT1ubQordGVzdCAteiAiJFNFRCIgJiYgU0VEPXNlZAordGVzdCAteiAiJE9CSkRVTVAiICYmIE9CSkRVTVA9b2JqZHVtcAordGVzdCAteiAiJFJBTkxJQiIgJiYgUkFOTElCPToKK3Rlc3QgLXogIiRTVFJJUCIgJiYgU1RSSVA9OgordGVzdCAteiAiJGFjX29iamV4dCIgJiYgYWNfb2JqZXh0PW8KKworIyBEZXRlcm1pbmUgY29tbWFuZHMgdG8gY3JlYXRlIG9sZC1zdHlsZSBzdGF0aWMgYXJjaGl2ZXMuCitvbGRfYXJjaGl2ZV9jbWRzPSckQVIgJEFSX0ZMQUdTICRvbGRsaWIkb2xkb2JqcyRvbGRfZGVwbGlicycKK29sZF9wb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA2NDQgJG9sZGxpYicKK29sZF9wb3N0dW5pbnN0YWxsX2NtZHM9CisKK2lmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgb3BlbmJzZCopCisgICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHM9IlwkUkFOTElCIC10IFwkb2xkbGlifiRvbGRfcG9zdGluc3RhbGxfY21kcyIKKyAgICA7OworICAqKQorICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzPSJcJFJBTkxJQiBcJG9sZGxpYn4kb2xkX3Bvc3RpbnN0YWxsX2NtZHMiCisgICAgOzsKKyAgZXNhYworICBvbGRfYXJjaGl2ZV9jbWRzPSIkb2xkX2FyY2hpdmVfY21kc35cJFJBTkxJQiBcJG9sZGxpYiIKK2ZpCisKKyMgT25seSBwZXJmb3JtIHRoZSBjaGVjayBmb3IgZmlsZSwgaWYgdGhlIGNoZWNrIG1ldGhvZCByZXF1aXJlcyBpdAorY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KK2ZpbGVfbWFnaWMqKQorICBpZiB0ZXN0ICIkZmlsZV9tYWdpY19jbWQiID0gJyRNQUdJQ19DTUQnOyB0aGVuCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJHthY190b29sX3ByZWZpeH1maWxlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAke2FjX3Rvb2xfcHJlZml4fWZpbGUuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7bHRfY3ZfcGF0aF9NQUdJQ19DTUQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRNQUdJQ19DTUQgaW4KK1tcXC8qXSB8ICA/OltcXC9dKikKKyAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworKikKKyAgbHRfc2F2ZV9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiCisgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICBhY19kdW1teT0iL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJHthY190b29sX3ByZWZpeH1maWxlOyB0aGVuCisgICAgICBsdF9jdl9wYXRoX01BR0lDX0NNRD0iJGFjX2Rpci8ke2FjX3Rvb2xfcHJlZml4fWZpbGUiCisgICAgICBpZiB0ZXN0IC1uICIkZmlsZV9tYWdpY190ZXN0X2ZpbGUiOyB0aGVuCisJY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KKwkiZmlsZV9tYWdpYyAiKikKKwkgIGZpbGVfbWFnaWNfcmVnZXg9ImBleHByIFwiJGRlcGxpYnNfY2hlY2tfbWV0aG9kXCIgOiBcImZpbGVfbWFnaWMgXCguKlwpXCJgIgorCSAgTUFHSUNfQ01EPSIkbHRfY3ZfcGF0aF9NQUdJQ19DTUQiCisJICBpZiBldmFsICRmaWxlX21hZ2ljX2NtZCBcJGZpbGVfbWFnaWNfdGVzdF9maWxlIDI+IC9kZXYvbnVsbCB8CisJICAgICRFR1JFUCAiJGZpbGVfbWFnaWNfcmVnZXgiID4gL2Rldi9udWxsOyB0aGVuCisJICAgIDoKKwkgIGVsc2UKKwkgICAgY2F0IDw8RU9GIDE+JjIKKworKioqIFdhcm5pbmc6IHRoZSBjb21tYW5kIGxpYnRvb2wgdXNlcyB0byBkZXRlY3Qgc2hhcmVkIGxpYnJhcmllcywKKyoqKiAkZmlsZV9tYWdpY19jbWQsIHByb2R1Y2VzIG91dHB1dCB0aGF0IGxpYnRvb2wgY2Fubm90IHJlY29nbml6ZS4KKyoqKiBUaGUgcmVzdWx0IGlzIHRoYXQgbGlidG9vbCBtYXkgZmFpbCB0byByZWNvZ25pemUgc2hhcmVkIGxpYnJhcmllcworKioqIGFzIHN1Y2guICBUaGlzIHdpbGwgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcyB0aGF0CisqKiogZGVwZW5kIG9uIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dCBwcm9ncmFtcyBsaW5rZWQgd2l0aCBzdWNoIGxpYnRvb2wKKyoqKiBsaWJyYXJpZXMgd2lsbCB3b3JrIHJlZ2FyZGxlc3Mgb2YgdGhpcyBwcm9ibGVtLiAgTmV2ZXJ0aGVsZXNzLCB5b3UKKyoqKiBtYXkgd2FudCB0byByZXBvcnQgdGhlIHByb2JsZW0gdG8geW91ciBzeXN0ZW0gbWFuYWdlciBhbmQvb3IgdG8KKyoqKiBidWctbGlidG9vbEBnbnUub3JnCisKK0VPRgorCSAgZmkgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGx0X3NhdmVfaWZzIgorICBNQUdJQ19DTUQ9IiRsdF9zYXZlX01BR0lDX0NNRCIKKyAgOzsKK2VzYWMKK2ZpCisKK01BR0lDX0NNRD0iJGx0X2N2X3BhdGhfTUFHSUNfQ01EIgoraWYgdGVzdCAtbiAiJE1BR0lDX0NNRCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRNQUdJQ19DTUQiID4mNQorJGFzX2VjaG8gIiRNQUdJQ19DTUQiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKK2lmIHRlc3QgLXogIiRsdF9jdl9wYXRoX01BR0lDX0NNRCI7IHRoZW4KKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGZpbGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGZpbGUuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7bHRfY3ZfcGF0aF9NQUdJQ19DTUQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRNQUdJQ19DTUQgaW4KK1tcXC8qXSB8ICA/OltcXC9dKikKKyAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworKikKKyAgbHRfc2F2ZV9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiCisgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICBhY19kdW1teT0iL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvZmlsZTsgdGhlbgorICAgICAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRhY19kaXIvZmlsZSIKKyAgICAgIGlmIHRlc3QgLW4gIiRmaWxlX21hZ2ljX3Rlc3RfZmlsZSI7IHRoZW4KKwljYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgorCSJmaWxlX21hZ2ljICIqKQorCSAgZmlsZV9tYWdpY19yZWdleD0iYGV4cHIgXCIkZGVwbGlic19jaGVja19tZXRob2RcIiA6IFwiZmlsZV9tYWdpYyBcKC4qXClcImAiCisJICBNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKKwkgIGlmIGV2YWwgJGZpbGVfbWFnaWNfY21kIFwkZmlsZV9tYWdpY190ZXN0X2ZpbGUgMj4gL2Rldi9udWxsIHwKKwkgICAgJEVHUkVQICIkZmlsZV9tYWdpY19yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgOgorCSAgZWxzZQorCSAgICBjYXQgPDxFT0YgMT4mMgorCisqKiogV2FybmluZzogdGhlIGNvbW1hbmQgbGlidG9vbCB1c2VzIHRvIGRldGVjdCBzaGFyZWQgbGlicmFyaWVzLAorKioqICRmaWxlX21hZ2ljX2NtZCwgcHJvZHVjZXMgb3V0cHV0IHRoYXQgbGlidG9vbCBjYW5ub3QgcmVjb2duaXplLgorKioqIFRoZSByZXN1bHQgaXMgdGhhdCBsaWJ0b29sIG1heSBmYWlsIHRvIHJlY29nbml6ZSBzaGFyZWQgbGlicmFyaWVzCisqKiogYXMgc3VjaC4gIFRoaXMgd2lsbCBhZmZlY3QgdGhlIGNyZWF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzIHRoYXQKKyoqKiBkZXBlbmQgb24gc2hhcmVkIGxpYnJhcmllcywgYnV0IHByb2dyYW1zIGxpbmtlZCB3aXRoIHN1Y2ggbGlidG9vbAorKioqIGxpYnJhcmllcyB3aWxsIHdvcmsgcmVnYXJkbGVzcyBvZiB0aGlzIHByb2JsZW0uICBOZXZlcnRoZWxlc3MsIHlvdQorKioqIG1heSB3YW50IHRvIHJlcG9ydCB0aGUgcHJvYmxlbSB0byB5b3VyIHN5c3RlbSBtYW5hZ2VyIGFuZC9vciB0bworKioqIGJ1Zy1saWJ0b29sQGdudS5vcmcKKworRU9GCisJICBmaSA7OworCWVzYWMKKyAgICAgIGZpCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgIE1BR0lDX0NNRD0iJGx0X3NhdmVfTUFHSUNfQ01EIgorICA7OworZXNhYworZmkKKworTUFHSUNfQ01EPSIkbHRfY3ZfcGF0aF9NQUdJQ19DTUQiCitpZiB0ZXN0IC1uICIkTUFHSUNfQ01EIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE1BR0lDX0NNRCIgPiY1CiskYXNfZWNobyAiJE1BR0lDX0NNRCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICBlbHNlCisgICAgTUFHSUNfQ01EPToKKyAgZmkKK2ZpCisKKyAgZmkKKyAgOzsKK2VzYWMKKworZW5hYmxlX2Rsb3Blbj1ubworZW5hYmxlX3dpbjMyX2RsbD15ZXMKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWxpYnRvb2wtbG9jayB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9saWJ0b29sX2xvY2src2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9saWJ0b29sX2xvY2s7CitmaQorCit0ZXN0ICJ4JGVuYWJsZV9saWJ0b29sX2xvY2siICE9IHhubyAmJiBlbmFibGVfbGlidG9vbF9sb2NrPXllcworCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtcGljIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9waWMrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX3BpYzsgcGljX21vZGU9IiR3aXRodmFsIgorZWxzZQorICBwaWNfbW9kZT1kZWZhdWx0CitmaQorCit0ZXN0IC16ICIkcGljX21vZGUiICYmIHBpY19tb2RlPWRlZmF1bHQKKworIyBVc2UgQyBmb3IgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpbiB0aGUgbGlidG9vbCBzY3JpcHQKK3RhZ25hbWU9CitsdF9zYXZlX0NDPSIkQ0MiCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKKworIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIEMgdGVzdCBzb3VyY2VzLgorYWNfZXh0PWMKKworIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIEMgdGVzdCBzb3VyY2VzLgorb2JqZXh0PW8KK29iamV4dD0kb2JqZXh0CisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCitsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9ImludCBzb21lX3ZhcmlhYmxlID0gMDtcbiIKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKK2x0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0naW50IG1haW4oKXtyZXR1cm4oMCk7fVxuJworCisKKyMgSWYgbm8gQyBjb21waWxlciB3YXMgc3BlY2lmaWVkLCB1c2UgQ0MuCitMVENDPSR7TFRDQy0iJENDIn0KKworIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KK2NvbXBpbGVyPSRDQworCisKKyMKKyMgQ2hlY2sgZm9yIGFueSBzcGVjaWFsIHNoYXJlZCBsaWJyYXJ5IGNvbXBpbGF0aW9uIGZsYWdzLgorIworbHRfcHJvZ19jY19zaGxpYj0KK2lmIHRlc3QgIiRHQ0MiID0gbm87IHRoZW4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICBzY28zLjJ2NSopCisgICAgbHRfcHJvZ19jY19zaGxpYj0nLWJlbGYnCisgICAgOzsKKyAgZXNhYworZmkKK2lmIHRlc3QgLW4gIiRsdF9wcm9nX2NjX3NobGliIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IFxgJENDJyByZXF1aXJlcyBcYCRsdF9wcm9nX2NjX3NobGliJyB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IFxgJENDJyByZXF1aXJlcyBcYCRsdF9wcm9nX2NjX3NobGliJyB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzIiA+JjI7fQorICBpZiBlY2hvICIkb2xkX0NDICRvbGRfQ0ZMQUdTICIgfCBncmVwICJbIAldJGx0X3Byb2dfY2Nfc2hsaWJbIAldIiA+L2Rldi9udWxsOyB0aGVuIDoKKyAgZWxzZQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogYWRkIFxgJGx0X3Byb2dfY2Nfc2hsaWInIHRvIHRoZSBDQyBvciBDRkxBR1MgZW52IHZhcmlhYmxlIGFuZCByZWNvbmZpZ3VyZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBhZGQgXGAkbHRfcHJvZ19jY19zaGxpYicgdG8gdGhlIENDIG9yIENGTEFHUyBlbnYgdmFyaWFibGUgYW5kIHJlY29uZmlndXJlIiA+JjI7fQorICAgIGx0X2N2X3Byb2dfY2NfY2FuX2J1aWxkX3NoYXJlZD1ubworICBmaQorZmkKKworCisjCisjIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgc3RhdGljIGZsYWcgYWN0dWFsbHkgd29ya3MuCisjCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbHRfcHJvZ19jb21waWxlcl9zdGF0aWMgd29ya3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyB3b3Jrcy4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3JrcytzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzPW5vCisgICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorICAgTERGTEFHUz0iJExERkxBR1MgJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIgorICAgcHJpbnRmICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGlmIChldmFsICRhY19saW5rIDI+Y29uZnRlc3QuZXJyKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgorICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKKyAgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICAgICAjIEFwcGVuZCBhbnkgZXJyb3JzIHRvIHRoZSBjb25maWcubG9nLgorICAgICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQorICAgICBlbHNlCisgICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3M9eWVzCisgICAgIGZpCisgICBmaQorICAgJHJtIGNvbmZ0ZXN0KgorICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3MiID4mNQorJGFzX2VjaG8gIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3JrcyIgPiY2OyB9CisKK2lmIHRlc3QgeCIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3MiID0geHllczsgdGhlbgorICAgIDoKK2Vsc2UKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0KK2ZpCisKKworCisjIyBDQVZFQVQgRU1QVE9SOgorIyMgVGhlcmUgaXMgbm8gZW5jYXBzdWxhdGlvbiB3aXRoaW4gdGhlIGZvbGxvd2luZyBtYWNyb3MsIGRvIG5vdCBjaGFuZ2UKKyMjIHRoZSBydW5uaW5nIG9yZGVyIG9yIG90aGVyd2lzZSBtb3ZlIHRoZW0gYXJvdW5kIHVubGVzcyB5b3Uga25vdyBleGFjdGx5CisjIyB3aGF0IHlvdSBhcmUgZG9pbmcuLi4KKworbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWc9CisKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnPScgLWZuby1idWlsdGluJworCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7bHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucz1ubworICBhY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKKyAgIHByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisgICBsdF9jb21waWxlcl9mbGFnPSItZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIgorICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKKyAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCisgICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCisgICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgorICAgIyBUaGUgb3B0aW9uIGlzIHJlZmVyZW5jZWQgdmlhIGEgdmFyaWFibGUgdG8gYXZvaWQgY29uZnVzaW5nIHNlZC4KKyAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAorICAgLWUgJ3M6LipGTEFHU30/IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAorICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZTo4MDM2OiAkbHRfY29tcGlsZVwiIiA+JjUpCisgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+Y29uZnRlc3QuZXJyKQorICAgYWNfc3RhdHVzPSQ/CisgICBjYXQgY29uZnRlc3QuZXJyID4mNQorICAgZWNobyAiJGFzX21lOjgwNDA6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyAiJGFjX291dGZpbGUiOyB0aGVuCisgICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncworICAgICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnM9eWVzCisgICAgIGZpCisgICBmaQorICAgJHJtIGNvbmZ0ZXN0KgorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucyIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zIiA+JjY7IH0KKworaWYgdGVzdCB4IiRsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucyIgPSB4eWVzOyB0aGVuCisgICAgbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWc9IiRsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIgorZWxzZQorICAgIDoKK2ZpCisKK2ZpCisKK2x0X3Byb2dfY29tcGlsZXJfd2w9CitsdF9wcm9nX2NvbXBpbGVyX3BpYz0KK2x0X3Byb2dfY29tcGlsZXJfc3RhdGljPQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDLi4uICIgPiY2OyB9CisKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctc3RhdGljJworCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgYWl4KikKKyAgICAgICMgQWxsIEFJWCBjb2RlIGlzIFBJQy4KKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKKwlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFtaWdhb3MqKQorICAgICAgIyBGSVhNRTogd2UgbmVlZCBhdCBsZWFzdCA2ODAyMCBjb2RlIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dAorICAgICAgIyBhZGRpbmcgdGhlIGAtbTY4MDIwJyBmbGFnIHRvIEdDQyBwcmV2ZW50cyBidWlsZGluZyBhbnl0aGluZyBiZXR0ZXIsCisgICAgICAjIGxpa2UgYC1tNjgwNDAnLgorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1tNjgwMjAgLXJlc2lkZW50MzIgLW1hbHdheXMtcmVzdG9yZS1hNCcKKyAgICAgIDs7CisKKyAgICBiZW9zKiB8IGN5Z3dpbiogfCBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqIHwgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIHRoZXNlIE9TZXMuCisgICAgICA7OworCisgICAgbWluZ3cqIHwgcHczMiogfCBvczIqKQorICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZworICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctRERMTF9FWFBPUlQnCisgICAgICA7OworCisgICAgZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KKyAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctZm5vLWNvbW1vbicKKyAgICAgIDs7CisKKyAgICBtc2Rvc2RqZ3BwKikKKyAgICAgICMgSnVzdCBiZWNhdXNlIHdlIHVzZSBHQ0MgZG9lc24ndCBtZWFuIHdlIHN1ZGRlbmx5IGdldCBzaGFyZWQgbGlicmFyaWVzCisgICAgICAjIG9uIHN5c3RlbXMgdGhhdCBkb24ndCBzdXBwb3J0IHRoZW0uCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQ9bm8KKyAgICAgIGVuYWJsZV9zaGFyZWQ9bm8KKyAgICAgIDs7CisKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCisJbHRfcHJvZ19jb21waWxlcl9waWM9LUtjb25mb3JtX3BpYworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBocHV4KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBJQTY0IEhQLVVYIGFuZCA2NC1iaXQgSFAtVVgsIGJ1dAorICAgICAgIyBub3QgZm9yIFBBIEhQLVVYLgorICAgICAgY2FzZSAiJGhvc3RfY3B1IiBpbgorICAgICAgaHBwYSo2NCp8aWE2NCopCisJIyArWiB0aGUgZGVmYXVsdAorCTs7CisgICAgICAqKQorCWx0X3Byb2dfY29tcGlsZXJfcGljPSctZlBJQycKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgICopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLWZQSUMnCisgICAgICA7OworICAgIGVzYWMKKyAgZWxzZQorICAgICMgUE9SVE1FIENoZWNrIGZvciBmbGFnIHRvIHBhc3MgbGlua2VyIGZsYWdzIHRocm91Z2ggdGhlIHN5c3RlbSBjb21waWxlci4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgYWl4KikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgZWxzZQorCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctYm5zbyAtYkk6L2xpYi9zeXNjYWxscy5leHAnCisgICAgICBmaQorICAgICAgOzsKKworICAgIG1pbmd3KiB8IHB3MzIqIHwgb3MyKikKKyAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKKyAgICAgICMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLURETExfRVhQT1JUJworICAgICAgOzsKKworICAgIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBJQTY0IEhQLVVYIGFuZCA2NC1iaXQgSFAtVVgsIGJ1dAorICAgICAgIyBub3QgZm9yIFBBIEhQLVVYLgorICAgICAgY2FzZSAiJGhvc3RfY3B1IiBpbgorICAgICAgaHBwYSo2NCp8aWE2NCopCisJIyArWiB0aGUgZGVmYXVsdAorCTs7CisgICAgICAqKQorCWx0X3Byb2dfY29tcGlsZXJfcGljPScrWicKKwk7OworICAgICAgZXNhYworICAgICAgIyBJcyB0aGVyZSBhIGJldHRlciBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyB0aGF0IHdvcmtzIHdpdGggdGhlIGJ1bmRsZWQgQ0M/CisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nJHt3bH0tYSAke3dsfWFyY2hpdmUnCisgICAgICA7OworCisgICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisgICAgICAjIFBJQyAod2l0aCAtS1BJQykgaXMgdGhlIGRlZmF1bHQuCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLW5vbl9zaGFyZWQnCisgICAgICA7OworCisgICAgbmV3c29zNikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctS1BJQycKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICBsaW51eCopCisgICAgICBjYXNlICRDQyBpbgorICAgICAgaWNjKiB8IGVjYyopCisJbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKwlsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLUtQSUMnCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1zdGF0aWMnCisgICAgICAgIDs7CisgICAgICBjY2MqKQorICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworICAgICAgICAjIEFsbCBBbHBoYSBjb2RlIGlzIFBJQy4KKyAgICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1ub25fc2hhcmVkJworICAgICAgICA7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisgICAgICAjIEFsbCBPU0YvMSBjb2RlIGlzIFBJQy4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctbm9uX3NoYXJlZCcKKyAgICAgIDs7CisKKyAgICBzY28zLjJ2NSopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLUtwaWMnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLWRuJworICAgICAgOzsKKworICAgIHNvbGFyaXMqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctS1BJQycKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICBzdW5vczQqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVFvcHRpb24gbGQgJworICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1QSUMnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgc3lzdjQgfCBzeXN2NC4ydXcyKiB8IHN5c3Y0LjMqIHwgc3lzdjUqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctS1BJQycKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjIDt0aGVuCisJbHRfcHJvZ19jb21waWxlcl9waWM9Jy1LY29uZm9ybV9waWMnCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICB1dHM0KikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctcGljJworICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgICopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQ9bm8KKyAgICAgIDs7CisgICAgZXNhYworICBmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X3Byb2dfY29tcGlsZXJfcGljIiA+JjUKKyRhc19lY2hvICIkbHRfcHJvZ19jb21waWxlcl9waWMiID4mNjsgfQorCisjCisjIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgUElDIGZsYWcgYWN0dWFsbHkgd29ya3MuCisjCitpZiB0ZXN0IC1uICIkbHRfcHJvZ19jb21waWxlcl9waWMiOyB0aGVuCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRsdF9wcm9nX2NvbXBpbGVyX3BpYyB3b3JrcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJGx0X3Byb2dfY29tcGlsZXJfcGljIHdvcmtzLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2x0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3M9bm8KKyAgYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0CisgICBwcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorICAgbHRfY29tcGlsZXJfZmxhZz0iJGx0X3Byb2dfY29tcGlsZXJfcGljIC1EUElDIgorICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKKyAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCisgICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCisgICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgorICAgIyBUaGUgb3B0aW9uIGlzIHJlZmVyZW5jZWQgdmlhIGEgdmFyaWFibGUgdG8gYXZvaWQgY29uZnVzaW5nIHNlZC4KKyAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAorICAgLWUgJ3M6LipGTEFHU30/IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAorICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZTo4MjY5OiAkbHRfY29tcGlsZVwiIiA+JjUpCisgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+Y29uZnRlc3QuZXJyKQorICAgYWNfc3RhdHVzPSQ/CisgICBjYXQgY29uZnRlc3QuZXJyID4mNQorICAgZWNobyAiJGFzX21lOjgyNzM6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyAiJGFjX291dGZpbGUiOyB0aGVuCisgICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncworICAgICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3M9eWVzCisgICAgIGZpCisgICBmaQorICAgJHJtIGNvbmZ0ZXN0KgorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9wcm9nX2NvbXBpbGVyX3BpY193b3JrcyIgPiY1CiskYXNfZWNobyAiJGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzIiA+JjY7IH0KKworaWYgdGVzdCB4IiRsdF9wcm9nX2NvbXBpbGVyX3BpY193b3JrcyIgPSB4eWVzOyB0aGVuCisgICAgY2FzZSAkbHRfcHJvZ19jb21waWxlcl9waWMgaW4KKyAgICAgIiIgfCAiICIqKSA7OworICAgICAqKSBsdF9wcm9nX2NvbXBpbGVyX3BpYz0iICRsdF9wcm9nX2NvbXBpbGVyX3BpYyIgOzsKKyAgICAgZXNhYworZWxzZQorICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPQorICAgICBsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQ9bm8KK2ZpCisKK2ZpCitjYXNlICIkaG9zdF9vcyIgaW4KKyAgIyBGb3IgcGxhdGZvcm1zIHdoaWNoIGRvIG5vdCBzdXBwb3J0IFBJQywgLURQSUMgaXMgbWVhbmluZ2xlc3M6CisgICpkamdwcCopCisgICAgbHRfcHJvZ19jb21waWxlcl9waWM9CisgICAgOzsKKyAgKikKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0iJGx0X3Byb2dfY29tcGlsZXJfcGljIC1EUElDIgorICAgIDs7Citlc2FjCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0Li4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2x0X2N2X3Byb2dfY29tcGlsZXJfY19vK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX289bm8KKyAgICRybSAtciBjb25mdGVzdCAyPi9kZXYvbnVsbAorICAgbWtkaXIgY29uZnRlc3QKKyAgIGNkIGNvbmZ0ZXN0CisgICBta2RpciBvdXQKKyAgIHByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisKKyAgIGx0X2NvbXBpbGVyX2ZsYWc9Ii1vIG91dC9jb25mdGVzdDIuJGFjX29iamV4dCIKKyAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCisgICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgorICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucworICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KKyAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAorICAgLWUgJ3M6LipGTEFHU30/IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAorICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZTo4MzI5OiAkbHRfY29tcGlsZVwiIiA+JjUpCisgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+b3V0L2NvbmZ0ZXN0LmVycikKKyAgIGFjX3N0YXR1cz0kPworICAgY2F0IG91dC9jb25mdGVzdC5lcnIgPiY1CisgICBlY2hvICIkYXNfbWU6ODMzMzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zIG91dC9jb25mdGVzdDIuJGFjX29iamV4dAorICAgdGhlbgorICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKKyAgICAgaWYgdGVzdCAhIC1zIG91dC9jb25mdGVzdC5lcnI7IHRoZW4KKyAgICAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfbz15ZXMKKyAgICAgZmkKKyAgIGZpCisgICBjaG1vZCB1K3cgLgorICAgJHJtIGNvbmZ0ZXN0KgorICAgIyBTR0kgQysrIGNvbXBpbGVyIHdpbGwgY3JlYXRlIGRpcmVjdG9yeSBvdXQvaWlfZmlsZXMvIGZvcgorICAgIyB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uCisgICB0ZXN0IC1kIG91dC9paV9maWxlcyAmJiAkcm0gb3V0L2lpX2ZpbGVzLyogJiYgcm1kaXIgb3V0L2lpX2ZpbGVzCisgICAkcm0gb3V0LyogJiYgcm1kaXIgb3V0CisgICBjZCAuLgorICAgcm1kaXIgY29uZnRlc3QKKyAgICRybSBjb25mdGVzdCoKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9jX28iID4mNQorJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbyIgPiY2OyB9CisKKworaGFyZF9saW5rcz0ibm90dGVzdGVkIgoraWYgdGVzdCAiJGx0X2N2X3Byb2dfY29tcGlsZXJfY19vIiA9IG5vICYmIHRlc3QgIiRuZWVkX2xvY2tzIiAhPSBubzsgdGhlbgorICAjIGRvIG5vdCBvdmVyd3JpdGUgdGhlIHZhbHVlIG9mIG5lZWRfbG9ja3MgcHJvdmlkZWQgYnkgdGhlIHVzZXIKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiB3ZSBjYW4gbG9jayB3aXRoIGhhcmQgbGlua3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgd2UgY2FuIGxvY2sgd2l0aCBoYXJkIGxpbmtzLi4uICIgPiY2OyB9CisgIGhhcmRfbGlua3M9eWVzCisgICRybSBjb25mdGVzdCoKKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KKyAgdG91Y2ggY29uZnRlc3QuYQorICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4mNSB8fCBoYXJkX2xpbmtzPW5vCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkaGFyZF9saW5rcyIgPiY1CiskYXNfZWNobyAiJGhhcmRfbGlua3MiID4mNjsgfQorICBpZiB0ZXN0ICIkaGFyZF9saW5rcyIgPSBubzsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogXGAkQ0MnIGRvZXMgbm90IHN1cHBvcnQgXGAtYyAtbycsIHNvIFxgbWFrZSAtaicgbWF5IGJlIHVuc2FmZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBcYCRDQycgZG9lcyBub3Qgc3VwcG9ydCBcYC1jIC1vJywgc28gXGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlIiA+JjI7fQorICAgIG5lZWRfbG9ja3M9d2FybgorICBmaQorZWxzZQorICBuZWVkX2xvY2tzPW5vCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRoZSAkY29tcGlsZXIgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuLi4gIiA+JjY7IH0KKworICBydW5wYXRoX3Zhcj0KKyAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9CisgIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXM9bm8KKyAgYXJjaGl2ZV9jbWRzPQorICBhcmNoaXZlX2V4cHN5bV9jbWRzPQorICBvbGRfYXJjaGl2ZV9Gcm9tX25ld19jbWRzPQorICBvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcz0KKyAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPQorICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0KKyAgdGhyZWFkX3NhZmVfZmxhZ19zcGVjPQorICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPQorICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkPQorICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPQorICBoYXJkY29kZV9kaXJlY3Q9bm8KKyAgaGFyZGNvZGVfbWludXNfTD1ubworICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPXVuc3VwcG9ydGVkCisgIGxpbmtfYWxsX2RlcGxpYnM9dW5rbm93bgorICBoYXJkY29kZV9hdXRvbWF0aWM9bm8KKyAgbW9kdWxlX2NtZHM9CisgIG1vZHVsZV9leHBzeW1fY21kcz0KKyAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzPW5vCisgIGV4cG9ydF9zeW1ib2xzX2NtZHM9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAnXCcncy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKKyAgIyBpbmNsdWRlX2V4cHN5bXMgc2hvdWxkIGJlIGEgbGlzdCBvZiBzcGFjZS1zZXBhcmF0ZWQgc3ltYm9scyB0byBiZSAqYWx3YXlzKgorICAjIGluY2x1ZGVkIGluIHRoZSBzeW1ib2wgbGlzdAorICBpbmNsdWRlX2V4cHN5bXM9CisgICMgZXhjbHVkZV9leHBzeW1zIGNhbiBiZSBhbiBleHRlbmRlZCByZWdleHAgb2Ygc3ltYm9scyB0byBleGNsdWRlCisgICMgaXQgd2lsbCBiZSB3cmFwcGVkIGJ5IGAgKCcgYW5kIGApJCcsIHNvIG9uZSBtdXN0IG5vdCBtYXRjaCBiZWdpbm5pbmcgb3IKKyAgIyBlbmQgb2YgbGluZS4gIEV4YW1wbGU6IGBhfGJjfC4qZC4qJyB3aWxsIGV4Y2x1ZGUgdGhlIHN5bWJvbHMgYGEnIGFuZCBgYmMnLAorICAjIGFzIHdlbGwgYXMgYW55IHN5bWJvbCB0aGF0IGNvbnRhaW5zIGBkJy4KKyAgZXhjbHVkZV9leHBzeW1zPSJfR0xPQkFMX09GRlNFVF9UQUJMRV8iCisgICMgQWx0aG91Z2ggX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGlzIGEgdmFsaWQgc3ltYm9sIEMgbmFtZSwgbW9zdCBhLm91dAorICAjIHBsYXRmb3JtcyAoYWIpdXNlIGl0IGluIFBJQyBjb2RlLCBidXQgdGhlaXIgbGlua2VycyBnZXQgY29uZnVzZWQgaWYKKyAgIyB0aGUgc3ltYm9sIGlzIGV4cGxpY2l0bHkgcmVmZXJlbmNlZC4gIFNpbmNlIHBvcnRhYmxlIGNvZGUgY2Fubm90CisgICMgcmVseSBvbiB0aGlzIHN5bWJvbCBuYW1lLCBpdCdzIHByb2JhYmx5IGZpbmUgdG8gbmV2ZXIgaW5jbHVkZSBpdCBpbgorICAjIHByZWxvYWRlZCBzeW1ib2wgdGFibGVzLgorICBleHRyYWN0X2V4cHN5bXNfY21kcz0KKworICBjYXNlICRob3N0X29zIGluCisgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgICAjIEZJWE1FOiB0aGUgTVNWQysrIHBvcnQgaGFzbid0IGJlZW4gdGVzdGVkIGluIGEgbG9vb29uZyB0aW1lCisgICAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKKyAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgorICAgIGlmIHRlc3QgIiRHQ0MiICE9IHllczsgdGhlbgorICAgICAgd2l0aF9nbnVfbGQ9bm8KKyAgICBmaQorICAgIDs7CisgIG9wZW5ic2QqKQorICAgIHdpdGhfZ251X2xkPW5vCisgICAgOzsKKyAgZXNhYworCisgIGxkX3NobGlicz15ZXMKKyAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgICMgSWYgYXJjaGl2ZV9jbWRzIHJ1bnMgTEQsIG5vdCBDQywgd2xhcmMgc2hvdWxkIGJlIGVtcHR5CisgICAgd2xhcmM9JyR7d2x9JworCisgICAgIyBTZWUgaWYgR05VIGxkIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGFpeDMqIHwgYWl4NCogfCBhaXg1KikKKyAgICAgICMgT24gQUlYL1BQQywgdGhlIEdOVSBsaW5rZXIgaXMgdmVyeSBicm9rZW4KKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NDsgdGhlbgorCWxkX3NobGlicz1ubworCWNhdCA8PEVPRiAxPiYyCisKKyoqKiBXYXJuaW5nOiB0aGUgR05VIGxpbmtlciwgYXQgbGVhc3QgdXAgdG8gcmVsZWFzZSAyLjkuMSwgaXMgcmVwb3J0ZWQKKyoqKiB0byBiZSB1bmFibGUgdG8gcmVsaWFibHkgY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gQUlYLgorKioqIFRoZXJlZm9yZSwgbGlidG9vbCBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgSWYgeW91CisqKiogcmVhbGx5IGNhcmUgZm9yIHNoYXJlZCBsaWJyYXJpZXMsIHlvdSBtYXkgd2FudCB0byBtb2RpZnkgeW91ciBQQVRICisqKiogc28gdGhhdCBhIG5vbi1HTlUgbGlua2VyIGlzIGZvdW5kLCBhbmQgdGhlbiByZXN0YXJ0LgorCitFT0YKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYW1pZ2FvcyopCisgICAgICBhcmNoaXZlX2NtZHM9JyRybSAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiAkQVJfRkxBR1MgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvdXRwdXRfb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgICBoYXJkY29kZV9taW51c19MPXllcworCisgICAgICAjIFNhbXVlbCBBLiBGYWx2byBJSSA8a2M1dGphQGRvbHBoaW4ub3BlbnByb2plY3RzLm5ldD4gcmVwb3J0cworICAgICAgIyB0aGF0IHRoZSBzZW1hbnRpY3Mgb2YgZHluYW1pYyBsaWJyYXJpZXMgb24gQW1pZ2FPUywgYXQgbGVhc3QgdXAKKyAgICAgICMgdG8gdmVyc2lvbiA0LCBpcyB0byBzaGFyZSBkYXRhIGFtb25nIG11bHRpcGxlIHByb2dyYW1zIGxpbmtlZAorICAgICAgIyB3aXRoIHRoZSBzYW1lIGR5bmFtaWMgbGlicmFyeS4gIFNpbmNlIHRoaXMgZG9lc24ndCBtYXRjaCB0aGUKKyAgICAgICMgYmVoYXZpb3Igb2Ygc2hhcmVkIGxpYnJhcmllcyBvbiBvdGhlciBwbGF0Zm9ybXMsIHdlIGNhbid0IHVzZQorICAgICAgIyB0aGVtLgorICAgICAgbGRfc2hsaWJzPW5vCisgICAgICA7OworCisgICAgYmVvcyopCisgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwlhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAorCSMgSm9zZXBoIEJlY2tlbmJhY2ggPGpyYjNAYmVzdC5jb20+IHNheXMgc29tZSByZWxlYXNlcyBvZiBnY2MKKwkjIHN1cHBvcnQgLS11bmRlZmluZWQuICBUaGlzIGRlc2VydmVzIHNvbWUgaW52ZXN0aWdhdGlvbi4gIEZJWE1FCisJYXJjaGl2ZV9jbWRzPSckQ0MgLW5vc3RhcnQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgICAgICBlbHNlCisJbGRfc2hsaWJzPW5vCisgICAgICBmaQorICAgICAgOzsKKworICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgICAgICMgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCApIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLAorICAgICAgIyBhcyB0aGVyZSBpcyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKKyAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCisgICAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9bm8KKyAgICAgIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXM9eWVzCisgICAgICBleHBvcnRfc3ltYm9sc19jbWRzPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgLWUgJ1wnJy9eW0JDREdTXSAvcy8uKiBcKFteIF0qXCkvXDEgREFUQS8nXCcnIHwgJFNFRCAtZSAnXCcnL15bQUlUV10gL3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJ2F1dG8taW1wb3J0JyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1pbWFnZS1iYXNlPTB4MTAwMDAwMDAgJHt3bH0tLW91dC1pbXBsaWIsJGxpYicKKwkjIElmIHRoZSBleHBvcnQtc3ltYm9scyBmaWxlIGFscmVhZHkgaXMgYSAuZGVmIGZpbGUgKDFzdCBsaW5lCisJIyBpcyBFWFBPUlRTKSwgdXNlIGl0IGFzIGlzOyBvdGhlcndpc2UsIHByZXBlbmQuLi4KKwlhcmNoaXZlX2V4cHN5bV9jbWRzPSdpZiB0ZXN0ICJ4YCRTRUQgMXEgJGV4cG9ydF9zeW1ib2xzYCIgPSB4RVhQT1JUUzsgdGhlbgorCSAgY3AgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCWVsc2UKKwkgIGVjaG8gRVhQT1JUUyA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCSAgY2F0ICRleHBvcnRfc3ltYm9scyA+PiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKwlmaX4KKwkkQ0MgLXNoYXJlZCAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0taW1hZ2UtYmFzZT0weDEwMDAwMDAwICAke3dsfS0tb3V0LWltcGxpYiwkbGliJworICAgICAgZWxzZQorCWxkX3NobGlicz1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBuZXRic2QqIHwga25ldGJzZCotZ251KQorICAgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgorCWFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLW8gJGxpYicKKwl3bGFyYz0KKyAgICAgIGVsc2UKKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzb2xhcmlzKiB8IHN5c3Y1KikKKyAgICAgIGlmICRMRCAtdiAyPiYxIHwgZ3JlcCAnQkZEIDJcLjgnID4gL2Rldi9udWxsOyB0aGVuCisJbGRfc2hsaWJzPW5vCisJY2F0IDw8RU9GIDE+JjIKKworKioqIFdhcm5pbmc6IFRoZSByZWxlYXNlcyAyLjguKiBvZiB0aGUgR05VIGxpbmtlciBjYW5ub3QgcmVsaWFibHkKKyoqKiBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBTb2xhcmlzIHN5c3RlbXMuICBUaGVyZWZvcmUsIGxpYnRvb2wKKyoqKiBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgV2UgdXJnZSB5b3UgdG8gdXBncmFkZSBHTlUKKyoqKiBiaW51dGlscyB0byByZWxlYXNlIDIuOS4xIG9yIG5ld2VyLiAgQW5vdGhlciBvcHRpb24gaXMgdG8gbW9kaWZ5CisqKiogeW91ciBQQVRIIG9yIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gc28gdGhhdCB0aGUgbmF0aXZlIGxpbmtlciBpcworKioqIHVzZWQsIGFuZCB0aGVuIHJlc3RhcnQuCisKK0VPRgorICAgICAgZWxpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZWxzZQorCWxkX3NobGlicz1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzdW5vczQqKQorICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgd2xhcmM9CisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICA7OworCisgIGxpbnV4KikKKyAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICAgdG1wX2FyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJYXJjaGl2ZV9jbWRzPSIkdG1wX2FyY2hpdmVfY21kcyIKKyAgICAgIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz1ubworICAgICAgY2FzZSBgJExEIC12IDI+L2Rldi9udWxsYCBpbgorICAgICAgICAqXCAwMS4qIHwgKlwgMi5bMC05XS4qIHwgKlwgMi4xMC4qKSA7OyAjIGNhdGNoIHZlcnNpb25zIDwgMi4xMQorICAgICAgICAqXCAyLjExLjkzLjAuMlwgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OyAjIFJINy4zIC4uLgorICAgICAgICAqXCAyLjExLjkyLjAuMTJcICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsgIyBNYW5kcmFrZSA4LjIgLi4uCisgICAgICAgICpcIDIuMTEuKikgOzsgIyBvdGhlciAyLjExIHZlcnNpb25zCisgICAgICAgICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsKKyAgICAgIGVzYWMKKyAgICAgIGlmIHRlc3QgJHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZyA9IHllczsgdGhlbgorICAgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckZWNobyAieyBnbG9iYWw6IiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KK2NhdCAkZXhwb3J0X3N5bWJvbHMgfCBzZWQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKyRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKyAgICAgICAgJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXZlcnNpb24tc2NyaXB0ICR7d2x9JG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyIC1vICRsaWInCisgICAgICBlbHNlCisgICAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9IiR0bXBfYXJjaGl2ZV9jbWRzIgorICAgICAgZmkKKyAgICAgIGxpbmtfYWxsX2RlcGxpYnM9bm8KKyAgICBlbHNlCisgICAgICBsZF9zaGxpYnM9bm8KKyAgICBmaQorICAgIDs7CisKKyAgICAqKQorICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisJYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlsZF9zaGxpYnM9bm8KKyAgICAgIGZpCisgICAgICA7OworICAgIGVzYWMKKworICAgIGlmIHRlc3QgIiRsZF9zaGxpYnMiID0geWVzOyB0aGVuCisgICAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tLXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworICAgICAgIyBhbmNpZW50IEdOVSBsZCBkaWRuJ3Qgc3VwcG9ydCAtLXdob2xlLWFyY2hpdmUgZXQuIGFsLgorICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnbm8td2hvbGUtYXJjaGl2ZScgPiAvZGV2L251bGw7IHRoZW4KKyAJd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9IiR3bGFyYyInLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICciJHdsYXJjIictLW5vLXdob2xlLWFyY2hpdmUnCisgICAgICBlbHNlCisgIAl3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0KKyAgICAgIGZpCisgICAgZmkKKyAgZWxzZQorICAgICMgUE9SVE1FIGZpbGwgaW4gYSBkZXNjcmlwdGlvbiBvZiB5b3VyIHN5c3RlbSdzIGxpbmtlciAobm90IEdOVSBsZCkKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgYWl4MyopCisgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAorICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzPXllcworICAgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJExEIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtYkU6JGV4cG9ydF9zeW1ib2xzIC1UNTEyIC1INTEyIC1iTTpTUkV+JEFSICRBUl9GTEFHUyAkbGliICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCisgICAgICAjIE5vdGU6IHRoaXMgbGlua2VyIGhhcmRjb2RlcyB0aGUgZGlyZWN0b3JpZXMgaW4gTElCUEFUSCBpZiB0aGVyZQorICAgICAgIyBhcmUgbm8gZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGJ5IC1MLgorICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzICYmIHRlc3QgLXogIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgorCSMgTmVpdGhlciBkaXJlY3QgaGFyZGNvZGluZyBub3Igc3RhdGljIGxpbmtpbmcgaXMgc3VwcG9ydGVkIHdpdGggYQorCSMgYnJva2VuIGNvbGxlY3QyLgorCWhhcmRjb2RlX2RpcmVjdD11bnN1cHBvcnRlZAorICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBhaXg0KiB8IGFpeDUqKQorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIE9uIElBNjQsIHRoZSBsaW5rZXIgZG9lcyBydW4gdGltZSBsaW5raW5nIGJ5IGRlZmF1bHQsIHNvIHdlIGRvbid0CisJIyBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuCisJYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubworCWV4cF9zeW1fZmxhZz0nLUJleHBvcnQnCisJbm9fZW50cnlfZmxhZz0iIgorICAgICAgZWxzZQorCSMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHdlIGRvbid0IHdhbnQgdGhlICItQyIgb3B0aW9uLgorCSMgLUMgbWVhbnMgZGVtYW5nbGUgdG8gQUlYIG5tLCBidXQgbWVhbnMgZG9uJ3QgZGVtYW5nbGUgd2l0aCBHTlUgbm0KKwlpZiAkTk0gLVYgMj4mMSB8IGdyZXAgJ0dOVScgPiAvZGV2L251bGw7IHRoZW4KKwkgIGV4cG9ydF9zeW1ib2xzX2NtZHM9JyROTSAtQnBnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJDIgPT0gIlQiKSB8fCAoXCQyID09ICJEIikgfHwgKFwkMiA9PSAiQiIpKSAmJiAoc3Vic3RyKFwkMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJworCWVsc2UKKwkgIGV4cG9ydF9zeW1ib2xzX2NtZHM9JyROTSAtQkNwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXCQyID09ICJUIikgfHwgKFwkMiA9PSAiRCIpIHx8IChcJDIgPT0gIkIiKSkgJiYgKHN1YnN0cihcJDMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFwkMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKKwlmaQorCWFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KKworCSMgVGVzdCBpZiB3ZSBhcmUgdHJ5aW5nIHRvIHVzZSBydW4gdGltZSBsaW5raW5nIG9yIG5vcm1hbAorCSMgQUlYIHN0eWxlIGxpbmtpbmcuIElmIC1icnRsIGlzIHNvbWV3aGVyZSBpbiBMREZMQUdTLCB3ZQorCSMgbmVlZCB0byBkbyBydW50aW1lIGxpbmtpbmcuCisJY2FzZSAkaG9zdF9vcyBpbiBhaXg0LlsyM118YWl4NC5bMjNdLip8YWl4NSopCisJICBmb3IgbGRfZmxhZyBpbiAkTERGTEFHUzsgZG8KKyAgCSAgaWYgKHRlc3QgJGxkX2ZsYWcgPSAiLWJydGwiIHx8IHRlc3QgJGxkX2ZsYWcgPSAiLVdsLC1icnRsIik7IHRoZW4KKyAgCSAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPXllcworICAJICAgIGJyZWFrCisgIAkgIGZpCisJICBkb25lCisJZXNhYworCisJZXhwX3N5bV9mbGFnPSctYmV4cG9ydCcKKwlub19lbnRyeV9mbGFnPSctYm5vZW50cnknCisgICAgICBmaQorCisgICAgICAjIFdoZW4gbGFyZ2UgZXhlY3V0YWJsZXMgb3Igc2hhcmVkIG9iamVjdHMgYXJlIGJ1aWx0LCBBSVggbGQgY2FuCisgICAgICAjIGhhdmUgcHJvYmxlbXMgY3JlYXRpbmcgdGhlIHRhYmxlIG9mIGNvbnRlbnRzLiAgSWYgbGlua2luZyBhIGxpYnJhcnkKKyAgICAgICMgb3IgcHJvZ3JhbSByZXN1bHRzIGluICJlcnJvciBUT0Mgb3ZlcmZsb3ciIGFkZCAtbW1pbmltYWwtdG9jIHRvCisgICAgICAjIENYWEZMQUdTL0NGTEFHUyBmb3IgZysrL2djYy4gIEluIHRoZSBjYXNlcyB3aGVyZSB0aGF0IGlzIG5vdAorICAgICAgIyBlbm91Z2ggdG8gZml4IHRoZSBwcm9ibGVtLCBhZGQgLVdsLC1iYmlndG9jIHRvIExERkxBR1MuCisKKyAgICAgIGFyY2hpdmVfY21kcz0nJworICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0nOicKKyAgICAgIGxpbmtfYWxsX2RlcGxpYnM9eWVzCisKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJY2FzZSAkaG9zdF9vcyBpbiBhaXg0LjAxMnxhaXg0LjAxMi4qKQorCSMgV2Ugb25seSB3YW50IHRvIGRvIHRoaXMgb24gQUlYIDQuMiBhbmQgbG93ZXIsIHRoZSBjaGVjaworCSMgYmVsb3cgZm9yIGJyb2tlbiBjb2xsZWN0MiBkb2Vzbid0IHdvcmsgdW5kZXIgNC4zKworCSAgY29sbGVjdDJuYW1lPWAke0NDfSAtcHJpbnQtcHJvZy1uYW1lPWNvbGxlY3QyYAorCSAgaWYgdGVzdCAtZiAiJGNvbGxlY3QybmFtZSIgJiYgXAorICAJICAgc3RyaW5ncyAiJGNvbGxlY3QybmFtZSIgfCBncmVwIHJlc29sdmVfbGliX25hbWUgPi9kZXYvbnVsbAorCSAgdGhlbgorICAJICAjIFdlIGhhdmUgcmV3b3JrZWQgY29sbGVjdDIKKyAgCSAgaGFyZGNvZGVfZGlyZWN0PXllcworCSAgZWxzZQorICAJICAjIFdlIGhhdmUgb2xkIGNvbGxlY3QyCisgIAkgIGhhcmRjb2RlX2RpcmVjdD11bnN1cHBvcnRlZAorICAJICAjIEl0IGZhaWxzIHRvIGZpbmQgdW5pbnN0YWxsZWQgbGlicmFyaWVzIHdoZW4gdGhlIHVuaW5zdGFsbGVkCisgIAkgICMgcGF0aCBpcyBub3QgbGlzdGVkIGluIHRoZSBsaWJwYXRoLiAgU2V0dGluZyBoYXJkY29kZV9taW51c19MCisgIAkgICMgdG8gdW5zdXBwb3J0ZWQgZm9yY2VzIHJlbGlua2luZworICAJICBoYXJkY29kZV9taW51c19MPXllcworICAJICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgIAkgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9CisJICBmaQorCWVzYWMKKwlzaGFyZWRfZmxhZz0nLXNoYXJlZCcKKyAgICAgIGVsc2UKKwkjIG5vdCB1c2luZyBnY2MKKwlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAJIyBWaXN1YWxBZ2UgQysrLCBWZXJzaW9uIDUuNSBmb3IgQUlYIDVMIGZvciBJQS02NCwgQmV0YSAzIFJlbGVhc2UKKyAgCSMgY2hva2VzIG9uIC1XbCwtRy4gVGhlIGZvbGxvd2luZyBsaW5lIGlzIGNvcnJlY3Q6CisJICBzaGFyZWRfZmxhZz0nLUcnCisJZWxzZQorICAJaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJICAgIHNoYXJlZF9mbGFnPScke3dsfS1HJworCSAgZWxzZQorCSAgICBzaGFyZWRfZmxhZz0nJHt3bH0tYk06U1JFJworICAJZmkKKwlmaQorICAgICAgZmkKKworICAgICAgIyBJdCBzZWVtcyB0aGF0IC1iZXhwYWxsIGRvZXMgbm90IGV4cG9ydCBzeW1ib2xzIGJlZ2lubmluZyB3aXRoCisgICAgICAjIHVuZGVyc2NvcmUgKF8pLCBzbyBpdCBpcyBiZXR0ZXIgdG8gZ2VuZXJhdGUgYSBsaXN0IG9mIHN5bWJvbHMgdG8gZXhwb3J0LgorICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzPXllcworICAgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVudGltZSBsb2FkaW5nIGZsYWdzICgtYnJ0bCksCisJIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgorCWFsbG93X3VuZGVmaW5lZF9mbGFnPSctYmVyb2snCisgICAgICAgIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuIGVtcHR5IGV4ZWN1dGFibGUuCisgICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisKK2FpeF9saWJwYXRoPWBkdW1wIC1IIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgJy9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsgL14wLyB7IHMvXjAgICpcKC4qXCkkL1wxLzsgcDsgfQorfSdgCisjIENoZWNrIGZvciBhIDY0LWJpdCBvYmplY3QgaWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcuCitpZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPWBkdW1wIC1IWDY0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgJy9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsgL14wLyB7IHMvXjAgICpcKC4qXCkkL1wxLzsgcDsgfQorfSdgOyBmaQorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitpZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPSIvdXNyL2xpYjovbGliIjsgZmkKKworICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCisJYXJjaGl2ZV9leHBzeW1fY21kcz0iXCRDQyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIGBpZiB0ZXN0ICJ4JHthbGxvd191bmRlZmluZWRfZmxhZ30iICE9ICJ4IjsgdGhlbiBlY2hvICIke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IjsgZWxzZSA6OyBmaWAgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyBcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMgJHNoYXJlZF9mbGFnIgorICAgICAgIGVsc2UKKwlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tUiAkbGliZGlyOi91c3IvbGliOi9saWInCisJICBhbGxvd191bmRlZmluZWRfZmxhZz0iLXogbm9kZWZzIgorCSAgYXJjaGl2ZV9leHBzeW1fY21kcz0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICciXCR7d2x9JG5vX2VudHJ5X2ZsYWcgXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzIgorCWVsc2UKKwkgIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuIGVtcHR5IGV4ZWN1dGFibGUuCisJIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorCithaXhfbGlicGF0aD1gZHVtcCAtSCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KK30nYAorIyBDaGVjayBmb3IgYSA2NC1iaXQgb2JqZWN0IGlmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLgoraWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD1gZHVtcCAtSFg2NCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KK30nYDsgZmkKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAoraWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD0iL3Vzci9saWI6L2xpYiI7IGZpCisKKwkgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKKwkgICMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1biB0aW1lIGxvYWRpbmcgZmxhZ3MsCisJICAjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCisJICBub191bmRlZmluZWRfZmxhZz0nICR7d2x9LWJlcm5vdG9rJworCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAke3dsfS1iZXJvaycKKwkgICMgLWJleHBhbGwgZG9lcyBub3QgZXhwb3J0IHN5bWJvbHMgYmVnaW5uaW5nIHdpdGggdW5kZXJzY29yZSAoXykKKwkgIGFsd2F5c19leHBvcnRfc3ltYm9scz15ZXMKKwkgICMgRXhwb3J0ZWQgc3ltYm9scyBjYW4gYmUgcHVsbGVkIGludG8gc2hhcmVkIG9iamVjdHMgZnJvbSBhcmNoaXZlcworCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JyAnCisJICBhcmNoaXZlX2NtZHNfbmVlZF9sYz15ZXMKKwkgICMgVGhpcyBpcyBzaW1pbGFyIHRvIGhvdyBBSVggdHJhZGl0aW9uYWxseSBidWlsZHMgaXQncyBzaGFyZWQgbGlicmFyaWVzLgorCSAgYXJjaGl2ZV9leHBzeW1fY21kcz0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1iRTokZXhwb3J0X3N5bWJvbHMgJHt3bH0tYm5vZW50cnkke2FsbG93X3VuZGVmaW5lZF9mbGFnfX4kQVIgJEFSX0ZMQUdTICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lJHJlbGVhc2UuYSAkb3V0cHV0X29iamRpci8kc29uYW1lJworCWZpCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFtaWdhb3MqKQorICAgICAgYXJjaGl2ZV9jbWRzPSckcm0gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBOQU1FICRsaWJuYW1lIiA+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTElCUkFSWV9JRCAxIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFZFUlNJT04gJG1ham9yIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFJFVklTSU9OICRyZXZpc2lvbiIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kQVIgJEFSX0ZMQUdTICRsaWIgJGxpYm9ianN+JFJBTkxJQiAkbGlifihjZCAkb3V0cHV0X29iamRpciAmJiBhMml4bGlicmFyeSAtMzIpJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICAgICMgc2VlIGNvbW1lbnQgYWJvdXQgZGlmZmVyZW50IHNlbWFudGljcyBvbiB0aGUgR05VIGxkIHNlY3Rpb24KKyAgICAgIGxkX3NobGlicz1ubworICAgICAgOzsKKworICAgIGJzZGk0KikKKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0tcmR5bmFtaWMKKyAgICAgIDs7CisKKyAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisgICAgICAjIFdoZW4gbm90IHVzaW5nIGdjYywgd2UgY3VycmVudGx5IGFzc3VtZSB0aGF0IHdlIGFyZSB1c2luZworICAgICAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KKyAgICAgICMgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywgYXMgdGhlcmUgaXMKKyAgICAgICMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScgJworICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKKyAgICAgICMgVGVsbCBsdG1haW4gdG8gbWFrZSAubGliIGZpbGVzLCBub3QgLmEgZmlsZXMuCisgICAgICBsaWJleHQ9bGliCisgICAgICAjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmRsbCBmaWxlcywgbm90IC5zbyBmaWxlcy4KKyAgICAgIHNocmV4dF9jbWRzPSIuZGxsIgorICAgICAgIyBGSVhNRTogU2V0dGluZyBsaW5rbmFtZXMgaGVyZSBpcyBhIGJhZCBoYWNrLgorICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLW8gJGxpYiAkbGlib2JqcyAkY29tcGlsZXJfZmxhZ3MgYGVjaG8gIiRkZXBsaWJzIiB8ICRTRUQgLWUgJ1wnJ3MvIC1sYyQvLydcJydgIC1saW5rIC1kbGx+bGlua25hbWVzPScKKyAgICAgICMgVGhlIGxpbmtlciB3aWxsIGF1dG9tYXRpY2FsbHkgYnVpbGQgYSAubGliIGZpbGUgaWYgd2UgYnVpbGQgYSBETEwuCisgICAgICBvbGRfYXJjaGl2ZV9Gcm9tX25ld19jbWRzPSd0cnVlJworICAgICAgIyBGSVhNRTogU2hvdWxkIGxldCB0aGUgdXNlciBzcGVjaWZ5IHRoZSBsaWIgcHJvZ3JhbS4KKyAgICAgIG9sZF9hcmNoaXZlX2NtZHM9J2xpYiAvT1VUOiRvbGRsaWIkb2xkb2JqcyRvbGRfZGVwbGlicycKKyAgICAgIGZpeF9zcmNmaWxlX3BhdGg9J2BjeWdwYXRoIC13ICIkc3JjZmlsZSJgJworICAgICAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcz15ZXMKKyAgICAgIDs7CisKKyAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICAgIGlmIHRlc3QgIiRHWFgiID0geWVzIDsgdGhlbgorICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9bm8KKyAgICAgIGNhc2UgIiRob3N0X29zIiBpbgorICAgICAgcmhhcHNvZHkqIHwgZGFyd2luMS5bMDEyXSkKKwlhbGxvd191bmRlZmluZWRfZmxhZz0nLXVuZGVmaW5lZCBzdXBwcmVzcycKKwk7OworICAgICAgKikgIyBEYXJ3aW4gMS4zIG9uCisgICAgICBpZiB0ZXN0IC16ICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUfSA7IHRoZW4KKyAgICAgIAlhbGxvd191bmRlZmluZWRfZmxhZz0nLWZsYXRfbmFtZXNwYWNlIC11bmRlZmluZWQgc3VwcHJlc3MnCisgICAgICBlbHNlCisgICAgICAgIGNhc2UgJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVR9IGluCisgICAgICAgICAgMTAuWzAxMl0pCisgICAgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0nLWZsYXRfbmFtZXNwYWNlIC11bmRlZmluZWQgc3VwcHJlc3MnCisgICAgICAgICAgICA7OworICAgICAgICAgIDEwLiopCisgICAgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0nLXVuZGVmaW5lZCBkeW5hbWljX2xvb2t1cCcKKyAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgIGZpCisJOzsKKyAgICAgIGVzYWMKKyAgICAJbHRfaW50X2FwcGxlX2NjX3NpbmdsZV9tb2Q9bm8KKyAgICAJb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2VjaG8nCisgICAgCWlmICRDQyAtZHVtcHNwZWNzIDI+JjEgfCBncmVwICdzaW5nbGVfbW9kdWxlJyA+L2Rldi9udWxsIDsgdGhlbgorICAgIAkgIGx0X2ludF9hcHBsZV9jY19zaW5nbGVfbW9kPXllcworICAgIAlmaQorICAgIAlpZiB0ZXN0ICJYJGx0X2ludF9hcHBsZV9jY19zaW5nbGVfbW9kIiA9IFh5ZXMgOyB0aGVuCisgICAgCSAgYXJjaGl2ZV9jbWRzPSckQ0MgLWR5bmFtaWNsaWIgLXNpbmdsZV9tb2R1bGUgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZycKKyAgICAJZWxzZQorICAgICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtciAke3dsfS1iaW5kX2F0X2xvYWQgLWtlZXBfcHJpdmF0ZV9leHRlcm5zIC1ub3N0ZGxpYiAtbyAke2xpYn0tbWFzdGVyLm8gJGxpYm9ianN+JENDIC1keW5hbWljbGliICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICR7bGlifS1tYXN0ZXIubyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nJworICAgICAgZmkKKyAgICAgIG1vZHVsZV9jbWRzPSckQ0MgJHt3bH0tYmluZF9hdF9sb2FkICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3MnCisgICAgICAjIERvbid0IGZpeCB0aGlzIGJ5IHVzaW5nIHRoZSBsZCAtZXhwb3J0ZWRfc3ltYm9sc19saXN0IGZsYWcsIGl0IGRvZXNuJ3QgZXhpc3QgaW4gb2xkZXIgZGFyd2luIGxkJ3MKKyAgICAgICAgaWYgdGVzdCAiWCRsdF9pbnRfYXBwbGVfY2Nfc2luZ2xlX21vZCIgPSBYeWVzIDsgdGhlbgorICAgICAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDIC1keW5hbWljbGliIC1zaW5nbGVfbW9kdWxlICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lICRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmd+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgICAgICBlbHNlCisgICAgICAgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgLXIgJHt3bH0tYmluZF9hdF9sb2FkIC1rZWVwX3ByaXZhdGVfZXh0ZXJucyAtbm9zdGRsaWIgLW8gJHtsaWJ9LW1hc3Rlci5vICRsaWJvYmpzfiRDQyAtZHluYW1pY2xpYiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAke2xpYn0tbWFzdGVyLm8gJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZ35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCisgICAgICAgIGZpCisgICAgICAgICAgbW9kdWxlX2V4cHN5bV9jbWRzPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFnc35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCisgICAgICBoYXJkY29kZV9kaXJlY3Q9bm8KKyAgICAgIGhhcmRjb2RlX2F1dG9tYXRpYz15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9dW5zdXBwb3J0ZWQKKyAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSctYWxsX2xvYWQgJGNvbnZlbmllbmNlJworICAgICAgbGlua19hbGxfZGVwbGlicz15ZXMKKyAgICBlbHNlCisgICAgICBsZF9zaGxpYnM9bm8KKyAgICBmaQorICAgICAgOzsKKworICAgIGRndXgqKQorICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICA7OworCisgICAgZnJlZWJzZDEqKQorICAgICAgbGRfc2hsaWJzPW5vCisgICAgICA7OworCisgICAgIyBGcmVlQlNEIDIuMi5bMDEyXSBhbGxvd3MgdXMgdG8gaW5jbHVkZSBjKytydDAubyB0byBnZXQgQysrIGNvbnN0cnVjdG9yCisgICAgIyBzdXBwb3J0LiAgRnV0dXJlIHZlcnNpb25zIGRvIHRoaXMgYXV0b21hdGljYWxseSwgYnV0IGFuIGV4cGxpY2l0IGMrK3J0MC5vCisgICAgIyBkb2VzIG5vdCBicmVhayBhbnl0aGluZywgYW5kIGhlbHBzIHNpZ25pZmljYW50bHkgKGF0IHRoZSBjb3N0IG9mIGEgbGl0dGxlCisgICAgIyBleHRyYSBzcGFjZSkuCisgICAgZnJlZWJzZDIuMiopCisgICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgL3Vzci9saWIvYysrcnQwLm8nCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICA7OworCisgICAgIyBVbmZvcnR1bmF0ZWx5LCBvbGRlciB2ZXJzaW9ucyBvZiBGcmVlQlNEIDIgZG8gbm90IGhhdmUgdGhpcyBmZWF0dXJlLgorICAgIGZyZWVic2QyKikKKyAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICA7OworCisgICAgIyBGcmVlQlNEIDMgYW5kIGdyZWF0ZXIgdXNlcyBnY2MgLXNoYXJlZCB0byBkbyBzaGFyZWQgbGlicmFyaWVzLgorICAgIGZyZWVic2QqIHwga2ZyZWVic2QqLWdudSkKKyAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICA7OworCisgICAgaHB1eDkqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlhcmNoaXZlX2NtZHM9JyRybSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRDQyAtc2hhcmVkIC1mUElDICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzPSckcm0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kTEQgLWIgK2IgJGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKKyAgICAgIGZpCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfStiICR7d2x9JGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgorICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworCisgICAgICAjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAorICAgICAgIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCisgICAgICBoYXJkY29kZV9taW51c19MPXllcworICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1FJworICAgICAgOzsKKworICAgIGhwdXgxMCogfCBocHV4MTEqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgLWEgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCWNhc2UgIiRob3N0X2NwdSIgaW4KKwlocHBhKjY0KnxpYTY0KikKKwkgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCSopCisJICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCWVzYWMKKyAgICAgIGVsc2UKKwljYXNlICIkaG9zdF9jcHUiIGluCisJaHBwYSo2NCp8aWE2NCopCisJICBhcmNoaXZlX2NtZHM9JyRMRCAtYiAraCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIDs7CisJKikKKwkgIGFyY2hpdmVfY21kcz0nJExEIC1iICtoICRzb25hbWUgK2IgJGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCWNhc2UgIiRob3N0X2NwdSIgaW4KKwlocHBhKjY0KikKKwkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZD0nK2IgJGxpYmRpcicKKwkgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgorCSAgaGFyZGNvZGVfZGlyZWN0PW5vCisJICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisJICA7OworCWlhNjQqKQorCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworCSAgaGFyZGNvZGVfZGlyZWN0PW5vCisJICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisKKwkgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCisJICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKwkgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisJICA7OworCSopCisJICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfStiICR7d2x9JGxpYmRpcicKKwkgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgorCSAgaGFyZGNvZGVfZGlyZWN0PXllcworCSAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1FJworCisJICAjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAorCSAgIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCisJICBoYXJkY29kZV9taW51c19MPXllcworCSAgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgOzsKKworICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworICAgICAgZWxzZQorCWFyY2hpdmVfY21kcz0nJExEIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkPSctcnBhdGggJGxpYmRpcicKKyAgICAgIGZpCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKKyAgICAgIGxpbmtfYWxsX2RlcGxpYnM9eWVzCisgICAgICA7OworCisgICAgbmV0YnNkKiB8IGtuZXRic2QqLWdudSkKKyAgICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKwlhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnICAjIGEub3V0CisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzPSckTEQgLXNoYXJlZCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnICAgICAgIyBFTEYKKyAgICAgIGZpCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICA7OworCisgICAgbmV3c29zNikKKyAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICA7OworCisgICAgb3BlbmJzZCopCisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCwkbGliZGlyJworCWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tRScKKyAgICAgIGVsc2UKKyAgICAgICBjYXNlICRob3N0X29zIGluCisJIG9wZW5ic2RbMDFdLiogfCBvcGVuYnNkMi5bMC03XSB8IG9wZW5ic2QyLlswLTddLiopCisJICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCSAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKKwkgICA7OworCSAqKQorCSAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJICAgOzsKKyAgICAgICBlc2FjCisgICAgICBmaQorICAgICAgOzsKKworICAgIG9zMiopCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgICBoYXJkY29kZV9taW51c19MPXllcworICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKKyAgICAgIGFyY2hpdmVfY21kcz0nJGVjaG8gIkxJQlJBUlkgJGxpYm5hbWUgSU5JVElOU1RBTkNFIiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyAiREVTQ1JJUFRJT04gXCIkbGlibmFtZVwiIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gREFUQSA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gIiBTSU5HTEUgTk9OU0hBUkVEIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gRVhQT1JUUyA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+ZW14ZXhwICRsaWJvYmpzID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kQ0MgLVpkbGwgLVpjcnRkbGwgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmJworICAgICAgb2xkX2FyY2hpdmVfRnJvbV9uZXdfY21kcz0nZW14aW1wIC1vICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmEgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmJworICAgICAgOzsKKworICAgIG9zZjMqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlhbGxvd191bmRlZmluZWRfZmxhZz0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCisJYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlhbGxvd191bmRlZmluZWRfZmxhZz0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKKwlhcmNoaXZlX2NtZHM9JyRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKyAgICAgIGZpCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKKyAgICAgIDs7CisKKyAgICBvc2Y0KiB8IG9zZjUqKQkjIGFzIG9zZjMqIHdpdGggdGhlIGFkZGl0aW9uIG9mIC1tc3ltIGZsYWcKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJworCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tbXN5bSAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBlbHNlCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCisJYXJjaGl2ZV9jbWRzPSckTEQgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLW1zeW0gLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJYXJjaGl2ZV9leHBzeW1fY21kcz0nZm9yIGkgaW4gYGNhdCAkZXhwb3J0X3N5bWJvbHNgOyBkbyBwcmludGYgIiVzICVzXFxuIiAtZXhwb3J0ZWRfc3ltYm9sICJcJGkiID4+ICRsaWIuZXhwOyBkb25lOyBlY2hvICItaGlkZGVuIj4+ICRsaWIuZXhwfgorCSRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWlucHV0ICRsaWIuZXhwICRsaW5rZXJfZmxhZ3MgJGxpYm9ianMgJGRlcGxpYnMgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYn4kcm0gJGxpYi5leHAnCisKKwkjIEJvdGggYyBhbmQgY3h4IGNvbXBpbGVyIHN1cHBvcnQgLXJwYXRoIGRpcmVjdGx5CisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLXJwYXRoICRsaWJkaXInCisgICAgICBmaQorICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisgICAgICA7OworCisgICAgc2NvMy4ydjUqKQorICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUJleHBvcnQnCisgICAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorICAgICAgaGFyZGNvZGVfcnVucGF0aF92YXI9eWVzCisgICAgICA7OworCisgICAgc29sYXJpcyopCisgICAgICBub191bmRlZmluZWRfZmxhZz0nIC16IHRleHQnCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJYXJjaGl2ZV9leHBzeW1fY21kcz0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+JGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJICAkQ0MgLXNoYXJlZCAke3dsfS1NICR7d2x9JGxpYi5leHAgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+JHJtICRsaWIuZXhwJworICAgICAgZWxzZQorCWFyY2hpdmVfY21kcz0nJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJYXJjaGl2ZV9leHBzeW1fY21kcz0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+JGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisgIAkkTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtTSAkbGliLmV4cCAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFnc34kcm0gJGxpYi5leHAnCisgICAgICBmaQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgc29sYXJpczIuWzAtNV0gfCBzb2xhcmlzMi5bMC01XS4qKSA7OworICAgICAgKikgIyBTdXBwb3J0ZWQgc2luY2UgU29sYXJpcyAyLjYgKG1heWJlIDIuNS4xPykKKwl3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nLXogYWxsZXh0cmFjdCRjb252ZW5pZW5jZSAteiBkZWZhdWx0ZXh0cmFjdCcgOzsKKyAgICAgIGVzYWMKKyAgICAgIGxpbmtfYWxsX2RlcGxpYnM9eWVzCisgICAgICA7OworCisgICAgc3Vub3M0KikKKyAgICAgIGlmIHRlc3QgIngkaG9zdF92ZW5kb3IiID0geHNlcXVlbnQ7IHRoZW4KKwkjIFVzZSAkQ0MgdG8gbGluayB1bmRlciBzZXF1ZW50LCBiZWNhdXNlIGl0IHRocm93cyBpbiBzb21lIGV4dHJhIC5vCisJIyBmaWxlcyB0aGF0IG1ha2UgLmluaXQgYW5kIC5maW5pIHNlY3Rpb25zIHdvcmsuCisJYXJjaGl2ZV9jbWRzPSckQ0MgLUcgJHt3bH0taCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZWxzZQorCWFyY2hpdmVfY21kcz0nJExEIC1hc3NlcnQgcHVyZS10ZXh0IC1Cc3RhdGljIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGZpCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICBoYXJkY29kZV9taW51c19MPXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgOzsKKworICAgIHN5c3Y0KQorICAgICAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KKwlzbmkpCisJICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIGhhcmRjb2RlX2RpcmVjdD15ZXMgIyBpcyB0aGlzIHJlYWxseSB0cnVlPz8/CisJOzsKKwlzaWVtZW5zKQorCSAgIyMgTEQgaXMgbGQgaXQgbWFrZXMgYSBQTEFNTElCCisJICAjIyBDQyBqdXN0IG1ha2VzIGEgR3Jvc3NNb2R1bGUuCisJICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICByZWxvYWRfY21kcz0nJENDIC1yIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCisJICBoYXJkY29kZV9kaXJlY3Q9bm8KKyAgICAgICAgOzsKKwltb3Rvcm9sYSkKKwkgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCSAgaGFyZGNvZGVfZGlyZWN0PW5vICNNb3Rvcm9sYSBtYW51YWwgc2F5cyB5ZXMsIGJ1dCBteSB0ZXN0cyBzYXkgdGhleSBsaWUKKwk7OworICAgICAgZXNhYworICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgOzsKKworICAgIHN5c3Y0LjMqKQorICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9Jy1CZXhwb3J0JworICAgICAgOzsKKworICAgIHN5c3Y0Kk1QKikKKyAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KKwlhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwloYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisJcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKwloYXJkY29kZV9ydW5wYXRoX3Zhcj15ZXMKKwlsZF9zaGxpYnM9eWVzCisgICAgICBmaQorICAgICAgOzsKKworICAgIHN5c3Y0LjJ1dzIqKQorICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgaGFyZGNvZGVfbWludXNfTD1ubworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgaGFyZGNvZGVfcnVucGF0aF92YXI9eWVzCisgICAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorICAgICAgOzsKKworICAgc3lzdjVPcGVuVU5JWDgqIHwgc3lzdjVVbml4V2FyZTcqIHwgIHN5c3Y1dXdbNzhdKiB8IHVuaXh3YXJlNyopCisgICAgICBub191bmRlZmluZWRfZmxhZz0nJHt3bH0teiAke3dsfXRleHQnCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzPSckQ0MgLUcgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBmaQorICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgOzsKKworICAgIHN5c3Y1KikKKyAgICAgIG5vX3VuZGVmaW5lZF9mbGFnPScgLXogdGV4dCcKKyAgICAgICMgJENDIC1zaGFyZWQgd2l0aG91dCBHTlUgbGQgd2lsbCBub3QgY3JlYXRlIGEgbGlicmFyeSBmcm9tIEMrKworICAgICAgIyBvYmplY3QgZmlsZXMgYW5kIGEgc3RhdGljIGxpYnN0ZGMrKywgYmV0dGVyIGF2b2lkIGl0IGJ5IG5vdworICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorICAJCSRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1NICRsaWIuZXhwIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfiRybSAkbGliLmV4cCcKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9CisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisgICAgICA7OworCisgICAgdXRzNCopCisgICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgbGRfc2hsaWJzPW5vCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsZF9zaGxpYnMiID4mNQorJGFzX2VjaG8gIiRsZF9zaGxpYnMiID4mNjsgfQordGVzdCAiJGxkX3NobGlicyIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCisKK3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSJQQVRIICRzaGxpYnBhdGhfdmFyICRydW5wYXRoX3ZhciIKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsgR0NDX0VYRUNfUFJFRklYIENPTVBJTEVSX1BBVEggTElCUkFSWV9QQVRIIgorZmkKKworIworIyBEbyB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgbGluayBsaWJjPworIworY2FzZSAieCRhcmNoaXZlX2NtZHNfbmVlZF9sYyIgaW4KK3h8eHllcykKKyAgIyBBc3N1bWUgLWxjIHNob3VsZCBiZSBhZGRlZAorICBhcmNoaXZlX2NtZHNfbmVlZF9sYz15ZXMKKworICBpZiB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBjYXNlICRhcmNoaXZlX2NtZHMgaW4KKyAgICAqJ34nKikKKyAgICAgICMgRklYTUU6IHdlIG1heSBoYXZlIHRvIGRlYWwgd2l0aCBtdWx0aS1jb21tYW5kIHNlcXVlbmNlcy4KKyAgICAgIDs7CisgICAgJyRDQyAnKikKKyAgICAgICMgVGVzdCB3aGV0aGVyIHRoZSBjb21waWxlciBpbXBsaWNpdGx5IGxpbmtzIHdpdGggLWxjIHNpbmNlIG9uIHNvbWUKKyAgICAgICMgc3lzdGVtcywgLWxnY2MgaGFzIHRvIGNvbWUgYmVmb3JlIC1sYy4gSWYgZ2NjIGFscmVhZHkgcGFzc2VzIC1sYworICAgICAgIyB0byBsZCwgZG9uJ3QgYWRkIC1sYyBiZWZvcmUgLWxnY2MuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgLWxjIHNob3VsZCBiZSBleHBsaWNpdGx5IGxpbmtlZCBpbiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4uLi4gIiA+JjY7IH0KKyAgICAgICRybSBjb25mdGVzdCoKKyAgICAgIHByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisKKyAgICAgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19jb21waWxlXCIiOyB9ID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gMj5jb25mdGVzdC5lcnI7IHRoZW4KKyAgICAgICAgc29uYW1lPWNvbmZ0ZXN0CisgICAgICAgIGxpYj1jb25mdGVzdAorICAgICAgICBsaWJvYmpzPWNvbmZ0ZXN0LiRhY19vYmpleHQKKyAgICAgICAgZGVwbGlicz0KKyAgICAgICAgd2w9JGx0X3Byb2dfY29tcGlsZXJfd2wKKyAgICAgICAgY29tcGlsZXJfZmxhZ3M9LXYKKyAgICAgICAgbGlua2VyX2ZsYWdzPS12CisgICAgICAgIHZlcnN0cmluZz0KKyAgICAgICAgb3V0cHV0X29iamRpcj0uCisgICAgICAgIGxpYm5hbWU9Y29uZnRlc3QKKyAgICAgICAgbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZz0kYWxsb3dfdW5kZWZpbmVkX2ZsYWcKKyAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9CisgICAgICAgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhcmNoaXZlX2NtZHMgMlw+XCYxIFx8IGdyZXAgXCIgLWxjIFwiIFw+L2Rldi9udWxsIDJcPlwmMVwiIjsgfSA+JjUKKyAgKGV2YWwgJGFyY2hpdmVfY21kcyAyXD5cJjEgXHwgZ3JlcCBcIiAtbGMgXCIgXD4vZGV2L251bGwgMlw+XCYxKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfQorICAgICAgICB0aGVuCisJICBhcmNoaXZlX2NtZHNfbmVlZF9sYz1ubworICAgICAgICBlbHNlCisJICBhcmNoaXZlX2NtZHNfbmVlZF9sYz15ZXMKKyAgICAgICAgZmkKKyAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWcKKyAgICAgIGVsc2UKKyAgICAgICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1CisgICAgICBmaQorICAgICAgJHJtIGNvbmZ0ZXN0KgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhcmNoaXZlX2NtZHNfbmVlZF9sYyIgPiY1CiskYXNfZWNobyAiJGFyY2hpdmVfY21kc19uZWVkX2xjIiA+JjY7IH0KKyAgICAgIDs7CisgICAgZXNhYworICBmaQorICA7OworZXNhYworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGR5bmFtaWMgbGlua2VyIGNoYXJhY3RlcmlzdGljcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MuLi4gIiA+JjY7IH0KK2xpYnJhcnlfbmFtZXNfc3BlYz0KK2xpYm5hbWVfc3BlYz0nbGliJG5hbWUnCitzb25hbWVfc3BlYz0KK3NocmV4dF9jbWRzPSIuc28iCitwb3N0aW5zdGFsbF9jbWRzPQorcG9zdHVuaW5zdGFsbF9jbWRzPQorZmluaXNoX2NtZHM9CitmaW5pc2hfZXZhbD0KK3NobGlicGF0aF92YXI9CitzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9dW5rbm93bgordmVyc2lvbl90eXBlPW5vbmUKK2R5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKK3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIgoraWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgZ3JlcCAiXmxpYnJhcmllczoiIHwgJFNFRCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciYAorICBpZiBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8IGdyZXAgJzsnID4vZGV2L251bGwgOyB0aGVuCisgICAgIyBpZiB0aGUgcGF0aCBjb250YWlucyAiOyIgdGhlbiB3ZSBhc3N1bWUgaXQgdG8gYmUgdGhlIHNlcGFyYXRvcgorICAgICMgb3RoZXJ3aXNlIGRlZmF1bHQgdG8gdGhlIHN0YW5kYXJkIHBhdGggc2VwYXJhdG9yIChpLmUuICI6IikgLSBpdCBpcworICAgICMgYXNzdW1lZCB0aGF0IG5vIHBhcnQgb2YgYSBub3JtYWwgcGF0aG5hbWUgY29udGFpbnMgIjsiIGJ1dCB0aGF0IHNob3VsZAorICAgICMgb2theSBpbiB0aGUgcmVhbCB3b3JsZCB3aGVyZSAiOyIgaW4gZGlycGF0aHMgaXMgaXRzZWxmIHByb2JsZW1hdGljLgorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICdzLzsvIC9nJ2AKKyAgZWxzZQorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICAtZSAicy8kUEFUSF9TRVBBUkFUT1IvIC9nImAKKyAgZmkKK2Vsc2UKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgorZmkKK25lZWRfbGliX3ByZWZpeD11bmtub3duCitoYXJkY29kZV9pbnRvX2xpYnM9bm8KKworIyB3aGVuIHlvdSBzZXQgbmVlZF92ZXJzaW9uIHRvIG5vLCBtYWtlIHN1cmUgaXQgZG9lcyBub3QgY2F1c2UgLXNldF92ZXJzaW9uCisjIGZsYWdzIHRvIGJlIGxlZnQgd2l0aG91dCBhcmd1bWVudHMKK25lZWRfdmVyc2lvbj11bmtub3duCisKK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeDMqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lLmEnCisgIHNobGlicGF0aF92YXI9TElCUEFUSAorCisgICMgQUlYIDMgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gd2UgYXBwZW5kIGEgbWFqb3IgdmVyc2lvbiB0byB0aGUgbmFtZS4KKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgOzsKKworYWl4NCogfCBhaXg1KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAgICMgQUlYIDUgc3VwcG9ydHMgSUE2NAorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGVsc2UKKyAgICAjIFdpdGggR0NDIHVwIHRvIDIuOTUueCwgY29sbGVjdDIgd291bGQgY3JlYXRlIGFuIGltcG9ydCBmaWxlCisgICAgIyBmb3IgZGVwZW5kZW5jZSBsaWJyYXJpZXMuICBUaGUgaW1wb3J0IGZpbGUgd291bGQgc3RhcnQgd2l0aAorICAgICMgdGhlIGxpbmUgYCMhIC4nLiAgVGhpcyB3b3VsZCBjYXVzZSB0aGUgZ2VuZXJhdGVkIGxpYnJhcnkgdG8KKyAgICAjIGRlcGVuZCBvbiBgLicsIGFsd2F5cyBhbiBpbnZhbGlkIGxpYnJhcnkuICBUaGlzIHdhcyBmaXhlZCBpbgorICAgICMgZGV2ZWxvcG1lbnQgc25hcHNob3RzIG9mIEdDQyBwcmlvciB0byAzLjAuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgYWl4NCB8IGFpeDQuWzAxXSB8IGFpeDQuWzAxXS4qKQorICAgICAgaWYgeyBlY2hvICcjaWYgX19HTlVDX18gPiAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID49IDk3KScKKwkgICBlY2hvICcgeWVzICcKKwkgICBlY2hvICcjZW5kaWYnOyB9IHwgJHtDQ30gLUUgLSB8IGdyZXAgeWVzID4gL2Rldi9udWxsOyB0aGVuCisJOgorICAgICAgZWxzZQorCWNhbl9idWlsZF9zaGFyZWQ9bm8KKyAgICAgIGZpCisgICAgICA7OworICAgIGVzYWMKKyAgICAjIEFJWCAob24gUG93ZXIqKSBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyBjdXJyZW50bHkgd2UgY2FuIG5vdCBoYXJkY29kZSBjb3JyZWN0CisgICAgIyBzb25hbWUgaW50byBleGVjdXRhYmxlLiBQcm9iYWJseSB3ZSBjYW4gYWRkIHZlcnNpb25pbmcgc3VwcG9ydCB0bworICAgICMgY29sbGVjdDIsIHNvIGFkZGl0aW9uYWwgbGlua3MgY2FuIGJlIHVzZWZ1bCBpbiBmdXR1cmUuCisgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisgICAgICAjIElmIHVzaW5nIHJ1biB0aW1lIGxpbmtpbmcgKG9uIEFJWCA0LjIgb3IgbGF0ZXIpIHVzZSBsaWI8bmFtZT4uc28KKyAgICAgICMgaW5zdGVhZCBvZiBsaWI8bmFtZT4uYSB0byBsZXQgcGVvcGxlIGtub3cgdGhhdCB0aGVzZSBhcmUgbm90CisgICAgICAjIHR5cGljYWwgQUlYIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBlbHNlCisgICAgICAjIFdlIHByZXNlcnZlIC5hIGFzIGV4dGVuc2lvbiBmb3Igc2hhcmVkIGxpYnJhcmllcyB0aHJvdWdoIEFJWDQuMgorICAgICAgIyBhbmQgbGF0ZXIgd2hlbiB3ZSBhcmUgbm90IGRvaW5nIHJ1biB0aW1lIGxpbmtpbmcuCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LmEgJGxpYm5hbWUuYScKKyAgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgZmkKKyAgICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKKyAgZmkKKyAgOzsKKworYW1pZ2FvcyopCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuaXhsaWJyYXJ5ICRsaWJuYW1lLmEnCisgICMgQ3JlYXRlICR7bGlibmFtZX1faXhsaWJyYXJ5LmEgZW50cmllcyBpbiAvc3lzL2xpYnMuCisgIGZpbmlzaF9ldmFsPSdmb3IgbGliIGluIGBscyAkbGliZGlyLyouaXhsaWJyYXJ5IDI+L2Rldi9udWxsYDsgZG8gbGlibmFtZT1gJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdcJydzJV4uKi9cKFteL10qXClcLml4bGlicmFyeSQlXDElJ1wnJ2A7IHRlc3QgJHJtIC9zeXMvbGlicy8ke2xpYm5hbWV9X2l4bGlicmFyeS5hOyAkc2hvdyAiY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSI7IGNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEgfHwgZXhpdCAxOyBkb25lJworICA7OworCitiZW9zKikKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgorICBzaGxpYnBhdGhfdmFyPUxJQlJBUllfUEFUSAorICA7OworCitic2RpNCopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvWDExL2xpYiAvdXNyL2NvbnRyaWIvbGliIC9saWIgL3Vzci9sb2NhbC9saWIiCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIiCisgICMgdGhlIGRlZmF1bHQgbGQuc28uY29uZiBhbHNvIGNvbnRhaW5zIC91c3IvY29udHJpYi9saWIgYW5kCisgICMgL3Vzci9YMTFSNi9saWIgKC91c3IvWDExIGlzIGEgbGluayB0byAvdXNyL1gxMVI2KSwgYnV0IGxldCB1cyBhbGxvdworICAjIGxpYnRvb2wgdG8gaGFyZC1jb2RlIHRoZXNlIGludG8gcHJvZ3JhbXMKKyAgOzsKKworY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQorICB2ZXJzaW9uX3R5cGU9d2luZG93cworICBzaHJleHRfY21kcz0iLmRsbCIKKyAgbmVlZF92ZXJzaW9uPW5vCisgIG5lZWRfbGliX3ByZWZpeD1ubworCisgIGNhc2UgJEdDQywkaG9zdF9vcyBpbgorICB5ZXMsY3lnd2luKiB8IHllcyxtaW5ndyogfCB5ZXMscHczMiopCisgICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5kbGwuYScKKyAgICAjIERMTCBpcyBpbnN0YWxsZWQgdG8gJChsaWJkaXIpLy4uL2JpbiBieSBwb3N0aW5zdGFsbF9jbWRzCisgICAgcG9zdGluc3RhbGxfY21kcz0nYmFzZV9maWxlPWBiYXNlbmFtZSBcJHtmaWxlfWB+CisgICAgICBkbHBhdGg9YCRTSEVMTCAyPiYxIC1jICdcJycuICRkaXIvJ1wnJ1wke2Jhc2VfZmlsZX0nXCcnaTtlY2hvIFwkZGxuYW1lJ1wnJ2B+CisgICAgICBkbGRpcj0kZGVzdGRpci9gZGlybmFtZSBcJGRscGF0aGB+CisgICAgICB0ZXN0IC1kIFwkZGxkaXIgfHwgbWtkaXIgLXAgXCRkbGRpcn4KKyAgICAgICRpbnN0YWxsX3Byb2cgJGRpci8kZGxuYW1lIFwkZGxkaXIvJGRsbmFtZScKKyAgICBwb3N0dW5pbnN0YWxsX2NtZHM9J2RsZGxsPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZmlsZTsgZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxwYXRoPSRkaXIvXCRkbGRsbH4KKyAgICAgICAkcm0gXCRkbHBhdGgnCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGN5Z3dpbiopCisgICAgICAjIEN5Z3dpbiBETExzIHVzZSAnY3lnJyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKKyAgICAgIHNvbmFtZV9zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvY3lnLydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIgL2xpYi93MzJhcGkgL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgICAgIDs7CisgICAgbWluZ3cqKQorICAgICAgIyBNaW5HVyBETExzIHVzZSB0cmFkaXRpb25hbCAnbGliJyBwcmVmaXgKKyAgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IGdyZXAgIl5saWJyYXJpZXM6IiB8ICRTRUQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgInMsPS8sLyxnImAKKyAgICAgIGlmIGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgZ3JlcCAnO1tjLXpDLVpdOi8nID4vZGV2L251bGw7IHRoZW4KKyAgICAgICAgIyBJdCBpcyBtb3N0IHByb2JhYmx5IGEgV2luZG93cyBmb3JtYXQgUEFUSCBwcmludGVkIGJ5CisgICAgICAgICMgbWluZ3cgZ2NjLCBidXQgd2UgYXJlIHJ1bm5pbmcgb24gQ3lnd2luLiBHY2MgcHJpbnRzIGl0cyBzZWFyY2gKKyAgICAgICAgIyBwYXRoIHdpdGggOyBzZXBhcmF0b3JzLCBhbmQgd2l0aCBkcml2ZSBsZXR0ZXJzLiBXZSBjYW4gaGFuZGxlIHRoZQorICAgICAgICAjIGRyaXZlIGxldHRlcnMgKGN5Z3dpbiBmaWxldXRpbHMgdW5kZXJzdGFuZHMgdGhlbSksIHNvIGxlYXZlIHRoZW0sCisgICAgICAgICMgZXNwZWNpYWxseSBhcyB3ZSBtaWdodCBwYXNzIGZpbGVzIGZvdW5kIHRoZXJlIHRvIGEgbWluZ3cgb2JqZHVtcCwKKyAgICAgICAgIyB3aGljaCB3b3VsZG4ndCB1bmRlcnN0YW5kIGEgY3lnd2luaWZpZWQgcGF0aC4gQWhoLgorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAtZSAncy87LyAvZydgCisgICAgICBlbHNlCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICAtZSAicy8kUEFUSF9TRVBBUkFUT1IvIC9nImAKKyAgICAgIGZpCisgICAgICA7OworICAgIHB3MzIqKQorICAgICAgIyBwdzMyIERMTHMgdXNlICdwdycgcHJlZml4IHJhdGhlciB0aGFuICdsaWInCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9J2BlY2hvICR7bGlibmFtZX0gfCBzZWQgLWUgJ3MvXmxpYi9wdy8nYGBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzLy4vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JworICAgICAgOzsKKyAgICBlc2FjCisgICAgOzsKKworICAqKQorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUubGliJworICAgIDs7CisgIGVzYWMKKyAgZHluYW1pY19saW5rZXI9J1dpbjMyIGxkLmV4ZScKKyAgIyBGSVhNRTogZmlyc3Qgd2Ugc2hvdWxkIHNlYXJjaCAuIGFuZCB0aGUgZGlyZWN0b3J5IHRoZSBleGVjdXRhYmxlIGlzIGluCisgIHNobGlicGF0aF92YXI9UEFUSAorICA7OworCitkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZHlsZCIKKyAgdmVyc2lvbl90eXBlPWRhcndpbgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3ZlcnN1ZmZpeH0kc2hhcmVkX2V4dCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7bWFqb3J9JHNoYXJlZF9leHQgJHtsaWJuYW1lfSRzaGFyZWRfZXh0JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0JworICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIHNobGlicGF0aF92YXI9RFlMRF9MSUJSQVJZX1BBVEgKKyAgc2hyZXh0X2NtZHM9JyQodGVzdCAuJG1vZHVsZSA9IC55ZXMgJiYgZWNobyAuc28gfHwgZWNobyAuZHlsaWIpJworICAjIEFwcGxlJ3MgZ2NjIHByaW50cyAnZ2NjIC1wcmludC1zZWFyY2gtZGlycycgZG9lc24ndCBvcGVyYXRlIHRoZSBzYW1lLgorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IHRyICJcbiIgIiRQQVRIX1NFUEFSQVRPUiIgfCBzZWQgLWUgJ3MvbGlicmFyaWVzOi9AbGlicmFyaWVzOi8nIHwgdHIgIkAiICJcbiIgfCBncmVwICJebGlicmFyaWVzOiIgfCBzZWQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgInMsPS8sLyxnIiAtZSAicywkUEFUSF9TRVBBUkFUT1IsICxnIiAtZSAicywuKiwmIC9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIsZyJgCisgIGVsc2UKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWInCisgIGZpCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvbGliIC91c3IvbGliJworICA7OworCitkZ3V4KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSRzaGFyZWRfZXh0JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCitmcmVlYnNkMSopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7CisKK2tmcmVlYnNkKi1nbnUpCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGR5bmFtaWNfbGlua2VyPSdHTlUgbGQuc28nCisgIDs7CisKK2ZyZWVic2QqKQorICBvYmpmb3JtYXQ9YHRlc3QgLXggL3Vzci9iaW4vb2JqZm9ybWF0ICYmIC91c3IvYmluL29iamZvcm1hdCB8fCBlY2hvIGFvdXRgCisgIHZlcnNpb25fdHlwZT1mcmVlYnNkLSRvYmpmb3JtYXQKKyAgY2FzZSAkdmVyc2lvbl90eXBlIGluCisgICAgZnJlZWJzZC1lbGYqKQorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgICBuZWVkX3ZlcnNpb249bm8KKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgOzsKKyAgICBmcmVlYnNkLSopCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgICAgIG5lZWRfdmVyc2lvbj15ZXMKKyAgICAgIDs7CisgIGVzYWMKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBmcmVlYnNkMiopCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIDs7CisgIGZyZWVic2QzLjAxKiB8IGZyZWVic2RlbGYzLjAxKikKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIDs7CisgICopICMgZnJvbSAzLjIgb24KKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgOzsKKyAgZXNhYworICA7OworCitnbnUqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHttYWpvcn0gJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCisgICMgR2l2ZSBhIHNvbmFtZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBtYWpvciB2ZXJzaW9uIHNvIHRoYXQgZGxkLnNsIHJlZnVzZXMgdG8KKyAgIyBsaW5rIGFnYWluc3Qgb3RoZXIgdmVyc2lvbnMuCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGNhc2UgIiRob3N0X2NwdSIgaW4KKyAgaWE2NCopCisgICAgc2hyZXh0X2NtZHM9Jy5zbycKKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbyIKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMgIyBVbmxlc3MgK25vZW52dmFyIGlzIHNwZWNpZmllZC4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIGlmIHRlc3QgIlgkSFBVWF9JQTY0X01PREUiID0gWDMyOyB0aGVuCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYi9ocHV4MzIgL3Vzci9sb2NhbC9saWIiCisgICAgZWxzZQorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9ocHV4NjQgL3Vzci9sb2NhbC9saWIvaHB1eDY0IgorICAgIGZpCisgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYworICAgIDs7CisgICBocHBhKjY0KikKKyAgICAgc2hyZXh0X2NtZHM9Jy5zbCcKKyAgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgorICAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSCAjIEhvdyBzaG91bGQgd2UgaGFuZGxlIFNITElCX1BBVEgKKyAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgorICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9wYTIwXzY0IC91c3IvY2NzL2xpYi9wYTIwXzY0IgorICAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCisgICAgIDs7CisgICAqKQorICAgIHNocmV4dF9jbWRzPScuc2wnCisgICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKKyAgICBzaGxpYnBhdGhfdmFyPVNITElCX1BBVEgKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8gIyArcyBpcyByZXF1aXJlZCB0byBlbmFibGUgU0hMSUJfUEFUSAorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgOzsKKyAgZXNhYworICAjIEhQLVVYIHJ1bnMgKnJlYWxseSogc2xvd2x5IHVubGVzcyBzaGFyZWQgbGlicmFyaWVzIGFyZSBtb2RlIDU1NS4KKyAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgNTU1ICRsaWInCisgIDs7CisKK2lyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBub25zdG9wdXgqKSB2ZXJzaW9uX3R5cGU9bm9uc3RvcHV4IDs7CisgICAgKikKKwlpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19nbnVfbGQiID0geWVzOyB0aGVuCisJCXZlcnNpb25fdHlwZT1saW51eAorCWVsc2UKKwkJdmVyc2lvbl90eXBlPWlyaXgKKwlmaSA7OworICBlc2FjCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBjYXNlICRob3N0X29zIGluCisgIGlyaXg1KiB8IG5vbnN0b3B1eCopCisgICAgbGlic3VmZj0gc2hsaWJzdWZmPQorICAgIDs7CisgICopCisgICAgY2FzZSAkTEQgaW4gIyBsaWJ0b29sLm00IHdpbGwgYWRkIG9uZSBvZiB0aGVzZSBzd2l0Y2hlcyB0byBMRAorICAgICotMzJ8KiItMzIgInwqLW1lbGYzMmJzbWlwfCoiLW1lbGYzMmJzbWlwICIpCisgICAgICBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPTMyLWJpdDs7CisgICAgKi1uMzJ8KiItbjMyICJ8Ki1tZWxmMzJibWlwbjMyfCoiLW1lbGYzMmJtaXBuMzIgIikKKyAgICAgIGxpYnN1ZmY9MzIgc2hsaWJzdWZmPU4zMiBsaWJtYWdpYz1OMzI7OworICAgICotNjR8KiItNjQgInwqLW1lbGY2NGJtaXB8KiItbWVsZjY0Ym1pcCAiKQorICAgICAgbGlic3VmZj02NCBzaGxpYnN1ZmY9NjQgbGlibWFnaWM9NjQtYml0OzsKKyAgICAqKSBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPW5ldmVyLW1hdGNoOzsKKyAgICBlc2FjCisgICAgOzsKKyAgZXNhYworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUlkke3NobGlic3VmZn1fUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0gL3Vzci9sb2NhbC9saWIke2xpYnN1ZmZ9IgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IgorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKKyMgTm8gc2hhcmVkIGxpYiBzdXBwb3J0IGZvciBMaW51eCBvbGRsZCwgYW91dCwgb3IgY29mZi4KK2xpbnV4Km9sZGxkKiB8IGxpbnV4KmFvdXQqIHwgbGludXgqY29mZiopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7CisKKyMgVGhpcyBtdXN0IGJlIExpbnV4IEVMRi4KK2xpbnV4KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1uICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAjIFRoaXMgaW1wbGllcyBubyBmYXN0X2luc3RhbGwsIHdoaWNoIGlzIHVuYWNjZXB0YWJsZS4KKyAgIyBTb21lIHJld29yayB3aWxsIGJlIG5lZWRlZCB0byBhbGxvdyBmb3IgZmFzdF9pbnN0YWxsCisgICMgYmVmb3JlIHRoaXMgY2FuIGJlIGVuYWJsZWQuCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKworICAjIEFwcGVuZCBsZC5zby5jb25mIGNvbnRlbnRzIHRvIHRoZSBzZWFyY2ggcGF0aAorICBpZiB0ZXN0IC1mIC9ldGMvbGQuc28uY29uZjsgdGhlbgorICAgIGx0X2xkX2V4dHJhPWAkU0VEIC1lICdzLzosXHQvIC9nO3MvPV49KiQvLztzLz1ePSAqIC8gL2cnIC9ldGMvbGQuc28uY29uZiB8IHRyICdcbicgJyAnYAorICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliICRsdF9sZF9leHRyYSIKKyAgZmkKKworICAjIFdlIHVzZWQgdG8gdGVzdCBmb3IgL2xpYi9sZC5zby4xIGFuZCBkaXNhYmxlIHNoYXJlZCBsaWJyYXJpZXMgb24KKyAgIyBwb3dlcnBjLCBiZWNhdXNlIE1rTGludXggb25seSBzdXBwb3J0ZWQgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHRoZQorICAjIEdOVSBkeW5hbWljIGxpbmtlci4gIFNpbmNlIHRoaXMgd2FzIGJyb2tlbiB3aXRoIGNyb3NzIGNvbXBpbGVycywKKyAgIyBtb3N0IHBvd2VycGMtbGludXggYm94ZXMgc3VwcG9ydCBkeW5hbWljIGxpbmtpbmcgdGhlc2UgZGF5cyBhbmQKKyAgIyBwZW9wbGUgY2FuIGFsd2F5cyAtLWRpc2FibGUtc2hhcmVkLCB0aGUgdGVzdCB3YXMgcmVtb3ZlZCwgYW5kIHdlCisgICMgYXNzdW1lIHRoZSBHTlUvTGludXggZHluYW1pYyBsaW5rZXIgaXMgaW4gdXNlLgorICBkeW5hbWljX2xpbmtlcj0nR05VL0xpbnV4IGxkLnNvJworICA7OworCitrbmV0YnNkKi1nbnUpCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGR5bmFtaWNfbGlua2VyPSdHTlUgbGQuc28nCisgIDs7CisKK25ldGJzZCopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICAgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCisgICAgZHluYW1pY19saW5rZXI9J05ldEJTRCAoYS5vdXQpIGxkLnNvJworICBlbHNlCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgbGQuZWxmX3NvJworICBmaQorICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworbmV3c29zNikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIDs7CisKK250by1xbngqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICA7OworCitvcGVuYnNkKikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249eWVzCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIG9wZW5ic2QyLls4OV0gfCBvcGVuYnNkMi5bODldLiopCisJc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisJOzsKKyAgICAgICopCisJc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworCTs7CisgICAgICBlc2FjCisgIGVsc2UKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGZpCisgIDs7CisKK29zMiopCisgIGxpYm5hbWVfc3BlYz0nJG5hbWUnCisgIHNocmV4dF9jbWRzPSIuZGxsIgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUuYScKKyAgZHluYW1pY19saW5rZXI9J09TLzIgbGQuZXhlJworICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKKyAgOzsKKworb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICB2ZXJzaW9uX3R5cGU9b3NmCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9zaGxpYiAvdXNyL2Njcy9saWIgL3Vzci9saWIvY21wbHJzL2NjIC91c3IvbGliIC91c3IvbG9jYWwvbGliIC92YXIvc2hsaWIiCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIgorICA7OworCitzY28zLjJ2NSopCisgIHZlcnNpb25fdHlwZT1vc2YKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIDs7CisKK3NvbGFyaXMqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICMgbGRkIGNvbXBsYWlucyB1bmxlc3MgbGlicmFyaWVzIGFyZSBleGVjdXRhYmxlCisgIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kICt4ICRsaWInCisgIDs7CisKK3N1bm9zNCopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi91c3IvZXRjIiBsZGNvbmZpZyAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgZmkKKyAgbmVlZF92ZXJzaW9uPXllcworICA7OworCitzeXN2NCB8IHN5c3Y0LjJ1dzIqIHwgc3lzdjQuMyogfCBzeXN2NSopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KKyAgICBzbmkpCisgICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1CbGFyZ2VkeW5zeW0nCisgICAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorICAgICAgOzsKKyAgICBzaWVtZW5zKQorICAgICAgbmVlZF9saWJfcHJlZml4PW5vCisgICAgICA7OworICAgIG1vdG9yb2xhKQorICAgICAgbmVlZF9saWJfcHJlZml4PW5vCisgICAgICBuZWVkX3ZlcnNpb249bm8KKyAgICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvbGliIC91c3IvbGliIC91c3IvY2NzL2xpYicKKyAgICAgIDs7CisgIGVzYWMKKyAgOzsKKworc3lzdjQqTVAqKQorICBpZiB0ZXN0IC1kIC91c3IvbmVjIDt0aGVuCisgICAgdmVyc2lvbl90eXBlPWxpbnV4CisgICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9LiRtYWpvcicKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBmaQorICA7OworCit1dHM0KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCisqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworZXNhYworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRkeW5hbWljX2xpbmtlciIgPiY1CiskYXNfZWNobyAiJGR5bmFtaWNfbGlua2VyIiA+JjY7IH0KK3Rlc3QgIiRkeW5hbWljX2xpbmtlciIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBob3cgdG8gaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIHByb2dyYW1zLi4uICIgPiY2OyB9CitoYXJkY29kZV9hY3Rpb249CitpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyIgfHwgXAorICAgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyICIgfHwgXAorICAgdGVzdCAiWCRoYXJkY29kZV9hdXRvbWF0aWMiPSJYeWVzIiA7IHRoZW4KKworICAjIFdlIGNhbiBoYXJkY29kZSBub24tZXhpc3RhbnQgZGlyZWN0b3JpZXMuCisgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiICE9IG5vICYmCisgICAgICMgSWYgdGhlIG9ubHkgbWVjaGFuaXNtIHRvIGF2b2lkIGhhcmRjb2RpbmcgaXMgc2hsaWJwYXRoX3Zhciwgd2UKKyAgICAgIyBoYXZlIHRvIHJlbGluaywgb3RoZXJ3aXNlIHdlIG1pZ2h0IGxpbmsgd2l0aCBhbiBpbnN0YWxsZWQgbGlicmFyeQorICAgICAjIHdoZW4gd2Ugc2hvdWxkIGJlIGxpbmtpbmcgd2l0aCBhIHlldC10by1iZS1pbnN0YWxsZWQgb25lCisgICAgICMjIHRlc3QgIiRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICkiICE9IG5vICYmCisgICAgIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiAhPSBubzsgdGhlbgorICAgICMgTGlua2luZyBhbHdheXMgaGFyZGNvZGVzIHRoZSB0ZW1wb3JhcnkgbGlicmFyeSBkaXJlY3RvcnkuCisgICAgaGFyZGNvZGVfYWN0aW9uPXJlbGluaworICBlbHNlCisgICAgIyBXZSBjYW4gbGluayB3aXRob3V0IGhhcmRjb2RpbmcsIGFuZCB3ZSBjYW4gaGFyZGNvZGUgbm9uZXhpc3RpbmcgZGlycy4KKyAgICBoYXJkY29kZV9hY3Rpb249aW1tZWRpYXRlCisgIGZpCitlbHNlCisgICMgV2UgY2Fubm90IGhhcmRjb2RlIGFueXRoaW5nLCBvciBlbHNlIHdlIGNhbiBvbmx5IGhhcmRjb2RlIGV4aXN0aW5nCisgICMgZGlyZWN0b3JpZXMuCisgIGhhcmRjb2RlX2FjdGlvbj11bnN1cHBvcnRlZAorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkaGFyZGNvZGVfYWN0aW9uIiA+JjUKKyRhc19lY2hvICIkaGFyZGNvZGVfYWN0aW9uIiA+JjY7IH0KKworaWYgdGVzdCAiJGhhcmRjb2RlX2FjdGlvbiIgPSByZWxpbms7IHRoZW4KKyAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkCisgIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KK2VsaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgfHwKKyAgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm87IHRoZW4KKyAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3QgbmVjZXNzYXJ5CisgIGVuYWJsZV9mYXN0X2luc3RhbGw9bmVlZGxlc3MKK2ZpCisKK3N0cmlwbGliPQorb2xkX3N0cmlwbGliPQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHN0cmlwcGluZyBsaWJyYXJpZXMgaXMgcG9zc2libGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBzdHJpcHBpbmcgbGlicmFyaWVzIGlzIHBvc3NpYmxlLi4uICIgPiY2OyB9CitpZiB0ZXN0IC1uICIkU1RSSVAiICYmICRTVFJJUCAtViAyPiYxIHwgZ3JlcCAiR05VIHN0cmlwIiA+L2Rldi9udWxsOyB0aGVuCisgIHRlc3QgLXogIiRvbGRfc3RyaXBsaWIiICYmIG9sZF9zdHJpcGxpYj0iJFNUUklQIC0tc3RyaXAtZGVidWciCisgIHRlc3QgLXogIiRzdHJpcGxpYiIgJiYgc3RyaXBsaWI9IiRTVFJJUCAtLXN0cmlwLXVubmVlZGVkIgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorZWxzZQorIyBGSVhNRSAtIGluc2VydCBzb21lIHJlYWwgdGVzdHMsIGhvc3Rfb3MgaXNuJ3QgcmVhbGx5IGdvb2QgZW5vdWdoCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgIGRhcndpbiopCisgICAgICAgaWYgdGVzdCAtbiAiJFNUUklQIiA7IHRoZW4KKyAgICAgICAgIHN0cmlwbGliPSIkU1RSSVAgLXgiCisgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorICAgICAgIGVsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorICAgICAgIDs7CisgICAqKQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKyAgICA7OworICBlc2FjCitmaQorCitpZiB0ZXN0ICJ4JGVuYWJsZV9kbG9wZW4iICE9IHh5ZXM7IHRoZW4KKyAgZW5hYmxlX2Rsb3Blbj11bmtub3duCisgIGVuYWJsZV9kbG9wZW5fc2VsZj11bmtub3duCisgIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9dW5rbm93bgorZWxzZQorICBsdF9jdl9kbG9wZW49bm8KKyAgbHRfY3ZfZGxvcGVuX2xpYnM9CisKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBiZW9zKikKKyAgICBsdF9jdl9kbG9wZW49ImxvYWRfYWRkX29uIgorICAgIGx0X2N2X2Rsb3Blbl9saWJzPQorICAgIGx0X2N2X2Rsb3Blbl9zZWxmPXllcworICAgIDs7CisKKyAgbWluZ3cqIHwgcHczMiopCisgICAgbHRfY3ZfZGxvcGVuPSJMb2FkTGlicmFyeSIKKyAgICBsdF9jdl9kbG9wZW5fbGlicz0KKyAgIDs7CisKKyAgY3lnd2luKikKKyAgICBsdF9jdl9kbG9wZW49ImRsb3BlbiIKKyAgICBsdF9jdl9kbG9wZW5fbGlicz0KKyAgIDs7CisKKyAgZGFyd2luKikKKyAgIyBpZiBsaWJkbCBpcyBpbnN0YWxsZWQgd2UgbmVlZCB0byBsaW5rIGFnYWluc3QgaXQKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZGxvcGVuIGluIC1sZGwuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfbGliX2RsX2Rsb3BlbitzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sZGwgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIGRsb3BlbiAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGRsb3BlbiAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9saWJfZGxfZGxvcGVuPXllcworZWxzZQorICBhY19jdl9saWJfZGxfZGxvcGVuPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9kbF9kbG9wZW4iID4mNQorJGFzX2VjaG8gIiRhY19jdl9saWJfZGxfZGxvcGVuIiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX2RsX2Rsb3BlbiIgPSB4IiJ5ZXM7IHRoZW4gOgorICBsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiCitlbHNlCisKKyAgICBsdF9jdl9kbG9wZW49ImR5bGQiCisgICAgbHRfY3ZfZGxvcGVuX2xpYnM9CisgICAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzCisKK2ZpCisKKyAgIDs7CisKKyAgKikKKyAgICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJzaGxfbG9hZCIgImFjX2N2X2Z1bmNfc2hsX2xvYWQiCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfc2hsX2xvYWQiID0geCIieWVzOyB0aGVuIDoKKyAgbHRfY3ZfZGxvcGVuPSJzaGxfbG9hZCIKK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc2hsX2xvYWQgaW4gLWxkbGQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHNobF9sb2FkIGluIC1sZGxkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2xpYl9kbGRfc2hsX2xvYWQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbGRsZCAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgc2hsX2xvYWQgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBzaGxfbG9hZCAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9saWJfZGxkX3NobF9sb2FkPXllcworZWxzZQorICBhY19jdl9saWJfZGxkX3NobF9sb2FkPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9kbGRfc2hsX2xvYWQiID4mNQorJGFzX2VjaG8gIiRhY19jdl9saWJfZGxkX3NobF9sb2FkIiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX2RsZF9zaGxfbG9hZCIgPSB4IiJ5ZXM7IHRoZW4gOgorICBsdF9jdl9kbG9wZW49InNobF9sb2FkIiBsdF9jdl9kbG9wZW5fbGlicz0iLWRsZCIKK2Vsc2UKKyAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiZGxvcGVuIiAiYWNfY3ZfZnVuY19kbG9wZW4iCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZGxvcGVuIiA9IHgiInllczsgdGhlbiA6CisgIGx0X2N2X2Rsb3Blbj0iZGxvcGVuIgorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZGxvcGVuIGluIC1sZGwuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfbGliX2RsX2Rsb3BlbitzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sZGwgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIGRsb3BlbiAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGRsb3BlbiAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9saWJfZGxfZGxvcGVuPXllcworZWxzZQorICBhY19jdl9saWJfZGxfZGxvcGVuPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9kbF9kbG9wZW4iID4mNQorJGFzX2VjaG8gIiRhY19jdl9saWJfZGxfZGxvcGVuIiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX2RsX2Rsb3BlbiIgPSB4IiJ5ZXM7IHRoZW4gOgorICBsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiCitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbHN2bGQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbHN2bGQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfbGliX3N2bGRfZGxvcGVuK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxzdmxkICAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBkbG9wZW4gKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBkbG9wZW4gKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX3N2bGRfZGxvcGVuPXllcworZWxzZQorICBhY19jdl9saWJfc3ZsZF9kbG9wZW49bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3N2bGRfZGxvcGVuIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX3N2bGRfZGxvcGVuIiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX3N2bGRfZGxvcGVuIiA9IHgiInllczsgdGhlbiA6CisgIGx0X2N2X2Rsb3Blbj0iZGxvcGVuIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxzdmxkIgorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBkbGRfbGluayBpbiAtbGRsZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZGxkX2xpbmsgaW4gLWxkbGQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfbGliX2RsZF9kbGRfbGluaytzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sZGxkICAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBkbGRfbGluayAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGRsZF9saW5rICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9kbGRfZGxkX2xpbms9eWVzCitlbHNlCisgIGFjX2N2X2xpYl9kbGRfZGxkX2xpbms9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2RsZF9kbGRfbGluayIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9kbGRfZGxkX2xpbmsiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfZGxkX2RsZF9saW5rIiA9IHgiInllczsgdGhlbiA6CisgIGx0X2N2X2Rsb3Blbj0iZGxkX2xpbmsiIGx0X2N2X2Rsb3Blbl9saWJzPSItZGxkIgorZmkKKworCitmaQorCisKK2ZpCisKKworZmkKKworCitmaQorCisKK2ZpCisKKyAgICA7OworICBlc2FjCisKKyAgaWYgdGVzdCAieCRsdF9jdl9kbG9wZW4iICE9IHhubzsgdGhlbgorICAgIGVuYWJsZV9kbG9wZW49eWVzCisgIGVsc2UKKyAgICBlbmFibGVfZGxvcGVuPW5vCisgIGZpCisKKyAgY2FzZSAkbHRfY3ZfZGxvcGVuIGluCisgIGRsb3BlbikKKyAgICBzYXZlX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCisgICAgdGVzdCAieCRhY19jdl9oZWFkZXJfZGxmY25faCIgPSB4eWVzICYmIENQUEZMQUdTPSIkQ1BQRkxBR1MgLURIQVZFX0RMRkNOX0giCisKKyAgICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorICAgIGV2YWwgTERGTEFHUz1cIlwkTERGTEFHUyAkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXCIKKworICAgIHNhdmVfTElCUz0iJExJQlMiCisgICAgTElCUz0iJGx0X2N2X2Rsb3Blbl9saWJzICRMSUJTIgorCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGEgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIGEgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZi4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHtsdF9jdl9kbG9wZW5fc2VsZitzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIAkgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgbHRfY3ZfZGxvcGVuX3NlbGY9Y3Jvc3MKK2Vsc2UKKyAgbHRfZGx1bmtub3duPTA7IGx0X2Rsbm9fdXNjb3JlPTE7IGx0X2RsbmVlZF91c2NvcmU9MgorICBsdF9zdGF0dXM9JGx0X2RsdW5rbm93bgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMDEzOCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpZiBIQVZFX0RMRkNOX0gKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZkZWYgUlRMRF9HTE9CQUwKKyMgIGRlZmluZSBMVF9ETEdMT0JBTAkJUlRMRF9HTE9CQUwKKyNlbHNlCisjICBpZmRlZiBETF9HTE9CQUwKKyMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQlETF9HTE9CQUwKKyMgIGVsc2UKKyMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQkwCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFdlIG1heSBoYXZlIHRvIGRlZmluZSBMVF9ETExBWllfT1JfTk9XIGluIHRoZSBjb21tYW5kIGxpbmUgaWYgd2UKKyAgIGZpbmQgb3V0IGl0IGRvZXMgbm90IHdvcmsgaW4gc29tZSBwbGF0Zm9ybS4gKi8KKyNpZm5kZWYgTFRfRExMQVpZX09SX05PVworIyAgaWZkZWYgUlRMRF9MQVpZCisjICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlSVExEX0xBWlkKKyMgIGVsc2UKKyMgICAgaWZkZWYgRExfTEFaWQorIyAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlETF9MQVpZCisjICAgIGVsc2UKKyMgICAgICBpZmRlZiBSVExEX05PVworIyAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJUlRMRF9OT1cKKyMgICAgICBlbHNlCisjICAgICAgICBpZmRlZiBETF9OT1cKKyMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJRExfTk9XCisjICAgICAgICBlbHNlCisjICAgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCTAKKyMgICAgICAgIGVuZGlmCisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHZvaWQgZXhpdCAoaW50KTsKKyNlbmRpZgorCit2b2lkIGZub3JkKCkgeyBpbnQgaT00Mjt9CitpbnQgbWFpbiAoKQoreworICB2b2lkICpzZWxmID0gZGxvcGVuICgwLCBMVF9ETEdMT0JBTHxMVF9ETExBWllfT1JfTk9XKTsKKyAgaW50IHN0YXR1cyA9ICRsdF9kbHVua25vd247CisKKyAgaWYgKHNlbGYpCisgICAgeworICAgICAgaWYgKGRsc3ltIChzZWxmLCJmbm9yZCIpKSAgICAgICBzdGF0dXMgPSAkbHRfZGxub191c2NvcmU7CisgICAgICBlbHNlIGlmIChkbHN5bSggc2VsZiwiX2Zub3JkIikpIHN0YXR1cyA9ICRsdF9kbG5lZWRfdXNjb3JlOworICAgICAgLyogZGxjbG9zZSAoc2VsZik7ICovCisgICAgfQorCisgICAgZXhpdCAoc3RhdHVzKTsKK30KK0VPRgorICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfbGlua1wiIjsgfSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gMj4vZGV2L251bGw7IHRoZW4KKyAgICAoLi9jb25mdGVzdDsgZXhpdDsgKSAyPi9kZXYvbnVsbAorICAgIGx0X3N0YXR1cz0kPworICAgIGNhc2UgeCRsdF9zdGF0dXMgaW4KKyAgICAgIHgkbHRfZGxub191c2NvcmUpIGx0X2N2X2Rsb3Blbl9zZWxmPXllcyA7OworICAgICAgeCRsdF9kbG5lZWRfdXNjb3JlKSBsdF9jdl9kbG9wZW5fc2VsZj15ZXMgOzsKKyAgICAgIHgkbHRfdW5rbm93bnx4KikgbHRfY3ZfZGxvcGVuX3NlbGY9bm8gOzsKKyAgICBlc2FjCisgIGVsc2UgOgorICAgICMgY29tcGlsYXRpb24gZmFpbGVkCisgICAgbHRfY3ZfZGxvcGVuX3NlbGY9bm8KKyAgZmkKK2ZpCitybSAtZnIgY29uZnRlc3QqCisKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfZGxvcGVuX3NlbGYiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9kbG9wZW5fc2VsZiIgPiY2OyB9CisKKyAgICBpZiB0ZXN0ICJ4JGx0X2N2X2Rsb3Blbl9zZWxmIiA9IHh5ZXM7IHRoZW4KKyAgICAgIExERkxBR1M9IiRMREZMQUdTICRsaW5rX3N0YXRpY19mbGFnIgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGEgc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIGEgc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZi4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHtsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICAJICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz1jcm9zcworZWxzZQorICBsdF9kbHVua25vd249MDsgbHRfZGxub191c2NvcmU9MTsgbHRfZGxuZWVkX3VzY29yZT0yCisgIGx0X3N0YXR1cz0kbHRfZGx1bmtub3duCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEwMjM2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworI2lmIEhBVkVfRExGQ05fSAorI2luY2x1ZGUgPGRsZmNuLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZmRlZiBSVExEX0dMT0JBTAorIyAgZGVmaW5lIExUX0RMR0xPQkFMCQlSVExEX0dMT0JBTAorI2Vsc2UKKyMgIGlmZGVmIERMX0dMT0JBTAorIyAgICBkZWZpbmUgTFRfRExHTE9CQUwJCURMX0dMT0JBTAorIyAgZWxzZQorIyAgICBkZWZpbmUgTFRfRExHTE9CQUwJCTAKKyMgIGVuZGlmCisjZW5kaWYKKworLyogV2UgbWF5IGhhdmUgdG8gZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cgaW4gdGhlIGNvbW1hbmQgbGluZSBpZiB3ZQorICAgZmluZCBvdXQgaXQgZG9lcyBub3Qgd29yayBpbiBzb21lIHBsYXRmb3JtLiAqLworI2lmbmRlZiBMVF9ETExBWllfT1JfTk9XCisjICBpZmRlZiBSVExEX0xBWlkKKyMgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJCVJUTERfTEFaWQorIyAgZWxzZQorIyAgICBpZmRlZiBETF9MQVpZCisjICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJCURMX0xBWlkKKyMgICAgZWxzZQorIyAgICAgIGlmZGVmIFJUTERfTk9XCisjICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwlSVExEX05PVworIyAgICAgIGVsc2UKKyMgICAgICAgIGlmZGVmIERMX05PVworIyAgICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwlETF9OT1cKKyMgICAgICAgIGVsc2UKKyMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJMAorIyAgICAgICAgZW5kaWYKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgdm9pZCBleGl0IChpbnQpOworI2VuZGlmCisKK3ZvaWQgZm5vcmQoKSB7IGludCBpPTQyO30KK2ludCBtYWluICgpCit7CisgIHZvaWQgKnNlbGYgPSBkbG9wZW4gKDAsIExUX0RMR0xPQkFMfExUX0RMTEFaWV9PUl9OT1cpOworICBpbnQgc3RhdHVzID0gJGx0X2RsdW5rbm93bjsKKworICBpZiAoc2VsZikKKyAgICB7CisgICAgICBpZiAoZGxzeW0gKHNlbGYsImZub3JkIikpICAgICAgIHN0YXR1cyA9ICRsdF9kbG5vX3VzY29yZTsKKyAgICAgIGVsc2UgaWYgKGRsc3ltKCBzZWxmLCJfZm5vcmQiKSkgc3RhdHVzID0gJGx0X2RsbmVlZF91c2NvcmU7CisgICAgICAvKiBkbGNsb3NlIChzZWxmKTsgKi8KKyAgICB9CisKKyAgICBleGl0IChzdGF0dXMpOworfQorRU9GCisgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19saW5rXCIiOyB9ID4mNQorICAoZXZhbCAkYWNfbGluaykgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAyPi9kZXYvbnVsbDsgdGhlbgorICAgICguL2NvbmZ0ZXN0OyBleGl0OyApIDI+L2Rldi9udWxsCisgICAgbHRfc3RhdHVzPSQ/CisgICAgY2FzZSB4JGx0X3N0YXR1cyBpbgorICAgICAgeCRsdF9kbG5vX3VzY29yZSkgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPXllcyA7OworICAgICAgeCRsdF9kbG5lZWRfdXNjb3JlKSBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9eWVzIDs7CisgICAgICB4JGx0X3Vua25vd258eCopIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz1ubyA7OworICAgIGVzYWMKKyAgZWxzZSA6CisgICAgIyBjb21waWxhdGlvbiBmYWlsZWQKKyAgICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9bm8KKyAgZmkKK2ZpCitybSAtZnIgY29uZnRlc3QqCisKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIiA+JjY7IH0KKyAgICBmaQorCisgICAgQ1BQRkxBR1M9IiRzYXZlX0NQUEZMQUdTIgorICAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCisgICAgTElCUz0iJHNhdmVfTElCUyIKKyAgICA7OworICBlc2FjCisKKyAgY2FzZSAkbHRfY3ZfZGxvcGVuX3NlbGYgaW4KKyAgeWVzfG5vKSBlbmFibGVfZGxvcGVuX3NlbGY9JGx0X2N2X2Rsb3Blbl9zZWxmIDs7CisgICopIGVuYWJsZV9kbG9wZW5fc2VsZj11bmtub3duIDs7CisgIGVzYWMKKworICBjYXNlICRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMgaW4KKyAgeWVzfG5vKSBlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPSRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMgOzsKKyAgKikgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz11bmtub3duIDs7CisgIGVzYWMKK2ZpCisKKworIyBSZXBvcnQgd2hpY2ggbGlicmFyaWUgdHlwZXMgd2lsIGFjdHVhbGx5IGJlIGJ1aWx0Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIGxpYnRvb2wgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiBsaWJ0b29sIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuLi4gIiA+JjY7IH0KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkY2FuX2J1aWxkX3NoYXJlZCIgPiY1CiskYXNfZWNobyAiJGNhbl9idWlsZF9zaGFyZWQiID4mNjsgfQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMuLi4gIiA+JjY7IH0KK3Rlc3QgIiRjYW5fYnVpbGRfc2hhcmVkIiA9ICJubyIgJiYgZW5hYmxlX3NoYXJlZD1ubworCisjIE9uIEFJWCwgc2hhcmVkIGxpYnJhcmllcyBhbmQgc3RhdGljIGxpYnJhcmllcyB1c2UgdGhlIHNhbWUgbmFtZXNwYWNlLCBhbmQKKyMgYXJlIGFsbCBidWlsdCBmcm9tIFBJQy4KK2Nhc2UgIiRob3N0X29zIiBpbgorYWl4MyopCisgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCisgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgICAgYXJjaGl2ZV9jbWRzPSIkYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkbGliIgorICAgIHBvc3RpbnN0YWxsX2NtZHM9JyRSQU5MSUIgJGxpYicKKyAgZmkKKyAgOzsKKworYWl4NCogfCBhaXg1KikKKyAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0ICYmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IG5vIDsgdGhlbgorICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCisgIGZpCisgIDs7CisgIGRhcndpbiogfCByaGFwc29keSopCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9bm8KKyAgICBjYXNlICIkaG9zdF9vcyIgaW4KKyAgICByaGFwc29keSogfCBkYXJ3aW4xLlswMTJdKQorICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9Jy11bmRlZmluZWQgc3VwcHJlc3MnCisgICAgICA7OworICAgICopICMgRGFyd2luIDEuMyBvbgorICAgICAgaWYgdGVzdCAteiAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVH0gOyB0aGVuCisgICAgICAJYWxsb3dfdW5kZWZpbmVkX2ZsYWc9Jy1mbGF0X25hbWVzcGFjZSAtdW5kZWZpbmVkIHN1cHByZXNzJworICAgICAgZWxzZQorICAgICAgICBjYXNlICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUfSBpbgorICAgICAgICAgIDEwLlswMTJdKQorICAgICAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9Jy1mbGF0X25hbWVzcGFjZSAtdW5kZWZpbmVkIHN1cHByZXNzJworICAgICAgICAgICAgOzsKKyAgICAgICAgICAxMC4qKQorICAgICAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9Jy11bmRlZmluZWQgZHluYW1pY19sb29rdXAnCisgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgICBmaQorICAgICAgOzsKKyAgICBlc2FjCisgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2VjaG8nCisgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLWR5bmFtaWNsaWIgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nJworICAgIG1vZHVsZV9jbWRzPSckQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFncycKKyAgICAjIERvbid0IGZpeCB0aGlzIGJ5IHVzaW5nIHRoZSBsZCAtZXhwb3J0ZWRfc3ltYm9sc19saXN0IGZsYWcsIGl0IGRvZXNuJ3QgZXhpc3QgaW4gb2xkZXIgZGFyd2luIGxkJ3MKKyAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAtZHluYW1pY2xpYiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKKyAgICBtb2R1bGVfZXhwc3ltX2NtZHM9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDICRhbGxvd191bmRlZmluZWRfZmxhZyAgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKKyAgICBoYXJkY29kZV9kaXJlY3Q9bm8KKyAgICBoYXJkY29kZV9hdXRvbWF0aWM9eWVzCisgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj11bnN1cHBvcnRlZAorICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSctYWxsX2xvYWQgJGNvbnZlbmllbmNlJworICAgIGxpbmtfYWxsX2RlcGxpYnM9eWVzCisgIGVsc2UKKyAgICBsZF9zaGxpYnM9bm8KKyAgZmkKKyAgICA7OworZXNhYworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRlbmFibGVfc2hhcmVkIiA+JjUKKyRhc19lY2hvICIkZW5hYmxlX3NoYXJlZCIgPiY2OyB9CisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcy4uLiAiID4mNjsgfQorIyBNYWtlIHN1cmUgZWl0aGVyIGVuYWJsZV9zaGFyZWQgb3IgZW5hYmxlX3N0YXRpYyBpcyB5ZXMuCit0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgfHwgZW5hYmxlX3N0YXRpYz15ZXMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkZW5hYmxlX3N0YXRpYyIgPiY1CiskYXNfZWNobyAiJGVuYWJsZV9zdGF0aWMiID4mNjsgfQorCisjIFRoZSBlbHNlIGNsYXVzZSBzaG91bGQgb25seSBmaXJlIHdoZW4gYm9vdHN0cmFwcGluZyB0aGUKKyMgbGlidG9vbCBkaXN0cmlidXRpb24sIG90aGVyd2lzZSB5b3UgZm9yZ290IHRvIHNoaXAgbHRtYWluLnNoCisjIHdpdGggeW91ciBwYWNrYWdlLCBhbmQgeW91IHdpbGwgZ2V0IGNvbXBsYWludHMgdGhhdCB0aGVyZSBhcmUKKyMgbm8gcnVsZXMgdG8gZ2VuZXJhdGUgbHRtYWluLnNoLgoraWYgdGVzdCAtZiAiJGx0bWFpbiI7IHRoZW4KKyAgIyBTZWUgaWYgd2UgYXJlIHJ1bm5pbmcgb24genNoLCBhbmQgc2V0IHRoZSBvcHRpb25zIHdoaWNoIGFsbG93IG91ciBjb21tYW5kcyB0aHJvdWdoCisgICMgd2l0aG91dCByZW1vdmFsIG9mIFwgZXNjYXBlcy4KKyAgaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KKyAgICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorICBmaQorICAjIE5vdyBxdW90ZSBhbGwgdGhlIHRoaW5ncyB0aGF0IG1heSBjb250YWluIG1ldGFjaGFyYWN0ZXJzIHdoaWxlIGJlaW5nCisgICMgY2FyZWZ1bCBub3QgdG8gb3ZlcnF1b3RlIHRoZSBBQ19TVUJTVGVkIHZhbHVlcy4gIFdlIHRha2UgY29waWVzIG9mIHRoZQorICAjIHZhcmlhYmxlcyBhbmQgcXVvdGUgdGhlIGNvcGllcyBmb3IgZ2VuZXJhdGlvbiBvZiB0aGUgbGlidG9vbCBzY3JpcHQuCisgIGZvciB2YXIgaW4gZWNobyBvbGRfQ0Mgb2xkX0NGTEFHUyBBUiBBUl9GTEFHUyBFR1JFUCBSQU5MSUIgTE5fUyBMVENDIE5NIFwKKyAgICBTRUQgU0hFTEwgU1RSSVAgXAorICAgIGxpYm5hbWVfc3BlYyBsaWJyYXJ5X25hbWVzX3NwZWMgc29uYW1lX3NwZWMgZXh0cmFjdF9leHBzeW1zX2NtZHMgXAorICAgIG9sZF9zdHJpcGxpYiBzdHJpcGxpYiBmaWxlX21hZ2ljX2NtZCBmaW5pc2hfY21kcyBmaW5pc2hfZXZhbCBcCisgICAgZGVwbGlic19jaGVja19tZXRob2QgcmVsb2FkX2ZsYWcgcmVsb2FkX2NtZHMgbmVlZF9sb2NrcyBcCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCBcCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MgXAorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYyBcCisgICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyBcCisgICAgY29tcGlsZXIgXAorICAgIENDIFwKKyAgICBMRCBcCisgICAgbHRfcHJvZ19jb21waWxlcl93bCBcCisgICAgbHRfcHJvZ19jb21waWxlcl9waWMgXAorICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIFwKKyAgICBsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZyBcCisgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjIFwKKyAgICB0aHJlYWRfc2FmZV9mbGFnX3NwZWMgXAorICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIFwKKyAgICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzIFwKKyAgICBvbGRfYXJjaGl2ZV9jbWRzIFwKKyAgICBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIFwKKyAgICBwcmVkZXBfb2JqZWN0cyBcCisgICAgcG9zdGRlcF9vYmplY3RzIFwKKyAgICBwcmVkZXBzIFwKKyAgICBwb3N0ZGVwcyBcCisgICAgY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoIFwKKyAgICBhcmNoaXZlX2NtZHMgXAorICAgIGFyY2hpdmVfZXhwc3ltX2NtZHMgXAorICAgIHBvc3RpbnN0YWxsX2NtZHMgXAorICAgIHBvc3R1bmluc3RhbGxfY21kcyBcCisgICAgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMgXAorICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnIFwKKyAgICBub191bmRlZmluZWRfZmxhZyBcCisgICAgZXhwb3J0X3N5bWJvbHNfY21kcyBcCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBcCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCBcCisgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciBcCisgICAgaGFyZGNvZGVfYXV0b21hdGljIFwKKyAgICBtb2R1bGVfY21kcyBcCisgICAgbW9kdWxlX2V4cHN5bV9jbWRzIFwKKyAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbyBcCisgICAgZXhjbHVkZV9leHBzeW1zIFwKKyAgICBpbmNsdWRlX2V4cHN5bXM7IGRvCisKKyAgICBjYXNlICR2YXIgaW4KKyAgICBvbGRfYXJjaGl2ZV9jbWRzIHwgXAorICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMgfCBcCisgICAgYXJjaGl2ZV9jbWRzIHwgXAorICAgIGFyY2hpdmVfZXhwc3ltX2NtZHMgfCBcCisgICAgbW9kdWxlX2NtZHMgfCBcCisgICAgbW9kdWxlX2V4cHN5bV9jbWRzIHwgXAorICAgIG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzIHwgXAorICAgIGV4cG9ydF9zeW1ib2xzX2NtZHMgfCBcCisgICAgZXh0cmFjdF9leHBzeW1zX2NtZHMgfCByZWxvYWRfY21kcyB8IGZpbmlzaF9jbWRzIHwgXAorICAgIHBvc3RpbnN0YWxsX2NtZHMgfCBwb3N0dW5pbnN0YWxsX2NtZHMgfCBcCisgICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgfCBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIHwgXAorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyB8IHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjKQorICAgICAgIyBEb3VibGUtcXVvdGUgZG91YmxlLWV2YWxlZCBzdHJpbmdzLgorICAgICAgZXZhbCAibHRfJHZhcj1cXFwiXGBcJGVjaG8gXCJYXCQkdmFyXCIgfCBcJFhzZWQgLWUgXCJcJGRvdWJsZV9xdW90ZV9zdWJzdFwiIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIiAtZSBcIlwkZGVsYXlfdmFyaWFibGVfc3Vic3RcIlxgXFxcIiIKKyAgICAgIDs7CisgICAgKikKKyAgICAgIGV2YWwgImx0XyR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIlxgXFxcIiIKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCisKKyAgY2FzZSAkbHRfZWNobyBpbgorICAqJ1wkMCAtLWZhbGxiYWNrLWVjaG8iJykKKyAgICBsdF9lY2hvPWAkZWNobyAiWCRsdF9lY2hvIiB8ICRYc2VkIC1lICdzL1xcXFxcXFwkMCAtLWZhbGxiYWNrLWVjaG8iJC8kMCAtLWZhbGxiYWNrLWVjaG8iLydgCisgICAgOzsKKyAgZXNhYworCitjZmdmaWxlPSIke29maWxlfVQiCisgIHRyYXAgIiRybSBcIiRjZmdmaWxlXCI7IGV4aXQgMSIgMSAyIDE1CisgICRybSAtZiAiJGNmZ2ZpbGUiCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY3JlYXRpbmcgJG9maWxlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGNyZWF0aW5nICRvZmlsZSIgPiY2O30KKworICBjYXQgPDxfX0VPRl9fID4+ICIkY2ZnZmlsZSIKKyMhICRTSEVMTAorCisjIGAkZWNobyAiJGNmZ2ZpbGUiIHwgc2VkICdzJV4uKi8lJSdgIC0gUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5ICRQUk9HUkFNIChHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QKQorIyBOT1RFOiBDaGFuZ2VzIG1hZGUgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdDogbG9vayBhdCBsdG1haW4uc2guCisjCisjIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMQorIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIExpYnRvb2w6CisjIE9yaWdpbmFsbHkgYnkgR29yZG9uIE1hdHppZ2tlaXQgPGdvcmRAZ251LmFpLm1pdC5lZHU+LCAxOTk2CisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisjCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworIyBBIHNlZCBwcm9ncmFtIHRoYXQgZG9lcyBub3QgdHJ1bmNhdGUgb3V0cHV0LgorU0VEPSRsdF9TRUQKKworIyBTZWQgdGhhdCBoZWxwcyB1cyBhdm9pZCBhY2NpZGVudGFsbHkgdHJpZ2dlcmluZyBlY2hvKDEpIG9wdGlvbnMgbGlrZSAtbi4KK1hzZWQ9IiRTRUQgLWUgcy9eWC8vIgorCisjIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAorIyBpZiBDRFBBVEggaXMgc2V0LgoraWYgdGVzdCAiWFwke0NEUEFUSCtzZXR9IiA9IFhzZXQ7IHRoZW4gQ0RQQVRIPTo7IGV4cG9ydCBDRFBBVEg7IGZpCisKKyMgVGhlIG5hbWVzIG9mIHRoZSB0YWdnZWQgY29uZmlndXJhdGlvbnMgc3VwcG9ydGVkIGJ5IHRoaXMgc2NyaXB0LgorYXZhaWxhYmxlX3RhZ3M9CisKKyMgIyMjIEJFR0lOIExJQlRPT0wgQ09ORklHCisKKyMgTGlidG9vbCB3YXMgY29uZmlndXJlZCBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKKworIyBTaGVsbCB0byB1c2Ugd2hlbiBpbnZva2luZyBzaGVsbCBzY3JpcHRzLgorU0hFTEw9JGx0X1NIRUxMCisKKyMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcy4KK2J1aWxkX2xpYnRvb2xfbGlicz0kZW5hYmxlX3NoYXJlZAorCisjIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMuCitidWlsZF9vbGRfbGlicz0kZW5hYmxlX3N0YXRpYworCisjIFdoZXRoZXIgb3Igbm90IHRvIGFkZCAtbGMgZm9yIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMuCitidWlsZF9saWJ0b29sX25lZWRfbGM9JGFyY2hpdmVfY21kc19uZWVkX2xjCisKKyMgV2hldGhlciBvciBub3QgdG8gZGlzYWxsb3cgc2hhcmVkIGxpYnMgd2hlbiBydW50aW1lIGxpYnMgYXJlIHN0YXRpYworYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzPSRlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzCisKKyMgV2hldGhlciBvciBub3QgdG8gb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uLgorZmFzdF9pbnN0YWxsPSRlbmFibGVfZmFzdF9pbnN0YWxsCisKKyMgVGhlIGhvc3Qgc3lzdGVtLgoraG9zdF9hbGlhcz0kaG9zdF9hbGlhcworaG9zdD0kaG9zdAorCisjIEFuIGVjaG8gcHJvZ3JhbSB0aGF0IGRvZXMgbm90IGludGVycHJldCBiYWNrc2xhc2hlcy4KK2VjaG89JGx0X2VjaG8KKworIyBUaGUgYXJjaGl2ZXIuCitBUj0kbHRfQVIKK0FSX0ZMQUdTPSRsdF9BUl9GTEFHUworCisjIEEgQyBjb21waWxlci4KK0xUQ0M9JGx0X0xUQ0MKKworIyBBIGxhbmd1YWdlLXNwZWNpZmljIGNvbXBpbGVyLgorQ0M9JGx0X2NvbXBpbGVyCisKKyMgSXMgdGhlIGNvbXBpbGVyIHRoZSBHTlUgQyBjb21waWxlcj8KK3dpdGhfZ2NjPSRHQ0MKKworIyBBbiBFUkUgbWF0Y2hlci4KK0VHUkVQPSRsdF9FR1JFUAorCisjIFRoZSBsaW5rZXIgdXNlZCB0byBidWlsZCBsaWJyYXJpZXMuCitMRD0kbHRfTEQKKworIyBXaGV0aGVyIHdlIG5lZWQgaGFyZCBvciBzb2Z0IGxpbmtzLgorTE5fUz0kbHRfTE5fUworCisjIEEgQlNELWNvbXBhdGlibGUgbm0gcHJvZ3JhbS4KK05NPSRsdF9OTQorCisjIEEgc3ltYm9sIHN0cmlwcGluZyBwcm9ncmFtCitTVFJJUD0kbHRfU1RSSVAKKworIyBVc2VkIHRvIGV4YW1pbmUgbGlicmFyaWVzIHdoZW4gZmlsZV9tYWdpY19jbWQgYmVnaW5zICJmaWxlIgorTUFHSUNfQ01EPSRNQUdJQ19DTUQKKworIyBVc2VkIG9uIGN5Z3dpbjogRExMIGNyZWF0aW9uIHByb2dyYW0uCitETExUT09MPSIkRExMVE9PTCIKKworIyBVc2VkIG9uIGN5Z3dpbjogb2JqZWN0IGR1bXBlci4KK09CSkRVTVA9IiRPQkpEVU1QIgorCisjIFVzZWQgb24gY3lnd2luOiBhc3NlbWJsZXIuCitBUz0iJEFTIgorCisjIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0ZW1wb3JhcnkgbGlidG9vbCBmaWxlcy4KK29iamRpcj0kb2JqZGlyCisKKyMgSG93IHRvIGNyZWF0ZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlcy4KK3JlbG9hZF9mbGFnPSRsdF9yZWxvYWRfZmxhZworcmVsb2FkX2NtZHM9JGx0X3JlbG9hZF9jbWRzCisKKyMgSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlci4KK3dsPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3dsCisKKyMgT2JqZWN0IGZpbGUgc3VmZml4IChub3JtYWxseSAibyIpLgorb2JqZXh0PSIkYWNfb2JqZXh0IgorCisjIE9sZCBhcmNoaXZlIHN1ZmZpeCAobm9ybWFsbHkgImEiKS4KK2xpYmV4dD0iJGxpYmV4dCIKKworIyBTaGFyZWQgbGlicmFyeSBzdWZmaXggKG5vcm1hbGx5ICIuc28iKS4KK3NocmV4dF9jbWRzPSckc2hyZXh0X2NtZHMnCisKKyMgRXhlY3V0YWJsZSBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIiIpLgorZXhlZXh0PSIkZXhlZXh0IgorCisjIEFkZGl0aW9uYWwgY29tcGlsZXIgZmxhZ3MgZm9yIGJ1aWxkaW5nIGxpYnJhcnkgb2JqZWN0cy4KK3BpY19mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3BpYworcGljX21vZGU9JHBpY19tb2RlCisKKyMgV2hhdCBpcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgYSBjb21tYW5kPworbWF4X2NtZF9sZW49JGx0X2N2X3N5c19tYXhfY21kX2xlbgorCisjIERvZXMgY29tcGlsZXIgc2ltdWx0YW5lb3VzbHkgc3VwcG9ydCAtYyBhbmQgLW8gb3B0aW9ucz8KK2NvbXBpbGVyX2Nfbz0kbHRfbHRfY3ZfcHJvZ19jb21waWxlcl9jX28KKworIyBNdXN0IHdlIGxvY2sgZmlsZXMgd2hlbiBkb2luZyBjb21waWxhdGlvbiA/CituZWVkX2xvY2tzPSRsdF9uZWVkX2xvY2tzCisKKyMgRG8gd2UgbmVlZCB0aGUgbGliIHByZWZpeCBmb3IgbW9kdWxlcz8KK25lZWRfbGliX3ByZWZpeD0kbmVlZF9saWJfcHJlZml4CisKKyMgRG8gd2UgbmVlZCBhIHZlcnNpb24gZm9yIGxpYnJhcmllcz8KK25lZWRfdmVyc2lvbj0kbmVlZF92ZXJzaW9uCisKKyMgV2hldGhlciBkbG9wZW4gaXMgc3VwcG9ydGVkLgorZGxvcGVuX3N1cHBvcnQ9JGVuYWJsZV9kbG9wZW4KKworIyBXaGV0aGVyIGRsb3BlbiBvZiBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCitkbG9wZW5fc2VsZj0kZW5hYmxlX2Rsb3Blbl9zZWxmCisKKyMgV2hldGhlciBkbG9wZW4gb2Ygc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkLgorZGxvcGVuX3NlbGZfc3RhdGljPSRlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljCisKKyMgQ29tcGlsZXIgZmxhZyB0byBwcmV2ZW50IGR5bmFtaWMgbGlua2luZy4KK2xpbmtfc3RhdGljX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfc3RhdGljCisKKyMgQ29tcGlsZXIgZmxhZyB0byB0dXJuIG9mZiBidWlsdGluIGZ1bmN0aW9ucy4KK25vX2J1aWx0aW5fZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcKKworIyBDb21waWxlciBmbGFnIHRvIGFsbG93IHJlZmxleGl2ZSBkbG9wZW5zLgorZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPSRsdF9leHBvcnRfZHluYW1pY19mbGFnX3NwZWMKKworIyBDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHNoYXJlZCBvYmplY3RzIGRpcmVjdGx5IGZyb20gYXJjaGl2ZXMuCit3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0kbHRfd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMKKworIyBDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHRocmVhZC1zYWZlIG9iamVjdHMuCit0aHJlYWRfc2FmZV9mbGFnX3NwZWM9JGx0X3RocmVhZF9zYWZlX2ZsYWdfc3BlYworCisjIExpYnJhcnkgdmVyc2lvbmluZyB0eXBlLgordmVyc2lvbl90eXBlPSR2ZXJzaW9uX3R5cGUKKworIyBGb3JtYXQgb2YgbGlicmFyeSBuYW1lIHByZWZpeC4KK2xpYm5hbWVfc3BlYz0kbHRfbGlibmFtZV9zcGVjCisKKyMgTGlzdCBvZiBhcmNoaXZlIG5hbWVzLiAgRmlyc3QgbmFtZSBpcyB0aGUgcmVhbCBvbmUsIHRoZSByZXN0IGFyZSBsaW5rcy4KKyMgVGhlIGxhc3QgbmFtZSBpcyB0aGUgb25lIHRoYXQgdGhlIGxpbmtlciBmaW5kcyB3aXRoIC1sTkFNRS4KK2xpYnJhcnlfbmFtZXNfc3BlYz0kbHRfbGlicmFyeV9uYW1lc19zcGVjCisKKyMgVGhlIGNvZGVkIG5hbWUgb2YgdGhlIGxpYnJhcnksIGlmIGRpZmZlcmVudCBmcm9tIHRoZSByZWFsIG5hbWUuCitzb25hbWVfc3BlYz0kbHRfc29uYW1lX3NwZWMKKworIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGFuIG9sZC1zdHlsZSBhcmNoaXZlLgorUkFOTElCPSRsdF9SQU5MSUIKK29sZF9hcmNoaXZlX2NtZHM9JGx0X29sZF9hcmNoaXZlX2NtZHMKK29sZF9wb3N0aW5zdGFsbF9jbWRzPSRsdF9vbGRfcG9zdGluc3RhbGxfY21kcworb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0kbHRfb2xkX3Bvc3R1bmluc3RhbGxfY21kcworCisjIENyZWF0ZSBhbiBvbGQtc3R5bGUgYXJjaGl2ZSBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCitvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPSRsdF9vbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzCisKKyMgQ3JlYXRlIGEgdGVtcG9yYXJ5IG9sZC1zdHlsZSBhcmNoaXZlIHRvIGxpbmsgaW5zdGVhZCBvZiBhIHNoYXJlZCBhcmNoaXZlLgorb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHM9JGx0X29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhIHNoYXJlZCBhcmNoaXZlLgorYXJjaGl2ZV9jbWRzPSRsdF9hcmNoaXZlX2NtZHMKK2FyY2hpdmVfZXhwc3ltX2NtZHM9JGx0X2FyY2hpdmVfZXhwc3ltX2NtZHMKK3Bvc3RpbnN0YWxsX2NtZHM9JGx0X3Bvc3RpbnN0YWxsX2NtZHMKK3Bvc3R1bmluc3RhbGxfY21kcz0kbHRfcG9zdHVuaW5zdGFsbF9jbWRzCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhIGxvYWRhYmxlIG1vZHVsZSAoYXNzdW1lZCBzYW1lIGFzIGFib3ZlIGlmIGVtcHR5KQorbW9kdWxlX2NtZHM9JGx0X21vZHVsZV9jbWRzCittb2R1bGVfZXhwc3ltX2NtZHM9JGx0X21vZHVsZV9leHBzeW1fY21kcworCisjIENvbW1hbmRzIHRvIHN0cmlwIGxpYnJhcmllcy4KK29sZF9zdHJpcGxpYj0kbHRfb2xkX3N0cmlwbGliCitzdHJpcGxpYj0kbHRfc3RyaXBsaWIKKworIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYmVmb3JlIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQorIyBzaGFyZWQgbGlicmFyeS4KK3ByZWRlcF9vYmplY3RzPSRsdF9wcmVkZXBfb2JqZWN0cworCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBhZnRlciB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKKyMgc2hhcmVkIGxpYnJhcnkuCitwb3N0ZGVwX29iamVjdHM9JGx0X3Bvc3RkZXBfb2JqZWN0cworCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCisjIHNoYXJlZCBsaWJyYXJ5LgorcHJlZGVwcz0kbHRfcHJlZGVwcworCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBhZnRlciB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKKyMgc2hhcmVkIGxpYnJhcnkuCitwb3N0ZGVwcz0kbHRfcG9zdGRlcHMKKworIyBUaGUgbGlicmFyeSBzZWFyY2ggcGF0aCB1c2VkIGludGVybmFsbHkgYnkgdGhlIGNvbXBpbGVyIHdoZW4gbGlua2luZworIyBhIHNoYXJlZCBsaWJyYXJ5LgorY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoPSRsdF9jb21waWxlcl9saWJfc2VhcmNoX3BhdGgKKworIyBNZXRob2QgdG8gY2hlY2sgd2hldGhlciBkZXBlbmRlbnQgbGlicmFyaWVzIGFyZSBzaGFyZWQgb2JqZWN0cy4KK2RlcGxpYnNfY2hlY2tfbWV0aG9kPSRsdF9kZXBsaWJzX2NoZWNrX21ldGhvZAorCisjIENvbW1hbmQgdG8gdXNlIHdoZW4gZGVwbGlic19jaGVja19tZXRob2QgPT0gZmlsZV9tYWdpYy4KK2ZpbGVfbWFnaWNfY21kPSRsdF9maWxlX21hZ2ljX2NtZAorCisjIEZsYWcgdGhhdCBhbGxvd3Mgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHVuZGVmaW5lZCBzeW1ib2xzIHRvIGJlIGJ1aWx0LgorYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGx0X2FsbG93X3VuZGVmaW5lZF9mbGFnCisKKyMgRmxhZyB0aGF0IGZvcmNlcyBubyB1bmRlZmluZWQgc3ltYm9scy4KK25vX3VuZGVmaW5lZF9mbGFnPSRsdF9ub191bmRlZmluZWRfZmxhZworCisjIENvbW1hbmRzIHVzZWQgdG8gZmluaXNoIGEgbGlidG9vbCBsaWJyYXJ5IGluc3RhbGxhdGlvbiBpbiBhIGRpcmVjdG9yeS4KK2ZpbmlzaF9jbWRzPSRsdF9maW5pc2hfY21kcworCisjIFNhbWUgYXMgYWJvdmUsIGJ1dCBhIHNpbmdsZSBzY3JpcHQgZnJhZ21lbnQgdG8gYmUgZXZhbGVkIGJ1dCBub3Qgc2hvd24uCitmaW5pc2hfZXZhbD0kbHRfZmluaXNoX2V2YWwKKworIyBUYWtlIHRoZSBvdXRwdXQgb2Ygbm0gYW5kIHByb2R1Y2UgYSBsaXN0aW5nIG9mIHJhdyBzeW1ib2xzIGFuZCBDIG5hbWVzLgorZ2xvYmFsX3N5bWJvbF9waXBlPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlCisKKyMgVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgorZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wKKworIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIEMgbmFtZSBhZGRyZXNzIHBhaXIKK2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzCisKKyMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcnVudGltZSBwYXRoIHZhcmlhYmxlLgorcnVucGF0aF92YXI9JHJ1bnBhdGhfdmFyCisKKyMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcGF0aCB2YXJpYWJsZS4KK3NobGlicGF0aF92YXI9JHNobGlicGF0aF92YXIKKworIyBJcyBzaGxpYnBhdGggc2VhcmNoZWQgYmVmb3JlIHRoZSBoYXJkLWNvZGVkIGxpYnJhcnkgc2VhcmNoIHBhdGg/CitzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9JHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aAorCisjIEhvdyB0byBoYXJkY29kZSBhIHNoYXJlZCBsaWJyYXJ5IHBhdGggaW50byBhbiBleGVjdXRhYmxlLgoraGFyZGNvZGVfYWN0aW9uPSRoYXJkY29kZV9hY3Rpb24KKworIyBXaGV0aGVyIHdlIHNob3VsZCBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gbGlicmFyaWVzLgoraGFyZGNvZGVfaW50b19saWJzPSRoYXJkY29kZV9pbnRvX2xpYnMKKworIyBGbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8gYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuCisjIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcyBub3QgZXhpc3QuCitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSRsdF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjCisKKyMgSWYgbGQgaXMgdXNlZCB3aGVuIGxpbmtpbmcsIGZsYWcgdG8gaGFyZGNvZGUgXCRsaWJkaXIgaW50bworIyBhIGJpbmFyeSBkdXJpbmcgbGlua2luZy4gVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiBcJGxpYmRpciBkb2VzCisjIG5vdCBleGlzdC4KK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQ9JGx0X2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQKKworIyBXaGV0aGVyIHdlIG5lZWQgYSBzaW5nbGUgLXJwYXRoIGZsYWcgd2l0aCBhIHNlcGFyYXRlZCBhcmd1bWVudC4KK2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9JGx0X2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IKKworIyBTZXQgdG8geWVzIGlmIHVzaW5nIERJUi9saWJOQU1FJHtzaGFyZWRfZXh0fSBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCisjIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9kaXJlY3Q9JGhhcmRjb2RlX2RpcmVjdAorCisjIFNldCB0byB5ZXMgaWYgdXNpbmcgdGhlIC1MRElSIGZsYWcgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQorIyByZXN1bHRpbmcgYmluYXJ5LgoraGFyZGNvZGVfbWludXNfTD0kaGFyZGNvZGVfbWludXNfTAorCisjIFNldCB0byB5ZXMgaWYgdXNpbmcgU0hMSUJQQVRIX1ZBUj1ESVIgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvCisjIHRoZSByZXN1bHRpbmcgYmluYXJ5LgoraGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj0kaGFyZGNvZGVfc2hsaWJwYXRoX3ZhcgorCisjIFNldCB0byB5ZXMgaWYgYnVpbGRpbmcgYSBzaGFyZWQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGhhcmRjb2RlcyBESVIgaW50byB0aGUgbGlicmFyeQorIyBhbmQgYWxsIHN1YnNlcXVlbnQgbGlicmFyaWVzIGFuZCBleGVjdXRhYmxlcyBsaW5rZWQgYWdhaW5zdCBpdC4KK2hhcmRjb2RlX2F1dG9tYXRpYz0kaGFyZGNvZGVfYXV0b21hdGljCisKKyMgVmFyaWFibGVzIHdob3NlIHZhbHVlcyBzaG91bGQgYmUgc2F2ZWQgaW4gbGlidG9vbCB3cmFwcGVyIHNjcmlwdHMgYW5kCisjIHJlc3RvcmVkIGF0IHJlbGluayB0aW1lLgordmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9IiR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluayIKKworIyBXaGV0aGVyIGxpYnRvb2wgbXVzdCBsaW5rIGEgcHJvZ3JhbSBhZ2FpbnN0IGFsbCBpdHMgZGVwZW5kZW5jeSBsaWJyYXJpZXMuCitsaW5rX2FsbF9kZXBsaWJzPSRsaW5rX2FsbF9kZXBsaWJzCisKKyMgQ29tcGlsZS10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCitzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9JGx0X3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYworCisjIFJ1bi10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCitzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMKKworIyBGaXggdGhlIHNoZWxsIHZhcmlhYmxlIFwkc3JjZmlsZSBmb3IgdGhlIGNvbXBpbGVyLgorZml4X3NyY2ZpbGVfcGF0aD0iJGZpeF9zcmNmaWxlX3BhdGgiCisKKyMgU2V0IHRvIHllcyBpZiBleHBvcnRlZCBzeW1ib2xzIGFyZSByZXF1aXJlZC4KK2Fsd2F5c19leHBvcnRfc3ltYm9scz0kYWx3YXlzX2V4cG9ydF9zeW1ib2xzCisKKyMgVGhlIGNvbW1hbmRzIHRvIGxpc3QgZXhwb3J0ZWQgc3ltYm9scy4KK2V4cG9ydF9zeW1ib2xzX2NtZHM9JGx0X2V4cG9ydF9zeW1ib2xzX2NtZHMKKworIyBUaGUgY29tbWFuZHMgdG8gZXh0cmFjdCB0aGUgZXhwb3J0ZWQgc3ltYm9sIGxpc3QgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgorZXh0cmFjdF9leHBzeW1zX2NtZHM9JGx0X2V4dHJhY3RfZXhwc3ltc19jbWRzCisKKyMgU3ltYm9scyB0aGF0IHNob3VsZCBub3QgYmUgbGlzdGVkIGluIHRoZSBwcmVsb2FkZWQgc3ltYm9scy4KK2V4Y2x1ZGVfZXhwc3ltcz0kbHRfZXhjbHVkZV9leHBzeW1zCisKKyMgU3ltYm9scyB0aGF0IG11c3QgYWx3YXlzIGJlIGV4cG9ydGVkLgoraW5jbHVkZV9leHBzeW1zPSRsdF9pbmNsdWRlX2V4cHN5bXMKKworIyAjIyMgRU5EIExJQlRPT0wgQ09ORklHCisKK19fRU9GX18KKworCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgYWl4MyopCisgICAgY2F0IDw8XEVPRiA+PiAiJGNmZ2ZpbGUiCisKKyMgQUlYIHNvbWV0aW1lcyBoYXMgcHJvYmxlbXMgd2l0aCB0aGUgR0NDIGNvbGxlY3QyIHByb2dyYW0uICBGb3Igc29tZQorIyByZWFzb24sIGlmIHdlIHNldCB0aGUgQ09MTEVDVF9OQU1FUyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdGhlIHByb2JsZW1zCisjIHZhbmlzaCBpbiBhIHB1ZmYgb2Ygc21va2UuCitpZiB0ZXN0ICJYJHtDT0xMRUNUX05BTUVTK3NldH0iICE9IFhzZXQ7IHRoZW4KKyAgQ09MTEVDVF9OQU1FUz0KKyAgZXhwb3J0IENPTExFQ1RfTkFNRVMKK2ZpCitFT0YKKyAgICA7OworICBlc2FjCisKKyAgIyBXZSB1c2Ugc2VkIGluc3RlYWQgb2YgY2F0IGJlY2F1c2UgYmFzaCBvbiBESkdQUCBnZXRzIGNvbmZ1c2VkIGlmCisgICMgaWYgZmluZHMgbWl4ZWQgQ1IvTEYgYW5kIExGLW9ubHkgbGluZXMuICBTaW5jZSBzZWQgb3BlcmF0ZXMgaW4KKyAgIyB0ZXh0IG1vZGUsIGl0IHByb3Blcmx5IGNvbnZlcnRzIGxpbmVzIHRvIENSL0xGLiAgVGhpcyBiYXNoIHByb2JsZW0KKyAgIyBpcyByZXBvcnRlZGx5IGZpeGVkLCBidXQgd2h5IG5vdCBydW4gb24gb2xkIHZlcnNpb25zIHRvbz8KKyAgc2VkICckcScgIiRsdG1haW4iID4+ICIkY2ZnZmlsZSIgfHwgKHJtIC1mICIkY2ZnZmlsZSI7IGV4aXQgMSkKKworICBtdiAtZiAiJGNmZ2ZpbGUiICIkb2ZpbGUiIHx8IFwKKyAgICAocm0gLWYgIiRvZmlsZSIgJiYgY3AgIiRjZmdmaWxlIiAiJG9maWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUiKQorICBjaG1vZCAreCAiJG9maWxlIgorCitlbHNlCisgICMgSWYgdGhlcmUgaXMgbm8gTWFrZWZpbGUgeWV0LCB3ZSByZWx5IG9uIGEgbWFrZSBydWxlIHRvIGV4ZWN1dGUKKyAgIyBgY29uZmlnLnN0YXR1cyAtLXJlY2hlY2snIHRvIHJlcnVuIHRoZXNlIHRlc3RzIGFuZCBjcmVhdGUgdGhlCisgICMgbGlidG9vbCBzY3JpcHQgdGhlbi4KKyAgbHRtYWluX2luPWBlY2hvICRsdG1haW4gfCBzZWQgLWUgJ3MvXC5zaCQvLmluLydgCisgIGlmIHRlc3QgLWYgIiRsdG1haW5faW4iOyB0aGVuCisgICAgdGVzdCAtZiBNYWtlZmlsZSAmJiBtYWtlICIkbHRtYWluIgorICBmaQorZmkKKworCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKK0NDPSIkbHRfc2F2ZV9DQyIKKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLXRhZ3Mgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX3RhZ3Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX3RhZ3M7IHRhZ25hbWVzPSIkd2l0aHZhbCIKK2ZpCisKKworaWYgdGVzdCAtZiAiJGx0bWFpbiIgJiYgdGVzdCAtbiAiJHRhZ25hbWVzIjsgdGhlbgorICBpZiB0ZXN0ICEgLWYgIiR7b2ZpbGV9IjsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogb3V0cHV0IGZpbGUgXGAkb2ZpbGUnIGRvZXMgbm90IGV4aXN0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IG91dHB1dCBmaWxlIFxgJG9maWxlJyBkb2VzIG5vdCBleGlzdCIgPiYyO30KKyAgZmkKKworICBpZiB0ZXN0IC16ICIkTFRDQyI7IHRoZW4KKyAgICBldmFsICJgJFNIRUxMICR7b2ZpbGV9IC0tY29uZmlnIHwgZ3JlcCAnXkxUQ0M9J2AiCisgICAgaWYgdGVzdCAteiAiJExUQ0MiOyB0aGVuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IG91dHB1dCBmaWxlIFxgJG9maWxlJyBkb2VzIG5vdCBsb29rIGxpa2UgYSBsaWJ0b29sIHNjcmlwdCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBvdXRwdXQgZmlsZSBcYCRvZmlsZScgZG9lcyBub3QgbG9vayBsaWtlIGEgbGlidG9vbCBzY3JpcHQiID4mMjt9CisgICAgZWxzZQorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBcYExUQ0M9JExUQ0MnLCBleHRyYWN0ZWQgZnJvbSBcYCRvZmlsZSciID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgXGBMVENDPSRMVENDJywgZXh0cmFjdGVkIGZyb20gXGAkb2ZpbGUnIiA+JjI7fQorICAgIGZpCisgIGZpCisKKyAgIyBFeHRyYWN0IGxpc3Qgb2YgYXZhaWxhYmxlIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBpbiAkb2ZpbGUuCisgICMgTm90ZSB0aGF0IHRoaXMgYXNzdW1lcyB0aGUgZW50aXJlIGxpc3QgaXMgb24gb25lIGxpbmUuCisgIGF2YWlsYWJsZV90YWdzPWBncmVwICJeYXZhaWxhYmxlX3RhZ3M9IiAiJHtvZmlsZX0iIHwgJFNFRCAtZSAncy9hdmFpbGFibGVfdGFncz1cKC4qJFwpL1wxLycgLWUgJ3MvXCIvL2cnYAorCisgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgorICBmb3IgdGFnbmFtZSBpbiAkdGFnbmFtZXM7IGRvCisgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgIyBDaGVjayB3aGV0aGVyIHRhZ25hbWUgY29udGFpbnMgb25seSB2YWxpZCBjaGFyYWN0ZXJzCisgICAgY2FzZSBgJGVjaG8gIlgkdGFnbmFtZSIgfCAkWHNlZCAtZSAnczpbLV9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MTIzNDU2Nzg5MCwvXTo6ZydgIGluCisgICAgIiIpIDs7CisgICAgKikgIGFzX2ZuX2Vycm9yICJpbnZhbGlkIHRhZyBuYW1lOiAkdGFnbmFtZSIgIiRMSU5FTk8iIDUKKwk7OworICAgIGVzYWMKKworICAgIGlmIGdyZXAgIl4jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lJCIgPCAiJHtvZmlsZX0iID4gL2Rldi9udWxsCisgICAgdGhlbgorICAgICAgYXNfZm5fZXJyb3IgInRhZyBuYW1lIFwiJHRhZ25hbWVcIiBhbHJlYWR5IGV4aXN0cyIgIiRMSU5FTk8iIDUKKyAgICBmaQorCisgICAgIyBVcGRhdGUgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIHRhZ3MuCisgICAgaWYgdGVzdCAtbiAiJHRhZ25hbWUiOyB0aGVuCisgICAgICBlY2hvIGFwcGVuZGluZyBjb25maWd1cmF0aW9uIHRhZyBcIiR0YWduYW1lXCIgdG8gJG9maWxlCisKKyAgICAgIGNhc2UgJHRhZ25hbWUgaW4KKyAgICAgIENYWCkKKwlpZiB0ZXN0IC1uICIkQ1hYIiAmJiB0ZXN0ICJYJENYWCIgIT0gIlhubyI7IHRoZW4KKwkgIGFjX2V4dD1jcHAKK2FjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251CisKKworCisKK2FyY2hpdmVfY21kc19uZWVkX2xjX0NYWD1ubworYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPQorYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0NYWD1ubworYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9CitleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPQoraGFyZGNvZGVfZGlyZWN0X0NYWD1ubworaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9CitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0NYWD0KK2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPQoraGFyZGNvZGVfbWludXNfTF9DWFg9bm8KK2hhcmRjb2RlX2F1dG9tYXRpY19DWFg9bm8KK21vZHVsZV9jbWRzX0NYWD0KK21vZHVsZV9leHBzeW1fY21kc19DWFg9CitsaW5rX2FsbF9kZXBsaWJzX0NYWD11bmtub3duCitvbGRfYXJjaGl2ZV9jbWRzX0NYWD0kb2xkX2FyY2hpdmVfY21kcworbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYPQord2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYPQorZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19DWFg9bm8KKworIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYmVmb3JlIGFuZCBhZnRlciB0aGUgb2JqZWN0IGJlaW5nIGxpbmtlZDoKK3ByZWRlcF9vYmplY3RzX0NYWD0KK3Bvc3RkZXBfb2JqZWN0c19DWFg9CitwcmVkZXBzX0NYWD0KK3Bvc3RkZXBzX0NYWD0KK2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9DWFg9CisKKyMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBDKysgdGVzdCBzb3VyY2VzLgorYWNfZXh0PWNjCisKKyMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBDKysgdGVzdCBzb3VyY2VzLgorb2JqZXh0PW8KK29iamV4dF9DWFg9JG9iamV4dAorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSJpbnQgc29tZV92YXJpYWJsZSA9IDA7XG4iCisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCitsdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9J2ludCBtYWluKGludCwgY2hhciAqKSB7IHJldHVybigwKTsgfVxuJworCisjIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCisKKyMgSWYgbm8gQyBjb21waWxlciB3YXMgc3BlY2lmaWVkLCB1c2UgQ0MuCitMVENDPSR7TFRDQy0iJENDIn0KKworIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KK2NvbXBpbGVyPSRDQworCisKKyMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCitsdF9zYXZlX0NDPSRDQworbHRfc2F2ZV9MRD0kTEQKK2x0X3NhdmVfR0NDPSRHQ0MKK0dDQz0kR1hYCitsdF9zYXZlX3dpdGhfZ251X2xkPSR3aXRoX2dudV9sZAorbHRfc2F2ZV9wYXRoX0xEPSRsdF9jdl9wYXRoX0xECitpZiB0ZXN0IC1uICIke2x0X2N2X3Byb2dfZ251X2xkY3h4K3NldH0iOyB0aGVuCisgIGx0X2N2X3Byb2dfZ251X2xkPSRsdF9jdl9wcm9nX2dudV9sZGN4eAorZWxzZQorICB1bnNldCBsdF9jdl9wcm9nX2dudV9sZAorZmkKK2lmIHRlc3QgLW4gIiR7bHRfY3ZfcGF0aF9MRENYWCtzZXR9IjsgdGhlbgorICBsdF9jdl9wYXRoX0xEPSRsdF9jdl9wYXRoX0xEQ1hYCitlbHNlCisgIHVuc2V0IGx0X2N2X3BhdGhfTEQKK2ZpCit0ZXN0IC16ICIke0xEQ1hYK3NldH0iIHx8IExEPSRMRENYWAorQ0M9JHtDWFgtImMrKyJ9Citjb21waWxlcj0kQ0MKK2NvbXBpbGVyX0NYWD0kQ0MKK2NjX2Jhc2VuYW1lPWAkZWNobyBYIiRjb21waWxlciIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorCisjIFdlIGRvbid0IHdhbnQgLWZuby1leGNlcHRpb24gd2VuIGNvbXBpbGluZyBDKysgY29kZSwgc28gc2V0IHRoZQorIyBub19idWlsdGluX2ZsYWcgc2VwYXJhdGVseQoraWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfQ1hYPScgLWZuby1idWlsdGluJworZWxzZQorICBsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19DWFg9CitmaQorCitpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAjIFNldCB1cCBkZWZhdWx0IEdOVSBDKysgY29uZmlndXJhdGlvbgorCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ251LWxkIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9nbnVfbGQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX2dudV9sZDsgdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzCitlbHNlCisgIHdpdGhfZ251X2xkPW5vCitmaQorCithY19wcm9nPWxkCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgbGQgdXNlZCBieSAkQ0MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgJENDLi4uICIgPiY2OyB9CisgIGNhc2UgJGhvc3QgaW4KKyAgKi0qLW1pbmd3KikKKyAgICAjIGdjYyBsZWF2ZXMgYSB0cmFpbGluZyBjYXJyaWFnZSByZXR1cm4gd2hpY2ggdXBzZXRzIG1pbmd3CisgICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1IHwgdHIgLWQgJ1wwMTUnYCA7OworICAqKQorICAgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAgOzsKKyAgZXNhYworICBjYXNlICRhY19wcm9nIGluCisgICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCisgICAgW1xcL10qIHwgPzpbXFwvXSopCisgICAgICByZV9kaXJlbHQ9Jy9bXi9dW14vXSovXC5cLi8nCisgICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aG5hbWUgb2YgbGQKKyAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8ICRTRUQgJ3MlXFxcXCUvJWcnYAorICAgICAgd2hpbGUgZWNobyAkYWNfcHJvZyB8IGdyZXAgIiRyZV9kaXJlbHQiID4gL2Rldi9udWxsIDI+JjE7IGRvCisJYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgJFNFRCAicyUkcmVfZGlyZWx0JS8lImAKKyAgICAgIGRvbmUKKyAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgorICAgICAgOzsKKyAgIiIpCisgICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCisgICAgYWNfcHJvZz1sZAorICAgIDs7CisgICopCisgICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgorICAgIHdpdGhfZ251X2xkPXVua25vd24KKyAgICA7OworICBlc2FjCitlbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgR05VIGxkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBHTlUgbGQuLi4gIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igbm9uLUdOVSBsZC4uLiAiID4mNjsgfQorZmkKK2lmIHRlc3QgIiR7bHRfY3ZfcGF0aF9MRCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLXogIiRMRCI7IHRoZW4KKyAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nIiB8fCB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nJGFjX2V4ZWV4dCI7IHRoZW4KKyAgICAgIGx0X2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCisgICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCisgICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCisgICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KKyAgICAgIGNhc2UgYCIkbHRfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8L2Rldi9udWxsYCBpbgorICAgICAgKkdOVSogfCAqJ3dpdGggQkZEJyopCisJdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhaworCTs7CisgICAgICAqKQorCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCisJOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICBkb25lCisgIElGUz0iJGx0X3NhdmVfaWZzIgorZWxzZQorICBsdF9jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorZmkKK2ZpCisKK0xEPSIkbHRfY3ZfcGF0aF9MRCIKK2lmIHRlc3QgLW4gIiRMRCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRMRCIgPiY1CiskYXNfZWNobyAiJExEIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQordGVzdCAteiAiJExEIiAmJiBhc19mbl9lcnJvciAibm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEgiICIkTElORU5PIiA1Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2x0X2N2X3Byb2dfZ251X2xkK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KK2Nhc2UgYCRMRCAtdiAyPiYxIDwvZGV2L251bGxgIGluCisqR05VKiB8ICond2l0aCBCRkQnKikKKyAgbHRfY3ZfcHJvZ19nbnVfbGQ9eWVzCisgIDs7CisqKQorICBsdF9jdl9wcm9nX2dudV9sZD1ubworICA7OworZXNhYworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19nbnVfbGQiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2dudV9sZCIgPiY2OyB9Cit3aXRoX2dudV9sZD0kbHRfY3ZfcHJvZ19nbnVfbGQKKworCisKKyAgIyBDaGVjayBpZiBHTlUgQysrIHVzZXMgR05VIGxkIGFzIHRoZSB1bmRlcmx5aW5nIGxpbmtlciwgc2luY2UgdGhlCisgICMgYXJjaGl2aW5nIGNvbW1hbmRzIGJlbG93IGFzc3VtZSB0aGF0IEdOVSBsZCBpcyBiZWluZyB1c2VkLgorICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tLXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisKKyAgICAjIElmIGFyY2hpdmVfY21kcyBydW5zIExELCBub3QgQ0MsIHdsYXJjIHNob3VsZCBiZSBlbXB0eQorICAgICMgWFhYIEkgdGhpbmsgd2xhcmMgY2FuIGJlIGVsaW1pbmF0ZWQgaW4gbHRjZi1jeHgsIGJ1dCBJIG5lZWQgdG8KKyAgICAjICAgICBpbnZlc3RpZ2F0ZSBpdCBhIGxpdHRsZSBiaXQgbW9yZS4gKE1NKQorICAgIHdsYXJjPScke3dsfScKKworICAgICMgYW5jaWVudCBHTlUgbGQgZGlkbid0IHN1cHBvcnQgLS13aG9sZS1hcmNoaXZlIGV0LiBhbC4KKyAgICBpZiBldmFsICJgJENDIC1wcmludC1wcm9nLW5hbWU9bGRgIC0taGVscCAyPiYxIiB8IFwKKwlncmVwICduby13aG9sZS1hcmNoaXZlJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYPSIkd2xhcmMiJy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAnIiR3bGFyYyInLS1uby13aG9sZS1hcmNoaXZlJworICAgIGVsc2UKKyAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWD0KKyAgICBmaQorICBlbHNlCisgICAgd2l0aF9nbnVfbGQ9bm8KKyAgICB3bGFyYz0KKworICAgICMgQSBnZW5lcmljIGFuZCB2ZXJ5IHNpbXBsZSBkZWZhdWx0IHNoYXJlZCBsaWJyYXJ5IGNyZWF0aW9uCisgICAgIyBjb21tYW5kIGZvciBHTlUgQysrIGZvciB0aGUgY2FzZSB3aGVyZSBpdCB1c2VzIHRoZSBuYXRpdmUKKyAgICAjIGxpbmtlciwgaW5zdGVhZCBvZiBHTlUgbGQuICBJZiBwb3NzaWJsZSwgdGhpcyBzZXR0aW5nIHNob3VsZAorICAgICMgb3ZlcnJpZGRlbiB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgbmF0aXZlIGxpbmtlciBmZWF0dXJlcyBvbgorICAgICMgdGhlIHBsYXRmb3JtIGl0IGlzIGJlaW5nIHVzZWQgb24uCisgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbyAkbGliJworICBmaQorCisgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKyAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwICJcLUwiJworCitlbHNlCisgIEdYWD1ubworICB3aXRoX2dudV9sZD1ubworICB3bGFyYz0KK2ZpCisKKyMgUE9SVE1FOiBmaWxsIGluIGEgZGVzY3JpcHRpb24gb2YgeW91ciBzeXN0ZW0ncyBDKysgbGluayBjaGFyYWN0ZXJpc3RpY3MKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4uLiAiID4mNjsgfQorbGRfc2hsaWJzX0NYWD15ZXMKK2Nhc2UgJGhvc3Rfb3MgaW4KKyAgYWl4MyopCisgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgbGRfc2hsaWJzX0NYWD1ubworICAgIDs7CisgIGFpeDQqIHwgYWl4NSopCisgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKyAgICAgICMgT24gSUE2NCwgdGhlIGxpbmtlciBkb2VzIHJ1biB0aW1lIGxpbmtpbmcgYnkgZGVmYXVsdCwgc28gd2UgZG9uJ3QKKyAgICAgICMgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsLgorICAgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubworICAgICAgZXhwX3N5bV9mbGFnPSctQmV4cG9ydCcKKyAgICAgIG5vX2VudHJ5X2ZsYWc9IiIKKyAgICBlbHNlCisgICAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCisKKyAgICAgICMgVGVzdCBpZiB3ZSBhcmUgdHJ5aW5nIHRvIHVzZSBydW4gdGltZSBsaW5raW5nIG9yIG5vcm1hbAorICAgICAgIyBBSVggc3R5bGUgbGlua2luZy4gSWYgLWJydGwgaXMgc29tZXdoZXJlIGluIExERkxBR1MsIHdlCisgICAgICAjIG5lZWQgdG8gZG8gcnVudGltZSBsaW5raW5nLgorICAgICAgY2FzZSAkaG9zdF9vcyBpbiBhaXg0LlsyM118YWl4NC5bMjNdLip8YWl4NSopCisJZm9yIGxkX2ZsYWcgaW4gJExERkxBR1M7IGRvCisJICBjYXNlICRsZF9mbGFnIGluCisJICAqLWJydGwqKQorCSAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPXllcworCSAgICBicmVhaworCSAgICA7OworCSAgZXNhYworCWRvbmUKKyAgICAgIGVzYWMKKworICAgICAgZXhwX3N5bV9mbGFnPSctYmV4cG9ydCcKKyAgICAgIG5vX2VudHJ5X2ZsYWc9Jy1ibm9lbnRyeScKKyAgICBmaQorCisgICAgIyBXaGVuIGxhcmdlIGV4ZWN1dGFibGVzIG9yIHNoYXJlZCBvYmplY3RzIGFyZSBidWlsdCwgQUlYIGxkIGNhbgorICAgICMgaGF2ZSBwcm9ibGVtcyBjcmVhdGluZyB0aGUgdGFibGUgb2YgY29udGVudHMuICBJZiBsaW5raW5nIGEgbGlicmFyeQorICAgICMgb3IgcHJvZ3JhbSByZXN1bHRzIGluICJlcnJvciBUT0Mgb3ZlcmZsb3ciIGFkZCAtbW1pbmltYWwtdG9jIHRvCisgICAgIyBDWFhGTEFHUy9DRkxBR1MgZm9yIGcrKy9nY2MuICBJbiB0aGUgY2FzZXMgd2hlcmUgdGhhdCBpcyBub3QKKyAgICAjIGVub3VnaCB0byBmaXggdGhlIHByb2JsZW0sIGFkZCAtV2wsLWJiaWd0b2MgdG8gTERGTEFHUy4KKworICAgIGFyY2hpdmVfY21kc19DWFg9JycKKyAgICBoYXJkY29kZV9kaXJlY3RfQ1hYPXllcworICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPSc6JworICAgIGxpbmtfYWxsX2RlcGxpYnNfQ1hYPXllcworCisgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICAgIGNhc2UgJGhvc3Rfb3MgaW4gYWl4NC4wMTJ8YWl4NC4wMTIuKikKKyAgICAgICMgV2Ugb25seSB3YW50IHRvIGRvIHRoaXMgb24gQUlYIDQuMiBhbmQgbG93ZXIsIHRoZSBjaGVjaworICAgICAgIyBiZWxvdyBmb3IgYnJva2VuIGNvbGxlY3QyIGRvZXNuJ3Qgd29yayB1bmRlciA0LjMrCisJY29sbGVjdDJuYW1lPWAke0NDfSAtcHJpbnQtcHJvZy1uYW1lPWNvbGxlY3QyYAorCWlmIHRlc3QgLWYgIiRjb2xsZWN0Mm5hbWUiICYmIFwKKwkgICBzdHJpbmdzICIkY29sbGVjdDJuYW1lIiB8IGdyZXAgcmVzb2x2ZV9saWJfbmFtZSA+L2Rldi9udWxsCisJdGhlbgorCSAgIyBXZSBoYXZlIHJld29ya2VkIGNvbGxlY3QyCisJICBoYXJkY29kZV9kaXJlY3RfQ1hYPXllcworCWVsc2UKKwkgICMgV2UgaGF2ZSBvbGQgY29sbGVjdDIKKwkgIGhhcmRjb2RlX2RpcmVjdF9DWFg9dW5zdXBwb3J0ZWQKKwkgICMgSXQgZmFpbHMgdG8gZmluZCB1bmluc3RhbGxlZCBsaWJyYXJpZXMgd2hlbiB0aGUgdW5pbnN0YWxsZWQKKwkgICMgcGF0aCBpcyBub3QgbGlzdGVkIGluIHRoZSBsaWJwYXRoLiAgU2V0dGluZyBoYXJkY29kZV9taW51c19MCisJICAjIHRvIHVuc3VwcG9ydGVkIGZvcmNlcyByZWxpbmtpbmcKKwkgIGhhcmRjb2RlX21pbnVzX0xfQ1hYPXllcworCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9Jy1MJGxpYmRpcicKKwkgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPQorCWZpCisgICAgICBlc2FjCisgICAgICBzaGFyZWRfZmxhZz0nLXNoYXJlZCcKKyAgICBlbHNlCisgICAgICAjIG5vdCB1c2luZyBnY2MKKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJIyBWaXN1YWxBZ2UgQysrLCBWZXJzaW9uIDUuNSBmb3IgQUlYIDVMIGZvciBJQS02NCwgQmV0YSAzIFJlbGVhc2UKKwkjIGNob2tlcyBvbiAtV2wsLUcuIFRoZSBmb2xsb3dpbmcgbGluZSBpcyBjb3JyZWN0OgorCXNoYXJlZF9mbGFnPSctRycKKyAgICAgIGVsc2UKKwlpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKwkgIHNoYXJlZF9mbGFnPScke3dsfS1HJworCWVsc2UKKwkgIHNoYXJlZF9mbGFnPScke3dsfS1iTTpTUkUnCisJZmkKKyAgICAgIGZpCisgICAgZmkKKworICAgICMgSXQgc2VlbXMgdGhhdCAtYmV4cGFsbCBkb2VzIG5vdCBleHBvcnQgc3ltYm9scyBiZWdpbm5pbmcgd2l0aAorICAgICMgdW5kZXJzY29yZSAoXyksIHNvIGl0IGlzIGJldHRlciB0byBnZW5lcmF0ZSBhIGxpc3Qgb2Ygc3ltYm9scyB0byBleHBvcnQuCisgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0NYWD15ZXMKKyAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKyAgICAgICMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1bnRpbWUgbG9hZGluZyBmbGFncyAoLWJydGwpLAorICAgICAgIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgorICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPSctYmVyb2snCisgICAgICAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4gZW1wdHkgZXhlY3V0YWJsZS4KKyAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY3h4X3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisKK2FpeF9saWJwYXRoPWBkdW1wIC1IIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgJy9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsgL14wLyB7IHMvXjAgICpcKC4qXCkkL1wxLzsgcDsgfQorfSdgCisjIENoZWNrIGZvciBhIDY0LWJpdCBvYmplY3QgaWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcuCitpZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPWBkdW1wIC1IWDY0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgJy9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsgL14wLyB7IHMvXjAgICpcKC4qXCkkL1wxLzsgcDsgfQorfSdgOyBmaQorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitpZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPSIvdXNyL2xpYjovbGliIjsgZmkKKworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCisKKyAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSJcJENDIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgYGlmIHRlc3QgIngke2FsbG93X3VuZGVmaW5lZF9mbGFnfSIgIT0gIngiOyB0aGVuIGVjaG8gIiR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30iOyBlbHNlIDo7IGZpYCAnIlwke3dsfSRub19lbnRyeV9mbGFnIFwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyAkc2hhcmVkX2ZsYWciCisgICAgIGVsc2UKKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LVIgJGxpYmRpcjovdXNyL2xpYjovbGliJworCWFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0iLXogbm9kZWZzIgorCWFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30gJyJcJHt3bH0kbm9fZW50cnlfZmxhZyBcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMiCisgICAgICBlbHNlCisJIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuIGVtcHR5IGV4ZWN1dGFibGUuCisJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jeHhfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKworYWl4X2xpYnBhdGg9YGR1bXAgLUggY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAnL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geyAvXjAvIHsgcy9eMCAgKlwoLipcKSQvXDEvOyBwOyB9Cit9J2AKKyMgQ2hlY2sgZm9yIGEgNjQtYml0IG9iamVjdCBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZy4KK2lmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9YGR1bXAgLUhYNjQgY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAnL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geyAvXjAvIHsgcy9eMCAgKlwoLipcKSQvXDEvOyBwOyB9Cit9J2A7IGZpCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2lmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9Ii91c3IvbGliOi9saWIiOyBmaQorCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCisJIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVuIHRpbWUgbG9hZGluZyBmbGFncywKKwkjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCisJbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYPScgJHt3bH0tYmVybm90b2snCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPScgJHt3bH0tYmVyb2snCisJIyAtYmV4cGFsbCBkb2VzIG5vdCBleHBvcnQgc3ltYm9scyBiZWdpbm5pbmcgd2l0aCB1bmRlcnNjb3JlIChfKQorCWFsd2F5c19leHBvcnRfc3ltYm9sc19DWFg9eWVzCisJIyBFeHBvcnRlZCBzeW1ib2xzIGNhbiBiZSBwdWxsZWQgaW50byBzaGFyZWQgb2JqZWN0cyBmcm9tIGFyY2hpdmVzCisJd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYPScgJworCWFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD15ZXMKKwkjIFRoaXMgaXMgc2ltaWxhciB0byBob3cgQUlYIHRyYWRpdGlvbmFsbHkgYnVpbGRzIGl0J3Mgc2hhcmVkIGxpYnJhcmllcy4KKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1iRTokZXhwb3J0X3N5bWJvbHMgJHt3bH0tYm5vZW50cnkke2FsbG93X3VuZGVmaW5lZF9mbGFnfX4kQVIgJEFSX0ZMQUdTICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lJHJlbGVhc2UuYSAkb3V0cHV0X29iamRpci8kc29uYW1lJworICAgICAgZmkKKyAgICBmaQorICAgIDs7CisgIGNob3J1cyopCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICopCisJIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJbGRfc2hsaWJzX0NYWD1ubworCTs7CisgICAgZXNhYworICAgIDs7CisKKyAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQorICAgICMgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCBDWFgpIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLAorICAgICMgYXMgdGhlcmUgaXMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9Jy1MJGxpYmRpcicKKyAgICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9dW5zdXBwb3J0ZWQKKyAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHNfQ1hYPW5vCisgICAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19DWFg9eWVzCisKKyAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICdhdXRvLWltcG9ydCcgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0taW1hZ2UtYmFzZT0weDEwMDAwMDAwICR7d2x9LS1vdXQtaW1wbGliLCRsaWInCisgICAgICAjIElmIHRoZSBleHBvcnQtc3ltYm9scyBmaWxlIGFscmVhZHkgaXMgYSAuZGVmIGZpbGUgKDFzdCBsaW5lCisgICAgICAjIGlzIEVYUE9SVFMpLCB1c2UgaXQgYXMgaXM7IG90aGVyd2lzZSwgcHJlcGVuZC4uLgorICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9J2lmIHRlc3QgInhgJFNFRCAxcSAkZXhwb3J0X3N5bWJvbHNgIiA9IHhFWFBPUlRTOyB0aGVuCisJY3AgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworICAgICAgZWxzZQorCWVjaG8gRVhQT1JUUyA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCWNhdCAkZXhwb3J0X3N5bWJvbHMgPj4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisgICAgICBmaX4KKyAgICAgICRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0taW1hZ2UtYmFzZT0weDEwMDAwMDAwICR7d2x9LS1vdXQtaW1wbGliLCRsaWInCisgICAgZWxzZQorICAgICAgbGRfc2hsaWJzX0NYWD1ubworICAgIGZpCisgIDs7CisKKyAgZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICBhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFg9bm8KKyAgICBjYXNlICIkaG9zdF9vcyIgaW4KKyAgICByaGFwc29keSogfCBkYXJ3aW4xLlswMTJdKQorICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPSctdW5kZWZpbmVkIHN1cHByZXNzJworICAgICAgOzsKKyAgICAqKSAjIERhcndpbiAxLjMgb24KKyAgICAgIGlmIHRlc3QgLXogJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVR9IDsgdGhlbgorICAgICAgCWFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0nLWZsYXRfbmFtZXNwYWNlIC11bmRlZmluZWQgc3VwcHJlc3MnCisgICAgICBlbHNlCisgICAgICAgIGNhc2UgJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVR9IGluCisgICAgICAgICAgMTAuWzAxMl0pCisgICAgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9Jy1mbGF0X25hbWVzcGFjZSAtdW5kZWZpbmVkIHN1cHByZXNzJworICAgICAgICAgICAgOzsKKyAgICAgICAgICAxMC4qKQorICAgICAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPSctdW5kZWZpbmVkIGR5bmFtaWNfbG9va3VwJworICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgZmkKKyAgICAgIDs7CisgICAgZXNhYworICAgIGx0X2ludF9hcHBsZV9jY19zaW5nbGVfbW9kPW5vCisgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2VjaG8nCisgICAgaWYgJENDIC1kdW1wc3BlY3MgMj4mMSB8IGdyZXAgJ3NpbmdsZV9tb2R1bGUnID4vZGV2L251bGwgOyB0aGVuCisgICAgICBsdF9pbnRfYXBwbGVfY2Nfc2luZ2xlX21vZD15ZXMKKyAgICBmaQorICAgIGlmIHRlc3QgIlgkbHRfaW50X2FwcGxlX2NjX3NpbmdsZV9tb2QiID0gWHllcyA7IHRoZW4KKyAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtZHluYW1pY2xpYiAtc2luZ2xlX21vZHVsZSAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nJworICAgIGVsc2UKKyAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtciAke3dsfS1iaW5kX2F0X2xvYWQgLWtlZXBfcHJpdmF0ZV9leHRlcm5zIC1ub3N0ZGxpYiAtbyAke2xpYn0tbWFzdGVyLm8gJGxpYm9ianN+JENDIC1keW5hbWljbGliICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICR7bGlifS1tYXN0ZXIubyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nJworICAgIGZpCisgICAgbW9kdWxlX2NtZHNfQ1hYPSckQ0MgJHt3bH0tYmluZF9hdF9sb2FkICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3MnCisKKyAgICAjIERvbid0IGZpeCB0aGlzIGJ5IHVzaW5nIHRoZSBsZCAtZXhwb3J0ZWRfc3ltYm9sc19saXN0IGZsYWcsIGl0IGRvZXNuJ3QgZXhpc3QgaW4gb2xkZXIgZGFyd2luIGxkJ3MKKyAgICBpZiB0ZXN0ICJYJGx0X2ludF9hcHBsZV9jY19zaW5nbGVfbW9kIiA9IFh5ZXMgOyB0aGVuCisgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgLWR5bmFtaWNsaWIgLXNpbmdsZV9tb2R1bGUgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZ35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCisgICAgZWxzZQorICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDIC1yICR7d2x9LWJpbmRfYXRfbG9hZCAta2VlcF9wcml2YXRlX2V4dGVybnMgLW5vc3RkbGliIC1vICR7bGlifS1tYXN0ZXIubyAkbGlib2Jqc34kQ0MgLWR5bmFtaWNsaWIgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJHtsaWJ9LW1hc3Rlci5vICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lICRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmd+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgIGZpCisgICAgbW9kdWxlX2V4cHN5bV9jbWRzX0NYWD0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnICAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3N+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgIGhhcmRjb2RlX2RpcmVjdF9DWFg9bm8KKyAgICBoYXJkY29kZV9hdXRvbWF0aWNfQ1hYPXllcworICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfQ1hYPXVuc3VwcG9ydGVkCisgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYPSctYWxsX2xvYWQgJGNvbnZlbmllbmNlJworICAgIGxpbmtfYWxsX2RlcGxpYnNfQ1hYPXllcworICBlbHNlCisgICAgbGRfc2hsaWJzX0NYWD1ubworICBmaQorICAgIDs7CisKKyAgZGd1eCopCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIGVjKyspCisJIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJbGRfc2hsaWJzX0NYWD1ubworCTs7CisgICAgICBnaGN4KQorCSMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCisJIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJbGRfc2hsaWJzX0NYWD1ubworCTs7CisgICAgICAqKQorCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCWxkX3NobGlic19DWFg9bm8KKwk7OworICAgIGVzYWMKKyAgICA7OworICBmcmVlYnNkMTIqKQorICAgICMgQysrIHNoYXJlZCBsaWJyYXJpZXMgcmVwb3J0ZWQgdG8gYmUgZmFpcmx5IGJyb2tlbiBiZWZvcmUgc3dpdGNoIHRvIEVMRgorICAgIGxkX3NobGlic19DWFg9bm8KKyAgICA7OworICBmcmVlYnNkLWVsZiopCisgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPW5vCisgICAgOzsKKyAgZnJlZWJzZCogfCBrZnJlZWJzZCotZ251KQorICAgICMgRnJlZUJTRCAzIGFuZCBsYXRlciB1c2UgR05VIEMrKyBhbmQgR05VIGxkIHdpdGggc3RhbmRhcmQgRUxGCisgICAgIyBjb252ZW50aW9ucworICAgIGxkX3NobGlic19DWFg9eWVzCisgICAgOzsKKyAgZ251KikKKyAgICA7OworICBocHV4OSopCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKKyAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPScke3dsfS1FJworICAgIGhhcmRjb2RlX2RpcmVjdF9DWFg9eWVzCisgICAgaGFyZGNvZGVfbWludXNfTF9DWFg9eWVzICMgTm90IGluIHRoZSBzZWFyY2ggUEFUSCwKKwkJCQkjIGJ1dCBhcyB0aGUgZGVmYXVsdAorCQkJCSMgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCisKKyAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgIENDKQorICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgICBsZF9zaGxpYnNfQ1hYPW5vCisgICAgICA7OworICAgIGFDQykKKyAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRybSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRDQyAtYiAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJworICAgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworICAgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisgICAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKyAgICAgICMKKyAgICAgICMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KKyAgICAgICMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCisgICAgICAjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisgICAgICAjIGRlcGVuZGVuY2llcy4KKyAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gKCRDQyAtYiAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSkgfCBncmVwICItTCJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZWNobyAkbGlzdCcKKyAgICAgIDs7CisgICAgKikKKyAgICAgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisgICAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRybSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAtZlBJQyAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJworICAgICAgZWxzZQorICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgICAgbGRfc2hsaWJzX0NYWD1ubworICAgICAgZmkKKyAgICAgIDs7CisgICAgZXNhYworICAgIDs7CisgIGhwdXgxMCp8aHB1eDExKikKKyAgICBpZiB0ZXN0ICR3aXRoX2dudV9sZCA9IG5vOyB0aGVuCisgICAgICBjYXNlICIkaG9zdF9jcHUiIGluCisgICAgICBocHBhKjY0KikKKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9DWFg9JytiICRsaWJkaXInCisJaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9OgorICAgICAgICA7OworICAgICAgaWE2NCopCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9Jy1MJGxpYmRpcicKKyAgICAgICAgOzsKKyAgICAgICopCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworCWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKKwlleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPScke3dsfS1FJworICAgICAgICA7OworICAgICAgZXNhYworICAgIGZpCisgICAgY2FzZSAiJGhvc3RfY3B1IiBpbgorICAgIGhwcGEqNjQqKQorICAgICAgaGFyZGNvZGVfZGlyZWN0X0NYWD1ubworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9DWFg9bm8KKyAgICAgIDs7CisgICAgaWE2NCopCisgICAgICBoYXJkY29kZV9kaXJlY3RfQ1hYPW5vCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWD1ubworICAgICAgaGFyZGNvZGVfbWludXNfTF9DWFg9eWVzICMgTm90IGluIHRoZSBzZWFyY2ggUEFUSCwKKwkJCQkJICAgICAgIyBidXQgYXMgdGhlIGRlZmF1bHQKKwkJCQkJICAgICAgIyBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKyAgICAgIDs7CisgICAgKikKKyAgICAgIGhhcmRjb2RlX2RpcmVjdF9DWFg9eWVzCisgICAgICBoYXJkY29kZV9taW51c19MX0NYWD15ZXMgIyBOb3QgaW4gdGhlIHNlYXJjaCBQQVRILAorCQkJCQkgICAgICAjIGJ1dCBhcyB0aGUgZGVmYXVsdAorCQkJCQkgICAgICAjIGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgQ0MpCisJIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJbGRfc2hsaWJzX0NYWD1ubworCTs7CisgICAgICBhQ0MpCisJY2FzZSAiJGhvc3RfY3B1IiBpbgorCWhwcGEqNjQqfGlhNjQqKQorCSAgYXJjaGl2ZV9jbWRzX0NYWD0nJExEIC1iICtoICRzb25hbWUgLW8gJGxpYiAkbGlua2VyX2ZsYWdzICRsaWJvYmpzICRkZXBsaWJzJworCSAgOzsKKwkqKQorCSAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCWVzYWMKKwkjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJIworCSMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KKwkjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQorCSMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKKwkjIGRlcGVuZGVuY2llcy4KKwlvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCgkQ0MgLWIgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEpIHwgZ3JlcCAiXC1MImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBlY2hvICRsaXN0JworCTs7CisgICAgICAqKQorCWlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisJICBpZiB0ZXN0ICR3aXRoX2dudV9sZCA9IG5vOyB0aGVuCisJICAgIGNhc2UgIiRob3N0X2NwdSIgaW4KKwkgICAgaWE2NCp8aHBwYSo2NCopCisJICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJExEIC1iICtoICRzb25hbWUgLW8gJGxpYiAkbGlua2VyX2ZsYWdzICRsaWJvYmpzICRkZXBsaWJzJworCSAgICAgIDs7CisJICAgICopCisJICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLW5vc3RkbGliIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgZmkKKwllbHNlCisJICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgIGxkX3NobGlic19DWFg9bm8KKwlmaQorCTs7CisgICAgZXNhYworICAgIDs7CisgIGlyaXg1KiB8IGlyaXg2KikKKyAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgQ0MpCisJIyBTR0kgQysrCisJYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLWFsbCAtbXVsdGlnb3QgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisKKwkjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKKwkjICJDQyAtYXIiLCB3aGVyZSAiQ0MiIGlzIHRoZSBJUklYIEMrKyBjb21waWxlci4gIFRoaXMgaXMKKwkjIG5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgaW5zdGFudGlhdGVkIHRlbXBsYXRlcyBhcmUgaW5jbHVkZWQKKwkjIGluIHRoZSBhcmNoaXZlLgorCW9sZF9hcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLWFyIC1XUiwtdSAtbyAkb2xkbGliICRvbGRvYmpzJworCTs7CisgICAgICAqKQorCWlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisJICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwkgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCSAgZWxzZQorCSAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAtbyAkbGliJworCSAgZmkKKwlmaQorCWxpbmtfYWxsX2RlcGxpYnNfQ1hYPXllcworCTs7CisgICAgZXNhYworICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9OgorICAgIDs7CisgIGxpbnV4KikKKyAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgS0NDKQorCSMgS3VjayBhbmQgQXNzb2NpYXRlcywgSW5jLiAoS0FJKSBDKysgQ29tcGlsZXIKKworCSMgS0NDIHdpbGwgb25seSBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeSBpZiB0aGUgb3V0cHV0IGZpbGUKKwkjIGVuZHMgd2l0aCAiLnNvIiAob3IgIi5zbCIgZm9yIEhQLVVYKSwgc28gcmVuYW1lIHRoZSBsaWJyYXJ5CisJIyB0byBpdHMgcHJvcGVyIG5hbWUgKHdpdGggdmVyc2lvbikgYWZ0ZXIgbGlua2luZy4KKwlhcmNoaXZlX2NtZHNfQ1hYPSd0ZW1wZXh0PWBlY2hvICRzaGFyZWRfZXh0IHwgJFNFRCAtZSAnXCcncy9cKFteKCkwLTlBLVphLXp7fV1cKS9cXFxcXDEvZydcJydgOyB0ZW1wbGliPWBlY2hvICRsaWIgfCAkU0VEIC1lICJzL1wke3RlbXBleHR9XC4uKi8uc28vImA7ICRDQyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLS1zb25hbWUgJHNvbmFtZSAtbyBcJHRlbXBsaWI7IG12IFwkdGVtcGxpYiAkbGliJworCWFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSd0ZW1wZXh0PWBlY2hvICRzaGFyZWRfZXh0IHwgJFNFRCAtZSAnXCcncy9cKFteKCkwLTlBLVphLXp7fV1cKS9cXFxcXDEvZydcJydgOyB0ZW1wbGliPWBlY2hvICRsaWIgfCAkU0VEIC1lICJzL1wke3RlbXBleHR9XC4uKi8uc28vImA7ICRDQyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLS1zb25hbWUgJHNvbmFtZSAtbyBcJHRlbXBsaWIgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSwkZXhwb3J0X3N5bWJvbHM7IG12IFwkdGVtcGxpYiAkbGliJworCSMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkjCisJIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorCSMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCisJIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQorCSMgZGVwZW5kZW5jaWVzLgorCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gJENDICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAtbyBsaWJjb25mdGVzdCRzaGFyZWRfZXh0IDI+JjEgfCBncmVwICJsZCJgOyBybSAtZiBsaWJjb25mdGVzdCRzaGFyZWRfZXh0OyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZWNobyAkbGlzdCcKKworCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS0tcnBhdGgsJGxpYmRpcicKKwlleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisKKwkjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKKwkjICJDQyAtQnN0YXRpYyIsIHdoZXJlICJDQyIgaXMgdGhlIEtBSSBDKysgY29tcGlsZXIuCisJb2xkX2FyY2hpdmVfY21kc19DWFg9JyRDQyAtQnN0YXRpYyAtbyAkb2xkbGliICRvbGRvYmpzJworCTs7CisgICAgICBpY3BjKQorCSMgSW50ZWwgQysrCisJd2l0aF9nbnVfbGQ9eWVzCisJYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPW5vCisJYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1ycGF0aCwkbGliZGlyJworCWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKwl3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCTs7CisgICAgICBjeHgpCisJIyBDb21wYXEgQysrCisJYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAgLW8gJGxpYiAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scycKKworCXJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9Jy1ycGF0aCAkbGliZGlyJworCWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKKworCSMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkjCisJIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorCSMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCisJIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQorCSMgZGVwZW5kZW5jaWVzLgorCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwICJsZCJgOyB0ZW1wbGlzdD1gZWNobyAkdGVtcGxpc3QgfCAkU0VEICJzL1woXi4qbGQuKlwpXCggLipsZCAuKiRcKS9cMS8iYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGVjaG8gJGxpc3QnCisJOzsKKyAgICBlc2FjCisgICAgOzsKKyAgbHlueG9zKikKKyAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICBsZF9zaGxpYnNfQ1hYPW5vCisgICAgOzsKKyAgbTg4ayopCisgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgbGRfc2hsaWJzX0NYWD1ubworICAgIDs7CisgIG12cyopCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIGN4eCkKKwkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlsZF9zaGxpYnNfQ1hYPW5vCisJOzsKKyAgICAgICopCisJIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJbGRfc2hsaWJzX0NYWD1ubworCTs7CisgICAgZXNhYworICAgIDs7CisgIG5ldGJzZCogfCBrbmV0YnNkKi1nbnUpCisgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgorICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJExEIC1Cc2hhcmVhYmxlICAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRsaW5rZXJfZmxhZ3MnCisgICAgICB3bGFyYz0KKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPSctUiRsaWJkaXInCisgICAgICBoYXJkY29kZV9kaXJlY3RfQ1hYPXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9DWFg9bm8KKyAgICBmaQorICAgICMgV29ya2Fyb3VuZCBzb21lIGJyb2tlbiBwcmUtMS41IHRvb2xjaGFpbnMKKyAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwIGNvbmZ0ZXN0LiRvYmpleHQgfCAkU0VEIC1lICJzOi1sZ2NjIC1sYyAtbGdjYzo6IicKKyAgICA7OworICBvc2YzKikKKyAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgS0NDKQorCSMgS3VjayBhbmQgQXNzb2NpYXRlcywgSW5jLiAoS0FJKSBDKysgQ29tcGlsZXIKKworCSMgS0NDIHdpbGwgb25seSBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeSBpZiB0aGUgb3V0cHV0IGZpbGUKKwkjIGVuZHMgd2l0aCAiLnNvIiAob3IgIi5zbCIgZm9yIEhQLVVYKSwgc28gcmVuYW1lIHRoZSBsaWJyYXJ5CisJIyB0byBpdHMgcHJvcGVyIG5hbWUgKHdpdGggdmVyc2lvbikgYWZ0ZXIgbGlua2luZy4KKwlhcmNoaXZlX2NtZHNfQ1hYPSd0ZW1wZXh0PWBlY2hvICRzaGFyZWRfZXh0IHwgJFNFRCAtZSAnXCcncy9cKFteKCkwLTlBLVphLXp7fV1cKS9cXFxcXDEvZydcJydgOyB0ZW1wbGliPWBlY2hvICRsaWIgfCAkU0VEIC1lICJzL1wke3RlbXBleHR9XC4uKi8uc28vImA7ICRDQyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLS1zb25hbWUgJHNvbmFtZSAtbyBcJHRlbXBsaWI7IG12IFwkdGVtcGxpYiAkbGliJworCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9OgorCisJIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCisJIyAiQ0MgLUJzdGF0aWMiLCB3aGVyZSAiQ0MiIGlzIHRoZSBLQUkgQysrIGNvbXBpbGVyLgorCW9sZF9hcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLUJzdGF0aWMgLW8gJG9sZGxpYiAkb2xkb2JqcycKKworCTs7CisgICAgICBSQ0MpCisJIyBSYXRpb25hbCBDKysgMi40LjEKKwkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlsZF9zaGxpYnNfQ1hYPW5vCisJOzsKKyAgICAgIGN4eCkKKwlhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJworCWFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKwloYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD06CisKKwkjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJIworCSMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KKwkjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQorCSMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKKwkjIGRlcGVuZGVuY2llcy4KKwlvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgZ3JlcCAibGQiIHwgZ3JlcCAtdiAibGQ6ImA7IHRlbXBsaXN0PWBlY2hvICR0ZW1wbGlzdCB8ICRTRUQgInMvXCheLipsZC4qXClcKCAuKmxkLiokXCkvXDEvImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBlY2hvICRsaXN0JworCTs7CisgICAgICAqKQorCWlmIHRlc3QgIiRHWFgiID0geWVzICYmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKwkgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKworCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKwkgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKKworCSAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgIlwtTCInCisKKwllbHNlCisJICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgIGxkX3NobGlic19DWFg9bm8KKwlmaQorCTs7CisgICAgZXNhYworICAgIDs7CisgIG9zZjQqIHwgb3NmNSopCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIEtDQykKKwkjIEt1Y2sgYW5kIEFzc29jaWF0ZXMsIEluYy4gKEtBSSkgQysrIENvbXBpbGVyCisKKwkjIEtDQyB3aWxsIG9ubHkgY3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkgaWYgdGhlIG91dHB1dCBmaWxlCisJIyBlbmRzIHdpdGggIi5zbyIgKG9yICIuc2wiIGZvciBIUC1VWCksIHNvIHJlbmFtZSB0aGUgbGlicmFyeQorCSMgdG8gaXRzIHByb3BlciBuYW1lICh3aXRoIHZlcnNpb24pIGFmdGVyIGxpbmtpbmcuCisJYXJjaGl2ZV9jbWRzX0NYWD0ndGVtcGV4dD1gZWNobyAkc2hhcmVkX2V4dCB8ICRTRUQgLWUgJ1wnJ3MvXChbXigpMC05QS1aYS16e31dXCkvXFxcXFwxL2cnXCcnYDsgdGVtcGxpYj1gZWNobyAkbGliIHwgJFNFRCAtZSAicy9cJHt0ZW1wZXh0fVwuLiovLnNvLyJgOyAkQ0MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC0tc29uYW1lICRzb25hbWUgLW8gXCR0ZW1wbGliOyBtdiBcJHRlbXBsaWIgJGxpYicKKworCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1ycGF0aCwkbGliZGlyJworCWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKKworCSMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZworCSMgdGhlIEtBSSBDKysgY29tcGlsZXIuCisJb2xkX2FyY2hpdmVfY21kc19DWFg9JyRDQyAtbyAkb2xkbGliICRvbGRvYmpzJworCTs7CisgICAgICBSQ0MpCisJIyBSYXRpb25hbCBDKysgMi40LjEKKwkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlsZF9zaGxpYnNfQ1hYPW5vCisJOzsKKyAgICAgIGN4eCkKKwlhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCisJYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW1zeW0gLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nZm9yIGkgaW4gYGNhdCAkZXhwb3J0X3N5bWJvbHNgOyBkbyBwcmludGYgIiVzICVzXFxuIiAtZXhwb3J0ZWRfc3ltYm9sICJcJGkiID4+ICRsaWIuZXhwOyBkb25lfgorCSAgZWNobyAiLWhpZGRlbiI+PiAkbGliLmV4cH4KKwkgICRDQyAtc2hhcmVkJGFsbG93X3VuZGVmaW5lZF9mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgLVdsLC1pbnB1dCAtV2wsJGxpYi5leHAgIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbgkkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICRvYmpkaXIvc29fbG9jYXRpb25zIC1vICRsaWJ+CisJICAkcm0gJGxpYi5leHAnCisKKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nLXJwYXRoICRsaWJkaXInCisJaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9OgorCisJIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSMKKwkjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCisJIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KKwkjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisJIyBkZXBlbmRlbmNpZXMuCisJb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAkQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgImxkIiB8IGdyZXAgLXYgImxkOiJgOyB0ZW1wbGlzdD1gZWNobyAkdGVtcGxpc3QgfCAkU0VEICJzL1woXi4qbGQuKlwpXCggLipsZC4qJFwpL1wxLyJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZWNobyAkbGlzdCcKKwk7OworICAgICAgKikKKwlpZiB0ZXN0ICIkR1hYIiA9IHllcyAmJiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwkgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCisJIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tbXN5bSAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCisJICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworCSAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9OgorCisJICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgZ3JlcCAiXC1MIicKKworCWVsc2UKKwkgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgbGRfc2hsaWJzX0NYWD1ubworCWZpCisJOzsKKyAgICBlc2FjCisgICAgOzsKKyAgcHNvcyopCisgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgbGRfc2hsaWJzX0NYWD1ubworICAgIDs7CisgIHNjbyopCisgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPW5vCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIENDKQorCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCWxkX3NobGlic19DWFg9bm8KKwk7OworICAgICAgKikKKwkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlsZF9zaGxpYnNfQ1hYPW5vCisJOzsKKyAgICBlc2FjCisgICAgOzsKKyAgc3Vub3M0KikKKyAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgQ0MpCisJIyBTdW4gQysrIDQueAorCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCWxkX3NobGlic19DWFg9bm8KKwk7OworICAgICAgbGNjKQorCSMgTHVjaWQKKwkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlsZF9zaGxpYnNfQ1hYPW5vCisJOzsKKyAgICAgICopCisJIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJbGRfc2hsaWJzX0NYWD1ubworCTs7CisgICAgZXNhYworICAgIDs7CisgIHNvbGFyaXMqKQorICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBDQykKKwkjIFN1biBDKysgNC4yLCA1LnggYW5kIENlbnRlcmxpbmUgQysrCisJbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYPScgLXpkZWZzJworCWFyY2hpdmVfY21kc19DWFg9JyRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1ub2xpYiAtaCRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCSRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1ub2xpYiAke3dsfS1NICR7d2x9JGxpYi5leHAgLWgkc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfiRybSAkbGliLmV4cCcKKworCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPSctUiRsaWJkaXInCisJaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9DWFg9bm8KKwljYXNlICRob3N0X29zIGluCisJICBzb2xhcmlzMi4wLTUgfCBzb2xhcmlzMi4wLTUuKikgOzsKKwkgICopCisJICAgICMgVGhlIEMrKyBjb21waWxlciBpcyB1c2VkIGFzIGxpbmtlciBzbyB3ZSBtdXN0IHVzZSAkd2wKKwkgICAgIyBmbGFnIHRvIHBhc3MgdGhlIGNvbW1hbmRzIHRvIHRoZSB1bmRlcmx5aW5nIHN5c3RlbQorCSAgICAjIGxpbmtlci4KKwkgICAgIyBTdXBwb3J0ZWQgc2luY2UgU29sYXJpcyAyLjYgKG1heWJlIDIuNS4xPykKKwkgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYPScke3dsfS16ICR7d2x9YWxsZXh0cmFjdCRjb252ZW5pZW5jZSAke3dsfS16ICR7d2x9ZGVmYXVsdGV4dHJhY3QnCisJICAgIDs7CisJZXNhYworCWxpbmtfYWxsX2RlcGxpYnNfQ1hYPXllcworCisJIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSMKKwkjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCisJIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KKwkjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisJIyBkZXBlbmRlbmNpZXMuCisJb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAkQ0MgLUcgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwICJcLVtMUl0iYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGVjaG8gJGxpc3QnCisKKwkjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKKwkjICJDQyAteGFyIiwgd2hlcmUgIkNDIiBpcyB0aGUgU3VuIEMrKyBjb21waWxlci4gIFRoaXMgaXMKKwkjIG5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgaW5zdGFudGlhdGVkIHRlbXBsYXRlcyBhcmUgaW5jbHVkZWQKKwkjIGluIHRoZSBhcmNoaXZlLgorCW9sZF9hcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXhhciAtbyAkb2xkbGliICRvbGRvYmpzJworCTs7CisgICAgICBnY3gpCisJIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwlhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCAkd2wkc29uYW1lIC1vICRsaWInCisKKwkjIFRoZSBDKysgY29tcGlsZXIgbXVzdCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgYXJjaGl2ZS4KKwlvbGRfYXJjaGl2ZV9jbWRzX0NYWD0nJENDICRMREZMQUdTIC1hcmNoaXZlIC1vICRvbGRsaWIgJG9sZG9ianMnCisJOzsKKyAgICAgICopCisJIyBHTlUgQysrIGNvbXBpbGVyIHdpdGggU29sYXJpcyBsaW5rZXIKKwlpZiB0ZXN0ICIkR1hYIiA9IHllcyAmJiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwkgIG5vX3VuZGVmaW5lZF9mbGFnX0NYWD0nICR7d2x9LXogJHt3bH1kZWZzJworCSAgaWYgJENDIC0tdmVyc2lvbiB8IGdyZXAgLXYgJ14yXC43JyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJExERkxBR1MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWggJHdsJHNvbmFtZSAtbyAkbGliJworCSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+JGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJCSRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAke3dsfS1NICR3bCRsaWIuZXhwIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfiRybSAkbGliLmV4cCcKKworCSAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9IiRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgZ3JlcCBcIlwtTFwiIgorCSAgZWxzZQorCSAgICAjIGcrKyAyLjcgYXBwZWFycyB0byByZXF1aXJlIGAtRycgTk9UIGAtc2hhcmVkJyBvbiB0aGlzCisJICAgICMgcGxhdGZvcm0uCisJICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtRyAtbm9zdGRsaWIgJExERkxBR1MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWggJHdsJHNvbmFtZSAtbyAkbGliJworCSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+JGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJCSRDQyAtRyAtbm9zdGRsaWIgJHt3bH0tTSAkd2wkbGliLmV4cCAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc34kcm0gJGxpYi5leHAnCisKKwkgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSIkQ0MgLUcgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwIFwiXC1MXCIiCisJICBmaQorCisJICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tUiAkd2wkbGliZGlyJworCWZpCisJOzsKKyAgICBlc2FjCisgICAgOzsKKyAgc3lzdjVPcGVuVU5JWDgqIHwgc3lzdjVVbml4V2FyZTcqIHwgc3lzdjV1d1s3OF0qIHwgdW5peHdhcmU3KikKKyAgICBhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFg9bm8KKyAgICA7OworICB0YW5kZW0qKQorICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBOQ0MpCisJIyBOb25TdG9wLVVYIE5DQyAzLjIwCisJIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJbGRfc2hsaWJzX0NYWD1ubworCTs7CisgICAgICAqKQorCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCWxkX3NobGlic19DWFg9bm8KKwk7OworICAgIGVzYWMKKyAgICA7OworICB2eHdvcmtzKikKKyAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICBsZF9zaGxpYnNfQ1hYPW5vCisgICAgOzsKKyAgKikKKyAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICBsZF9zaGxpYnNfQ1hYPW5vCisgICAgOzsKK2VzYWMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbGRfc2hsaWJzX0NYWCIgPiY1CiskYXNfZWNobyAiJGxkX3NobGlic19DWFgiID4mNjsgfQordGVzdCAiJGxkX3NobGlic19DWFgiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubworCitHQ0NfQ1hYPSIkR1hYIgorTERfQ1hYPSIkTEQiCisKKyMjIENBVkVBVCBFTVBUT1I6CisjIyBUaGVyZSBpcyBubyBlbmNhcHN1bGF0aW9uIHdpdGhpbiB0aGUgZm9sbG93aW5nIG1hY3JvcywgZG8gbm90IGNoYW5nZQorIyMgdGhlIHJ1bm5pbmcgb3JkZXIgb3Igb3RoZXJ3aXNlIG1vdmUgdGhlbSBhcm91bmQgdW5sZXNzIHlvdSBrbm93IGV4YWN0bHkKKyMjIHdoYXQgeW91IGFyZSBkb2luZy4uLgorCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCitjbGFzcyBGb28KK3sKK3B1YmxpYzoKKyAgRm9vICh2b2lkKSB7IGEgPSAwOyB9Citwcml2YXRlOgorICBpbnQgYTsKK307CitFT0YKKworaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2NvbXBpbGVcIiI7IH0gPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgorICAjIFBhcnNlIHRoZSBjb21waWxlciBvdXRwdXQgYW5kIGV4dHJhY3QgdGhlIG5lY2Vzc2FyeQorICAjIG9iamVjdHMsIGxpYnJhcmllcyBhbmQgbGlicmFyeSBmbGFncy4KKworICAjIFNlbnRpbmVsIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIG9yIG5vdCB3ZSBhcmUgYmVmb3JlCisgICMgdGhlIGNvbmZ0ZXN0IG9iamVjdCBmaWxlLgorICBwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lPW5vCisKKyAgIyBUaGUgYConIGluIHRoZSBjYXNlIG1hdGNoZXMgZm9yIGFyY2hpdGVjdHVyZXMgdGhhdCB1c2UgYGNhc2UnIGluCisgICMgJG91dHB1dF92ZXJib3NlX2NtZCBjYW4gdHJpZ2dlciBnbG9iIGV4cGFuc2lvbiBkdXJpbmcgdGhlIGxvb3AKKyAgIyBldmFsIHdpdGhvdXQgdGhpcyBzdWJzdGl0dXRpb24uCisgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSJgJGVjaG8gXCJYJG91dHB1dF92ZXJib3NlX2xpbmtfY21kXCIgfCAkWHNlZCAtZSBcIiRub19nbG9iX3N1YnN0XCJgIgorCisgIGZvciBwIGluIGBldmFsICRvdXRwdXRfdmVyYm9zZV9saW5rX2NtZGA7IGRvCisgICAgY2FzZSAkcCBpbgorCisgICAgLUwqIHwgLVIqIHwgLWwqKQorICAgICAgICMgU29tZSBjb21waWxlcnMgcGxhY2Ugc3BhY2UgYmV0d2VlbiAiLXtMLFJ9IiBhbmQgdGhlIHBhdGguCisgICAgICAgIyBSZW1vdmUgdGhlIHNwYWNlLgorICAgICAgIGlmIHRlc3QgJHAgPSAiLUwiIFwKKwkgIHx8IHRlc3QgJHAgPSAiLVIiOyB0aGVuCisJIHByZXY9JHAKKwkgY29udGludWUKKyAgICAgICBlbHNlCisJIHByZXY9CisgICAgICAgZmkKKworICAgICAgIGlmIHRlc3QgIiRwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lIiA9IG5vOyB0aGVuCisJIGNhc2UgJHAgaW4KKwkgLUwqIHwgLVIqKQorCSAgICMgSW50ZXJuYWwgY29tcGlsZXIgbGlicmFyeSBwYXRocyBzaG91bGQgY29tZSBhZnRlciB0aG9zZQorCSAgICMgcHJvdmlkZWQgdGhlIHVzZXIuICBUaGUgcG9zdGRlcHMgYWxyZWFkeSBjb21lIGFmdGVyIHRoZQorCSAgICMgdXNlciBzdXBwbGllZCBsaWJzIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gcHJvY2VzcyB0aGVtLgorCSAgIGlmIHRlc3QgLXogIiRjb21waWxlcl9saWJfc2VhcmNoX3BhdGhfQ1hYIjsgdGhlbgorCSAgICAgY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWD0iJHtwcmV2fSR7cH0iCisJICAgZWxzZQorCSAgICAgY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWD0iJHtjb21waWxlcl9saWJfc2VhcmNoX3BhdGhfQ1hYfSAke3ByZXZ9JHtwfSIKKwkgICBmaQorCSAgIDs7CisJICMgVGhlICItbCIgY2FzZSB3b3VsZCBuZXZlciBjb21lIGJlZm9yZSB0aGUgb2JqZWN0IGJlaW5nCisJICMgbGlua2VkLCBzbyBkb24ndCBib3RoZXIgaGFuZGxpbmcgdGhpcyBjYXNlLgorCSBlc2FjCisgICAgICAgZWxzZQorCSBpZiB0ZXN0IC16ICIkcG9zdGRlcHNfQ1hYIjsgdGhlbgorCSAgIHBvc3RkZXBzX0NYWD0iJHtwcmV2fSR7cH0iCisJIGVsc2UKKwkgICBwb3N0ZGVwc19DWFg9IiR7cG9zdGRlcHNfQ1hYfSAke3ByZXZ9JHtwfSIKKwkgZmkKKyAgICAgICBmaQorICAgICAgIDs7CisKKyAgICAqLiRvYmpleHQpCisgICAgICAgIyBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgdGVzdCBvYmplY3QgZmlsZSBvbmx5IHNob3dzIHVwCisgICAgICAgIyBvbmNlIGluIHRoZSBjb21waWxlciBvdXRwdXQuCisgICAgICAgaWYgdGVzdCAiJHAiID0gImNvbmZ0ZXN0LiRvYmpleHQiOyB0aGVuCisJIHByZV90ZXN0X29iamVjdF9kZXBzX2RvbmU9eWVzCisJIGNvbnRpbnVlCisgICAgICAgZmkKKworICAgICAgIGlmIHRlc3QgIiRwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lIiA9IG5vOyB0aGVuCisJIGlmIHRlc3QgLXogIiRwcmVkZXBfb2JqZWN0c19DWFgiOyB0aGVuCisJICAgcHJlZGVwX29iamVjdHNfQ1hYPSIkcCIKKwkgZWxzZQorCSAgIHByZWRlcF9vYmplY3RzX0NYWD0iJHByZWRlcF9vYmplY3RzX0NYWCAkcCIKKwkgZmkKKyAgICAgICBlbHNlCisJIGlmIHRlc3QgLXogIiRwb3N0ZGVwX29iamVjdHNfQ1hYIjsgdGhlbgorCSAgIHBvc3RkZXBfb2JqZWN0c19DWFg9IiRwIgorCSBlbHNlCisJICAgcG9zdGRlcF9vYmplY3RzX0NYWD0iJHBvc3RkZXBfb2JqZWN0c19DWFggJHAiCisJIGZpCisgICAgICAgZmkKKyAgICAgICA7OworCisgICAgKikgOzsgIyBJZ25vcmUgdGhlIHJlc3QuCisKKyAgICBlc2FjCisgIGRvbmUKKworICAjIENsZWFuIHVwLgorICBybSAtZiBhLm91dCBhLmV4ZQorZWxzZQorICBlY2hvICJsaWJ0b29sLm00OiBlcnJvcjogcHJvYmxlbSBjb21waWxpbmcgQ1hYIHRlc3QgcHJvZ3JhbSIKK2ZpCisKKyRybSAtZiBjb25mZXN0LiRvYmpleHQKKworY2FzZSAiICRwb3N0ZGVwc19DWFggIiBpbgorKiIgLWxjICIqKSBhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFg9bm8gOzsKK2VzYWMKKworbHRfcHJvZ19jb21waWxlcl93bF9DWFg9CitsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9CitsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9CisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRjb21waWxlciBvcHRpb24gdG8gcHJvZHVjZSBQSUMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRjb21waWxlciBvcHRpb24gdG8gcHJvZHVjZSBQSUMuLi4gIiA+JjY7IH0KKworICAjIEMrKyBzcGVjaWZpYyBjYXNlcyBmb3IgcGljLCBzdGF0aWMsIHdsLCBldGMuCisgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy1XbCwnCisgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctc3RhdGljJworCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGFpeCopCisgICAgICAjIEFsbCBBSVggY29kZSBpcyBQSUMuCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctQnN0YXRpYycKKyAgICAgIGZpCisgICAgICA7OworICAgIGFtaWdhb3MqKQorICAgICAgIyBGSVhNRTogd2UgbmVlZCBhdCBsZWFzdCA2ODAyMCBjb2RlIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dAorICAgICAgIyBhZGRpbmcgdGhlIGAtbTY4MDIwJyBmbGFnIHRvIEdDQyBwcmV2ZW50cyBidWlsZGluZyBhbnl0aGluZyBiZXR0ZXIsCisgICAgICAjIGxpa2UgYC1tNjgwNDAnLgorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctbTY4MDIwIC1yZXNpZGVudDMyIC1tYWx3YXlzLXJlc3RvcmUtYTQnCisgICAgICA7OworICAgIGJlb3MqIHwgY3lnd2luKiB8IGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCogfCBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgdGhlc2UgT1Nlcy4KKyAgICAgIDs7CisgICAgbWluZ3cqIHwgb3MyKiB8IHB3MzIqKQorICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZworICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLURETExfRVhQT1JUJworICAgICAgOzsKKyAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQorICAgICAgIyBDb21tb24gc3ltYm9scyBub3QgYWxsb3dlZCBpbiBNSF9EWUxJQiBmaWxlcworICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctZm5vLWNvbW1vbicKKyAgICAgIDs7CisgICAgKmRqZ3BwKikKKyAgICAgICMgREpHUFAgZG9lcyBub3Qgc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzIGF0IGFsbAorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPQorICAgICAgOzsKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCisJbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPS1LY29uZm9ybV9waWMKKyAgICAgIGZpCisgICAgICA7OworICAgIGhwdXgqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIElBNjQgSFAtVVggYW5kIDY0LWJpdCBIUC1VWCwgYnV0CisgICAgICAjIG5vdCBmb3IgUEEgSFAtVVguCisgICAgICBjYXNlICIkaG9zdF9jcHUiIGluCisgICAgICBocHBhKjY0KnxpYTY0KikKKwk7OworICAgICAgKikKKwlsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1mUElDJworCTs7CisgICAgICBlc2FjCisgICAgICA7OworICAgICopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1mUElDJworICAgICAgOzsKKyAgICBlc2FjCisgIGVsc2UKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXg0KiB8IGFpeDUqKQorCSMgQWxsIEFJWCBjb2RlIGlzIFBJQy4KKwlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSAgIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKKwkgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLUJzdGF0aWMnCisJZWxzZQorCSAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctYm5zbyAtYkk6L2xpYi9zeXNjYWxscy5leHAnCisJZmkKKwk7OworICAgICAgY2hvcnVzKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCWN4Y2g2OCkKKwkgICMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCisJICAjIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsIENYWCk9Ii0tbm9fYXV0b19pbnN0YW50aWF0aW9uIC11IF9fbWFpbiAtdSBfX3ByZW1haW4gLXUgX2Fib3J0IC1yICRDT09MX0RJUi9saWIvbGliT3JiLmEgJE1WTUVfRElSL2xpYi9DQy9saWJDLmEgJE1WTUVfRElSL2xpYi9jbGFzc2l4L2xpYmN4LnMuYSIKKwkgIDs7CisJZXNhYworCTs7CisgICAgICBkZ3V4KikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgZWMrKykKKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctS1BJQycKKwkgICAgOzsKKwkgIGdoY3gpCisJICAgICMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCisJICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLXBpYycKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBmcmVlYnNkKiB8IGtmcmVlYnNkKi1nbnUpCisJIyBGcmVlQlNEIHVzZXMgR05VIEMrKworCTs7CisgICAgICBocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgQ0MpCisJICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctV2wsJworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9IiR7YWNfY3ZfcHJvZ19jY193bH0tYSAke2FjX2N2X3Byb2dfY2Nfd2x9YXJjaGl2ZSIKKwkgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0OyB0aGVuCisJICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPScrWicKKwkgICAgZmkKKwkgICAgOzsKKwkgIGFDQykKKwkgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy1XbCwnCisJICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0iJHthY19jdl9wcm9nX2NjX3dsfS1hICR7YWNfY3ZfcHJvZ19jY193bH1hcmNoaXZlIgorCSAgICBjYXNlICIkaG9zdF9jcHUiIGluCisJICAgIGhwcGEqNjQqfGlhNjQqKQorCSAgICAgICMgK1ogdGhlIGRlZmF1bHQKKwkgICAgICA7OworCSAgICAqKQorCSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nK1onCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKQorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVdsLCcKKwkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctbm9uX3NoYXJlZCcKKwkgICAgIyBDQyBwaWMgZmxhZyAtS1BJQyBpcyB0aGUgZGVmYXVsdC4KKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBsaW51eCopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIEtDQykKKwkgICAgIyBLQUkgQysrIENvbXBpbGVyCisJICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctLWJhY2tlbmQgLVdsLCcKKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctZlBJQycKKwkgICAgOzsKKwkgIGljcGMpCisJICAgICMgSW50ZWwgQysrCisJICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctV2wsJworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1LUElDJworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1zdGF0aWMnCisJICAgIDs7CisJICBjeHgpCisJICAgICMgQ29tcGFxIEMrKworCSAgICAjIE1ha2Ugc3VyZSB0aGUgUElDIGZsYWcgaXMgZW1wdHkuICBJdCBhcHBlYXJzIHRoYXQgYWxsIEFscGhhCisJICAgICMgTGludXggYW5kIENvbXBhcSBUcnU2NCBVbml4IG9iamVjdHMgYXJlIFBJQy4KKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPQorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1ub25fc2hhcmVkJworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIGx5bnhvcyopCisJOzsKKyAgICAgIG04OGsqKQorCTs7CisgICAgICBtdnMqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBjeHgpCisJICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLVcgYyxleHBvcnRhbGwnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgbmV0YnNkKiB8IGtuZXRic2QqLWdudSkKKwk7OworICAgICAgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBLQ0MpCisJICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctLWJhY2tlbmQgLVdsLCcKKwkgICAgOzsKKwkgIFJDQykKKwkgICAgIyBSYXRpb25hbCBDKysgMi40LjEKKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctcGljJworCSAgICA7OworCSAgY3h4KQorCSAgICAjIERpZ2l0YWwvQ29tcGFxIEMrKworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVdsLCcKKwkgICAgIyBNYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGlzIGVtcHR5LiAgSXQgYXBwZWFycyB0aGF0IGFsbCBBbHBoYQorCSAgICAjIExpbnV4IGFuZCBDb21wYXEgVHJ1NjQgVW5peCBvYmplY3RzIGFyZSBQSUMuCisJICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0KKwkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctbm9uX3NoYXJlZCcKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBwc29zKikKKwk7OworICAgICAgc2NvKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgQ0MpCisJICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLWZQSUMnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgc29sYXJpcyopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKQorCSAgICAjIFN1biBDKysgNC4yLCA1LnggYW5kIENlbnRlcmxpbmUgQysrCisJICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLUtQSUMnCisJICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLUJzdGF0aWMnCisJICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctUW9wdGlvbiBsZCAnCisJICAgIDs7CisJICBnY3gpCisJICAgICMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCisJICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLVBJQycKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBzdW5vczQqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBDQykKKwkgICAgIyBTdW4gQysrIDQueAorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1waWMnCisJICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLUJzdGF0aWMnCisJICAgIDs7CisJICBsY2MpCisJICAgICMgTHVjaWQKKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctcGljJworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIHRhbmRlbSopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIE5DQykKKwkgICAgIyBOb25TdG9wLVVYIE5DQyAzLjIwCisJICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLUtQSUMnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgdW5peHdhcmUqKQorCTs7CisgICAgICB2eHdvcmtzKikKKwk7OworICAgICAgKikKKwlsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWRfQ1hYPW5vCisJOzsKKyAgICBlc2FjCisgIGZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYIiA+JjUKKyRhc19lY2hvICIkbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYIiA+JjY7IH0KKworIworIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGFjdHVhbGx5IHdvcmtzLgorIworaWYgdGVzdCAtbiAiJGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCI7IHRoZW4KKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCB3b3JrcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCB3b3Jrcy4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHtsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19DWFgrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19DWFg9bm8KKyAgYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0CisgICBwcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorICAgbHRfY29tcGlsZXJfZmxhZz0iJGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCAtRFBJQyIKKyAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCisgICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgorICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucworICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KKyAgICMgVGhlIG9wdGlvbiBpcyByZWZlcmVuY2VkIHZpYSBhIHZhcmlhYmxlIHRvIGF2b2lkIGNvbmZ1c2luZyBzZWQuCisgICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKKyAgIC1lICdzOi4qRkxBR1N9PyA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKKyAgIC1lICdzOiBbXiBdKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKKyAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCisgICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6MTIzNTU6ICRsdF9jb21waWxlXCIiID4mNSkKKyAgIChldmFsICIkbHRfY29tcGlsZSIgMj5jb25mdGVzdC5lcnIpCisgICBhY19zdGF0dXM9JD8KKyAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgICBlY2hvICIkYXNfbWU6MTIzNTk6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyAiJGFjX291dGZpbGUiOyB0aGVuCisgICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncworICAgICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfQ1hYPXllcworICAgICBmaQorICAgZmkKKyAgICRybSBjb25mdGVzdCoKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfQ1hYIiA+JjUKKyRhc19lY2hvICIkbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfQ1hYIiA+JjY7IH0KKworaWYgdGVzdCB4IiRsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19DWFgiID0geHllczsgdGhlbgorICAgIGNhc2UgJGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCBpbgorICAgICAiIiB8ICIgIiopIDs7CisgICAgICopIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0iICRsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFgiIDs7CisgICAgIGVzYWMKK2Vsc2UKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9CisgICAgIGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZF9DWFg9bm8KK2ZpCisKK2ZpCitjYXNlICIkaG9zdF9vcyIgaW4KKyAgIyBGb3IgcGxhdGZvcm1zIHdoaWNoIGRvIG5vdCBzdXBwb3J0IFBJQywgLURQSUMgaXMgbWVhbmluZ2xlc3M6CisgICpkamdwcCopCisgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPQorICAgIDs7CisgICopCisgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSIkbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYIC1EUElDIgorICAgIDs7Citlc2FjCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0Li4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2x0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWD1ubworICAgJHJtIC1yIGNvbmZ0ZXN0IDI+L2Rldi9udWxsCisgICBta2RpciBjb25mdGVzdAorICAgY2QgY29uZnRlc3QKKyAgIG1rZGlyIG91dAorICAgcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKworICAgbHRfY29tcGlsZXJfZmxhZz0iLW8gb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0IgorICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKKyAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCisgICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCisgICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgorICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCisgICAtZSAnczouKkZMQUdTfT8gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCisgICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCisgICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAorICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOjEyNDE1OiAkbHRfY29tcGlsZVwiIiA+JjUpCisgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+b3V0L2NvbmZ0ZXN0LmVycikKKyAgIGFjX3N0YXR1cz0kPworICAgY2F0IG91dC9jb25mdGVzdC5lcnIgPiY1CisgICBlY2hvICIkYXNfbWU6MTI0MTk6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyBvdXQvY29uZnRlc3QyLiRhY19vYmpleHQKKyAgIHRoZW4KKyAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCisgICAgIGlmIHRlc3QgISAtcyBvdXQvY29uZnRlc3QuZXJyOyB0aGVuCisgICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fQ1hYPXllcworICAgICBmaQorICAgZmkKKyAgIGNobW9kIHUrdyAuCisgICAkcm0gY29uZnRlc3QqCisgICAjIFNHSSBDKysgY29tcGlsZXIgd2lsbCBjcmVhdGUgZGlyZWN0b3J5IG91dC9paV9maWxlcy8gZm9yCisgICAjIHRlbXBsYXRlIGluc3RhbnRpYXRpb24KKyAgIHRlc3QgLWQgb3V0L2lpX2ZpbGVzICYmICRybSBvdXQvaWlfZmlsZXMvKiAmJiBybWRpciBvdXQvaWlfZmlsZXMKKyAgICRybSBvdXQvKiAmJiBybWRpciBvdXQKKyAgIGNkIC4uCisgICBybWRpciBjb25mdGVzdAorICAgJHJtIGNvbmZ0ZXN0KgorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19DWFgiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19DWFgiID4mNjsgfQorCisKK2hhcmRfbGlua3M9Im5vdHRlc3RlZCIKK2lmIHRlc3QgIiRsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19DWFgiID0gbm8gJiYgdGVzdCAiJG5lZWRfbG9ja3MiICE9IG5vOyB0aGVuCisgICMgZG8gbm90IG92ZXJ3cml0ZSB0aGUgdmFsdWUgb2YgbmVlZF9sb2NrcyBwcm92aWRlZCBieSB0aGUgdXNlcgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHdlIGNhbiBsb2NrIHdpdGggaGFyZCBsaW5rcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiB3ZSBjYW4gbG9jayB3aXRoIGhhcmQgbGlua3MuLi4gIiA+JjY7IH0KKyAgaGFyZF9saW5rcz15ZXMKKyAgJHJtIGNvbmZ0ZXN0KgorICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubworICB0b3VjaCBjb25mdGVzdC5hCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPiY1IHx8IGhhcmRfbGlua3M9bm8KKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRoYXJkX2xpbmtzIiA+JjUKKyRhc19lY2hvICIkaGFyZF9saW5rcyIgPiY2OyB9CisgIGlmIHRlc3QgIiRoYXJkX2xpbmtzIiA9IG5vOyB0aGVuCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBcYCRDQycgZG9lcyBub3Qgc3VwcG9ydCBcYC1jIC1vJywgc28gXGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IFxgJENDJyBkb2VzIG5vdCBzdXBwb3J0IFxgLWMgLW8nLCBzbyBcYG1ha2UgLWonIG1heSBiZSB1bnNhZmUiID4mMjt9CisgICAgbmVlZF9sb2Nrcz13YXJuCisgIGZpCitlbHNlCisgIG5lZWRfbG9ja3M9bm8KK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4uLiAiID4mNjsgfQorCisgIGV4cG9ydF9zeW1ib2xzX2NtZHNfQ1hYPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgYWl4NCogfCBhaXg1KikKKyAgICAjIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB3ZSBkb24ndCB3YW50IHRoZSAiLUMiIG9wdGlvbi4KKyAgICAjIC1DIG1lYW5zIGRlbWFuZ2xlIHRvIEFJWCBubSwgYnV0IG1lYW5zIGRvbid0IGRlbWFuZ2xlIHdpdGggR05VIG5tCisgICAgaWYgJE5NIC1WIDI+JjEgfCBncmVwICdHTlUnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICBleHBvcnRfc3ltYm9sc19jbWRzX0NYWD0nJE5NIC1CcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkMiA9PSAiVCIpIHx8IChcJDIgPT0gIkQiKSB8fCAoXCQyID09ICJCIikpICYmIChzdWJzdHIoXCQzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJDMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCisgICAgZWxzZQorICAgICAgZXhwb3J0X3N5bWJvbHNfY21kc19DWFg9JyROTSAtQkNwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXCQyID09ICJUIikgfHwgKFwkMiA9PSAiRCIpIHx8IChcJDIgPT0gIkIiKSkgJiYgKHN1YnN0cihcJDMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFwkMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKKyAgICBmaQorICAgIDs7CisgIHB3MzIqKQorICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfQ1hYPSIkbHRkbGxfY21kcyIKKyAgOzsKKyAgY3lnd2luKiB8IG1pbmd3KikKKyAgICBleHBvcnRfc3ltYm9sc19jbWRzX0NYWD0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEIC1lICdcJycvXltCQ0RHU10gL3MvLiogXChbXiBdKlwpL1wxIERBVEEvJ1wnJyB8ICRTRUQgLWUgJ1wnJy9eW0FJVFddIC9zLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICA7OworICBsaW51eCopCisgICAgbGlua19hbGxfZGVwbGlic19DWFg9bm8KKyAgOzsKKyAgKikKKyAgICBleHBvcnRfc3ltYm9sc19jbWRzX0NYWD0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICA7OworICBlc2FjCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbGRfc2hsaWJzX0NYWCIgPiY1CiskYXNfZWNobyAiJGxkX3NobGlic19DWFgiID4mNjsgfQordGVzdCAiJGxkX3NobGlic19DWFgiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubworCit2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iUEFUSCAkc2hsaWJwYXRoX3ZhciAkcnVucGF0aF92YXIiCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICB2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIEdDQ19FWEVDX1BSRUZJWCBDT01QSUxFUl9QQVRIIExJQlJBUllfUEFUSCIKK2ZpCisKKyMKKyMgRG8gd2UgbmVlZCB0byBleHBsaWNpdGx5IGxpbmsgbGliYz8KKyMKK2Nhc2UgIngkYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYIiBpbgoreHx4eWVzKQorICAjIEFzc3VtZSAtbGMgc2hvdWxkIGJlIGFkZGVkCisgIGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD15ZXMKKworICBpZiB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBjYXNlICRhcmNoaXZlX2NtZHNfQ1hYIGluCisgICAgKid+JyopCisgICAgICAjIEZJWE1FOiB3ZSBtYXkgaGF2ZSB0byBkZWFsIHdpdGggbXVsdGktY29tbWFuZCBzZXF1ZW5jZXMuCisgICAgICA7OworICAgICckQ0MgJyopCisgICAgICAjIFRlc3Qgd2hldGhlciB0aGUgY29tcGlsZXIgaW1wbGljaXRseSBsaW5rcyB3aXRoIC1sYyBzaW5jZSBvbiBzb21lCisgICAgICAjIHN5c3RlbXMsIC1sZ2NjIGhhcyB0byBjb21lIGJlZm9yZSAtbGMuIElmIGdjYyBhbHJlYWR5IHBhc3NlcyAtbGMKKyAgICAgICMgdG8gbGQsIGRvbid0IGFkZCAtbGMgYmVmb3JlIC1sZ2NjLgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAtbGMgc2hvdWxkIGJlIGV4cGxpY2l0bHkgbGlua2VkIGluLi4uICIgPiY2OyB9CisgICAgICAkcm0gY29uZnRlc3QqCisgICAgICBwcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorCisgICAgICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfY29tcGlsZVwiIjsgfSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9IDI+Y29uZnRlc3QuZXJyOyB0aGVuCisgICAgICAgIHNvbmFtZT1jb25mdGVzdAorICAgICAgICBsaWI9Y29uZnRlc3QKKyAgICAgICAgbGlib2Jqcz1jb25mdGVzdC4kYWNfb2JqZXh0CisgICAgICAgIGRlcGxpYnM9CisgICAgICAgIHdsPSRsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWAorICAgICAgICBjb21waWxlcl9mbGFncz0tdgorICAgICAgICBsaW5rZXJfZmxhZ3M9LXYKKyAgICAgICAgdmVyc3RyaW5nPQorICAgICAgICBvdXRwdXRfb2JqZGlyPS4KKyAgICAgICAgbGlibmFtZT1jb25mdGVzdAorICAgICAgICBsdF9zYXZlX2FsbG93X3VuZGVmaW5lZF9mbGFnPSRhbGxvd191bmRlZmluZWRfZmxhZ19DWFgKKyAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPQorICAgICAgICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYXJjaGl2ZV9jbWRzX0NYWCAyXD5cJjEgXHwgZ3JlcCBcIiAtbGMgXCIgXD4vZGV2L251bGwgMlw+XCYxXCIiOyB9ID4mNQorICAoZXZhbCAkYXJjaGl2ZV9jbWRzX0NYWCAyXD5cJjEgXHwgZ3JlcCBcIiAtbGMgXCIgXD4vZGV2L251bGwgMlw+XCYxKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfQorICAgICAgICB0aGVuCisJICBhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFg9bm8KKyAgICAgICAgZWxzZQorCSAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPXllcworICAgICAgICBmaQorICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9JGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWcKKyAgICAgIGVsc2UKKyAgICAgICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1CisgICAgICBmaQorICAgICAgJHJtIGNvbmZ0ZXN0KgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFgiID4mNQorJGFzX2VjaG8gIiRhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFgiID4mNjsgfQorICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisgIDs7Citlc2FjCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGR5bmFtaWMgbGlua2VyIGNoYXJhY3RlcmlzdGljcy4uLiAiID4mNjsgfQorbGlicmFyeV9uYW1lc19zcGVjPQorbGlibmFtZV9zcGVjPSdsaWIkbmFtZScKK3NvbmFtZV9zcGVjPQorc2hyZXh0X2NtZHM9Ii5zbyIKK3Bvc3RpbnN0YWxsX2NtZHM9Citwb3N0dW5pbnN0YWxsX2NtZHM9CitmaW5pc2hfY21kcz0KK2ZpbmlzaF9ldmFsPQorc2hsaWJwYXRoX3Zhcj0KK3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD11bmtub3duCit2ZXJzaW9uX3R5cGU9bm9uZQorZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgorc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIiCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCBncmVwICJebGlicmFyaWVzOiIgfCAkU0VEIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICJzLD0vLC8sZyJgCisgIGlmIGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgZ3JlcCAnOycgPi9kZXYvbnVsbCA7IHRoZW4KKyAgICAjIGlmIHRoZSBwYXRoIGNvbnRhaW5zICI7IiB0aGVuIHdlIGFzc3VtZSBpdCB0byBiZSB0aGUgc2VwYXJhdG9yCisgICAgIyBvdGhlcndpc2UgZGVmYXVsdCB0byB0aGUgc3RhbmRhcmQgcGF0aCBzZXBhcmF0b3IgKGkuZS4gIjoiKSAtIGl0IGlzCisgICAgIyBhc3N1bWVkIHRoYXQgbm8gcGFydCBvZiBhIG5vcm1hbCBwYXRobmFtZSBjb250YWlucyAiOyIgYnV0IHRoYXQgc2hvdWxkCisgICAgIyBva2F5IGluIHRoZSByZWFsIHdvcmxkIHdoZXJlICI7IiBpbiBkaXJwYXRocyBpcyBpdHNlbGYgcHJvYmxlbWF0aWMuCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgJ3MvOy8gL2cnYAorICBlbHNlCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAorICBmaQorZWxzZQorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIiCitmaQorbmVlZF9saWJfcHJlZml4PXVua25vd24KK2hhcmRjb2RlX2ludG9fbGlicz1ubworCisjIHdoZW4geW91IHNldCBuZWVkX3ZlcnNpb24gdG8gbm8sIG1ha2Ugc3VyZSBpdCBkb2VzIG5vdCBjYXVzZSAtc2V0X3ZlcnNpb24KKyMgZmxhZ3MgdG8gYmUgbGVmdCB3aXRob3V0IGFyZ3VtZW50cworbmVlZF92ZXJzaW9uPXVua25vd24KKworY2FzZSAkaG9zdF9vcyBpbgorYWl4MyopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUuYScKKyAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisKKyAgIyBBSVggMyBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyB3ZSBhcHBlbmQgYSBtYWpvciB2ZXJzaW9uIHRvIHRoZSBuYW1lLgorICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICA7OworCithaXg0KiB8IGFpeDUqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisgICAgIyBBSVggNSBzdXBwb3J0cyBJQTY0CisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgZWxzZQorICAgICMgV2l0aCBHQ0MgdXAgdG8gMi45NS54LCBjb2xsZWN0MiB3b3VsZCBjcmVhdGUgYW4gaW1wb3J0IGZpbGUKKyAgICAjIGZvciBkZXBlbmRlbmNlIGxpYnJhcmllcy4gIFRoZSBpbXBvcnQgZmlsZSB3b3VsZCBzdGFydCB3aXRoCisgICAgIyB0aGUgbGluZSBgIyEgLicuICBUaGlzIHdvdWxkIGNhdXNlIHRoZSBnZW5lcmF0ZWQgbGlicmFyeSB0bworICAgICMgZGVwZW5kIG9uIGAuJywgYWx3YXlzIGFuIGludmFsaWQgbGlicmFyeS4gIFRoaXMgd2FzIGZpeGVkIGluCisgICAgIyBkZXZlbG9wbWVudCBzbmFwc2hvdHMgb2YgR0NDIHByaW9yIHRvIDMuMC4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXg0IHwgYWl4NC5bMDFdIHwgYWl4NC5bMDFdLiopCisgICAgICBpZiB7IGVjaG8gJyNpZiBfX0dOVUNfXyA+IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPj0gOTcpJworCSAgIGVjaG8gJyB5ZXMgJworCSAgIGVjaG8gJyNlbmRpZic7IH0gfCAke0NDfSAtRSAtIHwgZ3JlcCB5ZXMgPiAvZGV2L251bGw7IHRoZW4KKwk6CisgICAgICBlbHNlCisJY2FuX2J1aWxkX3NoYXJlZD1ubworICAgICAgZmkKKyAgICAgIDs7CisgICAgZXNhYworICAgICMgQUlYIChvbiBQb3dlciopIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIGN1cnJlbnRseSB3ZSBjYW4gbm90IGhhcmRjb2RlIGNvcnJlY3QKKyAgICAjIHNvbmFtZSBpbnRvIGV4ZWN1dGFibGUuIFByb2JhYmx5IHdlIGNhbiBhZGQgdmVyc2lvbmluZyBzdXBwb3J0IHRvCisgICAgIyBjb2xsZWN0Miwgc28gYWRkaXRpb25hbCBsaW5rcyBjYW4gYmUgdXNlZnVsIGluIGZ1dHVyZS4KKyAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKyAgICAgICMgSWYgdXNpbmcgcnVuIHRpbWUgbGlua2luZyAob24gQUlYIDQuMiBvciBsYXRlcikgdXNlIGxpYjxuYW1lPi5zbworICAgICAgIyBpbnN0ZWFkIG9mIGxpYjxuYW1lPi5hIHRvIGxldCBwZW9wbGUga25vdyB0aGF0IHRoZXNlIGFyZSBub3QKKyAgICAgICMgdHlwaWNhbCBBSVggc2hhcmVkIGxpYnJhcmllcy4KKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIGVsc2UKKyAgICAgICMgV2UgcHJlc2VydmUgLmEgYXMgZXh0ZW5zaW9uIGZvciBzaGFyZWQgbGlicmFyaWVzIHRocm91Z2ggQUlYNC4yCisgICAgICAjIGFuZCBsYXRlciB3aGVuIHdlIGFyZSBub3QgZG9pbmcgcnVuIHRpbWUgbGlua2luZy4KKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uYSAkbGlibmFtZS5hJworICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBmaQorICAgIHNobGlicGF0aF92YXI9TElCUEFUSAorICBmaQorICA7OworCithbWlnYW9zKikKKyAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5peGxpYnJhcnkgJGxpYm5hbWUuYScKKyAgIyBDcmVhdGUgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSBlbnRyaWVzIGluIC9zeXMvbGlicy4KKyAgZmluaXNoX2V2YWw9J2ZvciBsaWIgaW4gYGxzICRsaWJkaXIvKi5peGxpYnJhcnkgMj4vZGV2L251bGxgOyBkbyBsaWJuYW1lPWAkZWNobyAiWCRsaWIiIHwgJFhzZWQgLWUgJ1wnJ3MlXi4qL1woW14vXSpcKVwuaXhsaWJyYXJ5JCVcMSUnXCcnYDsgdGVzdCAkcm0gL3N5cy9saWJzLyR7bGlibmFtZX1faXhsaWJyYXJ5LmE7ICRzaG93ICJjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIjsgY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSB8fCBleGl0IDE7IGRvbmUnCisgIDs7CisKK2Jlb3MqKQorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCisgIHNobGlicGF0aF92YXI9TElCUkFSWV9QQVRICisgIDs7CisKK2JzZGk0KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9YMTEvbGliIC91c3IvY29udHJpYi9saWIgL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgIyB0aGUgZGVmYXVsdCBsZC5zby5jb25mIGFsc28gY29udGFpbnMgL3Vzci9jb250cmliL2xpYiBhbmQKKyAgIyAvdXNyL1gxMVI2L2xpYiAoL3Vzci9YMTEgaXMgYSBsaW5rIHRvIC91c3IvWDExUjYpLCBidXQgbGV0IHVzIGFsbG93CisgICMgbGlidG9vbCB0byBoYXJkLWNvZGUgdGhlc2UgaW50byBwcm9ncmFtcworICA7OworCitjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisgIHZlcnNpb25fdHlwZT13aW5kb3dzCisgIHNocmV4dF9jbWRzPSIuZGxsIgorICBuZWVkX3ZlcnNpb249bm8KKyAgbmVlZF9saWJfcHJlZml4PW5vCisKKyAgY2FzZSAkR0NDLCRob3N0X29zIGluCisgIHllcyxjeWd3aW4qIHwgeWVzLG1pbmd3KiB8IHllcyxwdzMyKikKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLmRsbC5hJworICAgICMgRExMIGlzIGluc3RhbGxlZCB0byAkKGxpYmRpcikvLi4vYmluIGJ5IHBvc3RpbnN0YWxsX2NtZHMKKyAgICBwb3N0aW5zdGFsbF9jbWRzPSdiYXNlX2ZpbGU9YGJhc2VuYW1lIFwke2ZpbGV9YH4KKyAgICAgIGRscGF0aD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGRpci8nXCcnXCR7YmFzZV9maWxlfSdcJydpO2VjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRsZGlyPSRkZXN0ZGlyL2BkaXJuYW1lIFwkZGxwYXRoYH4KKyAgICAgIHRlc3QgLWQgXCRkbGRpciB8fCBta2RpciAtcCBcJGRsZGlyfgorICAgICAgJGluc3RhbGxfcHJvZyAkZGlyLyRkbG5hbWUgXCRkbGRpci8kZGxuYW1lJworICAgIHBvc3R1bmluc3RhbGxfY21kcz0nZGxkbGw9YCRTSEVMTCAyPiYxIC1jICdcJycuICRmaWxlOyBlY2hvIFwkZGxuYW1lJ1wnJ2B+CisgICAgICBkbHBhdGg9JGRpci9cJGRsZGxsfgorICAgICAgICRybSBcJGRscGF0aCcKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgY3lnd2luKikKKyAgICAgICMgQ3lnd2luIERMTHMgdXNlICdjeWcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJworICAgICAgc29uYW1lX3NwZWM9J2BlY2hvICR7bGlibmFtZX0gfCBzZWQgLWUgJ3MvXmxpYi9jeWcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JworICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiAvbGliL3czMmFwaSAvbGliIC91c3IvbG9jYWwvbGliIgorICAgICAgOzsKKyAgICBtaW5ndyopCisgICAgICAjIE1pbkdXIERMTHMgdXNlIHRyYWRpdGlvbmFsICdsaWInIHByZWZpeAorICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JworICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgZ3JlcCAiXmxpYnJhcmllczoiIHwgJFNFRCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciYAorICAgICAgaWYgZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBncmVwICc7W2MtekMtWl06LycgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICAjIEl0IGlzIG1vc3QgcHJvYmFibHkgYSBXaW5kb3dzIGZvcm1hdCBQQVRIIHByaW50ZWQgYnkKKyAgICAgICAgIyBtaW5ndyBnY2MsIGJ1dCB3ZSBhcmUgcnVubmluZyBvbiBDeWd3aW4uIEdjYyBwcmludHMgaXRzIHNlYXJjaAorICAgICAgICAjIHBhdGggd2l0aCA7IHNlcGFyYXRvcnMsIGFuZCB3aXRoIGRyaXZlIGxldHRlcnMuIFdlIGNhbiBoYW5kbGUgdGhlCisgICAgICAgICMgZHJpdmUgbGV0dGVycyAoY3lnd2luIGZpbGV1dGlscyB1bmRlcnN0YW5kcyB0aGVtKSwgc28gbGVhdmUgdGhlbSwKKyAgICAgICAgIyBlc3BlY2lhbGx5IGFzIHdlIG1pZ2h0IHBhc3MgZmlsZXMgZm91bmQgdGhlcmUgdG8gYSBtaW5ndyBvYmpkdW1wLAorICAgICAgICAjIHdoaWNoIHdvdWxkbid0IHVuZGVyc3RhbmQgYSBjeWd3aW5pZmllZCBwYXRoLiBBaGguCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICdzLzsvIC9nJ2AKKyAgICAgIGVsc2UKKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAorICAgICAgZmkKKyAgICAgIDs7CisgICAgcHczMiopCisgICAgICAjIHB3MzIgRExMcyB1c2UgJ3B3JyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL3B3LydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvLi8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisgICAgICA7OworICAgIGVzYWMKKyAgICA7OworCisgICopCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fSAkbGlibmFtZS5saWInCisgICAgOzsKKyAgZXNhYworICBkeW5hbWljX2xpbmtlcj0nV2luMzIgbGQuZXhlJworICAjIEZJWE1FOiBmaXJzdCB3ZSBzaG91bGQgc2VhcmNoIC4gYW5kIHRoZSBkaXJlY3RvcnkgdGhlIGV4ZWN1dGFibGUgaXMgaW4KKyAgc2hsaWJwYXRoX3Zhcj1QQVRICisgIDs7CisKK2RhcndpbiogfCByaGFwc29keSopCisgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkeWxkIgorICB2ZXJzaW9uX3R5cGU9ZGFyd2luCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7dmVyc3VmZml4fSRzaGFyZWRfZXh0ICR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0kc2hhcmVkX2V4dCAke2xpYm5hbWV9JHNoYXJlZF9leHQnCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7bWFqb3J9JHNoYXJlZF9leHQnCisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgc2hsaWJwYXRoX3Zhcj1EWUxEX0xJQlJBUllfUEFUSAorICBzaHJleHRfY21kcz0nJCh0ZXN0IC4kbW9kdWxlID0gLnllcyAmJiBlY2hvIC5zbyB8fCBlY2hvIC5keWxpYiknCisgICMgQXBwbGUncyBnY2MgcHJpbnRzICdnY2MgLXByaW50LXNlYXJjaC1kaXJzJyBkb2Vzbid0IG9wZXJhdGUgdGhlIHNhbWUuCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgdHIgIlxuIiAiJFBBVEhfU0VQQVJBVE9SIiB8IHNlZCAtZSAncy9saWJyYXJpZXM6L0BsaWJyYXJpZXM6LycgfCB0ciAiQCIgIlxuIiB8IGdyZXAgIl5saWJyYXJpZXM6IiB8IHNlZCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciIC1lICJzLCRQQVRIX1NFUEFSQVRPUiwgLGciIC1lICJzLC4qLCYgL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYixnImAKKyAgZWxzZQorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYicKKyAgZmkKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbG9jYWwvbGliIC9saWIgL3Vzci9saWInCisgIDs7CisKK2RndXgqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHNoYXJlZF9leHQnCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIDs7CisKK2ZyZWVic2QxKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKKwora2ZyZWVic2QqLWdudSkKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgZHluYW1pY19saW5rZXI9J0dOVSBsZC5zbycKKyAgOzsKKworZnJlZWJzZCopCisgIG9iamZvcm1hdD1gdGVzdCAteCAvdXNyL2Jpbi9vYmpmb3JtYXQgJiYgL3Vzci9iaW4vb2JqZm9ybWF0IHx8IGVjaG8gYW91dGAKKyAgdmVyc2lvbl90eXBlPWZyZWVic2QtJG9iamZvcm1hdAorICBjYXNlICR2ZXJzaW9uX3R5cGUgaW4KKyAgICBmcmVlYnNkLWVsZiopCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICAgIG5lZWRfdmVyc2lvbj1ubworICAgICAgbmVlZF9saWJfcHJlZml4PW5vCisgICAgICA7OworICAgIGZyZWVic2QtKikKKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICAgICAgbmVlZF92ZXJzaW9uPXllcworICAgICAgOzsKKyAgZXNhYworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBjYXNlICRob3N0X29zIGluCisgIGZyZWVic2QyKikKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgOzsKKyAgZnJlZWJzZDMuMDEqIHwgZnJlZWJzZGVsZjMuMDEqKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgOzsKKyAgKikgIyBmcm9tIDMuMiBvbgorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICBlc2FjCisgIDs7CisKK2dudSopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0ke21ham9yfSAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCitocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKKyAgIyBHaXZlIGEgc29uYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1ham9yIHZlcnNpb24gc28gdGhhdCBkbGQuc2wgcmVmdXNlcyB0bworICAjIGxpbmsgYWdhaW5zdCBvdGhlciB2ZXJzaW9ucy4KKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgY2FzZSAiJGhvc3RfY3B1IiBpbgorICBpYTY0KikKKyAgICBzaHJleHRfY21kcz0nLnNvJworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNvIgorICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgaWYgdGVzdCAiWCRIUFVYX0lBNjRfTU9ERSIgPSBYMzI7IHRoZW4KKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvaHB1eDMyIC91c3IvbG9jYWwvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYiIKKyAgICBlbHNlCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXg2NCAvdXNyL2xvY2FsL2xpYi9ocHV4NjQiCisgICAgZmkKKyAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCisgICAgOzsKKyAgIGhwcGEqNjQqKQorICAgICBzaHJleHRfY21kcz0nLnNsJworICAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCisgICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRIICMgSG93IHNob3VsZCB3ZSBoYW5kbGUgU0hMSUJfUEFUSAorICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzICMgVW5sZXNzICtub2VudnZhciBpcyBzcGVjaWZpZWQuCisgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL3BhMjBfNjQgL3Vzci9jY3MvbGliL3BhMjBfNjQiCisgICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKKyAgICAgOzsKKyAgICopCisgICAgc2hyZXh0X2NtZHM9Jy5zbCcKKyAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgorICAgIHNobGlicGF0aF92YXI9U0hMSUJfUEFUSAorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubyAjICtzIGlzIHJlcXVpcmVkIHRvIGVuYWJsZSBTSExJQl9QQVRICisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICA7OworICBlc2FjCisgICMgSFAtVVggcnVucyAqcmVhbGx5KiBzbG93bHkgdW5sZXNzIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG1vZGUgNTU1LgorICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA1NTUgJGxpYicKKyAgOzsKKworaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgY2FzZSAkaG9zdF9vcyBpbgorICAgIG5vbnN0b3B1eCopIHZlcnNpb25fdHlwZT1ub25zdG9wdXggOzsKKyAgICAqKQorCWlmIHRlc3QgIiRsdF9jdl9wcm9nX2dudV9sZCIgPSB5ZXM7IHRoZW4KKwkJdmVyc2lvbl90eXBlPWxpbnV4CisJZWxzZQorCQl2ZXJzaW9uX3R5cGU9aXJpeAorCWZpIDs7CisgIGVzYWMKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgaXJpeDUqIHwgbm9uc3RvcHV4KikKKyAgICBsaWJzdWZmPSBzaGxpYnN1ZmY9CisgICAgOzsKKyAgKikKKyAgICBjYXNlICRMRCBpbiAjIGxpYnRvb2wubTQgd2lsbCBhZGQgb25lIG9mIHRoZXNlIHN3aXRjaGVzIHRvIExECisgICAgKi0zMnwqIi0zMiAifCotbWVsZjMyYnNtaXB8KiItbWVsZjMyYnNtaXAgIikKKyAgICAgIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9MzItYml0OzsKKyAgICAqLW4zMnwqIi1uMzIgInwqLW1lbGYzMmJtaXBuMzJ8KiItbWVsZjMyYm1pcG4zMiAiKQorICAgICAgbGlic3VmZj0zMiBzaGxpYnN1ZmY9TjMyIGxpYm1hZ2ljPU4zMjs7CisgICAgKi02NHwqIi02NCAifCotbWVsZjY0Ym1pcHwqIi1tZWxmNjRibWlwICIpCisgICAgICBsaWJzdWZmPTY0IHNobGlic3VmZj02NCBsaWJtYWdpYz02NC1iaXQ7OworICAgICopIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9bmV2ZXItbWF0Y2g7OworICAgIGVzYWMKKyAgICA7OworICBlc2FjCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWSR7c2hsaWJzdWZmfV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSAvdXNyL2xvY2FsL2xpYiR7bGlic3VmZn0iCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0iCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworIyBObyBzaGFyZWQgbGliIHN1cHBvcnQgZm9yIExpbnV4IG9sZGxkLCBhb3V0LCBvciBjb2ZmLgorbGludXgqb2xkbGQqIHwgbGludXgqYW91dCogfCBsaW51eCpjb2ZmKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKKworIyBUaGlzIG11c3QgYmUgTGludXggRUxGLgorbGludXgqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW4gJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICMgVGhpcyBpbXBsaWVzIG5vIGZhc3RfaW5zdGFsbCwgd2hpY2ggaXMgdW5hY2NlcHRhYmxlLgorICAjIFNvbWUgcmV3b3JrIHdpbGwgYmUgbmVlZGVkIHRvIGFsbG93IGZvciBmYXN0X2luc3RhbGwKKyAgIyBiZWZvcmUgdGhpcyBjYW4gYmUgZW5hYmxlZC4KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworCisgICMgQXBwZW5kIGxkLnNvLmNvbmYgY29udGVudHMgdG8gdGhlIHNlYXJjaCBwYXRoCisgIGlmIHRlc3QgLWYgL2V0Yy9sZC5zby5jb25mOyB0aGVuCisgICAgbHRfbGRfZXh0cmE9YCRTRUQgLWUgJ3MvOixcdC8gL2c7cy89Xj0qJC8vO3MvPV49ICogLyAvZycgL2V0Yy9sZC5zby5jb25mIHwgdHIgJ1xuJyAnICdgCisgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIgJGx0X2xkX2V4dHJhIgorICBmaQorCisgICMgV2UgdXNlZCB0byB0ZXN0IGZvciAvbGliL2xkLnNvLjEgYW5kIGRpc2FibGUgc2hhcmVkIGxpYnJhcmllcyBvbgorICAjIHBvd2VycGMsIGJlY2F1c2UgTWtMaW51eCBvbmx5IHN1cHBvcnRlZCBzaGFyZWQgbGlicmFyaWVzIHdpdGggdGhlCisgICMgR05VIGR5bmFtaWMgbGlua2VyLiAgU2luY2UgdGhpcyB3YXMgYnJva2VuIHdpdGggY3Jvc3MgY29tcGlsZXJzLAorICAjIG1vc3QgcG93ZXJwYy1saW51eCBib3hlcyBzdXBwb3J0IGR5bmFtaWMgbGlua2luZyB0aGVzZSBkYXlzIGFuZAorICAjIHBlb3BsZSBjYW4gYWx3YXlzIC0tZGlzYWJsZS1zaGFyZWQsIHRoZSB0ZXN0IHdhcyByZW1vdmVkLCBhbmQgd2UKKyAgIyBhc3N1bWUgdGhlIEdOVS9MaW51eCBkeW5hbWljIGxpbmtlciBpcyBpbiB1c2UuCisgIGR5bmFtaWNfbGlua2VyPSdHTlUvTGludXggbGQuc28nCisgIDs7CisKK2tuZXRic2QqLWdudSkKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgZHluYW1pY19saW5rZXI9J0dOVSBsZC5zbycKKyAgOzsKKworbmV0YnNkKikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgICAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKKyAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIChhLm91dCkgbGQuc28nCisgIGVsc2UKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgZHluYW1pY19saW5rZXI9J05ldEJTRCBsZC5lbGZfc28nCisgIGZpCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCituZXdzb3M2KQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgOzsKKworbnRvLXFueCopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIDs7CisKK29wZW5ic2QqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj15ZXMKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgb3BlbmJzZDIuWzg5XSB8IG9wZW5ic2QyLls4OV0uKikKKwlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKwk7OworICAgICAgKikKKwlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisJOzsKKyAgICAgIGVzYWMKKyAgZWxzZQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgZmkKKyAgOzsKKworb3MyKikKKyAgbGlibmFtZV9zcGVjPSckbmFtZScKKyAgc2hyZXh0X2NtZHM9Ii5kbGwiCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fSAkbGlibmFtZS5hJworICBkeW5hbWljX2xpbmtlcj0nT1MvMiBsZC5leGUnCisgIHNobGlicGF0aF92YXI9TElCUEFUSAorICA7OworCitvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgIHZlcnNpb25fdHlwZT1vc2YKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL3NobGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYi9jbXBscnMvY2MgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIgL3Zhci9zaGxpYiIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiCisgIDs7CisKK3NjbzMuMnY1KikKKyAgdmVyc2lvbl90eXBlPW9zZgorICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworc29sYXJpcyopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgIyBsZGQgY29tcGxhaW5zIHVubGVzcyBsaWJyYXJpZXMgYXJlIGV4ZWN1dGFibGUKKyAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgK3ggJGxpYicKKyAgOzsKKworc3Vub3M0KikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3Vzci9ldGMiIGxkY29uZmlnICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgIG5lZWRfbGliX3ByZWZpeD1ubworICBmaQorICBuZWVkX3ZlcnNpb249eWVzCisgIDs7CisKK3N5c3Y0IHwgc3lzdjQuMnV3MiogfCBzeXN2NC4zKiB8IHN5c3Y1KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBjYXNlICRob3N0X3ZlbmRvciBpbgorICAgIHNuaSkKKyAgICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgICAgbmVlZF9saWJfcHJlZml4PW5vCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUJsYXJnZWR5bnN5bScKKyAgICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisgICAgICA7OworICAgIHNpZW1lbnMpCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIDs7CisgICAgbW90b3JvbGEpCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIG5lZWRfdmVyc2lvbj1ubworICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy9saWIgL3Vzci9saWIgL3Vzci9jY3MvbGliJworICAgICAgOzsKKyAgZXNhYworICA7OworCitzeXN2NCpNUCopCisgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KKyAgICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yJworICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGZpCisgIDs7CisKK3V0czQqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIDs7CisKKyopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7Citlc2FjCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGR5bmFtaWNfbGlua2VyIiA+JjUKKyRhc19lY2hvICIkZHluYW1pY19saW5rZXIiID4mNjsgfQordGVzdCAiJGR5bmFtaWNfbGlua2VyIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIHByb2dyYW1zIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGhvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXMuLi4gIiA+JjY7IH0KK2hhcmRjb2RlX2FjdGlvbl9DWFg9CitpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFgiIHx8IFwKKyAgIHRlc3QgLW4gIiRydW5wYXRoX3ZhciBDWFgiIHx8IFwKKyAgIHRlc3QgIlgkaGFyZGNvZGVfYXV0b21hdGljX0NYWCI9Ilh5ZXMiIDsgdGhlbgorCisgICMgV2UgY2FuIGhhcmRjb2RlIG5vbi1leGlzdGFudCBkaXJlY3Rvcmllcy4KKyAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdF9DWFgiICE9IG5vICYmCisgICAgICMgSWYgdGhlIG9ubHkgbWVjaGFuaXNtIHRvIGF2b2lkIGhhcmRjb2RpbmcgaXMgc2hsaWJwYXRoX3Zhciwgd2UKKyAgICAgIyBoYXZlIHRvIHJlbGluaywgb3RoZXJ3aXNlIHdlIG1pZ2h0IGxpbmsgd2l0aCBhbiBpbnN0YWxsZWQgbGlicmFyeQorICAgICAjIHdoZW4gd2Ugc2hvdWxkIGJlIGxpbmtpbmcgd2l0aCBhIHlldC10by1iZS1pbnN0YWxsZWQgb25lCisgICAgICMjIHRlc3QgIiRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsIENYWCkiICE9IG5vICYmCisgICAgIHRlc3QgIiRoYXJkY29kZV9taW51c19MX0NYWCIgIT0gbm87IHRoZW4KKyAgICAjIExpbmtpbmcgYWx3YXlzIGhhcmRjb2RlcyB0aGUgdGVtcG9yYXJ5IGxpYnJhcnkgZGlyZWN0b3J5LgorICAgIGhhcmRjb2RlX2FjdGlvbl9DWFg9cmVsaW5rCisgIGVsc2UKKyAgICAjIFdlIGNhbiBsaW5rIHdpdGhvdXQgaGFyZGNvZGluZywgYW5kIHdlIGNhbiBoYXJkY29kZSBub25leGlzdGluZyBkaXJzLgorICAgIGhhcmRjb2RlX2FjdGlvbl9DWFg9aW1tZWRpYXRlCisgIGZpCitlbHNlCisgICMgV2UgY2Fubm90IGhhcmRjb2RlIGFueXRoaW5nLCBvciBlbHNlIHdlIGNhbiBvbmx5IGhhcmRjb2RlIGV4aXN0aW5nCisgICMgZGlyZWN0b3JpZXMuCisgIGhhcmRjb2RlX2FjdGlvbl9DWFg9dW5zdXBwb3J0ZWQKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGhhcmRjb2RlX2FjdGlvbl9DWFgiID4mNQorJGFzX2VjaG8gIiRoYXJkY29kZV9hY3Rpb25fQ1hYIiA+JjY7IH0KKworaWYgdGVzdCAiJGhhcmRjb2RlX2FjdGlvbl9DWFgiID0gcmVsaW5rOyB0aGVuCisgICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCitlbGlmIHRlc3QgIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiID0geWVzIHx8CisgICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vOyB0aGVuCisgICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IG5lY2Vzc2FyeQorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5lZWRsZXNzCitmaQorCitzdHJpcGxpYj0KK29sZF9zdHJpcGxpYj0KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBzdHJpcHBpbmcgbGlicmFyaWVzIGlzIHBvc3NpYmxlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgc3RyaXBwaW5nIGxpYnJhcmllcyBpcyBwb3NzaWJsZS4uLiAiID4mNjsgfQoraWYgdGVzdCAtbiAiJFNUUklQIiAmJiAkU1RSSVAgLVYgMj4mMSB8IGdyZXAgIkdOVSBzdHJpcCIgPi9kZXYvbnVsbDsgdGhlbgorICB0ZXN0IC16ICIkb2xkX3N0cmlwbGliIiAmJiBvbGRfc3RyaXBsaWI9IiRTVFJJUCAtLXN0cmlwLWRlYnVnIgorICB0ZXN0IC16ICIkc3RyaXBsaWIiICYmIHN0cmlwbGliPSIkU1RSSVAgLS1zdHJpcC11bm5lZWRlZCIKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KK2Vsc2UKKyMgRklYTUUgLSBpbnNlcnQgc29tZSByZWFsIHRlc3RzLCBob3N0X29zIGlzbid0IHJlYWxseSBnb29kIGVub3VnaAorICBjYXNlICRob3N0X29zIGluCisgICBkYXJ3aW4qKQorICAgICAgIGlmIHRlc3QgLW4gIiRTVFJJUCIgOyB0aGVuCisgICAgICAgICBzdHJpcGxpYj0iJFNUUklQIC14IgorICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKyAgICAgICBlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKyAgICAgICA7OworICAgKikKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisgICAgOzsKKyAgZXNhYworZmkKKworaWYgdGVzdCAieCRlbmFibGVfZGxvcGVuIiAhPSB4eWVzOyB0aGVuCisgIGVuYWJsZV9kbG9wZW49dW5rbm93bgorICBlbmFibGVfZGxvcGVuX3NlbGY9dW5rbm93bgorICBlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPXVua25vd24KK2Vsc2UKKyAgbHRfY3ZfZGxvcGVuPW5vCisgIGx0X2N2X2Rsb3Blbl9saWJzPQorCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgYmVvcyopCisgICAgbHRfY3ZfZGxvcGVuPSJsb2FkX2FkZF9vbiIKKyAgICBsdF9jdl9kbG9wZW5fbGlicz0KKyAgICBsdF9jdl9kbG9wZW5fc2VsZj15ZXMKKyAgICA7OworCisgIG1pbmd3KiB8IHB3MzIqKQorICAgIGx0X2N2X2Rsb3Blbj0iTG9hZExpYnJhcnkiCisgICAgbHRfY3ZfZGxvcGVuX2xpYnM9CisgICA7OworCisgIGN5Z3dpbiopCisgICAgbHRfY3ZfZGxvcGVuPSJkbG9wZW4iCisgICAgbHRfY3ZfZGxvcGVuX2xpYnM9CisgICA7OworCisgIGRhcndpbiopCisgICMgaWYgbGliZGwgaXMgaW5zdGFsbGVkIHdlIG5lZWQgdG8gbGluayBhZ2FpbnN0IGl0CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZGxvcGVuIGluIC1sZGwiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2xpYl9kbF9kbG9wZW4rc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbGRsICAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBkbG9wZW4gKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBkbG9wZW4gKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2N4eF90cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9saWJfZGxfZGxvcGVuPXllcworZWxzZQorICBhY19jdl9saWJfZGxfZGxvcGVuPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9kbF9kbG9wZW4iID4mNQorJGFzX2VjaG8gIiRhY19jdl9saWJfZGxfZGxvcGVuIiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX2RsX2Rsb3BlbiIgPSB4IiJ5ZXM7IHRoZW4gOgorICBsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiCitlbHNlCisKKyAgICBsdF9jdl9kbG9wZW49ImR5bGQiCisgICAgbHRfY3ZfZGxvcGVuX2xpYnM9CisgICAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzCisKK2ZpCisKKyAgIDs7CisKKyAgKikKKyAgICBhY19mbl9jeHhfY2hlY2tfZnVuYyAiJExJTkVOTyIgInNobF9sb2FkIiAiYWNfY3ZfZnVuY19zaGxfbG9hZCIKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19zaGxfbG9hZCIgPSB4IiJ5ZXM7IHRoZW4gOgorICBsdF9jdl9kbG9wZW49InNobF9sb2FkIgorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzaGxfbG9hZCBpbiAtbGRsZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igc2hsX2xvYWQgaW4gLWxkbGQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfbGliX2RsZF9zaGxfbG9hZCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sZGxkICAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBzaGxfbG9hZCAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIHNobF9sb2FkICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jeHhfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX2RsZF9zaGxfbG9hZD15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX2RsZF9zaGxfbG9hZD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfZGxkX3NobF9sb2FkIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX2RsZF9zaGxfbG9hZCIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9kbGRfc2hsX2xvYWQiID0geCIieWVzOyB0aGVuIDoKKyAgbHRfY3ZfZGxvcGVuPSJzaGxfbG9hZCIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1kbGQiCitlbHNlCisgIGFjX2ZuX2N4eF9jaGVja19mdW5jICIkTElORU5PIiAiZGxvcGVuIiAiYWNfY3ZfZnVuY19kbG9wZW4iCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZGxvcGVuIiA9IHgiInllczsgdGhlbiA6CisgIGx0X2N2X2Rsb3Blbj0iZGxvcGVuIgorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZGxvcGVuIGluIC1sZGwuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfbGliX2RsX2Rsb3BlbitzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sZGwgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIGRsb3BlbiAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGRsb3BlbiAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY3h4X3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9kbF9kbG9wZW49eWVzCitlbHNlCisgIGFjX2N2X2xpYl9kbF9kbG9wZW49bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2RsX2Rsb3BlbiIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9kbF9kbG9wZW4iID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfZGxfZGxvcGVuIiA9IHgiInllczsgdGhlbiA6CisgIGx0X2N2X2Rsb3Blbj0iZGxvcGVuIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbCIKK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZGxvcGVuIGluIC1sc3ZsZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZGxvcGVuIGluIC1sc3ZsZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9saWJfc3ZsZF9kbG9wZW4rc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbHN2bGQgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIGRsb3BlbiAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGRsb3BlbiAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY3h4X3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9zdmxkX2Rsb3Blbj15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX3N2bGRfZGxvcGVuPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9zdmxkX2Rsb3BlbiIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9zdmxkX2Rsb3BlbiIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9zdmxkX2Rsb3BlbiIgPSB4IiJ5ZXM7IHRoZW4gOgorICBsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sc3ZsZCIKK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZGxkX2xpbmsgaW4gLWxkbGQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGRsZF9saW5rIGluIC1sZGxkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2xpYl9kbGRfZGxkX2xpbmsrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbGRsZCAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgZGxkX2xpbmsgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBkbGRfbGluayAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY3h4X3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9kbGRfZGxkX2xpbms9eWVzCitlbHNlCisgIGFjX2N2X2xpYl9kbGRfZGxkX2xpbms9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2RsZF9kbGRfbGluayIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9kbGRfZGxkX2xpbmsiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfZGxkX2RsZF9saW5rIiA9IHgiInllczsgdGhlbiA6CisgIGx0X2N2X2Rsb3Blbj0iZGxkX2xpbmsiIGx0X2N2X2Rsb3Blbl9saWJzPSItZGxkIgorZmkKKworCitmaQorCisKK2ZpCisKKworZmkKKworCitmaQorCisKK2ZpCisKKyAgICA7OworICBlc2FjCisKKyAgaWYgdGVzdCAieCRsdF9jdl9kbG9wZW4iICE9IHhubzsgdGhlbgorICAgIGVuYWJsZV9kbG9wZW49eWVzCisgIGVsc2UKKyAgICBlbmFibGVfZGxvcGVuPW5vCisgIGZpCisKKyAgY2FzZSAkbHRfY3ZfZGxvcGVuIGluCisgIGRsb3BlbikKKyAgICBzYXZlX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCisgICAgdGVzdCAieCRhY19jdl9oZWFkZXJfZGxmY25faCIgPSB4eWVzICYmIENQUEZMQUdTPSIkQ1BQRkxBR1MgLURIQVZFX0RMRkNOX0giCisKKyAgICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorICAgIGV2YWwgTERGTEFHUz1cIlwkTERGTEFHUyAkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXCIKKworICAgIHNhdmVfTElCUz0iJExJQlMiCisgICAgTElCUz0iJGx0X2N2X2Rsb3Blbl9saWJzICRMSUJTIgorCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGEgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIGEgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZi4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHtsdF9jdl9kbG9wZW5fc2VsZitzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIAkgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgbHRfY3ZfZGxvcGVuX3NlbGY9Y3Jvc3MKK2Vsc2UKKyAgbHRfZGx1bmtub3duPTA7IGx0X2Rsbm9fdXNjb3JlPTE7IGx0X2RsbmVlZF91c2NvcmU9MgorICBsdF9zdGF0dXM9JGx0X2RsdW5rbm93bgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMzQ2MSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpZiBIQVZFX0RMRkNOX0gKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZkZWYgUlRMRF9HTE9CQUwKKyMgIGRlZmluZSBMVF9ETEdMT0JBTAkJUlRMRF9HTE9CQUwKKyNlbHNlCisjICBpZmRlZiBETF9HTE9CQUwKKyMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQlETF9HTE9CQUwKKyMgIGVsc2UKKyMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQkwCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFdlIG1heSBoYXZlIHRvIGRlZmluZSBMVF9ETExBWllfT1JfTk9XIGluIHRoZSBjb21tYW5kIGxpbmUgaWYgd2UKKyAgIGZpbmQgb3V0IGl0IGRvZXMgbm90IHdvcmsgaW4gc29tZSBwbGF0Zm9ybS4gKi8KKyNpZm5kZWYgTFRfRExMQVpZX09SX05PVworIyAgaWZkZWYgUlRMRF9MQVpZCisjICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlSVExEX0xBWlkKKyMgIGVsc2UKKyMgICAgaWZkZWYgRExfTEFaWQorIyAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlETF9MQVpZCisjICAgIGVsc2UKKyMgICAgICBpZmRlZiBSVExEX05PVworIyAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJUlRMRF9OT1cKKyMgICAgICBlbHNlCisjICAgICAgICBpZmRlZiBETF9OT1cKKyMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJRExfTk9XCisjICAgICAgICBlbHNlCisjICAgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCTAKKyMgICAgICAgIGVuZGlmCisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHZvaWQgZXhpdCAoaW50KTsKKyNlbmRpZgorCit2b2lkIGZub3JkKCkgeyBpbnQgaT00Mjt9CitpbnQgbWFpbiAoKQoreworICB2b2lkICpzZWxmID0gZGxvcGVuICgwLCBMVF9ETEdMT0JBTHxMVF9ETExBWllfT1JfTk9XKTsKKyAgaW50IHN0YXR1cyA9ICRsdF9kbHVua25vd247CisKKyAgaWYgKHNlbGYpCisgICAgeworICAgICAgaWYgKGRsc3ltIChzZWxmLCJmbm9yZCIpKSAgICAgICBzdGF0dXMgPSAkbHRfZGxub191c2NvcmU7CisgICAgICBlbHNlIGlmIChkbHN5bSggc2VsZiwiX2Zub3JkIikpIHN0YXR1cyA9ICRsdF9kbG5lZWRfdXNjb3JlOworICAgICAgLyogZGxjbG9zZSAoc2VsZik7ICovCisgICAgfQorCisgICAgZXhpdCAoc3RhdHVzKTsKK30KK0VPRgorICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfbGlua1wiIjsgfSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gMj4vZGV2L251bGw7IHRoZW4KKyAgICAoLi9jb25mdGVzdDsgZXhpdDsgKSAyPi9kZXYvbnVsbAorICAgIGx0X3N0YXR1cz0kPworICAgIGNhc2UgeCRsdF9zdGF0dXMgaW4KKyAgICAgIHgkbHRfZGxub191c2NvcmUpIGx0X2N2X2Rsb3Blbl9zZWxmPXllcyA7OworICAgICAgeCRsdF9kbG5lZWRfdXNjb3JlKSBsdF9jdl9kbG9wZW5fc2VsZj15ZXMgOzsKKyAgICAgIHgkbHRfdW5rbm93bnx4KikgbHRfY3ZfZGxvcGVuX3NlbGY9bm8gOzsKKyAgICBlc2FjCisgIGVsc2UgOgorICAgICMgY29tcGlsYXRpb24gZmFpbGVkCisgICAgbHRfY3ZfZGxvcGVuX3NlbGY9bm8KKyAgZmkKK2ZpCitybSAtZnIgY29uZnRlc3QqCisKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfZGxvcGVuX3NlbGYiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9kbG9wZW5fc2VsZiIgPiY2OyB9CisKKyAgICBpZiB0ZXN0ICJ4JGx0X2N2X2Rsb3Blbl9zZWxmIiA9IHh5ZXM7IHRoZW4KKyAgICAgIExERkxBR1M9IiRMREZMQUdTICRsaW5rX3N0YXRpY19mbGFnIgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGEgc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIGEgc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZi4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHtsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICAJICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz1jcm9zcworZWxzZQorICBsdF9kbHVua25vd249MDsgbHRfZGxub191c2NvcmU9MTsgbHRfZGxuZWVkX3VzY29yZT0yCisgIGx0X3N0YXR1cz0kbHRfZGx1bmtub3duCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEzNTU5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworI2lmIEhBVkVfRExGQ05fSAorI2luY2x1ZGUgPGRsZmNuLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZmRlZiBSVExEX0dMT0JBTAorIyAgZGVmaW5lIExUX0RMR0xPQkFMCQlSVExEX0dMT0JBTAorI2Vsc2UKKyMgIGlmZGVmIERMX0dMT0JBTAorIyAgICBkZWZpbmUgTFRfRExHTE9CQUwJCURMX0dMT0JBTAorIyAgZWxzZQorIyAgICBkZWZpbmUgTFRfRExHTE9CQUwJCTAKKyMgIGVuZGlmCisjZW5kaWYKKworLyogV2UgbWF5IGhhdmUgdG8gZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cgaW4gdGhlIGNvbW1hbmQgbGluZSBpZiB3ZQorICAgZmluZCBvdXQgaXQgZG9lcyBub3Qgd29yayBpbiBzb21lIHBsYXRmb3JtLiAqLworI2lmbmRlZiBMVF9ETExBWllfT1JfTk9XCisjICBpZmRlZiBSVExEX0xBWlkKKyMgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJCVJUTERfTEFaWQorIyAgZWxzZQorIyAgICBpZmRlZiBETF9MQVpZCisjICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJCURMX0xBWlkKKyMgICAgZWxzZQorIyAgICAgIGlmZGVmIFJUTERfTk9XCisjICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwlSVExEX05PVworIyAgICAgIGVsc2UKKyMgICAgICAgIGlmZGVmIERMX05PVworIyAgICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwlETF9OT1cKKyMgICAgICAgIGVsc2UKKyMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJMAorIyAgICAgICAgZW5kaWYKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgdm9pZCBleGl0IChpbnQpOworI2VuZGlmCisKK3ZvaWQgZm5vcmQoKSB7IGludCBpPTQyO30KK2ludCBtYWluICgpCit7CisgIHZvaWQgKnNlbGYgPSBkbG9wZW4gKDAsIExUX0RMR0xPQkFMfExUX0RMTEFaWV9PUl9OT1cpOworICBpbnQgc3RhdHVzID0gJGx0X2RsdW5rbm93bjsKKworICBpZiAoc2VsZikKKyAgICB7CisgICAgICBpZiAoZGxzeW0gKHNlbGYsImZub3JkIikpICAgICAgIHN0YXR1cyA9ICRsdF9kbG5vX3VzY29yZTsKKyAgICAgIGVsc2UgaWYgKGRsc3ltKCBzZWxmLCJfZm5vcmQiKSkgc3RhdHVzID0gJGx0X2RsbmVlZF91c2NvcmU7CisgICAgICAvKiBkbGNsb3NlIChzZWxmKTsgKi8KKyAgICB9CisKKyAgICBleGl0IChzdGF0dXMpOworfQorRU9GCisgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19saW5rXCIiOyB9ID4mNQorICAoZXZhbCAkYWNfbGluaykgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAyPi9kZXYvbnVsbDsgdGhlbgorICAgICguL2NvbmZ0ZXN0OyBleGl0OyApIDI+L2Rldi9udWxsCisgICAgbHRfc3RhdHVzPSQ/CisgICAgY2FzZSB4JGx0X3N0YXR1cyBpbgorICAgICAgeCRsdF9kbG5vX3VzY29yZSkgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPXllcyA7OworICAgICAgeCRsdF9kbG5lZWRfdXNjb3JlKSBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9eWVzIDs7CisgICAgICB4JGx0X3Vua25vd258eCopIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz1ubyA7OworICAgIGVzYWMKKyAgZWxzZSA6CisgICAgIyBjb21waWxhdGlvbiBmYWlsZWQKKyAgICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9bm8KKyAgZmkKK2ZpCitybSAtZnIgY29uZnRlc3QqCisKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIiA+JjY7IH0KKyAgICBmaQorCisgICAgQ1BQRkxBR1M9IiRzYXZlX0NQUEZMQUdTIgorICAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCisgICAgTElCUz0iJHNhdmVfTElCUyIKKyAgICA7OworICBlc2FjCisKKyAgY2FzZSAkbHRfY3ZfZGxvcGVuX3NlbGYgaW4KKyAgeWVzfG5vKSBlbmFibGVfZGxvcGVuX3NlbGY9JGx0X2N2X2Rsb3Blbl9zZWxmIDs7CisgICopIGVuYWJsZV9kbG9wZW5fc2VsZj11bmtub3duIDs7CisgIGVzYWMKKworICBjYXNlICRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMgaW4KKyAgeWVzfG5vKSBlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPSRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMgOzsKKyAgKikgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz11bmtub3duIDs7CisgIGVzYWMKK2ZpCisKKworIyBUaGUgZWxzZSBjbGF1c2Ugc2hvdWxkIG9ubHkgZmlyZSB3aGVuIGJvb3RzdHJhcHBpbmcgdGhlCisjIGxpYnRvb2wgZGlzdHJpYnV0aW9uLCBvdGhlcndpc2UgeW91IGZvcmdvdCB0byBzaGlwIGx0bWFpbi5zaAorIyB3aXRoIHlvdXIgcGFja2FnZSwgYW5kIHlvdSB3aWxsIGdldCBjb21wbGFpbnRzIHRoYXQgdGhlcmUgYXJlCisjIG5vIHJ1bGVzIHRvIGdlbmVyYXRlIGx0bWFpbi5zaC4KK2lmIHRlc3QgLWYgIiRsdG1haW4iOyB0aGVuCisgICMgU2VlIGlmIHdlIGFyZSBydW5uaW5nIG9uIHpzaCwgYW5kIHNldCB0aGUgb3B0aW9ucyB3aGljaCBhbGxvdyBvdXIgY29tbWFuZHMgdGhyb3VnaAorICAjIHdpdGhvdXQgcmVtb3ZhbCBvZiBcIGVzY2FwZXMuCisgIGlmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgOyB0aGVuCisgICAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKKyAgZmkKKyAgIyBOb3cgcXVvdGUgYWxsIHRoZSB0aGluZ3MgdGhhdCBtYXkgY29udGFpbiBtZXRhY2hhcmFjdGVycyB3aGlsZSBiZWluZworICAjIGNhcmVmdWwgbm90IHRvIG92ZXJxdW90ZSB0aGUgQUNfU1VCU1RlZCB2YWx1ZXMuICBXZSB0YWtlIGNvcGllcyBvZiB0aGUKKyAgIyB2YXJpYWJsZXMgYW5kIHF1b3RlIHRoZSBjb3BpZXMgZm9yIGdlbmVyYXRpb24gb2YgdGhlIGxpYnRvb2wgc2NyaXB0LgorICBmb3IgdmFyIGluIGVjaG8gb2xkX0NDIG9sZF9DRkxBR1MgQVIgQVJfRkxBR1MgRUdSRVAgUkFOTElCIExOX1MgTFRDQyBOTSBcCisgICAgU0VEIFNIRUxMIFNUUklQIFwKKyAgICBsaWJuYW1lX3NwZWMgbGlicmFyeV9uYW1lc19zcGVjIHNvbmFtZV9zcGVjIGV4dHJhY3RfZXhwc3ltc19jbWRzIFwKKyAgICBvbGRfc3RyaXBsaWIgc3RyaXBsaWIgZmlsZV9tYWdpY19jbWQgZmluaXNoX2NtZHMgZmluaXNoX2V2YWwgXAorICAgIGRlcGxpYnNfY2hlY2tfbWV0aG9kIHJlbG9hZF9mbGFnIHJlbG9hZF9jbWRzIG5lZWRfbG9ja3MgXAorICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wgXAorICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzIFwKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMgXAorICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzIG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMgXAorICAgIGNvbXBpbGVyX0NYWCBcCisgICAgQ0NfQ1hYIFwKKyAgICBMRF9DWFggXAorICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYIFwKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFggXAorICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWCBcCisgICAgbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfQ1hYIFwKKyAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYIFwKKyAgICB0aHJlYWRfc2FmZV9mbGFnX3NwZWNfQ1hYIFwKKyAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFggXAorICAgIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfQ1hYIFwKKyAgICBvbGRfYXJjaGl2ZV9jbWRzX0NYWCBcCisgICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc19DWFggXAorICAgIHByZWRlcF9vYmplY3RzX0NYWCBcCisgICAgcG9zdGRlcF9vYmplY3RzX0NYWCBcCisgICAgcHJlZGVwc19DWFggXAorICAgIHBvc3RkZXBzX0NYWCBcCisgICAgY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWCBcCisgICAgYXJjaGl2ZV9jbWRzX0NYWCBcCisgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFggXAorICAgIHBvc3RpbnN0YWxsX2NtZHNfQ1hYIFwKKyAgICBwb3N0dW5pbnN0YWxsX2NtZHNfQ1hYIFwKKyAgICBvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc19DWFggXAorICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWCBcCisgICAgbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYIFwKKyAgICBleHBvcnRfc3ltYm9sc19jbWRzX0NYWCBcCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFggXAorICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfQ1hYIFwKKyAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWCBcCisgICAgaGFyZGNvZGVfYXV0b21hdGljX0NYWCBcCisgICAgbW9kdWxlX2NtZHNfQ1hYIFwKKyAgICBtb2R1bGVfZXhwc3ltX2NtZHNfQ1hYIFwKKyAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19DWFggXAorICAgIGV4Y2x1ZGVfZXhwc3ltc19DWFggXAorICAgIGluY2x1ZGVfZXhwc3ltc19DWFg7IGRvCisKKyAgICBjYXNlICR2YXIgaW4KKyAgICBvbGRfYXJjaGl2ZV9jbWRzX0NYWCB8IFwKKyAgICBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzX0NYWCB8IFwKKyAgICBhcmNoaXZlX2NtZHNfQ1hYIHwgXAorICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYIHwgXAorICAgIG1vZHVsZV9jbWRzX0NYWCB8IFwKKyAgICBtb2R1bGVfZXhwc3ltX2NtZHNfQ1hYIHwgXAorICAgIG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzX0NYWCB8IFwKKyAgICBleHBvcnRfc3ltYm9sc19jbWRzX0NYWCB8IFwKKyAgICBleHRyYWN0X2V4cHN5bXNfY21kcyB8IHJlbG9hZF9jbWRzIHwgZmluaXNoX2NtZHMgfCBcCisgICAgcG9zdGluc3RhbGxfY21kcyB8IHBvc3R1bmluc3RhbGxfY21kcyB8IFwKKyAgICBvbGRfcG9zdGluc3RhbGxfY21kcyB8IG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMgfCBcCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIHwgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMpCisgICAgICAjIERvdWJsZS1xdW90ZSBkb3VibGUtZXZhbGVkIHN0cmluZ3MuCisgICAgICBldmFsICJsdF8kdmFyPVxcXCJcYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkZG91YmxlX3F1b3RlX3N1YnN0XCIgLWUgXCJcJHNlZF9xdW90ZV9zdWJzdFwiIC1lIFwiXCRkZWxheV92YXJpYWJsZV9zdWJzdFwiXGBcXFwiIgorICAgICAgOzsKKyAgICAqKQorICAgICAgZXZhbCAibHRfJHZhcj1cXFwiXGBcJGVjaG8gXCJYXCQkdmFyXCIgfCBcJFhzZWQgLWUgXCJcJHNlZF9xdW90ZV9zdWJzdFwiXGBcXFwiIgorICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKworICBjYXNlICRsdF9lY2hvIGluCisgIConXCQwIC0tZmFsbGJhY2stZWNobyInKQorICAgIGx0X2VjaG89YCRlY2hvICJYJGx0X2VjaG8iIHwgJFhzZWQgLWUgJ3MvXFxcXFxcXCQwIC0tZmFsbGJhY2stZWNobyIkLyQwIC0tZmFsbGJhY2stZWNobyIvJ2AKKyAgICA7OworICBlc2FjCisKK2NmZ2ZpbGU9IiRvZmlsZSIKKworICBjYXQgPDxfX0VPRl9fID4+ICIkY2ZnZmlsZSIKKyMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogJHRhZ25hbWUKKworIyBMaWJ0b29sIHdhcyBjb25maWd1cmVkIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgorCisjIFNoZWxsIHRvIHVzZSB3aGVuIGludm9raW5nIHNoZWxsIHNjcmlwdHMuCitTSEVMTD0kbHRfU0hFTEwKKworIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLgorYnVpbGRfbGlidG9vbF9saWJzPSRlbmFibGVfc2hhcmVkCisKKyMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcy4KK2J1aWxkX29sZF9saWJzPSRlbmFibGVfc3RhdGljCisKKyMgV2hldGhlciBvciBub3QgdG8gYWRkIC1sYyBmb3IgYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4KK2J1aWxkX2xpYnRvb2xfbmVlZF9sYz0kYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYCisKKyMgV2hldGhlciBvciBub3QgdG8gZGlzYWxsb3cgc2hhcmVkIGxpYnMgd2hlbiBydW50aW1lIGxpYnMgYXJlIHN0YXRpYworYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzPSRlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0NYWAorCisjIFdoZXRoZXIgb3Igbm90IHRvIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbi4KK2Zhc3RfaW5zdGFsbD0kZW5hYmxlX2Zhc3RfaW5zdGFsbAorCisjIFRoZSBob3N0IHN5c3RlbS4KK2hvc3RfYWxpYXM9JGhvc3RfYWxpYXMKK2hvc3Q9JGhvc3QKKworIyBBbiBlY2hvIHByb2dyYW0gdGhhdCBkb2VzIG5vdCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCitlY2hvPSRsdF9lY2hvCisKKyMgVGhlIGFyY2hpdmVyLgorQVI9JGx0X0FSCitBUl9GTEFHUz0kbHRfQVJfRkxBR1MKKworIyBBIEMgY29tcGlsZXIuCitMVENDPSRsdF9MVENDCisKKyMgQSBsYW5ndWFnZS1zcGVjaWZpYyBjb21waWxlci4KK0NDPSRsdF9jb21waWxlcl9DWFgKKworIyBJcyB0aGUgY29tcGlsZXIgdGhlIEdOVSBDIGNvbXBpbGVyPword2l0aF9nY2M9JEdDQ19DWFgKKworIyBBbiBFUkUgbWF0Y2hlci4KK0VHUkVQPSRsdF9FR1JFUAorCisjIFRoZSBsaW5rZXIgdXNlZCB0byBidWlsZCBsaWJyYXJpZXMuCitMRD0kbHRfTERfQ1hYCisKKyMgV2hldGhlciB3ZSBuZWVkIGhhcmQgb3Igc29mdCBsaW5rcy4KK0xOX1M9JGx0X0xOX1MKKworIyBBIEJTRC1jb21wYXRpYmxlIG5tIHByb2dyYW0uCitOTT0kbHRfTk0KKworIyBBIHN5bWJvbCBzdHJpcHBpbmcgcHJvZ3JhbQorU1RSSVA9JGx0X1NUUklQCisKKyMgVXNlZCB0byBleGFtaW5lIGxpYnJhcmllcyB3aGVuIGZpbGVfbWFnaWNfY21kIGJlZ2lucyAiZmlsZSIKK01BR0lDX0NNRD0kTUFHSUNfQ01ECisKKyMgVXNlZCBvbiBjeWd3aW46IERMTCBjcmVhdGlvbiBwcm9ncmFtLgorRExMVE9PTD0iJERMTFRPT0wiCisKKyMgVXNlZCBvbiBjeWd3aW46IG9iamVjdCBkdW1wZXIuCitPQkpEVU1QPSIkT0JKRFVNUCIKKworIyBVc2VkIG9uIGN5Z3dpbjogYXNzZW1ibGVyLgorQVM9IiRBUyIKKworIyBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGVtcG9yYXJ5IGxpYnRvb2wgZmlsZXMuCitvYmpkaXI9JG9iamRpcgorCisjIEhvdyB0byBjcmVhdGUgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMuCityZWxvYWRfZmxhZz0kbHRfcmVsb2FkX2ZsYWcKK3JlbG9hZF9jbWRzPSRsdF9yZWxvYWRfY21kcworCisjIEhvdyB0byBwYXNzIGEgbGlua2VyIGZsYWcgdGhyb3VnaCB0aGUgY29tcGlsZXIuCit3bD0kbHRfbHRfcHJvZ19jb21waWxlcl93bF9DWFgKKworIyBPYmplY3QgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICJvIikuCitvYmpleHQ9IiRhY19vYmpleHQiCisKKyMgT2xkIGFyY2hpdmUgc3VmZml4IChub3JtYWxseSAiYSIpLgorbGliZXh0PSIkbGliZXh0IgorCisjIFNoYXJlZCBsaWJyYXJ5IHN1ZmZpeCAobm9ybWFsbHkgIi5zbyIpLgorc2hyZXh0X2NtZHM9JyRzaHJleHRfY21kcycKKworIyBFeGVjdXRhYmxlIGZpbGUgc3VmZml4IChub3JtYWxseSAiIikuCitleGVleHQ9IiRleGVleHQiCisKKyMgQWRkaXRpb25hbCBjb21waWxlciBmbGFncyBmb3IgYnVpbGRpbmcgbGlicmFyeSBvYmplY3RzLgorcGljX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfcGljX0NYWAorcGljX21vZGU9JHBpY19tb2RlCisKKyMgV2hhdCBpcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgYSBjb21tYW5kPworbWF4X2NtZF9sZW49JGx0X2N2X3N5c19tYXhfY21kX2xlbgorCisjIERvZXMgY29tcGlsZXIgc2ltdWx0YW5lb3VzbHkgc3VwcG9ydCAtYyBhbmQgLW8gb3B0aW9ucz8KK2NvbXBpbGVyX2Nfbz0kbHRfbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fQ1hYCisKKyMgTXVzdCB3ZSBsb2NrIGZpbGVzIHdoZW4gZG9pbmcgY29tcGlsYXRpb24gPworbmVlZF9sb2Nrcz0kbHRfbmVlZF9sb2NrcworCisjIERvIHdlIG5lZWQgdGhlIGxpYiBwcmVmaXggZm9yIG1vZHVsZXM/CituZWVkX2xpYl9wcmVmaXg9JG5lZWRfbGliX3ByZWZpeAorCisjIERvIHdlIG5lZWQgYSB2ZXJzaW9uIGZvciBsaWJyYXJpZXM/CituZWVkX3ZlcnNpb249JG5lZWRfdmVyc2lvbgorCisjIFdoZXRoZXIgZGxvcGVuIGlzIHN1cHBvcnRlZC4KK2Rsb3Blbl9zdXBwb3J0PSRlbmFibGVfZGxvcGVuCisKKyMgV2hldGhlciBkbG9wZW4gb2YgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkLgorZGxvcGVuX3NlbGY9JGVuYWJsZV9kbG9wZW5fc2VsZgorCisjIFdoZXRoZXIgZGxvcGVuIG9mIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KK2Rsb3Blbl9zZWxmX3N0YXRpYz0kZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYworCisjIENvbXBpbGVyIGZsYWcgdG8gcHJldmVudCBkeW5hbWljIGxpbmtpbmcuCitsaW5rX3N0YXRpY19mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFgKKworIyBDb21waWxlciBmbGFnIHRvIHR1cm4gb2ZmIGJ1aWx0aW4gZnVuY3Rpb25zLgorbm9fYnVpbHRpbl9mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19DWFgKKworIyBDb21waWxlciBmbGFnIHRvIGFsbG93IHJlZmxleGl2ZSBkbG9wZW5zLgorZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPSRsdF9leHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYCisKKyMgQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSBzaGFyZWQgb2JqZWN0cyBkaXJlY3RseSBmcm9tIGFyY2hpdmVzLgord2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JGx0X3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWAorCisjIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgdGhyZWFkLXNhZmUgb2JqZWN0cy4KK3RocmVhZF9zYWZlX2ZsYWdfc3BlYz0kbHRfdGhyZWFkX3NhZmVfZmxhZ19zcGVjX0NYWAorCisjIExpYnJhcnkgdmVyc2lvbmluZyB0eXBlLgordmVyc2lvbl90eXBlPSR2ZXJzaW9uX3R5cGUKKworIyBGb3JtYXQgb2YgbGlicmFyeSBuYW1lIHByZWZpeC4KK2xpYm5hbWVfc3BlYz0kbHRfbGlibmFtZV9zcGVjCisKKyMgTGlzdCBvZiBhcmNoaXZlIG5hbWVzLiAgRmlyc3QgbmFtZSBpcyB0aGUgcmVhbCBvbmUsIHRoZSByZXN0IGFyZSBsaW5rcy4KKyMgVGhlIGxhc3QgbmFtZSBpcyB0aGUgb25lIHRoYXQgdGhlIGxpbmtlciBmaW5kcyB3aXRoIC1sTkFNRS4KK2xpYnJhcnlfbmFtZXNfc3BlYz0kbHRfbGlicmFyeV9uYW1lc19zcGVjCisKKyMgVGhlIGNvZGVkIG5hbWUgb2YgdGhlIGxpYnJhcnksIGlmIGRpZmZlcmVudCBmcm9tIHRoZSByZWFsIG5hbWUuCitzb25hbWVfc3BlYz0kbHRfc29uYW1lX3NwZWMKKworIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGFuIG9sZC1zdHlsZSBhcmNoaXZlLgorUkFOTElCPSRsdF9SQU5MSUIKK29sZF9hcmNoaXZlX2NtZHM9JGx0X29sZF9hcmNoaXZlX2NtZHNfQ1hYCitvbGRfcG9zdGluc3RhbGxfY21kcz0kbHRfb2xkX3Bvc3RpbnN0YWxsX2NtZHMKK29sZF9wb3N0dW5pbnN0YWxsX2NtZHM9JGx0X29sZF9wb3N0dW5pbnN0YWxsX2NtZHMKKworIyBDcmVhdGUgYW4gb2xkLXN0eWxlIGFyY2hpdmUgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgorb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc19DWFgKKworIyBDcmVhdGUgYSB0ZW1wb3Jhcnkgb2xkLXN0eWxlIGFyY2hpdmUgdG8gbGluayBpbnN0ZWFkIG9mIGEgc2hhcmVkIGFyY2hpdmUuCitvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfQ1hYCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhIHNoYXJlZCBhcmNoaXZlLgorYXJjaGl2ZV9jbWRzPSRsdF9hcmNoaXZlX2NtZHNfQ1hYCithcmNoaXZlX2V4cHN5bV9jbWRzPSRsdF9hcmNoaXZlX2V4cHN5bV9jbWRzX0NYWAorcG9zdGluc3RhbGxfY21kcz0kbHRfcG9zdGluc3RhbGxfY21kcworcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9wb3N0dW5pbnN0YWxsX2NtZHMKKworIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGEgbG9hZGFibGUgbW9kdWxlIChhc3N1bWVkIHNhbWUgYXMgYWJvdmUgaWYgZW1wdHkpCittb2R1bGVfY21kcz0kbHRfbW9kdWxlX2NtZHNfQ1hYCittb2R1bGVfZXhwc3ltX2NtZHM9JGx0X21vZHVsZV9leHBzeW1fY21kc19DWFgKKworIyBDb21tYW5kcyB0byBzdHJpcCBsaWJyYXJpZXMuCitvbGRfc3RyaXBsaWI9JGx0X29sZF9zdHJpcGxpYgorc3RyaXBsaWI9JGx0X3N0cmlwbGliCisKKyMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKKyMgc2hhcmVkIGxpYnJhcnkuCitwcmVkZXBfb2JqZWN0cz0kbHRfcHJlZGVwX29iamVjdHNfQ1hYCisKKyMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQorIyBzaGFyZWQgbGlicmFyeS4KK3Bvc3RkZXBfb2JqZWN0cz0kbHRfcG9zdGRlcF9vYmplY3RzX0NYWAorCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCisjIHNoYXJlZCBsaWJyYXJ5LgorcHJlZGVwcz0kbHRfcHJlZGVwc19DWFgKKworIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYWZ0ZXIgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCisjIHNoYXJlZCBsaWJyYXJ5LgorcG9zdGRlcHM9JGx0X3Bvc3RkZXBzX0NYWAorCisjIFRoZSBsaWJyYXJ5IHNlYXJjaCBwYXRoIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgY29tcGlsZXIgd2hlbiBsaW5raW5nCisjIGEgc2hhcmVkIGxpYnJhcnkuCitjb21waWxlcl9saWJfc2VhcmNoX3BhdGg9JGx0X2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9DWFgKKworIyBNZXRob2QgdG8gY2hlY2sgd2hldGhlciBkZXBlbmRlbnQgbGlicmFyaWVzIGFyZSBzaGFyZWQgb2JqZWN0cy4KK2RlcGxpYnNfY2hlY2tfbWV0aG9kPSRsdF9kZXBsaWJzX2NoZWNrX21ldGhvZAorCisjIENvbW1hbmQgdG8gdXNlIHdoZW4gZGVwbGlic19jaGVja19tZXRob2QgPT0gZmlsZV9tYWdpYy4KK2ZpbGVfbWFnaWNfY21kPSRsdF9maWxlX21hZ2ljX2NtZAorCisjIEZsYWcgdGhhdCBhbGxvd3Mgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHVuZGVmaW5lZCBzeW1ib2xzIHRvIGJlIGJ1aWx0LgorYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGx0X2FsbG93X3VuZGVmaW5lZF9mbGFnX0NYWAorCisjIEZsYWcgdGhhdCBmb3JjZXMgbm8gdW5kZWZpbmVkIHN5bWJvbHMuCitub191bmRlZmluZWRfZmxhZz0kbHRfbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYCisKKyMgQ29tbWFuZHMgdXNlZCB0byBmaW5pc2ggYSBsaWJ0b29sIGxpYnJhcnkgaW5zdGFsbGF0aW9uIGluIGEgZGlyZWN0b3J5LgorZmluaXNoX2NtZHM9JGx0X2ZpbmlzaF9jbWRzCisKKyMgU2FtZSBhcyBhYm92ZSwgYnV0IGEgc2luZ2xlIHNjcmlwdCBmcmFnbWVudCB0byBiZSBldmFsZWQgYnV0IG5vdCBzaG93bi4KK2ZpbmlzaF9ldmFsPSRsdF9maW5pc2hfZXZhbAorCisjIFRha2UgdGhlIG91dHB1dCBvZiBubSBhbmQgcHJvZHVjZSBhIGxpc3Rpbmcgb2YgcmF3IHN5bWJvbHMgYW5kIEMgbmFtZXMuCitnbG9iYWxfc3ltYm9sX3BpcGU9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUKKworIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIHByb3BlciBDIGRlY2xhcmF0aW9uCitnbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbAorCisjIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgQyBuYW1lIGFkZHJlc3MgcGFpcgorZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MKKworIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBydW50aW1lIHBhdGggdmFyaWFibGUuCitydW5wYXRoX3Zhcj0kcnVucGF0aF92YXIKKworIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBwYXRoIHZhcmlhYmxlLgorc2hsaWJwYXRoX3Zhcj0kc2hsaWJwYXRoX3ZhcgorCisjIElzIHNobGlicGF0aCBzZWFyY2hlZCBiZWZvcmUgdGhlIGhhcmQtY29kZWQgbGlicmFyeSBzZWFyY2ggcGF0aD8KK3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD0kc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoCisKKyMgSG93IHRvIGhhcmRjb2RlIGEgc2hhcmVkIGxpYnJhcnkgcGF0aCBpbnRvIGFuIGV4ZWN1dGFibGUuCitoYXJkY29kZV9hY3Rpb249JGhhcmRjb2RlX2FjdGlvbl9DWFgKKworIyBXaGV0aGVyIHdlIHNob3VsZCBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gbGlicmFyaWVzLgoraGFyZGNvZGVfaW50b19saWJzPSRoYXJkY29kZV9pbnRvX2xpYnMKKworIyBGbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8gYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuCisjIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcyBub3QgZXhpc3QuCitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSRsdF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWAorCisjIElmIGxkIGlzIHVzZWQgd2hlbiBsaW5raW5nLCBmbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8KKyMgYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcworIyBub3QgZXhpc3QuCitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkPSRsdF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0NYWAorCisjIFdoZXRoZXIgd2UgbmVlZCBhIHNpbmdsZSAtcnBhdGggZmxhZyB3aXRoIGEgc2VwYXJhdGVkIGFyZ3VtZW50LgoraGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0kbHRfaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFgKKworIyBTZXQgdG8geWVzIGlmIHVzaW5nIERJUi9saWJOQU1FJHtzaGFyZWRfZXh0fSBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCisjIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9kaXJlY3Q9JGhhcmRjb2RlX2RpcmVjdF9DWFgKKworIyBTZXQgdG8geWVzIGlmIHVzaW5nIHRoZSAtTERJUiBmbGFnIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKKyMgcmVzdWx0aW5nIGJpbmFyeS4KK2hhcmRjb2RlX21pbnVzX0w9JGhhcmRjb2RlX21pbnVzX0xfQ1hYCisKKyMgU2V0IHRvIHllcyBpZiB1c2luZyBTSExJQlBBVEhfVkFSPURJUiBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8KKyMgdGhlIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9zaGxpYnBhdGhfdmFyPSRoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWAorCisjIFNldCB0byB5ZXMgaWYgYnVpbGRpbmcgYSBzaGFyZWQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGhhcmRjb2RlcyBESVIgaW50byB0aGUgbGlicmFyeQorIyBhbmQgYWxsIHN1YnNlcXVlbnQgbGlicmFyaWVzIGFuZCBleGVjdXRhYmxlcyBsaW5rZWQgYWdhaW5zdCBpdC4KK2hhcmRjb2RlX2F1dG9tYXRpYz0kaGFyZGNvZGVfYXV0b21hdGljX0NYWAorCisjIFZhcmlhYmxlcyB3aG9zZSB2YWx1ZXMgc2hvdWxkIGJlIHNhdmVkIGluIGxpYnRvb2wgd3JhcHBlciBzY3JpcHRzIGFuZAorIyByZXN0b3JlZCBhdCByZWxpbmsgdGltZS4KK3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsiCisKKyMgV2hldGhlciBsaWJ0b29sIG11c3QgbGluayBhIHByb2dyYW0gYWdhaW5zdCBhbGwgaXRzIGRlcGVuZGVuY3kgbGlicmFyaWVzLgorbGlua19hbGxfZGVwbGlicz0kbGlua19hbGxfZGVwbGlic19DWFgKKworIyBDb21waWxlLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKK3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCisKKyMgUnVuLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKK3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRsdF9zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYworCisjIEZpeCB0aGUgc2hlbGwgdmFyaWFibGUgXCRzcmNmaWxlIGZvciB0aGUgY29tcGlsZXIuCitmaXhfc3JjZmlsZV9wYXRoPSIkZml4X3NyY2ZpbGVfcGF0aF9DWFgiCisKKyMgU2V0IHRvIHllcyBpZiBleHBvcnRlZCBzeW1ib2xzIGFyZSByZXF1aXJlZC4KK2Fsd2F5c19leHBvcnRfc3ltYm9scz0kYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0NYWAorCisjIFRoZSBjb21tYW5kcyB0byBsaXN0IGV4cG9ydGVkIHN5bWJvbHMuCitleHBvcnRfc3ltYm9sc19jbWRzPSRsdF9leHBvcnRfc3ltYm9sc19jbWRzX0NYWAorCisjIFRoZSBjb21tYW5kcyB0byBleHRyYWN0IHRoZSBleHBvcnRlZCBzeW1ib2wgbGlzdCBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCitleHRyYWN0X2V4cHN5bXNfY21kcz0kbHRfZXh0cmFjdF9leHBzeW1zX2NtZHMKKworIyBTeW1ib2xzIHRoYXQgc2hvdWxkIG5vdCBiZSBsaXN0ZWQgaW4gdGhlIHByZWxvYWRlZCBzeW1ib2xzLgorZXhjbHVkZV9leHBzeW1zPSRsdF9leGNsdWRlX2V4cHN5bXNfQ1hYCisKKyMgU3ltYm9scyB0aGF0IG11c3QgYWx3YXlzIGJlIGV4cG9ydGVkLgoraW5jbHVkZV9leHBzeW1zPSRsdF9pbmNsdWRlX2V4cHN5bXNfQ1hYCisKKyMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lCisKK19fRU9GX18KKworCitlbHNlCisgICMgSWYgdGhlcmUgaXMgbm8gTWFrZWZpbGUgeWV0LCB3ZSByZWx5IG9uIGEgbWFrZSBydWxlIHRvIGV4ZWN1dGUKKyAgIyBgY29uZmlnLnN0YXR1cyAtLXJlY2hlY2snIHRvIHJlcnVuIHRoZXNlIHRlc3RzIGFuZCBjcmVhdGUgdGhlCisgICMgbGlidG9vbCBzY3JpcHQgdGhlbi4KKyAgbHRtYWluX2luPWBlY2hvICRsdG1haW4gfCBzZWQgLWUgJ3MvXC5zaCQvLmluLydgCisgIGlmIHRlc3QgLWYgIiRsdG1haW5faW4iOyB0aGVuCisgICAgdGVzdCAtZiBNYWtlZmlsZSAmJiBtYWtlICIkbHRtYWluIgorICBmaQorZmkKKworCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKK0NDPSRsdF9zYXZlX0NDCitMRENYWD0kTEQKK0xEPSRsdF9zYXZlX0xECitHQ0M9JGx0X3NhdmVfR0NDCit3aXRoX2dudV9sZGN4eD0kd2l0aF9nbnVfbGQKK3dpdGhfZ251X2xkPSRsdF9zYXZlX3dpdGhfZ251X2xkCitsdF9jdl9wYXRoX0xEQ1hYPSRsdF9jdl9wYXRoX0xECitsdF9jdl9wYXRoX0xEPSRsdF9zYXZlX3BhdGhfTEQKK2x0X2N2X3Byb2dfZ251X2xkY3h4PSRsdF9jdl9wcm9nX2dudV9sZAorbHRfY3ZfcHJvZ19nbnVfbGQ9JGx0X3NhdmVfd2l0aF9nbnVfbGQKKworCWVsc2UKKwkgIHRhZ25hbWU9IiIKKwlmaQorCTs7CisKKyAgICAgIEY3NykKKwlpZiB0ZXN0IC1uICIkRjc3IiAmJiB0ZXN0ICJYJEY3NyIgIT0gIlhubyI7IHRoZW4KKworYWNfZXh0PWYKK2FjX2NvbXBpbGU9JyRGNzcgLWMgJEZGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRGNzcgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRGRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2Y3N19jb21waWxlcl9nbnUKKworCithcmNoaXZlX2NtZHNfbmVlZF9sY19GNzc9bm8KK2FsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz0KK2Fsd2F5c19leHBvcnRfc3ltYm9sc19GNzc9bm8KK2FyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PQorZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0Y3Nz0KK2hhcmRjb2RlX2RpcmVjdF9GNzc9bm8KK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PQoraGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9GNzc9CitoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0Y3Nz0KK2hhcmRjb2RlX21pbnVzX0xfRjc3PW5vCitoYXJkY29kZV9hdXRvbWF0aWNfRjc3PW5vCittb2R1bGVfY21kc19GNzc9Cittb2R1bGVfZXhwc3ltX2NtZHNfRjc3PQorbGlua19hbGxfZGVwbGlic19GNzc9dW5rbm93bgorb2xkX2FyY2hpdmVfY21kc19GNzc9JG9sZF9hcmNoaXZlX2NtZHMKK25vX3VuZGVmaW5lZF9mbGFnX0Y3Nz0KK3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0Y3Nz0KK2VuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfRjc3PW5vCisKKyMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBmNzcgdGVzdCBzb3VyY2VzLgorYWNfZXh0PWYKKworIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIGY3NyB0ZXN0IHNvdXJjZXMuCitvYmpleHQ9bworb2JqZXh0X0Y3Nz0kb2JqZXh0CisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCitsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9IiAgICAgIHN1YnJvdXRpbmUgdFxuICAgICAgcmV0dXJuXG4gICAgICBlbmRcbiIKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKK2x0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0iICAgICAgcHJvZ3JhbSB0XG4gICAgICBlbmRcbiIKKworIyBsdG1haW4gb25seSB1c2VzICRDQyBmb3IgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHNvIG1ha2Ugc3VyZSAkQ0MgaXMgc2V0LgorCisjIElmIG5vIEMgY29tcGlsZXIgd2FzIHNwZWNpZmllZCwgdXNlIENDLgorTFRDQz0ke0xUQ0MtIiRDQyJ9CisKKyMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCitjb21waWxlcj0kQ0MKKworCisjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorbHRfc2F2ZV9DQz0iJENDIgorQ0M9JHtGNzctImY3NyJ9Citjb21waWxlcj0kQ0MKK2NvbXBpbGVyX0Y3Nz0kQ0MKK2NjX2Jhc2VuYW1lPWAkZWNobyBYIiRjb21waWxlciIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIGxpYnRvb2wgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiBsaWJ0b29sIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuLi4gIiA+JjY7IH0KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkY2FuX2J1aWxkX3NoYXJlZCIgPiY1CiskYXNfZWNobyAiJGNhbl9idWlsZF9zaGFyZWQiID4mNjsgfQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMuLi4gIiA+JjY7IH0KK3Rlc3QgIiRjYW5fYnVpbGRfc2hhcmVkIiA9ICJubyIgJiYgZW5hYmxlX3NoYXJlZD1ubworCisjIE9uIEFJWCwgc2hhcmVkIGxpYnJhcmllcyBhbmQgc3RhdGljIGxpYnJhcmllcyB1c2UgdGhlIHNhbWUgbmFtZXNwYWNlLCBhbmQKKyMgYXJlIGFsbCBidWlsdCBmcm9tIFBJQy4KK2Nhc2UgIiRob3N0X29zIiBpbgorYWl4MyopCisgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCisgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgICAgYXJjaGl2ZV9jbWRzPSIkYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkbGliIgorICAgIHBvc3RpbnN0YWxsX2NtZHM9JyRSQU5MSUIgJGxpYicKKyAgZmkKKyAgOzsKK2FpeDQqIHwgYWl4NSopCisgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCisgIDs7Citlc2FjCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGVuYWJsZV9zaGFyZWQiID4mNQorJGFzX2VjaG8gIiRlbmFibGVfc2hhcmVkIiA+JjY7IH0KKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzLi4uICIgPiY2OyB9CisjIE1ha2Ugc3VyZSBlaXRoZXIgZW5hYmxlX3NoYXJlZCBvciBlbmFibGVfc3RhdGljIGlzIHllcy4KK3Rlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyB8fCBlbmFibGVfc3RhdGljPXllcworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRlbmFibGVfc3RhdGljIiA+JjUKKyRhc19lY2hvICIkZW5hYmxlX3N0YXRpYyIgPiY2OyB9CisKK3Rlc3QgIiRsZF9zaGxpYnNfRjc3IiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KKworR0NDX0Y3Nz0iJEc3NyIKK0xEX0Y3Nz0iJExEIgorCitsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3Nz0KK2x0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0KK2x0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0KKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGNvbXBpbGVyIG9wdGlvbiB0byBwcm9kdWNlIFBJQyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGNvbXBpbGVyIG9wdGlvbiB0byBwcm9kdWNlIFBJQy4uLiAiID4mNjsgfQorCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1XbCwnCisgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3PSctc3RhdGljJworCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgYWl4KikKKyAgICAgICMgQWxsIEFJWCBjb2RlIGlzIFBJQy4KKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKKwlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1Cc3RhdGljJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBhbWlnYW9zKikKKyAgICAgICMgRklYTUU6IHdlIG5lZWQgYXQgbGVhc3QgNjgwMjAgY29kZSB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLCBidXQKKyAgICAgICMgYWRkaW5nIHRoZSBgLW02ODAyMCcgZmxhZyB0byBHQ0MgcHJldmVudHMgYnVpbGRpbmcgYW55dGhpbmcgYmV0dGVyLAorICAgICAgIyBsaWtlIGAtbTY4MDQwJy4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLW02ODAyMCAtcmVzaWRlbnQzMiAtbWFsd2F5cy1yZXN0b3JlLWE0JworICAgICAgOzsKKworICAgIGJlb3MqIHwgY3lnd2luKiB8IGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCogfCBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgdGhlc2UgT1Nlcy4KKyAgICAgIDs7CisKKyAgICBtaW5ndyogfCBwdzMyKiB8IG9zMiopCisgICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCisgICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctRERMTF9FWFBPUlQnCisgICAgICA7OworCisgICAgZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KKyAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLWZuby1jb21tb24nCisgICAgICA7OworCisgICAgbXNkb3NkamdwcCopCisgICAgICAjIEp1c3QgYmVjYXVzZSB3ZSB1c2UgR0NDIGRvZXNuJ3QgbWVhbiB3ZSBzdWRkZW5seSBnZXQgc2hhcmVkIGxpYnJhcmllcworICAgICAgIyBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCB0aGVtLgorICAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkX0Y3Nz1ubworICAgICAgZW5hYmxlX3NoYXJlZD1ubworICAgICAgOzsKKworICAgIHN5c3Y0Kk1QKikKKyAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KKwlsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9LUtjb25mb3JtX3BpYworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBocHV4KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBJQTY0IEhQLVVYIGFuZCA2NC1iaXQgSFAtVVgsIGJ1dAorICAgICAgIyBub3QgZm9yIFBBIEhQLVVYLgorICAgICAgY2FzZSAiJGhvc3RfY3B1IiBpbgorICAgICAgaHBwYSo2NCp8aWE2NCopCisJIyArWiB0aGUgZGVmYXVsdAorCTs7CisgICAgICAqKQorCWx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLWZQSUMnCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctZlBJQycKKyAgICAgIDs7CisgICAgZXNhYworICBlbHNlCisgICAgIyBQT1JUTUUgQ2hlY2sgZm9yIGZsYWcgdG8gcGFzcyBsaW5rZXIgZmxhZ3MgdGhyb3VnaCB0aGUgc3lzdGVtIGNvbXBpbGVyLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1XbCwnCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3PSctQnN0YXRpYycKKyAgICAgIGVsc2UKKwlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1ibnNvIC1iSTovbGliL3N5c2NhbGxzLmV4cCcKKyAgICAgIGZpCisgICAgICA7OworCisgICAgbWluZ3cqIHwgcHczMiogfCBvczIqKQorICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZworICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLURETExfRVhQT1JUJworICAgICAgOzsKKworICAgIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1XbCwnCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSUE2NCBIUC1VWCBhbmQgNjQtYml0IEhQLVVYLCBidXQKKyAgICAgICMgbm90IGZvciBQQSBIUC1VWC4KKyAgICAgIGNhc2UgIiRob3N0X2NwdSIgaW4KKyAgICAgIGhwcGEqNjQqfGlhNjQqKQorCSMgK1ogdGhlIGRlZmF1bHQKKwk7OworICAgICAgKikKKwlsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9JytaJworCTs7CisgICAgICBlc2FjCisgICAgICAjIElzIHRoZXJlIGEgYmV0dGVyIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIHRoYXQgd29ya3Mgd2l0aCB0aGUgYnVuZGxlZCBDQz8KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nJHt3bH0tYSAke3dsfWFyY2hpdmUnCisgICAgICA7OworCisgICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfRjc3PSctV2wsJworICAgICAgIyBQSUMgKHdpdGggLUtQSUMpIGlzIHRoZSBkZWZhdWx0LgorICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3PSctbm9uX3NoYXJlZCcKKyAgICAgIDs7CisKKyAgICBuZXdzb3M2KQorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctS1BJQycKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgbGludXgqKQorICAgICAgY2FzZSAkQ0MgaW4KKyAgICAgIGljYyogfCBlY2MqKQorCWx0X3Byb2dfY29tcGlsZXJfd2xfRjc3PSctV2wsJworCWx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLUtQSUMnCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3PSctc3RhdGljJworICAgICAgICA7OworICAgICAgY2NjKikKKyAgICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1XbCwnCisgICAgICAgICMgQWxsIEFscGhhIGNvZGUgaXMgUElDLgorICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1ub25fc2hhcmVkJworICAgICAgICA7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfRjc3PSctV2wsJworICAgICAgIyBBbGwgT1NGLzEgY29kZSBpcyBQSUMuCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1ub25fc2hhcmVkJworICAgICAgOzsKKworICAgIHNjbzMuMnY1KikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLUtwaWMnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1kbicKKyAgICAgIDs7CisKKyAgICBzb2xhcmlzKikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfRjc3PSctV2wsJworICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctS1BJQycKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgc3Vub3M0KikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfRjc3PSctUW9wdGlvbiBsZCAnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9Jy1QSUMnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIHN5c3Y0IHwgc3lzdjQuMnV3MiogfCBzeXN2NC4zKiB8IHN5c3Y1KikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfRjc3PSctV2wsJworICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctS1BJQycKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgc3lzdjQqTVAqKQorICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgorCWx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLUtjb25mb3JtX3BpYycKKwlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1Cc3RhdGljJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICB1dHM0KikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLXBpYycKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgKikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZF9GNzc9bm8KKyAgICAgIDs7CisgICAgZXNhYworICBmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3NyIgPiY1CiskYXNfZWNobyAiJGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3NyIgPiY2OyB9CisKKyMKKyMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBQSUMgZmxhZyBhY3R1YWxseSB3b3Jrcy4KKyMKK2lmIHRlc3QgLW4gIiRsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzciOyB0aGVuCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzcgd29ya3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzcgd29ya3MuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7bHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfRjc3K3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfRjc3PW5vCisgIGFjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorICAgcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGx0X2NvbXBpbGVyX2ZsYWc9IiRsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzciCisgICAjIEluc2VydCB0aGUgb3B0aW9uIGVpdGhlciAoMSkgYWZ0ZXIgdGhlIGxhc3QgKkZMQUdTIHZhcmlhYmxlLCBvcgorICAgIyAoMikgYmVmb3JlIGEgd29yZCBjb250YWluaW5nICJjb25mdGVzdC4iLCBvciAoMykgYXQgdGhlIGVuZC4KKyAgICMgTm90ZSB0aGF0ICRhY19jb21waWxlIGl0c2VsZiBkb2VzIG5vdCBjb250YWluIGJhY2tzbGFzaGVzIGFuZCBiZWdpbnMKKyAgICMgd2l0aCBhIGRvbGxhciBzaWduIChub3QgYSBoeXBoZW4pLCBzbyB0aGUgZWNobyBzaG91bGQgd29yayBjb3JyZWN0bHkuCisgICAjIFRoZSBvcHRpb24gaXMgcmVmZXJlbmNlZCB2aWEgYSB2YXJpYWJsZSB0byBhdm9pZCBjb25mdXNpbmcgc2VkLgorICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCisgICAtZSAnczouKkZMQUdTfT8gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCisgICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCisgICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAorICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOjE0Mzg2OiAkbHRfY29tcGlsZVwiIiA+JjUpCisgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+Y29uZnRlc3QuZXJyKQorICAgYWNfc3RhdHVzPSQ/CisgICBjYXQgY29uZnRlc3QuZXJyID4mNQorICAgZWNobyAiJGFzX21lOjE0MzkwOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgIiRhY19vdXRmaWxlIjsgdGhlbgorICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKKyAgICAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0Y3Nz15ZXMKKyAgICAgZmkKKyAgIGZpCisgICAkcm0gY29uZnRlc3QqCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0Y3NyIgPiY1CiskYXNfZWNobyAiJGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0Y3NyIgPiY2OyB9CisKK2lmIHRlc3QgeCIkbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfRjc3IiA9IHh5ZXM7IHRoZW4KKyAgICBjYXNlICRsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzcgaW4KKyAgICAgIiIgfCAiICIqKSA7OworICAgICAqKSBsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9IiAkbHRfcHJvZ19jb21waWxlcl9waWNfRjc3IiA7OworICAgICBlc2FjCitlbHNlCisgICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PQorICAgICBsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWRfRjc3PW5vCitmaQorCitmaQorY2FzZSAiJGhvc3Rfb3MiIGluCisgICMgRm9yIHBsYXRmb3JtcyB3aGljaCBkbyBub3Qgc3VwcG9ydCBQSUMsIC1EUElDIGlzIG1lYW5pbmdsZXNzOgorICAqZGpncHAqKQorICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0KKyAgICA7OworICAqKQorICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0iJGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3NyIKKyAgICA7OworZXNhYworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19GNzcrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19GNzc9bm8KKyAgICRybSAtciBjb25mdGVzdCAyPi9kZXYvbnVsbAorICAgbWtkaXIgY29uZnRlc3QKKyAgIGNkIGNvbmZ0ZXN0CisgICBta2RpciBvdXQKKyAgIHByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisKKyAgIGx0X2NvbXBpbGVyX2ZsYWc9Ii1vIG91dC9jb25mdGVzdDIuJGFjX29iamV4dCIKKyAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCisgICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgorICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucworICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KKyAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAorICAgLWUgJ3M6LipGTEFHU30/IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAorICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZToxNDQ0NjogJGx0X2NvbXBpbGVcIiIgPiY1KQorICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPm91dC9jb25mdGVzdC5lcnIpCisgICBhY19zdGF0dXM9JD8KKyAgIGNhdCBvdXQvY29uZnRlc3QuZXJyID4mNQorICAgZWNobyAiJGFzX21lOjE0NDUwOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0CisgICB0aGVuCisgICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncworICAgICBpZiB0ZXN0ICEgLXMgb3V0L2NvbmZ0ZXN0LmVycjsgdGhlbgorICAgICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0Y3Nz15ZXMKKyAgICAgZmkKKyAgIGZpCisgICBjaG1vZCB1K3cgLgorICAgJHJtIGNvbmZ0ZXN0KgorICAgIyBTR0kgQysrIGNvbXBpbGVyIHdpbGwgY3JlYXRlIGRpcmVjdG9yeSBvdXQvaWlfZmlsZXMvIGZvcgorICAgIyB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uCisgICB0ZXN0IC1kIG91dC9paV9maWxlcyAmJiAkcm0gb3V0L2lpX2ZpbGVzLyogJiYgcm1kaXIgb3V0L2lpX2ZpbGVzCisgICAkcm0gb3V0LyogJiYgcm1kaXIgb3V0CisgICBjZCAuLgorICAgcm1kaXIgY29uZnRlc3QKKyAgICRybSBjb25mdGVzdCoKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fRjc3IiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fRjc3IiA+JjY7IH0KKworCitoYXJkX2xpbmtzPSJub3R0ZXN0ZWQiCitpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fRjc3IiA9IG5vICYmIHRlc3QgIiRuZWVkX2xvY2tzIiAhPSBubzsgdGhlbgorICAjIGRvIG5vdCBvdmVyd3JpdGUgdGhlIHZhbHVlIG9mIG5lZWRfbG9ja3MgcHJvdmlkZWQgYnkgdGhlIHVzZXIKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiB3ZSBjYW4gbG9jayB3aXRoIGhhcmQgbGlua3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgd2UgY2FuIGxvY2sgd2l0aCBoYXJkIGxpbmtzLi4uICIgPiY2OyB9CisgIGhhcmRfbGlua3M9eWVzCisgICRybSBjb25mdGVzdCoKKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KKyAgdG91Y2ggY29uZnRlc3QuYQorICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4mNSB8fCBoYXJkX2xpbmtzPW5vCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkaGFyZF9saW5rcyIgPiY1CiskYXNfZWNobyAiJGhhcmRfbGlua3MiID4mNjsgfQorICBpZiB0ZXN0ICIkaGFyZF9saW5rcyIgPSBubzsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogXGAkQ0MnIGRvZXMgbm90IHN1cHBvcnQgXGAtYyAtbycsIHNvIFxgbWFrZSAtaicgbWF5IGJlIHVuc2FmZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBcYCRDQycgZG9lcyBub3Qgc3VwcG9ydCBcYC1jIC1vJywgc28gXGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlIiA+JjI7fQorICAgIG5lZWRfbG9ja3M9d2FybgorICBmaQorZWxzZQorICBuZWVkX2xvY2tzPW5vCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRoZSAkY29tcGlsZXIgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuLi4gIiA+JjY7IH0KKworICBydW5wYXRoX3Zhcj0KKyAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PQorICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0Y3Nz1ubworICBhcmNoaXZlX2NtZHNfRjc3PQorICBhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0KKyAgb2xkX2FyY2hpdmVfRnJvbV9uZXdfY21kc19GNzc9CisgIG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzX0Y3Nz0KKyAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0Y3Nz0KKyAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfRjc3PQorICB0aHJlYWRfc2FmZV9mbGFnX3NwZWNfRjc3PQorICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0KKyAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9GNzc9CisgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfRjc3PQorICBoYXJkY29kZV9kaXJlY3RfRjc3PW5vCisgIGhhcmRjb2RlX21pbnVzX0xfRjc3PW5vCisgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PXVuc3VwcG9ydGVkCisgIGxpbmtfYWxsX2RlcGxpYnNfRjc3PXVua25vd24KKyAgaGFyZGNvZGVfYXV0b21hdGljX0Y3Nz1ubworICBtb2R1bGVfY21kc19GNzc9CisgIG1vZHVsZV9leHBzeW1fY21kc19GNzc9CisgIGFsd2F5c19leHBvcnRfc3ltYm9sc19GNzc9bm8KKyAgZXhwb3J0X3N5bWJvbHNfY21kc19GNzc9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAnXCcncy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKKyAgIyBpbmNsdWRlX2V4cHN5bXMgc2hvdWxkIGJlIGEgbGlzdCBvZiBzcGFjZS1zZXBhcmF0ZWQgc3ltYm9scyB0byBiZSAqYWx3YXlzKgorICAjIGluY2x1ZGVkIGluIHRoZSBzeW1ib2wgbGlzdAorICBpbmNsdWRlX2V4cHN5bXNfRjc3PQorICAjIGV4Y2x1ZGVfZXhwc3ltcyBjYW4gYmUgYW4gZXh0ZW5kZWQgcmVnZXhwIG9mIHN5bWJvbHMgdG8gZXhjbHVkZQorICAjIGl0IHdpbGwgYmUgd3JhcHBlZCBieSBgICgnIGFuZCBgKSQnLCBzbyBvbmUgbXVzdCBub3QgbWF0Y2ggYmVnaW5uaW5nIG9yCisgICMgZW5kIG9mIGxpbmUuICBFeGFtcGxlOiBgYXxiY3wuKmQuKicgd2lsbCBleGNsdWRlIHRoZSBzeW1ib2xzIGBhJyBhbmQgYGJjJywKKyAgIyBhcyB3ZWxsIGFzIGFueSBzeW1ib2wgdGhhdCBjb250YWlucyBgZCcuCisgIGV4Y2x1ZGVfZXhwc3ltc19GNzc9Il9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIKKyAgIyBBbHRob3VnaCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gaXMgYSB2YWxpZCBzeW1ib2wgQyBuYW1lLCBtb3N0IGEub3V0CisgICMgcGxhdGZvcm1zIChhYil1c2UgaXQgaW4gUElDIGNvZGUsIGJ1dCB0aGVpciBsaW5rZXJzIGdldCBjb25mdXNlZCBpZgorICAjIHRoZSBzeW1ib2wgaXMgZXhwbGljaXRseSByZWZlcmVuY2VkLiAgU2luY2UgcG9ydGFibGUgY29kZSBjYW5ub3QKKyAgIyByZWx5IG9uIHRoaXMgc3ltYm9sIG5hbWUsIGl0J3MgcHJvYmFibHkgZmluZSB0byBuZXZlciBpbmNsdWRlIGl0IGluCisgICMgcHJlbG9hZGVkIHN5bWJvbCB0YWJsZXMuCisgIGV4dHJhY3RfZXhwc3ltc19jbWRzPQorCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQorICAgICMgRklYTUU6IHRoZSBNU1ZDKysgcG9ydCBoYXNuJ3QgYmVlbiB0ZXN0ZWQgaW4gYSBsb29vb25nIHRpbWUKKyAgICAjIFdoZW4gbm90IHVzaW5nIGdjYywgd2UgY3VycmVudGx5IGFzc3VtZSB0aGF0IHdlIGFyZSB1c2luZworICAgICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCisgICAgaWYgdGVzdCAiJEdDQyIgIT0geWVzOyB0aGVuCisgICAgICB3aXRoX2dudV9sZD1ubworICAgIGZpCisgICAgOzsKKyAgb3BlbmJzZCopCisgICAgd2l0aF9nbnVfbGQ9bm8KKyAgICA7OworICBlc2FjCisKKyAgbGRfc2hsaWJzX0Y3Nz15ZXMKKyAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgICMgSWYgYXJjaGl2ZV9jbWRzIHJ1bnMgTEQsIG5vdCBDQywgd2xhcmMgc2hvdWxkIGJlIGVtcHR5CisgICAgd2xhcmM9JyR7d2x9JworCisgICAgIyBTZWUgaWYgR05VIGxkIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGFpeDMqIHwgYWl4NCogfCBhaXg1KikKKyAgICAgICMgT24gQUlYL1BQQywgdGhlIEdOVSBsaW5rZXIgaXMgdmVyeSBicm9rZW4KKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NDsgdGhlbgorCWxkX3NobGlic19GNzc9bm8KKwljYXQgPDxFT0YgMT4mMgorCisqKiogV2FybmluZzogdGhlIEdOVSBsaW5rZXIsIGF0IGxlYXN0IHVwIHRvIHJlbGVhc2UgMi45LjEsIGlzIHJlcG9ydGVkCisqKiogdG8gYmUgdW5hYmxlIHRvIHJlbGlhYmx5IGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIEFJWC4KKyoqKiBUaGVyZWZvcmUsIGxpYnRvb2wgaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIElmIHlvdQorKioqIHJlYWxseSBjYXJlIGZvciBzaGFyZWQgbGlicmFyaWVzLCB5b3UgbWF5IHdhbnQgdG8gbW9kaWZ5IHlvdXIgUEFUSAorKioqIHNvIHRoYXQgYSBub24tR05VIGxpbmtlciBpcyBmb3VuZCwgYW5kIHRoZW4gcmVzdGFydC4KKworRU9GCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFtaWdhb3MqKQorICAgICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJHJtICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTkFNRSAkbGlibmFtZSIgPiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIExJQlJBUllfSUQgMSIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBWRVJTSU9OICRtYWpvciIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBSRVZJU0lPTiAkcmV2aXNpb24iID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEFSICRBUl9GTEFHUyAkbGliICRsaWJvYmpzfiRSQU5MSUIgJGxpYn4oY2QgJG91dHB1dF9vYmpkaXIgJiYgYTJpeGxpYnJhcnkgLTMyKScKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSctTCRsaWJkaXInCisgICAgICBoYXJkY29kZV9taW51c19MX0Y3Nz15ZXMKKworICAgICAgIyBTYW11ZWwgQS4gRmFsdm8gSUkgPGtjNXRqYUBkb2xwaGluLm9wZW5wcm9qZWN0cy5uZXQ+IHJlcG9ydHMKKyAgICAgICMgdGhhdCB0aGUgc2VtYW50aWNzIG9mIGR5bmFtaWMgbGlicmFyaWVzIG9uIEFtaWdhT1MsIGF0IGxlYXN0IHVwCisgICAgICAjIHRvIHZlcnNpb24gNCwgaXMgdG8gc2hhcmUgZGF0YSBhbW9uZyBtdWx0aXBsZSBwcm9ncmFtcyBsaW5rZWQKKyAgICAgICMgd2l0aCB0aGUgc2FtZSBkeW5hbWljIGxpYnJhcnkuICBTaW5jZSB0aGlzIGRvZXNuJ3QgbWF0Y2ggdGhlCisgICAgICAjIGJlaGF2aW9yIG9mIHNoYXJlZCBsaWJyYXJpZXMgb24gb3RoZXIgcGxhdGZvcm1zLCB3ZSBjYW4ndCB1c2UKKyAgICAgICMgdGhlbS4KKyAgICAgIGxkX3NobGlic19GNzc9bm8KKyAgICAgIDs7CisKKyAgICBiZW9zKikKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCWFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz11bnN1cHBvcnRlZAorCSMgSm9zZXBoIEJlY2tlbmJhY2ggPGpyYjNAYmVzdC5jb20+IHNheXMgc29tZSByZWxlYXNlcyBvZiBnY2MKKwkjIHN1cHBvcnQgLS11bmRlZmluZWQuICBUaGlzIGRlc2VydmVzIHNvbWUgaW52ZXN0aWdhdGlvbi4gIEZJWE1FCisJYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1ub3N0YXJ0ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgICAgZWxzZQorCWxkX3NobGlic19GNzc9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQorICAgICAgIyBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsIEY3NykgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsCisgICAgICAjIGFzIHRoZXJlIGlzIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9Jy1MJGxpYmRpcicKKyAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz11bnN1cHBvcnRlZAorICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0Y3Nz1ubworICAgICAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19GNzc9eWVzCisgICAgICBleHBvcnRfc3ltYm9sc19jbWRzX0Y3Nz0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEIC1lICdcJycvXltCQ0RHU10gL3MvLiogXChbXiBdKlwpL1wxIERBVEEvJ1wnJyB8ICRTRUQgLWUgJ1wnJy9eW0FJVFddIC9zLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworCisgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICdhdXRvLWltcG9ydCcgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWltYWdlLWJhc2U9MHgxMDAwMDAwMCAke3dsfS0tb3V0LWltcGxpYiwkbGliJworCSMgSWYgdGhlIGV4cG9ydC1zeW1ib2xzIGZpbGUgYWxyZWFkeSBpcyBhIC5kZWYgZmlsZSAoMXN0IGxpbmUKKwkjIGlzIEVYUE9SVFMpLCB1c2UgaXQgYXMgaXM7IG90aGVyd2lzZSwgcHJlcGVuZC4uLgorCWFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSdpZiB0ZXN0ICJ4YCRTRUQgMXEgJGV4cG9ydF9zeW1ib2xzYCIgPSB4RVhQT1JUUzsgdGhlbgorCSAgY3AgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCWVsc2UKKwkgIGVjaG8gRVhQT1JUUyA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCSAgY2F0ICRleHBvcnRfc3ltYm9scyA+PiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKwlmaX4KKwkkQ0MgLXNoYXJlZCAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0taW1hZ2UtYmFzZT0weDEwMDAwMDAwICAke3dsfS0tb3V0LWltcGxpYiwkbGliJworICAgICAgZWxzZQorCWxkX3NobGlicz1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBuZXRic2QqIHwga25ldGJzZCotZ251KQorICAgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgorCWFyY2hpdmVfY21kc19GNzc9JyRMRCAtQnNoYXJlYWJsZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1vICRsaWInCisJd2xhcmM9CisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzb2xhcmlzKiB8IHN5c3Y1KikKKyAgICAgIGlmICRMRCAtdiAyPiYxIHwgZ3JlcCAnQkZEIDJcLjgnID4gL2Rldi9udWxsOyB0aGVuCisJbGRfc2hsaWJzX0Y3Nz1ubworCWNhdCA8PEVPRiAxPiYyCisKKyoqKiBXYXJuaW5nOiBUaGUgcmVsZWFzZXMgMi44Liogb2YgdGhlIEdOVSBsaW5rZXIgY2Fubm90IHJlbGlhYmx5CisqKiogY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gU29sYXJpcyBzeXN0ZW1zLiAgVGhlcmVmb3JlLCBsaWJ0b29sCisqKiogaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIFdlIHVyZ2UgeW91IHRvIHVwZ3JhZGUgR05VCisqKiogYmludXRpbHMgdG8gcmVsZWFzZSAyLjkuMSBvciBuZXdlci4gIEFub3RoZXIgb3B0aW9uIGlzIHRvIG1vZGlmeQorKioqIHlvdXIgUEFUSCBvciBjb21waWxlciBjb25maWd1cmF0aW9uIHNvIHRoYXQgdGhlIG5hdGl2ZSBsaW5rZXIgaXMKKyoqKiB1c2VkLCBhbmQgdGhlbiByZXN0YXJ0LgorCitFT0YKKyAgICAgIGVsaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisJYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZWxzZQorCWxkX3NobGlic19GNzc9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3Vub3M0KikKKyAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICB3bGFyYz0KKyAgICAgIGhhcmRjb2RlX2RpcmVjdF9GNzc9eWVzCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubworICAgICAgOzsKKworICBsaW51eCopCisgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICAgIHRtcF9hcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCWFyY2hpdmVfY21kc19GNzc9IiR0bXBfYXJjaGl2ZV9jbWRzIgorICAgICAgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPW5vCisgICAgICBjYXNlIGAkTEQgLXYgMj4vZGV2L251bGxgIGluCisgICAgICAgICpcIDAxLiogfCAqXCAyLlswLTldLiogfCAqXCAyLjEwLiopIDs7ICMgY2F0Y2ggdmVyc2lvbnMgPCAyLjExCisgICAgICAgICpcIDIuMTEuOTMuMC4yXCAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7ICMgUkg3LjMgLi4uCisgICAgICAgICpcIDIuMTEuOTIuMC4xMlwgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OyAjIE1hbmRyYWtlIDguMiAuLi4KKyAgICAgICAgKlwgMi4xMS4qKSA7OyAjIG90aGVyIDIuMTEgdmVyc2lvbnMKKyAgICAgICAgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OworICAgICAgZXNhYworICAgICAgaWYgdGVzdCAkc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nID0geWVzOyB0aGVuCisgICAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSckZWNobyAieyBnbG9iYWw6IiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KK2NhdCAkZXhwb3J0X3N5bWJvbHMgfCBzZWQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKyRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKyAgICAgICAgJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXZlcnNpb24tc2NyaXB0ICR7d2x9JG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyIC1vICRsaWInCisgICAgICBlbHNlCisgICAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSIkdG1wX2FyY2hpdmVfY21kcyIKKyAgICAgIGZpCisgICAgICBsaW5rX2FsbF9kZXBsaWJzX0Y3Nz1ubworICAgIGVsc2UKKyAgICAgIGxkX3NobGlic19GNzc9bm8KKyAgICBmaQorICAgIDs7CisKKyAgICAqKQorICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisJYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZWxzZQorCWxkX3NobGlic19GNzc9bm8KKyAgICAgIGZpCisgICAgICA7OworICAgIGVzYWMKKworICAgIGlmIHRlc3QgIiRsZF9zaGxpYnNfRjc3IiA9IHllczsgdGhlbgorICAgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PScke3dsfS0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworICAgICAgIyBhbmNpZW50IEdOVSBsZCBkaWRuJ3Qgc3VwcG9ydCAtLXdob2xlLWFyY2hpdmUgZXQuIGFsLgorICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnbm8td2hvbGUtYXJjaGl2ZScgPiAvZGV2L251bGw7IHRoZW4KKyAJd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfRjc3PSIkd2xhcmMiJy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAnIiR3bGFyYyInLS1uby13aG9sZS1hcmNoaXZlJworICAgICAgZWxzZQorICAJd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfRjc3PQorICAgICAgZmkKKyAgICBmaQorICBlbHNlCisgICAgIyBQT1JUTUUgZmlsbCBpbiBhIGRlc2NyaXB0aW9uIG9mIHlvdXIgc3lzdGVtJ3MgbGlua2VyIChub3QgR05VIGxkKQorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgzKikKKyAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz11bnN1cHBvcnRlZAorICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0Y3Nz15ZXMKKyAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSckTEQgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1iRTokZXhwb3J0X3N5bWJvbHMgLVQ1MTIgLUg1MTIgLWJNOlNSRX4kQVIgJEFSX0ZMQUdTICRsaWIgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKKyAgICAgICMgTm90ZTogdGhpcyBsaW5rZXIgaGFyZGNvZGVzIHRoZSBkaXJlY3RvcmllcyBpbiBMSUJQQVRIIGlmIHRoZXJlCisgICAgICAjIGFyZSBubyBkaXJlY3RvcmllcyBzcGVjaWZpZWQgYnkgLUwuCisgICAgICBoYXJkY29kZV9taW51c19MX0Y3Nz15ZXMKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzICYmIHRlc3QgLXogIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgorCSMgTmVpdGhlciBkaXJlY3QgaGFyZGNvZGluZyBub3Igc3RhdGljIGxpbmtpbmcgaXMgc3VwcG9ydGVkIHdpdGggYQorCSMgYnJva2VuIGNvbGxlY3QyLgorCWhhcmRjb2RlX2RpcmVjdF9GNzc9dW5zdXBwb3J0ZWQKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYWl4NCogfCBhaXg1KikKKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJIyBPbiBJQTY0LCB0aGUgbGlua2VyIGRvZXMgcnVuIHRpbWUgbGlua2luZyBieSBkZWZhdWx0LCBzbyB3ZSBkb24ndAorCSMgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsLgorCWFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KKwlleHBfc3ltX2ZsYWc9Jy1CZXhwb3J0JworCW5vX2VudHJ5X2ZsYWc9IiIKKyAgICAgIGVsc2UKKwkjIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB3ZSBkb24ndCB3YW50IHRoZSAiLUMiIG9wdGlvbi4KKwkjIC1DIG1lYW5zIGRlbWFuZ2xlIHRvIEFJWCBubSwgYnV0IG1lYW5zIGRvbid0IGRlbWFuZ2xlIHdpdGggR05VIG5tCisJaWYgJE5NIC1WIDI+JjEgfCBncmVwICdHTlUnID4gL2Rldi9udWxsOyB0aGVuCisJICBleHBvcnRfc3ltYm9sc19jbWRzX0Y3Nz0nJE5NIC1CcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkMiA9PSAiVCIpIHx8IChcJDIgPT0gIkQiKSB8fCAoXCQyID09ICJCIikpICYmIChzdWJzdHIoXCQzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJDMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCisJZWxzZQorCSAgZXhwb3J0X3N5bWJvbHNfY21kc19GNzc9JyROTSAtQkNwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXCQyID09ICJUIikgfHwgKFwkMiA9PSAiRCIpIHx8IChcJDIgPT0gIkIiKSkgJiYgKHN1YnN0cihcJDMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFwkMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKKwlmaQorCWFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KKworCSMgVGVzdCBpZiB3ZSBhcmUgdHJ5aW5nIHRvIHVzZSBydW4gdGltZSBsaW5raW5nIG9yIG5vcm1hbAorCSMgQUlYIHN0eWxlIGxpbmtpbmcuIElmIC1icnRsIGlzIHNvbWV3aGVyZSBpbiBMREZMQUdTLCB3ZQorCSMgbmVlZCB0byBkbyBydW50aW1lIGxpbmtpbmcuCisJY2FzZSAkaG9zdF9vcyBpbiBhaXg0LlsyM118YWl4NC5bMjNdLip8YWl4NSopCisJICBmb3IgbGRfZmxhZyBpbiAkTERGTEFHUzsgZG8KKyAgCSAgaWYgKHRlc3QgJGxkX2ZsYWcgPSAiLWJydGwiIHx8IHRlc3QgJGxkX2ZsYWcgPSAiLVdsLC1icnRsIik7IHRoZW4KKyAgCSAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPXllcworICAJICAgIGJyZWFrCisgIAkgIGZpCisJICBkb25lCisJZXNhYworCisJZXhwX3N5bV9mbGFnPSctYmV4cG9ydCcKKwlub19lbnRyeV9mbGFnPSctYm5vZW50cnknCisgICAgICBmaQorCisgICAgICAjIFdoZW4gbGFyZ2UgZXhlY3V0YWJsZXMgb3Igc2hhcmVkIG9iamVjdHMgYXJlIGJ1aWx0LCBBSVggbGQgY2FuCisgICAgICAjIGhhdmUgcHJvYmxlbXMgY3JlYXRpbmcgdGhlIHRhYmxlIG9mIGNvbnRlbnRzLiAgSWYgbGlua2luZyBhIGxpYnJhcnkKKyAgICAgICMgb3IgcHJvZ3JhbSByZXN1bHRzIGluICJlcnJvciBUT0Mgb3ZlcmZsb3ciIGFkZCAtbW1pbmltYWwtdG9jIHRvCisgICAgICAjIENYWEZMQUdTL0NGTEFHUyBmb3IgZysrL2djYy4gIEluIHRoZSBjYXNlcyB3aGVyZSB0aGF0IGlzIG5vdAorICAgICAgIyBlbm91Z2ggdG8gZml4IHRoZSBwcm9ibGVtLCBhZGQgLVdsLC1iYmlndG9jIHRvIExERkxBR1MuCisKKyAgICAgIGFyY2hpdmVfY21kc19GNzc9JycKKyAgICAgIGhhcmRjb2RlX2RpcmVjdF9GNzc9eWVzCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0Y3Nz0nOicKKyAgICAgIGxpbmtfYWxsX2RlcGxpYnNfRjc3PXllcworCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCWNhc2UgJGhvc3Rfb3MgaW4gYWl4NC4wMTJ8YWl4NC4wMTIuKikKKwkjIFdlIG9ubHkgd2FudCB0byBkbyB0aGlzIG9uIEFJWCA0LjIgYW5kIGxvd2VyLCB0aGUgY2hlY2sKKwkjIGJlbG93IGZvciBicm9rZW4gY29sbGVjdDIgZG9lc24ndCB3b3JrIHVuZGVyIDQuMysKKwkgIGNvbGxlY3QybmFtZT1gJHtDQ30gLXByaW50LXByb2ctbmFtZT1jb2xsZWN0MmAKKwkgIGlmIHRlc3QgLWYgIiRjb2xsZWN0Mm5hbWUiICYmIFwKKyAgCSAgIHN0cmluZ3MgIiRjb2xsZWN0Mm5hbWUiIHwgZ3JlcCByZXNvbHZlX2xpYl9uYW1lID4vZGV2L251bGwKKwkgIHRoZW4KKyAgCSAgIyBXZSBoYXZlIHJld29ya2VkIGNvbGxlY3QyCisgIAkgIGhhcmRjb2RlX2RpcmVjdF9GNzc9eWVzCisJICBlbHNlCisgIAkgICMgV2UgaGF2ZSBvbGQgY29sbGVjdDIKKyAgCSAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz11bnN1cHBvcnRlZAorICAJICAjIEl0IGZhaWxzIHRvIGZpbmQgdW5pbnN0YWxsZWQgbGlicmFyaWVzIHdoZW4gdGhlIHVuaW5zdGFsbGVkCisgIAkgICMgcGF0aCBpcyBub3QgbGlzdGVkIGluIHRoZSBsaWJwYXRoLiAgU2V0dGluZyBoYXJkY29kZV9taW51c19MCisgIAkgICMgdG8gdW5zdXBwb3J0ZWQgZm9yY2VzIHJlbGlua2luZworICAJICBoYXJkY29kZV9taW51c19MX0Y3Nz15ZXMKKyAgCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9Jy1MJGxpYmRpcicKKyAgCSAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9GNzc9CisJICBmaQorCWVzYWMKKwlzaGFyZWRfZmxhZz0nLXNoYXJlZCcKKyAgICAgIGVsc2UKKwkjIG5vdCB1c2luZyBnY2MKKwlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAJIyBWaXN1YWxBZ2UgQysrLCBWZXJzaW9uIDUuNSBmb3IgQUlYIDVMIGZvciBJQS02NCwgQmV0YSAzIFJlbGVhc2UKKyAgCSMgY2hva2VzIG9uIC1XbCwtRy4gVGhlIGZvbGxvd2luZyBsaW5lIGlzIGNvcnJlY3Q6CisJICBzaGFyZWRfZmxhZz0nLUcnCisJZWxzZQorICAJaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJICAgIHNoYXJlZF9mbGFnPScke3dsfS1HJworCSAgZWxzZQorCSAgICBzaGFyZWRfZmxhZz0nJHt3bH0tYk06U1JFJworICAJZmkKKwlmaQorICAgICAgZmkKKworICAgICAgIyBJdCBzZWVtcyB0aGF0IC1iZXhwYWxsIGRvZXMgbm90IGV4cG9ydCBzeW1ib2xzIGJlZ2lubmluZyB3aXRoCisgICAgICAjIHVuZGVyc2NvcmUgKF8pLCBzbyBpdCBpcyBiZXR0ZXIgdG8gZ2VuZXJhdGUgYSBsaXN0IG9mIHN5bWJvbHMgdG8gZXhwb3J0LgorICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0Y3Nz15ZXMKKyAgICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1bnRpbWUgbG9hZGluZyBmbGFncyAoLWJydGwpLAorCSMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKwlhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9Jy1iZXJvaycKKyAgICAgICAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4gZW1wdHkgZXhlY3V0YWJsZS4KKyAgICAgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisgICAgICBwcm9ncmFtIG1haW4KKworICAgICAgZW5kCitfQUNFT0YKK2lmIGFjX2ZuX2Y3N190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorCithaXhfbGlicGF0aD1gZHVtcCAtSCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KK30nYAorIyBDaGVjayBmb3IgYSA2NC1iaXQgb2JqZWN0IGlmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLgoraWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD1gZHVtcCAtSFg2NCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KK30nYDsgZmkKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAoraWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD0iL3Vzci9saWI6L2xpYiI7IGZpCisKKyAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0iXCRDQyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIGBpZiB0ZXN0ICJ4JHthbGxvd191bmRlZmluZWRfZmxhZ30iICE9ICJ4IjsgdGhlbiBlY2hvICIke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IjsgZWxzZSA6OyBmaWAgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyBcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMgJHNoYXJlZF9mbGFnIgorICAgICAgIGVsc2UKKwlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9JyR7d2x9LVIgJGxpYmRpcjovdXNyL2xpYjovbGliJworCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PSIteiBub2RlZnMiCisJICBhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICciXCR7d2x9JG5vX2VudHJ5X2ZsYWcgXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzIgorCWVsc2UKKwkgIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuIGVtcHR5IGV4ZWN1dGFibGUuCisJIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKyAgICAgIHByb2dyYW0gbWFpbgorCisgICAgICBlbmQKK19BQ0VPRgoraWYgYWNfZm5fZjc3X3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisKK2FpeF9saWJwYXRoPWBkdW1wIC1IIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgJy9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsgL14wLyB7IHMvXjAgICpcKC4qXCkkL1wxLzsgcDsgfQorfSdgCisjIENoZWNrIGZvciBhIDY0LWJpdCBvYmplY3QgaWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcuCitpZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPWBkdW1wIC1IWDY0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgJy9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsgL14wLyB7IHMvXjAgICpcKC4qXCkkL1wxLzsgcDsgfQorfSdgOyBmaQorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitpZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPSIvdXNyL2xpYjovbGliIjsgZmkKKworCSBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKKwkgICMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1biB0aW1lIGxvYWRpbmcgZmxhZ3MsCisJICAjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCisJICBub191bmRlZmluZWRfZmxhZ19GNzc9JyAke3dsfS1iZXJub3RvaycKKwkgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz0nICR7d2x9LWJlcm9rJworCSAgIyAtYmV4cGFsbCBkb2VzIG5vdCBleHBvcnQgc3ltYm9scyBiZWdpbm5pbmcgd2l0aCB1bmRlcnNjb3JlIChfKQorCSAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0Y3Nz15ZXMKKwkgICMgRXhwb3J0ZWQgc3ltYm9scyBjYW4gYmUgcHVsbGVkIGludG8gc2hhcmVkIG9iamVjdHMgZnJvbSBhcmNoaXZlcworCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfRjc3PScgJworCSAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfRjc3PXllcworCSAgIyBUaGlzIGlzIHNpbWlsYXIgdG8gaG93IEFJWCB0cmFkaXRpb25hbGx5IGJ1aWxkcyBpdCdzIHNoYXJlZCBsaWJyYXJpZXMuCisJICBhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1iRTokZXhwb3J0X3N5bWJvbHMgJHt3bH0tYm5vZW50cnkke2FsbG93X3VuZGVmaW5lZF9mbGFnfX4kQVIgJEFSX0ZMQUdTICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lJHJlbGVhc2UuYSAkb3V0cHV0X29iamRpci8kc29uYW1lJworCWZpCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFtaWdhb3MqKQorICAgICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJHJtICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTkFNRSAkbGlibmFtZSIgPiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIExJQlJBUllfSUQgMSIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBWRVJTSU9OICRtYWpvciIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBSRVZJU0lPTiAkcmV2aXNpb24iID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEFSICRBUl9GTEFHUyAkbGliICRsaWJvYmpzfiRSQU5MSUIgJGxpYn4oY2QgJG91dHB1dF9vYmpkaXIgJiYgYTJpeGxpYnJhcnkgLTMyKScKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSctTCRsaWJkaXInCisgICAgICBoYXJkY29kZV9taW51c19MX0Y3Nz15ZXMKKyAgICAgICMgc2VlIGNvbW1lbnQgYWJvdXQgZGlmZmVyZW50IHNlbWFudGljcyBvbiB0aGUgR05VIGxkIHNlY3Rpb24KKyAgICAgIGxkX3NobGlic19GNzc9bm8KKyAgICAgIDs7CisKKyAgICBic2RpNCopCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3PS1yZHluYW1pYworICAgICAgOzsKKworICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgICAgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCisgICAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgorICAgICAgIyBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLCBhcyB0aGVyZSBpcworICAgICAgIyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PScgJworICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PXVuc3VwcG9ydGVkCisgICAgICAjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmxpYiBmaWxlcywgbm90IC5hIGZpbGVzLgorICAgICAgbGliZXh0PWxpYgorICAgICAgIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5kbGwgZmlsZXMsIG5vdCAuc28gZmlsZXMuCisgICAgICBzaHJleHRfY21kcz0iLmRsbCIKKyAgICAgICMgRklYTUU6IFNldHRpbmcgbGlua25hbWVzIGhlcmUgaXMgYSBiYWQgaGFjay4KKyAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRDQyAtbyAkbGliICRsaWJvYmpzICRjb21waWxlcl9mbGFncyBgZWNobyAiJGRlcGxpYnMiIHwgJFNFRCAtZSAnXCcncy8gLWxjJC8vJ1wnJ2AgLWxpbmsgLWRsbH5saW5rbmFtZXM9JworICAgICAgIyBUaGUgbGlua2VyIHdpbGwgYXV0b21hdGljYWxseSBidWlsZCBhIC5saWIgZmlsZSBpZiB3ZSBidWlsZCBhIERMTC4KKyAgICAgIG9sZF9hcmNoaXZlX0Zyb21fbmV3X2NtZHNfRjc3PSd0cnVlJworICAgICAgIyBGSVhNRTogU2hvdWxkIGxldCB0aGUgdXNlciBzcGVjaWZ5IHRoZSBsaWIgcHJvZ3JhbS4KKyAgICAgIG9sZF9hcmNoaXZlX2NtZHNfRjc3PSdsaWIgL09VVDokb2xkbGliJG9sZG9ianMkb2xkX2RlcGxpYnMnCisgICAgICBmaXhfc3JjZmlsZV9wYXRoPSdgY3lncGF0aCAtdyAiJHNyY2ZpbGUiYCcKKyAgICAgIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfRjc3PXllcworICAgICAgOzsKKworICAgIGRhcndpbiogfCByaGFwc29keSopCisgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXMgOyB0aGVuCisgICAgICBhcmNoaXZlX2NtZHNfbmVlZF9sY19GNzc9bm8KKyAgICAgIGNhc2UgIiRob3N0X29zIiBpbgorICAgICAgcmhhcHNvZHkqIHwgZGFyd2luMS5bMDEyXSkKKwlhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9Jy11bmRlZmluZWQgc3VwcHJlc3MnCisJOzsKKyAgICAgICopICMgRGFyd2luIDEuMyBvbgorICAgICAgaWYgdGVzdCAteiAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVH0gOyB0aGVuCisgICAgICAJYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PSctZmxhdF9uYW1lc3BhY2UgLXVuZGVmaW5lZCBzdXBwcmVzcycKKyAgICAgIGVsc2UKKyAgICAgICAgY2FzZSAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVH0gaW4KKyAgICAgICAgICAxMC5bMDEyXSkKKyAgICAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz0nLWZsYXRfbmFtZXNwYWNlIC11bmRlZmluZWQgc3VwcHJlc3MnCisgICAgICAgICAgICA7OworICAgICAgICAgIDEwLiopCisgICAgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9Jy11bmRlZmluZWQgZHluYW1pY19sb29rdXAnCisgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgICBmaQorCTs7CisgICAgICBlc2FjCisgICAgCWx0X2ludF9hcHBsZV9jY19zaW5nbGVfbW9kPW5vCisgICAgCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJworICAgIAlpZiAkQ0MgLWR1bXBzcGVjcyAyPiYxIHwgZ3JlcCAnc2luZ2xlX21vZHVsZScgPi9kZXYvbnVsbCA7IHRoZW4KKyAgICAJICBsdF9pbnRfYXBwbGVfY2Nfc2luZ2xlX21vZD15ZXMKKyAgICAJZmkKKyAgICAJaWYgdGVzdCAiWCRsdF9pbnRfYXBwbGVfY2Nfc2luZ2xlX21vZCIgPSBYeWVzIDsgdGhlbgorICAgIAkgIGFyY2hpdmVfY21kc19GNzc9JyRDQyAtZHluYW1pY2xpYiAtc2luZ2xlX21vZHVsZSAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nJworICAgIAllbHNlCisgICAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRDQyAtciAke3dsfS1iaW5kX2F0X2xvYWQgLWtlZXBfcHJpdmF0ZV9leHRlcm5zIC1ub3N0ZGxpYiAtbyAke2xpYn0tbWFzdGVyLm8gJGxpYm9ianN+JENDIC1keW5hbWljbGliICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICR7bGlifS1tYXN0ZXIubyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nJworICAgICAgZmkKKyAgICAgIG1vZHVsZV9jbWRzX0Y3Nz0nJENDICR7d2x9LWJpbmRfYXRfbG9hZCAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzJworICAgICAgIyBEb24ndCBmaXggdGhpcyBieSB1c2luZyB0aGUgbGQgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBmbGFnLCBpdCBkb2Vzbid0IGV4aXN0IGluIG9sZGVyIGRhcndpbiBsZCdzCisgICAgICAgIGlmIHRlc3QgIlgkbHRfaW50X2FwcGxlX2NjX3NpbmdsZV9tb2QiID0gWHllcyA7IHRoZW4KKyAgICAgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgLWR5bmFtaWNsaWIgLXNpbmdsZV9tb2R1bGUgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZ35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCisgICAgICAgIGVsc2UKKyAgICAgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgLXIgJHt3bH0tYmluZF9hdF9sb2FkIC1rZWVwX3ByaXZhdGVfZXh0ZXJucyAtbm9zdGRsaWIgLW8gJHtsaWJ9LW1hc3Rlci5vICRsaWJvYmpzfiRDQyAtZHluYW1pY2xpYiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAke2xpYn0tbWFzdGVyLm8gJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZ35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCisgICAgICAgIGZpCisgICAgICAgICAgbW9kdWxlX2V4cHN5bV9jbWRzX0Y3Nz0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnICAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3N+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgICAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz1ubworICAgICAgaGFyZGNvZGVfYXV0b21hdGljX0Y3Nz15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PXVuc3VwcG9ydGVkCisgICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19GNzc9Jy1hbGxfbG9hZCAkY29udmVuaWVuY2UnCisgICAgICBsaW5rX2FsbF9kZXBsaWJzX0Y3Nz15ZXMKKyAgICBlbHNlCisgICAgICBsZF9zaGxpYnNfRjc3PW5vCisgICAgZmkKKyAgICAgIDs7CisKKyAgICBkZ3V4KikKKyAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSctTCRsaWJkaXInCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubworICAgICAgOzsKKworICAgIGZyZWVic2QxKikKKyAgICAgIGxkX3NobGlic19GNzc9bm8KKyAgICAgIDs7CisKKyAgICAjIEZyZWVCU0QgMi4yLlswMTJdIGFsbG93cyB1cyB0byBpbmNsdWRlIGMrK3J0MC5vIHRvIGdldCBDKysgY29uc3RydWN0b3IKKyAgICAjIHN1cHBvcnQuICBGdXR1cmUgdmVyc2lvbnMgZG8gdGhpcyBhdXRvbWF0aWNhbGx5LCBidXQgYW4gZXhwbGljaXQgYysrcnQwLm8KKyAgICAjIGRvZXMgbm90IGJyZWFrIGFueXRoaW5nLCBhbmQgaGVscHMgc2lnbmlmaWNhbnRseSAoYXQgdGhlIGNvc3Qgb2YgYSBsaXR0bGUKKyAgICAjIGV4dHJhIHNwYWNlKS4KKyAgICBmcmVlYnNkMi4yKikKKyAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgL3Vzci9saWIvYysrcnQwLm8nCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nLVIkbGliZGlyJworICAgICAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCisgICAgICA7OworCisgICAgIyBVbmZvcnR1bmF0ZWx5LCBvbGRlciB2ZXJzaW9ucyBvZiBGcmVlQlNEIDIgZG8gbm90IGhhdmUgdGhpcyBmZWF0dXJlLgorICAgIGZyZWVic2QyKikKKyAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9kaXJlY3RfRjc3PXllcworICAgICAgaGFyZGNvZGVfbWludXNfTF9GNzc9eWVzCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubworICAgICAgOzsKKworICAgICMgRnJlZUJTRCAzIGFuZCBncmVhdGVyIHVzZXMgZ2NjIC1zaGFyZWQgdG8gZG8gc2hhcmVkIGxpYnJhcmllcy4KKyAgICBmcmVlYnNkKiB8IGtmcmVlYnNkKi1nbnUpCisgICAgICBhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSctUiRsaWJkaXInCisgICAgICBoYXJkY29kZV9kaXJlY3RfRjc3PXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9bm8KKyAgICAgIDs7CisKKyAgICBocHV4OSopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCWFyY2hpdmVfY21kc19GNzc9JyRybSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRDQyAtc2hhcmVkIC1mUElDICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzX0Y3Nz0nJHJtICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JExEIC1iICtiICRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICBmaQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9GNzc9OgorICAgICAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz15ZXMKKworICAgICAgIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKKyAgICAgICMgYnV0IGFzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorICAgICAgaGFyZGNvZGVfbWludXNfTF9GNzc9eWVzCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3PScke3dsfS1FJworICAgICAgOzsKKworICAgIGhwdXgxMCogfCBocHV4MTEqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgLWEgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCWNhc2UgIiRob3N0X2NwdSIgaW4KKwlocHBhKjY0KnxpYTY0KikKKwkgIGFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwkqKQorCSAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJZXNhYworICAgICAgZWxzZQorCWNhc2UgIiRob3N0X2NwdSIgaW4KKwlocHBhKjY0KnxpYTY0KikKKwkgIGFyY2hpdmVfY21kc19GNzc9JyRMRCAtYiAraCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIDs7CisJKikKKwkgIGFyY2hpdmVfY21kc19GNzc9JyRMRCAtYiAraCAkc29uYW1lICtiICRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICA7OworCWVzYWMKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwljYXNlICIkaG9zdF9jcHUiIGluCisJaHBwYSo2NCopCisJICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisJICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0Y3Nz0nK2IgJGxpYmRpcicKKwkgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfRjc3PToKKwkgIGhhcmRjb2RlX2RpcmVjdF9GNzc9bm8KKwkgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCisJICA7OworCWlhNjQqKQorCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9Jy1MJGxpYmRpcicKKwkgIGhhcmRjb2RlX2RpcmVjdF9GNzc9bm8KKwkgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCisKKwkgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCisJICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKwkgIGhhcmRjb2RlX21pbnVzX0xfRjc3PXllcworCSAgOzsKKwkqKQorCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworCSAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9GNzc9OgorCSAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz15ZXMKKwkgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19GNzc9JyR7d2x9LUUnCisKKwkgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCisJICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKwkgIGhhcmRjb2RlX21pbnVzX0xfRjc3PXllcworCSAgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgOzsKKworICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCWFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlhcmNoaXZlX2NtZHNfRjc3PSckTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfRjc3PSctcnBhdGggJGxpYmRpcicKKyAgICAgIGZpCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9GNzc9OgorICAgICAgbGlua19hbGxfZGVwbGlic19GNzc9eWVzCisgICAgICA7OworCisgICAgbmV0YnNkKiB8IGtuZXRic2QqLWdudSkKKyAgICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKwlhcmNoaXZlX2NtZHNfRjc3PSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJyAgIyBhLm91dAorICAgICAgZWxzZQorCWFyY2hpdmVfY21kc19GNzc9JyRMRCAtc2hhcmVkIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgICAgICAjIEVMRgorICAgICAgZmkKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSctUiRsaWJkaXInCisgICAgICBoYXJkY29kZV9kaXJlY3RfRjc3PXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9bm8KKyAgICAgIDs7CisKKyAgICBuZXdzb3M2KQorICAgICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz15ZXMKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0Y3Nz06CisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubworICAgICAgOzsKKworICAgIG9wZW5ic2QqKQorICAgICAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCisgICAgICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KKwlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tRScKKyAgICAgIGVsc2UKKyAgICAgICBjYXNlICRob3N0X29zIGluCisJIG9wZW5ic2RbMDFdLiogfCBvcGVuYnNkMi5bMC03XSB8IG9wZW5ic2QyLlswLTddLiopCisJICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nLVIkbGliZGlyJworCSAgIDs7CisJICopCisJICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PScke3dsfS1ycGF0aCwkbGliZGlyJworCSAgIDs7CisgICAgICAgZXNhYworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBvczIqKQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9Jy1MJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX21pbnVzX0xfRjc3PXllcworICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PXVuc3VwcG9ydGVkCisgICAgICBhcmNoaXZlX2NtZHNfRjc3PSckZWNobyAiTElCUkFSWSAkbGlibmFtZSBJTklUSU5TVEFOQ0UiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvICJERVNDUklQVElPTiBcIiRsaWJuYW1lXCIiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyBEQVRBID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyAiIFNJTkdMRSBOT05TSEFSRUQiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyBFWFBPUlRTID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn5lbXhleHAgJGxpYm9ianMgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRDQyAtWmRsbCAtWmNydGRsbCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYnCisgICAgICBvbGRfYXJjaGl2ZV9Gcm9tX25ld19jbWRzX0Y3Nz0nZW14aW1wIC1vICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmEgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmJworICAgICAgOzsKKworICAgIG9zZjMqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJworCWFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworICAgICAgZWxzZQorCWFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKKwlhcmNoaXZlX2NtZHNfRjc3PSckTEQgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisgICAgICBmaQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfRjc3PToKKyAgICAgIDs7CisKKyAgICBvc2Y0KiB8IG9zZjUqKQkjIGFzIG9zZjMqIHdpdGggdGhlIGFkZGl0aW9uIG9mIC1tc3ltIGZsYWcKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKwlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1tc3ltICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBlbHNlCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PScgLWV4cGVjdF91bnJlc29sdmVkIFwqJworCWFyY2hpdmVfY21kc19GNzc9JyRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nZm9yIGkgaW4gYGNhdCAkZXhwb3J0X3N5bWJvbHNgOyBkbyBwcmludGYgIiVzICVzXFxuIiAtZXhwb3J0ZWRfc3ltYm9sICJcJGkiID4+ICRsaWIuZXhwOyBkb25lOyBlY2hvICItaGlkZGVuIj4+ICRsaWIuZXhwfgorCSRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWlucHV0ICRsaWIuZXhwICRsaW5rZXJfZmxhZ3MgJGxpYm9ianMgJGRlcGxpYnMgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYn4kcm0gJGxpYi5leHAnCisKKwkjIEJvdGggYyBhbmQgY3h4IGNvbXBpbGVyIHN1cHBvcnQgLXJwYXRoIGRpcmVjdGx5CisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9Jy1ycGF0aCAkbGliZGlyJworICAgICAgZmkKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfRjc3PToKKyAgICAgIDs7CisKKyAgICBzY28zLjJ2NSopCisgICAgICBhcmNoaXZlX2NtZHNfRjc3PSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubworICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tQmV4cG9ydCcKKyAgICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisgICAgICBoYXJkY29kZV9ydW5wYXRoX3Zhcj15ZXMKKyAgICAgIDs7CisKKyAgICBzb2xhcmlzKikKKyAgICAgIG5vX3VuZGVmaW5lZF9mbGFnX0Y3Nz0nIC16IHRleHQnCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCWFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkICR7d2x9LWggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCWFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSckZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH4kZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKwkgICRDQyAtc2hhcmVkICR7d2x9LU0gJHt3bH0kbGliLmV4cCAke3dsfS1oICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc34kcm0gJGxpYi5leHAnCisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorICAJJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLU0gJGxpYi5leHAgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3N+JHJtICRsaWIuZXhwJworICAgICAgZmkKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSctUiRsaWJkaXInCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubworICAgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgc29sYXJpczIuWzAtNV0gfCBzb2xhcmlzMi5bMC01XS4qKSA7OworICAgICAgKikgIyBTdXBwb3J0ZWQgc2luY2UgU29sYXJpcyAyLjYgKG1heWJlIDIuNS4xPykKKwl3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19GNzc9Jy16IGFsbGV4dHJhY3QkY29udmVuaWVuY2UgLXogZGVmYXVsdGV4dHJhY3QnIDs7CisgICAgICBlc2FjCisgICAgICBsaW5rX2FsbF9kZXBsaWJzX0Y3Nz15ZXMKKyAgICAgIDs7CisKKyAgICBzdW5vczQqKQorICAgICAgaWYgdGVzdCAieCRob3N0X3ZlbmRvciIgPSB4c2VxdWVudDsgdGhlbgorCSMgVXNlICRDQyB0byBsaW5rIHVuZGVyIHNlcXVlbnQsIGJlY2F1c2UgaXQgdGhyb3dzIGluIHNvbWUgZXh0cmEgLm8KKwkjIGZpbGVzIHRoYXQgbWFrZSAuaW5pdCBhbmQgLmZpbmkgc2VjdGlvbnMgd29yay4KKwlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLUcgJHt3bH0taCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZWxzZQorCWFyY2hpdmVfY21kc19GNzc9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnN0YXRpYyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBmaQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9Jy1MJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2RpcmVjdF9GNzc9eWVzCisgICAgICBoYXJkY29kZV9taW51c19MX0Y3Nz15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCisgICAgICA7OworCisgICAgc3lzdjQpCisgICAgICBjYXNlICRob3N0X3ZlbmRvciBpbgorCXNuaSkKKwkgIGFyY2hpdmVfY21kc19GNzc9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIGhhcmRjb2RlX2RpcmVjdF9GNzc9eWVzICMgaXMgdGhpcyByZWFsbHkgdHJ1ZT8/PworCTs7CisJc2llbWVucykKKwkgICMjIExEIGlzIGxkIGl0IG1ha2VzIGEgUExBTUxJQgorCSAgIyMgQ0MganVzdCBtYWtlcyBhIEdyb3NzTW9kdWxlLgorCSAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1HIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIHJlbG9hZF9jbWRzX0Y3Nz0nJENDIC1yIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCisJICBoYXJkY29kZV9kaXJlY3RfRjc3PW5vCisgICAgICAgIDs7CisJbW90b3JvbGEpCisJICBhcmNoaXZlX2NtZHNfRjc3PSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICBoYXJkY29kZV9kaXJlY3RfRjc3PW5vICNNb3Rvcm9sYSBtYW51YWwgc2F5cyB5ZXMsIGJ1dCBteSB0ZXN0cyBzYXkgdGhleSBsaWUKKwk7OworICAgICAgZXNhYworICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9bm8KKyAgICAgIDs7CisKKyAgICBzeXN2NC4zKikKKyAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3PSctQmV4cG9ydCcKKyAgICAgIDs7CisKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCisJYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCWhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCisJcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKwloYXJkY29kZV9ydW5wYXRoX3Zhcj15ZXMKKwlsZF9zaGxpYnNfRjc3PXllcworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzeXN2NC4ydXcyKikKKyAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRMRCAtRyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9kaXJlY3RfRjc3PXllcworICAgICAgaGFyZGNvZGVfbWludXNfTF9GNzc9bm8KKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCisgICAgICBoYXJkY29kZV9ydW5wYXRoX3Zhcj15ZXMKKyAgICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisgICAgICA7OworCisgICBzeXN2NU9wZW5VTklYOCogfCBzeXN2NVVuaXhXYXJlNyogfCAgc3lzdjV1d1s3OF0qIHwgdW5peHdhcmU3KikKKyAgICAgIG5vX3VuZGVmaW5lZF9mbGFnX0Y3Nz0nJHt3bH0teiAke3dsfXRleHQnCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCWFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkICR7d2x9LWggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZWxzZQorCWFyY2hpdmVfY21kc19GNzc9JyRDQyAtRyAke3dsfS1oICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGZpCisgICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubworICAgICAgOzsKKworICAgIHN5c3Y1KikKKyAgICAgIG5vX3VuZGVmaW5lZF9mbGFnX0Y3Nz0nIC16IHRleHQnCisgICAgICAjICRDQyAtc2hhcmVkIHdpdGhvdXQgR05VIGxkIHdpbGwgbm90IGNyZWF0ZSBhIGxpYnJhcnkgZnJvbSBDKysKKyAgICAgICMgb2JqZWN0IGZpbGVzIGFuZCBhIHN0YXRpYyBsaWJzdGRjKyssIGJldHRlciBhdm9pZCBpdCBieSBub3cKKyAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorICAJCSRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1NICRsaWIuZXhwIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfiRybSAkbGliLmV4cCcKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PQorICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9bm8KKyAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKyAgICAgIDs7CisKKyAgICB1dHM0KikKKyAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSctTCRsaWJkaXInCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubworICAgICAgOzsKKworICAgICopCisgICAgICBsZF9zaGxpYnNfRjc3PW5vCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsZF9zaGxpYnNfRjc3IiA+JjUKKyRhc19lY2hvICIkbGRfc2hsaWJzX0Y3NyIgPiY2OyB9Cit0ZXN0ICIkbGRfc2hsaWJzX0Y3NyIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCisKK3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSJQQVRIICRzaGxpYnBhdGhfdmFyICRydW5wYXRoX3ZhciIKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsgR0NDX0VYRUNfUFJFRklYIENPTVBJTEVSX1BBVEggTElCUkFSWV9QQVRIIgorZmkKKworIworIyBEbyB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgbGluayBsaWJjPworIworY2FzZSAieCRhcmNoaXZlX2NtZHNfbmVlZF9sY19GNzciIGluCit4fHh5ZXMpCisgICMgQXNzdW1lIC1sYyBzaG91bGQgYmUgYWRkZWQKKyAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfRjc3PXllcworCisgIGlmIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIGNhc2UgJGFyY2hpdmVfY21kc19GNzcgaW4KKyAgICAqJ34nKikKKyAgICAgICMgRklYTUU6IHdlIG1heSBoYXZlIHRvIGRlYWwgd2l0aCBtdWx0aS1jb21tYW5kIHNlcXVlbmNlcy4KKyAgICAgIDs7CisgICAgJyRDQyAnKikKKyAgICAgICMgVGVzdCB3aGV0aGVyIHRoZSBjb21waWxlciBpbXBsaWNpdGx5IGxpbmtzIHdpdGggLWxjIHNpbmNlIG9uIHNvbWUKKyAgICAgICMgc3lzdGVtcywgLWxnY2MgaGFzIHRvIGNvbWUgYmVmb3JlIC1sYy4gSWYgZ2NjIGFscmVhZHkgcGFzc2VzIC1sYworICAgICAgIyB0byBsZCwgZG9uJ3QgYWRkIC1sYyBiZWZvcmUgLWxnY2MuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgLWxjIHNob3VsZCBiZSBleHBsaWNpdGx5IGxpbmtlZCBpbiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4uLi4gIiA+JjY7IH0KKyAgICAgICRybSBjb25mdGVzdCoKKyAgICAgIHByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisKKyAgICAgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19jb21waWxlXCIiOyB9ID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gMj5jb25mdGVzdC5lcnI7IHRoZW4KKyAgICAgICAgc29uYW1lPWNvbmZ0ZXN0CisgICAgICAgIGxpYj1jb25mdGVzdAorICAgICAgICBsaWJvYmpzPWNvbmZ0ZXN0LiRhY19vYmpleHQKKyAgICAgICAgZGVwbGlicz0KKyAgICAgICAgd2w9JGx0X3Byb2dfY29tcGlsZXJfd2xfRjc3CisgICAgICAgIGNvbXBpbGVyX2ZsYWdzPS12CisgICAgICAgIGxpbmtlcl9mbGFncz0tdgorICAgICAgICB2ZXJzdHJpbmc9CisgICAgICAgIG91dHB1dF9vYmpkaXI9LgorICAgICAgICBsaWJuYW1lPWNvbmZ0ZXN0CisgICAgICAgIGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3NworICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9CisgICAgICAgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhcmNoaXZlX2NtZHNfRjc3IDJcPlwmMSBcfCBncmVwIFwiIC1sYyBcIiBcPi9kZXYvbnVsbCAyXD5cJjFcIiI7IH0gPiY1CisgIChldmFsICRhcmNoaXZlX2NtZHNfRjc3IDJcPlwmMSBcfCBncmVwIFwiIC1sYyBcIiBcPi9kZXYvbnVsbCAyXD5cJjEpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9CisgICAgICAgIHRoZW4KKwkgIGFyY2hpdmVfY21kc19uZWVkX2xjX0Y3Nz1ubworICAgICAgICBlbHNlCisJICBhcmNoaXZlX2NtZHNfbmVlZF9sY19GNzc9eWVzCisgICAgICAgIGZpCisgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz0kbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZworICAgICAgZWxzZQorICAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKKyAgICAgIGZpCisgICAgICAkcm0gY29uZnRlc3QqCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFyY2hpdmVfY21kc19uZWVkX2xjX0Y3NyIgPiY1CiskYXNfZWNobyAiJGFyY2hpdmVfY21kc19uZWVkX2xjX0Y3NyIgPiY2OyB9CisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKyAgOzsKK2VzYWMKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzLi4uICIgPiY2OyB9CitsaWJyYXJ5X25hbWVzX3NwZWM9CitsaWJuYW1lX3NwZWM9J2xpYiRuYW1lJworc29uYW1lX3NwZWM9CitzaHJleHRfY21kcz0iLnNvIgorcG9zdGluc3RhbGxfY21kcz0KK3Bvc3R1bmluc3RhbGxfY21kcz0KK2ZpbmlzaF9jbWRzPQorZmluaXNoX2V2YWw9CitzaGxpYnBhdGhfdmFyPQorc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXVua25vd24KK3ZlcnNpb25fdHlwZT1ub25lCitkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCitzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiIKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IGdyZXAgIl5saWJyYXJpZXM6IiB8ICRTRUQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgInMsPS8sLyxnImAKKyAgaWYgZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBncmVwICc7JyA+L2Rldi9udWxsIDsgdGhlbgorICAgICMgaWYgdGhlIHBhdGggY29udGFpbnMgIjsiIHRoZW4gd2UgYXNzdW1lIGl0IHRvIGJlIHRoZSBzZXBhcmF0b3IKKyAgICAjIG90aGVyd2lzZSBkZWZhdWx0IHRvIHRoZSBzdGFuZGFyZCBwYXRoIHNlcGFyYXRvciAoaS5lLiAiOiIpIC0gaXQgaXMKKyAgICAjIGFzc3VtZWQgdGhhdCBubyBwYXJ0IG9mIGEgbm9ybWFsIHBhdGhuYW1lIGNvbnRhaW5zICI7IiBidXQgdGhhdCBzaG91bGQKKyAgICAjIG9rYXkgaW4gdGhlIHJlYWwgd29ybGQgd2hlcmUgIjsiIGluIGRpcnBhdGhzIGlzIGl0c2VsZiBwcm9ibGVtYXRpYy4KKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAtZSAncy87LyAvZydgCisgIGVsc2UKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCisgIGZpCitlbHNlCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKK2ZpCituZWVkX2xpYl9wcmVmaXg9dW5rbm93bgoraGFyZGNvZGVfaW50b19saWJzPW5vCisKKyMgd2hlbiB5b3Ugc2V0IG5lZWRfdmVyc2lvbiB0byBubywgbWFrZSBzdXJlIGl0IGRvZXMgbm90IGNhdXNlIC1zZXRfdmVyc2lvbgorIyBmbGFncyB0byBiZSBsZWZ0IHdpdGhvdXQgYXJndW1lbnRzCituZWVkX3ZlcnNpb249dW5rbm93bgorCitjYXNlICRob3N0X29zIGluCithaXgzKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZS5hJworICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKKworICAjIEFJWCAzIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIHdlIGFwcGVuZCBhIG1ham9yIHZlcnNpb24gdG8gdGhlIG5hbWUuCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIDs7CisKK2FpeDQqIHwgYWl4NSopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKyAgICAjIEFJWCA1IHN1cHBvcnRzIElBNjQKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBlbHNlCisgICAgIyBXaXRoIEdDQyB1cCB0byAyLjk1LngsIGNvbGxlY3QyIHdvdWxkIGNyZWF0ZSBhbiBpbXBvcnQgZmlsZQorICAgICMgZm9yIGRlcGVuZGVuY2UgbGlicmFyaWVzLiAgVGhlIGltcG9ydCBmaWxlIHdvdWxkIHN0YXJ0IHdpdGgKKyAgICAjIHRoZSBsaW5lIGAjISAuJy4gIFRoaXMgd291bGQgY2F1c2UgdGhlIGdlbmVyYXRlZCBsaWJyYXJ5IHRvCisgICAgIyBkZXBlbmQgb24gYC4nLCBhbHdheXMgYW4gaW52YWxpZCBsaWJyYXJ5LiAgVGhpcyB3YXMgZml4ZWQgaW4KKyAgICAjIGRldmVsb3BtZW50IHNuYXBzaG90cyBvZiBHQ0MgcHJpb3IgdG8gMy4wLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeDQgfCBhaXg0LlswMV0gfCBhaXg0LlswMV0uKikKKyAgICAgIGlmIHsgZWNobyAnI2lmIF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA5NyknCisJICAgZWNobyAnIHllcyAnCisJICAgZWNobyAnI2VuZGlmJzsgfSB8ICR7Q0N9IC1FIC0gfCBncmVwIHllcyA+IC9kZXYvbnVsbDsgdGhlbgorCToKKyAgICAgIGVsc2UKKwljYW5fYnVpbGRfc2hhcmVkPW5vCisgICAgICBmaQorICAgICAgOzsKKyAgICBlc2FjCisgICAgIyBBSVggKG9uIFBvd2VyKikgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gY3VycmVudGx5IHdlIGNhbiBub3QgaGFyZGNvZGUgY29ycmVjdAorICAgICMgc29uYW1lIGludG8gZXhlY3V0YWJsZS4gUHJvYmFibHkgd2UgY2FuIGFkZCB2ZXJzaW9uaW5nIHN1cHBvcnQgdG8KKyAgICAjIGNvbGxlY3QyLCBzbyBhZGRpdGlvbmFsIGxpbmtzIGNhbiBiZSB1c2VmdWwgaW4gZnV0dXJlLgorICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorICAgICAgIyBJZiB1c2luZyBydW4gdGltZSBsaW5raW5nIChvbiBBSVggNC4yIG9yIGxhdGVyKSB1c2UgbGliPG5hbWU+LnNvCisgICAgICAjIGluc3RlYWQgb2YgbGliPG5hbWU+LmEgdG8gbGV0IHBlb3BsZSBrbm93IHRoYXQgdGhlc2UgYXJlIG5vdAorICAgICAgIyB0eXBpY2FsIEFJWCBzaGFyZWQgbGlicmFyaWVzLgorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgZWxzZQorICAgICAgIyBXZSBwcmVzZXJ2ZSAuYSBhcyBleHRlbnNpb24gZm9yIHNoYXJlZCBsaWJyYXJpZXMgdGhyb3VnaCBBSVg0LjIKKyAgICAgICMgYW5kIGxhdGVyIHdoZW4gd2UgYXJlIG5vdCBkb2luZyBydW4gdGltZSBsaW5raW5nLgorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5hICRsaWJuYW1lLmEnCisgICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIGZpCisgICAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisgIGZpCisgIDs7CisKK2FtaWdhb3MqKQorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLml4bGlicmFyeSAkbGlibmFtZS5hJworICAjIENyZWF0ZSAke2xpYm5hbWV9X2l4bGlicmFyeS5hIGVudHJpZXMgaW4gL3N5cy9saWJzLgorICBmaW5pc2hfZXZhbD0nZm9yIGxpYiBpbiBgbHMgJGxpYmRpci8qLml4bGlicmFyeSAyPi9kZXYvbnVsbGA7IGRvIGxpYm5hbWU9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAnXCcncyVeLiovXChbXi9dKlwpXC5peGxpYnJhcnkkJVwxJSdcJydgOyB0ZXN0ICRybSAvc3lzL2xpYnMvJHtsaWJuYW1lfV9peGxpYnJhcnkuYTsgJHNob3cgImNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEiOyBjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIHx8IGV4aXQgMTsgZG9uZScKKyAgOzsKKworYmVvcyopCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKKyAgc2hsaWJwYXRoX3Zhcj1MSUJSQVJZX1BBVEgKKyAgOzsKKworYnNkaTQqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL1gxMS9saWIgL3Vzci9jb250cmliL2xpYiAvbGliIC91c3IvbG9jYWwvbGliIgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgorICAjIHRoZSBkZWZhdWx0IGxkLnNvLmNvbmYgYWxzbyBjb250YWlucyAvdXNyL2NvbnRyaWIvbGliIGFuZAorICAjIC91c3IvWDExUjYvbGliICgvdXNyL1gxMSBpcyBhIGxpbmsgdG8gL3Vzci9YMTFSNiksIGJ1dCBsZXQgdXMgYWxsb3cKKyAgIyBsaWJ0b29sIHRvIGhhcmQtY29kZSB0aGVzZSBpbnRvIHByb2dyYW1zCisgIDs7CisKK2N5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgdmVyc2lvbl90eXBlPXdpbmRvd3MKKyAgc2hyZXh0X2NtZHM9Ii5kbGwiCisgIG5lZWRfdmVyc2lvbj1ubworICBuZWVkX2xpYl9wcmVmaXg9bm8KKworICBjYXNlICRHQ0MsJGhvc3Rfb3MgaW4KKyAgeWVzLGN5Z3dpbiogfCB5ZXMsbWluZ3cqIHwgeWVzLHB3MzIqKQorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuZGxsLmEnCisgICAgIyBETEwgaXMgaW5zdGFsbGVkIHRvICQobGliZGlyKS8uLi9iaW4gYnkgcG9zdGluc3RhbGxfY21kcworICAgIHBvc3RpbnN0YWxsX2NtZHM9J2Jhc2VfZmlsZT1gYmFzZW5hbWUgXCR7ZmlsZX1gfgorICAgICAgZGxwYXRoPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZGlyLydcJydcJHtiYXNlX2ZpbGV9J1wnJ2k7ZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxkaXI9JGRlc3RkaXIvYGRpcm5hbWUgXCRkbHBhdGhgfgorICAgICAgdGVzdCAtZCBcJGRsZGlyIHx8IG1rZGlyIC1wIFwkZGxkaXJ+CisgICAgICAkaW5zdGFsbF9wcm9nICRkaXIvJGRsbmFtZSBcJGRsZGlyLyRkbG5hbWUnCisgICAgcG9zdHVuaW5zdGFsbF9jbWRzPSdkbGRsbD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGZpbGU7IGVjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRscGF0aD0kZGlyL1wkZGxkbGx+CisgICAgICAgJHJtIFwkZGxwYXRoJworICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBjeWd3aW4qKQorICAgICAgIyBDeWd3aW4gRExMcyB1c2UgJ2N5ZycgcHJlZml4IHJhdGhlciB0aGFuICdsaWInCisgICAgICBzb25hbWVfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL2N5Zy8nYGBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliIC9saWIvdzMyYXBpIC9saWIgL3Vzci9sb2NhbC9saWIiCisgICAgICA7OworICAgIG1pbmd3KikKKyAgICAgICMgTWluR1cgRExMcyB1c2UgdHJhZGl0aW9uYWwgJ2xpYicgcHJlZml4CisgICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCBncmVwICJebGlicmFyaWVzOiIgfCAkU0VEIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICJzLD0vLC8sZyJgCisgICAgICBpZiBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8IGdyZXAgJztbYy16Qy1aXTovJyA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgICMgSXQgaXMgbW9zdCBwcm9iYWJseSBhIFdpbmRvd3MgZm9ybWF0IFBBVEggcHJpbnRlZCBieQorICAgICAgICAjIG1pbmd3IGdjYywgYnV0IHdlIGFyZSBydW5uaW5nIG9uIEN5Z3dpbi4gR2NjIHByaW50cyBpdHMgc2VhcmNoCisgICAgICAgICMgcGF0aCB3aXRoIDsgc2VwYXJhdG9ycywgYW5kIHdpdGggZHJpdmUgbGV0dGVycy4gV2UgY2FuIGhhbmRsZSB0aGUKKyAgICAgICAgIyBkcml2ZSBsZXR0ZXJzIChjeWd3aW4gZmlsZXV0aWxzIHVuZGVyc3RhbmRzIHRoZW0pLCBzbyBsZWF2ZSB0aGVtLAorICAgICAgICAjIGVzcGVjaWFsbHkgYXMgd2UgbWlnaHQgcGFzcyBmaWxlcyBmb3VuZCB0aGVyZSB0byBhIG1pbmd3IG9iamR1bXAsCisgICAgICAgICMgd2hpY2ggd291bGRuJ3QgdW5kZXJzdGFuZCBhIGN5Z3dpbmlmaWVkIHBhdGguIEFoaC4KKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgJ3MvOy8gL2cnYAorICAgICAgZWxzZQorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCisgICAgICBmaQorICAgICAgOzsKKyAgICBwdzMyKikKKyAgICAgICMgcHczMiBETExzIHVzZSAncHcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJworICAgICAgbGlicmFyeV9uYW1lc19zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvcHcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy8uLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKKyAgICAgIDs7CisgICAgZXNhYworICAgIDs7CisKKyAgKikKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9ICRsaWJuYW1lLmxpYicKKyAgICA7OworICBlc2FjCisgIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsZC5leGUnCisgICMgRklYTUU6IGZpcnN0IHdlIHNob3VsZCBzZWFyY2ggLiBhbmQgdGhlIGRpcmVjdG9yeSB0aGUgZXhlY3V0YWJsZSBpcyBpbgorICBzaGxpYnBhdGhfdmFyPVBBVEgKKyAgOzsKKworZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGR5bGQiCisgIHZlcnNpb25fdHlwZT1kYXJ3aW4KKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHt2ZXJzdWZmaXh9JHNoYXJlZF9leHQgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0ICR7bGlibmFtZX0kc2hhcmVkX2V4dCcKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0kc2hhcmVkX2V4dCcKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBzaGxpYnBhdGhfdmFyPURZTERfTElCUkFSWV9QQVRICisgIHNocmV4dF9jbWRzPSckKHRlc3QgLiRtb2R1bGUgPSAueWVzICYmIGVjaG8gLnNvIHx8IGVjaG8gLmR5bGliKScKKyAgIyBBcHBsZSdzIGdjYyBwcmludHMgJ2djYyAtcHJpbnQtc2VhcmNoLWRpcnMnIGRvZXNuJ3Qgb3BlcmF0ZSB0aGUgc2FtZS4KKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCB0ciAiXG4iICIkUEFUSF9TRVBBUkFUT1IiIHwgc2VkIC1lICdzL2xpYnJhcmllczovQGxpYnJhcmllczovJyB8IHRyICJAIiAiXG4iIHwgZ3JlcCAiXmxpYnJhcmllczoiIHwgc2VkIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICJzLD0vLC8sZyIgLWUgInMsJFBBVEhfU0VQQVJBVE9SLCAsZyIgLWUgInMsLiosJiAvbGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliLGciYAorICBlbHNlCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvbGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliJworICBmaQorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9sb2NhbC9saWIgL2xpYiAvdXNyL2xpYicKKyAgOzsKKworZGd1eCopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUkc2hhcmVkX2V4dCcKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworZnJlZWJzZDEqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCitrZnJlZWJzZCotZ251KQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBkeW5hbWljX2xpbmtlcj0nR05VIGxkLnNvJworICA7OworCitmcmVlYnNkKikKKyAgb2JqZm9ybWF0PWB0ZXN0IC14IC91c3IvYmluL29iamZvcm1hdCAmJiAvdXNyL2Jpbi9vYmpmb3JtYXQgfHwgZWNobyBhb3V0YAorICB2ZXJzaW9uX3R5cGU9ZnJlZWJzZC0kb2JqZm9ybWF0CisgIGNhc2UgJHZlcnNpb25fdHlwZSBpbgorICAgIGZyZWVic2QtZWxmKikKKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgICAgbmVlZF92ZXJzaW9uPW5vCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIDs7CisgICAgZnJlZWJzZC0qKQorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgICAgICBuZWVkX3ZlcnNpb249eWVzCisgICAgICA7OworICBlc2FjCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgZnJlZWJzZDIqKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICA7OworICBmcmVlYnNkMy4wMSogfCBmcmVlYnNkZWxmMy4wMSopCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICAqKSAjIGZyb20gMy4yIG9uCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIDs7CisgIGVzYWMKKyAgOzsKKworZ251KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR7bWFqb3J9ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK2hwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorICAjIEdpdmUgYSBzb25hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgbWFqb3IgdmVyc2lvbiBzbyB0aGF0IGRsZC5zbCByZWZ1c2VzIHRvCisgICMgbGluayBhZ2FpbnN0IG90aGVyIHZlcnNpb25zLgorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBjYXNlICIkaG9zdF9jcHUiIGluCisgIGlhNjQqKQorICAgIHNocmV4dF9jbWRzPScuc28nCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc28iCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzICMgVW5sZXNzICtub2VudnZhciBpcyBzcGVjaWZpZWQuCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBpZiB0ZXN0ICJYJEhQVVhfSUE2NF9NT0RFIiA9IFgzMjsgdGhlbgorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9ocHV4MzIgL3Vzci9sb2NhbC9saWIvaHB1eDMyIC91c3IvbG9jYWwvbGliIgorICAgIGVsc2UKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvaHB1eDY0IC91c3IvbG9jYWwvbGliL2hwdXg2NCIKKyAgICBmaQorICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKKyAgICA7OworICAgaHBwYSo2NCopCisgICAgIHNocmV4dF9jbWRzPScuc2wnCisgICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKKyAgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEggIyBIb3cgc2hvdWxkIHdlIGhhbmRsZSBTSExJQl9QQVRICisgICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMgIyBVbmxlc3MgK25vZW52dmFyIGlzIHNwZWNpZmllZC4KKyAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvcGEyMF82NCAvdXNyL2Njcy9saWIvcGEyMF82NCIKKyAgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYworICAgICA7OworICAgKikKKyAgICBzaHJleHRfY21kcz0nLnNsJworICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCisgICAgc2hsaWJwYXRoX3Zhcj1TSExJQl9QQVRICisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vICMgK3MgaXMgcmVxdWlyZWQgdG8gZW5hYmxlIFNITElCX1BBVEgKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIDs7CisgIGVzYWMKKyAgIyBIUC1VWCBydW5zICpyZWFsbHkqIHNsb3dseSB1bmxlc3Mgc2hhcmVkIGxpYnJhcmllcyBhcmUgbW9kZSA1NTUuCisgIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDU1NSAkbGliJworICA7OworCitpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorICBjYXNlICRob3N0X29zIGluCisgICAgbm9uc3RvcHV4KikgdmVyc2lvbl90eXBlPW5vbnN0b3B1eCA7OworICAgICopCisJaWYgdGVzdCAiJGx0X2N2X3Byb2dfZ251X2xkIiA9IHllczsgdGhlbgorCQl2ZXJzaW9uX3R5cGU9bGludXgKKwllbHNlCisJCXZlcnNpb25fdHlwZT1pcml4CisJZmkgOzsKKyAgZXNhYworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBpcml4NSogfCBub25zdG9wdXgqKQorICAgIGxpYnN1ZmY9IHNobGlic3VmZj0KKyAgICA7OworICAqKQorICAgIGNhc2UgJExEIGluICMgbGlidG9vbC5tNCB3aWxsIGFkZCBvbmUgb2YgdGhlc2Ugc3dpdGNoZXMgdG8gTEQKKyAgICAqLTMyfCoiLTMyICJ8Ki1tZWxmMzJic21pcHwqIi1tZWxmMzJic21pcCAiKQorICAgICAgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz0zMi1iaXQ7OworICAgICotbjMyfCoiLW4zMiAifCotbWVsZjMyYm1pcG4zMnwqIi1tZWxmMzJibWlwbjMyICIpCisgICAgICBsaWJzdWZmPTMyIHNobGlic3VmZj1OMzIgbGlibWFnaWM9TjMyOzsKKyAgICAqLTY0fCoiLTY0ICJ8Ki1tZWxmNjRibWlwfCoiLW1lbGY2NGJtaXAgIikKKyAgICAgIGxpYnN1ZmY9NjQgc2hsaWJzdWZmPTY0IGxpYm1hZ2ljPTY0LWJpdDs7CisgICAgKikgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz1uZXZlci1tYXRjaDs7CisgICAgZXNhYworICAgIDs7CisgIGVzYWMKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZJHtzaGxpYnN1ZmZ9X1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IC91c3IvbG9jYWwvbGliJHtsaWJzdWZmfSIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSIKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCisjIE5vIHNoYXJlZCBsaWIgc3VwcG9ydCBmb3IgTGludXggb2xkbGQsIGFvdXQsIG9yIGNvZmYuCitsaW51eCpvbGRsZCogfCBsaW51eCphb3V0KiB8IGxpbnV4KmNvZmYqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCisjIFRoaXMgbXVzdCBiZSBMaW51eCBFTEYuCitsaW51eCopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbiAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgIyBUaGlzIGltcGxpZXMgbm8gZmFzdF9pbnN0YWxsLCB3aGljaCBpcyB1bmFjY2VwdGFibGUuCisgICMgU29tZSByZXdvcmsgd2lsbCBiZSBuZWVkZWQgdG8gYWxsb3cgZm9yIGZhc3RfaW5zdGFsbAorICAjIGJlZm9yZSB0aGlzIGNhbiBiZSBlbmFibGVkLgorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisKKyAgIyBBcHBlbmQgbGQuc28uY29uZiBjb250ZW50cyB0byB0aGUgc2VhcmNoIHBhdGgKKyAgaWYgdGVzdCAtZiAvZXRjL2xkLnNvLmNvbmY7IHRoZW4KKyAgICBsdF9sZF9leHRyYT1gJFNFRCAtZSAncy86LFx0LyAvZztzLz1ePSokLy87cy89Xj0gKiAvIC9nJyAvZXRjL2xkLnNvLmNvbmYgfCB0ciAnXG4nICcgJ2AKKyAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAkbHRfbGRfZXh0cmEiCisgIGZpCisKKyAgIyBXZSB1c2VkIHRvIHRlc3QgZm9yIC9saWIvbGQuc28uMSBhbmQgZGlzYWJsZSBzaGFyZWQgbGlicmFyaWVzIG9uCisgICMgcG93ZXJwYywgYmVjYXVzZSBNa0xpbnV4IG9ubHkgc3VwcG9ydGVkIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB0aGUKKyAgIyBHTlUgZHluYW1pYyBsaW5rZXIuICBTaW5jZSB0aGlzIHdhcyBicm9rZW4gd2l0aCBjcm9zcyBjb21waWxlcnMsCisgICMgbW9zdCBwb3dlcnBjLWxpbnV4IGJveGVzIHN1cHBvcnQgZHluYW1pYyBsaW5raW5nIHRoZXNlIGRheXMgYW5kCisgICMgcGVvcGxlIGNhbiBhbHdheXMgLS1kaXNhYmxlLXNoYXJlZCwgdGhlIHRlc3Qgd2FzIHJlbW92ZWQsIGFuZCB3ZQorICAjIGFzc3VtZSB0aGUgR05VL0xpbnV4IGR5bmFtaWMgbGlua2VyIGlzIGluIHVzZS4KKyAgZHluYW1pY19saW5rZXI9J0dOVS9MaW51eCBsZC5zbycKKyAgOzsKKwora25ldGJzZCotZ251KQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBkeW5hbWljX2xpbmtlcj0nR05VIGxkLnNvJworICA7OworCituZXRic2QqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJworICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgKGEub3V0KSBsZC5zbycKKyAgZWxzZQorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIGxkLmVsZl9zbycKKyAgZmkKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK25ld3NvczYpCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICA7OworCitudG8tcW54KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgOzsKKworb3BlbmJzZCopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPXllcworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBvcGVuYnNkMi5bODldIHwgb3BlbmJzZDIuWzg5XS4qKQorCXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworCTs7CisgICAgICAqKQorCXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKwk7OworICAgICAgZXNhYworICBlbHNlCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBmaQorICA7OworCitvczIqKQorICBsaWJuYW1lX3NwZWM9JyRuYW1lJworICBzaHJleHRfY21kcz0iLmRsbCIKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9ICRsaWJuYW1lLmEnCisgIGR5bmFtaWNfbGlua2VyPSdPUy8yIGxkLmV4ZScKKyAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisgIDs7CisKK29zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgdmVyc2lvbl90eXBlPW9zZgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3Ivc2hsaWIgL3Vzci9jY3MvbGliIC91c3IvbGliL2NtcGxycy9jYyAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiAvdmFyL3NobGliIgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIKKyAgOzsKKworc2NvMy4ydjUqKQorICB2ZXJzaW9uX3R5cGU9b3NmCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCitzb2xhcmlzKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAjIGxkZCBjb21wbGFpbnMgdW5sZXNzIGxpYnJhcmllcyBhcmUgZXhlY3V0YWJsZQorICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCAreCAkbGliJworICA7OworCitzdW5vczQqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovdXNyL2V0YyIgbGRjb25maWcgJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgbmVlZF9saWJfcHJlZml4PW5vCisgIGZpCisgIG5lZWRfdmVyc2lvbj15ZXMKKyAgOzsKKworc3lzdjQgfCBzeXN2NC4ydXcyKiB8IHN5c3Y0LjMqIHwgc3lzdjUqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGNhc2UgJGhvc3RfdmVuZG9yIGluCisgICAgc25pKQorICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tQmxhcmdlZHluc3ltJworICAgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKyAgICAgIDs7CisgICAgc2llbWVucykKKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgOzsKKyAgICBtb3Rvcm9sYSkKKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgbmVlZF92ZXJzaW9uPW5vCisgICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL2xpYiAvdXNyL2xpYiAvdXNyL2Njcy9saWInCisgICAgICA7OworICBlc2FjCisgIDs7CisKK3N5c3Y0Kk1QKikKKyAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgorICAgIHZlcnNpb25fdHlwZT1saW51eAorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9LiR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9LiRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kbWFqb3InCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgZmkKKyAgOzsKKwordXRzNCopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKK2VzYWMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkZHluYW1pY19saW5rZXIiID4mNQorJGFzX2VjaG8gIiRkeW5hbWljX2xpbmtlciIgPiY2OyB9Cit0ZXN0ICIkZHluYW1pY19saW5rZXIiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtcy4uLiAiID4mNjsgfQoraGFyZGNvZGVfYWN0aW9uX0Y3Nz0KK2lmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3NyIgfHwgXAorICAgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIEY3NyIgfHwgXAorICAgdGVzdCAiWCRoYXJkY29kZV9hdXRvbWF0aWNfRjc3Ij0iWHllcyIgOyB0aGVuCisKKyAgIyBXZSBjYW4gaGFyZGNvZGUgbm9uLWV4aXN0YW50IGRpcmVjdG9yaWVzLgorICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0X0Y3NyIgIT0gbm8gJiYKKyAgICAgIyBJZiB0aGUgb25seSBtZWNoYW5pc20gdG8gYXZvaWQgaGFyZGNvZGluZyBpcyBzaGxpYnBhdGhfdmFyLCB3ZQorICAgICAjIGhhdmUgdG8gcmVsaW5rLCBvdGhlcndpc2Ugd2UgbWlnaHQgbGluayB3aXRoIGFuIGluc3RhbGxlZCBsaWJyYXJ5CisgICAgICMgd2hlbiB3ZSBzaG91bGQgYmUgbGlua2luZyB3aXRoIGEgeWV0LXRvLWJlLWluc3RhbGxlZCBvbmUKKyAgICAgIyMgdGVzdCAiJF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgRjc3KSIgIT0gbm8gJiYKKyAgICAgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0xfRjc3IiAhPSBubzsgdGhlbgorICAgICMgTGlua2luZyBhbHdheXMgaGFyZGNvZGVzIHRoZSB0ZW1wb3JhcnkgbGlicmFyeSBkaXJlY3RvcnkuCisgICAgaGFyZGNvZGVfYWN0aW9uX0Y3Nz1yZWxpbmsKKyAgZWxzZQorICAgICMgV2UgY2FuIGxpbmsgd2l0aG91dCBoYXJkY29kaW5nLCBhbmQgd2UgY2FuIGhhcmRjb2RlIG5vbmV4aXN0aW5nIGRpcnMuCisgICAgaGFyZGNvZGVfYWN0aW9uX0Y3Nz1pbW1lZGlhdGUKKyAgZmkKK2Vsc2UKKyAgIyBXZSBjYW5ub3QgaGFyZGNvZGUgYW55dGhpbmcsIG9yIGVsc2Ugd2UgY2FuIG9ubHkgaGFyZGNvZGUgZXhpc3RpbmcKKyAgIyBkaXJlY3Rvcmllcy4KKyAgaGFyZGNvZGVfYWN0aW9uX0Y3Nz11bnN1cHBvcnRlZAorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkaGFyZGNvZGVfYWN0aW9uX0Y3NyIgPiY1CiskYXNfZWNobyAiJGhhcmRjb2RlX2FjdGlvbl9GNzciID4mNjsgfQorCitpZiB0ZXN0ICIkaGFyZGNvZGVfYWN0aW9uX0Y3NyIgPSByZWxpbms7IHRoZW4KKyAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkCisgIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KK2VsaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgfHwKKyAgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm87IHRoZW4KKyAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3QgbmVjZXNzYXJ5CisgIGVuYWJsZV9mYXN0X2luc3RhbGw9bmVlZGxlc3MKK2ZpCisKK3N0cmlwbGliPQorb2xkX3N0cmlwbGliPQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHN0cmlwcGluZyBsaWJyYXJpZXMgaXMgcG9zc2libGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBzdHJpcHBpbmcgbGlicmFyaWVzIGlzIHBvc3NpYmxlLi4uICIgPiY2OyB9CitpZiB0ZXN0IC1uICIkU1RSSVAiICYmICRTVFJJUCAtViAyPiYxIHwgZ3JlcCAiR05VIHN0cmlwIiA+L2Rldi9udWxsOyB0aGVuCisgIHRlc3QgLXogIiRvbGRfc3RyaXBsaWIiICYmIG9sZF9zdHJpcGxpYj0iJFNUUklQIC0tc3RyaXAtZGVidWciCisgIHRlc3QgLXogIiRzdHJpcGxpYiIgJiYgc3RyaXBsaWI9IiRTVFJJUCAtLXN0cmlwLXVubmVlZGVkIgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorZWxzZQorIyBGSVhNRSAtIGluc2VydCBzb21lIHJlYWwgdGVzdHMsIGhvc3Rfb3MgaXNuJ3QgcmVhbGx5IGdvb2QgZW5vdWdoCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgIGRhcndpbiopCisgICAgICAgaWYgdGVzdCAtbiAiJFNUUklQIiA7IHRoZW4KKyAgICAgICAgIHN0cmlwbGliPSIkU1RSSVAgLXgiCisgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorICAgICAgIGVsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorICAgICAgIDs7CisgICAqKQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKyAgICA7OworICBlc2FjCitmaQorCisKKworIyBUaGUgZWxzZSBjbGF1c2Ugc2hvdWxkIG9ubHkgZmlyZSB3aGVuIGJvb3RzdHJhcHBpbmcgdGhlCisjIGxpYnRvb2wgZGlzdHJpYnV0aW9uLCBvdGhlcndpc2UgeW91IGZvcmdvdCB0byBzaGlwIGx0bWFpbi5zaAorIyB3aXRoIHlvdXIgcGFja2FnZSwgYW5kIHlvdSB3aWxsIGdldCBjb21wbGFpbnRzIHRoYXQgdGhlcmUgYXJlCisjIG5vIHJ1bGVzIHRvIGdlbmVyYXRlIGx0bWFpbi5zaC4KK2lmIHRlc3QgLWYgIiRsdG1haW4iOyB0aGVuCisgICMgU2VlIGlmIHdlIGFyZSBydW5uaW5nIG9uIHpzaCwgYW5kIHNldCB0aGUgb3B0aW9ucyB3aGljaCBhbGxvdyBvdXIgY29tbWFuZHMgdGhyb3VnaAorICAjIHdpdGhvdXQgcmVtb3ZhbCBvZiBcIGVzY2FwZXMuCisgIGlmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgOyB0aGVuCisgICAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKKyAgZmkKKyAgIyBOb3cgcXVvdGUgYWxsIHRoZSB0aGluZ3MgdGhhdCBtYXkgY29udGFpbiBtZXRhY2hhcmFjdGVycyB3aGlsZSBiZWluZworICAjIGNhcmVmdWwgbm90IHRvIG92ZXJxdW90ZSB0aGUgQUNfU1VCU1RlZCB2YWx1ZXMuICBXZSB0YWtlIGNvcGllcyBvZiB0aGUKKyAgIyB2YXJpYWJsZXMgYW5kIHF1b3RlIHRoZSBjb3BpZXMgZm9yIGdlbmVyYXRpb24gb2YgdGhlIGxpYnRvb2wgc2NyaXB0LgorICBmb3IgdmFyIGluIGVjaG8gb2xkX0NDIG9sZF9DRkxBR1MgQVIgQVJfRkxBR1MgRUdSRVAgUkFOTElCIExOX1MgTFRDQyBOTSBcCisgICAgU0VEIFNIRUxMIFNUUklQIFwKKyAgICBsaWJuYW1lX3NwZWMgbGlicmFyeV9uYW1lc19zcGVjIHNvbmFtZV9zcGVjIGV4dHJhY3RfZXhwc3ltc19jbWRzIFwKKyAgICBvbGRfc3RyaXBsaWIgc3RyaXBsaWIgZmlsZV9tYWdpY19jbWQgZmluaXNoX2NtZHMgZmluaXNoX2V2YWwgXAorICAgIGRlcGxpYnNfY2hlY2tfbWV0aG9kIHJlbG9hZF9mbGFnIHJlbG9hZF9jbWRzIG5lZWRfbG9ja3MgXAorICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wgXAorICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzIFwKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMgXAorICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzIG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMgXAorICAgIGNvbXBpbGVyX0Y3NyBcCisgICAgQ0NfRjc3IFwKKyAgICBMRF9GNzcgXAorICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfRjc3IFwKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzcgXAorICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3NyBcCisgICAgbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfRjc3IFwKKyAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3IFwKKyAgICB0aHJlYWRfc2FmZV9mbGFnX3NwZWNfRjc3IFwKKyAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19GNzcgXAorICAgIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfRjc3IFwKKyAgICBvbGRfYXJjaGl2ZV9jbWRzX0Y3NyBcCisgICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc19GNzcgXAorICAgIHByZWRlcF9vYmplY3RzX0Y3NyBcCisgICAgcG9zdGRlcF9vYmplY3RzX0Y3NyBcCisgICAgcHJlZGVwc19GNzcgXAorICAgIHBvc3RkZXBzX0Y3NyBcCisgICAgY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0Y3NyBcCisgICAgYXJjaGl2ZV9jbWRzX0Y3NyBcCisgICAgYXJjaGl2ZV9leHBzeW1fY21kc19GNzcgXAorICAgIHBvc3RpbnN0YWxsX2NtZHNfRjc3IFwKKyAgICBwb3N0dW5pbnN0YWxsX2NtZHNfRjc3IFwKKyAgICBvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc19GNzcgXAorICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3NyBcCisgICAgbm9fdW5kZWZpbmVkX2ZsYWdfRjc3IFwKKyAgICBleHBvcnRfc3ltYm9sc19jbWRzX0Y3NyBcCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzcgXAorICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfRjc3IFwKKyAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0Y3NyBcCisgICAgaGFyZGNvZGVfYXV0b21hdGljX0Y3NyBcCisgICAgbW9kdWxlX2NtZHNfRjc3IFwKKyAgICBtb2R1bGVfZXhwc3ltX2NtZHNfRjc3IFwKKyAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19GNzcgXAorICAgIGV4Y2x1ZGVfZXhwc3ltc19GNzcgXAorICAgIGluY2x1ZGVfZXhwc3ltc19GNzc7IGRvCisKKyAgICBjYXNlICR2YXIgaW4KKyAgICBvbGRfYXJjaGl2ZV9jbWRzX0Y3NyB8IFwKKyAgICBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzX0Y3NyB8IFwKKyAgICBhcmNoaXZlX2NtZHNfRjc3IHwgXAorICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3IHwgXAorICAgIG1vZHVsZV9jbWRzX0Y3NyB8IFwKKyAgICBtb2R1bGVfZXhwc3ltX2NtZHNfRjc3IHwgXAorICAgIG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzX0Y3NyB8IFwKKyAgICBleHBvcnRfc3ltYm9sc19jbWRzX0Y3NyB8IFwKKyAgICBleHRyYWN0X2V4cHN5bXNfY21kcyB8IHJlbG9hZF9jbWRzIHwgZmluaXNoX2NtZHMgfCBcCisgICAgcG9zdGluc3RhbGxfY21kcyB8IHBvc3R1bmluc3RhbGxfY21kcyB8IFwKKyAgICBvbGRfcG9zdGluc3RhbGxfY21kcyB8IG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMgfCBcCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIHwgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMpCisgICAgICAjIERvdWJsZS1xdW90ZSBkb3VibGUtZXZhbGVkIHN0cmluZ3MuCisgICAgICBldmFsICJsdF8kdmFyPVxcXCJcYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkZG91YmxlX3F1b3RlX3N1YnN0XCIgLWUgXCJcJHNlZF9xdW90ZV9zdWJzdFwiIC1lIFwiXCRkZWxheV92YXJpYWJsZV9zdWJzdFwiXGBcXFwiIgorICAgICAgOzsKKyAgICAqKQorICAgICAgZXZhbCAibHRfJHZhcj1cXFwiXGBcJGVjaG8gXCJYXCQkdmFyXCIgfCBcJFhzZWQgLWUgXCJcJHNlZF9xdW90ZV9zdWJzdFwiXGBcXFwiIgorICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKworICBjYXNlICRsdF9lY2hvIGluCisgIConXCQwIC0tZmFsbGJhY2stZWNobyInKQorICAgIGx0X2VjaG89YCRlY2hvICJYJGx0X2VjaG8iIHwgJFhzZWQgLWUgJ3MvXFxcXFxcXCQwIC0tZmFsbGJhY2stZWNobyIkLyQwIC0tZmFsbGJhY2stZWNobyIvJ2AKKyAgICA7OworICBlc2FjCisKK2NmZ2ZpbGU9IiRvZmlsZSIKKworICBjYXQgPDxfX0VPRl9fID4+ICIkY2ZnZmlsZSIKKyMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogJHRhZ25hbWUKKworIyBMaWJ0b29sIHdhcyBjb25maWd1cmVkIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgorCisjIFNoZWxsIHRvIHVzZSB3aGVuIGludm9raW5nIHNoZWxsIHNjcmlwdHMuCitTSEVMTD0kbHRfU0hFTEwKKworIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLgorYnVpbGRfbGlidG9vbF9saWJzPSRlbmFibGVfc2hhcmVkCisKKyMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcy4KK2J1aWxkX29sZF9saWJzPSRlbmFibGVfc3RhdGljCisKKyMgV2hldGhlciBvciBub3QgdG8gYWRkIC1sYyBmb3IgYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4KK2J1aWxkX2xpYnRvb2xfbmVlZF9sYz0kYXJjaGl2ZV9jbWRzX25lZWRfbGNfRjc3CisKKyMgV2hldGhlciBvciBub3QgdG8gZGlzYWxsb3cgc2hhcmVkIGxpYnMgd2hlbiBydW50aW1lIGxpYnMgYXJlIHN0YXRpYworYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzPSRlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0Y3NworCisjIFdoZXRoZXIgb3Igbm90IHRvIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbi4KK2Zhc3RfaW5zdGFsbD0kZW5hYmxlX2Zhc3RfaW5zdGFsbAorCisjIFRoZSBob3N0IHN5c3RlbS4KK2hvc3RfYWxpYXM9JGhvc3RfYWxpYXMKK2hvc3Q9JGhvc3QKKworIyBBbiBlY2hvIHByb2dyYW0gdGhhdCBkb2VzIG5vdCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCitlY2hvPSRsdF9lY2hvCisKKyMgVGhlIGFyY2hpdmVyLgorQVI9JGx0X0FSCitBUl9GTEFHUz0kbHRfQVJfRkxBR1MKKworIyBBIEMgY29tcGlsZXIuCitMVENDPSRsdF9MVENDCisKKyMgQSBsYW5ndWFnZS1zcGVjaWZpYyBjb21waWxlci4KK0NDPSRsdF9jb21waWxlcl9GNzcKKworIyBJcyB0aGUgY29tcGlsZXIgdGhlIEdOVSBDIGNvbXBpbGVyPword2l0aF9nY2M9JEdDQ19GNzcKKworIyBBbiBFUkUgbWF0Y2hlci4KK0VHUkVQPSRsdF9FR1JFUAorCisjIFRoZSBsaW5rZXIgdXNlZCB0byBidWlsZCBsaWJyYXJpZXMuCitMRD0kbHRfTERfRjc3CisKKyMgV2hldGhlciB3ZSBuZWVkIGhhcmQgb3Igc29mdCBsaW5rcy4KK0xOX1M9JGx0X0xOX1MKKworIyBBIEJTRC1jb21wYXRpYmxlIG5tIHByb2dyYW0uCitOTT0kbHRfTk0KKworIyBBIHN5bWJvbCBzdHJpcHBpbmcgcHJvZ3JhbQorU1RSSVA9JGx0X1NUUklQCisKKyMgVXNlZCB0byBleGFtaW5lIGxpYnJhcmllcyB3aGVuIGZpbGVfbWFnaWNfY21kIGJlZ2lucyAiZmlsZSIKK01BR0lDX0NNRD0kTUFHSUNfQ01ECisKKyMgVXNlZCBvbiBjeWd3aW46IERMTCBjcmVhdGlvbiBwcm9ncmFtLgorRExMVE9PTD0iJERMTFRPT0wiCisKKyMgVXNlZCBvbiBjeWd3aW46IG9iamVjdCBkdW1wZXIuCitPQkpEVU1QPSIkT0JKRFVNUCIKKworIyBVc2VkIG9uIGN5Z3dpbjogYXNzZW1ibGVyLgorQVM9IiRBUyIKKworIyBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGVtcG9yYXJ5IGxpYnRvb2wgZmlsZXMuCitvYmpkaXI9JG9iamRpcgorCisjIEhvdyB0byBjcmVhdGUgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMuCityZWxvYWRfZmxhZz0kbHRfcmVsb2FkX2ZsYWcKK3JlbG9hZF9jbWRzPSRsdF9yZWxvYWRfY21kcworCisjIEhvdyB0byBwYXNzIGEgbGlua2VyIGZsYWcgdGhyb3VnaCB0aGUgY29tcGlsZXIuCit3bD0kbHRfbHRfcHJvZ19jb21waWxlcl93bF9GNzcKKworIyBPYmplY3QgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICJvIikuCitvYmpleHQ9IiRhY19vYmpleHQiCisKKyMgT2xkIGFyY2hpdmUgc3VmZml4IChub3JtYWxseSAiYSIpLgorbGliZXh0PSIkbGliZXh0IgorCisjIFNoYXJlZCBsaWJyYXJ5IHN1ZmZpeCAobm9ybWFsbHkgIi5zbyIpLgorc2hyZXh0X2NtZHM9JyRzaHJleHRfY21kcycKKworIyBFeGVjdXRhYmxlIGZpbGUgc3VmZml4IChub3JtYWxseSAiIikuCitleGVleHQ9IiRleGVleHQiCisKKyMgQWRkaXRpb25hbCBjb21waWxlciBmbGFncyBmb3IgYnVpbGRpbmcgbGlicmFyeSBvYmplY3RzLgorcGljX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfcGljX0Y3NworcGljX21vZGU9JHBpY19tb2RlCisKKyMgV2hhdCBpcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgYSBjb21tYW5kPworbWF4X2NtZF9sZW49JGx0X2N2X3N5c19tYXhfY21kX2xlbgorCisjIERvZXMgY29tcGlsZXIgc2ltdWx0YW5lb3VzbHkgc3VwcG9ydCAtYyBhbmQgLW8gb3B0aW9ucz8KK2NvbXBpbGVyX2Nfbz0kbHRfbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fRjc3CisKKyMgTXVzdCB3ZSBsb2NrIGZpbGVzIHdoZW4gZG9pbmcgY29tcGlsYXRpb24gPworbmVlZF9sb2Nrcz0kbHRfbmVlZF9sb2NrcworCisjIERvIHdlIG5lZWQgdGhlIGxpYiBwcmVmaXggZm9yIG1vZHVsZXM/CituZWVkX2xpYl9wcmVmaXg9JG5lZWRfbGliX3ByZWZpeAorCisjIERvIHdlIG5lZWQgYSB2ZXJzaW9uIGZvciBsaWJyYXJpZXM/CituZWVkX3ZlcnNpb249JG5lZWRfdmVyc2lvbgorCisjIFdoZXRoZXIgZGxvcGVuIGlzIHN1cHBvcnRlZC4KK2Rsb3Blbl9zdXBwb3J0PSRlbmFibGVfZGxvcGVuCisKKyMgV2hldGhlciBkbG9wZW4gb2YgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkLgorZGxvcGVuX3NlbGY9JGVuYWJsZV9kbG9wZW5fc2VsZgorCisjIFdoZXRoZXIgZGxvcGVuIG9mIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KK2Rsb3Blbl9zZWxmX3N0YXRpYz0kZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYworCisjIENvbXBpbGVyIGZsYWcgdG8gcHJldmVudCBkeW5hbWljIGxpbmtpbmcuCitsaW5rX3N0YXRpY19mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzcKKworIyBDb21waWxlciBmbGFnIHRvIHR1cm4gb2ZmIGJ1aWx0aW4gZnVuY3Rpb25zLgorbm9fYnVpbHRpbl9mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19GNzcKKworIyBDb21waWxlciBmbGFnIHRvIGFsbG93IHJlZmxleGl2ZSBkbG9wZW5zLgorZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPSRsdF9leHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3CisKKyMgQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSBzaGFyZWQgb2JqZWN0cyBkaXJlY3RseSBmcm9tIGFyY2hpdmVzLgord2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JGx0X3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0Y3NworCisjIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgdGhyZWFkLXNhZmUgb2JqZWN0cy4KK3RocmVhZF9zYWZlX2ZsYWdfc3BlYz0kbHRfdGhyZWFkX3NhZmVfZmxhZ19zcGVjX0Y3NworCisjIExpYnJhcnkgdmVyc2lvbmluZyB0eXBlLgordmVyc2lvbl90eXBlPSR2ZXJzaW9uX3R5cGUKKworIyBGb3JtYXQgb2YgbGlicmFyeSBuYW1lIHByZWZpeC4KK2xpYm5hbWVfc3BlYz0kbHRfbGlibmFtZV9zcGVjCisKKyMgTGlzdCBvZiBhcmNoaXZlIG5hbWVzLiAgRmlyc3QgbmFtZSBpcyB0aGUgcmVhbCBvbmUsIHRoZSByZXN0IGFyZSBsaW5rcy4KKyMgVGhlIGxhc3QgbmFtZSBpcyB0aGUgb25lIHRoYXQgdGhlIGxpbmtlciBmaW5kcyB3aXRoIC1sTkFNRS4KK2xpYnJhcnlfbmFtZXNfc3BlYz0kbHRfbGlicmFyeV9uYW1lc19zcGVjCisKKyMgVGhlIGNvZGVkIG5hbWUgb2YgdGhlIGxpYnJhcnksIGlmIGRpZmZlcmVudCBmcm9tIHRoZSByZWFsIG5hbWUuCitzb25hbWVfc3BlYz0kbHRfc29uYW1lX3NwZWMKKworIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGFuIG9sZC1zdHlsZSBhcmNoaXZlLgorUkFOTElCPSRsdF9SQU5MSUIKK29sZF9hcmNoaXZlX2NtZHM9JGx0X29sZF9hcmNoaXZlX2NtZHNfRjc3CitvbGRfcG9zdGluc3RhbGxfY21kcz0kbHRfb2xkX3Bvc3RpbnN0YWxsX2NtZHMKK29sZF9wb3N0dW5pbnN0YWxsX2NtZHM9JGx0X29sZF9wb3N0dW5pbnN0YWxsX2NtZHMKKworIyBDcmVhdGUgYW4gb2xkLXN0eWxlIGFyY2hpdmUgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgorb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc19GNzcKKworIyBDcmVhdGUgYSB0ZW1wb3Jhcnkgb2xkLXN0eWxlIGFyY2hpdmUgdG8gbGluayBpbnN0ZWFkIG9mIGEgc2hhcmVkIGFyY2hpdmUuCitvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfRjc3CisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhIHNoYXJlZCBhcmNoaXZlLgorYXJjaGl2ZV9jbWRzPSRsdF9hcmNoaXZlX2NtZHNfRjc3CithcmNoaXZlX2V4cHN5bV9jbWRzPSRsdF9hcmNoaXZlX2V4cHN5bV9jbWRzX0Y3NworcG9zdGluc3RhbGxfY21kcz0kbHRfcG9zdGluc3RhbGxfY21kcworcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9wb3N0dW5pbnN0YWxsX2NtZHMKKworIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGEgbG9hZGFibGUgbW9kdWxlIChhc3N1bWVkIHNhbWUgYXMgYWJvdmUgaWYgZW1wdHkpCittb2R1bGVfY21kcz0kbHRfbW9kdWxlX2NtZHNfRjc3Cittb2R1bGVfZXhwc3ltX2NtZHM9JGx0X21vZHVsZV9leHBzeW1fY21kc19GNzcKKworIyBDb21tYW5kcyB0byBzdHJpcCBsaWJyYXJpZXMuCitvbGRfc3RyaXBsaWI9JGx0X29sZF9zdHJpcGxpYgorc3RyaXBsaWI9JGx0X3N0cmlwbGliCisKKyMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKKyMgc2hhcmVkIGxpYnJhcnkuCitwcmVkZXBfb2JqZWN0cz0kbHRfcHJlZGVwX29iamVjdHNfRjc3CisKKyMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQorIyBzaGFyZWQgbGlicmFyeS4KK3Bvc3RkZXBfb2JqZWN0cz0kbHRfcG9zdGRlcF9vYmplY3RzX0Y3NworCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCisjIHNoYXJlZCBsaWJyYXJ5LgorcHJlZGVwcz0kbHRfcHJlZGVwc19GNzcKKworIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYWZ0ZXIgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCisjIHNoYXJlZCBsaWJyYXJ5LgorcG9zdGRlcHM9JGx0X3Bvc3RkZXBzX0Y3NworCisjIFRoZSBsaWJyYXJ5IHNlYXJjaCBwYXRoIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgY29tcGlsZXIgd2hlbiBsaW5raW5nCisjIGEgc2hhcmVkIGxpYnJhcnkuCitjb21waWxlcl9saWJfc2VhcmNoX3BhdGg9JGx0X2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9GNzcKKworIyBNZXRob2QgdG8gY2hlY2sgd2hldGhlciBkZXBlbmRlbnQgbGlicmFyaWVzIGFyZSBzaGFyZWQgb2JqZWN0cy4KK2RlcGxpYnNfY2hlY2tfbWV0aG9kPSRsdF9kZXBsaWJzX2NoZWNrX21ldGhvZAorCisjIENvbW1hbmQgdG8gdXNlIHdoZW4gZGVwbGlic19jaGVja19tZXRob2QgPT0gZmlsZV9tYWdpYy4KK2ZpbGVfbWFnaWNfY21kPSRsdF9maWxlX21hZ2ljX2NtZAorCisjIEZsYWcgdGhhdCBhbGxvd3Mgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHVuZGVmaW5lZCBzeW1ib2xzIHRvIGJlIGJ1aWx0LgorYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGx0X2FsbG93X3VuZGVmaW5lZF9mbGFnX0Y3NworCisjIEZsYWcgdGhhdCBmb3JjZXMgbm8gdW5kZWZpbmVkIHN5bWJvbHMuCitub191bmRlZmluZWRfZmxhZz0kbHRfbm9fdW5kZWZpbmVkX2ZsYWdfRjc3CisKKyMgQ29tbWFuZHMgdXNlZCB0byBmaW5pc2ggYSBsaWJ0b29sIGxpYnJhcnkgaW5zdGFsbGF0aW9uIGluIGEgZGlyZWN0b3J5LgorZmluaXNoX2NtZHM9JGx0X2ZpbmlzaF9jbWRzCisKKyMgU2FtZSBhcyBhYm92ZSwgYnV0IGEgc2luZ2xlIHNjcmlwdCBmcmFnbWVudCB0byBiZSBldmFsZWQgYnV0IG5vdCBzaG93bi4KK2ZpbmlzaF9ldmFsPSRsdF9maW5pc2hfZXZhbAorCisjIFRha2UgdGhlIG91dHB1dCBvZiBubSBhbmQgcHJvZHVjZSBhIGxpc3Rpbmcgb2YgcmF3IHN5bWJvbHMgYW5kIEMgbmFtZXMuCitnbG9iYWxfc3ltYm9sX3BpcGU9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUKKworIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIHByb3BlciBDIGRlY2xhcmF0aW9uCitnbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbAorCisjIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgQyBuYW1lIGFkZHJlc3MgcGFpcgorZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MKKworIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBydW50aW1lIHBhdGggdmFyaWFibGUuCitydW5wYXRoX3Zhcj0kcnVucGF0aF92YXIKKworIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBwYXRoIHZhcmlhYmxlLgorc2hsaWJwYXRoX3Zhcj0kc2hsaWJwYXRoX3ZhcgorCisjIElzIHNobGlicGF0aCBzZWFyY2hlZCBiZWZvcmUgdGhlIGhhcmQtY29kZWQgbGlicmFyeSBzZWFyY2ggcGF0aD8KK3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD0kc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoCisKKyMgSG93IHRvIGhhcmRjb2RlIGEgc2hhcmVkIGxpYnJhcnkgcGF0aCBpbnRvIGFuIGV4ZWN1dGFibGUuCitoYXJkY29kZV9hY3Rpb249JGhhcmRjb2RlX2FjdGlvbl9GNzcKKworIyBXaGV0aGVyIHdlIHNob3VsZCBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gbGlicmFyaWVzLgoraGFyZGNvZGVfaW50b19saWJzPSRoYXJkY29kZV9pbnRvX2xpYnMKKworIyBGbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8gYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuCisjIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcyBub3QgZXhpc3QuCitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSRsdF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3NworCisjIElmIGxkIGlzIHVzZWQgd2hlbiBsaW5raW5nLCBmbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8KKyMgYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcworIyBub3QgZXhpc3QuCitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkPSRsdF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0Y3NworCisjIFdoZXRoZXIgd2UgbmVlZCBhIHNpbmdsZSAtcnBhdGggZmxhZyB3aXRoIGEgc2VwYXJhdGVkIGFyZ3VtZW50LgoraGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0kbHRfaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9GNzcKKworIyBTZXQgdG8geWVzIGlmIHVzaW5nIERJUi9saWJOQU1FJHtzaGFyZWRfZXh0fSBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCisjIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9kaXJlY3Q9JGhhcmRjb2RlX2RpcmVjdF9GNzcKKworIyBTZXQgdG8geWVzIGlmIHVzaW5nIHRoZSAtTERJUiBmbGFnIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKKyMgcmVzdWx0aW5nIGJpbmFyeS4KK2hhcmRjb2RlX21pbnVzX0w9JGhhcmRjb2RlX21pbnVzX0xfRjc3CisKKyMgU2V0IHRvIHllcyBpZiB1c2luZyBTSExJQlBBVEhfVkFSPURJUiBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8KKyMgdGhlIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9zaGxpYnBhdGhfdmFyPSRoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3NworCisjIFNldCB0byB5ZXMgaWYgYnVpbGRpbmcgYSBzaGFyZWQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGhhcmRjb2RlcyBESVIgaW50byB0aGUgbGlicmFyeQorIyBhbmQgYWxsIHN1YnNlcXVlbnQgbGlicmFyaWVzIGFuZCBleGVjdXRhYmxlcyBsaW5rZWQgYWdhaW5zdCBpdC4KK2hhcmRjb2RlX2F1dG9tYXRpYz0kaGFyZGNvZGVfYXV0b21hdGljX0Y3NworCisjIFZhcmlhYmxlcyB3aG9zZSB2YWx1ZXMgc2hvdWxkIGJlIHNhdmVkIGluIGxpYnRvb2wgd3JhcHBlciBzY3JpcHRzIGFuZAorIyByZXN0b3JlZCBhdCByZWxpbmsgdGltZS4KK3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsiCisKKyMgV2hldGhlciBsaWJ0b29sIG11c3QgbGluayBhIHByb2dyYW0gYWdhaW5zdCBhbGwgaXRzIGRlcGVuZGVuY3kgbGlicmFyaWVzLgorbGlua19hbGxfZGVwbGlicz0kbGlua19hbGxfZGVwbGlic19GNzcKKworIyBDb21waWxlLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKK3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCisKKyMgUnVuLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKK3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRsdF9zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYworCisjIEZpeCB0aGUgc2hlbGwgdmFyaWFibGUgXCRzcmNmaWxlIGZvciB0aGUgY29tcGlsZXIuCitmaXhfc3JjZmlsZV9wYXRoPSIkZml4X3NyY2ZpbGVfcGF0aF9GNzciCisKKyMgU2V0IHRvIHllcyBpZiBleHBvcnRlZCBzeW1ib2xzIGFyZSByZXF1aXJlZC4KK2Fsd2F5c19leHBvcnRfc3ltYm9scz0kYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0Y3NworCisjIFRoZSBjb21tYW5kcyB0byBsaXN0IGV4cG9ydGVkIHN5bWJvbHMuCitleHBvcnRfc3ltYm9sc19jbWRzPSRsdF9leHBvcnRfc3ltYm9sc19jbWRzX0Y3NworCisjIFRoZSBjb21tYW5kcyB0byBleHRyYWN0IHRoZSBleHBvcnRlZCBzeW1ib2wgbGlzdCBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCitleHRyYWN0X2V4cHN5bXNfY21kcz0kbHRfZXh0cmFjdF9leHBzeW1zX2NtZHMKKworIyBTeW1ib2xzIHRoYXQgc2hvdWxkIG5vdCBiZSBsaXN0ZWQgaW4gdGhlIHByZWxvYWRlZCBzeW1ib2xzLgorZXhjbHVkZV9leHBzeW1zPSRsdF9leGNsdWRlX2V4cHN5bXNfRjc3CisKKyMgU3ltYm9scyB0aGF0IG11c3QgYWx3YXlzIGJlIGV4cG9ydGVkLgoraW5jbHVkZV9leHBzeW1zPSRsdF9pbmNsdWRlX2V4cHN5bXNfRjc3CisKKyMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lCisKK19fRU9GX18KKworCitlbHNlCisgICMgSWYgdGhlcmUgaXMgbm8gTWFrZWZpbGUgeWV0LCB3ZSByZWx5IG9uIGEgbWFrZSBydWxlIHRvIGV4ZWN1dGUKKyAgIyBgY29uZmlnLnN0YXR1cyAtLXJlY2hlY2snIHRvIHJlcnVuIHRoZXNlIHRlc3RzIGFuZCBjcmVhdGUgdGhlCisgICMgbGlidG9vbCBzY3JpcHQgdGhlbi4KKyAgbHRtYWluX2luPWBlY2hvICRsdG1haW4gfCBzZWQgLWUgJ3MvXC5zaCQvLmluLydgCisgIGlmIHRlc3QgLWYgIiRsdG1haW5faW4iOyB0aGVuCisgICAgdGVzdCAtZiBNYWtlZmlsZSAmJiBtYWtlICIkbHRtYWluIgorICBmaQorZmkKKworCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKK0NDPSIkbHRfc2F2ZV9DQyIKKworCWVsc2UKKwkgIHRhZ25hbWU9IiIKKwlmaQorCTs7CisKKyAgICAgIEdDSikKKwlpZiB0ZXN0IC1uICIkR0NKIiAmJiB0ZXN0ICJYJEdDSiIgIT0gIlhubyI7IHRoZW4KKworCisjIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgSmF2YSB0ZXN0IHNvdXJjZXMuCithY19leHQ9amF2YQorCisjIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgSmF2YSB0ZXN0IHNvdXJjZXMuCitvYmpleHQ9bworb2JqZXh0X0dDSj0kb2JqZXh0CisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCitsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9ImNsYXNzIGZvbyB7fVxuIgorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cworbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSdwdWJsaWMgY2xhc3MgY29uZnRlc3QgeyBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJndikge307IH1cbicKKworIyBsdG1haW4gb25seSB1c2VzICRDQyBmb3IgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHNvIG1ha2Ugc3VyZSAkQ0MgaXMgc2V0LgorCisjIElmIG5vIEMgY29tcGlsZXIgd2FzIHNwZWNpZmllZCwgdXNlIENDLgorTFRDQz0ke0xUQ0MtIiRDQyJ9CisKKyMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCitjb21waWxlcj0kQ0MKKworCisjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorbHRfc2F2ZV9DQz0iJENDIgorQ0M9JHtHQ0otImdjaiJ9Citjb21waWxlcj0kQ0MKK2NvbXBpbGVyX0dDSj0kQ0MKKworIyBHQ0ogZGlkIG5vdCBleGlzdCBhdCB0aGUgdGltZSBHQ0MgZGlkbid0IGltcGxpY2l0bHkgbGluayBsaWJjIGluLgorYXJjaGl2ZV9jbWRzX25lZWRfbGNfR0NKPW5vCisKKyMjIENBVkVBVCBFTVBUT1I6CisjIyBUaGVyZSBpcyBubyBlbmNhcHN1bGF0aW9uIHdpdGhpbiB0aGUgZm9sbG93aW5nIG1hY3JvcywgZG8gbm90IGNoYW5nZQorIyMgdGhlIHJ1bm5pbmcgb3JkZXIgb3Igb3RoZXJ3aXNlIG1vdmUgdGhlbSBhcm91bmQgdW5sZXNzIHlvdSBrbm93IGV4YWN0bHkKKyMjIHdoYXQgeW91IGFyZSBkb2luZy4uLgorCitsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19HQ0o9CisKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnX0dDSj0nIC1mbm8tYnVpbHRpbicKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2x0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnM9bm8KKyAgYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0CisgICBwcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorICAgbHRfY29tcGlsZXJfZmxhZz0iLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyIKKyAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCisgICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgorICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucworICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KKyAgICMgVGhlIG9wdGlvbiBpcyByZWZlcmVuY2VkIHZpYSBhIHZhcmlhYmxlIHRvIGF2b2lkIGNvbmZ1c2luZyBzZWQuCisgICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKKyAgIC1lICdzOi4qRkxBR1N9PyA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKKyAgIC1lICdzOiBbXiBdKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKKyAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCisgICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6MTY0MzQ6ICRsdF9jb21waWxlXCIiID4mNSkKKyAgIChldmFsICIkbHRfY29tcGlsZSIgMj5jb25mdGVzdC5lcnIpCisgICBhY19zdGF0dXM9JD8KKyAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgICBlY2hvICIkYXNfbWU6MTY0Mzg6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyAiJGFjX291dGZpbGUiOyB0aGVuCisgICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncworICAgICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnM9eWVzCisgICAgIGZpCisgICBmaQorICAgJHJtIGNvbmZ0ZXN0KgorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucyIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zIiA+JjY7IH0KKworaWYgdGVzdCB4IiRsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucyIgPSB4eWVzOyB0aGVuCisgICAgbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfR0NKPSIkbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfR0NKIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMiCitlbHNlCisgICAgOgorZmkKKworZmkKKworbHRfcHJvZ19jb21waWxlcl93bF9HQ0o9CitsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9CitsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9CisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRjb21waWxlciBvcHRpb24gdG8gcHJvZHVjZSBQSUMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRjb21waWxlciBvcHRpb24gdG8gcHJvZHVjZSBQSUMuLi4gIiA+JjY7IH0KKworICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfR0NKPSctV2wsJworICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0nLXN0YXRpYycKKworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeCopCisgICAgICAjIEFsbCBBSVggY29kZSBpcyBQSUMuCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctQnN0YXRpYycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYW1pZ2FvcyopCisgICAgICAjIEZJWE1FOiB3ZSBuZWVkIGF0IGxlYXN0IDY4MDIwIGNvZGUgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcywgYnV0CisgICAgICAjIGFkZGluZyB0aGUgYC1tNjgwMjAnIGZsYWcgdG8gR0NDIHByZXZlbnRzIGJ1aWxkaW5nIGFueXRoaW5nIGJldHRlciwKKyAgICAgICMgbGlrZSBgLW02ODA0MCcuCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Jy1tNjgwMjAgLXJlc2lkZW50MzIgLW1hbHdheXMtcmVzdG9yZS1hNCcKKyAgICAgIDs7CisKKyAgICBiZW9zKiB8IGN5Z3dpbiogfCBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqIHwgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIHRoZXNlIE9TZXMuCisgICAgICA7OworCisgICAgbWluZ3cqIHwgcHczMiogfCBvczIqKQorICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZworICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLURETExfRVhQT1JUJworICAgICAgOzsKKworICAgIGRhcndpbiogfCByaGFwc29keSopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBvbiB0aGlzIHBsYXRmb3JtCisgICAgICAjIENvbW1vbiBzeW1ib2xzIG5vdCBhbGxvd2VkIGluIE1IX0RZTElCIGZpbGVzCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Jy1mbm8tY29tbW9uJworICAgICAgOzsKKworICAgIG1zZG9zZGpncHAqKQorICAgICAgIyBKdXN0IGJlY2F1c2Ugd2UgdXNlIEdDQyBkb2Vzbid0IG1lYW4gd2Ugc3VkZGVubHkgZ2V0IHNoYXJlZCBsaWJyYXJpZXMKKyAgICAgICMgb24gc3lzdGVtcyB0aGF0IGRvbid0IHN1cHBvcnQgdGhlbS4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZF9HQ0o9bm8KKyAgICAgIGVuYWJsZV9zaGFyZWQ9bm8KKyAgICAgIDs7CisKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCisJbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPS1LY29uZm9ybV9waWMKKyAgICAgIGZpCisgICAgICA7OworCisgICAgaHB1eCopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSUE2NCBIUC1VWCBhbmQgNjQtYml0IEhQLVVYLCBidXQKKyAgICAgICMgbm90IGZvciBQQSBIUC1VWC4KKyAgICAgIGNhc2UgIiRob3N0X2NwdSIgaW4KKyAgICAgIGhwcGEqNjQqfGlhNjQqKQorCSMgK1ogdGhlIGRlZmF1bHQKKwk7OworICAgICAgKikKKwlsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Jy1mUElDJworCTs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgKikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLWZQSUMnCisgICAgICA7OworICAgIGVzYWMKKyAgZWxzZQorICAgICMgUE9SVE1FIENoZWNrIGZvciBmbGFnIHRvIHBhc3MgbGlua2VyIGZsYWdzIHRocm91Z2ggdGhlIHN5c3RlbSBjb21waWxlci4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgYWl4KikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfR0NKPSctV2wsJworICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgorCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0nLUJzdGF0aWMnCisgICAgICBlbHNlCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctYm5zbyAtYkk6L2xpYi9zeXNjYWxscy5leHAnCisgICAgICBmaQorICAgICAgOzsKKworICAgIG1pbmd3KiB8IHB3MzIqIHwgb3MyKikKKyAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKKyAgICAgICMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Jy1ERExMX0VYUE9SVCcKKyAgICAgIDs7CisKKyAgICBocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfR0NKPSctV2wsJworICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIElBNjQgSFAtVVggYW5kIDY0LWJpdCBIUC1VWCwgYnV0CisgICAgICAjIG5vdCBmb3IgUEEgSFAtVVguCisgICAgICBjYXNlICIkaG9zdF9jcHUiIGluCisgICAgICBocHBhKjY0KnxpYTY0KikKKwkjICtaIHRoZSBkZWZhdWx0CisJOzsKKyAgICAgICopCisJbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPScrWicKKwk7OworICAgICAgZXNhYworICAgICAgIyBJcyB0aGVyZSBhIGJldHRlciBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyB0aGF0IHdvcmtzIHdpdGggdGhlIGJ1bmRsZWQgQ0M/CisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9JyR7d2x9LWEgJHt3bH1hcmNoaXZlJworICAgICAgOzsKKworICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nLVdsLCcKKyAgICAgICMgUElDICh3aXRoIC1LUElDKSBpcyB0aGUgZGVmYXVsdC4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0nLW5vbl9zaGFyZWQnCisgICAgICA7OworCisgICAgbmV3c29zNikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLUtQSUMnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIGxpbnV4KikKKyAgICAgIGNhc2UgJENDIGluCisgICAgICBpY2MqIHwgZWNjKikKKwlsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nLVdsLCcKKwlsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Jy1LUElDJworCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0nLXN0YXRpYycKKyAgICAgICAgOzsKKyAgICAgIGNjYyopCisgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfR0NKPSctV2wsJworICAgICAgICAjIEFsbCBBbHBoYSBjb2RlIGlzIFBJQy4KKyAgICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctbm9uX3NoYXJlZCcKKyAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nLVdsLCcKKyAgICAgICMgQWxsIE9TRi8xIGNvZGUgaXMgUElDLgorICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctbm9uX3NoYXJlZCcKKyAgICAgIDs7CisKKyAgICBzY28zLjJ2NSopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Jy1LcGljJworICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctZG4nCisgICAgICA7OworCisgICAgc29sYXJpcyopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nLVdsLCcKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLUtQSUMnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIHN1bm9zNCopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nLVFvcHRpb24gbGQgJworICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSctUElDJworICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICBzeXN2NCB8IHN5c3Y0LjJ1dzIqIHwgc3lzdjQuMyogfCBzeXN2NSopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nLVdsLCcKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLUtQSUMnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIHN5c3Y0Kk1QKikKKyAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KKwlsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Jy1LY29uZm9ybV9waWMnCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctQnN0YXRpYycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgdXRzNCopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Jy1waWMnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgICopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWRfR0NKPW5vCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0oiID4mNQorJGFzX2VjaG8gIiRsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0oiID4mNjsgfQorCisjCisjIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgUElDIGZsYWcgYWN0dWFsbHkgd29ya3MuCisjCitpZiB0ZXN0IC1uICIkbHRfcHJvZ19jb21waWxlcl9waWNfR0NKIjsgdGhlbgorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRjb21waWxlciBQSUMgZmxhZyAkbHRfcHJvZ19jb21waWxlcl9waWNfR0NKIHdvcmtzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmICRjb21waWxlciBQSUMgZmxhZyAkbHRfcHJvZ19jb21waWxlcl9waWNfR0NKIHdvcmtzLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2x0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0dDSitzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0dDSj1ubworICBhY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKKyAgIHByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisgICBsdF9jb21waWxlcl9mbGFnPSIkbHRfcHJvZ19jb21waWxlcl9waWNfR0NKIgorICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKKyAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCisgICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCisgICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgorICAgIyBUaGUgb3B0aW9uIGlzIHJlZmVyZW5jZWQgdmlhIGEgdmFyaWFibGUgdG8gYXZvaWQgY29uZnVzaW5nIHNlZC4KKyAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAorICAgLWUgJ3M6LipGTEFHU30/IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAorICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZToxNjY2NzogJGx0X2NvbXBpbGVcIiIgPiY1KQorICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPmNvbmZ0ZXN0LmVycikKKyAgIGFjX3N0YXR1cz0kPworICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgIGVjaG8gIiRhc19tZToxNjY3MTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zICIkYWNfb3V0ZmlsZSI7IHRoZW4KKyAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCisgICAgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19HQ0o9eWVzCisgICAgIGZpCisgICBmaQorICAgJHJtIGNvbmZ0ZXN0KgorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19HQ0oiID4mNQorJGFzX2VjaG8gIiRsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19HQ0oiID4mNjsgfQorCitpZiB0ZXN0IHgiJGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0dDSiIgPSB4eWVzOyB0aGVuCisgICAgY2FzZSAkbHRfcHJvZ19jb21waWxlcl9waWNfR0NKIGluCisgICAgICIiIHwgIiAiKikgOzsKKyAgICAgKikgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSIgJGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSiIgOzsKKyAgICAgZXNhYworZWxzZQorICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0KKyAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkX0dDSj1ubworZmkKKworZmkKK2Nhc2UgIiRob3N0X29zIiBpbgorICAjIEZvciBwbGF0Zm9ybXMgd2hpY2ggZG8gbm90IHN1cHBvcnQgUElDLCAtRFBJQyBpcyBtZWFuaW5nbGVzczoKKyAgKmRqZ3BwKikKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9CisgICAgOzsKKyAgKikKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9IiRsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0oiCisgICAgOzsKK2VzYWMKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7bHRfY3ZfcHJvZ19jb21waWxlcl9jX29fR0NKK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fR0NKPW5vCisgICAkcm0gLXIgY29uZnRlc3QgMj4vZGV2L251bGwKKyAgIG1rZGlyIGNvbmZ0ZXN0CisgICBjZCBjb25mdGVzdAorICAgbWtkaXIgb3V0CisgICBwcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorCisgICBsdF9jb21waWxlcl9mbGFnPSItbyBvdXQvY29uZnRlc3QyLiRhY19vYmpleHQiCisgICAjIEluc2VydCB0aGUgb3B0aW9uIGVpdGhlciAoMSkgYWZ0ZXIgdGhlIGxhc3QgKkZMQUdTIHZhcmlhYmxlLCBvcgorICAgIyAoMikgYmVmb3JlIGEgd29yZCBjb250YWluaW5nICJjb25mdGVzdC4iLCBvciAoMykgYXQgdGhlIGVuZC4KKyAgICMgTm90ZSB0aGF0ICRhY19jb21waWxlIGl0c2VsZiBkb2VzIG5vdCBjb250YWluIGJhY2tzbGFzaGVzIGFuZCBiZWdpbnMKKyAgICMgd2l0aCBhIGRvbGxhciBzaWduIChub3QgYSBoeXBoZW4pLCBzbyB0aGUgZWNobyBzaG91bGQgd29yayBjb3JyZWN0bHkuCisgICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKKyAgIC1lICdzOi4qRkxBR1N9PyA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKKyAgIC1lICdzOiBbXiBdKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKKyAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCisgICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6MTY3Mjc6ICRsdF9jb21waWxlXCIiID4mNSkKKyAgIChldmFsICIkbHRfY29tcGlsZSIgMj5vdXQvY29uZnRlc3QuZXJyKQorICAgYWNfc3RhdHVzPSQ/CisgICBjYXQgb3V0L2NvbmZ0ZXN0LmVyciA+JjUKKyAgIGVjaG8gIiRhc19tZToxNjczMTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zIG91dC9jb25mdGVzdDIuJGFjX29iamV4dAorICAgdGhlbgorICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKKyAgICAgaWYgdGVzdCAhIC1zIG91dC9jb25mdGVzdC5lcnI7IHRoZW4KKyAgICAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19HQ0o9eWVzCisgICAgIGZpCisgICBmaQorICAgY2htb2QgdSt3IC4KKyAgICRybSBjb25mdGVzdCoKKyAgICMgU0dJIEMrKyBjb21waWxlciB3aWxsIGNyZWF0ZSBkaXJlY3Rvcnkgb3V0L2lpX2ZpbGVzLyBmb3IKKyAgICMgdGVtcGxhdGUgaW5zdGFudGlhdGlvbgorICAgdGVzdCAtZCBvdXQvaWlfZmlsZXMgJiYgJHJtIG91dC9paV9maWxlcy8qICYmIHJtZGlyIG91dC9paV9maWxlcworICAgJHJtIG91dC8qICYmIHJtZGlyIG91dAorICAgY2QgLi4KKyAgIHJtZGlyIGNvbmZ0ZXN0CisgICAkcm0gY29uZnRlc3QqCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0dDSiIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0dDSiIgPiY2OyB9CisKKworaGFyZF9saW5rcz0ibm90dGVzdGVkIgoraWYgdGVzdCAiJGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0dDSiIgPSBubyAmJiB0ZXN0ICIkbmVlZF9sb2NrcyIgIT0gbm87IHRoZW4KKyAgIyBkbyBub3Qgb3ZlcndyaXRlIHRoZSB2YWx1ZSBvZiBuZWVkX2xvY2tzIHByb3ZpZGVkIGJ5IHRoZSB1c2VyCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgd2UgY2FuIGxvY2sgd2l0aCBoYXJkIGxpbmtzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmIHdlIGNhbiBsb2NrIHdpdGggaGFyZCBsaW5rcy4uLiAiID4mNjsgfQorICBoYXJkX2xpbmtzPXllcworICAkcm0gY29uZnRlc3QqCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCisgIHRvdWNoIGNvbmZ0ZXN0LmEKKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+JjUgfHwgaGFyZF9saW5rcz1ubworICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGhhcmRfbGlua3MiID4mNQorJGFzX2VjaG8gIiRoYXJkX2xpbmtzIiA+JjY7IH0KKyAgaWYgdGVzdCAiJGhhcmRfbGlua3MiID0gbm87IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IFxgJENDJyBkb2VzIG5vdCBzdXBwb3J0IFxgLWMgLW8nLCBzbyBcYG1ha2UgLWonIG1heSBiZSB1bnNhZmUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogXGAkQ0MnIGRvZXMgbm90IHN1cHBvcnQgXGAtYyAtbycsIHNvIFxgbWFrZSAtaicgbWF5IGJlIHVuc2FmZSIgPiYyO30KKyAgICBuZWVkX2xvY2tzPXdhcm4KKyAgZmkKK2Vsc2UKKyAgbmVlZF9sb2Nrcz1ubworZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSAkY29tcGlsZXIgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLi4uICIgPiY2OyB9CisKKyAgcnVucGF0aF92YXI9CisgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj0KKyAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19HQ0o9bm8KKyAgYXJjaGl2ZV9jbWRzX0dDSj0KKyAgYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9CisgIG9sZF9hcmNoaXZlX0Zyb21fbmV3X2NtZHNfR0NKPQorICBvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc19HQ0o9CisgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19HQ0o9CisgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0dDSj0KKyAgdGhyZWFkX3NhZmVfZmxhZ19zcGVjX0dDSj0KKyAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9CisgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfR0NKPQorICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0dDSj0KKyAgaGFyZGNvZGVfZGlyZWN0X0dDSj1ubworICBoYXJkY29kZV9taW51c19MX0dDSj1ubworICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj11bnN1cHBvcnRlZAorICBsaW5rX2FsbF9kZXBsaWJzX0dDSj11bmtub3duCisgIGhhcmRjb2RlX2F1dG9tYXRpY19HQ0o9bm8KKyAgbW9kdWxlX2NtZHNfR0NKPQorICBtb2R1bGVfZXhwc3ltX2NtZHNfR0NKPQorICBhbHdheXNfZXhwb3J0X3N5bWJvbHNfR0NKPW5vCisgIGV4cG9ydF9zeW1ib2xzX2NtZHNfR0NKPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisgICMgaW5jbHVkZV9leHBzeW1zIHNob3VsZCBiZSBhIGxpc3Qgb2Ygc3BhY2Utc2VwYXJhdGVkIHN5bWJvbHMgdG8gYmUgKmFsd2F5cyoKKyAgIyBpbmNsdWRlZCBpbiB0aGUgc3ltYm9sIGxpc3QKKyAgaW5jbHVkZV9leHBzeW1zX0dDSj0KKyAgIyBleGNsdWRlX2V4cHN5bXMgY2FuIGJlIGFuIGV4dGVuZGVkIHJlZ2V4cCBvZiBzeW1ib2xzIHRvIGV4Y2x1ZGUKKyAgIyBpdCB3aWxsIGJlIHdyYXBwZWQgYnkgYCAoJyBhbmQgYCkkJywgc28gb25lIG11c3Qgbm90IG1hdGNoIGJlZ2lubmluZyBvcgorICAjIGVuZCBvZiBsaW5lLiAgRXhhbXBsZTogYGF8YmN8LipkLionIHdpbGwgZXhjbHVkZSB0aGUgc3ltYm9scyBgYScgYW5kIGBiYycsCisgICMgYXMgd2VsbCBhcyBhbnkgc3ltYm9sIHRoYXQgY29udGFpbnMgYGQnLgorICBleGNsdWRlX2V4cHN5bXNfR0NKPSJfR0xPQkFMX09GRlNFVF9UQUJMRV8iCisgICMgQWx0aG91Z2ggX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGlzIGEgdmFsaWQgc3ltYm9sIEMgbmFtZSwgbW9zdCBhLm91dAorICAjIHBsYXRmb3JtcyAoYWIpdXNlIGl0IGluIFBJQyBjb2RlLCBidXQgdGhlaXIgbGlua2VycyBnZXQgY29uZnVzZWQgaWYKKyAgIyB0aGUgc3ltYm9sIGlzIGV4cGxpY2l0bHkgcmVmZXJlbmNlZC4gIFNpbmNlIHBvcnRhYmxlIGNvZGUgY2Fubm90CisgICMgcmVseSBvbiB0aGlzIHN5bWJvbCBuYW1lLCBpdCdzIHByb2JhYmx5IGZpbmUgdG8gbmV2ZXIgaW5jbHVkZSBpdCBpbgorICAjIHByZWxvYWRlZCBzeW1ib2wgdGFibGVzLgorICBleHRyYWN0X2V4cHN5bXNfY21kcz0KKworICBjYXNlICRob3N0X29zIGluCisgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgICAjIEZJWE1FOiB0aGUgTVNWQysrIHBvcnQgaGFzbid0IGJlZW4gdGVzdGVkIGluIGEgbG9vb29uZyB0aW1lCisgICAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKKyAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgorICAgIGlmIHRlc3QgIiRHQ0MiICE9IHllczsgdGhlbgorICAgICAgd2l0aF9nbnVfbGQ9bm8KKyAgICBmaQorICAgIDs7CisgIG9wZW5ic2QqKQorICAgIHdpdGhfZ251X2xkPW5vCisgICAgOzsKKyAgZXNhYworCisgIGxkX3NobGlic19HQ0o9eWVzCisgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICAjIElmIGFyY2hpdmVfY21kcyBydW5zIExELCBub3QgQ0MsIHdsYXJjIHNob3VsZCBiZSBlbXB0eQorICAgIHdsYXJjPScke3dsfScKKworICAgICMgU2VlIGlmIEdOVSBsZCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgzKiB8IGFpeDQqIHwgYWl4NSopCisgICAgICAjIE9uIEFJWC9QUEMsIHRoZSBHTlUgbGlua2VyIGlzIHZlcnkgYnJva2VuCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQ7IHRoZW4KKwlsZF9zaGxpYnNfR0NKPW5vCisJY2F0IDw8RU9GIDE+JjIKKworKioqIFdhcm5pbmc6IHRoZSBHTlUgbGlua2VyLCBhdCBsZWFzdCB1cCB0byByZWxlYXNlIDIuOS4xLCBpcyByZXBvcnRlZAorKioqIHRvIGJlIHVuYWJsZSB0byByZWxpYWJseSBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBBSVguCisqKiogVGhlcmVmb3JlLCBsaWJ0b29sIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBJZiB5b3UKKyoqKiByZWFsbHkgY2FyZSBmb3Igc2hhcmVkIGxpYnJhcmllcywgeW91IG1heSB3YW50IHRvIG1vZGlmeSB5b3VyIFBBVEgKKyoqKiBzbyB0aGF0IGEgbm9uLUdOVSBsaW5rZXIgaXMgZm91bmQsIGFuZCB0aGVuIHJlc3RhcnQuCisKK0VPRgorICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBhbWlnYW9zKikKKyAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRybSAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiAkQVJfRkxBR1MgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvdXRwdXRfb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nLUwkbGliZGlyJworICAgICAgaGFyZGNvZGVfbWludXNfTF9HQ0o9eWVzCisKKyAgICAgICMgU2FtdWVsIEEuIEZhbHZvIElJIDxrYzV0amFAZG9scGhpbi5vcGVucHJvamVjdHMubmV0PiByZXBvcnRzCisgICAgICAjIHRoYXQgdGhlIHNlbWFudGljcyBvZiBkeW5hbWljIGxpYnJhcmllcyBvbiBBbWlnYU9TLCBhdCBsZWFzdCB1cAorICAgICAgIyB0byB2ZXJzaW9uIDQsIGlzIHRvIHNoYXJlIGRhdGEgYW1vbmcgbXVsdGlwbGUgcHJvZ3JhbXMgbGlua2VkCisgICAgICAjIHdpdGggdGhlIHNhbWUgZHluYW1pYyBsaWJyYXJ5LiAgU2luY2UgdGhpcyBkb2Vzbid0IG1hdGNoIHRoZQorICAgICAgIyBiZWhhdmlvciBvZiBzaGFyZWQgbGlicmFyaWVzIG9uIG90aGVyIHBsYXRmb3Jtcywgd2UgY2FuJ3QgdXNlCisgICAgICAjIHRoZW0uCisgICAgICBsZF9zaGxpYnNfR0NKPW5vCisgICAgICA7OworCisgICAgYmVvcyopCisgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwlhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9dW5zdXBwb3J0ZWQKKwkjIEpvc2VwaCBCZWNrZW5iYWNoIDxqcmIzQGJlc3QuY29tPiBzYXlzIHNvbWUgcmVsZWFzZXMgb2YgZ2NjCisJIyBzdXBwb3J0IC0tdW5kZWZpbmVkLiAgVGhpcyBkZXNlcnZlcyBzb21lIGludmVzdGlnYXRpb24uICBGSVhNRQorCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtbm9zdGFydCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlsZF9zaGxpYnNfR0NKPW5vCisgICAgICBmaQorICAgICAgOzsKKworICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgICAgICMgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCBHQ0opIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLAorICAgICAgIyBhcyB0aGVyZSBpcyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSctTCRsaWJkaXInCisgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9dW5zdXBwb3J0ZWQKKyAgICAgIGFsd2F5c19leHBvcnRfc3ltYm9sc19HQ0o9bm8KKyAgICAgIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfR0NKPXllcworICAgICAgZXhwb3J0X3N5bWJvbHNfY21kc19HQ0o9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAtZSAnXCcnL15bQkNER1NdIC9zLy4qIFwoW14gXSpcKS9cMSBEQVRBLydcJycgfCAkU0VEIC1lICdcJycvXltBSVRXXSAvcy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKKworICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnYXV0by1pbXBvcnQnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1pbWFnZS1iYXNlPTB4MTAwMDAwMDAgJHt3bH0tLW91dC1pbXBsaWIsJGxpYicKKwkjIElmIHRoZSBleHBvcnQtc3ltYm9scyBmaWxlIGFscmVhZHkgaXMgYSAuZGVmIGZpbGUgKDFzdCBsaW5lCisJIyBpcyBFWFBPUlRTKSwgdXNlIGl0IGFzIGlzOyBvdGhlcndpc2UsIHByZXBlbmQuLi4KKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0naWYgdGVzdCAieGAkU0VEIDFxICRleHBvcnRfc3ltYm9sc2AiID0geEVYUE9SVFM7IHRoZW4KKwkgIGNwICRleHBvcnRfc3ltYm9scyAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKwllbHNlCisJICBlY2hvIEVYUE9SVFMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKwkgIGNhdCAkZXhwb3J0X3N5bWJvbHMgPj4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJZml+CisJJENDIC1zaGFyZWQgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWYgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWltYWdlLWJhc2U9MHgxMDAwMDAwMCAgJHt3bH0tLW91dC1pbXBsaWIsJGxpYicKKyAgICAgIGVsc2UKKwlsZF9zaGxpYnM9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgbmV0YnNkKiB8IGtuZXRic2QqLWdudSkKKyAgICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKwlhcmNoaXZlX2NtZHNfR0NKPSckTEQgLUJzaGFyZWFibGUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtbyAkbGliJworCXdsYXJjPQorICAgICAgZWxzZQorCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCWFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKyAgICAgIGZpCisgICAgICA7OworCisgICAgc29sYXJpcyogfCBzeXN2NSopCisgICAgICBpZiAkTEQgLXYgMj4mMSB8IGdyZXAgJ0JGRCAyXC44JyA+IC9kZXYvbnVsbDsgdGhlbgorCWxkX3NobGlic19HQ0o9bm8KKwljYXQgPDxFT0YgMT4mMgorCisqKiogV2FybmluZzogVGhlIHJlbGVhc2VzIDIuOC4qIG9mIHRoZSBHTlUgbGlua2VyIGNhbm5vdCByZWxpYWJseQorKioqIGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIFNvbGFyaXMgc3lzdGVtcy4gIFRoZXJlZm9yZSwgbGlidG9vbAorKioqIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBXZSB1cmdlIHlvdSB0byB1cGdyYWRlIEdOVQorKioqIGJpbnV0aWxzIHRvIHJlbGVhc2UgMi45LjEgb3IgbmV3ZXIuICBBbm90aGVyIG9wdGlvbiBpcyB0byBtb2RpZnkKKyoqKiB5b3VyIFBBVEggb3IgY29tcGlsZXIgY29uZmlndXJhdGlvbiBzbyB0aGF0IHRoZSBuYXRpdmUgbGlua2VyIGlzCisqKiogdXNlZCwgYW5kIHRoZW4gcmVzdGFydC4KKworRU9GCisgICAgICBlbGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCWFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlsZF9zaGxpYnNfR0NKPW5vCisgICAgICBmaQorICAgICAgOzsKKworICAgIHN1bm9zNCopCisgICAgICBhcmNoaXZlX2NtZHNfR0NKPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgd2xhcmM9CisgICAgICBoYXJkY29kZV9kaXJlY3RfR0NKPXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KKyAgICAgIDs7CisKKyAgbGludXgqKQorICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgICB0bXBfYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlhcmNoaXZlX2NtZHNfR0NKPSIkdG1wX2FyY2hpdmVfY21kcyIKKyAgICAgIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz1ubworICAgICAgY2FzZSBgJExEIC12IDI+L2Rldi9udWxsYCBpbgorICAgICAgICAqXCAwMS4qIHwgKlwgMi5bMC05XS4qIHwgKlwgMi4xMC4qKSA7OyAjIGNhdGNoIHZlcnNpb25zIDwgMi4xMQorICAgICAgICAqXCAyLjExLjkzLjAuMlwgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OyAjIFJINy4zIC4uLgorICAgICAgICAqXCAyLjExLjkyLjAuMTJcICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsgIyBNYW5kcmFrZSA4LjIgLi4uCisgICAgICAgICpcIDIuMTEuKikgOzsgIyBvdGhlciAyLjExIHZlcnNpb25zCisgICAgICAgICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsKKyAgICAgIGVzYWMKKyAgICAgIGlmIHRlc3QgJHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZyA9IHllczsgdGhlbgorICAgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CitjYXQgJGV4cG9ydF9zeW1ib2xzIHwgc2VkIC1lICJzL1woLipcKS9cMTsvIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CiskZWNobyAibG9jYWw6ICo7IH07IiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisgICAgICAgICRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS12ZXJzaW9uLXNjcmlwdCAke3dsfSRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlciAtbyAkbGliJworICAgICAgZWxzZQorICAgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0iJHRtcF9hcmNoaXZlX2NtZHMiCisgICAgICBmaQorICAgICAgbGlua19hbGxfZGVwbGlic19HQ0o9bm8KKyAgICBlbHNlCisgICAgICBsZF9zaGxpYnNfR0NKPW5vCisgICAgZmkKKyAgICA7OworCisgICAgKikKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCWFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlsZF9zaGxpYnNfR0NKPW5vCisgICAgICBmaQorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBpZiB0ZXN0ICIkbGRfc2hsaWJzX0dDSiIgPSB5ZXM7IHRoZW4KKyAgICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nJHt3bH0tLXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKyAgICAgICMgYW5jaWVudCBHTlUgbGQgZGlkbid0IHN1cHBvcnQgLS13aG9sZS1hcmNoaXZlIGV0LiBhbC4KKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJ25vLXdob2xlLWFyY2hpdmUnID4gL2Rldi9udWxsOyB0aGVuCisgCXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0dDSj0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKKyAgICAgIGVsc2UKKyAgCXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0dDSj0KKyAgICAgIGZpCisgICAgZmkKKyAgZWxzZQorICAgICMgUE9SVE1FIGZpbGwgaW4gYSBkZXNjcmlwdGlvbiBvZiB5b3VyIHN5c3RlbSdzIGxpbmtlciAobm90IEdOVSBsZCkKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgYWl4MyopCisgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9dW5zdXBwb3J0ZWQKKyAgICAgIGFsd2F5c19leHBvcnRfc3ltYm9sc19HQ0o9eWVzCisgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nJExEIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtYkU6JGV4cG9ydF9zeW1ib2xzIC1UNTEyIC1INTEyIC1iTTpTUkV+JEFSICRBUl9GTEFHUyAkbGliICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCisgICAgICAjIE5vdGU6IHRoaXMgbGlua2VyIGhhcmRjb2RlcyB0aGUgZGlyZWN0b3JpZXMgaW4gTElCUEFUSCBpZiB0aGVyZQorICAgICAgIyBhcmUgbm8gZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGJ5IC1MLgorICAgICAgaGFyZGNvZGVfbWludXNfTF9HQ0o9eWVzCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAmJiB0ZXN0IC16ICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KKwkjIE5laXRoZXIgZGlyZWN0IGhhcmRjb2Rpbmcgbm9yIHN0YXRpYyBsaW5raW5nIGlzIHN1cHBvcnRlZCB3aXRoIGEKKwkjIGJyb2tlbiBjb2xsZWN0Mi4KKwloYXJkY29kZV9kaXJlY3RfR0NKPXVuc3VwcG9ydGVkCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFpeDQqIHwgYWl4NSopCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgT24gSUE2NCwgdGhlIGxpbmtlciBkb2VzIHJ1biB0aW1lIGxpbmtpbmcgYnkgZGVmYXVsdCwgc28gd2UgZG9uJ3QKKwkjIGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC4KKwlhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCisJZXhwX3N5bV9mbGFnPSctQmV4cG9ydCcKKwlub19lbnRyeV9mbGFnPSIiCisgICAgICBlbHNlCisJIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gd2UgZG9uJ3Qgd2FudCB0aGUgIi1DIiBvcHRpb24uCisJIyAtQyBtZWFucyBkZW1hbmdsZSB0byBBSVggbm0sIGJ1dCBtZWFucyBkb24ndCBkZW1hbmdsZSB3aXRoIEdOVSBubQorCWlmICROTSAtViAyPiYxIHwgZ3JlcCAnR05VJyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgZXhwb3J0X3N5bWJvbHNfY21kc19HQ0o9JyROTSAtQnBnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJDIgPT0gIlQiKSB8fCAoXCQyID09ICJEIikgfHwgKFwkMiA9PSAiQiIpKSAmJiAoc3Vic3RyKFwkMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJworCWVsc2UKKwkgIGV4cG9ydF9zeW1ib2xzX2NtZHNfR0NKPSckTk0gLUJDcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkMiA9PSAiVCIpIHx8IChcJDIgPT0gIkQiKSB8fCAoXCQyID09ICJCIikpICYmIChzdWJzdHIoXCQzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJDMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCisJZmkKKwlhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCisKKwkjIFRlc3QgaWYgd2UgYXJlIHRyeWluZyB0byB1c2UgcnVuIHRpbWUgbGlua2luZyBvciBub3JtYWwKKwkjIEFJWCBzdHlsZSBsaW5raW5nLiBJZiAtYnJ0bCBpcyBzb21ld2hlcmUgaW4gTERGTEFHUywgd2UKKwkjIG5lZWQgdG8gZG8gcnVudGltZSBsaW5raW5nLgorCWNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bMjNdfGFpeDQuWzIzXS4qfGFpeDUqKQorCSAgZm9yIGxkX2ZsYWcgaW4gJExERkxBR1M7IGRvCisgIAkgIGlmICh0ZXN0ICRsZF9mbGFnID0gIi1icnRsIiB8fCB0ZXN0ICRsZF9mbGFnID0gIi1XbCwtYnJ0bCIpOyB0aGVuCisgIAkgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz15ZXMKKyAgCSAgICBicmVhaworICAJICBmaQorCSAgZG9uZQorCWVzYWMKKworCWV4cF9zeW1fZmxhZz0nLWJleHBvcnQnCisJbm9fZW50cnlfZmxhZz0nLWJub2VudHJ5JworICAgICAgZmkKKworICAgICAgIyBXaGVuIGxhcmdlIGV4ZWN1dGFibGVzIG9yIHNoYXJlZCBvYmplY3RzIGFyZSBidWlsdCwgQUlYIGxkIGNhbgorICAgICAgIyBoYXZlIHByb2JsZW1zIGNyZWF0aW5nIHRoZSB0YWJsZSBvZiBjb250ZW50cy4gIElmIGxpbmtpbmcgYSBsaWJyYXJ5CisgICAgICAjIG9yIHByb2dyYW0gcmVzdWx0cyBpbiAiZXJyb3IgVE9DIG92ZXJmbG93IiBhZGQgLW1taW5pbWFsLXRvYyB0bworICAgICAgIyBDWFhGTEFHUy9DRkxBR1MgZm9yIGcrKy9nY2MuICBJbiB0aGUgY2FzZXMgd2hlcmUgdGhhdCBpcyBub3QKKyAgICAgICMgZW5vdWdoIHRvIGZpeCB0aGUgcHJvYmxlbSwgYWRkIC1XbCwtYmJpZ3RvYyB0byBMREZMQUdTLgorCisgICAgICBhcmNoaXZlX2NtZHNfR0NKPScnCisgICAgICBoYXJkY29kZV9kaXJlY3RfR0NKPXllcworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9HQ0o9JzonCisgICAgICBsaW5rX2FsbF9kZXBsaWJzX0dDSj15ZXMKKworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwljYXNlICRob3N0X29zIGluIGFpeDQuMDEyfGFpeDQuMDEyLiopCisJIyBXZSBvbmx5IHdhbnQgdG8gZG8gdGhpcyBvbiBBSVggNC4yIGFuZCBsb3dlciwgdGhlIGNoZWNrCisJIyBiZWxvdyBmb3IgYnJva2VuIGNvbGxlY3QyIGRvZXNuJ3Qgd29yayB1bmRlciA0LjMrCisJICBjb2xsZWN0Mm5hbWU9YCR7Q0N9IC1wcmludC1wcm9nLW5hbWU9Y29sbGVjdDJgCisJICBpZiB0ZXN0IC1mICIkY29sbGVjdDJuYW1lIiAmJiBcCisgIAkgICBzdHJpbmdzICIkY29sbGVjdDJuYW1lIiB8IGdyZXAgcmVzb2x2ZV9saWJfbmFtZSA+L2Rldi9udWxsCisJICB0aGVuCisgIAkgICMgV2UgaGF2ZSByZXdvcmtlZCBjb2xsZWN0MgorICAJICBoYXJkY29kZV9kaXJlY3RfR0NKPXllcworCSAgZWxzZQorICAJICAjIFdlIGhhdmUgb2xkIGNvbGxlY3QyCisgIAkgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9dW5zdXBwb3J0ZWQKKyAgCSAgIyBJdCBmYWlscyB0byBmaW5kIHVuaW5zdGFsbGVkIGxpYnJhcmllcyB3aGVuIHRoZSB1bmluc3RhbGxlZAorICAJICAjIHBhdGggaXMgbm90IGxpc3RlZCBpbiB0aGUgbGlicGF0aC4gIFNldHRpbmcgaGFyZGNvZGVfbWludXNfTAorICAJICAjIHRvIHVuc3VwcG9ydGVkIGZvcmNlcyByZWxpbmtpbmcKKyAgCSAgaGFyZGNvZGVfbWludXNfTF9HQ0o9eWVzCisgIAkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSctTCRsaWJkaXInCisgIAkgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfR0NKPQorCSAgZmkKKwllc2FjCisJc2hhcmVkX2ZsYWc9Jy1zaGFyZWQnCisgICAgICBlbHNlCisJIyBub3QgdXNpbmcgZ2NjCisJaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKyAgCSMgVmlzdWFsQWdlIEMrKywgVmVyc2lvbiA1LjUgZm9yIEFJWCA1TCBmb3IgSUEtNjQsIEJldGEgMyBSZWxlYXNlCisgIAkjIGNob2tlcyBvbiAtV2wsLUcuIFRoZSBmb2xsb3dpbmcgbGluZSBpcyBjb3JyZWN0OgorCSAgc2hhcmVkX2ZsYWc9Jy1HJworCWVsc2UKKyAgCWlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSAgICBzaGFyZWRfZmxhZz0nJHt3bH0tRycKKwkgIGVsc2UKKwkgICAgc2hhcmVkX2ZsYWc9JyR7d2x9LWJNOlNSRScKKyAgCWZpCisJZmkKKyAgICAgIGZpCisKKyAgICAgICMgSXQgc2VlbXMgdGhhdCAtYmV4cGFsbCBkb2VzIG5vdCBleHBvcnQgc3ltYm9scyBiZWdpbm5pbmcgd2l0aAorICAgICAgIyB1bmRlcnNjb3JlIChfKSwgc28gaXQgaXMgYmV0dGVyIHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBzeW1ib2xzIHRvIGV4cG9ydC4KKyAgICAgIGFsd2F5c19leHBvcnRfc3ltYm9sc19HQ0o9eWVzCisgICAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKwkjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW50aW1lIGxvYWRpbmcgZmxhZ3MgKC1icnRsKSwKKwkjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPSctYmVyb2snCisgICAgICAgIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuIGVtcHR5IGV4ZWN1dGFibGUuCisgICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisKK2FpeF9saWJwYXRoPWBkdW1wIC1IIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgJy9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsgL14wLyB7IHMvXjAgICpcKC4qXCkkL1wxLzsgcDsgfQorfSdgCisjIENoZWNrIGZvciBhIDY0LWJpdCBvYmplY3QgaWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcuCitpZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPWBkdW1wIC1IWDY0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgJy9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsgL14wLyB7IHMvXjAgICpcKC4qXCkkL1wxLzsgcDsgfQorfSdgOyBmaQorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitpZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPSIvdXNyL2xpYjovbGliIjsgZmkKKworICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgorCWFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSJcJENDIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgYGlmIHRlc3QgIngke2FsbG93X3VuZGVmaW5lZF9mbGFnfSIgIT0gIngiOyB0aGVuIGVjaG8gIiR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30iOyBlbHNlIDo7IGZpYCAnIlwke3dsfSRub19lbnRyeV9mbGFnIFwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyAkc2hhcmVkX2ZsYWciCisgICAgICAgZWxzZQorCWlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nJHt3bH0tUiAkbGliZGlyOi91c3IvbGliOi9saWInCisJICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9Ii16IG5vZGVmcyIKKwkgIGFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30gJyJcJHt3bH0kbm9fZW50cnlfZmxhZyBcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMiCisJZWxzZQorCSAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4gZW1wdHkgZXhlY3V0YWJsZS4KKwkgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisKK2FpeF9saWJwYXRoPWBkdW1wIC1IIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgJy9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsgL14wLyB7IHMvXjAgICpcKC4qXCkkL1wxLzsgcDsgfQorfSdgCisjIENoZWNrIGZvciBhIDY0LWJpdCBvYmplY3QgaWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcuCitpZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPWBkdW1wIC1IWDY0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgJy9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsgL14wLyB7IHMvXjAgICpcKC4qXCkkL1wxLzsgcDsgfQorfSdgOyBmaQorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitpZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPSIvdXNyL2xpYjovbGliIjsgZmkKKworCSBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKKwkgICMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1biB0aW1lIGxvYWRpbmcgZmxhZ3MsCisJICAjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCisJICBub191bmRlZmluZWRfZmxhZ19HQ0o9JyAke3dsfS1iZXJub3RvaycKKwkgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj0nICR7d2x9LWJlcm9rJworCSAgIyAtYmV4cGFsbCBkb2VzIG5vdCBleHBvcnQgc3ltYm9scyBiZWdpbm5pbmcgd2l0aCB1bmRlcnNjb3JlIChfKQorCSAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0dDSj15ZXMKKwkgICMgRXhwb3J0ZWQgc3ltYm9scyBjYW4gYmUgcHVsbGVkIGludG8gc2hhcmVkIG9iamVjdHMgZnJvbSBhcmNoaXZlcworCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfR0NKPScgJworCSAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfR0NKPXllcworCSAgIyBUaGlzIGlzIHNpbWlsYXIgdG8gaG93IEFJWCB0cmFkaXRpb25hbGx5IGJ1aWxkcyBpdCdzIHNoYXJlZCBsaWJyYXJpZXMuCisJICBhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1iRTokZXhwb3J0X3N5bWJvbHMgJHt3bH0tYm5vZW50cnkke2FsbG93X3VuZGVmaW5lZF9mbGFnfX4kQVIgJEFSX0ZMQUdTICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lJHJlbGVhc2UuYSAkb3V0cHV0X29iamRpci8kc29uYW1lJworCWZpCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFtaWdhb3MqKQorICAgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJHJtICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTkFNRSAkbGlibmFtZSIgPiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIExJQlJBUllfSUQgMSIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBWRVJTSU9OICRtYWpvciIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBSRVZJU0lPTiAkcmV2aXNpb24iID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEFSICRBUl9GTEFHUyAkbGliICRsaWJvYmpzfiRSQU5MSUIgJGxpYn4oY2QgJG91dHB1dF9vYmpkaXIgJiYgYTJpeGxpYnJhcnkgLTMyKScKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSctTCRsaWJkaXInCisgICAgICBoYXJkY29kZV9taW51c19MX0dDSj15ZXMKKyAgICAgICMgc2VlIGNvbW1lbnQgYWJvdXQgZGlmZmVyZW50IHNlbWFudGljcyBvbiB0aGUgR05VIGxkIHNlY3Rpb24KKyAgICAgIGxkX3NobGlic19HQ0o9bm8KKyAgICAgIDs7CisKKyAgICBic2RpNCopCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfR0NKPS1yZHluYW1pYworICAgICAgOzsKKworICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgICAgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCisgICAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgorICAgICAgIyBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLCBhcyB0aGVyZSBpcworICAgICAgIyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPScgJworICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPXVuc3VwcG9ydGVkCisgICAgICAjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmxpYiBmaWxlcywgbm90IC5hIGZpbGVzLgorICAgICAgbGliZXh0PWxpYgorICAgICAgIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5kbGwgZmlsZXMsIG5vdCAuc28gZmlsZXMuCisgICAgICBzaHJleHRfY21kcz0iLmRsbCIKKyAgICAgICMgRklYTUU6IFNldHRpbmcgbGlua25hbWVzIGhlcmUgaXMgYSBiYWQgaGFjay4KKyAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRDQyAtbyAkbGliICRsaWJvYmpzICRjb21waWxlcl9mbGFncyBgZWNobyAiJGRlcGxpYnMiIHwgJFNFRCAtZSAnXCcncy8gLWxjJC8vJ1wnJ2AgLWxpbmsgLWRsbH5saW5rbmFtZXM9JworICAgICAgIyBUaGUgbGlua2VyIHdpbGwgYXV0b21hdGljYWxseSBidWlsZCBhIC5saWIgZmlsZSBpZiB3ZSBidWlsZCBhIERMTC4KKyAgICAgIG9sZF9hcmNoaXZlX0Zyb21fbmV3X2NtZHNfR0NKPSd0cnVlJworICAgICAgIyBGSVhNRTogU2hvdWxkIGxldCB0aGUgdXNlciBzcGVjaWZ5IHRoZSBsaWIgcHJvZ3JhbS4KKyAgICAgIG9sZF9hcmNoaXZlX2NtZHNfR0NKPSdsaWIgL09VVDokb2xkbGliJG9sZG9ianMkb2xkX2RlcGxpYnMnCisgICAgICBmaXhfc3JjZmlsZV9wYXRoPSdgY3lncGF0aCAtdyAiJHNyY2ZpbGUiYCcKKyAgICAgIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfR0NKPXllcworICAgICAgOzsKKworICAgIGRhcndpbiogfCByaGFwc29keSopCisgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXMgOyB0aGVuCisgICAgICBhcmNoaXZlX2NtZHNfbmVlZF9sY19HQ0o9bm8KKyAgICAgIGNhc2UgIiRob3N0X29zIiBpbgorICAgICAgcmhhcHNvZHkqIHwgZGFyd2luMS5bMDEyXSkKKwlhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9Jy11bmRlZmluZWQgc3VwcHJlc3MnCisJOzsKKyAgICAgICopICMgRGFyd2luIDEuMyBvbgorICAgICAgaWYgdGVzdCAteiAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVH0gOyB0aGVuCisgICAgICAJYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPSctZmxhdF9uYW1lc3BhY2UgLXVuZGVmaW5lZCBzdXBwcmVzcycKKyAgICAgIGVsc2UKKyAgICAgICAgY2FzZSAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVH0gaW4KKyAgICAgICAgICAxMC5bMDEyXSkKKyAgICAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj0nLWZsYXRfbmFtZXNwYWNlIC11bmRlZmluZWQgc3VwcHJlc3MnCisgICAgICAgICAgICA7OworICAgICAgICAgIDEwLiopCisgICAgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9Jy11bmRlZmluZWQgZHluYW1pY19sb29rdXAnCisgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgICBmaQorCTs7CisgICAgICBlc2FjCisgICAgCWx0X2ludF9hcHBsZV9jY19zaW5nbGVfbW9kPW5vCisgICAgCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJworICAgIAlpZiAkQ0MgLWR1bXBzcGVjcyAyPiYxIHwgZ3JlcCAnc2luZ2xlX21vZHVsZScgPi9kZXYvbnVsbCA7IHRoZW4KKyAgICAJICBsdF9pbnRfYXBwbGVfY2Nfc2luZ2xlX21vZD15ZXMKKyAgICAJZmkKKyAgICAJaWYgdGVzdCAiWCRsdF9pbnRfYXBwbGVfY2Nfc2luZ2xlX21vZCIgPSBYeWVzIDsgdGhlbgorICAgIAkgIGFyY2hpdmVfY21kc19HQ0o9JyRDQyAtZHluYW1pY2xpYiAtc2luZ2xlX21vZHVsZSAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nJworICAgIAllbHNlCisgICAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRDQyAtciAke3dsfS1iaW5kX2F0X2xvYWQgLWtlZXBfcHJpdmF0ZV9leHRlcm5zIC1ub3N0ZGxpYiAtbyAke2xpYn0tbWFzdGVyLm8gJGxpYm9ianN+JENDIC1keW5hbWljbGliICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICR7bGlifS1tYXN0ZXIubyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nJworICAgICAgZmkKKyAgICAgIG1vZHVsZV9jbWRzX0dDSj0nJENDICR7d2x9LWJpbmRfYXRfbG9hZCAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzJworICAgICAgIyBEb24ndCBmaXggdGhpcyBieSB1c2luZyB0aGUgbGQgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBmbGFnLCBpdCBkb2Vzbid0IGV4aXN0IGluIG9sZGVyIGRhcndpbiBsZCdzCisgICAgICAgIGlmIHRlc3QgIlgkbHRfaW50X2FwcGxlX2NjX3NpbmdsZV9tb2QiID0gWHllcyA7IHRoZW4KKyAgICAgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgLWR5bmFtaWNsaWIgLXNpbmdsZV9tb2R1bGUgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZ35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCisgICAgICAgIGVsc2UKKyAgICAgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgLXIgJHt3bH0tYmluZF9hdF9sb2FkIC1rZWVwX3ByaXZhdGVfZXh0ZXJucyAtbm9zdGRsaWIgLW8gJHtsaWJ9LW1hc3Rlci5vICRsaWJvYmpzfiRDQyAtZHluYW1pY2xpYiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAke2xpYn0tbWFzdGVyLm8gJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZ35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCisgICAgICAgIGZpCisgICAgICAgICAgbW9kdWxlX2V4cHN5bV9jbWRzX0dDSj0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnICAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3N+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgICAgaGFyZGNvZGVfZGlyZWN0X0dDSj1ubworICAgICAgaGFyZGNvZGVfYXV0b21hdGljX0dDSj15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPXVuc3VwcG9ydGVkCisgICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19HQ0o9Jy1hbGxfbG9hZCAkY29udmVuaWVuY2UnCisgICAgICBsaW5rX2FsbF9kZXBsaWJzX0dDSj15ZXMKKyAgICBlbHNlCisgICAgICBsZF9zaGxpYnNfR0NKPW5vCisgICAgZmkKKyAgICAgIDs7CisKKyAgICBkZ3V4KikKKyAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSctTCRsaWJkaXInCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubworICAgICAgOzsKKworICAgIGZyZWVic2QxKikKKyAgICAgIGxkX3NobGlic19HQ0o9bm8KKyAgICAgIDs7CisKKyAgICAjIEZyZWVCU0QgMi4yLlswMTJdIGFsbG93cyB1cyB0byBpbmNsdWRlIGMrK3J0MC5vIHRvIGdldCBDKysgY29uc3RydWN0b3IKKyAgICAjIHN1cHBvcnQuICBGdXR1cmUgdmVyc2lvbnMgZG8gdGhpcyBhdXRvbWF0aWNhbGx5LCBidXQgYW4gZXhwbGljaXQgYysrcnQwLm8KKyAgICAjIGRvZXMgbm90IGJyZWFrIGFueXRoaW5nLCBhbmQgaGVscHMgc2lnbmlmaWNhbnRseSAoYXQgdGhlIGNvc3Qgb2YgYSBsaXR0bGUKKyAgICAjIGV4dHJhIHNwYWNlKS4KKyAgICBmcmVlYnNkMi4yKikKKyAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgL3Vzci9saWIvYysrcnQwLm8nCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nLVIkbGliZGlyJworICAgICAgaGFyZGNvZGVfZGlyZWN0X0dDSj15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCisgICAgICA7OworCisgICAgIyBVbmZvcnR1bmF0ZWx5LCBvbGRlciB2ZXJzaW9ucyBvZiBGcmVlQlNEIDIgZG8gbm90IGhhdmUgdGhpcyBmZWF0dXJlLgorICAgIGZyZWVic2QyKikKKyAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9kaXJlY3RfR0NKPXllcworICAgICAgaGFyZGNvZGVfbWludXNfTF9HQ0o9eWVzCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubworICAgICAgOzsKKworICAgICMgRnJlZUJTRCAzIGFuZCBncmVhdGVyIHVzZXMgZ2NjIC1zaGFyZWQgdG8gZG8gc2hhcmVkIGxpYnJhcmllcy4KKyAgICBmcmVlYnNkKiB8IGtmcmVlYnNkKi1nbnUpCisgICAgICBhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSctUiRsaWJkaXInCisgICAgICBoYXJkY29kZV9kaXJlY3RfR0NKPXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KKyAgICAgIDs7CisKKyAgICBocHV4OSopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCWFyY2hpdmVfY21kc19HQ0o9JyRybSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRDQyAtc2hhcmVkIC1mUElDICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzX0dDSj0nJHJtICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JExEIC1iICtiICRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICBmaQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9HQ0o9OgorICAgICAgaGFyZGNvZGVfZGlyZWN0X0dDSj15ZXMKKworICAgICAgIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKKyAgICAgICMgYnV0IGFzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorICAgICAgaGFyZGNvZGVfbWludXNfTF9HQ0o9eWVzCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfR0NKPScke3dsfS1FJworICAgICAgOzsKKworICAgIGhwdXgxMCogfCBocHV4MTEqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgLWEgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCWNhc2UgIiRob3N0X2NwdSIgaW4KKwlocHBhKjY0KnxpYTY0KikKKwkgIGFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwkqKQorCSAgYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJZXNhYworICAgICAgZWxzZQorCWNhc2UgIiRob3N0X2NwdSIgaW4KKwlocHBhKjY0KnxpYTY0KikKKwkgIGFyY2hpdmVfY21kc19HQ0o9JyRMRCAtYiAraCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIDs7CisJKikKKwkgIGFyY2hpdmVfY21kc19HQ0o9JyRMRCAtYiAraCAkc29uYW1lICtiICRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICA7OworCWVzYWMKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwljYXNlICIkaG9zdF9jcHUiIGluCisJaHBwYSo2NCopCisJICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisJICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0dDSj0nK2IgJGxpYmRpcicKKwkgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfR0NKPToKKwkgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9bm8KKwkgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCisJICA7OworCWlhNjQqKQorCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9Jy1MJGxpYmRpcicKKwkgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9bm8KKwkgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCisKKwkgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCisJICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKwkgIGhhcmRjb2RlX21pbnVzX0xfR0NKPXllcworCSAgOzsKKwkqKQorCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworCSAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9HQ0o9OgorCSAgaGFyZGNvZGVfZGlyZWN0X0dDSj15ZXMKKwkgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LUUnCisKKwkgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCisJICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKwkgIGhhcmRjb2RlX21pbnVzX0xfR0NKPXllcworCSAgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgOzsKKworICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlhcmNoaXZlX2NtZHNfR0NKPSckTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfR0NKPSctcnBhdGggJGxpYmRpcicKKyAgICAgIGZpCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9HQ0o9OgorICAgICAgbGlua19hbGxfZGVwbGlic19HQ0o9eWVzCisgICAgICA7OworCisgICAgbmV0YnNkKiB8IGtuZXRic2QqLWdudSkKKyAgICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKwlhcmNoaXZlX2NtZHNfR0NKPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJyAgIyBhLm91dAorICAgICAgZWxzZQorCWFyY2hpdmVfY21kc19HQ0o9JyRMRCAtc2hhcmVkIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgICAgICAjIEVMRgorICAgICAgZmkKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSctUiRsaWJkaXInCisgICAgICBoYXJkY29kZV9kaXJlY3RfR0NKPXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KKyAgICAgIDs7CisKKyAgICBuZXdzb3M2KQorICAgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgaGFyZGNvZGVfZGlyZWN0X0dDSj15ZXMKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0dDSj06CisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubworICAgICAgOzsKKworICAgIG9wZW5ic2QqKQorICAgICAgaGFyZGNvZGVfZGlyZWN0X0dDSj15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCisgICAgICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KKwlhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0dDSj0nJHt3bH0tRScKKyAgICAgIGVsc2UKKyAgICAgICBjYXNlICRob3N0X29zIGluCisJIG9wZW5ic2RbMDFdLiogfCBvcGVuYnNkMi5bMC03XSB8IG9wZW5ic2QyLlswLTddLiopCisJICAgYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nLVIkbGliZGlyJworCSAgIDs7CisJICopCisJICAgYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPScke3dsfS1ycGF0aCwkbGliZGlyJworCSAgIDs7CisgICAgICAgZXNhYworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBvczIqKQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9Jy1MJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX21pbnVzX0xfR0NKPXllcworICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPXVuc3VwcG9ydGVkCisgICAgICBhcmNoaXZlX2NtZHNfR0NKPSckZWNobyAiTElCUkFSWSAkbGlibmFtZSBJTklUSU5TVEFOQ0UiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvICJERVNDUklQVElPTiBcIiRsaWJuYW1lXCIiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyBEQVRBID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyAiIFNJTkdMRSBOT05TSEFSRUQiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyBFWFBPUlRTID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn5lbXhleHAgJGxpYm9ianMgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRDQyAtWmRsbCAtWmNydGRsbCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYnCisgICAgICBvbGRfYXJjaGl2ZV9Gcm9tX25ld19jbWRzX0dDSj0nZW14aW1wIC1vICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmEgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmJworICAgICAgOzsKKworICAgIG9zZjMqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJworCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworICAgICAgZWxzZQorCWFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKKwlhcmNoaXZlX2NtZHNfR0NKPSckTEQgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisgICAgICBmaQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfR0NKPToKKyAgICAgIDs7CisKKyAgICBvc2Y0KiB8IG9zZjUqKQkjIGFzIG9zZjMqIHdpdGggdGhlIGFkZGl0aW9uIG9mIC1tc3ltIGZsYWcKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKwlhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1tc3ltICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBlbHNlCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJworCWFyY2hpdmVfY21kc19HQ0o9JyRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nZm9yIGkgaW4gYGNhdCAkZXhwb3J0X3N5bWJvbHNgOyBkbyBwcmludGYgIiVzICVzXFxuIiAtZXhwb3J0ZWRfc3ltYm9sICJcJGkiID4+ICRsaWIuZXhwOyBkb25lOyBlY2hvICItaGlkZGVuIj4+ICRsaWIuZXhwfgorCSRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWlucHV0ICRsaWIuZXhwICRsaW5rZXJfZmxhZ3MgJGxpYm9ianMgJGRlcGxpYnMgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYn4kcm0gJGxpYi5leHAnCisKKwkjIEJvdGggYyBhbmQgY3h4IGNvbXBpbGVyIHN1cHBvcnQgLXJwYXRoIGRpcmVjdGx5CisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9Jy1ycGF0aCAkbGliZGlyJworICAgICAgZmkKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfR0NKPToKKyAgICAgIDs7CisKKyAgICBzY28zLjJ2NSopCisgICAgICBhcmNoaXZlX2NtZHNfR0NKPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubworICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0dDSj0nJHt3bH0tQmV4cG9ydCcKKyAgICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisgICAgICBoYXJkY29kZV9ydW5wYXRoX3Zhcj15ZXMKKyAgICAgIDs7CisKKyAgICBzb2xhcmlzKikKKyAgICAgIG5vX3VuZGVmaW5lZF9mbGFnX0dDSj0nIC16IHRleHQnCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkICR7d2x9LWggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCWFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSckZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH4kZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKwkgICRDQyAtc2hhcmVkICR7d2x9LU0gJHt3bH0kbGliLmV4cCAke3dsfS1oICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc34kcm0gJGxpYi5leHAnCisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorICAJJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLU0gJGxpYi5leHAgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3N+JHJtICRsaWIuZXhwJworICAgICAgZmkKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSctUiRsaWJkaXInCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubworICAgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgc29sYXJpczIuWzAtNV0gfCBzb2xhcmlzMi5bMC01XS4qKSA7OworICAgICAgKikgIyBTdXBwb3J0ZWQgc2luY2UgU29sYXJpcyAyLjYgKG1heWJlIDIuNS4xPykKKwl3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19HQ0o9Jy16IGFsbGV4dHJhY3QkY29udmVuaWVuY2UgLXogZGVmYXVsdGV4dHJhY3QnIDs7CisgICAgICBlc2FjCisgICAgICBsaW5rX2FsbF9kZXBsaWJzX0dDSj15ZXMKKyAgICAgIDs7CisKKyAgICBzdW5vczQqKQorICAgICAgaWYgdGVzdCAieCRob3N0X3ZlbmRvciIgPSB4c2VxdWVudDsgdGhlbgorCSMgVXNlICRDQyB0byBsaW5rIHVuZGVyIHNlcXVlbnQsIGJlY2F1c2UgaXQgdGhyb3dzIGluIHNvbWUgZXh0cmEgLm8KKwkjIGZpbGVzIHRoYXQgbWFrZSAuaW5pdCBhbmQgLmZpbmkgc2VjdGlvbnMgd29yay4KKwlhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLUcgJHt3bH0taCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZWxzZQorCWFyY2hpdmVfY21kc19HQ0o9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnN0YXRpYyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBmaQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9Jy1MJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9eWVzCisgICAgICBoYXJkY29kZV9taW51c19MX0dDSj15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCisgICAgICA7OworCisgICAgc3lzdjQpCisgICAgICBjYXNlICRob3N0X3ZlbmRvciBpbgorCXNuaSkKKwkgIGFyY2hpdmVfY21kc19HQ0o9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9eWVzICMgaXMgdGhpcyByZWFsbHkgdHJ1ZT8/PworCTs7CisJc2llbWVucykKKwkgICMjIExEIGlzIGxkIGl0IG1ha2VzIGEgUExBTUxJQgorCSAgIyMgQ0MganVzdCBtYWtlcyBhIEdyb3NzTW9kdWxlLgorCSAgYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1HIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIHJlbG9hZF9jbWRzX0dDSj0nJENDIC1yIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCisJICBoYXJkY29kZV9kaXJlY3RfR0NKPW5vCisgICAgICAgIDs7CisJbW90b3JvbGEpCisJICBhcmNoaXZlX2NtZHNfR0NKPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICBoYXJkY29kZV9kaXJlY3RfR0NKPW5vICNNb3Rvcm9sYSBtYW51YWwgc2F5cyB5ZXMsIGJ1dCBteSB0ZXN0cyBzYXkgdGhleSBsaWUKKwk7OworICAgICAgZXNhYworICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KKyAgICAgIDs7CisKKyAgICBzeXN2NC4zKikKKyAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfR0NKPSctQmV4cG9ydCcKKyAgICAgIDs7CisKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCisJYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCWhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCisJcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKwloYXJkY29kZV9ydW5wYXRoX3Zhcj15ZXMKKwlsZF9zaGxpYnNfR0NKPXllcworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzeXN2NC4ydXcyKikKKyAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRMRCAtRyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9kaXJlY3RfR0NKPXllcworICAgICAgaGFyZGNvZGVfbWludXNfTF9HQ0o9bm8KKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCisgICAgICBoYXJkY29kZV9ydW5wYXRoX3Zhcj15ZXMKKyAgICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisgICAgICA7OworCisgICBzeXN2NU9wZW5VTklYOCogfCBzeXN2NVVuaXhXYXJlNyogfCAgc3lzdjV1d1s3OF0qIHwgdW5peHdhcmU3KikKKyAgICAgIG5vX3VuZGVmaW5lZF9mbGFnX0dDSj0nJHt3bH0teiAke3dsfXRleHQnCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkICR7d2x9LWggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZWxzZQorCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtRyAke3dsfS1oICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGZpCisgICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubworICAgICAgOzsKKworICAgIHN5c3Y1KikKKyAgICAgIG5vX3VuZGVmaW5lZF9mbGFnX0dDSj0nIC16IHRleHQnCisgICAgICAjICRDQyAtc2hhcmVkIHdpdGhvdXQgR05VIGxkIHdpbGwgbm90IGNyZWF0ZSBhIGxpYnJhcnkgZnJvbSBDKysKKyAgICAgICMgb2JqZWN0IGZpbGVzIGFuZCBhIHN0YXRpYyBsaWJzdGRjKyssIGJldHRlciBhdm9pZCBpdCBieSBub3cKKyAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorICAJCSRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1NICRsaWIuZXhwIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfiRybSAkbGliLmV4cCcKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPQorICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KKyAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKyAgICAgIDs7CisKKyAgICB1dHM0KikKKyAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSctTCRsaWJkaXInCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubworICAgICAgOzsKKworICAgICopCisgICAgICBsZF9zaGxpYnNfR0NKPW5vCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsZF9zaGxpYnNfR0NKIiA+JjUKKyRhc19lY2hvICIkbGRfc2hsaWJzX0dDSiIgPiY2OyB9Cit0ZXN0ICIkbGRfc2hsaWJzX0dDSiIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCisKK3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSJQQVRIICRzaGxpYnBhdGhfdmFyICRydW5wYXRoX3ZhciIKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsgR0NDX0VYRUNfUFJFRklYIENPTVBJTEVSX1BBVEggTElCUkFSWV9QQVRIIgorZmkKKworIworIyBEbyB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgbGluayBsaWJjPworIworY2FzZSAieCRhcmNoaXZlX2NtZHNfbmVlZF9sY19HQ0oiIGluCit4fHh5ZXMpCisgICMgQXNzdW1lIC1sYyBzaG91bGQgYmUgYWRkZWQKKyAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfR0NKPXllcworCisgIGlmIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIGNhc2UgJGFyY2hpdmVfY21kc19HQ0ogaW4KKyAgICAqJ34nKikKKyAgICAgICMgRklYTUU6IHdlIG1heSBoYXZlIHRvIGRlYWwgd2l0aCBtdWx0aS1jb21tYW5kIHNlcXVlbmNlcy4KKyAgICAgIDs7CisgICAgJyRDQyAnKikKKyAgICAgICMgVGVzdCB3aGV0aGVyIHRoZSBjb21waWxlciBpbXBsaWNpdGx5IGxpbmtzIHdpdGggLWxjIHNpbmNlIG9uIHNvbWUKKyAgICAgICMgc3lzdGVtcywgLWxnY2MgaGFzIHRvIGNvbWUgYmVmb3JlIC1sYy4gSWYgZ2NjIGFscmVhZHkgcGFzc2VzIC1sYworICAgICAgIyB0byBsZCwgZG9uJ3QgYWRkIC1sYyBiZWZvcmUgLWxnY2MuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgLWxjIHNob3VsZCBiZSBleHBsaWNpdGx5IGxpbmtlZCBpbiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4uLi4gIiA+JjY7IH0KKyAgICAgICRybSBjb25mdGVzdCoKKyAgICAgIHByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisKKyAgICAgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19jb21waWxlXCIiOyB9ID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gMj5jb25mdGVzdC5lcnI7IHRoZW4KKyAgICAgICAgc29uYW1lPWNvbmZ0ZXN0CisgICAgICAgIGxpYj1jb25mdGVzdAorICAgICAgICBsaWJvYmpzPWNvbmZ0ZXN0LiRhY19vYmpleHQKKyAgICAgICAgZGVwbGlicz0KKyAgICAgICAgd2w9JGx0X3Byb2dfY29tcGlsZXJfd2xfR0NKCisgICAgICAgIGNvbXBpbGVyX2ZsYWdzPS12CisgICAgICAgIGxpbmtlcl9mbGFncz0tdgorICAgICAgICB2ZXJzdHJpbmc9CisgICAgICAgIG91dHB1dF9vYmpkaXI9LgorICAgICAgICBsaWJuYW1lPWNvbmZ0ZXN0CisgICAgICAgIGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSgorICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9CisgICAgICAgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhcmNoaXZlX2NtZHNfR0NKIDJcPlwmMSBcfCBncmVwIFwiIC1sYyBcIiBcPi9kZXYvbnVsbCAyXD5cJjFcIiI7IH0gPiY1CisgIChldmFsICRhcmNoaXZlX2NtZHNfR0NKIDJcPlwmMSBcfCBncmVwIFwiIC1sYyBcIiBcPi9kZXYvbnVsbCAyXD5cJjEpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9CisgICAgICAgIHRoZW4KKwkgIGFyY2hpdmVfY21kc19uZWVkX2xjX0dDSj1ubworICAgICAgICBlbHNlCisJICBhcmNoaXZlX2NtZHNfbmVlZF9sY19HQ0o9eWVzCisgICAgICAgIGZpCisgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj0kbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZworICAgICAgZWxzZQorICAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKKyAgICAgIGZpCisgICAgICAkcm0gY29uZnRlc3QqCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFyY2hpdmVfY21kc19uZWVkX2xjX0dDSiIgPiY1CiskYXNfZWNobyAiJGFyY2hpdmVfY21kc19uZWVkX2xjX0dDSiIgPiY2OyB9CisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKyAgOzsKK2VzYWMKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzLi4uICIgPiY2OyB9CitsaWJyYXJ5X25hbWVzX3NwZWM9CitsaWJuYW1lX3NwZWM9J2xpYiRuYW1lJworc29uYW1lX3NwZWM9CitzaHJleHRfY21kcz0iLnNvIgorcG9zdGluc3RhbGxfY21kcz0KK3Bvc3R1bmluc3RhbGxfY21kcz0KK2ZpbmlzaF9jbWRzPQorZmluaXNoX2V2YWw9CitzaGxpYnBhdGhfdmFyPQorc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXVua25vd24KK3ZlcnNpb25fdHlwZT1ub25lCitkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCitzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiIKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IGdyZXAgIl5saWJyYXJpZXM6IiB8ICRTRUQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgInMsPS8sLyxnImAKKyAgaWYgZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBncmVwICc7JyA+L2Rldi9udWxsIDsgdGhlbgorICAgICMgaWYgdGhlIHBhdGggY29udGFpbnMgIjsiIHRoZW4gd2UgYXNzdW1lIGl0IHRvIGJlIHRoZSBzZXBhcmF0b3IKKyAgICAjIG90aGVyd2lzZSBkZWZhdWx0IHRvIHRoZSBzdGFuZGFyZCBwYXRoIHNlcGFyYXRvciAoaS5lLiAiOiIpIC0gaXQgaXMKKyAgICAjIGFzc3VtZWQgdGhhdCBubyBwYXJ0IG9mIGEgbm9ybWFsIHBhdGhuYW1lIGNvbnRhaW5zICI7IiBidXQgdGhhdCBzaG91bGQKKyAgICAjIG9rYXkgaW4gdGhlIHJlYWwgd29ybGQgd2hlcmUgIjsiIGluIGRpcnBhdGhzIGlzIGl0c2VsZiBwcm9ibGVtYXRpYy4KKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAtZSAncy87LyAvZydgCisgIGVsc2UKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCisgIGZpCitlbHNlCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKK2ZpCituZWVkX2xpYl9wcmVmaXg9dW5rbm93bgoraGFyZGNvZGVfaW50b19saWJzPW5vCisKKyMgd2hlbiB5b3Ugc2V0IG5lZWRfdmVyc2lvbiB0byBubywgbWFrZSBzdXJlIGl0IGRvZXMgbm90IGNhdXNlIC1zZXRfdmVyc2lvbgorIyBmbGFncyB0byBiZSBsZWZ0IHdpdGhvdXQgYXJndW1lbnRzCituZWVkX3ZlcnNpb249dW5rbm93bgorCitjYXNlICRob3N0X29zIGluCithaXgzKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZS5hJworICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKKworICAjIEFJWCAzIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIHdlIGFwcGVuZCBhIG1ham9yIHZlcnNpb24gdG8gdGhlIG5hbWUuCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIDs7CisKK2FpeDQqIHwgYWl4NSopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKyAgICAjIEFJWCA1IHN1cHBvcnRzIElBNjQKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBlbHNlCisgICAgIyBXaXRoIEdDQyB1cCB0byAyLjk1LngsIGNvbGxlY3QyIHdvdWxkIGNyZWF0ZSBhbiBpbXBvcnQgZmlsZQorICAgICMgZm9yIGRlcGVuZGVuY2UgbGlicmFyaWVzLiAgVGhlIGltcG9ydCBmaWxlIHdvdWxkIHN0YXJ0IHdpdGgKKyAgICAjIHRoZSBsaW5lIGAjISAuJy4gIFRoaXMgd291bGQgY2F1c2UgdGhlIGdlbmVyYXRlZCBsaWJyYXJ5IHRvCisgICAgIyBkZXBlbmQgb24gYC4nLCBhbHdheXMgYW4gaW52YWxpZCBsaWJyYXJ5LiAgVGhpcyB3YXMgZml4ZWQgaW4KKyAgICAjIGRldmVsb3BtZW50IHNuYXBzaG90cyBvZiBHQ0MgcHJpb3IgdG8gMy4wLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeDQgfCBhaXg0LlswMV0gfCBhaXg0LlswMV0uKikKKyAgICAgIGlmIHsgZWNobyAnI2lmIF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA5NyknCisJICAgZWNobyAnIHllcyAnCisJICAgZWNobyAnI2VuZGlmJzsgfSB8ICR7Q0N9IC1FIC0gfCBncmVwIHllcyA+IC9kZXYvbnVsbDsgdGhlbgorCToKKyAgICAgIGVsc2UKKwljYW5fYnVpbGRfc2hhcmVkPW5vCisgICAgICBmaQorICAgICAgOzsKKyAgICBlc2FjCisgICAgIyBBSVggKG9uIFBvd2VyKikgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gY3VycmVudGx5IHdlIGNhbiBub3QgaGFyZGNvZGUgY29ycmVjdAorICAgICMgc29uYW1lIGludG8gZXhlY3V0YWJsZS4gUHJvYmFibHkgd2UgY2FuIGFkZCB2ZXJzaW9uaW5nIHN1cHBvcnQgdG8KKyAgICAjIGNvbGxlY3QyLCBzbyBhZGRpdGlvbmFsIGxpbmtzIGNhbiBiZSB1c2VmdWwgaW4gZnV0dXJlLgorICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorICAgICAgIyBJZiB1c2luZyBydW4gdGltZSBsaW5raW5nIChvbiBBSVggNC4yIG9yIGxhdGVyKSB1c2UgbGliPG5hbWU+LnNvCisgICAgICAjIGluc3RlYWQgb2YgbGliPG5hbWU+LmEgdG8gbGV0IHBlb3BsZSBrbm93IHRoYXQgdGhlc2UgYXJlIG5vdAorICAgICAgIyB0eXBpY2FsIEFJWCBzaGFyZWQgbGlicmFyaWVzLgorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgZWxzZQorICAgICAgIyBXZSBwcmVzZXJ2ZSAuYSBhcyBleHRlbnNpb24gZm9yIHNoYXJlZCBsaWJyYXJpZXMgdGhyb3VnaCBBSVg0LjIKKyAgICAgICMgYW5kIGxhdGVyIHdoZW4gd2UgYXJlIG5vdCBkb2luZyBydW4gdGltZSBsaW5raW5nLgorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5hICRsaWJuYW1lLmEnCisgICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIGZpCisgICAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisgIGZpCisgIDs7CisKK2FtaWdhb3MqKQorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLml4bGlicmFyeSAkbGlibmFtZS5hJworICAjIENyZWF0ZSAke2xpYm5hbWV9X2l4bGlicmFyeS5hIGVudHJpZXMgaW4gL3N5cy9saWJzLgorICBmaW5pc2hfZXZhbD0nZm9yIGxpYiBpbiBgbHMgJGxpYmRpci8qLml4bGlicmFyeSAyPi9kZXYvbnVsbGA7IGRvIGxpYm5hbWU9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAnXCcncyVeLiovXChbXi9dKlwpXC5peGxpYnJhcnkkJVwxJSdcJydgOyB0ZXN0ICRybSAvc3lzL2xpYnMvJHtsaWJuYW1lfV9peGxpYnJhcnkuYTsgJHNob3cgImNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEiOyBjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIHx8IGV4aXQgMTsgZG9uZScKKyAgOzsKKworYmVvcyopCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKKyAgc2hsaWJwYXRoX3Zhcj1MSUJSQVJZX1BBVEgKKyAgOzsKKworYnNkaTQqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL1gxMS9saWIgL3Vzci9jb250cmliL2xpYiAvbGliIC91c3IvbG9jYWwvbGliIgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgorICAjIHRoZSBkZWZhdWx0IGxkLnNvLmNvbmYgYWxzbyBjb250YWlucyAvdXNyL2NvbnRyaWIvbGliIGFuZAorICAjIC91c3IvWDExUjYvbGliICgvdXNyL1gxMSBpcyBhIGxpbmsgdG8gL3Vzci9YMTFSNiksIGJ1dCBsZXQgdXMgYWxsb3cKKyAgIyBsaWJ0b29sIHRvIGhhcmQtY29kZSB0aGVzZSBpbnRvIHByb2dyYW1zCisgIDs7CisKK2N5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgdmVyc2lvbl90eXBlPXdpbmRvd3MKKyAgc2hyZXh0X2NtZHM9Ii5kbGwiCisgIG5lZWRfdmVyc2lvbj1ubworICBuZWVkX2xpYl9wcmVmaXg9bm8KKworICBjYXNlICRHQ0MsJGhvc3Rfb3MgaW4KKyAgeWVzLGN5Z3dpbiogfCB5ZXMsbWluZ3cqIHwgeWVzLHB3MzIqKQorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuZGxsLmEnCisgICAgIyBETEwgaXMgaW5zdGFsbGVkIHRvICQobGliZGlyKS8uLi9iaW4gYnkgcG9zdGluc3RhbGxfY21kcworICAgIHBvc3RpbnN0YWxsX2NtZHM9J2Jhc2VfZmlsZT1gYmFzZW5hbWUgXCR7ZmlsZX1gfgorICAgICAgZGxwYXRoPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZGlyLydcJydcJHtiYXNlX2ZpbGV9J1wnJ2k7ZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxkaXI9JGRlc3RkaXIvYGRpcm5hbWUgXCRkbHBhdGhgfgorICAgICAgdGVzdCAtZCBcJGRsZGlyIHx8IG1rZGlyIC1wIFwkZGxkaXJ+CisgICAgICAkaW5zdGFsbF9wcm9nICRkaXIvJGRsbmFtZSBcJGRsZGlyLyRkbG5hbWUnCisgICAgcG9zdHVuaW5zdGFsbF9jbWRzPSdkbGRsbD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGZpbGU7IGVjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRscGF0aD0kZGlyL1wkZGxkbGx+CisgICAgICAgJHJtIFwkZGxwYXRoJworICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBjeWd3aW4qKQorICAgICAgIyBDeWd3aW4gRExMcyB1c2UgJ2N5ZycgcHJlZml4IHJhdGhlciB0aGFuICdsaWInCisgICAgICBzb25hbWVfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL2N5Zy8nYGBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliIC9saWIvdzMyYXBpIC9saWIgL3Vzci9sb2NhbC9saWIiCisgICAgICA7OworICAgIG1pbmd3KikKKyAgICAgICMgTWluR1cgRExMcyB1c2UgdHJhZGl0aW9uYWwgJ2xpYicgcHJlZml4CisgICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCBncmVwICJebGlicmFyaWVzOiIgfCAkU0VEIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICJzLD0vLC8sZyJgCisgICAgICBpZiBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8IGdyZXAgJztbYy16Qy1aXTovJyA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgICMgSXQgaXMgbW9zdCBwcm9iYWJseSBhIFdpbmRvd3MgZm9ybWF0IFBBVEggcHJpbnRlZCBieQorICAgICAgICAjIG1pbmd3IGdjYywgYnV0IHdlIGFyZSBydW5uaW5nIG9uIEN5Z3dpbi4gR2NjIHByaW50cyBpdHMgc2VhcmNoCisgICAgICAgICMgcGF0aCB3aXRoIDsgc2VwYXJhdG9ycywgYW5kIHdpdGggZHJpdmUgbGV0dGVycy4gV2UgY2FuIGhhbmRsZSB0aGUKKyAgICAgICAgIyBkcml2ZSBsZXR0ZXJzIChjeWd3aW4gZmlsZXV0aWxzIHVuZGVyc3RhbmRzIHRoZW0pLCBzbyBsZWF2ZSB0aGVtLAorICAgICAgICAjIGVzcGVjaWFsbHkgYXMgd2UgbWlnaHQgcGFzcyBmaWxlcyBmb3VuZCB0aGVyZSB0byBhIG1pbmd3IG9iamR1bXAsCisgICAgICAgICMgd2hpY2ggd291bGRuJ3QgdW5kZXJzdGFuZCBhIGN5Z3dpbmlmaWVkIHBhdGguIEFoaC4KKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgJ3MvOy8gL2cnYAorICAgICAgZWxzZQorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCisgICAgICBmaQorICAgICAgOzsKKyAgICBwdzMyKikKKyAgICAgICMgcHczMiBETExzIHVzZSAncHcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJworICAgICAgbGlicmFyeV9uYW1lc19zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvcHcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy8uLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKKyAgICAgIDs7CisgICAgZXNhYworICAgIDs7CisKKyAgKikKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9ICRsaWJuYW1lLmxpYicKKyAgICA7OworICBlc2FjCisgIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsZC5leGUnCisgICMgRklYTUU6IGZpcnN0IHdlIHNob3VsZCBzZWFyY2ggLiBhbmQgdGhlIGRpcmVjdG9yeSB0aGUgZXhlY3V0YWJsZSBpcyBpbgorICBzaGxpYnBhdGhfdmFyPVBBVEgKKyAgOzsKKworZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGR5bGQiCisgIHZlcnNpb25fdHlwZT1kYXJ3aW4KKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHt2ZXJzdWZmaXh9JHNoYXJlZF9leHQgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0ICR7bGlibmFtZX0kc2hhcmVkX2V4dCcKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0kc2hhcmVkX2V4dCcKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBzaGxpYnBhdGhfdmFyPURZTERfTElCUkFSWV9QQVRICisgIHNocmV4dF9jbWRzPSckKHRlc3QgLiRtb2R1bGUgPSAueWVzICYmIGVjaG8gLnNvIHx8IGVjaG8gLmR5bGliKScKKyAgIyBBcHBsZSdzIGdjYyBwcmludHMgJ2djYyAtcHJpbnQtc2VhcmNoLWRpcnMnIGRvZXNuJ3Qgb3BlcmF0ZSB0aGUgc2FtZS4KKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCB0ciAiXG4iICIkUEFUSF9TRVBBUkFUT1IiIHwgc2VkIC1lICdzL2xpYnJhcmllczovQGxpYnJhcmllczovJyB8IHRyICJAIiAiXG4iIHwgZ3JlcCAiXmxpYnJhcmllczoiIHwgc2VkIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICJzLD0vLC8sZyIgLWUgInMsJFBBVEhfU0VQQVJBVE9SLCAsZyIgLWUgInMsLiosJiAvbGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliLGciYAorICBlbHNlCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvbGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliJworICBmaQorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9sb2NhbC9saWIgL2xpYiAvdXNyL2xpYicKKyAgOzsKKworZGd1eCopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUkc2hhcmVkX2V4dCcKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworZnJlZWJzZDEqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCitrZnJlZWJzZCotZ251KQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBkeW5hbWljX2xpbmtlcj0nR05VIGxkLnNvJworICA7OworCitmcmVlYnNkKikKKyAgb2JqZm9ybWF0PWB0ZXN0IC14IC91c3IvYmluL29iamZvcm1hdCAmJiAvdXNyL2Jpbi9vYmpmb3JtYXQgfHwgZWNobyBhb3V0YAorICB2ZXJzaW9uX3R5cGU9ZnJlZWJzZC0kb2JqZm9ybWF0CisgIGNhc2UgJHZlcnNpb25fdHlwZSBpbgorICAgIGZyZWVic2QtZWxmKikKKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgICAgbmVlZF92ZXJzaW9uPW5vCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIDs7CisgICAgZnJlZWJzZC0qKQorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgICAgICBuZWVkX3ZlcnNpb249eWVzCisgICAgICA7OworICBlc2FjCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgZnJlZWJzZDIqKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICA7OworICBmcmVlYnNkMy4wMSogfCBmcmVlYnNkZWxmMy4wMSopCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICAqKSAjIGZyb20gMy4yIG9uCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIDs7CisgIGVzYWMKKyAgOzsKKworZ251KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR7bWFqb3J9ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK2hwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorICAjIEdpdmUgYSBzb25hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgbWFqb3IgdmVyc2lvbiBzbyB0aGF0IGRsZC5zbCByZWZ1c2VzIHRvCisgICMgbGluayBhZ2FpbnN0IG90aGVyIHZlcnNpb25zLgorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBjYXNlICIkaG9zdF9jcHUiIGluCisgIGlhNjQqKQorICAgIHNocmV4dF9jbWRzPScuc28nCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc28iCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzICMgVW5sZXNzICtub2VudnZhciBpcyBzcGVjaWZpZWQuCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBpZiB0ZXN0ICJYJEhQVVhfSUE2NF9NT0RFIiA9IFgzMjsgdGhlbgorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9ocHV4MzIgL3Vzci9sb2NhbC9saWIvaHB1eDMyIC91c3IvbG9jYWwvbGliIgorICAgIGVsc2UKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvaHB1eDY0IC91c3IvbG9jYWwvbGliL2hwdXg2NCIKKyAgICBmaQorICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKKyAgICA7OworICAgaHBwYSo2NCopCisgICAgIHNocmV4dF9jbWRzPScuc2wnCisgICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKKyAgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEggIyBIb3cgc2hvdWxkIHdlIGhhbmRsZSBTSExJQl9QQVRICisgICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMgIyBVbmxlc3MgK25vZW52dmFyIGlzIHNwZWNpZmllZC4KKyAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvcGEyMF82NCAvdXNyL2Njcy9saWIvcGEyMF82NCIKKyAgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYworICAgICA7OworICAgKikKKyAgICBzaHJleHRfY21kcz0nLnNsJworICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCisgICAgc2hsaWJwYXRoX3Zhcj1TSExJQl9QQVRICisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vICMgK3MgaXMgcmVxdWlyZWQgdG8gZW5hYmxlIFNITElCX1BBVEgKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIDs7CisgIGVzYWMKKyAgIyBIUC1VWCBydW5zICpyZWFsbHkqIHNsb3dseSB1bmxlc3Mgc2hhcmVkIGxpYnJhcmllcyBhcmUgbW9kZSA1NTUuCisgIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDU1NSAkbGliJworICA7OworCitpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorICBjYXNlICRob3N0X29zIGluCisgICAgbm9uc3RvcHV4KikgdmVyc2lvbl90eXBlPW5vbnN0b3B1eCA7OworICAgICopCisJaWYgdGVzdCAiJGx0X2N2X3Byb2dfZ251X2xkIiA9IHllczsgdGhlbgorCQl2ZXJzaW9uX3R5cGU9bGludXgKKwllbHNlCisJCXZlcnNpb25fdHlwZT1pcml4CisJZmkgOzsKKyAgZXNhYworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBpcml4NSogfCBub25zdG9wdXgqKQorICAgIGxpYnN1ZmY9IHNobGlic3VmZj0KKyAgICA7OworICAqKQorICAgIGNhc2UgJExEIGluICMgbGlidG9vbC5tNCB3aWxsIGFkZCBvbmUgb2YgdGhlc2Ugc3dpdGNoZXMgdG8gTEQKKyAgICAqLTMyfCoiLTMyICJ8Ki1tZWxmMzJic21pcHwqIi1tZWxmMzJic21pcCAiKQorICAgICAgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz0zMi1iaXQ7OworICAgICotbjMyfCoiLW4zMiAifCotbWVsZjMyYm1pcG4zMnwqIi1tZWxmMzJibWlwbjMyICIpCisgICAgICBsaWJzdWZmPTMyIHNobGlic3VmZj1OMzIgbGlibWFnaWM9TjMyOzsKKyAgICAqLTY0fCoiLTY0ICJ8Ki1tZWxmNjRibWlwfCoiLW1lbGY2NGJtaXAgIikKKyAgICAgIGxpYnN1ZmY9NjQgc2hsaWJzdWZmPTY0IGxpYm1hZ2ljPTY0LWJpdDs7CisgICAgKikgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz1uZXZlci1tYXRjaDs7CisgICAgZXNhYworICAgIDs7CisgIGVzYWMKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZJHtzaGxpYnN1ZmZ9X1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IC91c3IvbG9jYWwvbGliJHtsaWJzdWZmfSIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSIKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCisjIE5vIHNoYXJlZCBsaWIgc3VwcG9ydCBmb3IgTGludXggb2xkbGQsIGFvdXQsIG9yIGNvZmYuCitsaW51eCpvbGRsZCogfCBsaW51eCphb3V0KiB8IGxpbnV4KmNvZmYqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCisjIFRoaXMgbXVzdCBiZSBMaW51eCBFTEYuCitsaW51eCopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbiAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgIyBUaGlzIGltcGxpZXMgbm8gZmFzdF9pbnN0YWxsLCB3aGljaCBpcyB1bmFjY2VwdGFibGUuCisgICMgU29tZSByZXdvcmsgd2lsbCBiZSBuZWVkZWQgdG8gYWxsb3cgZm9yIGZhc3RfaW5zdGFsbAorICAjIGJlZm9yZSB0aGlzIGNhbiBiZSBlbmFibGVkLgorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisKKyAgIyBBcHBlbmQgbGQuc28uY29uZiBjb250ZW50cyB0byB0aGUgc2VhcmNoIHBhdGgKKyAgaWYgdGVzdCAtZiAvZXRjL2xkLnNvLmNvbmY7IHRoZW4KKyAgICBsdF9sZF9leHRyYT1gJFNFRCAtZSAncy86LFx0LyAvZztzLz1ePSokLy87cy89Xj0gKiAvIC9nJyAvZXRjL2xkLnNvLmNvbmYgfCB0ciAnXG4nICcgJ2AKKyAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAkbHRfbGRfZXh0cmEiCisgIGZpCisKKyAgIyBXZSB1c2VkIHRvIHRlc3QgZm9yIC9saWIvbGQuc28uMSBhbmQgZGlzYWJsZSBzaGFyZWQgbGlicmFyaWVzIG9uCisgICMgcG93ZXJwYywgYmVjYXVzZSBNa0xpbnV4IG9ubHkgc3VwcG9ydGVkIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB0aGUKKyAgIyBHTlUgZHluYW1pYyBsaW5rZXIuICBTaW5jZSB0aGlzIHdhcyBicm9rZW4gd2l0aCBjcm9zcyBjb21waWxlcnMsCisgICMgbW9zdCBwb3dlcnBjLWxpbnV4IGJveGVzIHN1cHBvcnQgZHluYW1pYyBsaW5raW5nIHRoZXNlIGRheXMgYW5kCisgICMgcGVvcGxlIGNhbiBhbHdheXMgLS1kaXNhYmxlLXNoYXJlZCwgdGhlIHRlc3Qgd2FzIHJlbW92ZWQsIGFuZCB3ZQorICAjIGFzc3VtZSB0aGUgR05VL0xpbnV4IGR5bmFtaWMgbGlua2VyIGlzIGluIHVzZS4KKyAgZHluYW1pY19saW5rZXI9J0dOVS9MaW51eCBsZC5zbycKKyAgOzsKKwora25ldGJzZCotZ251KQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBkeW5hbWljX2xpbmtlcj0nR05VIGxkLnNvJworICA7OworCituZXRic2QqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJworICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgKGEub3V0KSBsZC5zbycKKyAgZWxzZQorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIGxkLmVsZl9zbycKKyAgZmkKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK25ld3NvczYpCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICA7OworCitudG8tcW54KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgOzsKKworb3BlbmJzZCopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPXllcworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBvcGVuYnNkMi5bODldIHwgb3BlbmJzZDIuWzg5XS4qKQorCXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworCTs7CisgICAgICAqKQorCXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKwk7OworICAgICAgZXNhYworICBlbHNlCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBmaQorICA7OworCitvczIqKQorICBsaWJuYW1lX3NwZWM9JyRuYW1lJworICBzaHJleHRfY21kcz0iLmRsbCIKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9ICRsaWJuYW1lLmEnCisgIGR5bmFtaWNfbGlua2VyPSdPUy8yIGxkLmV4ZScKKyAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisgIDs7CisKK29zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgdmVyc2lvbl90eXBlPW9zZgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3Ivc2hsaWIgL3Vzci9jY3MvbGliIC91c3IvbGliL2NtcGxycy9jYyAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiAvdmFyL3NobGliIgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIKKyAgOzsKKworc2NvMy4ydjUqKQorICB2ZXJzaW9uX3R5cGU9b3NmCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCitzb2xhcmlzKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAjIGxkZCBjb21wbGFpbnMgdW5sZXNzIGxpYnJhcmllcyBhcmUgZXhlY3V0YWJsZQorICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCAreCAkbGliJworICA7OworCitzdW5vczQqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovdXNyL2V0YyIgbGRjb25maWcgJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgbmVlZF9saWJfcHJlZml4PW5vCisgIGZpCisgIG5lZWRfdmVyc2lvbj15ZXMKKyAgOzsKKworc3lzdjQgfCBzeXN2NC4ydXcyKiB8IHN5c3Y0LjMqIHwgc3lzdjUqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGNhc2UgJGhvc3RfdmVuZG9yIGluCisgICAgc25pKQorICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tQmxhcmdlZHluc3ltJworICAgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKyAgICAgIDs7CisgICAgc2llbWVucykKKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgOzsKKyAgICBtb3Rvcm9sYSkKKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgbmVlZF92ZXJzaW9uPW5vCisgICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL2xpYiAvdXNyL2xpYiAvdXNyL2Njcy9saWInCisgICAgICA7OworICBlc2FjCisgIDs7CisKK3N5c3Y0Kk1QKikKKyAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgorICAgIHZlcnNpb25fdHlwZT1saW51eAorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9LiR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9LiRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kbWFqb3InCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgZmkKKyAgOzsKKwordXRzNCopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKK2VzYWMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkZHluYW1pY19saW5rZXIiID4mNQorJGFzX2VjaG8gIiRkeW5hbWljX2xpbmtlciIgPiY2OyB9Cit0ZXN0ICIkZHluYW1pY19saW5rZXIiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtcy4uLiAiID4mNjsgfQoraGFyZGNvZGVfYWN0aW9uX0dDSj0KK2lmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSiIgfHwgXAorICAgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIEdDSiIgfHwgXAorICAgdGVzdCAiWCRoYXJkY29kZV9hdXRvbWF0aWNfR0NKIj0iWHllcyIgOyB0aGVuCisKKyAgIyBXZSBjYW4gaGFyZGNvZGUgbm9uLWV4aXN0YW50IGRpcmVjdG9yaWVzLgorICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0X0dDSiIgIT0gbm8gJiYKKyAgICAgIyBJZiB0aGUgb25seSBtZWNoYW5pc20gdG8gYXZvaWQgaGFyZGNvZGluZyBpcyBzaGxpYnBhdGhfdmFyLCB3ZQorICAgICAjIGhhdmUgdG8gcmVsaW5rLCBvdGhlcndpc2Ugd2UgbWlnaHQgbGluayB3aXRoIGFuIGluc3RhbGxlZCBsaWJyYXJ5CisgICAgICMgd2hlbiB3ZSBzaG91bGQgYmUgbGlua2luZyB3aXRoIGEgeWV0LXRvLWJlLWluc3RhbGxlZCBvbmUKKyAgICAgIyMgdGVzdCAiJF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgR0NKKSIgIT0gbm8gJiYKKyAgICAgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0xfR0NKIiAhPSBubzsgdGhlbgorICAgICMgTGlua2luZyBhbHdheXMgaGFyZGNvZGVzIHRoZSB0ZW1wb3JhcnkgbGlicmFyeSBkaXJlY3RvcnkuCisgICAgaGFyZGNvZGVfYWN0aW9uX0dDSj1yZWxpbmsKKyAgZWxzZQorICAgICMgV2UgY2FuIGxpbmsgd2l0aG91dCBoYXJkY29kaW5nLCBhbmQgd2UgY2FuIGhhcmRjb2RlIG5vbmV4aXN0aW5nIGRpcnMuCisgICAgaGFyZGNvZGVfYWN0aW9uX0dDSj1pbW1lZGlhdGUKKyAgZmkKK2Vsc2UKKyAgIyBXZSBjYW5ub3QgaGFyZGNvZGUgYW55dGhpbmcsIG9yIGVsc2Ugd2UgY2FuIG9ubHkgaGFyZGNvZGUgZXhpc3RpbmcKKyAgIyBkaXJlY3Rvcmllcy4KKyAgaGFyZGNvZGVfYWN0aW9uX0dDSj11bnN1cHBvcnRlZAorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkaGFyZGNvZGVfYWN0aW9uX0dDSiIgPiY1CiskYXNfZWNobyAiJGhhcmRjb2RlX2FjdGlvbl9HQ0oiID4mNjsgfQorCitpZiB0ZXN0ICIkaGFyZGNvZGVfYWN0aW9uX0dDSiIgPSByZWxpbms7IHRoZW4KKyAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkCisgIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KK2VsaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgfHwKKyAgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm87IHRoZW4KKyAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3QgbmVjZXNzYXJ5CisgIGVuYWJsZV9mYXN0X2luc3RhbGw9bmVlZGxlc3MKK2ZpCisKK3N0cmlwbGliPQorb2xkX3N0cmlwbGliPQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHN0cmlwcGluZyBsaWJyYXJpZXMgaXMgcG9zc2libGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBzdHJpcHBpbmcgbGlicmFyaWVzIGlzIHBvc3NpYmxlLi4uICIgPiY2OyB9CitpZiB0ZXN0IC1uICIkU1RSSVAiICYmICRTVFJJUCAtViAyPiYxIHwgZ3JlcCAiR05VIHN0cmlwIiA+L2Rldi9udWxsOyB0aGVuCisgIHRlc3QgLXogIiRvbGRfc3RyaXBsaWIiICYmIG9sZF9zdHJpcGxpYj0iJFNUUklQIC0tc3RyaXAtZGVidWciCisgIHRlc3QgLXogIiRzdHJpcGxpYiIgJiYgc3RyaXBsaWI9IiRTVFJJUCAtLXN0cmlwLXVubmVlZGVkIgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorZWxzZQorIyBGSVhNRSAtIGluc2VydCBzb21lIHJlYWwgdGVzdHMsIGhvc3Rfb3MgaXNuJ3QgcmVhbGx5IGdvb2QgZW5vdWdoCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgIGRhcndpbiopCisgICAgICAgaWYgdGVzdCAtbiAiJFNUUklQIiA7IHRoZW4KKyAgICAgICAgIHN0cmlwbGliPSIkU1RSSVAgLXgiCisgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorICAgICAgIGVsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorICAgICAgIDs7CisgICAqKQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKyAgICA7OworICBlc2FjCitmaQorCitpZiB0ZXN0ICJ4JGVuYWJsZV9kbG9wZW4iICE9IHh5ZXM7IHRoZW4KKyAgZW5hYmxlX2Rsb3Blbj11bmtub3duCisgIGVuYWJsZV9kbG9wZW5fc2VsZj11bmtub3duCisgIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9dW5rbm93bgorZWxzZQorICBsdF9jdl9kbG9wZW49bm8KKyAgbHRfY3ZfZGxvcGVuX2xpYnM9CisKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBiZW9zKikKKyAgICBsdF9jdl9kbG9wZW49ImxvYWRfYWRkX29uIgorICAgIGx0X2N2X2Rsb3Blbl9saWJzPQorICAgIGx0X2N2X2Rsb3Blbl9zZWxmPXllcworICAgIDs7CisKKyAgbWluZ3cqIHwgcHczMiopCisgICAgbHRfY3ZfZGxvcGVuPSJMb2FkTGlicmFyeSIKKyAgICBsdF9jdl9kbG9wZW5fbGlicz0KKyAgIDs7CisKKyAgY3lnd2luKikKKyAgICBsdF9jdl9kbG9wZW49ImRsb3BlbiIKKyAgICBsdF9jdl9kbG9wZW5fbGlicz0KKyAgIDs7CisKKyAgZGFyd2luKikKKyAgIyBpZiBsaWJkbCBpcyBpbnN0YWxsZWQgd2UgbmVlZCB0byBsaW5rIGFnYWluc3QgaXQKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZGxvcGVuIGluIC1sZGwuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfbGliX2RsX2Rsb3BlbitzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sZGwgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIGRsb3BlbiAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGRsb3BlbiAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9saWJfZGxfZGxvcGVuPXllcworZWxzZQorICBhY19jdl9saWJfZGxfZGxvcGVuPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9kbF9kbG9wZW4iID4mNQorJGFzX2VjaG8gIiRhY19jdl9saWJfZGxfZGxvcGVuIiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX2RsX2Rsb3BlbiIgPSB4IiJ5ZXM7IHRoZW4gOgorICBsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiCitlbHNlCisKKyAgICBsdF9jdl9kbG9wZW49ImR5bGQiCisgICAgbHRfY3ZfZGxvcGVuX2xpYnM9CisgICAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzCisKK2ZpCisKKyAgIDs7CisKKyAgKikKKyAgICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJzaGxfbG9hZCIgImFjX2N2X2Z1bmNfc2hsX2xvYWQiCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfc2hsX2xvYWQiID0geCIieWVzOyB0aGVuIDoKKyAgbHRfY3ZfZGxvcGVuPSJzaGxfbG9hZCIKK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc2hsX2xvYWQgaW4gLWxkbGQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHNobF9sb2FkIGluIC1sZGxkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2xpYl9kbGRfc2hsX2xvYWQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbGRsZCAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgc2hsX2xvYWQgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBzaGxfbG9hZCAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9saWJfZGxkX3NobF9sb2FkPXllcworZWxzZQorICBhY19jdl9saWJfZGxkX3NobF9sb2FkPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9kbGRfc2hsX2xvYWQiID4mNQorJGFzX2VjaG8gIiRhY19jdl9saWJfZGxkX3NobF9sb2FkIiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX2RsZF9zaGxfbG9hZCIgPSB4IiJ5ZXM7IHRoZW4gOgorICBsdF9jdl9kbG9wZW49InNobF9sb2FkIiBsdF9jdl9kbG9wZW5fbGlicz0iLWRsZCIKK2Vsc2UKKyAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiZGxvcGVuIiAiYWNfY3ZfZnVuY19kbG9wZW4iCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZGxvcGVuIiA9IHgiInllczsgdGhlbiA6CisgIGx0X2N2X2Rsb3Blbj0iZGxvcGVuIgorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZGxvcGVuIGluIC1sZGwuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfbGliX2RsX2Rsb3BlbitzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sZGwgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIGRsb3BlbiAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGRsb3BlbiAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9saWJfZGxfZGxvcGVuPXllcworZWxzZQorICBhY19jdl9saWJfZGxfZGxvcGVuPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9kbF9kbG9wZW4iID4mNQorJGFzX2VjaG8gIiRhY19jdl9saWJfZGxfZGxvcGVuIiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX2RsX2Rsb3BlbiIgPSB4IiJ5ZXM7IHRoZW4gOgorICBsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiCitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbHN2bGQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbHN2bGQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfbGliX3N2bGRfZGxvcGVuK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxzdmxkICAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBkbG9wZW4gKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBkbG9wZW4gKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX3N2bGRfZGxvcGVuPXllcworZWxzZQorICBhY19jdl9saWJfc3ZsZF9kbG9wZW49bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3N2bGRfZGxvcGVuIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX3N2bGRfZGxvcGVuIiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX3N2bGRfZGxvcGVuIiA9IHgiInllczsgdGhlbiA6CisgIGx0X2N2X2Rsb3Blbj0iZGxvcGVuIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxzdmxkIgorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBkbGRfbGluayBpbiAtbGRsZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZGxkX2xpbmsgaW4gLWxkbGQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfbGliX2RsZF9kbGRfbGluaytzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sZGxkICAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBkbGRfbGluayAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGRsZF9saW5rICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9kbGRfZGxkX2xpbms9eWVzCitlbHNlCisgIGFjX2N2X2xpYl9kbGRfZGxkX2xpbms9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2RsZF9kbGRfbGluayIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9kbGRfZGxkX2xpbmsiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfZGxkX2RsZF9saW5rIiA9IHgiInllczsgdGhlbiA6CisgIGx0X2N2X2Rsb3Blbj0iZGxkX2xpbmsiIGx0X2N2X2Rsb3Blbl9saWJzPSItZGxkIgorZmkKKworCitmaQorCisKK2ZpCisKKworZmkKKworCitmaQorCisKK2ZpCisKKyAgICA7OworICBlc2FjCisKKyAgaWYgdGVzdCAieCRsdF9jdl9kbG9wZW4iICE9IHhubzsgdGhlbgorICAgIGVuYWJsZV9kbG9wZW49eWVzCisgIGVsc2UKKyAgICBlbmFibGVfZGxvcGVuPW5vCisgIGZpCisKKyAgY2FzZSAkbHRfY3ZfZGxvcGVuIGluCisgIGRsb3BlbikKKyAgICBzYXZlX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCisgICAgdGVzdCAieCRhY19jdl9oZWFkZXJfZGxmY25faCIgPSB4eWVzICYmIENQUEZMQUdTPSIkQ1BQRkxBR1MgLURIQVZFX0RMRkNOX0giCisKKyAgICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorICAgIGV2YWwgTERGTEFHUz1cIlwkTERGTEFHUyAkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXCIKKworICAgIHNhdmVfTElCUz0iJExJQlMiCisgICAgTElCUz0iJGx0X2N2X2Rsb3Blbl9saWJzICRMSUJTIgorCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGEgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIGEgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZi4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHtsdF9jdl9kbG9wZW5fc2VsZitzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIAkgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgbHRfY3ZfZGxvcGVuX3NlbGY9Y3Jvc3MKK2Vsc2UKKyAgbHRfZGx1bmtub3duPTA7IGx0X2Rsbm9fdXNjb3JlPTE7IGx0X2RsbmVlZF91c2NvcmU9MgorICBsdF9zdGF0dXM9JGx0X2RsdW5rbm93bgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxODUzNiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpZiBIQVZFX0RMRkNOX0gKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZkZWYgUlRMRF9HTE9CQUwKKyMgIGRlZmluZSBMVF9ETEdMT0JBTAkJUlRMRF9HTE9CQUwKKyNlbHNlCisjICBpZmRlZiBETF9HTE9CQUwKKyMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQlETF9HTE9CQUwKKyMgIGVsc2UKKyMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQkwCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFdlIG1heSBoYXZlIHRvIGRlZmluZSBMVF9ETExBWllfT1JfTk9XIGluIHRoZSBjb21tYW5kIGxpbmUgaWYgd2UKKyAgIGZpbmQgb3V0IGl0IGRvZXMgbm90IHdvcmsgaW4gc29tZSBwbGF0Zm9ybS4gKi8KKyNpZm5kZWYgTFRfRExMQVpZX09SX05PVworIyAgaWZkZWYgUlRMRF9MQVpZCisjICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlSVExEX0xBWlkKKyMgIGVsc2UKKyMgICAgaWZkZWYgRExfTEFaWQorIyAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlETF9MQVpZCisjICAgIGVsc2UKKyMgICAgICBpZmRlZiBSVExEX05PVworIyAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJUlRMRF9OT1cKKyMgICAgICBlbHNlCisjICAgICAgICBpZmRlZiBETF9OT1cKKyMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJRExfTk9XCisjICAgICAgICBlbHNlCisjICAgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCTAKKyMgICAgICAgIGVuZGlmCisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHZvaWQgZXhpdCAoaW50KTsKKyNlbmRpZgorCit2b2lkIGZub3JkKCkgeyBpbnQgaT00Mjt9CitpbnQgbWFpbiAoKQoreworICB2b2lkICpzZWxmID0gZGxvcGVuICgwLCBMVF9ETEdMT0JBTHxMVF9ETExBWllfT1JfTk9XKTsKKyAgaW50IHN0YXR1cyA9ICRsdF9kbHVua25vd247CisKKyAgaWYgKHNlbGYpCisgICAgeworICAgICAgaWYgKGRsc3ltIChzZWxmLCJmbm9yZCIpKSAgICAgICBzdGF0dXMgPSAkbHRfZGxub191c2NvcmU7CisgICAgICBlbHNlIGlmIChkbHN5bSggc2VsZiwiX2Zub3JkIikpIHN0YXR1cyA9ICRsdF9kbG5lZWRfdXNjb3JlOworICAgICAgLyogZGxjbG9zZSAoc2VsZik7ICovCisgICAgfQorCisgICAgZXhpdCAoc3RhdHVzKTsKK30KK0VPRgorICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfbGlua1wiIjsgfSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gMj4vZGV2L251bGw7IHRoZW4KKyAgICAoLi9jb25mdGVzdDsgZXhpdDsgKSAyPi9kZXYvbnVsbAorICAgIGx0X3N0YXR1cz0kPworICAgIGNhc2UgeCRsdF9zdGF0dXMgaW4KKyAgICAgIHgkbHRfZGxub191c2NvcmUpIGx0X2N2X2Rsb3Blbl9zZWxmPXllcyA7OworICAgICAgeCRsdF9kbG5lZWRfdXNjb3JlKSBsdF9jdl9kbG9wZW5fc2VsZj15ZXMgOzsKKyAgICAgIHgkbHRfdW5rbm93bnx4KikgbHRfY3ZfZGxvcGVuX3NlbGY9bm8gOzsKKyAgICBlc2FjCisgIGVsc2UgOgorICAgICMgY29tcGlsYXRpb24gZmFpbGVkCisgICAgbHRfY3ZfZGxvcGVuX3NlbGY9bm8KKyAgZmkKK2ZpCitybSAtZnIgY29uZnRlc3QqCisKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfZGxvcGVuX3NlbGYiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9kbG9wZW5fc2VsZiIgPiY2OyB9CisKKyAgICBpZiB0ZXN0ICJ4JGx0X2N2X2Rsb3Blbl9zZWxmIiA9IHh5ZXM7IHRoZW4KKyAgICAgIExERkxBR1M9IiRMREZMQUdTICRsaW5rX3N0YXRpY19mbGFnIgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGEgc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIGEgc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZi4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHtsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICAJICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz1jcm9zcworZWxzZQorICBsdF9kbHVua25vd249MDsgbHRfZGxub191c2NvcmU9MTsgbHRfZGxuZWVkX3VzY29yZT0yCisgIGx0X3N0YXR1cz0kbHRfZGx1bmtub3duCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDE4NjM0ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworI2lmIEhBVkVfRExGQ05fSAorI2luY2x1ZGUgPGRsZmNuLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZmRlZiBSVExEX0dMT0JBTAorIyAgZGVmaW5lIExUX0RMR0xPQkFMCQlSVExEX0dMT0JBTAorI2Vsc2UKKyMgIGlmZGVmIERMX0dMT0JBTAorIyAgICBkZWZpbmUgTFRfRExHTE9CQUwJCURMX0dMT0JBTAorIyAgZWxzZQorIyAgICBkZWZpbmUgTFRfRExHTE9CQUwJCTAKKyMgIGVuZGlmCisjZW5kaWYKKworLyogV2UgbWF5IGhhdmUgdG8gZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cgaW4gdGhlIGNvbW1hbmQgbGluZSBpZiB3ZQorICAgZmluZCBvdXQgaXQgZG9lcyBub3Qgd29yayBpbiBzb21lIHBsYXRmb3JtLiAqLworI2lmbmRlZiBMVF9ETExBWllfT1JfTk9XCisjICBpZmRlZiBSVExEX0xBWlkKKyMgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJCVJUTERfTEFaWQorIyAgZWxzZQorIyAgICBpZmRlZiBETF9MQVpZCisjICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJCURMX0xBWlkKKyMgICAgZWxzZQorIyAgICAgIGlmZGVmIFJUTERfTk9XCisjICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwlSVExEX05PVworIyAgICAgIGVsc2UKKyMgICAgICAgIGlmZGVmIERMX05PVworIyAgICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwlETF9OT1cKKyMgICAgICAgIGVsc2UKKyMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJMAorIyAgICAgICAgZW5kaWYKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgdm9pZCBleGl0IChpbnQpOworI2VuZGlmCisKK3ZvaWQgZm5vcmQoKSB7IGludCBpPTQyO30KK2ludCBtYWluICgpCit7CisgIHZvaWQgKnNlbGYgPSBkbG9wZW4gKDAsIExUX0RMR0xPQkFMfExUX0RMTEFaWV9PUl9OT1cpOworICBpbnQgc3RhdHVzID0gJGx0X2RsdW5rbm93bjsKKworICBpZiAoc2VsZikKKyAgICB7CisgICAgICBpZiAoZGxzeW0gKHNlbGYsImZub3JkIikpICAgICAgIHN0YXR1cyA9ICRsdF9kbG5vX3VzY29yZTsKKyAgICAgIGVsc2UgaWYgKGRsc3ltKCBzZWxmLCJfZm5vcmQiKSkgc3RhdHVzID0gJGx0X2RsbmVlZF91c2NvcmU7CisgICAgICAvKiBkbGNsb3NlIChzZWxmKTsgKi8KKyAgICB9CisKKyAgICBleGl0IChzdGF0dXMpOworfQorRU9GCisgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19saW5rXCIiOyB9ID4mNQorICAoZXZhbCAkYWNfbGluaykgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAyPi9kZXYvbnVsbDsgdGhlbgorICAgICguL2NvbmZ0ZXN0OyBleGl0OyApIDI+L2Rldi9udWxsCisgICAgbHRfc3RhdHVzPSQ/CisgICAgY2FzZSB4JGx0X3N0YXR1cyBpbgorICAgICAgeCRsdF9kbG5vX3VzY29yZSkgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPXllcyA7OworICAgICAgeCRsdF9kbG5lZWRfdXNjb3JlKSBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9eWVzIDs7CisgICAgICB4JGx0X3Vua25vd258eCopIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz1ubyA7OworICAgIGVzYWMKKyAgZWxzZSA6CisgICAgIyBjb21waWxhdGlvbiBmYWlsZWQKKyAgICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9bm8KKyAgZmkKK2ZpCitybSAtZnIgY29uZnRlc3QqCisKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIiA+JjY7IH0KKyAgICBmaQorCisgICAgQ1BQRkxBR1M9IiRzYXZlX0NQUEZMQUdTIgorICAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCisgICAgTElCUz0iJHNhdmVfTElCUyIKKyAgICA7OworICBlc2FjCisKKyAgY2FzZSAkbHRfY3ZfZGxvcGVuX3NlbGYgaW4KKyAgeWVzfG5vKSBlbmFibGVfZGxvcGVuX3NlbGY9JGx0X2N2X2Rsb3Blbl9zZWxmIDs7CisgICopIGVuYWJsZV9kbG9wZW5fc2VsZj11bmtub3duIDs7CisgIGVzYWMKKworICBjYXNlICRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMgaW4KKyAgeWVzfG5vKSBlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPSRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMgOzsKKyAgKikgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz11bmtub3duIDs7CisgIGVzYWMKK2ZpCisKKworIyBUaGUgZWxzZSBjbGF1c2Ugc2hvdWxkIG9ubHkgZmlyZSB3aGVuIGJvb3RzdHJhcHBpbmcgdGhlCisjIGxpYnRvb2wgZGlzdHJpYnV0aW9uLCBvdGhlcndpc2UgeW91IGZvcmdvdCB0byBzaGlwIGx0bWFpbi5zaAorIyB3aXRoIHlvdXIgcGFja2FnZSwgYW5kIHlvdSB3aWxsIGdldCBjb21wbGFpbnRzIHRoYXQgdGhlcmUgYXJlCisjIG5vIHJ1bGVzIHRvIGdlbmVyYXRlIGx0bWFpbi5zaC4KK2lmIHRlc3QgLWYgIiRsdG1haW4iOyB0aGVuCisgICMgU2VlIGlmIHdlIGFyZSBydW5uaW5nIG9uIHpzaCwgYW5kIHNldCB0aGUgb3B0aW9ucyB3aGljaCBhbGxvdyBvdXIgY29tbWFuZHMgdGhyb3VnaAorICAjIHdpdGhvdXQgcmVtb3ZhbCBvZiBcIGVzY2FwZXMuCisgIGlmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgOyB0aGVuCisgICAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKKyAgZmkKKyAgIyBOb3cgcXVvdGUgYWxsIHRoZSB0aGluZ3MgdGhhdCBtYXkgY29udGFpbiBtZXRhY2hhcmFjdGVycyB3aGlsZSBiZWluZworICAjIGNhcmVmdWwgbm90IHRvIG92ZXJxdW90ZSB0aGUgQUNfU1VCU1RlZCB2YWx1ZXMuICBXZSB0YWtlIGNvcGllcyBvZiB0aGUKKyAgIyB2YXJpYWJsZXMgYW5kIHF1b3RlIHRoZSBjb3BpZXMgZm9yIGdlbmVyYXRpb24gb2YgdGhlIGxpYnRvb2wgc2NyaXB0LgorICBmb3IgdmFyIGluIGVjaG8gb2xkX0NDIG9sZF9DRkxBR1MgQVIgQVJfRkxBR1MgRUdSRVAgUkFOTElCIExOX1MgTFRDQyBOTSBcCisgICAgU0VEIFNIRUxMIFNUUklQIFwKKyAgICBsaWJuYW1lX3NwZWMgbGlicmFyeV9uYW1lc19zcGVjIHNvbmFtZV9zcGVjIGV4dHJhY3RfZXhwc3ltc19jbWRzIFwKKyAgICBvbGRfc3RyaXBsaWIgc3RyaXBsaWIgZmlsZV9tYWdpY19jbWQgZmluaXNoX2NtZHMgZmluaXNoX2V2YWwgXAorICAgIGRlcGxpYnNfY2hlY2tfbWV0aG9kIHJlbG9hZF9mbGFnIHJlbG9hZF9jbWRzIG5lZWRfbG9ja3MgXAorICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wgXAorICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzIFwKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMgXAorICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzIG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMgXAorICAgIGNvbXBpbGVyX0dDSiBcCisgICAgQ0NfR0NKIFwKKyAgICBMRF9HQ0ogXAorICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfR0NKIFwKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0ogXAorICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSiBcCisgICAgbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfR0NKIFwKKyAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfR0NKIFwKKyAgICB0aHJlYWRfc2FmZV9mbGFnX3NwZWNfR0NKIFwKKyAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19HQ0ogXAorICAgIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfR0NKIFwKKyAgICBvbGRfYXJjaGl2ZV9jbWRzX0dDSiBcCisgICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc19HQ0ogXAorICAgIHByZWRlcF9vYmplY3RzX0dDSiBcCisgICAgcG9zdGRlcF9vYmplY3RzX0dDSiBcCisgICAgcHJlZGVwc19HQ0ogXAorICAgIHBvc3RkZXBzX0dDSiBcCisgICAgY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0dDSiBcCisgICAgYXJjaGl2ZV9jbWRzX0dDSiBcCisgICAgYXJjaGl2ZV9leHBzeW1fY21kc19HQ0ogXAorICAgIHBvc3RpbnN0YWxsX2NtZHNfR0NKIFwKKyAgICBwb3N0dW5pbnN0YWxsX2NtZHNfR0NKIFwKKyAgICBvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc19HQ0ogXAorICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSiBcCisgICAgbm9fdW5kZWZpbmVkX2ZsYWdfR0NKIFwKKyAgICBleHBvcnRfc3ltYm9sc19jbWRzX0dDSiBcCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0ogXAorICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfR0NKIFwKKyAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0dDSiBcCisgICAgaGFyZGNvZGVfYXV0b21hdGljX0dDSiBcCisgICAgbW9kdWxlX2NtZHNfR0NKIFwKKyAgICBtb2R1bGVfZXhwc3ltX2NtZHNfR0NKIFwKKyAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19HQ0ogXAorICAgIGV4Y2x1ZGVfZXhwc3ltc19HQ0ogXAorICAgIGluY2x1ZGVfZXhwc3ltc19HQ0o7IGRvCisKKyAgICBjYXNlICR2YXIgaW4KKyAgICBvbGRfYXJjaGl2ZV9jbWRzX0dDSiB8IFwKKyAgICBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzX0dDSiB8IFwKKyAgICBhcmNoaXZlX2NtZHNfR0NKIHwgXAorICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKIHwgXAorICAgIG1vZHVsZV9jbWRzX0dDSiB8IFwKKyAgICBtb2R1bGVfZXhwc3ltX2NtZHNfR0NKIHwgXAorICAgIG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzX0dDSiB8IFwKKyAgICBleHBvcnRfc3ltYm9sc19jbWRzX0dDSiB8IFwKKyAgICBleHRyYWN0X2V4cHN5bXNfY21kcyB8IHJlbG9hZF9jbWRzIHwgZmluaXNoX2NtZHMgfCBcCisgICAgcG9zdGluc3RhbGxfY21kcyB8IHBvc3R1bmluc3RhbGxfY21kcyB8IFwKKyAgICBvbGRfcG9zdGluc3RhbGxfY21kcyB8IG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMgfCBcCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIHwgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMpCisgICAgICAjIERvdWJsZS1xdW90ZSBkb3VibGUtZXZhbGVkIHN0cmluZ3MuCisgICAgICBldmFsICJsdF8kdmFyPVxcXCJcYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkZG91YmxlX3F1b3RlX3N1YnN0XCIgLWUgXCJcJHNlZF9xdW90ZV9zdWJzdFwiIC1lIFwiXCRkZWxheV92YXJpYWJsZV9zdWJzdFwiXGBcXFwiIgorICAgICAgOzsKKyAgICAqKQorICAgICAgZXZhbCAibHRfJHZhcj1cXFwiXGBcJGVjaG8gXCJYXCQkdmFyXCIgfCBcJFhzZWQgLWUgXCJcJHNlZF9xdW90ZV9zdWJzdFwiXGBcXFwiIgorICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKworICBjYXNlICRsdF9lY2hvIGluCisgIConXCQwIC0tZmFsbGJhY2stZWNobyInKQorICAgIGx0X2VjaG89YCRlY2hvICJYJGx0X2VjaG8iIHwgJFhzZWQgLWUgJ3MvXFxcXFxcXCQwIC0tZmFsbGJhY2stZWNobyIkLyQwIC0tZmFsbGJhY2stZWNobyIvJ2AKKyAgICA7OworICBlc2FjCisKK2NmZ2ZpbGU9IiRvZmlsZSIKKworICBjYXQgPDxfX0VPRl9fID4+ICIkY2ZnZmlsZSIKKyMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogJHRhZ25hbWUKKworIyBMaWJ0b29sIHdhcyBjb25maWd1cmVkIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgorCisjIFNoZWxsIHRvIHVzZSB3aGVuIGludm9raW5nIHNoZWxsIHNjcmlwdHMuCitTSEVMTD0kbHRfU0hFTEwKKworIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLgorYnVpbGRfbGlidG9vbF9saWJzPSRlbmFibGVfc2hhcmVkCisKKyMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcy4KK2J1aWxkX29sZF9saWJzPSRlbmFibGVfc3RhdGljCisKKyMgV2hldGhlciBvciBub3QgdG8gYWRkIC1sYyBmb3IgYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4KK2J1aWxkX2xpYnRvb2xfbmVlZF9sYz0kYXJjaGl2ZV9jbWRzX25lZWRfbGNfR0NKCisKKyMgV2hldGhlciBvciBub3QgdG8gZGlzYWxsb3cgc2hhcmVkIGxpYnMgd2hlbiBydW50aW1lIGxpYnMgYXJlIHN0YXRpYworYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzPSRlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0dDSgorCisjIFdoZXRoZXIgb3Igbm90IHRvIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbi4KK2Zhc3RfaW5zdGFsbD0kZW5hYmxlX2Zhc3RfaW5zdGFsbAorCisjIFRoZSBob3N0IHN5c3RlbS4KK2hvc3RfYWxpYXM9JGhvc3RfYWxpYXMKK2hvc3Q9JGhvc3QKKworIyBBbiBlY2hvIHByb2dyYW0gdGhhdCBkb2VzIG5vdCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCitlY2hvPSRsdF9lY2hvCisKKyMgVGhlIGFyY2hpdmVyLgorQVI9JGx0X0FSCitBUl9GTEFHUz0kbHRfQVJfRkxBR1MKKworIyBBIEMgY29tcGlsZXIuCitMVENDPSRsdF9MVENDCisKKyMgQSBsYW5ndWFnZS1zcGVjaWZpYyBjb21waWxlci4KK0NDPSRsdF9jb21waWxlcl9HQ0oKKworIyBJcyB0aGUgY29tcGlsZXIgdGhlIEdOVSBDIGNvbXBpbGVyPword2l0aF9nY2M9JEdDQ19HQ0oKKworIyBBbiBFUkUgbWF0Y2hlci4KK0VHUkVQPSRsdF9FR1JFUAorCisjIFRoZSBsaW5rZXIgdXNlZCB0byBidWlsZCBsaWJyYXJpZXMuCitMRD0kbHRfTERfR0NKCisKKyMgV2hldGhlciB3ZSBuZWVkIGhhcmQgb3Igc29mdCBsaW5rcy4KK0xOX1M9JGx0X0xOX1MKKworIyBBIEJTRC1jb21wYXRpYmxlIG5tIHByb2dyYW0uCitOTT0kbHRfTk0KKworIyBBIHN5bWJvbCBzdHJpcHBpbmcgcHJvZ3JhbQorU1RSSVA9JGx0X1NUUklQCisKKyMgVXNlZCB0byBleGFtaW5lIGxpYnJhcmllcyB3aGVuIGZpbGVfbWFnaWNfY21kIGJlZ2lucyAiZmlsZSIKK01BR0lDX0NNRD0kTUFHSUNfQ01ECisKKyMgVXNlZCBvbiBjeWd3aW46IERMTCBjcmVhdGlvbiBwcm9ncmFtLgorRExMVE9PTD0iJERMTFRPT0wiCisKKyMgVXNlZCBvbiBjeWd3aW46IG9iamVjdCBkdW1wZXIuCitPQkpEVU1QPSIkT0JKRFVNUCIKKworIyBVc2VkIG9uIGN5Z3dpbjogYXNzZW1ibGVyLgorQVM9IiRBUyIKKworIyBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGVtcG9yYXJ5IGxpYnRvb2wgZmlsZXMuCitvYmpkaXI9JG9iamRpcgorCisjIEhvdyB0byBjcmVhdGUgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMuCityZWxvYWRfZmxhZz0kbHRfcmVsb2FkX2ZsYWcKK3JlbG9hZF9jbWRzPSRsdF9yZWxvYWRfY21kcworCisjIEhvdyB0byBwYXNzIGEgbGlua2VyIGZsYWcgdGhyb3VnaCB0aGUgY29tcGlsZXIuCit3bD0kbHRfbHRfcHJvZ19jb21waWxlcl93bF9HQ0oKKworIyBPYmplY3QgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICJvIikuCitvYmpleHQ9IiRhY19vYmpleHQiCisKKyMgT2xkIGFyY2hpdmUgc3VmZml4IChub3JtYWxseSAiYSIpLgorbGliZXh0PSIkbGliZXh0IgorCisjIFNoYXJlZCBsaWJyYXJ5IHN1ZmZpeCAobm9ybWFsbHkgIi5zbyIpLgorc2hyZXh0X2NtZHM9JyRzaHJleHRfY21kcycKKworIyBFeGVjdXRhYmxlIGZpbGUgc3VmZml4IChub3JtYWxseSAiIikuCitleGVleHQ9IiRleGVleHQiCisKKyMgQWRkaXRpb25hbCBjb21waWxlciBmbGFncyBmb3IgYnVpbGRpbmcgbGlicmFyeSBvYmplY3RzLgorcGljX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfcGljX0dDSgorcGljX21vZGU9JHBpY19tb2RlCisKKyMgV2hhdCBpcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgYSBjb21tYW5kPworbWF4X2NtZF9sZW49JGx0X2N2X3N5c19tYXhfY21kX2xlbgorCisjIERvZXMgY29tcGlsZXIgc2ltdWx0YW5lb3VzbHkgc3VwcG9ydCAtYyBhbmQgLW8gb3B0aW9ucz8KK2NvbXBpbGVyX2Nfbz0kbHRfbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fR0NKCisKKyMgTXVzdCB3ZSBsb2NrIGZpbGVzIHdoZW4gZG9pbmcgY29tcGlsYXRpb24gPworbmVlZF9sb2Nrcz0kbHRfbmVlZF9sb2NrcworCisjIERvIHdlIG5lZWQgdGhlIGxpYiBwcmVmaXggZm9yIG1vZHVsZXM/CituZWVkX2xpYl9wcmVmaXg9JG5lZWRfbGliX3ByZWZpeAorCisjIERvIHdlIG5lZWQgYSB2ZXJzaW9uIGZvciBsaWJyYXJpZXM/CituZWVkX3ZlcnNpb249JG5lZWRfdmVyc2lvbgorCisjIFdoZXRoZXIgZGxvcGVuIGlzIHN1cHBvcnRlZC4KK2Rsb3Blbl9zdXBwb3J0PSRlbmFibGVfZGxvcGVuCisKKyMgV2hldGhlciBkbG9wZW4gb2YgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkLgorZGxvcGVuX3NlbGY9JGVuYWJsZV9kbG9wZW5fc2VsZgorCisjIFdoZXRoZXIgZGxvcGVuIG9mIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KK2Rsb3Blbl9zZWxmX3N0YXRpYz0kZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYworCisjIENvbXBpbGVyIGZsYWcgdG8gcHJldmVudCBkeW5hbWljIGxpbmtpbmcuCitsaW5rX3N0YXRpY19mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0oKKworIyBDb21waWxlciBmbGFnIHRvIHR1cm4gb2ZmIGJ1aWx0aW4gZnVuY3Rpb25zLgorbm9fYnVpbHRpbl9mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19HQ0oKKworIyBDb21waWxlciBmbGFnIHRvIGFsbG93IHJlZmxleGl2ZSBkbG9wZW5zLgorZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPSRsdF9leHBvcnRfZHluYW1pY19mbGFnX3NwZWNfR0NKCisKKyMgQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSBzaGFyZWQgb2JqZWN0cyBkaXJlY3RseSBmcm9tIGFyY2hpdmVzLgord2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JGx0X3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0dDSgorCisjIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgdGhyZWFkLXNhZmUgb2JqZWN0cy4KK3RocmVhZF9zYWZlX2ZsYWdfc3BlYz0kbHRfdGhyZWFkX3NhZmVfZmxhZ19zcGVjX0dDSgorCisjIExpYnJhcnkgdmVyc2lvbmluZyB0eXBlLgordmVyc2lvbl90eXBlPSR2ZXJzaW9uX3R5cGUKKworIyBGb3JtYXQgb2YgbGlicmFyeSBuYW1lIHByZWZpeC4KK2xpYm5hbWVfc3BlYz0kbHRfbGlibmFtZV9zcGVjCisKKyMgTGlzdCBvZiBhcmNoaXZlIG5hbWVzLiAgRmlyc3QgbmFtZSBpcyB0aGUgcmVhbCBvbmUsIHRoZSByZXN0IGFyZSBsaW5rcy4KKyMgVGhlIGxhc3QgbmFtZSBpcyB0aGUgb25lIHRoYXQgdGhlIGxpbmtlciBmaW5kcyB3aXRoIC1sTkFNRS4KK2xpYnJhcnlfbmFtZXNfc3BlYz0kbHRfbGlicmFyeV9uYW1lc19zcGVjCisKKyMgVGhlIGNvZGVkIG5hbWUgb2YgdGhlIGxpYnJhcnksIGlmIGRpZmZlcmVudCBmcm9tIHRoZSByZWFsIG5hbWUuCitzb25hbWVfc3BlYz0kbHRfc29uYW1lX3NwZWMKKworIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGFuIG9sZC1zdHlsZSBhcmNoaXZlLgorUkFOTElCPSRsdF9SQU5MSUIKK29sZF9hcmNoaXZlX2NtZHM9JGx0X29sZF9hcmNoaXZlX2NtZHNfR0NKCitvbGRfcG9zdGluc3RhbGxfY21kcz0kbHRfb2xkX3Bvc3RpbnN0YWxsX2NtZHMKK29sZF9wb3N0dW5pbnN0YWxsX2NtZHM9JGx0X29sZF9wb3N0dW5pbnN0YWxsX2NtZHMKKworIyBDcmVhdGUgYW4gb2xkLXN0eWxlIGFyY2hpdmUgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgorb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc19HQ0oKKworIyBDcmVhdGUgYSB0ZW1wb3Jhcnkgb2xkLXN0eWxlIGFyY2hpdmUgdG8gbGluayBpbnN0ZWFkIG9mIGEgc2hhcmVkIGFyY2hpdmUuCitvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfR0NKCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhIHNoYXJlZCBhcmNoaXZlLgorYXJjaGl2ZV9jbWRzPSRsdF9hcmNoaXZlX2NtZHNfR0NKCithcmNoaXZlX2V4cHN5bV9jbWRzPSRsdF9hcmNoaXZlX2V4cHN5bV9jbWRzX0dDSgorcG9zdGluc3RhbGxfY21kcz0kbHRfcG9zdGluc3RhbGxfY21kcworcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9wb3N0dW5pbnN0YWxsX2NtZHMKKworIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGEgbG9hZGFibGUgbW9kdWxlIChhc3N1bWVkIHNhbWUgYXMgYWJvdmUgaWYgZW1wdHkpCittb2R1bGVfY21kcz0kbHRfbW9kdWxlX2NtZHNfR0NKCittb2R1bGVfZXhwc3ltX2NtZHM9JGx0X21vZHVsZV9leHBzeW1fY21kc19HQ0oKKworIyBDb21tYW5kcyB0byBzdHJpcCBsaWJyYXJpZXMuCitvbGRfc3RyaXBsaWI9JGx0X29sZF9zdHJpcGxpYgorc3RyaXBsaWI9JGx0X3N0cmlwbGliCisKKyMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKKyMgc2hhcmVkIGxpYnJhcnkuCitwcmVkZXBfb2JqZWN0cz0kbHRfcHJlZGVwX29iamVjdHNfR0NKCisKKyMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQorIyBzaGFyZWQgbGlicmFyeS4KK3Bvc3RkZXBfb2JqZWN0cz0kbHRfcG9zdGRlcF9vYmplY3RzX0dDSgorCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCisjIHNoYXJlZCBsaWJyYXJ5LgorcHJlZGVwcz0kbHRfcHJlZGVwc19HQ0oKKworIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYWZ0ZXIgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCisjIHNoYXJlZCBsaWJyYXJ5LgorcG9zdGRlcHM9JGx0X3Bvc3RkZXBzX0dDSgorCisjIFRoZSBsaWJyYXJ5IHNlYXJjaCBwYXRoIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgY29tcGlsZXIgd2hlbiBsaW5raW5nCisjIGEgc2hhcmVkIGxpYnJhcnkuCitjb21waWxlcl9saWJfc2VhcmNoX3BhdGg9JGx0X2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9HQ0oKKworIyBNZXRob2QgdG8gY2hlY2sgd2hldGhlciBkZXBlbmRlbnQgbGlicmFyaWVzIGFyZSBzaGFyZWQgb2JqZWN0cy4KK2RlcGxpYnNfY2hlY2tfbWV0aG9kPSRsdF9kZXBsaWJzX2NoZWNrX21ldGhvZAorCisjIENvbW1hbmQgdG8gdXNlIHdoZW4gZGVwbGlic19jaGVja19tZXRob2QgPT0gZmlsZV9tYWdpYy4KK2ZpbGVfbWFnaWNfY21kPSRsdF9maWxlX21hZ2ljX2NtZAorCisjIEZsYWcgdGhhdCBhbGxvd3Mgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHVuZGVmaW5lZCBzeW1ib2xzIHRvIGJlIGJ1aWx0LgorYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGx0X2FsbG93X3VuZGVmaW5lZF9mbGFnX0dDSgorCisjIEZsYWcgdGhhdCBmb3JjZXMgbm8gdW5kZWZpbmVkIHN5bWJvbHMuCitub191bmRlZmluZWRfZmxhZz0kbHRfbm9fdW5kZWZpbmVkX2ZsYWdfR0NKCisKKyMgQ29tbWFuZHMgdXNlZCB0byBmaW5pc2ggYSBsaWJ0b29sIGxpYnJhcnkgaW5zdGFsbGF0aW9uIGluIGEgZGlyZWN0b3J5LgorZmluaXNoX2NtZHM9JGx0X2ZpbmlzaF9jbWRzCisKKyMgU2FtZSBhcyBhYm92ZSwgYnV0IGEgc2luZ2xlIHNjcmlwdCBmcmFnbWVudCB0byBiZSBldmFsZWQgYnV0IG5vdCBzaG93bi4KK2ZpbmlzaF9ldmFsPSRsdF9maW5pc2hfZXZhbAorCisjIFRha2UgdGhlIG91dHB1dCBvZiBubSBhbmQgcHJvZHVjZSBhIGxpc3Rpbmcgb2YgcmF3IHN5bWJvbHMgYW5kIEMgbmFtZXMuCitnbG9iYWxfc3ltYm9sX3BpcGU9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUKKworIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIHByb3BlciBDIGRlY2xhcmF0aW9uCitnbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbAorCisjIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgQyBuYW1lIGFkZHJlc3MgcGFpcgorZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MKKworIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBydW50aW1lIHBhdGggdmFyaWFibGUuCitydW5wYXRoX3Zhcj0kcnVucGF0aF92YXIKKworIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBwYXRoIHZhcmlhYmxlLgorc2hsaWJwYXRoX3Zhcj0kc2hsaWJwYXRoX3ZhcgorCisjIElzIHNobGlicGF0aCBzZWFyY2hlZCBiZWZvcmUgdGhlIGhhcmQtY29kZWQgbGlicmFyeSBzZWFyY2ggcGF0aD8KK3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD0kc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoCisKKyMgSG93IHRvIGhhcmRjb2RlIGEgc2hhcmVkIGxpYnJhcnkgcGF0aCBpbnRvIGFuIGV4ZWN1dGFibGUuCitoYXJkY29kZV9hY3Rpb249JGhhcmRjb2RlX2FjdGlvbl9HQ0oKKworIyBXaGV0aGVyIHdlIHNob3VsZCBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gbGlicmFyaWVzLgoraGFyZGNvZGVfaW50b19saWJzPSRoYXJkY29kZV9pbnRvX2xpYnMKKworIyBGbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8gYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuCisjIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcyBub3QgZXhpc3QuCitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSRsdF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSgorCisjIElmIGxkIGlzIHVzZWQgd2hlbiBsaW5raW5nLCBmbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8KKyMgYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcworIyBub3QgZXhpc3QuCitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkPSRsdF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0dDSgorCisjIFdoZXRoZXIgd2UgbmVlZCBhIHNpbmdsZSAtcnBhdGggZmxhZyB3aXRoIGEgc2VwYXJhdGVkIGFyZ3VtZW50LgoraGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0kbHRfaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9HQ0oKKworIyBTZXQgdG8geWVzIGlmIHVzaW5nIERJUi9saWJOQU1FJHtzaGFyZWRfZXh0fSBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCisjIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9kaXJlY3Q9JGhhcmRjb2RlX2RpcmVjdF9HQ0oKKworIyBTZXQgdG8geWVzIGlmIHVzaW5nIHRoZSAtTERJUiBmbGFnIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKKyMgcmVzdWx0aW5nIGJpbmFyeS4KK2hhcmRjb2RlX21pbnVzX0w9JGhhcmRjb2RlX21pbnVzX0xfR0NKCisKKyMgU2V0IHRvIHllcyBpZiB1c2luZyBTSExJQlBBVEhfVkFSPURJUiBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8KKyMgdGhlIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9zaGxpYnBhdGhfdmFyPSRoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSgorCisjIFNldCB0byB5ZXMgaWYgYnVpbGRpbmcgYSBzaGFyZWQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGhhcmRjb2RlcyBESVIgaW50byB0aGUgbGlicmFyeQorIyBhbmQgYWxsIHN1YnNlcXVlbnQgbGlicmFyaWVzIGFuZCBleGVjdXRhYmxlcyBsaW5rZWQgYWdhaW5zdCBpdC4KK2hhcmRjb2RlX2F1dG9tYXRpYz0kaGFyZGNvZGVfYXV0b21hdGljX0dDSgorCisjIFZhcmlhYmxlcyB3aG9zZSB2YWx1ZXMgc2hvdWxkIGJlIHNhdmVkIGluIGxpYnRvb2wgd3JhcHBlciBzY3JpcHRzIGFuZAorIyByZXN0b3JlZCBhdCByZWxpbmsgdGltZS4KK3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsiCisKKyMgV2hldGhlciBsaWJ0b29sIG11c3QgbGluayBhIHByb2dyYW0gYWdhaW5zdCBhbGwgaXRzIGRlcGVuZGVuY3kgbGlicmFyaWVzLgorbGlua19hbGxfZGVwbGlicz0kbGlua19hbGxfZGVwbGlic19HQ0oKKworIyBDb21waWxlLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKK3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCisKKyMgUnVuLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKK3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRsdF9zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYworCisjIEZpeCB0aGUgc2hlbGwgdmFyaWFibGUgXCRzcmNmaWxlIGZvciB0aGUgY29tcGlsZXIuCitmaXhfc3JjZmlsZV9wYXRoPSIkZml4X3NyY2ZpbGVfcGF0aF9HQ0oiCisKKyMgU2V0IHRvIHllcyBpZiBleHBvcnRlZCBzeW1ib2xzIGFyZSByZXF1aXJlZC4KK2Fsd2F5c19leHBvcnRfc3ltYm9scz0kYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0dDSgorCisjIFRoZSBjb21tYW5kcyB0byBsaXN0IGV4cG9ydGVkIHN5bWJvbHMuCitleHBvcnRfc3ltYm9sc19jbWRzPSRsdF9leHBvcnRfc3ltYm9sc19jbWRzX0dDSgorCisjIFRoZSBjb21tYW5kcyB0byBleHRyYWN0IHRoZSBleHBvcnRlZCBzeW1ib2wgbGlzdCBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCitleHRyYWN0X2V4cHN5bXNfY21kcz0kbHRfZXh0cmFjdF9leHBzeW1zX2NtZHMKKworIyBTeW1ib2xzIHRoYXQgc2hvdWxkIG5vdCBiZSBsaXN0ZWQgaW4gdGhlIHByZWxvYWRlZCBzeW1ib2xzLgorZXhjbHVkZV9leHBzeW1zPSRsdF9leGNsdWRlX2V4cHN5bXNfR0NKCisKKyMgU3ltYm9scyB0aGF0IG11c3QgYWx3YXlzIGJlIGV4cG9ydGVkLgoraW5jbHVkZV9leHBzeW1zPSRsdF9pbmNsdWRlX2V4cHN5bXNfR0NKCisKKyMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lCisKK19fRU9GX18KKworCitlbHNlCisgICMgSWYgdGhlcmUgaXMgbm8gTWFrZWZpbGUgeWV0LCB3ZSByZWx5IG9uIGEgbWFrZSBydWxlIHRvIGV4ZWN1dGUKKyAgIyBgY29uZmlnLnN0YXR1cyAtLXJlY2hlY2snIHRvIHJlcnVuIHRoZXNlIHRlc3RzIGFuZCBjcmVhdGUgdGhlCisgICMgbGlidG9vbCBzY3JpcHQgdGhlbi4KKyAgbHRtYWluX2luPWBlY2hvICRsdG1haW4gfCBzZWQgLWUgJ3MvXC5zaCQvLmluLydgCisgIGlmIHRlc3QgLWYgIiRsdG1haW5faW4iOyB0aGVuCisgICAgdGVzdCAtZiBNYWtlZmlsZSAmJiBtYWtlICIkbHRtYWluIgorICBmaQorZmkKKworCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKK0NDPSIkbHRfc2F2ZV9DQyIKKworCWVsc2UKKwkgIHRhZ25hbWU9IiIKKwlmaQorCTs7CisKKyAgICAgIFJDKQorCisKKyMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBSQyB0ZXN0IHNvdXJjZXMuCithY19leHQ9cmMKKworIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIFJDIHRlc3Qgc291cmNlcy4KK29iamV4dD1vCitvYmpleHRfUkM9JG9iamV4dAorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSdzYW1wbGUgTUVOVSB7IE1FTlVJVEVNICImU291cCIsIDEwMCwgQ0hFQ0tFRCB9XG4nCisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCitsdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9IiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiCisKKyMgbHRtYWluIG9ubHkgdXNlcyAkQ0MgZm9yIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzbyBtYWtlIHN1cmUgJENDIGlzIHNldC4KKworIyBJZiBubyBDIGNvbXBpbGVyIHdhcyBzcGVjaWZpZWQsIHVzZSBDQy4KK0xUQ0M9JHtMVENDLSIkQ0MifQorCisjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorY29tcGlsZXI9JENDCisKKworIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KK2x0X3NhdmVfQ0M9IiRDQyIKK0NDPSR7UkMtIndpbmRyZXMifQorY29tcGlsZXI9JENDCitjb21waWxlcl9SQz0kQ0MKK2x0X2N2X3Byb2dfY29tcGlsZXJfY19vX1JDPXllcworCisjIFRoZSBlbHNlIGNsYXVzZSBzaG91bGQgb25seSBmaXJlIHdoZW4gYm9vdHN0cmFwcGluZyB0aGUKKyMgbGlidG9vbCBkaXN0cmlidXRpb24sIG90aGVyd2lzZSB5b3UgZm9yZ290IHRvIHNoaXAgbHRtYWluLnNoCisjIHdpdGggeW91ciBwYWNrYWdlLCBhbmQgeW91IHdpbGwgZ2V0IGNvbXBsYWludHMgdGhhdCB0aGVyZSBhcmUKKyMgbm8gcnVsZXMgdG8gZ2VuZXJhdGUgbHRtYWluLnNoLgoraWYgdGVzdCAtZiAiJGx0bWFpbiI7IHRoZW4KKyAgIyBTZWUgaWYgd2UgYXJlIHJ1bm5pbmcgb24genNoLCBhbmQgc2V0IHRoZSBvcHRpb25zIHdoaWNoIGFsbG93IG91ciBjb21tYW5kcyB0aHJvdWdoCisgICMgd2l0aG91dCByZW1vdmFsIG9mIFwgZXNjYXBlcy4KKyAgaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KKyAgICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorICBmaQorICAjIE5vdyBxdW90ZSBhbGwgdGhlIHRoaW5ncyB0aGF0IG1heSBjb250YWluIG1ldGFjaGFyYWN0ZXJzIHdoaWxlIGJlaW5nCisgICMgY2FyZWZ1bCBub3QgdG8gb3ZlcnF1b3RlIHRoZSBBQ19TVUJTVGVkIHZhbHVlcy4gIFdlIHRha2UgY29waWVzIG9mIHRoZQorICAjIHZhcmlhYmxlcyBhbmQgcXVvdGUgdGhlIGNvcGllcyBmb3IgZ2VuZXJhdGlvbiBvZiB0aGUgbGlidG9vbCBzY3JpcHQuCisgIGZvciB2YXIgaW4gZWNobyBvbGRfQ0Mgb2xkX0NGTEFHUyBBUiBBUl9GTEFHUyBFR1JFUCBSQU5MSUIgTE5fUyBMVENDIE5NIFwKKyAgICBTRUQgU0hFTEwgU1RSSVAgXAorICAgIGxpYm5hbWVfc3BlYyBsaWJyYXJ5X25hbWVzX3NwZWMgc29uYW1lX3NwZWMgZXh0cmFjdF9leHBzeW1zX2NtZHMgXAorICAgIG9sZF9zdHJpcGxpYiBzdHJpcGxpYiBmaWxlX21hZ2ljX2NtZCBmaW5pc2hfY21kcyBmaW5pc2hfZXZhbCBcCisgICAgZGVwbGlic19jaGVja19tZXRob2QgcmVsb2FkX2ZsYWcgcmVsb2FkX2NtZHMgbmVlZF9sb2NrcyBcCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCBcCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MgXAorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYyBcCisgICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyBcCisgICAgY29tcGlsZXJfUkMgXAorICAgIENDX1JDIFwKKyAgICBMRF9SQyBcCisgICAgbHRfcHJvZ19jb21waWxlcl93bF9SQyBcCisgICAgbHRfcHJvZ19jb21waWxlcl9waWNfUkMgXAorICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX1JDIFwKKyAgICBsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19SQyBcCisgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX1JDIFwKKyAgICB0aHJlYWRfc2FmZV9mbGFnX3NwZWNfUkMgXAorICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX1JDIFwKKyAgICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX1JDIFwKKyAgICBvbGRfYXJjaGl2ZV9jbWRzX1JDIFwKKyAgICBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzX1JDIFwKKyAgICBwcmVkZXBfb2JqZWN0c19SQyBcCisgICAgcG9zdGRlcF9vYmplY3RzX1JDIFwKKyAgICBwcmVkZXBzX1JDIFwKKyAgICBwb3N0ZGVwc19SQyBcCisgICAgY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX1JDIFwKKyAgICBhcmNoaXZlX2NtZHNfUkMgXAorICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfUkMgXAorICAgIHBvc3RpbnN0YWxsX2NtZHNfUkMgXAorICAgIHBvc3R1bmluc3RhbGxfY21kc19SQyBcCisgICAgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfUkMgXAorICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX1JDIFwKKyAgICBub191bmRlZmluZWRfZmxhZ19SQyBcCisgICAgZXhwb3J0X3N5bWJvbHNfY21kc19SQyBcCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19SQyBcCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9SQyBcCisgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9SQyBcCisgICAgaGFyZGNvZGVfYXV0b21hdGljX1JDIFwKKyAgICBtb2R1bGVfY21kc19SQyBcCisgICAgbW9kdWxlX2V4cHN5bV9jbWRzX1JDIFwKKyAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19SQyBcCisgICAgZXhjbHVkZV9leHBzeW1zX1JDIFwKKyAgICBpbmNsdWRlX2V4cHN5bXNfUkM7IGRvCisKKyAgICBjYXNlICR2YXIgaW4KKyAgICBvbGRfYXJjaGl2ZV9jbWRzX1JDIHwgXAorICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNfUkMgfCBcCisgICAgYXJjaGl2ZV9jbWRzX1JDIHwgXAorICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfUkMgfCBcCisgICAgbW9kdWxlX2NtZHNfUkMgfCBcCisgICAgbW9kdWxlX2V4cHN5bV9jbWRzX1JDIHwgXAorICAgIG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzX1JDIHwgXAorICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfUkMgfCBcCisgICAgZXh0cmFjdF9leHBzeW1zX2NtZHMgfCByZWxvYWRfY21kcyB8IGZpbmlzaF9jbWRzIHwgXAorICAgIHBvc3RpbnN0YWxsX2NtZHMgfCBwb3N0dW5pbnN0YWxsX2NtZHMgfCBcCisgICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgfCBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIHwgXAorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyB8IHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjKQorICAgICAgIyBEb3VibGUtcXVvdGUgZG91YmxlLWV2YWxlZCBzdHJpbmdzLgorICAgICAgZXZhbCAibHRfJHZhcj1cXFwiXGBcJGVjaG8gXCJYXCQkdmFyXCIgfCBcJFhzZWQgLWUgXCJcJGRvdWJsZV9xdW90ZV9zdWJzdFwiIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIiAtZSBcIlwkZGVsYXlfdmFyaWFibGVfc3Vic3RcIlxgXFxcIiIKKyAgICAgIDs7CisgICAgKikKKyAgICAgIGV2YWwgImx0XyR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIlxgXFxcIiIKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCisKKyAgY2FzZSAkbHRfZWNobyBpbgorICAqJ1wkMCAtLWZhbGxiYWNrLWVjaG8iJykKKyAgICBsdF9lY2hvPWAkZWNobyAiWCRsdF9lY2hvIiB8ICRYc2VkIC1lICdzL1xcXFxcXFwkMCAtLWZhbGxiYWNrLWVjaG8iJC8kMCAtLWZhbGxiYWNrLWVjaG8iLydgCisgICAgOzsKKyAgZXNhYworCitjZmdmaWxlPSIkb2ZpbGUiCisKKyAgY2F0IDw8X19FT0ZfXyA+PiAiJGNmZ2ZpbGUiCisjICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lCisKKyMgTGlidG9vbCB3YXMgY29uZmlndXJlZCBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKKworIyBTaGVsbCB0byB1c2Ugd2hlbiBpbnZva2luZyBzaGVsbCBzY3JpcHRzLgorU0hFTEw9JGx0X1NIRUxMCisKKyMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcy4KK2J1aWxkX2xpYnRvb2xfbGlicz0kZW5hYmxlX3NoYXJlZAorCisjIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMuCitidWlsZF9vbGRfbGlicz0kZW5hYmxlX3N0YXRpYworCisjIFdoZXRoZXIgb3Igbm90IHRvIGFkZCAtbGMgZm9yIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMuCitidWlsZF9saWJ0b29sX25lZWRfbGM9JGFyY2hpdmVfY21kc19uZWVkX2xjX1JDCisKKyMgV2hldGhlciBvciBub3QgdG8gZGlzYWxsb3cgc2hhcmVkIGxpYnMgd2hlbiBydW50aW1lIGxpYnMgYXJlIHN0YXRpYworYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzPSRlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX1JDCisKKyMgV2hldGhlciBvciBub3QgdG8gb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uLgorZmFzdF9pbnN0YWxsPSRlbmFibGVfZmFzdF9pbnN0YWxsCisKKyMgVGhlIGhvc3Qgc3lzdGVtLgoraG9zdF9hbGlhcz0kaG9zdF9hbGlhcworaG9zdD0kaG9zdAorCisjIEFuIGVjaG8gcHJvZ3JhbSB0aGF0IGRvZXMgbm90IGludGVycHJldCBiYWNrc2xhc2hlcy4KK2VjaG89JGx0X2VjaG8KKworIyBUaGUgYXJjaGl2ZXIuCitBUj0kbHRfQVIKK0FSX0ZMQUdTPSRsdF9BUl9GTEFHUworCisjIEEgQyBjb21waWxlci4KK0xUQ0M9JGx0X0xUQ0MKKworIyBBIGxhbmd1YWdlLXNwZWNpZmljIGNvbXBpbGVyLgorQ0M9JGx0X2NvbXBpbGVyX1JDCisKKyMgSXMgdGhlIGNvbXBpbGVyIHRoZSBHTlUgQyBjb21waWxlcj8KK3dpdGhfZ2NjPSRHQ0NfUkMKKworIyBBbiBFUkUgbWF0Y2hlci4KK0VHUkVQPSRsdF9FR1JFUAorCisjIFRoZSBsaW5rZXIgdXNlZCB0byBidWlsZCBsaWJyYXJpZXMuCitMRD0kbHRfTERfUkMKKworIyBXaGV0aGVyIHdlIG5lZWQgaGFyZCBvciBzb2Z0IGxpbmtzLgorTE5fUz0kbHRfTE5fUworCisjIEEgQlNELWNvbXBhdGlibGUgbm0gcHJvZ3JhbS4KK05NPSRsdF9OTQorCisjIEEgc3ltYm9sIHN0cmlwcGluZyBwcm9ncmFtCitTVFJJUD0kbHRfU1RSSVAKKworIyBVc2VkIHRvIGV4YW1pbmUgbGlicmFyaWVzIHdoZW4gZmlsZV9tYWdpY19jbWQgYmVnaW5zICJmaWxlIgorTUFHSUNfQ01EPSRNQUdJQ19DTUQKKworIyBVc2VkIG9uIGN5Z3dpbjogRExMIGNyZWF0aW9uIHByb2dyYW0uCitETExUT09MPSIkRExMVE9PTCIKKworIyBVc2VkIG9uIGN5Z3dpbjogb2JqZWN0IGR1bXBlci4KK09CSkRVTVA9IiRPQkpEVU1QIgorCisjIFVzZWQgb24gY3lnd2luOiBhc3NlbWJsZXIuCitBUz0iJEFTIgorCisjIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0ZW1wb3JhcnkgbGlidG9vbCBmaWxlcy4KK29iamRpcj0kb2JqZGlyCisKKyMgSG93IHRvIGNyZWF0ZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlcy4KK3JlbG9hZF9mbGFnPSRsdF9yZWxvYWRfZmxhZworcmVsb2FkX2NtZHM9JGx0X3JlbG9hZF9jbWRzCisKKyMgSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlci4KK3dsPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3dsX1JDCisKKyMgT2JqZWN0IGZpbGUgc3VmZml4IChub3JtYWxseSAibyIpLgorb2JqZXh0PSIkYWNfb2JqZXh0IgorCisjIE9sZCBhcmNoaXZlIHN1ZmZpeCAobm9ybWFsbHkgImEiKS4KK2xpYmV4dD0iJGxpYmV4dCIKKworIyBTaGFyZWQgbGlicmFyeSBzdWZmaXggKG5vcm1hbGx5ICIuc28iKS4KK3NocmV4dF9jbWRzPSckc2hyZXh0X2NtZHMnCisKKyMgRXhlY3V0YWJsZSBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIiIpLgorZXhlZXh0PSIkZXhlZXh0IgorCisjIEFkZGl0aW9uYWwgY29tcGlsZXIgZmxhZ3MgZm9yIGJ1aWxkaW5nIGxpYnJhcnkgb2JqZWN0cy4KK3BpY19mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3BpY19SQworcGljX21vZGU9JHBpY19tb2RlCisKKyMgV2hhdCBpcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgYSBjb21tYW5kPworbWF4X2NtZF9sZW49JGx0X2N2X3N5c19tYXhfY21kX2xlbgorCisjIERvZXMgY29tcGlsZXIgc2ltdWx0YW5lb3VzbHkgc3VwcG9ydCAtYyBhbmQgLW8gb3B0aW9ucz8KK2NvbXBpbGVyX2Nfbz0kbHRfbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fUkMKKworIyBNdXN0IHdlIGxvY2sgZmlsZXMgd2hlbiBkb2luZyBjb21waWxhdGlvbiA/CituZWVkX2xvY2tzPSRsdF9uZWVkX2xvY2tzCisKKyMgRG8gd2UgbmVlZCB0aGUgbGliIHByZWZpeCBmb3IgbW9kdWxlcz8KK25lZWRfbGliX3ByZWZpeD0kbmVlZF9saWJfcHJlZml4CisKKyMgRG8gd2UgbmVlZCBhIHZlcnNpb24gZm9yIGxpYnJhcmllcz8KK25lZWRfdmVyc2lvbj0kbmVlZF92ZXJzaW9uCisKKyMgV2hldGhlciBkbG9wZW4gaXMgc3VwcG9ydGVkLgorZGxvcGVuX3N1cHBvcnQ9JGVuYWJsZV9kbG9wZW4KKworIyBXaGV0aGVyIGRsb3BlbiBvZiBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCitkbG9wZW5fc2VsZj0kZW5hYmxlX2Rsb3Blbl9zZWxmCisKKyMgV2hldGhlciBkbG9wZW4gb2Ygc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkLgorZGxvcGVuX3NlbGZfc3RhdGljPSRlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljCisKKyMgQ29tcGlsZXIgZmxhZyB0byBwcmV2ZW50IGR5bmFtaWMgbGlua2luZy4KK2xpbmtfc3RhdGljX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfc3RhdGljX1JDCisKKyMgQ29tcGlsZXIgZmxhZyB0byB0dXJuIG9mZiBidWlsdGluIGZ1bmN0aW9ucy4KK25vX2J1aWx0aW5fZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfUkMKKworIyBDb21waWxlciBmbGFnIHRvIGFsbG93IHJlZmxleGl2ZSBkbG9wZW5zLgorZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPSRsdF9leHBvcnRfZHluYW1pY19mbGFnX3NwZWNfUkMKKworIyBDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHNoYXJlZCBvYmplY3RzIGRpcmVjdGx5IGZyb20gYXJjaGl2ZXMuCit3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0kbHRfd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfUkMKKworIyBDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHRocmVhZC1zYWZlIG9iamVjdHMuCit0aHJlYWRfc2FmZV9mbGFnX3NwZWM9JGx0X3RocmVhZF9zYWZlX2ZsYWdfc3BlY19SQworCisjIExpYnJhcnkgdmVyc2lvbmluZyB0eXBlLgordmVyc2lvbl90eXBlPSR2ZXJzaW9uX3R5cGUKKworIyBGb3JtYXQgb2YgbGlicmFyeSBuYW1lIHByZWZpeC4KK2xpYm5hbWVfc3BlYz0kbHRfbGlibmFtZV9zcGVjCisKKyMgTGlzdCBvZiBhcmNoaXZlIG5hbWVzLiAgRmlyc3QgbmFtZSBpcyB0aGUgcmVhbCBvbmUsIHRoZSByZXN0IGFyZSBsaW5rcy4KKyMgVGhlIGxhc3QgbmFtZSBpcyB0aGUgb25lIHRoYXQgdGhlIGxpbmtlciBmaW5kcyB3aXRoIC1sTkFNRS4KK2xpYnJhcnlfbmFtZXNfc3BlYz0kbHRfbGlicmFyeV9uYW1lc19zcGVjCisKKyMgVGhlIGNvZGVkIG5hbWUgb2YgdGhlIGxpYnJhcnksIGlmIGRpZmZlcmVudCBmcm9tIHRoZSByZWFsIG5hbWUuCitzb25hbWVfc3BlYz0kbHRfc29uYW1lX3NwZWMKKworIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGFuIG9sZC1zdHlsZSBhcmNoaXZlLgorUkFOTElCPSRsdF9SQU5MSUIKK29sZF9hcmNoaXZlX2NtZHM9JGx0X29sZF9hcmNoaXZlX2NtZHNfUkMKK29sZF9wb3N0aW5zdGFsbF9jbWRzPSRsdF9vbGRfcG9zdGluc3RhbGxfY21kcworb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0kbHRfb2xkX3Bvc3R1bmluc3RhbGxfY21kcworCisjIENyZWF0ZSBhbiBvbGQtc3R5bGUgYXJjaGl2ZSBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCitvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPSRsdF9vbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzX1JDCisKKyMgQ3JlYXRlIGEgdGVtcG9yYXJ5IG9sZC1zdHlsZSBhcmNoaXZlIHRvIGxpbmsgaW5zdGVhZCBvZiBhIHNoYXJlZCBhcmNoaXZlLgorb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHM9JGx0X29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzX1JDCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhIHNoYXJlZCBhcmNoaXZlLgorYXJjaGl2ZV9jbWRzPSRsdF9hcmNoaXZlX2NtZHNfUkMKK2FyY2hpdmVfZXhwc3ltX2NtZHM9JGx0X2FyY2hpdmVfZXhwc3ltX2NtZHNfUkMKK3Bvc3RpbnN0YWxsX2NtZHM9JGx0X3Bvc3RpbnN0YWxsX2NtZHMKK3Bvc3R1bmluc3RhbGxfY21kcz0kbHRfcG9zdHVuaW5zdGFsbF9jbWRzCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhIGxvYWRhYmxlIG1vZHVsZSAoYXNzdW1lZCBzYW1lIGFzIGFib3ZlIGlmIGVtcHR5KQorbW9kdWxlX2NtZHM9JGx0X21vZHVsZV9jbWRzX1JDCittb2R1bGVfZXhwc3ltX2NtZHM9JGx0X21vZHVsZV9leHBzeW1fY21kc19SQworCisjIENvbW1hbmRzIHRvIHN0cmlwIGxpYnJhcmllcy4KK29sZF9zdHJpcGxpYj0kbHRfb2xkX3N0cmlwbGliCitzdHJpcGxpYj0kbHRfc3RyaXBsaWIKKworIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYmVmb3JlIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQorIyBzaGFyZWQgbGlicmFyeS4KK3ByZWRlcF9vYmplY3RzPSRsdF9wcmVkZXBfb2JqZWN0c19SQworCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBhZnRlciB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKKyMgc2hhcmVkIGxpYnJhcnkuCitwb3N0ZGVwX29iamVjdHM9JGx0X3Bvc3RkZXBfb2JqZWN0c19SQworCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCisjIHNoYXJlZCBsaWJyYXJ5LgorcHJlZGVwcz0kbHRfcHJlZGVwc19SQworCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBhZnRlciB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKKyMgc2hhcmVkIGxpYnJhcnkuCitwb3N0ZGVwcz0kbHRfcG9zdGRlcHNfUkMKKworIyBUaGUgbGlicmFyeSBzZWFyY2ggcGF0aCB1c2VkIGludGVybmFsbHkgYnkgdGhlIGNvbXBpbGVyIHdoZW4gbGlua2luZworIyBhIHNoYXJlZCBsaWJyYXJ5LgorY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoPSRsdF9jb21waWxlcl9saWJfc2VhcmNoX3BhdGhfUkMKKworIyBNZXRob2QgdG8gY2hlY2sgd2hldGhlciBkZXBlbmRlbnQgbGlicmFyaWVzIGFyZSBzaGFyZWQgb2JqZWN0cy4KK2RlcGxpYnNfY2hlY2tfbWV0aG9kPSRsdF9kZXBsaWJzX2NoZWNrX21ldGhvZAorCisjIENvbW1hbmQgdG8gdXNlIHdoZW4gZGVwbGlic19jaGVja19tZXRob2QgPT0gZmlsZV9tYWdpYy4KK2ZpbGVfbWFnaWNfY21kPSRsdF9maWxlX21hZ2ljX2NtZAorCisjIEZsYWcgdGhhdCBhbGxvd3Mgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHVuZGVmaW5lZCBzeW1ib2xzIHRvIGJlIGJ1aWx0LgorYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGx0X2FsbG93X3VuZGVmaW5lZF9mbGFnX1JDCisKKyMgRmxhZyB0aGF0IGZvcmNlcyBubyB1bmRlZmluZWQgc3ltYm9scy4KK25vX3VuZGVmaW5lZF9mbGFnPSRsdF9ub191bmRlZmluZWRfZmxhZ19SQworCisjIENvbW1hbmRzIHVzZWQgdG8gZmluaXNoIGEgbGlidG9vbCBsaWJyYXJ5IGluc3RhbGxhdGlvbiBpbiBhIGRpcmVjdG9yeS4KK2ZpbmlzaF9jbWRzPSRsdF9maW5pc2hfY21kcworCisjIFNhbWUgYXMgYWJvdmUsIGJ1dCBhIHNpbmdsZSBzY3JpcHQgZnJhZ21lbnQgdG8gYmUgZXZhbGVkIGJ1dCBub3Qgc2hvd24uCitmaW5pc2hfZXZhbD0kbHRfZmluaXNoX2V2YWwKKworIyBUYWtlIHRoZSBvdXRwdXQgb2Ygbm0gYW5kIHByb2R1Y2UgYSBsaXN0aW5nIG9mIHJhdyBzeW1ib2xzIGFuZCBDIG5hbWVzLgorZ2xvYmFsX3N5bWJvbF9waXBlPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlCisKKyMgVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgorZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wKKworIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIEMgbmFtZSBhZGRyZXNzIHBhaXIKK2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzCisKKyMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcnVudGltZSBwYXRoIHZhcmlhYmxlLgorcnVucGF0aF92YXI9JHJ1bnBhdGhfdmFyCisKKyMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcGF0aCB2YXJpYWJsZS4KK3NobGlicGF0aF92YXI9JHNobGlicGF0aF92YXIKKworIyBJcyBzaGxpYnBhdGggc2VhcmNoZWQgYmVmb3JlIHRoZSBoYXJkLWNvZGVkIGxpYnJhcnkgc2VhcmNoIHBhdGg/CitzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9JHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aAorCisjIEhvdyB0byBoYXJkY29kZSBhIHNoYXJlZCBsaWJyYXJ5IHBhdGggaW50byBhbiBleGVjdXRhYmxlLgoraGFyZGNvZGVfYWN0aW9uPSRoYXJkY29kZV9hY3Rpb25fUkMKKworIyBXaGV0aGVyIHdlIHNob3VsZCBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gbGlicmFyaWVzLgoraGFyZGNvZGVfaW50b19saWJzPSRoYXJkY29kZV9pbnRvX2xpYnMKKworIyBGbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8gYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuCisjIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcyBub3QgZXhpc3QuCitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSRsdF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX1JDCisKKyMgSWYgbGQgaXMgdXNlZCB3aGVuIGxpbmtpbmcsIGZsYWcgdG8gaGFyZGNvZGUgXCRsaWJkaXIgaW50bworIyBhIGJpbmFyeSBkdXJpbmcgbGlua2luZy4gVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiBcJGxpYmRpciBkb2VzCisjIG5vdCBleGlzdC4KK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQ9JGx0X2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfUkMKKworIyBXaGV0aGVyIHdlIG5lZWQgYSBzaW5nbGUgLXJwYXRoIGZsYWcgd2l0aCBhIHNlcGFyYXRlZCBhcmd1bWVudC4KK2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9JGx0X2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfUkMKKworIyBTZXQgdG8geWVzIGlmIHVzaW5nIERJUi9saWJOQU1FJHtzaGFyZWRfZXh0fSBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCisjIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9kaXJlY3Q9JGhhcmRjb2RlX2RpcmVjdF9SQworCisjIFNldCB0byB5ZXMgaWYgdXNpbmcgdGhlIC1MRElSIGZsYWcgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQorIyByZXN1bHRpbmcgYmluYXJ5LgoraGFyZGNvZGVfbWludXNfTD0kaGFyZGNvZGVfbWludXNfTF9SQworCisjIFNldCB0byB5ZXMgaWYgdXNpbmcgU0hMSUJQQVRIX1ZBUj1ESVIgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvCisjIHRoZSByZXN1bHRpbmcgYmluYXJ5LgoraGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj0kaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9SQworCisjIFNldCB0byB5ZXMgaWYgYnVpbGRpbmcgYSBzaGFyZWQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGhhcmRjb2RlcyBESVIgaW50byB0aGUgbGlicmFyeQorIyBhbmQgYWxsIHN1YnNlcXVlbnQgbGlicmFyaWVzIGFuZCBleGVjdXRhYmxlcyBsaW5rZWQgYWdhaW5zdCBpdC4KK2hhcmRjb2RlX2F1dG9tYXRpYz0kaGFyZGNvZGVfYXV0b21hdGljX1JDCisKKyMgVmFyaWFibGVzIHdob3NlIHZhbHVlcyBzaG91bGQgYmUgc2F2ZWQgaW4gbGlidG9vbCB3cmFwcGVyIHNjcmlwdHMgYW5kCisjIHJlc3RvcmVkIGF0IHJlbGluayB0aW1lLgordmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9IiR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluayIKKworIyBXaGV0aGVyIGxpYnRvb2wgbXVzdCBsaW5rIGEgcHJvZ3JhbSBhZ2FpbnN0IGFsbCBpdHMgZGVwZW5kZW5jeSBsaWJyYXJpZXMuCitsaW5rX2FsbF9kZXBsaWJzPSRsaW5rX2FsbF9kZXBsaWJzX1JDCisKKyMgQ29tcGlsZS10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCitzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9JGx0X3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYworCisjIFJ1bi10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCitzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMKKworIyBGaXggdGhlIHNoZWxsIHZhcmlhYmxlIFwkc3JjZmlsZSBmb3IgdGhlIGNvbXBpbGVyLgorZml4X3NyY2ZpbGVfcGF0aD0iJGZpeF9zcmNmaWxlX3BhdGhfUkMiCisKKyMgU2V0IHRvIHllcyBpZiBleHBvcnRlZCBzeW1ib2xzIGFyZSByZXF1aXJlZC4KK2Fsd2F5c19leHBvcnRfc3ltYm9scz0kYWx3YXlzX2V4cG9ydF9zeW1ib2xzX1JDCisKKyMgVGhlIGNvbW1hbmRzIHRvIGxpc3QgZXhwb3J0ZWQgc3ltYm9scy4KK2V4cG9ydF9zeW1ib2xzX2NtZHM9JGx0X2V4cG9ydF9zeW1ib2xzX2NtZHNfUkMKKworIyBUaGUgY29tbWFuZHMgdG8gZXh0cmFjdCB0aGUgZXhwb3J0ZWQgc3ltYm9sIGxpc3QgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgorZXh0cmFjdF9leHBzeW1zX2NtZHM9JGx0X2V4dHJhY3RfZXhwc3ltc19jbWRzCisKKyMgU3ltYm9scyB0aGF0IHNob3VsZCBub3QgYmUgbGlzdGVkIGluIHRoZSBwcmVsb2FkZWQgc3ltYm9scy4KK2V4Y2x1ZGVfZXhwc3ltcz0kbHRfZXhjbHVkZV9leHBzeW1zX1JDCisKKyMgU3ltYm9scyB0aGF0IG11c3QgYWx3YXlzIGJlIGV4cG9ydGVkLgoraW5jbHVkZV9leHBzeW1zPSRsdF9pbmNsdWRlX2V4cHN5bXNfUkMKKworIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogJHRhZ25hbWUKKworX19FT0ZfXworCisKK2Vsc2UKKyAgIyBJZiB0aGVyZSBpcyBubyBNYWtlZmlsZSB5ZXQsIHdlIHJlbHkgb24gYSBtYWtlIHJ1bGUgdG8gZXhlY3V0ZQorICAjIGBjb25maWcuc3RhdHVzIC0tcmVjaGVjaycgdG8gcmVydW4gdGhlc2UgdGVzdHMgYW5kIGNyZWF0ZSB0aGUKKyAgIyBsaWJ0b29sIHNjcmlwdCB0aGVuLgorICBsdG1haW5faW49YGVjaG8gJGx0bWFpbiB8IHNlZCAtZSAncy9cLnNoJC8uaW4vJ2AKKyAgaWYgdGVzdCAtZiAiJGx0bWFpbl9pbiI7IHRoZW4KKyAgICB0ZXN0IC1mIE1ha2VmaWxlICYmIG1ha2UgIiRsdG1haW4iCisgIGZpCitmaQorCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworQ0M9IiRsdF9zYXZlX0NDIgorCisJOzsKKworICAgICAgKikKKwlhc19mbl9lcnJvciAiVW5zdXBwb3J0ZWQgdGFnIG5hbWU6ICR0YWduYW1lIiAiJExJTkVOTyIgNQorCTs7CisgICAgICBlc2FjCisKKyAgICAgICMgQXBwZW5kIHRoZSBuZXcgdGFnIG5hbWUgdG8gdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIHRhZ3MuCisgICAgICBpZiB0ZXN0IC1uICIkdGFnbmFtZSIgOyB0aGVuCisgICAgICBhdmFpbGFibGVfdGFncz0iJGF2YWlsYWJsZV90YWdzICR0YWduYW1lIgorICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRsdF9zYXZlX2lmcyIKKworICAjIE5vdyBzdWJzdGl0dXRlIHRoZSB1cGRhdGVkIGxpc3Qgb2YgYXZhaWxhYmxlIHRhZ3MuCisgIGlmIGV2YWwgInNlZCAtZSAncy9eYXZhaWxhYmxlX3RhZ3M9LipcJC9hdmFpbGFibGVfdGFncz1cIiRhdmFpbGFibGVfdGFnc1wiLycgXCIkb2ZpbGVcIiA+IFwiJHtvZmlsZX1UXCIiOyB0aGVuCisgICAgbXYgIiR7b2ZpbGV9VCIgIiRvZmlsZSIKKyAgICBjaG1vZCAreCAiJG9maWxlIgorICBlbHNlCisgICAgcm0gLWYgIiR7b2ZpbGV9VCIKKyAgICBhc19mbl9lcnJvciAidW5hYmxlIHRvIHVwZGF0ZSBsaXN0IG9mIGF2YWlsYWJsZSB0YWdnZWQgY29uZmlndXJhdGlvbnMuIiAiJExJTkVOTyIgNQorICBmaQorZmkKKworCisKKyMgVGhpcyBjYW4gYmUgdXNlZCB0byByZWJ1aWxkIGxpYnRvb2wgd2hlbiBuZWVkZWQKK0xJQlRPT0xfREVQUz0iJGFjX2F1eF9kaXIvbHRtYWluLnNoIgorCisjIEFsd2F5cyB1c2Ugb3VyIG93biBsaWJ0b29sLgorTElCVE9PTD0nJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wnCisKKyMgUHJldmVudCBtdWx0aXBsZSBleHBhbnNpb24KKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIEdlbmVyYWwgZGVmaW5pdGlvbnMuICMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIFVzZWQgYnkgbGliZ2NyeXB0LWNvbmZpZworTElCR0NSWVBUX0NPTkZJR19MSUJTPSItbGdjcnlwdCIKK0xJQkdDUllQVF9DT05GSUdfQ0ZMQUdTPSIiCisKKyMgRGVmaW5pdGlvbnMgZm9yIHN5bW1ldHJpYyBjaXBoZXJzLgorYXZhaWxhYmxlX2NpcGhlcnM9ImFyY2ZvdXIgYmxvd2Zpc2ggY2FzdDUgZGVzIGFlcyB0d29maXNoIHNlcnBlbnQgcmZjMjI2OCBzZWVkIgorYXZhaWxhYmxlX2NpcGhlcnM9IiRhdmFpbGFibGVfY2lwaGVycyBjYW1lbGxpYSIKK2VuYWJsZWRfY2lwaGVycz0iIgorCisjIERlZmluaXRpb25zIGZvciBwdWJsaWMta2V5IGNpcGhlcnMuCithdmFpbGFibGVfcHVia2V5X2NpcGhlcnM9ImRzYSBlbGdhbWFsIHJzYSBlY2MiCitlbmFibGVkX3B1YmtleV9jaXBoZXJzPSIiCisKKyMgRGVmaW5pdGlvbnMgZm9yIG1lc3NhZ2UgZGlnZXN0cy4KK2F2YWlsYWJsZV9kaWdlc3RzPSJjcmMgbWQ0IG1kNSBybWQxNjAgc2hhMSBzaGEyNTYiCithdmFpbGFibGVfZGlnZXN0c182ND0ic2hhNTEyIHRpZ2VyIHdoaXJscG9vbCIKK2VuYWJsZWRfZGlnZXN0cz0iIgorCisjIERlZmluaXRpb25zIGZvciByYW5kb20gbW9kdWxlcy4KK2F2YWlsYWJsZV9yYW5kb21fbW9kdWxlcz0ibGludXggZWdkIHVuaXgiCithdXRvX3JhbmRvbV9tb2R1bGVzPSIkYXZhaWxhYmxlX3JhbmRvbV9tb2R1bGVzIgorCisjIFN1cHBvcnRlZCB0aHJlYWQgYmFja2VuZHMuCitMSUJHQ1JZUFRfVEhSRUFEX01PRFVMRVM9IiIKKworIyBPdGhlciBkZWZpbml0aW9ucy4KK3ByaW50X2VnZF9ub3RpY2U9bm8KK2hhdmVfdzMyX3N5c3RlbT1ubworCisjIFNldHVwIHNvbWUgc3R1ZmYgZGVwZW5kaW5nIG9uIGhvc3QuCitjYXNlICIke2hvc3R9IiBpbgorICAgICotKi1taW5ndzMyKikKKyAgICAgIGF2YWlsYWJsZV9yYW5kb21fbW9kdWxlcz0idzMyIgorICAgICAgYWNfY3ZfaGF2ZV9kZXZfcmFuZG9tPW5vCisgICAgICBoYXZlX3czMl9zeXN0ZW09eWVzCisKKyRhc19lY2hvICIjZGVmaW5lIFVTRV9PTkxZXzhET1QzIDEiID4+Y29uZmRlZnMuaAorCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfRFJJVkVfTEVUVEVSUyAxIiA+PmNvbmZkZWZzLmgKKworCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0RPU0lTSF9TWVNURU0gMSIgPj5jb25mZGVmcy5oCisKKyAgICAgIDs7CisKKyAgICBpPzg2LWVteC1vczIgfCBpPzg2LSotb3MyKmVteCkKKyAgICAgICAgIyBPUy8yIHdpdGggdGhlIEVNWCBlbnZpcm9ubWVudAorICAgICAgICBhY19jdl9oYXZlX2Rldl9yYW5kb209bm8KKyAgICAgICAgJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9EUklWRV9MRVRURVJTIDEiID4+Y29uZmRlZnMuaAorCisgICAgICAgICRhc19lY2hvICIjZGVmaW5lIEhBVkVfRE9TSVNIX1NZU1RFTSAxIiA+PmNvbmZkZWZzLmgKKworICAgICAgICA7OworCisgICAgaT84Ni0qLW1zZG9zZGpncHAqKQorICAgICAgICAjIERPUyB3aXRoIHRoZSBESkdQUCBlbnZpcm9ubWVudAorICAgICAgICBhY19jdl9oYXZlX2Rldl9yYW5kb209bm8KKyAgICAgICAgJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9EUklWRV9MRVRURVJTIDEiID4+Y29uZmRlZnMuaAorCisgICAgICAgICRhc19lY2hvICIjZGVmaW5lIEhBVkVfRE9TSVNIX1NZU1RFTSAxIiA+PmNvbmZkZWZzLmgKKworICAgICAgICA7OworCisgICAgKi0qLWZyZWVic2QqKQorICAgICAgICMgRnJlZUJTRAorICAgICAgIENQUEZMQUdTPSIkQ1BQRkxBR1MgLUkvdXNyL2xvY2FsL2luY2x1ZGUiCisgICAgICAgTERGTEFHUz0iJExERkxBR1MgLUwvdXNyL2xvY2FsL2xpYiIKKyAgICAgICA7OworCisgICAgKi0qLWhwdXgqKQorICAgICAgICBpZiB0ZXN0IC16ICIkR0NDIiA7IHRoZW4KKyAgICAgICAgICAgIENGTEFHUz0iJENGTEFHUyAtQWUgLURfSFBVWF9TT1VSQ0UiCisgICAgICAgIGZpCisgICAgICAgIDs7CisgICAgKi1kZWMtb3NmNCopCisgICAgICAgIGlmIHRlc3QgLXogIiRHQ0MiIDsgdGhlbgorICAgICAgICAgICAgIyBTdXBwcmVzcyBhbGwgd2FybmluZ3MKKyAgICAgICAgICAgICMgdG8gZ2V0IHJpZCBvZiB0aGUgdW5zaWduZWQvc2lnbmVkIGNoYXIgbWlzbWF0Y2ggd2FybmluZ3MuCisgICAgICAgICAgICBDRkxBR1M9IiRDRkxBR1MgLXciCisgICAgICAgIGZpCisgICAgICAgIDs7CisgICAgbTY4ay1hdGFyaS1taW50KQorICAgICAgICA7OworICAgICopCisgICAgICA7OworZXNhYworCitpZiB0ZXN0ICIkaGF2ZV93MzJfc3lzdGVtIiA9IHllczsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX1czMl9TWVNURU0gMSIgPj5jb25mZGVmcy5oCisKK2ZpCisgaWYgdGVzdCAiJGhhdmVfdzMyX3N5c3RlbSIgPSB5ZXM7IHRoZW4KKyAgSEFWRV9XMzJfU1lTVEVNX1RSVUU9CisgIEhBVkVfVzMyX1NZU1RFTV9GQUxTRT0nIycKK2Vsc2UKKyAgSEFWRV9XMzJfU1lTVEVNX1RSVUU9JyMnCisgIEhBVkVfVzMyX1NZU1RFTV9GQUxTRT0KK2ZpCisKKworCisKKyMgQSBwcmludGFibGUgT1MgTmFtZSBpcyBzb21ldGltZXMgdXNlZnVsLgorY2FzZSAiJHtob3N0fSIgaW4KKyAgICAqLSotbWluZ3czMiopCisgICAgICAgIFBSSU5UQUJMRV9PU19OQU1FPSJNaW5nVzMyIgorICAgICAgICA7OworCisgICAgaT84Ni1lbXgtb3MyIHwgaT84Ni0qLW9zMiplbXggKQorICAgICAgICBQUklOVEFCTEVfT1NfTkFNRT0iT1MvMiIKKyAgICAgICAgOzsKKworICAgIGk/ODYtKi1tc2Rvc2RqZ3BwKikKKyAgICAgICAgUFJJTlRBQkxFX09TX05BTUU9Ik1TRE9TL0RKR1BQIgorICAgICAgICA7OworCisgICAgKi1saW51eCopCisgICAgICAgIFBSSU5UQUJMRV9PU19OQU1FPSJHTlUvTGludXgiCisgICAgICAgIDs7CisKKyAgICAqKQorICAgICAgICBQUklOVEFCTEVfT1NfTkFNRT1gdW5hbWUgLXMgfHwgZWNobyAiVW5rbm93biJgCisgICAgICAgIDs7Citlc2FjCisKKyMKKyMgRmlndXJlIG91dCB0aGUgbmFtZSBvZiB0aGUgcmFuZG9tIGRldmljZQorIworY2FzZSAiJHtob3N0fSIgaW4KKyAgICAqLW9wZW5ic2QqKQorICAgICAgICBOQU1FX09GX0RFVl9SQU5ET009Ii9kZXYvc3JhbmRvbSIKKyAgICAgICAgTkFNRV9PRl9ERVZfVVJBTkRPTT0iL2Rldi91cmFuZG9tIgorICAgICAgICA7OworCisgICAgKikKKyAgICAgICAgTkFNRV9PRl9ERVZfUkFORE9NPSIvZGV2L3JhbmRvbSIKKyAgICAgICAgTkFNRV9PRl9ERVZfVVJBTkRPTT0iL2Rldi91cmFuZG9tIgorICAgICAgICA7OworZXNhYworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1lbmRpYW4tY2hlY2sgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfZW5kaWFuX2NoZWNrK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfZW5kaWFuX2NoZWNrOyBlbmRpYW5jaGVjaz0kZW5hYmxldmFsCitlbHNlCisgIGVuZGlhbmNoZWNrPXllcworZmkKKworaWYgdGVzdCB4IiRlbmRpYW5jaGVjayIgPSB4eWVzIDsgdGhlbgorICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGJ5dGUgb3JkZXJpbmcgaXMgYmlnZW5kaWFuIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgYnl0ZSBvcmRlcmluZyBpcyBiaWdlbmRpYW4uLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfY19iaWdlbmRpYW4rc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jdl9jX2JpZ2VuZGlhbj11bmtub3duCisgICAgIyBTZWUgaWYgd2UncmUgZGVhbGluZyB3aXRoIGEgdW5pdmVyc2FsIGNvbXBpbGVyLgorICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpZm5kZWYgX19BUFBMRV9DQ19fCisJICAgICAgIG5vdCBhIHVuaXZlcnNhbCBjYXBhYmxlIGNvbXBpbGVyCisJICAgICAjZW5kaWYKKwkgICAgIHR5cGVkZWYgaW50IGR1bW15OworCitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKworCSMgQ2hlY2sgZm9yIHBvdGVudGlhbCAtYXJjaCBmbGFncy4gIEl0IGlzIG5vdCB1bml2ZXJzYWwgdW5sZXNzCisJIyB0aGVyZSBhcmUgYXQgbGVhc3QgdHdvIC1hcmNoIGZsYWdzIHdpdGggZGlmZmVyZW50IHZhbHVlcy4KKwlhY19hcmNoPQorCWFjX3ByZXY9CisJZm9yIGFjX3dvcmQgaW4gJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTOyBkbworCSBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKwkgICBjYXNlICRhY193b3JkIGluCisJICAgICBpPzg2IHwgeDg2XzY0IHwgcHBjIHwgcHBjNjQpCisJICAgICAgIGlmIHRlc3QgLXogIiRhY19hcmNoIiB8fCB0ZXN0ICIkYWNfYXJjaCIgPSAiJGFjX3dvcmQiOyB0aGVuCisJCSBhY19hcmNoPSRhY193b3JkCisJICAgICAgIGVsc2UKKwkJIGFjX2N2X2NfYmlnZW5kaWFuPXVuaXZlcnNhbAorCQkgYnJlYWsKKwkgICAgICAgZmkKKwkgICAgICAgOzsKKwkgICBlc2FjCisJICAgYWNfcHJldj0KKwkgZWxpZiB0ZXN0ICJ4JGFjX3dvcmQiID0gIngtYXJjaCI7IHRoZW4KKwkgICBhY19wcmV2PWFyY2gKKwkgZmkKKyAgICAgICBkb25lCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgICAgaWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB1bmtub3duOyB0aGVuCisgICAgICAjIFNlZSBpZiBzeXMvcGFyYW0uaCBkZWZpbmVzIHRoZSBCWVRFX09SREVSIG1hY3JvLgorICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCSAgICAgI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorCitpbnQKK21haW4gKCkKK3sKKyNpZiAhIChkZWZpbmVkIEJZVEVfT1JERVIgJiYgZGVmaW5lZCBCSUdfRU5ESUFOIFwKKwkJICAgICAmJiBkZWZpbmVkIExJVFRMRV9FTkRJQU4gJiYgQllURV9PUkRFUiAmJiBCSUdfRU5ESUFOIFwKKwkJICAgICAmJiBMSVRUTEVfRU5ESUFOKQorCSAgICAgIGJvZ3VzIGVuZGlhbiBtYWNyb3MKKwkgICAgICNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgIyBJdCBkb2VzOyBub3cgc2VlIHdoZXRoZXIgaXQgZGVmaW5lZCB0byBCSUdfRU5ESUFOIG9yIG5vdC4KKwkgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCQkjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisKK2ludAorbWFpbiAoKQoreworI2lmIEJZVEVfT1JERVIgIT0gQklHX0VORElBTgorCQkgbm90IGJpZyBlbmRpYW4KKwkJI2VuZGlmCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9jX2JpZ2VuZGlhbj15ZXMKK2Vsc2UKKyAgYWNfY3ZfY19iaWdlbmRpYW49bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgICBmaQorICAgIGlmIHRlc3QgJGFjX2N2X2NfYmlnZW5kaWFuID0gdW5rbm93bjsgdGhlbgorICAgICAgIyBTZWUgaWYgPGxpbWl0cy5oPiBkZWZpbmVzIF9MSVRUTEVfRU5ESUFOIG9yIF9CSUdfRU5ESUFOIChlLmcuLCBTb2xhcmlzKS4KKyAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworaW50CittYWluICgpCit7CisjaWYgISAoZGVmaW5lZCBfTElUVExFX0VORElBTiB8fCBkZWZpbmVkIF9CSUdfRU5ESUFOKQorCSAgICAgIGJvZ3VzIGVuZGlhbiBtYWNyb3MKKwkgICAgICNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgIyBJdCBkb2VzOyBub3cgc2VlIHdoZXRoZXIgaXQgZGVmaW5lZCB0byBfQklHX0VORElBTiBvciBub3QuCisJIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworaW50CittYWluICgpCit7CisjaWZuZGVmIF9CSUdfRU5ESUFOCisJCSBub3QgYmlnIGVuZGlhbgorCQkjZW5kaWYKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2NfYmlnZW5kaWFuPXllcworZWxzZQorICBhY19jdl9jX2JpZ2VuZGlhbj1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICAgIGZpCisgICAgaWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB1bmtub3duOyB0aGVuCisgICAgICAjIENvbXBpbGUgYSB0ZXN0IHByb2dyYW0uCisgICAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgICMgVHJ5IHRvIGd1ZXNzIGJ5IGdyZXBwaW5nIHZhbHVlcyBmcm9tIGFuIG9iamVjdCBmaWxlLgorCSBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCitzaG9ydCBpbnQgYXNjaWlfbW1bXSA9CisJCSAgeyAweDQyNDksIDB4NDc2NSwgMHg2RTQ0LCAweDY5NjEsIDB4NkU1MywgMHg3OTUzLCAwIH07CisJCXNob3J0IGludCBhc2NpaV9paVtdID0KKwkJICB7IDB4Njk0QywgMHg1NDU0LCAweDY1NkMsIDB4NkU0NSwgMHg2OTQ0LCAweDZFNjEsIDAgfTsKKwkJaW50IHVzZV9hc2NpaSAoaW50IGkpIHsKKwkJICByZXR1cm4gYXNjaWlfbW1baV0gKyBhc2NpaV9paVtpXTsKKwkJfQorCQlzaG9ydCBpbnQgZWJjZGljX2lpW10gPQorCQkgIHsgMHg4OUQzLCAweEUzRTMsIDB4ODU5MywgMHg5NUM1LCAweDg5QzQsIDB4OTU4MSwgMCB9OworCQlzaG9ydCBpbnQgZWJjZGljX21tW10gPQorCQkgIHsgMHhDMkM5LCAweEM3ODUsIDB4OTVDNCwgMHg4OTgxLCAweDk1RTIsIDB4QThFMiwgMCB9OworCQlpbnQgdXNlX2ViY2RpYyAoaW50IGkpIHsKKwkJICByZXR1cm4gZWJjZGljX21tW2ldICsgZWJjZGljX2lpW2ldOworCQl9CisJCWV4dGVybiBpbnQgZm9vOworCitpbnQKK21haW4gKCkKK3sKK3JldHVybiB1c2VfYXNjaWkgKGZvbykgPT0gdXNlX2ViY2RpYyAoZm9vKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBpZiBncmVwIEJJR2VuRGlhblN5UyBjb25mdGVzdC4kYWNfb2JqZXh0ID4vZGV2L251bGw7IHRoZW4KKwkgICAgICBhY19jdl9jX2JpZ2VuZGlhbj15ZXMKKwkgICAgZmkKKwkgICAgaWYgZ3JlcCBMaVRUbGVFbkRpYW4gY29uZnRlc3QuJGFjX29iamV4dCA+L2Rldi9udWxsIDsgdGhlbgorCSAgICAgIGlmIHRlc3QgIiRhY19jdl9jX2JpZ2VuZGlhbiIgPSB1bmtub3duOyB0aGVuCisJCWFjX2N2X2NfYmlnZW5kaWFuPW5vCisJICAgICAgZWxzZQorCQkjIGZpbmRpbmcgYm90aCBzdHJpbmdzIGlzIHVubGlrZWx5IHRvIGhhcHBlbiwgYnV0IHdobyBrbm93cz8KKwkJYWNfY3ZfY19iaWdlbmRpYW49dW5rbm93bgorCSAgICAgIGZpCisJICAgIGZpCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CitpbnQKK21haW4gKCkKK3sKKworCSAgICAgLyogQXJlIHdlIGxpdHRsZSBvciBiaWcgZW5kaWFuPyAgRnJvbSBIYXJiaXNvbiZTdGVlbGUuICAqLworCSAgICAgdW5pb24KKwkgICAgIHsKKwkgICAgICAgbG9uZyBpbnQgbDsKKwkgICAgICAgY2hhciBjW3NpemVvZiAobG9uZyBpbnQpXTsKKwkgICAgIH0gdTsKKwkgICAgIHUubCA9IDE7CisJICAgICByZXR1cm4gdS5jW3NpemVvZiAobG9uZyBpbnQpIC0gMV0gPT0gMTsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfY19iaWdlbmRpYW49bm8KK2Vsc2UKKyAgYWNfY3ZfY19iaWdlbmRpYW49eWVzCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAorICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAorZmkKKworICAgIGZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9jX2JpZ2VuZGlhbiIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2NfYmlnZW5kaWFuIiA+JjY7IH0KKyBjYXNlICRhY19jdl9jX2JpZ2VuZGlhbiBpbiAjKAorICAgeWVzKQorICAgICAkYXNfZWNobyAiI2RlZmluZSBXT1JEU19CSUdFTkRJQU4gMSIgPj5jb25mZGVmcy5oCis7OyAjKAorICAgbm8pCisgICAgICA7OyAjKAorICAgdW5pdmVyc2FsKQorCiskYXNfZWNobyAiI2RlZmluZSBBQ19BUFBMRV9VTklWRVJTQUxfQlVJTEQgMSIgPj5jb25mZGVmcy5oCisKKyAgICAgOzsgIygKKyAgICopCisgICAgIGFzX2ZuX2Vycm9yICJ1bmtub3duIGVuZGlhbm5lc3MKKyBwcmVzZXR0aW5nIGFjX2N2X2NfYmlnZW5kaWFuPW5vIChvciB5ZXMpIHdpbGwgaGVscCIgIiRMSU5FTk8iIDUgOzsKKyBlc2FjCisKK2Vsc2UKKworJGFzX2VjaG8gIiNkZWZpbmUgRElTQUJMRURfRU5ESUFOX0NIRUNLIDEiID4+Y29uZmRlZnMuaAorCitmaQorCisjIFRoZSBjYXN0IHRvIGxvbmcgaW50IHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSFAgQyBDb21waWxlcgorIyB2ZXJzaW9uIEhQOTI0NTMtMDEgQi4xMS4xMS4yMzcwOS5HUCwgd2hpY2ggaW5jb3JyZWN0bHkgcmVqZWN0cworIyBkZWNsYXJhdGlvbnMgbGlrZSBgaW50IGEzW1soc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSkgPj0gMF1dOycuCisjIFRoaXMgYnVnIGlzIEhQIFNSIG51bWJlciA4NjA2MjIzMzY0LgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBzaXplIG9mIHVuc2lnbmVkIHNob3J0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2YgdW5zaWduZWQgc2hvcnQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3Zfc2l6ZW9mX3Vuc2lnbmVkX3Nob3J0K3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgYWNfZm5fY19jb21wdXRlX2ludCAiJExJTkVOTyIgIihsb25nIGludCkgKHNpemVvZiAodW5zaWduZWQgc2hvcnQpKSIgImFjX2N2X3NpemVvZl91bnNpZ25lZF9zaG9ydCIgICAgICAgICIkYWNfaW5jbHVkZXNfZGVmYXVsdCI7IHRoZW4gOgorCitlbHNlCisgIGlmIHRlc3QgIiRhY19jdl90eXBlX3Vuc2lnbmVkX3Nob3J0IiA9IHllczsgdGhlbgorICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK3sgYXNfZm5fc2V0X3N0YXR1cyA3NworYXNfZm5fZXJyb3IgImNhbm5vdCBjb21wdXRlIHNpemVvZiAodW5zaWduZWQgc2hvcnQpCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgIiRMSU5FTk8iIDU7IH07IH0KKyAgIGVsc2UKKyAgICAgYWNfY3Zfc2l6ZW9mX3Vuc2lnbmVkX3Nob3J0PTAKKyAgIGZpCitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zaXplb2ZfdW5zaWduZWRfc2hvcnQiID4mNQorJGFzX2VjaG8gIiRhY19jdl9zaXplb2ZfdW5zaWduZWRfc2hvcnQiID4mNjsgfQorCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBTSVpFT0ZfVU5TSUdORURfU0hPUlQgJGFjX2N2X3NpemVvZl91bnNpZ25lZF9zaG9ydAorX0FDRU9GCisKKworIyBUaGUgY2FzdCB0byBsb25nIGludCB3b3JrcyBhcm91bmQgYSBidWcgaW4gdGhlIEhQIEMgQ29tcGlsZXIKKyMgdmVyc2lvbiBIUDkyNDUzLTAxIEIuMTEuMTEuMjM3MDkuR1AsIHdoaWNoIGluY29ycmVjdGx5IHJlamVjdHMKKyMgZGVjbGFyYXRpb25zIGxpa2UgYGludCBhM1tbKHNpemVvZiAodW5zaWduZWQgY2hhcikpID49IDBdXTsnLgorIyBUaGlzIGJ1ZyBpcyBIUCBTUiBudW1iZXIgODYwNjIyMzM2NC4KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgc2l6ZSBvZiB1bnNpZ25lZCBpbnQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgc2l6ZSBvZiB1bnNpZ25lZCBpbnQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3Zfc2l6ZW9mX3Vuc2lnbmVkX2ludCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIGFjX2ZuX2NfY29tcHV0ZV9pbnQgIiRMSU5FTk8iICIobG9uZyBpbnQpIChzaXplb2YgKHVuc2lnbmVkIGludCkpIiAiYWNfY3Zfc2l6ZW9mX3Vuc2lnbmVkX2ludCIgICAgICAgICIkYWNfaW5jbHVkZXNfZGVmYXVsdCI7IHRoZW4gOgorCitlbHNlCisgIGlmIHRlc3QgIiRhY19jdl90eXBlX3Vuc2lnbmVkX2ludCIgPSB5ZXM7IHRoZW4KKyAgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cit7IGFzX2ZuX3NldF9zdGF0dXMgNzcKK2FzX2ZuX2Vycm9yICJjYW5ub3QgY29tcHV0ZSBzaXplb2YgKHVuc2lnbmVkIGludCkKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiAiJExJTkVOTyIgNTsgfTsgfQorICAgZWxzZQorICAgICBhY19jdl9zaXplb2ZfdW5zaWduZWRfaW50PTAKKyAgIGZpCitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zaXplb2ZfdW5zaWduZWRfaW50IiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfc2l6ZW9mX3Vuc2lnbmVkX2ludCIgPiY2OyB9CisKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFNJWkVPRl9VTlNJR05FRF9JTlQgJGFjX2N2X3NpemVvZl91bnNpZ25lZF9pbnQKK19BQ0VPRgorCisKKyMgVGhlIGNhc3QgdG8gbG9uZyBpbnQgd29ya3MgYXJvdW5kIGEgYnVnIGluIHRoZSBIUCBDIENvbXBpbGVyCisjIHZlcnNpb24gSFA5MjQ1My0wMSBCLjExLjExLjIzNzA5LkdQLCB3aGljaCBpbmNvcnJlY3RseSByZWplY3RzCisjIGRlY2xhcmF0aW9ucyBsaWtlIGBpbnQgYTNbWyhzaXplb2YgKHVuc2lnbmVkIGNoYXIpKSA+PSAwXV07Jy4KKyMgVGhpcyBidWcgaXMgSFAgU1IgbnVtYmVyIDg2MDYyMjMzNjQuCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHNpemUgb2YgdW5zaWduZWQgbG9uZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBzaXplIG9mIHVuc2lnbmVkIGxvbmcuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3Zfc2l6ZW9mX3Vuc2lnbmVkX2xvbmcrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiBhY19mbl9jX2NvbXB1dGVfaW50ICIkTElORU5PIiAiKGxvbmcgaW50KSAoc2l6ZW9mICh1bnNpZ25lZCBsb25nKSkiICJhY19jdl9zaXplb2ZfdW5zaWduZWRfbG9uZyIgICAgICAgICIkYWNfaW5jbHVkZXNfZGVmYXVsdCI7IHRoZW4gOgorCitlbHNlCisgIGlmIHRlc3QgIiRhY19jdl90eXBlX3Vuc2lnbmVkX2xvbmciID0geWVzOyB0aGVuCisgICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQoreyBhc19mbl9zZXRfc3RhdHVzIDc3Cithc19mbl9lcnJvciAiY2Fubm90IGNvbXB1dGUgc2l6ZW9mICh1bnNpZ25lZCBsb25nKQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iICIkTElORU5PIiA1OyB9OyB9CisgICBlbHNlCisgICAgIGFjX2N2X3NpemVvZl91bnNpZ25lZF9sb25nPTAKKyAgIGZpCitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zaXplb2ZfdW5zaWduZWRfbG9uZyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3NpemVvZl91bnNpZ25lZF9sb25nIiA+JjY7IH0KKworCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgU0laRU9GX1VOU0lHTkVEX0xPTkcgJGFjX2N2X3NpemVvZl91bnNpZ25lZF9sb25nCitfQUNFT0YKKworCisjIFRoZSBjYXN0IHRvIGxvbmcgaW50IHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSFAgQyBDb21waWxlcgorIyB2ZXJzaW9uIEhQOTI0NTMtMDEgQi4xMS4xMS4yMzcwOS5HUCwgd2hpY2ggaW5jb3JyZWN0bHkgcmVqZWN0cworIyBkZWNsYXJhdGlvbnMgbGlrZSBgaW50IGEzW1soc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSkgPj0gMF1dOycuCisjIFRoaXMgYnVnIGlzIEhQIFNSIG51bWJlciA4NjA2MjIzMzY0LgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBzaXplIG9mIHVuc2lnbmVkIGxvbmcgbG9uZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBzaXplIG9mIHVuc2lnbmVkIGxvbmcgbG9uZy4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9zaXplb2ZfdW5zaWduZWRfbG9uZ19sb25nK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgYWNfZm5fY19jb21wdXRlX2ludCAiJExJTkVOTyIgIihsb25nIGludCkgKHNpemVvZiAodW5zaWduZWQgbG9uZyBsb25nKSkiICJhY19jdl9zaXplb2ZfdW5zaWduZWRfbG9uZ19sb25nIiAgICAgICAgIiRhY19pbmNsdWRlc19kZWZhdWx0IjsgdGhlbiA6CisKK2Vsc2UKKyAgaWYgdGVzdCAiJGFjX2N2X3R5cGVfdW5zaWduZWRfbG9uZ19sb25nIiA9IHllczsgdGhlbgorICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK3sgYXNfZm5fc2V0X3N0YXR1cyA3NworYXNfZm5fZXJyb3IgImNhbm5vdCBjb21wdXRlIHNpemVvZiAodW5zaWduZWQgbG9uZyBsb25nKQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iICIkTElORU5PIiA1OyB9OyB9CisgICBlbHNlCisgICAgIGFjX2N2X3NpemVvZl91bnNpZ25lZF9sb25nX2xvbmc9MAorICAgZmkKK2ZpCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NpemVvZl91bnNpZ25lZF9sb25nX2xvbmciID4mNQorJGFzX2VjaG8gIiRhY19jdl9zaXplb2ZfdW5zaWduZWRfbG9uZ19sb25nIiA+JjY7IH0KKworCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgU0laRU9GX1VOU0lHTkVEX0xPTkdfTE9ORyAkYWNfY3Zfc2l6ZW9mX3Vuc2lnbmVkX2xvbmdfbG9uZworX0FDRU9GCisKKworCisKKyAgYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAidWludHB0cl90IiAiYWNfY3ZfdHlwZV91aW50cHRyX3QiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfdHlwZV91aW50cHRyX3QiID0geCIieWVzOyB0aGVuIDoKKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9VSU5UUFRSX1QgMSIgPj5jb25mZGVmcy5oCisKK2Vsc2UKKyAgZm9yIGFjX3R5cGUgaW4gJ3Vuc2lnbmVkIGludCcgJ3Vuc2lnbmVkIGxvbmcgaW50JyBcCisJJ3Vuc2lnbmVkIGxvbmcgbG9uZyBpbnQnOyBkbworICAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CitpbnQKK21haW4gKCkKK3sKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKHNpemVvZiAodm9pZCAqKSA8PSBzaXplb2YgKCRhY190eXBlKSldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIHVpbnRwdHJfdCAkYWNfdHlwZQorX0FDRU9GCisKKwkgIGFjX3R5cGU9CitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgICAgICAgdGVzdCAteiAiJGFjX3R5cGUiICYmIGJyZWFrCisgICAgIGRvbmUKK2ZpCisKKworCitpZiB0ZXN0ICIkYWNfY3Zfc2l6ZW9mX3Vuc2lnbmVkX3Nob3J0IiA9ICIwIiBcCisgICB8fCB0ZXN0ICIkYWNfY3Zfc2l6ZW9mX3Vuc2lnbmVkX2ludCIgPSAiMCIgXAorICAgfHwgdGVzdCAiJGFjX2N2X3NpemVvZl91bnNpZ25lZF9sb25nIiA9ICIwIjsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogSG1tbSwgc29tZXRoaW5nIGlzIHdyb25nIHdpdGggdGhlIHNpemVzIC0gdXNpbmcgZGVmYXVsdHMiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogSG1tbSwgc29tZXRoaW5nIGlzIHdyb25nIHdpdGggdGhlIHNpemVzIC0gdXNpbmcgZGVmYXVsdHMiID4mMjt9OworZmkKKworIyBEbyB3ZSBoYXZlIGFueSA2NC1iaXQgZGF0YSB0eXBlcz8KK2lmIHRlc3QgIiRhY19jdl9zaXplb2ZfdW5zaWduZWRfaW50IiAhPSAiOCIgXAorICAgJiYgdGVzdCAiJGFjX2N2X3NpemVvZl91bnNpZ25lZF9sb25nIiAhPSAiOCIgXAorICAgJiYgdGVzdCAiJGFjX2N2X3NpemVvZl91bnNpZ25lZF9sb25nX2xvbmciICE9ICI4IiBcCisgICAmJiB0ZXN0ICIkYWNfY3Zfc2l6ZW9mX3VpbnQ2NF90IiAhPSAiOCI7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IE5vIDY0LWJpdCB0eXBlcy4gIERpc2FibGluZyBUSUdFUi8xOTIsIFNIQS0zODQsIGFuZCBTSEEtNTEyIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IE5vIDY0LWJpdCB0eXBlcy4gIERpc2FibGluZyBUSUdFUi8xOTIsIFNIQS0zODQsIGFuZCBTSEEtNTEyIiA+JjI7fQorZWxzZQorICBhdmFpbGFibGVfZGlnZXN0cz0iJGF2YWlsYWJsZV9kaWdlc3RzICRhdmFpbGFibGVfZGlnZXN0c182NCIKK2ZpCisKKyMgSWYgbm90IHNwZWNpZmllZCBvdGhlcndpc2UsIGFsbCBhdmFpbGFibGUgYWxnb3JpdGhtcyB3aWxsIGJlCisjIGluY2x1ZGVkLgorZGVmYXVsdF9jaXBoZXJzPSIkYXZhaWxhYmxlX2NpcGhlcnMiCitkZWZhdWx0X3B1YmtleV9jaXBoZXJzPSIkYXZhaWxhYmxlX3B1YmtleV9jaXBoZXJzIgorZGVmYXVsdF9kaWdlc3RzPSIkYXZhaWxhYmxlX2RpZ2VzdHMiCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIENvbW1hbmQgbGluZSBzd2l0Y2hlcy4gIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgLS1lbmFibGUtY2lwaGVycyBzd2l0Y2guCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtY2lwaGVycyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9jaXBoZXJzK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfY2lwaGVyczsgZW5hYmxlZF9jaXBoZXJzPWBlY2hvICRlbmFibGV2YWwgfCB0ciAnLDonICcgICcgfCB0ciAnQS1aJyAnYS16J2AKK2Vsc2UKKyAgZW5hYmxlZF9jaXBoZXJzPSIiCitmaQorCitpZiB0ZXN0ICJ4JGVuYWJsZWRfY2lwaGVycyIgPSAieCIgXAorICAgLW8gIiRlbmFibGVkX2NpcGhlcnMiID0gInllcyIgIFwKKyAgIC1vICIkZW5hYmxlZF9jaXBoZXJzIiA9ICJubyI7IHRoZW4KKyAgIGVuYWJsZWRfY2lwaGVycz0kZGVmYXVsdF9jaXBoZXJzCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGljaCBzeW1tZXRyaWMgY2lwaGVycyB0byBpbmNsdWRlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoaWNoIHN5bW1ldHJpYyBjaXBoZXJzIHRvIGluY2x1ZGUuLi4gIiA+JjY7IH0KK2ZvciBjaXBoZXIgaW4gJGVuYWJsZWRfY2lwaGVyczsgZG8KKworbmFtZT0kY2lwaGVyCitsaXN0PSRhdmFpbGFibGVfY2lwaGVycworZm91bmQ9MAorCitmb3IgbiBpbiAkbGlzdDsgZG8KKyAgaWYgdGVzdCAieCRuYW1lIiA9ICJ4JG4iOyB0aGVuCisgICAgZm91bmQ9MQorICBmaQorZG9uZQorCisgICAgaWYgdGVzdCAiJGZvdW5kIiA9ICIwIjsgdGhlbgorICAgICAgIGFzX2ZuX2Vycm9yICJ1bnN1cHBvcnRlZCBjaXBoZXIgXCIkY2lwaGVyXCIgc3BlY2lmaWVkIiAiJExJTkVOTyIgNQorICAgIGZpCitkb25lCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGVuYWJsZWRfY2lwaGVycyIgPiY1CiskYXNfZWNobyAiJGVuYWJsZWRfY2lwaGVycyIgPiY2OyB9CisKKyMgSW1wbGVtZW50YXRpb24gb2YgdGhlIC0tZW5hYmxlLXB1YmtleS1jaXBoZXJzIHN3aXRjaC4KKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1wdWJrZXktY2lwaGVycyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9wdWJrZXlfY2lwaGVycytzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX3B1YmtleV9jaXBoZXJzOyBlbmFibGVkX3B1YmtleV9jaXBoZXJzPWBlY2hvICRlbmFibGV2YWwgfCB0ciAnLDonICcgICcgfCB0ciAnQS1aJyAnYS16J2AKK2Vsc2UKKyAgZW5hYmxlZF9wdWJrZXlfY2lwaGVycz0iIgorZmkKKworaWYgdGVzdCAieCRlbmFibGVkX3B1YmtleV9jaXBoZXJzIiA9ICJ4IiBcCisgICAtbyAiJGVuYWJsZWRfcHVia2V5X2NpcGhlcnMiID0gInllcyIgIFwKKyAgIC1vICIkZW5hYmxlZF9wdWJrZXlfY2lwaGVycyIgPSAibm8iOyB0aGVuCisgICBlbmFibGVkX3B1YmtleV9jaXBoZXJzPSRkZWZhdWx0X3B1YmtleV9jaXBoZXJzCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGljaCBwdWJsaWMta2V5IGNpcGhlcnMgdG8gaW5jbHVkZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGljaCBwdWJsaWMta2V5IGNpcGhlcnMgdG8gaW5jbHVkZS4uLiAiID4mNjsgfQorZm9yIGNpcGhlciBpbiAkZW5hYmxlZF9wdWJrZXlfY2lwaGVyczsgZG8KKworbmFtZT0kY2lwaGVyCitsaXN0PSRhdmFpbGFibGVfcHVia2V5X2NpcGhlcnMKK2ZvdW5kPTAKKworZm9yIG4gaW4gJGxpc3Q7IGRvCisgIGlmIHRlc3QgIngkbmFtZSIgPSAieCRuIjsgdGhlbgorICAgIGZvdW5kPTEKKyAgZmkKK2RvbmUKKworICAgIGlmIHRlc3QgIiRmb3VuZCIgPSAiMCI7IHRoZW4KKyAgICAgICBhc19mbl9lcnJvciAidW5zdXBwb3J0ZWQgcHVibGljLWtleSBjaXBoZXIgc3BlY2lmaWVkIiAiJExJTkVOTyIgNQorICAgIGZpCitkb25lCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGVuYWJsZWRfcHVia2V5X2NpcGhlcnMiID4mNQorJGFzX2VjaG8gIiRlbmFibGVkX3B1YmtleV9jaXBoZXJzIiA+JjY7IH0KKworIyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgLS1lbmFibGUtZGlnZXN0cyBzd2l0Y2guCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZGlnZXN0cyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9kaWdlc3RzK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfZGlnZXN0czsgZW5hYmxlZF9kaWdlc3RzPWBlY2hvICRlbmFibGV2YWwgfCB0ciAnLDonICcgICcgfCB0ciAnQS1aJyAnYS16J2AKK2Vsc2UKKyAgZW5hYmxlZF9kaWdlc3RzPSIiCitmaQorCitpZiB0ZXN0ICJ4JGVuYWJsZWRfZGlnZXN0cyIgPSAieCIgXAorICAgLW8gIiRlbmFibGVkX2RpZ2VzdHMiID0gInllcyIgIFwKKyAgIC1vICIkZW5hYmxlZF9kaWdlc3RzIiA9ICJubyI7IHRoZW4KKyAgIGVuYWJsZWRfZGlnZXN0cz0kZGVmYXVsdF9kaWdlc3RzCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGljaCBtZXNzYWdlIGRpZ2VzdHMgdG8gaW5jbHVkZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGljaCBtZXNzYWdlIGRpZ2VzdHMgdG8gaW5jbHVkZS4uLiAiID4mNjsgfQorZm9yIGRpZ2VzdCBpbiAkZW5hYmxlZF9kaWdlc3RzOyBkbworCituYW1lPSRkaWdlc3QKK2xpc3Q9JGF2YWlsYWJsZV9kaWdlc3RzCitmb3VuZD0wCisKK2ZvciBuIGluICRsaXN0OyBkbworICBpZiB0ZXN0ICJ4JG5hbWUiID0gIngkbiI7IHRoZW4KKyAgICBmb3VuZD0xCisgIGZpCitkb25lCisKKyAgICBpZiB0ZXN0ICIkZm91bmQiID0gIjAiOyB0aGVuCisgICAgICAgYXNfZm5fZXJyb3IgInVuc3VwcG9ydGVkIG1lc3NhZ2UgZGlnZXN0IHNwZWNpZmllZCIgIiRMSU5FTk8iIDUKKyAgICBmaQorZG9uZQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRlbmFibGVkX2RpZ2VzdHMiID4mNQorJGFzX2VjaG8gIiRlbmFibGVkX2RpZ2VzdHMiID4mNjsgfQorCisjIEltcGxlbWVudGF0aW9uIG9mIHRoZSAtLWVuYWJsZS1yYW5kb20gc3dpdGNoLgorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXJhbmRvbSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9yYW5kb20rc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9yYW5kb207IHJhbmRvbT1gZWNobyAkZW5hYmxldmFsIHwgdHIgJ0EtWicgJ2EteidgCitmaQorCitpZiB0ZXN0ICJ4JHJhbmRvbSIgPSAieCIgLW8gIiRyYW5kb20iID0gInllcyIgLW8gIiRyYW5kb20iID0gIm5vIjsgdGhlbgorICAgIHJhbmRvbT1kZWZhdWx0CitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGljaCByYW5kb20gbW9kdWxlIHRvIHVzZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGljaCByYW5kb20gbW9kdWxlIHRvIHVzZS4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHJhbmRvbSIgIT0gImRlZmF1bHQiIC1hICIkcmFuZG9tIiAhPSAiYXV0byI7IHRoZW4KKworbmFtZT0kcmFuZG9tCitsaXN0PSRhdmFpbGFibGVfcmFuZG9tX21vZHVsZXMKK2ZvdW5kPTAKKworZm9yIG4gaW4gJGxpc3Q7IGRvCisgIGlmIHRlc3QgIngkbmFtZSIgPSAieCRuIjsgdGhlbgorICAgIGZvdW5kPTEKKyAgZmkKK2RvbmUKKworICAgIGlmIHRlc3QgIiRmb3VuZCIgPSAiMCI7IHRoZW4KKyAgICAgICBhc19mbl9lcnJvciAidW5zdXBwb3J0ZWQgcmFuZG9tIG1vZHVsZSBzcGVjaWZpZWQiICIkTElORU5PIiA1CisgICAgZmkKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJHJhbmRvbSIgPiY1CiskYXNfZWNobyAiJHJhbmRvbSIgPiY2OyB9CisKKyMgSW1wbGVtZW50YXRpb24gb2YgdGhlIC0tZGlzYWJsZS1kZXYtcmFuZG9tIHN3aXRjaC4KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB1c2Ugb2YgL2Rldi9yYW5kb20gaXMgcmVxdWVzdGVkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdXNlIG9mIC9kZXYvcmFuZG9tIGlzIHJlcXVlc3RlZC4uLiAiID4mNjsgfQorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWRldi1yYW5kb20gd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfZGV2X3JhbmRvbStzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX2Rldl9yYW5kb207IHRyeV9kZXZfcmFuZG9tPSRlbmFibGV2YWwKK2Vsc2UKKyAgdHJ5X2Rldl9yYW5kb209eWVzCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJHRyeV9kZXZfcmFuZG9tIiA+JjUKKyRhc19lY2hvICIkdHJ5X2Rldl9yYW5kb20iID4mNjsgfQorCisjIEltcGxlbWVudGF0aW9uIG9mIHRoZSAtLXdpdGgtZWdkLXNvY2tldCBzd2l0Y2guCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZWdkLXNvY2tldCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfZWdkX3NvY2tldCtzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfZWdkX3NvY2tldDsgZWdkX3NvY2tldF9uYW1lPSIkd2l0aHZhbCIKK2Vsc2UKKyAgZWdkX3NvY2tldF9uYW1lPSIiCitmaQorCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgRUdEX1NPQ0tFVF9OQU1FICIkZWdkX3NvY2tldF9uYW1lIgorX0FDRU9GCisKKworIyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgLS1lbmFibGUtcmFuZG9tLWRhZW1vbgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSBleHBlcmltZW50YWwgcmFuZG9tIGRhZW1vbiBpcyByZXF1ZXN0ZWQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgZXhwZXJpbWVudGFsIHJhbmRvbSBkYWVtb24gaXMgcmVxdWVzdGVkLi4uICIgPiY2OyB9CisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtcmFuZG9tLWRhZW1vbiB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9yYW5kb21fZGFlbW9uK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfcmFuZG9tX2RhZW1vbjsgdXNlX3JhbmRvbV9kYWVtb249JGVuYWJsZXZhbAorZWxzZQorICB1c2VfcmFuZG9tX2RhZW1vbj1ubworZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICR1c2VfcmFuZG9tX2RhZW1vbiIgPiY1CiskYXNfZWNobyAiJHVzZV9yYW5kb21fZGFlbW9uIiA+JjY7IH0KK2lmIHRlc3QgeCR1c2VfcmFuZG9tX2RhZW1vbiA9IHh5ZXMgOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIFVTRV9SQU5ET01fREFFTU9OIDEiID4+Y29uZmRlZnMuaAorCitmaQorIGlmIHRlc3QgeCR1c2VfcmFuZG9tX2RhZW1vbiA9IHh5ZXM7IHRoZW4KKyAgVVNFX1JBTkRPTV9EQUVNT05fVFJVRT0KKyAgVVNFX1JBTkRPTV9EQUVNT05fRkFMU0U9JyMnCitlbHNlCisgIFVTRV9SQU5ET01fREFFTU9OX1RSVUU9JyMnCisgIFVTRV9SQU5ET01fREFFTU9OX0ZBTFNFPQorZmkKKworCisKKyMgSW1wbGVtZW50YXRpb24gb2YgLS1kaXNhYmxlLWFzbS4KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBNUEkgYXNzZW1ibGVyIG1vZHVsZXMgYXJlIHJlcXVlc3RlZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIE1QSSBhc3NlbWJsZXIgbW9kdWxlcyBhcmUgcmVxdWVzdGVkLi4uICIgPiY2OyB9CisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtYXNtIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2FzbStzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX2FzbTsgdHJ5X2FzbV9tb2R1bGVzPSRlbmFibGV2YWwKK2Vsc2UKKyAgdHJ5X2FzbV9tb2R1bGVzPXllcworZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICR0cnlfYXNtX21vZHVsZXMiID4mNQorJGFzX2VjaG8gIiR0cnlfYXNtX21vZHVsZXMiID4mNjsgfQorCisjIEltcGxlbWVudGF0aW9uIG9mIHRoZSAtLWVuYWJsZS1tLWd1YXJkIHN3aXRjaC4KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBtZW1vcnkgZ3VhcmQgaXMgcmVxdWVzdGVkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgbWVtb3J5IGd1YXJkIGlzIHJlcXVlc3RlZC4uLiAiID4mNjsgfQorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW0tZ3VhcmQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbV9ndWFyZCtzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX21fZ3VhcmQ7IHVzZV9tX2d1YXJkPSRlbmFibGV2YWwKK2Vsc2UKKyAgdXNlX21fZ3VhcmQ9bm8KK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkdXNlX21fZ3VhcmQiID4mNQorJGFzX2VjaG8gIiR1c2VfbV9ndWFyZCIgPiY2OyB9CitpZiB0ZXN0ICIkdXNlX21fZ3VhcmQiID0geWVzIDsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBNX0dVQVJEIDEiID4+Y29uZmRlZnMuaAorCitmaQorCisjIEltcGxlbWVudGF0aW9uIG9mIHRoZSAtLXdpdGgtY2FwYWJpbGl0aWVzIHN3aXRjaC4KKyMgQ2hlY2sgd2hldGhlciB3ZSB3YW50IHRvIHVzZSBMaW51eCBjYXBhYmlsaXRpZXMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB1c2Ugb2YgY2FwYWJpbGl0aWVzIGlzIHJlcXVlc3RlZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHVzZSBvZiBjYXBhYmlsaXRpZXMgaXMgcmVxdWVzdGVkLi4uICIgPiY2OyB9CisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtY2FwYWJpbGl0aWVzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9jYXBhYmlsaXRpZXMrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX2NhcGFiaWxpdGllczsgdXNlX2NhcGFiaWxpdGllcz0iJHdpdGh2YWwiCitlbHNlCisgIHVzZV9jYXBhYmlsaXRpZXM9bm8KK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkdXNlX2NhcGFiaWxpdGllcyIgPiY1CiskYXNfZWNobyAiJHVzZV9jYXBhYmlsaXRpZXMiID4mNjsgfQorCisjIEltcGxlbWVudGF0aW9uIG9mIHRoZSAtLWVuYWJsZS1obWFjLWJpbmFyeS1jaGVjay4KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBhIEhNQUMgYmluYXJ5IGNoZWNrIGlzIHJlcXVlc3RlZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIGEgSE1BQyBiaW5hcnkgY2hlY2sgaXMgcmVxdWVzdGVkLi4uICIgPiY2OyB9CisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtaG1hYy1iaW5hcnktY2hlY2sgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfaG1hY19iaW5hcnlfY2hlY2src2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9obWFjX2JpbmFyeV9jaGVjazsgdXNlX2htYWNfYmluYXJ5X2NoZWNrPSRlbmFibGV2YWwKK2Vsc2UKKyAgdXNlX2htYWNfYmluYXJ5X2NoZWNrPW5vCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJHVzZV9obWFjX2JpbmFyeV9jaGVjayIgPiY1CiskYXNfZWNobyAiJHVzZV9obWFjX2JpbmFyeV9jaGVjayIgPiY2OyB9CitpZiB0ZXN0ICIkdXNlX2htYWNfYmluYXJ5X2NoZWNrIiA9IHllcyA7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgRU5BQkxFX0hNQUNfQklOQVJZX0NIRUNLIDEiID4+Y29uZmRlZnMuaAorCitmaQorCisKKyMgSW1wbGVtZW50YXRpb24gb2YgdGhlIC0tZGlzYWJsZS1wYWRsb2NrLXN1cHBvcnQgc3dpdGNoLgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHBhZGxvY2sgc3VwcG9ydCBpcyByZXF1ZXN0ZWQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBwYWRsb2NrIHN1cHBvcnQgaXMgcmVxdWVzdGVkLi4uICIgPiY2OyB9CisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtcGFkbG9jay1zdXBwb3J0IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3BhZGxvY2tfc3VwcG9ydCtzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX3BhZGxvY2tfc3VwcG9ydDsgcGFkbG9ja3N1cHBvcnQ9JGVuYWJsZXZhbAorZWxzZQorICBwYWRsb2Nrc3VwcG9ydD15ZXMKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkcGFkbG9ja3N1cHBvcnQiID4mNQorJGFzX2VjaG8gIiRwYWRsb2Nrc3VwcG9ydCIgPiY2OyB9CitpZiB0ZXN0IHgiJHBhZGxvY2tzdXBwb3J0IiA9IHh5ZXMgOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEVOQUJMRV9QQURMT0NLX1NVUFBPUlQgMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKKyMgSW1wbGVtZW50YXRpb24gb2YgdGhlIC0tZGlzYWJsZS1PLWZsYWctbXVuZ2luZyBzd2l0Y2guCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgYSAtTyBmbGFnIG11bmdpbmcgaXMgcmVxdWVzdGVkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgYSAtTyBmbGFnIG11bmdpbmcgaXMgcmVxdWVzdGVkLi4uICIgPiY2OyB9CisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtTy1mbGFnLW11bmdpbmcgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfT19mbGFnX211bmdpbmcrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9PX2ZsYWdfbXVuZ2luZzsgZW5hYmxlX29fZmxhZ19tdW5naW5nPSRlbmFibGV2YWwKK2Vsc2UKKyAgZW5hYmxlX29fZmxhZ19tdW5naW5nPXllcworZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRlbmFibGVfb19mbGFnX211bmdpbmciID4mNQorJGFzX2VjaG8gIiRlbmFibGVfb19mbGFnX211bmdpbmciID4mNjsgfQorIGlmIHRlc3QgIiRlbmFibGVfb19mbGFnX211bmdpbmciID0gInllcyI7IHRoZW4KKyAgRU5BQkxFX09fRkxBR19NVU5HSU5HX1RSVUU9CisgIEVOQUJMRV9PX0ZMQUdfTVVOR0lOR19GQUxTRT0nIycKK2Vsc2UKKyAgRU5BQkxFX09fRkxBR19NVU5HSU5HX1RSVUU9JyMnCisgIEVOQUJMRV9PX0ZMQUdfTVVOR0lOR19GQUxTRT0KK2ZpCisKKworCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUFJJTlRBQkxFX09TX05BTUUgIiRQUklOVEFCTEVfT1NfTkFNRSIKK19BQ0VPRgorCisKKyMgRm9yIHNvbWUgc3lzdGVtcyB3ZSBrbm93IHRoYXQgd2UgaGF2ZSBsZF92ZXJzaW9uIHNjcmlwdHMuCisjIFVzZSBpdCB0aGVuIGFzIGRlZmF1bHQuCitoYXZlX2xkX3ZlcnNpb25fc2NyaXB0PW5vCitjYXNlICIke2hvc3R9IiBpbgorICAgICotKi1saW51eCopCisJaGF2ZV9sZF92ZXJzaW9uX3NjcmlwdD15ZXMKKyAgICAgICAgOzsKKyAgICAqLSotZ251KikKKwloYXZlX2xkX3ZlcnNpb25fc2NyaXB0PXllcworICAgICAgICA7OworZXNhYworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWxkLXZlcnNpb24tc2NyaXB0IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2xkX3ZlcnNpb25fc2NyaXB0K3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfbGRfdmVyc2lvbl9zY3JpcHQ7IGhhdmVfbGRfdmVyc2lvbl9zY3JpcHQ9JGVuYWJsZXZhbAorZWxzZQorICAgOgorZmkKKworIGlmIHRlc3QgIiRoYXZlX2xkX3ZlcnNpb25fc2NyaXB0IiA9ICJ5ZXMiOyB0aGVuCisgIEhBVkVfTERfVkVSU0lPTl9TQ1JJUFRfVFJVRT0KKyAgSEFWRV9MRF9WRVJTSU9OX1NDUklQVF9GQUxTRT0nIycKK2Vsc2UKKyAgSEFWRV9MRF9WRVJTSU9OX1NDUklQVF9UUlVFPScjJworICBIQVZFX0xEX1ZFUlNJT05fU0NSSVBUX0ZBTFNFPQorZmkKKworCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgTkFNRV9PRl9ERVZfUkFORE9NICIkTkFNRV9PRl9ERVZfUkFORE9NIgorX0FDRU9GCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBOQU1FX09GX0RFVl9VUkFORE9NICIkTkFNRV9PRl9ERVZfVVJBTkRPTSIKK19BQ0VPRgorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMgQ2hlY2tzIGZvciBsaWJyYXJpZXMuICMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIworIyBncGctZXJyb3IgaXMgcmVxdWlyZWQuCisjCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ3BnLWVycm9yLXByZWZpeCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfZ3BnX2Vycm9yX3ByZWZpeCtzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfZ3BnX2Vycm9yX3ByZWZpeDsgZ3BnX2Vycm9yX2NvbmZpZ19wcmVmaXg9IiR3aXRodmFsIgorZWxzZQorICBncGdfZXJyb3JfY29uZmlnX3ByZWZpeD0iIgorZmkKKworICBpZiB0ZXN0IHgkZ3BnX2Vycm9yX2NvbmZpZ19wcmVmaXggIT0geCA7IHRoZW4KKyAgICAgaWYgdGVzdCB4JHtHUEdfRVJST1JfQ09ORklHK3NldH0gIT0geHNldCA7IHRoZW4KKyAgICAgICAgR1BHX0VSUk9SX0NPTkZJRz0kZ3BnX2Vycm9yX2NvbmZpZ19wcmVmaXgvYmluL2dwZy1lcnJvci1jb25maWcKKyAgICAgZmkKKyAgZmkKKworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdwZy1lcnJvci1jb25maWciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdwZy1lcnJvci1jb25maWc7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wYXRoX0dQR19FUlJPUl9DT05GSUcrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRHUEdfRVJST1JfQ09ORklHIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX0dQR19FUlJPUl9DT05GSUc9IiRHUEdfRVJST1JfQ09ORklHIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcGF0aF9HUEdfRVJST1JfQ09ORklHPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX0dQR19FUlJPUl9DT05GSUciICYmIGFjX2N2X3BhdGhfR1BHX0VSUk9SX0NPTkZJRz0ibm8iCisgIDs7Citlc2FjCitmaQorR1BHX0VSUk9SX0NPTkZJRz0kYWNfY3ZfcGF0aF9HUEdfRVJST1JfQ09ORklHCitpZiB0ZXN0IC1uICIkR1BHX0VSUk9SX0NPTkZJRyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRHUEdfRVJST1JfQ09ORklHIiA+JjUKKyRhc19lY2hvICIkR1BHX0VSUk9SX0NPTkZJRyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgIG1pbl9ncGdfZXJyb3JfdmVyc2lvbj0iJE5FRURfR1BHX0VSUk9SX1ZFUlNJT04iCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEdQRyBFcnJvciAtIHZlcnNpb24gPj0gJG1pbl9ncGdfZXJyb3JfdmVyc2lvbiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgR1BHIEVycm9yIC0gdmVyc2lvbiA+PSAkbWluX2dwZ19lcnJvcl92ZXJzaW9uLi4uICIgPiY2OyB9CisgIG9rPW5vCisgIGlmIHRlc3QgIiRHUEdfRVJST1JfQ09ORklHIiAhPSAibm8iIDsgdGhlbgorICAgIHJlcV9tYWpvcj1gZWNobyAkbWluX2dwZ19lcnJvcl92ZXJzaW9uIHwgXAorICAgICAgICAgICAgICAgc2VkICdzL1woWzAtOV0qXClcLlwoWzAtOV0qXCkvXDEvJ2AKKyAgICByZXFfbWlub3I9YGVjaG8gJG1pbl9ncGdfZXJyb3JfdmVyc2lvbiB8IFwKKyAgICAgICAgICAgICAgIHNlZCAncy9cKFswLTldKlwpXC5cKFswLTldKlwpL1wyLydgCisgICAgZ3BnX2Vycm9yX2NvbmZpZ192ZXJzaW9uPWAkR1BHX0VSUk9SX0NPTkZJRyAkZ3BnX2Vycm9yX2NvbmZpZ19hcmdzIC0tdmVyc2lvbmAKKyAgICBpZiB0ZXN0ICIkZ3BnX2Vycm9yX2NvbmZpZ192ZXJzaW9uIjsgdGhlbgorICAgICAgbWFqb3I9YGVjaG8gJGdwZ19lcnJvcl9jb25maWdfdmVyc2lvbiB8IFwKKyAgICAgICAgICAgICAgICAgc2VkICdzL1woWzAtOV0qXClcLlwoWzAtOV0qXCkuKi9cMS8nYAorICAgICAgbWlub3I9YGVjaG8gJGdwZ19lcnJvcl9jb25maWdfdmVyc2lvbiB8IFwKKyAgICAgICAgICAgICAgICAgc2VkICdzL1woWzAtOV0qXClcLlwoWzAtOV0qXCkuKi9cMi8nYAorICAgICAgaWYgdGVzdCAiJG1ham9yIiAtZ3QgIiRyZXFfbWFqb3IiOyB0aGVuCisgICAgICAgICAgb2s9eWVzCisgICAgICBlbHNlCisgICAgICAgICAgaWYgdGVzdCAiJG1ham9yIiAtZXEgIiRyZXFfbWFqb3IiOyB0aGVuCisgICAgICAgICAgICAgIGlmIHRlc3QgIiRtaW5vciIgLWdlICIkcmVxX21pbm9yIjsgdGhlbgorICAgICAgICAgICAgICAgICBvaz15ZXMKKyAgICAgICAgICAgICAgZmkKKyAgICAgICAgICBmaQorICAgICAgZmkKKyAgICBmaQorICBmaQorICBpZiB0ZXN0ICRvayA9IHllczsgdGhlbgorICAgIEdQR19FUlJPUl9DRkxBR1M9YCRHUEdfRVJST1JfQ09ORklHICRncGdfZXJyb3JfY29uZmlnX2FyZ3MgLS1jZmxhZ3NgCisgICAgR1BHX0VSUk9SX0xJQlM9YCRHUEdfRVJST1JfQ09ORklHICRncGdfZXJyb3JfY29uZmlnX2FyZ3MgLS1saWJzYAorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisgICAgOgorICBlbHNlCisgICAgR1BHX0VSUk9SX0NGTEFHUz0iIgorICAgIEdQR19FUlJPUl9MSUJTPSIiCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisgICAgOgorICBmaQorCisKKworaWYgdGVzdCAieCRHUEdfRVJST1JfTElCUyIgPSAieCI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgImxpYmdwZy1lcnJvciBpcyBuZWVkZWQuCisgICAgICAgICAgICAgICAgU2VlIGZ0cDovL2Z0cC5nbnVwZy5vcmcvZ2NyeXB0L2xpYmdwZy1lcnJvci8gLiIgIiRMSU5FTk8iIDUKK2ZpCisKKworJGFzX2VjaG8gIiNkZWZpbmUgR1BHX0VSUl9TT1VSQ0VfREVGQVVMVCBHUEdfRVJSX1NPVVJDRV9HQ1JZUFQiID4+Y29uZmRlZnMuaAorCisKKyMKKyMgQ2hlY2sgd2hldGhlciB0aGUgR05VIFB0aCBsaWJyYXJ5IGlzIGF2YWlsYWJsZS4gIFdlIHJlcXVpcmUgdGhpcworIyB0byBidWlsZCB0aGUgb3B0aW9uYWwgZ2NyeXB0cm5kIHByb2dyYW0uCisjCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtcHRoLXByZWZpeCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfcHRoX3ByZWZpeCtzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfcHRoX3ByZWZpeDsgcHRoX2NvbmZpZ19wcmVmaXg9IiR3aXRodmFsIgorZWxzZQorICBwdGhfY29uZmlnX3ByZWZpeD0iIgorZmkKKworaWYgdGVzdCB4JHB0aF9jb25maWdfcHJlZml4ICE9IHggOyB0aGVuCisgICBQVEhfQ09ORklHPSIkcHRoX2NvbmZpZ19wcmVmaXgvYmluL3B0aC1jb25maWciCitmaQoraWYgdGVzdCAiJHVzZV9yYW5kb21fZGFlbW9uIiA9ICJ5ZXMiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicHRoLWNvbmZpZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgcHRoLWNvbmZpZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3BhdGhfUFRIX0NPTkZJRytzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJFBUSF9DT05GSUcgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfUFRIX0NPTkZJRz0iJFBUSF9DT05GSUciICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wYXRoX1BUSF9DT05GSUc9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfUFRIX0NPTkZJRyIgJiYgYWNfY3ZfcGF0aF9QVEhfQ09ORklHPSJubyIKKyAgOzsKK2VzYWMKK2ZpCitQVEhfQ09ORklHPSRhY19jdl9wYXRoX1BUSF9DT05GSUcKK2lmIHRlc3QgLW4gIiRQVEhfQ09ORklHIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFBUSF9DT05GSUciID4mNQorJGFzX2VjaG8gIiRQVEhfQ09ORklHIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgaWYgdGVzdCAiJFBUSF9DT05GSUciID0gIm5vIjsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzoKKyoqKgorKioqIFRvIGJ1aWxkIHRoZSBMaWJnY3J5cHQncyByYW5kb20gbnVtYmVyIGRhZW1vbgorKioqIHdlIG5lZWQgdGhlIHN1cHBvcnQgb2YgdGhlIEdOVSBQb3J0YWJsZSBUaHJlYWRzIExpYnJhcnkuCisqKiogRG93bmxvYWQgaXQgZnJvbSBmdHA6Ly9mdHAuZ251Lm9yZy9nbnUvcHRoLworKioqIE9uIGEgRGViaWFuIEdOVS9MaW51eCBzeXN0ZW0geW91IG1pZ2h0IHdhbnQgdG8gdHJ5CisqKiogICBhcHQtZ2V0IGluc3RhbGwgbGlicHRoLWRldgorKioqIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6CisqKioKKyoqKiBUbyBidWlsZCB0aGUgTGliZ2NyeXB0J3MgcmFuZG9tIG51bWJlciBkYWVtb24KKyoqKiB3ZSBuZWVkIHRoZSBzdXBwb3J0IG9mIHRoZSBHTlUgUG9ydGFibGUgVGhyZWFkcyBMaWJyYXJ5LgorKioqIERvd25sb2FkIGl0IGZyb20gZnRwOi8vZnRwLmdudS5vcmcvZ251L3B0aC8KKyoqKiBPbiBhIERlYmlhbiBHTlUvTGludXggc3lzdGVtIHlvdSBtaWdodCB3YW50IHRvIHRyeQorKioqICAgYXB0LWdldCBpbnN0YWxsIGxpYnB0aC1kZXYKKyoqKiIgPiYyO30KKyAgZWxzZQorCisgICAgX3B0aF92ZXJzaW9uPWAkUFRIX0NPTkZJRyAtLXZlcnNpb24gfCBhd2sgJ05SPT0xIHtwcmludCAkM30nYAorICAgIF9yZXFfdmVyc2lvbj0iMS4zLjciCisKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBQVEggLSB2ZXJzaW9uID49ICRfcmVxX3ZlcnNpb24iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIFBUSCAtIHZlcnNpb24gPj0gJF9yZXFfdmVyc2lvbi4uLiAiID4mNjsgfQorICAgIGZvciBfdmFyIGluIF9wdGhfdmVyc2lvbiBfcmVxX3ZlcnNpb247IGRvCisgICAgICAgIGV2YWwgIl92YWw9XCJcJCR7X3Zhcn1cIiIKKyAgICAgICAgX21ham9yPWBlY2hvICRfdmFsIHwgc2VkICdzL1woWzAtOV0qXClcLlwoWzAtOV0qXClcKFthYi5dXClcKFswLTldKlwpL1wxLydgCisgICAgICAgIF9taW5vcj1gZWNobyAkX3ZhbCB8IHNlZCAncy9cKFswLTldKlwpXC5cKFswLTldKlwpXChbYWIuXVwpXChbMC05XSpcKS9cMi8nYAorICAgICAgICBfcnR5cGU9YGVjaG8gJF92YWwgfCBzZWQgJ3MvXChbMC05XSpcKVwuXChbMC05XSpcKVwoW2FiLl1cKVwoWzAtOV0qXCkvXDMvJ2AKKyAgICAgICAgX21pY3JvPWBlY2hvICRfdmFsIHwgc2VkICdzL1woWzAtOV0qXClcLlwoWzAtOV0qXClcKFthYi5dXClcKFswLTldKlwpL1w0LydgCisgICAgICAgIGNhc2UgJF9ydHlwZSBpbgorICAgICAgICAgICAgImEiICkgX3J0eXBlPTAgOzsKKyAgICAgICAgICAgICJiIiApIF9ydHlwZT0xIDs7CisgICAgICAgICAgICAiLiIgKSBfcnR5cGU9MiA7OworICAgICAgICBlc2FjCisgICAgICAgIF9oZXg9YGVjaG8gZHVtbXkgfCBhd2sgJ3sgcHJpbnRmKCIlZCUwMmQlMWQlMDJkIiwgbWFqb3IsIG1pbm9yLCBydHlwZSwgbWljcm8pOyB9JyBcCisgICAgICAgICAgICAgICJtYWpvcj0kX21ham9yIiAibWlub3I9JF9taW5vciIgInJ0eXBlPSRfcnR5cGUiICJtaWNybz0kX21pY3JvImAKKyAgICAgICAgZXZhbCAiJHtfdmFyfV9oZXg9XCJcJF9oZXhcIiIKKyAgICBkb25lCisgICAgaGF2ZV9wdGg9bm8KKyAgICBpZiB0ZXN0ICIuJF9wdGhfdmVyc2lvbl9oZXgiICE9IC47IHRoZW4KKyAgICAgICAgaWYgdGVzdCAiLiRfcmVxX3ZlcnNpb25faGV4IiAhPSAuOyB0aGVuCisgICAgICAgICAgICBpZiB0ZXN0ICRfcHRoX3ZlcnNpb25faGV4IC1nZSAkX3JlcV92ZXJzaW9uX2hleDsgdGhlbgorICAgICAgICAgICAgICAgIGhhdmVfcHRoPXllcworICAgICAgICAgICAgZmkKKyAgICAgICAgZmkKKyAgICBmaQorICAgIGlmIHRlc3QgJGhhdmVfcHRoID0geWVzOyB0aGVuCisgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKyAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgUFRIIGluc3RhbGxhdGlvbiBpcyBzYW5lIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgUFRIIGluc3RhbGxhdGlvbiBpcyBzYW5lLi4uICIgPiY2OyB9CisgICAgICAgaWYgdGVzdCAiJHtnbnVwZ19jdl9wdGhfaXNfc2FuZStzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisKKyAgICAgICAgIF9nbnVwZ19wdGhfc2F2ZV9jZmxhZ3M9JENGTEFHUworICAgICAgICAgX2dudXBnX3B0aF9zYXZlX2xkZmxhZ3M9JExERkxBR1MKKyAgICAgICAgIF9nbnVwZ19wdGhfc2F2ZV9saWJzPSRMSUJTCisgICAgICAgICBDRkxBR1M9IiRDRkxBR1MgYCRQVEhfQ09ORklHIC0tY2ZsYWdzYCIKKyAgICAgICAgIExERkxBR1M9IiRMREZMQUdTIGAkUFRIX0NPTkZJRyAtLWxkZmxhZ3NgIgorICAgICAgICAgTElCUz0iJExJQlMgYCRQVEhfQ09ORklHIC0tbGlic2AiCisgICAgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8cHRoLmg+CisKK2ludAorbWFpbiAoKQoreworIHB0aF9pbml0ICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGdudXBnX2N2X3B0aF9pc19zYW5lPXllcworZWxzZQorICBnbnVwZ19jdl9wdGhfaXNfc2FuZT1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisgICAgICAgICBDRkxBR1M9JF9nbnVwZ19wdGhfc2F2ZV9jZmxhZ3MKKyAgICAgICAgIExERkxBR1M9JF9nbnVwZ19wdGhfc2F2ZV9sZGZsYWdzCisgICAgICAgICBMSUJTPSRfZ251cGdfcHRoX3NhdmVfbGlicworCitmaQorCisgICAgICAgaWYgdGVzdCAkZ251cGdfY3ZfcHRoX2lzX3NhbmUgIT0geWVzOyB0aGVuCisgICAgICAgICAgaGF2ZV9wdGg9bm8KKyAgICAgICBmaQorICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkZ251cGdfY3ZfcHRoX2lzX3NhbmUiID4mNQorJGFzX2VjaG8gIiRnbnVwZ19jdl9wdGhfaXNfc2FuZSIgPiY2OyB9CisgICAgZWxzZQorICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorICAgIGZpCisKKyAgICBpZiB0ZXN0ICRoYXZlX3B0aCA9IHllczsgdGhlbgorICAgICAgIFBUSF9DRkxBR1M9YCRQVEhfQ09ORklHIC0tY2ZsYWdzYAorICAgICAgIFBUSF9MSUJTPWAkUFRIX0NPTkZJRyAtLWxkZmxhZ3NgCisgICAgICAgUFRIX0xJQlM9IiRQVEhfTElCUyBgJFBUSF9DT05GSUcgLS1saWJzIC0tYWxsYCIKKworJGFzX2VjaG8gIiNkZWZpbmUgVVNFX0dOVV9QVEggMSIgPj5jb25mZGVmcy5oCisKKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9QVEggMSIgPj5jb25mZGVmcy5oCisKKyAgICBmaQorICBmaQorZmkKKworCisKKworIyBTb2xhcmlzIG5lZWRzIC1sc29ja2V0IGFuZCAtbG5zbC4gVW5pc3lzIHN5c3RlbSBpbmNsdWRlcworIyBnZXRob3N0YnluYW1lIGluIGxpYnNvY2tldCBidXQgbmVlZHMgbGlibnNsIGZvciBzb2NrZXQuCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgc2V0c29ja29wdCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIHNldHNvY2tvcHQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX3NldHNvY2tvcHQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlM9JExJQlMKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBzZXRzb2Nrb3B0ICgpOworaW50CittYWluICgpCit7CityZXR1cm4gc2V0c29ja29wdCAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorZm9yIGFjX2xpYiBpbiAnJyBzb2NrZXQ7IGRvCisgIGlmIHRlc3QgLXogIiRhY19saWIiOyB0aGVuCisgICAgYWNfcmVzPSJub25lIHJlcXVpcmVkIgorICBlbHNlCisgICAgYWNfcmVzPS1sJGFjX2xpYgorICAgIExJQlM9Ii1sJGFjX2xpYiAgJGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUyIKKyAgZmkKKyAgaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9zZWFyY2hfc2V0c29ja29wdD0kYWNfcmVzCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0CisgIGlmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX3NldHNvY2tvcHQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBicmVhaworZmkKK2RvbmUKK2lmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX3NldHNvY2tvcHQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorCitlbHNlCisgIGFjX2N2X3NlYXJjaF9zZXRzb2Nrb3B0PW5vCitmaQorcm0gY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zZWFyY2hfc2V0c29ja29wdCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3NlYXJjaF9zZXRzb2Nrb3B0IiA+JjY7IH0KK2FjX3Jlcz0kYWNfY3Zfc2VhcmNoX3NldHNvY2tvcHQKK2lmIHRlc3QgIiRhY19yZXMiICE9IG5vOyB0aGVuIDoKKyAgdGVzdCAiJGFjX3JlcyIgPSAibm9uZSByZXF1aXJlZCIgfHwgTElCUz0iJGFjX3JlcyAkTElCUyIKKworZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgc2V0c29ja29wdCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIHNldHNvY2tvcHQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX3NldHNvY2tvcHQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlM9JExJQlMKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBzZXRzb2Nrb3B0ICgpOworaW50CittYWluICgpCit7CityZXR1cm4gc2V0c29ja29wdCAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorZm9yIGFjX2xpYiBpbiAnJyBzb2NrZXQ7IGRvCisgIGlmIHRlc3QgLXogIiRhY19saWIiOyB0aGVuCisgICAgYWNfcmVzPSJub25lIHJlcXVpcmVkIgorICBlbHNlCisgICAgYWNfcmVzPS1sJGFjX2xpYgorICAgIExJQlM9Ii1sJGFjX2xpYiAtbG5zbCAkYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTIgorICBmaQorICBpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3NlYXJjaF9zZXRzb2Nrb3B0PSRhY19yZXMKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQKKyAgaWYgdGVzdCAiJHthY19jdl9zZWFyY2hfc2V0c29ja29wdCtzZXR9IiA9IHNldDsgdGhlbiA6CisgIGJyZWFrCitmaQorZG9uZQoraWYgdGVzdCAiJHthY19jdl9zZWFyY2hfc2V0c29ja29wdCtzZXR9IiA9IHNldDsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY3Zfc2VhcmNoX3NldHNvY2tvcHQ9bm8KK2ZpCitybSBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NlYXJjaF9zZXRzb2Nrb3B0IiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfc2VhcmNoX3NldHNvY2tvcHQiID4mNjsgfQorYWNfcmVzPSRhY19jdl9zZWFyY2hfc2V0c29ja29wdAoraWYgdGVzdCAiJGFjX3JlcyIgIT0gbm87IHRoZW4gOgorICB0ZXN0ICIkYWNfcmVzIiA9ICJub25lIHJlcXVpcmVkIiB8fCBMSUJTPSIkYWNfcmVzICRMSUJTIgorCitmaQorCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgc2V0c29ja29wdCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIHNldHNvY2tvcHQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX3NldHNvY2tvcHQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlM9JExJQlMKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBzZXRzb2Nrb3B0ICgpOworaW50CittYWluICgpCit7CityZXR1cm4gc2V0c29ja29wdCAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorZm9yIGFjX2xpYiBpbiAnJyBuc2w7IGRvCisgIGlmIHRlc3QgLXogIiRhY19saWIiOyB0aGVuCisgICAgYWNfcmVzPSJub25lIHJlcXVpcmVkIgorICBlbHNlCisgICAgYWNfcmVzPS1sJGFjX2xpYgorICAgIExJQlM9Ii1sJGFjX2xpYiAgJGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUyIKKyAgZmkKKyAgaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9zZWFyY2hfc2V0c29ja29wdD0kYWNfcmVzCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0CisgIGlmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX3NldHNvY2tvcHQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBicmVhaworZmkKK2RvbmUKK2lmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX3NldHNvY2tvcHQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorCitlbHNlCisgIGFjX2N2X3NlYXJjaF9zZXRzb2Nrb3B0PW5vCitmaQorcm0gY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zZWFyY2hfc2V0c29ja29wdCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3NlYXJjaF9zZXRzb2Nrb3B0IiA+JjY7IH0KK2FjX3Jlcz0kYWNfY3Zfc2VhcmNoX3NldHNvY2tvcHQKK2lmIHRlc3QgIiRhY19yZXMiICE9IG5vOyB0aGVuIDoKKyAgdGVzdCAiJGFjX3JlcyIgPSAibm9uZSByZXF1aXJlZCIgfHwgTElCUz0iJGFjX3JlcyAkTElCUyIKKworZmkKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIENoZWNrcyBmb3IgaGVhZGVyIGZpbGVzLiAjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfaGVhZGVyX3N0ZGMrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZmxvYXQuaD4KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKK2Vsc2UKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK19BQ0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICAkRUdSRVAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKworZWxzZQorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworX0FDRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgICRFR1JFUCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKworZWxzZQorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgOgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpZiAoKCcgJyAmIDB4MEZGKSA9PSAweDAyMCkKKyMgZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKKyMgZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKKyNlbHNlCisjIGRlZmluZSBJU0xPV0VSKGMpIFwKKwkJICAgKCgnYScgPD0gKGMpICYmIChjKSA8PSAnaScpIFwKKwkJICAgICB8fCAoJ2onIDw9IChjKSAmJiAoYykgPD0gJ3InKSBcCisJCSAgICAgfHwgKCdzJyA8PSAoYykgJiYgKGMpIDw9ICd6JykpCisjIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gKChjKSB8IDB4NDApIDogKGMpKQorI2VuZGlmCisKKyNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCitpbnQKK21haW4gKCkKK3sKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICBpZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpCisJfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpCisgICAgICByZXR1cm4gMjsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgorCitlbHNlCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAorICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAorZmkKKworZmkKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9zdGRjIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfaGVhZGVyX3N0ZGMiID4mNjsgfQoraWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgU1REQ19IRUFERVJTIDEiID4+Y29uZmRlZnMuaAorCitmaQorCitmb3IgYWNfaGVhZGVyIGluIHVuaXN0ZC5oIHN5cy9zZWxlY3QuaAorZG8gOgorICBhc19hY19IZWFkZXI9YCRhc19lY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCithY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAiJGFjX2hlYWRlciIgIiRhc19hY19IZWFkZXIiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2V2YWwgYXNfdmFsPVwkJGFzX2FjX0hlYWRlcgorICAgaWYgdGVzdCAieCRhc192YWwiID0geCIieWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyBDaGVja3MgZm9yIHR5cGVkZWZzLCBzdHJ1Y3R1cmVzLCAjIyMjCisjIyMjICBhbmQgY29tcGlsZXIgY2hhcmFjdGVyaXN0aWNzLiAgICMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBhbiBBTlNJIEMtY29uZm9ybWluZyBjb25zdCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgYW4gQU5TSSBDLWNvbmZvcm1pbmcgY29uc3QuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfY19jb25zdCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisvKiBGSVhNRTogSW5jbHVkZSB0aGUgY29tbWVudHMgc3VnZ2VzdGVkIGJ5IFBhdWwuICovCisjaWZuZGVmIF9fY3BsdXNwbHVzCisgIC8qIFVsdHJpeCBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCisgIHR5cGVkZWYgaW50IGNoYXJzZXRbMl07CisgIGNvbnN0IGNoYXJzZXQgY3M7CisgIC8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCisgIGNoYXIgY29uc3QgKmNvbnN0ICpwY3BjYzsKKyAgY2hhciAqKnBwYzsKKyAgLyogTkVDIFNWUjQuMC4yIG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KKyAgc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9OworICBzdGF0aWMgc3RydWN0IHBvaW50IGNvbnN0IHplcm8gPSB7MCwwfTsKKyAgLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzLgorICAgICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbgorICAgICBhbiBhcm0gb2YgYW4gaWYtZXhwcmVzc2lvbiB3aG9zZSBpZi1wYXJ0IGlzIG5vdCBhIGNvbnN0YW50CisgICAgIGV4cHJlc3Npb24gKi8KKyAgY29uc3QgY2hhciAqZyA9ICJzdHJpbmciOworICBwY3BjYyA9ICZnICsgKGcgPyBnLWcgOiAwKTsKKyAgLyogSFBVWCA3LjAgY2MgcmVqZWN0cyB0aGVzZS4gKi8KKyAgKytwY3BjYzsKKyAgcHBjID0gKGNoYXIqKikgcGNwY2M7CisgIHBjcGNjID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHBwYzsKKyAgeyAvKiBTQ08gMy4ydjQgY2MgcmVqZWN0cyB0aGlzLiAgKi8KKyAgICBjaGFyICp0OworICAgIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7CisKKyAgICAqdCsrID0gMDsKKyAgICBpZiAocykgcmV0dXJuIDA7CisgIH0KKyAgeyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KKyAgICBpbnQgeFtdID0gezI1LCAxN307CisgICAgY29uc3QgaW50ICpmb28gPSAmeFswXTsKKyAgICArK2ZvbzsKKyAgfQorICB7IC8qIFN1biBTQzEuMCBBTlNJIGNvbXBpbGVyIHJlamVjdHMgdGhpcyAtLSBidXQgbm90IHRoZSBhYm92ZS4gKi8KKyAgICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKKyAgICBpcHRyIHAgPSAwOworICAgICsrcDsKKyAgfQorICB7IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzYXlpbmcKKyAgICAgICAiay5jIiwgbGluZSAyLjI3OiAxNTA2LTAyNSAoUykgT3BlcmFuZCBtdXN0IGJlIGEgbW9kaWZpYWJsZSBsdmFsdWUuICovCisgICAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfTsKKyAgICBzdHJ1Y3QgcyAqYjsgYi0+aiA9IDU7CisgIH0KKyAgeyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KKyAgICBjb25zdCBpbnQgZm9vID0gMTA7CisgICAgaWYgKCFmb28pIHJldHVybiAwOworICB9CisgIHJldHVybiAhY3NbMF0gJiYgIXplcm8ueDsKKyNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfY19jb25zdD15ZXMKK2Vsc2UKKyAgYWNfY3ZfY19jb25zdD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfY19jb25zdCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2NfY29uc3QiID4mNjsgfQoraWYgdGVzdCAkYWNfY3ZfY19jb25zdCA9IG5vOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIGNvbnN0IC8qKi8iID4+Y29uZmRlZnMuaAorCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGlubGluZS4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9jX2lubGluZStzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2N2X2NfaW5saW5lPW5vCitmb3IgYWNfa3cgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmU7IGRvCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpZm5kZWYgX19jcGx1c3BsdXMKK3R5cGVkZWYgaW50IGZvb190Oworc3RhdGljICRhY19rdyBmb29fdCBzdGF0aWNfZm9vICgpIHtyZXR1cm4gMDsgfQorJGFjX2t3IGZvb190IGZvbyAoKSB7cmV0dXJuIDA7IH0KKyNlbmRpZgorCitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfY19pbmxpbmU9JGFjX2t3CitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgIHRlc3QgIiRhY19jdl9jX2lubGluZSIgIT0gbm8gJiYgYnJlYWsKK2RvbmUKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfY19pbmxpbmUiID4mNQorJGFzX2VjaG8gIiRhY19jdl9jX2lubGluZSIgPiY2OyB9CisKK2Nhc2UgJGFjX2N2X2NfaW5saW5lIGluCisgIGlubGluZSB8IHllcykgOzsKKyAgKikKKyAgICBjYXNlICRhY19jdl9jX2lubGluZSBpbgorICAgICAgbm8pIGFjX3ZhbD07OworICAgICAgKikgYWNfdmFsPSRhY19jdl9jX2lubGluZTs7CisgICAgZXNhYworICAgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNpZm5kZWYgX19jcGx1c3BsdXMKKyNkZWZpbmUgaW5saW5lICRhY192YWwKKyNlbmRpZgorX0FDRU9GCisgICAgOzsKK2VzYWMKKworYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAic2l6ZV90IiAiYWNfY3ZfdHlwZV9zaXplX3QiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfdHlwZV9zaXplX3QiID0geCIieWVzOyB0aGVuIDoKKworZWxzZQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIHNpemVfdCB1bnNpZ25lZCBpbnQKK19BQ0VPRgorCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfdHlwZV9zaWduYWwrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisKK2ludAorbWFpbiAoKQoreworcmV0dXJuICooc2lnbmFsICgwLCAwKSkgKDApID09IDE7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfdHlwZV9zaWduYWw9aW50CitlbHNlCisgIGFjX2N2X3R5cGVfc2lnbmFsPXZvaWQKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3R5cGVfc2lnbmFsIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfdHlwZV9zaWduYWwiID4mNjsgfQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFJFVFNJR1RZUEUgJGFjX2N2X3R5cGVfc2lnbmFsCitfQUNFT0YKKworCithY19mbl9jX2NoZWNrX2RlY2wgIiRMSU5FTk8iICJzeXNfc2lnbGlzdCIgImFjX2N2X2hhdmVfZGVjbF9zeXNfc2lnbGlzdCIgIiNpbmNsdWRlIDxzaWduYWwuaD4KKy8qIE5ldEJTRCBkZWNsYXJlcyBzeXNfc2lnbGlzdCBpbiB1bmlzdGQuaC4gICovCisjaWZkZWYgSEFWRV9VTklTVERfSAorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisiCitpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfZGVjbF9zeXNfc2lnbGlzdCIgPSB4IiJ5ZXM7IHRoZW4gOgorICBhY19oYXZlX2RlY2w9MQorZWxzZQorICBhY19oYXZlX2RlY2w9MAorZmkKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0RFQ0xfU1lTX1NJR0xJU1QgJGFjX2hhdmVfZGVjbAorX0FDRU9GCisKKworCisgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgYnl0ZSB0eXBlZGVmIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBieXRlIHR5cGVkZWYuLi4gIiA+JjY7IH0KKyAgICBpZiB0ZXN0ICIke2dudXBnX2N2X3R5cGVkZWZfYnl0ZStzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNkZWZpbmUgX0dOVV9TT1VSQ0UgMQorICAgICNpbmNsdWRlIDxzdGRsaWIuaD4KKyAgICAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CitpbnQKK21haW4gKCkKK3sKKworICAgICN1bmRlZiBieXRlCisgICAgaW50IGEgPSBzaXplb2YoYnl0ZSk7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBnbnVwZ19jdl90eXBlZGVmX2J5dGU9eWVzCitlbHNlCisgIGdudXBnX2N2X3R5cGVkZWZfYnl0ZT1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKKworICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkZ251cGdfY3ZfdHlwZWRlZl9ieXRlIiA+JjUKKyRhc19lY2hvICIkZ251cGdfY3ZfdHlwZWRlZl9ieXRlIiA+JjY7IH0KKyAgICBpZiB0ZXN0ICIkZ251cGdfY3ZfdHlwZWRlZl9ieXRlIiA9IHllczsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0JZVEVfVFlQRURFRiAxIiA+PmNvbmZkZWZzLmgKKworICAgIGZpCisKKyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB1c2hvcnQgdHlwZWRlZiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgdXNob3J0IHR5cGVkZWYuLi4gIiA+JjY7IH0KKyAgICBpZiB0ZXN0ICIke2dudXBnX2N2X3R5cGVkZWZfdXNob3J0K3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2RlZmluZSBfR05VX1NPVVJDRSAxCisgICAgI2luY2x1ZGUgPHN0ZGxpYi5oPgorICAgICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KK2ludAorbWFpbiAoKQoreworCisgICAgI3VuZGVmIHVzaG9ydAorICAgIGludCBhID0gc2l6ZW9mKHVzaG9ydCk7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBnbnVwZ19jdl90eXBlZGVmX3VzaG9ydD15ZXMKK2Vsc2UKKyAgZ251cGdfY3ZfdHlwZWRlZl91c2hvcnQ9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGdudXBnX2N2X3R5cGVkZWZfdXNob3J0IiA+JjUKKyRhc19lY2hvICIkZ251cGdfY3ZfdHlwZWRlZl91c2hvcnQiID4mNjsgfQorICAgIGlmIHRlc3QgIiRnbnVwZ19jdl90eXBlZGVmX3VzaG9ydCIgPSB5ZXM7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9VU0hPUlRfVFlQRURFRiAxIiA+PmNvbmZkZWZzLmgKKworICAgIGZpCisKKyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB1bG9uZyB0eXBlZGVmIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB1bG9uZyB0eXBlZGVmLi4uICIgPiY2OyB9CisgICAgaWYgdGVzdCAiJHtnbnVwZ19jdl90eXBlZGVmX3Vsb25nK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2RlZmluZSBfR05VX1NPVVJDRSAxCisgICAgI2luY2x1ZGUgPHN0ZGxpYi5oPgorICAgICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KK2ludAorbWFpbiAoKQoreworCisgICAgI3VuZGVmIHVsb25nCisgICAgaW50IGEgPSBzaXplb2YodWxvbmcpOworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZ251cGdfY3ZfdHlwZWRlZl91bG9uZz15ZXMKK2Vsc2UKKyAgZ251cGdfY3ZfdHlwZWRlZl91bG9uZz1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKKworICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkZ251cGdfY3ZfdHlwZWRlZl91bG9uZyIgPiY1CiskYXNfZWNobyAiJGdudXBnX2N2X3R5cGVkZWZfdWxvbmciID4mNjsgfQorICAgIGlmIHRlc3QgIiRnbnVwZ19jdl90eXBlZGVmX3Vsb25nIiA9IHllczsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX1VMT05HX1RZUEVERUYgMSIgPj5jb25mZGVmcy5oCisKKyAgICBmaQorCisgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgdTE2IHR5cGVkZWYiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHUxNiB0eXBlZGVmLi4uICIgPiY2OyB9CisgICAgaWYgdGVzdCAiJHtnbnVwZ19jdl90eXBlZGVmX3UxNitzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNkZWZpbmUgX0dOVV9TT1VSQ0UgMQorICAgICNpbmNsdWRlIDxzdGRsaWIuaD4KKyAgICAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CitpbnQKK21haW4gKCkKK3sKKworICAgICN1bmRlZiB1MTYKKyAgICBpbnQgYSA9IHNpemVvZih1MTYpOworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZ251cGdfY3ZfdHlwZWRlZl91MTY9eWVzCitlbHNlCisgIGdudXBnX2N2X3R5cGVkZWZfdTE2PW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRnbnVwZ19jdl90eXBlZGVmX3UxNiIgPiY1CiskYXNfZWNobyAiJGdudXBnX2N2X3R5cGVkZWZfdTE2IiA+JjY7IH0KKyAgICBpZiB0ZXN0ICIkZ251cGdfY3ZfdHlwZWRlZl91MTYiID0geWVzOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfVTE2X1RZUEVERUYgMSIgPj5jb25mZGVmcy5oCisKKyAgICBmaQorCisgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgdTMyIHR5cGVkZWYiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHUzMiB0eXBlZGVmLi4uICIgPiY2OyB9CisgICAgaWYgdGVzdCAiJHtnbnVwZ19jdl90eXBlZGVmX3UzMitzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNkZWZpbmUgX0dOVV9TT1VSQ0UgMQorICAgICNpbmNsdWRlIDxzdGRsaWIuaD4KKyAgICAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CitpbnQKK21haW4gKCkKK3sKKworICAgICN1bmRlZiB1MzIKKyAgICBpbnQgYSA9IHNpemVvZih1MzIpOworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZ251cGdfY3ZfdHlwZWRlZl91MzI9eWVzCitlbHNlCisgIGdudXBnX2N2X3R5cGVkZWZfdTMyPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRnbnVwZ19jdl90eXBlZGVmX3UzMiIgPiY1CiskYXNfZWNobyAiJGdudXBnX2N2X3R5cGVkZWZfdTMyIiA+JjY7IH0KKyAgICBpZiB0ZXN0ICIkZ251cGdfY3ZfdHlwZWRlZl91MzIiID0geWVzOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfVTMyX1RZUEVERUYgMSIgPj5jb25mZGVmcy5oCisKKyAgICBmaQorCisKKworICAgICAgZm9yIGFjX2hlYWRlciBpbiBzeXMvc29ja2V0LmgKK2RvIDoKKyAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgInN5cy9zb2NrZXQuaCIgImFjX2N2X2hlYWRlcl9zeXNfc29ja2V0X2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3N5c19zb2NrZXRfaCIgPSB4IiJ5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfU1lTX1NPQ0tFVF9IIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKKworCisKKyAgOgorCisKKworCisKKyAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N5c19zb2NrZXRfaCA9IHllczsgdGhlbgorICAgIFNZU19TT0NLRVRfSD0nJworICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGZvciBhY19oZWFkZXIgaW4gd2luc29jazIuaCB3czJ0Y3BpcC5oCitkbyA6CisgIGFzX2FjX0hlYWRlcj1gJGFzX2VjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKK2FjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICIkYWNfaGVhZGVyIiAiJGFzX2FjX0hlYWRlciIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgorZXZhbCBhc192YWw9XCQkYXNfYWNfSGVhZGVyCisgICBpZiB0ZXN0ICJ4JGFzX3ZhbCIgPSB4IiJ5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKKyAgICBTWVNfU09DS0VUX0g9J3N5cy9zb2NrZXQuaCcKKyAgZmkKKworCisgICBhY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJzb2NrbGVuX3QiICJhY19jdl90eXBlX3NvY2tsZW5fdCIgIiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyAgICAgICNpZiBIQVZFX1NZU19TT0NLRVRfSAorICAgICAgIyBpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisgICAgICAjZWxpZiBIQVZFX1dTMlRDUElQX0gKKyAgICAgICMgaW5jbHVkZSA8d3MydGNwaXAuaD4KKyAgICAgICNlbmRpZgorIgoraWYgdGVzdCAieCRhY19jdl90eXBlX3NvY2tsZW5fdCIgPSB4IiJ5ZXM7IHRoZW4gOgorCitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHNvY2tsZW5fdCBlcXVpdmFsZW50IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzb2NrbGVuX3QgZXF1aXZhbGVudC4uLiAiID4mNjsgfQorICAgICAgaWYgdGVzdCAiJHtnbF9jdl9nbF9jdl9zb2NrbGVuX3RfZXF1aXYrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICAjIFN5c3RlbXMgaGF2ZSBlaXRoZXIgInN0cnVjdCBzb2NrYWRkciAqIiBvcgorCSAjICJ2b2lkICoiIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gZ2V0cGVlcm5hbWUKKwkgZ2xfY3Zfc29ja2xlbl90X2VxdWl2PQorCSBmb3IgYXJnMiBpbiAic3RydWN0IHNvY2thZGRyIiB2b2lkOyBkbworCSAgIGZvciB0IGluIGludCBzaXplX3QgInVuc2lnbmVkIGludCIgImxvbmcgaW50IiAidW5zaWduZWQgbG9uZyBpbnQiOyBkbworCSAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCQkjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCisJCWludCBnZXRwZWVybmFtZSAoaW50LCAkYXJnMiAqLCAkdCAqKTsKK2ludAorbWFpbiAoKQoreworJHQgbGVuOworCQlnZXRwZWVybmFtZSAoMCwgMCwgJmxlbik7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZ2xfY3Zfc29ja2xlbl90X2VxdWl2PSIkdCIKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKwkgICAgIHRlc3QgIiRnbF9jdl9zb2NrbGVuX3RfZXF1aXYiICE9ICIiICYmIGJyZWFrCisJICAgZG9uZQorCSAgIHRlc3QgIiRnbF9jdl9zb2NrbGVuX3RfZXF1aXYiICE9ICIiICYmIGJyZWFrCisJIGRvbmUKKworZmkKKworICAgICAgaWYgdGVzdCAiJGdsX2N2X3NvY2tsZW5fdF9lcXVpdiIgPSAiIjsgdGhlbgorCWFzX2ZuX2Vycm9yICJDYW5ub3QgZmluZCBhIHR5cGUgdG8gdXNlIGluIHBsYWNlIG9mIHNvY2tsZW5fdCIgIiRMSU5FTk8iIDUKKyAgICAgIGZpCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGdsX2N2X3NvY2tsZW5fdF9lcXVpdiIgPiY1CiskYXNfZWNobyAiJGdsX2N2X3NvY2tsZW5fdF9lcXVpdiIgPiY2OyB9CisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgc29ja2xlbl90ICRnbF9jdl9zb2NrbGVuX3RfZXF1aXYKK19BQ0VPRgorCitmaQorCitjYXNlICIke2hvc3R9IiBpbgorICAqLSotbWluZ3czMiopCisgICAgIyBzb2NrbGVuX3QgbWF5IG9yIG1heSBub3QgYmUgZGVmaW5lZCBkZXBlbmRpbmcgb24gd2hhdCBoZWFkZXJzCisgICAgIyBhcmUgaW5jbHVkZWQuICBUbyBiZSBzYWZlIHdlIHVzZSBpbnQgYXMgdGhpcyBpcyB0aGUgYWN0dWFsIHR5cGUuCisgICAgRkFMTEJBQ0tfU09DS0xFTl9UPSJ0eXBlZGVmIGludCBnY3J5X3NvY2tsZW5fdDsiCisgICAgOzsKKyAgKikKKyAgICBpZiB0ZXN0ICIuJGdsX2N2X3NvY2tsZW5fdF9lcXVpdiIgPSAiLiI7IHRoZW4KKyAgICAgIEZBTExCQUNLX1NPQ0tMRU5fVD0idHlwZWRlZiBzb2NrbGVuX3QgZ2NyeV9zb2NrbGVuX3Q7IgorICAgIGVsc2UKKyAgICAgIEZBTExCQUNLX1NPQ0tMRU5fVD0idHlwZWRlZiAke2dsX2N2X3NvY2tsZW5fdF9lcXVpdn0gZ2NyeV9zb2NrbGVuX3Q7IgorICAgIGZpCitlc2FjCisKKworIworIyBDaGVjayBmb3IgRUxGIHZpc2liaWxpdHkgc3VwcG9ydC4KKyMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgdmlzaWJpbGl0eSBhdHRyaWJ1dGUgaXMgc3VwcG9ydGVkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIHZpc2liaWxpdHkgYXR0cmlidXRlIGlzIHN1cHBvcnRlZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHtnY3J5X2N2X3Zpc2liaWxpdHlfYXR0cmlidXRlK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgZ2NyeV9jdl92aXNpYmlsaXR5X2F0dHJpYnV0ZT1ubworICAgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCitpbnQgZm9vIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiaGlkZGVuIikpKSA9IDE7CisgICAgICAgICAgICBpbnQgYmFyIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgicHJvdGVjdGVkIikpKSA9IDE7CisKK19BQ0VPRgorCisgICAgICAgIGlmICR7Q0MtY2N9IC1XZXJyb3IgLVMgY29uZnRlc3QuYyAtbyBjb25mdGVzdC5zIFwKKyAgICAgICAgICAgICAgICAgIDE+JjUgMj4mNSA7IHRoZW4KKyAgICAgICAgICAgIGlmIGdyZXAgJ1wuaGlkZGVuLipmb28nIGNvbmZ0ZXN0LnMgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgorICAgICAgICAgICAgICAgIGlmIGdyZXAgJ1wucHJvdGVjdGVkLipiYXInIGNvbmZ0ZXN0LnMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIGdjcnlfY3ZfdmlzaWJpbGl0eV9hdHRyaWJ1dGU9eWVzCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGZpCisgICAgICAgIGZpCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGdjcnlfY3ZfdmlzaWJpbGl0eV9hdHRyaWJ1dGUiID4mNQorJGFzX2VjaG8gIiRnY3J5X2N2X3Zpc2liaWxpdHlfYXR0cmlidXRlIiA+JjY7IH0KK2lmIHRlc3QgIiRnY3J5X2N2X3Zpc2liaWxpdHlfYXR0cmlidXRlIiA9ICJ5ZXMiOyB0aGVuCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgYnJva2VuIHZpc2liaWxpdHkgYXR0cmlidXRlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBicm9rZW4gdmlzaWJpbGl0eSBhdHRyaWJ1dGUuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7Z2NyeV9jdl9icm9rZW5fdmlzaWJpbGl0eV9hdHRyaWJ1dGUrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBnY3J5X2N2X2Jyb2tlbl92aXNpYmlsaXR5X2F0dHJpYnV0ZT15ZXMKKyAgICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworaW50IGZvbyAoaW50IHgpOworICAgICAgICAgICAgaW50IGJhciAoaW50IHgpIF9fYXNtX18gKCJmb28iKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiaGlkZGVuIikpKTsKKyAgICAgICAgICAgIGludCBiYXIgKGludCB4KSB7IHJldHVybiB4OyB9CisKK19BQ0VPRgorCisgICAgICAgIGlmICR7Q0MtY2N9IC1XZXJyb3IgLVMgY29uZnRlc3QuYyAtbyBjb25mdGVzdC5zIFwKKyAgICAgICAgICAgICAgICAgIDE+JjUgMj4mNSA7IHRoZW4KKyAgICAgICAgICAgaWYgZ3JlcCAnXC5oaWRkZW5bIAlfXWZvbycgY29uZnRlc3QucyA+L2Rldi9udWxsIDI+JjE7CisgICAgICAgICAgICB0aGVuCisgICAgICAgICAgICAgICBnY3J5X2N2X2Jyb2tlbl92aXNpYmlsaXR5X2F0dHJpYnV0ZT1ubworICAgICAgICAgICBmaQorICAgICAgICBmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRnY3J5X2N2X2Jyb2tlbl92aXNpYmlsaXR5X2F0dHJpYnV0ZSIgPiY1CiskYXNfZWNobyAiJGdjcnlfY3ZfYnJva2VuX3Zpc2liaWxpdHlfYXR0cmlidXRlIiA+JjY7IH0KK2ZpCitpZiB0ZXN0ICIkZ2NyeV9jdl92aXNpYmlsaXR5X2F0dHJpYnV0ZSIgPSAieWVzIjsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGJyb2tlbiBhbGlhcyBhdHRyaWJ1dGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGJyb2tlbiBhbGlhcyBhdHRyaWJ1dGUuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7Z2NyeV9jdl9icm9rZW5fYWxpYXNfYXR0cmlidXRlK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgZ2NyeV9jdl9icm9rZW5fYWxpYXNfYXR0cmlidXRlPXllcworICAgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCitleHRlcm4gaW50IGZvbyAoaW50IHgpIF9fYXNtICgieHl6enkiKTsKKyAgICAgICAgICAgIGludCBiYXIgKGludCB4KSB7IHJldHVybiB4OyB9CisgICAgICAgICAgICBleHRlcm4gX190eXBlb2YgKGJhcikgZm9vIF9fYXR0cmlidXRlICgod2VhaywgYWxpYXMgKCJiYXIiKSkpOworICAgICAgICAgICAgZXh0ZXJuIGludCBkZm9vOworICAgICAgICAgICAgZXh0ZXJuIF9fdHlwZW9mIChkZm9vKSBkZm9vIF9fYXNtICgiYWJjY2IiKTsKKyAgICAgICAgICAgIGludCBkZm9vID0gMTsKKworX0FDRU9GCisKKyAgICAgICAgaWYgJHtDQy1jY30gLVdlcnJvciAtUyBjb25mdGVzdC5jIC1vIGNvbmZ0ZXN0LnMgXAorICAgICAgICAgICAgICAgICAgMT4mNSAyPiY1IDsgdGhlbgorICAgICAgICAgICBpZiBncmVwICd4eXp6eScgY29uZnRlc3QucyA+L2Rldi9udWxsIDI+JjEgJiYgXAorICAgICAgICAgICAgICBncmVwICdhYmNjYicgY29uZnRlc3QucyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgICAgICAgICAgZ2NyeV9jdl9icm9rZW5fYWxpYXNfYXR0cmlidXRlPW5vCisgICAgICAgICAgIGZpCisgICAgICAgIGZpCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGdjcnlfY3ZfYnJva2VuX2FsaWFzX2F0dHJpYnV0ZSIgPiY1CiskYXNfZWNobyAiJGdjcnlfY3ZfYnJva2VuX2FsaWFzX2F0dHJpYnV0ZSIgPiY2OyB9CitmaQoraWYgdGVzdCAiJGdjcnlfY3ZfdmlzaWJpbGl0eV9hdHRyaWJ1dGUiID0gInllcyI7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIGdjYyBzdXBwb3J0cyAtZnZpc2liaWxpdHk9aGlkZGVuIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmIGdjYyBzdXBwb3J0cyAtZnZpc2liaWxpdHk9aGlkZGVuLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2djcnlfY3ZfZ2NjX2hhc19mX3Zpc2liaWxpdHkrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBnY3J5X2N2X2djY19oYXNfZl92aXNpYmlsaXR5PW5vCisgICAgICAgIF9nY2NfY2ZsYWdzX3NhdmU9JENGTEFHUworICAgICAgICBDRkxBR1M9Ii1mdmlzaWJpbGl0eT1oaWRkZW4iCisgICAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBnY3J5X2N2X2djY19oYXNfZl92aXNpYmlsaXR5PXllcworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICAgICAgICBDRkxBR1M9JF9nY2NfY2ZsYWdzX3NhdmU7CisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGdjcnlfY3ZfZ2NjX2hhc19mX3Zpc2liaWxpdHkiID4mNQorJGFzX2VjaG8gIiRnY3J5X2N2X2djY19oYXNfZl92aXNpYmlsaXR5IiA+JjY7IH0KK2ZpCitpZiB0ZXN0ICIkZ2NyeV9jdl92aXNpYmlsaXR5X2F0dHJpYnV0ZSIgPSAieWVzIiBcCisgICAmJiB0ZXN0ICIkZ2NyeV9jdl9icm9rZW5fdmlzaWJpbGl0eV9hdHRyaWJ1dGUiICE9ICJ5ZXMiIFwKKyAgICYmIHRlc3QgIiRnY3J5X2N2X2Jyb2tlbl9hbGlhc19hdHRyaWJ1dGUiICE9ICJ5ZXMiIFwKKyAgICYmIHRlc3QgIiRnY3J5X2N2X2djY19oYXNfZl92aXNpYmlsaXR5IiA9ICJ5ZXMiCisgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBHQ1JZX1VTRV9WSVNJQklMSVRZIDEiID4+Y29uZmRlZnMuaAorCisgICBDRkxBR1M9IiRDRkxBR1MgLWZ2aXNpYmlsaXR5PWhpZGRlbiIKK2ZpCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIENoZWNrcyBmb3IgbGlicmFyeSBmdW5jdGlvbnMuICMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitmb3IgYWNfZnVuYyBpbiB2cHJpbnRmCitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgInZwcmludGYiICJhY19jdl9mdW5jX3ZwcmludGYiCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfdnByaW50ZiIgPSB4IiJ5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfVlBSSU5URiAxCitfQUNFT0YKKworYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiX2RvcHJudCIgImFjX2N2X2Z1bmNfX2RvcHJudCIKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19fZG9wcm50IiA9IHgiInllczsgdGhlbiA6CisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfRE9QUk5UIDEiID4+Y29uZmRlZnMuaAorCitmaQorCitmaQorZG9uZQorCisKKyMgV2UgaGF2ZSByZXBsYWNlbWVudHMgZm9yIHRoZXNlIGluIHNyYy9taXNzaW5nLXN0cmluZy5jCitmb3IgYWNfZnVuYyBpbiBzdHBjcHkgc3RyY2FzZWNtcAorZG8gOgorICBhc19hY192YXI9YCRhc19lY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKK2FjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgIiRhY19mdW5jIiAiJGFzX2FjX3ZhciIKK2V2YWwgYXNfdmFsPVwkJGFzX2FjX3ZhcgorICAgaWYgdGVzdCAieCRhc192YWwiID0geCIieWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2ZpCitkb25lCisKKyMgV2UgaGF2ZSByZXBsYWNlbWVudHMgZm9yIHRoZXNlIGluIHNyYy9nMTBsaWIuaAorZm9yIGFjX2Z1bmMgaW4gc3RydG91bCBtZW1tb3ZlIHN0cmljbXAgYXRleGl0IHJhaXNlCitkbyA6CisgIGFzX2FjX3Zhcj1gJGFzX2VjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAorYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiJGFjX2Z1bmMiICIkYXNfYWNfdmFyIgorZXZhbCBhc192YWw9XCQkYXNfYWNfdmFyCisgICBpZiB0ZXN0ICJ4JGFzX3ZhbCIgPSB4IiJ5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZmkKK2RvbmUKKworIyBPdGhlciBjaGVja3MKK2ZvciBhY19mdW5jIGluIHN0cmVycm9yIHJhbmQgbW1hcCBnZXRwYWdlc2l6ZSBzeXNjb25mIHdhaXRwaWQgd2FpdDQKK2RvIDoKKyAgYXNfYWNfdmFyPWAkYXNfZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCithY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICIkYWNfZnVuYyIgIiRhc19hY192YXIiCitldmFsIGFzX3ZhbD1cJCRhc19hY192YXIKKyAgIGlmIHRlc3QgIngkYXNfdmFsIiA9IHgiInllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorZG9uZQorCitmb3IgYWNfZnVuYyBpbiBnZXR0aW1lb2ZkYXkgZ2V0cnVzYWdlIGdldGhydGltZSBjbG9ja19nZXR0aW1lIHN5c2xvZworZG8gOgorICBhc19hY192YXI9YCRhc19lY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKK2FjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgIiRhY19mdW5jIiAiJGFzX2FjX3ZhciIKK2V2YWwgYXNfdmFsPVwkJGFzX2FjX3ZhcgorICAgaWYgdGVzdCAieCRhc192YWwiID0geCIieWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2ZpCitkb25lCisKK2ZvciBhY19mdW5jIGluIGZjbnRsIGZ0cnVuY2F0ZQorZG8gOgorICBhc19hY192YXI9YCRhc19lY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKK2FjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgIiRhY19mdW5jIiAiJGFzX2FjX3ZhciIKK2V2YWwgYXNfdmFsPVwkJGFzX2FjX3ZhcgorICAgaWYgdGVzdCAieCRhc192YWwiID0geCIieWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2ZpCitkb25lCisKKworIGZvciBhY19mdW5jIGluIG1sb2NrCitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgIm1sb2NrIiAiYWNfY3ZfZnVuY19tbG9jayIKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19tbG9jayIgPSB4IiJ5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfTUxPQ0sgMQorX0FDRU9GCisKK2ZpCitkb25lCisKKyAgICBpZiB0ZXN0ICIkYWNfY3ZfZnVuY19tbG9jayIgPSAibm8iOyB0aGVuCisgICAgICAgIGZvciBhY19oZWFkZXIgaW4gc3lzL21tYW4uaAorZG8gOgorICBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAic3lzL21tYW4uaCIgImFjX2N2X2hlYWRlcl9zeXNfbW1hbl9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9zeXNfbW1hbl9oIiA9IHgiInllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9TWVNfTU1BTl9IIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKKyAgICAgICAgaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9zeXNfbW1hbl9oIiA9ICJ5ZXMiOyB0aGVuCisgICAgICAgICAgICAjIEFkZCBsaWJydCB0byBMSUJTOgorICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgbWVtbGsgaW4gLWxydCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgbWVtbGsgaW4gLWxydC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9saWJfcnRfbWVtbGsrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbHJ0ICAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBtZW1sayAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIG1lbWxrICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9ydF9tZW1saz15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX3J0X21lbWxrPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9ydF9tZW1sayIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9ydF9tZW1sayIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9ydF9tZW1sayIgPSB4IiJ5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfTElCUlQgMQorX0FDRU9GCisKKyAgTElCUz0iLWxydCAkTElCUyIKKworZmkKKworICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIG1sb2NrIGlzIGluIHN5cy9tbWFuLmgiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBtbG9jayBpcyBpbiBzeXMvbW1hbi5oLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2dudXBnX2N2X21sb2NrX2lzX2luX3N5c19tbWFuK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisgICAgICAgICAgICAgICAgICAgICNpbmNsdWRlIDxhc3NlcnQuaD4KKyAgICAgICAgICAgICAgICAgICAgI2lmZGVmIEhBVkVfU1lTX01NQU5fSAorICAgICAgICAgICAgICAgICAgICAjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyAgICAgICAgICAgICAgICAgICAgI2VuZGlmCisKK2ludAorbWFpbiAoKQoreworCitpbnQgaTsKKworLyogZ2xpYmMgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICogdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkKKyAqIG5hbWVkIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUKKyAqIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfbWxvY2spIHx8IGRlZmluZWQgKF9fc3R1Yl9fX21sb2NrKQorY2hva2UgbWUKKyNlbHNlCittbG9jaygmaSwgNCk7CisjZW5kaWYKKzsgcmV0dXJuIDA7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBnbnVwZ19jdl9tbG9ja19pc19pbl9zeXNfbW1hbj15ZXMKK2Vsc2UKKyAgZ251cGdfY3ZfbWxvY2tfaXNfaW5fc3lzX21tYW49bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkZ251cGdfY3ZfbWxvY2tfaXNfaW5fc3lzX21tYW4iID4mNQorJGFzX2VjaG8gIiRnbnVwZ19jdl9tbG9ja19pc19pbl9zeXNfbW1hbiIgPiY2OyB9CisgICAgICAgICAgICBpZiB0ZXN0ICIkZ251cGdfY3ZfbWxvY2tfaXNfaW5fc3lzX21tYW4iID0gInllcyI7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9NTE9DSyAxIiA+PmNvbmZkZWZzLmgKKworICAgICAgICAgICAgZmkKKyAgICAgICAgZmkKKyAgICBmaQorICAgIGlmIHRlc3QgIiRhY19jdl9mdW5jX21sb2NrIiA9ICJ5ZXMiOyB0aGVuCisgICAgICAgIGZvciBhY19mdW5jIGluIHN5c2NvbmYgZ2V0cGFnZXNpemUKK2RvIDoKKyAgYXNfYWNfdmFyPWAkYXNfZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCithY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICIkYWNfZnVuYyIgIiRhc19hY192YXIiCitldmFsIGFzX3ZhbD1cJCRhc19hY192YXIKKyAgIGlmIHRlc3QgIngkYXNfdmFsIiA9IHgiInllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorZG9uZQorCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBtbG9jayBpcyBicm9rZW4iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBtbG9jayBpcyBicm9rZW4uLi4gIiA+JjY7IH0KKyAgICAgICAgICBpZiB0ZXN0ICIke2dudXBnX2N2X2hhdmVfYnJva2VuX21sb2NrK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgorICBnbnVwZ19jdl9oYXZlX2Jyb2tlbl9tbG9jaz0iYXNzdW1lLW5vIgorCitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCitpbnQgbWFpbigpCit7CisgICAgY2hhciAqcG9vbDsKKyAgICBpbnQgZXJyOworICAgIGxvbmcgaW50IHBnc2l6ZTsKKworI2lmIGRlZmluZWQoSEFWRV9TWVNDT05GKSAmJiBkZWZpbmVkKF9TQ19QQUdFU0laRSkKKyAgICBwZ3NpemUgPSBzeXNjb25mIChfU0NfUEFHRVNJWkUpOworI2VsaWYgZGVmaW5lZCAoSEFWRV9HRVRQQUdFU0laRSkKKyAgICBwZ3NpemUgPSBnZXRwYWdlc2l6ZSgpOworI2Vsc2UKKyAgICBwZ3NpemUgPSAtMTsKKyNlbmRpZgorCisgICAgaWYgKHBnc2l6ZSA9PSAtMSkKKyAgICAgIHBnc2l6ZSA9IDQwOTY7CisKKyAgICBwb29sID0gbWFsbG9jKCA0MDk2ICsgcGdzaXplICk7CisgICAgaWYoICFwb29sICkKKyAgICAgICAgcmV0dXJuIDI7CisgICAgcG9vbCArPSAocGdzaXplIC0gKChsb25nIGludClwb29sICUgcGdzaXplKSk7CisKKyAgICBlcnIgPSBtbG9jayggcG9vbCwgNDA5NiApOworICAgIGlmKCAhZXJyIHx8IGVycm5vID09IEVQRVJNICkKKyAgICAgICAgcmV0dXJuIDA7IC8qIG9rYXkgKi8KKworICAgIHJldHVybiAxOyAgLyogaG1tbSAqLworfQorCisKK19BQ0VPRgoraWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6CisgIGdudXBnX2N2X2hhdmVfYnJva2VuX21sb2NrPSJubyIKK2Vsc2UKKyAgZ251cGdfY3ZfaGF2ZV9icm9rZW5fbWxvY2s9InllcyIKK2ZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCisgIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0CitmaQorCisKK2ZpCisKKyAgICAgICAgIGlmIHRlc3QgIiRnbnVwZ19jdl9oYXZlX2Jyb2tlbl9tbG9jayIgPSAieWVzIjsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0JST0tFTl9NTE9DSyAxIiA+PmNvbmZkZWZzLmgKKworICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisgICAgICAgICBlbHNlCisgICAgICAgICAgICBpZiB0ZXN0ICIkZ251cGdfY3ZfaGF2ZV9icm9rZW5fbWxvY2siID0gIm5vIjsgdGhlbgorICAgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBhc3N1bWluZyBubyIgPiY1CiskYXNfZWNobyAiYXNzdW1pbmcgbm8iID4mNjsgfQorICAgICAgICAgICAgZmkKKyAgICAgICAgIGZpCisgICAgZmkKKworCisKKyMKKyMgQ2hlY2sgd2V0aGVyIGl0IGlzIG5lY2Vzc2FyeSB0byBsaW5rIGFnYWluc3QgbGliZGwuCisjCitETF9MSUJTPSIiCitpZiB0ZXN0ICIkdXNlX2htYWNfYmluYXJ5X2NoZWNrIiA9IHllcyA7IHRoZW4KKyAgX2djcnlfc2F2ZV9saWJzPSIkTElCUyIKKyAgTElCUz0iIgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgZGxvcGVuIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgZGxvcGVuLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3NlYXJjaF9kbG9wZW4rc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlM9JExJQlMKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBkbG9wZW4gKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBkbG9wZW4gKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2ZvciBhY19saWIgaW4gJycgYyBkbDsgZG8KKyAgaWYgdGVzdCAteiAiJGFjX2xpYiI7IHRoZW4KKyAgICBhY19yZXM9Im5vbmUgcmVxdWlyZWQiCisgIGVsc2UKKyAgICBhY19yZXM9LWwkYWNfbGliCisgICAgTElCUz0iLWwkYWNfbGliICAkYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTIgorICBmaQorICBpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3NlYXJjaF9kbG9wZW49JGFjX3JlcworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dAorICBpZiB0ZXN0ICIke2FjX2N2X3NlYXJjaF9kbG9wZW4rc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBicmVhaworZmkKK2RvbmUKK2lmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX2Rsb3BlbitzZXR9IiA9IHNldDsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY3Zfc2VhcmNoX2Rsb3Blbj1ubworZmkKK3JtIGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc2VhcmNoX2Rsb3BlbiIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3NlYXJjaF9kbG9wZW4iID4mNjsgfQorYWNfcmVzPSRhY19jdl9zZWFyY2hfZGxvcGVuCitpZiB0ZXN0ICIkYWNfcmVzIiAhPSBubzsgdGhlbiA6CisgIHRlc3QgIiRhY19yZXMiID0gIm5vbmUgcmVxdWlyZWQiIHx8IExJQlM9IiRhY19yZXMgJExJQlMiCisKK2ZpCisKKyAgRExfTElCUz0kTElCUworICBMSUJTPSIkX2djcnlfc2F2ZV9saWJzIgorICBMSUJHQ1JZUFRfQ09ORklHX0xJQlM9IiR7TElCR0NSWVBUX0NPTkZJR19MSUJTfSAke0RMX0xJQlN9IgorZmkKKworCisKKyMKKyMgQ2hlY2sgd2hldGhlciB3ZSBjYW4gdXNlIExpbnV4IGNhcGFiaWxpdGllcyBhcyByZXF1ZXN0ZWQuCisjCitpZiB0ZXN0ICIkdXNlX2NhcGFiaWxpdGllcyIgPSAieWVzIiA7IHRoZW4KK3VzZV9jYXBhYmlsaXRpZXM9bm8KK2ZvciBhY19oZWFkZXIgaW4gc3lzL2NhcGFiaWxpdHkuaAorZG8gOgorICBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAic3lzL2NhcGFiaWxpdHkuaCIgImFjX2N2X2hlYWRlcl9zeXNfY2FwYWJpbGl0eV9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9zeXNfY2FwYWJpbGl0eV9oIiA9IHgiInllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9TWVNfQ0FQQUJJTElUWV9IIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKK2lmIHRlc3QgIiRhY19jdl9oZWFkZXJfc3lzX2NhcGFiaWxpdHlfaCIgPSAieWVzIiA7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgY2FwX2luaXQgaW4gLWxjYXAiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGNhcF9pbml0IGluIC1sY2FwLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2xpYl9jYXBfY2FwX2luaXQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbGNhcCAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgY2FwX2luaXQgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBjYXBfaW5pdCAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9saWJfY2FwX2NhcF9pbml0PXllcworZWxzZQorICBhY19jdl9saWJfY2FwX2NhcF9pbml0PW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9jYXBfY2FwX2luaXQiID4mNQorJGFzX2VjaG8gIiRhY19jdl9saWJfY2FwX2NhcF9pbml0IiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX2NhcF9jYXBfaW5pdCIgPSB4IiJ5ZXM7IHRoZW4gOgorICBhY19uZWVkX2xpYmNhcD0xCitmaQorCisgIGlmIHRlc3QgIiRhY19jdl9saWJfY2FwX2NhcF9pbml0IiA9ICJ5ZXMiOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIFVTRV9DQVBBQklMSVRJRVMgMSIgPj5jb25mZGVmcy5oCisKKyAgICAgTElCUz0iJExJQlMgLWxjYXAiCisgICAgIHVzZV9jYXBhYmlsaXRpZXM9eWVzCisgIGZpCitmaQoraWYgdGVzdCAiJHVzZV9jYXBhYmlsaXRpZXMiID0gIm5vIiA7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6CisqKioKKyoqKiBUaGUgdXNlIG9mIGNhcGFiaWxpdGllcyBvbiB0aGlzIHN5c3RlbSBpcyBub3QgcG9zc2libGUuCisqKiogWW91IG5lZWQgYSByZWNlbnQgTGludXgga2VybmVsIGFuZCBzb21lIHBhdGNoZXM6CisqKiogICBmY2Fwcy0yLjIuOS05OTA2MTAucGF0Y2ggICAgICAoa2VybmVsIHBhdGNoIGZvciAyLjIuOSkKKyoqKiAgIGZjYXAtbW9kdWxlLTk5MDYxMy50YXIuZ3ogICAgIChrZXJuZWwgbW9kdWxlKQorKioqICAgbGliY2FwLTEuOTIudGFyLmd6ICAgICAgICAgICAgKHVzZXIgbW9kZSBsaWJyYXJ5IGFuZCB1dGlsaXRpZXMpCisqKiogQW5kIHlvdSBoYXZlIHRvIGNvbmZpZ3VyZSB0aGUga2VybmVsIHdpdGggQ09ORklHX1ZGU19DQVBfUExVR0lOCisqKiogc2V0IChmaWxlc3lzdGVtcyBtZW51KS4gQmUgd2FybmVkOiBUaGlzIGNvZGUgaXMgKnJlYWxseSogQUxQSEEuCisqKioiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzoKKyoqKgorKioqIFRoZSB1c2Ugb2YgY2FwYWJpbGl0aWVzIG9uIHRoaXMgc3lzdGVtIGlzIG5vdCBwb3NzaWJsZS4KKyoqKiBZb3UgbmVlZCBhIHJlY2VudCBMaW51eCBrZXJuZWwgYW5kIHNvbWUgcGF0Y2hlczoKKyoqKiAgIGZjYXBzLTIuMi45LTk5MDYxMC5wYXRjaCAgICAgIChrZXJuZWwgcGF0Y2ggZm9yIDIuMi45KQorKioqICAgZmNhcC1tb2R1bGUtOTkwNjEzLnRhci5neiAgICAgKGtlcm5lbCBtb2R1bGUpCisqKiogICBsaWJjYXAtMS45Mi50YXIuZ3ogICAgICAgICAgICAodXNlciBtb2RlIGxpYnJhcnkgYW5kIHV0aWxpdGllcykKKyoqKiBBbmQgeW91IGhhdmUgdG8gY29uZmlndXJlIHRoZSBrZXJuZWwgd2l0aCBDT05GSUdfVkZTX0NBUF9QTFVHSU4KKyoqKiBzZXQgKGZpbGVzeXN0ZW1zIG1lbnUpLiBCZSB3YXJuZWQ6IFRoaXMgY29kZSBpcyAqcmVhbGx5KiBBTFBIQS4KKyoqKiIgPiYyO30KK2ZpCitmaQorCisjIENoZWNrIHdoZXRoZXIgYSByYW5kb20gZGV2aWNlIGlzIGF2YWlsYWJsZS4KK2lmIHRlc3QgIiR0cnlfZGV2X3JhbmRvbSIgPSB5ZXMgOyB0aGVuCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgcmFuZG9tIGRldmljZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgcmFuZG9tIGRldmljZS4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9oYXZlX2Rldl9yYW5kb20rc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1yICIkTkFNRV9PRl9ERVZfUkFORE9NIiAmJiB0ZXN0IC1yICIkTkFNRV9PRl9ERVZfVVJBTkRPTSIgOyB0aGVuCisgICAgICBhY19jdl9oYXZlX2Rldl9yYW5kb209eWVzOyBlbHNlIGFjX2N2X2hhdmVfZGV2X3JhbmRvbT1ubzsgZmkKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hhdmVfZGV2X3JhbmRvbSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2hhdmVfZGV2X3JhbmRvbSIgPiY2OyB9CisgICAgaWYgdGVzdCAiJGFjX2N2X2hhdmVfZGV2X3JhbmRvbSIgPSB5ZXM7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9ERVZfUkFORE9NIDEiID4+Y29uZmRlZnMuaAorCisgICAgZmkKK2Vsc2UKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciByYW5kb20gZGV2aWNlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciByYW5kb20gZGV2aWNlLi4uICIgPiY2OyB9CisgICAgYWNfY3ZfaGF2ZV9kZXZfcmFuZG9tPW5vCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IGhhcyBiZWVuIGRpc2FibGVkIiA+JjUKKyRhc19lY2hvICJoYXMgYmVlbiBkaXNhYmxlZCIgPiY2OyB9CitmaQorCisjIEZpZ3VyZSBvdXQgdGhlIHJhbmRvbSBtb2R1bGVzIGZvciB0aGlzIGNvbmZpZ3VyYXRpb24uCitpZiB0ZXN0ICIkcmFuZG9tIiA9ICJkZWZhdWx0IjsgdGhlbgorCisgICAgIyBTZWxlY3QgZGVmYXVsdCB2YWx1ZS4KKyAgICBpZiB0ZXN0ICIkYWNfY3ZfaGF2ZV9kZXZfcmFuZG9tIiA9IHllczsgdGhlbgorICAgICAgICAjIFRyeSBMaW51eGlzaCByYW5kb20gZGV2aWNlLgorICAgICAgICByYW5kb21fbW9kdWxlcz0ibGludXgiCisgICAgZWxzZQorICAgICAgICBjYXNlICIke2hvc3R9IiBpbgorICAgICAgICAqLSotbWluZ3czMip8Ki0qLWN5Z3dpbiopCisgICAgICAgICAgIyBXaW5kb3dzIHJhbmRvbSBkZXZpY2UuCisgICAgICAgICAgcmFuZG9tX21vZHVsZXM9InczMiIKKyAgICAgICAgICA7OworICAgICAgICAqKQorICAgICAgICAgICMgQnVpbGQgZXZlcnl0aGluZywgYWxsb3cgdG8gc2VsZWN0IGF0IHJ1bnRpbWUuCisgICAgICAgICAgcmFuZG9tX21vZHVsZXM9IiRhdXRvX3JhbmRvbV9tb2R1bGVzIgorICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKyAgICBmaQorZWxzZQorICAgIGlmIHRlc3QgIiRyYW5kb20iID0gImF1dG8iOyB0aGVuCisgICAgICAgICMgQnVpbGQgZXZlcnl0aGluZywgYWxsb3cgdG8gc2VsZWN0IGF0IHJ1bnRpbWUuCisgICAgICAgIHJhbmRvbV9tb2R1bGVzPSIkYXV0b19yYW5kb21fbW9kdWxlcyIKKyAgICBlbHNlCisgICAgICAgIHJhbmRvbV9tb2R1bGVzPSIkcmFuZG9tIgorICAgIGZpCitmaQorCisKKyMKKyMgU2V0dXAgYXNzZW1ibGVyIHN0dWZmLgorIwordG1wX2RvX2NoZWNrPSJubyIKK2Nhc2UgIiR7aG9zdH0iIGluCisgICAgKi1taW5ndzMybXN2YyopCisgICAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKKyAgICAgICAgOzsKKyAgICBpMzg2LWVteC1vczIgfCBpMzQ1Njg2LXBjLW9zMiplbXggfCBpMzg2LXBjLW1zZG9zZGpncHApCisgICAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKKyAgICAgICAgOzsKKyAgICAqKQorICAgICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgICAgICAgaWYgdGVzdCAieCRhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUiID0geCA7IHRoZW4KKyAgICAgICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPXllcworICAgICAgICBmaQorICAgICAgZWxzZQorICAgICAgICAgdG1wX2RvX2NoZWNrPSJ5ZXMiCisgICAgICBmaQorICAgICAgIDs7Citlc2FjCitpZiB0ZXN0ICIkdG1wX2RvX2NoZWNrIiA9ICJ5ZXMiOyB0aGVuCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgXyBwcmVmaXggaW4gY29tcGlsZWQgc3ltYm9scyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgXyBwcmVmaXggaW4gY29tcGlsZWQgc3ltYm9scy4uLiAiID4mNjsgfQorICBpZiB0ZXN0ICIke2FjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZStzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ubworICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorICAgICAgdm9pZCBubV90ZXN0X2Z1bmMoKXt9CisgICAgICBpbnQgbWFpbigpe25tX3Rlc3RfZnVuYztyZXR1cm4gMDt9CitFT0YKKyAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2NvbXBpbGVcIiI7IH0gPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgorICAgICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgorICAgIGFjX25saXN0PWNvbmZ0ZXN0Lm5tCisgICAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXHwgY3V0IC1kIFwnIFwnIC1mIDIgXD4gJGFjX25saXN0XCIiOyB9ID4mNQorICAoZXZhbCAkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcfCBjdXQgLWQgXCcgXCcgLWYgMiBcPiAkYWNfbmxpc3QpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHRlc3QgLXMgIiRhY19ubGlzdCI7IHRoZW4KKyAgICAgICMgU2VlIHdoZXRoZXIgdGhlIHN5bWJvbHMgaGF2ZSBhIGxlYWRpbmcgdW5kZXJzY29yZS4KKyAgICAgIGlmIGVncmVwICdeX25tX3Rlc3RfZnVuYycgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9eWVzCisgICAgICBlbHNlCisgICAgICAgIGlmIGVncmVwICdebm1fdGVzdF9mdW5jICcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICAgIDoKKyAgICAgICAgZWxzZQorICAgICAgICAgIGVjaG8gImNvbmZpZ3VyZTogY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRhY19ubGlzdCIgPiY1CisgICAgICAgIGZpCisgICAgICBmaQorICAgIGVsc2UKKyAgICAgIGVjaG8gImNvbmZpZ3VyZTogY2Fubm90IHJ1biAkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiY1CisgICAgZmkKKyAgZWxzZQorICAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgICAgY2F0IGNvbmZ0ZXN0LmMgPiY1CisgIGZpCisgIHJtIC1yZiBjb25mdGVzdCoKKworZmkKKworICBlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIF8gcHJlZml4IGluIGNvbXBpbGVkIHN5bWJvbHMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIF8gcHJlZml4IGluIGNvbXBpbGVkIHN5bWJvbHMuLi4gIiA+JjY7IH0KKyAgZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlIiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlIiA+JjY7IH0KK2lmIHRlc3QgeCRhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUgPSB4eWVzOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIFdJVEhfU1lNQk9MX1VOREVSU0NPUkUgMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1tcGktcGF0aCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9tcGlfcGF0aCtzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX21waV9wYXRoOyBtcGlfZXh0cmFfcGF0aD0iJGVuYWJsZXZhbCIKK2Vsc2UKKyAgbXBpX2V4dHJhX3BhdGg9IiIKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIG1waSBhc3NlbWJsZXIgZnVuY3Rpb25zIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBtcGkgYXNzZW1ibGVyIGZ1bmN0aW9ucy4uLiAiID4mNjsgfQoraWYgdGVzdCAtZiAkc3JjZGlyL21waS9jb25maWcubGlua3MgOyB0aGVuCisgICAgLiAkc3JjZGlyL21waS9jb25maWcubGlua3MKKyAgICBhY19jb25maWdfbGlua3M9IiRhY19jb25maWdfbGlua3MgIiRtcGlfbG5fbGlzdCIiCisKKyAgICBhY19jdl9tcGlfc2ZsYWdzPSIkbXBpX3NmbGFncyIKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogZG9uZSIgPiY1CiskYXNfZWNobyAiZG9uZSIgPiY2OyB9CitlbHNlCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IGZhaWxlZCIgPiY1CiskYXNfZWNobyAiZmFpbGVkIiA+JjY7IH0KKyAgICBhc19mbl9lcnJvciAibXBpL2NvbmZpZy5saW5rcyBtaXNzaW5nISIgIiRMSU5FTk8iIDUKK2ZpCitNUElfU0ZMQUdTPSIkYWNfY3ZfbXBpX3NmbGFncyIKKworCisgaWYgdGVzdCAiJG1waV9tb2RfYXNtX21waWhfYWRkMSIgPSB5ZXM7IHRoZW4KKyAgTVBJX01PRF9BU01fTVBJSF9BREQxX1RSVUU9CisgIE1QSV9NT0RfQVNNX01QSUhfQUREMV9GQUxTRT0nIycKK2Vsc2UKKyAgTVBJX01PRF9BU01fTVBJSF9BREQxX1RSVUU9JyMnCisgIE1QSV9NT0RfQVNNX01QSUhfQUREMV9GQUxTRT0KK2ZpCisKKyBpZiB0ZXN0ICIkbXBpX21vZF9hc21fbXBpaF9zdWIxIiA9IHllczsgdGhlbgorICBNUElfTU9EX0FTTV9NUElIX1NVQjFfVFJVRT0KKyAgTVBJX01PRF9BU01fTVBJSF9TVUIxX0ZBTFNFPScjJworZWxzZQorICBNUElfTU9EX0FTTV9NUElIX1NVQjFfVFJVRT0nIycKKyAgTVBJX01PRF9BU01fTVBJSF9TVUIxX0ZBTFNFPQorZmkKKworIGlmIHRlc3QgIiRtcGlfbW9kX2FzbV9tcGloX211bDEiID0geWVzOyB0aGVuCisgIE1QSV9NT0RfQVNNX01QSUhfTVVMMV9UUlVFPQorICBNUElfTU9EX0FTTV9NUElIX01VTDFfRkFMU0U9JyMnCitlbHNlCisgIE1QSV9NT0RfQVNNX01QSUhfTVVMMV9UUlVFPScjJworICBNUElfTU9EX0FTTV9NUElIX01VTDFfRkFMU0U9CitmaQorCisgaWYgdGVzdCAiJG1waV9tb2RfYXNtX21waWhfbXVsMiIgPSB5ZXM7IHRoZW4KKyAgTVBJX01PRF9BU01fTVBJSF9NVUwyX1RSVUU9CisgIE1QSV9NT0RfQVNNX01QSUhfTVVMMl9GQUxTRT0nIycKK2Vsc2UKKyAgTVBJX01PRF9BU01fTVBJSF9NVUwyX1RSVUU9JyMnCisgIE1QSV9NT0RfQVNNX01QSUhfTVVMMl9GQUxTRT0KK2ZpCisKKyBpZiB0ZXN0ICIkbXBpX21vZF9hc21fbXBpaF9tdWwzIiA9IHllczsgdGhlbgorICBNUElfTU9EX0FTTV9NUElIX01VTDNfVFJVRT0KKyAgTVBJX01PRF9BU01fTVBJSF9NVUwzX0ZBTFNFPScjJworZWxzZQorICBNUElfTU9EX0FTTV9NUElIX01VTDNfVFJVRT0nIycKKyAgTVBJX01PRF9BU01fTVBJSF9NVUwzX0ZBTFNFPQorZmkKKworIGlmIHRlc3QgIiRtcGlfbW9kX2FzbV9tcGloX2xzaGlmdCIgPSB5ZXM7IHRoZW4KKyAgTVBJX01PRF9BU01fTVBJSF9MU0hJRlRfVFJVRT0KKyAgTVBJX01PRF9BU01fTVBJSF9MU0hJRlRfRkFMU0U9JyMnCitlbHNlCisgIE1QSV9NT0RfQVNNX01QSUhfTFNISUZUX1RSVUU9JyMnCisgIE1QSV9NT0RfQVNNX01QSUhfTFNISUZUX0ZBTFNFPQorZmkKKworIGlmIHRlc3QgIiRtcGlfbW9kX2FzbV9tcGloX3JzaGlmdCIgPSB5ZXM7IHRoZW4KKyAgTVBJX01PRF9BU01fTVBJSF9SU0hJRlRfVFJVRT0KKyAgTVBJX01PRF9BU01fTVBJSF9SU0hJRlRfRkFMU0U9JyMnCitlbHNlCisgIE1QSV9NT0RfQVNNX01QSUhfUlNISUZUX1RSVUU9JyMnCisgIE1QSV9NT0RfQVNNX01QSUhfUlNISUZUX0ZBTFNFPQorZmkKKworIGlmIHRlc3QgIiRtcGlfbW9kX2FzbV91ZGl2IiA9IHllczsgdGhlbgorICBNUElfTU9EX0FTTV9VRElWX1RSVUU9CisgIE1QSV9NT0RfQVNNX1VESVZfRkFMU0U9JyMnCitlbHNlCisgIE1QSV9NT0RfQVNNX1VESVZfVFJVRT0nIycKKyAgTVBJX01PRF9BU01fVURJVl9GQUxTRT0KK2ZpCisKKyBpZiB0ZXN0ICIkbXBpX21vZF9hc21fdWRpdl9xcm5uZCIgPSB5ZXM7IHRoZW4KKyAgTVBJX01PRF9BU01fVURJVl9RUk5ORF9UUlVFPQorICBNUElfTU9EX0FTTV9VRElWX1FSTk5EX0ZBTFNFPScjJworZWxzZQorICBNUElfTU9EX0FTTV9VRElWX1FSTk5EX1RSVUU9JyMnCisgIE1QSV9NT0RfQVNNX1VESVZfUVJOTkRfRkFMU0U9CitmaQorCisgaWYgdGVzdCAiJG1waV9tb2RfY19tcGloX2FkZDEiID0geWVzOyB0aGVuCisgIE1QSV9NT0RfQ19NUElIX0FERDFfVFJVRT0KKyAgTVBJX01PRF9DX01QSUhfQUREMV9GQUxTRT0nIycKK2Vsc2UKKyAgTVBJX01PRF9DX01QSUhfQUREMV9UUlVFPScjJworICBNUElfTU9EX0NfTVBJSF9BREQxX0ZBTFNFPQorZmkKKworIGlmIHRlc3QgIiRtcGlfbW9kX2NfbXBpaF9zdWIxIiA9IHllczsgdGhlbgorICBNUElfTU9EX0NfTVBJSF9TVUIxX1RSVUU9CisgIE1QSV9NT0RfQ19NUElIX1NVQjFfRkFMU0U9JyMnCitlbHNlCisgIE1QSV9NT0RfQ19NUElIX1NVQjFfVFJVRT0nIycKKyAgTVBJX01PRF9DX01QSUhfU1VCMV9GQUxTRT0KK2ZpCisKKyBpZiB0ZXN0ICIkbXBpX21vZF9jX21waWhfbXVsMSIgPSB5ZXM7IHRoZW4KKyAgTVBJX01PRF9DX01QSUhfTVVMMV9UUlVFPQorICBNUElfTU9EX0NfTVBJSF9NVUwxX0ZBTFNFPScjJworZWxzZQorICBNUElfTU9EX0NfTVBJSF9NVUwxX1RSVUU9JyMnCisgIE1QSV9NT0RfQ19NUElIX01VTDFfRkFMU0U9CitmaQorCisgaWYgdGVzdCAiJG1waV9tb2RfY19tcGloX211bDIiID0geWVzOyB0aGVuCisgIE1QSV9NT0RfQ19NUElIX01VTDJfVFJVRT0KKyAgTVBJX01PRF9DX01QSUhfTVVMMl9GQUxTRT0nIycKK2Vsc2UKKyAgTVBJX01PRF9DX01QSUhfTVVMMl9UUlVFPScjJworICBNUElfTU9EX0NfTVBJSF9NVUwyX0ZBTFNFPQorZmkKKworIGlmIHRlc3QgIiRtcGlfbW9kX2NfbXBpaF9tdWwzIiA9IHllczsgdGhlbgorICBNUElfTU9EX0NfTVBJSF9NVUwzX1RSVUU9CisgIE1QSV9NT0RfQ19NUElIX01VTDNfRkFMU0U9JyMnCitlbHNlCisgIE1QSV9NT0RfQ19NUElIX01VTDNfVFJVRT0nIycKKyAgTVBJX01PRF9DX01QSUhfTVVMM19GQUxTRT0KK2ZpCisKKyBpZiB0ZXN0ICIkbXBpX21vZF9jX21waWhfbHNoaWZ0IiA9IHllczsgdGhlbgorICBNUElfTU9EX0NfTVBJSF9MU0hJRlRfVFJVRT0KKyAgTVBJX01PRF9DX01QSUhfTFNISUZUX0ZBTFNFPScjJworZWxzZQorICBNUElfTU9EX0NfTVBJSF9MU0hJRlRfVFJVRT0nIycKKyAgTVBJX01PRF9DX01QSUhfTFNISUZUX0ZBTFNFPQorZmkKKworIGlmIHRlc3QgIiRtcGlfbW9kX2NfbXBpaF9yc2hpZnQiID0geWVzOyB0aGVuCisgIE1QSV9NT0RfQ19NUElIX1JTSElGVF9UUlVFPQorICBNUElfTU9EX0NfTVBJSF9SU0hJRlRfRkFMU0U9JyMnCitlbHNlCisgIE1QSV9NT0RfQ19NUElIX1JTSElGVF9UUlVFPScjJworICBNUElfTU9EX0NfTVBJSF9SU0hJRlRfRkFMU0U9CitmaQorCisgaWYgdGVzdCAiJG1waV9tb2RfY191ZGl2IiA9IHllczsgdGhlbgorICBNUElfTU9EX0NfVURJVl9UUlVFPQorICBNUElfTU9EX0NfVURJVl9GQUxTRT0nIycKK2Vsc2UKKyAgTVBJX01PRF9DX1VESVZfVFJVRT0nIycKKyAgTVBJX01PRF9DX1VESVZfRkFMU0U9CitmaQorCisgaWYgdGVzdCAiJG1waV9tb2RfY191ZGl2X3Fybm5kIiA9IHllczsgdGhlbgorICBNUElfTU9EX0NfVURJVl9RUk5ORF9UUlVFPQorICBNUElfTU9EX0NfVURJVl9RUk5ORF9GQUxTRT0nIycKK2Vsc2UKKyAgTVBJX01PRF9DX1VESVZfUVJOTkRfVFJVRT0nIycKKyAgTVBJX01PRF9DX1VESVZfUVJOTkRfRkFMU0U9CitmaQorCisKK2lmIHRlc3QgIiRpc19kZXZlbG9wbWVudF92ZXJzaW9uIiA9ICJ5ZXMiOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIElTX0RFVkVMT1BNRU5UX1ZFUlNJT04gMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKKworIGlmIHRlc3QgeCRjcm9zc19jb21waWxpbmcgPSB4eWVzOyB0aGVuCisgIENST1NTX0NPTVBJTElOR19UUlVFPQorICBDUk9TU19DT01QSUxJTkdfRkFMU0U9JyMnCitlbHNlCisgIENST1NTX0NPTVBJTElOR19UUlVFPScjJworICBDUk9TU19DT01QSUxJTkdfRkFMU0U9CitmaQorCisKKworIyBUaGlzIGlzIGhhbmR5IGZvciBkZWJ1Z2dpbmcgc28gdGhlIGNvbXBpbGVyIGRvZXNuJ3QgcmVhcnJhbmdlCisjIHRoaW5ncyBhbmQgZWxpbWluYXRlIHZhcmlhYmxlcy4KKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1vcHRpbWl6YXRpb24gd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfb3B0aW1pemF0aW9uK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfb3B0aW1pemF0aW9uOyBpZiB0ZXN0ICRlbmFibGV2YWwgPSBubyA7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICBDRkxBR1M9YGVjaG8gJENGTEFHUyB8IHNlZCAncy8tT1swLTldLy8nYAorICAgICAgICAgICAgICAgICAgICAgICBmaQorZmkKKworCisjIENGTEFHUyBtYW5nbGluZyB3aGVuIHVzaW5nIGdjYy4KK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1XYWxsIgorICAgIGlmIHRlc3QgIiRVU0VfTUFJTlRBSU5FUl9NT0RFIiA9ICJ5ZXMiOyB0aGVuCisgICAgICAgIENGTEFHUz0iJENGTEFHUyAtV2Nhc3QtYWxpZ24gLVdzaGFkb3cgLVdzdHJpY3QtcHJvdG90eXBlcyIKKyAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1XZm9ybWF0IC1Xbm8tZm9ybWF0LXkyayAtV2Zvcm1hdC1zZWN1cml0eSIKKworICAgICAgICAjIElmIC1Xbm8tbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMgaXMgc3VwcG9ydGVkIHdlIGNhbiBlbmFibGUgYQorICAgICAgICAjIGEgYnVuY2ggb2YgcmVhbGx5IHVzZWZ1bCB3YXJuaW5ncy4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiBnY2Mgc3VwcG9ydHMgLVduby1taXNzaW5nLWZpZWxkLWluaXRpYWxpemVycyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiBnY2Mgc3VwcG9ydHMgLVduby1taXNzaW5nLWZpZWxkLWluaXRpYWxpemVycy4uLiAiID4mNjsgfQorICAgICAgICBfZ2NjX2NmbGFnc19zYXZlPSRDRkxBR1MKKyAgICAgICAgQ0ZMQUdTPSItV25vLW1pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzIgorICAgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgX2djY193b3B0PXllcworZWxzZQorICBfZ2NjX3dvcHQ9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRfZ2NjX3dvcHQiID4mNQorJGFzX2VjaG8gIiRfZ2NjX3dvcHQiID4mNjsgfQorICAgICAgICBDRkxBR1M9JF9nY2NfY2ZsYWdzX3NhdmU7CisgICAgICAgIGlmIHRlc3QgeCIkX2djY193b3B0IiA9IHh5ZXMgOyB0aGVuCisgICAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1XIC1XZXh0cmEgLVdiYWQtZnVuY3Rpb24tY2FzdCIKKyAgICAgICAgICBDRkxBR1M9IiRDRkxBR1MgLVd3cml0ZS1zdHJpbmdzIgorICAgICAgICAgIENGTEFHUz0iJENGTEFHUyAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCIKKyAgICAgICAgICBDRkxBR1M9IiRDRkxBR1MgLVduby1taXNzaW5nLWZpZWxkLWluaXRpYWxpemVycyIKKyAgICAgICAgICBDRkxBR1M9IiRDRkxBR1MgLVduby1zaWduLWNvbXBhcmUiCisgICAgICAgIGZpCisKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiBnY2Mgc3VwcG9ydHMgLVdwb2ludGVyLWFyaXRoIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmIGdjYyBzdXBwb3J0cyAtV3BvaW50ZXItYXJpdGguLi4gIiA+JjY7IH0KKyAgICAgICAgX2djY19jZmxhZ3Nfc2F2ZT0kQ0ZMQUdTCisgICAgICAgIENGTEFHUz0iLVdwb2ludGVyLWFyaXRoIgorICAgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgX2djY193b3B0PXllcworZWxzZQorICBfZ2NjX3dvcHQ9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRfZ2NjX3dvcHQiID4mNQorJGFzX2VjaG8gIiRfZ2NjX3dvcHQiID4mNjsgfQorICAgICAgICBDRkxBR1M9JF9nY2NfY2ZsYWdzX3NhdmU7CisgICAgICAgIGlmIHRlc3QgeCIkX2djY193b3B0IiA9IHh5ZXMgOyB0aGVuCisgICAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1XcG9pbnRlci1hcml0aCIKKyAgICAgICAgZmkKKyAgICBmaQorCitmaQorCisjIENoZWNrIHdoZXRoZXIgYXMoMSkgc3VwcG9ydHMgYSBub2VleGVjc3RhY2sgZmVhdHVyZS4gIFRoaXMgdGVzdAorIyBpbmNsdWRlcyBhbiBvdmVycmlkZSBvcHRpb24uCisKKworCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBub24gZXhjdXRhYmxlIHN0YWNrIHN1cHBvcnQgaXMgcmVxdWVzdGVkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgbm9uIGV4Y3V0YWJsZSBzdGFjayBzdXBwb3J0IGlzIHJlcXVlc3RlZC4uLiAiID4mNjsgfQorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5vZXhlY3N0YWNrIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX25vZXhlY3N0YWNrK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfbm9leGVjc3RhY2s7IG5vZXhlY3N0YWNrX3N1cHBvcnQ9JGVuYWJsZXZhbAorZWxzZQorICBub2V4ZWNzdGFja19zdXBwb3J0PXllcworZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRub2V4ZWNzdGFja19zdXBwb3J0IiA+JjUKKyRhc19lY2hvICIkbm9leGVjc3RhY2tfc3VwcG9ydCIgPiY2OyB9CisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBhc3NlbWJsZXIgc3VwcG9ydHMgLS1ub2V4ZWNzdGFjayBvcHRpb24iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBhc3NlbWJsZXIgc3VwcG9ydHMgLS1ub2V4ZWNzdGFjayBvcHRpb24uLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7Y2xfY3ZfYXNfbm9leGVjc3RhY2src2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICAgIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKK3ZvaWQgZm9vKCkge30KK0VPRgorICBpZiB7IGFjX3RyeT0nJHtDQ30gJENGTEFHUyAkQ1BQRkxBR1MKKyAgICAgICAgICAgICAgICAgICAgIC1TIC1vIGNvbmZ0ZXN0LnMgY29uZnRlc3QuYyA+L2Rldi9udWxsJworICB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfdHJ5XCIiOyB9ID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgfSBcCisgICAgICYmIGdyZXAgLm5vdGUuR05VLXN0YWNrIGNvbmZ0ZXN0LnMgPi9kZXYvbnVsbCBcCisgICAgICYmIHsgYWNfdHJ5PScke0NDQVN9ICRDQ0FTRkxBR1MgJENQUEZMQUdTIC1XYSwtLW5vZXhlY3N0YWNrCisgICAgICAgICAgICAgICAgICAgICAgIC1jIC1vIGNvbmZ0ZXN0Lm8gY29uZnRlc3QucyA+L2Rldi9udWxsJworICB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfdHJ5XCIiOyB9ID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgfQorICB0aGVuCisgICAgY2xfY3ZfYXNfbm9leGVjc3RhY2s9eWVzCisgIGVsc2UKKyAgICBjbF9jdl9hc19ub2V4ZWNzdGFjaz1ubworICBmaQorICBybSAtZiBjb25mdGVzdCoKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGNsX2N2X2FzX25vZXhlY3N0YWNrIiA+JjUKKyRhc19lY2hvICIkY2xfY3ZfYXNfbm9leGVjc3RhY2siID4mNjsgfQorICBpZiB0ZXN0ICIkbm9leGVjc3RhY2tfc3VwcG9ydCIgPSB5ZXMgLWEgIiRjbF9jdl9hc19ub2V4ZWNzdGFjayIgPSB5ZXM7IHRoZW4KKwlOT0VYRUNTVEFDS19GTEFHUz0iLVdhLC0tbm9leGVjc3RhY2siCisgIGVsc2UKKyAgICAgICAgTk9FWEVDU1RBQ0tfRkxBR1M9CisgIGZpCisKKworCisKKworCisKKworCithY19jb25maWdfY29tbWFuZHM9IiRhY19jb25maWdfY29tbWFuZHMgZ2NyeXB0LWNvbmYiCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIENvbmNsdXNpb24uICMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIERlZmluZSBjb25kaXRpb25hbCBzb3VyY2VzIGFuZCBjb25maWcuaCBzeW1ib2xzIGRlcGVuZGluZyBvbiB0aGUKKyMgc2VsZWN0ZWQgY2lwaGVycywgcHVia2V5LWNpcGhlcnMsIGRpZ2VzdHMgYW5kIHJhbmRvbSBtb2R1bGVzLgorCisKK25hbWU9YXJjZm91cgorbGlzdD0kZW5hYmxlZF9jaXBoZXJzCitmb3VuZD0wCisKK2ZvciBuIGluICRsaXN0OyBkbworICBpZiB0ZXN0ICJ4JG5hbWUiID0gIngkbiI7IHRoZW4KKyAgICBmb3VuZD0xCisgIGZpCitkb25lCisKK2lmIHRlc3QgIiRmb3VuZCIgPSAiMSI7IHRoZW4KKyAgIEdDUllQVF9DSVBIRVJTPSIkR0NSWVBUX0NJUEhFUlMgYXJjZm91ci5sbyIKKworJGFzX2VjaG8gIiNkZWZpbmUgVVNFX0FSQ0ZPVVIgMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKKworbmFtZT1ibG93ZmlzaAorbGlzdD0kZW5hYmxlZF9jaXBoZXJzCitmb3VuZD0wCisKK2ZvciBuIGluICRsaXN0OyBkbworICBpZiB0ZXN0ICJ4JG5hbWUiID0gIngkbiI7IHRoZW4KKyAgICBmb3VuZD0xCisgIGZpCitkb25lCisKK2lmIHRlc3QgIiRmb3VuZCIgPSAiMSIgOyB0aGVuCisgICBHQ1JZUFRfQ0lQSEVSUz0iJEdDUllQVF9DSVBIRVJTIGJsb3dmaXNoLmxvIgorCiskYXNfZWNobyAiI2RlZmluZSBVU0VfQkxPV0ZJU0ggMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKKworbmFtZT1jYXN0NQorbGlzdD0kZW5hYmxlZF9jaXBoZXJzCitmb3VuZD0wCisKK2ZvciBuIGluICRsaXN0OyBkbworICBpZiB0ZXN0ICJ4JG5hbWUiID0gIngkbiI7IHRoZW4KKyAgICBmb3VuZD0xCisgIGZpCitkb25lCisKK2lmIHRlc3QgIiRmb3VuZCIgPSAiMSIgOyB0aGVuCisgICBHQ1JZUFRfQ0lQSEVSUz0iJEdDUllQVF9DSVBIRVJTIGNhc3Q1LmxvIgorCiskYXNfZWNobyAiI2RlZmluZSBVU0VfQ0FTVDUgMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKKworbmFtZT1kZXMKK2xpc3Q9JGVuYWJsZWRfY2lwaGVycworZm91bmQ9MAorCitmb3IgbiBpbiAkbGlzdDsgZG8KKyAgaWYgdGVzdCAieCRuYW1lIiA9ICJ4JG4iOyB0aGVuCisgICAgZm91bmQ9MQorICBmaQorZG9uZQorCitpZiB0ZXN0ICIkZm91bmQiID0gIjEiIDsgdGhlbgorICAgR0NSWVBUX0NJUEhFUlM9IiRHQ1JZUFRfQ0lQSEVSUyBkZXMubG8iCisKKyRhc19lY2hvICIjZGVmaW5lIFVTRV9ERVMgMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKKworbmFtZT1hZXMKK2xpc3Q9JGVuYWJsZWRfY2lwaGVycworZm91bmQ9MAorCitmb3IgbiBpbiAkbGlzdDsgZG8KKyAgaWYgdGVzdCAieCRuYW1lIiA9ICJ4JG4iOyB0aGVuCisgICAgZm91bmQ9MQorICBmaQorZG9uZQorCitpZiB0ZXN0ICIkZm91bmQiID0gIjEiIDsgdGhlbgorICAgR0NSWVBUX0NJUEhFUlM9IiRHQ1JZUFRfQ0lQSEVSUyByaWpuZGFlbC5sbyIKKworJGFzX2VjaG8gIiNkZWZpbmUgVVNFX0FFUyAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworCituYW1lPXR3b2Zpc2gKK2xpc3Q9JGVuYWJsZWRfY2lwaGVycworZm91bmQ9MAorCitmb3IgbiBpbiAkbGlzdDsgZG8KKyAgaWYgdGVzdCAieCRuYW1lIiA9ICJ4JG4iOyB0aGVuCisgICAgZm91bmQ9MQorICBmaQorZG9uZQorCitpZiB0ZXN0ICIkZm91bmQiID0gIjEiIDsgdGhlbgorICAgR0NSWVBUX0NJUEhFUlM9IiRHQ1JZUFRfQ0lQSEVSUyB0d29maXNoLmxvIgorCiskYXNfZWNobyAiI2RlZmluZSBVU0VfVFdPRklTSCAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworCituYW1lPXNlcnBlbnQKK2xpc3Q9JGVuYWJsZWRfY2lwaGVycworZm91bmQ9MAorCitmb3IgbiBpbiAkbGlzdDsgZG8KKyAgaWYgdGVzdCAieCRuYW1lIiA9ICJ4JG4iOyB0aGVuCisgICAgZm91bmQ9MQorICBmaQorZG9uZQorCitpZiB0ZXN0ICIkZm91bmQiID0gIjEiIDsgdGhlbgorICAgR0NSWVBUX0NJUEhFUlM9IiRHQ1JZUFRfQ0lQSEVSUyBzZXJwZW50LmxvIgorCiskYXNfZWNobyAiI2RlZmluZSBVU0VfU0VSUEVOVCAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworCituYW1lPXJmYzIyNjgKK2xpc3Q9JGVuYWJsZWRfY2lwaGVycworZm91bmQ9MAorCitmb3IgbiBpbiAkbGlzdDsgZG8KKyAgaWYgdGVzdCAieCRuYW1lIiA9ICJ4JG4iOyB0aGVuCisgICAgZm91bmQ9MQorICBmaQorZG9uZQorCitpZiB0ZXN0ICIkZm91bmQiID0gIjEiIDsgdGhlbgorICAgR0NSWVBUX0NJUEhFUlM9IiRHQ1JZUFRfQ0lQSEVSUyByZmMyMjY4LmxvIgorCiskYXNfZWNobyAiI2RlZmluZSBVU0VfUkZDMjI2OCAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworCituYW1lPXNlZWQKK2xpc3Q9JGVuYWJsZWRfY2lwaGVycworZm91bmQ9MAorCitmb3IgbiBpbiAkbGlzdDsgZG8KKyAgaWYgdGVzdCAieCRuYW1lIiA9ICJ4JG4iOyB0aGVuCisgICAgZm91bmQ9MQorICBmaQorZG9uZQorCitpZiB0ZXN0ICIkZm91bmQiID0gIjEiIDsgdGhlbgorICAgR0NSWVBUX0NJUEhFUlM9IiRHQ1JZUFRfQ0lQSEVSUyBzZWVkLmxvIgorCiskYXNfZWNobyAiI2RlZmluZSBVU0VfU0VFRCAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworCituYW1lPWNhbWVsbGlhCitsaXN0PSRlbmFibGVkX2NpcGhlcnMKK2ZvdW5kPTAKKworZm9yIG4gaW4gJGxpc3Q7IGRvCisgIGlmIHRlc3QgIngkbmFtZSIgPSAieCRuIjsgdGhlbgorICAgIGZvdW5kPTEKKyAgZmkKK2RvbmUKKworaWYgdGVzdCAiJGZvdW5kIiA9ICIxIiA7IHRoZW4KKyAgIEdDUllQVF9DSVBIRVJTPSIkR0NSWVBUX0NJUEhFUlMgY2FtZWxsaWEubG8gY2FtZWxsaWEtZ2x1ZS5sbyIKKworJGFzX2VjaG8gIiNkZWZpbmUgVVNFX0NBTUVMTElBIDEiID4+Y29uZmRlZnMuaAorCitmaQorCisKK25hbWU9ZHNhCitsaXN0PSRlbmFibGVkX3B1YmtleV9jaXBoZXJzCitmb3VuZD0wCisKK2ZvciBuIGluICRsaXN0OyBkbworICBpZiB0ZXN0ICJ4JG5hbWUiID0gIngkbiI7IHRoZW4KKyAgICBmb3VuZD0xCisgIGZpCitkb25lCisKK2lmIHRlc3QgIiRmb3VuZCIgPSAiMSIgOyB0aGVuCisgICBHQ1JZUFRfUFVCS0VZX0NJUEhFUlM9IiRHQ1JZUFRfUFVCS0VZX0NJUEhFUlMgZHNhLmxvIgorCiskYXNfZWNobyAiI2RlZmluZSBVU0VfRFNBIDEiID4+Y29uZmRlZnMuaAorCitmaQorCisKK25hbWU9cnNhCitsaXN0PSRlbmFibGVkX3B1YmtleV9jaXBoZXJzCitmb3VuZD0wCisKK2ZvciBuIGluICRsaXN0OyBkbworICBpZiB0ZXN0ICJ4JG5hbWUiID0gIngkbiI7IHRoZW4KKyAgICBmb3VuZD0xCisgIGZpCitkb25lCisKK2lmIHRlc3QgIiRmb3VuZCIgPSAiMSIgOyB0aGVuCisgICBHQ1JZUFRfUFVCS0VZX0NJUEhFUlM9IiRHQ1JZUFRfUFVCS0VZX0NJUEhFUlMgcnNhLmxvIgorCiskYXNfZWNobyAiI2RlZmluZSBVU0VfUlNBIDEiID4+Y29uZmRlZnMuaAorCitmaQorCisKK25hbWU9ZWxnYW1hbAorbGlzdD0kZW5hYmxlZF9wdWJrZXlfY2lwaGVycworZm91bmQ9MAorCitmb3IgbiBpbiAkbGlzdDsgZG8KKyAgaWYgdGVzdCAieCRuYW1lIiA9ICJ4JG4iOyB0aGVuCisgICAgZm91bmQ9MQorICBmaQorZG9uZQorCitpZiB0ZXN0ICIkZm91bmQiID0gIjEiIDsgdGhlbgorICAgR0NSWVBUX1BVQktFWV9DSVBIRVJTPSIkR0NSWVBUX1BVQktFWV9DSVBIRVJTIGVsZ2FtYWwubG8iCisKKyRhc19lY2hvICIjZGVmaW5lIFVTRV9FTEdBTUFMIDEiID4+Y29uZmRlZnMuaAorCitmaQorCisKK25hbWU9ZWNjCitsaXN0PSRlbmFibGVkX3B1YmtleV9jaXBoZXJzCitmb3VuZD0wCisKK2ZvciBuIGluICRsaXN0OyBkbworICBpZiB0ZXN0ICJ4JG5hbWUiID0gIngkbiI7IHRoZW4KKyAgICBmb3VuZD0xCisgIGZpCitkb25lCisKK2lmIHRlc3QgIiRmb3VuZCIgPSAiMSIgOyB0aGVuCisgICBHQ1JZUFRfUFVCS0VZX0NJUEhFUlM9IiRHQ1JZUFRfUFVCS0VZX0NJUEhFUlMgZWNjLmxvIgorCiskYXNfZWNobyAiI2RlZmluZSBVU0VfRUNDIDEiID4+Y29uZmRlZnMuaAorCitmaQorCisKK25hbWU9Y3JjCitsaXN0PSRlbmFibGVkX2RpZ2VzdHMKK2ZvdW5kPTAKKworZm9yIG4gaW4gJGxpc3Q7IGRvCisgIGlmIHRlc3QgIngkbmFtZSIgPSAieCRuIjsgdGhlbgorICAgIGZvdW5kPTEKKyAgZmkKK2RvbmUKKworaWYgdGVzdCAiJGZvdW5kIiA9ICIxIiA7IHRoZW4KKyAgIEdDUllQVF9ESUdFU1RTPSIkR0NSWVBUX0RJR0VTVFMgY3JjLmxvIgorCiskYXNfZWNobyAiI2RlZmluZSBVU0VfQ1JDIDEiID4+Y29uZmRlZnMuaAorCitmaQorCisKK25hbWU9bWQ0CitsaXN0PSRlbmFibGVkX2RpZ2VzdHMKK2ZvdW5kPTAKKworZm9yIG4gaW4gJGxpc3Q7IGRvCisgIGlmIHRlc3QgIngkbmFtZSIgPSAieCRuIjsgdGhlbgorICAgIGZvdW5kPTEKKyAgZmkKK2RvbmUKKworaWYgdGVzdCAiJGZvdW5kIiA9ICIxIiA7IHRoZW4KKyAgIEdDUllQVF9ESUdFU1RTPSIkR0NSWVBUX0RJR0VTVFMgbWQ0LmxvIgorCiskYXNfZWNobyAiI2RlZmluZSBVU0VfTUQ0IDEiID4+Y29uZmRlZnMuaAorCitmaQorCisKK25hbWU9bWQ1CitsaXN0PSRlbmFibGVkX2RpZ2VzdHMKK2ZvdW5kPTAKKworZm9yIG4gaW4gJGxpc3Q7IGRvCisgIGlmIHRlc3QgIngkbmFtZSIgPSAieCRuIjsgdGhlbgorICAgIGZvdW5kPTEKKyAgZmkKK2RvbmUKKworaWYgdGVzdCAiJGZvdW5kIiA9ICIxIiA7IHRoZW4KKyAgIEdDUllQVF9ESUdFU1RTPSIkR0NSWVBUX0RJR0VTVFMgbWQ1LmxvIgorCiskYXNfZWNobyAiI2RlZmluZSBVU0VfTUQ1IDEiID4+Y29uZmRlZnMuaAorCitmaQorCisKK25hbWU9c2hhMjU2CitsaXN0PSRlbmFibGVkX2RpZ2VzdHMKK2ZvdW5kPTAKKworZm9yIG4gaW4gJGxpc3Q7IGRvCisgIGlmIHRlc3QgIngkbmFtZSIgPSAieCRuIjsgdGhlbgorICAgIGZvdW5kPTEKKyAgZmkKK2RvbmUKKworaWYgdGVzdCAiJGZvdW5kIiA9ICIxIiA7IHRoZW4KKyAgIEdDUllQVF9ESUdFU1RTPSIkR0NSWVBUX0RJR0VTVFMgc2hhMjU2LmxvIgorCiskYXNfZWNobyAiI2RlZmluZSBVU0VfU0hBMjU2IDEiID4+Y29uZmRlZnMuaAorCitmaQorCisKK25hbWU9c2hhNTEyCitsaXN0PSRlbmFibGVkX2RpZ2VzdHMKK2ZvdW5kPTAKKworZm9yIG4gaW4gJGxpc3Q7IGRvCisgIGlmIHRlc3QgIngkbmFtZSIgPSAieCRuIjsgdGhlbgorICAgIGZvdW5kPTEKKyAgZmkKK2RvbmUKKworaWYgdGVzdCAiJGZvdW5kIiA9ICIxIiA7IHRoZW4KKyAgIEdDUllQVF9ESUdFU1RTPSIkR0NSWVBUX0RJR0VTVFMgc2hhNTEyLmxvIgorCiskYXNfZWNobyAiI2RlZmluZSBVU0VfU0hBNTEyIDEiID4+Y29uZmRlZnMuaAorCitmaQorCisKK25hbWU9dGlnZXIKK2xpc3Q9JGVuYWJsZWRfZGlnZXN0cworZm91bmQ9MAorCitmb3IgbiBpbiAkbGlzdDsgZG8KKyAgaWYgdGVzdCAieCRuYW1lIiA9ICJ4JG4iOyB0aGVuCisgICAgZm91bmQ9MQorICBmaQorZG9uZQorCitpZiB0ZXN0ICIkZm91bmQiID0gIjEiIDsgdGhlbgorICAgR0NSWVBUX0RJR0VTVFM9IiRHQ1JZUFRfRElHRVNUUyB0aWdlci5sbyIKKworJGFzX2VjaG8gIiNkZWZpbmUgVVNFX1RJR0VSIDEiID4+Y29uZmRlZnMuaAorCitmaQorCisKK25hbWU9d2hpcmxwb29sCitsaXN0PSRlbmFibGVkX2RpZ2VzdHMKK2ZvdW5kPTAKKworZm9yIG4gaW4gJGxpc3Q7IGRvCisgIGlmIHRlc3QgIngkbmFtZSIgPSAieCRuIjsgdGhlbgorICAgIGZvdW5kPTEKKyAgZmkKK2RvbmUKKworaWYgdGVzdCAiJGZvdW5kIiA9ICIxIiA7IHRoZW4KKyAgIEdDUllQVF9ESUdFU1RTPSIkR0NSWVBUX0RJR0VTVFMgd2hpcmxwb29sLmxvIgorCiskYXNfZWNobyAiI2RlZmluZSBVU0VfV0hJUkxQT09MIDEiID4+Y29uZmRlZnMuaAorCitmaQorCisjIHJtZDE2MCBhbmQgc2hhMSBzaG91bGQgYmUgaW5jbHVkZWQgYWx3YXlzLgorR0NSWVBUX0RJR0VTVFM9IiRHQ1JZUFRfRElHRVNUUyBybWQxNjAubG8gc2hhMS5sbyIKKworJGFzX2VjaG8gIiNkZWZpbmUgVVNFX1JNRDE2MCAxIiA+PmNvbmZkZWZzLmgKKworCiskYXNfZWNobyAiI2RlZmluZSBVU0VfU0hBMSAxIiA+PmNvbmZkZWZzLmgKKworCisKK25hbWU9bGludXgKK2xpc3Q9JHJhbmRvbV9tb2R1bGVzCitmb3VuZD0wCisKK2ZvciBuIGluICRsaXN0OyBkbworICBpZiB0ZXN0ICJ4JG5hbWUiID0gIngkbiI7IHRoZW4KKyAgICBmb3VuZD0xCisgIGZpCitkb25lCisKK2lmIHRlc3QgIiRmb3VuZCIgPSAiMSIgOyB0aGVuCisgICBHQ1JZUFRfUkFORE9NPSIkR0NSWVBUX1JBTkRPTSBybmRsaW51eC5sbyIKKworJGFzX2VjaG8gIiNkZWZpbmUgVVNFX1JORExJTlVYIDEiID4+Y29uZmRlZnMuaAorCitmaQorCisKK25hbWU9dW5peAorbGlzdD0kcmFuZG9tX21vZHVsZXMKK2ZvdW5kPTAKKworZm9yIG4gaW4gJGxpc3Q7IGRvCisgIGlmIHRlc3QgIngkbmFtZSIgPSAieCRuIjsgdGhlbgorICAgIGZvdW5kPTEKKyAgZmkKK2RvbmUKKworaWYgdGVzdCAiJGZvdW5kIiA9ICIxIiA7IHRoZW4KKyAgIEdDUllQVF9SQU5ET009IiRHQ1JZUFRfUkFORE9NIHJuZHVuaXgubG8iCisKKyRhc19lY2hvICIjZGVmaW5lIFVTRV9STkRVTklYIDEiID4+Y29uZmRlZnMuaAorCisgICBwcmludF9lZ2Rfbm90aWNlPXllcworZmkKKworCituYW1lPWVnZAorbGlzdD0kcmFuZG9tX21vZHVsZXMKK2ZvdW5kPTAKKworZm9yIG4gaW4gJGxpc3Q7IGRvCisgIGlmIHRlc3QgIngkbmFtZSIgPSAieCRuIjsgdGhlbgorICAgIGZvdW5kPTEKKyAgZmkKK2RvbmUKKworaWYgdGVzdCAiJGZvdW5kIiA9ICIxIiA7IHRoZW4KKyAgIEdDUllQVF9SQU5ET009IiRHQ1JZUFRfUkFORE9NIHJuZGVnZC5sbyIKKworJGFzX2VjaG8gIiNkZWZpbmUgVVNFX1JOREVHRCAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworCituYW1lPXczMgorbGlzdD0kcmFuZG9tX21vZHVsZXMKK2ZvdW5kPTAKKworZm9yIG4gaW4gJGxpc3Q7IGRvCisgIGlmIHRlc3QgIngkbmFtZSIgPSAieCRuIjsgdGhlbgorICAgIGZvdW5kPTEKKyAgZmkKK2RvbmUKKworaWYgdGVzdCAiJGZvdW5kIiA9ICIxIiA7IHRoZW4KKyAgIEdDUllQVF9SQU5ET009IiRHQ1JZUFRfUkFORE9NIHJuZHczMi5sbyIKKworJGFzX2VjaG8gIiNkZWZpbmUgVVNFX1JORFczMiAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworCisKKworCisKK0xJQkdDUllQVF9DSVBIRVJTPSRlbmFibGVkX2NpcGhlcnMKKworTElCR0NSWVBUX1BVQktFWV9DSVBIRVJTPSRlbmFibGVkX3B1YmtleV9jaXBoZXJzCisKK0xJQkdDUllQVF9ESUdFU1RTPSRlbmFibGVkX2RpZ2VzdHMKKworCisjIEZvciBwcmludGluZyB0aGUgY29uZmlndXJhdGlvbiB3ZSBuZWVkIGEgY29sb24gc2VwYXJhdGVkIGxpc3Qgb2YKKyMgYWxnb3JpdGhtIG5hbWVzLgordG1wPWBlY2hvICIkZW5hYmxlZF9jaXBoZXJzIiB8IHRyICcgJyA6IGAKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBMSUJHQ1JZUFRfQ0lQSEVSUyAiJHRtcCIKK19BQ0VPRgorCit0bXA9YGVjaG8gIiRlbmFibGVkX3B1YmtleV9jaXBoZXJzIiB8IHRyICcgJyA6IGAKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBMSUJHQ1JZUFRfUFVCS0VZX0NJUEhFUlMgIiR0bXAiCitfQUNFT0YKKwordG1wPWBlY2hvICIkZW5hYmxlZF9kaWdlc3RzIiB8IHRyICcgJyA6IGAKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBMSUJHQ1JZUFRfRElHRVNUUyAiJHRtcCIKK19BQ0VPRgorCisKKworCisjIEdlbmVyYXRlIGV4dGVuZGVkIHZlcnNpb24gaW5mb3JtYXRpb24gZm9yIFczMi4KK2lmIHRlc3QgIiRoYXZlX3czMl9zeXN0ZW0iID0geWVzOyB0aGVuCisgICBCVUlMRF9USU1FU1RBTVA9YGRhdGUgLS1pc28tODYwMT1taW51dGVzYAorICAgICAgQlVJTERfRklMRVZFUlNJT049YGVjaG8gIiRWRVJTSU9OIiB8IHNlZCAncy9cKFswLTkuXSpcKS4qL1wxLi87cy9cLi8sL2cnYAorICAgICAgQlVJTERfRklMRVZFUlNJT049IiR7QlVJTERfRklMRVZFUlNJT059JHtCVUlMRF9SRVZJU0lPTn0iCitmaQorCisKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEJVSUxEX1JFVklTSU9OICIkQlVJTERfUkVWSVNJT04iCitfQUNFT0YKKworCisKKworIyBBbmQgY3JlYXRlIHRoZSBmaWxlcy4KK2FjX2NvbmZpZ19maWxlcz0iJGFjX2NvbmZpZ19maWxlcyBNYWtlZmlsZSBtNC9NYWtlZmlsZSBtcGkvTWFrZWZpbGUgY2lwaGVyL01ha2VmaWxlIHJhbmRvbS9NYWtlZmlsZSBkb2MvTWFrZWZpbGUgc3JjL01ha2VmaWxlIHNyYy9nY3J5cHQuaCBzcmMvbGliZ2NyeXB0LWNvbmZpZyBzcmMvdmVyc2lvbmluZm8ucmMgdGVzdHMvTWFrZWZpbGUiCisKK2NhdCA+Y29uZmNhY2hlIDw8XF9BQ0VPRgorIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCisjIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKKyMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMsIHNlZSBjb25maWd1cmUncyBvcHRpb24gLS1jb25maWctY2FjaGUuCisjIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4gIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0CisjIHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KKyMKKyMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0CisjIHRoZSAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KKyMKKyMgYGFjX2N2X2Vudl9mb28nIHZhcmlhYmxlcyAoc2V0IG9yIHVuc2V0KSB3aWxsIGJlIG92ZXJyaWRkZW4gd2hlbgorIyBsb2FkaW5nIHRoaXMgZmlsZSwgb3RoZXIgKnVuc2V0KiBgYWNfY3ZfZm9vJyB3aWxsIGJlIGFzc2lnbmVkIHRoZQorIyBmb2xsb3dpbmcgdmFsdWVzLgorCitfQUNFT0YKKworIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKKyMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCisjIFNvLCB3ZSBraWxsIHZhcmlhYmxlcyBjb250YWluaW5nIG5ld2xpbmVzLgorIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCisjIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgorKAorICBmb3IgYWNfdmFyIGluIGAoc2V0KSAyPiYxIHwgc2VkIC1uICdzL15cKFthLXpBLVpfXVthLXpBLVowLTlfXSpcKT0uKi9cMS9wJ2A7IGRvCisgICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCisgICAgY2FzZSAkYWNfdmFsIGluICMoCisgICAgKiR7YXNfbmx9KikKKyAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAorICAgICAgKl9jdl8qKSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IGNhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGNhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lIiA+JjI7fSA7OworICAgICAgZXNhYworICAgICAgY2FzZSAkYWNfdmFyIGluICMoCisgICAgICBfIHwgSUZTIHwgYXNfbmwpIDs7ICMoCisgICAgICBCQVNIX0FSR1YgfCBCQVNIX1NPVVJDRSkgZXZhbCAkYWNfdmFyPSA7OyAjKAorICAgICAgKikgeyBldmFsICRhY192YXI9OyB1bnNldCAkYWNfdmFyO30gOzsKKyAgICAgIGVzYWMgOzsKKyAgICBlc2FjCisgIGRvbmUKKworICAoc2V0KSAyPiYxIHwKKyAgICBjYXNlICRhc19ubGAoYWNfc3BhY2U9JyAnOyBzZXQpIDI+JjFgIGluICMoCisgICAgKiR7YXNfbmx9YWNfc3BhY2U9XCAqKQorICAgICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXM6IGRvdWJsZS1xdW90ZQorICAgICAgIyBzdWJzdGl0dXRpb24gdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXC4KKyAgICAgIHNlZCAtbiBcCisJInMvJy8nXFxcXCcnL2c7CisJICBzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPSdcXDInL3AiCisgICAgICA7OyAjKAorICAgICopCisgICAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgorICAgICAgc2VkIC1uICIvXltfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKj0vcCIKKyAgICAgIDs7CisgICAgZXNhYyB8CisgICAgc29ydAorKSB8CisgIHNlZCAnCisgICAgIC9eYWNfY3ZfZW52Xy9iIGVuZAorICAgICB0IGNsZWFyCisgICAgIDpjbGVhcgorICAgICBzL15cKFtePV0qXCk9XCguKlt7fV0uKlwpJC90ZXN0ICIke1wxK3NldH0iID0gc2V0IHx8ICYvCisgICAgIHQgZW5kCisgICAgIHMvXlwoW149XSpcKT1cKC4qXCkkL1wxPSR7XDE9XDJ9LworICAgICA6ZW5kJyA+PmNvbmZjYWNoZQoraWYgZGlmZiAiJGNhY2hlX2ZpbGUiIGNvbmZjYWNoZSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOjsgZWxzZQorICBpZiB0ZXN0IC13ICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgICB0ZXN0ICJ4JGNhY2hlX2ZpbGUiICE9ICJ4L2Rldi9udWxsIiAmJgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiB1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiB1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKyAgICBjYXQgY29uZmNhY2hlID4kY2FjaGVfZmlsZQorICBlbHNlCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKyAgZmkKK2ZpCitybSAtZiBjb25mY2FjaGUKKwordGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAorIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCit0ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCisKK0RFRlM9LURIQVZFX0NPTkZJR19ICisKK2FjX2xpYm9ianM9CithY19sdGxpYm9ianM9Citmb3IgYWNfaSBpbiA6ICRMSUJPQkpTOyBkbyB0ZXN0ICJ4JGFjX2kiID0geDogJiYgY29udGludWUKKyAgIyAxLiBSZW1vdmUgdGhlIGV4dGVuc2lvbiwgYW5kICRVIGlmIGFscmVhZHkgaW5zdGFsbGVkLgorICBhY19zY3JpcHQ9J3MvXCRVXC4vLi87cy9cLm8kLy87cy9cLm9iaiQvLycKKyAgYWNfaT1gJGFzX2VjaG8gIiRhY19pIiB8IHNlZCAiJGFjX3NjcmlwdCJgCisgICMgMi4gUHJlcGVuZCBMSUJPQkpESVIuICBXaGVuIHVzZWQgd2l0aCBhdXRvbWFrZT49MS4xMCBMSUJPQkpESVIKKyAgIyAgICB3aWxsIGJlIHNldCB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIExJQk9CSlMgb2JqZWN0cyBhcmUgYnVpbHQuCisgIGFzX2ZuX2FwcGVuZCBhY19saWJvYmpzICIgXCR7TElCT0JKRElSfSRhY19pXCRVLiRhY19vYmpleHQiCisgIGFzX2ZuX2FwcGVuZCBhY19sdGxpYm9ianMgIiBcJHtMSUJPQkpESVJ9JGFjX2kiJyRVLmxvJworZG9uZQorTElCT0JKUz0kYWNfbGlib2JqcworCitMVExJQk9CSlM9JGFjX2x0bGlib2JqcworCisKK2lmIHRlc3QgLXogIiR7TUFJTlRBSU5FUl9NT0RFX1RSVUV9IiAmJiB0ZXN0IC16ICIke01BSU5UQUlORVJfTU9ERV9GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICJjb25kaXRpb25hbCBcIk1BSU5UQUlORVJfTU9ERVwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7QU1ERVBfVFJVRX0iICYmIHRlc3QgLXogIiR7QU1ERVBfRkFMU0V9IjsgdGhlbgorICBhc19mbl9lcnJvciAiY29uZGl0aW9uYWwgXCJBTURFUFwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7YW1fX2Zhc3RkZXBDQ19UUlVFfSIgJiYgdGVzdCAteiAiJHthbV9fZmFzdGRlcENDX0ZBTFNFfSI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgImNvbmRpdGlvbmFsIFwiYW1fX2Zhc3RkZXBDQ1wiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7YW1fX2Zhc3RkZXBDQ0FTX1RSVUV9IiAmJiB0ZXN0IC16ICIke2FtX19mYXN0ZGVwQ0NBU19GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICJjb25kaXRpb25hbCBcImFtX19mYXN0ZGVwQ0NBU1wiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7YW1fX2Zhc3RkZXBDWFhfVFJVRX0iICYmIHRlc3QgLXogIiR7YW1fX2Zhc3RkZXBDWFhfRkFMU0V9IjsgdGhlbgorICBhc19mbl9lcnJvciAiY29uZGl0aW9uYWwgXCJhbV9fZmFzdGRlcENYWFwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7SEFWRV9XMzJfU1lTVEVNX1RSVUV9IiAmJiB0ZXN0IC16ICIke0hBVkVfVzMyX1NZU1RFTV9GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICJjb25kaXRpb25hbCBcIkhBVkVfVzMyX1NZU1RFTVwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKKworaWYgdGVzdCAteiAiJHtVU0VfUkFORE9NX0RBRU1PTl9UUlVFfSIgJiYgdGVzdCAteiAiJHtVU0VfUkFORE9NX0RBRU1PTl9GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICJjb25kaXRpb25hbCBcIlVTRV9SQU5ET01fREFFTU9OXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CitmaQoraWYgdGVzdCAteiAiJHtFTkFCTEVfT19GTEFHX01VTkdJTkdfVFJVRX0iICYmIHRlc3QgLXogIiR7RU5BQkxFX09fRkxBR19NVU5HSU5HX0ZBTFNFfSI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgImNvbmRpdGlvbmFsIFwiRU5BQkxFX09fRkxBR19NVU5HSU5HXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CitmaQoraWYgdGVzdCAteiAiJHtIQVZFX0xEX1ZFUlNJT05fU0NSSVBUX1RSVUV9IiAmJiB0ZXN0IC16ICIke0hBVkVfTERfVkVSU0lPTl9TQ1JJUFRfRkFMU0V9IjsgdGhlbgorICBhc19mbl9lcnJvciAiY29uZGl0aW9uYWwgXCJIQVZFX0xEX1ZFUlNJT05fU0NSSVBUXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CitmaQoraWYgdGVzdCAteiAiJHtNUElfTU9EX0FTTV9NUElIX0FERDFfVFJVRX0iICYmIHRlc3QgLXogIiR7TVBJX01PRF9BU01fTVBJSF9BREQxX0ZBTFNFfSI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgImNvbmRpdGlvbmFsIFwiTVBJX01PRF9BU01fTVBJSF9BREQxXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CitmaQoraWYgdGVzdCAteiAiJHtNUElfTU9EX0FTTV9NUElIX1NVQjFfVFJVRX0iICYmIHRlc3QgLXogIiR7TVBJX01PRF9BU01fTVBJSF9TVUIxX0ZBTFNFfSI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgImNvbmRpdGlvbmFsIFwiTVBJX01PRF9BU01fTVBJSF9TVUIxXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CitmaQoraWYgdGVzdCAteiAiJHtNUElfTU9EX0FTTV9NUElIX01VTDFfVFJVRX0iICYmIHRlc3QgLXogIiR7TVBJX01PRF9BU01fTVBJSF9NVUwxX0ZBTFNFfSI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgImNvbmRpdGlvbmFsIFwiTVBJX01PRF9BU01fTVBJSF9NVUwxXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CitmaQoraWYgdGVzdCAteiAiJHtNUElfTU9EX0FTTV9NUElIX01VTDJfVFJVRX0iICYmIHRlc3QgLXogIiR7TVBJX01PRF9BU01fTVBJSF9NVUwyX0ZBTFNFfSI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgImNvbmRpdGlvbmFsIFwiTVBJX01PRF9BU01fTVBJSF9NVUwyXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CitmaQoraWYgdGVzdCAteiAiJHtNUElfTU9EX0FTTV9NUElIX01VTDNfVFJVRX0iICYmIHRlc3QgLXogIiR7TVBJX01PRF9BU01fTVBJSF9NVUwzX0ZBTFNFfSI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgImNvbmRpdGlvbmFsIFwiTVBJX01PRF9BU01fTVBJSF9NVUwzXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CitmaQoraWYgdGVzdCAteiAiJHtNUElfTU9EX0FTTV9NUElIX0xTSElGVF9UUlVFfSIgJiYgdGVzdCAteiAiJHtNUElfTU9EX0FTTV9NUElIX0xTSElGVF9GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICJjb25kaXRpb25hbCBcIk1QSV9NT0RfQVNNX01QSUhfTFNISUZUXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CitmaQoraWYgdGVzdCAteiAiJHtNUElfTU9EX0FTTV9NUElIX1JTSElGVF9UUlVFfSIgJiYgdGVzdCAteiAiJHtNUElfTU9EX0FTTV9NUElIX1JTSElGVF9GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICJjb25kaXRpb25hbCBcIk1QSV9NT0RfQVNNX01QSUhfUlNISUZUXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CitmaQoraWYgdGVzdCAteiAiJHtNUElfTU9EX0FTTV9VRElWX1RSVUV9IiAmJiB0ZXN0IC16ICIke01QSV9NT0RfQVNNX1VESVZfRkFMU0V9IjsgdGhlbgorICBhc19mbl9lcnJvciAiY29uZGl0aW9uYWwgXCJNUElfTU9EX0FTTV9VRElWXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CitmaQoraWYgdGVzdCAteiAiJHtNUElfTU9EX0FTTV9VRElWX1FSTk5EX1RSVUV9IiAmJiB0ZXN0IC16ICIke01QSV9NT0RfQVNNX1VESVZfUVJOTkRfRkFMU0V9IjsgdGhlbgorICBhc19mbl9lcnJvciAiY29uZGl0aW9uYWwgXCJNUElfTU9EX0FTTV9VRElWX1FSTk5EXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CitmaQoraWYgdGVzdCAteiAiJHtNUElfTU9EX0NfTVBJSF9BREQxX1RSVUV9IiAmJiB0ZXN0IC16ICIke01QSV9NT0RfQ19NUElIX0FERDFfRkFMU0V9IjsgdGhlbgorICBhc19mbl9lcnJvciAiY29uZGl0aW9uYWwgXCJNUElfTU9EX0NfTVBJSF9BREQxXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CitmaQoraWYgdGVzdCAteiAiJHtNUElfTU9EX0NfTVBJSF9TVUIxX1RSVUV9IiAmJiB0ZXN0IC16ICIke01QSV9NT0RfQ19NUElIX1NVQjFfRkFMU0V9IjsgdGhlbgorICBhc19mbl9lcnJvciAiY29uZGl0aW9uYWwgXCJNUElfTU9EX0NfTVBJSF9TVUIxXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CitmaQoraWYgdGVzdCAteiAiJHtNUElfTU9EX0NfTVBJSF9NVUwxX1RSVUV9IiAmJiB0ZXN0IC16ICIke01QSV9NT0RfQ19NUElIX01VTDFfRkFMU0V9IjsgdGhlbgorICBhc19mbl9lcnJvciAiY29uZGl0aW9uYWwgXCJNUElfTU9EX0NfTVBJSF9NVUwxXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CitmaQoraWYgdGVzdCAteiAiJHtNUElfTU9EX0NfTVBJSF9NVUwyX1RSVUV9IiAmJiB0ZXN0IC16ICIke01QSV9NT0RfQ19NUElIX01VTDJfRkFMU0V9IjsgdGhlbgorICBhc19mbl9lcnJvciAiY29uZGl0aW9uYWwgXCJNUElfTU9EX0NfTVBJSF9NVUwyXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CitmaQoraWYgdGVzdCAteiAiJHtNUElfTU9EX0NfTVBJSF9NVUwzX1RSVUV9IiAmJiB0ZXN0IC16ICIke01QSV9NT0RfQ19NUElIX01VTDNfRkFMU0V9IjsgdGhlbgorICBhc19mbl9lcnJvciAiY29uZGl0aW9uYWwgXCJNUElfTU9EX0NfTVBJSF9NVUwzXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CitmaQoraWYgdGVzdCAteiAiJHtNUElfTU9EX0NfTVBJSF9MU0hJRlRfVFJVRX0iICYmIHRlc3QgLXogIiR7TVBJX01PRF9DX01QSUhfTFNISUZUX0ZBTFNFfSI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgImNvbmRpdGlvbmFsIFwiTVBJX01PRF9DX01QSUhfTFNISUZUXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CitmaQoraWYgdGVzdCAteiAiJHtNUElfTU9EX0NfTVBJSF9SU0hJRlRfVFJVRX0iICYmIHRlc3QgLXogIiR7TVBJX01PRF9DX01QSUhfUlNISUZUX0ZBTFNFfSI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgImNvbmRpdGlvbmFsIFwiTVBJX01PRF9DX01QSUhfUlNISUZUXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CitmaQoraWYgdGVzdCAteiAiJHtNUElfTU9EX0NfVURJVl9UUlVFfSIgJiYgdGVzdCAteiAiJHtNUElfTU9EX0NfVURJVl9GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICJjb25kaXRpb25hbCBcIk1QSV9NT0RfQ19VRElWXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CitmaQoraWYgdGVzdCAteiAiJHtNUElfTU9EX0NfVURJVl9RUk5ORF9UUlVFfSIgJiYgdGVzdCAteiAiJHtNUElfTU9EX0NfVURJVl9RUk5ORF9GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICJjb25kaXRpb25hbCBcIk1QSV9NT0RfQ19VRElWX1FSTk5EXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CitmaQoraWYgdGVzdCAteiAiJHtDUk9TU19DT01QSUxJTkdfVFJVRX0iICYmIHRlc3QgLXogIiR7Q1JPU1NfQ09NUElMSU5HX0ZBTFNFfSI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgImNvbmRpdGlvbmFsIFwiQ1JPU1NfQ09NUElMSU5HXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CitmaQorCis6ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9CithY193cml0ZV9mYWlsPTAKK2FjX2NsZWFuX2ZpbGVzX3NhdmU9JGFjX2NsZWFuX2ZpbGVzCithY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVzICRDT05GSUdfU1RBVFVTIgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgPiY2O30KK2FzX3dyaXRlX2ZhaWw9MAorY2F0ID4kQ09ORklHX1NUQVRVUyA8PF9BU0VPRiB8fCBhc193cml0ZV9mYWlsPTEKKyMhICRTSEVMTAorIyBHZW5lcmF0ZWQgYnkgJGFzX21lLgorIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCisjIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCisjIGNvbmZpZ3VyZSwgaXMgaW4gY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCisKK2RlYnVnPWZhbHNlCithY19jc19yZWNoZWNrPWZhbHNlCithY19jc19zaWxlbnQ9ZmFsc2UKKworU0hFTEw9XCR7Q09ORklHX1NIRUxMLSRTSEVMTH0KK2V4cG9ydCBTSEVMTAorX0FTRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQVNFT0YgfHwgYXNfd3JpdGVfZmFpbD0xCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgTTRzaCBJbml0aWFsaXphdGlvbi4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisKKyMgQmUgbW9yZSBCb3VybmUgY29tcGF0aWJsZQorRFVBTENBU0U9MTsgZXhwb3J0IERVQUxDQVNFICMgZm9yIE1LUyBzaAoraWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKyAgZW11bGF0ZSBzaAorICBOVUxMQ01EPToKKyAgIyBQcmUtNC4yIHZlcnNpb25zIG9mIFpzaCBkbyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCisgICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCisgIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJworICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorZWxzZQorICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4gIygKKyAgKnBvc2l4KikgOgorICAgIHNldCAtbyBwb3NpeCA7OyAjKAorICAqKSA6CisgICAgIDs7Citlc2FjCitmaQorCisKK2FzX25sPScKKycKK2V4cG9ydCBhc19ubAorIyBQcmludGluZyBhIGxvbmcgc3RyaW5nIGNyYXNoZXMgU29sYXJpcyA3IC91c3IvYmluL3ByaW50Zi4KK2FzX2VjaG89J1xcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFwnCithc19lY2hvPSRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8KK2FzX2VjaG89JGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvCisjIFByZWZlciBhIGtzaCBzaGVsbCBidWlsdGluIG92ZXIgYW4gZXh0ZXJuYWwgcHJpbnRmIHByb2dyYW0gb24gU29sYXJpcywKKyMgYnV0IHdpdGhvdXQgd2FzdGluZyBmb3JrcyBmb3IgYmFzaCBvciB6c2guCitpZiB0ZXN0IC16ICIkQkFTSF9WRVJTSU9OJFpTSF9WRVJTSU9OIiBcCisgICAgJiYgKHRlc3QgIlhgcHJpbnQgLXIgLS0gJGFzX2VjaG9gIiA9ICJYJGFzX2VjaG8iKSAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19lY2hvPSdwcmludCAtciAtLScKKyAgYXNfZWNob19uPSdwcmludCAtcm4gLS0nCitlbGlmICh0ZXN0ICJYYHByaW50ZiAlcyAkYXNfZWNob2AiID0gIlgkYXNfZWNobyIpIDI+L2Rldi9udWxsOyB0aGVuCisgIGFzX2VjaG89J3ByaW50ZiAlc1xuJworICBhc19lY2hvX249J3ByaW50ZiAlcycKK2Vsc2UKKyAgaWYgdGVzdCAiWGAoL3Vzci91Y2IvZWNobyAtbiAtbiAkYXNfZWNobykgMj4vZGV2L251bGxgIiA9ICJYLW4gJGFzX2VjaG8iOyB0aGVuCisgICAgYXNfZWNob19ib2R5PSdldmFsIC91c3IvdWNiL2VjaG8gLW4gIiQxJGFzX25sIicKKyAgICBhc19lY2hvX249Jy91c3IvdWNiL2VjaG8gLW4nCisgIGVsc2UKKyAgICBhc19lY2hvX2JvZHk9J2V2YWwgZXhwciAiWCQxIiA6ICJYXFwoLipcXCkiJworICAgIGFzX2VjaG9fbl9ib2R5PSdldmFsCisgICAgICBhcmc9JDE7CisgICAgICBjYXNlICRhcmcgaW4gIygKKyAgICAgICoiJGFzX25sIiopCisJZXhwciAiWCRhcmciIDogIlhcXCguKlxcKSRhc19ubCI7CisJYXJnPWBleHByICJYJGFyZyIgOiAiLiokYXNfbmxcXCguKlxcKSJgOzsKKyAgICAgIGVzYWM7CisgICAgICBleHByICJYJGFyZyIgOiAiWFxcKC4qXFwpIiB8IHRyIC1kICIkYXNfbmwiCisgICAgJworICAgIGV4cG9ydCBhc19lY2hvX25fYm9keQorICAgIGFzX2VjaG9fbj0nc2ggLWMgJGFzX2VjaG9fbl9ib2R5IGFzX2VjaG8nCisgIGZpCisgIGV4cG9ydCBhc19lY2hvX2JvZHkKKyAgYXNfZWNobz0nc2ggLWMgJGFzX2VjaG9fYm9keSBhc19lY2hvJworZmkKKworIyBUaGUgdXNlciBpcyBhbHdheXMgcmlnaHQuCitpZiB0ZXN0ICIke1BBVEhfU0VQQVJBVE9SK3NldH0iICE9IHNldDsgdGhlbgorICBQQVRIX1NFUEFSQVRPUj06CisgIChQQVRIPScvYmluOy9iaW4nOyBGUEFUSD0kUEFUSDsgc2ggLWMgOikgPi9kZXYvbnVsbCAyPiYxICYmIHsKKyAgICAoUEFUSD0nL2JpbjovYmluJzsgRlBBVEg9JFBBVEg7IHNoIC1jIDopID4vZGV2L251bGwgMj4mMSB8fAorICAgICAgUEFUSF9TRVBBUkFUT1I9JzsnCisgIH0KK2ZpCisKKworIyBJRlMKKyMgV2UgbmVlZCBzcGFjZSwgdGFiIGFuZCBuZXcgbGluZSwgaW4gcHJlY2lzZWx5IHRoYXQgb3JkZXIuICBRdW90aW5nIGlzCisjIHRoZXJlIHRvIHByZXZlbnQgZWRpdG9ycyBmcm9tIGNvbXBsYWluaW5nIGFib3V0IHNwYWNlLXRhYi4KKyMgKElmIF9BU19QQVRIX1dBTEsgd2VyZSBjYWxsZWQgd2l0aCBJRlMgdW5zZXQsIGl0IHdvdWxkIGRpc2FibGUgd29yZAorIyBzcGxpdHRpbmcgYnkgc2V0dGluZyBJRlMgdG8gZW1wdHkgdmFsdWUuKQorSUZTPSIgIiIJJGFzX25sIgorCisjIEZpbmQgd2hvIHdlIGFyZS4gIExvb2sgaW4gdGhlIHBhdGggaWYgd2UgY29udGFpbiBubyBkaXJlY3Rvcnkgc2VwYXJhdG9yLgorY2FzZSAkMCBpbiAjKCgKKyAgKltcXC9dKiApIGFzX215c2VsZj0kMCA7OworICAqKSBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgdGVzdCAtciAiJGFzX2Rpci8kMCIgJiYgYXNfbXlzZWxmPSRhc19kaXIvJDAgJiYgYnJlYWsKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgICAgIDs7Citlc2FjCisjIFdlIGRpZCBub3QgZmluZCBvdXJzZWx2ZXMsIG1vc3QgcHJvYmFibHkgd2Ugd2VyZSBydW4gYXMgYHNoIENPTU1BTkQnCisjIGluIHdoaWNoIGNhc2Ugd2UgYXJlIG5vdCB0byBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KK2lmIHRlc3QgIngkYXNfbXlzZWxmIiA9IHg7IHRoZW4KKyAgYXNfbXlzZWxmPSQwCitmaQoraWYgdGVzdCAhIC1mICIkYXNfbXlzZWxmIjsgdGhlbgorICAkYXNfZWNobyAiJGFzX215c2VsZjogZXJyb3I6IGNhbm5vdCBmaW5kIG15c2VsZjsgcmVydW4gd2l0aCBhbiBhYnNvbHV0ZSBmaWxlIG5hbWUiID4mMgorICBleGl0IDEKK2ZpCisKKyMgVW5zZXQgdmFyaWFibGVzIHRoYXQgd2UgZG8gbm90IG5lZWQgYW5kIHdoaWNoIGNhdXNlIGJ1Z3MgKGUuZy4gaW4KKyMgcHJlLTMuMCBVV0lOIGtzaCkuICBCdXQgZG8gbm90IGNhdXNlIGJ1Z3MgaW4gYmFzaCAyLjAxOyB0aGUgInx8IGV4aXQgMSIKKyMgc3VwcHJlc3NlcyBhbnkgIlNlZ21lbnRhdGlvbiBmYXVsdCIgbWVzc2FnZSB0aGVyZS4gICcoKCcgY291bGQKKyMgdHJpZ2dlciBhIGJ1ZyBpbiBwZGtzaCA1LjIuMTQuCitmb3IgYXNfdmFyIGluIEJBU0hfRU5WIEVOViBNQUlMIE1BSUxQQVRICitkbyBldmFsIHRlc3QgeFwkeyRhc192YXIrc2V0fSA9IHhzZXQgXAorICAmJiAoICh1bnNldCAkYXNfdmFyKSB8fCBleGl0IDEpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCAkYXNfdmFyIHx8IDoKK2RvbmUKK1BTMT0nJCAnCitQUzI9Jz4gJworUFM0PScrICcKKworIyBOTFMgbnVpc2FuY2VzLgorTENfQUxMPUMKK2V4cG9ydCBMQ19BTEwKK0xBTkdVQUdFPUMKK2V4cG9ydCBMQU5HVUFHRQorCisjIENEUEFUSC4KKyh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKKworCisjIGFzX2ZuX2Vycm9yIEVSUk9SIFtMSU5FTk8gTE9HX0ZEXQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgT3V0cHV0ICJgYmFzZW5hbWUgJDBgOiBlcnJvcjogRVJST1IiIHRvIHN0ZGVyci4gSWYgTElORU5PIGFuZCBMT0dfRkQgYXJlCisjIHByb3ZpZGVkLCBhbHNvIG91dHB1dCB0aGUgZXJyb3IgdG8gTE9HX0ZELCByZWZlcmVuY2luZyBMSU5FTk8uIFRoZW4gZXhpdCB0aGUKKyMgc2NyaXB0IHdpdGggc3RhdHVzICQ/LCB1c2luZyAxIGlmIHRoYXQgd2FzIDAuCithc19mbl9lcnJvciAoKQoreworICBhc19zdGF0dXM9JD87IHRlc3QgJGFzX3N0YXR1cyAtZXEgMCAmJiBhc19zdGF0dXM9MQorICBpZiB0ZXN0ICIkMyI7IHRoZW4KKyAgICBhc19saW5lbm89JHthc19saW5lbm8tIiQyIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6ICQxIiA+JiQzCisgIGZpCisgICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiAkMSIgPiYyCisgIGFzX2ZuX2V4aXQgJGFzX3N0YXR1cworfSAjIGFzX2ZuX2Vycm9yCisKKworIyBhc19mbl9zZXRfc3RhdHVzIFNUQVRVUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTZXQgJD8gdG8gU1RBVFVTLCB3aXRob3V0IGZvcmtpbmcuCithc19mbl9zZXRfc3RhdHVzICgpCit7CisgIHJldHVybiAkMQorfSAjIGFzX2ZuX3NldF9zdGF0dXMKKworIyBhc19mbl9leGl0IFNUQVRVUworIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBFeGl0IHRoZSBzaGVsbCB3aXRoIFNUQVRVUywgZXZlbiBpbiBhICJ0cmFwIDAiIG9yICJzZXQgLWUiIGNvbnRleHQuCithc19mbl9leGl0ICgpCit7CisgIHNldCArZQorICBhc19mbl9zZXRfc3RhdHVzICQxCisgIGV4aXQgJDEKK30gIyBhc19mbl9leGl0CisKKyMgYXNfZm5fdW5zZXQgVkFSCisjIC0tLS0tLS0tLS0tLS0tLQorIyBQb3J0YWJseSB1bnNldCBWQVIuCithc19mbl91bnNldCAoKQoreworICB7IGV2YWwgJDE9OyB1bnNldCAkMTt9Cit9Cithc191bnNldD1hc19mbl91bnNldAorIyBhc19mbl9hcHBlbmQgVkFSIFZBTFVFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQXBwZW5kIHRoZSB0ZXh0IGluIFZBTFVFIHRvIHRoZSBlbmQgb2YgdGhlIGRlZmluaXRpb24gY29udGFpbmVkIGluIFZBUi4gVGFrZQorIyBhZHZhbnRhZ2Ugb2YgYW55IHNoZWxsIG9wdGltaXphdGlvbnMgdGhhdCBhbGxvdyBhbW9ydGl6ZWQgbGluZWFyIGdyb3d0aCBvdmVyCisjIHJlcGVhdGVkIGFwcGVuZHMsIGluc3RlYWQgb2YgdGhlIHR5cGljYWwgcXVhZHJhdGljIGdyb3d0aCBwcmVzZW50IGluIG5haXZlCisjIGltcGxlbWVudGF0aW9ucy4KK2lmIChldmFsICJhc192YXI9MTsgYXNfdmFyKz0yOyB0ZXN0IHhcJGFzX3ZhciA9IHgxMiIpIDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgZXZhbCAnYXNfZm5fYXBwZW5kICgpCisgIHsKKyAgICBldmFsICQxKz1cJDIKKyAgfScKK2Vsc2UKKyAgYXNfZm5fYXBwZW5kICgpCisgIHsKKyAgICBldmFsICQxPVwkJDFcJDIKKyAgfQorZmkgIyBhc19mbl9hcHBlbmQKKworIyBhc19mbl9hcml0aCBBUkcuLi4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tCisjIFBlcmZvcm0gYXJpdGhtZXRpYyBldmFsdWF0aW9uIG9uIHRoZSBBUkdzLCBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbiB0aGUKKyMgZ2xvYmFsICRhc192YWwuIFRha2UgYWR2YW50YWdlIG9mIHNoZWxscyB0aGF0IGNhbiBhdm9pZCBmb3Jrcy4gVGhlIGFyZ3VtZW50cworIyBtdXN0IGJlIHBvcnRhYmxlIGFjcm9zcyAkKCgpKSBhbmQgZXhwci4KK2lmIChldmFsICJ0ZXN0IFwkKCggMSArIDEgKSkgPSAyIikgMj4vZGV2L251bGw7IHRoZW4gOgorICBldmFsICdhc19mbl9hcml0aCAoKQorICB7CisgICAgYXNfdmFsPSQoKCAkKiApKQorICB9JworZWxzZQorICBhc19mbl9hcml0aCAoKQorICB7CisgICAgYXNfdmFsPWBleHByICIkQCIgfHwgdGVzdCAkPyAtZXEgMWAKKyAgfQorZmkgIyBhc19mbl9hcml0aAorCisKK2lmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxICYmCisgICB0ZXN0ICJYYGV4cHIgMDAwMDEgOiAnLipcKC4uLlwpJ2AiID0gWDAwMTsgdGhlbgorICBhc19leHByPWV4cHIKK2Vsc2UKKyAgYXNfZXhwcj1mYWxzZQorZmkKKworaWYgKGJhc2VuYW1lIC0tIC8pID4vZGV2L251bGwgMj4mMSAmJiB0ZXN0ICJYYGJhc2VuYW1lIC0tIC8gMj4mMWAiID0gIlgvIjsgdGhlbgorICBhc19iYXNlbmFtZT1iYXNlbmFtZQorZWxzZQorICBhc19iYXNlbmFtZT1mYWxzZQorZmkKKworaWYgKGFzX2Rpcj1gZGlybmFtZSAtLSAvYCAmJiB0ZXN0ICJYJGFzX2RpciIgPSBYLykgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX2Rpcm5hbWU9ZGlybmFtZQorZWxzZQorICBhc19kaXJuYW1lPWZhbHNlCitmaQorCithc19tZT1gJGFzX2Jhc2VuYW1lIC0tICIkMCIgfHwKKyRhc19leHByIFgvIiQwIiA6ICcuKi9cKFteL11bXi9dKlwpLyokJyBcfCBcCisJIFgiJDAiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJDAiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWC8iJDAiIHwKKyAgICBzZWQgJy9eLipcL1woW14vXVteL10qXClcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwvXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwvXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgCisKKyMgQXZvaWQgZGVwZW5kaW5nIHVwb24gQ2hhcmFjdGVyIFJhbmdlcy4KK2FzX2NyX2xldHRlcnM9J2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JworYXNfY3JfTEVUVEVSUz0nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonCithc19jcl9MZXR0ZXJzPSRhc19jcl9sZXR0ZXJzJGFzX2NyX0xFVFRFUlMKK2FzX2NyX2RpZ2l0cz0nMDEyMzQ1Njc4OScKK2FzX2NyX2FsbnVtPSRhc19jcl9MZXR0ZXJzJGFzX2NyX2RpZ2l0cworCitFQ0hPX0M9IEVDSE9fTj0gRUNIT19UPQorY2FzZSBgZWNobyAtbiB4YCBpbiAjKCgoKCgKKy1uKikKKyAgY2FzZSBgZWNobyAneHlcYydgIGluCisgICpjKikgRUNIT19UPScJJzs7CSMgRUNIT19UIGlzIHNpbmdsZSB0YWIgY2hhcmFjdGVyLgorICB4eSkgIEVDSE9fQz0nXGMnOzsKKyAgKikgICBlY2hvIGBlY2hvIGtzaDg4IGJ1ZyBvbiBBSVggNi4xYCA+IC9kZXYvbnVsbAorICAgICAgIEVDSE9fVD0nCSc7OworICBlc2FjOzsKKyopCisgIEVDSE9fTj0nLW4nOzsKK2VzYWMKKworcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKK2lmIHRlc3QgLWQgY29uZiQkLmRpcjsgdGhlbgorICBybSAtZiBjb25mJCQuZGlyL2NvbmYkJC5maWxlCitlbHNlCisgIHJtIC1mIGNvbmYkJC5kaXIKKyAgbWtkaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAorZmkKK2lmIChlY2hvID5jb25mJCQuZmlsZSkgMj4vZGV2L251bGw7IHRoZW4KKyAgaWYgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYXNfbG5fcz0nbG4gLXMnCisgICAgIyAuLi4gYnV0IHRoZXJlIGFyZSB0d28gZ290Y2hhczoKKyAgICAjIDEpIE9uIE1TWVMsIGJvdGggYGxuIC1zIGZpbGUgZGlyJyBhbmQgYGxuIGZpbGUgZGlyJyBmYWlsLgorICAgICMgMikgREpHUFAgPCAyLjA0IGhhcyBubyBzeW1saW5rczsgYGxuIC1zJyBjcmVhdGVzIGEgd3JhcHBlciBleGVjdXRhYmxlLgorICAgICMgSW4gYm90aCBjYXNlcywgd2UgaGF2ZSB0byBkZWZhdWx0IHRvIGBjcCAtcCcuCisgICAgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkLmRpciAyPi9kZXYvbnVsbCAmJiB0ZXN0ICEgLWYgY29uZiQkLmV4ZSB8fAorICAgICAgYXNfbG5fcz0nY3AgLXAnCisgIGVsaWYgbG4gY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYXNfbG5fcz1sbgorICBlbHNlCisgICAgYXNfbG5fcz0nY3AgLXAnCisgIGZpCitlbHNlCisgIGFzX2xuX3M9J2NwIC1wJworZmkKK3JtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUgY29uZiQkLmZpbGUKK3JtZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKKworCisjIGFzX2ZuX21rZGlyX3AKKyMgLS0tLS0tLS0tLS0tLQorIyBDcmVhdGUgIiRhc19kaXIiIGFzIGEgZGlyZWN0b3J5LCBpbmNsdWRpbmcgcGFyZW50cyBpZiBuZWNlc3NhcnkuCithc19mbl9ta2Rpcl9wICgpCit7CisKKyAgY2FzZSAkYXNfZGlyIGluICMoCisgIC0qKSBhc19kaXI9Li8kYXNfZGlyOzsKKyAgZXNhYworICB0ZXN0IC1kICIkYXNfZGlyIiB8fCBldmFsICRhc19ta2Rpcl9wIHx8IHsKKyAgICBhc19kaXJzPQorICAgIHdoaWxlIDo7IGRvCisgICAgICBjYXNlICRhc19kaXIgaW4gIygKKyAgICAgICpcJyopIGFzX3FkaXI9YCRhc19lY2hvICIkYXNfZGlyIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7ICMnKAorICAgICAgKikgYXNfcWRpcj0kYXNfZGlyOzsKKyAgICAgIGVzYWMKKyAgICAgIGFzX2RpcnM9IickYXNfcWRpcicgJGFzX2RpcnMiCisgICAgICBhc19kaXI9YCRhc19kaXJuYW1lIC0tICIkYXNfZGlyIiB8fAorJGFzX2V4cHIgWCIkYXNfZGlyIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyRhc19lY2hvIFgiJGFzX2RpciIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKVteL10uKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKSQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgCisgICAgICB0ZXN0IC1kICIkYXNfZGlyIiAmJiBicmVhaworICAgIGRvbmUKKyAgICB0ZXN0IC16ICIkYXNfZGlycyIgfHwgZXZhbCAibWtkaXIgJGFzX2RpcnMiCisgIH0gfHwgdGVzdCAtZCAiJGFzX2RpciIgfHwgYXNfZm5fZXJyb3IgImNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5ICRhc19kaXIiCisKKworfSAjIGFzX2ZuX21rZGlyX3AKK2lmIG1rZGlyIC1wIC4gMj4vZGV2L251bGw7IHRoZW4KKyAgYXNfbWtkaXJfcD0nbWtkaXIgLXAgIiRhc19kaXIiJworZWxzZQorICB0ZXN0IC1kIC4vLXAgJiYgcm1kaXIgLi8tcAorICBhc19ta2Rpcl9wPWZhbHNlCitmaQorCitpZiB0ZXN0IC14IC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX3Rlc3RfeD0ndGVzdCAteCcKK2Vsc2UKKyAgaWYgbHMgLWRMIC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgYXNfbHNfTF9vcHRpb249TAorICBlbHNlCisgICAgYXNfbHNfTF9vcHRpb249CisgIGZpCisgIGFzX3Rlc3RfeD0nCisgICAgZXZhbCBzaCAtYyAnXCcnCisgICAgICBpZiB0ZXN0IC1kICIkMSI7IHRoZW4KKwl0ZXN0IC1kICIkMS8uIjsKKyAgICAgIGVsc2UKKwljYXNlICQxIGluICMoCisJLSopc2V0ICIuLyQxIjs7CisJZXNhYzsKKwljYXNlIGBscyAtbGQnJGFzX2xzX0xfb3B0aW9uJyAiJDEiIDI+L2Rldi9udWxsYCBpbiAjKCgKKwk/Pz9bc3hdKik6OzsqKWZhbHNlOztlc2FjO2ZpCisgICAgJ1wnJyBzaAorICAnCitmaQorYXNfZXhlY3V0YWJsZV9wPSRhc190ZXN0X3gKKworIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIENQUCBuYW1lLgorYXNfdHJfY3BwPSJldmFsIHNlZCAneSUqJGFzX2NyX2xldHRlcnMlUCRhc19jcl9MRVRURVJTJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKKworIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIHZhcmlhYmxlIG5hbWUuCithc190cl9zaD0iZXZhbCBzZWQgJ3klKislcHAlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgorCisKK2V4ZWMgNj4mMQorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE1haW4gYm9keSBvZiAkQ09ORklHX1NUQVRVUyBzY3JpcHQuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworX0FTRU9GCit0ZXN0ICRhc193cml0ZV9mYWlsID0gMCAmJiBjaG1vZCAreCAkQ09ORklHX1NUQVRVUyB8fCBhY193cml0ZV9mYWlsPTEKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorIyBTYXZlIHRoZSBsb2cgbWVzc2FnZSwgdG8ga2VlcCAkMCBhbmQgc28gb24gbWVhbmluZ2Z1bCwgYW5kIHRvCisjIHJlcG9ydCBhY3R1YWwgaW5wdXQgdmFsdWVzIG9mIENPTkZJR19GSUxFUyBldGMuIGluc3RlYWQgb2YgdGhlaXIKKyMgdmFsdWVzIGFmdGVyIG9wdGlvbnMgaGFuZGxpbmcuCithY19sb2c9IgorVGhpcyBmaWxlIHdhcyBleHRlbmRlZCBieSBsaWJnY3J5cHQgJGFzX21lIDEuNC42LCB3aGljaCB3YXMKK2dlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42NC4gIEludm9jYXRpb24gY29tbWFuZCBsaW5lIHdhcworCisgIENPTkZJR19GSUxFUyAgICA9ICRDT05GSUdfRklMRVMKKyAgQ09ORklHX0hFQURFUlMgID0gJENPTkZJR19IRUFERVJTCisgIENPTkZJR19MSU5LUyAgICA9ICRDT05GSUdfTElOS1MKKyAgQ09ORklHX0NPTU1BTkRTID0gJENPTkZJR19DT01NQU5EUworICAkICQwICRACisKK29uIGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAorIgorCitfQUNFT0YKKworY2FzZSAkYWNfY29uZmlnX2ZpbGVzIGluICoiCisiKikgc2V0IHggJGFjX2NvbmZpZ19maWxlczsgc2hpZnQ7IGFjX2NvbmZpZ19maWxlcz0kKjs7Citlc2FjCisKK2Nhc2UgJGFjX2NvbmZpZ19oZWFkZXJzIGluICoiCisiKikgc2V0IHggJGFjX2NvbmZpZ19oZWFkZXJzOyBzaGlmdDsgYWNfY29uZmlnX2hlYWRlcnM9JCo7OworZXNhYworCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorIyBGaWxlcyB0aGF0IGNvbmZpZy5zdGF0dXMgd2FzIG1hZGUgZm9yLgorY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzIgorY29uZmlnX2hlYWRlcnM9IiRhY19jb25maWdfaGVhZGVycyIKK2NvbmZpZ19saW5rcz0iJGFjX2NvbmZpZ19saW5rcyIKK2NvbmZpZ19jb21tYW5kcz0iJGFjX2NvbmZpZ19jb21tYW5kcyIKKworX0FDRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2FjX2NzX3VzYWdlPSJcCitcYCRhc19tZScgaW5zdGFudGlhdGVzIGZpbGVzIGFuZCBvdGhlciBjb25maWd1cmF0aW9uIGFjdGlvbnMKK2Zyb20gdGVtcGxhdGVzIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLiAgVW5sZXNzIHRoZSBmaWxlcworYW5kIGFjdGlvbnMgYXJlIHNwZWNpZmllZCBhcyBUQUdzLCBhbGwgYXJlIGluc3RhbnRpYXRlZCBieSBkZWZhdWx0LgorCitVc2FnZTogJDAgW09QVElPTl0uLi4gW1RBR10uLi4KKworICAtaCwgLS1oZWxwICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0CisgIC1WLCAtLXZlcnNpb24gICAgcHJpbnQgdmVyc2lvbiBudW1iZXIgYW5kIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MsIHRoZW4gZXhpdAorICAtcSwgLS1xdWlldCwgLS1zaWxlbnQKKyAgICAgICAgICAgICAgICAgICBkbyBub3QgcHJpbnQgcHJvZ3Jlc3MgbWVzc2FnZXMKKyAgLWQsIC0tZGVidWcgICAgICBkb24ndCByZW1vdmUgdGVtcG9yYXJ5IGZpbGVzCisgICAgICAtLXJlY2hlY2sgICAgdXBkYXRlICRhc19tZSBieSByZWNvbmZpZ3VyaW5nIGluIHRoZSBzYW1lIGNvbmRpdGlvbnMKKyAgICAgIC0tZmlsZT1GSUxFWzpURU1QTEFURV0KKyAgICAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlIEZJTEUKKyAgICAgIC0taGVhZGVyPUZJTEVbOlRFTVBMQVRFXQorICAgICAgICAgICAgICAgICAgIGluc3RhbnRpYXRlIHRoZSBjb25maWd1cmF0aW9uIGhlYWRlciBGSUxFCisKK0NvbmZpZ3VyYXRpb24gZmlsZXM6CiskY29uZmlnX2ZpbGVzCisKK0NvbmZpZ3VyYXRpb24gaGVhZGVyczoKKyRjb25maWdfaGVhZGVycworCitDb25maWd1cmF0aW9uIGxpbmtzOgorJGNvbmZpZ19saW5rcworCitDb25maWd1cmF0aW9uIGNvbW1hbmRzOgorJGNvbmZpZ19jb21tYW5kcworCitSZXBvcnQgYnVncyB0byA8YnVnLWxpYmdjcnlwdEBnbnVwZy5vcmc+LiIKKworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2FjX2NzX3ZlcnNpb249IlxcCitsaWJnY3J5cHQgY29uZmlnLnN0YXR1cyAxLjQuNgorY29uZmlndXJlZCBieSAkMCwgZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY0LAorICB3aXRoIG9wdGlvbnMgXFwiYCRhc19lY2hvICIkYWNfY29uZmlndXJlX2FyZ3MiIHwgc2VkICdzL14gLy87IHMvW1xcIiJcYFwkXS9cXFxcJi9nJ2BcXCIKKworQ29weXJpZ2h0IChDKSAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorVGhpcyBjb25maWcuc3RhdHVzIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCitnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuIgorCithY19wd2Q9JyRhY19wd2QnCitzcmNkaXI9JyRzcmNkaXInCitJTlNUQUxMPSckSU5TVEFMTCcKK01LRElSX1A9JyRNS0RJUl9QJworQVdLPSckQVdLJwordGVzdCAtbiAiXCRBV0siIHx8IEFXSz1hd2sKK19BQ0VPRgorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisjIFRoZSBkZWZhdWx0IGxpc3RzIGFwcGx5IGlmIHRoZSB1c2VyIGRvZXMgbm90IHNwZWNpZnkgYW55IGZpbGUuCithY19uZWVkX2RlZmF1bHRzPToKK3doaWxlIHRlc3QgJCMgIT0gMAorZG8KKyAgY2FzZSAkMSBpbgorICAtLSo9KikKKyAgICBhY19vcHRpb249YGV4cHIgIlgkMSIgOiAnWFwoW149XSpcKT0nYAorICAgIGFjX29wdGFyZz1gZXhwciAiWCQxIiA6ICdYW149XSo9XCguKlwpJ2AKKyAgICBhY19zaGlmdD06CisgICAgOzsKKyAgKikKKyAgICBhY19vcHRpb249JDEKKyAgICBhY19vcHRhcmc9JDIKKyAgICBhY19zaGlmdD1zaGlmdAorICAgIDs7CisgIGVzYWMKKworICBjYXNlICRhY19vcHRpb24gaW4KKyAgIyBIYW5kbGluZyBvZiB0aGUgb3B0aW9ucy4KKyAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCisgICAgYWNfY3NfcmVjaGVjaz06IDs7CisgIC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdiB8IC1WICkKKyAgICAkYXNfZWNobyAiJGFjX2NzX3ZlcnNpb24iOyBleGl0IDs7CisgIC0tZGVidWcgfCAtLWRlYnUgfCAtLWRlYiB8IC0tZGUgfCAtLWQgfCAtZCApCisgICAgZGVidWc9OiA7OworICAtLWZpbGUgfCAtLWZpbCB8IC0tZmkgfCAtLWYgKQorICAgICRhY19zaGlmdAorICAgIGNhc2UgJGFjX29wdGFyZyBpbgorICAgICpcJyopIGFjX29wdGFyZz1gJGFzX2VjaG8gIiRhY19vcHRhcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7CisgICAgZXNhYworICAgIGFzX2ZuX2FwcGVuZCBDT05GSUdfRklMRVMgIiAnJGFjX29wdGFyZyciCisgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZTs7CisgIC0taGVhZGVyIHwgLS1oZWFkZSB8IC0taGVhZCB8IC0taGVhICkKKyAgICAkYWNfc2hpZnQKKyAgICBjYXNlICRhY19vcHRhcmcgaW4KKyAgICAqXCcqKSBhY19vcHRhcmc9YCRhc19lY2hvICIkYWNfb3B0YXJnIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OworICAgIGVzYWMKKyAgICBhc19mbl9hcHBlbmQgQ09ORklHX0hFQURFUlMgIiAnJGFjX29wdGFyZyciCisgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZTs7CisgIC0taGUgfCAtLWgpCisgICAgIyBDb25mbGljdCBiZXR3ZWVuIC0taGVscCBhbmQgLS1oZWFkZXIKKyAgICBhc19mbl9lcnJvciAiYW1iaWd1b3VzIG9wdGlvbjogXGAkMScKK1RyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIjs7CisgIC0taGVscCB8IC0taGVsIHwgLWggKQorICAgICRhc19lY2hvICIkYWNfY3NfdXNhZ2UiOyBleGl0IDs7CisgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCisgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsIHwgLS1zaSB8IC0tcykKKyAgICBhY19jc19zaWxlbnQ9OiA7OworCisgICMgVGhpcyBpcyBhbiBlcnJvci4KKyAgLSopIGFzX2ZuX2Vycm9yICJ1bnJlY29nbml6ZWQgb3B0aW9uOiBcYCQxJworVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDs7CisKKyAgKikgYXNfZm5fYXBwZW5kIGFjX2NvbmZpZ190YXJnZXRzICIgJDEiCisgICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2UgOzsKKworICBlc2FjCisgIHNoaWZ0Citkb25lCisKK2FjX2NvbmZpZ3VyZV9leHRyYV9hcmdzPQorCitpZiAkYWNfY3Nfc2lsZW50OyB0aGVuCisgIGV4ZWMgNj4vZGV2L251bGwKKyAgYWNfY29uZmlndXJlX2V4dHJhX2FyZ3M9IiRhY19jb25maWd1cmVfZXh0cmFfYXJncyAtLXNpbGVudCIKK2ZpCisKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCitpZiBcJGFjX2NzX3JlY2hlY2s7IHRoZW4KKyAgc2V0IFggJyRTSEVMTCcgJyQwJyAkYWNfY29uZmlndXJlX2FyZ3MgXCRhY19jb25maWd1cmVfZXh0cmFfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbgorICBzaGlmdAorICBcJGFzX2VjaG8gInJ1bm5pbmcgQ09ORklHX1NIRUxMPSRTSEVMTCBcJCoiID4mNgorICBDT05GSUdfU0hFTEw9JyRTSEVMTCcKKyAgZXhwb3J0IENPTkZJR19TSEVMTAorICBleGVjICJcJEAiCitmaQorCitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2V4ZWMgNT4+Y29uZmlnLmxvZworeworICBlY2hvCisgIHNlZCAnaDtzLy4vLS9nO3MvXi4uLi8jIyAvO3MvLi4uJC8gIyMvO3A7eDtwO3gnIDw8X0FTQk9YCisjIyBSdW5uaW5nICRhc19tZS4gIyMKK19BU0JPWAorICAkYXNfZWNobyAiJGFjX2xvZyIKK30gPiY1CisKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisjCisjIElOSVQtQ09NTUFORFMKKyMKK0FNREVQX1RSVUU9IiRBTURFUF9UUlVFIiBhY19hdXhfZGlyPSIkYWNfYXV4X2RpciIKKworcHJlZml4PSRwcmVmaXgKK2V4ZWNfcHJlZml4PSRleGVjX3ByZWZpeAorbGliZGlyPSRsaWJkaXIKK2RhdGFkaXI9JGRhdGFkaXIKK0RBVEFESVJOQU1FPSREQVRBRElSTkFNRQorCisKK19BQ0VPRgorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisKKyMgSGFuZGxpbmcgb2YgYXJndW1lbnRzLgorZm9yIGFjX2NvbmZpZ190YXJnZXQgaW4gJGFjX2NvbmZpZ190YXJnZXRzCitkbworICBjYXNlICRhY19jb25maWdfdGFyZ2V0IGluCisgICAgImNvbmZpZy5oIikgQ09ORklHX0hFQURFUlM9IiRDT05GSUdfSEVBREVSUyBjb25maWcuaCIgOzsKKyAgICAiZGVwZmlsZXMiKSBDT05GSUdfQ09NTUFORFM9IiRDT05GSUdfQ09NTUFORFMgZGVwZmlsZXMiIDs7CisgICAgIiIkbXBpX2xuX2xpc3QiIikgQ09ORklHX0xJTktTPSIkQ09ORklHX0xJTktTICIkbXBpX2xuX2xpc3QiIiA7OworICAgICJnY3J5cHQtY29uZiIpIENPTkZJR19DT01NQU5EUz0iJENPTkZJR19DT01NQU5EUyBnY3J5cHQtY29uZiIgOzsKKyAgICAiTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgTWFrZWZpbGUiIDs7CisgICAgIm00L01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIG00L01ha2VmaWxlIiA7OworICAgICJtcGkvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgbXBpL01ha2VmaWxlIiA7OworICAgICJjaXBoZXIvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgY2lwaGVyL01ha2VmaWxlIiA7OworICAgICJyYW5kb20vTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgcmFuZG9tL01ha2VmaWxlIiA7OworICAgICJkb2MvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgZG9jL01ha2VmaWxlIiA7OworICAgICJzcmMvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgc3JjL01ha2VmaWxlIiA7OworICAgICJzcmMvZ2NyeXB0LmgiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgc3JjL2djcnlwdC5oIiA7OworICAgICJzcmMvbGliZ2NyeXB0LWNvbmZpZyIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBzcmMvbGliZ2NyeXB0LWNvbmZpZyIgOzsKKyAgICAic3JjL3ZlcnNpb25pbmZvLnJjIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHNyYy92ZXJzaW9uaW5mby5yYyIgOzsKKyAgICAidGVzdHMvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdGVzdHMvTWFrZWZpbGUiIDs7CisKKyAgKikgYXNfZm5fZXJyb3IgImludmFsaWQgYXJndW1lbnQ6IFxgJGFjX2NvbmZpZ190YXJnZXQnIiAiJExJTkVOTyIgNTs7CisgIGVzYWMKK2RvbmUKKworCisjIElmIHRoZSB1c2VyIGRpZCBub3QgdXNlIHRoZSBhcmd1bWVudHMgdG8gc3BlY2lmeSB0aGUgaXRlbXMgdG8gaW5zdGFudGlhdGUsCisjIHRoZW4gdGhlIGVudnZhciBpbnRlcmZhY2UgaXMgdXNlZC4gIFNldCBvbmx5IHRob3NlIHRoYXQgYXJlIG5vdC4KKyMgV2UgdXNlIHRoZSBsb25nIGZvcm0gZm9yIHRoZSBkZWZhdWx0IGFzc2lnbm1lbnQgYmVjYXVzZSBvZiBhbiBleHRyZW1lbHkKKyMgYml6YXJyZSBidWcgb24gU3VuT1MgNC4xLjMuCitpZiAkYWNfbmVlZF9kZWZhdWx0czsgdGhlbgorICB0ZXN0ICIke0NPTkZJR19GSUxFUytzZXR9IiA9IHNldCB8fCBDT05GSUdfRklMRVM9JGNvbmZpZ19maWxlcworICB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iID0gc2V0IHx8IENPTkZJR19IRUFERVJTPSRjb25maWdfaGVhZGVycworICB0ZXN0ICIke0NPTkZJR19MSU5LUytzZXR9IiA9IHNldCB8fCBDT05GSUdfTElOS1M9JGNvbmZpZ19saW5rcworICB0ZXN0ICIke0NPTkZJR19DT01NQU5EUytzZXR9IiA9IHNldCB8fCBDT05GSUdfQ09NTUFORFM9JGNvbmZpZ19jb21tYW5kcworZmkKKworIyBIYXZlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBmb3IgY29udmVuaWVuY2UuICBNYWtlIGl0IGluIHRoZSBidWlsZCB0cmVlCisjIHNpbXBseSBiZWNhdXNlIHRoZXJlIGlzIG5vIHJlYXNvbiBhZ2FpbnN0IGhhdmluZyBpdCBoZXJlLCBhbmQgaW4gYWRkaXRpb24sCisjIGNyZWF0aW5nIGFuZCBtb3ZpbmcgZmlsZXMgZnJvbSAvdG1wIGNhbiBzb21ldGltZXMgY2F1c2UgcHJvYmxlbXMuCisjIEhvb2sgZm9yIGl0cyByZW1vdmFsIHVubGVzcyBkZWJ1Z2dpbmcuCisjIE5vdGUgdGhhdCB0aGVyZSBpcyBhIHNtYWxsIHdpbmRvdyBpbiB3aGljaCB0aGUgZGlyZWN0b3J5IHdpbGwgbm90IGJlIGNsZWFuZWQ6CisjIGFmdGVyIGl0cyBjcmVhdGlvbiBidXQgYmVmb3JlIGl0cyBuYW1lIGhhcyBiZWVuIGFzc2lnbmVkIHRvIGAkdG1wJy4KKyRkZWJ1ZyB8fAoreworICB0bXA9CisgIHRyYXAgJ2V4aXRfc3RhdHVzPSQ/CisgIHsgdGVzdCAteiAiJHRtcCIgfHwgdGVzdCAhIC1kICIkdG1wIiB8fCBybSAtZnIgIiR0bXAiOyB9ICYmIGV4aXQgJGV4aXRfc3RhdHVzCisnIDAKKyAgdHJhcCAnYXNfZm5fZXhpdCAxJyAxIDIgMTMgMTUKK30KKyMgQ3JlYXRlIGEgKHNlY3VyZSkgdG1wIGRpcmVjdG9yeSBmb3IgdG1wIGZpbGVzLgorCit7CisgIHRtcD1gKHVtYXNrIDA3NyAmJiBta3RlbXAgLWQgIi4vY29uZlhYWFhYWCIpIDI+L2Rldi9udWxsYCAmJgorICB0ZXN0IC1uICIkdG1wIiAmJiB0ZXN0IC1kICIkdG1wIgorfSAgfHwKK3sKKyAgdG1wPS4vY29uZiQkLSRSQU5ET00KKyAgKHVtYXNrIDA3NyAmJiBta2RpciAiJHRtcCIpCit9IHx8IGFzX2ZuX2Vycm9yICJjYW5ub3QgY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiAuIiAiJExJTkVOTyIgNQorCisjIFNldCB1cCB0aGUgc2NyaXB0cyBmb3IgQ09ORklHX0ZJTEVTIHNlY3Rpb24uCisjIE5vIG5lZWQgdG8gZ2VuZXJhdGUgdGhlbSBpZiB0aGVyZSBhcmUgbm8gQ09ORklHX0ZJTEVTLgorIyBUaGlzIGhhcHBlbnMgZm9yIGluc3RhbmNlIHdpdGggYC4vY29uZmlnLnN0YXR1cyBjb25maWcuaCcuCitpZiB0ZXN0IC1uICIkQ09ORklHX0ZJTEVTIjsgdGhlbgorCisKK2FjX2NyPWBlY2hvIFggfCB0ciBYICdcMDE1J2AKKyMgT24gY3lnd2luLCBiYXNoIGNhbiBlYXQgXHIgaW5zaWRlIGBgIGlmIHRoZSB1c2VyIHJlcXVlc3RlZCBpZ25jci4KKyMgQnV0IHdlIGtub3cgb2Ygbm8gb3RoZXIgc2hlbGwgd2hlcmUgYWNfY3Igd291bGQgYmUgZW1wdHkgYXQgdGhpcworIyBwb2ludCwgc28gd2UgY2FuIHVzZSBhIGJhc2hpc20gYXMgYSBmYWxsYmFjay4KK2lmIHRlc3QgIngkYWNfY3IiID0geDsgdGhlbgorICBldmFsIGFjX2NyPVwkXCdcXHJcJworZmkKK2FjX2NzX2F3a19jcj1gJEFXSyAnQkVHSU4geyBwcmludCAiYVxyYiIgfScgPC9kZXYvbnVsbCAyPi9kZXYvbnVsbGAKK2lmIHRlc3QgIiRhY19jc19hd2tfY3IiID0gImEke2FjX2NyfWIiOyB0aGVuCisgIGFjX2NzX2F3a19jcj0nXHInCitlbHNlCisgIGFjX2NzX2F3a19jcj0kYWNfY3IKK2ZpCisKK2VjaG8gJ0JFR0lOIHsnID4iJHRtcC9zdWJzMS5hd2siICYmCitfQUNFT0YKKworCit7CisgIGVjaG8gImNhdCA+Y29uZiQkc3Vicy5hd2sgPDxfQUNFT0YiICYmCisgIGVjaG8gIiRhY19zdWJzdF92YXJzIiB8IHNlZCAncy8uKi8mISQmJGFjX2RlbGltLycgJiYKKyAgZWNobyAiX0FDRU9GIgorfSA+Y29uZiQkc3Vicy5zaCB8fAorICBhc19mbl9lcnJvciAiY291bGQgbm90IG1ha2UgJENPTkZJR19TVEFUVVMiICIkTElORU5PIiA1CithY19kZWxpbV9udW09YGVjaG8gIiRhY19zdWJzdF92YXJzIiB8IGdyZXAgLWMgJyQnYAorYWNfZGVsaW09JyUhXyEjICcKK2ZvciBhY19sYXN0X3RyeSBpbiBmYWxzZSBmYWxzZSBmYWxzZSBmYWxzZSBmYWxzZSA6OyBkbworICAuIC4vY29uZiQkc3Vicy5zaCB8fAorICAgIGFzX2ZuX2Vycm9yICJjb3VsZCBub3QgbWFrZSAkQ09ORklHX1NUQVRVUyIgIiRMSU5FTk8iIDUKKworICBhY19kZWxpbV9uPWBzZWQgLW4gInMvLiokYWNfZGVsaW1cJC9YL3AiIGNvbmYkJHN1YnMuYXdrIHwgZ3JlcCAtYyBYYAorICBpZiB0ZXN0ICRhY19kZWxpbV9uID0gJGFjX2RlbGltX251bTsgdGhlbgorICAgIGJyZWFrCisgIGVsaWYgJGFjX2xhc3RfdHJ5OyB0aGVuCisgICAgYXNfZm5fZXJyb3IgImNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiAiJExJTkVOTyIgNQorICBlbHNlCisgICAgYWNfZGVsaW09IiRhY19kZWxpbSEkYWNfZGVsaW0gXyRhY19kZWxpbSEhICIKKyAgZmkKK2RvbmUKK3JtIC1mIGNvbmYkJHN1YnMuc2gKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCitjYXQgPj4iXCR0bXAvc3ViczEuYXdrIiA8PFxcX0FDQVdLICYmCitfQUNFT0YKK3NlZCAtbiAnCitoCitzL14vU1siLzsgcy8hLiovIl09LworcAorZworcy9eW14hXSohLy8KKzpyZXBsCit0IHJlcGwKK3MvJyIkYWNfZGVsaW0iJyQvLwordCBkZWxpbQorOm5sCitoCitzL1woLlx7MTQ4XH1cKS4qL1wxLwordCBtb3JlMQorcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvXFxuIlxcLworcAorbgorYiByZXBsCis6bW9yZTEKK3MvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kLyJcXC8KK3AKK2cKK3MvLlx7MTQ4XH0vLwordCBubAorOmRlbGltCitoCitzL1woLlx7MTQ4XH1cKS4qL1wxLwordCBtb3JlMgorcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvIi8KK3AKK2IKKzptb3JlMgorcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvIlxcLworcAorZworcy8uXHsxNDhcfS8vCit0IGRlbGltCisnIDxjb25mJCRzdWJzLmF3ayB8IHNlZCAnCisvXlteIiJdL3sKKyAgTgorICBzL1xuLy8KK30KKycgPj4kQ09ORklHX1NUQVRVUyB8fCBhY193cml0ZV9mYWlsPTEKK3JtIC1mIGNvbmYkJHN1YnMuYXdrCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK19BQ0FXSworY2F0ID4+IlwkdG1wL3N1YnMxLmF3ayIgPDxfQUNBV0sgJiYKKyAgZm9yIChrZXkgaW4gUykgU19pc19zZXRba2V5XSA9IDEKKyAgRlMgPSAiByIKKworfQoreworICBsaW5lID0gJCAwCisgIG5maWVsZHMgPSBzcGxpdChsaW5lLCBmaWVsZCwgIkAiKQorICBzdWJzdGVkID0gMAorICBsZW4gPSBsZW5ndGgoZmllbGRbMV0pCisgIGZvciAoaSA9IDI7IGkgPCBuZmllbGRzOyBpKyspIHsKKyAgICBrZXkgPSBmaWVsZFtpXQorICAgIGtleWxlbiA9IGxlbmd0aChrZXkpCisgICAgaWYgKFNfaXNfc2V0W2tleV0pIHsKKyAgICAgIHZhbHVlID0gU1trZXldCisgICAgICBsaW5lID0gc3Vic3RyKGxpbmUsIDEsIGxlbikgIiIgdmFsdWUgIiIgc3Vic3RyKGxpbmUsIGxlbiArIGtleWxlbiArIDMpCisgICAgICBsZW4gKz0gbGVuZ3RoKHZhbHVlKSArIGxlbmd0aChmaWVsZFsrK2ldKQorICAgICAgc3Vic3RlZCA9IDEKKyAgICB9IGVsc2UKKyAgICAgIGxlbiArPSAxICsga2V5bGVuCisgIH0KKworICBwcmludCBsaW5lCit9CisKK19BQ0FXSworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCitpZiBzZWQgInMvJGFjX2NyLy8iIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgc2VkICJzLyRhY19jclwkLy87IHMvJGFjX2NyLyRhY19jc19hd2tfY3IvZyIKK2Vsc2UKKyAgY2F0CitmaSA8ICIkdG1wL3N1YnMxLmF3ayIgPiAiJHRtcC9zdWJzLmF3ayIgXAorICB8fCBhc19mbl9lcnJvciAiY291bGQgbm90IHNldHVwIGNvbmZpZyBmaWxlcyBtYWNoaW5lcnkiICIkTElORU5PIiA1CitfQUNFT0YKKworIyBWUEFUSCBtYXkgY2F1c2UgdHJvdWJsZSB3aXRoIHNvbWUgbWFrZXMsIHNvIHdlIHJlbW92ZSAkKHNyY2RpciksCisjICR7c3JjZGlyfSBhbmQgQHNyY2RpckAgZnJvbSBWUEFUSCBpZiBzcmNkaXIgaXMgIi4iLCBzdHJpcCBsZWFkaW5nIGFuZAorIyB0cmFpbGluZyBjb2xvbnMgYW5kIHRoZW4gcmVtb3ZlIHRoZSB3aG9sZSBsaW5lIGlmIFZQQVRIIGJlY29tZXMgZW1wdHkKKyMgKGFjdHVhbGx5IHdlIGxlYXZlIGFuIGVtcHR5IGxpbmUgdG8gcHJlc2VydmUgbGluZSBudW1iZXJzKS4KK2lmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCisgIGFjX3Zwc3ViPScvXlsJIF0qVlBBVEhbCSBdKj0veworcy86KlwkKHNyY2Rpcik6Ki86Lworcy86Klwke3NyY2Rpcn06Ki86Lworcy86KkBzcmNkaXJAOiovOi8KK3MvXlwoW149XSo9WwkgXSpcKToqL1wxLworcy86KiQvLworcy9eW149XSo9WwkgXSokLy8KK30nCitmaQorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCitmaSAjIHRlc3QgLW4gIiRDT05GSUdfRklMRVMiCisKKyMgU2V0IHVwIHRoZSBzY3JpcHRzIGZvciBDT05GSUdfSEVBREVSUyBzZWN0aW9uLgorIyBObyBuZWVkIHRvIGdlbmVyYXRlIHRoZW0gaWYgdGhlcmUgYXJlIG5vIENPTkZJR19IRUFERVJTLgorIyBUaGlzIGhhcHBlbnMgZm9yIGluc3RhbmNlIHdpdGggYC4vY29uZmlnLnN0YXR1cyBNYWtlZmlsZScuCitpZiB0ZXN0IC1uICIkQ09ORklHX0hFQURFUlMiOyB0aGVuCitjYXQgPiIkdG1wL2RlZmluZXMuYXdrIiA8PFxfQUNBV0sgfHwKK0JFR0lOIHsKK19BQ0VPRgorCisjIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYW4gYXdrIHNjcmlwdCBgZGVmaW5lcy5hd2snLCBlbWJlZGRlZCBhcworIyBoZXJlLWRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMsIHRoYXQgc3Vic3RpdHV0ZXMgdGhlIHByb3BlciB2YWx1ZXMgaW50bworIyBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLgorCisjIENyZWF0ZSBhIGRlbGltaXRlciBzdHJpbmcgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiBjb25mZGVmcy5oLCB0byBlYXNlCisjIGhhbmRsaW5nIG9mIGxvbmcgbGluZXMuCithY19kZWxpbT0nJSFfISMgJworZm9yIGFjX2xhc3RfdHJ5IGluIGZhbHNlIGZhbHNlIDo7IGRvCisgIGFjX3Q9YHNlZCAtbiAiLyRhY19kZWxpbS9wIiBjb25mZGVmcy5oYAorICBpZiB0ZXN0IC16ICIkYWNfdCI7IHRoZW4KKyAgICBicmVhaworICBlbGlmICRhY19sYXN0X3RyeTsgdGhlbgorICAgIGFzX2ZuX2Vycm9yICJjb3VsZCBub3QgbWFrZSAkQ09ORklHX0hFQURFUlMiICIkTElORU5PIiA1CisgIGVsc2UKKyAgICBhY19kZWxpbT0iJGFjX2RlbGltISRhY19kZWxpbSBfJGFjX2RlbGltISEgIgorICBmaQorZG9uZQorCisjIEZvciB0aGUgYXdrIHNjcmlwdCwgRCBpcyBhbiBhcnJheSBvZiBtYWNybyB2YWx1ZXMga2V5ZWQgYnkgbmFtZSwKKyMgbGlrZXdpc2UgUCBjb250YWlucyBtYWNybyBwYXJhbWV0ZXJzIGlmIGFueS4gIFByZXNlcnZlIGJhY2tzbGFzaAorIyBuZXdsaW5lIHNlcXVlbmNlcy4KKworYWNfd29yZF9yZT1bXyRhc19jcl9MZXR0ZXJzXVtfJGFzX2NyX2FsbnVtXSoKK3NlZCAtbiAnCitzLy5cezE0OFx9LyYnIiRhY19kZWxpbSInL2cKK3QgcnNldAorOnJzZXQKK3MvXlsJIF0qI1sJIF0qZGVmaW5lWwkgXVsJIF0qLyAvCit0IGRlZgorZAorOmRlZgorcy9cXCQvLwordCBic25sCitzL1siXFxdL1xcJi9nCitzL14gXCgnIiRhY193b3JkX3JlIidcKVwoKFteKCldKilcKVsJIF0qXCguKlwpL1BbIlwxIl09IlwyIlwKK0RbIlwxIl09IiBcMyIvcAorcy9eIFwoJyIkYWNfd29yZF9yZSInXClbCSBdKlwoLipcKS9EWyJcMSJdPSIgXDIiL3AKK2QKKzpic25sCitzL1siXFxdL1xcJi9nCitzL14gXCgnIiRhY193b3JkX3JlIidcKVwoKFteKCldKilcKVsJIF0qXCguKlwpL1BbIlwxIl09IlwyIlwKK0RbIlwxIl09IiBcM1xcXFxcXG4iXFwvcAordCBjb250CitzL14gXCgnIiRhY193b3JkX3JlIidcKVsJIF0qXCguKlwpL0RbIlwxIl09IiBcMlxcXFxcXG4iXFwvcAordCBjb250CitkCis6Y29udAorbgorcy8uXHsxNDhcfS8mJyIkYWNfZGVsaW0iJy9nCit0IGNsZWFyCis6Y2xlYXIKK3MvXFwkLy8KK3QgYnNubGMKK3MvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kLyIvcAorZAorOmJzbmxjCitzL1siXFxdL1xcJi9nOyBzL14vIi87IHMvJC9cXFxcXFxuIlxcL3AKK2IgY29udAorJyA8Y29uZmRlZnMuaCB8IHNlZCAnCitzLyciJGFjX2RlbGltIicvIlxcXAorIi9nJyA+PiRDT05GSUdfU1RBVFVTIHx8IGFjX3dyaXRlX2ZhaWw9MQorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKyAgZm9yIChrZXkgaW4gRCkgRF9pc19zZXRba2V5XSA9IDEKKyAgRlMgPSAiByIKK30KKy9eW1x0IF0qI1tcdCBdKihkZWZpbmV8dW5kZWYpW1x0IF0rJGFjX3dvcmRfcmUoW1x0IChdfFwkKS8geworICBsaW5lID0gXCQgMAorICBzcGxpdChsaW5lLCBhcmcsICIgIikKKyAgaWYgKGFyZ1sxXSA9PSAiIyIpIHsKKyAgICBkZWZ1bmRlZiA9IGFyZ1syXQorICAgIG1hYzEgPSBhcmdbM10KKyAgfSBlbHNlIHsKKyAgICBkZWZ1bmRlZiA9IHN1YnN0cihhcmdbMV0sIDIpCisgICAgbWFjMSA9IGFyZ1syXQorICB9CisgIHNwbGl0KG1hYzEsIG1hYzIsICIoIikgIykKKyAgbWFjcm8gPSBtYWMyWzFdCisgIHByZWZpeCA9IHN1YnN0cihsaW5lLCAxLCBpbmRleChsaW5lLCBkZWZ1bmRlZikgLSAxKQorICBpZiAoRF9pc19zZXRbbWFjcm9dKSB7CisgICAgIyBQcmVzZXJ2ZSB0aGUgd2hpdGUgc3BhY2Ugc3Vycm91bmRpbmcgdGhlICIjIi4KKyAgICBwcmludCBwcmVmaXggImRlZmluZSIsIG1hY3JvIFBbbWFjcm9dIERbbWFjcm9dCisgICAgbmV4dAorICB9IGVsc2UgeworICAgICMgUmVwbGFjZSAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IgZXhhbXBsZSwKKyAgICAjIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCisgICAgIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCisgICAgaWYgKGRlZnVuZGVmID09ICJ1bmRlZiIpIHsKKyAgICAgIHByaW50ICIvKiIsIHByZWZpeCBkZWZ1bmRlZiwgbWFjcm8sICIqLyIKKyAgICAgIG5leHQKKyAgICB9CisgIH0KK30KK3sgcHJpbnQgfQorX0FDQVdLCitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKyAgYXNfZm5fZXJyb3IgImNvdWxkIG5vdCBzZXR1cCBjb25maWcgaGVhZGVycyBtYWNoaW5lcnkiICIkTElORU5PIiA1CitmaSAjIHRlc3QgLW4gIiRDT05GSUdfSEVBREVSUyIKKworCitldmFsIHNldCBYICIgIDpGICRDT05GSUdfRklMRVMgIDpIICRDT05GSUdfSEVBREVSUyAgOkwgJENPTkZJR19MSU5LUyAgOkMgJENPTkZJR19DT01NQU5EUyIKK3NoaWZ0Citmb3IgYWNfdGFnCitkbworICBjYXNlICRhY190YWcgaW4KKyAgOltGSExDXSkgYWNfbW9kZT0kYWNfdGFnOyBjb250aW51ZTs7CisgIGVzYWMKKyAgY2FzZSAkYWNfbW9kZSRhY190YWcgaW4KKyAgOltGSExdKjoqKTs7CisgIDpMKiB8IDpDKjoqKSBhc19mbl9lcnJvciAiaW52YWxpZCB0YWcgXGAkYWNfdGFnJyIgIiRMSU5FTk8iIDU7OworICA6W0ZIXS0pIGFjX3RhZz0tOi07OworICA6W0ZIXSopIGFjX3RhZz0kYWNfdGFnOiRhY190YWcuaW47OworICBlc2FjCisgIGFjX3NhdmVfSUZTPSRJRlMKKyAgSUZTPToKKyAgc2V0IHggJGFjX3RhZworICBJRlM9JGFjX3NhdmVfSUZTCisgIHNoaWZ0CisgIGFjX2ZpbGU9JDEKKyAgc2hpZnQKKworICBjYXNlICRhY19tb2RlIGluCisgIDpMKSBhY19zb3VyY2U9JDE7OworICA6W0ZIXSkKKyAgICBhY19maWxlX2lucHV0cz0KKyAgICBmb3IgYWNfZgorICAgIGRvCisgICAgICBjYXNlICRhY19mIGluCisgICAgICAtKSBhY19mPSIkdG1wL3N0ZGluIjs7CisgICAgICAqKSAjIExvb2sgZm9yIHRoZSBmaWxlIGZpcnN0IGluIHRoZSBidWlsZCB0cmVlLCB0aGVuIGluIHRoZSBzb3VyY2UgdHJlZQorCSAjIChpZiB0aGUgcGF0aCBpcyBub3QgYWJzb2x1dGUpLiAgVGhlIGFic29sdXRlIHBhdGggY2Fubm90IGJlIERPUy1zdHlsZSwKKwkgIyBiZWNhdXNlICRhY19mIGNhbm5vdCBjb250YWluIGA6Jy4KKwkgdGVzdCAtZiAiJGFjX2YiIHx8CisJICAgY2FzZSAkYWNfZiBpbgorCSAgIFtcXC8kXSopIGZhbHNlOzsKKwkgICAqKSB0ZXN0IC1mICIkc3JjZGlyLyRhY19mIiAmJiBhY19mPSIkc3JjZGlyLyRhY19mIjs7CisJICAgZXNhYyB8fAorCSAgIGFzX2ZuX2Vycm9yICJjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiBcYCRhY19mJyIgIiRMSU5FTk8iIDU7OworICAgICAgZXNhYworICAgICAgY2FzZSAkYWNfZiBpbiAqXCcqKSBhY19mPWAkYXNfZWNobyAiJGFjX2YiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsgZXNhYworICAgICAgYXNfZm5fYXBwZW5kIGFjX2ZpbGVfaW5wdXRzICIgJyRhY19mJyIKKyAgICBkb25lCisKKyAgICAjIExldCdzIHN0aWxsIHByZXRlbmQgaXQgaXMgYGNvbmZpZ3VyZScgd2hpY2ggaW5zdGFudGlhdGVzIChpLmUuLCBkb24ndAorICAgICMgdXNlICRhc19tZSksIHBlb3BsZSB3b3VsZCBiZSBzdXJwcmlzZWQgdG8gcmVhZDoKKyAgICAjICAgIC8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGJ5IGNvbmZpZy5zdGF0dXMuICAqLworICAgIGNvbmZpZ3VyZV9pbnB1dD0nR2VuZXJhdGVkIGZyb20gJ2AKKwkgICRhc19lY2hvICIkKiIgfCBzZWQgJ3N8XlteOl0qL3x8O3N8OlteOl0qL3wsIHxnJworCWAnIGJ5IGNvbmZpZ3VyZS4nCisgICAgaWYgdGVzdCB4IiRhY19maWxlIiAhPSB4LTsgdGhlbgorICAgICAgY29uZmlndXJlX2lucHV0PSIkYWNfZmlsZS4gICRjb25maWd1cmVfaW5wdXQiCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNyZWF0aW5nICRhY19maWxlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGNyZWF0aW5nICRhY19maWxlIiA+JjY7fQorICAgIGZpCisgICAgIyBOZXV0cmFsaXplIHNwZWNpYWwgY2hhcmFjdGVycyBpbnRlcnByZXRlZCBieSBzZWQgaW4gcmVwbGFjZW1lbnQgc3RyaW5ncy4KKyAgICBjYXNlICRjb25maWd1cmVfaW5wdXQgaW4gIygKKyAgICAqXCYqIHwgKlx8KiB8ICpcXCogKQorICAgICAgIGFjX3NlZF9jb25mX2lucHV0PWAkYXNfZWNobyAiJGNvbmZpZ3VyZV9pbnB1dCIgfAorICAgICAgIHNlZCAncy9bXFxcXCZ8XS9cXFxcJi9nJ2A7OyAjKAorICAgICopIGFjX3NlZF9jb25mX2lucHV0PSRjb25maWd1cmVfaW5wdXQ7OworICAgIGVzYWMKKworICAgIGNhc2UgJGFjX3RhZyBpbgorICAgICo6LToqIHwgKjotKSBjYXQgPiIkdG1wL3N0ZGluIiBcCisgICAgICB8fCBhc19mbl9lcnJvciAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUgOzsKKyAgICBlc2FjCisgICAgOzsKKyAgZXNhYworCisgIGFjX2Rpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhY19maWxlIiB8fAorJGFzX2V4cHIgWCIkYWNfZmlsZSIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkYWNfZmlsZSIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CiskYXNfZWNobyBYIiRhY19maWxlIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpW14vXS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXCkuKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICBzLy4qLy4vOyBxJ2AKKyAgYXNfZGlyPSIkYWNfZGlyIjsgYXNfZm5fbWtkaXJfcAorICBhY19idWlsZGRpcj0uCisKK2Nhc2UgIiRhY19kaXIiIGluCisuKSBhY19kaXJfc3VmZml4PSBhY190b3BfYnVpbGRkaXJfc3ViPS4gYWNfdG9wX2J1aWxkX3ByZWZpeD0gOzsKKyopCisgIGFjX2Rpcl9zdWZmaXg9L2AkYXNfZWNobyAiJGFjX2RpciIgfCBzZWQgJ3N8XlwuW1xcL118fCdgCisgICMgQSAiLi4iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgYWNfdG9wX2J1aWxkZGlyX3N1Yj1gJGFzX2VjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAnc3wvW15cXC9dKnwvLi58ZztzfC98fCdgCisgIGNhc2UgJGFjX3RvcF9idWlsZGRpcl9zdWIgaW4KKyAgIiIpIGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OworICAqKSAgYWNfdG9wX2J1aWxkX3ByZWZpeD0kYWNfdG9wX2J1aWxkZGlyX3N1Yi8gOzsKKyAgZXNhYyA7OworZXNhYworYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfcHdkCithY19hYnNfYnVpbGRkaXI9JGFjX3B3ZCRhY19kaXJfc3VmZml4CisjIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OgorYWNfdG9wX2J1aWxkZGlyPSRhY190b3BfYnVpbGRfcHJlZml4CisKK2Nhc2UgJHNyY2RpciBpbgorICAuKSAgIyBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCisgICAgYWNfc3JjZGlyPS4KKyAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRkaXJfc3ViCisgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZCA7OworICBbXFwvXSogfCA/OltcXC9dKiApICAjIEFic29sdXRlIG5hbWUuCisgICAgYWNfc3JjZGlyPSRzcmNkaXIkYWNfZGlyX3N1ZmZpeDsKKyAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIKKyAgICBhY19hYnNfdG9wX3NyY2Rpcj0kc3JjZGlyIDs7CisgICopICMgUmVsYXRpdmUgbmFtZS4KKyAgICBhY19zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKKyAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRfcHJlZml4JHNyY2RpcgorICAgIGFjX2Fic190b3Bfc3JjZGlyPSRhY19wd2QvJHNyY2RpciA7OworZXNhYworYWNfYWJzX3NyY2Rpcj0kYWNfYWJzX3RvcF9zcmNkaXIkYWNfZGlyX3N1ZmZpeAorCisKKyAgY2FzZSAkYWNfbW9kZSBpbgorICA6RikKKyAgIworICAjIENPTkZJR19GSUxFCisgICMKKworICBjYXNlICRJTlNUQUxMIGluCisgIFtcXC8kXSogfCA/OltcXC9dKiApIGFjX0lOU1RBTEw9JElOU1RBTEwgOzsKKyAgKikgYWNfSU5TVEFMTD0kYWNfdG9wX2J1aWxkX3ByZWZpeCRJTlNUQUxMIDs7CisgIGVzYWMKKyAgYWNfTUtESVJfUD0kTUtESVJfUAorICBjYXNlICRNS0RJUl9QIGluCisgIFtcXC8kXSogfCA/OltcXC9dKiApIDs7CisgICovKikgYWNfTUtESVJfUD0kYWNfdG9wX2J1aWxkX3ByZWZpeCRNS0RJUl9QIDs7CisgIGVzYWMKK19BQ0VPRgorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisjIElmIHRoZSB0ZW1wbGF0ZSBkb2VzIG5vdCBrbm93IGFib3V0IGRhdGFyb290ZGlyLCBleHBhbmQgaXQuCisjIEZJWE1FOiBUaGlzIGhhY2sgc2hvdWxkIGJlIHJlbW92ZWQgYSBmZXcgeWVhcnMgYWZ0ZXIgMi42MC4KK2FjX2RhdGFyb290ZGlyX2hhY2s9OyBhY19kYXRhcm9vdGRpcl9zZWVuPQorYWNfc2VkX2RhdGFyb290PScKKy9kYXRhcm9vdGRpci8geworICBwCisgIHEKK30KKy9AZGF0YWRpckAvcAorL0Bkb2NkaXJAL3AKKy9AaW5mb2RpckAvcAorL0Bsb2NhbGVkaXJAL3AKKy9AbWFuZGlyQC9wJworY2FzZSBgZXZhbCAic2VkIC1uIFwiXCRhY19zZWRfZGF0YXJvb3RcIiAkYWNfZmlsZV9pbnB1dHMiYCBpbgorKmRhdGFyb290ZGlyKikgYWNfZGF0YXJvb3RkaXJfc2Vlbj15ZXM7OworKkBkYXRhZGlyQCp8KkBkb2NkaXJAKnwqQGluZm9kaXJAKnwqQGxvY2FsZWRpckAqfCpAbWFuZGlyQCopCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJGFjX2ZpbGVfaW5wdXRzIHNlZW1zIHRvIGlnbm9yZSB0aGUgLS1kYXRhcm9vdGRpciBzZXR0aW5nIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19maWxlX2lucHV0cyBzZWVtcyB0byBpZ25vcmUgdGhlIC0tZGF0YXJvb3RkaXIgc2V0dGluZyIgPiYyO30KK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisgIGFjX2RhdGFyb290ZGlyX2hhY2s9JworICBzJkBkYXRhZGlyQCYkZGF0YWRpciZnCisgIHMmQGRvY2RpckAmJGRvY2RpciZnCisgIHMmQGluZm9kaXJAJiRpbmZvZGlyJmcKKyAgcyZAbG9jYWxlZGlyQCYkbG9jYWxlZGlyJmcKKyAgcyZAbWFuZGlyQCYkbWFuZGlyJmcKKyAgcyZcXFwke2RhdGFyb290ZGlyfSYkZGF0YXJvb3RkaXImZycgOzsKK2VzYWMKK19BQ0VPRgorCisjIE5ldXRyYWxpemUgVlBBVEggd2hlbiBgJHNyY2RpcicgPSBgLicuCisjIFNoZWxsIGNvZGUgaW4gY29uZmlndXJlLmFjIG1pZ2h0IHNldCBleHRyYXN1Yi4KKyMgRklYTUU6IGRvIHdlIHJlYWxseSB3YW50IHRvIG1haW50YWluIHRoaXMgZmVhdHVyZT8KK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorYWNfc2VkX2V4dHJhPSIkYWNfdnBzdWIKKyRleHRyYXN1YgorX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCis6dAorL0BbYS16QS1aX11bYS16QS1aXzAtOV0qQC8hYgorc3xAY29uZmlndXJlX2lucHV0QHwkYWNfc2VkX2NvbmZfaW5wdXR8O3QgdAorcyZAdG9wX2J1aWxkZGlyQCYkYWNfdG9wX2J1aWxkZGlyX3N1YiY7dCB0CitzJkB0b3BfYnVpbGRfcHJlZml4QCYkYWNfdG9wX2J1aWxkX3ByZWZpeCY7dCB0CitzJkBzcmNkaXJAJiRhY19zcmNkaXImO3QgdAorcyZAYWJzX3NyY2RpckAmJGFjX2Fic19zcmNkaXImO3QgdAorcyZAdG9wX3NyY2RpckAmJGFjX3RvcF9zcmNkaXImO3QgdAorcyZAYWJzX3RvcF9zcmNkaXJAJiRhY19hYnNfdG9wX3NyY2RpciY7dCB0CitzJkBidWlsZGRpckAmJGFjX2J1aWxkZGlyJjt0IHQKK3MmQGFic19idWlsZGRpckAmJGFjX2Fic19idWlsZGRpciY7dCB0CitzJkBhYnNfdG9wX2J1aWxkZGlyQCYkYWNfYWJzX3RvcF9idWlsZGRpciY7dCB0CitzJkBJTlNUQUxMQCYkYWNfSU5TVEFMTCY7dCB0CitzJkBNS0RJUl9QQCYkYWNfTUtESVJfUCY7dCB0CiskYWNfZGF0YXJvb3RkaXJfaGFjaworIgorZXZhbCBzZWQgXCJcJGFjX3NlZF9leHRyYVwiICIkYWNfZmlsZV9pbnB1dHMiIHwgJEFXSyAtZiAiJHRtcC9zdWJzLmF3ayIgPiR0bXAvb3V0IFwKKyAgfHwgYXNfZm5fZXJyb3IgImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1CisKK3Rlc3QgLXogIiRhY19kYXRhcm9vdGRpcl9oYWNrJGFjX2RhdGFyb290ZGlyX3NlZW4iICYmCisgIHsgYWNfb3V0PWBzZWQgLW4gJy9cJHtkYXRhcm9vdGRpcn0vcCcgIiR0bXAvb3V0ImA7IHRlc3QgLW4gIiRhY19vdXQiOyB9ICYmCisgIHsgYWNfb3V0PWBzZWQgLW4gJy9eWwkgXSpkYXRhcm9vdGRpclsJIF0qOio9L3AnICIkdG1wL291dCJgOyB0ZXN0IC16ICIkYWNfb3V0IjsgfSAmJgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICRhY19maWxlIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB2YXJpYWJsZSBcYGRhdGFyb290ZGlyJword2hpY2ggc2VlbXMgdG8gYmUgdW5kZWZpbmVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBkZWZpbmVkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfZmlsZSBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgdmFyaWFibGUgXGBkYXRhcm9vdGRpcicKK3doaWNoIHNlZW1zIHRvIGJlIHVuZGVmaW5lZC4gIFBsZWFzZSBtYWtlIHN1cmUgaXQgaXMgZGVmaW5lZC4iID4mMjt9CisKKyAgcm0gLWYgIiR0bXAvc3RkaW4iCisgIGNhc2UgJGFjX2ZpbGUgaW4KKyAgLSkgY2F0ICIkdG1wL291dCIgJiYgcm0gLWYgIiR0bXAvb3V0Ijs7CisgICopIHJtIC1mICIkYWNfZmlsZSIgJiYgbXYgIiR0bXAvb3V0IiAiJGFjX2ZpbGUiOzsKKyAgZXNhYyBcCisgIHx8IGFzX2ZuX2Vycm9yICJjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiAiJExJTkVOTyIgNQorIDs7CisgIDpIKQorICAjCisgICMgQ09ORklHX0hFQURFUgorICAjCisgIGlmIHRlc3QgeCIkYWNfZmlsZSIgIT0geC07IHRoZW4KKyAgICB7CisgICAgICAkYXNfZWNobyAiLyogJGNvbmZpZ3VyZV9pbnB1dCAgKi8iIFwKKyAgICAgICYmIGV2YWwgJyRBV0sgLWYgIiR0bXAvZGVmaW5lcy5hd2siJyAiJGFjX2ZpbGVfaW5wdXRzIgorICAgIH0gPiIkdG1wL2NvbmZpZy5oIiBcCisgICAgICB8fCBhc19mbl9lcnJvciAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUKKyAgICBpZiBkaWZmICIkYWNfZmlsZSIgIiR0bXAvY29uZmlnLmgiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfZmlsZSBpcyB1bmNoYW5nZWQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIiA+JjY7fQorICAgIGVsc2UKKyAgICAgIHJtIC1mICIkYWNfZmlsZSIKKyAgICAgIG12ICIkdG1wL2NvbmZpZy5oIiAiJGFjX2ZpbGUiIFwKKwl8fCBhc19mbl9lcnJvciAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUKKyAgICBmaQorICBlbHNlCisgICAgJGFzX2VjaG8gIi8qICRjb25maWd1cmVfaW5wdXQgICovIiBcCisgICAgICAmJiBldmFsICckQVdLIC1mICIkdG1wL2RlZmluZXMuYXdrIicgIiRhY19maWxlX2lucHV0cyIgXAorICAgICAgfHwgYXNfZm5fZXJyb3IgImNvdWxkIG5vdCBjcmVhdGUgLSIgIiRMSU5FTk8iIDUKKyAgZmkKKyMgQ29tcHV0ZSAiJGFjX2ZpbGUiJ3MgaW5kZXggaW4gJGNvbmZpZ19oZWFkZXJzLgorX2FtX2FyZz0iJGFjX2ZpbGUiCitfYW1fc3RhbXBfY291bnQ9MQorZm9yIF9hbV9oZWFkZXIgaW4gJGNvbmZpZ19oZWFkZXJzIDo7IGRvCisgIGNhc2UgJF9hbV9oZWFkZXIgaW4KKyAgICAkX2FtX2FyZyB8ICRfYW1fYXJnOiogKQorICAgICAgYnJlYWsgOzsKKyAgICAqICkKKyAgICAgIF9hbV9zdGFtcF9jb3VudD1gZXhwciAkX2FtX3N0YW1wX2NvdW50ICsgMWAgOzsKKyAgZXNhYworZG9uZQorZWNobyAidGltZXN0YW1wIGZvciAkX2FtX2FyZyIgPmAkYXNfZGlybmFtZSAtLSAiJF9hbV9hcmciIHx8CiskYXNfZXhwciBYIiRfYW1fYXJnIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiRfYW1fYXJnIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiRfYW1fYXJnIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRfYW1fYXJnIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyRhc19lY2hvIFgiJF9hbV9hcmciIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXClbXi9dLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYC9zdGFtcC1oJF9hbV9zdGFtcF9jb3VudAorIDs7CisgIDpMKQorICAjCisgICMgQ09ORklHX0xJTksKKyAgIworCisgIGlmIHRlc3QgIiRhY19zb3VyY2UiID0gIiRhY19maWxlIiAmJiB0ZXN0ICIkc3JjZGlyIiA9ICcuJzsgdGhlbgorICAgIDoKKyAgZWxzZQorICAgICMgUHJlZmVyIHRoZSBmaWxlIGZyb20gdGhlIHNvdXJjZSB0cmVlIGlmIG5hbWVzIGFyZSBpZGVudGljYWwuCisgICAgaWYgdGVzdCAiJGFjX3NvdXJjZSIgPSAiJGFjX2ZpbGUiIHx8IHRlc3QgISAtciAiJGFjX3NvdXJjZSI7IHRoZW4KKyAgICAgIGFjX3NvdXJjZT0kc3JjZGlyLyRhY19zb3VyY2UKKyAgICBmaQorCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBsaW5raW5nICRhY19zb3VyY2UgdG8gJGFjX2ZpbGUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogbGlua2luZyAkYWNfc291cmNlIHRvICRhY19maWxlIiA+JjY7fQorCisgICAgaWYgdGVzdCAhIC1yICIkYWNfc291cmNlIjsgdGhlbgorICAgICAgYXNfZm5fZXJyb3IgIiRhY19zb3VyY2U6IGZpbGUgbm90IGZvdW5kIiAiJExJTkVOTyIgNQorICAgIGZpCisgICAgcm0gLWYgIiRhY19maWxlIgorCisgICAgIyBUcnkgYSByZWxhdGl2ZSBzeW1saW5rLCB0aGVuIGEgaGFyZCBsaW5rLCB0aGVuIGEgY29weS4KKyAgICBjYXNlICRzcmNkaXIgaW4KKyAgICBbXFwvJF0qIHwgPzpbXFwvXSogKSBhY19yZWxfc291cmNlPSRhY19zb3VyY2UgOzsKKwkqKSBhY19yZWxfc291cmNlPSRhY190b3BfYnVpbGRfcHJlZml4JGFjX3NvdXJjZSA7OworICAgIGVzYWMKKyAgICBsbiAtcyAiJGFjX3JlbF9zb3VyY2UiICIkYWNfZmlsZSIgMj4vZGV2L251bGwgfHwKKyAgICAgIGxuICIkYWNfc291cmNlIiAiJGFjX2ZpbGUiIDI+L2Rldi9udWxsIHx8CisgICAgICBjcCAtcCAiJGFjX3NvdXJjZSIgIiRhY19maWxlIiB8fAorICAgICAgYXNfZm5fZXJyb3IgImNhbm5vdCBsaW5rIG9yIGNvcHkgJGFjX3NvdXJjZSB0byAkYWNfZmlsZSIgIiRMSU5FTk8iIDUKKyAgZmkKKyA7OworICA6QykgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXhlY3V0aW5nICRhY19maWxlIGNvbW1hbmRzIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGV4ZWN1dGluZyAkYWNfZmlsZSBjb21tYW5kcyIgPiY2O30KKyA7OworICBlc2FjCisKKworICBjYXNlICRhY19maWxlJGFjX21vZGUgaW4KKyAgICAiZGVwZmlsZXMiOkMpIHRlc3QgeCIkQU1ERVBfVFJVRSIgIT0geCIiIHx8ICMgQXV0b2NvbmYgMi42MiBxdW90ZXMgLS1maWxlIGFyZ3VtZW50cyBmb3IgZXZhbCwgYnV0IG5vdCB3aGVuIGZpbGVzCisjIGFyZSBsaXN0ZWQgd2l0aG91dCAtLWZpbGUuICBMZXQncyBwbGF5IHNhZmUgYW5kIG9ubHkgZW5hYmxlIHRoZSBldmFsCisjIGlmIHdlIGRldGVjdCB0aGUgcXVvdGluZy4KK2Nhc2UgJENPTkZJR19GSUxFUyBpbgorKlwnKikgZXZhbCBzZXQgeCAiJENPTkZJR19GSUxFUyIgOzsKKyopICAgc2V0IHggJENPTkZJR19GSUxFUyA7OworZXNhYworc2hpZnQKK2ZvciBtZgorZG8KKyAgIyBTdHJpcCBNRiBzbyB3ZSBlbmQgdXAgd2l0aCB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgbWY9YGVjaG8gIiRtZiIgfCBzZWQgLWUgJ3MvOi4qJC8vJ2AKKyAgIyBDaGVjayB3aGV0aGVyIHRoaXMgaXMgYW4gQXV0b21ha2UgZ2VuZXJhdGVkIE1ha2VmaWxlIG9yIG5vdC4KKyAgIyBXZSB1c2VkIHRvIG1hdGNoIG9ubHkgdGhlIGZpbGVzIG5hbWVkIGBNYWtlZmlsZS5pbicsIGJ1dAorICAjIHNvbWUgcGVvcGxlIHJlbmFtZSB0aGVtOyBzbyBpbnN0ZWFkIHdlIGxvb2sgYXQgdGhlIGZpbGUgY29udGVudC4KKyAgIyBHcmVwJ2luZyB0aGUgZmlyc3QgbGluZSBpcyBub3QgZW5vdWdoOiBzb21lIHBlb3BsZSBwb3N0LXByb2Nlc3MKKyAgIyBlYWNoIE1ha2VmaWxlLmluIGFuZCBhZGQgYSBuZXcgbGluZSBvbiB0b3Agb2YgZWFjaCBmaWxlIHRvIHNheSBzby4KKyAgIyBHcmVwJ2luZyB0aGUgd2hvbGUgZmlsZSBpcyBub3QgZ29vZCBlaXRoZXI6IEFJWCBncmVwIGhhcyBhIGxpbmUKKyAgIyBsaW1pdCBvZiAyMDQ4LCBidXQgYWxsIHNlZCdzIHdlIGtub3cgaGF2ZSB1bmRlcnN0YW5kIGF0IGxlYXN0IDQwMDAuCisgIGlmIHNlZCAtbiAncyxeIy4qZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlLiosWCxwJyAiJG1mIiB8IGdyZXAgWCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICBkaXJwYXJ0PWAkYXNfZGlybmFtZSAtLSAiJG1mIiB8fAorJGFzX2V4cHIgWCIkbWYiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJG1mIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiRtZiIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkbWYiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWCIkbWYiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXClbXi9dLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorICBlbHNlCisgICAgY29udGludWUKKyAgZmkKKyAgIyBFeHRyYWN0IHRoZSBkZWZpbml0aW9uIG9mIERFUERJUiwgYW1fX2luY2x1ZGUsIGFuZCBhbV9fcXVvdGUKKyAgIyBmcm9tIHRoZSBNYWtlZmlsZSB3aXRob3V0IHJ1bm5pbmcgYG1ha2UnLgorICBERVBESVI9YHNlZCAtbiAncy9eREVQRElSID0gLy9wJyA8ICIkbWYiYAorICB0ZXN0IC16ICIkREVQRElSIiAmJiBjb250aW51ZQorICBhbV9faW5jbHVkZT1gc2VkIC1uICdzL15hbV9faW5jbHVkZSA9IC8vcCcgPCAiJG1mImAKKyAgdGVzdCAteiAiYW1fX2luY2x1ZGUiICYmIGNvbnRpbnVlCisgIGFtX19xdW90ZT1gc2VkIC1uICdzL15hbV9fcXVvdGUgPSAvL3AnIDwgIiRtZiJgCisgICMgV2hlbiB1c2luZyBhbnNpMmtuciwgVSBtYXkgYmUgZW1wdHkgb3IgYW4gdW5kZXJzY29yZTsgZXhwYW5kIGl0CisgIFU9YHNlZCAtbiAncy9eVSA9IC8vcCcgPCAiJG1mImAKKyAgIyBGaW5kIGFsbCBkZXBlbmRlbmN5IG91dHB1dCBmaWxlcywgdGhleSBhcmUgaW5jbHVkZWQgZmlsZXMgd2l0aAorICAjICQoREVQRElSKSBpbiB0aGVpciBuYW1lcy4gIFdlIGludm9rZSBzZWQgdHdpY2UgYmVjYXVzZSBpdCBpcyB0aGUKKyAgIyBzaW1wbGVzdCBhcHByb2FjaCB0byBjaGFuZ2luZyAkKERFUERJUikgdG8gaXRzIGFjdHVhbCB2YWx1ZSBpbiB0aGUKKyAgIyBleHBhbnNpb24uCisgIGZvciBmaWxlIGluIGBzZWQgLW4gIgorICAgIHMvXiRhbV9faW5jbHVkZSAkYW1fX3F1b3RlXCguKihERVBESVIpLipcKSRhbV9fcXVvdGUiJyQvXDEvcCcgPCIkbWYiIHwgXAorICAgICAgIHNlZCAtZSAncy9cJChERVBESVIpLyciJERFUERJUiInL2cnIC1lICdzL1wkVS8nIiRVIicvZydgOyBkbworICAgICMgTWFrZSBzdXJlIHRoZSBkaXJlY3RvcnkgZXhpc3RzLgorICAgIHRlc3QgLWYgIiRkaXJwYXJ0LyRmaWxlIiAmJiBjb250aW51ZQorICAgIGZkaXI9YCRhc19kaXJuYW1lIC0tICIkZmlsZSIgfHwKKyRhc19leHByIFgiJGZpbGUiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGZpbGUiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJGZpbGUiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJGZpbGUiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWCIkZmlsZSIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKVteL10uKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKSQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgCisgICAgYXNfZGlyPSRkaXJwYXJ0LyRmZGlyOyBhc19mbl9ta2Rpcl9wCisgICAgIyBlY2hvICJjcmVhdGluZyAkZGlycGFydC8kZmlsZSIKKyAgICBlY2hvICcjIGR1bW15JyA+ICIkZGlycGFydC8kZmlsZSIKKyAgZG9uZQorZG9uZQorIDs7CisgICAgImdjcnlwdC1jb25mIjpDKQorY2htb2QgK3ggc3JjL2xpYmdjcnlwdC1jb25maWcKKyA7OworCisgIGVzYWMKK2RvbmUgIyBmb3IgYWNfdGFnCisKKworYXNfZm5fZXhpdCAwCitfQUNFT0YKK2FjX2NsZWFuX2ZpbGVzPSRhY19jbGVhbl9maWxlc19zYXZlCisKK3Rlc3QgJGFjX3dyaXRlX2ZhaWwgPSAwIHx8CisgIGFzX2ZuX2Vycm9yICJ3cml0ZSBmYWlsdXJlIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTIiAiJExJTkVOTyIgNQorCisKKyMgY29uZmlndXJlIGlzIHdyaXRpbmcgdG8gY29uZmlnLmxvZywgYW5kIHRoZW4gY2FsbHMgY29uZmlnLnN0YXR1cy4KKyMgY29uZmlnLnN0YXR1cyBkb2VzIGl0cyBvd24gcmVkaXJlY3Rpb24sIGFwcGVuZGluZyB0byBjb25maWcubG9nLgorIyBVbmZvcnR1bmF0ZWx5LCBvbiBET1MgdGhpcyBmYWlscywgYXMgY29uZmlnLmxvZyBpcyBzdGlsbCBrZXB0IG9wZW4KKyMgYnkgY29uZmlndXJlLCBzbyBjb25maWcuc3RhdHVzIHdvbid0IGJlIGFibGUgdG8gd3JpdGUgdG8gaXQ7IGl0cworIyBvdXRwdXQgaXMgc2ltcGx5IGRpc2NhcmRlZC4gIFNvIHdlIGV4ZWMgdGhlIEZEIHRvIC9kZXYvbnVsbCwKKyMgZWZmZWN0aXZlbHkgY2xvc2luZyBjb25maWcubG9nLCBzbyBpdCBjYW4gYmUgcHJvcGVybHkgKHJlKW9wZW5lZCBhbmQKKyMgYXBwZW5kZWQgdG8gYnkgY29uZmlnLnN0YXR1cy4gIFdoZW4gY29taW5nIGJhY2sgdG8gY29uZmlndXJlLCB3ZQorIyBuZWVkIHRvIG1ha2UgdGhlIEZEIGF2YWlsYWJsZSBhZ2Fpbi4KK2lmIHRlc3QgIiRub19jcmVhdGUiICE9IHllczsgdGhlbgorICBhY19jc19zdWNjZXNzPToKKyAgYWNfY29uZmlnX3N0YXR1c19hcmdzPQorICB0ZXN0ICIkc2lsZW50IiA9IHllcyAmJgorICAgIGFjX2NvbmZpZ19zdGF0dXNfYXJncz0iJGFjX2NvbmZpZ19zdGF0dXNfYXJncyAtLXF1aWV0IgorICBleGVjIDU+L2Rldi9udWxsCisgICRTSEVMTCAkQ09ORklHX1NUQVRVUyAkYWNfY29uZmlnX3N0YXR1c19hcmdzIHx8IGFjX2NzX3N1Y2Nlc3M9ZmFsc2UKKyAgZXhlYyA1Pj5jb25maWcubG9nCisgICMgVXNlIHx8LCBub3QgJiYsIHRvIGF2b2lkIGV4aXRpbmcgZnJvbSB0aGUgaWYgd2l0aCAkPyA9IDEsIHdoaWNoCisgICMgd291bGQgbWFrZSBjb25maWd1cmUgZmFpbCBpZiB0aGlzIGlzIHRoZSBsYXN0IGluc3RydWN0aW9uLgorICAkYWNfY3Nfc3VjY2VzcyB8fCBhc19mbl9leGl0ICQ/CitmaQoraWYgdGVzdCAtbiAiJGFjX3VucmVjb2duaXplZF9vcHRzIiAmJiB0ZXN0ICIkZW5hYmxlX29wdGlvbl9jaGVja2luZyIgIT0gbm87IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1bnJlY29nbml6ZWQgb3B0aW9uczogJGFjX3VucmVjb2duaXplZF9vcHRzIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVucmVjb2duaXplZCBvcHRpb25zOiAkYWNfdW5yZWNvZ25pemVkX29wdHMiID4mMjt9CitmaQorCisKKyMgR2l2ZSBzb21lIGZlZWRiYWNrCitlY2hvICIKKyAgICAgICAgTGliZ2NyeXB0IHYke1ZFUlNJT059IGhhcyBiZWVuIGNvbmZpZ3VyZWQgYXMgZm9sbG93czoKKworICAgICAgICBQbGF0Zm9ybTogICRQUklOVEFCTEVfT1NfTkFNRSAoJGhvc3QpCisiCisKKworaWYgdGVzdCAiJHByaW50X2VnZF9ub3RpY2UiID0gInllcyI7IHRoZW4KK2NhdCA8PEcxMEVPRgorCisgICBUaGUgcGVyZm9ybWFuY2Ugb2YgdGhlIFVuaXggcmFuZG9tIGdhdGhlcmVyIG1vZHVsZSAocm5kdW5peCkgaXMgbm90CisgICB2ZXJ5IGdvb2QgYW5kIGl0IGRvZXMgbm90IGtlZXAgdGhlIGVudHJvcHkgcG9vbCBvdmVyIG11bHRpcGxlCisgICBpbnZvY2F0aW9ucyBvZiBMaWJnY3J5cHQgYmFzZSBhcHBsaWNhdGlvbnMuICBUaGUgc3VnZ2VzdGVkIHdheSB0bworICAgb3ZlcmNvbWUgdGhpcyBwcm9ibGVtIGlzIHRvIHVzZSB0aGUKKworICAgICAgICAgICAgICAgICBFbnRyb3B5IEdhdGhlcmluZyBEYWVtb24gKEVHRCkKKworICAgd2hpY2ggcHJvdmlkZXMgYSBlbnRyb3B5IHNvdXJjZSBmb3IgdGhlIHdob2xlIHN5c3RlbS4gIEl0IGlzIHdyaXR0ZW4KKyAgIGluIFBlcmwgYW5kIGF2YWlsYWJsZSBhdCB0aGUgR251UEcgRlRQIHNlcnZlcnMuICBUbyBlbmFibGUgRUdEIHlvdQorICAgc2hvdWxkIHJlcnVuIGNvbmZpZ3VyZSB3aXRoIHRoZSBvcHRpb24gIi0tZW5hYmxlLXN0YXRpYy1ybmQ9ZWdkIi4KKyAgIEZvciBtb3JlIGluZm9ybWF0aW9uIGNvbnN1bHQgdGhlIEdudVBHIHdlYnBhZ2VzOgorCisgICAgICAgICAgICAgaHR0cDovL3d3dy5nbnVwZy5vcmcvZG93bmxvYWQuaHRtbCNlZ2QKKworRzEwRU9GCitmaQorCitpZiB0ZXN0IC1uICIkZ3BsIjsgdGhlbgorICBlY2hvICJQbGVhc2Ugbm90ZSB0aGF0IHlvdSBhcmUgYnVpbGRpbmcgYSB2ZXJzaW9uIG9mIExpYmdjcnlwdCB3aXRoIgorICBlY2hvICIgICRncGwiCisgIGVjaG8gImluY2x1ZGVkLiAgVGhlc2UgcGFydHMgYXJlIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwgYW5kIHRodXMgdGhlIgorICBlY2hvICJ1c2Ugb2YgdGhpcyBsaWJyYXJ5IGhhcyB0byBjb21wbHkgd2l0aCB0aGUgY29uZGl0aW9ucyBvZiB0aGUgR1BMLiIKK2ZpCisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9jb25maWd1cmUuYWMgYi9saWJnY3J5cHQtMS40LjYvY29uZmlndXJlLmFjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNjNmMzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvY29uZmlndXJlLmFjCkBAIC0wLDAgKzEsMTE3MyBAQAorIyBDb25maWd1cmUuYWMgc2NyaXB0IGZvciBMaWJnY3J5cHQKKyMgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA2LAorIyAgICAgICAgICAgICAgIDIwMDcsIDIwMDgsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyMKKyMgTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisjIChQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LikKK0FDX1JFVklTSU9OKCRSZXZpc2lvbjogMTQzOCAkKQorQUNfUFJFUkVRKDIuNjApCittaW5fYXV0b21ha2VfdmVyc2lvbj0iMS4xMCIKKworCisjIFJlbWVtYmVyIHRvIGNoYW5nZSB0aGUgdmVyc2lvbiBudW1iZXIgaW1tZWRpYXRlbHkgKmFmdGVyKiBhIHJlbGVhc2UuCisjIFNldCBteV9pc3N2biB0byAieWVzIiBmb3Igbm9uLXJlbGVhc2VkIGNvZGUuICBSZW1lbWJlciB0byBydW4gYW4KKyMgInN2biB1cCIgYW5kICJhdXRvZ2VuLnNoIiByaWdodCBiZWZvcmUgY3JlYXRpbmcgYSBkaXN0cmlidXRpb24uCittNF9kZWZpbmUoW215X3ZlcnNpb25dLCBbMS40LjZdKQorbTRfZGVmaW5lKFtteV9pc3N2bl0sIFtub10pCisKK200X2RlZmluZShbc3ZuX3JldmlzaW9uXSwgbTRfZXN5c2NtZChbcHJpbnRmICIlZCIgJChzdm4gaW5mbyAyPi9kZXYvbnVsbCBcCisgICAgICAgICAgfCBzZWQgLW4gJy9eUmV2aXNpb246LyBzL1teMC05XS8vZ3AnfGhlYWQgLTEpXSkpCitBQ19JTklUKFtsaWJnY3J5cHRdLCAKKyAgICAgICAgW215X3ZlcnNpb25bXW00X2lmKG15X2lzc3ZuLFt5ZXNdLFstc3ZuW11zdm5fcmV2aXNpb25dKV0sCisgICAgICAgIFtidWctbGliZ2NyeXB0QGdudXBnLm9yZ10pCisjIExUIFZlcnNpb24gbnVtYmVycywgcmVtZW1iZXIgdG8gY2hhbmdlIHRoZW0ganVzdCAqYmVmb3JlKiBhIHJlbGVhc2UuCisjICAgKEludGVyZmFjZXMgcmVtb3ZlZDogICAgQ1VSUkVOVCsrLCBBR0U9MCwgUkVWSVNJT049MCkKKyMgICAoSW50ZXJmYWNlcyBhZGRlZDogICAgICBDVVJSRU5UKyssIEFHRSsrLCBSRVZJU0lPTj0wKQorIyAgIChObyBpbnRlcmZhY2VzIGNoYW5nZWQ6ICAgICAgICAgICAgICAgICAgIFJFVklTSU9OKyspCitMSUJHQ1JZUFRfTFRfQ1VSUkVOVD0xNworTElCR0NSWVBUX0xUX0FHRT02CitMSUJHQ1JZUFRfTFRfUkVWSVNJT049MAorCisKKyMgSWYgdGhlIEFQSSBpcyBjaGFuZ2VkIGluIGFuIGluY29tcGF0aWJsZSB3YXk6IGluY3JlbWVudCB0aGUgbmV4dCBjb3VudGVyLgorTElCR0NSWVBUX0NPTkZJR19BUElfVkVSU0lPTj0xCisKK05FRURfR1BHX0VSUk9SX1ZFUlNJT049MS40CisKK2lzX2RldmVsb3BtZW50X3ZlcnNpb249bXlfaXNzdm4KK0JVSUxEX1JFVklTSU9OPXN2bl9yZXZpc2lvbgorUEFDS0FHRT0kUEFDS0FHRV9OQU1FCitWRVJTSU9OPSRQQUNLQUdFX1ZFUlNJT04KKworQUNfQ09ORklHX1NSQ0RJUihbc3JjL2xpYmdjcnlwdC52ZXJzXSkKK0FNX0lOSVRfQVVUT01BS0UoJFBBQ0tBR0UsICRWRVJTSU9OKQorQU1fQ09ORklHX0hFQURFUihjb25maWcuaCkKK0FDX0NBTk9OSUNBTF9IT1NUCitBTV9NQUlOVEFJTkVSX01PREUKKworQUhfVE9QKFsKKyNpZm5kZWYgX0dDUllQVF9DT05GSUdfSF9JTkNMVURFRAorI2RlZmluZSBfR0NSWVBUX0NPTkZJR19IX0lOQ0xVREVECisvKiBuZWVkIHRoaXMsIGJlY2F1c2Ugc29tZSBhdXRvY29uZiB0ZXN0cyByZWx5IG9uIHRoaXMgKGUuZy4gc3RwY3B5KQorICogYW5kIGl0IHNob3VsZCBiZSB1c2VkIGZvciBuZXcgcHJvZ3JhbXMgICovCisjZGVmaW5lIF9HTlVfU09VUkNFICAxCitdKQorCitBSF9CT1RUT00oWworI2RlZmluZSBfR0NSWVBUX0lOX0xJQkdDUllQVCAxCisKKy8qIElmIHRoZSBjb25maWd1cmUgY2hlY2sgZm9yIGVuZGlhbm5lc3MgaGFzIGJlZW4gZGlzYWJsZWQsIGdldCBpdCBmcm9tCisgICBPUyBtYWNyb3MuICBUaGlzIGlzIGludGVuZGVkIGZvciBtYWtpbmcgZmF0IGJpbmFyeSBidWlsZHMgb24gT1MgWC4gICovCisjaWZkZWYgRElTQUJMRURfRU5ESUFOX0NIRUNLCisjIGlmIGRlZmluZWQoX19CSUdfRU5ESUFOX18pCisjICBkZWZpbmUgV09SRFNfQklHRU5ESUFOIDEKKyMgZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9fKQorIyAgdW5kZWYgV09SRFNfQklHRU5ESUFOCisjIGVsc2UKKyMgIGVycm9yICJObyBlbmRpYW5uZXNzIGZvdW5kIgorIyBlbmRpZgorI2VuZGlmIC8qRElTQUJMRURfRU5ESUFOX0NIRUNLKi8KKworLyogV2UgYmFzaWNhbGx5IHVzZSB0aGUgb3JpZ2luYWwgQ2FtZWxsaWEgc291cmNlLiAgTWFrZSBzdXJlIHRoZSBzeW1ib2xzIAorICAgcHJvcGVybHkgcHJlZml4ZWQuICAqLworI2RlZmluZSBDQU1FTExJQV9FWFRfU1lNX1BSRUZJWCBfZ2NyeV8KKworLyogVGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYXZhaWxhYmxlIHdpdGggZ3BnLWVycm9yIDEuNy4gIFRodXMKKyAgIHdlIGRlZmluZSBpdCBoZXJlIHdpdGggdGhlIHVzdWFsIGdjcnkgcHJlZml4LiAgKi8KKyNkZWZpbmUgR0NSWV9HUEdfRVJSX05PVF9PUEVSQVRJT05BTCAgMTc2CisKKworI2VuZGlmIC8qX0dDUllQVF9DT05GSUdfSF9JTkNMVURFRCovCitdKQorCitBSF9WRVJCQVRJTShbX1JFRU5UUkFOVF0sCitbLyogVG8gYWxsb3cgdGhlIHVzZSBvZiBMaWJnY3J5cHQgaW4gbXVsdGl0aHJlYWRlZCBwcm9ncmFtcyB3ZSBoYXZlIHRvIHVzZQorICAgIHNwZWNpYWwgZmVhdHVyZXMgZnJvbSB0aGUgbGlicmFyeS4gKi8KKyNpZm5kZWYgX1JFRU5UUkFOVAorIyBkZWZpbmUgX1JFRU5UUkFOVCAxCisjZW5kaWYKK10pCisKKworQUNfU1VCU1QoTElCR0NSWVBUX0xUX0NVUlJFTlQpCitBQ19TVUJTVChMSUJHQ1JZUFRfTFRfQUdFKQorQUNfU1VCU1QoTElCR0NSWVBUX0xUX1JFVklTSU9OKQorQUNfU1VCU1QoUEFDS0FHRSkKK0FDX1NVQlNUKFZFUlNJT04pCitBQ19ERUZJTkVfVU5RVU9URUQoUEFDS0FHRSwgIiRQQUNLQUdFIiwgW05hbWUgb2YgdGhpcyBwYWNrYWdlXSkKK0FDX0RFRklORV9VTlFVT1RFRChWRVJTSU9OLCAiJFZFUlNJT04iLCBbVmVyc2lvbiBvZiB0aGlzIHBhY2thZ2VdKQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjICBCYXNpYyBjaGVja3MuICAjIyMgKHdlIG5lZWQgc29tZSByZXN1bHRzIGxhdGVyIG9uIChlLmcuICRHQ0MpCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK0FDX1BST0dfTUFLRV9TRVQKK21pc3NpbmdfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCitBTV9NSVNTSU5HX1BST0coQUNMT0NBTCwgYWNsb2NhbCwgJG1pc3NpbmdfZGlyKQorQU1fTUlTU0lOR19QUk9HKEFVVE9DT05GLCBhdXRvY29uZiwgJG1pc3NpbmdfZGlyKQorQU1fTUlTU0lOR19QUk9HKEFVVE9NQUtFLCBhdXRvbWFrZSwgJG1pc3NpbmdfZGlyKQorQU1fTUlTU0lOR19QUk9HKEFVVE9IRUFERVIsIGF1dG9oZWFkZXIsICRtaXNzaW5nX2RpcikKKyMgQU1fTUlTU0lOR19QUk9HKE1BS0VJTkZPLCBtYWtlaW5mbywgJG1pc3NpbmdfZGlyKQorQUNfUFJPR19DQworQUNfUFJPR19DUFAKK0FNX1BST0dfQ0NfQ19PCitBTV9QUk9HX0FTCitBQ19JU0NfUE9TSVgKK0FDX1BST0dfSU5TVEFMTAorQUNfUFJPR19BV0sKKworQUNfTElCVE9PTF9XSU4zMl9ETEwKK0FDX0xJQlRPT0xfUkMKK0FNX1BST0dfTElCVE9PTAorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyBHZW5lcmFsIGRlZmluaXRpb25zLiAjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBVc2VkIGJ5IGxpYmdjcnlwdC1jb25maWcKK0xJQkdDUllQVF9DT05GSUdfTElCUz0iLWxnY3J5cHQiCitMSUJHQ1JZUFRfQ09ORklHX0NGTEFHUz0iIgorCisjIERlZmluaXRpb25zIGZvciBzeW1tZXRyaWMgY2lwaGVycy4KK2F2YWlsYWJsZV9jaXBoZXJzPSJhcmNmb3VyIGJsb3dmaXNoIGNhc3Q1IGRlcyBhZXMgdHdvZmlzaCBzZXJwZW50IHJmYzIyNjggc2VlZCIKK2F2YWlsYWJsZV9jaXBoZXJzPSIkYXZhaWxhYmxlX2NpcGhlcnMgY2FtZWxsaWEiCitlbmFibGVkX2NpcGhlcnM9IiIKKworIyBEZWZpbml0aW9ucyBmb3IgcHVibGljLWtleSBjaXBoZXJzLgorYXZhaWxhYmxlX3B1YmtleV9jaXBoZXJzPSJkc2EgZWxnYW1hbCByc2EgZWNjIgorZW5hYmxlZF9wdWJrZXlfY2lwaGVycz0iIgorCisjIERlZmluaXRpb25zIGZvciBtZXNzYWdlIGRpZ2VzdHMuCithdmFpbGFibGVfZGlnZXN0cz0iY3JjIG1kNCBtZDUgcm1kMTYwIHNoYTEgc2hhMjU2IgorYXZhaWxhYmxlX2RpZ2VzdHNfNjQ9InNoYTUxMiB0aWdlciB3aGlybHBvb2wiCitlbmFibGVkX2RpZ2VzdHM9IiIKKworIyBEZWZpbml0aW9ucyBmb3IgcmFuZG9tIG1vZHVsZXMuCithdmFpbGFibGVfcmFuZG9tX21vZHVsZXM9ImxpbnV4IGVnZCB1bml4IgorYXV0b19yYW5kb21fbW9kdWxlcz0iJGF2YWlsYWJsZV9yYW5kb21fbW9kdWxlcyIKKworIyBTdXBwb3J0ZWQgdGhyZWFkIGJhY2tlbmRzLgorTElCR0NSWVBUX1RIUkVBRF9NT0RVTEVTPSIiCisKKyMgT3RoZXIgZGVmaW5pdGlvbnMuCitwcmludF9lZ2Rfbm90aWNlPW5vCitoYXZlX3czMl9zeXN0ZW09bm8KKworIyBTZXR1cCBzb21lIHN0dWZmIGRlcGVuZGluZyBvbiBob3N0LgorY2FzZSAiJHtob3N0fSIgaW4KKyAgICAqLSotbWluZ3czMiopCisgICAgICBhdmFpbGFibGVfcmFuZG9tX21vZHVsZXM9InczMiIKKyAgICAgIGFjX2N2X2hhdmVfZGV2X3JhbmRvbT1ubworICAgICAgaGF2ZV93MzJfc3lzdGVtPXllcworICAgICAgQUNfREVGSU5FKFVTRV9PTkxZXzhET1QzLDEsCisgICAgICAgICAgICAgICAgW3NldCB0aGlzIHRvIGxpbWl0IGZpbGVuYW1lcyB0byB0aGUgOC4zIGZvcm1hdF0pCisgICAgICBBQ19ERUZJTkUoSEFWRV9EUklWRV9MRVRURVJTLDEsCisgICAgICAgICAgICAgICAgW2RlZmluZWQgaWYgd2UgbXVzdCBydW4gb24gYSBzdHVwaWQgZmlsZSBzeXN0ZW1dKQorICAgICAgQUNfREVGSU5FKEhBVkVfRE9TSVNIX1NZU1RFTSwxLAorICAgICAgICAgICAgICAgIFtkZWZpbmVkIGlmIHdlIHJ1biBvbiBzb21lIG9mIHRoZSBQQ0RPUyBsaWtlIHN5c3RlbXMgCisgICAgICAgICAgICAgICAgIChET1MsIFdpbmRvemUuIE9TLzIpIHdpdGggc3BlY2lhbCBwcm9wZXJ0aWVzIGxpa2UKKyAgICAgICAgICAgICAgICAgIG5vIGZpbGUgbW9kZXNdKQorICAgICAgOzsKKworICAgIGk/ODYtZW14LW9zMiB8IGk/ODYtKi1vczIqZW14KQorICAgICAgICAjIE9TLzIgd2l0aCB0aGUgRU1YIGVudmlyb25tZW50CisgICAgICAgIGFjX2N2X2hhdmVfZGV2X3JhbmRvbT1ubworICAgICAgICBBQ19ERUZJTkUoSEFWRV9EUklWRV9MRVRURVJTKQorICAgICAgICBBQ19ERUZJTkUoSEFWRV9ET1NJU0hfU1lTVEVNKQorICAgICAgICA7OworCisgICAgaT84Ni0qLW1zZG9zZGpncHAqKQorICAgICAgICAjIERPUyB3aXRoIHRoZSBESkdQUCBlbnZpcm9ubWVudAorICAgICAgICBhY19jdl9oYXZlX2Rldl9yYW5kb209bm8KKyAgICAgICAgQUNfREVGSU5FKEhBVkVfRFJJVkVfTEVUVEVSUykKKyAgICAgICAgQUNfREVGSU5FKEhBVkVfRE9TSVNIX1NZU1RFTSkKKyAgICAgICAgOzsKKworICAgICotKi1mcmVlYnNkKikKKyAgICAgICAjIEZyZWVCU0QKKyAgICAgICBDUFBGTEFHUz0iJENQUEZMQUdTIC1JL3Vzci9sb2NhbC9pbmNsdWRlIgorICAgICAgIExERkxBR1M9IiRMREZMQUdTIC1ML3Vzci9sb2NhbC9saWIiCisgICAgICAgOzsKKworICAgICotKi1ocHV4KikKKyAgICAgICAgaWYgdGVzdCAteiAiJEdDQyIgOyB0aGVuCisgICAgICAgICAgICBDRkxBR1M9IiRDRkxBR1MgLUFlIC1EX0hQVVhfU09VUkNFIgorICAgICAgICBmaQorICAgICAgICA7OworICAgICotZGVjLW9zZjQqKQorICAgICAgICBpZiB0ZXN0IC16ICIkR0NDIiA7IHRoZW4KKyAgICAgICAgICAgICMgU3VwcHJlc3MgYWxsIHdhcm5pbmdzCisgICAgICAgICAgICAjIHRvIGdldCByaWQgb2YgdGhlIHVuc2lnbmVkL3NpZ25lZCBjaGFyIG1pc21hdGNoIHdhcm5pbmdzLgorICAgICAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC13IgorICAgICAgICBmaQorICAgICAgICA7OworICAgIG02OGstYXRhcmktbWludCkKKyAgICAgICAgOzsKKyAgICAqKQorICAgICAgOzsKK2VzYWMKKworaWYgdGVzdCAiJGhhdmVfdzMyX3N5c3RlbSIgPSB5ZXM7IHRoZW4KKyAgIEFDX0RFRklORShIQVZFX1czMl9TWVNURU0sMSwgW0RlZmluZWQgaWYgd2UgcnVuIG9uIGEgVzMyIEFQSSBiYXNlZCBzeXN0ZW1dKQorZmkKK0FNX0NPTkRJVElPTkFMKEhBVkVfVzMyX1NZU1RFTSwgdGVzdCAiJGhhdmVfdzMyX3N5c3RlbSIgPSB5ZXMpCisKKworCisjIEEgcHJpbnRhYmxlIE9TIE5hbWUgaXMgc29tZXRpbWVzIHVzZWZ1bC4KK2Nhc2UgIiR7aG9zdH0iIGluCisgICAgKi0qLW1pbmd3MzIqKQorICAgICAgICBQUklOVEFCTEVfT1NfTkFNRT0iTWluZ1czMiIKKyAgICAgICAgOzsKKworICAgIGk/ODYtZW14LW9zMiB8IGk/ODYtKi1vczIqZW14ICkKKyAgICAgICAgUFJJTlRBQkxFX09TX05BTUU9Ik9TLzIiCisgICAgICAgIDs7CisKKyAgICBpPzg2LSotbXNkb3NkamdwcCopCisgICAgICAgIFBSSU5UQUJMRV9PU19OQU1FPSJNU0RPUy9ESkdQUCIKKyAgICAgICAgOzsKKworICAgICotbGludXgqKQorICAgICAgICBQUklOVEFCTEVfT1NfTkFNRT0iR05VL0xpbnV4IgorICAgICAgICA7OworCisgICAgKikKKyAgICAgICAgUFJJTlRBQkxFX09TX05BTUU9YHVuYW1lIC1zIHx8IGVjaG8gIlVua25vd24iYAorICAgICAgICA7OworZXNhYworCisjCisjIEZpZ3VyZSBvdXQgdGhlIG5hbWUgb2YgdGhlIHJhbmRvbSBkZXZpY2UKKyMKK2Nhc2UgIiR7aG9zdH0iIGluCisgICAgKi1vcGVuYnNkKikKKyAgICAgICAgTkFNRV9PRl9ERVZfUkFORE9NPSIvZGV2L3NyYW5kb20iCisgICAgICAgIE5BTUVfT0ZfREVWX1VSQU5ET009Ii9kZXYvdXJhbmRvbSIKKyAgICAgICAgOzsKKworICAgICopCisgICAgICAgIE5BTUVfT0ZfREVWX1JBTkRPTT0iL2Rldi9yYW5kb20iCisgICAgICAgIE5BTUVfT0ZfREVWX1VSQU5ET009Ii9kZXYvdXJhbmRvbSIKKyAgICAgICAgOzsKK2VzYWMKKworCitBQ19BUkdfRU5BQkxFKGVuZGlhbi1jaGVjaywKKyAgICAgICAgICAgICAgQUNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1lbmRpYW4tY2hlY2tdLAorCSAgICAgIFtkaXNhYmxlIHRoZSBlbmRpYW4gY2hlY2sgYW5kIHRydXN0IHRoZSBPUyBwcm92aWRlZCBtYWNyb3NdKSwKKwkgICAgICBlbmRpYW5jaGVjaz0kZW5hYmxldmFsLGVuZGlhbmNoZWNrPXllcykKK2lmIHRlc3QgeCIkZW5kaWFuY2hlY2siID0geHllcyA7IHRoZW4KKyAgQUNfQ19CSUdFTkRJQU4KK2Vsc2UKKyAgQUNfREVGSU5FKERJU0FCTEVEX0VORElBTl9DSEVDSywxLFtjb25maWd1cmUgZGlkIG5vdCB0ZXN0IGZvciBlbmRpYW5lc3NdKQorZmkKKworQUNfQ0hFQ0tfU0laRU9GKHVuc2lnbmVkIHNob3J0LCAyKQorQUNfQ0hFQ0tfU0laRU9GKHVuc2lnbmVkIGludCwgNCkKK0FDX0NIRUNLX1NJWkVPRih1bnNpZ25lZCBsb25nLCA0KQorQUNfQ0hFQ0tfU0laRU9GKHVuc2lnbmVkIGxvbmcgbG9uZywgMCkKKworQUNfVFlQRV9VSU5UUFRSX1QKKworaWYgdGVzdCAiJGFjX2N2X3NpemVvZl91bnNpZ25lZF9zaG9ydCIgPSAiMCIgXAorICAgfHwgdGVzdCAiJGFjX2N2X3NpemVvZl91bnNpZ25lZF9pbnQiID0gIjAiIFwKKyAgIHx8IHRlc3QgIiRhY19jdl9zaXplb2ZfdW5zaWduZWRfbG9uZyIgPSAiMCI7IHRoZW4KKyAgICBBQ19NU0dfV0FSTihbSG1tbSwgc29tZXRoaW5nIGlzIHdyb25nIHdpdGggdGhlIHNpemVzIC0gdXNpbmcgZGVmYXVsdHNdKTsKK2ZpCisKKyMgRG8gd2UgaGF2ZSBhbnkgNjQtYml0IGRhdGEgdHlwZXM/CitpZiB0ZXN0ICIkYWNfY3Zfc2l6ZW9mX3Vuc2lnbmVkX2ludCIgIT0gIjgiIFwKKyAgICYmIHRlc3QgIiRhY19jdl9zaXplb2ZfdW5zaWduZWRfbG9uZyIgIT0gIjgiIFwKKyAgICYmIHRlc3QgIiRhY19jdl9zaXplb2ZfdW5zaWduZWRfbG9uZ19sb25nIiAhPSAiOCIgXAorICAgJiYgdGVzdCAiJGFjX2N2X3NpemVvZl91aW50NjRfdCIgIT0gIjgiOyB0aGVuCisgICAgQUNfTVNHX1dBUk4oW05vIDY0LWJpdCB0eXBlcy4gIERpc2FibGluZyBUSUdFUi8xOTIsIFNIQS0zODQsIGFuZCBTSEEtNTEyXSkKK2Vsc2UKKyAgYXZhaWxhYmxlX2RpZ2VzdHM9IiRhdmFpbGFibGVfZGlnZXN0cyAkYXZhaWxhYmxlX2RpZ2VzdHNfNjQiCitmaQorCisjIElmIG5vdCBzcGVjaWZpZWQgb3RoZXJ3aXNlLCBhbGwgYXZhaWxhYmxlIGFsZ29yaXRobXMgd2lsbCBiZQorIyBpbmNsdWRlZC4gIAorZGVmYXVsdF9jaXBoZXJzPSIkYXZhaWxhYmxlX2NpcGhlcnMiCitkZWZhdWx0X3B1YmtleV9jaXBoZXJzPSIkYXZhaWxhYmxlX3B1YmtleV9jaXBoZXJzIgorZGVmYXVsdF9kaWdlc3RzPSIkYXZhaWxhYmxlX2RpZ2VzdHMiCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIENvbW1hbmQgbGluZSBzd2l0Y2hlcy4gIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgLS1lbmFibGUtY2lwaGVycyBzd2l0Y2guCitBQ19BUkdfRU5BQkxFKGNpcGhlcnMsCisJICAgICAgQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWNpcGhlcnM9Y2lwaGVyc10sCisJCQkgICAgIFtzZWxlY3QgdGhlIHN5bW1ldHJpYyBjaXBoZXJzIHRvIGluY2x1ZGVdKSwKKwkgICAgICBbZW5hYmxlZF9jaXBoZXJzPWBlY2hvICRlbmFibGV2YWwgfCB0ciAnLDonICcgICcgfCB0ciAnW0EtWl0nICdbYS16XSdgXSwKKwkgICAgICBbZW5hYmxlZF9jaXBoZXJzPSIiXSkKK2lmIHRlc3QgIngkZW5hYmxlZF9jaXBoZXJzIiA9ICJ4IiBcCisgICAtbyAiJGVuYWJsZWRfY2lwaGVycyIgPSAieWVzIiAgXAorICAgLW8gIiRlbmFibGVkX2NpcGhlcnMiID0gIm5vIjsgdGhlbgorICAgZW5hYmxlZF9jaXBoZXJzPSRkZWZhdWx0X2NpcGhlcnMKK2ZpCitBQ19NU0dfQ0hFQ0tJTkcoW3doaWNoIHN5bW1ldHJpYyBjaXBoZXJzIHRvIGluY2x1ZGVdKQorZm9yIGNpcGhlciBpbiAkZW5hYmxlZF9jaXBoZXJzOyBkbworICAgIExJU1RfTUVNQkVSKCRjaXBoZXIsICRhdmFpbGFibGVfY2lwaGVycykKKyAgICBpZiB0ZXN0ICIkZm91bmQiID0gIjAiOyB0aGVuCisgICAgICAgQUNfTVNHX0VSUk9SKFt1bnN1cHBvcnRlZCBjaXBoZXIgIiRjaXBoZXIiIHNwZWNpZmllZF0pCisgICAgZmkKK2RvbmUKK0FDX01TR19SRVNVTFQoWyRlbmFibGVkX2NpcGhlcnNdKQorCisjIEltcGxlbWVudGF0aW9uIG9mIHRoZSAtLWVuYWJsZS1wdWJrZXktY2lwaGVycyBzd2l0Y2guCitBQ19BUkdfRU5BQkxFKHB1YmtleS1jaXBoZXJzLAorCSAgICAgIEFDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1wdWJrZXktY2lwaGVycz1jaXBoZXJzXSwKKwkJCSAgICAgW3NlbGVjdCB0aGUgcHVibGljLWtleSBjaXBoZXJzIHRvIGluY2x1ZGVdKSwKKwkgICAgICBbZW5hYmxlZF9wdWJrZXlfY2lwaGVycz1gZWNobyAkZW5hYmxldmFsIHwgdHIgJyw6JyAnICAnIHwgdHIgJ1tBLVpdJyAnW2Etel0nYF0sCisJICAgICAgW2VuYWJsZWRfcHVia2V5X2NpcGhlcnM9IiJdKQoraWYgdGVzdCAieCRlbmFibGVkX3B1YmtleV9jaXBoZXJzIiA9ICJ4IiBcCisgICAtbyAiJGVuYWJsZWRfcHVia2V5X2NpcGhlcnMiID0gInllcyIgIFwKKyAgIC1vICIkZW5hYmxlZF9wdWJrZXlfY2lwaGVycyIgPSAibm8iOyB0aGVuCisgICBlbmFibGVkX3B1YmtleV9jaXBoZXJzPSRkZWZhdWx0X3B1YmtleV9jaXBoZXJzCitmaQorQUNfTVNHX0NIRUNLSU5HKFt3aGljaCBwdWJsaWMta2V5IGNpcGhlcnMgdG8gaW5jbHVkZV0pCitmb3IgY2lwaGVyIGluICRlbmFibGVkX3B1YmtleV9jaXBoZXJzOyBkbworICAgIExJU1RfTUVNQkVSKCRjaXBoZXIsICRhdmFpbGFibGVfcHVia2V5X2NpcGhlcnMpCisgICAgaWYgdGVzdCAiJGZvdW5kIiA9ICIwIjsgdGhlbgorICAgICAgIEFDX01TR19FUlJPUihbdW5zdXBwb3J0ZWQgcHVibGljLWtleSBjaXBoZXIgc3BlY2lmaWVkXSkKKyAgICBmaQorZG9uZQorQUNfTVNHX1JFU1VMVChbJGVuYWJsZWRfcHVia2V5X2NpcGhlcnNdKQorCisjIEltcGxlbWVudGF0aW9uIG9mIHRoZSAtLWVuYWJsZS1kaWdlc3RzIHN3aXRjaC4KK0FDX0FSR19FTkFCTEUoZGlnZXN0cywKKwkgICAgICBBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtZGlnZXN0cz1kaWdlc3RzXSwKKwkJCSAgICAgW3NlbGVjdCB0aGUgbWVzc2FnZSBkaWdlc3RzIHRvIGluY2x1ZGVdKSwKKwkgICAgICBbZW5hYmxlZF9kaWdlc3RzPWBlY2hvICRlbmFibGV2YWwgfCB0ciAnLDonICcgICcgfCB0ciAnW0EtWl0nICdbYS16XSdgXSwKKwkgICAgICBbZW5hYmxlZF9kaWdlc3RzPSIiXSkKK2lmIHRlc3QgIngkZW5hYmxlZF9kaWdlc3RzIiA9ICJ4IiBcCisgICAtbyAiJGVuYWJsZWRfZGlnZXN0cyIgPSAieWVzIiAgXAorICAgLW8gIiRlbmFibGVkX2RpZ2VzdHMiID0gIm5vIjsgdGhlbgorICAgZW5hYmxlZF9kaWdlc3RzPSRkZWZhdWx0X2RpZ2VzdHMKK2ZpCitBQ19NU0dfQ0hFQ0tJTkcoW3doaWNoIG1lc3NhZ2UgZGlnZXN0cyB0byBpbmNsdWRlXSkKK2ZvciBkaWdlc3QgaW4gJGVuYWJsZWRfZGlnZXN0czsgZG8KKyAgICBMSVNUX01FTUJFUigkZGlnZXN0LCAkYXZhaWxhYmxlX2RpZ2VzdHMpCisgICAgaWYgdGVzdCAiJGZvdW5kIiA9ICIwIjsgdGhlbgorICAgICAgIEFDX01TR19FUlJPUihbdW5zdXBwb3J0ZWQgbWVzc2FnZSBkaWdlc3Qgc3BlY2lmaWVkXSkKKyAgICBmaQorZG9uZQorQUNfTVNHX1JFU1VMVChbJGVuYWJsZWRfZGlnZXN0c10pCisKKyMgSW1wbGVtZW50YXRpb24gb2YgdGhlIC0tZW5hYmxlLXJhbmRvbSBzd2l0Y2guCitBQ19BUkdfRU5BQkxFKHJhbmRvbSwKKwkgICAgICBBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtcmFuZG9tPW5hbWVdLAorCSAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3Qgd2hpY2ggcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgdG8gdXNlXSksCisJICAgICAgW3JhbmRvbT1gZWNobyAkZW5hYmxldmFsIHwgdHIgJ1tBLVpdJyAnW2Etel0nYF0sCisJICAgICAgW10pCitpZiB0ZXN0ICJ4JHJhbmRvbSIgPSAieCIgLW8gIiRyYW5kb20iID0gInllcyIgLW8gIiRyYW5kb20iID0gIm5vIjsgdGhlbgorICAgIHJhbmRvbT1kZWZhdWx0CitmaQorQUNfTVNHX0NIRUNLSU5HKFt3aGljaCByYW5kb20gbW9kdWxlIHRvIHVzZV0pCitpZiB0ZXN0ICIkcmFuZG9tIiAhPSAiZGVmYXVsdCIgLWEgIiRyYW5kb20iICE9ICJhdXRvIjsgdGhlbgorICAgIExJU1RfTUVNQkVSKCRyYW5kb20sICRhdmFpbGFibGVfcmFuZG9tX21vZHVsZXMpCisgICAgaWYgdGVzdCAiJGZvdW5kIiA9ICIwIjsgdGhlbgorICAgICAgIEFDX01TR19FUlJPUihbdW5zdXBwb3J0ZWQgcmFuZG9tIG1vZHVsZSBzcGVjaWZpZWRdKQorICAgIGZpCitmaQorQUNfTVNHX1JFU1VMVCgkcmFuZG9tKQorCisjIEltcGxlbWVudGF0aW9uIG9mIHRoZSAtLWRpc2FibGUtZGV2LXJhbmRvbSBzd2l0Y2guCitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdXNlIG9mIC9kZXYvcmFuZG9tIGlzIHJlcXVlc3RlZF0pCitBQ19BUkdfRU5BQkxFKGRldi1yYW5kb20sCitbICAtLWRpc2FibGUtZGV2LXJhbmRvbSAgICBkaXNhYmxlIHRoZSB1c2Ugb2YgZGV2IHJhbmRvbV0sCisgICAgdHJ5X2Rldl9yYW5kb209JGVuYWJsZXZhbCwgdHJ5X2Rldl9yYW5kb209eWVzKQorQUNfTVNHX1JFU1VMVCgkdHJ5X2Rldl9yYW5kb20pCisKKyMgSW1wbGVtZW50YXRpb24gb2YgdGhlIC0td2l0aC1lZ2Qtc29ja2V0IHN3aXRjaC4KK0FDX0FSR19XSVRIKGVnZC1zb2NrZXQsCisgICAgWyAgLS13aXRoLWVnZC1zb2NrZXQ9TkFNRSAgVXNlIE5BTUUgZm9yIHRoZSBFR0Qgc29ja2V0KV0sCisgICAgICAgICAgICBlZ2Rfc29ja2V0X25hbWU9IiR3aXRodmFsIiwgZWdkX3NvY2tldF9uYW1lPSIiICkKK0FDX0RFRklORV9VTlFVT1RFRChFR0RfU09DS0VUX05BTUUsICIkZWdkX3NvY2tldF9uYW1lIiwKKyAgICAgICAgICAgICAgICAgICBbRGVmaW5lIGlmIHlvdSBkb24ndCB3YW50IHRoZSBkZWZhdWx0IEVHRCBzb2NrZXQgbmFtZS4KKyAgICAgICAgICAgICAgICAgICAgRm9yIGRldGFpbHMgc2VlIGNpcGhlci9ybmRlZ2QuY10pCisKKyMgSW1wbGVtZW50YXRpb24gb2YgdGhlIC0tZW5hYmxlLXJhbmRvbS1kYWVtb24KK0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0aGUgZXhwZXJpbWVudGFsIHJhbmRvbSBkYWVtb24gaXMgcmVxdWVzdGVkXSkKK0FDX0FSR19FTkFCTEUoW3JhbmRvbS1kYWVtb25dLAorICAgICAgICAgICAgICBBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtcmFuZG9tLWRhZW1vbl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtCdWlsZCBhbmQgc3VwcG9ydCB0aGUgZXhwZXJpbWVudGFsIGdjcnlwdHJuZF0pLAorICAgICAgICAgICAgICBbdXNlX3JhbmRvbV9kYWVtb249JGVuYWJsZXZhbF0sCisgICAgICAgICAgICAgIFt1c2VfcmFuZG9tX2RhZW1vbj1ub10pCitBQ19NU0dfUkVTVUxUKCR1c2VfcmFuZG9tX2RhZW1vbikKK2lmIHRlc3QgeCR1c2VfcmFuZG9tX2RhZW1vbiA9IHh5ZXMgOyB0aGVuCisgICAgQUNfREVGSU5FKFVTRV9SQU5ET01fREFFTU9OLDEsCisgICAgICAgICAgICAgIFtEZWZpbmUgdG8gc3VwcG9ydCB0aGUgZXhwZXJpbWVudGFsIHJhbmRvbSBkYWVtb25dKQorZmkKK0FNX0NPTkRJVElPTkFMKFVTRV9SQU5ET01fREFFTU9OLCB0ZXN0IHgkdXNlX3JhbmRvbV9kYWVtb24gPSB4eWVzKQorCisKKyMgSW1wbGVtZW50YXRpb24gb2YgLS1kaXNhYmxlLWFzbS4KK0FDX01TR19DSEVDS0lORyhbd2hldGhlciBNUEkgYXNzZW1ibGVyIG1vZHVsZXMgYXJlIHJlcXVlc3RlZF0pCitBQ19BUkdfRU5BQkxFKFthc21dLAorICAgICAgICAgICAgICBBQ19IRUxQX1NUUklORyhbLS1kaXNhYmxlLWFzbV0sCisJICAgICAgICAgICAgICAgICAgICAgW0Rpc2FibGUgTVBJIGFzc2VtYmxlciBtb2R1bGVzXSksCisgICAgICAgICAgICAgIFt0cnlfYXNtX21vZHVsZXM9JGVuYWJsZXZhbF0sCisgICAgICAgICAgICAgIFt0cnlfYXNtX21vZHVsZXM9eWVzXSkKK0FDX01TR19SRVNVTFQoJHRyeV9hc21fbW9kdWxlcykKKworIyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgLS1lbmFibGUtbS1ndWFyZCBzd2l0Y2guCitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgbWVtb3J5IGd1YXJkIGlzIHJlcXVlc3RlZF0pCitBQ19BUkdfRU5BQkxFKG0tZ3VhcmQsCisgICAgICAgICAgICAgIEFDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1tLWd1YXJkXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0VuYWJsZSBtZW1vcnkgZ3VhcmQgZmFjaWxpdHldKSwKKyAgICAgICAgICAgICAgW3VzZV9tX2d1YXJkPSRlbmFibGV2YWxdLCBbdXNlX21fZ3VhcmQ9bm9dKQorQUNfTVNHX1JFU1VMVCgkdXNlX21fZ3VhcmQpCitpZiB0ZXN0ICIkdXNlX21fZ3VhcmQiID0geWVzIDsgdGhlbgorICAgIEFDX0RFRklORShNX0dVQVJELDEsW0RlZmluZSB0byB1c2UgdGhlIChvYnNvbGV0ZSkgbWFsbG9jIGd1YXJkaW5nIGZlYXR1cmVdKQorZmkKKworIyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgLS13aXRoLWNhcGFiaWxpdGllcyBzd2l0Y2guCisjIENoZWNrIHdoZXRoZXIgd2Ugd2FudCB0byB1c2UgTGludXggY2FwYWJpbGl0aWVzCitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdXNlIG9mIGNhcGFiaWxpdGllcyBpcyByZXF1ZXN0ZWRdKQorQUNfQVJHX1dJVEgoY2FwYWJpbGl0aWVzLAorICAgICAgICAgICAgQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1jYXBhYmlsaXRpZXNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgW1VzZSBsaW51eCBjYXBhYmlsaXRpZXMgW2RlZmF1bHQ9bm9dXSksCisgICAgICAgICAgICBbdXNlX2NhcGFiaWxpdGllcz0iJHdpdGh2YWwiXSxbdXNlX2NhcGFiaWxpdGllcz1ub10pCitBQ19NU0dfUkVTVUxUKCR1c2VfY2FwYWJpbGl0aWVzKQorCisjIEltcGxlbWVudGF0aW9uIG9mIHRoZSAtLWVuYWJsZS1obWFjLWJpbmFyeS1jaGVjay4KK0FDX01TR19DSEVDS0lORyhbd2hldGhlciBhIEhNQUMgYmluYXJ5IGNoZWNrIGlzIHJlcXVlc3RlZF0pCitBQ19BUkdfRU5BQkxFKGhtYWMtYmluYXJ5LWNoZWNrLAorICAgICAgICAgICAgICBBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtaG1hYy1iaW5hcnktY2hlY2tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbRW5hYmxlIGxpYnJhcnkgaW50ZWdyaXR5IGNoZWNrXSksCisgICAgICAgICAgICAgIFt1c2VfaG1hY19iaW5hcnlfY2hlY2s9JGVuYWJsZXZhbF0sCisgICAgICAgICAgICAgIFt1c2VfaG1hY19iaW5hcnlfY2hlY2s9bm9dKQorQUNfTVNHX1JFU1VMVCgkdXNlX2htYWNfYmluYXJ5X2NoZWNrKQoraWYgdGVzdCAiJHVzZV9obWFjX2JpbmFyeV9jaGVjayIgPSB5ZXMgOyB0aGVuCisgICAgQUNfREVGSU5FKEVOQUJMRV9ITUFDX0JJTkFSWV9DSEVDSywxLAorICAgICAgICAgICAgICBbRGVmaW5lIHRvIHN1cHBvcnQgYW4gSE1BQyBiYXNlZCBpbnRlZ3JpdHkgY2hlY2tdKQorZmkKKworCisjIEltcGxlbWVudGF0aW9uIG9mIHRoZSAtLWRpc2FibGUtcGFkbG9jay1zdXBwb3J0IHN3aXRjaC4KK0FDX01TR19DSEVDS0lORyhbd2hldGhlciBwYWRsb2NrIHN1cHBvcnQgaXMgcmVxdWVzdGVkXSkKK0FDX0FSR19FTkFCTEUocGFkbG9jay1zdXBwb3J0LAorICAgICAgICAgICAgICBBQ19IRUxQX1NUUklORyhbLS1kaXNhYmxlLXBhZGxvY2stc3VwcG9ydF0sCisgICAgICAgCSAgICAgICAgIFtEaXNhYmxlIHN1cHBvcnQgZm9yIHRoZSBQYWRMb2NrIEVuZ2luZSBvZiBWSUEgcHJvY2Vzc29yc10pLAorCSAgICAgIHBhZGxvY2tzdXBwb3J0PSRlbmFibGV2YWwscGFkbG9ja3N1cHBvcnQ9eWVzKQorQUNfTVNHX1JFU1VMVCgkcGFkbG9ja3N1cHBvcnQpCitpZiB0ZXN0IHgiJHBhZGxvY2tzdXBwb3J0IiA9IHh5ZXMgOyB0aGVuCisgIEFDX0RFRklORShFTkFCTEVfUEFETE9DS19TVVBQT1JULCAxLAorICAgICAgICAgICAgW0VuYWJsZSBzdXBwb3J0IGZvciB0aGUgUGFkTG9jayBlbmdpbmUuXSkKK2ZpCisKKyMgSW1wbGVtZW50YXRpb24gb2YgdGhlIC0tZGlzYWJsZS1PLWZsYWctbXVuZ2luZyBzd2l0Y2guCitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgYSAtTyBmbGFnIG11bmdpbmcgaXMgcmVxdWVzdGVkXSkKK0FDX0FSR19FTkFCTEUoW08tZmxhZy1tdW5naW5nXSwKKyAgICAgICAgICAgICAgQUNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1PLWZsYWctbXVuZ2luZ10sCisgICAgICAgICAgICAgICAgIFtEaXNhYmxlIG1vZGlmaWNhdGlvbiBvZiB0aGUgY2MgLU8gZmxhZ10pLAorICAgICAgICAgICAgICBbZW5hYmxlX29fZmxhZ19tdW5naW5nPSRlbmFibGV2YWxdLAorICAgICAgICAgICAgICBbZW5hYmxlX29fZmxhZ19tdW5naW5nPXllc10pCitBQ19NU0dfUkVTVUxUKCRlbmFibGVfb19mbGFnX211bmdpbmcpCitBTV9DT05ESVRJT05BTChFTkFCTEVfT19GTEFHX01VTkdJTkcsIHRlc3QgIiRlbmFibGVfb19mbGFnX211bmdpbmciID0gInllcyIpCisKKworQUNfREVGSU5FX1VOUVVPVEVEKFBSSU5UQUJMRV9PU19OQU1FLCAiJFBSSU5UQUJMRV9PU19OQU1FIiwKKyAgICAgICAgICAgICAgICAgICBbQSBodW1hbiByZWFkYWJsZSB0ZXh0IHdpdGggdGhlIG5hbWUgb2YgdGhlIE9TXSkKKworIyBGb3Igc29tZSBzeXN0ZW1zIHdlIGtub3cgdGhhdCB3ZSBoYXZlIGxkX3ZlcnNpb24gc2NyaXB0cy4gIAorIyBVc2UgaXQgdGhlbiBhcyBkZWZhdWx0LgoraGF2ZV9sZF92ZXJzaW9uX3NjcmlwdD1ubworY2FzZSAiJHtob3N0fSIgaW4KKyAgICAqLSotbGludXgqKQorCWhhdmVfbGRfdmVyc2lvbl9zY3JpcHQ9eWVzCisgICAgICAgIDs7CisgICAgKi0qLWdudSopCisJaGF2ZV9sZF92ZXJzaW9uX3NjcmlwdD15ZXMKKyAgICAgICAgOzsKK2VzYWMKK0FDX0FSR19FTkFCTEUoW2xkLXZlcnNpb24tc2NyaXB0XSwKKyAgICAgICAgICAgICAgQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWxkLXZlcnNpb24tc2NyaXB0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2VuYWJsZS9kaXNhYmxlIHVzZSBvZiBsaW5rZXIgdmVyc2lvbiBzY3JpcHQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCBpcyBzeXN0ZW0gZGVwZW5kZW50KV0pLAorICAgICAgICAgICAgICBbaGF2ZV9sZF92ZXJzaW9uX3NjcmlwdD0kZW5hYmxldmFsXSwKKyAgICAgICAgICAgICAgWyA6IF0gKQorQU1fQ09ORElUSU9OQUwoSEFWRV9MRF9WRVJTSU9OX1NDUklQVCwgdGVzdCAiJGhhdmVfbGRfdmVyc2lvbl9zY3JpcHQiID0gInllcyIpCisKK0FDX0RFRklORV9VTlFVT1RFRChOQU1FX09GX0RFVl9SQU5ET00sICIkTkFNRV9PRl9ERVZfUkFORE9NIiwKKyAgICAgICAgICAgICAgICAgICBbZGVmaW5lZCB0byB0aGUgbmFtZSBvZiB0aGUgc3Ryb25nIHJhbmRvbSBkZXZpY2VdKQorQUNfREVGSU5FX1VOUVVPVEVEKE5BTUVfT0ZfREVWX1VSQU5ET00sICIkTkFNRV9PRl9ERVZfVVJBTkRPTSIsCisgICAgICAgICAgICAgICAgICAgW2RlZmluZWQgdG8gdGhlIG5hbWUgb2YgdGhlIHdlYWtlciByYW5kb20gZGV2aWNlXSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyBDaGVja3MgZm9yIGxpYnJhcmllcy4gIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjCisjIGdwZy1lcnJvciBpcyByZXF1aXJlZC4KKyMKK0FNX1BBVEhfR1BHX0VSUk9SKCIkTkVFRF9HUEdfRVJST1JfVkVSU0lPTiIpCitpZiB0ZXN0ICJ4JEdQR19FUlJPUl9MSUJTIiA9ICJ4IjsgdGhlbgorICBBQ19NU0dfRVJST1IoW2xpYmdwZy1lcnJvciBpcyBuZWVkZWQuCisgICAgICAgICAgICAgICAgU2VlIGZ0cDovL2Z0cC5nbnVwZy5vcmcvZ2NyeXB0L2xpYmdwZy1lcnJvci8gLl0pCitmaQorCitBQ19ERUZJTkUoR1BHX0VSUl9TT1VSQ0VfREVGQVVMVCwgR1BHX0VSUl9TT1VSQ0VfR0NSWVBULAorICAgICAgICAgIFtUaGUgZGVmYXVsdCBlcnJvciBzb3VyY2UgZm9yIGxpYmdjcnlwdC5dKQorCisjCisjIENoZWNrIHdoZXRoZXIgdGhlIEdOVSBQdGggbGlicmFyeSBpcyBhdmFpbGFibGUuICBXZSByZXF1aXJlIHRoaXMgCisjIHRvIGJ1aWxkIHRoZSBvcHRpb25hbCBnY3J5cHRybmQgcHJvZ3JhbS4KKyMKK0FDX0FSR19XSVRIKHB0aC1wcmVmaXgsCisgICAgICAgICAgICBBQ19IRUxQX1NUUklORyhbLS13aXRoLXB0aC1wcmVmaXg9UEZYXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcmVmaXggd2hlcmUgR05VIFB0aCBpcyBpbnN0YWxsZWQgKG9wdGlvbmFsKV0pLAorICAgICBwdGhfY29uZmlnX3ByZWZpeD0iJHdpdGh2YWwiLCBwdGhfY29uZmlnX3ByZWZpeD0iIikKK2lmIHRlc3QgeCRwdGhfY29uZmlnX3ByZWZpeCAhPSB4IDsgdGhlbgorICAgUFRIX0NPTkZJRz0iJHB0aF9jb25maWdfcHJlZml4L2Jpbi9wdGgtY29uZmlnIgorZmkKK2lmIHRlc3QgIiR1c2VfcmFuZG9tX2RhZW1vbiIgPSAieWVzIjsgdGhlbgorICBBQ19QQVRIX1BST0coUFRIX0NPTkZJRywgcHRoLWNvbmZpZywgbm8pCisgIGlmIHRlc3QgIiRQVEhfQ09ORklHIiA9ICJubyI7IHRoZW4KKyAgICBBQ19NU0dfV0FSTihbWworKioqCisqKiogVG8gYnVpbGQgdGhlIExpYmdjcnlwdCdzIHJhbmRvbSBudW1iZXIgZGFlbW9uCisqKiogd2UgbmVlZCB0aGUgc3VwcG9ydCBvZiB0aGUgR05VIFBvcnRhYmxlIFRocmVhZHMgTGlicmFyeS4KKyoqKiBEb3dubG9hZCBpdCBmcm9tIGZ0cDovL2Z0cC5nbnUub3JnL2dudS9wdGgvCisqKiogT24gYSBEZWJpYW4gR05VL0xpbnV4IHN5c3RlbSB5b3UgbWlnaHQgd2FudCB0byB0cnkgCisqKiogICBhcHQtZ2V0IGluc3RhbGwgbGlicHRoLWRldgorKioqXV0pCisgIGVsc2UKKyAgICBHTlVQR19QVEhfVkVSU0lPTl9DSEVDSyhbMS4zLjddKQorICAgIGlmIHRlc3QgJGhhdmVfcHRoID0geWVzOyB0aGVuICAgICAgCisgICAgICAgUFRIX0NGTEFHUz1gJFBUSF9DT05GSUcgLS1jZmxhZ3NgCisgICAgICAgUFRIX0xJQlM9YCRQVEhfQ09ORklHIC0tbGRmbGFnc2AKKyAgICAgICBQVEhfTElCUz0iJFBUSF9MSUJTIGAkUFRIX0NPTkZJRyAtLWxpYnMgLS1hbGxgIgorICAgICAgIEFDX0RFRklORShVU0VfR05VX1BUSCwgMSwKKyAgICAgICAgICAgICAgICBbRGVmaW5lZCBpZiB0aGUgR05VIFBvcnRhYmxlIFRocmVhZCBMaWJyYXJ5IHNob3VsZCBiZSB1c2VkXSkKKyAgICAgICBBQ19ERUZJTkUoSEFWRV9QVEgsIDEsCisgICAgICAgICAgICAgICAgW0RlZmluZWQgaWYgdGhlIEdOVSBQdGggaXMgYXZhaWxhYmxlXSkKKyAgICBmaQorICBmaQorZmkKK0FDX1NVQlNUKFBUSF9DRkxBR1MpCitBQ19TVUJTVChQVEhfTElCUykKKworCisjIFNvbGFyaXMgbmVlZHMgLWxzb2NrZXQgYW5kIC1sbnNsLiBVbmlzeXMgc3lzdGVtIGluY2x1ZGVzCisjIGdldGhvc3RieW5hbWUgaW4gbGlic29ja2V0IGJ1dCBuZWVkcyBsaWJuc2wgZm9yIHNvY2tldC4KK0FDX1NFQVJDSF9MSUJTKHNldHNvY2tvcHQsIFtzb2NrZXRdLCAsCisJW0FDX1NFQVJDSF9MSUJTKHNldHNvY2tvcHQsIFtzb2NrZXRdLCAsICwgWy1sbnNsXSldKQorQUNfU0VBUkNIX0xJQlMoc2V0c29ja29wdCwgW25zbF0pCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMgQ2hlY2tzIGZvciBoZWFkZXIgZmlsZXMuICMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworQUNfSEVBREVSX1NUREMKK0FDX0NIRUNLX0hFQURFUlModW5pc3RkLmggc3lzL3NlbGVjdC5oKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMgQ2hlY2tzIGZvciB0eXBlZGVmcywgc3RydWN0dXJlcywgIyMjIworIyMjIyAgYW5kIGNvbXBpbGVyIGNoYXJhY3RlcmlzdGljcy4gICAjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworQUNfQ19DT05TVAorQUNfQ19JTkxJTkUKK0FDX1RZUEVfU0laRV9UCitBQ19UWVBFX1NJR05BTAorQUNfREVDTF9TWVNfU0lHTElTVAorCitHTlVQR19DSEVDS19UWVBFREVGKGJ5dGUsIEhBVkVfQllURV9UWVBFREVGKQorR05VUEdfQ0hFQ0tfVFlQRURFRih1c2hvcnQsIEhBVkVfVVNIT1JUX1RZUEVERUYpCitHTlVQR19DSEVDS19UWVBFREVGKHVsb25nLCBIQVZFX1VMT05HX1RZUEVERUYpCitHTlVQR19DSEVDS19UWVBFREVGKHUxNiwgSEFWRV9VMTZfVFlQRURFRikKK0dOVVBHX0NIRUNLX1RZUEVERUYodTMyLCBIQVZFX1UzMl9UWVBFREVGKQorCitnbF9UWVBFX1NPQ0tMRU5fVAorY2FzZSAiJHtob3N0fSIgaW4KKyAgKi0qLW1pbmd3MzIqKQorICAgICMgc29ja2xlbl90IG1heSBvciBtYXkgbm90IGJlIGRlZmluZWQgZGVwZW5kaW5nIG9uIHdoYXQgaGVhZGVycworICAgICMgYXJlIGluY2x1ZGVkLiAgVG8gYmUgc2FmZSB3ZSB1c2UgaW50IGFzIHRoaXMgaXMgdGhlIGFjdHVhbCB0eXBlLgorICAgIEZBTExCQUNLX1NPQ0tMRU5fVD0idHlwZWRlZiBpbnQgZ2NyeV9zb2NrbGVuX3Q7IgorICAgIDs7CisgICopCisgICAgaWYgdGVzdCAiLiRnbF9jdl9zb2NrbGVuX3RfZXF1aXYiID0gIi4iOyB0aGVuCisgICAgICBGQUxMQkFDS19TT0NLTEVOX1Q9InR5cGVkZWYgc29ja2xlbl90IGdjcnlfc29ja2xlbl90OyIKKyAgICBlbHNlCisgICAgICBGQUxMQkFDS19TT0NLTEVOX1Q9InR5cGVkZWYgJHtnbF9jdl9zb2NrbGVuX3RfZXF1aXZ9IGdjcnlfc29ja2xlbl90OyIKKyAgICBmaQorZXNhYworQUNfU1VCU1QoRkFMTEJBQ0tfU09DS0xFTl9UKQorICAgICAgICAgICAgCisjICAgICAgICAgICAgCisjIENoZWNrIGZvciBFTEYgdmlzaWJpbGl0eSBzdXBwb3J0LgorIworQUNfQ0FDSEVfQ0hFQ0sod2hldGhlciB0aGUgdmlzaWJpbGl0eSBhdHRyaWJ1dGUgaXMgc3VwcG9ydGVkLAorICAgICAgIGdjcnlfY3ZfdmlzaWJpbGl0eV9hdHRyaWJ1dGUsCisgICAgICAgW2djcnlfY3ZfdmlzaWJpbGl0eV9hdHRyaWJ1dGU9bm8KKyAgICAgICAgQUNfTEFOR19DT05GVEVTVChbQUNfTEFOR19TT1VSQ0UoCisgICAgICAgICAgW1tpbnQgZm9vIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiaGlkZGVuIikpKSA9IDE7CisgICAgICAgICAgICBpbnQgYmFyIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgicHJvdGVjdGVkIikpKSA9IDE7CisgICAgICAgICAgXV0pXSkKKyAgICAgICAgCisgICAgICAgIGlmICR7Q0MtY2N9IC1XZXJyb3IgLVMgY29uZnRlc3QuYyAtbyBjb25mdGVzdC5zIFwKKyAgICAgICAgICAgICAgICAgIDE+JkFTX01FU1NBR0VfTE9HX0ZEIDI+JkFTX01FU1NBR0VfTE9HX0ZEIDsgdGhlbgorICAgICAgICAgICAgaWYgZ3JlcCAnXC5oaWRkZW4uKmZvbycgY29uZnRlc3QucyA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCisgICAgICAgICAgICAgICAgaWYgZ3JlcCAnXC5wcm90ZWN0ZWQuKmJhcicgY29uZnRlc3QucyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgZ2NyeV9jdl92aXNpYmlsaXR5X2F0dHJpYnV0ZT15ZXMKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZmkgIAorICAgICAgICBmaSAgCisgICAgICAgXSkKK2lmIHRlc3QgIiRnY3J5X2N2X3Zpc2liaWxpdHlfYXR0cmlidXRlIiA9ICJ5ZXMiOyB0aGVuCisgICAgQUNfQ0FDSEVfQ0hFQ0soZm9yIGJyb2tlbiB2aXNpYmlsaXR5IGF0dHJpYnV0ZSwKKyAgICAgICBnY3J5X2N2X2Jyb2tlbl92aXNpYmlsaXR5X2F0dHJpYnV0ZSwKKyAgICAgICBbZ2NyeV9jdl9icm9rZW5fdmlzaWJpbGl0eV9hdHRyaWJ1dGU9eWVzCisgICAgICAgIEFDX0xBTkdfQ09ORlRFU1QoW0FDX0xBTkdfU09VUkNFKAorICAgICAgICAgIFtbaW50IGZvbyAoaW50IHgpOworICAgICAgICAgICAgaW50IGJhciAoaW50IHgpIF9fYXNtX18gKCJmb28iKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiaGlkZGVuIikpKTsKKyAgICAgICAgICAgIGludCBiYXIgKGludCB4KSB7IHJldHVybiB4OyB9CisgICAgICAgICAgXV0pXSkKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICBpZiAke0NDLWNjfSAtV2Vycm9yIC1TIGNvbmZ0ZXN0LmMgLW8gY29uZnRlc3QucyBcCisgICAgICAgICAgICAgICAgICAxPiZBU19NRVNTQUdFX0xPR19GRCAyPiZBU19NRVNTQUdFX0xPR19GRCA7IHRoZW4KKyAgICAgICAgICAgaWYgZ3JlcCAnXC5oaWRkZW5APDpAIAlfQDo+QGZvbycgY29uZnRlc3QucyA+L2Rldi9udWxsIDI+JjE7CisgICAgICAgICAgICB0aGVuCisgICAgICAgICAgICAgICBnY3J5X2N2X2Jyb2tlbl92aXNpYmlsaXR5X2F0dHJpYnV0ZT1ubworICAgICAgICAgICBmaQorICAgICAgICBmaQorICAgICAgIF0pCitmaQoraWYgdGVzdCAiJGdjcnlfY3ZfdmlzaWJpbGl0eV9hdHRyaWJ1dGUiID0gInllcyI7IHRoZW4KKyAgICBBQ19DQUNIRV9DSEVDSyhmb3IgYnJva2VuIGFsaWFzIGF0dHJpYnV0ZSwKKyAgICAgICBnY3J5X2N2X2Jyb2tlbl9hbGlhc19hdHRyaWJ1dGUsCisgICAgICAgW2djcnlfY3ZfYnJva2VuX2FsaWFzX2F0dHJpYnV0ZT15ZXMKKyAgICAgICAgQUNfTEFOR19DT05GVEVTVChbQUNfTEFOR19TT1VSQ0UoCisgICAgICAgICAgW1tleHRlcm4gaW50IGZvbyAoaW50IHgpIF9fYXNtICgieHl6enkiKTsKKyAgICAgICAgICAgIGludCBiYXIgKGludCB4KSB7IHJldHVybiB4OyB9CisgICAgICAgICAgICBleHRlcm4gX190eXBlb2YgKGJhcikgZm9vIF9fYXR0cmlidXRlICgod2VhaywgYWxpYXMgKCJiYXIiKSkpOworICAgICAgICAgICAgZXh0ZXJuIGludCBkZm9vOworICAgICAgICAgICAgZXh0ZXJuIF9fdHlwZW9mIChkZm9vKSBkZm9vIF9fYXNtICgiYWJjY2IiKTsKKyAgICAgICAgICAgIGludCBkZm9vID0gMTsKKyAgICAgICAgICBdXSldKQorCisgICAgICAgIGlmICR7Q0MtY2N9IC1XZXJyb3IgLVMgY29uZnRlc3QuYyAtbyBjb25mdGVzdC5zIFwKKyAgICAgICAgICAgICAgICAgIDE+JkFTX01FU1NBR0VfTE9HX0ZEIDI+JkFTX01FU1NBR0VfTE9HX0ZEIDsgdGhlbgorICAgICAgICAgICBpZiBncmVwICd4eXp6eScgY29uZnRlc3QucyA+L2Rldi9udWxsIDI+JjEgJiYgXAorICAgICAgICAgICAgICBncmVwICdhYmNjYicgY29uZnRlc3QucyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgICAgICAgICAgZ2NyeV9jdl9icm9rZW5fYWxpYXNfYXR0cmlidXRlPW5vCisgICAgICAgICAgIGZpCisgICAgICAgIGZpCisgICAgICAgIF0pCitmaQoraWYgdGVzdCAiJGdjcnlfY3ZfdmlzaWJpbGl0eV9hdHRyaWJ1dGUiID0gInllcyI7IHRoZW4KKyAgICBBQ19DQUNIRV9DSEVDSyhpZiBnY2Mgc3VwcG9ydHMgLWZ2aXNpYmlsaXR5PWhpZGRlbiwKKyAgICAgICBnY3J5X2N2X2djY19oYXNfZl92aXNpYmlsaXR5LAorICAgICAgIFtnY3J5X2N2X2djY19oYXNfZl92aXNpYmlsaXR5PW5vCisgICAgICAgIF9nY2NfY2ZsYWdzX3NhdmU9JENGTEFHUworICAgICAgICBDRkxBR1M9Ii1mdmlzaWJpbGl0eT1oaWRkZW4iCisgICAgICAgIEFDX0NPTVBJTEVfSUZFTFNFKEFDX0xBTkdfUFJPR1JBTShbXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfY3ZfZ2NjX2hhc19mX3Zpc2liaWxpdHk9eWVzKQorICAgICAgICBDRkxBR1M9JF9nY2NfY2ZsYWdzX3NhdmU7CisgICAgICAgXSkKK2ZpCitpZiB0ZXN0ICIkZ2NyeV9jdl92aXNpYmlsaXR5X2F0dHJpYnV0ZSIgPSAieWVzIiBcCisgICAmJiB0ZXN0ICIkZ2NyeV9jdl9icm9rZW5fdmlzaWJpbGl0eV9hdHRyaWJ1dGUiICE9ICJ5ZXMiIFwKKyAgICYmIHRlc3QgIiRnY3J5X2N2X2Jyb2tlbl9hbGlhc19hdHRyaWJ1dGUiICE9ICJ5ZXMiIFwKKyAgICYmIHRlc3QgIiRnY3J5X2N2X2djY19oYXNfZl92aXNpYmlsaXR5IiA9ICJ5ZXMiICAKKyB0aGVuCisgICBBQ19ERUZJTkUoR0NSWV9VU0VfVklTSUJJTElUWSwgMSwKKyAgICAgICAgICAgICAgIFtEZWZpbmUgdG8gdXNlIHRoZSBHTlUgQyB2aXNpYmlsaXR5IGF0dHJpYnV0ZS5dKQorICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1mdmlzaWJpbGl0eT1oaWRkZW4iCitmaQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyBDaGVja3MgZm9yIGxpYnJhcnkgZnVuY3Rpb25zLiAjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworQUNfRlVOQ19WUFJJTlRGCisjIFdlIGhhdmUgcmVwbGFjZW1lbnRzIGZvciB0aGVzZSBpbiBzcmMvbWlzc2luZy1zdHJpbmcuYworQUNfQ0hFQ0tfRlVOQ1Moc3RwY3B5IHN0cmNhc2VjbXApCisjIFdlIGhhdmUgcmVwbGFjZW1lbnRzIGZvciB0aGVzZSBpbiBzcmMvZzEwbGliLmgKK0FDX0NIRUNLX0ZVTkNTKHN0cnRvdWwgbWVtbW92ZSBzdHJpY21wIGF0ZXhpdCByYWlzZSkKKyMgT3RoZXIgY2hlY2tzCitBQ19DSEVDS19GVU5DUyhzdHJlcnJvciByYW5kIG1tYXAgZ2V0cGFnZXNpemUgc3lzY29uZiB3YWl0cGlkIHdhaXQ0KQorQUNfQ0hFQ0tfRlVOQ1MoZ2V0dGltZW9mZGF5IGdldHJ1c2FnZSBnZXRocnRpbWUgY2xvY2tfZ2V0dGltZSBzeXNsb2cpCitBQ19DSEVDS19GVU5DUyhmY250bCBmdHJ1bmNhdGUpCisKK0dOVVBHX0NIRUNLX01MT0NLCisKKworIworIyBDaGVjayB3ZXRoZXIgaXQgaXMgbmVjZXNzYXJ5IHRvIGxpbmsgYWdhaW5zdCBsaWJkbC4KKyMKK0RMX0xJQlM9IiIKK2lmIHRlc3QgIiR1c2VfaG1hY19iaW5hcnlfY2hlY2siID0geWVzIDsgdGhlbgorICBfZ2NyeV9zYXZlX2xpYnM9IiRMSUJTIgorICBMSUJTPSIiCisgIEFDX1NFQVJDSF9MSUJTKGRsb3BlbiwgYyBkbCwsLCkKKyAgRExfTElCUz0kTElCUworICBMSUJTPSIkX2djcnlfc2F2ZV9saWJzIgorICBMSUJHQ1JZUFRfQ09ORklHX0xJQlM9IiR7TElCR0NSWVBUX0NPTkZJR19MSUJTfSAke0RMX0xJQlN9IgorZmkKK0FDX1NVQlNUKERMX0xJQlMpCisKKworIworIyBDaGVjayB3aGV0aGVyIHdlIGNhbiB1c2UgTGludXggY2FwYWJpbGl0aWVzIGFzIHJlcXVlc3RlZC4KKyMKK2lmIHRlc3QgIiR1c2VfY2FwYWJpbGl0aWVzIiA9ICJ5ZXMiIDsgdGhlbgordXNlX2NhcGFiaWxpdGllcz1ubworQUNfQ0hFQ0tfSEVBREVSUyhzeXMvY2FwYWJpbGl0eS5oKQoraWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9zeXNfY2FwYWJpbGl0eV9oIiA9ICJ5ZXMiIDsgdGhlbgorICBBQ19DSEVDS19MSUIoY2FwLCBjYXBfaW5pdCwgYWNfbmVlZF9saWJjYXA9MSkKKyAgaWYgdGVzdCAiJGFjX2N2X2xpYl9jYXBfY2FwX2luaXQiID0gInllcyI7IHRoZW4KKyAgICAgQUNfREVGSU5FKFVTRV9DQVBBQklMSVRJRVMsMSwKKyAgICAgICAgICAgICAgIFtkZWZpbmUgaWYgY2FwYWJpbGl0aWVzIHNob3VsZCBiZSB1c2VkXSkKKyAgICAgTElCUz0iJExJQlMgLWxjYXAiCisgICAgIHVzZV9jYXBhYmlsaXRpZXM9eWVzCisgIGZpCitmaQoraWYgdGVzdCAiJHVzZV9jYXBhYmlsaXRpZXMiID0gIm5vIiA7IHRoZW4KKyAgICBBQ19NU0dfV0FSTihbWworKioqCisqKiogVGhlIHVzZSBvZiBjYXBhYmlsaXRpZXMgb24gdGhpcyBzeXN0ZW0gaXMgbm90IHBvc3NpYmxlLgorKioqIFlvdSBuZWVkIGEgcmVjZW50IExpbnV4IGtlcm5lbCBhbmQgc29tZSBwYXRjaGVzOgorKioqICAgZmNhcHMtMi4yLjktOTkwNjEwLnBhdGNoICAgICAgKGtlcm5lbCBwYXRjaCBmb3IgMi4yLjkpCisqKiogICBmY2FwLW1vZHVsZS05OTA2MTMudGFyLmd6ICAgICAoa2VybmVsIG1vZHVsZSkKKyoqKiAgIGxpYmNhcC0xLjkyLnRhci5neiAgICAgICAgICAgICh1c2VyIG1vZGUgbGlicmFyeSBhbmQgdXRpbGl0aWVzKQorKioqIEFuZCB5b3UgaGF2ZSB0byBjb25maWd1cmUgdGhlIGtlcm5lbCB3aXRoIENPTkZJR19WRlNfQ0FQX1BMVUdJTgorKioqIHNldCAoZmlsZXN5c3RlbXMgbWVudSkuIEJlIHdhcm5lZDogVGhpcyBjb2RlIGlzICpyZWFsbHkqIEFMUEhBLgorKioqXV0pCitmaQorZmkKKworIyBDaGVjayB3aGV0aGVyIGEgcmFuZG9tIGRldmljZSBpcyBhdmFpbGFibGUuCitpZiB0ZXN0ICIkdHJ5X2Rldl9yYW5kb20iID0geWVzIDsgdGhlbgorICAgIEFDX0NBQ0hFX0NIRUNLKGZvciByYW5kb20gZGV2aWNlLCBhY19jdl9oYXZlX2Rldl9yYW5kb20sCisgICAgW2lmIHRlc3QgLXIgIiROQU1FX09GX0RFVl9SQU5ET00iICYmIHRlc3QgLXIgIiROQU1FX09GX0RFVl9VUkFORE9NIiA7IHRoZW4KKyAgICAgIGFjX2N2X2hhdmVfZGV2X3JhbmRvbT15ZXM7IGVsc2UgYWNfY3ZfaGF2ZV9kZXZfcmFuZG9tPW5vOyBmaV0pCisgICAgaWYgdGVzdCAiJGFjX2N2X2hhdmVfZGV2X3JhbmRvbSIgPSB5ZXM7IHRoZW4KKyAgICAgICAgQUNfREVGSU5FKEhBVkVfREVWX1JBTkRPTSwxLAorICAgICAgICAgICAgICAgICBbZGVmaW5lZCBpZiB0aGUgc3lzdGVtIHN1cHBvcnRzIGEgcmFuZG9tIGRldmljZV0gKQorICAgIGZpCitlbHNlCisgICAgQUNfTVNHX0NIRUNLSU5HKGZvciByYW5kb20gZGV2aWNlKQorICAgIGFjX2N2X2hhdmVfZGV2X3JhbmRvbT1ubworICAgIEFDX01TR19SRVNVTFQoaGFzIGJlZW4gZGlzYWJsZWQpCitmaQorCisjIEZpZ3VyZSBvdXQgdGhlIHJhbmRvbSBtb2R1bGVzIGZvciB0aGlzIGNvbmZpZ3VyYXRpb24uCitpZiB0ZXN0ICIkcmFuZG9tIiA9ICJkZWZhdWx0IjsgdGhlbgorCisgICAgIyBTZWxlY3QgZGVmYXVsdCB2YWx1ZS4KKyAgICBpZiB0ZXN0ICIkYWNfY3ZfaGF2ZV9kZXZfcmFuZG9tIiA9IHllczsgdGhlbgorICAgICAgICAjIFRyeSBMaW51eGlzaCByYW5kb20gZGV2aWNlLgorICAgICAgICByYW5kb21fbW9kdWxlcz0ibGludXgiCisgICAgZWxzZQorICAgICAgICBjYXNlICIke2hvc3R9IiBpbgorICAgICAgICAqLSotbWluZ3czMip8Ki0qLWN5Z3dpbiopCisgICAgICAgICAgIyBXaW5kb3dzIHJhbmRvbSBkZXZpY2UuCisgICAgICAgICAgcmFuZG9tX21vZHVsZXM9InczMiIKKyAgICAgICAgICA7OworICAgICAgICAqKQorICAgICAgICAgICMgQnVpbGQgZXZlcnl0aGluZywgYWxsb3cgdG8gc2VsZWN0IGF0IHJ1bnRpbWUuCisgICAgICAgICAgcmFuZG9tX21vZHVsZXM9IiRhdXRvX3JhbmRvbV9tb2R1bGVzIgorICAgICAgICAgIDs7CisgICAgICAgIGVzYWMgICAgCisgICAgZmkKK2Vsc2UKKyAgICBpZiB0ZXN0ICIkcmFuZG9tIiA9ICJhdXRvIjsgdGhlbgorICAgICAgICAjIEJ1aWxkIGV2ZXJ5dGhpbmcsIGFsbG93IHRvIHNlbGVjdCBhdCBydW50aW1lLgorICAgICAgICByYW5kb21fbW9kdWxlcz0iJGF1dG9fcmFuZG9tX21vZHVsZXMiCisgICAgZWxzZQorICAgICAgICByYW5kb21fbW9kdWxlcz0iJHJhbmRvbSIKKyAgICBmaQorZmkKKworCisjCisjIFNldHVwIGFzc2VtYmxlciBzdHVmZi4KKyMKK0dOVVBHX1NZU19TWU1CT0xfVU5ERVJTQ09SRSgpCitBQ19BUkdfRU5BQkxFKG1waS1wYXRoLAorICAgICAgICAgICAgICBBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtbXBpLXBhdGg9RVhUUkFfUEFUSF0sCisJICAgICAgW3ByZXBlbmQgRVhUUkFfUEFUSCB0byBsaXN0IG9mIENQVSBzcGVjaWZpYyBvcHRpbWl6YXRpb25zXSksCisJICAgICAgbXBpX2V4dHJhX3BhdGg9IiRlbmFibGV2YWwiLG1waV9leHRyYV9wYXRoPSIiKQorQUNfTVNHX0NIRUNLSU5HKGZvciBtcGkgYXNzZW1ibGVyIGZ1bmN0aW9ucykKK2lmIHRlc3QgLWYgJHNyY2Rpci9tcGkvY29uZmlnLmxpbmtzIDsgdGhlbgorICAgIC4gJHNyY2Rpci9tcGkvY29uZmlnLmxpbmtzCisgICAgQUNfQ09ORklHX0xJTktTKCIkbXBpX2xuX2xpc3QiKQorICAgIGFjX2N2X21waV9zZmxhZ3M9IiRtcGlfc2ZsYWdzIgorICAgIEFDX01TR19SRVNVTFQoZG9uZSkKK2Vsc2UKKyAgICBBQ19NU0dfUkVTVUxUKGZhaWxlZCkKKyAgICBBQ19NU0dfRVJST1IoW21waS9jb25maWcubGlua3MgbWlzc2luZyFdKQorZmkKK01QSV9TRkxBR1M9IiRhY19jdl9tcGlfc2ZsYWdzIgorQUNfU1VCU1QoTVBJX1NGTEFHUykKKworQU1fQ09ORElUSU9OQUwoTVBJX01PRF9BU01fTVBJSF9BREQxLCB0ZXN0ICIkbXBpX21vZF9hc21fbXBpaF9hZGQxIiA9IHllcykKK0FNX0NPTkRJVElPTkFMKE1QSV9NT0RfQVNNX01QSUhfU1VCMSwgdGVzdCAiJG1waV9tb2RfYXNtX21waWhfc3ViMSIgPSB5ZXMpCitBTV9DT05ESVRJT05BTChNUElfTU9EX0FTTV9NUElIX01VTDEsIHRlc3QgIiRtcGlfbW9kX2FzbV9tcGloX211bDEiID0geWVzKQorQU1fQ09ORElUSU9OQUwoTVBJX01PRF9BU01fTVBJSF9NVUwyLCB0ZXN0ICIkbXBpX21vZF9hc21fbXBpaF9tdWwyIiA9IHllcykKK0FNX0NPTkRJVElPTkFMKE1QSV9NT0RfQVNNX01QSUhfTVVMMywgdGVzdCAiJG1waV9tb2RfYXNtX21waWhfbXVsMyIgPSB5ZXMpCitBTV9DT05ESVRJT05BTChNUElfTU9EX0FTTV9NUElIX0xTSElGVCwgdGVzdCAiJG1waV9tb2RfYXNtX21waWhfbHNoaWZ0IiA9IHllcykKK0FNX0NPTkRJVElPTkFMKE1QSV9NT0RfQVNNX01QSUhfUlNISUZULCB0ZXN0ICIkbXBpX21vZF9hc21fbXBpaF9yc2hpZnQiID0geWVzKQorQU1fQ09ORElUSU9OQUwoTVBJX01PRF9BU01fVURJViwgdGVzdCAiJG1waV9tb2RfYXNtX3VkaXYiID0geWVzKQorQU1fQ09ORElUSU9OQUwoTVBJX01PRF9BU01fVURJVl9RUk5ORCwgdGVzdCAiJG1waV9tb2RfYXNtX3VkaXZfcXJubmQiID0geWVzKQorQU1fQ09ORElUSU9OQUwoTVBJX01PRF9DX01QSUhfQUREMSwgdGVzdCAiJG1waV9tb2RfY19tcGloX2FkZDEiID0geWVzKQorQU1fQ09ORElUSU9OQUwoTVBJX01PRF9DX01QSUhfU1VCMSwgdGVzdCAiJG1waV9tb2RfY19tcGloX3N1YjEiID0geWVzKQorQU1fQ09ORElUSU9OQUwoTVBJX01PRF9DX01QSUhfTVVMMSwgdGVzdCAiJG1waV9tb2RfY19tcGloX211bDEiID0geWVzKQorQU1fQ09ORElUSU9OQUwoTVBJX01PRF9DX01QSUhfTVVMMiwgdGVzdCAiJG1waV9tb2RfY19tcGloX211bDIiID0geWVzKQorQU1fQ09ORElUSU9OQUwoTVBJX01PRF9DX01QSUhfTVVMMywgdGVzdCAiJG1waV9tb2RfY19tcGloX211bDMiID0geWVzKQorQU1fQ09ORElUSU9OQUwoTVBJX01PRF9DX01QSUhfTFNISUZULCB0ZXN0ICIkbXBpX21vZF9jX21waWhfbHNoaWZ0IiA9IHllcykKK0FNX0NPTkRJVElPTkFMKE1QSV9NT0RfQ19NUElIX1JTSElGVCwgdGVzdCAiJG1waV9tb2RfY19tcGloX3JzaGlmdCIgPSB5ZXMpCitBTV9DT05ESVRJT05BTChNUElfTU9EX0NfVURJViwgdGVzdCAiJG1waV9tb2RfY191ZGl2IiA9IHllcykKK0FNX0NPTkRJVElPTkFMKE1QSV9NT0RfQ19VRElWX1FSTk5ELCB0ZXN0ICIkbXBpX21vZF9jX3VkaXZfcXJubmQiID0geWVzKQorCitpZiB0ZXN0ICIkaXNfZGV2ZWxvcG1lbnRfdmVyc2lvbiIgPSAieWVzIjsgdGhlbgorICAgIEFDX0RFRklORShJU19ERVZFTE9QTUVOVF9WRVJTSU9OLDEsCisgICAgICAgICAgICAgIFtEZWZpbmVkIGlmIHRoaXMgaXMgbm90IGEgcmVndWxhciByZWxlYXNlXSkKK2ZpCisKKworQU1fQ09ORElUSU9OQUwoQ1JPU1NfQ09NUElMSU5HLCB0ZXN0IHgkY3Jvc3NfY29tcGlsaW5nID0geHllcykKKworCisjIFRoaXMgaXMgaGFuZHkgZm9yIGRlYnVnZ2luZyBzbyB0aGUgY29tcGlsZXIgZG9lc24ndCByZWFycmFuZ2UKKyMgdGhpbmdzIGFuZCBlbGltaW5hdGUgdmFyaWFibGVzLgorQUNfQVJHX0VOQUJMRShvcHRpbWl6YXRpb24sCisgICAgICAgQUNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1vcHRpbWl6YXRpb25dLAorCQkgICAgICBbZGlzYWJsZSBjb21waWxlciBvcHRpbWl6YXRpb25dKSwKKyAgICAgICAgICAgICAgICAgICAgICBbaWYgdGVzdCAkZW5hYmxldmFsID0gbm8gOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZMQUdTPWBlY2hvICRDRkxBR1MgfCBzZWQgJ3MvLU9bWzAtOV1dLy8nYAorICAgICAgICAgICAgICAgICAgICAgICBmaV0pCisKKyMgQ0ZMQUdTIG1hbmdsaW5nIHdoZW4gdXNpbmcgZ2NjLgoraWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9IiRDRkxBR1MgLVdhbGwiCisgICAgaWYgdGVzdCAiJFVTRV9NQUlOVEFJTkVSX01PREUiID0gInllcyI7IHRoZW4KKyAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1XY2FzdC1hbGlnbiAtV3NoYWRvdyAtV3N0cmljdC1wcm90b3R5cGVzIgorICAgICAgICBDRkxBR1M9IiRDRkxBR1MgLVdmb3JtYXQgLVduby1mb3JtYXQteTJrIC1XZm9ybWF0LXNlY3VyaXR5IgorCisgICAgICAgICMgSWYgLVduby1taXNzaW5nLWZpZWxkLWluaXRpYWxpemVycyBpcyBzdXBwb3J0ZWQgd2UgY2FuIGVuYWJsZSBhIAorICAgICAgICAjIGEgYnVuY2ggb2YgcmVhbGx5IHVzZWZ1bCB3YXJuaW5ncy4KKyAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtpZiBnY2Mgc3VwcG9ydHMgLVduby1taXNzaW5nLWZpZWxkLWluaXRpYWxpemVyc10pCisgICAgICAgIF9nY2NfY2ZsYWdzX3NhdmU9JENGTEFHUworICAgICAgICBDRkxBR1M9Ii1Xbm8tbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMiCisgICAgICAgIEFDX0NPTVBJTEVfSUZFTFNFKEFDX0xBTkdfUFJPR1JBTShbXSksX2djY193b3B0PXllcyxfZ2NjX3dvcHQ9bm8pCisgICAgICAgIEFDX01TR19SRVNVTFQoJF9nY2Nfd29wdCkKKyAgICAgICAgQ0ZMQUdTPSRfZ2NjX2NmbGFnc19zYXZlOworICAgICAgICBpZiB0ZXN0IHgiJF9nY2Nfd29wdCIgPSB4eWVzIDsgdGhlbgorICAgICAgICAgIENGTEFHUz0iJENGTEFHUyAtVyAtV2V4dHJhIC1XYmFkLWZ1bmN0aW9uLWNhc3QiCisgICAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1Xd3JpdGUtc3RyaW5ncyIKKyAgICAgICAgICBDRkxBR1M9IiRDRkxBR1MgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQiCisgICAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1Xbm8tbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMiCisgICAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1Xbm8tc2lnbi1jb21wYXJlIgorICAgICAgICBmaQorCisgICAgICAgIEFDX01TR19DSEVDS0lORyhbaWYgZ2NjIHN1cHBvcnRzIC1XcG9pbnRlci1hcml0aF0pCisgICAgICAgIF9nY2NfY2ZsYWdzX3NhdmU9JENGTEFHUworICAgICAgICBDRkxBR1M9Ii1XcG9pbnRlci1hcml0aCIKKyAgICAgICAgQUNfQ09NUElMRV9JRkVMU0UoQUNfTEFOR19QUk9HUkFNKFtdKSxfZ2NjX3dvcHQ9eWVzLF9nY2Nfd29wdD1ubykKKyAgICAgICAgQUNfTVNHX1JFU1VMVCgkX2djY193b3B0KQorICAgICAgICBDRkxBR1M9JF9nY2NfY2ZsYWdzX3NhdmU7CisgICAgICAgIGlmIHRlc3QgeCIkX2djY193b3B0IiA9IHh5ZXMgOyB0aGVuCisgICAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1XcG9pbnRlci1hcml0aCIKKyAgICAgICAgZmkKKyAgICBmaQorCitmaQorCisjIENoZWNrIHdoZXRoZXIgYXMoMSkgc3VwcG9ydHMgYSBub2VleGVjc3RhY2sgZmVhdHVyZS4gIFRoaXMgdGVzdAorIyBpbmNsdWRlcyBhbiBvdmVycmlkZSBvcHRpb24uCitDTF9BU19OT0VYRUNTVEFDSworCisKK0FDX1NVQlNUKExJQkdDUllQVF9DT05GSUdfQVBJX1ZFUlNJT04pCitBQ19TVUJTVChMSUJHQ1JZUFRfQ09ORklHX0xJQlMpCitBQ19TVUJTVChMSUJHQ1JZUFRfQ09ORklHX0NGTEFHUykKK0FDX1NVQlNUKExJQkdDUllQVF9USFJFQURfTU9EVUxFUykKKworQUNfQ09ORklHX0NPTU1BTkRTKFtnY3J5cHQtY29uZl0sW1sKK2NobW9kICt4IHNyYy9saWJnY3J5cHQtY29uZmlnCitdXSxbWworcHJlZml4PSRwcmVmaXgKK2V4ZWNfcHJlZml4PSRleGVjX3ByZWZpeAorbGliZGlyPSRsaWJkaXIKK2RhdGFkaXI9JGRhdGFkaXIKK0RBVEFESVJOQU1FPSREQVRBRElSTkFNRQorXV0pCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyBDb25jbHVzaW9uLiAjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBEZWZpbmUgY29uZGl0aW9uYWwgc291cmNlcyBhbmQgY29uZmlnLmggc3ltYm9scyBkZXBlbmRpbmcgb24gdGhlCisjIHNlbGVjdGVkIGNpcGhlcnMsIHB1YmtleS1jaXBoZXJzLCBkaWdlc3RzIGFuZCByYW5kb20gbW9kdWxlcy4KKworTElTVF9NRU1CRVIoYXJjZm91ciwgJGVuYWJsZWRfY2lwaGVycykKK2lmIHRlc3QgIiRmb3VuZCIgPSAiMSI7IHRoZW4gCisgICBHQ1JZUFRfQ0lQSEVSUz0iJEdDUllQVF9DSVBIRVJTIGFyY2ZvdXIubG8iCisgICBBQ19ERUZJTkUoVVNFX0FSQ0ZPVVIsIDEsIFtEZWZpbmVkIGlmIHRoaXMgbW9kdWxlIHNob3VsZCBiZSBpbmNsdWRlZF0pCitmaQorCitMSVNUX01FTUJFUihibG93ZmlzaCwgJGVuYWJsZWRfY2lwaGVycykKK2lmIHRlc3QgIiRmb3VuZCIgPSAiMSIgOyB0aGVuCisgICBHQ1JZUFRfQ0lQSEVSUz0iJEdDUllQVF9DSVBIRVJTIGJsb3dmaXNoLmxvIgorICAgQUNfREVGSU5FKFVTRV9CTE9XRklTSCwgMSwgW0RlZmluZWQgaWYgdGhpcyBtb2R1bGUgc2hvdWxkIGJlIGluY2x1ZGVkXSkKK2ZpCisKK0xJU1RfTUVNQkVSKGNhc3Q1LCAkZW5hYmxlZF9jaXBoZXJzKQoraWYgdGVzdCAiJGZvdW5kIiA9ICIxIiA7IHRoZW4KKyAgIEdDUllQVF9DSVBIRVJTPSIkR0NSWVBUX0NJUEhFUlMgY2FzdDUubG8iCisgICBBQ19ERUZJTkUoVVNFX0NBU1Q1LCAxLCBbRGVmaW5lZCBpZiB0aGlzIG1vZHVsZSBzaG91bGQgYmUgaW5jbHVkZWRdKQorZmkKKworTElTVF9NRU1CRVIoZGVzLCAkZW5hYmxlZF9jaXBoZXJzKQoraWYgdGVzdCAiJGZvdW5kIiA9ICIxIiA7IHRoZW4KKyAgIEdDUllQVF9DSVBIRVJTPSIkR0NSWVBUX0NJUEhFUlMgZGVzLmxvIgorICAgQUNfREVGSU5FKFVTRV9ERVMsIDEsIFtEZWZpbmVkIGlmIHRoaXMgbW9kdWxlIHNob3VsZCBiZSBpbmNsdWRlZF0pCitmaQorCitMSVNUX01FTUJFUihhZXMsICRlbmFibGVkX2NpcGhlcnMpCitpZiB0ZXN0ICIkZm91bmQiID0gIjEiIDsgdGhlbgorICAgR0NSWVBUX0NJUEhFUlM9IiRHQ1JZUFRfQ0lQSEVSUyByaWpuZGFlbC5sbyIKKyAgIEFDX0RFRklORShVU0VfQUVTLCAxLCBbRGVmaW5lZCBpZiB0aGlzIG1vZHVsZSBzaG91bGQgYmUgaW5jbHVkZWRdKQorZmkKKworTElTVF9NRU1CRVIodHdvZmlzaCwgJGVuYWJsZWRfY2lwaGVycykKK2lmIHRlc3QgIiRmb3VuZCIgPSAiMSIgOyB0aGVuCisgICBHQ1JZUFRfQ0lQSEVSUz0iJEdDUllQVF9DSVBIRVJTIHR3b2Zpc2gubG8iCisgICBBQ19ERUZJTkUoVVNFX1RXT0ZJU0gsIDEsIFtEZWZpbmVkIGlmIHRoaXMgbW9kdWxlIHNob3VsZCBiZSBpbmNsdWRlZF0pCitmaQorCitMSVNUX01FTUJFUihzZXJwZW50LCAkZW5hYmxlZF9jaXBoZXJzKQoraWYgdGVzdCAiJGZvdW5kIiA9ICIxIiA7IHRoZW4KKyAgIEdDUllQVF9DSVBIRVJTPSIkR0NSWVBUX0NJUEhFUlMgc2VycGVudC5sbyIKKyAgIEFDX0RFRklORShVU0VfU0VSUEVOVCwgMSwgW0RlZmluZWQgaWYgdGhpcyBtb2R1bGUgc2hvdWxkIGJlIGluY2x1ZGVkXSkKK2ZpCisKK0xJU1RfTUVNQkVSKHJmYzIyNjgsICRlbmFibGVkX2NpcGhlcnMpCitpZiB0ZXN0ICIkZm91bmQiID0gIjEiIDsgdGhlbgorICAgR0NSWVBUX0NJUEhFUlM9IiRHQ1JZUFRfQ0lQSEVSUyByZmMyMjY4LmxvIgorICAgQUNfREVGSU5FKFVTRV9SRkMyMjY4LCAxLCBbRGVmaW5lZCBpZiB0aGlzIG1vZHVsZSBzaG91bGQgYmUgaW5jbHVkZWRdKQorZmkKKworTElTVF9NRU1CRVIoc2VlZCwgJGVuYWJsZWRfY2lwaGVycykKK2lmIHRlc3QgIiRmb3VuZCIgPSAiMSIgOyB0aGVuCisgICBHQ1JZUFRfQ0lQSEVSUz0iJEdDUllQVF9DSVBIRVJTIHNlZWQubG8iCisgICBBQ19ERUZJTkUoVVNFX1NFRUQsIDEsIFtEZWZpbmVkIGlmIHRoaXMgbW9kdWxlIHNob3VsZCBiZSBpbmNsdWRlZF0pCitmaQorCitMSVNUX01FTUJFUihjYW1lbGxpYSwgJGVuYWJsZWRfY2lwaGVycykKK2lmIHRlc3QgIiRmb3VuZCIgPSAiMSIgOyB0aGVuCisgICBHQ1JZUFRfQ0lQSEVSUz0iJEdDUllQVF9DSVBIRVJTIGNhbWVsbGlhLmxvIGNhbWVsbGlhLWdsdWUubG8iCisgICBBQ19ERUZJTkUoVVNFX0NBTUVMTElBLCAxLCBbRGVmaW5lZCBpZiB0aGlzIG1vZHVsZSBzaG91bGQgYmUgaW5jbHVkZWRdKQorZmkKKworTElTVF9NRU1CRVIoZHNhLCAkZW5hYmxlZF9wdWJrZXlfY2lwaGVycykKK2lmIHRlc3QgIiRmb3VuZCIgPSAiMSIgOyB0aGVuCisgICBHQ1JZUFRfUFVCS0VZX0NJUEhFUlM9IiRHQ1JZUFRfUFVCS0VZX0NJUEhFUlMgZHNhLmxvIgorICAgQUNfREVGSU5FKFVTRV9EU0EsIDEsIFtEZWZpbmVkIGlmIHRoaXMgbW9kdWxlIHNob3VsZCBiZSBpbmNsdWRlZF0pCitmaQorCitMSVNUX01FTUJFUihyc2EsICRlbmFibGVkX3B1YmtleV9jaXBoZXJzKQoraWYgdGVzdCAiJGZvdW5kIiA9ICIxIiA7IHRoZW4KKyAgIEdDUllQVF9QVUJLRVlfQ0lQSEVSUz0iJEdDUllQVF9QVUJLRVlfQ0lQSEVSUyByc2EubG8iCisgICBBQ19ERUZJTkUoVVNFX1JTQSwgMSwgW0RlZmluZWQgaWYgdGhpcyBtb2R1bGUgc2hvdWxkIGJlIGluY2x1ZGVkXSkKK2ZpCisKK0xJU1RfTUVNQkVSKGVsZ2FtYWwsICRlbmFibGVkX3B1YmtleV9jaXBoZXJzKQoraWYgdGVzdCAiJGZvdW5kIiA9ICIxIiA7IHRoZW4KKyAgIEdDUllQVF9QVUJLRVlfQ0lQSEVSUz0iJEdDUllQVF9QVUJLRVlfQ0lQSEVSUyBlbGdhbWFsLmxvIgorICAgQUNfREVGSU5FKFVTRV9FTEdBTUFMLCAxLCBbRGVmaW5lZCBpZiB0aGlzIG1vZHVsZSBzaG91bGQgYmUgaW5jbHVkZWRdKQorZmkKKworTElTVF9NRU1CRVIoZWNjLCAkZW5hYmxlZF9wdWJrZXlfY2lwaGVycykKK2lmIHRlc3QgIiRmb3VuZCIgPSAiMSIgOyB0aGVuCisgICBHQ1JZUFRfUFVCS0VZX0NJUEhFUlM9IiRHQ1JZUFRfUFVCS0VZX0NJUEhFUlMgZWNjLmxvIgorICAgQUNfREVGSU5FKFVTRV9FQ0MsIDEsIFtEZWZpbmVkIGlmIHRoaXMgbW9kdWxlIHNob3VsZCBiZSBpbmNsdWRlZF0pCitmaQorCitMSVNUX01FTUJFUihjcmMsICRlbmFibGVkX2RpZ2VzdHMpCitpZiB0ZXN0ICIkZm91bmQiID0gIjEiIDsgdGhlbgorICAgR0NSWVBUX0RJR0VTVFM9IiRHQ1JZUFRfRElHRVNUUyBjcmMubG8iCisgICBBQ19ERUZJTkUoVVNFX0NSQywgMSwgW0RlZmluZWQgaWYgdGhpcyBtb2R1bGUgc2hvdWxkIGJlIGluY2x1ZGVkXSkKK2ZpCisKK0xJU1RfTUVNQkVSKG1kNCwgJGVuYWJsZWRfZGlnZXN0cykKK2lmIHRlc3QgIiRmb3VuZCIgPSAiMSIgOyB0aGVuCisgICBHQ1JZUFRfRElHRVNUUz0iJEdDUllQVF9ESUdFU1RTIG1kNC5sbyIKKyAgIEFDX0RFRklORShVU0VfTUQ0LCAxLCBbRGVmaW5lZCBpZiB0aGlzIG1vZHVsZSBzaG91bGQgYmUgaW5jbHVkZWRdKQorZmkKKworTElTVF9NRU1CRVIobWQ1LCAkZW5hYmxlZF9kaWdlc3RzKQoraWYgdGVzdCAiJGZvdW5kIiA9ICIxIiA7IHRoZW4KKyAgIEdDUllQVF9ESUdFU1RTPSIkR0NSWVBUX0RJR0VTVFMgbWQ1LmxvIgorICAgQUNfREVGSU5FKFVTRV9NRDUsIDEsIFtEZWZpbmVkIGlmIHRoaXMgbW9kdWxlIHNob3VsZCBiZSBpbmNsdWRlZF0pCitmaQorCitMSVNUX01FTUJFUihzaGEyNTYsICRlbmFibGVkX2RpZ2VzdHMpCitpZiB0ZXN0ICIkZm91bmQiID0gIjEiIDsgdGhlbgorICAgR0NSWVBUX0RJR0VTVFM9IiRHQ1JZUFRfRElHRVNUUyBzaGEyNTYubG8iCisgICBBQ19ERUZJTkUoVVNFX1NIQTI1NiwgMSwgW0RlZmluZWQgaWYgdGhpcyBtb2R1bGUgc2hvdWxkIGJlIGluY2x1ZGVkXSkKK2ZpCisKK0xJU1RfTUVNQkVSKHNoYTUxMiwgJGVuYWJsZWRfZGlnZXN0cykKK2lmIHRlc3QgIiRmb3VuZCIgPSAiMSIgOyB0aGVuCisgICBHQ1JZUFRfRElHRVNUUz0iJEdDUllQVF9ESUdFU1RTIHNoYTUxMi5sbyIKKyAgIEFDX0RFRklORShVU0VfU0hBNTEyLCAxLCBbRGVmaW5lZCBpZiB0aGlzIG1vZHVsZSBzaG91bGQgYmUgaW5jbHVkZWRdKQorZmkKKworTElTVF9NRU1CRVIodGlnZXIsICRlbmFibGVkX2RpZ2VzdHMpCitpZiB0ZXN0ICIkZm91bmQiID0gIjEiIDsgdGhlbgorICAgR0NSWVBUX0RJR0VTVFM9IiRHQ1JZUFRfRElHRVNUUyB0aWdlci5sbyIKKyAgIEFDX0RFRklORShVU0VfVElHRVIsIDEsIFtEZWZpbmVkIGlmIHRoaXMgbW9kdWxlIHNob3VsZCBiZSBpbmNsdWRlZF0pCitmaQorCitMSVNUX01FTUJFUih3aGlybHBvb2wsICRlbmFibGVkX2RpZ2VzdHMpCitpZiB0ZXN0ICIkZm91bmQiID0gIjEiIDsgdGhlbgorICAgR0NSWVBUX0RJR0VTVFM9IiRHQ1JZUFRfRElHRVNUUyB3aGlybHBvb2wubG8iCisgICBBQ19ERUZJTkUoVVNFX1dISVJMUE9PTCwgMSwgW0RlZmluZWQgaWYgdGhpcyBtb2R1bGUgc2hvdWxkIGJlIGluY2x1ZGVkXSkKK2ZpCisKKyMgcm1kMTYwIGFuZCBzaGExIHNob3VsZCBiZSBpbmNsdWRlZCBhbHdheXMuCitHQ1JZUFRfRElHRVNUUz0iJEdDUllQVF9ESUdFU1RTIHJtZDE2MC5sbyBzaGExLmxvIgorQUNfREVGSU5FKFVTRV9STUQxNjAsIDEsIFtEZWZpbmVkIGlmIHRoaXMgbW9kdWxlIHNob3VsZCBiZSBpbmNsdWRlZF0pCitBQ19ERUZJTkUoVVNFX1NIQTEsIDEsICAgW0RlZmluZWQgaWYgdGhpcyBtb2R1bGUgc2hvdWxkIGJlIGluY2x1ZGVkXSkKKworTElTVF9NRU1CRVIobGludXgsICRyYW5kb21fbW9kdWxlcykKK2lmIHRlc3QgIiRmb3VuZCIgPSAiMSIgOyB0aGVuCisgICBHQ1JZUFRfUkFORE9NPSIkR0NSWVBUX1JBTkRPTSBybmRsaW51eC5sbyIKKyAgIEFDX0RFRklORShVU0VfUk5ETElOVVgsIDEsIFtEZWZpbmVkIGlmIHRoZSAvZGV2L3JhbmRvbSBSTkcgc2hvdWxkIGJlIHVzZWQuXSkKK2ZpCisKK0xJU1RfTUVNQkVSKHVuaXgsICRyYW5kb21fbW9kdWxlcykKK2lmIHRlc3QgIiRmb3VuZCIgPSAiMSIgOyB0aGVuCisgICBHQ1JZUFRfUkFORE9NPSIkR0NSWVBUX1JBTkRPTSBybmR1bml4LmxvIgorICAgQUNfREVGSU5FKFVTRV9STkRVTklYLCAxLCBbRGVmaW5lZCBpZiB0aGUgZGVmYXVsdCBVbml4IFJORyBzaG91bGQgYmUgdXNlZC5dKQorICAgcHJpbnRfZWdkX25vdGljZT15ZXMKK2ZpCisKK0xJU1RfTUVNQkVSKGVnZCwgJHJhbmRvbV9tb2R1bGVzKQoraWYgdGVzdCAiJGZvdW5kIiA9ICIxIiA7IHRoZW4KKyAgIEdDUllQVF9SQU5ET009IiRHQ1JZUFRfUkFORE9NIHJuZGVnZC5sbyIKKyAgIEFDX0RFRklORShVU0VfUk5ERUdELCAxLCBbRGVmaW5lZCBpZiB0aGUgRUdEIGJhc2VkIFJORyBzaG91bGQgYmUgdXNlZC5dKQorZmkKKworTElTVF9NRU1CRVIodzMyLCAkcmFuZG9tX21vZHVsZXMpCitpZiB0ZXN0ICIkZm91bmQiID0gIjEiIDsgdGhlbgorICAgR0NSWVBUX1JBTkRPTT0iJEdDUllQVF9SQU5ET00gcm5kdzMyLmxvIgorICAgQUNfREVGSU5FKFVTRV9STkRXMzIsIDEsIAorICAgICAgICAgICAgIFtEZWZpbmVkIGlmIHRoZSBXaW5kb3dzIHNwZWNpZmljIFJORyBzaG91bGQgYmUgdXNlZC5dKQorZmkKKworQUNfU1VCU1QoW0dDUllQVF9DSVBIRVJTXSkKK0FDX1NVQlNUKFtHQ1JZUFRfUFVCS0VZX0NJUEhFUlNdKQorQUNfU1VCU1QoW0dDUllQVF9ESUdFU1RTXSkKK0FDX1NVQlNUKFtHQ1JZUFRfUkFORE9NXSkKKworQUNfU1VCU1QoTElCR0NSWVBUX0NJUEhFUlMsICRlbmFibGVkX2NpcGhlcnMpCitBQ19TVUJTVChMSUJHQ1JZUFRfUFVCS0VZX0NJUEhFUlMsICRlbmFibGVkX3B1YmtleV9jaXBoZXJzKQorQUNfU1VCU1QoTElCR0NSWVBUX0RJR0VTVFMsICRlbmFibGVkX2RpZ2VzdHMpCisKKyMgRm9yIHByaW50aW5nIHRoZSBjb25maWd1cmF0aW9uIHdlIG5lZWQgYSBjb2xvbiBzZXBhcmF0ZWQgbGlzdCBvZgorIyBhbGdvcml0aG0gbmFtZXMuCit0bXA9YGVjaG8gIiRlbmFibGVkX2NpcGhlcnMiIHwgdHIgJyAnIDogYAorQUNfREVGSU5FX1VOUVVPVEVEKExJQkdDUllQVF9DSVBIRVJTLCAiJHRtcCIsIAorICAgICAgICAgICAgICAgICAgIFtMaXN0IG9mIGF2YWlsYWJsZSBjaXBoZXIgYWxnb3JpdGhtc10pCit0bXA9YGVjaG8gIiRlbmFibGVkX3B1YmtleV9jaXBoZXJzIiB8IHRyICcgJyA6IGAKK0FDX0RFRklORV9VTlFVT1RFRChMSUJHQ1JZUFRfUFVCS0VZX0NJUEhFUlMsICIkdG1wIiwgCisgICAgICAgICAgICAgICAgICAgW0xpc3Qgb2YgYXZhaWxhYmxlIHB1YmxpYyBrZXkgY2lwaGVyIGFsZ29yaXRobXNdKQordG1wPWBlY2hvICIkZW5hYmxlZF9kaWdlc3RzIiB8IHRyICcgJyA6IGAKK0FDX0RFRklORV9VTlFVT1RFRChMSUJHQ1JZUFRfRElHRVNUUywgIiR0bXAiLCAKKyAgICAgICAgICAgICAgICAgICBbTGlzdCBvZiBhdmFpbGFibGUgZGlnZXN0IGFsZ29yaXRobXNdKQorCisKKworIyBHZW5lcmF0ZSBleHRlbmRlZCB2ZXJzaW9uIGluZm9ybWF0aW9uIGZvciBXMzIuCitpZiB0ZXN0ICIkaGF2ZV93MzJfc3lzdGVtIiA9IHllczsgdGhlbgorICAgQlVJTERfVElNRVNUQU1QPWBkYXRlIC0taXNvLTg2MDE9bWludXRlc2AKKyAgIGNoYW5nZXF1b3RlKCwpZG5sIAorICAgQlVJTERfRklMRVZFUlNJT049YGVjaG8gIiRWRVJTSU9OIiB8IHNlZCAncy9cKFswLTkuXSpcKS4qL1wxLi87cy9cLi8sL2cnYAorICAgY2hhbmdlcXVvdGUoWyxdKWRubAorICAgQlVJTERfRklMRVZFUlNJT049IiR7QlVJTERfRklMRVZFUlNJT059JHtCVUlMRF9SRVZJU0lPTn0iCitmaQorQUNfU1VCU1QoQlVJTERfUkVWSVNJT04pCitBQ19TVUJTVChCVUlMRF9USU1FU1RBTVApCitBQ19TVUJTVChCVUlMRF9GSUxFVkVSU0lPTikKK0FDX0RFRklORV9VTlFVT1RFRChCVUlMRF9SRVZJU0lPTiwgIiRCVUlMRF9SRVZJU0lPTiIsIAorICAgICAgICAgICAgICAgICAgIFtTdWJ2ZXJzaW9uIHJldmlzaW9uIHVzZWQgdG8gYnVpbGQgdGhpcyBwYWNrYWdlXSkKKworCisKKyMgQW5kIGNyZWF0ZSB0aGUgZmlsZXMuCitBQ19DT05GSUdfRklMRVMoWworTWFrZWZpbGUKK200L01ha2VmaWxlCittcGkvTWFrZWZpbGUKK2NpcGhlci9NYWtlZmlsZQorcmFuZG9tL01ha2VmaWxlCitkb2MvTWFrZWZpbGUKK3NyYy9NYWtlZmlsZQorc3JjL2djcnlwdC5oCitzcmMvbGliZ2NyeXB0LWNvbmZpZworc3JjL3ZlcnNpb25pbmZvLnJjCit0ZXN0cy9NYWtlZmlsZQorXSkKK0FDX09VVFBVVAorCisjIEdpdmUgc29tZSBmZWVkYmFjaworZWNobyAiCisgICAgICAgIExpYmdjcnlwdCB2JHtWRVJTSU9OfSBoYXMgYmVlbiBjb25maWd1cmVkIGFzIGZvbGxvd3M6CisgICAgICAgIAorICAgICAgICBQbGF0Zm9ybTogICRQUklOVEFCTEVfT1NfTkFNRSAoJGhvc3QpCisiCisKKworaWYgdGVzdCAiJHByaW50X2VnZF9ub3RpY2UiID0gInllcyI7IHRoZW4KK2NhdCA8PEcxMEVPRgorICAKKyAgIFRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgVW5peCByYW5kb20gZ2F0aGVyZXIgbW9kdWxlIChybmR1bml4KSBpcyBub3QKKyAgIHZlcnkgZ29vZCBhbmQgaXQgZG9lcyBub3Qga2VlcCB0aGUgZW50cm9weSBwb29sIG92ZXIgbXVsdGlwbGUKKyAgIGludm9jYXRpb25zIG9mIExpYmdjcnlwdCBiYXNlIGFwcGxpY2F0aW9ucy4gIFRoZSBzdWdnZXN0ZWQgd2F5IHRvCisgICBvdmVyY29tZSB0aGlzIHByb2JsZW0gaXMgdG8gdXNlIHRoZQorICAKKyAgICAgICAgICAgICAgICAgRW50cm9weSBHYXRoZXJpbmcgRGFlbW9uIChFR0QpCisgIAorICAgd2hpY2ggcHJvdmlkZXMgYSBlbnRyb3B5IHNvdXJjZSBmb3IgdGhlIHdob2xlIHN5c3RlbS4gIEl0IGlzIHdyaXR0ZW4KKyAgIGluIFBlcmwgYW5kIGF2YWlsYWJsZSBhdCB0aGUgR251UEcgRlRQIHNlcnZlcnMuICBUbyBlbmFibGUgRUdEIHlvdQorICAgc2hvdWxkIHJlcnVuIGNvbmZpZ3VyZSB3aXRoIHRoZSBvcHRpb24gIi0tZW5hYmxlLXN0YXRpYy1ybmQ9ZWdkIi4KKyAgIEZvciBtb3JlIGluZm9ybWF0aW9uIGNvbnN1bHQgdGhlIEdudVBHIHdlYnBhZ2VzOgorICAKKyAgICAgICAgICAgICBodHRwOi8vd3d3LmdudXBnLm9yZy9kb3dubG9hZC5odG1sI2VnZAorCitHMTBFT0YKK2ZpCisKK2lmIHRlc3QgLW4gIiRncGwiOyB0aGVuCisgIGVjaG8gIlBsZWFzZSBub3RlIHRoYXQgeW91IGFyZSBidWlsZGluZyBhIHZlcnNpb24gb2YgTGliZ2NyeXB0IHdpdGgiCisgIGVjaG8gIiAgJGdwbCIKKyAgZWNobyAiaW5jbHVkZWQuICBUaGVzZSBwYXJ0cyBhcmUgbGljZW5zZWQgdW5kZXIgdGhlIEdQTCBhbmQgdGh1cyB0aGUiCisgIGVjaG8gInVzZSBvZiB0aGlzIGxpYnJhcnkgaGFzIHRvIGNvbXBseSB3aXRoIHRoZSBjb25kaXRpb25zIG9mIHRoZSBHUEwuIgorZmkKKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L2RlcGNvbXAgYi9saWJnY3J5cHQtMS40LjYvZGVwY29tcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jYTVlYTRlCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L2RlcGNvbXAKQEAgLTAsMCArMSw1ODQgQEAKKyMhIC9iaW4vc2gKKyMgZGVwY29tcCAtIGNvbXBpbGUgYSBwcm9ncmFtIGdlbmVyYXRpbmcgZGVwZW5kZW5jaWVzIGFzIHNpZGUtZWZmZWN0cworCitzY3JpcHR2ZXJzaW9uPTIwMDYtMTAtMTUuMTgKKworIyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyMgMDIxMTAtMTMwMSwgVVNBLgorCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworIyBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgQWxleGFuZHJlIE9saXZhIDxvbGl2YUBkY2MudW5pY2FtcC5icj4uCisKK2Nhc2UgJDEgaW4KKyAgJycpCisgICAgIGVjaG8gIiQwOiBObyBjb21tYW5kLiAgVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDE+JjIKKyAgICAgZXhpdCAxOworICAgICA7OworICAtaCB8IC0taCopCisgICAgY2F0IDw8XEVPRgorVXNhZ2U6IGRlcGNvbXAgWy0taGVscF0gWy0tdmVyc2lvbl0gUFJPR1JBTSBbQVJHU10KKworUnVuIFBST0dSQU1TIEFSR1MgdG8gY29tcGlsZSBhIGZpbGUsIGdlbmVyYXRpbmcgZGVwZW5kZW5jaWVzCithcyBzaWRlLWVmZmVjdHMuCisKK0Vudmlyb25tZW50IHZhcmlhYmxlczoKKyAgZGVwbW9kZSAgICAgRGVwZW5kZW5jeSB0cmFja2luZyBtb2RlLgorICBzb3VyY2UgICAgICBTb3VyY2UgZmlsZSByZWFkIGJ5IGBQUk9HUkFNUyBBUkdTJy4KKyAgb2JqZWN0ICAgICAgT2JqZWN0IGZpbGUgb3V0cHV0IGJ5IGBQUk9HUkFNUyBBUkdTJy4KKyAgREVQRElSICAgICAgZGlyZWN0b3J5IHdoZXJlIHRvIHN0b3JlIGRlcGVuZGVuY2llcy4KKyAgZGVwZmlsZSAgICAgRGVwZW5kZW5jeSBmaWxlIHRvIG91dHB1dC4KKyAgdG1wZGVwZmlsZSAgVGVtcG9yYXJ5IGZpbGUgdG8gdXNlIHdoZW4gb3V0cHV0aW5nIGRlcGVuZGVuY2llcy4KKyAgbGlidG9vbCAgICAgV2hldGhlciBsaWJ0b29sIGlzIHVzZWQgKHllcy9ubykuCisKK1JlcG9ydCBidWdzIHRvIDxidWctYXV0b21ha2VAZ251Lm9yZz4uCitFT0YKKyAgICBleGl0ICQ/CisgICAgOzsKKyAgLXYgfCAtLXYqKQorICAgIGVjaG8gImRlcGNvbXAgJHNjcmlwdHZlcnNpb24iCisgICAgZXhpdCAkPworICAgIDs7Citlc2FjCisKK2lmIHRlc3QgLXogIiRkZXBtb2RlIiB8fCB0ZXN0IC16ICIkc291cmNlIiB8fCB0ZXN0IC16ICIkb2JqZWN0IjsgdGhlbgorICBlY2hvICJkZXBjb21wOiBWYXJpYWJsZXMgc291cmNlLCBvYmplY3QgYW5kIGRlcG1vZGUgbXVzdCBiZSBzZXQiIDE+JjIKKyAgZXhpdCAxCitmaQorCisjIERlcGVuZGVuY2llcyBmb3Igc3ViL2Jhci5vIG9yIHN1Yi9iYXIub2JqIGdvIGludG8gc3ViLy5kZXBzL2Jhci5Qby4KK2RlcGZpbGU9JHtkZXBmaWxlLWBlY2hvICIkb2JqZWN0IiB8CisgIHNlZCAnc3xbXlxcL10qJHwnJHtERVBESVItLmRlcHN9Jy8mfDtzfFwuXChbXi5dKlwpJHwuUFwxfDtzfFBvYmokfFBvfCdgfQordG1wZGVwZmlsZT0ke3RtcGRlcGZpbGUtYGVjaG8gIiRkZXBmaWxlIiB8IHNlZCAncy9cLlwoW14uXSpcKSQvLlRcMS8nYH0KKworcm0gLWYgIiR0bXBkZXBmaWxlIgorCisjIFNvbWUgbW9kZXMgd29yayBqdXN0IGxpa2Ugb3RoZXIgbW9kZXMsIGJ1dCB1c2UgZGlmZmVyZW50IGZsYWdzLiAgV2UKKyMgcGFyYW1ldGVyaXplIGhlcmUsIGJ1dCBzdGlsbCBsaXN0IHRoZSBtb2RlcyBpbiB0aGUgYmlnIGNhc2UgYmVsb3csCisjIHRvIG1ha2UgZGVwZW5kLm00IGVhc2llciB0byB3cml0ZS4gIE5vdGUgdGhhdCB3ZSAqY2Fubm90KiB1c2UgYSBjYXNlCisjIGhlcmUsIGJlY2F1c2UgdGhpcyBmaWxlIGNhbiBvbmx5IGNvbnRhaW4gb25lIGNhc2Ugc3RhdGVtZW50LgoraWYgdGVzdCAiJGRlcG1vZGUiID0gaHA7IHRoZW4KKyAgIyBIUCBjb21waWxlciB1c2VzIC1NIGFuZCBubyBleHRyYSBhcmcuCisgIGdjY2ZsYWc9LU0KKyAgZGVwbW9kZT1nY2MKK2ZpCisKK2lmIHRlc3QgIiRkZXBtb2RlIiA9IGRhc2hYbXN0ZG91dDsgdGhlbgorICAgIyBUaGlzIGlzIGp1c3QgbGlrZSBkYXNobXN0ZG91dCB3aXRoIGEgZGlmZmVyZW50IGFyZ3VtZW50LgorICAgZGFzaG1mbGFnPS14TQorICAgZGVwbW9kZT1kYXNobXN0ZG91dAorZmkKKworY2FzZSAiJGRlcG1vZGUiIGluCitnY2MzKQorIyMgZ2NjIDMgaW1wbGVtZW50cyBkZXBlbmRlbmN5IHRyYWNraW5nIHRoYXQgZG9lcyBleGFjdGx5IHdoYXQKKyMjIHdlIHdhbnQuICBZYXkhICBOb3RlOiBmb3Igc29tZSByZWFzb24gbGlidG9vbCAxLjQgZG9lc24ndCBsaWtlCisjIyBpdCBpZiAtTUQgLU1QIGNvbWVzIGFmdGVyIHRoZSAtTUYgc3R1ZmYuICBIbW0uCisjIyBVbmZvcnR1bmF0ZWx5LCBGcmVlQlNEIGM4OSBhY2NlcHRhbmNlIG9mIGZsYWdzIGRlcGVuZHMgdXBvbgorIyMgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudCBvcmRlcjsgc28gYWRkIHRoZSBmbGFncyB3aGVyZSB0aGV5CisjIyBhcHBlYXIgaW4gZGVwZW5kMi5hbS4gIE5vdGUgdGhhdCB0aGUgc2xvd2Rvd24gaW5jdXJyZWQgaGVyZQorIyMgYWZmZWN0cyBvbmx5IGNvbmZpZ3VyZTogaW4gbWFrZWZpbGVzLCAlRkFTVERFUCUgc2hvcnRjdXRzIHRoaXMuCisgIGZvciBhcmcKKyAgZG8KKyAgICBjYXNlICRhcmcgaW4KKyAgICAtYykgc2V0IGZub3JkICIkQCIgLU1UICIkb2JqZWN0IiAtTUQgLU1QIC1NRiAiJHRtcGRlcGZpbGUiICIkYXJnIiA7OworICAgICopICBzZXQgZm5vcmQgIiRAIiAiJGFyZyIgOzsKKyAgICBlc2FjCisgICAgc2hpZnQgIyBmbm9yZAorICAgIHNoaWZ0ICMgJGFyZworICBkb25lCisgICIkQCIKKyAgc3RhdD0kPworICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKKyAgZWxzZQorICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgICBleGl0ICRzdGF0CisgIGZpCisgIG12ICIkdG1wZGVwZmlsZSIgIiRkZXBmaWxlIgorICA7OworCitnY2MpCisjIyBUaGVyZSBhcmUgdmFyaW91cyB3YXlzIHRvIGdldCBkZXBlbmRlbmN5IG91dHB1dCBmcm9tIGdjYy4gIEhlcmUncworIyMgd2h5IHdlIHBpY2sgdGhpcyByYXRoZXIgb2JzY3VyZSBtZXRob2Q6CisjIyAtIERvbid0IHdhbnQgdG8gdXNlIC1NRCBiZWNhdXNlIHdlJ2QgbGlrZSB0aGUgZGVwZW5kZW5jaWVzIHRvIGVuZAorIyMgICB1cCBpbiBhIHN1YmRpci4gIEhhdmluZyB0byByZW5hbWUgYnkgaGFuZCBpcyB1Z2x5LgorIyMgICAoV2UgbWlnaHQgZW5kIHVwIGRvaW5nIHRoaXMgYW55d2F5IHRvIHN1cHBvcnQgb3RoZXIgY29tcGlsZXJzLikKKyMjIC0gVGhlIERFUEVOREVOQ0lFU19PVVRQVVQgZW52aXJvbm1lbnQgdmFyaWFibGUgbWFrZXMgZ2NjIGFjdCBsaWtlCisjIyAgIC1NTSwgbm90IC1NIChkZXNwaXRlIHdoYXQgdGhlIGRvY3Mgc2F5KS4KKyMjIC0gVXNpbmcgLU0gZGlyZWN0bHkgbWVhbnMgcnVubmluZyB0aGUgY29tcGlsZXIgdHdpY2UgKGV2ZW4gd29yc2UKKyMjICAgdGhhbiByZW5hbWluZykuCisgIGlmIHRlc3QgLXogIiRnY2NmbGFnIjsgdGhlbgorICAgIGdjY2ZsYWc9LU1ELAorICBmaQorICAiJEAiIC1XcCwiJGdjY2ZsYWckdG1wZGVwZmlsZSIKKyAgc3RhdD0kPworICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKKyAgZWxzZQorICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgICBleGl0ICRzdGF0CisgIGZpCisgIHJtIC1mICIkZGVwZmlsZSIKKyAgZWNobyAiJG9iamVjdCA6IFxcIiA+ICIkZGVwZmlsZSIKKyAgYWxwaGE9QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5egorIyMgVGhlIHNlY29uZCAtZSBleHByZXNzaW9uIGhhbmRsZXMgRE9TLXN0eWxlIGZpbGUgbmFtZXMgd2l0aCBkcml2ZSBsZXR0ZXJzLgorICBzZWQgLWUgJ3MvXlteOl0qOiAvIC8nIFwKKyAgICAgIC1lICdzL15bJyRhbHBoYSddOlwvW146XSo6IC8gLycgPCAiJHRtcGRlcGZpbGUiID4+ICIkZGVwZmlsZSIKKyMjIFRoaXMgbmV4dCBwaWVjZSBvZiBtYWdpYyBhdm9pZHMgdGhlIGBkZWxldGVkIGhlYWRlciBmaWxlJyBwcm9ibGVtLgorIyMgVGhlIHByb2JsZW0gaXMgdGhhdCB3aGVuIGEgaGVhZGVyIGZpbGUgd2hpY2ggYXBwZWFycyBpbiBhIC5QIGZpbGUKKyMjIGlzIGRlbGV0ZWQsIHRoZSBkZXBlbmRlbmN5IGNhdXNlcyBtYWtlIHRvIGRpZSAoYmVjYXVzZSB0aGVyZSBpcworIyMgdHlwaWNhbGx5IG5vIHdheSB0byByZWJ1aWxkIHRoZSBoZWFkZXIpLiAgV2UgYXZvaWQgdGhpcyBieSBhZGRpbmcKKyMjIGR1bW15IGRlcGVuZGVuY2llcyBmb3IgZWFjaCBoZWFkZXIgZmlsZS4gIFRvbyBiYWQgZ2NjIGRvZXNuJ3QgZG8KKyMjIHRoaXMgZm9yIHVzIGRpcmVjdGx5LgorICB0ciAnICcgJworJyA8ICIkdG1wZGVwZmlsZSIgfAorIyMgU29tZSB2ZXJzaW9ucyBvZiBnY2MgcHV0IGEgc3BhY2UgYmVmb3JlIHRoZSBgOicuICBPbiB0aGUgdGhlb3J5CisjIyB0aGF0IHRoZSBzcGFjZSBtZWFucyBzb21ldGhpbmcsIHdlIGFkZCBhIHNwYWNlIHRvIHRoZSBvdXRwdXQgYXMKKyMjIHdlbGwuCisjIyBTb21lIHZlcnNpb25zIG9mIHRoZSBIUFVYIDEwLjIwIHNlZCBjYW4ndCBwcm9jZXNzIHRoaXMgaW52b2NhdGlvbgorIyMgY29ycmVjdGx5LiAgQnJlYWtpbmcgaXQgaW50byB0d28gc2VkIGludm9jYXRpb25zIGlzIGEgd29ya2Fyb3VuZC4KKyAgICBzZWQgLWUgJ3MvXlxcJC8vJyAtZSAnL14kL2QnIC1lICcvOiQvZCcgfCBzZWQgLWUgJ3MvJC8gOi8nID4+ICIkZGVwZmlsZSIKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICA7OworCitocCkKKyAgIyBUaGlzIGNhc2UgZXhpc3RzIG9ubHkgdG8gbGV0IGRlcGVuZC5tNCBkbyBpdHMgd29yay4gIEl0IHdvcmtzIGJ5CisgICMgbG9va2luZyBhdCB0aGUgdGV4dCBvZiB0aGlzIHNjcmlwdC4gIFRoaXMgY2FzZSB3aWxsIG5ldmVyIGJlIHJ1biwKKyAgIyBzaW5jZSBpdCBpcyBjaGVja2VkIGZvciBhYm92ZS4KKyAgZXhpdCAxCisgIDs7CisKK3NnaSkKKyAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCisgICAgIiRAIiAiLVdwLC1NRHVwZGF0ZSwkdG1wZGVwZmlsZSIKKyAgZWxzZQorICAgICIkQCIgLU1EdXBkYXRlICIkdG1wZGVwZmlsZSIKKyAgZmkKKyAgc3RhdD0kPworICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKKyAgZWxzZQorICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgICBleGl0ICRzdGF0CisgIGZpCisgIHJtIC1mICIkZGVwZmlsZSIKKworICBpZiB0ZXN0IC1mICIkdG1wZGVwZmlsZSI7IHRoZW4gICMgeWVzLCB0aGUgc291cmNlZmlsZSBkZXBlbmQgb24gb3RoZXIgZmlsZXMKKyAgICBlY2hvICIkb2JqZWN0IDogXFwiID4gIiRkZXBmaWxlIgorCisgICAgIyBDbGlwIG9mZiB0aGUgaW5pdGlhbCBlbGVtZW50ICh0aGUgZGVwZW5kZW50KS4gIERvbid0IHRyeSB0byBiZQorICAgICMgY2xldmVyIGFuZCByZXBsYWNlIHRoaXMgd2l0aCBzZWQgY29kZSwgYXMgSVJJWCBzZWQgd29uJ3QgaGFuZGxlCisgICAgIyBsaW5lcyB3aXRoIG1vcmUgdGhhbiBhIGZpeGVkIG51bWJlciBvZiBjaGFyYWN0ZXJzICg0MDk2IGluCisgICAgIyBJUklYIDYuMiBzZWQsIDgxOTIgaW4gSVJJWCA2LjUpLiAgV2UgYWxzbyByZW1vdmUgY29tbWVudCBsaW5lczsKKyAgICAjIHRoZSBJUklYIGNjIGFkZHMgY29tbWVudHMgbGlrZSBgIzpmZWMnIHRvIHRoZSBlbmQgb2YgdGhlCisgICAgIyBkZXBlbmRlbmN5IGxpbmUuCisgICAgdHIgJyAnICcKKycgPCAiJHRtcGRlcGZpbGUiIFwKKyAgICB8IHNlZCAtZSAncy9eLipcLm86Ly8nIC1lICdzLyMuKiQvLycgLWUgJy9eJC8gZCcgfCBcCisgICAgdHIgJworJyAnICcgPj4gJGRlcGZpbGUKKyAgICBlY2hvID4+ICRkZXBmaWxlCisKKyAgICAjIFRoZSBzZWNvbmQgcGFzcyBnZW5lcmF0ZXMgYSBkdW1teSBlbnRyeSBmb3IgZWFjaCBoZWFkZXIgZmlsZS4KKyAgICB0ciAnICcgJworJyA8ICIkdG1wZGVwZmlsZSIgXAorICAgfCBzZWQgLWUgJ3MvXi4qXC5vOi8vJyAtZSAncy8jLiokLy8nIC1lICcvXiQvIGQnIC1lICdzLyQvOi8nIFwKKyAgID4+ICRkZXBmaWxlCisgIGVsc2UKKyAgICAjIFRoZSBzb3VyY2VmaWxlIGRvZXMgbm90IGNvbnRhaW4gYW55IGRlcGVuZGVuY2llcywgc28ganVzdAorICAgICMgc3RvcmUgYSBkdW1teSBjb21tZW50IGxpbmUsIHRvIGF2b2lkIGVycm9ycyB3aXRoIHRoZSBNYWtlZmlsZQorICAgICMgImluY2x1ZGUgYmFzZW5hbWUuUGxvIiBzY2hlbWUuCisgICAgZWNobyAiI2R1bW15IiA+ICIkZGVwZmlsZSIKKyAgZmkKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICA7OworCithaXgpCisgICMgVGhlIEMgZm9yIEFJWCBDb21waWxlciB1c2VzIC1NIGFuZCBvdXRwdXRzIHRoZSBkZXBlbmRlbmNpZXMKKyAgIyBpbiBhIC51IGZpbGUuICBJbiBvbGRlciB2ZXJzaW9ucywgdGhpcyBmaWxlIGFsd2F5cyBsaXZlcyBpbiB0aGUKKyAgIyBjdXJyZW50IGRpcmVjdG9yeS4gIEFsc28sIHRoZSBBSVggY29tcGlsZXIgcHV0cyBgJG9iamVjdDonIGF0IHRoZQorICAjIHN0YXJ0IG9mIGVhY2ggbGluZTsgJG9iamVjdCBkb2Vzbid0IGhhdmUgZGlyZWN0b3J5IGluZm9ybWF0aW9uLgorICAjIFZlcnNpb24gNiB1c2VzIHRoZSBkaXJlY3RvcnkgaW4gYm90aCBjYXNlcy4KKyAgc3RyaXBwZWQ9YGVjaG8gIiRvYmplY3QiIHwgc2VkICdzL1woLipcKVwuLiokL1wxLydgCisgIHRtcGRlcGZpbGU9IiRzdHJpcHBlZC51IgorICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KKyAgICAiJEAiIC1XYywtTQorICBlbHNlCisgICAgIiRAIiAtTQorICBmaQorICBzdGF0PSQ/CisKKyAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuIDoKKyAgZWxzZQorICAgIHN0cmlwcGVkPWBlY2hvICIkc3RyaXBwZWQiIHwgc2VkICdzLF4uKi8sLCdgCisgICAgdG1wZGVwZmlsZT0iJHN0cmlwcGVkLnUiCisgIGZpCisKKyAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6CisgIGVsc2UKKyAgICBybSAtZiAiJHRtcGRlcGZpbGUiCisgICAgZXhpdCAkc3RhdAorICBmaQorCisgIGlmIHRlc3QgLWYgIiR0bXBkZXBmaWxlIjsgdGhlbgorICAgIG91dG5hbWU9IiRzdHJpcHBlZC5vIgorICAgICMgRWFjaCBsaW5lIGlzIG9mIHRoZSBmb3JtIGBmb28ubzogZGVwZW5kZW50LmgnLgorICAgICMgRG8gdHdvIHBhc3Nlcywgb25lIHRvIGp1c3QgY2hhbmdlIHRoZXNlIHRvCisgICAgIyBgJG9iamVjdDogZGVwZW5kZW50LmgnIGFuZCBvbmUgdG8gc2ltcGx5IGBkZXBlbmRlbnQuaDonLgorICAgIHNlZCAtZSAicyxeJG91dG5hbWU6LCRvYmplY3QgOiwiIDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKKyAgICBzZWQgLWUgInMsXiRvdXRuYW1lOiBcKC4qXCkkLFwxOiwiIDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCisgIGVsc2UKKyAgICAjIFRoZSBzb3VyY2VmaWxlIGRvZXMgbm90IGNvbnRhaW4gYW55IGRlcGVuZGVuY2llcywgc28ganVzdAorICAgICMgc3RvcmUgYSBkdW1teSBjb21tZW50IGxpbmUsIHRvIGF2b2lkIGVycm9ycyB3aXRoIHRoZSBNYWtlZmlsZQorICAgICMgImluY2x1ZGUgYmFzZW5hbWUuUGxvIiBzY2hlbWUuCisgICAgZWNobyAiI2R1bW15IiA+ICIkZGVwZmlsZSIKKyAgZmkKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICA7OworCitpY2MpCisgICMgSW50ZWwncyBDIGNvbXBpbGVyIHVuZGVyc3RhbmRzIGAtTUQgLU1GIGZpbGUnLiAgSG93ZXZlciBvbgorICAjICAgIGljYyAtTUQgLU1GIGZvby5kIC1jIC1vIHN1Yi9mb28ubyBzdWIvZm9vLmMKKyAgIyBJQ0MgNy4wIHdpbGwgZmlsbCBmb28uZCB3aXRoIHNvbWV0aGluZyBsaWtlCisgICMgICAgZm9vLm86IHN1Yi9mb28uYworICAjICAgIGZvby5vOiBzdWIvZm9vLmgKKyAgIyB3aGljaCBpcyB3cm9uZy4gIFdlIHdhbnQ6CisgICMgICAgc3ViL2Zvby5vOiBzdWIvZm9vLmMKKyAgIyAgICBzdWIvZm9vLm86IHN1Yi9mb28uaAorICAjICAgIHN1Yi9mb28uYzoKKyAgIyAgICBzdWIvZm9vLmg6CisgICMgSUNDIDcuMSB3aWxsIG91dHB1dAorICAjICAgIGZvby5vOiBzdWIvZm9vLmMgc3ViL2Zvby5oCisgICMgYW5kIHdpbGwgd3JhcCBsb25nIGxpbmVzIHVzaW5nIFwgOgorICAjICAgIGZvby5vOiBzdWIvZm9vLmMgLi4uIFwKKyAgIyAgICAgc3ViL2Zvby5oIC4uLiBcCisgICMgICAgIC4uLgorCisgICIkQCIgLU1EIC1NRiAiJHRtcGRlcGZpbGUiCisgIHN0YXQ9JD8KKyAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6CisgIGVsc2UKKyAgICBybSAtZiAiJHRtcGRlcGZpbGUiCisgICAgZXhpdCAkc3RhdAorICBmaQorICBybSAtZiAiJGRlcGZpbGUiCisgICMgRWFjaCBsaW5lIGlzIG9mIHRoZSBmb3JtIGBmb28ubzogZGVwZW5kZW50LmgnLAorICAjIG9yIGBmb28ubzogZGVwMS5oIGRlcDIuaCBcJywgb3IgYCBkZXAzLmggZGVwNC5oIFwnLgorICAjIERvIHR3byBwYXNzZXMsIG9uZSB0byBqdXN0IGNoYW5nZSB0aGVzZSB0bworICAjIGAkb2JqZWN0OiBkZXBlbmRlbnQuaCcgYW5kIG9uZSB0byBzaW1wbHkgYGRlcGVuZGVudC5oOicuCisgIHNlZCAicyxeW146XSo6LCRvYmplY3QgOiwiIDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKKyAgIyBTb21lIHZlcnNpb25zIG9mIHRoZSBIUFVYIDEwLjIwIHNlZCBjYW4ndCBwcm9jZXNzIHRoaXMgaW52b2NhdGlvbgorICAjIGNvcnJlY3RseS4gIEJyZWFraW5nIGl0IGludG8gdHdvIHNlZCBpbnZvY2F0aW9ucyBpcyBhIHdvcmthcm91bmQuCisgIHNlZCAncyxeW146XSo6IFwoLipcKSQsXDEsO3MvXlxcJC8vOy9eJC9kOy86JC9kJyA8ICIkdG1wZGVwZmlsZSIgfAorICAgIHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgorICBybSAtZiAiJHRtcGRlcGZpbGUiCisgIDs7CisKK2hwMikKKyAgIyBUaGUgImhwIiBzdGFuemEgYWJvdmUgZG9lcyBub3Qgd29yayB3aXRoIGFDQyAoQysrKSBhbmQgSFAncyBpYTY0CisgICMgY29tcGlsZXJzLCB3aGljaCBoYXZlIGludGVncmF0ZWQgcHJlcHJvY2Vzc29ycy4gIFRoZSBjb3JyZWN0IG9wdGlvbgorICAjIHRvIHVzZSB3aXRoIHRoZXNlIGlzICtNYWtlZDsgaXQgd3JpdGVzIGRlcGVuZGVuY2llcyB0byBhIGZpbGUgbmFtZWQKKyAgIyAnZm9vLmQnLCB3aGljaCBsYW5kcyBuZXh0IHRvIHRoZSBvYmplY3QgZmlsZSwgd2hlcmV2ZXIgdGhhdAorICAjIGhhcHBlbnMgdG8gYmUuCisgICMgTXVjaCBvZiB0aGlzIGlzIHNpbWlsYXIgdG8gdGhlIHRydTY0IGNhc2U7IHNlZSBjb21tZW50cyB0aGVyZS4KKyAgZGlyPWBlY2hvICIkb2JqZWN0IiB8IHNlZCAtZSAnc3wvW14vXSokfC98J2AKKyAgdGVzdCAieCRkaXIiID0gIngkb2JqZWN0IiAmJiBkaXI9CisgIGJhc2U9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzfF4uKi98fCcgLWUgJ3MvXC5vJC8vJyAtZSAncy9cLmxvJC8vJ2AKKyAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCisgICAgdG1wZGVwZmlsZTE9JGRpciRiYXNlLmQKKyAgICB0bXBkZXBmaWxlMj0kZGlyLmxpYnMvJGJhc2UuZAorICAgICIkQCIgLVdjLCtNYWtlZAorICBlbHNlCisgICAgdG1wZGVwZmlsZTE9JGRpciRiYXNlLmQKKyAgICB0bXBkZXBmaWxlMj0kZGlyJGJhc2UuZAorICAgICIkQCIgK01ha2VkCisgIGZpCisgIHN0YXQ9JD8KKyAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6CisgIGVsc2UKKyAgICAgcm0gLWYgIiR0bXBkZXBmaWxlMSIgIiR0bXBkZXBmaWxlMiIKKyAgICAgZXhpdCAkc3RhdAorICBmaQorCisgIGZvciB0bXBkZXBmaWxlIGluICIkdG1wZGVwZmlsZTEiICIkdG1wZGVwZmlsZTIiCisgIGRvCisgICAgdGVzdCAtZiAiJHRtcGRlcGZpbGUiICYmIGJyZWFrCisgIGRvbmUKKyAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuCisgICAgc2VkIC1lICJzLF4uKlwuW2Etel0qOiwkb2JqZWN0OiwiICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCisgICAgIyBBZGQgYGRlcGVuZGVudC5oOicgbGluZXMuCisgICAgc2VkIC1uZSAnMiwkezsgcy9eICovLzsgcy8gXFwqJC8vOyBzLyQvOi87IHA7fScgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCisgIGVsc2UKKyAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgorICBmaQorICBybSAtZiAiJHRtcGRlcGZpbGUiICIkdG1wZGVwZmlsZTIiCisgIDs7CisKK3RydTY0KQorICAgIyBUaGUgVHJ1NjQgY29tcGlsZXIgdXNlcyAtTUQgdG8gZ2VuZXJhdGUgZGVwZW5kZW5jaWVzIGFzIGEgc2lkZQorICAgIyBlZmZlY3QuICBgY2MgLU1EIC1vIGZvby5vIC4uLicgcHV0cyB0aGUgZGVwZW5kZW5jaWVzIGludG8gYGZvby5vLmQnLgorICAgIyBBdCBsZWFzdCBvbiBBbHBoYS9SZWRoYXQgNi4xLCBDb21wYXEgQ0NDIFY2LjItNTA0IHNlZW1zIHRvIHB1dAorICAgIyBkZXBlbmRlbmNpZXMgaW4gYGZvby5kJyBpbnN0ZWFkLCBzbyB3ZSBjaGVjayBmb3IgdGhhdCB0b28uCisgICAjIFN1YmRpcmVjdG9yaWVzIGFyZSByZXNwZWN0ZWQuCisgICBkaXI9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzfC9bXi9dKiR8L3wnYAorICAgdGVzdCAieCRkaXIiID0gIngkb2JqZWN0IiAmJiBkaXI9CisgICBiYXNlPWBlY2hvICIkb2JqZWN0IiB8IHNlZCAtZSAnc3xeLiovfHwnIC1lICdzL1wubyQvLycgLWUgJ3MvXC5sbyQvLydgCisKKyAgIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgorICAgICAgIyBXaXRoIFRydTY0IGNjLCBzaGFyZWQgb2JqZWN0cyBjYW4gYWxzbyBiZSB1c2VkIHRvIG1ha2UgYQorICAgICAgIyBzdGF0aWMgbGlicmFyeS4gIFRoaXMgbWVjaGFuaXNtIGlzIHVzZWQgaW4gbGlidG9vbCAxLjQgc2VyaWVzIHRvCisgICAgICAjIGhhbmRsZSBib3RoIHNoYXJlZCBhbmQgc3RhdGljIGxpYnJhcmllcyBpbiBhIHNpbmdsZSBjb21waWxhdGlvbi4KKyAgICAgICMgV2l0aCBsaWJ0b29sIDEuNCwgZGVwZW5kZW5jaWVzIHdlcmUgb3V0cHV0IGluICRkaXIubGlicy8kYmFzZS5sby5kLgorICAgICAgIworICAgICAgIyBXaXRoIGxpYnRvb2wgMS41IHRoaXMgZXhjZXB0aW9uIHdhcyByZW1vdmVkLCBhbmQgbGlidG9vbCBub3cKKyAgICAgICMgZ2VuZXJhdGVzIDIgc2VwYXJhdGUgb2JqZWN0cyBmb3IgdGhlIDIgbGlicmFyaWVzLiAgVGhlc2UgdHdvCisgICAgICAjIGNvbXBpbGF0aW9ucyBvdXRwdXQgZGVwZW5kZW5jaWVzIGluICRkaXIubGlicy8kYmFzZS5vLmQgYW5kCisgICAgICAjIGluICRkaXIkYmFzZS5vLmQuICBXZSBoYXZlIHRvIGNoZWNrIGZvciBib3RoIGZpbGVzLCBiZWNhdXNlCisgICAgICAjIG9uZSBvZiB0aGUgdHdvIGNvbXBpbGF0aW9ucyBjYW4gYmUgZGlzYWJsZWQuICBXZSBzaG91bGQgcHJlZmVyCisgICAgICAjICRkaXIkYmFzZS5vLmQgb3ZlciAkZGlyLmxpYnMvJGJhc2Uuby5kIGJlY2F1c2UgdGhlIGxhdHRlciBpcworICAgICAgIyBhdXRvbWF0aWNhbGx5IGNsZWFuZWQgd2hlbiAubGlicy8gaXMgZGVsZXRlZCwgd2hpbGUgaWdub3JpbmcKKyAgICAgICMgdGhlIGZvcm1lciB3b3VsZCBjYXVzZSBhIGRpc3RjbGVhbmNoZWNrIHBhbmljLgorICAgICAgdG1wZGVwZmlsZTE9JGRpci5saWJzLyRiYXNlLmxvLmQgICAjIGxpYnRvb2wgMS40CisgICAgICB0bXBkZXBmaWxlMj0kZGlyJGJhc2Uuby5kICAgICAgICAgICMgbGlidG9vbCAxLjUKKyAgICAgIHRtcGRlcGZpbGUzPSRkaXIubGlicy8kYmFzZS5vLmQgICAgIyBsaWJ0b29sIDEuNQorICAgICAgdG1wZGVwZmlsZTQ9JGRpci5saWJzLyRiYXNlLmQgICAgICAjIENvbXBhcSBDQ0MgVjYuMi01MDQKKyAgICAgICIkQCIgLVdjLC1NRAorICAgZWxzZQorICAgICAgdG1wZGVwZmlsZTE9JGRpciRiYXNlLm8uZAorICAgICAgdG1wZGVwZmlsZTI9JGRpciRiYXNlLmQKKyAgICAgIHRtcGRlcGZpbGUzPSRkaXIkYmFzZS5kCisgICAgICB0bXBkZXBmaWxlND0kZGlyJGJhc2UuZAorICAgICAgIiRAIiAtTUQKKyAgIGZpCisKKyAgIHN0YXQ9JD8KKyAgIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgorICAgZWxzZQorICAgICAgcm0gLWYgIiR0bXBkZXBmaWxlMSIgIiR0bXBkZXBmaWxlMiIgIiR0bXBkZXBmaWxlMyIgIiR0bXBkZXBmaWxlNCIKKyAgICAgIGV4aXQgJHN0YXQKKyAgIGZpCisKKyAgIGZvciB0bXBkZXBmaWxlIGluICIkdG1wZGVwZmlsZTEiICIkdG1wZGVwZmlsZTIiICIkdG1wZGVwZmlsZTMiICIkdG1wZGVwZmlsZTQiCisgICBkbworICAgICB0ZXN0IC1mICIkdG1wZGVwZmlsZSIgJiYgYnJlYWsKKyAgIGRvbmUKKyAgIGlmIHRlc3QgLWYgIiR0bXBkZXBmaWxlIjsgdGhlbgorICAgICAgc2VkIC1lICJzLF4uKlwuW2Etel0qOiwkb2JqZWN0OiwiIDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKKyAgICAgICMgVGhhdCdzIGEgdGFiIGFuZCBhIHNwYWNlIGluIHRoZSBbXS4KKyAgICAgIHNlZCAtZSAncyxeLipcLlthLXpdKjpbCSBdKiwsJyAtZSAncywkLDosJyA8ICIkdG1wZGVwZmlsZSIgPj4gIiRkZXBmaWxlIgorICAgZWxzZQorICAgICAgZWNobyAiI2R1bW15IiA+ICIkZGVwZmlsZSIKKyAgIGZpCisgICBybSAtZiAiJHRtcGRlcGZpbGUiCisgICA7OworCisjbm9zaWRlZWZmZWN0KQorICAjIFRoaXMgY29tbWVudCBhYm92ZSBpcyB1c2VkIGJ5IGF1dG9tYWtlIHRvIHRlbGwgc2lkZS1lZmZlY3QKKyAgIyBkZXBlbmRlbmN5IHRyYWNraW5nIG1lY2hhbmlzbXMgZnJvbSBzbG93ZXIgb25lcy4KKworZGFzaG1zdGRvdXQpCisgICMgSW1wb3J0YW50IG5vdGU6IGluIG9yZGVyIHRvIHN1cHBvcnQgdGhpcyBtb2RlLCBhIGNvbXBpbGVyICptdXN0KgorICAjIGFsd2F5cyB3cml0ZSB0aGUgcHJlcHJvY2Vzc2VkIGZpbGUgdG8gc3Rkb3V0LCByZWdhcmRsZXNzIG9mIC1vLgorICAiJEAiIHx8IGV4aXQgJD8KKworICAjIFJlbW92ZSB0aGUgY2FsbCB0byBMaWJ0b29sLgorICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KKyAgICB3aGlsZSB0ZXN0ICQxICE9ICctLW1vZGU9Y29tcGlsZSc7IGRvCisgICAgICBzaGlmdAorICAgIGRvbmUKKyAgICBzaGlmdAorICBmaQorCisgICMgUmVtb3ZlIGAtbyAkb2JqZWN0Jy4KKyAgSUZTPSIgIgorICBmb3IgYXJnCisgIGRvCisgICAgY2FzZSAkYXJnIGluCisgICAgLW8pCisgICAgICBzaGlmdAorICAgICAgOzsKKyAgICAkb2JqZWN0KQorICAgICAgc2hpZnQKKyAgICAgIDs7CisgICAgKikKKyAgICAgIHNldCBmbm9yZCAiJEAiICIkYXJnIgorICAgICAgc2hpZnQgIyBmbm9yZAorICAgICAgc2hpZnQgIyAkYXJnCisgICAgICA7OworICAgIGVzYWMKKyAgZG9uZQorCisgIHRlc3QgLXogIiRkYXNobWZsYWciICYmIGRhc2htZmxhZz0tTQorICAjIFJlcXVpcmUgYXQgbGVhc3QgdHdvIGNoYXJhY3RlcnMgYmVmb3JlIHNlYXJjaGluZyBmb3IgYDonCisgICMgaW4gdGhlIHRhcmdldCBuYW1lLiAgVGhpcyBpcyB0byBjb3BlIHdpdGggRE9TLXN0eWxlIGZpbGVuYW1lczoKKyAgIyBhIGRlcGVuZGVuY3kgc3VjaCBhcyBgYzovZm9vL2JhcicgY291bGQgYmUgc2VlbiBhcyB0YXJnZXQgYGMnIG90aGVyd2lzZS4KKyAgIiRAIiAkZGFzaG1mbGFnIHwKKyAgICBzZWQgJ3M6XlsgIF0qW146IF1bXjpdW146XSpcOlsgICAgXSo6JyIkb2JqZWN0IidcOiA6JyA+ICIkdG1wZGVwZmlsZSIKKyAgcm0gLWYgIiRkZXBmaWxlIgorICBjYXQgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgorICB0ciAnICcgJworJyA8ICIkdG1wZGVwZmlsZSIgfCBcCisjIyBTb21lIHZlcnNpb25zIG9mIHRoZSBIUFVYIDEwLjIwIHNlZCBjYW4ndCBwcm9jZXNzIHRoaXMgaW52b2NhdGlvbgorIyMgY29ycmVjdGx5LiAgQnJlYWtpbmcgaXQgaW50byB0d28gc2VkIGludm9jYXRpb25zIGlzIGEgd29ya2Fyb3VuZC4KKyAgICBzZWQgLWUgJ3MvXlxcJC8vJyAtZSAnL14kL2QnIC1lICcvOiQvZCcgfCBzZWQgLWUgJ3MvJC8gOi8nID4+ICIkZGVwZmlsZSIKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICA7OworCitkYXNoWG1zdGRvdXQpCisgICMgVGhpcyBjYXNlIG9ubHkgZXhpc3RzIHRvIHNhdGlzZnkgZGVwZW5kLm00LiAgSXQgaXMgbmV2ZXIgYWN0dWFsbHkKKyAgIyBydW4sIGFzIHRoaXMgbW9kZSBpcyBzcGVjaWFsbHkgcmVjb2duaXplZCBpbiB0aGUgcHJlYW1ibGUuCisgIGV4aXQgMQorICA7OworCittYWtlZGVwZW5kKQorICAiJEAiIHx8IGV4aXQgJD8KKyAgIyBSZW1vdmUgYW55IExpYnRvb2wgY2FsbAorICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KKyAgICB3aGlsZSB0ZXN0ICQxICE9ICctLW1vZGU9Y29tcGlsZSc7IGRvCisgICAgICBzaGlmdAorICAgIGRvbmUKKyAgICBzaGlmdAorICBmaQorICAjIFggbWFrZWRlcGVuZAorICBzaGlmdAorICBjbGVhcmVkPW5vCisgIGZvciBhcmcgaW4gIiRAIjsgZG8KKyAgICBjYXNlICRjbGVhcmVkIGluCisgICAgbm8pCisgICAgICBzZXQgIiI7IHNoaWZ0CisgICAgICBjbGVhcmVkPXllcyA7OworICAgIGVzYWMKKyAgICBjYXNlICIkYXJnIiBpbgorICAgIC1EKnwtSSopCisgICAgICBzZXQgZm5vcmQgIiRAIiAiJGFyZyI7IHNoaWZ0IDs7CisgICAgIyBTdHJpcCBhbnkgb3B0aW9uIHRoYXQgbWFrZWRlcGVuZCBtYXkgbm90IHVuZGVyc3RhbmQuICBSZW1vdmUKKyAgICAjIHRoZSBvYmplY3QgdG9vLCBvdGhlcndpc2UgbWFrZWRlcGVuZCB3aWxsIHBhcnNlIGl0IGFzIGEgc291cmNlIGZpbGUuCisgICAgLSp8JG9iamVjdCkKKyAgICAgIDs7CisgICAgKikKKyAgICAgIHNldCBmbm9yZCAiJEAiICIkYXJnIjsgc2hpZnQgOzsKKyAgICBlc2FjCisgIGRvbmUKKyAgb2JqX3N1ZmZpeD0iYGVjaG8gJG9iamVjdCB8IHNlZCAncy9eLipcLi8uLydgIgorICB0b3VjaCAiJHRtcGRlcGZpbGUiCisgICR7TUFLRURFUEVORC1tYWtlZGVwZW5kfSAtbyIkb2JqX3N1ZmZpeCIgLWYiJHRtcGRlcGZpbGUiICIkQCIKKyAgcm0gLWYgIiRkZXBmaWxlIgorICBjYXQgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgorICBzZWQgJzEsMmQnICIkdG1wZGVwZmlsZSIgfCB0ciAnICcgJworJyB8IFwKKyMjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCisjIyBjb3JyZWN0bHkuICBCcmVha2luZyBpdCBpbnRvIHR3byBzZWQgaW52b2NhdGlvbnMgaXMgYSB3b3JrYXJvdW5kLgorICAgIHNlZCAtZSAncy9eXFwkLy8nIC1lICcvXiQvZCcgLWUgJy86JC9kJyB8IHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgorICBybSAtZiAiJHRtcGRlcGZpbGUiICIkdG1wZGVwZmlsZSIuYmFrCisgIDs7CisKK2NwcCkKKyAgIyBJbXBvcnRhbnQgbm90ZTogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGlzIG1vZGUsIGEgY29tcGlsZXIgKm11c3QqCisgICMgYWx3YXlzIHdyaXRlIHRoZSBwcmVwcm9jZXNzZWQgZmlsZSB0byBzdGRvdXQuCisgICIkQCIgfHwgZXhpdCAkPworCisgICMgUmVtb3ZlIHRoZSBjYWxsIHRvIExpYnRvb2wuCisgIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgorICAgIHdoaWxlIHRlc3QgJDEgIT0gJy0tbW9kZT1jb21waWxlJzsgZG8KKyAgICAgIHNoaWZ0CisgICAgZG9uZQorICAgIHNoaWZ0CisgIGZpCisKKyAgIyBSZW1vdmUgYC1vICRvYmplY3QnLgorICBJRlM9IiAiCisgIGZvciBhcmcKKyAgZG8KKyAgICBjYXNlICRhcmcgaW4KKyAgICAtbykKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAgICRvYmplY3QpCisgICAgICBzaGlmdAorICAgICAgOzsKKyAgICAqKQorICAgICAgc2V0IGZub3JkICIkQCIgIiRhcmciCisgICAgICBzaGlmdCAjIGZub3JkCisgICAgICBzaGlmdCAjICRhcmcKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCisKKyAgIiRAIiAtRSB8CisgICAgc2VkIC1uIC1lICcvXiMgWzAtOV1bMC05XSogIlwoW14iXSpcKSIuKi8gczo6IFwxIFxcOnAnIFwKKyAgICAgICAtZSAnL14jbGluZSBbMC05XVswLTldKiAiXChbXiJdKlwpIi4qLyBzOjogXDEgXFw6cCcgfAorICAgIHNlZCAnJCBzOiBcXCQ6OicgPiAiJHRtcGRlcGZpbGUiCisgIHJtIC1mICIkZGVwZmlsZSIKKyAgZWNobyAiJG9iamVjdCA6IFxcIiA+ICIkZGVwZmlsZSIKKyAgY2F0IDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCisgIHNlZCA8ICIkdG1wZGVwZmlsZSIgJy9eJC9kO3MvXiAvLztzLyBcXCQvLztzLyQvIDovJyA+PiAiJGRlcGZpbGUiCisgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgOzsKKworbXN2aXN1YWxjcHApCisgICMgSW1wb3J0YW50IG5vdGU6IGluIG9yZGVyIHRvIHN1cHBvcnQgdGhpcyBtb2RlLCBhIGNvbXBpbGVyICptdXN0KgorICAjIGFsd2F5cyB3cml0ZSB0aGUgcHJlcHJvY2Vzc2VkIGZpbGUgdG8gc3Rkb3V0LCByZWdhcmRsZXNzIG9mIC1vLAorICAjIGJlY2F1c2Ugd2UgbXVzdCB1c2UgLW8gd2hlbiBydW5uaW5nIGxpYnRvb2wuCisgICIkQCIgfHwgZXhpdCAkPworICBJRlM9IiAiCisgIGZvciBhcmcKKyAgZG8KKyAgICBjYXNlICIkYXJnIiBpbgorICAgICItR20ifCIvR20ifCItR2kifCIvR2kifCItWkkifCIvWkkiKQorCXNldCBmbm9yZCAiJEAiCisJc2hpZnQKKwlzaGlmdAorCTs7CisgICAgKikKKwlzZXQgZm5vcmQgIiRAIiAiJGFyZyIKKwlzaGlmdAorCXNoaWZ0CisJOzsKKyAgICBlc2FjCisgIGRvbmUKKyAgIiRAIiAtRSB8CisgIHNlZCAtbiAnL14jbGluZSBbMC05XVswLTldKiAiXChbXiJdKlwpIi8gczo6ZWNobyAiYGN5Z3BhdGggLXUgXFwiXDFcXCJgIjpwJyB8IHNvcnQgfCB1bmlxID4gIiR0bXBkZXBmaWxlIgorICBybSAtZiAiJGRlcGZpbGUiCisgIGVjaG8gIiRvYmplY3QgOiBcXCIgPiAiJGRlcGZpbGUiCisgIC4gIiR0bXBkZXBmaWxlIiB8IHNlZCAncyUgJVxcICVnJyB8IHNlZCAtbiAnL15cKC4qXCkkLyBzOjoJXDEgXFw6cCcgPj4gIiRkZXBmaWxlIgorICBlY2hvICIJIiA+PiAiJGRlcGZpbGUiCisgIC4gIiR0bXBkZXBmaWxlIiB8IHNlZCAncyUgJVxcICVnJyB8IHNlZCAtbiAnL15cKC4qXCkkLyBzOjpcMVw6OnAnID4+ICIkZGVwZmlsZSIKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICA7OworCitub25lKQorICBleGVjICIkQCIKKyAgOzsKKworKikKKyAgZWNobyAiVW5rbm93biBkZXBtb2RlICRkZXBtb2RlIiAxPiYyCisgIGV4aXQgMQorICA7OworZXNhYworCitleGl0IDAKKworIyBMb2NhbCBWYXJpYWJsZXM6CisjIG1vZGU6IHNoZWxsLXNjcmlwdAorIyBzaC1pbmRlbnRhdGlvbjogMgorIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCisjIHRpbWUtc3RhbXAtc3RhcnQ6ICJzY3JpcHR2ZXJzaW9uPSIKKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkLiUwMkgiCisjIHRpbWUtc3RhbXAtZW5kOiAiJCIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L2RvYy9DaGFuZ2VMb2cgYi9saWJnY3J5cHQtMS40LjYvZG9jL0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDg0M2M1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L2RvYy9DaGFuZ2VMb2cKQEAgLTAsMCArMSw0NTUgQEAKKzIwMDktMDctMDkgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGdjcnlwdC50ZXhpIChXb3JraW5nIHdpdGggUy1leHByZXNzaW9ucyk6IERlc2NyaWJlIGZvcm1hdAorCWNoYXJhY3RlciAnJVMnLiAgVHlwbyBmaXhlcy4gCisJKGdjcnlfY2lwaGVyX2Nsb3NlLCBnY3J5X21kX2Nsb3NlKQorCShnY3J5X3NleHBfcmVsZWFzZSk6IEV4cGxpY2l0bHkgbWVudGlvbiB6ZXJvaXNhdGlvbi4KKworMjAwOS0wNC0wMiAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogZ2NyeXB0LnRleGkgKFNlbGYtVGVzdHMpOiBGaXggbmFtZSBvZiByZWdpc3RlciBmdW5jdGlvbnMuCisKKzIwMDgtMTItMTAgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGdjcnlwdC50ZXhpIChDcnlwdG9ncmFwaGljIEZ1bmN0aW9ucyk6IEV4cGxhaW4gdGhlIGRvbWFpbgorCXBhcmFtZXRlciBmb3Iga2V5IGdlbmVyYXRpb24uCisKKzIwMDgtMTItMDUgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGdjcnlwdC50ZXhpOiBVcGRhdGVzIGZvciBwdWJrZXkgZ2VuZXJhdGlvbi4KKworMjAwOC0xMC0yMCAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogZ2NyeXB0LnRleGkgKEVycm9yIGhhbmRsZXIpOiBGaXggZGVzY3JpcHRpb24gb2YKKwlnY3J5X2hhbmRsZXJfbm9fbWVtX3QuICBSZXBvcnRlZCBieSBQYXRyaWNrIFN0cmF0ZW1hbi4gIGRlc3JpYmUKKwl3aGF0IHdoYXQgdGhlIGVycm9yIGhhbmRsZXIgaXMgZXhwZWN0ZWQgdG8gZG8uICBGaXhlcyBidWcgIzk2MS4KKworMjAwOC0wOS0xOCAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogZ2NyeXB0LnRleGkgKEZJUFMgTW9kZSk6IEFkZCBzdGF0ZSB0cmFuc2l0aW9uIEVycm9yIHRvIEVycm9yLgorCSogZmlwcy1mc20uZmlnOiBEaXR0by4KKworMjAwOC0wOS0xOCAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogZ2NyeXB0LnRleGk6IEFkZCBhIGNvdXBsZSBvZiBpbmRleCBpdGVtcy4KKwkoRklQUyBNb2RlKTogUmVmbGVjdCByZWNlbnQgY2hhbmdlcy4gCisJKENvbnRyb2xsaW5nIHRoZSBsaWJyYXJ5KTogRGVzY3JpYmUgZ2NyeV9maXBzX21vZGVfYWN0aXZlLgorCisyMDA4LTA5LTE2ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBnY3J5cHQudGV4aSAoRklQUyBNb2RlKTogRGVzY3JpYmUgbmV3IHRyYW5zaXRpb25zIDE4IGFuZCAxOS4KKwkqIGZpcHMtZnNtLmZpZzogQWRkIG5ldyB0cmFuc2l0aW9ucy4KKworMjAwOC0wOS0xNSAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogZ2NyeXB0LnRleGk6IEZvbGQgdGhlIHR3byBGSVBTIGFwcGVuZGljZXMgaW50byBvbmUuCisKKzIwMDgtMDktMTEgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGdjcnlwdC50ZXhpIChQdWJsaWMtS2V5IFN1YnN5c3RlbSBBcmNoaXRlY3R1cmUpOiBFeHBsYWluIFJTQQorCWJsaW5kaW5nLgorCisyMDA4LTA5LTA4ICBNYXJjdXMgQnJpbmttYW5uICA8bWFyY3VzQGcxMGNvZGUuY29tPgorCisJKiBnY3J5cHQudGV4aTogU29tZSB0eXBvcyBmaXhlZC4KKworMjAwOC0wOS0wOCAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogZ2NyeXB0LnRleGk6IEZvcm1hdHRpbmcgY2xlYW51cHMuCisJKiBsZ3BsLnRleGkgKExpYnJhcnkgQ29weWluZyk6IFJlcGxhY2UgQGFwcGVuZGl4IGJ5IEB1bm51bWJlcmVkLgorCSogZ3BsLnRleGkgKENvcHlpbmcpOiBEaXR0by4KKworMjAwOC0wOC0yNyAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKG9ubGluZSk6IFRha2UgY2FyZSBvZiBkZXZlbG9wbWVudCB2ZXJzaW9ucy4KKworMjAwOC0wOC0xOCAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogZ2NyeXB0LnRleGkgKFRvcCk6IFJlbW92ZSB0aGUgZGV0YWlsbWVudS4KKwkoUHVibGljIEtleSBDcnlwdG9ncmFwaGkgKElJKSk6IE1vdmUgaW50byBhIHNlY3Rpb24gb2YgdGhlIFBLCisJaW50ZXJmYWNlIGRlc2NyaXB0aW9uLgorCShIYXNoaW5nKTogTW92ZSBhZnRlciB0aGUgZW5jcnlwdGlvbiBjaGFwdGVycy4KKworMjAwOC0wOC0xNSAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogZ2NyeXB0LnRleGkgKENvbnRyb2xsaW5nIHRoZSBsaWJyYXJ5KTogUmVtb3ZlCisJR0NSWUNUTF9EVU1QX0NPTkZJRyBiZWNhdXNlIGl0IGlzIG5vdCBpbXBsZW1lbnRlZC4KKwkoSW5pdGlhbGl6aW5nIHRoZSBsaWJyYXJ5KTogRGVzY3JpYmUgaW5pdGlhbGl6YXRpb24gc3RlcHMgd2l0aAorCXJlZ2FyZCB0byBzZWN1cmUgbWVtb3J5LgorCisJKiBnY3J5cHQudGV4aSAoV29ya2luZyB3aXRoIGNpcGhlciBoYW5kbGVzKTogQWRqdXN0IGZvcgorCWltcGxlbWVudGF0aW9uIGNoYW5nZXMgb2YgZ2NyeV9jaXBoZXJfc2V0a2V5LCBnY3J5X2NpcGhlcl9zZXRpdiBhbmQKKwlnY3J5X2NpcGhlcl9zZXRjdHIuCisKKzIwMDgtMDEtMDQgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGdjcnlwdC50ZXhpIChDb250cm9sbGluZyB0aGUgbGlicmFyeSk6IEFkZCByZW1hcmsgdGhhdCB0aGUKKwl0aGVvcml0aWNhbCBhdHRhY2sgb24gYSBzZWVkIGZpbGUgaXMgbm90IGZlYXNpYmxlIHVuZGVyIExpbnV4LgorCisyMDA3LTEyLTExICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBnY3J5cHQudGV4aTogVmFyaW91cyBtaW5vciBjb3JyZWN0aW9ucyBhcyByZXBvcnRlZCBieSBFbGllIERlCisJQnJhdWVyIG1vcmUgdGhhbiBhIHllYXIgYWdvLgorCisyMDA3LTA2LTE1ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBnY3J5cHQudGV4aSAoQ29udHJvbGxpbmcgdGhlIGxpYnJhcnkpOiBDbGFyaWZpZWQgdGhlIHVzZSBvZgorCUdDUllDVExfRU5BQkxFX1FVSUNLX1JBTkRPTS4KKworMjAwNy0wNC0zMCAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogSEFDS0lORzogTmV3LiAgVHdvIGl0ZW1zIGJ5IE1hcmN1cy4KKwkqIFJFQURNRS5hcGljaGFuZ2VzOiBNb3ZlIGZyb20gLi4gdG8gaGVyZS4KKwkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkIG5ldyBmaWxlcy4KKworMjAwNy0wNC0wOSAgTWFyY3VzIEJyaW5rbWFubiAgPG1hcmN1c0BnMTBjb2RlLmRlPgorCisJKiBnY3J5cHQudGV4aTogRml4IHNvbWUgdHlwb3MuCisKKzIwMDYtMTEtMDUgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBnY3J5cHQudGV4aSAoR2VuZXJhbCBwdWJsaWMta2V5IHJlbGF0ZWQgRnVuY3Rpb25zKTogVHlwby4KKworMjAwNi0wOS0xOSAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKG9ubGluZSk6IE5ldyB0YXJnZXQuCisKKzIwMDYtMDgtMjkgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGdjcnlwdC50ZXhpIChBdmFpbGFibGUgY2lwaGVycyk6IEFkZCBtaXNzaW5nIGNpcGhlcnMuCisKKzIwMDYtMDMtMTAgIEJyYWQgSGFyZHMgIDxicmFkaEBmcm9nbW91dGgubmV0PiAod2ssIHBhdGNoIDIwMDUtMDQtMjUpCisKKwkqIGdjcnlwdC50ZXhpOiBEb2N1bWVudCBTSEEtMjI0IGFuZCB0eXBvIGZpeGVzLgorCisyMDA2LTAxLTE4ICBCcmFkIEhhcmRzICA8YnJhZGhAZnJvZ21vdXRoLm5ldD4gKHdrIDIwMDYtMDMtMDcpCisKKwkqIGdjcnlwdC50ZXhpIChBdmFpbGFibGUgY2lwaGVyIG1vZGVzKTogVHlwbyBmaXgsIGFkZCBhIGxpdHRsZQorCW1vcmUgZGV0YWlsIG9uIGNpcGhlciBtb2RlcyB2cyBjaXBoZXIgYWxnb3JpdGhtcy4KKworMjAwNi0wMS0wOCAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGdjcnlwdC50ZXhpOiBBZGRlZCBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGdjcnlfY29udHJvbCBjb21tYW5kcy4KKworCSogZ2NyeXB0LnRleGk6IEZpeGVkIHNldmVyYWwgdHlwb3M7IHRoYW5rcyB0byBUb21taSBWYWluaWthaW5lbi4KKworMjAwNS0xMi0xNiAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGdjcnlwdC50ZXhpIChNUEkgZm9ybWF0cyk6IEZpeCByZXR1cm4gdHlwZXMgb2YgZnVuY3Rpb25zOgorCWdjcnlfbXBpX3NjYW4sIGdjcnlfbXBpX3ByaW50LCBnY3J5X21waV9hcHJpbnQuCisKKzIwMDUtMTEtMjYgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBnY3J5cHQudGV4aTogTmV3IGNoYXB0ZXI6IFByaW1lIG51bWJlcnMuCisKKzIwMDUtMTEtMTIgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBnY3J5cHQudGV4aSAoTVBJIGZvcm1hdHMpOiBEb2N1bWVudCB0aGF0IGZvciBnY3J5X21waV9zY2FuIGFuZAorCWluIHRoZSBjYXNlIG9mIEdDUllNUElfRk1UX0hFWCwgQlVGTEVOIG11c3QgYmUgemVyby4KKworMjAwNS0xMC0zMSAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGdjcnlwdC50ZXhpOiBBZGRlZCBtb3JlIGdjcnlfY29udHJvbCByZWxhdGVkIGRlc2NyaXB0aW9ucy4KKworMjAwNS0xMC0xNiAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGdjcnlwdC50ZXhpIChDb250cm9sbGluZyB0aGUgbGlicmFyeSk6IFN0YXJ0IGRvY3VtZW50aW5nIHRoZQorCWV4aXN0aW5nIGNvbnRyb2wgY29tbWFuZHMuCisKKzIwMDUtMDQtMTEgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBnY3J5cHQudGV4aSAoQXZhaWxhYmxlIGhhc2ggYWxnb3JpdGhtcyk6IEFkZCBlbnRyeSBmb3IgV2hpcmxwb29sLgorCisyMDA1LTAzLTMwICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogZ2NyeXB0LnRleGkgKFdvcmtpbmcgd2l0aCBJTyBvYmplY3RzKTogRG9jdW1lbnQgYWMgaW8gb2JqZWN0czsKKwlhZGp1c3QgYWMgc2NoZW1lIGZ1bmN0aW9ucywgd2hpY2ggZG8gbm93IHVzZSBpbyBvYmplY3RzLgorCisyMDA1LTAzLTE5ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogZ2NyeXB0LnRleGkgKFdvcmtpbmcgd2l0aCBjaXBoZXIgaGFuZGxlcyk6IENsYXJpZnkgQ1RTIG1vZGUuCisKKzIwMDUtMDItMDggIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGdjcnlwdC50ZXhpOiBGaXhlZCBkaXJlbnRyeS4KKworMjAwNS0wMi0xMyAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGdjcnlwdC50ZXhpIChVc2luZyBjcnlwdG9ncmFwaGljIGZ1bmN0aW9ucyk6IERvY3VtZW50IG5ldworCWVuY29kaW5nIGFuZCBzY2hlbWUgY3J5cHRvIGZ1bmN0aW9uYWxpdHkuCisKKzIwMDUtMDItMDMgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBnY3J5cHQudGV4aTogRml4ZWQgc2V2ZXJhbCB0eXBvczsgdGhhbmtzIHRvIE1pY2hlbGUgQmFsZGVzc2FyaS4KKworMjAwNS0wMS0wNCAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogZ2NyeXB0LnRleGk6IFVwZGF0ZWQgdG8gdXNlIEBjb3B5aW5nLiAgRml4ZWQgbGlzdCBvZiBjb3B5cmlnaHQKKwl5ZWFyczsgd2UgaGFkIHJlYWwgY2hhbmdlcyBpbiAyMDA0LiAgRml4ZWQgc29tZSBmb3JtYXR0aW5nIGlzc3Vlcy4KKworMjAwNC0wOC0yNCAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGdjcnlwdC50ZXhpIChNaXNjZWxsYW5lb3VzKTogRG9jdW1lbnQgZ2NyeV9tcGlfcmFuZG9taXplLgorCisyMDA0LTA4LTE4ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogZ2NyeXB0LnRleGkgKE11bHRpIFRocmVhZGluZyk6IERvY3VtZW50CisJR0NSWV9USFJFQURfT1BUSU9OX1BUSF9JTVBMLCBHQ1JZX1RIUkVBRF9PUFRJT05fUFRIUkVBRF9JTVBMLgorCisyMDA0LTA1LTA3ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmRlPgorCisJKiBnY3J5cHQudGV4aTogTWVyZ2VkIHNldmVyYWwgZml4ZXMgcmVwb3J0ZWQgYnkgVW1iZXJ0byBTYWxzaS4KKworMjAwNC0wNC0wOCAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5kZT4KKworCSogZ2NyeXB0LnRleGkgKE11bHRpIFRocmVhZGluZyk6IFR5cG8gZml4LgorCisyMDA0LTAzLTExICBNYXJjdXMgQnJpbmttYW5uICA8bWFyY3VzQGcxMGNvZGUuZGU+CisKKwkqIGdjcnlwdC50ZXhpIChNdWx0aSBUaHJlYWRpbmcpOiBQYXJ0aWFsbHkgZG9jdW1lbnQgbmV3IHRocmVhZAorCXN1cHBvcnQuCisKKzIwMDQtMDItMjQgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBnY3J5cHQudGV4aSAoQ2FsY3VsYXRpb25zKTogVHlwbyBmaXguCisKKzIwMDQtMDEtMjUgIE1vcml0eiBTY2h1bHRlICA8bW9AZzEwY29kZS5jb20+CisKKwkqIGdjcnlwdC50ZXhpIChHZW5lcmFsIGNpcGhlciBmdW5jdGlvbnMpOiBGaXhlZCBkZXNjcmlwdGlvbnMgb2YKKwl0aGUgYXJndW1lbnRzIGZvciBHQ1JZQ1RMX0dFVF9LRVlMRU4sIEdDUllDVExfR0VUX0JMS0xFTjsgcmVwb3J0ZWQKKwlieSBSYW5keS4KKworMjAwNC0wMS0xNCAgTW9yaXR6IFNjaHVsdGUgIDxtb0BnMTBjb2RlLmNvbT4KKworCSogZ2NyeXB0LnRleGkgKFB1YmxpYyBLZXkgY3J5cHRvZ3JhcGh5IElJKTogQWRqdXN0ZWQgdG8gbmV3CisJZ2NyeV9hY18qIEFQSTsgZG9jdW1lbnQgZmxhZ3MuCisKKzIwMDMtMTItMDQgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBNYWtlZmlsZS5hbSAoZ2NyeXB0X1RFWElORk9TKTogUmVtb3ZlZCBmZGwudGV4aS4KKworMjAwMy0xMi0wMyAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIGdjcnlwdC50ZXhpOiBDaGFuZ2VkIGxpY2Vuc2UgZnJvbSBGREwgdG8gR1BMIGJlY2F1c2UgdGhpcyBpcyBhCisJcmVmZXJlbmNlIG1hbnVhbCBvbmx5IHVzZWZ1bCBhbG9uZyB3aXRoIGFjdHVhbCBjb2RlLgorCSogZmRsLnRleGk6IFJlbW92ZWQuCisKKwkqIGdjcnlwdC50ZXhpOiBNaW5vciBjbGVhbnVwcworCShXb3JraW5nIHdpdGgga2V5cyk6IENsYXJpZmllZCBnZW5lcmF0aW9uIG9mIFJTQSdzIEUgcGFyYW1ldGVyLgorCShNdWx0aSBUaHJlYWRpbmcpOiBDbGFyaWZpZWQuCisJCisyMDAzLTExLTExICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogZ2NyeXB0LnRleGkgKFdvcmtpbmcgd2l0aCBTLWV4cHJlc3Npb25zKTogQWRkZWQgIiViIi4KKworMjAwMy0xMS0wNCAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIGdjcnlwdC50ZXhpIChSZXRyaWV2aW5nIHJhbmRvbSBudW1iZXJzKTogQWRkIGdjcnlfY3JlYXRlX25vbmNlLgorCisyMDAzLTA4LTMwICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogZ2NyeXB0LnRleGkgKFdvcmtpbmcgd2l0aCBoYXNoIGFsZ29yaXRobXMpOiBDbGFyaWZpZWQgdGhhdCBITUFDCisJZG9lcyBub3Qgd29yayB3aXRoIGFsbCBhbGdvcml0aG1zLgorCisyMDAzLTA3LTMwICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogZ2NyeXB0LnRleGkgKEF2YWlsYWJsZSBhc3ltbWV0cmljIGFsZ29yaXRobXMpOiBNZW50aW9uCisJR0NSWV9BQ19FTEdfRS4KKworMjAwMy0wNy0yOCAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGdjcnlwdC50ZXhpIChXb3JraW5nIHdpdGgga2V5cyk6IE1lbnRpb24gdGhhdCBnY3J5X3BrX3Rlc3RrZXkKKwlhbmQgZ2NyeV9hY19rZXlfdGVzdCBvbmx5IHZlcmlmeSBwcml2YXRlIGtleXMuCisJKFdvcmtpbmcgd2l0aCBrZXlzKTogRml4IHR5cG8uCisJKEdlbmVyYWwgcHVibGljLWtleSByZWxhdGVkIEZ1bmN0aW9ucyk6IEZpeGVkIHNvbWUgc2VudGVuY2VzLAorCXRoYW5rcyB0byBOZWlsIFNwcmluZy4KKworMjAwMy0wNy0yNyAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIGdjcnlwdC50ZXhpOiBBZGp1c3RlZCBkZXNjcmlwdGlvbiBvZiBnY3J5X21waV9zY2FuIGFuZAorCWdjcnlfbXBpX2R1bXAuIEFkZCBnY3J5X21waV9kdW1wLgorCisyMDAzLTA3LTIyICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogZ2NyeXB0LnRleGk6IEFkZGVkIG1vcmUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIHJlZ2lzdGVyCisJbWVjaGFuaXNtLgorCisyMDAzLTA3LTE4ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogZ2NyeXB0LnRleGkgKE1pc2MpOiBBZGQgYSB3YXJuaW5nIG9uIHRoZSB1c2Ugb2Ygb3BhcXVlIHZhbHVlcy4KKworMjAwMy0wNy0xNCAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGdjcnlwdC50ZXhpIChPdmVydmlldyk6IE1lbnRpb24gdGhlIG5vbi10aHJlYWQtc2FmZS1uYXR1cmUgb2YKKwlmdW5jdGlvbnMgbW9kaWZ5aW5nIGNvbnRleHQgc3RvcmVkIGluIGhhbmRsZXMuCisKKzIwMDMtMDctMTIgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBnY3J5cHQudGV4aSAoQXZhaWxhYmxlIGNpcGhlcnMpOiBBZGRlZDogVFdPRklTSDEyOC4KKwkoRXJyb3IgSGFuZGxpbmcpOiBNZXJnZWQgYSBsb3Qgb2YgZG9jdW1lbnRhdGlvbiB0YWtlbiBmcm9tIEdQR01FLgorCisyMDAzLTA3LTA4ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogZ2NyeXB0LnRleGkgKFdvcmtpbmcgd2l0aCBzZXRzIG9mIGRhdGEpOiBEb2N1bWVudGVkOgorCWdjcnlfYWNfZGF0YV9jb3B5LgorCisyMDAzLTA3LTA3ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogZ2NyeXB0LnRleGk6IERvY3VtZW50ZWQgbW9kdWxlIHN5c3RlbS4KKworMjAwMy0wNy0wNSAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGdjcnlwdC50ZXhpIChXb3JraW5nIHdpdGggY2lwaGVyIGhhbmRsZXMpOiBTbWFsbCBmaXggYnkgU2ltb24KKwlKb3NlZnNzb24gPGphc0BleHR1bmRvLmNvbT4uCisKKzIwMDMtMDctMDIgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBnY3J5cHQudGV4aTogRG9jdW1lbnRlZCBhYyBpbnRlcmZhY2UuCisKKzIwMDMtMDYtMTggIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBnY3J5cHQudGV4aTogU21hbGwgZml4ZXMuCisKKzIwMDMtMDYtMTYgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBjaXBoZXItcmVmLnNnbWw6IFJlbW92ZWQgZmlsZS4KKwkqIGRpZ2VzdC1yZWYuc2dtbDogTGlrZXdpc2UuCisJKiBtaXNjLXJlZi5zZ21sOiBMaWtld2lzZS4KKwkqIHB1YmtleS1yZWYuc2dtbDogTGlrZXdpc2UuCisJKiByZWZlcmVuY2Uuc2dtbDogTGlrZXdpc2UuCisJKiB2ZXJzaW9uLnNnbWwuaW46IExpa2V3aXNlLgorCisyMDAzLTA2LTE1ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogZ2NyeXB0LnRleGk6IERvY3VtZW50ZWQgc2V2ZXJhbCBwYXJ0cyBvZiB0aGUgbGlicmFyeSwgbWVyZ2VkCisJc29tZSBkb2N1bWVudGF0aW9uIGZyb20gR1BHTUUncyBtYW51YWwsIHJlLXN0cnVjdHVyZWQgdGhlIHdob2xlCisJbWFudWFsLCBhZGRlZCBtb3JlIG1lbnVzLgorCisyMDAzLTA2LTE0ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogZ2NyeXB0LnRleGkgKEhhc2ggRnVuY3Rpb25zKTogQWRqdXN0ZWRlZCBkZXNjcmlwdGlvbiBvZgorCWdjcnlfbWRfY29weS4KKwkKKzIwMDMtMDYtMTIgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBnY3J5cHQudGV4aSAoUHVibGljIEtleSBGdW5jdGlvbnMpOiBGaXggZXhhbXBsZSBTLUV4cCwgaS5lLjoKKwlhZGRlZCB0aGUgbnVtYmVyIG9mIGZvbGxvd2luZyBkaWdpdHMgYXMgcHJlZml4IHRvIHRoZSBudW1iZXIgb2YKKwliaXRzLgorCShQdWJsaWMgS2V5IEZ1bmN0aW9ucyk6IERvY3VtZW50IHRoZSBnZW5lcmFsIHVzYWdlIG9mIGBmbGFncycsCisJaW5jbHVkaW5nIHRoZSBuby1ibGluZGluZyBmbGFnLgorCisyMDAzLTA2LTExICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogZ2NyeXB0LnRleGkgKEhhc2ggRnVuY3Rpb25zKTogRG9jdW1lbnQgcG9zc2libGUgdmFsdWVzIG9mIEhELgorCisyMDAzLTA2LTA5ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogZ2NyeXB0LnRleGkgKFZlcnNpb24gQ2hlY2spOiBDaGFuZ2VkIGRlc2NyaXB0aW9uIG9mCisJZ2NyeV9jaGVja192ZXJzaW9uOyB0aGUgdXNlciBub3cgKm11c3QqIGNhbGwgdGhlIGZ1bmN0aW9uIHRvCisJaW5pdGlhbGl6ZSB0aGUgbGlicmFyeS4KKworMjAwMy0wNi0wOCAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGdjcnlwdC50ZXhpOiBDaGFuZ2UgZm9yIGxpYmdwZy1lcnJvci4KKworMjAwMy0wNS0yMiAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGdjcnlwdC50ZXhpIChQdWJsaWMgS2V5IEZ1bmN0aW9ucyk6IEZpeGVkIHR5cG8uCisKKzIwMDMtMDUtMTcgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBnY3J5cHQudGV4aSAoUHVibGljIEtleSBGdW5jdGlvbnMpOiBNZW50aW9uIHRoYXQgb25seSB0aGUKKwljaGVja2luZyBvZiBzZWNyZXQga2V5cyBpcyBzdXBwb3J0ZWQgY3VycmVudGx5LgorCisyMDAzLTAzLTMwICBTaW1vbiBKb3NlZnNzb24gIDxqYXNAZXh0dW5kby5jb20+CisKKwkqIGdjcnlwdC50ZXhpOiBBZGQgQ1RSLgorCisyMDAzLTAzLTIyICBTaW1vbiBKb3NlZnNzb24gIDxqYXNAZXh0dW5kby5jb20+CisKKwkqIGdjcnlwdC50ZXhpOiBBZGQgQ0JDLU1BQy4KKworMjAwMy0wMy0wNCAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGdjcnlwdC50ZXhpIChDaXBoZXIgRnVuY3Rpb25zKTogQWRkZWQgZ2NyeV9jaXBoZXJfcmVzZXQuCisKKzIwMDMtMDEtMjMgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBnY3J5cHQudGV4aSAoZ2NyeV9wa19kZWNyeXB0KTogRGVzY3JpYmVkIHVzZSBvZiBGTEFHUworCisyMDAzLTAxLTIwICBTaW1vbiBKb3NlZnNzb24gIDxqYXNAZXh0dW5kby5jb20+CisKKwkqIGdjcnlwdC50ZXhpIChIYXNoIEZ1bmN0aW9ucyk6IEFkZCBDUkMuCisKKzIwMDMtMDEtMTkgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBnY3J5cHQudGV4aTogTW9zdCBmdW5jdGlvbnMgYXJlIG5vdyBkb2N1bWVudGVkLiAgU3RpbGwgbmVlZCB0bworCWZpbmUgdHVuZSB0aGUgbWVudSBzdHJ1Y3R1cmUsIGRvY3VtZW50IHNvbWUgdXRpbGl0eSBmdW5jdGlvbnMsCisJbWFyayB1cCBpbmRpY2VzIGFuZCByZWZlcmVuY2VzIGFuZCBhZGQgZXhhbXBsZXMuCisKKzIwMDItMDgtMTQgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBnY3J5cHQudGV4aTogVHlwbyBmaXhlcy4KKworMjAwMi0wNS0xNCAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIGxncGwudGV4aTogTmV3LgorCSogZ2NyeXB0LnRleGk6IEluY2x1ZGVkIGxncGwgYW5kIGNvbW1lbnRlZCBub3QgeWV0IGNvbnZlcnRlZCB0ZXh0LgorCisyMDAyLTA0LTE2ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogdmVyc2lvbi5zZ21sLmluLCBjaXBoZXItcmVmLnNnbWwsIGRpZ2VzdC1yZWYuc2dtbCwgbWlzYy1yZWYuc2dtbAorCSogcHVia2V5LXJlZi5zZ21sLCByZWZlcmVuY2Uuc2dtbDogUmVtb3ZlZC4KKwkqIGdjcnlwdC50ZXhpOiBOZXcuIEJhc2VkIG9uIHRoZSBvbGQgc2dtbCB2ZXJzaW9uLgorCSogZ3BsLnRleGksIGZkbC50ZXhpOiBOZXcuCisJKiBNYWtlZmlsZS5hbTogQWRqdXN0ZWQgZm9yIHVzZSB3aXRoIHRleGluZm8uCisKKzIwMDAtMTItMjEgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJUmVuYW1lZCB0aGUgZ2NyeXB0cmVmLnNnbWwgZmlsZXMgYW5kIHJlbW92ZWQgdGhlIEdudVBHIHN0dWZmLgorCitUdWUgT2N0IDI2IDE0OjEwOjIxIENFU1QgMTk5OSAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5kZT4KKworCSogTWFrZWZpbGUuYW0gKFNVQkRJUlMpOiBSZW1vdmVkIGdwaCBmcm9tIHRoaXMgZGV2ZWxvcG1lbnQgc2VyaWVzCisKK01vbiBTZXAgIDYgMTk6NTk6MDggQ0VTVCAxOTk5ICBXZXJuZXIgS29jaCAgPHdrQGlzaWwuZC5zaHV0dGxlLmRlPgorCisJKiBNYWtlZmlsZS5hbSAoU1VCRElSUyk6IE5ldyBzdWJkaXIgZ3BoIGZvciB0aGUgbWFudWFsLgorCitUaHUgSnVsIDIyIDIwOjAzOjAzIENFU1QgMTk5OSAgV2VybmVyIEtvY2ggIDx3a0Bpc2lsLmQuc2h1dHRsZS5kZT4KKworCSogZ3BnLnNnbWwgKC0tYWx3YXlzLXRydXN0KTogQWRkZWQuCisKK1dlZCBKdWwgMTQgMTk6NDI6MDggQ0VTVCAxOTk5ICBXZXJuZXIgS29jaCAgPHdrQGlzaWwuZC5zaHV0dGxlLmRlPgorCisJKiBNYWtlZmlsZS5hbTogQ3JlYXRlIGEgZHVtbXkgbWFuIHBhZ2UgaWYgZG9jYm9vay10by1tYW4gaXMgbWlzc2luZy4KKworV2VkIEp1biAxNiAyMDoxNjoyMSBDRVNUIDE5OTkgIFdlcm5lciBLb2NoICA8d2tAaXNpbC5kLnNodXR0bGUuZGU+CisKKwkqIGdwZzEucG9kOiBSZW1vdmVkLgorCSogZ3BnLnNnbWw6IE5ldy4gUmVwbGFjZXMgdGhlIHBvZCBmaWxlCisJKiBNYWtlZmlsZS5hbTogQWRkIHJ1bGUgdG8gbWFrZSBhIG1hbiBmaWxlIGZyb20gc2dtbAorCitUdWUgSnVuIDE1IDEyOjIxOjA4IENFU1QgMTk5OSAgV2VybmVyIEtvY2ggIDx3a0Bpc2lsLmQuc2h1dHRsZS5kZT4KKworCSogTWFrZWZpbGUuaW4uaW46IFVzZSBERVNURElSLgorCitNb24gTWF5IDMxIDE5OjQxOjEwIENFU1QgMTk5OSAgV2VybmVyIEtvY2ggIDx3a0Bpc2lsLmQuc2h1dHRsZS5kZT4KKworCSogZ3BnLjFwb2Q6IEVuaGFuY2VkIHRoZSBCdWdzIHNlY3Rpb24gKE1pY2hhZWwpLgorCitXZWQgRmViIDEwIDE3OjE1OjM5IENFVCAxOTk5ICBXZXJuZXIgS29jaCAgPHdrQGlzaWwuZC5zaHV0dGxlLmRlPgorCisJKiBncGcuMXBvZDogU3BlbGxpbmcgYW5kIGdyYW1tYXIgY29ycmVjdGlvbnMgKEpvaG4gQS4gTWFydGluKQorCSogRkFROiBEaXR0by4KKwkqIERFVEFJTFM6IERpdHRvLgorCisgQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDIsIDIwMDMsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0aGUgYXV0aG9yIGdpdmVzCisgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dCBldmVuIHRoZQorIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L2RvYy9IQUNLSU5HIGIvbGliZ2NyeXB0LTEuNC42L2RvYy9IQUNLSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMzgwYjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvZG9jL0hBQ0tJTkcKQEAgLTAsMCArMSw2NiBAQAorICAgICAgICAgICAgICAgICAgICAgICAgVmFyaW91cyBoYWNraW5nIG5vdGVzICAgICAgICAgICAgICAgICAgLSotIHRleHQgLSotCisgICAgICAgICAgICAgICAgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09CisKKworVGFraW5nIG9wdGltaXplZCBNUEkgY29kZSBvdXQgb2YgR01QOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEkgZ2VuZXJhdGVkIHRoZSBwZW50aXVtNC8qIGZpbGVzIGJ5IGdsdWVpbmcgdGhlIGV4aXN0aW5nIGFzc2VtYmxlcgorICBwcm9sb2d1ZXMgdG8gdGhlIEdNUCA0LjIuMSBhc3NlbWJsZXIgZmlsZXMgZ2VuZXJhdGVkIHdpdGggdGhlIG00CisgIHRvb2wgaW4gR01QJ3MgYnVpbGQgcHJvY2VzcywgZm9yIGV4YW1wbGU6CisKKyAgICAkIG00IC1ESEFWRV9DT05GSUdfSCAtRF9fR01QX1dJVEhJTl9HTVAgLURPUEVSQVRJT05fcnNoaWZ0IC1EUElDIFwKKyAgICAgIHJzaGlmdC5hc20gPnRtcC1yc2hpZnQucworCisgIFRoZW4gdG1wLXJzaGlmdCB3aWxsIGNvbnRhaW4gdGhlIGFzc2VtYmxlciBpbnN0cnVjdGlvbnMgZm9yIHRoZQorICBjb25maWd1cmVkIHBsYXRmb3JtLiAgVW5mb3J0dW5hdGVseSwgdGhpcyB3YXkgdGhlIGNvbW1lbnRzIGFyZSBsb3N0LgorICBGb3IgbW9zdCBmaWxlcyBJIHJlLWluc2VydGVkIHNvbWUgb2YgdGhlIGNvbW1lbnRzLCBidXQgdGhpcyBpcworICB0ZWRpb3VzIHdvcmsuCisKKworRGVidWdnaW5nIG1hdGggc3R1ZmY6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBXaGlsZSBkZWJ1Z2dpbmcgdGhlIEVDQyBjb2RlIGluIGxpYmdjcnlwdCwgSSB3YXMgaW4gbmVlZCBmb3Igc29tZQorICBjb21wdXRlciBhbGdlYnJhIHN5c3RlbSB3aGljaCB3b3VsZCBhbGxvdyBtZSB0byB2ZXJpZnkgdGhlIG51bWJlcnMKKyAgaW4gdGhlIGRlYnVnZ2luZyBlYXNpbHkuICBJIGZvdW5kIHRoYXQgUEFSSSAocGFyaS1ncCBwYWNrYWdlIGluCisgIERlYmlhbikgaGFzIHN1cHBvcnQgZm9yIGVsbGlwdGljIGN1cnZlcy4gIFRoZSBiZWxvdyBjb21tYW5kcyBzaG93cworICBob3cgdGhleSBhcmUgc2V0IHVwIGFuZCB1c2VkIHdpdGggYW4gZXhhbXBsZS4KKworICA9PT04PD09PT09PT09CisgIGhleHRvZGVjKHMpPWxvY2FsKHY9VmVjKHMpLGE9MTAsYj0xMSxjPTEyLGQ9MTMsZT0xNCxmPTE1LEE9MTAsQj0xMSxDPTEyLEQ9MTMsRT0xNCxGPTE1LGgpO2lmKCNzZXR1bmlvbihTZXQodiksVmVjKCIwMTIzNDU2Nzg5QUJDREVGYWJjZGVmIikpPjIyLGVycm9yKTtmb3IoaT0xLCN2LGg9c2hpZnQoaCw0KStldmFsKHZbaV0pKTtoCisgIAorICBwID0gaGV4dG9kZWMoIjAxRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRiIpCisgIGEgPSBoZXh0b2RlYygiMDFGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZDIikKKyAgYiA9IGhleHRvZGVjKCI1MTk1M0VCOTYxOEUxQzlBMUY5MjlBMjFBMEI2ODU0MEVFQTJEQTcyNUI5OUIzMTVGM0I4QjQ4OTkxOEVGMTA5RTE1NjE5Mzk1MUVDN0U5MzdCMTY1MkMwQkQzQkIxQkYwNzM1NzNERjg4M0QyQzM0RjFFRjQ1MUZENDZCNTAzRjAwIikKKyAgCisgIC8qIFNldCB1cCB5XjIgPSB4XjMgKyBheCArIGIgbW9kIChwKS4gICovCisgIGUgPSBlbGxpbml0KE1vZCgxLHApKlswLDAsMCxhLGJdKTsKKyAgCisgIGd4ID0gaGV4dG9kZWMgKCIwMEM2ODU4RTA2QjcwNDA0RTlDRDlFM0VDQjY2MjM5NUI0NDI5QzY0ODEzOTA1M0ZCNTIxRjgyOEFGNjA2QjREM0RCQUExNEI1RTc3RUZFNzU5MjhGRTFEQzEyN0EyRkZBOERFMzM0OEIzQzE4NTZBNDI5QkY5N0U3RTMxQzJFNUJENjYiKQorICBneSA9IGhleHRvZGVjICgiMDExODM5Mjk2QTc4OUEzQkMwMDQ1QzhBNUZCNDJDN0QxQkQ5OThGNTQ0NDk1NzlCNDQ2ODE3QUZCRDE3MjczRTY2MkM5N0VFNzI5OTVFRjQyNjQwQzU1MEI5MDEzRkFEMDc2MTM1M0M3MDg2QTI3MkMyNDA4OEJFOTQ3NjlGRDE2NjUwIikKKyAgZyA9IE1vZCgxLHApKltneCxneV0KKyAgCisgIG4gPSBoZXh0b2RlYyAoIjAxRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZBNTE4Njg3ODNCRjJGOTY2QjdGQ0MwMTQ4RjcwOUE1RDAzQkI1QzlCODg5OUM0N0FFQkI2RkI3MUU5MTM4NjQwOSIpCisgIAorICAvKiBWZXJpZnkgdGhhdCBHIGlzIG9uIHRoZSBjdXJ2ZSwgYW5kIHRoYXQgbiBpcyB0aGUgb3JkZXIuICAqLworICBlbGxpc29uY3VydmUgKGUsZykKKyAgaXNwcmltZSAobikKKyAgZWxscG93IChlLGcsbikKKyAgCisgIGQgPSBoZXh0b2RlYyAoIjAxOEY5NTczRjI1MDU5NTcxQkRGNjE0NTI5OTUzREUyNTQwNDk3Q0VEQUJEMDRGM0FGNzg4MTNCRUQ3QkIxNjNBMkZEOTE5RUVDRjgyMjg0OEZDQTM5RUY1NUU1MDBGOENFODYxQzdENTNEMzcxODU3Rjc3NzRCNzk0MjhFODg3RjgxQiIpCisgIAorICBxeCA9IGhleHRvZGVjICgiMDAzMTZBQUFEM0U5MDU4NzU5MzhGNTg4QkQ5RThBNDc4NUVGOUJEQjc2RDYyQTgzQTUzNDBGODJDQjhFODAwQjI1NjE5RjVDM0VBMDJCN0E0RkE0M0Q3NDk3Qzc3MDJGN0RGQkVBQzhFOEY5MkMzQ0FBQkQ5Rjg0MTgyRkRBMzkxQjNCIikKKyAgLyogTm90ZTogV1JPTkchIChJdCBpcyBhcHBhcmVudCB0aGF0IHRoaXMgaXMgdGhlIHNhbWUgYXMgWCBzaGlmdGVkIGJ5CisgICAgIDggYml0KS4gICovCisgIHF5ID0gaGV4dG9kZWMgKCIwMDAwMzE2QUFBRDNFOTA1ODc1OTM4RjU4OEJEOUU4QTQ3ODVFRjlCREI3NkQ2MkE4M0E1MzQwRjgyQ0I4RTgwMEIyNTYxOUY1QzNFQTAyQjdBNEZBNDNENzQ5N0M3NzAyRjdERkJFQUM4RThGOTJDM0NBQUJEOUY4NDE4MkZEQTM5MUIiKQorICBxID0gTW9kKDEscCkqW3F4LHF5XQorICAKKyAgLyogQ2FsY3VsYXRlIHdoYXQgUSBzaG91bGQgYmUgZ2l2ZW4gZC4gICovCisgIGVsbHBvdyAoZSxnLGQpCisgIAorICAvKiBUaGlzIGlzIG5vdCAwIGFuZCB0aHVzIHNob3dzIHRoYXQgbGliZ2NyeXB0IGdhdmUgUSBhbmQgZCB0aGF0IGRvCisgIG5vdCBtYXRjaC4gICovCisgIGVsbHBvdyAoZSxnLGQpIC0gcQorICA9PT09ODw9PT09PT09PT09PT09PT09PT09PT0KKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L2RvYy9NYWtlZmlsZS5hbSBiL2xpYmdjcnlwdC0xLjQuNi9kb2MvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI1MTA2NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9kb2MvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw3MSBAQAorIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBjcmVhdGUgTWFrZWZpbGUuaW4KKyMgQ29weXJpZ2h0IChDKSAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisjCisjIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorCitFWFRSQV9ESVNUID0gUkVBRE1FLmFwaWNoYW5nZXMgSEFDS0lORyBcCisJICAgICBsaWJnY3J5cHQtbW9kdWxlcy5lcHMgZmlwcy1mc20uZXBzIFwKKwkgICAgIGxpYmdjcnlwdC1tb2R1bGVzLnBuZyBmaXBzLWZzbS5wbmcgXAorICAgICAgICAgICAgIGxpYmdjcnlwdC1tb2R1bGVzLnBkZiBmaXBzLWZzbS5wZGYgCisKK0RJU1RDTEVBTkZJTEVTID0gZ2NyeXB0LmNwcworCitCVUlMVF9TT1VSQ0VTID0gbGliZ2NyeXB0LW1vZHVsZXMuZXBzIGZpcHMtZnNtLmVwcyBcCisgICAgICAgICAgICAgICAgbGliZ2NyeXB0LW1vZHVsZXMucG5nIGZpcHMtZnNtLnBuZyBcCisgICAgICAgICAgICAgICAgbGliZ2NyeXB0LW1vZHVsZXMucGRmIGZpcHMtZnNtLnBkZgorCitpbmZvX1RFWElORk9TID0gZ2NyeXB0LnRleGkKK2djcnlwdF9URVhJTkZPUyA9IGxncGwudGV4aSBncGwudGV4aSBsaWJnY3J5cHQtbW9kdWxlcy5maWcgZmlwcy1mc20uZmlnCisKKworLmZpZy5wbmc6CisJZmlnMmRldiAtTCBwbmcgYHRlc3QgLWYgJyQ8JyB8fCBlY2hvICckKHNyY2RpcikvJ2AkPCAkQAorCisuZmlnLmpwZzoKKwlmaWcyZGV2IC1MIGpwZyBgdGVzdCAtZiAnJDwnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYCQ8ICRACisKKy5maWcuZXBzOgorCWZpZzJkZXYgLUwgZXBzIGB0ZXN0IC1mICckPCcgfHwgZWNobyAnJChzcmNkaXIpLydgJDwgJEAKKworLmZpZy5wZGY6CisJZmlnMmRldiAtTCBwZGYgYHRlc3QgLWYgJyQ8JyB8fCBlY2hvICckKHNyY2RpcikvJ2AkPCAkQAorCisKKyMgTWFrZSBzdXJlIHRoYXQgZ2NyeXB0LnRleGkgaXMgdG91Y2hlZCBpZiBhbnkgb3RoZXIgc291cmNlIGZpbGUgaGFzCisjIGJlZW4gbW9kaWZpZWQuICBUaGlzIGlzIHJlcXVpcmVkIHNvIHRoYXQgdGhlIHZlcnNpb24udGV4aSBtYWdpYworIyB1cGRhdGVzIHRoZSByZWxlYXNlIGRhdGUuCitnbnVwZy50ZXhpIDogJChnY3J5cHRfVEVYSU5GT1MpCisJdG91Y2ggJChzcmNkaXIpL2djcnlwdC50ZXhpCisKK29ubGluZTogZ2NyeXB0Lmh0bWwgZ2NyeXB0LnBkZiBnY3J5cHQuaW5mbworCXNldCAtZTsgXAorCWVjaG8gIlVwbG9hZGluZyBjdXJyZW50IG1hbnVhbHMgdG8gd3d3LmdudXBnLm9yZyAuLi4iOyBcCisJY3AgbGliZ2NyeXB0LW1vZHVsZXMucG5nIGdjcnlwdC5odG1sLzsgXAorCWNwIGZpcHMtZnNtLnBuZyBnY3J5cHQuaHRtbC87IFwKKyAgICAgICAgdXNlcj13ZXJuZXIgOyBkYXNoZGV2ZWw9IiIgOyBcCisgICAgICAgIGlmIGVjaG8gIkBQQUNLQUdFX1ZFUlNJT05AIiB8IGdyZXAgLS0gIi1zdm4iID4vZGV2L251bGw7IHRoZW4gXAorCSAgZGFzaGRldmVsPSItZGV2ZWwiIDsgXAorCSAgY3AgZ2NyeXB0LnBkZiBnY3J5cHQuaHRtbC87IFwKKwkgIGNwIGdjcnlwdC5pbmZvIGdjcnlwdC5odG1sLzsgXAorCWVsc2UgXAorICAgICAgICAgIHJzeW5jIC12IGdjcnlwdC5wZGYgZ2NyeXB0LmluZm8gXAorICAgICAgICAgICAgICAgJCR7dXNlcn1AdHJpdGhlbWl1cy5nbnVwZy5vcmc6d2Vic3BhY2UvbWFudWFscy8gOyBcCisgICAgICAgIGZpIDsgXAorCWNkIGdjcnlwdC5odG1sIDsgXAorICAgICAgICByc3luYyAtdnIgLS1leGNsdWRlPScuc3ZuJyAuICBcCisJICAkJHt1c2VyfUB0cml0aGVtaXVzLmdudXBnLm9yZzp3ZWJzcGFjZS9tYW51YWxzL2djcnlwdCQke2Rhc2hkZXZlbH0vIAorCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvZG9jL01ha2VmaWxlLmluIGIvbGliZ2NyeXB0LTEuNC42L2RvYy9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmFjZmJlCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L2RvYy9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDY5OSBAQAorIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYnkgYXV0b21ha2UgMS4xMC4yIGZyb20gTWFrZWZpbGUuYW0uCisjIEBjb25maWd1cmVfaW5wdXRACisKKyMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAorIyAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKKyMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorIyBQQVJUSUNVTEFSIFBVUlBPU0UuCisKK0BTRVRfTUFLRUAKKworIyBDb3B5cmlnaHQgKEMpIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyMKKyMgTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCitWUEFUSCA9IEBzcmNkaXJACitwa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKK3BrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAorYW1fX2NkID0gQ0RQQVRIPSIkJHtaU0hfVkVSU0lPTisufSQoUEFUSF9TRVBBUkFUT1IpIiAmJiBjZAoraW5zdGFsbF9zaF9EQVRBID0gJChpbnN0YWxsX3NoKSAtYyAtbSA2NDQKK2luc3RhbGxfc2hfUFJPR1JBTSA9ICQoaW5zdGFsbF9zaCkgLWMKK2luc3RhbGxfc2hfU0NSSVBUID0gJChpbnN0YWxsX3NoKSAtYworSU5TVEFMTF9IRUFERVIgPSAkKElOU1RBTExfREFUQSkKK3RyYW5zZm9ybSA9ICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKK05PUk1BTF9JTlNUQUxMID0gOgorUFJFX0lOU1RBTEwgPSA6CitQT1NUX0lOU1RBTEwgPSA6CitOT1JNQUxfVU5JTlNUQUxMID0gOgorUFJFX1VOSU5TVEFMTCA9IDoKK1BPU1RfVU5JTlNUQUxMID0gOgorYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKK2hvc3RfdHJpcGxldCA9IEBob3N0QAorc3ViZGlyID0gZG9jCitESVNUX0NPTU1PTiA9ICQoZ2NyeXB0X1RFWElORk9TKSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gXAorCSQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHNyY2Rpcikvc3RhbXAtdnRpIFwKKwkkKHNyY2RpcikvdmVyc2lvbi50ZXhpIENoYW5nZUxvZyBtZGF0ZS1zaCB0ZXhpbmZvLnRleAorQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAorYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvbTQvbGlidG9vbC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9ub2V4ZWNzdGFjay5tNCAkKHRvcF9zcmNkaXIpL200L29uY2Vvbmx5Lm00IFwKKwkkKHRvcF9zcmNkaXIpL200L3NvY2tsZW4ubTQgJCh0b3Bfc3JjZGlyKS9tNC9zeXNfc29ja2V0X2gubTQgXAorCSQodG9wX3NyY2RpcikvYWNpbmNsdWRlLm00ICQodG9wX3NyY2RpcikvY29uZmlndXJlLmFjCithbV9fY29uZmlndXJlX2RlcHMgPSAkKGFtX19hY2xvY2FsX200X2RlcHMpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykgXAorCSQoQUNMT0NBTF9NNCkKK21raW5zdGFsbGRpcnMgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMKK0NPTkZJR19IRUFERVIgPSAkKHRvcF9idWlsZGRpcikvY29uZmlnLmgKK0NPTkZJR19DTEVBTl9GSUxFUyA9CitTT1VSQ0VTID0KK0RJU1RfU09VUkNFUyA9CitJTkZPX0RFUFMgPSAkKHNyY2RpcikvZ2NyeXB0LmluZm8KK2FtX19URVhJTkZPX1RFWF9ESVIgPSAkKHNyY2RpcikKK0RWSVMgPSBnY3J5cHQuZHZpCitQREZTID0gZ2NyeXB0LnBkZgorUFNTID0gZ2NyeXB0LnBzCitIVE1MUyA9IGdjcnlwdC5odG1sCitURVhJTkZPUyA9IGdjcnlwdC50ZXhpCitURVhJMkRWSSA9IHRleGkyZHZpCitURVhJMlBERiA9ICQoVEVYSTJEVkkpIC0tcGRmIC0tYmF0Y2gKK01BS0VJTkZPSFRNTCA9ICQoTUFLRUlORk8pIC0taHRtbAorQU1fTUFLRUlORk9IVE1MRkxBR1MgPSAkKEFNX01BS0VJTkZPRkxBR1MpCitEVklQUyA9IGR2aXBzCithbV9faW5zdGFsbGRpcnMgPSAiJChERVNURElSKSQoaW5mb2RpcikiCithbV9fdnBhdGhfYWRqX3NldHVwID0gc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3N8LnwufGcnYDsKK2FtX192cGF0aF9hZGogPSBjYXNlICQkcCBpbiBcCisgICAgJChzcmNkaXIpLyopIGY9YGVjaG8gIiQkcCIgfCBzZWQgInN8XiQkc3JjZGlyc3RyaXAvfHwiYDs7IFwKKyAgICAqKSBmPSQkcDs7IFwKKyAgZXNhYzsKK2FtX19zdHJpcF9kaXIgPSBgZWNobyAkJHAgfCBzZWQgLWUgJ3N8Xi4qL3x8J2A7CitESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQorQUNMT0NBTCA9IEBBQ0xPQ0FMQAorQU1UQVIgPSBAQU1UQVJACitBUiA9IEBBUkAKK0FTID0gQEFTQAorQVVUT0NPTkYgPSBAQVVUT0NPTkZACitBVVRPSEVBREVSID0gQEFVVE9IRUFERVJACitBVVRPTUFLRSA9IEBBVVRPTUFLRUAKK0FXSyA9IEBBV0tACitCVUlMRF9GSUxFVkVSU0lPTiA9IEBCVUlMRF9GSUxFVkVSU0lPTkAKK0JVSUxEX1JFVklTSU9OID0gQEJVSUxEX1JFVklTSU9OQAorQlVJTERfVElNRVNUQU1QID0gQEJVSUxEX1RJTUVTVEFNUEAKK0NDID0gQENDQAorQ0NBUyA9IEBDQ0FTQAorQ0NBU0RFUE1PREUgPSBAQ0NBU0RFUE1PREVACitDQ0FTRkxBR1MgPSBAQ0NBU0ZMQUdTQAorQ0NERVBNT0RFID0gQENDREVQTU9ERUAKK0NGTEFHUyA9IEBDRkxBR1NACitDUFAgPSBAQ1BQQAorQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACitDWFggPSBAQ1hYQAorQ1hYQ1BQID0gQENYWENQUEAKK0NYWERFUE1PREUgPSBAQ1hYREVQTU9ERUAKK0NYWEZMQUdTID0gQENYWEZMQUdTQAorQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKK0RFRlMgPSBAREVGU0AKK0RFUERJUiA9IEBERVBESVJACitETExUT09MID0gQERMTFRPT0xACitETF9MSUJTID0gQERMX0xJQlNACitFQ0hPID0gQEVDSE9ACitFQ0hPX0MgPSBARUNIT19DQAorRUNIT19OID0gQEVDSE9fTkAKK0VDSE9fVCA9IEBFQ0hPX1RACitFR1JFUCA9IEBFR1JFUEAKK0VYRUVYVCA9IEBFWEVFWFRACitGNzcgPSBARjc3QAorRkFMTEJBQ0tfU09DS0xFTl9UID0gQEZBTExCQUNLX1NPQ0tMRU5fVEAKK0ZGTEFHUyA9IEBGRkxBR1NACitHQ1JZUFRfQ0lQSEVSUyA9IEBHQ1JZUFRfQ0lQSEVSU0AKK0dDUllQVF9ESUdFU1RTID0gQEdDUllQVF9ESUdFU1RTQAorR0NSWVBUX1BVQktFWV9DSVBIRVJTID0gQEdDUllQVF9QVUJLRVlfQ0lQSEVSU0AKK0dDUllQVF9SQU5ET00gPSBAR0NSWVBUX1JBTkRPTUAKK0dQR19FUlJPUl9DRkxBR1MgPSBAR1BHX0VSUk9SX0NGTEFHU0AKK0dQR19FUlJPUl9DT05GSUcgPSBAR1BHX0VSUk9SX0NPTkZJR0AKK0dQR19FUlJPUl9MSUJTID0gQEdQR19FUlJPUl9MSUJTQAorR1JFUCA9IEBHUkVQQAorSU5TVEFMTCA9IEBJTlNUQUxMQAorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKK0lOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACitJTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKK0lOU1RBTExfU1RSSVBfUFJPR1JBTSA9IEBJTlNUQUxMX1NUUklQX1BST0dSQU1ACitMREZMQUdTID0gQExERkxBR1NACitMSUJHQ1JZUFRfQ0lQSEVSUyA9IEBMSUJHQ1JZUFRfQ0lQSEVSU0AKK0xJQkdDUllQVF9DT05GSUdfQVBJX1ZFUlNJT04gPSBATElCR0NSWVBUX0NPTkZJR19BUElfVkVSU0lPTkAKK0xJQkdDUllQVF9DT05GSUdfQ0ZMQUdTID0gQExJQkdDUllQVF9DT05GSUdfQ0ZMQUdTQAorTElCR0NSWVBUX0NPTkZJR19MSUJTID0gQExJQkdDUllQVF9DT05GSUdfTElCU0AKK0xJQkdDUllQVF9ESUdFU1RTID0gQExJQkdDUllQVF9ESUdFU1RTQAorTElCR0NSWVBUX0xUX0FHRSA9IEBMSUJHQ1JZUFRfTFRfQUdFQAorTElCR0NSWVBUX0xUX0NVUlJFTlQgPSBATElCR0NSWVBUX0xUX0NVUlJFTlRACitMSUJHQ1JZUFRfTFRfUkVWSVNJT04gPSBATElCR0NSWVBUX0xUX1JFVklTSU9OQAorTElCR0NSWVBUX1BVQktFWV9DSVBIRVJTID0gQExJQkdDUllQVF9QVUJLRVlfQ0lQSEVSU0AKK0xJQkdDUllQVF9USFJFQURfTU9EVUxFUyA9IEBMSUJHQ1JZUFRfVEhSRUFEX01PRFVMRVNACitMSUJPQkpTID0gQExJQk9CSlNACitMSUJTID0gQExJQlNACitMSUJUT09MID0gQExJQlRPT0xACitMTl9TID0gQExOX1NACitMVExJQk9CSlMgPSBATFRMSUJPQkpTQAorTUFJTlQgPSBATUFJTlRACitNQUtFSU5GTyA9IEBNQUtFSU5GT0AKK01LRElSX1AgPSBATUtESVJfUEAKK01QSV9TRkxBR1MgPSBATVBJX1NGTEFHU0AKK05PRVhFQ1NUQUNLX0ZMQUdTID0gQE5PRVhFQ1NUQUNLX0ZMQUdTQAorT0JKRFVNUCA9IEBPQkpEVU1QQAorT0JKRVhUID0gQE9CSkVYVEAKK1BBQ0tBR0UgPSBAUEFDS0FHRUAKK1BBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAorUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKK1BBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAorUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKK1BBQ0tBR0VfVVJMID0gQFBBQ0tBR0VfVVJMQAorUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKK1BBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAorUFRIX0NGTEFHUyA9IEBQVEhfQ0ZMQUdTQAorUFRIX0NPTkZJRyA9IEBQVEhfQ09ORklHQAorUFRIX0xJQlMgPSBAUFRIX0xJQlNACitSQU5MSUIgPSBAUkFOTElCQAorUkMgPSBAUkNACitTRVRfTUFLRSA9IEBTRVRfTUFLRUAKK1NIRUxMID0gQFNIRUxMQAorU1RSSVAgPSBAU1RSSVBACitTWVNfU09DS0VUX0ggPSBAU1lTX1NPQ0tFVF9IQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorYWJzX2J1aWxkZGlyID0gQGFic19idWlsZGRpckAKK2Fic19zcmNkaXIgPSBAYWJzX3NyY2RpckAKK2Fic190b3BfYnVpbGRkaXIgPSBAYWJzX3RvcF9idWlsZGRpckAKK2Fic190b3Bfc3JjZGlyID0gQGFic190b3Bfc3JjZGlyQAorYWNfY3RfQ0MgPSBAYWNfY3RfQ0NACithY19jdF9DWFggPSBAYWNfY3RfQ1hYQAorYWNfY3RfRjc3ID0gQGFjX2N0X0Y3N0AKK2FtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAorYW1fX2xlYWRpbmdfZG90ID0gQGFtX19sZWFkaW5nX2RvdEAKK2FtX19xdW90ZSA9IEBhbV9fcXVvdGVACithbV9fdGFyID0gQGFtX190YXJACithbV9fdW50YXIgPSBAYW1fX3VudGFyQAorYmluZGlyID0gQGJpbmRpckAKK2J1aWxkID0gQGJ1aWxkQAorYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACitidWlsZF9jcHUgPSBAYnVpbGRfY3B1QAorYnVpbGRfb3MgPSBAYnVpbGRfb3NACitidWlsZF92ZW5kb3IgPSBAYnVpbGRfdmVuZG9yQAorYnVpbGRkaXIgPSBAYnVpbGRkaXJACitkYXRhZGlyID0gQGRhdGFkaXJACitkYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKK2RvY2RpciA9IEBkb2NkaXJACitkdmlkaXIgPSBAZHZpZGlyQAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACitob3N0ID0gQGhvc3RACitob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACitob3N0X2NwdSA9IEBob3N0X2NwdUAKK2hvc3Rfb3MgPSBAaG9zdF9vc0AKK2hvc3RfdmVuZG9yID0gQGhvc3RfdmVuZG9yQAoraHRtbGRpciA9IEBodG1sZGlyQAoraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAoraW5mb2RpciA9IEBpbmZvZGlyQAoraW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAorbGliZGlyID0gQGxpYmRpckAKK2xpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKK2xvY2FsZWRpciA9IEBsb2NhbGVkaXJACitsb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACittYW5kaXIgPSBAbWFuZGlyQAorbWtkaXJfcCA9IEBta2Rpcl9wQAorb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAorcGRmZGlyID0gQHBkZmRpckAKK3ByZWZpeCA9IEBwcmVmaXhACitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACitwc2RpciA9IEBwc2RpckAKK3NiaW5kaXIgPSBAc2JpbmRpckAKK3NoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAorc3JjZGlyID0gQHNyY2RpckAKK3N5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKK3RhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACit0b3BfYnVpbGRfcHJlZml4ID0gQHRvcF9idWlsZF9wcmVmaXhACit0b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorRVhUUkFfRElTVCA9IFJFQURNRS5hcGljaGFuZ2VzIEhBQ0tJTkcgXAorCSAgICAgbGliZ2NyeXB0LW1vZHVsZXMuZXBzIGZpcHMtZnNtLmVwcyBcCisJICAgICBsaWJnY3J5cHQtbW9kdWxlcy5wbmcgZmlwcy1mc20ucG5nIFwKKyAgICAgICAgICAgICBsaWJnY3J5cHQtbW9kdWxlcy5wZGYgZmlwcy1mc20ucGRmIAorCitESVNUQ0xFQU5GSUxFUyA9IGdjcnlwdC5jcHMKK0JVSUxUX1NPVVJDRVMgPSBsaWJnY3J5cHQtbW9kdWxlcy5lcHMgZmlwcy1mc20uZXBzIFwKKyAgICAgICAgICAgICAgICBsaWJnY3J5cHQtbW9kdWxlcy5wbmcgZmlwcy1mc20ucG5nIFwKKyAgICAgICAgICAgICAgICBsaWJnY3J5cHQtbW9kdWxlcy5wZGYgZmlwcy1mc20ucGRmCisKK2luZm9fVEVYSU5GT1MgPSBnY3J5cHQudGV4aQorZ2NyeXB0X1RFWElORk9TID0gbGdwbC50ZXhpIGdwbC50ZXhpIGxpYmdjcnlwdC1tb2R1bGVzLmZpZyBmaXBzLWZzbS5maWcKK2FsbDogJChCVUlMVF9TT1VSQ0VTKQorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFsbC1hbQorCisuU1VGRklYRVM6CisuU1VGRklYRVM6IC5kdmkgLmVwcyAuZmlnIC5odG1sIC5pbmZvIC5qcGcgLnBkZiAucG5nIC5wcyAudGV4aQorJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJQGZvciBkZXAgaW4gJD87IGRvIFwKKwkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAorCSAgICAqJCRkZXAqKSBcCisJICAgICAgKCBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2ggKSBcCisJICAgICAgICAmJiB7IGlmIHRlc3QgLWYgJEA7IHRoZW4gZXhpdCAwOyBlbHNlIGJyZWFrOyBmaTsgfTsgXAorCSAgICAgIGV4aXQgMTs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUgIGRvYy9NYWtlZmlsZSc7IFwKKwljZCAkKHRvcF9zcmNkaXIpICYmIFwKKwkgICQoQVVUT01BS0UpIC0tZ251ICBkb2MvTWFrZWZpbGUKKy5QUkVDSU9VUzogTWFrZWZpbGUKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwlAY2FzZSAnJD8nIGluIFwKKwkgICpjb25maWcuc3RhdHVzKikgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2g7OyBcCisJICAqKSBcCisJICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSknOyBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKKwllc2FjOworCiskKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKworJCh0b3Bfc3JjZGlyKS9jb25maWd1cmU6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCiskKEFDTE9DQUxfTTQpOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKworbW9zdGx5Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgKi5sbworCitjbGVhbi1saWJ0b29sOgorCS1ybSAtcmYgLmxpYnMgX2xpYnMKKworLnRleGkuaW5mbzoKKwlyZXN0b3JlPTogJiYgYmFja3VwZGlyPSIkKGFtX19sZWFkaW5nX2RvdClhbSQkJCQiICYmIFwKKwlhbV9fY3dkPWBwd2RgICYmIGNkICQoc3JjZGlyKSAmJiBcCisJcm0gLXJmICQkYmFja3VwZGlyICYmIG1rZGlyICQkYmFja3VwZGlyICYmIFwKKwlpZiAoJChNQUtFSU5GTykgLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAorCSAgZm9yIGYgaW4gJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XSAkKEA6LmluZm89KS5pWzAtOV0gJChAOi5pbmZvPSkuaVswLTldWzAtOV07IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAkJGY7IHRoZW4gbXYgJCRmICQkYmFja3VwZGlyOyByZXN0b3JlPW12OyBlbHNlIDo7IGZpOyBcCisJICBkb25lOyBcCisJZWxzZSA6OyBmaSAmJiBcCisJY2QgIiQkYW1fX2N3ZCI7IFwKKwlpZiAkKE1BS0VJTkZPKSAkKEFNX01BS0VJTkZPRkxBR1MpICQoTUFLRUlORk9GTEFHUykgLUkgJChzcmNkaXIpIFwKKwkgLW8gJEAgJDw7IFwKKwl0aGVuIFwKKwkgIHJjPTA7IFwKKwkgIGNkICQoc3JjZGlyKTsgXAorCWVsc2UgXAorCSAgcmM9JCQ/OyBcCisJICBjZCAkKHNyY2RpcikgJiYgXAorCSAgJCRyZXN0b3JlICQkYmFja3VwZGlyLyogYGVjaG8gIi4vJEAiIHwgc2VkICdzfFteL10qJCR8fCdgOyBcCisJZmk7IFwKKwlybSAtcmYgJCRiYWNrdXBkaXI7IGV4aXQgJCRyYworCisudGV4aS5kdmk6CisJVEVYSU5QVVRTPSIkKGFtX19URVhJTkZPX1RFWF9ESVIpJChQQVRIX1NFUEFSQVRPUikkJFRFWElOUFVUUyIgXAorCU1BS0VJTkZPPSckKE1BS0VJTkZPKSAkKEFNX01BS0VJTkZPRkxBR1MpICQoTUFLRUlORk9GTEFHUykgLUkgJChzcmNkaXIpJyBcCisJJChURVhJMkRWSSkgJDwKKworLnRleGkucGRmOgorCVRFWElOUFVUUz0iJChhbV9fVEVYSU5GT19URVhfRElSKSQoUEFUSF9TRVBBUkFUT1IpJCRURVhJTlBVVFMiIFwKKwlNQUtFSU5GTz0nJChNQUtFSU5GTykgJChBTV9NQUtFSU5GT0ZMQUdTKSAkKE1BS0VJTkZPRkxBR1MpIC1JICQoc3JjZGlyKScgXAorCSQoVEVYSTJQREYpICQ8CisKKy50ZXhpLmh0bWw6CisJcm0gLXJmICQoQDouaHRtbD0uaHRwKQorCWlmICQoTUFLRUlORk9IVE1MKSAkKEFNX01BS0VJTkZPSFRNTEZMQUdTKSAkKE1BS0VJTkZPRkxBR1MpIC1JICQoc3JjZGlyKSBcCisJIC1vICQoQDouaHRtbD0uaHRwKSAkPDsgXAorCXRoZW4gXAorCSAgcm0gLXJmICRAOyBcCisJICBpZiB0ZXN0ICEgLWQgJChAOi5odG1sPS5odHApICYmIHRlc3QgLWQgJChAOi5odG1sPSk7IHRoZW4gXAorCSAgICBtdiAkKEA6Lmh0bWw9KSAkQDsgZWxzZSBtdiAkKEA6Lmh0bWw9Lmh0cCkgJEA7IGZpOyBcCisJZWxzZSBcCisJICBpZiB0ZXN0ICEgLWQgJChAOi5odG1sPS5odHApICYmIHRlc3QgLWQgJChAOi5odG1sPSk7IHRoZW4gXAorCSAgICBybSAtcmYgJChAOi5odG1sPSk7IGVsc2Ugcm0gLVJmICQoQDouaHRtbD0uaHRwKSAkQDsgZmk7IFwKKwkgIGV4aXQgMTsgXAorCWZpCiskKHNyY2RpcikvZ2NyeXB0LmluZm86IGdjcnlwdC50ZXhpICQoc3JjZGlyKS92ZXJzaW9uLnRleGkgJChnY3J5cHRfVEVYSU5GT1MpCitnY3J5cHQuZHZpOiBnY3J5cHQudGV4aSAkKHNyY2RpcikvdmVyc2lvbi50ZXhpICQoZ2NyeXB0X1RFWElORk9TKQorZ2NyeXB0LnBkZjogZ2NyeXB0LnRleGkgJChzcmNkaXIpL3ZlcnNpb24udGV4aSAkKGdjcnlwdF9URVhJTkZPUykKK2djcnlwdC5odG1sOiBnY3J5cHQudGV4aSAkKHNyY2RpcikvdmVyc2lvbi50ZXhpICQoZ2NyeXB0X1RFWElORk9TKQorJChzcmNkaXIpL3ZlcnNpb24udGV4aTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKHNyY2Rpcikvc3RhbXAtdnRpCiskKHNyY2Rpcikvc3RhbXAtdnRpOiBnY3J5cHQudGV4aSAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZQorCUAoZGlyPS47IHRlc3QgLWYgLi9nY3J5cHQudGV4aSB8fCBkaXI9JChzcmNkaXIpOyBcCisJc2V0IGAkKFNIRUxMKSAkKHNyY2RpcikvbWRhdGUtc2ggJCRkaXIvZ2NyeXB0LnRleGlgOyBcCisJZWNobyAiQHNldCBVUERBVEVEICQkMSAkJDIgJCQzIjsgXAorCWVjaG8gIkBzZXQgVVBEQVRFRC1NT05USCAkJDIgJCQzIjsgXAorCWVjaG8gIkBzZXQgRURJVElPTiAkKFZFUlNJT04pIjsgXAorCWVjaG8gIkBzZXQgVkVSU0lPTiAkKFZFUlNJT04pIikgPiB2dGkudG1wCisJQGNtcCAtcyB2dGkudG1wICQoc3JjZGlyKS92ZXJzaW9uLnRleGkgXAorCSAgfHwgKGVjaG8gIlVwZGF0aW5nICQoc3JjZGlyKS92ZXJzaW9uLnRleGkiOyBcCisJICAgICAgY3AgdnRpLnRtcCAkKHNyY2RpcikvdmVyc2lvbi50ZXhpKQorCS1Acm0gLWYgdnRpLnRtcAorCUBjcCAkKHNyY2RpcikvdmVyc2lvbi50ZXhpICRACisKK21vc3RseWNsZWFuLXZ0aToKKwktcm0gLWYgdnRpLnRtcAorCittYWludGFpbmVyLWNsZWFuLXZ0aToKK0BNQUlOVEFJTkVSX01PREVfVFJVRUAJLXJtIC1mICQoc3JjZGlyKS9zdGFtcC12dGkgJChzcmNkaXIpL3ZlcnNpb24udGV4aQorLmR2aS5wczoKKwlURVhJTlBVVFM9IiQoYW1fX1RFWElORk9fVEVYX0RJUikkKFBBVEhfU0VQQVJBVE9SKSQkVEVYSU5QVVRTIiBcCisJJChEVklQUykgLW8gJEAgJDwKKwordW5pbnN0YWxsLWR2aS1hbToKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCUBsaXN0PSckKERWSVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICBmPSQoYW1fX3N0cmlwX2RpcikgXAorCSAgZWNobyAiIHJtIC1mICckKERFU1RESVIpJChkdmlkaXIpLyQkZiciOyBcCisJICBybSAtZiAiJChERVNURElSKSQoZHZpZGlyKS8kJGYiOyBcCisJZG9uZQorCit1bmluc3RhbGwtaHRtbC1hbToKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCUBsaXN0PSckKEhUTUxTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgZj0kKGFtX19zdHJpcF9kaXIpIFwKKwkgIGVjaG8gIiBybSAtcmYgJyQoREVTVERJUikkKGh0bWxkaXIpLyQkZiciOyBcCisJICBybSAtcmYgIiQoREVTVERJUikkKGh0bWxkaXIpLyQkZiI7IFwKKwlkb25lCisKK3VuaW5zdGFsbC1pbmZvLWFtOgorCUAkKFBSRV9VTklOU1RBTEwpCisJQGlmIHRlc3QgLWQgJyQoREVTVERJUikkKGluZm9kaXIpJyAmJiBcCisJICAgIChpbnN0YWxsLWluZm8gLS12ZXJzaW9uICYmIFwKKwkgICAgIGluc3RhbGwtaW5mbyAtLXZlcnNpb24gMj4mMSB8IHNlZCAxcSB8IGdyZXAgLWkgLXYgZGViaWFuKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAorCSAgbGlzdD0nJChJTkZPX0RFUFMpJzsgXAorCSAgZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCisJICAgIHJlbGZpbGU9YGVjaG8gIiQkZmlsZSIgfCBzZWQgJ3N8Xi4qL3x8J2A7IFwKKwkgICAgZWNobyAiIGluc3RhbGwtaW5mbyAtLWluZm8tZGlyPSckKERFU1RESVIpJChpbmZvZGlyKScgLS1yZW1vdmUgJyQoREVTVERJUikkKGluZm9kaXIpLyQkcmVsZmlsZSciOyBcCisJICAgIGluc3RhbGwtaW5mbyAtLWluZm8tZGlyPSIkKERFU1RESVIpJChpbmZvZGlyKSIgLS1yZW1vdmUgIiQoREVTVERJUikkKGluZm9kaXIpLyQkcmVsZmlsZSI7IFwKKwkgIGRvbmU7IFwKKwllbHNlIDo7IGZpCisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlAbGlzdD0nJChJTkZPX0RFUFMpJzsgXAorCWZvciBmaWxlIGluICQkbGlzdDsgZG8gXAorCSAgcmVsZmlsZT1gZWNobyAiJCRmaWxlIiB8IHNlZCAnc3xeLiovfHwnYDsgXAorCSAgcmVsZmlsZV9pPWBlY2hvICIkJHJlbGZpbGUiIHwgc2VkICdzfFwuaW5mbyQkfHw7c3wkJHwuaXwnYDsgXAorCSAgKGlmIHRlc3QgLWQgIiQoREVTVERJUikkKGluZm9kaXIpIiAmJiBjZCAiJChERVNURElSKSQoaW5mb2RpcikiOyB0aGVuIFwKKwkgICAgIGVjaG8gIiBjZCAnJChERVNURElSKSQoaW5mb2RpciknICYmIHJtIC1mICQkcmVsZmlsZSAkJHJlbGZpbGUtWzAtOV0gJCRyZWxmaWxlLVswLTldWzAtOV0gJCRyZWxmaWxlX2lbMC05XSAkJHJlbGZpbGVfaVswLTldWzAtOV0iOyBcCisJICAgICBybSAtZiAkJHJlbGZpbGUgJCRyZWxmaWxlLVswLTldICQkcmVsZmlsZS1bMC05XVswLTldICQkcmVsZmlsZV9pWzAtOV0gJCRyZWxmaWxlX2lbMC05XVswLTldOyBcCisJICAgZWxzZSA6OyBmaSk7IFwKKwlkb25lCisKK3VuaW5zdGFsbC1wZGYtYW06CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlAbGlzdD0nJChQREZTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgZj0kKGFtX19zdHJpcF9kaXIpIFwKKwkgIGVjaG8gIiBybSAtZiAnJChERVNURElSKSQocGRmZGlyKS8kJGYnIjsgXAorCSAgcm0gLWYgIiQoREVTVERJUikkKHBkZmRpcikvJCRmIjsgXAorCWRvbmUKKwordW5pbnN0YWxsLXBzLWFtOgorCUAkKE5PUk1BTF9VTklOU1RBTEwpCisJQGxpc3Q9JyQoUFNTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgZj0kKGFtX19zdHJpcF9kaXIpIFwKKwkgIGVjaG8gIiBybSAtZiAnJChERVNURElSKSQocHNkaXIpLyQkZiciOyBcCisJICBybSAtZiAiJChERVNURElSKSQocHNkaXIpLyQkZiI7IFwKKwlkb25lCisKK2Rpc3QtaW5mbzogJChJTkZPX0RFUFMpCisJQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzfC58LnxnJ2A7IFwKKwlsaXN0PSckKElORk9fREVQUyknOyBcCisJZm9yIGJhc2UgaW4gJCRsaXN0OyBkbyBcCisJICBjYXNlICQkYmFzZSBpbiBcCisJICAgICQoc3JjZGlyKS8qKSBiYXNlPWBlY2hvICIkJGJhc2UiIHwgc2VkICJzfF4kJHNyY2RpcnN0cmlwL3x8ImA7OyBcCisJICBlc2FjOyBcCisJICBpZiB0ZXN0IC1mICQkYmFzZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCisJICBiYXNlX2k9YGVjaG8gIiQkYmFzZSIgfCBzZWQgJ3N8XC5pbmZvJCR8fDtzfCQkfC5pfCdgOyBcCisJICBmb3IgZmlsZSBpbiAkJGQvJCRiYXNlICQkZC8kJGJhc2UtWzAtOV0gJCRkLyQkYmFzZS1bMC05XVswLTldICQkZC8kJGJhc2VfaVswLTldICQkZC8kJGJhc2VfaVswLTldWzAtOV07IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAkJGZpbGU7IHRoZW4gXAorCSAgICAgIHJlbGZpbGU9YGV4cHIgIiQkZmlsZSIgOiAiJCRkL1woLipcKSJgOyBcCisJICAgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkcmVsZmlsZSB8fCBcCisJCWNwIC1wICQkZmlsZSAkKGRpc3RkaXIpLyQkcmVsZmlsZTsgXAorCSAgICBlbHNlIDo7IGZpOyBcCisJICBkb25lOyBcCisJZG9uZQorCittb3N0bHljbGVhbi1hbWluZm86CisJLXJtIC1yZiBnY3J5cHQuYXV4IGdjcnlwdC5jcCBnY3J5cHQuY3BzIGdjcnlwdC5mbiBnY3J5cHQuZm5zIGdjcnlwdC5reSBcCisJICBnY3J5cHQua3lzIGdjcnlwdC5sb2cgZ2NyeXB0LnBnIGdjcnlwdC50bXAgZ2NyeXB0LnRvYyBcCisJICBnY3J5cHQudHAgZ2NyeXB0LnZyIGdjcnlwdC52cnMgZ2NyeXB0LmR2aSBnY3J5cHQucGRmIFwKKwkgIGdjcnlwdC5wcyBnY3J5cHQuaHRtbAorCittYWludGFpbmVyLWNsZWFuLWFtaW5mbzoKKwlAbGlzdD0nJChJTkZPX0RFUFMpJzsgZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICBpX2k9YGVjaG8gIiQkaSIgfCBzZWQgJ3N8XC5pbmZvJCR8fDtzfCQkfC5pfCdgOyBcCisJICBlY2hvICIgcm0gLWYgJCRpICQkaS1bMC05XSAkJGktWzAtOV1bMC05XSAkJGlfaVswLTldICQkaV9pWzAtOV1bMC05XSI7IFwKKwkgIHJtIC1mICQkaSAkJGktWzAtOV0gJCRpLVswLTldWzAtOV0gJCRpX2lbMC05XSAkJGlfaVswLTldWzAtOV07IFwKKwlkb25lCit0YWdzOiBUQUdTCitUQUdTOgorCitjdGFnczogQ1RBR1MKK0NUQUdTOgorCisKK2Rpc3RkaXI6ICQoRElTVEZJTEVTKQorCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJbGlzdD0nJChESVNURklMRVMpJzsgXAorCSAgZGlzdF9maWxlcz1gZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IFwKKwkgIHNlZCAtZSAic3xeJCRzcmNkaXJzdHJpcC98fDt0IiBcCisJICAgICAgLWUgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98O3QiYDsgXAorCWNhc2UgJCRkaXN0X2ZpbGVzIGluIFwKKwkgICovKikgJChNS0RJUl9QKSBgZWNobyAiJCRkaXN0X2ZpbGVzIiB8IFwKKwkJCSAgIHNlZCAnL1wvLyFkO3N8XnwkKGRpc3RkaXIpL3w7cywvW14vXSokJCwsJyB8IFwKKwkJCSAgIHNvcnQgLXVgIDs7IFwKKwllc2FjOyBcCisJZm9yIGZpbGUgaW4gJCRkaXN0X2ZpbGVzOyBkbyBcCisJICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCisJICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAorCSAgICBkaXI9YGVjaG8gIi8kJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAorCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKKwkgICAgICBjcCAtcFIgJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpJCRkaXIgfHwgZXhpdCAxOyBcCisJICAgIGZpOyBcCisJICAgIGNwIC1wUiAkJGQvJCRmaWxlICQoZGlzdGRpcikkJGRpciB8fCBleGl0IDE7IFwKKwkgIGVsc2UgXAorCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKKwkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgXAorCSAgdG9wX2Rpc3RkaXI9IiQodG9wX2Rpc3RkaXIpIiBkaXN0ZGlyPSIkKGRpc3RkaXIpIiBcCisJICBkaXN0LWluZm8KK2NoZWNrLWFtOiBhbGwtYW0KK2NoZWNrOiAkKEJVSUxUX1NPVVJDRVMpCisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY2hlY2stYW0KK2FsbC1hbTogTWFrZWZpbGUgJChJTkZPX0RFUFMpCitpbnN0YWxsZGlyczoKKwlmb3IgZGlyIGluICIkKERFU1RESVIpJChpbmZvZGlyKSI7IGRvIFwKKwkgIHRlc3QgLXogIiQkZGlyIiB8fCAkKE1LRElSX1ApICIkJGRpciI7IFwKKwlkb25lCitpbnN0YWxsOiAkKEJVSUxUX1NPVVJDRVMpCisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1hbQoraW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtYW0KK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLWFtCit1bmluc3RhbGw6IHVuaW5zdGFsbC1hbQorCitpbnN0YWxsLWFtOiBhbGwtYW0KKwlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQorCitpbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1hbQoraW5zdGFsbC1zdHJpcDoKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCisJICBgdGVzdCAteiAnJChTVFJJUCknIHx8IFwKKwkgICAgZWNobyAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyJgIGluc3RhbGwKK21vc3RseWNsZWFuLWdlbmVyaWM6CisKK2NsZWFuLWdlbmVyaWM6CisKK2Rpc3RjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQorCS10ZXN0IC16ICIkKERJU1RDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChESVNUQ0xFQU5GSUxFUykKKworbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgorCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKKwlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCisJLXRlc3QgLXogIiQoQlVJTFRfU09VUkNFUykiIHx8IHJtIC1mICQoQlVJTFRfU09VUkNFUykKK2NsZWFuOiBjbGVhbi1hbQorCitjbGVhbi1hbTogY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIG1vc3RseWNsZWFuLWFtCisKK2Rpc3RjbGVhbjogZGlzdGNsZWFuLWFtCisJLXJtIC1mIE1ha2VmaWxlCitkaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1nZW5lcmljCisKK2R2aTogZHZpLWFtCisKK2R2aS1hbTogJChEVklTKQorCitodG1sOiBodG1sLWFtCisKK2h0bWwtYW06ICQoSFRNTFMpCisKK2luZm86IGluZm8tYW0KKworaW5mby1hbTogJChJTkZPX0RFUFMpCisKK2luc3RhbGwtZGF0YS1hbTogaW5zdGFsbC1pbmZvLWFtCisKK2luc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1hbQorCitpbnN0YWxsLWR2aS1hbTogJChEVklTKQorCUAkKE5PUk1BTF9JTlNUQUxMKQorCXRlc3QgLXogIiQoZHZpZGlyKSIgfHwgJChNS0RJUl9QKSAiJChERVNURElSKSQoZHZpZGlyKSIKKwlAbGlzdD0nJChEVklTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAtZiAiJCRwIjsgdGhlbiBkPTsgZWxzZSBkPSIkKHNyY2RpcikvIjsgZmk7IFwKKwkgIGY9JChhbV9fc3RyaXBfZGlyKSBcCisJICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICckJGQkJHAnICckKERFU1RESVIpJChkdmlkaXIpLyQkZiciOyBcCisJICAkKElOU1RBTExfREFUQSkgIiQkZCQkcCIgIiQoREVTVERJUikkKGR2aWRpcikvJCRmIjsgXAorCWRvbmUKK2luc3RhbGwtZXhlYy1hbToKKworaW5zdGFsbC1odG1sOiBpbnN0YWxsLWh0bWwtYW0KKworaW5zdGFsbC1odG1sLWFtOiAkKEhUTUxTKQorCUAkKE5PUk1BTF9JTlNUQUxMKQorCXRlc3QgLXogIiQoaHRtbGRpcikiIHx8ICQoTUtESVJfUCkgIiQoREVTVERJUikkKGh0bWxkaXIpIgorCUBsaXN0PSckKEhUTUxTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAtZiAiJCRwIiB8fCB0ZXN0IC1kICIkJHAiOyB0aGVuIGQ9OyBlbHNlIGQ9IiQoc3JjZGlyKS8iOyBmaTsgXAorCSAgZj0kKGFtX19zdHJpcF9kaXIpIFwKKwkgIGlmIHRlc3QgLWQgIiQkZCQkcCI7IHRoZW4gXAorCSAgICBlY2hvICIgJChNS0RJUl9QKSAnJChERVNURElSKSQoaHRtbGRpcikvJCRmJyI7IFwKKwkgICAgJChNS0RJUl9QKSAiJChERVNURElSKSQoaHRtbGRpcikvJCRmIiB8fCBleGl0IDE7IFwKKwkgICAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAnJCRkJCRwJy8qICckKERFU1RESVIpJChodG1sZGlyKS8kJGYnIjsgXAorCSAgICAkKElOU1RBTExfREFUQSkgIiQkZCQkcCIvKiAiJChERVNURElSKSQoaHRtbGRpcikvJCRmIjsgXAorCSAgZWxzZSBcCisJICAgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJyQkZCQkcCcgJyQoREVTVERJUikkKGh0bWxkaXIpLyQkZiciOyBcCisJICAgICQoSU5TVEFMTF9EQVRBKSAiJCRkJCRwIiAiJChERVNURElSKSQoaHRtbGRpcikvJCRmIjsgXAorCSAgZmk7IFwKKwlkb25lCitpbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1hbQorCitpbnN0YWxsLWluZm8tYW06ICQoSU5GT19ERVBTKQorCUAkKE5PUk1BTF9JTlNUQUxMKQorCXRlc3QgLXogIiQoaW5mb2RpcikiIHx8ICQoTUtESVJfUCkgIiQoREVTVERJUikkKGluZm9kaXIpIgorCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAnc3wufC58ZydgOyBcCisJbGlzdD0nJChJTkZPX0RFUFMpJzsgXAorCWZvciBmaWxlIGluICQkbGlzdDsgZG8gXAorCSAgY2FzZSAkJGZpbGUgaW4gXAorCSAgICAkKHNyY2RpcikvKikgZmlsZT1gZWNobyAiJCRmaWxlIiB8IHNlZCAic3xeJCRzcmNkaXJzdHJpcC98fCJgOzsgXAorCSAgZXNhYzsgXAorCSAgaWYgdGVzdCAtZiAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAorCSAgZmlsZV9pPWBlY2hvICIkJGZpbGUiIHwgc2VkICdzfFwuaW5mbyQkfHw7c3wkJHwuaXwnYDsgXAorCSAgZm9yIGlmaWxlIGluICQkZC8kJGZpbGUgJCRkLyQkZmlsZS1bMC05XSAkJGQvJCRmaWxlLVswLTldWzAtOV0gXAorICAgICAgICAgICAgICAgICAgICAgICAkJGQvJCRmaWxlX2lbMC05XSAkJGQvJCRmaWxlX2lbMC05XVswLTldIDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICQkaWZpbGU7IHRoZW4gXAorCSAgICAgIHJlbGZpbGU9YGVjaG8gIiQkaWZpbGUiIHwgc2VkICdzfF4uKi98fCdgOyBcCisJICAgICAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAnJCRpZmlsZScgJyQoREVTVERJUikkKGluZm9kaXIpLyQkcmVsZmlsZSciOyBcCisJICAgICAgJChJTlNUQUxMX0RBVEEpICIkJGlmaWxlIiAiJChERVNURElSKSQoaW5mb2RpcikvJCRyZWxmaWxlIjsgXAorCSAgICBlbHNlIDogOyBmaTsgXAorCSAgZG9uZTsgXAorCWRvbmUKKwlAJChQT1NUX0lOU1RBTEwpCisJQGlmIChpbnN0YWxsLWluZm8gLS12ZXJzaW9uICYmIFwKKwkgICAgIGluc3RhbGwtaW5mbyAtLXZlcnNpb24gMj4mMSB8IHNlZCAxcSB8IGdyZXAgLWkgLXYgZGViaWFuKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAorCSAgbGlzdD0nJChJTkZPX0RFUFMpJzsgXAorCSAgZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCisJICAgIHJlbGZpbGU9YGVjaG8gIiQkZmlsZSIgfCBzZWQgJ3N8Xi4qL3x8J2A7IFwKKwkgICAgZWNobyAiIGluc3RhbGwtaW5mbyAtLWluZm8tZGlyPSckKERFU1RESVIpJChpbmZvZGlyKScgJyQoREVTVERJUikkKGluZm9kaXIpLyQkcmVsZmlsZSciO1wKKwkgICAgaW5zdGFsbC1pbmZvIC0taW5mby1kaXI9IiQoREVTVERJUikkKGluZm9kaXIpIiAiJChERVNURElSKSQoaW5mb2RpcikvJCRyZWxmaWxlIiB8fCA6O1wKKwkgIGRvbmU7IFwKKwllbHNlIDogOyBmaQoraW5zdGFsbC1tYW46CisKK2luc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1hbQorCitpbnN0YWxsLXBkZi1hbTogJChQREZTKQorCUAkKE5PUk1BTF9JTlNUQUxMKQorCXRlc3QgLXogIiQocGRmZGlyKSIgfHwgJChNS0RJUl9QKSAiJChERVNURElSKSQocGRmZGlyKSIKKwlAbGlzdD0nJChQREZTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAtZiAiJCRwIjsgdGhlbiBkPTsgZWxzZSBkPSIkKHNyY2RpcikvIjsgZmk7IFwKKwkgIGY9JChhbV9fc3RyaXBfZGlyKSBcCisJICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICckJGQkJHAnICckKERFU1RESVIpJChwZGZkaXIpLyQkZiciOyBcCisJICAkKElOU1RBTExfREFUQSkgIiQkZCQkcCIgIiQoREVTVERJUikkKHBkZmRpcikvJCRmIjsgXAorCWRvbmUKK2luc3RhbGwtcHM6IGluc3RhbGwtcHMtYW0KKworaW5zdGFsbC1wcy1hbTogJChQU1MpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJdGVzdCAteiAiJChwc2RpcikiIHx8ICQoTUtESVJfUCkgIiQoREVTVERJUikkKHBzZGlyKSIKKwlAbGlzdD0nJChQU1MpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0IC1mICIkJHAiOyB0aGVuIGQ9OyBlbHNlIGQ9IiQoc3JjZGlyKS8iOyBmaTsgXAorCSAgZj0kKGFtX19zdHJpcF9kaXIpIFwKKwkgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJyQkZCQkcCcgJyQoREVTVERJUikkKHBzZGlyKS8kJGYnIjsgXAorCSAgJChJTlNUQUxMX0RBVEEpICIkJGQkJHAiICIkKERFU1RESVIpJChwc2RpcikvJCRmIjsgXAorCWRvbmUKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQorCS1ybSAtZiBNYWtlZmlsZQorbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tYW1pbmZvIFwKKwltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgbWFpbnRhaW5lci1jbGVhbi12dGkKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCisKK21vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1hbWluZm8gbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCisJbW9zdGx5Y2xlYW4tbGlidG9vbCBtb3N0bHljbGVhbi12dGkKKworcGRmOiBwZGYtYW0KKworcGRmLWFtOiAkKFBERlMpCisKK3BzOiBwcy1hbQorCitwcy1hbTogJChQU1MpCisKK3VuaW5zdGFsbC1hbTogdW5pbnN0YWxsLWR2aS1hbSB1bmluc3RhbGwtaHRtbC1hbSB1bmluc3RhbGwtaW5mby1hbSBcCisJdW5pbnN0YWxsLXBkZi1hbSB1bmluc3RhbGwtcHMtYW0KKworLk1BS0U6IGluc3RhbGwtYW0gaW5zdGFsbC1zdHJpcAorCisuUEhPTlk6IGFsbCBhbGwtYW0gY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIFwKKwlkaXN0LWluZm8gZGlzdGNsZWFuIGRpc3RjbGVhbi1nZW5lcmljIGRpc3RjbGVhbi1saWJ0b29sIFwKKwlkaXN0ZGlyIGR2aSBkdmktYW0gaHRtbCBodG1sLWFtIGluZm8gaW5mby1hbSBpbnN0YWxsIFwKKwlpbnN0YWxsLWFtIGluc3RhbGwtZGF0YSBpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kdmkgXAorCWluc3RhbGwtZHZpLWFtIGluc3RhbGwtZXhlYyBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1odG1sIFwKKwlpbnN0YWxsLWh0bWwtYW0gaW5zdGFsbC1pbmZvIGluc3RhbGwtaW5mby1hbSBpbnN0YWxsLW1hbiBcCisJaW5zdGFsbC1wZGYgaW5zdGFsbC1wZGYtYW0gaW5zdGFsbC1wcyBpbnN0YWxsLXBzLWFtIFwKKwlpbnN0YWxsLXN0cmlwIGluc3RhbGxjaGVjayBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgXAorCW1haW50YWluZXItY2xlYW4gbWFpbnRhaW5lci1jbGVhbi1hbWluZm8gXAorCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtYWludGFpbmVyLWNsZWFuLXZ0aSBtb3N0bHljbGVhbiBcCisJbW9zdGx5Y2xlYW4tYW1pbmZvIG1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbCBcCisJbW9zdGx5Y2xlYW4tdnRpIHBkZiBwZGYtYW0gcHMgcHMtYW0gdW5pbnN0YWxsIHVuaW5zdGFsbC1hbSBcCisJdW5pbnN0YWxsLWR2aS1hbSB1bmluc3RhbGwtaHRtbC1hbSB1bmluc3RhbGwtaW5mby1hbSBcCisJdW5pbnN0YWxsLXBkZi1hbSB1bmluc3RhbGwtcHMtYW0KKworCisuZmlnLnBuZzoKKwlmaWcyZGV2IC1MIHBuZyBgdGVzdCAtZiAnJDwnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYCQ8ICRACisKKy5maWcuanBnOgorCWZpZzJkZXYgLUwganBnIGB0ZXN0IC1mICckPCcgfHwgZWNobyAnJChzcmNkaXIpLydgJDwgJEAKKworLmZpZy5lcHM6CisJZmlnMmRldiAtTCBlcHMgYHRlc3QgLWYgJyQ8JyB8fCBlY2hvICckKHNyY2RpcikvJ2AkPCAkQAorCisuZmlnLnBkZjoKKwlmaWcyZGV2IC1MIHBkZiBgdGVzdCAtZiAnJDwnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYCQ8ICRACisKKyMgTWFrZSBzdXJlIHRoYXQgZ2NyeXB0LnRleGkgaXMgdG91Y2hlZCBpZiBhbnkgb3RoZXIgc291cmNlIGZpbGUgaGFzCisjIGJlZW4gbW9kaWZpZWQuICBUaGlzIGlzIHJlcXVpcmVkIHNvIHRoYXQgdGhlIHZlcnNpb24udGV4aSBtYWdpYworIyB1cGRhdGVzIHRoZSByZWxlYXNlIGRhdGUuCitnbnVwZy50ZXhpIDogJChnY3J5cHRfVEVYSU5GT1MpCisJdG91Y2ggJChzcmNkaXIpL2djcnlwdC50ZXhpCisKK29ubGluZTogZ2NyeXB0Lmh0bWwgZ2NyeXB0LnBkZiBnY3J5cHQuaW5mbworCXNldCAtZTsgXAorCWVjaG8gIlVwbG9hZGluZyBjdXJyZW50IG1hbnVhbHMgdG8gd3d3LmdudXBnLm9yZyAuLi4iOyBcCisJY3AgbGliZ2NyeXB0LW1vZHVsZXMucG5nIGdjcnlwdC5odG1sLzsgXAorCWNwIGZpcHMtZnNtLnBuZyBnY3J5cHQuaHRtbC87IFwKKyAgICAgICAgdXNlcj13ZXJuZXIgOyBkYXNoZGV2ZWw9IiIgOyBcCisgICAgICAgIGlmIGVjaG8gIkBQQUNLQUdFX1ZFUlNJT05AIiB8IGdyZXAgLS0gIi1zdm4iID4vZGV2L251bGw7IHRoZW4gXAorCSAgZGFzaGRldmVsPSItZGV2ZWwiIDsgXAorCSAgY3AgZ2NyeXB0LnBkZiBnY3J5cHQuaHRtbC87IFwKKwkgIGNwIGdjcnlwdC5pbmZvIGdjcnlwdC5odG1sLzsgXAorCWVsc2UgXAorICAgICAgICAgIHJzeW5jIC12IGdjcnlwdC5wZGYgZ2NyeXB0LmluZm8gXAorICAgICAgICAgICAgICAgJCR7dXNlcn1AdHJpdGhlbWl1cy5nbnVwZy5vcmc6d2Vic3BhY2UvbWFudWFscy8gOyBcCisgICAgICAgIGZpIDsgXAorCWNkIGdjcnlwdC5odG1sIDsgXAorICAgICAgICByc3luYyAtdnIgLS1leGNsdWRlPScuc3ZuJyAuICBcCisJICAkJHt1c2VyfUB0cml0aGVtaXVzLmdudXBnLm9yZzp3ZWJzcGFjZS9tYW51YWxzL2djcnlwdCQke2Rhc2hkZXZlbH0vIAorIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KKyMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgorLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L2RvYy9SRUFETUUuYXBpY2hhbmdlcyBiL2xpYmdjcnlwdC0xLjQuNi9kb2MvUkVBRE1FLmFwaWNoYW5nZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNiNjRkYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9kb2MvUkVBRE1FLmFwaWNoYW5nZXMKQEAgLTAsMCArMSwxMTUgQEAKK1JFQURNRS5hcGljaGFuZ2VzIDIwMDMtMDctMjgKKworICBOT1RFOiBUSEVTRSBBUkUgQVBJIENIQU5HRVMgRE9ORSBCRUZPUkUgVEhFIEZJUlNUIFNUQUJMRSBSRUxFQVNFIFNPCisgIFRIRVkgQVJFIE5PVCBSRUxFVkFOVCBBTllNT1JFIFtzdGFibGUgaXMgMS4yLjQgcmlnaHQgbm93XQorCitXZSBkZWNpZGVkIHRvIGNoYW5nZSBhIGNvdXBsZSBvZiBhbm5veWluZyB0aGluZ3MgaW4gTGliZ2NyeXB0IGFuZCB0bworY2xlYW51cCB0aGUgQVBJLiAgVGhlIG5ldyBBUEkgYmV0dGVyIGZpdHMgaW50byBhIG11bHRpLXRocmVhZGVkCitlbnZpcm9ubWVudCBhbmQgaXMgbW9yZSBjb25zaXN0ZW50LiAgT25lIGltcG9ydCBjaGFuZ2UgaXMgdGhhdCBhbGwKK2Z1bmN0aW9ucyByZXR1cm4gZXJyb3IgY29kZXMgZnJvbSBhIHNldCBvZiBlcnJvciBjb2RlcyBzaGFyZWQgYmV0d2VlbgorR251UEcsIEdQR01FIGFuZCBMaWJnY3J5cHQuCisKK1RoaXMgZmlsZSBjb250YWlucyBzb21lIGhpbnRzIG9uIGhvdyB0byBwb3J0IHlvdXIgYXBwbGljYXRpb24gZnJvbQorbGliZ2NyeXB0IDw9IDEuMS4xMiB0byB0aGUgY3VycmVudCBBUEkgYXMgb2YgMS4xLjQyLiAgV2UgaG9wZSB0aGF0Cit0aGVyZSB3b24ndCBiZSBhbm90aGVyIG5lZWQgZm9yIHN1Y2ggYSBtYWpvciBjaGFuZ2UuCisKKworKiBUeXBlcworCisgIEFsbCB0eXBlcyBkZWZpbml0aW9ucyBjaGFuZ2VkIHRvIGEgZm9vX3Qgc2NoZW1lOyBmb3Igc29tZSB0aW1lIHdlCisgIHdpbGwgc3VwcG9ydCB0aGUgb2xkIG5hbWVzIGJ1dCB5b3UgYmV0dGVyIHN0YXJ0IHRvIHJlbmFtZSB0aGVtOgorCisgIHMvR0NSWV9NUEkvZ2NyeV9tcGlfdC8KKyAgcy9HY3J5TVBJL2djcnlfbXBpX3QvCisgIHMvR0NSWV9TRVhQL2djcnlfc2V4cF90LworICBzL0djcnlTZXhwL2djcnlfc2V4cF90LworICBzL0dDUllfQ0lQSEVSX0hEL2djcnlfY2lwaGVyX2hkX3QvCisgIHMvR2NyeUNpcGhlckhkL2djcnlfY2lwaGVyX2hkX3QvCisgIHMvR0NSWV9NRF9IRC9nY3J5X21kX2hkX3QvCisgIHMvR2NyeU1ESGQvZ2NyeV9tZF9oZF90LworCisqIEluaXRpYWxpemF0aW9uCisKKyAgRm9yIHByb3BlciBpbml0aWFsaXphdGlvbiBvZiB0aGUgbGlicmFyeSwgeW91IG11c3QgY2FsbAorICBnY3J5X2NoZWNrX3ZlcnNpb24oKSBiZWZvcmUgY2FsbGluZyBhbnkgb3RoZXIgZnVuY3Rpb24gZXhjZXB0IGZvcgorICB0aGVzZSBnY3J5X2NvbnRyb2wgb3BlcmF0aW9uczoKKyAgICAgR0NSWUNUTF9TVVNQRU5EX1NFQ01FTV9XQVJOCisgICAgIEdDUllDVExfRElTQUJMRV9JTlRFUk5BTF9MT0NLSU5HCisgICAgIEdDUllDVExfQU5ZX0lOSVRJQUxJWkFUSU9OX1AKKyAgICAgR0NSWUNUTF9JTklUSUFMSVpBVElPTl9GSU5JU0hFRF9QCisKKworKiBIYW5kbGVzCisKKyAgZ2NyeV9jaXBoZXJfb3BlbiBhbmQgZ2NyeV9tZF9vcGVuIGRvIG5vdyByZXR1cm4gYW4gZXJyb3IgY29kZQorICBpbnN0ZWFkIG9mIGEgTlVMTCBoYW5kbGU7IHRoZSBoYW5kbGUgaXMgbm93IHJldHVybmVkIGJ5CisgIGFzaWduaW5nIGl0IHRvIHRoZSBmaXJzdCBhcmd1bWVudC4gIEV4YW1wbGUgb24gaG93IHRvIGNoYW5nZSB5b3VyCisgIGNvZGU6CisKKyAgT2xkOgorCisgICAgaGQgPSBnY3J5X21kX29wZW4gKGFsZ28sIGZsYWdzKTsKKyAgICBpZiAoIWhkKQorICAgICAgeworICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAibWRfb3BlbiBmYWlsZWQ6ICVzXG4iLCBnY3J5X2Vycm5vICgtMSkpOworICAgICAgICAgLi4uLgorCisgIE5ldzoKKworICAgIHJjID0gZ2NyeV9tZF9vcGVuICgmaGQsIGFsZ28sIGZsYWdzKTsKKyAgICBpZiAocmMpCisgICAgICB7CisgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJtZF9vcGVuIGZhaWxlZDogJXNcbiIsIGdjcnlfc3RyZXJyb3IgKHJjKSk7CisgICAgICAgICAuLi4uCisKKyAgSWYgeW91IGFyZSBub3QgaW50ZXJlc3RlZCBpbiB0aGUgZXJyb3IgY29kZSwgeW91IGNhbiBkbyBpdCBpbiBhCisgIHNpbXBsaWZpZWQgd2F5OgorIAorICAgIGdjcnlfbWRfb3BlbiAoJmhkLCBhbGdvLCBmbGFncyk7CisgICAgaWYgKCFoZCkKKyAgICAgICAgYWJvcnQgKCk7CisKKyAgaS5lLiB0aGUgZnVuY3Rpb24gbWFrZXMgc3VyZSB0aGF0IEhEIHBvaW50cyB0byBOVUxMIGluIGNhc2Ugb2YgYW4gZXJyb3IuCisgIFRoZSByZXF1aXJlZCBjaGFuZ2UgZm9yIGdjcnlfY2lwaGVyX29wZW4gaXMgc2ltaWxhci4KKworKiBNZXNzYWdlIERpZ2VzdHMKKworICBUaGUgb3JkZXIgb2YgdGhlIGFyZ3VtZW50cyB0byBnY3J5X21kX2NvcHkgaGFzIGJlZW4gY2hhbmdlZCBpbiBvcmRlcgorICB0byBiZSBtb3JlIGNvbnNpc3RlbnQgd2l0aCBvdGhlciBmdW5jdGlvbnMgb2YgdGhpcyB0eXBlLiAgVGhpcyBtZWFucworICB0aGF0IHRoZSBuZXcgbWVzc2FnZSBkaWdlc3QgaGFuZGxlIHdpbGwgYmUgYSBjb3B5IG9mIHRoZSBtZXNzYWdlCisgIGhhbmRsZSBzcGVjaWZpZWQgYnkgdGhlIHNlY29uZCBhcmd1bWVudCBhbmQgc3RvcmVkIGF0IHRoZSBhZGRyZXNzCisgIHBvaW50ZWQgdG8gYnkgdGhlIGZpcnN0IGFyZ3VtZW50LgorCisqIEVycm9yIGNvZGVzCisKKyAgZ2NyeV9lcnJubyAoKSBoYXMgYmVlbiByZW1vdmVkIGJlY2F1c2UgaXQgaXMgaGFyZCB0byB1c2UgaW4KKyAgbXVsdGktdGhyZWFkZWQgZW52aXJvbm1lbnQuICBZb3UgbmVlZCB0byBzYXZlIHRoZSBlcnJvciBjb2RlCisgIHJldHVybmVkIGJ5IHRoZSBmdW5jdGlvbnMgYW5kIHVzZSBpdCBlaXRoZXIgbnVtZXJpY2FsIG9yIHBhc3NpbmcgaXQKKyAgdG8gZ2NyeV9zdHJlcnJvciAoc2luY2UgZ2NyeV9zdHJlcnJvciBpcyBhIHdyYXBwZXIgZnVuY3Rpb24gZm9yCisgIGdwZ19zdHJlcnJvciwgdGhlIGxhdHRlciBmdW5jdGlvbiBjYW4gYWxzbyBiZSB1c2VkKS4KKworICBJbnN0ZWFkIG9mIHVzaW5nIHRoZSBlcnJvciBjb2RlcyBHQ1JZRVJSXyosIHlvdSBoYXZlIHRvIHVzZSB0aGUKKyAgR1BHX0VSUl8qIG5hbWVzLiAKKworKiBTLWV4cHJlc3Npb25zCisKKyAgZ2NyeV9zZXhwX2Nhbm9uX2xlbiB1c2VkIHRvIHJldHVybiBhIGBoaXN0b3JpY2FsJyBlcnJvciBjb2RlIGluCisgIGBlcnJjb2RlJywgdGhpcyBpcyBub3QgdGhlIGNhc2UgYW55bW9yZTsgdGhlIHZhbHVlIHJldHVybmVkIGluCisgIGBlcnJjb2RlJyBpcyBub3cgYSBzdGFuZGFyZCBMaWJnY3J5cHQgKGkuZS4gZ3BnLWVycm9yKSBlcnJvciBjb2RlLgorCisqIE1QSQorCisgIGdjcnlfbXBpX3NjYW4gYW5kIGdjcnlfbXBpX3ByaW50IG5lZWQgdGhlIHNpemUgb2YgYSBwcm92aWRlZCBidWZmZXIKKyAgYXMgaW5wdXQgYW5kIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHNjYW5uZWQvcHJpbnRlZCB0bworICB0aGUgdXNlci4gIFRoZSBvbGQgQVBJIHVzZWQgYSBzaW5nbGUgc2l6ZV90IFBvaW50ZXIgZm9yIGJvdGggdGFza3MsCisgIHRoZSBuZXcgQVBJIGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiB0aGUgaW5wdXQgYW5kIHRoZSBvdXRwdXQgdmFsdWVzLgorCisqIFB1YmxpYyBLZXkgY3J5cHRvZ3JhcGh5CisKKyAgZ2NyeV9wa19kZWNyeXB0IHVzZWQgdG8gcmV0dXJuIGEgYHNpbXBsZSBTLWV4cHJlc3Npb24gcGFydCcgdGhhdAorICBjb250YWlucyBhIHNpbmdsZSBNUEkgdmFsdWUuICBJbiBjYXNlIHRoZSBgZGF0YScgUy1leHByZXNzaW9uCisgIGNvbnRhaW5zIGEgYGZsYWdzJyBlbGVtZW50LCB0aGUgcmVzdWx0IFMtZXhwcmVzc2lvbiBpcyBmaWxsZWQgd2l0aCBhCisgIGNvbXBsZXRlIFMtZXhwcmVzc2lvbiBvZiB0aGUgZm9sbG93aW5nIGZvcm1hdDoKKworICAgICh2YWx1ZSBQTEFJTlRFWFQpCisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9kb2MvZmlwcy1mc20uZXBzIGIvbGliZ2NyeXB0LTEuNC42L2RvYy9maXBzLWZzbS5lcHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMzZjY4MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9kb2MvZmlwcy1mc20uZXBzCkBAIC0wLDAgKzEsNTgwIEBACislIVBTLUFkb2JlLTIuMCBFUFNGLTIuMAorJSVUaXRsZTogZmlwcy1mc20uZmlnCislJUNyZWF0b3I6IGZpZzJkZXYgVmVyc2lvbiAzLjIgUGF0Y2hsZXZlbCA0CislJUNyZWF0aW9uRGF0ZTogVGh1IEp1bCAgOSAxMzoyNDozMyAyMDA5CislJUZvcjogd2tAdmlnZW5lcmUgKFdlcm5lciBLb2NoLCwsKQorJSVCb3VuZGluZ0JveDogMCAwIDQ5NyA1NzkKKyUlTWFnbmlmaWNhdGlvbjogMS4wMDAwCislJUVuZENvbW1lbnRzCisvJEYycHNEaWN0IDIwMCBkaWN0IGRlZgorJEYycHNEaWN0IGJlZ2luCiskRjJwc0RpY3QgL210cnggbWF0cml4IHB1dAorL2NvbC0xIHswIHNldGdyYXl9IGJpbmQgZGVmCisvY29sMCB7MC4wMDAgMC4wMDAgMC4wMDAgc3JnYn0gYmluZCBkZWYKKy9jb2wxIHswLjAwMCAwLjAwMCAxLjAwMCBzcmdifSBiaW5kIGRlZgorL2NvbDIgezAuMDAwIDEuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCisvY29sMyB7MC4wMDAgMS4wMDAgMS4wMDAgc3JnYn0gYmluZCBkZWYKKy9jb2w0IHsxLjAwMCAwLjAwMCAwLjAwMCBzcmdifSBiaW5kIGRlZgorL2NvbDUgezEuMDAwIDAuMDAwIDEuMDAwIHNyZ2J9IGJpbmQgZGVmCisvY29sNiB7MS4wMDAgMS4wMDAgMC4wMDAgc3JnYn0gYmluZCBkZWYKKy9jb2w3IHsxLjAwMCAxLjAwMCAxLjAwMCBzcmdifSBiaW5kIGRlZgorL2NvbDggezAuMDAwIDAuMDAwIDAuNTYwIHNyZ2J9IGJpbmQgZGVmCisvY29sOSB7MC4wMDAgMC4wMDAgMC42OTAgc3JnYn0gYmluZCBkZWYKKy9jb2wxMCB7MC4wMDAgMC4wMDAgMC44MjAgc3JnYn0gYmluZCBkZWYKKy9jb2wxMSB7MC41MzAgMC44MTAgMS4wMDAgc3JnYn0gYmluZCBkZWYKKy9jb2wxMiB7MC4wMDAgMC41NjAgMC4wMDAgc3JnYn0gYmluZCBkZWYKKy9jb2wxMyB7MC4wMDAgMC42OTAgMC4wMDAgc3JnYn0gYmluZCBkZWYKKy9jb2wxNCB7MC4wMDAgMC44MjAgMC4wMDAgc3JnYn0gYmluZCBkZWYKKy9jb2wxNSB7MC4wMDAgMC41NjAgMC41NjAgc3JnYn0gYmluZCBkZWYKKy9jb2wxNiB7MC4wMDAgMC42OTAgMC42OTAgc3JnYn0gYmluZCBkZWYKKy9jb2wxNyB7MC4wMDAgMC44MjAgMC44MjAgc3JnYn0gYmluZCBkZWYKKy9jb2wxOCB7MC41NjAgMC4wMDAgMC4wMDAgc3JnYn0gYmluZCBkZWYKKy9jb2wxOSB7MC42OTAgMC4wMDAgMC4wMDAgc3JnYn0gYmluZCBkZWYKKy9jb2wyMCB7MC44MjAgMC4wMDAgMC4wMDAgc3JnYn0gYmluZCBkZWYKKy9jb2wyMSB7MC41NjAgMC4wMDAgMC41NjAgc3JnYn0gYmluZCBkZWYKKy9jb2wyMiB7MC42OTAgMC4wMDAgMC42OTAgc3JnYn0gYmluZCBkZWYKKy9jb2wyMyB7MC44MjAgMC4wMDAgMC44MjAgc3JnYn0gYmluZCBkZWYKKy9jb2wyNCB7MC41MDAgMC4xOTAgMC4wMDAgc3JnYn0gYmluZCBkZWYKKy9jb2wyNSB7MC42MzAgMC4yNTAgMC4wMDAgc3JnYn0gYmluZCBkZWYKKy9jb2wyNiB7MC43NTAgMC4zODAgMC4wMDAgc3JnYn0gYmluZCBkZWYKKy9jb2wyNyB7MS4wMDAgMC41MDAgMC41MDAgc3JnYn0gYmluZCBkZWYKKy9jb2wyOCB7MS4wMDAgMC42MzAgMC42MzAgc3JnYn0gYmluZCBkZWYKKy9jb2wyOSB7MS4wMDAgMC43NTAgMC43NTAgc3JnYn0gYmluZCBkZWYKKy9jb2wzMCB7MS4wMDAgMC44ODAgMC44ODAgc3JnYn0gYmluZCBkZWYKKy9jb2wzMSB7MS4wMDAgMC44NDAgMC4wMDAgc3JnYn0gYmluZCBkZWYKKy9jb2wzMiB7MC42MDkgMC4wMDAgMC4wMDAgc3JnYn0gYmluZCBkZWYKKy9jb2wzMyB7MC41NDcgMC41NDcgMC41NDcgc3JnYn0gYmluZCBkZWYKKy9jb2wzNCB7MC41NDcgMC41NDcgMC41NDcgc3JnYn0gYmluZCBkZWYKKy9jb2wzNSB7MC4yNTggMC4yNTggMC4yNTggc3JnYn0gYmluZCBkZWYKKy9jb2wzNiB7MC41NDcgMC41NDcgMC41NDcgc3JnYn0gYmluZCBkZWYKKy9jb2wzNyB7MC4yNTggMC4yNTggMC4yNTggc3JnYn0gYmluZCBkZWYKKy9jb2wzOCB7MC41NDcgMC41NDcgMC41NDcgc3JnYn0gYmluZCBkZWYKKy9jb2wzOSB7MC4yNTggMC4yNTggMC4yNTggc3JnYn0gYmluZCBkZWYKKy9jb2w0MCB7MC41NDcgMC41NDcgMC41NDcgc3JnYn0gYmluZCBkZWYKKy9jb2w0MSB7MC4yNTggMC4yNTggMC4yNTggc3JnYn0gYmluZCBkZWYKKy9jb2w0MiB7MC41NDcgMC41NDcgMC41NDcgc3JnYn0gYmluZCBkZWYKKy9jb2w0MyB7MC4yNTggMC4yNTggMC4yNTggc3JnYn0gYmluZCBkZWYKKworZW5kCitzYXZlCituZXdwYXRoIDAgNTc5IG1vdmV0byAwIDAgbGluZXRvIDQ5NyAwIGxpbmV0byA0OTcgNTc5IGxpbmV0byBjbG9zZXBhdGggY2xpcCBuZXdwYXRoCistNTYuOSA1OTYuMCB0cmFuc2xhdGUKKzEgLTEgc2NhbGUKKworL2NwIHtjbG9zZXBhdGh9IGJpbmQgZGVmCisvZWYge2VvZmlsbH0gYmluZCBkZWYKKy9nciB7Z3Jlc3RvcmV9IGJpbmQgZGVmCisvZ3Mge2dzYXZlfSBiaW5kIGRlZgorL3NhIHtzYXZlfSBiaW5kIGRlZgorL3JzIHtyZXN0b3JlfSBiaW5kIGRlZgorL2wge2xpbmV0b30gYmluZCBkZWYKKy9tIHttb3ZldG99IGJpbmQgZGVmCisvcm0ge3Jtb3ZldG99IGJpbmQgZGVmCisvbiB7bmV3cGF0aH0gYmluZCBkZWYKKy9zIHtzdHJva2V9IGJpbmQgZGVmCisvc2gge3Nob3d9IGJpbmQgZGVmCisvc2xjIHtzZXRsaW5lY2FwfSBiaW5kIGRlZgorL3NsaiB7c2V0bGluZWpvaW59IGJpbmQgZGVmCisvc2x3IHtzZXRsaW5ld2lkdGh9IGJpbmQgZGVmCisvc3JnYiB7c2V0cmdiY29sb3J9IGJpbmQgZGVmCisvcm90IHtyb3RhdGV9IGJpbmQgZGVmCisvc2Mge3NjYWxlfSBiaW5kIGRlZgorL3NkIHtzZXRkYXNofSBiaW5kIGRlZgorL2ZmIHtmaW5kZm9udH0gYmluZCBkZWYKKy9zZiB7c2V0Zm9udH0gYmluZCBkZWYKKy9zY2Yge3NjYWxlZm9udH0gYmluZCBkZWYKKy9zdyB7c3RyaW5nd2lkdGh9IGJpbmQgZGVmCisvdHIge3RyYW5zbGF0ZX0gYmluZCBkZWYKKy90bnQge2R1cCBkdXAgY3VycmVudHJnYmNvbG9yCisgIDQgLTIgcm9sbCBkdXAgMSBleGNoIHN1YiAzIC0xIHJvbGwgbXVsIGFkZAorICA0IC0yIHJvbGwgZHVwIDEgZXhjaCBzdWIgMyAtMSByb2xsIG11bCBhZGQKKyAgNCAtMiByb2xsIGR1cCAxIGV4Y2ggc3ViIDMgLTEgcm9sbCBtdWwgYWRkIHNyZ2J9CisgIGJpbmQgZGVmCisvc2hkIHtkdXAgZHVwIGN1cnJlbnRyZ2Jjb2xvciA0IC0yIHJvbGwgbXVsIDQgLTIgcm9sbCBtdWwKKyAgNCAtMiByb2xsIG11bCBzcmdifSBiaW5kIGRlZgorL3JlZW5jZGljdCAxMiBkaWN0IGRlZiAvUmVFbmNvZGUgeyByZWVuY2RpY3QgYmVnaW4KKy9uZXdjb2Rlc2FuZG5hbWVzIGV4Y2ggZGVmIC9uZXdmb250bmFtZSBleGNoIGRlZiAvYmFzZWZvbnRuYW1lIGV4Y2ggZGVmCisvYmFzZWZvbnRkaWN0IGJhc2Vmb250bmFtZSBmaW5kZm9udCBkZWYgL25ld2ZvbnQgYmFzZWZvbnRkaWN0IG1heGxlbmd0aCBkaWN0IGRlZgorYmFzZWZvbnRkaWN0IHsgZXhjaCBkdXAgL0ZJRCBuZSB7IGR1cCAvRW5jb2RpbmcgZXEKK3sgZXhjaCBkdXAgbGVuZ3RoIGFycmF5IGNvcHkgbmV3Zm9udCAzIDEgcm9sbCBwdXQgfQoreyBleGNoIG5ld2ZvbnQgMyAxIHJvbGwgcHV0IH0gaWZlbHNlIH0geyBwb3AgcG9wIH0gaWZlbHNlIH0gZm9yYWxsCituZXdmb250IC9Gb250TmFtZSBuZXdmb250bmFtZSBwdXQgbmV3Y29kZXNhbmRuYW1lcyBhbG9hZCBwb3AKKzEyOCAxIDI1NSB7IG5ld2ZvbnQgL0VuY29kaW5nIGdldCBleGNoIC8ubm90ZGVmIHB1dCB9IGZvcgorbmV3Y29kZXNhbmRuYW1lcyBsZW5ndGggMiBpZGl2IHsgbmV3Zm9udCAvRW5jb2RpbmcgZ2V0IDMgMSByb2xsIHB1dCB9IHJlcGVhdAorbmV3Zm9udG5hbWUgbmV3Zm9udCBkZWZpbmVmb250IHBvcCBlbmQgfSBkZWYKKy9pc292ZWMgWworOCMwNTUgL21pbnVzIDgjMjAwIC9ncmF2ZSA4IzIwMSAvYWN1dGUgOCMyMDIgL2NpcmN1bWZsZXggOCMyMDMgL3RpbGRlCis4IzIwNCAvbWFjcm9uIDgjMjA1IC9icmV2ZSA4IzIwNiAvZG90YWNjZW50IDgjMjA3IC9kaWVyZXNpcworOCMyMTAgL3JpbmcgOCMyMTEgL2NlZGlsbGEgOCMyMTIgL2h1bmdhcnVtbGF1dCA4IzIxMyAvb2dvbmVrIDgjMjE0IC9jYXJvbgorOCMyMjAgL2RvdGxlc3NpIDgjMjMwIC9vZSA4IzIzMSAvT0UKKzgjMjQwIC9zcGFjZSA4IzI0MSAvZXhjbGFtZG93biA4IzI0MiAvY2VudCA4IzI0MyAvc3RlcmxpbmcKKzgjMjQ0IC9jdXJyZW5jeSA4IzI0NSAveWVuIDgjMjQ2IC9icm9rZW5iYXIgOCMyNDcgL3NlY3Rpb24gOCMyNTAgL2RpZXJlc2lzCis4IzI1MSAvY29weXJpZ2h0IDgjMjUyIC9vcmRmZW1pbmluZSA4IzI1MyAvZ3VpbGxlbW90bGVmdCA4IzI1NCAvbG9naWNhbG5vdAorOCMyNTUgL2h5cGhlbiA4IzI1NiAvcmVnaXN0ZXJlZCA4IzI1NyAvbWFjcm9uIDgjMjYwIC9kZWdyZWUgOCMyNjEgL3BsdXNtaW51cworOCMyNjIgL3R3b3N1cGVyaW9yIDgjMjYzIC90aHJlZXN1cGVyaW9yIDgjMjY0IC9hY3V0ZSA4IzI2NSAvbXUgOCMyNjYgL3BhcmFncmFwaAorOCMyNjcgL3BlcmlvZGNlbnRlcmVkIDgjMjcwIC9jZWRpbGxhIDgjMjcxIC9vbmVzdXBlcmlvciA4IzI3MiAvb3JkbWFzY3VsaW5lCis4IzI3MyAvZ3VpbGxlbW90cmlnaHQgOCMyNzQgL29uZXF1YXJ0ZXIgOCMyNzUgL29uZWhhbGYKKzgjMjc2IC90aHJlZXF1YXJ0ZXJzIDgjMjc3IC9xdWVzdGlvbmRvd24gOCMzMDAgL0FncmF2ZSA4IzMwMSAvQWFjdXRlCis4IzMwMiAvQWNpcmN1bWZsZXggOCMzMDMgL0F0aWxkZSA4IzMwNCAvQWRpZXJlc2lzIDgjMzA1IC9BcmluZworOCMzMDYgL0FFIDgjMzA3IC9DY2VkaWxsYSA4IzMxMCAvRWdyYXZlIDgjMzExIC9FYWN1dGUKKzgjMzEyIC9FY2lyY3VtZmxleCA4IzMxMyAvRWRpZXJlc2lzIDgjMzE0IC9JZ3JhdmUgOCMzMTUgL0lhY3V0ZQorOCMzMTYgL0ljaXJjdW1mbGV4IDgjMzE3IC9JZGllcmVzaXMgOCMzMjAgL0V0aCA4IzMyMSAvTnRpbGRlIDgjMzIyIC9PZ3JhdmUKKzgjMzIzIC9PYWN1dGUgOCMzMjQgL09jaXJjdW1mbGV4IDgjMzI1IC9PdGlsZGUgOCMzMjYgL09kaWVyZXNpcyA4IzMyNyAvbXVsdGlwbHkKKzgjMzMwIC9Pc2xhc2ggOCMzMzEgL1VncmF2ZSA4IzMzMiAvVWFjdXRlIDgjMzMzIC9VY2lyY3VtZmxleAorOCMzMzQgL1VkaWVyZXNpcyA4IzMzNSAvWWFjdXRlIDgjMzM2IC9UaG9ybiA4IzMzNyAvZ2VybWFuZGJscyA4IzM0MCAvYWdyYXZlCis4IzM0MSAvYWFjdXRlIDgjMzQyIC9hY2lyY3VtZmxleCA4IzM0MyAvYXRpbGRlIDgjMzQ0IC9hZGllcmVzaXMgOCMzNDUgL2FyaW5nCis4IzM0NiAvYWUgOCMzNDcgL2NjZWRpbGxhIDgjMzUwIC9lZ3JhdmUgOCMzNTEgL2VhY3V0ZQorOCMzNTIgL2VjaXJjdW1mbGV4IDgjMzUzIC9lZGllcmVzaXMgOCMzNTQgL2lncmF2ZSA4IzM1NSAvaWFjdXRlCis4IzM1NiAvaWNpcmN1bWZsZXggOCMzNTcgL2lkaWVyZXNpcyA4IzM2MCAvZXRoIDgjMzYxIC9udGlsZGUgOCMzNjIgL29ncmF2ZQorOCMzNjMgL29hY3V0ZSA4IzM2NCAvb2NpcmN1bWZsZXggOCMzNjUgL290aWxkZSA4IzM2NiAvb2RpZXJlc2lzIDgjMzY3IC9kaXZpZGUKKzgjMzcwIC9vc2xhc2ggOCMzNzEgL3VncmF2ZSA4IzM3MiAvdWFjdXRlIDgjMzczIC91Y2lyY3VtZmxleAorOCMzNzQgL3VkaWVyZXNpcyA4IzM3NSAveWFjdXRlIDgjMzc2IC90aG9ybiA4IzM3NyAveWRpZXJlc2lzXSBkZWYKKy9Db3VyaWVyLU9ibGlxdWUgL0NvdXJpZXItT2JsaXF1ZS1pc28gaXNvdmVjIFJlRW5jb2RlCisvVGltZXMtUm9tYW4gL1RpbWVzLVJvbWFuLWlzbyBpc292ZWMgUmVFbmNvZGUKKyAvRHJhd0VsbGlwc2UgeworCS9lbmRhbmdsZSBleGNoIGRlZgorCS9zdGFydGFuZ2xlIGV4Y2ggZGVmCisJL3lyYWQgZXhjaCBkZWYKKwkveHJhZCBleGNoIGRlZgorCS95IGV4Y2ggZGVmCisJL3ggZXhjaCBkZWYKKwkvc2F2ZW1hdHJpeCBtdHJ4IGN1cnJlbnRtYXRyaXggZGVmCisJeCB5IHRyIHhyYWQgeXJhZCBzYyAwIDAgMSBzdGFydGFuZ2xlIGVuZGFuZ2xlIGFyYworCWNsb3NlcGF0aAorCXNhdmVtYXRyaXggc2V0bWF0cml4CisJfSBkZWYKKworLyRGMnBzQmVnaW4geyRGMnBzRGljdCBiZWdpbiAvJEYycHNFbnRlcmVkU3RhdGUgc2F2ZSBkZWZ9IGRlZgorLyRGMnBzRW5kIHskRjJwc0VudGVyZWRTdGF0ZSByZXN0b3JlIGVuZH0gZGVmCisKKyRGMnBzQmVnaW4KKzEwIHNldG1pdGVybGltaXQKKzAgc2xqIDAgc2xjCisgMC4wNjI5OSAwLjA2Mjk5IHNjCislCislIEZpZyBvYmplY3RzIGZvbGxvdworJQorJSAKKyUgaGVyZSBzdGFydHMgZmlndXJlIHdpdGggZGVwdGggNTAKKyUgRWxsaXBzZQorNy41MDAgc2x3CituIDMyMzggMTczNSAxNDIgMTQyIDAgMzYwIERyYXdFbGxpcHNlIGdzIGNvbDAgcyBncgorCisvQ291cmllci1PYmxpcXVlLWlzbyBmZiAxODAuMDAgc2NmIHNmCiszMTU3IDE4MDUgbQorZ3MgMSAtMSBzYyAoMSkgY29sMCBzaCBncgorJSBFbGxpcHNlCituIDI0MDggMzc0OSAxNDIgMTQyIDAgMzYwIERyYXdFbGxpcHNlIGdzIGNvbDAgcyBncgorCisvQ291cmllci1PYmxpcXVlLWlzbyBmZiAxODAuMDAgc2NmIHNmCisyMzI3IDM4MTkgbQorZ3MgMSAtMSBzYyAoMikgY29sMCBzaCBncgorJSBFbGxpcHNlCituIDE3MDggNTgwOSAxNDIgMTQyIDAgMzYwIERyYXdFbGxpcHNlIGdzIGNvbDAgcyBncgorCisvQ291cmllci1PYmxpcXVlLWlzbyBmZiAxODAuMDAgc2NmIHNmCisxNjI3IDU4NzkgbQorZ3MgMSAtMSBzYyAoMykgY29sMCBzaCBncgorJSBFbGxpcHNlCituIDU4NDggMTY4NSAxNDIgMTQyIDAgMzYwIERyYXdFbGxpcHNlIGdzIGNvbDAgcyBncgorCisvQ291cmllci1PYmxpcXVlLWlzbyBmZiAxODAuMDAgc2NmIHNmCis1NzY3IDE3NTUgbQorZ3MgMSAtMSBzYyAoNikgY29sMCBzaCBncgorJSBFbGxpcHNlCituIDYxMjggNzg5OSAxNDIgMTQyIDAgMzYwIERyYXdFbGxpcHNlIGdzIGNvbDAgcyBncgorCisvQ291cmllci1PYmxpcXVlLWlzbyBmZiAxODAuMDAgc2NmIHNmCis2MDQ3IDc5NjkgbQorZ3MgMSAtMSBzYyAoNykgY29sMCBzaCBncgorJSBFbGxpcHNlCituIDc1NjggNDg4OSAxNDIgMTQyIDAgMzYwIERyYXdFbGxpcHNlIGdzIGNvbDAgcyBncgorCisvQ291cmllci1PYmxpcXVlLWlzbyBmZiAxODAuMDAgc2NmIHNmCis3NDg3IDQ5NTkgbQorZ3MgMSAtMSBzYyAoOCkgY29sMCBzaCBncgorJSBFbGxpcHNlCituIDYwMDggMzg3OSAxNDIgMTQyIDAgMzYwIERyYXdFbGxpcHNlIGdzIGNvbDAgcyBncgorCisvQ291cmllci1PYmxpcXVlLWlzbyBmZiAxODAuMDAgc2NmIHNmCis1ODgyIDM5NDAgbQorZ3MgMSAtMSBzYyAoMTApIGNvbDAgc2ggZ3IKKyUgRWxsaXBzZQorbiA1NDE4IDI2NTkgMTQyIDE0MiAwIDM2MCBEcmF3RWxsaXBzZSBncyBjb2wwIHMgZ3IKKworL0NvdXJpZXItT2JsaXF1ZS1pc28gZmYgMTgwLjAwIHNjZiBzZgorNTI5MiAyNzIwIG0KK2dzIDEgLTEgc2MgKDExKSBjb2wwIHNoIGdyCislIEVsbGlwc2UKK24gNDI2OCAzNzE1IDE0MiAxNDIgMCAzNjAgRHJhd0VsbGlwc2UgZ3MgY29sMCBzIGdyCisKKy9Db3VyaWVyLU9ibGlxdWUtaXNvIGZmIDE4MC4wMCBzY2Ygc2YKKzQxNDIgMzc3NiBtCitncyAxIC0xIHNjICgxMikgY29sMCBzaCBncgorJSBFbGxpcHNlCituIDMyMDggNTg2NSAxNDIgMTQyIDAgMzYwIERyYXdFbGxpcHNlIGdzIGNvbDAgcyBncgorCisvQ291cmllci1PYmxpcXVlLWlzbyBmZiAxODAuMDAgc2NmIHNmCiszMDgyIDU5MjYgbQorZ3MgMSAtMSBzYyAoMTMpIGNvbDAgc2ggZ3IKKyUgRWxsaXBzZQorbiA0MTc4IDY3NjUgMTQyIDE0MiAwIDM2MCBEcmF3RWxsaXBzZSBncyBjb2wwIHMgZ3IKKworL0NvdXJpZXItT2JsaXF1ZS1pc28gZmYgMTgwLjAwIHNjZiBzZgorNDA1MiA2ODI2IG0KK2dzIDEgLTEgc2MgKDE0KSBjb2wwIHNoIGdyCislIEVsbGlwc2UKK24gNDU1OCA3MzU1IDE0MiAxNDIgMCAzNjAgRHJhd0VsbGlwc2UgZ3MgY29sMCBzIGdyCisKKy9Db3VyaWVyLU9ibGlxdWUtaXNvIGZmIDE4MC4wMCBzY2Ygc2YKKzQ0MzIgNzQxNiBtCitncyAxIC0xIHNjICgxNSkgY29sMCBzaCBncgorJSBFbGxpcHNlCituIDUyMDggNzM2NSAxNDIgMTQyIDAgMzYwIERyYXdFbGxpcHNlIGdzIGNvbDAgcyBncgorCisvQ291cmllci1PYmxpcXVlLWlzbyBmZiAxODAuMDAgc2NmIHNmCis1MTI3IDc0MzUgbQorZ3MgMSAtMSBzYyAoNSkgY29sMCBzaCBncgorJSBFbGxpcHNlCituIDM3MDggNzcxNSAxNDIgMTQyIDAgMzYwIERyYXdFbGxpcHNlIGdzIGNvbDAgcyBncgorCisvQ291cmllci1PYmxpcXVlLWlzbyBmZiAxODAuMDAgc2NmIHNmCiszNTgyIDc3NzYgbQorZ3MgMSAtMSBzYyAoMTYpIGNvbDAgc2ggZ3IKKyUgRWxsaXBzZQorbiAzMDM4IDc5MjUgMTQyIDE0MiAwIDM2MCBEcmF3RWxsaXBzZSBncyBjb2wwIHMgZ3IKKworL0NvdXJpZXItT2JsaXF1ZS1pc28gZmYgMTgwLjAwIHNjZiBzZgorMjk1NyA3OTk1IG0KK2dzIDEgLTEgc2MgKDQpIGNvbDAgc2ggZ3IKKyUgRWxsaXBzZQorbiA2NTY4IDU4OTUgMTQyIDE0MiAwIDM2MCBEcmF3RWxsaXBzZSBncyBjb2wwIHMgZ3IKKworL0NvdXJpZXItT2JsaXF1ZS1pc28gZmYgMTgwLjAwIHNjZiBzZgorNjQ4NyA1OTY1IG0KK2dzIDEgLTEgc2MgKDkpIGNvbDAgc2ggZ3IKKyUgUG9seWxpbmUKK24gMzkwMCA4MzcwIG0gMzYwMCA4MzcwIDM2MDAgOTE1MCAzMDAgYXJjdG8gNCB7cG9wfSByZXBlYXQKKyAgMzYwMCA5NDUwIDU2NzAgOTQ1MCAzMDAgYXJjdG8gNCB7cG9wfSByZXBlYXQKKyAgNTk3MCA5NDUwIDU5NzAgODY3MCAzMDAgYXJjdG8gNCB7cG9wfSByZXBlYXQKKyAgNTk3MCA4MzcwIDM5MDAgODM3MCAzMDAgYXJjdG8gNCB7cG9wfSByZXBlYXQKKyBjcCBncyBjb2wwIHMgZ3IgCisvVGltZXMtUm9tYW4taXNvIGZmIDM2MC4wMCBzY2Ygc2YKKzM4NzAgOTAwMCBtCitncyAxIC0xIHNjIChPcGVyYXRpb25hbCkgY29sMCBzaCBncgorJSBQb2x5bGluZQorbiAxMjE1IDQzMzUgbSA5MTUgNDMzNSA5MTUgNTE0NSAzMDAgYXJjdG8gNCB7cG9wfSByZXBlYXQKKyAgOTE1IDU0NDUgMjY0MCA1NDQ1IDMwMCBhcmN0byA0IHtwb3B9IHJlcGVhdAorICAyOTQwIDU0NDUgMjk0MCA0NjM1IDMwMCBhcmN0byA0IHtwb3B9IHJlcGVhdAorICAyOTQwIDQzMzUgMTIxNSA0MzM1IDMwMCBhcmN0byA0IHtwb3B9IHJlcGVhdAorIGNwIGdzIGNvbDAgcyBnciAKKy9UaW1lcy1Sb21hbi1pc28gZmYgMzYwLjAwIHNjZiBzZgorMTYyMCA0OTk1IG0KK2dzIDEgLTEgc2MgKEluaXQpIGNvbDAgc2ggZ3IKKyUgUG9seWxpbmUKK24gMTIzMCA2MzQ1IG0gOTMwIDYzNDUgOTMwIDcxNTUgMzAwIGFyY3RvIDQge3BvcH0gcmVwZWF0CisgIDkzMCA3NDU1IDI2NTUgNzQ1NSAzMDAgYXJjdG8gNCB7cG9wfSByZXBlYXQKKyAgMjk1NSA3NDU1IDI5NTUgNjY0NSAzMDAgYXJjdG8gNCB7cG9wfSByZXBlYXQKKyAgMjk1NSA2MzQ1IDEyMzAgNjM0NSAzMDAgYXJjdG8gNCB7cG9wfSByZXBlYXQKKyBjcCBncyBjb2wwIHMgZ3IgCisvVGltZXMtUm9tYW4taXNvIGZmIDM2MC4wMCBzY2Ygc2YKKzEyMTUgNzAyMCBtCitncyAxIC0xIHNjIChTZWxmLVRlc3QpIGNvbDAgc2ggZ3IKKyUgUG9seWxpbmUKK24gNzA1MCA2MzYwIG0gNjc1MCA2MzYwIDY3NTAgNzE3MCAzMDAgYXJjdG8gNCB7cG9wfSByZXBlYXQKKyAgNjc1MCA3NDcwIDg0NzUgNzQ3MCAzMDAgYXJjdG8gNCB7cG9wfSByZXBlYXQKKyAgODc3NSA3NDcwIDg3NzUgNjY2MCAzMDAgYXJjdG8gNCB7cG9wfSByZXBlYXQKKyAgODc3NSA2MzYwIDcwNTAgNjM2MCAzMDAgYXJjdG8gNCB7cG9wfSByZXBlYXQKKyBjcCBncyBjb2wwIHMgZ3IgCisvVGltZXMtUm9tYW4taXNvIGZmIDM2MC4wMCBzY2Ygc2YKKzczMzUgNzAyMCBtCitncyAxIC0xIHNjIChFcnJvcikgY29sMCBzaCBncgorJSBQb2x5bGluZQorbiA0MTI1IDQzMzUgbSAzODI1IDQzMzUgMzgyNSA1MTQ1IDMwMCBhcmN0byA0IHtwb3B9IHJlcGVhdAorICAzODI1IDU0NDUgNTU1MCA1NDQ1IDMwMCBhcmN0byA0IHtwb3B9IHJlcGVhdAorICA1ODUwIDU0NDUgNTg1MCA0NjM1IDMwMCBhcmN0byA0IHtwb3B9IHJlcGVhdAorICA1ODUwIDQzMzUgNDEyNSA0MzM1IDMwMCBhcmN0byA0IHtwb3B9IHJlcGVhdAorIGNwIGdzIGNvbDAgcyBnciAKKy9UaW1lcy1Sb21hbi1pc28gZmYgMzYwLjAwIHNjZiBzZgorMzkxNSA0OTk1IG0KK2dzIDEgLTEgc2MgKEZhdGFsLUVycm9yKSBjb2wwIHNoIGdyCislIFBvbHlsaW5lCituIDcwNTAgMjMxMCBtIDY3NTAgMjMxMCA2NzUwIDMxMjAgMzAwIGFyY3RvIDQge3BvcH0gcmVwZWF0CisgIDY3NTAgMzQyMCA4NDc1IDM0MjAgMzAwIGFyY3RvIDQge3BvcH0gcmVwZWF0CisgIDg3NzUgMzQyMCA4Nzc1IDI2MTAgMzAwIGFyY3RvIDQge3BvcH0gcmVwZWF0CisgIDg3NzUgMjMxMCA3MDUwIDIzMTAgMzAwIGFyY3RvIDQge3BvcH0gcmVwZWF0CisgY3AgZ3MgY29sMCBzIGdyIAorL1RpbWVzLVJvbWFuLWlzbyBmZiAzNjAuMDAgc2NmIHNmCis2OTMwIDI5NzAgbQorZ3MgMSAtMSBzYyAoU2h1dGRvd24pIGNvbDAgc2ggZ3IKKyUgUG9seWxpbmUKK24gMjc3NSAyMjk1IG0gMjQ3NSAyMjk1IDI0NzUgMzEwNSAzMDAgYXJjdG8gNCB7cG9wfSByZXBlYXQKKyAgMjQ3NSAzNDA1IDQyMDAgMzQwNSAzMDAgYXJjdG8gNCB7cG9wfSByZXBlYXQKKyAgNDUwMCAzNDA1IDQ1MDAgMjU5NSAzMDAgYXJjdG8gNCB7cG9wfSByZXBlYXQKKyAgNDUwMCAyMjk1IDI3NzUgMjI5NSAzMDAgYXJjdG8gNCB7cG9wfSByZXBlYXQKKyBjcCBncyBjb2wwIHMgZ3IgCisvVGltZXMtUm9tYW4taXNvIGZmIDM2MC4wMCBzY2Ygc2YKKzI2NTUgMjk3MCBtCitncyAxIC0xIHNjIChQb3dlci1PbikgY29sMCBzaCBncgorJSBQb2x5bGluZQorbiAyNzc1IDI4NSBtIDI0NzUgMjg1IDI0NzUgMTA5NSAzMDAgYXJjdG8gNCB7cG9wfSByZXBlYXQKKyAgMjQ3NSAxMzk1IDQyMDAgMTM5NSAzMDAgYXJjdG8gNCB7cG9wfSByZXBlYXQKKyAgNDUwMCAxMzk1IDQ1MDAgNTg1IDMwMCBhcmN0byA0IHtwb3B9IHJlcGVhdAorICA0NTAwIDI4NSAyNzc1IDI4NSAzMDAgYXJjdG8gNCB7cG9wfSByZXBlYXQKKyBjcCBncyBjb2wwIHMgZ3IgCisvVGltZXMtUm9tYW4taXNvIGZmIDM2MC4wMCBzY2Ygc2YKKzI1NjUgOTQ1IG0KK2dzIDEgLTEgc2MgKFBvd2VyLU9mZikgY29sMCBzaCBncgorJSBFbGxpcHNlCituIDQxOTIgNjMzOCAxNDIgMTQyIDAgMzYwIERyYXdFbGxpcHNlIGdzIGNvbDAgcyBncgorCisvQ291cmllci1PYmxpcXVlLWlzbyBmZiAxODAuMDAgc2NmIHNmCis0MDY2IDYzOTkgbQorZ3MgMSAtMSBzYyAoMTcpIGNvbDAgc2ggZ3IKKyUgRWxsaXBzZQorbiAzMjAyIDQ1MDcgMTQyIDE0MiAwIDM2MCBEcmF3RWxsaXBzZSBncyBjb2wwIHMgZ3IKKworL0NvdXJpZXItT2JsaXF1ZS1pc28gZmYgMTgwLjAwIHNjZiBzZgorMzA3NiA0NTY4IG0KK2dzIDEgLTEgc2MgKDE5KSBjb2wwIHNoIGdyCislIEVsbGlwc2UKK24gMzE4MSA1MTYxIDE0MiAxNDIgMCAzNjAgRHJhd0VsbGlwc2UgZ3MgY29sMCBzIGdyCisKKy9Db3VyaWVyLU9ibGlxdWUtaXNvIGZmIDE4MC4wMCBzY2Ygc2YKKzMwNTUgNTIyMiBtCitncyAxIC0xIHNjICgxOCkgY29sMCBzaCBncgorJSBFbGxpcHNlCituIDc3MDkgNzk5NiAxNDIgMTQyIDAgMzYwIERyYXdFbGxpcHNlIGdzIGNvbDAgcyBncgorCisvQ291cmllci1PYmxpcXVlLWlzbyBmZiAxODAuMDAgc2NmIHNmCis3NjEyIDgwNDcgbQorZ3MgMSAtMSBzYyAoMjApIGNvbDAgc2ggZ3IKKyUgQXJjCisxNS4wMDAgc2x3CisxIHNsYworZ3MgIGNsaXBwYXRoCisyODk5IDY2NDggbSAyOTIwIDY3NjYgbCAzMjAzIDY3MTYgbCAyOTU3IDY2OTkgbCAzMTgyIDY1OTggbCBjcAorZW9jbGlwCituIDQ4MzcuNSAxNjc0MC4wIDEwMjE1LjYgLTc5LjIgLTEwMC44IGFyY24KK2dzIGNvbDAgcyBncgorIGdyCisKKyUgYXJyb3doZWFkCiswIHNsYworbiAzMTgyIDY1OTggbSAyOTU3IDY2OTkgbCAzMjAzIDY3MTYgbCAzMTgyIDY1OTggbCAgY3AgZ3MgMC4wMCBzZXRncmF5IGVmIGdyICBjb2wwIHMKKyUgQXJjCisxIHNsYworZ3MgIGNsaXBwYXRoCisyOTExIDcxODQgbSAyOTA4IDczMDQgbCAzMTk1IDczMTMgbCAyOTU3IDcyNDYgbCAzMTk4IDcxOTMgbCBjcAorZW9jbGlwCituIDMwMjYuMSA4Mzk5LjggMTE1OS4yIC0xLjUgLTk1LjAgYXJjbgorZ3MgY29sMCBzIGdyCisgZ3IKKworJSBhcnJvd2hlYWQKKzAgc2xjCituIDMxOTggNzE5MyBtIDI5NTcgNzI0NiBsIDMxOTUgNzMxMyBsIDMxOTggNzE5MyBsICBjcCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgIGNvbDAgcworJSBBcmMKKzEgc2xjCitncyAgY2xpcHBhdGgKKzY3NTcgNjYzMSBtIDY3NzIgNjUxMiBsIDY0ODcgNjQ3NyBsIDY3MTggNjU2NiBsIDY0NzIgNjU5NiBsIGNwCitlb2NsaXAKK24gNzY2My4xIC0yMDI4LjggODY0Ny4xIDEyMy42IDk2LjEgYXJjbgorZ3MgY29sMCBzIGdyCisgZ3IKKworJSBhcnJvd2hlYWQKKzAgc2xjCituIDY0NzIgNjU5NiBtIDY3MTggNjU2NiBsIDY0ODcgNjQ3NyBsIDY0NzIgNjU5NiBsICBjcCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgIGNvbDAgcworJSBBcmMKKzEgc2xjCitncyAgY2xpcHBhdGgKKzgzMzYgNzQ5NCBtIDgyNDEgNzQyMSBsIDgwNjYgNzY1MCBsIDgyNjAgNzQ5NiBsIDgxNjIgNzcyMyBsIGNwCitlb2NsaXAKK24gNzcxNy41IDcyMTEuMiA2MTkuMiAxNTUuMyAyNC43IGFyY24KK2dzIGNvbDAgcyBncgorIGdyCisKKyUgYXJyb3doZWFkCiswIHNsYworbiA4MTYyIDc3MjMgbSA4MjYwIDc0OTYgbCA4MDY2IDc2NTAgbCA4MTYyIDc3MjMgbCAgY3AgZ3MgMC4wMCBzZXRncmF5IGVmIGdyICBjb2wwIHMKKyUgUG9seWxpbmUKKzEgc2xjCitncyAgY2xpcHBhdGgKKzMzNjAgMjMxMCBtIDM0ODAgMjMxMCBsIDM0ODAgMjAyMyBsIDM0MjAgMjI2MyBsIDMzNjAgMjAyMyBsIGNwCitlb2NsaXAKK24gMzQyMCAxMzk1IG0KKyAzNDIwIDIyOTUgbCBncyBjb2wwIHMgZ3IgZ3IKKworJSBhcnJvd2hlYWQKKzAgc2xjCituIDMzNjAgMjAyMyBtIDM0MjAgMjI2MyBsIDM0ODAgMjAyMyBsIDMzNjAgMjAyMyBsICBjcCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgIGNvbDAgcworJSBQb2x5bGluZQorMSBzbGMKK2dzICBjbGlwcGF0aAorNDc5NCA0Mzc4IG0gNDg2MCA0Mjc4IGwgNDYyMSA0MTE4IGwgNDc4OCA0MzAyIGwgNDU1NSA0MjE4IGwgY3AKK2VvY2xpcAorbiAzNDY1IDM0MjAgbQorIDQ4MTUgNDMyMCBsIGdzIGNvbDAgcyBnciBncgorCislIGFycm93aGVhZAorMCBzbGMKK24gNDU1NSA0MjE4IG0gNDc4OCA0MzAyIGwgNDYyMSA0MTE4IGwgNDU1NSA0MjE4IGwgIGNwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciAgY29sMCBzCislIFBvbHlsaW5lCisxIHNsYworZ3MgIGNsaXBwYXRoCisxODMwIDYzNjAgbSAxOTUwIDYzNjAgbCAxOTUwIDYwNzMgbCAxODkwIDYzMTMgbCAxODMwIDYwNzMgbCBjcAorZW9jbGlwCituIDE4OTAgNTQ0NSBtCisgMTg5MCA2MzQ1IGwgZ3MgY29sMCBzIGdyIGdyCisKKyUgYXJyb3doZWFkCiswIHNsYworbiAxODMwIDYwNzMgbSAxODkwIDYzMTMgbCAxOTUwIDYwNzMgbCAxODMwIDYwNzMgbCAgY3AgZ3MgMC4wMCBzZXRncmF5IGVmIGdyICBjb2wwIHMKKyUgUG9seWxpbmUKKzEgc2xjCitncyAgY2xpcHBhdGgKKzM2OTkgODQ2NSBtIDM3OTAgODM4NiBsIDM2MDEgODE3MCBsIDM3MTQgODM5MSBsIDM1MTEgODI0OSBsIGNwCitlb2NsaXAKK24gMjgzNSA3MzgwIG0KKyAzNzM1IDg0MTUgbCBncyBjb2wwIHMgZ3IgZ3IKKworJSBhcnJvd2hlYWQKKzAgc2xjCituIDM1MTEgODI0OSBtIDM3MTQgODM5MSBsIDM2MDEgODE3MCBsIDM1MTEgODI0OSBsICBjcCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgIGNvbDAgcworJSBQb2x5bGluZQorMSBzbGMKK2dzICBjbGlwcGF0aAorNDc4NSA1NDc1IG0gNDY2NSA1NDc1IGwgNDY2NSA1NzYyIGwgNDcyNSA1NTIyIGwgNDc4NSA1NzYyIGwgY3AKK2VvY2xpcAorbiA0NzI1IDgzNzAgbQorIDQ3MjUgNTQ5MCBsIGdzIGNvbDAgcyBnciBncgorCislIGFycm93aGVhZAorMCBzbGMKK24gNDc4NSA1NzYyIG0gNDcyNSA1NTIyIGwgNDY2NSA1NzYyIGwgNDc4NSA1NzYyIGwgIGNwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciAgY29sMCBzCislIFBvbHlsaW5lCisxIHNsYworZ3MgIGNsaXBwYXRoCis3Mzk1IDM0MzIgbSA3Mjg3IDMzODAgbCA3MTYyIDM2MzkgbCA3MzIxIDM0NDkgbCA3MjcwIDM2OTEgbCBjcAorZW9jbGlwCituIDQ5NTAgODM3MCBtCisgNzMzNSAzNDIwIGwgZ3MgY29sMCBzIGdyIGdyCisKKyUgYXJyb3doZWFkCiswIHNsYworbiA3MjcwIDM2OTEgbSA3MzIxIDM0NDkgbCA3MTYyIDM2MzkgbCA3MjcwIDM2OTEgbCAgY3AgZ3MgMC4wMCBzZXRncmF5IGVmIGdyICBjb2wwIHMKKyUgUG9seWxpbmUKKzEgc2xjCitncyAgY2xpcHBhdGgKKzY3NjUgNjk5MCBtIDY3NjUgNjg3MCBsIDY0NzggNjg3MCBsIDY3MTggNjkzMCBsIDY0NzggNjk5MCBsIGNwCitlb2NsaXAKK24gMjkyNSA2OTMwIG0KKyA2NzUwIDY5MzAgbCBncyBjb2wwIHMgZ3IgZ3IKKworJSBhcnJvd2hlYWQKKzAgc2xjCituIDY0NzggNjk5MCBtIDY3MTggNjkzMCBsIDY0NzggNjg3MCBsIDY0NzggNjk5MCBsICBjcCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgIGNvbDAgcworJSBQb2x5bGluZQorMSBzbGMKK2dzICBjbGlwcGF0aAorMzk2OSA1Mzg0IG0gMzg4MCA1MzAzIGwgMzY4NiA1NTE1IGwgMzg5MyA1Mzc5IGwgMzc3NCA1NTk2IGwgY3AKK2VvY2xpcAorbiAyODgwIDY0ODAgbQorIDM5MTUgNTM1NSBsIGdzIGNvbDAgcyBnciBncgorCislIGFycm93aGVhZAorMCBzbGMKK24gMzc3NCA1NTk2IG0gMzg5MyA1Mzc5IGwgMzY4NiA1NTE1IGwgMzc3NCA1NTk2IGwgIGNwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciAgY29sMCBzCislIFBvbHlsaW5lCisxIHNsYworZ3MgIGNsaXBwYXRoCis2NzY1IDI4OTUgbSA2NzY1IDI3NzUgbCA2NDc4IDI3NzUgbCA2NzE4IDI4MzUgbCA2NDc4IDI4OTUgbCBjcAorZW9jbGlwCituIDQ1MDAgMjgzNSBtCisgNjc1MCAyODM1IGwgZ3MgY29sMCBzIGdyIGdyCisKKyUgYXJyb3doZWFkCiswIHNsYworbiA2NDc4IDI4OTUgbSA2NzE4IDI4MzUgbCA2NDc4IDI3NzUgbCA2NDc4IDI4OTUgbCAgY3AgZ3MgMC4wMCBzZXRncmF5IGVmIGdyICBjb2wwIHMKKyUgUG9seWxpbmUKKzEgc2xjCitncyAgY2xpcHBhdGgKKzc4MDAgMzQwNSBtIDc2ODAgMzQwNSBsIDc2ODAgMzY5MiBsIDc3NDAgMzQ1MiBsIDc4MDAgMzY5MiBsIGNwCitlb2NsaXAKK24gNzc0MCA2MzQ1IG0KKyA3NzQwIDM0MjAgbCBncyBjb2wwIHMgZ3IgZ3IKKworJSBhcnJvd2hlYWQKKzAgc2xjCituIDc4MDAgMzY5MiBtIDc3NDAgMzQ1MiBsIDc2ODAgMzY5MiBsIDc4MDAgMzY5MiBsICBjcCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgIGNvbDAgcworJSBQb2x5bGluZQorMSBzbGMKK2dzICBjbGlwcGF0aAorMTg0NiA0Mjc2IG0gMTkwOCA0Mzc5IGwgMjE1NCA0MjI5IGwgMTkxOCA0MzAzIGwgMjA5MiA0MTI3IGwgY3AKK2VvY2xpcAorbiAzMzc1IDM0MjAgbQorIDE4OTAgNDMyMCBsIGdzIGNvbDAgcyBnciBncgorCislIGFycm93aGVhZAorMCBzbGMKK24gMjA5MiA0MTI3IG0gMTkxOCA0MzAzIGwgMjE1NCA0MjI5IGwgMjA5MiA0MTI3IGwgIGNwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciAgY29sMCBzCislIFBvbHlsaW5lCisxIHNsYworZ3MgIGNsaXBwYXRoCis2ODkzIDMzNjEgbSA2ODA4IDMyNzYgbCA2NjA0IDM0ODAgbCA2ODE3IDMzNTMgbCA2Njg5IDM1NjUgbCBjcAorZW9jbGlwCituIDU3NjAgNDQxMCBtCisgNjg0MCAzMzMwIGwgZ3MgY29sMCBzIGdyIGdyCisKKyUgYXJyb3doZWFkCiswIHNsYworbiA2Njg5IDM1NjUgbSA2ODE3IDMzNTMgbCA2NjA0IDM0ODAgbCA2Njg5IDM1NjUgbCAgY3AgZ3MgMC4wMCBzZXRncmF5IGVmIGdyICBjb2wwIHMKKyUgUG9seWxpbmUKKzEgc2xjCitncyAgY2xpcHBhdGgKKzQ1MTAgNzk0IG0gNDQ2MSA5MDMgbCA0NzI0IDEwMjAgbCA0NTMwIDg2OCBsIDQ3NzMgOTEwIGwgY3AKK2VvY2xpcAorbiA3NzQwIDIyOTUgbQorIDQ1MDAgODU1IGwgZ3MgY29sMCBzIGdyIGdyCisKKyUgYXJyb3doZWFkCiswIHNsYworbiA0NzczIDkxMCBtIDQ1MzAgODY4IGwgNDcyNCAxMDIwIGwgNDc3MyA5MTAgbCAgY3AgZ3MgMC4wMCBzZXRncmF5IGVmIGdyICBjb2wwIHMKKyUgUG9seWxpbmUKKzEgc2xjCitncyAgY2xpcHBhdGgKKzU3OTEgNTMwMSBtIDU3MDYgNTM4NiBsIDU5MTAgNTU5MCBsIDU3ODMgNTM3OCBsIDU5OTUgNTUwNSBsIGNwCitlb2NsaXAKK24gNjg0MCA2NDM1IG0KKyA1NzYwIDUzNTUgbCBncyBjb2wwIHMgZ3IgZ3IKKworJSBhcnJvd2hlYWQKKzAgc2xjCituIDU5OTUgNTUwNSBtIDU3ODMgNTM3OCBsIDU5MTAgNTU5MCBsIDU5OTUgNTUwNSBsICBjcCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgIGNvbDAgcworJSBQb2x5bGluZQorMSBzbGMKK2dzICBjbGlwcGF0aAorNjg5NSA3NDA4IG0gNjgwNCA3MzI5IGwgNjYxNSA3NTQ1IGwgNjgxOSA3NDA0IGwgNjcwNiA3NjI0IGwgY3AKK2VvY2xpcAorbiA1ODk1IDg0NjAgbQorIDY4NDAgNzM4MCBsIGdzIGNvbDAgcyBnciBncgorCislIGFycm93aGVhZAorMCBzbGMKK24gNjcwNiA3NjI0IG0gNjgxOSA3NDA0IGwgNjYxNSA3NTQ1IGwgNjcwNiA3NjI0IGwgIGNwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciAgY29sMCBzCislIFBvbHlsaW5lCisxIHNsYworZ3MgIGNsaXBwYXRoCiszODQwIDQ3NDAgbSAzODQwIDQ2MjAgbCAzNTUzIDQ2MjAgbCAzNzkzIDQ2ODAgbCAzNTUzIDQ3NDAgbCBjcAorZW9jbGlwCituIDI5MjUgNDY4MCBtCisgMzgyNSA0NjgwIGwgZ3MgY29sMCBzIGdyIGdyCisKKyUgYXJyb3doZWFkCiswIHNsYworbiAzNTUzIDQ3NDAgbSAzNzkzIDQ2ODAgbCAzNTUzIDQ2MjAgbCAzNTUzIDQ3NDAgbCAgY3AgZ3MgMC4wMCBzZXRncmF5IGVmIGdyICBjb2wwIHMKKyUgaGVyZSBlbmRzIGZpZ3VyZTsKKyRGMnBzRW5kCitycworc2hvd3BhZ2UKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9kb2MvZmlwcy1mc20uZmlnIGIvbGliZ2NyeXB0LTEuNC42L2RvYy9maXBzLWZzbS5maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRmMGFlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9kb2MvZmlwcy1mc20uZmlnCkBAIC0wLDAgKzEsMTk5IEBACisjRklHIDMuMgorUG9ydHJhaXQKK0NlbnRlcgorTWV0cmljCitBNCAgICAgIAorMTAwLjAwCitTaW5nbGUKKy0yCisxMjAwIDIKKzAgMzIgIzljMDAwMAorMCAzMyAjOGM4YzhjCiswIDM0ICM4YzhjOGMKKzAgMzUgIzQyNDI0MgorMCAzNiAjOGM4YzhjCiswIDM3ICM0MjQyNDIKKzAgMzggIzhjOGM4YworMCAzOSAjNDI0MjQyCiswIDQwICM4YzhjOGMKKzAgNDEgIzQyNDI0MgorMCA0MiAjOGM4YzhjCiswIDQzICM0MjQyNDIKKzYgOTAwIDI3MCA4Nzc1IDk0NTAKKzUgMSAwIDIgMCA3IDUwIC0xIC0xIDAuMDAwIDEgMSAxIDAgNDgzNy41MDAgMTY3NDAuMDAwIDY3NTAgNjcwNSA0NzI1IDY1MjUgMjkyNSA2NzA1CisJMSAxIDIuMDAgMTIwLjAwIDI0MC4wMAorNSAxIDAgMiAwIDcgNTAgLTEgLTEgMC4wMDAgMSAxIDEgMCAzMDI2LjEzOCA4Mzk5LjgyNSA0MTg1IDgzNzAgMzg3MCA3NjA1IDI5MjUgNzI0NQorCTEgMSAyLjAwIDEyMC4wMCAyNDAuMDAKKzUgMSAwIDIgMCA3IDUwIC0xIC0xIDAuMDAwIDEgMSAxIDAgNzY2My4xMjUgLTIwMjguNzUwIDI4ODAgNTE3NSA0NzcwIDYxMjAgNjc1MCA2NTcwCisJMSAxIDIuMDAgMTIwLjAwIDI0MC4wMAorNSAxIDAgMiAwIDcgNTAgLTEgLTEgMC4wMDAgMSAxIDEgMCA3NzE3LjUwMCA3MjExLjI1MCA3MTU1IDc0NzAgNzc0MCA3ODMwIDgyODAgNzQ3MAorCTEgMSAyLjAwIDEyMC4wMCAyNDAuMDAKKzYgMzA5NiAxNTkzIDMzODAgMTg3NworMSAzIDAgMSAwIDcgNTAgLTEgLTEgMC4wMDAgMSAwLjAwMDAgMzIzOCAxNzM1IDE0MiAxNDIgMzIzOCAxNzM1IDMxMDMgMTY5MAorNCAwIDAgNTAgLTEgMTMgMTIgMC4wMDAwIDQgMTA1IDEwNSAzMTU3IDE4MDUgMVwwMDEKKy02Cis2IDIyNjYgMzYwNyAyNTUwIDM4OTEKKzEgMyAwIDEgMCA3IDUwIC0xIC0xIDAuMDAwIDEgMC4wMDAwIDI0MDggMzc0OSAxNDIgMTQyIDI0MDggMzc0OSAyMjczIDM3MDQKKzQgMCAwIDUwIC0xIDEzIDEyIDAuMDAwMCA0IDEwNSAxMDUgMjMyNyAzODE5IDJcMDAxCistNgorNiAxNTY2IDU2NjcgMTg1MCA1OTUxCisxIDMgMCAxIDAgNyA1MCAtMSAtMSAwLjAwMCAxIDAuMDAwMCAxNzA4IDU4MDkgMTQyIDE0MiAxNzA4IDU4MDkgMTU3MyA1NzY0Cis0IDAgMCA1MCAtMSAxMyAxMiAwLjAwMDAgNCAxMDUgMTA1IDE2MjcgNTg3OSAzXDAwMQorLTYKKzYgNTcwNiAxNTQzIDU5OTAgMTgyNworMSAzIDAgMSAwIDcgNTAgLTEgLTEgMC4wMDAgMSAwLjAwMDAgNTg0OCAxNjg1IDE0MiAxNDIgNTg0OCAxNjg1IDU3MTMgMTY0MAorNCAwIDAgNTAgLTEgMTMgMTIgMC4wMDAwIDQgMTA1IDEwNSA1NzY3IDE3NTUgNlwwMDEKKy02Cis2IDU5ODYgNzc1NyA2MjcwIDgwNDEKKzEgMyAwIDEgMCA3IDUwIC0xIC0xIDAuMDAwIDEgMC4wMDAwIDYxMjggNzg5OSAxNDIgMTQyIDYxMjggNzg5OSA1OTkzIDc4NTQKKzQgMCAwIDUwIC0xIDEzIDEyIDAuMDAwMCA0IDEwNSAxMDUgNjA0NyA3OTY5IDdcMDAxCistNgorNiA3NDI2IDQ3NDcgNzcxMCA1MDMxCisxIDMgMCAxIDAgNyA1MCAtMSAtMSAwLjAwMCAxIDAuMDAwMCA3NTY4IDQ4ODkgMTQyIDE0MiA3NTY4IDQ4ODkgNzQzMyA0ODQ0Cis0IDAgMCA1MCAtMSAxMyAxMiAwLjAwMDAgNCAxMDUgMTA1IDc0ODcgNDk1OSA4XDAwMQorLTYKKzYgNTg2NiAzNzM3IDYxNTAgNDAyMQorMSAzIDAgMSAwIDcgNTAgLTEgLTEgMC4wMDAgMSAwLjAwMDAgNjAwOCAzODc5IDE0MiAxNDIgNjAwOCAzODc5IDU4NzMgMzgzNAorNCAwIDAgNTAgLTEgMTMgMTIgMC4wMDAwIDQgMTA1IDIxMCA1ODgyIDM5NDAgMTBcMDAxCistNgorNiA1Mjc2IDI1MTcgNTU2MCAyODAxCisxIDMgMCAxIDAgNyA1MCAtMSAtMSAwLjAwMCAxIDAuMDAwMCA1NDE4IDI2NTkgMTQyIDE0MiA1NDE4IDI2NTkgNTI4MyAyNjE0Cis0IDAgMCA1MCAtMSAxMyAxMiAwLjAwMDAgNCAxMDUgMjEwIDUyOTIgMjcyMCAxMVwwMDEKKy02Cis2IDQxMjYgMzU3MyA0NDEwIDM4NTcKKzEgMyAwIDEgMCA3IDUwIC0xIC0xIDAuMDAwIDEgMC4wMDAwIDQyNjggMzcxNSAxNDIgMTQyIDQyNjggMzcxNSA0MTMzIDM2NzAKKzQgMCAwIDUwIC0xIDEzIDEyIDAuMDAwMCA0IDEwNSAyMTAgNDE0MiAzNzc2IDEyXDAwMQorLTYKKzYgMzA2NiA1NzIzIDMzNTAgNjAwNworMSAzIDAgMSAwIDcgNTAgLTEgLTEgMC4wMDAgMSAwLjAwMDAgMzIwOCA1ODY1IDE0MiAxNDIgMzIwOCA1ODY1IDMwNzMgNTgyMAorNCAwIDAgNTAgLTEgMTMgMTIgMC4wMDAwIDQgMTA1IDIxMCAzMDgyIDU5MjYgMTNcMDAxCistNgorNiA0MDM2IDY2MjMgNDMyMCA2OTA3CisxIDMgMCAxIDAgNyA1MCAtMSAtMSAwLjAwMCAxIDAuMDAwMCA0MTc4IDY3NjUgMTQyIDE0MiA0MTc4IDY3NjUgNDA0MyA2NzIwCis0IDAgMCA1MCAtMSAxMyAxMiAwLjAwMDAgNCAxMDUgMjEwIDQwNTIgNjgyNiAxNFwwMDEKKy02Cis2IDQ0MTYgNzIxMyA0NzAwIDc0OTcKKzEgMyAwIDEgMCA3IDUwIC0xIC0xIDAuMDAwIDEgMC4wMDAwIDQ1NTggNzM1NSAxNDIgMTQyIDQ1NTggNzM1NSA0NDIzIDczMTAKKzQgMCAwIDUwIC0xIDEzIDEyIDAuMDAwMCA0IDEwNSAyMTAgNDQzMiA3NDE2IDE1XDAwMQorLTYKKzYgNTA2NiA3MjIzIDUzNTAgNzUwNworMSAzIDAgMSAwIDcgNTAgLTEgLTEgMC4wMDAgMSAwLjAwMDAgNTIwOCA3MzY1IDE0MiAxNDIgNTIwOCA3MzY1IDUwNzMgNzMyMAorNCAwIDAgNTAgLTEgMTMgMTIgMC4wMDAwIDQgMTA1IDEwNSA1MTI3IDc0MzUgNVwwMDEKKy02Cis2IDM1NjYgNzU3MyAzODUwIDc4NTcKKzEgMyAwIDEgMCA3IDUwIC0xIC0xIDAuMDAwIDEgMC4wMDAwIDM3MDggNzcxNSAxNDIgMTQyIDM3MDggNzcxNSAzNTczIDc2NzAKKzQgMCAwIDUwIC0xIDEzIDEyIDAuMDAwMCA0IDEwNSAyMTAgMzU4MiA3Nzc2IDE2XDAwMQorLTYKKzYgMjg5NiA3NzgzIDMxODAgODA2NworMSAzIDAgMSAwIDcgNTAgLTEgLTEgMC4wMDAgMSAwLjAwMDAgMzAzOCA3OTI1IDE0MiAxNDIgMzAzOCA3OTI1IDI5MDMgNzg4MAorNCAwIDAgNTAgLTEgMTMgMTIgMC4wMDAwIDQgMTA1IDEwNSAyOTU3IDc5OTUgNFwwMDEKKy02Cis2IDY0MjYgNTc1MyA2NzEwIDYwMzcKKzEgMyAwIDEgMCA3IDUwIC0xIC0xIDAuMDAwIDEgMC4wMDAwIDY1NjggNTg5NSAxNDIgMTQyIDY1NjggNTg5NSA2NDMzIDU4NTAKKzQgMCAwIDUwIC0xIDEzIDEyIDAuMDAwMCA0IDEwNSAxMDUgNjQ4NyA1OTY1IDlcMDAxCistNgorNiAzNjAwIDgzNzAgNTk4NSA5NDUwCisyIDQgMCAxIDAgNyA1MCAtMSAtMSAwLjAwMCAwIDAgMjAgMCAwIDUKKwkgNTk3MCA5NDUwIDM2MDAgOTQ1MCAzNjAwIDgzNzAgNTk3MCA4MzcwIDU5NzAgOTQ1MAorNCAwIDAgNTAgLTEgMCAyNCAwLjAwMDAgNCAzMzAgMTcyNSAzODcwIDkwMDAgT3BlcmF0aW9uYWxcMDAxCistNgorNiA5MDAgNDMyMCAyOTcwIDU0NDUKKzIgNCAwIDEgMCA3IDUwIC0xIC0xIDAuMDAwIDAgMCAyMCAwIDAgNQorCSAyOTQwIDU0NDUgOTE1IDU0NDUgOTE1IDQzMzUgMjk0MCA0MzM1IDI5NDAgNTQ0NQorNCAwIDAgNTAgLTEgMCAyNCAwLjAwMDAgNCAyNDAgNTEwIDE2MjAgNDk5NSBJbml0XDAwMQorLTYKKzYgOTAwIDYzNDUgMjk3MCA3NDcwCisyIDQgMCAxIDAgNyA1MCAtMSAtMSAwLjAwMCAwIDAgMjAgMCAwIDUKKwkgMjk1NSA3NDU1IDkzMCA3NDU1IDkzMCA2MzQ1IDI5NTUgNjM0NSAyOTU1IDc0NTUKKzQgMCAwIDUwIC0xIDAgMjQgMC4wMDAwIDQgMjU1IDEzMzUgMTIxNSA3MDIwIFNlbGYtVGVzdFwwMDEKKy02Cis2IDY3NTAgNjM0NSA4Nzc1IDc0NzAKKzIgNCAwIDEgMCA3IDUwIC0xIC0xIDAuMDAwIDAgMCAyMCAwIDAgNQorCSA4Nzc1IDc0NzAgNjc1MCA3NDcwIDY3NTAgNjM2MCA4Nzc1IDYzNjAgODc3NSA3NDcwCis0IDAgMCA1MCAtMSAwIDI0IDAuMDAwMCA0IDI0MCA3NjUgNzMzNSA3MDIwIEVycm9yXDAwMQorLTYKKzYgMzgyNSA0MzIwIDU4NTAgNTQ0NQorMiA0IDAgMSAwIDcgNTAgLTEgLTEgMC4wMDAgMCAwIDIwIDAgMCA1CisJIDU4NTAgNTQ0NSAzODI1IDU0NDUgMzgyNSA0MzM1IDU4NTAgNDMzNSA1ODUwIDU0NDUKKzQgMCAwIDUwIC0xIDAgMjQgMC4wMDAwIDQgMjU1IDE2MjAgMzkxNSA0OTk1IEZhdGFsLUVycm9yXDAwMQorLTYKKzYgNjc1MCAyMjk1IDg3NzUgMzQyMAorMiA0IDAgMSAwIDcgNTAgLTEgLTEgMC4wMDAgMCAwIDIwIDAgMCA1CisJIDg3NzUgMzQyMCA2NzUwIDM0MjAgNjc1MCAyMzEwIDg3NzUgMjMxMCA4Nzc1IDM0MjAKKzQgMCAwIDUwIC0xIDAgMjQgMC4wMDAwIDQgMjQwIDE0NTUgNjkzMCAyOTcwIFNodXRkb3duXDAwMQorLTYKKzYgMjQ3NSAyMjk1IDQ1MDAgMzQyMAorMiA0IDAgMSAwIDcgNTAgLTEgLTEgMC4wMDAgMCAwIDIwIDAgMCA1CisJIDQ1MDAgMzQwNSAyNDc1IDM0MDUgMjQ3NSAyMjk1IDQ1MDAgMjI5NSA0NTAwIDM0MDUKKzQgMCAwIDUwIC0xIDAgMjQgMC4wMDAwIDQgMjQwIDE0NzAgMjY1NSAyOTcwIFBvd2VyLU9uXDAwMQorLTYKKzYgMjQ3NSAyNzAgNDUwMCAxMzk1CisyIDQgMCAxIDAgNyA1MCAtMSAtMSAwLjAwMCAwIDAgMjAgMCAwIDUKKwkgNDUwMCAxMzk1IDI0NzUgMTM5NSAyNDc1IDI4NSA0NTAwIDI4NSA0NTAwIDEzOTUKKzQgMCAwIDUwIC0xIDAgMjQgMC4wMDAwIDQgMjQwIDE1MzAgMjU2NSA5NDUgUG93ZXItT2ZmXDAwMQorLTYKKzYgNDA1MCA2MTk2IDQzMzQgNjQ4MAorMSAzIDAgMSAwIDcgNTAgLTEgLTEgMC4wMDAgMSAwLjAwMDAgNDE5MiA2MzM4IDE0MiAxNDIgNDE5MiA2MzM4IDQwNTcgNjI5MworNCAwIDAgNTAgLTEgMTMgMTIgMC4wMDAwIDQgMTA1IDIxMCA0MDY2IDYzOTkgMTdcMDAxCistNgorNiAzMDUzIDQzNTggMzM1MSA0NjU2CisxIDMgMCAxIDAgNyA1MCAtMSAtMSAwLjAwMCAxIDAuMDAwMCAzMjAyIDQ1MDcgMTQyIDE0MiAzMjAyIDQ1MDcgMzA2NyA0NDYyCis0IDAgMCA1MCAtMSAxMyAxMiAwLjAwMDAgNCAxMDUgMjEwIDMwNzYgNDU2OCAxOVwwMDEKKy02Cis2IDMwMzIgNTAxMiAzMzMwIDUzMTAKKzEgMyAwIDEgMCA3IDUwIC0xIC0xIDAuMDAwIDEgMC4wMDAwIDMxODEgNTE2MSAxNDIgMTQyIDMxODEgNTE2MSAzMDQ2IDUxMTYKKzQgMCAwIDUwIC0xIDEzIDEyIDAuMDAwMCA0IDEwNSAyMTAgMzA1NSA1MjIyIDE4XDAwMQorLTYKKzYgNzU2MCA3ODQ3IDc4NTggODE0NQorMSAzIDAgMSAwIDcgNTAgLTEgLTEgMC4wMDAgMSAwLjAwMDAgNzcwOSA3OTk2IDE0MiAxNDIgNzcwOSA3OTk2IDc1NzQgNzk1MQorNCAwIDAgNTAgLTEgMTMgMTIgMC4wMDAwIDQgMTA1IDIxMCA3NjEyIDgwNDcgMjBcMDAxCistNgorMiAxIDAgMiAwIDcgNTAgLTEgLTEgMC4wMDAgMCAxIC0xIDEgMCAyCisJMSAxIDIuMDAgMTIwLjAwIDI0MC4wMAorCSAzNDIwIDEzOTUgMzQyMCAyMjk1CisyIDEgMCAyIDAgNyA1MCAtMSAtMSAwLjAwMCAwIDEgLTEgMSAwIDIKKwkxIDEgMi4wMCAxMjAuMDAgMjQwLjAwCisJIDM0NjUgMzQyMCA0ODE1IDQzMjAKKzIgMSAwIDIgMCA3IDUwIC0xIC0xIDAuMDAwIDAgMSAtMSAxIDAgMgorCTEgMSAyLjAwIDEyMC4wMCAyNDAuMDAKKwkgMTg5MCA1NDQ1IDE4OTAgNjM0NQorMiAxIDAgMiAwIDcgNTAgLTEgLTEgMC4wMDAgMCAxIC0xIDEgMCAyCisJMSAxIDIuMDAgMTIwLjAwIDI0MC4wMAorCSAyODM1IDczODAgMzczNSA4NDE1CisyIDEgMCAyIDAgNyA1MCAtMSAtMSAwLjAwMCAwIDEgLTEgMSAwIDIKKwkxIDEgMi4wMCAxMjAuMDAgMjQwLjAwCisJIDQ3MjUgODM3MCA0NzI1IDU0OTAKKzIgMSAwIDIgMCA3IDUwIC0xIC0xIDAuMDAwIDAgMSAtMSAxIDAgMgorCTEgMSAyLjAwIDEyMC4wMCAyNDAuMDAKKwkgNDk1MCA4MzcwIDczMzUgMzQyMAorMiAxIDAgMiAwIDcgNTAgLTEgLTEgMC4wMDAgMCAxIC0xIDEgMCAyCisJMSAxIDIuMDAgMTIwLjAwIDI0MC4wMAorCSAyOTI1IDY5MzAgNjc1MCA2OTMwCisyIDEgMCAyIDAgNyA1MCAtMSAtMSAwLjAwMCAwIDEgLTEgMSAwIDIKKwkxIDEgMi4wMCAxMjAuMDAgMjQwLjAwCisJIDI4ODAgNjQ4MCAzOTE1IDUzNTUKKzIgMSAwIDIgMCA3IDUwIC0xIC0xIDAuMDAwIDAgMSAtMSAxIDAgMgorCTEgMSAyLjAwIDEyMC4wMCAyNDAuMDAKKwkgNDUwMCAyODM1IDY3NTAgMjgzNQorMiAxIDAgMiAwIDcgNTAgLTEgLTEgMC4wMDAgMCAxIC0xIDEgMCAyCisJMSAxIDIuMDAgMTIwLjAwIDI0MC4wMAorCSA3NzQwIDYzNDUgNzc0MCAzNDIwCisyIDEgMCAyIDAgNyA1MCAtMSAtMSAwLjAwMCAwIDEgLTEgMSAwIDIKKwkxIDEgMi4wMCAxMjAuMDAgMjQwLjAwCisJIDMzNzUgMzQyMCAxODkwIDQzMjAKKzIgMSAwIDIgMCA3IDUwIC0xIC0xIDAuMDAwIDAgMSAtMSAxIDAgMgorCTEgMSAyLjAwIDEyMC4wMCAyNDAuMDAKKwkgNTc2MCA0NDEwIDY4NDAgMzMzMAorMiAxIDAgMiAwIDcgNTAgLTEgLTEgMC4wMDAgMCAxIC0xIDEgMCAyCisJMSAxIDIuMDAgMTIwLjAwIDI0MC4wMAorCSA3NzQwIDIyOTUgNDUwMCA4NTUKKzIgMSAwIDIgMCA3IDUwIC0xIC0xIDAuMDAwIDAgMSAtMSAxIDAgMgorCTEgMSAyLjAwIDEyMC4wMCAyNDAuMDAKKwkgNjg0MCA2NDM1IDU3NjAgNTM1NQorMiAxIDAgMiAwIDcgNTAgLTEgLTEgMC4wMDAgMCAxIC0xIDEgMCAyCisJMSAxIDIuMDAgMTIwLjAwIDI0MC4wMAorCSA1ODk1IDg0NjAgNjg0MCA3MzgwCisyIDEgMCAyIDAgNyA1MCAtMSAtMSAwLjAwMCAwIDEgLTEgMSAwIDIKKwkxIDEgMi4wMCAxMjAuMDAgMjQwLjAwCisJIDI5MjUgNDY4MCAzODI1IDQ2ODAKKy02CmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvZG9jL2ZpcHMtZnNtLnBkZiBiL2xpYmdjcnlwdC0xLjQuNi9kb2MvZmlwcy1mc20ucGRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYTAwYWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvZG9jL2ZpcHMtZnNtLnBkZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvZG9jL2ZpcHMtZnNtLnBuZyBiL2xpYmdjcnlwdC0xLjQuNi9kb2MvZmlwcy1mc20ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYTI0NDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvZG9jL2ZpcHMtZnNtLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvZG9jL2djcnlwdC5pbmZvIGIvbGliZ2NyeXB0LTEuNC42L2RvYy9nY3J5cHQuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzZjNmVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L2RvYy9nY3J5cHQuaW5mbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvZG9jL2djcnlwdC50ZXhpIGIvbGliZ2NyeXB0LTEuNC42L2RvYy9nY3J5cHQudGV4aQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjk5M2RmCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L2RvYy9nY3J5cHQudGV4aQpAQCAtMCwwICsxLDU4NjcgQEAKK1xpbnB1dCB0ZXhpbmZvICAgICAgICAgICAgICAgICAgQGMgLSotIFRleGluZm8gLSotCitAYyAlKipzdGFydCBvZiBoZWFkZXIKK0BzZXRmaWxlbmFtZSBnY3J5cHQuaW5mbworQGluY2x1ZGUgdmVyc2lvbi50ZXhpCitAc2V0dGl0bGUgVGhlIExpYmdjcnlwdCBSZWZlcmVuY2UgTWFudWFsCitAYyBVbmlmeSBzb21lIG9mIHRoZSBpbmRpY2VzLgorQHN5bmNvZGVpbmRleCB0cCBmbgorQHN5bmNvZGVpbmRleCBwZyBmbgorQGMgJSoqZW5kIG9mIGhlYWRlcgorQGNvcHlpbmcKK1RoaXMgbWFudWFsIGlzIGZvciBMaWJnY3J5cHQKKyh2ZXJzaW9uIEB2YWx1ZXtWRVJTSU9OfSwgQHZhbHVle1VQREFURUR9KSwKK3doaWNoIGlzIEdOVSdzIGxpYnJhcnkgb2YgY3J5cHRvZ3JhcGhpYyBidWlsZGluZyBibG9ja3MuCisKK0NvcHlyaWdodCBAY29weXJpZ2h0e30gMjAwMCwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworQHF1b3RhdGlvbgorUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGlzIGRvY3VtZW50Cit1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK29wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIFRoZSB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBpbiB0aGUKK3NlY3Rpb24gZW50aXRsZWQgYGBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZScnLgorQGVuZCBxdW90YXRpb24KK0BlbmQgY29weWluZworCitAZGlyY2F0ZWdvcnkgR05VIExpYnJhcmllcworQGRpcmVudHJ5CisqIGxpYmdjcnlwdDogKGdjcnlwdCkuICBDcnlwdG9ncmFwaGljIGZ1bmN0aW9uIGxpYnJhcnkuCitAZW5kIGRpcmVudHJ5CisKKworCitAYworQGMgVGl0bGVwYWdlCitAYworQHNldGNoYXB0ZXJuZXdwYWdlIG9kZAorQHRpdGxlcGFnZQorQHRpdGxlIFRoZSBMaWJnY3J5cHQgUmVmZXJlbmNlIE1hbnVhbAorQHN1YnRpdGxlIFZlcnNpb24gQHZhbHVle1ZFUlNJT059CitAc3VidGl0bGUgQHZhbHVle1VQREFURUR9CitAYXV0aG9yIFdlcm5lciBLb2NoIChAZW1haWx7d2tAQGdudXBnLm9yZ30pCitAYXV0aG9yIE1vcml0eiBTY2h1bHRlIChAZW1haWx7bW9AQGcxMGNvZGUuY29tfSkKKworQHBhZ2UKK0B2c2tpcCAwcHQgcGx1cyAxZmlsbGwKK0BpbnNlcnRjb3B5aW5nCitAZW5kIHRpdGxlcGFnZQorCitAaWZub3RodG1sCitAc3VtbWFyeWNvbnRlbnRzCitAY29udGVudHMKK0BwYWdlCitAZW5kIGlmbm90aHRtbAorCisKK0BpZm5vdHRleAorQG5vZGUgVG9wCitAdG9wIFRoZSBMaWJnY3J5cHQgTGlicmFyeQorQGluc2VydGNvcHlpbmcKK0BlbmQgaWZub3R0ZXgKKworCitAbWVudQorKiBJbnRyb2R1Y3Rpb246OiAgICAgICAgICAgICAgICAgV2hhdCBpcyBMaWJnY3J5cHQuCisqIFByZXBhcmF0aW9uOjogICAgICAgICAgICAgICAgICBXaGF0IHlvdSBzaG91bGQgZG8gYmVmb3JlIHVzaW5nIHRoZSBsaWJyYXJ5LgorKiBHZW5lcmFsaXRpZXM6OiAgICAgICAgICAgICAgICAgR2VuZXJhbCBsaWJyYXJ5IGZ1bmN0aW9ucyBhbmQgZGF0YSB0eXBlcy4KKyogSGFuZGxlciBGdW5jdGlvbnM6OiAgICAgICAgICAgIFdvcmtpbmcgd2l0aCBoYW5kbGVyIGZ1bmN0aW9ucy4KKyogU3ltbWV0cmljIGNyeXB0b2dyYXBoeTo6ICAgICAgIEhvdyB0byB1c2Ugc3ltbWV0cmljIGNyeXB0b2dyYXBoeS4KKyogUHVibGljIEtleSBjcnlwdG9ncmFwaHk6OiAgICAgIEhvdyB0byB1c2UgcHVibGljIGtleSBjcnlwdG9ncmFwaHkuCisqIEhhc2hpbmc6OiAgICAgICAgICAgICAgICAgICAgICBIb3cgdG8gdXNlIGhhc2ggYW5kIE1BQyBhbGdvcml0aG1zLgorKiBSYW5kb20gTnVtYmVyczo6ICAgICAgICAgICAgICAgSG93IHRvIHdvcmsgd2l0aCByYW5kb20gbnVtYmVycy4KKyogUy1leHByZXNzaW9uczo6ICAgICAgICAgICAgICAgIEhvdyB0byBtYW5hZ2UgUy1leHByZXNzaW9ucy4KKyogTVBJIGxpYnJhcnk6OiAgICAgICAgICAgICAgICAgIEhvdyB0byB3b3JrIHdpdGggbXVsdGktcHJlY2lzaW9uLWludGVnZXJzLgorKiBQcmltZSBudW1iZXJzOjogICAgICAgICAgICAgICAgSG93IHRvIHVzZSB0aGUgUHJpbWUgbnVtYmVyIHJlbGF0ZWQgZnVuY3Rpb25zLgorKiBVdGlsaXRpZXM6OiAgICAgICAgICAgICAgICAgICAgVXRpbGl0eSBmdW5jdGlvbnMuCisqIEFyY2hpdGVjdHVyZTo6ICAgICAgICAgICAgICAgICBIb3cgTGliZ2NyeXB0IHdvcmtzIGludGVybmFsbHkuCisKK0FwcGVuZGljZXMKKworKiBTZWxmLVRlc3RzOjogICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiBvZiB0aGUgc2VsZi10ZXN0cy4KKyogRklQUyBNb2RlOjogICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gb2YgdGhlIEZJUFMgbW9kZS4KKyogTGlicmFyeSBDb3B5aW5nOjogICAgICAgICAgICAgVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXlzIGhvdyB5b3UgY2FuIGNvcHkgYW5kIHNoYXJlIExpYmdjcnlwdC4KKyogQ29weWluZzo6ICAgICAgICAgICAgICAgICAgICAgVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHNheXMgaG93IHlvdQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gY29weSBhbmQgc2hhcmUgc29tZSBwYXJ0cyBvZiBMaWJnY3J5cHQuCisKK0luZGljZXMKKworKiBGaWd1cmVzIGFuZCBUYWJsZXM6OiAgICAgICAgICBJbmRleCBvZiBmaWd1cmVzIGFuZCB0YWJsZXMuCisqIENvbmNlcHQgSW5kZXg6OiAgICAgICAgICAgICAgIEluZGV4IG9mIGNvbmNlcHRzIGFuZCBwcm9ncmFtcy4KKyogRnVuY3Rpb24gYW5kIERhdGEgSW5kZXg6OiAgICAgSW5kZXggb2YgZnVuY3Rpb25zLCB2YXJpYWJsZXMgYW5kIGRhdGEgdHlwZXMuCisKK0BlbmQgbWVudQorCitAaWZodG1sCitAcGFnZQorQHN1bW1hcnljb250ZW50cworQGNvbnRlbnRzCitAZW5kIGlmaHRtbAorCisKK0BjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0BjICoqKioqKioqKioqKioqKioqKiogIEludHJvZHVjdGlvbiAgKioqKioqKioqKioqKioqKioqKioqKioKK0BjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Bub2RlIEludHJvZHVjdGlvbgorQGNoYXB0ZXIgSW50cm9kdWN0aW9uCisKK0xpYmdjcnlwdCBpcyBhIGxpYnJhcnkgcHJvdmlkaW5nIGNyeXB0b2dyYXBoaWMgYnVpbGRpbmcgYmxvY2tzLgorCitAbWVudQorKiBHZXR0aW5nIFN0YXJ0ZWQ6OiAgICAgICAgICAgICBIb3cgdG8gdXNlIHRoaXMgbWFudWFsLgorKiBGZWF0dXJlczo6ICAgICAgICAgICAgICAgICAgICBBIGdsYW5jZSBhdCBMaWJnY3J5cHQncyBmZWF0dXJlcy4KKyogT3ZlcnZpZXc6OiAgICAgICAgICAgICAgICAgICAgT3ZlcnZpZXcgYWJvdXQgdGhlIGxpYnJhcnkuCitAZW5kIG1lbnUKKworQG5vZGUgR2V0dGluZyBTdGFydGVkCitAc2VjdGlvbiBHZXR0aW5nIFN0YXJ0ZWQKKworVGhpcyBtYW51YWwgZG9jdW1lbnRzIHRoZSBMaWJnY3J5cHQgbGlicmFyeSBhcHBsaWNhdGlvbiBwcm9ncmFtbWluZworaW50ZXJmYWNlIChBUEkpLiAgQWxsIGZ1bmN0aW9ucyBhbmQgZGF0YSB0eXBlcyBwcm92aWRlZCBieSB0aGUgbGlicmFyeQorYXJlIGV4cGxhaW5lZC4KKworQG5vaW5kZW50CitUaGUgcmVhZGVyIGlzIGFzc3VtZWQgdG8gcG9zc2VzcyBiYXNpYyBrbm93bGVkZ2UgYWJvdXQgYXBwbGllZAorY3J5cHRvZ3JhcGh5LgorCitUaGlzIG1hbnVhbCBjYW4gYmUgdXNlZCBpbiBzZXZlcmFsIHdheXMuICBJZiByZWFkIGZyb20gdGhlIGJlZ2lubmluZwordG8gdGhlIGVuZCwgaXQgZ2l2ZXMgYSBnb29kIGludHJvZHVjdGlvbiBpbnRvIHRoZSBsaWJyYXJ5IGFuZCBob3cgaXQKK2NhbiBiZSB1c2VkIGluIGFuIGFwcGxpY2F0aW9uLiAgRm9yd2FyZCByZWZlcmVuY2VzIGFyZSBpbmNsdWRlZCB3aGVyZQorbmVjZXNzYXJ5LiAgTGF0ZXIgb24sIHRoZSBtYW51YWwgY2FuIGJlIHVzZWQgYXMgYSByZWZlcmVuY2UgbWFudWFsIHRvCitnZXQganVzdCB0aGUgaW5mb3JtYXRpb24gbmVlZGVkIGFib3V0IGFueSBwYXJ0aWN1bGFyIGludGVyZmFjZSBvZiB0aGUKK2xpYnJhcnkuICBFeHBlcmllbmNlZCBwcm9ncmFtbWVycyBtaWdodCB3YW50IHRvIHN0YXJ0IGxvb2tpbmcgYXQgdGhlCitleGFtcGxlcyBhdCB0aGUgZW5kIG9mIHRoZSBtYW51YWwsIGFuZCB0aGVuIG9ubHkgcmVhZCB1cCB0aG9zZSBwYXJ0cworb2YgdGhlIGludGVyZmFjZSB3aGljaCBhcmUgdW5jbGVhci4KKworCitAbm9kZSBGZWF0dXJlcworQHNlY3Rpb24gRmVhdHVyZXMKKworTGliZ2NyeXB0IG1pZ2h0IGhhdmUgYSBjb3VwbGUgb2YgYWR2YW50YWdlcyBvdmVyIG90aGVyIGxpYnJhcmllcyBkb2luZworYSBzaW1pbGFyIGpvYi4KKworQHRhYmxlIEBhc2lzCitAaXRlbSBJdCdzIEZyZWUgU29mdHdhcmUKK0FueWJvZHkgY2FuIHVzZSwgbW9kaWZ5LCBhbmQgcmVkaXN0cmlidXRlIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCitMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoQHB4cmVme0xpYnJhcnkgQ29weWluZ30pLiAgTm90ZSwgdGhhdAorc29tZSBwYXJ0cyAod2hpY2ggYXJlIGluIGdlbmVyYWwgbm90IG5lZWRlZCBieSBhcHBsaWNhdGlvbnMpIGFyZSBzdWJqZWN0Cit0byB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChAcHhyZWZ7Q29weWluZ30pOyBwbGVhc2UKK3NlZSB0aGUgUkVBRE1FIGZpbGUgb2YgdGhlIGRpc3RyaWJ1dGlvbiBmb3Igb2YgbGlzdCBvZiB0aGVzZSBwYXJ0cy4KKworQGl0ZW0gSXQgZW5jYXBzdWxhdGVzIHRoZSBsb3cgbGV2ZWwgY3J5cHRvZ3JhcGh5CitMaWJnY3J5cHQgcHJvdmlkZXMgYSBoaWdoIGxldmVsIGludGVyZmFjZSB0byBjcnlwdG9ncmFwaGljCitidWlsZGluZyBibG9ja3MgdXNpbmcgYW4gZXh0ZW5zaWJsZSBhbmQgZmxleGlibGUgQVBJLgorCitAZW5kIHRhYmxlCisKK0Bub2RlIE92ZXJ2aWV3CitAc2VjdGlvbiBPdmVydmlldworCitAbm9pbmRlbnQKK1RoZSBMaWJnY3J5cHQgbGlicmFyeSBpcyBmdWxseSB0aHJlYWQtc2FmZSwgd2hlcmUgaXQgbWFrZXMKK3NlbnNlIHRvIGJlIHRocmVhZC1zYWZlLiAgTm90IHRocmVhZC1zYWZlIGFyZSBzb21lIGNyeXB0b2dyYXBoaWMKK2Z1bmN0aW9ucyB0aGF0IG1vZGlmeSBhIGNlcnRhaW4gY29udGV4dCBzdG9yZWQgaW4gaGFuZGxlcy4gIElmIHRoZQordXNlciByZWFsbHkgaW50ZW50cyB0byB1c2Ugc3VjaCBmdW5jdGlvbnMgZnJvbSBkaWZmZXJlbnQgdGhyZWFkcyBvbgordGhlIHNhbWUgaGFuZGxlLCBoZSBoYXMgdG8gdGFrZSBjYXJlIG9mIHRoZSBzZXJpYWxpemF0aW9uIG9mIHN1Y2gKK2Z1bmN0aW9ucyBoaW1zZWxmLiAgSWYgbm90IGRlc2NyaWJlZCBvdGhlcndpc2UsIGV2ZXJ5IGZ1bmN0aW9uIGlzCit0aHJlYWQtc2FmZS4KKworTGliZ2NyeXB0IGRlcGVuZHMgb24gdGhlIGxpYnJhcnkgYGxpYmdwZy1lcnJvcicsIHdoaWNoCitjb250YWlucyBjb21tb24gZXJyb3IgaGFuZGxpbmcgcmVsYXRlZCBjb2RlIGZvciBHbnVQRyBjb21wb25lbnRzLgorCitAYyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitAYyAqKioqKioqKioqKioqKioqKioqICBQcmVwYXJhdGlvbiAgKioqKioqKioqKioqKioqKioqKioqKioqCitAYyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitAbm9kZSBQcmVwYXJhdGlvbgorQGNoYXB0ZXIgUHJlcGFyYXRpb24KKworVG8gdXNlIExpYmdjcnlwdCwgeW91IGhhdmUgdG8gcGVyZm9ybSBzb21lIGNoYW5nZXMgdG8geW91cgorc291cmNlcyBhbmQgdGhlIGJ1aWxkIHN5c3RlbS4gIFRoZSBuZWNlc3NhcnkgY2hhbmdlcyBhcmUgc21hbGwgYW5kCitleHBsYWluZWQgaW4gdGhlIGZvbGxvd2luZyBzZWN0aW9ucy4gIEF0IHRoZSBlbmQgb2YgdGhpcyBjaGFwdGVyLCBpdAoraXMgZGVzY3JpYmVkIGhvdyB0aGUgbGlicmFyeSBpcyBpbml0aWFsaXplZCwgYW5kIGhvdyB0aGUgcmVxdWlyZW1lbnRzCitvZiB0aGUgbGlicmFyeSBhcmUgdmVyaWZpZWQuCisKK0BtZW51CisqIEhlYWRlcjo6ICAgICAgICAgICAgICAgICAgICAgIFdoYXQgaGVhZGVyIGZpbGUgeW91IG5lZWQgdG8gaW5jbHVkZS4KKyogQnVpbGRpbmcgc291cmNlczo6ICAgICAgICAgICAgSG93IHRvIGJ1aWxkIHNvdXJjZXMgdXNpbmcgdGhlIGxpYnJhcnkuCisqIEJ1aWxkaW5nIHNvdXJjZXMgdXNpbmcgQXV0b21ha2U6OiAgSG93IHRvIGJ1aWxkIHNvdXJjZXMgd2l0aCB0aGUgaGVscCBvZiBBdXRvbWFrZS4KKyogSW5pdGlhbGl6aW5nIHRoZSBsaWJyYXJ5OjogICAgSG93IHRvIGluaXRpYWxpemUgdGhlIGxpYnJhcnkuCisqIE11bHRpLVRocmVhZGluZzo6ICAgICAgICAgICAgIEhvdyBMaWJnY3J5cHQgY2FuIGJlIHVzZWQgaW4gYSBNVCBlbnZpcm9ubWVudC4KKyogRW5hYmxpbmcgRklQUyBtb2RlOjogICAgICAgICAgSG93IHRvIGVuYWJsZSB0aGUgRklQUyBtb2RlLgorQGVuZCBtZW51CisKKworQG5vZGUgSGVhZGVyCitAc2VjdGlvbiBIZWFkZXIKKworQWxsIGludGVyZmFjZXMgKGRhdGEgdHlwZXMgYW5kIGZ1bmN0aW9ucykgb2YgdGhlIGxpYnJhcnkgYXJlIGRlZmluZWQKK2luIHRoZSBoZWFkZXIgZmlsZSBAZmlsZXtnY3J5cHQuaH0uICBZb3UgbXVzdCBpbmNsdWRlIHRoaXMgaW4gYWxsIHNvdXJjZQorZmlsZXMgdXNpbmcgdGhlIGxpYnJhcnksIGVpdGhlciBkaXJlY3RseSBvciB0aHJvdWdoIHNvbWUgb3RoZXIgaGVhZGVyCitmaWxlLCBsaWtlIHRoaXM6CisKK0BleGFtcGxlCisjaW5jbHVkZSA8Z2NyeXB0Lmg+CitAZW5kIGV4YW1wbGUKKworVGhlIG5hbWUgc3BhY2Ugb2YgTGliZ2NyeXB0IGlzIEBjb2Rle2djcnlfKn0gZm9yIGZ1bmN0aW9uCithbmQgdHlwZSBuYW1lcyBhbmQgQGNvZGV7R0NSWSp9IGZvciBvdGhlciBzeW1ib2xzLiAgSW4gYWRkaXRpb24gdGhlCitzYW1lIG5hbWUgcHJlZml4ZXMgd2l0aCBvbmUgcHJlcGVuZGVkIHVuZGVyc2NvcmUgYXJlIHJlc2VydmVkIGZvcgoraW50ZXJuYWwgdXNlIGFuZCBzaG91bGQgbmV2ZXIgYmUgdXNlZCBieSBhbiBhcHBsaWNhdGlvbi4gIE5vdGUgdGhhdAorTGliZ2NyeXB0IHVzZXMgbGliZ3BnLWVycm9yLCB3aGljaCB1c2VzIEBjb2Rle2dwZ18qfSBhcworbmFtZSBzcGFjZSBmb3IgZnVuY3Rpb24gYW5kIHR5cGUgbmFtZXMgYW5kIEBjb2Rle0dQR18qfSBmb3Igb3RoZXIKK3N5bWJvbHMsIGluY2x1ZGluZyBhbGwgdGhlIGVycm9yIGNvZGVzLgorCitAbm9pbmRlbnQKK0NlcnRhaW4gcGFydHMgb2YgZ2NyeXB0LmggbWF5IGJlIGV4Y2x1ZGVkIGJ5IGRlZmluaW5nIHRoZXNlIG1hY3JvczoKKworQHRhYmxlIEBjb2RlCitAaXRlbSBHQ1JZUFRfTk9fTVBJX01BQ1JPUworRG8gbm90IGRlZmluZSB0aGUgc2hvcnRoYW5kIG1hY3JvcyBAY29kZXttcGlfKn0gZm9yIEBjb2Rle2djcnlfbXBpXyp9LgorCitAaXRlbSBHQ1JZUFRfTk9fREVQUkVDQVRFRAorRG8gbm90IGluY2x1ZGUgZGVmaW50aW9ucyBmb3IgZGVwcmVjYXRlZCBmZWF0dXJlcy4gIFRoaXMgaXMgdXNlZnVsIHRvCittYWtlIHN1cmUgdGhhdCBubyBkZXByZWNhdGVkIGZlYXR1cmVzIGFyZSB1c2VkLgorQGVuZCB0YWJsZQorCitAbm9kZSBCdWlsZGluZyBzb3VyY2VzCitAc2VjdGlvbiBCdWlsZGluZyBzb3VyY2VzCisKK0lmIHlvdSB3YW50IHRvIGNvbXBpbGUgYSBzb3VyY2UgZmlsZSBpbmNsdWRpbmcgdGhlIGBnY3J5cHQuaCcgaGVhZGVyCitmaWxlLCB5b3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGUgY29tcGlsZXIgY2FuIGZpbmQgaXQgaW4gdGhlCitkaXJlY3RvcnkgaGllcmFyY2h5LiAgVGhpcyBpcyBhY2NvbXBsaXNoZWQgYnkgYWRkaW5nIHRoZSBwYXRoIHRvIHRoZQorZGlyZWN0b3J5IGluIHdoaWNoIHRoZSBoZWFkZXIgZmlsZSBpcyBsb2NhdGVkIHRvIHRoZSBjb21waWxlcnMgaW5jbHVkZQorZmlsZSBzZWFyY2ggcGF0aCAodmlhIHRoZSBAb3B0aW9uey1JfSBvcHRpb24pLgorCitIb3dldmVyLCB0aGUgcGF0aCB0byB0aGUgaW5jbHVkZSBmaWxlIGlzIGRldGVybWluZWQgYXQgdGhlIHRpbWUgdGhlCitzb3VyY2UgaXMgY29uZmlndXJlZC4gIFRvIHNvbHZlIHRoaXMgcHJvYmxlbSwgTGliZ2NyeXB0IHNoaXBzIHdpdGggYSBzbWFsbAoraGVscGVyIHByb2dyYW0gQGNvbW1hbmR7bGliZ2NyeXB0LWNvbmZpZ30gdGhhdCBrbm93cyB0aGUgcGF0aCB0byB0aGUKK2luY2x1ZGUgZmlsZSBhbmQgb3RoZXIgY29uZmlndXJhdGlvbiBvcHRpb25zLiAgVGhlIG9wdGlvbnMgdGhhdCBuZWVkCit0byBiZSBhZGRlZCB0byB0aGUgY29tcGlsZXIgaW52b2NhdGlvbiBhdCBjb21waWxlIHRpbWUgYXJlIG91dHB1dCBieQordGhlIEBvcHRpb257LS1jZmxhZ3N9IG9wdGlvbiB0byBAY29tbWFuZHtsaWJnY3J5cHQtY29uZmlnfS4gIFRoZSBmb2xsb3dpbmcKK2V4YW1wbGUgc2hvd3MgaG93IGl0IGNhbiBiZSB1c2VkIGF0IHRoZSBjb21tYW5kIGxpbmU6CisKK0BleGFtcGxlCitnY2MgLWMgZm9vLmMgYGxpYmdjcnlwdC1jb25maWcgLS1jZmxhZ3NgCitAZW5kIGV4YW1wbGUKKworQWRkaW5nIHRoZSBvdXRwdXQgb2YgQHNhbXB7bGliZ2NyeXB0LWNvbmZpZyAtLWNmbGFnc30gdG8gdGhlIGNvbXBpbGVycworY29tbWFuZCBsaW5lIHdpbGwgZW5zdXJlIHRoYXQgdGhlIGNvbXBpbGVyIGNhbiBmaW5kIHRoZSBMaWJnY3J5cHQgaGVhZGVyCitmaWxlLgorCitBIHNpbWlsYXIgcHJvYmxlbSBvY2N1cnMgd2hlbiBsaW5raW5nIHRoZSBwcm9ncmFtIHdpdGggdGhlIGxpYnJhcnkuCitBZ2FpbiwgdGhlIGNvbXBpbGVyIGhhcyB0byBmaW5kIHRoZSBsaWJyYXJ5IGZpbGVzLiAgRm9yIHRoaXMgdG8gd29yaywKK3RoZSBwYXRoIHRvIHRoZSBsaWJyYXJ5IGZpbGVzIGhhcyB0byBiZSBhZGRlZCB0byB0aGUgbGlicmFyeSBzZWFyY2ggcGF0aAorKHZpYSB0aGUgQG9wdGlvbnstTH0gb3B0aW9uKS4gIEZvciB0aGlzLCB0aGUgb3B0aW9uIEBvcHRpb257LS1saWJzfSB0bworQGNvbW1hbmR7bGliZ2NyeXB0LWNvbmZpZ30gY2FuIGJlIHVzZWQuICBGb3IgY29udmVuaWVuY2UsIHRoaXMgb3B0aW9uCithbHNvIG91dHB1dHMgYWxsIG90aGVyIG9wdGlvbnMgdGhhdCBhcmUgcmVxdWlyZWQgdG8gbGluayB0aGUgcHJvZ3JhbQord2l0aCB0aGUgTGliZ2NyeXB0IGxpYnJhcmllcyAoaW4gcGFydGljdWxhciwgdGhlIEBzYW1wey1sZ2NyeXB0fQorb3B0aW9uKS4gIFRoZSBleGFtcGxlIHNob3dzIGhvdyB0byBsaW5rIEBmaWxle2Zvby5vfSB3aXRoIHRoZSBMaWJnY3J5cHQKK2xpYnJhcnkgdG8gYSBwcm9ncmFtIEBjb21tYW5ke2Zvb30uCisKK0BleGFtcGxlCitnY2MgLW8gZm9vIGZvby5vIGBsaWJnY3J5cHQtY29uZmlnIC0tbGlic2AKK0BlbmQgZXhhbXBsZQorCitPZiBjb3Vyc2UgeW91IGNhbiBhbHNvIGNvbWJpbmUgYm90aCBleGFtcGxlcyB0byBhIHNpbmdsZSBjb21tYW5kIGJ5CitzcGVjaWZ5aW5nIGJvdGggb3B0aW9ucyB0byBAY29tbWFuZHtsaWJnY3J5cHQtY29uZmlnfToKKworQGV4YW1wbGUKK2djYyAtbyBmb28gZm9vLmMgYGxpYmdjcnlwdC1jb25maWcgLS1jZmxhZ3MgLS1saWJzYAorQGVuZCBleGFtcGxlCisKK0Bub2RlIEJ1aWxkaW5nIHNvdXJjZXMgdXNpbmcgQXV0b21ha2UKK0BzZWN0aW9uIEJ1aWxkaW5nIHNvdXJjZXMgdXNpbmcgQXV0b21ha2UKKworSXQgaXMgbXVjaCBlYXNpZXIgaWYgeW91IHVzZSBHTlUgQXV0b21ha2UgaW5zdGVhZCBvZiB3cml0aW5nIHlvdXIgb3duCitNYWtlZmlsZXMuICBJZiB5b3UgZG8gdGhhdCwgeW91IGRvIG5vdCBoYXZlIHRvIHdvcnJ5IGFib3V0IGZpbmRpbmcgYW5kCitpbnZva2luZyB0aGUgQGNvbW1hbmR7bGliZ2NyeXB0LWNvbmZpZ30gc2NyaXB0IGF0IGFsbC4KK0xpYmdjcnlwdCBwcm92aWRlcyBhbiBleHRlbnNpb24gdG8gQXV0b21ha2UgdGhhdCBkb2VzIGFsbAordGhlIHdvcmsgZm9yIHlvdS4KKworQGMgQSBzaW1wbGUgbWFjcm8gZm9yIG9wdGlvbmFsIHZhcmlhYmxlcy4KK0BtYWNybyBvdmFye3Zhcm5hbWV9CitAcntbfUB2YXJ7XHZhcm5hbWVcfUBye119CitAZW5kIG1hY3JvCitAZGVmbWFjIEFNX1BBVEhfTElCR0NSWVBUIChAb3ZhcnttaW5pbXVtLXZlcnNpb259LCBAb3ZhcnthY3Rpb24taWYtZm91bmR9LCBAb3ZhcnthY3Rpb24taWYtbm90LWZvdW5kfSkKK0NoZWNrIHdoZXRoZXIgTGliZ2NyeXB0IChhdCBsZWFzdCB2ZXJzaW9uCitAdmFye21pbmltdW0tdmVyc2lvbn0sIGlmIGdpdmVuKSBleGlzdHMgb24gdGhlIGhvc3Qgc3lzdGVtLiAgSWYgaXQgaXMKK2ZvdW5kLCBleGVjdXRlIEB2YXJ7YWN0aW9uLWlmLWZvdW5kfSwgb3RoZXJ3aXNlIGRvCitAdmFye2FjdGlvbi1pZi1ub3QtZm91bmR9LCBpZiBnaXZlbi4KKworQWRkaXRpb25hbGx5LCB0aGUgZnVuY3Rpb24gZGVmaW5lcyBAY29kZXtMSUJHQ1JZUFRfQ0ZMQUdTfSB0byB0aGUKK2ZsYWdzIG5lZWRlZCBmb3IgY29tcGlsYXRpb24gb2YgdGhlIHByb2dyYW0gdG8gZmluZCB0aGUKK0BmaWxle2djcnlwdC5ofSBoZWFkZXIgZmlsZSwgYW5kIEBjb2Rle0xJQkdDUllQVF9MSUJTfSB0byB0aGUgbGlua2VyCitmbGFncyBuZWVkZWQgdG8gbGluayB0aGUgcHJvZ3JhbSB0byB0aGUgTGliZ2NyeXB0IGxpYnJhcnkuCitAZW5kIGRlZm1hYworCitZb3UgY2FuIHVzZSB0aGUgZGVmaW5lZCBBdXRvY29uZiB2YXJpYWJsZXMgbGlrZSB0aGlzIGluIHlvdXIKK0BmaWxle01ha2VmaWxlLmFtfToKKworQGV4YW1wbGUKK0FNX0NQUEZMQUdTID0gJChMSUJHQ1JZUFRfQ0ZMQUdTKQorTERBREQgPSAkKExJQkdDUllQVF9MSUJTKQorQGVuZCBleGFtcGxlCisKK0Bub2RlIEluaXRpYWxpemluZyB0aGUgbGlicmFyeQorQHNlY3Rpb24gSW5pdGlhbGl6aW5nIHRoZSBsaWJyYXJ5CisKK0JlZm9yZSB0aGUgbGlicmFyeSBjYW4gYmUgdXNlZCwgaXQgbXVzdCBpbml0aWFsaXplIGl0c2VsZi4gIFRoaXMgaXMKK2FjaGlldmVkIGJ5IGludm9raW5nIHRoZSBmdW5jdGlvbiBAY29kZXtnY3J5X2NoZWNrX3ZlcnNpb259IGRlc2NyaWJlZAorYmVsb3cuCisKK0Fsc28sIGl0IGlzIG9mdGVuIGRlc2lyYWJsZSB0byBjaGVjayB0aGF0IHRoZSB2ZXJzaW9uIG9mCitMaWJnY3J5cHQgdXNlZCBpcyBpbmRlZWQgb25lIHdoaWNoIGZpdHMgYWxsIHJlcXVpcmVtZW50cy4KK0V2ZW4gd2l0aCBiaW5hcnkgY29tcGF0aWJpbGl0eSwgbmV3IGZlYXR1cmVzIG1heSBoYXZlIGJlZW4gaW50cm9kdWNlZCwKK2J1dCBkdWUgdG8gcHJvYmxlbSB3aXRoIHRoZSBkeW5hbWljIGxpbmtlciBhbiBvbGQgdmVyc2lvbiBtYXkgYWN0dWFsbHkKK2JlIHVzZWQuICBTbyB5b3UgbWF5IHdhbnQgdG8gY2hlY2sgdGhhdCB0aGUgdmVyc2lvbiBpcyBva2F5IHJpZ2h0CithZnRlciBwcm9ncmFtIHN0YXJ0dXAuCisKK0BkZWZ0eXBlZnVuIHtjb25zdCBjaGFyICp9IGdjcnlfY2hlY2tfdmVyc2lvbiAoY29uc3QgY2hhciAqQHZhcntyZXFfdmVyc2lvbn0pCisKK1RoZSBmdW5jdGlvbiBAY29kZXtnY3J5X2NoZWNrX3ZlcnNpb259IGluaXRpYWxpemVzIHNvbWUgc3Vic3lzdGVtcyB1c2VkCitieSBMaWJnY3J5cHQgYW5kIG11c3QgYmUgaW52b2tlZCBiZWZvcmUgYW55IG90aGVyIGZ1bmN0aW9uIGluIHRoZQorbGlicmFyeSwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBAY29kZXtHQ1JZQ1RMX1NFVF9USFJFQURfQ0JTfSBjb21tYW5kCisoY2FsbGVkIHZpYSB0aGUgQGNvZGV7Z2NyeV9jb250cm9sfSBmdW5jdGlvbikuCitAeHJlZntNdWx0aS1UaHJlYWRpbmd9LgorCitGdXJ0aGVybW9yZSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgbGlicmFyeS4KK0l0IGNhbiBhbHNvIHZlcmlmeSB0aGF0IHRoZSB2ZXJzaW9uIG51bWJlciBpcyBoaWdoZXIgdGhhbiBhIGNlcnRhaW4KK3JlcXVpcmVkIHZlcnNpb24gbnVtYmVyIEB2YXJ7cmVxX3ZlcnNpb259LCBpZiB0aGlzIHZhbHVlIGlzIG5vdCBhIG51bGwKK3BvaW50ZXIuCitAZW5kIGRlZnR5cGVmdW4KKworTGliZ2NyeXB0IHVzZXMgYSBjb25jZXB0IGtub3duIGFzIHNlY3VyZSBtZW1vcnksIHdoaWNoIGlzIGEgcmVnaW9uIG9mCittZW1vcnkgc2V0IGFzaWRlIGZvciBzdG9yaW5nIHNlbnNpdGl2ZSBkYXRhLiAgQmVjYXVzZSBzdWNoIG1lbW9yeSBpcyBhCitzY2FyY2UgcmVzb3VyY2UsIGl0IG5lZWRzIHRvIGJlIHNldHVwIGluIGFkdmFuY2VkIHRvIGEgZml4ZWQgc2l6ZS4KK0Z1cnRoZXIsIG1vc3Qgb3BlcmF0aW5nIHN5c3RlbXMgaGF2ZSBzcGVjaWFsIHJlcXVpcmVtZW50cyBvbiBob3cgdGhhdAorc2VjdXJlIG1lbW9yeSBjYW4gYmUgdXNlZC4gIEZvciBleGFtcGxlLCBpdCBtaWdodCBiZSByZXF1aXJlZCB0byBpbnN0YWxsCithbiBhcHBsaWNhdGlvbiBhcyBgYHNldHVpZChyb290KScnIHRvIGFsbG93IGFsbG9jYXRpbmcgc3VjaCBtZW1vcnkuCitMaWJnY3J5cHQgcmVxdWlyZXMgYSBzZXF1ZW5jZSBvZiBpbml0aWFsaXphdGlvbiBzdGVwcyB0byBtYWtlIHN1cmUgdGhhdAordGhpcyB3b3JrcyBjb3JyZWN0bHkuICBUaGUgZm9sbG93aW5nIGV4YW1wbGVzIHNob3cgdGhlIG5lY2Vzc2FyeSBzdGVwcy4KKworSWYgeW91IGRvbid0IGhhdmUgYSBuZWVkIGZvciBzZWN1cmUgbWVtb3J5LCBmb3IgZXhhbXBsZSBpZiB5b3VyCithcHBsaWNhdGlvbiBkb2VzIG5vdCB1c2Ugc2VjcmV0IGtleXMgb3Igb3RoZXIgY29uZmlkZW50aWFsIGRhdGEgb3IgaXQKK3J1bnMgaW4gYSBjb250cm9sbGVkIGVudmlyb25tZW50IHdoZXJlIGtleSBtYXRlcmlhbCBmbG9hdGluZyBhcm91bmQgaW4KK21lbW9yeSBpcyBub3QgYSBwcm9ibGVtLCB5b3Ugc2hvdWxkIGluaXRpYWxpemUgTGliZ2NyeXB0IHRoaXMgd2F5OgorCitAZXhhbXBsZQorICAvKiBWZXJzaW9uIGNoZWNrIHNob3VsZCBiZSB0aGUgdmVyeSBmaXJzdCBjYWxsIGJlY2F1c2UgaXQKKyAgICAgbWFrZXMgc3VyZSB0aGF0IGltcG9ydGFudCBzdWJzeXN0ZW1zIGFyZSBpbnRpYWxpemVkLiAqLworICBpZiAoIWdjcnlfY2hlY2tfdmVyc2lvbiAoR0NSWVBUX1ZFUlNJT04pKQorICAgIEB7CisgICAgICBmcHV0cyAoImxpYmdjcnlwdCB2ZXJzaW9uIG1pc21hdGNoXG4iLCBzdGRlcnIpOworICAgICAgZXhpdCAoMik7CisgICAgQH0KKyAgICAgICAgCisgIC8qIERpc2FibGUgc2VjdXJlIG1lbW9yeS4gICovCisgIGdjcnlfY29udHJvbCAoR0NSWUNUTF9ESVNBQkxFX1NFQ01FTSwgMCk7CisKKyAgLyogLi4uIElmIHJlcXVpcmVkLCBvdGhlciBpbml0aWFsaXphdGlvbiBnb2VzIGhlcmUuICAqLworCisgIC8qIFRlbGwgTGliZ2NyeXB0IHRoYXQgaW5pdGlhbGl6YXRpb24gaGFzIGNvbXBsZXRlZC4gKi8KKyAgZ2NyeV9jb250cm9sIChHQ1JZQ1RMX0lOSVRJQUxJWkFUSU9OX0ZJTklTSEVELCAwKTsKK0BlbmQgZXhhbXBsZQorCisKK0lmIHlvdSBoYXZlIHRvIHByb3RlY3QgeW91ciBrZXlzIG9yIG90aGVyIGluZm9ybWF0aW9uIGluIG1lbW9yeSBhZ2FpbnN0CitiZWluZyBzd2FwcGVkIG91dCB0byBkaXNrIGFuZCB0byBlbmFibGUgYW4gYXV0b21hdGljIG92ZXJ3cml0ZSBvZiB1c2VkCithbmQgZnJlZWQgbWVtb3J5LCB5b3UgbmVlZCB0byBpbml0aWFsaXplIExpYmdjcnlwdCB0aGlzIHdheToKKworQGV4YW1wbGUKKyAgLyogVmVyc2lvbiBjaGVjayBzaG91bGQgYmUgdGhlIHZlcnkgZmlyc3QgY2FsbCBiZWNhdXNlIGl0CisgICAgIG1ha2VzIHN1cmUgdGhhdCBpbXBvcnRhbnQgc3Vic3lzdGVtcyBhcmUgaW50aWFsaXplZC4gKi8KKyAgaWYgKCFnY3J5X2NoZWNrX3ZlcnNpb24gKEdDUllQVF9WRVJTSU9OKSkKKyAgICBAeworICAgICAgZnB1dHMgKCJsaWJnY3J5cHQgdmVyc2lvbiBtaXNtYXRjaFxuIiwgc3RkZXJyKTsKKyAgICAgIGV4aXQgKDIpOworICAgIEB9CisKK0BhbmNob3J7c2FtcGxlLXVzZS1zdXNwZW5kLXNlY21lbX0KKyAgLyogV2UgZG9uJ3Qgd2FudCB0byBzZWUgYW55IHdhcm5pbmdzLCBlLmcuIGJlY2F1c2Ugd2UgaGF2ZSBub3QgeWV0CisgICAgIHBhcnNlZCBwcm9ncmFtIG9wdGlvbnMgd2hpY2ggbWlnaHQgYmUgdXNlZCB0byBzdXBwcmVzcyBzdWNoCisgICAgIHdhcm5pbmdzLiAqLworICBnY3J5X2NvbnRyb2wgKEdDUllDVExfU1VTUEVORF9TRUNNRU1fV0FSTik7CisKKyAgLyogLi4uIElmIHJlcXVpcmVkLCBvdGhlciBpbml0aWFsaXphdGlvbiBnb2VzIGhlcmUuICBOb3RlIHRoYXQgdGhlCisgICAgIHByb2Nlc3MgbWlnaHQgc3RpbGwgYmUgcnVubmluZyB3aXRoIGluY3JlYXNlZCBwcml2aWxlZ2VzIGFuZCB0aGF0IAorICAgICB0aGUgc2VjdXJlIG1lbW9yeSBoYXMgbm90IGJlZW4gaW50aWFsaXplZC4gICovCisKKyAgLyogQWxsb2NhdGUgYSBwb29sIG9mIDE2ayBzZWN1cmUgbWVtb3J5LiAgVGhpcyBtYWtlIHRoZSBzZWN1cmUgbWVtb3J5CisgICAgIGF2YWlsYWJsZSBhbmQgYWxzbyBkcm9wcyBwcml2aWxlZ2VzIHdoZXJlIG5lZWRlZC4gICovCisgIGdjcnlfY29udHJvbCAoR0NSWUNUTF9JTklUX1NFQ01FTSwgMTYzODQsIDApOworCitAYW5jaG9ye3NhbXBsZS11c2UtcmVzdW1lLXNlY21lbX0KKyAgLyogSXQgaXMgbm93IG9rYXkgdG8gbGV0IExpYmdjcnlwdCBjb21wbGFpbiB3aGVuIHRoZXJlIHdhcy9pcworICAgICBhIHByb2JsZW0gd2l0aCB0aGUgc2VjdXJlIG1lbW9yeS4gKi8KKyAgZ2NyeV9jb250cm9sIChHQ1JZQ1RMX1JFU1VNRV9TRUNNRU1fV0FSTik7CisKKyAgLyogLi4uIElmIHJlcXVpcmVkLCBvdGhlciBpbml0aWFsaXphdGlvbiBnb2VzIGhlcmUuICAqLworCisgIC8qIFRlbGwgTGliZ2NyeXB0IHRoYXQgaW5pdGlhbGl6YXRpb24gaGFzIGNvbXBsZXRlZC4gKi8KKyAgZ2NyeV9jb250cm9sIChHQ1JZQ1RMX0lOSVRJQUxJWkFUSU9OX0ZJTklTSEVELCAwKTsKK0BlbmQgZXhhbXBsZQorCitJdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGVzZSBpbml0aWFsaXphdGlvbiBzdGVwcyBhcmUgbm90IGRvbmUgYnkgYQorbGlicmFyeSBidXQgYnkgdGhlIGFjdHVhbCBhcHBsaWNhdGlvbi4gIEEgbGlicmFyeSB1c2luZyBMaWJnY3J5cHQgbWlnaHQKK3dhbnQgdG8gY2hlY2sgZm9yIGZpbmlzaGVkIGluaXRpYWxpemF0aW9uIHVzaW5nOgorCitAZXhhbXBsZQorICBpZiAoIWdjcnlfY29udHJvbCAoR0NSWUNUTF9JTklUSUFMSVpBVElPTl9GSU5JU0hFRF9QKSkKKyAgICBAeworICAgICAgZnB1dHMgKCJsaWJnY3J5cHQgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXG4iLCBzdGRlcnIpOworICAgICAgYWJvcnQgKCk7CisgICAgQH0gICAgICAgCitAZW5kIGV4YW1wbGUKKworSW5zdGVhZCBvZiB0ZXJtaW5hdGluZyB0aGUgcHJvY2VzcywgdGhlIGxpYnJhcnkgbWF5IGluc3RlYWQgcHJpbnQgYQord2FybmluZyBhbmQgdHJ5IHRvIGluaXRpYWxpemUgTGliZ2NyeXB0IGl0c2VsZi4gIFNlZSBhbHNvIHRoZSBzZWN0aW9uIG9uCittdWx0aS10aHJlYWRpbmcgYmVsb3cgZm9yIG1vcmUgcGl0ZmFsbHMuCisKKworCitAbm9kZSBNdWx0aS1UaHJlYWRpbmcKK0BzZWN0aW9uIE11bHRpLVRocmVhZGluZworCitBcyBtZW50aW9uZWQgZWFybGllciwgdGhlIExpYmdjcnlwdCBsaWJyYXJ5IGlzIAordGhyZWFkLXNhZmUgaWYgeW91IGFkaGVyZSB0byB0aGUgZm9sbG93aW5nIHJlcXVpcmVtZW50czoKKworQGl0ZW1pemUgQGJ1bGxldAorQGl0ZW0KK0lmIHlvdXIgYXBwbGljYXRpb24gaXMgbXVsdGktdGhyZWFkZWQsIHlvdSBtdXN0IHNldCB0aGUgdGhyZWFkIHN1cHBvcnQKK2NhbGxiYWNrcyB3aXRoIHRoZSBAY29kZXtHQ1JZQ1RMX1NFVF9USFJFQURfQ0JTfSBjb21tYW5kCitAc3Ryb25ne2JlZm9yZX0gYW55IG90aGVyIGZ1bmN0aW9uIGluIHRoZSBsaWJyYXJ5LgorCitUaGlzIGlzIGVhc3kgZW5vdWdoIGlmIHlvdSBhcmUgaW5kZWVkIHdyaXRpbmcgYW4gYXBwbGljYXRpb24gdXNpbmcKK0xpYmdjcnlwdC4gIEl0IGlzIHJhdGhlciBwcm9ibGVtYXRpYyBpZiB5b3UgYXJlIHdyaXRpbmcgYSBsaWJyYXJ5CitpbnN0ZWFkLiAgSGVyZSBhcmUgc29tZSB0aXBzIHdoYXQgdG8gZG8gaWYgeW91IGFyZSB3cml0aW5nIGEgbGlicmFyeToKKworSWYgeW91ciBsaWJyYXJ5IHJlcXVpcmVzIGEgY2VydGFpbiB0aHJlYWQgcGFja2FnZSwganVzdCBpbml0aWFsaXplCitMaWJnY3J5cHQgdG8gdXNlIHRoaXMgdGhyZWFkIHBhY2thZ2UuICBJZiB5b3VyIGxpYnJhcnkgc3VwcG9ydHMgbXVsdGlwbGUKK3RocmVhZCBwYWNrYWdlcywgYnV0IG5lZWRzIHRvIGJlIGNvbmZpZ3VyZWQsIHlvdSB3aWxsIGhhdmUgdG8KK2ltcGxlbWVudCBhIHdheSB0byBkZXRlcm1pbmUgd2hpY2ggdGhyZWFkIHBhY2thZ2UgdGhlIGFwcGxpY2F0aW9uCit3YW50cyB0byB1c2Ugd2l0aCB5b3VyIGxpYnJhcnkgYW55d2F5LiAgVGhlbiBjb25maWd1cmUgTGliZ2NyeXB0IHRvIHVzZQordGhpcyB0aHJlYWQgcGFja2FnZS4KKworSWYgeW91ciBsaWJyYXJ5IGlzIGZ1bGx5IHJlZW50cmFudCB3aXRob3V0IGFueSBzcGVjaWFsIHN1cHBvcnQgYnkgYQordGhyZWFkIHBhY2thZ2UsIHRoZW4geW91IGFyZSBsdWNreSBpbmRlZWQuICBVbmZvcnR1bmF0ZWx5LCB0aGlzIGRvZXMKK25vdCByZWxpZXZlIHlvdSBmcm9tIGRvaW5nIGVpdGhlciBvZiB0aGUgdHdvIGFib3ZlLCBvciB1c2UgYSB0aGlyZAorb3B0aW9uLiAgVGhlIHRoaXJkIG9wdGlvbiBpcyB0byBsZXQgdGhlIGFwcGxpY2F0aW9uIGluaXRpYWxpemUgTGliZ2NyeXB0Citmb3IgeW91LiAgVGhlbiB5b3UgYXJlIG5vdCB1c2luZyBMaWJnY3J5cHQgdHJhbnNwYXJlbnRseSwgdGhvdWdoLgorCitBcyBpZiB0aGlzIHdhcyBub3QgZGlmZmljdWx0IGVub3VnaCwgYSBjb25mbGljdCBtYXkgYXJpc2UgaWYgdHdvCitsaWJyYXJpZXMgdHJ5IHRvIGluaXRpYWxpemUgTGliZ2NyeXB0IGluZGVwZW5kZW50bHkgb2YgZWFjaCBvdGhlcnMsIGFuZAorYm90aCBzdWNoIGxpYnJhcmllcyBhcmUgdGhlbiBsaW5rZWQgaW50byB0aGUgc2FtZSBhcHBsaWNhdGlvbi4gIFRvCittYWtlIGl0IGEgYml0IHNpbXBsZXIgZm9yIHlvdSwgdGhpcyB3aWxsIHByb2JhYmx5IHdvcmssIGJ1dCBvbmx5IGlmCitib3RoIGxpYnJhcmllcyBoYXZlIHRoZSBzYW1lIHJlcXVpcmVtZW50IGZvciB0aGUgdGhyZWFkIHBhY2thZ2UuICBUaGlzCitpcyBjdXJyZW50bHkgb25seSBzdXBwb3J0ZWQgZm9yIHRoZSBub24tdGhyZWFkZWQgY2FzZSwgR05VIFB0aCBhbmQKK3B0aHJlYWQuICBTdXBwb3J0IGZvciBtb3JlIHRocmVhZCBwYWNrYWdlcyBpcyBlYXN5IHRvIGFkZCwgc28gY29udGFjdAordXMgaWYgeW91IHJlcXVpcmUgaXQuCisKK0BpdGVtCitUaGUgZnVuY3Rpb24gQGNvZGV7Z2NyeV9jaGVja192ZXJzaW9ufSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyCitmdW5jdGlvbiBpbiB0aGUgbGlicmFyeSwgZXhjZXB0IHRoZSBAY29kZXtHQ1JZQ1RMX1NFVF9USFJFQURfQ0JTfQorY29tbWFuZCAoY2FsbGVkIHZpYSB0aGUgQGNvZGV7Z2NyeV9jb250cm9sfSBmdW5jdGlvbiksIGJlY2F1c2UgaXQKK2luaXRpYWxpemVzIHRoZSB0aHJlYWQgc3VwcG9ydCBzdWJzeXN0ZW0gaW4gTGliZ2NyeXB0LiAgVG8KK2FjaGlldmUgdGhpcyBpbiBtdWx0aS10aHJlYWRlZCBwcm9ncmFtcywgeW91IG11c3Qgc3luY2hyb25pemUgdGhlCittZW1vcnkgd2l0aCByZXNwZWN0IHRvIG90aGVyIHRocmVhZHMgdGhhdCBhbHNvIHdhbnQgdG8gdXNlCitMaWJnY3J5cHQuICBGb3IgdGhpcywgaXQgaXMgc3VmZmljaWVudCB0byBjYWxsCitAY29kZXtnY3J5X2NoZWNrX3ZlcnNpb259IGJlZm9yZSBjcmVhdGluZyB0aGUgb3RoZXIgdGhyZWFkcyB1c2luZworTGliZ2NyeXB0QGZvb3Rub3Rle0F0IGxlYXN0IHRoaXMgaXMgdHJ1ZSBmb3IgUE9TSVggdGhyZWFkcywKK2FzIEBjb2Rle3B0aHJlYWRfY3JlYXRlfSBpcyBhIGZ1bmN0aW9uIHRoYXQgc3luY2hyb25pemVzIG1lbW9yeSB3aXRoCityZXNwZWN0cyB0byBvdGhlciB0aHJlYWRzLiAgVGhlcmUgYXJlIG1hbnkgZnVuY3Rpb25zIHdoaWNoIGhhdmUgdGhpcworcHJvcGVydHksIGEgY29tcGxldGUgbGlzdCBjYW4gYmUgZm91bmQgaW4gUE9TSVgsIElFRUUgU3RkIDEwMDMuMS0yMDAzLAorQmFzZSBEZWZpbml0aW9ucywgSXNzdWUgNiwgaW4gdGhlIGRlZmluaXRpb24gb2YgdGhlIHRlcm0gYGBNZW1vcnkKK1N5bmNocm9uaXphdGlvbicnLiAgRm9yIG90aGVyIHRocmVhZCBwYWNrYWdlcywgbW9yZSByZWxheGVkIG9yIG1vcmUKK3N0cmljdCBydWxlcyBtYXkgYXBwbHkufS4KKworQGl0ZW0KK0p1c3QgbGlrZSB0aGUgZnVuY3Rpb24gQGNvZGV7Z3BnX3N0cmVycm9yfSwgdGhlIGZ1bmN0aW9uCitAY29kZXtnY3J5X3N0cmVycm9yfSBpcyBub3QgdGhyZWFkIHNhZmUuICBZb3UgaGF2ZSB0byB1c2UKK0Bjb2Rle2dwZ19zdHJlcnJvcl9yfSBpbnN0ZWFkLgorCitAZW5kIGl0ZW1pemUKKworCitMaWJnY3J5cHQgY29udGFpbnMgY29udmVuaWVudCBtYWNyb3MsIHdoaWNoIGRlZmluZSB0aGUKK25lY2Vzc2FyeSB0aHJlYWQgY2FsbGJhY2tzIGZvciBQVGhyZWFkIGFuZCBmb3IgR05VIFB0aDoKKworQHRhYmxlIEBjb2RlCitAaXRlbSBHQ1JZX1RIUkVBRF9PUFRJT05fUFRIX0lNUEwKKworVGhpcyBtYWNybyBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgKHN0YXRpYykgc3ltYm9sczoKK0Bjb2Rle2djcnlfcHRoX2luaXR9LCBAY29kZXtnY3J5X3B0aF9tdXRleF9pbml0fSwKK0Bjb2Rle2djcnlfcHRoX211dGV4X2Rlc3Ryb3l9LCBAY29kZXtnY3J5X3B0aF9tdXRleF9sb2NrfSwKK0Bjb2Rle2djcnlfcHRoX211dGV4X3VubG9ja30sIEBjb2Rle2djcnlfcHRoX3JlYWR9LAorQGNvZGV7Z2NyeV9wdGhfd3JpdGV9LCBAY29kZXtnY3J5X3B0aF9zZWxlY3R9LAorQGNvZGV7Z2NyeV9wdGhfd2FpdHBpZH0sIEBjb2Rle2djcnlfcHRoX2FjY2VwdH0sCitAY29kZXtnY3J5X3B0aF9jb25uZWN0fSwgQGNvZGV7Z2NyeV90aHJlYWRzX3B0aH0uCisKK0FmdGVyIGluY2x1ZGluZyB0aGlzIG1hY3JvLCBAY29kZXtnY3J5X2NvbnRyb2woKX0gc2hhbGwgYmUgdXNlZCB3aXRoIGEKK2NvbW1hbmQgb2YgQGNvZGV7R0NSWUNUTF9TRVRfVEhSRUFEX0NCU30gaW4gb3JkZXIgdG8gcmVnaXN0ZXIgdGhlCit0aHJlYWQgY2FsbGJhY2sgc3RydWN0dXJlIG5hbWVkIGBgZ2NyeV90aHJlYWRzX3B0aCcnLgorCitAaXRlbSBHQ1JZX1RIUkVBRF9PUFRJT05fUFRIUkVBRF9JTVBMCisKK1RoaXMgbWFjcm8gZGVmaW5lcyB0aGUgZm9sbG93aW5nIChzdGF0aWMpIHN5bWJvbHM6CitAY29kZXtnY3J5X3B0aHJlYWRfbXV0ZXhfaW5pdH0sIEBjb2Rle2djcnlfcHRocmVhZF9tdXRleF9kZXN0cm95fSwKK0Bjb2Rle2djcnlfcHRocmVhZF9tdXRleF9sb2NrfSwgQGNvZGV7Z2NyeV9wdGhyZWFkX211dGV4X3VubG9ja30sCitAY29kZXtnY3J5X3RocmVhZHNfcHRocmVhZH0uCisKK0FmdGVyIGluY2x1ZGluZyB0aGlzIG1hY3JvLCBAY29kZXtnY3J5X2NvbnRyb2woKX0gc2hhbGwgYmUgdXNlZCB3aXRoIGEKK2NvbW1hbmQgb2YgQGNvZGV7R0NSWUNUTF9TRVRfVEhSRUFEX0NCU30gaW4gb3JkZXIgdG8gcmVnaXN0ZXIgdGhlCit0aHJlYWQgY2FsbGJhY2sgc3RydWN0dXJlIG5hbWVkIGBgZ2NyeV90aHJlYWRzX3B0aHJlYWQnJy4KK0BlbmQgdGFibGUKKworTm90ZSB0aGF0IHRoZXNlIG1hY3JvcyBuZWVkIHRvIGJlIHRlcm1pbmF0ZWQgd2l0aCBhIHNlbWljb2xvbi4gIEtlZXAKK2luIG1pbmQgdGhhdCB0aGVzZSBhcmUgY29udmVuaWVudCBtYWNyb3MgZm9yIEMgcHJvZ3JhbW1lcnM7IEMrKworcHJvZ3JhbW1lcnMgbWlnaHQgaGF2ZSB0byB3cmFwIHRoZXNlIG1hY3JvcyBpbiBhbiBgYGV4dGVybiBDJycgYm9keS4KKworCitAbm9kZSBFbmFibGluZyBGSVBTIG1vZGUKK0BzZWN0aW9uIEhvdyB0byBlbmFibGUgdGhlIEZJUFMgbW9kZQorQGNpbmRleCBGSVBTIG1vZGUKK0BjaW5kZXggRklQUyAxNDAKKworTGliZ2NyeXB0IG1heSBiZSB1c2VkIGluIGEgRklQUyAxNDAtMiBtb2RlLiAgTm90ZSwgdGhhdCB0aGlzIGRvZXMgbm90CituZWNlc3NhcnkgbWVhbiB0aGF0IExpYmNncnlwdCBpcyBhbiBhcHBvdmVkIEZJUFMgMTQwLTIgbW9kdWxlLiAgQ2hlY2sgdGhlCitOSVNUIGRhdGFiYXNlIGF0IEB1cmx7aHR0cDovL2NzcmMubmlzdC5nb3YvZ3JvdXBzL1NUTS9jbXZwL30gdG8gc2VlIHdoYXQKK3ZlcnNpb25zIG9mIExpYmdjcnlwdCBhcmUgYXBwcm92ZWQuCisKK0JlY2F1c2UgRklQUyAxNDAgaGFzIGNlcnRhaW4gcmVzdHJpY3Rpb25zIG9uIHRoZSB1c2Ugb2YgY3J5cHRvZ3JhcGh5Cit3aGljaCBhcmUgbm90IGFsd2F5cyB3YW50ZWQsIExpYmdjcnlwdCBuZWVkcyB0byBiZSBwdXQgaW50byBGSVBTIG1vZGUKK2V4cGxpY2l0bHkuICBUaHJlZSBhbHRlcm5hdGl2ZSBtZWNoYW5pc21zIGFyZSBwcm92aWRlZCB0byBzd2l0Y2gKK0xpYmdjcnlwdCBpbnRvIHRoaXMgbW9kZToKKworQGl0ZW1pemUKK0BpdGVtIAorSWYgdGhlIGZpbGUgQGZpbGV7L3Byb2Mvc3lzL2NyeXB0by9maXBzX2VuYWJsZWR9IGV4aXN0cyBhbmQgY29udGFpbnMgYQorbnVtZXJpYyB2YWx1ZSBvdGhlciB0aGFuIEBjb2RlezB9LCBMaWJnY3J5cHQgaXMgcHV0IGludG8gRklQUyBtb2RlIGF0Citpbml0aWFsaXphdGlvbiB0aW1lLiAgT2J2aW91c2x5IHRoaXMgd29ya3Mgb25seSBvbiBzeXN0ZW1zIHdpdGggYQorQGNvZGV7cHJvY30gZmlsZSBzeXN0ZW0gKGkuZS4gR05VL0xpbnV4KS4KKworQGl0ZW0gCitJZiB0aGUgZmlsZSBAZmlsZXsvZXRjL2djcnlwdC9maXBzX2VuYWJsZWR9IGV4aXN0cywgTGliZ2NyeXB0IGlzIHB1dAoraW50byBGSVBTIG1vZGUgYXQgaW5pdGlhbGl6YXRpb24gdGltZS4gIE5vdGUgdGhhdCB0aGlzIGZpbGVuYW1lIGlzCitoYXJkd2lyZWQgYW5kIGRvZXMgbm90IGRlcGVuZCBvbiBhbnkgY29uZmlndXJhdGlvbiBvcHRpb25zLgorCitAaXRlbSAKK0lmIHRoZSBhcHBsaWNhdGlvbiByZXF1ZXN0cyBGSVBTIG1vZGUgdXNpbmcgdGhlIGNvbnRyb2wgY29tbWFuZAorQGNvZGV7R0NSWUNUTF9GT1JDRV9GSVBTX01PREV9LiAgVGhpcyBtdXN0IGJlIGRvbmUgcHJpb3IgdG8gYW55Citpbml0aWFsaXphdGlvbiAoaS5lLiBiZWZvcmUgQGNvZGV7Z2NyeV9jaGVja192ZXJzaW9ufSkuCisKK0BlbmQgaXRlbWl6ZQorCitAY2luZGV4IEVuZm9yY2VkIEZJUFMgbW9kZQorCitJbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQgRklQUyBtb2RlLCBMaWJnY3J5cHQgbWF5IGFsc28gYmUgcHV0IGludG8KK2FuIEVuZm9yY2VkIEZJUFMgbW9kZSBieSB3cml0aW5nIGEgbm9uLXplcm8gdmFsdWUgaW50byB0aGUgZmlsZQorQGZpbGV7L2V0Yy9nY3J5cHQvZmlwc19lbmFibGVkfS4gIFRoZSBFbmZvcmNlZCBGSVBTIG1vZGUgaGVscHMgdG8KK2RldGVjdCBhcHBsaWNhdGlvbnMgd2hpY2ggZG9uJ3QgZnVsZmlsbCBhbGwgcmVxdWlyZW1lbnRzIGZvciB1c2luZworTGliZ2NyeXB0IGluIEZJUFMgbW9kZSAoQHB4cmVme0ZJUFMgTW9kZX0pLgorCitPbmNlIExpYmdjcnlwdCBoYXMgYmVlbiBwdXQgaW50byBGSVBTIG1vZGUsIGl0IGlzIG5vdCBwb3NzaWJsZSB0bworc3dpdGNoIGJhY2sgdG8gc3RhbmRhcmQgbW9kZSB3aXRob3V0IHRlcm1pbmF0aW5nIHRoZSBwcm9jZXNzIGZpcnN0LgorSWYgdGhlIGxvZ2dpbmcgdmVyYm9zaXR5IGxldmVsIG9mIExpYmdjcnlwdCBoYXMgYmVlbiBzZXQgdG8gYXQgbGVhc3QKKzIsIHRoZSBzdGF0ZSB0cmFuc2l0aW9ucyBhbmQgdGhlIHNlbGYtdGVzdHMgYXJlIGxvZ2dlZC4KKworCisKK0BjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0BjICoqKioqKioqKioqKioqKioqKiogIEdlbmVyYWwgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0BjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Bub2RlIEdlbmVyYWxpdGllcworQGNoYXB0ZXIgR2VuZXJhbGl0aWVzCisKK0BtZW51CisqIENvbnRyb2xsaW5nIHRoZSBsaWJyYXJ5OjogICAgIENvbnRyb2xsaW5nIExpYmdjcnlwdCdzIGJlaGF2aW9yLgorKiBNb2R1bGVzOjogICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiBvZiBleHRlbnNpb24gbW9kdWxlcy4KKyogRXJyb3IgSGFuZGxpbmc6OiAgICAgICAgICAgICAgRXJyb3IgY29kZXMgYW5kIHN1Y2guCitAZW5kIG1lbnUKKworQG5vZGUgQ29udHJvbGxpbmcgdGhlIGxpYnJhcnkKK0BzZWN0aW9uIENvbnRyb2xsaW5nIHRoZSBsaWJyYXJ5CisKK0BkZWZ0eXBlZnVuIGdjcnlfZXJyb3JfdCBnY3J5X2NvbnRyb2wgKGVudW0gZ2NyeV9jdGxfY21kcyBAdmFye2NtZH0sIC4uLikKKworVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbmZsdWVuY2UgdGhlIGdlbmVyYWwgYmVoYXZpb3Igb2YKK0xpYmdjcnlwdCBpbiBzZXZlcmFsIHdheXMuICBEZXBlbmRpbmcgb24gQHZhcntjbWR9LCBtb3JlCithcmd1bWVudHMgY2FuIG9yIGhhdmUgdG8gYmUgcHJvdmlkZWQuCisKK0B0YWJsZSBAY29kZQorQGl0ZW0gR0NSWUNUTF9FTkFCTEVfTV9HVUFSRDsgQXJndW1lbnRzOiBub25lCitUaGlzIGNvbW1hbmQgZW5hYmxlcyB0aGUgYnVpbHQtaW4gbWVtb3J5IGd1YXJkLiAgSXQgbXVzdCBub3QgYmUgdXNlZCB0bworYWN0aXZhdGUgdGhlIG1lbW9yeSBndWFyZCBhZnRlciB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgaGFzIGFscmVhZHkgYmVlbgordXNlZDsgdGhlcmVmb3JlIGl0IGNhbiBPTkxZIGJlIHVzZWQgYXQgaW5pdGlhbGl6YXRpb24gdGltZS4gIE5vdGUgdGhhdAordGhlIG1lbW9yeSBndWFyZCBpcyBOT1QgdXNlZCB3aGVuIHRoZSB1c2VyIG9mIHRoZSBsaWJyYXJ5IGhhcyBzZXQgaGlzCitvd24gbWVtb3J5IG1hbmFnZW1lbnQgY2FsbGJhY2tzLgorCitAaXRlbSBHQ1JZQ1RMX0VOQUJMRV9RVUlDS19SQU5ET007IEFyZ3VtZW50czogbm9uZQorVGhpcyBjb21tYW5kIGluaGliaXRzIHRoZSB1c2UgdGhlIHZlcnkgc2VjdXJlIHJhbmRvbSBxdWFsaXR5IGxldmVsCisoQGNvZGV7R0NSWV9WRVJZX1NUUk9OR19SQU5ET019KSBhbmQgZGVncmFkZXMgYWxsIHJlcXVlc3QgZG93biB0bworQGNvZGV7R0NSWV9TVFJPTkdfUkFORE9NfS4gIEluIGdlbmVyYWwgdGhpcyBpcyBub3QgcmVjb21tZW5lZC4gIEhvd2V2ZXIsCitmb3Igc29tZSBhcHBsaWNhdGlvbnMgdGhlIGV4dHJhIHF1YWxpdHkgcmFuZG9tIExpYmdjcnlwdCB0cmllcyB0byBjcmVhdGUKK2lzIG5vdCBqdXN0aWZpZWQgYW5kIHRoaXMgb3B0aW9uIG1heSBoZWxwIHRvIGdldCBiZXR0ZXIgcGVyZm9ybWFjZS4KK1BsZWFzZSBjaGVjayB3aXRoIGEgY3J5cHRvIGV4cGVydCB3aGV0aGVyIHRoaXMgb3B0aW9uIGNhbiBiZSB1c2VkIGZvcgoreW91ciBhcHBsaWNhdGlvbi4KKworVGhpcyBvcHRpb24gY2FuIG9ubHkgYmUgdXNlZCBhdCBpbml0aWFsaXphdGlvbiB0aW1lLgorCisKK0BpdGVtIEdDUllDVExfRFVNUF9SQU5ET01fU1RBVFM7IEFyZ3VtZW50czogbm9uZQorVGhpcyBjb21tYW5kIGR1bXBzIHJhbmR1bSBudW1iZXIgZ2VuZXJhdG9yIHJlbGF0ZWQgc3RhdGlzdGljcyB0byB0aGUKK2xpYnJhcnkncyBsb2dnaW5nIHN0cmVhbS4KKworQGl0ZW0gR0NSWUNUTF9EVU1QX01FTU9SWV9TVEFUUzsgQXJndW1lbnRzOiBub25lCitUaGlzIGNvbW1hbmQgZHVtcHMgbWVtb3J5IG1hbmFnbWVudCByZWxhdGVkIHN0YXRpc3RpY3MgdG8gdGhlIGxpYnJhcnkncworbG9nZ2luZyBzdHJlYW0uCisKK0BpdGVtIEdDUllDVExfRFVNUF9TRUNNRU1fU1RBVFM7IEFyZ3VtZW50czogbm9uZQorVGhpcyBjb21tYW5kIGR1bXBzIHNlY3VyZSBtZW1vcnkgbWFuYW1nZW50IHJlbGF0ZWQgc3RhdGlzdGljcyB0byB0aGUKK2xpYnJhcnkncyBsb2dnaW5nIHN0cmVhbS4KKworQGl0ZW0gR0NSWUNUTF9EUk9QX1BSSVZTOyBBcmd1bWVudHM6IG5vbmUKK1RoaXMgY29tbWFuZCBkaXNhYmxlcyB0aGUgdXNlIG9mIHNlY3VyZSBtZW1vcnkgYW5kIGRyb3BzIHRoZSBwcml2aWxpZ2VzCitvZiB0aGUgY3VycmVudCBwcm9jZXNzLiAgVGhpcyBjb21tYW5kIGhhcyBub3QgbXVjaCB1c2U7IHRoZSBzdWdnZXN0ZWQgd2F5Cit0byBkaXNhYmxlIHNlY3VyZSBtZW1vcnkgaXMgdG8gdXNlIEBjb2Rle0dDUllDVExfRElTQUJMRV9TRUNNRU19IHJpZ2h0CithZnRlciBpbml0aWFsaXphdGlvbi4KKworQGl0ZW0gR0NSWUNUTF9ESVNBQkxFX1NFQ01FTTsgQXJndW1lbnRzOiBub25lCitUaGlzIGNvbW1hbmQgZGlzYWJsZXMgdGhlIHVzZSBvZiBzZWN1cmUgbWVtb3J5LiAgSWYgdGhpcyBjb21tYW5kIGlzCit1c2VkIGluIEZJUFMgbW9kZSwgRklQUyBtb2RlIHdpbGwgYmUgZGlzYWJsZWQgYW5kIHRoZSBmdW5jdGlvbgorQGNvZGV7Z2NyeV9maXBzX21vZGVfYWN0aXZlfSByZXR1cm5zIGZhbHNlLiAgSG93ZXZlciwgaW4gRW5mb3JjZWQgRklQUworbW9kZSB0aGlzIGNvbW1hbmQgaGFzIG5vIGVmZmVjdCBhdCBhbGwuCisKK01hbnkgYXBwbGljYXRpb25zIGRvIG5vdCByZXF1aXJlIHNlY3VyZSBtZW1vcnksIHNvIHRoZXkgc2hvdWxkIGRpc2FibGUKK2l0IHJpZ2h0IGF3YXkuICBUaGlzIGNvbW1hbmQgc2hvdWxkIGJlIGV4ZWN1dGVkIHJpZ2h0IGFmdGVyCitAY29kZXtnY3J5X2NoZWNrX3ZlcnNpb259LiAKKworQGl0ZW0gR0NSWUNUTF9JTklUX1NFQ01FTTsgQXJndW1lbnRzOiBpbnQgbmJ5dGVzCitUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBhbGxvY2F0ZSBhIHBvb2wgb2Ygc2VjdXJlIG1lbW9yeSBhbmQgdGh1cworZW5hYmxpbmcgdGhlIHVzZSBvZiBzZWN1cmUgbWVtb3J5LiAgSXQgYWxzbyBkcm9wcyBhbGwgZXh0cmEgcHJpdmlsZWdlcwordGhlIHByb2Nlc3MgaGFzIChpLmUuIGlmIGl0IGlzIHJ1biBhcyBzZXR1aWQgKHJvb3QpKS4gIElmIHRoZSBhcmd1bWVudAorQHZhcntuYnl0ZXN9IGlzIDAsIHNlY3VyZSBtZW1vcnkgd2lsbCBiZSBkaXNhYmxlZC4gIFRoZSBtaW5pbXVtIGFtb3VudAorb2Ygc2VjdXJlIG1lbW9yeSBhbGxvY2F0ZWQgaXMgY3VycmVudGx5IDE2Mzg0IGJ5dGVzOyB5b3UgbWF5IHRodXMgdXNlIGEKK3ZhbHVlIG9mIDEgdG8gcmVxdWVzdCB0aGF0IGRlZmF1bHQgc2l6ZS4KKworQGl0ZW0gR0NSWUNUTF9URVJNX1NFQ01FTTsgQXJndW1lbnRzOiBub25lCitUaGlzIGNvbW1hbmQgemVyb2lzZXMgdGhlIHNlY3VyZSBtZW1vcnkgYW5kIGRlc3Ryb3lzIHRoZSBoYW5kbGVyLiAgVGhlCitzZWN1cmUgbWVtb3J5IHBvb2wgbWF5IG5vdCBiZSB1c2VkIGFueW1vcmUgYWZ0ZXIgcnVubmluZyB0aGlzIGNvbW1hbmQuCitJZiB0aGUgc2VjdXJlIG1lbW9yeSBwb29sIGFzIGFscmVhZHkgYmVlbiBkZXN0cm95ZWQsIHRoaXMgY29tbWFuZCBoYXMKK25vIGVmZmVjdC4gIEFwcGxpY2F0aW9ucyBtaWdodCB3YW50IHRvIHJ1biB0aGlzIGNvbW1hbmQgZnJvbSB0aGVpcgorZXhpdCBoYW5kbGVyIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBzZWN1cmUgbWVtb3J5IGdldHMgcHJvcGVybHkKK2Rlc3Ryb3llZC4gIFRoaXMgY29tbWFuZCBpcyBub3QgbmVjZXNzYXJpbHkgdGhyZWFkLXNhZmUgYnV0IHRoYXQKK3Nob3VsZCBub3QgYmUgbmVlZGVkIGluIGNsZWFudXAgY29kZS4gIEl0IG1heSBiZSBjYWxsZWQgZnJvbSBhIHNpZ25hbAoraGFuZGxlci4KKworQGl0ZW0gR0NSWUNUTF9ESVNBQkxFX1NFQ01FTV9XQVJOOyBBcmd1bWVudHM6IG5vbmUKK0Rpc2FibGUgd2FybmluZyBtZXNzYWdlcyBhYm91dCBwcm9ibGVtcyB3aXRoIHRoZSBzZWN1cmUgbWVtb3J5CitzdWJzeXN0ZW0uIFRoaXMgY29tbWFuZCBzaG91bGQgYmUgcnVuIHJpZ2h0IGFmdGVyCitAY29kZXtnY3J5X2NoZWNrX3ZlcnNpb259LgorCitAaXRlbSBHQ1JZQ1RMX1NVU1BFTkRfU0VDTUVNX1dBUk47IEFyZ3VtZW50czogbm9uZQorUG9zdHBvbmUgd2FybmluZyBtZXNzYWdlcyBmcm9tIHRoZSBzZWN1cmUgbWVtb3J5IHN1YnN5c3RlbS4gCitAeHJlZntzYW1wbGUtdXNlLXN1c3BlbmQtc2VjbWVtLCx0aGUgaW5pdGlhbGl6YXRpb24gZXhhbXBsZX0sIG9uIGhvdyB0bwordXNlIGl0LiAKKworQGl0ZW0gR0NSWUNUTF9SRVNVTUVfU0VDTUVNX1dBUk47IEFyZ3VtZW50czogbm9uZQorUmVzdW1lIHdhcm5pbmcgbWVzc2FnZXMgZnJvbSB0aGUgc2VjdXJlIG1lbW9yeSBzdWJzeXN0ZW0uCitAeHJlZntzYW1wbGUtdXNlLXJlc3VtZS1zZWNtZW0sLHRoZSBpbml0aWFsaXphdGlvbiBleGFtcGxlfSwgb24gaG93IHRvCit1c2UgaXQuCisKK0BpdGVtIEdDUllDVExfVVNFX1NFQ1VSRV9STkRQT09MOyBBcmd1bWVudHM6IG5vbmUKK1RoaXMgY29tbWFuZCB0ZWxscyB0aGUgUFJORyB0byBzdG9yZSByYW5kb20gbnVtYmVycyBpbiBzZWN1cmUgbWVtb3J5LgorVGhpcyBjb21tYW5kIHNob3VsZCBiZSBydW4gcmlnaHQgYWZ0ZXIgQGNvZGV7Z2NyeV9jaGVja192ZXJzaW9ufSBhbmQgbm90CitsYXRlciB0aGFuIHRoZSBjb21tYW5kIEdDUllDVExfSU5JVF9TRUNNRU0uICBOb3RlIHRoYXQgaW4gRklQUyBtb2RlIHRoZQorc2VjdXJlIG1lbW9yeSBpcyBhbHdheXMgdXNlZC4KKworQGl0ZW0gR0NSWUNUTF9TRVRfUkFORE9NX1NFRURfRklMRTsgQXJndW1lbnRzOiBjb25zdCBjaGFyICpmaWxlbmFtZQorVGhpcyBjb21tYW5kIHNwZWNpZmllcyB0aGUgZmlsZSwgd2hpY2ggaXMgdG8gYmUgdXNlZCBhcyBzZWVkIGZpbGUgZm9yCit0aGUgUFJORy4gIElmIHRoZSBzZWVkIGZpbGUgaXMgcmVnaXN0ZXJlZCBwcmlvciB0byBpbml0aWFsaXphdGlvbiBvZiB0aGUKK1BSTkcsIHRoZSBzZWVkIGZpbGUncyBjb250ZW50IChpZiBpdCBleGlzdHMgYW5kIHNlZW1zIHRvIGJlIHZhbGlkKSBpcworZmVkIGludG8gdGhlIFBSTkcgcG9vbC4gIEFmdGVyIHRoZSBzZWVkIGZpbGUgaGFzIGJlZW4gcmVnaXN0ZXJlZCwgdGhlCitQUk5HIGNhbiBiZSBzaWduYWxsZWQgdG8gd3JpdGUgb3V0IHRoZSBQUk5HIHBvb2wncyBjb250ZW50IGludG8gdGhlIHNlZWQKK2ZpbGUgd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1hbmQuCisKKworQGl0ZW0gR0NSWUNUTF9VUERBVEVfUkFORE9NX1NFRURfRklMRTsgQXJndW1lbnRzOiBub25lCitXcml0ZSBvdXQgdGhlIFBSTkcgcG9vbCdzIGNvbnRlbnQgaW50byB0aGUgcmVnaXN0ZXJlZCBzZWVkIGZpbGUuCisKK011bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgYXBwbGljYXRpb25zIHNoYXJpbmcgdGhlIHNhbWUgcmFuZG9tIHNlZWQgZmlsZQorY2FuIGJlIHN0YXJ0ZWQgaW4gcGFyYWxsZWwsIGluIHdoaWNoIGNhc2UgdGhleSB3aWxsIHJlYWQgb3V0IHRoZSBzYW1lCitwb29sIGFuZCB0aGVuIHJhY2UgZm9yIHVwZGF0aW5nIGl0ICh0aGUgbGFzdCB1cGRhdGUgb3ZlcndyaXRlcyBlYXJsaWVyCit1cGRhdGVzKS4gIFRoZXkgd2lsbCBkaWZmZXJlbnRpYXRlIG9ubHkgYnkgdGhlIHdlYWsgZW50cm9weSB0aGF0IGlzCithZGRlZCBpbiByZWFkX3NlZWRfZmlsZSBiYXNlZCBvbiB0aGUgUElEIGFuZCBjbG9jaywgYW5kIHVwIHRvIDE2IGJ5dGVzCitvZiB3ZWFrIHJhbmRvbSBub24tYmxvY2tpbmdseS4gIFRoZSBjb25zZXF1ZW5jZSBpcyB0aGF0IHRoZSBvdXRwdXQgb2YKK3RoZXNlIGRpZmZlcmVudCBpbnN0YW5jZXMgaXMgY29ycmVsYXRlZCB0byBzb21lIGV4dGVudC4gIEluIGEgcGVyZmVjdAorYXR0YWNrIHNjZW5hcmlvLCB0aGUgYXR0YWNrZXIgY2FuIGNvbnRyb2wgKG9yIGF0IGxlYXN0IGd1ZXNzKSB0aGUgUElECithbmQgY2xvY2sgb2YgdGhlIGFwcGxpY2F0aW9uLCBhbmQgZHJhaW4gdGhlIHN5c3RlbSdzIGVudHJvcHkgcG9vbCB0bworcmVkdWNlIHRoZSAidXAgdG8gMTYgYnl0ZXMiIGFib3ZlIHRvIDAuICBUaGVuIHRoZSBkZXBlbmRlbmNpZXMgb2YgdGhlCitpbml0YWwgc3RhdGVzIG9mIHRoZSBwb29scyBhcmUgY29tcGxldGVseSBrbm93bi4gIE5vdGUgdGhhdCB0aGlzIGlzIG5vdAorYW4gaXNzdWUgaWYgcmFuZG9tIG9mIEBjb2Rle0dDUllfVkVSWV9TVFJPTkdfUkFORE9NfSBxdWFsaXR5IGlzCityZXF1ZXN0ZWQgYXMgaW4gdGhpcyBjYXNlIGVub3VnaCBleHRyYSBlbnRyb3B5IGdldHMgbWl4ZWQuICBJdCBpcyBhbHNvCitub3QgYW4gaXNzdWUgd2hlbiB1c2luZyBMaW51eCAocm5kbGludXggZHJpdmVyKSwgYmVjYXVzZSB0aGlzIG9uZQorZ3VhcmFudGVlcyB0byByZWFkIGZ1bGwgMTYgYnl0ZXMgZnJvbSAvZGV2L3VyYW5kb20gYW5kIHRodXMgdGhlcmUgaXMgbm8KK3dheSBmb3IgYW4gYXR0YWNrZXIgd2l0aG91dCBrZXJuZWwgYWNjZXNzIHRvIGNvbnRyb2wgdGhlc2UgMTYgYnl0ZXMuCisKK0BpdGVtIEdDUllDVExfU0VUX1ZFUkJPU0lUWTsgQXJndW1lbnRzOiBpbnQgbGV2ZWwKK1RoaXMgY29tbWFuZCBzZXRzIHRoZSB2ZXJib3NpdHkgb2YgdGhlIGxvZ2dpbmcuICBBIGxldmVsIG9mIDAgZGlzYWJsZXMKK2FsbCBleHRyYSBsb2dnaW5nIHdoZXJlYXMgcG9zaXRpdmUgbnVtYmVycyBlbmFibGUgbW9yZSB2ZXJib3NlIGxvZ2dpbmcuCitUaGUgbGV2ZWwgbWF5IGJlIGNoYW5nZWQgYXQgYW55IHRpbWUgYnV0IGJlIGF3YXJlIHRoYXQgbm8gbWVtb3J5CitzeW5jaHJvbml6YXRpb24gaXMgZG9uZSBzbyB0aGUgZWZmZWN0IG9mIHRoaXMgY29tbWFuZCBtaWdodCBub3QKK2ltbWVkaWF0ZWx5IHNob3cgdXAgaW4gb3RoZXIgdGhyZWFkcy4gIFRoaXMgY29tbWFuZCBtYXkgZXZlbiBiZSB1c2VkCitwcmlvciB0byBAY29kZXtnY3J5X2NoZWNrX3ZlcnNpb259LgorCitAaXRlbSBHQ1JZQ1RMX1NFVF9ERUJVR19GTEFHUzsgQXJndW1lbnRzOiB1bnNpZ25lZCBpbnQgZmxhZ3MKK1NldCB0aGUgZGVidWcgZmxhZyBiaXRzIGFzIGdpdmVuIGJ5IHRoZSBhcmd1bWVudC4gIEJlIGF3YXJlIHRoYXQgdGhhdCBubworbWVtb3J5IHN5bmNocm9uaXphdGlvbiBpcyBkb25lIHNvIHRoZSBlZmZlY3Qgb2YgdGhpcyBjb21tYW5kIG1pZ2h0IG5vdAoraW1tZWRpYXRlbHkgc2hvdyB1cCBpbiBvdGhlciB0aHJlYWRzLiAgVGhlIGRlYnVnIGZsYWdzIGFyZSBub3QKK2NvbnNpZGVyZWQgcGFydCBvZiB0aGUgQVBJIGFuZCB0aHVzIG1heSBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuICBBcyBvZgorbm93IGJpdCAwIGVuYWJsZXMgZGVidWdnaW5nIG9mIGNpcGhlciBmdW5jdGlvbnMgYW5kIGJpdCAxIGRlYnVnZ2luZyBvZgorbXVsdGktcHJlY2lzaW9uLWludGVnZXJzLiAgVGhpcyBjb21tYW5kIG1heSBldmVuIGJlIHVzZWQgcHJpb3IgdG8KK0Bjb2Rle2djcnlfY2hlY2tfdmVyc2lvbn0uCisKK0BpdGVtIEdDUllDVExfQ0xFQVJfREVCVUdfRkxBR1M7IEFyZ3VtZW50czogdW5zaWduZWQgaW50IGZsYWdzCitTZXQgdGhlIGRlYnVnIGZsYWcgYml0cyBhcyBnaXZlbiBieSB0aGUgYXJndW1lbnQuICBCZSBhd2FyZSB0aGF0IHRoYXQgbm8KK21lbW9yeSBzeW5jaHJvbml6YXRpb24gaXMgZG9uZSBzbyB0aGUgZWZmZWN0IG9mIHRoaXMgY29tbWFuZCBtaWdodCBub3QKK2ltbWVkaWF0ZWx5IHNob3cgdXAgaW4gb3RoZXIgdGhyZWFkcy4gIFRoaXMgY29tbWFuZCBtYXkgZXZlbiBiZSB1c2VkCitwcmlvciB0byBAY29kZXtnY3J5X2NoZWNrX3ZlcnNpb259LgorCitAaXRlbSBHQ1JZQ1RMX0RJU0FCTEVfSU5URVJOQUxfTE9DS0lORzsgQXJndW1lbnRzOiBub25lCitUaGlzIGNvbW1hbmQgZG9lcyBub3RoaW5nLiAgSXQgZXhpc3RzIG9ubHkgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisKK0BpdGVtIEdDUllDVExfQU5ZX0lOSVRJQUxJWkFUSU9OX1A7IEFyZ3VtZW50czogbm9uZQorVGhpcyBjb21tYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGUgbGlicmFyeSBoYXMgYmVlbiBiYXNpY2FsbHkgaW5pdGlhbGl6ZWQuCitTdWNoIGEgYmFzaWMgaW5pdGlhbGl6YXRpb24gaGFwcGVucyBpbXBsaWNpdGx5IHdpdGggbWFueSBjb21tYW5kcyB0byBnZXQKK2NlcnRhaW4gaW50ZXJuYWwgc3Vic3lzdGVtcyBydW5uaW5nLiAgVGhlIGNvbW1vbiBhbmQgc3VnZ2VzdGVkIHdheSB0bworZG8gdGhpcyBiYXNpYyBpbnRpYWxpemF0aW9uIGlzIGJ5IGNhbGxpbmcgZ2NyeV9jaGVja192ZXJzaW9uLgorCitAaXRlbSBHQ1JZQ1RMX0lOSVRJQUxJWkFUSU9OX0ZJTklTSEVEOyBBcmd1bWVudHM6IG5vbmUKK1RoaXMgY29tbWFuZCB0ZWxscyB0aGUgbGlicmF5IHRoYXQgdGhlIGFwcGxpY2F0aW9uIGhhcyBmaW5pc2hlZCB0aGUKK2ludGlhbGl6YXRpb24uCisKK0BpdGVtIEdDUllDVExfSU5JVElBTElaQVRJT05fRklOSVNIRURfUDsgQXJndW1lbnRzOiBub25lCitUaGlzIGNvbW1hbmQgcmV0dXJucyB0cnVlIGlmIHRoZSBjb21tYW5kQCoKK0dDUllDVExfSU5JVElBTElaQVRJT05fRklOSVNIRUQgaGFzIGFscmVhZHkgYmVlbiBydW4uCisKK0BpdGVtIEdDUllDVExfU0VUX1RIUkVBRF9DQlM7IEFyZ3VtZW50czogc3RydWN0IGF0aF9vcHMgKmF0aF9vcHMKK1RoaXMgY29tbWFuZCByZWdpc3RlcnMgYSB0aHJlYWQtY2FsbGJhY2sgc3RydWN0dXJlLgorQHhyZWZ7TXVsdGktVGhyZWFkaW5nfS4KKworQGl0ZW0gR0NSWUNUTF9GQVNUX1BPTEw7IEFyZ3VtZW50czogbm9uZQorUnVuIGEgZmFzdCByYW5kb20gcG9sbC4KKworQGl0ZW0gR0NSWUNUTF9TRVRfUk5ERUdEX1NPQ0tFVDsgQXJndW1lbnRzOiBjb25zdCBjaGFyICpmaWxlbmFtZQorVGhpcyBjb21tYW5kIG1heSBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IG5hbWUgb2YgdGhlIEVHRCBzb2NrZXQKK3RvIGNvbm5lY3QgdG8uICBJdCBtYXkgYmUgdXNlZCBvbmx5IGR1cmluZyBpbml0aWFsaXphdGlvbiBhcyBpdCBpcyBub3QKK3RocmVhZCBzYWZlLiAgQ2hhbmdpbmcgdGhlIHNvY2tldCBuYW1lIGFnYWluIGlzIG5vdCBzdXBwb3J0ZWQuICBUaGUKK2Z1bmN0aW9uIG1heSByZXR1cm4gYW4gZXJyb3IgaWYgdGhlIGdpdmVuIGZpbGVuYW1lIGlzIHRvbyBsb25nIGZvciBhCitsb2NhbCBzb2NrZXQgbmFtZS4KKworRUdEIGlzIGFuIGFsdGVybmF0aXZlIHJhbmRvbSBnYXRoZXJlciwgdXNlZCBvbmx5IG9uIHN5c3RlbXMgbGFja2luZyBhCitwcm9wZXIgcmFuZG9tIGRldmljZS4KKworQGl0ZW0gR0NSWUNUTF9QUklOVF9DT05GSUc7IEFyZ3VtZW50czogRklMRSAqc3RyZWFtCitUaGlzIGNvbW1hbmQgZHVtcHMgaW5mb3JtYXRpb24gcGVydGFpbmluZyB0byB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUKK2xpYnJhcnkgdG8gdGhlIGdpdmVuIHN0cmVhbS4gIElmIE5VTEwgaXMgZ2l2ZW4gZm9yIEB2YXJ7c3RyZWFtfSwgdGhlIGxvZworc3lzdGVtIGlzIHVzZWQuICBUaGlzIGNvbW1hbmQgbWF5IGJlIHVzZWQgYmVmb3JlIHRoZSBpbnRpYWxpemF0aW9uIGhhcworYmVlbiBmaW5pc2hlZCBidXQgbm90IGJlZm9yZSBhIGdjcnlfdmVyc2lvbl9jaGVjay4KKworQGl0ZW0gR0NSWUNUTF9PUEVSQVRJT05BTF9QOyBBcmd1bWVudHM6IG5vbmUKK1RoaXMgY29tbWFuZCByZXR1cm5zIHRydWUgaWYgdGhlIGxpYnJhcnkgaXMgaW4gYW4gb3BlcmF0aW9uYWwgc3RhdGUuCitUaGlzIGluZm9ybWF0aW9uIG1ha2VzIG9ubHkgc2Vuc2UgaW4gRklQUyBtb2RlLiAgSW4gY29udHJhc3QgdG8gb3RoZXIKK2Z1bmN0aW9ucywgdGhpcyBpcyBhIHB1cmUgdGVzdCBmdW5jdGlvbiBhbmQgd29uJ3QgcHV0IHRoZSBsaWJyYXJ5IGludG8KK0ZJUFMgbW9kZSBvciBjaGFuZ2UgdGhlIGludGVybmFsIHN0YXRlLiAgVGhpcyBjb21tYW5kIG1heSBiZSB1c2VkIGJlZm9yZQordGhlIGludGlhbGl6YXRpb24gaGFzIGJlZW4gZmluaXNoZWQgYnV0IG5vdCBiZWZvcmUgYSBnY3J5X3ZlcnNpb25fY2hlY2suCisKK0BpdGVtIEdDUllDVExfRklQU19NT0RFX1A7IEFyZ3VtZW50czogbm9uZQorVGhpcyBjb21tYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGUgbGlicmFyeSBpcyBpbiBGSVBTIG1vZGUuICBOb3RlLCB0aGF0Cit0aGlzIGlzIG5vIGluZGljYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGxpYnJhcnkuICBUaGlzCitjb21tYW5kIG1heSBiZSB1c2VkIGJlZm9yZSB0aGUgaW50aWFsaXphdGlvbiBoYXMgYmVlbiBmaW5pc2hlZCBidXQgbm90CitiZWZvcmUgYSBnY3J5X3ZlcnNpb25fY2hlY2suICBBbiBhcHBsaWNhdGlvbiBtYXkgdXNlIHRoaXMgY29tbWFuZCBvcgordGhlIGNvbnZlbmllbmNlIG1hY3JvIGJlbG93IHRvIGNoZWNrIHdoZXRoZXIgRklQUyBtb2RlIGlzIGFjdHVhbGx5CithY3RpdmUuCisKK0BkZWZ0eXBlZnVuIGludCBnY3J5X2ZpcHNfbW9kZV9hY3RpdmUgKHZvaWQpCisKK1JldHVybnMgdHJ1ZSBpZiB0aGUgRklQUyBtb2RlIGlzIGFjdGl2ZS4gIE5vdGUgdGhhdCB0aGlzIGlzCitpbXBsZW1lbnRlZCBhcyBhIG1hY3JvLgorQGVuZCBkZWZ0eXBlZnVuCisKKworCitAaXRlbSBHQ1JZQ1RMX0ZPUkNFX0ZJUFNfTU9ERTsgQXJndW1lbnRzOiBub25lCitSdW5uaW5nIHRoaXMgY29tbWFuZCBwdXRzIHRoZSBsaWJyYXJ5IGludG8gRklQUyBtb2RlLiAgSWYgdGhlIGxpYnJhcnkgaXMKK2FscmVhZHkgaW4gRklQUyBtb2RlLCBhIHNlbGYtdGVzdCBpcyB0cmlnZ2VyZWQgYW5kIHRodXMgdGhlIGxpYnJhcnkgd2lsbAorYmUgcHV0IGludG8gb3BlcmF0aW9uYWwgc3RhdGUuICBUaGlzIGNvbW1hbmQgbWF5IGJlIHVzZWQgYmVmb3JlIGEgY2FsbAordG8gZ2NyeV9jaGVja192ZXJzaW9uIGFuZCB0aGF0IGlzIGFjdHVhbGx5IHRoZSByZWNvbW1lbmRlZCB3YXkgdG8gbGV0IGFuCithcHBsaWNhdGlvbiBzd2l0Y2ggdGhlIGxpYnJhcnkgaW50byBGSVBTIG1vZGUuICBOb3RlIHRoYXQgTGliZ2NyeXB0IHdpbGwKK3JlamVjdCBhbiBhdHRlbXB0IHRvIHN3aXRjaCB0byBmaXBzIG1vZGUgZHVyaW5nIG9yIGFmdGVyIHRoZSBpbnRpYWxpemF0aW9uLgorCitAaXRlbSBHQ1JZQ1RMX1NFTEZURVNUOyBBcmd1bWVudHM6IG5vbmUKK1RoaXMgbWF5IGJlIHVzZWQgYXQgYW55dGltZSB0byBoYXZlIHRoZSBsaWJyYXJ5IHJ1biBhbGwgaW1wbGVtZW50ZWQKK3NlbGYtdGVzdHMuICBJdCB3b3JrcyBpbiBzdGFuZGFyZCBhbmQgaW4gRklQUyBtb2RlLiAgUmV0dXJucyAwIG9uCitzdWNjZXNzIG9yIGFuIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKworCitAZW5kIHRhYmxlCisKK0BlbmQgZGVmdHlwZWZ1bgorCitAbm9kZSBNb2R1bGVzCitAc2VjdGlvbiBNb2R1bGVzCisKK0xpYmdjcnlwdCBzdXBwb3J0cyB0aGUgdXNlIG9mIGBleHRlbnNpb24gbW9kdWxlcycsIHdoaWNoCitpbXBsZW1lbnQgYWxnb3JpdGhtcyBpbiBhZGRpdGlvbiB0byB0aG9zZSBhbHJlYWR5IGJ1aWx0IGludG8gdGhlIGxpYnJhcnkKK2RpcmVjdGx5LgorCitAZGVmdHAge0RhdGEgdHlwZX0gZ2NyeV9tb2R1bGVfdAorVGhpcyBkYXRhIHR5cGUgcmVwcmVzZW50cyBhIGBtb2R1bGUnLgorQGVuZCBkZWZ0cAorCitGdW5jdGlvbnMgcmVnaXN0ZXJpbmcgbW9kdWxlcyBwcm92aWRlZCBieSB0aGUgdXNlciB0YWtlIGEgYG1vZHVsZQorc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUnIGFzIGlucHV0IGFuZCByZXR1cm4gYSB2YWx1ZSBvZgorQGNvZGV7Z2NyeV9tb2R1bGVfdH0gYW5kIGFuIElEIHRoYXQgaXMgdW5pcXVlIGluIHRoZSBtb2R1bGVzJworY2F0ZWdvcnkuICBUaGlzIElEIGNhbiBiZSB1c2VkIHRvIHJlZmVyZW5jZSB0aGUgbmV3bHkgcmVnaXN0ZXJlZAorbW9kdWxlLiAgQWZ0ZXIgcmVnaXN0ZXJpbmcgYSBtb2R1bGUgc3VjY2Vzc2Z1bGx5LCB0aGUgbmV3IGZ1bmN0aW9uYWxpdHkKK3Nob3VsZCBiZSBhYmxlIHRvIGJlIHVzZWQgdGhyb3VnaCB0aGUgbm9ybWFsIGZ1bmN0aW9ucyBwcm92aWRlZCBieQorTGliZ2NyeXB0IHVudGlsIGl0IGlzIHVucmVnaXN0ZXJlZCBhZ2Fpbi4KKworQGMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQGMgKioqKioqKioqKioqKioqKioqKiAgRXJyb3JzICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitAYyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitAbm9kZSBFcnJvciBIYW5kbGluZworQHNlY3Rpb24gRXJyb3IgSGFuZGxpbmcKKworTWFueSBmdW5jdGlvbnMgaW4gTGliZ2NyeXB0IGNhbiByZXR1cm4gYW4gZXJyb3IgaWYgdGhleQorZmFpbC4gIEZvciB0aGlzIHJlYXNvbiwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBhbHdheXMgY2F0Y2ggdGhlIGVycm9yCitjb25kaXRpb24gYW5kIHRha2UgYXBwcm9wcmlhdGUgbWVhc3VyZXMsIGZvciBleGFtcGxlIGJ5IHJlbGVhc2luZyB0aGUKK3Jlc291cmNlcyBhbmQgcGFzc2luZyB0aGUgZXJyb3IgdXAgdG8gdGhlIGNhbGxlciwgb3IgYnkgZGlzcGxheWluZyBhCitkZXNjcmlwdGl2ZSBtZXNzYWdlIHRvIHRoZSB1c2VyIGFuZCBjYW5jZWxsaW5nIHRoZSBvcGVyYXRpb24uCisKK1NvbWUgZXJyb3IgdmFsdWVzIGRvIG5vdCBpbmRpY2F0ZSBhIHN5c3RlbSBlcnJvciBvciBhbiBlcnJvciBpbiB0aGUKK29wZXJhdGlvbiwgYnV0IHRoZSByZXN1bHQgb2YgYW4gb3BlcmF0aW9uIHRoYXQgZmFpbGVkIHByb3Blcmx5LiAgRm9yCitleGFtcGxlLCBpZiB5b3UgdHJ5IHRvIGRlY3J5cHQgYSB0ZW1wZXJlZCBtZXNzYWdlLCB0aGUgZGVjcnlwdGlvbiB3aWxsCitmYWlsLiAgQW5vdGhlciBlcnJvciB2YWx1ZSBhY3R1YWxseSBtZWFucyB0aGF0IHRoZSBlbmQgb2YgYSBkYXRhCitidWZmZXIgb3IgbGlzdCBoYXMgYmVlbiByZWFjaGVkLiAgVGhlIGZvbGxvd2luZyBkZXNjcmlwdGlvbnMgZXhwbGFpbgorZm9yIG1hbnkgZXJyb3IgY29kZXMgd2hhdCB0aGV5IG1lYW4gdXN1YWxseS4gIFNvbWUgZXJyb3IgdmFsdWVzIGhhdmUKK3NwZWNpZmljIG1lYW5pbmdzIGlmIHJldHVybmVkIGJ5IGEgY2VydGFpbiBmdW5jdGlvbnMuICBTdWNoIGNhc2VzIGFyZQorZGVzY3JpYmVkIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRob3NlIGZ1bmN0aW9ucy4KKworTGliZ2NyeXB0IHVzZXMgdGhlIEBjb2Rle2xpYmdwZy1lcnJvcn0gbGlicmFyeS4gIFRoaXMgYWxsb3dzIHRvIHNoYXJlCit0aGUgZXJyb3IgY29kZXMgd2l0aCBvdGhlciBjb21wb25lbnRzIG9mIHRoZSBHbnVQRyBzeXN0ZW0sIGFuZCB0byBwYXNzCitlcnJvciB2YWx1ZXMgdHJhbnNwYXJlbnRseSBmcm9tIHRoZSBjcnlwdG8gZW5naW5lLCBvciBzb21lIGhlbHBlcgorYXBwbGljYXRpb24gb2YgdGhlIGNyeXB0byBlbmdpbmUsIHRvIHRoZSB1c2VyLiAgVGhpcyB3YXkgbm8KK2luZm9ybWF0aW9uIGlzIGxvc3QuICBBcyBhIGNvbnNlcXVlbmNlLCBMaWJnY3J5cHQgZG9lcyBub3QgdXNlIGl0cyBvd24KK2lkZW50aWZpZXJzIGZvciBlcnJvciBjb2RlcywgYnV0IHVzZXMgdGhvc2UgcHJvdmlkZWQgYnkKK0Bjb2Rle2xpYmdwZy1lcnJvcn0uICBUaGV5IHVzdWFsbHkgc3RhcnQgd2l0aCBAY29kZXtHUEdfRVJSX30uCisKK0hvd2V2ZXIsIExpYmdjcnlwdCBkb2VzIHByb3ZpZGUgYWxpYXNlcyBmb3IgdGhlIGZ1bmN0aW9ucworZGVmaW5lZCBpbiBsaWJncGctZXJyb3IsIHdoaWNoIG1pZ2h0IGJlIHByZWZlcnJlZCBmb3IgbmFtZSBzcGFjZQorY29uc2lzdGVuY3kuCisKKworTW9zdCBmdW5jdGlvbnMgaW4gTGliZ2NyeXB0IHJldHVybiBhbiBlcnJvciBjb2RlIGluIHRoZSBjYXNlCitvZiBmYWlsdXJlLiAgRm9yIHRoaXMgcmVhc29uLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGFsd2F5cyBjYXRjaCB0aGUKK2Vycm9yIGNvbmRpdGlvbiBhbmQgdGFrZSBhcHByb3ByaWF0ZSBtZWFzdXJlcywgZm9yIGV4YW1wbGUgYnkKK3JlbGVhc2luZyB0aGUgcmVzb3VyY2VzIGFuZCBwYXNzaW5nIHRoZSBlcnJvciB1cCB0byB0aGUgY2FsbGVyLCBvciBieQorZGlzcGxheWluZyBhIGRlc2NyaXB0aXZlIG1lc3NhZ2UgdG8gdGhlIHVzZXIgYW5kIGNhbmNlbGluZyB0aGUKK29wZXJhdGlvbi4KKworU29tZSBlcnJvciB2YWx1ZXMgZG8gbm90IGluZGljYXRlIGEgc3lzdGVtIGVycm9yIG9yIGFuIGVycm9yIGluIHRoZQorb3BlcmF0aW9uLCBidXQgdGhlIHJlc3VsdCBvZiBhbiBvcGVyYXRpb24gdGhhdCBmYWlsZWQgcHJvcGVybHkuCisKK0dudVBHIGNvbXBvbmVudHMsIGluY2x1ZGluZyBMaWJnY3J5cHQsIHVzZSBhbiBleHRyYSBsaWJyYXJ5IG5hbWVkCitsaWJncGctZXJyb3IgdG8gcHJvdmlkZSBhIGNvbW1vbiBlcnJvciBoYW5kbGluZyBzY2hlbWUuICBGb3IgbW9yZQoraW5mb3JtYXRpb24gb24gbGliZ3BnLWVycm9yLCBzZWUgdGhlIGFjY29yZGluZyBtYW51YWwuCisKK0BtZW51CisqIEVycm9yIFZhbHVlczo6ICAgICAgICAgICAgICAgIFRoZSBlcnJvciB2YWx1ZSBhbmQgd2hhdCBpdCBtZWFucy4KKyogRXJyb3IgU291cmNlczo6ICAgICAgICAgICAgICAgQSBsaXN0IG9mIGltcG9ydGFudCBlcnJvciBzb3VyY2VzLgorKiBFcnJvciBDb2Rlczo6ICAgICAgICAgICAgICAgICBBIGxpc3Qgb2YgaW1wb3J0YW50IGVycm9yIGNvZGVzLgorKiBFcnJvciBTdHJpbmdzOjogICAgICAgICAgICAgICBIb3cgdG8gZ2V0IGEgZGVzY3JpcHRpdmUgc3RyaW5nIGZyb20gYSB2YWx1ZS4KK0BlbmQgbWVudQorCisKK0Bub2RlIEVycm9yIFZhbHVlcworQHN1YnNlY3Rpb24gRXJyb3IgVmFsdWVzCitAY2luZGV4IGVycm9yIHZhbHVlcworQGNpbmRleCBlcnJvciBjb2RlcworQGNpbmRleCBlcnJvciBzb3VyY2VzCisKK0BkZWZ0cCB7RGF0YSB0eXBlfSB7Z2NyeV9lcnJfY29kZV90fQorVGhlIEBjb2Rle2djcnlfZXJyX2NvZGVfdH0gdHlwZSBpcyBhbiBhbGlhcyBmb3IgdGhlCitAY29kZXtsaWJncGctZXJyb3J9IHR5cGUgQGNvZGV7Z3BnX2Vycl9jb2RlX3R9LiAgVGhlIGVycm9yIGNvZGUKK2luZGljYXRlcyB0aGUgdHlwZSBvZiBhbiBlcnJvciwgb3IgdGhlIHJlYXNvbiB3aHkgYW4gb3BlcmF0aW9uIGZhaWxlZC4KKworQSBsaXN0IG9mIGltcG9ydGFudCBlcnJvciBjb2RlcyBjYW4gYmUgZm91bmQgaW4gdGhlIG5leHQgc2VjdGlvbi4KK0BlbmQgZGVmdHAKKworQGRlZnRwIHtEYXRhIHR5cGV9IHtnY3J5X2Vycl9zb3VyY2VfdH0KK1RoZSBAY29kZXtnY3J5X2Vycl9zb3VyY2VfdH0gdHlwZSBpcyBhbiBhbGlhcyBmb3IgdGhlCitAY29kZXtsaWJncGctZXJyb3J9IHR5cGUgQGNvZGV7Z3BnX2Vycl9zb3VyY2VfdH0uICBUaGUgZXJyb3Igc291cmNlCitoYXMgbm90IGEgcHJlY2lzZWx5IGRlZmluZWQgbWVhbmluZy4gIFNvbWV0aW1lcyBpdCBpcyB0aGUgcGxhY2Ugd2hlcmUKK3RoZSBlcnJvciBoYXBwZW5lZCwgc29tZXRpbWVzIGl0IGlzIHRoZSBwbGFjZSB3aGVyZSBhbiBlcnJvciB3YXMKK2VuY29kZWQgaW50byBhbiBlcnJvciB2YWx1ZS4gIFVzdWFsbHkgdGhlIGVycm9yIHNvdXJjZSB3aWxsIGdpdmUgYW4KK2luZGljYXRpb24gdG8gd2hlcmUgdG8gbG9vayBmb3IgdGhlIHByb2JsZW0uICBUaGlzIGlzIG5vdCBhbHdheXMgdHJ1ZSwKK2J1dCBpdCBpcyBhdHRlbXB0ZWQgdG8gYWNoaWV2ZSB0aGlzIGdvYWwuCisKK0EgbGlzdCBvZiBpbXBvcnRhbnQgZXJyb3Igc291cmNlcyBjYW4gYmUgZm91bmQgaW4gdGhlIG5leHQgc2VjdGlvbi4KK0BlbmQgZGVmdHAKKworQGRlZnRwIHtEYXRhIHR5cGV9IHtnY3J5X2Vycm9yX3R9CitUaGUgQGNvZGV7Z2NyeV9lcnJvcl90fSB0eXBlIGlzIGFuIGFsaWFzIGZvciB0aGUgQGNvZGV7bGliZ3BnLWVycm9yfQordHlwZSBAY29kZXtncGdfZXJyb3JfdH0uICBBbiBlcnJvciB2YWx1ZSBsaWtlIHRoaXMgaGFzIGFsd2F5cyB0d28KK2NvbXBvbmVudHMsIGFuIGVycm9yIGNvZGUgYW5kIGFuIGVycm9yIHNvdXJjZS4gIEJvdGggdG9nZXRoZXIgZm9ybSB0aGUKK2Vycm9yIHZhbHVlLgorCitUaHVzLCB0aGUgZXJyb3IgdmFsdWUgY2FuIG5vdCBiZSBkaXJlY3RseSBjb21wYXJlZCBhZ2FpbnN0IGFuIGVycm9yCitjb2RlLCBidXQgdGhlIGFjY2Vzc29yIGZ1bmN0aW9ucyBkZXNjcmliZWQgYmVsb3cgbXVzdCBiZSB1c2VkLgorSG93ZXZlciwgaXQgaXMgZ3VhcmFudGVlZCB0aGF0IG9ubHkgMCBpcyB1c2VkIHRvIGluZGljYXRlIHN1Y2Nlc3MKKyhAY29kZXtHUEdfRVJSX05PX0VSUk9SfSksIGFuZCB0aGF0IGluIHRoaXMgY2FzZSBhbGwgb3RoZXIgcGFydHMgb2YKK3RoZSBlcnJvciB2YWx1ZSBhcmUgc2V0IHRvIDAsIHRvby4KKworTm90ZSB0aGF0IGluIExpYmdjcnlwdCwgdGhlIGVycm9yIHNvdXJjZSBpcyB1c2VkIHB1cmVseSBmb3IKK2RpYWdub3N0aWMgcHVycG9zZXMuICBPbmx5IHRoZSBlcnJvciBjb2RlIHNob3VsZCBiZSBjaGVja2VkIHRvIHRlc3QKK2ZvciBhIGNlcnRhaW4gb3V0Y29tZSBvZiBhIGZ1bmN0aW9uLiAgVGhlIG1hbnVhbCBvbmx5IGRvY3VtZW50cyB0aGUKK2Vycm9yIGNvZGUgcGFydCBvZiBhbiBlcnJvciB2YWx1ZS4gIFRoZSBlcnJvciBzb3VyY2UgaXMgbGVmdAordW5zcGVjaWZpZWQgYW5kIG1pZ2h0IGJlIGFueXRoaW5nLgorQGVuZCBkZWZ0cAorCitAZGVmdHlwZWZ1biB7Z2NyeV9lcnJfY29kZV90fSBnY3J5X2Vycl9jb2RlIChAd3tnY3J5X2Vycm9yX3QgQHZhcntlcnJ9fSkKK1RoZSBzdGF0aWMgaW5saW5lIGZ1bmN0aW9uIEBjb2Rle2djcnlfZXJyX2NvZGV9IHJldHVybnMgdGhlCitAY29kZXtnY3J5X2Vycl9jb2RlX3R9IGNvbXBvbmVudCBvZiB0aGUgZXJyb3IgdmFsdWUgQHZhcntlcnJ9LiAgVGhpcworZnVuY3Rpb24gbXVzdCBiZSB1c2VkIHRvIGV4dHJhY3QgdGhlIGVycm9yIGNvZGUgZnJvbSBhbiBlcnJvciB2YWx1ZSBpbgorb3JkZXIgdG8gY29tcGFyZSBpdCB3aXRoIHRoZSBAY29kZXtHUEdfRVJSXyp9IGVycm9yIGNvZGUgbWFjcm9zLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIHtnY3J5X2Vycl9zb3VyY2VfdH0gZ2NyeV9lcnJfc291cmNlIChAd3tnY3J5X2Vycm9yX3QgQHZhcntlcnJ9fSkKK1RoZSBzdGF0aWMgaW5saW5lIGZ1bmN0aW9uIEBjb2Rle2djcnlfZXJyX3NvdXJjZX0gcmV0dXJucyB0aGUKK0Bjb2Rle2djcnlfZXJyX3NvdXJjZV90fSBjb21wb25lbnQgb2YgdGhlIGVycm9yIHZhbHVlIEB2YXJ7ZXJyfS4gIFRoaXMKK2Z1bmN0aW9uIG11c3QgYmUgdXNlZCB0byBleHRyYWN0IHRoZSBlcnJvciBzb3VyY2UgZnJvbSBhbiBlcnJvciB2YWx1ZSBpbgorb3JkZXIgdG8gY29tcGFyZSBpdCB3aXRoIHRoZSBAY29kZXtHUEdfRVJSX1NPVVJDRV8qfSBlcnJvciBzb3VyY2UgbWFjcm9zLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIHtnY3J5X2Vycm9yX3R9IGdjcnlfZXJyX21ha2UgKEB3e2djcnlfZXJyX3NvdXJjZV90IEB2YXJ7c291cmNlfX0sIEB3e2djcnlfZXJyX2NvZGVfdCBAdmFye2NvZGV9fSkKK1RoZSBzdGF0aWMgaW5saW5lIGZ1bmN0aW9uIEBjb2Rle2djcnlfZXJyX21ha2V9IHJldHVybnMgdGhlIGVycm9yCit2YWx1ZSBjb25zaXN0aW5nIG9mIHRoZSBlcnJvciBzb3VyY2UgQHZhcntzb3VyY2V9IGFuZCB0aGUgZXJyb3IgY29kZQorQHZhcntjb2RlfS4KKworVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBpbiBjYWxsYmFjayBmdW5jdGlvbnMgdG8gY29uc3RydWN0IGFuIGVycm9yCit2YWx1ZSB0byByZXR1cm4gaXQgdG8gdGhlIGxpYnJhcnkuCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4ge2djcnlfZXJyb3JfdH0gZ2NyeV9lcnJvciAoQHd7Z2NyeV9lcnJfY29kZV90IEB2YXJ7Y29kZX19KQorVGhlIHN0YXRpYyBpbmxpbmUgZnVuY3Rpb24gQGNvZGV7Z2NyeV9lcnJvcn0gcmV0dXJucyB0aGUgZXJyb3IgdmFsdWUKK2NvbnNpc3Rpbmcgb2YgdGhlIGRlZmF1bHQgZXJyb3Igc291cmNlIGFuZCB0aGUgZXJyb3IgY29kZSBAdmFye2NvZGV9LgorCitGb3IgQGFjcm9ueW17R0NSWX0gYXBwbGljYXRpb25zLCB0aGUgZGVmYXVsdCBlcnJvciBzb3VyY2UgaXMKK0Bjb2Rle0dQR19FUlJfU09VUkNFX1VTRVJfMX0uICBZb3UgY2FuIGRlZmluZQorQGNvZGV7R0NSWV9FUlJfU09VUkNFX0RFRkFVTFR9IGJlZm9yZSBpbmNsdWRpbmcgQGZpbGV7Z2NyeXB0Lmh9IHRvCitjaGFuZ2UgdGhpcyBkZWZhdWx0LgorCitUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGluIGNhbGxiYWNrIGZ1bmN0aW9ucyB0byBjb25zdHJ1Y3QgYW4gZXJyb3IKK3ZhbHVlIHRvIHJldHVybiBpdCB0byB0aGUgbGlicmFyeS4KK0BlbmQgZGVmdHlwZWZ1bgorCitUaGUgQGNvZGV7bGliZ3BnLWVycm9yfSBsaWJyYXJ5IHByb3ZpZGVzIGVycm9yIGNvZGVzIGZvciBhbGwgc3lzdGVtCitlcnJvciBudW1iZXJzIGl0IGtub3dzIGFib3V0LiAgSWYgQHZhcntlcnJ9IGlzIGFuIHVua25vd24gZXJyb3IKK251bWJlciwgdGhlIGVycm9yIGNvZGUgQGNvZGV7R1BHX0VSUl9VTktOT1dOX0VSUk5PfSBpcyB1c2VkLiAgVGhlCitmb2xsb3dpbmcgZnVuY3Rpb25zIGNhbiBiZSB1c2VkIHRvIGNvbnN0cnVjdCBlcnJvciB2YWx1ZXMgZnJvbSBzeXN0ZW0KK2Vycm5vIG51bWJlcnMuCisKK0BkZWZ0eXBlZnVuIHtnY3J5X2Vycm9yX3R9IGdjcnlfZXJyX21ha2VfZnJvbV9lcnJubyAoQHd7Z2NyeV9lcnJfc291cmNlX3QgQHZhcntzb3VyY2V9fSwgQHd7aW50IEB2YXJ7ZXJyfX0pCitUaGUgZnVuY3Rpb24gQGNvZGV7Z2NyeV9lcnJfbWFrZV9mcm9tX2Vycm5vfSBpcyBsaWtlCitAY29kZXtnY3J5X2Vycl9tYWtlfSwgYnV0IGl0IHRha2VzIGEgc3lzdGVtIGVycm9yIGxpa2UgQGNvZGV7ZXJybm99CitpbnN0ZWFkIG9mIGEgQGNvZGV7Z2NyeV9lcnJfY29kZV90fSBlcnJvciBjb2RlLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIHtnY3J5X2Vycm9yX3R9IGdjcnlfZXJyb3JfZnJvbV9lcnJubyAoQHd7aW50IEB2YXJ7ZXJyfX0pCitUaGUgZnVuY3Rpb24gQGNvZGV7Z2NyeV9lcnJvcl9mcm9tX2Vycm5vfSBpcyBsaWtlIEBjb2Rle2djcnlfZXJyb3J9LAorYnV0IGl0IHRha2VzIGEgc3lzdGVtIGVycm9yIGxpa2UgQGNvZGV7ZXJybm99IGluc3RlYWQgb2YgYQorQGNvZGV7Z2NyeV9lcnJfY29kZV90fSBlcnJvciBjb2RlLgorQGVuZCBkZWZ0eXBlZnVuCisKK1NvbWV0aW1lcyB5b3UgbWlnaHQgd2FudCB0byBtYXAgc3lzdGVtIGVycm9yIG51bWJlcnMgdG8gZXJyb3IgY29kZXMKK2RpcmVjdGx5LCBvciBtYXAgYW4gZXJyb3IgY29kZSByZXByZXNlbnRpbmcgYSBzeXN0ZW0gZXJyb3IgYmFjayB0byB0aGUKK3N5c3RlbSBlcnJvciBudW1iZXIuICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCB0byBkbyB0aGF0LgorCitAZGVmdHlwZWZ1biB7Z2NyeV9lcnJfY29kZV90fSBnY3J5X2Vycl9jb2RlX2Zyb21fZXJybm8gKEB3e2ludCBAdmFye2Vycn19KQorVGhlIGZ1bmN0aW9uIEBjb2Rle2djcnlfZXJyX2NvZGVfZnJvbV9lcnJub30gcmV0dXJucyB0aGUgZXJyb3IgY29kZQorZm9yIHRoZSBzeXN0ZW0gZXJyb3IgQHZhcntlcnJ9LiAgSWYgQHZhcntlcnJ9IGlzIG5vdCBhIGtub3duIHN5c3RlbQorZXJyb3IsIHRoZSBmdW5jdGlvbiByZXR1cm5zIEBjb2Rle0dQR19FUlJfVU5LTk9XTl9FUlJOT30uCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4ge2ludH0gZ2NyeV9lcnJfY29kZV90b19lcnJubyAoQHd7Z2NyeV9lcnJfY29kZV90IEB2YXJ7ZXJyfX0pCitUaGUgZnVuY3Rpb24gQGNvZGV7Z2NyeV9lcnJfY29kZV90b19lcnJub30gcmV0dXJucyB0aGUgc3lzdGVtIGVycm9yCitmb3IgdGhlIGVycm9yIGNvZGUgQHZhcntlcnJ9LiAgSWYgQHZhcntlcnJ9IGlzIG5vdCBhbiBlcnJvciBjb2RlCityZXByZXNlbnRpbmcgYSBzeXN0ZW0gZXJyb3IsIG9yIGlmIHRoaXMgc3lzdGVtIGVycm9yIGlzIG5vdCBkZWZpbmVkIG9uCit0aGlzIHN5c3RlbSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgQGNvZGV7MH0uCitAZW5kIGRlZnR5cGVmdW4KKworCitAbm9kZSBFcnJvciBTb3VyY2VzCitAc3Vic2VjdGlvbiBFcnJvciBTb3VyY2VzCitAY2luZGV4IGVycm9yIGNvZGVzLCBsaXN0IG9mCisKK1RoZSBsaWJyYXJ5IEBjb2Rle2xpYmdwZy1lcnJvcn0gZGVmaW5lcyBhbiBlcnJvciBzb3VyY2UgZm9yIGV2ZXJ5Citjb21wb25lbnQgb2YgdGhlIEdudVBHIHN5c3RlbS4gIFRoZSBlcnJvciBzb3VyY2UgcGFydCBvZiBhbiBlcnJvcgordmFsdWUgaXMgbm90IHdlbGwgZGVmaW5lZC4gIEFzIHN1Y2ggaXQgaXMgbWFpbmx5IHVzZWZ1bCB0byBpbXByb3ZlIHRoZQorZGlhZ25vc3RpYyBlcnJvciBtZXNzYWdlIGZvciB0aGUgdXNlci4KKworSWYgdGhlIGVycm9yIGNvZGUgcGFydCBvZiBhbiBlcnJvciB2YWx1ZSBpcyBAY29kZXswfSwgdGhlIHdob2xlIGVycm9yCit2YWx1ZSB3aWxsIGJlIEBjb2RlezB9LiAgSW4gdGhpcyBjYXNlIHRoZSBlcnJvciBzb3VyY2UgcGFydCBpcyBvZgorY291cnNlIEBjb2Rle0dQR19FUlJfU09VUkNFX1VOS05PV059LgorCitUaGUgbGlzdCBvZiBlcnJvciBzb3VyY2VzIHRoYXQgbWlnaHQgb2NjdXIgaW4gYXBwbGljYXRpb25zIHVzaW5nCitAYWNyb255bXtMaWJnY3J5cHR9IGlzOgorCitAdGFibGUgQGNvZGUKK0BpdGVtIEdQR19FUlJfU09VUkNFX1VOS05PV04KK1RoZSBlcnJvciBzb3VyY2UgaXMgbm90IGtub3duLiAgVGhlIHZhbHVlIG9mIHRoaXMgZXJyb3Igc291cmNlIGlzCitAY29kZXswfS4KKworQGl0ZW0gR1BHX0VSUl9TT1VSQ0VfR1BHTUUKK1RoZSBlcnJvciBzb3VyY2UgaXMgQGFjcm9ueW17R1BHTUV9IGl0c2VsZi4KKworQGl0ZW0gR1BHX0VSUl9TT1VSQ0VfR1BHCitUaGUgZXJyb3Igc291cmNlIGlzIEdudVBHLCB3aGljaCBpcyB0aGUgY3J5cHRvIGVuZ2luZSB1c2VkIGZvciB0aGUKK09wZW5QR1AgcHJvdG9jb2wuCisKK0BpdGVtIEdQR19FUlJfU09VUkNFX0dQR1NNCitUaGUgZXJyb3Igc291cmNlIGlzIEdQR1NNLCB3aGljaCBpcyB0aGUgY3J5cHRvIGVuZ2luZSB1c2VkIGZvciB0aGUKK09wZW5QR1AgcHJvdG9jb2wuCisKK0BpdGVtIEdQR19FUlJfU09VUkNFX0dDUllQVAorVGhlIGVycm9yIHNvdXJjZSBpcyBAY29kZXtsaWJnY3J5cHR9LCB3aGljaCBpcyB1c2VkIGJ5IGNyeXB0byBlbmdpbmVzCit0byBwZXJmb3JtIGNyeXB0b2dyYXBoaWMgb3BlcmF0aW9ucy4KKworQGl0ZW0gR1BHX0VSUl9TT1VSQ0VfR1BHQUdFTlQKK1RoZSBlcnJvciBzb3VyY2UgaXMgQGNvbW1hbmR7Z3BnLWFnZW50fSwgd2hpY2ggaXMgdXNlZCBieSBjcnlwdG8KK2VuZ2luZXMgdG8gcGVyZm9ybSBvcGVyYXRpb25zIHdpdGggdGhlIHNlY3JldCBrZXkuCisKK0BpdGVtIEdQR19FUlJfU09VUkNFX1BJTkVOVFJZCitUaGUgZXJyb3Igc291cmNlIGlzIEBjb21tYW5ke3BpbmVudHJ5fSwgd2hpY2ggaXMgdXNlZCBieQorQGNvbW1hbmR7Z3BnLWFnZW50fSB0byBxdWVyeSB0aGUgcGFzc3BocmFzZSB0byB1bmxvY2sgYSBzZWNyZXQga2V5LgorCitAaXRlbSBHUEdfRVJSX1NPVVJDRV9TQ0QKK1RoZSBlcnJvciBzb3VyY2UgaXMgdGhlIFNtYXJ0Q2FyZCBEYWVtb24sIHdoaWNoIGlzIHVzZWQgYnkKK0Bjb21tYW5ke2dwZy1hZ2VudH0gdG8gZGVsZWdhdGUgb3BlcmF0aW9ucyB3aXRoIHRoZSBzZWNyZXQga2V5IHRvIGEKK1NtYXJ0Q2FyZC4KKworQGl0ZW0gR1BHX0VSUl9TT1VSQ0VfS0VZQk9YCitUaGUgZXJyb3Igc291cmNlIGlzIEBjb2Rle2xpYmtieH0sIGEgbGlicmFyeSB1c2VkIGJ5IHRoZSBjcnlwdG8KK2VuZ2luZXMgdG8gbWFuYWdlIGxvY2FsIGtleXJpbmdzLgorCitAaXRlbSBHUEdfRVJSX1NPVVJDRV9VU0VSXzEKK0BpdGVtIEdQR19FUlJfU09VUkNFX1VTRVJfMgorQGl0ZW0gR1BHX0VSUl9TT1VSQ0VfVVNFUl8zCitAaXRlbSBHUEdfRVJSX1NPVVJDRV9VU0VSXzQKK1RoZXNlIGVycm9yIHNvdXJjZXMgYXJlIG5vdCB1c2VkIGJ5IGFueSBHbnVQRyBjb21wb25lbnQgYW5kIGNhbiBiZQordXNlZCBieSBvdGhlciBzb2Z0d2FyZS4gIEZvciBleGFtcGxlLCBhcHBsaWNhdGlvbnMgdXNpbmcKK0xpYmdjcnlwdCBjYW4gdXNlIHRoZW0gdG8gbWFyayBlcnJvciB2YWx1ZXMgY29taW5nIGZyb20gY2FsbGJhY2sKK2hhbmRsZXJzLiAgVGh1cyBAY29kZXtHUEdfRVJSX1NPVVJDRV9VU0VSXzF9IGlzIHRoZSBkZWZhdWx0IGZvciBlcnJvcnMKK2NyZWF0ZWQgd2l0aCBAY29kZXtnY3J5X2Vycm9yfSBhbmQgQGNvZGV7Z2NyeV9lcnJvcl9mcm9tX2Vycm5vfSwKK3VubGVzcyB5b3UgZGVmaW5lIEBjb2Rle0dDUllfRVJSX1NPVVJDRV9ERUZBVUxUfSBiZWZvcmUgaW5jbHVkaW5nCitAZmlsZXtnY3J5cHQuaH0uCitAZW5kIHRhYmxlCisKKworQG5vZGUgRXJyb3IgQ29kZXMKK0BzdWJzZWN0aW9uIEVycm9yIENvZGVzCitAY2luZGV4IGVycm9yIGNvZGVzLCBsaXN0IG9mCisKK1RoZSBsaWJyYXJ5IEBjb2Rle2xpYmdwZy1lcnJvcn0gZGVmaW5lcyBtYW55IGVycm9yIHZhbHVlcy4gIFRoZQorZm9sbG93aW5nIGxpc3QgaW5jbHVkZXMgdGhlIG1vc3QgaW1wb3J0YW50IGVycm9yIGNvZGVzLgorCitAdGFibGUgQGNvZGUKK0BpdGVtIEdQR19FUlJfRU9GCitUaGlzIHZhbHVlIGluZGljYXRlcyB0aGUgZW5kIG9mIGEgbGlzdCwgYnVmZmVyIG9yIGZpbGUuCisKK0BpdGVtIEdQR19FUlJfTk9fRVJST1IKK1RoaXMgdmFsdWUgaW5kaWNhdGVzIHN1Y2Nlc3MuICBUaGUgdmFsdWUgb2YgdGhpcyBlcnJvciBjb2RlIGlzCitAY29kZXswfS4gIEFsc28sIGl0IGlzIGd1YXJhbnRlZWQgdGhhdCBhbiBlcnJvciB2YWx1ZSBtYWRlIGZyb20gdGhlCitlcnJvciBjb2RlIEBjb2RlezB9IHdpbGwgYmUgQGNvZGV7MH0gaXRzZWxmIChhcyBhIHdob2xlKS4gIFRoaXMgbWVhbnMKK3RoYXQgdGhlIGVycm9yIHNvdXJjZSBpbmZvcm1hdGlvbiBpcyBsb3N0IGZvciB0aGlzIGVycm9yIGNvZGUsCitob3dldmVyLCBhcyB0aGlzIGVycm9yIGNvZGUgaW5kaWNhdGVzIHRoYXQgbm8gZXJyb3Igb2NjdXJyZWQsIHRoaXMgaXMKK2dlbmVyYWxseSBub3QgYSBwcm9ibGVtLgorCitAaXRlbSBHUEdfRVJSX0dFTkVSQUwKK1RoaXMgdmFsdWUgbWVhbnMgdGhhdCBzb21ldGhpbmcgd2VudCB3cm9uZywgYnV0IGVpdGhlciB0aGVyZSBpcyBub3QKK2Vub3VnaCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJvYmxlbSB0byByZXR1cm4gYSBtb3JlIHVzZWZ1bCBlcnJvcgordmFsdWUsIG9yIHRoZXJlIGlzIG5vIHNlcGFyYXRlIGVycm9yIHZhbHVlIGZvciB0aGlzIHR5cGUgb2YgcHJvYmxlbS4KKworQGl0ZW0gR1BHX0VSUl9FTk9NRU0KK1RoaXMgdmFsdWUgbWVhbnMgdGhhdCBhbiBvdXQtb2YtbWVtb3J5IGNvbmRpdGlvbiBvY2N1cnJlZC4KKworQGl0ZW0gR1BHX0VSUl9FLi4uCitTeXN0ZW0gZXJyb3JzIGFyZSBtYXBwZWQgdG8gR1BHX0VSUl9FRk9PIHdoZXJlIEZPTyBpcyB0aGUgc3ltYm9sIGZvcgordGhlIHN5c3RlbSBlcnJvci4KKworQGl0ZW0gR1BHX0VSUl9JTlZfVkFMVUUKK1RoaXMgdmFsdWUgbWVhbnMgdGhhdCBzb21lIHVzZXIgcHJvdmlkZWQgZGF0YSB3YXMgb3V0IG9mIHJhbmdlLgorCitAaXRlbSBHUEdfRVJSX1VOVVNBQkxFX1BVQktFWQorVGhpcyB2YWx1ZSBtZWFucyB0aGF0IHNvbWUgcmVjaXBpZW50cyBmb3IgYSBtZXNzYWdlIHdlcmUgaW52YWxpZC4KKworQGl0ZW0gR1BHX0VSUl9VTlVTQUJMRV9TRUNLRVkKK1RoaXMgdmFsdWUgbWVhbnMgdGhhdCBzb21lIHNpZ25lcnMgd2VyZSBpbnZhbGlkLgorCitAaXRlbSBHUEdfRVJSX05PX0RBVEEKK1RoaXMgdmFsdWUgbWVhbnMgdGhhdCBkYXRhIHdhcyBleHBlY3RlZCB3aGVyZSBubyBkYXRhIHdhcyBmb3VuZC4KKworQGl0ZW0gR1BHX0VSUl9DT05GTElDVAorVGhpcyB2YWx1ZSBtZWFucyB0aGF0IGEgY29uZmxpY3Qgb2Ygc29tZSBzb3J0IG9jY3VycmVkLgorCitAaXRlbSBHUEdfRVJSX05PVF9JTVBMRU1FTlRFRAorVGhpcyB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgc3BlY2lmaWMgZnVuY3Rpb24gKG9yIG9wZXJhdGlvbikgaXMgbm90CitpbXBsZW1lbnRlZC4gIFRoaXMgZXJyb3Igc2hvdWxkIG5ldmVyIGhhcHBlbi4gIEl0IGNhbiBvbmx5IG9jY3VyIGlmCit5b3UgdXNlIGNlcnRhaW4gdmFsdWVzIG9yIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB3aGljaCBkbyBub3Qgd29yaywKK2J1dCBmb3Igd2hpY2ggd2UgdGhpbmsgdGhhdCB0aGV5IHNob3VsZCB3b3JrIGF0IHNvbWUgbGF0ZXIgdGltZS4KKworQGl0ZW0gR1BHX0VSUl9ERUNSWVBUX0ZBSUxFRAorVGhpcyB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCBhIGRlY3J5cHRpb24gb3BlcmF0aW9uIHdhcyB1bnN1Y2Nlc3NmdWwuCisKK0BpdGVtIEdQR19FUlJfV1JPTkdfS0VZX1VTQUdFCitUaGlzIHZhbHVlIGluZGljYXRlcyB0aGF0IGEga2V5IGlzIG5vdCB1c2VkIGFwcHJvcHJpYXRlbHkuCisKK0BpdGVtIEdQR19FUlJfTk9fU0VDS0VZCitUaGlzIHZhbHVlIGluZGljYXRlcyB0aGF0IG5vIHNlY3JldCBrZXkgZm9yIHRoZSB1c2VyIElEIGlzIGF2YWlsYWJsZS4KKworQGl0ZW0gR1BHX0VSUl9VTlNVUFBPUlRFRF9BTEdPUklUSE0KK1RoaXMgdmFsdWUgbWVhbnMgYSB2ZXJpZmljYXRpb24gZmFpbGVkIGJlY2F1c2UgdGhlIGNyeXB0b2dyYXBoaWMKK2FsZ29yaXRobSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjcnlwdG8gYmFja2VuZC4KKworQGl0ZW0gR1BHX0VSUl9CQURfU0lHTkFUVVJFCitUaGlzIHZhbHVlIG1lYW5zIGEgdmVyaWZpY2F0aW9uIGZhaWxlZCBiZWNhdXNlIHRoZSBzaWduYXR1cmUgaXMgYmFkLgorCitAaXRlbSBHUEdfRVJSX05PX1BVQktFWQorVGhpcyB2YWx1ZSBtZWFucyBhIHZlcmlmaWNhdGlvbiBmYWlsZWQgYmVjYXVzZSB0aGUgcHVibGljIGtleSBpcyBub3QKK2F2YWlsYWJsZS4KKworQGl0ZW0gR1BHX0VSUl9OT1RfT1BFUkFUSU9OQUwKK1RoaXMgdmFsdWUgbWVhbnMgdGhhdCB0aGUgbGlicmFyeSBpcyBub3QgeWV0IGluIHN0YXRlIHdoaWNoIGFsbG93cyB0bwordXNlIHRoaXMgZnVuY3Rpb24uICBUaGlzIGVycm9yIGNvZGUgaXMgaW4gcGFydGljdWxhciByZXR1cm5lZCBpZgorTGliZ2NyeXB0IGlzIG9wZXJhdGVkIGluIEZJUFMgbW9kZSBhbmQgdGhlIGludGVybmFsIHN0YXRlIG9mIHRoZQorbGlicmFyeSBkb2VzIG5vdCB5ZXQgb3Igbm90IGFueW1vcmUgYWxsb3cgdGhlIHVzZSBvZiBhIHNlcnZpY2UuCisKK1RoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGF2YWlsYWJsZSB3aXRoIG5ld2VyIGxpYmdwZy1lcnJvciB2ZXJzaW9ucywgdGh1cworeW91IG1pZ2h0IHNlZSBgYGludmFsaWQgZXJyb3IgY29kZScnIHdoZW4gcGFzc2luZyB0aGlzIHRvCitAY29kZXtncGdfc3RyZXJyb3J9LiAgVGhlIG51bWVyaWMgdmFsdWUgb2YgdGhpcyBlcnJvciBjb2RlIGlzIDE3Ni4KKworQGl0ZW0gR1BHX0VSUl9VU0VSXzEKK0BpdGVtIEdQR19FUlJfVVNFUl8yCitAaXRlbSAuLi4KK0BpdGVtIEdQR19FUlJfVVNFUl8xNgorVGhlc2UgZXJyb3IgY29kZXMgYXJlIG5vdCB1c2VkIGJ5IGFueSBHbnVQRyBjb21wb25lbnQgYW5kIGNhbiBiZQorZnJlZWx5IHVzZWQgYnkgb3RoZXIgc29mdHdhcmUuICBBcHBsaWNhdGlvbnMgdXNpbmcgTGliZ2NyeXB0CittaWdodCB1c2UgdGhlbSB0byBtYXJrIHNwZWNpZmljIGVycm9ycyByZXR1cm5lZCBieSBjYWxsYmFjayBoYW5kbGVycworaWYgbm8gc3VpdGFibGUgZXJyb3IgY29kZXMgKGluY2x1ZGluZyB0aGUgc3lzdGVtIGVycm9ycykgZm9yIHRoZXNlCitlcnJvcnMgZXhpc3QgYWxyZWFkeS4KK0BlbmQgdGFibGUKKworCitAbm9kZSBFcnJvciBTdHJpbmdzCitAc3Vic2VjdGlvbiBFcnJvciBTdHJpbmdzCitAY2luZGV4IGVycm9yIHZhbHVlcywgcHJpbnRpbmcgb2YKK0BjaW5kZXggZXJyb3IgY29kZXMsIHByaW50aW5nIG9mCitAY2luZGV4IGVycm9yIHNvdXJjZXMsIHByaW50aW5nIG9mCitAY2luZGV4IGVycm9yIHN0cmluZ3MKKworQGRlZnR5cGVmdW4ge2NvbnN0IGNoYXIgKn0gZ2NyeV9zdHJlcnJvciAoQHd7Z2NyeV9lcnJvcl90IEB2YXJ7ZXJyfX0pCitUaGUgZnVuY3Rpb24gQGNvZGV7Z2NyeV9zdHJlcnJvcn0gcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBzdGF0aWNhbGx5CithbGxvY2F0ZWQgc3RyaW5nIGNvbnRhaW5pbmcgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZXJyb3IgY29kZSBjb250YWluZWQKK2luIHRoZSBlcnJvciB2YWx1ZSBAdmFye2Vycn0uICBUaGlzIHN0cmluZyBjYW4gYmUgdXNlZCB0byBvdXRwdXQgYQorZGlhZ25vc3RpYyBtZXNzYWdlIHRvIHRoZSB1c2VyLgorQGVuZCBkZWZ0eXBlZnVuCisKKworQGRlZnR5cGVmdW4ge2NvbnN0IGNoYXIgKn0gZ2NyeV9zdHJzb3VyY2UgKEB3e2djcnlfZXJyb3JfdCBAdmFye2Vycn19KQorVGhlIGZ1bmN0aW9uIEBjb2Rle2djcnlfc3RyZXJyb3J9IHJldHVybnMgYSBwb2ludGVyIHRvIGEgc3RhdGljYWxseQorYWxsb2NhdGVkIHN0cmluZyBjb250YWluaW5nIGEgZGVzY3JpcHRpb24gb2YgdGhlIGVycm9yIHNvdXJjZQorY29udGFpbmVkIGluIHRoZSBlcnJvciB2YWx1ZSBAdmFye2Vycn0uICBUaGlzIHN0cmluZyBjYW4gYmUgdXNlZCB0bworb3V0cHV0IGEgZGlhZ25vc3RpYyBtZXNzYWdlIHRvIHRoZSB1c2VyLgorQGVuZCBkZWZ0eXBlZnVuCisKK1RoZSBmb2xsb3dpbmcgZXhhbXBsZSBpbGx1c3RyYXRlcyB0aGUgdXNlIG9mIHRoZSBmdW5jdGlvbnMgZGVzY3JpYmVkCithYm92ZToKKworQGV4YW1wbGUKK0B7CisgIGdjcnlfY2lwaGVyX2hkX3QgaGFuZGxlOworICBnY3J5X2Vycm9yX3QgZXJyID0gMDsKKworICBlcnIgPSBnY3J5X2NpcGhlcl9vcGVuICgmaGFuZGxlLCBHQ1JZX0NJUEhFUl9BRVMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBHQ1JZX0NJUEhFUl9NT0RFX0NCQywgMCk7CisgIGlmIChlcnIpCisgICAgQHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkZhaWx1cmU6ICVzLyVzXG4iLAorICAgICAgICAgICAgICAgZ2NyeV9zdHJzb3VyY2UgKGVyciksCisgICAgICAgICAgICAgICBnY3J5X3N0cmVycm9yIChlcnIpKTsKKyAgICBAfQorQH0KK0BlbmQgZXhhbXBsZQorCitAYyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitAYyAqKioqKioqKioqKioqKioqKioqICBHZW5lcmFsICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitAYyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitAbm9kZSBIYW5kbGVyIEZ1bmN0aW9ucworQGNoYXB0ZXIgSGFuZGxlciBGdW5jdGlvbnMKKworTGliZ2NyeXB0IG1ha2VzIGl0IHBvc3NpYmxlIHRvIGluc3RhbGwgc28gY2FsbGVkIGBoYW5kbGVyIGZ1bmN0aW9ucycsCit3aGljaCBnZXQgY2FsbGVkIGJ5IExpYmdjcnlwdCBpbiBjYXNlIG9mIGNlcnRhaW4gZXZlbnRzLiAKKworQG1lbnUKKyogUHJvZ3Jlc3MgaGFuZGxlcjo6ICAgICAgICAgICAgVXNpbmcgYSBwcm9ncmVzcyBoYW5kbGVyIGZ1bmN0aW9uLgorKiBBbGxvY2F0aW9uIGhhbmRsZXI6OiAgICAgICAgICBVc2luZyBzcGVjaWFsIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucy4KKyogRXJyb3IgaGFuZGxlcjo6ICAgICAgICAgICAgICAgVXNpbmcgZXJyb3IgaGFuZGxlciBmdW5jdGlvbnMuCisqIExvZ2dpbmcgaGFuZGxlcjo6ICAgICAgICAgICAgIFVzaW5nIGEgc3BlY2lhbCBsb2dnaW5nIGZ1bmN0aW9uLgorQGVuZCBtZW51CisKK0Bub2RlIFByb2dyZXNzIGhhbmRsZXIKK0BzZWN0aW9uIFByb2dyZXNzIGhhbmRsZXIKKworSXQgaXMgb2Z0ZW4gdXNlZnVsIHRvIHJldHJpZXZlIHNvbWUgZmVlZGJhY2sgd2hpbGUgbG9uZyBydW5uaW5nCitvcGVyYXRpb25zIGFyZSBwZXJmb3JtZWQuCisKK0BkZWZ0cCB7RGF0YSB0eXBlfSBnY3J5X2hhbmRsZXJfcHJvZ3Jlc3NfdAorUHJvZ3Jlc3MgaGFuZGxlciBmdW5jdGlvbnMgaGF2ZSB0byBiZSBvZiB0aGUgdHlwZQorQGNvZGV7Z2NyeV9oYW5kbGVyX3Byb2dyZXNzX3R9LCB3aGljaCBpcyBkZWZpbmVkIGFzOgorCitAY29kZXt2b2lkICgqZ2NyeV9oYW5kbGVyX3Byb2dyZXNzX3QpICh2b2lkICosIGNvbnN0IGNoYXIgKiwgaW50LCBpbnQsIGludCl9CitAZW5kIGRlZnRwCisKK1RoZSBmb2xsb3dpbmcgZnVuY3Rpb24gbWF5IGJlIHVzZWQgdG8gcmVnaXN0ZXIgYSBoYW5kbGVyIGZ1bmN0aW9uIGZvcgordGhpcyBwdXJwb3NlLgorCitAZGVmdHlwZWZ1biB2b2lkIGdjcnlfc2V0X3Byb2dyZXNzX2hhbmRsZXIgKGdjcnlfaGFuZGxlcl9wcm9ncmVzc190IEB2YXJ7Y2J9LCB2b2lkICpAdmFye2NiX2RhdGF9KQorCitUaGlzIGZ1bmN0aW9uIGluc3RhbGxzIEB2YXJ7Y2J9IGFzIHRoZSBgUHJvZ3Jlc3MgaGFuZGxlcicgZnVuY3Rpb24uCitJdCBtYXkgYmUgdXNlZCBvbmx5IGR1cmluZyBpbml0aWFsaXphdGlvbi4gIEB2YXJ7Y2J9IG11c3QgYmUgZGVmaW5lZAorYXMgZm9sbG93czoKKworQGV4YW1wbGUKK3ZvaWQKK215X3Byb2dyZXNzX2hhbmRsZXIgKHZvaWQgKkB2YXJ7Y2JfZGF0YX0sIGNvbnN0IGNoYXIgKkB2YXJ7d2hhdH0sCisgICAgICAgICAgICAgICAgICAgICBpbnQgQHZhcntwcmludGNoYXJ9LCBpbnQgQHZhcntjdXJyZW50fSwgaW50IEB2YXJ7dG90YWx9KQorQHsKKyAgLyogRG8gc29tZXRoaW5nLiAgKi8KK0B9CitAZW5kIGV4YW1wbGUKKworQSBkZXNjcmlwdGlvbiBvZiB0aGUgYXJndW1lbnRzIG9mIHRoZSBwcm9ncmVzcyBoYW5kbGVyIGZ1bmN0aW9uIGZvbGxvd3MuCisKK0B0YWJsZSBAdmFyCitAaXRlbSBjYl9kYXRhCitUaGUgYXJndW1lbnQgcHJvdmlkZWQgaW4gdGhlIGNhbGwgdG8gQGNvZGV7Z2NyeV9zZXRfcHJvZ3Jlc3NfaGFuZGxlcn0uCitAaXRlbSB3aGF0CitBIHN0cmluZyBpZGVudGlmeWluZyB0aGUgdHlwZSBvZiB0aGUgcHJvZ3Jlc3Mgb3V0cHV0LiAgVGhlIGZvbGxvd2luZwordmFsdWVzIGZvciBAdmFye3doYXR9IGFyZSBkZWZpbmVkOgorCitAdGFibGUgQGNvZGUKK0BpdGVtIG5lZWRfZW50cm9weQorTm90IGVub3VnaCBlbnRyb3B5IGlzIGF2YWlsYWJsZS4gIEB2YXJ7dG90YWx9IGhvbGRzIHRoZSBudW1iZXIgb2YKK3JlcXVpcmVkIGJ5dGVzLgorCitAaXRlbSBwcmltZWdlbgorVmFsdWVzIGZvciBAdmFye3ByaW50Y2hhcn06CitAdGFibGUgQGNvZGUKK0BpdGVtIFxuCitQcmltZSBnZW5lcmF0ZWQuCitAaXRlbSAhCitOZWVkIHRvIHJlZnJlc2ggdGhlIHBvb2wgb2YgcHJpbWUgbnVtYmVycy4KK0BpdGVtIDwsID4KK051bWJlciBvZiBiaXRzIGFkanVzdGVkLgorQGl0ZW0gXgorU2VhcmNoaW5nIGZvciBhIGdlbmVyYXRvci4KK0BpdGVtIC4KK0Zlcm1hdCB0ZXN0IG9uIDEwIGNhbmRpZGF0ZXMgZmFpbGVkLgorQGl0ZW0gOgorUmVzdGFydCB3aXRoIGEgbmV3IHJhbmRvbSB2YWx1ZS4KK0BpdGVtICsKK1JhYmluIE1pbGxlciB0ZXN0IHBhc3NlZC4KK0BlbmQgdGFibGUKKworQGVuZCB0YWJsZQorCitAZW5kIHRhYmxlCitAZW5kIGRlZnR5cGVmdW4KKworQG5vZGUgQWxsb2NhdGlvbiBoYW5kbGVyCitAc2VjdGlvbiBBbGxvY2F0aW9uIGhhbmRsZXIKKworSXQgaXMgcG9zc2libGUgdG8gbWFrZSBMaWJnY3J5cHQgdXNlIHNwZWNpYWwgbWVtb3J5CithbGxvY2F0aW9uIGZ1bmN0aW9ucyBpbnN0ZWFkIG9mIHRoZSBidWlsdC1pbiBvbmVzLgorCitNZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbnMgYXJlIG9mIHRoZSBmb2xsb3dpbmcgdHlwZXM6CitAZGVmdHAge0RhdGEgdHlwZX0gZ2NyeV9oYW5kbGVyX2FsbG9jX3QKK1RoaXMgdHlwZSBpcyBkZWZpbmVkIGFzOiBAY29kZXt2b2lkICooKmdjcnlfaGFuZGxlcl9hbGxvY190KSAoc2l6ZV90IG4pfS4KK0BlbmQgZGVmdHAKK0BkZWZ0cCB7RGF0YSB0eXBlfSBnY3J5X2hhbmRsZXJfc2VjdXJlX2NoZWNrX3QKK1RoaXMgdHlwZSBpcyBkZWZpbmVkIGFzOiBAY29kZXtpbnQgKigqZ2NyeV9oYW5kbGVyX3NlY3VyZV9jaGVja190KSAoY29uc3Qgdm9pZCAqKX0uCitAZW5kIGRlZnRwCitAZGVmdHAge0RhdGEgdHlwZX0gZ2NyeV9oYW5kbGVyX3JlYWxsb2NfdAorVGhpcyB0eXBlIGlzIGRlZmluZWQgYXM6IEBjb2Rle3ZvaWQgKigqZ2NyeV9oYW5kbGVyX3JlYWxsb2NfdCkgKHZvaWQgKnAsIHNpemVfdCBuKX0uCitAZW5kIGRlZnRwCitAZGVmdHAge0RhdGEgdHlwZX0gZ2NyeV9oYW5kbGVyX2ZyZWVfdAorVGhpcyB0eXBlIGlzIGRlZmluZWQgYXM6IEBjb2Rle3ZvaWQgKigqZ2NyeV9oYW5kbGVyX2ZyZWVfdCkgKHZvaWQgKil9LgorQGVuZCBkZWZ0cAorCitTcGVjaWFsIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucyBjYW4gYmUgaW5zdGFsbGVkIHdpdGggdGhlCitmb2xsb3dpbmcgZnVuY3Rpb246CisKK0BkZWZ0eXBlZnVuIHZvaWQgZ2NyeV9zZXRfYWxsb2NhdGlvbl9oYW5kbGVyIChnY3J5X2hhbmRsZXJfYWxsb2NfdCBAdmFye2Z1bmNfYWxsb2N9LCBnY3J5X2hhbmRsZXJfYWxsb2NfdCBAdmFye2Z1bmNfYWxsb2Nfc2VjdXJlfSwgZ2NyeV9oYW5kbGVyX3NlY3VyZV9jaGVja190IEB2YXJ7ZnVuY19zZWN1cmVfY2hlY2t9LCBnY3J5X2hhbmRsZXJfcmVhbGxvY190IEB2YXJ7ZnVuY19yZWFsbG9jfSwgZ2NyeV9oYW5kbGVyX2ZyZWVfdCBAdmFye2Z1bmNfZnJlZX0pCitJbnN0YWxsIHRoZSBwcm92aWRlZCBmdW5jdGlvbnMgYW5kIHVzZSB0aGVtIGluc3RlYWQgb2YgdGhlIGJ1aWx0LWluCitmdW5jdGlvbnMgZm9yIGRvaW5nIG1lbW9yeSBhbGxvY2F0aW9uLiAgVXNpbmcgdGhpcyBmdW5jdGlvbiBpcyBpbgorZ2VuZXJhbCBub3QgcmVjb21tZW5kZWQgYmVjYXVzZSB0aGUgc3RhbmRhcmQgTGliZ2NyeXB0IGFsbG9jYXRpb24KK2Z1bmN0aW9ucyBhcmUgZ3VhcmFudGVlZCB0byB6ZXJvaXplIG1lbW9yeSBpZiBuZWVkZWQuCisKK1RoaXMgZnVuY3Rpb24gbWF5IGJlIHVzZWQgb25seSBkdXJpbmcgaW5pdGlhbGl6YXRpb24gYW5kIG1heSBub3QgYmUKK3VzZWQgaW4gZmlwcyBtb2RlLgorCisKK0BlbmQgZGVmdHlwZWZ1bgorCitAbm9kZSBFcnJvciBoYW5kbGVyCitAc2VjdGlvbiBFcnJvciBoYW5kbGVyCisKK1RoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIG1heSBiZSB1c2VkIHRvIHJlZ2lzdGVyIGhhbmRsZXIgZnVuY3Rpb25zIHRoYXQKK2FyZSBjYWxsZWQgYnkgTGliZ2NyeXB0IGluIGNhc2UgY2VydGFpbiBlcnJvciBjb25kaXRpb25zIG9jY3VyLiAgVGhleQorbWF5IGFuZCBzaG91bGQgYmUgcmVnaXN0ZXJlZCBwcmlvciB0byBjYWxsaW5nIEBjb2Rle2djcnlfY2hlY2tfdmVyc2lvbn0uCisKK0BkZWZ0cCB7RGF0YSB0eXBlfSBnY3J5X2hhbmRsZXJfbm9fbWVtX3QKK1RoaXMgdHlwZSBpcyBkZWZpbmVkIGFzOiBAY29kZXtpbnQgKCpnY3J5X2hhbmRsZXJfbm9fbWVtX3QpICh2b2lkICosIHNpemVfdCwgdW5zaWduZWQgaW50KX0KK0BlbmQgZGVmdHAKK0BkZWZ0eXBlZnVuIHZvaWQgZ2NyeV9zZXRfb3V0b2Zjb3JlX2hhbmRsZXIgKGdjcnlfaGFuZGxlcl9ub19tZW1fdCBAdmFye2Z1bmNfbm9fbWVtfSwgdm9pZCAqQHZhcntjYl9kYXRhfSkKK1RoaXMgZnVuY3Rpb24gcmVnaXN0ZXJzIEB2YXJ7ZnVuY19ub19tZW19IGFzIGBvdXQtb2YtY29yZSBoYW5kbGVyJywKK3doaWNoIG1lYW5zIHRoYXQgaXQgd2lsbCBiZSBjYWxsZWQgaW4gdGhlIGNhc2Ugb2Ygbm90IGhhdmluZyBlbm91Z2gKK21lbW9yeSBhdmFpbGFibGUuICBUaGUgaGFuZGxlciBpcyBjYWxsZWQgd2l0aCAzIGFyZ3VtZW50czogVGhlIGZpcnN0CitvbmUgaXMgdGhlIHBvaW50ZXIgQHZhcntjYl9kYXRhfSBhcyBzZXQgd2l0aCB0aGlzIGZ1bmN0aW9uLCB0aGUgc2Vjb25kCitpcyB0aGUgcmVxdWVzdGVkIG1lbW9yeSBzaXplIGFuZCB0aGUgbGFzdCBiZWluZyBhIGZsYWcuICBJZiBiaXQgMCBvZgordGhlIGZsYWcgaXMgc2V0LCBzZWN1cmUgbWVtb3J5IGhhcyBiZWVuIHJlcXVlc3RlZC4gIFRoZSBoYW5kbGVyIHNob3VsZAorZWl0aGVyIHJldHVybiB0cnVlIHRvIGluZGljYXRlIHRoYXQgTGliZ2NyeXB0IHNob3VsZCB0cnkgYWdhaW4KK2FsbG9jYXRpbmcgbWVtb3J5IG9yIHJldHVybiBmYWxzZSB0byBsZXQgTGliZ2NyeXB0IHVzZSBpdHMgZGVmYXVsdAorZmF0YWwgZXJyb3IgaGFuZGxlci4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHAge0RhdGEgdHlwZX0gZ2NyeV9oYW5kbGVyX2Vycm9yX3QKK1RoaXMgdHlwZSBpcyBkZWZpbmVkIGFzOiBAY29kZXt2b2lkICgqZ2NyeV9oYW5kbGVyX2Vycm9yX3QpICh2b2lkICosIGludCwgY29uc3QgY2hhciAqKX0KK0BlbmQgZGVmdHAKKworQGRlZnR5cGVmdW4gdm9pZCBnY3J5X3NldF9mYXRhbGVycm9yX2hhbmRsZXIgKGdjcnlfaGFuZGxlcl9lcnJvcl90IEB2YXJ7ZnVuY19lcnJvcn0sIHZvaWQgKkB2YXJ7Y2JfZGF0YX0pCitUaGlzIGZ1bmN0aW9uIHJlZ2lzdGVycyBAdmFye2Z1bmNfZXJyb3J9IGFzIGBlcnJvciBoYW5kbGVyJywKK3doaWNoIG1lYW5zIHRoYXQgaXQgd2lsbCBiZSBjYWxsZWQgaW4gZXJyb3IgY29uZGl0aW9ucy4KK0BlbmQgZGVmdHlwZWZ1bgorCitAbm9kZSBMb2dnaW5nIGhhbmRsZXIKK0BzZWN0aW9uIExvZ2dpbmcgaGFuZGxlcgorCitAZGVmdHAge0RhdGEgdHlwZX0gZ2NyeV9oYW5kbGVyX2xvZ190CitUaGlzIHR5cGUgaXMgZGVmaW5lZCBhczogQGNvZGV7dm9pZCAoKmdjcnlfaGFuZGxlcl9sb2dfdCkgKHZvaWQgKiwgaW50LCBjb25zdCBjaGFyICosIHZhX2xpc3QpfQorQGVuZCBkZWZ0cAorCitAZGVmdHlwZWZ1biB2b2lkIGdjcnlfc2V0X2xvZ19oYW5kbGVyIChnY3J5X2hhbmRsZXJfbG9nX3QgQHZhcntmdW5jX2xvZ30sIHZvaWQgKkB2YXJ7Y2JfZGF0YX0pCitUaGlzIGZ1bmN0aW9uIHJlZ2lzdGVycyBAdmFye2Z1bmNfbG9nfSBhcyBgbG9nZ2luZyBoYW5kbGVyJywgd2hpY2ggbWVhbnMKK3RoYXQgaXQgd2lsbCBiZSBjYWxsZWQgaW4gY2FzZSBMaWJnY3J5cHQgd2FudHMgdG8gbG9nIGEgbWVzc2FnZS4gIFRoaXMKK2Z1bmN0aW9uIG1heSBhbmQgc2hvdWxkIGJlIHVzZWQgcHJpb3IgdG8gY2FsbGluZworQGNvZGV7Z2NyeV9jaGVja192ZXJzaW9ufS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAYyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitAYyAqKioqKioqKioqKioqKioqKioqICBDaXBoZXJzICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitAYyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitAYyBAaW5jbHVkZSBjaXBoZXItcmVmLnRleGkKK0Bub2RlIFN5bW1ldHJpYyBjcnlwdG9ncmFwaHkKK0BjaGFwdGVyIFN5bW1ldHJpYyBjcnlwdG9ncmFwaHkKKworVGhlIGNpcGhlciBmdW5jdGlvbnMgYXJlIHVzZWQgZm9yIHN5bW1ldHJpY2FsIGNyeXB0b2dyYXBoeSwKK2kuZS4gY3J5cHRvZ3JhcGh5IHVzaW5nIGEgc2hhcmVkIGtleS4gIFRoZSBwcm9ncmFtbWluZyBtb2RlbCBmb2xsb3dzCithbiBvcGVuL3Byb2Nlc3MvY2xvc2UgcGFyYWRpZ20gYW5kIGlzIGluIHRoYXQgc2ltaWxhciB0byBvdGhlcgorYnVpbGRpbmcgYmxvY2tzIHByb3ZpZGVkIGJ5IExpYmdjcnlwdC4KKworQG1lbnUKKyogQXZhaWxhYmxlIGNpcGhlcnM6OiAgICAgICAgICAgTGlzdCBvZiBjaXBoZXJzIHN1cHBvcnRlZCBieSB0aGUgbGlicmFyeS4KKyogQ2lwaGVyIG1vZHVsZXM6OiAgICAgICAgICAgICAgSG93IHRvIHdvcmsgd2l0aCBjaXBoZXIgbW9kdWxlcy4KKyogQXZhaWxhYmxlIGNpcGhlciBtb2Rlczo6ICAgICAgTGlzdCBvZiBjaXBoZXIgbW9kZXMgc3VwcG9ydGVkIGJ5IHRoZSBsaWJyYXJ5LgorKiBXb3JraW5nIHdpdGggY2lwaGVyIGhhbmRsZXM6OiAgSG93IHRvIHBlcmZvcm0gb3BlcmF0aW9ucyByZWxhdGVkIHRvIGNpcGhlciBoYW5kbGVzLgorKiBHZW5lcmFsIGNpcGhlciBmdW5jdGlvbnM6OiAgICBHZW5lcmFsIGNpcGhlciBmdW5jdGlvbnMgaW5kZXBlbmRlbnQgb2YgY2lwaGVyIGhhbmRsZXMuCitAZW5kIG1lbnUKKworQG5vZGUgQXZhaWxhYmxlIGNpcGhlcnMKK0BzZWN0aW9uIEF2YWlsYWJsZSBjaXBoZXJzCisKK0B0YWJsZSBAY29kZQorQGl0ZW0gR0NSWV9DSVBIRVJfTk9ORQorVGhpcyBpcyBub3QgYSByZWFsIGFsZ29yaXRobSBidXQgdXNlZCBieSBzb21lIGZ1bmN0aW9ucyBhcyBlcnJvciByZXR1cm4uCitUaGUgdmFsdWUgYWx3YXlzIGV2YWx1YXRlcyB0byBmYWxzZS4KKworQGl0ZW0gR0NSWV9DSVBIRVJfSURFQQorQGNpbmRleCBJREVBCitUaGlzIGlzIHRoZSBJREVBIGFsZ29yaXRobS4gIFRoZSBjb25zdGFudCBpcyBwcm92aWRlZCBidXQgdGhlcmUgaXMKK2N1cnJlbnRseSBubyBpbXBsZW1lbnRhdGlvbiBmb3IgaXQgYmVjYXVzZSB0aGUgYWxnb3JpdGhtIGlzIHBhdGVudGVkLgorCitAaXRlbSBHQ1JZX0NJUEhFUl8zREVTCitAY2luZGV4IDNERVMKK0BjaW5kZXggVHJpcGxlLURFUworQGNpbmRleCBERVMtRURFCitAY2luZGV4IERpZ2l0YWwgRW5jcnlwdGlvbiBTdGFuZGFyZAorVHJpcGxlLURFUyB3aXRoIDMgS2V5cyBhcyBFREUuICBUaGUga2V5IHNpemUgb2YgdGhpcyBhbGdvcml0aG0gaXMgMTY4IGJ1dAoreW91IGhhdmUgdG8gcGFzcyAxOTIgYml0cyBiZWNhdXNlIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdHMgb2YgZWFjaCBieXRlCithcmUgaWdub3JlZC4KKworQGl0ZW0gR0NSWV9DSVBIRVJfQ0FTVDUKK0BjaW5kZXggQ0FTVDUKK0NBU1QxMjgtNSBibG9jayBjaXBoZXIgYWxnb3JpdGhtLiAgVGhlIGtleSBzaXplIGlzIDEyOCBiaXRzLgorCQorQGl0ZW0gR0NSWV9DSVBIRVJfQkxPV0ZJU0gKK0BjaW5kZXggQmxvd2Zpc2gKK1RoZSBibG93ZmlzaCBhbGdvcml0aG0uIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGFsbG93cyBvbmx5IGZvciBhIGtleQorc2l6ZSBvZiAxMjggYml0cy4KKworQGl0ZW0gR0NSWV9DSVBIRVJfU0FGRVJfU0sxMjgKK1Jlc2VydmVkIGFuZCBub3QgY3VycmVudGx5IGltcGxlbWVudGVkLgorCitAaXRlbSBHQ1JZX0NJUEhFUl9ERVNfU0sJICAKK1Jlc2VydmVkIGFuZCBub3QgY3VycmVudGx5IGltcGxlbWVudGVkLgorIAorQGl0ZW0gIEdDUllfQ0lQSEVSX0FFUyAgICAgICAgCitAaXRlbXggR0NSWV9DSVBIRVJfQUVTMTI4CitAaXRlbXggR0NSWV9DSVBIRVJfUklKTkRBRUwKK0BpdGVteCBHQ1JZX0NJUEhFUl9SSUpOREFFTDEyOAorQGNpbmRleCBSaWpuZGFlbAorQGNpbmRleCBBRVMKK0BjaW5kZXggQWR2YW5jZWQgRW5jcnlwdGlvbiBTdGFuZGFyZAorQUVTIChSaWpuZGFlbCkgd2l0aCBhIDEyOCBiaXQga2V5LgorCitAaXRlbSAgR0NSWV9DSVBIRVJfQUVTMTkyICAgICAKK0BpdGVteCBHQ1JZX0NJUEhFUl9SSUpOREFFTDE5MgorQUVTIChSaWpuZGFlbCkgd2l0aCBhIDE5MiBiaXQga2V5LgorCitAaXRlbSAgR0NSWV9DSVBIRVJfQUVTMjU2IAorQGl0ZW14IEdDUllfQ0lQSEVSX1JJSk5EQUVMMjU2CitBRVMgKFJpam5kYWVsKSB3aXRoIGEgMjU2IGJpdCBrZXkuCisgICAgCitAaXRlbSAgR0NSWV9DSVBIRVJfVFdPRklTSAorQGNpbmRleCBUd29maXNoCitUaGUgVHdvZmlzaCBhbGdvcml0aG0gd2l0aCBhIDI1NiBiaXQga2V5LgorICAgIAorQGl0ZW0gIEdDUllfQ0lQSEVSX1RXT0ZJU0gxMjgKK1RoZSBUd29maXNoIGFsZ29yaXRobSB3aXRoIGEgMTI4IGJpdCBrZXkuCisgICAgCitAaXRlbSAgR0NSWV9DSVBIRVJfQVJDRk9VUiAgIAorQGNpbmRleCBBcmNmb3VyCitAY2luZGV4IFJDNAorQW4gYWxnb3JpdGhtIHdoaWNoIGlzIDEwMCUgY29tcGF0aWJsZSB3aXRoIFJTQSBJbmMuJ3MgUkM0IGFsZ29yaXRobS4KK05vdGUgdGhhdCB0aGlzIGlzIGEgc3RyZWFtIGNpcGhlciBhbmQgbXVzdCBiZSB1c2VkIHZlcnkgY2FyZWZ1bGx5IHRvCithdm9pZCBhIGNvdXBsZSBvZiB3ZWFrbmVzc2VzLiAKKworQGl0ZW0gIEdDUllfQ0lQSEVSX0RFUworQGNpbmRleCBERVMKK1N0YW5kYXJkIERFUyB3aXRoIGEgNTYgYml0IGtleS4gWW91IG5lZWQgdG8gcGFzcyA2NCBiaXQgYnV0IHRoZSBoaWdoCitiaXRzIG9mIGVhY2ggYnl0ZSBhcmUgaWdub3JlZC4gIE5vdGUsIHRoYXQgdGhpcyBpcyBhIHdlYWsgYWxnb3JpdGhtCit3aGljaCBjYW4gYmUgYnJva2VuIGluIHJlYXNvbmFibGUgdGltZSB1c2luZyBhIGJydXRlIGZvcmNlIGFwcHJvYWNoLgorCitAaXRlbSAgR0NSWV9DSVBIRVJfU0VSUEVOVDEyOAorQGl0ZW14IEdDUllfQ0lQSEVSX1NFUlBFTlQxOTIKK0BpdGVteCBHQ1JZX0NJUEhFUl9TRVJQRU5UMjU2CitAY2luZGV4IFNlcnBlbnQKK1RoZSBTZXJwZW50IGNpcGhlciBmcm9tIHRoZSBBRVMgY29udGVzdC4KKworQGl0ZW0gIEdDUllfQ0lQSEVSX1JGQzIyNjhfNDAKK0BpdGVteCBHQ1JZX0NJUEhFUl9SRkMyMjY4XzEyOAorQGNpbmRleCByZmMtMjI2OAorQGNpbmRleCBSQzIKK1JvbidzIENpcGhlciAyIGluIHRoZSA0MCBhbmQgMTI4IGJpdCB2YXJpYW50cy4gIE5vdGUsIHRoYXQgd2UgY3VycmVudGx5Citvbmx5IHN1cHBvcnQgdGhlIDQwIGJpdCB2YXJpYW50LiAgVGhlIGlkZW50aWZpZXIgZm9yIDEyOCBpcyByZXNlcnZlZCBmb3IKK2Z1dHVyZSB1c2UuCisKK0BpdGVtIEdDUllfQ0lQSEVSX1NFRUQKK0BjaW5kZXggU2VlZCAoY2lwaGVyKQorQSAxMjggYml0IGNpcGhlciBhcyBkZXNjcmliZWQgYnkgUkZDNDI2OS4KKworQGl0ZW0gIEdDUllfQ0lQSEVSX0NBTUVMTElBMTI4CitAaXRlbXggR0NSWV9DSVBIRVJfQ0FNRUxMSUExOTIKK0BpdGVteCBHQ1JZX0NJUEhFUl9DQU1FTExJQTI1NgorQGNpbmRleCBDYW1lbGxpYQorVGhlIENhbWVsbGlhIGNpcGhlciBieSBOVFQuICBTZWUKK0B1cmVme2h0dHA6Ly9pbmZvLmlzbC5udHQuY28uanAvQC9jcnlwdC9AL2VuZy9AL2NhbWVsbGlhL0Avc3BlY2lmaWNhdGlvbnMuaHRtbH0uCisKK0BlbmQgdGFibGUKKworQG5vZGUgQ2lwaGVyIG1vZHVsZXMKK0BzZWN0aW9uIENpcGhlciBtb2R1bGVzCisKK0xpYmdjcnlwdCBtYWtlcyBpdCBwb3NzaWJsZSB0byBsb2FkIGFkZGl0aW9uYWwgYGNpcGhlciBtb2R1bGVzJzsgdGhlc2UKK2NpcGhlcnMgY2FuIGJlIHVzZWQganVzdCBsaWtlIHRoZSBjaXBoZXIgYWxnb3JpdGhtcyB0aGF0IGFyZSBidWlsdAoraW50byB0aGUgbGlicmFyeSBkaXJlY3RseS4gIEZvciBhbiBpbnRyb2R1Y3Rpb24gaW50byBleHRlbnNpb24KK21vZHVsZXMsIHNlZSBAeHJlZntNb2R1bGVzfS4KKworQGRlZnRwIHtEYXRhIHR5cGV9IGdjcnlfY2lwaGVyX3NwZWNfdAorVGhpcyBpcyB0aGUgYG1vZHVsZSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZScgbmVlZGVkIGZvciByZWdpc3RlcmluZworY2lwaGVyIG1vZHVsZXMsIHdoaWNoIGhhcyB0byBiZSBmaWxsZWQgaW4gYnkgdGhlIHVzZXIgYmVmb3JlIGl0IGNhbiBiZQordXNlZCB0byByZWdpc3RlciBhIG1vZHVsZS4gIEl0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgbWVtYmVyczoKKworQHRhYmxlIEBjb2RlCitAaXRlbSBjb25zdCBjaGFyICpuYW1lCitUaGUgcHJpbWFyeSBuYW1lIG9mIHRoZSBhbGdvcml0aG0uCitAaXRlbSBjb25zdCBjaGFyICoqYWxpYXNlcworQSBsaXN0IG9mIHN0cmluZ3MgdGhhdCBhcmUgYGFsaWFzZXMnIGZvciB0aGUgYWxnb3JpdGhtLiAgVGhlIGxpc3QgbXVzdAorYmUgdGVybWluYXRlZCB3aXRoIGEgTlVMTCBlbGVtZW50LgorQGl0ZW0gZ2NyeV9jaXBoZXJfb2lkX3NwZWNfdCAqb2lkcworQSBsaXN0IG9mIE9JRHMgdGhhdCBhcmUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbGdvcml0aG0uICBUaGUKK2xpc3QncyBsYXN0IGVsZW1lbnQgbXVzdCBoYXZlIGl0J3MgYG9pZCcgbWVtYmVyIHNldCB0byBOVUxMLiAgU2VlCitiZWxvdyBmb3IgYW4gZXhwbGFuYXRpb24gb2YgdGhpcyB0eXBlLgorQGl0ZW0gc2l6ZV90IGJsb2Nrc2l6ZQorVGhlIGJsb2NrIHNpemUgb2YgdGhlIGFsZ29yaXRobSwgaW4gYnl0ZXMuCitAaXRlbSBzaXplX3Qga2V5bGVuCitUaGUgbGVuZ3RoIG9mIHRoZSBrZXksIGluIGJpdHMuCitAaXRlbSBzaXplX3QgY29udGV4dHNpemUKK1RoZSBzaXplIG9mIHRoZSBhbGdvcml0aG0tc3BlY2lmaWMgYGNvbnRleHQnLCB0aGF0IHNob3VsZCBiZSBhbGxvY2F0ZWQKK2ZvciBlYWNoIGhhbmRsZS4KK0BpdGVtIGdjcnlfY2lwaGVyX3NldGtleV90IHNldGtleQorVGhlIGZ1bmN0aW9uIHJlc3BvbnNpYmxlIGZvciBpbml0aWFsaXppbmcgYSBoYW5kbGUgd2l0aCBhIHByb3ZpZGVkCitrZXkuICBTZWUgYmVsb3cgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhpcyB0eXBlLgorQGl0ZW0gZ2NyeV9jaXBoZXJfZW5jcnlwdF90IGVuY3J5cHQKK1RoZSBmdW5jdGlvbiByZXNwb25zaWJsZSBmb3IgZW5jcnlwdGluZyBhIHNpbmdsZSBibG9jay4gIFNlZSBiZWxvdyBmb3IKK2EgZGVzY3JpcHRpb24gb2YgdGhpcyB0eXBlLgorQGl0ZW0gZ2NyeV9jaXBoZXJfZGVjcnlwdF90IGRlY3J5cHQKK1RoZSBmdW5jdGlvbiByZXNwb25zaWJsZSBmb3IgZGVjcnlwdGluZyBhIHNpbmdsZSBibG9jay4gIFNlZSBiZWxvdyBmb3IKK2EgZGVzY3JpcHRpb24gb2YgdGhpcyB0eXBlLgorQGl0ZW0gZ2NyeV9jaXBoZXJfc3RlbmNyeXB0X3Qgc3RlbmNyeXB0CitMaWtlIGBlbmNyeXB0JywgZm9yIHN0cmVhbSBjaXBoZXJzLiAgU2VlIGJlbG93IGZvciBhIGRlc2NyaXB0aW9uIG9mCit0aGlzIHR5cGUuCitAaXRlbSBnY3J5X2NpcGhlcl9zdGRlY3J5cHRfdCBzdGRlY3J5cHQKK0xpa2UgYGRlY3J5cHQnLCBmb3Igc3RyZWFtIGNpcGhlcnMuICBTZWUgYmVsb3cgZm9yIGEgZGVzY3JpcHRpb24gb2YKK3RoaXMgdHlwZS4KK0BlbmQgdGFibGUKK0BlbmQgZGVmdHAKKworQGRlZnRwIHtEYXRhIHR5cGV9IGdjcnlfY2lwaGVyX29pZF9zcGVjX3QKK1RoaXMgdHlwZSBpcyB1c2VkIGZvciBhc3NvY2lhdGluZyBhIHVzZXItcHJvdmlkZWQgYWxnb3JpdGhtCitpbXBsZW1lbnRhdGlvbiB3aXRoIGNlcnRhaW4gT0lEcy4gIEl0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgbWVtYmVyczoKK0B0YWJsZSBAY29kZQorQGl0ZW0gY29uc3QgY2hhciAqb2lkCitUZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBPSUQuCitAaXRlbSBpbnQgbW9kZQorQ2lwaGVyIG1vZGUgZm9yIHdoaWNoIHRoaXMgT0lEIGlzIHZhbGlkLgorQGVuZCB0YWJsZQorQGVuZCBkZWZ0cAorCitAZGVmdHAge0RhdGEgdHlwZX0gZ2NyeV9jaXBoZXJfc2V0a2V5X3QKK1R5cGUgZm9yIHRoZSBgc2V0a2V5JyBmdW5jdGlvbiwgZGVmaW5lZCBhczogZ2NyeV9lcnJfY29kZV90CisoKmdjcnlfY2lwaGVyX3NldGtleV90KSAodm9pZCAqYywgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCB1bnNpZ25lZAora2V5bGVuKQorQGVuZCBkZWZ0cAorCitAZGVmdHAge0RhdGEgdHlwZX0gZ2NyeV9jaXBoZXJfZW5jcnlwdF90CitUeXBlIGZvciB0aGUgYGVuY3J5cHQnIGZ1bmN0aW9uLCBkZWZpbmVkIGFzOiBnY3J5X2Vycl9jb2RlX3QKKygqZ2NyeV9jaXBoZXJfZW5jcnlwdF90KSAodm9pZCAqYywgY29uc3QgdW5zaWduZWQgY2hhciAqb3V0YnVmLCBjb25zdAordW5zaWduZWQgY2hhciAqaW5idWYpCitAZW5kIGRlZnRwCisKK0BkZWZ0cCB7RGF0YSB0eXBlfSBnY3J5X2NpcGhlcl9kZWNyeXB0X3QKK1R5cGUgZm9yIHRoZSBgZGVjcnlwdCcgZnVuY3Rpb24sIGRlZmluZWQgYXM6IGdjcnlfZXJyX2NvZGVfdAorKCpnY3J5X2NpcGhlcl9kZWNyeXB0X3QpICh2b2lkICpjLCBjb25zdCB1bnNpZ25lZCBjaGFyICpvdXRidWYsIGNvbnN0Cit1bnNpZ25lZCBjaGFyICppbmJ1ZikKK0BlbmQgZGVmdHAKKworQGRlZnRwIHtEYXRhIHR5cGV9IGdjcnlfY2lwaGVyX3N0ZW5jcnlwdF90CitUeXBlIGZvciB0aGUgYHN0ZW5jcnlwdCcgZnVuY3Rpb24sIGRlZmluZWQgYXM6IGdjcnlfZXJyX2NvZGVfdAorKCpnY3J5X0AvY2lwaGVyX0Avc3RlbmNyeXB0X0AvdCkgKHZvaWQgKmMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm91dGJ1ZiwgY29uc3QKK3Vuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgaW50IG4pCitAZW5kIGRlZnRwCisKK0BkZWZ0cCB7RGF0YSB0eXBlfSBnY3J5X2NpcGhlcl9zdGRlY3J5cHRfdAorVHlwZSBmb3IgdGhlIGBzdGRlY3J5cHQnIGZ1bmN0aW9uLCBkZWZpbmVkIGFzOiBnY3J5X2Vycl9jb2RlX3QKKygqZ2NyeV9AL2NpcGhlcl9AL3N0ZGVjcnlwdF9AL3QpICh2b2lkICpjLCBjb25zdCB1bnNpZ25lZCBjaGFyICpvdXRidWYsIGNvbnN0Cit1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGludCBuKQorQGVuZCBkZWZ0cAorCitAZGVmdHlwZWZ1biBnY3J5X2Vycm9yX3QgZ2NyeV9jaXBoZXJfcmVnaXN0ZXIgKGdjcnlfY2lwaGVyX3NwZWNfdCAqQHZhcntjaXBoZXJ9LCB1bnNpZ25lZCBpbnQgKmFsZ29yaXRobV9pZCwgZ2NyeV9tb2R1bGVfdCAqQHZhcnttb2R1bGV9KQorCitSZWdpc3RlciBhIG5ldyBjaXBoZXIgbW9kdWxlIHdob3NlIHNwZWNpZmljYXRpb24gY2FuIGJlIGZvdW5kIGluCitAdmFye2NpcGhlcn0uICBPbiBzdWNjZXNzLCBhIG5ldyBhbGdvcml0aG0gSUQgaXMgc3RvcmVkIGluCitAdmFye2FsZ29yaXRobV9pZH0gYW5kIGEgcG9pbnRlciByZXByZXNlbnRpbmcgdGhpcyBtb2R1bGUgaXMgc3RvcmVkCitpbiBAdmFye21vZHVsZX0uCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gdm9pZCBnY3J5X2NpcGhlcl91bnJlZ2lzdGVyIChnY3J5X21vZHVsZV90IEB2YXJ7bW9kdWxlfSkKK1VucmVnaXN0ZXIgdGhlIGNpcGhlciBpZGVudGlmaWVkIGJ5IEB2YXJ7bW9kdWxlfSwgd2hpY2ggbXVzdCBoYXZlIGJlZW4KK3JlZ2lzdGVyZWQgd2l0aCBnY3J5X2NpcGhlcl9yZWdpc3Rlci4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBnY3J5X2Vycm9yX3QgZ2NyeV9jaXBoZXJfbGlzdCAoaW50ICpAdmFye2xpc3R9LCBpbnQgKkB2YXJ7bGlzdF9sZW5ndGh9KQorR2V0IGEgbGlzdCBjb25zaXN0aW5nIG9mIHRoZSBJRHMgb2YgdGhlIGxvYWRlZCBjaXBoZXIgbW9kdWxlcy4gIElmCitAdmFye2xpc3R9IGlzIHplcm8sIHdyaXRlIHRoZSBudW1iZXIgb2YgbG9hZGVkIGNpcGhlciBtb2R1bGVzIHRvCitAdmFye2xpc3RfbGVuZ3RofSBhbmQgcmV0dXJuLiAgSWYgQHZhcntsaXN0fSBpcyBub24temVybywgdGhlIGZpcnN0CisqQHZhcntsaXN0X2xlbmd0aH0gYWxnb3JpdGhtIElEcyBhcmUgc3RvcmVkIGluIEB2YXJ7bGlzdH0sIHdoaWNoIG11c3QKK2JlIG9mIGFjY29yZGluZyBzaXplLiAgSW4gY2FzZSB0aGVyZSBhcmUgbGVzcyBjaXBoZXIgbW9kdWxlcyB0aGFuCisqQHZhcntsaXN0X2xlbmd0aH0sICpAdmFye2xpc3RfbGVuZ3RofSBpcyB1cGRhdGVkIHRvIHRoZSBjb3JyZWN0CitudW1iZXIuCitAZW5kIGRlZnR5cGVmdW4KKworQG5vZGUgQXZhaWxhYmxlIGNpcGhlciBtb2RlcworQHNlY3Rpb24gQXZhaWxhYmxlIGNpcGhlciBtb2RlcworCitAdGFibGUgQGNvZGUKK0BpdGVtIEdDUllfQ0lQSEVSX01PREVfTk9ORQorTm8gbW9kZSBzcGVjaWZpZWQuICBUaGlzIHNob3VsZCBub3QgYmUgdXNlZC4gIFRoZSBvbmx5IGV4Y2VwdGlvbiBpcyB0aGF0CitpZiBMaWJnY3J5cHQgaXMgbm90IHVzZWQgaW4gRklQUyBtb2RlIGFuZCBpZiBhbnkgZGVidWcgZmxhZyBoYXMgYmVlbgorc2V0LCB0aGlzIG1vZGUgbWF5IGJlIHVzZWQgdG8gYnlwYXNzIHRoZSBhY3R1YWwgZW5jcnlwdGlvbi4KKworQGl0ZW0gR0NSWV9DSVBIRVJfTU9ERV9FQ0IKK0BjaW5kZXggRUNCLCBFbGVjdHJvbmljIENvZGVib29rIG1vZGUKK0VsZWN0cm9uaWMgQ29kZWJvb2sgbW9kZS4gIAorCitAaXRlbSBHQ1JZX0NJUEhFUl9NT0RFX0NGQgorQGNpbmRleCBDRkIsIENpcGhlciBGZWVkYmFjayBtb2RlCitDaXBoZXIgRmVlZGJhY2sgbW9kZS4gIFRoZSBzaGlmdCBzaXplIGVxdWFscyB0aGUgYmxvY2sgc2l6ZSBvZiB0aGUKK2NpcGhlciAoZS5nLiBmb3IgQUVTIGl0IGlzIENGQi0xMjgpLgorCitAaXRlbSAgR0NSWV9DSVBIRVJfTU9ERV9DQkMKK0BjaW5kZXggQ0JDLCBDaXBoZXIgQmxvY2sgQ2hhaW5pbmcgbW9kZQorQ2lwaGVyIEJsb2NrIENoYWluaW5nIG1vZGUuCisKK0BpdGVtIEdDUllfQ0lQSEVSX01PREVfU1RSRUFNCitTdHJlYW0gbW9kZSwgb25seSB0byBiZSB1c2VkIHdpdGggc3RyZWFtIGNpcGhlciBhbGdvcml0aG1zLgorCitAaXRlbSBHQ1JZX0NJUEhFUl9NT0RFX09GQgorQGNpbmRleCBPRkIsIE91dHB1dCBGZWVkYmFjayBtb2RlCitPdXRwdXQgRmVlZGJhY2sgbW9kZS4KKworQGl0ZW0gIEdDUllfQ0lQSEVSX01PREVfQ1RSCitAY2luZGV4IENUUiwgQ291bnRlciBtb2RlCitDb3VudGVyIG1vZGUuCisKK0BlbmQgdGFibGUKKworQG5vZGUgV29ya2luZyB3aXRoIGNpcGhlciBoYW5kbGVzCitAc2VjdGlvbiBXb3JraW5nIHdpdGggY2lwaGVyIGhhbmRsZXMKKworVG8gdXNlIGEgY2lwaGVyIGFsZ29yaXRobSwgeW91IG11c3QgZmlyc3QgYWxsb2NhdGUgYW4gYWNjb3JkaW5nCitoYW5kbGUuICBUaGlzIGlzIHRvIGJlIGRvbmUgdXNpbmcgdGhlIG9wZW4gZnVuY3Rpb246CisKK0BkZWZ0eXBlZnVuIGdjcnlfZXJyb3JfdCBnY3J5X2NpcGhlcl9vcGVuIChnY3J5X2NpcGhlcl9oZF90ICpAdmFye2hkfSwgaW50IEB2YXJ7YWxnb30sIGludCBAdmFye21vZGV9LCB1bnNpZ25lZCBpbnQgQHZhcntmbGFnc30pCisKK1RoaXMgZnVuY3Rpb24gY3JlYXRlcyB0aGUgY29udGV4dCBoYW5kbGUgcmVxdWlyZWQgZm9yIG1vc3Qgb2YgdGhlCitvdGhlciBjaXBoZXIgZnVuY3Rpb25zIGFuZCByZXR1cm5zIGEgaGFuZGxlIHRvIGl0IGluIGBoZCcuICBJbiBjYXNlIG9mCithbiBlcnJvciwgYW4gYWNjb3JkaW5nIGVycm9yIGNvZGUgaXMgcmV0dXJuZWQuCisKK1RoZSBJRCBvZiBhbGdvcml0aG0gdG8gdXNlIG11c3QgYmUgc3BlY2lmaWVkIHZpYSBAdmFye2FsZ299LiAgU2VlCitAeHJlZntBdmFpbGFibGUgY2lwaGVyc30sIGZvciBhIGxpc3Qgb2Ygc3VwcG9ydGVkIGNpcGhlcnMgYW5kIHRoZQorYWNjb3JkaW5nIGNvbnN0YW50cy4KKworQmVzaWRlcyB1c2luZyB0aGUgY29uc3RhbnRzIGRpcmVjdGx5LCB0aGUgZnVuY3Rpb24KK0Bjb2Rle2djcnlfY2lwaGVyX21hcF9uYW1lfSBtYXkgYmUgdXNlZCB0byBjb252ZXJ0IHRoZSB0ZXh0dWFsIG5hbWUgb2YKK2FuIGFsZ29yaXRobSBpbnRvIHRoZSBhY2NvcmRpbmcgbnVtZXJpYyBJRC4KKworVGhlIGNpcGhlciBtb2RlIHRvIHVzZSBtdXN0IGJlIHNwZWNpZmllZCB2aWEgQHZhcnttb2RlfS4gIFNlZQorQHhyZWZ7QXZhaWxhYmxlIGNpcGhlciBtb2Rlc30sIGZvciBhIGxpc3Qgb2Ygc3VwcG9ydGVkIGNpcGhlciBtb2RlcworYW5kIHRoZSBhY2NvcmRpbmcgY29uc3RhbnRzLiAgTm90ZSB0aGF0IHNvbWUgbW9kZXMgYXJlIGluY29tcGF0aWJsZQord2l0aCBzb21lIGFsZ29yaXRobXMgLSBpbiBwYXJ0aWN1bGFyLCBzdHJlYW0gbW9kZQorKEBjb2Rle0dDUllfQ0lQSEVSX01PREVfU1RSRUFNfSkgb25seSB3b3JrcyB3aXRoIHN0cmVhbSBjaXBoZXJzLiBBbnkKK2Jsb2NrIGNpcGhlciBtb2RlIChAY29kZXtHQ1JZX0NJUEhFUl9NT0RFX0VDQn0sCitAY29kZXtHQ1JZX0NJUEhFUl9NT0RFX0NCQ30sIEBjb2Rle0dDUllfQ0lQSEVSX01PREVfQ0ZCfSwKK0Bjb2Rle0dDUllfQ0lQSEVSX01PREVfT0ZCfSBvciBAY29kZXtHQ1JZX0NJUEhFUl9NT0RFX0NUUn0pIHdpbGwgd29yaword2l0aCBhbnkgYmxvY2sgY2lwaGVyIGFsZ29yaXRobS4KKworVGhlIHRoaXJkIGFyZ3VtZW50IEB2YXJ7ZmxhZ3N9IGNhbiBlaXRoZXIgYmUgcGFzc2VkIGFzIEBjb2RlezB9IG9yIGFzCit0aGUgYml0LXdpc2UgT1Igb2YgdGhlIGZvbGxvd2luZyBjb25zdGFudHMuCisKK0B0YWJsZSBAY29kZQorQGl0ZW0gR0NSWV9DSVBIRVJfU0VDVVJFCitNYWtlIHN1cmUgdGhhdCBhbGwgb3BlcmF0aW9ucyBhcmUgYWxsb2NhdGVkIGluIHNlY3VyZSBtZW1vcnkuICBUaGlzIGlzCit1c2VmdWwgd2hlbiB0aGUga2V5IG1hdGVyaWFsIGlzIGhpZ2hseSBjb25maWRlbnRpYWwuCitAaXRlbSBHQ1JZX0NJUEhFUl9FTkFCTEVfU1lOQworQGNpbmRleCBzeW5jIG1vZGUgKE9wZW5QR1ApCitUaGlzIGZsYWcgZW5hYmxlcyB0aGUgQ0ZCIHN5bmMgbW9kZSwgd2hpY2ggaXMgYSBzcGVjaWFsIGZlYXR1cmUgb2YKK0xpYmdjcnlwdCdzIENGQiBtb2RlIGltcGxlbWVudGF0aW9uIHRvIGFsbG93IGZvciBPcGVuUEdQJ3MgQ0ZCIHZhcmlhbnQuIAorU2VlIEBjb2Rle2djcnlfY2lwaGVyX3N5bmN9LgorQGl0ZW0gR0NSWV9DSVBIRVJfQ0JDX0NUUworQGNpbmRleCBjaXBoZXIgdGV4dCBzdGVhbGluZworRW5hYmxlIGNpcGhlciB0ZXh0IHN0ZWFsaW5nIChDVFMpIGZvciB0aGUgQ0JDIG1vZGUuICBDYW5ub3QgYmUgdXNlZAorc2ltdWx0YW5lb3VzIGFzIEdDUllfQ0lQSEVSX0NCQ19NQUMuICBDVFMgbW9kZSBtYWtlcyBpdCBwb3NzaWJsZSB0bwordHJhbnNmb3JtIGRhdGEgb2YgYWxtb3N0IGFyYml0cmFyeSBzaXplIChvbmx5IGxpbWl0YXRpb24gaXMgdGhhdCBpdAorbXVzdCBiZSBncmVhdGVyIHRoYW4gdGhlIGFsZ29yaXRobSdzIGJsb2NrIHNpemUpLgorQGl0ZW0gR0NSWV9DSVBIRVJfQ0JDX01BQworQGNpbmRleCBDQkMtTUFDCitDb21wdXRlIENCQy1NQUMga2V5ZWQgY2hlY2tzdW1zLiAgVGhpcyBpcyB0aGUgc2FtZSBhcyBDQkMgbW9kZSwgYnV0Citvbmx5IG91dHB1dCB0aGUgbGFzdCBibG9jay4gIENhbm5vdCBiZSB1c2VkIHNpbXVsdGFuZW91cyBhcworR0NSWV9DSVBIRVJfQ0JDX0NUUy4KK0BlbmQgdGFibGUKK0BlbmQgZGVmdHlwZWZ1biAKKworVXNlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gdG8gcmVsZWFzZSBhbiBleGlzdGluZyBoYW5kbGU6CisKK0BkZWZ0eXBlZnVuIHZvaWQgZ2NyeV9jaXBoZXJfY2xvc2UgKGdjcnlfY2lwaGVyX2hkX3QgQHZhcntofSkKKworVGhpcyBmdW5jdGlvbiByZWxlYXNlcyB0aGUgY29udGV4dCBjcmVhdGVkIGJ5IEBjb2Rle2djcnlfY2lwaGVyX29wZW59LgorSXQgYWxzbyB6ZXJvaXNlcyBhbGwgc2Vuc2l0aXZlIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNpcGhlcgoraGFuZGxlLgorQGVuZCBkZWZ0eXBlZnVuCisKK0luIG9yZGVyIHRvIHVzZSBhIGhhbmRsZSBmb3IgcGVyZm9ybWluZyBjcnlwdG9ncmFwaGljIG9wZXJhdGlvbnMsIGEKK2BrZXknIGhhcyB0byBiZSBzZXQgZmlyc3Q6CisKK0BkZWZ0eXBlZnVuIGdjcnlfZXJyb3JfdCBnY3J5X2NpcGhlcl9zZXRrZXkgKGdjcnlfY2lwaGVyX2hkX3QgQHZhcntofSwgY29uc3Qgdm9pZCAqQHZhcntrfSwgc2l6ZV90IEB2YXJ7bH0pCisKK1NldCB0aGUga2V5IEB2YXJ7a30gdXNlZCBmb3IgZW5jcnlwdGlvbiBvciBkZWNyeXB0aW9uIGluIHRoZSBjb250ZXh0CitkZW5vdGVkIGJ5IHRoZSBoYW5kbGUgQHZhcntofS4gIFRoZSBsZW5ndGggQHZhcntsfSAoaW4gYnl0ZXMpIG9mIHRoZQora2V5IEB2YXJ7a30gbXVzdCBtYXRjaCB0aGUgcmVxdWlyZWQgbGVuZ3RoIG9mIHRoZSBhbGdvcml0aG0gc2V0IGZvcgordGhpcyBjb250ZXh0IG9yIGJlIGluIHRoZSBhbGxvd2VkIHJhbmdlIGZvciBhbGdvcml0aG1zIHdpdGggdmFyaWFibGUKK2tleSBzaXplLiAgVGhlIGZ1bmN0aW9uIGNoZWNrcyB0aGlzIGFuZCByZXR1cm5zIGFuIGVycm9yIGlmIHRoZXJlIGlzIGEKK3Byb2JsZW0uICBBIGNhbGxlciBzaG91bGQgYWx3YXlzIGNoZWNrIGZvciBhbiBlcnJvci4KKworQGVuZCBkZWZ0eXBlZnVuCisKK01vc3QgY3J5cHRvIG1vZGVzIHJlcXVpcmVzIGFuIGluaXRpYWxpemF0aW9uIHZlY3RvciAoSVYpLCB3aGljaAordXN1YWxseSBpcyBhIG5vbi1zZWNyZXQgcmFuZG9tIHN0cmluZyBhY3RpbmcgYXMgYSBraW5kIG9mIHNhbHQgdmFsdWUuCitUaGUgQ1RSIG1vZGUgcmVxdWlyZXMgYSBjb3VudGVyLCB3aGljaCBpcyBhbHNvIHNpbWlsYXIgdG8gYSBzYWx0Cit2YWx1ZS4gIFRvIHNldCB0aGUgSVYgb3IgQ1RSLCB1c2UgdGhlc2UgZnVuY3Rpb25zOgorCitAZGVmdHlwZWZ1biBnY3J5X2Vycm9yX3QgZ2NyeV9jaXBoZXJfc2V0aXYgKGdjcnlfY2lwaGVyX2hkX3QgQHZhcntofSwgY29uc3Qgdm9pZCAqQHZhcntrfSwgc2l6ZV90IEB2YXJ7bH0pCisKK1NldCB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIHVzZWQgZm9yIGVuY3J5cHRpb24gb3IgZGVjcnlwdGlvbi4gVGhlCit2ZWN0b3IgaXMgcGFzc2VkIGFzIHRoZSBidWZmZXIgQHZhcntLfSBvZiBsZW5ndGggQHZhcntsfSBieXRlcyBhbmQKK2NvcGllZCB0byBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMuICBUaGUgZnVuY3Rpb24gY2hlY2tzIHRoYXQgdGhlIElWCittYXRjaGVzIHRoZSByZXF1aXJlbWVudCBvZiB0aGUgc2VsZWN0ZWQgYWxnb3JpdGhtIGFuZCBtb2RlLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGdjcnlfZXJyb3JfdCBnY3J5X2NpcGhlcl9zZXRjdHIgKGdjcnlfY2lwaGVyX2hkX3QgQHZhcntofSwgY29uc3Qgdm9pZCAqQHZhcntjfSwgc2l6ZV90IEB2YXJ7bH0pCisKK1NldCB0aGUgY291bnRlciB2ZWN0b3IgdXNlZCBmb3IgZW5jcnlwdGlvbiBvciBkZWNyeXB0aW9uLiBUaGUgY291bnRlcgoraXMgcGFzc2VkIGFzIHRoZSBidWZmZXIgQHZhcntjfSBvZiBsZW5ndGggQHZhcntsfSBieXRlcyBhbmQgY29waWVkIHRvCitpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMuICBUaGUgZnVuY3Rpb24gY2hlY2tzIHRoYXQgdGhlIGNvdW50ZXIKK21hdGNoZXMgdGhlIHJlcXVpcmVtZW50IG9mIHRoZSBzZWxlY3RlZCBhbGdvcml0aG0gKGkuZS4sIGl0IG11c3QgYmUKK3RoZSBzYW1lIHNpemUgYXMgdGhlIGJsb2NrIHNpemUpLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGdjcnlfZXJyb3JfdCBnY3J5X2NpcGhlcl9yZXNldCAoZ2NyeV9jaXBoZXJfaGRfdCBAdmFye2h9KQorCitTZXQgdGhlIGdpdmVuIGhhbmRsZSdzIGNvbnRleHQgYmFjayB0byB0aGUgc3RhdGUgaXQgaGFkIGFmdGVyIHRoZSBsYXN0CitjYWxsIHRvIGdjcnlfY2lwaGVyX3NldGtleSBhbmQgY2xlYXIgdGhlIGluaXRpYWxpemF0aW9uIHZlY3Rvci4KKworTm90ZSB0aGF0IGdjcnlfY2lwaGVyX3Jlc2V0IGlzIGltcGxlbWVudGVkIGFzIGEgbWFjcm8uCitAZW5kIGRlZnR5cGVmdW4KKworVGhlIGFjdHVhbCBlbmNyeXB0aW9uIGFuZCBkZWNyeXB0aW9uIGlzIGRvbmUgYnkgdXNpbmcgb25lIG9mIHRoZQorZm9sbG93aW5nIGZ1bmN0aW9ucy4gIFRoZXkgbWF5IGJlIHVzZWQgYXMgb2Z0ZW4gYXMgcmVxdWlyZWQgdG8gcHJvY2VzcworYWxsIHRoZSBkYXRhLgorCitAZGVmdHlwZWZ1biBnY3J5X2Vycm9yX3QgZ2NyeV9jaXBoZXJfZW5jcnlwdCAoZ2NyeV9jaXBoZXJfaGRfdCBAdmFye2h9LCB1bnNpZ25lZCBjaGFyICp7b3V0fSwgc2l6ZV90IEB2YXJ7b3V0c2l6ZX0sIGNvbnN0IHVuc2lnbmVkIGNoYXIgKkB2YXJ7aW59LCBzaXplX3QgQHZhcntpbmxlbn0pCisKK0Bjb2Rle2djcnlfY2lwaGVyX2VuY3J5cHR9IGlzIHVzZWQgdG8gZW5jcnlwdCB0aGUgZGF0YS4gIFRoaXMgZnVuY3Rpb24KK2NhbiBlaXRoZXIgd29yayBpbiBwbGFjZSBvciB3aXRoIHR3byBidWZmZXJzLiAgSXQgdXNlcyB0aGUgY2lwaGVyCitjb250ZXh0IGFscmVhZHkgc2V0dXAgYW5kIGRlc2NyaWJlZCBieSB0aGUgaGFuZGxlIEB2YXJ7aH0uICBUaGVyZSBhcmUgMgord2F5cyB0byB1c2UgdGhlIGZ1bmN0aW9uOiBJZiBAdmFye2lufSBpcyBwYXNzZWQgYXMgQGNvZGV7TlVMTH0gYW5kCitAdmFye2lubGVufSBpcyBAY29kZXswfSwgaW4tcGxhY2UgZW5jcnlwdGlvbiBvZiB0aGUgZGF0YSBpbiBAdmFye291dH0gb3IKK2xlbmd0aCBAdmFye291dHNpemV9IHRha2VzIHBsYWNlLiAgV2l0aCBAdmFye2lufSBiZWluZyBub3QgQGNvZGV7TlVMTH0sCitAdmFye2lubGVufSBieXRlcyBhcmUgZW5jcnlwdGVkIHRvIHRoZSBidWZmZXIgQHZhcntvdXR9IHdoaWNoIG11c3QgaGF2ZQorYXQgbGVhc3QgYSBzaXplIG9mIEB2YXJ7aW5sZW59LiAgQHZhcntvdXRzaXplfSBtdXN0IGJlIHNldCB0byB0aGUKK2FsbG9jYXRlZCBzaXplIG9mIEB2YXJ7b3V0fSwgc28gdGhhdCB0aGUgZnVuY3Rpb24gY2FuIGNoZWNrIHRoYXQgdGhlcmUKK2lzIHN1ZmZpY2llbnQgc3BhY2UuIE5vdGUgdGhhdCBvdmVybGFwcGluZyBidWZmZXJzIGFyZSBub3QgYWxsb3dlZC4KKworRGVwZW5kaW5nIG9uIHRoZSBzZWxlY3RlZCBhbGdvcml0aG1zIGFuZCBlbmNyeXB0aW9uIG1vZGUsIHRoZSBsZW5ndGggb2YKK3RoZSBidWZmZXJzIG11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUgYmxvY2sgc2l6ZS4KKworVGhlIGZ1bmN0aW9uIHJldHVybnMgQGNvZGV7MH0gb24gc3VjY2VzcyBvciBhbiBlcnJvciBjb2RlLgorQGVuZCBkZWZ0eXBlZnVuCisKKworQGRlZnR5cGVmdW4gZ2NyeV9lcnJvcl90IGdjcnlfY2lwaGVyX2RlY3J5cHQgKGdjcnlfY2lwaGVyX2hkX3QgQHZhcntofSwgdW5zaWduZWQgY2hhciAqe291dH0sIHNpemVfdCBAdmFye291dHNpemV9LCBjb25zdCB1bnNpZ25lZCBjaGFyICpAdmFye2lufSwgc2l6ZV90IEB2YXJ7aW5sZW59KQorCitAY29kZXtnY3J5X2NpcGhlcl9kZWNyeXB0fSBpcyB1c2VkIHRvIGRlY3J5cHQgdGhlIGRhdGEuICBUaGlzIGZ1bmN0aW9uCitjYW4gZWl0aGVyIHdvcmsgaW4gcGxhY2Ugb3Igd2l0aCB0d28gYnVmZmVycy4gIEl0IHVzZXMgdGhlIGNpcGhlcgorY29udGV4dCBhbHJlYWR5IHNldHVwIGFuZCBkZXNjcmliZWQgYnkgdGhlIGhhbmRsZSBAdmFye2h9LiAgVGhlcmUgYXJlIDIKK3dheXMgdG8gdXNlIHRoZSBmdW5jdGlvbjogSWYgQHZhcntpbn0gaXMgcGFzc2VkIGFzIEBjb2Rle05VTEx9IGFuZAorQHZhcntpbmxlbn0gaXMgQGNvZGV7MH0sIGluLXBsYWNlIGRlY3J5cHRpb24gb2YgdGhlIGRhdGEgaW4gQHZhcntvdXR9IG9yCitsZW5ndGggQHZhcntvdXRzaXplfSB0YWtlcyBwbGFjZS4gIFdpdGggQHZhcntpbn0gYmVpbmcgbm90IEBjb2Rle05VTEx9LAorQHZhcntpbmxlbn0gYnl0ZXMgYXJlIGRlY3J5cHRlZCB0byB0aGUgYnVmZmVyIEB2YXJ7b3V0fSB3aGljaCBtdXN0IGhhdmUKK2F0IGxlYXN0IGEgc2l6ZSBvZiBAdmFye2lubGVufS4gIEB2YXJ7b3V0c2l6ZX0gbXVzdCBiZSBzZXQgdG8gdGhlCithbGxvY2F0ZWQgc2l6ZSBvZiBAdmFye291dH0sIHNvIHRoYXQgdGhlIGZ1bmN0aW9uIGNhbiBjaGVjayB0aGF0IHRoZXJlCitpcyBzdWZmaWNpZW50IHNwYWNlLiAgTm90ZSB0aGF0IG92ZXJsYXBwaW5nIGJ1ZmZlcnMgYXJlIG5vdCBhbGxvd2VkLgorCitEZXBlbmRpbmcgb24gdGhlIHNlbGVjdGVkIGFsZ29yaXRobXMgYW5kIGVuY3J5cHRpb24gbW9kZSwgdGhlIGxlbmd0aCBvZgordGhlIGJ1ZmZlcnMgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBibG9jayBzaXplLgorCitUaGUgZnVuY3Rpb24gcmV0dXJucyBAY29kZXswfSBvbiBzdWNjZXNzIG9yIGFuIGVycm9yIGNvZGUuCitAZW5kIGRlZnR5cGVmdW4KKworCitPcGVuUEdQIChhcyBkZWZpbmVkIGluIFJGQy0yNDQwKSByZXF1aXJlcyBhIHNwZWNpYWwgc3luYyBvcGVyYXRpb24gaW4KK3NvbWUgcGxhY2VzLiAgVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBpcyB1c2VkIGZvciB0aGlzOgorCitAZGVmdHlwZWZ1biBnY3J5X2Vycm9yX3QgZ2NyeV9jaXBoZXJfc3luYyAoZ2NyeV9jaXBoZXJfaGRfdCBAdmFye2h9KQorCitQZXJmb3JtIHRoZSBPcGVuUEdQIHN5bmMgb3BlcmF0aW9uIG9uIGNvbnRleHQgQHZhcntofS4gIE5vdGUgdGhhdCB0aGlzCitpcyBhIG5vLW9wIHVubGVzcyB0aGUgY29udGV4dCB3YXMgY3JlYXRlZCB3aXRoIHRoZSBmbGFnCitAY29kZXtHQ1JZX0NJUEhFUl9FTkFCTEVfU1lOQ30KK0BlbmQgZGVmdHlwZWZ1bgorCitTb21lIG9mIHRoZSBkZXNjcmliZWQgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBhcyBtYWNyb3MgdXRpbGl6aW5nIGEKK2NhdGNoLWFsbCBjb250cm9sIGZ1bmN0aW9uLiAgVGhpcyBjb250cm9sIGZ1bmN0aW9uIGlzIHJhcmVseSB1c2VkCitkaXJlY3RseSBidXQgdGhlcmUgaXMgbm90aGluZyB3aGljaCB3b3VsZCBpbmhpYml0IGl0OgorCitAZGVmdHlwZWZ1biBnY3J5X2Vycm9yX3QgZ2NyeV9jaXBoZXJfY3RsIChnY3J5X2NpcGhlcl9oZF90IEB2YXJ7aH0sIGludCBAdmFye2NtZH0sIHZvaWQgKkB2YXJ7YnVmZmVyfSwgc2l6ZV90IEB2YXJ7YnVmbGVufSkKKworQGNvZGV7Z2NyeV9jaXBoZXJfY3RsfSBjb250cm9scyB2YXJpb3VzIGFzcGVjdHMgb2YgdGhlIGNpcGhlciBtb2R1bGUgYW5kCitzcGVjaWZpYyBjaXBoZXIgY29udGV4dHMuICBVc3VhbGx5IHNvbWUgbW9yZSBzcGVjaWFsaXplZCBmdW5jdGlvbnMgb3IKK21hY3JvcyBhcmUgdXNlZCBmb3IgdGhpcyBwdXJwb3NlLiAgVGhlIHNlbWFudGljcyBvZiB0aGUgZnVuY3Rpb24gYW5kIGl0cworcGFyYW1ldGVycyBkZXBlbmRzIG9uIHRoZSB0aGUgY29tbWFuZCBAdmFye2NtZH0gYW5kIHRoZSBwYXNzZWQgY29udGV4dAoraGFuZGxlIEB2YXJ7aH0uICBQbGVhc2Ugc2VlIHRoZSBjb21tZW50cyBpbiB0aGUgc291cmNlIGNvZGUKKyhAY29kZXtzcmMvZ2xvYmFsLmN9KSBmb3IgZGV0YWlscy4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBnY3J5X2Vycm9yX3QgZ2NyeV9jaXBoZXJfaW5mbyAoZ2NyeV9jaXBoZXJfaGRfdCBAdmFye2h9LCBpbnQgQHZhcnt3aGF0fSwgdm9pZCAqQHZhcntidWZmZXJ9LCBzaXplX3QgKkB2YXJ7bmJ5dGVzfSkKKworQGNvZGV7Z2NyeV9jaXBoZXJfaW5mb30gaXMgdXNlZCB0byByZXRyaWV2ZSB2YXJpb3VzCitpbmZvcm1hdGlvbiBhYm91dCBhIGNpcGhlciBjb250ZXh0IG9yIHRoZSBjaXBoZXIgbW9kdWxlIGluIGdlbmVyYWwuCisKK0N1cnJlbnRseSBubyBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUuCitAZW5kIGRlZnR5cGVmdW4KKworQG5vZGUgR2VuZXJhbCBjaXBoZXIgZnVuY3Rpb25zCitAc2VjdGlvbiBHZW5lcmFsIGNpcGhlciBmdW5jdGlvbnMKKworVG8gd29yayB3aXRoIHRoZSBhbGdvcml0aG1zLCBzZXZlcmFsIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlIHRvIG1hcAorYWxnb3JpdGhtIG5hbWVzIHRvIHRoZSBpbnRlcm5hbCBpZGVudGlmaWVycywgYXMgd2VsbCBhcyB3YXlzIHRvCityZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBhbiBhbGdvcml0aG0gb3IgdGhlIGN1cnJlbnQgY2lwaGVyIGNvbnRleHQuCisKK0BkZWZ0eXBlZnVuIGdjcnlfZXJyb3JfdCBnY3J5X2NpcGhlcl9hbGdvX2luZm8gKGludCBAdmFye2FsZ299LCBpbnQgQHZhcnt3aGF0fSwgdm9pZCAqQHZhcntidWZmZXJ9LCBzaXplX3QgKkB2YXJ7bmJ5dGVzfSkKKworVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIG9uIGEgc3BlY2lmaWMgYWxnb3JpdGhtLgorWW91IHBhc3MgdGhlIGNpcGhlciBhbGdvcml0aG0gSUQgYXMgQHZhcnthbGdvfSBhbmQgdGhlIHR5cGUgb2YKK2luZm9ybWF0aW9uIHJlcXVlc3RlZCBhcyBAdmFye3doYXR9LiBUaGUgcmVzdWx0IGlzIGVpdGhlciByZXR1cm5lZCBhcwordGhlIHJldHVybiBjb2RlIG9mIHRoZSBmdW5jdGlvbiBvciBjb3BpZWQgdG8gdGhlIHByb3ZpZGVkIEB2YXJ7YnVmZmVyfQord2hvc2UgYWxsb2NhdGVkIGxlbmd0aCBtdXN0IGJlIGF2YWlsYWJsZSBpbiBhbiBpbnRlZ2VyIHZhcmlhYmxlIHdpdGggdGhlCithZGRyZXNzIHBhc3NlZCBpbiBAdmFye25ieXRlc30uICBUaGlzIHZhcmlhYmxlIHdpbGwgYWxzbyByZWNlaXZlIHRoZQorYWN0dWFsIHVzZWQgbGVuZ3RoIG9mIHRoZSBidWZmZXIuIAorCitIZXJlIGlzIGEgbGlzdCBvZiBzdXBwb3J0ZWQgY29kZXMgZm9yIEB2YXJ7d2hhdH06CisKK0BjIGJlZ2luIGNvbnN0YW50cyBmb3IgZ2NyeV9jaXBoZXJfYWxnb19pbmZvCitAdGFibGUgQGNvZGUKK0BpdGVtIEdDUllDVExfR0VUX0tFWUxFTjoKK1JldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBrZXkuIElmIHRoZSBhbGdvcml0aG0gc3VwcG9ydHMgbXVsdGlwbGUga2V5CitsZW5ndGhzLCB0aGUgbWF4aW11bSBzdXBwb3J0ZWQgdmFsdWUgaXMgcmV0dXJuZWQuICBUaGUgbGVuZ3RoIGlzCityZXR1cm5lZCBhcyBudW1iZXIgb2Ygb2N0ZXRzIChieXRlcykgYW5kIG5vdCBhcyBudW1iZXIgb2YgYml0cyBpbgorQHZhcntuYnl0ZXN9OyBAdmFye2J1ZmZlcn0gbXVzdCBiZSB6ZXJvLgorCitAaXRlbSBHQ1JZQ1RMX0dFVF9CTEtMRU46CitSZXR1cm4gdGhlIGJsb2NrIGxlbmd0aCBvZiB0aGUgYWxnb3JpdGhtLiAgVGhlIGxlbmd0aCBpcyByZXR1cm5lZCBhcyBhCitudW1iZXIgb2Ygb2N0ZXRzIGluIEB2YXJ7bmJ5dGVzfTsgQHZhcntidWZmZXJ9IG11c3QgYmUgemVyby4KKworQGl0ZW0gR0NSWUNUTF9URVNUX0FMR086CitSZXR1cm5zIEBjb2RlezB9IHdoZW4gdGhlIHNwZWNpZmllZCBhbGdvcml0aG0gaXMgYXZhaWxhYmxlIGZvciB1c2UuCitAdmFye2J1ZmZlcn0gYW5kIEB2YXJ7bmJ5dGVzfSBtdXN0IGJlIHplcm8uCisgCitAZW5kIHRhYmxlICAKK0BjIGVuZCBjb25zdGFudHMgZm9yIGdjcnlfY2lwaGVyX2FsZ29faW5mbworCitAZW5kIGRlZnR5cGVmdW4KK0BjIGVuZCBnY3J5X2NpcGhlcl9hbGdvX2luZm8KKworQGRlZnR5cGVmdW4ge2NvbnN0IGNoYXIgKn0gZ2NyeV9jaXBoZXJfYWxnb19uYW1lIChpbnQgQHZhcnthbGdvfSkKKworQGNvZGV7Z2NyeV9jaXBoZXJfYWxnb19uYW1lfSByZXR1cm5zIGEgc3RyaW5nIHdpdGggdGhlIG5hbWUgb2YgdGhlCitjaXBoZXIgYWxnb3JpdGhtIEB2YXJ7YWxnb30uICBJZiB0aGUgYWxnb3JpdGhtIGlzIG5vdCBrbm93biBvciBhbm90aGVyCitlcnJvciBvY2N1cnJlZCwgdGhlIHN0cmluZyBAY29kZXsiPyJ9IGlzIHJldHVybmVkLiAgVGhpcyBmdW5jdGlvbiBzaG91bGQKK25vdCBiZSB1c2VkIHRvIHRlc3QgZm9yIHRoZSBhdmFpbGFiaWxpdHkgb2YgYW4gYWxnb3JpdGhtLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGludCBnY3J5X2NpcGhlcl9tYXBfbmFtZSAoY29uc3QgY2hhciAqQHZhcntuYW1lfSkKKworQGNvZGV7Z2NyeV9jaXBoZXJfbWFwX25hbWV9IHJldHVybnMgdGhlIGFsZ29yaXRobSBpZGVudGlmaWVyIGZvciB0aGUKK2NpcGhlciBhbGdvcml0aG0gZGVzY3JpYmVkIGJ5IHRoZSBzdHJpbmcgQHZhcntuYW1lfS4gIElmIHRoaXMgYWxnb3JpdGhtCitpcyBub3QgYXZhaWxhYmxlIEBjb2RlezB9IGlzIHJldHVybmVkLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGludCBnY3J5X2NpcGhlcl9tb2RlX2Zyb21fb2lkIChjb25zdCBjaGFyICpAdmFye3N0cmluZ30pCisKK1JldHVybiB0aGUgY2lwaGVyIG1vZGUgYXNzb2NpYXRlZCB3aXRoIGFuIEBhY3Jvbnlte0FTTi4xfSBvYmplY3QKK2lkZW50aWZpZXIuICBUaGUgb2JqZWN0IGlkZW50aWZpZXIgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gdGhlCitAYWNyb255bXtJRVRGfS1zdHlsZSBkb3R0ZWQgZGVjaW1hbCBub3RhdGlvbi4gIFRoZSBmdW5jdGlvbiByZXR1cm5zCitAY29kZXswfSBmb3IgYW4gdW5rbm93biBvYmplY3QgaWRlbnRpZmllciBvciB3aGVuIG5vIG1vZGUgaXMgYXNzb2NpYXRlZAord2l0aCBpdC4KK0BlbmQgZGVmdHlwZWZ1bgorCisKK0BjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0BjICoqKioqKioqKioqKioqKioqKiogIFB1YmxpYyBLZXkgICoqKioqKioqKioqKioqKioqKioqKioqKioKK0BjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Bub2RlIFB1YmxpYyBLZXkgY3J5cHRvZ3JhcGh5CitAY2hhcHRlciBQdWJsaWMgS2V5IGNyeXB0b2dyYXBoeQorCitQdWJsaWMga2V5IGNyeXB0b2dyYXBoeSwgYWxzbyBrbm93biBhcyBhc3ltbWV0cmljIGNyeXB0b2dyYXBoeSwgaXMgYW4KK2Vhc3kgd2F5IGZvciBrZXkgbWFuYWdlbWVudCBhbmQgdG8gcHJvdmlkZSBkaWdpdGFsIHNpZ25hdHVyZXMuCitMaWJnY3J5cHQgcHJvdmlkZXMgdHdvIGNvbXBsZXRlbHkgZGlmZmVyZW50IGludGVyZmFjZXMgdG8KK3B1YmxpYyBrZXkgY3J5cHRvZ3JhcGh5LCB0aGlzIGNoYXB0ZXIgZXhwbGFpbnMgdGhlIG9uZSBiYXNlZCBvbgorUy1leHByZXNzaW9ucy4KKworQG1lbnUKKyogQXZhaWxhYmxlIGFsZ29yaXRobXM6OiAgICAgICAgQWxnb3JpdGhtcyBzdXBwb3J0ZWQgYnkgdGhlIGxpYnJhcnkuCisqIFVzZWQgUy1leHByZXNzaW9uczo6ICAgICAgICAgIEludHJvZHVjdGlvbiBpbnRvIHRoZSB1c2VkIFMtZXhwcmVzc2lvbi4KKyogUHVibGljIGtleSBtb2R1bGVzOjogICAgICAgICAgSG93IHRvIHdvcmsgd2l0aCBwdWJsaWMga2V5IG1vZHVsZXMuCisqIENyeXB0b2dyYXBoaWMgRnVuY3Rpb25zOjogICAgIEZ1bmN0aW9ucyBmb3IgcGVyZm9ybWluZyB0aGUgY3J5cHRvZ3JhcGhpYyBhY3Rpb25zLgorKiBHZW5lcmFsIHB1YmxpYy1rZXkgcmVsYXRlZCBGdW5jdGlvbnM6OiAgR2VuZXJhbCBmdW5jdGlvbnMsIG5vdCBpbXBsZW1lbnRpbmcgYW55IGNyeXB0b2dyYXBoeS4KKworKiBBQyBJbnRlcmZhY2U6OiAgICAgICAgICAgICAgICBBbHRlcm5hdGl2ZSBpbnRlcmZhY2UgdG8gcHVibGljIGtleSBmdW5jdGlvbnMuCitAZW5kIG1lbnUKKworQG5vZGUgQXZhaWxhYmxlIGFsZ29yaXRobXMKK0BzZWN0aW9uIEF2YWlsYWJsZSBhbGdvcml0aG1zCisKK0xpYmdjcnlwdCBzdXBwb3J0cyB0aGUgUlNBIChSaXZlc3QtU2hhbWlyLUFkbGVtYW4pIGFsZ29yaXRobXMgYXMgd2VsbAorYXMgRFNBIChEaWdpdGFsIFNpZ25hdHVyZSBBbGdvcml0aG0pIGFuZCBFbGdhbWFsLiAgVGhlIHZlcnNhdGlsZQoraW50ZXJmYWNlIGFsbG93cyB0byBhZGQgbW9yZSBhbGdvcml0aG1zIGluIHRoZSBmdXR1cmUuCisKK0Bub2RlIFVzZWQgUy1leHByZXNzaW9ucworQHNlY3Rpb24gVXNlZCBTLWV4cHJlc3Npb25zCisKK0xpYmdjcnlwdCdzIEFQSSBmb3IgYXN5bW1ldHJpYyBjcnlwdG9ncmFwaHkgaXMgYmFzZWQgb24gZGF0YSBzdHJ1Y3R1cmVzCitjYWxsZWQgUy1leHByZXNzaW9ucyAoc2VlCitAdXJlZntodHRwOi8vcGVvcGxlLmNzYWlsLm1pdC5lZHUvQC9yaXZlc3QvQC9zZXhwLmh0bWx9KSBhbmQgZG9lcyBub3Qgd29yaword2l0aCBjb250ZXh0cyBhcyBtb3N0IG9mIHRoZSBvdGhlciBidWlsZGluZyBibG9ja3Mgb2YgTGliZ2NyeXB0IGRvLgorCitAbm9pbmRlbnQKK1RoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gYXJlIHN0b3JlZCBpbiBTLWV4cHJlc3Npb25zOgorCitAaXRlbWl6ZSBAYXNpcworQGl0ZW0ga2V5cworCitAaXRlbSBwbGFpbiB0ZXh0IGRhdGEKKworQGl0ZW0gZW5jcnlwdGVkIGRhdGEKKworQGl0ZW0gc2lnbmF0dXJlcworCitAZW5kIGl0ZW1pemUKKworQG5vaW5kZW50CitUbyBkZXNjcmliZSBob3cgTGliZ2NyeXB0IGV4cGVjdCBrZXlzLCB3ZSB1c2UgZXhhbXBsZXMuIE5vdGUgdGhhdAord29yZHMgaW4KK0BpZm5vdHRleAordXBwZXJjYXNlCitAZW5kIGlmbm90dGV4CitAaWZ0ZXgKK2l0YWxpY3MKK0BlbmQgaWZ0ZXgKK2luZGljYXRlIHBhcmFtZXRlcnMgd2hlcmVhcyBsb3dlcmNhc2Ugd29yZHMgYXJlIGxpdGVyYWxzLgorCitOb3RlIHRoYXQgYWxsIE1QSSAobXVsdGktcHJlY2lzaW9uLWludGVnZXJzKSB2YWx1ZXMgYXJlIGV4cGVjdGVkIHRvIGJlIGluCitAY29kZXtHQ1JZTVBJX0ZNVF9VU0d9IGZvcm1hdC4gIEFuIGVhc3kgd2F5IHRvIGNyZWF0ZSBTLWV4cHJlc3Npb25zIGlzCitieSB1c2luZyBAY29kZXtnY3J5X3NleHBfYnVpbGR9IHdoaWNoIGFsbG93cyB0byBwYXNzIGEgc3RyaW5nIHdpdGgKK3ByaW50Zi1saWtlIGVzY2FwZXMgdG8gaW5zZXJ0IE1QSSB2YWx1ZXMuCisKK0BtZW51CisqIFJTQSBrZXkgcGFyYW1ldGVyczo6ICBQYXJhbWV0ZXJzIHVzZWQgd2l0aCBhbiBSU0Ega2V5LgorKiBEU0Ega2V5IHBhcmFtZXRlcnM6OiAgUGFyYW1ldGVycyB1c2VkIHdpdGggYSBEU0Ega2V5LgorKiBFQ0Mga2V5IHBhcmFtZXRlcnM6OiAgUGFyYW1ldGVycyB1c2VkIHdpdGggRUNDIGtleXMuCitAZW5kIG1lbnUKKworQG5vZGUgUlNBIGtleSBwYXJhbWV0ZXJzCitAc3Vic2VjdGlvbiBSU0Ega2V5IHBhcmFtZXRlcnMKKworQG5vaW5kZW50CitBbiBSU0EgcHJpdmF0ZSBrZXkgaXMgZGVzY3JpYmVkIGJ5IHRoaXMgUy1leHByZXNzaW9uOgorCitAZXhhbXBsZQorKHByaXZhdGUta2V5CisgIChyc2EKKyAgICAobiBAdmFye24tbXBpfSkKKyAgICAoZSBAdmFye2UtbXBpfSkKKyAgICAoZCBAdmFye2QtbXBpfSkKKyAgICAocCBAdmFye3AtbXBpfSkKKyAgICAocSBAdmFye3EtbXBpfSkKKyAgICAodSBAdmFye3UtbXBpfSkpKQorQGVuZCBleGFtcGxlCisKK0Bub2luZGVudAorQW4gUlNBIHB1YmxpYyBrZXkgaXMgZGVzY3JpYmVkIGJ5IHRoaXMgUy1leHByZXNzaW9uOgorCitAZXhhbXBsZQorKHB1YmxpYy1rZXkKKyAgKHJzYQorICAgIChuIEB2YXJ7bi1tcGl9KQorICAgIChlIEB2YXJ7ZS1tcGl9KSkpCitAZW5kIGV4YW1wbGUKKworCitAdGFibGUgQHZhcgorQGl0ZW0gbi1tcGkKK1JTQSBwdWJsaWMgbW9kdWx1cyBAbWF0aHtufS4KK0BpdGVtIGUtbXBpCitSU0EgcHVibGljIGV4cG9uZW50IEBtYXRoe2V9LgorQGl0ZW0gZC1tcGkKK1JTQSBzZWNyZXQgZXhwb25lbnQgQG1hdGh7ZCA9IGVeey0xfSBcYm1vZCAocC0xKShxLTEpfS4KK0BpdGVtIHAtbXBpCitSU0Egc2VjcmV0IHByaW1lIEBtYXRoe3B9LgorQGl0ZW0gcS1tcGkKK1JTQSBzZWNyZXQgcHJpbWUgQG1hdGh7cX0gd2l0aCBAbWF0aHtwIDwgcX0uCitAaXRlbSB1LW1waQorTXVsdGlwbGljYXRpdmUgaW52ZXJzZSBAbWF0aHt1ID0gcF57LTF9IFxibW9kIHF9LgorQGVuZCB0YWJsZQorCitGb3Igc2lnbmluZyBhbmQgZGVjcnlwdGlvbiB0aGUgcGFyYW1ldGVycyBAbWF0aHsocCwgcSwgdSl9IGFyZSBvcHRpb25hbAorYnV0IGdyZWF0bHkgaW1wcm92ZSB0aGUgcGVyZm9ybWFuY2UuICBFaXRoZXIgYWxsIG9mIHRoZXNlIG9wdGlvbmFsCitwYXJhbWV0ZXJzIG11c3QgYmUgZ2l2ZW4gb3Igbm9uZSBvZiB0aGVtLiAgVGhleSBhcmUgbWFuZGF0b3J5IGZvcgorZ2NyeV9wa190ZXN0a2V5LgorCitOb3RlIHRoYXQgT3BlblNTTCB1c2VzIHNsaWdobHkgZGlmZmVyZW50IHBhcmFtZXRlcnM6IEBtYXRoe3EgPCBwfSBhbmQgCisgQG1hdGh7dSA9IHFeey0xfSBcYm1vZCBwfS4gIFRvIHVzZSB0aGVzZSBwYXJhbWV0ZXJzIHlvdSB3aWxsIG5lZWQgdG8KK3N3YXAgdGhlIHZhbHVlcyBhbmQgcmVjb21wdXRlIEBtYXRoe3V9LiAgSGVyZSBpcyBleGFtcGxlIGNvZGUgdG8gZG8gdGhpczoKKworQGV4YW1wbGUKKyAgaWYgKGdjcnlfbXBpX2NtcCAocCwgcSkgPiAwKQorICAgIEB7CisgICAgICBnY3J5X21waV9zd2FwIChwLCBxKTsKKyAgICAgIGdjcnlfbXBpX2ludm0gKHUsIHAsIHEpOworICAgIEB9CitAZW5kIGV4YW1wbGUKKworCisKKworQG5vZGUgRFNBIGtleSBwYXJhbWV0ZXJzCitAc3Vic2VjdGlvbiBEU0Ega2V5IHBhcmFtZXRlcnMKKworQG5vaW5kZW50CitBIERTQSBwcml2YXRlIGtleSBpcyBkZXNjcmliZWQgYnkgdGhpcyBTLWV4cHJlc3Npb246CisKK0BleGFtcGxlCisocHJpdmF0ZS1rZXkKKyAgKGRzYQorICAgIChwIEB2YXJ7cC1tcGl9KQorICAgIChxIEB2YXJ7cS1tcGl9KQorICAgIChnIEB2YXJ7Zy1tcGl9KQorICAgICh5IEB2YXJ7eS1tcGl9KQorICAgICh4IEB2YXJ7eC1tcGl9KSkpCitAZW5kIGV4YW1wbGUKKworQHRhYmxlIEB2YXIKK0BpdGVtIHAtbXBpCitEU0EgcHJpbWUgQG1hdGh7cH0uCitAaXRlbSBxLW1waQorRFNBIGdyb3VwIG9yZGVyIEBtYXRoe3F9ICh3aGljaCBpcyBhIHByaW1lIGRpdmlzb3Igb2YgQG1hdGh7cC0xfSkuCitAaXRlbSBnLW1waQorRFNBIGdyb3VwIGdlbmVyYXRvciBAbWF0aHtnfS4KK0BpdGVtIHktbXBpCitEU0EgcHVibGljIGtleSB2YWx1ZSBAbWF0aHt5ID0gZ154IFxibW9kIHB9LgorQGl0ZW0geC1tcGkKK0RTQSBzZWNyZXQgZXhwb25lbnQgeC4KK0BlbmQgdGFibGUKKworVGhlIHB1YmxpYyBrZXkgaXMgc2ltaWxhciB3aXRoICJwcml2YXRlLWtleSIgcmVwbGFjZWQgYnkgInB1YmxpYy1rZXkiCithbmQgbm8gQHZhcnt4LW1waX0uCisKKworQG5vZGUgRUNDIGtleSBwYXJhbWV0ZXJzCitAc3Vic2VjdGlvbiBFQ0Mga2V5IHBhcmFtZXRlcnMKKworQG5vaW5kZW50CitBbiBFQ0MgcHJpdmF0ZSBrZXkgaXMgZGVzY3JpYmVkIGJ5IHRoaXMgUy1leHByZXNzaW9uOgorCitAZXhhbXBsZQorKHByaXZhdGUta2V5CisgIChlY2MKKyAgICAocCBAdmFye3AtbXBpfSkKKyAgICAoYSBAdmFye2EtbXBpfSkKKyAgICAoYiBAdmFye2ItbXBpfSkKKyAgICAoZyBAdmFye2ctcG9pbnR9KQorICAgIChuIEB2YXJ7bi1tcGl9KQorICAgIChxIEB2YXJ7cS1wb2ludH0pCisgICAgKGQgQHZhcntkLW1waX0pKSkKK0BlbmQgZXhhbXBsZQorCitAdGFibGUgQHZhcgorQGl0ZW0gcC1tcGkKK1ByaW1lIHNwZWNpZnlpbmcgdGhlIGZpZWxkIEBtYXRoe0dGKHApfS4KK0BpdGVtIGEtbXBpCitAaXRlbXggYi1tcGkKK1RoZSB0d28gY29lZmZpY2llbnRzIG9mIHRoZSBXZWllcnN0cmFzcyBlcXVhdGlvbiBAbWF0aHt5XjIgPSB4XjMgKyBheCArIGJ9CitAaXRlbSBnLXBvaW50CitCYXNlIHBvaW50IEBtYXRoe2d9LgorQGl0ZW0gbi1tcGkKK09yZGVyIG9mIEBtYXRoe2d9CitAaXRlbSBxLXBvaW50CitUaGUgcG9pbnQgcmVwcmVzZW50aW5nIHRoZSBwdWJsaWMga2V5IEBtYXRoe1EgPSBkUH0uCitAaXRlbSBkLW1waQorVGhlIHByaXZhdGUga2V5IEBtYXRoe2R9CitAZW5kIHRhYmxlCisKK0FsbCBwb2ludCB2YWx1ZXMgYXJlIGVuY29kZWQgaW4gc3RhbmRhcmQgZm9ybWF0OyBMaWJnY3J5cHQgZG9lcworY3VycmVudGx5IG9ubHkgc3VwcG9ydCB1bmNvbXByZXNzZWQgcG9pbnRzLCB0aHVzIHRoZSBmaXJzdCBieXRlIG5lZWRzIHRvCitiZSBAY29kZXsweDA0fS4KKworVGhlIHB1YmxpYyBrZXkgaXMgc2ltaWxhciB3aXRoICJwcml2YXRlLWtleSIgcmVwbGFjZWQgYnkgInB1YmxpYy1rZXkiCithbmQgbm8gQHZhcntkLW1waX0uCisKK0lmIHRoZSBkb21haW4gcGFyYW1ldGVycyBhcmUgd2VsbC1rbm93biwgdGhlIG5hbWUgb2YgdGhpcyBjdXJ2ZSBtYXkgYmUKK3VzZWQuICBGb3IgZXhhbXBsZQorCitAZXhhbXBsZQorKHByaXZhdGUta2V5CisgIChlY2MKKyAgICAoY3VydmUgIk5JU1QgUC0xOTIiKQorICAgIChxIEB2YXJ7cS1wb2ludH0pCisgICAgKGQgQHZhcntkLW1waX0pKSkKK0BlbmQgZXhhbXBsZQorCitUaGUgQGNvZGV7Y3VydmV9IHBhcmFtZXRlciBtYXkgYmUgZ2l2ZW4gaW4gYW55IGNhc2UgYW5kIGlzIHVzZWQgdG8gcmVwbGFjZQorbWlzc2luZyBwYXJhbWV0ZXJzLgorCitAbm9pbmRlbnQKK0N1cnJlbnRseSBpbXBsZW1lbnRlZCBjdXJ2ZXMgYXJlOgorQHRhYmxlIEBjb2RlCitAaXRlbSBOSVNUIFAtMTkyCitAaXRlbXggMS4yLjg0MC4xMDA0NS4zLjEuMQorQGl0ZW14IHByaW1lMTkydjEKK0BpdGVteCBzZWNwMTkycjEKK1RoZSBOSVNUIDE5MiBiaXQgY3VydmUsIGl0cyBPSUQsIFg5LjYyIGFuZCBTRUNQIGFsaWFzZXMuCisKK0BpdGVtIE5JU1QgUC0yMjQKK0BpdGVteCBzZWNwMjI0cjEKK1RoZSBOSVNUIDIyNCBiaXQgY3VydmUgYW5kIGl0cyBTRUNQIGFsaWFzLgorCitAaXRlbSBOSVNUIFAtMjU2CitAaXRlbXggMS4yLjg0MC4xMDA0NS4zLjEuNworQGl0ZW14IHByaW1lMjU2djEKK0BpdGVteCBzZWNwMjU2cjEKK1RoZSBOSVNUIDI1NiBiaXQgY3VydmUsIGl0cyBPSUQsIFg5LjYyIGFuZCBTRUNQIGFsaWFzZXMuCisKK0BpdGVtIE5JU1QgUC0zODQKK0BpdGVteCBzZWNwMzg0cjEKK1RoZSBOSVNUIDM4NCBiaXQgY3VydmUgYW5kIGl0cyBTRUNQIGFsaWFzLgorCitAaXRlbSBOSVNUIFAtNTIxCitAaXRlbXggc2VjcDUyMXIxCitUaGUgTklTVCA1MjEgYml0IGN1cnZlIGFuZCBpdHMgU0VDUCBhbGlhcy4KKworQGVuZCB0YWJsZQorQXMgdXN1YWwgdGhlIE9JRHMgbWF5IG9wdGlvbmFsbHkgYmUgcHJlZml4ZWQgd2l0aCB0aGUgc3RyaW5nIEBjb2Rle09JRC59CitvciBAY29kZXtvaWQufS4KKworCisKK0Bub2RlIFB1YmxpYyBrZXkgbW9kdWxlcworQHNlY3Rpb24gUHVibGljIGtleSBtb2R1bGVzCisKK0xpYmdjcnlwdCBtYWtlcyBpdCBwb3NzaWJsZSB0byBsb2FkIGFkZGl0aW9uYWwgYHB1YmxpYyBrZXkKK21vZHVsZXMnOyB0aGVzZSBwdWJsaWMga2V5IGFsZ29yaXRobXMgY2FuIGJlIHVzZWQganVzdCBsaWtlIHRoZQorYWxnb3JpdGhtcyB0aGF0IGFyZSBidWlsdCBpbnRvIHRoZSBsaWJyYXJ5IGRpcmVjdGx5LiAgRm9yIGFuCitpbnRyb2R1Y3Rpb24gaW50byBleHRlbnNpb24gbW9kdWxlcywgc2VlIEB4cmVme01vZHVsZXN9LgorCitAZGVmdHAge0RhdGEgdHlwZX0gZ2NyeV9wa19zcGVjX3QKK1RoaXMgaXMgdGhlIGBtb2R1bGUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUnIG5lZWRlZCBmb3IgcmVnaXN0ZXJpbmcKK3B1YmxpYyBrZXkgbW9kdWxlcywgd2hpY2ggaGFzIHRvIGJlIGZpbGxlZCBpbiBieSB0aGUgdXNlciBiZWZvcmUgaXQKK2NhbiBiZSB1c2VkIHRvIHJlZ2lzdGVyIGEgbW9kdWxlLiAgSXQgY29udGFpbnMgdGhlIGZvbGxvd2luZyBtZW1iZXJzOgorCitAdGFibGUgQGNvZGUKK0BpdGVtIGNvbnN0IGNoYXIgKm5hbWUKK1RoZSBwcmltYXJ5IG5hbWUgb2YgdGhpcyBhbGdvcml0aG0uCitAaXRlbSBjaGFyICoqYWxpYXNlcworQSBsaXN0IG9mIHN0cmluZ3MgdGhhdCBhcmUgYGFsaWFzZXMnIGZvciB0aGUgYWxnb3JpdGhtLiAgVGhlIGxpc3QKK211c3QgYmUgdGVybWluYXRlZCB3aXRoIGEgTlVMTCBlbGVtZW50LgorQGl0ZW0gY29uc3QgY2hhciAqZWxlbWVudHNfcGtleQorU3RyaW5nIGNvbnRhaW5pbmcgdGhlIG9uZS1sZXR0ZXIgbmFtZXMgb2YgdGhlIE1QSSB2YWx1ZXMgY29udGFpbmVkIGluCithIHB1YmxpYyBrZXkuCitAaXRlbSBjb25zdCBjaGFyICplbGVtZW50X3NrZXkKK1N0cmluZyBjb250YWluaW5nIHRoZSBvbmUtbGV0dGVyIG5hbWVzIG9mIHRoZSBNUEkgdmFsdWVzIGNvbnRhaW5lZCBpbgorYSBzZWNyZXQga2V5LgorQGl0ZW0gY29uc3QgY2hhciAqZWxlbWVudHNfZW5jCitTdHJpbmcgY29udGFpbmluZyB0aGUgb25lLWxldHRlciBuYW1lcyBvZiB0aGUgTVBJIHZhbHVlcyB0aGF0IGFyZSB0aGUKK3Jlc3VsdCBvZiBhbiBlbmNyeXB0aW9uIG9wZXJhdGlvbiB1c2luZyB0aGlzIGFsZ29yaXRobS4KK0BpdGVtIGNvbnN0IGNoYXIgKmVsZW1lbnRzX3NpZworU3RyaW5nIGNvbnRhaW5pbmcgdGhlIG9uZS1sZXR0ZXIgbmFtZXMgb2YgdGhlIE1QSSB2YWx1ZXMgdGhhdCBhcmUgdGhlCityZXN1bHQgb2YgYSBzaWduIG9wZXJhdGlvbiB1c2luZyB0aGlzIGFsZ29yaXRobS4KK0BpdGVtIGNvbnN0IGNoYXIgKmVsZW1lbnRzX2dyaXAKK1N0cmluZyBjb250YWluaW5nIHRoZSBvbmUtbGV0dGVyIG5hbWVzIG9mIHRoZSBNUEkgdmFsdWVzIHRoYXQgYXJlIHRvCitiZSBpbmNsdWRlZCBpbiB0aGUgYGtleSBncmlwJy4KK0BpdGVtIGludCB1c2UKK1RoZSBiaXR3aXNlLU9SIG9mIHRoZSBmb2xsb3dpbmcgZmxhZ3MsIGRlcGVuZGluZyBvbiB0aGUgYWJpbGl0aWVzIG9mCit0aGUgYWxnb3JpdGhtOgorQHRhYmxlIEBjb2RlCitAaXRlbSBHQ1JZX1BLX1VTQUdFX1NJR04KK1RoZSBhbGdvcml0aG0gc3VwcG9ydHMgc2lnbmluZyBhbmQgdmVyaWZ5aW5nIG9mIGRhdGEuCitAaXRlbSBHQ1JZX1BLX1VTQUdFX0VOQ1IKK1RoZSBhbGdvcml0aG0gc3VwcG9ydHMgdGhlIGVuY3J5cHRpb24gYW5kIGRlY3J5cHRpb24gb2YgZGF0YS4KK0BlbmQgdGFibGUKK0BpdGVtIGdjcnlfcGtfZ2VuZXJhdGVfdCBnZW5lcmF0ZQorVGhlIGZ1bmN0aW9uIHJlc3BvbnNpYmxlIGZvciBnZW5lcmF0aW5nIGEgbmV3IGtleSBwYWlyLiAgU2VlIGJlbG93IGZvcgorYSBkZXNjcmlwdGlvbiBvZiB0aGlzIHR5cGUuCitAaXRlbSBnY3J5X3BrX2NoZWNrX3NlY3JldF9rZXlfdCBjaGVja19zZWNyZXRfa2V5CitUaGUgZnVuY3Rpb24gcmVzcG9uc2libGUgZm9yIGNoZWNraW5nIHRoZSBzYW5pdHkgb2YgYSBwcm92aWRlZCBzZWNyZXQKK2tleS4gIFNlZSBiZWxvdyBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGlzIHR5cGUuCitAaXRlbSBnY3J5X3BrX2VuY3J5cHRfdCBlbmNyeXB0CitUaGUgZnVuY3Rpb24gcmVzcG9uc2libGUgZm9yIGVuY3J5cHRpbmcgZGF0YS4gIFNlZSBiZWxvdyBmb3IgYQorZGVzY3JpcHRpb24gb2YgdGhpcyB0eXBlLgorQGl0ZW0gZ2NyeV9wa19kZWNyeXB0X3QgZGVjcnlwdAorVGhlIGZ1bmN0aW9uIHJlc3BvbnNpYmxlIGZvciBkZWNyeXB0aW5nIGRhdGEuICBTZWUgYmVsb3cgZm9yIGEKK2Rlc2NyaXB0aW9uIG9mIHRoaXMgdHlwZS4KK0BpdGVtIGdjcnlfcGtfc2lnbl90IHNpZ24KK1RoZSBmdW5jdGlvbiByZXNwb25zaWJsZSBmb3Igc2lnbmluZyBkYXRhLiAgU2VlIGJlbG93IGZvciBhIGRlc2NyaXB0aW9uCitvZiB0aGlzIHR5cGUuCitAaXRlbSBnY3J5X3BrX3ZlcmlmeV90IHZlcmlmeQorVGhlIGZ1bmN0aW9uIHJlc3BvbnNpYmxlIGZvciB2ZXJpZnlpbmcgdGhhdCB0aGUgcHJvdmlkZWQgc2lnbmF0dXJlCittYXRjaGVzIHRoZSBwcm92aWRlZCBkYXRhLiAgU2VlIGJlbG93IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoaXMgdHlwZS4KK0BpdGVtIGdjcnlfcGtfZ2V0X25iaXRzX3QgZ2V0X25iaXRzCitUaGUgZnVuY3Rpb24gcmVzcG9uc2libGUgZm9yIHJldHVybmluZyB0aGUgbnVtYmVyIG9mIGJpdHMgb2YgYSBwcm92aWRlZAora2V5LiAgU2VlIGJlbG93IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoaXMgdHlwZS4KK0BlbmQgdGFibGUKK0BlbmQgZGVmdHAKKworQGRlZnRwIHtEYXRhIHR5cGV9IGdjcnlfcGtfZ2VuZXJhdGVfdAorVHlwZSBmb3IgdGhlIGBnZW5lcmF0ZScgZnVuY3Rpb24sIGRlZmluZWQgYXM6IGdjcnlfZXJyX2NvZGVfdAorKCpnY3J5X3BrX2dlbmVyYXRlX3QpIChpbnQgYWxnbywgdW5zaWduZWQgaW50IG5iaXRzLCB1bnNpZ25lZCBsb25nCit1c2VfZSwgZ2NyeV9tcGlfdCAqc2tleSwgZ2NyeV9tcGlfdCAqKnJldGZhY3RvcnMpCitAZW5kIGRlZnRwCisKK0BkZWZ0cCB7RGF0YSB0eXBlfSBnY3J5X3BrX2NoZWNrX3NlY3JldF9rZXlfdAorVHlwZSBmb3IgdGhlIGBjaGVja19zZWNyZXRfa2V5JyBmdW5jdGlvbiwgZGVmaW5lZCBhczogZ2NyeV9lcnJfY29kZV90CisoKmdjcnlfcGtfY2hlY2tfc2VjcmV0X2tleV90KSAoaW50IGFsZ28sIGdjcnlfbXBpX3QgKnNrZXkpCitAZW5kIGRlZnRwCisKK0BkZWZ0cCB7RGF0YSB0eXBlfSBnY3J5X3BrX2VuY3J5cHRfdAorVHlwZSBmb3IgdGhlIGBlbmNyeXB0JyBmdW5jdGlvbiwgZGVmaW5lZCBhczogZ2NyeV9lcnJfY29kZV90CisoKmdjcnlfcGtfZW5jcnlwdF90KSAoaW50IGFsZ28sIGdjcnlfbXBpX3QgKnJlc2FyciwgZ2NyeV9tcGlfdCBkYXRhLAorZ2NyeV9tcGlfdCAqcGtleSwgaW50IGZsYWdzKQorQGVuZCBkZWZ0cAorCitAZGVmdHAge0RhdGEgdHlwZX0gZ2NyeV9wa19kZWNyeXB0X3QKK1R5cGUgZm9yIHRoZSBgZGVjcnlwdCcgZnVuY3Rpb24sIGRlZmluZWQgYXM6IGdjcnlfZXJyX2NvZGVfdAorKCpnY3J5X3BrX2RlY3J5cHRfdCkgKGludCBhbGdvLCBnY3J5X21waV90ICpyZXN1bHQsIGdjcnlfbXBpX3QgKmRhdGEsCitnY3J5X21waV90ICpza2V5LCBpbnQgZmxhZ3MpCitAZW5kIGRlZnRwCisKK0BkZWZ0cCB7RGF0YSB0eXBlfSBnY3J5X3BrX3NpZ25fdAorVHlwZSBmb3IgdGhlIGBzaWduJyBmdW5jdGlvbiwgZGVmaW5lZCBhczogZ2NyeV9lcnJfY29kZV90CisoKmdjcnlfcGtfc2lnbl90KSAoaW50IGFsZ28sIGdjcnlfbXBpX3QgKnJlc2FyciwgZ2NyeV9tcGlfdCBkYXRhLAorZ2NyeV9tcGlfdCAqc2tleSkKK0BlbmQgZGVmdHAKKworQGRlZnRwIHtEYXRhIHR5cGV9IGdjcnlfcGtfdmVyaWZ5X3QKK1R5cGUgZm9yIHRoZSBgdmVyaWZ5JyBmdW5jdGlvbiwgZGVmaW5lZCBhczogZ2NyeV9lcnJfY29kZV90CisoKmdjcnlfcGtfdmVyaWZ5X3QpIChpbnQgYWxnbywgZ2NyeV9tcGlfdCBoYXNoLCBnY3J5X21waV90ICpkYXRhLAorZ2NyeV9tcGlfdCAqcGtleSwgaW50ICgqY21wKSAodm9pZCAqLCBnY3J5X21waV90KSwgdm9pZCAqb3BhcXVldikKK0BlbmQgZGVmdHAKKworQGRlZnRwIHtEYXRhIHR5cGV9IGdjcnlfcGtfZ2V0X25iaXRzX3QKK1R5cGUgZm9yIHRoZSBgZ2V0X25iaXRzJyBmdW5jdGlvbiwgZGVmaW5lZCBhczogdW5zaWduZWQKKygqZ2NyeV9wa19nZXRfbmJpdHNfdCkgKGludCBhbGdvLCBnY3J5X21waV90ICpwa2V5KQorQGVuZCBkZWZ0cAorCitAZGVmdHlwZWZ1biBnY3J5X2Vycm9yX3QgZ2NyeV9wa19yZWdpc3RlciAoZ2NyeV9wa19zcGVjX3QgKkB2YXJ7cHVia2V5fSwgdW5zaWduZWQgaW50ICphbGdvcml0aG1faWQsIGdjcnlfbW9kdWxlX3QgKkB2YXJ7bW9kdWxlfSkKKworUmVnaXN0ZXIgYSBuZXcgcHVibGljIGtleSBtb2R1bGUgd2hvc2Ugc3BlY2lmaWNhdGlvbiBjYW4gYmUgZm91bmQgaW4KK0B2YXJ7cHVia2V5fS4gIE9uIHN1Y2Nlc3MsIGEgbmV3IGFsZ29yaXRobSBJRCBpcyBzdG9yZWQgaW4KK0B2YXJ7YWxnb3JpdGhtX2lkfSBhbmQgYSBwb2ludGVyIHJlcHJlc2VudGluZyB0aGlzIG1vZHVsZSBpcyBzdG9yZWQKK2luIEB2YXJ7bW9kdWxlfS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biB2b2lkIGdjcnlfcGtfdW5yZWdpc3RlciAoZ2NyeV9tb2R1bGVfdCBAdmFye21vZHVsZX0pCitVbnJlZ2lzdGVyIHRoZSBwdWJsaWMga2V5IG1vZHVsZSBpZGVudGlmaWVkIGJ5IEB2YXJ7bW9kdWxlfSwgd2hpY2gKK211c3QgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgd2l0aCBnY3J5X3BrX3JlZ2lzdGVyLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGdjcnlfZXJyb3JfdCBnY3J5X3BrX2xpc3QgKGludCAqQHZhcntsaXN0fSwgaW50ICpAdmFye2xpc3RfbGVuZ3RofSkKK0dldCBhIGxpc3QgY29uc2lzdGluZyBvZiB0aGUgSURzIG9mIHRoZSBsb2FkZWQgcHVia2V5IG1vZHVsZXMuICBJZgorQHZhcntsaXN0fSBpcyB6ZXJvLCB3cml0ZSB0aGUgbnVtYmVyIG9mIGxvYWRlZCBwdWJrZXkgbW9kdWxlcyB0bworQHZhcntsaXN0X2xlbmd0aH0gYW5kIHJldHVybi4gIElmIEB2YXJ7bGlzdH0gaXMgbm9uLXplcm8sIHRoZSBmaXJzdAorKkB2YXJ7bGlzdF9sZW5ndGh9IGFsZ29yaXRobSBJRHMgYXJlIHN0b3JlZCBpbiBAdmFye2xpc3R9LCB3aGljaCBtdXN0CitiZSBvZiBhY2NvcmRpbmcgc2l6ZS4gIEluIGNhc2UgdGhlcmUgYXJlIGxlc3MgcHVia2V5IG1vZHVsZXMgdGhhbgorKkB2YXJ7bGlzdF9sZW5ndGh9LCAqQHZhcntsaXN0X2xlbmd0aH0gaXMgdXBkYXRlZCB0byB0aGUgY29ycmVjdAorbnVtYmVyLgorQGVuZCBkZWZ0eXBlZnVuCisKK0Bub2RlIENyeXB0b2dyYXBoaWMgRnVuY3Rpb25zCitAc2VjdGlvbiBDcnlwdG9ncmFwaGljIEZ1bmN0aW9ucworCitAbm9pbmRlbnQKK05vdGUgdGhhdCB3ZSB3aWxsIGluIGZ1dHVyZSBhbGxvdyB0byB1c2Uga2V5cyB3aXRob3V0IHAscSBhbmQgdQorc3BlY2lmaWVkIGFuZCBtYXkgYWxzbyBzdXBwb3J0IG90aGVyIHBhcmFtZXRlcnMgZm9yIHBlcmZvcm1hbmNlCityZWFzb25zLiAKKworQG5vaW5kZW50CisKK1NvbWUgZnVuY3Rpb25zIG9wZXJhdGluZyBvbiBTLWV4cHJlc3Npb25zIHN1cHBvcnQgYGZsYWdzJywgdGhhdAoraW5mbHVlbmNlIHRoZSBvcGVyYXRpb24uICBUaGVzZSBmbGFncyBoYXZlIHRvIGJlIGxpc3RlZCBpbiBhCitzdWItUy1leHByZXNzaW9uIG5hbWVkIGBmbGFncyc7IHRoZSBmb2xsb3dpbmcgZmxhZ3MgYXJlIGtub3duOgorCitAdGFibGUgQGNvZGUKK0BpdGVtIHBrY3MxCitVc2UgUEtDUyMxIGJsb2NrIHR5cGUgMiBwYWRkaW5nLgorQGl0ZW0gbm8tYmxpbmRpbmcKK0RvIG5vdCB1c2UgYSB0ZWNobmlxdWUgY2FsbGVkIGBibGluZGluZycsIHdoaWNoIGlzIHVzZWQgYnkgZGVmYXVsdCBpbgorb3JkZXIgdG8gcHJldmVudCBsZWFraW5nIG9mIHNlY3JldCBpbmZvcm1hdGlvbi4gIEJsaW5kaW5nIGlzIG9ubHkKK2ltcGxlbWVudGVkIGJ5IFJTQSwgYnV0IGl0IG1pZ2h0IGJlIGltcGxlbWVudGVkIGJ5IG90aGVyIGFsZ29yaXRobXMgaW4KK3RoZSBmdXR1cmUgYXMgd2VsbCwgd2hlbiBuZWNlc3NhcnkuCitAZW5kIHRhYmxlCisKK0Bub2luZGVudAorTm93IHRoYXQgd2Uga25vdyB0aGUga2V5IGJhc2ljcywgd2UgY2FuIGNhcnJ5IG9uIGFuZCBleHBsYWluIGhvdyB0bworZW5jcnlwdCBhbmQgZGVjcnlwdCBkYXRhLiAgSW4gYWxtb3N0IGFsbCBjYXNlcyB0aGUgZGF0YSBpcyBhIHJhbmRvbQorc2Vzc2lvbiBrZXkgd2hpY2ggaXMgaW4gdHVybiB1c2VkIGZvciB0aGUgYWN0dWFsIGVuY3J5cHRpb24gb2YgdGhlIHJlYWwKK2RhdGEuICBUaGVyZSBhcmUgMiBmdW5jdGlvbnMgdG8gZG8gdGhpczoKKworQGRlZnR5cGVmdW4gZ2NyeV9lcnJvcl90IGdjcnlfcGtfZW5jcnlwdCAoQHd7Z2NyeV9zZXhwX3QgKkB2YXJ7cl9jaXBofSx9IEB3e2djcnlfc2V4cF90IEB2YXJ7ZGF0YX0sfSBAd3tnY3J5X3NleHBfdCBAdmFye3BrZXl9fSkKKworT2J2aW91c2x5IGEgcHVibGljIGtleSBtdXN0IGJlIHByb3ZpZGVkIGZvciBlbmNyeXB0aW9uLiAgSXQgaXMKK2V4cGVjdGVkIGFzIGFuIGFwcHJvcHJpYXRlIFMtZXhwcmVzc2lvbiAoc2VlIGFib3ZlKSBpbiBAdmFye3BrZXl9LgorVGhlIGRhdGEgdG8gYmUgZW5jcnlwdGVkIGNhbiBlaXRoZXIgYmUgaW4gdGhlIHNpbXBsZSBvbGQgZm9ybWF0LCB3aGljaAoraXMgYSB2ZXJ5IHNpbXBsZSBTLWV4cHJlc3Npb24gY29uc2lzdGluZyBvbmx5IG9mIG9uZSBNUEksIG9yIGl0IG1heSBiZQorYSBtb3JlIGNvbXBsZXggUy1leHByZXNzaW9uIHdoaWNoIGFsc28gYWxsb3dzIHRvIHNwZWNpZnkgZmxhZ3MgZm9yCitvcGVyYXRpb24sIGxpa2UgZS5nLiBwYWRkaW5nIHJ1bGVzLgorCitAbm9pbmRlbnQKK0lmIHlvdSBkb24ndCB3YW50IHRvIGxldCBMaWJnY3J5cHQgaGFuZGxlIHRoZSBwYWRkaW5nLCB5b3UgbXVzdCBwYXNzIGFuCithcHByb3ByaWF0ZSBNUEkgdXNpbmcgdGhpcyBleHByZXNzaW9uIGZvciBAdmFye2RhdGF9OgorCitAZXhhbXBsZSAKKyhkYXRhCisgIChmbGFncyByYXcpCisgICh2YWx1ZSBAdmFye21waX0pKQorQGVuZCBleGFtcGxlCisKK0Bub2luZGVudAorVGhpcyBoYXMgdGhlIHNhbWUgc2VtYW50aWNzIGFzIHRoZSBvbGQgc3R5bGUgTVBJIG9ubHkgd2F5LiAgQHZhcntNUEl9IGlzCit0aGUgYWN0dWFsIGRhdGEsIGFscmVhZHkgcGFkZGVkIGFwcHJvcHJpYXRlIGZvciB5b3VyIHByb3RvY29sLiAgTW9zdAorc3lzdGVtcyBob3dldmVyIHVzZSBQS0NTIzEgcGFkZGluZyBhbmQgc28geW91IGNhbiB1c2UgdGhpcyBTLWV4cHJlc3Npb24KK2ZvciBAdmFye2RhdGF9OgorCitAZXhhbXBsZSAKKyhkYXRhCisgIChmbGFncyBwa2NzMSkKKyAgKHZhbHVlIEB2YXJ7YmxvY2t9KSkKK0BlbmQgZXhhbXBsZQorCitAbm9pbmRlbnQKK0hlcmUsIHRoZSAiZmxhZ3MiIGxpc3QgaGFzIHRoZSAicGtjczEiIGZsYWcgd2hpY2ggbGV0IHRoZSBmdW5jdGlvbiBrbm93Cit0aGF0IGl0IHNob3VsZCBwcm92aWRlIFBLQ1MjMSBibG9jayB0eXBlIDIgcGFkZGluZy4gIFRoZSBhY3R1YWwgZGF0YSB0bworYmUgZW5jcnlwdGVkIGlzIHBhc3NlZCBhcyBhIHN0cmluZyBvZiBvY3RldHMgaW4gQHZhcntibG9ja30uICBUaGUKK2Z1bmN0aW9uIGNoZWNrcyB0aGF0IHRoaXMgZGF0YSBhY3R1YWxseSBjYW4gYmUgdXNlZCB3aXRoIHRoZSBnaXZlbiBrZXksCitkb2VzIHRoZSBwYWRkaW5nIGFuZCBlbmNyeXB0cyBpdC4KKworSWYgdGhlIGZ1bmN0aW9uIGNvdWxkIHN1Y2Nlc3NmdWxseSBwZXJmb3JtIHRoZSBlbmNyeXB0aW9uLCB0aGUgcmV0dXJuCit2YWx1ZSB3aWxsIGJlIDAgYW5kIGEgbmV3IFMtZXhwcmVzc2lvbiB3aXRoIHRoZSBlbmNyeXB0ZWQgcmVzdWx0IGlzCithbGxvY2F0ZWQgYW5kIGFzc2lnbmVkIHRvIHRoZSB2YXJpYWJsZSBhdCB0aGUgYWRkcmVzcyBvZiBAdmFye3JfY2lwaH0uCitUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIHRvIHJlbGVhc2UgdGhpcyB2YWx1ZSB1c2luZworQGNvZGV7Z2NyeV9zZXhwX3JlbGVhc2V9LiAgSW4gY2FzZSBvZiBhbiBlcnJvciwgYW4gZXJyb3IgY29kZSBpcworcmV0dXJuZWQgYW5kIEB2YXJ7cl9jaXBofSB3aWxsIGJlIHNldCB0byBAY29kZXtOVUxMfS4KKworQG5vaW5kZW50CitUaGUgcmV0dXJuZWQgUy1leHByZXNzaW9uIGhhcyB0aGlzIGZvcm1hdCB3aGVuIHVzZWQgd2l0aCBSU0E6CisKK0BleGFtcGxlCisoZW5jLXZhbAorICAocnNhCisgICAgKGEgQHZhcnthLW1waX0pKSkKK0BlbmQgZXhhbXBsZQorCitAbm9pbmRlbnQKK1doZXJlIEB2YXJ7YS1tcGl9IGlzIGFuIE1QSSB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIFJTQSBvcGVyYXRpb24uICBXaGVuCit1c2luZyB0aGUgRWxnYW1hbCBhbGdvcml0aG0sIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBoYXZlIHRoaXMgZm9ybWF0OgorCitAZXhhbXBsZQorKGVuYy12YWwKKyAgKGVsZworICAgIChhIEB2YXJ7YS1tcGl9KQorICAgIChiIEB2YXJ7Yi1tcGl9KSkpCitAZW5kIGV4YW1wbGUKKworQG5vaW5kZW50CitXaGVyZSBAdmFye2EtbXBpfSBhbmQgQHZhcntiLW1waX0gYXJlIE1QSXMgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZQorRWxnYW1hbCBlbmNyeXB0aW9uIG9wZXJhdGlvbi4KK0BlbmQgZGVmdHlwZWZ1bgorQGMgZW5kIGdjcnlfcGtfZW5jcnlwdAorCitAZGVmdHlwZWZ1biBnY3J5X2Vycm9yX3QgZ2NyeV9wa19kZWNyeXB0IChAd3tnY3J5X3NleHBfdCAqQHZhcntyX3BsYWlufSx9IEB3e2djcnlfc2V4cF90IEB2YXJ7ZGF0YX0sfSBAd3tnY3J5X3NleHBfdCBAdmFye3NrZXl9fSkKKworT2J2aW91c2x5IGEgcHJpdmF0ZSBrZXkgbXVzdCBiZSBwcm92aWRlZCBmb3IgZGVjcnlwdGlvbi4gIEl0IGlzIGV4cGVjdGVkCithcyBhbiBhcHByb3ByaWF0ZSBTLWV4cHJlc3Npb24gKHNlZSBhYm92ZSkgaW4gQHZhcntza2V5fS4gIFRoZSBkYXRhIHRvCitiZSBkZWNyeXB0ZWQgbXVzdCBtYXRjaCB0aGUgZm9ybWF0IG9mIHRoZSByZXN1bHQgYXMgcmV0dXJuZWQgYnkKK0Bjb2Rle2djcnlfcGtfZW5jcnlwdH0sIGJ1dCBzaG91bGQgYmUgZW5sYXJnZWQgd2l0aCBhIEBjb2Rle2ZsYWdzfQorZWxlbWVudDoKKworQGV4YW1wbGUKKyhlbmMtdmFsCisgIChmbGFncykKKyAgKGVsZworICAgIChhIEB2YXJ7YS1tcGl9KQorICAgIChiIEB2YXJ7Yi1tcGl9KSkpCitAZW5kIGV4YW1wbGUKKworQG5vaW5kZW50CitOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBjdXJyZW50bHkgZG9lcyBub3Qga25vdyBvZiBhbnkgcGFkZGluZworbWV0aG9kcyBhbmQgdGhlIGNhbGxlciBtdXN0IGRvIGFueSB1bi1wYWRkaW5nIG9uIGhpcyBvd24uCisKK0Bub2luZGVudAorVGhlIGZ1bmN0aW9uIHJldHVybnMgMCBvbiBzdWNjZXNzIG9yIGFuIGVycm9yIGNvZGUuICBUaGUgdmFyaWFibGUgYXQgdGhlCithZGRyZXNzIG9mIEB2YXJ7cl9wbGFpbn0gd2lsbCBiZSBzZXQgdG8gTlVMTCBvbiBlcnJvciBvciByZWNlaXZlIHRoZQorZGVjcnlwdGVkIHZhbHVlIG9uIHN1Y2Nlc3MuICBUaGUgZm9ybWF0IG9mIEB2YXJ7cl9wbGFpbn0gaXMgYQorc2ltcGxlIFMtZXhwcmVzc2lvbiBwYXJ0IChpLmUuIG5vdCBhIHZhbGlkIG9uZSkgd2l0aCBqdXN0IG9uZSBNUEkgaWYKK3RoZXJlIHdhcyBubyBAY29kZXtmbGFnc30gZWxlbWVudCBpbiBAdmFye2RhdGF9OyBpZiBhdCBsZWFzdCBhbiBlbXB0eQorQGNvZGV7ZmxhZ3N9IGlzIHBhc3NlZCBpbiBAdmFye2RhdGF9LCB0aGUgZm9ybWF0IGlzOgorCitAZXhhbXBsZQorKHZhbHVlIEB2YXJ7cGxhaW50ZXh0fSkKK0BlbmQgZXhhbXBsZQorQGVuZCBkZWZ0eXBlZnVuCitAYyBlbmQgZ2NyeV9wa19kZWNyeXB0CisKKworQW5vdGhlciBvcGVyYXRpb24gY29tbW9ubHkgcGVyZm9ybWVkIHVzaW5nIHB1YmxpYyBrZXkgY3J5cHRvZ3JhcGh5IGlzCitzaWduaW5nIGRhdGEuICBJbiBzb21lIHNlbnNlIHRoaXMgaXMgZXZlbiBtb3JlIGltcG9ydGFudCB0aGFuCitlbmNyeXB0aW9uIGJlY2F1c2UgZGlnaXRhbCBzaWduYXR1cmVzIGFyZSBhbiBpbXBvcnRhbnQgaW5zdHJ1bWVudCBmb3IKK2tleSBtYW5hZ2VtZW50LiAgTGliZ2NyeXB0IHN1cHBvcnRzIGRpZ2l0YWwgc2lnbmF0dXJlcyB1c2luZworMiBmdW5jdGlvbnMsIHNpbWlsYXIgdG8gdGhlIGVuY3J5cHRpb24gZnVuY3Rpb25zOgorCitAZGVmdHlwZWZ1biBnY3J5X2Vycm9yX3QgZ2NyeV9wa19zaWduIChAd3tnY3J5X3NleHBfdCAqQHZhcntyX3NpZ30sfSBAd3tnY3J5X3NleHBfdCBAdmFye2RhdGF9LH0gQHd7Z2NyeV9zZXhwX3QgQHZhcntza2V5fX0pCisKK1RoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIGRpZ2l0YWwgc2lnbmF0dXJlIGZvciBAdmFye2RhdGF9IHVzaW5nIHRoZQorcHJpdmF0ZSBrZXkgQHZhcntza2V5fSBhbmQgcGxhY2UgaXQgaW50byB0aGUgdmFyaWFibGUgYXQgdGhlIGFkZHJlc3Mgb2YKK0B2YXJ7cl9zaWd9LiAgQHZhcntkYXRhfSBtYXkgZWl0aGVyIGJlIHRoZSBzaW1wbGUgb2xkIHN0eWxlIFMtZXhwcmVzc2lvbgord2l0aCBqdXN0IG9uZSBNUEkgb3IgYSBtb2Rlcm4gYW5kIG1vcmUgdmVyc2F0aWxlIFMtZXhwcmVzc2lvbiB3aGljaAorYWxsb3dzIHRvIGxldCBMaWJnY3J5cHQgaGFuZGxlIHBhZGRpbmc6CisKK0BleGFtcGxlIAorIChkYXRhCisgIChmbGFncyBwa2NzMSkKKyAgKGhhc2ggQHZhcntoYXNoLWFsZ299IEB2YXJ7YmxvY2t9KSkKK0BlbmQgZXhhbXBsZQorCitAbm9pbmRlbnQKK1RoaXMgZXhhbXBsZSByZXF1ZXN0cyB0byBzaWduIHRoZSBkYXRhIGluIEB2YXJ7YmxvY2t9IGFmdGVyIGFwcGx5aW5nCitQS0NTIzEgYmxvY2sgdHlwZSAxIHN0eWxlIHBhZGRpbmcuICBAdmFye2hhc2gtYWxnb30gaXMgYSBzdHJpbmcgd2l0aCB0aGUKK2hhc2ggYWxnb3JpdGhtIHRvIGJlIGVuY29kZWQgaW50byB0aGUgc2lnbmF0dXJlLCB0aGlzIG1heSBiZSBhbnkgaGFzaAorYWxnb3JpdGhtIG5hbWUgYXMgc3VwcG9ydGVkIGJ5IExpYmdjcnlwdC4gIE1vc3QgbGlrZWx5LCB0aGlzIHdpbGwgYmUKKyJzaGEyNTYiIG9yICJzaGExIi4gIEl0IGlzIG9idmlvdXMgdGhhdCB0aGUgbGVuZ3RoIG9mIEB2YXJ7YmxvY2t9IG11c3QKK21hdGNoIHRoZSBzaXplIG9mIHRoYXQgbWVzc2FnZSBkaWdlc3RzOyB0aGUgZnVuY3Rpb24gY2hlY2tzIHRoYXQgdGhpcworYW5kIG90aGVyIGNvbnN0cmFpbnRzIGFyZSB2YWxpZC4KKworQG5vaW5kZW50CitJZiBQS0NTIzEgcGFkZGluZyBpcyBub3QgcmVxdWlyZWQgKGJlY2F1c2UgdGhlIGNhbGxlciBkb2VzIGFscmVhZHkKK3Byb3ZpZGUgYSBwYWRkZWQgdmFsdWUpLCBlaXRoZXIgdGhlIG9sZCBmb3JtYXQgb3IgYmV0dGVyIHRoZSBmb2xsb3dpbmcKK2Zvcm1hdCBzaG91bGQgYmUgdXNlZDoKKworQGV4YW1wbGUKKyhkYXRhCisgIChmbGFncyByYXcpCisgICh2YWx1ZSBAdmFye21waX0pKQorQGVuZCBleGFtcGxlCisKK0Bub2luZGVudAorSGVyZSwgdGhlIGRhdGEgdG8gYmUgc2lnbmVkIGlzIGRpcmVjdGx5IGdpdmVuIGFzIGFuIEB2YXJ7TVBJfS4KKworQG5vaW5kZW50CitUaGUgc2lnbmF0dXJlIGlzIHJldHVybmVkIGFzIGEgbmV3bHkgYWxsb2NhdGVkIFMtZXhwcmVzc2lvbiBpbgorQHZhcntyX3NpZ30gdXNpbmcgdGhpcyBmb3JtYXQgZm9yIFJTQToKKworQGV4YW1wbGUKKyhzaWctdmFsCisgIChyc2EKKyAgICAocyBAdmFye3MtbXBpfSkpKQorQGVuZCBleGFtcGxlCisKK1doZXJlIEB2YXJ7cy1tcGl9IGlzIHRoZSByZXN1bHQgb2YgdGhlIFJTQSBzaWduIG9wZXJhdGlvbi4gIEZvciBEU0EgdGhlCitTLWV4cHJlc3Npb24gcmV0dXJuZWQgaXM6CisKK0BleGFtcGxlCisoc2lnLXZhbAorICAoZHNhCisgICAgKHIgQHZhcntyLW1waX0pCisgICAgKHMgQHZhcntzLW1waX0pKSkKK0BlbmQgZXhhbXBsZQorCitXaGVyZSBAdmFye3ItbXBpfSBhbmQgQHZhcntzLW1waX0gYXJlIHRoZSByZXN1bHQgb2YgdGhlIERTQSBzaWduCitvcGVyYXRpb24uICBGb3IgRWxnYW1hbCBzaWduaW5nICh3aGljaCBpcyBzbG93LCB5aWVsZHMgbGFyZ2UgbnVtYmVycworYW5kIHByb2JhYmx5IGlzIG5vdCBhcyBzZWN1cmUgYXMgdGhlIG90aGVyIGFsZ29yaXRobXMpLCB0aGUgc2FtZSBmb3JtYXQgaXMKK3VzZWQgd2l0aCAiZWxnIiByZXBsYWNpbmcgImRzYSIuCitAZW5kIGRlZnR5cGVmdW4KK0BjIGVuZCBnY3J5X3BrX3NpZ24KKworQG5vaW5kZW50CitUaGUgb3BlcmF0aW9uIG1vc3QgY29tbW9ubHkgdXNlZCBpcyBkZWZpbml0ZWx5IHRoZSB2ZXJpZmljYXRpb24gb2YgYQorc2lnbmF0dXJlLiAgTGliZ2NyeXB0IHByb3ZpZGVzIHRoaXMgZnVuY3Rpb246CisKK0BkZWZ0eXBlZnVuIGdjcnlfZXJyb3JfdCBnY3J5X3BrX3ZlcmlmeSAoQHd7Z2NyeV9zZXhwX3QgQHZhcntzaWd9fSwgQHd7Z2NyeV9zZXhwX3QgQHZhcntkYXRhfX0sIEB3e2djcnlfc2V4cF90IEB2YXJ7cGtleX19KQorCitUaGlzIGlzIHVzZWQgdG8gY2hlY2sgd2hldGhlciB0aGUgc2lnbmF0dXJlIEB2YXJ7c2lnfSBtYXRjaGVzIHRoZQorQHZhcntkYXRhfS4gIFRoZSBwdWJsaWMga2V5IEB2YXJ7cGtleX0gbXVzdCBiZSBwcm92aWRlZCB0byBwZXJmb3JtIHRoaXMKK3ZlcmlmaWNhdGlvbi4gIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciBpbiBpdHMgcGFyYW1ldGVycyB0bworQGNvZGV7Z2NyeV9wa19zaWdufSB3aXRoIHRoZSBleGNlcHRpb25zIHRoYXQgdGhlIHB1YmxpYyBrZXkgaXMgdXNlZAoraW5zdGVhZCBvZiB0aGUgcHJpdmF0ZSBrZXkgYW5kIHRoYXQgbm8gc2lnbmF0dXJlIGlzIGNyZWF0ZWQgYnV0IGEKK3NpZ25hdHVyZSwgaW4gYSBmb3JtYXQgYXMgY3JlYXRlZCBieSBAY29kZXtnY3J5X3BrX3NpZ259LCBpcyBwYXNzZWQgdG8KK3RoZSBmdW5jdGlvbiBpbiBAdmFye3NpZ30uCisKK0Bub2luZGVudAorVGhlIHJlc3VsdCBpcyAwIGZvciBzdWNjZXNzIChpLmUuIHRoZSBkYXRhIG1hdGNoZXMgdGhlIHNpZ25hdHVyZSksIG9yIGFuCitlcnJvciBjb2RlIHdoZXJlIHRoZSBtb3N0IHJlbGV2YW50IGNvZGUgaXMgQGNvZGV7R0NSWUVSUl9CQURfU0lHTkFUVVJFfQordG8gaW5kaWNhdGUgdGhhdCB0aGUgc2lnbmF0dXJlIGRvZXMgbm90IG1hdGNoIHRoZSBwcm92aWRlZCBkYXRhLgorCitAZW5kIGRlZnR5cGVmdW4KK0BjIGVuZCBnY3J5X3BrX3ZlcmlmeQorCitAbm9kZSBHZW5lcmFsIHB1YmxpYy1rZXkgcmVsYXRlZCBGdW5jdGlvbnMKK0BzZWN0aW9uIEdlbmVyYWwgcHVibGljLWtleSByZWxhdGVkIEZ1bmN0aW9ucworCitAbm9pbmRlbnQKK0EgY291cGxlIG9mIHV0aWxpdHkgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUgdG8gcmV0cmlldmUgdGhlIGxlbmd0aCBvZgordGhlIGtleSwgbWFwIGFsZ29yaXRobSBpZGVudGlmaWVycyBhbmQgcGVyZm9ybSBzYW5pdHkgY2hlY2tzOgorCitAZGVmdHlwZWZ1biB7Y29uc3QgY2hhciAqfSBnY3J5X3BrX2FsZ29fbmFtZSAoaW50IEB2YXJ7YWxnb30pCisKK01hcCB0aGUgcHVibGljIGtleSBhbGdvcml0aG0gaWQgQHZhcnthbGdvfSB0byBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZgordGhlIGFsZ29yaXRobSBuYW1lLiAgRm9yIHVua25vd24gYWxnb3JpdGhtcyB0aGlzIGZ1bmN0aW9ucyByZXR1cm5zIHRoZQorc3RyaW5nIEBjb2RleyI/In0uICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgdXNlZCB0byB0ZXN0IGZvciB0aGUKK2F2YWlsYWJpbGl0eSBvZiBhbiBhbGdvcml0aG0uCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gaW50IGdjcnlfcGtfbWFwX25hbWUgKGNvbnN0IGNoYXIgKkB2YXJ7bmFtZX0pCisKK01hcCB0aGUgYWxnb3JpdGhtIEB2YXJ7bmFtZX0gdG8gYSBwdWJsaWMga2V5IGFsZ29yaXRobSBJZC4gIFJldHVybnMgMCBpZgordGhlIGFsZ29yaXRobSBuYW1lIGlzIG5vdCBrbm93bi4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBpbnQgZ2NyeV9wa190ZXN0X2FsZ28gKGludCBAdmFye2FsZ299KQorCitSZXR1cm4gMCBpZiB0aGUgcHVibGljIGtleSBhbGdvcml0aG0gQHZhcnthbGdvfSBpcyBhdmFpbGFibGUgZm9yIHVzZS4KK05vdGUgdGhhdCB0aGlzIGlzIGltcGxlbWVudGVkIGFzIGEgbWFjcm8uCitAZW5kIGRlZnR5cGVmdW4KKworCitAZGVmdHlwZWZ1biB7dW5zaWduZWQgaW50fSBnY3J5X3BrX2dldF9uYml0cyAoZ2NyeV9zZXhwX3QgQHZhcntrZXl9KQorCitSZXR1cm4gd2hhdCBpcyBjb21tb25seSByZWZlcnJlZCBhcyB0aGUga2V5IGxlbmd0aCBmb3IgdGhlIGdpdmVuCitwdWJsaWMgb3IgcHJpdmF0ZSBpbiBAdmFye2tleX0uCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4ge3Vuc2lnbmVkIGNoYXIgKn0gZ2NyeV9wa19nZXRfa2V5Z3JpcCAoQHd7Z2NyeV9zZXhwX3QgQHZhcntrZXl9fSwgQHd7dW5zaWduZWQgY2hhciAqQHZhcnthcnJheX19KQorCitSZXR1cm4gdGhlIHNvIGNhbGxlZCAia2V5Z3JpcCIgd2hpY2ggaXMgdGhlIFNIQS0xIGhhc2ggb2YgdGhlIHB1YmxpYyBrZXkKK3BhcmFtZXRlcnMgZXhwcmVzc2VkIGluIGEgd2F5IGRlcGVuZGVkIG9uIHRoZSBhbGdvcml0aG0uICBAdmFye2FycmF5fQorbXVzdCBlaXRoZXIgcHJvdmlkZSBzcGFjZSBmb3IgMjAgYnl0ZXMgb3IgYmUgQGNvZGV7TlVMTH0uIEluIHRoZSBsYXR0ZXIKK2Nhc2UgYSBuZXdseSBhbGxvY2F0ZWQgYXJyYXkgb2YgdGhhdCBzaXplIGlzIHJldHVybmVkLiAgT24gc3VjY2VzcyBhCitwb2ludGVyIHRvIHRoZSBuZXdseSBhbGxvY2F0ZWQgc3BhY2Ugb3IgdG8gQHZhcnthcnJheX0gaXMgcmV0dXJuZWQuCitAY29kZXtOVUxMfSBpcyByZXR1cm5lZCB0byBpbmRpY2F0ZSBhbiBlcnJvciB3aGljaCBpcyBtb3N0IGxpa2VseSBhbgordW5rbm93biBhbGdvcml0aG0gb3Igb25lIHdoZXJlIGEgImtleWdyaXAiIGhhcyBub3QgeWV0IGJlZW4gZGVmaW5lZC4KK1RoZSBmdW5jdGlvbiBhY2NlcHRzIHB1YmxpYyBvciBzZWNyZXQga2V5cyBpbiBAdmFye2tleX0uCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gZ2NyeV9lcnJvcl90IGdjcnlfcGtfdGVzdGtleSAoZ2NyeV9zZXhwX3QgQHZhcntrZXl9KQorCitSZXR1cm4gemVybyBpZiB0aGUgcHJpdmF0ZSBrZXkgQHZhcntrZXl9IGlzIGBzYW5lJywgYW4gZXJyb3IgY29kZSBvdGhlcndpc2UuCitOb3RlIHRoYXQgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGNoZWNrIHRoZSBgc2FuZW5lc3MnIG9mIGEgcHVibGljIGtleS4KKworQGVuZCBkZWZ0eXBlZnVuCisKKworQGRlZnR5cGVmdW4gZ2NyeV9lcnJvcl90IGdjcnlfcGtfYWxnb19pbmZvIChAd3tpbnQgQHZhcnthbGdvfX0sIEB3e2ludCBAdmFye3doYXR9fSwgQHd7dm9pZCAqQHZhcntidWZmZXJ9fSwgQHd7c2l6ZV90ICpAdmFye25ieXRlc319KQorCitEZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIEB2YXJ7d2hhdH0gcmV0dXJuIHZhcmlvdXMgaW5mb3JtYXRpb24gYWJvdXQKK3RoZSBwdWJsaWMga2V5IGFsZ29yaXRobSB3aXRoIHRoZSBpZCBAdmFye2FsZ299LiAgTm90ZSB0aGF0IHRoZQorZnVuY3Rpb24gcmV0dXJucyBAY29kZXstMX0gb24gZXJyb3IgYW5kIHRoZSBhY3R1YWwgZXJyb3IgY29kZSBtdXN0IGJlCityZXRyaWV2ZWQgdXNpbmcgdGhlIGZ1bmN0aW9uIEBjb2Rle2djcnlfZXJybm99LiAgVGhlIGN1cnJlbnRseSBkZWZpbmVkCit2YWx1ZXMgZm9yIEB2YXJ7d2hhdH0gYXJlOgorCitAdGFibGUgQGNvZGUKK0BpdGVtIEdDUllDVExfVEVTVF9BTEdPOgorUmV0dXJuIDAgaWYgdGhlIHNwZWNpZmllZCBhbGdvcml0aG0gaXMgYXZhaWxhYmxlIGZvciB1c2UuCitAdmFye2J1ZmZlcn0gbXVzdCBiZSBAY29kZXtOVUxMfSwgQHZhcntuYnl0ZXN9IG1heSBiZSBwYXNzZWQgYXMKK0Bjb2Rle05VTEx9IG9yIHBvaW50IHRvIGEgdmFyaWFibGUgd2l0aCB0aGUgcmVxdWlyZWQgdXNhZ2Ugb2YgdGhlCithbGdvcml0aG0uIFRoaXMgbWF5IGJlIDAgZm9yICJkb24ndCBjYXJlIiBvciB0aGUgYml0LXdpc2UgT1Igb2YgdGhlc2UKK2ZsYWdzOgorCitAdGFibGUgQGNvZGUKK0BpdGVtIEdDUllfUEtfVVNBR0VfU0lHTiAKK0FsZ29yaXRobSBpcyB1c2FibGUgZm9yIHNpZ25pbmcuCitAaXRlbSBHQ1JZX1BLX1VTQUdFX0VOQ1IgCitBbGdvcml0aG0gaXMgdXNhYmxlIGZvciBlbmNyeXB0aW9uLgorQGVuZCB0YWJsZQorCitVbmxlc3MgeW91IG5lZWQgdG8gdGVzdCBmb3IgdGhlIGFsbG93ZWQgdXNhZ2UsIGl0IGlzIGluIGdlbmVyYWwgYmV0dGVyCit0byB1c2UgdGhlIG1hY3JvIGdjcnlfcGtfdGVzdF9hbGdvIGluc3RlYWQuCisKK0BpdGVtIEdDUllDVExfR0VUX0FMR09fVVNBR0U6CitSZXR1cm4gdGhlIHVzYWdlIGZsYWdzIGZvciB0aGUgZ2l2ZW4gYWxnb3JpdGhtLiAgQW4gaW52YWxpZCBhbGdvcml0aG0KK3JldHVybiAwLiAgRGlzYWJsZWQgYWxnb3JpdGhtcyBhcmUgaWdub3JlZCBoZXJlIGJlY2F1c2Ugd2UKK3dhbnQgdG8ga25vdyB3aGV0aGVyIHRoZSBhbGdvcml0aG0gaXMgYXQgYWxsIGNhcGFibGUgb2YgYSBjZXJ0YWluIHVzYWdlLgorCitAaXRlbSBHQ1JZQ1RMX0dFVF9BTEdPX05QS0VZCitSZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyB0aGUgcHVibGljIGtleSBmb3IgYWxnb3JpdGhtIEB2YXJ7YWxnb30KK2NvbnNpc3Qgb2YuICBSZXR1cm4gMCBmb3IgYW4gdW5rbm93biBhbGdvcml0aG0uCisKK0BpdGVtIEdDUllDVExfR0VUX0FMR09fTlNLRVkKK1JldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRoZSBwcml2YXRlIGtleSBmb3IgYWxnb3JpdGhtIEB2YXJ7YWxnb30KK2NvbnNpc3Qgb2YuICBOb3RlIHRoYXQgdGhpcyB2YWx1ZSBpcyBhbHdheXMgbGFyZ2VyIHRoYW4gdGhhdCBvZiB0aGUKK3B1YmxpYyBrZXkuICBSZXR1cm4gMCBmb3IgYW4gdW5rbm93biBhbGdvcml0aG0uCisKK0BpdGVtIEdDUllDVExfR0VUX0FMR09fTlNJR04KK1JldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGEgc2lnbmF0dXJlIGNyZWF0ZWQgd2l0aCB0aGUgYWxnb3JpdGhtCitAdmFye2FsZ299IGNvbnNpc3RzIG9mLiAgUmV0dXJuIDAgZm9yIGFuIHVua25vd24gYWxnb3JpdGhtIG9yIGZvciBhbgorYWxnb3JpdGhtIG5vdCBjYXBhYmxlIG9mIGNyZWF0aW5nIHNpZ25hdHVyZXMuCisKK0BpdGVtIEdDUllDVExfR0VUX0FMR09fTkVOQworUmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgYSBlbmNyeXB0ZWQgbWVzc2FnZSBjcmVhdGVkIHdpdGggdGhlIGFsZ29yaXRobQorQHZhcnthbGdvfSBjb25zaXN0cyBvZi4gIFJldHVybiAwIGZvciBhbiB1bmtub3duIGFsZ29yaXRobSBvciBmb3IgYW4KK2FsZ29yaXRobSBub3QgY2FwYWJsZSBvZiBlbmNyeXB0aW9uLgorQGVuZCB0YWJsZQorCitAbm9pbmRlbnQKK1BsZWFzZSBub3RlIHRoYXQgcGFyYW1ldGVycyBub3QgcmVxdWlyZWQgc2hvdWxkIGJlIHBhc3NlZCBhcyBAY29kZXtOVUxMfS4KK0BlbmQgZGVmdHlwZWZ1bgorQGMgZW5kIGdjcnlfcGtfYWxnb19pbmZvCisKKworQGRlZnR5cGVmdW4gZ2NyeV9lcnJvcl90IGdjcnlfcGtfY3RsIChAd3tpbnQgQHZhcntjbWR9fSwgQHd7dm9pZCAqQHZhcntidWZmZXJ9fSwgQHd7c2l6ZV90IEB2YXJ7YnVmbGVufX0pCisKK1RoaXMgaXMgYSBnZW5lcmFsIHB1cnBvc2UgZnVuY3Rpb24gdG8gcGVyZm9ybSBjZXJ0YWluIGNvbnRyb2wKK29wZXJhdGlvbnMuICBAdmFye2NtZH0gY29udHJvbHMgd2hhdCBpcyB0byBiZSBkb25lLiBUaGUgcmV0dXJuIHZhbHVlIGlzCiswIGZvciBzdWNjZXNzIG9yIGFuIGVycm9yIGNvZGUuICBDdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlcyBmb3IKK0B2YXJ7Y21kfSBhcmU6CisKK0B0YWJsZSBAY29kZQorQGl0ZW0gR0NSWUNUTF9ESVNBQkxFX0FMR08KK0Rpc2FibGUgdGhlIGFsZ29yaXRobSBnaXZlbiBhcyBhbiBhbGdvcml0aG0gaWQgaW4gQHZhcntidWZmZXJ9LgorQHZhcntidWZmZXJ9IG11c3QgcG9pbnQgdG8gYW4gQGNvZGV7aW50fSB2YXJpYWJsZSB3aXRoIHRoZSBhbGdvcml0aG0gaWQKK2FuZCBAdmFye2J1Zmxlbn0gbXVzdCBoYXZlIHRoZSB2YWx1ZSBAY29kZXtzaXplb2YgKGludCl9LgorCitAZW5kIHRhYmxlCitAZW5kIGRlZnR5cGVmdW4KK0BjIGVuZCBnY3J5X3BrX2N0bAorCitAbm9pbmRlbnQKK0xpYmdjcnlwdCBhbHNvIHByb3ZpZGVzIGEgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgcHVibGljIGtleQorcGFpcnM6CisKK0BkZWZ0eXBlZnVuIGdjcnlfZXJyb3JfdCBnY3J5X3BrX2dlbmtleSAoQHd7Z2NyeV9zZXhwX3QgKkB2YXJ7cl9rZXl9fSwgQHd7Z2NyeV9zZXhwX3QgQHZhcntwYXJtc319KQorCitUaGlzIGZ1bmN0aW9uIGNyZWF0ZSBhIG5ldyBwdWJsaWMga2V5IHBhaXIgdXNpbmcgaW5mb3JtYXRpb24gZ2l2ZW4gaW4KK3RoZSBTLWV4cHJlc3Npb24gQHZhcntwYXJtc30gYW5kIHN0b3JlcyB0aGUgcHJpdmF0ZSBhbmQgdGhlIHB1YmxpYyBrZXkKK2luIG9uZSBuZXcgUy1leHByZXNzaW9uIGF0IHRoZSBhZGRyZXNzIGdpdmVuIGJ5IEB2YXJ7cl9rZXl9LiAgSW4gY2FzZSBvZgorYW4gZXJyb3IsIEB2YXJ7cl9rZXl9IGlzIHNldCB0byBAY29kZXtOVUxMfS4gIFRoZSByZXR1cm4gY29kZSBpcyAwIGZvcgorc3VjY2VzcyBvciBhbiBlcnJvciBjb2RlIG90aGVyd2lzZS4KKworQG5vaW5kZW50CitIZXJlIGlzIGFuIGV4YW1wbGUgZm9yIEB2YXJ7cGFybXN9IHRvIGNyZWF0ZSBhbiAyMDQ4IGJpdCBSU0Ega2V5OgorCitAZXhhbXBsZQorKGdlbmtleQorICAocnNhCisgICAgKG5iaXRzIDQ6MjA0OCkpKQorQGVuZCBleGFtcGxlCisKK0Bub2luZGVudAorVG8gY3JlYXRlIGFuIEVsZ2FtYWwga2V5LCBzdWJzdGl0dXRlICJlbGciIGZvciAicnNhIiBhbmQgdG8gY3JlYXRlIGEgRFNBCitrZXkgdXNlICJkc2EiLiAgVmFsaWQgcmFuZ2VzIGZvciB0aGUga2V5IGxlbmd0aCBkZXBlbmQgb24gdGhlCithbGdvcml0aG1zOyBhbGwgY29tbW9ubHkgdXNlZCBrZXkgbGVuZ3RocyBhcmUgc3VwcG9ydGVkLiAgQ3VycmVudGx5CitzdXBwb3J0ZWQgcGFyYW1ldGVycyBhcmU6CisKK0B0YWJsZSBAY29kZQorQGl0ZW0gbmJpdHMKK1RoaXMgaXMgYWx3YXlzIHJlcXVpcmVkIHRvIHNwZWNpZnkgdGhlIGxlbmd0aCBvZiB0aGUga2V5LiAgVGhlIGFyZ3VtZW50CitpcyBhIHN0cmluZyB3aXRoIGEgbnVtYmVyIGluIEMtbm90YXRpb24uICBUaGUgdmFsdWUgc2hvdWxkIGJlIGEgbXVsdGlwbGUKK29mIDguCisKK0BpdGVtIGN1cnZlIEB2YXJ7bmFtZX0KK0ZvciBFQ0MgYSBuYW1lZCBjdXJ2ZSBtYXkgYmUgdXNlZCBpbnN0ZWFkIG9mIGdpdmluZyB0aGUgbnVtYmVyIG9mCityZXF1ZXN0ZWQgYml0cy4gIFRoaXMgYWxsb3dzIHRvIHJlcXVlc3QgYSBzcGVjaWZpYyBjdXJ2ZSB0byBvdmVycmlkZSBhCitkZWZhdWx0IHNlbGVjdGlvbiBMaWJnY3J5cHQgd291bGQgaGF2ZSB0YWtlbiBpZiBAY29kZXtuYml0c30gaGFzIGJlZW4KK2dpdmVuLiAgVGhlIGF2YWlsYWJsZSBuYW1lcyBhcmUgbGlzdGVkIHdpdGggdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBFQ0MKK3B1YmxpYyBrZXkgcGFyYW1ldGVycy4KKworQGl0ZW0gcnNhLXVzZS1lCitUaGlzIGlzIG9ubHkgdXNlZCB3aXRoIFJTQSB0byBnaXZlIGEgaGludCBmb3IgdGhlIHB1YmxpYyBleHBvbmVudC4gVGhlCit2YWx1ZSB3aWxsIGJlIHVzZWQgYXMgYSBiYXNlIHRvIHRlc3QgZm9yIGEgdXNhYmxlIGV4cG9uZW50LiBTb21lIHZhbHVlcworYXJlIHNwZWNpYWw6CisKK0B0YWJsZSBAc2FtcAorQGl0ZW0gMAorVXNlIGEgc2VjdXJlIGFuZCBmYXN0IHZhbHVlLiAgVGhpcyBpcyBjdXJyZW50bHkgdGhlIG51bWJlciA0MS4KK0BpdGVtIDEKK1VzZSBhIHZhbHVlIGFzIHJlcXVpcmVkIGJ5IHNvbWUgY3J5cHRvIHBvbGljaWVzLiAgVGhpcyBpcyBjdXJyZW50bHkKK3RoZSBudW1iZXIgNjU1MzcuCitAaXRlbSAyCitSZXNlcnZlZAorQGl0ZW0gPiAyCitVc2UgdGhlIGdpdmVuIHZhbHVlLgorQGVuZCB0YWJsZQorCitAbm9pbmRlbnQKK0lmIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCB1c2VkLCBMaWJnY3J5cHQgdXNlcyBmb3IgaGlzdG9yaWMgcmVhc29ucworNjU1MzcuCisKK0BpdGVtIHFiaXRzCitUaGlzIGlzIG9ubHkgbWVhbmlnZnVsIGZvciBEU0Ega2V5cy4gIElmIGl0IGlzIGdpdmVuIHRoZSBEU0Ega2V5IGlzCitnZW5lcmF0ZWQgd2l0aCBhIFEgcGFyYW1leWVyIG9mIHRoaXMgc2l6ZS4gIElmIGl0IGlzIG5vdCBnaXZlbiBvciB6ZXJvIAorUSBpcyBkZWR1Y2VkIGZyb20gTkJJVFMgaW4gdGhpcyB3YXk6CitAdGFibGUgQHNhbXAKK0BpdGVtIDUxMiA8PSBOIDw9IDEwMjQKK1EgPSAxNjAKK0BpdGVtIE4gPSAyMDQ4CitRID0gMjI0CitAaXRlbSBOID0gMzA3MgorUSA9IDI1NgorQGl0ZW0gTiA9IDc2ODAKK1EgPSAzODQKK0BpdGVtIE4gPSAxNTM2MAorUSA9IDUxMgorQGVuZCB0YWJsZQorTm90ZSB0aGF0IGluIHRoaXMgY2FzZSBvbmx5IHRoZSB2YWx1ZXMgZm9yIE4sIGFzIGdpdmVuIGluIHRoZSB0YWJsZSwKK2FyZSBhbGxvd2VkLiAgV2hlbiBzcGVjaWZ5aW5nIFEgYWxsIHZhbHVlcyBvZiBOIGluIHRoZSByYW5nZSA1MTIgdG8KKzE1NjgwIGFyZSB2YWxpZCBhcyBsb25nIGFzIHRoZXkgYXJlIG11bHRpcGxlcyBvZiA4LgorCitAaXRlbSB0cmFuc2llbnQta2V5CitUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3IgUlNBIGFuZCBEU0Ega2V5cy4gIFRoaXMgaXMgYSBmbGFnIHdpdGggbm8KK3ZhbHVlLiAgSWYgZ2l2ZW4gdGhlIFJTQSBvciBEU0Ega2V5IGlzIGNyZWF0ZWQgdXNpbmcgYSBmYXN0ZXIgYW5kIGEKK3NvbWV3aGF0IGxlc3Mgc2VjdXJlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLiAgVGhpcyBmbGFnIG1heSBiZSB1c2VkCitmb3Iga2V5cyB3aGljaCBhcmUgb25seSB1c2VkIGZvciBhIHNob3J0IHRpbWUgYW5kIGRvIG5vdCByZXF1aXJlIGZ1bGwKK2NyeXB0b2dyYXBoaWMgc3RyZW5ndGguCisKK0BpdGVtIGRvbWFpbgorVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwgZm9yIERMUCBhbGdvcml0aG1zLiAgSWYgc3BlY2lmaWVkIGtleXMgYXJlCitnZW5lcmF0ZWQgd2l0aCBkb21haW4gcGFyYW1ldGVycyB0YWtlbiBmcm9tIHRoaXMgbGlzdC4gIFRoZSBleGFjdAorZm9ybWF0IG9mIHRoaXMgcGFyYW1ldGVyIGRlcGVuZHMgb24gdGhlIGFjdHVhbCBhbGdvcml0aG0uICBJdCBpcworY3VycmVudGx5IG9ubHkgaW1wbGVtZW50ZWQgZm9yIERTQSB1c2luZyB0aGlzIGZvcm1hdDoKKworQGV4YW1wbGUKKyhnZW5rZXkKKyAgKGRzYQorICAgIChkb21haW4KKyAgICAgIChwIEB2YXJ7cC1tcGl9KQorICAgICAgKHEgQHZhcntxLW1waX0pCisgICAgICAoZyBAdmFye3EtbXBpfSkpKSkKK0BlbmQgZXhhbXBsZQorCitAY29kZXtuYml0c30gYW5kIEBjb2Rle3FiaXRzfSBtYXkgbm90IGJlIHNwZWNpZmllZCBiZWNhdXNlIHRoZXkgYXJlCitkZXJpdmVkIGZyb20gdGhlIGRvbWFpbiBwYXJhbWV0ZXJzLgorCitAaXRlbSBkZXJpdmUtcGFybXMKK1RoaXMgaXMgY3VycmVudGx5IG9ubHkgaW1wbGVtZW50ZWQgZm9yIFJTQSBhbmQgRFNBIGtleXMuICBJdCBpcyBub3QKK2FsbG93ZWQgdG8gdXNlIHRoaXMgdG9nZXRoZXIgd2l0aCBhIEBjb2Rle2RvbWFpbn0gc3BlY2lmaWNhdGlvbi4gIElmCitnaXZlbiwgaXQgaXMgdXNlZCB0byBkZXJpdmUgdGhlIGtleXMgdXNpbmcgdGhlIGdpdmVuIHBhcmFtZXRlcnMuCisKK0lmIGdpdmVuIGZvciBhbiBSU0Ega2V5IHRoZSBYOS4zMSBrZXkgZ2VuZXJhdGlvbiBhbGdvcml0aG0gaXMgdXNlZAorZXZlbiBpZiBsaWJnY3J5cHQgaXMgbm90IGluIEZJUFMgbW9kZS4gIElmIGdpdmVuIGZvciBhIERTQSBrZXksIHRoZQorRklQUyAxODYgYWxnb3JpdGhtIGlzIHVzZWQgZXZlbiBpZiBsaWJnY3J5cHQgaXMgbm90IGluIEZJUFMgbW9kZS4KKworQGV4YW1wbGUKKyhnZW5rZXkKKyAgKHJzYQorICAgIChuYml0cyA0OjEwMjQpCisgICAgKHJzYS11c2UtZSAxOjMpCisgICAgKGRlcml2ZS1wYXJtcworICAgICAgKFhwMSAjMUExOTE2RERCMjlCNEVCN0VCNjczMkUxMjgjKQorICAgICAgKFhwMiAjMTkyRThBQUM0MUM1NzZDODIyRDkzRUE0MzMjKQorICAgICAgKFhwICAjRDhDRDgxRjAzNUVDNTdFRkU4MjI5NTUxNDlEM0JGRjcwQzUzNTIwRAorICAgICAgICAgICAgNzY5RDZENzY2NDZDN0E3OTJFMTZFQkQ4OUZFNkZDNUI2MDVBNjQ5MworICAgICAgICAgICAgMzlERkM5MjVBODZBNEM2RDE1MEI3MUI5RUVBMDJENjg4ODVGNTAwOQorICAgICAgICAgICAgQjk4QkQ5ODQjKQorICAgICAgKFhxMSAjMUE1Q0Y3MkVFNzcwREU1MENCMDlBQ0NFQTkjKQorICAgICAgKFhxMiAjMTM0RTRDQUExNkQyMzUwQTIxRDc3NUM0MDQjKQorICAgICAgKFhxICAjQ0MxMDkyNDk1RDg2N0U2NDA2NURFRTNFNzk1NUYyRUJDN0Q0N0EyRAorICAgICAgICAgICAgN0M5OTUzMzg4Rjk3REREQzNFMUNBMTlDMzVDQTY1OUVEQzJGQzMyNQorICAgICAgICAgICAgNkQyOUMyNjI3NDc5QzA4NkE2OTlBNDlDNEM5Q0VFN0VGN0JEMUIzNAorICAgICAgICAgICAgMzIxREUzNEEjKSkpKQorQGVuZCBleGFtcGxlCisKK0BleGFtcGxlCisoZ2Vua2V5CisgIChkc2EKKyAgICAobmJpdHMgNDoxMDI0KQorICAgIChkZXJpdmUtcGFybXMKKyAgICAgIChzZWVkIEB2YXJ7c2VlZC1tcGl9KSkpKQorQGVuZCBleGFtcGxlCisKKworQGl0ZW0gdXNlLXg5MzEKK0BjaW5kZXggWDkuMzEKK0ZvcmNlIHRoZSB1c2Ugb2YgdGhlIEFOU0kgWDkuMzEga2V5IGdlbmVyYXRpb24gYWxnb3JpdGhtIGluc3RlYWQgb2YKK3RoZSBkZWZhdWx0IGFsZ29yaXRobS4gVGhpcyBmbGFnIGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3IgUlNBIGFuZAordXN1YWxseSBub3QgcmVxdWlyZWQuICBOb3RlIHRoYXQgdGhpcyBhbGdvcml0aG0gaXMgaW1wbGljaXRseSB1c2VkIGlmCitlaXRoZXIgQGNvZGV7ZGVyaXZlLXBhcm1zfSBpcyBnaXZlbiBvciBMaWJnY3J5cHQgaXMgaW4gRklQUyBtb2RlLgorCitAaXRlbSB1c2UtZmlwczE4NgorQGNpbmRleCBGSVBTIDE4NgorRm9yY2UgdGhlIHVzZSBvZiB0aGUgRklQUyAxODYga2V5IGdlbmVyYXRpb24gYWxnb3JpdGhtIGluc3RlYWQgb2YgdGhlCitkZWZhdWx0IGFsZ29yaXRobS4gIFRoaXMgZmxhZyBpcyBvbmx5IG1lYW5pbmdmdWwgZm9yIERTQSBhbmQgdXN1YWxseQorbm90IHJlcXVpcmVkLiAgTm90ZSB0aGF0IHRoaXMgYWxnb3JpdGhtIGlzIGltcGxpY2l0bHkgdXNlZCBpZiBlaXRoZXIKK0Bjb2Rle2Rlcml2ZS1wYXJtc30gaXMgZ2l2ZW4gb3IgTGliZ2NyeXB0IGlzIGluIEZJUFMgbW9kZS4gIEFzIG9mIG5vdworRklQUyAxODYtMiBpcyBpbXBsZW1lbnRlZDsgYWZ0ZXIgdGhlIGFwcHJvdmFsIG9mIEZJUFMgMTg2LTMgdGhlIGNvZGUKK3dpbGwgYmUgY2hhbmdlZCB0byBpbXBsZW1lbnQgMTg2LTMuCisKKworQGl0ZW0gdXNlLWZpcHMxODYtMgorRm9yY2UgdGhlIHVzZSBvZiB0aGUgRklQUyAxODYtMiBrZXkgZ2VuZXJhdGlvbiBhbGdvcml0aG0gaW5zdGVhZCBvZgordGhlIGRlZmF1bHQgYWxnb3JpdGhtLiAgVGhpcyBhbGdvcml0aG0gaXMgc2xpZ2hsdHkgZGlmZmVyZW50IGZyb20KK0ZJUFMgMTg2LTMgYW5kIGFsbG93cyBvbmx5IDEwMjQgYml0IGtleXMuICBUaGlzIGZsYWcgaXMgb25seSBtZWFuaW5nZnVsCitmb3IgRFNBIGFuZCBvbmx5IHJlcXVpcmVkIGZvciBGSVBTIHRlc3RpbmcgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KKworCitAZW5kIHRhYmxlCitAYyBlbmQgdGFibGUgb2YgcGFyYW1ldGVycworCitAbm9pbmRlbnQKK1RoZSBrZXkgcGFpciBpcyByZXR1cm5lZCBpbiBhIGZvcm1hdCBkZXBlbmRpbmcgb24gdGhlIGFsZ29yaXRobS4gIEJvdGgKK3ByaXZhdGUgYW5kIHB1YmxpYyBrZXlzIGFyZSByZXR1cm5lZCBpbiBvbmUgY29udGFpbmVyIGFuZCBtYXkgYmUKK2FjY29tcGFuaWVkIGJ5IHNvbWUgbWlzY2VsbGFuZW91cyBpbmZvcm1hdGlvbi4KKworQG5vaW5kZW50CitBcyBhbiBleGFtcGxlLCBoZXJlIGlzIHdoYXQgdGhlIEVsZ2FtYWwga2V5IGdlbmVyYXRpb24gcmV0dXJuczoKKworQGV4YW1wbGUKKyhrZXktZGF0YQorICAocHVibGljLWtleQorICAgIChlbGcKKyAgICAgIChwIEB2YXJ7cC1tcGl9KQorICAgICAgKGcgQHZhcntnLW1waX0pCisgICAgICAoeSBAdmFye3ktbXBpfSkpKQorICAocHJpdmF0ZS1rZXkKKyAgICAoZWxnCisgICAgICAocCBAdmFye3AtbXBpfSkKKyAgICAgIChnIEB2YXJ7Zy1tcGl9KQorICAgICAgKHkgQHZhcnt5LW1waX0pCisgICAgICAoeCBAdmFye3gtbXBpfSkpKQorICAobWlzYy1rZXktaW5mbworICAgIChwbTEtZmFjdG9ycyBAdmFye24xIG4yIC4uLiBubn0pKQorQGVuZCBleGFtcGxlCisKK0Bub2luZGVudAorQXMgeW91IGNhbiBzZWUsIHNvbWUgb2YgdGhlIGluZm9ybWF0aW9uIGlzIGR1cGxpY2F0ZWQsIGJ1dCB0aGlzCitwcm92aWRlcyBhbiBlYXN5IHdheSB0byBleHRyYWN0IGVpdGhlciB0aGUgcHVibGljIG9yIHRoZSBwcml2YXRlIGtleS4KK05vdGUgdGhhdCB0aGUgb3JkZXIgb2YgdGhlIGVsZW1lbnRzIGlzIG5vdCBkZWZpbmVkLCBlLmcuIHRoZSBwcml2YXRlCitrZXkgbWF5IGJlIHN0b3JlZCBiZWZvcmUgdGhlIHB1YmxpYyBrZXkuIEB2YXJ7bjEgbjIgLi4uIG5ufSBpcyBhIGxpc3QKK29mIHByaW1lIG51bWJlcnMgdXNlZCB0byBjb21wb3NpdGUgQHZhcntwLW1waX07IHRoaXMgaXMgaW4gZ2VuZXJhbCBub3QKK2EgdmVyeSB1c2VmdWwgaW5mb3JtYXRpb24gYW5kIG9ubHkgYXZhaWxhYmxlIGlmIHRoZSBrZXkgZ2VuZXJhdGlvbgorYWxnb3JpdGhtIHByb3ZpZGVzIHRoZW0uICAKK0BlbmQgZGVmdHlwZWZ1bgorQGMgZW5kIGdjcnlfcGtfZ2Vua2V5CisKK0Bub2RlIEFDIEludGVyZmFjZQorQHNlY3Rpb24gQWx0ZXJuYXRpdmUgUHVibGljIEtleSBJbnRlcmZhY2UKKworVGhpcyBzZWN0aW9uIGRvY3VtZW50cyB0aGUgYWx0ZXJuYXRpdmUgaW50ZXJmYWNlIHRvIGFzeW1tZXRyaWMKK2NyeXB0b2dyYXBoeSAoYWMpIHRoYXQgaXMgbm90IGJhc2VkIG9uIFMtZXhwcmVzc2lvbnMsIGJ1dCBvbiBuYXRpdmUgQworZGF0YSBzdHJ1Y3R1cmVzLiAgQXMgb3Bwb3NlZCB0byB0aGUgcGsgaW50ZXJmYWNlIGRlc2NyaWJlZCBpbiB0aGUKK2Zvcm1lciBjaGFwdGVyLCB0aGlzIG9uZSBmb2xsb3dzIGFuIG9wZW4vdXNlL2Nsb3NlIHBhcmFkaWdtIGxpa2Ugb3RoZXIKK2J1aWxkaW5nIGJsb2NrcyBvZiB0aGUgbGlicmFyeS4KKworQHN0cm9uZ3tUaGlzIGludGVyZmFjZSBoYXMgYSBmZXcga25vd24gcHJvYmxlbXM7IG1vc3Qgbm90ZXdvcnRoeSBhbgoraW5oZXJlbnQgdGVuZGVuY3kgdG8gbGVhayBtZW1vcnkuICBJdCBtaWdodCBub3QgYmUgYXZhaWxhYmxlIGluCitmb3J0aGNvbWluZyB2ZXJzaW9ucyBvZiBMaWJnY3J5cHQufQorCisKK0BtZW51CisqIEF2YWlsYWJsZSBhc3ltbWV0cmljIGFsZ29yaXRobXM6OiAgTGlzdCBvZiBhbGdvcml0aG1zIHN1cHBvcnRlZCBieSB0aGUgbGlicmFyeS4KKyogV29ya2luZyB3aXRoIHNldHMgb2YgZGF0YTo6ICAgSG93IHRvIHdvcmsgd2l0aCBzZXRzIG9mIGRhdGEuCisqIFdvcmtpbmcgd2l0aCBJTyBvYmplY3RzOjogICAgIEhvdyB0byB3b3JrIHdpdGggSU8gb2JqZWN0cy4KKyogV29ya2luZyB3aXRoIGhhbmRsZXM6OiAgICAgICAgSG93IHRvIHVzZSBoYW5kbGVzLgorKiBXb3JraW5nIHdpdGgga2V5czo6ICAgICAgICAgICBIb3cgdG8gd29yayB3aXRoIGtleXMuCisqIFVzaW5nIGNyeXB0b2dyYXBoaWMgZnVuY3Rpb25zOjogIEhvdyB0byBwZXJmb3JtIGNyeXB0b2dyYXBoaWMgb3BlcmF0aW9ucy4KKyogSGFuZGxlLWluZGVwZW5kZW50IGZ1bmN0aW9uczo6ICBHZW5lcmFsIGZ1bmN0aW9ucyBpbmRlcGVuZGVudCBvZiBoYW5kbGVzLgorQGVuZCBtZW51CisKK0Bub2RlIEF2YWlsYWJsZSBhc3ltbWV0cmljIGFsZ29yaXRobXMKK0BzdWJzZWN0aW9uIEF2YWlsYWJsZSBhc3ltbWV0cmljIGFsZ29yaXRobXMKKworTGliZ2NyeXB0IHN1cHBvcnRzIHRoZSBSU0EgKFJpdmVzdC1TaGFtaXItQWRsZW1hbikKK2FsZ29yaXRobXMgYXMgd2VsbCBhcyBEU0EgKERpZ2l0YWwgU2lnbmF0dXJlIEFsZ29yaXRobSkgYW5kIEVsZ2FtYWwuCitUaGUgdmVyc2F0aWxlIGludGVyZmFjZSBhbGxvd3MgdG8gYWRkIG1vcmUgYWxnb3JpdGhtcyBpbiB0aGUgZnV0dXJlLgorCitAZGVmdHAge0RhdGEgdHlwZX0gZ2NyeV9hY19pZF90CisKK1RoZSBmb2xsb3dpbmcgY29uc3RhbnRzIGFyZSBkZWZpbmVkIGZvciB0aGlzIHR5cGU6CisKK0B0YWJsZSBAY29kZQorQGl0ZW0gR0NSWV9BQ19SU0EKK1JpdmVzdC1TaGFtaXItQWRsZW1hbgorQGl0ZW0gR0NSWV9BQ19EU0EKK0RpZ2l0YWwgU2lnbmF0dXJlIEFsZ29yaXRobQorQGl0ZW0gR0NSWV9BQ19FTEcKK0VsZ2FtYWwKK0BpdGVtIEdDUllfQUNfRUxHX0UKK0VsZ2FtYWwsIGVuY3J5cHRpb24gb25seS4KK0BlbmQgdGFibGUKK0BlbmQgZGVmdHAKKworQG5vZGUgV29ya2luZyB3aXRoIHNldHMgb2YgZGF0YQorQHN1YnNlY3Rpb24gV29ya2luZyB3aXRoIHNldHMgb2YgZGF0YQorCitJbiB0aGUgY29udGV4dCBvZiB0aGlzIGludGVyZmFjZSB0aGUgdGVybSBgZGF0YSBzZXQnIHJlZmVycyB0byBhIGxpc3QKK29mIGBuYW1lZCBNUEkgdmFsdWVzJyB0aGF0IGlzIHVzZWQgYnkgZnVuY3Rpb25zIHBlcmZvcm1pbmcKK2NyeXB0b2dyYXBoaWMgb3BlcmF0aW9uczsgYSBuYW1lZCBNUEkgdmFsdWUgaXMgYSBhbiBNUEkgdmFsdWUsCithc3NvY2lhdGVkIHdpdGggYSBsYWJlbC4KKworU3VjaCBkYXRhIHNldHMgYXJlIHVzZWQgZm9yIHJlcHJlc2VudGluZyBrZXlzLCBzaW5jZSBrZXlzIHNpbXBseQorY29uc2lzdCBvZiBhIHZhcmlhYmxlIGFtb3VudCBvZiBudW1iZXJzLiAgRnVydGhlcm1vcmUgc29tZSBmdW5jdGlvbnMKK3JldHVybiBkYXRhIHNldHMgdG8gdGhlIGNhbGxlciB0aGF0IGFyZSB0byBiZSBwcm92aWRlZCB0byBvdGhlcgorZnVuY3Rpb25zLgorCitUaGlzIHNlY3Rpb24gZG9jdW1lbnRzIHRoZSBkYXRhIHR5cGVzLCBzeW1ib2xzIGFuZCBmdW5jdGlvbnMgdGhhdCBhcmUKK3JlbGV2YW50IGZvciB3b3JraW5nIHdpdGggZGF0YSBzZXRzLgorCitAZGVmdHAge0RhdGEgdHlwZX0gZ2NyeV9hY19kYXRhX3QKK0Egc2luZ2xlIGRhdGEgc2V0LgorQGVuZCBkZWZ0cAorCitUaGUgZm9sbG93aW5nIGZsYWdzIGFyZSBzdXBwb3J0ZWQ6CisKK0B0YWJsZSBAY29kZQorQGl0ZW0gR0NSWV9BQ19GTEFHX0RFQUxMT0MKK1VzZWQgZm9yIHN0b3JpbmcgZGF0YSBpbiBhIGRhdGEgc2V0LiAgSWYgZ2l2ZW4sIHRoZSBkYXRhIHdpbGwgYmUKK3JlbGVhc2VkIGJ5IHRoZSBsaWJyYXJ5LiAgTm90ZSB0aGF0IHdoZW5ldmVyIG9uZSBvZiB0aGUgYWMgZnVuY3Rpb25zCitpcyBhYm91dCB0byByZWxlYXNlIG9iamVjdHMgYmVjYXVzZSBvZiB0aGlzIGZsYWcsIHRoZSBvYmplY3RzIGFyZQorZXhwZWN0ZWQgdG8gYmUgc3RvcmVkIGluIG1lbW9yeSBhbGxvY2F0ZWQgdGhyb3VnaCB0aGUgTGliZ2NyeXB0IG1lbW9yeQorbWFuYWdlbWVudC4gIEluIG90aGVyIHdvcmRzOiBnY3J5X2ZyZWUoKSBpcyB1c2VkIGluc3RlYWQgb2YgZnJlZSgpLgorCitAaXRlbSBHQ1JZX0FDX0ZMQUdfQ09QWQorVXNlZCBmb3Igc3RvcmluZy9yZXRyaWV2aW5nIGRhdGEgaW4vZnJvbSBhIGRhdGEgc2V0LiAgSWYgZ2l2ZW4sIHRoZQorbGlicmFyeSB3aWxsIGNyZWF0ZSBjb3BpZXMgb2YgdGhlIHByb3ZpZGVkL2NvbnRhaW5lZCBkYXRhLCB3aGljaCB3aWxsCit0aGVuIGJlIGdpdmVuIHRvIHRoZSB1c2VyL2Fzc29jaWF0ZWQgd2l0aCB0aGUgZGF0YSBzZXQuCitAZW5kIHRhYmxlCisKK0BkZWZ0eXBlZnVuIGdjcnlfZXJyb3JfdCBnY3J5X2FjX2RhdGFfbmV3IChnY3J5X2FjX2RhdGFfdCAqQHZhcntkYXRhfSkKK0NyZWF0ZXMgYSBuZXcsIGVtcHR5IGRhdGEgc2V0IGFuZCBzdG9yZXMgaXQgaW4gQHZhcntkYXRhfS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biB2b2lkIGdjcnlfYWNfZGF0YV9kZXN0cm95IChnY3J5X2FjX2RhdGFfdCBAdmFye2RhdGF9KQorRGVzdHJveXMgdGhlIGRhdGEgc2V0IEB2YXJ7ZGF0YX0uCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gZ2NyeV9lcnJvcl90IGdjcnlfYWNfZGF0YV9zZXQgKGdjcnlfYWNfZGF0YV90IEB2YXJ7ZGF0YX0sIHVuc2lnbmVkIGludCBAdmFye2ZsYWdzfSwgY2hhciAqQHZhcntuYW1lfSwgZ2NyeV9tcGlfdCBAdmFye21waX0pCitBZGQgdGhlIHZhbHVlIEB2YXJ7bXBpfSB0byBAdmFye2RhdGF9IHdpdGggdGhlIGxhYmVsIEB2YXJ7bmFtZX0uICBJZgorQHZhcntmbGFnc30gY29udGFpbnMgR0NSWV9BQ19GTEFHX0NPUFksIHRoZSBkYXRhIHNldCB3aWxsIGNvbnRhaW4KK2NvcGllcyBvZiBAdmFye25hbWV9IGFuZCBAdmFye21waX0uICBJZiBAdmFye2ZsYWdzfSBjb250YWlucworR0NSWV9BQ19GTEFHX0RFQUxMT0Mgb3IgR0NSWV9BQ19GTEFHX0NPUFksIHRoZSB2YWx1ZXMKK2NvbnRhaW5lZCBpbiB0aGUgZGF0YSBzZXQgd2lsbCBiZSBkZWFsbG9jYXRlZCB3aGVuIHRoZXkgYXJlIHRvIGJlCityZW1vdmVkIGZyb20gdGhlIGRhdGEgc2V0LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGdjcnlfZXJyb3JfdCBnY3J5X2FjX2RhdGFfY29weSAoZ2NyeV9hY19kYXRhX3QgKkB2YXJ7ZGF0YV9jcH0sIGdjcnlfYWNfZGF0YV90IEB2YXJ7ZGF0YX0pCitDcmVhdGUgYSBjb3B5IG9mIHRoZSBkYXRhIHNldCBAdmFye2RhdGF9IGFuZCBzdG9yZSBpdCBpbgorQHZhcntkYXRhX2NwfS4gIEZJWE1FOiBleGFjdCBzZW1hbnRpY3MgdW5kZWZpbmVkLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIHt1bnNpZ25lZCBpbnR9IGdjcnlfYWNfZGF0YV9sZW5ndGggKGdjcnlfYWNfZGF0YV90IEB2YXJ7ZGF0YX0pCitSZXR1cm5zIHRoZSBudW1iZXIgb2YgbmFtZWQgTVBJIHZhbHVlcyBpbnNpZGUgb2YgdGhlIGRhdGEgc2V0CitAdmFye2RhdGF9LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGdjcnlfZXJyb3JfdCBnY3J5X2FjX2RhdGFfZ2V0X25hbWUgKGdjcnlfYWNfZGF0YV90IEB2YXJ7ZGF0YX0sIHVuc2lnbmVkIGludCBAdmFye2ZsYWdzfSwgY2hhciAqQHZhcntuYW1lfSwgZ2NyeV9tcGlfdCAqQHZhcnttcGl9KQorU3RvcmUgdGhlIHZhbHVlIGxhYmVsbGVkIHdpdGggQHZhcntuYW1lfSBmb3VuZCBpbiBAdmFye2RhdGF9IGluCitAdmFye21waX0uICBJZiBAdmFye2ZsYWdzfSBjb250YWlucyBHQ1JZX0FDX0ZMQUdfQ09QWSwgc3RvcmUgYSBjb3B5IG9mCit0aGUgQHZhcnttcGl9IHZhbHVlIGNvbnRhaW5lZCBpbiB0aGUgZGF0YSBzZXQuICBAdmFye21waX0gbWF5IGJlIE5VTEwKKyh0aGlzIG1pZ2h0IGJlIHVzZWZ1bCBmb3IgY2hlY2tpbmcgdGhlIGV4aXN0ZW5jZSBvZiBhbiBNUEkgd2l0aAorZXh0cmFjdGluZyBpdCkuCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gZ2NyeV9lcnJvcl90IGdjcnlfYWNfZGF0YV9nZXRfaW5kZXggKGdjcnlfYWNfZGF0YV90IEB2YXJ7ZGF0YX0sIHVuc2lnbmVkIGludCBmbGFncywgdW5zaWduZWQgaW50IEB2YXJ7aW5kZXh9LCBjb25zdCBjaGFyICoqQHZhcntuYW1lfSwgZ2NyeV9tcGlfdCAqQHZhcnttcGl9KQorU3RvcmVzIGluIEB2YXJ7bmFtZX0gYW5kIEB2YXJ7bXBpfSB0aGUgbmFtZWQgQHZhcnttcGl9IHZhbHVlIGNvbnRhaW5lZAoraW4gdGhlIGRhdGEgc2V0IEB2YXJ7ZGF0YX0gd2l0aCB0aGUgaW5kZXggQHZhcntpZHh9LiAgSWYgQHZhcntmbGFnc30KK2NvbnRhaW5zIEdDUllfQUNfRkxBR19DT1BZLCBzdG9yZSBjb3BpZXMgb2YgdGhlIHZhbHVlcyBjb250YWluZWQgaW4KK3RoZSBkYXRhIHNldC4gQHZhcntuYW1lfSBvciBAdmFye21waX0gbWF5IGJlIE5VTEwuCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gdm9pZCBnY3J5X2FjX2RhdGFfY2xlYXIgKGdjcnlfYWNfZGF0YV90IEB2YXJ7ZGF0YX0pCitEZXN0cm95cyBhbnkgdmFsdWVzIGNvbnRhaW5lZCBpbiB0aGUgZGF0YSBzZXQgQHZhcntkYXRhfS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBnY3J5X2Vycm9yX3QgZ2NyeV9hY19kYXRhX3RvX3NleHAgKGdjcnlfYWNfZGF0YV90IEB2YXJ7ZGF0YX0sIGdjcnlfc2V4cF90ICpAdmFye3NleHB9LCBjb25zdCBjaGFyICoqQHZhcntpZGVudGlmaWVyc30pCitUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIHRoZSBkYXRhIHNldCBAdmFye2RhdGF9IGludG8gYSBuZXdseSBjcmVhdGVkCitTLUV4cHJlc3Npb24sIHdoaWNoIGlzIHRvIGJlIHN0b3JlZCBpbiBAdmFye3NleHB9OyBAdmFye2lkZW50aWZpZXJzfQoraXMgYSBOVUxMIHRlcm1pbmF0ZWQgbGlzdCBvZiBDIHN0cmluZ3MsIHdoaWNoIHNwZWNpZmllcyB0aGUgc3RydWN0dXJlCitvZiB0aGUgUy1FeHByZXNzaW9uLgorCitFeGFtcGxlOgorCitJZiBAdmFye2lkZW50aWZpZXJzfSBpcyBhIGxpc3Qgb2YgcG9pbnRlcnMgdG8gdGhlIHN0cmluZ3MgYGBmb28nJyBhbmQKK2BgYmFyJycgYW5kIGlmIEB2YXJ7ZGF0YX0gaXMgYSBkYXRhIHNldCBjb250YWluaW5nIHRoZSB2YWx1ZXMgYGB2YWwxID0KKzB4MDEnJyBhbmQgYGB2YWwyID0gMHgwMicnLCB0aGVuIHRoZSByZXN1bHRpbmcgUy1FeHByZXNzaW9uIHdpbGwgbG9vaworbGlrZSB0aGlzOiAoZm9vIChiYXIgKCh2YWwxIDB4MDEpICh2YWwyIDB4MDIpKSkuCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gZ2NyeV9lcnJvciBnY3J5X2FjX2RhdGFfZnJvbV9zZXhwIChnY3J5X2FjX2RhdGFfdCAqQHZhcntkYXRhfSwgZ2NyeV9zZXhwX3QgQHZhcntzZXhwfSwgY29uc3QgY2hhciAqKkB2YXJ7aWRlbnRpZmllcnN9KQorVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgUy1FeHByZXNzaW9uIEB2YXJ7c2V4cH0gaW50byBhIG5ld2x5CitjcmVhdGVkIGRhdGEgc2V0LCB3aGljaCBpcyB0byBiZSBzdG9yZWQgaW4gQHZhcntkYXRhfTsKK0B2YXJ7aWRlbnRpZmllcnN9IGlzIGEgTlVMTCB0ZXJtaW5hdGVkIGxpc3Qgb2YgQyBzdHJpbmdzLCB3aGljaAorc3BlY2lmaWVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIFMtRXhwcmVzc2lvbi4gIElmIHRoZSBsaXN0IG9mCitpZGVudGlmaWVycyBkb2VzIG5vdCBtYXRjaCB0aGUgc3RydWN0dXJlIG9mIHRoZSBTLUV4cHJlc3Npb24sIHRoZQorZnVuY3Rpb24gZmFpbHMuCitAZW5kIGRlZnR5cGVmdW4KKworQG5vZGUgV29ya2luZyB3aXRoIElPIG9iamVjdHMKK0BzdWJzZWN0aW9uIFdvcmtpbmcgd2l0aCBJTyBvYmplY3RzCisKK05vdGU6IElPIG9iamVjdHMgYXJlIGN1cnJlbnRseSBvbmx5IHVzZWQgaW4gdGhlIGNvbnRleHQgb2YgbWVzc2FnZQorZW5jb2RpbmcvZGVjb2RpbmcgYW5kIGVuY3J5cHRpb24vc2lnbmF0dXJlIHNjaGVtZXMuCisKK0BkZWZ0cCB7RGF0YSB0eXBlfSB7Z2NyeV9hY19pb190fQorQGNvZGV7Z2NyeV9hY19pb190fSBpcyB0aGUgdHlwZSB0byBiZSB1c2VkIGZvciBJTyBvYmplY3RzLgorQGVuZCBkZWZ0cAorCitJTyBvYmplY3RzIHByb3ZpZGUgYW4gdW5pZm9ybSBJTyBsYXllciBvbiB0b3Agb2YgZGlmZmVyZW50IHVuZGVybHlpbmcKK0lPIG1lY2hhbmlzbXM7IGVpdGhlciB0aGV5IGNhbiBiZSB1c2VkIGZvciBwcm92aWRpbmcgZGF0YSB0byB0aGUKK2xpYnJhcnkgKG1vZGUgaXMgR0NSWV9BQ19JT19SRUFEQUJMRSkgb3IgdGhleSBjYW4gYmUgdXNlZCBmb3IKK3JldHJpZXZpbmcgZGF0YSBmcm9tIHRoZSBsaWJyYXJ5IChtb2RlIGlzIEdDUllfQUNfSU9fV1JJVEFCTEUpLgorCitJTyBvYmplY3QgbmVlZCB0byBiZSBpbml0aWFsaXplZCBieSBjYWxsaW5nIG9uIG9mIHRoZSBmb2xsb3dpbmcKK2Z1bmN0aW9uczoKKworQGRlZnR5cGVmdW4gdm9pZCBnY3J5X2FjX2lvX2luaXQgKGdjcnlfYWNfaW9fdCAqQHZhcnthY19pb30sIGdjcnlfYWNfaW9fbW9kZV90IEB2YXJ7bW9kZX0sIGdjcnlfYWNfaW9fdHlwZV90IEB2YXJ7dHlwZX0sIC4uLik7CitJbml0aWFsaXplIEB2YXJ7YWNfaW99IGFjY29yZGluZyB0byBAdmFye21vZGV9LCBAdmFye3R5cGV9IGFuZCB0aGUKK3ZhcmlhYmxlIGxpc3Qgb2YgYXJndW1lbnRzLiAgVGhlIGxpc3Qgb2YgdmFyaWFibGUgYXJndW1lbnRzIHRvIHNwZWNpZnkKK2RlcGVuZHMgb24gdGhlIGdpdmVuIEB2YXJ7dHlwZX0uCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gdm9pZCBnY3J5X2FjX2lvX2luaXRfdmEgKGdjcnlfYWNfaW9fdCAqQHZhcnthY19pb30sIGdjcnlfYWNfaW9fbW9kZV90IEB2YXJ7bW9kZX0sIGdjcnlfYWNfaW9fdHlwZV90IEB2YXJ7dHlwZX0sIHZhX2xpc3QgQHZhcnthcH0pOworSW5pdGlhbGl6ZSBAdmFye2FjX2lvfSBhY2NvcmRpbmcgdG8gQHZhcnttb2RlfSwgQHZhcnt0eXBlfSBhbmQgdGhlCit2YXJpYWJsZSBsaXN0IG9mIGFyZ3VtZW50cyBAdmFye2FwfS4gIFRoZSBsaXN0IG9mIHZhcmlhYmxlIGFyZ3VtZW50cwordG8gc3BlY2lmeSBkZXBlbmRzIG9uIHRoZSBnaXZlbiBAdmFye3R5cGV9LgorQGVuZCBkZWZ0eXBlZnVuCisKK1RoZSBmb2xsb3dpbmcgdHlwZXMgb2YgSU8gb2JqZWN0cyBleGlzdDoKKworQHRhYmxlIEBjb2RlCitAaXRlbSBHQ1JZX0FDX0lPX1NUUklORworSW4gY2FzZSBvZiBHQ1JZX0FDX0lPX1JFQURBQkxFIHRoZSBJTyBvYmplY3Qgd2lsbCBwcm92aWRlIGRhdGEgZnJvbSBhCittZW1vcnkgc3RyaW5nLiAgQXJndW1lbnRzIHRvIHNwZWNpZnkgYXQgaW5pdGlhbGl6YXRpb24gdGltZToKK0B0YWJsZSBAY29kZQorQGl0ZW0gdW5zaWduZWQgY2hhciAqCitQb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1lbW9yeSBzdHJpbmcKK0BpdGVtIHNpemVfdAorU2l6ZSBvZiB0aGUgbWVtb3J5IHN0cmluZworQGVuZCB0YWJsZQorSW4gY2FzZSBvZiBHQ1JZX0FDX0lPX1dSSVRBQkxFIHRoZSBvYmplY3Qgd2lsbCBzdG9yZSByZXRyaWV2ZWQgZGF0YSBpbgorYSBuZXdseSBhbGxvY2F0ZWQgbWVtb3J5IHN0cmluZy4gIEFyZ3VtZW50cyB0byBzcGVjaWZ5IGF0Citpbml0aWFsaXphdGlvbiB0aW1lOgorQHRhYmxlIEBjb2RlCitAaXRlbSB1bnNpZ25lZCBjaGFyICoqCitQb2ludGVyIHRvIGFkZHJlc3MsIGF0IHdoaWNoIHRoZSBwb2ludGVyIHRvIHRoZSBuZXdseSBjcmVhdGVkIG1lbW9yeQorc3RyaW5nIGlzIHRvIGJlIHN0b3JlZAorQGl0ZW0gc2l6ZV90ICoKK1BvaW50ZXIgdG8gYWRkcmVzcywgYXQgd2hpY2ggdGhlIHNpemUgb2YgdGhlIG5ld2x5IGNyZWF0ZWQgbWVtb3J5CitzdHJpbmcgaXMgdG8gYmUgc3RvcmVkCitAZW5kIHRhYmxlCisKK0BpdGVtIEdDUllfQUNfSU9fQ0FMTEJBQ0sKK0luIGNhc2Ugb2YgR0NSWV9BQ19JT19SRUFEQUJMRSB0aGUgb2JqZWN0IHdpbGwgZm9yd2FyZCByZWFkIHJlcXVlc3RzCit0byBhIHByb3ZpZGVkIGNhbGxiYWNrIGZ1bmN0aW9uLiAgQXJndW1lbnRzIHRvIHNwZWNpZnkgYXQKK2luaXRpYWxpemF0aW9uIHRpbWU6CitAdGFibGUgQGNvZGUKK0BpdGVtIGdjcnlfYWNfZGF0YV9yZWFkX2NiX3QKK0NhbGxiYWNrIGZ1bmN0aW9uIHRvIHVzZQorQGl0ZW0gdm9pZCAqCitPcGFxdWUgYXJndW1lbnQgdG8gcHJvdmlkZSB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24KK0BlbmQgdGFibGUKK0luIGNhc2Ugb2YgR0NSWV9BQ19JT19XUklUQUJMRSB0aGUgb2JqZWN0IHdpbGwgZm9yd2FyZCB3cml0ZSByZXF1ZXN0cwordG8gYSBwcm92aWRlZCBjYWxsYmFjayBmdW5jdGlvbi4gIEFyZ3VtZW50cyB0byBzcGVjaWZ5IGF0Citpbml0aWFsaXphdGlvbiB0aW1lOgorQHRhYmxlIEBjb2RlCitAaXRlbSBnY3J5X2FjX2RhdGFfd3JpdGVfY2JfdAorQ2FsbGJhY2sgZnVuY3Rpb24gdG8gdXNlCitAaXRlbSB2b2lkICoKK09wYXF1ZSBhcmd1bWVudCB0byBwcm92aWRlIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbgorQGVuZCB0YWJsZQorQGVuZCB0YWJsZQorCitAbm9kZSBXb3JraW5nIHdpdGggaGFuZGxlcworQHN1YnNlY3Rpb24gV29ya2luZyB3aXRoIGhhbmRsZXMKKworSW4gb3JkZXIgdG8gdXNlIGFuIGFsZ29yaXRobSwgYW4gYWNjb3JkaW5nIGhhbmRsZSBtdXN0IGJlIGNyZWF0ZWQuCitUaGlzIGlzIGRvbmUgdXNpbmcgdGhlIGZvbGxvd2luZyBmdW5jdGlvbjoKKworQGRlZnR5cGVmdW4gZ2NyeV9lcnJvcl90IGdjcnlfYWNfb3BlbiAoZ2NyeV9hY19oYW5kbGVfdCAqQHZhcntoYW5kbGV9LCBpbnQgQHZhcnthbGdvcml0aG19LCBpbnQgQHZhcntmbGFnc30pCisKK0NyZWF0ZXMgYSBuZXcgaGFuZGxlIGZvciB0aGUgYWxnb3JpdGhtIEB2YXJ7YWxnb3JpdGhtfSBhbmQgc3RvcmVzIGl0CitpbiBAdmFye2hhbmRsZX0uICBAdmFye2ZsYWdzfSBpcyBub3QgdXNlZCBjdXJyZW50bHkuCisKK0B2YXJ7YWxnb3JpdGhtfSBtdXN0IGJlIGEgdmFsaWQgYWxnb3JpdGhtIElELCBzZWUgQHhyZWZ7QXZhaWxhYmxlCithc3ltbWV0cmljIGFsZ29yaXRobXN9LCBmb3IgYSBsaXN0IG9mIHN1cHBvcnRlZCBhbGdvcml0aG1zIGFuZCB0aGUKK2FjY29yZGluZyBjb25zdGFudHMuICBCZXNpZGVzIHVzaW5nIHRoZSBsaXN0ZWQgY29uc3RhbnRzIGRpcmVjdGx5LCB0aGUKK2Z1bmN0aW9ucyBAY29kZXtnY3J5X3BrX25hbWVfdG9faWR9IG1heSBiZSB1c2VkIHRvIGNvbnZlcnQgdGhlIHRleHR1YWwKK25hbWUgb2YgYW4gYWxnb3JpdGhtIGludG8gdGhlIGFjY29yZGluZyBudW1lcmljIElELgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIHZvaWQgZ2NyeV9hY19jbG9zZSAoZ2NyeV9hY19oYW5kbGVfdCBAdmFye2hhbmRsZX0pCitEZXN0cm95cyB0aGUgaGFuZGxlIEB2YXJ7aGFuZGxlfS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAbm9kZSBXb3JraW5nIHdpdGgga2V5cworQHN1YnNlY3Rpb24gV29ya2luZyB3aXRoIGtleXMKKworQGRlZnRwIHtEYXRhIHR5cGV9IGdjcnlfYWNfa2V5X3R5cGVfdAorRGVmaW5lZCBjb25zdGFudHM6CisKK0B0YWJsZSBAY29kZQorQGl0ZW0gR0NSWV9BQ19LRVlfU0VDUkVUCitTcGVjaWZpZXMgYSBzZWNyZXQga2V5LgorQGl0ZW0gR0NSWV9BQ19LRVlfUFVCTElDCitTcGVjaWZpZXMgYSBwdWJsaWMga2V5LgorQGVuZCB0YWJsZQorQGVuZCBkZWZ0cAorCitAZGVmdHAge0RhdGEgdHlwZX0gZ2NyeV9hY19rZXlfdAorVGhpcyB0eXBlIHJlcHJlc2VudHMgYSBzaW5nbGUgYGtleScsIGVpdGhlciBhIHNlY3JldCBvbmUgb3IgYSBwdWJsaWMKK29uZS4KK0BlbmQgZGVmdHAKKworQGRlZnRwIHtEYXRhIHR5cGV9IGdjcnlfYWNfa2V5X3BhaXJfdAorVGhpcyB0eXBlIHJlcHJlc2VudHMgYSBga2V5IHBhaXInIGNvbnRhaW5pbmcgYSBzZWNyZXQgYW5kIGEgcHVibGljIGtleS4KK0BlbmQgZGVmdHAKKworS2V5IGRhdGEgc3RydWN0dXJlcyBjYW4gYmUgY3JlYXRlZCBpbiB0d28gZGlmZmVyZW50IHdheXM7IGEgbmV3IGtleQorcGFpciBjYW4gYmUgZ2VuZXJhdGVkLCByZXN1bHRpbmcgaW4gcmVhZHktdG8tdXNlIGtleS4gIEFsdGVybmF0aXZlbHkgYQora2V5IGNhbiBiZSBpbml0aWFsaXplZCBmcm9tIGEgZ2l2ZW4gZGF0YSBzZXQuCisKK0BkZWZ0eXBlZnVuIGdjcnlfZXJyb3JfdCBnY3J5X2FjX2tleV9pbml0IChnY3J5X2FjX2tleV90ICpAdmFye2tleX0sIGdjcnlfYWNfaGFuZGxlX3QgQHZhcntoYW5kbGV9LCBnY3J5X2FjX2tleV90eXBlX3QgQHZhcnt0eXBlfSwgZ2NyeV9hY19kYXRhX3QgQHZhcntkYXRhfSkKK0NyZWF0ZXMgYSBuZXcga2V5IG9mIHR5cGUgQHZhcnt0eXBlfSwgY29uc2lzdGluZyBvZiB0aGUgTVBJIHZhbHVlcworY29udGFpbmVkIGluIHRoZSBkYXRhIHNldCBAdmFye2RhdGF9IGFuZCBzdG9yZXMgaXQgaW4gQHZhcntrZXl9LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGdjcnlfZXJyb3JfdCBnY3J5X2FjX2tleV9wYWlyX2dlbmVyYXRlIChnY3J5X2FjX2hhbmRsZV90IEB2YXJ7aGFuZGxlfSwgdW5zaWduZWQgaW50IEB2YXJ7bmJpdHN9LCB2b2lkICpAdmFye2tleV9zcGVjfSwgZ2NyeV9hY19rZXlfcGFpcl90ICpAdmFye2tleV9wYWlyfSwgZ2NyeV9tcGlfdCAqKkB2YXJ7bWlzY19kYXRhfSkKKworR2VuZXJhdGVzIGEgbmV3IGtleSBwYWlyIHZpYSB0aGUgaGFuZGxlIEB2YXJ7aGFuZGxlfSBvZiBAdmFye05CSVRTfQorYml0cyBhbmQgc3RvcmVzIGl0IGluIEB2YXJ7a2V5X3BhaXJ9LgorCitJbiBjYXNlIG5vbi1zdGFuZGFyZCBzZXR0aW5ncyBhcmUgd2FudGVkLCBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUgb2YKK3R5cGUgQGNvZGV7Z2NyeV9hY19rZXlfc3BlY188YWxnb3JpdGhtPl90fSwgbWF0Y2hpbmcgdGhlIHNlbGVjdGVkCithbGdvcml0aG0sIGNhbiBiZSBnaXZlbiBhcyBAdmFye2tleV9zcGVjfS4gIEB2YXJ7bWlzY19kYXRhfSBpcyBub3QKK3VzZWQgeWV0LiAgU3VjaCBhIHN0cnVjdHVyZSBkb2VzIG9ubHkgZXhpc3QgZm9yIFJTQS4gIEEgZGVzY3JpcHRpb24KK29mIHRoZSBtZW1iZXJzIG9mIHRoZSBzdXBwb3J0ZWQgc3RydWN0dXJlcyBmb2xsb3dzLgorCitAdGFibGUgQGNvZGUKK0BpdGVtIGdjcnlfYWNfa2V5X3NwZWNfcnNhX3QKK0B0YWJsZSBAY29kZQorQGl0ZW0gZ2NyeV9tcGlfdCBlCitHZW5lcmF0ZSB0aGUga2V5IHBhaXIgdXNpbmcgYSBzcGVjaWFsIEBjb2Rle2V9LiAgVGhlIHZhbHVlIG9mIEBjb2Rle2V9CitoYXMgdGhlIGZvbGxvd2luZyBtZWFuaW5nczoKK0B0YWJsZSBAY29kZQorQGl0ZW0gPSAwCitMZXQgTGliZ2NyeXB0IGRlY2lkZSB3aGF0IGV4cG9uZW50IHNob3VsZCBiZSB1c2VkLgorQGl0ZW0gPSAxCitSZXF1ZXN0IHRoZSB1c2Ugb2YgYSBgYHNlY3VyZScnIGV4cG9uZW50OyB0aGlzIGlzIHJlcXVpcmVkIGJ5IHNvbWUKK3NwZWNpZmljYXRpb24gdG8gYmUgNjU1MzcuCitAaXRlbSA+IDIKK1RyeSBzdGFydGluZyBhdCB0aGlzIHZhbHVlIHVudGlsIGEgd29ya2luZyBleHBvbmVudCBpcyBmb3VuZC4gIE5vdGUKK3RoYXQgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gbGVha3Mgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUKK3ByaXZhdGUga2V5IGJlY2F1c2UgdGhlIGluY3JlbWVudGF0aW9uIHVzZWQgaXMgbm90IHJhbmRvbWl6ZWQuICBUaHVzLAordGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNoYW5nZWQgaW4gdGhlIGZ1dHVyZSB0byByZXR1cm4gYSByYW5kb20KK2V4cG9uZW50IG9mIHRoZSBnaXZlbiBzaXplLgorQGVuZCB0YWJsZQorQGVuZCB0YWJsZQorQGVuZCB0YWJsZQorCitFeGFtcGxlIGNvZGU6CitAZXhhbXBsZQorQHsKKyAgZ2NyeV9hY19rZXlfcGFpcl90IGtleV9wYWlyOworICBnY3J5X2FjX2tleV9zcGVjX3JzYV90IHJzYV9zcGVjOworCisgIHJzYV9zcGVjLmUgPSBnY3J5X21waV9uZXcgKDApOworICBnY3J5X21waV9zZXRfdWkgKHJzYV9zcGVjLmUsIDEpOworCisgIGVyciA9IGdjcnlfYWNfb3BlbiAgKCZoYW5kbGUsIEdDUllfQUNfUlNBLCAwKTsKKyAgYXNzZXJ0ICghIGVycik7CisKKyAgZXJyID0gZ2NyeV9hY19rZXlfcGFpcl9nZW5lcmF0ZSAoaGFuZGxlLCAxMDI0LCAmcnNhX3NwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlfcGFpciwgTlVMTCk7CisgIGFzc2VydCAoISBlcnIpOworQH0KK0BlbmQgZXhhbXBsZQorQGVuZCBkZWZ0eXBlZnVuCisKKworQGRlZnR5cGVmdW4gZ2NyeV9hY19rZXlfdCBnY3J5X2FjX2tleV9wYWlyX2V4dHJhY3QgKGdjcnlfYWNfa2V5X3BhaXJfdCBAdmFye2tleV9wYWlyfSwgZ2NyeV9hY19rZXlfdHlwZV90IEB2YXJ7d2hpY2h9KQorUmV0dXJucyB0aGUga2V5IG9mIHR5cGUgQHZhcnt3aGljaH0gb3V0IG9mIHRoZSBrZXkgcGFpcgorQHZhcntrZXlfcGFpcn0uCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gdm9pZCBnY3J5X2FjX2tleV9kZXN0cm95IChnY3J5X2FjX2tleV90IEB2YXJ7a2V5fSkKK0Rlc3Ryb3lzIHRoZSBrZXkgQHZhcntrZXl9LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIHZvaWQgZ2NyeV9hY19rZXlfcGFpcl9kZXN0cm95IChnY3J5X2FjX2tleV9wYWlyX3QgQHZhcntrZXlfcGFpcn0pCitEZXN0cm95cyB0aGUga2V5IHBhaXIgQHZhcntrZXlfcGFpcn0uCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gZ2NyeV9hY19kYXRhX3QgZ2NyeV9hY19rZXlfZGF0YV9nZXQgKGdjcnlfYWNfa2V5X3QgQHZhcntrZXl9KQorUmV0dXJucyB0aGUgZGF0YSBzZXQgY29udGFpbmVkIGluIHRoZSBrZXkgQHZhcntrZXl9LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGdjcnlfZXJyb3JfdCBnY3J5X2FjX2tleV90ZXN0IChnY3J5X2FjX2hhbmRsZV90IEB2YXJ7aGFuZGxlfSwgZ2NyeV9hY19rZXlfdCBAdmFye2tleX0pCitWZXJpZmllcyB0aGF0IHRoZSBwcml2YXRlIGtleSBAdmFye2tleX0gaXMgc2FuZSB2aWEgQHZhcntoYW5kbGV9LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGdjcnlfZXJyb3JfdCBnY3J5X2FjX2tleV9nZXRfbmJpdHMgKGdjcnlfYWNfaGFuZGxlX3QgQHZhcntoYW5kbGV9LCBnY3J5X2FjX2tleV90IEB2YXJ7a2V5fSwgdW5zaWduZWQgaW50ICpAdmFye25iaXRzfSkKK1N0b3JlcyB0aGUgbnVtYmVyIG9mIGJpdHMgb2YgdGhlIGtleSBAdmFye2tleX0gaW4gQHZhcntuYml0c30gdmlhIEB2YXJ7aGFuZGxlfS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBnY3J5X2Vycm9yX3QgZ2NyeV9hY19rZXlfZ2V0X2dyaXAgKGdjcnlfYWNfaGFuZGxlX3QgQHZhcntoYW5kbGV9LCBnY3J5X2FjX2tleV90IEB2YXJ7a2V5fSwgdW5zaWduZWQgY2hhciAqQHZhcntrZXlfZ3JpcH0pCitXcml0ZXMgdGhlIDIwIGJ5dGUgbG9uZyBrZXkgZ3JpcCBvZiB0aGUga2V5IEB2YXJ7a2V5fSB0bworQHZhcntrZXlfZ3JpcH0gdmlhIEB2YXJ7aGFuZGxlfS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAbm9kZSBVc2luZyBjcnlwdG9ncmFwaGljIGZ1bmN0aW9ucworQHN1YnNlY3Rpb24gVXNpbmcgY3J5cHRvZ3JhcGhpYyBmdW5jdGlvbnMKKworVGhlIGZvbGxvd2luZyBmbGFncyBtaWdodCBiZSByZWxldmFudDoKKworQHRhYmxlIEBjb2RlCitAaXRlbSBHQ1JZX0FDX0ZMQUdfTk9fQkxJTkRJTkcKK0Rpc2FibGUgYW55IGJsaW5kaW5nLCB3aGljaCBtaWdodCBiZSBzdXBwb3J0ZWQgYnkgdGhlIGNob3NlbgorYWxnb3JpdGhtOyBibGluZGluZyBpcyB0aGUgZGVmYXVsdC4KK0BlbmQgdGFibGUKKworVGhlcmUgZXhpc3QgdHdvIGtpbmRzIG9mIGNyeXB0b2dyYXBoaWMgZnVuY3Rpb25zIGF2YWlsYWJsZSB0aHJvdWdoIHRoZQorYWMgaW50ZXJmYWNlOiBwcmltaXRpdmVzLCBhbmQgaGlnaC1sZXZlbCBmdW5jdGlvbnMuCisKK1ByaW1pdGl2ZXMgZGVhbCB3aXRoIE1QSXMgKGRhdGEgc2V0cykgZGlyZWN0bHk7IHdoYXQgdGhleSBwcm92aWRlIGlzCitkaXJlY3QgYWNjZXNzIHRvIHRoZSBjcnlwdG9ncmFwaGljIG9wZXJhdGlvbnMgcHJvdmlkZWQgYnkgYW4gYWxnb3JpdGhtCitpbXBsZW1lbnRhdGlvbi4KKworSGlnaC1sZXZlbCBmdW5jdGlvbnMgZGVhbCB3aXRoIG9jdGV0IHN0cmluZ3MsIGFjY29yZGluZyB0byBhIHNwZWNpZmllZAorYGBzY2hlbWUnJy4gIFNjaGVtZXMgbWFrZSB1c2Ugb2YgYGBlbmNvZGluZyBtZXRob2RzJycsIHdoaWNoIGFyZQorcmVzcG9uc2libGUgZm9yIGNvbnZlcnRpbmcgdGhlIHByb3ZpZGVkIG9jdGV0IHN0cmluZ3MgaW50byBNUElzLCB3aGljaAorYXJlIHRoZW4gZm9yd2FyZWQgdG8gdGhlIGNyeXB0b2dyYXBoaWMgcHJpbWl0aXZlcy4gIFNpbmNlIHNjaGVtZXMgYXJlCit0byBiZSB1c2VkIGZvciBhIHNwZWNpYWwgcHVycG9zZSBpbiBvcmRlciB0byBhY2hpZXZlIGEgcGFydGljdWxhcgorc2VjdXJpdHkgZ29hbCwgdGhlcmUgZXhpc3QgYGBlbmNyeXB0aW9uIHNjaGVtZXMnJyBhbmQgYGBzaWduYXR1cmUKK3NjaGVtZXMnJy4gIEVuY29kaW5nIG1ldGhvZHMgY2FuIGJlIHVzZWQgc2VwZXJhdGVseSBvciBpbXBsaWNpdGx5Cit0aHJvdWdoIHNjaGVtZXMuCisKK1doYXQgZm9sbG93cyBpcyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjcnlwdG9ncmFwaGljIHByaW1pdGl2ZXMuCisKK0BkZWZ0eXBlZnVuIGdjcnlfZXJyb3JfdCBnY3J5X2FjX2RhdGFfZW5jcnlwdCAoZ2NyeV9hY19oYW5kbGVfdCBAdmFye2hhbmRsZX0sIHVuc2lnbmVkIGludCBAdmFye2ZsYWdzfSwgZ2NyeV9hY19rZXlfdCBAdmFye2tleX0sIGdjcnlfbXBpX3QgQHZhcntkYXRhX3BsYWlufSwgZ2NyeV9hY19kYXRhX3QgKkB2YXJ7ZGF0YV9lbmNyeXB0ZWR9KQorRW5jcnlwdHMgdGhlIHBsYWluIHRleHQgTVBJIHZhbHVlIEB2YXJ7ZGF0YV9wbGFpbn0gd2l0aCB0aGUga2V5IHB1YmxpYworQHZhcntrZXl9IHVuZGVyIHRoZSBjb250cm9sIG9mIHRoZSBmbGFncyBAdmFye2ZsYWdzfSBhbmQgc3RvcmVzIHRoZQorcmVzdWx0aW5nIGRhdGEgc2V0IGludG8gQHZhcntkYXRhX2VuY3J5cHRlZH0uCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gZ2NyeV9lcnJvcl90IGdjcnlfYWNfZGF0YV9kZWNyeXB0IChnY3J5X2FjX2hhbmRsZV90IEB2YXJ7aGFuZGxlfSwgdW5zaWduZWQgaW50IEB2YXJ7ZmxhZ3N9LCBnY3J5X2FjX2tleV90IEB2YXJ7a2V5fSwgZ2NyeV9tcGlfdCAqQHZhcntkYXRhX3BsYWlufSwgZ2NyeV9hY19kYXRhX3QgQHZhcntkYXRhX2VuY3J5cHRlZH0pCitEZWNyeXB0cyB0aGUgZW5jcnlwdGVkIGRhdGEgY29udGFpbmVkIGluIHRoZSBkYXRhIHNldAorQHZhcntkYXRhX2VuY3J5cHRlZH0gd2l0aCB0aGUgc2VjcmV0IGtleSBLRVkgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlCitmbGFncyBAdmFye2ZsYWdzfSBhbmQgc3RvcmVzIHRoZSByZXN1bHRpbmcgcGxhaW4gdGV4dCBNUEkgdmFsdWUgaW4KK0B2YXJ7REFUQV9QTEFJTn0uCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gZ2NyeV9lcnJvcl90IGdjcnlfYWNfZGF0YV9zaWduIChnY3J5X2FjX2hhbmRsZV90IEB2YXJ7aGFuZGxlfSwgZ2NyeV9hY19rZXlfdCBAdmFye2tleX0sIGdjcnlfbXBpX3QgQHZhcntkYXRhfSwgZ2NyeV9hY19kYXRhX3QgKkB2YXJ7ZGF0YV9zaWduYXR1cmV9KQorU2lnbnMgdGhlIGRhdGEgY29udGFpbmVkIGluIEB2YXJ7ZGF0YX0gd2l0aCB0aGUgc2VjcmV0IGtleSBAdmFye2tleX0KK2FuZCBzdG9yZXMgdGhlIHJlc3VsdGluZyBzaWduYXR1cmUgaW4gdGhlIGRhdGEgc2V0CitAdmFye2RhdGFfc2lnbmF0dXJlfS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBnY3J5X2Vycm9yX3QgZ2NyeV9hY19kYXRhX3ZlcmlmeSAoZ2NyeV9hY19oYW5kbGVfdCBAdmFye2hhbmRsZX0sIGdjcnlfYWNfa2V5X3QgQHZhcntrZXl9LCBnY3J5X21waV90IEB2YXJ7ZGF0YX0sIGdjcnlfYWNfZGF0YV90IEB2YXJ7ZGF0YV9zaWduYXR1cmV9KQorVmVyaWZpZXMgdGhhdCB0aGUgc2lnbmF0dXJlIGNvbnRhaW5lZCBpbiB0aGUgZGF0YSBzZXQKK0B2YXJ7ZGF0YV9zaWduYXR1cmV9IGlzIGluZGVlZCB0aGUgcmVzdWx0IG9mIHNpZ25pbmcgdGhlIGRhdGEKK2NvbnRhaW5lZCBpbiBAdmFye2RhdGF9IHdpdGggdGhlIHNlY3JldCBrZXkgYmVsb25naW5nIHRvIHRoZSBwdWJsaWMKK2tleSBAdmFye2tleX0uCitAZW5kIGRlZnR5cGVmdW4KKworV2hhdCBmb2xsb3dzIGlzIGEgZGVzY3JpcHRpb24gb2YgdGhlIGhpZ2gtbGV2ZWwgZnVuY3Rpb25zLgorCitUaGUgdHlwZSBgYGdjcnlfYWNfZW1fdCcnIGlzIHVzZWQgZm9yIHNwZWNpZnlpbmcgZW5jb2RpbmcgbWV0aG9kczsgdGhlCitmb2xsb3dpbmcgbWV0aG9kcyBhcmUgc3VwcG9ydGVkOgorCitAdGFibGUgQGNvZGUKK0BpdGVtIEdDUllfQUNfRU1FX1BLQ1NfVjFfNQorUEtDUy1WMV81IEVuY29kaW5nIE1ldGhvZCBmb3IgRW5jcnlwdGlvbi4gIE9wdGlvbnMgbXVzdCBiZSBwcm92aWRlZAordGhyb3VnaCBhIHBvaW50ZXIgdG8gYSBjb3JyZWN0bHkgaW5pdGlhbGl6ZWQgb2JqZWN0IG9mIHR5cGUKK2djcnlfYWNfZW1lX3BrY3NfdjFfNV90LgorCitAaXRlbSBHQ1JZX0FDX0VNU0FfUEtDU19WMV81CitQS0NTLVYxXzUgRW5jb2RpbmcgTWV0aG9kIGZvciBTaWduYXR1cmVzIHdpdGggQXBwZW5kaXguICBPcHRpb25zIG11c3QKK2JlIHByb3ZpZGVkIHRocm91Z2ggYSBwb2ludGVyIHRvIGEgY29ycmVjdGx5IGluaXRpYWxpemVkIG9iamVjdCBvZgordHlwZSBnY3J5X2FjX2Vtc2FfcGtjc192MV81X3QuCitAZW5kIHRhYmxlCisKK09wdGlvbiBzdHJ1Y3R1cmUgdHlwZXM6CisKK0B0YWJsZSBAY29kZQorQGl0ZW0gZ2NyeV9hY19lbWVfcGtjc192MV81X3QKK0B0YWJsZSBAY29kZQorQGl0ZW0gZ2NyeV9hY19rZXlfdCBrZXkKK0BpdGVtIGdjcnlfYWNfaGFuZGxlX3QgaGFuZGxlCitAZW5kIHRhYmxlCitAaXRlbSBnY3J5X2FjX2Vtc2FfcGtjc192MV81X3QKK0B0YWJsZSBAY29kZQorQGl0ZW0gZ2NyeV9tZF9hbGdvX3QgbWQKK0BpdGVtIHNpemVfdCBlbV9uCitAZW5kIHRhYmxlCitAZW5kIHRhYmxlCisKK0VuY29kaW5nIG1ldGhvZHMgY2FuIGJlIHVzZWQgZGlyZWN0bHkgdGhyb3VnaCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKKworQGRlZnR5cGVmdW4gZ2NyeV9lcnJvcl90IGdjcnlfYWNfZGF0YV9lbmNvZGUgKGdjcnlfYWNfZW1fdCBAdmFye21ldGhvZH0sIHVuc2lnbmVkIGludCBAdmFye2ZsYWdzfSwgdm9pZCAqQHZhcntvcHRpb25zfSwgdW5zaWduZWQgY2hhciAqQHZhcnttfSwgc2l6ZV90IEB2YXJ7bV9ufSwgdW5zaWduZWQgY2hhciAqKkB2YXJ7ZW19LCBzaXplX3QgKkB2YXJ7ZW1fbn0pCitFbmNvZGVzIHRoZSBtZXNzYWdlIGNvbnRhaW5lZCBpbiBAdmFye219IG9mIHNpemUgQHZhcnttX259IGFjY29yZGluZwordG8gQHZhcnttZXRob2R9LCBAdmFye2ZsYWdzfSBhbmQgQHZhcntvcHRpb25zfS4gIFRoZSBuZXdseSBjcmVhdGVkCitlbmNvZGVkIG1lc3NhZ2UgaXMgc3RvcmVkIGluIEB2YXJ7ZW19IGFuZCBAdmFye2VtX259LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGdjcnlfZXJyb3JfdCBnY3J5X2FjX2RhdGFfZGVjb2RlIChnY3J5X2FjX2VtX3QgQHZhcnttZXRob2R9LCB1bnNpZ25lZCBpbnQgQHZhcntmbGFnc30sIHZvaWQgKkB2YXJ7b3B0aW9uc30sIHVuc2lnbmVkIGNoYXIgKkB2YXJ7ZW19LCBzaXplX3QgQHZhcntlbV9ufSwgdW5zaWduZWQgY2hhciAqKkB2YXJ7bX0sIHNpemVfdCAqQHZhcnttX259KQorRGVjb2RlcyB0aGUgbWVzc2FnZSBjb250YWluZWQgaW4gQHZhcntlbX0gb2Ygc2l6ZSBAdmFye2VtX259IGFjY29yZGluZwordG8gQHZhcnttZXRob2R9LCBAdmFye2ZsYWdzfSBhbmQgQHZhcntvcHRpb25zfS4gIFRoZSBuZXdseSBjcmVhdGVkCitkZWNvZGVkIG1lc3NhZ2UgaXMgc3RvcmVkIGluIEB2YXJ7bX0gYW5kIEB2YXJ7bV9ufS4KK0BlbmQgZGVmdHlwZWZ1bgorCitUaGUgdHlwZSBgYGdjcnlfYWNfc2NoZW1lX3QnJyBpcyB1c2VkIGZvciBzcGVjaWZ5aW5nIHNjaGVtZXM7IHRoZQorZm9sbG93aW5nIHNjaGVtZXMgYXJlIHN1cHBvcnRlZDoKKworQHRhYmxlIEBjb2RlCitAaXRlbSBHQ1JZX0FDX0VTX1BLQ1NfVjFfNQorUEtDUy1WMV81IEVuY3J5cHRpb24gU2NoZW1lLiAgTm8gb3B0aW9ucyBjYW4gYmUgcHJvdmlkZWQuCitAaXRlbSBHQ1JZX0FDX1NTQV9QS0NTX1YxXzUKK1BLQ1MtVjFfNSBTaWduYXR1cmUgU2NoZW1lICh3aXRoIEFwcGVuZGl4KS4gIE9wdGlvbnMgY2FuIGJlIHByb3ZpZGVkCit0aHJvdWdoIGEgcG9pbnRlciB0byBhIGNvcnJlY3RseSBpbml0aWFsaXplZCBvYmplY3Qgb2YgdHlwZQorZ2NyeV9hY19zc2FfcGtjc192MV81X3QuCitAZW5kIHRhYmxlCisKK09wdGlvbiBzdHJ1Y3R1cmUgdHlwZXM6CisKK0B0YWJsZSBAY29kZQorQGl0ZW0gZ2NyeV9hY19zc2FfcGtjc192MV81X3QKK0B0YWJsZSBAY29kZQorQGl0ZW0gZ2NyeV9tZF9hbGdvX3QgbWQKK0BlbmQgdGFibGUKK0BlbmQgdGFibGUKKworVGhlIGZ1bmN0aW9ucyBpbXBsZW1lbnRpbmcgc2NoZW1lczoKKworQGRlZnR5cGVmdW4gZ2NyeV9lcnJvcl90IGdjcnlfYWNfZGF0YV9lbmNyeXB0X3NjaGVtZSAoZ2NyeV9hY19oYW5kbGVfdCBAdmFye2hhbmRsZX0sIGdjcnlfYWNfc2NoZW1lX3QgQHZhcntzY2hlbWV9LCB1bnNpZ25lZCBpbnQgQHZhcntmbGFnc30sIHZvaWQgKkB2YXJ7b3B0c30sIGdjcnlfYWNfa2V5X3QgQHZhcntrZXl9LCBnY3J5X2FjX2lvX3QgKkB2YXJ7aW9fbWVzc2FnZX0sIGdjcnlfYWNfaW9fdCAqQHZhcntpb19jaXBoZXJ9KQorRW5jcnlwdHMgdGhlIHBsYWluIHRleHQgcmVhZGFibGUgZnJvbSBAdmFye2lvX21lc3NhZ2V9IHRocm91Z2gKK0B2YXJ7aGFuZGxlfSB3aXRoIHRoZSBwdWJsaWMga2V5IEB2YXJ7a2V5fSBhY2NvcmRpbmcgdG8gQHZhcntzY2hlbWV9LAorQHZhcntmbGFnc30gYW5kIEB2YXJ7b3B0c30uICBJZiBAdmFye29wdHN9IGlzIG5vdCBOVUxMLCBpdCBoYXMgdG8gYmUgYQorcG9pbnRlciB0byBhIHN0cnVjdHVyZSBzcGVjaWZpYyB0byB0aGUgY2hvc2VuIHNjaGVtZSAoZ2NyeV9hY19lc18qX3QpLgorVGhlIGVuY3J5cHRlZCBtZXNzYWdlIGlzIHdyaXR0ZW4gdG8gQHZhcntpb19jaXBoZXJ9LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGdjcnlfZXJyb3JfdCBnY3J5X2FjX2RhdGFfZGVjcnlwdF9zY2hlbWUgKGdjcnlfYWNfaGFuZGxlX3QgQHZhcntoYW5kbGV9LCBnY3J5X2FjX3NjaGVtZV90IEB2YXJ7c2NoZW1lfSwgdW5zaWduZWQgaW50IEB2YXJ7ZmxhZ3N9LCB2b2lkICpAdmFye29wdHN9LCBnY3J5X2FjX2tleV90IEB2YXJ7a2V5fSwgZ2NyeV9hY19pb190ICpAdmFye2lvX2NpcGhlcn0sIGdjcnlfYWNfaW9fdCAqQHZhcntpb19tZXNzYWdlfSkKK0RlY3J5cHRzIHRoZSBjaXBoZXIgdGV4dCByZWFkYWJsZSBmcm9tIEB2YXJ7aW9fY2lwaGVyfSB0aHJvdWdoCitAdmFye2hhbmRsZX0gd2l0aCB0aGUgc2VjcmV0IGtleSBAdmFye2tleX0gYWNjb3JkaW5nIHRvIEB2YXJ7c2NoZW1lfSwKK0B2YXJ7ZmxhZ3N9IGFuZCBAdmFye29wdHN9LiAgSWYgQHZhcntvcHRzfSBpcyBub3QgTlVMTCwgaXQgaGFzIHRvIGJlIGEKK3BvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUgc3BlY2lmaWMgdG8gdGhlIGNob3NlbiBzY2hlbWUgKGdjcnlfYWNfZXNfKl90KS4KK1RoZSBkZWNyeXB0ZWQgbWVzc2FnZSBpcyB3cml0dGVuIHRvIEB2YXJ7aW9fbWVzc2FnZX0uCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gZ2NyeV9lcnJvcl90IGdjcnlfYWNfZGF0YV9zaWduX3NjaGVtZSAoZ2NyeV9hY19oYW5kbGVfdCBAdmFye2hhbmRsZX0sIGdjcnlfYWNfc2NoZW1lX3QgQHZhcntzY2hlbWV9LCB1bnNpZ25lZCBpbnQgQHZhcntmbGFnc30sIHZvaWQgKkB2YXJ7b3B0c30sIGdjcnlfYWNfa2V5X3QgQHZhcntrZXl9LCBnY3J5X2FjX2lvX3QgKkB2YXJ7aW9fbWVzc2FnZX0sIGdjcnlfYWNfaW9fdCAqQHZhcntpb19zaWduYXR1cmV9KQorU2lnbnMgdGhlIG1lc3NhZ2UgcmVhZGFibGUgZnJvbSBAdmFye2lvX21lc3NhZ2V9IHRocm91Z2ggQHZhcntoYW5kbGV9Cit3aXRoIHRoZSBzZWNyZXQga2V5IEB2YXJ7a2V5fSBhY2NvcmRpbmcgdG8gQHZhcntzY2hlbWV9LCBAdmFye2ZsYWdzfQorYW5kIEB2YXJ7b3B0c30uICBJZiBAdmFye29wdHN9IGlzIG5vdCBOVUxMLCBpdCBoYXMgdG8gYmUgYSBwb2ludGVyIHRvCithIHN0cnVjdHVyZSBzcGVjaWZpYyB0byB0aGUgY2hvc2VuIHNjaGVtZSAoZ2NyeV9hY19zc2FfKl90KS4gIFRoZQorc2lnbmF0dXJlIGlzIHdyaXR0ZW4gdG8gQHZhcntpb19zaWduYXR1cmV9LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGdjcnlfZXJyb3JfdCBnY3J5X2FjX2RhdGFfdmVyaWZ5X3NjaGVtZSAoZ2NyeV9hY19oYW5kbGVfdCBAdmFye2hhbmRsZX0sIGdjcnlfYWNfc2NoZW1lX3QgQHZhcntzY2hlbWV9LCB1bnNpZ25lZCBpbnQgQHZhcntmbGFnc30sIHZvaWQgKkB2YXJ7b3B0c30sIGdjcnlfYWNfa2V5X3QgQHZhcntrZXl9LCBnY3J5X2FjX2lvX3QgKkB2YXJ7aW9fbWVzc2FnZX0sIGdjcnlfYWNfaW9fdCAqQHZhcntpb19zaWduYXR1cmV9KQorVmVyaWZpZXMgdGhyb3VnaCBAdmFye2hhbmRsZX0gdGhhdCB0aGUgc2lnbmF0dXJlIHJlYWRhYmxlIGZyb20KK0B2YXJ7aW9fc2lnbmF0dXJlfSBpcyBpbmRlZWQgdGhlIHJlc3VsdCBvZiBzaWduaW5nIHRoZSBtZXNzYWdlCityZWFkYWJsZSBmcm9tIEB2YXJ7aW9fbWVzc2FnZX0gd2l0aCB0aGUgc2VjcmV0IGtleSBiZWxvbmdpbmcgdG8gdGhlCitwdWJsaWMga2V5IEB2YXJ7a2V5fSBhY2NvcmRpbmcgdG8gQHZhcntzY2hlbWV9IGFuZCBAdmFye29wdHN9LiAgSWYKK0B2YXJ7b3B0c30gaXMgbm90IE5VTEwsIGl0IGhhcyB0byBiZSBhbiBhbm9ueW1vdXMgc3RydWN0dXJlCisoZ2NyeV9hY19zc2FfKl90KSBzcGVjaWZpYyB0byB0aGUgY2hvc2VuIHNjaGVtZS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAbm9kZSBIYW5kbGUtaW5kZXBlbmRlbnQgZnVuY3Rpb25zCitAc3Vic2VjdGlvbiBIYW5kbGUtaW5kZXBlbmRlbnQgZnVuY3Rpb25zCisKK1RoZXNlIHR3byBmdW5jdGlvbnMgYXJlIGRlcHJlY2F0ZWQ7IGRvIG5vdCB1c2UgdGhlbSBmb3IgbmV3IGNvZGUuCisKK0BkZWZ0eXBlZnVuIGdjcnlfZXJyb3JfdCBnY3J5X2FjX2lkX3RvX25hbWUgKGdjcnlfYWNfaWRfdCBAdmFye2FsZ29yaXRobX0sIGNvbnN0IGNoYXIgKipAdmFye25hbWV9KQorU3RvcmVzIHRoZSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhbGdvcml0aG0gd2hvc2UgaWQgaXMgZ2l2ZW4KK2luIEB2YXJ7YWxnb3JpdGhtfSBpbiBAdmFye25hbWV9LiAgRGVwcmVjYXRlZDsgdXNlIEBjb2Rle2djcnlfcGtfYWxnb19uYW1lfS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBnY3J5X2Vycm9yX3QgZ2NyeV9hY19uYW1lX3RvX2lkIChjb25zdCBjaGFyICpAdmFye25hbWV9LCBnY3J5X2FjX2lkX3QgKkB2YXJ7YWxnb3JpdGhtfSkKK1N0b3JlcyB0aGUgbnVtZXJpYyBJRCBvZiB0aGUgYWxnb3JpdGhtIHdob3NlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gaXMKK2NvbnRhaW5lZCBpbiBAdmFye25hbWV9IGluIEB2YXJ7YWxnb3JpdGhtfS4gRGVwcmVjYXRlZDsgdXNlCitAY29kZXtnY3J5X3BrX21hcF9uYW1lfS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAYyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitAYyAqKioqKioqKioqKioqKioqKioqICBIYXNoIEZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqCitAYyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitAbm9kZSBIYXNoaW5nCitAY2hhcHRlciBIYXNoaW5nCisKK0xpYmdjcnlwdCBwcm92aWRlcyBhbiBlYXN5IGFuZCBjb25zaXN0ZW50IHRvIHVzZSBpbnRlcmZhY2UgZm9yIGhhc2hpbmcuCitIYXNoaW5nIGlzIGJ1ZmZlcmVkIGFuZCBzZXZlcmFsIGhhc2ggYWxnb3JpdGhtcyBjYW4gYmUgdXBkYXRlZCBhdCBvbmNlLgorSXQgaXMgcG9zc2libGUgdG8gY29tcHV0ZSBhIE1BQyB1c2luZyB0aGUgc2FtZSByb3V0aW5lcy4gIFRoZQorcHJvZ3JhbW1pbmcgbW9kZWwgZm9sbG93cyBhbiBvcGVuL3Byb2Nlc3MvY2xvc2UgcGFyYWRpZ20gYW5kIGlzIGluIHRoYXQKK3NpbWlsYXIgdG8gb3RoZXIgYnVpbGRpbmcgYmxvY2tzIHByb3ZpZGVkIGJ5IExpYmdjcnlwdC4KKworRm9yIGNvbnZlbmllbmNlIHJlYXNvbnMsIGEgZmV3IGN5Y2xpYyByZWR1bmRhbmN5IGNoZWNrIHZhbHVlIG9wZXJhdGlvbnMKK2FyZSBhbHNvIHN1cHBvcnRlZC4KKworQG1lbnUKKyogQXZhaWxhYmxlIGhhc2ggYWxnb3JpdGhtczo6ICAgTGlzdCBvZiBoYXNoIGFsZ29yaXRobXMgc3VwcG9ydGVkIGJ5IHRoZSBsaWJyYXJ5LgorKiBIYXNoIGFsZ29yaXRobSBtb2R1bGVzOjogICAgICBIb3cgdG8gd29yayB3aXRoIGhhc2ggYWxnb3JpdGhtIG1vZHVsZXMuCisqIFdvcmtpbmcgd2l0aCBoYXNoIGFsZ29yaXRobXM6OiAgTGlzdCBvZiBmdW5jdGlvbnMgcmVsYXRlZCB0byBoYXNoaW5nLgorQGVuZCBtZW51CisKK0Bub2RlIEF2YWlsYWJsZSBoYXNoIGFsZ29yaXRobXMKK0BzZWN0aW9uIEF2YWlsYWJsZSBoYXNoIGFsZ29yaXRobXMKKworQGMgYmVnaW4gdGFibGUgb2YgaGFzaCBhbGdvcml0aG1zCitAY2luZGV4IFNIQS0xCitAY2luZGV4IFNIQS0yMjQsIFNIQS0yNTYsIFNIQS0zODQsIFNIQS01MTIKK0BjaW5kZXggUklQRS1NRC0xNjAKK0BjaW5kZXggTUQyLCBNRDQsIE1ENQorQGNpbmRleCBUSUdFUgorQGNpbmRleCBIQVZBTAorQGNpbmRleCBXaGlybHBvb2wKK0BjaW5kZXggQ1JDMzIKK0B0YWJsZSBAY29kZQorQGl0ZW0gR0NSWV9NRF9OT05FCitUaGlzIGlzIG5vdCBhIHJlYWwgYWxnb3JpdGhtIGJ1dCB1c2VkIGJ5IHNvbWUgZnVuY3Rpb25zIGFzIGFuIGVycm9yCityZXR1cm4gdmFsdWUuICBUaGlzIGNvbnN0YW50IGlzIGd1YXJhbnRlZWQgdG8gaGF2ZSB0aGUgdmFsdWUgQGNvZGV7MH0uCisKK0BpdGVtIEdDUllfTURfU0hBMQorVGhpcyBpcyB0aGUgU0hBLTEgYWxnb3JpdGhtIHdoaWNoIHlpZWxkcyBhIG1lc3NhZ2UgZGlnZXN0IG9mIDIwIGJ5dGVzLgorTm90ZSB0aGF0IFNIQS0xIGJlZ2lucyB0byBzaG93IHNvbWUgd2Vha25lc3NlcyBhbmQgaXQgaXMgc3VnZ2VzdGVkIHRvCitmYWRlIG91dCBpdHMgdXNlIGlmIHN0cm9uZyBjcnlwdG9ncmFwaGljIHByb3BlcnRpZXMgYXJlIHJlcXVpcmVkLgorCitAaXRlbSBHQ1JZX01EX1JNRDE2MAorVGhpcyBpcyB0aGUgMTYwIGJpdCB2ZXJzaW9uIG9mIHRoZSBSSVBFIG1lc3NhZ2UgZGlnZXN0IChSSVBFLU1ELTE2MCkuCitMaWtlIFNIQS0xIGl0IGFsc28geWllbGRzIGEgZGlnZXN0IG9mIDIwIGJ5dGVzLiAgVGhpcyBhbGdvcml0aG0gc2hhcmUgYQorbG90IG9mIGRlc2lnbiBwcm9wZXJ0aWVzIHdpdGggU0hBLTEgYW5kIHRodXMgaXQgaXMgYWR2aXNhYmxlIG5vdCB0byB1c2UKK2l0IGZvciBuZXcgcHJvdG9jb2xzLgorCitAaXRlbSBHQ1JZX01EX01ENQorVGhpcyBpcyB0aGUgd2VsbCBrbm93biBNRDUgYWxnb3JpdGhtLCB3aGljaCB5aWVsZHMgYSBtZXNzYWdlIGRpZ2VzdCBvZgorMTYgYnl0ZXMuICBOb3RlIHRoYXQgdGhlIE1ENSBhbGdvcml0aG0gaGFzIHNldmVyZSB3ZWFrbmVzc2VzLCBmb3IKK2V4YW1wbGUgaXQgaXMgZWFzeSB0byBjb21wdXRlIHR3byBtZXNzYWdlcyB5aWVsZGluZyB0aGUgc2FtZSBoYXNoCisoY29sbGlzaW9uIGF0dGFjaykuICBUaGUgdXNlIG9mIHRoaXMgYWxnb3JpdGhtIGlzIG9ubHkganVzdGlmaWVkIGZvcgorbm9uLWNyeXB0b2dyYXBoaWMgYXBwbGljYXRpb24uCisKKworQGl0ZW0gR0NSWV9NRF9NRDQKK1RoaXMgaXMgdGhlIE1ENCBhbGdvcml0aG0sIHdoaWNoIHlpZWxkcyBhIG1lc3NhZ2UgZGlnZXN0IG9mIDE2IGJ5dGVzLgorVGhpcyBhbGdvcml0aG1zIGhhIHNldmVyZSB3ZWFrbmVzc2VzIGFuZCBzaG91bGQgbm90IGJlIHVzZWQuCisKK0BpdGVtIEdDUllfTURfTUQyCitUaGlzIGlzIGFuIHJlc2VydmVkIGlkZW50aWZpZXIgZm9yIE1ELTI7IHRoZXJlIGlzIG5vIGltcGxlbWVudGF0aW9uIHlldC4KK1RoaXMgYWxnb3JpdGhtIGhhcyBzZXZlcmUgd2Vha25lc3NlcyBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkLgorCitAaXRlbSBHQ1JZX01EX1RJR0VSCitUaGlzIGlzIHRoZSBUSUdFUi8xOTIgYWxnb3JpdGhtIHdoaWNoIHlpZWxkcyBhIG1lc3NhZ2UgZGlnZXN0IG9mIDI0IGJ5dGVzLgorCitAaXRlbSBHQ1JZX01EX0hBVkFMCitUaGlzIGlzIGFuIHJlc2VydmVkIHZhbHVlIGZvciB0aGUgSEFWQUwgYWxnb3JpdGhtIHdpdGggNSBwYXNzZXMgYW5kIDE2MAorYml0LiBJdCB5aWVsZHMgYSBtZXNzYWdlIGRpZ2VzdCBvZiAyMCBieXRlcy4gIE5vdGUgdGhhdCB0aGVyZSBpcyBubworaW1wbGVtZW50YXRpb24geWV0IGF2YWlsYWJsZS4KKworQGl0ZW0gR0NSWV9NRF9TSEEyMjQKK1RoaXMgaXMgdGhlIFNIQS0yMjQgYWxnb3JpdGhtIHdoaWNoIHlpZWxkcyBhIG1lc3NhZ2UgZGlnZXN0IG9mIDI4IGJ5dGVzLgorU2VlIENoYW5nZSBOb3RpY2UgMSBmb3IgRklQUyAxODAtMiBmb3IgdGhlIHNwZWNpZmljYXRpb24uCisKK0BpdGVtIEdDUllfTURfU0hBMjU2CitUaGlzIGlzIHRoZSBTSEEtMjU2IGFsZ29yaXRobSB3aGljaCB5aWVsZHMgYSBtZXNzYWdlIGRpZ2VzdCBvZiAzMiBieXRlcy4KK1NlZSBGSVBTIDE4MC0yIGZvciB0aGUgc3BlY2lmaWNhdGlvbi4KKworQGl0ZW0gR0NSWV9NRF9TSEEzODQKK1RoaXMgaXMgdGhlIFNIQS0zODQgYWxnb3JpdGhtIHdoaWNoIHlpZWxkcyBhIG1lc3NhZ2UgZGlnZXN0IG9mIDQ4IGJ5dGVzLgorU2VlIEZJUFMgMTgwLTIgZm9yIHRoZSBzcGVjaWZpY2F0aW9uLgorCitAaXRlbSBHQ1JZX01EX1NIQTUxMgorVGhpcyBpcyB0aGUgU0hBLTM4NCBhbGdvcml0aG0gd2hpY2ggeWllbGRzIGEgbWVzc2FnZSBkaWdlc3Qgb2YgNjQgYnl0ZXMuCitTZWUgRklQUyAxODAtMiBmb3IgdGhlIHNwZWNpZmljYXRpb24uCisKK0BpdGVtIEdDUllfTURfQ1JDMzIKK1RoaXMgaXMgdGhlIElTTyAzMzA5IGFuZCBJVFUtVCBWLjQyIGN5Y2xpYyByZWR1bmRhbmN5IGNoZWNrLiAgSXQgeWllbGRzCithbiBvdXRwdXQgb2YgNCBieXRlcy4gIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCBhIGhhc2ggYWxnb3JpdGhtIGluIHRoZQorY3J5cHRvZ3JhcGhpYyBzZW5zZS4KKworQGl0ZW0gR0NSWV9NRF9DUkMzMl9SRkMxNTEwCitUaGlzIGlzIHRoZSBhYm92ZSBjeWNsaWMgcmVkdW5kYW5jeSBjaGVjayBmdW5jdGlvbiwgYXMgbW9kaWZpZWQgYnkgUkZDCisxNTEwLiAgSXQgeWllbGRzIGFuIG91dHB1dCBvZiA0IGJ5dGVzLiAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IGEgaGFzaAorYWxnb3JpdGhtIGluIHRoZSBjcnlwdG9ncmFwaGljIHNlbnNlLgorCitAaXRlbSBHQ1JZX01EX0NSQzI0X1JGQzI0NDAKK1RoaXMgaXMgdGhlIE9wZW5QR1AgY3ljbGljIHJlZHVuZGFuY3kgY2hlY2sgZnVuY3Rpb24uICBJdCB5aWVsZHMgYW4KK291dHB1dCBvZiAzIGJ5dGVzLiAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IGEgaGFzaCBhbGdvcml0aG0gaW4gdGhlCitjcnlwdG9ncmFwaGljIHNlbnNlLgorCitAaXRlbSBHQ1JZX01EX1dISVJMUE9PTAorVGhpcyBpcyB0aGUgV2hpcmxwb29sIGFsZ29yaXRobSB3aGljaCB5aWVsZHMgYSBtZXNzYWdlIGRpZ2VzdCBvZiA2NAorYnl0ZXMuCisKK0BlbmQgdGFibGUKK0BjIGVuZCB0YWJsZSBvZiBoYXNoIGFsZ29yaXRobXMKKworQG5vZGUgSGFzaCBhbGdvcml0aG0gbW9kdWxlcworQHNlY3Rpb24gSGFzaCBhbGdvcml0aG0gbW9kdWxlcworCitMaWJnY3J5cHQgbWFrZXMgaXQgcG9zc2libGUgdG8gbG9hZCBhZGRpdGlvbmFsIGBtZXNzYWdlCitkaWdlc3QgbW9kdWxlcyc7IHRoZXNlIGRpZ2VzdHMgY2FuIGJlIHVzZWQganVzdCBsaWtlIHRoZSBtZXNzYWdlIGRpZ2VzdAorYWxnb3JpdGhtcyB0aGF0IGFyZSBidWlsdCBpbnRvIHRoZSBsaWJyYXJ5IGRpcmVjdGx5LiAgRm9yIGFuCitpbnRyb2R1Y3Rpb24gaW50byBleHRlbnNpb24gbW9kdWxlcywgc2VlIEB4cmVme01vZHVsZXN9LgorCitAZGVmdHAge0RhdGEgdHlwZX0gZ2NyeV9tZF9zcGVjX3QKK1RoaXMgaXMgdGhlIGBtb2R1bGUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUnIG5lZWRlZCBmb3IgcmVnaXN0ZXJpbmcKK21lc3NhZ2UgZGlnZXN0IG1vZHVsZXMsIHdoaWNoIGhhcyB0byBiZSBmaWxsZWQgaW4gYnkgdGhlIHVzZXIgYmVmb3JlCitpdCBjYW4gYmUgdXNlZCB0byByZWdpc3RlciBhIG1vZHVsZS4gIEl0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcKK21lbWJlcnM6CisKK0B0YWJsZSBAY29kZQorQGl0ZW0gY29uc3QgY2hhciAqbmFtZQorVGhlIHByaW1hcnkgbmFtZSBvZiB0aGlzIGFsZ29yaXRobS4KK0BpdGVtIHVuc2lnbmVkIGNoYXIgKmFzbm9pZAorQXJyYXkgb2YgYnl0ZXMgdGhhdCBmb3JtIHRoZSBBU04gT0lELgorQGl0ZW0gaW50IGFzbmxlbgorTGVuZ3RoIG9mIGJ5dGVzIGluIGBhc25vaWQnLgorQGl0ZW0gZ2NyeV9tZF9vaWRfc3BlY190ICpvaWRzCitBIGxpc3Qgb2YgT0lEcyB0aGF0IGFyZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFsZ29yaXRobS4gIFRoZQorbGlzdCdzIGxhc3QgZWxlbWVudCBtdXN0IGhhdmUgaXQncyBgb2lkJyBtZW1iZXIgc2V0IHRvIE5VTEwuICBTZWUKK2JlbG93IGZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGlzIHR5cGUuICBTZWUgYmVsb3cgZm9yIGFuIGV4cGxhbmF0aW9uCitvZiB0aGlzIHR5cGUuCitAaXRlbSBpbnQgbWRsZW4KK0xlbmd0aCBvZiB0aGUgbWVzc2FnZSBkaWdlc3QgYWxnb3JpdGhtLiAgU2VlIGJlbG93IGZvciBhbiBleHBsYW5hdGlvbgorb2YgdGhpcyB0eXBlLgorQGl0ZW0gZ2NyeV9tZF9pbml0X3QgaW5pdAorVGhlIGZ1bmN0aW9uIHJlc3BvbnNpYmxlIGZvciBpbml0aWFsaXppbmcgYSBoYW5kbGUuICBTZWUgYmVsb3cgZm9yIGFuCitleHBsYW5hdGlvbiBvZiB0aGlzIHR5cGUuCitAaXRlbSBnY3J5X21kX3dyaXRlX3Qgd3JpdGUKK1RoZSBmdW5jdGlvbiByZXNwb25zaWJsZSBmb3Igd3JpdGluZyBkYXRhIGludG8gYSBtZXNzYWdlIGRpZ2VzdAorY29udGV4dC4gIFNlZSBiZWxvdyBmb3IgYW4gZXhwbGFuYXRpb24gb2YgdGhpcyB0eXBlLgorQGl0ZW0gZ2NyeV9tZF9maW5hbF90IGZpbmFsCitUaGUgZnVuY3Rpb24gcmVzcG9uc2libGUgZm9yIGBmaW5hbGl6aW5nJyBhIG1lc3NhZ2UgZGlnZXN0IGNvbnRleHQuCitTZWUgYmVsb3cgZm9yIGFuIGV4cGxhbmF0aW9uIG9mIHRoaXMgdHlwZS4KK0BpdGVtIGdjcnlfbWRfcmVhZF90IHJlYWQKK1RoZSBmdW5jdGlvbiByZXNwb25zaWJsZSBmb3IgcmVhZGluZyBvdXQgYSBtZXNzYWdlIGRpZ2VzdCByZXN1bHQuICBTZWUKK2JlbG93IGZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGlzIHR5cGUuCitAaXRlbSBzaXplX3QgY29udGV4dHNpemUKK1RoZSBzaXplIG9mIHRoZSBhbGdvcml0aG0tc3BlY2lmaWMgYGNvbnRleHQnLCB0aGF0IHNob3VsZCBiZQorYWxsb2NhdGVkIGZvciBlYWNoIGhhbmRsZS4KK0BlbmQgdGFibGUKK0BlbmQgZGVmdHAKKworQGRlZnRwIHtEYXRhIHR5cGV9IGdjcnlfbWRfb2lkX3NwZWNfdAorVGhpcyB0eXBlIGlzIHVzZWQgZm9yIGFzc29jaWF0aW5nIGEgdXNlci1wcm92aWRlZCBhbGdvcml0aG0KK2ltcGxlbWVudGF0aW9uIHdpdGggY2VydGFpbiBPSURzLiAgSXQgY29udGFpbnMgdGhlIGZvbGxvd2luZyBtZW1iZXJzOgorCitAdGFibGUgQGNvZGUKK0BpdGVtIGNvbnN0IGNoYXIgKm9pZHN0cmluZworVGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgT0lELgorQGVuZCB0YWJsZQorQGVuZCBkZWZ0cAorCitAZGVmdHAge0RhdGEgdHlwZX0gZ2NyeV9tZF9pbml0X3QKK1R5cGUgZm9yIHRoZSBgaW5pdCcgZnVuY3Rpb24sIGRlZmluZWQgYXM6IHZvaWQgKCpnY3J5X21kX2luaXRfdCkgKHZvaWQKKypjKQorQGVuZCBkZWZ0cAorCitAZGVmdHAge0RhdGEgdHlwZX0gZ2NyeV9tZF93cml0ZV90CitUeXBlIGZvciB0aGUgYHdyaXRlJyBmdW5jdGlvbiwgZGVmaW5lZCBhczogdm9pZCAoKmdjcnlfbWRfd3JpdGVfdCkKKyh2b2lkICpjLCB1bnNpZ25lZCBjaGFyICpidWYsIHNpemVfdCBuYnl0ZXMpCitAZW5kIGRlZnRwCisKK0BkZWZ0cCB7RGF0YSB0eXBlfSBnY3J5X21kX2ZpbmFsX3QKK1R5cGUgZm9yIHRoZSBgZmluYWwnIGZ1bmN0aW9uLCBkZWZpbmVkIGFzOiB2b2lkICgqZ2NyeV9tZF9maW5hbF90KQorKHZvaWQgKmMpCitAZW5kIGRlZnRwCisKK0BkZWZ0cCB7RGF0YSB0eXBlfSBnY3J5X21kX3JlYWRfdAorVHlwZSBmb3IgdGhlIGByZWFkJyBmdW5jdGlvbiwgZGVmaW5lZCBhczogdW5zaWduZWQgY2hhcgorKigqZ2NyeV9tZF9yZWFkX3QpICh2b2lkICpjKQorQGVuZCBkZWZ0cAorCitAZGVmdHlwZWZ1biBnY3J5X2Vycm9yX3QgZ2NyeV9tZF9yZWdpc3RlciAoZ2NyeV9tZF9zcGVjX3QgKkB2YXJ7ZGlnZXN0fSwgdW5zaWduZWQgaW50ICphbGdvcml0aG1faWQsIGdjcnlfbW9kdWxlX3QgKkB2YXJ7bW9kdWxlfSkKKworUmVnaXN0ZXIgYSBuZXcgZGlnZXN0IG1vZHVsZSB3aG9zZSBzcGVjaWZpY2F0aW9uIGNhbiBiZSBmb3VuZCBpbgorQHZhcntkaWdlc3R9LiAgT24gc3VjY2VzcywgYSBuZXcgYWxnb3JpdGhtIElEIGlzIHN0b3JlZCBpbgorQHZhcnthbGdvcml0aG1faWR9IGFuZCBhIHBvaW50ZXIgcmVwcmVzZW50aW5nIHRoaXMgbW9kdWxlIGlzIHN0b3JlZAoraW4gQHZhcnttb2R1bGV9LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIHZvaWQgZ2NyeV9tZF91bnJlZ2lzdGVyIChnY3J5X21vZHVsZV90IEB2YXJ7bW9kdWxlfSkKK1VucmVnaXN0ZXIgdGhlIGRpZ2VzdCBpZGVudGlmaWVkIGJ5IEB2YXJ7bW9kdWxlfSwgd2hpY2ggbXVzdCBoYXZlIGJlZW4KK3JlZ2lzdGVyZWQgd2l0aCBnY3J5X21kX3JlZ2lzdGVyLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGdjcnlfZXJyb3JfdCBnY3J5X21kX2xpc3QgKGludCAqQHZhcntsaXN0fSwgaW50ICpAdmFye2xpc3RfbGVuZ3RofSkKK0dldCBhIGxpc3QgY29uc2lzdGluZyBvZiB0aGUgSURzIG9mIHRoZSBsb2FkZWQgbWVzc2FnZSBkaWdlc3QgbW9kdWxlcy4KK0lmIEB2YXJ7bGlzdH0gaXMgemVybywgd3JpdGUgdGhlIG51bWJlciBvZiBsb2FkZWQgbWVzc2FnZSBkaWdlc3QKK21vZHVsZXMgdG8gQHZhcntsaXN0X2xlbmd0aH0gYW5kIHJldHVybi4gIElmIEB2YXJ7bGlzdH0gaXMgbm9uLXplcm8sCit0aGUgZmlyc3QgKkB2YXJ7bGlzdF9sZW5ndGh9IGFsZ29yaXRobSBJRHMgYXJlIHN0b3JlZCBpbiBAdmFye2xpc3R9LAord2hpY2ggbXVzdCBiZSBvZiBhY2NvcmRpbmcgc2l6ZS4gIEluIGNhc2UgdGhlcmUgYXJlIGxlc3MgbWVzc2FnZQorZGlnZXN0cyBtb2R1bGVzIHRoYW4gKkB2YXJ7bGlzdF9sZW5ndGh9LCAqQHZhcntsaXN0X2xlbmd0aH0gaXMgdXBkYXRlZAordG8gdGhlIGNvcnJlY3QgbnVtYmVyLgorQGVuZCBkZWZ0eXBlZnVuCisKK0Bub2RlIFdvcmtpbmcgd2l0aCBoYXNoIGFsZ29yaXRobXMKK0BzZWN0aW9uIFdvcmtpbmcgd2l0aCBoYXNoIGFsZ29yaXRobXMKKworVG8gdXNlIG1vc3Qgb2YgdGhlc2UgZnVuY3Rpb24gaXQgaXMgbmVjZXNzYXJ5IHRvIGNyZWF0ZSBhIGNvbnRleHQ7Cit0aGlzIGlzIGRvbmUgdXNpbmc6CisKK0BkZWZ0eXBlZnVuIGdjcnlfZXJyb3JfdCBnY3J5X21kX29wZW4gKGdjcnlfbWRfaGRfdCAqQHZhcntoZH0sIGludCBAdmFye2FsZ299LCB1bnNpZ25lZCBpbnQgQHZhcntmbGFnc30pCisKK0NyZWF0ZSBhIG1lc3NhZ2UgZGlnZXN0IG9iamVjdCBmb3IgYWxnb3JpdGhtIEB2YXJ7YWxnb30uICBAdmFye2ZsYWdzfQorbWF5IGJlIGdpdmVuIGFzIGFuIGJpdHdpc2UgT1Igb2YgY29uc3RhbnRzIGRlc2NyaWJlZCBiZWxvdy4gIEB2YXJ7YWxnb30KK21heSBiZSBnaXZlbiBhcyBAY29kZXswfSBpZiB0aGUgYWxnb3JpdGhtcyB0byB1c2UgYXJlIGxhdGVyIHNldCB1c2luZworQGNvZGV7Z2NyeV9tZF9lbmFibGV9LiBAdmFye2hkfSBpcyBndWFyYW50ZWVkIHRvIGVpdGhlciByZWNlaXZlIGEgdmFsaWQKK2hhbmRsZSBvciBOVUxMLgorCitGb3IgYSBsaXN0IG9mIHN1cHBvcnRlZCBhbGdvcml0aG1zLCBzZWUgQHhyZWZ7QXZhaWxhYmxlIGhhc2gKK2FsZ29yaXRobXN9LgorCitUaGUgZmxhZ3MgYWxsb3dlZCBmb3IgQHZhcnttb2RlfSBhcmU6CisKK0BjIGJlZ2luIHRhYmxlIG9mIGhhc2ggZmxhZ3MKK0B0YWJsZSBAY29kZQorQGl0ZW0gR0NSWV9NRF9GTEFHX1NFQ1VSRQorQWxsb2NhdGUgYWxsIGJ1ZmZlcnMgYW5kIHRoZSByZXN1bHRpbmcgZGlnZXN0IGluICJzZWN1cmUgbWVtb3J5Ii4gIFVzZQordGhpcyBpcyB0aGUgaGFzaGVkIGRhdGEgaXMgaGlnaGx5IGNvbmZpZGVudGlhbC4KKworQGl0ZW0gR0NSWV9NRF9GTEFHX0hNQUMKK0BjaW5kZXggSE1BQworVHVybiB0aGUgYWxnb3JpdGhtIGludG8gYSBITUFDIG1lc3NhZ2UgYXV0aGVudGljYXRpb24gYWxnb3JpdGhtLiAgVGhpcworb25seSB3b3JrcyBpZiBqdXN0IG9uZSBhbGdvcml0aG0gaXMgZW5hYmxlZCBmb3IgdGhlIGhhbmRsZS4gIE5vdGUgdGhhdAordGhlIGZ1bmN0aW9uIEBjb2Rle2djcnlfbWRfc2V0a2V5fSBtdXN0IGJlIHVzZWQgdG8gc2V0IHRoZSBNQUMga2V5LgorVGhlIHNpemUgb2YgdGhlIE1BQyBpcyBlcXVhbCB0byB0aGUgbWVzc2FnZSBkaWdlc3Qgb2YgdGhlIHVuZGVybHlpbmcKK2hhc2ggYWxnb3JpdGhtLiAgSWYgeW91IHdhbnQgQ0JDIG1lc3NhZ2UgYXV0aGVudGljYXRpb24gY29kZXMgYmFzZWQgb24KK2EgY2lwaGVyLCBzZWUgQHhyZWZ7V29ya2luZyB3aXRoIGNpcGhlciBoYW5kbGVzfS4KKworQGVuZCB0YWJsZQorQGMgYmVnaW4gdGFibGUgb2YgaGFzaCBmbGFncworCitZb3UgbWF5IHVzZSB0aGUgZnVuY3Rpb24gQGNvZGV7Z2NyeV9tZF9pc19lbmFibGVkfSB0byBsYXRlciBjaGVjaword2hldGhlciBhbiBhbGdvcml0aG0gaGFzIGJlZW4gZW5hYmxlZC4KKworQGVuZCBkZWZ0eXBlZnVuCitAYyBlbmQgZnVuY3Rpb24gZ2NyeV9tZF9vcGVuCisKK0lmIHlvdSB3YW50IHRvIGNhbGN1bGF0ZSBzZXZlcmFsIGhhc2ggYWxnb3JpdGhtcyBhdCB0aGUgc2FtZSB0aW1lLCB5b3UKK2hhdmUgdG8gdXNlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gcmlnaHQgYWZ0ZXIgdGhlIEBjb2Rle2djcnlfbWRfb3Blbn06CisKK0BkZWZ0eXBlZnVuIGdjcnlfZXJyb3JfdCBnY3J5X21kX2VuYWJsZSAoZ2NyeV9tZF9oZF90IEB2YXJ7aH0sIGludCBAdmFye2FsZ299KQorCitBZGQgdGhlIG1lc3NhZ2UgZGlnZXN0IGFsZ29yaXRobSBAdmFye2FsZ299IHRvIHRoZSBkaWdlc3Qgb2JqZWN0CitkZXNjcmliZWQgYnkgaGFuZGxlIEB2YXJ7aH0uICBEdXBsaWNhdGVkIGVuYWJsaW5nIG9mIGFsZ29yaXRobXMgaXMKK2RldGVjdGVkIGFuZCBpZ25vcmVkLgorQGVuZCBkZWZ0eXBlZnVuCisKK0lmIHRoZSBmbGFnIEBjb2Rle0dDUllfTURfRkxBR19ITUFDfSB3YXMgdXNlZCwgdGhlIGtleSBmb3IgdGhlIE1BQyBtdXN0CitiZSBzZXQgdXNpbmcgdGhlIGZ1bmN0aW9uOgorCitAZGVmdHlwZWZ1biBnY3J5X2Vycm9yX3QgZ2NyeV9tZF9zZXRrZXkgKGdjcnlfbWRfaGRfdCBAdmFye2h9LCBjb25zdCB2b2lkICpAdmFye2tleX0sIHNpemVfdCBAdmFye2tleWxlbn0pCisKK0ZvciB1c2Ugd2l0aCB0aGUgSE1BQyBmZWF0dXJlLCBzZXQgdGhlIE1BQyBrZXkgdG8gdGhlIHZhbHVlIG9mCitAdmFye2tleX0gb2YgbGVuZ3RoIEB2YXJ7a2V5bGVufSBieXRlcy4gIFRoZXJlIGlzIG5vIHJlc3RyaWN0aW9uIG9uCit0aGUgbGVuZ3RoIG9mIHRoZSBrZXkuCitAZW5kIGRlZnR5cGVmdW4KKworCitBZnRlciB5b3UgYXJlIGRvbmUgd2l0aCB0aGUgaGFzaCBjYWxjdWxhdGlvbiwgeW91IHNob3VsZCByZWxlYXNlIHRoZQorcmVzb3VyY2VzIGJ5IHVzaW5nOgorCitAZGVmdHlwZWZ1biB2b2lkIGdjcnlfbWRfY2xvc2UgKGdjcnlfbWRfaGRfdCBAdmFye2h9KQorCitSZWxlYXNlIGFsbCByZXNvdXJjZXMgb2YgaGFzaCBjb250ZXh0IEB2YXJ7aH0uICBAdmFye2h9IHNob3VsZCBub3QgYmUKK3VzZWQgYWZ0ZXIgYSBjYWxsIHRvIHRoaXMgZnVuY3Rpb24uICBBIEBjb2Rle05VTEx9IHBhc3NlZCBhcyBAdmFye2h9IGlzCitpZ25vcmVkLiAgVGhlIGZ1bmN0aW9uIGFsc28gemVyb2lzZXMgYWxsIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbgorYXNzb2NpYXRlZCB3aXRoIHRoaXMgaGFuZGxlLgorCisKK0BlbmQgZGVmdHlwZWZ1bgorCitPZnRlbiB5b3UgaGF2ZSB0byBkbyBzZXZlcmFsIGhhc2ggb3BlcmF0aW9ucyB1c2luZyB0aGUgc2FtZSBhbGdvcml0aG0uCitUbyBhdm9pZCB0aGUgb3ZlcmhlYWQgb2YgY3JlYXRpbmcgYW5kIHJlbGVhc2luZyBjb250ZXh0LCBhIHJlc2V0IGZ1bmN0aW9uCitpcyBwcm92aWRlZDoKKworQGRlZnR5cGVmdW4gdm9pZCBnY3J5X21kX3Jlc2V0IChnY3J5X21kX2hkX3QgQHZhcntofSkKKworUmVzZXQgdGhlIGN1cnJlbnQgY29udGV4dCB0byBpdHMgaW5pdGlhbCBzdGF0ZS4gIFRoaXMgaXMgZWZmZWN0aXZlbHkKK2lkZW50aWNhbCB0byBhIGNsb3NlIGZvbGxvd2VkIGJ5IGFuIG9wZW4gYW5kIGVuYWJsaW5nIGFsbCBjdXJyZW50bHkKK2FjdGl2ZSBhbGdvcml0aG1zLgorQGVuZCBkZWZ0eXBlZnVuCisKKworT2Z0ZW4gaXQgaXMgbmVjZXNzYXJ5IHRvIHN0YXJ0IGhhc2hpbmcgc29tZSBkYXRhIGFuZCB0aGVuIGNvbnRpbnVlIHRvCitoYXNoIGRpZmZlcmVudCBkYXRhLiAgVG8gYXZvaWQgaGFzaGluZyB0aGUgc2FtZSBkYXRhIHNldmVyYWwgdGltZXMgKHdoaWNoCittaWdodCBub3QgZXZlbiBiZSBwb3NzaWJsZSBpZiB0aGUgZGF0YSBpcyByZWNlaXZlZCBmcm9tIGEgcGlwZSksIGEKK3NuYXBzaG90IG9mIHRoZSBjdXJyZW50IGhhc2ggY29udGV4dCBjYW4gYmUgdGFrZW4gYW5kIHR1cm5lZCBpbnRvIGEgbmV3Citjb250ZXh0OgorCitAZGVmdHlwZWZ1biBnY3J5X2Vycm9yX3QgZ2NyeV9tZF9jb3B5IChnY3J5X21kX2hkX3QgKkB2YXJ7aGFuZGxlX2RzdH0sIGdjcnlfbWRfaGRfdCBAdmFye2hhbmRsZV9zcmN9KQorCitDcmVhdGUgYSBuZXcgZGlnZXN0IG9iamVjdCBhcyBhbiBleGFjdCBjb3B5IG9mIHRoZSBvYmplY3QgZGVzY3JpYmVkIGJ5CitoYW5kbGUgQHZhcntoYW5kbGVfc3JjfSBhbmQgc3RvcmUgaXQgaW4gQHZhcntoYW5kbGVfZHN0fS4gIFRoZSBjb250ZXh0CitpcyBub3QgcmVzZXQgYW5kIHlvdSBjYW4gY29udGludWUgdG8gaGFzaCBkYXRhIHVzaW5nIHRoaXMgY29udGV4dCBhbmQKK2luZGVwZW5kZW50bHkgdXNpbmcgdGhlIG9yaWdpbmFsIGNvbnRleHQuCitAZW5kIGRlZnR5cGVmdW4KKworCitOb3cgdGhhdCB3ZSBoYXZlIHByZXBhcmVkIGV2ZXJ5dGhpbmcgdG8gY2FsY3VsYXRlIGhhc2hlcywgaXQgaXMgdGltZSB0bworc2VlIGhvdyBpdCBpcyBhY3R1YWxseSBkb25lLiAgVGhlcmUgYXJlIHR3byB3YXlzIGZvciB0aGlzLCBvbmUgdG8KK3VwZGF0ZSB0aGUgaGFzaCB3aXRoIGEgYmxvY2sgb2YgbWVtb3J5IGFuZCBvbmUgbWFjcm8gdG8gdXBkYXRlIHRoZSBoYXNoCitieSBqdXN0IG9uZSBjaGFyYWN0ZXIuICBCb3RoIG1ldGhvZHMgY2FuIGJlIHVzZWQgb24gdGhlIHNhbWUgaGFzaCBjb250ZXh0LgorCitAZGVmdHlwZWZ1biB2b2lkIGdjcnlfbWRfd3JpdGUgKGdjcnlfbWRfaGRfdCBAdmFye2h9LCBjb25zdCB2b2lkICpAdmFye2J1ZmZlcn0sIHNpemVfdCBAdmFye2xlbmd0aH0pCisKK1Bhc3MgQHZhcntsZW5ndGh9IGJ5dGVzIG9mIHRoZSBkYXRhIGluIEB2YXJ7YnVmZmVyfSB0byB0aGUgZGlnZXN0IG9iamVjdAord2l0aCBoYW5kbGUgQHZhcntofSB0byB1cGRhdGUgdGhlIGRpZ2VzdCB2YWx1ZXMuIFRoaXMKK2Z1bmN0aW9uIHNob3VsZCBiZSB1c2VkIGZvciBsYXJnZSBibG9ja3Mgb2YgZGF0YS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biB2b2lkIGdjcnlfbWRfcHV0YyAoZ2NyeV9tZF9oZF90IEB2YXJ7aH0sIGludCBAdmFye2N9KQorCitQYXNzIHRoZSBieXRlIGluIEB2YXJ7Y30gdG8gdGhlIGRpZ2VzdCBvYmplY3Qgd2l0aCBoYW5kbGUgQHZhcntofSB0bwordXBkYXRlIHRoZSBkaWdlc3QgdmFsdWUuICBUaGlzIGlzIGFuIGVmZmljaWVudCBmdW5jdGlvbiwgaW1wbGVtZW50ZWQgYXMKK2EgbWFjcm8gdG8gYnVmZmVyIHRoZSBkYXRhIGJlZm9yZSBhbiBhY3R1YWwgdXBkYXRlLiAKK0BlbmQgZGVmdHlwZWZ1bgorCitUaGUgc2VtYW50aWNzIG9mIHRoZSBoYXNoIGZ1bmN0aW9ucyBkbyBub3QgcHJvdmlkZSBmb3IgcmVhZGluZyBvdXQgaW50ZXJtZWRpYXRlCittZXNzYWdlIGRpZ2VzdHMgYmVjYXVzZSB0aGUgY2FsY3VsYXRpb24gbXVzdCBiZSBmaW5hbGl6ZWQgZmlyc3QuICBUaGlzCitmaW5hbGl6YXRpb24gbWF5IGZvciBleGFtcGxlIGluY2x1ZGUgdGhlIG51bWJlciBvZiBieXRlcyBoYXNoZWQgaW4gdGhlCittZXNzYWdlIGRpZ2VzdCBvciBzb21lIHBhZGRpbmcuCisKK0BkZWZ0eXBlZnVuIHZvaWQgZ2NyeV9tZF9maW5hbCAoZ2NyeV9tZF9oZF90IEB2YXJ7aH0pCisKK0ZpbmFsaXplIHRoZSBtZXNzYWdlIGRpZ2VzdCBjYWxjdWxhdGlvbi4gIFRoaXMgaXMgbm90IHJlYWxseSBuZWVkZWQKK2JlY2F1c2UgQGNvZGV7Z2NyeV9tZF9yZWFkfSBkb2VzIHRoaXMgaW1wbGljaXRseS4gIEFmdGVyIHRoaXMgaGFzIGJlZW4KK2RvbmUgbm8gZnVydGhlciB1cGRhdGVzIChieSBtZWFucyBvZiBAY29kZXtnY3J5X21kX3dyaXRlfSBvcgorQGNvZGV7Z2NyeV9tZF9wdXRjfSBhcmUgYWxsb3dlZC4gIE9ubHkgdGhlIGZpcnN0IGNhbGwgdG8gdGhpcyBmdW5jdGlvbgoraGFzIGFuIGVmZmVjdC4gSXQgaXMgaW1wbGVtZW50ZWQgYXMgYSBtYWNyby4KK0BlbmQgZGVmdHlwZWZ1bgorCitUaGUgd2F5IHRvIHJlYWQgb3V0IHRoZSBjYWxjdWxhdGVkIG1lc3NhZ2UgZGlnZXN0IGlzIGJ5IHVzaW5nIHRoZQorZnVuY3Rpb246CisKK0BkZWZ0eXBlZnVuIHt1bnNpZ25lZCBjaGFyICp9IGdjcnlfbWRfcmVhZCAoZ2NyeV9tZF9oZF90IEB2YXJ7aH0sIGludCBAdmFye2FsZ299KQorCitAY29kZXtnY3J5X21kX3JlYWR9IHJldHVybnMgdGhlIG1lc3NhZ2UgZGlnZXN0IGFmdGVyIGZpbmFsaXppbmcgdGhlCitjYWxjdWxhdGlvbi4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIHVzZWQgYXMgb2Z0ZW4gYXMgcmVxdWlyZWQgYnV0IGl0IHdpbGwKK2Fsd2F5cyByZXR1cm4gdGhlIHNhbWUgdmFsdWUgZm9yIG9uZSBoYW5kbGUuICBUaGUgcmV0dXJuZWQgbWVzc2FnZSBkaWdlc3QKK2lzIGFsbG9jYXRlZCB3aXRoaW4gdGhlIG1lc3NhZ2UgY29udGV4dCBhbmQgdGhlcmVmb3JlIHZhbGlkIHVudGlsIHRoZQoraGFuZGxlIGlzIHJlbGVhc2VkIG9yIHJlc2V0ZWQgKHVzaW5nIEBjb2Rle2djcnlfbWRfY2xvc2V9IG9yCitAY29kZXtnY3J5X21kX3Jlc2V0fS4gIEB2YXJ7YWxnb30gbWF5IGJlIGdpdmVuIGFzIDAgdG8gcmV0dXJuIHRoZSBvbmx5CitlbmFibGVkIG1lc3NhZ2UgZGlnZXN0IG9yIGl0IG1heSBzcGVjaWZ5IG9uZSBvZiB0aGUgZW5hYmxlZCBhbGdvcml0aG1zLgorVGhlIGZ1bmN0aW9uIGRvZXMgcmV0dXJuIEBjb2Rle05VTEx9IGlmIHRoZSByZXF1ZXN0ZWQgYWxnb3JpdGhtIGhhcyBub3QKK2JlZW4gZW5hYmxlZC4KK0BlbmQgZGVmdHlwZWZ1bgorCitCZWNhdXNlIGl0IGlzIG9mdGVuIG5lY2Vzc2FyeSB0byBnZXQgdGhlIG1lc3NhZ2UgZGlnZXN0IG9mIG9uZSBibG9jayBvZgorbWVtb3J5LCBhIGZhc3QgY29udmVuaWVuY2UgZnVuY3Rpb24gaXMgYXZhaWxhYmxlIGZvciB0aGlzIHRhc2s6IAorCitAZGVmdHlwZWZ1biB2b2lkIGdjcnlfbWRfaGFzaF9idWZmZXIgKGludCBAdmFye2FsZ299LCB2b2lkICpAdmFye2RpZ2VzdH0sIGNvbnN0IHZvaWQgKkB2YXJ7YnVmZmVyfSwgc2l6ZV90IEB2YXJ7bGVuZ3RofSk7CisKK0Bjb2Rle2djcnlfbWRfaGFzaF9idWZmZXJ9IGlzIGEgc2hvcnRjdXQgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIGEgbWVzc2FnZQorZGlnZXN0IG9mIGEgYnVmZmVyLiAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXF1aXJlIGEgY29udGV4dCBhbmQKK2ltbWVkaWF0ZWx5IHJldHVybnMgdGhlIG1lc3NhZ2UgZGlnZXN0IG9mIHRoZSBAdmFye2xlbmd0aH0gYnl0ZXMgYXQKK0B2YXJ7YnVmZmVyfS4gIEB2YXJ7ZGlnZXN0fSBtdXN0IGJlIGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyLCBsYXJnZQorZW5vdWdoIHRvIGhvbGQgdGhlIG1lc3NhZ2UgZGlnZXN0IHlpZWxkZWQgYnkgdGhlIHRoZSBzcGVjaWZpZWQgYWxnb3JpdGhtCitAdmFye2FsZ299LiAgVGhpcyByZXF1aXJlZCBzaXplIG1heSBiZSBvYnRhaW5lZCBieSB1c2luZyB0aGUgZnVuY3Rpb24KK0Bjb2Rle2djcnlfbWRfZ2V0X2FsZ29fZGxlbn0uCisKK05vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIHdpbGwgYWJvcnQgdGhlIHByb2Nlc3MgaWYgYW4gdW5hdmFpbGFibGUKK2FsZ29yaXRobSBpcyB1c2VkLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitAYyAqKioqKiBNRCBpbmZvIGZ1bmN0aW9ucyAqKioqKioqKioqKgorQGMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworSGFzaCBhbGdvcml0aG1zIGFyZSBpZGVudGlmaWVkIGJ5IGludGVybmFsIGFsZ29yaXRobSBudW1iZXJzIChzZWUKK0Bjb2Rle2djcnlfbWRfb3Blbn0gZm9yIGEgbGlzdCkuICBIb3dldmVyLCBpbiBtb3N0IGFwcGxpY2F0aW9ucyB0aGV5IGFyZQordXNlZCBieSBuYW1lcywgc28gdHdvIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlIHRvIG1hcCBiZXR3ZWVuIHN0cmluZworcmVwcmVzZW50YXRpb25zIGFuZCBoYXNoIGFsZ29yaXRobSBpZGVudGlmaWVycy4KKworQGRlZnR5cGVmdW4ge2NvbnN0IGNoYXIgKn0gZ2NyeV9tZF9hbGdvX25hbWUgKGludCBAdmFye2FsZ299KQorCitNYXAgdGhlIGRpZ2VzdCBhbGdvcml0aG0gaWQgQHZhcnthbGdvfSB0byBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUKK2FsZ29yaXRobSBuYW1lLiAgRm9yIHVua25vd24gYWxnb3JpdGhtcyB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlCitzdHJpbmcgQGNvZGV7Ij8ifS4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSB1c2VkIHRvIHRlc3QgZm9yIHRoZQorYXZhaWxhYmlsaXR5IG9mIGFuIGFsZ29yaXRobS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBpbnQgZ2NyeV9tZF9tYXBfbmFtZSAoY29uc3QgY2hhciAqQHZhcntuYW1lfSkKKworTWFwIHRoZSBhbGdvcml0aG0gd2l0aCBAdmFye25hbWV9IHRvIGEgZGlnZXN0IGFsZ29yaXRobSBpZGVudGlmaWVyLgorUmV0dXJucyAwIGlmIHRoZSBhbGdvcml0aG0gbmFtZSBpcyBub3Qga25vd24uICBOYW1lcyByZXByZXNlbnRpbmcKK0BhY3Jvbnlte0FTTi4xfSBvYmplY3QgaWRlbnRpZmllcnMgYXJlIHJlY29nbml6ZWQgaWYgdGhlIEBhY3Jvbnlte0lFVEZ9Citkb3R0ZWQgZm9ybWF0IGlzIHVzZWQgYW5kIHRoZSBPSUQgaXMgcHJlZml4ZWQgd2l0aCBlaXRoZXIgIkBjb2Rle29pZC59Igorb3IgIkBjb2Rle09JRC59Ii4gIEZvciBhIGxpc3Qgb2Ygc3VwcG9ydGVkIE9JRHMsIHNlZSB0aGUgc291cmNlIGNvZGUgYXQKK0BmaWxle2NpcGhlci9tZC5jfS4gVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIHVzZWQgdG8gdGVzdCBmb3IgdGhlCithdmFpbGFiaWxpdHkgb2YgYW4gYWxnb3JpdGhtLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGdjcnlfZXJyb3JfdCBnY3J5X21kX2dldF9hc25vaWQgKGludCBAdmFye2FsZ299LCB2b2lkICpAdmFye2J1ZmZlcn0sIHNpemVfdCAqQHZhcntsZW5ndGh9KQorCitSZXR1cm4gYW4gREVSIGVuY29kZWQgQVNOLjEgT0lEIGZvciB0aGUgYWxnb3JpdGhtIEB2YXJ7YWxnb30gaW4gdGhlCit1c2VyIGFsbG9jYXRlZCBAdmFye2J1ZmZlcn0uIEB2YXJ7bGVuZ3RofSBtdXN0IHBvaW50IHRvIHZhcmlhYmxlIHdpdGgKK3RoZSBhdmFpbGFibGUgc2l6ZSBvZiBAdmFye2J1ZmZlcn0gYW5kIHJlY2VpdmVzIGFmdGVyIHJldHVybiB0aGUKK2FjdHVhbCBzaXplIG9mIHRoZSByZXR1cm5lZCBPSUQuICBUaGUgcmV0dXJuZWQgZXJyb3IgY29kZSBtYXkgYmUKK0Bjb2Rle0dQR19FUlJfVE9PX1NIT1JUfSBpZiB0aGUgcHJvdmlkZWQgYnVmZmVyIGlzIHRvIHNob3J0IHRvIHJlY2VpdmUKK3RoZSBPSUQ7IGl0IGlzIHBvc3NpYmxlIHRvIGNhbGwgdGhlIGZ1bmN0aW9uIHdpdGggQGNvZGV7TlVMTH0gZm9yCitAdmFye2J1ZmZlcn0gdG8gaGF2ZSBpdCBvbmx5IHJldHVybiB0aGUgcmVxdWlyZWQgc2l6ZS4gIFRoZSBmdW5jdGlvbgorcmV0dXJucyAwIG9uIHN1Y2Nlc3MuCisKK0BlbmQgZGVmdHlwZWZ1bgorCisKK1RvIHRlc3Qgd2hldGhlciBhbiBhbGdvcml0aG0gaXMgYWN0dWFsbHkgYXZhaWxhYmxlIGZvciB1c2UsIHRoZQorZm9sbG93aW5nIG1hY3JvIHNob3VsZCBiZSB1c2VkOgorCitAZGVmdHlwZWZ1biBnY3J5X2Vycm9yX3QgZ2NyeV9tZF90ZXN0X2FsZ28gKGludCBAdmFye2FsZ299KSAKKworVGhlIG1hY3JvIHJldHVybnMgMCBpZiB0aGUgYWxnb3JpdGhtIEB2YXJ7YWxnb30gaXMgYXZhaWxhYmxlIGZvciB1c2UuCitAZW5kIGRlZnR5cGVmdW4KKworSWYgdGhlIGxlbmd0aCBvZiBhIG1lc3NhZ2UgZGlnZXN0IGlzIG5vdCBrbm93biwgaXQgY2FuIGJlIHJldHJpZXZlZAordXNpbmcgdGhlIGZvbGxvd2luZyBmdW5jdGlvbjoKKworQGRlZnR5cGVmdW4ge3Vuc2lnbmVkIGludH0gZ2NyeV9tZF9nZXRfYWxnb19kbGVuIChpbnQgQHZhcnthbGdvfSkKKworUmV0cmlldmUgdGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgZGlnZXN0IHlpZWxkZWQgYnkgYWxnb3JpdGhtCitAdmFye2FsZ299LiAgVGhpcyBpcyBvZnRlbiB1c2VkIHByaW9yIHRvIEBjb2Rle2djcnlfbWRfcmVhZH0gdG8gYWxsb2NhdGUKK3N1ZmZpY2llbnQgbWVtb3J5IGZvciB0aGUgZGlnZXN0LgorQGVuZCBkZWZ0eXBlZnVuCisKKworSW4gc29tZSBzaXR1YXRpb25zIGl0IG1pZ2h0IGJlIGhhcmQgdG8gcmVtZW1iZXIgdGhlIGFsZ29yaXRobSB1c2VkIGZvcgordGhlIG9uZ29pbmcgaGFzaGluZy4gVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBtaWdodCBiZSB1c2VkIHRvIGdldCB0aGF0CitpbmZvcm1hdGlvbjoKKworQGRlZnR5cGVmdW4gaW50IGdjcnlfbWRfZ2V0X2FsZ28gKGdjcnlfbWRfaGRfdCBAdmFye2h9KQorCitSZXRyaWV2ZSB0aGUgYWxnb3JpdGhtIHVzZWQgd2l0aCB0aGUgaGFuZGxlIEB2YXJ7aH0uICBOb3RlIHRoYXQgdGhpcworZG9lcyBub3Qgd29yayByZWxpYWJsZSBpZiBtb3JlIHRoYW4gb25lIGFsZ29yaXRobSBpcyBlbmFibGVkIGluIEB2YXJ7aH0uCitAZW5kIGRlZnR5cGVmdW4KKworVGhlIGZvbGxvd2luZyBtYWNybyBtaWdodCBhbHNvIGJlIHVzZWZ1bDoKKworQGRlZnR5cGVmdW4gaW50IGdjcnlfbWRfaXNfc2VjdXJlIChnY3J5X21kX2hkX3QgQHZhcntofSkKKworVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgd2hlbiB0aGUgZGlnZXN0IG9iamVjdCBAdmFye2h9IGlzIGFsbG9jYXRlZAoraW4gInNlY3VyZSBtZW1vcnkiOyBpLmUuIEB2YXJ7aH0gd2FzIGNyZWF0ZWQgd2l0aCB0aGUKK0Bjb2Rle0dDUllfTURfRkxBR19TRUNVUkV9LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGludCBnY3J5X21kX2lzX2VuYWJsZWQgKGdjcnlfbWRfaGRfdCBAdmFye2h9LCBpbnQgQHZhcnthbGdvfSkKKworVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgd2hlbiB0aGUgYWxnb3JpdGhtIEB2YXJ7YWxnb30gaGFzIGJlZW4KK2VuYWJsZWQgZm9yIHRoZSBkaWdlc3Qgb2JqZWN0IEB2YXJ7aH0uCitAZW5kIGRlZnR5cGVmdW4KKworCisKK1RyYWNraW5nIGJ1Z3MgcmVsYXRlZCB0byBoYXNoaW5nIGlzIG9mdGVuIGEgY3VtYmVyc29tZSB0YXNrIHdoaWNoCityZXF1aXJlcyB0byBhZGQgYSBsb3Qgb2YgcHJpbnRmIHN0YXRlbWVudHMgaW50byB0aGUgY29kZS4KK0xpYmdjcnlwdCBwcm92aWRlcyBhbiBlYXN5IHdheSB0byBhdm9pZCB0aGlzLiAgVGhlIGFjdHVhbCBkYXRhCitoYXNoZWQgY2FuIGJlIHdyaXR0ZW4gdG8gZmlsZXMgb24gcmVxdWVzdC4KKworQGRlZnR5cGVmdW4gdm9pZCBnY3J5X21kX2RlYnVnIChnY3J5X21kX2hkX3QgQHZhcntofSwgY29uc3QgY2hhciAqQHZhcntzdWZmaXh9KQorCitFbmFibGUgZGVidWdnaW5nIGZvciB0aGUgZGlnZXN0IG9iamVjdCB3aXRoIGhhbmRsZSBAdmFye2h9LiAgVGhpcworY3JlYXRlcyBjcmVhdGUgZmlsZXMgbmFtZWQgQGZpbGV7ZGJnbWQtPG4+LjxzdHJpbmc+fSB3aGlsZSBkb2luZyB0aGUKK2FjdHVhbCBoYXNoaW5nLiAgQHZhcntzdWZmaXh9IGlzIHRoZSBzdHJpbmcgcGFydCBpbiB0aGUgZmlsZW5hbWUuICBUaGUKK251bWJlciBpcyBhIGNvdW50ZXIgaW5jcmVtZW50ZWQgZm9yIGVhY2ggbmV3IGhhc2hpbmcuICBUaGUgZGF0YSBpbiB0aGUKK2ZpbGUgaXMgdGhlIHJhdyBkYXRhIGFzIHBhc3NlZCB0byBAY29kZXtnY3J5X21kX3dyaXRlfSBvcgorQGNvZGV7Z2NyeV9tZF9wdXRjfS4gIElmIEBjb2Rle05VTEx9IGlzIHVzZWQgZm9yIEB2YXJ7c3VmZml4fSwgdGhlCitkZWJ1Z2dpbmcgaXMgc3RvcHBlZCBhbmQgdGhlIGZpbGUgY2xvc2VkLiAgVGhpcyBpcyBvbmx5IHJhcmVseSByZXF1aXJlZAorYmVjYXVzZSBAY29kZXtnY3J5X21kX2Nsb3NlfSBpbXBsaWNpdGx5IHN0b3BzIGRlYnVnZ2luZy4KK0BlbmQgZGVmdHlwZWZ1bgorCisKK1RoZSBmb2xsb3dpbmcgdHdvIGRlcHJlY2F0ZWQgbWFjcm9zIGFyZSB1c2VkIGZvciBkZWJ1Z2dpbmcgYnkgb2xkIGNvZGUuCitUaGV5IHNob3B1bGQgYmUgcmVwbGFjZWQgYnkgQGNvZGV7Z2NyeV9tZF9kZWJ1Z30uCisKK0BkZWZ0eXBlZnVuIHZvaWQgZ2NyeV9tZF9zdGFydF9kZWJ1ZyAoZ2NyeV9tZF9oZF90IEB2YXJ7aH0sIGNvbnN0IGNoYXIgKkB2YXJ7c3VmZml4fSkKKworRW5hYmxlIGRlYnVnZ2luZyBmb3IgdGhlIGRpZ2VzdCBvYmplY3Qgd2l0aCBoYW5kbGUgQHZhcntofS4gIFRoaXMKK2NyZWF0ZXMgY3JlYXRlIGZpbGVzIG5hbWVkIEBmaWxle2RiZ21kLTxuPi48c3RyaW5nPn0gd2hpbGUgZG9pbmcgdGhlCithY3R1YWwgaGFzaGluZy4gIEB2YXJ7c3VmZml4fSBpcyB0aGUgc3RyaW5nIHBhcnQgaW4gdGhlIGZpbGVuYW1lLiAgVGhlCitudW1iZXIgaXMgYSBjb3VudGVyIGluY3JlbWVudGVkIGZvciBlYWNoIG5ldyBoYXNoaW5nLiAgVGhlIGRhdGEgaW4gdGhlCitmaWxlIGlzIHRoZSByYXcgZGF0YSBhcyBwYXNzZWQgdG8gQGNvZGV7Z2NyeV9tZF93cml0ZX0gb3IKK0Bjb2Rle2djcnlfbWRfcHV0Y30uCitAZW5kIGRlZnR5cGVmdW4KKworCitAZGVmdHlwZWZ1biB2b2lkIGdjcnlfbWRfc3RvcF9kZWJ1ZyAoZ2NyeV9tZF9oZF90IEB2YXJ7aH0sIGludCBAdmFye3Jlc2VydmVkfSkKKworU3RvcCBkZWJ1Z2dpbmcgb24gaGFuZGxlIEB2YXJ7aH0uICBAdmFye3Jlc2VydmVkfSBzaG91bGQgYmUgc3BlY2lmaWVkIGFzCiswLiAgVGhpcyBmdW5jdGlvbiBpcyB1c3VhbGx5IG5vdCByZXF1aXJlZCBiZWNhdXNlIEBjb2Rle2djcnlfbWRfY2xvc2V9Citkb2VzIGltcGxpY2l0bHkgc3RvcCBkZWJ1Z2dpbmcuCitAZW5kIGRlZnR5cGVmdW4KKworCitAYyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitAYyAqKioqKioqKioqKioqKioqKioqICBSYW5kb20gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitAYyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitAbm9kZSBSYW5kb20gTnVtYmVycworQGNoYXB0ZXIgUmFuZG9tIE51bWJlcnMKKworQG1lbnUKKyogUXVhbGl0eSBvZiByYW5kb20gbnVtYmVyczo6ICAgTGliZ2NyeXB0IHVzZXMgZGlmZmVyZW50IHF1YWxpdHkgbGV2ZWxzLgorKiBSZXRyaWV2aW5nIHJhbmRvbSBudW1iZXJzOjogICBIb3cgdG8gcmV0cmlldmUgcmFuZG9tIG51bWJlcnMuCitAZW5kIG1lbnUKKworQG5vZGUgUXVhbGl0eSBvZiByYW5kb20gbnVtYmVycworQHNlY3Rpb24gUXVhbGl0eSBvZiByYW5kb20gbnVtYmVycworCitAYWNyb255bXtMaWJnY3lwdH0gb2ZmZXJzIHJhbmRvbSBudW1iZXJzIG9mIGRpZmZlcmVudCBxdWFsaXR5IGxldmVsczoKKworQGRlZnRwIHtEYXRhIHR5cGV9IGdjcnlfcmFuZG9tX2xldmVsX3QKK1RoZSBjb25zdGFudHMgZm9yIHRoZSByYW5kb20gcXVhbGl0eSBsZXZlbHMgYXJlIG9mIHRoaXMgZW51bSB0eXBlLgorQGVuZCBkZWZ0cAorCitAdGFibGUgQGNvZGUKK0BpdGVtIEdDUllfV0VBS19SQU5ET00KK0ZvciBhbGwgZnVuY3Rpb25zLCBleGNlcHQgZm9yIEBjb2Rle2djcnlfbXBpX3JhbmRvbWl6ZX0sIHRoaXMgbGV2ZWwgbWFwcwordG8gR0NSWV9TVFJPTkdfUkFORE9NLiAgSWYgeW91IGRvIG5vdCB3YW50IHRoaXMsIGNvbnNpZGVyIHVzaW5nCitAY29kZXtnY3J5X2NyZWF0ZV9ub25jZX0uCitAaXRlbSBHQ1JZX1NUUk9OR19SQU5ET00KK1VzZSB0aGlzIGxldmVsIGZvciBzZXNzaW9uIGtleXMgYW5kIHNpbWlsYXIgcHVycG9zZXMuCitAaXRlbSBHQ1JZX1ZFUllfU1RST05HX1JBTkRPTQorVXNlIHRoaXMgbGV2ZWwgZm9yIGxvbmcgdGVybSBrZXkgbWF0ZXJpYWwuCitAZW5kIHRhYmxlCisKK0Bub2RlIFJldHJpZXZpbmcgcmFuZG9tIG51bWJlcnMKK0BzZWN0aW9uIFJldHJpZXZpbmcgcmFuZG9tIG51bWJlcnMKKworQGRlZnR5cGVmdW4gdm9pZCBnY3J5X3JhbmRvbWl6ZSAodW5zaWduZWQgY2hhciAqQHZhcntidWZmZXJ9LCBzaXplX3QgQHZhcntsZW5ndGh9LCBlbnVtIGdjcnlfcmFuZG9tX2xldmVsIEB2YXJ7bGV2ZWx9KQorCitGaWxsIEB2YXJ7YnVmZmVyfSB3aXRoIEB2YXJ7bGVuZ3RofSByYW5kb20gYnl0ZXMgdXNpbmcgYSByYW5kb20gcXVhbGl0eQorYXMgZGVmaW5lZCBieSBAdmFye2xldmVsfS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biB7dm9pZCAqfSBnY3J5X3JhbmRvbV9ieXRlcyAoc2l6ZV90IEB2YXJ7bmJ5dGVzfSwgZW51bSBnY3J5X3JhbmRvbV9sZXZlbCBAdmFye2xldmVsfSkKKworQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gYWxsb2NhdGUgYSBtZW1vcnkgYmxvY2sgY29uc2lzdGluZyBvZgorQHZhcntuYnl0ZXN9IGZyZXNoIHJhbmRvbSBieXRlcyB1c2luZyBhIHJhbmRvbSBxdWFsaXR5IGFzIGRlZmluZWQgYnkKK0B2YXJ7bGV2ZWx9LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIHt2b2lkICp9IGdjcnlfcmFuZG9tX2J5dGVzX3NlY3VyZSAoc2l6ZV90IEB2YXJ7bmJ5dGVzfSwgZW51bSBnY3J5X3JhbmRvbV9sZXZlbCBAdmFye2xldmVsfSkKKworQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gYWxsb2NhdGUgYSBtZW1vcnkgYmxvY2sgY29uc2lzdGluZyBvZgorQHZhcntuYnl0ZXN9IGZyZXNoIHJhbmRvbSBieXRlcyB1c2luZyBhIHJhbmRvbSBxdWFsaXR5IGFzIGRlZmluZWQgYnkKK0B2YXJ7bGV2ZWx9LiAgVGhpcyBmdW5jdGlvbiBkaWZmZXJzIGZyb20gQGNvZGV7Z2NyeV9yYW5kb21fYnl0ZXN9IGluCit0aGF0IHRoZSByZXR1cm5lZCBidWZmZXIgaXMgYWxsb2NhdGVkIGluIGEgYGBzZWN1cmUnJyBhcmVhIG9mIHRoZQorbWVtb3J5LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIHZvaWQgZ2NyeV9jcmVhdGVfbm9uY2UgKHVuc2lnbmVkIGNoYXIgKkB2YXJ7YnVmZmVyfSwgc2l6ZV90IEB2YXJ7bGVuZ3RofSkKKworRmlsbCBAdmFye2J1ZmZlcn0gd2l0aCBAdmFye2xlbmd0aH0gdW5wcmVkaWN0YWJsZSBieXRlcy4gIFRoaXMgaXMKK2NvbW1vbmx5IGNhbGxlZCBhIG5vbmNlIGFuZCBtYXkgYWxzbyBiZSB1c2VkIGZvciBpbml0aWFsaXphdGlvbgordmVjdG9ycyBhbmQgcGFkZGluZy4gIFRoaXMgaXMgYW4gZXh0cmEgZnVuY3Rpb24gbmVhcmx5IGluZGVwZW5kZW50IG9mCit0aGUgb3RoZXIgcmFuZG9tIGZ1bmN0aW9uIGZvciAzIHJlYXNvbnM6IEl0IGJldHRlciBwcm90ZWN0cyB0aGUKK3JlZ3VsYXIgcmFuZG9tIGdlbmVyYXRvcidzIGludGVybmFsIHN0YXRlLCBwcm92aWRlcyBiZXR0ZXIgcGVyZm9ybWFuY2UKK2FuZCBkb2VzIG5vdCBkcmFpbiB0aGUgcHJlY2lvdXMgZW50cm9weSBwb29sLgorCitAZW5kIGRlZnR5cGVmdW4KKworCisKK0BjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0BjICoqKioqKioqKioqKioqKioqKiogIFMtRXhwcmVzc2lvbnMgKioqKioqKioqKioqKioqKioqKioqKioKK0BjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Bub2RlIFMtZXhwcmVzc2lvbnMKK0BjaGFwdGVyIFMtZXhwcmVzc2lvbnMKKworUy1leHByZXNzaW9ucyBhcmUgdXNlZCBieSB0aGUgcHVibGljIGtleSBmdW5jdGlvbnMgdG8gcGFzcyBjb21wbGV4IGRhdGEKK3N0cnVjdHVyZXMgYXJvdW5kLiAgVGhlc2UgTElTUCBsaWtlIG9iamVjdHMgYXJlIHVzZWQgYnkgc29tZQorY3J5cHRvZ3JhcGhpYyBwcm90b2NvbHMgKGNmLiBSRkMtMjY5MikgYW5kIExpYmdjcnlwdCBwcm92aWRlcyBmdW5jdGlvbnMKK3RvIHBhcnNlIGFuZCBjb25zdHJ1Y3QgdGhlbS4gIEZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiwgc2VlCitAY2l0ZXtSb24gUml2ZXN0LCBjb2RlIGFuZCBkZXNjcmlwdGlvbiBvZiBTLWV4cHJlc3Npb25zLAorQHVyZWZ7aHR0cDovL3RoZW9yeS5sY3MubWl0LmVkdS9+cml2ZXN0L3NleHAuaHRtbH19LgorCitAbWVudQorKiBEYXRhIHR5cGVzIGZvciBTLWV4cHJlc3Npb25zOjogIERhdGEgdHlwZXMgcmVsYXRlZCB3aXRoIFMtZXhwcmVzc2lvbnMuCisqIFdvcmtpbmcgd2l0aCBTLWV4cHJlc3Npb25zOjogIEhvdyB0byB3b3JrIHdpdGggUy1leHByZXNzaW9ucy4KK0BlbmQgbWVudQorCitAbm9kZSBEYXRhIHR5cGVzIGZvciBTLWV4cHJlc3Npb25zCitAc2VjdGlvbiBEYXRhIHR5cGVzIGZvciBTLWV4cHJlc3Npb25zCisKK0BkZWZ0cCB7RGF0YSB0eXBlfSBnY3J5X3NleHBfdAorVGhlIEBjb2Rle2djcnlfc2V4cF90fSB0eXBlIGRlc2NyaWJlcyBhbiBvYmplY3Qgd2l0aCB0aGUgTGliZ2NyeXB0IGludGVybmFsCityZXByZXNlbnRhdGlvbiBvZiBhbiBTLWV4cHJlc3Npb24uCitAZW5kIGRlZnRwCisKK0Bub2RlIFdvcmtpbmcgd2l0aCBTLWV4cHJlc3Npb25zCitAc2VjdGlvbiBXb3JraW5nIHdpdGggUy1leHByZXNzaW9ucworCitAbm9pbmRlbnQKK1RoZXJlIGFyZSBzZXZlcmFsIGZ1bmN0aW9ucyB0byBjcmVhdGUgYW4gTGliZ2NyeXB0IFMtZXhwcmVzc2lvbiBvYmplY3QKK2Zyb20gaXRzIGV4dGVybmFsIHJlcHJlc2VudGF0aW9uIG9yIGZyb20gYSBzdHJpbmcgdGVtcGxhdGUuICBUaGVyZSBpcworYWxzbyBhIGZ1bmN0aW9uIHRvIGNvbnZlcnQgdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIGJhY2sgaW50byBvbmUgb2YKK3RoZSBleHRlcm5hbCBmb3JtYXRzOgorCisKK0BkZWZ0eXBlZnVuIGdjcnlfZXJyb3JfdCBnY3J5X3NleHBfbmV3IChAd3tnY3J5X3NleHBfdCAqQHZhcntyX3NleHB9fSwgQHd7Y29uc3Qgdm9pZCAqQHZhcntidWZmZXJ9fSwgQHd7c2l6ZV90IEB2YXJ7bGVuZ3RofX0sIEB3e2ludCBAdmFye2F1dG9kZXRlY3R9fSkKKworVGhpcyBpcyB0aGUgZ2VuZXJpYyBmdW5jdGlvbiB0byBjcmVhdGUgYW4gbmV3IFMtZXhwcmVzc2lvbiBvYmplY3QgZnJvbQoraXRzIGV4dGVybmFsIHJlcHJlc2VudGF0aW9uIGluIEB2YXJ7YnVmZmVyfSBvZiBAdmFye2xlbmd0aH0gYnl0ZXMuICBPbgorc3VjY2VzcyB0aGUgcmVzdWx0IGlzIHN0b3JlZCBhdCB0aGUgYWRkcmVzcyBnaXZlbiBieSBAdmFye3Jfc2V4cH0uIAorV2l0aCBAdmFye2F1dG9kZXRlY3R9IHNldCB0byAwLCB0aGUgZGF0YSBpbiBAdmFye2J1ZmZlcn0gaXMgZXhwZWN0ZWQgdG8KK2JlIGluIGNhbm9uaXplZCBmb3JtYXQsIHdpdGggQHZhcnthdXRvZGV0ZWN0fSBzZXQgdG8gMSB0aGUgcGFyc2VzIGFueSBvZgordGhlIGRlZmluZWQgZXh0ZXJuYWwgZm9ybWF0cy4gIElmIEB2YXJ7YnVmZmVyfSBkb2VzIG5vdCBob2xkIGEgdmFsaWQKK1MtZXhwcmVzc2lvbiBhbiBlcnJvciBjb2RlIGlzIHJldHVybmVkIGFuZCBAdmFye3Jfc2V4cH0gc2V0IHRvCitAY29kZXtOVUxMfS4KK05vdGUgdGhhdCB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciByZWxlYXNpbmcgdGhlIG5ld2x5IGFsbG9jYXRlZAorUy1leHByZXNzaW9uIHVzaW5nIEBjb2Rle2djcnlfc2V4cF9yZWxlYXNlfS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBnY3J5X2Vycm9yX3QgZ2NyeV9zZXhwX2NyZWF0ZSAoQHd7Z2NyeV9zZXhwX3QgKkB2YXJ7cl9zZXhwfX0sIEB3e3ZvaWQgKkB2YXJ7YnVmZmVyfX0sIEB3e3NpemVfdCBAdmFye2xlbmd0aH19LCBAd3tpbnQgQHZhcnthdXRvZGV0ZWN0fX0sIEB3e3ZvaWQgKCpAdmFye2ZyZWVmbmN9KSh2b2lkKil9KQorCitUaGlzIGZ1bmN0aW9uIGlzIGlkZW50aWNhbCB0byBAY29kZXtnY3J5X3NleHBfbmV3fSBidXQgaGFzIGFuIGV4dHJhCithcmd1bWVudCBAdmFye2ZyZWVmbmN9LCB3aGljaCwgd2hlbiBub3Qgc2V0IHRvIEBjb2Rle05VTEx9LCBpcyBleHBlY3RlZAordG8gYmUgYSBmdW5jdGlvbiB0byByZWxlYXNlIHRoZSBAdmFye2J1ZmZlcn07IG1vc3QgbGlrZWx5IHRoZSBzdGFuZGFyZAorQGNvZGV7ZnJlZX0gZnVuY3Rpb24gaXMgdXNlZCBmb3IgdGhpcyBhcmd1bWVudC4gIFRoaXMgaGFzIHRoZSBlZmZlY3Qgb2YKK3RyYW5zZmVycmluZyB0aGUgb3duZXJzaGlwIG9mIEB2YXJ7YnVmZmVyfSB0byB0aGUgY3JlYXRlZCBvYmplY3QgaW4KK0B2YXJ7cl9zZXhwfS4gIFRoZSBhZHZhbnRhZ2Ugb2YgdXNpbmcgdGhpcyBmdW5jdGlvbiBpcyB0aGF0IExpYmdjcnlwdAorbWlnaHQgZGVjaWRlIHRvIGRpcmVjdGx5IHVzZSB0aGUgcHJvdmlkZWQgYnVmZmVyIGFuZCB0aHVzIGF2b2lkIGV4dHJhCitjb3B5aW5nLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGdjcnlfZXJyb3JfdCBnY3J5X3NleHBfc3NjYW4gKEB3e2djcnlfc2V4cF90ICpAdmFye3Jfc2V4cH19LCBAd3tzaXplX3QgKkB2YXJ7ZXJyb2ZmfX0sIEB3e2NvbnN0IGNoYXIgKkB2YXJ7YnVmZmVyfX0sIEB3e3NpemVfdCBAdmFye2xlbmd0aH19KQorCitUaGlzIGlzIGFub3RoZXIgdmFyaWFudCBvZiB0aGUgYWJvdmUgZnVuY3Rpb25zLiAgSXQgYmVoYXZlcyBuZWFybHkKK2lkZW50aWNhbCBidXQgcHJvdmlkZXMgYW4gQHZhcntlcnJvZmZ9IGFyZ3VtZW50IHdoaWNoIHdpbGwgcmVjZWl2ZSB0aGUKK29mZnNldCBpbnRvIHRoZSBidWZmZXIgd2hlcmUgdGhlIHBhcnNpbmcgc3RvcHBlZCBvbiBlcnJvci4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBnY3J5X2Vycm9yX3QgZ2NyeV9zZXhwX2J1aWxkIChAd3tnY3J5X3NleHBfdCAqQHZhcntyX3NleHB9fSwgQHd7c2l6ZV90ICpAdmFye2Vycm9mZn19LCBAd3tjb25zdCBjaGFyICpAdmFye2Zvcm1hdH0sIC4uLn0pCisKK1RoaXMgZnVuY3Rpb24gY3JlYXRlcyBhbiBpbnRlcm5hbCBTLWV4cHJlc3Npb24gZnJvbSB0aGUgc3RyaW5nIHRlbXBsYXRlCitAdmFye2Zvcm1hdH0gYW5kIHN0b3JlcyBpdCBhdCB0aGUgYWRkcmVzcyBvZiBAdmFye3Jfc2V4cH0uIElmIHRoZXJlIGlzIGEKK3BhcnNpbmcgZXJyb3IsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGFuIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUgYW5kIHN0b3JlcwordGhlIG9mZnNldCBpbnRvIEB2YXJ7Zm9ybWF0fSB3aGVyZSB0aGUgcGFyc2luZyBzdG9wcGVkIGluIEB2YXJ7ZXJyb2ZmfS4KK1RoZSBmdW5jdGlvbiBzdXBwb3J0cyBhIGNvdXBsZSBvZiBwcmludGYtbGlrZSBmb3JtYXR0aW5nIGNoYXJhY3RlcnMgYW5kCitleHBlY3RzIGFyZ3VtZW50cyBmb3Igc29tZSBvZiB0aGVzZSBlc2NhcGUgc2VxdWVuY2VzIHJpZ2h0IGFmdGVyCitAdmFye2Zvcm1hdH0uICBUaGUgZm9sbG93aW5nIGZvcm1hdCBjaGFyYWN0ZXJzIGFyZSBkZWZpbmVkOgorCitAdGFibGUgQHNhbXAKK0BpdGVtICVtCitUaGUgbmV4dCBhcmd1bWVudCBpcyBleHBlY3RlZCB0byBiZSBvZiB0eXBlIEBjb2Rle2djcnlfbXBpX3R9IGFuZCBhIGNvcHkgb2YKK2l0cyB2YWx1ZSBpcyBpbnNlcnRlZCBpbnRvIHRoZSByZXN1bHRpbmcgUy1leHByZXNzaW9uLgorQGl0ZW0gJXMKK1RoZSBuZXh0IGFyZ3VtZW50IGlzIGV4cGVjdGVkIHRvIGJlIG9mIHR5cGUgQGNvZGV7Y2hhciAqfSBhbmQgdGhhdAorc3RyaW5nIGlzIGluc2VydGVkIGludG8gdGhlIHJlc3VsdGluZyBTLWV4cHJlc3Npb24uCitAaXRlbSAlZAorVGhlIG5leHQgYXJndW1lbnQgaXMgZXhwZWN0ZWQgdG8gYmUgb2YgdHlwZSBAY29kZXtpbnR9IGFuZCBpdHMgdmFsdWUgaXMKK2luc2VydGVkIGludG8gdGhlIHJlc3VsdGluZyBTLWV4cHJlc3Npb24uCitAaXRlbSAlYgorVGhlIG5leHQgYXJndW1lbnQgaXMgZXhwZWN0ZWQgdG8gYmUgb2YgdHlwZSBAY29kZXtpbnR9IGRpcmVjdGx5Citmb2xsb3dlZCBieSBhbiBhcmd1bWVudCBvZiB0eXBlIEBjb2Rle2NoYXIgKn0uICBUaGlzIHJlcHJlc2VudHMgYQorYnVmZmVyIG9mIGdpdmVuIGxlbmd0aCB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSByZXN1bHRpbmcgUy1leHByZXNzaW9uLgorQGl0ZW0gJVMKK1RoZSBuZXh0IGFyZ3VtZW50IGlzIGV4cGVjdGVkIHRvIGJlIG9mIHR5cGUgQGNvZGV7Z2NyeV9zZXhwX3R9IGFuZCBhCitjb3B5IG9mIHRoYXQgUy1leHByZXNzaW9uIGlzIGVtYmVkZGVkIGluIHRoZSByZXN1bHRpbmcgUy1leHByZXNzaW9uLgorVGhlIGFyZ3VtZW50IG5lZWRzIHRvIGJlIGEgcmVndWxhciBTLWV4cHJlc3Npb24sIHN0YXJ0aW5nIHdpdGggYQorcGFyZW50aGVzaXMuCisKK0BlbmQgdGFibGUKKworQG5vaW5kZW50CitObyBvdGhlciBmb3JtYXQgY2hhcmFjdGVycyBhcmUgZGVmaW5lZCBhbmQgd291bGQgcmV0dXJuIGFuIGVycm9yLiAgTm90ZQordGhhdCB0aGUgZm9ybWF0IGNoYXJhY3RlciBAc2FtcHslJX0gZG9lcyBub3QgZXhpc3RzLCBiZWNhdXNlIGEgcGVyY2VudAorc2lnbiBpcyBub3QgYSB2YWxpZCBjaGFyYWN0ZXIgaW4gYW4gUy1leHByZXNzaW9uLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIHZvaWQgZ2NyeV9zZXhwX3JlbGVhc2UgKEB3e2djcnlfc2V4cF90IEB2YXJ7c2V4cH19KQorCitSZWxlYXNlIHRoZSBTLWV4cHJlc3Npb24gb2JqZWN0IEB2YXJ7c2V4cH0uICBJZiB0aGUgUy1leHByZXNzaW9uIGlzCitzdG9yZWQgaW4gc2VjdXJlIG1lbW9yeSBpdCBleHBsaWNpdGx5IHplcm9pc2VzIHRoYXQgbWVtb3J5OyBub3RlIHRoYXQKK3RoaXMgaXMgZG9uZSBpbiBhZGRpdGlvbiB0byB0aGUgemVyb2lzYXRpb24gYWx3YXlzIGRvbmUgd2hlbiBmcmVlaW5nCitzZWN1cmUgbWVtb3J5LgorQGVuZCBkZWZ0eXBlZnVuCisKKworQG5vaW5kZW50CitUaGUgbmV4dCAyIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBjb252ZXJ0IHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbgorYmFjayBpbnRvIGEgcmVndWxhciBleHRlcm5hbCBTLWV4cHJlc3Npb24gZm9ybWF0IGFuZCB0byBzaG93IHRoZQorc3RydWN0dXJlIGZvciBkZWJ1Z2dpbmcuCisKK0BkZWZ0eXBlZnVuIHNpemVfdCBnY3J5X3NleHBfc3ByaW50IChAd3tnY3J5X3NleHBfdCBAdmFye3NleHB9fSwgQHd7aW50IEB2YXJ7bW9kZX19LCBAd3tjaGFyICpAdmFye2J1ZmZlcn19LCBAd3tzaXplX3QgQHZhcnttYXhsZW5ndGh9fSkKKworQ29waWVzIHRoZSBTLWV4cHJlc3Npb24gb2JqZWN0IEB2YXJ7c2V4cH0gaW50byBAdmFye2J1ZmZlcn0gdXNpbmcgdGhlCitmb3JtYXQgc3BlY2lmaWVkIGluIEB2YXJ7bW9kZX0uICBAdmFye21heGxlbmd0aH0gbXVzdCBiZSBzZXQgdG8gdGhlCithbGxvY2F0ZWQgbGVuZ3RoIG9mIEB2YXJ7YnVmZmVyfS4gIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBhY3R1YWwKK2xlbmd0aCBvZiB2YWxpZCBieXRlcyBwdXQgaW50byBAdmFye2J1ZmZlcn0gb3IgMCBpZiB0aGUgcHJvdmlkZWQgYnVmZmVyCitpcyB0b28gc2hvcnQuICBQYXNzaW5nIEBjb2Rle05VTEx9IGZvciBAdmFye2J1ZmZlcn0gcmV0dXJucyB0aGUgcmVxdWlyZWQKK2xlbmd0aCBmb3IgQHZhcntidWZmZXJ9LiAgRm9yIGNvbnZlbmllbmNlIHJlYXNvbnMgYW4gZXh0cmEgYnl0ZSB3aXRoCit2YWx1ZSAwIGlzIGFwcGVuZGVkIHRvIHRoZSBidWZmZXIuCisKK0Bub2luZGVudAorVGhlIGZvbGxvd2luZyBmb3JtYXRzIGFyZSBzdXBwb3J0ZWQ6CisKK0B0YWJsZSBAY29kZQorQGl0ZW0gR0NSWVNFWFBfRk1UX0RFRkFVTFQKK1JldHVybnMgYSBjb252ZW5pZW50IGV4dGVybmFsIFMtZXhwcmVzc2lvbiByZXByZXNlbnRhdGlvbi4KKworQGl0ZW0gR0NSWVNFWFBfRk1UX0NBTk9OCitSZXR1cm4gdGhlIFMtZXhwcmVzc2lvbiBpbiBjYW5vbmljYWwgZm9ybWF0LgorCitAaXRlbSBHQ1JZU0VYUF9GTVRfQkFTRTY0CitOb3QgY3VycmVudGx5IHN1cHBvcnRlZC4KKworQGl0ZW0gR0NSWVNFWFBfRk1UX0FEVkFOQ0VECitSZXR1cm5zIHRoZSBTLWV4cHJlc3Npb24gaW4gYWR2YW5jZWQgZm9ybWF0LgorQGVuZCB0YWJsZQorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIHZvaWQgZ2NyeV9zZXhwX2R1bXAgKEB3e2djcnlfc2V4cF90IEB2YXJ7c2V4cH19KQorCitEdW1wcyBAdmFye3NleHB9IGluIGEgZm9ybWF0IHN1aXRhYmxlIGZvciBkZWJ1Z2dpbmcgdG8gTGliZ2NyeXB0J3MKK2xvZ2dpbmcgc3RyZWFtLgorQGVuZCBkZWZ0eXBlZnVuCisKK0Bub2luZGVudAorT2Z0ZW4gY2Fub25pY2FsIGVuY29kaW5nIGlzIHVzZWQgaW4gdGhlIGV4dGVybmFsIHJlcHJlc2VudGF0aW9uLiAgVGhlCitmb2xsb3dpbmcgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY2hlY2sgZm9yIHZhbGlkIGVuY29kaW5nIGFuZCB0byBsZWFybgordGhlIGxlbmd0aCBvZiB0aGUgUy1leHByZXNzaW9uIgorCitAZGVmdHlwZWZ1biBzaXplX3QgZ2NyeV9zZXhwX2Nhbm9uX2xlbiAoQHd7Y29uc3QgdW5zaWduZWQgY2hhciAqQHZhcntidWZmZXJ9fSwgQHd7c2l6ZV90IEB2YXJ7bGVuZ3RofX0sIEB3e3NpemVfdCAqQHZhcntlcnJvZmZ9fSwgQHd7aW50ICpAdmFye2VycmNvZGV9fSkKKworU2NhbiB0aGUgY2Fub25pY2FsIGVuY29kZWQgQHZhcntidWZmZXJ9IHdpdGggaW1wbGljaXQgbGVuZ3RoIHZhbHVlcyBhbmQKK3JldHVybiB0aGUgYWN0dWFsIGxlbmd0aCB0aGlzIFMtZXhwcmVzc2lvbiB1c2VzLiAgRm9yIGEgdmFsaWQgUy1leHByZXNzaW9uCitpdCBzaG91bGQgbmV2ZXIgcmV0dXJuIDAuICBJZiBAdmFye2xlbmd0aH0gaXMgbm90IDAsIHRoZSBtYXhpbXVtCitsZW5ndGggdG8gc2NhbiBpcyBnaXZlbjsgdGhpcyBjYW4gYmUgdXNlZCBmb3Igc3ludGF4IGNoZWNrcyBvZgorZGF0YSBwYXNzZWQgZnJvbSBvdXRzaWRlLiAgQHZhcntlcnJjb2RlfSBhbmQgQHZhcntlcnJvZmZ9IG1heSBib3RoIGJlCitwYXNzZWQgYXMgQGNvZGV7TlVMTH0uCisKK0BlbmQgZGVmdHlwZWZ1bgorCisKK0Bub2luZGVudAorVGhlcmUgYXJlIGZ1bmN0aW9ucyB0byBwYXJzZSBTLWV4cHJlc3Npb25zIGFuZCByZXRyaWV2ZSBlbGVtZW50czoKKworQGRlZnR5cGVmdW4gZ2NyeV9zZXhwX3QgZ2NyeV9zZXhwX2ZpbmRfdG9rZW4gKEB3e2NvbnN0IGdjcnlfc2V4cF90IEB2YXJ7bGlzdH19LCBAd3tjb25zdCBjaGFyICpAdmFye3Rva2VufX0sIEB3e3NpemVfdCBAdmFye3Rva2xlbn19KQorCitTY2FuIHRoZSBTLWV4cHJlc3Npb24gZm9yIGEgc3VibGlzdCB3aXRoIGEgdHlwZSAodGhlIGNhciBvZiB0aGUgbGlzdCkKK21hdGNoaW5nIHRoZSBzdHJpbmcgQHZhcnt0b2tlbn0uICBJZiBAdmFye3Rva2xlbn0gaXMgbm90IDAsIHRoZSB0b2tlbiBpcworYXNzdW1lZCB0byBiZSByYXcgbWVtb3J5IG9mIHRoaXMgbGVuZ3RoLiAgVGhlIGZ1bmN0aW9uIHJldHVybnMgYSBuZXdseQorYWxsb2NhdGVkIFMtZXhwcmVzc2lvbiBjb25zaXN0aW5nIG9mIHRoZSBmb3VuZCBzdWJsaXN0IG9yIEBjb2Rle05VTEx9Cit3aGVuIG5vdCBmb3VuZC4KK0BlbmQgZGVmdHlwZWZ1bgorCisKK0BkZWZ0eXBlZnVuIGludCBnY3J5X3NleHBfbGVuZ3RoIChAd3tjb25zdCBnY3J5X3NleHBfdCBAdmFye2xpc3R9fSkKKworUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIEB2YXJ7bGlzdH0uICBGb3IgYSB2YWxpZCBTLWV4cHJlc3Npb24gdGhpcworc2hvdWxkIGJlIGF0IGxlYXN0IDEuCitAZW5kIGRlZnR5cGVmdW4KKworCitAZGVmdHlwZWZ1biBnY3J5X3NleHBfdCBnY3J5X3NleHBfbnRoIChAd3tjb25zdCBnY3J5X3NleHBfdCBAdmFye2xpc3R9fSwgQHd7aW50IEB2YXJ7bnVtYmVyfX0pCisKK0NyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IFMtZXhwcmVzc2lvbiBmcm9tIHRoZSBlbGVtZW50IHdpdGggaW5kZXggQHZhcntudW1iZXJ9IGluCitAdmFye2xpc3R9LiAgTm90ZSB0aGF0IHRoZSBmaXJzdCBlbGVtZW50IGhhcyB0aGUgaW5kZXggMC4gIElmIHRoZXJlIGlzCitubyBzdWNoIGVsZW1lbnQsIEBjb2Rle05VTEx9IGlzIHJldHVybmVkLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGdjcnlfc2V4cF90IGdjcnlfc2V4cF9jYXIgKEB3e2NvbnN0IGdjcnlfc2V4cF90IEB2YXJ7bGlzdH19KQorCitDcmVhdGUgYW5kIHJldHVybiBhIG5ldyBTLWV4cHJlc3Npb24gZnJvbSB0aGUgZmlyc3QgZWxlbWVudCBpbgorQHZhcntsaXN0fTsgdGhpcyBjYWxsZWQgdGhlICJ0eXBlIiBhbmQgc2hvdWxkIGFsd2F5cyBleGlzdCBhbmQgYmUgYQorc3RyaW5nLiBAY29kZXtOVUxMfSBpcyByZXR1cm5lZCBpbiBjYXNlIG9mIGEgcHJvYmxlbS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBnY3J5X3NleHBfdCBnY3J5X3NleHBfY2RyIChAd3tjb25zdCBnY3J5X3NleHBfdCBAdmFye2xpc3R9fSkKKworQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgbGlzdCBmb3JtIGFsbCBlbGVtZW50cyBleGNlcHQgZm9yIHRoZSBmaXJzdCBvbmUuCitOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBtYXkgcmV0dXJuIGFuIGludmFsaWQgUy1leHByZXNzaW9uIGJlY2F1c2UgaXQKK2lzIG5vdCBndWFyYW50ZWVkLCB0aGF0IHRoZSB0eXBlIGV4aXN0cyBhbmQgaXMgYSBzdHJpbmcuICBIb3dldmVyLCBmb3IKK3BhcnNpbmcgYSBjb21wbGV4IFMtZXhwcmVzc2lvbiBpdCBtaWdodCBiZSB1c2VmdWwgZm9yIGludGVybWVkaWF0ZQorbGlzdHMuICBSZXR1cm5zIEBjb2Rle05VTEx9IG9uIGVycm9yLgorQGVuZCBkZWZ0eXBlZnVuCisKKworQGRlZnR5cGVmdW4ge2NvbnN0IGNoYXIgKn0gZ2NyeV9zZXhwX250aF9kYXRhIChAd3tjb25zdCBnY3J5X3NleHBfdCBAdmFye2xpc3R9fSwgQHd7aW50IEB2YXJ7bnVtYmVyfX0sIEB3e3NpemVfdCAqQHZhcntkYXRhbGVufX0pCisKK1RoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBnZXQgZGF0YSBmcm9tIGEgQHZhcntsaXN0fS4gIEEgcG9pbnRlciB0byB0aGUKK2FjdHVhbCBkYXRhIHdpdGggaW5kZXggQHZhcntudW1iZXJ9IGlzIHJldHVybmVkIGFuZCB0aGUgbGVuZ3RoIG9mIHRoaXMKK2RhdGEgd2lsbCBiZSBzdG9yZWQgdG8gQHZhcntkYXRhbGVufS4gIElmIHRoZXJlIGlzIG5vIGRhdGEgYXQgdGhlIGdpdmVuCitpbmRleCBvciB0aGUgaW5kZXggcmVwcmVzZW50cyBhbm90aGVyIGxpc3QsIEBjb2Rle05VTEx9IGlzIHJldHVybmVkLgorQHN0cm9uZ3tDYXV0aW9uOn0gVGhlIHJldHVybmVkIHBvaW50ZXIgaXMgdmFsaWQgYXMgbG9uZyBhcyBAdmFye2xpc3R9IGlzCitub3QgbW9kaWZpZWQgb3IgcmVsZWFzZWQuCisKK0Bub2luZGVudAorSGVyZSBpcyBhbiBleGFtcGxlIG9uIGhvdyB0byBleHRyYWN0IGFuZCBwcmludCB0aGUgc3VybmFtZSAoTWVpZXIpIGZyb20KK3RoZSBTLWV4cHJlc3Npb24gQHNhbXB7KE5hbWUgT3R0byBNZWllciAoYWRkcmVzcyBCdXJncGxhdHogMykpfToKKworQGV4YW1wbGUKK3NpemVfdCBsZW47Citjb25zdCBjaGFyICpuYW1lOworCituYW1lID0gZ2NyeV9zZXhwX250aF9kYXRhIChsaXN0LCAyLCAmbGVuKTsKK3ByaW50ZiAoIm15IG5hbWUgaXMgJS4qc1xuIiwgKGludClsZW4sIG5hbWUpOworQGVuZCBleGFtcGxlCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4ge2NoYXIgKn0gZ2NyeV9zZXhwX250aF9zdHJpbmcgKEB3e2djcnlfc2V4cF90IEB2YXJ7bGlzdH19LCBAd3tpbnQgQHZhcntudW1iZXJ9fSkKKworVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGdldCBhbmQgY29udmVydCBkYXRhIGZyb20gYSBAdmFye2xpc3R9LiBUaGUKK2RhdGEgaXMgYXNzdW1lZCB0byBiZSBhIE51bCB0ZXJtaW5hdGVkIHN0cmluZy4gIFRoZSBjYWxsZXIgbXVzdAorcmVsZWFzZSB0aGlzIHJldHVybmVkIHZhbHVlIHVzaW5nIEBjb2Rle2djcnlfZnJlZX0uICBJZiB0aGVyZSBpcworbm8gZGF0YSBhdCB0aGUgZ2l2ZW4gaW5kZXgsIHRoZSBpbmRleCByZXByZXNlbnRzIGEgbGlzdCBvciB0aGUgdmFsdWUKK2Nhbid0IGJlIGNvbnZlcnRlZCB0byBhIHN0cmluZywgQGNvZGV7TlVMTH0gaXMgcmV0dXJuZWQuCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gZ2NyeV9tcGlfdCBnY3J5X3NleHBfbnRoX21waSAoQHd7Z2NyeV9zZXhwX3QgQHZhcntsaXN0fX0sIEB3e2ludCBAdmFye251bWJlcn19LCBAd3tpbnQgQHZhcnttcGlmbXR9fSkKKworVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGdldCBhbmQgY29udmVydCBkYXRhIGZyb20gYSBAdmFye2xpc3R9LiBUaGlzCitkYXRhIGlzIGFzc3VtZWQgdG8gYmUgYW4gTVBJIHN0b3JlZCBpbiB0aGUgZm9ybWF0IGRlc2NyaWJlZCBieQorQHZhcnttcGlmbXR9IGFuZCByZXR1cm5lZCBhcyBhIHN0YW5kYXJkIExpYmdjcnlwdCBNUEkuICBUaGUgY2FsbGVyIG11c3QKK3JlbGVhc2UgdGhpcyByZXR1cm5lZCB2YWx1ZSB1c2luZyBAY29kZXtnY3J5X21waV9yZWxlYXNlfS4gIElmIHRoZXJlIGlzCitubyBkYXRhIGF0IHRoZSBnaXZlbiBpbmRleCwgdGhlIGluZGV4IHJlcHJlc2VudHMgYSBsaXN0IG9yIHRoZSB2YWx1ZQorY2FuJ3QgYmUgY29udmVydGVkIHRvIGFuIE1QSSwgQGNvZGV7TlVMTH0gaXMgcmV0dXJuZWQuCitAZW5kIGRlZnR5cGVmdW4KKworCitAYyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitAYyAqKioqKioqKioqKioqKioqKioqICBNUElzICoqKioqKioqICoqKioqKioqKioqKioqKioqKioqKioqCitAYyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitAbm9kZSBNUEkgbGlicmFyeQorQGNoYXB0ZXIgTVBJIGxpYnJhcnkKKworQG1lbnUKKyogRGF0YSB0eXBlczo6ICAgICAgICAgICAgICAgICAgTVBJIHJlbGF0ZWQgZGF0YSB0eXBlcy4KKyogQmFzaWMgZnVuY3Rpb25zOjogICAgICAgICAgICAgRmlyc3Qgc3RlcHMgd2l0aCBNUEkgbnVtYmVycy4KKyogTVBJIGZvcm1hdHM6OiAgICAgICAgICAgICAgICAgRXh0ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgTVBJcy4KKyogQ2FsY3VsYXRpb25zOjogICAgICAgICAgICAgICAgUGVyZm9ybWluZyBNUEkgY2FsY3VsYXRpb25zLgorKiBDb21wYXJpc29uczo6ICAgICAgICAgICAgICAgICBIb3cgdG8gY29tcGFyZSBNUEkgdmFsdWVzLgorKiBCaXQgbWFuaXB1bGF0aW9uczo6ICAgICAgICAgICBIb3cgdG8gYWNjZXNzIHNpbmdsZSBiaXRzIG9mIE1QSSB2YWx1ZXMuCisqIE1pc2NlbGxhbmVvdXM6OiAgICAgICAgICAgICAgIE1pc2NlbGxhbmVvdXMgTVBJIGZ1bmN0aW9ucy4KK0BlbmQgbWVudQorCitQdWJsaWMga2V5IGNyeXB0b2dyYXBoeSBpcyBiYXNlZCBvbiBtYXRoZW1hdGljcyB3aXRoIGxhcmdlIG51bWJlcnMuICBUbworaW1wbGVtZW50IHRoZSBwdWJsaWMga2V5IGZ1bmN0aW9ucywgYSBsaWJyYXJ5IGZvciBoYW5kbGluZyB0aGVzZSBsYXJnZQorbnVtYmVycyBpcyByZXF1aXJlZC4gIEJlY2F1c2Ugb2YgdGhlIGdlbmVyYWwgdXNlZnVsbmVzcyBvZiBzdWNoIGEKK2xpYnJhcnksIGl0cyBpbnRlcmZhY2UgaXMgZXhwb3NlZCBieSBMaWJnY3J5cHQuIAorSW4gdGhlIGNvbnRleHQgb2YgTGliZ2NyeXB0IGFuZCBpbiBtb3N0IG90aGVyIGFwcGxpY2F0aW9ucywgdGhlc2UgbGFyZ2UKK251bWJlcnMgYXJlIGNhbGxlZCBNUElzIChtdWx0aS1wcmVjaXNpb24taW50ZWdlcnMpLgorCitAbm9kZSBEYXRhIHR5cGVzCitAc2VjdGlvbiBEYXRhIHR5cGVzCisKK0BkZWZ0cCB7RGF0YSB0eXBlfSB7Z2NyeV9tcGlfdH0KK1RoaXMgdHlwZSByZXByZXNlbnRzIGFuIG9iamVjdCB0byBob2xkIGFuIE1QSS4KK0BlbmQgZGVmdHAKKworQG5vZGUgQmFzaWMgZnVuY3Rpb25zCitAc2VjdGlvbiBCYXNpYyBmdW5jdGlvbnMKKworQG5vaW5kZW50CitUbyB3b3JrIHdpdGggTVBJcywgc3RvcmFnZSBtdXN0IGJlIGFsbG9jYXRlZCBhbmQgcmVsZWFzZWQgZm9yIHRoZQorbnVtYmVycy4gIFRoaXMgY2FuIGJlIGRvbmUgd2l0aCBvbmUgb2YgdGhlc2UgZnVuY3Rpb25zOgorCitAZGVmdHlwZWZ1biBnY3J5X21waV90IGdjcnlfbXBpX25ldyAoQHd7dW5zaWduZWQgaW50IEB2YXJ7bmJpdHN9fSkKKworQWxsb2NhdGUgYSBuZXcgTVBJIG9iamVjdCwgaW5pdGlhbGl6ZSBpdCB0byAwIGFuZCBpbml0aWFsbHkgYWxsb2NhdGUKK2Vub3VnaCBtZW1vcnkgZm9yIGEgbnVtYmVyIG9mIGF0IGxlYXN0IEB2YXJ7bmJpdHN9LiAgVGhpcyBwcmUtYWxsb2NhdGlvbiBpcworb25seSBhIHNtYWxsIHBlcmZvcm1hbmNlIGlzc3VlIGFuZCBub3QgYWN0dWFsbHkgbmVjZXNzYXJ5IGJlY2F1c2UKK0xpYmdjcnlwdCBhdXRvbWF0aWNhbGx5IHJlLWFsbG9jYXRlcyB0aGUgcmVxdWlyZWQgbWVtb3J5LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGdjcnlfbXBpX3QgZ2NyeV9tcGlfc25ldyAoQHd7dW5zaWduZWQgaW50IEB2YXJ7bmJpdHN9fSkKKworVGhpcyBpcyBpZGVudGljYWwgdG8gQGNvZGV7Z2NyeV9tcGlfbmV3fSBidXQgYWxsb2NhdGVzIHRoZSBNUEkgaW4gdGhlIHNvCitjYWxsZWQgInNlY3VyZSBtZW1vcnkiIHdoaWNoIGluIHR1cm4gd2lsbCB0YWtlIGNhcmUgdGhhdCBhbGwgZGVyaXZlZAordmFsdWVzIHdpbGwgYWxzbyBiZSBzdG9yZWQgaW4gdGhpcyAic2VjdXJlIG1lbW9yeSIuICBVc2UgdGhpcyBmb3IgaGlnaGx5Citjb25maWRlbnRpYWwgZGF0YSBsaWtlIHByaXZhdGUga2V5IHBhcmFtZXRlcnMuCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gZ2NyeV9tcGlfdCBnY3J5X21waV9jb3B5IChAd3tjb25zdCBnY3J5X21waV90IEB2YXJ7YX19KQorCitDcmVhdGUgYSBuZXcgTVBJIGFzIHRoZSBleGFjdCBjb3B5IG9mIEB2YXJ7YX0uCitAZW5kIGRlZnR5cGVmdW4KKworCitAZGVmdHlwZWZ1biB2b2lkIGdjcnlfbXBpX3JlbGVhc2UgKEB3e2djcnlfbXBpX3QgQHZhcnthfX0pCisKK1JlbGVhc2UgdGhlIE1QSSBAdmFye2F9IGFuZCBmcmVlIGFsbCBhc3NvY2lhdGVkIHJlc291cmNlcy4gIFBhc3NpbmcKK0Bjb2Rle05VTEx9IGlzIGFsbG93ZWQgYW5kIGlnbm9yZWQuICBXaGVuIGEgTVBJIHN0b3JlZCBpbiB0aGUgInNlY3VyZQorbWVtb3J5IiBpcyByZWxlYXNlZCwgdGhhdCBtZW1vcnkgZ2V0cyB3aXBlZCBvdXQgaW1tZWRpYXRlbHkuCitAZW5kIGRlZnR5cGVmdW4KKworQG5vaW5kZW50CitUaGUgc2ltcGxlc3Qgb3BlcmF0aW9ucyBhcmUgdXNlZCB0byBhc3NpZ24gYSBuZXcgdmFsdWUgdG8gYW4gTVBJOgorCitAZGVmdHlwZWZ1biBnY3J5X21waV90IGdjcnlfbXBpX3NldCAoQHd7Z2NyeV9tcGlfdCBAdmFye3d9fSwgQHd7Y29uc3QgZ2NyeV9tcGlfdCBAdmFye3V9fSkKKworQXNzaWduIHRoZSB2YWx1ZSBvZiBAdmFye3V9IHRvIEB2YXJ7d30gYW5kIHJldHVybiBAdmFye3d9LiAgSWYKK0Bjb2Rle05VTEx9IGlzIHBhc3NlZCBmb3IgQHZhcnt3fSwgYSBuZXcgTVBJIGlzIGFsbG9jYXRlZCwgc2V0IHRvIHRoZQordmFsdWUgb2YgQHZhcnt1fSBhbmQgcmV0dXJuZWQuCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gZ2NyeV9tcGlfdCBnY3J5X21waV9zZXRfdWkgKEB3e2djcnlfbXBpX3QgQHZhcnt3fX0sIEB3e3Vuc2lnbmVkIGxvbmcgQHZhcnt1fX0pCisKK0Fzc2lnbiB0aGUgdmFsdWUgb2YgQHZhcnt1fSB0byBAdmFye3d9IGFuZCByZXR1cm4gQHZhcnt3fS4gIElmCitAY29kZXtOVUxMfSBpcyBwYXNzZWQgZm9yIEB2YXJ7d30sIGEgbmV3IE1QSSBpcyBhbGxvY2F0ZWQsIHNldCB0byB0aGUKK3ZhbHVlIG9mIEB2YXJ7dX0gYW5kIHJldHVybmVkLiAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhbiBAY29kZXt1bnNpZ25lZAoraW50fSBhcyB0eXBlIGZvciBAdmFye3V9IGFuZCB0aHVzIGl0IGlzIG9ubHkgcG9zc2libGUgdG8gc2V0IEB2YXJ7d30gdG8KK3NtYWxsIHZhbHVlcyAodXN1YWxseSB1cCB0byB0aGUgd29yZCBzaXplIG9mIHRoZSBDUFUpLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIHZvaWQgZ2NyeV9tcGlfc3dhcCAoQHd7Z2NyeV9tcGlfdCBAdmFye2F9fSwgQHd7Z2NyeV9tcGlfdCBAdmFye2J9fSkKKworU3dhcCB0aGUgdmFsdWVzIG9mIEB2YXJ7YX0gYW5kIEB2YXJ7Yn0uCitAZW5kIGRlZnR5cGVmdW4KKworQG5vZGUgTVBJIGZvcm1hdHMKK0BzZWN0aW9uIE1QSSBmb3JtYXRzCisKK0Bub2luZGVudAorVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gY29udmVydCBiZXR3ZWVuIGFuIGV4dGVybmFsCityZXByZXNlbnRhdGlvbiBvZiBhbiBNUEkgYW5kIHRoZSBpbnRlcm5hbCBvbmUgb2YgTGliZ2NyeXB0LgorCitAZGVmdHlwZWZ1biBnY3J5X2Vycm9yX3QgZ2NyeV9tcGlfc2NhbiAoQHd7Z2NyeV9tcGlfdCAqQHZhcntyX21waX19LCBAd3tlbnVtIGdjcnlfbXBpX2Zvcm1hdCBAdmFye2Zvcm1hdH19LCBAd3tjb25zdCB1bnNpZ25lZCBjaGFyICpAdmFye2J1ZmZlcn19LCBAd3tzaXplX3QgQHZhcntidWZsZW59fSwgQHd7c2l6ZV90ICpAdmFye25zY2FubmVkfX0pCisKK0NvbnZlcnQgdGhlIGV4dGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIGFuIGludGVnZXIgc3RvcmVkIGluIEB2YXJ7YnVmZmVyfQord2l0aCBhIGxlbmd0aCBvZiBAdmFye2J1Zmxlbn0gaW50byBhIG5ld2x5IGNyZWF0ZWQgTVBJIHJldHVybmVkIHdoaWNoCit3aWxsIGJlIHN0b3JlZCBhdCB0aGUgYWRkcmVzcyBvZiBAdmFye3JfbXBpfS4gIEZvciBjZXJ0YWluIGZvcm1hdHMgdGhlCitsZW5ndGggYXJndW1lbnQgaXMgbm90IHJlcXVpcmVkIGFuZCBzaG91bGQgYmUgcGFzc2VkIGFzIEBjb2RlezB9LiAgQWZ0ZXIgYQorc3VjY2Vzc2Z1bCBvcGVyYXRpb24gdGhlIHZhcmlhYmxlIEB2YXJ7bnNjYW5uZWR9IHJlY2VpdmVzIHRoZSBudW1iZXIgb2YKK2J5dGVzIGFjdHVhbGx5IHNjYW5uZWQgdW5sZXNzIEB2YXJ7bnNjYW5uZWR9IHdhcyBnaXZlbiBhcworQGNvZGV7TlVMTH0uIEB2YXJ7Zm9ybWF0fSBkZXNjcmliZXMgdGhlIGZvcm1hdCBvZiB0aGUgTVBJIGFzIHN0b3JlZCBpbgorQHZhcntidWZmZXJ9OgorCitAdGFibGUgQGNvZGUKK0BpdGVtIEdDUllNUElfRk1UX1NURAorMi1jb21wbGVtZW50IHN0b3JlZCB3aXRob3V0IGEgbGVuZ3RoIGhlYWRlci4KKworQGl0ZW0gR0NSWU1QSV9GTVRfUEdQCitBcyB1c2VkIGJ5IE9wZW5QR1AgKG9ubHkgZGVmaW5lZCBhcyB1bnNpZ25lZCkuIFRoaXMgaXMgYmFzaWNhbGx5CitAY29kZXtHQ1JZTVBJX0ZNVF9TVER9IHdpdGggYSAyIGJ5dGUgYmlnIGVuZGlhbiBsZW5ndGggaGVhZGVyLgorCitAaXRlbSBHQ1JZTVBJX0ZNVF9TU0gKK0FzIHVzZWQgaW4gdGhlIFNlY3VyZSBTaGVsbCBwcm90b2NvbC4gIFRoaXMgaXMgQGNvZGV7R0NSWU1QSV9GTVRfU1REfQord2l0aCBhIDQgYnl0ZSBiaWcgZW5kaWFuIGhlYWRlci4KKworQGl0ZW0gR0NSWU1QSV9GTVRfSEVYCitTdG9yZWQgYXMgYSBDIHN0eWxlIHN0cmluZyB3aXRoIGVhY2ggYnl0ZSBvZiB0aGUgTVBJIGVuY29kZWQgYXMgMiBoZXgKK2RpZ2l0cy4gIFdoZW4gdXNpbmcgdGhpcyBmb3JtYXQsIEB2YXJ7YnVmbGVufSBtdXN0IGJlIHplcm8uCisKK0BpdGVtIEdDUllNUElfRk1UX1VTRworU2ltcGxlIHVuc2lnbmVkIGludGVnZXIuCitAZW5kIHRhYmxlCisKK0Bub2luZGVudAorTm90ZSB0aGF0IGFsbCBvZiB0aGUgYWJvdmUgZm9ybWF0cyBzdG9yZSB0aGUgaW50ZWdlciBpbiBiaWctZW5kaWFuCitmb3JtYXQgKE1TQiBmaXJzdCkuCitAZW5kIGRlZnR5cGVmdW4KKworCitAZGVmdHlwZWZ1biBnY3J5X2Vycm9yX3QgZ2NyeV9tcGlfcHJpbnQgKEB3e2VudW0gZ2NyeV9tcGlfZm9ybWF0IEB2YXJ7Zm9ybWF0fX0sIEB3e3Vuc2lnbmVkIGNoYXIgKkB2YXJ7YnVmZmVyfX0sIEB3e3NpemVfdCBAdmFye2J1Zmxlbn19LCBAd3tzaXplX3QgKkB2YXJ7bndyaXR0ZW59fSwgQHd7Y29uc3QgZ2NyeV9tcGlfdCBAdmFye2F9fSkKKworQ29udmVydCB0aGUgTVBJIEB2YXJ7YX0gaW50byBhbiBleHRlcm5hbCByZXByZXNlbnRhdGlvbiBkZXNjcmliZWQgYnkKK0B2YXJ7Zm9ybWF0fSAoc2VlIGFib3ZlKSBhbmQgc3RvcmUgaXQgaW4gdGhlIHByb3ZpZGVkIEB2YXJ7YnVmZmVyfQord2hpY2ggaGFzIGEgdXNhYmxlIGxlbmd0aCBvZiBhdCBsZWFzdCB0aGUgQHZhcntidWZsZW59IGJ5dGVzLiBJZgorQHZhcntud3JpdHRlbn0gaXMgbm90IE5VTEwsIGl0IHdpbGwgcmVjZWl2ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzCithY3R1YWxseSBzdG9yZWQgaW4gQHZhcntidWZmZXJ9IGFmdGVyIGEgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gZ2NyeV9lcnJvcl90IGdjcnlfbXBpX2FwcmludCAoQHd7ZW51bSBnY3J5X21waV9mb3JtYXQgQHZhcntmb3JtYXR9fSwgQHd7dW5zaWduZWQgY2hhciAqKkB2YXJ7YnVmZmVyfX0sIEB3e3NpemVfdCAqQHZhcntuYnl0ZXN9fSwgQHd7Y29uc3QgZ2NyeV9tcGlfdCBAdmFye2F9fSkKKworQ29udmVydCB0aGUgTVBJIEB2YXJ7YX0gaW50byBhbiBleHRlcm5hbCByZXByZXNlbnRhdGlvbiBkZXNjcmliZWQgYnkKK0B2YXJ7Zm9ybWF0fSAoc2VlIGFib3ZlKSBhbmQgc3RvcmUgaXQgaW4gYSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyIHdoaWNoCithZGRyZXNzIHdpbGwgYmUgc3RvcmVkIGluIHRoZSB2YXJpYWJsZSBAdmFye2J1ZmZlcn0gcG9pbnRzIHRvLiAgVGhlCitudW1iZXIgb2YgYnl0ZXMgc3RvcmVkIGluIHRoaXMgYnVmZmVyIHdpbGwgYmUgc3RvcmVkIGluIHRoZSB2YXJpYWJsZQorQHZhcntuYnl0ZXN9IHBvaW50cyB0bywgdW5sZXNzIEB2YXJ7bmJ5dGVzfSBpcyBAY29kZXtOVUxMfS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biB2b2lkIGdjcnlfbXBpX2R1bXAgKEB3e2NvbnN0IGdjcnlfbXBpX3QgQHZhcnthfX0pCisKK0R1bXAgdGhlIHZhbHVlIG9mIEB2YXJ7YX0gaW4gYSBmb3JtYXQgc3VpdGFibGUgZm9yIGRlYnVnZ2luZyB0bworTGliZ2NyeXB0J3MgbG9nZ2luZyBzdHJlYW0uICBOb3RlIHRoYXQgb25lIGxlYWRpbmcgc3BhY2UgYnV0IG5vIHRyYWlsaW5nCitzcGFjZSBvciBsaW5lZmVlZCB3aWxsIGJlIHByaW50ZWQuICBJdCBpcyBva2F5IHRvIHBhc3MgQGNvZGV7TlVMTH0gZm9yCitAdmFye2F9LgorQGVuZCBkZWZ0eXBlZnVuCisKKworQG5vZGUgQ2FsY3VsYXRpb25zCitAc2VjdGlvbiBDYWxjdWxhdGlvbnMKKworQG5vaW5kZW50CitCYXNpYyBhcml0aG1ldGljIG9wZXJhdGlvbnM6CisKK0BkZWZ0eXBlZnVuIHZvaWQgZ2NyeV9tcGlfYWRkIChAd3tnY3J5X21waV90IEB2YXJ7d319LCBAd3tnY3J5X21waV90IEB2YXJ7dX19LCBAd3tnY3J5X21waV90IEB2YXJ7dn19KQorCitAbWF0aHtAdmFye3d9ID0gQHZhcnt1fSArIEB2YXJ7dn19LgorQGVuZCBkZWZ0eXBlZnVuCisKKworQGRlZnR5cGVmdW4gdm9pZCBnY3J5X21waV9hZGRfdWkgKEB3e2djcnlfbXBpX3QgQHZhcnt3fX0sIEB3e2djcnlfbXBpX3QgQHZhcnt1fX0sIEB3e3Vuc2lnbmVkIGxvbmcgQHZhcnt2fX0pCisKK0BtYXRoe0B2YXJ7d30gPSBAdmFye3V9ICsgQHZhcnt2fX0uICBOb3RlIHRoYXQgQHZhcnt2fSBpcyBhbiB1bnNpZ25lZCBpbnRlZ2VyLgorQGVuZCBkZWZ0eXBlZnVuCisKKworQGRlZnR5cGVmdW4gdm9pZCBnY3J5X21waV9hZGRtIChAd3tnY3J5X21waV90IEB2YXJ7d319LCBAd3tnY3J5X21waV90IEB2YXJ7dX19LCBAd3tnY3J5X21waV90IEB2YXJ7dn19LCBAd3tnY3J5X21waV90IEB2YXJ7bX19KQorCitAbWF0aHtAdmFye3d9ID0gQHZhcnt1fSArIEB2YXJ7dn0gXGJtb2QgQHZhcnttfX0uCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gdm9pZCBnY3J5X21waV9zdWIgKEB3e2djcnlfbXBpX3QgQHZhcnt3fX0sIEB3e2djcnlfbXBpX3QgQHZhcnt1fX0sIEB3e2djcnlfbXBpX3QgQHZhcnt2fX0pCisKK0BtYXRoe0B2YXJ7d30gPSBAdmFye3V9IC0gQHZhcnt2fX0uCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gdm9pZCBnY3J5X21waV9zdWJfdWkgKEB3e2djcnlfbXBpX3QgQHZhcnt3fX0sIEB3e2djcnlfbXBpX3QgQHZhcnt1fX0sIEB3e3Vuc2lnbmVkIGxvbmcgQHZhcnt2fX0pCisKK0BtYXRoe0B2YXJ7d30gPSBAdmFye3V9IC0gQHZhcnt2fX0uICBAdmFye3Z9IGlzIGFuIHVuc2lnbmVkIGludGVnZXIuCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gdm9pZCBnY3J5X21waV9zdWJtIChAd3tnY3J5X21waV90IEB2YXJ7d319LCBAd3tnY3J5X21waV90IEB2YXJ7dX19LCBAd3tnY3J5X21waV90IEB2YXJ7dn19LCBAd3tnY3J5X21waV90IEB2YXJ7bX19KQorCitAbWF0aHtAdmFye3d9ID0gQHZhcnt1fSAtIEB2YXJ7dn0gXGJtb2QgQHZhcnttfX0uCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gdm9pZCBnY3J5X21waV9tdWwgKEB3e2djcnlfbXBpX3QgQHZhcnt3fX0sIEB3e2djcnlfbXBpX3QgQHZhcnt1fX0sIEB3e2djcnlfbXBpX3QgQHZhcnt2fX0pCisKK0BtYXRoe0B2YXJ7d30gPSBAdmFye3V9ICogQHZhcnt2fX0uCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gdm9pZCBnY3J5X21waV9tdWxfdWkgKEB3e2djcnlfbXBpX3QgQHZhcnt3fX0sIEB3e2djcnlfbXBpX3QgQHZhcnt1fX0sIEB3e3Vuc2lnbmVkIGxvbmcgQHZhcnt2fX0pCisKK0BtYXRoe0B2YXJ7d30gPSBAdmFye3V9ICogQHZhcnt2fX0uICBAdmFye3Z9IGlzIGFuIHVuc2lnbmVkIGludGVnZXIuCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gdm9pZCBnY3J5X21waV9tdWxtIChAd3tnY3J5X21waV90IEB2YXJ7d319LCBAd3tnY3J5X21waV90IEB2YXJ7dX19LCBAd3tnY3J5X21waV90IEB2YXJ7dn19LCBAd3tnY3J5X21waV90IEB2YXJ7bX19KQorCitAbWF0aHtAdmFye3d9ID0gQHZhcnt1fSAqIEB2YXJ7dn0gXGJtb2QgQHZhcnttfX0uCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gdm9pZCBnY3J5X21waV9tdWxfMmV4cCAoQHd7Z2NyeV9tcGlfdCBAdmFye3d9fSwgQHd7Z2NyeV9tcGlfdCBAdmFye3V9fSwgQHd7dW5zaWduZWQgbG9uZyBAdmFye2V9fSkKKworQGMgRklYTUU6IEkgYW0gaW4gbmVlZCBmb3IgYSByZWFsIFRlWHtpbmZvfSBndXJ1OgorQGMgSSBkb24ndCBrbm93IHdoeSBUZVggY2FuIGdyb2sgQHZhcntlfSBoZXJlLgorQG1hdGh7QHZhcnt3fSA9IEB2YXJ7dX0gKiAyXmV9LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIHZvaWQgZ2NyeV9tcGlfZGl2IChAd3tnY3J5X21waV90IEB2YXJ7cX19LCBAd3tnY3J5X21waV90IEB2YXJ7cn19LCBAd3tnY3J5X21waV90IEB2YXJ7ZGl2aWRlbmR9fSwgQHd7Z2NyeV9tcGlfdCBAdmFye2Rpdmlzb3J9fSwgQHd7aW50IEB2YXJ7cm91bmR9fSkKKworQG1hdGh7QHZhcntxfSA9IEB2YXJ7ZGl2aWRlbmR9IC8gQHZhcntkaXZpc29yfX0sIEBtYXRoe0B2YXJ7cn0gPQorQHZhcntkaXZpZGVuZH0gXGJtb2QgQHZhcntkaXZpc29yfX0uICBAdmFye3F9IGFuZCBAdmFye3J9IG1heSBiZSBwYXNzZWQKK2FzIEBjb2Rle05VTEx9LiAgQHZhcntyb3VuZH0gc2hvdWxkIGJlIG5lZ2F0aXZlIG9yIDAuCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gdm9pZCBnY3J5X21waV9tb2QgKEB3e2djcnlfbXBpX3QgQHZhcntyfX0sIEB3e2djcnlfbXBpX3QgQHZhcntkaXZpZGVuZH19LCBAd3tnY3J5X21waV90IEB2YXJ7ZGl2aXNvcn19KQorCitAbWF0aHtAdmFye3J9ID0gQHZhcntkaXZpZGVuZH0gXGJtb2QgQHZhcntkaXZpc29yfX0uCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gdm9pZCBnY3J5X21waV9wb3dtIChAd3tnY3J5X21waV90IEB2YXJ7d319LCBAd3tjb25zdCBnY3J5X21waV90IEB2YXJ7Yn19LCBAd3tjb25zdCBnY3J5X21waV90IEB2YXJ7ZX19LCBAd3tjb25zdCBnY3J5X21waV90IEB2YXJ7bX19KQorCitAYyBJIGRvbid0IGtub3cgd2h5IFRlWCBjYW4gZ3JvayBAdmFye2V9IGhlcmUuCitAbWF0aHtAdmFye3d9ID0gQHZhcntifV5lIFxibW9kIEB2YXJ7bX19LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGludCBnY3J5X21waV9nY2QgKEB3e2djcnlfbXBpX3QgQHZhcntnfX0sIEB3e2djcnlfbXBpX3QgQHZhcnthfX0sIEB3e2djcnlfbXBpX3QgQHZhcntifX0pCisKK1NldCBAdmFye2d9IHRvIHRoZSBncmVhdGVzdCBjb21tb24gZGl2aXNvciBvZiBAdmFye2F9IGFuZCBAdmFye2J9LiAgCitSZXR1cm4gdHJ1ZSBpZiB0aGUgQHZhcntnfSBpcyAxLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGludCBnY3J5X21waV9pbnZtIChAd3tnY3J5X21waV90IEB2YXJ7eH19LCBAd3tnY3J5X21waV90IEB2YXJ7YX19LCBAd3tnY3J5X21waV90IEB2YXJ7bX19KQorCitTZXQgQHZhcnt4fSB0byB0aGUgbXVsdGlwbGljYXRpdmUgaW52ZXJzZSBvZiBAbWF0aHtAdmFye2F9IFxibW9kIEB2YXJ7bX19LgorUmV0dXJuIHRydWUgaWYgdGhlIGludmVyc2UgZXhpc3RzLgorQGVuZCBkZWZ0eXBlZnVuCisKKworQG5vZGUgQ29tcGFyaXNvbnMKK0BzZWN0aW9uIENvbXBhcmlzb25zCisKK0Bub2luZGVudAorVGhlIG5leHQgMiBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gY29tcGFyZSBNUElzOgorCisKK0BkZWZ0eXBlZnVuIGludCBnY3J5X21waV9jbXAgKEB3e2NvbnN0IGdjcnlfbXBpX3QgQHZhcnt1fX0sIEB3e2NvbnN0IGdjcnlfbXBpX3QgQHZhcnt2fX0pCisKK0NvbXBhcmUgdGhlIG11bHRpLXByZWNpc2lvbi1pbnRlZ2VycyBudW1iZXIgQHZhcnt1fSBhbmQgQHZhcnt2fQorcmV0dXJuaW5nIDAgZm9yIGVxdWFsaXR5LCBhIHBvc2l0aXZlIHZhbHVlIGZvciBAdmFye3V9ID4gQHZhcnt2fSBhbmQgYQorbmVnYXRpdmUgZm9yIEB2YXJ7dX0gPCBAdmFye3Z9LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGludCBnY3J5X21waV9jbXBfdWkgKEB3e2NvbnN0IGdjcnlfbXBpX3QgQHZhcnt1fX0sIEB3e3Vuc2lnbmVkIGxvbmcgQHZhcnt2fX0pCisKK0NvbXBhcmUgdGhlIG11bHRpLXByZWNpc2lvbi1pbnRlZ2VycyBudW1iZXIgQHZhcnt1fSB3aXRoIHRoZSB1bnNpZ25lZAoraW50ZWdlciBAdmFye3Z9IHJldHVybmluZyAwIGZvciBlcXVhbGl0eSwgYSBwb3NpdGl2ZSB2YWx1ZSBmb3IgQHZhcnt1fSA+CitAdmFye3Z9IGFuZCBhIG5lZ2F0aXZlIGZvciBAdmFye3V9IDwgQHZhcnt2fS4KK0BlbmQgZGVmdHlwZWZ1bgorCisKK0Bub2RlIEJpdCBtYW5pcHVsYXRpb25zCitAc2VjdGlvbiBCaXQgbWFuaXB1bGF0aW9ucworCitAbm9pbmRlbnQKK1RoZXJlIGFyZSBhIGNvdXBsZSBvZiBmdW5jdGlvbnMgdG8gZ2V0IGluZm9ybWF0aW9uIG9uIGFyYml0cmFyeSBiaXRzCitpbiBhbiBNUEkgYW5kIHRvIHNldCBvciBjbGVhciB0aGVtOgorCitAZGVmdHlwZWZ1biB7dW5zaWduZWQgaW50fSBnY3J5X21waV9nZXRfbmJpdHMgKEB3e2djcnlfbXBpX3QgQHZhcnthfX0pCisKK1JldHVybiB0aGUgbnVtYmVyIG9mIGJpdHMgcmVxdWlyZWQgdG8gcmVwcmVzZW50IEB2YXJ7YX0uCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gaW50IGdjcnlfbXBpX3Rlc3RfYml0IChAd3tnY3J5X21waV90IEB2YXJ7YX19LCBAd3t1bnNpZ25lZCBpbnQgQHZhcntufX0pCisKK1JldHVybiB0cnVlIGlmIGJpdCBudW1iZXIgQHZhcntufSAoY291bnRpbmcgZnJvbSAwKSBpcyBzZXQgaW4gQHZhcnthfS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biB2b2lkIGdjcnlfbXBpX3NldF9iaXQgKEB3e2djcnlfbXBpX3QgQHZhcnthfX0sIEB3e3Vuc2lnbmVkIGludCBAdmFye259fSkKKworU2V0IGJpdCBudW1iZXIgQHZhcntufSBpbiBAdmFye2F9LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIHZvaWQgZ2NyeV9tcGlfY2xlYXJfYml0IChAd3tnY3J5X21waV90IEB2YXJ7YX19LCBAd3t1bnNpZ25lZCBpbnQgQHZhcntufX0pCisKK0NsZWFyIGJpdCBudW1iZXIgQHZhcntufSBpbiBAdmFye2F9LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIHZvaWQgZ2NyeV9tcGlfc2V0X2hpZ2hiaXQgKEB3e2djcnlfbXBpX3QgQHZhcnthfX0sIEB3e3Vuc2lnbmVkIGludCBAdmFye259fSkKKworU2V0IGJpdCBudW1iZXIgQHZhcntufSBpbiBAdmFye2F9IGFuZCBjbGVhciBhbGwgYml0cyBncmVhdGVyIHRoYW4gQHZhcntufS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biB2b2lkIGdjcnlfbXBpX2NsZWFyX2hpZ2hiaXQgKEB3e2djcnlfbXBpX3QgQHZhcnthfX0sIEB3e3Vuc2lnbmVkIGludCBAdmFye259fSkKKworQ2xlYXIgYml0IG51bWJlciBAdmFye259IGluIEB2YXJ7YX0gYW5kIGFsbCBiaXRzIGdyZWF0ZXIgdGhhbiBAdmFye259LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIHZvaWQgZ2NyeV9tcGlfcnNoaWZ0IChAd3tnY3J5X21waV90IEB2YXJ7eH19LCBAd3tnY3J5X21waV90IEB2YXJ7YX19LCBAd3t1bnNpZ25lZCBpbnQgQHZhcntufX0pCisKK1NoaWZ0IHRoZSB2YWx1ZSBvZiBAdmFye2F9IGJ5IEB2YXJ7bn0gYml0cyB0byB0aGUgcmlnaHQgYW5kIHN0b3JlIHRoZQorcmVzdWx0IGluIEB2YXJ7eH0uCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gdm9pZCBnY3J5X21waV9sc2hpZnQgKEB3e2djcnlfbXBpX3QgQHZhcnt4fX0sIEB3e2djcnlfbXBpX3QgQHZhcnthfX0sIEB3e3Vuc2lnbmVkIGludCBAdmFye259fSkKKworU2hpZnQgdGhlIHZhbHVlIG9mIEB2YXJ7YX0gYnkgQHZhcntufSBiaXRzIHRvIHRoZSBsZWZ0IGFuZCBzdG9yZSB0aGUKK3Jlc3VsdCBpbiBAdmFye3h9LgorQGVuZCBkZWZ0eXBlZnVuCisKK0Bub2RlIE1pc2NlbGxhbmVvdXMKK0BzZWN0aW9uIE1pc2NlbGxhbmVvdXMKKworQGRlZnR5cGVmdW4gZ2NyeV9tcGlfdCBnY3J5X21waV9zZXRfb3BhcXVlIChAd3tnY3J5X21waV90IEB2YXJ7YX19LCBAd3t2b2lkICpAdmFye3B9fSwgQHd7dW5zaWduZWQgaW50IEB2YXJ7bmJpdHN9fSkKKworU3RvcmUgQHZhcntuYml0c30gb2YgdGhlIHZhbHVlIEB2YXJ7cH0gcG9pbnRzIHRvIGluIEB2YXJ7YX0gYW5kIG1hcmsKK0B2YXJ7YX0gYXMgYW4gb3BhcXVlIHZhbHVlIChpLmUuIGFuIHZhbHVlIHRoYXQgY2FuJ3QgYmUgdXNlZCBmb3IgYW55CittYXRoIGNhbGN1bGF0aW9uIGFuZCBpcyBvbmx5IHVzZWQgdG8gc3RvcmUgYW4gYXJiaXRyYXJ5IGJpdCBwYXR0ZXJuIGluCitAdmFye2F9KS4KKworV0FSTklORzogTmV2ZXIgdXNlIGFuIG9wYXF1ZSBNUEkgZm9yIGFjdHVhbCBtYXRoIG9wZXJhdGlvbnMuICBUaGUgb25seQordmFsaWQgZnVuY3Rpb25zIGFyZSBnY3J5X21waV9nZXRfb3BhcXVlIGFuZCBnY3J5X21waV9yZWxlYXNlLiAgVXNlCitnY3J5X21waV9zY2FuIHRvIGNvbnZlcnQgYSBzdHJpbmcgb2YgYXJiaXRyYXJ5IGJ5dGVzIGludG8gYW4gTVBJLgorCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4ge3ZvaWQgKn0gZ2NyeV9tcGlfZ2V0X29wYXF1ZSAoQHd7Z2NyeV9tcGlfdCBAdmFye2F9fSwgQHd7dW5zaWduZWQgaW50ICpAdmFye25iaXRzfX0pCisKK1JldHVybiBhIHBvaW50ZXIgdG8gYW4gb3BhcXVlIHZhbHVlIHN0b3JlZCBpbiBAdmFye2F9IGFuZCByZXR1cm4gaXRzCitzaXplIGluIEB2YXJ7bmJpdHN9LiAgTm90ZSB0aGF0IHRoZSByZXR1cm5lZCBwb2ludGVyIGlzIHN0aWxsIG93bmVkIGJ5CitAdmFye2F9IGFuZCB0aGF0IHRoZSBmdW5jdGlvbiBzaG91bGQgbmV2ZXIgYmUgdXNlZCBmb3IgYW4gbm9uLW9wYXF1ZQorTVBJLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIHZvaWQgZ2NyeV9tcGlfc2V0X2ZsYWcgKEB3e2djcnlfbXBpX3QgQHZhcnthfX0sIEB3e2VudW0gZ2NyeV9tcGlfZmxhZyBAdmFye2ZsYWd9fSkKKworU2V0IHRoZSBAdmFye2ZsYWd9IGZvciB0aGUgTVBJIEB2YXJ7YX0uICBDdXJyZW50bHkgb25seSB0aGUgZmxhZworQGNvZGV7R0NSWU1QSV9GTEFHX1NFQ1VSRX0gaXMgYWxsb3dlZCB0byBjb252ZXJ0IEB2YXJ7YX0gaW50byBhbiBNUEkKK3N0b3JlZCBpbiAic2VjdXJlIG1lbW9yeSIuCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gdm9pZCBnY3J5X21waV9jbGVhcl9mbGFnIChAd3tnY3J5X21waV90IEB2YXJ7YX19LCBAd3tlbnVtIGdjcnlfbXBpX2ZsYWcgQHZhcntmbGFnfX0pCisKK0NsZWFyIEB2YXJ7ZmxhZ30gZm9yIHRoZSBtdWx0aS1wcmVjaXNpb24taW50ZWdlcnMgQHZhcnthfS4gIE5vdGUgdGhhdAordGhpcyBmdW5jdGlvbiBpcyBjdXJyZW50bHkgdXNlbGVzcyBhcyBubyBmbGFncyBhcmUgYWxsb3dlZC4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBpbnQgZ2NyeV9tcGlfZ2V0X2ZsYWcgKEB3e2djcnlfbXBpX3QgQHZhcnthfX0sIEB3e2VudW0gZ2NyeV9tcGlfZmxhZyBAdmFye2ZsYWd9fSkKKworUmV0dXJuIHRydWUgd2hlbiB0aGUgQHZhcntmbGFnfSBpcyBzZXQgZm9yIEB2YXJ7YX0uCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gdm9pZCBnY3J5X21waV9yYW5kb21pemUgKEB3e2djcnlfbXBpX3QgQHZhcnt3fX0sIEB3e3Vuc2lnbmVkIGludCBAdmFye25iaXRzfX0sIEB3e2VudW0gZ2NyeV9yYW5kb21fbGV2ZWwgQHZhcntsZXZlbH19KQorCitTZXQgdGhlIG11bHRpLXByZWNpc2lvbi1pbnRlZ2VycyBAdmFye3d9IHRvIGEgcmFuZG9tIHZhbHVlIG9mCitAdmFye25iaXRzfSwgdXNpbmcgcmFuZG9tIGRhdGEgcXVhbGl0eSBvZiBsZXZlbCBAdmFye2xldmVsfS4gIEluIGNhc2UKK0B2YXJ7bmJpdHN9IGlzIG5vdCBhIG11bHRpcGxlIG9mIGEgYnl0ZSwgQHZhcntuYml0c30gaXMgcm91bmRlZCB1cCB0bwordGhlIG5leHQgYnl0ZSBib3VuZGFyeS4gIFdoZW4gdXNpbmcgYSBAdmFye2xldmVsfSBvZgorQGNvZGV7R0NSWV9XRUFLX1JBTkRPTX0gdGhpcyBmdW5jdGlvbiBtYWtlcyB1c2Ugb2YKK0Bjb2Rle2djcnlfY3JlYXRlX25vbmNlfS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAYyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitAYyAqKioqKioqKioqKioqKioqKioqKiBQcmltZSBudW1iZXJzICoqKioqKioqKioqKioqKioqKioqKioqCitAYyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitAbm9kZSBQcmltZSBudW1iZXJzCitAY2hhcHRlciBQcmltZSBudW1iZXJzCisKK0BtZW51CisqIEdlbmVyYXRpb246OiAgICAgICAgICAgICAgICAgIEdlbmVyYXRpb24gb2YgbmV3IHByaW1lIG51bWJlcnMuCisqIENoZWNraW5nOjogICAgICAgICAgICAgICAgICAgIENoZWNraW5nIGlmIGEgZ2l2ZW4gbnVtYmVyIGlzIHByaW1lLgorQGVuZCBtZW51CisKK0Bub2RlIEdlbmVyYXRpb24KK0BzZWN0aW9uIEdlbmVyYXRpb24KKworQGRlZnR5cGVmdW4gZ2NyeV9lcnJvcl90IGdjcnlfcHJpbWVfZ2VuZXJhdGUgKGdjcnlfbXBpX3QgKkB2YXJ7cHJpbWV9LHVuc2lnbmVkIGludCBAdmFye3ByaW1lX2JpdHN9LCB1bnNpZ25lZCBpbnQgQHZhcntmYWN0b3JfYml0c30sIGdjcnlfbXBpX3QgKipAdmFye2ZhY3RvcnN9LCBnY3J5X3ByaW1lX2NoZWNrX2Z1bmNfdCBAdmFye2NiX2Z1bmN9LCB2b2lkICpAdmFye2NiX2FyZ30sIGdjcnlfcmFuZG9tX2xldmVsX3QgQHZhcntyYW5kb21fbGV2ZWx9LCB1bnNpZ25lZCBpbnQgQHZhcntmbGFnc30pCisKK0dlbmVyYXRlIGEgbmV3IHByaW1lIG51bWJlciBvZiBAdmFye3ByaW1lX2JpdHN9IGJpdHMgYW5kIHN0b3JlIGl0IGluCitAdmFye3ByaW1lfS4gIElmIEB2YXJ7ZmFjdG9yX2JpdHN9IGlzIG5vbi16ZXJvLCBvbmUgb2YgdGhlIHByaW1lIGZhY3RvcnMKK29mIChAdmFye3ByaW1lfSAtIDEpIC8gMiBtdXN0IGJlIEB2YXJ7ZmFjdG9yX2JpdHN9IGJpdHMgbG9uZy4gIElmCitAdmFye2ZhY3RvcnN9IGlzIG5vbi16ZXJvLCBhbGxvY2F0ZSBhIG5ldywgQGNvZGV7TlVMTH0tdGVybWluYXRlZCBhcnJheQoraG9sZGluZyB0aGUgcHJpbWUgZmFjdG9ycyBhbmQgc3RvcmUgaXQgaW4gQHZhcntmYWN0b3JzfS4gIEB2YXJ7ZmxhZ3N9CittaWdodCBiZSB1c2VkIHRvIGluZmx1ZW5jZSB0aGUgcHJpbWUgbnVtYmVyIGdlbmVyYXRpb24gcHJvY2Vzcy4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBnY3J5X2Vycm9yX3QgZ2NyeV9wcmltZV9ncm91cF9nZW5lcmF0b3IgKGdjcnlfbXBpX3QgKkB2YXJ7cl9nfSwgZ2NyeV9tcGlfdCBAdmFye3ByaW1lfSwgZ2NyeV9tcGlfdCAqQHZhcntmYWN0b3JzfSwgZ2NyeV9tcGlfdCBAdmFye3N0YXJ0X2d9KQorCitGaW5kIGEgZ2VuZXJhdG9yIGZvciBAdmFye3ByaW1lfSB3aGVyZSB0aGUgZmFjdG9yaXphdGlvbiBvZgorKEB2YXJ7cHJpbWV9LTEpIGlzIGluIHRoZSBAY29kZXtOVUxMfSB0ZXJtaW5hdGVkIGFycmF5IEB2YXJ7ZmFjdG9yc30uCitSZXR1cm4gdGhlIGdlbmVyYXRvciBhcyBhIG5ld2x5IGFsbG9jYXRlZCBNUEkgaW4gQHZhcntyX2d9LiAgSWYKK0B2YXJ7c3RhcnRfZ30gaXMgbm90IE5VTEwsIHVzZSB0aGlzIGFzIHRoZSBzdGFydCBmb3IgdGhlIHNlYXJjaC4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biB2b2lkIGdjcnlfcHJpbWVfcmVsZWFzZV9mYWN0b3JzIChnY3J5X21waV90ICpAdmFye2ZhY3RvcnN9KQorCitDb252ZW5pZW5jZSBmdW5jdGlvbiB0byByZWxlYXNlIHRoZSBAdmFye2ZhY3RvcnN9IGFycmF5LgorQGVuZCBkZWZ0eXBlZnVuCisKK0Bub2RlIENoZWNraW5nCitAc2VjdGlvbiBDaGVja2luZworCitAZGVmdHlwZWZ1biBnY3J5X2Vycm9yX3QgZ2NyeV9wcmltZV9jaGVjayAoZ2NyeV9tcGlfdCBAdmFye3B9LCB1bnNpZ25lZCBpbnQgQHZhcntmbGFnc30pCisKK0NoZWNrIHdldGhlciB0aGUgbnVtYmVyIEB2YXJ7cH0gaXMgcHJpbWUuICBSZXR1cm5zIHplcm8gaW4gY2FzZSBAdmFye3B9CitpcyBpbmRlZWQgYSBwcmltZSwgcmV0dXJucyBAY29kZXtHUEdfRVJSX05PX1BSSU1FfSBpbiBjYXNlIEB2YXJ7cH0gaXMKK25vdCBhIHByaW1lIGFuZCBhIGRpZmZlcmVudCBlcnJvciBjb2RlIGluIGNhc2Ugc29tZXRoaW5nIHdlbnQgaG9ycmlibHkKK3dyb25nLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0BjICoqKioqKioqKioqKioqKioqKioqIFV0aWxpdGllcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0BjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Bub2RlIFV0aWxpdGllcworQGNoYXB0ZXIgVXRpbGl0aWVzCisKK0BtZW51CisqIE1lbW9yeSBhbGxvY2F0aW9uOjogRnVuY3Rpb25zIHJlbGF0ZWQgd2l0aCBtZW1vcnkgYWxsb2NhdGlvbi4KK0BlbmQgbWVudQorCitAbm9kZSBNZW1vcnkgYWxsb2NhdGlvbgorQHNlY3Rpb24gTWVtb3J5IGFsbG9jYXRpb24KKworQGRlZnR5cGVmdW4ge3ZvaWQgKn0gZ2NyeV9tYWxsb2MgKHNpemVfdCBAdmFye259KQorCitUaGlzIGZ1bmN0aW9uIHRyaWVzIHRvIGFsbG9jYXRlIEB2YXJ7bn0gYnl0ZXMgb2YgbWVtb3J5LiAgT24gc3VjY2VzcworaXQgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG1lbW9yeSBhcmVhLCBpbiBhbiBvdXQtb2YtY29yZSBjb25kaXRpb24sCitpdCByZXR1cm5zIE5VTEwuCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4ge3ZvaWQgKn0gZ2NyeV9tYWxsb2Nfc2VjdXJlIChzaXplX3QgQHZhcntufSkKK0xpa2UgQGNvZGV7Z2NyeV9tYWxsb2N9LCBidXQgdXNlcyBzZWN1cmUgbWVtb3J5LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIHt2b2lkICp9IGdjcnlfY2FsbG9jIChzaXplX3QgQHZhcntufSwgc2l6ZV90IEB2YXJ7bX0pCisKK1RoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGEgY2xlYXJlZCBibG9jayBvZiBtZW1vcnkgKGkuZS4gaW5pdGlhbGl6ZWQgd2l0aAoremVybyBieXRlcykgbG9uZyBlbm91Z2ggdG8gY29udGFpbiBhIHZlY3RvciBvZiBAdmFye259IGVsZW1lbnRzLCBlYWNoIG9mCitzaXplIEB2YXJ7bX0gYnl0ZXMuICBPbiBzdWNjZXNzIGl0IHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBtZW1vcnkKK2Jsb2NrOyBpbiBhbiBvdXQtb2YtY29yZSBjb25kaXRpb24sIGl0IHJldHVybnMgTlVMTC4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biB7dm9pZCAqfSBnY3J5X2NhbGxvY19zZWN1cmUgKHNpemVfdCBAdmFye259LCBzaXplX3QgQHZhcnttfSkKK0xpa2UgQGNvZGV7Z2NyeV9jYWxsb2N9LCBidXQgdXNlcyBzZWN1cmUgbWVtb3J5LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIHt2b2lkICp9IGdjcnlfcmVhbGxvYyAodm9pZCAqQHZhcntwfSwgc2l6ZV90IEB2YXJ7bn0pCisKK1RoaXMgZnVuY3Rpb24gdHJpZXMgdG8gcmVzaXplIHRoZSBtZW1vcnkgYXJlYSBwb2ludGVkIHRvIGJ5IEB2YXJ7cH0gdG8KK0B2YXJ7bn0gYnl0ZXMuICBPbiBzdWNjZXNzIGl0IHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBuZXcgbWVtb3J5CithcmVhLCBpbiBhbiBvdXQtb2YtY29yZSBjb25kaXRpb24sIGl0IHJldHVybnMgTlVMTC4gIERlcGVuZGluZyBvbgord2hldGhlciB0aGUgbWVtb3J5IHBvaW50ZWQgdG8gYnkgQHZhcntwfSBpcyBzZWN1cmUgbWVtb3J5IG9yIG5vdCwKK2djcnlfcmVhbGxvYyB0cmllcyB0byB1c2Ugc2VjdXJlIG1lbW9yeSBhcyB3ZWxsLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIHZvaWQgZ2NyeV9mcmVlICh2b2lkICpAdmFye3B9KQorUmVsZWFzZSB0aGUgbWVtb3J5IGFyZWEgcG9pbnRlZCB0byBieSBAdmFye3B9LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0BjICoqKioqKioqKioqKioqKioqICBBcmNoaXRlY3VyZSBPdmVydmlldyAgKioqKioqKioqKioqKioqKioKK0BjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Bub2RlIEFyY2hpdGVjdHVyZQorQGNoYXB0ZXIgQXJjaGl0ZWN0dXJlCisKK1RoaXMgY2hhcHRlciBkZXNjcmliZXMgdGhlIGludGVybmFsIGFyY2hpdGVjdHVyZSBvZiBMaWJnY3J5cHQuCisKK0xpYmdjcnlwdCBpcyBhIGZ1bmN0aW9uIGxpYnJhcnkgd3JpdHRlbiBpbiBJU08gQy05MC4gIEFueSBjb21wbGlhbnQKK2NvbXBpbGVyIHNob3VsZCBiZSBhYmxlIHRvIGJ1aWxkIExpYmdjcnlwdCBhcyBsb25nIGFzIHRoZSB0YXJnZXQgaXMKK2VpdGhlciBhIFBPU0lYIHBsYXRmb3JtIG9yIGNvbXBhdGlibGUgdG8gdGhlIEFQSSB1c2VkIGJ5IFdpbmRvd3MgTlQuCitQcm92aXNpb25zIGhhdmUgYmVlbiB0YWtlIHNvIHRoYXQgdGhlIGxpYnJhcnkgY2FuIGJlIGRpcmVjdGx5IHVzZWQgZnJvbQorQysrIGFwcGxpY2F0aW9uczsgaG93ZXZlciBidWlsZGluZyB3aXRoIGEgQysrIGNvbXBpbGVyIGlzIG5vdCBzdXBwb3J0ZWQuCisKK0J1aWxkaW5nIExpYmdjcnlwdCBpcyBkb25lIGJ5IHVzaW5nIHRoZSBjb21tb24gQGNvZGV7Li9jb25maWd1cmUgJiYgbWFrZX0KK2FwcHJvYWNoLiAgVGhlIGNvbmZpZ3VyZSBjb21tYW5kIGlzIGluY2x1ZGVkIGluIHRoZSBzb3VyY2UgZGlzdHJpYnV0aW9uCithbmQgYXMgYSBwb3J0YWJsZSBzaGVsbCBzY3JpcHQgaXQgd29ya3Mgb24gYW55IFVuaXgtYWxpa2Ugc3lzdGVtLiAgVGhlCityZXN1bHQgb2YgcnVubmluZyB0aGUgY29uZmlndXJlIHNjcmlwdCBhcmUgYSBDIGhlYWRlciBmaWxlCisoQGZpbGV7Y29uZmlnLmh9KSwgY3VzdG9taXplZCBNYWtlZmlsZXMsIHRoZSBzZXR1cCBvZiBzeW1ib2xpYyBsaW5rcyBhbmQKK2EgZmV3IG90aGVyIHRoaW5ncy4gIEFmdGVyIHRoYXQgdGhlIG1ha2UgdG9vbCBidWlsZHMgYW5kIG9wdGlvbmFsbHkKK2luc3RhbGxzIHRoZSBsaWJyYXJ5IGFuZCB0aGUgZG9jdW1lbnRhdGlvbi4gIFNlZSB0aGUgZmlsZXMKK0BmaWxle0lOU1RBTEx9IGFuZCBAZmlsZXtSRUFETUV9IGluIHRoZSBzb3VyY2UgZGlzdHJpYnV0aW9uIG9uIGhvdyB0byBkbwordGhpcy4KKworTGliZ2NyeXB0IGlzIGRldmVsb3BlZCB1c2luZyBhIFN1YnZlcnNpb25AZm9vdG5vdGV7QSB2ZXJzaW9uIGNvbnRyb2wKK3N5c3RlbSBhdmFpbGFibGUgZm9yIG1hbnkgcGxhdGZvcm1zfSByZXBvc2l0b3J5LiAgQWx0aG91Z2ggYWxsIHJlbGVhc2VkCit2ZXJzaW9ucyBhcmUgdGFnZ2VkIGluIHRoaXMgcmVwb3NpdG9yeSwgdGhleSBzaG91bGQgbm90IGJlIHVzZWQgdG8gYnVpbGQKK3Byb2R1Y3Rpb24gdmVyc2lvbnMgb2YgTGliZ2NyeXB0LiAgSW5zdGVhZCByZWxlYXNlZCB0YXJiYWxscyBzaG91bGQgYmUKK3VzZWQuICBUaGVzZSB0YXJiYWxscyBhcmUgYXZhaWxhYmxlIGZyb20gc2V2ZXJhbCBwbGFjZXMgd2l0aCB0aGUgbWFzdGVyCitjb3B5IGF0IEBpbmRpY2F0ZXVybHtmdHA6Ly9mdHAuZ251cGcub3JnL2djcnlwdC9saWJnY3J5cHQvfS4KK0Fubm91bmNlbWVudHMgb2YgbmV3IHJlbGVhc2VzIGFyZSBwb3N0ZWQgdG8gdGhlCitAaW5kaWNhdGV1cmx7Z251cGctYW5ub3VuY2VAQGdudXBnLm9yZ30gbWFpbGluZyBsaXN0QGZvb3Rub3Rle1NlZQorQHVybHtodHRwOi8vd3d3LmdudXBnLm9yZy9kb2N1bWVudGF0aW9uL21haWxpbmctbGlzdHMuZW4uaHRtbH0gZm9yCitkZXRhaWxzLn0uCisKKworQGZsb2F0IEZpZ3VyZSxmaWc6c3Vic3lzdGVtcworQGNhcHRpb257TGliZ2NyeXB0IHN1YnN5c3RlbXN9CitAY2VudGVyIEBpbWFnZXtsaWJnY3J5cHQtbW9kdWxlcywgMTUwbW0sLExpYmdjcnlwdCBzdWJzeXN0ZW1zfQorQGVuZCBmbG9hdAorCitMaWJnY3J5cHQgY29uc2lzdHMgb2Ygc2V2ZXJhbCBzdWJzeXN0ZW1zIChAcHhyZWZ7ZmlnOnN1YnN5c3RlbXN9KSBhbmQKK2FsbCB0aGVzZSBzdWJzeXN0ZW1zIHByb3ZpZGUgYSBwdWJsaWMgQVBJOyB0aGlzIGluY2x1ZGVzIHRoZSBoZWxwZXIKK3N1YnN5c3RlbXMgbGlrZSB0aGUgb25lIGZvciBTLWV4cHJlc3Npb25zLiAgVGhlIEFQSSBzdHlsZSBkZXBlbmRzIG9uIHRoZQorc3Vic3lzdGVtOyBpbiBnZW5lcmFsIGFuIG9wZW4tdXNlLWNsb3NlIGFwcHJvYWNoIGlzIGltcGxlbWVudGVkLiAgVGhlCitvcGVuIHJldHVybnMgYSBoYW5kbGUgdG8gYSBjb250ZXh0IHVzZWQgZm9yIGFsbCBmdXJ0aGVyIG9wZXJhdGlvbnMgb24KK3RoaXMgaGFuZGxlLCBzZXZlcmFsIGZ1bmN0aW9ucyBtYXkgdGhlbiBiZSB1c2VkIG9uIHRoaXMgaGFuZGxlIGFuZCBhCitmaW5hbCBjbG9zZSBmdW5jdGlvbiByZWxlYXNlcyBhbGwgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaGFuZGxlLgorCitAbWVudQorKiBQdWJsaWMtS2V5IFN1YnN5c3RlbSBBcmNoaXRlY3R1cmU6OiAgICAgICAgICAgICAgQWJvdXQgcHVibGljIGtleXMuCisqIFN5bW1ldHJpYyBFbmNyeXB0aW9uIFN1YnN5c3RlbSBBcmNoaXRlY3R1cmU6OiAgICBBYm91dCBzdGFuZGFyZCBjaXBoZXJzLgorKiBIYXNoaW5nIGFuZCBNQUNpbmcgU3Vic3lzdGVtIEFyY2hpdGVjdHVyZTo6ICAgICAgQWJvdXQgaGFzaGluZy4KKyogTXVsdGktUHJlY2lzaW9uLUludGVnZXIgU3Vic3lzdGVtIEFyY2hpdGVjdHVyZTo6IEFib3V0IGJpZyBpbnRlZ2Vycy4KKyogUHJpbWUtTnVtYmVyLUdlbmVyYXRvciBTdWJzeXN0ZW0gQXJjaGl0ZWN0dXJlOjogIEFib3V0IHByaW1lIG51bWJlcnMuCisqIFJhbmRvbS1OdW1iZXIgU3Vic3lzdGVtIEFyY2hpdGVjdHVyZTo6ICAgICAgICAgICBBYm91dCByYW5kb20gc3R1ZmYuCitAYyAqIEhlbHBlciBTdWJzeXN0ZW1zIEFyY2hpdGVjdHVyZTo6ICAgICAgICAgICAgICAgICBBYm91dCBvdGhlciBzdHVmZi4KK0BlbmQgbWVudQorCisKKworQG5vZGUgUHVibGljLUtleSBTdWJzeXN0ZW0gQXJjaGl0ZWN0dXJlCitAc2VjdGlvbiBQdWJsaWMtS2V5IEFyY2hpdGVjdHVyZQorCitMaWJnY3J5cHQgaW1wbGVtZW50cyB0d28gaW50ZXJmYWNlcyBmb3IgcHVibGljIGtleSBjcnlwdG9ncmFwaHk6IFRoZQorc3RhbmRhcmQgaW50ZXJmYWNlIGlzIFBLIGludGVyZmFjZSB1c2luZyBmdW5jdGlvbnMgaW4gdGhlCitAY29kZXtnY3J5X3BrX30gbmFtZSBzcGFjZS4gIFRoZSBBQyBpbnRlcmZhY2UgaW4gYW4gYWx0ZXJuYXRpdmUgb25lCit3aGljaCBpcyBub3cgZGVwcmVjYXRlZCBhbmQgd2lsbCBub3QgYmUgZnVydGhlciBkZXNjcmliZWQuICBUaGUgQUMKK2ludGVyZmFjZSBpcyBhbHNvIGRpc2FibGVkIGluIEZJUFMgbW9kZS4KKworQmVjYXVzZSBwdWJsaWMga2V5IGNyeXB0b2dyYXBoeSBpcyBhbG1vc3QgYWx3YXlzIHVzZWQgdG8gcHJvY2VzcyBzbWFsbAorYW1vdW50cyBvZiBkYXRhIChoYXNoIHZhbHVlcyBvciBzZXNzaW9uIGtleXMpLCB0aGUgaW50ZXJmYWNlIGlzIG5vdAoraW1wbGVtZW50ZWQgdXNpbmcgdGhlIG9wZW4tdXNlLWNsb3NlIHBhcmFkaWdtLCBidXQgd2l0aCBzaW5nbGUKK3NlbGYtY29udGFpbmVkIGZ1bmN0aW9ucy4gIER1ZSB0byB0aGUgd2lkZSB2YXJpZXR5IG9mIHBhcmFtZXRlcnMKK3JlcXVpcmVkIGJ5IGRpZmZlcmVudCBhbGdvcml0aG1zIFMtZXhwcmVzc2lvbnMsIGFzIGZsZXhpYmxlIHdheSB0bworY29udmV5IHRoZXNlIHBhcmFtZXRlcnMsIGFyZSB1c2VkLiAgVGhlcmUgaXMgYSBzZXQgb2YgaGVscGVyIGZ1bmN0aW9ucwordG8gd29yayB3aXRoIHRoZXNlIFMtZXhwcmVzc2lvbnMuCitAYyBzZWUgQHhyZWZ7Uy1leHByZXNzaW9uIFN1YnN5c3RlbSBBcmNoaXRlY3R1cmV9LgorCitBc2lkZSBvZiBmdW5jdGlvbnMgdG8gcmVnaXN0ZXIgbmV3IGFsZ29yaXRobXMsIG1hcCBhbGdvcml0aG1zIG5hbWVzIHRvCithbGdvcml0aG1zIGlkZW50aWZpZXJzIGFuZCB0byBsb29rdXAgcHJvcGVydGllcyBvZiBhIGtleSwgdGhlCitmb2xsb3dpbmcgbWFpbiBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZToKKworQHRhYmxlIEBjb2RlCisKK0BpdGVtIGdjcnlfcGtfZW5jcnlwdCAKK0VuY3J5cHQgZGF0YSB1c2luZyBhIHB1YmxpYyBrZXkuCisKK0BpdGVtIGdjcnlfcGtfZGVjcnlwdCAKK0RlY3J5cHQgZGF0YSB1c2luZyBhIHByaXZhdGUga2V5LgorCitAaXRlbSBnY3J5X3BrX3NpZ24gCitTaWduIGRhdGEgdXNpbmcgYSBwcml2YXRlIGtleS4KKworQGl0ZW0gZ2NyeV9wa192ZXJpZnkKK1ZlcmlmeSB0aGF0IGEgc2lnbmF0dXJlIG1hdGNoZXMgdGhlIGRhdGEuCisKK0BpdGVtIGdjcnlfcGtfdGVzdGtleQorUGVyZm9ybSBhIGNvbnNpc3RlbmN5IG92ZXIgYSBwdWJsaWMgb3IgcHJpdmF0ZSBrZXkuCisKK0BpdGVtIGdjcnlfcGtfZ2Vua2V5CitDcmVhdGUgYSBuZXcgcHVibGljL3ByaXZhdGUga2V5IHBhaXIuCisKK0BlbmQgdGFibGUKKworV2l0aCB0aGUgaGVscCBvZiB0aGUgbW9kdWxlIHJlZ2lzdHJhdGlvbiBzeXN0ZW0gYWxsIHRoZXNlIGZ1bmN0aW9ucworbG9va3VwIHRoZSBtb2R1bGUgaW1wbGVtZW50aW5nIHRoZSBhbGdvcml0aG0gYW5kIHBhc3MgdGhlIGFjdHVhbCB3b3JrCit0byB0aGF0IG1vZHVsZS4gIFRoZSBwYXJzaW5nIG9mIHRoZSBTLWV4cHJlc3Npb24gaW5wdXQgYW5kIHRoZQorY29uc3RydWN0aW9uIG9mIFMtZXhwcmVzc2lvbiBmb3IgdGhlIHJldHVybiB2YWx1ZXMgaXMgZG9uZSBieSB0aGUgaGlnaAorbGV2ZWwgY29kZSAoQGZpbGV7Y2lwaGVyL3B1YmtleS5jfSkuICBUaHVzIHRoZSBpbnRlcm5hbCBpbnRlcmZhY2UKK2JldHdlZW4gdGhlIGFsZ29yaXRobSBtb2R1bGVzIGFuZCB0aGUgaGlnaCBsZXZlbCBmdW5jdGlvbnMgcGFzc2VzIGRhdGEKK2luIGEgY3VzdG9tIGZvcm1hdC4gIFRoZSBpbnRlcmZhY2UgdG8gdGhlIG1vZHVsZXMgaXMgcHVibGlzaGVkCisoQGZpbGV7Z2NyeXB0LW1vZHVsZXMuaH0pIHNvIHRoYXQgaXQgY2FuIHVzZWQgdG8gcmVnaXN0ZXIgZXh0ZXJuYWwKK2ltcGxlbWVudGF0aW9ucyBvZiBhbGdvcml0aG1zIHdpdGggTGliZ2NyeXB0LiAgSG93ZXZlciwgZm9yIHNvbWUKK2FsZ29yaXRobXMgdGhpcyBtb2R1bGUgaW50ZXJmYWNlIGlzIHRvIGxpbWl0ZWQgYW5kIHRodXMgZm9yIHRoZQoraW50ZXJuYWwgbW9kdWxlcyBhbiBleHRyYSBpbnRlcmZhY2UgaXMgc29tZXRpbWVzIHVzZWQgdG8gY29udmV5IG1vcmUKK2luZm9ybWF0aW9uLgorCitCeSBkZWZhdWx0IExpYmdjcnlwdCB1c2VzIGEgYmxpbmRpbmcgdGVjaG5pcXVlIGZvciBSU0EgZGVjcnlwdGlvbiB0bworbWl0aWdhdGUgcmVhbCB3b3JsZCB0aW1pbmcgYXR0YWNrcyBvdmVyIGEgbmV0d29yazogSW5zdGVhZCBvZiB1c2luZwordGhlIFJTQSBkZWNyeXB0aW9uIGRpcmVjdGx5LCBhIGJsaW5kZWQgdmFsdWUgQG1hdGh7eSA9IHggcl57ZX0gXGJtb2Qgbn0KK2lzIGRlY3J5cHRlZCBhbmQgdGhlIHVuYmxpbmRlZCB2YWx1ZSBAbWF0aHt4JyA9IHknIHJeey0xfSBcYm1vZCBufQorcmV0dXJuZWQuICBUaGUgYmxpbmRpbmcgdmFsdWUgQG1hdGh7cn0gaXMgYSByYW5kb20gdmFsdWUgd2l0aCB0aGUgc2l6ZQorb2YgdGhlIG1vZHVsdXMgQG1hdGh7bn0gYW5kIGdlbmVyYXRlZCB3aXRoIEBjb2Rle0dDUllfV0VBS19SQU5ET019CityYW5kb20gbGV2ZWwuCisKK0BjaW5kZXggWDkuMzEKK0BjaW5kZXggRklQUyAxODYKK1RoZSBhbGdvcml0aG0gdXNlZCBmb3IgUlNBIGFuZCBEU0Ega2V5IGdlbmVyYXRpb24gZGVwZW5kcyBvbiB3aGV0aGVyCitMaWJnY3J5cHQgaXMgb3BlcmF0ZWQgaW4gc3RhbmRhcmQgb3IgaW4gRklQUyBtb2RlLiAgSW4gc3RhbmRhcmQgbW9kZQorYW4gYWxnb3JpdGhtIGJhc2VkIG9uIHRoZSBMaW0tTGVlIHByaW1lIG51bWJlciBnZW5lcmF0b3IgaXMgdXNlZC4gIEluCitGSVBTIG1vZGUgUlNBIGtleXMgYXJlIGdlbmVyYXRlZCBhcyBzcGVjaWZpZWQgaW4gQU5TSSBYOS4zMSAoMTk5OCkgYW5kCitEU0Ega2V5cyBhcyBzcGVjaWZpZWQgaW4gRklQUyAxODYtMi4KKworCisKK0Bub2RlIFN5bW1ldHJpYyBFbmNyeXB0aW9uIFN1YnN5c3RlbSBBcmNoaXRlY3R1cmUKK0BzZWN0aW9uIFN5bW1ldHJpYyBFbmNyeXB0aW9uIFN1YnN5c3RlbSBBcmNoaXRlY3R1cmUKKworVGhlIGludGVyZmFjZSB0byB3b3JrIHdpdGggc3ltbWV0cmljIGVuY3J5cHRpb24gYWxnb3JpdGhtcyBpcyBtYWRlIHVwCitvZiBmdW5jdGlvbnMgZnJvbSB0aGUgQGNvZGV7Z2NyeV9jaXBoZXJffSBuYW1lIHNwYWNlLiAgVGhlCitpbXBsZW1lbnRhdGlvbiBmb2xsb3dzIHRoZSBvcGVuLXVzZS1jbG9zZSBwYXJhZGlnbSBhbmQgdXNlcyByZWdpc3RlcmVkCithbGdvcml0aG0gbW9kdWxlcyBmb3IgdGhlIGFjdHVhbCB3b3JrLiAgVW5sZXNzIGEgbW9kdWxlIGltcGxlbWVudHMKK29wdGltaXplZCBjaXBoZXIgbW9kZSBpbXBsZW1lbnRhdGlvbnMsIHRoZSBoaWdoIGxldmVsIGNvZGUKKyhAZmlsZXtjaXBoZXIvY2lwaGVyLmN9KSBpbXBsZW1lbnRzIHRoZSBtb2RlcyBhbmQgY2FsbHMgdGhlIGNvcmUKK2FsZ29yaXRobSBmdW5jdGlvbnMgdG8gcHJvY2VzcyBlYWNoIGJsb2NrLgorCitUaGUgbW9zdCBpbXBvcnRhbnQgZnVuY3Rpb25zIGFyZToKKworQHRhYmxlIEBjb2RlCisKK0BpdGVtIGdjcnlfY2lwaGVyX29wZW4KK0NyZWF0ZSBhIG5ldyBpbnN0YW5jZSB0byBlbmNyeXB0IG9yIGRlY3J5cHQgdXNpbmcgYSBzcGVjaWZpZWQKK2FsZ29yaXRobSBhbmQgbW9kZS4KKworQGl0ZW0gZ2NyeV9jaXBoZXJfY2xvc2UKK1JlbGVhc2UgYW4gaW5zdGFuY2UuCisKK0BpdGVtIGdjcnlfY2lwaGVyX3NldGtleQorU2V0IGEga2V5IHRvIGJlIHVzZWQgZm9yIGVuY3J5cHRpb24gb3IgZGVjcnlwdGlvbi4gCisKK0BpdGVtIGdjcnlfY2lwaGVyX3NldGl2CitTZXQgYW4gaW5pdGlhbGl6YXRpb24gdmVjdG9yIHRvIGJlIHVzZWQgZm9yIGVuY3J5cHRpb24gb3IgZGVjcnlwdGlvbi4KKworQGl0ZW0gZ2NyeV9jaXBoZXJfZW5jcnlwdAorQGl0ZW14IGdjcnlfY2lwaGVyX2RlY3J5cHQgCitFbmNyeXB0IG9yIGRlY3J5cHQgZGF0YS4gIFRoZXNlIGZ1bmN0aW9ucyBtYXkgYmUgY2FsbGVkIHdpdGggYXJiaXRyYXJ5CithbW91bnRzIG9mIGRhdGEgYW5kIGFzIG9mdGVuIGFzIG5lZWRlZCB0byBlbmNyeXB0IG9yIGRlY3J5cHQgYWxsIGRhdGEuCisKK0BlbmQgdGFibGUKKworVGhlcmUgYXJlIGFsc28gZnVuY3Rpb25zIHRvIHF1ZXJ5IHByb3BlcnRpZXMgb2YgYWxnb3JpdGhtcyBvciBjb250ZXh0LAorbGlrZSBibG9jayBsZW5ndGgsIGtleSBsZW5ndGgsIG1hcCBuYW1lcyBvciB0byBlbmFibGUgZmVhdHVyZXMgbGlrZQorcGFkZGluZyBtZXRob2RzLgorCisKKworQG5vZGUgSGFzaGluZyBhbmQgTUFDaW5nIFN1YnN5c3RlbSBBcmNoaXRlY3R1cmUKK0BzZWN0aW9uIEhhc2hpbmcgYW5kIE1BQ2luZyBTdWJzeXN0ZW0gQXJjaGl0ZWN0dXJlCisKK1RoZSBpbnRlcmZhY2UgdG8gd29yayB3aXRoIG1lc3NhZ2UgZGlnZXN0cyBhbmQgQ1JDIGFsZ29yaXRobXMgaXMgbWFkZQordXAgb2YgZnVuY3Rpb25zIGZyb20gdGhlIEBjb2Rle2djcnlfbWRffSBuYW1lIHNwYWNlLiAgVGhlCitpbXBsZW1lbnRhdGlvbiBmb2xsb3dzIHRoZSBvcGVuLXVzZS1jbG9zZSBwYXJhZGlnbSBhbmQgdXNlcyByZWdpc3RlcmVkCithbGdvcml0aG0gbW9kdWxlcyBmb3IgdGhlIGFjdHVhbCB3b3JrLiAgQWx0aG91Z2ggQ1JDIGFsZ29yaXRobXMgYXJlCitub3QgY29uc2lkZXJlZCBjcnlwdG9ncmFwaGljIGhhc2ggYWxnb3JpdGhtcywgdGhleSBzaGFyZSBlbm91Z2gKK3Byb3BlcnRpZXMgc28gdGhhdCBpdCBtYWtlcyBzZW5zZSB0byBoYW5kbGUgdGhlbSBpbiB0aGUgc2FtZSB3YXkuCitJdCBpcyBwb3NzaWJsZSB0byB1c2Ugc2V2ZXJhbCBhbGdvcml0aG1zIGF0IG9uY2Ugd2l0aCBvbmUgY29udGV4dCBhbmQKK3RodXMgY29tcHV0ZSB0aGVtIGFsbCBvbiB0aGUgc2FtZSBkYXRhLgorCitUaGUgbW9zdCBpbXBvcnRhbnQgZnVuY3Rpb25zIGFyZToKKworQHRhYmxlIEBjb2RlCitAaXRlbSBnY3J5X21kX29wZW4KK0NyZWF0ZSBhIG5ldyBtZXNzYWdlIGRpZ2VzdCBpbnN0YW5jZSBhbmQgb3B0aW9uYWxseSBlbmFibGUgb25lCithbGdvcml0aG0uICBBIGZsYWcgbWF5IGJlIHVzZWQgdG8gdHVybiB0aGUgbWVzc2FnZSBkaWdlc3QgYWxnb3JpdGhtCitpbnRvIGEgSE1BQyBhbGdvcml0aG0uCisKK0BpdGVtIGdjcnlfbWRfZW5hYmxlCitFbmFibGUgYW4gYWRkaXRpb25hbCBhbGdvcml0aG0gZm9yIHRoZSBpbnN0YW5jZS4KKworQGl0ZW0gZ2NyeV9tZF9zZXRrZXkKK1NldCB0aGUga2V5IGZvciB0aGUgTUFDLgorCitAaXRlbSBnY3J5X21kX3dyaXRlCitQYXNzIG1vcmUgZGF0YSBmb3IgY29tcHV0aW5nIHRoZSBtZXNzYWdlIGRpZ2VzdCB0byBhbiBpbnN0YW5jZS4KKworQGl0ZW0gZ2NyeV9tZF9wdXRjCitCdWZmZXJlZCB2ZXJzaW9uIG9mIEBjb2Rle2djcnlfbWRfd3JpdGV9IGltcGxlbWVudGVkIGFzIGEgbWFjcm8uCisKK0BpdGVtIGdjcnlfbWRfcmVhZAorRmluYWxpemUgdGhlIGNvbXB1dGF0aW9uIG9mIHRoZSBtZXNzYWdlIGRpZ2VzdCBvciBITUFDIGFuZCByZXR1cm4gdGhlCityZXN1bHQuCisKK0BpdGVtIGdjcnlfbWRfY2xvc2UKK1JlbGVhc2UgYW4gaW5zdGFuY2UKKworQGl0ZW0gZ2NyeV9tZF9oYXNoX2J1ZmZlcgorQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gZGlyZWN0bHkgY29tcHV0ZSBhIG1lc3NhZ2UgZGlnZXN0IG92ZXIgYQorbWVtb3J5IGJ1ZmZlciB3aXRob3V0IHRoZSBuZWVkIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBmaXJzdC4KKworQGVuZCB0YWJsZQorCitUaGVyZSBhcmUgYWxzbyBmdW5jdGlvbnMgdG8gcXVlcnkgcHJvcGVydGllcyBvZiBhbGdvcml0aG1zIG9yIHRoZQoraW5zdGFuY2UsIGxpa2UgZW5hYmxlZCBhbGdvcml0aG1zLCBkaWdlc3QgbGVuZ3RoLCBtYXAgYWxnb3JpdGhtIG5hbWVzLgoraXQgaXMgYWxzbyBwb3NzaWJsZSB0byByZXNldCBhbiBpbnN0YW5jZSBvciB0byBjb3B5IHRoZSBjdXJyZW50IHN0YXRlCitvZiBhbiBpbnN0YW5jZSBhdCBhbnkgdGltZS4gIERlYnVnIGZ1bmN0aW9ucyB0byB3cml0ZSB0aGUgaGFzaGVkIGRhdGEKK3RvIGZpbGVzIGFyZSBhdmFpbGFibGUgYXMgd2VsbC4KKworCisKK0Bub2RlIE11bHRpLVByZWNpc2lvbi1JbnRlZ2VyIFN1YnN5c3RlbSBBcmNoaXRlY3R1cmUKK0BzZWN0aW9uIE11bHRpLVByZWNpc2lvbi1JbnRlZ2VyIFN1YnN5c3RlbSBBcmNoaXRlY3R1cmUKKworVGhlIGltcGxlbWVudGF0aW9uIG9mIExpYmdjcnlwdCdzIGJpZyBpbnRlZ2VyIGNvbXB1dGF0aW9uIGNvZGUgaXMKK2Jhc2VkIG9uIGFuIG9sZCByZWxlYXNlIG9mIEdOVSBNdWx0aS1QcmVjaXNpb24gTGlicmFyeSAoR01QKS4gIFRoZQorZGVjaXNpb24gbm90IHRvIHVzZSB0aGUgR01QIGxpYnJhcnkgZGlyZWN0bHkgd2FzIGR1ZSB0byBzdGFsbGVkCitkZXZlbG9wbWVudCBhdCB0aGF0IHRpbWUgYW5kIGR1ZSB0byBzZWN1cml0eSByZXF1aXJlbWVudHMgd2hpY2ggY291bGQKK25vdCBiZSBwcm92aWRlZCBieSB0aGUgY29kZSBpbiBHTVAuICBBcyBHTVAgZG9lcywgTGliZ2NyeXB0IHByb3ZpZGVzCitoaWdoIHBlcmZvcm1hbmNlIGFzc2VtYmxlciBpbXBsZW1lbnRhdGlvbnMgb2YgbG93IGxldmVsIGNvZGUgZm9yCitzZXZlcmFsIENQVVMgdG8gZ2FpbiBtdWNoIGJldHRlciBwZXJmb3JtYW5jZSB0aGFuIHdpdGggYSBnZW5lcmljIEMKK2ltcGxlbWVudGF0aW9uLgorCitAbm9pbmRlbnQKK01ham9yIGZlYXR1cmVzIG9mIExpYmdjcnlwdCdzIG11bHRpLXByZWNpc2lvbi1pbnRlZ2VyIGNvZGUgY29tcGFyZWQgdG8KK0dNUCBhcmU6CisKK0BpdGVtaXplCitAaXRlbSAKK0F2b2lkYW5jZSBvZiBzdGFjayBiYXNlZCBhbGxvY2F0aW9ucyB0byBhbGxvdyBwcm90ZWN0aW9uIGFnYWluc3QKK3N3YXBwaW5nIG91dCBvZiBzZW5zaXRpdmUgZGF0YSBhbmQgZm9yIGVhc3kgemVyb2luZyBvZiBzZW5zaXRpdmUKK2ludGVybWVkaWF0ZSByZXN1bHRzLgorCitAaXRlbQorT3B0aW9uYWwgdXNlIG9mIHNlY3VyZSBtZW1vcnkgYW5kIHRyYWNraW5nIG9mIGl0cyB1c2Ugc28gdGhhdCByZXN1bHRzCithcmUgYWxzbyBwdXQgaW50byBzZWN1cmUgbWVtb3J5LgorCitAaXRlbQorTVBJcyBhcmUgaWRlbnRpZmllZCBieSBhIGhhbmRsZSAoaW1wbGVtZW50ZWQgYXMgYSBwb2ludGVyKSB0byBnaXZlCitiZXR0ZXIgY29udHJvbCBvdmVyIGFsbG9jYXRpb25zIGFuZCB0byBhdWdtZW50IHRoZW0gd2l0aCBleHRyYQorcHJvcGVydGllcyBsaWtlIG9wYXF1ZSBkYXRhLgorCitAaXRlbQorUmVtb3ZhbCBvZiB1bm5lY2Vzc2FyeSBjb2RlIHRvIHJlZHVjZSBjb21wbGV4aXR5LgorCitAaXRlbQorRnVuY3Rpb25zIHNwZWNpYWxpemVkIGZvciBwdWJsaWMga2V5IGNyeXB0b2dyYXBoeS4KKworQGVuZCBpdGVtaXplCisKKworCitAbm9kZSBQcmltZS1OdW1iZXItR2VuZXJhdG9yIFN1YnN5c3RlbSBBcmNoaXRlY3R1cmUKK0BzZWN0aW9uIFByaW1lLU51bWJlci1HZW5lcmF0b3IgU3Vic3lzdGVtIEFyY2hpdGVjdHVyZQorCitMaWJnY3J5cHQgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRvIGl0cyBwcmltZSBudW1iZXIgZ2VuZXJhdG9yLiAgVGhlc2UKK2Z1bmN0aW9ucyBtYWtlIHVzZSBvZiB0aGUgaW50ZXJuYWwgcHJpbWUgbnVtYmVyIGdlbmVyYXRvciB3aGljaCBpcworcmVxdWlyZWQgZm9yIHRoZSBnZW5lcmF0aW9uIGZvciBwdWJsaWMga2V5IGtleSBwYWlycy4gIFRoZSBwbGFpbiBwcmltZQorY2hlY2tpbmcgZnVuY3Rpb24gaXMgZXhwb3J0ZWQgYXMgd2VsbC4KKworVGhlIGdlbmVyYXRpb24gb2YgcmFuZG9tIHByaW1lIG51bWJlcnMgaXMgYmFzZWQgb24gdGhlIExpbSBhbmQgTGVlCithbGdvcml0aG0gdG8gY3JlYXRlIHByYWN0aWNhbGx5IHNhdmUgcHJpbWVzLkBmb290bm90ZXtDaGFlIEhvb24gTGltCithbmQgUGlsIEpvb25nIExlZS4gQSBrZXkgcmVjb3ZlcnkgYXR0YWNrIG9uIGRpc2NyZXRlIGxvZy1iYXNlZCBzaGVtZXMKK3VzaW5nIGEgcHJpbWUgb3JkZXIgc3ViZ3JvdXAuIEluIEJ1cnRvbiBTLiBLYWxpc2tpIEpyLiwgZWRpdG9yLAorQWR2YW5jZXMgaW4gQ3J5cHRvbG9neTogQ3J5cHRvICc5NywgcGFnZXMgMjQ5wq0tMjYzLCBCZXJsaW4gLworSGVpZGVsYmVyZyAvIE5ldyBZb3JrLCAxOTk3LiBTcHJpbmdlci1WZXJsYWcuICBEZXNjcmliZWQgb24gcGFnZSAyNjAufQorVGhpcyBhbGdvcml0aG0gY3JlYXRlcyBhIHBvb2wgb2Ygc21hbGxlciBwcmltZXMsIHNlbGVjdCBhIGZldyBvZiB0aGVtCit0byBjcmVhdGUgY2FuZGlkYXRlIHByaW1lcyBvZiB0aGUgZm9ybSBAbWF0aHsyICogcF8wICogcF8xICogLi4uICogcF9uCisrIDF9LCB0ZXN0cyB0aGUgY2FuZGlkYXRlIGZvciBwcmltYWxpdHkgYW5kIHBlcm11dGF0ZXMgdGhlIHBvb2wgdW50aWwKK2EgcHJpbWUgaGFzIGJlZW4gZm91bmQuICBJdCBpcyBwb3NzaWJsZSB0byBjbGFtcCBvbmUgb2YgdGhlIHNtYWxsCitwcmltZXMgdG8gYSBjZXJ0YWluIHNpemUgdG8gaGVscCBEU0Egc3R5bGUgYWxnb3JpdGhtcy4gIEJlY2F1c2UgbW9zdAorb2YgdGhlIHNtYWxsIHByaW1lcyBpbiB0aGUgcG9vbCBhcmUgbm90IHVzZWQgZm9yIHRoZSByZXN1bHRpbmcgcHJpbWUKK251bWJlciwgdGhleSBhcmUgc2F2ZWQgZm9yIGxhdGVyIHVzZSAoc2VlIEBjb2Rle3NhdmVfcG9vbF9wcmltZX0gYW5kCitAY29kZXtnZXRfcG9vbF9wcmltZX0gaW4gQGZpbGV7Y2lwaGVyL3ByaW1lZ2VuLmN9KS4gIFRoZSBwcmltZQorZ2VuZXJhdG9yIG9wdGlvbmFsbHkgc3VwcG9ydHMgdGhlIGZpbmRpbmcgb2YgYW4gYXBwcm9wcmlhdGUgZ2VuZXJhdG9yLgorCitAbm9pbmRlbnQKK1RoZSBwcmltYWxpdHkgdGVzdCB3b3JrcyBpbiB0aHJlZSBzdGVwczoKKworQGVudW1lcmF0ZQorQGl0ZW0KK1RoZSBzdGFuZGFyZCBzaWV2ZSBhbGdvcml0aG0gdXNpbmcgdGhlIHByaW1lcyB1cCB0byA0OTk5IGlzIHVzZWQgYXMgYQorcXVpY2sgZmlyc3QgY2hlY2suCisKK0BpdGVtCitBIEZlcm1hdCB0ZXN0IGZpbHRlcnMgb3V0IGFsbW9zdCBhbGwgbm9uLXByaW1lcy4KKworQGl0ZW0KK0EgNSByb3VuZCBSYWJpbi1NaWxsZXIgdGVzdCBpcyBmaW5hbGx5IHVzZWQuICBUaGUgZmlyc3Qgcm91bmQgdXNlcyBhCit3aXRuZXNzIG9mIDIsIHdoZXJlYXMgdGhlIG5leHQgcm91bmRzIHVzZSBhIHJhbmRvbSB3aXRuZXNzLgorCitAZW5kIGVudW1lcmF0ZQorCitUbyBzdXBwb3J0IHRoZSBnZW5lcmF0aW9uIG9mIFJTQSBhbmQgRFNBIGtleXMgaW4gRklQUyBtb2RlIGFjY29yZGluZwordG8gWDkuMzEgYW5kIEZJUFMgMTg2LTIsIExpYmdjcnlwdCBpbXBsZW1lbnRzIHR3byBhZGRpdGlvbmFsIHByaW1lCitnZW5lcmF0aW9uIGZ1bmN0aW9uczogQGNvZGV7X2djcnlfZGVyaXZlX3g5MzFfcHJpbWV9IGFuZAorQGNvZGV7X2djcnlfZ2VuZXJhdGVfZmlwczE4Nl8yX3ByaW1lfS4gIFRoZXNlIGZ1bmN0aW9ucyBhcmUgaW50ZXJuYWwKK2FuZCBub3QgYXZhaWxhYmxlIHRocm91Z2ggdGhlIHB1YmxpYyBBUEkuCisKKworCitAbm9kZSBSYW5kb20tTnVtYmVyIFN1YnN5c3RlbSBBcmNoaXRlY3R1cmUKK0BzZWN0aW9uIFJhbmRvbS1OdW1iZXIgU3Vic3lzdGVtIEFyY2hpdGVjdHVyZQorCitMaWJnY3J5cHQgcHJvdmlkZXMgMyBsZXZlbHMgb3IgcmFuZG9tIHF1YWxpdHk6IFRoZSBsZXZlbAorQGNvZGV7R0NSWV9WRVJZX1NUUk9OR19SQU5ET019IHVzdWFsbHkgdXNlZCBmb3Iga2V5IGdlbmVyYXRpb24sIHRoZQorbGV2ZWwgQGNvZGV7R0NSWV9TVFJPTkdfUkFORE9NfSBmb3IgYWxsIG90aGVyIHN0cm9uZyByYW5kb20KK3JlcXVpcmVtZW50cyBhbmQgdGhlIGZ1bmN0aW9uIEBjb2Rle2djcnlfY3JlYXRlX25vbmNlfSB3aGljaCBpcyB1c2VkCitmb3Igd2Vha2VyIHVzYWdlcyBsaWtlIG5vbmNlcy4gIFRoZXJlIGlzIGFsc28gYSBsZXZlbAorQGNvZGV7R0NSWV9XRUFLX1JBTkRPTX0gd2hpY2ggaW4gZ2VuZXJhbCBtYXBzIHRvCitAY29kZXtHQ1JZX1NUUk9OR19SQU5ET019IGV4Y2VwdCB3aGVuIHVzZWQgd2l0aCB0aGUgZnVuY3Rpb24KK0Bjb2Rle2djcnlfbXBpX3JhbmRvbWl6ZX0sIHdoZXJlIGl0IHJhbmRvbWl6ZXMgYW4KK211bHRpLXByZWNpc2lvbi1pbnRlZ2VyIHVzaW5nIHRoZSBAY29kZXtnY3J5X2NyZWF0ZV9ub25jZX0gZnVuY3Rpb24uCisKK0Bub2luZGVudAorVGhlcmUgYXJlIHR3byBkaXN0aW5jdCByYW5kb20gZ2VuZXJhdG9ycyBhdmFpbGFibGU6IAorCitAaXRlbWl6ZQorQGl0ZW0gCitUaGUgQ29udGludW91c2x5IFNlZWRlZCBQc2V1ZG8gUmFuZG9tIE51bWJlciBHZW5lcmF0b3IgKENTUFJORyksIHdoaWNoCitpcyBiYXNlZCBvbiB0aGUgY2xhc3NpYyBHbnVQRyBkZXJpdmVkIGJpZyBwb29sIGltcGxlbWVudGF0aW9uLgorSW1wbGVtZW50ZWQgaW4gQGNvZGV7cmFuZG9tL3JhbmRvbS1jc3BybmcuY30gYW5kIHVzZWQgYnkgZGVmYXVsdC4KK0BpdGVtCitBIEZJUFMgYXBwcm92ZWQgQU5TSSBYOS4zMSBQUk5HIHVzaW5nIEFFUyB3aXRoIGEgMTI4IGJpdCBrZXkuIEltcGxlbWVudGVkIGluCitAY29kZXtyYW5kb20vcmFuZG9tLWZpcHMuY30gYW5kIHVzZWQgaWYgTGliZ2NyeXB0IGlzIGluIEZJUFMgbW9kZS4KK0BlbmQgaXRlbWl6ZQorCitAbm9pbmRlbnQKK0JvdGggZ2VuZXJhdG9ycyBtYWtlIHVzZSBvZiBzby1jYWxsZWQgZW50cm9weSBnYXRoZXJpbmcgbW9kdWxlczoKKworQHRhYmxlIEBhc2lzCitAaXRlbSBybmRsaW51eAorVXNlcyB0aGUgb3BlcmF0aW5nIHN5c3RlbSBwcm92aWRlZAorQGZpbGV7L2Rldi9yYW5kb219IGFuZCBAZmlsZXsvZGV2L3VyYW5kb219IGRldmljZXMuCisKK0BpdGVtIHJuZHVuaXgKK1J1bnMgc2V2ZXJhbCBvcGVyYXRpbmcgc3lzdGVtIGNvbW1hbmRzIHRvIGNvbGxlY3QgZW50cm9weSBmcm9tIHNvdXJjZXMKK2xpa2UgdmlydHVhbCBtYWNoaW5lIGFuZCBwcm9jZXNzIHN0YXRpc3RpY3MuICBJdCBpcyBhIGtpbmQgb2YKK3Bvb3ItbWFuJ3MgQGNvZGV7L2Rldi9yYW5kb219IGltcGxlbWVudGF0aW9uLiBJdCBpcyBub3QgYXZhaWxhYmxlIGluCitGSVBTIG1vZGUuCisKK0BpdGVtIHJuZGVnZAorVXNlcyB0aGUgb3BlcmF0aW5nIHN5c3RlbSBwcm92aWRlZCBFbnRyb3B5IEdhdGhlcmluZyBEYWVtb24gKEVHRCkuCitUaGUgRUdEIGJhc2ljYWxseSB1c2VzIHRoZSBzYW1lIGFsZ29yaXRobXMgYXMgcm5kdW5peCBkb2VzLiAgSG93ZXZlcgorYXMgYSBzeXN0ZW0gZGFlbW9uIGl0IGtlZXBzIG9uIHJ1bm5pbmcgYW5kIHRodXMgY2FuIHNlcnZlIHNldmVyYWwKK3Byb2Nlc3NlcyByZXF1aXJpbmcgZW50cm9weSBpbnB1dCBhbmQgZG9lcyBub3Qgd2FzdGUgY29sbGVjdGVkIGVudHJvcHkKK2lmIHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBuZWVkIGFsbCB0aGUgY29sbGVjdGVkIGVudHJvcHkuIEl0IGlzIG5vdAorYXZhaWxhYmxlIGluIEZJUFMgbW9kZS4KKworQGl0ZW0gcm5kdzMyCitUYXJnZXRlZCBmb3IgdGhlIE1pY3Jvc29mdCBXaW5kb3dzIE9TLiAgSXQgdXNlcyBjZXJ0YWluIHByb3BlcnRpZXMgb2YKK3RoYXQgc3lzdGVtIGFuZCBpcyB0aGUgb25seSBnYXRoZXJpbmcgbW9kdWxlIGF2YWlsYWJsZSBmb3IgdGhhdCBPUy4KKworQGl0ZW0gcm5kaHcKK0V4dHJhIG1vZHVsZSB0byBjb2xsZWN0IGFkZGl0aW9uYWwgZW50cm9weSBieSB1dGlsaXppbmcgYSBoYXJkd2FyZQorcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuICBBcyBvZiBub3cgdGhlIG9ubHkgc3VwcG9ydGVkIGhhcmR3YXJlIFJORyBpcwordGhlIFBhZGxvY2sgZW5naW5lIG9mIFZJQSAoQ2VudGF1cikgQ1BVcy4gIEl0IGlzIG5vdCBhdmFpbGFibGUgaW4gRklQUworbW9kZS4KKworQGVuZCB0YWJsZQorCisKK0BtZW51CisqIENTUFJORyBEZXNjcmlwdGlvbjo6ICAgICAgRGVzY3JpcHRpb24gb2YgdGhlIENTUFJORy4KKyogRklQUyBQUk5HIERlc2NyaXB0aW9uOjogICBEZXNjcmlwdGlvbiBvZiB0aGUgRklQUyBYOS4zMSBQUk5HLgorQGVuZCBtZW51CisKKworQG5vZGUgQ1NQUk5HIERlc2NyaXB0aW9uCitAc3Vic2VjdGlvbiBEZXNjcmlwdGlvbiBvZiB0aGUgQ1NQUk5HCisKK1RoaXMgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgaXMgbG9vc2VseSBtb2RlbGxlZCBhZnRlciB0aGUgb25lCitkZXNjcmliZWQgaW4gUGV0ZXIgR3V0bWFubidzIHBhcGVyOiAiU29mdHdhcmUgR2VuZXJhdGlvbiBvZgorUHJhY3RpY2FsbHkgU3Ryb25nIFJhbmRvbSBOdW1iZXJzIi5AZm9vdG5vdGV7QWxzbyBkZXNjcmliZWQgaW4gY2hhcHRlcgorNiBvZiBoaXMgYm9vayAiQ3J5cHRvZ3JhcGhpYyBTZWN1cml0eSBBcmNoaXRlY3R1cmUiLCBOZXcgWW9yaywgMjAwNCwKK0lTQk4gMC0zODctOTUzODctNi59CisKK0EgcG9vbCBvZiA2MDAgYnl0ZXMgaXMgdXNlZCBhbmQgbWl4ZWQgdXNpbmcgdGhlIGNvcmUgUklQRS1NRDE2MCBoYXNoCit0cmFuc2Zvcm0gZnVuY3Rpb24uICBTZXZlcmFsIGV4dHJhIGZlYXR1cmVzIGFyZSB1c2VkIHRvIG1ha2UgdGhlCityb2J1c3QgYWdhaW5zdCBhIHdpZGUgdmFyaWV0eSBvZiBhdHRhY2tzIGFuZCB0byBwcm90ZWN0IGFnYWluc3QKK2ZhaWx1cmVzIG9mIHN1YnN5c3RlbXMuICBUaGUgc3RhdGUgb2YgdGhlIGdlbmVyYXRvciBtYXkgYmUgc2F2ZWQgdG8gYQorZmlsZSBhbmQgaW5pdGlhbGx5IHNlZWQgZm9ybSBhIGZpbGUuCisKK0RlcGVuZGluZyBvbiBob3cgTGliZ2NyeXB0IHdhcyBidWlsZCB0aGUgZ2VuZXJhdG9yIGlzIGFibGUgdG8gc2VsZWN0Cit0aGUgYmVzdCB3b3JraW5nIGVudHJvcHkgZ2F0aGVyaW5nIG1vZHVsZS4gIEl0IG1ha2VzIHVzZSBvZiB0aGUgc2xvdworYW5kIGZhc3QgY29sbGVjdGlvbiBtZXRob2RzIGFuZCByZXF1aXJlcyB0aGUgcG9vbCB0byBpbml0aWFsbHkgc2VlZGVkCitmb3JtIHRoZSBzbG93IGdhdGhlcmVyIG9yIGEgc2VlZCBmaWxlLiAgQW4gZW50cm9weSBlc3RpbWF0aW9uIGlzIHVzZWQKK3RvIG1peCBpbiBlbm91Z2ggZGF0YSBmcm9tIHRoZSBnYXRoZXIgbW9kdWxlcyBiZWZvcmUgcmV0dXJuaW5nIHRoZQorYWN0dWFsIHJhbmRvbSBvdXRwdXQuICBQcm9jZXNzIGZvcmsgZGV0ZWN0aW9uIGFuZCBwcm90ZWN0aW9uIGlzCitpbXBsZW1lbnRlZC4KKworQGMgRklYTUU6ICBUaGUgZGVzaWduIGFuZCBpbXBsZW1lbnRhaW9uIG5lZWRzIGEgbW9yZSB2ZXJib3NlIGRlc2NyaXB0aW9uLgorCitUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIG5vbmNlIGdlbmVyYXRvciAoZm9yCitAY29kZXtnY3J5X2NyZWF0ZV9ub25jZX0pIGlzIGEgc3RyYWlnaHRmb3J3YXJkIHJlcGVhdGVkIGhhc2ggZGVzaWduOiBBCisyOCBieXRlIGJ1ZmZlciBpcyBpbml0aWFsbHkgc2VlZGVkIHdpdGggdGhlIFBJRCBhbmQgdGhlIHRpbWUgaW4KK3NlY29uZHMgaW4gdGhlIGZpcnN0IDIwIGJ5dGVzIGFuZCB3aXRoIDggYnl0ZXMgb2YgcmFuZG9tIHRha2VuIGZyb20KK3RoZSBAY29kZXtHQ1JZX1NUUk9OR19SQU5ET019IGdlbmVyYXRvci4gIFJhbmRvbSBudW1iZXJzIGFyZSB0aGVuCitjcmVhdGVkIGJ5IGhhc2hpbmcgYWxsIHRoZSAyOCBieXRlcyB3aXRoIFNIQS0xIGFuZCBzYXZpbmcgdGhhdCBhZ2FpbgoraW4gdGhlIGZpcnN0IDIwIGJ5dGVzLiAgVGhlIGhhc2ggaXMgYWxzbyByZXR1cm5lZCBhcyByZXN1bHQuCisKKworQG5vZGUgRklQUyBQUk5HIERlc2NyaXB0aW9uCitAc3Vic2VjdGlvbiBEZXNjcmlwdGlvbiBvZiB0aGUgRklQUyBYOS4zMSBQUk5HCisKK1RoZSBjb3JlIG9mIHRoaXMgZGV0ZXJtaW5pc3RpYyByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBpcyBpbXBsZW1lbnRlZAorYWNjb3JkaW5nIHRvIHRoZSBkb2N1bWVudCBgYE5JU1QtUmVjb21tZW5kZWQgUmFuZG9tIE51bWJlciBHZW5lcmF0b3IKK0Jhc2VkIG9uIEFOU0kgWDkuMzEgQXBwZW5kaXggQS4yLjQgVXNpbmcgdGhlIDMtS2V5IFRyaXBsZSBERVMgYW5kIEFFUworQWxnb3JpdGhtcycnLCBkYXRlZCAyMDA1LTAxLTMxLiAgVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSBBRVMKK3ZhcmlhbnQuCisKK1RoZSBnZW5lcmF0b3IgaXMgYmFzZWQgb24gY29udGV4dHMgdG8gdXRpbGl6ZSB0aGUgc2FtZSBjb3JlIGZ1bmN0aW9ucworZm9yIGFsbCByYW5kb20gbGV2ZWxzIGFzIHJlcXVpcmVkIGJ5IHRoZSBoaWdoLWxldmVsIGludGVyZmFjZS4gIEFsbAorcmFuZG9tIGdlbmVyYXRvcnMgcmV0dXJuIHRoZWlyIGRhdGEgaW4gMTI4IGJpdCBibG9ja3MuICBJZiB0aGUgY2FsbGVyCityZXF1ZXN0cyBsZXNzIGJpdHMsIHRoZSBleHRyYSBiaXRzIGFyZSBub3QgdXNlZC4gIFRoZSBrZXkgZm9yIGVhY2gKK2dlbmVyYXRvciBpcyBvbmx5IHNldCBvbmNlIGF0IHRoZSBmaXJzdCB0aW1lIGEgZ2VuZXJhdG9yIGNvbnRleHQgaXMKK3VzZWQuICBUaGUgc2VlZCB2YWx1ZSBpcyBzZXQgYWxvbmcgd2l0aCB0aGUga2V5IGFuZCBhZ2FpbiBhZnRlciAxMDAwCitvdXRwdXQgYmxvY2tzLgorCitPbiBVbml4IGxpa2Ugc3lzdGVtcyB0aGUgQGNvZGV7R0NSWV9WRVJZX1NUUk9OR19SQU5ET019IGFuZAorQGNvZGV7R0NSWV9TVFJPTkdfUkFORE9NfSBnZW5lcmF0b3JzIGFyZSBrZXllZCBhbmQgc2VlZGVkIHVzaW5nIHRoZQorcm5kbGludXggbW9kdWxlIHdpdGggdGhlIEBmaWxley9kZXYvcmFkbm9tfSBkZXZpY2UuIFRodXMgdGhlc2UKK2dlbmVyYXRvcnMgbWF5IGJsb2NrIHVudGlsIHRoZSBPUyBrZXJuZWwgaGFzIGNvbGxlY3RlZCBlbm91Z2ggZW50cm9weS4KK1doZW4gdXNlZCB3aXRoIE1pY3Jvc29mdCBXaW5kb3dzIHRoZSBybmR3MzIgbW9kdWxlIGlzIHVzZWQgaW5zdGVhZC4KKworVGhlIGdlbmVyYXRvciB1c2VkIGZvciBAY29kZXtnY3J5X2NyZWF0ZV9ub25jZX0gaXMga2V5ZWQgYW5kIHNlZWRlZAorZnJvbSB0aGUgQGNvZGV7R0NSWV9TVFJPTkdfUkFORE9NfSBnZW5lcmF0b3IuICBUaHVzIGlzIG1heSBhbHNvIGJsb2NrCitpZiB0aGUgQGNvZGV7R0NSWV9TVFJPTkdfUkFORE9NfSBnZW5lcmF0b3IgaGFzIG5vdCB5ZXQgYmVlbiB1c2VkCitiZWZvcmUgYW5kIHRodXMgZ2V0cyBpbml0aWFsaXplZCBvbiB0aGUgZmlyc3QgdXNlIGJ5CitAY29kZXtnY3J5X2NyZWF0ZV9ub25jZX0uICBUaGlzIHNwZWNpYWwgdHJlYXRtZW50IGlzIGp1c3RpZmllZCBieSB0aGUKK3dlYWtlciByZXF1aXJlbWVudHMgZm9yIGEgbm9uY2UgZ2VuZXJhdG9yIGFuZCB0byBzYXZlIHByZWNpb3VzIGtlcm5lbAorZW50cm9weSBmb3IgdXNlIGJ5IHRoZSBgYHJlYWwnJyByYW5kb20gZ2VuZXJhdG9ycy4KKworQSBzZWxmLXRlc3QgZmFjaWxpdHkgdXNlcyBhIHNlcGFyYXRlIGNvbnRleHQgdG8gY2hlY2sgdGhlCitmdW5jdGlvbmFsaXR5IG9mIHRoZSBjb3JlIFg5LjMxIGZ1bmN0aW9ucyB1c2luZyBhIGtub3duIGFuc3dlcnMgdGVzdC4KK0R1cmluZyBydW50aW1lIGVhY2ggb3V0cHV0IGJsb2NrIGlzIGNvbXBhcmVkIHRvIHRoZSBwcmV2aW91cyBvbmUgdG8KK2RldGVjdCBhIHN0dWNrZWQgZ2VuZXJhdG9yLgorCitUaGUgRFQgdmFsdWUgZm9yIHRoZSBnZW5lcmF0b3IgaXMgbWFkZSB1cCBvZiB0aGUgY3VycmVudCB0aW1lIGRvd24gdG8KK21pY3Jvc2Vjb25kcyAoaWYgYXZhaWxhYmxlKSBhbmQgYSBmcmVlIHJ1bm5pbmcgNjQgYml0IGNvdW50ZXIuICBXaGVuCit1c2VkIHdpdGggdGhlIHRlc3QgY29udGV4dCB0aGUgRFQgdmFsdWUgaXMgdGFrZW4gZnJvbSB0aGUgY29udGV4dCBhbmQKK2luY3JlbWVudGVkIG9uIGVhY2ggdXNlLgorCitAYyBAbm9kZSBIZWxwZXIgU3Vic3lzdGVtcyBBcmNoaXRlY3R1cmUKK0BjIEBzZWN0aW9uIEhlbHBlciBTdWJzeXN0ZW1zIEFyY2hpdGVjdHVyZQorQGMgCitAYyBUaGVyZSBhcmUgYSBmZXcgc21hbGxlciBzdWJzeXN0ZW1zIHdoaWNoIGFyZSBtYWlubHkgdXNlZCBpbnRlcm5hbGx5IGJ5CitAYyBMaWJnY3J5cHQgYnV0IGFsc28gYXZhaWxhYmxlIHRvIGFwcGxpY2F0aW9ucy4KK0BjIAorQGMgQG1lbnUKK0BjICogUy1leHByZXNzaW9uIFN1YnN5c3RlbSBBcmNoaXRlY3R1cmU6OiAgIERldGFpbHMgYWJvdXQgdGhlIFMtZXhwcmVzc2lvbiBhcmNoaXRlY3R1cmUuCitAYyAqIE1lbW9yeSBTdWJzeXN0ZW0gQXJjaGl0ZWN0dXJlOjogICAgICAgICBEZXRhaWxzIGFib3V0IHRoZSBtZW1vcnkgYWxsb2NhdGlvbiBhcmNoaXRlY3R1cmUuCitAYyAqIE1pc2NlbGxhbmVvdXMgU3Vic3lzdGVtcyBBcmNoaXRlY3R1cmU6OiBEZXRhaWxzIGFib3V0IG90aGVyIHN1YnN5c3RlbXMuCitAYyBAZW5kIG1lbnUKK0BjIAorQGMgQG5vZGUgUy1leHByZXNzaW9uIFN1YnN5c3RlbSBBcmNoaXRlY3R1cmUKK0BjIEBzdWJzZWN0aW9uIFMtZXhwcmVzc2lvbiBTdWJzeXN0ZW0gQXJjaGl0ZWN0dXJlCitAYyAKK0BjIExpYmdjcnlwdCBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gUy1leHByZXNzaW9uIHRvIGNyZWF0ZSBhbmQgcGFyc2UKK0BjIHRoZW0uICBUbyB1c2UgYW4gUy1leHByZXNzaW9uIHdpdGggTGliZ2NyeXB0IGl0IG5lZWRzIGZpcnN0IGJlCitAYyBjb252ZXJ0ZWQgaW50byB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gdXNlZCBieSBMaWJnY3J5cHQgKHRoZSB0eXBlCitAYyBAY29kZXtnY3J5X3NleHBfdH0pLiAgVGhlIGNvbnZlcnNpb24gZnVuY3Rpb25zIHN1cHBvcnQgYSBsYXJnZSBzdWJzZXQKK0BjIG9mIHRoZSBTLWV4cHJlc3Npb24gc3BlY2lmaWNhdGlvbiBhbmQgZnVydGhlciBmYXR1cmUgYSBwcmludGYgbGlrZQorQGMgZnVuY3Rpb24gdG8gY29udmVydCBhIGxpc3Qgb2YgYmlnIGludGVnZXJzIG9yIG90aGVyIGJpbmFyeSBkYXRhIGludG8KK0BjIGFuIFMtZXhwcmVzc2lvbi4KK0BjIAorQGMgTGliZ2NyeXB0IGN1cnJlbnRseSBpbXBsZW1lbnRzIFMtZXhwcmVzc2lvbnMgdXNpbmcgYSB0YWdnZWQgbGlua2VkCitAYyBsaXN0LiAgSG93ZXZlciB0aGlzIGlzIG5vdCBleHBvc2VkIHRvIGFuIGFwcGxpY2F0aW9uIGFuZCBtYXkgYmUKK0BjIGNoYW5nZWQgaW4gZnV0dXJlIHJlbGVhc2VzIHRvIHJlZHVjZSBvdmVyaGVhZCB3aGVuIGFscmVhZHkgd29ya2luZworQGMgd2l0aCBjYW5vbmljYWxseSBlbmNvZGVkIFMtZXhwcmVzc2lvbnMuICBTZWN1cmUgbWVtb3J5IGlzIHN1cHBvcnRlZCBieQorQGMgdGhpcyBTLWV4cHJlc3Npb25zIGltcGxlbWVudGF0aW9uLgorQGMgCitAYyBAbm9kZSBNZW1vcnkgU3Vic3lzdGVtIEFyY2hpdGVjdHVyZSAKK0BjIEBzdWJzZWN0aW9uIE1lbW9yeSBTdWJzeXN0ZW0gQXJjaGl0ZWN0dXJlIAorQGMgCitAYyBUQkQuCitAYyAKK0BjIAorQGMgQG5vZGUgTWlzY2VsbGFuZW91cyBTdWJzeXN0ZW1zIEFyY2hpdGVjdHVyZQorQGMgQHN1YnNlY3Rpb24gTWlzY2VsbGFuZW91cyBTdWJzeXN0ZW1zIEFyY2hpdGVjdHVyZQorQGMgCitAYyBUQkQuCitAYyAKK0BjIAorCisKKworQGMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQGMgKioqKioqKioqKioqKioqKioqKiAgQXBwZW5kaWNlcyAgKioqKioqKioqKioqKioqKioqKioqKioqKgorQGMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitAYyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQG5vZGUgU2VsZi1UZXN0cworQGFwcGVuZGl4IERlc2NyaXB0aW9uIG9mIHRoZSBTZWxmLVRlc3RzCisKK0luIGFkZGl0aW9uIHRvIHRoZSBidWlsZCB0aW1lIHJlZ3Jlc3Npb24gdGVzdCBzdWl0ZSwgTGliZ2NyeXB0CitpbXBsZW1lbnRzIHNlbGYtdGVzdHMgdG8gYmUgcGVyZm9ybWVkIGF0IHJ1bnRpbWUuICBXaGljaCBzZWxmLXRlc3RzCithcmUgYWN0dWFsbHkgdXNlZCBkZXBlbmRzIG9uIHRoZSBtb2RlIExpYmdjcnlwdCBpcyB1c2VkIGluLiAgSW4KK3N0YW5kYXJkIG1vZGUgYSBsaW1pdGVkIHNldCBvZiBzZWxmLXRlc3RzIGlzIHJ1biBhdCB0aGUgdGltZSBhbgorYWxnb3JpdGhtIGlzIGZpcnN0IHVzZWQuICBOb3RlIHRoYXQgbm90IGFsbCBhbGdvcml0aG1zIGZlYXR1cmUgYQorc2VsZi10ZXN0IGluIHN0YW5kYXJkIG1vZGUuICBUaGUgQGNvZGV7R0NSWUNUTF9TRUxGVEVTVH0gY29udHJvbAorY29tbWFuZCBtYXkgYmUgdXNlZCB0byBydW4gYWxsIGltcGxlbWVudGVkIHNlbGYtdGVzdHMgYXQgYW55IHRpbWU7Cit0aGlzIHdpbGwgZXZlbiBydW4gbW9yZSB0ZXN0cyB0aGFuIHRob3NlIHJ1biBpbiBGSVBTIG1vZGUuCisKK0lmIGFueSBvZiB0aGUgc2VsZi10ZXN0cyBmYWlscywgdGhlIGxpYnJhcnkgaW1tZWRpYXRlbHkgcmV0dXJucyBhbgorZXJyb3IgY29kZSB0byB0aGUgY2FsbGVyLiAgSWYgTGliZ2NyeXB0IGlzIGluIEZJUFMgbW9kZSB0aGUgc2VsZi10ZXN0cword2lsbCBiZSBwZXJmb3JtZWQgd2l0aGluIHRoZSBgYFNlbGYtVGVzdCcnIHN0YXRlIGFuZCBhbnkgZmFpbHVyZSBwdXRzCit0aGUgbGlicmFyeSBpbnRvIHRoZSBgYEVycm9yJycgc3RhdGUuCisKK0BjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitAc2VjdGlvbiBQb3dlci1VcCBUZXN0cworCitQb3dlci11cCB0ZXN0cyBhcmUgb25seSBwZXJmb3JtZWQgaWYgTGliZ2NyeXB0IGlzIGluIEZJUFMgbW9kZS4gIAorCitAc3Vic2VjdGlvbiBTeW1tZXRyaWMgQ2lwaGVyIEFsZ29yaXRobSBQb3dlci1VcCBUZXN0cworCitUaGUgZm9sbG93aW5nIHN5bW1ldHJpYyBlbmNyeXB0aW9uIGFsZ29yaXRobSB0ZXN0cyBhcmUgcnVuIGR1cmluZworcG93ZXItdXA6CisKK0B0YWJsZSBAYXNpcworQGl0ZW0gM0RFUworVG8gdGVzdCB0aGUgM0RFUyAzLWtleSBFREUgZW5jcnlwdGlvbiBpbiBFQ0IgbW9kZSB0aGVzZSB0ZXN0cyBhcmUKK3J1bjoKK0BlbnVtZXJhdGUKK0BpdGVtCitBIGtub3duIGFuc3dlciB0ZXN0IGlzIHJ1biBvbiBhIDY0IGJpdCB0ZXN0IHZlY3RvciBwcm9jZXNzZWQgYnkgNjQKK3JvdW5kcyBvZiBTaW5nbGUtREVTIGJsb2NrIGVuY3J5cHRpb24gYW5kIGRlY3J5cHRpb24gdXNpbmcgYSBrZXkKK2NoYW5nZWQgd2l0aCBlYWNoIHJvdW5kLgorQGl0ZW0KK0Ega25vd24gYW5zd2VyIHRlc3QgaXMgcnVuIG9uIGEgNjQgYml0IHRlc3QgdmVjdG9yIHByb2Nlc3NlZCBieSAxNgorcm91bmRzIG9mIDIta2V5IGFuZCAzLWtleSBUcmlwbGUtREVTIGJsb2NrIGVuY3J5cHRpb24gYW5kIGRlY3J5cHRpb25zCit1c2luZyBhIGtleSBjaGFuZ2VkIHdpdGggZWFjaCByb3VuZC4KK0BpdGVtCisxMCBrbm93biBhbnN3ZXIgdGVzdHMgdXNpbmcgMy1rZXkgVHJpcGxlLURFUyBFREUgZW5jcnlwdGlvbiwgY29tcGFyaW5nCit0aGUgY2lwaGVydGV4dCB0byB0aGUga25vd24gdmFsdWUsIHRoZW4gcnVubmluZyBhIGRlY3J5cHRpb24gYW5kCitjb21wYXJpbmcgaXQgdG8gdGhlIGluaXRpYWwgcGxhaW50ZXh0LgorQGVuZCBlbnVtZXJhdGUKKyhAY29kZXtjaXBoZXIvZGVzLmM6c2VsZnRlc3R9KQorCitAaXRlbSBBRVMtMTI4CitBIGtub3duIGFuc3dlciB0ZXN0cyBpcyBydW4gdXNpbmcgb25lIHRlc3QgdmVjdG9yIGFuZCBvbmUgdGVzdAora2V5IHdpdGggQUVTIGluIEVDQiBtb2RlLiAoQGNvZGV7Y2lwaGVyL3Jpam5kYWVsLmM6c2VsZnRlc3RfYmFzaWNfMTI4fSkKKworQGl0ZW0gQUVTLTE5MgorQSBrbm93biBhbnN3ZXIgdGVzdHMgaXMgcnVuIHVzaW5nIG9uZSB0ZXN0IHZlY3RvciBhbmQgb25lIHRlc3QKK2tleSB3aXRoIEFFUyBpbiBFQ0IgbW9kZS4gKEBjb2Rle2NpcGhlci9yaWpuZGFlbC5jOnNlbGZ0ZXN0X2Jhc2ljXzE5Mn0pCisKK0BpdGVtIEFFUy0yNTYKK0Ega25vd24gYW5zd2VyIHRlc3RzIGlzIHJ1biB1c2luZyBvbmUgdGVzdCB2ZWN0b3IgYW5kIG9uZSB0ZXN0IGtleQord2l0aCBBRVMgaW4gRUNCIG1vZGUuIChAY29kZXtjaXBoZXIvcmlqbmRhZWwuYzpzZWxmdGVzdF9iYXNpY18yNTZ9KQorQGVuZCB0YWJsZQorCitAc3Vic2VjdGlvbiBIYXNoIEFsZ29yaXRobSBQb3dlci1VcCBUZXN0cworCitUaGUgZm9sbG93aW5nIGhhc2ggYWxnb3JpdGhtIHRlc3RzIGFyZSBydW4gZHVyaW5nIHBvd2VyLXVwOgorCitAdGFibGUgQGFzaXMKK0BpdGVtIFNIQS0xCitBIGtub3duIGFuc3dlciB0ZXN0IHVzaW5nIHRoZSBzdHJpbmcgQGNvZGV7ImFiYyJ9IGlzIHJ1bi4KKyhAY29kZXtjaXBoZXIvQC9zaGExLmM6QC9zZWxmdGVzdHNfc2hhMX0pCitAaXRlbSBTSEEtMjI0CitBIGtub3duIGFuc3dlciB0ZXN0IHVzaW5nIHRoZSBzdHJpbmcgQGNvZGV7ImFiYyJ9IGlzIHJ1bi4KKyhAY29kZXtjaXBoZXIvQC9zaGEyNTYuYzpAL3NlbGZ0ZXN0c19zaGEyMjR9KQorQGl0ZW0gU0hBLTI1NgorQSBrbm93biBhbnN3ZXIgdGVzdCB1c2luZyB0aGUgc3RyaW5nIEBjb2RleyJhYmMifSBpcyBydW4uCisoQGNvZGV7Y2lwaGVyL0Avc2hhMjU2LmM6QC9zZWxmdGVzdHNfc2hhMjU2fSkKK0BpdGVtIFNIQS0zODQKK0Ega25vd24gYW5zd2VyIHRlc3QgdXNpbmcgdGhlIHN0cmluZyBAY29kZXsiYWJjIn0gaXMgcnVuLgorKEBjb2Rle2NpcGhlci9AL3NoYTUxMi5jOkAvc2VsZnRlc3RzX3NoYTM4NH0pCitAaXRlbSBTSEEtNTEyCitBIGtub3duIGFuc3dlciB0ZXN0IHVzaW5nIHRoZSBzdHJpbmcgQGNvZGV7ImFiYyJ9IGlzIHJ1bi4KKyhAY29kZXtjaXBoZXIvQC9zaGE1MTIuYzpAL3NlbGZ0ZXN0c19zaGE1MTJ9KQorQGVuZCB0YWJsZQorCitAc3Vic2VjdGlvbiBNQUMgQWxnb3JpdGhtIFBvd2VyLVVwIFRlc3RzCisKK1RoZSBmb2xsb3dpbmcgTUFDIGFsZ29yaXRobSB0ZXN0cyBhcmUgcnVuIGR1cmluZyBwb3dlci11cDoKKworQHRhYmxlIEBhc2lzCitAaXRlbSBITUFDIFNIQS0xCitBIGtub3duIGFuc3dlciB0ZXN0IHVzaW5nIDkgYnl0ZSBvZiBkYXRhIGFuZCBhIDY0IGJ5dGUga2V5IGlzIHJ1bi4KKyhAY29kZXtjaXBoZXIvaG1hYy10ZXN0cy5jOnNlbGZ0ZXN0c19zaGExfSkKK0BpdGVtIEhNQUMgU0hBLTIyNAorQSBrbm93biBhbnN3ZXIgdGVzdCB1c2luZyAyOCBieXRlIG9mIGRhdGEgYW5kIGEgNCBieXRlIGtleSBpcyBydW4uCisoQGNvZGV7Y2lwaGVyL2htYWMtdGVzdHMuYzpzZWxmdGVzdHNfc2hhMjI0fSkKK0BpdGVtIEhNQUMgU0hBLTI1NgorQSBrbm93biBhbnN3ZXIgdGVzdCB1c2luZyAyOCBieXRlIG9mIGRhdGEgYW5kIGEgNCBieXRlIGtleSBpcyBydW4uCisoQGNvZGV7Y2lwaGVyL2htYWMtdGVzdHMuYzpzZWxmdGVzdHNfc2hhMjU2fSkKK0BpdGVtIEhNQUMgU0hBLTM4NAorQSBrbm93biBhbnN3ZXIgdGVzdCB1c2luZyAyOCBieXRlIG9mIGRhdGEgYW5kIGEgNCBieXRlIGtleSBpcyBydW4uCisoQGNvZGV7Y2lwaGVyL2htYWMtdGVzdHMuYzpzZWxmdGVzdHNfc2hhMzg0fSkKK0BpdGVtIEhNQUMgU0hBLTUxMgorQSBrbm93biBhbnN3ZXIgdGVzdCB1c2luZyAyOCBieXRlIG9mIGRhdGEgYW5kIGEgNCBieXRlIGtleSBpcyBydW4uCisoQGNvZGV7Y2lwaGVyL2htYWMtdGVzdHMuYzpzZWxmdGVzdHNfc2hhNTEyfSkKK0BlbmQgdGFibGUKKworQHN1YnNlY3Rpb24gUmFuZG9tIE51bWJlciBQb3dlci1VcCBUZXN0CisKK1RoZSBEUk5HIGlzIHRlc3RlZCBkdXJpbmcgcG93ZXItdXAgdGhpcyB3YXk6CisKK0BlbnVtZXJhdGUKK0BpdGVtIAorUmVxdWVzdGluZyBvbmUgYmxvY2sgb2YgcmFuZG9tIHVzaW5nIHRoZSBwdWJsaWMgaW50ZXJmYWNlIHRvIGNoZWNrCitnZW5lcmFsIHdvcmtpbmcgYW5kIHRoZSBkdXBsaWNhdGVkIGJsb2NrIGRldGVjdGlvbi4KK0BpdGVtCiszIGtub3cgYW5zd2VyIHRlc3RzIHVzaW5nIHByZS1kZWZpbmVkIGtleXMsIHNlZWQgYW5kIGluaXRpYWwgRFQKK3ZhbHVlcy4gIEZvciBlYWNoIHRlc3QgMyBibG9ja3Mgb2YgMTYgYnl0ZXMgYXJlIHJlcXVlc3RlZCBhbmQgY29tcGFyZWQKK3RvIHRoZSBleHBlY3RlZCByZXN1bHQuICBUaGUgRFQgdmFsdWUgaXMgaW5jcmVtZW50ZWQgZm9yIGVhY2ggYmxvY2suCitAZW5kIGVudW1lcmF0ZQorCitAc3Vic2VjdGlvbiBQdWJsaWMgS2V5IEFsZ29yaXRobSBQb3dlci1VcCBUZXN0cworCitUaGUgcHVibGljIGtleSBhbGdvcml0aG1zIGFyZSB0ZXN0ZWQgZHVyaW5nIHBvd2VyLXVwOgorCitAdGFibGUgQGFzaXMKK0BpdGVtIFJTQQorQSBwcmUtZGVmaW5lZCAxMDI0IGJpdCBSU0Ega2V5IGlzIHVzZWQgYW5kIHRoZXNlIHRlc3RzIGFyZSBydW4KK2luIHR1cm46CitAZW51bWVyYXRlCitAaXRlbSAKK0NvbnZlcnNpb24gb2YgUy1leHByZXNzaW9uIHRvIGludGVybmFsIGZvcm1hdC4gCisoQGNvZGV7Y2lwaGVyL0AvcnNhLmM6QC9zZWxmdGVzdHNfcnNhfSkKK0BpdGVtIAorUHJpdmF0ZSBrZXkgY29uc2lzdGVuY3kgY2hlY2suCisoQGNvZGV7Y2lwaGVyL0AvcnNhLmM6QC9zZWxmdGVzdHNfcnNhfSkKK0BpdGVtCitBIHByZS1kZWZpbmVkIDIwIGJ5dGUgdmFsdWUgaXMgc2lnbmVkIHdpdGggUEtDUyMxIHBhZGRpbmcgZm9yIFNIQS0xLgorVGhlIHJlc3VsdCBpcyB2ZXJpZmllZCB1c2luZyB0aGUgcHVibGljIGtleSBhZ2FpbnN0IHRoZSBvcmlnaW5hbCBkYXRhCithbmQgYWdhaW5zdCBtb2RpZmllZCBkYXRhLiAgKEBjb2Rle2NpcGhlci9AL3JzYS5jOkAvc2VsZnRlc3Rfc2lnbl8xMDI0fSkKK0BpdGVtCitBIDEwMDAgYml0IHJhbmRvbSB2YWx1ZSBpcyBlbmNyeXB0ZWQgYW5kIGNoZWNrZWQgdGhhdCBpdCBkb2VzIG5vdAorbWF0Y2ggdGhlIG9yZ2luYWwgcmFuZG9tIHZhbHVlLiAgVGhlIGVuY3J0eXB0ZWQgcmVzdWx0IGlzIHRoZW4KK2RlY3J5cHRlZCBhbmQgY2hlY2tlZCB0aGF0IGl0IG1hY3RoZXMgdGhlIG9yaWdpbmFsIHJhbmRvbSB2YWx1ZS4KKyhAY29kZXtjaXBoZXIvQC9yc2EuYzpAL3NlbGZ0ZXN0X2VuY3JfMTAyNH0pCitAZW5kIGVudW1lcmF0ZQorCitAaXRlbSBEU0EKK0EgcHJlLWRlZmluZWQgMTAyNCBiaXQgRFNBIGtleSBpcyB1c2VkIGFuZCB0aGVzZSB0ZXN0cyBhcmUgcnVuIGluIHR1cm46CitAZW51bWVyYXRlCitAaXRlbQorQ29udmVyc2lvbiBvZiBTLWV4cHJlc3Npb24gdG8gaW50ZXJuYWwgZm9ybWF0LgorKEBjb2Rle2NpcGhlci9AL2RzYS5jOkAvc2VsZnRlc3RzX2RzYX0pCitAaXRlbQorUHJpdmF0ZSBrZXkgY29uc2lzdGVuY3kgY2hlY2suCisoQGNvZGV7Y2lwaGVyL0AvZHNhLmM6QC9zZWxmdGVzdHNfZHNhfSkKK0BpdGVtCitBIHByZS1kZWZpbmVkIDIwIGJ5dGUgdmFsdWUgaXMgc2lnbmVkIHdpdGggUEtDUyMxIHBhZGRpbmcgZm9yCitTSEEtMS4gIFRoZSByZXN1bHQgaXMgdmVyaWZpZWQgdXNpbmcgdGhlIHB1YmxpYyBrZXkgYWdhaW5zdCB0aGUKK29yaWdpbmFsIGRhdGEgYW5kIGFnYWluc3QgbW9kaWZpZWQgZGF0YS4KKyhAY29kZXtjaXBoZXIvQC9kc2EuYzpAL3NlbGZ0ZXN0X3NpZ25fMTAyNH0pCitAZW5kIGVudW1lcmF0ZQorQGVuZCB0YWJsZQorCitAc3Vic2VjdGlvbiBJbnRlZ3JpdHkgUG93ZXItVXAgVGVzdHMKKworVGhlIGludGVncml0eSBvZiB0aGUgTGliZ2NyeXB0IGlzIHRlc3RlZCBkdXJpbmcgcG93ZXItdXAgYnV0IG9ubHkgaWYKK2NoZWNraW5nIGhhcyBiZWVuIGVuYWJsZWQgYXQgYnVpbGQgdGltZS4gIFRoZSBjaGVjayB3b3JrcyBieSBjb21wdXRpbmcKK2EgSE1BQyBTSEEtMjU2IGNoZWNrc3VtIG92ZXIgdGhlIGZpbGUgdXNlZCB0byBsb2FkIExpYmdjcnlwdCBpbnRvCittZW1vcnkuICBUaGF0IGNoZWNrc3VtIGlzIGNvbXBhcmVkIGFnYWluc3QgYSBjaGVja3N1bSBzdG9yZWQgaW4gYSBmaWxlCitvZiB0aGUgc2FtZSBuYW1lIGJ1dCB3aXRoIGEgc2luZ2xlIGRvdCBhcyBhIHByZWZpeCBhbmQgYSBzdWZmaXggb2YKK0BmaWxley5obWFjfS4KKworCitAc3Vic2VjdGlvbiBDcml0aWNhbCBGdW5jdGlvbnMgUG93ZXItVXAgVGVzdHMKKworVGhlIDNERVMgd2VhayBrZXkgZGV0ZWN0aW9uIGlzIHRlc3RlZCBkdXJpbmcgcG93ZXItdXAgYnkgY2FsbGluZyB0aGUKK2RldGVjdGlvbiBmdW5jdGlvbiB3aXRoIGtleXMgdGFrZW4gZnJvbSBhIHRhYmxlIGxpc3RlbmluZyBhbGwgd2Vhawora2V5cy4gIFRoZSB0YWJsZSBpdHNlbGYgaXMgcHJvdGVjdGVkIHVzaW5nIGEgU0hBLTEgaGFzaC4KKyhAY29kZXtjaXBoZXIvQC9kZXMuYzpAL3NlbGZ0ZXN0fSkKKworCisKK0BjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitAc2VjdGlvbiBDb25kaXRpb25hbCBUZXN0cworCitUaGUgY29uZGl0aW9uYWwgdGVzdHMgYXJlIHBlcmZvcm1lZCBpZiBhIGNlcnRhaW4gY29udGlkaW9uIGlzIG1ldC4KK1RoaXMgbWF5IG9jY3VyIGF0IGFueSB0aW1lOyB0aGUgbGlicmFyeSBkb2VzIG5vdCBuZWNlc3NhcnkgZW50ZXIgdGhlCitgYFNlbGYtVGVzdCcnIHN0YXRlIHRvIHJ1biB0aGVzZSB0ZXN0cyBidXQgd2lsbCB0cmFuc2l0IHRvIHRoZQorYGBFcnJvcicnIHN0YXRlIGlmIGEgdGVzdCBmYWlsZWQuCisKK0BzdWJzZWN0aW9uIEtleS1QYWlyIEdlbmVyYXRpb24gVGVzdHMKKworQWZ0ZXIgYW4gYXN5bW1ldHJpYyBrZXktcGFpciBoYXMgYmVlbiBnZW5lcmF0ZWQsIExpYmdjcnlwdCBydW5zIGEKK3BhaXItd2lzZSBjb25zaXN0ZW5jeSB0ZXN0cyBvbiB0aGUgZ2VuZXJhdGVkIGtleS4gIE9uIGZhaWx1cmUgdGhlCitnZW5lcmF0ZWQga2V5IGlzIG5vdCB1c2VkLCBhbiBlcnJvciBjb2RlIGlzIHJldHVybmVkIGFuZCwgaWYgaW4gRklQUworbW9kZSwgdGhlIGxpYnJhcnkgaXMgcHV0IGludG8gdGhlIGBgRXJyb3InJyBzdGF0ZS4KKworQHRhYmxlIEBhc2lzCitAaXRlbSBSU0EKK1RoZSB0ZXN0IHVzZXMgYSByYW5kb20gbnVtYmVyIDY0IGJpdHMgbGVzcyB0aGUgc2l6ZSBvZiB0aGUgbW9kdWx1cyBhcworcGxhaW50ZXh0IGFuZCBydW5zIGFuIGVuY3J5cHRpb24gYW5kIGRlY3J5cHRpb24gb3BlcmF0aW9uIGluIHR1cm4uICBUaGUKK2VuY3J5cHRlZCB2YWx1ZSBpcyBjaGVja2VkIHRvIG5vdCBtYXRjaCB0aGUgcGxhaW50ZXh0IGFuZCB0aGUgcmVzdWx0CitvZiB0aGUgZGVjcnlwdGlvbiBpcyBjaGVja2VkIHRvIG1hdGNoIHRoZSBwbGFpbnRleHQuCisKK0EgbmV3IHJhbmRvbSBudW1iZXIgb2YgdGhlIHNhbWUgc2l6ZSBpcyBnZW5lcmF0ZWQsIHNpZ25lZCBhbmQgdmVyaWZpZWQKK3RvIHRlc3QgdGhlIGNvcnJlY3RuZXNzIG9mIHRoZSBzaWduaW5nIG9wZXJhdGlvbi4gIEFzIGEgc2Vjb25kIHNpZ25pbmcKK3Rlc3QsIHRoZSBzaWduYXR1cmUgaXMgbW9kaWZpZWQgYnkgaW5jcmVtZW50aW5nIGl0cyB2YWx1ZSBhbmQgdGhlbgordmVyaWZpZWQgd2l0aCB0aGUgZXhwZWN0ZWQgcmVzdWx0IHRoYXQgdGhlIHZlcmlmaWNhdGlvbiBmYWlscy4KKyhAY29kZXtjaXBoZXIvQC9yc2EuYzpAL3Rlc3Rfa2V5c30pCitAaXRlbSBEU0EKK1RoZSB0ZXN0IHVzZXMgYSByYW5kb20gbnVtYmVyIG9mIHRoZSBzaXplIG9mIHRoZSBRIHBhcmFtZXRlciB0byBjcmVhdGUKK2Egc2lnbmF0dXJlIGFuZCB0aGVuIGNoZWNrcyB0aGF0IHRoZSBzaWduYXR1cmUgdmVyaWZpZXMuICBBcyBhIHNlY29uZAorc2lnbmluZyB0ZXN0LCB0aGUgZGF0YSBpcyBtb2RpZmllZCBieSBpbmNyZW1lbnRpbmcgaXRzIHZhbHVlIGFuZCB0aGVuCit2ZXJpZmllZCBhZ2FpbnN0IHRoZSBzaWduYXR1cmUgd2l0aCB0aGUgZXhwZWN0ZWQgcmVzdWx0IHRoYXQgdGhlCit2ZXJpZmljYXRpb24gZmFpbHMuICAoQGNvZGV7Y2lwaGVyL0AvZHNhLmM6QC90ZXN0X2tleXN9KQorQGVuZCB0YWJsZQorCisKK0BzdWJzZWN0aW9uIFNvZnR3YXJlIExvYWQgVGVzdHMKKworTG9hZGluZyBvZiBleHRyYSBtb2R1bGVzIGludG8gbGliZ2NyeXB0IGlzIGRpc2FibGVkIGluIEZJUFMgbW9kZSBhbmQKK3RodXMgbm8gdGVzdHMgYXJlCitpbXBsZW1lbnRlZC4gKEBjb2Rle2NpcGhlci9AL2NpcGhlci5jOkAvX2djcnlfY2lwaGVyX3JlZ2lzdGVyfSwKK0Bjb2Rle2NpcGhlci9AL21kLmM6QC9fZ2NyeV9tZF9yZWdpc3Rlcn0sCitAY29kZXtjaXBoZXIvQC9wdWJrZXkuYzpAL19nY3J5X3BrX3JlZ2lzdGVyfSkKKworCitAc3Vic2VjdGlvbiBNYW51YWwgS2V5IEVudHJ5IFRlc3RzCisKK0EgbWFudWFsIGtleSBlbnRyeSBmZWF0dXJlIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiBMaWJnY3J5cHQuCisKKworQHN1YnNlY3Rpb24gQ29udGludW91cyBSTkcgVGVzdHMKKworVGhlIGNvbnRpbnVvdXMgcmFuZG9tIG51bWJlciB0ZXN0IGlzIG9ubHkgdXNlZCBpbiBGSVBTIG1vZGUuICBUaGUgUk5HCitnZW5lcmF0ZXMgYmxvY2tzIG9mIDEyOCBiaXQgc2l6ZTsgdGhlIGZpcnN0IGJsb2NrIGdlbmVyYXRlZCBwZXIKK2NvbnRleHQgaXMgc2F2ZWQgaW4gdGhlIGNvbnRleHQgYW5kIGFub3RoZXIgYmxvY2sgaXMgZ2VuZXJhdGVkIHRvIGJlCityZXR1cm5lZCB0byB0aGUgY2FsbGVyLiAgRWFjaCBibG9jayBpcyBjb21wYXJlZCBhZ2FpbnN0IHRoZSBzYXZlZAorYmxvY2sgYW5kIHRoZW4gc3RvcmVkIGluIHRoZSBjb250ZXh0LiAgSWYgYSBkdXBsaWNhdGVkIGJsb2NrIGlzCitkZXRlY3RlZCBhbiBlcnJvciBpcyBzaWduYWxlZCBhbmQgdGhlIGxpYnJheSBpcyBwdXQgaW50byB0aGUKK2BgRmF0YWwtRXJyb3InJyBzdGF0ZS4KKyhAY29kZXtyYW5kb20vQC9yYW5kb20tZmlwcy5jOkAveDkzMV9hZXNfZHJpdmVyfSkKKworCisKK0BjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitAc2VjdGlvbiBBcHBsaWNhdGlvbiBSZXF1ZXN0ZWQgVGVzdHMKKworVGhlIGFwcGxpY2F0aW9uIG1heSByZXF1ZXN0cyB0ZXN0cyBhdCBhbnkgdGltZSBieSBtZWFucyBvZiB0aGUKK0Bjb2Rle0dDUllDVExfU0VMRlRFU1R9IGNvbnRyb2wgY29tbWFuZC4gIE5vdGUgdGhhdCB1c2luZyB0aGVzZSB0ZXN0cworaXMgbm90IEZJUFMgY29uZm9ybTogQWx0aG91Z2ggTGliZ2NyeXB0IHJlamVjdHMgYWxsIGFwcGxpY2F0aW9uCityZXF1ZXN0cyBmb3Igc2VydmljZXMgd2hpbGUgcnVubmluZyBzZWxmLXRlc3RzLCBpdCBkb2VzIG5vdCBlbnN1cmUKK3RoYXQgbm8gb3RoZXIgb3BlcmF0aW9ucyBvZiBMaWJnY3J5cHQgYXJlIHN0aWxsIGJlaW5nIGV4ZWN1dGVkLiAgVGh1cywKK2luIEZJUFMgbW9kZSBhbiBhcHBsaWNhdGlvbiByZXF1ZXN0aW5nIHNlbGYtdGVzdHMgbmVlZHMgdG8gcG93ZXItY3ljbGUKK0xpYmdjcnlwdCBpbnN0ZWFkLgorCitXaGVuIHNlbGYtdGVzdHMgYXJlIHJlcXVlc3RlZCwgTGliZ2NyeXB0IHJ1bnMgYWxsIHRoZSB0ZXN0cyBpdCBkb2VzCitkdXJpbmcgcG93ZXItdXAgYXMgd2VsbCBhcyBhIGZldyBleHRyYSBjaGVja3MgYXMgZGVzY3JpYmVkIGJlbG93LgorCitAc3Vic2VjdGlvbiBTeW1tZXRyaWMgQ2lwaGVyIEFsZ29yaXRobSBUZXN0cworCitUaGUgZm9sbG93aW5nIHN5bW1ldHJpYyBlbmNyeXB0aW9uIGFsZ29yaXRobSB0ZXN0cyBhcmUgcnVuIGluIGFkZGl0aW9uCit0byB0aGUgcG93ZXItdXAgdGVzdHM6CisKK0B0YWJsZSBAYXNpcworQGl0ZW0gQUVTLTEyOAorQSBrbm93biBhbnN3ZXIgdGVzdHMgd2l0aCB0ZXN0IHZlY3RvcnMgdGFrZW4gZnJvbSBOSVNUIFNQODAwLTM4YSBhbmQKK3VzaW5nIHRoZSBoaWdoIGxldmVsIGZ1bmN0aW9ucyBpcyBydW4gZm9yIGJsb2NrIG1vZGVzIENGQiBhbmQgT0ZCLgorCitAZW5kIHRhYmxlCisKK0BzdWJzZWN0aW9uIEhhc2ggQWxnb3JpdGhtIFRlc3RzCisKK1RoZSBmb2xsb3dpbmcgaGFzaCBhbGdvcml0aG0gdGVzdHMgYXJlIHJ1biBpbiBhZGRpdGlvbiB0byB0aGUgCitwb3dlci11cCB0ZXN0czoKKworQHRhYmxlIEBhc2lzCitAaXRlbSBTSEEtMQorQGl0ZW14IFNIQS0yMjQKK0BpdGVteCBTSEEtMjU2CitAZW51bWVyYXRlCitAaXRlbQorQSBrbm93biBhbnN3ZXIgdGVzdCB1c2luZyBhIDU2IGJ5dGUgc3RyaW5nIGlzIHJ1bi4KK0BpdGVtIAorQSBrbm93biBhbnN3ZXIgdGVzdCB1c2luZyBhIHN0cmluZyBvZiBvbmUgbWlsbGlvbiBsZXR0ZXJzICJhIiBpcyBydW4uCitAZW5kIGVudW1lcmF0ZQorKEBjb2Rle2NpcGhlci9AL3NoYTEuYzpAL3NlbGZ0ZXN0c19zaGExfSwKK0Bjb2Rle2NpcGhlci9AL3NoYTI1Ni5jOkAvc2VsZnRlc3RzX3NoYTIyNH0sCitAY29kZXtjaXBoZXIvQC9zaGEyNTYuYzpAL3NlbGZ0ZXN0c19zaGEyNTZ9KQorQGl0ZW0gU0hBLTM4NAorQGl0ZW0gU0hBLTUxMgorQGVudW1lcmF0ZQorQGl0ZW0KK0Ega25vd24gYW5zd2VyIHRlc3QgdXNpbmcgYSAxMTIgYnl0ZSBzdHJpbmcgaXMgcnVuLgorQGl0ZW0gCitBIGtub3duIGFuc3dlciB0ZXN0IHVzaW5nIGEgc3RyaW5nIG9mIG9uZSBtaWxsaW9uIGxldHRlcnMgImEiIGlzIHJ1bi4KK0BlbmQgZW51bWVyYXRlCisoQGNvZGV7Y2lwaGVyL0Avc2hhNTEyLmM6QC9zZWxmdGVzdHNfc2hhMzg0fSwKK0Bjb2Rle2NpcGhlci9AL3NoYTUxMi5jOkAvc2VsZnRlc3RzX3NoYTUxMn0pCitAZW5kIHRhYmxlCisKK0BzdWJzZWN0aW9uIE1BQyBBbGdvcml0aG0gVGVzdHMKKworVGhlIGZvbGxvd2luZyBNQUMgYWxnb3JpdGhtIHRlc3RzIGFyZSBydW4gaW4gYWRkaXRpb24gdG8gdGhlIHBvd2VyLXVwCit0ZXN0czoKKworQHRhYmxlIEBhc2lzCitAaXRlbSBITUFDIFNIQS0xCitAZW51bWVyYXRlCitAaXRlbQorQSBrbm93biBhbnN3ZXIgdGVzdCB1c2luZyA5IGJ5dGUgb2YgZGF0YSBhbmQgYSAyMCBieXRlIGtleSBpcyBydW4uCitAaXRlbQorQSBrbm93biBhbnN3ZXIgdGVzdCB1c2luZyA5IGJ5dGUgb2YgZGF0YSBhbmQgYSAxMDAgYnl0ZSBrZXkgaXMgcnVuLgorQGl0ZW0KK0Ega25vd24gYW5zd2VyIHRlc3QgdXNpbmcgOSBieXRlIG9mIGRhdGEgYW5kIGEgNDkgYnl0ZSBrZXkgaXMgcnVuLgorQGVuZCBlbnVtZXJhdGUKKyhAY29kZXtjaXBoZXIvaG1hYy10ZXN0cy5jOnNlbGZ0ZXN0c19zaGExfSkKK0BpdGVtIEhNQUMgU0hBLTIyNAorQGl0ZW14IEhNQUMgU0hBLTI1NgorQGl0ZW14IEhNQUMgU0hBLTM4NAorQGl0ZW14IEhNQUMgU0hBLTUxMgorQGVudW1lcmF0ZQorQGl0ZW0KK0Ega25vd24gYW5zd2VyIHRlc3QgdXNpbmcgOSBieXRlIG9mIGRhdGEgYW5kIGEgMjAgYnl0ZSBrZXkgaXMgcnVuLgorQGl0ZW0KK0Ega25vd24gYW5zd2VyIHRlc3QgdXNpbmcgNTAgYnl0ZSBvZiBkYXRhIGFuZCBhIDIwIGJ5dGUga2V5IGlzIHJ1bi4KK0BpdGVtCitBIGtub3duIGFuc3dlciB0ZXN0IHVzaW5nIDUwIGJ5dGUgb2YgZGF0YSBhbmQgYSAyNiBieXRlIGtleSBpcyBydW4uCitAaXRlbQorQSBrbm93biBhbnN3ZXIgdGVzdCB1c2luZyA1NCBieXRlIG9mIGRhdGEgYW5kIGEgMTMxIGJ5dGUga2V5IGlzIHJ1bi4KK0BpdGVtCitBIGtub3duIGFuc3dlciB0ZXN0IHVzaW5nIDE1MiBieXRlIG9mIGRhdGEgYW5kIGEgMTMxIGJ5dGUga2V5IGlzIHJ1bi4KK0BlbmQgZW51bWVyYXRlCisoQGNvZGV7Y2lwaGVyL0AvaG1hYy10ZXN0cy5jOkAvc2VsZnRlc3RzX3NoYTIyNH0sCitAY29kZXtjaXBoZXIvQC9obWFjLXRlc3RzLmM6QC9zZWxmdGVzdHNfc2hhMjU2fSwKK0Bjb2Rle2NpcGhlci9AL2htYWMtdGVzdHMuYzpAL3NlbGZ0ZXN0c19zaGEzODR9LAorQGNvZGV7Y2lwaGVyL0AvaG1hYy10ZXN0cy5jOkAvc2VsZnRlc3RzX3NoYTUxMn0pCitAZW5kIHRhYmxlCisKKworQGMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Bub2RlIEZJUFMgTW9kZQorQGFwcGVuZGl4IERlc2NyaXB0aW9uIG9mIHRoZSBGSVBTIE1vZGUKKworVGhpcyBhcHBlbmRpeCBnaXZlcyBkZXRhaWxlZCBpbmZvcm1hdGlvbiBwZXJ0YWluaW5nIHRvIHRoZSBGSVBTIG1vZGUuCitJbiBwYXJ0aWN1bGFyLCB0aGUgY2hhbmdlcyB0byB0aGUgc3RhbmRhcmQgbW9kZSBhbmQgdGhlIGZpbml0ZSBzdGF0ZQorbWFjaGluZSBhcmUgZGVzY3JpYmVkLiAgVGhlIHNlbGYtdGVzdHMgcmVxdWlyZWQgaW4gdGhpcyBtb2RlIGFyZQorZGVzY3JpYmVkIGluIHRoZSBhcHBlbmRpeCBvbiBzZWxmLXRlc3RzLgorCitAYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitAc2VjdGlvbiBSZXN0cmljdGlvbnMgaW4gRklQUyBNb2RlCisKK0Bub2luZGVudAorSWYgTGliZ2NyeXB0IGlzIHVzZWQgaW4gRklQUyBtb2RlIHRoZXNlIHJlc3RyaWN0aW9ucyBhcmUgZWZmZWN0aXZlOgorCitAaXRlbWl6ZQorQGl0ZW0KK1RoZSBjcnlwdG9ncmFwaGljIGFsZ29yaXRobXMgYXJlIHJlc3RyaWN0ZWQgdG8gdGhpcyBsaXN0OgorCitAdGFibGUgQGFzaXMKK0BpdGVtIEdDUllfQ0lQSEVSXzNERVMKKzMga2V5IEVERSBUcmlwbGUtREVTIHN5bW1ldHJpYyBlbmNyeXB0aW9uLgorQGl0ZW0gR0NSWV9DSVBIRVJfQUVTMTI4CitBRVMgMTI4IGJpdCBzeW1tZXRyaWMgZW5jcnlwdGlvbi4KK0BpdGVtIEdDUllfQ0lQSEVSX0FFUzE5MgorQUVTIDE5MiBiaXQgc3ltbWV0cmljIGVuY3J5cHRpb24uCitAaXRlbSBHQ1JZX0NJUEhFUl9BRVMyNTYKK0FFUyAyNTYgYml0IHN5bW1ldHJpYyBlbmNyeXB0aW9uLgorQGl0ZW0gR0NSWV9NRF9TSEExCitTSEEtMSBtZXNzYWdlIGRpZ2VzdC4KK0BpdGVtIEdDUllfTURfU0hBMjI0CitTSEEtMjI0IG1lc3NhZ2UgZGlnZXN0LgorQGl0ZW0gR0NSWV9NRF9TSEEyNTYKK1NIQS0yNTYgbWVzc2FnZSBkaWdlc3QuCitAaXRlbSBHQ1JZX01EX1NIQTM4NAorU0hBLTM4NCBtZXNzYWdlIGRpZ2VzdC4KK0BpdGVtIEdDUllfTURfU0hBNTEyCitTSEEtNTEyIG1lc3NhZ2UgZGlnZXN0LgorQGl0ZW0gR0NSWV9NRF9TSEExLEdDUllfTURfRkxBR19ITUFDCitITUFDIHVzaW5nIGEgU0hBLTEgbWVzc2FnZSBkaWdlc3QuCitAaXRlbSBHQ1JZX01EX1NIQTIyNCxHQ1JZX01EX0ZMQUdfSE1BQworSE1BQyB1c2luZyBhIFNIQS0yMjQgbWVzc2FnZSBkaWdlc3QuCitAaXRlbSBHQ1JZX01EX1NIQTI1NixHQ1JZX01EX0ZMQUdfSE1BQworSE1BQyB1c2luZyBhIFNIQS0yNTYgbWVzc2FnZSBkaWdlc3QuCitAaXRlbSBHQ1JZX01EX1NIQTM4NCxHQ1JZX01EX0ZMQUdfSE1BQworSE1BQyB1c2luZyBhIFNIQS0zODQgbWVzc2FnZSBkaWdlc3QuCitAaXRlbSBHQ1JZX01EX1NIQTUxMixHQ1JZX01EX0ZMQUdfSE1BQworSE1BQyB1c2luZyBhIFNIQS01MTIgbWVzc2FnZSBkaWdlc3QuCitAaXRlbSBHQ1JZX1BLX1JTQQorUlNBIGVuY3J5cHRpb24gYW5kIHNpZ25pbmcuICAgICAgICAgCitAaXRlbSBHQ1JZX1BLX0RTQQorRFNBIHNpZ25pbmcuCitAZW5kIHRhYmxlCisKK05vdGUgdGhhdCB0aGUgQ1JDIGFsZ29yaXRobXMgYXJlIG5vdCBjb25zaWRlcmVkIGNyeXB0b2dyYXBoaWMgYWxnb3JpdGhtcworYW5kIHRodXMgYXJlIGluIGFkZGl0aW9uIGF2YWlsYWJsZS4KKworQGl0ZW0KK1JTQSBrZXkgZ2VuZXJhdGlvbiByZWZ1c2VzIHRvIGNyZWF0ZSBhIGtleSB3aXRoIGEga2V5c2l6ZSBvZgorbGVzcyB0aGFuIDEwMjQgYml0cy4gIAorCitAaXRlbQorRFNBIGtleSBnZW5lcmF0aW9uIHJlZnVzZXMgdG8gY3JlYXRlIGEga2V5IHdpdGggYSBrZXlzaXplIG90aGVyCit0aGFuIDEwMjQgYml0cy4KKworQGl0ZW0KK1RoZSBAY29kZXt0cmFuc2llbnQta2V5fSBmbGFnIGZvciBSU0EgYW5kIERTQSBrZXkgZ2VuZXJhdGlvbiBpcyBpZ25vcmVkLgorCitAaXRlbQorU3VwcG9ydCBmb3IgdGhlIFZJQSBQYWRsb2NrIGVuZ2luZSBpcyBkaXNhYmxlZC4KKworQGl0ZW0gCitGSVBTIG1vZGUgbWF5IG9ubHkgYmUgdXNlZCBvbiBzeXN0ZW1zIHdpdGggYSAvZGV2L3JhbmRvbSBkZXZpY2UuCitTd2l0Y2hpbmcgaW50byBGSVBTIG1vZGUgb24gb3RoZXIgc3lzdGVtcyB3aWxsIGZhaWwgYXQgcnVudGltZS4KKworQGl0ZW0KK1NhdmluZyBhbmQgbG9hZGluZyBhIHJhbmRvbSBzZWVkIGZpbGUgaXMgaWdub3JlZC4KKworQGl0ZW0KK0FuIFg5LjMxIHN0eWxlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGlzIHVzZWQgaW4gcGxhY2Ugb2YgdGhlCitsYXJnZS1wb29sLUNTUFJORyBnZW5lcmF0b3IuCisKK0BpdGVtCitUaGUgY29tbWFuZCBAY29kZXtHQ1JZQ1RMX0VOQUJMRV9RVUlDS19SQU5ET019IGlzIGlnbm9yZWQuCisKK0BpdGVtCitUaGUgQWx0ZXJuYXRpdmUgUHVibGljIEtleSBJbnRlcmZhY2UgKEBjb2Rle2djcnlfYWNfeHh4fSkgaXMgbm90CitzdXBwb3J0ZWQgYW5kIGFsbCBBUEkgY2FsbHMgcmV0dXJuIGFuIGVycm9yLgorCitAaXRlbQorUmVnaXN0cmF0aW9uIG9mIGV4dGVybmFsIG1vZHVsZXMgaXMgbm90IHN1cHBvcnRlZC4KKworQGl0ZW0gCitNZXNzYWdlIGRpZ2VzdCBkZWJ1Z2dpbmcgaXMgZGlzYWJsZWQuCisKK0BpdGVtCitBbGwgZGVidWcgb3V0cHV0IHJlbGF0ZWQgdG8gY3J5cHRvZ3JhcGhpYyBkYXRhIGlzIHN1cHByZXNzZWQuCisKK0BpdGVtIAorT24tdGhlLWZseSBzZWxmLXRlc3RzIGFyZSBub3QgcGVyZm9ybWVkLCBpbnN0ZWFkIHNlbGYtdGVzdHMgYXJlIHJ1bgorYmVmb3JlIGVudGVyaW5nIG9wZXJhdGlvbmFsIHN0YXRlLgorCitAaXRlbQorVGhlIGZ1bmN0aW9uIEBjb2Rle2djcnlfc2V0X2FsbG9jYXRpb25faGFuZGxlcn0gbWF5IG5vdCBiZSB1c2VkLiAgSWYKK2l0IGlzIHVzZWQgTGliZ2NyeXB0IGRpc2FibGVzIEZJUFMgbW9kZSB1bmxlc3MgRW5mb3JjZWQgRklQUyBtb2RlIGlzCitlbmFibGVkLCBpbiB3aGljaCBjYXNlIExpYmdjcnlwdCB3aWxsIGVudGVyIHRoZSBlcnJvciBzdGF0ZS4KKworQGl0ZW0KK1RoZSBkaWdlc3QgYWxnb3JpdGhtIE1ENSBtYXkgbm90IGJlIHVzZWQuICBJZiBpdCBpcyB1c2VkIExpYmdjcnlwdAorZGlzYWJsZXMgRklQUyBtb2RlIHVubGVzcyBFbmZvcmNlZCBGSVBTIG1vZGUgaXMgZW5hYmxlZCwgaW4gd2hpY2ggY2FzZQorTGliZ2NyeXB0IHdpbGwgZW50ZXIgdGhlIGVycm9yIHN0YXRlLgorCitAaXRlbSAKK0luIEVuZm9yY2VkIEZJUFMgbW9kZSB0aGUgY29tbWFuZCBAY29kZXtHQ1JZQ1RMX0RJU0FCTEVfU0VDTUVNfSBpcworaWdub3JlZC4gIEluIHN0YW5kYXJkIEZJUFMgbW9kZSBpdCBkaXNhYmxlcyBGSVBTIG1vZGUuCisKK0BpdGVtCitBIGhhbmRsZXIgc2V0IGJ5IEBjb2Rle2djcnlfc2V0X291dG9mY29yZV9oYW5kbGVyfSBpcyBpZ25vcmVkLgorQGl0ZW0KK0EgaGFuZGxlciBzZXQgYnkgQGNvZGV7Z2NyeV9zZXRfZmF0YWxlcnJvcl9oYW5kbGVyfSBpcyBpZ25vcmVkLgorCitAZW5kIGl0ZW1pemUKKworTm90ZSB0aGF0IHdoZW4gd2Ugc3BlYWsgYWJvdXQgZGlzYWJsaW5nIEZJUFMgbW9kZSwgaXQgbWVyZWx5IG1lYW5zCit0aGF0IHRoZSBmdW5jdGlvbiBAY29kZXtnY3J5X2ZpcHNfbW9kZV9hY3RpdmV9IHJldHVybnMgZmFsc2U7IGl0IGRvZXMKK25vdCBtZWFuIHRoYXQgYW55IG5vbiBGSVBTIGFsZ29yaXRobXMgYXJlIGFsbG93ZWQuCisKK0BjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitAc2VjdGlvbiBGSVBTIEZpbml0ZSBTdGF0ZSBNYWNoaW5lCisKK1RoZSBGSVBTIG1vZGUgb2YgbGliZ2NyeXB0IGltcGxlbWVudHMgYSBmaW5pdGUgc3RhdGUgbWFjaGluZSAoRlNNKSB1c2luZworOCBzdGF0ZXMgKEBweHJlZnt0Ymw6Zmlwcy1zdGF0ZXN9KSBhbmQgY2hlY2tzIGF0IHJ1bnRpbWUgdGhhdCBvbmx5IHZhbGlkCit0cmFuc2l0aW9ucyAoQHB4cmVme3RibDpmaXBzLXN0YXRlLXRyYW5zaXRpb25zfSkgbWF5IGhhcHBlbi4KKworQGZsb2F0IEZpZ3VyZSxmaWc6Zmlwcy1mc20KK0BjYXB0aW9ue0ZJUFMgbW9kZSBzdGF0ZSBkaWFncmFtfQorQGNlbnRlciBAaW1hZ2V7Zmlwcy1mc20sMTUwbW0sLEZJUFMgRlNNIERpYWdyYW19CitAZW5kIGZsb2F0CisKK0BmbG9hdCBUYWJsZSx0Ymw6Zmlwcy1zdGF0ZXMKK0BjYXB0aW9ue0ZJUFMgbW9kZSBzdGF0ZXN9CitAbm9pbmRlbnQKK1N0YXRlcyB1c2VkIGJ5IHRoZSBGSVBTIEZTTToKK0B0YWJsZSBAYXNpcworCitAaXRlbSBQb3dlci1PZmYgCitMaWJnY3J5cHQgaXMgbm90IHJ1bnRpbWUgbGlua2VkIHRvIGFub3RoZXIgYXBwbGljYXRpb24uICBUaGlzIHVzdWFsbHkKK21lYW5zIHRoYXQgdGhlIGxpYnJhcnkgaXMgbm90IGxvYWRlZCBpbnRvIG1haW4gbWVtb3J5LiAgVGhpcyBzdGF0ZSBpcworZG9jdW1lbnRhdGlvbiBvbmx5LgorCitAaXRlbSBQb3dlci1PbgorTGliZ2NyeXB0IGlzIGxvYWRlZCBpbnRvIG1lbW9yeSBhbmQgQVBJIGNhbGxzIG1heSBiZSBtYWRlLiAgQ29tcGlsZXIKK2ludHJvZHVjdGVkIGNvbnN0cnVjdG9yIGZ1bmN0aW9ucyBtYXkgYmUgcnVuLiAgTm90ZSB0aGF0IExpYmdjcnlwdCBkb2VzCitub3QgaW1wbGVtZW50IGFueSBhcmJpdHJhcnkgY29uc3RydWN0b3IgZnVuY3Rpb25zIHRvIGJlIGNhbGxlZCBieSB0aGUKK29wZXJhdGluZyBzeXN0ZW0KKworQGl0ZW0gSW5pdAorVGhlIExpYmdjcnlwdCBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgYXJlIHBlcmZvcm1lZCBhbmQgdGhlIGxpYnJhcnkgaGFzCitub3QgeWV0IHJ1biBhbnkgc2VsZi10ZXN0LgorCitAaXRlbSBTZWxmLVRlc3QKK0xpYmdjcnlwdCBpcyBwZXJmb3JtaW5nIHNlbGYtdGVzdHMuICAgICAgICAgICAgICAgCisKK0BpdGVtIE9wZXJhdGlvbmFsCitMaWJnY3J5cHQgaXMgaW4gdGhlIG9wZXJhdGlvbmFsIHN0YXRlIGFuZCBhbGwgaW50ZXJmYWNlcyBtYXkgYmUgdXNlZC4KKworQGl0ZW0gRXJyb3IKK0xpYmdyeXB0IGlzIGluIHRoZSBlcnJvciBzdGF0ZS4gIFdoZW4gY2FsbGluZyBhbnkgRklQUyByZWxldmFudAoraW50ZXJmYWNlcyB0aGV5IGVpdGhlciByZXR1cm4gYW4gZXJyb3IgKEBjb2Rle0dQR19FUlJfTk9UX09QRVJBVElPTkFMfSkKK29yIHB1dCBMaWJnY3J5cHQgaW50byB0aGUgRmF0YWwtRXJyb3Igc3RhdGUgYW5kIHdvbid0IHJldHVybi4gIAorCitAaXRlbSBGYXRhbC1FcnJvcgorTGliZ2NyeXB0IGlzIGluIGEgbm9uLXJlY292ZXJhYmxlIGVycm9yIHN0YXRlIGFuZCAKK3dpbGwgYXV0b21hdGljYWxseSB0cmFuc2l0IGludG8gdGhlICBTaHV0ZG93biBzdGF0ZS4gICAgICAgIAorCitAaXRlbSBTaHV0ZG93bgorTGliZ2NyeXB0IGlzIGFib3V0IHRvIGJlIHRlcm1pbmF0ZWQgYW5kIHJlbW92ZWQgZnJvbSB0aGUgbWVtb3J5LiBUaGUKK2FwcGxpY2F0aW9uIG1heSBhdCB0aGlzIHBvaW50IHN0aWxsIHJ1bmluZyBjbGVhbnVwIGhhbmRsZXJzLgorCitAZW5kIHRhYmxlCitAZW5kIGZsb2F0CisKKworQGZsb2F0IFRhYmxlLHRibDpmaXBzLXN0YXRlLXRyYW5zaXRpb25zCitAY2FwdGlvbntGSVBTIG1vZGUgc3RhdGUgdHJhbnNpdGlvbnN9CitAbm9pbmRlbnQKK1RoZSB2YWxpZCBzdGF0ZSB0cmFuc2l0aW9ucyAoQHB4cmVme2ZpZzpmaXBzLWZzbX0pIGFyZToKK0B0YWJsZSBAY29kZQorQGl0ZW0gMSAKK1Bvd2VyLU9mZiB0byBQb3dlci1PbiBpcyBpbXBsaWNpdGx5IGRvbmUgYnkgdGhlIE9TIGxvYWRpbmcgTGliZ2NyeXB0IGFzCithIHNoYXJlZCBsaWJyYXJ5IGFuZCBoYXZpbmcgaXQgbGlua2VkIHRvIGFuIGFwcGxpY2F0aW9uLgorCitAaXRlbSAyCitQb3dlci1PbiB0byBJbml0IGlzIHRyaWdnZXJlZCBieSB0aGUgYXBwbGljYXRpb24gY2FsbGluZyB0aGUKK0xpYmdjcnlwdCBpbnRpYWxpemF0aW9uIGZ1bmN0aW9uIEBjb2Rle2djcnlfY2hlY2tfdmVyc2lvbn0uCisKK0BpdGVtIDMKK0luaXQgdG8gU2VsZi1UZXN0IGlzIGVpdGhlciB0cmlnZ3JlZCBieSBhIGRlZGljYXRlZCBBUEkgY2FsbCBvciBpbXBsaWNpdAorYnkgaW52b2tpbmcgYSBsaWJncnlwdCBzZXJ2aWNlIGNvbnJvbGxlZCBieSB0aGUgRlNNLgorCitAaXRlbSA0IAorU2VsZi1UZXN0IHRvIE9wZXJhdGlvbmFsIGlzIHRyaWdnZXJlZCBhZnRlciBhbGwgc2VsZi10ZXN0cyBwYXNzZWQKK3N1Y2Nlc3NmdWxseS4gIAorCitAaXRlbSA1CitPcGVyYXRpb25hbCB0byBTaHV0ZG93biBpcyBhbiBhcnRpZmljYWwgc3RhdGUgd2l0aG91dCBhbnkgZGlyZWN0IGFjdGlvbgoraW4gTGliZ2NyeXB0LiAgV2hlbiByZWFjaGluZyB0aGUgU2h1dGRvd24gc3RhdGUgdGhlIGxpYnJhcnkgaXMKK2RlaW5pdGlhbGl6ZWQgYW5kIGNhbid0IHJldHVybiB0byBhbnkgb3RoZXIgc3RhdGUgYWdhaW4uCisKK0BpdGVtIDYKK1NodXRkb3duIHRvIFBvd2VyLW9mZiBpcyB0aGUgcHJvY2VzcyBvZiByZW1vdmluZyBMaWJnY3J5cHQgZnJvbSB0aGUKK2NvbXB1dGVyJ3MgbWVtb3J5LiAgRm9yIG9idmlvdXMgcmVhc29ucyB0aGUgUG93ZXItT2ZmIHN0YXRlIGNhbid0IGJlCityZXByZXNlbnRlZCB3aXRoaW4gTGliZ2NyeXB0IGFuZCB0aHVzIHRoaXMgdHJhbnNpdGlvbiBpcyBmb3IKK2RvY3VtZW50YXRpb24gb25seS4KKworQGl0ZW0gNworT3BlcmF0aW9uYWwgdG8gRXJyb3IgaXMgdHJpZ2dlcmVkIGlmIExpYmdjcnlwdCBkZXRlY3RlZCBhbiBhcHBsaWNhdGlvbgorZXJyb3Igd2hpY2ggY2FuJ3QgYmUgcmV0dXJuZWQgdG8gdGhlIGNhbGxlciBidXQgc3RpbGwgYWxsb3dzIExpYmdjcnlwdAordG8gcHJvcGVybHkgcnVuLiAgSW4gdGhlIEVycm9yIHN0YXRlIGFsbCBGSVBTIHJlbGV2YW50IGludGVyZmFjZXMgcmV0dXJuCithbiBlcnJvciBjb2RlLgorCitAaXRlbSA4CitFcnJvciB0byBTaHV0ZG93biBpcyBzaW1pbGFyIHRvIHRoZSBPcGVyYXRpb25hbCB0byBTaHV0ZG93biB0cmFuc2l0aW9uCisoNSkuCisKK0BpdGVtIDkKK0Vycm9yIHRvIEZhdGFsLUVycm9yIGlzIHRyaWdncmVkIGlmIExpYmdyeXB0IGRldGVjdHMgYW4gZmF0YWwgZXJyb3IKK3doaWxlIGFscmVhZHkgYmVpbmcgaW4gRXJyb3Igc3RhdGUuCisKK0BpdGVtIDEwCitGYXRhbC1FcnJvciB0byBTaHV0ZG93biBpcyBhdXRvbWF0aWNhbGx5IGVudGVyZWQgYnkgTGliZ2NyeXB0IAorYWZ0ZXIgaGF2aW5nIHJlcG9ydGVkIHRoZSBlcnJvci4KKworQGl0ZW0gMTEKK1Bvd2VyLU9uIHRvIFNodXRkb3duIGlzIGFuIGFydGlmaWNhbCBzdGF0ZSB0byBkb2N1bWVudCB0aGF0IExpYmdjcnlwdAoraGFzIG5vdCB5ZSBiZWVuIGluaXRpYWxpemFlZCBidXQgdGhlIHByb2Nlc3MgaXMgYWJvdXQgdG8gdGVybWluYXRlLgorCitAaXRlbSAxMgorUG93ZXItT24gdG8gRmF0YWwtRXJyb3Igd2lsbCBiZSB0cmlnZ2VyZCBpZiBjZXJ0YWluIExpYmdjcnlwdCBmdW5jdGlvbnMKK2FyZSB1c2VkIHdpdGhvdXQgaGF2aW5nIHJlYWNoZWQgdGhlIEluaXQgc3RhdGUuCisKK0BpdGVtIDEzCitTZWxmLVRlc3QgdG8gRmF0YWwtRXJyb3IgaXMgdHJpZ2dyZWQgYnkgc2V2ZXJlIGVycm9ycyBpbiBMaWJnY3J5cHQgd2hpbGUKK3J1bm5pbmcgc2VsZi10ZXN0cy4KKworQGl0ZW0gMTQKK1NlbGYtVGVzdCB0byBFcnJvciBpcyB0cmlnZ3JlZCBieSBhIGZhaWxlZCBzZWxmLXRlc3QuCisKK0BpdGVtIDE1CitPcGVyYXRpb25hbCB0byBGYXRhbC1FcnJvciBpcyB0cmlnZ2VyZWQgaWYgTGliY3J5cHQgZW5jb3VudGVyZWQgYQorbm9uLXJlY292ZXJhYmxlIGVycm9yLgorCitAaXRlbSAxNgorT3BlcmF0aW9uYWwgdG8gU2VsZi1UZXN0IGlzIHRyaWdncmVkIGlmIHRoZSBhcHBsaWNhdGlvbiByZXF1ZXN0ZWQgdG8gcnVuCit0aGUgc2VsZi10ZXN0cyBhZ2Fpbi4KKworQGl0ZW0gMTcKK0Vycm9yIHRvIFNlbGYtVGVzdCBpcyB0cmlnZ2VyZWQgaWYgdGhlIGFwcGxpY2F0aW9uIGhhcyByZXF1ZXN0ZWQgdG8gcnVuCitzZWxmLXRlc3RzIHRvIGdldCB0byBnZXQgYmFjayBpbnRvIG9wZXJhdGlvbmFsIHN0YXRlIGFmdGVyIGFuIGVycm9yLgorCitAaXRlbSAxOAorSW5pdCB0byBFcnJvciBpcyB0cmlnZ2VyZWQgYnkgZXJyb3JzIGluIHRoZSBpbml0aWFsaXphdGlvbiBjb2RlLgorCitAaXRlbSAxOQorSW5pdCB0byBGYXRhbC1FcnJvciBpcyB0cmlnZ2VyZWQgYnkgbm9uLXJlY292ZXJhYmxlIGVycm9ycyBpbiB0aGUKK2luaXRpYWxpemF0aW9uIGNvZGUuCisKK0BpdGVtIDIwCitFcnJvciB0byBFcnJvciBpcyB0cmlnZ2VyZWQgYnkgZXJyb3JzIHdoaWxlIGFscmVhZHkgaW4gdGhlIEVycm9yCitzdGF0ZS4KKworCitAZW5kIHRhYmxlCitAZW5kIGZsb2F0CisKK0BjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitAc2VjdGlvbiBGSVBTIE1pc2NlbGxhbmVvdXMgSW5mb3JtYXRpb24KKworTGliZ2NyeXB0IGRvZXMgbm90IGRvIGFueSBrZXkgbWFuYWdlbWVudCBvbiBpdHNlbGY7IHRoZSBhcHBsaWNhdGlvbgorbmVlZHMgdG8gY2FyZSBhYm91dCBpdC4gIEtleXMgd2hpY2ggYXJlIHBhc3NlZCB0byBMaWJnY3J5cHQgc2hvdWxkIGJlCithbGxvY2F0ZWQgaW4gc2VjdXJlIG1lbW9yeSBhcyBhdmFpbGFibGUgd2l0aCB0aGUgZnVuY3Rpb25zCitAY29kZXtnY3J5X21hbGxvY19zZWN1cmV9IGFuZCBAY29kZXtnY3J5X2NhbGxvY19zZWN1cmV9LiAgQnkgY2FsbGluZworQGNvZGV7Z2NyeV9mcmVlfSBvbiB0aGlzIG1lbW9yeSwgdGhlIG1lbW9yeSBhbmQgdGh1cyB0aGUga2V5cyBhcmUKK292ZXJ3cml0dGVuIHdpdGggemVybyBieXRlcyBiZWZvcmUgcmVsZWFzaW5nIHRoZSBtZW1vcnkuCisKK0ZvciB1c2Ugd2l0aCB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IsIExpYmdjcnlwdCBnZW5lcmF0ZXMgMworaW50ZXJuYWwga2V5cyB3aGljaCBhcmUgc3RvcmVkIGluIHRoZSBlbmNyeXB0aW9uIGNvbnRleHRzIHVzZWQgYnkgdGhlCitSTkcuICBUaGVzZSBrZXlzIGFyZSBzdG9yZWQgaW4gc2VjdXJlIG1lbW9yeSBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZQorcHJvY2Vzcy4gIEFwcGxpY2F0aW9uIGFyZSByZXF1aXJlZCB0byB1c2UgQGNvZGV7R0NSWUNUTF9URVJNX1NFQ01FTX0KK2JlZm9yZSBwcm9jZXNzIHRlcm1pbmF0aW9uLiAgVGhpcyB3aWxsIHplcm8gb3V0IHRoZSBlbnRpcmUgc2VjdXJlCittZW1vcnkgYW5kIHRodXMgYWxzbyB0aGUgZW5jcnlwdGlvbiBjb250ZXh0cyB3aXRoIHRoZXNlIGtleXMuCisKKworCitAYyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitAYyAqKioqKioqKioqKioqICBBcHBlbmRpY2VzIChsaWNlbnNlIGV0Yy4pICAqKioqKioqKioqKioqKioqCitAYyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitAaW5jbHVkZSBsZ3BsLnRleGkKKworQGluY2x1ZGUgZ3BsLnRleGkKKworQG5vZGUgRmlndXJlcyBhbmQgVGFibGVzCitAdW5udW1iZXJlZCBMaXN0IG9mIEZpZ3VyZXMgYW5kIFRhYmxlcworCitAbGlzdG9mZmxvYXRzIEZpZ3VyZQorCitAbGlzdG9mZmxvYXRzIFRhYmxlCisKK0Bub2RlIENvbmNlcHQgSW5kZXgKK0B1bm51bWJlcmVkIENvbmNlcHQgSW5kZXgKKworQHByaW50aW5kZXggY3AKKworQG5vZGUgRnVuY3Rpb24gYW5kIERhdGEgSW5kZXgKK0B1bm51bWJlcmVkIEZ1bmN0aW9uIGFuZCBEYXRhIEluZGV4CisKK0BwcmludGluZGV4IGZuCisKKworCitAYnllCisKK0dDUllDVExfU0VUX1JBTkRPTV9EQUVNT05fU09DS0VUCitHQ1JZQ1RMX1VTRV9SQU5ET01fREFFTU9OCitUaGUgcmFuZG9tIGRhbW9uIGlzIHN0aWxsIGEgYml0IGV4cGVyaW1lbnRhbCwgdGh1cyB3ZSBkbyBub3QgZG9jdW1lbnQKK3RoZW0uICBOb3RlIHRoYXQgdGhleSBzaG91bGQgYmUgdXNlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24gYW5kIHRoYXQKK3RoZXNlIGZ1bmN0aW9ucyBhcmUgbm90IHJlYWxseSB0aHJlYWQgc2FmZS4KKworCisKKworQGMgIExvY2FsV29yZHM6ICBpbnQgSEQKKworCisKKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L2RvYy9ncGwudGV4aSBiL2xpYmdjcnlwdC0xLjQuNi9kb2MvZ3BsLnRleGkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk2NTU2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9kb2MvZ3BsLnRleGkKQEAgLTAsMCArMSwzOTcgQEAKK0Bub2RlIENvcHlpbmcKK0B1bm51bWJlcmVkIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisKK0BjaW5kZXggR1BMLCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorQGNlbnRlciBWZXJzaW9uIDIsIEp1bmUgMTk5MQorCitAZGlzcGxheQorQ29weXJpZ2h0IEBjb3B5cmlnaHR7fSAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorNTkgVGVtcGxlIFBsYWNlIC0tIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKworRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCitvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KK0BlbmQgZGlzcGxheQorCitAaGVhZGluZyBQcmVhbWJsZQorCisgIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKK2ZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlCitzb2Z0d2FyZS0tLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCit1c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Cit0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KK3lvdXIgcHJvZ3JhbXMsIHRvby4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90CitwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91CitoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCit0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKK2lmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0CitpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAorYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgorVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKK2Rpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCitncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKK3lvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCitzb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCityaWdodHMuCisKKyAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAorKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKK2Rpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCisKKyAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KK3RoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCitzb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKK3dhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCit0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAorYXV0aG9ycycgcmVwdXRhdGlvbnMuCisKKyAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKK3BhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKK3Byb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKK3Byb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQorcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4KKworQGlmdGV4CitAaGVhZGluZyBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KK0BlbmQgaWZ0ZXgKK0BpZmluZm8KK0BjZW50ZXIgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCitAZW5kIGlmaW5mbworCitAZW51bWVyYXRlCitAaXRlbQorVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucworYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKK3VuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgYGBQcm9ncmFtJycsIGJlbG93LAorcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgYGB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtJycKK21lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6Cit0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LAorZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKK2xhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4KK3RoZSB0ZXJtIGBgbW9kaWZpY2F0aW9uJycuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgYGB5b3UnJy4KKworQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKK2NvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKK3J1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KK2lzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgorV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCisKK0BpdGVtCitZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3MKK3NvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQorY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZQorY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZQorbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OworYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KKworWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kCit5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgorCitAaXRlbQorWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgorb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZAorZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCithYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCitAZW51bWVyYXRlIGEKK0BpdGVtCitZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKK3N0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCisKK0BpdGVtCitZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4KK3dob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQorcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKK3BhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworQGl0ZW0KK0lmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkKK3doZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKK2ludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KK2Fubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQorbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlCithIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCit0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcworTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQKK2RvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KK3RoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQorQGVuZCBlbnVtZXJhdGUKKworVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgoraWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSwKK2FuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgordGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQorc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91CitkaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKK29uIHRoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgordGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKK2VudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4KKworVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Cit5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KK2V4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgorY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgUHJvZ3JhbS4KKworSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbQord2l0aCB0aGUgUHJvZ3JhbSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mCithIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgordGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KKworQGl0ZW0KK1lvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LAordW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mCitTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKK0BlbnVtZXJhdGUgYQorQGl0ZW0KK0FjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKK3NvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucworMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKK0BpdGVtCitBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQoreWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKK2Nvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUKK21hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCitjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKK0BpdGVtCitBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlcgordG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKK2FsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91CityZWNlaXZlZCB0aGUgcHJvZ3JhbSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gd2l0aCBzdWNoCithbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKK0BlbmQgZW51bWVyYXRlCisKK1RoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKK21ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlCitjb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueQorYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvCitjb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhCitzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUKK2FueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5Citmb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZQorb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQKK2l0c2VsZiBhY2NvbXBhbmllcyB0aGUgZXhlY3V0YWJsZS4KKworSWYgZGlzdHJpYnV0aW9uIG9mIGV4ZWN1dGFibGUgb3Igb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZworYWNjZXNzIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudAorYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzCitkaXN0cmlidXRpb24gb2YgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKK2NvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCisKK0BpdGVtCitZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KK2V4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKK290aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwordm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgorSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKK3RoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCitwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKK0BpdGVtCitZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKK3NpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCitkaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKK3Byb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKK21vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKK2FsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKK3RoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgorCitAaXRlbQorRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKK29yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8KK3RoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCityZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCitZb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bwordGhpcyBMaWNlbnNlLgorCitAaXRlbQorSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKK2NvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90CitkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91CittYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50CitsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5CithbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KK3RoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bworYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKK2NpcmN1bXN0YW5jZXMuCisKK0l0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKK3BhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CitzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCitpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKK2ltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQorZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAordGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKK3RvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAoraW1wb3NlIHRoYXQgY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KK2JlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorCitAaXRlbQorSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZQorbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCit0aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCitjb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKK3RoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCitAaXRlbQorVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKK29mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAorYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCithZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQorc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kIGBgYW55CitsYXRlciB2ZXJzaW9uJycsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YKK3RoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24uCisKK0BpdGVtCitJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKK3Byb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKK3RvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCittYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscworb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAorb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCisKK0BpZnRleAorQGhlYWRpbmcgTk8gV0FSUkFOVFkKK0BlbmQgaWZ0ZXgKK0BpZmluZm8KK0BjZW50ZXIgTk8gV0FSUkFOVFkKK0BlbmQgaWZpbmZvCisKK0BpdGVtCitCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQorRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCitPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCitQUk9WSURFIFRIRSBQUk9HUkFNIGBgQVMgSVMnJyBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VECitPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUworVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRQorUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsCitSRVBBSVIgT1IgQ09SUkVDVElPTi4KKworQGl0ZW0KK0lOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORworV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgorUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKK0lOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORworT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAorVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCitZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgorUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCitQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCitAZW5kIGVudW1lcmF0ZQorCitAaWZ0ZXgKK0BoZWFkaW5nIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworQGVuZCBpZnRleAorQGlmaW5mbworQGNlbnRlciBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKK0BlbmQgaWZpbmZvCisKK0BwYWdlCitAaGVhZGluZyBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKKworICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Citwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0CitmcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KKworICBUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gIEl0IGlzIHNhZmVzdAordG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQorY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKK3RoZSBgYGNvcHlyaWdodCcnIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCisKK0BzbWFsbGV4YW1wbGUKK0B2YXJ7b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGFuIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLn0KK0NvcHlyaWdodCAoQykgMTlAdmFye3l5fSAgQHZhcntuYW1lIG9mIGF1dGhvcn0KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2FzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCitvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK3dpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCitAZW5kIHNtYWxsZXhhbXBsZQorCitBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KKworSWYgdGhlIHByb2dyYW0gaXMgaW50ZXJhY3RpdmUsIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQgbm90aWNlIGxpa2UgdGhpcword2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKKworQHNtYWxsZXhhbXBsZQorR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSAxOUB2YXJ7eXl9IEB2YXJ7bmFtZSBvZiBhdXRob3J9CitHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzCit0eXBlIGBzaG93IHcnLiAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lCit0byByZWRpc3RyaWJ1dGUgaXQgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIAorZm9yIGRldGFpbHMuCitAZW5kIHNtYWxsZXhhbXBsZQorCitUaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIEBzYW1we3Nob3cgd30gYW5kIEBzYW1we3Nob3cgY30gc2hvdWxkIHNob3cKK3RoZSBhcHByb3ByaWF0ZSBwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlCitjb21tYW5kcyB5b3UgdXNlIG1heSBiZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gQHNhbXB7c2hvdyB3fSBhbmQKK0BzYW1we3Nob3cgY307IHRoZXkgY291bGQgZXZlbiBiZSBtb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0tLXdoYXRldmVyCitzdWl0cyB5b3VyIHByb2dyYW0uCisKK1lvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCitzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhIGBgY29weXJpZ2h0IGRpc2NsYWltZXInJyBmb3IgdGhlIHByb2dyYW0sIGlmCituZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6CisKK0BzbWFsbGV4YW1wbGUKK0Bncm91cAorWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodAoraW50ZXJlc3QgaW4gdGhlIHByb2dyYW0gYEdub21vdmlzaW9uJworKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gCitieSBKYW1lcyBIYWNrZXIuCisKK0B2YXJ7c2lnbmF0dXJlIG9mIFR5IENvb259LCAxIEFwcmlsIDE5ODkKK1R5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCitAZW5kIGdyb3VwCitAZW5kIHNtYWxsZXhhbXBsZQorCitUaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KK3Byb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Citjb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKK2xpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvZG9jL2xncGwudGV4aSBiL2xpYmdjcnlwdC0xLjQuNi9kb2MvbGdwbC50ZXhpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZjgzY2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvZG9jL2xncGwudGV4aQpAQCAtMCwwICsxLDU2NSBAQAorQG5vZGUgTGlicmFyeSBDb3B5aW5nCitAdW5udW1iZXJlZCBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKworQGNpbmRleCBMR1BMLCBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK0BjZW50ZXIgVmVyc2lvbiAyLjEsIEZlYnJ1YXJ5IDE5OTkKKworQGRpc3BsYXkKK0NvcHlyaWdodCBAY29weXJpZ2h0e30gMTk5MSwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKzU5IFRlbXBsZSBQbGFjZSAtLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisKK0V2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCisKK1tUaGlzIGlzIHRoZSBmaXJzdCByZWxlYXNlZCB2ZXJzaW9uIG9mIHRoZSBMZXNzZXIgR1BMLiAgSXQgYWxzbyBjb3VudHMKK2FzIHRoZSBzdWNjZXNzb3Igb2YgdGhlIEdOVSBMaWJyYXJ5IFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIGhlbmNlIHRoZQordmVyc2lvbiBudW1iZXIgMi4xLl0KK0BlbmQgZGlzcGxheQorCitAaGVhZGluZyBQcmVhbWJsZQorCisgIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKK2ZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlcyBhcmUgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlCitmcmVlIHNvZnR3YXJlLS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLgorCisgIFRoaXMgbGljZW5zZSwgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhcHBsaWVzIHRvIHNvbWUKK3NwZWNpYWxseSBkZXNpZ25hdGVkIHNvZnR3YXJlLS0tdHlwaWNhbGx5IGxpYnJhcmllcy0tLW9mIHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCBvdGhlciBhdXRob3JzIHdobyBkZWNpZGUgdG8gdXNlIGl0LiAgWW91IGNhbiB1c2UKK2l0IHRvbywgYnV0IHdlIHN1Z2dlc3QgeW91IGZpcnN0IHRoaW5rIGNhcmVmdWxseSBhYm91dCB3aGV0aGVyIHRoaXMKK2xpY2Vuc2Ugb3IgdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgdGhlIGJldHRlciBzdHJhdGVneSB0bwordXNlIGluIGFueSBwYXJ0aWN1bGFyIGNhc2UsIGJhc2VkIG9uIHRoZSBleHBsYW5hdGlvbnMgYmVsb3cuCisKKyAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20gb2YgdXNlLAorbm90IHByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdAoreW91IGhhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZQorZm9yIHRoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCk7IHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldAoraXQgaWYgeW91IHdhbnQgaXQ7IHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIGFuZCB1c2UgcGllY2VzIG9mIGl0CitpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGFyZSBpbmZvcm1lZCB0aGF0IHlvdSBjYW4gZG8gdGhlc2UKK3RoaW5ncy4KKworICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCitkaXN0cmlidXRvcnMgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZXNlCityaWdodHMuICBUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IKK3lvdSBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIGxpYnJhcnkgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5LCB3aGV0aGVyIGdyYXRpcworb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQgd2UgZ2F2ZQoreW91LiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlIHNvdXJjZQorY29kZS4gIElmIHlvdSBsaW5rIG90aGVyIGNvZGUgd2l0aCB0aGUgbGlicmFyeSwgeW91IG11c3QgcHJvdmlkZQorY29tcGxldGUgb2JqZWN0IGZpbGVzIHRvIHRoZSByZWNpcGllbnRzLCBzbyB0aGF0IHRoZXkgY2FuIHJlbGluayB0aGVtCit3aXRoIHRoZSBsaWJyYXJ5IGFmdGVyIG1ha2luZyBjaGFuZ2VzIHRvIHRoZSBsaWJyYXJ5IGFuZCByZWNvbXBpbGluZworaXQuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpciByaWdodHMuCisKKyAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIGEgdHdvLXN0ZXAgbWV0aG9kOiAoMSkgd2UgY29weXJpZ2h0IHRoZQorbGlicmFyeSwgYW5kICgyKSB3ZSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlLCB3aGljaCBnaXZlcyB5b3UgbGVnYWwKK3Blcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBsaWJyYXJ5LgorCisgIFRvIHByb3RlY3QgZWFjaCBkaXN0cmlidXRvciwgd2Ugd2FudCB0byBtYWtlIGl0IHZlcnkgY2xlYXIgdGhhdAordGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoZSBmcmVlIGxpYnJhcnkuICBBbHNvLCBpZiB0aGUgbGlicmFyeSBpcworbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHRoZSByZWNpcGllbnRzIHNob3VsZCBrbm93Cit0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwgdmVyc2lvbiwgc28gdGhhdCB0aGUgb3JpZ2luYWwKK2F1dGhvcidzIHJlcHV0YXRpb24gd2lsbCBub3QgYmUgYWZmZWN0ZWQgYnkgcHJvYmxlbXMgdGhhdCBtaWdodCBiZQoraW50cm9kdWNlZCBieSBvdGhlcnMuCisKKyAgRmluYWxseSwgc29mdHdhcmUgcGF0ZW50cyBwb3NlIGEgY29uc3RhbnQgdGhyZWF0IHRvIHRoZSBleGlzdGVuY2Ugb2YKK2FueSBmcmVlIHByb2dyYW0uICBXZSB3aXNoIHRvIG1ha2Ugc3VyZSB0aGF0IGEgY29tcGFueSBjYW5ub3QKK2VmZmVjdGl2ZWx5IHJlc3RyaWN0IHRoZSB1c2VycyBvZiBhIGZyZWUgcHJvZ3JhbSBieSBvYnRhaW5pbmcgYQorcmVzdHJpY3RpdmUgbGljZW5zZSBmcm9tIGEgcGF0ZW50IGhvbGRlci4gIFRoZXJlZm9yZSwgd2UgaW5zaXN0IHRoYXQKK2FueSBwYXRlbnQgbGljZW5zZSBvYnRhaW5lZCBmb3IgYSB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IG11c3QgYmUKK2NvbnNpc3RlbnQgd2l0aCB0aGUgZnVsbCBmcmVlZG9tIG9mIHVzZSBzcGVjaWZpZWQgaW4gdGhpcyBsaWNlbnNlLgorCisgIE1vc3QgR05VIHNvZnR3YXJlLCBpbmNsdWRpbmcgc29tZSBsaWJyYXJpZXMsIGlzIGNvdmVyZWQgYnkgdGhlCitvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoaXMgbGljZW5zZSwgdGhlIEdOVSBMZXNzZXIKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFwcGxpZXMgdG8gY2VydGFpbiBkZXNpZ25hdGVkIGxpYnJhcmllcywgYW5kCitpcyBxdWl0ZSBkaWZmZXJlbnQgZnJvbSB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFdlIHVzZQordGhpcyBsaWNlbnNlIGZvciBjZXJ0YWluIGxpYnJhcmllcyBpbiBvcmRlciB0byBwZXJtaXQgbGlua2luZyB0aG9zZQorbGlicmFyaWVzIGludG8gbm9uLWZyZWUgcHJvZ3JhbXMuCisKKyAgV2hlbiBhIHByb2dyYW0gaXMgbGlua2VkIHdpdGggYSBsaWJyYXJ5LCB3aGV0aGVyIHN0YXRpY2FsbHkgb3IgdXNpbmcKK2Egc2hhcmVkIGxpYnJhcnksIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgdHdvIGlzIGxlZ2FsbHkgc3BlYWtpbmcgYQorY29tYmluZWQgd29yaywgYSBkZXJpdmF0aXZlIG9mIHRoZSBvcmlnaW5hbCBsaWJyYXJ5LiAgVGhlIG9yZGluYXJ5CitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHRoZXJlZm9yZSBwZXJtaXRzIHN1Y2ggbGlua2luZyBvbmx5IGlmIHRoZQorZW50aXJlIGNvbWJpbmF0aW9uIGZpdHMgaXRzIGNyaXRlcmlhIG9mIGZyZWVkb20uICBUaGUgTGVzc2VyIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIHBlcm1pdHMgbW9yZSBsYXggY3JpdGVyaWEgZm9yIGxpbmtpbmcgb3RoZXIgY29kZSB3aXRoCit0aGUgbGlicmFyeS4KKworICBXZSBjYWxsIHRoaXMgbGljZW5zZSB0aGUgQGRmbntMZXNzZXJ9IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYmVjYXVzZSBpdAorZG9lcyBAZW1waHtMZXNzfSB0byBwcm90ZWN0IHRoZSB1c2VyJ3MgZnJlZWRvbSB0aGFuIHRoZSBvcmRpbmFyeSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZS4gIEl0IGFsc28gcHJvdmlkZXMgb3RoZXIgZnJlZSBzb2Z0d2FyZSBkZXZlbG9wZXJzIExlc3MKK29mIGFuIGFkdmFudGFnZSBvdmVyIGNvbXBldGluZyBub24tZnJlZSBwcm9ncmFtcy4gIFRoZXNlIGRpc2FkdmFudGFnZXMKK2FyZSB0aGUgcmVhc29uIHdlIHVzZSB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbWFueQorbGlicmFyaWVzLiAgSG93ZXZlciwgdGhlIExlc3NlciBsaWNlbnNlIHByb3ZpZGVzIGFkdmFudGFnZXMgaW4gY2VydGFpbgorc3BlY2lhbCBjaXJjdW1zdGFuY2VzLgorCisgIEZvciBleGFtcGxlLCBvbiByYXJlIG9jY2FzaW9ucywgdGhlcmUgbWF5IGJlIGEgc3BlY2lhbCBuZWVkIHRvCitlbmNvdXJhZ2UgdGhlIHdpZGVzdCBwb3NzaWJsZSB1c2Ugb2YgYSBjZXJ0YWluIGxpYnJhcnksIHNvIHRoYXQgaXQgYmVjb21lcworYSBkZS1mYWN0byBzdGFuZGFyZC4gIFRvIGFjaGlldmUgdGhpcywgbm9uLWZyZWUgcHJvZ3JhbXMgbXVzdCBiZQorYWxsb3dlZCB0byB1c2UgdGhlIGxpYnJhcnkuICBBIG1vcmUgZnJlcXVlbnQgY2FzZSBpcyB0aGF0IGEgZnJlZQorbGlicmFyeSBkb2VzIHRoZSBzYW1lIGpvYiBhcyB3aWRlbHkgdXNlZCBub24tZnJlZSBsaWJyYXJpZXMuICBJbiB0aGlzCitjYXNlLCB0aGVyZSBpcyBsaXR0bGUgdG8gZ2FpbiBieSBsaW1pdGluZyB0aGUgZnJlZSBsaWJyYXJ5IHRvIGZyZWUKK3NvZnR3YXJlIG9ubHksIHNvIHdlIHVzZSB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisKKyAgSW4gb3RoZXIgY2FzZXMsIHBlcm1pc3Npb24gdG8gdXNlIGEgcGFydGljdWxhciBsaWJyYXJ5IGluIG5vbi1mcmVlCitwcm9ncmFtcyBlbmFibGVzIGEgZ3JlYXRlciBudW1iZXIgb2YgcGVvcGxlIHRvIHVzZSBhIGxhcmdlIGJvZHkgb2YKK2ZyZWUgc29mdHdhcmUuICBGb3IgZXhhbXBsZSwgcGVybWlzc2lvbiB0byB1c2UgdGhlIEdOVSBDIExpYnJhcnkgaW4KK25vbi1mcmVlIHByb2dyYW1zIGVuYWJsZXMgbWFueSBtb3JlIHBlb3BsZSB0byB1c2UgdGhlIHdob2xlIEdOVQorb3BlcmF0aW5nIHN5c3RlbSwgYXMgd2VsbCBhcyBpdHMgdmFyaWFudCwgdGhlIEdOVS9MaW51eCBvcGVyYXRpbmcKK3N5c3RlbS4KKworICBBbHRob3VnaCB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgTGVzcyBwcm90ZWN0aXZlIG9mIHRoZQordXNlcnMnIGZyZWVkb20sIGl0IGRvZXMgZW5zdXJlIHRoYXQgdGhlIHVzZXIgb2YgYSBwcm9ncmFtIHRoYXQgaXMKK2xpbmtlZCB3aXRoIHRoZSBMaWJyYXJ5IGhhcyB0aGUgZnJlZWRvbSBhbmQgdGhlIHdoZXJld2l0aGFsIHRvIHJ1bgordGhhdCBwcm9ncmFtIHVzaW5nIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeS4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4gIFBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhCitgYHdvcmsgYmFzZWQgb24gdGhlIGxpYnJhcnknJyBhbmQgYSBgYHdvcmsgdGhhdCB1c2VzIHRoZSBsaWJyYXJ5JycuICBUaGUKK2Zvcm1lciBjb250YWlucyBjb2RlIGRlcml2ZWQgZnJvbSB0aGUgbGlicmFyeSwgd2hlcmVhcyB0aGUgbGF0dGVyIG11c3QKK2JlIGNvbWJpbmVkIHdpdGggdGhlIGxpYnJhcnkgaW4gb3JkZXIgdG8gcnVuLgorCitAaWZ0ZXgKK0BoZWFkaW5nIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgorQGVuZCBpZnRleAorQGlmaW5mbworQGNlbnRlciBHTlUgTEVTU0VSIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKK0BjZW50ZXIgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCitAZW5kIGlmaW5mbworCitAZW51bWVyYXRlIDAKK0BpdGVtCitUaGlzIExpY2Vuc2UgQWdyZWVtZW50IGFwcGxpZXMgdG8gYW55IHNvZnR3YXJlIGxpYnJhcnkgb3Igb3RoZXIgcHJvZ3JhbQord2hpY2ggY29udGFpbnMgYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIG9yIG90aGVyCithdXRob3JpemVkIHBhcnR5IHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMKK0xlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChhbHNvIGNhbGxlZCBgYHRoaXMgTGljZW5zZScnKS4gIEVhY2gKK2xpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyBgYHlvdScnLgorCisgIEEgYGBsaWJyYXJ5JycgbWVhbnMgYSBjb2xsZWN0aW9uIG9mIHNvZnR3YXJlIGZ1bmN0aW9ucyBhbmQvb3IgZGF0YQorcHJlcGFyZWQgc28gYXMgdG8gYmUgY29udmVuaWVudGx5IGxpbmtlZCB3aXRoIGFwcGxpY2F0aW9uIHByb2dyYW1zCisod2hpY2ggdXNlIHNvbWUgb2YgdGhvc2UgZnVuY3Rpb25zIGFuZCBkYXRhKSB0byBmb3JtIGV4ZWN1dGFibGVzLgorCisgIFRoZSBgYExpYnJhcnknJywgYmVsb3csIHJlZmVycyB0byBhbnkgc3VjaCBzb2Z0d2FyZSBsaWJyYXJ5IG9yIHdvcmsKK3doaWNoIGhhcyBiZWVuIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZXNlIHRlcm1zLiAgQSBgYHdvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5JycgbWVhbnMgZWl0aGVyIHRoZSBMaWJyYXJ5IG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIKK2NvcHlyaWdodCBsYXc6IHRoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgTGlicmFyeSBvciBhCitwb3J0aW9uIG9mIGl0LCBlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkCitzdHJhaWdodGZvcndhcmRseSBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzCitpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4gdGhlIHRlcm0gYGBtb2RpZmljYXRpb24nJy4pCisKKyAgYGBTb3VyY2UgY29kZScnIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYSBsaWJyYXJ5LCBjb21wbGV0ZSBzb3VyY2UgY29kZSBtZWFucworYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55IGFzc29jaWF0ZWQKK2ludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8gY29udHJvbCBjb21waWxhdGlvbgorYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgbGlicmFyeS4KKworICBBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAorY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgorcnVubmluZyBhIHByb2dyYW0gdXNpbmcgdGhlIExpYnJhcnkgaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCBvdXRwdXQgZnJvbQorc3VjaCBhIHByb2dyYW0gaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZAorb24gdGhlIExpYnJhcnkgKGluZGVwZW5kZW50IG9mIHRoZSB1c2Ugb2YgdGhlIExpYnJhcnkgaW4gYSB0b29sIGZvcgord3JpdGluZyBpdCkuICBXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIExpYnJhcnkgZG9lcworYW5kIHdoYXQgdGhlIHByb2dyYW0gdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IGRvZXMuCisKK0BpdGVtCitZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBMaWJyYXJ5J3MKK2NvbXBsZXRlIHNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0Cit5b3UgY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbgorYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QKK2FsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55Cit3YXJyYW50eTsgYW5kIGRpc3RyaWJ1dGUgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZQorTGlicmFyeS4KKworICBZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LAorYW5kIHlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYQorZmVlLgorCitAaXRlbQorWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgTGlicmFyeSBvciBhbnkgcG9ydGlvbgorb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBjb3B5IGFuZAorZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCithYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCitAZW51bWVyYXRlIGEKK0BpdGVtCitUaGUgbW9kaWZpZWQgd29yayBtdXN0IGl0c2VsZiBiZSBhIHNvZnR3YXJlIGxpYnJhcnkuCisKK0BpdGVtCitZb3UgbXVzdCBjYXVzZSB0aGUgZmlsZXMgbW9kaWZpZWQgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKK3N0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCisKK0BpdGVtCitZb3UgbXVzdCBjYXVzZSB0aGUgd2hvbGUgb2YgdGhlIHdvcmsgdG8gYmUgbGljZW5zZWQgYXQgbm8KK2NoYXJnZSB0byBhbGwgdGhpcmQgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorCitAaXRlbQorSWYgYSBmYWNpbGl0eSBpbiB0aGUgbW9kaWZpZWQgTGlicmFyeSByZWZlcnMgdG8gYSBmdW5jdGlvbiBvciBhCit0YWJsZSBvZiBkYXRhIHRvIGJlIHN1cHBsaWVkIGJ5IGFuIGFwcGxpY2F0aW9uIHByb2dyYW0gdGhhdCB1c2VzCit0aGUgZmFjaWxpdHksIG90aGVyIHRoYW4gYXMgYW4gYXJndW1lbnQgcGFzc2VkIHdoZW4gdGhlIGZhY2lsaXR5CitpcyBpbnZva2VkLCB0aGVuIHlvdSBtdXN0IG1ha2UgYSBnb29kIGZhaXRoIGVmZm9ydCB0byBlbnN1cmUgdGhhdCwKK2luIHRoZSBldmVudCBhbiBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgc3VjaCBmdW5jdGlvbiBvcgordGFibGUsIHRoZSBmYWNpbGl0eSBzdGlsbCBvcGVyYXRlcywgYW5kIHBlcmZvcm1zIHdoYXRldmVyIHBhcnQgb2YKK2l0cyBwdXJwb3NlIHJlbWFpbnMgbWVhbmluZ2Z1bC4KKworKEZvciBleGFtcGxlLCBhIGZ1bmN0aW9uIGluIGEgbGlicmFyeSB0byBjb21wdXRlIHNxdWFyZSByb290cyBoYXMKK2EgcHVycG9zZSB0aGF0IGlzIGVudGlyZWx5IHdlbGwtZGVmaW5lZCBpbmRlcGVuZGVudCBvZiB0aGUKK2FwcGxpY2F0aW9uLiAgVGhlcmVmb3JlLCBTdWJzZWN0aW9uIDJkIHJlcXVpcmVzIHRoYXQgYW55CithcHBsaWNhdGlvbi1zdXBwbGllZCBmdW5jdGlvbiBvciB0YWJsZSB1c2VkIGJ5IHRoaXMgZnVuY3Rpb24gbXVzdAorYmUgb3B0aW9uYWw6IGlmIHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgaXQsIHRoZSBzcXVhcmUKK3Jvb3QgZnVuY3Rpb24gbXVzdCBzdGlsbCBjb21wdXRlIHNxdWFyZSByb290cy4pCitAZW5kIGVudW1lcmF0ZQorCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCitpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBMaWJyYXJ5LAorYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCit0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCitzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKK2Rpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAorb24gdGhlIExpYnJhcnksIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCit0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQorZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlCitpdC4KKworVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Cit5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KK2V4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgorY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgTGlicmFyeS4KKworSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgTGlicmFyeQord2l0aCB0aGUgTGlicmFyeSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnkpIG9uIGEgdm9sdW1lIG9mCithIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgordGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KKworQGl0ZW0KK1lvdSBtYXkgb3B0IHRvIGFwcGx5IHRoZSB0ZXJtcyBvZiB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlIHRvIGEgZ2l2ZW4gY29weSBvZiB0aGUgTGlicmFyeS4gIFRvIGRvCit0aGlzLCB5b3UgbXVzdCBhbHRlciBhbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UsIHNvCit0aGF0IHRoZXkgcmVmZXIgdG8gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsCitpbnN0ZWFkIG9mIHRvIHRoaXMgTGljZW5zZS4gIChJZiBhIG5ld2VyIHZlcnNpb24gdGhhbiB2ZXJzaW9uIDIgb2YgdGhlCitvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBoYXMgYXBwZWFyZWQsIHRoZW4geW91IGNhbiBzcGVjaWZ5Cit0aGF0IHZlcnNpb24gaW5zdGVhZCBpZiB5b3Ugd2lzaC4pICBEbyBub3QgbWFrZSBhbnkgb3RoZXIgY2hhbmdlIGluCit0aGVzZSBub3RpY2VzLgorCisgIE9uY2UgdGhpcyBjaGFuZ2UgaXMgbWFkZSBpbiBhIGdpdmVuIGNvcHksIGl0IGlzIGlycmV2ZXJzaWJsZSBmb3IKK3RoYXQgY29weSwgc28gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gYWxsCitzdWJzZXF1ZW50IGNvcGllcyBhbmQgZGVyaXZhdGl2ZSB3b3JrcyBtYWRlIGZyb20gdGhhdCBjb3B5LgorCisgIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSB3aXNoIHRvIGNvcHkgcGFydCBvZiB0aGUgY29kZSBvZgordGhlIExpYnJhcnkgaW50byBhIHByb2dyYW0gdGhhdCBpcyBub3QgYSBsaWJyYXJ5LgorCitAaXRlbQorWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IChvciBhIHBvcnRpb24gb3IKK2Rlcml2YXRpdmUgb2YgaXQsIHVuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtCit1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhY2NvbXBhbnkKK2l0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSwgd2hpY2gKK211c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYQorbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlLgorCisgIElmIGRpc3RyaWJ1dGlvbiBvZiBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5Citmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZQorc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBzYXRpc2ZpZXMgdGhlIHJlcXVpcmVtZW50IHRvCitkaXN0cmlidXRlIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Citjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgorCitAaXRlbQorQSBwcm9ncmFtIHRoYXQgY29udGFpbnMgbm8gZGVyaXZhdGl2ZSBvZiBhbnkgcG9ydGlvbiBvZiB0aGUKK0xpYnJhcnksIGJ1dCBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGggdGhlIExpYnJhcnkgYnkgYmVpbmcgY29tcGlsZWQgb3IKK2xpbmtlZCB3aXRoIGl0LCBpcyBjYWxsZWQgYSBgYHdvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5JycuICBTdWNoIGEKK3dvcmssIGluIGlzb2xhdGlvbiwgaXMgbm90IGEgZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5LCBhbmQKK3RoZXJlZm9yZSBmYWxscyBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgSG93ZXZlciwgbGlua2luZyBhIGBgd29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnknJyB3aXRoIHRoZSBMaWJyYXJ5CitjcmVhdGVzIGFuIGV4ZWN1dGFibGUgdGhhdCBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIExpYnJhcnkgKGJlY2F1c2UgaXQKK2NvbnRhaW5zIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5KSwgcmF0aGVyIHRoYW4gYSBgYHdvcmsgdGhhdCB1c2VzIHRoZQorbGlicmFyeScnLiAgVGhlIGV4ZWN1dGFibGUgaXMgdGhlcmVmb3JlIGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLgorU2VjdGlvbiA2IHN0YXRlcyB0ZXJtcyBmb3IgZGlzdHJpYnV0aW9uIG9mIHN1Y2ggZXhlY3V0YWJsZXMuCisKKyAgV2hlbiBhIGBgd29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnknJyB1c2VzIG1hdGVyaWFsIGZyb20gYSBoZWFkZXIgZmlsZQordGhhdCBpcyBwYXJ0IG9mIHRoZSBMaWJyYXJ5LCB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIG1heSBiZSBhCitkZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnkgZXZlbiB0aG91Z2ggdGhlIHNvdXJjZSBjb2RlIGlzIG5vdC4KK1doZXRoZXIgdGhpcyBpcyB0cnVlIGlzIGVzcGVjaWFsbHkgc2lnbmlmaWNhbnQgaWYgdGhlIHdvcmsgY2FuIGJlCitsaW5rZWQgd2l0aG91dCB0aGUgTGlicmFyeSwgb3IgaWYgdGhlIHdvcmsgaXMgaXRzZWxmIGEgbGlicmFyeS4gIFRoZQordGhyZXNob2xkIGZvciB0aGlzIHRvIGJlIHRydWUgaXMgbm90IHByZWNpc2VseSBkZWZpbmVkIGJ5IGxhdy4KKworICBJZiBzdWNoIGFuIG9iamVjdCBmaWxlIHVzZXMgb25seSBudW1lcmljYWwgcGFyYW1ldGVycywgZGF0YQorc3RydWN0dXJlIGxheW91dHMgYW5kIGFjY2Vzc29ycywgYW5kIHNtYWxsIG1hY3JvcyBhbmQgc21hbGwgaW5saW5lCitmdW5jdGlvbnMgKHRlbiBsaW5lcyBvciBsZXNzIGluIGxlbmd0aCksIHRoZW4gdGhlIHVzZSBvZiB0aGUgb2JqZWN0CitmaWxlIGlzIHVucmVzdHJpY3RlZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIGxlZ2FsbHkgYSBkZXJpdmF0aXZlCit3b3JrLiAgKEV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhpcyBvYmplY3QgY29kZSBwbHVzIHBvcnRpb25zIG9mIHRoZQorTGlicmFyeSB3aWxsIHN0aWxsIGZhbGwgdW5kZXIgU2VjdGlvbiA2LikKKworICBPdGhlcndpc2UsIGlmIHRoZSB3b3JrIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSwgeW91IG1heQorZGlzdHJpYnV0ZSB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDYuCitBbnkgZXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGF0IHdvcmsgYWxzbyBmYWxsIHVuZGVyIFNlY3Rpb24gNiwKK3doZXRoZXIgb3Igbm90IHRoZXkgYXJlIGxpbmtlZCBkaXJlY3RseSB3aXRoIHRoZSBMaWJyYXJ5IGl0c2VsZi4KKworQGl0ZW0KK0FzIGFuIGV4Y2VwdGlvbiB0byB0aGUgU2VjdGlvbnMgYWJvdmUsIHlvdSBtYXkgYWxzbyBjb21iaW5lIG9yCitsaW5rIGEgYGB3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeScnIHdpdGggdGhlIExpYnJhcnkgdG8gcHJvZHVjZSBhCit3b3JrIGNvbnRhaW5pbmcgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnksIGFuZCBkaXN0cmlidXRlIHRoYXQgd29yawordW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgdGhlIHRlcm1zIHBlcm1pdAorbW9kaWZpY2F0aW9uIG9mIHRoZSB3b3JrIGZvciB0aGUgY3VzdG9tZXIncyBvd24gdXNlIGFuZCByZXZlcnNlCitlbmdpbmVlcmluZyBmb3IgZGVidWdnaW5nIHN1Y2ggbW9kaWZpY2F0aW9ucy4KKworICBZb3UgbXVzdCBnaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCBlYWNoIGNvcHkgb2YgdGhlIHdvcmsgdGhhdCB0aGUKK0xpYnJhcnkgaXMgdXNlZCBpbiBpdCBhbmQgdGhhdCB0aGUgTGlicmFyeSBhbmQgaXRzIHVzZSBhcmUgY292ZXJlZCBieQordGhpcyBMaWNlbnNlLiAgWW91IG11c3Qgc3VwcGx5IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuICBJZiB0aGUgd29yaworZHVyaW5nIGV4ZWN1dGlvbiBkaXNwbGF5cyBjb3B5cmlnaHQgbm90aWNlcywgeW91IG11c3QgaW5jbHVkZSB0aGUKK2NvcHlyaWdodCBub3RpY2UgZm9yIHRoZSBMaWJyYXJ5IGFtb25nIHRoZW0sIGFzIHdlbGwgYXMgYSByZWZlcmVuY2UKK2RpcmVjdGluZyB0aGUgdXNlciB0byB0aGUgY29weSBvZiB0aGlzIExpY2Vuc2UuICBBbHNvLCB5b3UgbXVzdCBkbyBvbmUKK29mIHRoZXNlIHRoaW5nczoKKworQGVudW1lcmF0ZSBhCitAaXRlbQorQWNjb21wYW55IHRoZSB3b3JrIHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcKK21hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUgZm9yIHRoZSBMaWJyYXJ5IGluY2x1ZGluZyB3aGF0ZXZlcgorY2hhbmdlcyB3ZXJlIHVzZWQgaW4gdGhlIHdvcmsgKHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIKK1NlY3Rpb25zIDEgYW5kIDIgYWJvdmUpOyBhbmQsIGlmIHRoZSB3b3JrIGlzIGFuIGV4ZWN1dGFibGUgbGlua2VkCit3aXRoIHRoZSBMaWJyYXJ5LCB3aXRoIHRoZSBjb21wbGV0ZSBtYWNoaW5lLXJlYWRhYmxlIGBgd29yayB0aGF0Cit1c2VzIHRoZSBMaWJyYXJ5JycsIGFzIG9iamVjdCBjb2RlIGFuZC9vciBzb3VyY2UgY29kZSwgc28gdGhhdCB0aGUKK3VzZXIgY2FuIG1vZGlmeSB0aGUgTGlicmFyeSBhbmQgdGhlbiByZWxpbmsgdG8gcHJvZHVjZSBhIG1vZGlmaWVkCitleGVjdXRhYmxlIGNvbnRhaW5pbmcgdGhlIG1vZGlmaWVkIExpYnJhcnkuICAoSXQgaXMgdW5kZXJzdG9vZAordGhhdCB0aGUgdXNlciB3aG8gY2hhbmdlcyB0aGUgY29udGVudHMgb2YgZGVmaW5pdGlvbnMgZmlsZXMgaW4gdGhlCitMaWJyYXJ5IHdpbGwgbm90IG5lY2Vzc2FyaWx5IGJlIGFibGUgdG8gcmVjb21waWxlIHRoZSBhcHBsaWNhdGlvbgordG8gdXNlIHRoZSBtb2RpZmllZCBkZWZpbml0aW9ucy4pCisKK0BpdGVtCitVc2UgYSBzdWl0YWJsZSBzaGFyZWQgbGlicmFyeSBtZWNoYW5pc20gZm9yIGxpbmtpbmcgd2l0aCB0aGUgTGlicmFyeS4gIEEKK3N1aXRhYmxlIG1lY2hhbmlzbSBpcyBvbmUgdGhhdCAoMSkgdXNlcyBhdCBydW4gdGltZSBhIGNvcHkgb2YgdGhlCitsaWJyYXJ5IGFscmVhZHkgcHJlc2VudCBvbiB0aGUgdXNlcidzIGNvbXB1dGVyIHN5c3RlbSwgcmF0aGVyIHRoYW4KK2NvcHlpbmcgbGlicmFyeSBmdW5jdGlvbnMgaW50byB0aGUgZXhlY3V0YWJsZSwgYW5kICgyKSB3aWxsIG9wZXJhdGUKK3Byb3Blcmx5IHdpdGggYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCBpZiB0aGUgdXNlciBpbnN0YWxscworb25lLCBhcyBsb25nIGFzIHRoZSBtb2RpZmllZCB2ZXJzaW9uIGlzIGludGVyZmFjZS1jb21wYXRpYmxlIHdpdGggdGhlCit2ZXJzaW9uIHRoYXQgdGhlIHdvcmsgd2FzIG1hZGUgd2l0aC4KKworQGl0ZW0KK0FjY29tcGFueSB0aGUgd29yayB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0CitsZWFzdCB0aHJlZSB5ZWFycywgdG8gZ2l2ZSB0aGUgc2FtZSB1c2VyIHRoZSBtYXRlcmlhbHMKK3NwZWNpZmllZCBpbiBTdWJzZWN0aW9uIDZhLCBhYm92ZSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUKK3RoYW4gdGhlIGNvc3Qgb2YgcGVyZm9ybWluZyB0aGlzIGRpc3RyaWJ1dGlvbi4KKworQGl0ZW0KK0lmIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5Citmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgb2ZmZXIgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUgYWJvdmUKK3NwZWNpZmllZCBtYXRlcmlhbHMgZnJvbSB0aGUgc2FtZSBwbGFjZS4KKworQGl0ZW0KK1ZlcmlmeSB0aGF0IHRoZSB1c2VyIGhhcyBhbHJlYWR5IHJlY2VpdmVkIGEgY29weSBvZiB0aGVzZQorbWF0ZXJpYWxzIG9yIHRoYXQgeW91IGhhdmUgYWxyZWFkeSBzZW50IHRoaXMgdXNlciBhIGNvcHkuCitAZW5kIGVudW1lcmF0ZQorCisgIEZvciBhbiBleGVjdXRhYmxlLCB0aGUgcmVxdWlyZWQgZm9ybSBvZiB0aGUgYGB3b3JrIHRoYXQgdXNlcyB0aGUKK0xpYnJhcnknJyBtdXN0IGluY2x1ZGUgYW55IGRhdGEgYW5kIHV0aWxpdHkgcHJvZ3JhbXMgbmVlZGVkIGZvcgorcmVwcm9kdWNpbmcgdGhlIGV4ZWN1dGFibGUgZnJvbSBpdC4gIEhvd2V2ZXIsIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sCit0aGUgbWF0ZXJpYWxzIHRvIGJlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUgYW55dGhpbmcgdGhhdCBpcworbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5IGZvcm0pIHdpdGggdGhlIG1ham9yCitjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9uCit3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQgaXRzZWxmIGFjY29tcGFuaWVzIHRoZQorZXhlY3V0YWJsZS4KKworICBJdCBtYXkgaGFwcGVuIHRoYXQgdGhpcyByZXF1aXJlbWVudCBjb250cmFkaWN0cyB0aGUgbGljZW5zZQorcmVzdHJpY3Rpb25zIG9mIG90aGVyIHByb3ByaWV0YXJ5IGxpYnJhcmllcyB0aGF0IGRvIG5vdCBub3JtYWxseQorYWNjb21wYW55IHRoZSBvcGVyYXRpbmcgc3lzdGVtLiAgU3VjaCBhIGNvbnRyYWRpY3Rpb24gbWVhbnMgeW91IGNhbm5vdAordXNlIGJvdGggdGhlbSBhbmQgdGhlIExpYnJhcnkgdG9nZXRoZXIgaW4gYW4gZXhlY3V0YWJsZSB0aGF0IHlvdQorZGlzdHJpYnV0ZS4KKworQGl0ZW0KK1lvdSBtYXkgcGxhY2UgbGlicmFyeSBmYWNpbGl0aWVzIHRoYXQgYXJlIGEgd29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkgc2lkZS1ieS1zaWRlIGluIGEgc2luZ2xlIGxpYnJhcnkgdG9nZXRoZXIgd2l0aCBvdGhlciBsaWJyYXJ5CitmYWNpbGl0aWVzIG5vdCBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgc3VjaCBhIGNvbWJpbmVkCitsaWJyYXJ5LCBwcm92aWRlZCB0aGF0IHRoZSBzZXBhcmF0ZSBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgYmFzZWQgb24KK3RoZSBMaWJyYXJ5IGFuZCBvZiB0aGUgb3RoZXIgbGlicmFyeSBmYWNpbGl0aWVzIGlzIG90aGVyd2lzZQorcGVybWl0dGVkLCBhbmQgcHJvdmlkZWQgdGhhdCB5b3UgZG8gdGhlc2UgdHdvIHRoaW5nczoKKworQGVudW1lcmF0ZSBhCitAaXRlbQorQWNjb21wYW55IHRoZSBjb21iaW5lZCBsaWJyYXJ5IHdpdGggYSBjb3B5IG9mIHRoZSBzYW1lIHdvcmsKK2Jhc2VkIG9uIHRoZSBMaWJyYXJ5LCB1bmNvbWJpbmVkIHdpdGggYW55IG90aGVyIGxpYnJhcnkKK2ZhY2lsaXRpZXMuICBUaGlzIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorU2VjdGlvbnMgYWJvdmUuCisKK0BpdGVtCitHaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCB0aGUgY29tYmluZWQgbGlicmFyeSBvZiB0aGUgZmFjdAordGhhdCBwYXJ0IG9mIGl0IGlzIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGV4cGxhaW5pbmcKK3doZXJlIHRvIGZpbmQgdGhlIGFjY29tcGFueWluZyB1bmNvbWJpbmVkIGZvcm0gb2YgdGhlIHNhbWUgd29yay4KK0BlbmQgZW51bWVyYXRlCisKK0BpdGVtCitZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIGxpbmsgd2l0aCwgb3IgZGlzdHJpYnV0ZQordGhlIExpYnJhcnkgZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkKK2F0dGVtcHQgb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvcgorZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBpcyB2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyCityaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLiAgSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsCitvciByaWdodHMsIGZyb20geW91IHVuZGVyIHRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzCit0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaCBwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKK0BpdGVtCitZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKK3NpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCitkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKK3Byb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKK21vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKK2FsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKK3RoZSBMaWJyYXJ5IG9yIHdvcmtzIGJhc2VkIG9uIGl0LgorCitAaXRlbQorRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKK29yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUsIGxpbmsgd2l0aCBvciBtb2RpZnkgdGhlIExpYnJhcnkKK3N1YmplY3QgdG8gdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KK1lvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHdpdGgKK3RoaXMgTGljZW5zZS4KKworQGl0ZW0KK0lmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKK2luZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCitjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAorZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcworTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQorbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAorbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeSBieQorYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCit0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCityZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5LgorCitJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYW55CitwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gYXBwbHksCithbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlciBjaXJjdW1zdGFuY2VzLgorCitJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55CitwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQorc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQoraW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0gd2hpY2ggaXMKK2ltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQorZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAordGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKK3RvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAoraW1wb3NlIHRoYXQgY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KK2JlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorCitAaXRlbQorSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBMaWJyYXJ5IGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBMaWJyYXJ5IHVuZGVyIHRoaXMgTGljZW5zZSBtYXkgYWRkCithbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nIHRob3NlIGNvdW50cmllcywKK3NvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nIGNvdW50cmllcyBub3QgdGh1cworZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMgdGhlIGxpbWl0YXRpb24gYXMgaWYKK3dyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCitAaXRlbQorVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcKK3ZlcnNpb25zIG9mIHRoZSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4KK1N1Y2ggbmV3IHZlcnNpb25zIHdpbGwgYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwKK2J1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0byBhZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgTGlicmFyeQorc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kCitgYGFueSBsYXRlciB2ZXJzaW9uJycsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQKK2NvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgTGlicmFyeSBkb2VzIG5vdCBzcGVjaWZ5IGEKK2xpY2Vuc2UgdmVyc2lvbiBudW1iZXIsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCitAaXRlbQorSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIExpYnJhcnkgaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgaW5jb21wYXRpYmxlIHdpdGggdGhlc2UsCit3cml0ZSB0byB0aGUgYXV0aG9yIHRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcworY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcyBtYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIKK2RlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMgb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMKK29mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQgb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nCithbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCitAaWZ0ZXgKK0BoZWFkaW5nIE5PIFdBUlJBTlRZCitAZW5kIGlmdGV4CitAaWZpbmZvCitAY2VudGVyIE5PIFdBUlJBTlRZCitAZW5kIGlmaW5mbworCitAaXRlbQorQkVDQVVTRSBUSEUgTElCUkFSWSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8KK1dBUlJBTlRZIEZPUiBUSEUgTElCUkFSWSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuCitFWENFUFQgV0hFTiBPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUgorT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRSBMSUJSQVJZIGBgQVMgSVMnJyBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWQorS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCitJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKK1BVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRQorTElCUkFSWSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUgTElCUkFSWSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUKK1RIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4KKworQGl0ZW0KK0lOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4KK1dSSVRJTkcgV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZCitBTkQvT1IgUkVESVNUUklCVVRFIFRIRSBMSUJSQVJZIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVQorRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUgorQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUKK0xJQlJBUlkgKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcKK1JFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBCitGQUlMVVJFIE9GIFRIRSBMSUJSQVJZIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgU09GVFdBUkUpLCBFVkVOIElGCitTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICitEQU1BR0VTLgorQGVuZCBlbnVtZXJhdGUKKworQGlmdGV4CitAaGVhZGluZyBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKK0BlbmQgaWZ0ZXgKK0BpZmluZm8KK0BjZW50ZXIgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCitAZW5kIGlmaW5mbworCitAcGFnZQorQGhlYWRpbmcgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IExpYnJhcmllcworCisgIElmIHlvdSBkZXZlbG9wIGEgbmV3IGxpYnJhcnksIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKK3Bvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB3ZSByZWNvbW1lbmQgbWFraW5nIGl0IGZyZWUgc29mdHdhcmUgdGhhdAorZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlLiAgWW91IGNhbiBkbyBzbyBieSBwZXJtaXR0aW5nCityZWRpc3RyaWJ1dGlvbiB1bmRlciB0aGVzZSB0ZXJtcyAob3IsIGFsdGVybmF0aXZlbHksIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKK29yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UpLgorCisgIFRvIGFwcGx5IHRoZXNlIHRlcm1zLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBsaWJyYXJ5LiAgSXQgaXMKK3NhZmVzdCB0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Citjb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdCB0aGUKK2BgY29weXJpZ2h0JycgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworQHNtYWxsZXhhbXBsZQorQHZhcntvbmUgbGluZSB0byBnaXZlIHRoZSBsaWJyYXJ5J3MgbmFtZSBhbmQgYW4gaWRlYSBvZiB3aGF0IGl0IGRvZXMufQorQ29weXJpZ2h0IChDKSBAdmFye3llYXJ9ICBAdmFye25hbWUgb2YgYXV0aG9yfQorCitUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAordW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAoreW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKK1VTQS4KK0BlbmQgc21hbGxleGFtcGxlCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgorCitZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgorc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSBgYGNvcHlyaWdodCBkaXNjbGFpbWVyJycgZm9yIHRoZSBsaWJyYXJ5LCBpZgorbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCitAc21hbGxleGFtcGxlCitZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBsaWJyYXJ5CitgRnJvYicgKGEgbGlicmFyeSBmb3IgdHdlYWtpbmcga25vYnMpIHdyaXR0ZW4gYnkgSmFtZXMgUmFuZG9tIEhhY2tlci4KKworQHZhcntzaWduYXR1cmUgb2YgVHkgQ29vbn0sIDEgQXByaWwgMTk5MAorVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKK0BlbmQgc21hbGxleGFtcGxlCisKK1RoYXQncyBhbGwgdGhlcmUgaXMgdG8gaXQhCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvZG9jL2xpYmdjcnlwdC1tb2R1bGVzLmVwcyBiL2xpYmdjcnlwdC0xLjQuNi9kb2MvbGliZ2NyeXB0LW1vZHVsZXMuZXBzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1M2ZkZWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvZG9jL2xpYmdjcnlwdC1tb2R1bGVzLmVwcwpAQCAtMCwwICsxLDM0OSBAQAorJSFQUy1BZG9iZS0yLjAgRVBTRi0yLjAKKyUlVGl0bGU6IGxpYmdjcnlwdC1tb2R1bGVzLmZpZworJSVDcmVhdG9yOiBmaWcyZGV2IFZlcnNpb24gMy4yIFBhdGNobGV2ZWwgNAorJSVDcmVhdGlvbkRhdGU6IFRodSBKdWwgIDkgMTM6MjQ6MzMgMjAwOQorJSVGb3I6IHdrQHZpZ2VuZXJlIChXZXJuZXIgS29jaCwsLCkKKyUlQm91bmRpbmdCb3g6IDAgMCA0ODggMzAwCislJU1hZ25pZmljYXRpb246IDEuMDAwMAorJSVFbmRDb21tZW50cworLyRGMnBzRGljdCAyMDAgZGljdCBkZWYKKyRGMnBzRGljdCBiZWdpbgorJEYycHNEaWN0IC9tdHJ4IG1hdHJpeCBwdXQKKy9jb2wtMSB7MCBzZXRncmF5fSBiaW5kIGRlZgorL2NvbDAgezAuMDAwIDAuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCisvY29sMSB7MC4wMDAgMC4wMDAgMS4wMDAgc3JnYn0gYmluZCBkZWYKKy9jb2wyIHswLjAwMCAxLjAwMCAwLjAwMCBzcmdifSBiaW5kIGRlZgorL2NvbDMgezAuMDAwIDEuMDAwIDEuMDAwIHNyZ2J9IGJpbmQgZGVmCisvY29sNCB7MS4wMDAgMC4wMDAgMC4wMDAgc3JnYn0gYmluZCBkZWYKKy9jb2w1IHsxLjAwMCAwLjAwMCAxLjAwMCBzcmdifSBiaW5kIGRlZgorL2NvbDYgezEuMDAwIDEuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCisvY29sNyB7MS4wMDAgMS4wMDAgMS4wMDAgc3JnYn0gYmluZCBkZWYKKy9jb2w4IHswLjAwMCAwLjAwMCAwLjU2MCBzcmdifSBiaW5kIGRlZgorL2NvbDkgezAuMDAwIDAuMDAwIDAuNjkwIHNyZ2J9IGJpbmQgZGVmCisvY29sMTAgezAuMDAwIDAuMDAwIDAuODIwIHNyZ2J9IGJpbmQgZGVmCisvY29sMTEgezAuNTMwIDAuODEwIDEuMDAwIHNyZ2J9IGJpbmQgZGVmCisvY29sMTIgezAuMDAwIDAuNTYwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCisvY29sMTMgezAuMDAwIDAuNjkwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCisvY29sMTQgezAuMDAwIDAuODIwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCisvY29sMTUgezAuMDAwIDAuNTYwIDAuNTYwIHNyZ2J9IGJpbmQgZGVmCisvY29sMTYgezAuMDAwIDAuNjkwIDAuNjkwIHNyZ2J9IGJpbmQgZGVmCisvY29sMTcgezAuMDAwIDAuODIwIDAuODIwIHNyZ2J9IGJpbmQgZGVmCisvY29sMTggezAuNTYwIDAuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCisvY29sMTkgezAuNjkwIDAuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCisvY29sMjAgezAuODIwIDAuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCisvY29sMjEgezAuNTYwIDAuMDAwIDAuNTYwIHNyZ2J9IGJpbmQgZGVmCisvY29sMjIgezAuNjkwIDAuMDAwIDAuNjkwIHNyZ2J9IGJpbmQgZGVmCisvY29sMjMgezAuODIwIDAuMDAwIDAuODIwIHNyZ2J9IGJpbmQgZGVmCisvY29sMjQgezAuNTAwIDAuMTkwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCisvY29sMjUgezAuNjMwIDAuMjUwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCisvY29sMjYgezAuNzUwIDAuMzgwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCisvY29sMjcgezEuMDAwIDAuNTAwIDAuNTAwIHNyZ2J9IGJpbmQgZGVmCisvY29sMjggezEuMDAwIDAuNjMwIDAuNjMwIHNyZ2J9IGJpbmQgZGVmCisvY29sMjkgezEuMDAwIDAuNzUwIDAuNzUwIHNyZ2J9IGJpbmQgZGVmCisvY29sMzAgezEuMDAwIDAuODgwIDAuODgwIHNyZ2J9IGJpbmQgZGVmCisvY29sMzEgezEuMDAwIDAuODQwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCisvY29sMzIgezAuNTU1IDAuNTU1IDAuNTU1IHNyZ2J9IGJpbmQgZGVmCisvY29sMzMgezAuMjU0IDAuMjcwIDAuMjU0IHNyZ2J9IGJpbmQgZGVmCisvY29sMzQgezAuNzUwIDAuNzUwIDAuNzUwIHNyZ2J9IGJpbmQgZGVmCisvY29sMzUgezAuNTAwIDAuNTAwIDAuNTAwIHNyZ2J9IGJpbmQgZGVmCisvY29sMzYgezAuMzg3IDAuMzg3IDAuMzg3IHNyZ2J9IGJpbmQgZGVmCisvY29sMzcgezAuODAxIDAuODAxIDAuODAxIHNyZ2J9IGJpbmQgZGVmCisvY29sMzggezAuNDIyIDAuNDIyIDAuNDIyIHNyZ2J9IGJpbmQgZGVmCisvY29sMzkgezAuNzczIDAuNzE1IDAuNTkwIHNyZ2J9IGJpbmQgZGVmCisvY29sNDAgezAuOTM0IDAuOTY5IDAuOTk2IHNyZ2J9IGJpbmQgZGVmCisvY29sNDEgezAuODU5IDAuNzkzIDAuNjQ4IHNyZ2J9IGJpbmQgZGVmCisvY29sNDIgezAuMjUwIDAuMjUwIDAuMjUwIHNyZ2J9IGJpbmQgZGVmCisvY29sNDMgezAuODc1IDAuODc1IDAuODc1IHNyZ2J9IGJpbmQgZGVmCisvY29sNDQgezAuNTU1IDAuNTU5IDAuNTU1IHNyZ2J9IGJpbmQgZGVmCisvY29sNDUgezAuNjY0IDAuNjY0IDAuNjY0IHNyZ2J9IGJpbmQgZGVmCisvY29sNDYgezAuMzMyIDAuMzMyIDAuMzMyIHNyZ2J9IGJpbmQgZGVmCisvY29sNDcgezAuODQwIDAuODQwIDAuODQwIHNyZ2J9IGJpbmQgZGVmCisvY29sNDggezAuNjgwIDAuNjgwIDAuNjgwIHNyZ2J9IGJpbmQgZGVmCisvY29sNDkgezAuNzQyIDAuNzQyIDAuNzQyIHNyZ2J9IGJpbmQgZGVmCisvY29sNTAgezAuMzE2IDAuMzE2IDAuMzE2IHNyZ2J9IGJpbmQgZGVmCisvY29sNTEgezAuOTAyIDAuODg3IDAuOTAyIHNyZ2J9IGJpbmQgZGVmCisvY29sNTIgezAuMDAwIDAuMDAwIDAuMjg1IHNyZ2J9IGJpbmQgZGVmCisvY29sNTMgezAuNDczIDAuNDczIDAuNDczIHNyZ2J9IGJpbmQgZGVmCisvY29sNTQgezAuMTg4IDAuMjAzIDAuMTg4IHNyZ2J9IGJpbmQgZGVmCisvY29sNTUgezAuMjU0IDAuMjU0IDAuMjU0IHNyZ2J9IGJpbmQgZGVmCisvY29sNTYgezAuNzc3IDAuNzExIDAuNTg2IHNyZ2J9IGJpbmQgZGVmCisvY29sNTcgezAuODYzIDAuNjEzIDAuNTc0IHNyZ2J9IGJpbmQgZGVmCisvY29sNTggezAuOTQxIDAuOTIyIDAuODc1IHNyZ2J9IGJpbmQgZGVmCisvY29sNTkgezAuNzYyIDAuNzYyIDAuNzYyIHNyZ2J9IGJpbmQgZGVmCisvY29sNjAgezAuODgzIDAuNzgxIDAuNjU2IHNyZ2J9IGJpbmQgZGVmCisvY29sNjEgezAuODc5IDAuODc5IDAuODc5IHNyZ2J9IGJpbmQgZGVmCisvY29sNjIgezAuODIwIDAuODIwIDAuODIwIHNyZ2J9IGJpbmQgZGVmCisvY29sNjMgezAuOTI2IDAuOTI2IDAuOTI2IHNyZ2J9IGJpbmQgZGVmCisvY29sNjQgezAuODUyIDAuNDc3IDAuMTAyIHNyZ2J9IGJpbmQgZGVmCisvY29sNjUgezAuOTQxIDAuODkxIDAuMTAyIHNyZ2J9IGJpbmQgZGVmCisvY29sNjYgezAuNTMxIDAuNDg4IDAuNzU4IHNyZ2J9IGJpbmQgZGVmCisvY29sNjcgezAuODM2IDAuODM2IDAuODM2IHNyZ2J9IGJpbmQgZGVmCisvY29sNjggezAuNTQ3IDAuNTQ3IDAuNjQ1IHNyZ2J9IGJpbmQgZGVmCisvY29sNjkgezAuMjg5IDAuMjg5IDAuMjg5IHNyZ2J9IGJpbmQgZGVmCisvY29sNzAgezAuNTQ3IDAuNDE4IDAuNDE4IHNyZ2J9IGJpbmQgZGVmCisvY29sNzEgezAuMzUyIDAuMzUyIDAuMzUyIHNyZ2J9IGJpbmQgZGVmCisvY29sNzIgezAuNzE1IDAuNjA1IDAuNDQ5IHNyZ2J9IGJpbmQgZGVmCisvY29sNzMgezAuMjU0IDAuNTc0IDAuOTk2IHNyZ2J9IGJpbmQgZGVmCisvY29sNzQgezAuNzQ2IDAuNDM4IDAuMjMwIHNyZ2J9IGJpbmQgZGVmCisvY29sNzUgezAuODU1IDAuNDY1IDAuMDAwIHNyZ2J9IGJpbmQgZGVmCisvY29sNzYgezAuODUyIDAuNzE5IDAuMDAwIHNyZ2J9IGJpbmQgZGVmCisvY29sNzcgezAuMDAwIDAuMzkxIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCisvY29sNzggezAuMzUyIDAuNDE4IDAuMjMwIHNyZ2J9IGJpbmQgZGVmCisvY29sNzkgezAuODI0IDAuODI0IDAuODI0IHNyZ2J9IGJpbmQgZGVmCisvY29sODAgezAuNTU1IDAuNTU1IDAuNjQxIHNyZ2J9IGJpbmQgZGVmCisvY29sODEgezAuOTQ5IDAuNzIzIDAuMzYzIHNyZ2J9IGJpbmQgZGVmCisvY29sODIgezAuNTM1IDAuNTk4IDAuNDE4IHNyZ2J9IGJpbmQgZGVmCisvY29sODMgezAuMzkxIDAuMzkxIDAuMzkxIHNyZ2J9IGJpbmQgZGVmCisvY29sODQgezAuNzE1IDAuODk4IDAuOTk2IHNyZ2J9IGJpbmQgZGVmCisvY29sODUgezAuNTIzIDAuNzUwIDAuOTIyIHNyZ2J9IGJpbmQgZGVmCisvY29sODYgezAuNzM4IDAuNzM4IDAuNzM4IHNyZ2J9IGJpbmQgZGVmCisvY29sODcgezAuODI0IDAuNTgyIDAuMzIwIHNyZ2J9IGJpbmQgZGVmCisvY29sODggezAuNTk0IDAuODIwIDAuOTkyIHNyZ2J9IGJpbmQgZGVmCisvY29sODkgezAuNTQ3IDAuNjA5IDAuNDE4IHNyZ2J9IGJpbmQgZGVmCisvY29sOTAgezAuOTY1IDAuNDE4IDAuMDAwIHNyZ2J9IGJpbmQgZGVmCisvY29sOTEgezAuMzUyIDAuNDE4IDAuMjIzIHNyZ2J9IGJpbmQgZGVmCisvY29sOTIgezAuNTQ3IDAuNjA5IDAuNDE4IHNyZ2J9IGJpbmQgZGVmCisvY29sOTMgezAuNTQ3IDAuNjA5IDAuNDgwIHNyZ2J9IGJpbmQgZGVmCisvY29sOTQgezAuMDk0IDAuMjg5IDAuMDk0IHNyZ2J9IGJpbmQgZGVmCisvY29sOTUgezAuNjc2IDAuNjc2IDAuNjc2IHNyZ2J9IGJpbmQgZGVmCisvY29sOTYgezAuOTY1IDAuNzM4IDAuMzUyIHNyZ2J9IGJpbmQgZGVmCisvY29sOTcgezAuMzg3IDAuNDE4IDAuNjA5IHNyZ2J9IGJpbmQgZGVmCisvY29sOTggezAuOTY1IDAuOTY1IDAuOTY1IHNyZ2J9IGJpbmQgZGVmCisvY29sOTkgezAuODY3IDAuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCisvY29sMTAwIHswLjY3NiAwLjY3NiAwLjY3NiBzcmdifSBiaW5kIGRlZgorL2NvbDEwMSB7MC45NjUgMC43MzggMC4zNTIgc3JnYn0gYmluZCBkZWYKKy9jb2wxMDIgezAuNjc2IDAuNjc2IDAuNjc2IHNyZ2J9IGJpbmQgZGVmCisvY29sMTAzIHswLjk2NSAwLjczOCAwLjM1MiBzcmdifSBiaW5kIGRlZgorL2NvbDEwNCB7MC4zODcgMC40MTggMC42MDkgc3JnYn0gYmluZCBkZWYKKy9jb2wxMDUgezAuMzIwIDAuNDE4IDAuMTYwIHNyZ2J9IGJpbmQgZGVmCisvY29sMTA2IHswLjU3OCAwLjU3OCAwLjU3OCBzcmdifSBiaW5kIGRlZgorL2NvbDEwNyB7MC4wMDAgMC4zODcgMC4wMDAgc3JnYn0gYmluZCBkZWYKKy9jb2wxMDggezAuMDAwIDAuMzg3IDAuMjg5IHNyZ2J9IGJpbmQgZGVmCisvY29sMTA5IHswLjQ4MCAwLjUxNiAwLjI4OSBzcmdifSBiaW5kIGRlZgorL2NvbDExMCB7MC45MDIgMC43MzggMC40ODAgc3JnYn0gYmluZCBkZWYKKy9jb2wxMTEgezAuNjQ1IDAuNzA3IDAuNzczIHNyZ2J9IGJpbmQgZGVmCisvY29sMTEyIHswLjQxOCAwLjQxOCAwLjU3OCBzcmdifSBiaW5kIGRlZgorL2NvbDExMyB7MC41MTYgMC40MTggMC40MTggc3JnYn0gYmluZCBkZWYKKy9jb2wxMTQgezAuMzIwIDAuNjA5IDAuMjg5IHNyZ2J9IGJpbmQgZGVmCisvY29sMTE1IHswLjgzNiAwLjkwMiAwLjkwMiBzcmdifSBiaW5kIGRlZgorL2NvbDExNiB7MC4zMjAgMC4zODcgMC4zODcgc3JnYn0gYmluZCBkZWYKKy9jb2wxMTcgezAuMDk0IDAuNDE4IDAuMjg5IHNyZ2J9IGJpbmQgZGVmCisvY29sMTE4IHswLjYwOSAwLjY0NSAwLjcwNyBzcmdifSBiaW5kIGRlZgorL2NvbDExOSB7MC45OTYgMC41NzggMC4wMDAgc3JnYn0gYmluZCBkZWYKKy9jb2wxMjAgezAuOTk2IDAuNTc4IDAuMDAwIHNyZ2J9IGJpbmQgZGVmCisvY29sMTIxIHswLjAwMCAwLjM4NyAwLjI4OSBzcmdifSBiaW5kIGRlZgorL2NvbDEyMiB7MC40ODAgMC41MTYgMC4yODkgc3JnYn0gYmluZCBkZWYKKy9jb2wxMjMgezAuMzg3IDAuNDQ5IDAuNDgwIHNyZ2J9IGJpbmQgZGVmCisvY29sMTI0IHswLjkwMiAwLjczOCAwLjQ4MCBzcmdifSBiaW5kIGRlZgorL2NvbDEyNSB7MC44NjcgMC44NjcgMC44Njcgc3JnYn0gYmluZCBkZWYKKy9jb2wxMjYgezAuOTQ5IDAuOTMwIDAuODI0IHNyZ2J9IGJpbmQgZGVmCisvY29sMTI3IHswLjk1NyAwLjY4MCAwLjM2MyBzcmdifSBiaW5kIGRlZgorL2NvbDEyOCB7MC41ODIgMC44MDUgMC41OTggc3JnYn0gYmluZCBkZWYKKy9jb2wxMjkgezAuNzA3IDAuMDgyIDAuNDg4IHNyZ2J9IGJpbmQgZGVmCisvY29sMTMwIHswLjkzMCAwLjkzMCAwLjkzMCBzcmdifSBiaW5kIGRlZgorL2NvbDEzMSB7MC41MTYgMC41MTYgMC41MTYgc3JnYn0gYmluZCBkZWYKKy9jb2wxMzIgezAuNDgwIDAuNDgwIDAuNDgwIHNyZ2J9IGJpbmQgZGVmCisvY29sMTMzIHswLjAwMCAwLjM1MiAwLjAwMCBzcmdifSBiaW5kIGRlZgorL2NvbDEzNCB7MC45MDIgMC40NDkgMC40NDkgc3JnYn0gYmluZCBkZWYKKy9jb2wxMzUgezAuOTk2IDAuNzkzIDAuMTkxIHNyZ2J9IGJpbmQgZGVmCisvY29sMTM2IHswLjE2MCAwLjQ3MyAwLjI4OSBzcmdifSBiaW5kIGRlZgorL2NvbDEzNyB7MC44NjcgMC4xNTYgMC4xMjkgc3JnYn0gYmluZCBkZWYKKy9jb2wxMzggezAuMTI5IDAuMzQ4IDAuNzczIHNyZ2J9IGJpbmQgZGVmCisvY29sMTM5IHswLjk2OSAwLjk2OSAwLjk2OSBzcmdifSBiaW5kIGRlZgorL2NvbDE0MCB7MC44OTggMC44OTggMC44OTggc3JnYn0gYmluZCBkZWYKKy9jb2wxNDEgezAuMTI5IDAuNTE2IDAuMzUyIHNyZ2J9IGJpbmQgZGVmCisvY29sMTQyIHswLjc4NSAwLjc4NSAwLjc4NSBzcmdifSBiaW5kIGRlZgorL2NvbDE0MyB7MC44NzEgMC44NDQgMC44NzEgc3JnYn0gYmluZCBkZWYKKy9jb2wxNDQgezAuOTY1IDAuOTQ5IDAuOTY1IHNyZ2J9IGJpbmQgZGVmCisKK2VuZAorc2F2ZQorbmV3cGF0aCAwIDMwMCBtb3ZldG8gMCAwIGxpbmV0byA0ODggMCBsaW5ldG8gNDg4IDMwMCBsaW5ldG8gY2xvc2VwYXRoIGNsaXAgbmV3cGF0aAorLTMyLjYgMzQ4LjkgdHJhbnNsYXRlCisxIC0xIHNjYWxlCisKKy9jcCB7Y2xvc2VwYXRofSBiaW5kIGRlZgorL2VmIHtlb2ZpbGx9IGJpbmQgZGVmCisvZ3Ige2dyZXN0b3JlfSBiaW5kIGRlZgorL2dzIHtnc2F2ZX0gYmluZCBkZWYKKy9zYSB7c2F2ZX0gYmluZCBkZWYKKy9ycyB7cmVzdG9yZX0gYmluZCBkZWYKKy9sIHtsaW5ldG99IGJpbmQgZGVmCisvbSB7bW92ZXRvfSBiaW5kIGRlZgorL3JtIHtybW92ZXRvfSBiaW5kIGRlZgorL24ge25ld3BhdGh9IGJpbmQgZGVmCisvcyB7c3Ryb2tlfSBiaW5kIGRlZgorL3NoIHtzaG93fSBiaW5kIGRlZgorL3NsYyB7c2V0bGluZWNhcH0gYmluZCBkZWYKKy9zbGoge3NldGxpbmVqb2lufSBiaW5kIGRlZgorL3NsdyB7c2V0bGluZXdpZHRofSBiaW5kIGRlZgorL3NyZ2Ige3NldHJnYmNvbG9yfSBiaW5kIGRlZgorL3JvdCB7cm90YXRlfSBiaW5kIGRlZgorL3NjIHtzY2FsZX0gYmluZCBkZWYKKy9zZCB7c2V0ZGFzaH0gYmluZCBkZWYKKy9mZiB7ZmluZGZvbnR9IGJpbmQgZGVmCisvc2Yge3NldGZvbnR9IGJpbmQgZGVmCisvc2NmIHtzY2FsZWZvbnR9IGJpbmQgZGVmCisvc3cge3N0cmluZ3dpZHRofSBiaW5kIGRlZgorL3RyIHt0cmFuc2xhdGV9IGJpbmQgZGVmCisvdG50IHtkdXAgZHVwIGN1cnJlbnRyZ2Jjb2xvcgorICA0IC0yIHJvbGwgZHVwIDEgZXhjaCBzdWIgMyAtMSByb2xsIG11bCBhZGQKKyAgNCAtMiByb2xsIGR1cCAxIGV4Y2ggc3ViIDMgLTEgcm9sbCBtdWwgYWRkCisgIDQgLTIgcm9sbCBkdXAgMSBleGNoIHN1YiAzIC0xIHJvbGwgbXVsIGFkZCBzcmdifQorICBiaW5kIGRlZgorL3NoZCB7ZHVwIGR1cCBjdXJyZW50cmdiY29sb3IgNCAtMiByb2xsIG11bCA0IC0yIHJvbGwgbXVsCisgIDQgLTIgcm9sbCBtdWwgc3JnYn0gYmluZCBkZWYKKy9yZWVuY2RpY3QgMTIgZGljdCBkZWYgL1JlRW5jb2RlIHsgcmVlbmNkaWN0IGJlZ2luCisvbmV3Y29kZXNhbmRuYW1lcyBleGNoIGRlZiAvbmV3Zm9udG5hbWUgZXhjaCBkZWYgL2Jhc2Vmb250bmFtZSBleGNoIGRlZgorL2Jhc2Vmb250ZGljdCBiYXNlZm9udG5hbWUgZmluZGZvbnQgZGVmIC9uZXdmb250IGJhc2Vmb250ZGljdCBtYXhsZW5ndGggZGljdCBkZWYKK2Jhc2Vmb250ZGljdCB7IGV4Y2ggZHVwIC9GSUQgbmUgeyBkdXAgL0VuY29kaW5nIGVxCit7IGV4Y2ggZHVwIGxlbmd0aCBhcnJheSBjb3B5IG5ld2ZvbnQgMyAxIHJvbGwgcHV0IH0KK3sgZXhjaCBuZXdmb250IDMgMSByb2xsIHB1dCB9IGlmZWxzZSB9IHsgcG9wIHBvcCB9IGlmZWxzZSB9IGZvcmFsbAorbmV3Zm9udCAvRm9udE5hbWUgbmV3Zm9udG5hbWUgcHV0IG5ld2NvZGVzYW5kbmFtZXMgYWxvYWQgcG9wCisxMjggMSAyNTUgeyBuZXdmb250IC9FbmNvZGluZyBnZXQgZXhjaCAvLm5vdGRlZiBwdXQgfSBmb3IKK25ld2NvZGVzYW5kbmFtZXMgbGVuZ3RoIDIgaWRpdiB7IG5ld2ZvbnQgL0VuY29kaW5nIGdldCAzIDEgcm9sbCBwdXQgfSByZXBlYXQKK25ld2ZvbnRuYW1lIG5ld2ZvbnQgZGVmaW5lZm9udCBwb3AgZW5kIH0gZGVmCisvaXNvdmVjIFsKKzgjMDU1IC9taW51cyA4IzIwMCAvZ3JhdmUgOCMyMDEgL2FjdXRlIDgjMjAyIC9jaXJjdW1mbGV4IDgjMjAzIC90aWxkZQorOCMyMDQgL21hY3JvbiA4IzIwNSAvYnJldmUgOCMyMDYgL2RvdGFjY2VudCA4IzIwNyAvZGllcmVzaXMKKzgjMjEwIC9yaW5nIDgjMjExIC9jZWRpbGxhIDgjMjEyIC9odW5nYXJ1bWxhdXQgOCMyMTMgL29nb25layA4IzIxNCAvY2Fyb24KKzgjMjIwIC9kb3RsZXNzaSA4IzIzMCAvb2UgOCMyMzEgL09FCis4IzI0MCAvc3BhY2UgOCMyNDEgL2V4Y2xhbWRvd24gOCMyNDIgL2NlbnQgOCMyNDMgL3N0ZXJsaW5nCis4IzI0NCAvY3VycmVuY3kgOCMyNDUgL3llbiA4IzI0NiAvYnJva2VuYmFyIDgjMjQ3IC9zZWN0aW9uIDgjMjUwIC9kaWVyZXNpcworOCMyNTEgL2NvcHlyaWdodCA4IzI1MiAvb3JkZmVtaW5pbmUgOCMyNTMgL2d1aWxsZW1vdGxlZnQgOCMyNTQgL2xvZ2ljYWxub3QKKzgjMjU1IC9oeXBoZW4gOCMyNTYgL3JlZ2lzdGVyZWQgOCMyNTcgL21hY3JvbiA4IzI2MCAvZGVncmVlIDgjMjYxIC9wbHVzbWludXMKKzgjMjYyIC90d29zdXBlcmlvciA4IzI2MyAvdGhyZWVzdXBlcmlvciA4IzI2NCAvYWN1dGUgOCMyNjUgL211IDgjMjY2IC9wYXJhZ3JhcGgKKzgjMjY3IC9wZXJpb2RjZW50ZXJlZCA4IzI3MCAvY2VkaWxsYSA4IzI3MSAvb25lc3VwZXJpb3IgOCMyNzIgL29yZG1hc2N1bGluZQorOCMyNzMgL2d1aWxsZW1vdHJpZ2h0IDgjMjc0IC9vbmVxdWFydGVyIDgjMjc1IC9vbmVoYWxmCis4IzI3NiAvdGhyZWVxdWFydGVycyA4IzI3NyAvcXVlc3Rpb25kb3duIDgjMzAwIC9BZ3JhdmUgOCMzMDEgL0FhY3V0ZQorOCMzMDIgL0FjaXJjdW1mbGV4IDgjMzAzIC9BdGlsZGUgOCMzMDQgL0FkaWVyZXNpcyA4IzMwNSAvQXJpbmcKKzgjMzA2IC9BRSA4IzMwNyAvQ2NlZGlsbGEgOCMzMTAgL0VncmF2ZSA4IzMxMSAvRWFjdXRlCis4IzMxMiAvRWNpcmN1bWZsZXggOCMzMTMgL0VkaWVyZXNpcyA4IzMxNCAvSWdyYXZlIDgjMzE1IC9JYWN1dGUKKzgjMzE2IC9JY2lyY3VtZmxleCA4IzMxNyAvSWRpZXJlc2lzIDgjMzIwIC9FdGggOCMzMjEgL050aWxkZSA4IzMyMiAvT2dyYXZlCis4IzMyMyAvT2FjdXRlIDgjMzI0IC9PY2lyY3VtZmxleCA4IzMyNSAvT3RpbGRlIDgjMzI2IC9PZGllcmVzaXMgOCMzMjcgL211bHRpcGx5Cis4IzMzMCAvT3NsYXNoIDgjMzMxIC9VZ3JhdmUgOCMzMzIgL1VhY3V0ZSA4IzMzMyAvVWNpcmN1bWZsZXgKKzgjMzM0IC9VZGllcmVzaXMgOCMzMzUgL1lhY3V0ZSA4IzMzNiAvVGhvcm4gOCMzMzcgL2dlcm1hbmRibHMgOCMzNDAgL2FncmF2ZQorOCMzNDEgL2FhY3V0ZSA4IzM0MiAvYWNpcmN1bWZsZXggOCMzNDMgL2F0aWxkZSA4IzM0NCAvYWRpZXJlc2lzIDgjMzQ1IC9hcmluZworOCMzNDYgL2FlIDgjMzQ3IC9jY2VkaWxsYSA4IzM1MCAvZWdyYXZlIDgjMzUxIC9lYWN1dGUKKzgjMzUyIC9lY2lyY3VtZmxleCA4IzM1MyAvZWRpZXJlc2lzIDgjMzU0IC9pZ3JhdmUgOCMzNTUgL2lhY3V0ZQorOCMzNTYgL2ljaXJjdW1mbGV4IDgjMzU3IC9pZGllcmVzaXMgOCMzNjAgL2V0aCA4IzM2MSAvbnRpbGRlIDgjMzYyIC9vZ3JhdmUKKzgjMzYzIC9vYWN1dGUgOCMzNjQgL29jaXJjdW1mbGV4IDgjMzY1IC9vdGlsZGUgOCMzNjYgL29kaWVyZXNpcyA4IzM2NyAvZGl2aWRlCis4IzM3MCAvb3NsYXNoIDgjMzcxIC91Z3JhdmUgOCMzNzIgL3VhY3V0ZSA4IzM3MyAvdWNpcmN1bWZsZXgKKzgjMzc0IC91ZGllcmVzaXMgOCMzNzUgL3lhY3V0ZSA4IzM3NiAvdGhvcm4gOCMzNzcgL3lkaWVyZXNpc10gZGVmCisvSGVsdmV0aWNhIC9IZWx2ZXRpY2EtaXNvIGlzb3ZlYyBSZUVuY29kZQorLyRGMnBzQmVnaW4geyRGMnBzRGljdCBiZWdpbiAvJEYycHNFbnRlcmVkU3RhdGUgc2F2ZSBkZWZ9IGRlZgorLyRGMnBzRW5kIHskRjJwc0VudGVyZWRTdGF0ZSByZXN0b3JlIGVuZH0gZGVmCisKKyRGMnBzQmVnaW4KKzEwIHNldG1pdGVybGltaXQKKzAgc2xqIDAgc2xjCisgMC4wNjI5OSAwLjA2Mjk5IHNjCislCislIEZpZyBvYmplY3RzIGZvbGxvdworJQorJSAKKyUgaGVyZSBzdGFydHMgZmlndXJlIHdpdGggZGVwdGggNTAKKy9IZWx2ZXRpY2EtaXNvIGZmIDMwMC4wMCBzY2Ygc2YKKzkwMCAxNDQwIG0KK2dzIDEgLTEgc2MgKFB1YmxpYy1LZXkpIGNvbDAgc2ggZ3IKKy9IZWx2ZXRpY2EtaXNvIGZmIDMwMC4wMCBzY2Ygc2YKKzkwMCAxODE1IG0KK2dzIDEgLTEgc2MgKEVuY3J5cHRpb24pIGNvbDAgc2ggZ3IKKyUgUG9seWxpbmUKKzE1LjAwMCBzbHcKK24gNjQ1IDgxMCBtIDU0MCA4MTAgNTQwIDIwNTUgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0CisgIDU0MCAyMTYwIDI2ODUgMjE2MCAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQKKyAgMjc5MCAyMTYwIDI3OTAgOTE1IDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdAorICAyNzkwIDgxMCA2NDUgODEwIDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdAorIGNwIGdzIGNvbDAgcyBnciAKKy9IZWx2ZXRpY2EtaXNvIGZmIDMwMC4wMCBzY2Ygc2YKKzYzMCAzNDIwIG0KK2dzIDEgLTEgc2MgKE11bHRpLVByZWNpc2lvbi0pIGNvbDAgc2ggZ3IKKy9IZWx2ZXRpY2EtaXNvIGZmIDMwMC4wMCBzY2Ygc2YKKzkwMCAzNzk1IG0KK2dzIDEgLTEgc2MgKEludGVnZXJzKSBjb2wwIHNoIGdyCislIFBvbHlsaW5lCituIDY0NSAyNzkwIG0gNTQwIDI3OTAgNTQwIDQwMzUgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0CisgIDU0MCA0MTQwIDI2ODUgNDE0MCAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQKKyAgMjc5MCA0MTQwIDI3OTAgMjg5NSAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQKKyAgMjc5MCAyNzkwIDY0NSAyNzkwIDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdAorIGNwIGdzIGNvbDAgcyBnciAKKy9IZWx2ZXRpY2EtaXNvIGZmIDMwMC4wMCBzY2Ygc2YKKzM0MjAgMzQyMCBtCitncyAxIC0xIHNjIChQcmltZS1OdW1iZXIpIGNvbDAgc2ggZ3IKKy9IZWx2ZXRpY2EtaXNvIGZmIDMwMC4wMCBzY2Ygc2YKKzM0MjAgMzc5NSBtCitncyAxIC0xIHNjIChHZW5lcmF0b3IpIGNvbDAgc2ggZ3IKKyUgUG9seWxpbmUKK24gMzM0NSAyNzkwIG0gMzI0MCAyNzkwIDMyNDAgNDAzNSAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQKKyAgMzI0MCA0MTQwIDUzODUgNDE0MCAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQKKyAgNTQ5MCA0MTQwIDU0OTAgMjg5NSAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQKKyAgNTQ5MCAyNzkwIDMzNDUgMjc5MCAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQKKyBjcCBncyBjb2wwIHMgZ3IgCisvSGVsdmV0aWNhLWlzbyBmZiAzMDAuMDAgc2NmIHNmCis2NDIwIDM0MzUgbQorZ3MgMSAtMSBzYyAoUmFuZG9tKSBjb2wwIHNoIGdyCisvSGVsdmV0aWNhLWlzbyBmZiAzMDAuMDAgc2NmIHNmCis2NDIwIDM4MTAgbQorZ3MgMSAtMSBzYyAoTnVtYmVycykgY29sMCBzaCBncgorJSBQb2x5bGluZQorbiA2MDc1IDI4MDUgbSA1OTcwIDI4MDUgNTk3MCA0MDUwIDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdAorICA1OTcwIDQxNTUgODExNSA0MTU1IDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdAorICA4MjIwIDQxNTUgODIyMCAyOTEwIDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdAorICA4MjIwIDI4MDUgNjA3NSAyODA1IDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdAorIGNwIGdzIGNvbDAgcyBnciAKKy9IZWx2ZXRpY2EtaXNvIGZmIDMwMC4wMCBzY2Ygc2YKKzM2MDAgMTQ0MCBtCitncyAxIC0xIHNjIChTeW1tZXRyaWMpIGNvbDAgc2ggZ3IKKy9IZWx2ZXRpY2EtaXNvIGZmIDMwMC4wMCBzY2Ygc2YKKzM2MDAgMTgxNSBtCitncyAxIC0xIHNjIChFbmNyeXB0aW9uKSBjb2wwIHNoIGdyCislIFBvbHlsaW5lCituIDMzNDUgODEwIG0gMzI0MCA4MTAgMzI0MCAyMDU1IDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdAorICAzMjQwIDIxNjAgNTM4NSAyMTYwIDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdAorICA1NDkwIDIxNjAgNTQ5MCA5MTUgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0CisgIDU0OTAgODEwIDMzNDUgODEwIDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdAorIGNwIGdzIGNvbDAgcyBnciAKKy9IZWx2ZXRpY2EtaXNvIGZmIDMwMC4wMCBzY2Ygc2YKKzY0MzUgMTQ0MCBtCitncyAxIC0xIHNjIChIYXNoaW5nKSBjb2wwIHNoIGdyCisvSGVsdmV0aWNhLWlzbyBmZiAzMDAuMDAgc2NmIHNmCis2NDM1IDE4MTUgbQorZ3MgMSAtMSBzYyAoTUFDaW5nKSBjb2wwIHNoIGdyCislIFBvbHlsaW5lCituIDYwOTAgODEwIG0gNTk4NSA4MTAgNTk4NSAyMDU1IDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdAorICA1OTg1IDIxNjAgODEzMCAyMTYwIDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdAorICA4MjM1IDIxNjAgODIzNSA5MTUgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0CisgIDgyMzUgODEwIDYwOTAgODEwIDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdAorIGNwIGdzIGNvbDAgcyBnciAKKyUgUG9seWxpbmUKK24gMzUxMyA0NTYzIG0gMzQzOCA0NTYzIDM0MzggNTQzOCA3NSBhcmN0byA0IHtwb3B9IHJlcGVhdAorICAzNDM4IDU1MTMgNDk0NyA1NTEzIDc1IGFyY3RvIDQge3BvcH0gcmVwZWF0CisgIDUwMjIgNTUxMyA1MDIyIDQ2MzggNzUgYXJjdG8gNCB7cG9wfSByZXBlYXQKKyAgNTAyMiA0NTYzIDM1MTMgNDU2MyA3NSBhcmN0byA0IHtwb3B9IHJlcGVhdAorIGNwIGdzIGNvbDAgcyBnciAKKy9IZWx2ZXRpY2EtaXNvIGZmIDIxMC4wMCBzY2Ygc2YKKzM4MjUgNTEzMCBtCitncyAxIC0xIHNjIChNZW1vcnkpIGNvbDAgc2ggZ3IKKyUgUG9seWxpbmUKK24gNTU4MyA0NTYzIG0gNTUwOCA0NTYzIDU1MDggNTQzOCA3NSBhcmN0byA0IHtwb3B9IHJlcGVhdAorICA1NTA4IDU1MTMgNzAxNyA1NTEzIDc1IGFyY3RvIDQge3BvcH0gcmVwZWF0CisgIDcwOTIgNTUxMyA3MDkyIDQ2MzggNzUgYXJjdG8gNCB7cG9wfSByZXBlYXQKKyAgNzA5MiA0NTYzIDU1ODMgNDU2MyA3NSBhcmN0byA0IHtwb3B9IHJlcGVhdAorIGNwIGdzIGNvbDAgcyBnciAKKy9IZWx2ZXRpY2EtaXNvIGZmIDIxMC4wMCBzY2Ygc2YKKzU2MzUgNTEzMyBtCitncyAxIC0xIHNjIChNaXNjZWxsZWFub3VzKSBjb2wwIHNoIGdyCislIFBvbHlsaW5lCituIDE0NDMgNDU2NyBtIDEzNjggNDU2NyAxMzY4IDU0NDIgNzUgYXJjdG8gNCB7cG9wfSByZXBlYXQKKyAgMTM2OCA1NTE3IDI4NzcgNTUxNyA3NSBhcmN0byA0IHtwb3B9IHJlcGVhdAorICAyOTUyIDU1MTcgMjk1MiA0NjQyIDc1IGFyY3RvIDQge3BvcH0gcmVwZWF0CisgIDI5NTIgNDU2NyAxNDQzIDQ1NjcgNzUgYXJjdG8gNCB7cG9wfSByZXBlYXQKKyBjcCBncyBjb2wwIHMgZ3IgCisvSGVsdmV0aWNhLWlzbyBmZiAyMTAuMDAgc2NmIHNmCisxNDk1IDUxMzcgbQorZ3MgMSAtMSBzYyAoUy1leHByZXNzaW9ucykgY29sMCBzaCBncgorJSBoZXJlIGVuZHMgZmlndXJlOworJEYycHNFbmQKK3JzCitzaG93cGFnZQpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L2RvYy9saWJnY3J5cHQtbW9kdWxlcy5maWcgYi9saWJnY3J5cHQtMS40LjYvZG9jL2xpYmdjcnlwdC1tb2R1bGVzLmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTNkMDUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L2RvYy9saWJnY3J5cHQtbW9kdWxlcy5maWcKQEAgLTAsMCArMSwxOTMgQEAKKyNGSUcgMy4yCitMYW5kc2NhcGUKK0NlbnRlcgorTWV0cmljCitBNCAgICAgIAorMTAwLjAwCitTaW5nbGUKKy0yCisxMjAwIDIKKzAgMzIgIzhlOGU4ZQorMCAzMyAjNDE0NTQxCiswIDM0ICNjMGMwYzAKKzAgMzUgIzgwODA4MAorMCAzNiAjNjM2MzYzCiswIDM3ICNjZGNkY2QKKzAgMzggIzZjNmM2YworMCAzOSAjYzZiNzk3CiswIDQwICNlZmY4ZmYKKzAgNDEgI2RjY2JhNgorMCA0MiAjNDA0MDQwCiswIDQzICNlMGUwZTAKKzAgNDQgIzhlOGY4ZQorMCA0NSAjYWFhYWFhCiswIDQ2ICM1NTU1NTUKKzAgNDcgI2Q3ZDdkNworMCA0OCAjYWVhZWFlCiswIDQ5ICNiZWJlYmUKKzAgNTAgIzUxNTE1MQorMCA1MSAjZTdlM2U3CiswIDUyICMwMDAwNDkKKzAgNTMgIzc5Nzk3OQorMCA1NCAjMzAzNDMwCiswIDU1ICM0MTQxNDEKKzAgNTYgI2M3YjY5NgorMCA1NyAjZGQ5ZDkzCiswIDU4ICNmMWVjZTAKKzAgNTkgI2MzYzNjMworMCA2MCAjZTJjOGE4CiswIDYxICNlMWUxZTEKKzAgNjIgI2QyZDJkMgorMCA2MyAjZWRlZGVkCiswIDY0ICNkYTdhMWEKKzAgNjUgI2YxZTQxYQorMCA2NiAjODg3ZGMyCiswIDY3ICNkNmQ2ZDYKKzAgNjggIzhjOGNhNQorMCA2OSAjNGE0YTRhCiswIDcwICM4YzZiNmIKKzAgNzEgIzVhNWE1YQorMCA3MiAjYjc5YjczCiswIDczICM0MTkzZmYKKzAgNzQgI2JmNzAzYgorMCA3NSAjZGI3NzAwCiswIDc2ICNkYWI4MDAKKzAgNzcgIzAwNjQwMAorMCA3OCAjNWE2YjNiCiswIDc5ICNkM2QzZDMKKzAgODAgIzhlOGVhNAorMCA4MSAjZjNiOTVkCiswIDgyICM4OTk5NmIKKzAgODMgIzY0NjQ2NAorMCA4NCAjYjdlNmZmCiswIDg1ICM4NmMwZWMKKzAgODYgI2JkYmRiZAorMCA4NyAjZDM5NTUyCiswIDg4ICM5OGQyZmUKKzAgODkgIzhjOWM2YgorMCA5MCAjZjc2YjAwCiswIDkxICM1YTZiMzkKKzAgOTIgIzhjOWM2YgorMCA5MyAjOGM5YzdiCiswIDk0ICMxODRhMTgKKzAgOTUgI2FkYWRhZAorMCA5NiAjZjdiZDVhCiswIDk3ICM2MzZiOWMKKzAgOTggI2Y3ZjdmNworMCA5OSAjZGUwMDAwCiswIDEwMCAjYWRhZGFkCiswIDEwMSAjZjdiZDVhCiswIDEwMiAjYWRhZGFkCiswIDEwMyAjZjdiZDVhCiswIDEwNCAjNjM2YjljCiswIDEwNSAjNTI2YjI5CiswIDEwNiAjOTQ5NDk0CiswIDEwNyAjMDA2MzAwCiswIDEwOCAjMDA2MzRhCiswIDEwOSAjN2I4NDRhCiswIDExMCAjZTdiZDdiCiswIDExMSAjYTViNWM2CiswIDExMiAjNmI2Yjk0CiswIDExMyAjODQ2YjZiCiswIDExNCAjNTI5YzRhCiswIDExNSAjZDZlN2U3CiswIDExNiAjNTI2MzYzCiswIDExNyAjMTg2YjRhCiswIDExOCAjOWNhNWI1CiswIDExOSAjZmY5NDAwCiswIDEyMCAjZmY5NDAwCiswIDEyMSAjMDA2MzRhCiswIDEyMiAjN2I4NDRhCiswIDEyMyAjNjM3MzdiCiswIDEyNCAjZTdiZDdiCiswIDEyNSAjZGVkZWRlCiswIDEyNiAjZjNlZWQzCiswIDEyNyAjZjVhZTVkCiswIDEyOCAjOTVjZTk5CiswIDEyOSAjYjUxNTdkCiswIDEzMCAjZWVlZWVlCiswIDEzMSAjODQ4NDg0CiswIDEzMiAjN2I3YjdiCiswIDEzMyAjMDA1YTAwCiswIDEzNCAjZTc3MzczCiswIDEzNSAjZmZjYjMxCiswIDEzNiAjMjk3OTRhCiswIDEzNyAjZGUyODIxCiswIDEzOCAjMjE1OWM2CiswIDEzOSAjZjhmOGY4CiswIDE0MCAjZTZlNmU2CiswIDE0MSAjMjE4NDVhCiswIDE0MiAjYzljOWM5CiswIDE0MyAjZGZkOGRmCiswIDE0NCAjZjdmM2Y3Cis2IDQ1MCA3MjAgODMyNSA1NTgwCis2IDQ1MCA3MjAgODMyNSA0Mjc1Cis2IDQ1MCA3MjAgMjg4MCAyMjUwCis2IDkwMCAxMTcwIDIzNDAgMTg5MAorNCAwIDAgNTAgLTEgMTYgMjAgMC4wMDAwIDQgMzAwIDE0MTAgOTAwIDE0NDAgUHVibGljLUtleVwwMDEKKzQgMCAwIDUwIC0xIDE2IDIwIDAuMDAwMCA0IDMwMCAxNDEwIDkwMCAxODE1IEVuY3J5cHRpb25cMDAxCistNgorMiA0IDAgMiAwIDcgNTAgLTEgLTEgMC4wMDAgMCAwIDcgMCAwIDUKKwkgMjc5MCAyMTYwIDI3OTAgODEwIDU0MCA4MTAgNTQwIDIxNjAgMjc5MCAyMTYwCistNgorNiA1MjUgMjc3NSAyODA1IDQxNTUKKzYgNjMwIDMxNTAgMjcwMCAzODcwCis2IDYzMCAzMTUwIDI3MDAgMzg3MAorNCAwIDAgNTAgLTEgMTYgMjAgMC4wMDAwIDQgMjI1IDIwNTUgNjMwIDM0MjAgTXVsdGktUHJlY2lzaW9uLVwwMDEKKzQgMCAwIDUwIC0xIDE2IDIwIDAuMDAwMCA0IDMwMCAxMDk1IDkwMCAzNzk1IEludGVnZXJzXDAwMQorLTYKKy02CisyIDQgMCAyIDAgNyA1MCAtMSAtMSAwLjAwMCAwIDAgNyAwIDAgNQorCSAyNzkwIDQxNDAgMjc5MCAyNzkwIDU0MCAyNzkwIDU0MCA0MTQwIDI3OTAgNDE0MAorLTYKKzYgMzE1MCAyNzAwIDU1ODAgNDIzMAorNiAzNDIwIDMxNTAgNTQwMCAzODcwCis0IDAgMCA1MCAtMSAxNiAyMCAwLjAwMDAgNCAyMjUgMTk2NSAzNDIwIDM0MjAgUHJpbWUtTnVtYmVyXDAwMQorNCAwIDAgNTAgLTEgMTYgMjAgMC4wMDAwIDQgMjI1IDEzNjUgMzQyMCAzNzk1IEdlbmVyYXRvclwwMDEKKy02CisyIDQgMCAyIDAgNyA1MCAtMSAtMSAwLjAwMCAwIDAgNyAwIDAgNQorCSA1NDkwIDQxNDAgNTQ5MCAyNzkwIDMyNDAgMjc5MCAzMjQwIDQxNDAgNTQ5MCA0MTQwCistNgorNiA1ODgwIDI3MTUgODMxMCA0MjQ1Cis2IDY0MjAgMzE2NSA3NjgwIDM4ODUKKzQgMCAwIDUwIC0xIDE2IDIwIDAuMDAwMCA0IDIyNSAxMTQwIDY0MjAgMzQzNSBSYW5kb21cMDAxCis0IDAgMCA1MCAtMSAxNiAyMCAwLjAwMDAgNCAyMjUgMTIzMCA2NDIwIDM4MTAgTnVtYmVyc1wwMDEKKy02CisyIDQgMCAyIDAgNyA1MCAtMSAtMSAwLjAwMCAwIDAgNyAwIDAgNQorCSA4MjIwIDQxNTUgODIyMCAyODA1IDU5NzAgMjgwNSA1OTcwIDQxNTUgODIyMCA0MTU1CistNgorNiAzMTUwIDcyMCA1NTgwIDIyNTAKKzYgMzYwMCAxMTcwIDUwNDAgMTg5MAorNCAwIDAgNTAgLTEgMTYgMjAgMC4wMDAwIDQgMzAwIDE0MjUgMzYwMCAxNDQwIFN5bW1ldHJpY1wwMDEKKzQgMCAwIDUwIC0xIDE2IDIwIDAuMDAwMCA0IDMwMCAxNDEwIDM2MDAgMTgxNSBFbmNyeXB0aW9uXDAwMQorLTYKKzIgNCAwIDIgMCA3IDUwIC0xIC0xIDAuMDAwIDAgMCA3IDAgMCA1CisJIDU0OTAgMjE2MCA1NDkwIDgxMCAzMjQwIDgxMCAzMjQwIDIxNjAgNTQ5MCAyMTYwCistNgorNiA1OTQwIDc2NSA4MjgwIDIyMDUKKzYgNjQzNSAxMjE1IDc1MzAgMTg5MAorNCAwIDAgNTAgLTEgMTYgMjAgMC4wMDAwIDQgMzAwIDEwOTUgNjQzNSAxNDQwIEhhc2hpbmdcMDAxCis0IDAgMCA1MCAtMSAxNiAyMCAwLjAwMDAgNCAzMDAgMTA2NSA2NDM1IDE4MTUgTUFDaW5nXDAwMQorLTYKKzIgNCAwIDIgMCA3IDUwIC0xIC0xIDAuMDAwIDAgMCA3IDAgMCA1CisJIDgyMzUgMjE2MCA4MjM1IDgxMCA1OTg1IDgxMCA1OTg1IDIxNjAgODIzNSAyMTYwCistNgorLTYKKzYgMTMwNSA0NTAwIDcxNTUgNTU4MAorNiAzMzc1IDQ1MDAgNTA4NSA1NTgwCisyIDQgMCAyIDAgNyA1MCAtMSAtMSAwLjAwMCAwIDAgNSAwIDAgNQorCSA1MDIyIDU1MTMgNTAyMiA0NTYzIDM0MzggNDU2MyAzNDM4IDU1MTMgNTAyMiA1NTEzCis0IDAgMCA1MCAtMSAxNiAxNCAwLjAwMDAgNCAxOTUgNzgwIDM4MjUgNTEzMCBNZW1vcnlcMDAxCistNgorNiA1NDQ1IDQ1MDAgNzE1NSA1NTc2CisyIDQgMCAyIDAgNyA1MCAtMSAtMSAwLjAwMCAwIDAgNSAwIDAgNQorCSA3MDkyIDU1MTMgNzA5MiA0NTYzIDU1MDggNDU2MyA1NTA4IDU1MTMgNzA5MiA1NTEzCis0IDAgMCA1MCAtMSAxNiAxNCAwLjAwMDAgNCAxNTAgMTM1MCA1NjM1IDUxMzMgTWlzY2VsbGVhbm91c1wwMDEKKy02Cis2IDEzMDUgNDUwNCAzMDE1IDU1ODAKKzIgNCAwIDIgMCA3IDUwIC0xIC0xIDAuMDAwIDAgMCA1IDAgMCA1CisJIDI5NTIgNTUxNyAyOTUyIDQ1NjcgMTM2OCA0NTY3IDEzNjggNTUxNyAyOTUyIDU1MTcKKzQgMCAwIDUwIC0xIDE2IDE0IDAuMDAwMCA0IDE5NSAxMzUwIDE0OTUgNTEzNyBTLWV4cHJlc3Npb25zXDAwMQorLTYKKy02CistNgpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L2RvYy9saWJnY3J5cHQtbW9kdWxlcy5wZGYgYi9saWJnY3J5cHQtMS40LjYvZG9jL2xpYmdjcnlwdC1tb2R1bGVzLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2I4N2E2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L2RvYy9saWJnY3J5cHQtbW9kdWxlcy5wZGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L2RvYy9saWJnY3J5cHQtbW9kdWxlcy5wbmcgYi9saWJnY3J5cHQtMS40LjYvZG9jL2xpYmdjcnlwdC1tb2R1bGVzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDE5NGUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L2RvYy9saWJnY3J5cHQtbW9kdWxlcy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L2RvYy9tZGF0ZS1zaCBiL2xpYmdjcnlwdC0xLjQuNi9kb2MvbWRhdGUtc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2Q5MTZjMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9kb2MvbWRhdGUtc2gKQEAgLTAsMCArMSwyMDEgQEAKKyMhL2Jpbi9zaAorIyBHZXQgbW9kaWZpY2F0aW9uIHRpbWUgb2YgYSBmaWxlIG9yIGRpcmVjdG9yeSBhbmQgcHJldHR5LXByaW50IGl0LgorCitzY3JpcHR2ZXJzaW9uPTIwMDUtMDYtMjkuMjIKKworIyBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIDIwMDMsIDIwMDQsIDIwMDUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuCisjIHdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+LCBKdW5lIDE5OTUKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIyBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisjIFRoaXMgZmlsZSBpcyBtYWludGFpbmVkIGluIEF1dG9tYWtlLCBwbGVhc2UgcmVwb3J0CisjIGJ1Z3MgdG8gPGJ1Zy1hdXRvbWFrZUBnbnUub3JnPiBvciBzZW5kIHBhdGNoZXMgdG8KKyMgPGF1dG9tYWtlLXBhdGNoZXNAZ251Lm9yZz4uCisKK2Nhc2UgJDEgaW4KKyAgJycpCisgICAgIGVjaG8gIiQwOiBObyBmaWxlLiAgVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDE+JjIKKyAgICAgZXhpdCAxOworICAgICA7OworICAtaCB8IC0taCopCisgICAgY2F0IDw8XEVPRgorVXNhZ2U6IG1kYXRlLXNoIFstLWhlbHBdIFstLXZlcnNpb25dIEZJTEUKKworUHJldHR5LXByaW50IHRoZSBtb2RpZmljYXRpb24gdGltZSBvZiBGSUxFLgorCitSZXBvcnQgYnVncyB0byA8YnVnLWF1dG9tYWtlQGdudS5vcmc+LgorRU9GCisgICAgZXhpdCAkPworICAgIDs7CisgIC12IHwgLS12KikKKyAgICBlY2hvICJtZGF0ZS1zaCAkc2NyaXB0dmVyc2lvbiIKKyAgICBleGl0ICQ/CisgICAgOzsKK2VzYWMKKworIyBQcmV2ZW50IGRhdGUgZ2l2aW5nIHJlc3BvbnNlIGluIGFub3RoZXIgbGFuZ3VhZ2UuCitMQU5HPUMKK2V4cG9ydCBMQU5HCitMQ19BTEw9QworZXhwb3J0IExDX0FMTAorTENfVElNRT1DCitleHBvcnQgTENfVElNRQorCisjIEdOVSBscyBjaGFuZ2VzIGl0cyB0aW1lIGZvcm1hdCBpbiByZXNwb25zZSB0byB0aGUgVElNRV9TVFlMRQorIyB2YXJpYWJsZS4gIFNpbmNlIHdlIGNhbm5vdCBhc3N1bWUgYHVuc2V0JyB3b3JrcywgcmV2ZXJ0IHRoaXMKKyMgdmFyaWFibGUgdG8gaXRzIGRvY3VtZW50ZWQgZGVmYXVsdC4KK2lmIHRlc3QgIiR7VElNRV9TVFlMRStzZXR9IiA9IHNldDsgdGhlbgorICBUSU1FX1NUWUxFPXBvc2l4LWxvbmctaXNvCisgIGV4cG9ydCBUSU1FX1NUWUxFCitmaQorCitzYXZlX2FyZzE9JDEKKworIyBGaW5kIG91dCBob3cgdG8gZ2V0IHRoZSBleHRlbmRlZCBscyBvdXRwdXQgb2YgYSBmaWxlIG9yIGRpcmVjdG9yeS4KK2lmIGxzIC1MIC9kZXYvbnVsbCAxPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGxzX2NvbW1hbmQ9J2xzIC1MIC1sIC1kJworZWxzZQorICBsc19jb21tYW5kPSdscyAtbCAtZCcKK2ZpCisKKyMgQSBgbHMgLWwnIGxpbmUgbG9va3MgYXMgZm9sbG93cyBvbiBPUy8yLgorIyAgZHJ3eHJ3eC0tLSAgICAgICAgMCBBdWcgMTEgIDIwMDEgZm9vCisjIFRoaXMgZGlmZmVycyBmcm9tIFVuaXgsIHdoaWNoIGFkZHMgb3duZXJzaGlwIGluZm9ybWF0aW9uLgorIyAgZHJ3eHJ3eC0tLSAgIDIgcm9vdCAgcm9vdCAgICAgIDQwOTYgQXVnIDExICAyMDAxIGZvbworIworIyBUbyBmaW5kIHRoZSBkYXRlLCB3ZSBzcGxpdCB0aGUgbGluZSBvbiBzcGFjZXMgYW5kIGl0ZXJhdGUgb24gd29yZHMKKyMgdW50aWwgd2UgZmluZCBhIG1vbnRoLiAgVGhpcyBjYW5ub3Qgd29yayB3aXRoIGZpbGVzIHdob3NlIG93bmVyIGlzIGEKKyMgdXNlciBuYW1lZCBgSmFuJywgb3IgYEZlYicsIGV0Yy4gIEhvd2V2ZXIsIGl0J3MgdW5saWtlbHkgdGhhdCBgLycKKyMgd2lsbCBiZSBvd25lZCBieSBhIHVzZXIgd2hvc2UgbmFtZSBpcyBhIG1vbnRoLiAgU28gd2UgZmlyc3QgbG9vayBhdAorIyB0aGUgZXh0ZW5kZWQgbHMgb3V0cHV0IG9mIHRoZSByb290IGRpcmVjdG9yeSB0byBkZWNpZGUgaG93IG1hbnkKKyMgd29yZHMgc2hvdWxkIGJlIHNraXBwZWQgdG8gZ2V0IHRoZSBkYXRlLgorCisjIE9uIEhQVVggL2Jpbi9zaCwgInNldCIgaW50ZXJwcmV0cyAiLXJ3LXItLXItLSIgYXMgb3B0aW9ucywgc28gdGhlICJ4IiBiZWxvdy4KK3NldCB4YGxzIC1sIC1kIC9gCisKKyMgRmluZCB3aGljaCBhcmd1bWVudCBpcyB0aGUgbW9udGguCittb250aD0KK2NvbW1hbmQ9Cit1bnRpbCB0ZXN0ICRtb250aAorZG8KKyAgc2hpZnQKKyAgIyBBZGQgYW5vdGhlciBzaGlmdCB0byB0aGUgY29tbWFuZC4KKyAgY29tbWFuZD0iJGNvbW1hbmQgc2hpZnQ7IgorICBjYXNlICQxIGluCisgICAgSmFuKSBtb250aD1KYW51YXJ5OyBudW1tb250aD0xOzsKKyAgICBGZWIpIG1vbnRoPUZlYnJ1YXJ5OyBudW1tb250aD0yOzsKKyAgICBNYXIpIG1vbnRoPU1hcmNoOyBudW1tb250aD0zOzsKKyAgICBBcHIpIG1vbnRoPUFwcmlsOyBudW1tb250aD00OzsKKyAgICBNYXkpIG1vbnRoPU1heTsgbnVtbW9udGg9NTs7CisgICAgSnVuKSBtb250aD1KdW5lOyBudW1tb250aD02OzsKKyAgICBKdWwpIG1vbnRoPUp1bHk7IG51bW1vbnRoPTc7OworICAgIEF1ZykgbW9udGg9QXVndXN0OyBudW1tb250aD04OzsKKyAgICBTZXApIG1vbnRoPVNlcHRlbWJlcjsgbnVtbW9udGg9OTs7CisgICAgT2N0KSBtb250aD1PY3RvYmVyOyBudW1tb250aD0xMDs7CisgICAgTm92KSBtb250aD1Ob3ZlbWJlcjsgbnVtbW9udGg9MTE7OworICAgIERlYykgbW9udGg9RGVjZW1iZXI7IG51bW1vbnRoPTEyOzsKKyAgZXNhYworZG9uZQorCisjIEdldCB0aGUgZXh0ZW5kZWQgbHMgb3V0cHV0IG9mIHRoZSBmaWxlIG9yIGRpcmVjdG9yeS4KK3NldCBkdW1teSB4YGV2YWwgIiRsc19jb21tYW5kIFwiXCRzYXZlX2FyZzFcIiJgCisKKyMgUmVtb3ZlIGFsbCBwcmVjZWRpbmcgYXJndW1lbnRzCitldmFsICRjb21tYW5kCisKKyMgQmVjYXVzZSBvZiB0aGUgZHVtbXkgYXJndW1lbnQgYWJvdmUsIG1vbnRoIGlzIGluICQyLgorIworIyBPbiBhIFBPU0lYIHN5c3RlbSwgd2Ugc2hvdWxkIGhhdmUKKyMKKyMgJCMgPSA1CisjICQxID0gZmlsZSBzaXplCisjICQyID0gbW9udGgKKyMgJDMgPSBkYXkKKyMgJDQgPSB5ZWFyIG9yIHRpbWUKKyMgJDUgPSBmaWxlbmFtZQorIworIyBPbiBEYXJ3aW4gNy43LjAgYW5kIDcuNi4wLCB3ZSBoYXZlCisjCisjICQjID0gNAorIyAkMSA9IGRheQorIyAkMiA9IG1vbnRoCisjICQzID0geWVhciBvciB0aW1lCisjICQ0ID0gZmlsZW5hbWUKKworIyBHZXQgdGhlIG1vbnRoLgorY2FzZSAkMiBpbgorICBKYW4pIG1vbnRoPUphbnVhcnk7IG51bW1vbnRoPTE7OworICBGZWIpIG1vbnRoPUZlYnJ1YXJ5OyBudW1tb250aD0yOzsKKyAgTWFyKSBtb250aD1NYXJjaDsgbnVtbW9udGg9Mzs7CisgIEFwcikgbW9udGg9QXByaWw7IG51bW1vbnRoPTQ7OworICBNYXkpIG1vbnRoPU1heTsgbnVtbW9udGg9NTs7CisgIEp1bikgbW9udGg9SnVuZTsgbnVtbW9udGg9Njs7CisgIEp1bCkgbW9udGg9SnVseTsgbnVtbW9udGg9Nzs7CisgIEF1ZykgbW9udGg9QXVndXN0OyBudW1tb250aD04OzsKKyAgU2VwKSBtb250aD1TZXB0ZW1iZXI7IG51bW1vbnRoPTk7OworICBPY3QpIG1vbnRoPU9jdG9iZXI7IG51bW1vbnRoPTEwOzsKKyAgTm92KSBtb250aD1Ob3ZlbWJlcjsgbnVtbW9udGg9MTE7OworICBEZWMpIG1vbnRoPURlY2VtYmVyOyBudW1tb250aD0xMjs7Citlc2FjCisKK2Nhc2UgJDMgaW4KKyAgPz8/KikgZGF5PSQxOzsKKyAgKikgZGF5PSQzOyBzaGlmdDs7Citlc2FjCisKKyMgSGVyZSB3ZSBoYXZlIHRvIGRlYWwgd2l0aCB0aGUgcHJvYmxlbSB0aGF0IHRoZSBscyBvdXRwdXQgZ2l2ZXMgZWl0aGVyCisjIHRoZSB0aW1lIG9mIGRheSBvciB0aGUgeWVhci4KK2Nhc2UgJDMgaW4KKyAgKjoqKSBzZXQgYGRhdGVgOyBldmFsIHllYXI9XCQkIworICAgICAgIGNhc2UgJDIgaW4KKwkgSmFuKSBudW1tb250aHRvZD0xOzsKKwkgRmViKSBudW1tb250aHRvZD0yOzsKKwkgTWFyKSBudW1tb250aHRvZD0zOzsKKwkgQXByKSBudW1tb250aHRvZD00OzsKKwkgTWF5KSBudW1tb250aHRvZD01OzsKKwkgSnVuKSBudW1tb250aHRvZD02OzsKKwkgSnVsKSBudW1tb250aHRvZD03OzsKKwkgQXVnKSBudW1tb250aHRvZD04OzsKKwkgU2VwKSBudW1tb250aHRvZD05OzsKKwkgT2N0KSBudW1tb250aHRvZD0xMDs7CisJIE5vdikgbnVtbW9udGh0b2Q9MTE7OworCSBEZWMpIG51bW1vbnRodG9kPTEyOzsKKyAgICAgICBlc2FjCisgICAgICAgIyBGb3IgdGhlIGZpcnN0IHNpeCBtb250aCBvZiB0aGUgeWVhciB0aGUgdGltZSBub3RhdGlvbiBjYW4gYWxzbworICAgICAgICMgYmUgdXNlZCBmb3IgZmlsZXMgbW9kaWZpZWQgaW4gdGhlIGxhc3QgeWVhci4KKyAgICAgICBpZiAoZXhwciAkbnVtbW9udGggXD4gJG51bW1vbnRodG9kKSA+IC9kZXYvbnVsbDsKKyAgICAgICB0aGVuCisJIHllYXI9YGV4cHIgJHllYXIgLSAxYAorICAgICAgIGZpOzsKKyAgKikgeWVhcj0kMzs7Citlc2FjCisKKyMgVGhlIHJlc3VsdC4KK2VjaG8gJGRheSAkbW9udGggJHllYXIKKworIyBMb2NhbCBWYXJpYWJsZXM6CisjIG1vZGU6IHNoZWxsLXNjcmlwdAorIyBzaC1pbmRlbnRhdGlvbjogMgorIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCisjIHRpbWUtc3RhbXAtc3RhcnQ6ICJzY3JpcHR2ZXJzaW9uPSIKKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkLiUwMkgiCisjIHRpbWUtc3RhbXAtZW5kOiAiJCIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L2RvYy9zdGFtcC12dGkgYi9saWJnY3J5cHQtMS40LjYvZG9jL3N0YW1wLXZ0aQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTRlNGFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L2RvYy9zdGFtcC12dGkKQEAgLTAsMCArMSw0IEBACitAc2V0IFVQREFURUQgOSBKdWx5IDIwMDkKK0BzZXQgVVBEQVRFRC1NT05USCBKdWx5IDIwMDkKK0BzZXQgRURJVElPTiAxLjQuNgorQHNldCBWRVJTSU9OIDEuNC42CmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvZG9jL3RleGluZm8udGV4IGIvbGliZ2NyeXB0LTEuNC42L2RvYy90ZXhpbmZvLnRleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDgzNjIyCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L2RvYy90ZXhpbmZvLnRleApAQCAtMCwwICsxLDc0ODIgQEAKKyUgdGV4aW5mby50ZXggLS0gVGVYIG1hY3JvcyB0byBoYW5kbGUgVGV4aW5mbyBmaWxlcy4KKyUKKyUgTG9hZCBwbGFpbiBpZiBuZWNlc3NhcnksIGkuZS4sIGlmIHJ1bm5pbmcgdW5kZXIgaW5pdGV4LgorXGV4cGFuZGFmdGVyXGlmeFxjc25hbWUgZm10bmFtZVxlbmRjc25hbWVccmVsYXhcaW5wdXQgcGxhaW5cZmkKKyUKK1xkZWZcdGV4aW5mb3ZlcnNpb257MjAwNi0xMC0wNC4xN30KKyUKKyUgQ29weXJpZ2h0IChDKSAxOTg1LCAxOTg2LCAxOTg4LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LAorJSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2IEZyZWUKKyUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorJQorJSBUaGlzIHRleGluZm8udGV4IGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCislIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCislIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQKKyUgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorJQorJSBUaGlzIHRleGluZm8udGV4IGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCislIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyUgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorJQorJSBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorJSBhbG9uZyB3aXRoIHRoaXMgdGV4aW5mby50ZXggZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlCislIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCislIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorJQorJSBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB3aGVuIHRoaXMgZmlsZSBpcyByZWFkIGJ5IFRlWCB3aGVuIHByb2Nlc3NpbmcKKyUgYSBUZXhpbmZvIHNvdXJjZSBkb2N1bWVudCwgeW91IG1heSB1c2UgdGhlIHJlc3VsdCB3aXRob3V0CislIHJlc3RyaWN0aW9uLiAgKFRoaXMgaGFzIGJlZW4gb3VyIGludGVudCBzaW5jZSBUZXhpbmZvIHdhcyBpbnZlbnRlZC4pCislCislIFBsZWFzZSB0cnkgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRleGluZm8udGV4IGJlZm9yZSBzdWJtaXR0aW5nIGJ1ZworJSByZXBvcnRzOyB5b3UgY2FuIGdldCB0aGUgbGF0ZXN0IHZlcnNpb24gZnJvbToKKyUgICBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvdGV4aW5mby8gKHRoZSBUZXhpbmZvIGhvbWUgcGFnZSksIG9yCislICAgZnRwOi8vdHVnLm9yZy90ZXgvdGV4aW5mby50ZXgKKyUgICAgIChhbmQgYWxsIENUQU4gbWlycm9ycywgc2VlIGh0dHA6Ly93d3cuY3Rhbi5vcmcpLgorJSBUaGUgdGV4aW5mby50ZXggaW4gYW55IGdpdmVuIGRpc3RyaWJ1dGlvbiBjb3VsZCB3ZWxsIGJlIG91dAorJSBvZiBkYXRlLCBzbyBpZiB0aGF0J3Mgd2hhdCB5b3UncmUgdXNpbmcsIHBsZWFzZSBjaGVjay4KKyUKKyUgU2VuZCBidWcgcmVwb3J0cyB0byBidWctdGV4aW5mb0BnbnUub3JnLiAgUGxlYXNlIGluY2x1ZGUgaW5jbHVkaW5nIGEKKyUgY29tcGxldGUgZG9jdW1lbnQgaW4gZWFjaCBidWcgcmVwb3J0IHdpdGggd2hpY2ggd2UgY2FuIHJlcHJvZHVjZSB0aGUKKyUgcHJvYmxlbS4gIFBhdGNoZXMgYXJlLCBvZiBjb3Vyc2UsIGdyZWF0bHkgYXBwcmVjaWF0ZWQuCislCislIFRvIHByb2Nlc3MgYSBUZXhpbmZvIG1hbnVhbCB3aXRoIFRlWCwgaXQncyBtb3N0IHJlbGlhYmxlIHRvIHVzZSB0aGUKKyUgdGV4aTJkdmkgc2hlbGwgc2NyaXB0IHRoYXQgY29tZXMgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAgRm9yIGEgc2ltcGxlCislIG1hbnVhbCBmb28udGV4aSwgaG93ZXZlciwgeW91IGNhbiBnZXQgYXdheSB3aXRoIHRoaXM6CislICAgdGV4IGZvby50ZXhpCislICAgdGV4aW5kZXggZm9vLj8/CislICAgdGV4IGZvby50ZXhpCislICAgdGV4IGZvby50ZXhpCislICAgZHZpcHMgZm9vLmR2aSAtbyAgIyBvciB3aGF0ZXZlcjsgdGhpcyBtYWtlcyBmb28ucHMuCislIFRoZSBleHRyYSBUZVggcnVucyBnZXQgdGhlIGNyb3NzLXJlZmVyZW5jZSBpbmZvcm1hdGlvbiBjb3JyZWN0LgorJSBTb21ldGltZXMgb25lIHJ1biBhZnRlciB0ZXhpbmRleCBzdWZmaWNlcywgYW5kIHNvbWV0aW1lcyB5b3UgbmVlZCBtb3JlCislIHRoYW4gdHdvOyB0ZXhpMmR2aSBkb2VzIGl0IGFzIG1hbnkgdGltZXMgYXMgbmVjZXNzYXJ5LgorJQorJSBJdCBpcyBwb3NzaWJsZSB0byBhZGFwdCB0ZXhpbmZvLnRleCBmb3Igb3RoZXIgbGFuZ3VhZ2VzLCB0byBzb21lCislIGV4dGVudC4gIFlvdSBjYW4gZ2V0IHRoZSBleGlzdGluZyBsYW5ndWFnZS1zcGVjaWZpYyBmaWxlcyBmcm9tIHRoZQorJSBmdWxsIFRleGluZm8gZGlzdHJpYnV0aW9uLgorJQorJSBUaGUgR05VIFRleGluZm8gaG9tZSBwYWdlIGlzIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS90ZXhpbmZvLgorCisKK1xtZXNzYWdle0xvYWRpbmcgdGV4aW5mbyBbdmVyc2lvbiBcdGV4aW5mb3ZlcnNpb25dOn0KKworJSBJZiBpbiBhIC5mbXQgZmlsZSwgcHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyCislIGFuZCB0dXJuIG9uIGFjdGl2ZSBjaGFyYWN0ZXJzIHRoYXQgd2UgY291bGRuJ3QgZG8gZWFybGllciBiZWNhdXNlCislIHRoZXkgbWlnaHQgaGF2ZSBhcHBlYXJlZCBpbiB0aGUgaW5wdXQgZmlsZSBuYW1lLgorXGV2ZXJ5am9ie1xtZXNzYWdle1tUZXhpbmZvIHZlcnNpb24gXHRleGluZm92ZXJzaW9uXX0lCisgIFxjYXRjb2RlYCs9XGFjdGl2ZSBcY2F0Y29kZWBcXz1cYWN0aXZlfQorCitcbWVzc2FnZXtCYXNpY3MsfQorXGNoYXJkZWZcb3RoZXI9MTIKKworJSBXZSBuZXZlciB3YW50IHBsYWluJ3MgXG91dGVyIGRlZmluaXRpb24gb2YgXCsgaW4gVGV4aW5mby4KKyUgRm9yIEB0ZXgsIHdlIGNhbiB1c2UgXHRhYmFsaWduLgorXGxldFwrID0gXHJlbGF4CisKKyUgU2F2ZSBzb21lIHBsYWluIHRleCBtYWNyb3Mgd2hvc2UgbmFtZXMgd2Ugd2lsbCByZWRlZmluZS4KK1xsZXRccHRleGI9XGIKK1xsZXRccHRleGJ1bGxldD1cYnVsbGV0CitcbGV0XHB0ZXhjPVxjCitcbGV0XHB0ZXhjb21tYT1cLAorXGxldFxwdGV4ZG90PVwuCitcbGV0XHB0ZXhkb3RzPVxkb3RzCitcbGV0XHB0ZXhlbmQ9XGVuZAorXGxldFxwdGV4ZXF1aXY9XGVxdWl2CitcbGV0XHB0ZXhleGNsYW09XCEKK1xsZXRccHRleGZvb3Rub3RlPVxmb290bm90ZQorXGxldFxwdGV4Z3RyPT4KK1xsZXRccHRleGhhdD1eCitcbGV0XHB0ZXhpPVxpCitcbGV0XHB0ZXhpbmRlbnQ9XGluZGVudAorXGxldFxwdGV4aW5zZXJ0PVxpbnNlcnQKK1xsZXRccHRleGxicmFjZT1ceworXGxldFxwdGV4bGVzcz08CitcbGV0XHB0ZXhuZXd3cml0ZVxuZXd3cml0ZQorXGxldFxwdGV4bm9pbmRlbnQ9XG5vaW5kZW50CitcbGV0XHB0ZXhwbHVzPSsKK1xsZXRccHRleHJicmFjZT1cfQorXGxldFxwdGV4c2xhc2g9XC8KK1xsZXRccHRleHN0YXI9XCoKK1xsZXRccHRleHQ9XHQKKworJSBJZiB0aGlzIGNoYXJhY3RlciBhcHBlYXJzIGluIGFuIGVycm9yIG1lc3NhZ2Ugb3IgaGVscCBzdHJpbmcsIGl0CislIHN0YXJ0cyBhIG5ldyBsaW5lIGluIHRoZSBvdXRwdXQuCitcbmV3bGluZWNoYXIgPSBgXl5KCisKKyUgVXNlIFRlWCAzLjAncyBcaW5wdXRsaW5lbm8gdG8gZ2V0IHRoZSBsaW5lIG51bWJlciwgZm9yIGJldHRlciBlcnJvcgorJSBtZXNzYWdlcywgYnV0IGlmIHdlJ3JlIHVzaW5nIGFuIG9sZCB2ZXJzaW9uIG9mIFRlWCwgZG9uJ3QgZG8gYW55dGhpbmcuCislCitcaWZ4XGlucHV0bGluZW5vXHRoaXNpc3VuZGVmaW5lZAorICBcbGV0XGxpbmVudW1iZXIgPSBcZW1wdHkgJSBQcmUtMy4wLgorXGVsc2UKKyAgXGRlZlxsaW5lbnVtYmVye2wuXHRoZVxpbnB1dGxpbmVubzpcc3BhY2V9CitcZmkKKworJSBTZXQgdXAgZml4ZWQgd29yZHMgZm9yIEVuZ2xpc2ggaWYgbm90IGFscmVhZHkgc2V0LgorXGlmeFxwdXR3b3JkQXBwZW5kaXhcdW5kZWZpbmVkICBcZ2RlZlxwdXR3b3JkQXBwZW5kaXh7QXBwZW5kaXh9XGZpCitcaWZ4XHB1dHdvcmRDaGFwdGVyXHVuZGVmaW5lZCAgIFxnZGVmXHB1dHdvcmRDaGFwdGVye0NoYXB0ZXJ9XGZpCitcaWZ4XHB1dHdvcmRmaWxlXHVuZGVmaW5lZCAgICAgIFxnZGVmXHB1dHdvcmRmaWxle2ZpbGV9XGZpCitcaWZ4XHB1dHdvcmRpblx1bmRlZmluZWQgICAgICAgIFxnZGVmXHB1dHdvcmRpbntpbn1cZmkKK1xpZnhccHV0d29yZEluZGV4SXNFbXB0eVx1bmRlZmluZWQgICAgIFxnZGVmXHB1dHdvcmRJbmRleElzRW1wdHl7KEluZGV4IGlzIGVtcHR5KX1cZmkKK1xpZnhccHV0d29yZEluZGV4Tm9uZXhpc3RlbnRcdW5kZWZpbmVkIFxnZGVmXHB1dHdvcmRJbmRleE5vbmV4aXN0ZW50eyhJbmRleCBpcyBub25leGlzdGVudCl9XGZpCitcaWZ4XHB1dHdvcmRJbmZvXHVuZGVmaW5lZCAgICAgIFxnZGVmXHB1dHdvcmRJbmZve0luZm99XGZpCitcaWZ4XHB1dHdvcmRJbnN0YW5jZVZhcmlhYmxlb2ZcdW5kZWZpbmVkIFxnZGVmXHB1dHdvcmRJbnN0YW5jZVZhcmlhYmxlb2Z7SW5zdGFuY2UgVmFyaWFibGUgb2Z9XGZpCitcaWZ4XHB1dHdvcmRNZXRob2Rvblx1bmRlZmluZWQgIFxnZGVmXHB1dHdvcmRNZXRob2RvbntNZXRob2Qgb259XGZpCitcaWZ4XHB1dHdvcmROb1RpdGxlXHVuZGVmaW5lZCAgIFxnZGVmXHB1dHdvcmROb1RpdGxle05vIFRpdGxlfVxmaQorXGlmeFxwdXR3b3Jkb2ZcdW5kZWZpbmVkICAgICAgICBcZ2RlZlxwdXR3b3Jkb2Z7b2Z9XGZpCitcaWZ4XHB1dHdvcmRvblx1bmRlZmluZWQgICAgICAgIFxnZGVmXHB1dHdvcmRvbntvbn1cZmkKK1xpZnhccHV0d29yZHBhZ2VcdW5kZWZpbmVkICAgICAgXGdkZWZccHV0d29yZHBhZ2V7cGFnZX1cZmkKK1xpZnhccHV0d29yZHNlY3Rpb25cdW5kZWZpbmVkICAgXGdkZWZccHV0d29yZHNlY3Rpb257c2VjdGlvbn1cZmkKK1xpZnhccHV0d29yZFNlY3Rpb25cdW5kZWZpbmVkICAgXGdkZWZccHV0d29yZFNlY3Rpb257U2VjdGlvbn1cZmkKK1xpZnhccHV0d29yZHNlZVx1bmRlZmluZWQgICAgICAgXGdkZWZccHV0d29yZHNlZXtzZWV9XGZpCitcaWZ4XHB1dHdvcmRTZWVcdW5kZWZpbmVkICAgICAgIFxnZGVmXHB1dHdvcmRTZWV7U2VlfVxmaQorXGlmeFxwdXR3b3JkU2hvcnRUT0NcdW5kZWZpbmVkICBcZ2RlZlxwdXR3b3JkU2hvcnRUT0N7U2hvcnQgQ29udGVudHN9XGZpCitcaWZ4XHB1dHdvcmRUT0NcdW5kZWZpbmVkICAgICAgIFxnZGVmXHB1dHdvcmRUT0N7VGFibGUgb2YgQ29udGVudHN9XGZpCislCitcaWZ4XHB1dHdvcmRNSmFuXHVuZGVmaW5lZCBcZ2RlZlxwdXR3b3JkTUphbntKYW51YXJ5fVxmaQorXGlmeFxwdXR3b3JkTUZlYlx1bmRlZmluZWQgXGdkZWZccHV0d29yZE1GZWJ7RmVicnVhcnl9XGZpCitcaWZ4XHB1dHdvcmRNTWFyXHVuZGVmaW5lZCBcZ2RlZlxwdXR3b3JkTU1hcntNYXJjaH1cZmkKK1xpZnhccHV0d29yZE1BcHJcdW5kZWZpbmVkIFxnZGVmXHB1dHdvcmRNQXBye0FwcmlsfVxmaQorXGlmeFxwdXR3b3JkTU1heVx1bmRlZmluZWQgXGdkZWZccHV0d29yZE1NYXl7TWF5fVxmaQorXGlmeFxwdXR3b3JkTUp1blx1bmRlZmluZWQgXGdkZWZccHV0d29yZE1KdW57SnVuZX1cZmkKK1xpZnhccHV0d29yZE1KdWxcdW5kZWZpbmVkIFxnZGVmXHB1dHdvcmRNSnVse0p1bHl9XGZpCitcaWZ4XHB1dHdvcmRNQXVnXHVuZGVmaW5lZCBcZ2RlZlxwdXR3b3JkTUF1Z3tBdWd1c3R9XGZpCitcaWZ4XHB1dHdvcmRNU2VwXHVuZGVmaW5lZCBcZ2RlZlxwdXR3b3JkTVNlcHtTZXB0ZW1iZXJ9XGZpCitcaWZ4XHB1dHdvcmRNT2N0XHVuZGVmaW5lZCBcZ2RlZlxwdXR3b3JkTU9jdHtPY3RvYmVyfVxmaQorXGlmeFxwdXR3b3JkTU5vdlx1bmRlZmluZWQgXGdkZWZccHV0d29yZE1Ob3Z7Tm92ZW1iZXJ9XGZpCitcaWZ4XHB1dHdvcmRNRGVjXHVuZGVmaW5lZCBcZ2RlZlxwdXR3b3JkTURlY3tEZWNlbWJlcn1cZmkKKyUKK1xpZnhccHV0d29yZERlZm1hY1x1bmRlZmluZWQgICAgXGdkZWZccHV0d29yZERlZm1hY3tNYWNyb31cZmkKK1xpZnhccHV0d29yZERlZnNwZWNcdW5kZWZpbmVkICAgXGdkZWZccHV0d29yZERlZnNwZWN7U3BlY2lhbCBGb3JtfVxmaQorXGlmeFxwdXR3b3JkRGVmdmFyXHVuZGVmaW5lZCAgICBcZ2RlZlxwdXR3b3JkRGVmdmFye1ZhcmlhYmxlfVxmaQorXGlmeFxwdXR3b3JkRGVmb3B0XHVuZGVmaW5lZCAgICBcZ2RlZlxwdXR3b3JkRGVmb3B0e1VzZXIgT3B0aW9ufVxmaQorXGlmeFxwdXR3b3JkRGVmZnVuY1x1bmRlZmluZWQgICBcZ2RlZlxwdXR3b3JkRGVmZnVuY3tGdW5jdGlvbn1cZmkKKworJSBTaW5jZSB0aGUgY2F0ZWdvcnkgb2Ygc3BhY2UgaXMgbm90IGtub3duLCB3ZSBoYXZlIHRvIGJlIGNhcmVmdWwuCitcY2hhcmRlZlxzcGFjZWNhdCA9IDEwCitcZGVmXHNwYWNlaXNzcGFjZXtcY2F0Y29kZWBcID1cc3BhY2VjYXR9CisKKyUgc29tZXRpbWVzIGNoYXJhY3RlcnMgYXJlIGFjdGl2ZSwgc28gd2UgbmVlZCBjb250cm9sIHNlcXVlbmNlcy4KK1xjaGFyZGVmXGNvbG9uQ2hhciA9IGBcOgorXGNoYXJkZWZcY29tbWFDaGFyID0gYFwsCitcY2hhcmRlZlxkYXNoQ2hhciAgPSBgXC0KK1xjaGFyZGVmXGRvdENoYXIgICA9IGBcLgorXGNoYXJkZWZcZXhjbGFtQ2hhcj0gYFwhCitcY2hhcmRlZlxscXVvdGVDaGFyPSBgXGAKK1xjaGFyZGVmXHF1ZXN0Q2hhciA9IGBcPworXGNoYXJkZWZccnF1b3RlQ2hhcj0gYFwnCitcY2hhcmRlZlxzZW1pQ2hhciAgPSBgXDsKK1xjaGFyZGVmXHVuZGVyQ2hhciA9IGBcXworCislIElnbm9yZSBhIHRva2VuLgorJQorXGRlZlxnb2JibGUjMXt9CisKKyUgVGhlIGZvbGxvd2luZyBpcyB1c2VkIGluc2lkZSBzZXZlcmFsIFxlZGVmJ3MuCitcZGVmXG1ha2Vjc25hbWUjMXtcZXhwYW5kYWZ0ZXJcbm9leHBhbmRcY3NuYW1lIzFcZW5kY3NuYW1lfQorCislIEh5cGhlbmF0aW9uIGZpeGVzLgorXGh5cGhlbmF0aW9ueworICBGbG9yLWktZGEgR2hvc3Qtc2NyaXB0IEdob3N0LXZpZXcgTWFjLU9TIFBvc3QtU2NyaXB0CisgIGFwLXBlbi1kaXggYml0LW1hcCBiaXQtbWFwcworICBkYXRhLWJhc2UgZGF0YS1iYXNlcyBlc2hlbGwgZmFsbC1pbmcgaGFsZi13YXkgbG9uZy1lc3QgbWFuLXUtc2NyaXB0CisgIG1hbi11LXNjcmlwdHMgbWluaS1idWYtZmVyIG1pbmktYnVmLWZlcnMgb3Zlci12aWV3IHBhci1hLWRpZ20KKyAgcGFyLWEtZGlnbXMgcmF0aC1lciByZWMtdGFuLWd1LWxhciByby1ib3QtaWNzIHNlLXZlcmUtbHkgc2V0LXVwIHNwYS1jZXMKKyAgc3BlbGwtaW5nIHNwZWxsLWluZ3MKKyAgc3RhbmQtYWxvbmUgc3Ryb25nLWVzdCB0aW1lLXN0YW1wIHRpbWUtc3RhbXBzIHdoaWNoLWV2ZXIgd2hpdGUtc3BhY2UKKyAgd2lkZS1zcHJlYWQgd3JhcC1hcm91bmQKK30KKworJSBNYXJnaW4gdG8gYWRkIHRvIHJpZ2h0IG9mIGV2ZW4gcGFnZXMsIHRvIGxlZnQgb2Ygb2RkIHBhZ2VzLgorXG5ld2RpbWVuXGJpbmRpbmdvZmZzZXQKK1xuZXdkaW1lblxub3JtYWxvZmZzZXQKK1xuZXdkaW1lblxwYWdld2lkdGggXG5ld2RpbWVuXHBhZ2VoZWlnaHQKKworJSBGb3IgYSBmaW5hbCBjb3B5LCB0YWtlIG91dCB0aGUgcmVjdGFuZ2xlcworJSB0aGF0IG1hcmsgb3ZlcmZ1bGwgYm94ZXMgKGluIGNhc2UgeW91IGhhdmUgZGVjaWRlZAorJSB0aGF0IHRoZSB0ZXh0IGxvb2tzIG9rIGV2ZW4gdGhvdWdoIGl0IHBhc3NlcyB0aGUgbWFyZ2luKS4KKyUKK1xkZWZcZmluYWxvdXR7XG92ZXJmdWxscnVsZT0wcHR9CisKKyUgQHwgaW5zZXJ0cyBhIGNoYW5nZWJhciB0byB0aGUgbGVmdCBvZiB0aGUgY3VycmVudCBsaW5lLiAgSXQgc2hvdWxkCislIHN1cnJvdW5kIGFueSBjaGFuZ2VkIHRleHQuICBUaGlzIGFwcHJvYWNoIGRvZXMgKm5vdCogd29yayBpZiB0aGUKKyUgY2hhbmdlIHNwYW5zIG1vcmUgdGhhbiB0d28gbGluZXMgb2Ygb3V0cHV0LiAgVG8gaGFuZGxlIHRoYXQsIHdlIHdvdWxkCislIGhhdmUgYWRvcHQgYSBtdWNoIG1vcmUgZGlmZmljdWx0IGFwcHJvYWNoIChwdXR0aW5nIG1hcmtzIGludG8gdGhlIG1haW4KKyUgdmVydGljYWwgbGlzdCBmb3IgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIGVhY2ggY2hhbmdlKS4KKyUKK1xkZWZcfHslCisgICUgXHZhZGp1c3QgY2FuIG9ubHkgYmUgdXNlZCBpbiBob3Jpem9udGFsIG1vZGUuCisgIFxsZWF2ZXZtb2RlCisgICUKKyAgJSBBcHBlbmQgdGhpcyB2ZXJ0aWNhbCBtb2RlIG1hdGVyaWFsIGFmdGVyIHRoZSBjdXJyZW50IGxpbmUgaW4gdGhlIG91dHB1dC4KKyAgXHZhZGp1c3R7JQorICAgICUgV2Ugd2FudCB0byBpbnNlcnQgYSBydWxlIHdpdGggdGhlIGhlaWdodCBhbmQgZGVwdGggb2YgdGhlIGN1cnJlbnQKKyAgICAlIGxlYWRpbmc7IHRoYXQgaXMgZXhhY3RseSB3aGF0IFxzdHJ1dGJveCBpcyBzdXBwb3NlZCB0byByZWNvcmQuCisgICAgXHZza2lwLVxiYXNlbGluZXNraXAKKyAgICAlCisgICAgJSBcdmFkanVzdC1pdGVtcyBhcmUgaW5zZXJ0ZWQgYXQgdGhlIGxlZnQgZWRnZSBvZiB0aGUgdHlwZS4gIFNvCisgICAgJSB0aGUgXGxsYXAgaGVyZSBtb3ZlcyBvdXQgaW50byB0aGUgbGVmdC1oYW5kIG1hcmdpbi4KKyAgICBcbGxhcHslCisgICAgICAlCisgICAgICAlIEZvciBhIHRoaWNrZXIgb3IgdGhpbm5lciBiYXIsIGNoYW5nZSB0aGUgYDFwdCcuCisgICAgICBcdnJ1bGUgaGVpZ2h0XGJhc2VsaW5lc2tpcCB3aWR0aDFwdAorICAgICAgJQorICAgICAgJSBUaGlzIGlzIHRoZSBzcGFjZSBiZXR3ZWVuIHRoZSBiYXIgYW5kIHRoZSB0ZXh0LgorICAgICAgXGhza2lwIDEycHQKKyAgICB9JQorICB9JQorfQorCislIFNvbWV0aW1lcyBpdCBpcyBjb252ZW5pZW50IHRvIGhhdmUgZXZlcnl0aGluZyBpbiB0aGUgdHJhbnNjcmlwdCBmaWxlCislIGFuZCBub3RoaW5nIG9uIHRoZSB0ZXJtaW5hbC4gIFdlIGRvbid0IGp1c3QgY2FsbCBcdHJhY2luZ2FsbCBoZXJlLAorJSBzaW5jZSB0aGF0IHByb2R1Y2VzIHNvbWUgdXNlbGVzcyBvdXRwdXQgb24gdGhlIHRlcm1pbmFsLiAgV2UgYWxzbyBtYWtlCislIHNvbWUgZWZmb3J0IHRvIG9yZGVyIHRoZSB0cmFjaW5nIGNvbW1hbmRzIHRvIHJlZHVjZSBvdXRwdXQgaW4gdGhlIGxvZworJSBmaWxlOyBjZi4gdHJhY2Uuc3R5IGluIExhVGVYLgorJQorXGRlZlxnbG9nZ2luZ2FsbHtcYmVnaW5ncm91cCBcZ2xvYmFsZGVmcyA9IDEgXGxvZ2dpbmdhbGwgXGVuZGdyb3VwfSUKK1xkZWZcbG9nZ2luZ2FsbHslCisgIFx0cmFjaW5nc3RhdHMyCisgIFx0cmFjaW5ncGFnZXMxCisgIFx0cmFjaW5nbG9zdGNoYXJzMiAgJSAyIGdpdmVzIHVzIG1vcmUgaW4gZXRleAorICBcdHJhY2luZ3BhcmFncmFwaHMxCisgIFx0cmFjaW5nb3V0cHV0MQorICBcdHJhY2luZ21hY3JvczIKKyAgXHRyYWNpbmdyZXN0b3JlczEKKyAgXHNob3dib3hicmVhZHRoXG1heGRpbWVuIFxzaG93Ym94ZGVwdGhcbWF4ZGltZW4KKyAgXGlmeFxlVGVYdmVyc2lvblx1bmRlZmluZWRcZWxzZSAlIGV0ZXggZ2l2ZXMgdXMgbW9yZSBsb2dnaW5nCisgICAgXHRyYWNpbmdzY2FudG9rZW5zMQorICAgIFx0cmFjaW5naWZzMQorICAgIFx0cmFjaW5nZ3JvdXBzMQorICAgIFx0cmFjaW5nbmVzdGluZzIKKyAgICBcdHJhY2luZ2Fzc2lnbnMxCisgIFxmaQorICBcdHJhY2luZ2NvbW1hbmRzMyAgJSAzIGdpdmVzIHVzIG1vcmUgaW4gZXRleAorICBcZXJyb3Jjb250ZXh0bGluZXMxNgorfSUKKworJSBhZGQgY2hlY2sgZm9yIFxsYXN0cGVuYWx0eSB0byBwbGFpbidzIGRlZmluaXRpb25zLiAgSWYgdGhlIGxhc3QgdGhpbmcKKyUgd2UgZGlkIHdhcyBhIFxub2JyZWFrLCB3ZSBkb24ndCB3YW50IHRvIGluc2VydCBtb3JlIHNwYWNlLgorJQorXGRlZlxzbWFsbGJyZWFre1xpZm51bVxsYXN0cGVuYWx0eTwxMDAwMFxwYXJcaWZkaW1cbGFzdHNraXA8XHNtYWxsc2tpcGFtb3VudAorICBccmVtb3ZlbGFzdHNraXBccGVuYWx0eS01MFxzbWFsbHNraXBcZmlcZml9CitcZGVmXG1lZGJyZWFre1xpZm51bVxsYXN0cGVuYWx0eTwxMDAwMFxwYXJcaWZkaW1cbGFzdHNraXA8XG1lZHNraXBhbW91bnQKKyAgXHJlbW92ZWxhc3Rza2lwXHBlbmFsdHktMTAwXG1lZHNraXBcZmlcZml9CitcZGVmXGJpZ2JyZWFre1xpZm51bVxsYXN0cGVuYWx0eTwxMDAwMFxwYXJcaWZkaW1cbGFzdHNraXA8XGJpZ3NraXBhbW91bnQKKyAgXHJlbW92ZWxhc3Rza2lwXHBlbmFsdHktMjAwXGJpZ3NraXBcZmlcZml9CisKKyUgRm9yIEBjcm9wbWFya3MgY29tbWFuZC4KKyUgRG8gQGNyb3BtYXJrcyB0byBnZXQgY3JvcCBtYXJrcy4KKyUKK1xuZXdpZlxpZmNyb3BtYXJrcworXGxldFxjcm9wbWFya3MgPSBcY3JvcG1hcmtzdHJ1ZQorJQorJSBEaW1lbnNpb25zIHRvIGFkZCBjcm9wbWFya3MgYXQgY29ybmVycy4KKyUgQWRkZWQgYnkgUC4gQS4gTWFjS2F5LCAxMiBOb3YuIDE5ODYKKyUKK1xuZXdkaW1lblxvdXRlcmhzaXplIFxuZXdkaW1lblxvdXRlcnZzaXplICUgc2V0IGJ5IHRoZSBwYXBlciBzaXplIHJvdXRpbmVzCitcbmV3ZGltZW5cY29ybmVybG9uZyAgXGNvcm5lcmxvbmc9MXBjCitcbmV3ZGltZW5cY29ybmVydGhpY2sgXGNvcm5lcnRoaWNrPS4zcHQKK1xuZXdkaW1lblx0b3BhbmRib3R0b21tYXJnaW4gXHRvcGFuZGJvdHRvbW1hcmdpbj0uNzVpbgorCislIE1haW4gb3V0cHV0IHJvdXRpbmUuCitcY2hhcmRlZlxQQUdFID0gMjU1Citcb3V0cHV0ID0ge1xvbmVwYWdlb3V0e1xwYWdlY29udGVudHNcUEFHRX19CisKK1xuZXdib3hcaGVhZGxpbmVib3gKK1xuZXdib3hcZm9vdGxpbmVib3gKKworJSBcb25lcGFnZW91dCB0YWtlcyBhIHZib3ggYXMgYW4gYXJndW1lbnQuICBOb3RlIHRoYXQgXHBhZ2Vjb250ZW50cworJSBkb2VzIGluc2VydGlvbnMsIGJ1dCB5b3UgaGF2ZSB0byBjYWxsIGl0IHlvdXJzZWxmLgorXGRlZlxvbmVwYWdlb3V0IzF7JQorICBcaWZjcm9wbWFya3MgXGhvZmZzZXQ9MHB0IFxlbHNlIFxob2Zmc2V0PVxub3JtYWxvZmZzZXQgXGZpCisgICUKKyAgXGlmb2RkXHBhZ2VubyAgXGFkdmFuY2VcaG9mZnNldCBieSBcYmluZGluZ29mZnNldAorICBcZWxzZSBcYWR2YW5jZVxob2Zmc2V0IGJ5IC1cYmluZGluZ29mZnNldFxmaQorICAlCisgICUgRG8gdGhpcyBvdXRzaWRlIG9mIHRoZSBcc2hpcG91dCBzbyBAY29kZSBldGMuIHdpbGwgYmUgZXhwYW5kZWQgaW4KKyAgJSB0aGUgaGVhZGxpbmUgYXMgdGhleSBzaG91bGQgYmUsIG5vdCB0YWtlbiBsaXRlcmFsbHkgKG91dHB1dHRpbmcgJydjb2RlKS4KKyAgXHNldGJveFxoZWFkbGluZWJveCA9IFx2Ym94e1xsZXRcaHNpemU9XHBhZ2V3aWR0aCBcbWFrZWhlYWRsaW5lfSUKKyAgXHNldGJveFxmb290bGluZWJveCA9IFx2Ym94e1xsZXRcaHNpemU9XHBhZ2V3aWR0aCBcbWFrZWZvb3RsaW5lfSUKKyAgJQorICB7JQorICAgICUgSGF2ZSB0byBkbyB0aGlzIHN0dWZmIG91dHNpZGUgdGhlIFxzaGlwb3V0IGJlY2F1c2Ugd2Ugd2FudCBpdCB0bworICAgICUgdGFrZSBlZmZlY3QgaW4gXHdyaXRlJ3MsIHlldCB0aGUgZ3JvdXAgZGVmaW5lZCBieSB0aGUgXHZib3ggZW5kcworICAgICUgYmVmb3JlIHRoZSBcc2hpcG91dCBydW5zLgorICAgICUKKyAgICBcaW5kZXhkdW1taWVzICAgICAgICAgJSBkb24ndCBleHBhbmQgY29tbWFuZHMgaW4gdGhlIG91dHB1dC4KKyAgICBcbm9ybWFsdHVybm9mZmFjdGl2ZSAgJSBcIGluIGluZGV4IGVudHJpZXMgbXVzdCBub3Qgc3RheSBcLCBlLmcuLCBpZgorICAgICAgICAgICAgICAgJSB0aGUgcGFnZSBicmVhayBoYXBwZW5zIHRvIGJlIGluIHRoZSBtaWRkbGUgb2YgYW4gZXhhbXBsZS4KKyAgICAgICAgICAgICAgICUgV2UgZG9uJ3Qgd2FudCAudnIgKG9yIHdoYXRldmVyKSBlbnRyaWVzIGxpa2UgdGhpczoKKyAgICAgICAgICAgICAgICUgXGVudHJ5e3tcdHQgXGluZGV4YmFja3NsYXNoIH1hY3JvbnltfXszMn17XGNvZGUge1xhY3JvbnltfX0KKyAgICAgICAgICAgICAgICUgIlxhY3JvbnltIiB3b24ndCB3b3JrIHdoZW4gaXQncyByZWFkIGJhY2sgaW47CisgICAgICAgICAgICAgICAlIGl0IG5lZWRzIHRvIGJlIAorICAgICAgICAgICAgICAgJSB7XGNvZGUge3tcdHQgXGJhY2tzbGFzaGN1cmZvbnQgfWFjcm9ueW19CisgICAgXHNoaXBvdXRcdmJveHslCisgICAgICAlIERvIHRoaXMgZWFybHkgc28gcGRmIHJlZmVyZW5jZXMgZ28gdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFnZS4KKyAgICAgIFxpZnBkZm1ha2VwYWdlZGVzdCBccGRmZGVzdCBuYW1le1x0aGVccGFnZW5vfSB4eXpcZmkKKyAgICAgICUKKyAgICAgIFxpZmNyb3BtYXJrcyBcdmJveCB0byBcb3V0ZXJ2c2l6ZVxiZ3JvdXAKKyAgICAgICAgXGhzaXplID0gXG91dGVyaHNpemUKKyAgICAgICAgXHZza2lwLVx0b3BhbmRib3R0b21tYXJnaW4KKyAgICAgICAgXHZ0b3AgdG8wcHR7JQorICAgICAgICAgIFxsaW5le1xld3RvcFxoZmlsXGV3dG9wfSUKKyAgICAgICAgICBcbm9pbnRlcmxpbmVza2lwCisgICAgICAgICAgXGxpbmV7JQorICAgICAgICAgICAgXHZib3h7XG1vdmVsZWZ0XGNvcm5lcnRoaWNrXG5zdG9wfSUKKyAgICAgICAgICAgIFxoZmlsbAorICAgICAgICAgICAgXHZib3h7XG1vdmVyaWdodFxjb3JuZXJ0aGlja1xuc3RvcH0lCisgICAgICAgICAgfSUKKyAgICAgICAgICBcdnNzfSUKKyAgICAgICAgXHZza2lwXHRvcGFuZGJvdHRvbW1hcmdpbgorICAgICAgICBcbGluZVxiZ3JvdXAKKyAgICAgICAgICBcaGZpbCAlIGNlbnRlciB0aGUgcGFnZSB3aXRoaW4gdGhlIG91dGVyIChwYWdlKSBoc2l6ZS4KKyAgICAgICAgICBcaWZvZGRccGFnZW5vXGhza2lwXGJpbmRpbmdvZmZzZXRcZmkKKyAgICAgICAgICBcdmJveFxiZ3JvdXAKKyAgICAgIFxmaQorICAgICAgJQorICAgICAgXHVudmJveFxoZWFkbGluZWJveAorICAgICAgXHBhZ2Vib2R5eyMxfSUKKyAgICAgIFxpZmRpbVxodFxmb290bGluZWJveCA+IDBwdAorICAgICAgICAlIE9ubHkgbGVhdmUgdGhpcyBzcGFjZSBpZiB0aGUgZm9vdGxpbmUgaXMgbm9uZW1wdHkuCisgICAgICAgICUgKFdlIGxlc3NlbmVkIFx2c2l6ZSBmb3IgaXQgaW4gXG9kZGZvb3Rpbmd5eXkuKQorICAgICAgICAlIFRoZSBcYmFzZWxpbmVza2lwPTI0cHQgaW4gcGxhaW4ncyBcbWFrZWZvb3RsaW5lIGhhcyBubyBlZmZlY3QuCisgICAgICAgIFx2c2tpcCAyNHB0CisgICAgICAgIFx1bnZib3hcZm9vdGxpbmVib3gKKyAgICAgIFxmaQorICAgICAgJQorICAgICAgXGlmY3JvcG1hcmtzCisgICAgICAgICAgXGVncm91cCAlIGVuZCBvZiBcdmJveFxiZ3JvdXAKKyAgICAgICAgXGhmaWxcZWdyb3VwICUgZW5kIG9mIChjZW50ZXJpbmcpIFxsaW5lXGJncm91cAorICAgICAgICBcdnNraXBcdG9wYW5kYm90dG9tbWFyZ2luIHBsdXMxZmlsbCBtaW51czFmaWxsCisgICAgICAgIFxib3htYXhkZXB0aCA9IFxjb3JuZXJ0aGljaworICAgICAgICBcdmJveCB0bzBwdHtcdnNzCisgICAgICAgICAgXGxpbmV7JQorICAgICAgICAgICAgXHZib3h7XG1vdmVsZWZ0XGNvcm5lcnRoaWNrXG5zYm90fSUKKyAgICAgICAgICAgIFxoZmlsbAorICAgICAgICAgICAgXHZib3h7XG1vdmVyaWdodFxjb3JuZXJ0aGlja1xuc2JvdH0lCisgICAgICAgICAgfSUKKyAgICAgICAgICBcbm9pbnRlcmxpbmVza2lwCisgICAgICAgICAgXGxpbmV7XGV3Ym90XGhmaWxcZXdib3R9JQorICAgICAgICB9JQorICAgICAgXGVncm91cCAlIFx2Ym94IGZyb20gZmlyc3QgY3JvcG1hcmtzIGNsYXVzZQorICAgICAgXGZpCisgICAgfSUgZW5kIG9mIFxzaGlwb3V0XHZib3gKKyAgfSUgZW5kIG9mIGdyb3VwIHdpdGggXGluZGV4ZHVtbWllcworICBcYWR2YW5jZXBhZ2VubworICBcaWZudW1cb3V0cHV0cGVuYWx0eT4tMjAwMDAgXGVsc2VcZG9zdXBlcmVqZWN0XGZpCit9CisKK1xuZXdpbnNlcnRcbWFyZ2luIFxkaW1lblxtYXJnaW49XG1heGRpbWVuCisKK1xkZWZccGFnZWJvZHkjMXtcdmJveCB0b1xwYWdlaGVpZ2h0e1xib3htYXhkZXB0aD1cbWF4ZGVwdGggIzF9fQore1xjYXRjb2RlYFxAID0xMQorXGdkZWZccGFnZWNvbnRlbnRzIzF7XGlmdm9pZFx0b3BpbnNcZWxzZVx1bnZib3hcdG9waW5zXGZpCislIG1hcmdpbmFsIGhhY2tzLCBqdWhhQHZpaXNhLnV1Y3AgKEp1aGEgVGFrYWxhKQorXGlmdm9pZFxtYXJnaW5cZWxzZSAlIG1hcmdpbmFsIGluZm8gaXMgcHJlc2VudAorICBccmxhcHtca2Vyblxoc2l6ZVx2Ym94IHRvXHpAe1xrZXJuMXB0XGJveFxtYXJnaW4gXHZzc319XGZpCitcZGltZW5APVxkcCMxIFx1bnZib3gjMQorXGlmdm9pZFxmb290aW5zXGVsc2VcdnNraXBcc2tpcFxmb290aW5zXGZvb3Rub3RlcnVsZSBcdW52Ym94XGZvb3RpbnNcZmkKK1xpZnJAZ2dlZGJvdHRvbSBca2Vybi1cZGltZW5AIFx2ZmlsIFxmaX0KK30KKworJSBIZXJlIGFyZSB0aGUgcnVsZXMgZm9yIHRoZSBjcm9wbWFya3MuICBOb3RlIHRoYXQgdGhleSBhcmUKKyUgb2Zmc2V0IHNvIHRoYXQgdGhlIHNwYWNlIGJldHdlZW4gdGhlbSBpcyB0cnVseSBcb3V0ZXJoc2l6ZSBvciBcb3V0ZXJ2c2l6ZQorJSAoUC4gQS4gTWFjS2F5LCAxMiBOb3ZlbWJlciwgMTk4NikKKyUKK1xkZWZcZXd0b3B7XHZydWxlIGhlaWdodFxjb3JuZXJ0aGljayBkZXB0aDBwdCB3aWR0aFxjb3JuZXJsb25nfQorXGRlZlxuc3RvcHtcdmJveAorICB7XGhydWxlIGhlaWdodFxjb3JuZXJ0aGljayBkZXB0aFxjb3JuZXJsb25nIHdpZHRoXGNvcm5lcnRoaWNrfX0KK1xkZWZcZXdib3R7XHZydWxlIGhlaWdodDBwdCBkZXB0aFxjb3JuZXJ0aGljayB3aWR0aFxjb3JuZXJsb25nfQorXGRlZlxuc2JvdHtcdmJveAorICB7XGhydWxlIGhlaWdodFxjb3JuZXJsb25nIGRlcHRoXGNvcm5lcnRoaWNrIHdpZHRoXGNvcm5lcnRoaWNrfX0KKworJSBQYXJzZSBhbiBhcmd1bWVudCwgdGhlbiBwYXNzIGl0IHRvICMxLiAgVGhlIGFyZ3VtZW50IGlzIHRoZSByZXN0IG9mCislIHRoZSBpbnB1dCBsaW5lIChleGNlcHQgd2UgcmVtb3ZlIGEgdHJhaWxpbmcgY29tbWVudCkuICAjMSBzaG91bGQgYmUgYQorJSBtYWNybyB3aGljaCBleHBlY3RzIGFuIG9yZGluYXJ5IHVuZGVsaW1pdGVkIFRlWCBhcmd1bWVudC4KKyUKK1xkZWZccGFyc2Vhcmd7XHBhcnNlYXJndXNpbmd7fX0KK1xkZWZccGFyc2Vhcmd1c2luZyMxIzJ7JQorICBcZGVmXGFyZ3RvcnVueyMyfSUKKyAgXGJlZ2luZ3JvdXAKKyAgICBcb2JleWxpbmVzCisgICAgXHNwYWNlaXNzcGFjZQorICAgICMxJQorICAgIFxwYXJzZWFyZ2xpbmVcZW1wdHklIEluc2VydCB0aGUgXGVtcHR5IHRva2VuLCBzZWUgXGZpbmlzaHBhcnNlYXJnIGJlbG93LgorfQorCit7XG9iZXlsaW5lcyAlCisgIFxnZGVmXHBhcnNlYXJnbGluZSMxXl5NeyUKKyAgICBcZW5kZ3JvdXAgJSBFbmQgb2YgdGhlIGdyb3VwIHN0YXJ0ZWQgaW4gXHBhcnNlYXJnLgorICAgIFxhcmdyZW1vdmVjb21tZW50ICMxXGNvbW1lbnRcQXJnVGVybSUKKyAgfSUKK30KKworJSBGaXJzdCByZW1vdmUgYW55IEBjb21tZW50LCB0aGVuIGFueSBAYyBjb21tZW50LgorXGRlZlxhcmdyZW1vdmVjb21tZW50IzFcY29tbWVudCMyXEFyZ1Rlcm17XGFyZ3JlbW92ZWMgIzFcY1xBcmdUZXJtfQorXGRlZlxhcmdyZW1vdmVjIzFcYyMyXEFyZ1Rlcm17XGFyZ2NoZWNrc3BhY2VzIzFcXl5NXEFyZ1Rlcm19CisKKyUgRWFjaCBvY2N1cmVuY2Ugb2YgYFxeXk0nIG9yIGA8c3BhY2U+XF5eTScgaXMgcmVwbGFjZWQgYnkgYSBzaW5nbGUgc3BhY2UuCislCislIFxhcmdyZW1vdmVjIG1pZ2h0IGxlYXZlIHVzIHdpdGggdHJhaWxpbmcgc3BhY2UsIGUuZy4sCislICAgIEBlbmQgaXRlbWl6ZSAgQGMgZm9vCislIFRoaXMgc3BhY2UgdG9rZW4gdW5kZXJnb2VzIHRoZSBzYW1lIHByb2NlZHVyZSBhbmQgaXMgZXZlbnR1YWxseSByZW1vdmVkCislIGJ5IFxmaW5pc2hwYXJzZWFyZy4KKyUKK1xkZWZcYXJnY2hlY2tzcGFjZXMjMVxeXk17XGFyZ2NoZWNrc3BhY2VzWCMxXF5eTSBcXl5NfQorXGRlZlxhcmdjaGVja3NwYWNlc1gjMSBcXl5Ne1xhcmdjaGVja3NwYWNlc1kjMVxeXk19CitcZGVmXGFyZ2NoZWNrc3BhY2VzWSMxXF5eTSMyXF5eTSMzXEFyZ1Rlcm17JQorICBcZGVmXHRlbXB7IzN9JQorICBcaWZ4XHRlbXBcZW1wdHkKKyAgICAlIERvIG5vdCB1c2UgXG5leHQsIHBlcmhhcHMgdGhlIGNhbGxlciBvZiBccGFyc2VhcmcgdXNlcyBpdDsgcmV1c2UgXHRlbXA6CisgICAgXGxldFx0ZW1wXGZpbmlzaHBhcnNlYXJnCisgIFxlbHNlCisgICAgXGxldFx0ZW1wXGFyZ2NoZWNrc3BhY2VzCisgIFxmaQorICAlIFB1dCB0aGUgc3BhY2UgdG9rZW4gaW46CisgIFx0ZW1wIzEgIzNcQXJnVGVybQorfQorCislIElmIGEgX2RlbGltaXRlZF8gYXJndW1lbnQgaXMgZW5jbG9zZWQgaW4gYnJhY2VzLCB0aGV5IGdldCBzdHJpcHBlZDsgc28KKyUgdG8gZ2V0IF9leGFjdGx5XyB0aGUgcmVzdCBvZiB0aGUgbGluZSwgd2UgaGFkIHRvIHByZXZlbnQgc3VjaCBzaXR1YXRpb24uCislIFdlIHByZXBlbmRlZCBhbiBcZW1wdHkgdG9rZW4gYXQgdGhlIHZlcnkgYmVnaW5uaW5nIGFuZCB3ZSBleHBhbmQgaXQgbm93LAorJSBqdXN0IGJlZm9yZSBwYXNzaW5nIHRoZSBjb250cm9sIHRvIFxhcmd0b3J1bi4KKyUgKFNpbWlsYXJpbHksIHdlIGhhdmUgdG8gdGhpbmsgYWJvdXQgIzMgb2YgXGFyZ2NoZWNrc3BhY2VzWSBhYm92ZTogaXQgaXMKKyUgZWl0aGVyIHRoZSBudWxsIHN0cmluZywgb3IgaXQgZW5kcyB3aXRoIFxeXk0tLS10aHVzIHRoZXJlIGlzIG5vIGRhbmdlcgorJSB0aGF0IGEgcGFpciBvZiBicmFjZXMgd291bGQgYmUgc3RyaXBwZWQuCislCislIEJ1dCBmaXJzdCwgd2UgaGF2ZSB0byByZW1vdmUgdGhlIHRyYWlsaW5nIHNwYWNlIHRva2VuLgorJQorXGRlZlxmaW5pc2hwYXJzZWFyZyMxIFxBcmdUZXJte1xleHBhbmRhZnRlclxhcmd0b3J1blxleHBhbmRhZnRlcnsjMX19CisKKyUgXHBhcnNlYXJnZGVmXGZvb3suLi59CislCWlzIHJvdWdobHkgZXF1aXZhbGVudCB0bworJSBcZGVmXGZvb3tccGFyc2VhcmdcWGZvb30KKyUgXGRlZlxYZm9vIzF7Li4ufQorJQorJSBBY3R1YWxseSwgSSB1c2UgXGNzbmFtZVxzdHJpbmdcZm9vXGVuZGNzbmFtZSwgaWUuIFxcZm9vLCBhcyBpdCBpcyBteQorJSBmYXZvdXJpdGUgVGVYIHRyaWNrLiAgLS1rYXNhbCwgMTZub3YwMworCitcZGVmXHBhcnNlYXJnZGVmIzF7JQorICBcZXhwYW5kYWZ0ZXIgXGRvcGFyc2VhcmdkZWYgXGNzbmFtZVxzdHJpbmcjMVxlbmRjc25hbWUgIzElCit9CitcZGVmXGRvcGFyc2VhcmdkZWYjMSMyeyUKKyAgXGRlZiMye1xwYXJzZWFyZyMxfSUKKyAgXGRlZiMxIyMxJQorfQorCislIFNldmVyYWwgdXRpbGl0eSBkZWZpbml0aW9ucyB3aXRoIGFjdGl2ZSBzcGFjZToKK3sKKyAgXG9iZXlzcGFjZXMKKyAgXGdkZWZcb2JleWVkc3BhY2V7IH0KKworICAlIE1ha2UgZWFjaCBzcGFjZSBjaGFyYWN0ZXIgaW4gdGhlIGlucHV0IHByb2R1Y2UgYSBub3JtYWwgaW50ZXJ3b3JkCisgICUgc3BhY2UgaW4gdGhlIG91dHB1dC4gIERvbid0IGFsbG93IGEgbGluZSBicmVhayBhdCB0aGlzIHNwYWNlLCBhcyB0aGlzCisgICUgaXMgdXNlZCBvbmx5IGluIGVudmlyb25tZW50cyBsaWtlIEBleGFtcGxlLCB3aGVyZSBlYWNoIGxpbmUgb2YgaW5wdXQKKyAgJSBzaG91bGQgcHJvZHVjZSBhIGxpbmUgb2Ygb3V0cHV0IGFueXdheS4KKyAgJQorICBcZ2RlZlxzZXBzcGFjZXN7XG9iZXlzcGFjZXNcbGV0ID1cdGllfQorCisgICUgSWYgYW4gaW5kZXggY29tbWFuZCBpcyB1c2VkIGluIGFuIEBleGFtcGxlIGVudmlyb25tZW50LCBhbnkgc3BhY2VzCisgICUgdGhlcmVpbiBzaG91bGQgYmVjb21lIHJlZ3VsYXIgc3BhY2VzIGluIHRoZSByYXcgaW5kZXggZmlsZSwgbm90IHRoZQorICAlIGV4cGFuc2lvbiBvZiBcdGllIChcbGVhdmV2bW9kZSBccGVuYWx0eSBcQE0gXCApLgorICBcZ2RlZlx1bnNlcHNwYWNlc3tcbGV0ID1cc3BhY2V9Cit9CisKKworXGRlZlxmbHVzaGNye1xpZnhccGFyXGxpc3BwYXIgXGRlZlxuZXh0IyMxe31cZWxzZSBcbGV0XG5leHQ9XHJlbGF4IFxmaSBcbmV4dH0KKworJSBEZWZpbmUgdGhlIGZyYW1ld29yayBmb3IgZW52aXJvbm1lbnRzIGluIHRleGluZm8udGV4LiAgSXQncyB1c2VkIGxpa2UgdGhpczoKKyUKKyUgICBcZW52ZGVmXGZvb3suLi59CislICAgXGRlZlxFZm9vey4uLn0KKyUKKyUgSXQncyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgXGVudmRlZiB0byBpbnNlcnQgXGJlZ2luZ3JvdXAgYmVmb3JlIHRoZQorJSBhY3R1YWwgYm9keTsgQGVuZCBjbG9zZXMgdGhlIGdyb3VwIGFmdGVyIGNhbGxpbmcgXEVmb28uICBcZW52ZGVmIGFsc28KKyUgZGVmaW5lcyBcdGhpc2Vudiwgc28gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgaXMga25vd247IEBlbmQgY2hlY2tzCislIHdoZXRoZXIgdGhlIGVudmlyb25tZW50IG5hbWUgbWF0Y2hlcy4gIFRoZSBcY2hlY2tlbnYgbWFjcm8gY2FuIGFsc28gYmUKKyUgdXNlZCB0byBjaGVjayB3aGV0aGVyIHRoZSBjdXJyZW50IGVudmlyb25tZW50IGlzIHRoZSBvbmUgZXhwZWN0ZWQuCislCislIE5vbi1mYWxzZSBjb25kaXRpb25hbHMgKEBpZnRleCwgQGlmc2V0KSBkb24ndCBmaXQgaW50byB0aGlzLCBzbyB0aGV5CislIGFyZSBub3QgdHJlYXRlZCBhcyBlbnZpcm9tZW50czsgdGhleSBkb24ndCBvcGVuIGEgZ3JvdXAuICAoVGhlCislIGltcGxlbWVudGF0aW9uIG9mIEBlbmQgdGFrZXMgY2FyZSBub3QgdG8gY2FsbCBcZW5kZ3JvdXAgaW4gdGhpcworJSBzcGVjaWFsIGNhc2UuKQorCisKKyUgQXQgcnVudGltZSwgZW52aXJvbm1lbnRzIHN0YXJ0IHdpdGggdGhpczoKK1xkZWZcc3RhcnRlbnZpcm9ubWVudCMxe1xiZWdpbmdyb3VwXGRlZlx0aGlzZW52eyMxfX0KKyUgaW5pdGlhbGl6ZQorXGxldFx0aGlzZW52XGVtcHR5CisKKyUgLi4uIGJ1dCB0aGV5IGdldCBkZWZpbmVkIHZpYSBgYFxlbnZkZWZcZm9vey4uLn0nJzoKK1xsb25nXGRlZlxlbnZkZWYjMSMye1xkZWYjMXtcc3RhcnRlbnZpcm9ubWVudCMxIzJ9fQorXGRlZlxlbnZwYXJzZWFyZ2RlZiMxIzJ7XHBhcnNlYXJnZGVmIzF7XHN0YXJ0ZW52aXJvbm1lbnQjMSMyfX0KKworJSBDaGVjayB3aGV0aGVyIHdlJ3JlIGluIHRoZSByaWdodCBlbnZpcm9ubWVudDoKK1xkZWZcY2hlY2tlbnYjMXslCisgIFxkZWZcdGVtcHsjMX0lCisgIFxpZnhcdGhpc2Vudlx0ZW1wCisgIFxlbHNlCisgICAgXGJhZGVudmVycgorICBcZmkKK30KKworJSBFdmlyb25tZW50IG1pc21hdGNoLCAjMSBleHBlY3RlZDoKK1xkZWZcYmFkZW52ZXJyeyUKKyAgXGVycmhlbHAgPSBcRU1zaW1wbGUKKyAgXGVycm1lc3NhZ2V7VGhpcyBjb21tYW5kIGNhbiBhcHBlYXIgb25seSBcaW5lbnZpcm9ubWVudFx0ZW1wLAorICAgIG5vdCBcaW5lbnZpcm9ubWVudFx0aGlzZW52fSUKK30KK1xkZWZcaW5lbnZpcm9ubWVudCMxeyUKKyAgXGlmeCMxXGVtcHR5CisgICAgb3V0IG9mIGFueSBlbnZpcm9ubWVudCUKKyAgXGVsc2UKKyAgICBpbiBlbnZpcm9ubWVudCBcZXhwYW5kYWZ0ZXJcc3RyaW5nIzElCisgIFxmaQorfQorCislIEBlbmQgZm9vIGV4ZWN1dGVzIHRoZSBkZWZpbml0aW9uIG9mIFxFZm9vLgorJSBCdXQgZmlyc3QsIGl0IGV4ZWN1dGVzIGEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBcY2hlY2tlbnYKKyUKK1xwYXJzZWFyZ2RlZlxlbmR7JQorICBcaWYgMVxjc25hbWUgaXNjb25kLiMxXGVuZGNzbmFtZQorICBcZWxzZQorICAgICUgVGhlIGdlbmVyYWwgd29yZGluZyBvZiBcYmFkZW52ZXJyIG1heSBub3QgYmUgaWRlYWwsIGJ1dC4uLiAtLWthc2FsLCAwNm5vdjAzCisgICAgXGV4cGFuZGFmdGVyXGNoZWNrZW52XGNzbmFtZSMxXGVuZGNzbmFtZQorICAgIFxjc25hbWUgRSMxXGVuZGNzbmFtZQorICAgIFxlbmRncm91cAorICBcZmkKK30KKworXG5ld2hlbHBcRU1zaW1wbGV7UHJlc3MgUkVUVVJOIHRvIGNvbnRpbnVlLn0KKworCislJSBTaW1wbGUgc2luZ2xlLWNoYXJhY3RlciBAIGNvbW1hbmRzCisKKyUgQEAgcHJpbnRzIGFuIEAKKyUgS2x1ZGdlIHRoaXMgdW50aWwgdGhlIGZvbnRzIGFyZSByaWdodCAoZ3JyKS4KK1xkZWZcQHt7XHR0XGNoYXI2NH19CisKKyUgVGhpcyBpcyB0dXJuZWQgb2ZmIGJlY2F1c2UgaXQgd2FzIG5ldmVyIGRvY3VtZW50ZWQKKyUgYW5kIHlvdSBjYW4gdXNlIEB3ey4uLn0gYXJvdW5kIGEgcXVvdGUgdG8gc3VwcHJlc3MgbGlnYXR1cmVzLgorJSUgRGVmaW5lIEBgIGFuZCBAJyB0byBiZSB0aGUgc2FtZSBhcyBgIGFuZCAnCislJSBidXQgc3VwcHJlc3NpbmcgbGlnYXR1cmVzLgorJVxkZWZcYHt7YH19CislXGRlZlwne3snfX0KKworJSBVc2VkIHRvIGdlbmVyYXRlIHF1b3RlZCBicmFjZXMuCitcZGVmXG15bGJyYWNlIHt7XHR0XGNoYXIxMjN9fQorXGRlZlxteXJicmFjZSB7e1x0dFxjaGFyMTI1fX0KK1xsZXRcez1cbXlsYnJhY2UKK1xsZXRcfT1cbXlyYnJhY2UKK1xiZWdpbmdyb3VwCisgICUgRGVmaW5pdGlvbnMgdG8gcHJvZHVjZSBceyBhbmQgXH0gY29tbWFuZHMgZm9yIGluZGljZXMsCisgICUgYW5kIEB7IGFuZCBAfSBmb3IgdGhlIGF1eC90b2MgZmlsZXMuCisgIFxjYXRjb2RlYFx7ID0gXG90aGVyIFxjYXRjb2RlYFx9ID0gXG90aGVyCisgIFxjYXRjb2RlYFxbID0gMSBcY2F0Y29kZWBcXSA9IDIKKyAgXGNhdGNvZGVgXCEgPSAwIFxjYXRjb2RlYFxcID0gXG90aGVyCisgICFnZGVmIWxicmFjZWNtZFtce10lCisgICFnZGVmIXJicmFjZWNtZFtcfV0lCisgICFnZGVmIWxicmFjZWF0Y21kW0B7XSUKKyAgIWdkZWYhcmJyYWNlYXRjbWRbQH1dJQorIWVuZGdyb3VwCisKKyUgQGNvbW1he30gdG8gYXZvaWQgLCBwYXJzaW5nIHByb2JsZW1zLgorXGxldFxjb21tYSA9ICwKKworJSBBY2NlbnRzOiBALCBAZG90YWNjZW50IEByaW5nYWNjZW50IEB1YmFyYWNjZW50IEB1ZG90YWNjZW50CislIE90aGVycyBhcmUgZGVmaW5lZCBieSBwbGFpbiBUZVg6IEBgIEAnIEAiIEBeIEB+IEA9IEB1IEB2IEBILgorXGxldFwsID0gXGMKK1xsZXRcZG90YWNjZW50ID0gXC4KK1xkZWZccmluZ2FjY2VudCMxe3tcYWNjZW50MjMgIzF9fQorXGxldFx0aWVhY2NlbnQgPSBcdAorXGxldFx1YmFyYWNjZW50ID0gXGIKK1xsZXRcdWRvdGFjY2VudCA9IFxkCisKKyUgT3RoZXIgc3BlY2lhbCBjaGFyYWN0ZXJzOiBAcXVlc3Rpb25kb3duIEBleGNsYW1kb3duIEBvcmRmIEBvcmRtCislIFBsYWluIFRlWCBkZWZpbmVzOiBAQUEgQEFFIEBPIEBPRSBATCAocGx1cyBsb3dlcmNhc2UgdmVyc2lvbnMpIEBzcy4KK1xkZWZccXVlc3Rpb25kb3duez9gfQorXGRlZlxleGNsYW1kb3dueyFgfQorXGRlZlxvcmRme1xsZWF2ZXZtb2RlXHJhaXNlMWV4XGhib3h7XHNlbGVjdGZvbnRzXGxsbHNpemUgXHVuZGVyYmFye2F9fX0KK1xkZWZcb3JkbXtcbGVhdmV2bW9kZVxyYWlzZTFleFxoYm94e1xzZWxlY3Rmb250c1xsbGxzaXplIFx1bmRlcmJhcntvfX19CisKKyUgRG90bGVzcyBpIGFuZCBkb3RsZXNzIGosIHVzZWQgZm9yIGFjY2VudHMuCitcZGVmXGltYWNyb3tpfQorXGRlZlxqbWFjcm97an0KK1xkZWZcZG90bGVzcyMxeyUKKyAgXGRlZlx0ZW1weyMxfSUKKyAgXGlmeFx0ZW1wXGltYWNybyBccHRleGkKKyAgXGVsc2VcaWZ4XHRlbXBcam1hY3JvIFxqCisgIFxlbHNlIFxlcnJtZXNzYWdle0Bkb3RsZXNzIGNhbiBiZSB1c2VkIG9ubHkgd2l0aCBpIG9yIGp9JQorICBcZmlcZmkKK30KKworJSBUaGUgXFRlWHt9IGxvZ28sIGFzIGluIHBsYWluLCBidXQgcmVzZXR0aW5nIHRoZSBzcGFjaW5nIHNvIHRoYXQgYQorJSBwZXJpb2QgZm9sbG93aW5nIGNvdW50cyBhcyBlbmRpbmcgYSBzZW50ZW5jZS4gIChJZGVhIGZvdW5kIGluIGxhdGV4LikKKyUKK1xlZGVmXFRlWHtcVGVYIFxzcGFjZWZhY3Rvcj0xMDAwIH0KKworJSBATGFUZVh7fSBsb2dvLiAgTm90IHF1aXRlIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIGRlZmluaXRpb24gaW4KKyUgbGF0ZXgubHR4LCBzaW5jZSB3ZSB1c2UgYSBkaWZmZXJlbnQgZm9udCBmb3IgdGhlIHJhaXNlZCBBOyBpdCdzIG1vc3QKKyUgY29udmVuaWVudCBmb3IgdXMgdG8gdXNlIGFuIGV4cGxpY2l0bHkgc21hbGxlciBmb250LCByYXRoZXIgdGhhbiB1c2luZworJSB0aGUgXHNjcmlwdHN0eWxlIGZvbnQgKHNpbmNlIHdlIGRvbid0IHJlc2V0IFxzY3JpcHRzdHlsZSBhbmQKKyUgXHNjcmlwdHNjcmlwdHN0eWxlKS4KKyUKK1xkZWZcTGFUZVh7JQorICBMXGtlcm4tLjM2ZW0KKyAge1xzZXRib3gwPVxoYm94e1R9JQorICAgXHZib3ggdG8gXGh0MHtcaGJveHtcc2VsZWN0Zm9udHNcbGxsc2l6ZSBBfVx2c3N9fSUKKyAgXGtlcm4tLjE1ZW0KKyAgXFRlWAorfQorCislIEJlIHN1cmUgd2UncmUgaW4gaG9yaXpvbnRhbCBtb2RlIHdoZW4gZG9pbmcgYSB0aWUsIHNpbmNlIHdlIG1ha2Ugc3BhY2UKKyUgZXF1aXZhbGVudCB0byB0aGlzIGluIEBleGFtcGxlLWxpa2UgZW52aXJvbm1lbnRzLiBPdGhlcndpc2UsIGEgc3BhY2UKKyUgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUgd2lsbCBzdGFydCB3aXRoIFxwZW5hbHR5IC0tIGFuZAorJSBzaW5jZSBccGVuYWx0eSBpcyB2YWxpZCBpbiB2ZXJ0aWNhbCBtb2RlLCB3ZSdkIGVuZCB1cCBwdXR0aW5nIHRoZQorJSBwZW5hbHR5IG9uIHRoZSB2ZXJ0aWNhbCBsaXN0IGluc3RlYWQgb2YgaW4gdGhlIG5ldyBwYXJhZ3JhcGguCit7XGNhdGNvZGVgQCA9IDExCisgJSBBdm9pZCB1c2luZyBcQE0gZGlyZWN0bHksIGJlY2F1c2UgdGhhdCBjYXVzZXMgdHJvdWJsZQorICUgaWYgdGhlIGRlZmluaXRpb24gaXMgd3JpdHRlbiBpbnRvIGFuIGluZGV4IGZpbGUuCisgXGdsb2JhbFxsZXRcdGllcGVuYWx0eSA9IFxATQorIFxnZGVmXHRpZXtcbGVhdmV2bW9kZVxwZW5hbHR5XHRpZXBlbmFsdHlcIH0KK30KKworJSBAOiBmb3JjZXMgbm9ybWFsIHNpemUgd2hpdGVzcGFjZSBmb2xsb3dpbmcuCitcZGVmXDp7XHNwYWNlZmFjdG9yPTEwMDAgfQorCislIEAqIGZvcmNlcyBhIGxpbmUgYnJlYWsuCitcZGVmXCp7XGhmaWxcYnJlYWtcaGJveHt9XGlnbm9yZXNwYWNlc30KKworJSBALyBhbGxvd3MgYSBsaW5lIGJyZWFrLgorXGxldFwvPVxhbGxvd2JyZWFrCisKKyUgQC4gaXMgYW4gZW5kLW9mLXNlbnRlbmNlIHBlcmlvZC4KK1xkZWZcLnsuXHNwYWNlZmFjdG9yPVxlbmRvZnNlbnRlbmNlc3BhY2VmYWN0b3Jcc3BhY2V9CisKKyUgQCEgaXMgYW4gZW5kLW9mLXNlbnRlbmNlIGJhbmcuCitcZGVmXCF7IVxzcGFjZWZhY3Rvcj1cZW5kb2ZzZW50ZW5jZXNwYWNlZmFjdG9yXHNwYWNlfQorCislIEA/IGlzIGFuIGVuZC1vZi1zZW50ZW5jZSBxdWVyeS4KK1xkZWZcP3s/XHNwYWNlZmFjdG9yPVxlbmRvZnNlbnRlbmNlc3BhY2VmYWN0b3Jcc3BhY2V9CisKKyUgQGZyZW5jaHNwYWNpbmcgb258b2ZmICBzYXlzIHdoZXRoZXIgdG8gcHV0IGV4dHJhIHNwYWNlIGFmdGVyIHB1bmN0dWF0aW9uLgorJSAKK1xkZWZcb253b3Jke29ufQorXGRlZlxvZmZ3b3Jke29mZn0KKyUKK1xwYXJzZWFyZ2RlZlxmcmVuY2hzcGFjaW5neyUKKyAgXGRlZlx0ZW1weyMxfSUKKyAgXGlmeFx0ZW1wXG9ud29yZCBccGxhaW5mcmVuY2hzcGFjaW5nCisgIFxlbHNlXGlmeFx0ZW1wXG9mZndvcmQgXHBsYWlubm9uZnJlbmNoc3BhY2luZworICBcZWxzZQorICAgIFxlcnJoZWxwID0gXEVNc2ltcGxlCisgICAgXGVycm1lc3NhZ2V7VW5rbm93biBAZnJlbmNoc3BhY2luZyBvcHRpb24gYFx0ZW1wJywgbXVzdCBiZSBvbi9vZmZ9JQorICBcZmlcZmkKK30KKworJSBAdyBwcmV2ZW50cyBhIHdvcmQgYnJlYWsuICBXaXRob3V0IHRoZSBcbGVhdmV2bW9kZSwgQHcgYXQgdGhlCislIGJlZ2lubmluZyBvZiBhIHBhcmFncmFwaCwgd2hlbiBUZVggaXMgc3RpbGwgaW4gdmVydGljYWwgbW9kZSwgd291bGQKKyUgcHJvZHVjZSBhIHdob2xlIGxpbmUgb2Ygb3V0cHV0IGluc3RlYWQgb2Ygc3RhcnRpbmcgdGhlIHBhcmFncmFwaC4KK1xkZWZcdyMxe1xsZWF2ZXZtb2RlXGhib3h7IzF9fQorCislIEBncm91cCAuLi4gQGVuZCBncm91cCBmb3JjZXMgLi4uIHRvIGJlIGFsbCBvbiBvbmUgcGFnZSwgYnkgZW5jbG9zaW5nCislIGl0IGluIGEgVGVYIHZib3guICBXZSB1c2UgXHZ0b3AgaW5zdGVhZCBvZiBcdmJveCB0byBjb25zdHJ1Y3QgdGhlIGJveAorJSB0byBrZWVwIGl0cyBoZWlnaHQgdGhhdCBvZiBhIG5vcm1hbCBsaW5lLiAgQWNjb3JkaW5nIHRvIHRoZSBydWxlcyBmb3IKKyUgXHRvcHNraXAgKHAuMTE0IG9mIHRoZSBUZVhib29rKSwgdGhlIGdsdWUgaW5zZXJ0ZWQgaXMKKyUgbWF4IChcdG9wc2tpcCAtIFxodCAoZmlyc3QgaXRlbSksIDApLiAgSWYgdGhhdCBoZWlnaHQgaXMgbGFyZ2UsCislIHRoZXJlZm9yZSwgbm8gZ2x1ZSBpcyBpbnNlcnRlZCwgYW5kIHRoZSBzcGFjZSBiZXR3ZWVuIHRoZSBoZWFkbGluZSBhbmQKKyUgdGhlIHRleHQgaXMgc21hbGwsIHdoaWNoIGxvb2tzIGJhZC4KKyUKKyUgQW5vdGhlciBjb21wbGljYXRpb24gaXMgdGhhdCB0aGUgZ3JvdXAgbWlnaHQgYmUgdmVyeSBsYXJnZS4gIFRoaXMgY2FuCislIGNhdXNlIHRoZSBnbHVlIG9uIHRoZSBwcmV2aW91cyBwYWdlIHRvIGJlIHVuZHVseSBzdHJldGNoZWQsIGJlY2F1c2UgaXQKKyUgZG9lcyBub3QgaGF2ZSBtdWNoIG1hdGVyaWFsLiAgSW4gdGhpcyBjYXNlLCBpdCdzIGJldHRlciB0byBhZGQgYW4KKyUgZXhwbGljaXQgXHZmaWxsIHNvIHRoYXQgdGhlIGV4dHJhIHNwYWNlIGlzIGF0IHRoZSBib3R0b20uICBUaGUKKyUgdGhyZXNob2xkIGZvciBkb2luZyB0aGlzIGlzIGlmIHRoZSBncm91cCBpcyBtb3JlIHRoYW4gXHZmaWxsbGltaXQKKyUgcGVyY2VudCBvZiBhIHBhZ2UgKFx2ZmlsbGxpbWl0IGNhbiBiZSBjaGFuZ2VkIGluc2lkZSBvZiBAdGV4KS4KKyUKK1xuZXdib3hcZ3JvdXBib3gKK1xkZWZcdmZpbGxsaW1pdHswLjd9CislCitcZW52ZGVmXGdyb3VweyUKKyAgXGlmbnVtXGNhdGNvZGVgXF5eTT1cYWN0aXZlIFxlbHNlCisgICAgXGVycmhlbHAgPSBcZ3JvdXBpbnZhbGlkaGVscAorICAgIFxlcnJtZXNzYWdle0Bncm91cCBpbnZhbGlkIGluIGNvbnRleHQgd2hlcmUgZmlsbGluZyBpcyBlbmFibGVkfSUKKyAgXGZpCisgIFxzdGFydHNhdmluZ2luc2VydHMKKyAgJQorICBcc2V0Ym94XGdyb3VwYm94ID0gXHZ0b3BcYmdyb3VwCisgICAgJSBEbyBAY29tbWVudCBzaW5jZSB3ZSBhcmUgY2FsbGVkIGluc2lkZSBhbiBlbnZpcm9ubWVudCBzdWNoIGFzCisgICAgJSBAZXhhbXBsZSwgd2hlcmUgZWFjaCBlbmQtb2YtbGluZSBpbiB0aGUgaW5wdXQgY2F1c2VzIGFuCisgICAgJSBlbmQtb2YtbGluZSBpbiB0aGUgb3V0cHV0LiAgV2UgZG9uJ3Qgd2FudCB0aGUgZW5kLW9mLWxpbmUgYWZ0ZXIKKyAgICAlIHRoZSBgQGdyb3VwJyB0byBwdXQgZXh0cmEgc3BhY2UgaW4gdGhlIG91dHB1dC4gIFNpbmNlIEBncm91cAorICAgICUgc2hvdWxkIGFwcGVhciBvbiBhIGxpbmUgYnkgaXRzZWxmIChhY2NvcmRpbmcgdG8gdGhlIFRleGluZm8KKyAgICAlIG1hbnVhbCksIHdlIGRvbid0IHdvcnJ5IGFib3V0IGVhdGluZyBhbnkgdXNlciB0ZXh0LgorICAgIFxjb21tZW50Cit9CislCislIFRoZSBcdnRvcCBwcm9kdWNlcyBhIGJveCB3aXRoIG5vcm1hbCBoZWlnaHQgYW5kIGxhcmdlIGRlcHRoOyB0aHVzLCBUZVggcHV0cworJSBcYmFzZWxpbmVza2lwIGdsdWUgYmVmb3JlIGl0LCBhbmQgKHdoZW4gdGhlIG5leHQgbGluZSBvZiB0ZXh0IGlzIGRvbmUpCislIFxsaW5lc2tpcCBnbHVlIGFmdGVyIGl0LiAgVGh1cywgc3BhY2UgYmVsb3cgaXMgbm90IHF1aXRlIGVxdWFsIHRvIHNwYWNlCislIGFib3ZlLiAgQnV0IGl0J3MgcHJldHR5IGNsb3NlLgorXGRlZlxFZ3JvdXB7JQorICAgICUgVG8gZ2V0IGNvcnJlY3QgaW50ZXJsaW5lIHNwYWNlIGJldHdlZW4gdGhlIGxhc3QgbGluZSBvZiB0aGUgZ3JvdXAKKyAgICAlIGFuZCB0aGUgZmlyc3QgbGluZSBhZnRlcndhcmRzLCB3ZSBoYXZlIHRvIHByb3BhZ2F0ZSBccHJldmRlcHRoLgorICAgIFxlbmRncmFmICUgTm90IFxwYXIsIGFzIGl0IG1heSBoYXZlIGJlZW4gc2V0IHRvIFxsaXNwcGFyLgorICAgIFxnbG9iYWxcZGltZW4xID0gXHByZXZkZXB0aAorICBcZWdyb3VwICAgICAgICAgICAlIEVuZCB0aGUgXHZ0b3AuCisgICUgXGRpbWVuMCBpcyB0aGUgdmVydGljYWwgc2l6ZSBvZiB0aGUgZ3JvdXAncyBib3guCisgIFxkaW1lbjAgPSBcaHRcZ3JvdXBib3ggIFxhZHZhbmNlXGRpbWVuMCBieSBcZHBcZ3JvdXBib3gKKyAgJSBcZGltZW4yIGlzIGhvdyBtdWNoIHNwYWNlIGlzIGxlZnQgb24gdGhlIHBhZ2UgKG1vcmUgb3IgbGVzcykuCisgIFxkaW1lbjIgPSBccGFnZWhlaWdodCAgIFxhZHZhbmNlXGRpbWVuMiBieSAtXHBhZ2V0b3RhbAorICAlIGlmIHRoZSBncm91cCBkb2Vzbid0IGZpdCBvbiB0aGUgY3VycmVudCBwYWdlLCBhbmQgaXQncyBhIGJpZyBiaWcKKyAgJSBncm91cCwgZm9yY2UgYSBwYWdlIGJyZWFrLgorICBcaWZkaW0gXGRpbWVuMCA+IFxkaW1lbjIKKyAgICBcaWZkaW0gXHBhZ2V0b3RhbCA8IFx2ZmlsbGxpbWl0XHBhZ2VoZWlnaHQKKyAgICAgIFxwYWdlCisgICAgXGZpCisgIFxmaQorICBcYm94XGdyb3VwYm94CisgIFxwcmV2ZGVwdGggPSBcZGltZW4xCisgIFxjaGVja2luc2VydHMKK30KKyUKKyUgVGVYIHB1dHMgaW4gYW4gXGVzY2FwZWNoYXIgKGkuZS4sIGBAJykgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaGVscAorJSBtZXNzYWdlLCBzbyB0aGlzIGVuZHMgdXAgcHJpbnRpbmcgYEBncm91cCBjYW4gb25seSAuLi4nLgorJQorXG5ld2hlbHBcZ3JvdXBpbnZhbGlkaGVscHslCitncm91cCBjYW4gb25seSBiZSB1c2VkIGluIGVudmlyb25tZW50cyBzdWNoIGFzIEBleGFtcGxlLF5eSiUKK3doZXJlIGVhY2ggbGluZSBvZiBpbnB1dCBwcm9kdWNlcyBhIGxpbmUgb2Ygb3V0cHV0Ln0KKworJSBAbmVlZCBzcGFjZS1pbi1taWxzCislIGZvcmNlcyBhIHBhZ2UgYnJlYWsgaWYgdGhlcmUgaXMgbm90IHNwYWNlLWluLW1pbHMgcmVtYWluaW5nLgorCitcbmV3ZGltZW5cbWlsICBcbWlsPTAuMDAxaW4KKworJSBPbGQgZGVmaW5pdGlvbi0tZGlkbid0IHdvcmsuCislXHBhcnNlYXJnZGVmXG5lZWR7XHBhciAlCislJSBUaGlzIG1ldGhvZCB0cmllcyB0byBtYWtlIFRlWCBicmVhayB0aGUgcGFnZSBuYXR1cmFsbHkKKyUlIGlmIHRoZSBkZXB0aCBvZiB0aGUgYm94IGRvZXMgbm90IGZpdC4KKyV7XGJhc2VsaW5lc2tpcD0wcHQlCislXHZ0b3AgdG8gIzFcbWlse1x2ZmlsfVxrZXJuIC0jMVxtaWxcbm9icmVhaworJVxwcmV2ZGVwdGg9LTEwMDBwdAorJX19CisKK1xwYXJzZWFyZ2RlZlxuZWVkeyUKKyAgJSBFbnN1cmUgdmVydGljYWwgbW9kZSwgc28gd2UgZG9uJ3QgbWFrZSBhIGJpZyBib3ggaW4gdGhlIG1pZGRsZSBvZiBhCisgICUgcGFyYWdyYXBoLgorICBccGFyCisgICUKKyAgJSBJZiB0aGUgQG5lZWQgdmFsdWUgaXMgbGVzcyB0aGFuIG9uZSBsaW5lIHNwYWNlLCBpdCdzIHVzZWxlc3MuCisgIFxkaW1lbjAgPSAjMVxtaWwKKyAgXGRpbWVuMiA9IFxodFxzdHJ1dGJveAorICBcYWR2YW5jZVxkaW1lbjIgYnkgXGRwXHN0cnV0Ym94CisgIFxpZmRpbVxkaW1lbjAgPiBcZGltZW4yCisgICAgJQorICAgICUgRG8gYSBcc3RydXQganVzdCB0byBtYWtlIHRoZSBoZWlnaHQgb2YgdGhpcyBib3ggYmUgbm9ybWFsLCBzbyB0aGUKKyAgICAlIG5vcm1hbCBsZWFkaW5nIGlzIGluc2VydGVkIHJlbGF0aXZlIHRvIHRoZSBwcmVjZWRpbmcgbGluZS4KKyAgICAlIEFuZCBhIHBhZ2UgYnJlYWsgaGVyZSBpcyBmaW5lLgorICAgIFx2dG9wIHRvICMxXG1pbHtcc3RydXRcdmZpbH0lCisgICAgJQorICAgICUgVGVYIGRvZXMgbm90IGV2ZW4gY29uc2lkZXIgcGFnZSBicmVha3MgaWYgYSBwZW5hbHR5IGFkZGVkIHRvIHRoZQorICAgICUgbWFpbiB2ZXJ0aWNhbCBsaXN0IGlzIDEwMDAwIG9yIG1vcmUuICBCdXQgaW4gb3JkZXIgdG8gc2VlIGlmIHRoZQorICAgICUgZW1wdHkgYm94IHdlIGp1c3QgYWRkZWQgZml0cyBvbiB0aGUgcGFnZSwgd2UgbXVzdCBtYWtlIGl0IGNvbnNpZGVyCisgICAgJSBwYWdlIGJyZWFrcy4gIE9uIHRoZSBvdGhlciBoYW5kLCB3ZSBkb24ndCB3YW50IHRvIGFjdHVhbGx5IGJyZWFrIHRoZQorICAgICUgcGFnZSBhZnRlciB0aGUgZW1wdHkgYm94LiAgU28gd2UgdXNlIGEgcGVuYWx0eSBvZiA5OTk5LgorICAgICUKKyAgICAlIFRoZXJlIGlzIGFuIGV4dHJlbWVseSBzbWFsbCBjaGFuY2UgdGhhdCBUZVggd2lsbCBhY3R1YWxseSBicmVhayB0aGUKKyAgICAlIHBhZ2UgYXQgdGhpcyBccGVuYWx0eSwgaWYgdGhlcmUgYXJlIG5vIG90aGVyIGZlYXNpYmxlIGJyZWFrcG9pbnRzIGluCisgICAgJSBzaWdodC4gIChJZiB0aGUgdXNlciBpcyB1c2luZyBsb3RzIG9mIGJpZyBAZ3JvdXAgY29tbWFuZHMsIHdoaWNoCisgICAgJSBhbG1vc3QtYnV0LW5vdC1xdWl0ZSBmaWxsIHVwIGEgcGFnZSwgVGVYIHdpbGwgaGF2ZSBhIGhhcmQgdGltZSBkb2luZworICAgICUgZ29vZCBwYWdlIGJyZWFraW5nLCBmb3IgZXhhbXBsZS4pICBIb3dldmVyLCBJIGNvdWxkIG5vdCBjb25zdHJ1Y3QgYW4KKyAgICAlIGV4YW1wbGUgd2hlcmUgYSBwYWdlIGJyb2tlIGF0IHRoaXMgXHBlbmFsdHk7IGlmIGl0IGhhcHBlbnMgaW4gYSByZWFsCisgICAgJSBkb2N1bWVudCwgdGhlbiB3ZSBjYW4gcmVjb25zaWRlciBvdXIgc3RyYXRlZ3kuCisgICAgXHBlbmFsdHk5OTk5CisgICAgJQorICAgICUgQmFjayB1cCBieSB0aGUgc2l6ZSBvZiB0aGUgYm94LCB3aGV0aGVyIHdlIGRpZCBhIHBhZ2UgYnJlYWsgb3Igbm90LgorICAgIFxrZXJuIC0jMVxtaWwKKyAgICAlCisgICAgJSBEbyBub3QgYWxsb3cgYSBwYWdlIGJyZWFrIHJpZ2h0IGFmdGVyIHRoaXMga2Vybi4KKyAgICBcbm9icmVhaworICBcZmkKK30KKworJSBAYnIgICBmb3JjZXMgcGFyYWdyYXBoIGJyZWFrIChhbmQgaXMgdW5kb2N1bWVudGVkKS4KKworXGxldFxiciA9IFxwYXIKKworJSBAcGFnZSBmb3JjZXMgdGhlIHN0YXJ0IG9mIGEgbmV3IHBhZ2UuCislCitcZGVmXHBhZ2V7XHBhclx2ZmlsbFxzdXBlcmVqZWN0fQorCislIEBleGRlbnQgdGV4dC4uLi4KKyUgb3V0cHV0cyB0ZXh0IG9uIHNlcGFyYXRlIGxpbmUgaW4gcm9tYW4gZm9udCwgc3RhcnRpbmcgYXQgc3RhbmRhcmQgcGFnZSBtYXJnaW4KKworJSBUaGlzIHJlY29yZHMgdGhlIGFtb3VudCBvZiBpbmRlbnQgaW4gdGhlIGlubmVybW9zdCBlbnZpcm9ubWVudC4KKyUgVGhhdCdzIGhvdyBtdWNoIFxleGRlbnQgc2hvdWxkIHRha2Ugb3V0LgorXG5ld3NraXBcZXhkZW50YW1vdW50CisKKyUgVGhpcyBkZWZuIGlzIHVzZWQgaW5zaWRlIGZpbGwgZW52aXJvbm1lbnRzIHN1Y2ggYXMgQGRlZnVuLgorXHBhcnNlYXJnZGVmXGV4ZGVudHtcaGZpbFxicmVha1xoYm94e1xrZXJuIC1cZXhkZW50YW1vdW50e1xybSMxfX1caGZpbFxicmVha30KKworJSBUaGlzIGRlZm4gaXMgdXNlZCBpbnNpZGUgbm9maWxsIGVudmlyb25tZW50cyBzdWNoIGFzIEBleGFtcGxlLgorXHBhcnNlYXJnZGVmXG5vZmlsbGV4ZGVudHt7XGFkdmFuY2UgXGxlZnRza2lwIGJ5IC1cZXhkZW50YW1vdW50CisgIFxsZWZ0bGluZXtcaHNraXBcbGVmdHNraXB7XHJtIzF9fX19CisKKyUgQGlubWFyZ2lue1dISUNIfXtURVhUfSBwdXRzIFRFWFQgaW4gdGhlIFdISUNIIG1hcmdpbiBuZXh0IHRvIHRoZSBjdXJyZW50CislIHBhcmFncmFwaC4gIEZvciBtb3JlIGdlbmVyYWwgcHVycG9zZXMsIHVzZSB0aGUgXG1hcmdpbiBpbnNlcnRpb24KKyUgY2xhc3MuICBXSElDSCBpcyBgbCcgb3IgYHInLgorJQorXG5ld3NraXBcaW5tYXJnaW5zcGFjaW5nIFxpbm1hcmdpbnNwYWNpbmc9MWNtCitcZGVmXHN0cnV0ZGVwdGh7XGRwXHN0cnV0Ym94fQorJQorXGRlZlxkb2lubWFyZ2luIzEjMntcc3RydXRcdmFkanVzdHslCisgIFxub2JyZWFrCisgIFxrZXJuLVxzdHJ1dGRlcHRoCisgIFx2dG9wIHRvIFxzdHJ1dGRlcHRoeyUKKyAgICBcYmFzZWxpbmVza2lwPVxzdHJ1dGRlcHRoCisgICAgXHZzcworICAgICUgaWYgeW91IGhhdmUgbXVsdGlwbGUgbGluZXMgb2Ygc3R1ZmYgdG8gcHV0IGhlcmUsIHlvdSdsbCBuZWVkIHRvCisgICAgJSBtYWtlIHRoZSB2Ym94IHlvdXJzZWxmIG9mIHRoZSBhcHByb3ByaWF0ZSBzaXplLgorICAgIFxpZngjMWwlCisgICAgICBcbGxhcHtcaWdub3Jlc3BhY2VzICMyXGhza2lwXGlubWFyZ2luc3BhY2luZ30lCisgICAgXGVsc2UKKyAgICAgIFxybGFwe1xoc2tpcFxoc2l6ZSBcaHNraXBcaW5tYXJnaW5zcGFjaW5nIFxpZ25vcmVzcGFjZXMgIzJ9JQorICAgIFxmaQorICAgIFxudWxsCisgIH0lCit9fQorXGRlZlxpbmxlZnRtYXJnaW57XGRvaW5tYXJnaW4gbH0KK1xkZWZcaW5yaWdodG1hcmdpbntcZG9pbm1hcmdpbiByfQorJQorJSBAaW5tYXJnaW57VEVYVCBbLCBSSUdIVC1URVhUXX0KKyUgKGlmIFJJR0hULVRFWFQgaXMgZ2l2ZW4sIHVzZSBURVhUIGZvciBsZWZ0IHBhZ2UsIFJJR0hULVRFWFQgZm9yIHJpZ2h0OworJSBlbHNlIHVzZSBURVhUIGZvciBib3RoKS4KKyUKK1xkZWZcaW5tYXJnaW4jMXtccGFyc2Vpbm1hcmdpbiAjMSwsXGZpbmlzaH0KK1xkZWZccGFyc2Vpbm1hcmdpbiMxLCMyLCMzXGZpbmlzaHslIG5vdCBwZXJmZWN0LCBidXQgYmV0dGVyIHRoYW4gbm90aGluZy4KKyAgXHNldGJveDAgPSBcaGJveHtcaWdub3Jlc3BhY2VzICMyfSUKKyAgXGlmZGltXHdkMCA+IDBwdAorICAgIFxkZWZcbGVmdHRleHR7IzF9JSAgaGF2ZSBib3RoIHRleHRzCisgICAgXGRlZlxyaWdodHRleHR7IzJ9JQorICBcZWxzZQorICAgIFxkZWZcbGVmdHRleHR7IzF9JSAgaGF2ZSBvbmx5IG9uZSB0ZXh0CisgICAgXGRlZlxyaWdodHRleHR7IzF9JQorICBcZmkKKyAgJQorICBcaWZvZGRccGFnZW5vCisgICAgXGRlZlx0ZW1we1xpbnJpZ2h0bWFyZ2luXHJpZ2h0dGV4dH0lIG9kZCBwYWdlIC0+IG91dHNpZGUgaXMgcmlnaHQgbWFyZ2luCisgIFxlbHNlCisgICAgXGRlZlx0ZW1we1xpbmxlZnRtYXJnaW5cbGVmdHRleHR9JQorICBcZmkKKyAgXHRlbXAKK30KKworJSBAaW5jbHVkZSBmaWxlICAgIGluc2VydCB0ZXh0IG9mIHRoYXQgZmlsZSBhcyBpbnB1dC4KKyUKK1xkZWZcaW5jbHVkZXtccGFyc2Vhcmd1c2luZ1xmaWxlbmFtZWNhdGNvZGVzXGluY2x1ZGV6enp9CitcZGVmXGluY2x1ZGV6enojMXslCisgIFxwdXNodGhpc2ZpbGVzdGFjaworICBcZGVmXHRoaXNmaWxleyMxfSUKKyAgeyUKKyAgICBcbWFrZXZhbHVlZXhwYW5kYWJsZQorICAgIFxkZWZcdGVtcHtcaW5wdXQgIzEgfSUKKyAgICBcZXhwYW5kYWZ0ZXIKKyAgfVx0ZW1wCisgIFxwb3B0aGlzZmlsZXN0YWNrCit9CitcZGVmXGZpbGVuYW1lY2F0Y29kZXN7JQorICBcY2F0Y29kZWBcXD1cb3RoZXIKKyAgXGNhdGNvZGVgfj1cb3RoZXIKKyAgXGNhdGNvZGVgXj1cb3RoZXIKKyAgXGNhdGNvZGVgXz1cb3RoZXIKKyAgXGNhdGNvZGVgfD1cb3RoZXIKKyAgXGNhdGNvZGVgPD1cb3RoZXIKKyAgXGNhdGNvZGVgPj1cb3RoZXIKKyAgXGNhdGNvZGVgKz1cb3RoZXIKKyAgXGNhdGNvZGVgLT1cb3RoZXIKK30KKworXGRlZlxwdXNodGhpc2ZpbGVzdGFja3slCisgIFxleHBhbmRhZnRlclxwdXNodGhpc2ZpbGVzdGFja1hccG9wdGhpc2ZpbGVzdGFja1xTdGFja1Rlcm0KK30KK1xkZWZccHVzaHRoaXNmaWxlc3RhY2tYeyUKKyAgXGV4cGFuZGFmdGVyXHB1c2h0aGlzZmlsZXN0YWNrWVx0aGlzZmlsZVxTdGFja1Rlcm0KK30KK1xkZWZccHVzaHRoaXNmaWxlc3RhY2tZICMxXFN0YWNrVGVybSAjMlxTdGFja1Rlcm0geyUKKyAgXGdkZWZccG9wdGhpc2ZpbGVzdGFja3tcZ2RlZlx0aGlzZmlsZXsjMX1cZ2RlZlxwb3B0aGlzZmlsZXN0YWNreyMyfX0lCit9CisKK1xkZWZccG9wdGhpc2ZpbGVzdGFja3tcZXJydGhpc2ZpbGVzdGFja2VtcHR5fQorXGRlZlxlcnJ0aGlzZmlsZXN0YWNrZW1wdHl7XGVycm1lc3NhZ2V7SW50ZXJuYWwgZXJyb3I6CisgIHRoZSBzdGFjayBvZiBmaWxlbmFtZXMgaXMgZW1wdHkufX0KKworXGRlZlx0aGlzZmlsZXt9CisKKyUgQGNlbnRlciBsaW5lCislIG91dHB1dHMgdGhhdCBsaW5lLCBjZW50ZXJlZC4KKyUKK1xwYXJzZWFyZ2RlZlxjZW50ZXJ7JQorICBcaWZobW9kZQorICAgIFxsZXRcbmV4dFxjZW50ZXJICisgIFxlbHNlCisgICAgXGxldFxuZXh0XGNlbnRlclYKKyAgXGZpCisgIFxuZXh0e1xoZmlsIFxpZ25vcmVzcGFjZXMjMVx1bnNraXAgXGhmaWx9JQorfQorXGRlZlxjZW50ZXJIIzF7JQorICB7JQorICAgIFxoZmlsXGJyZWFrCisgICAgXGFkdmFuY2VcaHNpemUgYnkgLVxsZWZ0c2tpcAorICAgIFxhZHZhbmNlXGhzaXplIGJ5IC1ccmlnaHRza2lwCisgICAgXGxpbmV7IzF9JQorICAgIFxicmVhaworICB9JQorfQorXGRlZlxjZW50ZXJWIzF7XGxpbmV7XGtlcm5cbGVmdHNraXAgIzFca2VyblxyaWdodHNraXB9fQorCislIEBzcCBuICAgb3V0cHV0cyBuIGxpbmVzIG9mIHZlcnRpY2FsIHNwYWNlCisKK1xwYXJzZWFyZ2RlZlxzcHtcdnNraXAgIzFcYmFzZWxpbmVza2lwfQorCislIEBjb21tZW50IC4uLmxpbmUgd2hpY2ggaXMgaWdub3JlZC4uLgorJSBAYyBpcyB0aGUgc2FtZSBhcyBAY29tbWVudAorJSBAaWdub3JlIC4uLiBAZW5kIGlnbm9yZSAgaXMgYW5vdGhlciB3YXkgdG8gd3JpdGUgYSBjb21tZW50CisKK1xkZWZcY29tbWVudHtcYmVnaW5ncm91cCBcY2F0Y29kZWBcXl5NPVxvdGhlciUKK1xjYXRjb2RlYFxAPVxvdGhlciBcY2F0Y29kZWBcez1cb3RoZXIgXGNhdGNvZGVgXH09XG90aGVyJQorXGNvbW1lbnR4eHh9Cit7XGNhdGNvZGVgXF5eTT1cb3RoZXIgXGdkZWZcY29tbWVudHh4eCMxXl5Ne1xlbmRncm91cH19CisKK1xsZXRcYz1cY29tbWVudAorCislIEBwYXJhZ3JhcGhpbmRlbnQgTkNIQVJTCislIFdlJ2xsIHVzZSBlbXMgZm9yIE5DSEFSUywgY2xvc2UgZW5vdWdoLgorJSBOQ0hBUlMgY2FuIGFsc28gYmUgdGhlIHdvcmQgYGFzaXMnIG9yIGBub25lJy4KKyUgV2UgY2Fubm90IGZlYXNpYmx5IGltcGxlbWVudCBAcGFyYWdyYXBoaW5kZW50IGFzaXMsIHRob3VnaC4KKyUKK1xkZWZcYXNpc3dvcmR7YXNpc30gJSBubyB0cmFuc2xhdGlvbiwgdGhlc2UgYXJlIGtleXdvcmRzCitcZGVmXG5vbmV3b3Jke25vbmV9CislCitccGFyc2VhcmdkZWZccGFyYWdyYXBoaW5kZW50eyUKKyAgXGRlZlx0ZW1weyMxfSUKKyAgXGlmeFx0ZW1wXGFzaXN3b3JkCisgIFxlbHNlCisgICAgXGlmeFx0ZW1wXG5vbmV3b3JkCisgICAgICBcZGVmYXVsdHBhcmluZGVudCA9IDBwdAorICAgIFxlbHNlCisgICAgICBcZGVmYXVsdHBhcmluZGVudCA9ICMxZW0KKyAgICBcZmkKKyAgXGZpCisgIFxwYXJpbmRlbnQgPSBcZGVmYXVsdHBhcmluZGVudAorfQorCislIEBleGFtcGxlaW5kZW50IE5DSEFSUworJSBXZSdsbCB1c2UgZW1zIGZvciBOQ0hBUlMgbGlrZSBAcGFyYWdyYXBoaW5kZW50LgorJSBJdCBzZWVtcyBAZXhhbXBsZWluZGVudCBhc2lzIGlzbid0IG5lY2Vzc2FyeSwgYnV0CislIEkgcHJlc2VydmUgaXQgdG8gbWFrZSBpdCBzaW1pbGFyIHRvIEBwYXJhZ3JhcGhpbmRlbnQuCitccGFyc2VhcmdkZWZcZXhhbXBsZWluZGVudHslCisgIFxkZWZcdGVtcHsjMX0lCisgIFxpZnhcdGVtcFxhc2lzd29yZAorICBcZWxzZQorICAgIFxpZnhcdGVtcFxub25ld29yZAorICAgICAgXGxpc3BuYXJyb3dpbmcgPSAwcHQKKyAgICBcZWxzZQorICAgICAgXGxpc3BuYXJyb3dpbmcgPSAjMWVtCisgICAgXGZpCisgIFxmaQorfQorCislIEBmaXJzdHBhcmFncmFwaGluZGVudCBXT1JECislIElmIFdPUkQgaXMgYG5vbmUnLCB0aGVuIHN1cHByZXNzIGluZGVudGF0aW9uIG9mIHRoZSBmaXJzdCBwYXJhZ3JhcGgKKyUgYWZ0ZXIgYSBzZWN0aW9uIGhlYWRpbmcuICBJZiBXT1JEIGlzIGBpbnNlcnQnLCB0aGVuIGRvIGluZGVudCBhdCBzdWNoCislIHBhcmFncmFwaHMuCislCislIFRoZSBwYXJhZ3JhcGggaW5kZW50YXRpb24gaXMgc3VwcHJlc3NlZCBvciBub3QgYnkgY2FsbGluZworJSBcc3VwcHJlc3NmaXJzdHBhcmFncmFwaGluZGVudCwgd2hpY2ggdGhlIHNlY3Rpb25pbmcgY29tbWFuZHMgZG8uCislIFdlIHN3aXRjaCB0aGUgZGVmaW5pdGlvbiBvZiB0aGlzIGJhY2sgYW5kIGZvcnRoIGFjY29yZGluZyB0byBXT1JELgorJSBCeSBkZWZhdWx0LCB3ZSBzdXBwcmVzcyBpbmRlbnRhdGlvbi4KKyUKK1xkZWZcc3VwcHJlc3NmaXJzdHBhcmFncmFwaGluZGVudHtcZG9zdXBwcmVzc2ZpcnN0cGFyYWdyYXBoaW5kZW50fQorXGRlZlxpbnNlcnR3b3Jke2luc2VydH0KKyUKK1xwYXJzZWFyZ2RlZlxmaXJzdHBhcmFncmFwaGluZGVudHslCisgIFxkZWZcdGVtcHsjMX0lCisgIFxpZnhcdGVtcFxub25ld29yZAorICAgIFxsZXRcc3VwcHJlc3NmaXJzdHBhcmFncmFwaGluZGVudCA9IFxkb3N1cHByZXNzZmlyc3RwYXJhZ3JhcGhpbmRlbnQKKyAgXGVsc2VcaWZ4XHRlbXBcaW5zZXJ0d29yZAorICAgIFxsZXRcc3VwcHJlc3NmaXJzdHBhcmFncmFwaGluZGVudCA9IFxyZWxheAorICBcZWxzZQorICAgIFxlcnJoZWxwID0gXEVNc2ltcGxlCisgICAgXGVycm1lc3NhZ2V7VW5rbm93biBAZmlyc3RwYXJhZ3JhcGhpbmRlbnQgb3B0aW9uIGBcdGVtcCd9JQorICBcZmlcZmkKK30KKworJSBIZXJlIGlzIGhvdyB3ZSBhY3R1YWxseSBzdXBwcmVzcyBpbmRlbnRhdGlvbi4gIFJlZGVmaW5lIFxldmVyeXBhciB0bworJSBca2VybiBiYWNrd2FyZHMgYnkgXHBhcmluZGVudCwgYW5kIHRoZW4gcmVzZXQgaXRzZWxmIHRvIGVtcHR5LgorJQorJSBXZSBhbHNvIG1ha2UgXGluZGVudCBpdHNlbGYgbm90IGFjdHVhbGx5IGRvIGFueXRoaW5nIHVudGlsIHRoZSBuZXh0CislIHBhcmFncmFwaC4KKyUKK1xnZGVmXGRvc3VwcHJlc3NmaXJzdHBhcmFncmFwaGluZGVudHslCisgIFxnZGVmXGluZGVudHslCisgICAgXHJlc3RvcmVmaXJzdHBhcmFncmFwaGluZGVudAorICAgIFxpbmRlbnQKKyAgfSUKKyAgXGdkZWZcbm9pbmRlbnR7JQorICAgIFxyZXN0b3JlZmlyc3RwYXJhZ3JhcGhpbmRlbnQKKyAgICBcbm9pbmRlbnQKKyAgfSUKKyAgXGdsb2JhbFxldmVyeXBhciA9IHslCisgICAgXGtlcm4gLVxwYXJpbmRlbnQKKyAgICBccmVzdG9yZWZpcnN0cGFyYWdyYXBoaW5kZW50CisgIH0lCit9CisKK1xnZGVmXHJlc3RvcmVmaXJzdHBhcmFncmFwaGluZGVudHslCisgIFxnbG9iYWwgXGxldCBcaW5kZW50ID0gXHB0ZXhpbmRlbnQKKyAgXGdsb2JhbCBcbGV0IFxub2luZGVudCA9IFxwdGV4bm9pbmRlbnQKKyAgXGdsb2JhbCBcZXZlcnlwYXIgPSB7fSUKK30KKworCislIEBhc2lzIGp1c3QgeWllbGRzIGl0cyBhcmd1bWVudC4gIFVzZWQgd2l0aCBAdGFibGUsIGZvciBleGFtcGxlLgorJQorXGRlZlxhc2lzIzF7IzF9CisKKyUgQG1hdGggb3V0cHV0cyBpdHMgYXJndW1lbnQgaW4gbWF0aCBtb2RlLgorJQorJSBPbmUgY29tcGxpY2F0aW9uOiBfIHVzdWFsbHkgbWVhbnMgc3Vic2NyaXB0cywgYnV0IGl0IGNvdWxkIGFsc28gbWVhbgorJSBhbiBhY3R1YWwgXyBjaGFyYWN0ZXIsIGFzIGluIEBtYXRoe0B2YXJ7c29tZV92YXJpYWJsZX0gKyAxfS4gIFNvIG1ha2UKKyUgXyBhY3RpdmUsIGFuZCBkaXN0aW5ndWlzaCBieSBzZWVpbmcgaWYgdGhlIGN1cnJlbnQgZmFtaWx5IGlzIFxzbGZhbSwKKyUgd2hpY2ggaXMgd2hhdCBAdmFyIHVzZXMuCit7CisgIFxjYXRjb2RlYFxfID0gXGFjdGl2ZQorICBcZ2RlZlxtYXRodW5kZXJzY29yZXslCisgICAgXGNhdGNvZGVgXF89XGFjdGl2ZQorICAgIFxkZWZfe1xpZm51bVxmYW09XHNsZmFtIFxfXGVsc2Vcc2JcZml9JQorICB9Cit9CislIEFub3RoZXIgY29tcGxpY2F0aW9uOiB3ZSB3YW50IFxcIChhbmQgQFwpIHRvIG91dHB1dCBhIFwgY2hhcmFjdGVyLgorJSBGWUksIHBsYWluLnRleCB1c2VzIFxcIGFzIGEgdGVtcG9yYXJ5IGNvbnRyb2wgc2VxdWVuY2UgKHdoeT8pLCBidXQKKyUgdGhpcyBpcyBub3QgYWR2ZXJ0aXNlZCBhbmQgd2UgZG9uJ3QgY2FyZS4gIFRleGluZm8gZG9lcyBub3QKKyUgb3RoZXJ3aXNlIGRlZmluZSBAXC4KKyUKKyUgVGhlIFxtYXRoY2hhciBpcyBjbGFzcz0wPW9yZGluYXJ5LCBmYW1pbHk9Nz10dGZhbSwgcG9zaXRpb249NUM9XC4KK1xkZWZcbWF0aGJhY2tzbGFzaHtcaWZudW1cZmFtPVx0dGZhbSBcbWF0aGNoYXIiMDc1QyBcZWxzZVxiYWNrc2xhc2ggXGZpfQorJQorXGRlZlxtYXRoeyUKKyAgXHRleAorICBcbWF0aHVuZGVyc2NvcmUKKyAgXGxldFxcID0gXG1hdGhiYWNrc2xhc2gKKyAgXG1hdGhhY3RpdmUKKyAgJFxmaW5pc2htYXRoCit9CitcZGVmXGZpbmlzaG1hdGgjMXsjMSRcZW5kZ3JvdXB9ICAlIENsb3NlIHRoZSBncm91cCBvcGVuZWQgYnkgXHRleC4KKworJSBTb21lIGFjdGl2ZSBjaGFyYWN0ZXJzIChzdWNoIGFzIDwpIGFyZSBzcGFjZWQgZGlmZmVyZW50bHkgaW4gbWF0aC4KKyUgV2UgaGF2ZSB0byByZXNldCB0aGVpciBkZWZpbml0aW9ucyBpbiBjYXNlIHRoZSBAbWF0aCB3YXMgYW4gYXJndW1lbnQKKyUgdG8gYSBjb21tYW5kIHdoaWNoIHNldHMgdGhlIGNhdGNvZGVzIChzdWNoIGFzIEBpdGVtIG9yIEBzZWN0aW9uKS4KKyUKK3sKKyAgXGNhdGNvZGVgXiA9IFxhY3RpdmUKKyAgXGNhdGNvZGVgPCA9IFxhY3RpdmUKKyAgXGNhdGNvZGVgPiA9IFxhY3RpdmUKKyAgXGNhdGNvZGVgKyA9IFxhY3RpdmUKKyAgXGdkZWZcbWF0aGFjdGl2ZXslCisgICAgXGxldF4gPSBccHRleGhhdAorICAgIFxsZXQ8ID0gXHB0ZXhsZXNzCisgICAgXGxldD4gPSBccHRleGd0cgorICAgIFxsZXQrID0gXHB0ZXhwbHVzCisgIH0KK30KKworJSBAYnVsbGV0IGFuZCBAbWludXMgbmVlZCB0aGUgc2FtZSB0cmVhdG1lbnQgYXMgQG1hdGgsIGp1c3QgYWJvdmUuCitcZGVmXGJ1bGxldHskXHB0ZXhidWxsZXQkfQorXGRlZlxtaW51c3skLSR9CisKKyUgQGRvdHN7fSBvdXRwdXRzIGFuIGVsbGlwc2lzIHVzaW5nIHRoZSBjdXJyZW50IGZvbnQuCislIFdlIGRvIC41ZW0gcGVyIHBlcmlvZCBzbyB0aGF0IGl0IGhhcyB0aGUgc2FtZSBzcGFjaW5nIGluIHRoZSBjbQorJSB0eXBld3JpdGVyIGZvbnRzIGFzIHRocmVlIGFjdHVhbCBwZXJpb2QgY2hhcmFjdGVyczsgb24gdGhlIG90aGVyIGhhbmQsCislIGluIG90aGVyIHR5cGV3cml0ZXIgZm9udHMgdGhyZWUgcGVyaW9kcyBhcmUgd2lkZXIgdGhhbiAxLjVlbS4gIFNvIGRvCislIHdoaWNoZXZlciBpcyBsYXJnZXIuCislCitcZGVmXGRvdHN7JQorICBcbGVhdmV2bW9kZQorICBcc2V0Ym94MD1caGJveHsuLi59JSBnZXQgd2lkdGggb2YgdGhyZWUgcGVyaW9kcworICBcaWZkaW1cd2QwID4gMS41ZW0KKyAgICBcZGltZW4wID0gXHdkMAorICBcZWxzZQorICAgIFxkaW1lbjAgPSAxLjVlbQorICBcZmkKKyAgXGhib3ggdG8gXGRpbWVuMHslCisgICAgXGhza2lwIDBwdCBwbHVzLjI1ZmlsCisgICAgLlxoc2tpcCAwcHQgcGx1czFmaWwKKyAgICAuXGhza2lwIDBwdCBwbHVzMWZpbAorICAgIC5caHNraXAgMHB0IHBsdXMuNWZpbAorICB9JQorfQorCislIEBlbmRkb3Rze30gaXMgYW4gZW5kLW9mLXNlbnRlbmNlIGVsbGlwc2lzLgorJQorXGRlZlxlbmRkb3RzeyUKKyAgXGRvdHMKKyAgXHNwYWNlZmFjdG9yPVxlbmRvZnNlbnRlbmNlc3BhY2VmYWN0b3IKK30KKworJSBAY29tbWF7fSBpcyBzbyBjb21tYXMgY2FuIGJlIGluc2VydGVkIGludG8gdGV4dCB3aXRob3V0IG1lc3NpbmcgdXAKKyUgVGV4aW5mbydzIHBhcnNpbmcuCislCitcbGV0XGNvbW1hID0gLAorCislIEByZWZpbGwgaXMgYSBuby1vcC4KK1xsZXRccmVmaWxsPVxyZWxheAorCislIElmIHdvcmtpbmcgb24gYSBsYXJnZSBkb2N1bWVudCBpbiBjaGFwdGVycywgaXQgaXMgY29udmVuaWVudCB0bworJSBiZSBhYmxlIHRvIGRpc2FibGUgaW5kZXhpbmcsIGNyb3NzLXJlZmVyZW5jaW5nLCBhbmQgY29udGVudHMsIGZvciB0ZXN0IHJ1bnMuCislIFRoaXMgaXMgZG9uZSB3aXRoIEBub3ZhbGlkYXRlIChiZWZvcmUgQHNldGZpbGVuYW1lKS4KKyUKK1xuZXdpZlxpZmxpbmtzIFxsaW5rc3RydWUgJSBieSBkZWZhdWx0IHdlIHdhbnQgdGhlIGF1eCBmaWxlcy4KK1xsZXRcbm92YWxpZGF0ZSA9IFxsaW5rc2ZhbHNlCisKKyUgQHNldGZpbGVuYW1lIGlzIGRvbmUgYXQgdGhlIGJlZ2lubmluZyBvZiBldmVyeSB0ZXhpbmZvIGZpbGUuCislIFNvIG9wZW4gaGVyZSB0aGUgZmlsZXMgd2UgbmVlZCB0byBoYXZlIG9wZW4gd2hpbGUgcmVhZGluZyB0aGUgaW5wdXQuCislIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gbWFrZSBhIC5mbXQgZmlsZSBmb3IgdGV4aW5mby4KK1xkZWZcc2V0ZmlsZW5hbWV7JQorICAgXGZpeGJhY2tzbGFzaCAgJSBUdXJuIG9mZiBoYWNrIHRvIHN3YWxsb3cgYFxpbnB1dCB0ZXhpbmZvJy4KKyAgIFxpZmxpbmtzCisgICAgIFx0cnlhdXhmaWxlCisgICAgICUgT3BlbiB0aGUgbmV3IGF1eCBmaWxlLiAgVGVYIHdpbGwgY2xvc2UgaXQgYXV0b21hdGljYWxseSBhdCBleGl0LgorICAgICBcaW1tZWRpYXRlXG9wZW5vdXRcYXV4ZmlsZT1cam9ibmFtZS5hdXgKKyAgIFxmaSAlIFxvcGVuaW5kaWNlcyBuZWVkcyB0byBkbyBzb21lIHdvcmsgaW4gYW55IGNhc2UuCisgICBcb3BlbmluZGljZXMKKyAgIFxsZXRcc2V0ZmlsZW5hbWU9XGNvbW1lbnQgJSBJZ25vcmUgZXh0cmEgQHNldGZpbGVuYW1lIGNtZHMuCisgICAlCisgICAlIElmIHRleGluZm8uY25mIGlzIHByZXNlbnQgb24gdGhlIHN5c3RlbSwgcmVhZCBpdC4KKyAgICUgVXNlZnVsIGZvciBzaXRlLXdpZGUgQGFmb3VycGFwZXIsIGV0Yy4KKyAgIFxvcGVuaW4gMSB0ZXhpbmZvLmNuZgorICAgXGlmZW9mIDEgXGVsc2UgXGlucHV0IHRleGluZm8uY25mIFxmaQorICAgXGNsb3NlaW4gMQorICAgJQorICAgXGNvbW1lbnQgJSBJZ25vcmUgdGhlIGFjdHVhbCBmaWxlbmFtZS4KK30KKworJSBDYWxsZWQgZnJvbSBcc2V0ZmlsZW5hbWUuCislCitcZGVmXG9wZW5pbmRpY2VzeyUKKyAgXG5ld2luZGV4e2NwfSUKKyAgXG5ld2NvZGVpbmRleHtmbn0lCisgIFxuZXdjb2RlaW5kZXh7dnJ9JQorICBcbmV3Y29kZWluZGV4e3RwfSUKKyAgXG5ld2NvZGVpbmRleHtreX0lCisgIFxuZXdjb2RlaW5kZXh7cGd9JQorfQorCislIEBieWUuCitcb3V0ZXJcZGVmXGJ5ZXtccGFnZWFsaWdubWFjcm9cdHJhY2luZ3N0YXRzPTFccHRleGVuZH0KKworCitcbWVzc2FnZXtwZGYsfQorJSBhZG9iZSBgcG9ydGFibGUnIGRvY3VtZW50IGZvcm1hdAorXG5ld2NvdW50XHRlbXBudW0KK1xuZXdjb3VudFxsbmtjb3VudAorXG5ld3Rva3NcZmlsZW5hbWUKK1xuZXdjb3VudFxmaWxlbmFtZWxlbmd0aAorXG5ld2NvdW50XHBnbgorXG5ld3Rva3NcdG9rc0EKK1xuZXd0b2tzXHRva3NCCitcbmV3dG9rc1x0b2tzQworXG5ld3Rva3NcdG9rc0QKK1xuZXdib3hcYm94QQorXG5ld2NvdW50XGNvdW50QQorXG5ld2lmXGlmcGRmCitcbmV3aWZcaWZwZGZtYWtlcGFnZWRlc3QKKworJSB3aGVuIHBkZnRleCBpcyBydW4gaW4gZHZpIG1vZGUsIFxwZGZvdXRwdXQgaXMgZGVmaW5lZCAoc28gXHBkZm91dHB1dD0xCislIGNhbiBiZSBzZXQpLiAgU28gd2UgdGVzdCBmb3IgXHJlbGF4IGFuZCAwIGFzIHdlbGwgYXMgXHVuZGVmaW5lZCwKKyUgYm9ycm93ZWQgZnJvbSBpZnBkZi5zdHkuCitcaWZ4XHBkZm91dHB1dFx1bmRlZmluZWQKK1xlbHNlCisgIFxpZnhccGRmb3V0cHV0XHJlbGF4CisgIFxlbHNlCisgICAgXGlmY2FzZVxwZGZvdXRwdXQKKyAgICBcZWxzZQorICAgICAgXHBkZnRydWUKKyAgICBcZmkKKyAgXGZpCitcZmkKKworJSBQREYgdXNlcyBQb3N0U2NyaXB0IHN0cmluZyBjb25zdGFudHMgZm9yIHRoZSBuYW1lcyBvZiB4cmVmIHRhcmdldHMsCislIGZvciBkaXNwbGF5IGluIHRoZSBvdXRsaW5lcywgYW5kIGluIG90aGVyIHBsYWNlcy4gIFRodXMsIHdlIGhhdmUgdG8KKyUgZG91YmxlIGFueSBiYWNrc2xhc2hlcy4gIE90aGVyd2lzZSwgYSBuYW1lIGxpa2UgIlxub2RlIiB3aWxsIGJlCislIGludGVycHJldGVkIGFzIGEgbmV3bGluZSAoXG4pLCBmb2xsb3dlZCBieSBvLCBkLCBlLiAgTm90IGdvb2QuCislIGh0dHA6Ly93d3cubnRnLm5sL3BpcGVybWFpbC9udGctcGRmdGV4LzIwMDQtSnVseS8wMDA2NTQuaHRtbAorJSAoYW5kIHJlbGF0ZWQgbWVzc2FnZXMsIHRoZSBmaW5hbCBvdXRjb21lIGlzIHRoYXQgaXQgaXMgdXAgdG8gdGhlIFRlWAorJSB1c2VyIHRvIGRvdWJsZSB0aGUgYmFja3NsYXNoZXMgYW5kIG90aGVyd2lzZSBtYWtlIHRoZSBzdHJpbmcgdmFsaWQsIHNvCislIHRoYXQncyB3aGF0IHdlIGRvKS4KKworJSBkb3VibGUgYWN0aXZlIGJhY2tzbGFzaGVzLgorJSAKK3tcY2F0Y29kZWBcQD0wIFxjYXRjb2RlYFxcPVxhY3RpdmUKKyBAZ2RlZkBhY3RpdmViYWNrc2xhc2hkb3VibGV7JQorICAgQGNhdGNvZGVgQFw9QGFjdGl2ZQorICAgQGxldFw9QGRvdWJsZWJhY2tzbGFzaH0KK30KKworJSBUbyBoYW5kbGUgcGFyZW5zLCB3ZSBtdXN0IGFkb3B0IGEgZGlmZmVyZW50IGFwcHJvYWNoLCBzaW5jZSBwYXJlbnMgYXJlCislIG5vdCBhY3RpdmUgY2hhcmFjdGVycy4gIGh5cGVycmVmLmR0eCAod2hpY2ggaGFzIHRoZSBzYW1lIHByb2JsZW0gYXMKKyUgdXMpIGhhbmRsZXMgaXQgd2l0aCB0aGlzIGFtYXppbmcgbWFjcm8gdG8gcmVwbGFjZSB0b2tlbnMuICBJJ3ZlCislIHRpbmtlcmVkIHdpdGggaXQgYSBsaXR0bGUgZm9yIHRleGluZm8sIGJ1dCBpdCdzIGRlZmluaXRlbHkgZnJvbSB0aGVyZS4KKyUgCislICMxIGlzIHRoZSB0b2tlbnMgdG8gcmVwbGFjZS4KKyUgIzIgaXMgdGhlIHJlcGxhY2VtZW50LgorJSAjMyBpcyB0aGUgY29udHJvbCBzZXF1ZW5jZSB3aXRoIHRoZSBzdHJpbmcuCislIAorXGRlZlxIeVBzZFN1YnN0IzEjMiMzeyUKKyAgXGRlZlxIeVBzZFJlcGxhY2UjIzEjMSMjMlxFTkR7JQorICAgICMjMSUKKyAgICBcaWZ4XFwjIzJcXCUKKyAgICBcZWxzZQorICAgICAgIzIlCisgICAgICBcSHlSZXR1cm5BZnRlckZpeyUKKyAgICAgICAgXEh5UHNkUmVwbGFjZSMjMlxFTkQKKyAgICAgIH0lCisgICAgXGZpCisgIH0lCisgIFx4ZGVmIzN7XGV4cGFuZGFmdGVyXEh5UHNkUmVwbGFjZSMzIzFcRU5EfSUKK30KK1xsb25nXGRlZlxIeVJldHVybkFmdGVyRmkjMVxmaXtcZmkjMX0KKworJSAjMSBpcyBhIGNvbnRyb2wgc2VxdWVuY2UgaW4gd2hpY2ggdG8gZG8gdGhlIHJlcGxhY2VtZW50cy4KK1xkZWZcYmFja3NsYXNocGFyZW5zIzF7JQorICBceGRlZiMxeyMxfSUgcmVkZWZpbmUgaXQgYXMgaXRzIGV4cGFuc2lvbjsgdGhlIGRlZmluaXRpb24gaXMgc2ltcGx5CisgICAgICAgICAgICAgJSBcbGFzdG5vZGUgd2hlbiBjYWxsZWQgZnJvbSBcc2V0cmVmIC0+IFxwZGZta2Rlc3QuCisgIFxIeVBzZFN1YnN0eyh9e1xyZWFsYmFja3NsYXNoKH17IzF9JQorICBcSHlQc2RTdWJzdHspfXtccmVhbGJhY2tzbGFzaCl9eyMxfSUKK30KKworXGlmcGRmCisgIFxpbnB1dCBwZGZjb2xvcgorICBccGRmY2F0YWxvZ3svUGFnZU1vZGUgL1VzZU91dGxpbmVzfSUKKyAgJSAjMSBpcyBpbWFnZSBuYW1lLCAjMiB3aWR0aCAobWlnaHQgYmUgZW1wdHkvd2hpdGVzcGFjZSksICMzIGhlaWdodCAoZGl0dG8pLgorICBcZGVmXGRvcGRmaW1hZ2UjMSMyIzN7JQorICAgIFxkZWZcaW1hZ2V3aWR0aHsjMn1cc2V0Ym94MCA9IFxoYm94e1xpZ25vcmVzcGFjZXMgIzJ9JQorICAgIFxkZWZcaW1hZ2VoZWlnaHR7IzN9XHNldGJveDIgPSBcaGJveHtcaWdub3Jlc3BhY2VzICMzfSUKKyAgICAlIHdpdGhvdXQgXGltbWVkaWF0ZSwgcGRmdGV4IHNlZyBmYXVsdHMgd2hlbiB0aGUgc2FtZSBpbWFnZSBpcworICAgICUgaW5jbHVkZWQgdHdpY2UuICAoVmVyc2lvbiAzLjE0MTU5LXByZS0xLjAtdW5vZmZpY2lhbC0yMDAxMDcwNC4pCisgICAgXGlmbnVtXHBkZnRleHZlcnNpb24gPCAxNAorICAgICAgXGltbWVkaWF0ZVxwZGZpbWFnZQorICAgIFxlbHNlCisgICAgICBcaW1tZWRpYXRlXHBkZnhpbWFnZQorICAgIFxmaQorICAgICAgXGlmZGltIFx3ZDAgPjBwdCB3aWR0aCBcaW1hZ2V3aWR0aCBcZmkKKyAgICAgIFxpZmRpbSBcd2QyID4wcHQgaGVpZ2h0IFxpbWFnZWhlaWdodCBcZmkKKyAgICAgIFxpZm51bVxwZGZ0ZXh2ZXJzaW9uPDEzCisgICAgICAgICAjMS5wZGYlCisgICAgICAgXGVsc2UKKyAgICAgICAgIHsjMS5wZGZ9JQorICAgICAgIFxmaQorICAgIFxpZm51bVxwZGZ0ZXh2ZXJzaW9uIDwgMTQgXGVsc2UKKyAgICAgIFxwZGZyZWZ4aW1hZ2UgXHBkZmxhc3R4aW1hZ2UKKyAgICBcZml9CisgIFxkZWZccGRmbWtkZXN0IzF7eyUKKyAgICAlIFdlIGhhdmUgdG8gc2V0IGR1bW1pZXMgc28gY29tbWFuZHMgc3VjaCBhcyBAY29kZSwgYW5kIGNoYXJhY3RlcnMKKyAgICAlIHN1Y2ggYXMgXCwgYXJlbid0IGV4cGFuZGVkIHdoZW4gcHJlc2VudCBpbiBhIHNlY3Rpb24gdGl0bGUuCisgICAgXGF0ZHVtbWllcworICAgIFxhY3RpdmViYWNrc2xhc2hkb3VibGUKKyAgICBcZGVmXHBkZmRlc3RuYW1leyMxfSUKKyAgICBcYmFja3NsYXNocGFyZW5zXHBkZmRlc3RuYW1lCisgICAgXHBkZmRlc3QgbmFtZXtccGRmZGVzdG5hbWV9IHh5eiUKKyAgfX0lCisgICUKKyAgJSB1c2VkIHRvIG1hcmsgdGFyZ2V0IG5hbWVzOyBtdXN0IGJlIGV4cGFuZGFibGUuCisgIFxkZWZccGRmbWtwZ24jMXsjMX0lCisgICUKKyAgXGxldFxsaW5rY29sb3IgPSBcQmx1ZSAgJSB3YXMgQ3lhbiwgYnV0IHRoYXQgc2VlbXMgbGlnaHQ/CisgIFxkZWZcZW5kbGlua3tcQmxhY2tccGRmZW5kbGlua30KKyAgJSBBZGRpbmcgb3V0bGluZXMgdG8gUERGOyBtYWNyb3MgZm9yIGNhbGN1bGF0aW5nIHN0cnVjdHVyZSBvZiBvdXRsaW5lcworICAlIGNvbWUgZnJvbSBQZXRyIE9sc2FrCisgIFxkZWZcZXhwbnVtYmVyIzF7XGV4cGFuZGFmdGVyXGlmeFxjc25hbWUjMVxlbmRjc25hbWVccmVsYXggMCUKKyAgICBcZWxzZSBcY3NuYW1lIzFcZW5kY3NuYW1lIFxmaX0KKyAgXGRlZlxhZHZhbmNlbnVtYmVyIzF7XHRlbXBudW09XGV4cG51bWJlcnsjMX1ccmVsYXgKKyAgICBcYWR2YW5jZVx0ZW1wbnVtIGJ5IDEKKyAgICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWUjMVxlbmRjc25hbWV7XHRoZVx0ZW1wbnVtfX0KKyAgJQorICAlICMxIGlzIHRoZSBzZWN0aW9uIHRleHQsIHdoaWNoIGlzIHdoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlCisgICUgb3V0bGluZSBieSB0aGUgcGRmIHZpZXdlci4gICMyIGlzIHRoZSBwZGYgZXhwcmVzc2lvbiBmb3IgdGhlIG51bWJlcgorICAlIG9mIHN1YmVudHJpZXMgKG9yIGVtcHR5LCBmb3Igc3Vic3Vic2VjdGlvbnMpLiAgIzMgaXMgdGhlIG5vZGUgdGV4dCwKKyAgJSB3aGljaCBtaWdodCBiZSBlbXB0eSBpZiB0aGlzIHRvYyBlbnRyeSBoYWQgbm8gY29ycmVzcG9uZGluZyBub2RlLgorICAlICM0IGlzIHRoZSBwYWdlIG51bWJlcgorICAlCisgIFxkZWZcZG9wZGZvdXRsaW5lIzEjMiMzIzR7JQorICAgICUgR2VuZXJhdGUgYSBsaW5rIHRvIHRoZSBub2RlIHRleHQgaWYgdGhhdCBleGlzdHM7IGVsc2UsIHVzZSB0aGUKKyAgICAlIHBhZ2UgbnVtYmVyLiAgV2UgY291bGQgZ2VuZXJhdGUgYSBkZXN0aW5hdGlvbiBmb3IgdGhlIHNlY3Rpb24KKyAgICAlIHRleHQgaW4gdGhlIGNhc2Ugd2hlcmUgYSBzZWN0aW9uIGhhcyBubyBub2RlLCBidXQgaXQgZG9lc24ndAorICAgICUgc2VlbSB3b3J0aCB0aGUgdHJvdWJsZSwgc2luY2UgbW9zdCBkb2N1bWVudHMgYXJlIG5vcm1hbGx5IHN0cnVjdHVyZWQuCisgICAgXGRlZlxwZGZvdXRsaW5lZGVzdHsjM30lCisgICAgXGlmeFxwZGZvdXRsaW5lZGVzdFxlbXB0eQorICAgICAgXGRlZlxwZGZvdXRsaW5lZGVzdHsjNH0lCisgICAgXGVsc2UKKyAgICAgICUgRG91YmxlZCBiYWNrc2xhc2hlcyBpbiB0aGUgbmFtZS4KKyAgICAgIHtcYWN0aXZlYmFja3NsYXNoZG91YmxlIFx4ZGVmXHBkZm91dGxpbmVkZXN0eyMzfSUKKyAgICAgICBcYmFja3NsYXNocGFyZW5zXHBkZm91dGxpbmVkZXN0fSUKKyAgICBcZmkKKyAgICAlCisgICAgJSBBbHNvIGRvdWJsZSB0aGUgYmFja3NsYXNoZXMgaW4gdGhlIGRpc3BsYXkgc3RyaW5nLgorICAgIHtcYWN0aXZlYmFja3NsYXNoZG91YmxlIFx4ZGVmXHBkZm91dGxpbmV0ZXh0eyMxfSUKKyAgICAgXGJhY2tzbGFzaHBhcmVuc1xwZGZvdXRsaW5ldGV4dH0lCisgICAgJQorICAgIFxwZGZvdXRsaW5lIGdvdG8gbmFtZXtccGRmbWtwZ257XHBkZm91dGxpbmVkZXN0fX0jMntccGRmb3V0bGluZXRleHR9JQorICB9CisgICUKKyAgXGRlZlxwZGZtYWtlb3V0bGluZXN7JQorICAgIFxiZWdpbmdyb3VwCisgICAgICAlIFRoYW5oJ3MgaGFjayAvIHByb3BlciBicmFjZXMgaW4gYm9va21hcmtzCisgICAgICBcZWRlZlxteWxicmFjZXtcaWZ0cnVlIFxzdHJpbmd7XGVsc2V9XGZpfVxsZXRcez1cbXlsYnJhY2UKKyAgICAgIFxlZGVmXG15cmJyYWNle1xpZmZhbHNle1xlbHNlXHN0cmluZ31cZml9XGxldFx9PVxteXJicmFjZQorICAgICAgJQorICAgICAgJSBSZWFkIHRvYyBzaWxlbnRseSwgdG8gZ2V0IGNvdW50cyBvZiBzdWJlbnRyaWVzIGZvciBccGRmb3V0bGluZS4KKyAgICAgIFxkZWZcbnVtY2hhcGVudHJ5IyMxIyMyIyMzIyM0eyUKKwlcZGVmXHRoaXNjaGFwbnVteyMjMn0lCisJXGRlZlx0aGlzc2VjbnVtezB9JQorCVxkZWZcdGhpc3N1YnNlY251bXswfSUKKyAgICAgIH0lCisgICAgICBcZGVmXG51bXNlY2VudHJ5IyMxIyMyIyMzIyM0eyUKKwlcYWR2YW5jZW51bWJlcntjaGFwXHRoaXNjaGFwbnVtfSUKKwlcZGVmXHRoaXNzZWNudW17IyMyfSUKKwlcZGVmXHRoaXNzdWJzZWNudW17MH0lCisgICAgICB9JQorICAgICAgXGRlZlxudW1zdWJzZWNlbnRyeSMjMSMjMiMjMyMjNHslCisJXGFkdmFuY2VudW1iZXJ7c2VjXHRoaXNzZWNudW19JQorCVxkZWZcdGhpc3N1YnNlY251bXsjIzJ9JQorICAgICAgfSUKKyAgICAgIFxkZWZcbnVtc3Vic3Vic2VjZW50cnkjIzEjIzIjIzMjIzR7JQorCVxhZHZhbmNlbnVtYmVye3N1YnNlY1x0aGlzc3Vic2VjbnVtfSUKKyAgICAgIH0lCisgICAgICBcZGVmXHRoaXNjaGFwbnVtezB9JQorICAgICAgXGRlZlx0aGlzc2VjbnVtezB9JQorICAgICAgXGRlZlx0aGlzc3Vic2VjbnVtezB9JQorICAgICAgJQorICAgICAgJSB1c2UgXGRlZiByYXRoZXIgdGhhbiBcbGV0IGhlcmUgYmVjYXVzZSB3ZSByZWRlZmluZSBcY2hhcGVudHJ5IGV0CisgICAgICAlIGFsLiBhIHNlY29uZCB0aW1lLCBiZWxvdy4KKyAgICAgIFxkZWZcYXBwZW50cnl7XG51bWNoYXBlbnRyeX0lCisgICAgICBcZGVmXGFwcHNlY2VudHJ5e1xudW1zZWNlbnRyeX0lCisgICAgICBcZGVmXGFwcHN1YnNlY2VudHJ5e1xudW1zdWJzZWNlbnRyeX0lCisgICAgICBcZGVmXGFwcHN1YnN1YnNlY2VudHJ5e1xudW1zdWJzdWJzZWNlbnRyeX0lCisgICAgICBcZGVmXHVubmNoYXBlbnRyeXtcbnVtY2hhcGVudHJ5fSUKKyAgICAgIFxkZWZcdW5uc2VjZW50cnl7XG51bXNlY2VudHJ5fSUKKyAgICAgIFxkZWZcdW5uc3Vic2VjZW50cnl7XG51bXN1YnNlY2VudHJ5fSUKKyAgICAgIFxkZWZcdW5uc3Vic3Vic2VjZW50cnl7XG51bXN1YnN1YnNlY2VudHJ5fSUKKyAgICAgIFxyZWFkZGF0YWZpbGV7dG9jfSUKKyAgICAgICUKKyAgICAgICUgUmVhZCB0b2Mgc2Vjb25kIHRpbWUsIHRoaXMgdGltZSBhY3R1YWxseSBwcm9kdWNpbmcgdGhlIG91dGxpbmVzLgorICAgICAgJSBUaGUgYC0nIG1lYW5zIHRha2UgdGhlIFxleHBudW1iZXIgYXMgdGhlIGFic29sdXRlIG51bWJlciBvZgorICAgICAgJSBzdWJlbnRyaWVzLCB3aGljaCB3ZSBjYWxjdWxhdGVkIG9uIG91ciBmaXJzdCByZWFkIG9mIHRoZSAudG9jIGFib3ZlLgorICAgICAgJQorICAgICAgJSBXZSB1c2UgdGhlIG5vZGUgbmFtZXMgYXMgdGhlIGRlc3RpbmF0aW9ucy4KKyAgICAgIFxkZWZcbnVtY2hhcGVudHJ5IyMxIyMyIyMzIyM0eyUKKyAgICAgICAgXGRvcGRmb3V0bGluZXsjIzF9e2NvdW50LVxleHBudW1iZXJ7Y2hhcCMjMn19eyMjM317IyM0fX0lCisgICAgICBcZGVmXG51bXNlY2VudHJ5IyMxIyMyIyMzIyM0eyUKKyAgICAgICAgXGRvcGRmb3V0bGluZXsjIzF9e2NvdW50LVxleHBudW1iZXJ7c2VjIyMyfX17IyMzfXsjIzR9fSUKKyAgICAgIFxkZWZcbnVtc3Vic2VjZW50cnkjIzEjIzIjIzMjIzR7JQorICAgICAgICBcZG9wZGZvdXRsaW5leyMjMX17Y291bnQtXGV4cG51bWJlcntzdWJzZWMjIzJ9fXsjIzN9eyMjNH19JQorICAgICAgXGRlZlxudW1zdWJzdWJzZWNlbnRyeSMjMSMjMiMjMyMjNHslIGNvdW50IGlzIGFsd2F5cyB6ZXJvCisgICAgICAgIFxkb3BkZm91dGxpbmV7IyMxfXt9eyMjM317IyM0fX0lCisgICAgICAlCisgICAgICAlIFBERiBvdXRsaW5lcyBhcmUgZGlzcGxheWVkIHVzaW5nIHN5c3RlbSBmb250cywgaW5zdGVhZCBvZgorICAgICAgJSBkb2N1bWVudCBmb250cy4gIFRoZXJlZm9yZSB3ZSBjYW5ub3QgdXNlIHNwZWNpYWwgY2hhcmFjdGVycywKKyAgICAgICUgc2luY2UgdGhlIGVuY29kaW5nIGlzIHVua25vd24uICBGb3IgZXhhbXBsZSwgdGhlIGVvZ29uZWsgZnJvbQorICAgICAgJSBMYXRpbiAyICgweGVhKSBnZXRzIHRyYW5zbGF0ZWQgdG8gYSB8IGNoYXJhY3Rlci4gIEluZm8gZnJvbQorICAgICAgJSBTdGFzemVrIFdhd3J5a2lld2ljeiwgMTkgSmFuIDIwMDQgMDQ6MDk6MjQgKzAxMDAuCisgICAgICAlCisgICAgICAlIHh4IHRvIGRvIHRoaXMgcmlnaHQsIHdlIGhhdmUgdG8gdHJhbnNsYXRlIDgtYml0IGNoYXJhY3RlcnMgdG8KKyAgICAgICUgdGhlaXIgImJlc3QiIGVxdWl2YWxlbnQsIGJhc2VkIG9uIHRoZSBAZG9jdW1lbnRlbmNvZGluZy4gIFJpZ2h0CisgICAgICAlIG5vdywgSSBndWVzcyB3ZSdsbCBqdXN0IGxldCB0aGUgcGRmIHJlYWRlciBoYXZlIGl0cyB3YXkuCisgICAgICBcaW5kZXhub2ZvbnRzCisgICAgICBcc2V0dXBkYXRhZmlsZQorICAgICAgXGNhdGNvZGVgXFw9XGFjdGl2ZSBcb3RoZXJiYWNrc2xhc2gKKyAgICAgIFxpbnB1dCBcam9ibmFtZS50b2MKKyAgICBcZW5kZ3JvdXAKKyAgfQorICAlCisgIFxkZWZcc2tpcHNwYWNlcyMxe1xkZWZcUFB7IzF9XGRlZlxEe3x9JQorICAgIFxpZnhcUFBcRFxsZXRcbmV4dHNwXHJlbGF4CisgICAgXGVsc2VcbGV0XG5leHRzcFxza2lwc3BhY2VzCisgICAgICBcaWZ4XHBcc3BhY2VcZWxzZVxhZGR0b2tlbnN7XGZpbGVuYW1lfXtcUFB9JQorICAgICAgICBcYWR2YW5jZVxmaWxlbmFtZWxlbmd0aCBieSAxCisgICAgICBcZmkKKyAgICBcZmkKKyAgICBcbmV4dHNwfQorICBcZGVmXGdldGZpbGVuYW1lIzF7XGZpbGVuYW1lbGVuZ3RoPTBcZXhwYW5kYWZ0ZXJcc2tpcHNwYWNlcyMxfFxyZWxheH0KKyAgXGlmbnVtXHBkZnRleHZlcnNpb24gPCAxNAorICAgIFxsZXQgXHN0YXJ0bGluayBccGRmYW5ub3RsaW5rCisgIFxlbHNlCisgICAgXGxldCBcc3RhcnRsaW5rIFxwZGZzdGFydGxpbmsKKyAgXGZpCisgICUgbWFrZSBhIGxpdmUgdXJsIGluIHBkZiBvdXRwdXQuCisgIFxkZWZccGRmdXJsIzF7JQorICAgIFxiZWdpbmdyb3VwCisgICAgICAlIGl0IHNlZW1zIHdlIHJlYWxseSBuZWVkIHlldCBhbm90aGVyIHNldCBvZiBkdW1taWVzOyBoYXZlIG5vdAorICAgICAgJSB0cmllZCB0byBmaWd1cmUgb3V0IHdoYXQgZWFjaCBjb21tYW5kIHNob3VsZCBkbyBpbiB0aGUgY29udGV4dAorICAgICAgJSBvZiBAdXJsLiAgZm9yIG5vdywganVzdCBtYWtlIEAvIGEgbm8tb3AsIHRoYXQncyB0aGUgb25seSBvbmUKKyAgICAgICUgcGVvcGxlIGhhdmUgYWN0dWFsbHkgcmVwb3J0ZWQgYSBwcm9ibGVtIHdpdGguCisgICAgICAlIAorICAgICAgXG5vcm1hbHR1cm5vZmZhY3RpdmUKKyAgICAgIFxkZWZcQHtAfSUKKyAgICAgIFxsZXRcLz1cZW1wdHkKKyAgICAgIFxtYWtldmFsdWVleHBhbmRhYmxlCisgICAgICBcbGVhdmV2bW9kZVxSZWQKKyAgICAgIFxzdGFydGxpbmsgYXR0cnsvQm9yZGVyIFswIDAgMF19JQorICAgICAgICB1c2Vyey9TdWJ0eXBlIC9MaW5rIC9BIDw8IC9TIC9VUkkgL1VSSSAoIzEpID4+fSUKKyAgICBcZW5kZ3JvdXB9CisgIFxkZWZccGRmZ2V0dG9rcyMxLntcc2V0Ym94XGJveEE9XGhib3h7XHRva3NBPXsjMS59XHRva3NCPXt9XG1ha2V0b2tzfX0KKyAgXGRlZlxhZGR0b2tlbnMjMSMye1xlZGVmXGFkZHRva3N7XG5vZXhwYW5kIzE9e1x0aGUjMSMyfX1cYWRkdG9rc30KKyAgXGRlZlxhZG4jMXtcYWRkdG9rZW5ze1x0b2tzQ317IzF9XGdsb2JhbFxjb3VudEE9MVxsZXRcbmV4dD1cbWFrZXRva3N9CisgIFxkZWZccG9wdG9rcyMxIzJ8RU5EVE9LU3x7XGxldFxmaXJzdD0jMVx0b2tzRD17IzF9XHRva3NBPXsjMn19CisgIFxkZWZcbWFrZXRva3N7JQorICAgIFxleHBhbmRhZnRlclxwb3B0b2tzXHRoZVx0b2tzQXxFTkRUT0tTfFxyZWxheAorICAgIFxpZnhcZmlyc3QwXGFkbjAKKyAgICBcZWxzZVxpZnhcZmlyc3QxXGFkbjEgXGVsc2VcaWZ4XGZpcnN0MlxhZG4yIFxlbHNlXGlmeFxmaXJzdDNcYWRuMworICAgIFxlbHNlXGlmeFxmaXJzdDRcYWRuNCBcZWxzZVxpZnhcZmlyc3Q1XGFkbjUgXGVsc2VcaWZ4XGZpcnN0NlxhZG42CisgICAgXGVsc2VcaWZ4XGZpcnN0N1xhZG43IFxlbHNlXGlmeFxmaXJzdDhcYWRuOCBcZWxzZVxpZnhcZmlyc3Q5XGFkbjkKKyAgICBcZWxzZQorICAgICAgXGlmbnVtMD1cY291bnRBXGVsc2VcbWFrZWxpbmtcZmkKKyAgICAgIFxpZnhcZmlyc3QuXGxldFxuZXh0PVxkb25lXGVsc2UKKyAgICAgICAgXGxldFxuZXh0PVxtYWtldG9rcworICAgICAgICBcYWRkdG9rZW5ze1x0b2tzQn17XHRoZVx0b2tzRH0KKyAgICAgICAgXGlmeFxmaXJzdCxcYWRkdG9rZW5ze1x0b2tzQn17XHNwYWNlfVxmaQorICAgICAgXGZpCisgICAgXGZpXGZpXGZpXGZpXGZpXGZpXGZpXGZpXGZpXGZpCisgICAgXG5leHR9CisgIFxkZWZcbWFrZWxpbmt7XGFkZHRva2Vuc3tcdG9rc0J9JQorICAgIHtcbm9leHBhbmRccGRmbGlua3tcdGhlXHRva3NDfX1cdG9rc0M9e31cZ2xvYmFsXGNvdW50QT0wfQorICBcZGVmXHBkZmxpbmsjMXslCisgICAgXHN0YXJ0bGluayBhdHRyey9Cb3JkZXIgWzAgMCAwXX0gZ290byBuYW1le1xwZGZta3BnbnsjMX19CisgICAgXGxpbmtjb2xvciAjMVxlbmRsaW5rfQorICBcZGVmXGRvbmV7XGVkZWZcc3R7XGdsb2JhbFxub2V4cGFuZFx0b2tzQT17XHRoZVx0b2tzQn19XHN0fQorXGVsc2UKKyAgXGxldFxwZGZta2Rlc3QgPSBcZ29iYmxlCisgIFxsZXRccGRmdXJsID0gXGdvYmJsZQorICBcbGV0XGVuZGxpbmsgPSBccmVsYXgKKyAgXGxldFxsaW5rY29sb3IgPSBccmVsYXgKKyAgXGxldFxwZGZtYWtlb3V0bGluZXMgPSBccmVsYXgKK1xmaSAgJSBcaWZ4XHBkZm91dHB1dAorCisKK1xtZXNzYWdle2ZvbnRzLH0KKworJSBDaGFuZ2UgdGhlIGN1cnJlbnQgZm9udCBzdHlsZSB0byAjMSwgcmVtZW1iZXJpbmcgaXQgaW4gXGN1cmZvbnRzdHlsZS4KKyUgRm9yIG5vdywgd2UgZG8gbm90IGFjY3VtdWxhdGUgZm9udCBzdHlsZXM6IEBie0Bpe2Zvb319IHByaW50cyBmb28gaW4KKyUgaXRhbGljcywgbm90IGJvbGQgaXRhbGljcy4KKyUKK1xkZWZcc2V0Zm9udHN0eWxlIzF7JQorICBcZGVmXGN1cmZvbnRzdHlsZXsjMX0lIG5vdCBhcyBhIGNvbnRyb2wgc2VxdWVuY2UsIGJlY2F1c2Ugd2UgYXJlIFxlZGVmJ2QuCisgIFxjc25hbWUgdGVuIzFcZW5kY3NuYW1lICAlIGNoYW5nZSB0aGUgY3VycmVudCBmb250Cit9CisKKyUgU2VsZWN0ICMxIGZvbnRzIHdpdGggdGhlIGN1cnJlbnQgc3R5bGUuCislCitcZGVmXHNlbGVjdGZvbnRzIzF7XGNzbmFtZSAjMWZvbnRzXGVuZGNzbmFtZSBcY3NuYW1lXGN1cmZvbnRzdHlsZVxlbmRjc25hbWV9CisKK1xkZWZccm17XGZhbT0wIFxzZXRmb250c3R5bGV7cm19fQorXGRlZlxpdHtcZmFtPVxpdGZhbSBcc2V0Zm9udHN0eWxle2l0fX0KK1xkZWZcc2x7XGZhbT1cc2xmYW0gXHNldGZvbnRzdHlsZXtzbH19CitcZGVmXGJme1xmYW09XGJmZmFtIFxzZXRmb250c3R5bGV7YmZ9fVxkZWZcYmZzdHlsZW5hbWV7YmZ9CitcZGVmXHR0e1xmYW09XHR0ZmFtIFxzZXRmb250c3R5bGV7dHR9fQorCislIFRleGluZm8gc29ydCBvZiBzdXBwb3J0cyB0aGUgc2FucyBzZXJpZiBmb250IHN0eWxlLCB3aGljaCBwbGFpbiBUZVggZG9lcyBub3QuCislIFNvIHdlIHNldCB1cCBhIFxzZi4KK1xuZXdmYW1cc2ZmYW0KK1xkZWZcc2Z7XGZhbT1cc2ZmYW0gXHNldGZvbnRzdHlsZXtzZn19CitcbGV0XGxpID0gXHNmICUgU29tZXRpbWVzIHdlIGNhbGwgaXQgXGxpLCBub3QgXHNmLgorCislIFdlIGRvbid0IG5lZWQgbWF0aCBmb3IgdGhpcyBmb250IHN0eWxlLgorXGRlZlx0dHNse1xzZXRmb250c3R5bGV7dHRzbH19CisKKworJSBEZWZhdWx0IGxlYWRpbmcuCitcbmV3ZGltZW5cdGV4dGxlYWRpbmcgIFx0ZXh0bGVhZGluZyA9IDEzLjJwdAorCislIFNldCB0aGUgYmFzZWxpbmVza2lwIHRvICMxLCBhbmQgdGhlIGxpbmVza2lwIGFuZCBzdHJ1dCBzaXplCislIGNvcnJlc3BvbmRpbmdseS4gIFRoZXJlIGlzIG5vIGRlZXAgbWVhbmluZyBiZWhpbmQgdGhlc2UgbWFnaWMgbnVtYmVycworJSB1c2VkIGFzIGZhY3RvcnM7IHRoZXkganVzdCBtYXRjaCAoY2xvc2VseSBlbm91Z2gpIHdoYXQgS251dGggZGVmaW5lZC4KKyUKK1xkZWZcbGluZXNraXBmYWN0b3J7LjA4MzMzfQorXGRlZlxzdHJ1dGhlaWdodHBlcmNlbnR7LjcwODMzfQorXGRlZlxzdHJ1dGRlcHRocGVyY2VudCB7LjI5MTY3fQorJQorXGRlZlxzZXRsZWFkaW5nIzF7JQorICBcbm9ybWFsYmFzZWxpbmVza2lwID0gIzFccmVsYXgKKyAgXG5vcm1hbGxpbmVza2lwID0gXGxpbmVza2lwZmFjdG9yXG5vcm1hbGJhc2VsaW5lc2tpcAorICBcbm9ybWFsYmFzZWxpbmVzCisgIFxzZXRib3hcc3RydXRib3ggPVxoYm94eyUKKyAgICBcdnJ1bGUgd2lkdGgwcHQgaGVpZ2h0XHN0cnV0aGVpZ2h0cGVyY2VudFxiYXNlbGluZXNraXAKKyAgICAgICAgICAgICAgICAgICAgZGVwdGggXHN0cnV0ZGVwdGhwZXJjZW50IFxiYXNlbGluZXNraXAKKyAgfSUKK30KKworCislIFNldCB0aGUgZm9udCBtYWNybyAjMSB0byB0aGUgZm9udCBuYW1lZCAjMiwgYWRkaW5nIG9uIHRoZQorJSBzcGVjaWZpZWQgZm9udCBwcmVmaXggKG5vcm1hbGx5IGBjbScpLgorJSAjMyBpcyB0aGUgZm9udCdzIGRlc2lnbiBzaXplLCAjNCBpcyBhIHNjYWxlIGZhY3RvcgorXGRlZlxzZXRmb250IzEjMiMzIzR7XGZvbnQjMT1cZm9udHByZWZpeCMyIzMgc2NhbGVkICM0fQorCisKKyUgVXNlIGNtIGFzIHRoZSBkZWZhdWx0IGZvbnQgcHJlZml4LgorJSBUbyBzcGVjaWZ5IHRoZSBmb250IHByZWZpeCwgeW91IG11c3QgZGVmaW5lIFxmb250cHJlZml4CislIGJlZm9yZSB5b3UgcmVhZCBpbiB0ZXhpbmZvLnRleC4KK1xpZnhcZm9udHByZWZpeFx1bmRlZmluZWQKK1xkZWZcZm9udHByZWZpeHtjbX0KK1xmaQorJSBTdXBwb3J0IGZvbnQgZmFtaWxpZXMgdGhhdCBkb24ndCB1c2UgdGhlIHNhbWUgbmFtaW5nIHNjaGVtZSBhcyBDTS4KK1xkZWZccm1zaGFwZXtyfQorXGRlZlxybWJzaGFwZXtieH0gICAgICAgICAgICAgICAld2hlcmUgdGhlIG5vcm1hbCBmYWNlIGlzIGJvbGQKK1xkZWZcYmZzaGFwZXtifQorXGRlZlxieHNoYXBle2J4fQorXGRlZlx0dHNoYXBle3R0fQorXGRlZlx0dGJzaGFwZXt0dH0KK1xkZWZcdHRzbHNoYXBle3NsdHR9CitcZGVmXGl0c2hhcGV7dGl9CitcZGVmXGl0YnNoYXBle2J4dGl9CitcZGVmXHNsc2hhcGV7c2x9CitcZGVmXHNsYnNoYXBle2J4c2x9CitcZGVmXHNmc2hhcGV7c3N9CitcZGVmXHNmYnNoYXBle3NzfQorXGRlZlxzY3NoYXBle2NzY30KK1xkZWZcc2Nic2hhcGV7Y3NjfQorCislIERlZmluaXRpb25zIGZvciBhIG1haW4gdGV4dCBzaXplIG9mIDExcHQuICBUaGlzIGlzIHRoZSBkZWZhdWx0IGluCislIFRleGluZm8uCislIAorXGRlZlxkZWZpbmV0ZXh0Zm9udHNpemV4aXsKKyUgVGV4dCBmb250cyAoMTEuMnB0LCBtYWdzdGVwMSkuCitcZGVmXHRleHRub21pbmFsc2l6ZXsxMXB0fQorXGVkZWZcbWFpbm1hZ3N0ZXB7XG1hZ3N0ZXBoYWxmfQorXHNldGZvbnRcdGV4dHJtXHJtc2hhcGV7MTB9e1xtYWlubWFnc3RlcH0KK1xzZXRmb250XHRleHR0dFx0dHNoYXBlezEwfXtcbWFpbm1hZ3N0ZXB9Citcc2V0Zm9udFx0ZXh0YmZcYmZzaGFwZXsxMH17XG1haW5tYWdzdGVwfQorXHNldGZvbnRcdGV4dGl0XGl0c2hhcGV7MTB9e1xtYWlubWFnc3RlcH0KK1xzZXRmb250XHRleHRzbFxzbHNoYXBlezEwfXtcbWFpbm1hZ3N0ZXB9Citcc2V0Zm9udFx0ZXh0c2Zcc2ZzaGFwZXsxMH17XG1haW5tYWdzdGVwfQorXHNldGZvbnRcdGV4dHNjXHNjc2hhcGV7MTB9e1xtYWlubWFnc3RlcH0KK1xzZXRmb250XHRleHR0dHNsXHR0c2xzaGFwZXsxMH17XG1haW5tYWdzdGVwfQorXGZvbnRcdGV4dGk9Y21taTEwIHNjYWxlZCBcbWFpbm1hZ3N0ZXAKK1xmb250XHRleHRzeT1jbXN5MTAgc2NhbGVkIFxtYWlubWFnc3RlcAorCislIEEgZmV3IGZvbnRzIGZvciBAZGVmdW4gbmFtZXMgYW5kIGFyZ3MuCitcc2V0Zm9udFxkZWZiZlxiZnNoYXBlezEwfXtcbWFnc3RlcDF9Citcc2V0Zm9udFxkZWZ0dFx0dHNoYXBlezEwfXtcbWFnc3RlcDF9Citcc2V0Zm9udFxkZWZ0dHNsXHR0c2xzaGFwZXsxMH17XG1hZ3N0ZXAxfQorXGRlZlxkZntcbGV0XHRlbnR0PVxkZWZ0dCBcbGV0XHRlbmJmID0gXGRlZmJmIFxsZXRcdGVudHRzbD1cZGVmdHRzbCBcYmZ9CisKKyUgRm9udHMgZm9yIGluZGljZXMsIGZvb3Rub3Rlcywgc21hbGwgZXhhbXBsZXMgKDlwdCkuCitcZGVmXHNtYWxsbm9taW5hbHNpemV7OXB0fQorXHNldGZvbnRcc21hbGxybVxybXNoYXBlezl9ezEwMDB9Citcc2V0Zm9udFxzbWFsbHR0XHR0c2hhcGV7OX17MTAwMH0KK1xzZXRmb250XHNtYWxsYmZcYmZzaGFwZXsxMH17OTAwfQorXHNldGZvbnRcc21hbGxpdFxpdHNoYXBlezl9ezEwMDB9Citcc2V0Zm9udFxzbWFsbHNsXHNsc2hhcGV7OX17MTAwMH0KK1xzZXRmb250XHNtYWxsc2Zcc2ZzaGFwZXs5fXsxMDAwfQorXHNldGZvbnRcc21hbGxzY1xzY3NoYXBlezEwfXs5MDB9Citcc2V0Zm9udFxzbWFsbHR0c2xcdHRzbHNoYXBlezEwfXs5MDB9CitcZm9udFxzbWFsbGk9Y21taTkKK1xmb250XHNtYWxsc3k9Y21zeTkKKworJSBGb250cyBmb3Igc21hbGwgZXhhbXBsZXMgKDhwdCkuCitcZGVmXHNtYWxsZXJub21pbmFsc2l6ZXs4cHR9Citcc2V0Zm9udFxzbWFsbGVycm1ccm1zaGFwZXs4fXsxMDAwfQorXHNldGZvbnRcc21hbGxlcnR0XHR0c2hhcGV7OH17MTAwMH0KK1xzZXRmb250XHNtYWxsZXJiZlxiZnNoYXBlezEwfXs4MDB9Citcc2V0Zm9udFxzbWFsbGVyaXRcaXRzaGFwZXs4fXsxMDAwfQorXHNldGZvbnRcc21hbGxlcnNsXHNsc2hhcGV7OH17MTAwMH0KK1xzZXRmb250XHNtYWxsZXJzZlxzZnNoYXBlezh9ezEwMDB9Citcc2V0Zm9udFxzbWFsbGVyc2Ncc2NzaGFwZXsxMH17ODAwfQorXHNldGZvbnRcc21hbGxlcnR0c2xcdHRzbHNoYXBlezEwfXs4MDB9CitcZm9udFxzbWFsbGVyaT1jbW1pOAorXGZvbnRcc21hbGxlcnN5PWNtc3k4CisKKyUgRm9udHMgZm9yIHRpdGxlIHBhZ2UgKDIwLjRwdCk6CitcZGVmXHRpdGxlbm9taW5hbHNpemV7MjBwdH0KK1xzZXRmb250XHRpdGxlcm1ccm1ic2hhcGV7MTJ9e1xtYWdzdGVwM30KK1xzZXRmb250XHRpdGxlaXRcaXRic2hhcGV7MTB9e1xtYWdzdGVwNH0KK1xzZXRmb250XHRpdGxlc2xcc2xic2hhcGV7MTB9e1xtYWdzdGVwNH0KK1xzZXRmb250XHRpdGxldHRcdHRic2hhcGV7MTJ9e1xtYWdzdGVwM30KK1xzZXRmb250XHRpdGxldHRzbFx0dHNsc2hhcGV7MTB9e1xtYWdzdGVwNH0KK1xzZXRmb250XHRpdGxlc2Zcc2Zic2hhcGV7MTd9e1xtYWdzdGVwMX0KK1xsZXRcdGl0bGViZj1cdGl0bGVybQorXHNldGZvbnRcdGl0bGVzY1xzY2JzaGFwZXsxMH17XG1hZ3N0ZXA0fQorXGZvbnRcdGl0bGVpPWNtbWkxMiBzY2FsZWQgXG1hZ3N0ZXAzCitcZm9udFx0aXRsZXN5PWNtc3kxMCBzY2FsZWQgXG1hZ3N0ZXA0CitcZGVmXGF1dGhvcnJte1xzZWNybX0KK1xkZWZcYXV0aG9ydHR7XHNlY3R0fQorCislIENoYXB0ZXIgKGFuZCB1bm51bWJlcmVkKSBmb250cyAoMTcuMjhwdCkuCitcZGVmXGNoYXBub21pbmFsc2l6ZXsxN3B0fQorXHNldGZvbnRcY2hhcHJtXHJtYnNoYXBlezEyfXtcbWFnc3RlcDJ9Citcc2V0Zm9udFxjaGFwaXRcaXRic2hhcGV7MTB9e1xtYWdzdGVwM30KK1xzZXRmb250XGNoYXBzbFxzbGJzaGFwZXsxMH17XG1hZ3N0ZXAzfQorXHNldGZvbnRcY2hhcHR0XHR0YnNoYXBlezEyfXtcbWFnc3RlcDJ9Citcc2V0Zm9udFxjaGFwdHRzbFx0dHNsc2hhcGV7MTB9e1xtYWdzdGVwM30KK1xzZXRmb250XGNoYXBzZlxzZmJzaGFwZXsxN317MTAwMH0KK1xsZXRcY2hhcGJmPVxjaGFwcm0KK1xzZXRmb250XGNoYXBzY1xzY2JzaGFwZXsxMH17XG1hZ3N0ZXAzfQorXGZvbnRcY2hhcGk9Y21taTEyIHNjYWxlZCBcbWFnc3RlcDIKK1xmb250XGNoYXBzeT1jbXN5MTAgc2NhbGVkIFxtYWdzdGVwMworCislIFNlY3Rpb24gZm9udHMgKDE0LjRwdCkuCitcZGVmXHNlY25vbWluYWxzaXplezE0cHR9Citcc2V0Zm9udFxzZWNybVxybWJzaGFwZXsxMn17XG1hZ3N0ZXAxfQorXHNldGZvbnRcc2VjaXRcaXRic2hhcGV7MTB9e1xtYWdzdGVwMn0KK1xzZXRmb250XHNlY3NsXHNsYnNoYXBlezEwfXtcbWFnc3RlcDJ9Citcc2V0Zm9udFxzZWN0dFx0dGJzaGFwZXsxMn17XG1hZ3N0ZXAxfQorXHNldGZvbnRcc2VjdHRzbFx0dHNsc2hhcGV7MTB9e1xtYWdzdGVwMn0KK1xzZXRmb250XHNlY3NmXHNmYnNoYXBlezEyfXtcbWFnc3RlcDF9CitcbGV0XHNlY2JmXHNlY3JtCitcc2V0Zm9udFxzZWNzY1xzY2JzaGFwZXsxMH17XG1hZ3N0ZXAyfQorXGZvbnRcc2VjaT1jbW1pMTIgc2NhbGVkIFxtYWdzdGVwMQorXGZvbnRcc2Vjc3k9Y21zeTEwIHNjYWxlZCBcbWFnc3RlcDIKKworJSBTdWJzZWN0aW9uIGZvbnRzICgxMy4xNXB0KS4KK1xkZWZcc3NlY25vbWluYWxzaXplezEzcHR9Citcc2V0Zm9udFxzc2Vjcm1ccm1ic2hhcGV7MTJ9e1xtYWdzdGVwaGFsZn0KK1xzZXRmb250XHNzZWNpdFxpdGJzaGFwZXsxMH17MTMxNX0KK1xzZXRmb250XHNzZWNzbFxzbGJzaGFwZXsxMH17MTMxNX0KK1xzZXRmb250XHNzZWN0dFx0dGJzaGFwZXsxMn17XG1hZ3N0ZXBoYWxmfQorXHNldGZvbnRcc3NlY3R0c2xcdHRzbHNoYXBlezEwfXsxMzE1fQorXHNldGZvbnRcc3NlY3NmXHNmYnNoYXBlezEyfXtcbWFnc3RlcGhhbGZ9CitcbGV0XHNzZWNiZlxzc2Vjcm0KK1xzZXRmb250XHNzZWNzY1xzY2JzaGFwZXsxMH17MTMxNX0KK1xmb250XHNzZWNpPWNtbWkxMiBzY2FsZWQgXG1hZ3N0ZXBoYWxmCitcZm9udFxzc2Vjc3k9Y21zeTEwIHNjYWxlZCAxMzE1CisKKyUgUmVkdWNlZCBmb250cyBmb3IgQGFjcm8gaW4gdGV4dCAoMTBwdCkuCitcZGVmXHJlZHVjZWRub21pbmFsc2l6ZXsxMHB0fQorXHNldGZvbnRccmVkdWNlZHJtXHJtc2hhcGV7MTB9ezEwMDB9Citcc2V0Zm9udFxyZWR1Y2VkdHRcdHRzaGFwZXsxMH17MTAwMH0KK1xzZXRmb250XHJlZHVjZWRiZlxiZnNoYXBlezEwfXsxMDAwfQorXHNldGZvbnRccmVkdWNlZGl0XGl0c2hhcGV7MTB9ezEwMDB9Citcc2V0Zm9udFxyZWR1Y2Vkc2xcc2xzaGFwZXsxMH17MTAwMH0KK1xzZXRmb250XHJlZHVjZWRzZlxzZnNoYXBlezEwfXsxMDAwfQorXHNldGZvbnRccmVkdWNlZHNjXHNjc2hhcGV7MTB9ezEwMDB9Citcc2V0Zm9udFxyZWR1Y2VkdHRzbFx0dHNsc2hhcGV7MTB9ezEwMDB9CitcZm9udFxyZWR1Y2VkaT1jbW1pMTAKK1xmb250XHJlZHVjZWRzeT1jbXN5MTAKKworJSByZXNldCB0aGUgY3VycmVudCBmb250cworXHRleHRmb250cworXHJtCit9ICUgZW5kIG9mIDExcHQgdGV4dCBmb250IHNpemUgZGVmaW5pdGlvbnMKKworCislIERlZmluaXRpb25zIHRvIG1ha2UgdGhlIG1haW4gdGV4dCBiZSAxMHB0IENvbXB1dGVyIE1vZGVybiwgd2l0aAorJSBzZWN0aW9uLCBjaGFwdGVyLCBldGMuLCBzaXplcyBmb2xsb3dpbmcgc3VpdC4gIFRoaXMgaXMgZm9yIHRoZSBHTlUKKyUgUHJlc3MgcHJpbnRpbmcgb2YgdGhlIEVtYWNzIDIyIG1hbnVhbC4gIE1heWJlIG90aGVyIG1hbnVhbHMgaW4gdGhlCislIGZ1dHVyZS4gIFVzZWQgd2l0aCBAc21hbGxib29rLCB3aGljaCBzZXRzIHRoZSBsZWFkaW5nIHRvIDEycHQuCislIAorXGRlZlxkZWZpbmV0ZXh0Zm9udHNpemV4eyUKKyUgVGV4dCBmb250cyAoMTBwdCkuCitcZGVmXHRleHRub21pbmFsc2l6ZXsxMHB0fQorXGVkZWZcbWFpbm1hZ3N0ZXB7MTAwMH0KK1xzZXRmb250XHRleHRybVxybXNoYXBlezEwfXtcbWFpbm1hZ3N0ZXB9Citcc2V0Zm9udFx0ZXh0dHRcdHRzaGFwZXsxMH17XG1haW5tYWdzdGVwfQorXHNldGZvbnRcdGV4dGJmXGJmc2hhcGV7MTB9e1xtYWlubWFnc3RlcH0KK1xzZXRmb250XHRleHRpdFxpdHNoYXBlezEwfXtcbWFpbm1hZ3N0ZXB9Citcc2V0Zm9udFx0ZXh0c2xcc2xzaGFwZXsxMH17XG1haW5tYWdzdGVwfQorXHNldGZvbnRcdGV4dHNmXHNmc2hhcGV7MTB9e1xtYWlubWFnc3RlcH0KK1xzZXRmb250XHRleHRzY1xzY3NoYXBlezEwfXtcbWFpbm1hZ3N0ZXB9Citcc2V0Zm9udFx0ZXh0dHRzbFx0dHNsc2hhcGV7MTB9e1xtYWlubWFnc3RlcH0KK1xmb250XHRleHRpPWNtbWkxMCBzY2FsZWQgXG1haW5tYWdzdGVwCitcZm9udFx0ZXh0c3k9Y21zeTEwIHNjYWxlZCBcbWFpbm1hZ3N0ZXAKKworJSBBIGZldyBmb250cyBmb3IgQGRlZnVuIG5hbWVzIGFuZCBhcmdzLgorXHNldGZvbnRcZGVmYmZcYmZzaGFwZXsxMH17XG1hZ3N0ZXBoYWxmfQorXHNldGZvbnRcZGVmdHRcdHRzaGFwZXsxMH17XG1hZ3N0ZXBoYWxmfQorXHNldGZvbnRcZGVmdHRzbFx0dHNsc2hhcGV7MTB9e1xtYWdzdGVwaGFsZn0KK1xkZWZcZGZ7XGxldFx0ZW50dD1cZGVmdHQgXGxldFx0ZW5iZiA9IFxkZWZiZiBcbGV0XHRlbnR0c2w9XGRlZnR0c2wgXGJmfQorCislIEZvbnRzIGZvciBpbmRpY2VzLCBmb290bm90ZXMsIHNtYWxsIGV4YW1wbGVzICg5cHQpLgorXGRlZlxzbWFsbG5vbWluYWxzaXplezlwdH0KK1xzZXRmb250XHNtYWxscm1ccm1zaGFwZXs5fXsxMDAwfQorXHNldGZvbnRcc21hbGx0dFx0dHNoYXBlezl9ezEwMDB9Citcc2V0Zm9udFxzbWFsbGJmXGJmc2hhcGV7MTB9ezkwMH0KK1xzZXRmb250XHNtYWxsaXRcaXRzaGFwZXs5fXsxMDAwfQorXHNldGZvbnRcc21hbGxzbFxzbHNoYXBlezl9ezEwMDB9Citcc2V0Zm9udFxzbWFsbHNmXHNmc2hhcGV7OX17MTAwMH0KK1xzZXRmb250XHNtYWxsc2Ncc2NzaGFwZXsxMH17OTAwfQorXHNldGZvbnRcc21hbGx0dHNsXHR0c2xzaGFwZXsxMH17OTAwfQorXGZvbnRcc21hbGxpPWNtbWk5CitcZm9udFxzbWFsbHN5PWNtc3k5CisKKyUgRm9udHMgZm9yIHNtYWxsIGV4YW1wbGVzICg4cHQpLgorXGRlZlxzbWFsbGVybm9taW5hbHNpemV7OHB0fQorXHNldGZvbnRcc21hbGxlcnJtXHJtc2hhcGV7OH17MTAwMH0KK1xzZXRmb250XHNtYWxsZXJ0dFx0dHNoYXBlezh9ezEwMDB9Citcc2V0Zm9udFxzbWFsbGVyYmZcYmZzaGFwZXsxMH17ODAwfQorXHNldGZvbnRcc21hbGxlcml0XGl0c2hhcGV7OH17MTAwMH0KK1xzZXRmb250XHNtYWxsZXJzbFxzbHNoYXBlezh9ezEwMDB9Citcc2V0Zm9udFxzbWFsbGVyc2Zcc2ZzaGFwZXs4fXsxMDAwfQorXHNldGZvbnRcc21hbGxlcnNjXHNjc2hhcGV7MTB9ezgwMH0KK1xzZXRmb250XHNtYWxsZXJ0dHNsXHR0c2xzaGFwZXsxMH17ODAwfQorXGZvbnRcc21hbGxlcmk9Y21taTgKK1xmb250XHNtYWxsZXJzeT1jbXN5OAorCislIEZvbnRzIGZvciB0aXRsZSBwYWdlICgyMC40cHQpOgorXGRlZlx0aXRsZW5vbWluYWxzaXplezIwcHR9Citcc2V0Zm9udFx0aXRsZXJtXHJtYnNoYXBlezEyfXtcbWFnc3RlcDN9Citcc2V0Zm9udFx0aXRsZWl0XGl0YnNoYXBlezEwfXtcbWFnc3RlcDR9Citcc2V0Zm9udFx0aXRsZXNsXHNsYnNoYXBlezEwfXtcbWFnc3RlcDR9Citcc2V0Zm9udFx0aXRsZXR0XHR0YnNoYXBlezEyfXtcbWFnc3RlcDN9Citcc2V0Zm9udFx0aXRsZXR0c2xcdHRzbHNoYXBlezEwfXtcbWFnc3RlcDR9Citcc2V0Zm9udFx0aXRsZXNmXHNmYnNoYXBlezE3fXtcbWFnc3RlcDF9CitcbGV0XHRpdGxlYmY9XHRpdGxlcm0KK1xzZXRmb250XHRpdGxlc2Ncc2Nic2hhcGV7MTB9e1xtYWdzdGVwNH0KK1xmb250XHRpdGxlaT1jbW1pMTIgc2NhbGVkIFxtYWdzdGVwMworXGZvbnRcdGl0bGVzeT1jbXN5MTAgc2NhbGVkIFxtYWdzdGVwNAorXGRlZlxhdXRob3JybXtcc2Vjcm19CitcZGVmXGF1dGhvcnR0e1xzZWN0dH0KKworJSBDaGFwdGVyIGZvbnRzICgxNC40cHQpLgorXGRlZlxjaGFwbm9taW5hbHNpemV7MTRwdH0KK1xzZXRmb250XGNoYXBybVxybWJzaGFwZXsxMn17XG1hZ3N0ZXAxfQorXHNldGZvbnRcY2hhcGl0XGl0YnNoYXBlezEwfXtcbWFnc3RlcDJ9Citcc2V0Zm9udFxjaGFwc2xcc2xic2hhcGV7MTB9e1xtYWdzdGVwMn0KK1xzZXRmb250XGNoYXB0dFx0dGJzaGFwZXsxMn17XG1hZ3N0ZXAxfQorXHNldGZvbnRcY2hhcHR0c2xcdHRzbHNoYXBlezEwfXtcbWFnc3RlcDJ9Citcc2V0Zm9udFxjaGFwc2Zcc2Zic2hhcGV7MTJ9e1xtYWdzdGVwMX0KK1xsZXRcY2hhcGJmXGNoYXBybQorXHNldGZvbnRcY2hhcHNjXHNjYnNoYXBlezEwfXtcbWFnc3RlcDJ9CitcZm9udFxjaGFwaT1jbW1pMTIgc2NhbGVkIFxtYWdzdGVwMQorXGZvbnRcY2hhcHN5PWNtc3kxMCBzY2FsZWQgXG1hZ3N0ZXAyCisKKyUgU2VjdGlvbiBmb250cyAoMTJwdCkuCitcZGVmXHNlY25vbWluYWxzaXplezEycHR9Citcc2V0Zm9udFxzZWNybVxybWJzaGFwZXsxMn17MTAwMH0KK1xzZXRmb250XHNlY2l0XGl0YnNoYXBlezEwfXtcbWFnc3RlcDF9Citcc2V0Zm9udFxzZWNzbFxzbGJzaGFwZXsxMH17XG1hZ3N0ZXAxfQorXHNldGZvbnRcc2VjdHRcdHRic2hhcGV7MTJ9ezEwMDB9Citcc2V0Zm9udFxzZWN0dHNsXHR0c2xzaGFwZXsxMH17XG1hZ3N0ZXAxfQorXHNldGZvbnRcc2Vjc2Zcc2Zic2hhcGV7MTJ9ezEwMDB9CitcbGV0XHNlY2JmXHNlY3JtCitcc2V0Zm9udFxzZWNzY1xzY2JzaGFwZXsxMH17XG1hZ3N0ZXAxfQorXGZvbnRcc2VjaT1jbW1pMTIgCitcZm9udFxzZWNzeT1jbXN5MTAgc2NhbGVkIFxtYWdzdGVwMQorCislIFN1YnNlY3Rpb24gZm9udHMgKDEwcHQpLgorXGRlZlxzc2Vjbm9taW5hbHNpemV7MTBwdH0KK1xzZXRmb250XHNzZWNybVxybWJzaGFwZXsxMH17MTAwMH0KK1xzZXRmb250XHNzZWNpdFxpdGJzaGFwZXsxMH17MTAwMH0KK1xzZXRmb250XHNzZWNzbFxzbGJzaGFwZXsxMH17MTAwMH0KK1xzZXRmb250XHNzZWN0dFx0dGJzaGFwZXsxMH17MTAwMH0KK1xzZXRmb250XHNzZWN0dHNsXHR0c2xzaGFwZXsxMH17MTAwMH0KK1xzZXRmb250XHNzZWNzZlxzZmJzaGFwZXsxMH17MTAwMH0KK1xsZXRcc3NlY2JmXHNzZWNybQorXHNldGZvbnRcc3NlY3NjXHNjYnNoYXBlezEwfXsxMDAwfQorXGZvbnRcc3NlY2k9Y21taTEwCitcZm9udFxzc2Vjc3k9Y21zeTEwCisKKyUgUmVkdWNlZCBmb250cyBmb3IgQGFjcm8gaW4gdGV4dCAoOXB0KS4KK1xkZWZccmVkdWNlZG5vbWluYWxzaXplezlwdH0KK1xzZXRmb250XHJlZHVjZWRybVxybXNoYXBlezl9ezEwMDB9Citcc2V0Zm9udFxyZWR1Y2VkdHRcdHRzaGFwZXs5fXsxMDAwfQorXHNldGZvbnRccmVkdWNlZGJmXGJmc2hhcGV7MTB9ezkwMH0KK1xzZXRmb250XHJlZHVjZWRpdFxpdHNoYXBlezl9ezEwMDB9Citcc2V0Zm9udFxyZWR1Y2Vkc2xcc2xzaGFwZXs5fXsxMDAwfQorXHNldGZvbnRccmVkdWNlZHNmXHNmc2hhcGV7OX17MTAwMH0KK1xzZXRmb250XHJlZHVjZWRzY1xzY3NoYXBlezEwfXs5MDB9Citcc2V0Zm9udFxyZWR1Y2VkdHRzbFx0dHNsc2hhcGV7MTB9ezkwMH0KK1xmb250XHJlZHVjZWRpPWNtbWk5CitcZm9udFxyZWR1Y2Vkc3k9Y21zeTkKKworJSByZWR1Y2Ugc3BhY2UgYmV0d2VlbiBwYXJhZ3JhcGhzCitcZGl2aWRlXHBhcnNraXAgYnkgMgorCislIHJlc2V0IHRoZSBjdXJyZW50IGZvbnRzCitcdGV4dGZvbnRzCitccm0KK30gJSBlbmQgb2YgMTBwdCB0ZXh0IGZvbnQgc2l6ZSBkZWZpbml0aW9ucworCisKKyUgV2UgcHJvdmlkZSB0aGUgdXNlci1sZXZlbCBjb21tYW5kCislICAgQGZvbnR0ZXh0c2l6ZSAxMAorJSAob3IgMTEpIHRvIHJlZGVmaW5lIHRoZSB0ZXh0IGZvbnQgc2l6ZS4gIHB0IGlzIGFzc3VtZWQuCislIAorXGRlZlx4d29yZHsxMH0KK1xkZWZceGl3b3JkezExfQorJQorXHBhcnNlYXJnZGVmXGZvbnR0ZXh0c2l6ZXslCisgIFxkZWZcdGV4dHNpemVhcmd7IzF9JQorICBcd2xvZ3tkb2luZyBAZm9udHRleHRzaXplIFx0ZXh0c2l6ZWFyZ30lCisgICUKKyAgJSBTZXQgXGdsb2JhbGRlZnMgc28gdGhhdCBkb2N1bWVudHMgY2FuIHVzZSB0aGlzIGluc2lkZSBAdGV4LCBzaW5jZQorICAlIG1ha2VpbmZvIDQuOCBkb2VzIG5vdCBzdXBwb3J0IGl0LCBidXQgd2UgbmVlZCBpdCBub25ldGhlbGVzcy4KKyAgJSAKKyBcYmVnaW5ncm91cCBcZ2xvYmFsZGVmcz0xCisgIFxpZnhcdGV4dHNpemVhcmdceHdvcmQgXGRlZmluZXRleHRmb250c2l6ZXgKKyAgXGVsc2UgXGlmeFx0ZXh0c2l6ZWFyZ1x4aXdvcmQgXGRlZmluZXRleHRmb250c2l6ZXhpCisgIFxlbHNlCisgICAgXGVycmhlbHA9XEVNc2ltcGxlCisgICAgXGVycm1lc3NhZ2V7QGZvbnR0ZXh0c2l6ZSBvbmx5IHN1cHBvcnRzIGAxMCcgb3IgYDExJywgbm90IGBcdGV4dHNpemVhcmcnfQorICBcZmlcZmkKKyBcZW5kZ3JvdXAKK30KKworCislIEluIG9yZGVyIGZvciB0aGUgZm9udCBjaGFuZ2VzIHRvIGFmZmVjdCBtb3N0IG1hdGggc3ltYm9scyBhbmQgbGV0dGVycywKKyUgd2UgaGF2ZSB0byBkZWZpbmUgdGhlIFx0ZXh0Zm9udCBvZiB0aGUgc3RhbmRhcmQgZmFtaWxpZXMuICBTaW5jZQorJSB0ZXhpbmZvIGRvZXNuJ3QgYWxsb3cgZm9yIHByb2R1Y2luZyBzdWJzY3JpcHRzIGFuZCBzdXBlcnNjcmlwdHMgZXhjZXB0CislIGluIHRoZSBtYWluIHRleHQsIHdlIGRvbid0IGJvdGhlciB0byByZXNldCBcc2NyaXB0Zm9udCBhbmQKKyUgXHNjcmlwdHNjcmlwdGZvbnQgKHdoaWNoIHdvdWxkIGFsc28gcmVxdWlyZSBsb2FkaW5nIGEgbG90IG1vcmUgZm9udHMpLgorJQorXGRlZlxyZXNldG1hdGhmb250c3slCisgIFx0ZXh0Zm9udDA9XHRlbnJtIFx0ZXh0Zm9udDE9XHRlbmkgXHRleHRmb250Mj1cdGVuc3kKKyAgXHRleHRmb250XGl0ZmFtPVx0ZW5pdCBcdGV4dGZvbnRcc2xmYW09XHRlbnNsIFx0ZXh0Zm9udFxiZmZhbT1cdGVuYmYKKyAgXHRleHRmb250XHR0ZmFtPVx0ZW50dCBcdGV4dGZvbnRcc2ZmYW09XHRlbnNmCit9CisKKyUgVGhlIGZvbnQtY2hhbmdpbmcgY29tbWFuZHMgcmVkZWZpbmUgdGhlIG1lYW5pbmdzIG9mIFx0ZW5TVFlMRSwgaW5zdGVhZAorJSBvZiBqdXN0IFxTVFlMRS4gIFdlIGRvIHRoaXMgYmVjYXVzZSBcU1RZTEUgbmVlZHMgdG8gYWxzbyBzZXQgdGhlCislIGN1cnJlbnQgXGZhbSBmb3IgbWF0aCBtb2RlLiAgT3VyIFxTVFlMRSAoZS5nLiwgXHJtKSBjb21tYW5kcyBoYXJkd2lyZQorJSBcdGVuU1RZTEUgdG8gc2V0IHRoZSBjdXJyZW50IGZvbnQuCislCislIEVhY2ggZm9udC1jaGFuZ2luZyBjb21tYW5kIGFsc28gc2V0cyB0aGUgbmFtZXMgXGxzaXplIChvbmUgc2l6ZSBsb3dlcikKKyUgYW5kIFxsbGxzaXplICh0aHJlZSBzaXplcyBsb3dlcikuICBUaGVzZSByZWxhdGl2ZSBjb21tYW5kcyBhcmUgdXNlZCBpbgorJSB0aGUgTGFUZVggbG9nbyBhbmQgYWNyb255bXMuCislCislIFRoaXMgYWxsIG5lZWRzIGdlbmVyYWxpemluZywgYmFkbHkuCislCitcZGVmXHRleHRmb250c3slCisgIFxsZXRcdGVucm09XHRleHRybSBcbGV0XHRlbml0PVx0ZXh0aXQgXGxldFx0ZW5zbD1cdGV4dHNsCisgIFxsZXRcdGVuYmY9XHRleHRiZiBcbGV0XHRlbnR0PVx0ZXh0dHQgXGxldFxzbWFsbGNhcHM9XHRleHRzYworICBcbGV0XHRlbnNmPVx0ZXh0c2YgXGxldFx0ZW5pPVx0ZXh0aSBcbGV0XHRlbnN5PVx0ZXh0c3kKKyAgXGxldFx0ZW50dHNsPVx0ZXh0dHRzbAorICBcZGVmXGN1cmZvbnRzaXple3RleHR9JQorICBcZGVmXGxzaXple3JlZHVjZWR9XGRlZlxsbGxzaXple3NtYWxsZXJ9JQorICBccmVzZXRtYXRoZm9udHMgXHNldGxlYWRpbmd7XHRleHRsZWFkaW5nfX0KK1xkZWZcdGl0bGVmb250c3slCisgIFxsZXRcdGVucm09XHRpdGxlcm0gXGxldFx0ZW5pdD1cdGl0bGVpdCBcbGV0XHRlbnNsPVx0aXRsZXNsCisgIFxsZXRcdGVuYmY9XHRpdGxlYmYgXGxldFx0ZW50dD1cdGl0bGV0dCBcbGV0XHNtYWxsY2Fwcz1cdGl0bGVzYworICBcbGV0XHRlbnNmPVx0aXRsZXNmIFxsZXRcdGVuaT1cdGl0bGVpIFxsZXRcdGVuc3k9XHRpdGxlc3kKKyAgXGxldFx0ZW50dHNsPVx0aXRsZXR0c2wKKyAgXGRlZlxjdXJmb250c2l6ZXt0aXRsZX0lCisgIFxkZWZcbHNpemV7Y2hhcH1cZGVmXGxsbHNpemV7c3Vic2VjfSUKKyAgXHJlc2V0bWF0aGZvbnRzIFxzZXRsZWFkaW5nezI1cHR9fQorXGRlZlx0aXRsZWZvbnQjMXt7XHRpdGxlZm9udHNccm0gIzF9fQorXGRlZlxjaGFwZm9udHN7JQorICBcbGV0XHRlbnJtPVxjaGFwcm0gXGxldFx0ZW5pdD1cY2hhcGl0IFxsZXRcdGVuc2w9XGNoYXBzbAorICBcbGV0XHRlbmJmPVxjaGFwYmYgXGxldFx0ZW50dD1cY2hhcHR0IFxsZXRcc21hbGxjYXBzPVxjaGFwc2MKKyAgXGxldFx0ZW5zZj1cY2hhcHNmIFxsZXRcdGVuaT1cY2hhcGkgXGxldFx0ZW5zeT1cY2hhcHN5CisgIFxsZXRcdGVudHRzbD1cY2hhcHR0c2wKKyAgXGRlZlxjdXJmb250c2l6ZXtjaGFwfSUKKyAgXGRlZlxsc2l6ZXtzZWN9XGRlZlxsbGxzaXple3RleHR9JQorICBccmVzZXRtYXRoZm9udHMgXHNldGxlYWRpbmd7MTlwdH19CitcZGVmXHNlY2ZvbnRzeyUKKyAgXGxldFx0ZW5ybT1cc2Vjcm0gXGxldFx0ZW5pdD1cc2VjaXQgXGxldFx0ZW5zbD1cc2Vjc2wKKyAgXGxldFx0ZW5iZj1cc2VjYmYgXGxldFx0ZW50dD1cc2VjdHQgXGxldFxzbWFsbGNhcHM9XHNlY3NjCisgIFxsZXRcdGVuc2Y9XHNlY3NmIFxsZXRcdGVuaT1cc2VjaSBcbGV0XHRlbnN5PVxzZWNzeQorICBcbGV0XHRlbnR0c2w9XHNlY3R0c2wKKyAgXGRlZlxjdXJmb250c2l6ZXtzZWN9JQorICBcZGVmXGxzaXple3N1YnNlY31cZGVmXGxsbHNpemV7cmVkdWNlZH0lCisgIFxyZXNldG1hdGhmb250cyBcc2V0bGVhZGluZ3sxNnB0fX0KK1xkZWZcc3Vic2VjZm9udHN7JQorICBcbGV0XHRlbnJtPVxzc2Vjcm0gXGxldFx0ZW5pdD1cc3NlY2l0IFxsZXRcdGVuc2w9XHNzZWNzbAorICBcbGV0XHRlbmJmPVxzc2VjYmYgXGxldFx0ZW50dD1cc3NlY3R0IFxsZXRcc21hbGxjYXBzPVxzc2Vjc2MKKyAgXGxldFx0ZW5zZj1cc3NlY3NmIFxsZXRcdGVuaT1cc3NlY2kgXGxldFx0ZW5zeT1cc3NlY3N5CisgIFxsZXRcdGVudHRzbD1cc3NlY3R0c2wKKyAgXGRlZlxjdXJmb250c2l6ZXtzc2VjfSUKKyAgXGRlZlxsc2l6ZXt0ZXh0fVxkZWZcbGxsc2l6ZXtzbWFsbH0lCisgIFxyZXNldG1hdGhmb250cyBcc2V0bGVhZGluZ3sxNXB0fX0KK1xsZXRcc3Vic3Vic2VjZm9udHMgPSBcc3Vic2VjZm9udHMKK1xkZWZccmVkdWNlZGZvbnRzeyUKKyAgXGxldFx0ZW5ybT1ccmVkdWNlZHJtIFxsZXRcdGVuaXQ9XHJlZHVjZWRpdCBcbGV0XHRlbnNsPVxyZWR1Y2Vkc2wKKyAgXGxldFx0ZW5iZj1ccmVkdWNlZGJmIFxsZXRcdGVudHQ9XHJlZHVjZWR0dCBcbGV0XHJlZHVjZWRjYXBzPVxyZWR1Y2Vkc2MKKyAgXGxldFx0ZW5zZj1ccmVkdWNlZHNmIFxsZXRcdGVuaT1ccmVkdWNlZGkgXGxldFx0ZW5zeT1ccmVkdWNlZHN5CisgIFxsZXRcdGVudHRzbD1ccmVkdWNlZHR0c2wKKyAgXGRlZlxjdXJmb250c2l6ZXtyZWR1Y2VkfSUKKyAgXGRlZlxsc2l6ZXtzbWFsbH1cZGVmXGxsbHNpemV7c21hbGxlcn0lCisgIFxyZXNldG1hdGhmb250cyBcc2V0bGVhZGluZ3sxMC41cHR9fQorXGRlZlxzbWFsbGZvbnRzeyUKKyAgXGxldFx0ZW5ybT1cc21hbGxybSBcbGV0XHRlbml0PVxzbWFsbGl0IFxsZXRcdGVuc2w9XHNtYWxsc2wKKyAgXGxldFx0ZW5iZj1cc21hbGxiZiBcbGV0XHRlbnR0PVxzbWFsbHR0IFxsZXRcc21hbGxjYXBzPVxzbWFsbHNjCisgIFxsZXRcdGVuc2Y9XHNtYWxsc2YgXGxldFx0ZW5pPVxzbWFsbGkgXGxldFx0ZW5zeT1cc21hbGxzeQorICBcbGV0XHRlbnR0c2w9XHNtYWxsdHRzbAorICBcZGVmXGN1cmZvbnRzaXple3NtYWxsfSUKKyAgXGRlZlxsc2l6ZXtzbWFsbGVyfVxkZWZcbGxsc2l6ZXtzbWFsbGVyfSUKKyAgXHJlc2V0bWF0aGZvbnRzIFxzZXRsZWFkaW5nezEwLjVwdH19CitcZGVmXHNtYWxsZXJmb250c3slCisgIFxsZXRcdGVucm09XHNtYWxsZXJybSBcbGV0XHRlbml0PVxzbWFsbGVyaXQgXGxldFx0ZW5zbD1cc21hbGxlcnNsCisgIFxsZXRcdGVuYmY9XHNtYWxsZXJiZiBcbGV0XHRlbnR0PVxzbWFsbGVydHQgXGxldFxzbWFsbGNhcHM9XHNtYWxsZXJzYworICBcbGV0XHRlbnNmPVxzbWFsbGVyc2YgXGxldFx0ZW5pPVxzbWFsbGVyaSBcbGV0XHRlbnN5PVxzbWFsbGVyc3kKKyAgXGxldFx0ZW50dHNsPVxzbWFsbGVydHRzbAorICBcZGVmXGN1cmZvbnRzaXple3NtYWxsZXJ9JQorICBcZGVmXGxzaXple3NtYWxsZXJ9XGRlZlxsbGxzaXple3NtYWxsZXJ9JQorICBccmVzZXRtYXRoZm9udHMgXHNldGxlYWRpbmd7OS41cHR9fQorCislIFNldCB0aGUgZm9udHMgdG8gdXNlIHdpdGggdGhlIEBzbWFsbC4uLiBlbnZpcm9ubWVudHMuCitcbGV0XHNtYWxsZXhhbXBsZWZvbnRzID0gXHNtYWxsZm9udHMKKworJSBBYm91dCBcc21hbGxleGFtcGxlZm9udHMuICBJZiB3ZSB1c2UgXHNtYWxsZm9udHMgKDlwdCksIEBzbWFsbGV4YW1wbGUKKyUgY2FuIGZpdCB0aGlzIG1hbnkgY2hhcmFjdGVyczoKKyUgICA4LjV4MTE9ODYgICBzbWFsbGJvb2s9NzIgIGE0PTkwICBhNT02OQorJSBJZiB3ZSB1c2UgXHNjcmlwdGZvbnRzICg4cHQpLCB0aGVuIHdlIGNhbiBmaXQgdGhpcyBtYW55IGNoYXJhY3RlcnM6CislICAgOC41eDExPTkwKyAgc21hbGxib29rPTgwICBhND05MCsgIGE1PTc3CislIEZvciBtZSwgc3ViamVjdGl2ZWx5LCB0aGUgZmV3IGV4dHJhIGNoYXJhY3RlcnMgdGhhdCBmaXQgYXJlbid0IHdvcnRoCislIHRoZSBhZGRpdGlvbmFsIHNtYWxsbmVzcyBvZiA4cHQuICBTbyBJJ20gbWFraW5nIHRoZSBkZWZhdWx0IDlwdC4KKyUKKyUgQnkgdGhlIHdheSwgZm9yIGNvbXBhcmlzb24sIGhlcmUncyB3aGF0IGZpdHMgd2l0aCBAZXhhbXBsZSAoMTBwdCk6CislICAgOC41eDExPTcxICBzbWFsbGJvb2s9NjAgIGE0PTc1ICBhNT01OAorJQorJSBJIHdpc2ggdGhlIFVTQSB1c2VkIEE0IHBhcGVyLgorJSAtLWthcmwsIDI0amFuMDMuCisKKworJSBTZXQgdXAgdGhlIGRlZmF1bHQgZm9udHMsIHNvIHdlIGNhbiB1c2UgdGhlbSBmb3IgY3JlYXRpbmcgYm94ZXMuCislCitcZGVmaW5ldGV4dGZvbnRzaXpleGkKKworJSBEZWZpbmUgdGhlc2Ugc28gdGhleSBjYW4gYmUgZWFzaWx5IGNoYW5nZWQgZm9yIG90aGVyIGZvbnRzLgorXGRlZlxhbmdsZWxlZnR7JFxsYW5nbGUkfQorXGRlZlxhbmdsZXJpZ2h0eyRccmFuZ2xlJH0KKworJSBDb3VudCBkZXB0aCBpbiBmb250LWNoYW5nZXMsIGZvciBlcnJvciBjaGVja3MKK1xuZXdjb3VudFxmb250ZGVwdGggXGZvbnRkZXB0aD0wCisKKyUgRm9udHMgZm9yIHNob3J0IHRhYmxlIG9mIGNvbnRlbnRzLgorXHNldGZvbnRcc2hvcnRjb250cm1ccm1zaGFwZXsxMn17MTAwMH0KK1xzZXRmb250XHNob3J0Y29udGJmXGJmc2hhcGV7MTB9e1xtYWdzdGVwMX0gICUgbm8gY21iMTIKK1xzZXRmb250XHNob3J0Y29udHNsXHNsc2hhcGV7MTJ9ezEwMDB9Citcc2V0Zm9udFxzaG9ydGNvbnR0dFx0dHNoYXBlezEyfXsxMDAwfQorCislJSBBZGQgc2NyaWJlLWxpa2UgZm9udCBlbnZpcm9ubWVudHMsIHBsdXMgQGwgZm9yIGlubGluZSBsaXNwICh1c3VhbGx5IHNhbnMKKyUlIHNlcmlmKSBhbmQgQGlpIGZvciBUZVggaXRhbGljCisKKyUgXHNtYXJ0aXRhbGlje0FSR30gb3V0cHV0cyBhcmcgaW4gaXRhbGljcywgZm9sbG93ZWQgYnkgYW4gaXRhbGljIGNvcnJlY3Rpb24KKyUgdW5sZXNzIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyIGlzIHN1Y2ggYXMgbm90IHRvIG5lZWQgb25lLgorXGRlZlxzbWFydGl0YWxpY3h7XGlmeFxuZXh0LFxlbHNlXGlmeFxuZXh0LVxlbHNlXGlmeFxuZXh0LlxlbHNlCisgICAgICAgICAgICAgICAgICAgIFxwdGV4c2xhc2hcZmlcZmlcZml9CitcZGVmXHNtYXJ0c2xhbnRlZCMxe3tcaWZ1c2luZ3R0XHR0c2xcc2wgIzF9XGZ1dHVyZWxldFxuZXh0XHNtYXJ0aXRhbGljeH0KK1xkZWZcc21hcnRpdGFsaWMjMXt7XGlmdXNpbmd0dFx0dHNsXGl0ICMxfVxmdXR1cmVsZXRcbmV4dFxzbWFydGl0YWxpY3h9CisKKyUgbGlrZSBcc21hcnRzbGFudGVkIGV4Y2VwdCB1bmNvbmRpdGlvbmFsbHkgdXNlcyBcdHRzbC4KKyUgQHZhciBpcyBzZXQgdG8gdGhpcyBmb3IgZGVmdW4gYXJndW1lbnRzLgorXGRlZlx0dHNsYW50ZWQjMXt7XHR0c2wgIzF9XGZ1dHVyZWxldFxuZXh0XHNtYXJ0aXRhbGljeH0KKworJSBsaWtlIFxzbWFydHNsYW50ZWQgZXhjZXB0IHVuY29uZGl0aW9uYWxseSB1c2UgXHNsLiAgV2UgbmV2ZXIgd2FudAorJSB0dHNsIGZvciBib29rIHRpdGxlcywgZG8gd2U/CitcZGVmXGNpdGUjMXt7XHNsICMxfVxmdXR1cmVsZXRcbmV4dFxzbWFydGl0YWxpY3h9CisKK1xsZXRcaT1cc21hcnRpdGFsaWMKK1xsZXRcc2xhbnRlZD1cc21hcnRzbGFudGVkCitcbGV0XHZhcj1cc21hcnRzbGFudGVkCitcbGV0XGRmbj1cc21hcnRzbGFudGVkCitcbGV0XGVtcGg9XHNtYXJ0aXRhbGljCisKKyUgQGIsIGV4cGxpY2l0IGJvbGQuCitcZGVmXGIjMXt7XGJmICMxfX0KK1xsZXRcc3Ryb25nPVxiCisKKyUgQHNhbnNzZXJpZiwgZXhwbGljaXQgc2Fucy4KK1xkZWZcc2Fuc3NlcmlmIzF7e1xzZiAjMX19CisKKyUgV2UgY2FuJ3QganVzdCB1c2UgXGV4aHlwaGVucGVuYWx0eSwgYmVjYXVzZSB0aGF0IG9ubHkgaGFzIGVmZmVjdCBhdAorJSB0aGUgZW5kIG9mIGEgcGFyYWdyYXBoLiAgUmVzdG9yZSBub3JtYWwgaHlwaGVuYXRpb24gYXQgdGhlIGVuZCBvZiB0aGUKKyUgZ3JvdXAgd2l0aGluIHdoaWNoIFxub2h5cGhlbmF0aW9uIGlzIHByZXN1bWFibHkgY2FsbGVkLgorJQorXGRlZlxub2h5cGhlbmF0aW9ue1xoeXBoZW5jaGFyXGZvbnQgPSAtMSAgXGFmdGVyZ3JvdXBccmVzdG9yZWh5cGhlbmF0aW9ufQorXGRlZlxyZXN0b3JlaHlwaGVuYXRpb257XGh5cGhlbmNoYXJcZm9udCA9IGAtIH0KKworJSBTZXQgc2Zjb2RlIHRvIG5vcm1hbCBmb3IgdGhlIGNoYXJzIHRoYXQgdXN1YWxseSBoYXZlIGFub3RoZXIgdmFsdWUuCislIENhbid0IHVzZSBwbGFpbidzIFxmcmVuY2hzcGFjaW5nIGJlY2F1c2UgaXQgdXNlcyB0aGUgYFx4IG5vdGF0aW9uLCBhbmQKKyUgc29tZXRpbWVzIFx4IGhhcyBhbiBhY3RpdmUgZGVmaW5pdGlvbiB0aGF0IG1lc3NlcyB0aGluZ3MgdXAuCislCitcY2F0Y29kZWBAPTExCisgIFxkZWZccGxhaW5mcmVuY2hzcGFjaW5neyUKKyAgICBcc2Zjb2RlXGRvdENoYXIgID1cQG0gXHNmY29kZVxxdWVzdENoYXI9XEBtIFxzZmNvZGVcZXhjbGFtQ2hhcj1cQG0KKyAgICBcc2Zjb2RlXGNvbG9uQ2hhcj1cQG0gXHNmY29kZVxzZW1pQ2hhciA9XEBtIFxzZmNvZGVcY29tbWFDaGFyID1cQG0KKyAgICBcZGVmXGVuZG9mc2VudGVuY2VzcGFjZWZhY3RvcnsxMDAwfSUgZm9yIEAuIGFuZCBmcmllbmRzCisgIH0KKyAgXGRlZlxwbGFpbm5vbmZyZW5jaHNwYWNpbmd7JQorICAgIFxzZmNvZGVgXC4zMDAwXHNmY29kZWBcPzMwMDBcc2Zjb2RlYFwhMzAwMAorICAgIFxzZmNvZGVgXDoyMDAwXHNmY29kZWBcOzE1MDBcc2Zjb2RlYFwsMTI1MAorICAgIFxkZWZcZW5kb2ZzZW50ZW5jZXNwYWNlZmFjdG9yezMwMDB9JSBmb3IgQC4gYW5kIGZyaWVuZHMKKyAgfQorXGNhdGNvZGVgQD1cb3RoZXIKK1xkZWZcZW5kb2ZzZW50ZW5jZXNwYWNlZmFjdG9yezMwMDB9JSBkZWZhdWx0CisKK1xkZWZcdCMxeyUKKyAge1x0dCBccmF3YmFja3NsYXNoIFxwbGFpbmZyZW5jaHNwYWNpbmcgIzF9JQorICBcbnVsbAorfQorXGRlZlxzYW1wIzF7YFx0Y2xvc2V7IzF9J1xudWxsfQorXHNldGZvbnRca2V5cm1ccm1zaGFwZXs4fXsxMDAwfQorXGZvbnRca2V5c3k9Y21zeTkKK1xkZWZca2V5IzF7e1xrZXlybVx0ZXh0Zm9udDI9XGtleXN5IFxsZWF2ZXZtb2RlXGhib3h7JQorICBccmFpc2UwLjRwdFxoYm94e1xhbmdsZWxlZnR9XGtlcm4tLjA4ZW1cdnRvcHslCisgICAgXHZib3h7XGhydWxlXGtlcm4tMC40cHQKKyAgICAgXGhib3h7XHJhaXNlMC40cHRcaGJveHtcdnBoYW50b217XGFuZ2xlbGVmdH19IzF9fSUKKyAgICBca2Vybi0wLjRwdFxocnVsZX0lCisgIFxrZXJuLS4wNmVtXHJhaXNlMC40cHRcaGJveHtcYW5nbGVyaWdodH19fX0KKyUgVGhlIG9sZCBkZWZpbml0aW9uLCB3aXRoIG5vIGxvemVuZ2U6CislXGRlZlxrZXkgIzF7e1x0dHNsIFxub2h5cGhlbmF0aW9uIFx1cHBlcmNhc2V7IzF9fVxudWxsfQorXGRlZlxjdHJsICMxe3tcdHQgXHJhd2JhY2tzbGFzaCBcaGF0fSMxfQorCislIEBmaWxlLCBAb3B0aW9uIGFyZSB0aGUgc2FtZSBhcyBAc2FtcC4KK1xsZXRcZmlsZT1cc2FtcAorXGxldFxvcHRpb249XHNhbXAKKworJSBAY29kZSBpcyBhIG1vZGlmaWNhdGlvbiBvZiBAdCwKKyUgd2hpY2ggbWFrZXMgc3BhY2VzIHRoZSBzYW1lIHNpemUgYXMgbm9ybWFsIGluIHRoZSBzdXJyb3VuZGluZyB0ZXh0LgorXGRlZlx0Y2xvc2UjMXslCisgIHslCisgICAgJSBDaGFuZ2Ugbm9ybWFsIGludGVyd29yZCBzcGFjZSB0byBiZSBzYW1lIGFzIGZvciB0aGUgY3VycmVudCBmb250LgorICAgIFxzcGFjZXNraXAgPSBcZm9udGRpbWVuMlxmb250CisgICAgJQorICAgICUgU3dpdGNoIHRvIHR5cGV3cml0ZXIuCisgICAgXHR0CisgICAgJQorICAgICUgQnV0IGBcICcgcHJvZHVjZXMgdGhlIGxhcmdlIHR5cGV3cml0ZXIgaW50ZXJ3b3JkIHNwYWNlLgorICAgIFxkZWZcIHt7XHNwYWNlc2tpcCA9IDBwdHt9IH19JQorICAgICUKKyAgICAlIFR1cm4gb2ZmIGh5cGhlbmF0aW9uLgorICAgIFxub2h5cGhlbmF0aW9uCisgICAgJQorICAgIFxyYXdiYWNrc2xhc2gKKyAgICBccGxhaW5mcmVuY2hzcGFjaW5nCisgICAgIzElCisgIH0lCisgIFxudWxsCit9CisKKyUgV2UgKm11c3QqIHR1cm4gb24gaHlwaGVuYXRpb24gYXQgYC0nIGFuZCBgXycgaW4gQGNvZGUuCislIE90aGVyd2lzZSwgaXQgaXMgdG9vIGhhcmQgdG8gYXZvaWQgb3ZlcmZ1bGwgaGJveGVzCislIGluIHRoZSBFbWFjcyBtYW51YWwsIHRoZSBMaWJyYXJ5IG1hbnVhbCwgZXRjLgorCislIFVuZm9ydHVuYXRlbHksIFRlWCB1c2VzIG9uZSBwYXJhbWV0ZXIgKFxoeXBoZW5jaGFyKSB0byBjb250cm9sCislIGJvdGggaHlwaGVuYXRpb24gYXQgLSBhbmQgaHlwaGVuYXRpb24gd2l0aGluIHdvcmRzLgorJSBXZSBtdXN0IHRoZXJlZm9yZSB0dXJuIHRoZW0gYm90aCBvZmYgKFx0Y2xvc2UgZG9lcyB0aGF0KQorJSBhbmQgYXJyYW5nZSBleHBsaWNpdGx5IHRvIGh5cGhlbmF0ZSBhdCBhIGRhc2guCislICAtLSBybXMuCit7CisgIFxjYXRjb2RlYFwtPVxhY3RpdmUgXGNhdGNvZGVgXF89XGFjdGl2ZQorICBcY2F0Y29kZWBcJz1cYWN0aXZlIFxjYXRjb2RlYFxgPVxhY3RpdmUKKyAgJQorICBcZ2xvYmFsXGRlZlxjb2Rle1xiZWdpbmdyb3VwCisgICAgXGNhdGNvZGVccnF1b3RlQ2hhcj1cYWN0aXZlIFxjYXRjb2RlXGxxdW90ZUNoYXI9XGFjdGl2ZQorICAgIFxsZXQnXGNvZGVxdW90ZXJpZ2h0IFxsZXRgXGNvZGVxdW90ZWxlZnQKKyAgICAlCisgICAgXGNhdGNvZGVcZGFzaENoYXI9XGFjdGl2ZSAgXGNhdGNvZGVcdW5kZXJDaGFyPVxhY3RpdmUKKyAgICBcaWZhbGxvd2NvZGVicmVha3MKKyAgICAgXGxldC1cY29kZWRhc2gKKyAgICAgXGxldF9cY29kZXVuZGVyCisgICAgXGVsc2UKKyAgICAgXGxldC1ccmVhbGRhc2gKKyAgICAgXGxldF9ccmVhbHVuZGVyCisgICAgXGZpCisgICAgXGNvZGV4CisgIH0KK30KKworXGRlZlxyZWFsZGFzaHstfQorXGRlZlxjb2RlZGFzaHstXGRpc2NyZXRpb25hcnl7fXt9e319CitcZGVmXGNvZGV1bmRlcnslCisgICUgdGhpcyBpcyBhbGwgc28gQG1hdGh7QGNvZGV7dmFyX25hbWV9KzF9IGNhbiB3b3JrLiAgSW4gbWF0aCBtb2RlLCBfCisgICUgaXMgImFjdGl2ZSIgKG1hdGhjb2RlIjgwMDApIGFuZCBcbm9ybWFsdW5kZXJzY29yZSAob3IgXGNoYXI5NSwgZXRjLikKKyAgJSB3aWxsIHRoZXJlZm9yZSBleHBhbmQgdGhlIGFjdGl2ZSBkZWZpbml0aW9uIG9mIF8sIHdoaWNoIGlzIHVzCisgICUgKGluc2lkZSBAY29kZSB0aGF0IGlzKSwgdGhlcmVmb3JlIGFuIGVuZGxlc3MgbG9vcC4KKyAgXGlmdXNpbmd0dHtcaWZtbW9kZQorICAgICAgICAgICAgICAgXG1hdGhjaGFyIjA3NUYgJSBjbGFzcyAwPW9yZGluYXJ5LCBmYW1pbHkgNz10dGZhbSwgcG9zIDB4NUY9Xy4KKyAgICAgICAgICAgICBcZWxzZVxub3JtYWx1bmRlcnNjb3JlIFxmaQorICAgICAgICAgICAgIFxkaXNjcmV0aW9uYXJ5e317fXt9fSUKKyAgICAgICAgICAgIHtcX30lCit9CitcZGVmXGNvZGV4ICMxe1x0Y2xvc2V7IzF9XGVuZGdyb3VwfQorCislIEFuIGFkZGl0aW9uYWwgY29tcGxpY2F0aW9uOiB0aGUgYWJvdmUgd2lsbCBhbGxvdyBicmVha3MgYWZ0ZXIsIGUuZy4sCislIGVhY2ggb2YgdGhlIGZvdXIgdW5kZXJzY29yZXMgaW4gX190eXBlb2ZfXy4gIFRoaXMgaXMgdW5kZXNpcmFibGUgaW4KKyUgc29tZSBtYW51YWxzLCBlc3BlY2lhbGx5IGlmIHRoZXkgZG9uJ3QgaGF2ZSBsb25nIGlkZW50aWZpZXJzIGluCislIGdlbmVyYWwuICBAYWxsb3djb2RlYnJlYWtzIHByb3ZpZGVzIGEgd2F5IHRvIGNvbnRyb2wgdGhpcy4KKyUgCitcbmV3aWZcaWZhbGxvd2NvZGVicmVha3MgIFxhbGxvd2NvZGVicmVha3N0cnVlCisKK1xkZWZca2V5d29yZHRydWV7dHJ1ZX0KK1xkZWZca2V5d29yZGZhbHNle2ZhbHNlfQorCitccGFyc2VhcmdkZWZcYWxsb3djb2RlYnJlYWtzeyUKKyAgXGRlZlx0eGlhcmd7IzF9JQorICBcaWZ4XHR4aWFyZ1xrZXl3b3JkdHJ1ZQorICAgIFxhbGxvd2NvZGVicmVha3N0cnVlCisgIFxlbHNlXGlmeFx0eGlhcmdca2V5d29yZGZhbHNlCisgICAgXGFsbG93Y29kZWJyZWFrc2ZhbHNlCisgIFxlbHNlCisgICAgXGVycmhlbHAgPSBcRU1zaW1wbGUKKyAgICBcZXJybWVzc2FnZXtVbmtub3duIEBhbGxvd2NvZGVicmVha3Mgb3B0aW9uIGBcdHhpYXJnJ30lCisgIFxmaVxmaQorfQorCislIEBrYmQgaXMgbGlrZSBAY29kZSwgZXhjZXB0IHRoYXQgaWYgdGhlIGFyZ3VtZW50IGlzIGp1c3Qgb25lIEBrZXkgY29tbWFuZCwKKyUgdGhlbiBAa2JkIGhhcyBubyBlZmZlY3QuCisKKyUgQGtiZGlucHV0c3R5bGUgLS0gYXJnIGlzIGBkaXN0aW5jdCcgKEBrYmQgdXNlcyBzbGFudGVkIHR0eSBmb250IGFsd2F5cyksCislICAgYGV4YW1wbGUnIChAa2JkIHVzZXMgdHRzbCBvbmx5IGluc2lkZSBvZiBAZXhhbXBsZSBhbmQgZnJpZW5kcyksCislICAgb3IgYGNvZGUnIChAa2JkIHVzZXMgbm9ybWFsIHR0eSBmb250IGFsd2F5cykuCitccGFyc2VhcmdkZWZca2JkaW5wdXRzdHlsZXslCisgIFxkZWZcdHhpYXJneyMxfSUKKyAgXGlmeFx0eGlhcmdcd29yZGRpc3RpbmN0CisgICAgXGdkZWZca2JkZXhhbXBsZWZvbnR7XHR0c2x9XGdkZWZca2JkZm9udHtcdHRzbH0lCisgIFxlbHNlXGlmeFx0eGlhcmdcd29yZGV4YW1wbGUKKyAgICBcZ2RlZlxrYmRleGFtcGxlZm9udHtcdHRzbH1cZ2RlZlxrYmRmb250e1x0dH0lCisgIFxlbHNlXGlmeFx0eGlhcmdcd29yZGNvZGUKKyAgICBcZ2RlZlxrYmRleGFtcGxlZm9udHtcdHR9XGdkZWZca2JkZm9udHtcdHR9JQorICBcZWxzZQorICAgIFxlcnJoZWxwID0gXEVNc2ltcGxlCisgICAgXGVycm1lc3NhZ2V7VW5rbm93biBAa2JkaW5wdXRzdHlsZSBvcHRpb24gYFx0eGlhcmcnfSUKKyAgXGZpXGZpXGZpCit9CitcZGVmXHdvcmRkaXN0aW5jdHtkaXN0aW5jdH0KK1xkZWZcd29yZGV4YW1wbGV7ZXhhbXBsZX0KK1xkZWZcd29yZGNvZGV7Y29kZX0KKworJSBEZWZhdWx0IGlzIGBkaXN0aW5jdC4nCitca2JkaW5wdXRzdHlsZSBkaXN0aW5jdAorCitcZGVmXHhrZXl7XGtleX0KK1xkZWZca2JkZm9vIzEjMiMzXHBhcntcZGVmXG9uZXsjMX1cZGVmXHRocmVleyMzfVxkZWZcdGhyZWV4ez8/fSUKK1xpZnhcb25lXHhrZXlcaWZ4XHRocmVleFx0aHJlZSBca2V5eyMyfSUKK1xlbHNle1x0Y2xvc2V7XGtiZGZvbnRcbG9va319XGZpCitcZWxzZXtcdGNsb3Nle1xrYmRmb250XGxvb2t9fVxmaX0KKworJSBGb3IgQGluZGljYXRldXJsLCBAZW52LCBAY29tbWFuZCBxdW90ZXMgc2VlbSB1bm5lY2Vzc2FyeSwgc28gdXNlIFxjb2RlLgorXGxldFxpbmRpY2F0ZXVybD1cY29kZQorXGxldFxlbnY9XGNvZGUKK1xsZXRcY29tbWFuZD1cY29kZQorCislIEB1cmVmIChhYmJyZXZpYXRpb24gZm9yIGB1cmxyZWYnKSB0YWtlcyBhbiBvcHRpb25hbCAoY29tbWEtc2VwYXJhdGVkKQorJSBzZWNvbmQgYXJndW1lbnQgc3BlY2lmeWluZyB0aGUgdGV4dCB0byBkaXNwbGF5IGFuZCBhbiBvcHRpb25hbCB0aGlyZAorJSBhcmcgYXMgdGV4dCB0byBkaXNwbGF5IGluc3RlYWQgb2YgKHJhdGhlciB0aGFuIGluIGFkZGl0aW9uIHRvKSB0aGUgdXJsCislIGl0c2VsZi4gIEZpcnN0IChtYW5kYXRvcnkpIGFyZyBpcyB0aGUgdXJsLiAgUGVyaGFwcyBldmVudHVhbGx5IHB1dCBpbgorJSBhIGh5cGVydGV4IFxzcGVjaWFsIGhlcmUuCislCitcZGVmXHVyZWYjMXtcZG91cmVmICMxLCwsXGZpbmlzaH0KK1xkZWZcZG91cmVmIzEsIzIsIzMsIzRcZmluaXNoe1xiZWdpbmdyb3VwCisgIFx1bnNlcHNwYWNlcworICBccGRmdXJseyMxfSUKKyAgXHNldGJveDAgPSBcaGJveHtcaWdub3Jlc3BhY2VzICMzfSUKKyAgXGlmZGltXHdkMCA+IDBwdAorICAgIFx1bmhib3gwICUgdGhpcmQgYXJnIGdpdmVuLCBzaG93IG9ubHkgdGhhdAorICBcZWxzZQorICAgIFxzZXRib3gwID0gXGhib3h7XGlnbm9yZXNwYWNlcyAjMn0lCisgICAgXGlmZGltXHdkMCA+IDBwdAorICAgICAgXGlmcGRmCisgICAgICAgIFx1bmhib3gwICAgICAgICAgICAgICUgUERGOiAybmQgYXJnIGdpdmVuLCBzaG93IG9ubHkgaXQKKyAgICAgIFxlbHNlCisgICAgICAgIFx1bmhib3gwXCAoXGNvZGV7IzF9KSUgRFZJOiAybmQgYXJnIGdpdmVuLCBzaG93IGJvdGggaXQgYW5kIHVybAorICAgICAgXGZpCisgICAgXGVsc2UKKyAgICAgIFxjb2RleyMxfSUgb25seSB1cmwgZ2l2ZW4sIHNvIHNob3cgaXQKKyAgICBcZmkKKyAgXGZpCisgIFxlbmRsaW5rCitcZW5kZ3JvdXB9CisKKyUgQHVybCBzeW5vbnltIGZvciBAdXJlZiwgc2luY2UgdGhhdCdzIGhvdyBldmVyeW9uZSB1c2VzIGl0LgorJQorXGxldFx1cmw9XHVyZWYKKworJSBybXMgZG9lcyBub3QgbGlrZSBhbmdsZSBicmFja2V0cyAtLWthcmwsIDE3bWF5OTcuCislIFNvIG5vdyBAZW1haWwgaXMganVzdCBsaWtlIEB1cmVmLCB1bmxlc3Mgd2UgYXJlIHBkZi4KKyUKKyVcZGVmXGVtYWlsIzF7XGFuZ2xlbGVmdHtcdHQgIzF9XGFuZ2xlcmlnaHR9CitcaWZwZGYKKyAgXGRlZlxlbWFpbCMxe1xkb2VtYWlsIzEsLFxmaW5pc2h9CisgIFxkZWZcZG9lbWFpbCMxLCMyLCMzXGZpbmlzaHtcYmVnaW5ncm91cAorICAgIFx1bnNlcHNwYWNlcworICAgIFxwZGZ1cmx7bWFpbHRvOiMxfSUKKyAgICBcc2V0Ym94MCA9IFxoYm94e1xpZ25vcmVzcGFjZXMgIzJ9JQorICAgIFxpZmRpbVx3ZDA+MHB0XHVuaGJveDBcZWxzZVxjb2RleyMxfVxmaQorICAgIFxlbmRsaW5rCisgIFxlbmRncm91cH0KK1xlbHNlCisgIFxsZXRcZW1haWw9XHVyZWYKK1xmaQorCislIENoZWNrIGlmIHdlIGFyZSBjdXJyZW50bHkgdXNpbmcgYSB0eXBld3JpdGVyIGZvbnQuICBTaW5jZSBhbGwgdGhlCislIENvbXB1dGVyIE1vZGVybiB0eXBld3JpdGVyIGZvbnRzIGhhdmUgemVybyBpbnRlcndvcmQgc3RyZXRjaCAoYW5kCislIHNocmluayksIGFuZCBpdCBpcyByZWFzb25hYmxlIHRvIGV4cGVjdCBhbGwgdHlwZXdyaXRlciBmb250cyB0byBoYXZlCislIHRoaXMgcHJvcGVydHksIHdlIGNhbiBjaGVjayB0aGF0IGZvbnQgcGFyYW1ldGVyLgorJQorXGRlZlxpZm1vbm9zcGFjZXtcaWZkaW1cZm9udGRpbWVuM1xmb250PTBwdCB9CisKKyUgVHlwZXNldCBhIGRpbWVuc2lvbiwgZS5nLiwgYGluJyBvciBgcHQnLiAgVGhlIG9ubHkgcmVhc29uIGZvciB0aGUKKyUgYXJndW1lbnQgaXMgdG8gbWFrZSB0aGUgaW5wdXQgbG9vayByaWdodDogQGRtbntwdH0gaW5zdGVhZCBvZiBAZG1ue31wdC4KKyUKK1xkZWZcZG1uIzF7XHRoaW5zcGFjZSAjMX0KKworXGRlZlxrYmQjMXtcZGVmXGxvb2t7IzF9XGV4cGFuZGFmdGVyXGtiZGZvb1xsb29rPz9ccGFyfQorCislIEBsIHdhcyBuZXZlciBkb2N1bWVudGVkIHRvIG1lYW4gYGBzd2l0Y2ggdG8gdGhlIExpc3AgZm9udCcnLAorJSBhbmQgaXQgaXMgbm90IHVzZWQgYXMgc3VjaCBpbiBhbnkgbWFudWFsIEkgY2FuIGZpbmQuICBXZSBuZWVkIGl0IGZvcgorJSBQb2xpc2ggc3VwcHJlc3NlZC1sLiAgLS1rYXJsLCAyMnNlcDk2LgorJVxkZWZcbCMxe3tcbGkgIzF9XG51bGx9CisKKyUgRXhwbGljaXQgZm9udCBjaGFuZ2VzOiBAciwgQHNjLCB1bmRvY3VtZW50ZWQgQGlpLgorXGRlZlxyIzF7e1xybSAjMX19ICAgICAgICAgICAgICAlIHJvbWFuIGZvbnQKK1xkZWZcc2MjMXt7XHNtYWxsY2FwcyMxfX0gICAgICAgJSBzbWFsbGNhcHMgZm9udAorXGRlZlxpaSMxe3tcaXQgIzF9fSAgICAgICAgICAgICAlIGl0YWxpYyBmb250CisKKyUgQGFjcm9ueW0gZm9yICJGQkkiLCAiTkFUTyIsIGFuZCB0aGUgbGlrZS4KKyUgV2UgcHJpbnQgdGhpcyBvbmUgcG9pbnQgc2l6ZSBzbWFsbGVyLCBzaW5jZSBpdCdzIGludGVuZGVkIGZvcgorJSBhbGwtdXBwZXJjYXNlLgorJSAKK1xkZWZcYWNyb255bSMxe1xkb2Fjcm9ueW0gIzEsLFxmaW5pc2h9CitcZGVmXGRvYWNyb255bSMxLCMyLCMzXGZpbmlzaHslCisgIHtcc2VsZWN0Zm9udHNcbHNpemUgIzF9JQorICBcZGVmXHRlbXB7IzJ9JQorICBcaWZ4XHRlbXBcZW1wdHkgXGVsc2UKKyAgICBcc3BhY2UgKHtcdW5zZXBzcGFjZXMgXGlnbm9yZXNwYWNlcyBcdGVtcCBcdW5za2lwfSklCisgIFxmaQorfQorCislIEBhYmJyIGZvciAiQ29tcHV0LiBKLiIgYW5kIHRoZSBsaWtlLgorJSBObyBmb250IGNoYW5nZSwgYnV0IGRvbid0IGRvIGVuZC1vZi1zZW50ZW5jZSBzcGFjaW5nLgorJSAKK1xkZWZcYWJiciMxe1xkb2FiYnIgIzEsLFxmaW5pc2h9CitcZGVmXGRvYWJiciMxLCMyLCMzXGZpbmlzaHslCisgIHtccGxhaW5mcmVuY2hzcGFjaW5nICMxfSUKKyAgXGRlZlx0ZW1weyMyfSUKKyAgXGlmeFx0ZW1wXGVtcHR5IFxlbHNlCisgICAgXHNwYWNlICh7XHVuc2Vwc3BhY2VzIFxpZ25vcmVzcGFjZXMgXHRlbXAgXHVuc2tpcH0pJQorICBcZmkKK30KKworJSBAcG91bmRze30gaXMgYSBzdGVybGluZyBzaWduLCB3aGljaCBLbnV0aCBwdXQgaW4gdGhlIENNIGl0YWxpYyBmb250LgorJQorXGRlZlxwb3VuZHN7e1xpdFwkfX0KKworJSBAZXVyb3t9IGNvbWVzIGZyb20gYSBzZXBhcmF0ZSBmb250LCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgc3R5bGUuCislIFdlIHVzZSB0aGUgZnJlZSBmZXltKiBmb250cyBmcm9tIHRoZSBldXJvc3ltIHBhY2thZ2UgYnkgSGVucmlrCislIFRoZWlsaW5nLCB3aGljaCBzdXBwb3J0IHJlZ3VsYXIsIHNsYW50ZWQsIGJvbGQgYW5kIGJvbGQgc2xhbnRlZCAoYW5kCislICJvdXRsaW5lZCIgKGJsYWNrYm9hcmQgYm9hcmQsIHNvcnQgb2YpIHZlcnNpb25zLCB3aGljaCB3ZSBkb24ndCBuZWVkKS4KKyUgSXQgaXMgYXZhaWxhYmxlIGZyb20gaHR0cDovL3d3dy5jdGFuLm9yZy90ZXgtYXJjaGl2ZS9mb250cy9ldXJvc3ltLgorJSAKKyUgQWx0aG91Z2ggb25seSByZWd1bGFyIGlzIHRoZSB0cnVseSBvZmZpY2lhbCBFdXJvIHN5bWJvbCwgd2UgaWdub3JlCislIHRoYXQuICBUaGUgRXVybyBpcyBkZXNpZ25lZCB0byBiZSBzbGlnaHRseSB0YWxsZXIgdGhhbiB0aGUgcmVndWxhcgorJSBmb250IGhlaWdodC4KKyUgCislIGZleW1yIC0gcmVndWxhcgorJSBmZXltbyAtIHNsYW50ZWQKKyUgZmV5YnIgLSBib2xkCislIGZleWJvIC0gYm9sZCBzbGFudGVkCislIAorJSBUaGVyZSBpcyBubyBnb29kIChmcmVlKSB0eXBld3JpdGVyIHZlcnNpb24sIHRvIG15IGtub3dsZWRnZS4KKyUgQSBmZXltcjEwIGV1cm8gaXMgfjcuM3B0IHdpZGUsIHdoaWxlIGEgbm9ybWFsIGNtdHQxMCBjaGFyIGlzIH41LjI1cHQgd2lkZS4KKyUgSG1tLgorJSAKKyUgQWxzbyBkb2Vzbid0IHdvcmsgaW4gbWF0aC4gIERvIHdlIG5lZWQgdG8gZG8gbWF0aCB3aXRoIGV1cm8gc3ltYm9scz8KKyUgSG9wZSBub3QuCislIAorJSAKK1xkZWZcZXVyb3t7XGV1cm9mb250IGV9fQorXGRlZlxldXJvZm9udHslCisgICUgV2Ugc2V0IHRoZSBmb250IGF0IGVhY2ggY29tbWFuZCwgcmF0aGVyIHRoYW4gcHJlZGVmaW5pbmcgaXQgaW4KKyAgJSBcdGV4dGZvbnRzIGFuZCB0aGUgb3RoZXIgZm9udC1zd2l0Y2hpbmcgY29tbWFuZHMsIHNvIHRoYXQKKyAgJSBpbnN0YWxsYXRpb25zIHdoaWNoIG5ldmVyIG5lZWQgdGhlIHN5bWJvbCBkb24ndCBoYXZlIHRvIGhhdmUgdGhlCisgICUgZm9udCBpbnN0YWxsZWQuCisgICUgCisgICUgVGhlcmUgaXMgb25seSBvbmUgZGVzaWduZWQgc2l6ZSAobm9taW5hbCAxMHB0KSwgc28gd2UgYWx3YXlzIHNjYWxlCisgICUgdGhhdCB0byB0aGUgY3VycmVudCBub21pbmFsIHNpemUuCisgICUgCisgICUgQnkgdGhlIHdheSwgc2ltcGx5IHVzaW5nICJhdCAxZW0iIHdvcmtzIGZvciBjbXIxMCBhbmQgdGhlIGxpa2UsIGJ1dAorICAlIGRvZXMgbm90IHdvcmsgZm9yIGNtYngxMCBhbmQgb3RoZXIgZXh0ZW5kZWQvc2hydW5rZW4gZm9udHMuCisgICUgCisgIFxkZWZcZXVyb3NpemV7XGNzbmFtZVxjdXJmb250c2l6ZSBub21pbmFsc2l6ZVxlbmRjc25hbWV9JQorICAlCisgIFxpZnhcY3VyZm9udHN0eWxlXGJmc3R5bGVuYW1lIAorICAgICUgYm9sZDoKKyAgICBcZm9udFx0aGlzZXVyb2ZvbnQgPSBcaWZ1c2luZ2l0e2ZleWJvMTB9e2ZleWJyMTB9IGF0IFxldXJvc2l6ZQorICBcZWxzZSAKKyAgICAlIHJlZ3VsYXI6CisgICAgXGZvbnRcdGhpc2V1cm9mb250ID0gXGlmdXNpbmdpdHtmZXltbzEwfXtmZXltcjEwfSBhdCBcZXVyb3NpemUKKyAgXGZpCisgIFx0aGlzZXVyb2ZvbnQKK30KKworJSBAcmVnaXN0ZXJlZHN5bWJvbCAtIFIgaW4gYSBjaXJjbGUuICBUaGUgZm9udCBmb3IgdGhlIFIgc2hvdWxkIHJlYWxseQorJSBiZSBzbWFsbGVyIHlldCwgYnV0IGxsbHNpemUgaXMgdGhlIGJlc3Qgd2UgY2FuIGRvIGZvciBub3cuCislIEFkYXB0ZWQgZnJvbSB0aGUgcGxhaW4udGV4IGRlZmluaXRpb24gb2YgXGNvcHlyaWdodC4KKyUKK1xkZWZccmVnaXN0ZXJlZHN5bWJvbHslCisgICRee3tcb29hbGlnbntcaGZpbFxyYWlzZS4wN2V4XGhib3h7XHNlbGVjdGZvbnRzXGxsbHNpemUgUn0lCisgICAgICAgICAgICAgICBcaGZpbFxjcmNyXE9yYn19JQorICAgIH0kJQorfQorCislIEB0ZXh0ZGVncmVlIC0gdGhlIG5vcm1hbCBkZWdyZWVzIHNpZ24uCislCitcZGVmXHRleHRkZWdyZWV7JF5cY2lyYyR9CisKKyUgTGF1cmVudCBTaWViZW5tYW5uIHJlcG9ydHMgXE9yYiB1bmRlZmluZWQgd2l0aDoKKyUgIFRleHR1cmVzIDEuNy43IChwcmVsb2FkZWQgZm9ybWF0PXBsYWluIDkzLjEwLjE0KSAgKDY4SykgIDE2IEFQUiAyMDA0IDAyOjM4CislIHNvIHdlJ2xsIGRlZmluZSBpdCBpZiBuZWNlc3NhcnkuCislIAorXGlmeFxPcmJcdW5kZWZpbmVkCitcZGVmXE9yYntcbWF0aGhleGJveDIwRH0KK1xmaQorCisKK1xtZXNzYWdle3BhZ2UgaGVhZGluZ3MsfQorCitcbmV3c2tpcFx0aXRsZXBhZ2V0b3BnbHVlIFx0aXRsZXBhZ2V0b3BnbHVlID0gMS41aW4KK1xuZXdza2lwXHRpdGxlcGFnZWJvdHRvbWdsdWUgXHRpdGxlcGFnZWJvdHRvbWdsdWUgPSAycGMKKworJSBGaXJzdCB0aGUgdGl0bGUgcGFnZS4gIE11c3QgZG8gQHNldHRpdGxlIGJlZm9yZSBAdGl0bGVwYWdlLgorXG5ld2lmXGlmc2VlbmF1dGhvcgorXG5ld2lmXGlmZmluaXNoZWR0aXRsZXBhZ2UKKworJSBEbyBhbiBpbXBsaWNpdCBAY29udGVudHMgb3IgQHNob3J0Y29udGVudHMgYWZ0ZXIgQGVuZCB0aXRsZXBhZ2UgaWYgdGhlCislIHVzZXIgc2F5cyBAc2V0Y29udGVudHNhZnRlcnRpdGxlcGFnZSBvciBAc2V0c2hvcnRjb250ZW50c2FmdGVydGl0bGVwYWdlLgorJQorXG5ld2lmXGlmc2V0Y29udGVudHNhZnRlcnRpdGxlcGFnZQorIFxsZXRcc2V0Y29udGVudHNhZnRlcnRpdGxlcGFnZSA9IFxzZXRjb250ZW50c2FmdGVydGl0bGVwYWdldHJ1ZQorXG5ld2lmXGlmc2V0c2hvcnRjb250ZW50c2FmdGVydGl0bGVwYWdlCisgXGxldFxzZXRzaG9ydGNvbnRlbnRzYWZ0ZXJ0aXRsZXBhZ2UgPSBcc2V0c2hvcnRjb250ZW50c2FmdGVydGl0bGVwYWdldHJ1ZQorCitccGFyc2VhcmdkZWZcc2hvcnR0aXRsZXBhZ2V7XGJlZ2luZ3JvdXBcaGJveHt9XHZza2lwIDEuNWluIFxjaGFwcm0gXGNlbnRlcmxpbmV7IzF9JQorICAgICAgICBcZW5kZ3JvdXBccGFnZVxoYm94e31ccGFnZX0KKworXGVudmRlZlx0aXRsZXBhZ2V7JQorICAlIE9wZW4gb25lIGV4dHJhIGdyb3VwLCBhcyB3ZSB3YW50IHRvIGNsb3NlIGl0IGluIHRoZSBtaWRkbGUgb2YgXEV0aXRsZXBhZ2UuCisgIFxiZWdpbmdyb3VwCisgICAgXHBhcmluZGVudD0wcHQgXHRleHRmb250cworICAgICUgTGVhdmUgc29tZSBzcGFjZSBhdCB0aGUgdmVyeSB0b3Agb2YgdGhlIHBhZ2UuCisgICAgXHZnbHVlXHRpdGxlcGFnZXRvcGdsdWUKKyAgICAlIE5vIHJ1bGUgYXQgcGFnZSBib3R0b20gdW5sZXNzIHdlIHByaW50IG9uZSBhdCB0aGUgdG9wIHdpdGggQHRpdGxlLgorICAgIFxmaW5pc2hlZHRpdGxlcGFnZXRydWUKKyAgICAlCisgICAgJSBNb3N0IHRpdGxlIGBgcGFnZXMnJyBhcmUgYWN0dWFsbHkgdHdvIHBhZ2VzIGxvbmcsIHdpdGggc3BhY2UKKyAgICAlIGF0IHRoZSB0b3Agb2YgdGhlIHNlY29uZC4gIFdlIGRvbid0IHdhbnQgdGhlIHJhZ2dlZCBsZWZ0IG9uIHRoZSBzZWNvbmQuCisgICAgXGxldFxvbGRwYWdlID0gXHBhZ2UKKyAgICBcZGVmXHBhZ2V7JQorICAgICAgXGlmZmluaXNoZWR0aXRsZXBhZ2VcZWxzZQorCSBcZmluaXNodGl0bGVwYWdlCisgICAgICBcZmkKKyAgICAgIFxsZXRccGFnZSA9IFxvbGRwYWdlCisgICAgICBccGFnZQorICAgICAgXG51bGwKKyAgICB9JQorfQorCitcZGVmXEV0aXRsZXBhZ2V7JQorICAgIFxpZmZpbmlzaGVkdGl0bGVwYWdlXGVsc2UKKwlcZmluaXNodGl0bGVwYWdlCisgICAgXGZpCisgICAgJSBJdCBpcyBpbXBvcnRhbnQgdG8gZG8gdGhlIHBhZ2UgYnJlYWsgYmVmb3JlIGVuZGluZyB0aGUgZ3JvdXAsCisgICAgJSBiZWNhdXNlIHRoZSBoZWFkbGluZSBhbmQgZm9vdGxpbmUgYXJlIG9ubHkgZW1wdHkgaW5zaWRlIHRoZSBncm91cC4KKyAgICAlIElmIHdlIHVzZSB0aGUgbmV3IGRlZmluaXRpb24gb2YgXHBhZ2UsIHdlIGFsd2F5cyBnZXQgYSBibGFuayBwYWdlCisgICAgJSBhZnRlciB0aGUgdGl0bGUgcGFnZSwgd2hpY2ggd2UgY2VydGFpbmx5IGRvbid0IHdhbnQuCisgICAgXG9sZHBhZ2UKKyAgXGVuZGdyb3VwCisgICUKKyAgJSBOZWVkIHRoaXMgYmVmb3JlIHRoZSBcLi4uYWZ0ZXJ0aXRsZXBhZ2UgY2hlY2tzIHNvIHRoYXQgaWYgdGhleSBhcmUKKyAgJSBpbiBlZmZlY3QgdGhlIHRvYyBwYWdlcyB3aWxsIGNvbWUgb3V0IHdpdGggcGFnZSBudW1iZXJzLgorICBcSEVBRElOR1NvbgorICAlCisgICUgSWYgdGhleSB3YW50IHNob3J0LCB0aGV5IGNlcnRhaW5seSB3YW50IGxvbmcgdG9vLgorICBcaWZzZXRzaG9ydGNvbnRlbnRzYWZ0ZXJ0aXRsZXBhZ2UKKyAgICBcc2hvcnRjb250ZW50cworICAgIFxjb250ZW50cworICAgIFxnbG9iYWxcbGV0XHNob3J0Y29udGVudHMgPSBccmVsYXgKKyAgICBcZ2xvYmFsXGxldFxjb250ZW50cyA9IFxyZWxheAorICBcZmkKKyAgJQorICBcaWZzZXRjb250ZW50c2FmdGVydGl0bGVwYWdlCisgICAgXGNvbnRlbnRzCisgICAgXGdsb2JhbFxsZXRcY29udGVudHMgPSBccmVsYXgKKyAgICBcZ2xvYmFsXGxldFxzaG9ydGNvbnRlbnRzID0gXHJlbGF4CisgIFxmaQorfQorCitcZGVmXGZpbmlzaHRpdGxlcGFnZXslCisgIFx2c2tpcDRwdCBcaHJ1bGUgaGVpZ2h0IDJwdCB3aWR0aCBcaHNpemUKKyAgXHZza2lwXHRpdGxlcGFnZWJvdHRvbWdsdWUKKyAgXGZpbmlzaGVkdGl0bGVwYWdldHJ1ZQorfQorCislJSUgTWFjcm9zIHRvIGJlIHVzZWQgd2l0aGluIEB0aXRsZXBhZ2U6CisKK1xsZXRcc3VidGl0bGVybT1cdGVucm0KK1xkZWZcc3VidGl0bGVmb250e1xzdWJ0aXRsZXJtIFxub3JtYWxiYXNlbGluZXNraXAgPSAxM3B0IFxub3JtYWxiYXNlbGluZXN9CisKK1xkZWZcYXV0aG9yZm9udHtcYXV0aG9ycm0gXG5vcm1hbGJhc2VsaW5lc2tpcCA9IDE2cHQgXG5vcm1hbGJhc2VsaW5lcworCQlcbGV0XHR0PVxhdXRob3J0dH0KKworXHBhcnNlYXJnZGVmXHRpdGxleyUKKyAgXGNoZWNrZW52XHRpdGxlcGFnZQorICBcbGVmdGxpbmV7XHRpdGxlZm9udHNccm0gIzF9CisgICUgcHJpbnQgYSBydWxlIGF0IHRoZSBwYWdlIGJvdHRvbSBhbHNvLgorICBcZmluaXNoZWR0aXRsZXBhZ2VmYWxzZQorICBcdnNraXA0cHQgXGhydWxlIGhlaWdodCA0cHQgd2lkdGggXGhzaXplIFx2c2tpcDRwdAorfQorCitccGFyc2VhcmdkZWZcc3VidGl0bGV7JQorICBcY2hlY2tlbnZcdGl0bGVwYWdlCisgIHtcc3VidGl0bGVmb250IFxyaWdodGxpbmV7IzF9fSUKK30KKworJSBAYXV0aG9yIHNob3VsZCBjb21lIGxhc3QsIGJ1dCBtYXkgY29tZSBtYW55IHRpbWVzLgorJSBJdCBjYW4gYWxzbyBiZSB1c2VkIGluc2lkZSBAcXVvdGF0aW9uLgorJQorXHBhcnNlYXJnZGVmXGF1dGhvcnslCisgIFxkZWZcdGVtcHtccXVvdGF0aW9ufSUKKyAgXGlmeFx0aGlzZW52XHRlbXAKKyAgICBcZGVmXHF1b3RhdGlvbmF1dGhvcnsjMX0lIHByaW50ZWQgaW4gXEVxdW90YXRpb24uCisgIFxlbHNlCisgICAgXGNoZWNrZW52XHRpdGxlcGFnZQorICAgIFxpZnNlZW5hdXRob3JcZWxzZSBcdnNraXAgMHB0IHBsdXMgMWZpbGxsIFxzZWVuYXV0aG9ydHJ1ZSBcZmkKKyAgICB7XGF1dGhvcmZvbnQgXGxlZnRsaW5leyMxfX0lCisgIFxmaQorfQorCisKKyUlJSBTZXQgdXAgcGFnZSBoZWFkaW5ncyBhbmQgZm9vdGluZ3MuCisKK1xsZXRcdGhpc3BhZ2U9XGZvbGlvCisKK1xuZXd0b2tzXGV2ZW5oZWFkbGluZSAgICAlIGhlYWRsaW5lIG9uIGV2ZW4gcGFnZXMKK1xuZXd0b2tzXG9kZGhlYWRsaW5lICAgICAlIGhlYWRsaW5lIG9uIG9kZCBwYWdlcworXG5ld3Rva3NcZXZlbmZvb3RsaW5lICAgICUgZm9vdGxpbmUgb24gZXZlbiBwYWdlcworXG5ld3Rva3Ncb2RkZm9vdGxpbmUgICAgICUgZm9vdGxpbmUgb24gb2RkIHBhZ2VzCisKKyUgTm93IG1ha2UgVGVYIHVzZSB0aG9zZSB2YXJpYWJsZXMKK1xoZWFkbGluZT17e1x0ZXh0Zm9udHNccm0gXGlmb2RkXHBhZ2VubyBcdGhlXG9kZGhlYWRsaW5lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgXGVsc2UgXHRoZVxldmVuaGVhZGxpbmUgXGZpfX0KK1xmb290bGluZT17e1x0ZXh0Zm9udHNccm0gXGlmb2RkXHBhZ2VubyBcdGhlXG9kZGZvb3RsaW5lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgXGVsc2UgXHRoZVxldmVuZm9vdGxpbmUgXGZpfVxIRUFESU5HU2hvb2t9CitcbGV0XEhFQURJTkdTaG9vaz1ccmVsYXgKKworJSBDb21tYW5kcyB0byBzZXQgdGhvc2UgdmFyaWFibGVzLgorJSBGb3IgZXhhbXBsZSwgdGhpcyBpcyB3aGF0ICBAaGVhZGluZ3Mgb24gIGRvZXMKKyUgQGV2ZW5oZWFkaW5nIEB0aGlzdGl0bGV8QHRoaXNwYWdlfEB0aGlzY2hhcHRlcgorJSBAb2RkaGVhZGluZyBAdGhpc2NoYXB0ZXJ8QHRoaXNwYWdlfEB0aGlzdGl0bGUKKyUgQGV2ZW5mb290aW5nIEB0aGlzZmlsZXx8CislIEBvZGRmb290aW5nIHx8QHRoaXNmaWxlCisKKworXGRlZlxldmVuaGVhZGluZ3tccGFyc2VhcmdcZXZlbmhlYWRpbmd4eHh9CitcZGVmXGV2ZW5oZWFkaW5neHh4ICMxe1xldmVuaGVhZGluZ3l5eSAjMVx8XHxcfFx8XGZpbmlzaH0KK1xkZWZcZXZlbmhlYWRpbmd5eXkgIzFcfCMyXHwjM1x8IzRcZmluaXNoeyUKK1xnbG9iYWxcZXZlbmhlYWRsaW5lPXtccmxhcHtcY2VudGVybGluZXsjMn19XGxpbmV7IzFcaGZpbCMzfX19CisKK1xkZWZcb2RkaGVhZGluZ3tccGFyc2Vhcmdcb2RkaGVhZGluZ3h4eH0KK1xkZWZcb2RkaGVhZGluZ3h4eCAjMXtcb2RkaGVhZGluZ3l5eSAjMVx8XHxcfFx8XGZpbmlzaH0KK1xkZWZcb2RkaGVhZGluZ3l5eSAjMVx8IzJcfCMzXHwjNFxmaW5pc2h7JQorXGdsb2JhbFxvZGRoZWFkbGluZT17XHJsYXB7XGNlbnRlcmxpbmV7IzJ9fVxsaW5leyMxXGhmaWwjM319fQorCitccGFyc2VhcmdkZWZcZXZlcnloZWFkaW5ne1xvZGRoZWFkaW5neHh4eyMxfVxldmVuaGVhZGluZ3h4eHsjMX19JQorCitcZGVmXGV2ZW5mb290aW5ne1xwYXJzZWFyZ1xldmVuZm9vdGluZ3h4eH0KK1xkZWZcZXZlbmZvb3Rpbmd4eHggIzF7XGV2ZW5mb290aW5neXl5ICMxXHxcfFx8XHxcZmluaXNofQorXGRlZlxldmVuZm9vdGluZ3l5eSAjMVx8IzJcfCMzXHwjNFxmaW5pc2h7JQorXGdsb2JhbFxldmVuZm9vdGxpbmU9e1xybGFwe1xjZW50ZXJsaW5leyMyfX1cbGluZXsjMVxoZmlsIzN9fX0KKworXGRlZlxvZGRmb290aW5ne1xwYXJzZWFyZ1xvZGRmb290aW5neHh4fQorXGRlZlxvZGRmb290aW5neHh4ICMxe1xvZGRmb290aW5neXl5ICMxXHxcfFx8XHxcZmluaXNofQorXGRlZlxvZGRmb290aW5neXl5ICMxXHwjMlx8IzNcfCM0XGZpbmlzaHslCisgIFxnbG9iYWxcb2RkZm9vdGxpbmUgPSB7XHJsYXB7XGNlbnRlcmxpbmV7IzJ9fVxsaW5leyMxXGhmaWwjM319JQorICAlCisgICUgTGVhdmUgc29tZSBzcGFjZSBmb3IgdGhlIGZvb3RsaW5lLiAgSG9wZWZ1bGx5IG9rIHRvIGFzc3VtZQorICAlIEBldmVuZm9vdGluZyB3aWxsIG5vdCBiZSB1c2VkIGJ5IGl0c2VsZi4KKyAgXGdsb2JhbFxhZHZhbmNlXHBhZ2VoZWlnaHQgYnkgLTEycHQKKyAgXGdsb2JhbFxhZHZhbmNlXHZzaXplIGJ5IC0xMnB0Cit9CisKK1xwYXJzZWFyZ2RlZlxldmVyeWZvb3Rpbmd7XG9kZGZvb3Rpbmd4eHh7IzF9XGV2ZW5mb290aW5neHh4eyMxfX0KKworCislIEBoZWFkaW5ncyBkb3VibGUgICAgICB0dXJucyBoZWFkaW5ncyBvbiBmb3IgZG91YmxlLXNpZGVkIHByaW50aW5nLgorJSBAaGVhZGluZ3Mgc2luZ2xlICAgICAgdHVybnMgaGVhZGluZ3Mgb24gZm9yIHNpbmdsZS1zaWRlZCBwcmludGluZy4KKyUgQGhlYWRpbmdzIG9mZiAgICAgICAgIHR1cm5zIHRoZW0gb2ZmLgorJSBAaGVhZGluZ3Mgb24gICAgICAgICAgc2FtZSBhcyBAaGVhZGluZ3MgZG91YmxlLCByZXRhaW5lZCBmb3IgY29tcGF0aWJpbGl0eS4KKyUgQGhlYWRpbmdzIGFmdGVyICAgICAgIHR1cm5zIG9uIGRvdWJsZS1zaWRlZCBoZWFkaW5ncyBhZnRlciB0aGlzIHBhZ2UuCislIEBoZWFkaW5ncyBkb3VibGVhZnRlciB0dXJucyBvbiBkb3VibGUtc2lkZWQgaGVhZGluZ3MgYWZ0ZXIgdGhpcyBwYWdlLgorJSBAaGVhZGluZ3Mgc2luZ2xlYWZ0ZXIgdHVybnMgb24gc2luZ2xlLXNpZGVkIGhlYWRpbmdzIGFmdGVyIHRoaXMgcGFnZS4KKyUgQnkgZGVmYXVsdCwgdGhleSBhcmUgb2ZmIGF0IHRoZSBzdGFydCBvZiBhIGRvY3VtZW50LAorJSBhbmQgdHVybmVkIGBvbicgYWZ0ZXIgQGVuZCB0aXRsZXBhZ2UuCisKK1xkZWZcaGVhZGluZ3MgIzEge1xjc25hbWUgSEVBRElOR1MjMVxlbmRjc25hbWV9CisKK1xkZWZcSEVBRElOR1NvZmZ7JQorXGdsb2JhbFxldmVuaGVhZGxpbmU9e1xoZmlsfSBcZ2xvYmFsXGV2ZW5mb290bGluZT17XGhmaWx9CitcZ2xvYmFsXG9kZGhlYWRsaW5lPXtcaGZpbH0gXGdsb2JhbFxvZGRmb290bGluZT17XGhmaWx9fQorXEhFQURJTkdTb2ZmCislIFdoZW4gd2UgdHVybiBoZWFkaW5ncyBvbiwgc2V0IHRoZSBwYWdlIG51bWJlciB0byAxLgorJSBGb3IgZG91YmxlLXNpZGVkIHByaW50aW5nLCBwdXQgY3VycmVudCBmaWxlIG5hbWUgaW4gbG93ZXIgbGVmdCBjb3JuZXIsCislIGNoYXB0ZXIgbmFtZSBvbiBpbnNpZGUgdG9wIG9mIHJpZ2h0IGhhbmQgcGFnZXMsIGRvY3VtZW50CislIHRpdGxlIG9uIGluc2lkZSB0b3Agb2YgbGVmdCBoYW5kIHBhZ2VzLCBhbmQgcGFnZSBudW1iZXJzIG9uIG91dHNpZGUgdG9wCislIGVkZ2Ugb2YgYWxsIHBhZ2VzLgorXGRlZlxIRUFESU5HU2RvdWJsZXslCitcZ2xvYmFsXHBhZ2Vubz0xCitcZ2xvYmFsXGV2ZW5mb290bGluZT17XGhmaWx9CitcZ2xvYmFsXG9kZGZvb3RsaW5lPXtcaGZpbH0KK1xnbG9iYWxcZXZlbmhlYWRsaW5lPXtcbGluZXtcZm9saW9caGZpbFx0aGlzdGl0bGV9fQorXGdsb2JhbFxvZGRoZWFkbGluZT17XGxpbmV7XHRoaXNjaGFwdGVyXGhmaWxcZm9saW99fQorXGdsb2JhbFxsZXRcY29udGVudHNhbGlnbm1hY3JvID0gXGNoYXBvZGRwYWdlCit9CitcbGV0XGNvbnRlbnRzYWxpZ25tYWNybyA9IFxjaGFwcGFnZXIKKworJSBGb3Igc2luZ2xlLXNpZGVkIHByaW50aW5nLCBjaGFwdGVyIHRpdGxlIGdvZXMgYWNyb3NzIHRvcCBsZWZ0IG9mIHBhZ2UsCislIHBhZ2UgbnVtYmVyIG9uIHRvcCByaWdodC4KK1xkZWZcSEVBRElOR1NzaW5nbGV7JQorXGdsb2JhbFxwYWdlbm89MQorXGdsb2JhbFxldmVuZm9vdGxpbmU9e1xoZmlsfQorXGdsb2JhbFxvZGRmb290bGluZT17XGhmaWx9CitcZ2xvYmFsXGV2ZW5oZWFkbGluZT17XGxpbmV7XHRoaXNjaGFwdGVyXGhmaWxcZm9saW99fQorXGdsb2JhbFxvZGRoZWFkbGluZT17XGxpbmV7XHRoaXNjaGFwdGVyXGhmaWxcZm9saW99fQorXGdsb2JhbFxsZXRcY29udGVudHNhbGlnbm1hY3JvID0gXGNoYXBwYWdlcgorfQorXGRlZlxIRUFESU5HU29ue1xIRUFESU5HU2RvdWJsZX0KKworXGRlZlxIRUFESU5HU2FmdGVye1xsZXRcSEVBRElOR1Nob29rPVxIRUFESU5HU2RvdWJsZXh9CitcbGV0XEhFQURJTkdTZG91YmxlYWZ0ZXI9XEhFQURJTkdTYWZ0ZXIKK1xkZWZcSEVBRElOR1Nkb3VibGV4eyUKK1xnbG9iYWxcZXZlbmZvb3RsaW5lPXtcaGZpbH0KK1xnbG9iYWxcb2RkZm9vdGxpbmU9e1xoZmlsfQorXGdsb2JhbFxldmVuaGVhZGxpbmU9e1xsaW5le1xmb2xpb1xoZmlsXHRoaXN0aXRsZX19CitcZ2xvYmFsXG9kZGhlYWRsaW5lPXtcbGluZXtcdGhpc2NoYXB0ZXJcaGZpbFxmb2xpb319CitcZ2xvYmFsXGxldFxjb250ZW50c2FsaWdubWFjcm8gPSBcY2hhcG9kZHBhZ2UKK30KKworXGRlZlxIRUFESU5HU3NpbmdsZWFmdGVye1xsZXRcSEVBRElOR1Nob29rPVxIRUFESU5HU3NpbmdsZXh9CitcZGVmXEhFQURJTkdTc2luZ2xleHslCitcZ2xvYmFsXGV2ZW5mb290bGluZT17XGhmaWx9CitcZ2xvYmFsXG9kZGZvb3RsaW5lPXtcaGZpbH0KK1xnbG9iYWxcZXZlbmhlYWRsaW5lPXtcbGluZXtcdGhpc2NoYXB0ZXJcaGZpbFxmb2xpb319CitcZ2xvYmFsXG9kZGhlYWRsaW5lPXtcbGluZXtcdGhpc2NoYXB0ZXJcaGZpbFxmb2xpb319CitcZ2xvYmFsXGxldFxjb250ZW50c2FsaWdubWFjcm8gPSBcY2hhcHBhZ2VyCit9CisKKyUgU3Vicm91dGluZXMgdXNlZCBpbiBnZW5lcmF0aW5nIGhlYWRpbmdzCislIFRoaXMgcHJvZHVjZXMgRGF5IE1vbnRoIFllYXIgc3R5bGUgb2Ygb3V0cHV0LgorJSBPbmx5IGRlZmluZSBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLCBpbiBjYXNlIGEgdHhpLT8/LnRleCBmaWxlIGhhcyBzZXQKKyUgdXAgYSBkaWZmZXJlbnQgZm9ybWF0IChlLmcuLCB0eGktY3MudGV4IGRvZXMgdGhpcykuCitcaWZ4XHRvZGF5XHVuZGVmaW5lZAorXGRlZlx0b2RheXslCisgIFxudW1iZXJcZGF5XHNwYWNlCisgIFxpZmNhc2VcbW9udGgKKyAgXG9yXHB1dHdvcmRNSmFuXG9yXHB1dHdvcmRNRmViXG9yXHB1dHdvcmRNTWFyXG9yXHB1dHdvcmRNQXByCisgIFxvclxwdXR3b3JkTU1heVxvclxwdXR3b3JkTUp1blxvclxwdXR3b3JkTUp1bFxvclxwdXR3b3JkTUF1ZworICBcb3JccHV0d29yZE1TZXBcb3JccHV0d29yZE1PY3Rcb3JccHV0d29yZE1Ob3Zcb3JccHV0d29yZE1EZWMKKyAgXGZpCisgIFxzcGFjZVxudW1iZXJceWVhcn0KK1xmaQorCislIEBzZXR0aXRsZSBsaW5lLi4uICBzcGVjaWZpZXMgdGhlIHRpdGxlIG9mIHRoZSBkb2N1bWVudCwgZm9yIGhlYWRpbmdzLgorJSBJdCBnZW5lcmF0ZXMgbm8gb3V0cHV0IG9mIGl0cyBvd24uCitcZGVmXHRoaXN0aXRsZXtccHV0d29yZE5vVGl0bGV9CitcZGVmXHNldHRpdGxle1xwYXJzZWFyZ3tcZ2RlZlx0aGlzdGl0bGV9fQorCisKK1xtZXNzYWdle3RhYmxlcyx9CislIFRhYmxlcyAtLSBAdGFibGUsIEBmdGFibGUsIEB2dGFibGUsIEBpdGVtKHgpLgorCislIGRlZmF1bHQgaW5kZW50YXRpb24gb2YgdGFibGUgdGV4dAorXG5ld2RpbWVuXHRhYmxlaW5kZW50IFx0YWJsZWluZGVudD0uOGluCislIGRlZmF1bHQgaW5kZW50YXRpb24gb2YgQGl0ZW1pemUgYW5kIEBlbnVtZXJhdGUgdGV4dAorXG5ld2RpbWVuXGl0ZW1pbmRlbnQgIFxpdGVtaW5kZW50PS4zaW4KKyUgbWFyZ2luIGJldHdlZW4gZW5kIG9mIHRhYmxlIGl0ZW0gYW5kIHN0YXJ0IG9mIHRhYmxlIHRleHQuCitcbmV3ZGltZW5caXRlbW1hcmdpbiAgXGl0ZW1tYXJnaW49LjFpbgorCislIHVzZWQgaW50ZXJuYWxseSBmb3IgXGl0ZW1pbmRlbnQgbWludXMgXGl0ZW1tYXJnaW4KK1xuZXdkaW1lblxpdGVtbWF4CisKKyUgTm90ZSBAdGFibGUsIEBmdGFibGUsIGFuZCBAdnRhYmxlIGRlZmluZSBAaXRlbSwgQGl0ZW14LCBldGMuLCB3aXRoCislIHRoZXNlIGRlZnMuCislIFRoZXkgYWxzbyBkZWZpbmUgXGl0ZW1pbmRleAorJSB0byBpbmRleCB0aGUgaXRlbSBuYW1lIGluIHdoYXRldmVyIG1hbm5lciBpcyBkZXNpcmVkIChwZXJoYXBzIG5vbmUpLgorCitcbmV3aWZcaWZpdGVteG5lZWRzbmVnYXRpdmV2c2tpcAorCitcZGVmXGl0ZW14cGFye1xwYXJcaWZpdGVteG5lZWRzbmVnYXRpdmV2c2tpcFxub2JyZWFrXHZza2lwLVxwYXJza2lwXG5vYnJlYWtcZml9CisKK1xkZWZcaW50ZXJuYWxCaXRlbXtcc21hbGxicmVhayBccGFyc2VhcmdcaXRlbXp6en0KK1xkZWZcaW50ZXJuYWxCaXRlbXh7XGl0ZW14cGFyIFxwYXJzZWFyZ1xpdGVtenp6fQorCitcZGVmXGl0ZW16enogIzF7XGJlZ2luZ3JvdXAgJQorICBcYWR2YW5jZVxoc2l6ZSBieSAtXHJpZ2h0c2tpcAorICBcYWR2YW5jZVxoc2l6ZSBieSAtXHRhYmxlaW5kZW50CisgIFxzZXRib3gwPVxoYm94e1xpdGVtaW5kaWNhdGV7IzF9fSUKKyAgXGl0ZW1pbmRleHsjMX0lCisgIFxub2JyZWFrICUgVGhpcyBwcmV2ZW50cyBhIGJyZWFrIGJlZm9yZSBAaXRlbXguCisgICUKKyAgJSBJZiB0aGUgaXRlbSB0ZXh0IGRvZXMgbm90IGZpdCBpbiB0aGUgc3BhY2Ugd2UgaGF2ZSwgcHV0IGl0IG9uIGEgbGluZQorICAlIGJ5IGl0c2VsZiwgYW5kIGRvIG5vdCBhbGxvdyBhIHBhZ2UgYnJlYWsgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGF0CisgICUgbGluZS4gIFdlIGRvIG5vdCBzdGFydCBhIHBhcmFncmFwaCBoZXJlIGJlY2F1c2UgdGhlbiBpZiB0aGUgbmV4dAorICAlIGNvbW1hbmQgaXMsIGUuZy4sIEBraW5kZXgsIHRoZSB3aGF0c2l0IHdvdWxkIGdldCBwdXQgaW50byB0aGUKKyAgJSBob3Jpem9udGFsIGxpc3Qgb24gYSBsaW5lIGJ5IGl0c2VsZiwgcmVzdWx0aW5nIGluIGV4dHJhIGJsYW5rIHNwYWNlLgorICBcaWZkaW0gXHdkMD5caXRlbW1heAorICAgICUKKyAgICAlIE1ha2UgdGhpcyBhIHBhcmFncmFwaCBzbyB3ZSBnZXQgdGhlIFxwYXJza2lwIGdsdWUgYW5kIHdyYXBwaW5nLAorICAgICUgYnV0IGxlYXZlIGl0IHJhZ2dlZC1yaWdodC4KKyAgICBcYmVnaW5ncm91cAorICAgICAgXGFkdmFuY2VcbGVmdHNraXAgYnktXHRhYmxlaW5kZW50CisgICAgICBcYWR2YW5jZVxoc2l6ZSBieVx0YWJsZWluZGVudAorICAgICAgXGFkdmFuY2VccmlnaHRza2lwIGJ5MHB0IHBsdXMxZmlsCisgICAgICBcbGVhdmV2bW9kZVx1bmhib3gwXHBhcgorICAgIFxlbmRncm91cAorICAgICUKKyAgICAlIFdlJ3JlIGdvaW5nIHRvIGJlIHN0YXJ0aW5nIGEgcGFyYWdyYXBoLCBidXQgd2UgZG9uJ3Qgd2FudCB0aGUKKyAgICAlIFxwYXJza2lwIGdsdWUgLS0gbG9naWNhbGx5IGl0J3MgcGFydCBvZiB0aGUgQGl0ZW0gd2UganVzdCBzdGFydGVkLgorICAgIFxub2JyZWFrIFx2c2tpcC1ccGFyc2tpcAorICAgICUKKyAgICAlIFN0b3AgYSBwYWdlIGJyZWFrIGF0IHRoZSBccGFyc2tpcCBnbHVlIGNvbWluZyB1cC4gIEhvd2V2ZXIsIGlmCisgICAgJSB3aGF0IGZvbGxvd3MgaXMgYW4gZW52aXJvbm1lbnQgc3VjaCBhcyBAZXhhbXBsZSwgdGhlcmUgd2lsbCBiZSBubworICAgICUgXHBhcnNraXAgZ2x1ZTsgdGhlbiB0aGUgbmVnYXRpdmUgdnNraXAgd2UganVzdCBpbnNlcnRlZCB3b3VsZAorICAgICUgY2F1c2UgdGhlIGV4YW1wbGUgYW5kIHRoZSBpdGVtIHRvIGNyYXNoIHRvZ2V0aGVyLiAgU28gd2UgdXNlIHRoaXMKKyAgICAlIGJpemFycmUgdmFsdWUgb2YgMTAwMDEgYXMgYSBzaWduYWwgdG8gXGFib3ZlZW52YnJlYWsgdG8gaW5zZXJ0CisgICAgJSBccGFyc2tpcCBnbHVlIGFmdGVyIGFsbC4gIFNlY3Rpb24gdGl0bGVzIGFyZSBoYW5kbGVkIHRoaXMgd2F5IGFsc28uCisgICAgJSAKKyAgICBccGVuYWx0eSAxMDAwMQorICAgIFxlbmRncm91cAorICAgIFxpdGVteG5lZWRzbmVnYXRpdmV2c2tpcGZhbHNlCisgIFxlbHNlCisgICAgJSBUaGUgaXRlbSB0ZXh0IGZpdHMgaW50byB0aGUgc3BhY2UuICBTdGFydCBhIHBhcmFncmFwaCwgc28gdGhhdCB0aGUKKyAgICAlIGZvbGxvd2luZyB0ZXh0IChpZiBhbnkpIHdpbGwgZW5kIHVwIG9uIHRoZSBzYW1lIGxpbmUuCisgICAgXG5vaW5kZW50CisgICAgJSBEbyB0aGlzIHdpdGgga2VybnMgYW5kIFx1bmhib3ggc28gdGhhdCBpZiB0aGVyZSBpcyBhIGZvb3Rub3RlIGluCisgICAgJSB0aGUgaXRlbSB0ZXh0LCBpdCBjYW4gbWlncmF0ZSB0byB0aGUgbWFpbiB2ZXJ0aWNhbCBsaXN0IGFuZAorICAgICUgZXZlbnR1YWxseSBiZSBwcmludGVkLgorICAgIFxub2JyZWFrXGtlcm4tXHRhYmxlaW5kZW50CisgICAgXGRpbWVuMCA9IFxpdGVtbWF4ICBcYWR2YW5jZVxkaW1lbjAgYnkgXGl0ZW1tYXJnaW4gXGFkdmFuY2VcZGltZW4wIGJ5IC1cd2QwCisgICAgXHVuaGJveDAKKyAgICBcbm9icmVha1xrZXJuXGRpbWVuMAorICAgIFxlbmRncm91cAorICAgIFxpdGVteG5lZWRzbmVnYXRpdmV2c2tpcHRydWUKKyAgXGZpCit9CisKK1xkZWZcaXRlbXtcZXJybWVzc2FnZXtAaXRlbSB3aGlsZSBub3QgaW4gYSBsaXN0IGVudmlyb25tZW50fX0KK1xkZWZcaXRlbXh7XGVycm1lc3NhZ2V7QGl0ZW14IHdoaWxlIG5vdCBpbiBhIGxpc3QgZW52aXJvbm1lbnR9fQorCislIEB0YWJsZSwgQGZ0YWJsZSwgQHZ0YWJsZS4KK1xlbnZkZWZcdGFibGV7JQorICBcbGV0XGl0ZW1pbmRleFxnb2JibGUKKyAgXHRhYmxlY2hlY2t7dGFibGV9JQorfQorXGVudmRlZlxmdGFibGV7JQorICBcZGVmXGl0ZW1pbmRleCAjIzF7XGRvaW5kIHtmbn17XGNvZGV7IyMxfX19JQorICBcdGFibGVjaGVja3tmdGFibGV9JQorfQorXGVudmRlZlx2dGFibGV7JQorICBcZGVmXGl0ZW1pbmRleCAjIzF7XGRvaW5kIHt2cn17XGNvZGV7IyMxfX19JQorICBcdGFibGVjaGVja3t2dGFibGV9JQorfQorXGRlZlx0YWJsZWNoZWNrIzF7JQorICBcaWZudW0gXHRoZVxjYXRjb2RlYFxeXk09XGFjdGl2ZQorICAgIFxlbmRncm91cAorICAgIFxlcnJtZXNzYWdle1RoaXMgY29tbWFuZCB3b24ndCB3b3JrIGluIHRoaXMgY29udGV4dDsgcGVyaGFwcyB0aGUgcHJvYmxlbSBpcworICAgICAgdGhhdCB3ZSBhcmUgXGluZW52aXJvbm1lbnRcdGhpc2Vudn0lCisgICAgXGRlZlxuZXh0e1xkb2lnbm9yZXsjMX19JQorICBcZWxzZQorICAgIFxsZXRcbmV4dFx0YWJsZXgKKyAgXGZpCisgIFxuZXh0Cit9CitcZGVmXHRhYmxleCMxeyUKKyAgXGRlZlxpdGVtaW5kaWNhdGV7IzF9JQorICBccGFyc2VhcmdcdGFibGV5Cit9CitcZGVmXHRhYmxleSMxeyUKKyAgeyUKKyAgICBcbWFrZXZhbHVlZXhwYW5kYWJsZQorICAgIFxlZGVmXHRlbXB7XG5vZXhwYW5kXHRhYmxleiAjMVxzcGFjZVxzcGFjZVxzcGFjZX0lCisgICAgXGV4cGFuZGFmdGVyCisgIH1cdGVtcCBcZW5kdGFibGV6Cit9CitcZGVmXHRhYmxleiAjMSAjMiAjMyAjNFxlbmR0YWJsZXp7JQorICBcYWJvdmVlbnZicmVhaworICBcaWZudW0gMCMxPjAgXGFkdmFuY2UgXGxlZnRza2lwIGJ5ICMxXG1pbCBcZmkKKyAgXGlmbnVtIDAjMj4wIFx0YWJsZWluZGVudD0jMlxtaWwgXGZpCisgIFxpZm51bSAwIzM+MCBcYWR2YW5jZSBccmlnaHRza2lwIGJ5ICMzXG1pbCBcZmkKKyAgXGl0ZW1tYXg9XHRhYmxlaW5kZW50CisgIFxhZHZhbmNlIFxpdGVtbWF4IGJ5IC1caXRlbW1hcmdpbgorICBcYWR2YW5jZSBcbGVmdHNraXAgYnkgXHRhYmxlaW5kZW50CisgIFxleGRlbnRhbW91bnQ9XHRhYmxlaW5kZW50CisgIFxwYXJpbmRlbnQgPSAwcHQKKyAgXHBhcnNraXAgPSBcc21hbGxza2lwYW1vdW50CisgIFxpZmRpbSBccGFyc2tpcD0wcHQgXHBhcnNraXA9MnB0IFxmaQorICBcbGV0XGl0ZW0gPSBcaW50ZXJuYWxCaXRlbQorICBcbGV0XGl0ZW14ID0gXGludGVybmFsQml0ZW14Cit9CitcZGVmXEV0YWJsZXtcZW5kZ3JhZlxhZnRlcmVudmJyZWFrfQorXGxldFxFZnRhYmxlXEV0YWJsZQorXGxldFxFdnRhYmxlXEV0YWJsZQorXGxldFxFaXRlbWl6ZVxFdGFibGUKK1xsZXRcRWVudW1lcmF0ZVxFdGFibGUKKworJSBUaGlzIGlzIHRoZSBjb3VudGVyIHVzZWQgYnkgQGVudW1lcmF0ZSwgd2hpY2ggaXMgcmVhbGx5IEBpdGVtaXplCisKK1xuZXdjb3VudCBcaXRlbW5vCisKK1xlbnZkZWZcaXRlbWl6ZXtccGFyc2VhcmdcZG9pdGVtaXplfQorCitcZGVmXGRvaXRlbWl6ZSMxeyUKKyAgXGFib3ZlZW52YnJlYWsKKyAgXGl0ZW1tYXg9XGl0ZW1pbmRlbnQKKyAgXGFkdmFuY2VcaXRlbW1heCBieSAtXGl0ZW1tYXJnaW4KKyAgXGFkdmFuY2VcbGVmdHNraXAgYnkgXGl0ZW1pbmRlbnQKKyAgXGV4ZGVudGFtb3VudD1caXRlbWluZGVudAorICBccGFyaW5kZW50PTBwdAorICBccGFyc2tpcD1cc21hbGxza2lwYW1vdW50CisgIFxpZmRpbVxwYXJza2lwPTBwdCBccGFyc2tpcD0ycHQgXGZpCisgIFxkZWZcaXRlbWNvbnRlbnRzeyMxfSUKKyAgJSBAaXRlbWl6ZSB3aXRoIG5vIGFyZyBpcyBlcXVpdmFsZW50IHRvIEBpdGVtaXplIEBidWxsZXQuCisgIFxpZnhcaXRlbWNvbnRlbnRzXGVtcHR5XGRlZlxpdGVtY29udGVudHN7XGJ1bGxldH1cZmkKKyAgXGxldFxpdGVtPVxpdGVtaXplaXRlbQorfQorCislIERlZmluaXRpb24gb2YgQGl0ZW0gd2hpbGUgaW5zaWRlIEBpdGVtaXplIGFuZCBAZW51bWVyYXRlLgorJQorXGRlZlxpdGVtaXplaXRlbXslCisgIFxhZHZhbmNlXGl0ZW1ubyBieSAxICAlIGZvciBlbnVtZXJhdGlvbnMKKyAge1xsZXRccGFyPVxlbmRncmFmIFxzbWFsbGJyZWFrfSUgcmVhc29uYWJsZSBwbGFjZSB0byBicmVhaworICB7JQorICAgJSBJZiB0aGUgZG9jdW1lbnQgaGFzIGFuIEBpdGVtaXplIGRpcmVjdGx5IGFmdGVyIGEgc2VjdGlvbiB0aXRsZSwgYQorICAgJSBcbm9icmVhayB3aWxsIGJlIGxhc3Qgb24gdGhlIGxpc3QsIGFuZCBcc2VjdGlvbmhlYWRpbmcgd2lsbCBoYXZlCisgICAlIGRvbmUgYSBcdnNraXAtXHBhcnNraXAuICBJbiB0aGF0IGNhc2UsIHdlIGRvbid0IHdhbnQgdG8gemVybworICAgJSBwYXJza2lwLCBvciB0aGUgaXRlbSB0ZXh0IHdpbGwgY3Jhc2ggd2l0aCB0aGUgaGVhZGluZy4gIE9uIHRoZQorICAgJSBvdGhlciBoYW5kLCB3aGVuIHRoZXJlIGlzIG5vcm1hbCB0ZXh0IHByZWNlZGluZyB0aGUgaXRlbSAoYXMgdGhlcmUKKyAgICUgdXN1YWxseSBpcyksIHdlIGRvIHdhbnQgdG8gemVybyBwYXJza2lwLCBvciB0aGVyZSB3b3VsZCBiZSB0b28gbXVjaAorICAgJSBzcGFjZS4gIEluIHRoYXQgY2FzZSwgd2Ugd29uJ3QgaGF2ZSBhIFxub2JyZWFrIGJlZm9yZS4gIEF0IGxlYXN0CisgICAlIHRoYXQncyB0aGUgdGhlb3J5LgorICAgXGlmbnVtXGxhc3RwZW5hbHR5PDEwMDAwIFxwYXJza2lwPTBpbiBcZmkKKyAgIFxub2luZGVudAorICAgXGhib3ggdG8gMHB0e1xoc3MgXGl0ZW1jb250ZW50cyBca2VyblxpdGVtbWFyZ2lufSUKKyAgIFx2YWRqdXN0e1xwZW5hbHR5IDEyMDB9fSUgbm90IGdvb2QgdG8gYnJlYWsgYWZ0ZXIgZmlyc3QgbGluZSBvZiBpdGVtLgorICBcZmx1c2hjcgorfQorCislIFxzcGxpdG9mZiBUT0tFTlNcZW5kbWFyayBkZWZpbmVzIFxmaXJzdCB0byBiZSB0aGUgZmlyc3QgdG9rZW4gaW4KKyUgVE9LRU5TLCBhbmQgXHJlc3QgdG8gYmUgdGhlIHJlbWFpbmRlci4KKyUKK1xkZWZcc3BsaXRvZmYjMSMyXGVuZG1hcmt7XGRlZlxmaXJzdHsjMX1cZGVmXHJlc3R7IzJ9fSUKKworJSBBbGxvdyBhbiBvcHRpb25hbCBhcmd1bWVudCBvZiBhbiB1cHBlcmNhc2UgbGV0dGVyLCBsb3dlcmNhc2UgbGV0dGVyLAorJSBvciBudW1iZXIsIHRvIHNwZWNpZnkgdGhlIGZpcnN0IGxhYmVsIGluIHRoZSBlbnVtZXJhdGVkIGxpc3QuICBObworJSBhcmd1bWVudCBpcyB0aGUgc2FtZSBhcyBgMScuCislCitcZW52cGFyc2VhcmdkZWZcZW51bWVyYXRle1xlbnVtZXJhdGV5ICMxICBcZW5kZW51bWVyYXRleX0KK1xkZWZcZW51bWVyYXRleSAjMSAjMlxlbmRlbnVtZXJhdGV5eyUKKyAgJSBJZiB3ZSB3ZXJlIGdpdmVuIG5vIGFyZ3VtZW50LCBwcmV0ZW5kIHdlIHdlcmUgZ2l2ZW4gYDEnLgorICBcZGVmXHRoZWFyZ3sjMX0lCisgIFxpZnhcdGhlYXJnXGVtcHR5IFxkZWZcdGhlYXJnezF9XGZpCisgICUKKyAgJSBEZXRlY3QgaWYgdGhlIGFyZ3VtZW50IGlzIGEgc2luZ2xlIHRva2VuLiAgSWYgc28sIGl0IG1pZ2h0IGJlIGEKKyAgJSBsZXR0ZXIuICBPdGhlcndpc2UsIHRoZSBvbmx5IHZhbGlkIHRoaW5nIGl0IGNhbiBiZSBpcyBhIG51bWJlci4KKyAgJSAoV2Ugd2lsbCBhbHdheXMgaGF2ZSBvbmUgdG9rZW4sIGJlY2F1c2Ugb2YgdGhlIHRlc3Qgd2UganVzdCBtYWRlLgorICAlIFRoaXMgaXMgYSBnb29kIHRoaW5nLCBzaW5jZSBcc3BsaXRvZmYgZG9lc24ndCB3b3JrIGdpdmVuIG5vdGhpbmcgYXQKKyAgJSBhbGwgLS0gdGhlIGZpcnN0IHBhcmFtZXRlciBpcyB1bmRlbGltaXRlZC4pCisgIFxleHBhbmRhZnRlclxzcGxpdG9mZlx0aGVhcmdcZW5kbWFyaworICBcaWZ4XHJlc3RcZW1wdHkKKyAgICAlIE9ubHkgb25lIHRva2VuIGluIHRoZSBhcmd1bWVudC4gIEl0IGNvdWxkIHN0aWxsIGJlIGFueXRoaW5nLgorICAgICUgQSBgYGxvd2VyY2FzZSBsZXR0ZXInJyBpcyBvbmUgd2hvc2UgXGxjY29kZSBpcyBub256ZXJvLgorICAgICUgQW4gYGB1cHBlcmNhc2UgbGV0dGVyJycgaXMgb25lIHdob3NlIFxsY2NvZGUgaXMgYm90aCBub256ZXJvLCBhbmQKKyAgICAlICAgbm90IGVxdWFsIHRvIGl0c2VsZi4KKyAgICAlIE90aGVyd2lzZSwgd2UgYXNzdW1lIGl0J3MgYSBudW1iZXIuCisgICAgJQorICAgICUgV2UgbmVlZCB0aGUgXHJlbGF4IGF0IHRoZSBlbmQgb2YgdGhlIFxpZm51bSBsaW5lcyB0byBzdG9wIFRlWCBmcm9tCisgICAgJSBjb250aW51aW5nIHRvIGxvb2sgZm9yIGEgPG51bWJlcj4uCisgICAgJQorICAgIFxpZm51bVxsY2NvZGVcZXhwYW5kYWZ0ZXJgXHRoZWFyZz0wXHJlbGF4CisgICAgICBcbnVtZXJpY2VudW1lcmF0ZSAlIGEgbnVtYmVyICh3ZSBob3BlKQorICAgIFxlbHNlCisgICAgICAlIEl0J3MgYSBsZXR0ZXIuCisgICAgICBcaWZudW1cbGNjb2RlXGV4cGFuZGFmdGVyYFx0aGVhcmc9XGV4cGFuZGFmdGVyYFx0aGVhcmdccmVsYXgKKyAgICAgICAgXGxvd2VyY2FzZWVudW1lcmF0ZSAlIGxvd2VyY2FzZSBsZXR0ZXIKKyAgICAgIFxlbHNlCisgICAgICAgIFx1cHBlcmNhc2VlbnVtZXJhdGUgJSB1cHBlcmNhc2UgbGV0dGVyCisgICAgICBcZmkKKyAgICBcZmkKKyAgXGVsc2UKKyAgICAlIE11bHRpcGxlIHRva2VucyBpbiB0aGUgYXJndW1lbnQuICBXZSBob3BlIGl0J3MgYSBudW1iZXIuCisgICAgXG51bWVyaWNlbnVtZXJhdGUKKyAgXGZpCit9CisKKyUgQW4gQGVudW1lcmF0ZSB3aG9zZSBsYWJlbHMgYXJlIGludGVnZXJzLiAgVGhlIHN0YXJ0aW5nIGludGVnZXIgaXMKKyUgZ2l2ZW4gaW4gXHRoZWFyZy4KKyUKK1xkZWZcbnVtZXJpY2VudW1lcmF0ZXslCisgIFxpdGVtbm8gPSBcdGhlYXJnCisgIFxzdGFydGVudW1lcmF0aW9ue1x0aGVcaXRlbW5vfSUKK30KKworJSBUaGUgc3RhcnRpbmcgKGxvd2VyY2FzZSkgbGV0dGVyIGlzIGluIFx0aGVhcmcuCitcZGVmXGxvd2VyY2FzZWVudW1lcmF0ZXslCisgIFxpdGVtbm8gPSBcZXhwYW5kYWZ0ZXJgXHRoZWFyZworICBcc3RhcnRlbnVtZXJhdGlvbnslCisgICAgJSBCZSBzdXJlIHdlJ3JlIG5vdCBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgYWxwaGFiZXQuCisgICAgXGlmbnVtXGl0ZW1ubz0wCisgICAgICBcZXJybWVzc2FnZXtObyBtb3JlIGxvd2VyY2FzZSBsZXR0ZXJzIGluIEBlbnVtZXJhdGU7IGdldCBhIGJpZ2dlcgorICAgICAgICAgICAgICAgICAgYWxwaGFiZXR9JQorICAgIFxmaQorICAgIFxjaGFyXGxjY29kZVxpdGVtbm8KKyAgfSUKK30KKworJSBUaGUgc3RhcnRpbmcgKHVwcGVyY2FzZSkgbGV0dGVyIGlzIGluIFx0aGVhcmcuCitcZGVmXHVwcGVyY2FzZWVudW1lcmF0ZXslCisgIFxpdGVtbm8gPSBcZXhwYW5kYWZ0ZXJgXHRoZWFyZworICBcc3RhcnRlbnVtZXJhdGlvbnslCisgICAgJSBCZSBzdXJlIHdlJ3JlIG5vdCBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgYWxwaGFiZXQuCisgICAgXGlmbnVtXGl0ZW1ubz0wCisgICAgICBcZXJybWVzc2FnZXtObyBtb3JlIHVwcGVyY2FzZSBsZXR0ZXJzIGluIEBlbnVtZXJhdGU7IGdldCBhIGJpZ2dlcgorICAgICAgICAgICAgICAgICAgYWxwaGFiZXR9CisgICAgXGZpCisgICAgXGNoYXJcdWNjb2RlXGl0ZW1ubworICB9JQorfQorCislIENhbGwgXGRvaXRlbWl6ZSwgYWRkaW5nIGEgcGVyaW9kIHRvIHRoZSBmaXJzdCBhcmd1bWVudCBhbmQgc3VwcGx5aW5nIHRoZQorJSBjb21tb24gbGFzdCB0d28gYXJndW1lbnRzLiAgQWxzbyBzdWJ0cmFjdCBvbmUgZnJvbSB0aGUgaW5pdGlhbCB2YWx1ZSBpbgorJSBcaXRlbW5vLCBzaW5jZSBAaXRlbSBpbmNyZW1lbnRzIFxpdGVtbm8uCislCitcZGVmXHN0YXJ0ZW51bWVyYXRpb24jMXslCisgIFxhZHZhbmNlXGl0ZW1ubyBieSAtMQorICBcZG9pdGVtaXpleyMxLn1cZmx1c2hjcgorfQorCislIEBhbHBoYWVudW1lcmF0ZSBhbmQgQGNhcHNlbnVtZXJhdGUgYXJlIGFiYnJldmlhdGlvbnMgZm9yIGdpdmluZyBhbiBhcmcKKyUgdG8gQGVudW1lcmF0ZS4KKyUKK1xkZWZcYWxwaGFlbnVtZXJhdGV7XGVudW1lcmF0ZXthfX0KK1xkZWZcY2Fwc2VudW1lcmF0ZXtcZW51bWVyYXRle0F9fQorXGRlZlxFYWxwaGFlbnVtZXJhdGV7XEVlbnVtZXJhdGV9CitcZGVmXEVjYXBzZW51bWVyYXRle1xFZW51bWVyYXRlfQorCisKKyUgQG11bHRpdGFibGUgbWFjcm9zCislIEFteSBIZW5kcmlja3NvbiwgOC8xOC85NCwgMy82Lzk2CislCislIEBtdWx0aXRhYmxlIC4uLiBAZW5kIG11bHRpdGFibGUgd2lsbCBtYWtlIGFzIG1hbnkgY29sdW1ucyBhcyBkZXNpcmVkLgorJSBDb250ZW50cyBvZiBlYWNoIGNvbHVtbiB3aWxsIHdyYXAgYXQgd2lkdGggZ2l2ZW4gaW4gcHJlYW1ibGUuICBXaWR0aAorJSBjYW4gYmUgc3BlY2lmaWVkIGVpdGhlciB3aXRoIHNhbXBsZSB0ZXh0IGdpdmVuIGluIGEgdGVtcGxhdGUgbGluZSwKKyUgb3IgaW4gcGVyY2VudCBvZiBcaHNpemUsIHRoZSBjdXJyZW50IHdpZHRoIG9mIHRleHQgb24gcGFnZS4KKworJSBUYWJsZSBjYW4gY29udGludWUgb3ZlciBwYWdlcyBidXQgd2lsbCBvbmx5IGJyZWFrIGJldHdlZW4gbGluZXMuCisKKyUgVG8gbWFrZSBwcmVhbWJsZToKKyUKKyUgRWl0aGVyIGRlZmluZSB3aWR0aHMgb2YgY29sdW1ucyBpbiB0ZXJtcyBvZiBwZXJjZW50IG9mIFxoc2l6ZToKKyUgICBAbXVsdGl0YWJsZSBAY29sdW1uZnJhY3Rpb25zIC4yNSAuMyAuNDUKKyUgICBAaXRlbSAuLi4KKyUKKyUgICBOdW1iZXJzIGZvbGxvd2luZyBAY29sdW1uZnJhY3Rpb25zIGFyZSB0aGUgcGVyY2VudCBvZiB0aGUgdG90YWwKKyUgICBjdXJyZW50IGhzaXplIHRvIGJlIHVzZWQgZm9yIGVhY2ggY29sdW1uLiBZb3UgbWF5IHVzZSBhcyBtYW55CislICAgY29sdW1ucyBhcyBkZXNpcmVkLgorCisKKyUgT3IgdXNlIGEgdGVtcGxhdGU6CislICAgQG11bHRpdGFibGUge0NvbHVtbiAxIHRlbXBsYXRlfSB7Q29sdW1uIDIgdGVtcGxhdGV9IHtDb2x1bW4gMyB0ZW1wbGF0ZX0KKyUgICBAaXRlbSAuLi4KKyUgICB1c2luZyB0aGUgd2lkZXN0IHRlcm0gZGVzaXJlZCBpbiBlYWNoIGNvbHVtbi4KKworJSBFYWNoIG5ldyB0YWJsZSBsaW5lIHN0YXJ0cyB3aXRoIEBpdGVtLCBlYWNoIHN1YnNlcXVlbnQgbmV3IGNvbHVtbgorJSBzdGFydHMgd2l0aCBAdGFiLiBFbXB0eSBjb2x1bW5zIG1heSBiZSBwcm9kdWNlZCBieSBzdXBwbHlpbmcgQHRhYidzCislIHdpdGggbm90aGluZyBiZXR3ZWVuIHRoZW0gZm9yIGFzIG1hbnkgdGltZXMgYXMgZW1wdHkgY29sdW1ucyBhcmUgbmVlZGVkLAorJSBpZSwgQHRhYkB0YWJAdGFiIHdpbGwgcHJvZHVjZSB0d28gZW1wdHkgY29sdW1ucy4KKworJSBAaXRlbSwgQHRhYiBkbyBub3QgbmVlZCB0byBiZSBvbiB0aGVpciBvd24gbGluZXMsIGJ1dCBpdCB3aWxsIG5vdCBodXJ0CislIGlmIHRoZXkgYXJlLgorCislIFNhbXBsZSBtdWx0aXRhYmxlOgorCislICAgQG11bHRpdGFibGUge0NvbHVtbiAxIHRlbXBsYXRlfSB7Q29sdW1uIDIgdGVtcGxhdGV9IHtDb2x1bW4gMyB0ZW1wbGF0ZX0KKyUgICBAaXRlbSBmaXJzdCBjb2wgc3R1ZmYgQHRhYiBzZWNvbmQgY29sIHN0dWZmIEB0YWIgdGhpcmQgY29sCislICAgQGl0ZW0KKyUgICBmaXJzdCBjb2wgc3R1ZmYKKyUgICBAdGFiCislICAgc2Vjb25kIGNvbCBzdHVmZgorJSAgIEB0YWIKKyUgICB0aGlyZCBjb2wKKyUgICBAaXRlbSBmaXJzdCBjb2wgc3R1ZmYgQHRhYiBzZWNvbmQgY29sIHN0dWZmCislICAgQHRhYiBNYW55IHBhcmFncmFwaHMgb2YgdGV4dCBtYXkgYmUgdXNlZCBpbiBhbnkgY29sdW1uLgorJQorJSAgICAgICAgIFRoZXkgd2lsbCB3cmFwIGF0IHRoZSB3aWR0aCBkZXRlcm1pbmVkIGJ5IHRoZSB0ZW1wbGF0ZS4KKyUgICBAaXRlbUB0YWJAdGFiIFRoaXMgd2lsbCBiZSBpbiB0aGlyZCBjb2x1bW4uCislICAgQGVuZCBtdWx0aXRhYmxlCisKKyUgRGVmYXVsdCBkaW1lbnNpb25zIG1heSBiZSByZXNldCBieSB1c2VyLgorJSBAbXVsdGl0YWJsZXBhcnNraXAgaXMgdmVydGljYWwgc3BhY2UgYmV0d2VlbiBwYXJhZ3JhcGhzIGluIHRhYmxlLgorJSBAbXVsdGl0YWJsZXBhcmluZGVudCBpcyBwYXJhZ3JhcGggaW5kZW50IGluIHRhYmxlLgorJSBAbXVsdGl0YWJsZWNvbG1hcmdpbiBpcyBob3Jpem9udGFsIHNwYWNlIHRvIGJlIGxlZnQgYmV0d2VlbiBjb2x1bW5zLgorJSBAbXVsdGl0YWJsZWxpbmVzcGFjZSBpcyBzcGFjZSB0byBsZWF2ZSBiZXR3ZWVuIHRhYmxlIGl0ZW1zLCBiYXNlbGluZQorJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJhc2VsaW5lLgorJSAgIDBwdCBtZWFucyBpdCBkZXBlbmRzIG9uIGN1cnJlbnQgbm9ybWFsIGxpbmUgc3BhY2luZy4KKyUKK1xuZXdza2lwXG11bHRpdGFibGVwYXJza2lwCitcbmV3c2tpcFxtdWx0aXRhYmxlcGFyaW5kZW50CitcbmV3ZGltZW5cbXVsdGl0YWJsZWNvbHNwYWNlCitcbmV3c2tpcFxtdWx0aXRhYmxlbGluZXNwYWNlCitcbXVsdGl0YWJsZXBhcnNraXA9MHB0CitcbXVsdGl0YWJsZXBhcmluZGVudD02cHQKK1xtdWx0aXRhYmxlY29sc3BhY2U9MTJwdAorXG11bHRpdGFibGVsaW5lc3BhY2U9MHB0CisKKyUgTWFjcm9zIHVzZWQgdG8gc2V0IHVwIGhhbGlnbiBwcmVhbWJsZToKKyUKK1xsZXRcZW5kc2V0dXB0YWJsZVxyZWxheAorXGRlZlx4ZW5kc2V0dXB0YWJsZXtcZW5kc2V0dXB0YWJsZX0KK1xsZXRcY29sdW1uZnJhY3Rpb25zXHJlbGF4CitcZGVmXHhjb2x1bW5mcmFjdGlvbnN7XGNvbHVtbmZyYWN0aW9uc30KK1xuZXdpZlxpZnNldHBlcmNlbnQKKworJSAjMSBpcyB0aGUgQGNvbHVtbmZyYWN0aW9uLCB1c3VhbGx5IGEgZGVjaW1hbCBudW1iZXIgbGlrZSAuNSwgYnV0IG1pZ2h0CislIGJlIGp1c3QgMS4gIFdlIGp1c3QgdXNlIGl0LCB3aGF0ZXZlciBpdCBpcy4KKyUKK1xkZWZccGlja3Vwd2hvbGVmcmFjdGlvbiMxIHslCisgIFxnbG9iYWxcYWR2YW5jZVxjb2xjb3VudCBieSAxCisgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZSBjb2xcdGhlXGNvbGNvdW50XGVuZGNzbmFtZXsjMVxoc2l6ZX0lCisgIFxzZXR1cHRhYmxlCit9CisKK1xuZXdjb3VudFxjb2xjb3VudAorXGRlZlxzZXR1cHRhYmxlIzF7JQorICBcZGVmXGZpcnN0YXJneyMxfSUKKyAgXGlmeFxmaXJzdGFyZ1x4ZW5kc2V0dXB0YWJsZQorICAgIFxsZXRcZ28gPSBccmVsYXgKKyAgXGVsc2UKKyAgICBcaWZ4XGZpcnN0YXJnXHhjb2x1bW5mcmFjdGlvbnMKKyAgICAgIFxnbG9iYWxcc2V0cGVyY2VudHRydWUKKyAgICBcZWxzZQorICAgICAgXGlmc2V0cGVyY2VudAorICAgICAgICAgXGxldFxnb1xwaWNrdXB3aG9sZWZyYWN0aW9uCisgICAgICBcZWxzZQorICAgICAgICAgXGdsb2JhbFxhZHZhbmNlXGNvbGNvdW50IGJ5IDEKKyAgICAgICAgIFxzZXRib3gwPVxoYm94eyMxXHVuc2tpcFxzcGFjZX0lIEFkZCBhIG5vcm1hbCB3b3JkIHNwYWNlIGFzIGEKKyAgICAgICAgICAgICAgICAgICAlIHNlcGFyYXRvcjsgdHlwaWNhbGx5IHRoYXQgaXMgYWx3YXlzIGluIHRoZSBpbnB1dCwgYW55d2F5LgorICAgICAgICAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lIGNvbFx0aGVcY29sY291bnRcZW5kY3NuYW1le1x0aGVcd2QwfSUKKyAgICAgIFxmaQorICAgIFxmaQorICAgIFxpZnhcZ29ccGlja3Vwd2hvbGVmcmFjdGlvbgorICAgICAgJSBQdXQgdGhlIGFyZ3VtZW50IGJhY2sgZm9yIHRoZSBccGlja3Vwd2hvbGVmcmFjdGlvbiBjYWxsLCBzbworICAgICAgJSB3ZSdsbCBhbHdheXMgaGF2ZSBhIHBlcmlvZCB0aGVyZSB0byBiZSBwYXJzZWQuCisgICAgICBcZGVmXGdve1xwaWNrdXB3aG9sZWZyYWN0aW9uIzF9JQorICAgIFxlbHNlCisgICAgICBcbGV0XGdvID0gXHNldHVwdGFibGUKKyAgICBcZmklCisgIFxmaQorICBcZ28KK30KKworJSBtdWx0aXRhYmxlLW9ubHkgY29tbWFuZHMuCislCislIEBoZWFkaXRlbSBzdGFydHMgYSBoZWFkaW5nIHJvdywgd2hpY2ggd2UgdHlwZXNldCBpbiBib2xkLgorJSBBc3NpZ25tZW50cyBoYXZlIHRvIGJlIGdsb2JhbCBzaW5jZSB3ZSBhcmUgaW5zaWRlIHRoZSBpbXBsaWNpdCBncm91cAorJSBvZiBhbiBhbGlnbm1lbnQgZW50cnkuICBOb3RlIHRoYXQgXGV2ZXJ5Y3IgcmVzZXRzIFxldmVyeXRhYi4KK1xkZWZcaGVhZGl0ZW17XGNoZWNrZW52XG11bHRpdGFibGUgXGNyY3IgXGdsb2JhbFxldmVyeXRhYj17XGJmfVx0aGVcZXZlcnl0YWJ9JQorJQorJSBBIFx0YWIgdXNlZCB0byBpbmNsdWRlIFxoc2tpcDFzcC4gIEJ1dCB0aGVuIHRoZSBzcGFjZSBpbiBhIHRlbXBsYXRlCislIGxpbmUgaXMgbm90IGVub3VnaC4gIFRoYXQgaXMgYmFkLiAgU28gbGV0J3MgZ28gYmFjayB0byBqdXN0IGAmJyB1bnRpbAorJSB3ZSBlbmNvdW50ZXIgdGhlIHByb2JsZW0gaXQgd2FzIGludGVuZGVkIHRvIHNvbHZlIGFnYWluLgorJQkJCQkJLS1rYXJsLCBuYXRoYW5AYWNtLm9yZywgMjBhcHI5OS4KK1xkZWZcdGFie1xjaGVja2VudlxtdWx0aXRhYmxlICZcdGhlXGV2ZXJ5dGFifSUKKworJSBAbXVsdGl0YWJsZSAuLi4gQGVuZCBtdWx0aXRhYmxlIGRlZmluaXRpb25zOgorJQorXG5ld3Rva3NcZXZlcnl0YWIgICUgaW5zZXJ0IGFmdGVyIGV2ZXJ5IHRhYi4KKyUKK1xlbnZkZWZcbXVsdGl0YWJsZXslCisgIFx2c2tpcFxwYXJza2lwCisgIFxzdGFydHNhdmluZ2luc2VydHMKKyAgJQorICAlIEBpdGVtIHdpdGhpbiBhIG11bHRpdGFibGUgc3RhcnRzIGEgbm9ybWFsIHJvdy4KKyAgJSBXZSB1c2UgXGRlZiBpbnN0ZWFkIG9mIFxsZXQgc28gdGhhdCBpZiBvbmUgb2YgdGhlIG11bHRpdGFibGUgZW50cmllcworICAlIGNvbnRhaW5zIGFuIEBpdGVtaXplLCB3ZSBkb24ndCBjaG9rZSBvbiB0aGUgXGl0ZW0gKHNlZW4gYXMgXGNyY3IgYWthCisgICUgXGVuZHRlbXBsYXRlKSBleHBhbmRpbmcgXGRvaXRlbWl6ZS4KKyAgXGRlZlxpdGVte1xjcmNyfSUKKyAgJQorICBcdG9sZXJhbmNlPTk1MDAKKyAgXGhiYWRuZXNzPTk1MDAKKyAgXHNldG11bHRpdGFibGVzcGFjaW5nCisgIFxwYXJza2lwPVxtdWx0aXRhYmxlcGFyc2tpcAorICBccGFyaW5kZW50PVxtdWx0aXRhYmxlcGFyaW5kZW50CisgIFxvdmVyZnVsbHJ1bGU9MHB0CisgIFxnbG9iYWxcY29sY291bnQ9MAorICAlCisgIFxldmVyeWNyID0geyUKKyAgICBcbm9hbGlnbnslCisgICAgICBcZ2xvYmFsXGV2ZXJ5dGFiPXt9JQorICAgICAgXGdsb2JhbFxjb2xjb3VudD0wICUgUmVzZXQgdGhlIGNvbHVtbiBjb3VudGVyLgorICAgICAgJSBDaGVjayBmb3Igc2F2ZWQgZm9vdG5vdGVzLCBldGMuCisgICAgICBcY2hlY2tpbnNlcnRzCisgICAgICAlIEtlZXBzIHVuZGVyZnVsbCBib3ggbWVzc2FnZXMgb2ZmIHdoZW4gdGFibGUgYnJlYWtzIG92ZXIgcGFnZXMuCisgICAgICAlXGZpbGJyZWFrCisJJSBNYXliZSBzbywgYnV0IGl0IGFsc28gY3JlYXRlcyByZWFsbHkgd2VpcmQgcGFnZSBicmVha3Mgd2hlbiB0aGUKKwklIHRhYmxlIGJyZWFrcyBvdmVyIHBhZ2VzLiBXb3VsZG4ndCBcdmZpbCBiZSBiZXR0ZXI/ICBXYWl0IHVudGlsIHRoZQorCSUgcHJvYmxlbSBtYW5pZmVzdHMgaXRzZWxmLCBzbyBpdCBjYW4gYmUgZml4ZWQgZm9yIHJlYWwgLS1rYXJsLgorICAgIH0lCisgIH0lCisgICUKKyAgXHBhcnNlYXJnXGRvbXVsdGl0YWJsZQorfQorXGRlZlxkb211bHRpdGFibGUjMXslCisgICUgVG8gcGFyc2UgZXZlcnl0aGluZyBiZXR3ZWVuIEBtdWx0aXRhYmxlIGFuZCBAaXRlbToKKyAgXHNldHVwdGFibGUjMSBcZW5kc2V0dXB0YWJsZQorICAlCisgICUgVGhpcyBwcmVhbWJsZSBzZXRzIHVwIGEgZ2VuZXJpYyBjb2x1bW4gZGVmaW5pdGlvbiwgd2hpY2ggd2lsbAorICAlIGJlIHVzZWQgYXMgbWFueSB0aW1lcyBhcyB1c2VyIGNhbGxzIGZvciBjb2x1bW5zLgorICAlIFx2dG9wIHdpbGwgc2V0IGEgc2luZ2xlIGxpbmUgYW5kIHdpbGwgYWxzbyBsZXQgdGV4dCB3cmFwIGFuZAorICAlIGNvbnRpbnVlIGZvciBtYW55IHBhcmFncmFwaHMgaWYgZGVzaXJlZC4KKyAgXGhhbGlnblxiZ3JvdXAgJiUKKyAgICBcZ2xvYmFsXGFkdmFuY2VcY29sY291bnQgYnkgMQorICAgIFxtdWx0aXN0cnV0CisgICAgXHZ0b3B7JQorICAgICAgJSBVc2UgdGhlIGN1cnJlbnQgXGNvbGNvdW50IHRvIGZpbmQgdGhlIGNvcnJlY3QgY29sdW1uIHdpZHRoOgorICAgICAgXGhzaXplPVxleHBhbmRhZnRlclxjc25hbWUgY29sXHRoZVxjb2xjb3VudFxlbmRjc25hbWUKKyAgICAgICUKKyAgICAgICUgSW4gb3JkZXIgdG8ga2VlcCBlbnRyaWVzIGZyb20gYnVtcGluZyBpbnRvIGVhY2ggb3RoZXIKKyAgICAgICUgd2Ugd2lsbCBhZGQgYSBcbGVmdHNraXAgb2YgXG11bHRpdGFibGVjb2xzcGFjZSB0byBhbGwgY29sdW1ucyBhZnRlcgorICAgICAgJSB0aGUgZmlyc3Qgb25lLgorICAgICAgJQorICAgICAgJSBJZiBhIHRlbXBsYXRlIGhhcyBiZWVuIHVzZWQsIHdlIHdpbGwgYWRkIFxtdWx0aXRhYmxlY29sc3BhY2UKKyAgICAgICUgdG8gdGhlIHdpZHRoIG9mIGVhY2ggdGVtcGxhdGUgZW50cnkuCisgICAgICAlCisgICAgICAlIElmIHRoZSB1c2VyIGhhcyBzZXQgcHJlYW1ibGUgaW4gdGVybXMgb2YgcGVyY2VudCBvZiBcaHNpemUgd2Ugd2lsbAorICAgICAgJSB1c2UgdGhhdCBkaW1lbnNpb24gYXMgdGhlIHdpZHRoIG9mIHRoZSBjb2x1bW4sIGFuZCB0aGUgXGxlZnRza2lwCisgICAgICAlIHdpbGwga2VlcCBlbnRyaWVzIGZyb20gYnVtcGluZyBpbnRvIGVhY2ggb3RoZXIuICBUYWJsZSB3aWxsIHN0YXJ0IGF0CisgICAgICAlIGxlZnQgbWFyZ2luIGFuZCBmaW5hbCBjb2x1bW4gd2lsbCBqdXN0aWZ5IGF0IHJpZ2h0IG1hcmdpbi4KKyAgICAgICUKKyAgICAgICUgTWFrZSBzdXJlIHdlIGRvbid0IGluaGVyaXQgXHJpZ2h0c2tpcCBmcm9tIHRoZSBvdXRlciBlbnZpcm9ubWVudC4KKyAgICAgIFxyaWdodHNraXA9MHB0CisgICAgICBcaWZudW1cY29sY291bnQ9MQorCSUgVGhlIGZpcnN0IGNvbHVtbiB3aWxsIGJlIGluZGVudGVkIHdpdGggdGhlIHN1cnJvdW5kaW5nIHRleHQuCisJXGFkdmFuY2VcaHNpemUgYnlcbGVmdHNraXAKKyAgICAgIFxlbHNlCisJXGlmc2V0cGVyY2VudCBcZWxzZQorCSAgJSBJZiB1c2VyIGhhcyBub3Qgc2V0IHByZWFtYmxlIGluIHRlcm1zIG9mIHBlcmNlbnQgb2YgXGhzaXplCisJICAlIHdlIHdpbGwgYWR2YW5jZSBcaHNpemUgYnkgXG11bHRpdGFibGVjb2xzcGFjZS4KKwkgIFxhZHZhbmNlXGhzaXplIGJ5IFxtdWx0aXRhYmxlY29sc3BhY2UKKwlcZmkKKyAgICAgICAlIEluIGVpdGhlciBjYXNlIHdlIHdpbGwgbWFrZSBcbGVmdHNraXA9XG11bHRpdGFibGVjb2xzcGFjZToKKyAgICAgIFxsZWZ0c2tpcD1cbXVsdGl0YWJsZWNvbHNwYWNlCisgICAgICBcZmkKKyAgICAgICUgSWdub3Jpbmcgc3BhY2UgYXQgdGhlIGJlZ2lubmluZyBhbmQgZW5kIGF2b2lkcyBhbiBvY2Nhc2lvbmFsIHNwdXJpb3VzCisgICAgICAlIGJsYW5rIGxpbmUsIHdoZW4gVGVYIGRlY2lkZXMgdG8gYnJlYWsgdGhlIGxpbmUgYXQgdGhlIHNwYWNlIGJlZm9yZSB0aGUKKyAgICAgICUgYm94IGZyb20gdGhlIG11bHRpc3RydXQsIHNvIHRoZSBzdHJ1dCBlbmRzIHVwIG9uIGEgbGluZSBieSBpdHNlbGYuCisgICAgICAlIEZvciBleGFtcGxlOgorICAgICAgJSBAbXVsdGl0YWJsZSBAY29sdW1uZnJhY3Rpb25zIC4xMSAuODkKKyAgICAgICUgQGl0ZW0gQGNvZGV7I30KKyAgICAgICUgQHRhYiBMZWdhbCBob2xpZGF5IHdoaWNoIGlzIHZhbGlkIGluIG1ham9yIHBhcnRzIG9mIHRoZSB3aG9sZSBjb3VudHJ5LgorICAgICAgJSBJcyBhdXRvbWF0aWNhbGx5IHByb3ZpZGVkIHdpdGggaGlnaGxpZ2h0aW5nIHNlcXVlbmNlcyByZXNwZWN0aXZlbHkKKyAgICAgICUgbWFya2luZyBjaGFyYWN0ZXJzLgorICAgICAgXG5vaW5kZW50XGlnbm9yZXNwYWNlcyMjXHVuc2tpcFxtdWx0aXN0cnV0CisgICAgfVxjcgorfQorXGRlZlxFbXVsdGl0YWJsZXslCisgIFxjcmNyCisgIFxlZ3JvdXAgJSBlbmQgdGhlIFxoYWxpZ24KKyAgXGdsb2JhbFxzZXRwZXJjZW50ZmFsc2UKK30KKworXGRlZlxzZXRtdWx0aXRhYmxlc3BhY2luZ3slCisgIFxkZWZcbXVsdGlzdHJ1dHtcc3RydXR9JSBqdXN0IHVzZSB0aGUgc3RhbmRhcmQgbGluZSBzcGFjaW5nCisgICUKKyAgJSBDb21wdXRlIFxtdWx0aXRhYmxlbGluZXNwYWNlIChpZiBub3QgZGVmaW5lZCBieSB1c2VyKSBmb3IgdXNlIGluCisgICUgXG11bHRpdGFibGVwYXJza2lwIGNhbGN1bGF0aW9uLiAgV2UgdXNlZCBkZWZpbmUgXG11bHRpc3RydXQgYmFzZWQgb24KKyAgJSB0aGlzLCBidXQgKGlyb25pY2FsbHkpIHRoYXQgY2F1c2VkIHRoZSBzcGFjaW5nIHRvIGJlIG9mZi4KKyAgJSBTZWUgYnVnLXRleGluZm8gcmVwb3J0IGZyb20gV2VybmVyIExlbWJlcmcsIDMxIE9jdCAyMDA0IDEyOjUyOjIwICswMTAwLgorXGlmZGltXG11bHRpdGFibGVsaW5lc3BhY2U9MHB0Citcc2V0Ym94MD1cdmJveHtYfVxnbG9iYWxcbXVsdGl0YWJsZWxpbmVzcGFjZT1cdGhlXGJhc2VsaW5lc2tpcAorXGdsb2JhbFxhZHZhbmNlXG11bHRpdGFibGVsaW5lc3BhY2UgYnktXGh0MAorXGZpCislJSBUZXN0IHRvIHNlZSBpZiBwYXJza2lwIGlzIGxhcmdlciB0aGFuIHNwYWNlIGJldHdlZW4gbGluZXMgb2YKKyUlIHRhYmxlLiBJZiBub3QsIGRvIG5vdGhpbmcuCislJSAgICAgICAgSWYgc28sIHNldCB0byBzYW1lIGRpbWVuc2lvbiBhcyBtdWx0aXRhYmxlbGluZXNwYWNlLgorXGlmZGltXG11bHRpdGFibGVwYXJza2lwPlxtdWx0aXRhYmxlbGluZXNwYWNlCitcZ2xvYmFsXG11bHRpdGFibGVwYXJza2lwPVxtdWx0aXRhYmxlbGluZXNwYWNlCitcZ2xvYmFsXGFkdmFuY2VcbXVsdGl0YWJsZXBhcnNraXAtN3B0ICUlIHRvIGtlZXAgcGFyc2tpcCBzb21ld2hhdCBzbWFsbGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUlIHRoYW4gc2tpcCBiZXR3ZWVuIGxpbmVzIGluIHRoZSB0YWJsZS4KK1xmaSUKK1xpZmRpbVxtdWx0aXRhYmxlcGFyc2tpcD0wcHQKK1xnbG9iYWxcbXVsdGl0YWJsZXBhcnNraXA9XG11bHRpdGFibGVsaW5lc3BhY2UKK1xnbG9iYWxcYWR2YW5jZVxtdWx0aXRhYmxlcGFyc2tpcC03cHQgJSUgdG8ga2VlcCBwYXJza2lwIHNvbWV3aGF0IHNtYWxsZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSUgdGhhbiBza2lwIGJldHdlZW4gbGluZXMgaW4gdGhlIHRhYmxlLgorXGZpfQorCisKK1xtZXNzYWdle2NvbmRpdGlvbmFscyx9CisKKyUgQGlmdGV4LCBAaWZub3Rkb2Nib29rLCBAaWZub3RodG1sLCBAaWZub3RpbmZvLCBAaWZub3RwbGFpbnRleHQsCislIEBpZm5vdHhtbCBhbHdheXMgc3VjY2VlZC4gIFRoZXkgY3VycmVudGx5IGRvIG5vdGhpbmc7IHdlIGRvbid0CislIGF0dGVtcHQgdG8gY2hlY2sgd2hldGhlciB0aGUgY29uZGl0aW9uYWxzIGFyZSBwcm9wZXJseSBuZXN0ZWQuICBCdXQgd2UKKyUgaGF2ZSB0byByZW1lbWJlciB0aGF0IHRoZXkgYXJlIGNvbmRpdGlvbmFscywgc28gdGhhdCBAZW5kIGRvZXNuJ3QKKyUgYXR0ZW1wdCB0byBjbG9zZSBhbiBlbnZpcm9ubWVudCBncm91cC4KKyUKK1xkZWZcbWFrZWNvbmQjMXslCisgIFxleHBhbmRhZnRlclxsZXRcY3NuYW1lICMxXGVuZGNzbmFtZSA9IFxyZWxheAorICBcZXhwYW5kYWZ0ZXJcbGV0XGNzbmFtZSBpc2NvbmQuIzFcZW5kY3NuYW1lID0gMQorfQorXG1ha2Vjb25ke2lmdGV4fQorXG1ha2Vjb25ke2lmbm90ZG9jYm9va30KK1xtYWtlY29uZHtpZm5vdGh0bWx9CitcbWFrZWNvbmR7aWZub3RpbmZvfQorXG1ha2Vjb25ke2lmbm90cGxhaW50ZXh0fQorXG1ha2Vjb25ke2lmbm90eG1sfQorCislIElnbm9yZSBAaWdub3JlLCBAaWZodG1sLCBAaWZpbmZvLCBhbmQgdGhlIGxpa2UuCislCitcZGVmXGRpcmVudHJ5e1xkb2lnbm9yZXtkaXJlbnRyeX19CitcZGVmXGRvY3VtZW50ZGVzY3JpcHRpb257XGRvaWdub3Jle2RvY3VtZW50ZGVzY3JpcHRpb259fQorXGRlZlxkb2Nib29re1xkb2lnbm9yZXtkb2Nib29rfX0KK1xkZWZcaHRtbHtcZG9pZ25vcmV7aHRtbH19CitcZGVmXGlmZG9jYm9va3tcZG9pZ25vcmV7aWZkb2Nib29rfX0KK1xkZWZcaWZodG1se1xkb2lnbm9yZXtpZmh0bWx9fQorXGRlZlxpZmluZm97XGRvaWdub3Jle2lmaW5mb319CitcZGVmXGlmbm90dGV4e1xkb2lnbm9yZXtpZm5vdHRleH19CitcZGVmXGlmcGxhaW50ZXh0e1xkb2lnbm9yZXtpZnBsYWludGV4dH19CitcZGVmXGlmeG1se1xkb2lnbm9yZXtpZnhtbH19CitcZGVmXGlnbm9yZXtcZG9pZ25vcmV7aWdub3JlfX0KK1xkZWZcbWVudXtcZG9pZ25vcmV7bWVudX19CitcZGVmXHhtbHtcZG9pZ25vcmV7eG1sfX0KKworJSBJZ25vcmUgdGV4dCB1bnRpbCBhIGxpbmUgYEBlbmQgIzEnLCBrZWVwaW5nIHRyYWNrIG9mIG5lc3RlZCBjb25kaXRpb25hbHMuCislCislIEEgY291bnQgdG8gcmVtZW1iZXIgdGhlIGRlcHRoIG9mIG5lc3RpbmcuCitcbmV3Y291bnRcZG9pZ25vcmVjb3VudAorCitcZGVmXGRvaWdub3JlIzF7XGJlZ2luZ3JvdXAKKyAgJSBTY2FuIGluIGBgdmVyYmF0aW0nJyBtb2RlOgorICBcb2JleWxpbmVzCisgIFxjYXRjb2RlYFxAID0gXG90aGVyCisgIFxjYXRjb2RlYFx7ID0gXG90aGVyCisgIFxjYXRjb2RlYFx9ID0gXG90aGVyCisgICUKKyAgJSBNYWtlIHN1cmUgdGhhdCBzcGFjZXMgdHVybiBpbnRvIHRva2VucyB0aGF0IG1hdGNoIHdoYXQgXGRvaWdub3JldGV4dCB3YW50cy4KKyAgXHNwYWNlaXNzcGFjZQorICAlCisgICUgQ291bnQgbnVtYmVyIG9mICMxJ3MgdGhhdCB3ZSd2ZSBzZWVuLgorICBcZG9pZ25vcmVjb3VudCA9IDAKKyAgJQorICAlIFN3YWxsb3cgdGV4dCB1bnRpbCB3ZSByZWFjaCB0aGUgbWF0Y2hpbmcgYEBlbmQgIzEnLgorICBcZG9kb2lnbm9yZXsjMX0lCit9CisKK3sgXGNhdGNvZGVgXz0xMSAlIFdlIHdhbnQgdG8gdXNlIFxfU1RPUF8gd2hpY2ggY2Fubm90IGFwcGVhciBpbiB0ZXhpbmZvIHNvdXJjZS4KKyAgXG9iZXlsaW5lcyAlCisgICUKKyAgXGdkZWZcZG9kb2lnbm9yZSMxeyUKKyAgICAlICMxIGNvbnRhaW5zIHRoZSBjb21tYW5kIG5hbWUgYXMgYSBzdHJpbmcsIGUuZy4sIGBpZmluZm8nLgorICAgICUKKyAgICAlIERlZmluZSBhIGNvbW1hbmQgdG8gZmluZCB0aGUgbmV4dCBgQGVuZCAjMScuCisgICAgXGxvbmdcZGVmXGRvaWdub3JldGV4dCMjMV5eTUBlbmQgIzF7JQorICAgICAgXGRvaWdub3JldGV4dHl5eSMjMV5eTUAjMVxfU1RPUF99JQorICAgICUKKyAgICAlIEFuZCB0aGlzIGNvbW1hbmQgdG8gZmluZCBhbm90aGVyICMxIGNvbW1hbmQsIGF0IHRoZSBiZWdpbm5pbmcgb2YgYQorICAgICUgbGluZS4gIChPdGhlcndpc2UsIHdlIHdvdWxkIGNvbnNpZGVyIGEgbGluZSBgQGMgQGlmc2V0JywgZm9yCisgICAgJSBleGFtcGxlLCB0byBjb3VudCBhcyBhbiBAaWZzZXQgZm9yIG5lc3RpbmcuKQorICAgIFxsb25nXGRlZlxkb2lnbm9yZXRleHR5eXkjIzFeXk1AIzEjIzJcX1NUT1Bfe1xkb2lnbm9yZXl5eXsjIzJ9XF9TVE9QX30lCisgICAgJQorICAgICUgQW5kIG5vdyBleHBhbmQgdGhhdCBjb21tYW5kLgorICAgIFxkb2lnbm9yZXRleHQgXl5NJQorICB9JQorfQorCitcZGVmXGRvaWdub3JleXl5IzF7JQorICBcZGVmXHRlbXB7IzF9JQorICBcaWZ4XHRlbXBcZW1wdHkJCQklIE5vdGhpbmcgZm91bmQuCisgICAgXGxldFxuZXh0XGRvaWdub3JldGV4dHp6egorICBcZWxzZQkJCQkJJSBGb3VuZCBhIG5lc3RlZCBjb25kaXRpb24sIC4uLgorICAgIFxhZHZhbmNlXGRvaWdub3JlY291bnQgYnkgMQorICAgIFxsZXRcbmV4dFxkb2lnbm9yZXRleHR5eXkJCSUgLi4uLCBsb29rIGZvciBhbm90aGVyLgorICAgICUgSWYgd2UncmUgaGVyZSwgIzEgZW5kcyB3aXRoIF5eTVxpZmluZm8gKGZvciBleGFtcGxlKS4KKyAgXGZpCisgIFxuZXh0ICMxJSB0aGUgdG9rZW4gXF9TVE9QXyBpcyBwcmVzZW50IGp1c3QgYWZ0ZXIgdGhpcyBtYWNyby4KK30KKworJSBXZSBoYXZlIHRvIHN3YWxsb3cgdGhlIHJlbWFpbmluZyAiXF9TVE9QXyIuCislCitcZGVmXGRvaWdub3JldGV4dHp6eiMxeyUKKyAgXGlmbnVtXGRvaWdub3JlY291bnQgPSAwCSUgV2UgaGF2ZSBqdXN0IGZvdW5kIHRoZSBvdXRlcm1vc3QgQGVuZC4KKyAgICBcbGV0XG5leHRcZW5kZG9pZ25vcmUKKyAgXGVsc2UJCQkJJSBTdGlsbCBpbnNpZGUgYSBuZXN0ZWQgY29uZGl0aW9uLgorICAgIFxhZHZhbmNlXGRvaWdub3JlY291bnQgYnkgLTEKKyAgICBcbGV0XG5leHRcZG9pZ25vcmV0ZXh0ICAgICAgJSBMb29rIGZvciB0aGUgbmV4dCBAZW5kLgorICBcZmkKKyAgXG5leHQKK30KKworJSBGaW5pc2ggb2ZmIGlnbm9yZWQgdGV4dC4KK3sgXG9iZXlsaW5lcyUKKyAgJSBJZ25vcmUgYW55dGhpbmcgYWZ0ZXIgdGhlIGxhc3QgYEBlbmQgIzEnOyB0aGlzIG1hdHRlcnMgaW4gdmVyYmF0aW0KKyAgJSBlbnZpcm9ubWVudHMsIHdoZXJlIG90aGVyd2lzZSB0aGUgbmV3bGluZSBhZnRlciBhbiBpZ25vcmVkIGNvbmRpdGlvbmFsCisgICUgd291bGQgcmVzdWx0IGluIGEgYmxhbmsgbGluZSBpbiB0aGUgb3V0cHV0LgorICBcZ2RlZlxlbmRkb2lnbm9yZSMxXl5Ne1xlbmRncm91cFxpZ25vcmVzcGFjZXN9JQorfQorCisKKyUgQHNldCBWQVIgc2V0cyB0aGUgdmFyaWFibGUgVkFSIHRvIGFuIGVtcHR5IHZhbHVlLgorJSBAc2V0IFZBUiBSRVNULU9GLUxJTkUgc2V0cyBWQVIgdG8gdGhlIHZhbHVlIFJFU1QtT0YtTElORS4KKyUKKyUgU2luY2Ugd2Ugd2FudCB0byBzZXBhcmF0ZSBWQVIgZnJvbSBSRVNULU9GLUxJTkUgKHdoaWNoIG1pZ2h0IGJlCislIGVtcHR5KSwgd2UgY2FuJ3QganVzdCB1c2UgXHBhcnNlYXJnOyB3ZSBoYXZlIHRvIGluc2VydCBhIHNwYWNlIG9mIG91cgorJSBvd24gdG8gZGVsaW1pdCB0aGUgcmVzdCBvZiB0aGUgbGluZSwgYW5kIHRoZW4gdGFrZSBpdCBvdXQgYWdhaW4gaWYgd2UKKyUgZGlkbid0IG5lZWQgaXQuCislIFdlIHJlbHkgb24gdGhlIGZhY3QgdGhhdCBccGFyc2Vhcmcgc2V0cyBcY2F0Y29kZWBcID0xMC4KKyUKK1xwYXJzZWFyZ2RlZlxzZXR7XHNldHl5eSMxIFxlbmRzZXR5eXl9CitcZGVmXHNldHl5eSMxICMyXGVuZHNldHl5eXslCisgIHslCisgICAgXG1ha2V2YWx1ZWV4cGFuZGFibGUKKyAgICBcZGVmXHRlbXB7IzJ9JQorICAgIFxlZGVmXG5leHR7XGdkZWZcbWFrZWNzbmFtZXtTRVQjMX19JQorICAgIFxpZnhcdGVtcFxlbXB0eQorICAgICAgXG5leHR7fSUKKyAgICBcZWxzZQorICAgICAgXHNldHp6eiMyXGVuZHNldHp6egorICAgIFxmaQorICB9JQorfQorJSBSZW1vdmUgdGhlIHRyYWlsaW5nIHNwYWNlIFxzZXR4eHggaW5zZXJ0ZWQuCitcZGVmXHNldHp6eiMxIFxlbmRzZXR6enp7XG5leHR7IzF9fQorCislIEBjbGVhciBWQVIgY2xlYXJzIChpLmUuLCB1bnNldHMpIHRoZSB2YXJpYWJsZSBWQVIuCislCitccGFyc2VhcmdkZWZcY2xlYXJ7JQorICB7JQorICAgIFxtYWtldmFsdWVleHBhbmRhYmxlCisgICAgXGdsb2JhbFxleHBhbmRhZnRlclxsZXRcY3NuYW1lIFNFVCMxXGVuZGNzbmFtZT1ccmVsYXgKKyAgfSUKK30KKworJSBAdmFsdWV7Zm9vfSBnZXRzIHRoZSB0ZXh0IHNhdmVkIGluIHZhcmlhYmxlIGZvby4KK1xkZWZcdmFsdWV7XGJlZ2luZ3JvdXBcbWFrZXZhbHVlZXhwYW5kYWJsZVx2YWx1ZXh4eH0KK1xkZWZcdmFsdWV4eHgjMXtcZXhwYW5kYWJsZXZhbHVleyMxfVxlbmRncm91cH0KK3sKKyAgXGNhdGNvZGVgXC0gPSBcYWN0aXZlIFxjYXRjb2RlYFxfID0gXGFjdGl2ZQorICAlCisgIFxnZGVmXG1ha2V2YWx1ZWV4cGFuZGFibGV7JQorICAgIFxsZXRcdmFsdWUgPSBcZXhwYW5kYWJsZXZhbHVlCisgICAgJSBXZSBkb24ndCB3YW50IHRoZXNlIGNoYXJhY3RlcnMgYWN0aXZlLCAuLi4KKyAgICBcY2F0Y29kZWBcLT1cb3RoZXIgXGNhdGNvZGVgXF89XG90aGVyCisgICAgJSAuLi4sIGJ1dCB3ZSBtaWdodCBlbmQgdXAgd2l0aCBhY3RpdmUgb25lcyBpbiB0aGUgYXJndW1lbnQgaWYKKyAgICAlIHdlJ3JlIGNhbGxlZCBmcm9tIEBjb2RlLCBhcyBAY29kZXtAdmFsdWV7Zm9vLWJhcl99fSwgdGhvdWdoLgorICAgICUgU28gXGxldCB0aGVtIHRvIHRoZWlyIG5vcm1hbCBlcXVpdmFsZW50cy4KKyAgICBcbGV0LVxyZWFsZGFzaCBcbGV0X1xub3JtYWx1bmRlcnNjb3JlCisgIH0KK30KKworJSBXZSBoYXZlIHRoaXMgc3Vicm91dGluZSBzbyB0aGF0IHdlIGNhbiBoYW5kbGUgYXQgbGVhc3Qgc29tZSBAdmFsdWUncworJSBwcm9wZXJseSBpbiBpbmRleGVzICh3ZSBjYWxsIFxtYWtldmFsdWVleHBhbmRhYmxlIGluIFxpbmRleGR1bW1pZXMpLgorJSBUaGUgY29tbWFuZCBoYXMgdG8gYmUgZnVsbHkgZXhwYW5kYWJsZSAoaWYgdGhlIHZhcmlhYmxlIGlzIHNldCksIHNpbmNlCislIHRoZSByZXN1bHQgd2luZHMgdXAgaW4gdGhlIGluZGV4IGZpbGUuICBUaGlzIG1lYW5zIHRoYXQgaWYgdGhlCislIHZhcmlhYmxlJ3MgdmFsdWUgY29udGFpbnMgb3RoZXIgVGV4aW5mbyBjb21tYW5kcywgaXQncyBhbG1vc3QgY2VydGFpbgorJSBpdCB3aWxsIGZhaWwgKGFsdGhvdWdoIHBlcmhhcHMgd2UgY291bGQgZml4IHRoYXQgd2l0aCBzdWZmaWNpZW50IHdvcmsKKyUgdG8gZG8gYSBvbmUtbGV2ZWwgZXhwYW5zaW9uIG9uIHRoZSByZXN1bHQsIGluc3RlYWQgb2YgY29tcGxldGUpLgorJQorXGRlZlxleHBhbmRhYmxldmFsdWUjMXslCisgIFxleHBhbmRhZnRlclxpZnhcY3NuYW1lIFNFVCMxXGVuZGNzbmFtZVxyZWxheAorICAgIHtbTm8gdmFsdWUgZm9yIGBgIzEnJ119JQorICAgIFxtZXNzYWdle1ZhcmlhYmxlIGAjMScsIHVzZWQgaW4gQHZhbHVlLCBpcyBub3Qgc2V0Ln0lCisgIFxlbHNlCisgICAgXGNzbmFtZSBTRVQjMVxlbmRjc25hbWUKKyAgXGZpCit9CisKKyUgQGlmc2V0IFZBUiAuLi4gQGVuZCBpZnNldCByZWFkcyB0aGUgYC4uLicgaWZmIFZBUiBoYXMgYmVlbiBkZWZpbmVkCislIHdpdGggQHNldC4KKyUKKyUgVG8gZ2V0IHNwZWNpYWwgdHJlYXRtZW50IG9mIGBAZW5kIGlmc2V0LCcgY2FsbCBcbWFrZW9uZCBhbmQgdGhlIHJlZGVmaW5lLgorJQorXG1ha2Vjb25ke2lmc2V0fQorXGRlZlxpZnNldHtccGFyc2Vhcmd7XGRvaWZzZXR7XGxldFxuZXh0PVxpZnNldGZhaWx9fX0KK1xkZWZcZG9pZnNldCMxIzJ7JQorICB7JQorICAgIFxtYWtldmFsdWVleHBhbmRhYmxlCisgICAgXGxldFxuZXh0PVxlbXB0eQorICAgIFxleHBhbmRhZnRlclxpZnhcY3NuYW1lIFNFVCMyXGVuZGNzbmFtZVxyZWxheAorICAgICAgIzElIElmIG5vdCBzZXQsIHJlZGVmaW5lIFxuZXh0LgorICAgIFxmaQorICAgIFxleHBhbmRhZnRlcgorICB9XG5leHQKK30KK1xkZWZcaWZzZXRmYWlse1xkb2lnbm9yZXtpZnNldH19CisKKyUgQGlmY2xlYXIgVkFSIC4uLiBAZW5kIGlmY2xlYXIgcmVhZHMgdGhlIGAuLi4nIGlmZiBWQVIgaGFzIG5ldmVyIGJlZW4KKyUgZGVmaW5lZCB3aXRoIEBzZXQsIG9yIGhhcyBiZWVuIHVuZGVmaW5lZCB3aXRoIEBjbGVhci4KKyUKKyUgVGhlIGBcZWxzZScgaW5zaWRlIHRoZSBgXGRvaWZzZXQnIHBhcmFtZXRlciBpcyBhIHRyaWNrIHRvIHJldXNlIHRoZQorJSBhYm92ZSBjb2RlOiBpZiB0aGUgdmFyaWFibGUgaXMgbm90IHNldCwgZG8gbm90aGluZywgaWYgaXQgaXMgc2V0LAorJSB0aGVuIHJlZGVmaW5lIFxuZXh0IHRvIFxpZmNsZWFyZmFpbC4KKyUKK1xtYWtlY29uZHtpZmNsZWFyfQorXGRlZlxpZmNsZWFye1xwYXJzZWFyZ3tcZG9pZnNldHtcZWxzZSBcbGV0XG5leHQ9XGlmY2xlYXJmYWlsfX19CitcZGVmXGlmY2xlYXJmYWlse1xkb2lnbm9yZXtpZmNsZWFyfX0KKworJSBAZGlyY2F0ZWdvcnkgQ0FURUdPUlkgIC0tIHNwZWNpZnkgYSBjYXRlZ29yeSBvZiB0aGUgZGlyIGZpbGUKKyUgd2hpY2ggdGhpcyBmaWxlIHNob3VsZCBiZWxvbmcgdG8uICBJZ25vcmUgdGhpcyBpbiBUZVguCitcbGV0XGRpcmNhdGVnb3J5PVxjb21tZW50CisKKyUgQGRlZmluaW5mb2VuY2xvc2UuCitcbGV0XGRlZmluZm9lbmNsb3NlPVxjb21tZW50CisKKworXG1lc3NhZ2V7aW5kZXhpbmcsfQorJSBJbmRleCBnZW5lcmF0aW9uIGZhY2lsaXRpZXMKKworJSBEZWZpbmUgXG5ld3dyaXRlIHRvIGJlIGlkZW50aWNhbCB0byBwbGFpbiB0ZXgncyBcbmV3d3JpdGUKKyUgZXhjZXB0IG5vdCBcb3V0ZXIsIHNvIGl0IGNhbiBiZSB1c2VkIHdpdGhpbiBtYWNyb3MgYW5kIFxpZidzLgorXGVkZWZcbmV3d3JpdGV7XG1ha2Vjc25hbWV7cHRleG5ld3dyaXRlfX0KKworJSBcbmV3aW5kZXgge2Zvb30gZGVmaW5lcyBhbiBpbmRleCBuYW1lZCBmb28uCislIEl0IGF1dG9tYXRpY2FsbHkgZGVmaW5lcyBcZm9vaW5kZXggc3VjaCB0aGF0CislIFxmb29pbmRleCAuLi5yZXN0IG9mIGxpbmUuLi4gcHV0cyBhbiBlbnRyeSBpbiB0aGUgaW5kZXggZm9vLgorJSBJdCBhbHNvIGRlZmluZXMgXGZvb2luZGZpbGUgdG8gYmUgdGhlIG51bWJlciBvZiB0aGUgb3V0cHV0IGNoYW5uZWwgZm9yCislIHRoZSBmaWxlIHRoYXQgYWNjdW11bGF0ZXMgdGhpcyBpbmRleC4gIFRoZSBmaWxlJ3MgZXh0ZW5zaW9uIGlzIGZvby4KKyUgVGhlIG5hbWUgb2YgYW4gaW5kZXggc2hvdWxkIGJlIG5vIG1vcmUgdGhhbiAyIGNoYXJhY3RlcnMgbG9uZworJSBmb3IgdGhlIHNha2Ugb2Ygdm1zLgorJQorXGRlZlxuZXdpbmRleCMxeyUKKyAgXGlmbGlua3MKKyAgICBcZXhwYW5kYWZ0ZXJcbmV3d3JpdGUgXGNzbmFtZSMxaW5kZmlsZVxlbmRjc25hbWUKKyAgICBcb3Blbm91dCBcY3NuYW1lIzFpbmRmaWxlXGVuZGNzbmFtZSBcam9ibmFtZS4jMSAlIE9wZW4gdGhlIGZpbGUKKyAgXGZpCisgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZSMxaW5kZXhcZW5kY3NuYW1leyUgICAgICUgRGVmaW5lIEAjMWluZGV4CisgICAgXG5vZXhwYW5kXGRvaW5kZXh7IzF9fQorfQorCislIEBkZWZpbmRleCBmb28gID09ICBcbmV3aW5kZXh7Zm9vfQorJQorXGRlZlxkZWZpbmRleHtccGFyc2VhcmdcbmV3aW5kZXh9CisKKyUgRGVmaW5lIEBkZWZjb2RlaW5kZXgsIGxpa2UgQGRlZmluZGV4IGV4Y2VwdCBwdXQgYWxsIGVudHJpZXMgaW4gQGNvZGUuCislCitcZGVmXGRlZmNvZGVpbmRleHtccGFyc2VhcmdcbmV3Y29kZWluZGV4fQorJQorXGRlZlxuZXdjb2RlaW5kZXgjMXslCisgIFxpZmxpbmtzCisgICAgXGV4cGFuZGFmdGVyXG5ld3dyaXRlIFxjc25hbWUjMWluZGZpbGVcZW5kY3NuYW1lCisgICAgXG9wZW5vdXQgXGNzbmFtZSMxaW5kZmlsZVxlbmRjc25hbWUgXGpvYm5hbWUuIzEKKyAgXGZpCisgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZSMxaW5kZXhcZW5kY3NuYW1leyUKKyAgICBcbm9leHBhbmRcZG9jb2RlaW5kZXh7IzF9fSUKK30KKworCislIEBzeW5pbmRleCBmb28gYmFyICAgIG1ha2VzIGluZGV4IGZvbyBmZWVkIGludG8gaW5kZXggYmFyLgorJSBEbyB0aGlzIGluc3RlYWQgb2YgQGRlZmluZGV4IGZvbyBpZiB5b3UgZG9uJ3Qgd2FudCBpdCBhcyBhIHNlcGFyYXRlIGluZGV4LgorJQorJSBAc3luY29kZWluZGV4IGZvbyBiYXIgICBzaW1pbGFyLCBidXQgcHV0IGFsbCBlbnRyaWVzIG1hZGUgZm9yIGluZGV4IGZvbworJSBpbnNpZGUgQGNvZGUuCislCitcZGVmXHN5bmluZGV4IzEgIzIge1xkb3N5bmluZGV4XGRvaW5kZXh7IzF9eyMyfX0KK1xkZWZcc3luY29kZWluZGV4IzEgIzIge1xkb3N5bmluZGV4XGRvY29kZWluZGV4eyMxfXsjMn19CisKKyUgIzEgaXMgXGRvaW5kZXggb3IgXGRvY29kZWluZGV4LCAjMiB0aGUgaW5kZXggZ2V0dGluZyByZWRlZmluZWQgKGZvbyksCislICMzIHRoZSB0YXJnZXQgaW5kZXggKGJhcikuCitcZGVmXGRvc3luaW5kZXgjMSMyIzN7JQorICAlIE9ubHkgZG8gXGNsb3Nlb3V0IGlmIHdlIGhhdmVuJ3QgYWxyZWFkeSBkb25lIGl0LCBlbHNlIHdlJ2xsIGVuZCB1cAorICAlIGNsb3NpbmcgdGhlIHRhcmdldCBpbmRleC4KKyAgXGV4cGFuZGFmdGVyIFxpZnhcY3NuYW1lIGRvbmVzeW5pbmRleCMyXGVuZGNzbmFtZSBcdW5kZWZpbmVkCisgICAgJSBUaGUgXGNsb3Nlb3V0IGhlbHBzIHJlZHVjZSB1bm5lY2Vzc2FyeSBvcGVuIGZpbGVzOyB0aGUgbGltaXQgb24gdGhlCisgICAgJSBBY29ybiBSSVNDIE9TIGlzIGEgbWVyZSAxNiBmaWxlcy4KKyAgICBcZXhwYW5kYWZ0ZXJcY2xvc2VvdXRcY3NuYW1lIzJpbmRmaWxlXGVuZGNzbmFtZQorICAgIFxleHBhbmRhZnRlclxsZXRcY3NuYW1lXGRvbmVzeW5pbmRleCMyXGVuZGNzbmFtZSA9IDEKKyAgXGZpCisgICUgcmVkZWZpbmUgXGZvb2luZGZpbGU6CisgIFxleHBhbmRhZnRlclxsZXRcZXhwYW5kYWZ0ZXJcdGVtcFxleHBhbmRhZnRlcj1cY3NuYW1lIzNpbmRmaWxlXGVuZGNzbmFtZQorICBcZXhwYW5kYWZ0ZXJcbGV0XGNzbmFtZSMyaW5kZmlsZVxlbmRjc25hbWU9XHRlbXAKKyAgJSByZWRlZmluZSBcZm9vaW5kZXg6CisgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZSMyaW5kZXhcZW5kY3NuYW1le1xub2V4cGFuZCMxeyMzfX0lCit9CisKKyUgRGVmaW5lIFxkb2luZGV4LCB0aGUgZHJpdmVyIGZvciBhbGwgXGZvb2luZGV4IG1hY3Jvcy4KKyUgQXJndW1lbnQgIzEgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBjYWxsaW5nIFxmb29pbmRleCBtYWNybywKKyUgIGFuZCBpdCBpcyAiZm9vIiwgdGhlIG5hbWUgb2YgdGhlIGluZGV4LgorCislIFxkb2luZGV4IGp1c3QgdXNlcyBccGFyc2Vhcmc7IGl0IGNhbGxzIFxkb2luZCBmb3IgdGhlIGFjdHVhbCB3b3JrLgorJSBUaGlzIGlzIGJlY2F1c2UgXGRvaW5kIGlzIG1vcmUgdXNlZnVsIHRvIGNhbGwgZnJvbSBvdGhlciBtYWNyb3MuCisKKyUgVGhlcmUgaXMgYWxzbyBcZG9zdWJpbmQge2luZGV4fXt0b3BpY317c3VidG9waWN9CislIHdoaWNoIG1ha2VzIGFuIGVudHJ5IGluIGEgdHdvLWxldmVsIGluZGV4IHN1Y2ggYXMgdGhlIG9wZXJhdGlvbiBpbmRleC4KKworXGRlZlxkb2luZGV4IzF7XGVkZWZcaW5kZXhuYW1leyMxfVxwYXJzZWFyZ1xzaW5nbGVpbmRleGVyfQorXGRlZlxzaW5nbGVpbmRleGVyICMxe1xkb2luZHtcaW5kZXhuYW1lfXsjMX19CisKKyUgbGlrZSB0aGUgcHJldmlvdXMgdHdvLCBidXQgdGhleSBwdXQgQGNvZGUgYXJvdW5kIHRoZSBhcmd1bWVudC4KK1xkZWZcZG9jb2RlaW5kZXgjMXtcZWRlZlxpbmRleG5hbWV7IzF9XHBhcnNlYXJnXHNpbmdsZWNvZGVpbmRleGVyfQorXGRlZlxzaW5nbGVjb2RlaW5kZXhlciAjMXtcZG9pbmR7XGluZGV4bmFtZX17XGNvZGV7IzF9fX0KKworJSBUYWtlIGNhcmUgb2YgVGV4aW5mbyBjb21tYW5kcyB0aGF0IGNhbiBhcHBlYXIgaW4gYW4gaW5kZXggZW50cnkuCislIFNpbmNlIHRoZXJlIGFyZSBzb21lIGNvbW1hbmRzIHdlIHdhbnQgdG8gZXhwYW5kLCBhbmQgb3RoZXJzIHdlIGRvbid0LAorJSB3ZSBoYXZlIHRvIGxhYm9yaW91c2x5IHByZXZlbnQgZXhwYW5zaW9uIGZvciB0aG9zZSB0aGF0IHdlIGRvbid0LgorJQorXGRlZlxpbmRleGR1bW1pZXN7JQorICBcZXNjYXBlY2hhciA9IGBcXCAgICAgJSB1c2UgYmFja3NsYXNoIGluIG91dHB1dCBmaWxlcy4KKyAgXGRlZlxAe0B9JSBjaGFuZ2UgdG8gQEAgd2hlbiB3ZSBzd2l0Y2ggdG8gQCBhcyBlc2NhcGUgY2hhciBpbiBpbmRleCBmaWxlcy4KKyAgXGRlZlwge1xyZWFsYmFja3NsYXNoXHNwYWNlIH0lCisgICUKKyAgJSBOZWVkIHRoZXNlIGluIGNhc2UgXHRleCBpcyBpbiBlZmZlY3QgYW5kIFx7IGlzIGEgXGRlbGltaXRlciBhZ2Fpbi4KKyAgJSBCdXQgY2FuJ3QgdXNlIFxsYnJhY2VjbWQgYW5kIFxyYnJhY2VjbWQgYmVjYXVzZSB0ZXhpbmRleCBhc3N1bWVzCisgICUgYnJhY2VzIGFuZCBiYWNrc2xhc2hlcyBhcmUgdXNlZCBvbmx5IGFzIGRlbGltaXRlcnMuCisgIFxsZXRceyA9IFxteWxicmFjZQorICBcbGV0XH0gPSBcbXlyYnJhY2UKKyAgJQorICAlIEkgZG9uJ3QgZW50aXJlbHkgdW5kZXJzdGFuZCB0aGlzLCBidXQgd2hlbiBhbiBpbmRleCBlbnRyeSBpcworICAlIGdlbmVyYXRlZCBmcm9tIGEgbWFjcm8gY2FsbCwgdGhlIFxlbmRpbnB1dCB3aGljaCBcc2Nhbm1hY3JvIGluc2VydHMKKyAgJSBjYXVzZXMgcHJvY2Vzc2luZyB0byBiZSBwcmVtYXR1cmVseSB0ZXJtaW5hdGVkLiAgVGhpcyBpcywKKyAgJSBhcHBhcmVudGx5LCBiZWNhdXNlIFxpbmRleHNvcnR0bXAgaXMgZnVsbHkgZXhwYW5kZWQsIGFuZCBcZW5kaW5wdXQKKyAgJSBpcyBhbiBleHBhbmRhYmxlIGNvbW1hbmQuICBUaGUgcmVkZWZpbml0aW9uIGJlbG93IG1ha2VzIFxlbmRpbnB1dAorICAlIGRpc2FwcGVhciBhbHRvZ2V0aGVyIGZvciB0aGF0IHB1cnBvc2UgLS0gYWx0aG91Z2ggbG9nZ2luZyBzaG93cyB0aGF0CisgICUgcHJvY2Vzc2luZyBjb250aW51ZXMgdG8gc29tZSBmdXJ0aGVyIHBvaW50LiAgT24gdGhlIG90aGVyIGhhbmQsIGl0CisgICUgc2VlbXMgXGVuZGlucHV0IGRvZXMgbm90IGh1cnQgaW4gdGhlIHByaW50ZWQgaW5kZXggYXJnLCBzaW5jZSB0aGF0CisgICUgaXMgc3RpbGwgZ2V0dGluZyB3cml0dGVuIHdpdGhvdXQgYXBwYXJlbnQgaGFybS4KKyAgJSAKKyAgJSBTYW1wbGUgc291cmNlIChtYWMtaWR4My50ZXgsIHJlcG9ydGVkIGJ5IEdyYWhhbSBQZXJjaXZhbCB0bworICAlIGhlbHAtdGV4aW5mbywgMjJtYXkwNik6CisgICUgQG1hY3JvIGZ1bmluZGV4IHtXT1JEfQorICAlIEBmaW5kZXggeHl6CisgICUgQGVuZCBtYWNybworICAlIC4uLgorICAlIEBmdW5pbmRleCBjb21tdGVzdAorICAlIAorICAlIFRoZSBhYm92ZSBpcyBub3QgZW5vdWdoIHRvIHJlcHJvZHVjZSB0aGUgYnVnLCBidXQgaXQgZ2l2ZXMgdGhlIGZsYXZvci4KKyAgJSAKKyAgJSBTYW1wbGUgd2hhdHNpdCByZXN1bHRpbmc6CisgICUgLkB3cml0ZTN7XGVudHJ5e3h5en17QGZvbGlvIH17QGNvZGUge3h5ekBlbmRpbnB1dCB9fX0KKyAgJSAKKyAgJSBTbzoKKyAgXGxldFxlbmRpbnB1dCA9IFxlbXB0eQorICAlCisgICUgRG8gdGhlIHJlZGVmaW5pdGlvbnMuCisgIFxjb21tb25kdW1taWVzCit9CisKKyUgRm9yIHRoZSBhdXggYW5kIHRvYyBmaWxlcywgQCBpcyB0aGUgZXNjYXBlIGNoYXJhY3Rlci4gIFNvIHdlIHdhbnQgdG8KKyUgcmVkZWZpbmUgZXZlcnl0aGluZyB1c2luZyBAIGFzIHRoZSBlc2NhcGUgY2hhcmFjdGVyIChpbnN0ZWFkIG9mCislIFxyZWFsYmFja3NsYXNoLCBzdGlsbCB1c2VkIGZvciBpbmRleCBmaWxlcykuICBXaGVuIGV2ZXJ5dGhpbmcgdXNlcyBALAorJSB0aGlzIHdpbGwgYmUgc2ltcGxlci4KKyUKK1xkZWZcYXRkdW1taWVzeyUKKyAgXGRlZlxAe0BAfSUKKyAgXGRlZlwge0AgfSUKKyAgXGxldFx7ID0gXGxicmFjZWF0Y21kCisgIFxsZXRcfSA9IFxyYnJhY2VhdGNtZAorICAlCisgICUgRG8gdGhlIHJlZGVmaW5pdGlvbnMuCisgIFxjb21tb25kdW1taWVzCisgIFxvdGhlcmJhY2tzbGFzaAorfQorCislIENhbGxlZCBmcm9tIFxpbmRleGR1bW1pZXMgYW5kIFxhdGR1bW1pZXMuCislCitcZGVmXGNvbW1vbmR1bW1pZXN7JQorICAlCisgICUgXGRlZmluZWR1bW15d29yZCBkZWZpbmVzIFwjMSBhcyBcc3RyaW5nXCMxXHNwYWNlLCB0aHVzIGVmZmVjdGl2ZWx5CisgICUgcHJldmVudGluZyBpdHMgZXhwYW5zaW9uLiAgVGhpcyBpcyB1c2VkIG9ubHkgZm9yIGNvbnRyb2wlIHdvcmRzLAorICAlIG5vdCBjb250cm9sIGxldHRlcnMsIGJlY2F1c2UgdGhlIFxzcGFjZSB3b3VsZCBiZSBpbmNvcnJlY3QgZm9yCisgICUgY29udHJvbCBjaGFyYWN0ZXJzLCBidXQgaXMgbmVlZGVkIHRvIHNlcGFyYXRlIHRoZSBjb250cm9sIHdvcmQKKyAgJSBmcm9tIHdoYXRldmVyIGZvbGxvd3MuCisgICUKKyAgJSBGb3IgY29udHJvbCBsZXR0ZXJzLCB3ZSBoYXZlIFxkZWZpbmVkdW1teWxldHRlciwgd2hpY2ggb21pdHMgdGhlCisgICUgc3BhY2UuCisgICUKKyAgJSBUaGVzZSBjYW4gYmUgdXNlZCBib3RoIGZvciBjb250cm9sIHdvcmRzIHRoYXQgdGFrZSBhbiBhcmd1bWVudCBhbmQKKyAgJSB0aG9zZSB0aGF0IGRvIG5vdC4gIElmIGl0IGlzIGZvbGxvd2VkIGJ5IHthcmd9IGluIHRoZSBpbnB1dCwgdGhlbgorICAlIHRoYXQgd2lsbCBkdXRpZnVsbHkgZ2V0IHdyaXR0ZW4gdG8gdGhlIGluZGV4IChvciB3aGVyZXZlcikuCisgICUKKyAgXGRlZlxkZWZpbmVkdW1teXdvcmQgICMjMXtcZGVmIyMxe1xzdHJpbmcjIzFcc3BhY2V9fSUKKyAgXGRlZlxkZWZpbmVkdW1teWxldHRlciMjMXtcZGVmIyMxe1xzdHJpbmcjIzF9fSUKKyAgXGxldFxkZWZpbmVkdW1teWFjY2VudFxkZWZpbmVkdW1teWxldHRlcgorICAlCisgIFxjb21tb25kdW1taWVzbm9mb250cworICAlCisgIFxkZWZpbmVkdW1teWxldHRlclxfJQorICAlCisgICUgTm9uLUVuZ2xpc2ggbGV0dGVycy4KKyAgXGRlZmluZWR1bW15d29yZFxBQQorICBcZGVmaW5lZHVtbXl3b3JkXEFFCisgIFxkZWZpbmVkdW1teXdvcmRcTAorICBcZGVmaW5lZHVtbXl3b3JkXE9FCisgIFxkZWZpbmVkdW1teXdvcmRcTworICBcZGVmaW5lZHVtbXl3b3JkXGFhCisgIFxkZWZpbmVkdW1teXdvcmRcYWUKKyAgXGRlZmluZWR1bW15d29yZFxsCisgIFxkZWZpbmVkdW1teXdvcmRcb2UKKyAgXGRlZmluZWR1bW15d29yZFxvCisgIFxkZWZpbmVkdW1teXdvcmRcc3MKKyAgXGRlZmluZWR1bW15d29yZFxleGNsYW1kb3duCisgIFxkZWZpbmVkdW1teXdvcmRccXVlc3Rpb25kb3duCisgIFxkZWZpbmVkdW1teXdvcmRcb3JkZgorICBcZGVmaW5lZHVtbXl3b3JkXG9yZG0KKyAgJQorICAlIEFsdGhvdWdoIHRoZXNlIGludGVybmFsIGNvbW1hbmRzIHNob3VsZG4ndCBzaG93IHVwLCBzb21ldGltZXMgdGhleSBkby4KKyAgXGRlZmluZWR1bW15d29yZFxiZgorICBcZGVmaW5lZHVtbXl3b3JkXGd0cgorICBcZGVmaW5lZHVtbXl3b3JkXGhhdAorICBcZGVmaW5lZHVtbXl3b3JkXGxlc3MKKyAgXGRlZmluZWR1bW15d29yZFxzZgorICBcZGVmaW5lZHVtbXl3b3JkXHNsCisgIFxkZWZpbmVkdW1teXdvcmRcdGNsb3NlCisgIFxkZWZpbmVkdW1teXdvcmRcdHQKKyAgJQorICBcZGVmaW5lZHVtbXl3b3JkXExhVGVYCisgIFxkZWZpbmVkdW1teXdvcmRcVGVYCisgICUKKyAgJSBBc3NvcnRlZCBzcGVjaWFsIGNoYXJhY3RlcnMuCisgIFxkZWZpbmVkdW1teXdvcmRcYnVsbGV0CisgIFxkZWZpbmVkdW1teXdvcmRcY29tbWEKKyAgXGRlZmluZWR1bW15d29yZFxjb3B5cmlnaHQKKyAgXGRlZmluZWR1bW15d29yZFxyZWdpc3RlcmVkc3ltYm9sCisgIFxkZWZpbmVkdW1teXdvcmRcZG90cworICBcZGVmaW5lZHVtbXl3b3JkXGVuZGRvdHMKKyAgXGRlZmluZWR1bW15d29yZFxlcXVpdgorICBcZGVmaW5lZHVtbXl3b3JkXGVycm9yCisgIFxkZWZpbmVkdW1teXdvcmRcZXVybworICBcZGVmaW5lZHVtbXl3b3JkXGV4cGFuc2lvbgorICBcZGVmaW5lZHVtbXl3b3JkXG1pbnVzCisgIFxkZWZpbmVkdW1teXdvcmRccG91bmRzCisgIFxkZWZpbmVkdW1teXdvcmRccG9pbnQKKyAgXGRlZmluZWR1bW15d29yZFxwcmludAorICBcZGVmaW5lZHVtbXl3b3JkXHJlc3VsdAorICBcZGVmaW5lZHVtbXl3b3JkXHRleHRkZWdyZWUKKyAgJQorICAlIFdlIHdhbnQgdG8gZGlzYWJsZSBhbGwgbWFjcm9zIHNvIHRoYXQgdGhleSBhcmUgbm90IGV4cGFuZGVkIGJ5IFx3cml0ZS4KKyAgXG1hY3JvbGlzdAorICAlCisgIFxub3JtYWx0dXJub2ZmYWN0aXZlCisgICUKKyAgJSBIYW5kbGUgc29tZSBjYXNlcyBvZiBAdmFsdWUgLS0gd2hlcmUgaXQgZG9lcyBub3QgY29udGFpbiBhbnkKKyAgJSAobm9uLWZ1bGx5LWV4cGFuZGFibGUpIGNvbW1hbmRzLgorICBcbWFrZXZhbHVlZXhwYW5kYWJsZQorfQorCislIFxjb21tb25kdW1taWVzbm9mb250czogY29tbW9uIHRvIFxjb21tb25kdW1taWVzIGFuZCBcaW5kZXhub2ZvbnRzLgorJQorXGRlZlxjb21tb25kdW1taWVzbm9mb250c3slCisgICUgQ29udHJvbCBsZXR0ZXJzIGFuZCBhY2NlbnRzLgorICBcZGVmaW5lZHVtbXlsZXR0ZXJcISUKKyAgXGRlZmluZWR1bW15YWNjZW50XCIlCisgIFxkZWZpbmVkdW1teWFjY2VudFwnJQorICBcZGVmaW5lZHVtbXlsZXR0ZXJcKiUKKyAgXGRlZmluZWR1bW15YWNjZW50XCwlCisgIFxkZWZpbmVkdW1teWxldHRlclwuJQorICBcZGVmaW5lZHVtbXlsZXR0ZXJcLyUKKyAgXGRlZmluZWR1bW15bGV0dGVyXDolCisgIFxkZWZpbmVkdW1teWFjY2VudFw9JQorICBcZGVmaW5lZHVtbXlsZXR0ZXJcPyUKKyAgXGRlZmluZWR1bW15YWNjZW50XF4lCisgIFxkZWZpbmVkdW1teWFjY2VudFxgJQorICBcZGVmaW5lZHVtbXlhY2NlbnRcfiUKKyAgXGRlZmluZWR1bW15d29yZFx1CisgIFxkZWZpbmVkdW1teXdvcmRcdgorICBcZGVmaW5lZHVtbXl3b3JkXEgKKyAgXGRlZmluZWR1bW15d29yZFxkb3RhY2NlbnQKKyAgXGRlZmluZWR1bW15d29yZFxyaW5nYWNjZW50CisgIFxkZWZpbmVkdW1teXdvcmRcdGllYWNjZW50CisgIFxkZWZpbmVkdW1teXdvcmRcdWJhcmFjY2VudAorICBcZGVmaW5lZHVtbXl3b3JkXHVkb3RhY2NlbnQKKyAgXGRlZmluZWR1bW15d29yZFxkb3RsZXNzCisgICUKKyAgJSBUZXhpbmZvIGZvbnQgY29tbWFuZHMuCisgIFxkZWZpbmVkdW1teXdvcmRcYgorICBcZGVmaW5lZHVtbXl3b3JkXGkKKyAgXGRlZmluZWR1bW15d29yZFxyCisgIFxkZWZpbmVkdW1teXdvcmRcc2MKKyAgXGRlZmluZWR1bW15d29yZFx0CisgICUKKyAgJSBDb21tYW5kcyB0aGF0IHRha2UgYXJndW1lbnRzLgorICBcZGVmaW5lZHVtbXl3b3JkXGFjcm9ueW0KKyAgXGRlZmluZWR1bW15d29yZFxjaXRlCisgIFxkZWZpbmVkdW1teXdvcmRcY29kZQorICBcZGVmaW5lZHVtbXl3b3JkXGNvbW1hbmQKKyAgXGRlZmluZWR1bW15d29yZFxkZm4KKyAgXGRlZmluZWR1bW15d29yZFxlbXBoCisgIFxkZWZpbmVkdW1teXdvcmRcZW52CisgIFxkZWZpbmVkdW1teXdvcmRcZmlsZQorICBcZGVmaW5lZHVtbXl3b3JkXGtiZAorICBcZGVmaW5lZHVtbXl3b3JkXGtleQorICBcZGVmaW5lZHVtbXl3b3JkXG1hdGgKKyAgXGRlZmluZWR1bW15d29yZFxvcHRpb24KKyAgXGRlZmluZWR1bW15d29yZFxweHJlZgorICBcZGVmaW5lZHVtbXl3b3JkXHJlZgorICBcZGVmaW5lZHVtbXl3b3JkXHNhbXAKKyAgXGRlZmluZWR1bW15d29yZFxzdHJvbmcKKyAgXGRlZmluZWR1bW15d29yZFx0aWUKKyAgXGRlZmluZWR1bW15d29yZFx1cmVmCisgIFxkZWZpbmVkdW1teXdvcmRcdXJsCisgIFxkZWZpbmVkdW1teXdvcmRcdmFyCisgIFxkZWZpbmVkdW1teXdvcmRcdmVyYgorICBcZGVmaW5lZHVtbXl3b3JkXHcKKyAgXGRlZmluZWR1bW15d29yZFx4cmVmCit9CisKKyUgXGluZGV4bm9mb250cyBpcyB1c2VkIHdoZW4gb3V0cHV0dGluZyB0aGUgc3RyaW5ncyB0byBzb3J0IHRoZSBpbmRleAorJSBieSwgYW5kIHdoZW4gY29uc3RydWN0aW5nIGNvbnRyb2wgc2VxdWVuY2UgbmFtZXMuICBJdCBlbGltaW5hdGVzIGFsbAorJSBjb250cm9sIHNlcXVlbmNlcyBhbmQganVzdCB3cml0ZXMgd2hhdGV2ZXIgdGhlIGJlc3QgQVNDSUkgc29ydCBzdHJpbmcKKyUgd291bGQgYmUgZm9yIGEgZ2l2ZW4gY29tbWFuZCAodXN1YWxseSBpdHMgYXJndW1lbnQpLgorJQorXGRlZlxpbmRleG5vZm9udHN7JQorICAlIEFjY2VudCBjb21tYW5kcyBzaG91bGQgYmVjb21lIEBhc2lzLgorICBcZGVmXGRlZmluZWR1bW15YWNjZW50IyMxe1xsZXQjIzFcYXNpc30lCisgICUgV2UgY2FuIGp1c3QgaWdub3JlIG90aGVyIGNvbnRyb2wgbGV0dGVycy4KKyAgXGRlZlxkZWZpbmVkdW1teWxldHRlciMjMXtcbGV0IyMxXGVtcHR5fSUKKyAgJSBIb3BlZnVsbHksIGFsbCBjb250cm9sIHdvcmRzIGNhbiBiZWNvbWUgQGFzaXMuCisgIFxsZXRcZGVmaW5lZHVtbXl3b3JkXGRlZmluZWR1bW15YWNjZW50CisgICUKKyAgXGNvbW1vbmR1bW1pZXNub2ZvbnRzCisgICUKKyAgJSBEb24ndCBuby1vcCBcdHQsIHNpbmNlIGl0IGlzbid0IGEgdXNlci1sZXZlbCBjb21tYW5kCisgICUgYW5kIGlzIHVzZWQgaW4gdGhlIGRlZmluaXRpb25zIG9mIHRoZSBhY3RpdmUgY2hhcnMgbGlrZSA8LCA+LCB8LCBldGMuCisgICUgTGlrZXdpc2Ugd2l0aCB0aGUgb3RoZXIgcGxhaW4gdGV4IGZvbnQgY29tbWFuZHMuCisgICVcbGV0XHR0PVxhc2lzCisgICUKKyAgXGRlZlwgeyB9JQorICBcZGVmXEB7QH0lCisgICUgaG93IHRvIGhhbmRsZSBicmFjZXM/CisgIFxkZWZcX3tcbm9ybWFsdW5kZXJzY29yZX0lCisgICUKKyAgJSBOb24tRW5nbGlzaCBsZXR0ZXJzLgorICBcZGVmXEFBe0FBfSUKKyAgXGRlZlxBRXtBRX0lCisgIFxkZWZcTHtMfSUKKyAgXGRlZlxPRXtPRX0lCisgIFxkZWZcT3tPfSUKKyAgXGRlZlxhYXthYX0lCisgIFxkZWZcYWV7YWV9JQorICBcZGVmXGx7bH0lCisgIFxkZWZcb2V7b2V9JQorICBcZGVmXG97b30lCisgIFxkZWZcc3N7c3N9JQorICBcZGVmXGV4Y2xhbWRvd257IX0lCisgIFxkZWZccXVlc3Rpb25kb3duez99JQorICBcZGVmXG9yZGZ7YX0lCisgIFxkZWZcb3JkbXtvfSUKKyAgJQorICBcZGVmXExhVGVYe0xhVGVYfSUKKyAgXGRlZlxUZVh7VGVYfSUKKyAgJQorICAlIEFzc29ydGVkIHNwZWNpYWwgY2hhcmFjdGVycy4KKyAgJSAoVGhlIGZvbGxvd2luZyB7fSB3aWxsIGVuZCB1cCBpbiB0aGUgc29ydCBzdHJpbmcsIGJ1dCB0aGF0J3Mgb2suKQorICBcZGVmXGJ1bGxldHtidWxsZXR9JQorICBcZGVmXGNvbW1heyx9JQorICBcZGVmXGNvcHlyaWdodHtjb3B5cmlnaHR9JQorICBcZGVmXHJlZ2lzdGVyZWRzeW1ib2x7Un0lCisgIFxkZWZcZG90c3suLi59JQorICBcZGVmXGVuZGRvdHN7Li4ufSUKKyAgXGRlZlxlcXVpdns9PX0lCisgIFxkZWZcZXJyb3J7ZXJyb3J9JQorICBcZGVmXGV1cm97ZXVyb30lCisgIFxkZWZcZXhwYW5zaW9uez09Pn0lCisgIFxkZWZcbWludXN7LX0lCisgIFxkZWZccG91bmRze3BvdW5kc30lCisgIFxkZWZccG9pbnR7Ln0lCisgIFxkZWZccHJpbnR7LXx9JQorICBcZGVmXHJlc3VsdHs9Pn0lCisgIFxkZWZcdGV4dGRlZ3JlZXtkZWdyZWVzfSUKKyAgJQorICAlIFdlIG5lZWQgdG8gZ2V0IHJpZCBvZiBhbGwgbWFjcm9zLCBsZWF2aW5nIG9ubHkgdGhlIGFyZ3VtZW50cyAoaWYgcHJlc2VudCkuCisgICUgT2YgY291cnNlIHRoaXMgaXMgbm90IG5lYXJseSBjb3JyZWN0LCBidXQgaXQgaXMgdGhlIGJlc3Qgd2UgY2FuIGRvIGZvciBub3cuCisgICUgbWFrZWluZm8gZG9lcyBub3QgZXhwYW5kIG1hY3JvcyBpbiB0aGUgYXJndW1lbnQgdG8gQGRlZmZuLCB3aGljaCBlbmRzIHVwCisgICUgd3JpdGluZyBhbiBpbmRleCBlbnRyeSwgYW5kIHRleGluZGV4IGlzbid0IHByZXBhcmVkIGZvciBhbiBpbmRleCBzb3J0IGVudHJ5CisgICUgdGhhdCBzdGFydHMgd2l0aCBcLgorICAlIAorICAlIFNpbmNlIG1hY3JvIGludm9jYXRpb25zIGFyZSBmb2xsb3dlZCBieSBicmFjZXMsIHdlIGNhbiBqdXN0IHJlZGVmaW5lIHRoZW0KKyAgJSB0byB0YWtlIGEgc2luZ2xlIFRlWCBhcmd1bWVudC4gIFRoZSBjYXNlIG9mIGEgbWFjcm8gaW52b2NhdGlvbiB0aGF0CisgICUgZ29lcyB0byBlbmQtb2YtbGluZSBpcyBub3QgaGFuZGxlZC4KKyAgJSAKKyAgXG1hY3JvbGlzdAorfQorCitcbGV0XGluZGV4YmFja3NsYXNoPTAgICVvdmVycmlkZGVuIGR1cmluZyBccHJpbnRpbmRleC4KK1xsZXRcU0VUbWFyZ2luaW5kZXg9XHJlbGF4ICUgcHV0IGluZGV4IGVudHJpZXMgaW4gbWFyZ2luICh1bmRvY3VtZW50ZWQpPworCislIE1vc3QgaW5kZXggZW50cmllcyBnbyB0aHJvdWdoIGhlcmUsIGJ1dCBcZG9zdWJpbmQgaXMgdGhlIGdlbmVyYWwgY2FzZS4KKyUgIzEgaXMgdGhlIGluZGV4IG5hbWUsICMyIGlzIHRoZSBlbnRyeSB0ZXh0LgorXGRlZlxkb2luZCMxIzJ7XGRvc3ViaW5keyMxfXsjMn17fX0KKworJSBXb3JraG9yc2UgZm9yIGFsbCBcZm9vaW5kZXhlcy4KKyUgIzEgaXMgbmFtZSBvZiBpbmRleCwgIzIgaXMgc3R1ZmYgdG8gcHV0IHRoZXJlLCAjMyBpcyBzdWJlbnRyeSAtLQorJSBlbXB0eSBpZiBjYWxsZWQgZnJvbSBcZG9pbmQsIGFzIHdlIHVzdWFsbHkgYXJlICh0aGUgbWFpbiBleGNlcHRpb24KKyUgaXMgd2l0aCBtb3N0IGRlZnVucywgd2hpY2ggY2FsbCB1cyBkaXJlY3RseSkuCislCitcZGVmXGRvc3ViaW5kIzEjMiMzeyUKKyAgXGlmbGlua3MKKyAgeyUKKyAgICAlIFN0b3JlIHRoZSBtYWluIGluZGV4IGVudHJ5IHRleHQgKGluY2x1ZGluZyB0aGUgdGhpcmQgYXJnKS4KKyAgICBcdG9rczAgPSB7IzJ9JQorICAgICUgSWYgdGhpcmQgYXJnIGlzIHByZXNlbnQsIHByZWNlZGUgaXQgd2l0aCBhIHNwYWNlLgorICAgIFxkZWZcdGhpcmRhcmd7IzN9JQorICAgIFxpZnhcdGhpcmRhcmdcZW1wdHkgXGVsc2UKKyAgICAgIFx0b2tzMCA9IFxleHBhbmRhZnRlcntcdGhlXHRva3MwIFxzcGFjZSAjM30lCisgICAgXGZpCisgICAgJQorICAgIFxlZGVmXHdyaXRldG97XGNzbmFtZSMxaW5kZmlsZVxlbmRjc25hbWV9JQorICAgICUKKyAgICBcaWZ2bW9kZQorICAgICAgXGRvc3ViaW5kc2FuaXRpemUKKyAgICBcZWxzZQorICAgICAgXGRvc3ViaW5kd3JpdGUKKyAgICBcZmkKKyAgfSUKKyAgXGZpCit9CisKKyUgV3JpdGUgdGhlIGVudHJ5IGluIFx0b2tzMCB0byB0aGUgaW5kZXggZmlsZToKKyUKK1xkZWZcZG9zdWJpbmR3cml0ZXslCisgICUgUHV0IHRoZSBpbmRleCBlbnRyeSBpbiB0aGUgbWFyZ2luIGlmIGRlc2lyZWQuCisgIFxpZnhcU0VUbWFyZ2luaW5kZXhccmVsYXhcZWxzZQorICAgIFxpbnNlcnRcbWFyZ2lue1xoYm94e1x2cnVsZSBoZWlnaHQ4cHQgZGVwdGgzcHQgd2lkdGgwcHQgXHRoZVx0b2tzMH19JQorICBcZmkKKyAgJQorICAlIFJlbWVtYmVyLCB3ZSBhcmUgd2l0aGluIGEgZ3JvdXAuCisgIFxpbmRleGR1bW1pZXMgJSBNdXN0IGRvIHRoaXMgaGVyZSwgc2luY2UgXGJmLCBldGMgZXhwYW5kIGF0IHRoaXMgc3RhZ2UKKyAgXGRlZlxiYWNrc2xhc2hjdXJmb250e1xpbmRleGJhY2tzbGFzaH0lIFxpbmRleGJhY2tzbGFzaCBpc24ndCBkZWZpbmVkIG5vdworICAgICAgJSBzbyBpdCB3aWxsIGJlIG91dHB1dCBhcyBpczsgYW5kIGl0IHdpbGwgcHJpbnQgYXMgYmFja3NsYXNoLgorICAlCisgICUgUHJvY2VzcyB0aGUgaW5kZXggZW50cnkgd2l0aCBhbGwgZm9udCBjb21tYW5kcyB0dXJuZWQgb2ZmLCB0bworICAlIGdldCB0aGUgc3RyaW5nIHRvIHNvcnQgYnkuCisgIHtcaW5kZXhub2ZvbnRzCisgICBcZWRlZlx0ZW1we1x0aGVcdG9rczB9JSBuZWVkIGZ1bGwgZXhwYW5zaW9uCisgICBceGRlZlxpbmRleHNvcnR0bXB7XHRlbXB9JQorICB9JQorICAlCisgICUgU2V0IHVwIHRoZSBjb21wbGV0ZSBpbmRleCBlbnRyeSwgd2l0aCBib3RoIHRoZSBzb3J0IGtleSBhbmQKKyAgJSB0aGUgb3JpZ2luYWwgdGV4dCwgaW5jbHVkaW5nIGFueSBmb250IGNvbW1hbmRzLiAgV2Ugd3JpdGUKKyAgJSB0aHJlZSBhcmd1bWVudHMgdG8gXGVudHJ5IHRvIHRoZSAuPz8gZmlsZSAoZm91ciBpbiB0aGUKKyAgJSBzdWJlbnRyeSBjYXNlKSwgdGV4aW5kZXggcmVkdWNlcyB0byB0d28gd2hlbiB3cml0aW5nIHRoZSAuPz9zCisgICUgc29ydGVkIHJlc3VsdC4KKyAgXGVkZWZcdGVtcHslCisgICAgXHdyaXRlXHdyaXRldG97JQorICAgICAgXHN0cmluZ1xlbnRyeXtcaW5kZXhzb3J0dG1wfXtcbm9leHBhbmRcZm9saW99e1x0aGVcdG9rczB9fSUKKyAgfSUKKyAgXHRlbXAKK30KKworJSBUYWtlIGNhcmUgb2YgdW53YW50ZWQgcGFnZSBicmVha3M6CislCislIElmIGEgc2tpcCBpcyB0aGUgbGFzdCB0aGluZyBvbiB0aGUgbGlzdCBub3csIHByZXNlcnZlIGl0CislIGJ5IGJhY2tpbmcgdXAgYnkgXGxhc3Rza2lwLCBkb2luZyB0aGUgXHdyaXRlLCB0aGVuIGluc2VydGluZworJSB0aGUgc2tpcCBhZ2Fpbi4gIE90aGVyd2lzZSwgdGhlIHdoYXRzaXQgZ2VuZXJhdGVkIGJ5IHRoZQorJSBcd3JpdGUgd2lsbCBtYWtlIFxsYXN0c2tpcCB6ZXJvLiAgVGhlIHJlc3VsdCBpcyB0aGF0IHNlcXVlbmNlcworJSBsaWtlIHRoaXM6CislIEBlbmQgZGVmdW4KKyUgQHRpbmRleCB3aGF0ZXZlcgorJSBAZGVmdW4gLi4uCislIHdpbGwgaGF2ZSBleHRyYSBzcGFjZSBpbnNlcnRlZCwgYmVjYXVzZSB0aGUgXG1lZGJyZWFrIGluIHRoZQorJSBzdGFydCBvZiB0aGUgQGRlZnVuIHdvbid0IHNlZSB0aGUgc2tpcCBpbnNlcnRlZCBieSB0aGUgQGVuZCBvZgorJSB0aGUgcHJldmlvdXMgZGVmdW4uCislCislIEJ1dCBkb24ndCBkbyBhbnkgb2YgdGhpcyBpZiB3ZSdyZSBub3QgaW4gdmVydGljYWwgbW9kZS4gIFdlCislIGRvbid0IHdhbnQgdG8gZG8gYSBcdnNraXAgYW5kIHByZW1hdHVyZWx5IGVuZCBhIHBhcmFncmFwaC4KKyUKKyUgQXZvaWQgcGFnZSBicmVha3MgZHVlIHRvIHRoZXNlIGV4dHJhIHNraXBzLCB0b28uCislCislIEJ1dCB3YWl0LCB0aGVyZSBpcyBhIGNhdGNoIHRoZXJlOgorJSBXZSdsbCBoYXZlIHRvIGNoZWNrIHdoZXRoZXIgXGxhc3Rza2lwIGlzIHplcm8gc2tpcC4gIFxpZmRpbSBpcyBub3QKKyUgc3VmZmljaWVudCBmb3IgdGhpcyBwdXJwb3NlLCBhcyBpdCBpZ25vcmVzIHN0cmV0Y2ggYW5kIHNocmluayBwYXJ0cworJSBvZiB0aGUgc2tpcC4gIFRoZSBvbmx5IHdheSBzZWVtcyB0byBiZSB0byBjaGVjayB0aGUgdGV4dHVhbAorJSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc2tpcC4KKyUKKyUgVGhlIGZvbGxvd2luZyBpcyBhbG1vc3QgbGlrZSBcZGVmXHplcm9za2lwbWFjcm97MC4wcHR9IGV4Y2VwdCB0aGF0CislIHRoZSBgYHAnJyBhbmQgYGB0JycgY2hhcmFjdGVycyBoYXZlIGNhdGNvZGUgXG90aGVyLCBub3QgMTEgKGxldHRlcikuCislCitcZWRlZlx6ZXJvc2tpcG1hY3Jve1xleHBhbmRhZnRlclx0aGVcY3NuYW1lIHpAc2tpcFxlbmRjc25hbWV9CislCislIC4uLiwgcmVhZHksIEdPOgorJQorXGRlZlxkb3N1YmluZHNhbml0aXpleyUKKyAgJSBcbGFzdHNraXAgYW5kIFxsYXN0cGVuYWx0eSBjYW5ub3QgYm90aCBiZSBub256ZXJvIHNpbXVsdGFuZW91c2x5LgorICBcc2tpcDAgPSBcbGFzdHNraXAKKyAgXGVkZWZcbGFzdHNraXBtYWNyb3tcdGhlXGxhc3Rza2lwfSUKKyAgXGNvdW50MjU1ID0gXGxhc3RwZW5hbHR5CisgICUKKyAgJSBJZiBcbGFzdHNraXAgaXMgbm9uemVybywgdGhhdCBtZWFucyB0aGUgbGFzdCBpdGVtIHdhcyBhCisgICUgc2tpcC4gIEFuZCBzaW5jZSBhIHNraXAgaXMgZGlzY2FyZGFibGUsIHRoYXQgbWVhbnMgdGhpcworICAlIC1cc2tpcDAgZ2x1ZSB3ZSdyZSBpbnNlcnRpbmcgaXMgcHJlY2VkZWQgYnkgYQorICAlIG5vbi1kaXNjYXJkYWJsZSBpdGVtLCB0aGVyZWZvcmUgaXQgaXMgbm90IGEgcG90ZW50aWFsCisgICUgYnJlYWtwb2ludCwgdGhlcmVmb3JlIG5vIFxub2JyZWFrIG5lZWRlZC4KKyAgXGlmeFxsYXN0c2tpcG1hY3JvXHplcm9za2lwbWFjcm8KKyAgXGVsc2UKKyAgICBcdnNraXAtXHNraXAwCisgIFxmaQorICAlCisgIFxkb3N1YmluZHdyaXRlCisgICUKKyAgXGlmeFxsYXN0c2tpcG1hY3JvXHplcm9za2lwbWFjcm8KKyAgICAlIElmIFxsYXN0c2tpcCB3YXMgemVybywgcGVyaGFwcyB0aGUgbGFzdCBpdGVtIHdhcyBhIHBlbmFsdHksIGFuZAorICAgICUgcGVyaGFwcyBpdCB3YXMgPj0xMDAwMCwgZS5nLiwgYSBcbm9icmVhay4gIEluIHRoYXQgY2FzZSwgd2Ugd2FudAorICAgICUgdG8gcmUtaW5zZXJ0IHRoZSBzYW1lIHBlbmFsdHkgKHZhbHVlcyA+MTAwMDAgYXJlIHVzZWQgZm9yIHZhcmlvdXMKKyAgICAlIHNpZ25hbHMpOyBzaW5jZSB3ZSBqdXN0IGluc2VydGVkIGEgbm9uLWRpc2NhcmRhYmxlIGl0ZW0sIGFueQorICAgICUgZm9sbG93aW5nIGdsdWUgKHN1Y2ggYXMgYSBccGFyc2tpcCkgd291bGQgYmUgYSBicmVha3BvaW50LiAgRm9yIGV4YW1wbGU6CisgICAgJSAKKyAgICAlICAgQGRlZmZuIGRlZmZuLXdoYXRldmVyCisgICAgJSAgIEB2aW5kZXggaW5kZXgtd2hhdGV2ZXIKKyAgICAlICAgRGVzY3JpcHRpb24uCisgICAgJSB3b3VsZCBhbGxvdyBhIGJyZWFrIGJldHdlZW4gdGhlIGluZGV4LXdoYXRldmVyIHdoYXRzaXQKKyAgICAlIGFuZCB0aGUgIkRlc2NyaXB0aW9uLiIgcGFyYWdyYXBoLgorICAgIFxpZm51bVxjb3VudDI1NT45OTk5IFxwZW5hbHR5XGNvdW50MjU1IFxmaQorICBcZWxzZQorICAgICUgT24gdGhlIG90aGVyIGhhbmQsIGlmIHdlIGhhZCBhIG5vbnplcm8gXGxhc3Rza2lwLAorICAgICUgdGhpcyBtYWtlLXVwIGdsdWUgd291bGQgYmUgcHJlY2VkZWQgYnkgYSBub24tZGlzY2FyZGFibGUgaXRlbQorICAgICUgKHRoZSB3aGF0c2l0IGZyb20gdGhlIFx3cml0ZSksIHNvIHdlIG11c3QgaW5zZXJ0IGEgXG5vYnJlYWsuCisgICAgXG5vYnJlYWtcdnNraXBcc2tpcDAKKyAgXGZpCit9CisKKyUgVGhlIGluZGV4IGVudHJ5IHdyaXR0ZW4gaW4gdGhlIGZpbGUgYWN0dWFsbHkgbG9va3MgbGlrZQorJSAgXGVudHJ5IHtzb3J0c3RyaW5nfXtwYWdlfXt0b3BpY30KKyUgb3IKKyUgIFxlbnRyeSB7c29ydHN0cmluZ317cGFnZX17dG9waWN9e3N1YnRvcGljfQorJSBUaGUgdGV4aW5kZXggcHJvZ3JhbSByZWFkcyBpbiB0aGVzZSBmaWxlcyBhbmQgd3JpdGVzIGZpbGVzCislIGNvbnRhaW5pbmcgdGhlc2Uga2luZHMgb2YgbGluZXM6CislICBcaW5pdGlhbCB7Y30KKyUgICAgIGJlZm9yZSB0aGUgZmlyc3QgdG9waWMgd2hvc2UgaW5pdGlhbCBpcyBjCislICBcZW50cnkge3RvcGljfXtwYWdlbGlzdH0KKyUgICAgIGZvciBhIHRvcGljIHRoYXQgaXMgdXNlZCB3aXRob3V0IHN1YnRvcGljcworJSAgXHByaW1hcnkge3RvcGljfQorJSAgICAgZm9yIHRoZSBiZWdpbm5pbmcgb2YgYSB0b3BpYyB0aGF0IGlzIHVzZWQgd2l0aCBzdWJ0b3BpY3MKKyUgIFxzZWNvbmRhcnkge3N1YnRvcGljfXtwYWdlbGlzdH0KKyUgICAgIGZvciBlYWNoIHN1YnRvcGljLgorCislIERlZmluZSB0aGUgdXNlci1hY2Nlc3NpYmxlIGluZGV4aW5nIGNvbW1hbmRzCislIEBmaW5kZXgsIEB2aW5kZXgsIEBraW5kZXgsIEBjaW5kZXguCisKK1xkZWZcZmluZGV4IHtcZm5pbmRleH0KK1xkZWZca2luZGV4IHtca3lpbmRleH0KK1xkZWZcY2luZGV4IHtcY3BpbmRleH0KK1xkZWZcdmluZGV4IHtcdnJpbmRleH0KK1xkZWZcdGluZGV4IHtcdHBpbmRleH0KK1xkZWZccGluZGV4IHtccGdpbmRleH0KKworXGRlZlxjaW5kZXhzdWIge1xiZWdpbmdyb3VwXG9iZXlsaW5lc1xjaW5kZXhzdWJ9Cit7XG9iZXlsaW5lcyAlCitcZ2RlZlxjaW5kZXhzdWIgIiMxIiAjMl5eTXtcZW5kZ3JvdXAgJQorXGRvc3ViaW5ke2NwfXsjMn17IzF9fX0KKworJSBEZWZpbmUgdGhlIG1hY3JvcyB1c2VkIGluIGZvcm1hdHRpbmcgb3V0cHV0IG9mIHRoZSBzb3J0ZWQgaW5kZXggbWF0ZXJpYWwuCisKKyUgQHByaW50aW5kZXggY2F1c2VzIGEgcGFydGljdWxhciBpbmRleCAodGhlID8/cyBmaWxlKSB0byBnZXQgcHJpbnRlZC4KKyUgSXQgZG9lcyBub3QgcHJpbnQgYW55IGNoYXB0ZXIgaGVhZGluZyAodXN1YWxseSBhbiBAdW5udW1iZXJlZCkuCislCitccGFyc2VhcmdkZWZccHJpbnRpbmRleHtcYmVnaW5ncm91cAorICBcZG9icmVhayBcY2hhcGhlYWRpbmdza2lwezEwMDAwfSUKKyAgJQorICBcc21hbGxmb250cyBccm0KKyAgXHRvbGVyYW5jZSA9IDk1MDAKKyAgXGV2ZXJ5cGFyID0ge30lIGRvbid0IHdhbnQgdGhlIFxrZXJuXC1wYXJpbmRlbnQgZnJvbSBpbmRlbnRhdGlvbiBzdXBwcmVzc2lvbi4KKyAgJQorICAlIFNlZSBpZiB0aGUgaW5kZXggZmlsZSBleGlzdHMgYW5kIGlzIG5vbmVtcHR5LgorICAlIENoYW5nZSBjYXRjb2RlIG9mIEAgaGVyZSBzbyB0aGF0IGlmIHRoZSBpbmRleCBmaWxlIGNvbnRhaW5zCisgICUgXGluaXRpYWwge0B9CisgICUgYXMgaXRzIGZpcnN0IGxpbmUsIFRlWCBkb2Vzbid0IGNvbXBsYWluIGFib3V0IG1pc21hdGNoZWQgYnJhY2VzCisgICUgKGJlY2F1c2UgaXQgdGhpbmtzIEB9IGlzIGEgY29udHJvbCBzZXF1ZW5jZSkuCisgIFxjYXRjb2RlYFxAID0gMTEKKyAgXG9wZW5pbiAxIFxqb2JuYW1lLiMxcworICBcaWZlb2YgMQorICAgICUgXGVuZGRvdWJsZWNvbHVtbnMgZ2V0cyBjb25mdXNlZCBpZiB0aGVyZSBpcyBubyB0ZXh0IGluIHRoZSBpbmRleCwKKyAgICAlIGFuZCBpdCBsb3NlcyB0aGUgY2hhcHRlciB0aXRsZSBhbmQgdGhlIGF1eCBmaWxlIGVudHJpZXMgZm9yIHRoZQorICAgICUgaW5kZXguICBUaGUgZWFzaWVzdCB3YXkgdG8gcHJldmVudCB0aGlzIHByb2JsZW0gaXMgdG8gbWFrZSBzdXJlCisgICAgJSB0aGVyZSBpcyBzb21lIHRleHQuCisgICAgXHB1dHdvcmRJbmRleE5vbmV4aXN0ZW50CisgIFxlbHNlCisgICAgJQorICAgICUgSWYgdGhlIGluZGV4IGZpbGUgZXhpc3RzIGJ1dCBpcyBlbXB0eSwgdGhlbiBcb3BlbmluIGxlYXZlcyBcaWZlb2YKKyAgICAlIGZhbHNlLiAgV2UgaGF2ZSB0byBtYWtlIFRlWCB0cnkgdG8gcmVhZCBzb21ldGhpbmcgZnJvbSB0aGUgZmlsZSwgc28KKyAgICAlIGl0IGNhbiBkaXNjb3ZlciBpZiB0aGVyZSBpcyBhbnl0aGluZyBpbiBpdC4KKyAgICBccmVhZCAxIHRvIFx0ZW1wCisgICAgXGlmZW9mIDEKKyAgICAgIFxwdXR3b3JkSW5kZXhJc0VtcHR5CisgICAgXGVsc2UKKyAgICAgICUgSW5kZXggZmlsZXMgYXJlIGFsbW9zdCBUZXhpbmZvIHNvdXJjZSwgYnV0IHdlIHVzZSBcIGFzIHRoZSBlc2NhcGUKKyAgICAgICUgY2hhcmFjdGVyLiAgSXQgd291bGQgYmUgYmV0dGVyIHRvIHVzZSBALCBidXQgdGhhdCdzIHRvbyBiaWcgYSBjaGFuZ2UKKyAgICAgICUgdG8gbWFrZSByaWdodCBub3cuCisgICAgICBcZGVmXGluZGV4YmFja3NsYXNoe1xiYWNrc2xhc2hjdXJmb250fSUKKyAgICAgIFxjYXRjb2RlYFxcID0gMAorICAgICAgXGVzY2FwZWNoYXIgPSBgXFwKKyAgICAgIFxiZWdpbmRvdWJsZWNvbHVtbnMKKyAgICAgIFxpbnB1dCBcam9ibmFtZS4jMXMKKyAgICAgIFxlbmRkb3VibGVjb2x1bW5zCisgICAgXGZpCisgIFxmaQorICBcY2xvc2VpbiAxCitcZW5kZ3JvdXB9CisKKyUgVGhlc2UgbWFjcm9zIGFyZSB1c2VkIGJ5IHRoZSBzb3J0ZWQgaW5kZXggZmlsZSBpdHNlbGYuCislIENoYW5nZSB0aGVtIHRvIGNvbnRyb2wgdGhlIGFwcGVhcmFuY2Ugb2YgdGhlIGluZGV4LgorCitcZGVmXGluaXRpYWwjMXt7JQorICAlIFNvbWUgbWlub3IgZm9udCBjaGFuZ2VzIGZvciB0aGUgc3BlY2lhbCBjaGFyYWN0ZXJzLgorICBcbGV0XHRlbnR0PVxzZWN0dCBcbGV0XHR0PVxzZWN0dCBcbGV0XHNmPVxzZWN0dAorICAlCisgICUgUmVtb3ZlIGFueSBnbHVlIHdlIG1heSBoYXZlLCB3ZSdsbCBiZSBpbnNlcnRpbmcgb3VyIG93bi4KKyAgXHJlbW92ZWxhc3Rza2lwCisgICUKKyAgJSBXZSBsaWtlIGJyZWFrcyBiZWZvcmUgdGhlIGluZGV4IGluaXRpYWxzLCBzbyBpbnNlcnQgYSBib251cy4KKyAgXG5vYnJlYWsKKyAgXHZza2lwIDBwdCBwbHVzIDNcYmFzZWxpbmVza2lwCisgIFxwZW5hbHR5IDAKKyAgXHZza2lwIDBwdCBwbHVzIC0zXGJhc2VsaW5lc2tpcAorICAlCisgICUgVHlwZXNldCB0aGUgaW5pdGlhbC4gIE1ha2luZyB0aGlzIGFkZCB1cCB0byBhIHdob2xlIG51bWJlciBvZgorICAlIGJhc2VsaW5lc2tpcHMgaW5jcmVhc2VzIHRoZSBjaGFuY2Ugb2YgdGhlIGRvdHMgbGluaW5nIHVwIGZyb20gY29sdW1uCisgICUgdG8gY29sdW1uLiAgSXQgc3RpbGwgd29uJ3Qgb2Z0ZW4gYmUgcGVyZmVjdCwgYmVjYXVzZSBvZiB0aGUgc3RyZXRjaAorICAlIHdlIG5lZWQgYmVmb3JlIGVhY2ggZW50cnksIGJ1dCBpdCdzIGJldHRlci4KKyAgJQorICAlIE5vIHNocmluayBiZWNhdXNlIGl0IGNvbmZ1c2VzIFxiYWxhbmNlY29sdW1ucy4KKyAgXHZza2lwIDEuNjdcYmFzZWxpbmVza2lwIHBsdXMgLjVcYmFzZWxpbmVza2lwCisgIFxsZWZ0bGluZXtcc2VjYmYgIzF9JQorICAlIERvIG91ciBiZXN0IG5vdCB0byBicmVhayBhZnRlciB0aGUgaW5pdGlhbC4KKyAgXG5vYnJlYWsKKyAgXHZza2lwIC4zM1xiYXNlbGluZXNraXAgcGx1cyAuMVxiYXNlbGluZXNraXAKK319CisKKyUgXGVudHJ5IHR5cGVzZXRzIGEgcGFyYWdyYXBoIGNvbnNpc3Rpbmcgb2YgdGhlIHRleHQgKCMxKSwgZG90IGxlYWRlcnMsIGFuZAorJSB0aGVuIHBhZ2UgbnVtYmVyICgjMikgZmx1c2hlZCB0byB0aGUgcmlnaHQgbWFyZ2luLiAgSXQgaXMgdXNlZCBmb3IgaW5kZXgKKyUgYW5kIHRhYmxlIG9mIGNvbnRlbnRzIGVudHJpZXMuICBUaGUgcGFyYWdyYXBoIGlzIGluZGVudGVkIGJ5IFxsZWZ0c2tpcC4KKyUKKyUgQSBzdHJhaWdodGZvcndhcmQgaW1wbGVtZW50YXRpb24gd291bGQgc3RhcnQgbGlrZSB0aGlzOgorJQlcZGVmXGVudHJ5IzEjMnsuLi4KKyUgQnV0IHRoaXMgZnJvemVzIHRoZSBjYXRjb2RlcyBpbiB0aGUgYXJndW1lbnQsIGFuZCBjYW4gY2F1c2UgcHJvYmxlbXMgdG8KKyUgQGNvZGUsIHdoaWNoIHNldHMgLSBhY3RpdmUuICBUaGlzIHByb2JsZW0gd2FzIGZpeGVkIGJ5IGEga2x1ZGdlLS0tCislIGBgLScnIHdhcyBhY3RpdmUgdGhyb3VnaG91dCB3aG9sZSBpbmRleCwgYnV0IHRoaXMgaXNuJ3QgcmVhbGx5IHJpZ2h0LgorJQorJSBUaGUgcmlnaHQgc29sdXRpb24gaXMgdG8gcHJldmVudCBcZW50cnkgZnJvbSBzd2FsbG93aW5nIHRoZSB3aG9sZSB0ZXh0LgorJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0ta2FzYWwsIDIxbm92MDMKK1xkZWZcZW50cnl7JQorICBcYmVnaW5ncm91cAorICAgICUKKyAgICAlIFN0YXJ0IGEgbmV3IHBhcmFncmFwaCBpZiBuZWNlc3NhcnksIHNvIG91ciBhc3NpZ25tZW50cyBiZWxvdyBjYW4ndAorICAgICUgYWZmZWN0IHByZXZpb3VzIHRleHQuCisgICAgXHBhcgorICAgICUKKyAgICAlIERvIG5vdCBmaWxsIG91dCB0aGUgbGFzdCBsaW5lIHdpdGggd2hpdGUgc3BhY2UuCisgICAgXHBhcmZpbGxza2lwID0gMGluCisgICAgJQorICAgICUgTm8gZXh0cmEgc3BhY2UgYWJvdmUgdGhpcyBwYXJhZ3JhcGguCisgICAgXHBhcnNraXAgPSAwaW4KKyAgICAlCisgICAgJSBEbyBub3QgcHJlZmVyIGEgc2VwYXJhdGUgbGluZSBlbmRpbmcgd2l0aCBhIGh5cGhlbiB0byBmZXdlciBsaW5lcy4KKyAgICBcZmluYWxoeXBoZW5kZW1lcml0cyA9IDAKKyAgICAlCisgICAgJSBcaGFuZ2luZGVudCBpcyBvbmx5IHJlbGV2YW50IHdoZW4gdGhlIGVudHJ5IHRleHQgYW5kIHBhZ2UgbnVtYmVyCisgICAgJSBkb24ndCBib3RoIGZpdCBvbiBvbmUgbGluZS4gIEluIHRoYXQgY2FzZSwgYm9iIHN1Z2dlc3RzIHN0YXJ0aW5nIHRoZQorICAgICUgZG90cyBwcmV0dHkgZmFyIG92ZXIgb24gdGhlIGxpbmUuICBVbmZvcnR1bmF0ZWx5LCBhIGxhcmdlCisgICAgJSBpbmRlbnRhdGlvbiBsb29rcyB3cm9uZyB3aGVuIHRoZSBlbnRyeSB0ZXh0IGl0c2VsZiBpcyBicm9rZW4gYWNyb3NzCisgICAgJSBsaW5lcy4gIFNvIHdlIHVzZSBhIHNtYWxsIGluZGVudGF0aW9uIGFuZCBwdXQgdXAgd2l0aCBsb25nIGxlYWRlcnMuCisgICAgJQorICAgICUgXGhhbmdhZnRlciBpcyByZXNldCB0byAxICh3aGljaCBpcyB0aGUgdmFsdWUgd2Ugd2FudCkgYXQgdGhlIHN0YXJ0CisgICAgJSBvZiBlYWNoIHBhcmFncmFwaCwgc28gd2UgbmVlZCBub3QgZG8gYW55dGhpbmcgd2l0aCB0aGF0LgorICAgIFxoYW5naW5kZW50ID0gMmVtCisgICAgJQorICAgICUgV2hlbiB0aGUgZW50cnkgdGV4dCBuZWVkcyB0byBiZSBicm9rZW4sIGp1c3QgZmlsbCBvdXQgdGhlIGZpcnN0IGxpbmUKKyAgICAlIHdpdGggYmxhbmsgc3BhY2UuCisgICAgXHJpZ2h0c2tpcCA9IDBwdCBwbHVzMWZpbAorICAgICUKKyAgICAlIEEgYml0IG9mIHN0cmV0Y2ggYmVmb3JlIGVhY2ggZW50cnkgZm9yIHRoZSBiZW5lZml0IG9mIGJhbGFuY2luZworICAgICUgY29sdW1ucy4KKyAgICBcdnNraXAgMHB0IHBsdXMxcHQKKyAgICAlCisgICAgJSBTd2FsbG93IHRoZSBsZWZ0IGJyYWNlIG9mIHRoZSB0ZXh0IChmaXJzdCBwYXJhbWV0ZXIpOgorICAgIFxhZnRlcmFzc2lnbm1lbnRcZG9lbnRyeQorICAgIFxsZXRcdGVtcCA9Cit9CitcZGVmXGRvZW50cnl7JQorICAgIFxiZ3JvdXAgJSBJbnN0ZWFkIG9mIHRoZSBzd2FsbG93ZWQgYnJhY2UuCisgICAgICBcbm9pbmRlbnQKKyAgICAgIFxhZnRlcmdyb3VwXGZpbmlzaGVudHJ5CisgICAgICAlIEFuZCBub3cgY29tZXMgdGhlIHRleHQgb2YgdGhlIGVudHJ5LgorfQorXGRlZlxmaW5pc2hlbnRyeSMxeyUKKyAgICAlICMxIGlzIHRoZSBwYWdlIG51bWJlci4KKyAgICAlCisgICAgJSBUaGUgZm9sbG93aW5nIGlzIGtsdWRnZWQgdG8gbm90IG91dHB1dCBhIGxpbmUgb2YgZG90cyBpbiB0aGUgaW5kZXggaWYKKyAgICAlIHRoZXJlIGFyZSBubyBwYWdlIG51bWJlcnMuICBUaGUgbmV4dCBwZXJzb24gd2hvIGJyZWFrcyB0aGlzIHdpbGwgYmUKKyAgICAlIGN1cnNlZCBieSBhIFVuaXggZGFlbW9uLgorICAgIFxkZWZcdGVtcGF7e1xybSB9fSUKKyAgICBcZGVmXHRlbXBieyMxfSUKKyAgICBcZWRlZlx0ZW1wY3tcdGVtcGF9JQorICAgIFxlZGVmXHRlbXBke1x0ZW1wYn0lCisgICAgXGlmeFx0ZW1wY1x0ZW1wZAorICAgICAgXCAlCisgICAgXGVsc2UKKyAgICAgICUKKyAgICAgICUgSWYgd2UgbXVzdCwgcHV0IHRoZSBwYWdlIG51bWJlciBvbiBhIGxpbmUgb2YgaXRzIG93biwgYW5kIGZpbGwgb3V0CisgICAgICAlIHRoaXMgbGluZSB3aXRoIGJsYW5rIHNwYWNlLiAgKFRoZSBcaGZpbCBpcyBvdmVyd2hlbG1lZCB3aXRoIHRoZQorICAgICAgJSBmaWxsIGxlYWRlcnMgZ2x1ZSBpbiBcaW5kZXhkb3RmaWxsIGlmIHRoZSBwYWdlIG51bWJlciBkb2VzIGZpdC4pCisgICAgICBcaGZpbFxwZW5hbHR5NTAKKyAgICAgIFxudWxsXG5vYnJlYWtcaW5kZXhkb3RmaWxsICUgSGF2ZSBsZWFkZXJzIGJlZm9yZSB0aGUgcGFnZSBudW1iZXIuCisgICAgICAlCisgICAgICAlIFRoZSBgXCAnIGhlcmUgaXMgcmVtb3ZlZCBieSB0aGUgaW1wbGljaXQgXHVuc2tpcCB0aGF0IFRlWCBkb2VzIGFzCisgICAgICAlIHBhcnQgb2YgKHRoZSBwcmltaXRpdmUpIFxwYXIuICBXaXRob3V0IGl0LCBhIHNwdXJpb3VzIHVuZGVyZnVsbAorICAgICAgJSBcaGJveCBlbnN1ZXMuCisgICAgICBcaWZwZGYKKwlccGRmZ2V0dG9rcyMxLiUKKwlcIFx0aGVcdG9rc0EKKyAgICAgIFxlbHNlCisJXCAjMSUKKyAgICAgIFxmaQorICAgIFxmaQorICAgIFxwYXIKKyAgXGVuZGdyb3VwCit9CisKKyUgTGlrZSBwbGFpbi50ZXgncyBcZG90ZmlsbCwgZXhjZXB0IHVzZXMgdXAgYXQgbGVhc3QgMSBlbS4KK1xkZWZcaW5kZXhkb3RmaWxse1xjbGVhZGVycworICBcaGJveHskXG1hdGhzdXJyb3VuZD0wcHQgXG1rZXJuMS41bXUuXG1rZXJuMS41bXUkfVxoc2tpcCAxZW0gcGx1cyAxZmlsbH0KKworXGRlZlxwcmltYXJ5ICMxe1xsaW5leyMxXGhmaWx9fQorCitcbmV3c2tpcFxzZWNvbmRhcnlpbmRlbnQgXHNlY29uZGFyeWluZGVudD0wLjVjbQorXGRlZlxzZWNvbmRhcnkjMSMye3slCisgIFxwYXJmaWxsc2tpcD0waW4KKyAgXHBhcnNraXA9MGluCisgIFxoYW5naW5kZW50PTFpbgorICBcaGFuZ2FmdGVyPTEKKyAgXG5vaW5kZW50XGhza2lwXHNlY29uZGFyeWluZGVudFxoYm94eyMxfVxpbmRleGRvdGZpbGwKKyAgXGlmcGRmCisgICAgXHBkZmdldHRva3MjMi5cIFx0aGVcdG9rc0EgJSBUaGUgcGFnZSBudW1iZXIgZW5kcyB0aGUgcGFyYWdyYXBoLgorICBcZWxzZQorICAgICMyCisgIFxmaQorICBccGFyCit9fQorCislIERlZmluZSB0d28tY29sdW1uIG1vZGUsIHdoaWNoIHdlIHVzZSB0byB0eXBlc2V0IGluZGV4ZXMuCislIEFkYXB0ZWQgZnJvbSB0aGUgVGVYYm9vaywgcGFnZSA0MTYsIHdoaWNoIGlzIHRvIHNheSwKKyUgdGhlIG1hbm1hYy50ZXggZm9ybWF0IHVzZWQgdG8gcHJpbnQgdGhlIFRlWGJvb2sgaXRzZWxmLgorXGNhdGNvZGVgXEA9MTEKKworXG5ld2JveFxwYXJ0aWFscGFnZQorXG5ld2RpbWVuXGRvdWJsZWNvbHVtbmhzaXplCisKK1xkZWZcYmVnaW5kb3VibGVjb2x1bW5ze1xiZWdpbmdyb3VwICUgZW5kZWQgYnkgXGVuZGRvdWJsZWNvbHVtbnMKKyAgJSBHcmFiIGFueSBzaW5nbGUtY29sdW1uIG1hdGVyaWFsIGFib3ZlIHVzLgorICBcb3V0cHV0ID0geyUKKyAgICAlCisgICAgJSBIZXJlIGlzIGEgcG9zc2liaWxpdHkgbm90IGZvcmVzZWVuIGluIG1hbm1hYzogaWYgd2UgYWNjdW11bGF0ZSBhCisgICAgJSB3aG9sZSBsb3Qgb2YgbWF0ZXJpYWwsIHdlIG1pZ2h0IGVuZCB1cCBjYWxsaW5nIHRoaXMgXG91dHB1dAorICAgICUgcm91dGluZSB0d2ljZSBpbiBhIHJvdyAoc2VlIHRoZSBkb3VibGVjb2wtbG9zZSB0ZXN0LCB3aGljaCBpcworICAgICUgZXNzZW50aWFsbHkgYSBjb3VwbGUgb2YgaW5kZXhlcyB3aXRoIEBzZXRjaGFwdGVybmV3cGFnZSBvZmYpLiAgSW4KKyAgICAlIHRoYXQgY2FzZSB3ZSBqdXN0IHNoaXAgb3V0IHdoYXQgaXMgaW4gXHBhcnRpYWxwYWdlIHdpdGggdGhlIG5vcm1hbAorICAgICUgb3V0cHV0IHJvdXRpbmUuICBHZW5lcmFsbHksIFxwYXJ0aWFscGFnZSB3aWxsIGJlIGVtcHR5IHdoZW4gdGhpcworICAgICUgcnVucyBhbmQgdGhpcyB3aWxsIGJlIGEgbm8tb3AuICBTZWUgdGhlIGluZGV4c3ByZWFkLnRleCB0ZXN0IGNhc2UuCisgICAgXGlmdm9pZFxwYXJ0aWFscGFnZSBcZWxzZQorICAgICAgXG9uZXBhZ2VvdXR7XHBhZ2Vjb250ZW50c1xwYXJ0aWFscGFnZX0lCisgICAgXGZpCisgICAgJQorICAgIFxnbG9iYWxcc2V0Ym94XHBhcnRpYWxwYWdlID0gXHZib3h7JQorICAgICAgJSBVbnZib3ggdGhlIG1haW4gb3V0cHV0IHBhZ2UuCisgICAgICBcdW52Ym94XFBBR0UKKyAgICAgIFxrZXJuLVx0b3Bza2lwIFxrZXJuXGJhc2VsaW5lc2tpcAorICAgIH0lCisgIH0lCisgIFxlamVjdCAlIHJ1biB0aGF0IG91dHB1dCByb3V0aW5lIHRvIHNldCBccGFydGlhbHBhZ2UKKyAgJQorICAlIFVzZSB0aGUgZG91YmxlLWNvbHVtbiBvdXRwdXQgcm91dGluZSBmb3Igc3Vic2VxdWVudCBwYWdlcy4KKyAgXG91dHB1dCA9IHtcZG91YmxlY29sdW1ub3V0fSUKKyAgJQorICAlIENoYW5nZSB0aGUgcGFnZSBzaXplIHBhcmFtZXRlcnMuICBXZSBjb3VsZCBkbyB0aGlzIG9uY2Ugb3V0c2lkZSB0aGlzCisgICUgcm91dGluZSwgaW4gZWFjaCBvZiBAc21hbGxib29rLCBAYWZvdXJwYXBlciwgYW5kIHRoZSBkZWZhdWx0IDguNXgxMQorICAlIGZvcm1hdCwgYnV0IHRoZW4gd2UgcmVwZWF0IHRoZSBzYW1lIGNvbXB1dGF0aW9uLiAgUmVwZWF0aW5nIGEgY291cGxlCisgICUgb2YgYXNzaWdubWVudHMgb25jZSBwZXIgaW5kZXggaXMgY2xlYXJseSBtZWFuaW5nbGVzcyBmb3IgdGhlCisgICUgZXhlY3V0aW9uIHRpbWUsIHNvIHdlIG1heSBhcyB3ZWxsIGRvIGl0IGluIG9uZSBwbGFjZS4KKyAgJQorICAlIEZpcnN0IHdlIGhhbHZlIHRoZSBsaW5lIGxlbmd0aCwgbGVzcyBhIGxpdHRsZSBmb3IgdGhlIGd1dHRlciBiZXR3ZWVuCisgICUgdGhlIGNvbHVtbnMuICBXZSBjb21wdXRlIHRoZSBndXR0ZXIgYmFzZWQgb24gdGhlIGxpbmUgbGVuZ3RoLCBzbyBpdAorICAlIGNoYW5nZXMgYXV0b21hdGljYWxseSB3aXRoIHRoZSBwYXBlciBmb3JtYXQuICBUaGUgbWFnaWMgY29uc3RhbnQKKyAgJSBiZWxvdyBpcyBjaG9zZW4gc28gdGhhdCB0aGUgZ3V0dGVyIGhhcyB0aGUgc2FtZSB2YWx1ZSAod2VsbCwgKy08MXB0KQorICAlIGFzIGl0IGRpZCB3aGVuIHdlIGhhcmQtY29kZWQgaXQuCisgICUKKyAgJSBXZSBwdXQgdGhlIHJlc3VsdCBpbiBhIHNlcGFyYXRlIHJlZ2lzdGVyLCBcZG91YmxlY29sdW1oc2l6ZSwgc28gd2UKKyAgJSBjYW4gcmVzdG9yZSBpdCBpbiBccGFnZXNvZmFyLCBhZnRlciBcaHNpemUgaXRzZWxmIGhhcyAocG90ZW50aWFsbHkpCisgICUgYmVlbiBjbG9iYmVyZWQuCisgICUKKyAgXGRvdWJsZWNvbHVtbmhzaXplID0gXGhzaXplCisgICAgXGFkdmFuY2VcZG91YmxlY29sdW1uaHNpemUgYnkgLS4wNDE1NFxoc2l6ZQorICAgIFxkaXZpZGVcZG91YmxlY29sdW1uaHNpemUgYnkgMgorICBcaHNpemUgPSBcZG91YmxlY29sdW1uaHNpemUKKyAgJQorICAlIERvdWJsZSB0aGUgXHZzaXplIGFzIHdlbGwuICAoV2UgZG9uJ3QgbmVlZCBhIHNlcGFyYXRlIHJlZ2lzdGVyIGhlcmUsCisgICUgc2luY2Ugbm9ib2R5IGNsb2JiZXJzIFx2c2l6ZS4pCisgIFx2c2l6ZSA9IDJcdnNpemUKK30KKworJSBUaGUgZG91YmxlLWNvbHVtbiBvdXRwdXQgcm91dGluZSBmb3IgYWxsIGRvdWJsZS1jb2x1bW4gcGFnZXMgZXhjZXB0CislIHRoZSBsYXN0LgorJQorXGRlZlxkb3VibGVjb2x1bW5vdXR7JQorICBcc3BsaXR0b3Bza2lwPVx0b3Bza2lwIFxzcGxpdG1heGRlcHRoPVxtYXhkZXB0aAorICAlIEdldCB0aGUgYXZhaWxhYmxlIHNwYWNlIGZvciB0aGUgZG91YmxlIGNvbHVtbnMgLS0gdGhlIG5vcm1hbAorICAlICh1bmRvdWJsZWQpIHBhZ2UgaGVpZ2h0IG1pbnVzIGFueSBtYXRlcmlhbCBsZWZ0IG92ZXIgZnJvbSB0aGUKKyAgJSBwcmV2aW91cyBwYWdlLgorICBcZGltZW5AID0gXHZzaXplCisgIFxkaXZpZGVcZGltZW5AIGJ5IDIKKyAgXGFkdmFuY2VcZGltZW5AIGJ5IC1caHRccGFydGlhbHBhZ2UKKyAgJQorICAlIGJveDAgd2lsbCBiZSB0aGUgbGVmdC1oYW5kIGNvbHVtbiwgYm94MiB0aGUgcmlnaHQuCisgIFxzZXRib3gwPVx2c3BsaXQyNTUgdG9cZGltZW5AIFxzZXRib3gyPVx2c3BsaXQyNTUgdG9cZGltZW5ACisgIFxvbmVwYWdlb3V0XHBhZ2Vzb2ZhcgorICBcdW52Ym94MjU1CisgIFxwZW5hbHR5XG91dHB1dHBlbmFsdHkKK30KKyUKKyUgUmUtb3V0cHV0IHRoZSBjb250ZW50cyBvZiB0aGUgb3V0cHV0IHBhZ2UgLS0gYW55IHByZXZpb3VzIG1hdGVyaWFsLAorJSBmb2xsb3dlZCBieSB0aGUgdHdvIGJveGVzIHdlIGp1c3Qgc3BsaXQsIGluIGJveDAgYW5kIGJveDIuCitcZGVmXHBhZ2Vzb2ZhcnslCisgIFx1bnZib3hccGFydGlhbHBhZ2UKKyAgJQorICBcaHNpemUgPSBcZG91YmxlY29sdW1uaHNpemUKKyAgXHdkMD1caHNpemUgXHdkMj1caHNpemUKKyAgXGhib3ggdG9ccGFnZXdpZHRoe1xib3gwXGhmaWxcYm94Mn0lCit9CislCislIEFsbCBkb25lIHdpdGggZG91YmxlIGNvbHVtbnMuCitcZGVmXGVuZGRvdWJsZWNvbHVtbnN7JQorICBcb3V0cHV0ID0geyUKKyAgICAlIFNwbGl0IHRoZSBsYXN0IG9mIHRoZSBkb3VibGUtY29sdW1uIG1hdGVyaWFsLiAgTGVhdmUgaXQgb24gdGhlCisgICAgJSBjdXJyZW50IHBhZ2UsIG5vIGF1dG9tYXRpYyBwYWdlIGJyZWFrLgorICAgIFxiYWxhbmNlY29sdW1ucworICAgICUKKyAgICAlIElmIHdlIGVuZCB1cCBzcGxpdHRpbmcgdG9vIG11Y2ggbWF0ZXJpYWwgZm9yIHRoZSBjdXJyZW50IHBhZ2UsCisgICAgJSB0aG91Z2gsIHRoZXJlIHdpbGwgYmUgYW5vdGhlciBwYWdlIGJyZWFrIHJpZ2h0IGFmdGVyIHRoaXMgXG91dHB1dAorICAgICUgaW52b2NhdGlvbiBlbmRzLiAgSGF2aW5nIGNhbGxlZCBcYmFsYW5jZWNvbHVtbnMgb25jZSwgd2UgZG8gbm90CisgICAgJSB3YW50IHRvIGNhbGwgaXQgYWdhaW4uICBUaGVyZWZvcmUsIHJlc2V0IFxvdXRwdXQgdG8gaXRzIG5vcm1hbAorICAgICUgZGVmaW5pdGlvbiByaWdodCBhd2F5LiAgKFdlIGhvcGUgXGJhbGFuY2Vjb2x1bW5zIHdpbGwgbmV2ZXIgYmUKKyAgICAlIGNhbGxlZCBvbiB0byBiYWxhbmNlIHRvbyBtdWNoIG1hdGVyaWFsLCBidXQgaWYgaXQgaXMsIHRoaXMgbWFrZXMKKyAgICAlIHRoZSBvdXRwdXQgc29tZXdoYXQgbW9yZSBwYWxhdGFibGUuKQorICAgIFxnbG9iYWxcb3V0cHV0ID0ge1xvbmVwYWdlb3V0e1xwYWdlY29udGVudHNcUEFHRX19JQorICB9JQorICBcZWplY3QKKyAgXGVuZGdyb3VwICUgc3RhcnRlZCBpbiBcYmVnaW5kb3VibGVjb2x1bW5zCisgICUKKyAgJSBccGFnZWdvYWwgd2FzIHNldCB0byB0aGUgZG91YmxlZCBcdnNpemUgYWJvdmUsIHNpbmNlIHdlIHJlc3RhcnRlZAorICAlIHRoZSBjdXJyZW50IHBhZ2UuICBXZSdyZSBub3cgYmFjayB0byBub3JtYWwgc2luZ2xlLWNvbHVtbgorICAlIHR5cGVzZXR0aW5nLCBzbyByZXNldCBccGFnZWdvYWwgdG8gdGhlIG5vcm1hbCBcdnNpemUgKGFmdGVyIHRoZQorICAlIFxlbmRncm91cCB3aGVyZSBcdnNpemUgZ290IHJlc3RvcmVkKS4KKyAgXHBhZ2Vnb2FsID0gXHZzaXplCit9CislCislIENhbGxlZCBhdCB0aGUgZW5kIG9mIHRoZSBkb3VibGUgY29sdW1uIG1hdGVyaWFsLgorXGRlZlxiYWxhbmNlY29sdW1uc3slCisgIFxzZXRib3gwID0gXHZib3h7XHVudmJveDI1NX0lIGxpa2UgXGJveDI1NSBidXQgbW9yZSBlZmZpY2llbnQsIHNlZSBwLjEyMC4KKyAgXGRpbWVuQCA9IFxodDAKKyAgXGFkdmFuY2VcZGltZW5AIGJ5IFx0b3Bza2lwCisgIFxhZHZhbmNlXGRpbWVuQCBieS1cYmFzZWxpbmVza2lwCisgIFxkaXZpZGVcZGltZW5AIGJ5IDIgJSB0YXJnZXQgdG8gc3BsaXQgdG8KKyAgJWRlYnVnXG1lc3NhZ2V7ZmluYWwgMi1jb2x1bW4gbWF0ZXJpYWwgaGVpZ2h0PVx0aGVcaHQwLCB0YXJnZXQ9XHRoZVxkaW1lbkAufSUKKyAgXHNwbGl0dG9wc2tpcCA9IFx0b3Bza2lwCisgICUgTG9vcCB1bnRpbCB3ZSBnZXQgYSBkZWNlbnQgYnJlYWtwb2ludC4KKyAgeyUKKyAgICBcdmJhZG5lc3MgPSAxMDAwMAorICAgIFxsb29wCisgICAgICBcZ2xvYmFsXHNldGJveDMgPSBcY29weTAKKyAgICAgIFxnbG9iYWxcc2V0Ym94MSA9IFx2c3BsaXQzIHRvIFxkaW1lbkAKKyAgICBcaWZkaW1caHQzPlxkaW1lbkAKKyAgICAgIFxnbG9iYWxcYWR2YW5jZVxkaW1lbkAgYnkgMXB0CisgICAgXHJlcGVhdAorICB9JQorICAlZGVidWdcbWVzc2FnZXtzcGxpdCB0byBcdGhlXGRpbWVuQCwgY29sdW1uIGhlaWdodHM6IFx0aGVcaHQxLCBcdGhlXGh0My59JQorICBcc2V0Ym94MD1cdmJveCB0b1xkaW1lbkB7XHVudmJveDF9JQorICBcc2V0Ym94Mj1cdmJveCB0b1xkaW1lbkB7XHVudmJveDN9JQorICAlCisgIFxwYWdlc29mYXIKK30KK1xjYXRjb2RlYFxAID0gXG90aGVyCisKKworXG1lc3NhZ2V7c2VjdGlvbmluZyx9CislIENoYXB0ZXJzLCBzZWN0aW9ucywgZXRjLgorCislIFx1bm51bWJlcmVkbm8gaXMgYW4gb3h5bW9yb24sIG9mIGNvdXJzZS4gIEJ1dCB3ZSBjb3VudCB0aGUgdW5udW1iZXJlZAorJSBzZWN0aW9ucyBzbyB0aGF0IHdlIGNhbiByZWZlciB0byB0aGVtIHVuYW1iaWd1b3VzbHkgaW4gdGhlIHBkZgorJSBvdXRsaW5lcyBieSB0aGVpciAic2VjdGlvbiBudW1iZXIiLiAgV2UgYXZvaWQgY29sbGlzaW9ucyB3aXRoIGNoYXB0ZXIKKyUgbnVtYmVycyBieSBzdGFydGluZyB0aGVtIGF0IDEwMDAwLiAgKElmIGEgZG9jdW1lbnQgZXZlciBoYXMgMTAwMDAKKyUgY2hhcHRlcnMsIHdlJ3JlIGluIHRyb3VibGUgYW55d2F5LCBJJ20gc3VyZS4pCitcbmV3Y291bnRcdW5udW1iZXJlZG5vIFx1bm51bWJlcmVkbm8gPSAxMDAwMAorXG5ld2NvdW50XGNoYXBubworXG5ld2NvdW50XHNlY25vICAgICAgICBcc2Vjbm89MAorXG5ld2NvdW50XHN1YnNlY25vICAgICBcc3Vic2Vjbm89MAorXG5ld2NvdW50XHN1YnN1YnNlY25vICBcc3Vic3Vic2Vjbm89MAorCislIFRoaXMgY291bnRlciBpcyBmdW5ueSBzaW5jZSBpdCBjb3VudHMgdGhyb3VnaCBjaGFyY29kZXMgb2YgbGV0dGVycyBBLCBCLCAuLi4KK1xuZXdjb3VudFxhcHBlbmRpeG5vICBcYXBwZW5kaXhubyA9IGBcQAorJQorJSBcZGVmXGFwcGVuZGl4bGV0dGVye1xjaGFyXHRoZVxhcHBlbmRpeG5vfQorJSBXZSBkbyB0aGUgZm9sbG93aW5nIHVnbHkgY29uZGl0aW9uYWwgaW5zdGVhZCBvZiB0aGUgYWJvdmUgc2ltcGxlCislIGNvbnN0cnVjdCBmb3IgdGhlIHNha2Ugb2YgcGRmdGV4LCB3aGljaCBuZWVkcyB0aGUgYWN0dWFsCislIGxldHRlciBpbiB0aGUgZXhwYW5zaW9uLCBub3QganVzdCB0eXBlc2V0LgorJQorXGRlZlxhcHBlbmRpeGxldHRlcnslCisgIFxpZm51bVxhcHBlbmRpeG5vPWBBIEElCisgIFxlbHNlXGlmbnVtXGFwcGVuZGl4bm89YEIgQiUKKyAgXGVsc2VcaWZudW1cYXBwZW5kaXhubz1gQyBDJQorICBcZWxzZVxpZm51bVxhcHBlbmRpeG5vPWBEIEQlCisgIFxlbHNlXGlmbnVtXGFwcGVuZGl4bm89YEUgRSUKKyAgXGVsc2VcaWZudW1cYXBwZW5kaXhubz1gRiBGJQorICBcZWxzZVxpZm51bVxhcHBlbmRpeG5vPWBHIEclCisgIFxlbHNlXGlmbnVtXGFwcGVuZGl4bm89YEggSCUKKyAgXGVsc2VcaWZudW1cYXBwZW5kaXhubz1gSSBJJQorICBcZWxzZVxpZm51bVxhcHBlbmRpeG5vPWBKIEolCisgIFxlbHNlXGlmbnVtXGFwcGVuZGl4bm89YEsgSyUKKyAgXGVsc2VcaWZudW1cYXBwZW5kaXhubz1gTCBMJQorICBcZWxzZVxpZm51bVxhcHBlbmRpeG5vPWBNIE0lCisgIFxlbHNlXGlmbnVtXGFwcGVuZGl4bm89YE4gTiUKKyAgXGVsc2VcaWZudW1cYXBwZW5kaXhubz1gTyBPJQorICBcZWxzZVxpZm51bVxhcHBlbmRpeG5vPWBQIFAlCisgIFxlbHNlXGlmbnVtXGFwcGVuZGl4bm89YFEgUSUKKyAgXGVsc2VcaWZudW1cYXBwZW5kaXhubz1gUiBSJQorICBcZWxzZVxpZm51bVxhcHBlbmRpeG5vPWBTIFMlCisgIFxlbHNlXGlmbnVtXGFwcGVuZGl4bm89YFQgVCUKKyAgXGVsc2VcaWZudW1cYXBwZW5kaXhubz1gVSBVJQorICBcZWxzZVxpZm51bVxhcHBlbmRpeG5vPWBWIFYlCisgIFxlbHNlXGlmbnVtXGFwcGVuZGl4bm89YFcgVyUKKyAgXGVsc2VcaWZudW1cYXBwZW5kaXhubz1gWCBYJQorICBcZWxzZVxpZm51bVxhcHBlbmRpeG5vPWBZIFklCisgIFxlbHNlXGlmbnVtXGFwcGVuZGl4bm89YFogWiUKKyAgJSBUaGUgXHRoZSBpcyBuZWNlc3NhcnksIGRlc3BpdGUgYXBwZWFyYW5jZXMsIGJlY2F1c2UgXGFwcGVuZGl4bGV0dGVyIGlzCisgICUgZXhwYW5kZWQgd2hpbGUgd3JpdGluZyB0aGUgLnRvYyBmaWxlLiAgXGNoYXJcYXBwZW5kaXhubyBpcyBub3QKKyAgJSBleHBhbmRhYmxlLCB0aHVzIGl0IGlzIHdyaXR0ZW4gbGl0ZXJhbGx5LCB0aHVzIGFsbCBhcHBlbmRpeGVzIGNvbWUgb3V0CisgICUgd2l0aCB0aGUgc2FtZSBsZXR0ZXIgKG9yIEApIGluIHRoZSB0b2Mgd2l0aG91dCBpdC4KKyAgXGVsc2VcY2hhclx0aGVcYXBwZW5kaXhubworICBcZmlcZmlcZmlcZmlcZmlcZmlcZmlcZmlcZmlcZmlcZmlcZmlcZmkKKyAgXGZpXGZpXGZpXGZpXGZpXGZpXGZpXGZpXGZpXGZpXGZpXGZpXGZpfQorCislIEVhY2ggQGNoYXB0ZXIgZGVmaW5lcyB0aGlzIGFzIHRoZSBuYW1lIG9mIHRoZSBjaGFwdGVyLgorJSBwYWdlIGhlYWRpbmdzIGFuZCBmb290aW5ncyBjYW4gdXNlIGl0LiAgQHNlY3Rpb24gZG9lcyBsaWtld2lzZS4KKyUgSG93ZXZlciwgdGhleSBhcmUgbm90IHJlbGlhYmxlLCBiZWNhdXNlIHdlIGRvbid0IHVzZSBtYXJrcy4KK1xkZWZcdGhpc2NoYXB0ZXJ7fQorXGRlZlx0aGlzc2VjdGlvbnt9CisKK1xuZXdjb3VudFxhYnNzZWNsZXZlbCAlIHVzZWQgdG8gY2FsY3VsYXRlIHByb3BlciBoZWFkaW5nIGxldmVsCitcbmV3Y291bnRcc2VjYmFzZVxzZWNiYXNlPTAgJSBAcmFpc2VzZWN0aW9ucy9AbG93ZXJzZWN0aW9ucyBtb2RpZnkgdGhpcyBjb3VudAorCislIEByYWlzZXNlY3Rpb25zOiB0cmVhdCBAc2VjdGlvbiBhcyBjaGFwdGVyLCBAc3Vic2VjdGlvbiBhcyBzZWN0aW9uLCBldGMuCitcZGVmXHJhaXNlc2VjdGlvbnN7XGdsb2JhbFxhZHZhbmNlXHNlY2Jhc2UgYnkgLTF9CitcbGV0XHVwPVxyYWlzZXNlY3Rpb25zICUgb3JpZ2luYWwgQkZveCBuYW1lCisKKyUgQGxvd2Vyc2VjdGlvbnM6IHRyZWF0IEBjaGFwdGVyIGFzIHNlY3Rpb24sIEBzZWN0aW9uIGFzIHN1YnNlY3Rpb24sIGV0Yy4KK1xkZWZcbG93ZXJzZWN0aW9uc3tcZ2xvYmFsXGFkdmFuY2Vcc2VjYmFzZSBieSAxfQorXGxldFxkb3duPVxsb3dlcnNlY3Rpb25zICUgb3JpZ2luYWwgQkZveCBuYW1lCisKKyUgd2Ugb25seSBoYXZlIHN1YnN1Yi4KK1xjaGFyZGVmXG1heHNlY2xldmVsID0gMworJQorJSBBIG51bWJlcmVkIHNlY3Rpb24gd2l0aGluIGFuIHVubnVtYmVyZWQgY2hhbmdlcyB0byB1bm51bWJlcmVkIHRvby4KKyUgVG8gYWNoaXZlIHRoaXMsIHJlbWVtYmVyIHRoZSAiYmlnZ2VzdCIgdW5udW0uIHNlYy4gd2UgYXJlIGN1cnJlbnRseSBpbjoKK1xjaGFyZGVmXHVubWxldmVsID0gXG1heHNlY2xldmVsCislCislIFRyYWNlIHdoZXRoZXIgdGhlIGN1cnJlbnQgY2hhcHRlciBpcyBhbiBhcHBlbmRpeCBvciBub3Q6CislIFxjaGFwaGVhZHR5cGUgaXMgIk4iIG9yICJBIiwgdW5udW1iZXJlZCBjaGFwdGVycyBhcmUgaWdub3JlZC4KK1xkZWZcY2hhcGhlYWR0eXBle059CisKKyUgQ2hvb3NlIGEgaGVhZGluZyBtYWNybworJSAjMSBpcyBoZWFkaW5nIHR5cGUKKyUgIzIgaXMgaGVhZGluZyBsZXZlbAorJSAjMyBpcyB0ZXh0IGZvciBoZWFkaW5nCitcZGVmXGdlbmhlYWQjMSMyIzN7JQorICAlIENvbXB1dGUgdGhlIGFicy4gc2VjLiBsZXZlbDoKKyAgXGFic3NlY2xldmVsPSMyCisgIFxhZHZhbmNlXGFic3NlY2xldmVsIGJ5IFxzZWNiYXNlCisgICUgTWFrZSBzdXJlIFxhYnNzZWNsZXZlbCBkb2Vzbid0IGZhbGwgb3V0c2lkZSB0aGUgcmFuZ2U6CisgIFxpZm51bSBcYWJzc2VjbGV2ZWwgPCAwCisgICAgXGFic3NlY2xldmVsID0gMAorICBcZWxzZQorICAgIFxpZm51bSBcYWJzc2VjbGV2ZWwgPiAzCisgICAgICBcYWJzc2VjbGV2ZWwgPSAzCisgICAgXGZpCisgIFxmaQorICAlIFRoZSBoZWFkaW5nIHR5cGU6CisgIFxkZWZcaGVhZHR5cGV7IzF9JQorICBcaWYgXGhlYWR0eXBlIFUlCisgICAgXGlmbnVtIFxhYnNzZWNsZXZlbCA8IFx1bm1sZXZlbAorICAgICAgXGNoYXJkZWZcdW5tbGV2ZWwgPSBcYWJzc2VjbGV2ZWwKKyAgICBcZmkKKyAgXGVsc2UKKyAgICAlIENoZWNrIGZvciBhcHBlbmRpeCBzZWN0aW9uczoKKyAgICBcaWZudW0gXGFic3NlY2xldmVsID0gMAorICAgICAgXGVkZWZcY2hhcGhlYWR0eXBle1xoZWFkdHlwZX0lCisgICAgXGVsc2UKKyAgICAgIFxpZiBcaGVhZHR5cGUgQVxpZiBcY2hhcGhlYWR0eXBlIE4lCisJXGVycm1lc3NhZ2V7QGFwcGVuZGl4Li4uIHdpdGhpbiBhIG5vbi1hcHBlbmRpeCBjaGFwdGVyfSUKKyAgICAgIFxmaVxmaQorICAgIFxmaQorICAgICUgQ2hlY2sgZm9yIG51bWJlcmVkIHdpdGhpbiB1bm51bWJlcmVkOgorICAgIFxpZm51bSBcYWJzc2VjbGV2ZWwgPiBcdW5tbGV2ZWwKKyAgICAgIFxkZWZcaGVhZHR5cGV7VX0lCisgICAgXGVsc2UKKyAgICAgIFxjaGFyZGVmXHVubWxldmVsID0gMworICAgIFxmaQorICBcZmkKKyAgJSBOb3cgcHJpbnQgdGhlIGhlYWRpbmc6CisgIFxpZiBcaGVhZHR5cGUgVSUKKyAgICBcaWZjYXNlXGFic3NlY2xldmVsCisJXHVubnVtYmVyZWR6enp7IzN9JQorICAgIFxvciBcdW5udW1iZXJlZHNlY3p6ensjM30lCisgICAgXG9yIFx1bm51bWJlcmVkc3Vic2Vjenp6eyMzfSUKKyAgICBcb3IgXHVubnVtYmVyZWRzdWJzdWJzZWN6enp7IzN9JQorICAgIFxmaQorICBcZWxzZQorICAgIFxpZiBcaGVhZHR5cGUgQSUKKyAgICAgIFxpZmNhc2VcYWJzc2VjbGV2ZWwKKwkgIFxhcHBlbmRpeHp6ensjM30lCisgICAgICBcb3IgXGFwcGVuZGl4c2VjdGlvbnp6ensjM30lCisgICAgICBcb3IgXGFwcGVuZGl4c3Vic2Vjenp6eyMzfSUKKyAgICAgIFxvciBcYXBwZW5kaXhzdWJzdWJzZWN6enp7IzN9JQorICAgICAgXGZpCisgICAgXGVsc2UKKyAgICAgIFxpZmNhc2VcYWJzc2VjbGV2ZWwKKwkgIFxjaGFwdGVyenp6eyMzfSUKKyAgICAgIFxvciBcc2Vjenp6eyMzfSUKKyAgICAgIFxvciBcbnVtYmVyZWRzdWJzZWN6enp7IzN9JQorICAgICAgXG9yIFxudW1iZXJlZHN1YnN1YnNlY3p6ensjM30lCisgICAgICBcZmkKKyAgICBcZmkKKyAgXGZpCisgIFxzdXBwcmVzc2ZpcnN0cGFyYWdyYXBoaW5kZW50Cit9CisKKyUgYW4gaW50ZXJmYWNlOgorXGRlZlxudW1oZWFke1xnZW5oZWFkIE59CitcZGVmXGFwcGhlYWR7XGdlbmhlYWQgQX0KK1xkZWZcdW5ubWhlYWR7XGdlbmhlYWQgVX0KKworJSBAY2hhcHRlciwgQGFwcGVuZGl4LCBAdW5udW1iZXJlZC4gIEluY3JlbWVudCB0b3AtbGV2ZWwgY291bnRlciwgcmVzZXQKKyUgYWxsIGxvd2VyLWxldmVsIHNlY3Rpb25pbmcgY291bnRlcnMgdG8gemVyby4KKyUKKyUgQWxzbyBzZXQgXGNoYXBsZXZlbHByZWZpeCwgd2hpY2ggd2UgcHJlcGVuZCB0byBAZmxvYXQgc2VxdWVuY2UgbnVtYmVycworJSAoZS5nLiwgZmlndXJlcyksIHEudi4gIEJ5IGRlZmF1bHQgKGJlZm9yZSBhbnkgY2hhcHRlciksIHRoYXQgaXMgZW1wdHkuCitcbGV0XGNoYXBsZXZlbHByZWZpeCA9IFxlbXB0eQorJQorXG91dGVyXHBhcnNlYXJnZGVmXGNoYXB0ZXJ7XG51bWhlYWQweyMxfX0gJSBub3JtYWxseSBudW1oZWFkMCBjYWxscyBjaGFwdGVyenp6CitcZGVmXGNoYXB0ZXJ6enojMXslCisgICUgc2VjdGlvbiByZXNldHRpbmcgaXMgXGdsb2JhbCBpbiBjYXNlIHRoZSBjaGFwdGVyIGlzIGluIGEgZ3JvdXAsIHN1Y2gKKyAgJSBhcyBhbiBAaW5jbHVkZSBmaWxlLgorICBcZ2xvYmFsXHNlY25vPTAgXGdsb2JhbFxzdWJzZWNubz0wIFxnbG9iYWxcc3Vic3Vic2Vjbm89MAorICAgIFxnbG9iYWxcYWR2YW5jZVxjaGFwbm8gYnkgMQorICAlCisgICUgVXNlZCBmb3IgXGZsb2F0LgorICBcZ2RlZlxjaGFwbGV2ZWxwcmVmaXh7XHRoZVxjaGFwbm8ufSUKKyAgXHJlc2V0YWxsZmxvYXRub3MKKyAgJQorICBcbWVzc2FnZXtccHV0d29yZENoYXB0ZXJcc3BhY2UgXHRoZVxjaGFwbm99JQorICAlCisgICUgV3JpdGUgdGhlIGFjdHVhbCBoZWFkaW5nLgorICBcY2hhcG1hY3JveyMxfXtZbnVtYmVyZWR9e1x0aGVcY2hhcG5vfSUKKyAgJQorICAlIFNvIEBzZWN0aW9uIGFuZCB0aGUgbGlrZSBhcmUgbnVtYmVyZWQgdW5kZXJuZWF0aCB0aGlzIGNoYXB0ZXIuCisgIFxnbG9iYWxcbGV0XHNlY3Rpb24gPSBcbnVtYmVyZWRzZWMKKyAgXGdsb2JhbFxsZXRcc3Vic2VjdGlvbiA9IFxudW1iZXJlZHN1YnNlYworICBcZ2xvYmFsXGxldFxzdWJzdWJzZWN0aW9uID0gXG51bWJlcmVkc3Vic3Vic2VjCit9CisKK1xvdXRlclxwYXJzZWFyZ2RlZlxhcHBlbmRpeHtcYXBwaGVhZDB7IzF9fSAlIG5vcm1hbGx5IGFwcGhlYWQwIGNhbGxzIGFwcGVuZGl4enp6CitcZGVmXGFwcGVuZGl4enp6IzF7JQorICBcZ2xvYmFsXHNlY25vPTAgXGdsb2JhbFxzdWJzZWNubz0wIFxnbG9iYWxcc3Vic3Vic2Vjbm89MAorICAgIFxnbG9iYWxcYWR2YW5jZVxhcHBlbmRpeG5vIGJ5IDEKKyAgXGdkZWZcY2hhcGxldmVscHJlZml4e1xhcHBlbmRpeGxldHRlci59JQorICBccmVzZXRhbGxmbG9hdG5vcworICAlCisgIFxkZWZcYXBwZW5kaXhudW17XHB1dHdvcmRBcHBlbmRpeFxzcGFjZSBcYXBwZW5kaXhsZXR0ZXJ9JQorICBcbWVzc2FnZXtcYXBwZW5kaXhudW19JQorICAlCisgIFxjaGFwbWFjcm97IzF9e1lhcHBlbmRpeH17XGFwcGVuZGl4bGV0dGVyfSUKKyAgJQorICBcZ2xvYmFsXGxldFxzZWN0aW9uID0gXGFwcGVuZGl4c2VjCisgIFxnbG9iYWxcbGV0XHN1YnNlY3Rpb24gPSBcYXBwZW5kaXhzdWJzZWMKKyAgXGdsb2JhbFxsZXRcc3Vic3Vic2VjdGlvbiA9IFxhcHBlbmRpeHN1YnN1YnNlYworfQorCitcb3V0ZXJccGFyc2VhcmdkZWZcdW5udW1iZXJlZHtcdW5ubWhlYWQweyMxfX0gJSBub3JtYWxseSB1bm5taGVhZDAgY2FsbHMgdW5udW1iZXJlZHp6egorXGRlZlx1bm51bWJlcmVkenp6IzF7JQorICBcZ2xvYmFsXHNlY25vPTAgXGdsb2JhbFxzdWJzZWNubz0wIFxnbG9iYWxcc3Vic3Vic2Vjbm89MAorICAgIFxnbG9iYWxcYWR2YW5jZVx1bm51bWJlcmVkbm8gYnkgMQorICAlCisgICUgU2luY2UgYW4gdW5udW1iZXJlZCBoYXMgbm8gbnVtYmVyLCBubyBwcmVmaXggZm9yIGZpZ3VyZXMuCisgIFxnbG9iYWxcbGV0XGNoYXBsZXZlbHByZWZpeCA9IFxlbXB0eQorICBccmVzZXRhbGxmbG9hdG5vcworICAlCisgICUgVGhpcyB1c2VkIHRvIGJlIHNpbXBseSBcbWVzc2FnZXsjMX0sIGJ1dCBUZVggZnVsbHkgZXhwYW5kcyB0aGUKKyAgJSBhcmd1bWVudCB0byBcbWVzc2FnZS4gIFRoZXJlZm9yZSwgaWYgIzEgY29udGFpbmVkIEAtY29tbWFuZHMsIFRlWAorICAlIGV4cGFuZGVkIHRoZW0uICBGb3IgZXhhbXBsZSwgaW4gYEB1bm51bWJlcmVkIFRoZSBAY2l0ZXtCb29rfScsIFRlWAorICAlIGV4cGFuZGVkIEBjaXRlICh3aGljaCB0dXJucyBvdXQgdG8gY2F1c2UgZXJyb3JzIGJlY2F1c2UgXGNpdGUgaXMgbWVhbnQKKyAgJSB0byBiZSBleGVjdXRlZCwgbm90IGV4cGFuZGVkKS4KKyAgJQorICAlIEFueXdheSwgd2UgZG9uJ3Qgd2FudCB0aGUgZnVsbHktZXhwYW5kZWQgZGVmaW5pdGlvbiBvZiBAY2l0ZSB0byBhcHBlYXIKKyAgJSBhcyBhIHJlc3VsdCBvZiB0aGUgXG1lc3NhZ2UsIHdlIGp1c3Qgd2FudCBgQGNpdGUnIGl0c2VsZi4gIFdlIHVzZQorICAlIFx0aGU8dG9rcyByZWdpc3Rlcj4gdG8gYWNoaWV2ZSB0aGlzOiBUZVggZXhwYW5kcyBcdGhlPHRva3M+IG9ubHkgb25jZSwKKyAgJSBzaW1wbHkgeWllbGRpbmcgdGhlIGNvbnRlbnRzIG9mIDx0b2tzIHJlZ2lzdGVyPi4gIChXZSBhbHNvIGRvIHRoaXMgZm9yCisgICUgdGhlIHRvYyBlbnRyaWVzLikKKyAgXHRva3MwID0geyMxfSUKKyAgXG1lc3NhZ2V7KFx0aGVcdG9rczApfSUKKyAgJQorICBcY2hhcG1hY3JveyMxfXtZbm90aGluZ317XHRoZVx1bm51bWJlcmVkbm99JQorICAlCisgIFxnbG9iYWxcbGV0XHNlY3Rpb24gPSBcdW5udW1iZXJlZHNlYworICBcZ2xvYmFsXGxldFxzdWJzZWN0aW9uID0gXHVubnVtYmVyZWRzdWJzZWMKKyAgXGdsb2JhbFxsZXRcc3Vic3Vic2VjdGlvbiA9IFx1bm51bWJlcmVkc3Vic3Vic2VjCit9CisKKyUgQGNlbnRlcmNoYXAgaXMgbGlrZSBAdW5udW1iZXJlZCwgYnV0IHRoZSBoZWFkaW5nIGlzIGNlbnRlcmVkLgorXG91dGVyXHBhcnNlYXJnZGVmXGNlbnRlcmNoYXB7JQorICAlIFdlbGwsIHdlIGNvdWxkIGRvIHRoZSBmb2xsb3dpbmcgaW4gYSBncm91cCwgYnV0IHRoYXQgd291bGQgYnJlYWsKKyAgJSBhbiBhc3N1bXB0aW9uIHRoYXQgXGNoYXBtYWNybyBpcyBjYWxsZWQgYXQgdGhlIG91dGVybW9zdCBsZXZlbC4KKyAgJSBUaHVzIHdlIGFyZSBzYWZlciB0aGlzIHdheToJCS0ta2FzYWwsIDI0ZmViMDQKKyAgXGxldFxjZW50ZXJwYXJhbWV0ZXJzbWF5YmUgPSBcY2VudGVycGFyYW1ldGVycworICBcdW5ubWhlYWQweyMxfSUKKyAgXGxldFxjZW50ZXJwYXJhbWV0ZXJzbWF5YmUgPSBccmVsYXgKK30KKworJSBAdG9wIGlzIGxpa2UgQHVubnVtYmVyZWQuCitcbGV0XHRvcFx1bm51bWJlcmVkCisKKyUgU2VjdGlvbnMuCitcb3V0ZXJccGFyc2VhcmdkZWZcbnVtYmVyZWRzZWN7XG51bWhlYWQxeyMxfX0gJSBub3JtYWxseSBjYWxscyBzZWN6enoKK1xkZWZcc2Vjenp6IzF7JQorICBcZ2xvYmFsXHN1YnNlY25vPTAgXGdsb2JhbFxzdWJzdWJzZWNubz0wICBcZ2xvYmFsXGFkdmFuY2Vcc2Vjbm8gYnkgMQorICBcc2VjdGlvbmhlYWRpbmd7IzF9e3NlY317WW51bWJlcmVkfXtcdGhlXGNoYXBuby5cdGhlXHNlY25vfSUKK30KKworXG91dGVyXHBhcnNlYXJnZGVmXGFwcGVuZGl4c2VjdGlvbntcYXBwaGVhZDF7IzF9fSAlIG5vcm1hbGx5IGNhbGxzIGFwcGVuZGl4c2VjdGlvbnp6egorXGRlZlxhcHBlbmRpeHNlY3Rpb256enojMXslCisgIFxnbG9iYWxcc3Vic2Vjbm89MCBcZ2xvYmFsXHN1YnN1YnNlY25vPTAgIFxnbG9iYWxcYWR2YW5jZVxzZWNubyBieSAxCisgIFxzZWN0aW9uaGVhZGluZ3sjMX17c2VjfXtZYXBwZW5kaXh9e1xhcHBlbmRpeGxldHRlci5cdGhlXHNlY25vfSUKK30KK1xsZXRcYXBwZW5kaXhzZWNcYXBwZW5kaXhzZWN0aW9uCisKK1xvdXRlclxwYXJzZWFyZ2RlZlx1bm51bWJlcmVkc2Vje1x1bm5taGVhZDF7IzF9fSAlIG5vcm1hbGx5IGNhbGxzIHVubnVtYmVyZWRzZWN6enoKK1xkZWZcdW5udW1iZXJlZHNlY3p6eiMxeyUKKyAgXGdsb2JhbFxzdWJzZWNubz0wIFxnbG9iYWxcc3Vic3Vic2Vjbm89MCAgXGdsb2JhbFxhZHZhbmNlXHNlY25vIGJ5IDEKKyAgXHNlY3Rpb25oZWFkaW5neyMxfXtzZWN9e1lub3RoaW5nfXtcdGhlXHVubnVtYmVyZWRuby5cdGhlXHNlY25vfSUKK30KKworJSBTdWJzZWN0aW9ucy4KK1xvdXRlclxwYXJzZWFyZ2RlZlxudW1iZXJlZHN1YnNlY3tcbnVtaGVhZDJ7IzF9fSAlIG5vcm1hbGx5IGNhbGxzIG51bWJlcmVkc3Vic2Vjenp6CitcZGVmXG51bWJlcmVkc3Vic2Vjenp6IzF7JQorICBcZ2xvYmFsXHN1YnN1YnNlY25vPTAgIFxnbG9iYWxcYWR2YW5jZVxzdWJzZWNubyBieSAxCisgIFxzZWN0aW9uaGVhZGluZ3sjMX17c3Vic2VjfXtZbnVtYmVyZWR9e1x0aGVcY2hhcG5vLlx0aGVcc2Vjbm8uXHRoZVxzdWJzZWNub30lCit9CisKK1xvdXRlclxwYXJzZWFyZ2RlZlxhcHBlbmRpeHN1YnNlY3tcYXBwaGVhZDJ7IzF9fSAlIG5vcm1hbGx5IGNhbGxzIGFwcGVuZGl4c3Vic2Vjenp6CitcZGVmXGFwcGVuZGl4c3Vic2Vjenp6IzF7JQorICBcZ2xvYmFsXHN1YnN1YnNlY25vPTAgIFxnbG9iYWxcYWR2YW5jZVxzdWJzZWNubyBieSAxCisgIFxzZWN0aW9uaGVhZGluZ3sjMX17c3Vic2VjfXtZYXBwZW5kaXh9JQorICAgICAgICAgICAgICAgICB7XGFwcGVuZGl4bGV0dGVyLlx0aGVcc2Vjbm8uXHRoZVxzdWJzZWNub30lCit9CisKK1xvdXRlclxwYXJzZWFyZ2RlZlx1bm51bWJlcmVkc3Vic2Vje1x1bm5taGVhZDJ7IzF9fSAlbm9ybWFsbHkgY2FsbHMgdW5udW1iZXJlZHN1YnNlY3p6egorXGRlZlx1bm51bWJlcmVkc3Vic2Vjenp6IzF7JQorICBcZ2xvYmFsXHN1YnN1YnNlY25vPTAgIFxnbG9iYWxcYWR2YW5jZVxzdWJzZWNubyBieSAxCisgIFxzZWN0aW9uaGVhZGluZ3sjMX17c3Vic2VjfXtZbm90aGluZ30lCisgICAgICAgICAgICAgICAgIHtcdGhlXHVubnVtYmVyZWRuby5cdGhlXHNlY25vLlx0aGVcc3Vic2Vjbm99JQorfQorCislIFN1YnN1YnNlY3Rpb25zLgorXG91dGVyXHBhcnNlYXJnZGVmXG51bWJlcmVkc3Vic3Vic2Vje1xudW1oZWFkM3sjMX19ICUgbm9ybWFsbHkgbnVtYmVyZWRzdWJzdWJzZWN6enoKK1xkZWZcbnVtYmVyZWRzdWJzdWJzZWN6enojMXslCisgIFxnbG9iYWxcYWR2YW5jZVxzdWJzdWJzZWNubyBieSAxCisgIFxzZWN0aW9uaGVhZGluZ3sjMX17c3Vic3Vic2VjfXtZbnVtYmVyZWR9JQorICAgICAgICAgICAgICAgICB7XHRoZVxjaGFwbm8uXHRoZVxzZWNuby5cdGhlXHN1YnNlY25vLlx0aGVcc3Vic3Vic2Vjbm99JQorfQorCitcb3V0ZXJccGFyc2VhcmdkZWZcYXBwZW5kaXhzdWJzdWJzZWN7XGFwcGhlYWQzeyMxfX0gJSBub3JtYWxseSBhcHBlbmRpeHN1YnN1YnNlY3p6egorXGRlZlxhcHBlbmRpeHN1YnN1YnNlY3p6eiMxeyUKKyAgXGdsb2JhbFxhZHZhbmNlXHN1YnN1YnNlY25vIGJ5IDEKKyAgXHNlY3Rpb25oZWFkaW5neyMxfXtzdWJzdWJzZWN9e1lhcHBlbmRpeH0lCisgICAgICAgICAgICAgICAgIHtcYXBwZW5kaXhsZXR0ZXIuXHRoZVxzZWNuby5cdGhlXHN1YnNlY25vLlx0aGVcc3Vic3Vic2Vjbm99JQorfQorCitcb3V0ZXJccGFyc2VhcmdkZWZcdW5udW1iZXJlZHN1YnN1YnNlY3tcdW5ubWhlYWQzeyMxfX0gJW5vcm1hbGx5IHVubnVtYmVyZWRzdWJzdWJzZWN6enoKK1xkZWZcdW5udW1iZXJlZHN1YnN1YnNlY3p6eiMxeyUKKyAgXGdsb2JhbFxhZHZhbmNlXHN1YnN1YnNlY25vIGJ5IDEKKyAgXHNlY3Rpb25oZWFkaW5neyMxfXtzdWJzdWJzZWN9e1lub3RoaW5nfSUKKyAgICAgICAgICAgICAgICAge1x0aGVcdW5udW1iZXJlZG5vLlx0aGVcc2Vjbm8uXHRoZVxzdWJzZWNuby5cdGhlXHN1YnN1YnNlY25vfSUKK30KKworJSBUaGVzZSBtYWNyb3MgY29udHJvbCB3aGF0IHRoZSBzZWN0aW9uIGNvbW1hbmRzIGRvLCBhY2NvcmRpbmcKKyUgdG8gd2hhdCBraW5kIG9mIGNoYXB0ZXIgd2UgYXJlIGluIChvcmRpbmFyeSwgYXBwZW5kaXgsIG9yIHVubnVtYmVyZWQpLgorJSBEZWZpbmUgdGhlbSBieSBkZWZhdWx0IGZvciBhIG51bWJlcmVkIGNoYXB0ZXIuCitcbGV0XHNlY3Rpb24gPSBcbnVtYmVyZWRzZWMKK1xsZXRcc3Vic2VjdGlvbiA9IFxudW1iZXJlZHN1YnNlYworXGxldFxzdWJzdWJzZWN0aW9uID0gXG51bWJlcmVkc3Vic3Vic2VjCisKKyUgRGVmaW5lIEBtYWpvcmhlYWRpbmcsIEBoZWFkaW5nIGFuZCBAc3ViaGVhZGluZworCislIE5PVEUgb24gdXNlIG9mIFx2Ym94IGZvciBjaGFwdGVyIGhlYWRpbmdzLCBzZWN0aW9uIGhlYWRpbmdzLCBhbmQgc3VjaDoKKyUgICAgICAgMSkgV2UgdXNlIFx2Ym94IHJhdGhlciB0aGFuIHRoZSBlYXJsaWVyIFxsaW5lIHRvIHBlcm1pdAorJSAgICAgICAgICBvdmVybG9uZyBoZWFkaW5ncyB0byBmb2xkLgorJSAgICAgICAyKSBcaHlwaGVucGVuYWx0eSBpcyBzZXQgdG8gMTAwMDAgYmVjYXVzZSBoeXBoZW5hdGlvbiBpbiBhCislICAgICAgICAgIGhlYWRpbmcgaXMgb2Jub3hpb3VzOyB0aGlzIGZvcmJpZHMgaXQuCislICAgICAgIDMpIExpa2V3aXNlLCBoZWFkaW5ncyBsb29rIGJlc3QgaWYgbm8gXHBhcmluZGVudCBpcyB1c2VkLCBhbmQKKyUgICAgICAgICAgaWYganVzdGlmaWNhdGlvbiBpcyBub3QgYXR0ZW1wdGVkLiAgSGVuY2UgXHJhZ2dlZHJpZ2h0LgorCisKK1xkZWZcbWFqb3JoZWFkaW5neyUKKyAge1xhZHZhbmNlXGNoYXBoZWFkaW5nc2tpcCBieSAxMHB0IFxjaGFwYnJlYWsgfSUKKyAgXHBhcnNlYXJnXGNoYXBoZWFkaW5nenp6Cit9CisKK1xkZWZcY2hhcGhlYWRpbmd7XGNoYXBicmVhayBccGFyc2VhcmdcY2hhcGhlYWRpbmd6enp9CitcZGVmXGNoYXBoZWFkaW5nenp6IzF7JQorICB7XGNoYXBmb250cyBcdmJveHtcaHlwaGVucGVuYWx0eT0xMDAwMFx0b2xlcmFuY2U9NTAwMAorICAgICAgICAgICAgICAgICAgICBccGFyaW5kZW50PTBwdFxyYWdnZWRyaWdodAorICAgICAgICAgICAgICAgICAgICBccm0gIzFcaGZpbGx9fSUKKyAgXGJpZ3NraXAgXHBhclxwZW5hbHR5IDIwMFxyZWxheAorICBcc3VwcHJlc3NmaXJzdHBhcmFncmFwaGluZGVudAorfQorCislIEBoZWFkaW5nLCBAc3ViaGVhZGluZywgQHN1YnN1YmhlYWRpbmcuCitccGFyc2VhcmdkZWZcaGVhZGluZ3tcc2VjdGlvbmhlYWRpbmd7IzF9e3NlY317WW9taXRmcm9tdG9jfXt9CisgIFxzdXBwcmVzc2ZpcnN0cGFyYWdyYXBoaW5kZW50fQorXHBhcnNlYXJnZGVmXHN1YmhlYWRpbmd7XHNlY3Rpb25oZWFkaW5neyMxfXtzdWJzZWN9e1lvbWl0ZnJvbXRvY317fQorICBcc3VwcHJlc3NmaXJzdHBhcmFncmFwaGluZGVudH0KK1xwYXJzZWFyZ2RlZlxzdWJzdWJoZWFkaW5ne1xzZWN0aW9uaGVhZGluZ3sjMX17c3Vic3Vic2VjfXtZb21pdGZyb210b2N9e30KKyAgXHN1cHByZXNzZmlyc3RwYXJhZ3JhcGhpbmRlbnR9CisKKyUgVGhlc2UgbWFjcm9zIGdlbmVyYXRlIGEgY2hhcHRlciwgc2VjdGlvbiwgZXRjLiBoZWFkaW5nIG9ubHkKKyUgKGluY2x1ZGluZyB3aGl0ZXNwYWNlLCBsaW5lYnJlYWtpbmcsIGV0Yy4gYXJvdW5kIGl0KSwKKyUgZ2l2ZW4gYWxsIHRoZSBpbmZvcm1hdGlvbiBpbiBjb252ZW5pZW50LCBwYXJzZWQgZm9ybS4KKworJSUlIEFyZ3MgYXJlIHRoZSBza2lwIGFuZCBwZW5hbHR5ICh1c3VhbGx5IG5lZ2F0aXZlKQorXGRlZlxkb2JyZWFrIzEjMntccGFyXGlmZGltXGxhc3Rza2lwPCMxXHJlbW92ZWxhc3Rza2lwXHBlbmFsdHkjMlx2c2tpcCMxXGZpfQorCislJSUgRGVmaW5lIHBsYWluIGNoYXB0ZXIgc3RhcnRzLCBhbmQgcGFnZSBvbi9vZmYgc3dpdGNoaW5nIGZvciBpdAorJSBQYXJhbWV0ZXIgY29udHJvbGxpbmcgc2tpcCBiZWZvcmUgY2hhcHRlciBoZWFkaW5ncyAoaWYgbmVlZGVkKQorCitcbmV3c2tpcFxjaGFwaGVhZGluZ3NraXAKKworXGRlZlxjaGFwYnJlYWt7XGRvYnJlYWsgXGNoYXBoZWFkaW5nc2tpcCB7LTQwMDB9fQorXGRlZlxjaGFwcGFnZXJ7XHBhclx2ZmlsbFxzdXBlcmVqZWN0fQorXGRlZlxjaGFwb2RkcGFnZXtcY2hhcHBhZ2VyIFxpZm9kZFxwYWdlbm8gXGVsc2UgXGhib3ggdG8gMHB0e30gXGNoYXBwYWdlclxmaX0KKworXGRlZlxzZXRjaGFwdGVybmV3cGFnZSAjMSB7XGNzbmFtZSBDSEFQUEFHIzFcZW5kY3NuYW1lfQorCitcZGVmXENIQVBQQUdvZmZ7JQorXGdsb2JhbFxsZXRcY29udGVudHNhbGlnbm1hY3JvID0gXGNoYXBwYWdlcgorXGdsb2JhbFxsZXRccGNoYXBzZXBtYWNybz1cY2hhcGJyZWFrCitcZ2xvYmFsXGxldFxwYWdlYWxpZ25tYWNybz1cY2hhcHBhZ2VyfQorCitcZGVmXENIQVBQQUdvbnslCitcZ2xvYmFsXGxldFxjb250ZW50c2FsaWdubWFjcm8gPSBcY2hhcHBhZ2VyCitcZ2xvYmFsXGxldFxwY2hhcHNlcG1hY3JvPVxjaGFwcGFnZXIKK1xnbG9iYWxcbGV0XHBhZ2VhbGlnbm1hY3JvPVxjaGFwcGFnZXIKK1xnbG9iYWxcZGVmXEhFQURJTkdTb257XEhFQURJTkdTc2luZ2xlfX0KKworXGRlZlxDSEFQUEFHb2RkeyUKK1xnbG9iYWxcbGV0XGNvbnRlbnRzYWxpZ25tYWNybyA9IFxjaGFwb2RkcGFnZQorXGdsb2JhbFxsZXRccGNoYXBzZXBtYWNybz1cY2hhcG9kZHBhZ2UKK1xnbG9iYWxcbGV0XHBhZ2VhbGlnbm1hY3JvPVxjaGFwb2RkcGFnZQorXGdsb2JhbFxkZWZcSEVBRElOR1NvbntcSEVBRElOR1Nkb3VibGV9fQorCitcQ0hBUFBBR29uCisKKyUgQ2hhcHRlciBvcGVuaW5nLgorJQorJSAjMSBpcyB0aGUgdGV4dCwgIzIgaXMgdGhlIHNlY3Rpb24gdHlwZSAoWW51bWJlcmVkLCBZbm90aGluZywKKyUgWWFwcGVuZGl4LCBZb21pdGZyb210b2MpLCAjMyB0aGUgY2hhcHRlciBudW1iZXIuCislCislIFRvIHRlc3QgYWdhaW5zdCBvdXIgYXJndW1lbnQuCitcZGVmXFlub3RoaW5na2V5d29yZHtZbm90aGluZ30KK1xkZWZcWW9taXRmcm9tdG9ja2V5d29yZHtZb21pdGZyb210b2N9CitcZGVmXFlhcHBlbmRpeGtleXdvcmR7WWFwcGVuZGl4fQorJQorXGRlZlxjaGFwbWFjcm8jMSMyIzN7JQorICBccGNoYXBzZXBtYWNybworICB7JQorICAgIFxjaGFwZm9udHMgXHJtCisgICAgJQorICAgICUgSGF2ZSB0byBkZWZpbmUgXHRoaXNzZWN0aW9uIGJlZm9yZSBjYWxsaW5nIFxkb25vZGVyZWYsIGJlY2F1c2UgdGhlCisgICAgJSB4cmVmIGNvZGUgZXZlbnR1YWxseSB1c2VzIGl0LiAgT24gdGhlIG90aGVyIGhhbmQsIGl0IGhhcyB0byBiZSBjYWxsZWQKKyAgICAlIGFmdGVyIFxwY2hhcHNlcG1hY3JvLCBvciB0aGUgaGVhZGxpbmUgd2lsbCBjaGFuZ2UgdG9vIHNvb24uCisgICAgXGdkZWZcdGhpc3NlY3Rpb257IzF9JQorICAgIFxnZGVmXHRoaXNjaGFwdGVybmFtZXsjMX0lCisgICAgJQorICAgICUgT25seSBpbnNlcnQgdGhlIHNlcGFyYXRpbmcgc3BhY2UgaWYgd2UgaGF2ZSBhIGNoYXB0ZXIvYXBwZW5kaXgKKyAgICAlIG51bWJlciwgYW5kIGRvbid0IHByaW50IHRoZSB1bm51bWJlcmVkIGBgbnVtYmVyJycuCisgICAgXGRlZlx0ZW1wdHlwZXsjMn0lCisgICAgXGlmeFx0ZW1wdHlwZVxZbm90aGluZ2tleXdvcmQKKyAgICAgIFxzZXRib3gwID0gXGhib3h7fSUKKyAgICAgIFxkZWZcdG9jdHlwZXt1bm5jaGFwfSUKKyAgICAgIFxnZGVmXHRoaXNjaGFwdGVybnVte30lCisgICAgICBcZ2RlZlx0aGlzY2hhcHRlcnsjMX0lCisgICAgXGVsc2VcaWZ4XHRlbXB0eXBlXFlvbWl0ZnJvbXRvY2tleXdvcmQKKyAgICAgIFxzZXRib3gwID0gXGhib3h7fSUgY29udGVudHMgbGlrZSB1bm51bWJlcmVkLCBidXQgbm8gdG9jIGVudHJ5CisgICAgICBcZGVmXHRvY3R5cGV7b21pdH0lCisgICAgICBcZ2RlZlx0aGlzY2hhcHRlcm51bXt9JQorICAgICAgXGdkZWZcdGhpc2NoYXB0ZXJ7fSUKKyAgICBcZWxzZVxpZnhcdGVtcHR5cGVcWWFwcGVuZGl4a2V5d29yZAorICAgICAgXHNldGJveDAgPSBcaGJveHtccHV0d29yZEFwcGVuZGl4e30gIzNcZW5zcGFjZX0lCisgICAgICBcZGVmXHRvY3R5cGV7YXBwfSUKKyAgICAgIFx4ZGVmXHRoaXNjaGFwdGVybnVte1xhcHBlbmRpeGxldHRlcn0lCisgICAgICAlIFdlIGRvbid0IHN1YnN0aXR1dGUgdGhlIGFjdHVhbCBjaGFwdGVyIG5hbWUgaW50byBcdGhpc2NoYXB0ZXIKKyAgICAgICUgYmVjYXVzZSB3ZSBkb24ndCB3YW50IGl0cyBtYWNyb3MgZXZhbHVhdGVkIG5vdy4gIEFuZCB3ZSBkb24ndAorICAgICAgJSB1c2UgXHRoaXNzZWN0aW9uIGJlY2F1c2UgdGhhdCBjaGFuZ2VzIHdpdGggZWFjaCBzZWN0aW9uLgorICAgICAgJQorICAgICAgXHhkZWZcdGhpc2NoYXB0ZXJ7XHB1dHdvcmRBcHBlbmRpeHt9IFxhcHBlbmRpeGxldHRlcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIFxub2V4cGFuZFx0aGlzY2hhcHRlcm5hbWV9JQorICAgIFxlbHNlCisgICAgICBcc2V0Ym94MCA9IFxoYm94eyMzXGVuc3BhY2V9JQorICAgICAgXGRlZlx0b2N0eXBle251bWNoYXB9JQorICAgICAgXHhkZWZcdGhpc2NoYXB0ZXJudW17XHRoZVxjaGFwbm99JQorICAgICAgXHhkZWZcdGhpc2NoYXB0ZXJ7XHB1dHdvcmRDaGFwdGVye30gXHRoZVxjaGFwbm86CisgICAgICAgICAgICAgICAgICAgICAgICBcbm9leHBhbmRcdGhpc2NoYXB0ZXJuYW1lfSUKKyAgICBcZmlcZmlcZmkKKyAgICAlCisgICAgJSBXcml0ZSB0aGUgdG9jIGVudHJ5IGZvciB0aGlzIGNoYXB0ZXIuICBNdXN0IGNvbWUgYmVmb3JlIHRoZQorICAgICUgXGRvbm9kZXJlZiwgYmVjYXVzZSB3ZSBpbmNsdWRlIHRoZSBjdXJyZW50IG5vZGUgbmFtZSBpbiB0aGUgdG9jCisgICAgJSBlbnRyeSwgYW5kIFxkb25vZGVyZWYgcmVzZXRzIGl0IHRvIGVtcHR5LgorICAgIFx3cml0ZXRvY2VudHJ5e1x0b2N0eXBlfXsjMX17IzN9JQorICAgICUKKyAgICAlIEZvciBwZGZ0ZXgsIHdlIGhhdmUgdG8gd3JpdGUgb3V0IHRoZSBub2RlIGRlZmluaXRpb24gKGFrYSwgbWFrZQorICAgICUgdGhlIHBkZmRlc3QpIGFmdGVyIGFueSBwYWdlIGJyZWFrLCBidXQgYmVmb3JlIHRoZSBhY3R1YWwgdGV4dCBoYXMKKyAgICAlIGJlZW4gdHlwZXNldC4gIElmIHRoZSBkZXN0aW5hdGlvbiBmb3IgdGhlIHBkZiBvdXRsaW5lIGlzIGFmdGVyIHRoZQorICAgICUgdGV4dCwgdGhlbiBqdW1waW5nIGZyb20gdGhlIG91dGxpbmUgbWF5IHdpbmQgdXAgd2l0aCB0aGUgdGV4dCBub3QKKyAgICAlIGJlaW5nIHZpc2libGUsIGZvciBpbnN0YW5jZSB1bmRlciBoaWdoIG1hZ25pZmljYXRpb24uCisgICAgXGRvbm9kZXJlZnsjMn0lCisgICAgJQorICAgICUgVHlwZXNldCB0aGUgYWN0dWFsIGhlYWRpbmcuCisgICAgXHZib3h7XGh5cGhlbnBlbmFsdHk9MTAwMDAgXHRvbGVyYW5jZT01MDAwIFxwYXJpbmRlbnQ9MHB0IFxyYWdnZWRyaWdodAorICAgICAgICAgIFxoYW5naW5kZW50PVx3ZDAgXGNlbnRlcnBhcmFtZXRlcnNtYXliZQorICAgICAgICAgIFx1bmhib3gwICMxXHBhcn0lCisgIH0lCisgIFxub2JyZWFrXGJpZ3NraXAgJSBubyBwYWdlIGJyZWFrIGFmdGVyIGEgY2hhcHRlciB0aXRsZQorICBcbm9icmVhaworfQorCislIEBjZW50ZXJjaGFwIC0tIGNlbnRlcmVkIGFuZCB1bm51bWJlcmVkLgorXGxldFxjZW50ZXJwYXJhbWV0ZXJzbWF5YmUgPSBccmVsYXgKK1xkZWZcY2VudGVycGFyYW1ldGVyc3slCisgIFxhZHZhbmNlXHJpZ2h0c2tpcCBieSAzXHJpZ2h0c2tpcAorICBcbGVmdHNraXAgPSBccmlnaHRza2lwCisgIFxwYXJmaWxsc2tpcCA9IDBwdAorfQorCisKKyUgSSBkb24ndCB0aGluayB0aGlzIGNoYXB0ZXIgc3R5bGUgaXMgc3VwcG9ydGVkIGFueSBtb3JlLCBzbyBJJ20gbm90CislIHVwZGF0aW5nIGl0IHdpdGggdGhlIG5ldyBub2RlcmVmIHN0dWZmLiAgV2UnbGwgc2VlLiAgLS1rYXJsLCAxMWF1ZzAzLgorJQorXGRlZlxzZXRjaGFwdGVyc3R5bGUgIzEge1xjc25hbWUgQ0hBUEYjMVxlbmRjc25hbWV9CislCitcZGVmXHVubmNoZm9wZW4gIzF7JQorXGNoYXBvZGRwYWdlIHtcY2hhcGZvbnRzIFx2Ym94e1xoeXBoZW5wZW5hbHR5PTEwMDAwXHRvbGVyYW5jZT01MDAwCisgICAgICAgICAgICAgICAgICAgICAgIFxwYXJpbmRlbnQ9MHB0XHJhZ2dlZHJpZ2h0CisgICAgICAgICAgICAgICAgICAgICAgIFxybSAjMVxoZmlsbH19XGJpZ3NraXAgXHBhclxub2JyZWFrCit9CitcZGVmXGNoZm9wZW4gIzEjMntcY2hhcG9kZHBhZ2Uge1xjaGFwZm9udHMKK1x2Ym94IHRvIDNpbntcdmZpbCBcaGJveCB0b1xoc2l6ZXtcaGZpbCAjMn0gXGhib3ggdG9caHNpemV7XGhmaWwgIzF9IFx2ZmlsfX0lCitccGFyXHBlbmFsdHkgNTAwMCAlCit9CitcZGVmXGNlbnRlcmNoZm9wZW4gIzF7JQorXGNoYXBvZGRwYWdlIHtcY2hhcGZvbnRzIFx2Ym94e1xoeXBoZW5wZW5hbHR5PTEwMDAwXHRvbGVyYW5jZT01MDAwCisgICAgICAgICAgICAgICAgICAgICAgIFxwYXJpbmRlbnQ9MHB0CisgICAgICAgICAgICAgICAgICAgICAgIFxoZmlsbCB7XHJtICMxfVxoZmlsbH19XGJpZ3NraXAgXHBhclxub2JyZWFrCit9CitcZGVmXENIQVBGb3BlbnslCisgIFxnbG9iYWxcbGV0XGNoYXBtYWNybz1cY2hmb3BlbgorICBcZ2xvYmFsXGxldFxjZW50ZXJjaGFwbWFjcm89XGNlbnRlcmNoZm9wZW59CisKKworJSBTZWN0aW9uIHRpdGxlcy4gIFRoZXNlIG1hY3JvcyBjb21iaW5lIHRoZSBzZWN0aW9uIG51bWJlciBwYXJ0cyBhbmQKKyUgY2FsbCB0aGUgZ2VuZXJpYyBcc2VjdGlvbmhlYWRpbmcgdG8gZG8gdGhlIHByaW50aW5nLgorJQorXG5ld3NraXBcc2VjaGVhZGluZ3NraXAKK1xkZWZcc2VjaGVhZGluZ2JyZWFre1xkb2JyZWFrIFxzZWNoZWFkaW5nc2tpcHstMTAwMH19CisKKyUgU3Vic2VjdGlvbiB0aXRsZXMuCitcbmV3c2tpcFxzdWJzZWNoZWFkaW5nc2tpcAorXGRlZlxzdWJzZWNoZWFkaW5nYnJlYWt7XGRvYnJlYWsgXHN1YnNlY2hlYWRpbmdza2lwey01MDB9fQorCislIFN1YnN1YnNlY3Rpb24gdGl0bGVzLgorXGRlZlxzdWJzdWJzZWNoZWFkaW5nc2tpcHtcc3Vic2VjaGVhZGluZ3NraXB9CitcZGVmXHN1YnN1YnNlY2hlYWRpbmdicmVha3tcc3Vic2VjaGVhZGluZ2JyZWFrfQorCisKKyUgUHJpbnQgYW55IHNpemUsIGFueSB0eXBlLCBzZWN0aW9uIHRpdGxlLgorJQorJSAjMSBpcyB0aGUgdGV4dCwgIzIgaXMgdGhlIHNlY3Rpb24gbGV2ZWwgKHNlYy9zdWJzZWMvc3Vic3Vic2VjKSwgIzMgaXMKKyUgdGhlIHNlY3Rpb24gdHlwZSBmb3IgeHJlZnMgKFludW1iZXJlZCwgWW5vdGhpbmcsIFlhcHBlbmRpeCksICM0IGlzIHRoZQorJSBzZWN0aW9uIG51bWJlci4KKyUKK1xkZWZcc2VjdGlvbmhlYWRpbmcjMSMyIzMjNHslCisgIHslCisgICAgJSBTd2l0Y2ggdG8gdGhlIHJpZ2h0IHNldCBvZiBmb250cy4KKyAgICBcY3NuYW1lICMyZm9udHNcZW5kY3NuYW1lIFxybQorICAgICUKKyAgICAlIEluc2VydCBzcGFjZSBhYm92ZSB0aGUgaGVhZGluZy4KKyAgICBcY3NuYW1lICMyaGVhZGluZ2JyZWFrXGVuZGNzbmFtZQorICAgICUKKyAgICAlIE9ubHkgaW5zZXJ0IHRoZSBzcGFjZSBhZnRlciB0aGUgbnVtYmVyIGlmIHdlIGhhdmUgYSBzZWN0aW9uIG51bWJlci4KKyAgICBcZGVmXHNlY3Rpb25sZXZlbHsjMn0lCisgICAgXGRlZlx0ZW1wdHlwZXsjM30lCisgICAgJQorICAgIFxpZnhcdGVtcHR5cGVcWW5vdGhpbmdrZXl3b3JkCisgICAgICBcc2V0Ym94MCA9IFxoYm94e30lCisgICAgICBcZGVmXHRvY3R5cGV7dW5ufSUKKyAgICAgIFxnZGVmXHRoaXNzZWN0aW9ueyMxfSUKKyAgICBcZWxzZVxpZnhcdGVtcHR5cGVcWW9taXRmcm9tdG9ja2V5d29yZAorICAgICAgJSBmb3IgQGhlYWRpbmdzIC0tIG5vIHNlY3Rpb24gbnVtYmVyLCBkb24ndCBpbmNsdWRlIGluIHRvYywKKyAgICAgICUgYW5kIGRvbid0IHJlZGVmaW5lIFx0aGlzc2VjdGlvbi4KKyAgICAgIFxzZXRib3gwID0gXGhib3h7fSUKKyAgICAgIFxkZWZcdG9jdHlwZXtvbWl0fSUKKyAgICAgIFxsZXRcc2VjdGlvbmxldmVsPVxlbXB0eQorICAgIFxlbHNlXGlmeFx0ZW1wdHlwZVxZYXBwZW5kaXhrZXl3b3JkCisgICAgICBcc2V0Ym94MCA9IFxoYm94eyM0XGVuc3BhY2V9JQorICAgICAgXGRlZlx0b2N0eXBle2FwcH0lCisgICAgICBcZ2RlZlx0aGlzc2VjdGlvbnsjMX0lCisgICAgXGVsc2UKKyAgICAgIFxzZXRib3gwID0gXGhib3h7IzRcZW5zcGFjZX0lCisgICAgICBcZGVmXHRvY3R5cGV7bnVtfSUKKyAgICAgIFxnZGVmXHRoaXNzZWN0aW9ueyMxfSUKKyAgICBcZmlcZmlcZmkKKyAgICAlCisgICAgJSBXcml0ZSB0aGUgdG9jIGVudHJ5IChiZWZvcmUgXGRvbm9kZXJlZikuICBTZWUgY29tbWVudHMgaW4gXGNoYXBtYWNyby4KKyAgICBcd3JpdGV0b2NlbnRyeXtcdG9jdHlwZVxzZWN0aW9ubGV2ZWx9eyMxfXsjNH0lCisgICAgJQorICAgICUgV3JpdGUgdGhlIG5vZGUgcmVmZXJlbmNlICg9IHBkZiBkZXN0aW5hdGlvbiBmb3IgcGRmdGV4KS4KKyAgICAlIEFnYWluLCBzZWUgY29tbWVudHMgaW4gXGNoYXBtYWNyby4KKyAgICBcZG9ub2RlcmVmeyMzfSUKKyAgICAlCisgICAgJSBJbnRlcmxpbmUgZ2x1ZSB3aWxsIGJlIGluc2VydGVkIHdoZW4gdGhlIHZib3ggaXMgY29tcGxldGVkLgorICAgICUgVGhhdCBnbHVlIHdpbGwgYmUgYSB2YWxpZCBicmVha3BvaW50IGZvciB0aGUgcGFnZSwgc2luY2UgaXQnbGwgYmUKKyAgICAlIHByZWNlZGVkIGJ5IGEgd2hhdHNpdCAodXN1YWxseSBmcm9tIHRoZSBcZG9ub2RlcmVmLCBvciBmcm9tIHRoZQorICAgICUgXHdyaXRldG9jZW50cnkgaWYgdGhlcmUgd2FzIG5vIG5vZGUpLiAgV2UgZG9uJ3Qgd2FudCB0byBhbGxvdyB0aGF0CisgICAgJSBicmVhaywgc2luY2UgdGhlbiB0aGUgd2hhdHNpdHMgY291bGQgZW5kIHVwIG9uIHBhZ2UgbiB3aGlsZSB0aGUKKyAgICAlIHNlY3Rpb24gaXMgb24gcGFnZSBuKzEsIHRodXMgdG9jL2V0Yy4gYXJlIHdyb25nLiAgRGViaWFuIGJ1ZyAyNzYwMDAuCisgICAgXG5vYnJlYWsKKyAgICAlCisgICAgJSBPdXRwdXQgdGhlIGFjdHVhbCBzZWN0aW9uIGhlYWRpbmcuCisgICAgXHZib3h7XGh5cGhlbnBlbmFsdHk9MTAwMDAgXHRvbGVyYW5jZT01MDAwIFxwYXJpbmRlbnQ9MHB0IFxyYWdnZWRyaWdodAorICAgICAgICAgIFxoYW5naW5kZW50PVx3ZDAgICUgemVybyBpZiBubyBzZWN0aW9uIG51bWJlcgorICAgICAgICAgIFx1bmhib3gwICMxfSUKKyAgfSUKKyAgJSBBZGQgZXh0cmEgc3BhY2UgYWZ0ZXIgdGhlIGhlYWRpbmcgLS0gaGFsZiBvZiB3aGF0ZXZlciBjYW1lIGFib3ZlIGl0LgorICAlIERvbid0IGFsbG93IHN0cmV0Y2gsIHRob3VnaC4KKyAgXGtlcm4gLjUgXGNzbmFtZSAjMmhlYWRpbmdza2lwXGVuZGNzbmFtZQorICAlCisgICUgRG8gbm90IGxldCB0aGUga2VybiBiZSBhIHBvdGVudGlhbCBicmVha3BvaW50LCBhcyBpdCB3b3VsZCBiZSBpZiBpdAorICAlIHdhcyBmb2xsb3dlZCBieSBnbHVlLgorICBcbm9icmVhaworICAlCisgICUgV2UnbGwgYWxtb3N0IGNlcnRhaW5seSBzdGFydCBhIHBhcmFncmFwaCBuZXh0LCBzbyBkb24ndCBsZXQgdGhhdAorICAlIGdsdWUgYWNjdW11bGF0ZS4gIChOb3QgYSBicmVha3BvaW50IGJlY2F1c2UgaXQncyBwcmVjZWRlZCBieSBhCisgICUgZGlzY2FyZGFibGUgaXRlbS4pCisgIFx2c2tpcC1ccGFyc2tpcAorICAlIAorICAlIFRoaXMgaXMgcHVyZWx5IHNvIHRoZSBsYXN0IGl0ZW0gb24gdGhlIGxpc3QgaXMgYSBrbm93biBccGVuYWx0eSA+CisgICUgMTAwMDAuICBUaGlzIGlzIHNvIFxzdGFydGRlZnVuIGNhbiBhdm9pZCBhbGxvd2luZyBicmVha3BvaW50cyBhZnRlcgorICAlIHNlY3Rpb24gaGVhZGluZ3MuICBPdGhlcndpc2UsIGl0IHdvdWxkIGluc2VydCBhIHZhbGlkIGJyZWFrcG9pbnQgYmV0d2VlbjoKKyAgJSAKKyAgJSAgIEBzZWN0aW9uIHNlYy13aGF0ZXZlcgorICAlICAgQGRlZmZuIGRlZi13aGF0ZXZlcgorICBccGVuYWx0eSAxMDAwMQorfQorCisKK1xtZXNzYWdle3RvYyx9CislIFRhYmxlIG9mIGNvbnRlbnRzLgorXG5ld3dyaXRlXHRvY2ZpbGUKKworJSBXcml0ZSBhbiBlbnRyeSB0byB0aGUgdG9jIGZpbGUsIG9wZW5pbmcgaXQgaWYgbmVjZXNzYXJ5LgorJSBDYWxsZWQgZnJvbSBAY2hhcHRlciwgZXRjLgorJQorJSBFeGFtcGxlIHVzYWdlOiBcd3JpdGV0b2NlbnRyeXtzZWN9e1NlY3Rpb24gTmFtZX17XHRoZVxjaGFwbm8uXHRoZVxzZWNub30KKyUgV2UgYXBwZW5kIHRoZSBjdXJyZW50IG5vZGUgbmFtZSAoaWYgYW55KSBhbmQgcGFnZSBudW1iZXIgYXMgYWRkaXRpb25hbAorJSBhcmd1bWVudHMgZm9yIHRoZSBce2NoYXAsc2VjLC4uLn1lbnRyeSBtYWNyb3Mgd2hpY2ggd2lsbCBldmVudHVhbGx5CislIHJlYWQgdGhpcy4gIFRoZSBub2RlIG5hbWUgaXMgdXNlZCBpbiB0aGUgcGRmIG91dGxpbmVzIGFzIHRoZQorJSBkZXN0aW5hdGlvbiB0byBqdW1wIHRvLgorJQorJSBXZSBvcGVuIHRoZSAudG9jIGZpbGUgZm9yIHdyaXRpbmcgaGVyZSBpbnN0ZWFkIG9mIGF0IEBzZXRmaWxlbmFtZSAob3IKKyUgYW55IG90aGVyIGZpeGVkIHRpbWUpIHNvIHRoYXQgQGNvbnRlbnRzIGNhbiBiZSBhbnl3aGVyZSBpbiB0aGUgZG9jdW1lbnQuCislIEJ1dCBpZiAjMSBpcyBgb21pdCcsIHRoZW4gd2UgZG9uJ3QgZG8gYW55dGhpbmcuICBUaGlzIGlzIHVzZWQgZm9yIHRoZQorJSB0YWJsZSBvZiBjb250ZW50cyBjaGFwdGVyIG9wZW5pbmdzIHRoZW1zZWx2ZXMuCislCitcbmV3aWZcaWZ0b2NmaWxlb3BlbmVkCitcZGVmXG9taXRrZXl3b3Jke29taXR9JQorJQorXGRlZlx3cml0ZXRvY2VudHJ5IzEjMiMzeyUKKyAgXGVkZWZcd3JpdGV0b2N0eXBleyMxfSUKKyAgXGlmeFx3cml0ZXRvY3R5cGVcb21pdGtleXdvcmQgXGVsc2UKKyAgICBcaWZ0b2NmaWxlb3BlbmVkXGVsc2UKKyAgICAgIFxpbW1lZGlhdGVcb3Blbm91dFx0b2NmaWxlID0gXGpvYm5hbWUudG9jCisgICAgICBcZ2xvYmFsXHRvY2ZpbGVvcGVuZWR0cnVlCisgICAgXGZpCisgICAgJQorICAgIFxpZmxpbmtzCisgICAgICB7XGF0ZHVtbWllcworICAgICAgIFxlZGVmXHRlbXB7JQorICAgICAgICAgXHdyaXRlXHRvY2ZpbGV7QCMxZW50cnl7IzJ9eyMzfXtcbGFzdG5vZGV9e1xub2V4cGFuZFxmb2xpb319fSUKKyAgICAgICBcdGVtcAorICAgICAgfSUKKyAgICBcZmkKKyAgXGZpCisgICUKKyAgJSBUZWxsIFxzaGlwb3V0IHRvIGNyZWF0ZSBhIHBkZiBkZXN0aW5hdGlvbiBvbiBlYWNoIHBhZ2UsIGlmIHdlJ3JlCisgICUgd3JpdGluZyBwZGYuICBUaGVzZSBhcmUgdXNlZCBpbiB0aGUgdGFibGUgb2YgY29udGVudHMuICBXZSBjYW4ndAorICAlIGp1c3Qgd3JpdGUgb25lIG9uIGV2ZXJ5IHBhZ2UgYmVjYXVzZSB0aGUgdGl0bGUgcGFnZXMgYXJlIG51bWJlcmVkCisgICUgMSBhbmQgMiAodGhlIHBhZ2UgbnVtYmVycyBhcmVuJ3QgcHJpbnRlZCksIGFuZCBzbyBhcmUgdGhlIGZpcnN0CisgICUgdHdvIHBhZ2VzIG9mIHRoZSBkb2N1bWVudC4gIFRodXMsIHdlJ2QgaGF2ZSB0d28gZGVzdGluYXRpb25zIG5hbWVkCisgICUgYDEnLCBhbmQgdHdvIG5hbWVkIGAyJy4KKyAgXGlmcGRmIFxnbG9iYWxccGRmbWFrZXBhZ2VkZXN0dHJ1ZSBcZmkKK30KKworCislIFRoZXNlIGNoYXJhY3RlcnMgZG8gbm90IHByaW50IHByb3Blcmx5IGluIHRoZSBDb21wdXRlciBNb2Rlcm4gcm9tYW4KKyUgZm9udHMsIHNvIHdlIG11c3QgdGFrZSBzcGVjaWFsIGNhcmUuICBUaGlzIGlzIG1vcmUgb3IgbGVzcyByZWR1bmRhbnQKKyUgd2l0aCB0aGUgVGV4aW5mbyBpbnB1dCBmb3JtYXQgc2V0dXAgYXQgdGhlIGVuZCBvZiB0aGlzIGZpbGUuCislIAorXGRlZlxhY3RpdmVjYXRjb2Rlc3slCisgIFxjYXRjb2RlYFwiPVxhY3RpdmUKKyAgXGNhdGNvZGVgXCQ9XGFjdGl2ZQorICBcY2F0Y29kZWBcPD1cYWN0aXZlCisgIFxjYXRjb2RlYFw+PVxhY3RpdmUKKyAgXGNhdGNvZGVgXFw9XGFjdGl2ZQorICBcY2F0Y29kZWBcXj1cYWN0aXZlCisgIFxjYXRjb2RlYFxfPVxhY3RpdmUKKyAgXGNhdGNvZGVgXHw9XGFjdGl2ZQorICBcY2F0Y29kZWBcfj1cYWN0aXZlCit9CisKKworJSBSZWFkIHRoZSB0b2MgZmlsZSwgd2hpY2ggaXMgZXNzZW50aWFsbHkgVGV4aW5mbyBpbnB1dC4KK1xkZWZccmVhZHRvY2ZpbGV7JQorICBcc2V0dXBkYXRhZmlsZQorICBcYWN0aXZlY2F0Y29kZXMKKyAgXGlucHV0IFxqb2JuYW1lLnRvYworfQorCitcbmV3c2tpcFxjb250ZW50c3JpZ2h0bWFyZ2luIFxjb250ZW50c3JpZ2h0bWFyZ2luPTFpbgorXG5ld2NvdW50XHNhdmVwYWdlbm8KK1xuZXdjb3VudFxsYXN0bmVnYXRpdmVwYWdlbm8gXGxhc3RuZWdhdGl2ZXBhZ2VubyA9IC0xCisKKyUgUHJlcGFyZSB0byByZWFkIHdoYXQgd2UndmUgd3JpdHRlbiB0byBcdG9jZmlsZS4KKyUKK1xkZWZcc3RhcnRjb250ZW50cyMxeyUKKyAgJSBJZiBAc2V0Y2hhcHRlcm5ld3BhZ2Ugb24sIGFuZCBAaGVhZGluZ3MgZG91YmxlLCB0aGUgY29udGVudHMgc2hvdWxkCisgICUgc3RhcnQgb24gYW4gb2RkIHBhZ2UsIHVubGlrZSBjaGFwdGVycy4gIFRodXMsIHdlIG1haW50YWluCisgICUgXGNvbnRlbnRzYWxpZ25tYWNybyBpbiBwYXJhbGxlbCB3aXRoIFxwYWdlYWxpZ25tYWNyby4KKyAgJSBGcm9tOiBUb3Jiam9ybiBHcmFubHVuZCA8dGVnZUBtYXRlbWF0aWsuc3Uuc2U+CisgIFxjb250ZW50c2FsaWdubWFjcm8KKyAgXGltbWVkaWF0ZVxjbG9zZW91dFx0b2NmaWxlCisgICUKKyAgJSBEb24ndCBuZWVkIHRvIHB1dCBgQ29udGVudHMnIG9yIGBTaG9ydCBDb250ZW50cycgaW4gdGhlIGhlYWRsaW5lLgorICAlIEl0IGlzIGFidW5kYW50bHkgY2xlYXIgd2hhdCB0aGV5IGFyZS4KKyAgXGRlZlx0aGlzY2hhcHRlcnt9JQorICBcY2hhcG1hY3JveyMxfXtZb21pdGZyb210b2N9e30lCisgICUKKyAgXHNhdmVwYWdlbm8gPSBccGFnZW5vCisgIFxiZWdpbmdyb3VwICAgICAgICAgICAgICAgICAgJSBTZXQgdXAgdG8gaGFuZGxlIGNvbnRlbnRzIGZpbGVzIHByb3Blcmx5LgorICAgIFxyYWdnZWRib3R0b20gICAgICAgICAgICAgICUgV29ycnkgbW9yZSBhYm91dCBicmVha3BvaW50cyB0aGFuIHRoZSBib3R0b20uCisgICAgXGFkdmFuY2VcaHNpemUgYnkgLVxjb250ZW50c3JpZ2h0bWFyZ2luICUgRG9uJ3QgdXNlIHRoZSBmdWxsIGxpbmUgbGVuZ3RoLgorICAgICUKKyAgICAlIFJvbWFuIG51bWVyYWxzIGZvciBwYWdlIG51bWJlcnMuCisgICAgXGlmbnVtIFxwYWdlbm8+MCBcZ2xvYmFsXHBhZ2VubyA9IFxsYXN0bmVnYXRpdmVwYWdlbm8gXGZpCit9CisKKworJSBOb3JtYWwgKGxvbmcpIHRvYy4KK1xkZWZcY29udGVudHN7JQorICBcc3RhcnRjb250ZW50c3tccHV0d29yZFRPQ30lCisgICAgXG9wZW5pbiAxIFxqb2JuYW1lLnRvYworICAgIFxpZmVvZiAxIFxlbHNlCisgICAgICBccmVhZHRvY2ZpbGUKKyAgICBcZmkKKyAgICBcdmZpbGwgXGVqZWN0CisgICAgXGNvbnRlbnRzYWxpZ25tYWNybyAlIGluIGNhc2UgQHNldGNoYXB0ZXJuZXdwYWdlIG9kZCBpcyBpbiBlZmZlY3QKKyAgICBcaWZlb2YgMSBcZWxzZQorICAgICAgXHBkZm1ha2VvdXRsaW5lcworICAgIFxmaQorICAgIFxjbG9zZWluIDEKKyAgXGVuZGdyb3VwCisgIFxsYXN0bmVnYXRpdmVwYWdlbm8gPSBccGFnZW5vCisgIFxnbG9iYWxccGFnZW5vID0gXHNhdmVwYWdlbm8KK30KKworJSBBbmQganVzdCB0aGUgY2hhcHRlcnMuCitcZGVmXHN1bW1hcnljb250ZW50c3slCisgIFxzdGFydGNvbnRlbnRze1xwdXR3b3JkU2hvcnRUT0N9JQorICAgICUKKyAgICBcbGV0XG51bWNoYXBlbnRyeSA9IFxzaG9ydGNoYXBlbnRyeQorICAgIFxsZXRcYXBwZW50cnkgPSBcc2hvcnRjaGFwZW50cnkKKyAgICBcbGV0XHVubmNoYXBlbnRyeSA9IFxzaG9ydHVubmNoYXBlbnRyeQorICAgICUgV2Ugd2FudCBhIHRydWUgcm9tYW4gaGVyZSBmb3IgdGhlIHBhZ2UgbnVtYmVycy4KKyAgICBcc2VjZm9udHMKKyAgICBcbGV0XHJtPVxzaG9ydGNvbnRybSBcbGV0XGJmPVxzaG9ydGNvbnRiZgorICAgIFxsZXRcc2w9XHNob3J0Y29udHNsIFxsZXRcdHQ9XHNob3J0Y29udHR0CisgICAgXHJtCisgICAgXGh5cGhlbnBlbmFsdHkgPSAxMDAwMAorICAgIFxhZHZhbmNlXGJhc2VsaW5lc2tpcCBieSAxcHQgJSBPcGVuIGl0IHVwIGEgbGl0dGxlLgorICAgIFxkZWZcbnVtc2VjZW50cnkjIzEjIzIjIzMjIzR7fQorICAgIFxsZXRcYXBwc2VjZW50cnkgPSBcbnVtc2VjZW50cnkKKyAgICBcbGV0XHVubnNlY2VudHJ5ID0gXG51bXNlY2VudHJ5CisgICAgXGxldFxudW1zdWJzZWNlbnRyeSA9IFxudW1zZWNlbnRyeQorICAgIFxsZXRcYXBwc3Vic2VjZW50cnkgPSBcbnVtc2VjZW50cnkKKyAgICBcbGV0XHVubnN1YnNlY2VudHJ5ID0gXG51bXNlY2VudHJ5CisgICAgXGxldFxudW1zdWJzdWJzZWNlbnRyeSA9IFxudW1zZWNlbnRyeQorICAgIFxsZXRcYXBwc3Vic3Vic2VjZW50cnkgPSBcbnVtc2VjZW50cnkKKyAgICBcbGV0XHVubnN1YnN1YnNlY2VudHJ5ID0gXG51bXNlY2VudHJ5CisgICAgXG9wZW5pbiAxIFxqb2JuYW1lLnRvYworICAgIFxpZmVvZiAxIFxlbHNlCisgICAgICBccmVhZHRvY2ZpbGUKKyAgICBcZmkKKyAgICBcY2xvc2VpbiAxCisgICAgXHZmaWxsIFxlamVjdAorICAgIFxjb250ZW50c2FsaWdubWFjcm8gJSBpbiBjYXNlIEBzZXRjaGFwdGVybmV3cGFnZSBvZGQgaXMgaW4gZWZmZWN0CisgIFxlbmRncm91cAorICBcbGFzdG5lZ2F0aXZlcGFnZW5vID0gXHBhZ2VubworICBcZ2xvYmFsXHBhZ2VubyA9IFxzYXZlcGFnZW5vCit9CitcbGV0XHNob3J0Y29udGVudHMgPSBcc3VtbWFyeWNvbnRlbnRzCisKKyUgVHlwZXNldCB0aGUgbGFiZWwgZm9yIGEgY2hhcHRlciBvciBhcHBlbmRpeCBmb3IgdGhlIHNob3J0IGNvbnRlbnRzLgorJSBUaGUgYXJnIGlzLCBlLmcuLCBgQScgZm9yIGFuIGFwcGVuZGl4LCBvciBgMycgZm9yIGEgY2hhcHRlci4KKyUKK1xkZWZcc2hvcnRjaGFwbGFiZWwjMXslCisgICUgVGhpcyBzcGFjZSBzaG91bGQgYmUgZW5vdWdoLCBzaW5jZSBhIHNpbmdsZSBudW1iZXIgaXMgLjVlbSwgYW5kIHRoZQorICAlIHdpZGVzdCBsZXR0ZXIgKE0pIGlzIDFlbSwgYXQgbGVhc3QgaW4gdGhlIENvbXB1dGVyIE1vZGVybiBmb250cy4KKyAgJSBCdXQgdXNlIFxoc3MganVzdCBpbiBjYXNlLgorICAlIChUaGlzIHNwYWNlIGRvZXNuJ3QgaW5jbHVkZSB0aGUgZXh0cmEgc3BhY2UgdGhhdCBnZXRzIGFkZGVkIGFmdGVyCisgICUgdGhlIGxhYmVsOyB0aGF0IGdldHMgcHV0IGluIGJ5IFxzaG9ydGNoYXBlbnRyeSBhYm92ZS4pCisgICUKKyAgJSBXZSdkIGxpa2UgdG8gcmlnaHQtanVzdGlmeSBjaGFwdGVyIG51bWJlcnMsIGJ1dCB0aGF0IGxvb2tzIHN0cmFuZ2UKKyAgJSB3aXRoIGFwcGVuZGl4IGxldHRlcnMuICBBbmQgcmlnaHQtanVzdGlmeWluZyBudW1iZXJzIGFuZAorICAlIGxlZnQtanVzdGlmeWluZyBsZXR0ZXJzIGxvb2tzIHN0cmFuZ2Ugd2hlbiB0aGVyZSBpcyBsZXNzIHRoYW4gMTAKKyAgJSBjaGFwdGVycy4gIEhhdmUgdG8gcmVhZCB0aGUgd2hvbGUgdG9jIG9uY2UgdG8ga25vdyBob3cgbWFueSBjaGFwdGVycworICAlIHRoZXJlIGFyZSBiZWZvcmUgZGVjaWRpbmcgLi4uCisgIFxoYm94IHRvIDFlbXsjMVxoc3N9JQorfQorCislIFRoZXNlIG1hY3JvcyBnZW5lcmF0ZSBpbmRpdmlkdWFsIGVudHJpZXMgaW4gdGhlIHRhYmxlIG9mIGNvbnRlbnRzLgorJSBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIGNoYXB0ZXIgb3Igc2VjdGlvbiBuYW1lLgorJSBUaGUgbGFzdCBhcmd1bWVudCBpcyB0aGUgcGFnZSBudW1iZXIuCislIFRoZSBhcmd1bWVudHMgaW4gYmV0d2VlbiBhcmUgdGhlIGNoYXB0ZXIgbnVtYmVyLCBzZWN0aW9uIG51bWJlciwgLi4uCisKKyUgQ2hhcHRlcnMsIGluIHRoZSBtYWluIGNvbnRlbnRzLgorXGRlZlxudW1jaGFwZW50cnkjMSMyIzMjNHtcZG9jaGFwZW50cnl7IzJcbGFiZWxzcGFjZSMxfXsjNH19CislCislIENoYXB0ZXJzLCBpbiB0aGUgc2hvcnQgdG9jLgorJSBTZWUgY29tbWVudHMgaW4gXGRvY2hhcGVudHJ5IHJlIHZib3ggYW5kIHJlbGF0ZWQgc2V0dGluZ3MuCitcZGVmXHNob3J0Y2hhcGVudHJ5IzEjMiMzIzR7JQorICBcdG9jZW50cnl7XHNob3J0Y2hhcGxhYmVseyMyfVxsYWJlbHNwYWNlICMxfXtcZG9zaG9ydHBhZ2Vub1xiZ3JvdXAjNFxlZ3JvdXB9JQorfQorCislIEFwcGVuZGljZXMsIGluIHRoZSBtYWluIGNvbnRlbnRzLgorJSBOZWVkIHRoZSB3b3JkIEFwcGVuZGl4LCBhbmQgYSBmaXhlZC1zaXplIGJveC4KKyUKK1xkZWZcYXBwZW5kaXhib3gjMXslCisgICUgV2UgdXNlIE0gc2luY2UgaXQncyBwcm9iYWJseSB0aGUgd2lkZXN0IGxldHRlci4KKyAgXHNldGJveDAgPSBcaGJveHtccHV0d29yZEFwcGVuZGl4e30gTX0lCisgIFxoYm94IHRvIFx3ZDB7XHB1dHdvcmRBcHBlbmRpeHt9ICMxXGhzc319CislCitcZGVmXGFwcGVudHJ5IzEjMiMzIzR7XGRvY2hhcGVudHJ5e1xhcHBlbmRpeGJveHsjMn1cbGFiZWxzcGFjZSMxfXsjNH19CisKKyUgVW5udW1iZXJlZCBjaGFwdGVycy4KK1xkZWZcdW5uY2hhcGVudHJ5IzEjMiMzIzR7XGRvY2hhcGVudHJ5eyMxfXsjNH19CitcZGVmXHNob3J0dW5uY2hhcGVudHJ5IzEjMiMzIzR7XHRvY2VudHJ5eyMxfXtcZG9zaG9ydHBhZ2Vub1xiZ3JvdXAjNFxlZ3JvdXB9fQorCislIFNlY3Rpb25zLgorXGRlZlxudW1zZWNlbnRyeSMxIzIjMyM0e1xkb3NlY2VudHJ5eyMyXGxhYmVsc3BhY2UjMX17IzR9fQorXGxldFxhcHBzZWNlbnRyeT1cbnVtc2VjZW50cnkKK1xkZWZcdW5uc2VjZW50cnkjMSMyIzMjNHtcZG9zZWNlbnRyeXsjMX17IzR9fQorCislIFN1YnNlY3Rpb25zLgorXGRlZlxudW1zdWJzZWNlbnRyeSMxIzIjMyM0e1xkb3N1YnNlY2VudHJ5eyMyXGxhYmVsc3BhY2UjMX17IzR9fQorXGxldFxhcHBzdWJzZWNlbnRyeT1cbnVtc3Vic2VjZW50cnkKK1xkZWZcdW5uc3Vic2VjZW50cnkjMSMyIzMjNHtcZG9zdWJzZWNlbnRyeXsjMX17IzR9fQorCislIEFuZCBzdWJzdWJzZWN0aW9ucy4KK1xkZWZcbnVtc3Vic3Vic2VjZW50cnkjMSMyIzMjNHtcZG9zdWJzdWJzZWNlbnRyeXsjMlxsYWJlbHNwYWNlIzF9eyM0fX0KK1xsZXRcYXBwc3Vic3Vic2VjZW50cnk9XG51bXN1YnN1YnNlY2VudHJ5CitcZGVmXHVubnN1YnN1YnNlY2VudHJ5IzEjMiMzIzR7XGRvc3Vic3Vic2VjZW50cnl7IzF9eyM0fX0KKworJSBUaGlzIHBhcmFtZXRlciBjb250cm9scyB0aGUgaW5kZW50YXRpb24gb2YgdGhlIHZhcmlvdXMgbGV2ZWxzLgorJSBTYW1lIGFzIFxkZWZhdWx0cGFyaW5kZW50LgorXG5ld2RpbWVuXHRvY2luZGVudCBcdG9jaW5kZW50ID0gMTVwdAorCislIE5vdyBmb3IgdGhlIGFjdHVhbCB0eXBlc2V0dGluZy4gSW4gYWxsIHRoZXNlLCAjMSBpcyB0aGUgdGV4dCBhbmQgIzIgaXMgdGhlCislIHBhZ2UgbnVtYmVyLgorJQorJSBJZiB0aGUgdG9jIGhhcyB0byBiZSBicm9rZW4gb3ZlciBwYWdlcywgd2Ugd2FudCBpdCB0byBiZSBhdCBjaGFwdGVycworJSBpZiBhdCBhbGwgcG9zc2libGU7IGhlbmNlIHRoZSBccGVuYWx0eS4KK1xkZWZcZG9jaGFwZW50cnkjMSMyeyUKKyAgIFxwZW5hbHR5LTMwMCBcdnNraXAxXGJhc2VsaW5lc2tpcCBwbHVzLjMzXGJhc2VsaW5lc2tpcCBtaW51cy4yNVxiYXNlbGluZXNraXAKKyAgIFxiZWdpbmdyb3VwCisgICAgIFxjaGFwZW50cnlmb250cworICAgICBcdG9jZW50cnl7IzF9e1xkb3BhZ2Vub1xiZ3JvdXAjMlxlZ3JvdXB9JQorICAgXGVuZGdyb3VwCisgICBcbm9icmVha1x2c2tpcCAuMjVcYmFzZWxpbmVza2lwIHBsdXMuMVxiYXNlbGluZXNraXAKK30KKworXGRlZlxkb3NlY2VudHJ5IzEjMntcYmVnaW5ncm91cAorICBcc2VjZW50cnlmb250cyBcbGVmdHNraXA9XHRvY2luZGVudAorICBcdG9jZW50cnl7IzF9e1xkb3BhZ2Vub1xiZ3JvdXAjMlxlZ3JvdXB9JQorXGVuZGdyb3VwfQorCitcZGVmXGRvc3Vic2VjZW50cnkjMSMye1xiZWdpbmdyb3VwCisgIFxzdWJzZWNlbnRyeWZvbnRzIFxsZWZ0c2tpcD0yXHRvY2luZGVudAorICBcdG9jZW50cnl7IzF9e1xkb3BhZ2Vub1xiZ3JvdXAjMlxlZ3JvdXB9JQorXGVuZGdyb3VwfQorCitcZGVmXGRvc3Vic3Vic2VjZW50cnkjMSMye1xiZWdpbmdyb3VwCisgIFxzdWJzdWJzZWNlbnRyeWZvbnRzIFxsZWZ0c2tpcD0zXHRvY2luZGVudAorICBcdG9jZW50cnl7IzF9e1xkb3BhZ2Vub1xiZ3JvdXAjMlxlZ3JvdXB9JQorXGVuZGdyb3VwfQorCislIFdlIHVzZSB0aGUgc2FtZSBcZW50cnkgbWFjcm8gYXMgZm9yIHRoZSBpbmRleCBlbnRyaWVzLgorXGxldFx0b2NlbnRyeSA9IFxlbnRyeQorCislIFNwYWNlIGJldHdlZW4gY2hhcHRlciAob3Igd2hhdGV2ZXIpIG51bWJlciBhbmQgdGhlIHRpdGxlLgorXGRlZlxsYWJlbHNwYWNle1xoc2tpcDFlbSBccmVsYXh9CisKK1xkZWZcZG9wYWdlbm8jMXt7XHJtICMxfX0KK1xkZWZcZG9zaG9ydHBhZ2VubyMxe3tccm0gIzF9fQorCitcZGVmXGNoYXBlbnRyeWZvbnRze1xzZWNmb250cyBccm19CitcZGVmXHNlY2VudHJ5Zm9udHN7XHRleHRmb250c30KK1xkZWZcc3Vic2VjZW50cnlmb250c3tcdGV4dGZvbnRzfQorXGRlZlxzdWJzdWJzZWNlbnRyeWZvbnRze1x0ZXh0Zm9udHN9CisKKworXG1lc3NhZ2V7ZW52aXJvbm1lbnRzLH0KKyUgQGZvbyAuLi4gQGVuZCBmb28uCisKKyUgQHBvaW50e30sIEByZXN1bHR7fSwgQGV4cGFuc2lvbnt9LCBAcHJpbnR7fSwgQGVxdWl2e30uCislCislIFNpbmNlIHRoZXNlIGNoYXJhY3RlcnMgYXJlIHVzZWQgaW4gZXhhbXBsZXMsIGl0IHNob3VsZCBiZSBhbiBldmVuIG51bWJlciBvZgorJSBcdHQgd2lkdGhzLiBFYWNoIFx0dCBjaGFyYWN0ZXIgaXMgMWVuLCBzbyB0d28gbWFrZXMgaXQgMWVtLgorJQorXGRlZlxwb2ludHskXHN0YXIkfQorXGRlZlxyZXN1bHR7XGxlYXZldm1vZGVccmFpc2UuMTVleFxoYm94IHRvIDFlbXtcaGZpbCRcUmlnaHRhcnJvdyRcaGZpbH19CitcZGVmXGV4cGFuc2lvbntcbGVhdmV2bW9kZVxyYWlzZS4xZXhcaGJveCB0byAxZW17XGhmaWwkXG1hcHN0byRcaGZpbH19CitcZGVmXHByaW50e1xsZWF2ZXZtb2RlXGxvd2VyLjFleFxoYm94IHRvIDFlbXtcaGZpbCRcZGFzaHYkXGhmaWx9fQorXGRlZlxlcXVpdntcbGVhdmV2bW9kZVxsb3dlci4xZXhcaGJveCB0byAxZW17XGhmaWwkXHB0ZXhlcXVpdiRcaGZpbH19CisKKyUgVGhlIEBlcnJvcnt9IGNvbW1hbmQuCislIEFkYXB0ZWQgZnJvbSB0aGUgVGVYYm9vaydzIFxib3hpdC4KKyUKK1xuZXdib3hcZXJyb3Jib3gKKyUKK3tcdGVudHQgXGdsb2JhbFxkaW1lbjAgPSAzZW19JSBXaWR0aCBvZiB0aGUgYm94LgorXGRpbWVuMiA9IC41NXB0ICUgVGhpY2tuZXNzIG9mIHJ1bGVzCislIFRoZSB0ZXh0LiAoYHInIGlzIG9wZW4gb24gdGhlIHJpZ2h0LCBgZScgc29tZXdoYXQgbGVzcyBzbyBvbiB0aGUgbGVmdC4pCitcc2V0Ym94MCA9IFxoYm94e1xrZXJuLS43NXB0IFxyZWR1Y2Vkc2YgZXJyb3Jca2Vybi0xLjVwdH0KKyUKK1xzZXRib3hcZXJyb3Jib3g9XGhib3ggdG8gXGRpbWVuMHtcaGZpbAorICAgXGhzaXplID0gXGRpbWVuMCBcYWR2YW5jZVxoc2l6ZSBieSAtNS44cHQgJSBTcGFjZSB0byBsZWZ0K3JpZ2h0LgorICAgXGFkdmFuY2VcaHNpemUgYnkgLTJcZGltZW4yICUgUnVsZXMuCisgICBcdmJveHslCisgICAgICBcaHJ1bGUgaGVpZ2h0XGRpbWVuMgorICAgICAgXGhib3h7XHZydWxlIHdpZHRoXGRpbWVuMiBca2VybjNwdCAgICAgICAgICAlIFNwYWNlIHRvIGxlZnQgb2YgdGV4dC4KKyAgICAgICAgIFx2dG9we1xrZXJuMi40cHQgXGJveDAgXGtlcm4yLjRwdH0lIFNwYWNlIGFib3ZlL2JlbG93LgorICAgICAgICAgXGtlcm4zcHRcdnJ1bGUgd2lkdGhcZGltZW4yfSUgU3BhY2UgdG8gcmlnaHQuCisgICAgICBcaHJ1bGUgaGVpZ2h0XGRpbWVuMn0KKyAgICBcaGZpbH0KKyUKK1xkZWZcZXJyb3J7XGxlYXZldm1vZGVcbG93ZXIuN2V4XGNvcHlcZXJyb3Jib3h9CisKKyUgQHRleCAuLi4gQGVuZCB0ZXggICAgZXNjYXBlcyBpbnRvIHJhdyBUZXggdGVtcG9yYXJpbHkuCislIE9uZSBleGNlcHRpb246IEAgaXMgc3RpbGwgYW4gZXNjYXBlIGNoYXJhY3Rlciwgc28gdGhhdCBAZW5kIHRleCB3b3Jrcy4KKyUgQnV0IFxAIG9yIEBAIHdpbGwgZ2V0IGEgcGxhaW4gdGV4IEAgY2hhcmFjdGVyLgorCitcZW52ZGVmXHRleHslCisgIFxjYXRjb2RlIGBcXD0wIFxjYXRjb2RlIGBcez0xIFxjYXRjb2RlIGBcfT0yCisgIFxjYXRjb2RlIGBcJD0zIFxjYXRjb2RlIGBcJj00IFxjYXRjb2RlIGBcIz02CisgIFxjYXRjb2RlIGBcXj03IFxjYXRjb2RlIGBcXz04IFxjYXRjb2RlIGBcfj1cYWN0aXZlIFxsZXR+PVx0aWUKKyAgXGNhdGNvZGUgYFwlPTE0CisgIFxjYXRjb2RlIGBcKz1cb3RoZXIKKyAgXGNhdGNvZGUgYFwiPVxvdGhlcgorICBcY2F0Y29kZSBgXHw9XG90aGVyCisgIFxjYXRjb2RlIGBcPD1cb3RoZXIKKyAgXGNhdGNvZGUgYFw+PVxvdGhlcgorICBcZXNjYXBlY2hhcj1gXFwKKyAgJQorICBcbGV0XGI9XHB0ZXhiCisgIFxsZXRcYnVsbGV0PVxwdGV4YnVsbGV0CisgIFxsZXRcYz1ccHRleGMKKyAgXGxldFwsPVxwdGV4Y29tbWEKKyAgXGxldFwuPVxwdGV4ZG90CisgIFxsZXRcZG90cz1ccHRleGRvdHMKKyAgXGxldFxlcXVpdj1ccHRleGVxdWl2CisgIFxsZXRcIT1ccHRleGV4Y2xhbQorICBcbGV0XGk9XHB0ZXhpCisgIFxsZXRcaW5kZW50PVxwdGV4aW5kZW50CisgIFxsZXRcbm9pbmRlbnQ9XHB0ZXhub2luZGVudAorICBcbGV0XHs9XHB0ZXhsYnJhY2UKKyAgXGxldFwrPVx0YWJhbGlnbgorICBcbGV0XH09XHB0ZXhyYnJhY2UKKyAgXGxldFwvPVxwdGV4c2xhc2gKKyAgXGxldFwqPVxwdGV4c3RhcgorICBcbGV0XHQ9XHB0ZXh0CisgIFxsZXRcZnJlbmNoc3BhY2luZz1ccGxhaW5mcmVuY2hzcGFjaW5nCisgICUKKyAgXGRlZlxlbmRsZG90c3tcbWF0aGlubmVye1xsZG90c1xsZG90c1xsZG90c1xsZG90c319JQorICBcZGVmXGVuZGRvdHN7XHJlbGF4XGlmbW1vZGVcZW5kbGRvdHNcZWxzZSRcbWF0aHN1cnJvdW5kPTBwdCBcZW5kbGRvdHNcLCRcZml9JQorICBcZGVmXEB7QH0lCit9CislIFRoZXJlIGlzIG5vIG5lZWQgdG8gZGVmaW5lIFxFdGV4LgorCislIERlZmluZSBAbGlzcCAuLi4gQGVuZCBsaXNwLgorJSBAbGlzcCBlbnZpcm9ubWVudCBmb3JtcyBhIGdyb3VwIHNvIGl0IGNhbiByZWJpbmQgdGhpbmdzLAorJSBpbmNsdWRpbmcgdGhlIGRlZmluaXRpb24gb2YgQGVuZCBsaXNwICh3aGljaCBub3JtYWxseSBpcyBlcnJvbmVvdXMpLgorCislIEFtb3VudCB0byBuYXJyb3cgdGhlIG1hcmdpbnMgYnkgZm9yIEBsaXNwLgorXG5ld3NraXBcbGlzcG5hcnJvd2luZyBcbGlzcG5hcnJvd2luZz0wLjRpbgorCislIFRoaXMgaXMgdGhlIGRlZmluaXRpb24gdGhhdCBeXk0gZ2V0cyBpbnNpZGUgQGxpc3AsIEBleGFtcGxlLCBhbmQgb3RoZXIKKyUgc3VjaCBlbnZpcm9ubWVudHMuICBcbnVsbCBpcyBiZXR0ZXIgdGhhbiBhIHNwYWNlLCBzaW5jZSBpdCBkb2Vzbid0CislIGhhdmUgYW55IHdpZHRoLgorXGRlZlxsaXNwcGFye1xudWxsXGVuZGdyYWZ9CisKKyUgVGhpcyBzcGFjZSBpcyBhbHdheXMgcHJlc2VudCBhYm92ZSBhbmQgYmVsb3cgZW52aXJvbm1lbnRzLgorXG5ld3NraXBcZW52c2tpcGFtb3VudCBcZW52c2tpcGFtb3VudCA9IDBwdAorCislIE1ha2Ugc3BhY2luZyBhbmQgYmVsb3cgZW52aXJvbm1lbnQgc3ltbWV0cmljYWwuICBXZSB1c2UgXHBhcnNraXAgaGVyZQorJSB0byBoZWxwIGluIGRvaW5nIHRoYXQsIHNpbmNlIGluIEBleGFtcGxlLWxpa2UgZW52aXJvbm1lbnRzIFxwYXJza2lwCislIGlzIHJlc2V0IHRvIHplcm87IHRodXMgdGhlIFxhZnRlcmVudmJyZWFrIGluc2VydHMgbm8gc3BhY2UgLS0gYnV0IHRoZQorJSBzdGFydCBvZiB0aGUgbmV4dCBwYXJhZ3JhcGggd2lsbCBpbnNlcnQgXHBhcnNraXAuCislCitcZGVmXGFib3ZlZW52YnJlYWt7eyUKKyAgJSA9MTAwMDAgaW5zdGVhZCBvZiA8MTAwMDAgYmVjYXVzZSBvZiBhIHNwZWNpYWwgY2FzZSBpbiBcaXRlbXp6eiBhbmQKKyAgJSBcc2VjdGlvbmhlYWRpbmcsIHEudi4KKyAgXGlmbnVtIFxsYXN0cGVuYWx0eT0xMDAwMCBcZWxzZQorICAgIFxhZHZhbmNlXGVudnNraXBhbW91bnQgYnkgXHBhcnNraXAKKyAgICBcZW5kZ3JhZgorICAgIFxpZmRpbVxsYXN0c2tpcDxcZW52c2tpcGFtb3VudAorICAgICAgXHJlbW92ZWxhc3Rza2lwCisgICAgICAlIGl0J3Mgbm90IGEgZ29vZCBwbGFjZSB0byBicmVhayBpZiB0aGUgbGFzdCBwZW5hbHR5IHdhcyBcbm9icmVhaworICAgICAgJSBvciBiZXR0ZXIgLi4uCisgICAgICBcaWZudW1cbGFzdHBlbmFsdHk8MTAwMDAgXHBlbmFsdHktNTAgXGZpCisgICAgICBcdnNraXBcZW52c2tpcGFtb3VudAorICAgIFxmaQorICBcZmkKK319CisKK1xsZXRcYWZ0ZXJlbnZicmVhayA9IFxhYm92ZWVudmJyZWFrCisKKyUgXG5vbmFycm93aW5nIGlzIGEgZmxhZy4gIElmICJzZXQiLCBAbGlzcCBldGMgZG9uJ3QgbmFycm93IG1hcmdpbnM7IGl0IHdpbGwKKyUgYWxzbyBjbGVhciBpdCwgc28gdGhhdCBpdHMgZW1iZWRkZWQgZW52aXJvbm1lbnRzIGRvIHRoZSBuYXJyb3dpbmcgYWdhaW4uCitcbGV0XG5vbmFycm93aW5nPVxyZWxheAorCislIEBjYXJ0b3VjaGUgLi4uIEBlbmQgY2FydG91Y2hlOiBkcmF3IHJlY3RhbmdsZSB3L3JvdW5kZWQgY29ybmVycyBhcm91bmQKKyUgZW52aXJvbm1lbnQgY29udGVudHMuCitcZm9udFxjaXJjbGU9bGNpcmNsZTEwCitcbmV3ZGltZW5cY2lyY3RoaWNrCitcbmV3ZGltZW5cY2FydG91dGVyXG5ld2RpbWVuXGNhcnRpbm5lcgorXG5ld3NraXBcbm9ybWJza2lwXG5ld3NraXBcbm9ybXBza2lwXG5ld3NraXBcbm9ybWxza2lwCitcY2lyY3RoaWNrPVxmb250ZGltZW44XGNpcmNsZQorJQorXGRlZlxjdGx7e1xjaXJjbGVcY2hhcicwMTNcaHNraXAgLTZwdH19JSA2cHQgZnJvbSBwbCBmaWxlOiAxLzJjaGFyd2lkdGgKK1xkZWZcY3Rye3tcaHNraXAgNnB0XGNpcmNsZVxjaGFyJzAxMH19CitcZGVmXGNibHt7XGNpcmNsZVxjaGFyJzAxMlxoc2tpcCAtNnB0fX0KK1xkZWZcY2Jye3tcaHNraXAgNnB0XGNpcmNsZVxjaGFyJzAxMX19CitcZGVmXGNhcnR0b3B7XGhib3ggdG8gXGNhcnRvdXRlcntcaHNraXBcbHNraXAKKyAgICAgICAgXGN0bFxsZWFkZXJzXGhydWxlIGhlaWdodFxjaXJjdGhpY2tcaGZpbFxjdHIKKyAgICAgICAgXGhza2lwXHJza2lwfX0KK1xkZWZcY2FydGJvdHtcaGJveCB0byBcY2FydG91dGVye1xoc2tpcFxsc2tpcAorICAgICAgICBcY2JsXGxlYWRlcnNcaHJ1bGUgaGVpZ2h0XGNpcmN0aGlja1xoZmlsXGNicgorICAgICAgICBcaHNraXBccnNraXB9fQorJQorXG5ld3NraXBcbHNraXBcbmV3c2tpcFxyc2tpcAorCitcZW52ZGVmXGNhcnRvdWNoZXslCisgIFxpZmhtb2RlXHBhclxmaSAgJSBjYW4ndCBiZSBpbiB0aGUgbWlkc3Qgb2YgYSBwYXJhZ3JhcGguCisgIFxzdGFydHNhdmluZ2luc2VydHMKKyAgXGxza2lwPVxsZWZ0c2tpcCBccnNraXA9XHJpZ2h0c2tpcAorICBcbGVmdHNraXA9MHB0XHJpZ2h0c2tpcD0wcHQgJSB3ZSB3YW50IHRoZXNlICpvdXRzaWRlKi4KKyAgXGNhcnRpbm5lcj1caHNpemUgXGFkdmFuY2VcY2FydGlubmVyIGJ5LVxsc2tpcAorICBcYWR2YW5jZVxjYXJ0aW5uZXIgYnktXHJza2lwCisgIFxjYXJ0b3V0ZXI9XGhzaXplCisgIFxhZHZhbmNlXGNhcnRvdXRlciBieSAxOC40cHQJJSBhbGxvdyBmb3IgM3B0IGtlcm5zIG9uIGVpdGhlcgorCQkJCSUgc2lkZSwgYW5kIGZvciA2cHQgd2FzdGUgZnJvbQorCQkJCSUgZWFjaCBjb3JuZXIgY2hhciwgYW5kIHJ1bGUgdGhpY2tuZXNzCisgIFxub3JtYnNraXA9XGJhc2VsaW5lc2tpcCBcbm9ybXBza2lwPVxwYXJza2lwIFxub3JtbHNraXA9XGxpbmVza2lwCisgICUgRmxhZyB0byB0ZWxsIEBsaXNwLCBldGMuLCBub3QgdG8gbmFycm93IG1hcmdpbi4KKyAgXGxldFxub25hcnJvd2luZyA9IHQlCisgIFx2Ym94XGJncm91cAorICAgICAgXGJhc2VsaW5lc2tpcD0wcHRccGFyc2tpcD0wcHRcbGluZXNraXA9MHB0CisgICAgICBcY2FydHRvcAorICAgICAgXGhib3hcYmdyb3VwCisJICBcaHNraXBcbHNraXAKKwkgIFx2cnVsZVxrZXJuM3B0CisJICBcdmJveFxiZ3JvdXAKKwkgICAgICBca2VybjNwdAorCSAgICAgIFxoc2l6ZT1cY2FydGlubmVyCisJICAgICAgXGJhc2VsaW5lc2tpcD1cbm9ybWJza2lwCisJICAgICAgXGxpbmVza2lwPVxub3JtbHNraXAKKwkgICAgICBccGFyc2tpcD1cbm9ybXBza2lwCisJICAgICAgXHZza2lwIC1ccGFyc2tpcAorCSAgICAgIFxjb21tZW50ICUgRm9yIGV4cGxhbmF0aW9uLCBzZWUgdGhlIGVuZCBvZiBcZGVmXGdyb3VwLgorfQorXGRlZlxFY2FydG91Y2hleyUKKyAgICAgICAgICAgICAgXGlmaG1vZGVccGFyXGZpCisJICAgICAgXGtlcm4zcHQKKwkgIFxlZ3JvdXAKKwkgIFxrZXJuM3B0XHZydWxlCisJICBcaHNraXBccnNraXAKKyAgICAgIFxlZ3JvdXAKKyAgICAgIFxjYXJ0Ym90CisgIFxlZ3JvdXAKKyAgXGNoZWNraW5zZXJ0cworfQorCisKKyUgVGhpcyBtYWNybyBpcyBjYWxsZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBhbGwgdGhlIEBleGFtcGxlIHZhcmlhbnRzLAorJSBpbnNpZGUgYSBncm91cC4KK1xkZWZcbm9uZmlsbHN0YXJ0eyUKKyAgXGFib3ZlZW52YnJlYWsKKyAgXGhmdXp6ID0gMTJwdCAlIERvbid0IGJlIGZ1c3N5CisgIFxzZXBzcGFjZXMgJSBNYWtlIHNwYWNlcyBiZSB3b3JkLXNlcGFyYXRvcnMgcmF0aGVyIHRoYW4gc3BhY2UgdG9rZW5zLgorICBcbGV0XHBhciA9IFxsaXNwcGFyICUgZG9uJ3QgaWdub3JlIGJsYW5rIGxpbmVzCisgIFxvYmV5bGluZXMgJSBlYWNoIGxpbmUgb2YgaW5wdXQgaXMgYSBsaW5lIG9mIG91dHB1dAorICBccGFyc2tpcCA9IDBwdAorICBccGFyaW5kZW50ID0gMHB0CisgIFxlbWVyZ2VuY3lzdHJldGNoID0gMHB0ICUgZG9uJ3QgdHJ5IHRvIGF2b2lkIG92ZXJmdWxsIGJveGVzCisgIFxpZnhcbm9uYXJyb3dpbmdccmVsYXgKKyAgICBcYWR2YW5jZSBcbGVmdHNraXAgYnkgXGxpc3BuYXJyb3dpbmcKKyAgICBcZXhkZW50YW1vdW50PVxsaXNwbmFycm93aW5nCisgIFxlbHNlCisgICAgXGxldFxub25hcnJvd2luZyA9IFxyZWxheAorICBcZmkKKyAgXGxldFxleGRlbnQ9XG5vZmlsbGV4ZGVudAorfQorCislIElmIHlvdSB3YW50IGFsbCBleGFtcGxlcyBldGMuIHNtYWxsOiBAc2V0IGRpc3BlbnZzaXplIHNtYWxsLgorJSBJZiB5b3Ugd2FudCBldmVuIHNtYWxsIGV4YW1wbGVzIHRoZSBmdWxsIHNpemU6IEBzZXQgZGlzcGVudnNpemUgbm9zbWFsbC4KKyUgVGhpcyBhZmZlY3RzIHRoZSBmb2xsb3dpbmcgZGlzcGxheWVkIGVudmlyb25tZW50czoKKyUgICAgQGV4YW1wbGUsIEBkaXNwbGF5LCBAZm9ybWF0LCBAbGlzcAorJQorXGRlZlxzbWFsbHdvcmR7c21hbGx9CitcZGVmXG5vc21hbGx3b3Jke25vc21hbGx9CitcbGV0XFNFVGRpc3BlbnZzaXplXHJlbGF4CitcZGVmXHNldG5vcm1hbGRpc3BlbnZ7JQorICBcaWZ4XFNFVGRpc3BlbnZzaXplXHNtYWxsd29yZAorICAgIFxzbWFsbGV4YW1wbGVmb250cyBccm0KKyAgXGZpCit9CitcZGVmXHNldHNtYWxsZGlzcGVudnslCisgIFxpZnhcU0VUZGlzcGVudnNpemVcbm9zbWFsbHdvcmQKKyAgXGVsc2UKKyAgICBcc21hbGxleGFtcGxlZm9udHMgXHJtCisgIFxmaQorfQorCislIFdlIG9mdGVuIGRlZmluZSB0d28gZW52aXJvbm1lbnRzLCBAZm9vIGFuZCBAc21hbGxmb28uCislIExldCdzIGRvIGl0IGJ5IG9uZSBjb21tYW5kOgorXGRlZlxtYWtlZGlzcGVudiAjMSMyeworICBcZXhwYW5kYWZ0ZXJcZW52ZGVmXGNzbmFtZSMxXGVuZGNzbmFtZSB7XHNldG5vcm1hbGRpc3BlbnYgIzJ9CisgIFxleHBhbmRhZnRlclxlbnZkZWZcY3NuYW1lIHNtYWxsIzFcZW5kY3NuYW1lIHtcc2V0c21hbGxkaXNwZW52ICMyfQorICBcZXhwYW5kYWZ0ZXJcbGV0XGNzbmFtZSBFIzFcZW5kY3NuYW1lIFxhZnRlcmVudmJyZWFrCisgIFxleHBhbmRhZnRlclxsZXRcY3NuYW1lIEVzbWFsbCMxXGVuZGNzbmFtZSBcYWZ0ZXJlbnZicmVhaworfQorCislIERlZmluZSB0d28gc3lub255bXM6CitcZGVmXG1ha2V0d29kaXNwZW52cyAjMSMyIzN7CisgIFxtYWtlZGlzcGVudnsjMX17IzN9CisgIFxtYWtlZGlzcGVudnsjMn17IzN9Cit9CisKKyUgQGxpc3A6IGluZGVudGVkLCBuYXJyb3dlZCwgdHlwZXdyaXRlciBmb250OyBAZXhhbXBsZTogc2FtZSBhcyBAbGlzcC4KKyUKKyUgQHNtYWxsZXhhbXBsZSBhbmQgQHNtYWxsbGlzcDogdXNlIHNtYWxsZXIgZm9udHMuCislIE9yaWdpbmFsbHkgY29udHJpYnV0ZWQgYnkgUGF2ZWxAeGVyb3guCislCitcbWFrZXR3b2Rpc3BlbnZzIHtsaXNwfXtleGFtcGxlfXslCisgIFxub25maWxsc3RhcnQKKyAgXHR0XHF1b3RlZXhwYW5kCisgIFxsZXRca2JkZm9udCA9IFxrYmRleGFtcGxlZm9udCAlIEFsbG93IEBrYmQgdG8gZG8gc29tZXRoaW5nIHNwZWNpYWwuCisgIFxnb2JibGUgICAgICAgJSBlYXQgcmV0dXJuCit9CislIEBkaXNwbGF5L0BzbWFsbGRpc3BsYXk6IHNhbWUgYXMgQGxpc3AgZXhjZXB0IGtlZXAgY3VycmVudCBmb250LgorJQorXG1ha2VkaXNwZW52IHtkaXNwbGF5fXslCisgIFxub25maWxsc3RhcnQKKyAgXGdvYmJsZQorfQorCislIEBmb3JtYXQvQHNtYWxsZm9ybWF0OiBzYW1lIGFzIEBkaXNwbGF5IGV4Y2VwdCBkb24ndCBuYXJyb3cgbWFyZ2lucy4KKyUKK1xtYWtlZGlzcGVudntmb3JtYXR9eyUKKyAgXGxldFxub25hcnJvd2luZyA9IHQlCisgIFxub25maWxsc3RhcnQKKyAgXGdvYmJsZQorfQorCislIEBmbHVzaGxlZnQ6IHNhbWUgYXMgQGZvcm1hdCwgYnV0IGRvZXNuJ3Qgb2JleSBcU0VUZGlzcGVudnNpemUuCitcZW52ZGVmXGZsdXNobGVmdHslCisgIFxsZXRcbm9uYXJyb3dpbmcgPSB0JQorICBcbm9uZmlsbHN0YXJ0CisgIFxnb2JibGUKK30KK1xsZXRcRWZsdXNobGVmdCA9IFxhZnRlcmVudmJyZWFrCisKKyUgQGZsdXNocmlnaHQuCislCitcZW52ZGVmXGZsdXNocmlnaHR7JQorICBcbGV0XG5vbmFycm93aW5nID0gdCUKKyAgXG5vbmZpbGxzdGFydAorICBcYWR2YW5jZVxsZWZ0c2tpcCBieSAwcHQgcGx1cyAxZmlsbAorICBcZ29iYmxlCit9CitcbGV0XEVmbHVzaHJpZ2h0ID0gXGFmdGVyZW52YnJlYWsKKworCislIEBxdW90YXRpb24gZG9lcyBub3JtYWwgbGluZWJyZWFraW5nIChoZW5jZSB3ZSBjYW4ndCB1c2UgXG5vbmZpbGxzdGFydCkKKyUgYW5kIG5hcnJvd3MgdGhlIG1hcmdpbnMuICBXZSBrZWVwIFxwYXJza2lwIG5vbnplcm8gaW4gZ2VuZXJhbCwgc2luY2UKKyUgd2UncmUgZG9pbmcgbm9ybWFsIGZpbGxpbmcuICBTbywgd2hlbiB1c2luZyBcYWJvdmVlbnZicmVhayBhbmQKKyUgXGFmdGVyZW52YnJlYWssIHRlbXBvcmFyaWx5IG1ha2UgXHBhcnNraXAgMC4KKyUKK1xlbnZkZWZccXVvdGF0aW9ueyUKKyAge1xwYXJza2lwPTBwdCBcYWJvdmVlbnZicmVha30lIGJlY2F1c2UgXGFib3ZlZW52YnJlYWsgaW5zZXJ0cyBccGFyc2tpcAorICBccGFyaW5kZW50PTBwdAorICAlCisgICUgQGNhcnRvdWNoZSBkZWZpbmVzIFxub25hcnJvd2luZyB0byBpbmhpYml0IG5hcnJvd2luZyBhdCBuZXh0IGxldmVsIGRvd24uCisgIFxpZnhcbm9uYXJyb3dpbmdccmVsYXgKKyAgICBcYWR2YW5jZVxsZWZ0c2tpcCBieSBcbGlzcG5hcnJvd2luZworICAgIFxhZHZhbmNlXHJpZ2h0c2tpcCBieSBcbGlzcG5hcnJvd2luZworICAgIFxleGRlbnRhbW91bnQgPSBcbGlzcG5hcnJvd2luZworICBcZWxzZQorICAgIFxsZXRcbm9uYXJyb3dpbmcgPSBccmVsYXgKKyAgXGZpCisgIFxwYXJzZWFyZ1xxdW90YXRpb25sYWJlbAorfQorCislIFdlIGhhdmUgcmV0YWluZWQgYSBub256ZXJvIHBhcnNraXAgZm9yIHRoZSBlbnZpcm9ubWVudCwgc2luY2Ugd2UncmUKKyUgZG9pbmcgbm9ybWFsIGZpbGxpbmcuCislCitcZGVmXEVxdW90YXRpb257JQorICBccGFyCisgIFxpZnhccXVvdGF0aW9uYXV0aG9yXHVuZGVmaW5lZFxlbHNlCisgICAgJSBpbmRlbnQgYSBiaXQuCisgICAgXGxlZnRsaW5le1xrZXJuIDJcbGVmdHNraXAgXHNsIC0tLVxxdW90YXRpb25hdXRob3J9JQorICBcZmkKKyAge1xwYXJza2lwPTBwdCBcYWZ0ZXJlbnZicmVha30lCit9CisKKyUgSWYgd2UncmUgZ2l2ZW4gYW4gYXJndW1lbnQsIHR5cGVzZXQgaXQgaW4gYm9sZCB3aXRoIGEgY29sb24gYWZ0ZXIuCitcZGVmXHF1b3RhdGlvbmxhYmVsIzF7JQorICBcZGVmXHRlbXB7IzF9JQorICBcaWZ4XHRlbXBcZW1wdHkgXGVsc2UKKyAgICB7XGJmICMxOiB9JQorICBcZmkKK30KKworCislIExhVGVYLWxpa2UgQHZlcmJhdGltLi4uQGVuZCB2ZXJiYXRpbSBhbmQgQHZlcmJ7PGNoYXI+Li4uPGNoYXI+fQorJSBJZiB3ZSB3YW50IHRvIGFsbG93IGFueSA8Y2hhcj4gYXMgZGVsaW1pdGVyLAorJSB3ZSBuZWVkIHRoZSBjdXJseSBicmFjZXMgc28gdGhhdCBtYWtlaW5mbyBzZWVzIHRoZSBAdmVyYiBjb21tYW5kLCBlZzoKKyUgYEB2ZXJieC4uLngnIHdvdWxkIGxvb2sgbGlrZSB0aGUgJ0B2ZXJieCcgY29tbWFuZC4gIC0tamFubmVrZUBnbnUub3JnCislCislIFtLbnV0aF06IERvbmFsZCBFcnZpbiBLbnV0aCwgMTk5Ni4gIFRoZSBUZVhib29rLgorJQorJSBbS251dGhdIHAuMzQ0OyBvbmx5IHdlIG5lZWQgdG8gZG8gdGhlIG90aGVyIGNoYXJhY3RlcnMgVGV4aW5mbyBzZXRzCislIGFjdGl2ZSB0b28uICBPdGhlcndpc2UsIHRoZXkgZ2V0IGxvc3QgYXMgdGhlIGZpcnN0IGNoYXJhY3RlciBvbiBhCislIHZlcmJhdGltIGxpbmUuCitcZGVmXGRvc3BlY2lhbHN7JQorICBcZG9cIFxkb1xcXGRvXHtcZG9cfVxkb1wkXGRvXCYlCisgIFxkb1wjXGRvXF5cZG9cXl5LXGRvXF9cZG9cXl5BXGRvXCVcZG9cfiUKKyAgXGRvXDxcZG9cPlxkb1x8XGRvXEBcZG8rXGRvXCIlCit9CislCislIFtLbnV0aF0gcC4gMzgwCitcZGVmXHVuY2F0Y29kZXNwZWNpYWxzeyUKKyAgXGRlZlxkbyMjMXtcY2F0Y29kZWAjIzE9XG90aGVyfVxkb3NwZWNpYWxzfQorJQorJSBbS251dGhdIHBwLiAzODAsMzgxLDM5MQorJSBEaXNhYmxlIFNwYW5pc2ggbGlnYXR1cmVzID9gIGFuZCAhYCBvZiBcdHQgZm9udAorXGJlZ2luZ3JvdXAKKyAgXGNhdGNvZGVgXGA9XGFjdGl2ZVxnZGVmYHtccmVsYXhcbHF9CitcZW5kZ3JvdXAKKyUKKyUgU2V0dXAgZm9yIHRoZSBAdmVyYiBjb21tYW5kLgorJQorJSBFaWdodCBzcGFjZXMgZm9yIGEgdGFiCitcYmVnaW5ncm91cAorICBcY2F0Y29kZWBcXl5JPVxhY3RpdmUKKyAgXGdkZWZcdGFiZWlnaHRzcGFjZXN7XGNhdGNvZGVgXF5eST1cYWN0aXZlXGRlZl5eSXtcIFwgXCBcIFwgXCBcIFwgfX0KK1xlbmRncm91cAorJQorXGRlZlxzZXR1cHZlcmJ7JQorICBcdHQgICUgZWFzaWVzdCAoYW5kIGNvbnZlbnRpb25hbGx5IHVzZWQpIGZvbnQgZm9yIHZlcmJhdGltCisgIFxkZWZccGFye1xsZWF2ZXZtb2RlXGVuZGdyYWZ9JQorICBcY2F0Y29kZWBcYD1cYWN0aXZlCisgIFx0YWJlaWdodHNwYWNlcworICAlIFJlc3BlY3QgbGluZSBicmVha3MsCisgICUgcHJpbnQgc3BlY2lhbCBzeW1ib2xzIGFzIHRoZW1zZWx2ZXMsIGFuZAorICAlIG1ha2UgZWFjaCBzcGFjZSBjb3VudAorICAlIG11c3QgZG8gaW4gdGhpcyBvcmRlcjoKKyAgXG9iZXlsaW5lcyBcdW5jYXRjb2Rlc3BlY2lhbHMgXHNlcHNwYWNlcworfQorCislIFNldHVwIGZvciB0aGUgQHZlcmJhdGltIGVudmlyb25tZW50CislCislIFJlYWwgdGFiIGV4cGFuc2lvbgorXG5ld2RpbWVuXHRhYncgXHNldGJveDA9XGhib3h7XHR0XHNwYWNlfSBcdGFidz04XHdkMCAlIHRhYiBhbW91bnQKKyUKK1xkZWZcc3RhcnR0YWJib3h7XHNldGJveDA9XGhib3hcYmdyb3VwfQorCislIEFsbG93IGFuIG9wdGlvbiB0byBub3QgcmVwbGFjZSBxdW90ZXMgd2l0aCBhIHJlZ3VsYXIgZGlyZWN0ZWQgcmlnaHQKKyUgcXVvdGUvYXBvc3Ryb3BoZSAoY2hhciAweDI3KSwgYnV0IGluc3RlYWQgdXNlIHRoZSB1bmRpcmVjdGVkIHF1b3RlCislIGZyb20gY210dCAoY2hhciAweDBkKS4gIFRoZSB1bmRpcmVjdGVkIHF1b3RlIGlzIHVnbHksIHNvIGRvbid0IG1ha2UgaXQKKyUgdGhlIGRlZmF1bHQsIGJ1dCBpdCB3b3JrcyBmb3IgcGFzdGluZyB3aXRoIG1vcmUgcGRmIHZpZXdlcnMgKGF0IGxlYXN0CislIGV2aW5jZSksIHRoZSBsaWx5cG9uZCBkZXZlbG9wZXJzIHJlcG9ydC4gIHhwZGYgZG9lcyB3b3JrIHdpdGggdGhlCislIHJlZ3VsYXIgMHgyNy4gIAorJSAKK1xkZWZcY29kZXF1b3RlcmlnaHR7JQorICBcZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSBTRVRjb2RlcXVvdGV1bmRpcmVjdGVkXGVuZGNzbmFtZVxyZWxheAorICAgICclCisgIFxlbHNlCisgICAgXGNoYXInMTUKKyAgXGZpCit9CislCislIGFuZCBhIHNpbWlsYXIgb3B0aW9uIGZvciB0aGUgbGVmdCBxdW90ZSBjaGFyIHZzLiBhIGdyYXZlIGFjY2VudC4KKyUgTW9kZXJuIGZvbnRzIGRpc3BsYXkgQVNDSUkgMHg2MCBhcyBhIGdyYXZlIGFjY2VudCwgc28gc29tZSBwZW9wbGUgbGlrZQorJSB0aGUgY29kZSBlbnZpcm9ubWVudHMgdG8gZG8gbGlrZXdpc2UuCislIAorXGRlZlxjb2RlcXVvdGVsZWZ0eyUKKyAgXGV4cGFuZGFmdGVyXGlmeFxjc25hbWUgU0VUY29kZXF1b3RlYmFja3RpY2tcZW5kY3NuYW1lXHJlbGF4CisgICAgYCUKKyAgXGVsc2UKKyAgICBcY2hhcicyMgorICBcZmkKK30KKyUKK1xiZWdpbmdyb3VwCisgIFxjYXRjb2RlYFxeXkk9XGFjdGl2ZQorICBcZ2RlZlx0YWJleHBhbmR7JQorICAgIFxjYXRjb2RlYFxeXkk9XGFjdGl2ZQorICAgIFxkZWZeXkl7XGxlYXZldm1vZGVcZWdyb3VwCisgICAgICBcZGltZW4wPVx3ZDAgJSB0aGUgd2lkdGggc28gZmFyLCBvciBzaW5jZSB0aGUgcHJldmlvdXMgdGFiCisgICAgICBcZGl2aWRlXGRpbWVuMCBieVx0YWJ3CisgICAgICBcbXVsdGlwbHlcZGltZW4wIGJ5XHRhYncgJSBjb21wdXRlIHByZXZpb3VzIG11bHRpcGxlIG9mIFx0YWJ3CisgICAgICBcYWR2YW5jZVxkaW1lbjAgYnlcdGFidyAgJSBhZHZhbmNlIHRvIG5leHQgbXVsdGlwbGUgb2YgXHRhYncKKyAgICAgIFx3ZDA9XGRpbWVuMCBcYm94MCBcc3RhcnR0YWJib3gKKyAgICB9JQorICB9CisgIFxjYXRjb2RlYFwnPVxhY3RpdmUKKyAgXGdkZWZccnF1b3RlZXhwYW5ke1xjYXRjb2RlXHJxdW90ZUNoYXI9XGFjdGl2ZSBcZGVmJ3tcY29kZXF1b3RlcmlnaHR9fSUKKyAgJQorICBcY2F0Y29kZWBcYD1cYWN0aXZlCisgIFxnZGVmXGxxdW90ZWV4cGFuZHtcY2F0Y29kZVxscXVvdGVDaGFyPVxhY3RpdmUgXGRlZmB7XGNvZGVxdW90ZWxlZnR9fSUKKyAgJQorICBcZ2RlZlxxdW90ZWV4cGFuZHtccnF1b3RlZXhwYW5kIFxscXVvdGVleHBhbmR9JQorXGVuZGdyb3VwCisKKyUgc3RhcnQgdGhlIHZlcmJhdGltIGVudmlyb25tZW50LgorXGRlZlxzZXR1cHZlcmJhdGlteyUKKyAgXGxldFxub25hcnJvd2luZyA9IHQlCisgIFxub25maWxsc3RhcnQKKyAgJSBFYXNpZXN0IChhbmQgY29udmVudGlvbmFsbHkgdXNlZCkgZm9udCBmb3IgdmVyYmF0aW0KKyAgXHR0CisgIFxkZWZccGFye1xsZWF2ZXZtb2RlXGVncm91cFxib3gwXGVuZGdyYWZ9JQorICBcY2F0Y29kZWBcYD1cYWN0aXZlCisgIFx0YWJleHBhbmQKKyAgXHF1b3RlZXhwYW5kCisgICUgUmVzcGVjdCBsaW5lIGJyZWFrcywKKyAgJSBwcmludCBzcGVjaWFsIHN5bWJvbHMgYXMgdGhlbXNlbHZlcywgYW5kCisgICUgbWFrZSBlYWNoIHNwYWNlIGNvdW50CisgICUgbXVzdCBkbyBpbiB0aGlzIG9yZGVyOgorICBcb2JleWxpbmVzIFx1bmNhdGNvZGVzcGVjaWFscyBcc2Vwc3BhY2VzCisgIFxldmVyeXBhcntcc3RhcnR0YWJib3h9JQorfQorCislIERvIHRoZSBAdmVyYiBtYWdpYzogdmVyYmF0aW0gdGV4dCBpcyBxdW90ZWQgYnkgdW5pcXVlCislIGRlbGltaXRlciBjaGFyYWN0ZXJzLiAgQmVmb3JlIGZpcnN0IGRlbGltaXRlciBleHBlY3QgYQorJSByaWdodCBicmFjZSwgYWZ0ZXIgbGFzdCBkZWxpbWl0ZXIgZXhwZWN0IGNsb3NpbmcgYnJhY2U6CislCislICAgIFxkZWZcZG92ZXJiJ3snPGNoYXI+IzE8Y2hhcj4nfSd7IzF9CislCislIFtLbnV0aF0gcC4gMzgyOyBvbmx5IGVhdCBvdXRlciB7fQorXGJlZ2luZ3JvdXAKKyAgXGNhdGNvZGVgWz0xXGNhdGNvZGVgXT0yXGNhdGNvZGVgXHs9XG90aGVyXGNhdGNvZGVgXH09XG90aGVyCisgIFxnZGVmXGRvdmVyYnsjMVtcZGVmXG5leHQjIzEjMX1bIyMxXGVuZGdyb3VwXVxuZXh0XQorXGVuZGdyb3VwCislCitcZGVmXHZlcmJ7XGJlZ2luZ3JvdXBcc2V0dXB2ZXJiXGRvdmVyYn0KKyUKKyUKKyUgRG8gdGhlIEB2ZXJiYXRpbSBtYWdpYzogZGVmaW5lIHRoZSBtYWNybyBcZG92ZXJiYXRpbSBzbyB0aGF0CislIHRoZSAoZmlyc3QpIGFyZ3VtZW50IGVuZHMgd2hlbiAnQGVuZCB2ZXJiYXRpbScgaXMgcmVhY2hlZCwgaWU6CislCislICAgICBcZGVmXGRvdmVyYmF0aW0jMUBlbmQgdmVyYmF0aW17IzF9CislCislIEZvciBUZXhpbmZvIGl0J3MgYSBsb3QgZWFzaWVyIHRoYW4gZm9yIExhVGVYLAorJSBiZWNhdXNlIHRleGluZm8ncyBcdmVyYmF0aW0gZG9lc24ndCBzdG9wIGF0ICdcZW5ke3ZlcmJhdGltfSc6CislIHdlIG5lZWQgbm90IHJlZGVmaW5lICdcJywgJ3snIGFuZCAnfScuCislCislIEluc3BpcmVkIGJ5IExhVGVYJ3MgdmVyYmF0aW0gY29tbWFuZCBzZXQgW2xhdGV4Lmx0eF0KKyUKK1xiZWdpbmdyb3VwCisgIFxjYXRjb2RlYFwgPVxhY3RpdmUKKyAgXG9iZXlsaW5lcyAlCisgICUgaWdub3JlIGV2ZXJ5dGhpbmcgdXAgdG8gdGhlIGZpcnN0IF5eTSwgdGhhdCdzIHRoZSBuZXdsaW5lIGF0IHRoZSBlbmQKKyAgJSBvZiB0aGUgQHZlcmJhdGltIGlucHV0IGxpbmUgaXRzZWxmLiAgT3RoZXJ3aXNlIHdlIGdldCBhbiBleHRyYSBibGFuaworICAlIGxpbmUgaW4gdGhlIG91dHB1dC4KKyAgXHhkZWZcZG92ZXJiYXRpbSMxXl5NIzJAZW5kIHZlcmJhdGlteyMyXG5vZXhwYW5kXGVuZFxnb2JibGUgdmVyYmF0aW19JQorICAlIFdlIHJlYWxseSB3YW50IHsuLi5cZW5kIHZlcmJhdGltfSBpbiB0aGUgYm9keSBvZiB0aGUgbWFjcm8sIGJ1dAorICAlIHdpdGhvdXQgdGhlIGFjdGl2ZSBzcGFjZTsgdGh1cyB3ZSBoYXZlIHRvIHVzZSBceGRlZiBhbmQgXGdvYmJsZS4KK1xlbmRncm91cAorJQorXGVudmRlZlx2ZXJiYXRpbXslCisgICAgXHNldHVwdmVyYmF0aW1cZG92ZXJiYXRpbQorfQorXGxldFxFdmVyYmF0aW0gPSBcYWZ0ZXJlbnZicmVhaworCisKKyUgQHZlcmJhdGltaW5jbHVkZSBGSUxFIC0gaW5zZXJ0IHRleHQgb2YgZmlsZSBpbiB2ZXJiYXRpbSBlbnZpcm9ubWVudC4KKyUKK1xkZWZcdmVyYmF0aW1pbmNsdWRle1xwYXJzZWFyZ3VzaW5nXGZpbGVuYW1lY2F0Y29kZXNcZG92ZXJiYXRpbWluY2x1ZGV9CislCitcZGVmXGRvdmVyYmF0aW1pbmNsdWRlIzF7JQorICB7JQorICAgIFxtYWtldmFsdWVleHBhbmRhYmxlCisgICAgXHNldHVwdmVyYmF0aW0KKyAgICBcaW5wdXQgIzEKKyAgICBcYWZ0ZXJlbnZicmVhaworICB9JQorfQorCislIEBjb3B5aW5nIC4uLiBAZW5kIGNvcHlpbmcuCislIFNhdmUgdGhlIHRleHQgYXdheSBmb3IgQGluc2VydGNvcHlpbmcgbGF0ZXIuCislCislIFdlIHNhdmUgdGhlIHVuaW50ZXJwcmV0ZWQgdG9rZW5zLCByYXRoZXIgdGhhbiBjcmVhdGluZyBhIGJveC4KKyUgU2F2aW5nIHRoZSB0ZXh0IGluIGEgYm94IHdvdWxkIGJlIG11Y2ggZWFzaWVyLCBidXQgdGhlbiBhbGwgdGhlCislIHR5cGVzZXR0aW5nIGNvbW1hbmRzIChAc21hbGxib29rLCBmb250IGNoYW5nZXMsIGV0Yy4pIGhhdmUgdG8gYmUgZG9uZQorJSBiZWZvcmVoYW5kIC0tIGFuZCBhKSB3ZSB3YW50IEBjb3B5aW5nIHRvIGJlIGRvbmUgZmlyc3QgaW4gdGhlIHNvdXJjZQorJSBmaWxlOyBiKSBsZXR0aW5nIHVzZXJzIGRlZmluZSB0aGUgZnJvbnRtYXR0ZXIgaW4gYXMgZmxleGlibGUgb3JkZXIgYXMKKyUgcG9zc2libGUgaXMgdmVyeSBkZXNpcmFibGUuCislCitcZGVmXGNvcHlpbmd7XGNoZWNrZW52e31cYmVnaW5ncm91cFxzY2FuYXJnY3R4dFxkb2NvcHlpbmd9CitcZGVmXGRvY29weWluZyMxQGVuZCBjb3B5aW5ne1xlbmRncm91cFxkZWZcY29weWluZ3RleHR7IzF9fQorJQorXGRlZlxpbnNlcnRjb3B5aW5neyUKKyAgXGJlZ2luZ3JvdXAKKyAgICBccGFyaW5kZW50ID0gMHB0ICAlIHBhcmFncmFwaCBpbmRlbnRhdGlvbiBsb29rcyB3cm9uZyBvbiB0aXRsZSBwYWdlCisgICAgXHNjYW5leHBcY29weWluZ3RleHQKKyAgXGVuZGdyb3VwCit9CisKK1xtZXNzYWdle2RlZnVucyx9CislIEBkZWZ1biBldGMuCisKK1xuZXdza2lwXGRlZmJvZHlpbmRlbnQgXGRlZmJvZHlpbmRlbnQ9LjRpbgorXG5ld3NraXBcZGVmYXJnc2luZGVudCBcZGVmYXJnc2luZGVudD01MHB0CitcbmV3c2tpcFxkZWZsYXN0YXJnbWFyZ2luIFxkZWZsYXN0YXJnbWFyZ2luPTE4cHQKKworJSBTdGFydCB0aGUgcHJvY2Vzc2luZyBvZiBAZGVmZm46CitcZGVmXHN0YXJ0ZGVmdW57JQorICBcaWZudW1cbGFzdHBlbmFsdHk8MTAwMDAKKyAgICBcbWVkYnJlYWsKKyAgXGVsc2UKKyAgICAlIElmIHRoZXJlIGFyZSB0d28gQGRlZiBjb21tYW5kcyBpbiBhIHJvdywgd2UnbGwgaGF2ZSBhIFxub2JyZWFrLAorICAgICUgd2hpY2ggaXMgdGhlcmUgdG8ga2VlcCB0aGUgZnVuY3Rpb24gZGVzY3JpcHRpb24gdG9nZXRoZXIgd2l0aCBpdHMKKyAgICAlIGhlYWRlci4gIEJ1dCBpZiB0aGVyZSdzIG5vdGhpbmcgYnV0IGhlYWRlcnMsIHdlIG5lZWQgdG8gYWxsb3cgYQorICAgICUgYnJlYWsgc29tZXdoZXJlLiAgQ2hlY2sgc3BlY2lmaWNhbGx5IGZvciBwZW5hbHR5IDEwMDAyLCBpbnNlcnRlZAorICAgICUgYnkgXGRlZmFyZ3Njb21tb25lbmRpbmcsIGluc3RlYWQgb2YgMTAwMDAsIHNpbmNlIHRoZSBzZWN0aW9uaW5nCisgICAgJSBjb21tYW5kcyBhbHNvIGluc2VydCBhIG5vYnJlYWsgcGVuYWx0eSwgYW5kIHdlIGRvbid0IHdhbnQgdG8gYWxsb3cKKyAgICAlIGEgYnJlYWsgYmV0d2VlbiBhIHNlY3Rpb24gaGVhZGluZyBhbmQgYSBkZWZ1bi4KKyAgICAlIAorICAgIFxpZm51bVxsYXN0cGVuYWx0eT0xMDAwMiBccGVuYWx0eTIwMDAgXGZpCisgICAgJQorICAgICUgU2ltaWxhcmx5LCBhZnRlciBhIHNlY3Rpb24gaGVhZGluZywgZG8gbm90IGFsbG93IGEgYnJlYWsuCisgICAgJSBCdXQgZG8gaW5zZXJ0IHRoZSBnbHVlLgorICAgIFxtZWRza2lwICAlIHByZWNlZGVkIGJ5IGRpc2NhcmRhYmxlIHBlbmFsdHksIHNvIG5vdCBhIGJyZWFrcG9pbnQKKyAgXGZpCisgICUKKyAgXHBhcmluZGVudD0waW4KKyAgXGFkdmFuY2VcbGVmdHNraXAgYnkgXGRlZmJvZHlpbmRlbnQKKyAgXGV4ZGVudGFtb3VudD1cZGVmYm9keWluZGVudAorfQorCitcZGVmXGRvZGVmdW54IzF7JQorICAlIEZpcnN0LCBjaGVjayB3aGV0aGVyIHdlIGFyZSBpbiB0aGUgcmlnaHQgZW52aXJvbm1lbnQ6CisgIFxjaGVja2VudiMxJQorICAlCisgICUgQXMgYWJvdmUsIGFsbG93IGxpbmUgYnJlYWsgaWYgd2UgaGF2ZSBtdWx0aXBsZSB4IGhlYWRlcnMgaW4gYSByb3cuCisgICUgSXQncyBub3QgYSBncmVhdCBwbGFjZSwgdGhvdWdoLgorICBcaWZudW1cbGFzdHBlbmFsdHk9MTAwMDIgXHBlbmFsdHkzMDAwIFxmaQorICAlCisgICUgQW5kIG5vdywgaXQncyB0aW1lIHRvIHJldXNlIHRoZSBib2R5IG9mIHRoZSBvcmlnaW5hbCBkZWZ1bjoKKyAgXGV4cGFuZGFmdGVyXGdvYmJsZWRlZnVuIzElCit9CitcZGVmXGdvYmJsZWRlZnVuIzFcc3RhcnRkZWZ1bnt9CisKKyUgXHByaW50ZGVmdW5saW5lIFxkZWZmbmhlYWRlcnt0ZXh0fQorJQorXGRlZlxwcmludGRlZnVubGluZSMxIzJ7JQorICBcYmVnaW5ncm91cAorICAgICUgY2FsbCBcZGVmZm5oZWFkZXI6CisgICAgIzEjMiBcZW5kaGVhZGVyCisgICAgJSBjb21tb24gZW5kaW5nOgorICAgIFxpbnRlcmxpbmVwZW5hbHR5ID0gMTAwMDAKKyAgICBcYWR2YW5jZVxyaWdodHNraXAgYnkgMHB0IHBsdXMgMWZpbAorICAgIFxlbmRncmFmCisgICAgXG5vYnJlYWtcdnNraXAgLVxwYXJza2lwCisgICAgXHBlbmFsdHkgMTAwMDIgICUgc2lnbmFsIHRvIFxzdGFydGRlZnVuIGFuZCBcZG9kZWZ1bngKKyAgICAlIFNvbWUgb2YgdGhlIEBkZWZ1bi10eXBlIHRhZ3MgZG8gbm90IGVuYWJsZSBtYWdpYyBwYXJlbnRoZXNlcywKKyAgICAlIHJlbmRlcmluZyB0aGUgZm9sbG93aW5nIGNoZWNrIHJlZHVuZGFudC4gIEJ1dCB3ZSBkb24ndCBvcHRpbWl6ZS4KKyAgICBcY2hlY2twYXJlbmNvdW50cworICBcZW5kZ3JvdXAKK30KKworXGRlZlxFZGVmdW57XGVuZGdyYWZcbWVkYnJlYWt9CisKKyUgXG1ha2VkZWZ1bntkZWZmbn0gY3JlYXRlcyBcZGVmZm4sIFxkZWZmbnggYW5kIFxFZGVmZm47CislIHRoZSBvbmx5IHRoaW5nIHJlbWFpbm5pZyBpcyB0byBkZWZpbmUgXGRlZmZuaGVhZGVyLgorJQorXGRlZlxtYWtlZGVmdW4jMXslCisgIFxleHBhbmRhZnRlclxsZXRcY3NuYW1lIEUjMVxlbmRjc25hbWUgPSBcRWRlZnVuCisgIFxlZGVmXHRlbXB7XG5vZXhwYW5kXGRvbWFrZWRlZnVuCisgICAgXG1ha2Vjc25hbWV7IzF9XG1ha2Vjc25hbWV7IzF4fVxtYWtlY3NuYW1leyMxaGVhZGVyfX0lCisgIFx0ZW1wCit9CisKKyUgXGRvbWFrZWRlZnVuIFxkZWZmbiBcZGVmZm54IFxkZWZmbmhlYWRlcgorJQorJSBEZWZpbmUgXGRlZmZuIGFuZCBcZGVmZm54LCB3aXRob3V0IHBhcmFtZXRlcnMuCislIFxkZWZmbmhlYWRlciBoYXMgdG8gYmUgZGVmaW5lZCBleHBsaWNpdGx5LgorJQorXGRlZlxkb21ha2VkZWZ1biMxIzIjM3slCisgIFxlbnZkZWYjMXslCisgICAgXHN0YXJ0ZGVmdW4KKyAgICBccGFyc2Vhcmd1c2luZ1xhY3RpdmVwYXJlbnN7XHByaW50ZGVmdW5saW5lIzN9JQorICB9JQorICBcZGVmIzJ7XGRvZGVmdW54IzF9JQorICBcZGVmIzMlCit9CisKKyUlJSBVbnR5cGVkIGZ1bmN0aW9uczoKKworJSBAZGVmZm4gY2F0ZWdvcnkgbmFtZSBhcmdzCitcbWFrZWRlZnVue2RlZmZufXtcZGVmZm5nZW5lcmFse319CisKKyUgQGRlZmZuIGNhdGVnb3J5IGNsYXNzIG5hbWUgYXJncworXG1ha2VkZWZ1bntkZWZvcH0jMSB7XGRlZm9wb257IzFcIFxwdXR3b3Jkb259fQorCislIFxkZWZvcG9uIHtjYXRlZ29yeSBvbn1jbGFzcyBuYW1lIGFyZ3MKK1xkZWZcZGVmb3BvbiMxIzIge1xkZWZmbmdlbmVyYWx7XHB1dHdvcmRvblwgXGNvZGV7IzJ9fXsjMVwgXGNvZGV7IzJ9fSB9CisKKyUgXGRlZmZuZ2VuZXJhbCB7c3ViaW5kfWNhdGVnb3J5IG5hbWUgYXJncworJQorXGRlZlxkZWZmbmdlbmVyYWwjMSMyICMzICM0XGVuZGhlYWRlcnslCisgICUgUmVtZW1iZXIgdGhhdCBcZG9zdWJpbmR7Zm59e2Zvb317fSBpcyBlcXVpdmFsZW50IHRvIFxkb2luZHtmbn17Zm9vfS4KKyAgXGRvc3ViaW5ke2ZufXtcY29kZXsjM319eyMxfSUKKyAgXGRlZm5hbWV7IzJ9e317IzN9XG1hZ2ljYW1wXGRlZnVuYXJnc3sjNFx1bnNraXB9JQorfQorCislJSUgVHlwZWQgZnVuY3Rpb25zOgorCislIEBkZWZ0eXBlZm4gY2F0ZWdvcnkgdHlwZSBuYW1lIGFyZ3MKK1xtYWtlZGVmdW57ZGVmdHlwZWZufXtcZGVmdHlwZWZuZ2VuZXJhbHt9fQorCislIEBkZWZ0eXBlb3AgY2F0ZWdvcnkgY2xhc3MgdHlwZSBuYW1lIGFyZ3MKK1xtYWtlZGVmdW57ZGVmdHlwZW9wfSMxIHtcZGVmdHlwZW9wb257IzFcIFxwdXR3b3Jkb259fQorCislIFxkZWZ0eXBlb3BvbiB7Y2F0ZWdvcnkgb259Y2xhc3MgdHlwZSBuYW1lIGFyZ3MKK1xkZWZcZGVmdHlwZW9wb24jMSMyIHtcZGVmdHlwZWZuZ2VuZXJhbHtccHV0d29yZG9uXCBcY29kZXsjMn19eyMxXCBcY29kZXsjMn19IH0KKworJSBcZGVmdHlwZWZuZ2VuZXJhbCB7c3ViaW5kfWNhdGVnb3J5IHR5cGUgbmFtZSBhcmdzCislCitcZGVmXGRlZnR5cGVmbmdlbmVyYWwjMSMyICMzICM0ICM1XGVuZGhlYWRlcnslCisgIFxkb3N1YmluZHtmbn17XGNvZGV7IzR9fXsjMX0lCisgIFxkZWZuYW1leyMyfXsjM317IzR9XGRlZnVuYXJnc3sjNVx1bnNraXB9JQorfQorCislJSUgVHlwZWQgdmFyaWFibGVzOgorCislIEBkZWZ0eXBldnIgY2F0ZWdvcnkgdHlwZSB2YXIgYXJncworXG1ha2VkZWZ1bntkZWZ0eXBldnJ9e1xkZWZ0eXBlY3ZnZW5lcmFse319CisKKyUgQGRlZnR5cGVjdiBjYXRlZ29yeSBjbGFzcyB0eXBlIHZhciBhcmdzCitcbWFrZWRlZnVue2RlZnR5cGVjdn0jMSB7XGRlZnR5cGVjdm9meyMxXCBccHV0d29yZG9mfX0KKworJSBcZGVmdHlwZWN2b2Yge2NhdGVnb3J5IG9mfWNsYXNzIHR5cGUgdmFyIGFyZ3MKK1xkZWZcZGVmdHlwZWN2b2YjMSMyIHtcZGVmdHlwZWN2Z2VuZXJhbHtccHV0d29yZG9mXCBcY29kZXsjMn19eyMxXCBcY29kZXsjMn19IH0KKworJSBcZGVmdHlwZWN2Z2VuZXJhbCB7c3ViaW5kfWNhdGVnb3J5IHR5cGUgdmFyIGFyZ3MKKyUKK1xkZWZcZGVmdHlwZWN2Z2VuZXJhbCMxIzIgIzMgIzQgIzVcZW5kaGVhZGVyeyUKKyAgXGRvc3ViaW5ke3ZyfXtcY29kZXsjNH19eyMxfSUKKyAgXGRlZm5hbWV7IzJ9eyMzfXsjNH1cZGVmdW5hcmdzeyM1XHVuc2tpcH0lCit9CisKKyUlJSBVbnR5cGVkIHZhcmlhYmxlczoKKworJSBAZGVmdnIgY2F0ZWdvcnkgdmFyIGFyZ3MKK1xtYWtlZGVmdW57ZGVmdnJ9IzEge1xkZWZ0eXBldnJoZWFkZXJ7IzF9IHt9IH0KKworJSBAZGVmY3YgY2F0ZWdvcnkgY2xhc3MgdmFyIGFyZ3MKK1xtYWtlZGVmdW57ZGVmY3Z9IzEge1xkZWZjdm9meyMxXCBccHV0d29yZG9mfX0KKworJSBcZGVmY3ZvZiB7Y2F0ZWdvcnkgb2Z9Y2xhc3MgdmFyIGFyZ3MKK1xkZWZcZGVmY3ZvZiMxIzIge1xkZWZ0eXBlY3ZvZnsjMX0jMiB7fSB9CisKKyUlJSBUeXBlOgorJSBAZGVmdHAgY2F0ZWdvcnkgbmFtZSBhcmdzCitcbWFrZWRlZnVue2RlZnRwfSMxICMyICMzXGVuZGhlYWRlcnslCisgIFxkb2luZHt0cH17XGNvZGV7IzJ9fSUKKyAgXGRlZm5hbWV7IzF9e317IzJ9XGRlZnVuYXJnc3sjM1x1bnNraXB9JQorfQorCislIFJlbWFpbmluZyBAZGVmdW4tbGlrZSBzaG9ydGN1dHM6CitcbWFrZWRlZnVue2RlZnVufXtcZGVmZm5oZWFkZXJ7XHB1dHdvcmREZWZmdW5jfSB9CitcbWFrZWRlZnVue2RlZm1hY317XGRlZmZuaGVhZGVye1xwdXR3b3JkRGVmbWFjfSB9CitcbWFrZWRlZnVue2RlZnNwZWN9e1xkZWZmbmhlYWRlcntccHV0d29yZERlZnNwZWN9IH0KK1xtYWtlZGVmdW57ZGVmdHlwZWZ1bn17XGRlZnR5cGVmbmhlYWRlcntccHV0d29yZERlZmZ1bmN9IH0KK1xtYWtlZGVmdW57ZGVmdmFyfXtcZGVmdnJoZWFkZXJ7XHB1dHdvcmREZWZ2YXJ9IH0KK1xtYWtlZGVmdW57ZGVmb3B0fXtcZGVmdnJoZWFkZXJ7XHB1dHdvcmREZWZvcHR9IH0KK1xtYWtlZGVmdW57ZGVmdHlwZXZhcn17XGRlZnR5cGV2cmhlYWRlcntccHV0d29yZERlZnZhcn0gfQorXG1ha2VkZWZ1bntkZWZtZXRob2R9e1xkZWZvcG9uXHB1dHdvcmRNZXRob2Rvbn0KK1xtYWtlZGVmdW57ZGVmdHlwZW1ldGhvZH17XGRlZnR5cGVvcG9uXHB1dHdvcmRNZXRob2Rvbn0KK1xtYWtlZGVmdW57ZGVmaXZhcn17XGRlZmN2b2ZccHV0d29yZEluc3RhbmNlVmFyaWFibGVvZn0KK1xtYWtlZGVmdW57ZGVmdHlwZWl2YXJ9e1xkZWZ0eXBlY3ZvZlxwdXR3b3JkSW5zdGFuY2VWYXJpYWJsZW9mfQorCislIFxkZWZuYW1lLCB3aGljaCBmb3JtYXRzIHRoZSBuYW1lIG9mIHRoZSBAZGVmIChub3QgdGhlIGFyZ3MpLgorJSAjMSBpcyB0aGUgY2F0ZWdvcnksIHN1Y2ggYXMgIkZ1bmN0aW9uIi4KKyUgIzIgaXMgdGhlIHJldHVybiB0eXBlLCBpZiBhbnkuCislICMzIGlzIHRoZSBmdW5jdGlvbiBuYW1lLgorJQorJSBXZSBhcmUgZm9sbG93ZWQgYnkgKGJ1dCBub3QgcGFzc2VkKSB0aGUgYXJndW1lbnRzLCBpZiBhbnkuCislCitcZGVmXGRlZm5hbWUjMSMyIzN7JQorICAlIEdldCB0aGUgdmFsdWVzIG9mIFxsZWZ0c2tpcCBhbmQgXHJpZ2h0c2tpcCBhcyB0aGV5IHdlcmUgb3V0c2lkZSB0aGUgQGRlZi4uLgorICBcYWR2YW5jZVxsZWZ0c2tpcCBieSAtXGRlZmJvZHlpbmRlbnQKKyAgJQorICAlIEhvdyB3ZSdsbCBmb3JtYXQgdGhlIHR5cGUgbmFtZS4gIFB1dHRpbmcgaXQgaW4gYnJhY2tldHMgaGVscHMKKyAgJSBkaXN0aW5ndWlzaCBpdCBmcm9tIHRoZSBib2R5IHRleHQgdGhhdCBtYXkgZW5kIHVwIG9uIHRoZSBuZXh0IGxpbmUKKyAgJSBqdXN0IGJlbG93IGl0LgorICBcZGVmXHRlbXB7IzF9JQorICBcc2V0Ym94MD1caGJveHtca2VyblxkZWZsYXN0YXJnbWFyZ2luIFxpZnhcdGVtcFxlbXB0eVxlbHNlIFtccm1cdGVtcF1cZml9CisgICUKKyAgJSBGaWd1cmUgb3V0IGxpbmUgc2l6ZXMgZm9yIHRoZSBwYXJhZ3JhcGggc2hhcGUuCisgICUgVGhlIGZpcnN0IGxpbmUgbmVlZHMgc3BhY2UgZm9yIFxib3gwOyBidXQgaWYgXHJpZ2h0c2tpcCBpcyBub256ZXJvLAorICAlIHdlIG5lZWQgb25seSBzcGFjZSBmb3IgdGhlIHBhcnQgb2YgXGJveDAgd2hpY2ggZXhjZWVkcyBpdDoKKyAgXGRpbWVuMD1caHNpemUgIFxhZHZhbmNlXGRpbWVuMCBieSAtXHdkMCAgXGFkdmFuY2VcZGltZW4wIGJ5IFxyaWdodHNraXAKKyAgJSBUaGUgY29udGludWF0aW9uczoKKyAgXGRpbWVuMj1caHNpemUgIFxhZHZhbmNlXGRpbWVuMiBieSAtXGRlZmFyZ3NpbmRlbnQKKyAgJSAocGxhaW4udGV4IHNheXMgdGhhdCBcZGltZW4xIHNob3VsZCBiZSB1c2VkIG9ubHkgYXMgZ2xvYmFsLikKKyAgXHBhcnNoYXBlIDIgMGluIFxkaW1lbjAgXGRlZmFyZ3NpbmRlbnQgXGRpbWVuMgorICAlCisgICUgUHV0IHRoZSB0eXBlIG5hbWUgdG8gdGhlIHJpZ2h0IG1hcmdpbi4KKyAgXG5vaW5kZW50CisgIFxoYm94IHRvIDBwdHslCisgICAgXGhmaWxcYm94MCBca2Vybi1caHNpemUKKyAgICAlIFxoc2l6ZSBoYXMgdG8gYmUgc2hvcnRlbmVkIHRoaXMgd2F5OgorICAgIFxrZXJuXGxlZnRza2lwCisgICAgJSBJbnRlbnRpb25hbGx5IGRvIG5vdCByZXNwZWN0IFxyaWdodHNraXAsIHNpbmNlIHdlIG5lZWQgdGhlIHNwYWNlLgorICB9JQorICAlCisgICUgQWxsb3cgYWxsIGxpbmVzIHRvIGJlIHVuZGVyZnVsbCB3aXRob3V0IGNvbXBsYWludDoKKyAgXHRvbGVyYW5jZT0xMDAwMCBcaGJhZG5lc3M9MTAwMDAKKyAgXGV4ZGVudGFtb3VudD1cZGVmYm9keWluZGVudAorICB7JQorICAgICUgZGVmdW4gZm9udHMuIFdlIHVzZSB0eXBld3JpdGVyIGJ5IGRlZmF1bHQgKHVzZWQgdG8gYmUgYm9sZCkgYmVjYXVzZToKKyAgICAlIC4gd2UncmUgcHJpbnRpbmcgaWRlbnRpZmllcnMsIHRoZXkgc2hvdWxkIGJlIGluIHR0IGluIHByaW5jaXBsZS4KKyAgICAlIC4gaW4gbGFuZ3VhZ2VzIHdpdGggbWFueSBhY2NlbnRzLCBzdWNoIGFzIEN6ZWNoIG9yIEZyZW5jaCwgaXQncworICAgICUgICBjb21tb24gdG8gbGVhdmUgYWNjZW50cyBvZmYgaWRlbnRpZmllcnMuICBUaGUgcmVzdWx0IGxvb2tzIG9rIGluCisgICAgJSAgIHR0LCBidXQgZXhjZWVkaW5nbHkgc3RyYW5nZSBpbiBybS4KKyAgICAlIC4gd2UgZG9uJ3Qgd2FudCAtLSBhbmQgLS0tIHRvIGJlIHRyZWF0ZWQgYXMgbGlnYXR1cmVzLgorICAgICUgLiB0aGlzIHN0aWxsIGRvZXMgbm90IGZpeCB0aGUgP2AgYW5kICFgIGxpZ2F0dXJlcywgYnV0IHNvIGZhciBubworICAgICUgICBvbmUgaGFzIG1hZGUgaWRlbnRpZmllcnMgdXNpbmcgdGhlbSA6KS4KKyAgICBcZGYgXHR0CisgICAgXGRlZlx0ZW1weyMyfSUgcmV0dXJuIHZhbHVlIHR5cGUKKyAgICBcaWZ4XHRlbXBcZW1wdHlcZWxzZSBcdGNsb3Nle1x0ZW1wfSBcZmkKKyAgICAjMyUgb3V0cHV0IGZ1bmN0aW9uIG5hbWUKKyAgfSUKKyAge1xybVxlbnNraXB9JSBoc2tpcCAwLjUgZW0gb2YgXHRlbnJtCisgICUKKyAgXGJvbGRicmF4CisgICUgYXJndW1lbnRzIHdpbGwgYmUgb3V0cHV0IG5leHQsIGlmIGFueS4KK30KKworJSBQcmludCBhcmd1bWVudHMgaW4gc2xhbnRlZCByb21hbiAobm90IHR0c2wpLCBpbmNvbnNpc3RlbnRseSB3aXRoIHVzaW5nCislIHR0IGZvciB0aGUgbmFtZS4gIFRoaXMgaXMgYmVjYXVzZSBsaXRlcmFsIHRleHQgaXMgc29tZXRpbWVzIG5lZWRlZCBpbgorJSB0aGUgYXJndW1lbnQgbGlzdCAoZ3JvZmYgbWFudWFsKSwgYW5kIHR0c2wgYW5kIHR0IGFyZSBub3QgdmVyeQorJSBkaXN0aW5ndWlzaGFibGUuICBQcmV2ZW50IGh5cGhlbmF0aW9uIGF0IGAtJyBjaGFycy4KKyUKK1xkZWZcZGVmdW5hcmdzIzF7JQorICAlIHVzZSBzbCBieSBkZWZhdWx0IChub3QgdHRzbCksCisgICUgdHQgZm9yIHRoZSBuYW1lcy4KKyAgXGRmIFxzbCBcaHlwaGVuY2hhclxmb250PTAKKyAgJQorICAlIE9uIHRoZSBvdGhlciBoYW5kLCBpZiBhbiBhcmd1bWVudCBoYXMgdHdvIGRhc2hlcyAoZm9yIGluc3RhbmNlKSwgd2UKKyAgJSB3YW50IGEgd2F5IHRvIGdldCB0dHNsLiAgTGV0J3MgdHJ5IEB2YXIgZm9yIHRoYXQuCisgIFxsZXRcdmFyPVx0dHNsYW50ZWQKKyAgIzElCisgIFxzbFxoeXBoZW5jaGFyXGZvbnQ9NDUKK30KKworJSBXZSB3YW50ICgpJltdIHRvIHByaW50IHNwZWNpYWxseSBvbiB0aGUgZGVmdW4gbGluZS4KKyUKK1xkZWZcYWN0aXZlcGFyZW5zeyUKKyAgXGNhdGNvZGVgXCg9XGFjdGl2ZSBcY2F0Y29kZWBcKT1cYWN0aXZlCisgIFxjYXRjb2RlYFxbPVxhY3RpdmUgXGNhdGNvZGVgXF09XGFjdGl2ZQorICBcY2F0Y29kZWBcJj1cYWN0aXZlCit9CisKKyUgTWFrZSBjb250cm9sIHNlcXVlbmNlcyB3aGljaCBhY3QgbGlrZSBub3JtYWwgcGFyZW50aGVzaXMgY2hhcnMuCitcbGV0XGxwYXJlbiA9ICggXGxldFxycGFyZW4gPSApCisKKyUgQmUgc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGEgZGVmaW5pdGlvbiBmb3IgYCgnLCBldGMuICBGb3IgZXhhbXBsZSwKKyUgaWYgdGhlIGZuIG5hbWUgaGFzIHBhcmVucyBpbiBpdCwgXGJvbGRicmF4IHdpbGwgbm90IGJlIGluIGVmZmVjdCB5ZXQsCislIHNvIFRlWCB3b3VsZCBvdGhlcndpc2UgY29tcGxhaW4gYWJvdXQgdW5kZWZpbmVkIGNvbnRyb2wgc2VxdWVuY2UuCit7CisgIFxhY3RpdmVwYXJlbnMKKyAgXGdsb2JhbFxsZXQoPVxscGFyZW4gXGdsb2JhbFxsZXQpPVxycGFyZW4KKyAgXGdsb2JhbFxsZXRbPVxsYnJhY2sgXGdsb2JhbFxsZXRdPVxyYnJhY2sKKyAgXGdsb2JhbFxsZXQmID0gXCYKKworICBcZ2RlZlxib2xkYnJheHtcbGV0KD1cb3BuclxsZXQpPVxjbG5yXGxldFs9XGxicmJcbGV0XT1ccmJyYn0KKyAgXGdkZWZcbWFnaWNhbXB7XGxldCY9XGFtcHJtfQorfQorCitcbmV3Y291bnRccGFyZW5jb3VudAorCislIElmIHdlIGVuY291bnRlciAmZm9vLCB0aGVuIHR1cm4gb24gKCktaGFja2luZyBhZnRlcndhcmRzCitcbmV3aWZcaWZhbXBzZWVuCitcZGVmXGFtcHJtIzEge1xhbXBzZWVudHJ1ZXtcYmZcJiMxIH19CisKK1xkZWZccGFyZW5mb250eyUKKyAgXGlmYW1wc2VlbgorICAgICUgQXQgdGhlIGZpcnN0IGxldmVsLCBwcmludCBwYXJlbnMgaW4gcm9tYW4sCisgICAgJSBvdGhlcndpc2UgdXNlIHRoZSBkZWZhdWx0IGZvbnQuCisgICAgXGlmbnVtIFxwYXJlbmNvdW50PTEgXHJtIFxmaQorICBcZWxzZQorICAgICUgVGhlIFxzZiBwYXJlbnMgKGluIFxib2xkYnJheCkgYWN0dWFsbHkgYXJlIGEgbGl0dGxlIGJvbGRlciB0aGFuCisgICAgJSB0aGUgY29udGFpbmVkIHRleHQuICBUaGlzIGlzIGVzcGVjaWFsbHkgbmVlZGVkIGZvciBbIGFuZCBdIC4KKyAgICBcc2YKKyAgXGZpCit9CitcZGVmXGluZmlyc3RsZXZlbCMxeyUKKyAgXGlmYW1wc2VlbgorICAgIFxpZm51bVxwYXJlbmNvdW50PTEKKyAgICAgICMxJQorICAgIFxmaQorICBcZmkKK30KK1xkZWZcYmZhZnRlcndvcmQjMSB7IzEgXGJmfQorCitcZGVmXG9wbnJ7JQorICBcZ2xvYmFsXGFkdmFuY2VccGFyZW5jb3VudCBieSAxCisgIHtccGFyZW5mb250KH0lCisgIFxpbmZpcnN0bGV2ZWwgXGJmYWZ0ZXJ3b3JkCit9CitcZGVmXGNsbnJ7JQorICB7XHBhcmVuZm9udCl9JQorICBcaW5maXJzdGxldmVsIFxzbAorICBcZ2xvYmFsXGFkdmFuY2VccGFyZW5jb3VudCBieSAtMQorfQorCitcbmV3Y291bnRcYnJhY2tjb3VudAorXGRlZlxsYnJieyUKKyAgXGdsb2JhbFxhZHZhbmNlXGJyYWNrY291bnQgYnkgMQorICB7XGJmW30lCit9CitcZGVmXHJicmJ7JQorICB7XGJmXX0lCisgIFxnbG9iYWxcYWR2YW5jZVxicmFja2NvdW50IGJ5IC0xCit9CisKK1xkZWZcY2hlY2twYXJlbmNvdW50c3slCisgIFxpZm51bVxwYXJlbmNvdW50PTAgXGVsc2UgXGJhZHBhcmVuY291bnQgXGZpCisgIFxpZm51bVxicmFja2NvdW50PTAgXGVsc2UgXGJhZGJyYWNrY291bnQgXGZpCit9CitcZGVmXGJhZHBhcmVuY291bnR7JQorICBcZXJybWVzc2FnZXtVbmJhbGFuY2VkIHBhcmVudGhlc2VzIGluIEBkZWZ9JQorICBcZ2xvYmFsXHBhcmVuY291bnQ9MAorfQorXGRlZlxiYWRicmFja2NvdW50eyUKKyAgXGVycm1lc3NhZ2V7VW5iYWxhbmNlZCBzcXVhcmUgYnJhY2VzIGluIEBkZWZ9JQorICBcZ2xvYmFsXGJyYWNrY291bnQ9MAorfQorCisKK1xtZXNzYWdle21hY3Jvcyx9CislIEBtYWNyby4KKworJSBUbyBkbyB0aGlzIHJpZ2h0IHdlIG5lZWQgYSBmZWF0dXJlIG9mIGUtVGVYLCBcc2NhbnRva2VucywKKyUgd2hpY2ggd2UgYXJyYW5nZSB0byBlbXVsYXRlIHdpdGggYSB0ZW1wb3JhcnkgZmlsZSBpbiBvcmRpbmFyeSBUZVguCitcaWZ4XGVUZVh2ZXJzaW9uXHVuZGVmaW5lZAorICBcbmV3d3JpdGVcbWFjc2NyaWJibGUKKyAgXGRlZlxzY2FudG9rZW5zIzF7JQorICAgIFx0b2tzMD17IzF9JQorICAgIFxpbW1lZGlhdGVcb3Blbm91dFxtYWNzY3JpYmJsZT1cam9ibmFtZS50bXAKKyAgICBcaW1tZWRpYXRlXHdyaXRlXG1hY3NjcmliYmxle1x0aGVcdG9rczB9JQorICAgIFxpbW1lZGlhdGVcY2xvc2VvdXRcbWFjc2NyaWJibGUKKyAgICBcaW5wdXQgXGpvYm5hbWUudG1wCisgIH0KK1xmaQorCitcZGVmXHNjYW5tYWNybyMxeyUKKyAgXGJlZ2luZ3JvdXAKKyAgICBcbmV3bGluZWNoYXJgXF5eTQorICAgIFxsZXRceGVhdHNwYWNlc1xlYXRzcGFjZXMKKyAgICAlIFVuZG8gY2F0Y29kZSBjaGFuZ2VzIG9mIFxzdGFydGNvbnRlbnRzIGFuZCBcZG9wcmludGluZGV4CisgICAgJSBXaGVuIGNhbGxlZCBmcm9tIEBpbnNlcnRjb3B5aW5nIG9yIChzaG9ydCljYXB0aW9uLCB3ZSBuZWVkIGFjdGl2ZQorICAgICUgYmFja3NsYXNoIHRvIGdldCBpdCBwcmludGVkIGNvcnJlY3RseS4gIFByZXZpb3VzbHksIHdlIGhhZAorICAgICUgXGNhdGNvZGVgXFw9XG90aGVyIGluc3RlYWQuICBXZSdsbCBzZWUgd2hldGhlciBhIHByb2JsZW0gYXBwZWFycworICAgICUgd2l0aCBtYWNybyBleHBhbnNpb24uCQkJCS0ta2FzYWwsIDE5YXVnMDQKKyAgICBcY2F0Y29kZWBcQD0wIFxjYXRjb2RlYFxcPVxhY3RpdmUgXGVzY2FwZWNoYXI9YFxACisgICAgJSAuLi4gYW5kIFxleGFtcGxlCisgICAgXHNwYWNlaXNzcGFjZQorICAgICUKKyAgICAlIEFwcGVuZCBcZW5kaW5wdXQgdG8gbWFrZSBzdXJlIHRoYXQgVGVYIGRvZXMgbm90IHNlZSB0aGUgZW5kaW5nIG5ld2xpbmUuCisgICAgJSBJJ3ZlIHZlcmlmaWVkIHRoYXQgaXQgaXMgbmVjZXNzYXJ5IGJvdGggZm9yIGUtVGVYIGFuZCBmb3Igb3JkaW5hcnkgVGVYCisgICAgJQkJCQkJCQktLWthc2FsLCAyOW5vdjAzCisgICAgXHNjYW50b2tlbnN7IzFcZW5kaW5wdXR9JQorICBcZW5kZ3JvdXAKK30KKworXGRlZlxzY2FuZXhwIzF7JQorICBcZWRlZlx0ZW1we1xub2V4cGFuZFxzY2FubWFjcm97IzF9fSUKKyAgXHRlbXAKK30KKworXG5ld2NvdW50XHBhcmFtbm8gICAlIENvdW50IG9mIHBhcmFtZXRlcnMKK1xuZXd0b2tzXG1hY25hbWUgICAgJSBNYWNybyBuYW1lCitcbmV3aWZcaWZyZWN1cnNpdmUgICUgSXMgaXQgcmVjdXJzaXZlPworCislIExpc3Qgb2YgYWxsIGRlZmluZWQgbWFjcm9zIGluIHRoZSBmb3JtCislICAgIFxkZWZpbmVkdW1teXdvcmRcbWFjcm8xXGRlZmluZWR1bW15d29yZFxtYWNybzIuLi4KKyUgQ3VycmVudGx5IGlzIGFsc28gY29udGFpbnMgYWxsIEBhbGlhc2VzOyB0aGUgbGlzdCBjYW4gYmUgc3BsaXQKKyUgaWYgdGhlcmUgaXMgYSBuZWVkLgorXGRlZlxtYWNyb2xpc3R7fQorCislIEFkZCB0aGUgbWFjcm8gdG8gXG1hY3JvbGlzdAorXGRlZlxhZGR0b21hY3JvbGlzdCMxe1xleHBhbmRhZnRlciBcYWRkdG9tYWNyb2xpc3R4eHggXGNzbmFtZSMxXGVuZGNzbmFtZX0KK1xkZWZcYWRkdG9tYWNyb2xpc3R4eHgjMXslCisgICAgIFx0b2tzMCA9IFxleHBhbmRhZnRlcntcbWFjcm9saXN0XGRlZmluZWR1bW15d29yZCMxfSUKKyAgICAgXHhkZWZcbWFjcm9saXN0e1x0aGVcdG9rczB9JQorfQorCislIFV0aWxpdHkgcm91dGluZXMuCislIFRoaXMgZG9lcyBcbGV0ICMxID0gIzIsIHdpdGggXGNzbmFtZXM7IHRoYXQgaXMsCislICAgXGxldCBcY3NuYW1lIzFcZW5kY3NuYW1lID0gXGNzbmFtZSMyXGVuZGNzbmFtZQorJSAoZXhjZXB0IG9mIGNvdXJzZSB3ZSBoYXZlIHRvIHBsYXkgZXhwYW5zaW9uIGdhbWVzKS4KKyUgCitcZGVmXGNzbGV0IzEjMnslCisgIFxleHBhbmRhZnRlclxsZXQKKyAgXGNzbmFtZSMxXGV4cGFuZGFmdGVyXGVuZGNzbmFtZQorICBcY3NuYW1lIzJcZW5kY3NuYW1lCit9CisKKyUgVHJpbSBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZXMgb2ZmIGEgc3RyaW5nLgorJSBDb25jZXB0cyBmcm9tIGFyby1iZW5kIHByb2JsZW0gMTUgKHNlZSBDVEFOKS4KK3tcY2F0Y29kZWBcQD0xMQorXGdkZWZcZWF0c3BhY2VzICMxe1xleHBhbmRhZnRlclx0cmltQFxleHBhbmRhZnRlcnsjMSB9fQorXGdkZWZcdHJpbUAgIzF7XHRyaW1AQCBAIzEgQCAjMSBAIEBAfQorXGdkZWZcdHJpbUBAICMxQCAjMkAgIzNAQHtcdHJpbUBAQFxlbXB0eSAjMiBAfQorXGRlZlx1bmJyYWNlIzF7IzF9CitcdW5icmFjZXtcZ2RlZlx0cmltQEBAICMxIH0gIzJAeyMxfQorfQorCislIFRyaW0gYSBzaW5nbGUgdHJhaWxpbmcgXl5NIG9mZiBhIHN0cmluZy4KK3tcY2F0Y29kZWBcXl5NPVxvdGhlciBcY2F0Y29kZWBcUT0zJQorXGdkZWZcZWF0Y3IgIzF7XGVhdGNyYSAjMVFeXk1RfSUKK1xnZGVmXGVhdGNyYSMxXl5NUXtcZWF0Y3JiIzFRfSUKK1xnZGVmXGVhdGNyYiMxUSMyUXsjMX0lCit9CisKKyUgTWFjcm8gYm9kaWVzIGFyZSBhYnNvcmJlZCBhcyBhbiBhcmd1bWVudCBpbiBhIGNvbnRleHQgd2hlcmUKKyUgYWxsIGNoYXJhY3RlcnMgYXJlIGNhdGNvZGUgMTAsIDExIG9yIDEyLCBleGNlcHQgXCB3aGljaCBpcyBhY3RpdmUKKyUgKGFzIGluIG5vcm1hbCB0ZXhpbmZvKS4gSXQgaXMgbmVjZXNzYXJ5IHRvIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiBvZiBcLgorCislIEl0J3MgbmVjZXNzYXJ5IHRvIGhhdmUgaGFyZCBDUnMgd2hlbiB0aGUgbWFjcm8gaXMgZXhlY3V0ZWQuIFRoaXMgaXMKKyUgZG9uZSBieSAgbWFraW5nIF5eTSAoXGVuZGxpbmVjaGFyKSBjYXRjb2RlIDEyIHdoZW4gcmVhZGluZyB0aGUgbWFjcm8KKyUgYm9keSwgYW5kIHRoZW4gbWFraW5nIGl0IHRoZSBcbmV3bGluZWNoYXIgaW4gXHNjYW5tYWNyby4KKworXGRlZlxzY2FuY3R4dHslCisgIFxjYXRjb2RlYFwiPVxvdGhlcgorICBcY2F0Y29kZWBcKz1cb3RoZXIKKyAgXGNhdGNvZGVgXDw9XG90aGVyCisgIFxjYXRjb2RlYFw+PVxvdGhlcgorICBcY2F0Y29kZWBcQD1cb3RoZXIKKyAgXGNhdGNvZGVgXF49XG90aGVyCisgIFxjYXRjb2RlYFxfPVxvdGhlcgorICBcY2F0Y29kZWBcfD1cb3RoZXIKKyAgXGNhdGNvZGVgXH49XG90aGVyCit9CisKK1xkZWZcc2NhbmFyZ2N0eHR7JQorICBcc2NhbmN0eHQKKyAgXGNhdGNvZGVgXFw9XG90aGVyCisgIFxjYXRjb2RlYFxeXk09XG90aGVyCit9CisKK1xkZWZcbWFjcm9ib2R5Y3R4dHslCisgIFxzY2FuY3R4dAorICBcY2F0Y29kZWBcez1cb3RoZXIKKyAgXGNhdGNvZGVgXH09XG90aGVyCisgIFxjYXRjb2RlYFxeXk09XG90aGVyCisgIFx1c2VtYm9keWJhY2tzbGFzaAorfQorCitcZGVmXG1hY3JvYXJnY3R4dHslCisgIFxzY2FuY3R4dAorICBcY2F0Y29kZWBcXD1cb3RoZXIKK30KKworJSBcbWJvZHliYWNrc2xhc2ggaXMgdGhlIGRlZmluaXRpb24gb2YgXCBpbiBAbWFjcm8gYm9kaWVzLgorJSBJdCBtYXBzIFxmb29cID0+IFxjc25hbWUgbWFjYXJnLmZvb1xlbmRjc25hbWUgPT4gI04KKyUgd2hlcmUgTiBpcyB0aGUgbWFjcm8gcGFyYW1ldGVyIG51bWJlci4KKyUgV2UgZGVmaW5lIFxjc25hbWUgbWFjYXJnLlxlbmRjc25hbWUgdG8gYmUgXHJlYWxiYWNrc2xhc2gsIHNvCislIFxcIGluIG1hY3JvIHJlcGxhY2VtZW50IHRleHQgZ2V0cyB5b3UgYSBiYWNrc2xhc2guCisKK3tcY2F0Y29kZWBAPTAgQGNhdGNvZGVgQFw9QGFjdGl2ZQorIEBnZGVmQHVzZW1ib2R5YmFja3NsYXNoe0BsZXRcPUBtYm9keWJhY2tzbGFzaH0KKyBAZ2RlZkBtYm9keWJhY2tzbGFzaCMxXHtAY3NuYW1lIG1hY2FyZy4jMUBlbmRjc25hbWV9Cit9CitcZXhwYW5kYWZ0ZXJcZGVmXGNzbmFtZSBtYWNhcmcuXGVuZGNzbmFtZXtccmVhbGJhY2tzbGFzaH0KKworXGRlZlxtYWNyb3tccmVjdXJzaXZlZmFsc2VccGFyc2VhcmdcbWFjcm94eHh9CitcZGVmXHJtYWNyb3tccmVjdXJzaXZldHJ1ZVxwYXJzZWFyZ1xtYWNyb3h4eH0KKworXGRlZlxtYWNyb3h4eCMxeyUKKyAgXGdldGFyZ3N7IzF9JSAgICAgICAgICAgbm93IFxtYWNuYW1lIGlzIHRoZSBtYWNuYW1lIGFuZCBcYXJnbCB0aGUgYXJnbGlzdAorICBcaWZ4XGFyZ2xcZW1wdHkgICAgICAgJSBubyBhcmd1bWVudHMKKyAgICAgXHBhcmFtbm89MCUKKyAgXGVsc2UKKyAgICAgXGV4cGFuZGFmdGVyXHBhcnNlbWFyZ2RlZiBcYXJnbDslCisgIFxmaQorICBcaWYxXGNzbmFtZSBpc21hY3JvLlx0aGVcbWFjbmFtZVxlbmRjc25hbWUKKyAgICAgXG1lc3NhZ2V7V2FybmluZzogcmVkZWZpbmluZyBcdGhlXG1hY25hbWV9JQorICBcZWxzZQorICAgICBcZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSBcdGhlXG1hY25hbWVcZW5kY3NuYW1lIFxyZWxheAorICAgICBcZWxzZSBcZXJybWVzc2FnZXtNYWNybyBuYW1lIFx0aGVcbWFjbmFtZVxzcGFjZSBhbHJlYWR5IGRlZmluZWR9XGZpCisgICAgIFxnbG9iYWxcY3NsZXR7bWFjc2F2ZS5cdGhlXG1hY25hbWV9e1x0aGVcbWFjbmFtZX0lCisgICAgIFxnbG9iYWxcZXhwYW5kYWZ0ZXJcbGV0XGNzbmFtZSBpc21hY3JvLlx0aGVcbWFjbmFtZVxlbmRjc25hbWU9MSUKKyAgICAgXGFkZHRvbWFjcm9saXN0e1x0aGVcbWFjbmFtZX0lCisgIFxmaQorICBcYmVnaW5ncm91cCBcbWFjcm9ib2R5Y3R4dAorICBcaWZyZWN1cnNpdmUgXGV4cGFuZGFmdGVyXHBhcnNlcm1hY2JvZHkKKyAgXGVsc2UgXGV4cGFuZGFmdGVyXHBhcnNlbWFjYm9keQorICBcZml9CisKK1xwYXJzZWFyZ2RlZlx1bm1hY3JveyUKKyAgXGlmMVxjc25hbWUgaXNtYWNyby4jMVxlbmRjc25hbWUKKyAgICBcZ2xvYmFsXGNzbGV0eyMxfXttYWNzYXZlLiMxfSUKKyAgICBcZ2xvYmFsXGV4cGFuZGFmdGVyXGxldCBcY3NuYW1lIGlzbWFjcm8uIzFcZW5kY3NuYW1lPTAlCisgICAgJSBSZW1vdmUgdGhlIG1hY3JvIG5hbWUgZnJvbSBcbWFjcm9saXN0OgorICAgIFxiZWdpbmdyb3VwCisgICAgICBcZXhwYW5kYWZ0ZXJcbGV0XGNzbmFtZSMxXGVuZGNzbmFtZSBccmVsYXgKKyAgICAgIFxsZXRcZGVmaW5lZHVtbXl3b3JkXHVubWFjcm9kbworICAgICAgXHhkZWZcbWFjcm9saXN0e1xtYWNyb2xpc3R9JQorICAgIFxlbmRncm91cAorICBcZWxzZQorICAgIFxlcnJtZXNzYWdle01hY3JvICMxIG5vdCBkZWZpbmVkfSUKKyAgXGZpCit9CisKKyUgQ2FsbGVkIGJ5IFxkbyBmcm9tIFxkb3VubWFjcm8gb24gZWFjaCBtYWNyby4gIFRoZSBpZGVhIGlzIHRvIG9taXQgYW55CislIG1hY3JvIGRlZmluaXRpb25zIHRoYXQgaGF2ZSBiZWVuIGNoYW5nZWQgdG8gXHJlbGF4LgorJQorXGRlZlx1bm1hY3JvZG8jMXslCisgIFxpZnggIzFccmVsYXgKKyAgICAlIHJlbW92ZSB0aGlzCisgIFxlbHNlCisgICAgXG5vZXhwYW5kXGRlZmluZWR1bW15d29yZCBcbm9leHBhbmQjMSUKKyAgXGZpCit9CisKKyUgVGhpcyBtYWtlcyB1c2Ugb2YgdGhlIG9ic2N1cmUgZmVhdHVyZSB0aGF0IGlmIHRoZSBsYXN0IHRva2VuIG9mIGEKKyUgPHBhcmFtZXRlciBsaXN0PiBpcyAjLCB0aGVuIHRoZSBwcmVjZWRpbmcgYXJndW1lbnQgaXMgZGVsaW1pdGVkIGJ5CislIGFuIG9wZW5pbmcgYnJhY2UsIGFuZCB0aGF0IG9wZW5pbmcgYnJhY2UgaXMgbm90IGNvbnN1bWVkLgorXGRlZlxnZXRhcmdzIzF7XGdldGFyZ3N4eHgjMXt9fQorXGRlZlxnZXRhcmdzeHh4IzEje1xnZXRtYWNuYW1lICMxIFxyZWxheFxnZXRtYWNhcmdzfQorXGRlZlxnZXRtYWNuYW1lICMxICMyXHJlbGF4e1xtYWNuYW1lPXsjMX19CitcZGVmXGdldG1hY2FyZ3MjMXtcZGVmXGFyZ2x7IzF9fQorCislIFBhcnNlIHRoZSBvcHRpb25hbCB7cGFyYW1zfSBsaXN0LiAgU2V0IHVwIFxwYXJhbW5vIGFuZCBccGFyYW1saXN0CislIHNvIFxkZWZtYWNybyBrbm93cyB3aGF0IHRvIGRvLiAgRGVmaW5lIFxtYWNhcmcuYmxhaCBmb3IgZWFjaCBibGFoCislIGluIHRoZSBwYXJhbXMgbGlzdCwgdG8gYmUgIyNOIHdoZXJlIE4gaXMgdGhlIHBvc2l0aW9uIGluIHRoYXQgbGlzdC4KKyUgVGhhdCBnZXRzIHVzZWQgYnkgXG1ib2R5YmFja3NsYXNoIChhYm92ZSkuCisKKyUgV2UgbmVlZCB0byBnZXQgYG1hY3JvIHBhcmFtZXRlciBjaGFyICMnIGludG8gc2V2ZXJhbCBkZWZpbml0aW9ucy4KKyUgVGhlIHRlY2huaXF1ZSB1c2VkIGlzIHN0b2xlbiBmcm9tIExhVGVYOiAgbGV0IFxoYXNoIGJlIHNvbWV0aGluZworJSB1bmV4cGFuZGFibGUsIGluc2VydCB0aGF0IHdoZXJldmVyIHlvdSBuZWVkIGEgIywgYW5kIHRoZW4gcmVkZWZpbmUKKyUgaXQgdG8gIyBqdXN0IGJlZm9yZSB1c2luZyB0aGUgdG9rZW4gbGlzdCBwcm9kdWNlZC4KKyUKKyUgVGhlIHNhbWUgdGVjaG5pcXVlIGlzIHVzZWQgdG8gcHJvdGVjdCBcZWF0c3BhY2VzIHRpbGwganVzdCBiZWZvcmUKKyUgdGhlIG1hY3JvIGlzIHVzZWQuCisKK1xkZWZccGFyc2VtYXJnZGVmIzE7e1xwYXJhbW5vPTBcZGVmXHBhcmFtbGlzdHt9JQorICAgICAgICBcbGV0XGhhc2hccmVsYXhcbGV0XHhlYXRzcGFjZXNccmVsYXhccGFyc2VtYXJnZGVmeHh4IzEsOyx9CitcZGVmXHBhcnNlbWFyZ2RlZnh4eCMxLHslCisgIFxpZiMxO1xsZXRcbmV4dD1ccmVsYXgKKyAgXGVsc2UgXGxldFxuZXh0PVxwYXJzZW1hcmdkZWZ4eHgKKyAgICBcYWR2YW5jZVxwYXJhbW5vIGJ5IDElCisgICAgXGV4cGFuZGFmdGVyXGVkZWZcY3NuYW1lIG1hY2FyZy5cZWF0c3BhY2VzeyMxfVxlbmRjc25hbWUKKyAgICAgICAge1x4ZWF0c3BhY2Vze1xoYXNoXHRoZVxwYXJhbW5vfX0lCisgICAgXGVkZWZccGFyYW1saXN0e1xwYXJhbWxpc3RcaGFzaFx0aGVccGFyYW1ubyx9JQorICBcZmlcbmV4dH0KKworJSBUaGVzZSB0d28gY29tbWFuZHMgcmVhZCByZWN1cnNpdmUgYW5kIG5vbnJlY3Vyc2l2ZSBtYWNybyBib2RpZXMuCislIChUaGV5J3JlIGRpZmZlcmVudCBzaW5jZSByZWMgYW5kIG5vbnJlYyBtYWNyb3MgZW5kIGRpZmZlcmVudGx5LikKKworXGxvbmdcZGVmXHBhcnNlbWFjYm9keSMxQGVuZCBtYWNybyUKK3tceGRlZlx0ZW1we1xlYXRjcnsjMX19XGVuZGdyb3VwXGRlZm1hY3JvfSUKK1xsb25nXGRlZlxwYXJzZXJtYWNib2R5IzFAZW5kIHJtYWNybyUKK3tceGRlZlx0ZW1we1xlYXRjcnsjMX19XGVuZGdyb3VwXGRlZm1hY3JvfSUKKworJSBUaGlzIGRlZmluZXMgdGhlIG1hY3JvIGl0c2VsZi4gVGhlcmUgYXJlIHNpeCBjYXNlczogcmVjdXJzaXZlIGFuZAorJSBub25yZWN1cnNpdmUgbWFjcm9zIG9mIHplcm8sIG9uZSwgYW5kIG1hbnkgYXJndW1lbnRzLgorJSBNdWNoIG1hZ2ljIHdpdGggXGV4cGFuZGFmdGVyIGhlcmUuCislIFx4ZGVmIGlzIHVzZWQgc28gdGhhdCBtYWNybyBkZWZpbml0aW9ucyB3aWxsIHN1cnZpdmUgdGhlIGZpbGUKKyUgdGhleSdyZSBkZWZpbmVkIGluOyBAaW5jbHVkZSByZWFkcyB0aGUgZmlsZSBpbnNpZGUgYSBncm91cC4KK1xkZWZcZGVmbWFjcm97JQorICBcbGV0XGhhc2g9IyMlIGNvbnZlcnQgcGxhY2Vob2xkZXJzIHRvIG1hY3JvIHBhcmFtZXRlciBjaGFycworICBcaWZyZWN1cnNpdmUKKyAgICBcaWZjYXNlXHBhcmFtbm8KKyAgICAlIDAKKyAgICAgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZVx0aGVcbWFjbmFtZVxlbmRjc25hbWV7JQorICAgICAgICBcbm9leHBhbmRcc2Nhbm1hY3Jve1x0ZW1wfX0lCisgICAgXG9yICUgMQorICAgICAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lXHRoZVxtYWNuYW1lXGVuZGNzbmFtZXslCisgICAgICAgICBcYmdyb3VwXG5vZXhwYW5kXG1hY3JvYXJnY3R4dAorICAgICAgICAgXG5vZXhwYW5kXGJyYWNlb3JsaW5lCisgICAgICAgICBcZXhwYW5kYWZ0ZXJcbm9leHBhbmRcY3NuYW1lXHRoZVxtYWNuYW1lIHh4eFxlbmRjc25hbWV9JQorICAgICAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lXHRoZVxtYWNuYW1lIHh4eFxlbmRjc25hbWUjIzF7JQorICAgICAgICAgXGVncm91cFxub2V4cGFuZFxzY2FubWFjcm97XHRlbXB9fSUKKyAgICBcZWxzZSAlIG1hbnkKKyAgICAgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZVx0aGVcbWFjbmFtZVxlbmRjc25hbWV7JQorICAgICAgICAgXGJncm91cFxub2V4cGFuZFxtYWNyb2FyZ2N0eHQKKyAgICAgICAgIFxub2V4cGFuZFxjc25hbWVcdGhlXG1hY25hbWUgeHhcZW5kY3NuYW1lfSUKKyAgICAgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZVx0aGVcbWFjbmFtZSB4eFxlbmRjc25hbWUjIzF7JQorICAgICAgICAgIFxleHBhbmRhZnRlclxub2V4cGFuZFxjc25hbWVcdGhlXG1hY25hbWUgeHh4XGVuZGNzbmFtZSAjIzEsfSUKKyAgICAgIFxleHBhbmRhZnRlclxleHBhbmRhZnRlcgorICAgICAgXGV4cGFuZGFmdGVyXHhkZWYKKyAgICAgIFxleHBhbmRhZnRlclxleHBhbmRhZnRlcgorICAgICAgICBcY3NuYW1lXHRoZVxtYWNuYW1lIHh4eFxlbmRjc25hbWUKKyAgICAgICAgICBccGFyYW1saXN0e1xlZ3JvdXBcbm9leHBhbmRcc2Nhbm1hY3Jve1x0ZW1wfX0lCisgICAgXGZpCisgIFxlbHNlCisgICAgXGlmY2FzZVxwYXJhbW5vCisgICAgJSAwCisgICAgICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWVcdGhlXG1hY25hbWVcZW5kY3NuYW1leyUKKyAgICAgICAgXG5vZXhwYW5kXG5vcmVjdXJzZXtcdGhlXG1hY25hbWV9JQorICAgICAgICBcbm9leHBhbmRcc2Nhbm1hY3Jve1x0ZW1wfVxlZ3JvdXB9JQorICAgIFxvciAlIDEKKyAgICAgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZVx0aGVcbWFjbmFtZVxlbmRjc25hbWV7JQorICAgICAgICAgXGJncm91cFxub2V4cGFuZFxtYWNyb2FyZ2N0eHQKKyAgICAgICAgIFxub2V4cGFuZFxicmFjZW9ybGluZQorICAgICAgICAgXGV4cGFuZGFmdGVyXG5vZXhwYW5kXGNzbmFtZVx0aGVcbWFjbmFtZSB4eHhcZW5kY3NuYW1lfSUKKyAgICAgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZVx0aGVcbWFjbmFtZSB4eHhcZW5kY3NuYW1lIyMxeyUKKyAgICAgICAgXGVncm91cAorICAgICAgICBcbm9leHBhbmRcbm9yZWN1cnNle1x0aGVcbWFjbmFtZX0lCisgICAgICAgIFxub2V4cGFuZFxzY2FubWFjcm97XHRlbXB9XGVncm91cH0lCisgICAgXGVsc2UgJSBtYW55CisgICAgICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWVcdGhlXG1hY25hbWVcZW5kY3NuYW1leyUKKyAgICAgICAgIFxiZ3JvdXBcbm9leHBhbmRcbWFjcm9hcmdjdHh0CisgICAgICAgICBcZXhwYW5kYWZ0ZXJcbm9leHBhbmRcY3NuYW1lXHRoZVxtYWNuYW1lIHh4XGVuZGNzbmFtZX0lCisgICAgICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWVcdGhlXG1hY25hbWUgeHhcZW5kY3NuYW1lIyMxeyUKKyAgICAgICAgICBcZXhwYW5kYWZ0ZXJcbm9leHBhbmRcY3NuYW1lXHRoZVxtYWNuYW1lIHh4eFxlbmRjc25hbWUgIyMxLH0lCisgICAgICBcZXhwYW5kYWZ0ZXJcZXhwYW5kYWZ0ZXIKKyAgICAgIFxleHBhbmRhZnRlclx4ZGVmCisgICAgICBcZXhwYW5kYWZ0ZXJcZXhwYW5kYWZ0ZXIKKyAgICAgIFxjc25hbWVcdGhlXG1hY25hbWUgeHh4XGVuZGNzbmFtZQorICAgICAgXHBhcmFtbGlzdHslCisgICAgICAgICAgXGVncm91cAorICAgICAgICAgIFxub2V4cGFuZFxub3JlY3Vyc2V7XHRoZVxtYWNuYW1lfSUKKyAgICAgICAgICBcbm9leHBhbmRcc2Nhbm1hY3Jve1x0ZW1wfVxlZ3JvdXB9JQorICAgIFxmaQorICBcZml9CisKK1xkZWZcbm9yZWN1cnNlIzF7XGJncm91cFxjc2xldHsjMX17bWFjc2F2ZS4jMX19CisKKyUgXGJyYWNlb3JsaW5lIGRlY2lkZXMgd2hldGhlciB0aGUgbmV4dCBub253aGl0ZXNwYWNlIGNoYXJhY3RlciBpcyBhCislIHsuICBJZiBzbyBpdCByZWFkcyB1cCB0byB0aGUgY2xvc2luZyB9LCBpZiBub3QsIGl0IHJlYWRzIHRoZSB3aG9sZQorJSBsaW5lLiAgV2hhdGV2ZXIgd2FzIHJlYWQgaXMgdGhlbiBmZWQgdG8gdGhlIG5leHQgY29udHJvbCBzZXF1ZW5jZQorJSBhcyBhbiBhcmd1bWVudCAoYnkgXHBhcnNlYnJhY2Ugb3IgXHBhcnNlYXJnKQorXGRlZlxicmFjZW9ybGluZSMxe1xsZXRcbWFjbmFtZXh4eD0jMVxmdXR1cmVsZXRcbmNoYXJcYnJhY2VvcmxpbmV4eHh9CitcZGVmXGJyYWNlb3JsaW5leHh4eyUKKyAgXGlmeFxuY2hhclxiZ3JvdXBcZWxzZQorICAgIFxleHBhbmRhZnRlclxwYXJzZWFyZworICBcZmkgXG1hY25hbWV4eHh9CisKKworJSBAYWxpYXMuCislIFdlIG5lZWQgc29tZSB0cmlja2VyeSB0byByZW1vdmUgdGhlIG9wdGlvbmFsIHNwYWNlcyBhcm91bmQgdGhlIGVxdWFsCislIHNpZ24uICBKdXN0IG1ha2UgdGhlbSBhY3RpdmUgYW5kIHRoZW4gZXhwYW5kIHRoZW0gYWxsIHRvIG5vdGhpbmcuCitcZGVmXGFsaWFze1xwYXJzZWFyZ3VzaW5nXG9iZXlzcGFjZXNcYWxpYXN4eHh9CitcZGVmXGFsaWFzeHh4ICMxe1xhbGlhc3l5eSMxXHJlbGF4fQorXGRlZlxhbGlhc3l5eSAjMT0jMlxyZWxheHslCisgIHslCisgICAgXGV4cGFuZGFmdGVyXGxldFxvYmV5ZWRzcGFjZT1cZW1wdHkKKyAgICBcYWRkdG9tYWNyb2xpc3R7IzF9JQorICAgIFx4ZGVmXG5leHR7XGdsb2JhbFxsZXRcbWFrZWNzbmFtZXsjMX09XG1ha2Vjc25hbWV7IzJ9fSUKKyAgfSUKKyAgXG5leHQKK30KKworCitcbWVzc2FnZXtjcm9zcyByZWZlcmVuY2VzLH0KKworXG5ld3dyaXRlXGF1eGZpbGUKKworXG5ld2lmXGlmaGF2ZXhyZWZzICAgICUgVHJ1ZSBpZiB4cmVmIHZhbHVlcyBhcmUga25vd24uCitcbmV3aWZcaWZ3YXJuZWR4cmVmcyAgJSBUcnVlIGlmIHdlIHdhcm5lZCBvbmNlIHRoYXQgdGhleSBhcmVuJ3Qga25vd24uCisKKyUgQGluZm9yZWYgaXMgcmVsYXRpdmVseSBzaW1wbGUuCitcZGVmXGluZm9yZWYgIzF7XGluZm9yZWZ6enogIzEsLCwsKip9CitcZGVmXGluZm9yZWZ6enogIzEsIzIsIzMsIzQqKntccHV0d29yZFNlZXt9IFxwdXR3b3JkSW5mb3t9IFxwdXR3b3JkZmlsZXt9IFxmaWxle1xpZ25vcmVzcGFjZXMgIzN7fX0sCisgIG5vZGUgXHNhbXB7XGlnbm9yZXNwYWNlcyMxe319fQorCislIEBub2RlJ3Mgb25seSBqb2IgaW4gVGVYIGlzIHRvIGRlZmluZSBcbGFzdG5vZGUsIHdoaWNoIGlzIHVzZWQgaW4KKyUgY3Jvc3MtcmVmZXJlbmNlcy4gIFRoZSBAbm9kZSBsaW5lIG1pZ2h0IG9yIG1pZ2h0IG5vdCBoYXZlIGNvbW1hcywgYW5kCislIG1pZ2h0IG9yIG1pZ2h0IG5vdCBoYXZlIHNwYWNlcyBiZWZvcmUgdGhlIGZpcnN0IGNvbW1hLCBsaWtlOgorJSBAbm9kZSBmb28gLCBiYXIgLCAuLi4KKyUgV2UgZG9uJ3Qgd2FudCBzdWNoIHRyYWlsaW5nIHNwYWNlcyBpbiB0aGUgbm9kZSBuYW1lLgorJQorXHBhcnNlYXJnZGVmXG5vZGV7XGNoZWNrZW52e31cZG9ub2RlICMxICxcZmluaXNobm9kZXBhcnNlfQorJQorJSBhbHNvIHJlbW92ZSBhIHRyYWlsaW5nIGNvbW1hLCBpbiBjYXNlIG9mIHNvbWV0aGluZyBsaWtlIHRoaXM6CislIEBub2RlIEhlbHAtQ3Jvc3MsICAsICAsIENyb3NzLXJlZnMKK1xkZWZcZG9ub2RlIzEgLCMyXGZpbmlzaG5vZGVwYXJzZXtcZG9kb25vZGUgIzEsXGZpbmlzaG5vZGVwYXJzZX0KK1xkZWZcZG9kb25vZGUjMSwjMlxmaW5pc2hub2RlcGFyc2V7XGdkZWZcbGFzdG5vZGV7IzF9fQorCitcbGV0XG53bm9kZT1cbm9kZQorXGxldFxsYXN0bm9kZT1cZW1wdHkKKworJSBXcml0ZSBhIGNyb3NzLXJlZmVyZW5jZSBkZWZpbml0aW9uIGZvciB0aGUgY3VycmVudCBub2RlLiAgIzEgaXMgdGhlCislIHR5cGUgKFludW1iZXJlZCwgWWFwcGVuZGl4LCBZbm90aGluZykuCislCitcZGVmXGRvbm9kZXJlZiMxeyUKKyAgXGlmeFxsYXN0bm9kZVxlbXB0eVxlbHNlCisgICAgXHNldHJlZntcbGFzdG5vZGV9eyMxfSUKKyAgICBcZ2xvYmFsXGxldFxsYXN0bm9kZT1cZW1wdHkKKyAgXGZpCit9CisKKyUgQGFuY2hvcntOQU1FfSAtLSBkZWZpbmUgeHJlZiB0YXJnZXQgYXQgYXJiaXRyYXJ5IHBvaW50LgorJQorXG5ld2NvdW50XHNhdmVzZnJlZ2lzdGVyCislCitcZGVmXHNhdmVzZntccmVsYXggXGlmaG1vZGUgXHNhdmVzZnJlZ2lzdGVyPVxzcGFjZWZhY3RvciBcZml9CitcZGVmXHJlc3RvcmVzZntccmVsYXggXGlmaG1vZGUgXHNwYWNlZmFjdG9yPVxzYXZlc2ZyZWdpc3RlciBcZml9CitcZGVmXGFuY2hvciMxe1xzYXZlc2YgXHNldHJlZnsjMX17WW5vdGhpbmd9XHJlc3RvcmVzZiBcaWdub3Jlc3BhY2VzfQorCislIFxzZXRyZWZ7TkFNRX17U05UfSBkZWZpbmVzIGEgY3Jvc3MtcmVmZXJlbmNlIHBvaW50IE5BTUUgKGEgbm9kZSBvciBhbgorJSBhbmNob3IpLCB3aGljaCBjb25zaXN0cyBvZiB0aHJlZSBwYXJ0czoKKyUgMSkgTkFNRS10aXRsZSAtIHRoZSBjdXJyZW50IHNlY3Rpb25pbmcgbmFtZSB0YWtlbiBmcm9tIFx0aGlzc2VjdGlvbiwKKyUgICAgICAgICAgICAgICAgIG9yIHRoZSBhbmNob3IgbmFtZS4KKyUgMikgTkFNRS1zbnQgICAtIHNlY3Rpb24gbnVtYmVyIGFuZCB0eXBlLCBwYXNzZWQgYXMgdGhlIFNOVCBhcmcsIG9yCislICAgICAgICAgICAgICAgICBlbXB0eSBmb3IgYW5jaG9ycy4KKyUgMykgTkFNRS1wZyAgICAtIHRoZSBwYWdlIG51bWJlci4KKyUKKyUgVGhpcyBpcyBjYWxsZWQgZnJvbSBcZG9ub2RlcmVmLCBcYW5jaG9yLCBhbmQgXGRvZmxvYXQuICBJbiB0aGUgY2FzZSBvZgorJSBmbG9hdHMsIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgcGFydCwgd2hpY2ggaXMgbm90IHdyaXR0ZW4gaGVyZToKKyUgNCkgTkFNRS1sb2YgICAtIHRoZSB0ZXh0IGFzIGl0IHNob3VsZCBhcHBlYXIgaW4gYSBAbGlzdG9mZmxvYXRzLgorJQorXGRlZlxzZXRyZWYjMSMyeyUKKyAgXHBkZm1rZGVzdHsjMX0lCisgIFxpZmxpbmtzCisgICAgeyUKKyAgICAgIFxhdGR1bW1pZXMgICUgcHJlc2VydmUgY29tbWFuZHMsIGJ1dCBkb24ndCBleHBhbmQgdGhlbQorICAgICAgXGVkZWZcd3JpdGV4cmRlZiMjMSMjMnslCisJXHdyaXRlXGF1eGZpbGV7QHhyZGVmeyMxLSUgIzEgb2YgXHNldHJlZiwgZXhwYW5kZWQgYnkgdGhlIFxlZGVmCisJICAjIzF9eyMjMn19JSB0aGVzZSBhcmUgcGFyYW1ldGVycyBvZiBcd3JpdGV4cmRlZgorICAgICAgfSUKKyAgICAgIFx0b2tzMCA9IFxleHBhbmRhZnRlcntcdGhpc3NlY3Rpb259JQorICAgICAgXGltbWVkaWF0ZSBcd3JpdGV4cmRlZnt0aXRsZX17XHRoZVx0b2tzMCB9JQorICAgICAgXGltbWVkaWF0ZSBcd3JpdGV4cmRlZntzbnR9e1xjc25hbWUgIzJcZW5kY3NuYW1lfSUgXFludW1iZXJlZCBldGMuCisgICAgICBcd3JpdGV4cmRlZntwZ317XGZvbGlvfSUgd2lsbCBiZSB3cml0dGVuIGxhdGVyLCBkdXJpbmcgXHNoaXBvdXQKKyAgICB9JQorICBcZmkKK30KKworJSBAeHJlZiwgQHB4cmVmLCBhbmQgQHJlZiBnZW5lcmF0ZSBjcm9zcy1yZWZlcmVuY2VzLiAgRm9yIFx4cmVmWCwgIzEgaXMKKyUgdGhlIG5vZGUgbmFtZSwgIzIgdGhlIG5hbWUgb2YgdGhlIEluZm8gY3Jvc3MtcmVmZXJlbmNlLCAjMyB0aGUgcHJpbnRlZAorJSBub2RlIG5hbWUsICM0IHRoZSBuYW1lIG9mIHRoZSBJbmZvIGZpbGUsICM1IHRoZSBuYW1lIG9mIHRoZSBwcmludGVkCislIG1hbnVhbC4gIEFsbCBidXQgdGhlIG5vZGUgbmFtZSBjYW4gYmUgb21pdHRlZC4KKyUKK1xkZWZccHhyZWYjMXtccHV0d29yZHNlZXt9IFx4cmVmWFsjMSwsLCwsLCxdfQorXGRlZlx4cmVmIzF7XHB1dHdvcmRTZWV7fSBceHJlZlhbIzEsLCwsLCwsXX0KK1xkZWZccmVmIzF7XHhyZWZYWyMxLCwsLCwsLF19CitcZGVmXHhyZWZYWyMxLCMyLCMzLCM0LCM1LCM2XXtcYmVnaW5ncm91cAorICBcdW5zZXBzcGFjZXMKKyAgXGRlZlxwcmludGVkbWFudWFse1xpZ25vcmVzcGFjZXMgIzV9JQorICBcZGVmXHByaW50ZWRyZWZuYW1le1xpZ25vcmVzcGFjZXMgIzN9JQorICBcc2V0Ym94MT1caGJveHtccHJpbnRlZG1hbnVhbFx1bnNraXB9JQorICBcc2V0Ym94MD1caGJveHtccHJpbnRlZHJlZm5hbWVcdW5za2lwfSUKKyAgXGlmZGltIFx3ZDAgPSAwcHQKKyAgICAlIE5vIHByaW50ZWQgbm9kZSBuYW1lIHdhcyBleHBsaWNpdGx5IGdpdmVuLgorICAgIFxleHBhbmRhZnRlclxpZnhcY3NuYW1lIFNFVHhyZWYtYXV0b21hdGljLXNlY3Rpb24tdGl0bGVcZW5kY3NuYW1lXHJlbGF4CisgICAgICAlIFVzZSB0aGUgbm9kZSBuYW1lIGluc2lkZSB0aGUgc3F1YXJlIGJyYWNrZXRzLgorICAgICAgXGRlZlxwcmludGVkcmVmbmFtZXtcaWdub3Jlc3BhY2VzICMxfSUKKyAgICBcZWxzZQorICAgICAgJSBVc2UgdGhlIGFjdHVhbCBjaGFwdGVyL3NlY3Rpb24gdGl0bGUgYXBwZWFyIGluc2lkZQorICAgICAgJSB0aGUgc3F1YXJlIGJyYWNrZXRzLiAgVXNlIHRoZSByZWFsIHNlY3Rpb24gdGl0bGUgaWYgd2UgaGF2ZSBpdC4KKyAgICAgIFxpZmRpbSBcd2QxID4gMHB0CisgICAgICAgICUgSXQgaXMgaW4gYW5vdGhlciBtYW51YWwsIHNvIHdlIGRvbid0IGhhdmUgaXQuCisgICAgICAgIFxkZWZccHJpbnRlZHJlZm5hbWV7XGlnbm9yZXNwYWNlcyAjMX0lCisgICAgICBcZWxzZQorICAgICAgICBcaWZoYXZleHJlZnMKKyAgICAgICAgICAlIFdlIGtub3cgdGhlIHJlYWwgdGl0bGUgaWYgd2UgaGF2ZSB0aGUgeHJlZiB2YWx1ZXMuCisgICAgICAgICAgXGRlZlxwcmludGVkcmVmbmFtZXtccmVmeHsjMS10aXRsZX17fX0lCisgICAgICAgIFxlbHNlCisgICAgICAgICAgJSBPdGhlcndpc2UganVzdCBjb3B5IHRoZSBJbmZvIG5vZGUgbmFtZS4KKyAgICAgICAgICBcZGVmXHByaW50ZWRyZWZuYW1le1xpZ25vcmVzcGFjZXMgIzF9JQorICAgICAgICBcZmklCisgICAgICBcZmkKKyAgICBcZmkKKyAgXGZpCisgICUKKyAgJSBNYWtlIGxpbmsgaW4gcGRmIG91dHB1dC4KKyAgXGlmcGRmCisgICAgXGxlYXZldm1vZGUKKyAgICBcZ2V0ZmlsZW5hbWV7IzR9JQorICAgIHtcdHVybm9mZmFjdGl2ZQorICAgICAlIFNlZSBjb21tZW50cyBhdCBcYWN0aXZlYmFja3NsYXNoZG91YmxlLgorICAgICB7XGFjdGl2ZWJhY2tzbGFzaGRvdWJsZSBceGRlZlxwZGZ4cmVmZGVzdHsjMX0lCisgICAgICBcYmFja3NsYXNocGFyZW5zXHBkZnhyZWZkZXN0fSUKKyAgICAgJQorICAgICBcaWZudW1cZmlsZW5hbWVsZW5ndGg+MAorICAgICAgIFxzdGFydGxpbmsgYXR0cnsvQm9yZGVyIFswIDAgMF19JQorICAgICAgICAgZ290byBmaWxle1x0aGVcZmlsZW5hbWUucGRmfSBuYW1le1xwZGZ4cmVmZGVzdH0lCisgICAgIFxlbHNlCisgICAgICAgXHN0YXJ0bGluayBhdHRyey9Cb3JkZXIgWzAgMCAwXX0lCisgICAgICAgICBnb3RvIG5hbWV7XHBkZm1rcGdue1xwZGZ4cmVmZGVzdH19JQorICAgICBcZmkKKyAgICB9JQorICAgIFxsaW5rY29sb3IKKyAgXGZpCisgICUKKyAgJSBGbG9hdCByZWZlcmVuY2VzIGFyZSBwcmludGVkIGNvbXBsZXRlbHkgZGlmZmVyZW50bHk6ICJGaWd1cmUgMS4yIgorICAlIGluc3RlYWQgb2YgIltzb21lbm9kZV0sIHAuMyIuICBXZSBkaXN0aW5ndWlzaCB0aGVtIGJ5IHRoZQorICAlIExBQkVMLXRpdGxlIGJlaW5nIHNldCB0byBhIG1hZ2ljIHN0cmluZy4KKyAgeyUKKyAgICAlIEhhdmUgdG8gb3RoZXJpZnkgZXZlcnl0aGluZyBzcGVjaWFsIHRvIGFsbG93IHRoZSBcY3NuYW1lIHRvCisgICAgJSBpbmNsdWRlIGFuIF8gaW4gdGhlIHhyZWYgbmFtZSwgZXRjLgorICAgIFxpbmRleG5vZm9udHMKKyAgICBcdHVybm9mZmFjdGl2ZQorICAgIFxleHBhbmRhZnRlclxnbG9iYWxcZXhwYW5kYWZ0ZXJcbGV0XGV4cGFuZGFmdGVyXFh0aGlzcmVmdGl0bGUKKyAgICAgIFxjc25hbWUgWFIjMS10aXRsZVxlbmRjc25hbWUKKyAgfSUKKyAgXGlmZmxvYXRcWHRoaXNyZWZ0aXRsZQorICAgICUgSWYgdGhlIHVzZXIgc3BlY2lmaWVkIHRoZSBwcmludCBuYW1lICh0aGlyZCBhcmcpIHRvIHRoZSByZWYsCisgICAgJSBwcmludCBpdCBpbnN0ZWFkIG9mIG91ciB1c3VhbCAiRmlndXJlIDEuMiIuCisgICAgXGlmZGltXHdkMCA9IDBwdAorICAgICAgXHJlZnh7IzEtc250fXt9JQorICAgIFxlbHNlCisgICAgICBccHJpbnRlZHJlZm5hbWUKKyAgICBcZmkKKyAgICAlCisgICAgJSBpZiB0aGUgdXNlciBhbHNvIGdhdmUgdGhlIHByaW50ZWQgbWFudWFsIG5hbWUgKGZpZnRoIGFyZyksIGFwcGVuZAorICAgICUgImluIE1BTlVBTE5BTUUiLgorICAgIFxpZmRpbSBcd2QxID4gMHB0CisgICAgICBcc3BhY2UgXHB1dHdvcmRpbnt9IFxjaXRle1xwcmludGVkbWFudWFsfSUKKyAgICBcZmkKKyAgXGVsc2UKKyAgICAlIG5vZGUvYW5jaG9yIChub24tZmxvYXQpIHJlZmVyZW5jZXMuCisgICAgJQorICAgICUgSWYgd2UgdXNlIFx1bmhib3gwIGFuZCBcdW5oYm94MSB0byBwcmludCB0aGUgbm9kZSBuYW1lcywgVGVYIGRvZXMgbm90CisgICAgJSBpbnNlcnQgZW1wdHkgZGlzY3JldGlvbmFyaWVzIGFmdGVyIGh5cGhlbnMsIHdoaWNoIG1lYW5zIHRoYXQgaXQgd2lsbAorICAgICUgbm90IGZpbmQgYSBsaW5lIGJyZWFrIGF0IGEgaHlwaGVuIGluIGEgbm9kZSBuYW1lcy4gIFNpbmNlIHNvbWUgbWFudWFscworICAgICUgYXJlIGJlc3Qgd3JpdHRlbiB3aXRoIGZhaXJseSBsb25nIG5vZGUgbmFtZXMsIGNvbnRhaW5pbmcgaHlwaGVucywgdGhpcworICAgICUgaXMgYSBsb3NzLiAgVGhlcmVmb3JlLCB3ZSBnaXZlIHRoZSB0ZXh0IG9mIHRoZSBub2RlIG5hbWUgYWdhaW4sIHNvIGl0CisgICAgJSBpcyBhcyBpZiBUZVggaXMgc2VlaW5nIGl0IGZvciB0aGUgZmlyc3QgdGltZS4KKyAgICBcaWZkaW0gXHdkMSA+IDBwdAorICAgICAgXHB1dHdvcmRzZWN0aW9ue30gYGBccHJpbnRlZHJlZm5hbWUnJyBccHV0d29yZGlue30gXGNpdGV7XHByaW50ZWRtYW51YWx9JQorICAgIFxlbHNlCisgICAgICAlIF8gKGZvciBleGFtcGxlKSBoYXMgdG8gYmUgdGhlIGNoYXJhY3RlciBfIGZvciB0aGUgcHVycG9zZXMgb2YgdGhlCisgICAgICAlIGNvbnRyb2wgc2VxdWVuY2UgY29ycmVzcG9uZGluZyB0byB0aGUgbm9kZSwgYnV0IGl0IGhhcyB0byBleHBhbmQKKyAgICAgICUgaW50byB0aGUgdXN1YWwgXGxlYXZldm1vZGUuLi5cdnJ1bGUgc3R1ZmYgZm9yIHB1cnBvc2VzIG9mCisgICAgICAlIHByaW50aW5nLiBTbyB3ZSBcdHVybm9mZmFjdGl2ZSBmb3IgdGhlIFxyZWZ4LXNudCwgYmFjayBvbiBmb3IgdGhlCisgICAgICAlIHByaW50aW5nLCBiYWNrIG9mZiBmb3IgdGhlIFxyZWZ4LXBnLgorICAgICAge1x0dXJub2ZmYWN0aXZlCisgICAgICAgJSBPbmx5IG91dHB1dCBhIGZvbGxvd2luZyBzcGFjZSBpZiB0aGUgLXNudCByZWYgaXMgbm9uZW1wdHk7IGZvcgorICAgICAgICUgQHVubnVtYmVyZWQgYW5kIEBhbmNob3IsIGl0IHdvbid0IGJlLgorICAgICAgIFxzZXRib3gyID0gXGhib3h7XGlnbm9yZXNwYWNlcyBccmVmeHsjMS1zbnR9e319JQorICAgICAgIFxpZmRpbSBcd2QyID4gMHB0IFxyZWZ4eyMxLXNudH1cc3BhY2VcZmkKKyAgICAgIH0lCisgICAgICAlIG91dHB1dCB0aGUgYFtteW5vZGVdJyB2aWEgYSBtYWNybyBzbyBpdCBjYW4gYmUgb3ZlcnJpZGRlbi4KKyAgICAgIFx4cmVmcHJpbnRub2RlbmFtZVxwcmludGVkcmVmbmFtZQorICAgICAgJQorICAgICAgJSBCdXQgd2UgYWx3YXlzIHdhbnQgYSBjb21tYSBhbmQgYSBzcGFjZToKKyAgICAgICxcc3BhY2UKKyAgICAgICUKKyAgICAgICUgb3V0cHV0IHRoZSBgcGFnZSAzJy4KKyAgICAgIFx0dXJub2ZmYWN0aXZlIFxwdXR3b3JkcGFnZVx0aWVccmVmeHsjMS1wZ317fSUKKyAgICBcZmkKKyAgXGZpCisgIFxlbmRsaW5rCitcZW5kZ3JvdXB9CisKKyUgVGhpcyBtYWNybyBpcyBjYWxsZWQgZnJvbSBceHJlZlggZm9yIHRoZSBgW25vZGVuYW1lXScgcGFydCBvZiB4cmVmCislIG91dHB1dC4gIEl0J3MgYSBzZXBhcmF0ZSBtYWNybyBvbmx5IHNvIGl0IGNhbiBiZSBjaGFuZ2VkIG1vcmUgZWFzaWx5LAorJSBzaW5jZSBzcXVhcmUgYnJhY2tldHMgZG9uJ3Qgd29yayB3ZWxsIGluIHNvbWUgZG9jdW1lbnRzLiAgUGFydGljdWxhcmx5CislIG9uZSB0aGF0IEJvYiBpcyB3b3JraW5nIG9uIDopLgorJQorXGRlZlx4cmVmcHJpbnRub2RlbmFtZSMxe1sjMV19CisKKyUgVGhpbmdzIHJlZmVycmVkIHRvIGJ5IFxzZXRyZWYuCislCitcZGVmXFlub3RoaW5ne30KK1xkZWZcWW9taXRmcm9tdG9je30KK1xkZWZcWW51bWJlcmVkeyUKKyAgXGlmbnVtXHNlY25vPTAKKyAgICBccHV0d29yZENoYXB0ZXJAdGllIFx0aGVcY2hhcG5vCisgIFxlbHNlIFxpZm51bVxzdWJzZWNubz0wCisgICAgXHB1dHdvcmRTZWN0aW9uQHRpZSBcdGhlXGNoYXBuby5cdGhlXHNlY25vCisgIFxlbHNlIFxpZm51bVxzdWJzdWJzZWNubz0wCisgICAgXHB1dHdvcmRTZWN0aW9uQHRpZSBcdGhlXGNoYXBuby5cdGhlXHNlY25vLlx0aGVcc3Vic2Vjbm8KKyAgXGVsc2UKKyAgICBccHV0d29yZFNlY3Rpb25AdGllIFx0aGVcY2hhcG5vLlx0aGVcc2Vjbm8uXHRoZVxzdWJzZWNuby5cdGhlXHN1YnN1YnNlY25vCisgIFxmaVxmaVxmaQorfQorXGRlZlxZYXBwZW5kaXh7JQorICBcaWZudW1cc2Vjbm89MAorICAgICBccHV0d29yZEFwcGVuZGl4QHRpZSBAY2hhclx0aGVcYXBwZW5kaXhub3t9JQorICBcZWxzZSBcaWZudW1cc3Vic2Vjbm89MAorICAgICBccHV0d29yZFNlY3Rpb25AdGllIEBjaGFyXHRoZVxhcHBlbmRpeG5vLlx0aGVcc2Vjbm8KKyAgXGVsc2UgXGlmbnVtXHN1YnN1YnNlY25vPTAKKyAgICBccHV0d29yZFNlY3Rpb25AdGllIEBjaGFyXHRoZVxhcHBlbmRpeG5vLlx0aGVcc2Vjbm8uXHRoZVxzdWJzZWNubworICBcZWxzZQorICAgIFxwdXR3b3JkU2VjdGlvbkB0aWUKKyAgICAgIEBjaGFyXHRoZVxhcHBlbmRpeG5vLlx0aGVcc2Vjbm8uXHRoZVxzdWJzZWNuby5cdGhlXHN1YnN1YnNlY25vCisgIFxmaVxmaVxmaQorfQorCislIERlZmluZSBccmVmeHtOQU1FfXtTVUZGSVh9IHRvIHJlZmVyZW5jZSBhIGNyb3NzLXJlZmVyZW5jZSBzdHJpbmcgbmFtZWQgTkFNRS4KKyUgSWYgaXRzIHZhbHVlIGlzIG5vbmVtcHR5LCBTVUZGSVggaXMgb3V0cHV0IGFmdGVyd2FyZC4KKyUKK1xkZWZccmVmeCMxIzJ7JQorICB7JQorICAgIFxpbmRleG5vZm9udHMKKyAgICBcb3RoZXJiYWNrc2xhc2gKKyAgICBcZXhwYW5kYWZ0ZXJcZ2xvYmFsXGV4cGFuZGFmdGVyXGxldFxleHBhbmRhZnRlclx0aGlzcmVmWAorICAgICAgXGNzbmFtZSBYUiMxXGVuZGNzbmFtZQorICB9JQorICBcaWZ4XHRoaXNyZWZYXHJlbGF4CisgICAgJSBJZiBub3QgZGVmaW5lZCwgc2F5IHNvbWV0aGluZyBhdCBsZWFzdC4KKyAgICBcYW5nbGVsZWZ0IHVuXC1kZVwtZmluZWRcYW5nbGVyaWdodAorICAgIFxpZmxpbmtzCisgICAgICBcaWZoYXZleHJlZnMKKyAgICAgICAgXG1lc3NhZ2V7XGxpbmVudW1iZXIgVW5kZWZpbmVkIGNyb3NzIHJlZmVyZW5jZSBgIzEnLn0lCisgICAgICBcZWxzZQorICAgICAgICBcaWZ3YXJuZWR4cmVmc1xlbHNlCisgICAgICAgICAgXGdsb2JhbFx3YXJuZWR4cmVmc3RydWUKKyAgICAgICAgICBcbWVzc2FnZXtDcm9zcyByZWZlcmVuY2UgdmFsdWVzIHVua25vd247IHlvdSBtdXN0IHJ1biBUZVggYWdhaW4ufSUKKyAgICAgICAgXGZpCisgICAgICBcZmkKKyAgICBcZmkKKyAgXGVsc2UKKyAgICAlIEl0J3MgZGVmaW5lZCwgc28ganVzdCB1c2UgaXQuCisgICAgXHRoaXNyZWZYCisgIFxmaQorICAjMiUgT3V0cHV0IHRoZSBzdWZmaXggaW4gYW55IGNhc2UuCit9CisKKyUgVGhpcyBpcyB0aGUgbWFjcm8gaW52b2tlZCBieSBlbnRyaWVzIGluIHRoZSBhdXggZmlsZS4gIFVzdWFsbHkgaXQncworJSBqdXN0IGEgXGRlZiAod2UgcHJlcGVuZCBYUiB0byB0aGUgY29udHJvbCBzZXF1ZW5jZSBuYW1lIHRvIGF2b2lkCislIGNvbGxpc2lvbnMpLiAgQnV0IGlmIHRoaXMgaXMgYSBmbG9hdCB0eXBlLCB3ZSBoYXZlIG1vcmUgd29yayB0byBkby4KKyUKK1xkZWZceHJkZWYjMSMyeyUKKyAgXGV4cGFuZGFmdGVyXGdkZWZcY3NuYW1lIFhSIzFcZW5kY3NuYW1leyMyfSUgcmVtZW1iZXIgdGhpcyB4cmVmIHZhbHVlLgorICAlCisgICUgV2FzIHRoYXQgeHJlZiBjb250cm9sIHNlcXVlbmNlIHRoYXQgd2UganVzdCBkZWZpbmVkIGZvciBhIGZsb2F0PworICBcZXhwYW5kYWZ0ZXJcaWZmbG9hdFxjc25hbWUgWFIjMVxlbmRjc25hbWUKKyAgICAlIGl0IHdhcyBhIGZsb2F0LCBhbmQgd2UgaGF2ZSB0aGUgKHNhZmUpIGZsb2F0IHR5cGUgaW4gXGlmZmxvYXR0eXBlLgorICAgIFxleHBhbmRhZnRlclxsZXRcZXhwYW5kYWZ0ZXJcZmxvYXRsaXN0CisgICAgICBcY3NuYW1lIGZsb2F0bGlzdFxpZmZsb2F0dHlwZVxlbmRjc25hbWUKKyAgICAlCisgICAgJSBJcyB0aGlzIHRoZSBmaXJzdCB0aW1lIHdlJ3ZlIHNlZW4gdGhpcyBmbG9hdCB0eXBlPworICAgIFxleHBhbmRhZnRlclxpZnhcZmxvYXRsaXN0XHJlbGF4CisgICAgICBcdG9rczAgPSB7XGRvfSUgeWVzLCBzbyBqdXN0IFxkbworICAgIFxlbHNlCisgICAgICAlIGhhZCBpdCBiZWZvcmUsIHNvIHByZXNlcnZlIHByZXZpb3VzIGVsZW1lbnRzIGluIGxpc3QuCisgICAgICBcdG9rczAgPSBcZXhwYW5kYWZ0ZXJ7XGZsb2F0bGlzdFxkb30lCisgICAgXGZpCisgICAgJQorICAgICUgUmVtZW1iZXIgdGhpcyB4cmVmIGluIHRoZSBjb250cm9sIHNlcXVlbmNlIFxmbG9hdGxpc3RGTE9BVFRZUEUsCisgICAgJSBmb3IgbGF0ZXIgdXNlIGluIFxsaXN0b2ZmbG9hdHMuCisgICAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lIGZsb2F0bGlzdFxpZmZsb2F0dHlwZVxlbmRjc25hbWV7XHRoZVx0b2tzMHsjMX19JQorICBcZmkKK30KKworJSBSZWFkIHRoZSBsYXN0IGV4aXN0aW5nIGF1eCBmaWxlLCBpZiBhbnkuICBObyBlcnJvciBpZiBub25lIGV4aXN0cy4KKyUKK1xkZWZcdHJ5YXV4ZmlsZXslCisgIFxvcGVuaW4gMSBcam9ibmFtZS5hdXgKKyAgXGlmZW9mIDEgXGVsc2UKKyAgICBccmVhZGRhdGFmaWxle2F1eH0lCisgICAgXGdsb2JhbFxoYXZleHJlZnN0cnVlCisgIFxmaQorICBcY2xvc2VpbiAxCit9CisKK1xkZWZcc2V0dXBkYXRhZmlsZXslCisgIFxjYXRjb2RlYFxeXkA9XG90aGVyCisgIFxjYXRjb2RlYFxeXkE9XG90aGVyCisgIFxjYXRjb2RlYFxeXkI9XG90aGVyCisgIFxjYXRjb2RlYFxeXkM9XG90aGVyCisgIFxjYXRjb2RlYFxeXkQ9XG90aGVyCisgIFxjYXRjb2RlYFxeXkU9XG90aGVyCisgIFxjYXRjb2RlYFxeXkY9XG90aGVyCisgIFxjYXRjb2RlYFxeXkc9XG90aGVyCisgIFxjYXRjb2RlYFxeXkg9XG90aGVyCisgIFxjYXRjb2RlYFxeXks9XG90aGVyCisgIFxjYXRjb2RlYFxeXkw9XG90aGVyCisgIFxjYXRjb2RlYFxeXk49XG90aGVyCisgIFxjYXRjb2RlYFxeXlA9XG90aGVyCisgIFxjYXRjb2RlYFxeXlE9XG90aGVyCisgIFxjYXRjb2RlYFxeXlI9XG90aGVyCisgIFxjYXRjb2RlYFxeXlM9XG90aGVyCisgIFxjYXRjb2RlYFxeXlQ9XG90aGVyCisgIFxjYXRjb2RlYFxeXlU9XG90aGVyCisgIFxjYXRjb2RlYFxeXlY9XG90aGVyCisgIFxjYXRjb2RlYFxeXlc9XG90aGVyCisgIFxjYXRjb2RlYFxeXlg9XG90aGVyCisgIFxjYXRjb2RlYFxeXlo9XG90aGVyCisgIFxjYXRjb2RlYFxeXls9XG90aGVyCisgIFxjYXRjb2RlYFxeXlw9XG90aGVyCisgIFxjYXRjb2RlYFxeXl09XG90aGVyCisgIFxjYXRjb2RlYFxeXl49XG90aGVyCisgIFxjYXRjb2RlYFxeXl89XG90aGVyCisgICUgSXQgd2FzIHN1Z2dlc3RlZCB0byBzZXQgdGhlIGNhdGNvZGUgb2YgXiB0byA3LCB3aGljaCB3b3VsZCBhbGxvdyBeXmU0IGV0Yy4KKyAgJSBpbiB4cmVmIHRhZ3MsIGkuZS4sIG5vZGUgbmFtZXMuICBCdXQgc2luY2UgXl5lNCBub3RhdGlvbiBpc24ndAorICAlIHN1cHBvcnRlZCBpbiB0aGUgbWFpbiB0ZXh0LCBpdCBkb2Vzbid0IHNlZW0gZGVzaXJhYmxlLiAgRnVydGhlcm1vcmUsCisgICUgdGhhdCBpcyBub3QgZW5vdWdoOiBmb3Igbm9kZSBuYW1lcyB0aGF0IGFjdHVhbGx5IGNvbnRhaW4gYSBeCisgICUgY2hhcmFjdGVyLCB3ZSB3b3VsZCBlbmQgdXAgd3JpdGluZyBhIGxpbmUgbGlrZSB0aGlzOiAneHJkZWYgeydoYXQKKyAgJSBiLXRpdGxlfXsnaGF0IGJ9IGFuZCBceHJkZWYgZG9lcyBhIFxjc25hbWUuLi5cZW5kY3NuYW1lIG9uIHRoZSBmaXJzdAorICAlIGFyZ3VtZW50LCBhbmQgXGhhdCBpcyBub3QgYW4gZXhwYW5kYWJsZSBjb250cm9sIHNlcXVlbmNlLiAgSXQgY291bGQKKyAgJSBhbGwgYmUgd29ya2VkIG91dCwgYnV0IHdoeT8gIEVpdGhlciB3ZSBzdXBwb3J0IF5eIG9yIHdlIGRvbid0LgorICAlCisgICUgVGhlIG90aGVyIGNoYW5nZSBuZWNlc3NhcnkgZm9yIHRoaXMgd2FzIHRvIGRlZmluZSBcYXV4aGF0OgorICAlIFxkZWZcYXV4aGF0e1xkZWZeeydoYXQgfX0lIGV4dHJhIHNwYWNlIHNvIG9rIGlmIGZvbGxvd2VkIGJ5IGxldHRlcgorICAlIGFuZCB0aGVuIHRvIGNhbGwgXGF1eGhhdCBpbiBcc2V0cS4KKyAgJQorICBcY2F0Y29kZWBcXj1cb3RoZXIKKyAgJQorICAlIFNwZWNpYWwgY2hhcmFjdGVycy4gIFNob3VsZCBiZSB0dXJuZWQgb2ZmIGFueXdheSwgYnV0Li4uCisgIFxjYXRjb2RlYFx+PVxvdGhlcgorICBcY2F0Y29kZWBcWz1cb3RoZXIKKyAgXGNhdGNvZGVgXF09XG90aGVyCisgIFxjYXRjb2RlYFwiPVxvdGhlcgorICBcY2F0Y29kZWBcXz1cb3RoZXIKKyAgXGNhdGNvZGVgXHw9XG90aGVyCisgIFxjYXRjb2RlYFw8PVxvdGhlcgorICBcY2F0Y29kZWBcPj1cb3RoZXIKKyAgXGNhdGNvZGVgXCQ9XG90aGVyCisgIFxjYXRjb2RlYFwjPVxvdGhlcgorICBcY2F0Y29kZWBcJj1cb3RoZXIKKyAgXGNhdGNvZGVgXCU9XG90aGVyCisgIFxjYXRjb2RlYCs9XG90aGVyICUgYXZvaWQgXCsgZm9yIHBhcmFub2lhIGV2ZW4gdGhvdWdoIHdlJ3ZlIHR1cm5lZCBpdCBvZmYKKyAgJQorICAlIFRoaXMgaXMgdG8gc3VwcG9ydCBcIGluIG5vZGUgbmFtZXMgYW5kIHRpdGxlcywgc2luY2UgdGhlIFwKKyAgJSBjaGFyYWN0ZXJzIGVuZCB1cCBpbiBhIFxjc25hbWUuICBJdCdzIGVhc2llciB0aGFuCisgICUgbGVhdmluZyBpdCBhY3RpdmUgYW5kIG1ha2luZyBpdHMgYWN0aXZlIGRlZmluaXRpb24gYW4gYWN0dWFsIFwKKyAgJSBjaGFyYWN0ZXIuICBXaGF0IEkgZG9uJ3QgdW5kZXJzdGFuZCBpcyB3aHkgaXQgd29ya3MgaW4gdGhlICp2YWx1ZSoKKyAgJSBvZiB0aGUgeHJkZWYuICBTZWVtcyBsaWtlIGl0IHNob3VsZCBiZSBhIGNhdGNvZGUxMiBcLCBhbmQgdGhhdAorICAlIHNob3VsZCBub3QgdHlwZXNldCBwcm9wZXJseS4gIEJ1dCBpdCB3b3Jrcywgc28gSSdtIG1vdmluZyBvbiBmb3IKKyAgJSBub3cuICAtLWthcmwsIDE1amFuMDQuCisgIFxjYXRjb2RlYFxcPVxvdGhlcgorICAlCisgICUgTWFrZSB0aGUgY2hhcmFjdGVycyAxMjgtMjU1IGJlIHByaW50aW5nIGNoYXJhY3RlcnMuCisgIHslCisgICAgXGNvdW50MT0xMjgKKyAgICBcZGVmXGxvb3B7JQorICAgICAgXGNhdGNvZGVcY291bnQxPVxvdGhlcgorICAgICAgXGFkdmFuY2VcY291bnQxIGJ5IDEKKyAgICAgIFxpZm51bSBcY291bnQxPDI1NiBcbG9vcCBcZmkKKyAgICB9JQorICB9JQorICAlCisgICUgQCBpcyBvdXIgZXNjYXBlIGNoYXJhY3RlciBpbiAuYXV4IGZpbGVzLCBhbmQgd2UgbmVlZCBicmFjZXMuCisgIFxjYXRjb2RlYFx7PTEKKyAgXGNhdGNvZGVgXH09MgorICBcY2F0Y29kZWBcQD0wCit9CisKK1xkZWZccmVhZGRhdGFmaWxlIzF7JQorXGJlZ2luZ3JvdXAKKyAgXHNldHVwZGF0YWZpbGUKKyAgXGlucHV0XGpvYm5hbWUuIzEKK1xlbmRncm91cH0KKworXG1lc3NhZ2V7aW5zZXJ0aW9ucyx9CislIGluY2x1ZGluZyBmb290bm90ZXMuCisKK1xuZXdjb3VudCBcZm9vdG5vdGVubworCislIFRoZSB0cmFpbGluZyBzcGFjZSBpbiB0aGUgZm9sbG93aW5nIGRlZmluaXRpb24gZm9yIHN1cGVyZWplY3QgaXMKKyUgdml0YWwgZm9yIHByb3BlciBmaWxsaW5nOyBwYWdlcyBjb21lIG91dCB1bmFsaWduZWQgd2hlbiB5b3UgZG8gYQorJSBwYWdlYWxpZ25tYWNybyBjYWxsIGlmIHRoYXQgc3BhY2UgYmVmb3JlIHRoZSBjbG9zaW5nIGJyYWNlIGlzCislIHJlbW92ZWQuIChHZW5lcmFsbHksIG51bWVyaWMgY29uc3RhbnRzIHNob3VsZCBhbHdheXMgYmUgZm9sbG93ZWQgYnkgYQorJSBzcGFjZSB0byBwcmV2ZW50IHN0cmFuZ2UgZXhwYW5zaW9uIGVycm9ycy4pCitcZGVmXHN1cGVyZWplY3R7XHBhclxwZW5hbHR5IC0yMDAwMFxmb290bm90ZW5vID0wIH0KKworJSBAZm9vdG5vdGVzdHlsZSBpcyBtZWFuaW5nZnVsIGZvciBpbmZvIG91dHB1dCBvbmx5LgorXGxldFxmb290bm90ZXN0eWxlPVxjb21tZW50CisKK3tcY2F0Y29kZSBgXEA9MTEKKyUKKyUgQXV0by1udW1iZXIgZm9vdG5vdGVzLiAgT3RoZXJ3aXNlIGxpa2UgcGxhaW4uCitcZ2RlZlxmb290bm90ZXslCisgIFxsZXRcaW5kZW50PVxwdGV4aW5kZW50CisgIFxsZXRcbm9pbmRlbnQ9XHB0ZXhub2luZGVudAorICBcZ2xvYmFsXGFkdmFuY2VcZm9vdG5vdGVubyBieSBcQG5lCisgIFxlZGVmXHRoaXNmb290bm97JF57XHRoZVxmb290bm90ZW5vfSR9JQorICAlCisgICUgSW4gY2FzZSB0aGUgZm9vdG5vdGUgY29tZXMgYXQgdGhlIGVuZCBvZiBhIHNlbnRlbmNlLCBwcmVzZXJ2ZSB0aGUKKyAgJSBleHRyYSBzcGFjaW5nIGFmdGVyIHdlIGRvIHRoZSBmb290bm90ZSBudW1iZXIuCisgIFxsZXRcQHNmXGVtcHR5CisgIFxpZmhtb2RlXGVkZWZcQHNme1xzcGFjZWZhY3Rvclx0aGVcc3BhY2VmYWN0b3J9XHB0ZXhzbGFzaFxmaQorICAlCisgICUgUmVtb3ZlIGluYWR2ZXJ0ZW50IGJsYW5rIHNwYWNlIGJlZm9yZSB0eXBlc2V0dGluZyB0aGUgZm9vdG5vdGUgbnVtYmVyLgorICBcdW5za2lwCisgIFx0aGlzZm9vdG5vXEBzZgorICBcZG9mb290bm90ZQorfSUKKworJSBEb24ndCBib3RoZXIgd2l0aCB0aGUgdHJpY2tlcnkgaW4gcGxhaW4udGV4IHRvIG5vdCByZXF1aXJlIHRoZQorJSBmb290bm90ZSB0ZXh0IGFzIGEgcGFyYW1ldGVyLiAgT3VyIGZvb3Rub3RlcyBkb24ndCBuZWVkIHRvIGJlIHNvIGdlbmVyYWwuCislCislIE9oIHllcywgdGhleSBkbzsgb3RoZXJ3aXNlLCBAaWZzZXQgKGFuZCBhbnl0aGluZyBlbHNlIHRoYXQgdXNlcworJSBccGFyc2VhcmdsaW5lKSBmYWlscyBpbnNpZGUgZm9vdG5vdGVzIGJlY2F1c2UgdGhlIHRva2VucyBhcmUgZml4ZWQgd2hlbgorJSB0aGUgZm9vdG5vdGUgaXMgcmVhZC4gIC0ta2FybCwgMTZub3Y5Ni4KKyUKK1xnZGVmXGRvZm9vdG5vdGV7JQorICBcaW5zZXJ0XGZvb3RpbnNcYmdyb3VwCisgICUgV2Ugd2FudCB0byB0eXBlc2V0IHRoaXMgdGV4dCBhcyBhIG5vcm1hbCBwYXJhZ3JhcGgsIGV2ZW4gaWYgdGhlCisgICUgZm9vdG5vdGUgcmVmZXJlbmNlIG9jY3VycyBpbiAoZm9yIGV4YW1wbGUpIGEgZGlzcGxheSBlbnZpcm9ubWVudC4KKyAgJSBTbyByZXNldCBzb21lIHBhcmFtZXRlcnMuCisgIFxoc2l6ZT1ccGFnZXdpZHRoCisgIFxpbnRlcmxpbmVwZW5hbHR5XGludGVyZm9vdG5vdGVsaW5lcGVuYWx0eQorICBcc3BsaXR0b3Bza2lwXGh0XHN0cnV0Ym94ICUgdG9wIGJhc2VsaW5lIGZvciBicm9rZW4gZm9vdG5vdGVzCisgIFxzcGxpdG1heGRlcHRoXGRwXHN0cnV0Ym94CisgIFxmbG9hdGluZ3BlbmFsdHlcQE1NCisgIFxsZWZ0c2tpcFx6QHNraXAKKyAgXHJpZ2h0c2tpcFx6QHNraXAKKyAgXHNwYWNlc2tpcFx6QHNraXAKKyAgXHhzcGFjZXNraXBcekBza2lwCisgIFxwYXJpbmRlbnRcZGVmYXVsdHBhcmluZGVudAorICAlCisgIFxzbWFsbGZvbnRzIFxybQorICAlCisgICUgQmVjYXVzZSB3ZSB1c2UgaGFuZ2luZyBpbmRlbnRhdGlvbiBpbiBmb290bm90ZXMsIGEgQG5vaW5kZW50IGFwcGVhcnMKKyAgJSB0byBleGRlbnQgdGhpcyB0ZXh0LCBzbyBtYWtlIGl0IGJlIGEgbm8tb3AuICBtYWtlaW5mbyBkb2VzIG5vdCB1c2UKKyAgJSBoYW5naW5nIGluZGVudGF0aW9uIHNvIEBub2luZGVudCBjYW4gc3RpbGwgYmUgbmVlZGVkIHdpdGhpbiBmb290bm90ZQorICAlIHRleHQgYWZ0ZXIgYW4gQGV4YW1wbGUgb3IgdGhlIGxpa2UgKG5vdCB0aGF0IHRoaXMgaXMgZ29vZCBzdHlsZSkuCisgIFxsZXRcbm9pbmRlbnQgPSBccmVsYXgKKyAgJQorICAlIEhhbmcgdGhlIGZvb3Rub3RlIHRleHQgb2ZmIHRoZSBudW1iZXIuICBVc2UgXGV2ZXJ5cGFyIGluIGNhc2UgdGhlCisgICUgZm9vdG5vdGUgZXh0ZW5kcyBmb3IgbW9yZSB0aGFuIG9uZSBwYXJhZ3JhcGguCisgIFxldmVyeXBhciA9IHtcaGFuZ30lCisgIFx0ZXh0aW5kZW50e1x0aGlzZm9vdG5vfSUKKyAgJQorICAlIERvbid0IGNyYXNoIGludG8gdGhlIGxpbmUgYWJvdmUgdGhlIGZvb3Rub3RlIHRleHQuICBTaW5jZSB0aGlzCisgICUgZXhwYW5kcyBpbnRvIGEgYm94LCBpdCBtdXN0IGNvbWUgd2l0aGluIHRoZSBwYXJhZ3JhcGgsIGxlc3QgaXQKKyAgJSBwcm92aWRlIGEgcGxhY2Ugd2hlcmUgVGVYIGNhbiBzcGxpdCB0aGUgZm9vdG5vdGUuCisgIFxmb290c3RydXQKKyAgXGZ1dHVyZWxldFxuZXh0XGZvQHQKK30KK30lZW5kIFxjYXRjb2RlIGBcQD0xMQorCislIEluIGNhc2UgYSBAZm9vdG5vdGUgYXBwZWFycyBpbiBhIHZib3gsIHNhdmUgdGhlIGZvb3Rub3RlIHRleHQgYW5kIGNyZWF0ZQorJSB0aGUgcmVhbCBcaW5zZXJ0IGp1c3QgYWZ0ZXIgdGhlIHZib3ggZmluaXNoZWQuICBPdGhlcndpc2UsIHRoZSBpbnNlcnRpb24KKyUgd291bGQgYmUgbG9zdC4KKyUgU2ltaWxhcmlseSwgaWYgYSBAZm9vdG5vdGUgYXBwZWFycyBpbnNpZGUgYW4gYWxpZ25tZW50LCBzYXZlIHRoZSBmb290bm90ZQorJSB0ZXh0IHRvIGEgYm94IGFuZCBtYWtlIHRoZSBcaW5zZXJ0IHdoZW4gYSByb3cgb2YgdGhlIHRhYmxlIGlzIGZpbmlzaGVkLgorJSBBbmQgdGhlIHNhbWUgY2FuIGJlIGRvbmUgZm9yIG90aGVyIGluc2VydCBjbGFzc2VzLiAgLS1rYXNhbCwgMTZub3YwMy4KKworJSBSZXBsYWNlIHRoZSBcaW5zZXJ0IHByaW1pdGl2ZSBieSBhIGNoZWF0aW5nIG1hY3JvLgorJSBEZWVwZXIgaW5zaWRlLCBqdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZSBzYXZlZCBpbnNlcnRpb25zIGFyZSBub3Qgc3BpbGxlZAorJSBvdXQgcHJlbWF0dXJlbHkuCislCitcZGVmXHN0YXJ0c2F2aW5naW5zZXJ0c3slCisgIFxpZnggXGluc2VydFxwdGV4aW5zZXJ0CisgICAgXGxldFxpbnNlcnRcc2F2ZWluc2VydAorICBcZWxzZQorICAgIFxsZXRcY2hlY2tpbnNlcnRzXHJlbGF4CisgIFxmaQorfQorCislIFRoaXMgXGluc2VydCByZXBsYWNlbWVudCB3b3JrcyBmb3IgYm90aCBcaW5zZXJ0XGZvb3RpbnN7Zm9vfSBhbmQKKyUgXGluc2VydFxmb290aW5zXGJncm91cCBmb29cZWdyb3VwLCBidXQgaXQgZG9lc24ndCB3b3JrIGZvciBcaW5zZXJ0Mjd7Zm9vfS4KKyUKK1xkZWZcc2F2ZWluc2VydCMxeyUKKyAgXGVkZWZcbmV4dHtcbm9leHBhbmRcc2F2ZXRvYm94IFxtYWtlU0FWRW5hbWUjMX0lCisgIFxhZnRlcmFzc2lnbm1lbnRcbmV4dAorICAlIHN3YWxsb3cgdGhlIGxlZnQgYnJhY2UKKyAgXGxldFx0ZW1wID0KK30KK1xkZWZcbWFrZVNBVkVuYW1lIzF7XG1ha2Vjc25hbWV7U0FWRVxleHBhbmRhZnRlclxnb2JibGVcc3RyaW5nIzF9fQorXGRlZlxzYXZldG9ib3gjMXtcZ2xvYmFsXHNldGJveCMxID0gXHZib3hcYmdyb3VwIFx1bnZib3gjMX0KKworXGRlZlxjaGVja3NhdmVpbnMjMXtcaWZ2b2lkIzFcZWxzZSBccGxhY2VzYXZlaW5zIzFcZml9CisKK1xkZWZccGxhY2VzYXZlaW5zIzF7JQorICBccHRleGluc2VydCBcY3NuYW1lXGV4cGFuZGFmdGVyXGdvYmJsZXNhdmVcc3RyaW5nIzFcZW5kY3NuYW1lCisgICAge1xib3gjMX0lCit9CisKKyUgZWF0IEBTQVZFIC0tIGJld2FyZSwgYWxsIG9mIHRoZW0gaGF2ZSBjYXRjb2RlIFxvdGhlcjoKK3sKKyAgXGRlZlxkb3NwZWNpYWxze1xkbyBTXGRvIEFcZG8gVlxkbyBFfSBcdW5jYXRjb2Rlc3BlY2lhbHMgICUgIDstKQorICBcZ2RlZlxnb2JibGVzYXZlIEBTQVZFe30KK30KKworJSBpbml0aWFsaXphdGlvbjoKK1xkZWZcbmV3c2F2ZWlucyAjMXslCisgIFxlZGVmXG5leHR7XG5vZXhwYW5kXG5ld3NhdmVpbnNYIFxtYWtlU0FWRW5hbWUjMX0lCisgIFxuZXh0Cit9CitcZGVmXG5ld3NhdmVpbnNYICMxeyUKKyAgXGNzbmFtZSBuZXdib3hcZW5kY3NuYW1lICMxJQorICBcZXhwYW5kYWZ0ZXJcZGVmXGV4cGFuZGFmdGVyXGNoZWNraW5zZXJ0c1xleHBhbmRhZnRlcntcY2hlY2tpbnNlcnRzCisgICAgXGNoZWNrc2F2ZWlucyAjMX0lCit9CisKKyUgaW5pdGlhbGl6ZToKK1xsZXRcY2hlY2tpbnNlcnRzXGVtcHR5CitcbmV3c2F2ZWluc1xmb290aW5zCitcbmV3c2F2ZWluc1xtYXJnaW4KKworCislIEBpbWFnZS4gIFdlIHVzZSB0aGUgbWFjcm9zIGZyb20gZXBzZi50ZXggdG8gc3VwcG9ydCB0aGlzLgorJSBJZiBlcHNmLnRleCBpcyBub3QgaW5zdGFsbGVkIGFuZCBAaW1hZ2UgaXMgdXNlZCwgd2UgY29tcGxhaW4uCislCislIENoZWNrIGZvciBhbmQgcmVhZCBlcHNmLnRleCB1cCBmcm9udC4gIElmIHdlIHJlYWQgaXQgb25seSBhdCBAaW1hZ2UKKyUgdGltZSwgd2UgbWlnaHQgYmUgaW5zaWRlIGEgZ3JvdXAsIGFuZCB0aGVuIGl0cyBkZWZpbml0aW9ucyB3b3VsZCBnZXQKKyUgdW5kb25lIGFuZCB0aGUgbmV4dCBpbWFnZSB3b3VsZCBmYWlsLgorXG9wZW5pbiAxID0gZXBzZi50ZXgKK1xpZmVvZiAxIFxlbHNlCisgICUgRG8gbm90IGJvdGhlciBzaG93aW5nIGJhbm5lciB3aXRoIGVwc2YudGV4IHYyLjdrIChhdmFpbGFibGUgaW4KKyAgJSBkb2MvZXBzZi50ZXggYW5kIG9uIGN0YW4pLgorICBcZGVmXGVwc2Zhbm5vdW5jZXtcdG9rczAgPSB9JQorICBcaW5wdXQgZXBzZi50ZXgKK1xmaQorXGNsb3NlaW4gMQorJQorJSBXZSB3aWxsIG9ubHkgY29tcGxhaW4gb25jZSBhYm91dCBsYWNrIG9mIGVwc2YudGV4LgorXG5ld2lmXGlmd2FybmVkbm9lcHNmCitcbmV3aGVscFxub2Vwc2ZoZWxwe2Vwc2YudGV4IG11c3QgYmUgaW5zdGFsbGVkIGZvciBpbWFnZXMgdG8KKyAgd29yay4gIEl0IGlzIGFsc28gaW5jbHVkZWQgaW4gdGhlIFRleGluZm8gZGlzdHJpYnV0aW9uLCBvciB5b3UgY2FuIGdldAorICBpdCBmcm9tIGZ0cDovL3R1Zy5vcmcvdGV4L2Vwc2YudGV4Ln0KKyUKK1xkZWZcaW1hZ2UjMXslCisgIFxpZnhcZXBzZmJveFx1bmRlZmluZWQKKyAgICBcaWZ3YXJuZWRub2Vwc2YgXGVsc2UKKyAgICAgIFxlcnJoZWxwID0gXG5vZXBzZmhlbHAKKyAgICAgIFxlcnJtZXNzYWdle2Vwc2YudGV4IG5vdCBmb3VuZCwgaW1hZ2VzIHdpbGwgYmUgaWdub3JlZH0lCisgICAgICBcZ2xvYmFsXHdhcm5lZG5vZXBzZnRydWUKKyAgICBcZmkKKyAgXGVsc2UKKyAgICBcaW1hZ2V4eHggIzEsLCwsLFxmaW5pc2gKKyAgXGZpCit9CislCislIEFyZ3VtZW50cyB0byBAaW1hZ2U6CislICMxIGlzIChtYW5kYXRvcnkpIGltYWdlIGZpbGVuYW1lOyB3ZSB0YWNrIG9uIC5lcHMgZXh0ZW5zaW9uLgorJSAjMiBpcyAob3B0aW9uYWwpIHdpZHRoLCAjMyBpcyAob3B0aW9uYWwpIGhlaWdodC4KKyUgIzQgaXMgKGlnbm9yZWQgb3B0aW9uYWwpIGh0bWwgYWx0IHRleHQuCislICM1IGlzIChpZ25vcmVkIG9wdGlvbmFsKSBleHRlbnNpb24uCislICM2IGlzIGp1c3QgdGhlIHVzdWFsIGV4dHJhIGlnbm9yZWQgYXJnIGZvciBwYXJzaW5nIHRoaXMgc3R1ZmYuCitcbmV3aWZcaWZpbWFnZXZtb2RlCitcZGVmXGltYWdleHh4IzEsIzIsIzMsIzQsIzUsIzZcZmluaXNoe1xiZWdpbmdyb3VwCisgIFxjYXRjb2RlYFxeXk0gPSA1ICAgICAlIGluIGNhc2Ugd2UncmUgaW5zaWRlIGFuIGV4YW1wbGUKKyAgXG5vcm1hbHR1cm5vZmZhY3RpdmUgICUgYWxsb3cgXyBldCBhbC4gaW4gbmFtZXMKKyAgJSBJZiB0aGUgaW1hZ2UgaXMgYnkgaXRzZWxmLCBjZW50ZXIgaXQuCisgIFxpZnZtb2RlCisgICAgXGltYWdldm1vZGV0cnVlCisgICAgXG5vYnJlYWtcYmlnc2tpcAorICAgICUgVXN1YWxseSB3ZSdsbCBoYXZlIHRleHQgYWZ0ZXIgdGhlIGltYWdlIHdoaWNoIHdpbGwgaW5zZXJ0CisgICAgJSBccGFyc2tpcCBnbHVlLCBzbyBpbnNlcnQgaXQgaGVyZSB0b28gdG8gZXF1YWxpemUgdGhlIHNwYWNlCisgICAgJSBhYm92ZSBhbmQgYmVsb3cuCisgICAgXG5vYnJlYWtcdnNraXBccGFyc2tpcAorICAgIFxub2JyZWFrCisgICAgXGxpbmVcYmdyb3VwCisgIFxmaQorICAlCisgICUgT3V0cHV0IHRoZSBpbWFnZS4KKyAgXGlmcGRmCisgICAgXGRvcGRmaW1hZ2V7IzF9eyMyfXsjM30lCisgIFxlbHNlCisgICAgJSBcZXBzZmJveCBpdHNlbGYgcmVzZXRzIFxlcHNmP3NpemUgYXQgZWFjaCBmaWd1cmUuCisgICAgXHNldGJveDAgPSBcaGJveHtcaWdub3Jlc3BhY2VzICMyfVxpZmRpbVx3ZDAgPiAwcHQgXGVwc2Z4c2l6ZT0jMlxyZWxheCBcZmkKKyAgICBcc2V0Ym94MCA9IFxoYm94e1xpZ25vcmVzcGFjZXMgIzN9XGlmZGltXHdkMCA+IDBwdCBcZXBzZnlzaXplPSMzXHJlbGF4IFxmaQorICAgIFxlcHNmYm94eyMxLmVwc30lCisgIFxmaQorICAlCisgIFxpZmltYWdldm1vZGUgXGVncm91cCBcYmlnYnJlYWsgXGZpICAlIHNwYWNlIGFmdGVyIHRoZSBpbWFnZQorXGVuZGdyb3VwfQorCisKKyUgQGZsb2F0IEZMT0FUVFlQRSxMQUJFTCxMT0MgLi4uIEBlbmQgZmxvYXQgZm9yIGRpc3BsYXllZCBmaWd1cmVzLCB0YWJsZXMsCislIGV0Yy4gIFdlIGRvbid0IGFjdHVhbGx5IGltcGxlbWVudCBmbG9hdGluZyB5ZXQsIHdlIGFsd2F5cyBpbmNsdWRlIHRoZQorJSBmbG9hdCAiaGVyZSIuICBCdXQgaXQgc2VlbWVkIHRoZSBiZXN0IG5hbWUgZm9yIHRoZSBmdXR1cmUuCislCitcZW52cGFyc2VhcmdkZWZcZmxvYXR7XGVhdGNvbW1hc3BhY2VcZWF0Y29tbWFzcGFjZVxkb2Zsb2F0IzEsICwgLFxmaW5pc2h9CisKKyUgVGhlcmUgbWF5IGJlIGEgc3BhY2UgYmVmb3JlIHNlY29uZCBhbmQvb3IgdGhpcmQgcGFyYW1ldGVyOyBkZWxldGUgaXQuCitcZGVmXGVhdGNvbW1hc3BhY2UjMSwgeyMxLH0KKworJSAjMSBpcyB0aGUgb3B0aW9uYWwgRkxPQVRUWVBFLCB0aGUgdGV4dCBsYWJlbCBmb3IgdGhpcyBmbG9hdCwgdHlwaWNhbGx5CislICJGaWd1cmUiLCAiVGFibGUiLCAiRXhhbXBsZSIsIGV0Yy4gIENhbid0IGNvbnRhaW4gY29tbWFzLiAgSWYgb21pdHRlZCwKKyUgdGhpcyBmbG9hdCB3aWxsIG5vdCBiZSBudW1iZXJlZCBhbmQgY2Fubm90IGJlIHJlZmVycmVkIHRvLgorJQorJSAjMiBpcyB0aGUgb3B0aW9uYWwgeHJlZiBsYWJlbC4gIEFsc28gbXVzdCBiZSBwcmVzZW50IGZvciB0aGUgZmxvYXQgdG8KKyUgYmUgcmVmZXJhYmxlLgorJQorJSAjMyBpcyB0aGUgb3B0aW9uYWwgcG9zaXRpb25pbmcgYXJndW1lbnQ7IGZvciBub3csIGl0IGlzIGlnbm9yZWQuICBJdAorJSB3aWxsIHNvbWVob3cgc3BlY2lmeSB0aGUgcG9zaXRpb25zIGFsbG93ZWQgdG8gZmxvYXQgdG8gKGhlcmUsIHRvcCwgYm90dG9tKS4KKyUKKyUgV2Uga2VlcCBhIHNlcGFyYXRlIGNvdW50ZXIgZm9yIGVhY2ggRkxPQVRUWVBFLCB3aGljaCB3ZSByZXNldCBhdCBlYWNoCislIGNoYXB0ZXItbGV2ZWwgY29tbWFuZC4KK1xsZXRccmVzZXRhbGxmbG9hdG5vcz1cZW1wdHkKKyUKK1xkZWZcZG9mbG9hdCMxLCMyLCMzLCM0XGZpbmlzaHslCisgIFxsZXRcdGhpc2NhcHRpb249XGVtcHR5CisgIFxsZXRcdGhpc3Nob3J0Y2FwdGlvbj1cZW1wdHkKKyAgJQorICAlIGRvbid0IGxvc2UgZm9vdG5vdGVzIGluc2lkZSBAZmxvYXQuCisgICUKKyAgJSBCRVdBUkU6IHdoZW4gdGhlIGZsb2F0cyBzdGFydCBmbG9hdCwgd2UgaGF2ZSB0byBpc3N1ZSB3YXJuaW5nIHdoZW5ldmVyIGFuCisgICUgaW5zZXJ0IGFwcGVhcnMgaW5zaWRlIGEgZmxvYXQgd2hpY2ggY291bGQgcG9zc2libHkgZmxvYXQuIC0ta2FzYWwsIDI2bWF5MDQKKyAgJQorICBcc3RhcnRzYXZpbmdpbnNlcnRzCisgICUKKyAgJSBXZSBjYW4ndCBiZSB1c2VkIGluc2lkZSBhIHBhcmFncmFwaC4KKyAgXHBhcgorICAlCisgIFx2dG9wXGJncm91cAorICAgIFxkZWZcZmxvYXR0eXBleyMxfSUKKyAgICBcZGVmXGZsb2F0bGFiZWx7IzJ9JQorICAgIFxkZWZcZmxvYXRsb2N7IzN9JSB3ZSBkbyBub3RoaW5nIHdpdGggdGhpcyB5ZXQuCisgICAgJQorICAgIFxpZnhcZmxvYXR0eXBlXGVtcHR5CisgICAgICBcbGV0XHNhZmVmbG9hdHR5cGU9XGVtcHR5CisgICAgXGVsc2UKKyAgICAgIHslCisgICAgICAgICUgdGhlIGZsb2F0dHlwZSBtaWdodCBoYXZlIGFjY2VudHMgb3Igb3RoZXIgc3BlY2lhbCBjaGFyYWN0ZXJzLAorICAgICAgICAlIGJ1dCB3ZSBuZWVkIHRvIHVzZSBpdCBpbiBhIGNvbnRyb2wgc2VxdWVuY2UgbmFtZS4KKyAgICAgICAgXGluZGV4bm9mb250cworICAgICAgICBcdHVybm9mZmFjdGl2ZQorICAgICAgICBceGRlZlxzYWZlZmxvYXR0eXBle1xmbG9hdHR5cGV9JQorICAgICAgfSUKKyAgICBcZmkKKyAgICAlCisgICAgJSBJZiBsYWJlbCBpcyBnaXZlbiBidXQgbm8gdHlwZSwgd2UgaGFuZGxlIHRoYXQgYXMgdGhlIGVtcHR5IHR5cGUuCisgICAgXGlmeFxmbG9hdGxhYmVsXGVtcHR5IFxlbHNlCisgICAgICAlIFdlIHdhbnQgZWFjaCBGTE9BVFRZUEUgdG8gYmUgbnVtYmVyZWQgc2VwYXJhdGVseSAoRmlndXJlIDEsCisgICAgICAlIFRhYmxlIDEsIEZpZ3VyZSAyLCAuLi4pLiAgKEFuZCBpZiBubyBsYWJlbCwgbm8gbnVtYmVyLikKKyAgICAgICUKKyAgICAgIFxleHBhbmRhZnRlclxnZXRmbG9hdG5vXGNzbmFtZVxzYWZlZmxvYXR0eXBlIGZsb2F0bm9cZW5kY3NuYW1lCisgICAgICBcZ2xvYmFsXGFkdmFuY2VcZmxvYXRubyBieSAxCisgICAgICAlCisgICAgICB7JQorICAgICAgICAlIFRoaXMgbWFnaWMgdmFsdWUgZm9yIFx0aGlzc2VjdGlvbiBpcyBvdXRwdXQgYnkgXHNldHJlZiBhcyB0aGUKKyAgICAgICAgJSBYUkVGTEFCRUwtdGl0bGUgdmFsdWUuICBceHJlZlggdXNlcyBpdCB0byBkaXN0aW5ndWlzaCBmbG9hdAorICAgICAgICAlIGxhYmVscyAod2hpY2ggaGF2ZSBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IG91dHB1dCBmb3JtYXQpIGZyb20KKyAgICAgICAgJSBub2RlIGFuZCBhbmNob3IgbGFiZWxzLiAgQW5kIFx4cmRlZiB1c2VzIGl0IHRvIGNvbnN0cnVjdCB0aGUKKyAgICAgICAgJSBsaXN0cyBvZiBmbG9hdHMuCisgICAgICAgICUKKyAgICAgICAgXGVkZWZcdGhpc3NlY3Rpb257XGZsb2F0bWFnaWM9XHNhZmVmbG9hdHR5cGV9JQorICAgICAgICBcc2V0cmVme1xmbG9hdGxhYmVsfXtZZmxvYXR9JQorICAgICAgfSUKKyAgICBcZmkKKyAgICAlCisgICAgJSBzdGFydCB3aXRoIFxwYXJza2lwIGdsdWUsIEkgZ3Vlc3MuCisgICAgXHZza2lwXHBhcnNraXAKKyAgICAlCisgICAgJSBEb24ndCBzdXBwcmVzcyBpbmRlbnRhdGlvbiBpZiBhIGZsb2F0IGhhcHBlbnMgdG8gc3RhcnQgYSBzZWN0aW9uLgorICAgIFxyZXN0b3JlZmlyc3RwYXJhZ3JhcGhpbmRlbnQKK30KKworJSB3ZSBoYXZlIHRoZXNlIHBvc3NpYmlsaXRpZXM6CislIEBmbG9hdCBGb28sbGJsICYgQGNhcHRpb257Q2FwfTogRm9vIDEuMTogQ2FwCislIEBmbG9hdCBGb28sbGJsICYgbm8gY2FwdGlvbjogICAgRm9vIDEuMQorJSBAZmxvYXQgRm9vICYgQGNhcHRpb257Q2FwfTogICAgIEZvbzogQ2FwCislIEBmbG9hdCBGb28gJiBubyBjYXB0aW9uOiAgICAgICAgRm9vCislIEBmbG9hdCAsbGJsICYgQ2FwdGlvbntDYXB9OiAgICAgMS4xOiBDYXAKKyUgQGZsb2F0ICxsYmwgJiBubyBjYXB0aW9uOiAgICAgICAxLjEKKyUgQGZsb2F0ICYgQGNhcHRpb257Q2FwfTogICAgICAgICBDYXAKKyUgQGZsb2F0ICYgbm8gY2FwdGlvbjoKKyUKK1xkZWZcRWZsb2F0eyUKKyAgICBcbGV0XGZsb2F0aWRlbnQgPSBcZW1wdHkKKyAgICAlCisgICAgJSBJbiBhbGwgY2FzZXMsIGlmIHdlIGhhdmUgYSBmbG9hdCB0eXBlLCBpdCBjb21lcyBmaXJzdC4KKyAgICBcaWZ4XGZsb2F0dHlwZVxlbXB0eSBcZWxzZSBcZGVmXGZsb2F0aWRlbnR7XGZsb2F0dHlwZX1cZmkKKyAgICAlCisgICAgJSBJZiB3ZSBoYXZlIGFuIHhyZWYgbGFiZWwsIHRoZSBudW1iZXIgY29tZXMgbmV4dC4KKyAgICBcaWZ4XGZsb2F0bGFiZWxcZW1wdHkgXGVsc2UKKyAgICAgIFxpZnhcZmxvYXR0eXBlXGVtcHR5IFxlbHNlICUgaWYgYWxzbyBoYWQgZmxvYXQgdHlwZSwgbmVlZCB0aWUgZmlyc3QuCisgICAgICAgIFxhcHBlbmR0b21hY3JvXGZsb2F0aWRlbnR7XHRpZX0lCisgICAgICBcZmkKKyAgICAgICUgdGhlIG51bWJlci4KKyAgICAgIFxhcHBlbmR0b21hY3JvXGZsb2F0aWRlbnR7XGNoYXBsZXZlbHByZWZpeFx0aGVcZmxvYXRub30lCisgICAgXGZpCisgICAgJQorICAgICUgU3RhcnQgdGhlIHByaW50ZWQgY2FwdGlvbiB3aXRoIHdoYXQgd2UndmUgY29uc3RydWN0ZWQgaW4KKyAgICAlIFxmbG9hdGlkZW50LCBidXQga2VlcCBpdCBzZXBhcmF0ZTsgd2UgbmVlZCBcZmxvYXRpZGVudCBhZ2Fpbi4KKyAgICBcbGV0XGNhcHRpb25saW5lID0gXGZsb2F0aWRlbnQKKyAgICAlCisgICAgXGlmeFx0aGlzY2FwdGlvblxlbXB0eSBcZWxzZQorICAgICAgXGlmeFxmbG9hdGlkZW50XGVtcHR5IFxlbHNlCisJXGFwcGVuZHRvbWFjcm9cY2FwdGlvbmxpbmV7OiB9JSBoYWQgaWRlbnQsIHNvIG5lZWQgYSBjb2xvbiBiZXR3ZWVuCisgICAgICBcZmkKKyAgICAgICUKKyAgICAgICUgY2FwdGlvbiB0ZXh0LgorICAgICAgXGFwcGVuZHRvbWFjcm9cY2FwdGlvbmxpbmV7XHNjYW5leHBcdGhpc2NhcHRpb259JQorICAgIFxmaQorICAgICUKKyAgICAlIElmIHdlIGhhdmUgYW55dGhpbmcgdG8gcHJpbnQsIHByaW50IGl0LCB3aXRoIHNwYWNlIGJlZm9yZS4KKyAgICAlIEV2ZW50dWFsbHkgdGhpcyBuZWVkcyB0byBiZWNvbWUgYW4gXGluc2VydC4KKyAgICBcaWZ4XGNhcHRpb25saW5lXGVtcHR5IFxlbHNlCisgICAgICBcdnNraXAuNVxwYXJza2lwCisgICAgICBcY2FwdGlvbmxpbmUKKyAgICAgICUKKyAgICAgICUgU3BhY2UgYmVsb3cgY2FwdGlvbi4KKyAgICAgIFx2c2tpcFxwYXJza2lwCisgICAgXGZpCisgICAgJQorICAgICUgSWYgaGF2ZSBhbiB4cmVmIGxhYmVsLCB3cml0ZSB0aGUgbGlzdCBvZiBmbG9hdHMgaW5mby4gIERvIHRoaXMKKyAgICAlIGFmdGVyIHRoZSBjYXB0aW9uLCB0byBhdm9pZCBjaGFuY2Ugb2YgaXQgYmVpbmcgYSBicmVha3BvaW50LgorICAgIFxpZnhcZmxvYXRsYWJlbFxlbXB0eSBcZWxzZQorICAgICAgJSBXcml0ZSB0aGUgdGV4dCB0aGF0IGdvZXMgaW4gdGhlIGxvZiB0byB0aGUgYXV4IGZpbGUgYXMKKyAgICAgICUgXGZsb2F0bGFiZWwtbG9mLiAgQmVzaWRlcyBcZmxvYXRpZGVudCwgd2UgaW5jbHVkZSB0aGUgc2hvcnQKKyAgICAgICUgY2FwdGlvbiBpZiBzcGVjaWZpZWQsIGVsc2UgdGhlIGZ1bGwgY2FwdGlvbiBpZiBzcGVjaWZpZWQsIGVsc2Ugbm90aGluZy4KKyAgICAgIHslCisgICAgICAgIFxhdGR1bW1pZXMKKyAgICAgICAgJQorICAgICAgICAlIHNpbmNlIHdlIHJlYWQgdGhlIGNhcHRpb24gdGV4dCBpbiB0aGUgbWFjcm8gd29ybGQsIHdoZXJlIF5eTQorICAgICAgICAlIGlzIHR1cm5lZCBpbnRvIGEgbm9ybWFsIGNoYXJhY3Rlciwgd2UgaGF2ZSB0byBzY2FuIGl0IGJhY2ssIHNvCisgICAgICAgICUgd2UgZG9uJ3Qgd3JpdGUgdGhlIGxpdGVyYWwgdGhyZWUgY2hhcmFjdGVycyAiXl5NIiBpbnRvIHRoZSBhdXggZmlsZS4KKwlcc2NhbmV4cHslCisJICBceGRlZlxub2V4cGFuZFxndGVtcHslCisJICAgIFxpZnhcdGhpc3Nob3J0Y2FwdGlvblxlbXB0eQorCSAgICAgIFx0aGlzY2FwdGlvbgorCSAgICBcZWxzZQorCSAgICAgIFx0aGlzc2hvcnRjYXB0aW9uCisJICAgIFxmaQorCSAgfSUKKwl9JQorICAgICAgICBcaW1tZWRpYXRlXHdyaXRlXGF1eGZpbGV7QHhyZGVme1xmbG9hdGxhYmVsLWxvZn17XGZsb2F0aWRlbnQKKwkgIFxpZnhcZ3RlbXBcZW1wdHkgXGVsc2UgOiBcZ3RlbXAgXGZpfX0lCisgICAgICB9JQorICAgIFxmaQorICBcZWdyb3VwICAlIGVuZCBvZiBcdnRvcAorICAlCisgICUgcGxhY2UgdGhlIGNhcHR1cmVkIGluc2VydHMKKyAgJQorICAlIEJFV0FSRTogd2hlbiB0aGUgZmxvYXRzIHN0YXJ0IGZsb2F0aW5nLCB3ZSBoYXZlIHRvIGlzc3VlIHdhcm5pbmcKKyAgJSB3aGVuZXZlciBhbiBpbnNlcnQgYXBwZWFycyBpbnNpZGUgYSBmbG9hdCB3aGljaCBjb3VsZCBwb3NzaWJseQorICAlIGZsb2F0LiAtLWthc2FsLCAyNm1heTA0CisgICUKKyAgXGNoZWNraW5zZXJ0cworfQorCislIEFwcGVuZCB0aGUgdG9rZW5zICMyIHRvIHRoZSBkZWZpbml0aW9uIG9mIG1hY3JvICMxLCBub3QgZXhwYW5kaW5nIGVpdGhlci4KKyUKK1xkZWZcYXBwZW5kdG9tYWNybyMxIzJ7JQorICBcZXhwYW5kYWZ0ZXJcZGVmXGV4cGFuZGFmdGVyIzFcZXhwYW5kYWZ0ZXJ7IzEjMn0lCit9CisKKyUgQGNhcHRpb24sIEBzaG9ydGNhcHRpb24KKyUKK1xkZWZcY2FwdGlvbntcZG9jYXB0aW9uXHRoaXNjYXB0aW9ufQorXGRlZlxzaG9ydGNhcHRpb257XGRvY2FwdGlvblx0aGlzc2hvcnRjYXB0aW9ufQorXGRlZlxkb2NhcHRpb257XGNoZWNrZW52XGZsb2F0IFxiZ3JvdXBcc2NhbmFyZ2N0eHRcZGVmY2FwdGlvbn0KK1xkZWZcZGVmY2FwdGlvbiMxIzJ7XGVncm91cCBcZGVmIzF7IzJ9fQorCislIFRoZSBwYXJhbWV0ZXIgaXMgdGhlIGNvbnRyb2wgc2VxdWVuY2UgaWRlbnRpZnlpbmcgdGhlIGNvdW50ZXIgd2UgYXJlCislIGdvaW5nIHRvIHVzZS4gIENyZWF0ZSBpdCBpZiBpdCBkb2Vzbid0IGV4aXN0IGFuZCBhc3NpZ24gaXQgdG8gXGZsb2F0bm8uCitcZGVmXGdldGZsb2F0bm8jMXslCisgIFxpZngjMVxyZWxheAorICAgICAgJSBIYXZlbid0IHNlZW4gdGhpcyBmaWd1cmUgdHlwZSBiZWZvcmUuCisgICAgICBcY3NuYW1lIG5ld2NvdW50XGVuZGNzbmFtZSAjMSUKKyAgICAgICUKKyAgICAgICUgUmVtZW1iZXIgdG8gcmVzZXQgdGhpcyBmbG9hdG5vIGF0IHRoZSBuZXh0IGNoYXAuCisgICAgICBcZXhwYW5kYWZ0ZXJcZ2RlZlxleHBhbmRhZnRlclxyZXNldGFsbGZsb2F0bm9zCisgICAgICAgIFxleHBhbmRhZnRlcntccmVzZXRhbGxmbG9hdG5vcyAjMT0wIH0lCisgIFxmaQorICBcbGV0XGZsb2F0bm8jMSUKK30KKworJSBcc2V0cmVmIGNhbGxzIHRoaXMgdG8gZ2V0IHRoZSBYUkVGTEFCRUwtc250IHZhbHVlLiAgV2Ugd2FudCBhbiBAeHJlZgorJSB0byB0aGUgRkxPQVRMQUJFTCB0byBleHBhbmQgdG8gIkZpZ3VyZSAzLjEiLiAgV2UgY2FsbCBcc2V0cmVmIHdoZW4gd2UKKyUgZmlyc3QgcmVhZCB0aGUgQGZsb2F0IGNvbW1hbmQuCislCitcZGVmXFlmbG9hdHtcZmxvYXR0eXBlQHRpZSBcY2hhcGxldmVscHJlZml4XHRoZVxmbG9hdG5vfSUKKworJSBNYWdpYyBzdHJpbmcgdXNlZCBmb3IgdGhlIFhSRUZMQUJFTC10aXRsZSB2YWx1ZSwgc28gXHhyZWZYIGNhbgorJSBkaXN0aW5ndWlzaCBmbG9hdHMgZnJvbSBvdGhlciB4cmVmIHR5cGVzLgorXGRlZlxmbG9hdG1hZ2ljeyEhZmxvYXQhIX0KKworJSAjMSBpcyB0aGUgY29udHJvbCBzZXF1ZW5jZSB3ZSBhcmUgcGFzc2VkOyB3ZSBleHBhbmQgaW50byBhIGNvbmRpdGlvbmFsCislIHdoaWNoIGlzIHRydWUgaWYgIzEgcmVwcmVzZW50cyBhIGZsb2F0IHJlZi4gIFRoYXQgaXMsIHRoZSBtYWdpYworJSBcdGhpc3NlY3Rpb24gdmFsdWUgd2hpY2ggd2UgXHNldHJlZiBhYm92ZS4KKyUKK1xkZWZcaWZmbG9hdCMxe1xleHBhbmRhZnRlclxkb2lmZmxvYXQjMT09XGZpbmlzaH0KKyUKKyUgIzEgaXMgKG1heWJlKSB0aGUgXGZsb2F0bWFnaWMgc3RyaW5nLiAgSWYgc28sICMyIHdpbGwgYmUgdGhlCislIChzYWZlKSBmbG9hdCB0eXBlIGZvciB0aGlzIGZsb2F0LiAgV2Ugc2V0IFxpZmZsb2F0dHlwZSB0byAjMi4KKyUKK1xkZWZcZG9pZmZsb2F0IzE9IzI9IzNcZmluaXNoeyUKKyAgXGRlZlx0ZW1weyMxfSUKKyAgXGRlZlxpZmZsb2F0dHlwZXsjMn0lCisgIFxpZnhcdGVtcFxmbG9hdG1hZ2ljCit9CisKKyUgQGxpc3RvZmZsb2F0cyBGTE9BVFRZUEUgLSBwcmludCBhIGxpc3Qgb2YgZmxvYXRzIGxpa2UgYSB0YWJsZSBvZiBjb250ZW50cy4KKyUKK1xwYXJzZWFyZ2RlZlxsaXN0b2ZmbG9hdHN7JQorICBcZGVmXGZsb2F0dHlwZXsjMX0lIGZsb2F0dHlwZQorICB7JQorICAgICUgdGhlIGZsb2F0dHlwZSBtaWdodCBoYXZlIGFjY2VudHMgb3Igb3RoZXIgc3BlY2lhbCBjaGFyYWN0ZXJzLAorICAgICUgYnV0IHdlIG5lZWQgdG8gdXNlIGl0IGluIGEgY29udHJvbCBzZXF1ZW5jZSBuYW1lLgorICAgIFxpbmRleG5vZm9udHMKKyAgICBcdHVybm9mZmFjdGl2ZQorICAgIFx4ZGVmXHNhZmVmbG9hdHR5cGV7XGZsb2F0dHlwZX0lCisgIH0lCisgICUKKyAgJSBceHJkZWYgc2F2ZXMgdGhlIGZsb2F0cyBhcyBhIFxkby1saXN0IGluIFxmbG9hdGxpc3RTQUZFRkxPQVRUWVBFLgorICBcZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSBmbG9hdGxpc3Rcc2FmZWZsb2F0dHlwZVxlbmRjc25hbWUgXHJlbGF4CisgICAgXGlmaGF2ZXhyZWZzCisgICAgICAlIGlmIHRoZSB1c2VyIHNhaWQgQGxpc3RvZmZsb2F0cyBmb28gYnV0IG5ldmVyIEBmbG9hdCBmb28uCisgICAgICBcbWVzc2FnZXtcbGluZW51bWJlciBObyBgXHNhZmVmbG9hdHR5cGUnIGZsb2F0cyB0byBsaXN0Ln0lCisgICAgXGZpCisgIFxlbHNlCisgICAgXGJlZ2luZ3JvdXAKKyAgICAgIFxsZWZ0c2tpcD1cdG9jaW5kZW50ICAlIGluZGVudCB0aGVzZSBlbnRyaWVzIGxpa2UgYSB0b2MKKyAgICAgIFxsZXRcZG89XGxpc3RvZmZsb2F0c2RvCisgICAgICBcY3NuYW1lIGZsb2F0bGlzdFxzYWZlZmxvYXR0eXBlXGVuZGNzbmFtZQorICAgIFxlbmRncm91cAorICBcZmkKK30KKworJSBUaGlzIGlzIGNhbGxlZCBvbiBlYWNoIGVudHJ5IGluIGEgbGlzdCBvZiBmbG9hdHMuICBXZSdyZSBwYXNzZWQgdGhlCislIHhyZWYgbGFiZWwsIGluIHRoZSBmb3JtIExBQkVMLXRpdGxlLCB3aGljaCBpcyBob3cgd2Ugc2F2ZSBpdCBpbiB0aGUKKyUgYXV4IGZpbGUuICBXZSBzdHJpcCBvZmYgdGhlIC10aXRsZSBhbmQgbG9vayB1cCBcWFJMQUJFTC1sb2YsIHdoaWNoCislIGhhcyB0aGUgdGV4dCB3ZSdyZSBzdXBwb3NlZCB0byB0eXBlc2V0IGhlcmUuCislCislIEZpZ3VyZXMgd2l0aG91dCB4cmVmIGxhYmVscyB3aWxsIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgbGlzdCAoc2luY2UKKyUgdGhleSB3b24ndCBhcHBlYXIgaW4gdGhlIGF1eCBmaWxlKS4KKyUKK1xkZWZcbGlzdG9mZmxvYXRzZG8jMXtcbGlzdG9mZmxvYXRzZG9lbnRyeSMxXGZpbmlzaH0KK1xkZWZcbGlzdG9mZmxvYXRzZG9lbnRyeSMxLXRpdGxlXGZpbmlzaHt7JQorICAlIENhbid0IGZ1bGx5IGV4cGFuZCBYUiMxLWxvZiBiZWNhdXNlIGl0IGNhbiBjb250YWluIGFueXRoaW5nLiAgSnVzdAorICAlIHBhc3MgdGhlIGNvbnRyb2wgc2VxdWVuY2UuICBPbiB0aGUgb3RoZXIgaGFuZCwgWFIjMS1wZyBpcyBqdXN0IHRoZQorICAlIHBhZ2UgbnVtYmVyLCBhbmQgd2Ugd2FudCB0byBmdWxseSBleHBhbmQgdGhhdCBzbyB3ZSBjYW4gZ2V0IGEgbGluaworICAlIGluIHBkZiBvdXRwdXQuCisgIFx0b2tzQSA9IFxleHBhbmRhZnRlcntcY3NuYW1lIFhSIzEtbG9mXGVuZGNzbmFtZX0lCisgICUKKyAgJSB1c2UgdGhlIHNhbWUgXGVudHJ5IG1hY3JvIHdlIHVzZSB0byBnZW5lcmF0ZSB0aGUgVE9DIGFuZCBpbmRleC4KKyAgXGVkZWZcd3JpdGVlbnRyeXtcbm9leHBhbmRcZW50cnl7XHRoZVx0b2tzQX17XGNzbmFtZSBYUiMxLXBnXGVuZGNzbmFtZX19JQorICBcd3JpdGVlbnRyeQorfX0KKworXG1lc3NhZ2V7bG9jYWxpemF0aW9uLH0KKyUgYW5kIGkxOG4uCisKKyUgQGRvY3VtZW50bGFuZ3VhZ2UgaXMgdXN1YWxseSBnaXZlbiB2ZXJ5IGVhcmx5LCBqdXN0IGFmdGVyCislIEBzZXRmaWxlbmFtZS4gIElmIGRvbmUgdG9vIGxhdGUsIGl0IG1heSBub3Qgb3ZlcnJpZGUgZXZlcnl0aGluZworJSBwcm9wZXJseS4gIFNpbmdsZSBhcmd1bWVudCBpcyB0aGUgbGFuZ3VhZ2UgYWJicmV2aWF0aW9uLgorJSBJdCB3b3VsZCBiZSBuaWNlIGlmIHdlIGNvdWxkIHNldCB1cCBhIGh5cGhlbmF0aW9uIGZpbGUgaGVyZS4KKyUKK1xwYXJzZWFyZ2RlZlxkb2N1bWVudGxhbmd1YWdleyUKKyAgXHRleCAlIHJlYWQgdHhpLT8/LnRleCBmaWxlIGluIHBsYWluIFRlWC4KKyAgICAlIFJlYWQgdGhlIGZpbGUgaWYgaXQgZXhpc3RzLgorICAgIFxvcGVuaW4gMSB0eGktIzEudGV4CisgICAgXGlmZW9mIDEKKyAgICAgIFxlcnJoZWxwID0gXG5vbGFuZ2hlbHAKKyAgICAgIFxlcnJtZXNzYWdle0Nhbm5vdCByZWFkIGxhbmd1YWdlIGZpbGUgdHhpLSMxLnRleH0lCisgICAgXGVsc2UKKyAgICAgIFxpbnB1dCB0eGktIzEudGV4CisgICAgXGZpCisgICAgXGNsb3NlaW4gMQorICBcZW5kZ3JvdXAKK30KK1xuZXdoZWxwXG5vbGFuZ2hlbHB7VGhlIGdpdmVuIGxhbmd1YWdlIGRlZmluaXRpb24gZmlsZSBjYW5ub3QgYmUgZm91bmQgb3IKK2lzIGVtcHR5LiAgTWF5YmUgeW91IG5lZWQgdG8gaW5zdGFsbCBpdD8gIEluIHRoZSBjdXJyZW50IGRpcmVjdG9yeQorc2hvdWxkIHdvcmsgaWYgbm93aGVyZSBlbHNlIGRvZXMufQorCisKKyUgQGRvY3VtZW50ZW5jb2Rpbmcgc2hvdWxkIGNoYW5nZSBzb21ldGhpbmcgaW4gVGVYIGV2ZW50dWFsbHksIG1vc3QKKyUgbGlrZWx5LCBidXQgZm9yIG5vdyBqdXN0IHJlY29nbml6ZSBpdC4KK1xsZXRcZG9jdW1lbnRlbmNvZGluZyA9IFxjb21tZW50CisKKworJSBQYWdlIHNpemUgcGFyYW1ldGVycy4KKyUKK1xuZXdkaW1lblxkZWZhdWx0cGFyaW5kZW50IFxkZWZhdWx0cGFyaW5kZW50ID0gMTVwdAorCitcY2hhcGhlYWRpbmdza2lwID0gMTVwdCBwbHVzIDRwdCBtaW51cyAycHQKK1xzZWNoZWFkaW5nc2tpcCA9IDEycHQgcGx1cyAzcHQgbWludXMgMnB0Citcc3Vic2VjaGVhZGluZ3NraXAgPSA5cHQgcGx1cyAycHQgbWludXMgMnB0CisKKyUgUHJldmVudCB1bmRlcmZ1bGwgdmJveCBlcnJvciBtZXNzYWdlcy4KK1x2YmFkbmVzcyA9IDEwMDAwCisKKyUgRG9uJ3QgYmUgc28gZmluaWNreSBhYm91dCB1bmRlcmZ1bGwgaGJveGVzLCBlaXRoZXIuCitcaGJhZG5lc3MgPSAyMDAwCisKKyUgRm9sbG93aW5nIEdlb3JnZSBCdXNoLCBqdXN0IGdldCByaWQgb2Ygd2lkb3dzIGFuZCBvcnBoYW5zLgorXHdpZG93cGVuYWx0eT0xMDAwMAorXGNsdWJwZW5hbHR5PTEwMDAwCisKKyUgVXNlIFRlWCAzLjAncyBcZW1lcmdlbmN5c3RyZXRjaCB0byBoZWxwIGxpbmUgYnJlYWtpbmcsIGJ1dCBpZiB3ZSdyZQorJSB1c2luZyBhbiBvbGQgdmVyc2lvbiBvZiBUZVgsIGRvbid0IGRvIGFueXRoaW5nLiAgV2Ugd2FudCB0aGUgYW1vdW50IG9mCislIHN0cmV0Y2ggYWRkZWQgdG8gZGVwZW5kIG9uIHRoZSBsaW5lIGxlbmd0aCwgaGVuY2UgdGhlIGRlcGVuZGVuY2Ugb24KKyUgXGhzaXplLiAgV2UgY2FsbCB0aGlzIHdoZW5ldmVyIHRoZSBwYXBlciBzaXplIGlzIHNldC4KKyUKK1xkZWZcc2V0ZW1lcmdlbmN5c3RyZXRjaHslCisgIFxpZnhcZW1lcmdlbmN5c3RyZXRjaFx0aGlzaXN1bmRlZmluZWQKKyAgICAlIEFsbG93IHVzIHRvIGFzc2lnbiB0byBcZW1lcmdlbmN5c3RyZXRjaCBhbnl3YXkuCisgICAgXGRlZlxlbWVyZ2VuY3lzdHJldGNoe1xkaW1lbjB9JQorICBcZWxzZQorICAgIFxlbWVyZ2VuY3lzdHJldGNoID0gLjE1XGhzaXplCisgIFxmaQorfQorCislIFBhcmFtZXRlcnMgaW4gb3JkZXI6IDEpIHRleHRoZWlnaHQ7IDIpIHRleHR3aWR0aDsKKyUgMykgdm9mZnNldDsgNCkgaG9mZnNldDsgNSkgYmluZGluZyBvZmZzZXQ7IDYpIHRvcHNraXA7CislIDcpIHBoeXNpY2FsIHBhZ2UgaGVpZ2h0OyA4KSBwaHlzaWNhbCBwYWdlIHdpZHRoLgorJQorJSBXZSBhbHNvIGNhbGwgXHNldGxlYWRpbmd7XHRleHRsZWFkaW5nfSwgc28gdGhlIGNhbGxlciBzaG91bGQgZGVmaW5lCislIFx0ZXh0bGVhZGluZy4gIFRoZSBjYWxsZXIgc2hvdWxkIGFsc28gc2V0IFxwYXJza2lwLgorJQorXGRlZlxpbnRlcm5hbHBhZ2VzaXplcyMxIzIjMyM0IzUjNiM3Izh7JQorICBcdm9mZnNldCA9ICMzXHJlbGF4CisgIFx0b3Bza2lwID0gIzZccmVsYXgKKyAgXHNwbGl0dG9wc2tpcCA9IFx0b3Bza2lwCisgICUKKyAgXHZzaXplID0gIzFccmVsYXgKKyAgXGFkdmFuY2VcdnNpemUgYnkgXHRvcHNraXAKKyAgXG91dGVydnNpemUgPSBcdnNpemUKKyAgXGFkdmFuY2Vcb3V0ZXJ2c2l6ZSBieSAyXHRvcGFuZGJvdHRvbW1hcmdpbgorICBccGFnZWhlaWdodCA9IFx2c2l6ZQorICAlCisgIFxoc2l6ZSA9ICMyXHJlbGF4CisgIFxvdXRlcmhzaXplID0gXGhzaXplCisgIFxhZHZhbmNlXG91dGVyaHNpemUgYnkgMC41aW4KKyAgXHBhZ2V3aWR0aCA9IFxoc2l6ZQorICAlCisgIFxub3JtYWxvZmZzZXQgPSAjNFxyZWxheAorICBcYmluZGluZ29mZnNldCA9ICM1XHJlbGF4CisgICUKKyAgXGlmcGRmCisgICAgXHBkZnBhZ2VoZWlnaHQgIzdccmVsYXgKKyAgICBccGRmcGFnZXdpZHRoICM4XHJlbGF4CisgIFxmaQorICAlCisgIFxzZXRsZWFkaW5ne1x0ZXh0bGVhZGluZ30KKyAgJQorICBccGFyaW5kZW50ID0gXGRlZmF1bHRwYXJpbmRlbnQKKyAgXHNldGVtZXJnZW5jeXN0cmV0Y2gKK30KKworJSBAbGV0dGVycGFwZXIgKHRoZSBkZWZhdWx0KS4KK1xkZWZcbGV0dGVycGFwZXJ7e1xnbG9iYWxkZWZzID0gMQorICBccGFyc2tpcCA9IDNwdCBwbHVzIDJwdCBtaW51cyAxcHQKKyAgXHRleHRsZWFkaW5nID0gMTMuMnB0CisgICUKKyAgJSBJZiBwYWdlIGlzIG5vdGhpbmcgYnV0IHRleHQsIG1ha2UgaXQgY29tZSBvdXQgZXZlbi4KKyAgXGludGVybmFscGFnZXNpemVzezQ2XGJhc2VsaW5lc2tpcH17NmlufSUKKyAgICAgICAgICAgICAgICAgICAge1x2b2Zmc2V0fXsuMjVpbn0lCisgICAgICAgICAgICAgICAgICAgIHtcYmluZGluZ29mZnNldH17MzZwdH0lCisgICAgICAgICAgICAgICAgICAgIHsxMWlufXs4LjVpbn0lCit9fQorCislIFVzZSBAc21hbGxib29rIHRvIHJlc2V0IHBhcmFtZXRlcnMgZm9yIDd4OS4yNSB0cmltIHNpemUuCitcZGVmXHNtYWxsYm9va3t7XGdsb2JhbGRlZnMgPSAxCisgIFxwYXJza2lwID0gMnB0IHBsdXMgMXB0CisgIFx0ZXh0bGVhZGluZyA9IDEycHQKKyAgJQorICBcaW50ZXJuYWxwYWdlc2l6ZXN7Ny41aW59ezVpbn0lCisgICAgICAgICAgICAgICAgICAgIHtcdm9mZnNldH17LjI1aW59JQorICAgICAgICAgICAgICAgICAgICB7XGJpbmRpbmdvZmZzZXR9ezE2cHR9JQorICAgICAgICAgICAgICAgICAgICB7OS4yNWlufXs3aW59JQorICAlCisgIFxsaXNwbmFycm93aW5nID0gMC4zaW4KKyAgXHRvbGVyYW5jZSA9IDcwMAorICBcaGZ1enogPSAxcHQKKyAgXGNvbnRlbnRzcmlnaHRtYXJnaW4gPSAwcHQKKyAgXGRlZmJvZHlpbmRlbnQgPSAuNWNtCit9fQorCislIFVzZSBAc21hbGxlcmJvb2sgdG8gcmVzZXQgcGFyYW1ldGVycyBmb3IgNng5IHRyaW0gc2l6ZS4KKyUgKEp1c3QgdGVzdGluZywgcGFyYW1ldGVycyBzdGlsbCBpbiBmbHV4LikKK1xkZWZcc21hbGxlcmJvb2t7e1xnbG9iYWxkZWZzID0gMQorICBccGFyc2tpcCA9IDEuNXB0IHBsdXMgMXB0CisgIFx0ZXh0bGVhZGluZyA9IDEycHQKKyAgJQorICBcaW50ZXJuYWxwYWdlc2l6ZXN7Ny40aW59ezQuOGlufSUKKyAgICAgICAgICAgICAgICAgICAgey0uMmlufXstLjRpbn0lCisgICAgICAgICAgICAgICAgICAgIHswcHR9ezE0cHR9JQorICAgICAgICAgICAgICAgICAgICB7OWlufXs2aW59JQorICAlCisgIFxsaXNwbmFycm93aW5nID0gMC4yNWluCisgIFx0b2xlcmFuY2UgPSA3MDAKKyAgXGhmdXp6ID0gMXB0CisgIFxjb250ZW50c3JpZ2h0bWFyZ2luID0gMHB0CisgIFxkZWZib2R5aW5kZW50ID0gLjRjbQorfX0KKworJSBVc2UgQGFmb3VycGFwZXIgdG8gcHJpbnQgb24gRXVyb3BlYW4gQTQgcGFwZXIuCitcZGVmXGFmb3VycGFwZXJ7e1xnbG9iYWxkZWZzID0gMQorICBccGFyc2tpcCA9IDNwdCBwbHVzIDJwdCBtaW51cyAxcHQKKyAgXHRleHRsZWFkaW5nID0gMTMuMnB0CisgICUKKyAgJSBEb3VibGUtc2lkZSBwcmludGluZyB2aWEgcG9zdHNjcmlwdCBvbiBMYXNlcmpldCA0MDUwCisgICUgcHJpbnRzIGRvdWJsZS1zaWRlZCBuaWNlbHkgd2hlbiBcYmluZGluZ29mZnNldD0xMG1tIGFuZCBcaG9mZnNldD0tNm1tLgorICAlIFRvIGNoYW5nZSB0aGUgc2V0dGluZ3MgZm9yIGEgZGlmZmVyZW50IHByaW50ZXIgb3Igc2l0dWF0aW9uLCBhZGp1c3QKKyAgJSBcbm9ybWFsb2Zmc2V0IHVudGlsIHRoZSBmcm9udC1zaWRlIGFuZCBiYWNrLXNpZGUgdGV4dHMgYWxpZ24uICBUaGVuCisgICUgZG8gdGhlIHNhbWUgZm9yIFxiaW5kaW5nb2Zmc2V0LiAgWW91IGNhbiBzZXQgdGhlc2UgZm9yIHRlc3RpbmcgaW4KKyAgJSB5b3VyIHRleGluZm8gc291cmNlIGZpbGUgbGlrZSB0aGlzOgorICAlIEB0ZXgKKyAgJSBcZ2xvYmFsXG5vcm1hbG9mZnNldCA9IC02bW0KKyAgJSBcZ2xvYmFsXGJpbmRpbmdvZmZzZXQgPSAxMG1tCisgICUgQGVuZCB0ZXgKKyAgXGludGVybmFscGFnZXNpemVzezUxXGJhc2VsaW5lc2tpcH17MTYwbW19CisgICAgICAgICAgICAgICAgICAgIHtcdm9mZnNldH17XGhvZmZzZXR9JQorICAgICAgICAgICAgICAgICAgICB7XGJpbmRpbmdvZmZzZXR9ezQ0cHR9JQorICAgICAgICAgICAgICAgICAgICB7Mjk3bW19ezIxMG1tfSUKKyAgJQorICBcdG9sZXJhbmNlID0gNzAwCisgIFxoZnV6eiA9IDFwdAorICBcY29udGVudHNyaWdodG1hcmdpbiA9IDBwdAorICBcZGVmYm9keWluZGVudCA9IDVtbQorfX0KKworJSBVc2UgQGFmaXZlcGFwZXIgdG8gcHJpbnQgb24gRXVyb3BlYW4gQTUgcGFwZXIuCislIEZyb20gcm9taWxkb0B1cmFuby5pY2ViLnVmb3AuYnIsIDIgSnVseSAyMDAwLgorJSBIZSBhbHNvIHJlY29tbWVuZHMgbWFraW5nIEBleGFtcGxlIGFuZCBAbGlzcCBiZSBzbWFsbC4KK1xkZWZcYWZpdmVwYXBlcnt7XGdsb2JhbGRlZnMgPSAxCisgIFxwYXJza2lwID0gMnB0IHBsdXMgMXB0IG1pbnVzIDAuMXB0CisgIFx0ZXh0bGVhZGluZyA9IDEyLjVwdAorICAlCisgIFxpbnRlcm5hbHBhZ2VzaXplc3sxNjBtbX17MTIwbW19JQorICAgICAgICAgICAgICAgICAgICB7XHZvZmZzZXR9e1xob2Zmc2V0fSUKKyAgICAgICAgICAgICAgICAgICAge1xiaW5kaW5nb2Zmc2V0fXs4cHR9JQorICAgICAgICAgICAgICAgICAgICB7MjEwbW19ezE0OG1tfSUKKyAgJQorICBcbGlzcG5hcnJvd2luZyA9IDAuMmluCisgIFx0b2xlcmFuY2UgPSA4MDAKKyAgXGhmdXp6ID0gMS4ycHQKKyAgXGNvbnRlbnRzcmlnaHRtYXJnaW4gPSAwcHQKKyAgXGRlZmJvZHlpbmRlbnQgPSAybW0KKyAgXHRhYmxlaW5kZW50ID0gMTJtbQorfX0KKworJSBBIHNwZWNpZmljIHRleHQgbGF5b3V0LCAyNHgxNWNtIG92ZXJhbGwsIGludGVuZGVkIGZvciBBNCBwYXBlci4KK1xkZWZcYWZvdXJsYXRleHt7XGdsb2JhbGRlZnMgPSAxCisgIFxhZm91cnBhcGVyCisgIFxpbnRlcm5hbHBhZ2VzaXplc3syMzdtbX17MTUwbW19JQorICAgICAgICAgICAgICAgICAgICB7XHZvZmZzZXR9ezQuNm1tfSUKKyAgICAgICAgICAgICAgICAgICAge1xiaW5kaW5nb2Zmc2V0fXs3bW19JQorICAgICAgICAgICAgICAgICAgICB7Mjk3bW19ezIxMG1tfSUKKyAgJQorICAlIE11c3QgZXhwbGljaXRseSByZXNldCB0byAwIGJlY2F1c2Ugd2UgY2FsbCBcYWZvdXJwYXBlci4KKyAgXGdsb2JhbGRlZnMgPSAwCit9fQorCislIFVzZSBAYWZvdXJ3aWRlIHRvIHByaW50IG9uIEE0IHBhcGVyIGluIGxhbmRzY2FwZSBmb3JtYXQuCitcZGVmXGFmb3Vyd2lkZXt7XGdsb2JhbGRlZnMgPSAxCisgIFxhZm91cnBhcGVyCisgIFxpbnRlcm5hbHBhZ2VzaXplc3syNDFtbX17MTY1bW19JQorICAgICAgICAgICAgICAgICAgICB7XHZvZmZzZXR9ey0yLjk1bW19JQorICAgICAgICAgICAgICAgICAgICB7XGJpbmRpbmdvZmZzZXR9ezdtbX0lCisgICAgICAgICAgICAgICAgICAgIHsyOTdtbX17MjEwbW19JQorICBcZ2xvYmFsZGVmcyA9IDAKK319CisKKyUgQHBhZ2VzaXplcyBURVhUSEVJR0hUWyxURVhUV0lEVEhdCislIFBlcmhhcHMgd2Ugc2hvdWxkIGFsbG93IHNldHRpbmcgdGhlIG1hcmdpbnMsIFx0b3Bza2lwLCBccGFyc2tpcCwKKyUgYW5kL29yIGxlYWRpbmcsIGFsc28uIE9yIHBlcmhhcHMgd2Ugc2hvdWxkIGNvbXB1dGUgdGhlbSBzb21laG93LgorJQorXHBhcnNlYXJnZGVmXHBhZ2VzaXplc3tccGFnZXNpemVzeXl5ICMxLCxcZmluaXNofQorXGRlZlxwYWdlc2l6ZXN5eXkjMSwjMiwjM1xmaW5pc2h7eyUKKyAgXHNldGJveDAgPSBcaGJveHtcaWdub3Jlc3BhY2VzICMyfVxpZmRpbVx3ZDAgPiAwcHQgXGhzaXplPSMyXHJlbGF4IFxmaQorICBcZ2xvYmFsZGVmcyA9IDEKKyAgJQorICBccGFyc2tpcCA9IDNwdCBwbHVzIDJwdCBtaW51cyAxcHQKKyAgXHNldGxlYWRpbmd7XHRleHRsZWFkaW5nfSUKKyAgJQorICBcZGltZW4wID0gIzEKKyAgXGFkdmFuY2VcZGltZW4wIGJ5IFx2b2Zmc2V0CisgICUKKyAgXGRpbWVuMiA9IFxoc2l6ZQorICBcYWR2YW5jZVxkaW1lbjIgYnkgXG5vcm1hbG9mZnNldAorICAlCisgIFxpbnRlcm5hbHBhZ2VzaXplc3sjMX17XGhzaXplfSUKKyAgICAgICAgICAgICAgICAgICAge1x2b2Zmc2V0fXtcbm9ybWFsb2Zmc2V0fSUKKyAgICAgICAgICAgICAgICAgICAge1xiaW5kaW5nb2Zmc2V0fXs0NHB0fSUKKyAgICAgICAgICAgICAgICAgICAge1xkaW1lbjB9e1xkaW1lbjJ9JQorfX0KKworJSBTZXQgZGVmYXVsdCB0byBsZXR0ZXIuCislCitcbGV0dGVycGFwZXIKKworCitcbWVzc2FnZXthbmQgdHVybmluZyBvbiB0ZXhpbmZvIGlucHV0IGZvcm1hdC59CisKKyUgRGVmaW5lIG1hY3JvcyB0byBvdXRwdXQgdmFyaW91cyBjaGFyYWN0ZXJzIHdpdGggY2F0Y29kZSBmb3Igbm9ybWFsIHRleHQuCitcY2F0Y29kZWBcIj1cb3RoZXIKK1xjYXRjb2RlYFx+PVxvdGhlcgorXGNhdGNvZGVgXF49XG90aGVyCitcY2F0Y29kZWBcXz1cb3RoZXIKK1xjYXRjb2RlYFx8PVxvdGhlcgorXGNhdGNvZGVgXDw9XG90aGVyCitcY2F0Y29kZWBcPj1cb3RoZXIKK1xjYXRjb2RlYFwrPVxvdGhlcgorXGNhdGNvZGVgXCQ9XG90aGVyCitcZGVmXG5vcm1hbGRvdWJsZXF1b3RleyJ9CitcZGVmXG5vcm1hbHRpbGRle359CitcZGVmXG5vcm1hbGNhcmV0e159CitcZGVmXG5vcm1hbHVuZGVyc2NvcmV7X30KK1xkZWZcbm9ybWFsdmVydGljYWxiYXJ7fH0KK1xkZWZcbm9ybWFsbGVzc3s8fQorXGRlZlxub3JtYWxncmVhdGVyez59CitcZGVmXG5vcm1hbHBsdXN7K30KK1xkZWZcbm9ybWFsZG9sbGFyeyR9JSQgZm9udC1sb2NrIGZpeAorCislIFRoaXMgbWFjcm8gaXMgdXNlZCB0byBtYWtlIGEgY2hhcmFjdGVyIHByaW50IG9uZSB3YXkgaW4gXHR0CislICh3aGVyZSBpdCBjYW4gcHJvYmFibHkgYmUgb3V0cHV0IGFzLWlzKSwgYW5kIGFub3RoZXIgd2F5IGluIG90aGVyIGZvbnRzLAorJSB3aGVyZSBzb21ldGhpbmcgaGFpcmllciBwcm9iYWJseSBuZWVkcyB0byBiZSBkb25lLgorJQorJSAjMSBpcyB3aGF0IHRvIHByaW50IGlmIHdlIGFyZSBpbmRlZWQgdXNpbmcgXHR0OyAjMiBpcyB3aGF0IHRvIHByaW50CislIG90aGVyd2lzZS4gIFNpbmNlIGFsbCB0aGUgQ29tcHV0ZXIgTW9kZXJuIHR5cGV3cml0ZXIgZm9udHMgaGF2ZSB6ZXJvCislIGludGVyd29yZCBzdHJldGNoIChhbmQgc2hyaW5rKSwgYW5kIGl0IGlzIHJlYXNvbmFibGUgdG8gZXhwZWN0IGFsbAorJSB0eXBld3JpdGVyIGZvbnRzIHRvIGhhdmUgdGhpcywgd2UgY2FuIGNoZWNrIHRoYXQgZm9udCBwYXJhbWV0ZXIuCislCitcZGVmXGlmdXNpbmd0dCMxIzJ7XGlmZGltIFxmb250ZGltZW4zXGZvbnQ9MHB0ICMxXGVsc2UgIzJcZml9CisKKyUgU2FtZSBhcyBhYm92ZSwgYnV0IGNoZWNrIGZvciBpdGFsaWMgZm9udC4gIEFjdHVhbGx5IHRoaXMgYWxzbyBjYXRjaGVzCislIG5vbi1pdGFsaWMgc2xhbnRlZCBmb250cyBzaW5jZSBpdCBpcyBpbXBvc3NpYmxlIHRvIGRpc3Rpbmd1aXNoIHRoZW0gZnJvbQorJSBpdGFsaWMgZm9udHMuICBCdXQgc2luY2UgdGhpcyBpcyBvbmx5IHVzZWQgYnkgJCBhbmQgaXQgdXNlcyBcc2wgYW55d2F5CislIHRoaXMgaXMgbm90IGEgcHJvYmxlbS4KK1xkZWZcaWZ1c2luZ2l0IzEjMntcaWZkaW0gXGZvbnRkaW1lbjFcZm9udD4wcHQgIzFcZWxzZSAjMlxmaX0KKworJSBUdXJuIG9mZiBhbGwgc3BlY2lhbCBjaGFyYWN0ZXJzIGV4Y2VwdCBACislIChhbmQgdGhvc2Ugd2hpY2ggdGhlIHVzZXIgY2FuIHVzZSBhcyBpZiB0aGV5IHdlcmUgb3JkaW5hcnkpLgorJSBNb3N0IG9mIHRoZXNlIHdlIHNpbXBseSBwcmludCBmcm9tIHRoZSBcdHQgZm9udCwgYnV0IGZvciBzb21lLCB3ZSBjYW4KKyUgdXNlIG1hdGggb3Igb3RoZXIgdmFyaWFudHMgdGhhdCBsb29rIGJldHRlciBpbiBub3JtYWwgdGV4dC4KKworXGNhdGNvZGVgXCI9XGFjdGl2ZQorXGRlZlxhY3RpdmVkb3VibGVxdW90ZXt7XHR0XGNoYXIzNH19CitcbGV0Ij1cYWN0aXZlZG91YmxlcXVvdGUKK1xjYXRjb2RlYFx+PVxhY3RpdmUKK1xkZWZ+e3tcdHRcY2hhcjEyNn19CitcY2hhcmRlZlxoYXQ9YFxeCitcY2F0Y29kZWBcXj1cYWN0aXZlCitcZGVmXnt7XHR0IFxoYXR9fQorCitcY2F0Y29kZWBcXz1cYWN0aXZlCitcZGVmX3tcaWZ1c2luZ3R0XG5vcm1hbHVuZGVyc2NvcmVcX30KK1xsZXRccmVhbHVuZGVyPV8KKyUgU3Vicm91dGluZSBmb3IgdGhlIHByZXZpb3VzIG1hY3JvLgorXGRlZlxfe1xsZWF2ZXZtb2RlIFxrZXJuLjA3ZW0gXHZib3h7XGhydWxlIHdpZHRoLjNlbSBoZWlnaHQuMWV4fVxrZXJuIC4wN2VtIH0KKworXGNhdGNvZGVgXHw9XGFjdGl2ZQorXGRlZnx7e1x0dFxjaGFyMTI0fX0KK1xjaGFyZGVmIFxsZXNzPWBcPAorXGNhdGNvZGVgXDw9XGFjdGl2ZQorXGRlZjx7e1x0dCBcbGVzc319CitcY2hhcmRlZiBcZ3RyPWBcPgorXGNhdGNvZGVgXD49XGFjdGl2ZQorXGRlZj57e1x0dCBcZ3RyfX0KK1xjYXRjb2RlYFwrPVxhY3RpdmUKK1xkZWYre3tcdHQgXGNoYXIgNDN9fQorXGNhdGNvZGVgXCQ9XGFjdGl2ZQorXGRlZiR7XGlmdXNpbmdpdHt7XHNsXCR9fVxub3JtYWxkb2xsYXJ9JSQgZm9udC1sb2NrIGZpeAorCislIElmIGEgLmZtdCBmaWxlIGlzIGJlaW5nIHVzZWQsIGNoYXJhY3RlcnMgdGhhdCBtaWdodCBhcHBlYXIgaW4gYSBmaWxlCislIG5hbWUgY2Fubm90IGJlIGFjdGl2ZSB1bnRpbCB3ZSBoYXZlIHBhcnNlZCB0aGUgY29tbWFuZCBsaW5lLgorJSBTbyB0dXJuIHRoZW0gb2ZmIGFnYWluLCBhbmQgaGF2ZSBcZXZlcnlqb2IgKG9yIEBzZXRmaWxlbmFtZSkgdHVybiB0aGVtIG9uLgorJSBcb3RoZXJpZnlhY3RpdmUgaXMgY2FsbGVkIG5lYXIgdGhlIGVuZCBvZiB0aGlzIGZpbGUuCitcZGVmXG90aGVyaWZ5YWN0aXZle1xjYXRjb2RlYCs9XG90aGVyIFxjYXRjb2RlYFxfPVxvdGhlcn0KKworJSBVc2VkIHNvbWV0aW1lcyB0byB0dXJuIG9mZiAoZWZmZWN0aXZlbHkpIHRoZSBhY3RpdmUgY2hhcmFjdGVycyBldmVuIGFmdGVyCislIHBhcnNpbmcgdGhlbS4KK1xkZWZcdHVybm9mZmFjdGl2ZXslCisgIFxub3JtYWx0dXJub2ZmYWN0aXZlCisgIFxvdGhlcmJhY2tzbGFzaAorfQorCitcY2F0Y29kZWBcQD0wCisKKyUgXGJhY2tzbGFzaGN1cmZvbnQgb3V0cHV0cyBvbmUgYmFja3NsYXNoIGNoYXJhY3RlciBpbiBjdXJyZW50IGZvbnQsCislIGFzIGluIFxjaGFyYFxcLgorXGdsb2JhbFxjaGFyZGVmXGJhY2tzbGFzaGN1cmZvbnQ9YFxcCitcZ2xvYmFsXGxldFxyYXdiYWNrc2xhc2h4eD1cYmFja3NsYXNoY3VyZm9udCAgJSBsZXQgZXhpc3RpbmcgLj8/cyBmaWxlcyB3b3JrCisKKyUgXHJlYWxiYWNrc2xhc2ggaXMgYW4gYWN0dWFsIGNoYXJhY3RlciBgXCcgd2l0aCBjYXRjb2RlIG90aGVyLCBhbmQKKyUgXGRvdWJsZWJhY2tzbGFzaCBpcyB0d28gb2YgdGhlbSAoZm9yIHRoZSBwZGYgb3V0bGluZXMpLgore1xjYXRjb2RlYFxcPVxvdGhlciBAZ2RlZkByZWFsYmFja3NsYXNoe1x9IEBnZGVmQGRvdWJsZWJhY2tzbGFzaHtcXH19CisKKyUgSW4gdGV4aW5mbywgYmFja3NsYXNoIGlzIGFuIGFjdGl2ZSBjaGFyYWN0ZXI7IGl0IHByaW50cyB0aGUgYmFja3NsYXNoCislIGluIGZpeGVkIHdpZHRoIGZvbnQuCitcY2F0Y29kZWBcXD1cYWN0aXZlCitAZGVmQG5vcm1hbGJhY2tzbGFzaHt7QHR0QGJhY2tzbGFzaGN1cmZvbnR9fQorJSBPbiBzdGFydHVwLCBAZml4YmFja3NsYXNoIGFzc2lnbnM6CislICBAbGV0IFwgPSBAbm9ybWFsYmFja3NsYXNoCisKKyUgXHJhd2JhY2tzbGFzaCBkZWZpbmVzIGFuIGFjdGl2ZSBcIHRvIGRvIFxiYWNrc2xhc2hjdXJmb250LgorJSBcb3RoZXJiYWNrc2xhc2ggZGVmaW5lcyBhbiBhY3RpdmUgXCB0byBiZSBhIGxpdGVyYWwgYFwnIGNoYXJhY3RlciB3aXRoCislIGNhdGNvZGUgb3RoZXIuCitAZ2RlZkByYXdiYWNrc2xhc2h7QGxldFw9QGJhY2tzbGFzaGN1cmZvbnR9CitAZ2RlZkBvdGhlcmJhY2tzbGFzaHtAbGV0XD1AcmVhbGJhY2tzbGFzaH0KKworJSBTYW1lIGFzIEB0dXJub2ZmYWN0aXZlIGV4Y2VwdCBvdXRwdXRzIFwgYXMge1x0dFxjaGFyYFxcfSBpbnN0ZWFkIG9mCislIHRoZSBsaXRlcmFsIGNoYXJhY3RlciBgXCcuCislIAorQGRlZkBub3JtYWx0dXJub2ZmYWN0aXZleyUKKyAgQGxldFw9QG5vcm1hbGJhY2tzbGFzaAorICBAbGV0Ij1Abm9ybWFsZG91YmxlcXVvdGUKKyAgQGxldH49QG5vcm1hbHRpbGRlCisgIEBsZXRePUBub3JtYWxjYXJldAorICBAbGV0Xz1Abm9ybWFsdW5kZXJzY29yZQorICBAbGV0fD1Abm9ybWFsdmVydGljYWxiYXIKKyAgQGxldDw9QG5vcm1hbGxlc3MKKyAgQGxldD49QG5vcm1hbGdyZWF0ZXIKKyAgQGxldCs9QG5vcm1hbHBsdXMKKyAgQGxldCQ9QG5vcm1hbGRvbGxhciAlJCBmb250LWxvY2sgZml4CisgIEB1bnNlcHNwYWNlcworfQorCislIE1ha2UgXyBhbmQgKyBcb3RoZXIgY2hhcmFjdGVycywgdGVtcG9yYXJpbHkuCislIFRoaXMgaXMgY2FuY2VsZWQgYnkgQGZpeGJhY2tzbGFzaC4KK0BvdGhlcmlmeWFjdGl2ZQorCislIElmIGEgLmZtdCBmaWxlIGlzIGJlaW5nIHVzZWQsIHdlIGRvbid0IHdhbnQgdGhlIGBcaW5wdXQgdGV4aW5mbycgdG8gc2hvdyB1cC4KKyUgVGhhdCBpcyB3aGF0IFxlYXRpbnB1dCBpcyBmb3I7IGFmdGVyIHRoYXQsIHRoZSBgXCcgc2hvdWxkIHJldmVydCB0byBwcmludGluZworJSBhIGJhY2tzbGFzaC4KKyUKK0BnZGVmQGVhdGlucHV0IGlucHV0IHRleGluZm97QGZpeGJhY2tzbGFzaH0KK0BnbG9iYWxAbGV0XCA9IEBlYXRpbnB1dAorCislIE9uIHRoZSBvdGhlciBoYW5kLCBwZXJoYXBzIHRoZSBmaWxlIGRpZCBub3QgaGF2ZSBhIGBcaW5wdXQgdGV4aW5mbycuIFRoZW4KKyUgdGhlIGZpcnN0IGBcJyBpbiB0aGUgZmlsZSB3b3VsZCBjYXVzZSBhbiBlcnJvci4gVGhpcyBtYWNybyB0cmllcyB0byBmaXgKKyUgdGhhdCwgYXNzdW1pbmcgaXQgaXMgY2FsbGVkIGJlZm9yZSB0aGUgZmlyc3QgYFwnIGNvdWxkIHBsYXVzaWJseSBvY2N1ci4KKyUgQWxzbyB0dXJuIGJhY2sgb24gYWN0aXZlIGNoYXJhY3RlcnMgdGhhdCBtaWdodCBhcHBlYXIgaW4gdGhlIGlucHV0CislIGZpbGUgbmFtZSwgaW4gY2FzZSBub3QgdXNpbmcgYSBwcmUtZHVtcGVkIGZvcm1hdC4KKyUKK0BnZGVmQGZpeGJhY2tzbGFzaHslCisgIEBpZnhcQGVhdGlucHV0IEBsZXRcID0gQG5vcm1hbGJhY2tzbGFzaCBAZmkKKyAgQGNhdGNvZGVgKz1AYWN0aXZlCisgIEBjYXRjb2RlYEBfPUBhY3RpdmUKK30KKworJSBTYXkgQGZvbywgbm90IFxmb28sIGluIGVycm9yIG1lc3NhZ2VzLgorQGVzY2FwZWNoYXIgPSBgQEAKKworJSBUaGVzZSBsb29rIG9rIGluIGFsbCBmb250cywgc28ganVzdCBtYWtlIHRoZW0gbm90IHNwZWNpYWwuCitAY2F0Y29kZWBAJiA9IEBvdGhlcgorQGNhdGNvZGVgQCMgPSBAb3RoZXIKK0BjYXRjb2RlYEAlID0gQG90aGVyCisKKworQGMgTG9jYWwgdmFyaWFibGVzOgorQGMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQorQGMgcGFnZS1kZWxpbWl0ZXI6ICJeXFxcXG1lc3NhZ2UiCitAYyB0aW1lLXN0YW1wLXN0YXJ0OiAiZGVmXFxcXHRleGluZm92ZXJzaW9ueyIKK0BjIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZC4lMDJIIgorQGMgdGltZS1zdGFtcC1lbmQ6ICJ9IgorQGMgRW5kOgorCitAYyB2aW06c3c9MjoKKworQGlnbm9yZQorICAgYXJjaC10YWc6IGUxYjM2ZTMyLWM5NmUtNDEzNS1hNDFhLTBiMmVmYTJlYTExNQorQGVuZCBpZ25vcmUKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9kb2MvdmVyc2lvbi50ZXhpIGIvbGliZ2NyeXB0LTEuNC42L2RvYy92ZXJzaW9uLnRleGkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk0ZTRhYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9kb2MvdmVyc2lvbi50ZXhpCkBAIC0wLDAgKzEsNCBAQAorQHNldCBVUERBVEVEIDkgSnVseSAyMDA5CitAc2V0IFVQREFURUQtTU9OVEggSnVseSAyMDA5CitAc2V0IEVESVRJT04gMS40LjYKK0BzZXQgVkVSU0lPTiAxLjQuNgpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L2luc3RhbGwtc2ggYi9saWJnY3J5cHQtMS40LjYvaW5zdGFsbC1zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ZmJiYWU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L2luc3RhbGwtc2gKQEAgLTAsMCArMSw1MDcgQEAKKyMhL2Jpbi9zaAorIyBpbnN0YWxsIC0gaW5zdGFsbCBhIHByb2dyYW0sIHNjcmlwdCwgb3IgZGF0YWZpbGUKKworc2NyaXB0dmVyc2lvbj0yMDA2LTEwLTE0LjE1CisKKyMgVGhpcyBvcmlnaW5hdGVzIGZyb20gWDExUjUgKG1pdC91dGlsL3NjcmlwdHMvaW5zdGFsbC5zaCksIHdoaWNoIHdhcworIyBsYXRlciByZWxlYXNlZCBpbiBYMTFSNiAoeGMvY29uZmlnL3V0aWwvaW5zdGFsbC5zaCkgd2l0aCB0aGUKKyMgZm9sbG93aW5nIGNvcHlyaWdodCBhbmQgbGljZW5zZS4KKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk0IFggQ29uc29ydGl1bQorIworIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisjIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0bworIyBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZQorIyByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyMgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyMKKyMgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyMgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisjCisjIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisjIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisjIFggQ09OU09SVElVTSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyMgQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDLQorIyBUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorIworIyBFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiB0aGUgWCBDb25zb3J0aXVtIHNoYWxsIG5vdAorIyBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbC0KKyMgaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gdGhlIFggQ29uc29yLQorIyB0aXVtLgorIworIworIyBGU0YgY2hhbmdlcyB0byB0aGlzIGZpbGUgYXJlIGluIHRoZSBwdWJsaWMgZG9tYWluLgorIworIyBDYWxsaW5nIHRoaXMgc2NyaXB0IGluc3RhbGwtc2ggaXMgcHJlZmVycmVkIG92ZXIgaW5zdGFsbC5zaCwgdG8gcHJldmVudAorIyBgbWFrZScgaW1wbGljaXQgcnVsZXMgZnJvbSBjcmVhdGluZyBhIGZpbGUgY2FsbGVkIGluc3RhbGwgZnJvbSBpdAorIyB3aGVuIHRoZXJlIGlzIG5vIE1ha2VmaWxlLgorIworIyBUaGlzIHNjcmlwdCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIEJTRCBpbnN0YWxsIHNjcmlwdCwgYnV0IHdhcyB3cml0dGVuCisjIGZyb20gc2NyYXRjaC4KKworbmw9JworJworSUZTPSIgIiIJJG5sIgorCisjIHNldCBET0lUUFJPRyB0byBlY2hvIHRvIHRlc3QgdGhpcyBzY3JpcHQKKworIyBEb24ndCB1c2UgOi0gc2luY2UgNC4zQlNEIGFuZCBlYXJsaWVyIHNoZWxscyBkb24ndCBsaWtlIGl0LgorZG9pdD0iJHtET0lUUFJPRy19IgoraWYgdGVzdCAteiAiJGRvaXQiOyB0aGVuCisgIGRvaXRfZXhlYz1leGVjCitlbHNlCisgIGRvaXRfZXhlYz0kZG9pdAorZmkKKworIyBQdXQgaW4gYWJzb2x1dGUgZmlsZSBuYW1lcyBpZiB5b3UgZG9uJ3QgaGF2ZSB0aGVtIGluIHlvdXIgcGF0aDsKKyMgb3IgdXNlIGVudmlyb25tZW50IHZhcnMuCisKK212cHJvZz0iJHtNVlBST0ctbXZ9IgorY3Bwcm9nPSIke0NQUFJPRy1jcH0iCitjaG1vZHByb2c9IiR7Q0hNT0RQUk9HLWNobW9kfSIKK2Nob3ducHJvZz0iJHtDSE9XTlBST0ctY2hvd259IgorY2hncnBwcm9nPSIke0NIR1JQUFJPRy1jaGdycH0iCitzdHJpcHByb2c9IiR7U1RSSVBQUk9HLXN0cmlwfSIKK3JtcHJvZz0iJHtSTVBST0ctcm19IgorbWtkaXJwcm9nPSIke01LRElSUFJPRy1ta2Rpcn0iCisKK3Bvc2l4X2dsb2I9Citwb3NpeF9ta2Rpcj0KKworIyBEZXNpcmVkIG1vZGUgb2YgaW5zdGFsbGVkIGZpbGUuCittb2RlPTA3NTUKKworY2htb2RjbWQ9JGNobW9kcHJvZworY2hvd25jbWQ9CitjaGdycGNtZD0KK3N0cmlwY21kPQorcm1jbWQ9IiRybXByb2cgLWYiCittdmNtZD0iJG12cHJvZyIKK3NyYz0KK2RzdD0KK2Rpcl9hcmc9Citkc3Rhcmc9Citub190YXJnZXRfZGlyZWN0b3J5PQorCit1c2FnZT0iVXNhZ2U6ICQwIFtPUFRJT05dLi4uIFstVF0gU1JDRklMRSBEU1RGSUxFCisgICBvcjogJDAgW09QVElPTl0uLi4gU1JDRklMRVMuLi4gRElSRUNUT1JZCisgICBvcjogJDAgW09QVElPTl0uLi4gLXQgRElSRUNUT1JZIFNSQ0ZJTEVTLi4uCisgICBvcjogJDAgW09QVElPTl0uLi4gLWQgRElSRUNUT1JJRVMuLi4KKworSW4gdGhlIDFzdCBmb3JtLCBjb3B5IFNSQ0ZJTEUgdG8gRFNURklMRS4KK0luIHRoZSAybmQgYW5kIDNyZCwgY29weSBhbGwgU1JDRklMRVMgdG8gRElSRUNUT1JZLgorSW4gdGhlIDR0aCwgY3JlYXRlIERJUkVDVE9SSUVTLgorCitPcHRpb25zOgorLWMgICAgICAgICAoaWdub3JlZCkKKy1kICAgICAgICAgY3JlYXRlIGRpcmVjdG9yaWVzIGluc3RlYWQgb2YgaW5zdGFsbGluZyBmaWxlcy4KKy1nIEdST1VQICAgJGNoZ3JwcHJvZyBpbnN0YWxsZWQgZmlsZXMgdG8gR1JPVVAuCistbSBNT0RFICAgICRjaG1vZHByb2cgaW5zdGFsbGVkIGZpbGVzIHRvIE1PREUuCistbyBVU0VSICAgICRjaG93bnByb2cgaW5zdGFsbGVkIGZpbGVzIHRvIFVTRVIuCistcyAgICAgICAgICRzdHJpcHByb2cgaW5zdGFsbGVkIGZpbGVzLgorLXQgRElSRUNUT1JZICBpbnN0YWxsIGludG8gRElSRUNUT1JZLgorLVQgICAgICAgICByZXBvcnQgYW4gZXJyb3IgaWYgRFNURklMRSBpcyBhIGRpcmVjdG9yeS4KKy0taGVscCAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXQuCistLXZlcnNpb24gIGRpc3BsYXkgdmVyc2lvbiBpbmZvIGFuZCBleGl0LgorCitFbnZpcm9ubWVudCB2YXJpYWJsZXMgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgY29tbWFuZHM6CisgIENIR1JQUFJPRyBDSE1PRFBST0cgQ0hPV05QUk9HIENQUFJPRyBNS0RJUlBST0cgTVZQUk9HIFJNUFJPRyBTVFJJUFBST0cKKyIKKword2hpbGUgdGVzdCAkIyAtbmUgMDsgZG8KKyAgY2FzZSAkMSBpbgorICAgIC1jKSBzaGlmdAorICAgICAgICBjb250aW51ZTs7CisKKyAgICAtZCkgZGlyX2FyZz10cnVlCisgICAgICAgIHNoaWZ0CisgICAgICAgIGNvbnRpbnVlOzsKKworICAgIC1nKSBjaGdycGNtZD0iJGNoZ3JwcHJvZyAkMiIKKyAgICAgICAgc2hpZnQKKyAgICAgICAgc2hpZnQKKyAgICAgICAgY29udGludWU7OworCisgICAgLS1oZWxwKSBlY2hvICIkdXNhZ2UiOyBleGl0ICQ/OzsKKworICAgIC1tKSBtb2RlPSQyCisgICAgICAgIHNoaWZ0CisgICAgICAgIHNoaWZ0CisJY2FzZSAkbW9kZSBpbgorCSAgKicgJyogfCAqJwknKiB8IConCisnKgkgIHwgKicqJyogfCAqJz8nKiB8IConWycqKQorCSAgICBlY2hvICIkMDogaW52YWxpZCBtb2RlOiAkbW9kZSIgPiYyCisJICAgIGV4aXQgMTs7CisJZXNhYworICAgICAgICBjb250aW51ZTs7CisKKyAgICAtbykgY2hvd25jbWQ9IiRjaG93bnByb2cgJDIiCisgICAgICAgIHNoaWZ0CisgICAgICAgIHNoaWZ0CisgICAgICAgIGNvbnRpbnVlOzsKKworICAgIC1zKSBzdHJpcGNtZD0kc3RyaXBwcm9nCisgICAgICAgIHNoaWZ0CisgICAgICAgIGNvbnRpbnVlOzsKKworICAgIC10KSBkc3Rhcmc9JDIKKwlzaGlmdAorCXNoaWZ0CisJY29udGludWU7OworCisgICAgLVQpIG5vX3RhcmdldF9kaXJlY3Rvcnk9dHJ1ZQorCXNoaWZ0CisJY29udGludWU7OworCisgICAgLS12ZXJzaW9uKSBlY2hvICIkMCAkc2NyaXB0dmVyc2lvbiI7IGV4aXQgJD87OworCisgICAgLS0pCXNoaWZ0CisJYnJlYWs7OworCisgICAgLSopCWVjaG8gIiQwOiBpbnZhbGlkIG9wdGlvbjogJDEiID4mMgorCWV4aXQgMTs7CisKKyAgICAqKSAgYnJlYWs7OworICBlc2FjCitkb25lCisKK2lmIHRlc3QgJCMgLW5lIDAgJiYgdGVzdCAteiAiJGRpcl9hcmckZHN0YXJnIjsgdGhlbgorICAjIFdoZW4gLWQgaXMgdXNlZCwgYWxsIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIGRpcmVjdG9yaWVzIHRvIGNyZWF0ZS4KKyAgIyBXaGVuIC10IGlzIHVzZWQsIHRoZSBkZXN0aW5hdGlvbiBpcyBhbHJlYWR5IHNwZWNpZmllZC4KKyAgIyBPdGhlcndpc2UsIHRoZSBsYXN0IGFyZ3VtZW50IGlzIHRoZSBkZXN0aW5hdGlvbi4gIFJlbW92ZSBpdCBmcm9tICRALgorICBmb3IgYXJnCisgIGRvCisgICAgaWYgdGVzdCAtbiAiJGRzdGFyZyI7IHRoZW4KKyAgICAgICMgJEAgaXMgbm90IGVtcHR5OiBpdCBjb250YWlucyBhdCBsZWFzdCAkYXJnLgorICAgICAgc2V0IGZub3JkICIkQCIgIiRkc3RhcmciCisgICAgICBzaGlmdCAjIGZub3JkCisgICAgZmkKKyAgICBzaGlmdCAjIGFyZworICAgIGRzdGFyZz0kYXJnCisgIGRvbmUKK2ZpCisKK2lmIHRlc3QgJCMgLWVxIDA7IHRoZW4KKyAgaWYgdGVzdCAteiAiJGRpcl9hcmciOyB0aGVuCisgICAgZWNobyAiJDA6IG5vIGlucHV0IGZpbGUgc3BlY2lmaWVkLiIgPiYyCisgICAgZXhpdCAxCisgIGZpCisgICMgSXQncyBPSyB0byBjYWxsIGBpbnN0YWxsLXNoIC1kJyB3aXRob3V0IGFyZ3VtZW50LgorICAjIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGNyZWF0aW5nIGNvbmRpdGlvbmFsIGRpcmVjdG9yaWVzLgorICBleGl0IDAKK2ZpCisKK2lmIHRlc3QgLXogIiRkaXJfYXJnIjsgdGhlbgorICB0cmFwICcoZXhpdCAkPyk7IGV4aXQnIDEgMiAxMyAxNQorCisgICMgU2V0IHVtYXNrIHNvIGFzIG5vdCB0byBjcmVhdGUgdGVtcHMgd2l0aCB0b28tZ2VuZXJvdXMgbW9kZXMuCisgICMgSG93ZXZlciwgJ3N0cmlwJyByZXF1aXJlcyBib3RoIHJlYWQgYW5kIHdyaXRlIGFjY2VzcyB0byB0ZW1wcy4KKyAgY2FzZSAkbW9kZSBpbgorICAgICMgT3B0aW1pemUgY29tbW9uIGNhc2VzLgorICAgICo2NDQpIGNwX3VtYXNrPTEzMzs7CisgICAgKjc1NSkgY3BfdW1hc2s9MjI7OworCisgICAgKlswLTddKQorICAgICAgaWYgdGVzdCAteiAiJHN0cmlwY21kIjsgdGhlbgorCXVfcGx1c19ydz0KKyAgICAgIGVsc2UKKwl1X3BsdXNfcnc9JyUgMjAwJworICAgICAgZmkKKyAgICAgIGNwX3VtYXNrPWBleHByICcoJyA3NzcgLSAkbW9kZSAlIDEwMDAgJyknICR1X3BsdXNfcndgOzsKKyAgICAqKQorICAgICAgaWYgdGVzdCAteiAiJHN0cmlwY21kIjsgdGhlbgorCXVfcGx1c19ydz0KKyAgICAgIGVsc2UKKwl1X3BsdXNfcnc9LHUrcncKKyAgICAgIGZpCisgICAgICBjcF91bWFzaz0kbW9kZSR1X3BsdXNfcnc7OworICBlc2FjCitmaQorCitmb3Igc3JjCitkbworICAjIFByb3RlY3QgbmFtZXMgc3RhcnRpbmcgd2l0aCBgLScuCisgIGNhc2UgJHNyYyBpbgorICAgIC0qKSBzcmM9Li8kc3JjIDs7CisgIGVzYWMKKworICBpZiB0ZXN0IC1uICIkZGlyX2FyZyI7IHRoZW4KKyAgICBkc3Q9JHNyYworICAgIGRzdGRpcj0kZHN0CisgICAgdGVzdCAtZCAiJGRzdGRpciIKKyAgICBkc3RkaXJfc3RhdHVzPSQ/CisgIGVsc2UKKworICAgICMgV2FpdGluZyBmb3IgdGhpcyB0byBiZSBkZXRlY3RlZCBieSB0aGUgIiRjcHByb2cgJHNyYyAkZHN0dG1wIiBjb21tYW5kCisgICAgIyBtaWdodCBjYXVzZSBkaXJlY3RvcmllcyB0byBiZSBjcmVhdGVkLCB3aGljaCB3b3VsZCBiZSBlc3BlY2lhbGx5IGJhZAorICAgICMgaWYgJHNyYyAoYW5kIHRodXMgJGRzdHRtcCkgY29udGFpbnMgJyonLgorICAgIGlmIHRlc3QgISAtZiAiJHNyYyIgJiYgdGVzdCAhIC1kICIkc3JjIjsgdGhlbgorICAgICAgZWNobyAiJDA6ICRzcmMgZG9lcyBub3QgZXhpc3QuIiA+JjIKKyAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICBpZiB0ZXN0IC16ICIkZHN0YXJnIjsgdGhlbgorICAgICAgZWNobyAiJDA6IG5vIGRlc3RpbmF0aW9uIHNwZWNpZmllZC4iID4mMgorICAgICAgZXhpdCAxCisgICAgZmkKKworICAgIGRzdD0kZHN0YXJnCisgICAgIyBQcm90ZWN0IG5hbWVzIHN0YXJ0aW5nIHdpdGggYC0nLgorICAgIGNhc2UgJGRzdCBpbgorICAgICAgLSopIGRzdD0uLyRkc3QgOzsKKyAgICBlc2FjCisKKyAgICAjIElmIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5LCBhcHBlbmQgdGhlIGlucHV0IGZpbGVuYW1lOyB3b24ndCB3b3JrCisgICAgIyBpZiBkb3VibGUgc2xhc2hlcyBhcmVuJ3QgaWdub3JlZC4KKyAgICBpZiB0ZXN0IC1kICIkZHN0IjsgdGhlbgorICAgICAgaWYgdGVzdCAtbiAiJG5vX3RhcmdldF9kaXJlY3RvcnkiOyB0aGVuCisJZWNobyAiJDA6ICRkc3Rhcmc6IElzIGEgZGlyZWN0b3J5IiA+JjIKKwlleGl0IDEKKyAgICAgIGZpCisgICAgICBkc3RkaXI9JGRzdAorICAgICAgZHN0PSRkc3RkaXIvYGJhc2VuYW1lICIkc3JjImAKKyAgICAgIGRzdGRpcl9zdGF0dXM9MAorICAgIGVsc2UKKyAgICAgICMgUHJlZmVyIGRpcm5hbWUsIGJ1dCBmYWxsIGJhY2sgb24gYSBzdWJzdGl0dXRlIGlmIGRpcm5hbWUgZmFpbHMuCisgICAgICBkc3RkaXI9YAorCShkaXJuYW1lICIkZHN0IikgMj4vZGV2L251bGwgfHwKKwlleHByIFgiJGRzdCIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgICAgIFgiJGRzdCIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgICAgIFgiJGRzdCIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgICAgIFgiJGRzdCIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CisJZWNobyBYIiRkc3QiIHwKKwkgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKKwkJICAgcy8vXDEvCisJCSAgIHEKKwkJIH0KKwkJIC9eWFwoXC9cL1wpW14vXS4qL3sKKwkJICAgcy8vXDEvCisJCSAgIHEKKwkJIH0KKwkJIC9eWFwoXC9cL1wpJC97CisJCSAgIHMvL1wxLworCQkgICBxCisJCSB9CisJCSAvXlhcKFwvXCkuKi97CisJCSAgIHMvL1wxLworCQkgICBxCisJCSB9CisJCSBzLy4qLy4vOyBxJworICAgICAgYAorCisgICAgICB0ZXN0IC1kICIkZHN0ZGlyIgorICAgICAgZHN0ZGlyX3N0YXR1cz0kPworICAgIGZpCisgIGZpCisKKyAgb2Jzb2xldGVfbWtkaXJfdXNlZD1mYWxzZQorCisgIGlmIHRlc3QgJGRzdGRpcl9zdGF0dXMgIT0gMDsgdGhlbgorICAgIGNhc2UgJHBvc2l4X21rZGlyIGluCisgICAgICAnJykKKwkjIENyZWF0ZSBpbnRlcm1lZGlhdGUgZGlycyB1c2luZyBtb2RlIDc1NSBhcyBtb2RpZmllZCBieSB0aGUgdW1hc2suCisJIyBUaGlzIGlzIGxpa2UgRnJlZUJTRCAnaW5zdGFsbCcgYXMgb2YgMTk5Ny0xMC0yOC4KKwl1bWFzaz1gdW1hc2tgCisJY2FzZSAkc3RyaXBjbWQuJHVtYXNrIGluCisJICAjIE9wdGltaXplIGNvbW1vbiBjYXNlcy4KKwkgICpbMjM2N11bMjM2N10pIG1rZGlyX3VtYXNrPSR1bWFzazs7CisJICAuKjBbMDJdWzAyXSB8IC5bMDJdWzAyXSB8IC5bMDJdKSBta2Rpcl91bWFzaz0yMjs7CisKKwkgICpbMC03XSkKKwkgICAgbWtkaXJfdW1hc2s9YGV4cHIgJHVtYXNrICsgMjIgXAorCSAgICAgIC0gJHVtYXNrICUgMTAwICUgNDAgKyAkdW1hc2sgJSAyMCBcCisJICAgICAgLSAkdW1hc2sgJSAxMCAlIDQgKyAkdW1hc2sgJSAyCisJICAgIGA7OworCSAgKikgbWtkaXJfdW1hc2s9JHVtYXNrLGdvLXc7OworCWVzYWMKKworCSMgV2l0aCAtZCwgY3JlYXRlIHRoZSBuZXcgZGlyZWN0b3J5IHdpdGggdGhlIHVzZXItc3BlY2lmaWVkIG1vZGUuCisJIyBPdGhlcndpc2UsIHJlbHkgb24gJG1rZGlyX3VtYXNrLgorCWlmIHRlc3QgLW4gIiRkaXJfYXJnIjsgdGhlbgorCSAgbWtkaXJfbW9kZT0tbSRtb2RlCisJZWxzZQorCSAgbWtkaXJfbW9kZT0KKwlmaQorCisJcG9zaXhfbWtkaXI9ZmFsc2UKKwljYXNlICR1bWFzayBpbgorCSAgKlsxMjM1NjddWzAtN11bMC03XSkKKwkgICAgIyBQT1NJWCBta2RpciAtcCBzZXRzIHUrd3ggYml0cyByZWdhcmRsZXNzIG9mIHVtYXNrLCB3aGljaAorCSAgICAjIGlzIGluY29tcGF0aWJsZSB3aXRoIEZyZWVCU0QgJ2luc3RhbGwnIHdoZW4gKHVtYXNrICYgMzAwKSAhPSAwLgorCSAgICA7OworCSAgKikKKwkgICAgdG1wZGlyPSR7VE1QRElSLS90bXB9L2lucyRSQU5ET00tJCQKKwkgICAgdHJhcCAncmV0PSQ/OyBybWRpciAiJHRtcGRpci9kIiAiJHRtcGRpciIgMj4vZGV2L251bGw7IGV4aXQgJHJldCcgMAorCisJICAgIGlmICh1bWFzayAkbWtkaXJfdW1hc2sgJiYKKwkJZXhlYyAkbWtkaXJwcm9nICRta2Rpcl9tb2RlIC1wIC0tICIkdG1wZGlyL2QiKSA+L2Rldi9udWxsIDI+JjEKKwkgICAgdGhlbgorCSAgICAgIGlmIHRlc3QgLXogIiRkaXJfYXJnIiB8fCB7CisJCSAgICMgQ2hlY2sgZm9yIFBPU0lYIGluY29tcGF0aWJpbGl0aWVzIHdpdGggLW0uCisJCSAgICMgSFAtVVggMTEuMjMgYW5kIElSSVggNi41IG1rZGlyIC1tIC1wIHNldHMgZ3JvdXAtIG9yCisJCSAgICMgb3RoZXItd3JpdGVhYmxlIGJpdCBvZiBwYXJlbnQgZGlyZWN0b3J5IHdoZW4gaXQgc2hvdWxkbid0LgorCQkgICAjIEZyZWVCU0QgNi4xIG1rZGlyIC1tIC1wIHNldHMgbW9kZSBvZiBleGlzdGluZyBkaXJlY3RvcnkuCisJCSAgIGxzX2xkX3RtcGRpcj1gbHMgLWxkICIkdG1wZGlyImAKKwkJICAgY2FzZSAkbHNfbGRfdG1wZGlyIGluCisJCSAgICAgZD8/Pz8tP3ItKikgZGlmZmVyZW50X21vZGU9NzAwOzsKKwkJICAgICBkPz8/Py0/LS0qKSBkaWZmZXJlbnRfbW9kZT03NTU7OworCQkgICAgICopIGZhbHNlOzsKKwkJICAgZXNhYyAmJgorCQkgICAkbWtkaXJwcm9nIC1tJGRpZmZlcmVudF9tb2RlIC1wIC0tICIkdG1wZGlyIiAmJiB7CisJCSAgICAgbHNfbGRfdG1wZGlyXzE9YGxzIC1sZCAiJHRtcGRpciJgCisJCSAgICAgdGVzdCAiJGxzX2xkX3RtcGRpciIgPSAiJGxzX2xkX3RtcGRpcl8xIgorCQkgICB9CisJCSB9CisJICAgICAgdGhlbiBwb3NpeF9ta2Rpcj06CisJICAgICAgZmkKKwkgICAgICBybWRpciAiJHRtcGRpci9kIiAiJHRtcGRpciIKKwkgICAgZWxzZQorCSAgICAgICMgUmVtb3ZlIGFueSBkaXJzIGxlZnQgYmVoaW5kIGJ5IGFuY2llbnQgbWtkaXIgaW1wbGVtZW50YXRpb25zLgorCSAgICAgIHJtZGlyIC4vJG1rZGlyX21vZGUgLi8tcCAuLy0tIDI+L2Rldi9udWxsCisJICAgIGZpCisJICAgIHRyYXAgJycgMDs7CisJZXNhYzs7CisgICAgZXNhYworCisgICAgaWYKKyAgICAgICRwb3NpeF9ta2RpciAmJiAoCisJdW1hc2sgJG1rZGlyX3VtYXNrICYmCisJJGRvaXRfZXhlYyAkbWtkaXJwcm9nICRta2Rpcl9tb2RlIC1wIC0tICIkZHN0ZGlyIgorICAgICAgKQorICAgIHRoZW4gOgorICAgIGVsc2UKKworICAgICAgIyBUaGUgdW1hc2sgaXMgcmlkaWN1bG91cywgb3IgbWtkaXIgZG9lcyBub3QgY29uZm9ybSB0byBQT1NJWCwKKyAgICAgICMgb3IgaXQgZmFpbGVkIHBvc3NpYmx5IGR1ZSB0byBhIHJhY2UgY29uZGl0aW9uLiAgQ3JlYXRlIHRoZQorICAgICAgIyBkaXJlY3RvcnkgdGhlIHNsb3cgd2F5LCBzdGVwIGJ5IHN0ZXAsIGNoZWNraW5nIGZvciByYWNlcyBhcyB3ZSBnby4KKworICAgICAgY2FzZSAkZHN0ZGlyIGluCisJLyopIHByZWZpeD0vIDs7CisJLSopIHByZWZpeD0uLyA7OworCSopICBwcmVmaXg9IDs7CisgICAgICBlc2FjCisKKyAgICAgIGNhc2UgJHBvc2l4X2dsb2IgaW4KKyAgICAgICAgJycpCisJICBpZiAoc2V0IC1mKSAyPi9kZXYvbnVsbDsgdGhlbgorCSAgICBwb3NpeF9nbG9iPXRydWUKKwkgIGVsc2UKKwkgICAgcG9zaXhfZ2xvYj1mYWxzZQorCSAgZmkgOzsKKyAgICAgIGVzYWMKKworICAgICAgb0lGUz0kSUZTCisgICAgICBJRlM9LworICAgICAgJHBvc2l4X2dsb2IgJiYgc2V0IC1mCisgICAgICBzZXQgZm5vcmQgJGRzdGRpcgorICAgICAgc2hpZnQKKyAgICAgICRwb3NpeF9nbG9iICYmIHNldCArZgorICAgICAgSUZTPSRvSUZTCisKKyAgICAgIHByZWZpeGVzPQorCisgICAgICBmb3IgZAorICAgICAgZG8KKwl0ZXN0IC16ICIkZCIgJiYgY29udGludWUKKworCXByZWZpeD0kcHJlZml4JGQKKwlpZiB0ZXN0IC1kICIkcHJlZml4IjsgdGhlbgorCSAgcHJlZml4ZXM9CisJZWxzZQorCSAgaWYgJHBvc2l4X21rZGlyOyB0aGVuCisJICAgICh1bWFzaz0kbWtkaXJfdW1hc2sgJiYKKwkgICAgICRkb2l0X2V4ZWMgJG1rZGlycHJvZyAkbWtkaXJfbW9kZSAtcCAtLSAiJGRzdGRpciIpICYmIGJyZWFrCisJICAgICMgRG9uJ3QgZmFpbCBpZiB0d28gaW5zdGFuY2VzIGFyZSBydW5uaW5nIGNvbmN1cnJlbnRseS4KKwkgICAgdGVzdCAtZCAiJHByZWZpeCIgfHwgZXhpdCAxCisJICBlbHNlCisJICAgIGNhc2UgJHByZWZpeCBpbgorCSAgICAgICpcJyopIHFwcmVmaXg9YGVjaG8gIiRwcmVmaXgiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsKKwkgICAgICAqKSBxcHJlZml4PSRwcmVmaXg7OworCSAgICBlc2FjCisJICAgIHByZWZpeGVzPSIkcHJlZml4ZXMgJyRxcHJlZml4JyIKKwkgIGZpCisJZmkKKwlwcmVmaXg9JHByZWZpeC8KKyAgICAgIGRvbmUKKworICAgICAgaWYgdGVzdCAtbiAiJHByZWZpeGVzIjsgdGhlbgorCSMgRG9uJ3QgZmFpbCBpZiB0d28gaW5zdGFuY2VzIGFyZSBydW5uaW5nIGNvbmN1cnJlbnRseS4KKwkodW1hc2sgJG1rZGlyX3VtYXNrICYmCisJIGV2YWwgIlwkZG9pdF9leGVjIFwkbWtkaXJwcm9nICRwcmVmaXhlcyIpIHx8CisJICB0ZXN0IC1kICIkZHN0ZGlyIiB8fCBleGl0IDEKKwlvYnNvbGV0ZV9ta2Rpcl91c2VkPXRydWUKKyAgICAgIGZpCisgICAgZmkKKyAgZmkKKworICBpZiB0ZXN0IC1uICIkZGlyX2FyZyI7IHRoZW4KKyAgICB7IHRlc3QgLXogIiRjaG93bmNtZCIgfHwgJGRvaXQgJGNob3duY21kICIkZHN0IjsgfSAmJgorICAgIHsgdGVzdCAteiAiJGNoZ3JwY21kIiB8fCAkZG9pdCAkY2hncnBjbWQgIiRkc3QiOyB9ICYmCisgICAgeyB0ZXN0ICIkb2Jzb2xldGVfbWtkaXJfdXNlZCRjaG93bmNtZCRjaGdycGNtZCIgPSBmYWxzZSB8fAorICAgICAgdGVzdCAteiAiJGNobW9kY21kIiB8fCAkZG9pdCAkY2htb2RjbWQgJG1vZGUgIiRkc3QiOyB9IHx8IGV4aXQgMQorICBlbHNlCisKKyAgICAjIE1ha2UgYSBjb3VwbGUgb2YgdGVtcCBmaWxlIG5hbWVzIGluIHRoZSBwcm9wZXIgZGlyZWN0b3J5LgorICAgIGRzdHRtcD0kZHN0ZGlyL19pbnN0LiQkXworICAgIHJtdG1wPSRkc3RkaXIvX3JtLiQkXworCisgICAgIyBUcmFwIHRvIGNsZWFuIHVwIHRob3NlIHRlbXAgZmlsZXMgYXQgZXhpdC4KKyAgICB0cmFwICdyZXQ9JD87IHJtIC1mICIkZHN0dG1wIiAiJHJtdG1wIiAmJiBleGl0ICRyZXQnIDAKKworICAgICMgQ29weSB0aGUgZmlsZSBuYW1lIHRvIHRoZSB0ZW1wIG5hbWUuCisgICAgKHVtYXNrICRjcF91bWFzayAmJiAkZG9pdF9leGVjICRjcHByb2cgIiRzcmMiICIkZHN0dG1wIikgJiYKKworICAgICMgYW5kIHNldCBhbnkgb3B0aW9uczsgZG8gY2htb2QgbGFzdCB0byBwcmVzZXJ2ZSBzZXR1aWQgYml0cy4KKyAgICAjCisgICAgIyBJZiBhbnkgb2YgdGhlc2UgZmFpbCwgd2UgYWJvcnQgdGhlIHdob2xlIHRoaW5nLiAgSWYgd2Ugd2FudCB0bworICAgICMgaWdub3JlIGVycm9ycyBmcm9tIGFueSBvZiB0aGVzZSwganVzdCBtYWtlIHN1cmUgbm90IHRvIGlnbm9yZQorICAgICMgZXJyb3JzIGZyb20gdGhlIGFib3ZlICIkZG9pdCAkY3Bwcm9nICRzcmMgJGRzdHRtcCIgY29tbWFuZC4KKyAgICAjCisgICAgeyB0ZXN0IC16ICIkY2hvd25jbWQiIHx8ICRkb2l0ICRjaG93bmNtZCAiJGRzdHRtcCI7IH0gXAorICAgICAgJiYgeyB0ZXN0IC16ICIkY2hncnBjbWQiIHx8ICRkb2l0ICRjaGdycGNtZCAiJGRzdHRtcCI7IH0gXAorICAgICAgJiYgeyB0ZXN0IC16ICIkc3RyaXBjbWQiIHx8ICRkb2l0ICRzdHJpcGNtZCAiJGRzdHRtcCI7IH0gXAorICAgICAgJiYgeyB0ZXN0IC16ICIkY2htb2RjbWQiIHx8ICRkb2l0ICRjaG1vZGNtZCAkbW9kZSAiJGRzdHRtcCI7IH0gJiYKKworICAgICMgTm93IHJlbmFtZSB0aGUgZmlsZSB0byB0aGUgcmVhbCBkZXN0aW5hdGlvbi4KKyAgICB7ICRkb2l0ICRtdmNtZCAtZiAiJGRzdHRtcCIgIiRkc3QiIDI+L2Rldi9udWxsIFwKKyAgICAgIHx8IHsKKwkgICAjIFRoZSByZW5hbWUgZmFpbGVkLCBwZXJoYXBzIGJlY2F1c2UgbXYgY2FuJ3QgcmVuYW1lIHNvbWV0aGluZyBlbHNlCisJICAgIyB0byBpdHNlbGYsIG9yIHBlcmhhcHMgYmVjYXVzZSBtdiBpcyBzbyBhbmNpZW50IHRoYXQgaXQgZG9lcyBub3QKKwkgICAjIHN1cHBvcnQgLWYuCisKKwkgICAjIE5vdyByZW1vdmUgb3IgbW92ZSBhc2lkZSBhbnkgb2xkIGZpbGUgYXQgZGVzdGluYXRpb24gbG9jYXRpb24uCisJICAgIyBXZSB0cnkgdGhpcyB0d28gd2F5cyBzaW5jZSBybSBjYW4ndCB1bmxpbmsgaXRzZWxmIG9uIHNvbWUKKwkgICAjIHN5c3RlbXMgYW5kIHRoZSBkZXN0aW5hdGlvbiBmaWxlIG1pZ2h0IGJlIGJ1c3kgZm9yIG90aGVyCisJICAgIyByZWFzb25zLiAgSW4gdGhpcyBjYXNlLCB0aGUgZmluYWwgY2xlYW51cCBtaWdodCBmYWlsIGJ1dCB0aGUgbmV3CisJICAgIyBmaWxlIHNob3VsZCBzdGlsbCBpbnN0YWxsIHN1Y2Nlc3NmdWxseS4KKwkgICB7CisJICAgICBpZiB0ZXN0IC1mICIkZHN0IjsgdGhlbgorCSAgICAgICAkZG9pdCAkcm1jbWQgLWYgIiRkc3QiIDI+L2Rldi9udWxsIFwKKwkgICAgICAgfHwgeyAkZG9pdCAkbXZjbWQgLWYgIiRkc3QiICIkcm10bXAiIDI+L2Rldi9udWxsIFwKKwkJICAgICAmJiB7ICRkb2l0ICRybWNtZCAtZiAiJHJtdG1wIiAyPi9kZXYvbnVsbDsgOjsgfTsgfVwKKwkgICAgICAgfHwgeworCQkgZWNobyAiJDA6IGNhbm5vdCB1bmxpbmsgb3IgcmVuYW1lICRkc3QiID4mMgorCQkgKGV4aXQgMSk7IGV4aXQgMQorCSAgICAgICB9CisJICAgICBlbHNlCisJICAgICAgIDoKKwkgICAgIGZpCisJICAgfSAmJgorCisJICAgIyBOb3cgcmVuYW1lIHRoZSBmaWxlIHRvIHRoZSByZWFsIGRlc3RpbmF0aW9uLgorCSAgICRkb2l0ICRtdmNtZCAiJGRzdHRtcCIgIiRkc3QiCisJIH0KKyAgICB9IHx8IGV4aXQgMQorCisgICAgdHJhcCAnJyAwCisgIGZpCitkb25lCisKKyMgTG9jYWwgdmFyaWFibGVzOgorIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCisjIHRpbWUtc3RhbXAtc3RhcnQ6ICJzY3JpcHR2ZXJzaW9uPSIKKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkLiUwMkgiCisjIHRpbWUtc3RhbXAtZW5kOiAiJCIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L2x0bWFpbi5zaCBiL2xpYmdjcnlwdC0xLjQuNi9sdG1haW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcxNWI1OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9sdG1haW4uc2gKQEAgLTAsMCArMSw2ODcxIEBACisjIGx0bWFpbi5zaCAtIFByb3ZpZGUgZ2VuZXJhbGl6ZWQgbGlicmFyeS1idWlsZGluZyBzdXBwb3J0IHNlcnZpY2VzLgorIyBOT1RFOiBDaGFuZ2luZyB0aGlzIGZpbGUgd2lsbCBub3QgYWZmZWN0IGFueXRoaW5nIHVudGlsIHlvdSByZXJ1biBjb25maWd1cmUuCisjCisjIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMywgMjAwNCwgMjAwNQorIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgT3JpZ2luYWxseSBieSBHb3Jkb24gTWF0emlna2VpdCA8Z29yZEBnbnUuYWkubWl0LmVkdT4sIDE5OTYKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisjCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworYmFzZW5hbWU9InMsXi4qLywsZyIKKworIyBXb3JrIGFyb3VuZCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGlzc3VlIG9uIElSSVggNi41LiBPbiBJUklYIDYuNCssIHNoCisjIGlzIGtzaCBidXQgd2hlbiB0aGUgc2hlbGwgaXMgaW52b2tlZCBhcyAic2giIGFuZCB0aGUgY3VycmVudCB2YWx1ZSBvZgorIyB0aGUgX1hQRyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3QgZXF1YWwgdG8gMSAob25lKSwgdGhlIHNwZWNpYWwKKyMgcG9zaXRpb25hbCBwYXJhbWV0ZXIgJDAsIHdpdGhpbiBhIGZ1bmN0aW9uIGNhbGwsIGlzIHRoZSBuYW1lIG9mIHRoZQorIyBmdW5jdGlvbi4KK3Byb2dwYXRoPSIkMCIKKworIyBUaGUgbmFtZSBvZiB0aGlzIHByb2dyYW06Citwcm9nbmFtZT1gZWNobyAiJHByb2dwYXRoIiB8ICRTRUQgJGJhc2VuYW1lYAorbW9kZW5hbWU9IiRwcm9nbmFtZSIKKworIyBHbG9iYWwgdmFyaWFibGVzOgorRVhJVF9TVUNDRVNTPTAKK0VYSVRfRkFJTFVSRT0xCisKK1BST0dSQU09bHRtYWluLnNoCitQQUNLQUdFPWxpYnRvb2wKK1ZFUlNJT049IjEuNS4yMiBEZWJpYW4gMS41LjIyLTQiCitUSU1FU1RBTVA9IiAoMS4xMjIwLjIuMzY1IDIwMDUvMTIvMTggMjI6MTQ6MDYpIgorCisjIFNlZSBpZiB3ZSBhcmUgcnVubmluZyBvbiB6c2gsIGFuZCBzZXQgdGhlIG9wdGlvbnMgd2hpY2ggYWxsb3cgb3VyCisjIGNvbW1hbmRzIHRocm91Z2ggd2l0aG91dCByZW1vdmFsIG9mIFwgZXNjYXBlcy4KK2lmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgOyB0aGVuCisgIHNldG9wdCBOT19HTE9CX1NVQlNUCitmaQorCisjIENoZWNrIHRoYXQgd2UgaGF2ZSBhIHdvcmtpbmcgJGVjaG8uCitpZiB0ZXN0ICJYJDEiID0gWC0tbm8tcmVleGVjOyB0aGVuCisgICMgRGlzY2FyZCB0aGUgLS1uby1yZWV4ZWMgZmxhZywgYW5kIGNvbnRpbnVlLgorICBzaGlmdAorZWxpZiB0ZXN0ICJYJDEiID0gWC0tZmFsbGJhY2stZWNobzsgdGhlbgorICAjIEF2b2lkIGlubGluZSBkb2N1bWVudCBoZXJlLCBpdCBtYXkgYmUgbGVmdCBvdmVyCisgIDoKK2VsaWYgdGVzdCAiWGAoJGVjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnOyB0aGVuCisgICMgWWlwcGVlLCAkZWNobyB3b3JrcyEKKyAgOgorZWxzZQorICAjIFJlc3RhcnQgdW5kZXIgdGhlIGNvcnJlY3Qgc2hlbGwsIGFuZCB0aGVuIG1heWJlICRlY2hvIHdpbGwgd29yay4KKyAgZXhlYyAkU0hFTEwgIiRwcm9ncGF0aCIgLS1uby1yZWV4ZWMgJHsxKyIkQCJ9CitmaQorCitpZiB0ZXN0ICJYJDEiID0gWC0tZmFsbGJhY2stZWNobzsgdGhlbgorICAjIHVzZWQgYXMgZmFsbGJhY2sgZWNobworICBzaGlmdAorICBjYXQgPDxFT0YKKyQqCitFT0YKKyAgZXhpdCAkRVhJVF9TVUNDRVNTCitmaQorCitkZWZhdWx0X21vZGU9CitoZWxwPSJUcnkgXGAkcHJvZ25hbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCittYWdpYz0iJSUlTUFHSUMgdmFyaWFibGUlJSUiCitta2Rpcj0ibWtkaXIiCittdj0ibXYgLWYiCitybT0icm0gLWYiCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKKyMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCitYc2VkPSIke1NFRH0iJyAtZSAxcy9eWC8vJworc2VkX3F1b3RlX3N1YnN0PSdzL1woW1xcYFxcIiRcXFxcXVwpL1xcXDEvZycKKyMgdGVzdCBFQkNESUMgb3IgQVNDSUkKK2Nhc2UgYGVjaG8gWHx0ciBYICdcMTAxJ2AgaW4KKyBBKSAjIEFTQ0lJIGJhc2VkIHN5c3RlbQorICAgICMgXG4gaXMgbm90IGludGVycHJldGVkIGNvcnJlY3RseSBieSBTb2xhcmlzIDggL3Vzci91Y2IvdHIKKyAgU1AyTkw9J3RyIFwwNDAgXDAxMicKKyAgTkwyU1A9J3RyIFwwMTVcMDEyIFwwNDBcMDQwJworICA7OworICopICMgRUJDRElDIGJhc2VkIHN5c3RlbQorICBTUDJOTD0ndHIgXDEwMCBcbicKKyAgTkwyU1A9J3RyIFxyXG4gXDEwMFwxMDAnCisgIDs7Citlc2FjCisKKyMgTkxTIG51aXNhbmNlcy4KKyMgT25seSBzZXQgTEFORyBhbmQgTENfQUxMIHRvIEMgaWYgYWxyZWFkeSBzZXQuCisjIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZAorIyBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgorIyBXZSBzYXZlIHRoZSBvbGQgdmFsdWVzIHRvIHJlc3RvcmUgZHVyaW5nIGV4ZWN1dGUgbW9kZS4KK2lmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuCisgIHNhdmVfTENfQUxMPSIkTENfQUxMIjsgTENfQUxMPUM7IGV4cG9ydCBMQ19BTEwKK2ZpCitpZiB0ZXN0ICIke0xBTkcrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgc2F2ZV9MQU5HPSIkTEFORyI7IExBTkc9QzsgZXhwb3J0IExBTkcKK2ZpCisKKyMgTWFrZSBzdXJlIElGUyBoYXMgYSBzZW5zaWJsZSBkZWZhdWx0CitsdF9ubD0nCisnCitJRlM9IiAJJGx0X25sIgorCitpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXMgJiYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiAhPSB5ZXM7IHRoZW4KKyAgJGVjaG8gIiRtb2RlbmFtZTogbm90IGNvbmZpZ3VyZWQgdG8gYnVpbGQgYW55IGtpbmQgb2YgbGlicmFyeSIgMT4mMgorICAkZWNobyAiRmF0YWwgY29uZmlndXJhdGlvbiBlcnJvci4gIFNlZSB0aGUgJFBBQ0tBR0UgZG9jcyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDE+JjIKKyAgZXhpdCAkRVhJVF9GQUlMVVJFCitmaQorCisjIEdsb2JhbCB2YXJpYWJsZXMuCittb2RlPSRkZWZhdWx0X21vZGUKK25vbm9wdD0KK3ByZXY9CitwcmV2b3B0PQorcnVuPQorc2hvdz0iJGVjaG8iCitzaG93X2hlbHA9CitleGVjdXRlX2RsZmlsZXM9CitkdXBsaWNhdGVfZGVwcz1ubworcHJlc2VydmVfYXJncz0KK2xvMm89InMvXFwubG9cJC8uJHtvYmpleHR9LyIKK28ybG89InMvXFwuJHtvYmpleHR9XCQvLmxvLyIKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBTaGVsbCBmdW5jdGlvbiBkZWZpbml0aW9uczoKKyMgVGhpcyBzZWVtcyB0byBiZSB0aGUgYmVzdCBwbGFjZSBmb3IgdGhlbQorCisjIGZ1bmNfbWt0ZW1wZGlyIFtzdHJpbmddCisjIE1ha2UgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHRoYXQgd29uJ3QgY2xhc2ggd2l0aCBvdGhlciBydW5uaW5nCisjIGxpYnRvb2wgcHJvY2Vzc2VzLCBhbmQgYXZvaWRzIHJhY2UgY29uZGl0aW9ucyBpZiBwb3NzaWJsZS4gIElmCisjIGdpdmVuLCBTVFJJTkcgaXMgdGhlIGJhc2VuYW1lIGZvciB0aGF0IGRpcmVjdG9yeS4KK2Z1bmNfbWt0ZW1wZGlyICgpCit7CisgICAgbXlfdGVtcGxhdGU9IiR7VE1QRElSLS90bXB9LyR7MS0kcHJvZ25hbWV9IgorCisgICAgaWYgdGVzdCAiJHJ1biIgPSAiOiI7IHRoZW4KKyAgICAgICMgUmV0dXJuIGEgZGlyZWN0b3J5IG5hbWUsIGJ1dCBkb24ndCBjcmVhdGUgaXQgaW4gZHJ5LXJ1biBtb2RlCisgICAgICBteV90bXBkaXI9IiR7bXlfdGVtcGxhdGV9LSQkIgorICAgIGVsc2UKKworICAgICAgIyBJZiBta3RlbXAgd29ya3MsIHVzZSB0aGF0IGZpcnN0IGFuZCBmb3JlbW9zdAorICAgICAgbXlfdG1wZGlyPWBta3RlbXAgLWQgIiR7bXlfdGVtcGxhdGV9LVhYWFhYWFhYIiAyPi9kZXYvbnVsbGAKKworICAgICAgaWYgdGVzdCAhIC1kICIkbXlfdG1wZGlyIjsgdGhlbgorCSMgRmFpbGluZyB0aGF0LCBhdCBsZWFzdCB0cnkgYW5kIHVzZSAkUkFORE9NIHRvIGF2b2lkIGEgcmFjZQorCW15X3RtcGRpcj0iJHtteV90ZW1wbGF0ZX0tJHtSQU5ET00tMH0kJCIKKworCXNhdmVfbWt0ZW1wZGlyX3VtYXNrPWB1bWFza2AKKwl1bWFzayAwMDc3CisJJG1rZGlyICIkbXlfdG1wZGlyIgorCXVtYXNrICRzYXZlX21rdGVtcGRpcl91bWFzaworICAgICAgZmkKKworICAgICAgIyBJZiB3ZSdyZSBub3QgaW4gZHJ5LXJ1biBtb2RlLCBib21iIG91dCBvbiBmYWlsdXJlCisgICAgICB0ZXN0IC1kICIkbXlfdG1wZGlyIiB8fCB7CisgICAgICAgICRlY2hvICJjYW5ub3QgY3JlYXRlIHRlbXBvcmFyeSBkaXJlY3RvcnkgXGAkbXlfdG1wZGlyJyIgMT4mMgorCWV4aXQgJEVYSVRfRkFJTFVSRQorICAgICAgfQorICAgIGZpCisKKyAgICAkZWNobyAiWCRteV90bXBkaXIiIHwgJFhzZWQKK30KKworCisjIGZ1bmNfd2luMzJfbGliaWQgYXJnCisjIHJldHVybiB0aGUgbGlicmFyeSB0eXBlIG9mIGZpbGUgJ2FyZycKKyMKKyMgTmVlZCBhIGxvdCBvZiBnb28gdG8gaGFuZGxlICpib3RoKiBETExzIGFuZCBpbXBvcnQgbGlicworIyBIYXMgdG8gYmUgYSBzaGVsbCBmdW5jdGlvbiBpbiBvcmRlciB0byAnZWF0JyB0aGUgYXJndW1lbnQKKyMgdGhhdCBpcyBzdXBwbGllZCB3aGVuICRmaWxlX21hZ2ljX2NvbW1hbmQgaXMgY2FsbGVkLgorZnVuY193aW4zMl9saWJpZCAoKQoreworICB3aW4zMl9saWJpZF90eXBlPSJ1bmtub3duIgorICB3aW4zMl9maWxlcmVzPWBmaWxlIC1MICQxIDI+L2Rldi9udWxsYAorICBjYXNlICR3aW4zMl9maWxlcmVzIGluCisgICphclwgYXJjaGl2ZVwgaW1wb3J0XCBsaWJyYXJ5KikgIyBkZWZpbml0ZWx5IGltcG9ydAorICAgIHdpbjMyX2xpYmlkX3R5cGU9Ing4NiBhcmNoaXZlIGltcG9ydCIKKyAgICA7OworICAqYXJcIGFyY2hpdmUqKSAjIGNvdWxkIGJlIGFuIGltcG9ydCwgb3Igc3RhdGljCisgICAgaWYgZXZhbCAkT0JKRFVNUCAtZiAkMSB8ICRTRUQgLWUgJzEwcScgMj4vZGV2L251bGwgfCBcCisgICAgICAkRUdSRVAgLWUgJ2ZpbGUgZm9ybWF0IHBlLWkzODYoLiphcmNoaXRlY3R1cmU6IGkzODYpPycgPi9kZXYvbnVsbCA7IHRoZW4KKyAgICAgIHdpbjMyX25tcmVzPWBldmFsICROTSAtZiBwb3NpeCAtQSAkMSB8IFwKKwkkU0VEIC1uIC1lICcxLDEwMHsvIEkgL3tzLC4qLGltcG9ydCw7cDtxO307fSdgCisgICAgICBjYXNlICR3aW4zMl9ubXJlcyBpbgorICAgICAgaW1wb3J0KikgIHdpbjMyX2xpYmlkX3R5cGU9Ing4NiBhcmNoaXZlIGltcG9ydCI7OworICAgICAgKikgICAgICAgIHdpbjMyX2xpYmlkX3R5cGU9Ing4NiBhcmNoaXZlIHN0YXRpYyI7OworICAgICAgZXNhYworICAgIGZpCisgICAgOzsKKyAgKkRMTCopCisgICAgd2luMzJfbGliaWRfdHlwZT0ieDg2IERMTCIKKyAgICA7OworICAqZXhlY3V0YWJsZSopICMgYnV0IHNoZWxsIHNjcmlwdHMgYXJlICJleGVjdXRhYmxlIiB0b28uLi4KKyAgICBjYXNlICR3aW4zMl9maWxlcmVzIGluCisgICAgKk1TXCBXaW5kb3dzXCBQRVwgSW50ZWwqKQorICAgICAgd2luMzJfbGliaWRfdHlwZT0ieDg2IERMTCIKKyAgICAgIDs7CisgICAgZXNhYworICAgIDs7CisgIGVzYWMKKyAgJGVjaG8gJHdpbjMyX2xpYmlkX3R5cGUKK30KKworCisjIGZ1bmNfaW5mZXJfdGFnIGFyZworIyBJbmZlciB0YWdnZWQgY29uZmlndXJhdGlvbiB0byB1c2UgaWYgYW55IGFyZSBhdmFpbGFibGUgYW5kCisjIGlmIG9uZSB3YXNuJ3QgY2hvc2VuIHZpYSB0aGUgIi0tdGFnIiBjb21tYW5kIGxpbmUgb3B0aW9uLgorIyBPbmx5IGF0dGVtcHQgdGhpcyBpZiB0aGUgY29tcGlsZXIgaW4gdGhlIGJhc2UgY29tcGlsZQorIyBjb21tYW5kIGRvZXNuJ3QgbWF0Y2ggdGhlIGRlZmF1bHQgY29tcGlsZXIuCisjIGFyZyBpcyB1c3VhbGx5IG9mIHRoZSBmb3JtICdnY2MgLi4uJworZnVuY19pbmZlcl90YWcgKCkKK3sKKyAgICBpZiB0ZXN0IC1uICIkYXZhaWxhYmxlX3RhZ3MiICYmIHRlc3QgLXogIiR0YWduYW1lIjsgdGhlbgorICAgICAgQ0NfcXVvdGVkPQorICAgICAgZm9yIGFyZyBpbiAkQ0M7IGRvCisJY2FzZSAkYXJnIGluCisJICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKKwkgIGFyZz0iXCIkYXJnXCIiCisJICA7OworCWVzYWMKKwlDQ19xdW90ZWQ9IiRDQ19xdW90ZWQgJGFyZyIKKyAgICAgIGRvbmUKKyAgICAgIGNhc2UgJEAgaW4KKyAgICAgICMgQmxhbmtzIGluIHRoZSBjb21tYW5kIG1heSBoYXZlIGJlZW4gc3RyaXBwZWQgYnkgdGhlIGNhbGxpbmcgc2hlbGwsCisgICAgICAjIGJ1dCBub3QgZnJvbSB0aGUgQ0MgZW52aXJvbm1lbnQgdmFyaWFibGUgd2hlbiBjb25maWd1cmUgd2FzIHJ1bi4KKyAgICAgICIgJENDICIqIHwgIiRDQyAiKiB8ICIgYCRlY2hvICRDQ2AgIiogfCAiYCRlY2hvICRDQ2AgIiogfCAiICRDQ19xdW90ZWQiKiB8ICIkQ0NfcXVvdGVkICIqIHwgIiBgJGVjaG8gJENDX3F1b3RlZGAgIiogfCAiYCRlY2hvICRDQ19xdW90ZWRgICIqKSA7OworICAgICAgIyBCbGFua3MgYXQgdGhlIHN0YXJ0IG9mICRiYXNlX2NvbXBpbGUgd2lsbCBjYXVzZSB0aGlzIHRvIGZhaWwKKyAgICAgICMgaWYgd2UgZG9uJ3QgY2hlY2sgZm9yIHRoZW0gYXMgd2VsbC4KKyAgICAgICopCisJZm9yIHogaW4gJGF2YWlsYWJsZV90YWdzOyBkbworCSAgaWYgZ3JlcCAiXiMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogJHokIiA8ICIkcHJvZ3BhdGgiID4gL2Rldi9udWxsOyB0aGVuCisJICAgICMgRXZhbHVhdGUgdGhlIGNvbmZpZ3VyYXRpb24uCisJICAgIGV2YWwgImAke1NFRH0gLW4gLWUgJy9eIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAnJHonJC8sL14jICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiAnJHonJC9wJyA8ICRwcm9ncGF0aGAiCisJICAgIENDX3F1b3RlZD0KKwkgICAgZm9yIGFyZyBpbiAkQ0M7IGRvCisJICAgICMgRG91YmxlLXF1b3RlIGFyZ3MgY29udGFpbmluZyBvdGhlciBzaGVsbCBtZXRhY2hhcmFjdGVycy4KKwkgICAgY2FzZSAkYXJnIGluCisJICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCisJICAgICAgYXJnPSJcIiRhcmdcIiIKKwkgICAgICA7OworCSAgICBlc2FjCisJICAgIENDX3F1b3RlZD0iJENDX3F1b3RlZCAkYXJnIgorCSAgZG9uZQorCSAgICBjYXNlICIkQCAiIGluCisJICAgICAgIiAkQ0MgIiogfCAiJENDICIqIHwgIiBgJGVjaG8gJENDYCAiKiB8ICJgJGVjaG8gJENDYCAiKiB8ICIgJENDX3F1b3RlZCIqIHwgIiRDQ19xdW90ZWQgIiogfCAiIGAkZWNobyAkQ0NfcXVvdGVkYCAiKiB8ICJgJGVjaG8gJENDX3F1b3RlZGAgIiopCisJICAgICAgIyBUaGUgY29tcGlsZXIgaW4gdGhlIGJhc2UgY29tcGlsZSBjb21tYW5kIG1hdGNoZXMKKwkgICAgICAjIHRoZSBvbmUgaW4gdGhlIHRhZ2dlZCBjb25maWd1cmF0aW9uLgorCSAgICAgICMgQXNzdW1lIHRoaXMgaXMgdGhlIHRhZ2dlZCBjb25maWd1cmF0aW9uIHdlIHdhbnQuCisJICAgICAgdGFnbmFtZT0kegorCSAgICAgIGJyZWFrCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgZmkKKwlkb25lCisJIyBJZiAkdGFnbmFtZSBzdGlsbCBpc24ndCBzZXQsIHRoZW4gbm8gdGFnZ2VkIGNvbmZpZ3VyYXRpb24KKwkjIHdhcyBmb3VuZCBhbmQgbGV0IHRoZSB1c2VyIGtub3cgdGhhdCB0aGUgIi0tdGFnIiBjb21tYW5kCisJIyBsaW5lIG9wdGlvbiBtdXN0IGJlIHVzZWQuCisJaWYgdGVzdCAteiAiJHRhZ25hbWUiOyB0aGVuCisJICAkZWNobyAiJG1vZGVuYW1lOiB1bmFibGUgdG8gaW5mZXIgdGFnZ2VkIGNvbmZpZ3VyYXRpb24iCisJICAkZWNobyAiJG1vZGVuYW1lOiBzcGVjaWZ5IGEgdGFnIHdpdGggXGAtLXRhZyciIDE+JjIKKwkgIGV4aXQgJEVYSVRfRkFJTFVSRQorIyAgICAgICAgZWxzZQorIyAgICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiB1c2luZyAkdGFnbmFtZSB0YWdnZWQgY29uZmlndXJhdGlvbiIKKwlmaQorCTs7CisgICAgICBlc2FjCisgICAgZmkKK30KKworCisjIGZ1bmNfZXh0cmFjdF9hbl9hcmNoaXZlIGRpciBvbGRsaWIKK2Z1bmNfZXh0cmFjdF9hbl9hcmNoaXZlICgpCit7CisgICAgZl9leF9hbl9hcl9kaXI9IiQxIjsgc2hpZnQKKyAgICBmX2V4X2FuX2FyX29sZGxpYj0iJDEiCisKKyAgICAkc2hvdyAiKGNkICRmX2V4X2FuX2FyX2RpciAmJiAkQVIgeCAkZl9leF9hbl9hcl9vbGRsaWIpIgorICAgICRydW4gZXZhbCAiKGNkIFwkZl9leF9hbl9hcl9kaXIgJiYgJEFSIHggXCRmX2V4X2FuX2FyX29sZGxpYikiIHx8IGV4aXQgJD8KKyAgICBpZiAoJEFSIHQgIiRmX2V4X2FuX2FyX29sZGxpYiIgfCBzb3J0IHwgc29ydCAtdWMgPi9kZXYvbnVsbCAyPiYxKTsgdGhlbgorICAgICA6CisgICAgZWxzZQorICAgICAgJGVjaG8gIiRtb2RlbmFtZTogRVJST1I6IG9iamVjdCBuYW1lIGNvbmZsaWN0czogJGZfZXhfYW5fYXJfZGlyLyRmX2V4X2FuX2FyX29sZGxpYiIgMT4mMgorICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisgICAgZmkKK30KKworIyBmdW5jX2V4dHJhY3RfYXJjaGl2ZXMgZ2VudG9wIG9sZGxpYiAuLi4KK2Z1bmNfZXh0cmFjdF9hcmNoaXZlcyAoKQoreworICAgIG15X2dlbnRvcD0iJDEiOyBzaGlmdAorICAgIG15X29sZGxpYnM9JHsxKyIkQCJ9CisgICAgbXlfb2xkb2Jqcz0iIgorICAgIG15X3hsaWI9IiIKKyAgICBteV94YWJzPSIiCisgICAgbXlfeGRpcj0iIgorICAgIG15X3N0YXR1cz0iIgorCisgICAgJHNob3cgIiR7cm19ciAkbXlfZ2VudG9wIgorICAgICRydW4gJHtybX1yICIkbXlfZ2VudG9wIgorICAgICRzaG93ICIkbWtkaXIgJG15X2dlbnRvcCIKKyAgICAkcnVuICRta2RpciAiJG15X2dlbnRvcCIKKyAgICBteV9zdGF0dXM9JD8KKyAgICBpZiB0ZXN0ICIkbXlfc3RhdHVzIiAtbmUgMCAmJiB0ZXN0ICEgLWQgIiRteV9nZW50b3AiOyB0aGVuCisgICAgICBleGl0ICRteV9zdGF0dXMKKyAgICBmaQorCisgICAgZm9yIG15X3hsaWIgaW4gJG15X29sZGxpYnM7IGRvCisgICAgICAjIEV4dHJhY3QgdGhlIG9iamVjdHMuCisgICAgICBjYXNlICRteV94bGliIGluCisJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBteV94YWJzPSIkbXlfeGxpYiIgOzsKKwkqKSBteV94YWJzPWBwd2RgIi8kbXlfeGxpYiIgOzsKKyAgICAgIGVzYWMKKyAgICAgIG15X3hsaWI9YCRlY2hvICJYJG15X3hsaWIiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKyAgICAgIG15X3hkaXI9IiRteV9nZW50b3AvJG15X3hsaWIiCisKKyAgICAgICRzaG93ICIke3JtfXIgJG15X3hkaXIiCisgICAgICAkcnVuICR7cm19ciAiJG15X3hkaXIiCisgICAgICAkc2hvdyAiJG1rZGlyICRteV94ZGlyIgorICAgICAgJHJ1biAkbWtkaXIgIiRteV94ZGlyIgorICAgICAgZXhpdF9zdGF0dXM9JD8KKyAgICAgIGlmIHRlc3QgIiRleGl0X3N0YXR1cyIgLW5lIDAgJiYgdGVzdCAhIC1kICIkbXlfeGRpciI7IHRoZW4KKwlleGl0ICRleGl0X3N0YXR1cworICAgICAgZmkKKyAgICAgIGNhc2UgJGhvc3QgaW4KKyAgICAgICotZGFyd2luKikKKwkkc2hvdyAiRXh0cmFjdGluZyAkbXlfeGFicyIKKwkjIERvIG5vdCBib3RoZXIgZG9pbmcgYW55dGhpbmcgaWYganVzdCBhIGRyeSBydW4KKwlpZiB0ZXN0IC16ICIkcnVuIjsgdGhlbgorCSAgZGFyd2luX29yaWdfZGlyPWBwd2RgCisJICBjZCAkbXlfeGRpciB8fCBleGl0ICQ/CisJICBkYXJ3aW5fYXJjaGl2ZT0kbXlfeGFicworCSAgZGFyd2luX2N1cmRpcj1gcHdkYAorCSAgZGFyd2luX2Jhc2VfYXJjaGl2ZT1gJGVjaG8gIlgkZGFyd2luX2FyY2hpdmUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKwkgIGRhcndpbl9hcmNoZXM9YGxpcG8gLWluZm8gIiRkYXJ3aW5fYXJjaGl2ZSIgMj4vZGV2L251bGwgfCAkRUdSRVAgQXJjaGl0ZWN0dXJlcyAyPi9kZXYvbnVsbGAKKwkgIGlmIHRlc3QgLW4gIiRkYXJ3aW5fYXJjaGVzIjsgdGhlbiAKKwkgICAgZGFyd2luX2FyY2hlcz1gZWNobyAiJGRhcndpbl9hcmNoZXMiIHwgJFNFRCAtZSAncy8uKmFyZTovLydgCisJICAgIGRhcndpbl9hcmNoPQorCSAgICAkc2hvdyAiJGRhcndpbl9iYXNlX2FyY2hpdmUgaGFzIG11bHRpcGxlIGFyY2hpdGVjdHVyZXMgJGRhcndpbl9hcmNoZXMiCisJICAgIGZvciBkYXJ3aW5fYXJjaCBpbiAgJGRhcndpbl9hcmNoZXMgOyBkbworCSAgICAgIG1rZGlyIC1wICJ1bmZhdC0kJC8ke2Rhcndpbl9iYXNlX2FyY2hpdmV9LSR7ZGFyd2luX2FyY2h9IgorCSAgICAgIGxpcG8gLXRoaW4gJGRhcndpbl9hcmNoIC1vdXRwdXQgInVuZmF0LSQkLyR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0tJHtkYXJ3aW5fYXJjaH0vJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfSIgIiR7ZGFyd2luX2FyY2hpdmV9IgorCSAgICAgIGNkICJ1bmZhdC0kJC8ke2Rhcndpbl9iYXNlX2FyY2hpdmV9LSR7ZGFyd2luX2FyY2h9IgorCSAgICAgIGZ1bmNfZXh0cmFjdF9hbl9hcmNoaXZlICJgcHdkYCIgIiR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0iCisJICAgICAgY2QgIiRkYXJ3aW5fY3VyZGlyIgorCSAgICAgICRybSAidW5mYXQtJCQvJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfS0ke2Rhcndpbl9hcmNofS8ke2Rhcndpbl9iYXNlX2FyY2hpdmV9IgorCSAgICBkb25lICMgJGRhcndpbl9hcmNoZXMKKyAgICAgICMjIE9rYXkgbm93IHdlIGhhdmUgYSBidW5jaCBvZiB0aGluIG9iamVjdHMsIGdvdHRhIGZhdHRlbiB0aGVtIHVwIDopCisJICAgIGRhcndpbl9maWxlbGlzdD1gZmluZCB1bmZhdC0kJCAtdHlwZSBmIC1uYW1lIFwqLm8gLXByaW50IC1vIC1uYW1lIFwqLmxvIC1wcmludHwgeGFyZ3MgYmFzZW5hbWUgfCBzb3J0IC11IHwgJE5MMlNQYAorCSAgICBkYXJ3aW5fZmlsZT0KKwkgICAgZGFyd2luX2ZpbGVzPQorCSAgICBmb3IgZGFyd2luX2ZpbGUgaW4gJGRhcndpbl9maWxlbGlzdDsgZG8KKwkgICAgICBkYXJ3aW5fZmlsZXM9YGZpbmQgdW5mYXQtJCQgLW5hbWUgJGRhcndpbl9maWxlIC1wcmludCB8ICROTDJTUGAKKwkgICAgICBsaXBvIC1jcmVhdGUgLW91dHB1dCAiJGRhcndpbl9maWxlIiAkZGFyd2luX2ZpbGVzCisJICAgIGRvbmUgIyAkZGFyd2luX2ZpbGVsaXN0CisJICAgICR7cm19ciB1bmZhdC0kJAorCSAgICBjZCAiJGRhcndpbl9vcmlnX2RpciIKKwkgIGVsc2UKKwkgICAgY2QgIiRkYXJ3aW5fb3JpZ19kaXIiCisgCSAgICBmdW5jX2V4dHJhY3RfYW5fYXJjaGl2ZSAiJG15X3hkaXIiICIkbXlfeGFicyIKKwkgIGZpICMgJGRhcndpbl9hcmNoZXMKKwlmaSAjICRydW4KKwk7OworICAgICAgKikKKyAgICAgICAgZnVuY19leHRyYWN0X2FuX2FyY2hpdmUgIiRteV94ZGlyIiAiJG15X3hhYnMiCisgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICBteV9vbGRvYmpzPSIkbXlfb2xkb2JqcyAiYGZpbmQgJG15X3hkaXIgLW5hbWUgXCouJG9iamV4dCAtcHJpbnQgLW8gLW5hbWUgXCoubG8gLXByaW50IHwgJE5MMlNQYAorICAgIGRvbmUKKyAgICBmdW5jX2V4dHJhY3RfYXJjaGl2ZXNfcmVzdWx0PSIkbXlfb2xkb2JqcyIKK30KKyMgRW5kIG9mIFNoZWxsIGZ1bmN0aW9uIGRlZmluaXRpb25zCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgRGFyd2luIHN1Y2tzCitldmFsIHN0ZF9zaHJleHQ9XCIkc2hyZXh0X2NtZHNcIgorCitkaXNhYmxlX2xpYnM9bm8KKworIyBQYXJzZSBvdXIgY29tbWFuZCBsaW5lIG9wdGlvbnMgb25jZSwgdGhvcm91Z2hseS4KK3doaWxlIHRlc3QgIiQjIiAtZ3QgMAorZG8KKyAgYXJnPSIkMSIKKyAgc2hpZnQKKworICBjYXNlICRhcmcgaW4KKyAgLSo9Kikgb3B0YXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OworICAqKSBvcHRhcmc9IDs7CisgIGVzYWMKKworICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KKyAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCisgICAgY2FzZSAkcHJldiBpbgorICAgIGV4ZWN1dGVfZGxmaWxlcykKKyAgICAgIGV4ZWN1dGVfZGxmaWxlcz0iJGV4ZWN1dGVfZGxmaWxlcyAkYXJnIgorICAgICAgOzsKKyAgICB0YWcpCisgICAgICB0YWduYW1lPSIkYXJnIgorICAgICAgcHJlc2VydmVfYXJncz0iJHtwcmVzZXJ2ZV9hcmdzfT0kYXJnIgorCisgICAgICAjIENoZWNrIHdoZXRoZXIgdGFnbmFtZSBjb250YWlucyBvbmx5IHZhbGlkIGNoYXJhY3RlcnMKKyAgICAgIGNhc2UgJHRhZ25hbWUgaW4KKyAgICAgICpbIS1fQS1aYS16MC05LC9dKikKKwkkZWNobyAiJHByb2duYW1lOiBpbnZhbGlkIHRhZyBuYW1lOiAkdGFnbmFtZSIgMT4mMgorCWV4aXQgJEVYSVRfRkFJTFVSRQorCTs7CisgICAgICBlc2FjCisKKyAgICAgIGNhc2UgJHRhZ25hbWUgaW4KKyAgICAgIENDKQorCSMgRG9uJ3QgdGVzdCBmb3IgdGhlICJkZWZhdWx0IiBDIHRhZywgYXMgd2Uga25vdywgaXQncyB0aGVyZSwgYnV0CisJIyBub3Qgc3BlY2lhbGx5IG1hcmtlZC4KKwk7OworICAgICAgKikKKwlpZiBncmVwICJeIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZSQiIDwgIiRwcm9ncGF0aCIgPiAvZGV2L251bGw7IHRoZW4KKwkgIHRhZ2xpc3Q9IiR0YWdsaXN0ICR0YWduYW1lIgorCSAgIyBFdmFsdWF0ZSB0aGUgY29uZmlndXJhdGlvbi4KKwkgIGV2YWwgImAke1NFRH0gLW4gLWUgJy9eIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAnJHRhZ25hbWUnJC8sL14jICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiAnJHRhZ25hbWUnJC9wJyA8ICRwcm9ncGF0aGAiCisJZWxzZQorCSAgJGVjaG8gIiRwcm9nbmFtZTogaWdub3JpbmcgdW5rbm93biB0YWcgJHRhZ25hbWUiIDE+JjIKKwlmaQorCTs7CisgICAgICBlc2FjCisgICAgICA7OworICAgICopCisgICAgICBldmFsICIkcHJldj1cJGFyZyIKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgcHJldj0KKyAgICBwcmV2b3B0PQorICAgIGNvbnRpbnVlCisgIGZpCisKKyAgIyBIYXZlIHdlIHNlZW4gYSBub24tb3B0aW9uYWwgYXJndW1lbnQgeWV0PworICBjYXNlICRhcmcgaW4KKyAgLS1oZWxwKQorICAgIHNob3dfaGVscD15ZXMKKyAgICA7OworCisgIC0tdmVyc2lvbikKKyAgICAkZWNobyAiJFBST0dSQU0gKEdOVSAkUEFDS0FHRSkgJFZFUlNJT04kVElNRVNUQU1QIgorICAgICRlY2hvCisgICAgJGVjaG8gIkNvcHlyaWdodCAoQykgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuIgorICAgICRlY2hvICJUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOTyIKKyAgICAkZWNobyAid2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIgorICAgIGV4aXQgJD8KKyAgICA7OworCisgIC0tY29uZmlnKQorICAgICR7U0VEfSAtZSAnMSwvXiMgIyMjIEJFR0lOIExJQlRPT0wgQ09ORklHL2QnIC1lICcvXiMgIyMjIEVORCBMSUJUT09MIENPTkZJRy8sJGQnICRwcm9ncGF0aAorICAgICMgTm93IHByaW50IHRoZSBjb25maWd1cmF0aW9ucyBmb3IgdGhlIHRhZ3MuCisgICAgZm9yIHRhZ25hbWUgaW4gJHRhZ2xpc3Q7IGRvCisgICAgICAke1NFRH0gLW4gLWUgIi9eIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZSQvLC9eIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogJHRhZ25hbWUkL3AiIDwgIiRwcm9ncGF0aCIKKyAgICBkb25lCisgICAgZXhpdCAkPworICAgIDs7CisKKyAgLS1kZWJ1ZykKKyAgICAkZWNobyAiJHByb2duYW1lOiBlbmFibGluZyBzaGVsbCB0cmFjZSBtb2RlIgorICAgIHNldCAteAorICAgIHByZXNlcnZlX2FyZ3M9IiRwcmVzZXJ2ZV9hcmdzICRhcmciCisgICAgOzsKKworICAtLWRyeS1ydW4gfCAtbikKKyAgICBydW49OgorICAgIDs7CisKKyAgLS1mZWF0dXJlcykKKyAgICAkZWNobyAiaG9zdDogJGhvc3QiCisgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KKyAgICAgICRlY2hvICJlbmFibGUgc2hhcmVkIGxpYnJhcmllcyIKKyAgICBlbHNlCisgICAgICAkZWNobyAiZGlzYWJsZSBzaGFyZWQgbGlicmFyaWVzIgorICAgIGZpCisgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorICAgICAgJGVjaG8gImVuYWJsZSBzdGF0aWMgbGlicmFyaWVzIgorICAgIGVsc2UKKyAgICAgICRlY2hvICJkaXNhYmxlIHN0YXRpYyBsaWJyYXJpZXMiCisgICAgZmkKKyAgICBleGl0ICQ/CisgICAgOzsKKworICAtLWZpbmlzaCkgbW9kZT0iZmluaXNoIiA7OworCisgIC0tbW9kZSkgcHJldm9wdD0iLS1tb2RlIiBwcmV2PW1vZGUgOzsKKyAgLS1tb2RlPSopIG1vZGU9IiRvcHRhcmciIDs7CisKKyAgLS1wcmVzZXJ2ZS1kdXAtZGVwcykgZHVwbGljYXRlX2RlcHM9InllcyIgOzsKKworICAtLXF1aWV0IHwgLS1zaWxlbnQpCisgICAgc2hvdz06CisgICAgcHJlc2VydmVfYXJncz0iJHByZXNlcnZlX2FyZ3MgJGFyZyIKKyAgICA7OworCisgIC0tdGFnKQorICAgIHByZXZvcHQ9Ii0tdGFnIgorICAgIHByZXY9dGFnCisgICAgcHJlc2VydmVfYXJncz0iJHByZXNlcnZlX2FyZ3MgLS10YWciCisgICAgOzsKKyAgLS10YWc9KikKKyAgICBzZXQgdGFnICIkb3B0YXJnIiAkezErIiRAIn0KKyAgICBzaGlmdAorICAgIHByZXY9dGFnCisgICAgcHJlc2VydmVfYXJncz0iJHByZXNlcnZlX2FyZ3MgLS10YWciCisgICAgOzsKKworICAtZGxvcGVuKQorICAgIHByZXZvcHQ9Ii1kbG9wZW4iCisgICAgcHJldj1leGVjdXRlX2RsZmlsZXMKKyAgICA7OworCisgIC0qKQorICAgICRlY2hvICIkbW9kZW5hbWU6IHVucmVjb2duaXplZCBvcHRpb24gXGAkYXJnJyIgMT4mMgorICAgICRlY2hvICIkaGVscCIgMT4mMgorICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorICAgIDs7CisKKyAgKikKKyAgICBub25vcHQ9IiRhcmciCisgICAgYnJlYWsKKyAgICA7OworICBlc2FjCitkb25lCisKK2lmIHRlc3QgLW4gIiRwcmV2b3B0IjsgdGhlbgorICAkZWNobyAiJG1vZGVuYW1lOiBvcHRpb24gXGAkcHJldm9wdCcgcmVxdWlyZXMgYW4gYXJndW1lbnQiIDE+JjIKKyAgJGVjaG8gIiRoZWxwIiAxPiYyCisgIGV4aXQgJEVYSVRfRkFJTFVSRQorZmkKKworY2FzZSAkZGlzYWJsZV9saWJzIGluCitubykgCisgIDs7CitzaGFyZWQpCisgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubworICBidWlsZF9vbGRfbGlicz15ZXMKKyAgOzsKK3N0YXRpYykKKyAgYnVpbGRfb2xkX2xpYnM9YGNhc2UgJGJ1aWxkX2xpYnRvb2xfbGlicyBpbiB5ZXMpIGVjaG8gbm87OyAqKSBlY2hvIHllczs7IGVzYWNgCisgIDs7Citlc2FjCisKKyMgSWYgdGhpcyB2YXJpYWJsZSBpcyBzZXQgaW4gYW55IG9mIHRoZSBhY3Rpb25zLCB0aGUgY29tbWFuZCBpbiBpdAorIyB3aWxsIGJlIGV4ZWNlZCBhdCB0aGUgZW5kLiAgVGhpcyBwcmV2ZW50cyBoZXJlLWRvY3VtZW50cyBmcm9tIGJlaW5nCisjIGxlZnQgb3ZlciBieSBzaGVsbHMuCitleGVjX2NtZD0KKworaWYgdGVzdCAteiAiJHNob3dfaGVscCI7IHRoZW4KKworICAjIEluZmVyIHRoZSBvcGVyYXRpb24gbW9kZS4KKyAgaWYgdGVzdCAteiAiJG1vZGUiOyB0aGVuCisgICAgJGVjaG8gIioqKiBXYXJuaW5nOiBpbmZlcnJpbmcgdGhlIG1vZGUgb2Ygb3BlcmF0aW9uIGlzIGRlcHJlY2F0ZWQuIiAxPiYyCisgICAgJGVjaG8gIioqKiBGdXR1cmUgdmVyc2lvbnMgb2YgTGlidG9vbCB3aWxsIHJlcXVpcmUgLS1tb2RlPU1PREUgYmUgc3BlY2lmaWVkLiIgMT4mMgorICAgIGNhc2UgJG5vbm9wdCBpbgorICAgICpjYyB8IGNjKiB8ICorKyB8IGdjYyogfCAqLWdjYyogfCBnKysqIHwgeGxjKikKKyAgICAgIG1vZGU9bGluaworICAgICAgZm9yIGFyZworICAgICAgZG8KKwljYXNlICRhcmcgaW4KKwktYykKKwkgICBtb2RlPWNvbXBpbGUKKwkgICBicmVhaworCSAgIDs7CisJZXNhYworICAgICAgZG9uZQorICAgICAgOzsKKyAgICAqZGIgfCAqZGJ4IHwgKnN0cmFjZSB8ICp0cnVzcykKKyAgICAgIG1vZGU9ZXhlY3V0ZQorICAgICAgOzsKKyAgICAqaW5zdGFsbCp8Y3B8bXYpCisgICAgICBtb2RlPWluc3RhbGwKKyAgICAgIDs7CisgICAgKnJtKQorICAgICAgbW9kZT11bmluc3RhbGwKKyAgICAgIDs7CisgICAgKikKKyAgICAgICMgSWYgd2UgaGF2ZSBubyBtb2RlLCBidXQgZGxmaWxlcyB3ZXJlIHNwZWNpZmllZCwgdGhlbiBkbyBleGVjdXRlIG1vZGUuCisgICAgICB0ZXN0IC1uICIkZXhlY3V0ZV9kbGZpbGVzIiAmJiBtb2RlPWV4ZWN1dGUKKworICAgICAgIyBKdXN0IHVzZSB0aGUgZGVmYXVsdCBvcGVyYXRpb24gbW9kZS4KKyAgICAgIGlmIHRlc3QgLXogIiRtb2RlIjsgdGhlbgorCWlmIHRlc3QgLW4gIiRub25vcHQiOyB0aGVuCisJICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBjYW5ub3QgaW5mZXIgb3BlcmF0aW9uIG1vZGUgZnJvbSBcYCRub25vcHQnIiAxPiYyCisJZWxzZQorCSAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogY2Fubm90IGluZmVyIG9wZXJhdGlvbiBtb2RlIHdpdGhvdXQgTU9ERS1BUkdTIiAxPiYyCisJZmkKKyAgICAgIGZpCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKworICAjIE9ubHkgZXhlY3V0ZSBtb2RlIGlzIGFsbG93ZWQgdG8gaGF2ZSAtZGxvcGVuIGZsYWdzLgorICBpZiB0ZXN0IC1uICIkZXhlY3V0ZV9kbGZpbGVzIiAmJiB0ZXN0ICIkbW9kZSIgIT0gZXhlY3V0ZTsgdGhlbgorICAgICRlY2hvICIkbW9kZW5hbWU6IHVucmVjb2duaXplZCBvcHRpb24gXGAtZGxvcGVuJyIgMT4mMgorICAgICRlY2hvICIkaGVscCIgMT4mMgorICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorICBmaQorCisgICMgQ2hhbmdlIHRoZSBoZWxwIG1lc3NhZ2UgdG8gYSBtb2RlLXNwZWNpZmljIG9uZS4KKyAgZ2VuZXJpY19oZWxwPSIkaGVscCIKKyAgaGVscD0iVHJ5IFxgJG1vZGVuYW1lIC0taGVscCAtLW1vZGU9JG1vZGUnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKKworICAjIFRoZXNlIG1vZGVzIGFyZSBpbiBvcmRlciBvZiBleGVjdXRpb24gZnJlcXVlbmN5IHNvIHRoYXQgdGhleSBydW4gcXVpY2tseS4KKyAgY2FzZSAkbW9kZSBpbgorICAjIGxpYnRvb2wgY29tcGlsZSBtb2RlCisgIGNvbXBpbGUpCisgICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogY29tcGlsZSIKKyAgICAjIEdldCB0aGUgY29tcGlsYXRpb24gY29tbWFuZCBhbmQgdGhlIHNvdXJjZSBmaWxlLgorICAgIGJhc2VfY29tcGlsZT0KKyAgICBzcmNmaWxlPSIkbm9ub3B0IiAgIyAgYWx3YXlzIGtlZXAgYSBub24tZW1wdHkgdmFsdWUgaW4gInNyY2ZpbGUiCisgICAgc3VwcHJlc3Nfb3B0PXllcworICAgIHN1cHByZXNzX291dHB1dD0KKyAgICBhcmdfbW9kZT1ub3JtYWwKKyAgICBsaWJvYmo9CisgICAgbGF0ZXI9CisKKyAgICBmb3IgYXJnCisgICAgZG8KKyAgICAgIGNhc2UgJGFyZ19tb2RlIGluCisgICAgICBhcmcgICkKKwkjIGRvIG5vdCAiY29udGludWUiLiAgSW5zdGVhZCwgYWRkIHRoaXMgdG8gYmFzZV9jb21waWxlCisJbGFzdGFyZz0iJGFyZyIKKwlhcmdfbW9kZT1ub3JtYWwKKwk7OworCisgICAgICB0YXJnZXQgKQorCWxpYm9iaj0iJGFyZyIKKwlhcmdfbW9kZT1ub3JtYWwKKwljb250aW51ZQorCTs7CisKKyAgICAgIG5vcm1hbCApCisJIyBBY2NlcHQgYW55IGNvbW1hbmQtbGluZSBvcHRpb25zLgorCWNhc2UgJGFyZyBpbgorCS1vKQorCSAgaWYgdGVzdCAtbiAiJGxpYm9iaiIgOyB0aGVuCisJICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBjYW5ub3Qgc3BlY2lmeSBcYC1vJyBtb3JlIHRoYW4gb25jZSIgMT4mMgorCSAgICBleGl0ICRFWElUX0ZBSUxVUkUKKwkgIGZpCisJICBhcmdfbW9kZT10YXJnZXQKKwkgIGNvbnRpbnVlCisJICA7OworCisJLXN0YXRpYyB8IC1wcmVmZXItcGljIHwgLXByZWZlci1ub24tcGljKQorCSAgbGF0ZXI9IiRsYXRlciAkYXJnIgorCSAgY29udGludWUKKwkgIDs7CisKKwktbm8tc3VwcHJlc3MpCisJICBzdXBwcmVzc19vcHQ9bm8KKwkgIGNvbnRpbnVlCisJICA7OworCisJLVhjb21waWxlcikKKwkgIGFyZ19tb2RlPWFyZyAgIyAgdGhlIG5leHQgb25lIGdvZXMgaW50byB0aGUgImJhc2VfY29tcGlsZSIgYXJnIGxpc3QKKwkgIGNvbnRpbnVlICAgICAgIyAgVGhlIGN1cnJlbnQgInNyY2ZpbGUiIHdpbGwgZWl0aGVyIGJlIHJldGFpbmVkIG9yCisJICA7OyAgICAgICAgICAgICMgIHJlcGxhY2VkIGxhdGVyLiAgSSB3b3VsZCBndWVzcyB0aGF0IHdvdWxkIGJlIGEgYnVnLgorCisJLVdjLCopCisJICBhcmdzPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgInMvXi1XYywvLyJgCisJICBsYXN0YXJnPQorCSAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JywnCisgCSAgZm9yIGFyZyBpbiAkYXJnczsgZG8KKwkgICAgSUZTPSIkc2F2ZV9pZnMiCisKKwkgICAgIyBEb3VibGUtcXVvdGUgYXJncyBjb250YWluaW5nIG90aGVyIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgorCSAgICAjIE1hbnkgQm91cm5lIHNoZWxscyBjYW5ub3QgaGFuZGxlIGNsb3NlIGJyYWNrZXRzIGNvcnJlY3RseQorCSAgICAjIGluIHNjYW4gc2V0cywgc28gd2Ugc3BlY2lmeSBpdCBzZXBhcmF0ZWx5LgorCSAgICBjYXNlICRhcmcgaW4KKwkgICAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKKwkgICAgICBhcmc9IlwiJGFyZ1wiIgorCSAgICAgIDs7CisJICAgIGVzYWMKKwkgICAgbGFzdGFyZz0iJGxhc3RhcmcgJGFyZyIKKwkgIGRvbmUKKwkgIElGUz0iJHNhdmVfaWZzIgorCSAgbGFzdGFyZz1gJGVjaG8gIlgkbGFzdGFyZyIgfCAkWHNlZCAtZSAicy9eIC8vImAKKworCSAgIyBBZGQgdGhlIGFyZ3VtZW50cyB0byBiYXNlX2NvbXBpbGUuCisJICBiYXNlX2NvbXBpbGU9IiRiYXNlX2NvbXBpbGUgJGxhc3RhcmciCisJICBjb250aW51ZQorCSAgOzsKKworCSogKQorCSAgIyBBY2NlcHQgdGhlIGN1cnJlbnQgYXJndW1lbnQgYXMgdGhlIHNvdXJjZSBmaWxlLgorCSAgIyBUaGUgcHJldmlvdXMgInNyY2ZpbGUiIGJlY29tZXMgdGhlIGN1cnJlbnQgYXJndW1lbnQuCisJICAjCisJICBsYXN0YXJnPSIkc3JjZmlsZSIKKwkgIHNyY2ZpbGU9IiRhcmciCisJICA7OworCWVzYWMgICMgIGNhc2UgJGFyZworCTs7CisgICAgICBlc2FjICAgICMgIGNhc2UgJGFyZ19tb2RlCisKKyAgICAgICMgQWVzdGhldGljYWxseSBxdW90ZSB0aGUgcHJldmlvdXMgYXJndW1lbnQuCisgICAgICBsYXN0YXJnPWAkZWNobyAiWCRsYXN0YXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKworICAgICAgY2FzZSAkbGFzdGFyZyBpbgorICAgICAgIyBEb3VibGUtcXVvdGUgYXJncyBjb250YWluaW5nIG90aGVyIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgorICAgICAgIyBNYW55IEJvdXJuZSBzaGVsbHMgY2Fubm90IGhhbmRsZSBjbG9zZSBicmFja2V0cyBjb3JyZWN0bHkKKyAgICAgICMgaW4gc2NhbiBzZXRzLCBhbmQgc29tZSBTdW5PUyBrc2ggbWlzdHJlYXQgYmFja3NsYXNoLWVzY2FwaW5nCisgICAgICAjIGluIHNjYW4gc2V0cyAod29ya2VkIGFyb3VuZCB3aXRoIHZhcmlhYmxlIGV4cGFuc2lvbiksCisgICAgICAjIGFuZCBmdXJ0aGVybW9yZSBjYW5ub3QgaGFuZGxlICd8JyAnJicgJygnICcpJyBpbiBzY2FuIHNldHMgCisgICAgICAjIGF0IGFsbCwgc28gd2Ugc3BlY2lmeSB0aGVtIHNlcGFyYXRlbHkuCisgICAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKKwlsYXN0YXJnPSJcIiRsYXN0YXJnXCIiCisJOzsKKyAgICAgIGVzYWMKKworICAgICAgYmFzZV9jb21waWxlPSIkYmFzZV9jb21waWxlICRsYXN0YXJnIgorICAgIGRvbmUgIyBmb3IgYXJnCisKKyAgICBjYXNlICRhcmdfbW9kZSBpbgorICAgIGFyZykKKyAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYW4gYXJndW1lbnQgZm9yIC1YY29tcGlsZSIKKyAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorICAgICAgOzsKKyAgICB0YXJnZXQpCisgICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgdGFyZ2V0IHdpdGggXGAtbyciIDE+JjIKKyAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorICAgICAgOzsKKyAgICAqKQorICAgICAgIyBHZXQgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgb2JqZWN0LgorICAgICAgWyAteiAiJGxpYm9iaiIgXSAmJiBsaWJvYmo9YCRlY2hvICJYJHNyY2ZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgIyBSZWNvZ25pemUgc2V2ZXJhbCBkaWZmZXJlbnQgZmlsZSBzdWZmaXhlcy4KKyAgICAjIElmIHRoZSB1c2VyIHNwZWNpZmllcyAtbyBmaWxlLm8sIGl0IGlzIHJlcGxhY2VkIHdpdGggZmlsZS5sbworICAgIHhmb3JtPSdbY0NGU2lmbXNvXScKKyAgICBjYXNlICRsaWJvYmogaW4KKyAgICAqLmFkYSkgeGZvcm09YWRhIDs7CisgICAgKi5hZGIpIHhmb3JtPWFkYiA7OworICAgICouYWRzKSB4Zm9ybT1hZHMgOzsKKyAgICAqLmFzbSkgeGZvcm09YXNtIDs7CisgICAgKi5jKyspIHhmb3JtPWMrKyA7OworICAgICouY2MpIHhmb3JtPWNjIDs7CisgICAgKi5paSkgeGZvcm09aWkgOzsKKyAgICAqLmNsYXNzKSB4Zm9ybT1jbGFzcyA7OworICAgICouY3BwKSB4Zm9ybT1jcHAgOzsKKyAgICAqLmN4eCkgeGZvcm09Y3h4IDs7CisgICAgKi5mOTApIHhmb3JtPWY5MCA7OworICAgICouZm9yKSB4Zm9ybT1mb3IgOzsKKyAgICAqLmphdmEpIHhmb3JtPWphdmEgOzsKKyAgICBlc2FjCisKKyAgICBsaWJvYmo9YCRlY2hvICJYJGxpYm9iaiIgfCAkWHNlZCAtZSAicy9cLiR4Zm9ybSQvLmxvLyJgCisKKyAgICBjYXNlICRsaWJvYmogaW4KKyAgICAqLmxvKSBvYmo9YCRlY2hvICJYJGxpYm9iaiIgfCAkWHNlZCAtZSAiJGxvMm8iYCA7OworICAgICopCisgICAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZGV0ZXJtaW5lIG5hbWUgb2YgbGlicmFyeSBvYmplY3QgZnJvbSBcYCRsaWJvYmonIiAxPiYyCisgICAgICBleGl0ICRFWElUX0ZBSUxVUkUKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgZnVuY19pbmZlcl90YWcgJGJhc2VfY29tcGlsZQorCisgICAgZm9yIGFyZyBpbiAkbGF0ZXI7IGRvCisgICAgICBjYXNlICRhcmcgaW4KKyAgICAgIC1zdGF0aWMpCisJYnVpbGRfb2xkX2xpYnM9eWVzCisJY29udGludWUKKwk7OworCisgICAgICAtcHJlZmVyLXBpYykKKwlwaWNfbW9kZT15ZXMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1wcmVmZXItbm9uLXBpYykKKwlwaWNfbW9kZT1ubworCWNvbnRpbnVlCisJOzsKKyAgICAgIGVzYWMKKyAgICBkb25lCisKKyAgICBxbGlib2JqPWAkZWNobyAiWCRsaWJvYmoiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorICAgIGNhc2UgJHFsaWJvYmogaW4KKyAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQorCXFsaWJvYmo9IlwiJHFsaWJvYmpcIiIgOzsKKyAgICBlc2FjCisgICAgdGVzdCAiWCRsaWJvYmoiICE9ICJYJHFsaWJvYmoiIFwKKwkmJiAkZWNobyAiWCRsaWJvYmoiIHwgZ3JlcCAnW11+I14qe307PD4/IiciJyInIAkmKCl8YCRbXScgXAorCSYmICRlY2hvICIkbW9kZW5hbWU6IGxpYm9iaiBuYW1lIFxgJGxpYm9iaicgbWF5IG5vdCBjb250YWluIHNoZWxsIHNwZWNpYWwgY2hhcmFjdGVycy4iCisgICAgb2JqbmFtZT1gJGVjaG8gIlgkb2JqIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisgICAgeGRpcj1gJGVjaG8gIlgkb2JqIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCisgICAgaWYgdGVzdCAiWCR4ZGlyIiA9ICJYJG9iaiI7IHRoZW4KKyAgICAgIHhkaXI9CisgICAgZWxzZQorICAgICAgeGRpcj0keGRpci8KKyAgICBmaQorICAgIGxvYmo9JHt4ZGlyfSRvYmpkaXIvJG9iam5hbWUKKworICAgIGlmIHRlc3QgLXogIiRiYXNlX2NvbXBpbGUiOyB0aGVuCisgICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgY29tcGlsYXRpb24gY29tbWFuZCIgMT4mMgorICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCisgICAgICBleGl0ICRFWElUX0ZBSUxVUkUKKyAgICBmaQorCisgICAgIyBEZWxldGUgYW55IGxlZnRvdmVyIGxpYnJhcnkgb2JqZWN0cy4KKyAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisgICAgICByZW1vdmVsaXN0PSIkb2JqICRsb2JqICRsaWJvYmogJHtsaWJvYmp9VCIKKyAgICBlbHNlCisgICAgICByZW1vdmVsaXN0PSIkbG9iaiAkbGlib2JqICR7bGlib2JqfVQiCisgICAgZmkKKworICAgICRydW4gJHJtICRyZW1vdmVsaXN0CisgICAgdHJhcCAiJHJ1biAkcm0gJHJlbW92ZWxpc3Q7IGV4aXQgJEVYSVRfRkFJTFVSRSIgMSAyIDE1CisKKyAgICAjIE9uIEN5Z3dpbiB0aGVyZSdzIG5vICJyZWFsIiBQSUMgZmxhZyBzbyB3ZSBtdXN0IGJ1aWxkIGJvdGggb2JqZWN0IHR5cGVzCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IG9zMiopCisgICAgICBwaWNfbW9kZT1kZWZhdWx0CisgICAgICA7OworICAgIGVzYWMKKyAgICBpZiB0ZXN0ICIkcGljX21vZGUiID0gbm8gJiYgdGVzdCAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiAhPSBwYXNzX2FsbDsgdGhlbgorICAgICAgIyBub24tUElDIGNvZGUgaW4gc2hhcmVkIGxpYnJhcmllcyBpcyBub3Qgc3VwcG9ydGVkCisgICAgICBwaWNfbW9kZT1kZWZhdWx0CisgICAgZmkKKworICAgICMgQ2FsY3VsYXRlIHRoZSBmaWxlbmFtZSBvZiB0aGUgb3V0cHV0IG9iamVjdCBpZiBjb21waWxlciBkb2VzCisgICAgIyBub3Qgc3VwcG9ydCAtbyB3aXRoIC1jCisgICAgaWYgdGVzdCAiJGNvbXBpbGVyX2NfbyIgPSBubzsgdGhlbgorICAgICAgb3V0cHV0X29iaj1gJGVjaG8gIlgkc3JjZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnIC1lICdzJVwuW14uXSokJSUnYC4ke29iamV4dH0KKyAgICAgIGxvY2tmaWxlPSIkb3V0cHV0X29iai5sb2NrIgorICAgICAgcmVtb3ZlbGlzdD0iJHJlbW92ZWxpc3QgJG91dHB1dF9vYmogJGxvY2tmaWxlIgorICAgICAgdHJhcCAiJHJ1biAkcm0gJHJlbW92ZWxpc3Q7IGV4aXQgJEVYSVRfRkFJTFVSRSIgMSAyIDE1CisgICAgZWxzZQorICAgICAgb3V0cHV0X29iaj0KKyAgICAgIG5lZWRfbG9ja3M9bm8KKyAgICAgIGxvY2tmaWxlPQorICAgIGZpCisKKyAgICAjIExvY2sgdGhpcyBjcml0aWNhbCBzZWN0aW9uIGlmIGl0IGlzIG5lZWRlZAorICAgICMgV2UgdXNlIHRoaXMgc2NyaXB0IGZpbGUgdG8gbWFrZSB0aGUgbGluaywgaXQgYXZvaWRzIGNyZWF0aW5nIGEgbmV3IGZpbGUKKyAgICBpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgPSB5ZXM7IHRoZW4KKyAgICAgIHVudGlsICRydW4gbG4gIiRwcm9ncGF0aCIgIiRsb2NrZmlsZSIgMj4vZGV2L251bGw7IGRvCisJJHNob3cgIldhaXRpbmcgZm9yICRsb2NrZmlsZSB0byBiZSByZW1vdmVkIgorCXNsZWVwIDIKKyAgICAgIGRvbmUKKyAgICBlbGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHdhcm47IHRoZW4KKyAgICAgIGlmIHRlc3QgLWYgIiRsb2NrZmlsZSI7IHRoZW4KKwkkZWNobyAiXAorKioqIEVSUk9SLCAkbG9ja2ZpbGUgZXhpc3RzIGFuZCBjb250YWluczoKK2BjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYAorCitUaGlzIGluZGljYXRlcyB0aGF0IGFub3RoZXIgcHJvY2VzcyBpcyB0cnlpbmcgdG8gdXNlIHRoZSBzYW1lCit0ZW1wb3Jhcnkgb2JqZWN0IGZpbGUsIGFuZCBsaWJ0b29sIGNvdWxkIG5vdCB3b3JrIGFyb3VuZCBpdCBiZWNhdXNlCit5b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgXGAtYycgYW5kIFxgLW8nIHRvZ2V0aGVyLiAgSWYgeW91CityZXBlYXQgdGhpcyBjb21waWxhdGlvbiwgaXQgbWF5IHN1Y2NlZWQsIGJ5IGNoYW5jZSwgYnV0IHlvdSBoYWQgYmV0dGVyCithdm9pZCBwYXJhbGxlbCBidWlsZHMgKG1ha2UgLWopIGluIHRoaXMgcGxhdGZvcm0sIG9yIGdldCBhIGJldHRlcgorY29tcGlsZXIuIgorCisJJHJ1biAkcm0gJHJlbW92ZWxpc3QKKwlleGl0ICRFWElUX0ZBSUxVUkUKKyAgICAgIGZpCisgICAgICAkZWNobyAiJHNyY2ZpbGUiID4gIiRsb2NrZmlsZSIKKyAgICBmaQorCisgICAgaWYgdGVzdCAtbiAiJGZpeF9zcmNmaWxlX3BhdGgiOyB0aGVuCisgICAgICBldmFsIHNyY2ZpbGU9XCIkZml4X3NyY2ZpbGVfcGF0aFwiCisgICAgZmkKKyAgICBxc3JjZmlsZT1gJGVjaG8gIlgkc3JjZmlsZSIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisgICAgY2FzZSAkcXNyY2ZpbGUgaW4KKyAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQorICAgICAgcXNyY2ZpbGU9IlwiJHFzcmNmaWxlXCIiIDs7CisgICAgZXNhYworCisgICAgJHJ1biAkcm0gIiRsaWJvYmoiICIke2xpYm9ian1UIgorCisgICAgIyBDcmVhdGUgYSBsaWJ0b29sIG9iamVjdCBmaWxlIChhbmFsb2dvdXMgdG8gYSAiLmxhIiBmaWxlKSwKKyAgICAjIGJ1dCBkb24ndCBjcmVhdGUgaXQgaWYgd2UncmUgZG9pbmcgYSBkcnkgcnVuLgorICAgIHRlc3QgLXogIiRydW4iICYmIGNhdCA+ICR7bGlib2JqfVQgPDxFT0YKKyMgJGxpYm9iaiAtIGEgbGlidG9vbCBvYmplY3QgZmlsZQorIyBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gLSBHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QCisjCisjIFBsZWFzZSBETyBOT1QgZGVsZXRlIHRoaXMgZmlsZSEKKyMgSXQgaXMgbmVjZXNzYXJ5IGZvciBsaW5raW5nIHRoZSBsaWJyYXJ5LgorCisjIE5hbWUgb2YgdGhlIFBJQyBvYmplY3QuCitFT0YKKworICAgICMgT25seSBidWlsZCBhIFBJQyBvYmplY3QgaWYgd2UgYXJlIGJ1aWxkaW5nIGxpYnRvb2wgbGlicmFyaWVzLgorICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCisgICAgICAjIFdpdGhvdXQgdGhpcyBhc3NpZ25tZW50LCBiYXNlX2NvbXBpbGUgZ2V0cyBlbXB0aWVkLgorICAgICAgZmJzZF9oaWRlb3VzX3NoX2J1Zz0kYmFzZV9jb21waWxlCisKKyAgICAgIGlmIHRlc3QgIiRwaWNfbW9kZSIgIT0gbm87IHRoZW4KKwljb21tYW5kPSIkYmFzZV9jb21waWxlICRxc3JjZmlsZSAkcGljX2ZsYWciCisgICAgICBlbHNlCisJIyBEb24ndCBidWlsZCBQSUMgY29kZQorCWNvbW1hbmQ9IiRiYXNlX2NvbXBpbGUgJHFzcmNmaWxlIgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAhIC1kICIke3hkaXJ9JG9iamRpciI7IHRoZW4KKwkkc2hvdyAiJG1rZGlyICR7eGRpcn0kb2JqZGlyIgorCSRydW4gJG1rZGlyICR7eGRpcn0kb2JqZGlyCisJZXhpdF9zdGF0dXM9JD8KKwlpZiB0ZXN0ICIkZXhpdF9zdGF0dXMiIC1uZSAwICYmIHRlc3QgISAtZCAiJHt4ZGlyfSRvYmpkaXIiOyB0aGVuCisJICBleGl0ICRleGl0X3N0YXR1cworCWZpCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC16ICIkb3V0cHV0X29iaiI7IHRoZW4KKwkjIFBsYWNlIFBJQyBvYmplY3RzIGluICRvYmpkaXIKKwljb21tYW5kPSIkY29tbWFuZCAtbyAkbG9iaiIKKyAgICAgIGZpCisKKyAgICAgICRydW4gJHJtICIkbG9iaiIgIiRvdXRwdXRfb2JqIgorCisgICAgICAkc2hvdyAiJGNvbW1hbmQiCisgICAgICBpZiAkcnVuIGV2YWwgIiRjb21tYW5kIjsgdGhlbiA6CisgICAgICBlbHNlCisJdGVzdCAtbiAiJG91dHB1dF9vYmoiICYmICRydW4gJHJtICRyZW1vdmVsaXN0CisJZXhpdCAkRVhJVF9GQUlMVVJFCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgPSB3YXJuICYmCisJIHRlc3QgIlhgY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAiICE9ICJYJHNyY2ZpbGUiOyB0aGVuCisJJGVjaG8gIlwKKyoqKiBFUlJPUiwgJGxvY2tmaWxlIGNvbnRhaW5zOgorYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgCisKK2J1dCBpdCBzaG91bGQgY29udGFpbjoKKyRzcmNmaWxlCisKK1RoaXMgaW5kaWNhdGVzIHRoYXQgYW5vdGhlciBwcm9jZXNzIGlzIHRyeWluZyB0byB1c2UgdGhlIHNhbWUKK3RlbXBvcmFyeSBvYmplY3QgZmlsZSwgYW5kIGxpYnRvb2wgY291bGQgbm90IHdvcmsgYXJvdW5kIGl0IGJlY2F1c2UKK3lvdXIgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBcYC1jJyBhbmQgXGAtbycgdG9nZXRoZXIuICBJZiB5b3UKK3JlcGVhdCB0aGlzIGNvbXBpbGF0aW9uLCBpdCBtYXkgc3VjY2VlZCwgYnkgY2hhbmNlLCBidXQgeW91IGhhZCBiZXR0ZXIKK2F2b2lkIHBhcmFsbGVsIGJ1aWxkcyAobWFrZSAtaikgaW4gdGhpcyBwbGF0Zm9ybSwgb3IgZ2V0IGEgYmV0dGVyCitjb21waWxlci4iCisKKwkkcnVuICRybSAkcmVtb3ZlbGlzdAorCWV4aXQgJEVYSVRfRkFJTFVSRQorICAgICAgZmkKKworICAgICAgIyBKdXN0IG1vdmUgdGhlIG9iamVjdCBpZiBuZWVkZWQsIHRoZW4gZ28gb24gdG8gY29tcGlsZSB0aGUgbmV4dCBvbmUKKyAgICAgIGlmIHRlc3QgLW4gIiRvdXRwdXRfb2JqIiAmJiB0ZXN0ICJYJG91dHB1dF9vYmoiICE9ICJYJGxvYmoiOyB0aGVuCisJJHNob3cgIiRtdiAkb3V0cHV0X29iaiAkbG9iaiIKKwlpZiAkcnVuICRtdiAkb3V0cHV0X29iaiAkbG9iajsgdGhlbiA6CisJZWxzZQorCSAgZXJyb3I9JD8KKwkgICRydW4gJHJtICRyZW1vdmVsaXN0CisJICBleGl0ICRlcnJvcgorCWZpCisgICAgICBmaQorCisgICAgICAjIEFwcGVuZCB0aGUgbmFtZSBvZiB0aGUgUElDIG9iamVjdCB0byB0aGUgbGlidG9vbCBvYmplY3QgZmlsZS4KKyAgICAgIHRlc3QgLXogIiRydW4iICYmIGNhdCA+PiAke2xpYm9ian1UIDw8RU9GCitwaWNfb2JqZWN0PSckb2JqZGlyLyRvYmpuYW1lJworCitFT0YKKworICAgICAgIyBBbGxvdyBlcnJvciBtZXNzYWdlcyBvbmx5IGZyb20gdGhlIGZpcnN0IGNvbXBpbGF0aW9uLgorICAgICAgaWYgdGVzdCAiJHN1cHByZXNzX29wdCIgPSB5ZXM7IHRoZW4KKyAgICAgICAgc3VwcHJlc3Nfb3V0cHV0PScgPi9kZXYvbnVsbCAyPiYxJworICAgICAgZmkKKyAgICBlbHNlCisgICAgICAjIE5vIFBJQyBvYmplY3Qgc28gaW5kaWNhdGUgaXQgZG9lc24ndCBleGlzdCBpbiB0aGUgbGlidG9vbAorICAgICAgIyBvYmplY3QgZmlsZS4KKyAgICAgIHRlc3QgLXogIiRydW4iICYmIGNhdCA+PiAke2xpYm9ian1UIDw8RU9GCitwaWNfb2JqZWN0PW5vbmUKKworRU9GCisgICAgZmkKKworICAgICMgT25seSBidWlsZCBhIHBvc2l0aW9uLWRlcGVuZGVudCBvYmplY3QgaWYgd2UgYnVpbGQgb2xkIGxpYnJhcmllcy4KKyAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkcGljX21vZGUiICE9IHllczsgdGhlbgorCSMgRG9uJ3QgYnVpbGQgUElDIGNvZGUKKwljb21tYW5kPSIkYmFzZV9jb21waWxlICRxc3JjZmlsZSIKKyAgICAgIGVsc2UKKwljb21tYW5kPSIkYmFzZV9jb21waWxlICRxc3JjZmlsZSAkcGljX2ZsYWciCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJGNvbXBpbGVyX2NfbyIgPSB5ZXM7IHRoZW4KKwljb21tYW5kPSIkY29tbWFuZCAtbyAkb2JqIgorICAgICAgZmkKKworICAgICAgIyBTdXBwcmVzcyBjb21waWxlciBvdXRwdXQgaWYgd2UgYWxyZWFkeSBkaWQgYSBQSUMgY29tcGlsYXRpb24uCisgICAgICBjb21tYW5kPSIkY29tbWFuZCRzdXBwcmVzc19vdXRwdXQiCisgICAgICAkcnVuICRybSAiJG9iaiIgIiRvdXRwdXRfb2JqIgorICAgICAgJHNob3cgIiRjb21tYW5kIgorICAgICAgaWYgJHJ1biBldmFsICIkY29tbWFuZCI7IHRoZW4gOgorICAgICAgZWxzZQorCSRydW4gJHJtICRyZW1vdmVsaXN0CisJZXhpdCAkRVhJVF9GQUlMVVJFCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgPSB3YXJuICYmCisJIHRlc3QgIlhgY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAiICE9ICJYJHNyY2ZpbGUiOyB0aGVuCisJJGVjaG8gIlwKKyoqKiBFUlJPUiwgJGxvY2tmaWxlIGNvbnRhaW5zOgorYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgCisKK2J1dCBpdCBzaG91bGQgY29udGFpbjoKKyRzcmNmaWxlCisKK1RoaXMgaW5kaWNhdGVzIHRoYXQgYW5vdGhlciBwcm9jZXNzIGlzIHRyeWluZyB0byB1c2UgdGhlIHNhbWUKK3RlbXBvcmFyeSBvYmplY3QgZmlsZSwgYW5kIGxpYnRvb2wgY291bGQgbm90IHdvcmsgYXJvdW5kIGl0IGJlY2F1c2UKK3lvdXIgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBcYC1jJyBhbmQgXGAtbycgdG9nZXRoZXIuICBJZiB5b3UKK3JlcGVhdCB0aGlzIGNvbXBpbGF0aW9uLCBpdCBtYXkgc3VjY2VlZCwgYnkgY2hhbmNlLCBidXQgeW91IGhhZCBiZXR0ZXIKK2F2b2lkIHBhcmFsbGVsIGJ1aWxkcyAobWFrZSAtaikgaW4gdGhpcyBwbGF0Zm9ybSwgb3IgZ2V0IGEgYmV0dGVyCitjb21waWxlci4iCisKKwkkcnVuICRybSAkcmVtb3ZlbGlzdAorCWV4aXQgJEVYSVRfRkFJTFVSRQorICAgICAgZmkKKworICAgICAgIyBKdXN0IG1vdmUgdGhlIG9iamVjdCBpZiBuZWVkZWQKKyAgICAgIGlmIHRlc3QgLW4gIiRvdXRwdXRfb2JqIiAmJiB0ZXN0ICJYJG91dHB1dF9vYmoiICE9ICJYJG9iaiI7IHRoZW4KKwkkc2hvdyAiJG12ICRvdXRwdXRfb2JqICRvYmoiCisJaWYgJHJ1biAkbXYgJG91dHB1dF9vYmogJG9iajsgdGhlbiA6CisJZWxzZQorCSAgZXJyb3I9JD8KKwkgICRydW4gJHJtICRyZW1vdmVsaXN0CisJICBleGl0ICRlcnJvcgorCWZpCisgICAgICBmaQorCisgICAgICAjIEFwcGVuZCB0aGUgbmFtZSBvZiB0aGUgbm9uLVBJQyBvYmplY3QgdGhlIGxpYnRvb2wgb2JqZWN0IGZpbGUuCisgICAgICAjIE9ubHkgYXBwZW5kIGlmIHRoZSBsaWJ0b29sIG9iamVjdCBmaWxlIGV4aXN0cy4KKyAgICAgIHRlc3QgLXogIiRydW4iICYmIGNhdCA+PiAke2xpYm9ian1UIDw8RU9GCisjIE5hbWUgb2YgdGhlIG5vbi1QSUMgb2JqZWN0Lgorbm9uX3BpY19vYmplY3Q9JyRvYmpuYW1lJworCitFT0YKKyAgICBlbHNlCisgICAgICAjIEFwcGVuZCB0aGUgbmFtZSBvZiB0aGUgbm9uLVBJQyBvYmplY3QgdGhlIGxpYnRvb2wgb2JqZWN0IGZpbGUuCisgICAgICAjIE9ubHkgYXBwZW5kIGlmIHRoZSBsaWJ0b29sIG9iamVjdCBmaWxlIGV4aXN0cy4KKyAgICAgIHRlc3QgLXogIiRydW4iICYmIGNhdCA+PiAke2xpYm9ian1UIDw8RU9GCisjIE5hbWUgb2YgdGhlIG5vbi1QSUMgb2JqZWN0Lgorbm9uX3BpY19vYmplY3Q9bm9uZQorCitFT0YKKyAgICBmaQorCisgICAgJHJ1biAkbXYgIiR7bGlib2JqfVQiICIke2xpYm9ian0iCisKKyAgICAjIFVubG9jayB0aGUgY3JpdGljYWwgc2VjdGlvbiBpZiBpdCB3YXMgbG9ja2VkCisgICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiICE9IG5vOyB0aGVuCisgICAgICAkcnVuICRybSAiJGxvY2tmaWxlIgorICAgIGZpCisKKyAgICBleGl0ICRFWElUX1NVQ0NFU1MKKyAgICA7OworCisgICMgbGlidG9vbCBsaW5rIG1vZGUKKyAgbGluayB8IHJlbGluaykKKyAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiBsaW5rIgorICAgIGNhc2UgJGhvc3QgaW4KKyAgICAqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKikKKyAgICAgICMgSXQgaXMgaW1wb3NzaWJsZSB0byBsaW5rIGEgZGxsIHdpdGhvdXQgdGhpcyBzZXR0aW5nLCBhbmQKKyAgICAgICMgd2Ugc2hvdWxkbid0IGZvcmNlIHRoZSBtYWtlZmlsZSBtYWludGFpbmVyIHRvIGZpZ3VyZSBvdXQKKyAgICAgICMgd2hpY2ggc3lzdGVtIHdlIGFyZSBjb21waWxpbmcgZm9yIGluIG9yZGVyIHRvIHBhc3MgYW4gZXh0cmEKKyAgICAgICMgZmxhZyBmb3IgZXZlcnkgbGlidG9vbCBpbnZvY2F0aW9uLgorICAgICAgIyBhbGxvd191bmRlZmluZWQ9bm8KKworICAgICAgIyBGSVhNRTogVW5mb3J0dW5hdGVseSwgdGhlcmUgYXJlIHByb2JsZW1zIHdpdGggdGhlIGFib3ZlIHdoZW4gdHJ5aW5nCisgICAgICAjIHRvIG1ha2UgYSBkbGwgd2hpY2ggaGFzIHVuZGVmaW5lZCBzeW1ib2xzLCBpbiB3aGljaCBjYXNlIG5vdAorICAgICAgIyBldmVuIGEgc3RhdGljIGxpYnJhcnkgaXMgYnVpbHQuICBGb3Igbm93LCB3ZSBuZWVkIHRvIHNwZWNpZnkKKyAgICAgICMgLW5vLXVuZGVmaW5lZCBvbiB0aGUgbGlidG9vbCBsaW5rIGxpbmUgd2hlbiB3ZSBjYW4gYmUgY2VydGFpbgorICAgICAgIyB0aGF0IGFsbCBzeW1ib2xzIGFyZSBzYXRpc2ZpZWQsIG90aGVyd2lzZSB3ZSBnZXQgYSBzdGF0aWMgbGlicmFyeS4KKyAgICAgIGFsbG93X3VuZGVmaW5lZD15ZXMKKyAgICAgIDs7CisgICAgKikKKyAgICAgIGFsbG93X3VuZGVmaW5lZD15ZXMKKyAgICAgIDs7CisgICAgZXNhYworICAgIGxpYnRvb2xfYXJncz0iJG5vbm9wdCIKKyAgICBiYXNlX2NvbXBpbGU9IiRub25vcHQgJEAiCisgICAgY29tcGlsZV9jb21tYW5kPSIkbm9ub3B0IgorICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRub25vcHQiCisKKyAgICBjb21waWxlX3JwYXRoPQorICAgIGZpbmFsaXplX3JwYXRoPQorICAgIGNvbXBpbGVfc2hsaWJwYXRoPQorICAgIGZpbmFsaXplX3NobGlicGF0aD0KKyAgICBjb252ZW5pZW5jZT0KKyAgICBvbGRfY29udmVuaWVuY2U9CisgICAgZGVwbGlicz0KKyAgICBvbGRfZGVwbGlicz0KKyAgICBjb21waWxlcl9mbGFncz0KKyAgICBsaW5rZXJfZmxhZ3M9CisgICAgZGxsc2VhcmNocGF0aD0KKyAgICBsaWJfc2VhcmNoX3BhdGg9YHB3ZGAKKyAgICBpbnN0X3ByZWZpeF9kaXI9CisKKyAgICBhdm9pZF92ZXJzaW9uPW5vCisgICAgZGxmaWxlcz0KKyAgICBkbHByZWZpbGVzPQorICAgIGRsc2VsZj1ubworICAgIGV4cG9ydF9keW5hbWljPW5vCisgICAgZXhwb3J0X3N5bWJvbHM9CisgICAgZXhwb3J0X3N5bWJvbHNfcmVnZXg9CisgICAgZ2VuZXJhdGVkPQorICAgIGxpYm9ianM9CisgICAgbHRsaWJzPQorICAgIG1vZHVsZT1ubworICAgIG5vX2luc3RhbGw9bm8KKyAgICBvYmpzPQorICAgIG5vbl9waWNfb2JqZWN0cz0KKyAgICBub3RpbnN0X3BhdGg9ICMgcGF0aHMgdGhhdCBjb250YWluIG5vdC1pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMKKyAgICBwcmVjaW91c19maWxlc19yZWdleD0KKyAgICBwcmVmZXJfc3RhdGljX2xpYnM9bm8KKyAgICBwcmVsb2FkPW5vCisgICAgcHJldj0KKyAgICBwcmV2YXJnPQorICAgIHJlbGVhc2U9CisgICAgcnBhdGg9CisgICAgeHJwYXRoPQorICAgIHBlcm1fcnBhdGg9CisgICAgdGVtcF9ycGF0aD0KKyAgICB0aHJlYWRfc2FmZT1ubworICAgIHZpbmZvPQorICAgIHZpbmZvX251bWJlcj1ubworCisgICAgZnVuY19pbmZlcl90YWcgJGJhc2VfY29tcGlsZQorCisgICAgIyBXZSBuZWVkIHRvIGtub3cgLXN0YXRpYywgdG8gZ2V0IHRoZSByaWdodCBvdXRwdXQgZmlsZW5hbWVzLgorICAgIGZvciBhcmcKKyAgICBkbworICAgICAgY2FzZSAkYXJnIGluCisgICAgICAtYWxsLXN0YXRpYyB8IC1zdGF0aWMpCisJaWYgdGVzdCAiWCRhcmciID0gIlgtYWxsLXN0YXRpYyI7IHRoZW4KKwkgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzICYmIHRlc3QgLXogIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgorCSAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBjb21wbGV0ZSBzdGF0aWMgbGlua2luZyBpcyBpbXBvc3NpYmxlIGluIHRoaXMgY29uZmlndXJhdGlvbiIgMT4mMgorCSAgZmkKKwkgIGlmIHRlc3QgLW4gIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgorCSAgICBkbG9wZW5fc2VsZj0kZGxvcGVuX3NlbGZfc3RhdGljCisJICBmaQorCSAgcHJlZmVyX3N0YXRpY19saWJzPXllcworCWVsc2UKKwkgIGlmIHRlc3QgLXogIiRwaWNfZmxhZyIgJiYgdGVzdCAtbiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCisJICAgIGRsb3Blbl9zZWxmPSRkbG9wZW5fc2VsZl9zdGF0aWMKKwkgIGZpCisJICBwcmVmZXJfc3RhdGljX2xpYnM9YnVpbHQKKwlmaQorCWJ1aWxkX2xpYnRvb2xfbGlicz1ubworCWJ1aWxkX29sZF9saWJzPXllcworCWJyZWFrCisJOzsKKyAgICAgIGVzYWMKKyAgICBkb25lCisKKyAgICAjIFNlZSBpZiBvdXIgc2hhcmVkIGFyY2hpdmVzIGRlcGVuZCBvbiBzdGF0aWMgYXJjaGl2ZXMuCisgICAgdGVzdCAtbiAiJG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMiICYmIGJ1aWxkX29sZF9saWJzPXllcworCisgICAgIyBHbyB0aHJvdWdoIHRoZSBhcmd1bWVudHMsIHRyYW5zZm9ybWluZyB0aGVtIG9uIHRoZSB3YXkuCisgICAgd2hpbGUgdGVzdCAiJCMiIC1ndCAwOyBkbworICAgICAgYXJnPSIkMSIKKyAgICAgIHNoaWZ0CisgICAgICBjYXNlICRhcmcgaW4KKyAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQorCXFhcmc9XCJgJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImBcIiAjIyMgdGVzdHN1aXRlOiBza2lwIG5lc3RlZCBxdW90aW5nIHRlc3QKKwk7OworICAgICAgKikgcWFyZz0kYXJnIDs7CisgICAgICBlc2FjCisgICAgICBsaWJ0b29sX2FyZ3M9IiRsaWJ0b29sX2FyZ3MgJHFhcmciCisKKyAgICAgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgorICAgICAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCisJY2FzZSAkcHJldiBpbgorCW91dHB1dCkKKwkgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCBAT1VUUFVUQCIKKwkgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kIEBPVVRQVVRAIgorCSAgOzsKKwllc2FjCisKKwljYXNlICRwcmV2IGluCisJZGxmaWxlc3xkbHByZWZpbGVzKQorCSAgaWYgdGVzdCAiJHByZWxvYWQiID0gbm87IHRoZW4KKwkgICAgIyBBZGQgdGhlIHN5bWJvbCBvYmplY3QgaW50byB0aGUgbGlua2luZyBjb21tYW5kcy4KKwkgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIEBTWU1GSUxFQCIKKwkgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgQFNZTUZJTEVAIgorCSAgICBwcmVsb2FkPXllcworCSAgZmkKKwkgIGNhc2UgJGFyZyBpbgorCSAgKi5sYSB8ICoubG8pIDs7ICAjIFdlIGhhbmRsZSB0aGVzZSBjYXNlcyBiZWxvdy4KKwkgIGZvcmNlKQorCSAgICBpZiB0ZXN0ICIkZGxzZWxmIiA9IG5vOyB0aGVuCisJICAgICAgZGxzZWxmPW5lZWRsZXNzCisJICAgICAgZXhwb3J0X2R5bmFtaWM9eWVzCisJICAgIGZpCisJICAgIHByZXY9CisJICAgIGNvbnRpbnVlCisJICAgIDs7CisJICBzZWxmKQorCSAgICBpZiB0ZXN0ICIkcHJldiIgPSBkbHByZWZpbGVzOyB0aGVuCisJICAgICAgZGxzZWxmPXllcworCSAgICBlbGlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXMgJiYgdGVzdCAiJGRsb3Blbl9zZWxmIiAhPSB5ZXM7IHRoZW4KKwkgICAgICBkbHNlbGY9eWVzCisJICAgIGVsc2UKKwkgICAgICBkbHNlbGY9bmVlZGxlc3MKKwkgICAgICBleHBvcnRfZHluYW1pYz15ZXMKKwkgICAgZmkKKwkgICAgcHJldj0KKwkgICAgY29udGludWUKKwkgICAgOzsKKwkgICopCisJICAgIGlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXM7IHRoZW4KKwkgICAgICBkbGZpbGVzPSIkZGxmaWxlcyAkYXJnIgorCSAgICBlbHNlCisJICAgICAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJGFyZyIKKwkgICAgZmkKKwkgICAgcHJldj0KKwkgICAgY29udGludWUKKwkgICAgOzsKKwkgIGVzYWMKKwkgIDs7CisJZXhwc3ltcykKKwkgIGV4cG9ydF9zeW1ib2xzPSIkYXJnIgorCSAgaWYgdGVzdCAhIC1mICIkYXJnIjsgdGhlbgorCSAgICAkZWNobyAiJG1vZGVuYW1lOiBzeW1ib2wgZmlsZSBcYCRhcmcnIGRvZXMgbm90IGV4aXN0IgorCSAgICBleGl0ICRFWElUX0ZBSUxVUkUKKwkgIGZpCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJZXhwc3ltc19yZWdleCkKKwkgIGV4cG9ydF9zeW1ib2xzX3JlZ2V4PSIkYXJnIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCWluc3RfcHJlZml4KQorCSAgaW5zdF9wcmVmaXhfZGlyPSIkYXJnIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCXByZWNpb3VzX3JlZ2V4KQorCSAgcHJlY2lvdXNfZmlsZXNfcmVnZXg9IiRhcmciCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJcmVsZWFzZSkKKwkgIHJlbGVhc2U9Ii0kYXJnIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCW9iamVjdGxpc3QpCisJICBpZiB0ZXN0IC1mICIkYXJnIjsgdGhlbgorCSAgICBzYXZlX2FyZz0kYXJnCisJICAgIG1vcmVhcmdzPQorCSAgICBmb3IgZmlsIGluIGBjYXQgJHNhdmVfYXJnYAorCSAgICBkbworIwkgICAgICBtb3JlYXJncz0iJG1vcmVhcmdzICRmaWwiCisJICAgICAgYXJnPSRmaWwKKwkgICAgICAjIEEgbGlidG9vbC1jb250cm9sbGVkIG9iamVjdC4KKworCSAgICAgICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIG9iamVjdC4KKwkgICAgICBpZiAoJHtTRUR9IC1lICcycScgJGFyZyB8IGdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJCXBpY19vYmplY3Q9CisJCW5vbl9waWNfb2JqZWN0PQorCisJCSMgUmVhZCB0aGUgLmxvIGZpbGUKKwkJIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCisJCWNhc2UgJGFyZyBpbgorCQkqLyogfCAqXFwqKSAuICRhcmcgOzsKKwkJKikgLiAuLyRhcmcgOzsKKwkJZXNhYworCisJCWlmIHRlc3QgLXogIiRwaWNfb2JqZWN0IiB8fCBcCisJCSAgIHRlc3QgLXogIiRub25fcGljX29iamVjdCIgfHwKKwkJICAgdGVzdCAiJHBpY19vYmplY3QiID0gbm9uZSAmJiBcCisJCSAgIHRlc3QgIiRub25fcGljX29iamVjdCIgPSBub25lOyB0aGVuCisJCSAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGZpbmQgbmFtZSBvZiBvYmplY3QgZm9yIFxgJGFyZyciIDE+JjIKKwkJICBleGl0ICRFWElUX0ZBSUxVUkUKKwkJZmkKKworCQkjIEV4dHJhY3Qgc3ViZGlyZWN0b3J5IGZyb20gdGhlIGFyZ3VtZW50LgorCQl4ZGlyPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKKwkJaWYgdGVzdCAiWCR4ZGlyIiA9ICJYJGFyZyI7IHRoZW4KKwkJICB4ZGlyPQorCQllbHNlCisJCSAgeGRpcj0iJHhkaXIvIgorCQlmaQorCisJCWlmIHRlc3QgIiRwaWNfb2JqZWN0IiAhPSBub25lOyB0aGVuCisJCSAgIyBQcmVwZW5kIHRoZSBzdWJkaXJlY3RvcnkgdGhlIG9iamVjdCBpcyBmb3VuZCBpbi4KKwkJICBwaWNfb2JqZWN0PSIkeGRpciRwaWNfb2JqZWN0IgorCisJCSAgaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlczsgdGhlbgorCQkgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYgdGVzdCAiJGRsb3Blbl9zdXBwb3J0IiA9IHllczsgdGhlbgorCQkgICAgICBkbGZpbGVzPSIkZGxmaWxlcyAkcGljX29iamVjdCIKKwkJICAgICAgcHJldj0KKwkJICAgICAgY29udGludWUKKwkJICAgIGVsc2UKKwkJICAgICAgIyBJZiBsaWJ0b29sIG9iamVjdHMgYXJlIHVuc3VwcG9ydGVkLCB0aGVuIHdlIG5lZWQgdG8gcHJlbG9hZC4KKwkJICAgICAgcHJldj1kbHByZWZpbGVzCisJCSAgICBmaQorCQkgIGZpCisKKwkJICAjIENIRUNLIE1FOiAgSSB0aGluayBJIGJ1c3RlZCB0aGlzLiAgLU9zc2FtYQorCQkgIGlmIHRlc3QgIiRwcmV2IiA9IGRscHJlZmlsZXM7IHRoZW4KKwkJICAgICMgUHJlbG9hZCB0aGUgb2xkLXN0eWxlIG9iamVjdC4KKwkJICAgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRwaWNfb2JqZWN0IgorCQkgICAgcHJldj0KKwkJICBmaQorCisJCSAgIyBBIFBJQyBvYmplY3QuCisJCSAgbGlib2Jqcz0iJGxpYm9ianMgJHBpY19vYmplY3QiCisJCSAgYXJnPSIkcGljX29iamVjdCIKKwkJZmkKKworCQkjIE5vbi1QSUMgb2JqZWN0LgorCQlpZiB0ZXN0ICIkbm9uX3BpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KKwkJICAjIFByZXBlbmQgdGhlIHN1YmRpcmVjdG9yeSB0aGUgb2JqZWN0IGlzIGZvdW5kIGluLgorCQkgIG5vbl9waWNfb2JqZWN0PSIkeGRpciRub25fcGljX29iamVjdCIKKworCQkgICMgQSBzdGFuZGFyZCBub24tUElDIG9iamVjdAorCQkgIG5vbl9waWNfb2JqZWN0cz0iJG5vbl9waWNfb2JqZWN0cyAkbm9uX3BpY19vYmplY3QiCisJCSAgaWYgdGVzdCAteiAiJHBpY19vYmplY3QiIHx8IHRlc3QgIiRwaWNfb2JqZWN0IiA9IG5vbmUgOyB0aGVuCisJCSAgICBhcmc9IiRub25fcGljX29iamVjdCIKKwkJICBmaQorCQllbHNlCisJCSAgIyBJZiB0aGUgUElDIG9iamVjdCBleGlzdHMsIHVzZSBpdCBpbnN0ZWFkLgorCQkgICMgJHhkaXIgd2FzIHByZXBlbmRlZCB0byAkcGljX29iamVjdCBhYm92ZS4KKwkJICBub25fcGljX29iamVjdD0iJHBpY19vYmplY3QiCisJCSAgbm9uX3BpY19vYmplY3RzPSIkbm9uX3BpY19vYmplY3RzICRub25fcGljX29iamVjdCIKKwkJZmkKKwkgICAgICBlbHNlCisJCSMgT25seSBhbiBlcnJvciBpZiBub3QgZG9pbmcgYSBkcnktcnVuLgorCQlpZiB0ZXN0IC16ICIkcnVuIjsgdGhlbgorCQkgICRlY2hvICIkbW9kZW5hbWU6IFxgJGFyZycgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBvYmplY3QiIDE+JjIKKwkJICBleGl0ICRFWElUX0ZBSUxVUkUKKwkJZWxzZQorCQkgICMgRHJ5LXJ1biBjYXNlLgorCisJCSAgIyBFeHRyYWN0IHN1YmRpcmVjdG9yeSBmcm9tIHRoZSBhcmd1bWVudC4KKwkJICB4ZGlyPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKKwkJICBpZiB0ZXN0ICJYJHhkaXIiID0gIlgkYXJnIjsgdGhlbgorCQkgICAgeGRpcj0KKwkJICBlbHNlCisJCSAgICB4ZGlyPSIkeGRpci8iCisJCSAgZmkKKworCQkgIHBpY19vYmplY3Q9YCRlY2hvICJYJHt4ZGlyfSR7b2JqZGlyfS8ke2FyZ30iIHwgJFhzZWQgLWUgIiRsbzJvImAKKwkJICBub25fcGljX29iamVjdD1gJGVjaG8gIlgke3hkaXJ9JHthcmd9IiB8ICRYc2VkIC1lICIkbG8ybyJgCisJCSAgbGlib2Jqcz0iJGxpYm9ianMgJHBpY19vYmplY3QiCisJCSAgbm9uX3BpY19vYmplY3RzPSIkbm9uX3BpY19vYmplY3RzICRub25fcGljX29iamVjdCIKKwkJZmkKKwkgICAgICBmaQorCSAgICBkb25lCisJICBlbHNlCisJICAgICRlY2hvICIkbW9kZW5hbWU6IGxpbmsgaW5wdXQgZmlsZSBcYCRzYXZlX2FyZycgZG9lcyBub3QgZXhpc3QiCisJICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorCSAgZmkKKwkgIGFyZz0kc2F2ZV9hcmcKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwlycGF0aCB8IHhycGF0aCkKKwkgICMgV2UgbmVlZCBhbiBhYnNvbHV0ZSBwYXRoLgorCSAgY2FzZSAkYXJnIGluCisJICBbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIDs7CisJICAqKQorCSAgICAkZWNobyAiJG1vZGVuYW1lOiBvbmx5IGFic29sdXRlIHJ1bi1wYXRocyBhcmUgYWxsb3dlZCIgMT4mMgorCSAgICBleGl0ICRFWElUX0ZBSUxVUkUKKwkgICAgOzsKKwkgIGVzYWMKKwkgIGlmIHRlc3QgIiRwcmV2IiA9IHJwYXRoOyB0aGVuCisJICAgIGNhc2UgIiRycGF0aCAiIGluCisJICAgICoiICRhcmcgIiopIDs7CisJICAgICopIHJwYXRoPSIkcnBhdGggJGFyZyIgOzsKKwkgICAgZXNhYworCSAgZWxzZQorCSAgICBjYXNlICIkeHJwYXRoICIgaW4KKwkgICAgKiIgJGFyZyAiKikgOzsKKwkgICAgKikgeHJwYXRoPSIkeHJwYXRoICRhcmciIDs7CisJICAgIGVzYWMKKwkgIGZpCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJeGNvbXBpbGVyKQorCSAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkcWFyZyIKKwkgIHByZXY9CisJICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJHFhcmciCisJICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkcWFyZyIKKwkgIGNvbnRpbnVlCisJICA7OworCXhsaW5rZXIpCisJICBsaW5rZXJfZmxhZ3M9IiRsaW5rZXJfZmxhZ3MgJHFhcmciCisJICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICR3bCRxYXJnIgorCSAgcHJldj0KKwkgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkd2wkcWFyZyIKKwkgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICR3bCRxYXJnIgorCSAgY29udGludWUKKwkgIDs7CisJeGNjbGlua2VyKQorCSAgbGlua2VyX2ZsYWdzPSIkbGlua2VyX2ZsYWdzICRxYXJnIgorCSAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkcWFyZyIKKwkgIHByZXY9CisJICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJHFhcmciCisJICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkcWFyZyIKKwkgIGNvbnRpbnVlCisJICA7OworCXNocmV4dCkKKyAgCSAgc2hyZXh0X2NtZHM9IiRhcmciCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJZGFyd2luX2ZyYW1ld29ya3xkYXJ3aW5fZnJhbWV3b3JrX3NraXApCisJICB0ZXN0ICIkcHJldiIgPSAiZGFyd2luX2ZyYW1ld29yayIgJiYgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkYXJnIgorCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRhcmciCisJICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkYXJnIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCSopCisJICBldmFsICIkcHJldj1cIlwkYXJnXCIiCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJZXNhYworICAgICAgZmkgIyB0ZXN0IC1uICIkcHJldiIKKworICAgICAgcHJldmFyZz0iJGFyZyIKKworICAgICAgY2FzZSAkYXJnIGluCisgICAgICAtYWxsLXN0YXRpYykKKwlpZiB0ZXN0IC1uICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KKwkgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkbGlua19zdGF0aWNfZmxhZyIKKwkgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRsaW5rX3N0YXRpY19mbGFnIgorCWZpCisJY29udGludWUKKwk7OworCisgICAgICAtYWxsb3ctdW5kZWZpbmVkKQorCSMgRklYTUU6IHJlbW92ZSB0aGlzIGZsYWcgc29tZXRpbWUgaW4gdGhlIGZ1dHVyZS4KKwkkZWNobyAiJG1vZGVuYW1lOiBcYC1hbGxvdy11bmRlZmluZWQnIGlzIGRlcHJlY2F0ZWQgYmVjYXVzZSBpdCBpcyB0aGUgZGVmYXVsdCIgMT4mMgorCWNvbnRpbnVlCisJOzsKKworICAgICAgLWF2b2lkLXZlcnNpb24pCisJYXZvaWRfdmVyc2lvbj15ZXMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1kbG9wZW4pCisJcHJldj1kbGZpbGVzCisJY29udGludWUKKwk7OworCisgICAgICAtZGxwcmVvcGVuKQorCXByZXY9ZGxwcmVmaWxlcworCWNvbnRpbnVlCisJOzsKKworICAgICAgLWV4cG9ydC1keW5hbWljKQorCWV4cG9ydF9keW5hbWljPXllcworCWNvbnRpbnVlCisJOzsKKworICAgICAgLWV4cG9ydC1zeW1ib2xzIHwgLWV4cG9ydC1zeW1ib2xzLXJlZ2V4KQorCWlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgfHwgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IjsgdGhlbgorCSAgJGVjaG8gIiRtb2RlbmFtZTogbW9yZSB0aGFuIG9uZSAtZXhwb3J0ZWQtc3ltYm9scyBhcmd1bWVudCBpcyBub3QgYWxsb3dlZCIKKwkgIGV4aXQgJEVYSVRfRkFJTFVSRQorCWZpCisJaWYgdGVzdCAiWCRhcmciID0gIlgtZXhwb3J0LXN5bWJvbHMiOyB0aGVuCisJICBwcmV2PWV4cHN5bXMKKwllbHNlCisJICBwcmV2PWV4cHN5bXNfcmVnZXgKKwlmaQorCWNvbnRpbnVlCisJOzsKKworICAgICAgLWZyYW1ld29ya3wtYXJjaHwtaXN5c3Jvb3QpCisJY2FzZSAiICRDQyAiIGluCisJICAqIiAke2FyZ30gJHsxfSAiKiB8ICoiICR7YXJnfQkkezF9ICIqKSAKKwkJcHJldj1kYXJ3aW5fZnJhbWV3b3JrX3NraXAgOzsKKwkgICopIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJGFyZyIKKwkgICAgIHByZXY9ZGFyd2luX2ZyYW1ld29yayA7OworCWVzYWMKKwljb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGFyZyIKKwlmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkYXJnIgorCWNvbnRpbnVlCisJOzsKKworICAgICAgLWluc3QtcHJlZml4LWRpcikKKwlwcmV2PWluc3RfcHJlZml4CisJY29udGludWUKKwk7OworCisgICAgICAjIFRoZSBuYXRpdmUgSVJJWCBsaW5rZXIgdW5kZXJzdGFuZHMgLUxBTkc6KiwgLUxJU1Q6KiBhbmQgLUxOTzoqCisgICAgICAjIHNvLCBpZiB3ZSBzZWUgdGhlc2UgZmxhZ3MgYmUgY2FyZWZ1bCBub3QgdG8gdHJlYXQgdGhlbSBsaWtlIC1MCisgICAgICAtTFtBLVpdW0EtWl0qOiopCisJY2FzZSAkd2l0aF9nY2MvJGhvc3QgaW4KKwluby8qLSotaXJpeCogfCAvKi0qLWlyaXgqKQorCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRhcmciCisJICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkYXJnIgorCSAgOzsKKwllc2FjCisJY29udGludWUKKwk7OworCisgICAgICAtTCopCisJZGlyPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MvXi1MLy8nYAorCSMgV2UgbmVlZCBhbiBhYnNvbHV0ZSBwYXRoLgorCWNhc2UgJGRpciBpbgorCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgOzsKKwkqKQorCSAgYWJzZGlyPWBjZCAiJGRpciIgJiYgcHdkYAorCSAgaWYgdGVzdCAteiAiJGFic2RpciI7IHRoZW4KKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGRldGVybWluZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBvZiBcYCRkaXInIiAxPiYyCisJICAgIGFic2Rpcj0iJGRpciIKKwkgICAgbm90aW5zdF9wYXRoPSIkbm90aW5zdF9wYXRoICRkaXIiCisJICBmaQorCSAgZGlyPSIkYWJzZGlyIgorCSAgOzsKKwllc2FjCisJY2FzZSAiJGRlcGxpYnMgIiBpbgorCSoiIC1MJGRpciAiKikgOzsKKwkqKQorCSAgZGVwbGlicz0iJGRlcGxpYnMgLUwkZGlyIgorCSAgbGliX3NlYXJjaF9wYXRoPSIkbGliX3NlYXJjaF9wYXRoICRkaXIiCisJICA7OworCWVzYWMKKwljYXNlICRob3N0IGluCisJKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqIHwgKi0qLW9zMiopCisJICB0ZXN0YmluZGlyPWAkZWNobyAiWCRkaXIiIHwgJFhzZWQgLWUgJ3MqL2xpYiQqL2JpbionYAorCSAgY2FzZSA6JGRsbHNlYXJjaHBhdGg6IGluCisJICAqIjokZGlyOiIqKSA7OworCSAgKikgZGxsc2VhcmNocGF0aD0iJGRsbHNlYXJjaHBhdGg6JGRpciI7OworCSAgZXNhYworCSAgY2FzZSA6JGRsbHNlYXJjaHBhdGg6IGluCisJICAqIjokdGVzdGJpbmRpcjoiKikgOzsKKwkgICopIGRsbHNlYXJjaHBhdGg9IiRkbGxzZWFyY2hwYXRoOiR0ZXN0YmluZGlyIjs7CisJICBlc2FjCisJICA7OworCWVzYWMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1sKikKKwlpZiB0ZXN0ICJYJGFyZyIgPSAiWC1sYyIgfHwgdGVzdCAiWCRhcmciID0gIlgtbG0iOyB0aGVuCisJICBjYXNlICRob3N0IGluCisJICAqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotYmVvcyopCisJICAgICMgVGhlc2Ugc3lzdGVtcyBkb24ndCBhY3R1YWxseSBoYXZlIGEgQyBvciBtYXRoIGxpYnJhcnkgKGFzIHN1Y2gpCisJICAgIGNvbnRpbnVlCisJICAgIDs7CisJICAqLSotb3MyKikKKwkgICAgIyBUaGVzZSBzeXN0ZW1zIGRvbid0IGFjdHVhbGx5IGhhdmUgYSBDIGxpYnJhcnkgKGFzIHN1Y2gpCisJICAgIHRlc3QgIlgkYXJnIiA9ICJYLWxjIiAmJiBjb250aW51ZQorCSAgICA7OworCSAgKi0qLW9wZW5ic2QqIHwgKi0qLWZyZWVic2QqIHwgKi0qLWRyYWdvbmZseSopCisJICAgICMgRG8gbm90IGluY2x1ZGUgbGliYyBkdWUgdG8gdXMgaGF2aW5nIGxpYmMvbGliY19yLgorCSAgICB0ZXN0ICJYJGFyZyIgPSAiWC1sYyIgJiYgY29udGludWUKKwkgICAgOzsKKwkgICotKi1yaGFwc29keSogfCAqLSotZGFyd2luMS5bMDEyXSkKKwkgICAgIyBSaGFwc29keSBDIGFuZCBtYXRoIGxpYnJhcmllcyBhcmUgaW4gdGhlIFN5c3RlbSBmcmFtZXdvcmsKKwkgICAgZGVwbGlicz0iJGRlcGxpYnMgLWZyYW1ld29yayBTeXN0ZW0iCisJICAgIGNvbnRpbnVlCisJICAgIDs7CisJICAqLSotc2NvMy4ydjUqIHwgKi0qLXNjbzV2NiopCisJICAgICMgQ2F1c2VzIHByb2JsZW1zIHdpdGggX19jdHlwZQorCSAgICB0ZXN0ICJYJGFyZyIgPSAiWC1sYyIgJiYgY29udGludWUKKwkgICAgOzsKKwkgICotKi1zeXN2NC4ydXcyKiB8ICotKi1zeXN2NSogfCAqLSotdW5peHdhcmUqIHwgKi0qLU9wZW5VTklYKikKKwkgICAgIyBDb21waWxlciBpbnNlcnRzIGxpYmMgaW4gdGhlIGNvcnJlY3QgcGxhY2UgZm9yIHRocmVhZHMgdG8gd29yaworCSAgICB0ZXN0ICJYJGFyZyIgPSAiWC1sYyIgJiYgY29udGludWUKKwkgICAgOzsKKwkgIGVzYWMKKwllbGlmIHRlc3QgIlgkYXJnIiA9ICJYLWxjX3IiOyB0aGVuCisJIGNhc2UgJGhvc3QgaW4KKwkgKi0qLW9wZW5ic2QqIHwgKi0qLWZyZWVic2QqIHwgKi0qLWRyYWdvbmZseSopCisJICAgIyBEbyBub3QgaW5jbHVkZSBsaWJjX3IgZGlyZWN0bHksIHVzZSAtcHRocmVhZCBmbGFnLgorCSAgIGNvbnRpbnVlCisJICAgOzsKKwkgZXNhYworCWZpCisJZGVwbGlicz0iJGRlcGxpYnMgJGFyZyIKKwljb250aW51ZQorCTs7CisKKyAgICAgICMgVHJ1NjQgVU5JWCB1c2VzIC1tb2RlbCBbYXJnXSB0byBkZXRlcm1pbmUgdGhlIGxheW91dCBvZiBDKysKKyAgICAgICMgY2xhc3NlcywgbmFtZSBtYW5nbGluZywgYW5kIGV4Y2VwdGlvbiBoYW5kbGluZy4KKyAgICAgIC1tb2RlbCkKKwljb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGFyZyIKKwljb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRhcmciCisJZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGFyZyIKKwlwcmV2PXhjb21waWxlcgorCWNvbnRpbnVlCisJOzsKKworICAgICAtbXR8LW10aHJlYWRzfC1rdGhyZWFkfC1LdGhyZWFkfC1wdGhyZWFkfC1wdGhyZWFkc3wtLXRocmVhZC1zYWZlKQorCWNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJGFyZyIKKwljb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGFyZyIKKwlmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkYXJnIgorCWNvbnRpbnVlCisJOzsKKworICAgICAgLW1vZHVsZSkKKwltb2R1bGU9eWVzCisJY29udGludWUKKwk7OworCisgICAgICAjIC02NCwgLW1pcHNbMC05XSBlbmFibGUgNjQtYml0IG1vZGUgb24gdGhlIFNHSSBjb21waWxlcgorICAgICAgIyAtclswLTldWzAtOV0qIHNwZWNpZmllcyB0aGUgcHJvY2Vzc29yIG9uIHRoZSBTR0kgY29tcGlsZXIKKyAgICAgICMgLXhhcmNoPSosIC14dGFyZ2V0PSogZW5hYmxlIDY0LWJpdCBtb2RlIG9uIHRoZSBTdW4gY29tcGlsZXIKKyAgICAgICMgK0RBKiwgK0REKiBlbmFibGUgNjQtYml0IG1vZGUgb24gdGhlIEhQIGNvbXBpbGVyCisgICAgICAjIC1xKiBwYXNzIHRocm91Z2ggY29tcGlsZXIgYXJncyBmb3IgdGhlIElCTSBjb21waWxlcgorICAgICAgIyAtbSogcGFzcyB0aHJvdWdoIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBjb21waWxlciBhcmdzIGZvciBHQ0MKKyAgICAgICMgLW0qLCAtdFs0NV0qLCAtdHhzY2FsZSogcGFzcyB0aHJvdWdoIGFyY2hpdGVjdHVyZS1zcGVjaWZpYworICAgICAgIyBjb21waWxlciBhcmdzIGZvciBHQ0MKKyAgICAgICMgLXBnIHBhc3MgdGhyb3VnaCBwcm9maWxpbmcgZmxhZyBmb3IgR0NDCisgICAgICAjIEBmaWxlIEdDQyByZXNwb25zZSBmaWxlcworICAgICAgLTY0fC1taXBzWzAtOV18LXJbMC05XVswLTldKnwteGFyY2g9KnwteHRhcmdldD0qfCtEQSp8K0REKnwtcSp8LW0qfC1wZ3wgXAorICAgICAgLXRbNDVdKnwtdHhzY2FsZSp8QCopCisKKwkjIFVua25vd24gYXJndW1lbnRzIGluIGJvdGggZmluYWxpemVfY29tbWFuZCBhbmQgY29tcGlsZV9jb21tYW5kIG5lZWQKKwkjIHRvIGJlIGFlc3RoZXRpY2FsbHkgcXVvdGVkIGJlY2F1c2UgdGhleSBhcmUgZXZhbGVkIGxhdGVyLgorCWFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKwljYXNlICRhcmcgaW4KKwkqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKKwkgIGFyZz0iXCIkYXJnXCIiCisJICA7OworCWVzYWMKKyAgICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRhcmciCisgICAgICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRhcmciCisgICAgICAgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJGFyZyIKKyAgICAgICAgY29udGludWUKKyAgICAgICAgOzsKKworICAgICAgLXNocmV4dCkKKwlwcmV2PXNocmV4dAorCWNvbnRpbnVlCisJOzsKKworICAgICAgLW5vLWZhc3QtaW5zdGFsbCkKKwlmYXN0X2luc3RhbGw9bm8KKwljb250aW51ZQorCTs7CisKKyAgICAgIC1uby1pbnN0YWxsKQorCWNhc2UgJGhvc3QgaW4KKwkqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKikKKwkgICMgVGhlIFBBVEggaGFja2VyeSBpbiB3cmFwcGVyIHNjcmlwdHMgaXMgcmVxdWlyZWQgb24gV2luZG93cworCSAgIyBpbiBvcmRlciBmb3IgdGhlIGxvYWRlciB0byBmaW5kIGFueSBkbGxzIGl0IG5lZWRzLgorCSAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtbm8taW5zdGFsbCcgaXMgaWdub3JlZCBmb3IgJGhvc3QiIDE+JjIKKwkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGFzc3VtaW5nIFxgLW5vLWZhc3QtaW5zdGFsbCcgaW5zdGVhZCIgMT4mMgorCSAgZmFzdF9pbnN0YWxsPW5vCisJICA7OworCSopIG5vX2luc3RhbGw9eWVzIDs7CisJZXNhYworCWNvbnRpbnVlCisJOzsKKworICAgICAgLW5vLXVuZGVmaW5lZCkKKwlhbGxvd191bmRlZmluZWQ9bm8KKwljb250aW51ZQorCTs7CisKKyAgICAgIC1vYmplY3RsaXN0KQorCXByZXY9b2JqZWN0bGlzdAorCWNvbnRpbnVlCisJOzsKKworICAgICAgLW8pIHByZXY9b3V0cHV0IDs7CisKKyAgICAgIC1wcmVjaW91cy1maWxlcy1yZWdleCkKKwlwcmV2PXByZWNpb3VzX3JlZ2V4CisJY29udGludWUKKwk7OworCisgICAgICAtcmVsZWFzZSkKKwlwcmV2PXJlbGVhc2UKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1ycGF0aCkKKwlwcmV2PXJwYXRoCisJY29udGludWUKKwk7OworCisgICAgICAtUikKKwlwcmV2PXhycGF0aAorCWNvbnRpbnVlCisJOzsKKworICAgICAgLVIqKQorCWRpcj1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzL14tUi8vJ2AKKwkjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KKwljYXNlICRkaXIgaW4KKwlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIDs7CisJKikKKwkgICRlY2hvICIkbW9kZW5hbWU6IG9ubHkgYWJzb2x1dGUgcnVuLXBhdGhzIGFyZSBhbGxvd2VkIiAxPiYyCisJICBleGl0ICRFWElUX0ZBSUxVUkUKKwkgIDs7CisJZXNhYworCWNhc2UgIiR4cnBhdGggIiBpbgorCSoiICRkaXIgIiopIDs7CisJKikgeHJwYXRoPSIkeHJwYXRoICRkaXIiIDs7CisJZXNhYworCWNvbnRpbnVlCisJOzsKKworICAgICAgLXN0YXRpYykKKwkjIFRoZSBlZmZlY3RzIG9mIC1zdGF0aWMgYXJlIGRlZmluZWQgaW4gYSBwcmV2aW91cyBsb29wLgorCSMgV2UgdXNlZCB0byBkbyB0aGUgc2FtZSBhcyAtYWxsLXN0YXRpYyBvbiBwbGF0Zm9ybXMgdGhhdAorCSMgZGlkbid0IGhhdmUgYSBQSUMgZmxhZywgYnV0IHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIGVmZmVjdHMKKwkjIHdvdWxkIGJlIGVxdWl2YWxlbnQgd2FzIHdyb25nLiAgSXQgd291bGQgYnJlYWsgb24gYXQgbGVhc3QKKwkjIERpZ2l0YWwgVW5peCBhbmQgQUlYLgorCWNvbnRpbnVlCisJOzsKKworICAgICAgLXRocmVhZC1zYWZlKQorCXRocmVhZF9zYWZlPXllcworCWNvbnRpbnVlCisJOzsKKworICAgICAgLXZlcnNpb24taW5mbykKKwlwcmV2PXZpbmZvCisJY29udGludWUKKwk7OworICAgICAgLXZlcnNpb24tbnVtYmVyKQorCXByZXY9dmluZm8KKwl2aW5mb19udW1iZXI9eWVzCisJY29udGludWUKKwk7OworCisgICAgICAtV2MsKikKKwlhcmdzPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiIC1lICdzL14tV2MsLy8nYAorCWFyZz0KKwlzYXZlX2lmcz0iJElGUyI7IElGUz0nLCcKKwlmb3IgZmxhZyBpbiAkYXJnczsgZG8KKwkgIElGUz0iJHNhdmVfaWZzIgorCSAgY2FzZSAkZmxhZyBpbgorCSAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKKwkgICAgZmxhZz0iXCIkZmxhZ1wiIgorCSAgICA7OworCSAgZXNhYworCSAgYXJnPSIkYXJnICR3bCRmbGFnIgorCSAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkZmxhZyIKKwlkb25lCisJSUZTPSIkc2F2ZV9pZnMiCisJYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgInMvXiAvLyJgCisJOzsKKworICAgICAgLVdsLCopCisJYXJncz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0IiAtZSAncy9eLVdsLC8vJ2AKKwlhcmc9CisJc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JywnCisJZm9yIGZsYWcgaW4gJGFyZ3M7IGRvCisJICBJRlM9IiRzYXZlX2lmcyIKKwkgIGNhc2UgJGZsYWcgaW4KKwkgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCisJICAgIGZsYWc9IlwiJGZsYWdcIiIKKwkgICAgOzsKKwkgIGVzYWMKKwkgIGFyZz0iJGFyZyAkd2wkZmxhZyIKKwkgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJHdsJGZsYWciCisJICBsaW5rZXJfZmxhZ3M9IiRsaW5rZXJfZmxhZ3MgJGZsYWciCisJZG9uZQorCUlGUz0iJHNhdmVfaWZzIgorCWFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICJzL14gLy8iYAorCTs7CisKKyAgICAgIC1YY29tcGlsZXIpCisJcHJldj14Y29tcGlsZXIKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1YbGlua2VyKQorCXByZXY9eGxpbmtlcgorCWNvbnRpbnVlCisJOzsKKworICAgICAgLVhDQ2xpbmtlcikKKwlwcmV2PXhjY2xpbmtlcgorCWNvbnRpbnVlCisJOzsKKworICAgICAgIyBTb21lIG90aGVyIGNvbXBpbGVyIGZsYWcuCisgICAgICAtKiB8ICsqKQorCSMgVW5rbm93biBhcmd1bWVudHMgaW4gYm90aCBmaW5hbGl6ZV9jb21tYW5kIGFuZCBjb21waWxlX2NvbW1hbmQgbmVlZAorCSMgdG8gYmUgYWVzdGhldGljYWxseSBxdW90ZWQgYmVjYXVzZSB0aGV5IGFyZSBldmFsZWQgbGF0ZXIuCisJYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorCWNhc2UgJGFyZyBpbgorCSpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQorCSAgYXJnPSJcIiRhcmdcIiIKKwkgIDs7CisJZXNhYworCTs7CisKKyAgICAgICouJG9iamV4dCkKKwkjIEEgc3RhbmRhcmQgb2JqZWN0LgorCW9ianM9IiRvYmpzICRhcmciCisJOzsKKworICAgICAgKi5sbykKKwkjIEEgbGlidG9vbC1jb250cm9sbGVkIG9iamVjdC4KKworCSMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIG9iamVjdC4KKwlpZiAoJHtTRUR9IC1lICcycScgJGFyZyB8IGdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICBwaWNfb2JqZWN0PQorCSAgbm9uX3BpY19vYmplY3Q9CisKKwkgICMgUmVhZCB0aGUgLmxvIGZpbGUKKwkgICMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgorCSAgY2FzZSAkYXJnIGluCisJICAqLyogfCAqXFwqKSAuICRhcmcgOzsKKwkgICopIC4gLi8kYXJnIDs7CisJICBlc2FjCisKKwkgIGlmIHRlc3QgLXogIiRwaWNfb2JqZWN0IiB8fCBcCisJICAgICB0ZXN0IC16ICIkbm9uX3BpY19vYmplY3QiIHx8CisJICAgICB0ZXN0ICIkcGljX29iamVjdCIgPSBub25lICYmIFwKKwkgICAgIHRlc3QgIiRub25fcGljX29iamVjdCIgPSBub25lOyB0aGVuCisJICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBmaW5kIG5hbWUgb2Ygb2JqZWN0IGZvciBcYCRhcmcnIiAxPiYyCisJICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorCSAgZmkKKworCSAgIyBFeHRyYWN0IHN1YmRpcmVjdG9yeSBmcm9tIHRoZSBhcmd1bWVudC4KKwkgIHhkaXI9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAorCSAgaWYgdGVzdCAiWCR4ZGlyIiA9ICJYJGFyZyI7IHRoZW4KKwkgICAgeGRpcj0KKyAJICBlbHNlCisJICAgIHhkaXI9IiR4ZGlyLyIKKwkgIGZpCisKKwkgIGlmIHRlc3QgIiRwaWNfb2JqZWN0IiAhPSBub25lOyB0aGVuCisJICAgICMgUHJlcGVuZCB0aGUgc3ViZGlyZWN0b3J5IHRoZSBvYmplY3QgaXMgZm91bmQgaW4uCisJICAgIHBpY19vYmplY3Q9IiR4ZGlyJHBpY19vYmplY3QiCisKKwkgICAgaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlczsgdGhlbgorCSAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzICYmIHRlc3QgIiRkbG9wZW5fc3VwcG9ydCIgPSB5ZXM7IHRoZW4KKwkJZGxmaWxlcz0iJGRsZmlsZXMgJHBpY19vYmplY3QiCisJCXByZXY9CisJCWNvbnRpbnVlCisJICAgICAgZWxzZQorCQkjIElmIGxpYnRvb2wgb2JqZWN0cyBhcmUgdW5zdXBwb3J0ZWQsIHRoZW4gd2UgbmVlZCB0byBwcmVsb2FkLgorCQlwcmV2PWRscHJlZmlsZXMKKwkgICAgICBmaQorCSAgICBmaQorCisJICAgICMgQ0hFQ0sgTUU6ICBJIHRoaW5rIEkgYnVzdGVkIHRoaXMuICAtT3NzYW1hCisJICAgIGlmIHRlc3QgIiRwcmV2IiA9IGRscHJlZmlsZXM7IHRoZW4KKwkgICAgICAjIFByZWxvYWQgdGhlIG9sZC1zdHlsZSBvYmplY3QuCisJICAgICAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJHBpY19vYmplY3QiCisJICAgICAgcHJldj0KKwkgICAgZmkKKworCSAgICAjIEEgUElDIG9iamVjdC4KKwkgICAgbGlib2Jqcz0iJGxpYm9ianMgJHBpY19vYmplY3QiCisJICAgIGFyZz0iJHBpY19vYmplY3QiCisJICBmaQorCisJICAjIE5vbi1QSUMgb2JqZWN0LgorCSAgaWYgdGVzdCAiJG5vbl9waWNfb2JqZWN0IiAhPSBub25lOyB0aGVuCisJICAgICMgUHJlcGVuZCB0aGUgc3ViZGlyZWN0b3J5IHRoZSBvYmplY3QgaXMgZm91bmQgaW4uCisJICAgIG5vbl9waWNfb2JqZWN0PSIkeGRpciRub25fcGljX29iamVjdCIKKworCSAgICAjIEEgc3RhbmRhcmQgbm9uLVBJQyBvYmplY3QKKwkgICAgbm9uX3BpY19vYmplY3RzPSIkbm9uX3BpY19vYmplY3RzICRub25fcGljX29iamVjdCIKKwkgICAgaWYgdGVzdCAteiAiJHBpY19vYmplY3QiIHx8IHRlc3QgIiRwaWNfb2JqZWN0IiA9IG5vbmUgOyB0aGVuCisJICAgICAgYXJnPSIkbm9uX3BpY19vYmplY3QiCisJICAgIGZpCisJICBlbHNlCisJICAgICMgSWYgdGhlIFBJQyBvYmplY3QgZXhpc3RzLCB1c2UgaXQgaW5zdGVhZC4KKwkgICAgIyAkeGRpciB3YXMgcHJlcGVuZGVkIHRvICRwaWNfb2JqZWN0IGFib3ZlLgorCSAgICBub25fcGljX29iamVjdD0iJHBpY19vYmplY3QiCisJICAgIG5vbl9waWNfb2JqZWN0cz0iJG5vbl9waWNfb2JqZWN0cyAkbm9uX3BpY19vYmplY3QiCisJICBmaQorCWVsc2UKKwkgICMgT25seSBhbiBlcnJvciBpZiBub3QgZG9pbmcgYSBkcnktcnVuLgorCSAgaWYgdGVzdCAteiAiJHJ1biI7IHRoZW4KKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogXGAkYXJnJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIG9iamVjdCIgMT4mMgorCSAgICBleGl0ICRFWElUX0ZBSUxVUkUKKwkgIGVsc2UKKwkgICAgIyBEcnktcnVuIGNhc2UuCisKKwkgICAgIyBFeHRyYWN0IHN1YmRpcmVjdG9yeSBmcm9tIHRoZSBhcmd1bWVudC4KKwkgICAgeGRpcj1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCisJICAgIGlmIHRlc3QgIlgkeGRpciIgPSAiWCRhcmciOyB0aGVuCisJICAgICAgeGRpcj0KKwkgICAgZWxzZQorCSAgICAgIHhkaXI9IiR4ZGlyLyIKKwkgICAgZmkKKworCSAgICBwaWNfb2JqZWN0PWAkZWNobyAiWCR7eGRpcn0ke29iamRpcn0vJHthcmd9IiB8ICRYc2VkIC1lICIkbG8ybyJgCisJICAgIG5vbl9waWNfb2JqZWN0PWAkZWNobyAiWCR7eGRpcn0ke2FyZ30iIHwgJFhzZWQgLWUgIiRsbzJvImAKKwkgICAgbGlib2Jqcz0iJGxpYm9ianMgJHBpY19vYmplY3QiCisJICAgIG5vbl9waWNfb2JqZWN0cz0iJG5vbl9waWNfb2JqZWN0cyAkbm9uX3BpY19vYmplY3QiCisJICBmaQorCWZpCisJOzsKKworICAgICAgKi4kbGliZXh0KQorCSMgQW4gYXJjaGl2ZS4KKwlkZXBsaWJzPSIkZGVwbGlicyAkYXJnIgorCW9sZF9kZXBsaWJzPSIkb2xkX2RlcGxpYnMgJGFyZyIKKwljb250aW51ZQorCTs7CisKKyAgICAgICoubGEpCisJIyBBIGxpYnRvb2wtY29udHJvbGxlZCBsaWJyYXJ5LgorCisJaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlczsgdGhlbgorCSAgIyBUaGlzIGxpYnJhcnkgd2FzIHNwZWNpZmllZCB3aXRoIC1kbG9wZW4uCisJICBkbGZpbGVzPSIkZGxmaWxlcyAkYXJnIgorCSAgcHJldj0KKwllbGlmIHRlc3QgIiRwcmV2IiA9IGRscHJlZmlsZXM7IHRoZW4KKwkgICMgVGhlIGxpYnJhcnkgd2FzIHNwZWNpZmllZCB3aXRoIC1kbHByZW9wZW4uCisJICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkYXJnIgorCSAgcHJldj0KKwllbHNlCisJICBkZXBsaWJzPSIkZGVwbGlicyAkYXJnIgorCWZpCisJY29udGludWUKKwk7OworCisgICAgICAjIFNvbWUgb3RoZXIgY29tcGlsZXIgYXJndW1lbnQuCisgICAgICAqKQorCSMgVW5rbm93biBhcmd1bWVudHMgaW4gYm90aCBmaW5hbGl6ZV9jb21tYW5kIGFuZCBjb21waWxlX2NvbW1hbmQgbmVlZAorCSMgdG8gYmUgYWVzdGhldGljYWxseSBxdW90ZWQgYmVjYXVzZSB0aGV5IGFyZSBldmFsZWQgbGF0ZXIuCisJYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorCWNhc2UgJGFyZyBpbgorCSpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQorCSAgYXJnPSJcIiRhcmdcIiIKKwkgIDs7CisJZXNhYworCTs7CisgICAgICBlc2FjICMgYXJnCisKKyAgICAgICMgTm93IGFjdHVhbGx5IHN1YnN0aXR1dGUgdGhlIGFyZ3VtZW50IGludG8gdGhlIGNvbW1hbmRzLgorICAgICAgaWYgdGVzdCAtbiAiJGFyZyI7IHRoZW4KKwljb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGFyZyIKKwlmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkYXJnIgorICAgICAgZmkKKyAgICBkb25lICMgYXJndW1lbnQgcGFyc2luZyBsb29wCisKKyAgICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KKyAgICAgICRlY2hvICIkbW9kZW5hbWU6IHRoZSBcYCRwcmV2YXJnJyBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQiIDE+JjIKKyAgICAgICRlY2hvICIkaGVscCIgMT4mMgorICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisgICAgZmkKKworICAgIGlmIHRlc3QgIiRleHBvcnRfZHluYW1pYyIgPSB5ZXMgJiYgdGVzdCAtbiAiJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYyI7IHRoZW4KKyAgICAgIGV2YWwgYXJnPVwiJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY1wiCisgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGFyZyIKKyAgICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRhcmciCisgICAgZmkKKworICAgIG9sZGxpYnM9CisgICAgIyBjYWxjdWxhdGUgdGhlIG5hbWUgb2YgdGhlIGZpbGUsIHdpdGhvdXQgaXRzIGRpcmVjdG9yeQorICAgIG91dHB1dG5hbWU9YCRlY2hvICJYJG91dHB1dCIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorICAgIGxpYm9ianNfc2F2ZT0iJGxpYm9ianMiCisKKyAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KKyAgICAgICMgZ2V0IHRoZSBkaXJlY3RvcmllcyBsaXN0ZWQgaW4gJHNobGlicGF0aF92YXIKKyAgICAgIGV2YWwgc2hsaWJfc2VhcmNoX3BhdGg9XGBcJGVjaG8gXCJYXCR7JHNobGlicGF0aF92YXJ9XCIgXHwgXCRYc2VkIC1lIFwncy86LyAvZ1wnXGAKKyAgICBlbHNlCisgICAgICBzaGxpYl9zZWFyY2hfcGF0aD0KKyAgICBmaQorICAgIGV2YWwgc3lzX2xpYl9zZWFyY2hfcGF0aD1cIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWNcIgorICAgIGV2YWwgc3lzX2xpYl9kbHNlYXJjaF9wYXRoPVwiJHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjXCIKKworICAgIG91dHB1dF9vYmpkaXI9YCRlY2hvICJYJG91dHB1dCIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAorICAgIGlmIHRlc3QgIlgkb3V0cHV0X29iamRpciIgPSAiWCRvdXRwdXQiOyB0aGVuCisgICAgICBvdXRwdXRfb2JqZGlyPSIkb2JqZGlyIgorICAgIGVsc2UKKyAgICAgIG91dHB1dF9vYmpkaXI9IiRvdXRwdXRfb2JqZGlyLyRvYmpkaXIiCisgICAgZmkKKyAgICAjIENyZWF0ZSB0aGUgb2JqZWN0IGRpcmVjdG9yeS4KKyAgICBpZiB0ZXN0ICEgLWQgIiRvdXRwdXRfb2JqZGlyIjsgdGhlbgorICAgICAgJHNob3cgIiRta2RpciAkb3V0cHV0X29iamRpciIKKyAgICAgICRydW4gJG1rZGlyICRvdXRwdXRfb2JqZGlyCisgICAgICBleGl0X3N0YXR1cz0kPworICAgICAgaWYgdGVzdCAiJGV4aXRfc3RhdHVzIiAtbmUgMCAmJiB0ZXN0ICEgLWQgIiRvdXRwdXRfb2JqZGlyIjsgdGhlbgorCWV4aXQgJGV4aXRfc3RhdHVzCisgICAgICBmaQorICAgIGZpCisKKyAgICAjIERldGVybWluZSB0aGUgdHlwZSBvZiBvdXRwdXQKKyAgICBjYXNlICRvdXRwdXQgaW4KKyAgICAiIikKKyAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYW4gb3V0cHV0IGZpbGUiIDE+JjIKKyAgICAgICRlY2hvICIkaGVscCIgMT4mMgorICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisgICAgICA7OworICAgICouJGxpYmV4dCkgbGlua21vZGU9b2xkbGliIDs7CisgICAgKi5sbyB8ICouJG9iamV4dCkgbGlua21vZGU9b2JqIDs7CisgICAgKi5sYSkgbGlua21vZGU9bGliIDs7CisgICAgKikgbGlua21vZGU9cHJvZyA7OyAjIEFueXRoaW5nIGVsc2Ugc2hvdWxkIGJlIGEgcHJvZ3JhbS4KKyAgICBlc2FjCisKKyAgICBjYXNlICRob3N0IGluCisgICAgKmN5Z3dpbiogfCAqbWluZ3cqIHwgKnB3MzIqKQorICAgICAgIyBkb24ndCBlbGltaW5hdGUgZHVwbGljYXRpb25zIGluICRwb3N0ZGVwcyBhbmQgJHByZWRlcHMKKyAgICAgIGR1cGxpY2F0ZV9jb21waWxlcl9nZW5lcmF0ZWRfZGVwcz15ZXMKKyAgICAgIDs7CisgICAgKikKKyAgICAgIGR1cGxpY2F0ZV9jb21waWxlcl9nZW5lcmF0ZWRfZGVwcz0kZHVwbGljYXRlX2RlcHMKKyAgICAgIDs7CisgICAgZXNhYworICAgIHNwZWNpYWxkZXBsaWJzPQorCisgICAgbGlicz0KKyAgICAjIEZpbmQgYWxsIGludGVyZGVwZW5kZW50IGRlcGxpYnMgYnkgc2VhcmNoaW5nIGZvciBsaWJyYXJpZXMKKyAgICAjIHRoYXQgYXJlIGxpbmtlZCBtb3JlIHRoYW4gb25jZSAoZS5nLiAtbGEgLWxiIC1sYSkKKyAgICBmb3IgZGVwbGliIGluICRkZXBsaWJzOyBkbworICAgICAgaWYgdGVzdCAiWCRkdXBsaWNhdGVfZGVwcyIgPSAiWHllcyIgOyB0aGVuCisJY2FzZSAiJGxpYnMgIiBpbgorCSoiICRkZXBsaWIgIiopIHNwZWNpYWxkZXBsaWJzPSIkc3BlY2lhbGRlcGxpYnMgJGRlcGxpYiIgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgbGlicz0iJGxpYnMgJGRlcGxpYiIKKyAgICBkb25lCisKKyAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gbGliOyB0aGVuCisgICAgICBsaWJzPSIkcHJlZGVwcyAkbGlicyAkY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoICRwb3N0ZGVwcyIKKworICAgICAgIyBDb21wdXRlIGxpYnJhcmllcyB0aGF0IGFyZSBsaXN0ZWQgbW9yZSB0aGFuIG9uY2UgaW4gJHByZWRlcHMKKyAgICAgICMgJHBvc3RkZXBzIGFuZCBtYXJrIHRoZW0gYXMgc3BlY2lhbCAoaS5lLiwgd2hvc2UgZHVwbGljYXRlcyBhcmUKKyAgICAgICMgbm90IHRvIGJlIGVsaW1pbmF0ZWQpLgorICAgICAgcHJlX3Bvc3RfZGVwcz0KKyAgICAgIGlmIHRlc3QgIlgkZHVwbGljYXRlX2NvbXBpbGVyX2dlbmVyYXRlZF9kZXBzIiA9ICJYeWVzIiA7IHRoZW4KKwlmb3IgcHJlX3Bvc3RfZGVwIGluICRwcmVkZXBzICRwb3N0ZGVwczsgZG8KKwkgIGNhc2UgIiRwcmVfcG9zdF9kZXBzICIgaW4KKwkgICoiICRwcmVfcG9zdF9kZXAgIiopIHNwZWNpYWxkZXBsaWJzPSIkc3BlY2lhbGRlcGxpYnMgJHByZV9wb3N0X2RlcHMiIDs7CisJICBlc2FjCisJICBwcmVfcG9zdF9kZXBzPSIkcHJlX3Bvc3RfZGVwcyAkcHJlX3Bvc3RfZGVwIgorCWRvbmUKKyAgICAgIGZpCisgICAgICBwcmVfcG9zdF9kZXBzPQorICAgIGZpCisKKyAgICBkZXBsaWJzPQorICAgIG5ld2RlcGVuZGVuY3lfbGlicz0KKyAgICBuZXdsaWJfc2VhcmNoX3BhdGg9CisgICAgbmVlZF9yZWxpbms9bm8gIyB3aGV0aGVyIHdlJ3JlIGxpbmtpbmcgYW55IHVuaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzCisgICAgbm90aW5zdF9kZXBsaWJzPSAjIG5vdC1pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMKKyAgICBjYXNlICRsaW5rbW9kZSBpbgorICAgIGxpYikKKwlwYXNzZXM9ImNvbnYgbGluayIKKwlmb3IgZmlsZSBpbiAkZGxmaWxlcyAkZGxwcmVmaWxlczsgZG8KKwkgIGNhc2UgJGZpbGUgaW4KKwkgICoubGEpIDs7CisJICAqKQorCSAgICAkZWNobyAiJG1vZGVuYW1lOiBsaWJyYXJpZXMgY2FuIFxgLWRsb3Blbicgb25seSBsaWJ0b29sIGxpYnJhcmllczogJGZpbGUiIDE+JjIKKwkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisJICAgIDs7CisJICBlc2FjCisJZG9uZQorCTs7CisgICAgcHJvZykKKwljb21waWxlX2RlcGxpYnM9CisJZmluYWxpemVfZGVwbGlicz0KKwlhbGxkZXBsaWJzPW5vCisJbmV3ZGxmaWxlcz0KKwluZXdkbHByZWZpbGVzPQorCXBhc3Nlcz0iY29udiBzY2FuIGRsb3BlbiBkbHByZW9wZW4gbGluayIKKwk7OworICAgICopICBwYXNzZXM9ImNvbnYiCisJOzsKKyAgICBlc2FjCisgICAgZm9yIHBhc3MgaW4gJHBhc3NlczsgZG8KKyAgICAgIGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAibGliLGxpbmsiIHx8CisJIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxzY2FuIjsgdGhlbgorCWxpYnM9IiRkZXBsaWJzIgorCWRlcGxpYnM9CisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KKwljYXNlICRwYXNzIGluCisJZGxvcGVuKSBsaWJzPSIkZGxmaWxlcyIgOzsKKwlkbHByZW9wZW4pIGxpYnM9IiRkbHByZWZpbGVzIiA7OworCWxpbmspCisJICBsaWJzPSIkZGVwbGlicyAlREVQTElCUyUiCisJICB0ZXN0ICJYJGxpbmtfYWxsX2RlcGxpYnMiICE9IFhubyAmJiBsaWJzPSIkbGlicyAkZGVwZW5kZW5jeV9saWJzIgorCSAgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJHBhc3MiID0gZGxvcGVuOyB0aGVuCisJIyBDb2xsZWN0IGRscHJlb3BlbmVkIGxpYnJhcmllcworCXNhdmVfZGVwbGlicz0iJGRlcGxpYnMiCisJZGVwbGlicz0KKyAgICAgIGZpCisgICAgICBmb3IgZGVwbGliIGluICRsaWJzOyBkbworCWxpYj0KKwlmb3VuZD1ubworCWNhc2UgJGRlcGxpYiBpbgorCS1tdHwtbXRocmVhZHN8LWt0aHJlYWR8LUt0aHJlYWR8LXB0aHJlYWR8LXB0aHJlYWRzfC0tdGhyZWFkLXNhZmUpCisJICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KKwkgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCisJICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkZXBsaWIgJGZpbmFsaXplX2RlcGxpYnMiCisJICBlbHNlCisJICAgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJGRlcGxpYiIKKwkgIGZpCisJICBjb250aW51ZQorCSAgOzsKKwktbCopCisJICBpZiB0ZXN0ICIkbGlua21vZGUiICE9IGxpYiAmJiB0ZXN0ICIkbGlua21vZGUiICE9IHByb2c7IHRoZW4KKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtbCcgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMvb2JqZWN0cyIgMT4mMgorCSAgICBjb250aW51ZQorCSAgZmkKKwkgIG5hbWU9YCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncy9eLWwvLydgCisJICBmb3Igc2VhcmNoZGlyIGluICRuZXdsaWJfc2VhcmNoX3BhdGggJGxpYl9zZWFyY2hfcGF0aCAkc3lzX2xpYl9zZWFyY2hfcGF0aCAkc2hsaWJfc2VhcmNoX3BhdGg7IGRvCisJICAgIGZvciBzZWFyY2hfZXh0IGluIC5sYSAkc3RkX3NocmV4dCAuc28gLmE7IGRvCisJICAgICAgIyBTZWFyY2ggdGhlIGxpYnRvb2wgbGlicmFyeQorCSAgICAgIGxpYj0iJHNlYXJjaGRpci9saWIke25hbWV9JHtzZWFyY2hfZXh0fSIKKwkgICAgICBpZiB0ZXN0IC1mICIkbGliIjsgdGhlbgorCQlpZiB0ZXN0ICIkc2VhcmNoX2V4dCIgPSAiLmxhIjsgdGhlbgorCQkgIGZvdW5kPXllcworCQllbHNlCisJCSAgZm91bmQ9bm8KKwkJZmkKKwkJYnJlYWsgMgorCSAgICAgIGZpCisJICAgIGRvbmUKKwkgIGRvbmUKKwkgIGlmIHRlc3QgIiRmb3VuZCIgIT0geWVzOyB0aGVuCisJICAgICMgZGVwbGliIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIGxpYnRvb2wgbGlicmFyeQorCSAgICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KKwkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgICBlbHNlCisJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgICB0ZXN0ICIkbGlua21vZGUiID0gbGliICYmIG5ld2RlcGVuZGVuY3lfbGlicz0iJGRlcGxpYiAkbmV3ZGVwZW5kZW5jeV9saWJzIgorCSAgICBmaQorCSAgICBjb250aW51ZQorCSAgZWxzZSAjIGRlcGxpYiBpcyBhIGxpYnRvb2wgbGlicmFyeQorCSAgICAjIElmICRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMgJiYgJGRlcGxpYiBpcyBhIHN0ZGxpYiwKKwkgICAgIyBXZSBuZWVkIHRvIGRvIHNvbWUgc3BlY2lhbCB0aGluZ3MgaGVyZSwgYW5kIG5vdCBsYXRlci4KKwkgICAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgorCSAgICAgIGNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgIiBpbgorCSAgICAgICoiICRkZXBsaWIgIiopCisJCWlmICgke1NFRH0gLWUgJzJxJyAkbGliIHwKKyAgICAgICAgICAgICAgICAgICAgZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkJICBsaWJyYXJ5X25hbWVzPQorCQkgIG9sZF9saWJyYXJ5PQorCQkgIGNhc2UgJGxpYiBpbgorCQkgICovKiB8ICpcXCopIC4gJGxpYiA7OworCQkgICopIC4gLi8kbGliIDs7CisJCSAgZXNhYworCQkgIGZvciBsIGluICRvbGRfbGlicmFyeSAkbGlicmFyeV9uYW1lczsgZG8KKwkJICAgIGxsPSIkbCIKKwkJICBkb25lCisJCSAgaWYgdGVzdCAiWCRsbCIgPSAiWCRvbGRfbGlicmFyeSIgOyB0aGVuICMgb25seSBzdGF0aWMgdmVyc2lvbiBhdmFpbGFibGUKKwkJICAgIGZvdW5kPW5vCisJCSAgICBsYWRpcj1gJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCisJCSAgICB0ZXN0ICJYJGxhZGlyIiA9ICJYJGxpYiIgJiYgbGFkaXI9Ii4iCisJCSAgICBsaWI9JGxhZGlyLyRvbGRfbGlicmFyeQorCQkgICAgaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLGxpbmsiOyB0aGVuCisJCSAgICAgIGNvbXBpbGVfZGVwbGlicz0iJGRlcGxpYiAkY29tcGlsZV9kZXBsaWJzIgorCQkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCQkgICAgZWxzZQorCQkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCQkgICAgICB0ZXN0ICIkbGlua21vZGUiID0gbGliICYmIG5ld2RlcGVuZGVuY3lfbGlicz0iJGRlcGxpYiAkbmV3ZGVwZW5kZW5jeV9saWJzIgorCQkgICAgZmkKKwkJICAgIGNvbnRpbnVlCisJCSAgZmkKKwkJZmkKKwkgICAgICAgIDs7CisJICAgICAgKikgOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICBmaQorCSAgOzsgIyAtbAorCS1MKikKKwkgIGNhc2UgJGxpbmttb2RlIGluCisJICBsaWIpCisJICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgIHRlc3QgIiRwYXNzIiA9IGNvbnYgJiYgY29udGludWUKKwkgICAgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCisJICAgIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAiYCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncy9eLUwvLydgCisJICAgIDs7CisJICBwcm9nKQorCSAgICBpZiB0ZXN0ICIkcGFzcyIgPSBjb252OyB0aGVuCisJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgICBjb250aW51ZQorCSAgICBmaQorCSAgICBpZiB0ZXN0ICIkcGFzcyIgPSBzY2FuOyB0aGVuCisJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgZWxzZQorCSAgICAgIGNvbXBpbGVfZGVwbGlicz0iJGRlcGxpYiAkY29tcGlsZV9kZXBsaWJzIgorCSAgICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkZXBsaWIgJGZpbmFsaXplX2RlcGxpYnMiCisJICAgIGZpCisJICAgIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAiYCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncy9eLUwvLydgCisJICAgIDs7CisJICAqKQorCSAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1MJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcy9vYmplY3RzIiAxPiYyCisJICAgIDs7CisJICBlc2FjICMgbGlua21vZGUKKwkgIGNvbnRpbnVlCisJICA7OyAjIC1MCisJLVIqKQorCSAgaWYgdGVzdCAiJHBhc3MiID0gbGluazsgdGhlbgorCSAgICBkaXI9YCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncy9eLVIvLydgCisJICAgICMgTWFrZSBzdXJlIHRoZSB4cnBhdGggY29udGFpbnMgb25seSB1bmlxdWUgZGlyZWN0b3JpZXMuCisJICAgIGNhc2UgIiR4cnBhdGggIiBpbgorCSAgICAqIiAkZGlyICIqKSA7OworCSAgICAqKSB4cnBhdGg9IiR4cnBhdGggJGRpciIgOzsKKwkgICAgZXNhYworCSAgZmkKKwkgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICBjb250aW51ZQorCSAgOzsKKwkqLmxhKSBsaWI9IiRkZXBsaWIiIDs7CisJKi4kbGliZXh0KQorCSAgaWYgdGVzdCAiJHBhc3MiID0gY29udjsgdGhlbgorCSAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICBjb250aW51ZQorCSAgZmkKKwkgIGNhc2UgJGxpbmttb2RlIGluCisJICBsaWIpCisJICAgIHZhbGlkX2FfbGliPW5vCisJICAgIGNhc2UgJGRlcGxpYnNfY2hlY2tfbWV0aG9kIGluCisJICAgICAgbWF0Y2hfcGF0dGVybiopCisJCXNldCBkdW1teSAkZGVwbGlic19jaGVja19tZXRob2QKKwkgICAgICAgIG1hdGNoX3BhdHRlcm5fcmVnZXg9YGV4cHIgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgOiAiJDIgXCguKlwpImAKKwkJaWYgZXZhbCAkZWNobyBcIiRkZXBsaWJcIiAyPi9kZXYvbnVsbCBcCisJCSAgICB8ICRTRUQgMTBxIFwKKwkJICAgIHwgJEVHUkVQICIkbWF0Y2hfcGF0dGVybl9yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KKwkJICB2YWxpZF9hX2xpYj15ZXMKKwkJZmkKKwkJOzsKKwkgICAgICBwYXNzX2FsbCkKKwkJdmFsaWRfYV9saWI9eWVzCisJCTs7CisgICAgICAgICAgICBlc2FjCisJICAgIGlmIHRlc3QgIiR2YWxpZF9hX2xpYiIgIT0geWVzOyB0aGVuCisJICAgICAgJGVjaG8KKwkgICAgICAkZWNobyAiKioqIFdhcm5pbmc6IFRyeWluZyB0byBsaW5rIHdpdGggc3RhdGljIGxpYiBhcmNoaXZlICRkZXBsaWIuIgorCSAgICAgICRlY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgorCSAgICAgICRlY2hvICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgorCSAgICAgICRlY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUiCisJICAgICAgJGVjaG8gIioqKiBiZWNhdXNlIHRoZSBmaWxlIGV4dGVuc2lvbnMgLiRsaWJleHQgb2YgdGhpcyBhcmd1bWVudCBtYWtlcyBtZSBiZWxpZXZlIgorCSAgICAgICRlY2hvICIqKiogdGhhdCBpdCBpcyBqdXN0IGEgc3RhdGljIGFyY2hpdmUgdGhhdCBJIHNob3VsZCBub3QgdXNlZCBoZXJlLiIKKwkgICAgZWxzZQorCSAgICAgICRlY2hvCisJICAgICAgJGVjaG8gIioqKiBXYXJuaW5nOiBMaW5raW5nIHRoZSBzaGFyZWQgbGlicmFyeSAkb3V0cHV0IGFnYWluc3QgdGhlIgorCSAgICAgICRlY2hvICIqKiogc3RhdGljIGxpYnJhcnkgJGRlcGxpYiBpcyBub3QgcG9ydGFibGUhIgorCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgIGZpCisJICAgIGNvbnRpbnVlCisJICAgIDs7CisJICBwcm9nKQorCSAgICBpZiB0ZXN0ICIkcGFzcyIgIT0gbGluazsgdGhlbgorCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgIGVsc2UKKwkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgICBmaQorCSAgICBjb250aW51ZQorCSAgICA7OworCSAgZXNhYyAjIGxpbmttb2RlCisJICA7OyAjICouJGxpYmV4dAorCSoubG8gfCAqLiRvYmpleHQpCisJICBpZiB0ZXN0ICIkcGFzcyIgPSBjb252OyB0aGVuCisJICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICBlbGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCisJICAgIGlmIHRlc3QgIiRwYXNzIiA9IGRscHJlb3BlbiB8fCB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiICE9IHllcyB8fCB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IG5vOyB0aGVuCisJICAgICAgIyBJZiB0aGVyZSBpcyBubyBkbG9wZW4gc3VwcG9ydCBvciB3ZSdyZSBsaW5raW5nIHN0YXRpY2FsbHksCisJICAgICAgIyB3ZSBuZWVkIHRvIHByZWxvYWQuCisJICAgICAgbmV3ZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMgJGRlcGxpYiIKKwkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgICBlbHNlCisJICAgICAgbmV3ZGxmaWxlcz0iJG5ld2RsZmlsZXMgJGRlcGxpYiIKKwkgICAgZmkKKwkgIGZpCisJICBjb250aW51ZQorCSAgOzsKKwklREVQTElCUyUpCisJICBhbGxkZXBsaWJzPXllcworCSAgY29udGludWUKKwkgIDs7CisJZXNhYyAjIGNhc2UgJGRlcGxpYgorCWlmIHRlc3QgIiRmb3VuZCIgPSB5ZXMgfHwgdGVzdCAtZiAiJGxpYiI7IHRoZW4gOgorCWVsc2UKKwkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBmaW5kIHRoZSBsaWJyYXJ5IFxgJGxpYicgb3IgdW5oYW5kbGVkIGFyZ3VtZW50IFxgJGRlcGxpYiciIDE+JjIKKwkgIGV4aXQgJEVYSVRfRkFJTFVSRQorCWZpCisKKwkjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBhcmNoaXZlLgorCWlmICgke1NFRH0gLWUgJzJxJyAkbGliIHwgZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorCWVsc2UKKwkgICRlY2hvICIkbW9kZW5hbWU6IFxgJGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIiAxPiYyCisJICBleGl0ICRFWElUX0ZBSUxVUkUKKwlmaQorCisJbGFkaXI9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAorCXRlc3QgIlgkbGFkaXIiID0gIlgkbGliIiAmJiBsYWRpcj0iLiIKKworCWRsbmFtZT0KKwlkbG9wZW49CisJZGxwcmVvcGVuPQorCWxpYmRpcj0KKwlsaWJyYXJ5X25hbWVzPQorCW9sZF9saWJyYXJ5PQorCSMgSWYgdGhlIGxpYnJhcnkgd2FzIGluc3RhbGxlZCB3aXRoIGFuIG9sZCByZWxlYXNlIG9mIGxpYnRvb2wsCisJIyBpdCB3aWxsIG5vdCByZWRlZmluZSB2YXJpYWJsZXMgaW5zdGFsbGVkLCBvciBzaG91bGRub3RsaW5rCisJaW5zdGFsbGVkPXllcworCXNob3VsZG5vdGxpbms9bm8KKwlhdm9pZHRlbXBycGF0aD0KKworCisJIyBSZWFkIHRoZSAubGEgZmlsZQorCWNhc2UgJGxpYiBpbgorCSovKiB8ICpcXCopIC4gJGxpYiA7OworCSopIC4gLi8kbGliIDs7CisJZXNhYworCisJaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJsaWIsbGluayIgfHwKKwkgICB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csc2NhbiIgfHwKKwkgICB7IHRlc3QgIiRsaW5rbW9kZSIgIT0gcHJvZyAmJiB0ZXN0ICIkbGlua21vZGUiICE9IGxpYjsgfTsgdGhlbgorCSAgdGVzdCAtbiAiJGRsb3BlbiIgJiYgZGxmaWxlcz0iJGRsZmlsZXMgJGRsb3BlbiIKKwkgIHRlc3QgLW4gIiRkbHByZW9wZW4iICYmIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRkbHByZW9wZW4iCisJZmkKKworCWlmIHRlc3QgIiRwYXNzIiA9IGNvbnY7IHRoZW4KKwkgICMgT25seSBjaGVjayBmb3IgY29udmVuaWVuY2UgbGlicmFyaWVzCisJICBkZXBsaWJzPSIkbGliICRkZXBsaWJzIgorCSAgaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KKwkgICAgaWYgdGVzdCAteiAiJG9sZF9saWJyYXJ5IjsgdGhlbgorCSAgICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBmaW5kIG5hbWUgb2YgbGluayBsaWJyYXJ5IGZvciBcYCRsaWInIiAxPiYyCisJICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisJICAgIGZpCisJICAgICMgSXQgaXMgYSBsaWJ0b29sIGNvbnZlbmllbmNlIGxpYnJhcnksIHNvIGFkZCBpbiBpdHMgb2JqZWN0cy4KKwkgICAgY29udmVuaWVuY2U9IiRjb252ZW5pZW5jZSAkbGFkaXIvJG9iamRpci8kb2xkX2xpYnJhcnkiCisJICAgIG9sZF9jb252ZW5pZW5jZT0iJG9sZF9jb252ZW5pZW5jZSAkbGFkaXIvJG9iamRpci8kb2xkX2xpYnJhcnkiCisJICAgIHRtcF9saWJzPQorCSAgICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCisJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKyAgICAgICAgICAgICAgaWYgdGVzdCAiWCRkdXBsaWNhdGVfZGVwcyIgPSAiWHllcyIgOyB0aGVuCisJICAgICAgICBjYXNlICIkdG1wX2xpYnMgIiBpbgorCSAgICAgICAgKiIgJGRlcGxpYiAiKikgc3BlY2lhbGRlcGxpYnM9IiRzcGVjaWFsZGVwbGlicyAkZGVwbGliIiA7OworCSAgICAgICAgZXNhYworICAgICAgICAgICAgICBmaQorCSAgICAgIHRtcF9saWJzPSIkdG1wX2xpYnMgJGRlcGxpYiIKKwkgICAgZG9uZQorCSAgZWxpZiB0ZXN0ICIkbGlua21vZGUiICE9IHByb2cgJiYgdGVzdCAiJGxpbmttb2RlIiAhPSBsaWI7IHRoZW4KKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogXGAkbGliJyBpcyBub3QgYSBjb252ZW5pZW5jZSBsaWJyYXJ5IiAxPiYyCisJICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorCSAgZmkKKwkgIGNvbnRpbnVlCisJZmkgIyAkcGFzcyA9IGNvbnYKKworCisJIyBHZXQgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgd2UgbGluayBhZ2FpbnN0LgorCWxpbmtsaWI9CisJZm9yIGwgaW4gJG9sZF9saWJyYXJ5ICRsaWJyYXJ5X25hbWVzOyBkbworCSAgbGlua2xpYj0iJGwiCisJZG9uZQorCWlmIHRlc3QgLXogIiRsaW5rbGliIjsgdGhlbgorCSAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGZpbmQgbmFtZSBvZiBsaW5rIGxpYnJhcnkgZm9yIFxgJGxpYiciIDE+JjIKKwkgIGV4aXQgJEVYSVRfRkFJTFVSRQorCWZpCisKKwkjIFRoaXMgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRsb3Blbi4KKwlpZiB0ZXN0ICIkcGFzcyIgPSBkbG9wZW47IHRoZW4KKwkgIGlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCisJICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCAtZGxvcGVuIGEgY29udmVuaWVuY2UgbGlicmFyeTogXGAkbGliJyIgMT4mMgorCSAgICBleGl0ICRFWElUX0ZBSUxVUkUKKwkgIGZpCisJICBpZiB0ZXN0IC16ICIkZGxuYW1lIiB8fAorCSAgICAgdGVzdCAiJGRsb3Blbl9zdXBwb3J0IiAhPSB5ZXMgfHwKKwkgICAgIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gbm87IHRoZW4KKwkgICAgIyBJZiB0aGVyZSBpcyBubyBkbG5hbWUsIG5vIGRsb3BlbiBzdXBwb3J0IG9yIHdlJ3JlIGxpbmtpbmcKKwkgICAgIyBzdGF0aWNhbGx5LCB3ZSBuZWVkIHRvIHByZWxvYWQuICBXZSBhbHNvIG5lZWQgdG8gcHJlbG9hZCBhbnkKKwkgICAgIyBkZXBlbmRlbnQgbGlicmFyaWVzIHNvIGxpYmx0ZGwncyBkZXBsaWIgcHJlbG9hZGVyIGRvZXNuJ3QKKwkgICAgIyBib21iIG91dCBpbiB0aGUgbG9hZCBkZXBsaWJzIHBoYXNlLgorCSAgICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkbGliICRkZXBlbmRlbmN5X2xpYnMiCisJICBlbHNlCisJICAgIG5ld2RsZmlsZXM9IiRuZXdkbGZpbGVzICRsaWIiCisJICBmaQorCSAgY29udGludWUKKwlmaSAjICRwYXNzID0gZGxvcGVuCisKKwkjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KKwljYXNlICRsYWRpciBpbgorCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgYWJzX2xhZGlyPSIkbGFkaXIiIDs7CisJKikKKwkgIGFic19sYWRpcj1gY2QgIiRsYWRpciIgJiYgcHdkYAorCSAgaWYgdGVzdCAteiAiJGFic19sYWRpciI7IHRoZW4KKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogY2Fubm90IGRldGVybWluZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBvZiBcYCRsYWRpciciIDE+JjIKKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogcGFzc2luZyBpdCBsaXRlcmFsbHkgdG8gdGhlIGxpbmtlciwgYWx0aG91Z2ggaXQgbWlnaHQgZmFpbCIgMT4mMgorCSAgICBhYnNfbGFkaXI9IiRsYWRpciIKKwkgIGZpCisJICA7OworCWVzYWMKKwlsYW5hbWU9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorCisJIyBGaW5kIHRoZSByZWxldmFudCBvYmplY3QgZGlyZWN0b3J5IGFuZCBsaWJyYXJ5IG5hbWUuCisJaWYgdGVzdCAiWCRpbnN0YWxsZWQiID0gWHllczsgdGhlbgorCSAgaWYgdGVzdCAhIC1mICIkbGliZGlyLyRsaW5rbGliIiAmJiB0ZXN0IC1mICIkYWJzX2xhZGlyLyRsaW5rbGliIjsgdGhlbgorCSAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBsaWJyYXJ5IFxgJGxpYicgd2FzIG1vdmVkLiIgMT4mMgorCSAgICBkaXI9IiRsYWRpciIKKwkgICAgYWJzZGlyPSIkYWJzX2xhZGlyIgorCSAgICBsaWJkaXI9IiRhYnNfbGFkaXIiCisJICBlbHNlCisJICAgIGRpcj0iJGxpYmRpciIKKwkgICAgYWJzZGlyPSIkbGliZGlyIgorCSAgZmkKKwkgIHRlc3QgIlgkaGFyZGNvZGVfYXV0b21hdGljIiA9IFh5ZXMgJiYgYXZvaWR0ZW1wcnBhdGg9eWVzCisJZWxzZQorCSAgaWYgdGVzdCAhIC1mICIkbGFkaXIvJG9iamRpci8kbGlua2xpYiIgJiYgdGVzdCAtZiAiJGFic19sYWRpci8kbGlua2xpYiI7IHRoZW4KKwkgICAgZGlyPSIkbGFkaXIiCisJICAgIGFic2Rpcj0iJGFic19sYWRpciIKKwkgICAgIyBSZW1vdmUgdGhpcyBzZWFyY2ggcGF0aCBsYXRlcgorCSAgICBub3RpbnN0X3BhdGg9IiRub3RpbnN0X3BhdGggJGFic19sYWRpciIKKwkgIGVsc2UKKwkgICAgZGlyPSIkbGFkaXIvJG9iamRpciIKKwkgICAgYWJzZGlyPSIkYWJzX2xhZGlyLyRvYmpkaXIiCisJICAgICMgUmVtb3ZlIHRoaXMgc2VhcmNoIHBhdGggbGF0ZXIKKwkgICAgbm90aW5zdF9wYXRoPSIkbm90aW5zdF9wYXRoICRhYnNfbGFkaXIiCisJICBmaQorCWZpICMgJGluc3RhbGxlZCA9IHllcworCW5hbWU9YCRlY2hvICJYJGxhbmFtZSIgfCAkWHNlZCAtZSAncy9cLmxhJC8vJyAtZSAncy9ebGliLy8nYAorCisJIyBUaGlzIGxpYnJhcnkgd2FzIHNwZWNpZmllZCB3aXRoIC1kbHByZW9wZW4uCisJaWYgdGVzdCAiJHBhc3MiID0gZGxwcmVvcGVuOyB0aGVuCisJICBpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgorCSAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgLWRscHJlb3BlbiBhIGNvbnZlbmllbmNlIGxpYnJhcnk6IFxgJGxpYiciIDE+JjIKKwkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisJICBmaQorCSAgIyBQcmVmZXIgdXNpbmcgYSBzdGF0aWMgbGlicmFyeSAoc28gdGhhdCBubyBzaWxseSBfRFlOQU1JQyBzeW1ib2xzCisJICAjIGFyZSByZXF1aXJlZCB0byBsaW5rKS4KKwkgIGlmIHRlc3QgLW4gIiRvbGRfbGlicmFyeSI7IHRoZW4KKwkgICAgbmV3ZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMgJGRpci8kb2xkX2xpYnJhcnkiCisJICAjIE90aGVyd2lzZSwgdXNlIHRoZSBkbG5hbWUsIHNvIHRoYXQgbHRfZGxvcGVuIGZpbmRzIGl0LgorCSAgZWxpZiB0ZXN0IC1uICIkZGxuYW1lIjsgdGhlbgorCSAgICBuZXdkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyAkZGlyLyRkbG5hbWUiCisJICBlbHNlCisJICAgIG5ld2RscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzICRkaXIvJGxpbmtsaWIiCisJICBmaQorCWZpICMgJHBhc3MgPSBkbHByZW9wZW4KKworCWlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCisJICAjIExpbmsgdGhlIGNvbnZlbmllbmNlIGxpYnJhcnkKKwkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWI7IHRoZW4KKwkgICAgZGVwbGlicz0iJGRpci8kb2xkX2xpYnJhcnkgJGRlcGxpYnMiCisJICBlbGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxsaW5rIjsgdGhlbgorCSAgICBjb21waWxlX2RlcGxpYnM9IiRkaXIvJG9sZF9saWJyYXJ5ICRjb21waWxlX2RlcGxpYnMiCisJICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkaXIvJG9sZF9saWJyYXJ5ICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgZWxzZQorCSAgICBkZXBsaWJzPSIkbGliICRkZXBsaWJzIiAjIHVzZWQgZm9yIHByb2csc2NhbiBwYXNzCisJICBmaQorCSAgY29udGludWUKKwlmaQorCisKKwlpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZyAmJiB0ZXN0ICIkcGFzcyIgIT0gbGluazsgdGhlbgorCSAgbmV3bGliX3NlYXJjaF9wYXRoPSIkbmV3bGliX3NlYXJjaF9wYXRoICRsYWRpciIKKwkgIGRlcGxpYnM9IiRsaWIgJGRlcGxpYnMiCisKKwkgIGxpbmthbGxkZXBsaWJzPW5vCisJICBpZiB0ZXN0ICIkbGlua19hbGxfZGVwbGlicyIgIT0gbm8gfHwgdGVzdCAteiAiJGxpYnJhcnlfbmFtZXMiIHx8CisJICAgICB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IG5vOyB0aGVuCisJICAgIGxpbmthbGxkZXBsaWJzPXllcworCSAgZmkKKworCSAgdG1wX2xpYnM9CisJICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCisJICAgIGNhc2UgJGRlcGxpYiBpbgorCSAgICAtTCopIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAiYCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncy9eLUwvLydgOzsgIyMjIHRlc3RzdWl0ZTogc2tpcCBuZXN0ZWQgcXVvdGluZyB0ZXN0CisJICAgIGVzYWMKKwkgICAgIyBOZWVkIHRvIGxpbmsgYWdhaW5zdCBhbGwgZGVwZW5kZW5jeV9saWJzPworCSAgICBpZiB0ZXN0ICIkbGlua2FsbGRlcGxpYnMiID0geWVzOyB0aGVuCisJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgZWxzZQorCSAgICAgICMgTmVlZCB0byBoYXJkY29kZSBzaGFyZWQgbGlicmFyeSBwYXRocworCSAgICAgICMgb3IvYW5kIGxpbmsgYWdhaW5zdCBzdGF0aWMgbGlicmFyaWVzCisJICAgICAgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCisJICAgIGZpCisJICAgIGlmIHRlc3QgIlgkZHVwbGljYXRlX2RlcHMiID0gIlh5ZXMiIDsgdGhlbgorCSAgICAgIGNhc2UgIiR0bXBfbGlicyAiIGluCisJICAgICAgKiIgJGRlcGxpYiAiKikgc3BlY2lhbGRlcGxpYnM9IiRzcGVjaWFsZGVwbGlicyAkZGVwbGliIiA7OworCSAgICAgIGVzYWMKKwkgICAgZmkKKwkgICAgdG1wX2xpYnM9IiR0bXBfbGlicyAkZGVwbGliIgorCSAgZG9uZSAjIGZvciBkZXBsaWIKKwkgIGNvbnRpbnVlCisJZmkgIyAkbGlua21vZGUgPSBwcm9nLi4uCisKKwlpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KKwkgIGlmIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIiAmJgorCSAgICAgeyB0ZXN0ICIkcHJlZmVyX3N0YXRpY19saWJzIiA9IG5vIHx8IHRlc3QgLXogIiRvbGRfbGlicmFyeSI7IH07IHRoZW4KKwkgICAgIyBXZSBuZWVkIHRvIGhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGgKKwkgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiICYmIHRlc3QgLXogIiRhdm9pZHRlbXBycGF0aCIgOyB0aGVuCisJICAgICAgIyBNYWtlIHN1cmUgdGhlIHJwYXRoIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGRpcmVjdG9yaWVzLgorCSAgICAgIGNhc2UgIiR0ZW1wX3JwYXRoICIgaW4KKwkgICAgICAqIiAkZGlyICIqKSA7OworCSAgICAgICoiICRhYnNkaXIgIiopIDs7CisJICAgICAgKikgdGVtcF9ycGF0aD0iJHRlbXBfcnBhdGggJGFic2RpciIgOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisKKwkgICAgIyBIYXJkY29kZSB0aGUgbGlicmFyeSBwYXRoLgorCSAgICAjIFNraXAgZGlyZWN0b3JpZXMgdGhhdCBhcmUgaW4gdGhlIHN5c3RlbSBkZWZhdWx0IHJ1bi10aW1lCisJICAgICMgc2VhcmNoIHBhdGguCisJICAgIGNhc2UgIiAkc3lzX2xpYl9kbHNlYXJjaF9wYXRoICIgaW4KKwkgICAgKiIgJGFic2RpciAiKikgOzsKKwkgICAgKikKKwkgICAgICBjYXNlICIkY29tcGlsZV9ycGF0aCAiIGluCisJICAgICAgKiIgJGFic2RpciAiKikgOzsKKwkgICAgICAqKSBjb21waWxlX3JwYXRoPSIkY29tcGlsZV9ycGF0aCAkYWJzZGlyIgorCSAgICAgIGVzYWMKKwkgICAgICA7OworCSAgICBlc2FjCisJICAgIGNhc2UgIiAkc3lzX2xpYl9kbHNlYXJjaF9wYXRoICIgaW4KKwkgICAgKiIgJGxpYmRpciAiKikgOzsKKwkgICAgKikKKwkgICAgICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgorCSAgICAgICoiICRsaWJkaXIgIiopIDs7CisJICAgICAgKikgZmluYWxpemVfcnBhdGg9IiRmaW5hbGl6ZV9ycGF0aCAkbGliZGlyIgorCSAgICAgIGVzYWMKKwkgICAgICA7OworCSAgICBlc2FjCisJICBmaSAjICRsaW5rbW9kZSwkcGFzcyA9IHByb2csbGluay4uLgorCisJICBpZiB0ZXN0ICIkYWxsZGVwbGlicyIgPSB5ZXMgJiYKKwkgICAgIHsgdGVzdCAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA9IHBhc3NfYWxsIHx8CisJICAgICAgIHsgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYKKwkJIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIjsgfTsgfTsgdGhlbgorCSAgICAjIFdlIG9ubHkgbmVlZCB0byBzZWFyY2ggZm9yIHN0YXRpYyBsaWJyYXJpZXMKKwkgICAgY29udGludWUKKwkgIGZpCisJZmkKKworCWxpbmtfc3RhdGljPW5vICMgV2hldGhlciB0aGUgZGVwbGliIHdpbGwgYmUgbGlua2VkIHN0YXRpY2FsbHkKKwl1c2Vfc3RhdGljX2xpYnM9JHByZWZlcl9zdGF0aWNfbGlicworCWlmIHRlc3QgIiR1c2Vfc3RhdGljX2xpYnMiID0gYnVpbHQgJiYgdGVzdCAiJGluc3RhbGxlZCIgPSB5ZXMgOyB0aGVuCisJICB1c2Vfc3RhdGljX2xpYnM9bm8KKwlmaQorCWlmIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIiAmJgorCSAgIHsgdGVzdCAiJHVzZV9zdGF0aWNfbGlicyIgPSBubyB8fCB0ZXN0IC16ICIkb2xkX2xpYnJhcnkiOyB9OyB0aGVuCisJICBpZiB0ZXN0ICIkaW5zdGFsbGVkIiA9IG5vOyB0aGVuCisJICAgIG5vdGluc3RfZGVwbGlicz0iJG5vdGluc3RfZGVwbGlicyAkbGliIgorCSAgICBuZWVkX3JlbGluaz15ZXMKKwkgIGZpCisJICAjIFRoaXMgaXMgYSBzaGFyZWQgbGlicmFyeQorCisJICAjIFdhcm4gYWJvdXQgcG9ydGFiaWxpdHksIGNhbid0IGxpbmsgYWdhaW5zdCAtbW9kdWxlJ3Mgb24KKwkgICMgc29tZSBzeXN0ZW1zIChkYXJ3aW4pCisJICBpZiB0ZXN0ICIkc2hvdWxkbm90bGluayIgPSB5ZXMgJiYgdGVzdCAiJHBhc3MiID0gbGluayA7IHRoZW4KKwkgICAgJGVjaG8KKwkgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KKwkgICAgICAkZWNobyAiKioqIFdhcm5pbmc6IExpbmtpbmcgdGhlIGV4ZWN1dGFibGUgJG91dHB1dCBhZ2FpbnN0IHRoZSBsb2FkYWJsZSBtb2R1bGUiCisJICAgIGVsc2UKKwkgICAgICAkZWNobyAiKioqIFdhcm5pbmc6IExpbmtpbmcgdGhlIHNoYXJlZCBsaWJyYXJ5ICRvdXRwdXQgYWdhaW5zdCB0aGUgbG9hZGFibGUgbW9kdWxlIgorCSAgICBmaQorCSAgICAkZWNobyAiKioqICRsaW5rbGliIGlzIG5vdCBwb3J0YWJsZSEiCisJICBmaQorCSAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IGxpYiAmJgorCSAgICAgdGVzdCAiJGhhcmRjb2RlX2ludG9fbGlicyIgPSB5ZXM7IHRoZW4KKwkgICAgIyBIYXJkY29kZSB0aGUgbGlicmFyeSBwYXRoLgorCSAgICAjIFNraXAgZGlyZWN0b3JpZXMgdGhhdCBhcmUgaW4gdGhlIHN5c3RlbSBkZWZhdWx0IHJ1bi10aW1lCisJICAgICMgc2VhcmNoIHBhdGguCisJICAgIGNhc2UgIiAkc3lzX2xpYl9kbHNlYXJjaF9wYXRoICIgaW4KKwkgICAgKiIgJGFic2RpciAiKikgOzsKKwkgICAgKikKKwkgICAgICBjYXNlICIkY29tcGlsZV9ycGF0aCAiIGluCisJICAgICAgKiIgJGFic2RpciAiKikgOzsKKwkgICAgICAqKSBjb21waWxlX3JwYXRoPSIkY29tcGlsZV9ycGF0aCAkYWJzZGlyIgorCSAgICAgIGVzYWMKKwkgICAgICA7OworCSAgICBlc2FjCisJICAgIGNhc2UgIiAkc3lzX2xpYl9kbHNlYXJjaF9wYXRoICIgaW4KKwkgICAgKiIgJGxpYmRpciAiKikgOzsKKwkgICAgKikKKwkgICAgICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgorCSAgICAgICoiICRsaWJkaXIgIiopIDs7CisJICAgICAgKikgZmluYWxpemVfcnBhdGg9IiRmaW5hbGl6ZV9ycGF0aCAkbGliZGlyIgorCSAgICAgIGVzYWMKKwkgICAgICA7OworCSAgICBlc2FjCisJICBmaQorCisJICBpZiB0ZXN0IC1uICIkb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMiOyB0aGVuCisJICAgICMgZmlndXJlIG91dCB0aGUgc29uYW1lCisJICAgIHNldCBkdW1teSAkbGlicmFyeV9uYW1lcworCSAgICByZWFsbmFtZT0iJDIiCisJICAgIHNoaWZ0OyBzaGlmdAorCSAgICBsaWJuYW1lPWBldmFsIFxcJGVjaG8gXCIkbGlibmFtZV9zcGVjXCJgCisJICAgICMgdXNlIGRsbmFtZSBpZiB3ZSBnb3QgaXQuIGl0J3MgcGVyZmVjdGx5IGdvb2QsIG5vPworCSAgICBpZiB0ZXN0IC1uICIkZGxuYW1lIjsgdGhlbgorCSAgICAgIHNvbmFtZT0iJGRsbmFtZSIKKwkgICAgZWxpZiB0ZXN0IC1uICIkc29uYW1lX3NwZWMiOyB0aGVuCisJICAgICAgIyBibGVoIHdpbmRvd3MKKwkgICAgICBjYXNlICRob3N0IGluCisJICAgICAgKmN5Z3dpbiogfCBtaW5ndyopCisJCW1ham9yPWBleHByICRjdXJyZW50IC0gJGFnZWAKKwkJdmVyc3VmZml4PSItJG1ham9yIgorCQk7OworCSAgICAgIGVzYWMKKwkgICAgICBldmFsIHNvbmFtZT1cIiRzb25hbWVfc3BlY1wiCisJICAgIGVsc2UKKwkgICAgICBzb25hbWU9IiRyZWFsbmFtZSIKKwkgICAgZmkKKworCSAgICAjIE1ha2UgYSBuZXcgbmFtZSBmb3IgdGhlIGV4dHJhY3RfZXhwc3ltc19jbWRzIHRvIHVzZQorCSAgICBzb3Jvb3Q9IiRzb25hbWUiCisJICAgIHNvbmFtZT1gJGVjaG8gJHNvcm9vdCB8ICR7U0VEfSAtZSAncy9eLipcLy8vJ2AKKwkgICAgbmV3bGliPSJsaWJpbXAtYCRlY2hvICRzb25hbWUgfCAke1NFRH0gJ3MvXmxpYi8vO3MvXC5kbGwkLy8nYC5hIgorCisJICAgICMgSWYgdGhlIGxpYnJhcnkgaGFzIG5vIGV4cG9ydCBsaXN0LCB0aGVuIGNyZWF0ZSBvbmUgbm93CisJICAgIGlmIHRlc3QgLWYgIiRvdXRwdXRfb2JqZGlyLyRzb25hbWUtZGVmIjsgdGhlbiA6CisJICAgIGVsc2UKKwkgICAgICAkc2hvdyAiZXh0cmFjdGluZyBleHBvcnRlZCBzeW1ib2wgbGlzdCBmcm9tIFxgJHNvbmFtZSciCisJICAgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisJICAgICAgY21kcz0kZXh0cmFjdF9leHBzeW1zX2NtZHMKKwkgICAgICBmb3IgY21kIGluICRjbWRzOyBkbworCQlJRlM9IiRzYXZlX2lmcyIKKwkJZXZhbCBjbWQ9XCIkY21kXCIKKwkJJHNob3cgIiRjbWQiCisJCSRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPworCSAgICAgIGRvbmUKKwkgICAgICBJRlM9IiRzYXZlX2lmcyIKKwkgICAgZmkKKworCSAgICAjIENyZWF0ZSAkbmV3bGliCisJICAgIGlmIHRlc3QgLWYgIiRvdXRwdXRfb2JqZGlyLyRuZXdsaWIiOyB0aGVuIDo7IGVsc2UKKwkgICAgICAkc2hvdyAiZ2VuZXJhdGluZyBpbXBvcnQgbGlicmFyeSBmb3IgXGAkc29uYW1lJyIKKwkgICAgICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKKwkgICAgICBjbWRzPSRvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcworCSAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCisJCUlGUz0iJHNhdmVfaWZzIgorCQlldmFsIGNtZD1cIiRjbWRcIgorCQkkc2hvdyAiJGNtZCIKKwkJJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/CisJICAgICAgZG9uZQorCSAgICAgIElGUz0iJHNhdmVfaWZzIgorCSAgICBmaQorCSAgICAjIG1ha2Ugc3VyZSB0aGUgbGlicmFyeSB2YXJpYWJsZXMgYXJlIHBvaW50aW5nIHRvIHRoZSBuZXcgbGlicmFyeQorCSAgICBkaXI9JG91dHB1dF9vYmpkaXIKKwkgICAgbGlua2xpYj0kbmV3bGliCisJICBmaSAjIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcyIKKworCSAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2cgfHwgdGVzdCAiJG1vZGUiICE9IHJlbGluazsgdGhlbgorCSAgICBhZGRfc2hsaWJwYXRoPQorCSAgICBhZGRfZGlyPQorCSAgICBhZGQ9CisJICAgIGxpYl9saW5rZWQ9eWVzCisJICAgIGNhc2UgJGhhcmRjb2RlX2FjdGlvbiBpbgorCSAgICBpbW1lZGlhdGUgfCB1bnN1cHBvcnRlZCkKKwkgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IG5vOyB0aGVuCisJCWFkZD0iJGRpci8kbGlua2xpYiIKKwkJY2FzZSAkaG9zdCBpbgorCQkgICotKi1zY28zLjJ2NS4wLlswMjRdKikgYWRkX2Rpcj0iLUwkZGlyIiA7OworCQkgICotKi1zeXN2NCp1dzIqKSBhZGRfZGlyPSItTCRkaXIiIDs7CisJCSAgKi0qLXN5c3Y1T3BlblVOSVgqIHwgKi0qLXN5c3Y1VW5peFdhcmU3LlswMV0uWzEwXSogfCBcCisJCSAgICAqLSotdW5peHdhcmU3KikgYWRkX2Rpcj0iLUwkZGlyIiA7OworCQkgICotKi1kYXJ3aW4qICkKKwkJICAgICMgaWYgdGhlIGxpYiBpcyBhIG1vZHVsZSB0aGVuIHdlIGNhbiBub3QgbGluayBhZ2FpbnN0CisJCSAgICAjIGl0LCBzb21lb25lIGlzIGlnbm9yaW5nIHRoZSBuZXcgd2FybmluZ3MgSSBhZGRlZAorCQkgICAgaWYgL3Vzci9iaW4vZmlsZSAtTCAkYWRkIDI+IC9kZXYvbnVsbCB8CisgICAgICAgICAgICAgICAgICAgICAgJEVHUkVQICI6IFteOl0qIGJ1bmRsZSIgPi9kZXYvbnVsbCA7IHRoZW4KKwkJICAgICAgJGVjaG8gIioqIFdhcm5pbmcsIGxpYiAkbGlua2xpYiBpcyBhIG1vZHVsZSwgbm90IGEgc2hhcmVkIGxpYnJhcnkiCisJCSAgICAgIGlmIHRlc3QgLXogIiRvbGRfbGlicmFyeSIgOyB0aGVuCisJCSAgICAgICAgJGVjaG8KKwkJICAgICAgICAkZWNobyAiKiogQW5kIHRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIHN0YXRpYyBhcmNoaXZlIGF2YWlsYWJsZSIKKwkJICAgICAgICAkZWNobyAiKiogVGhlIGxpbmsgd2lsbCBwcm9iYWJseSBmYWlsLCBzb3JyeSIKKwkJICAgICAgZWxzZQorCQkgICAgICAgIGFkZD0iJGRpci8kb2xkX2xpYnJhcnkiCisJCSAgICAgIGZpCisJCSAgICBmaQorCQllc2FjCisJICAgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgPSBubzsgdGhlbgorCQljYXNlICRob3N0IGluCisJCSotKi1zdW5vcyopIGFkZF9zaGxpYnBhdGg9IiRkaXIiIDs7CisJCWVzYWMKKwkJYWRkX2Rpcj0iLUwkZGlyIgorCQlhZGQ9Ii1sJG5hbWUiCisJICAgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgPSBubzsgdGhlbgorCQlhZGRfc2hsaWJwYXRoPSIkZGlyIgorCQlhZGQ9Ii1sJG5hbWUiCisJICAgICAgZWxzZQorCQlsaWJfbGlua2VkPW5vCisJICAgICAgZmkKKwkgICAgICA7OworCSAgICByZWxpbmspCisJICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgPSB5ZXM7IHRoZW4KKwkJYWRkPSIkZGlyLyRsaW5rbGliIgorCSAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiID0geWVzOyB0aGVuCisJCWFkZF9kaXI9Ii1MJGRpciIKKwkJIyBUcnkgbG9va2luZyBmaXJzdCBpbiB0aGUgbG9jYXRpb24gd2UncmUgYmVpbmcgaW5zdGFsbGVkIHRvLgorCQlpZiB0ZXN0IC1uICIkaW5zdF9wcmVmaXhfZGlyIjsgdGhlbgorCQkgIGNhc2UgJGxpYmRpciBpbgorCQkgICAgW1xcL10qKQorCQkgICAgICBhZGRfZGlyPSIkYWRkX2RpciAtTCRpbnN0X3ByZWZpeF9kaXIkbGliZGlyIgorCQkgICAgICA7OworCQkgIGVzYWMKKwkJZmkKKwkJYWRkPSItbCRuYW1lIgorCSAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0geWVzOyB0aGVuCisJCWFkZF9zaGxpYnBhdGg9IiRkaXIiCisJCWFkZD0iLWwkbmFtZSIKKwkgICAgICBlbHNlCisJCWxpYl9saW5rZWQ9bm8KKwkgICAgICBmaQorCSAgICAgIDs7CisJICAgICopIGxpYl9saW5rZWQ9bm8gOzsKKwkgICAgZXNhYworCisJICAgIGlmIHRlc3QgIiRsaWJfbGlua2VkIiAhPSB5ZXM7IHRoZW4KKwkgICAgICAkZWNobyAiJG1vZGVuYW1lOiBjb25maWd1cmF0aW9uIGVycm9yOiB1bnN1cHBvcnRlZCBoYXJkY29kZSBwcm9wZXJ0aWVzIgorCSAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorCSAgICBmaQorCisJICAgIGlmIHRlc3QgLW4gIiRhZGRfc2hsaWJwYXRoIjsgdGhlbgorCSAgICAgIGNhc2UgOiRjb21waWxlX3NobGlicGF0aDogaW4KKwkgICAgICAqIjokYWRkX3NobGlicGF0aDoiKikgOzsKKwkgICAgICAqKSBjb21waWxlX3NobGlicGF0aD0iJGNvbXBpbGVfc2hsaWJwYXRoJGFkZF9zaGxpYnBhdGg6IiA7OworCSAgICAgIGVzYWMKKwkgICAgZmkKKwkgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KKwkgICAgICB0ZXN0IC1uICIkYWRkX2RpciIgJiYgY29tcGlsZV9kZXBsaWJzPSIkYWRkX2RpciAkY29tcGlsZV9kZXBsaWJzIgorCSAgICAgIHRlc3QgLW4gIiRhZGQiICYmIGNvbXBpbGVfZGVwbGlicz0iJGFkZCAkY29tcGlsZV9kZXBsaWJzIgorCSAgICBlbHNlCisJICAgICAgdGVzdCAtbiAiJGFkZF9kaXIiICYmIGRlcGxpYnM9IiRhZGRfZGlyICRkZXBsaWJzIgorCSAgICAgIHRlc3QgLW4gIiRhZGQiICYmIGRlcGxpYnM9IiRhZGQgJGRlcGxpYnMiCisJICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgIT0geWVzICYmIFwKKwkJIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiAhPSB5ZXMgJiYgXAorCQkgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0geWVzOyB0aGVuCisJCWNhc2UgOiRmaW5hbGl6ZV9zaGxpYnBhdGg6IGluCisJCSoiOiRsaWJkaXI6IiopIDs7CisJCSopIGZpbmFsaXplX3NobGlicGF0aD0iJGZpbmFsaXplX3NobGlicGF0aCRsaWJkaXI6IiA7OworCQllc2FjCisJICAgICAgZmkKKwkgICAgZmkKKwkgIGZpCisKKwkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nIHx8IHRlc3QgIiRtb2RlIiA9IHJlbGluazsgdGhlbgorCSAgICBhZGRfc2hsaWJwYXRoPQorCSAgICBhZGRfZGlyPQorCSAgICBhZGQ9CisJICAgICMgRmluYWxpemUgY29tbWFuZCBmb3IgYm90aCBpcyBzaW1wbGU6IGp1c3QgaGFyZGNvZGUgaXQuCisJICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0geWVzOyB0aGVuCisJICAgICAgYWRkPSIkbGliZGlyLyRsaW5rbGliIgorCSAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IHllczsgdGhlbgorCSAgICAgIGFkZF9kaXI9Ii1MJGxpYmRpciIKKwkgICAgICBhZGQ9Ii1sJG5hbWUiCisJICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0geWVzOyB0aGVuCisJICAgICAgY2FzZSA6JGZpbmFsaXplX3NobGlicGF0aDogaW4KKwkgICAgICAqIjokbGliZGlyOiIqKSA7OworCSAgICAgICopIGZpbmFsaXplX3NobGlicGF0aD0iJGZpbmFsaXplX3NobGlicGF0aCRsaWJkaXI6IiA7OworCSAgICAgIGVzYWMKKwkgICAgICBhZGQ9Ii1sJG5hbWUiCisJICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX2F1dG9tYXRpYyIgPSB5ZXM7IHRoZW4KKwkgICAgICBpZiB0ZXN0IC1uICIkaW5zdF9wcmVmaXhfZGlyIiAmJgorCQkgdGVzdCAtZiAiJGluc3RfcHJlZml4X2RpciRsaWJkaXIvJGxpbmtsaWIiIDsgdGhlbgorCSAgICAgICAgYWRkPSIkaW5zdF9wcmVmaXhfZGlyJGxpYmRpci8kbGlua2xpYiIKKwkgICAgICBlbHNlCisJICAgICAgICBhZGQ9IiRsaWJkaXIvJGxpbmtsaWIiCisJICAgICAgZmkKKwkgICAgZWxzZQorCSAgICAgICMgV2UgY2Fubm90IHNlZW0gdG8gaGFyZGNvZGUgaXQsIGd1ZXNzIHdlJ2xsIGZha2UgaXQuCisJICAgICAgYWRkX2Rpcj0iLUwkbGliZGlyIgorCSAgICAgICMgVHJ5IGxvb2tpbmcgZmlyc3QgaW4gdGhlIGxvY2F0aW9uIHdlJ3JlIGJlaW5nIGluc3RhbGxlZCB0by4KKwkgICAgICBpZiB0ZXN0IC1uICIkaW5zdF9wcmVmaXhfZGlyIjsgdGhlbgorCQljYXNlICRsaWJkaXIgaW4KKwkJICBbXFwvXSopCisJCSAgICBhZGRfZGlyPSIkYWRkX2RpciAtTCRpbnN0X3ByZWZpeF9kaXIkbGliZGlyIgorCQkgICAgOzsKKwkJZXNhYworCSAgICAgIGZpCisJICAgICAgYWRkPSItbCRuYW1lIgorCSAgICBmaQorCisJICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCisJICAgICAgdGVzdCAtbiAiJGFkZF9kaXIiICYmIGZpbmFsaXplX2RlcGxpYnM9IiRhZGRfZGlyICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgICAgIHRlc3QgLW4gIiRhZGQiICYmIGZpbmFsaXplX2RlcGxpYnM9IiRhZGQgJGZpbmFsaXplX2RlcGxpYnMiCisJICAgIGVsc2UKKwkgICAgICB0ZXN0IC1uICIkYWRkX2RpciIgJiYgZGVwbGlicz0iJGFkZF9kaXIgJGRlcGxpYnMiCisJICAgICAgdGVzdCAtbiAiJGFkZCIgJiYgZGVwbGlicz0iJGFkZCAkZGVwbGlicyIKKwkgICAgZmkKKwkgIGZpCisJZWxpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgorCSAgIyBIZXJlIHdlIGFzc3VtZSB0aGF0IG9uZSBvZiBoYXJkY29kZV9kaXJlY3Qgb3IgaGFyZGNvZGVfbWludXNfTAorCSAgIyBpcyBub3QgdW5zdXBwb3J0ZWQuICBUaGlzIGlzIHZhbGlkIG9uIGFsbCBrbm93biBzdGF0aWMgYW5kCisJICAjIHNoYXJlZCBwbGF0Zm9ybXMuCisJICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiAhPSB1bnN1cHBvcnRlZDsgdGhlbgorCSAgICB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiICYmIGxpbmtsaWI9IiRvbGRfbGlicmFyeSIKKwkgICAgY29tcGlsZV9kZXBsaWJzPSIkZGlyLyRsaW5rbGliICRjb21waWxlX2RlcGxpYnMiCisJICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkaXIvJGxpbmtsaWIgJGZpbmFsaXplX2RlcGxpYnMiCisJICBlbHNlCisJICAgIGNvbXBpbGVfZGVwbGlicz0iLWwkbmFtZSAtTCRkaXIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgZmluYWxpemVfZGVwbGlicz0iLWwkbmFtZSAtTCRkaXIgJGZpbmFsaXplX2RlcGxpYnMiCisJICBmaQorCWVsaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KKwkgICMgTm90IGEgc2hhcmVkIGxpYnJhcnkKKwkgIGlmIHRlc3QgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgIT0gcGFzc19hbGw7IHRoZW4KKwkgICAgIyBXZSdyZSB0cnlpbmcgbGluayBhIHNoYXJlZCBsaWJyYXJ5IGFnYWluc3QgYSBzdGF0aWMgb25lCisJICAgICMgYnV0IHRoZSBzeXN0ZW0gZG9lc24ndCBzdXBwb3J0IGl0LgorCisJICAgICMgSnVzdCBwcmludCBhIHdhcm5pbmcgYW5kIGFkZCB0aGUgbGlicmFyeSB0byBkZXBlbmRlbmN5X2xpYnMgc28KKwkgICAgIyB0aGF0IHRoZSBwcm9ncmFtIGNhbiBiZSBsaW5rZWQgYWdhaW5zdCB0aGUgc3RhdGljIGxpYnJhcnkuCisJICAgICRlY2hvCisJICAgICRlY2hvICIqKiogV2FybmluZzogVGhpcyBzeXN0ZW0gY2FuIG5vdCBsaW5rIHRvIHN0YXRpYyBsaWIgYXJjaGl2ZSAkbGliLiIKKwkgICAgJGVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCisJICAgICRlY2hvICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgorCSAgICAkZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlLiIKKwkgICAgaWYgdGVzdCAiJG1vZHVsZSIgPSB5ZXM7IHRoZW4KKwkgICAgICAkZWNobyAiKioqIEJ1dCBhcyB5b3UgdHJ5IHRvIGJ1aWxkIGEgbW9kdWxlIGxpYnJhcnksIGxpYnRvb2wgd2lsbCBzdGlsbCBjcmVhdGUgIgorCSAgICAgICRlY2hvICIqKiogYSBzdGF0aWMgbW9kdWxlLCB0aGF0IHNob3VsZCB3b3JrIGFzIGxvbmcgYXMgdGhlIGRsb3BlbmluZyBhcHBsaWNhdGlvbiIKKwkgICAgICAkZWNobyAiKioqIGlzIGxpbmtlZCB3aXRoIHRoZSAtZGxvcGVuIGZsYWcgdG8gcmVzb2x2ZSBzeW1ib2xzIGF0IHJ1bnRpbWUuIgorCSAgICAgIGlmIHRlc3QgLXogIiRnbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCisJCSRlY2hvCisJCSRlY2hvICIqKiogSG93ZXZlciwgdGhpcyB3b3VsZCBvbmx5IHdvcmsgaWYgbGlidG9vbCB3YXMgYWJsZSB0byBleHRyYWN0IHN5bWJvbCIKKwkJJGVjaG8gIioqKiBsaXN0cyBmcm9tIGEgcHJvZ3JhbSwgdXNpbmcgXGBubScgb3IgZXF1aXZhbGVudCwgYnV0IGxpYnRvb2wgY291bGQiCisJCSRlY2hvICIqKiogbm90IGZpbmQgc3VjaCBhIHByb2dyYW0uICBTbywgdGhpcyBtb2R1bGUgaXMgcHJvYmFibHkgdXNlbGVzcy4iCisJCSRlY2hvICIqKiogXGBubScgZnJvbSBHTlUgYmludXRpbHMgYW5kIGEgZnVsbCByZWJ1aWxkIG1heSBoZWxwLiIKKwkgICAgICBmaQorCSAgICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSBubzsgdGhlbgorCQlidWlsZF9saWJ0b29sX2xpYnM9bW9kdWxlCisJCWJ1aWxkX29sZF9saWJzPXllcworCSAgICAgIGVsc2UKKwkJYnVpbGRfbGlidG9vbF9saWJzPW5vCisJICAgICAgZmkKKwkgICAgZmkKKwkgIGVsc2UKKwkgICAgZGVwbGlicz0iJGRpci8kb2xkX2xpYnJhcnkgJGRlcGxpYnMiCisJICAgIGxpbmtfc3RhdGljPXllcworCSAgZmkKKwlmaSAjIGxpbmsgc2hhcmVkL3N0YXRpYyBsaWJyYXJ5PworCisJaWYgdGVzdCAiJGxpbmttb2RlIiA9IGxpYjsgdGhlbgorCSAgaWYgdGVzdCAtbiAiJGRlcGVuZGVuY3lfbGlicyIgJiYKKwkgICAgIHsgdGVzdCAiJGhhcmRjb2RlX2ludG9fbGlicyIgIT0geWVzIHx8CisJICAgICAgIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXMgfHwKKwkgICAgICAgdGVzdCAiJGxpbmtfc3RhdGljIiA9IHllczsgfTsgdGhlbgorCSAgICAjIEV4dHJhY3QgLVIgZnJvbSBkZXBlbmRlbmN5X2xpYnMKKwkgICAgdGVtcF9kZXBsaWJzPQorCSAgICBmb3IgbGliZGlyIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCisJICAgICAgY2FzZSAkbGliZGlyIGluCisJICAgICAgLVIqKSB0ZW1wX3hycGF0aD1gJGVjaG8gIlgkbGliZGlyIiB8ICRYc2VkIC1lICdzL14tUi8vJ2AKKwkJICAgY2FzZSAiICR4cnBhdGggIiBpbgorCQkgICAqIiAkdGVtcF94cnBhdGggIiopIDs7CisJCSAgICopIHhycGF0aD0iJHhycGF0aCAkdGVtcF94cnBhdGgiOzsKKwkJICAgZXNhYzs7CisJICAgICAgKikgdGVtcF9kZXBsaWJzPSIkdGVtcF9kZXBsaWJzICRsaWJkaXIiOzsKKwkgICAgICBlc2FjCisJICAgIGRvbmUKKwkgICAgZGVwZW5kZW5jeV9saWJzPSIkdGVtcF9kZXBsaWJzIgorCSAgZmkKKworCSAgbmV3bGliX3NlYXJjaF9wYXRoPSIkbmV3bGliX3NlYXJjaF9wYXRoICRhYnNkaXIiCisJICAjIExpbmsgYWdhaW5zdCB0aGlzIGxpYnJhcnkKKwkgIHRlc3QgIiRsaW5rX3N0YXRpYyIgPSBubyAmJiBuZXdkZXBlbmRlbmN5X2xpYnM9IiRhYnNfbGFkaXIvJGxhbmFtZSAkbmV3ZGVwZW5kZW5jeV9saWJzIgorCSAgIyAuLi4gYW5kIGl0cyBkZXBlbmRlbmN5X2xpYnMKKwkgIHRtcF9saWJzPQorCSAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworCSAgICBuZXdkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWIgJG5ld2RlcGVuZGVuY3lfbGlicyIKKwkgICAgaWYgdGVzdCAiWCRkdXBsaWNhdGVfZGVwcyIgPSAiWHllcyIgOyB0aGVuCisJICAgICAgY2FzZSAiJHRtcF9saWJzICIgaW4KKwkgICAgICAqIiAkZGVwbGliICIqKSBzcGVjaWFsZGVwbGlicz0iJHNwZWNpYWxkZXBsaWJzICRkZXBsaWIiIDs7CisJICAgICAgZXNhYworCSAgICBmaQorCSAgICB0bXBfbGlicz0iJHRtcF9saWJzICRkZXBsaWIiCisJICBkb25lCisKKwkgIGlmIHRlc3QgIiRsaW5rX2FsbF9kZXBsaWJzIiAhPSBubzsgdGhlbgorCSAgICAjIEFkZCB0aGUgc2VhcmNoIHBhdGhzIG9mIGFsbCBkZXBlbmRlbmN5IGxpYnJhcmllcworCSAgICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCisJICAgICAgY2FzZSAkZGVwbGliIGluCisJICAgICAgLUwqKSBwYXRoPSIkZGVwbGliIiA7OworCSAgICAgICoubGEpCisJCWRpcj1gJGVjaG8gIlgkZGVwbGliIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCisJCXRlc3QgIlgkZGlyIiA9ICJYJGRlcGxpYiIgJiYgZGlyPSIuIgorCQkjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KKwkJY2FzZSAkZGlyIGluCisJCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgYWJzZGlyPSIkZGlyIiA7OworCQkqKQorCQkgIGFic2Rpcj1gY2QgIiRkaXIiICYmIHB3ZGAKKwkJICBpZiB0ZXN0IC16ICIkYWJzZGlyIjsgdGhlbgorCQkgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogY2Fubm90IGRldGVybWluZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBvZiBcYCRkaXInIiAxPiYyCisJCSAgICBhYnNkaXI9IiRkaXIiCisJCSAgZmkKKwkJICA7OworCQllc2FjCisJCWlmIGdyZXAgIl5pbnN0YWxsZWQ9bm8iICRkZXBsaWIgPiAvZGV2L251bGw7IHRoZW4KKwkJICBwYXRoPSIkYWJzZGlyLyRvYmpkaXIiCisJCWVsc2UKKwkJICBldmFsIGxpYmRpcj1gJHtTRUR9IC1uIC1lICdzL15saWJkaXI9XCguKlwpJC9cMS9wJyAkZGVwbGliYAorCQkgIGlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCisJCSAgICAkZWNobyAiJG1vZGVuYW1lOiBcYCRkZXBsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgorCQkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisJCSAgZmkKKwkJICBpZiB0ZXN0ICIkYWJzZGlyIiAhPSAiJGxpYmRpciI7IHRoZW4KKwkJICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgJGRlcGxpYicgc2VlbXMgdG8gYmUgbW92ZWQiIDE+JjIKKwkJICBmaQorCQkgIHBhdGg9IiRhYnNkaXIiCisJCWZpCisJCWRlcGRlcGw9CisJCWNhc2UgJGhvc3QgaW4KKwkJKi0qLWRhcndpbiopCisJCSAgIyB3ZSBkbyBub3Qgd2FudCB0byBsaW5rIGFnYWluc3Qgc3RhdGljIGxpYnMsCisJCSAgIyBidXQgbmVlZCB0byBsaW5rIGFnYWluc3Qgc2hhcmVkCisJCSAgZXZhbCBkZXBsaWJyYXJ5X25hbWVzPWAke1NFRH0gLW4gLWUgJ3MvXmxpYnJhcnlfbmFtZXM9XCguKlwpJC9cMS9wJyAkZGVwbGliYAorCQkgIGlmIHRlc3QgLW4gIiRkZXBsaWJyYXJ5X25hbWVzIiA7IHRoZW4KKwkJICAgIGZvciB0bXAgaW4gJGRlcGxpYnJhcnlfbmFtZXMgOyBkbworCQkgICAgICBkZXBkZXBsPSR0bXAKKwkJICAgIGRvbmUKKwkJICAgIGlmIHRlc3QgLWYgIiRwYXRoLyRkZXBkZXBsIiA7IHRoZW4KKwkJICAgICAgZGVwZGVwbD0iJHBhdGgvJGRlcGRlcGwiCisJCSAgICBmaQorCQkgICAgIyBkbyBub3QgYWRkIHBhdGhzIHdoaWNoIGFyZSBhbHJlYWR5IHRoZXJlCisJCSAgICBjYXNlICIgJG5ld2xpYl9zZWFyY2hfcGF0aCAiIGluCisJCSAgICAqIiAkcGF0aCAiKikgOzsKKwkJICAgICopIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAkcGF0aCI7OworCQkgICAgZXNhYworCQkgIGZpCisJCSAgcGF0aD0iIgorCQkgIDs7CisJCSopCisJCSAgcGF0aD0iLUwkcGF0aCIKKwkJICA7OworCQllc2FjCisJCTs7CisJICAgICAgLWwqKQorCQljYXNlICRob3N0IGluCisJCSotKi1kYXJ3aW4qKQorCQkgICMgQWdhaW4sIHdlIG9ubHkgd2FudCB0byBsaW5rIGFnYWluc3Qgc2hhcmVkIGxpYnJhcmllcworCQkgIGV2YWwgdG1wX2xpYnM9YCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAicyxeXC1sLCwiYAorCQkgIGZvciB0bXAgaW4gJG5ld2xpYl9zZWFyY2hfcGF0aCA7IGRvCisJCSAgICBpZiB0ZXN0IC1mICIkdG1wL2xpYiR0bXBfbGlicy5keWxpYiIgOyB0aGVuCisJCSAgICAgIGV2YWwgZGVwZGVwbD0iJHRtcC9saWIkdG1wX2xpYnMuZHlsaWIiCisJCSAgICAgIGJyZWFrCisJCSAgICBmaQorCQkgIGRvbmUKKwkJICBwYXRoPSIiCisJCSAgOzsKKwkJKikgY29udGludWUgOzsKKwkJZXNhYworCQk7OworCSAgICAgICopIGNvbnRpbnVlIDs7CisJICAgICAgZXNhYworCSAgICAgIGNhc2UgIiAkZGVwbGlicyAiIGluCisJICAgICAgKiIgJHBhdGggIiopIDs7CisJICAgICAgKikgZGVwbGlicz0iJHBhdGggJGRlcGxpYnMiIDs7CisJICAgICAgZXNhYworCSAgICAgIGNhc2UgIiAkZGVwbGlicyAiIGluCisJICAgICAgKiIgJGRlcGRlcGwgIiopIDs7CisJICAgICAgKikgZGVwbGlicz0iJGRlcGRlcGwgJGRlcGxpYnMiIDs7CisJICAgICAgZXNhYworCSAgICBkb25lCisJICBmaSAjIGxpbmtfYWxsX2RlcGxpYnMgIT0gbm8KKwlmaSAjIGxpbmttb2RlID0gbGliCisgICAgICBkb25lICMgZm9yIGRlcGxpYiBpbiAkbGlicworICAgICAgZGVwZW5kZW5jeV9saWJzPSIkbmV3ZGVwZW5kZW5jeV9saWJzIgorICAgICAgaWYgdGVzdCAiJHBhc3MiID0gZGxwcmVvcGVuOyB0aGVuCisJIyBMaW5rIHRoZSBkbHByZW9wZW5lZCBsaWJyYXJpZXMgYmVmb3JlIG90aGVyIGxpYnJhcmllcworCWZvciBkZXBsaWIgaW4gJHNhdmVfZGVwbGliczsgZG8KKwkgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJZG9uZQorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiRwYXNzIiAhPSBkbG9wZW47IHRoZW4KKwlpZiB0ZXN0ICIkcGFzcyIgIT0gY29udjsgdGhlbgorCSAgIyBNYWtlIHN1cmUgbGliX3NlYXJjaF9wYXRoIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGRpcmVjdG9yaWVzLgorCSAgbGliX3NlYXJjaF9wYXRoPQorCSAgZm9yIGRpciBpbiAkbmV3bGliX3NlYXJjaF9wYXRoOyBkbworCSAgICBjYXNlICIkbGliX3NlYXJjaF9wYXRoICIgaW4KKwkgICAgKiIgJGRpciAiKikgOzsKKwkgICAgKikgbGliX3NlYXJjaF9wYXRoPSIkbGliX3NlYXJjaF9wYXRoICRkaXIiIDs7CisJICAgIGVzYWMKKwkgIGRvbmUKKwkgIG5ld2xpYl9zZWFyY2hfcGF0aD0KKwlmaQorCisJaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiAhPSAicHJvZyxsaW5rIjsgdGhlbgorCSAgdmFycz0iZGVwbGlicyIKKwllbHNlCisJICB2YXJzPSJjb21waWxlX2RlcGxpYnMgZmluYWxpemVfZGVwbGlicyIKKwlmaQorCWZvciB2YXIgaW4gJHZhcnMgZGVwZW5kZW5jeV9saWJzOyBkbworCSAgIyBBZGQgbGlicmFyaWVzIHRvICR2YXIgaW4gcmV2ZXJzZSBvcmRlcgorCSAgZXZhbCB0bXBfbGlicz1cIlwkJHZhclwiCisJICBuZXdfbGlicz0KKwkgIGZvciBkZXBsaWIgaW4gJHRtcF9saWJzOyBkbworCSAgICAjIEZJWE1FOiBQZWRhbnRpY2FsbHksIHRoaXMgaXMgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvLCBzbworCSAgICAjICAgICAgICB0aGF0IHNvbWUgbmFzdHkgZGVwZW5kZW5jeSBsb29wIGlzbid0IGFjY2lkZW50YWxseQorCSAgICAjICAgICAgICBicm9rZW46CisJICAgICNuZXdfbGlicz0iJGRlcGxpYiAkbmV3X2xpYnMiCisJICAgICMgUHJhZ21hdGljYWxseSwgdGhpcyBzZWVtcyB0byBjYXVzZSB2ZXJ5IGZldyBwcm9ibGVtcyBpbgorCSAgICAjIHByYWN0aWNlOgorCSAgICBjYXNlICRkZXBsaWIgaW4KKwkgICAgLUwqKSBuZXdfbGlicz0iJGRlcGxpYiAkbmV3X2xpYnMiIDs7CisJICAgIC1SKikgOzsKKwkgICAgKikKKwkgICAgICAjIEFuZCBoZXJlIGlzIHRoZSByZWFzb246IHdoZW4gYSBsaWJyYXJ5IGFwcGVhcnMgbW9yZQorCSAgICAgICMgdGhhbiBvbmNlIGFzIGFuIGV4cGxpY2l0IGRlcGVuZGVuY2Ugb2YgYSBsaWJyYXJ5LCBvcgorCSAgICAgICMgaXMgaW1wbGljaXRseSBsaW5rZWQgaW4gbW9yZSB0aGFuIG9uY2UgYnkgdGhlCisJICAgICAgIyBjb21waWxlciwgaXQgaXMgY29uc2lkZXJlZCBzcGVjaWFsLCBhbmQgbXVsdGlwbGUKKwkgICAgICAjIG9jY3VycmVuY2VzIHRoZXJlb2YgYXJlIG5vdCByZW1vdmVkLiAgQ29tcGFyZSB0aGlzCisJICAgICAgIyB3aXRoIGhhdmluZyB0aGUgc2FtZSBsaWJyYXJ5IGJlaW5nIGxpc3RlZCBhcyBhCisJICAgICAgIyBkZXBlbmRlbmN5IG9mIG11bHRpcGxlIG90aGVyIGxpYnJhcmllczogaW4gdGhpcyBjYXNlLAorCSAgICAgICMgd2Uga25vdyAocGVkYW50aWNhbGx5LCB3ZSBhc3N1bWUpIHRoZSBsaWJyYXJ5IGRvZXMgbm90CisJICAgICAgIyBuZWVkIHRvIGJlIGxpc3RlZCBtb3JlIHRoYW4gb25jZSwgc28gd2Uga2VlcCBvbmx5IHRoZQorCSAgICAgICMgbGFzdCBjb3B5LiAgVGhpcyBpcyBub3QgYWx3YXlzIHJpZ2h0LCBidXQgaXQgaXMgcmFyZQorCSAgICAgICMgZW5vdWdoIHRoYXQgd2UgcmVxdWlyZSB1c2VycyB0aGF0IHJlYWxseSBtZWFuIHRvIHBsYXkKKwkgICAgICAjIHN1Y2ggdW5wb3J0YWJsZSBsaW5raW5nIHRyaWNrcyB0byBsaW5rIHRoZSBsaWJyYXJ5CisJICAgICAgIyB1c2luZyAtV2wsLWxuYW1lLCBzbyB0aGF0IGxpYnRvb2wgZG9lcyBub3QgY29uc2lkZXIgaXQKKwkgICAgICAjIGZvciBkdXBsaWNhdGUgcmVtb3ZhbC4KKwkgICAgICBjYXNlICIgJHNwZWNpYWxkZXBsaWJzICIgaW4KKwkgICAgICAqIiAkZGVwbGliICIqKSBuZXdfbGlicz0iJGRlcGxpYiAkbmV3X2xpYnMiIDs7CisJICAgICAgKikKKwkJY2FzZSAiICRuZXdfbGlicyAiIGluCisJCSoiICRkZXBsaWIgIiopIDs7CisJCSopIG5ld19saWJzPSIkZGVwbGliICRuZXdfbGlicyIgOzsKKwkJZXNhYworCQk7OworCSAgICAgIGVzYWMKKwkgICAgICA7OworCSAgICBlc2FjCisJICBkb25lCisJICB0bXBfbGlicz0KKwkgIGZvciBkZXBsaWIgaW4gJG5ld19saWJzOyBkbworCSAgICBjYXNlICRkZXBsaWIgaW4KKwkgICAgLUwqKQorCSAgICAgIGNhc2UgIiAkdG1wX2xpYnMgIiBpbgorCSAgICAgICoiICRkZXBsaWIgIiopIDs7CisJICAgICAgKikgdG1wX2xpYnM9IiR0bXBfbGlicyAkZGVwbGliIiA7OworCSAgICAgIGVzYWMKKwkgICAgICA7OworCSAgICAqKSB0bXBfbGlicz0iJHRtcF9saWJzICRkZXBsaWIiIDs7CisJICAgIGVzYWMKKwkgIGRvbmUKKwkgIGV2YWwgJHZhcj1cIiR0bXBfbGlic1wiCisJZG9uZSAjIGZvciB2YXIKKyAgICAgIGZpCisgICAgICAjIExhc3Qgc3RlcDogcmVtb3ZlIHJ1bnRpbWUgbGlicyBmcm9tIGRlcGVuZGVuY3lfbGlicworICAgICAgIyAodGhleSBzdGF5IGluIGRlcGxpYnMpCisgICAgICB0bXBfbGlicz0KKyAgICAgIGZvciBpIGluICRkZXBlbmRlbmN5X2xpYnMgOyBkbworCWNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgJGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCAiIGluCisJKiIgJGkgIiopCisJICBpPSIiCisJICA7OworCWVzYWMKKwlpZiB0ZXN0IC1uICIkaSIgOyB0aGVuCisJICB0bXBfbGlicz0iJHRtcF9saWJzICRpIgorCWZpCisgICAgICBkb25lCisgICAgICBkZXBlbmRlbmN5X2xpYnM9JHRtcF9saWJzCisgICAgZG9uZSAjIGZvciBwYXNzCisgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KKyAgICAgIGRsZmlsZXM9IiRuZXdkbGZpbGVzIgorICAgICAgZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMiCisgICAgZmkKKworICAgIGNhc2UgJGxpbmttb2RlIGluCisgICAgb2xkbGliKQorICAgICAgaWYgdGVzdCAtbiAiJGRlcGxpYnMiOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtbCcgYW5kIFxgLUwnIGFyZSBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyIgfHwgdGVzdCAiJGRsc2VsZiIgIT0gbm87IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1kbG9wZW4nIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkcnBhdGgiOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtcnBhdGgnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkeHJwYXRoIjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLVInIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkdmluZm8iOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtdmVyc2lvbi1pbmZvLy12ZXJzaW9uLW51bWJlcicgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiIDE+JjIKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRyZWxlYXNlIjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiIHx8IHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1leHBvcnQtc3ltYm9scycgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiIDE+JjIKKyAgICAgIGZpCisKKyAgICAgICMgTm93IHNldCB0aGUgdmFyaWFibGVzIGZvciBidWlsZGluZyBvbGQgbGlicmFyaWVzLgorICAgICAgYnVpbGRfbGlidG9vbF9saWJzPW5vCisgICAgICBvbGRsaWJzPSIkb3V0cHV0IgorICAgICAgb2Jqcz0iJG9ianMkb2xkX2RlcGxpYnMiCisgICAgICA7OworCisgICAgbGliKQorICAgICAgIyBNYWtlIHN1cmUgd2Ugb25seSBnZW5lcmF0ZSBsaWJyYXJpZXMgb2YgdGhlIGZvcm0gYGxpYk5BTUUubGEnLgorICAgICAgY2FzZSAkb3V0cHV0bmFtZSBpbgorICAgICAgbGliKikKKwluYW1lPWAkZWNobyAiWCRvdXRwdXRuYW1lIiB8ICRYc2VkIC1lICdzL1wubGEkLy8nIC1lICdzL15saWIvLydgCisJZXZhbCBzaGFyZWRfZXh0PVwiJHNocmV4dF9jbWRzXCIKKwlldmFsIGxpYm5hbWU9XCIkbGlibmFtZV9zcGVjXCIKKwk7OworICAgICAgKikKKwlpZiB0ZXN0ICIkbW9kdWxlIiA9IG5vOyB0aGVuCisJICAkZWNobyAiJG1vZGVuYW1lOiBsaWJ0b29sIGxpYnJhcnkgXGAkb3V0cHV0JyBtdXN0IGJlZ2luIHdpdGggXGBsaWInIiAxPiYyCisJICAkZWNobyAiJGhlbHAiIDE+JjIKKwkgIGV4aXQgJEVYSVRfRkFJTFVSRQorCWZpCisJaWYgdGVzdCAiJG5lZWRfbGliX3ByZWZpeCIgIT0gbm87IHRoZW4KKwkgICMgQWRkIHRoZSAibGliIiBwcmVmaXggZm9yIG1vZHVsZXMgaWYgcmVxdWlyZWQKKwkgIG5hbWU9YCRlY2hvICJYJG91dHB1dG5hbWUiIHwgJFhzZWQgLWUgJ3MvXC5sYSQvLydgCisJICBldmFsIHNoYXJlZF9leHQ9XCIkc2hyZXh0X2NtZHNcIgorCSAgZXZhbCBsaWJuYW1lPVwiJGxpYm5hbWVfc3BlY1wiCisJZWxzZQorCSAgbGlibmFtZT1gJGVjaG8gIlgkb3V0cHV0bmFtZSIgfCAkWHNlZCAtZSAncy9cLmxhJC8vJ2AKKwlmaQorCTs7CisgICAgICBlc2FjCisKKyAgICAgIGlmIHRlc3QgLW4gIiRvYmpzIjsgdGhlbgorCWlmIHRlc3QgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgIT0gcGFzc19hbGw7IHRoZW4KKwkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBidWlsZCBsaWJ0b29sIGxpYnJhcnkgXGAkb3V0cHV0JyBmcm9tIG5vbi1saWJ0b29sIG9iamVjdHMgb24gdGhpcyBob3N0OiRvYmpzIiAyPiYxCisJICBleGl0ICRFWElUX0ZBSUxVUkUKKwllbHNlCisJICAkZWNobworCSAgJGVjaG8gIioqKiBXYXJuaW5nOiBMaW5raW5nIHRoZSBzaGFyZWQgbGlicmFyeSAkb3V0cHV0IGFnYWluc3QgdGhlIG5vbi1saWJ0b29sIgorCSAgJGVjaG8gIioqKiBvYmplY3RzICRvYmpzIGlzIG5vdCBwb3J0YWJsZSEiCisJICBsaWJvYmpzPSIkbGlib2JqcyAkb2JqcyIKKwlmaQorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAiJGRsc2VsZiIgIT0gbm87IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1kbG9wZW4gc2VsZicgaXMgaWdub3JlZCBmb3IgbGlidG9vbCBsaWJyYXJpZXMiIDE+JjIKKyAgICAgIGZpCisKKyAgICAgIHNldCBkdW1teSAkcnBhdGgKKyAgICAgIGlmIHRlc3QgIiQjIiAtZ3QgMjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGlnbm9yaW5nIG11bHRpcGxlIFxgLXJwYXRoJ3MgZm9yIGEgbGlidG9vbCBsaWJyYXJ5IiAxPiYyCisgICAgICBmaQorICAgICAgaW5zdGFsbF9saWJkaXI9IiQyIgorCisgICAgICBvbGRsaWJzPQorICAgICAgaWYgdGVzdCAteiAiJHJwYXRoIjsgdGhlbgorCWlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCisJICAjIEJ1aWxkaW5nIGEgbGlidG9vbCBjb252ZW5pZW5jZSBsaWJyYXJ5LgorCSAgIyBTb21lIGNvbXBpbGVycyBoYXZlIHByb2JsZW1zIHdpdGggYSBgLmFsJyBleHRlbnNpb24gc28KKwkgICMgY29udmVuaWVuY2UgbGlicmFyaWVzIHNob3VsZCBoYXZlIHRoZSBzYW1lIGV4dGVuc2lvbiBhbgorCSAgIyBhcmNoaXZlIG5vcm1hbGx5IHdvdWxkLgorCSAgb2xkbGlicz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuJGxpYmV4dCAkb2xkbGlicyIKKwkgIGJ1aWxkX2xpYnRvb2xfbGlicz1jb252ZW5pZW5jZQorCSAgYnVpbGRfb2xkX2xpYnM9eWVzCisJZmkKKworCWlmIHRlc3QgLW4gIiR2aW5mbyI7IHRoZW4KKwkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXZlcnNpb24taW5mby8tdmVyc2lvbi1udW1iZXInIGlzIGlnbm9yZWQgZm9yIGNvbnZlbmllbmNlIGxpYnJhcmllcyIgMT4mMgorCWZpCisKKwlpZiB0ZXN0IC1uICIkcmVsZWFzZSI7IHRoZW4KKwkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIGNvbnZlbmllbmNlIGxpYnJhcmllcyIgMT4mMgorCWZpCisgICAgICBlbHNlCisKKwkjIFBhcnNlIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFyZ3VtZW50LgorCXNhdmVfaWZzPSIkSUZTIjsgSUZTPSc6JworCXNldCBkdW1teSAkdmluZm8gMCAwIDAKKwlJRlM9IiRzYXZlX2lmcyIKKworCWlmIHRlc3QgLW4gIiQ4IjsgdGhlbgorCSAgJGVjaG8gIiRtb2RlbmFtZTogdG9vIG1hbnkgcGFyYW1ldGVycyB0byBcYC12ZXJzaW9uLWluZm8nIiAxPiYyCisJICAkZWNobyAiJGhlbHAiIDE+JjIKKwkgIGV4aXQgJEVYSVRfRkFJTFVSRQorCWZpCisKKwkjIGNvbnZlcnQgYWJzb2x1dGUgdmVyc2lvbiBudW1iZXJzIHRvIGxpYnRvb2wgYWdlcworCSMgdGhpcyByZXRhaW5zIGNvbXBhdGliaWxpdHkgd2l0aCAubGEgZmlsZXMgYW5kIGF0dGVtcHRzCisJIyB0byBtYWtlIHRoZSBjb2RlIGJlbG93IGEgYml0IG1vcmUgY29tcHJlaGVuc2libGUKKworCWNhc2UgJHZpbmZvX251bWJlciBpbgorCXllcykKKwkgIG51bWJlcl9tYWpvcj0iJDIiCisJICBudW1iZXJfbWlub3I9IiQzIgorCSAgbnVtYmVyX3JldmlzaW9uPSIkNCIKKwkgICMKKwkgICMgVGhlcmUgYXJlIHJlYWxseSBvbmx5IHR3byBraW5kcyAtLSB0aG9zZSB0aGF0CisJICAjIHVzZSB0aGUgY3VycmVudCByZXZpc2lvbiBhcyB0aGUgbWFqb3IgdmVyc2lvbgorCSAgIyBhbmQgdGhvc2UgdGhhdCBzdWJ0cmFjdCBhZ2UgYW5kIHVzZSBhZ2UgYXMKKwkgICMgYSBtaW5vciB2ZXJzaW9uLiAgQnV0LCB0aGVuIHRoZXJlIGlzIGlyaXgKKwkgICMgd2hpY2ggaGFzIGFuIGV4dHJhIDEgYWRkZWQganVzdCBmb3IgZnVuCisJICAjCisJICBjYXNlICR2ZXJzaW9uX3R5cGUgaW4KKwkgIGRhcndpbnxsaW51eHxvc2Z8d2luZG93cykKKwkgICAgY3VycmVudD1gZXhwciAkbnVtYmVyX21ham9yICsgJG51bWJlcl9taW5vcmAKKwkgICAgYWdlPSIkbnVtYmVyX21pbm9yIgorCSAgICByZXZpc2lvbj0iJG51bWJlcl9yZXZpc2lvbiIKKwkgICAgOzsKKwkgIGZyZWVic2QtYW91dHxmcmVlYnNkLWVsZnxzdW5vcykKKwkgICAgY3VycmVudD0iJG51bWJlcl9tYWpvciIKKwkgICAgcmV2aXNpb249IiRudW1iZXJfbWlub3IiCisJICAgIGFnZT0iMCIKKwkgICAgOzsKKwkgIGlyaXh8bm9uc3RvcHV4KQorCSAgICBjdXJyZW50PWBleHByICRudW1iZXJfbWFqb3IgKyAkbnVtYmVyX21pbm9yIC0gMWAKKwkgICAgYWdlPSIkbnVtYmVyX21pbm9yIgorCSAgICByZXZpc2lvbj0iJG51bWJlcl9taW5vciIKKwkgICAgOzsKKwkgICopCisJICAgICRlY2hvICIkbW9kZW5hbWU6IHVua25vd24gbGlicmFyeSB2ZXJzaW9uIHR5cGUgXGAkdmVyc2lvbl90eXBlJyIgMT4mMgorCSAgICAkZWNobyAiRmF0YWwgY29uZmlndXJhdGlvbiBlcnJvci4gIFNlZSB0aGUgJFBBQ0tBR0UgZG9jcyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDE+JjIKKwkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisJICAgIDs7CisJICBlc2FjCisJICA7OworCW5vKQorCSAgY3VycmVudD0iJDIiCisJICByZXZpc2lvbj0iJDMiCisJICBhZ2U9IiQ0IgorCSAgOzsKKwllc2FjCisKKwkjIENoZWNrIHRoYXQgZWFjaCBvZiB0aGUgdGhpbmdzIGFyZSB2YWxpZCBudW1iZXJzLgorCWNhc2UgJGN1cnJlbnQgaW4KKwkwfFsxLTldfFsxLTldWzAtOV18WzEtOV1bMC05XVswLTldfFsxLTldWzAtOV1bMC05XVswLTldfFsxLTldWzAtOV1bMC05XVswLTldWzAtOV0pIDs7CisJKikKKwkgICRlY2hvICIkbW9kZW5hbWU6IENVUlJFTlQgXGAkY3VycmVudCcgbXVzdCBiZSBhIG5vbm5lZ2F0aXZlIGludGVnZXIiIDE+JjIKKwkgICRlY2hvICIkbW9kZW5hbWU6IFxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIgMT4mMgorCSAgZXhpdCAkRVhJVF9GQUlMVVJFCisJICA7OworCWVzYWMKKworCWNhc2UgJHJldmlzaW9uIGluCisJMHxbMS05XXxbMS05XVswLTldfFsxLTldWzAtOV1bMC05XXxbMS05XVswLTldWzAtOV1bMC05XXxbMS05XVswLTldWzAtOV1bMC05XVswLTldKSA7OworCSopCisJICAkZWNobyAiJG1vZGVuYW1lOiBSRVZJU0lPTiBcYCRyZXZpc2lvbicgbXVzdCBiZSBhIG5vbm5lZ2F0aXZlIGludGVnZXIiIDE+JjIKKwkgICRlY2hvICIkbW9kZW5hbWU6IFxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIgMT4mMgorCSAgZXhpdCAkRVhJVF9GQUlMVVJFCisJICA7OworCWVzYWMKKworCWNhc2UgJGFnZSBpbgorCTB8WzEtOV18WzEtOV1bMC05XXxbMS05XVswLTldWzAtOV18WzEtOV1bMC05XVswLTldWzAtOV18WzEtOV1bMC05XVswLTldWzAtOV1bMC05XSkgOzsKKwkqKQorCSAgJGVjaG8gIiRtb2RlbmFtZTogQUdFIFxgJGFnZScgbXVzdCBiZSBhIG5vbm5lZ2F0aXZlIGludGVnZXIiIDE+JjIKKwkgICRlY2hvICIkbW9kZW5hbWU6IFxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIgMT4mMgorCSAgZXhpdCAkRVhJVF9GQUlMVVJFCisJICA7OworCWVzYWMKKworCWlmIHRlc3QgIiRhZ2UiIC1ndCAiJGN1cnJlbnQiOyB0aGVuCisJICAkZWNobyAiJG1vZGVuYW1lOiBBR0UgXGAkYWdlJyBpcyBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgaW50ZXJmYWNlIG51bWJlciBcYCRjdXJyZW50JyIgMT4mMgorCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIiAxPiYyCisJICBleGl0ICRFWElUX0ZBSUxVUkUKKwlmaQorCisJIyBDYWxjdWxhdGUgdGhlIHZlcnNpb24gdmFyaWFibGVzLgorCW1ham9yPQorCXZlcnN1ZmZpeD0KKwl2ZXJzdHJpbmc9CisJY2FzZSAkdmVyc2lvbl90eXBlIGluCisJbm9uZSkgOzsKKworCWRhcndpbikKKwkgICMgTGlrZSBMaW51eCwgYnV0IHdpdGggdGhlIGN1cnJlbnQgdmVyc2lvbiBhdmFpbGFibGUgaW4KKwkgICMgdmVyc3RyaW5nIGZvciBjb2RpbmcgaXQgaW50byB0aGUgbGlicmFyeSBoZWFkZXIKKwkgIG1ham9yPS5gZXhwciAkY3VycmVudCAtICRhZ2VgCisJICB2ZXJzdWZmaXg9IiRtYWpvci4kYWdlLiRyZXZpc2lvbiIKKwkgICMgRGFyd2luIGxkIGRvZXNuJ3QgbGlrZSAwIGZvciB0aGVzZSBvcHRpb25zLi4uCisJICBtaW5vcl9jdXJyZW50PWBleHByICRjdXJyZW50ICsgMWAKKwkgIHZlcnN0cmluZz0iJHt3bH0tY29tcGF0aWJpbGl0eV92ZXJzaW9uICR7d2x9JG1pbm9yX2N1cnJlbnQgJHt3bH0tY3VycmVudF92ZXJzaW9uICR7d2x9JG1pbm9yX2N1cnJlbnQuJHJldmlzaW9uIgorCSAgOzsKKworCWZyZWVic2QtYW91dCkKKwkgIG1ham9yPSIuJGN1cnJlbnQiCisJICB2ZXJzdWZmaXg9Ii4kY3VycmVudC4kcmV2aXNpb24iOworCSAgOzsKKworCWZyZWVic2QtZWxmKQorCSAgbWFqb3I9Ii4kY3VycmVudCIKKwkgIHZlcnN1ZmZpeD0iLiRjdXJyZW50IjsKKwkgIDs7CisKKwlpcml4IHwgbm9uc3RvcHV4KQorCSAgbWFqb3I9YGV4cHIgJGN1cnJlbnQgLSAkYWdlICsgMWAKKworCSAgY2FzZSAkdmVyc2lvbl90eXBlIGluCisJICAgIG5vbnN0b3B1eCkgdmVyc3RyaW5nX3ByZWZpeD1ub25zdG9wdXggOzsKKwkgICAgKikgICAgICAgICB2ZXJzdHJpbmdfcHJlZml4PXNnaSA7OworCSAgZXNhYworCSAgdmVyc3RyaW5nPSIkdmVyc3RyaW5nX3ByZWZpeCRtYWpvci4kcmV2aXNpb24iCisKKwkgICMgQWRkIGluIGFsbCB0aGUgaW50ZXJmYWNlcyB0aGF0IHdlIGFyZSBjb21wYXRpYmxlIHdpdGguCisJICBsb29wPSRyZXZpc2lvbgorCSAgd2hpbGUgdGVzdCAiJGxvb3AiIC1uZSAwOyBkbworCSAgICBpZmFjZT1gZXhwciAkcmV2aXNpb24gLSAkbG9vcGAKKwkgICAgbG9vcD1gZXhwciAkbG9vcCAtIDFgCisJICAgIHZlcnN0cmluZz0iJHZlcnN0cmluZ19wcmVmaXgkbWFqb3IuJGlmYWNlOiR2ZXJzdHJpbmciCisJICBkb25lCisKKwkgICMgQmVmb3JlIHRoaXMgcG9pbnQsICRtYWpvciBtdXN0IG5vdCBjb250YWluIGAuJy4KKwkgIG1ham9yPS4kbWFqb3IKKwkgIHZlcnN1ZmZpeD0iJG1ham9yLiRyZXZpc2lvbiIKKwkgIDs7CisKKwlsaW51eCkKKwkgIG1ham9yPS5gZXhwciAkY3VycmVudCAtICRhZ2VgCisJICB2ZXJzdWZmaXg9IiRtYWpvci4kYWdlLiRyZXZpc2lvbiIKKwkgIDs7CisKKwlvc2YpCisJICBtYWpvcj0uYGV4cHIgJGN1cnJlbnQgLSAkYWdlYAorCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQuJGFnZS4kcmV2aXNpb24iCisJICB2ZXJzdHJpbmc9IiRjdXJyZW50LiRhZ2UuJHJldmlzaW9uIgorCisJICAjIEFkZCBpbiBhbGwgdGhlIGludGVyZmFjZXMgdGhhdCB3ZSBhcmUgY29tcGF0aWJsZSB3aXRoLgorCSAgbG9vcD0kYWdlCisJICB3aGlsZSB0ZXN0ICIkbG9vcCIgLW5lIDA7IGRvCisJICAgIGlmYWNlPWBleHByICRjdXJyZW50IC0gJGxvb3BgCisJICAgIGxvb3A9YGV4cHIgJGxvb3AgLSAxYAorCSAgICB2ZXJzdHJpbmc9IiR2ZXJzdHJpbmc6JHtpZmFjZX0uMCIKKwkgIGRvbmUKKworCSAgIyBNYWtlIGV4ZWN1dGFibGVzIGRlcGVuZCBvbiBvdXIgY3VycmVudCB2ZXJzaW9uLgorCSAgdmVyc3RyaW5nPSIkdmVyc3RyaW5nOiR7Y3VycmVudH0uMCIKKwkgIDs7CisKKwlzdW5vcykKKwkgIG1ham9yPSIuJGN1cnJlbnQiCisJICB2ZXJzdWZmaXg9Ii4kY3VycmVudC4kcmV2aXNpb24iCisJICA7OworCisJd2luZG93cykKKwkgICMgVXNlICctJyByYXRoZXIgdGhhbiAnLicsIHNpbmNlIHdlIG9ubHkgd2FudCBvbmUKKwkgICMgZXh0ZW5zaW9uIG9uIERPUyA4LjMgZmlsZXN5c3RlbXMuCisJICBtYWpvcj1gZXhwciAkY3VycmVudCAtICRhZ2VgCisJICB2ZXJzdWZmaXg9Ii0kbWFqb3IiCisJICA7OworCisJKikKKwkgICRlY2hvICIkbW9kZW5hbWU6IHVua25vd24gbGlicmFyeSB2ZXJzaW9uIHR5cGUgXGAkdmVyc2lvbl90eXBlJyIgMT4mMgorCSAgJGVjaG8gIkZhdGFsIGNvbmZpZ3VyYXRpb24gZXJyb3IuICBTZWUgdGhlICRQQUNLQUdFIGRvY3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAxPiYyCisJICBleGl0ICRFWElUX0ZBSUxVUkUKKwkgIDs7CisJZXNhYworCisJIyBDbGVhciB0aGUgdmVyc2lvbiBpbmZvIGlmIHdlIGRlZmF1bHRlZCwgYW5kIHRoZXkgc3BlY2lmaWVkIGEgcmVsZWFzZS4KKwlpZiB0ZXN0IC16ICIkdmluZm8iICYmIHRlc3QgLW4gIiRyZWxlYXNlIjsgdGhlbgorCSAgbWFqb3I9CisJICBjYXNlICR2ZXJzaW9uX3R5cGUgaW4KKwkgIGRhcndpbikKKwkgICAgIyB3ZSBjYW4ndCBjaGVjayBmb3IgIjAuMCIgaW4gYXJjaGl2ZV9jbWRzIGR1ZSB0byBxdW90aW5nCisJICAgICMgcHJvYmxlbXMsIHNvIHdlIHJlc2V0IGl0IGNvbXBsZXRlbHkKKwkgICAgdmVyc3RyaW5nPQorCSAgICA7OworCSAgKikKKwkgICAgdmVyc3RyaW5nPSIwLjAiCisJICAgIDs7CisJICBlc2FjCisJICBpZiB0ZXN0ICIkbmVlZF92ZXJzaW9uIiA9IG5vOyB0aGVuCisJICAgIHZlcnN1ZmZpeD0KKwkgIGVsc2UKKwkgICAgdmVyc3VmZml4PSIuMC4wIgorCSAgZmkKKwlmaQorCisJIyBSZW1vdmUgdmVyc2lvbiBpbmZvIGZyb20gbmFtZSBpZiB2ZXJzaW9uaW5nIHNob3VsZCBiZSBhdm9pZGVkCisJaWYgdGVzdCAiJGF2b2lkX3ZlcnNpb24iID0geWVzICYmIHRlc3QgIiRuZWVkX3ZlcnNpb24iID0gbm87IHRoZW4KKwkgIG1ham9yPQorCSAgdmVyc3VmZml4PQorCSAgdmVyc3RyaW5nPSIiCisJZmkKKworCSMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBhcmNoaXZlIHdpbGwgaGF2ZSB1bmRlZmluZWQgc3ltYm9scy4KKwlpZiB0ZXN0ICIkYWxsb3dfdW5kZWZpbmVkIiA9IHllczsgdGhlbgorCSAgaWYgdGVzdCAiJGFsbG93X3VuZGVmaW5lZF9mbGFnIiA9IHVuc3VwcG9ydGVkOyB0aGVuCisJICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IHVuZGVmaW5lZCBzeW1ib2xzIG5vdCBhbGxvd2VkIGluICRob3N0IHNoYXJlZCBsaWJyYXJpZXMiIDE+JjIKKwkgICAgYnVpbGRfbGlidG9vbF9saWJzPW5vCisJICAgIGJ1aWxkX29sZF9saWJzPXllcworCSAgZmkKKwllbHNlCisJICAjIERvbid0IGFsbG93IHVuZGVmaW5lZCBzeW1ib2xzLgorCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9IiRub191bmRlZmluZWRfZmxhZyIKKwlmaQorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAiJG1vZGUiICE9IHJlbGluazsgdGhlbgorCSMgUmVtb3ZlIG91ciBvdXRwdXRzLCBidXQgZG9uJ3QgcmVtb3ZlIG9iamVjdCBmaWxlcyBzaW5jZSB0aGV5CisJIyBtYXkgaGF2ZSBiZWVuIGNyZWF0ZWQgd2hlbiBjb21waWxpbmcgUElDIG9iamVjdHMuCisJcmVtb3ZlbGlzdD0KKwl0ZW1wcmVtb3ZlbGlzdD1gJGVjaG8gIiRvdXRwdXRfb2JqZGlyLyoiYAorCWZvciBwIGluICR0ZW1wcmVtb3ZlbGlzdDsgZG8KKwkgIGNhc2UgJHAgaW4KKwkgICAgKi4kb2JqZXh0KQorCSAgICAgICA7OworCSAgICAkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSB8ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiogfCAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9JHtyZWxlYXNlfS4qKQorCSAgICAgICBpZiB0ZXN0ICJYJHByZWNpb3VzX2ZpbGVzX3JlZ2V4IiAhPSAiWCI7IHRoZW4KKwkgICAgICAgICBpZiBlY2hvICRwIHwgJEVHUkVQIC1lICIkcHJlY2lvdXNfZmlsZXNfcmVnZXgiID4vZGV2L251bGwgMj4mMQorCSAgICAgICAgIHRoZW4KKwkJICAgY29udGludWUKKwkJIGZpCisJICAgICAgIGZpCisJICAgICAgIHJlbW92ZWxpc3Q9IiRyZW1vdmVsaXN0ICRwIgorCSAgICAgICA7OworCSAgICAqKSA7OworCSAgZXNhYworCWRvbmUKKwlpZiB0ZXN0IC1uICIkcmVtb3ZlbGlzdCI7IHRoZW4KKwkgICRzaG93ICIke3JtfXIgJHJlbW92ZWxpc3QiCisJICAkcnVuICR7cm19ciAkcmVtb3ZlbGlzdAorCWZpCisgICAgICBmaQorCisgICAgICAjIE5vdyBzZXQgdGhlIHZhcmlhYmxlcyBmb3IgYnVpbGRpbmcgb2xkIGxpYnJhcmllcy4KKyAgICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXMgJiYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0gY29udmVuaWVuY2UgOyB0aGVuCisJb2xkbGlicz0iJG9sZGxpYnMgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuJGxpYmV4dCIKKworCSMgVHJhbnNmb3JtIC5sbyBmaWxlcyB0byAubyBmaWxlcy4KKwlvbGRvYmpzPSIkb2JqcyAiYCRlY2hvICJYJGxpYm9ianMiIHwgJFNQMk5MIHwgJFhzZWQgLWUgJy9cLicke2xpYmV4dH0nJC9kJyAtZSAiJGxvMm8iIHwgJE5MMlNQYAorICAgICAgZmkKKworICAgICAgIyBFbGltaW5hdGUgYWxsIHRlbXBvcmFyeSBkaXJlY3Rvcmllcy4KKyAgICAgIGZvciBwYXRoIGluICRub3RpbnN0X3BhdGg7IGRvCisJbGliX3NlYXJjaF9wYXRoPWAkZWNobyAiJGxpYl9zZWFyY2hfcGF0aCAiIHwgJHtTRUR9IC1lICJzJSAkcGF0aCAlICVnImAKKwlkZXBsaWJzPWAkZWNobyAiJGRlcGxpYnMgIiB8ICR7U0VEfSAtZSAicyUgLUwkcGF0aCAlICVnImAKKwlkZXBlbmRlbmN5X2xpYnM9YCRlY2hvICIkZGVwZW5kZW5jeV9saWJzICIgfCAke1NFRH0gLWUgInMlIC1MJHBhdGggJSAlZyJgCisgICAgICBkb25lCisKKyAgICAgIGlmIHRlc3QgLW4gIiR4cnBhdGgiOyB0aGVuCisJIyBJZiB0aGUgdXNlciBzcGVjaWZpZWQgYW55IHJwYXRoIGZsYWdzLCB0aGVuIGFkZCB0aGVtLgorCXRlbXBfeHJwYXRoPQorCWZvciBsaWJkaXIgaW4gJHhycGF0aDsgZG8KKwkgIHRlbXBfeHJwYXRoPSIkdGVtcF94cnBhdGggLVIkbGliZGlyIgorCSAgY2FzZSAiJGZpbmFsaXplX3JwYXRoICIgaW4KKwkgICoiICRsaWJkaXIgIiopIDs7CisJICAqKSBmaW5hbGl6ZV9ycGF0aD0iJGZpbmFsaXplX3JwYXRoICRsaWJkaXIiIDs7CisJICBlc2FjCisJZG9uZQorCWlmIHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiICE9IHllcyB8fCB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisJICBkZXBlbmRlbmN5X2xpYnM9IiR0ZW1wX3hycGF0aCAkZGVwZW5kZW5jeV9saWJzIgorCWZpCisgICAgICBmaQorCisgICAgICAjIE1ha2Ugc3VyZSBkbGZpbGVzIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGZpbGVzIHRoYXQgd29uJ3QgYmUgZGxwcmVvcGVuZWQKKyAgICAgIG9sZF9kbGZpbGVzPSIkZGxmaWxlcyIKKyAgICAgIGRsZmlsZXM9CisgICAgICBmb3IgbGliIGluICRvbGRfZGxmaWxlczsgZG8KKwljYXNlICIgJGRscHJlZmlsZXMgJGRsZmlsZXMgIiBpbgorCSoiICRsaWIgIiopIDs7CisJKikgZGxmaWxlcz0iJGRsZmlsZXMgJGxpYiIgOzsKKwllc2FjCisgICAgICBkb25lCisKKyAgICAgICMgTWFrZSBzdXJlIGRscHJlZmlsZXMgY29udGFpbnMgb25seSB1bmlxdWUgZmlsZXMKKyAgICAgIG9sZF9kbHByZWZpbGVzPSIkZGxwcmVmaWxlcyIKKyAgICAgIGRscHJlZmlsZXM9CisgICAgICBmb3IgbGliIGluICRvbGRfZGxwcmVmaWxlczsgZG8KKwljYXNlICIkZGxwcmVmaWxlcyAiIGluCisJKiIgJGxpYiAiKikgOzsKKwkqKSBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkbGliIiA7OworCWVzYWMKKyAgICAgIGRvbmUKKworICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KKwlpZiB0ZXN0IC1uICIkcnBhdGgiOyB0aGVuCisJICBjYXNlICRob3N0IGluCisJICAqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKiB8ICotKi1iZW9zKikKKwkgICAgIyB0aGVzZSBzeXN0ZW1zIGRvbid0IGFjdHVhbGx5IGhhdmUgYSBjIGxpYnJhcnkgKGFzIHN1Y2gpIQorCSAgICA7OworCSAgKi0qLXJoYXBzb2R5KiB8ICotKi1kYXJ3aW4xLlswMTJdKQorCSAgICAjIFJoYXBzb2R5IEMgbGlicmFyeSBpcyBpbiB0aGUgU3lzdGVtIGZyYW1ld29yaworCSAgICBkZXBsaWJzPSIkZGVwbGlicyAtZnJhbWV3b3JrIFN5c3RlbSIKKwkgICAgOzsKKwkgICotKi1uZXRic2QqKQorCSAgICAjIERvbid0IGxpbmsgd2l0aCBsaWJjIHVudGlsIHRoZSBhLm91dCBsZC5zbyBpcyBmaXhlZC4KKwkgICAgOzsKKwkgICotKi1vcGVuYnNkKiB8ICotKi1mcmVlYnNkKiB8ICotKi1kcmFnb25mbHkqKQorCSAgICAjIERvIG5vdCBpbmNsdWRlIGxpYmMgZHVlIHRvIHVzIGhhdmluZyBsaWJjL2xpYmNfci4KKwkgICAgOzsKKwkgICotKi1zY28zLjJ2NSogfCAqLSotc2NvNXY2KikKKwkgICAgIyBDYXVzZXMgcHJvYmxlbXMgd2l0aCBfX2N0eXBlCisJICAgIDs7CisJICAqLSotc3lzdjQuMnV3MiogfCAqLSotc3lzdjUqIHwgKi0qLXVuaXh3YXJlKiB8ICotKi1PcGVuVU5JWCopCisJICAgICMgQ29tcGlsZXIgaW5zZXJ0cyBsaWJjIGluIHRoZSBjb3JyZWN0IHBsYWNlIGZvciB0aHJlYWRzIHRvIHdvcmsKKwkgICAgOzsKKyAJICAqKQorCSAgICAjIEFkZCBsaWJjIHRvIGRlcGxpYnMgb24gYWxsIG90aGVyIHN5c3RlbXMgaWYgbmVjZXNzYXJ5LgorCSAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9uZWVkX2xjIiA9ICJ5ZXMiOyB0aGVuCisJICAgICAgZGVwbGlicz0iJGRlcGxpYnMgLWxjIgorCSAgICBmaQorCSAgICA7OworCSAgZXNhYworCWZpCisKKwkjIFRyYW5zZm9ybSBkZXBsaWJzIGludG8gb25seSBkZXBsaWJzIHRoYXQgY2FuIGJlIGxpbmtlZCBpbiBzaGFyZWQuCisJbmFtZV9zYXZlPSRuYW1lCisJbGlibmFtZV9zYXZlPSRsaWJuYW1lCisJcmVsZWFzZV9zYXZlPSRyZWxlYXNlCisJdmVyc3VmZml4X3NhdmU9JHZlcnN1ZmZpeAorCW1ham9yX3NhdmU9JG1ham9yCisJIyBJJ20gbm90IHN1cmUgaWYgSSdtIHRyZWF0aW5nIHRoZSByZWxlYXNlIGNvcnJlY3RseS4gIEkgdGhpbmsKKwkjIHJlbGVhc2Ugc2hvdWxkIHNob3cgdXAgaW4gdGhlIC1sIChpZSAtbGdtcDUpIHNvIHdlIGRvbid0IHdhbnQgdG8KKwkjIGFkZCBpdCBpbiB0d2ljZS4gIElzIHRoYXQgY29ycmVjdD8KKwlyZWxlYXNlPSIiCisJdmVyc3VmZml4PSIiCisJbWFqb3I9IiIKKwluZXdkZXBsaWJzPQorCWRyb3BwZWRkZXBzPW5vCisJY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KKwlwYXNzX2FsbCkKKwkgICMgRG9uJ3QgY2hlY2sgZm9yIHNoYXJlZC9zdGF0aWMuICBFdmVyeXRoaW5nIHdvcmtzLgorCSAgIyBUaGlzIG1pZ2h0IGJlIGEgbGl0dGxlIG5haXZlLiAgV2UgbWlnaHQgd2FudCB0byBjaGVjaworCSAgIyB3aGV0aGVyIHRoZSBsaWJyYXJ5IGV4aXN0cyBvciBub3QuICBCdXQgdGhpcyBpcyBvbgorCSAgIyBvc2YzICYgb3NmNCBhbmQgSSdtIG5vdCByZWFsbHkgc3VyZS4uLiBKdXN0CisJICAjIGltcGxlbWVudGluZyB3aGF0IHdhcyBhbHJlYWR5IHRoZSBiZWhhdmlvci4KKwkgIG5ld2RlcGxpYnM9JGRlcGxpYnMKKwkgIDs7CisJdGVzdF9jb21waWxlKQorCSAgIyBUaGlzIGNvZGUgc3RyZXNzZXMgdGhlICJsaWJyYXJpZXMgYXJlIHByb2dyYW1zIiBwYXJhZGlnbSB0byBpdHMKKwkgICMgbGltaXRzLiBNYXliZSBldmVuIGJyZWFrcyBpdC4gIFdlIGNvbXBpbGUgYSBwcm9ncmFtLCBsaW5raW5nIGl0CisJICAjIGFnYWluc3QgdGhlIGRlcGxpYnMgYXMgYSBwcm94eSBmb3IgdGhlIGxpYnJhcnkuICBUaGVuIHdlIGNhbiBjaGVjaworCSAgIyB3aGV0aGVyIHRoZXkgbGlua2VkIGluIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHkgd2l0aCBsZGQuCisJICAkcm0gY29uZnRlc3QuYworCSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgorCSAgaW50IG1haW4oKSB7IHJldHVybiAwOyB9CitFT0YKKwkgICRybSBjb25mdGVzdAorCSAgJExUQ0MgJExUQ0ZMQUdTIC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgJGRlcGxpYnMKKwkgIGlmIHRlc3QgIiQ/IiAtZXEgMCA7IHRoZW4KKwkgICAgbGRkX291dHB1dD1gbGRkIGNvbmZ0ZXN0YAorCSAgICBmb3IgaSBpbiAkZGVwbGliczsgZG8KKwkgICAgICBuYW1lPWBleHByICRpIDogJy1sXCguKlwpJ2AKKwkgICAgICAjIElmICRuYW1lIGlzIGVtcHR5IHdlIGFyZSBvcGVyYXRpbmcgb24gYSAtTCBhcmd1bWVudC4KKyAgICAgICAgICAgICAgaWYgdGVzdCAiJG5hbWUiICE9ICIiICYmIHRlc3QgIiRuYW1lIiAtbmUgIjAiOyB0aGVuCisJCWlmIHRlc3QgIlgkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzIiA9ICJYeWVzIiA7IHRoZW4KKwkJICBjYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICIgaW4KKwkJICAqIiAkaSAiKikKKwkJICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgorCQkgICAgaT0iIgorCQkgICAgOzsKKwkJICBlc2FjCisJICAgICAgICBmaQorCQlpZiB0ZXN0IC1uICIkaSIgOyB0aGVuCisJCSAgbGlibmFtZT1gZXZhbCBcXCRlY2hvIFwiJGxpYm5hbWVfc3BlY1wiYAorCQkgIGRlcGxpYl9tYXRjaGVzPWBldmFsIFxcJGVjaG8gXCIkbGlicmFyeV9uYW1lc19zcGVjXCJgCisJCSAgc2V0IGR1bW15ICRkZXBsaWJfbWF0Y2hlcworCQkgIGRlcGxpYl9tYXRjaD0kMgorCQkgIGlmIHRlc3QgYGV4cHIgIiRsZGRfb3V0cHV0IiA6ICIuKiRkZXBsaWJfbWF0Y2giYCAtbmUgMCA7IHRoZW4KKwkJICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgorCQkgIGVsc2UKKwkJICAgIGRyb3BwZWRkZXBzPXllcworCQkgICAgJGVjaG8KKwkJICAgICRlY2hvICIqKiogV2FybmluZzogZHluYW1pYyBsaW5rZXIgZG9lcyBub3QgYWNjZXB0IG5lZWRlZCBsaWJyYXJ5ICRpLiIKKwkJICAgICRlY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgorCQkgICAgJGVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCisJCSAgICAkZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCBJIGJlbGlldmUgeW91IGRvIG5vdCBoYXZlIgorCQkgICAgJGVjaG8gIioqKiBiZWNhdXNlIGEgdGVzdF9jb21waWxlIGRpZCByZXZlYWwgdGhhdCB0aGUgbGlua2VyIGRpZCBub3QgdXNlIGl0IGZvciIKKwkJICAgICRlY2hvICIqKiogaXRzIGR5bmFtaWMgZGVwZW5kZW5jeSBsaXN0IHRoYXQgcHJvZ3JhbXMgZ2V0IHJlc29sdmVkIHdpdGggYXQgcnVudGltZS4iCisJCSAgZmkKKwkJZmkKKwkgICAgICBlbHNlCisJCW5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgorCSAgICAgIGZpCisJICAgIGRvbmUKKwkgIGVsc2UKKwkgICAgIyBFcnJvciBvY2N1cnJlZCBpbiB0aGUgZmlyc3QgY29tcGlsZS4gIExldCdzIHRyeSB0byBzYWx2YWdlCisJICAgICMgdGhlIHNpdHVhdGlvbjogQ29tcGlsZSBhIHNlcGFyYXRlIHByb2dyYW0gZm9yIGVhY2ggbGlicmFyeS4KKwkgICAgZm9yIGkgaW4gJGRlcGxpYnM7IGRvCisJICAgICAgbmFtZT1gZXhwciAkaSA6ICctbFwoLipcKSdgCisJICAgICAgIyBJZiAkbmFtZSBpcyBlbXB0eSB3ZSBhcmUgb3BlcmF0aW5nIG9uIGEgLUwgYXJndW1lbnQuCisgICAgICAgICAgICAgIGlmIHRlc3QgIiRuYW1lIiAhPSAiIiAmJiB0ZXN0ICIkbmFtZSIgIT0gIjAiOyB0aGVuCisJCSRybSBjb25mdGVzdAorCQkkTFRDQyAkTFRDRkxBR1MgLW8gY29uZnRlc3QgY29uZnRlc3QuYyAkaQorCQkjIERpZCBpdCB3b3JrPworCQlpZiB0ZXN0ICIkPyIgLWVxIDAgOyB0aGVuCisJCSAgbGRkX291dHB1dD1gbGRkIGNvbmZ0ZXN0YAorCQkgIGlmIHRlc3QgIlgkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzIiA9ICJYeWVzIiA7IHRoZW4KKwkJICAgIGNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgIiBpbgorCQkgICAgKiIgJGkgIiopCisJCSAgICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgorCQkgICAgICBpPSIiCisJCSAgICAgIDs7CisJCSAgICBlc2FjCisJCSAgZmkKKwkJICBpZiB0ZXN0IC1uICIkaSIgOyB0aGVuCisJCSAgICBsaWJuYW1lPWBldmFsIFxcJGVjaG8gXCIkbGlibmFtZV9zcGVjXCJgCisJCSAgICBkZXBsaWJfbWF0Y2hlcz1gZXZhbCBcXCRlY2hvIFwiJGxpYnJhcnlfbmFtZXNfc3BlY1wiYAorCQkgICAgc2V0IGR1bW15ICRkZXBsaWJfbWF0Y2hlcworCQkgICAgZGVwbGliX21hdGNoPSQyCisJCSAgICBpZiB0ZXN0IGBleHByICIkbGRkX291dHB1dCIgOiAiLiokZGVwbGliX21hdGNoImAgLW5lIDAgOyB0aGVuCisJCSAgICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgorCQkgICAgZWxzZQorCQkgICAgICBkcm9wcGVkZGVwcz15ZXMKKwkJICAgICAgJGVjaG8KKwkJICAgICAgJGVjaG8gIioqKiBXYXJuaW5nOiBkeW5hbWljIGxpbmtlciBkb2VzIG5vdCBhY2NlcHQgbmVlZGVkIGxpYnJhcnkgJGkuIgorCQkgICAgICAkZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKKwkJICAgICAgJGVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCisJCSAgICAgICRlY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUiCisJCSAgICAgICRlY2hvICIqKiogYmVjYXVzZSBhIHRlc3RfY29tcGlsZSBkaWQgcmV2ZWFsIHRoYXQgdGhlIGxpbmtlciBkaWQgbm90IHVzZSB0aGlzIG9uZSIKKwkJICAgICAgJGVjaG8gIioqKiBhcyBhIGR5bmFtaWMgZGVwZW5kZW5jeSB0aGF0IHByb2dyYW1zIGNhbiBnZXQgcmVzb2x2ZWQgd2l0aCBhdCBydW50aW1lLiIKKwkJICAgIGZpCisJCSAgZmkKKwkJZWxzZQorCQkgIGRyb3BwZWRkZXBzPXllcworCQkgICRlY2hvCisJCSAgJGVjaG8gIioqKiBXYXJuaW5nISAgTGlicmFyeSAkaSBpcyBuZWVkZWQgYnkgdGhpcyBsaWJyYXJ5IGJ1dCBJIHdhcyBub3QgYWJsZSB0byIKKwkJICAkZWNobyAiKioqICBtYWtlIGl0IGxpbmsgaW4hICBZb3Ugd2lsbCBwcm9iYWJseSBuZWVkIHRvIGluc3RhbGwgaXQgb3Igc29tZSIKKwkJICAkZWNobyAiKioqIGxpYnJhcnkgdGhhdCBpdCBkZXBlbmRzIG9uIGJlZm9yZSB0aGlzIGxpYnJhcnkgd2lsbCBiZSBmdWxseSIKKwkJICAkZWNobyAiKioqIGZ1bmN0aW9uYWwuICBJbnN0YWxsaW5nIGl0IGJlZm9yZSBjb250aW51aW5nIHdvdWxkIGJlIGV2ZW4gYmV0dGVyLiIKKwkJZmkKKwkgICAgICBlbHNlCisJCW5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgorCSAgICAgIGZpCisJICAgIGRvbmUKKwkgIGZpCisJICA7OworCWZpbGVfbWFnaWMqKQorCSAgc2V0IGR1bW15ICRkZXBsaWJzX2NoZWNrX21ldGhvZAorCSAgZmlsZV9tYWdpY19yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICIkMiBcKC4qXCkiYAorCSAgZm9yIGFfZGVwbGliIGluICRkZXBsaWJzOyBkbworCSAgICBuYW1lPWBleHByICRhX2RlcGxpYiA6ICctbFwoLipcKSdgCisJICAgICMgSWYgJG5hbWUgaXMgZW1wdHkgd2UgYXJlIG9wZXJhdGluZyBvbiBhIC1MIGFyZ3VtZW50LgorICAgICAgICAgICAgaWYgdGVzdCAiJG5hbWUiICE9ICIiICYmIHRlc3QgICIkbmFtZSIgIT0gIjAiOyB0aGVuCisJICAgICAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgorCQljYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICIgaW4KKwkJKiIgJGFfZGVwbGliICIqKQorCQkgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRhX2RlcGxpYiIKKwkJICBhX2RlcGxpYj0iIgorCQkgIDs7CisJCWVzYWMKKwkgICAgICBmaQorCSAgICAgIGlmIHRlc3QgLW4gIiRhX2RlcGxpYiIgOyB0aGVuCisJCWxpYm5hbWU9YGV2YWwgXFwkZWNobyBcIiRsaWJuYW1lX3NwZWNcImAKKwkJZm9yIGkgaW4gJGxpYl9zZWFyY2hfcGF0aCAkc3lzX2xpYl9zZWFyY2hfcGF0aCAkc2hsaWJfc2VhcmNoX3BhdGg7IGRvCisJCSAgcG90ZW50aWFsX2xpYnM9YGxzICRpLyRsaWJuYW1lWy4tXSogMj4vZGV2L251bGxgCisJCSAgZm9yIHBvdGVudF9saWIgaW4gJHBvdGVudGlhbF9saWJzOyBkbworCQkgICAgICAjIEZvbGxvdyBzb2Z0IGxpbmtzLgorCQkgICAgICBpZiBscyAtbExkICIkcG90ZW50X2xpYiIgMj4vZGV2L251bGwgXAorCQkJIHwgZ3JlcCAiIC0+ICIgPi9kZXYvbnVsbDsgdGhlbgorCQkJY29udGludWUKKwkJICAgICAgZmkKKwkJICAgICAgIyBUaGUgc3RhdGVtZW50IGFib3ZlIHRyaWVzIHRvIGF2b2lkIGVudGVyaW5nIGFuCisJCSAgICAgICMgZW5kbGVzcyBsb29wIGJlbG93LCBpbiBjYXNlIG9mIGN5Y2xpYyBsaW5rcy4KKwkJICAgICAgIyBXZSBtaWdodCBzdGlsbCBlbnRlciBhbiBlbmRsZXNzIGxvb3AsIHNpbmNlIGEgbGluaworCQkgICAgICAjIGxvb3AgY2FuIGJlIGNsb3NlZCB3aGlsZSB3ZSBmb2xsb3cgbGlua3MsCisJCSAgICAgICMgYnV0IHNvIHdoYXQ/CisJCSAgICAgIHBvdGxpYj0iJHBvdGVudF9saWIiCisJCSAgICAgIHdoaWxlIHRlc3QgLWggIiRwb3RsaWIiIDI+L2Rldi9udWxsOyBkbworCQkJcG90bGlibGluaz1gbHMgLWxkICRwb3RsaWIgfCAke1NFRH0gJ3MvLiogLT4gLy8nYAorCQkJY2FzZSAkcG90bGlibGluayBpbgorCQkJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBwb3RsaWI9IiRwb3RsaWJsaW5rIjs7CisJCQkqKSBwb3RsaWI9YCRlY2hvICJYJHBvdGxpYiIgfCAkWHNlZCAtZSAncyxbXi9dKiQsLCdgIiRwb3RsaWJsaW5rIjs7CisJCQllc2FjCisJCSAgICAgIGRvbmUKKwkJICAgICAgaWYgZXZhbCAkZmlsZV9tYWdpY19jbWQgXCJcJHBvdGxpYlwiIDI+L2Rldi9udWxsIFwKKwkJCSB8ICR7U0VEfSAxMHEgXAorCQkJIHwgJEVHUkVQICIkZmlsZV9tYWdpY19yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KKwkJCW5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRhX2RlcGxpYiIKKwkJCWFfZGVwbGliPSIiCisJCQlicmVhayAyCisJCSAgICAgIGZpCisJCSAgZG9uZQorCQlkb25lCisJICAgICAgZmkKKwkgICAgICBpZiB0ZXN0IC1uICIkYV9kZXBsaWIiIDsgdGhlbgorCQlkcm9wcGVkZGVwcz15ZXMKKwkJJGVjaG8KKwkJJGVjaG8gIioqKiBXYXJuaW5nOiBsaW5rZXIgcGF0aCBkb2VzIG5vdCBoYXZlIHJlYWwgZmlsZSBmb3IgbGlicmFyeSAkYV9kZXBsaWIuIgorCQkkZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKKwkJJGVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCisJCSRlY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUiCisJCSRlY2hvICIqKiogYmVjYXVzZSBJIGRpZCBjaGVjayB0aGUgbGlua2VyIHBhdGggbG9va2luZyBmb3IgYSBmaWxlIHN0YXJ0aW5nIgorCQlpZiB0ZXN0IC16ICIkcG90bGliIiA7IHRoZW4KKwkJICAkZWNobyAiKioqIHdpdGggJGxpYm5hbWUgYnV0IG5vIGNhbmRpZGF0ZXMgd2VyZSBmb3VuZC4gKC4uLmZvciBmaWxlIG1hZ2ljIHRlc3QpIgorCQllbHNlCisJCSAgJGVjaG8gIioqKiB3aXRoICRsaWJuYW1lIGFuZCBub25lIG9mIHRoZSBjYW5kaWRhdGVzIHBhc3NlZCBhIGZpbGUgZm9ybWF0IHRlc3QiCisJCSAgJGVjaG8gIioqKiB1c2luZyBhIGZpbGUgbWFnaWMuIExhc3QgZmlsZSBjaGVja2VkOiAkcG90bGliIgorCQlmaQorCSAgICAgIGZpCisJICAgIGVsc2UKKwkgICAgICAjIEFkZCBhIC1MIGFyZ3VtZW50LgorCSAgICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRhX2RlcGxpYiIKKwkgICAgZmkKKwkgIGRvbmUgIyBHb25lIHRocm91Z2ggYWxsIGRlcGxpYnMuCisJICA7OworCW1hdGNoX3BhdHRlcm4qKQorCSAgc2V0IGR1bW15ICRkZXBsaWJzX2NoZWNrX21ldGhvZAorCSAgbWF0Y2hfcGF0dGVybl9yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICIkMiBcKC4qXCkiYAorCSAgZm9yIGFfZGVwbGliIGluICRkZXBsaWJzOyBkbworCSAgICBuYW1lPWBleHByICRhX2RlcGxpYiA6ICctbFwoLipcKSdgCisJICAgICMgSWYgJG5hbWUgaXMgZW1wdHkgd2UgYXJlIG9wZXJhdGluZyBvbiBhIC1MIGFyZ3VtZW50LgorCSAgICBpZiB0ZXN0IC1uICIkbmFtZSIgJiYgdGVzdCAiJG5hbWUiICE9ICIwIjsgdGhlbgorCSAgICAgIGlmIHRlc3QgIlgkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzIiA9ICJYeWVzIiA7IHRoZW4KKwkJY2FzZSAiICRwcmVkZXBzICRwb3N0ZGVwcyAiIGluCisJCSoiICRhX2RlcGxpYiAiKikKKwkJICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkYV9kZXBsaWIiCisJCSAgYV9kZXBsaWI9IiIKKwkJICA7OworCQllc2FjCisJICAgICAgZmkKKwkgICAgICBpZiB0ZXN0IC1uICIkYV9kZXBsaWIiIDsgdGhlbgorCQlsaWJuYW1lPWBldmFsIFxcJGVjaG8gXCIkbGlibmFtZV9zcGVjXCJgCisJCWZvciBpIGluICRsaWJfc2VhcmNoX3BhdGggJHN5c19saWJfc2VhcmNoX3BhdGggJHNobGliX3NlYXJjaF9wYXRoOyBkbworCQkgIHBvdGVudGlhbF9saWJzPWBscyAkaS8kbGlibmFtZVsuLV0qIDI+L2Rldi9udWxsYAorCQkgIGZvciBwb3RlbnRfbGliIGluICRwb3RlbnRpYWxfbGliczsgZG8KKwkJICAgIHBvdGxpYj0iJHBvdGVudF9saWIiICMgc2VlIHN5bWxpbmstY2hlY2sgYWJvdmUgaW4gZmlsZV9tYWdpYyB0ZXN0CisJCSAgICBpZiBldmFsICRlY2hvIFwiJHBvdGVudF9saWJcIiAyPi9kZXYvbnVsbCBcCisJCSAgICAgICAgfCAke1NFRH0gMTBxIFwKKwkJICAgICAgICB8ICRFR1JFUCAiJG1hdGNoX3BhdHRlcm5fcmVnZXgiID4gL2Rldi9udWxsOyB0aGVuCisJCSAgICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRhX2RlcGxpYiIKKwkJICAgICAgYV9kZXBsaWI9IiIKKwkJICAgICAgYnJlYWsgMgorCQkgICAgZmkKKwkJICBkb25lCisJCWRvbmUKKwkgICAgICBmaQorCSAgICAgIGlmIHRlc3QgLW4gIiRhX2RlcGxpYiIgOyB0aGVuCisJCWRyb3BwZWRkZXBzPXllcworCQkkZWNobworCQkkZWNobyAiKioqIFdhcm5pbmc6IGxpbmtlciBwYXRoIGRvZXMgbm90IGhhdmUgcmVhbCBmaWxlIGZvciBsaWJyYXJ5ICRhX2RlcGxpYi4iCisJCSRlY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgorCQkkZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkJJGVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZSIKKwkJJGVjaG8gIioqKiBiZWNhdXNlIEkgZGlkIGNoZWNrIHRoZSBsaW5rZXIgcGF0aCBsb29raW5nIGZvciBhIGZpbGUgc3RhcnRpbmciCisJCWlmIHRlc3QgLXogIiRwb3RsaWIiIDsgdGhlbgorCQkgICRlY2hvICIqKiogd2l0aCAkbGlibmFtZSBidXQgbm8gY2FuZGlkYXRlcyB3ZXJlIGZvdW5kLiAoLi4uZm9yIHJlZ2V4IHBhdHRlcm4gdGVzdCkiCisJCWVsc2UKKwkJICAkZWNobyAiKioqIHdpdGggJGxpYm5hbWUgYW5kIG5vbmUgb2YgdGhlIGNhbmRpZGF0ZXMgcGFzc2VkIGEgZmlsZSBmb3JtYXQgdGVzdCIKKwkJICAkZWNobyAiKioqIHVzaW5nIGEgcmVnZXggcGF0dGVybi4gTGFzdCBmaWxlIGNoZWNrZWQ6ICRwb3RsaWIiCisJCWZpCisJICAgICAgZmkKKwkgICAgZWxzZQorCSAgICAgICMgQWRkIGEgLUwgYXJndW1lbnQuCisJICAgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgorCSAgICBmaQorCSAgZG9uZSAjIEdvbmUgdGhyb3VnaCBhbGwgZGVwbGlicy4KKwkgIDs7CisJbm9uZSB8IHVua25vd24gfCAqKQorCSAgbmV3ZGVwbGlicz0iIgorCSAgdG1wX2RlcGxpYnM9YCRlY2hvICJYICRkZXBsaWJzIiB8ICRYc2VkIC1lICdzLyAtbGMkLy8nIFwKKwkgICAgLWUgJ3MvIC1bTFJdW14gXSovL2cnYAorCSAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgorCSAgICBmb3IgaSBpbiAkcHJlZGVwcyAkcG9zdGRlcHMgOyBkbworCSAgICAgICMgY2FuJ3QgdXNlIFhzZWQgYmVsb3csIGJlY2F1c2UgJGkgbWlnaHQgY29udGFpbiAnLycKKwkgICAgICB0bXBfZGVwbGlicz1gJGVjaG8gIlggJHRtcF9kZXBsaWJzIiB8ICR7U0VEfSAtZSAiMXMsXlgsLCIgLWUgInMsJGksLCJgCisJICAgIGRvbmUKKwkgIGZpCisJICBpZiAkZWNobyAiWCAkdG1wX2RlcGxpYnMiIHwgJFhzZWQgLWUgJ3MvWyAJXS8vZycgXAorCSAgICB8IGdyZXAgLiA+L2Rldi9udWxsOyB0aGVuCisJICAgICRlY2hvCisJICAgIGlmIHRlc3QgIlgkZGVwbGlic19jaGVja19tZXRob2QiID0gIlhub25lIjsgdGhlbgorCSAgICAgICRlY2hvICIqKiogV2FybmluZzogaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBwbGF0Zm9ybS4iCisJICAgIGVsc2UKKwkgICAgICAkZWNobyAiKioqIFdhcm5pbmc6IGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzIGFyZSBub3Qga25vd24gdG8gYmUgc3VwcG9ydGVkLiIKKwkgICAgZmkKKwkgICAgJGVjaG8gIioqKiBBbGwgZGVjbGFyZWQgaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgYXJlIGJlaW5nIGRyb3BwZWQuIgorCSAgICBkcm9wcGVkZGVwcz15ZXMKKwkgIGZpCisJICA7OworCWVzYWMKKwl2ZXJzdWZmaXg9JHZlcnN1ZmZpeF9zYXZlCisJbWFqb3I9JG1ham9yX3NhdmUKKwlyZWxlYXNlPSRyZWxlYXNlX3NhdmUKKwlsaWJuYW1lPSRsaWJuYW1lX3NhdmUKKwluYW1lPSRuYW1lX3NhdmUKKworCWNhc2UgJGhvc3QgaW4KKwkqLSotcmhhcHNvZHkqIHwgKi0qLWRhcndpbjEuWzAxMl0pCisJICAjIE9uIFJoYXBzb2R5IHJlcGxhY2UgdGhlIEMgbGlicmFyeSBpcyB0aGUgU3lzdGVtIGZyYW1ld29yaworCSAgbmV3ZGVwbGlicz1gJGVjaG8gIlggJG5ld2RlcGxpYnMiIHwgJFhzZWQgLWUgJ3MvIC1sYyAvIC1mcmFtZXdvcmsgU3lzdGVtIC8nYAorCSAgOzsKKwllc2FjCisKKwlpZiB0ZXN0ICIkZHJvcHBlZGRlcHMiID0geWVzOyB0aGVuCisJICBpZiB0ZXN0ICIkbW9kdWxlIiA9IHllczsgdGhlbgorCSAgICAkZWNobworCSAgICAkZWNobyAiKioqIFdhcm5pbmc6IGxpYnRvb2wgY291bGQgbm90IHNhdGlzZnkgYWxsIGRlY2xhcmVkIGludGVyLWxpYnJhcnkiCisJICAgICRlY2hvICIqKiogZGVwZW5kZW5jaWVzIG9mIG1vZHVsZSAkbGlibmFtZS4gIFRoZXJlZm9yZSwgbGlidG9vbCB3aWxsIGNyZWF0ZSIKKwkgICAgJGVjaG8gIioqKiBhIHN0YXRpYyBtb2R1bGUsIHRoYXQgc2hvdWxkIHdvcmsgYXMgbG9uZyBhcyB0aGUgZGxvcGVuaW5nIgorCSAgICAkZWNobyAiKioqIGFwcGxpY2F0aW9uIGlzIGxpbmtlZCB3aXRoIHRoZSAtZGxvcGVuIGZsYWcuIgorCSAgICBpZiB0ZXN0IC16ICIkZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgorCSAgICAgICRlY2hvCisJICAgICAgJGVjaG8gIioqKiBIb3dldmVyLCB0aGlzIHdvdWxkIG9ubHkgd29yayBpZiBsaWJ0b29sIHdhcyBhYmxlIHRvIGV4dHJhY3Qgc3ltYm9sIgorCSAgICAgICRlY2hvICIqKiogbGlzdHMgZnJvbSBhIHByb2dyYW0sIHVzaW5nIFxgbm0nIG9yIGVxdWl2YWxlbnQsIGJ1dCBsaWJ0b29sIGNvdWxkIgorCSAgICAgICRlY2hvICIqKiogbm90IGZpbmQgc3VjaCBhIHByb2dyYW0uICBTbywgdGhpcyBtb2R1bGUgaXMgcHJvYmFibHkgdXNlbGVzcy4iCisJICAgICAgJGVjaG8gIioqKiBcYG5tJyBmcm9tIEdOVSBiaW51dGlscyBhbmQgYSBmdWxsIHJlYnVpbGQgbWF5IGhlbHAuIgorCSAgICBmaQorCSAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0gbm87IHRoZW4KKwkgICAgICBvbGRsaWJzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS4kbGliZXh0IgorCSAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1tb2R1bGUKKwkgICAgICBidWlsZF9vbGRfbGlicz15ZXMKKwkgICAgZWxzZQorCSAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubworCSAgICBmaQorCSAgZWxzZQorCSAgICAkZWNobyAiKioqIFRoZSBpbnRlci1saWJyYXJ5IGRlcGVuZGVuY2llcyB0aGF0IGhhdmUgYmVlbiBkcm9wcGVkIGhlcmUgd2lsbCBiZSIKKwkgICAgJGVjaG8gIioqKiBhdXRvbWF0aWNhbGx5IGFkZGVkIHdoZW5ldmVyIGEgcHJvZ3JhbSBpcyBsaW5rZWQgd2l0aCB0aGlzIGxpYnJhcnkiCisJICAgICRlY2hvICIqKiogb3IgaXMgZGVjbGFyZWQgdG8gLWRsb3BlbiBpdC4iCisKKwkgICAgaWYgdGVzdCAiJGFsbG93X3VuZGVmaW5lZCIgPSBubzsgdGhlbgorCSAgICAgICRlY2hvCisJICAgICAgJGVjaG8gIioqKiBTaW5jZSB0aGlzIGxpYnJhcnkgbXVzdCBub3QgY29udGFpbiB1bmRlZmluZWQgc3ltYm9scywiCisJICAgICAgJGVjaG8gIioqKiBiZWNhdXNlIGVpdGhlciB0aGUgcGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydCB0aGVtIG9yIgorCSAgICAgICRlY2hvICIqKiogaXQgd2FzIGV4cGxpY2l0bHkgcmVxdWVzdGVkIHdpdGggLW5vLXVuZGVmaW5lZCwiCisJICAgICAgJGVjaG8gIioqKiBsaWJ0b29sIHdpbGwgb25seSBjcmVhdGUgYSBzdGF0aWMgdmVyc2lvbiBvZiBpdC4iCisJICAgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IG5vOyB0aGVuCisJCW9sZGxpYnM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiRsaWJleHQiCisJCWJ1aWxkX2xpYnRvb2xfbGlicz1tb2R1bGUKKwkJYnVpbGRfb2xkX2xpYnM9eWVzCisJICAgICAgZWxzZQorCQlidWlsZF9saWJ0b29sX2xpYnM9bm8KKwkgICAgICBmaQorCSAgICBmaQorCSAgZmkKKwlmaQorCSMgRG9uZSBjaGVja2luZyBkZXBsaWJzIQorCWRlcGxpYnM9JG5ld2RlcGxpYnMKKyAgICAgIGZpCisKKworICAgICAgIyBtb3ZlIGxpYnJhcnkgc2VhcmNoIHBhdGhzIHRoYXQgY29pbmNpZGUgd2l0aCBwYXRocyB0byBub3QgeWV0CisgICAgICAjIGluc3RhbGxlZCBsaWJyYXJpZXMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlicmFyeSBzZWFyY2ggbGlzdAorICAgICAgbmV3X2xpYnM9CisgICAgICBmb3IgcGF0aCBpbiAkbm90aW5zdF9wYXRoOyBkbworCWNhc2UgIiAkbmV3X2xpYnMgIiBpbgorCSoiIC1MJHBhdGgvJG9iamRpciAiKikgOzsKKwkqKQorCSAgY2FzZSAiICRkZXBsaWJzICIgaW4KKwkgICoiIC1MJHBhdGgvJG9iamRpciAiKikKKwkgICAgbmV3X2xpYnM9IiRuZXdfbGlicyAtTCRwYXRoLyRvYmpkaXIiIDs7CisJICBlc2FjCisJICA7OworCWVzYWMKKyAgICAgIGRvbmUKKyAgICAgIGZvciBkZXBsaWIgaW4gJGRlcGxpYnM7IGRvCisJY2FzZSAkZGVwbGliIGluCisJLUwqKQorCSAgY2FzZSAiICRuZXdfbGlicyAiIGluCisJICAqIiAkZGVwbGliICIqKSA7OworCSAgKikgbmV3X2xpYnM9IiRuZXdfbGlicyAkZGVwbGliIiA7OworCSAgZXNhYworCSAgOzsKKwkqKSBuZXdfbGlicz0iJG5ld19saWJzICRkZXBsaWIiIDs7CisJZXNhYworICAgICAgZG9uZQorICAgICAgZGVwbGlicz0iJG5ld19saWJzIgorCisKKyAgICAgICMgQWxsIHRoZSBsaWJyYXJ5LXNwZWNpZmljIHZhcmlhYmxlcyAoaW5zdGFsbF9saWJkaXIgaXMgc2V0IGFib3ZlKS4KKyAgICAgIGxpYnJhcnlfbmFtZXM9CisgICAgICBvbGRfbGlicmFyeT0KKyAgICAgIGRsbmFtZT0KKworICAgICAgIyBUZXN0IGFnYWluLCB3ZSBtYXkgaGF2ZSBkZWNpZGVkIG5vdCB0byBidWlsZCBpdCBhbnkgbW9yZQorICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KKwlpZiB0ZXN0ICIkaGFyZGNvZGVfaW50b19saWJzIiA9IHllczsgdGhlbgorCSAgIyBIYXJkY29kZSB0aGUgbGlicmFyeSBwYXRocworCSAgaGFyZGNvZGVfbGliZGlycz0KKwkgIGRlcF9ycGF0aD0KKwkgIHJwYXRoPSIkZmluYWxpemVfcnBhdGgiCisJICB0ZXN0ICIkbW9kZSIgIT0gcmVsaW5rICYmIHJwYXRoPSIkY29tcGlsZV9ycGF0aCRycGF0aCIKKwkgIGZvciBsaWJkaXIgaW4gJHJwYXRoOyBkbworCSAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KKwkgICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KKwkJaWYgdGVzdCAteiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCisJCSAgaGFyZGNvZGVfbGliZGlycz0iJGxpYmRpciIKKwkJZWxzZQorCQkgICMgSnVzdCBhY2N1bXVsYXRlIHRoZSB1bmlxdWUgbGliZGlycy4KKwkJICBjYXNlICRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciBpbgorCQkgICoiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiKikKKwkJICAgIDs7CisJCSAgKikKKwkJICAgIGhhcmRjb2RlX2xpYmRpcnM9IiRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyIgorCQkgICAgOzsKKwkJICBlc2FjCisJCWZpCisJICAgICAgZWxzZQorCQlldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisJCWRlcF9ycGF0aD0iJGRlcF9ycGF0aCAkZmxhZyIKKwkgICAgICBmaQorCSAgICBlbGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KKwkgICAgICBjYXNlICIkcGVybV9ycGF0aCAiIGluCisJICAgICAgKiIgJGxpYmRpciAiKikgOzsKKwkgICAgICAqKSBwZXJtX3JwYXRoPSIkcGVybV9ycGF0aCAkbGliZGlyIiA7OworCSAgICAgIGVzYWMKKwkgICAgZmkKKwkgIGRvbmUKKwkgICMgU3Vic3RpdHV0ZSB0aGUgaGFyZGNvZGVkIGxpYmRpcnMgaW50byB0aGUgcnBhdGguCisJICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIgJiYKKwkgICAgIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgorCSAgICBsaWJkaXI9IiRoYXJkY29kZV9saWJkaXJzIgorCSAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCI7IHRoZW4KKwkgICAgICBldmFsIGRlcF9ycGF0aD1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkXCIKKwkgICAgZWxzZQorCSAgICAgIGV2YWwgZGVwX3JwYXRoPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgorCSAgICBmaQorCSAgZmkKKwkgIGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciIgJiYgdGVzdCAtbiAiJHBlcm1fcnBhdGgiOyB0aGVuCisJICAgICMgV2Ugc2hvdWxkIHNldCB0aGUgcnVucGF0aF92YXIuCisJICAgIHJwYXRoPQorCSAgICBmb3IgZGlyIGluICRwZXJtX3JwYXRoOyBkbworCSAgICAgIHJwYXRoPSIkcnBhdGgkZGlyOiIKKwkgICAgZG9uZQorCSAgICBldmFsICIkcnVucGF0aF92YXI9JyRycGF0aFwkJHJ1bnBhdGhfdmFyJzsgZXhwb3J0ICRydW5wYXRoX3ZhciIKKwkgIGZpCisJICB0ZXN0IC1uICIkZGVwX3JwYXRoIiAmJiBkZXBsaWJzPSIkZGVwX3JwYXRoICRkZXBsaWJzIgorCWZpCisKKwlzaGxpYnBhdGg9IiRmaW5hbGl6ZV9zaGxpYnBhdGgiCisJdGVzdCAiJG1vZGUiICE9IHJlbGluayAmJiBzaGxpYnBhdGg9IiRjb21waWxlX3NobGlicGF0aCRzaGxpYnBhdGgiCisJaWYgdGVzdCAtbiAiJHNobGlicGF0aCI7IHRoZW4KKwkgIGV2YWwgIiRzaGxpYnBhdGhfdmFyPSckc2hsaWJwYXRoXCQkc2hsaWJwYXRoX3Zhcic7IGV4cG9ydCAkc2hsaWJwYXRoX3ZhciIKKwlmaQorCisJIyBHZXQgdGhlIHJlYWwgYW5kIGxpbmsgbmFtZXMgb2YgdGhlIGxpYnJhcnkuCisJZXZhbCBzaGFyZWRfZXh0PVwiJHNocmV4dF9jbWRzXCIKKwlldmFsIGxpYnJhcnlfbmFtZXM9XCIkbGlicmFyeV9uYW1lc19zcGVjXCIKKwlzZXQgZHVtbXkgJGxpYnJhcnlfbmFtZXMKKwlyZWFsbmFtZT0iJDIiCisJc2hpZnQ7IHNoaWZ0CisKKwlpZiB0ZXN0IC1uICIkc29uYW1lX3NwZWMiOyB0aGVuCisJICBldmFsIHNvbmFtZT1cIiRzb25hbWVfc3BlY1wiCisJZWxzZQorCSAgc29uYW1lPSIkcmVhbG5hbWUiCisJZmkKKwlpZiB0ZXN0IC16ICIkZGxuYW1lIjsgdGhlbgorCSAgZGxuYW1lPSRzb25hbWUKKwlmaQorCisJbGliPSIkb3V0cHV0X29iamRpci8kcmVhbG5hbWUiCisJbGlua25hbWVzPQorCWZvciBsaW5rCisJZG8KKwkgIGxpbmtuYW1lcz0iJGxpbmtuYW1lcyAkbGluayIKKwlkb25lCisKKwkjIFVzZSBzdGFuZGFyZCBvYmplY3RzIGlmIHRoZXkgYXJlIHBpYworCXRlc3QgLXogIiRwaWNfZmxhZyIgJiYgbGlib2Jqcz1gJGVjaG8gIlgkbGlib2JqcyIgfCAkU1AyTkwgfCAkWHNlZCAtZSAiJGxvMm8iIHwgJE5MMlNQYAorCisJIyBQcmVwYXJlIHRoZSBsaXN0IG9mIGV4cG9ydGVkIHN5bWJvbHMKKwlpZiB0ZXN0IC16ICIkZXhwb3J0X3N5bWJvbHMiOyB0aGVuCisJICBpZiB0ZXN0ICIkYWx3YXlzX2V4cG9ydF9zeW1ib2xzIiA9IHllcyB8fCB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCisJICAgICRzaG93ICJnZW5lcmF0aW5nIHN5bWJvbCBsaXN0IGZvciBcYCRsaWJuYW1lLmxhJyIKKwkgICAgZXhwb3J0X3N5bWJvbHM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmV4cCIKKwkgICAgJHJ1biAkcm0gJGV4cG9ydF9zeW1ib2xzCisJICAgIGNtZHM9JGV4cG9ydF9zeW1ib2xzX2NtZHMKKwkgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisJICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCisJICAgICAgSUZTPSIkc2F2ZV9pZnMiCisJICAgICAgZXZhbCBjbWQ9XCIkY21kXCIKKwkgICAgICBpZiBsZW49YGV4cHIgIlgkY21kIiA6ICIuKiJgICYmCisJICAgICAgIHRlc3QgIiRsZW4iIC1sZSAiJG1heF9jbWRfbGVuIiB8fCB0ZXN0ICIkbWF4X2NtZF9sZW4iIC1sZSAtMTsgdGhlbgorCSAgICAgICAgJHNob3cgIiRjbWQiCisJICAgICAgICAkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KKwkgICAgICAgIHNraXBwZWRfZXhwb3J0PWZhbHNlCisJICAgICAgZWxzZQorCSAgICAgICAgIyBUaGUgY29tbWFuZCBsaW5lIGlzIHRvbyBsb25nIHRvIGV4ZWN1dGUgaW4gb25lIHN0ZXAuCisJICAgICAgICAkc2hvdyAidXNpbmcgcmVsb2FkYWJsZSBvYmplY3QgZmlsZSBmb3IgZXhwb3J0IGxpc3QuLi4iCisJICAgICAgICBza2lwcGVkX2V4cG9ydD06CisJCSMgQnJlYWsgb3V0IGVhcmx5LCBvdGhlcndpc2Ugc2tpcHBlZF9leHBvcnQgbWF5IGJlCisJCSMgc2V0IHRvIGZhbHNlIGJ5IGEgbGF0ZXIgYnV0IHNob3J0ZXIgY21kLgorCQlicmVhaworCSAgICAgIGZpCisJICAgIGRvbmUKKwkgICAgSUZTPSIkc2F2ZV9pZnMiCisJICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KKwkgICAgICAkc2hvdyAiJEVHUkVQIC1lIFwiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4XCIgXCIkZXhwb3J0X3N5bWJvbHNcIiA+IFwiJHtleHBvcnRfc3ltYm9sc31UXCIiCisJICAgICAgJHJ1biBldmFsICckRUdSRVAgLWUgIiRleHBvcnRfc3ltYm9sc19yZWdleCIgIiRleHBvcnRfc3ltYm9scyIgPiAiJHtleHBvcnRfc3ltYm9sc31UIicKKwkgICAgICAkc2hvdyAiJG12IFwiJHtleHBvcnRfc3ltYm9sc31UXCIgXCIkZXhwb3J0X3N5bWJvbHNcIiIKKwkgICAgICAkcnVuIGV2YWwgJyRtdiAiJHtleHBvcnRfc3ltYm9sc31UIiAiJGV4cG9ydF9zeW1ib2xzIicKKwkgICAgZmkKKwkgIGZpCisJZmkKKworCWlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJGluY2x1ZGVfZXhwc3ltcyI7IHRoZW4KKwkgICRydW4gZXZhbCAnJGVjaG8gIlgkaW5jbHVkZV9leHBzeW1zIiB8ICRTUDJOTCA+PiAiJGV4cG9ydF9zeW1ib2xzIicKKwlmaQorCisJdG1wX2RlcGxpYnM9CisJZm9yIHRlc3RfZGVwbGliIGluICRkZXBsaWJzOyBkbworCQljYXNlICIgJGNvbnZlbmllbmNlICIgaW4KKwkJKiIgJHRlc3RfZGVwbGliICIqKSA7OworCQkqKQorCQkJdG1wX2RlcGxpYnM9IiR0bXBfZGVwbGlicyAkdGVzdF9kZXBsaWIiCisJCQk7OworCQllc2FjCisJZG9uZQorCWRlcGxpYnM9IiR0bXBfZGVwbGlicyIKKworCWlmIHRlc3QgLW4gIiRjb252ZW5pZW5jZSI7IHRoZW4KKwkgIGlmIHRlc3QgLW4gIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyI7IHRoZW4KKwkgICAgc2F2ZV9saWJvYmpzPSRsaWJvYmpzCisJICAgIGV2YWwgbGlib2Jqcz1cIlwkbGlib2JqcyAkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNcIgorCSAgZWxzZQorCSAgICBnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX14IgorCSAgICBnZW5lcmF0ZWQ9IiRnZW5lcmF0ZWQgJGdlbnRvcCIKKworCSAgICBmdW5jX2V4dHJhY3RfYXJjaGl2ZXMgJGdlbnRvcCAkY29udmVuaWVuY2UKKwkgICAgbGlib2Jqcz0iJGxpYm9ianMgJGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQiCisJICBmaQorCWZpCisJCisJaWYgdGVzdCAiJHRocmVhZF9zYWZlIiA9IHllcyAmJiB0ZXN0IC1uICIkdGhyZWFkX3NhZmVfZmxhZ19zcGVjIjsgdGhlbgorCSAgZXZhbCBmbGFnPVwiJHRocmVhZF9zYWZlX2ZsYWdfc3BlY1wiCisJICBsaW5rZXJfZmxhZ3M9IiRsaW5rZXJfZmxhZ3MgJGZsYWciCisJZmkKKworCSMgTWFrZSBhIGJhY2t1cCBvZiB0aGUgdW5pbnN0YWxsZWQgbGlicmFyeSB3aGVuIHJlbGlua2luZworCWlmIHRlc3QgIiRtb2RlIiA9IHJlbGluazsgdGhlbgorCSAgJHJ1biBldmFsICcoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICR7cmVhbG5hbWV9VSAmJiAkbXYgJHJlYWxuYW1lICR7cmVhbG5hbWV9VSknIHx8IGV4aXQgJD8KKwlmaQorCisJIyBEbyBlYWNoIG9mIHRoZSBhcmNoaXZlIGNvbW1hbmRzLgorCWlmIHRlc3QgIiRtb2R1bGUiID0geWVzICYmIHRlc3QgLW4gIiRtb2R1bGVfY21kcyIgOyB0aGVuCisJICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRtb2R1bGVfZXhwc3ltX2NtZHMiOyB0aGVuCisJICAgIGV2YWwgdGVzdF9jbWRzPVwiJG1vZHVsZV9leHBzeW1fY21kc1wiCisJICAgIGNtZHM9JG1vZHVsZV9leHBzeW1fY21kcworCSAgZWxzZQorCSAgICBldmFsIHRlc3RfY21kcz1cIiRtb2R1bGVfY21kc1wiCisJICAgIGNtZHM9JG1vZHVsZV9jbWRzCisJICBmaQorCWVsc2UKKwlpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRhcmNoaXZlX2V4cHN5bV9jbWRzIjsgdGhlbgorCSAgZXZhbCB0ZXN0X2NtZHM9XCIkYXJjaGl2ZV9leHBzeW1fY21kc1wiCisJICBjbWRzPSRhcmNoaXZlX2V4cHN5bV9jbWRzCisJZWxzZQorCSAgZXZhbCB0ZXN0X2NtZHM9XCIkYXJjaGl2ZV9jbWRzXCIKKwkgIGNtZHM9JGFyY2hpdmVfY21kcworCSAgZmkKKwlmaQorCisJaWYgdGVzdCAiWCRza2lwcGVkX2V4cG9ydCIgIT0gIlg6IiAmJgorCSAgIGxlbj1gZXhwciAiWCR0ZXN0X2NtZHMiIDogIi4qIiAyPi9kZXYvbnVsbGAgJiYKKwkgICB0ZXN0ICIkbGVuIiAtbGUgIiRtYXhfY21kX2xlbiIgfHwgdGVzdCAiJG1heF9jbWRfbGVuIiAtbGUgLTE7IHRoZW4KKwkgIDoKKwllbHNlCisJICAjIFRoZSBjb21tYW5kIGxpbmUgaXMgdG9vIGxvbmcgdG8gbGluayBpbiBvbmUgc3RlcCwgbGluayBwaWVjZXdpc2UuCisJICAkZWNobyAiY3JlYXRpbmcgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMuLi4iCisKKwkgICMgU2F2ZSB0aGUgdmFsdWUgb2YgJG91dHB1dCBhbmQgJGxpYm9ianMgYmVjYXVzZSB3ZSB3YW50IHRvCisJICAjIHVzZSB0aGVtIGxhdGVyLiAgSWYgd2UgaGF2ZSB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgd2UKKwkgICMgd2FudCB0byB1c2Ugc2F2ZV9saWJvYmpzIGFzIGl0IHdhcyBiZWZvcmUKKwkgICMgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMgd2FzIGV4cGFuZGVkLCBiZWNhdXNlIHdlIGNhbid0CisJICAjIGFzc3VtZSB0aGUgbGlua2VyIHVuZGVyc3RhbmRzIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLgorCSAgIyBUaGlzIG1heSBoYXZlIHRvIGJlIHJldmlzaXRlZCwgaW4gY2FzZSB0b28gbWFueQorCSAgIyBjb252ZW5pZW5jZSBsaWJyYXJpZXMgZ2V0IGxpbmtlZCBpbiBhbmQgZW5kIHVwIGV4Y2VlZGluZworCSAgIyB0aGUgc3BlYy4KKwkgIGlmIHRlc3QgLXogIiRjb252ZW5pZW5jZSIgfHwgdGVzdCAteiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgorCSAgICBzYXZlX2xpYm9ianM9JGxpYm9ianMKKwkgIGZpCisJICBzYXZlX291dHB1dD0kb3V0cHV0CisJICBvdXRwdXRfbGE9YCRlY2hvICJYJG91dHB1dCIgfCAkWHNlZCAtZSAiJGJhc2VuYW1lImAKKworCSAgIyBDbGVhciB0aGUgcmVsb2FkYWJsZSBvYmplY3QgY3JlYXRpb24gY29tbWFuZCBxdWV1ZSBhbmQKKwkgICMgaW5pdGlhbGl6ZSBrIHRvIG9uZS4KKwkgIHRlc3RfY21kcz0KKwkgIGNvbmNhdF9jbWRzPQorCSAgb2JqbGlzdD0KKwkgIGRlbGZpbGVzPQorCSAgbGFzdF9yb2JqPQorCSAgaz0xCisJICBvdXRwdXQ9JG91dHB1dF9vYmpkaXIvJG91dHB1dF9sYS0ke2t9LiRvYmpleHQKKwkgICMgTG9vcCBvdmVyIHRoZSBsaXN0IG9mIG9iamVjdHMgdG8gYmUgbGlua2VkLgorCSAgZm9yIG9iaiBpbiAkc2F2ZV9saWJvYmpzCisJICBkbworCSAgICBldmFsIHRlc3RfY21kcz1cIiRyZWxvYWRfY21kcyAkb2JqbGlzdCAkbGFzdF9yb2JqXCIKKwkgICAgaWYgdGVzdCAiWCRvYmpsaXN0IiA9IFggfHwKKwkgICAgICAgeyBsZW49YGV4cHIgIlgkdGVzdF9jbWRzIiA6ICIuKiIgMj4vZGV2L251bGxgICYmCisJCSB0ZXN0ICIkbGVuIiAtbGUgIiRtYXhfY21kX2xlbiI7IH07IHRoZW4KKwkgICAgICBvYmpsaXN0PSIkb2JqbGlzdCAkb2JqIgorCSAgICBlbHNlCisJICAgICAgIyBUaGUgY29tbWFuZCAkdGVzdF9jbWRzIGlzIGFsbW9zdCB0b28gbG9uZywgYWRkIGEKKwkgICAgICAjIGNvbW1hbmQgdG8gdGhlIHF1ZXVlLgorCSAgICAgIGlmIHRlc3QgIiRrIiAtZXEgMSA7IHRoZW4KKwkJIyBUaGUgZmlyc3QgZmlsZSBkb2Vzbid0IGhhdmUgYSBwcmV2aW91cyBjb21tYW5kIHRvIGFkZC4KKwkJZXZhbCBjb25jYXRfY21kcz1cIiRyZWxvYWRfY21kcyAkb2JqbGlzdCAkbGFzdF9yb2JqXCIKKwkgICAgICBlbHNlCisJCSMgQWxsIHN1YnNlcXVlbnQgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMgd2lsbCBsaW5rIGluCisJCSMgdGhlIGxhc3Qgb25lIGNyZWF0ZWQuCisJCWV2YWwgY29uY2F0X2NtZHM9XCJcJGNvbmNhdF9jbWRzfiRyZWxvYWRfY21kcyAkb2JqbGlzdCAkbGFzdF9yb2JqXCIKKwkgICAgICBmaQorCSAgICAgIGxhc3Rfcm9iaj0kb3V0cHV0X29iamRpci8kb3V0cHV0X2xhLSR7a30uJG9iamV4dAorCSAgICAgIGs9YGV4cHIgJGsgKyAxYAorCSAgICAgIG91dHB1dD0kb3V0cHV0X29iamRpci8kb3V0cHV0X2xhLSR7a30uJG9iamV4dAorCSAgICAgIG9iamxpc3Q9JG9iagorCSAgICAgIGxlbj0xCisJICAgIGZpCisJICBkb25lCisJICAjIEhhbmRsZSB0aGUgcmVtYWluaW5nIG9iamVjdHMgYnkgY3JlYXRpbmcgb25lIGxhc3QKKwkgICMgcmVsb2FkYWJsZSBvYmplY3QgZmlsZS4gIEFsbCBzdWJzZXF1ZW50IHJlbG9hZGFibGUgb2JqZWN0CisJICAjIGZpbGVzIHdpbGwgbGluayBpbiB0aGUgbGFzdCBvbmUgY3JlYXRlZC4KKwkgIHRlc3QgLXogIiRjb25jYXRfY21kcyIgfHwgY29uY2F0X2NtZHM9JGNvbmNhdF9jbWRzfgorCSAgZXZhbCBjb25jYXRfY21kcz1cIlwke2NvbmNhdF9jbWRzfSRyZWxvYWRfY21kcyAkb2JqbGlzdCAkbGFzdF9yb2JqXCIKKworCSAgaWYgJHtza2lwcGVkX2V4cG9ydC1mYWxzZX07IHRoZW4KKwkgICAgJHNob3cgImdlbmVyYXRpbmcgc3ltYm9sIGxpc3QgZm9yIFxgJGxpYm5hbWUubGEnIgorCSAgICBleHBvcnRfc3ltYm9scz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZXhwIgorCSAgICAkcnVuICRybSAkZXhwb3J0X3N5bWJvbHMKKwkgICAgbGlib2Jqcz0kb3V0cHV0CisJICAgICMgQXBwZW5kIHRoZSBjb21tYW5kIHRvIGNyZWF0ZSB0aGUgZXhwb3J0IGZpbGUuCisJICAgIGV2YWwgY29uY2F0X2NtZHM9XCJcJGNvbmNhdF9jbWRzfiRleHBvcnRfc3ltYm9sc19jbWRzXCIKKyAgICAgICAgICBmaQorCisJICAjIFNldCB1cCBhIGNvbW1hbmQgdG8gcmVtb3ZlIHRoZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlcworCSAgIyBhZnRlciB0aGV5IGFyZSB1c2VkLgorCSAgaT0wCisJICB3aGlsZSB0ZXN0ICIkaSIgLWx0ICIkayIKKwkgIGRvCisJICAgIGk9YGV4cHIgJGkgKyAxYAorCSAgICBkZWxmaWxlcz0iJGRlbGZpbGVzICRvdXRwdXRfb2JqZGlyLyRvdXRwdXRfbGEtJHtpfS4kb2JqZXh0IgorCSAgZG9uZQorCisJICAkZWNobyAiY3JlYXRpbmcgYSB0ZW1wb3JhcnkgcmVsb2FkYWJsZSBvYmplY3QgZmlsZTogJG91dHB1dCIKKworCSAgIyBMb29wIHRocm91Z2ggdGhlIGNvbW1hbmRzIGdlbmVyYXRlZCBhYm92ZSBhbmQgZXhlY3V0ZSB0aGVtLgorCSAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisJICBmb3IgY21kIGluICRjb25jYXRfY21kczsgZG8KKwkgICAgSUZTPSIkc2F2ZV9pZnMiCisJICAgICRzaG93ICIkY21kIgorCSAgICAkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KKwkgIGRvbmUKKwkgIElGUz0iJHNhdmVfaWZzIgorCisJICBsaWJvYmpzPSRvdXRwdXQKKwkgICMgUmVzdG9yZSB0aGUgdmFsdWUgb2Ygb3V0cHV0LgorCSAgb3V0cHV0PSRzYXZlX291dHB1dAorCisJICBpZiB0ZXN0IC1uICIkY29udmVuaWVuY2UiICYmIHRlc3QgLW4gIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyI7IHRoZW4KKwkgICAgZXZhbCBsaWJvYmpzPVwiXCRsaWJvYmpzICR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY1wiCisJICBmaQorCSAgIyBFeHBhbmQgdGhlIGxpYnJhcnkgbGlua2luZyBjb21tYW5kcyBhZ2FpbiB0byByZXNldCB0aGUKKwkgICMgdmFsdWUgb2YgJGxpYm9ianMgZm9yIHBpZWNld2lzZSBsaW5raW5nLgorCisJICAjIERvIGVhY2ggb2YgdGhlIGFyY2hpdmUgY29tbWFuZHMuCisJICBpZiB0ZXN0ICIkbW9kdWxlIiA9IHllcyAmJiB0ZXN0IC1uICIkbW9kdWxlX2NtZHMiIDsgdGhlbgorCSAgICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRtb2R1bGVfZXhwc3ltX2NtZHMiOyB0aGVuCisJICAgICAgY21kcz0kbW9kdWxlX2V4cHN5bV9jbWRzCisJICAgIGVsc2UKKwkgICAgICBjbWRzPSRtb2R1bGVfY21kcworCSAgICBmaQorCSAgZWxzZQorCSAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC1uICIkYXJjaGl2ZV9leHBzeW1fY21kcyI7IHRoZW4KKwkgICAgY21kcz0kYXJjaGl2ZV9leHBzeW1fY21kcworCSAgZWxzZQorCSAgICBjbWRzPSRhcmNoaXZlX2NtZHMKKwkgICAgZmkKKwkgIGZpCisKKwkgICMgQXBwZW5kIHRoZSBjb21tYW5kIHRvIHJlbW92ZSB0aGUgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMKKwkgICMgdG8gdGhlIGp1c3QtcmVzZXQgJGNtZHMuCisJICBldmFsIGNtZHM9XCJcJGNtZHN+XCRybSAkZGVsZmlsZXNcIgorCWZpCisJc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisJZm9yIGNtZCBpbiAkY21kczsgZG8KKwkgIElGUz0iJHNhdmVfaWZzIgorCSAgZXZhbCBjbWQ9XCIkY21kXCIKKwkgICRzaG93ICIkY21kIgorCSAgJHJ1biBldmFsICIkY21kIiB8fCB7CisJICAgIGx0X2V4aXQ9JD8KKworCSAgICAjIFJlc3RvcmUgdGhlIHVuaW5zdGFsbGVkIGxpYnJhcnkgYW5kIGV4aXQKKwkgICAgaWYgdGVzdCAiJG1vZGUiID0gcmVsaW5rOyB0aGVuCisJICAgICAgJHJ1biBldmFsICcoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICR7cmVhbG5hbWV9VCAmJiAkbXYgJHtyZWFsbmFtZX1VICRyZWFsbmFtZSknCisJICAgIGZpCisKKwkgICAgZXhpdCAkbHRfZXhpdAorCSAgfQorCWRvbmUKKwlJRlM9IiRzYXZlX2lmcyIKKworCSMgUmVzdG9yZSB0aGUgdW5pbnN0YWxsZWQgbGlicmFyeSBhbmQgZXhpdAorCWlmIHRlc3QgIiRtb2RlIiA9IHJlbGluazsgdGhlbgorCSAgJHJ1biBldmFsICcoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICR7cmVhbG5hbWV9VCAmJiAkbXYgJHJlYWxuYW1lICR7cmVhbG5hbWV9VCAmJiAkbXYgIiRyZWFsbmFtZSJVICRyZWFsbmFtZSknIHx8IGV4aXQgJD8KKworCSAgaWYgdGVzdCAtbiAiJGNvbnZlbmllbmNlIjsgdGhlbgorCSAgICBpZiB0ZXN0IC16ICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiOyB0aGVuCisJICAgICAgJHNob3cgIiR7cm19ciAkZ2VudG9wIgorCSAgICAgICRydW4gJHtybX1yICIkZ2VudG9wIgorCSAgICBmaQorCSAgZmkKKworCSAgZXhpdCAkRVhJVF9TVUNDRVNTCisJZmkKKworCSMgQ3JlYXRlIGxpbmtzIHRvIHRoZSByZWFsIGxpYnJhcnkuCisJZm9yIGxpbmtuYW1lIGluICRsaW5rbmFtZXM7IGRvCisJICBpZiB0ZXN0ICIkcmVhbG5hbWUiICE9ICIkbGlua25hbWUiOyB0aGVuCisJICAgICRzaG93ICIoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICRsaW5rbmFtZSAmJiAkTE5fUyAkcmVhbG5hbWUgJGxpbmtuYW1lKSIKKwkgICAgJHJ1biBldmFsICcoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICRsaW5rbmFtZSAmJiAkTE5fUyAkcmVhbG5hbWUgJGxpbmtuYW1lKScgfHwgZXhpdCAkPworCSAgZmkKKwlkb25lCisKKwkjIElmIC1tb2R1bGUgb3IgLWV4cG9ydC1keW5hbWljIHdhcyBzcGVjaWZpZWQsIHNldCB0aGUgZGxuYW1lLgorCWlmIHRlc3QgIiRtb2R1bGUiID0geWVzIHx8IHRlc3QgIiRleHBvcnRfZHluYW1pYyIgPSB5ZXM7IHRoZW4KKwkgICMgT24gYWxsIGtub3duIG9wZXJhdGluZyBzeXN0ZW1zLCB0aGVzZSBhcmUgaWRlbnRpY2FsLgorCSAgZGxuYW1lPSIkc29uYW1lIgorCWZpCisgICAgICBmaQorICAgICAgOzsKKworICAgIG9iaikKKyAgICAgIGlmIHRlc3QgLW4gIiRkZXBsaWJzIjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWwnIGFuZCBcYC1MJyBhcmUgaWdub3JlZCBmb3Igb2JqZWN0cyIgMT4mMgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyIgfHwgdGVzdCAiJGRsc2VsZiIgIT0gbm87IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1kbG9wZW4nIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiIDE+JjIKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRycGF0aCI7IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1ycGF0aCcgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIgMT4mMgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJHhycGF0aCI7IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1SJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkdmluZm8iOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtdmVyc2lvbi1pbmZvJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkcmVsZWFzZSI7IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCisgICAgICBmaQorCisgICAgICBjYXNlICRvdXRwdXQgaW4KKyAgICAgICoubG8pCisJaWYgdGVzdCAtbiAiJG9ianMkb2xkX2RlcGxpYnMiOyB0aGVuCisJICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgYnVpbGQgbGlicmFyeSBvYmplY3QgXGAkb3V0cHV0JyBmcm9tIG5vbi1saWJ0b29sIG9iamVjdHMiIDE+JjIKKwkgIGV4aXQgJEVYSVRfRkFJTFVSRQorCWZpCisJbGlib2JqPSIkb3V0cHV0IgorCW9iaj1gJGVjaG8gIlgkb3V0cHV0IiB8ICRYc2VkIC1lICIkbG8ybyJgCisJOzsKKyAgICAgICopCisJbGlib2JqPQorCW9iaj0iJG91dHB1dCIKKwk7OworICAgICAgZXNhYworCisgICAgICAjIERlbGV0ZSB0aGUgb2xkIG9iamVjdHMuCisgICAgICAkcnVuICRybSAkb2JqICRsaWJvYmoKKworICAgICAgIyBPYmplY3RzIGZyb20gY29udmVuaWVuY2UgbGlicmFyaWVzLiAgVGhpcyBhc3N1bWVzCisgICAgICAjIHNpbmdsZS12ZXJzaW9uIGNvbnZlbmllbmNlIGxpYnJhcmllcy4gIFdoZW5ldmVyIHdlIGNyZWF0ZQorICAgICAgIyBkaWZmZXJlbnQgb25lcyBmb3IgUElDL25vbi1QSUMsIHRoaXMgd2UnbGwgaGF2ZSB0byBkdXBsaWNhdGUKKyAgICAgICMgdGhlIGV4dHJhY3Rpb24uCisgICAgICByZWxvYWRfY29udl9vYmpzPQorICAgICAgZ2VudG9wPQorICAgICAgIyByZWxvYWRfY21kcyBydW5zICRMRCBkaXJlY3RseSwgc28gbGV0IHVzIGdldCByaWQgb2YKKyAgICAgICMgLVdsIGZyb20gd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMKKyAgICAgIHdsPQorCisgICAgICBpZiB0ZXN0IC1uICIkY29udmVuaWVuY2UiOyB0aGVuCisJaWYgdGVzdCAtbiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgorCSAgZXZhbCByZWxvYWRfY29udl9vYmpzPVwiXCRyZWxvYWRfb2JqcyAkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNcIgorCWVsc2UKKwkgIGdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvYmp9eCIKKwkgIGdlbmVyYXRlZD0iJGdlbmVyYXRlZCAkZ2VudG9wIgorCisJICBmdW5jX2V4dHJhY3RfYXJjaGl2ZXMgJGdlbnRvcCAkY29udmVuaWVuY2UKKwkgIHJlbG9hZF9jb252X29ianM9IiRyZWxvYWRfb2JqcyAkZnVuY19leHRyYWN0X2FyY2hpdmVzX3Jlc3VsdCIKKwlmaQorICAgICAgZmkKKworICAgICAgIyBDcmVhdGUgdGhlIG9sZC1zdHlsZSBvYmplY3QuCisgICAgICByZWxvYWRfb2Jqcz0iJG9ianMkb2xkX2RlcGxpYnMgImAkZWNobyAiWCRsaWJvYmpzIiB8ICRTUDJOTCB8ICRYc2VkIC1lICcvXC4nJHtsaWJleHR9JCcvZCcgLWUgJy9cLmxpYiQvZCcgLWUgIiRsbzJvIiB8ICROTDJTUGAiICRyZWxvYWRfY29udl9vYmpzIiAjIyMgdGVzdHN1aXRlOiBza2lwIG5lc3RlZCBxdW90aW5nIHRlc3QKKworICAgICAgb3V0cHV0PSIkb2JqIgorICAgICAgY21kcz0kcmVsb2FkX2NtZHMKKyAgICAgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JworICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KKwlJRlM9IiRzYXZlX2lmcyIKKwlldmFsIGNtZD1cIiRjbWRcIgorCSRzaG93ICIkY21kIgorCSRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPworICAgICAgZG9uZQorICAgICAgSUZTPSIkc2F2ZV9pZnMiCisKKyAgICAgICMgRXhpdCBpZiB3ZSBhcmVuJ3QgZG9pbmcgYSBsaWJyYXJ5IG9iamVjdCBmaWxlLgorICAgICAgaWYgdGVzdCAteiAiJGxpYm9iaiI7IHRoZW4KKwlpZiB0ZXN0IC1uICIkZ2VudG9wIjsgdGhlbgorCSAgJHNob3cgIiR7cm19ciAkZ2VudG9wIgorCSAgJHJ1biAke3JtfXIgJGdlbnRvcAorCWZpCisKKwlleGl0ICRFWElUX1NVQ0NFU1MKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllczsgdGhlbgorCWlmIHRlc3QgLW4gIiRnZW50b3AiOyB0aGVuCisJICAkc2hvdyAiJHtybX1yICRnZW50b3AiCisJICAkcnVuICR7cm19ciAkZ2VudG9wCisJZmkKKworCSMgQ3JlYXRlIGFuIGludmFsaWQgbGlidG9vbCBvYmplY3QgaWYgbm8gUElDLCBzbyB0aGF0IHdlIGRvbid0CisJIyBhY2NpZGVudGFsbHkgbGluayBpdCBpbnRvIGEgcHJvZ3JhbS4KKwkjICRzaG93ICJlY2hvIHRpbWVzdGFtcCA+ICRsaWJvYmoiCisJIyAkcnVuIGV2YWwgImVjaG8gdGltZXN0YW1wID4gJGxpYm9iaiIgfHwgZXhpdCAkPworCWV4aXQgJEVYSVRfU1VDQ0VTUworICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJHBpY19mbGFnIiB8fCB0ZXN0ICIkcGljX21vZGUiICE9IGRlZmF1bHQ7IHRoZW4KKwkjIE9ubHkgZG8gY29tbWFuZHMgaWYgd2UgcmVhbGx5IGhhdmUgZGlmZmVyZW50IFBJQyBvYmplY3RzLgorCXJlbG9hZF9vYmpzPSIkbGlib2JqcyAkcmVsb2FkX2NvbnZfb2JqcyIKKwlvdXRwdXQ9IiRsaWJvYmoiCisJY21kcz0kcmVsb2FkX2NtZHMKKwlzYXZlX2lmcz0iJElGUyI7IElGUz0nficKKwlmb3IgY21kIGluICRjbWRzOyBkbworCSAgSUZTPSIkc2F2ZV9pZnMiCisJICBldmFsIGNtZD1cIiRjbWRcIgorCSAgJHNob3cgIiRjbWQiCisJICAkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KKwlkb25lCisJSUZTPSIkc2F2ZV9pZnMiCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkZ2VudG9wIjsgdGhlbgorCSRzaG93ICIke3JtfXIgJGdlbnRvcCIKKwkkcnVuICR7cm19ciAkZ2VudG9wCisgICAgICBmaQorCisgICAgICBleGl0ICRFWElUX1NVQ0NFU1MKKyAgICAgIDs7CisKKyAgICBwcm9nKQorICAgICAgY2FzZSAkaG9zdCBpbgorCSpjeWd3aW4qKSBvdXRwdXQ9YCRlY2hvICRvdXRwdXQgfCAke1NFRH0gLWUgJ3MsLmV4ZSQsLDtzLCQsLmV4ZSwnYCA7OworICAgICAgZXNhYworICAgICAgaWYgdGVzdCAtbiAiJHZpbmZvIjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXZlcnNpb24taW5mbycgaXMgaWdub3JlZCBmb3IgcHJvZ3JhbXMiIDE+JjIKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRyZWxlYXNlIjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIHByb2dyYW1zIiAxPiYyCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkcHJlbG9hZCIgPSB5ZXM7IHRoZW4KKwlpZiB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiID0gdW5rbm93biAmJiB0ZXN0ICIkZGxvcGVuX3NlbGYiID0gdW5rbm93biAmJgorCSAgIHRlc3QgIiRkbG9wZW5fc2VsZl9zdGF0aWMiID0gdW5rbm93bjsgdGhlbgorCSAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGBBQ19MSUJUT09MX0RMT1BFTicgbm90IHVzZWQuIEFzc3VtaW5nIG5vIGRsb3BlbiBzdXBwb3J0LiIKKwlmaQorICAgICAgZmkKKworICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgKi0qLXJoYXBzb2R5KiB8ICotKi1kYXJ3aW4xLlswMTJdKQorCSMgT24gUmhhcHNvZHkgcmVwbGFjZSB0aGUgQyBsaWJyYXJ5IGlzIHRoZSBTeXN0ZW0gZnJhbWV3b3JrCisJY29tcGlsZV9kZXBsaWJzPWAkZWNobyAiWCAkY29tcGlsZV9kZXBsaWJzIiB8ICRYc2VkIC1lICdzLyAtbGMgLyAtZnJhbWV3b3JrIFN5c3RlbSAvJ2AKKwlmaW5hbGl6ZV9kZXBsaWJzPWAkZWNobyAiWCAkZmluYWxpemVfZGVwbGlicyIgfCAkWHNlZCAtZSAncy8gLWxjIC8gLWZyYW1ld29yayBTeXN0ZW0gLydgCisJOzsKKyAgICAgIGVzYWMKKworICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgKmRhcndpbiopCisgICAgICAgICMgRG9uJ3QgYWxsb3cgbGF6eSBsaW5raW5nLCBpdCBicmVha3MgQysrIGdsb2JhbCBjb25zdHJ1Y3RvcnMKKyAgICAgICAgaWYgdGVzdCAiJHRhZ25hbWUiID0gQ1hYIDsgdGhlbgorICAgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJHt3bH0tYmluZF9hdF9sb2FkIgorICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAke3dsfS1iaW5kX2F0X2xvYWQiCisgICAgICAgIGZpCisgICAgICAgIDs7CisgICAgICBlc2FjCisKKworICAgICAgIyBtb3ZlIGxpYnJhcnkgc2VhcmNoIHBhdGhzIHRoYXQgY29pbmNpZGUgd2l0aCBwYXRocyB0byBub3QgeWV0CisgICAgICAjIGluc3RhbGxlZCBsaWJyYXJpZXMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlicmFyeSBzZWFyY2ggbGlzdAorICAgICAgbmV3X2xpYnM9CisgICAgICBmb3IgcGF0aCBpbiAkbm90aW5zdF9wYXRoOyBkbworCWNhc2UgIiAkbmV3X2xpYnMgIiBpbgorCSoiIC1MJHBhdGgvJG9iamRpciAiKikgOzsKKwkqKQorCSAgY2FzZSAiICRjb21waWxlX2RlcGxpYnMgIiBpbgorCSAgKiIgLUwkcGF0aC8kb2JqZGlyICIqKQorCSAgICBuZXdfbGlicz0iJG5ld19saWJzIC1MJHBhdGgvJG9iamRpciIgOzsKKwkgIGVzYWMKKwkgIDs7CisJZXNhYworICAgICAgZG9uZQorICAgICAgZm9yIGRlcGxpYiBpbiAkY29tcGlsZV9kZXBsaWJzOyBkbworCWNhc2UgJGRlcGxpYiBpbgorCS1MKikKKwkgIGNhc2UgIiAkbmV3X2xpYnMgIiBpbgorCSAgKiIgJGRlcGxpYiAiKikgOzsKKwkgICopIG5ld19saWJzPSIkbmV3X2xpYnMgJGRlcGxpYiIgOzsKKwkgIGVzYWMKKwkgIDs7CisJKikgbmV3X2xpYnM9IiRuZXdfbGlicyAkZGVwbGliIiA7OworCWVzYWMKKyAgICAgIGRvbmUKKyAgICAgIGNvbXBpbGVfZGVwbGlicz0iJG5ld19saWJzIgorCisKKyAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkY29tcGlsZV9kZXBsaWJzIgorICAgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGZpbmFsaXplX2RlcGxpYnMiCisKKyAgICAgIGlmIHRlc3QgLW4gIiRycGF0aCR4cnBhdGgiOyB0aGVuCisJIyBJZiB0aGUgdXNlciBzcGVjaWZpZWQgYW55IHJwYXRoIGZsYWdzLCB0aGVuIGFkZCB0aGVtLgorCWZvciBsaWJkaXIgaW4gJHJwYXRoICR4cnBhdGg7IGRvCisJICAjIFRoaXMgaXMgdGhlIG1hZ2ljIHRvIHVzZSAtcnBhdGguCisJICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgorCSAgKiIgJGxpYmRpciAiKikgOzsKKwkgICopIGZpbmFsaXplX3JwYXRoPSIkZmluYWxpemVfcnBhdGggJGxpYmRpciIgOzsKKwkgIGVzYWMKKwlkb25lCisgICAgICBmaQorCisgICAgICAjIE5vdyBoYXJkY29kZSB0aGUgbGlicmFyeSBwYXRocworICAgICAgcnBhdGg9CisgICAgICBoYXJkY29kZV9saWJkaXJzPQorICAgICAgZm9yIGxpYmRpciBpbiAkY29tcGlsZV9ycGF0aCAkZmluYWxpemVfcnBhdGg7IGRvCisJaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCisJICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KKwkgICAgaWYgdGVzdCAteiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCisJICAgICAgaGFyZGNvZGVfbGliZGlycz0iJGxpYmRpciIKKwkgICAgZWxzZQorCSAgICAgICMgSnVzdCBhY2N1bXVsYXRlIHRoZSB1bmlxdWUgbGliZGlycy4KKwkgICAgICBjYXNlICRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciBpbgorCSAgICAgICoiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiKikKKwkJOzsKKwkgICAgICAqKQorCQloYXJkY29kZV9saWJkaXJzPSIkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciIKKwkJOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICBlbHNlCisJICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKwkgICAgcnBhdGg9IiRycGF0aCAkZmxhZyIKKwkgIGZpCisJZWxpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCisJICBjYXNlICIkcGVybV9ycGF0aCAiIGluCisJICAqIiAkbGliZGlyICIqKSA7OworCSAgKikgcGVybV9ycGF0aD0iJHBlcm1fcnBhdGggJGxpYmRpciIgOzsKKwkgIGVzYWMKKwlmaQorCWNhc2UgJGhvc3QgaW4KKwkqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKikKKwkgIHRlc3RiaW5kaXI9YCRlY2hvICJYJGxpYmRpciIgfCAkWHNlZCAtZSAncyovbGliJCovYmluKidgCisJICBjYXNlIDokZGxsc2VhcmNocGF0aDogaW4KKwkgICoiOiRsaWJkaXI6IiopIDs7CisJICAqKSBkbGxzZWFyY2hwYXRoPSIkZGxsc2VhcmNocGF0aDokbGliZGlyIjs7CisJICBlc2FjCisJICBjYXNlIDokZGxsc2VhcmNocGF0aDogaW4KKwkgICoiOiR0ZXN0YmluZGlyOiIqKSA7OworCSAgKikgZGxsc2VhcmNocGF0aD0iJGRsbHNlYXJjaHBhdGg6JHRlc3RiaW5kaXIiOzsKKwkgIGVzYWMKKwkgIDs7CisJZXNhYworICAgICAgZG9uZQorICAgICAgIyBTdWJzdGl0dXRlIHRoZSBoYXJkY29kZWQgbGliZGlycyBpbnRvIHRoZSBycGF0aC4KKyAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiAmJgorCSB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KKwlsaWJkaXI9IiRoYXJkY29kZV9saWJkaXJzIgorCWV2YWwgcnBhdGg9XCIgJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgorICAgICAgZmkKKyAgICAgIGNvbXBpbGVfcnBhdGg9IiRycGF0aCIKKworICAgICAgcnBhdGg9CisgICAgICBoYXJkY29kZV9saWJkaXJzPQorICAgICAgZm9yIGxpYmRpciBpbiAkZmluYWxpemVfcnBhdGg7IGRvCisJaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCisJICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KKwkgICAgaWYgdGVzdCAteiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCisJICAgICAgaGFyZGNvZGVfbGliZGlycz0iJGxpYmRpciIKKwkgICAgZWxzZQorCSAgICAgICMgSnVzdCBhY2N1bXVsYXRlIHRoZSB1bmlxdWUgbGliZGlycy4KKwkgICAgICBjYXNlICRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciBpbgorCSAgICAgICoiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiKikKKwkJOzsKKwkgICAgICAqKQorCQloYXJkY29kZV9saWJkaXJzPSIkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciIKKwkJOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICBlbHNlCisJICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKwkgICAgcnBhdGg9IiRycGF0aCAkZmxhZyIKKwkgIGZpCisJZWxpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCisJICBjYXNlICIkZmluYWxpemVfcGVybV9ycGF0aCAiIGluCisJICAqIiAkbGliZGlyICIqKSA7OworCSAgKikgZmluYWxpemVfcGVybV9ycGF0aD0iJGZpbmFsaXplX3Blcm1fcnBhdGggJGxpYmRpciIgOzsKKwkgIGVzYWMKKwlmaQorICAgICAgZG9uZQorICAgICAgIyBTdWJzdGl0dXRlIHRoZSBoYXJkY29kZWQgbGliZGlycyBpbnRvIHRoZSBycGF0aC4KKyAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiAmJgorCSB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KKwlsaWJkaXI9IiRoYXJkY29kZV9saWJkaXJzIgorCWV2YWwgcnBhdGg9XCIgJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgorICAgICAgZmkKKyAgICAgIGZpbmFsaXplX3JwYXRoPSIkcnBhdGgiCisKKyAgICAgIGlmIHRlc3QgLW4gIiRsaWJvYmpzIiAmJiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisJIyBUcmFuc2Zvcm0gYWxsIHRoZSBsaWJyYXJ5IG9iamVjdHMgaW50byBzdGFuZGFyZCBvYmplY3RzLgorCWNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRTUDJOTCB8ICRYc2VkIC1lICIkbG8ybyIgfCAkTkwyU1BgCisJZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkU1AyTkwgfCAkWHNlZCAtZSAiJGxvMm8iIHwgJE5MMlNQYAorICAgICAgZmkKKworICAgICAgZGxzeW1zPQorICAgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyIgfHwgdGVzdCAiJGRsc2VsZiIgIT0gbm87IHRoZW4KKwlpZiB0ZXN0IC1uICIkTk0iICYmIHRlc3QgLW4gIiRnbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCisJICBkbHN5bXM9IiR7b3V0cHV0bmFtZX1TLmMiCisJZWxzZQorCSAgJGVjaG8gIiRtb2RlbmFtZTogbm90IGNvbmZpZ3VyZWQgdG8gZXh0cmFjdCBnbG9iYWwgc3ltYm9scyBmcm9tIGRscHJlb3BlbmVkIGZpbGVzIiAxPiYyCisJZmkKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRkbHN5bXMiOyB0aGVuCisJY2FzZSAkZGxzeW1zIGluCisJIiIpIDs7CisJKi5jKQorCSAgIyBEaXNjb3ZlciB0aGUgbmxpc3Qgb2YgZWFjaCBvZiB0aGUgZGxmaWxlcy4KKwkgIG5saXN0PSIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Lm5tIgorCisJICAkc2hvdyAiJHJtICRubGlzdCAke25saXN0fVMgJHtubGlzdH1UIgorCSAgJHJ1biAkcm0gIiRubGlzdCIgIiR7bmxpc3R9UyIgIiR7bmxpc3R9VCIKKworCSAgIyBQYXJzZSB0aGUgbmFtZSBsaXN0IGludG8gYSBzb3VyY2UgZmlsZS4KKwkgICRzaG93ICJjcmVhdGluZyAkb3V0cHV0X29iamRpci8kZGxzeW1zIgorCisJICB0ZXN0IC16ICIkcnVuIiAmJiAkZWNobyA+ICIkb3V0cHV0X29iamRpci8kZGxzeW1zIiAiXAorLyogJGRsc3ltcyAtIHN5bWJvbCByZXNvbHV0aW9uIHRhYmxlIGZvciBcYCRvdXRwdXRuYW1lJyBkbHN5bSBlbXVsYXRpb24uICovCisvKiBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gLSBHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuIFwiQ1wiIHsKKyNlbmRpZgorCisvKiBQcmV2ZW50IHRoZSBvbmx5IGtpbmQgb2YgZGVjbGFyYXRpb24gY29uZmxpY3RzIHdlIGNhbiBtYWtlLiAqLworI2RlZmluZSBsdF9wcmVsb2FkZWRfc3ltYm9scyBzb21lX290aGVyX3N5bWJvbAorCisvKiBFeHRlcm5hbCBzeW1ib2wgZGVjbGFyYXRpb25zIGZvciB0aGUgY29tcGlsZXIuICovXAorIgorCisJICBpZiB0ZXN0ICIkZGxzZWxmIiA9IHllczsgdGhlbgorCSAgICAkc2hvdyAiZ2VuZXJhdGluZyBzeW1ib2wgbGlzdCBmb3IgXGAkb3V0cHV0JyIKKworCSAgICB0ZXN0IC16ICIkcnVuIiAmJiAkZWNobyAnOiBAUFJPR1JBTUAgJyA+ICIkbmxpc3QiCisKKwkgICAgIyBBZGQgb3VyIG93biBwcm9ncmFtIG9iamVjdHMgdG8gdGhlIHN5bWJvbCBsaXN0LgorCSAgICBwcm9nZmlsZXM9YCRlY2hvICJYJG9ianMkb2xkX2RlcGxpYnMiIHwgJFNQMk5MIHwgJFhzZWQgLWUgIiRsbzJvIiB8ICROTDJTUGAKKwkgICAgZm9yIGFyZyBpbiAkcHJvZ2ZpbGVzOyBkbworCSAgICAgICRzaG93ICJleHRyYWN0aW5nIGdsb2JhbCBDIHN5bWJvbHMgZnJvbSBcYCRhcmcnIgorCSAgICAgICRydW4gZXZhbCAiJE5NICRhcmcgfCAkZ2xvYmFsX3N5bWJvbF9waXBlID4+ICckbmxpc3QnIgorCSAgICBkb25lCisKKwkgICAgaWYgdGVzdCAtbiAiJGV4Y2x1ZGVfZXhwc3ltcyI7IHRoZW4KKwkgICAgICAkcnVuIGV2YWwgJyRFR1JFUCAtdiAiICgkZXhjbHVkZV9leHBzeW1zKSQiICIkbmxpc3QiID4gIiRubGlzdCJUJworCSAgICAgICRydW4gZXZhbCAnJG12ICIkbmxpc3QiVCAiJG5saXN0IicKKwkgICAgZmkKKworCSAgICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCisJICAgICAgJHJ1biBldmFsICckRUdSRVAgLWUgIiRleHBvcnRfc3ltYm9sc19yZWdleCIgIiRubGlzdCIgPiAiJG5saXN0IlQnCisJICAgICAgJHJ1biBldmFsICckbXYgIiRubGlzdCJUICIkbmxpc3QiJworCSAgICBmaQorCisJICAgICMgUHJlcGFyZSB0aGUgbGlzdCBvZiBleHBvcnRlZCBzeW1ib2xzCisJICAgIGlmIHRlc3QgLXogIiRleHBvcnRfc3ltYm9scyI7IHRoZW4KKwkgICAgICBleHBvcnRfc3ltYm9scz0iJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZXhwIgorCSAgICAgICRydW4gJHJtICRleHBvcnRfc3ltYm9scworCSAgICAgICRydW4gZXZhbCAiJHtTRUR9IC1uIC1lICcvXjogQFBST0dSQU1AICQvZCcgLWUgJ3MvXi4qIFwoLipcKSQvXDEvcCcgIic8ICIkbmxpc3QiID4gIiRleHBvcnRfc3ltYm9scyInCisgICAgICAgICAgICAgIGNhc2UgJGhvc3QgaW4KKyAgICAgICAgICAgICAgKmN5Z3dpbiogfCAqbWluZ3cqICkKKwkgICAgICAgICRydW4gZXZhbCAiZWNobyBFWFBPUlRTICInPiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZGVmIicKKwkJJHJ1biBldmFsICdjYXQgIiRleHBvcnRfc3ltYm9scyIgPj4gIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lLmRlZiInCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgZXNhYworCSAgICBlbHNlCisJICAgICAgJHJ1biBldmFsICIke1NFRH0gLWUgJ3MvXChbXS5bKl4kXVwpL1xcXFxcMS9nJyAtZSAncy9eLyAvJyAtZSAncy8kLyQvJyInIDwgIiRleHBvcnRfc3ltYm9scyIgPiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZXhwIicKKwkgICAgICAkcnVuIGV2YWwgJ2dyZXAgLWYgIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lLmV4cCIgPCAiJG5saXN0IiA+ICIkbmxpc3QiVCcKKwkgICAgICAkcnVuIGV2YWwgJ212ICIkbmxpc3QiVCAiJG5saXN0IicKKyAgICAgICAgICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgICAgICAgICAqY3lnd2luKiB8ICptaW5ndyogKQorCSAgICAgICAgJHJ1biBldmFsICJlY2hvIEVYUE9SVFMgIic+ICIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5kZWYiJworCQkkcnVuIGV2YWwgJ2NhdCAiJG5saXN0IiA+PiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZGVmIicKKyAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICBlc2FjCisJICAgIGZpCisJICBmaQorCisJICBmb3IgYXJnIGluICRkbHByZWZpbGVzOyBkbworCSAgICAkc2hvdyAiZXh0cmFjdGluZyBnbG9iYWwgQyBzeW1ib2xzIGZyb20gXGAkYXJnJyIKKwkgICAgbmFtZT1gJGVjaG8gIiRhcmciIHwgJHtTRUR9IC1lICdzJV4uKi8lJSdgCisJICAgICRydW4gZXZhbCAnJGVjaG8gIjogJG5hbWUgIiA+PiAiJG5saXN0IicKKwkgICAgJHJ1biBldmFsICIkTk0gJGFyZyB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPj4gJyRubGlzdCciCisJICBkb25lCisKKwkgIGlmIHRlc3QgLXogIiRydW4iOyB0aGVuCisJICAgICMgTWFrZSBzdXJlIHdlIGhhdmUgYXQgbGVhc3QgYW4gZW1wdHkgZmlsZS4KKwkgICAgdGVzdCAtZiAiJG5saXN0IiB8fCA6ID4gIiRubGlzdCIKKworCSAgICBpZiB0ZXN0IC1uICIkZXhjbHVkZV9leHBzeW1zIjsgdGhlbgorCSAgICAgICRFR1JFUCAtdiAiICgkZXhjbHVkZV9leHBzeW1zKSQiICIkbmxpc3QiID4gIiRubGlzdCJUCisJICAgICAgJG12ICIkbmxpc3QiVCAiJG5saXN0IgorCSAgICBmaQorCisJICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCisJICAgIGlmIGdyZXAgLXYgIl46ICIgPCAiJG5saXN0IiB8CisJCWlmIHNvcnQgLWsgMyA8L2Rldi9udWxsID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQkgIHNvcnQgLWsgMworCQllbHNlCisJCSAgc29ydCArMgorCQlmaSB8CisJCXVuaXEgPiAiJG5saXN0IlM7IHRoZW4KKwkgICAgICA6CisJICAgIGVsc2UKKwkgICAgICBncmVwIC12ICJeOiAiIDwgIiRubGlzdCIgPiAiJG5saXN0IlMKKwkgICAgZmkKKworCSAgICBpZiB0ZXN0IC1mICIkbmxpc3QiUzsgdGhlbgorCSAgICAgIGV2YWwgIiRnbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJG5saXN0IlMgPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiJworCSAgICBlbHNlCisJICAgICAgJGVjaG8gJy8qIE5PTkUgKi8nID4+ICIkb3V0cHV0X29iamRpci8kZGxzeW1zIgorCSAgICBmaQorCisJICAgICRlY2hvID4+ICIkb3V0cHV0X29iamRpci8kZGxzeW1zIiAiXAorCisjdW5kZWYgbHRfcHJlbG9hZGVkX3N5bWJvbHMKKworI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXworIyBkZWZpbmUgbHRfcHRyIHZvaWQgKgorI2Vsc2UKKyMgZGVmaW5lIGx0X3B0ciBjaGFyICoKKyMgZGVmaW5lIGNvbnN0CisjZW5kaWYKKworLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCisiCisKKwkgICAgY2FzZSAkaG9zdCBpbgorCSAgICAqY3lnd2luKiB8ICptaW5ndyogKQorCSAgJGVjaG8gPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiICJcCisvKiBEQVRBIGltcG9ydHMgZnJvbSBETExzIG9uIFdJTjMyIGNhbid0IGJlIGNvbnN0LCBiZWNhdXNlCisgICBydW50aW1lIHJlbG9jYXRpb25zIGFyZSBwZXJmb3JtZWQgLS0gc2VlIGxkJ3MgZG9jdW1lbnRhdGlvbgorICAgb24gcHNldWRvLXJlbG9jcyAqLworc3RydWN0IHsKKyIKKwkgICAgICA7OworCSAgICAqICkKKwkgICRlY2hvID4+ICIkb3V0cHV0X29iamRpci8kZGxzeW1zIiAiXAorY29uc3Qgc3RydWN0IHsKKyIKKwkgICAgICA7OworCSAgICBlc2FjCisKKworCSAgJGVjaG8gPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiICJcCisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGx0X3B0ciBhZGRyZXNzOworfQorbHRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Cit7XAorIgorCisJICAgIGV2YWwgIiRnbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzIiA8ICIkbmxpc3QiID4+ICIkb3V0cHV0X29iamRpci8kZGxzeW1zIgorCisJICAgICRlY2hvID4+ICIkb3V0cHV0X29iamRpci8kZGxzeW1zIiAiXAorICB7MCwgKGx0X3B0cikgMH0KK307CisKKy8qIFRoaXMgd29ya3MgYXJvdW5kIGEgcHJvYmxlbSBpbiBGcmVlQlNEIGxpbmtlciAqLworI2lmZGVmIEZSRUVCU0RfV09SS0FST1VORAorc3RhdGljIGNvbnN0IHZvaWQgKmx0X3ByZWxvYWRlZF9zZXR1cCgpIHsKKyAgcmV0dXJuIGx0X3ByZWxvYWRlZF9zeW1ib2xzOworfQorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmXAorIgorCSAgZmkKKworCSAgcGljX2ZsYWdfZm9yX3N5bXRhYmxlPQorCSAgY2FzZSAkaG9zdCBpbgorCSAgIyBjb21waWxpbmcgdGhlIHN5bWJvbCB0YWJsZSBmaWxlIHdpdGggcGljX2ZsYWcgd29ya3MgYXJvdW5kCisJICAjIGEgRnJlZUJTRCBidWcgdGhhdCBjYXVzZXMgcHJvZ3JhbXMgdG8gY3Jhc2ggd2hlbiAtbG0gaXMKKwkgICMgbGlua2VkIGJlZm9yZSBhbnkgb3RoZXIgUElDIG9iamVjdC4gIEJ1dCB3ZSBtdXN0IG5vdCB1c2UKKwkgICMgcGljX2ZsYWcgd2hlbiBsaW5raW5nIHdpdGggLXN0YXRpYy4gIFRoZSBwcm9ibGVtIGV4aXN0cyBpbgorCSAgIyBGcmVlQlNEIDIuMi42IGFuZCBpcyBmaXhlZCBpbiBGcmVlQlNEIDMuMS4KKwkgICotKi1mcmVlYnNkMip8Ki0qLWZyZWVic2QzLjAqfCotKi1mcmVlYnNkZWxmMy4wKikKKwkgICAgY2FzZSAiJGNvbXBpbGVfY29tbWFuZCAiIGluCisJICAgICoiIC1zdGF0aWMgIiopIDs7CisJICAgICopIHBpY19mbGFnX2Zvcl9zeW10YWJsZT0iICRwaWNfZmxhZyAtREZSRUVCU0RfV09SS0FST1VORCI7OworCSAgICBlc2FjOzsKKwkgICotKi1ocHV4KikKKwkgICAgY2FzZSAiJGNvbXBpbGVfY29tbWFuZCAiIGluCisJICAgICoiIC1zdGF0aWMgIiopIDs7CisJICAgICopIHBpY19mbGFnX2Zvcl9zeW10YWJsZT0iICRwaWNfZmxhZyI7OworCSAgICBlc2FjCisJICBlc2FjCisKKwkgICMgTm93IGNvbXBpbGUgdGhlIGR5bmFtaWMgc3ltYm9sIGZpbGUuCisJICAkc2hvdyAiKGNkICRvdXRwdXRfb2JqZGlyICYmICRMVENDICAkTFRDRkxBR1MgLWMkbm9fYnVpbHRpbl9mbGFnJHBpY19mbGFnX2Zvcl9zeW10YWJsZSBcIiRkbHN5bXNcIikiCisJICAkcnVuIGV2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkTFRDQyAgJExUQ0ZMQUdTIC1jJG5vX2J1aWx0aW5fZmxhZyRwaWNfZmxhZ19mb3Jfc3ltdGFibGUgIiRkbHN5bXMiKScgfHwgZXhpdCAkPworCisJICAjIENsZWFuIHVwIHRoZSBnZW5lcmF0ZWQgZmlsZXMuCisJICAkc2hvdyAiJHJtICRvdXRwdXRfb2JqZGlyLyRkbHN5bXMgJG5saXN0ICR7bmxpc3R9UyAke25saXN0fVQiCisJICAkcnVuICRybSAiJG91dHB1dF9vYmpkaXIvJGRsc3ltcyIgIiRubGlzdCIgIiR7bmxpc3R9UyIgIiR7bmxpc3R9VCIKKworCSAgIyBUcmFuc2Zvcm0gdGhlIHN5bWJvbCBmaWxlIGludG8gdGhlIGNvcnJlY3QgbmFtZS4KKyAgICAgICAgICBjYXNlICRob3N0IGluCisgICAgICAgICAgKmN5Z3dpbiogfCAqbWluZ3cqICkKKyAgICAgICAgICAgIGlmIHRlc3QgLWYgIiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX0uZGVmIiA7IHRoZW4KKyAgICAgICAgICAgICAgY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX0uZGVmICRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX1TLiR7b2JqZXh0fSUiYAorICAgICAgICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJUBTWU1GSUxFQCUkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9LmRlZiAkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Uy4ke29iamV4dH0lImAKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX1TLiR7b2JqZXh0fSUiYAorICAgICAgICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJUBTWU1GSUxFQCUkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Uy4ke29iamV4dH0lImAKKyAgICAgICAgICAgICBmaQorICAgICAgICAgICAgOzsKKyAgICAgICAgICAqICkKKyAgICAgICAgICAgIGNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJUBTWU1GSUxFQCUkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Uy4ke29iamV4dH0lImAKKyAgICAgICAgICAgIGZpbmFsaXplX2NvbW1hbmQ9YCRlY2hvICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX1TLiR7b2JqZXh0fSUiYAorICAgICAgICAgICAgOzsKKyAgICAgICAgICBlc2FjCisJICA7OworCSopCisJICAkZWNobyAiJG1vZGVuYW1lOiB1bmtub3duIHN1ZmZpeCBmb3IgXGAkZGxzeW1zJyIgMT4mMgorCSAgZXhpdCAkRVhJVF9GQUlMVVJFCisJICA7OworCWVzYWMKKyAgICAgIGVsc2UKKwkjIFdlIGtlZXAgZ29pbmcganVzdCBpbiBjYXNlIHRoZSB1c2VyIGRpZG4ndCByZWZlciB0bworCSMgbHRfcHJlbG9hZGVkX3N5bWJvbHMuICBUaGUgbGlua2VyIHdpbGwgZmFpbCBpZiBnbG9iYWxfc3ltYm9sX3BpcGUKKwkjIHJlYWxseSB3YXMgcmVxdWlyZWQuCisKKwkjIE51bGxpZnkgdGhlIHN5bWJvbCBmaWxlLgorCWNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJSBAU1lNRklMRUAlJSJgCisJZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyUgQFNZTUZJTEVAJSUiYAorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAiJG5lZWRfcmVsaW5rIiA9IG5vIHx8IHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllczsgdGhlbgorCSMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KKwljb21waWxlX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCUnIiRvdXRwdXQiJyVnJ2AKKwlsaW5rX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKKworCSMgV2UgaGF2ZSBubyB1bmluc3RhbGxlZCBsaWJyYXJ5IGRlcGVuZGVuY2llcywgc28gZmluYWxpemUgcmlnaHQgbm93LgorCSRzaG93ICIkbGlua19jb21tYW5kIgorCSRydW4gZXZhbCAiJGxpbmtfY29tbWFuZCIKKwlleGl0X3N0YXR1cz0kPworCisJIyBEZWxldGUgdGhlIGdlbmVyYXRlZCBmaWxlcy4KKwlpZiB0ZXN0IC1uICIkZGxzeW1zIjsgdGhlbgorCSAgJHNob3cgIiRybSAkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Uy4ke29iamV4dH0iCisJICAkcnVuICRybSAiJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfVMuJHtvYmpleHR9IgorCWZpCisKKwlleGl0ICRleGl0X3N0YXR1cworICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCisJIyBXZSBzaG91bGQgc2V0IHRoZSBzaGxpYnBhdGhfdmFyCisJcnBhdGg9CisJZm9yIGRpciBpbiAkdGVtcF9ycGF0aDsgZG8KKwkgIGNhc2UgJGRpciBpbgorCSAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qKQorCSAgICAjIEFic29sdXRlIHBhdGguCisJICAgIHJwYXRoPSIkcnBhdGgkZGlyOiIKKwkgICAgOzsKKwkgICopCisJICAgICMgUmVsYXRpdmUgcGF0aDogYWRkIGEgdGhpc2RpciBlbnRyeS4KKwkgICAgcnBhdGg9IiRycGF0aFwkdGhpc2Rpci8kZGlyOiIKKwkgICAgOzsKKwkgIGVzYWMKKwlkb25lCisJdGVtcF9ycGF0aD0iJHJwYXRoIgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJGNvbXBpbGVfc2hsaWJwYXRoJGZpbmFsaXplX3NobGlicGF0aCI7IHRoZW4KKwljb21waWxlX2NvbW1hbmQ9IiRzaGxpYnBhdGhfdmFyPVwiJGNvbXBpbGVfc2hsaWJwYXRoJGZpbmFsaXplX3NobGlicGF0aFwkJHNobGlicGF0aF92YXJcIiAkY29tcGlsZV9jb21tYW5kIgorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgLW4gIiRmaW5hbGl6ZV9zaGxpYnBhdGgiOyB0aGVuCisJZmluYWxpemVfY29tbWFuZD0iJHNobGlicGF0aF92YXI9XCIkZmluYWxpemVfc2hsaWJwYXRoXCQkc2hsaWJwYXRoX3ZhclwiICRmaW5hbGl6ZV9jb21tYW5kIgorICAgICAgZmkKKworICAgICAgY29tcGlsZV92YXI9CisgICAgICBmaW5hbGl6ZV92YXI9CisgICAgICBpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCisJaWYgdGVzdCAtbiAiJHBlcm1fcnBhdGgiOyB0aGVuCisJICAjIFdlIHNob3VsZCBzZXQgdGhlIHJ1bnBhdGhfdmFyLgorCSAgcnBhdGg9CisJICBmb3IgZGlyIGluICRwZXJtX3JwYXRoOyBkbworCSAgICBycGF0aD0iJHJwYXRoJGRpcjoiCisJICBkb25lCisJICBjb21waWxlX3Zhcj0iJHJ1bnBhdGhfdmFyPVwiJHJwYXRoXCQkcnVucGF0aF92YXJcIiAiCisJZmkKKwlpZiB0ZXN0IC1uICIkZmluYWxpemVfcGVybV9ycGF0aCI7IHRoZW4KKwkgICMgV2Ugc2hvdWxkIHNldCB0aGUgcnVucGF0aF92YXIuCisJICBycGF0aD0KKwkgIGZvciBkaXIgaW4gJGZpbmFsaXplX3Blcm1fcnBhdGg7IGRvCisJICAgIHJwYXRoPSIkcnBhdGgkZGlyOiIKKwkgIGRvbmUKKwkgIGZpbmFsaXplX3Zhcj0iJHJ1bnBhdGhfdmFyPVwiJHJwYXRoXCQkcnVucGF0aF92YXJcIiAiCisJZmkKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRub19pbnN0YWxsIiA9IHllczsgdGhlbgorCSMgV2UgZG9uJ3QgbmVlZCB0byBjcmVhdGUgYSB3cmFwcGVyIHNjcmlwdC4KKwlsaW5rX2NvbW1hbmQ9IiRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKKwkjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCisJbGlua19jb21tYW5kPWAkZWNobyAiWCRsaW5rX2NvbW1hbmQiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0IiclZydgCisJIyBEZWxldGUgdGhlIG9sZCBvdXRwdXQgZmlsZS4KKwkkcnVuICRybSAkb3V0cHV0CisJIyBMaW5rIHRoZSBleGVjdXRhYmxlIGFuZCBleGl0CisJJHNob3cgIiRsaW5rX2NvbW1hbmQiCisJJHJ1biBldmFsICIkbGlua19jb21tYW5kIiB8fCBleGl0ICQ/CisJZXhpdCAkRVhJVF9TVUNDRVNTCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfYWN0aW9uIiA9IHJlbGluazsgdGhlbgorCSMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAorCWxpbmtfY29tbWFuZD0iJGNvbXBpbGVfdmFyJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIgorCXJlbGlua19jb21tYW5kPSIkZmluYWxpemVfdmFyJGZpbmFsaXplX2NvbW1hbmQkZmluYWxpemVfcnBhdGgiCisKKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiB0aGlzIHBsYXRmb3JtIGRvZXMgbm90IGxpa2UgdW5pbnN0YWxsZWQgc2hhcmVkIGxpYnJhcmllcyIgMT4mMgorCSRlY2hvICIkbW9kZW5hbWU6IFxgJG91dHB1dCcgd2lsbCBiZSByZWxpbmtlZCBkdXJpbmcgaW5zdGFsbGF0aW9uIiAxPiYyCisgICAgICBlbHNlCisJaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgIT0gbm87IHRoZW4KKwkgIGxpbmtfY29tbWFuZD0iJGZpbmFsaXplX3ZhciRjb21waWxlX2NvbW1hbmQkZmluYWxpemVfcnBhdGgiCisJICBpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IHllczsgdGhlbgorCSAgICByZWxpbmtfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV92YXIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlXCRwcm9nZGlyL1wkZmlsZSVnJ2AKKwkgIGVsc2UKKwkgICAgIyBmYXN0X2luc3RhbGwgaXMgc2V0IHRvIG5lZWRsZXNzCisJICAgIHJlbGlua19jb21tYW5kPQorCSAgZmkKKwllbHNlCisJICBsaW5rX2NvbW1hbmQ9IiRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKKwkgIHJlbGlua19jb21tYW5kPSIkZmluYWxpemVfdmFyJGZpbmFsaXplX2NvbW1hbmQkZmluYWxpemVfcnBhdGgiCisJZmkKKyAgICAgIGZpCisKKyAgICAgICMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KKyAgICAgIGxpbmtfY29tbWFuZD1gJGVjaG8gIlgkbGlua19jb21tYW5kIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUiJyVnJ2AKKworICAgICAgIyBEZWxldGUgdGhlIG9sZCBvdXRwdXQgZmlsZXMuCisgICAgICAkcnVuICRybSAkb3V0cHV0ICRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lICRvdXRwdXRfb2JqZGlyL2x0LSRvdXRwdXRuYW1lCisKKyAgICAgICRzaG93ICIkbGlua19jb21tYW5kIgorICAgICAgJHJ1biBldmFsICIkbGlua19jb21tYW5kIiB8fCBleGl0ICQ/CisKKyAgICAgICMgTm93IGNyZWF0ZSB0aGUgd3JhcHBlciBzY3JpcHQuCisgICAgICAkc2hvdyAiY3JlYXRpbmcgJG91dHB1dCIKKworICAgICAgIyBRdW90ZSB0aGUgcmVsaW5rIGNvbW1hbmQgZm9yIHNoaXBwaW5nLgorICAgICAgaWYgdGVzdCAtbiAiJHJlbGlua19jb21tYW5kIjsgdGhlbgorCSMgUHJlc2VydmUgYW55IHZhcmlhYmxlcyB0aGF0IG1heSBhZmZlY3QgY29tcGlsZXIgYmVoYXZpb3IKKwlmb3IgdmFyIGluICR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluazsgZG8KKwkgIGlmIGV2YWwgdGVzdCAteiBcIlwkeyR2YXIrc2V0fVwiOyB0aGVuCisJICAgIHJlbGlua19jb21tYW5kPSJ7IHRlc3QgLXogXCJcJHskdmFyK3NldH1cIiB8fCB1bnNldCAkdmFyIHx8IHsgJHZhcj07IGV4cG9ydCAkdmFyOyB9OyB9OyAkcmVsaW5rX2NvbW1hbmQiCisJICBlbGlmIGV2YWwgdmFyX3ZhbHVlPVwkJHZhcjsgdGVzdCAteiAiJHZhcl92YWx1ZSI7IHRoZW4KKwkgICAgcmVsaW5rX2NvbW1hbmQ9IiR2YXI9OyBleHBvcnQgJHZhcjsgJHJlbGlua19jb21tYW5kIgorCSAgZWxzZQorCSAgICB2YXJfdmFsdWU9YCRlY2hvICJYJHZhcl92YWx1ZSIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisJICAgIHJlbGlua19jb21tYW5kPSIkdmFyPVwiJHZhcl92YWx1ZVwiOyBleHBvcnQgJHZhcjsgJHJlbGlua19jb21tYW5kIgorCSAgZmkKKwlkb25lCisJcmVsaW5rX2NvbW1hbmQ9IihjZCBgcHdkYDsgJHJlbGlua19jb21tYW5kKSIKKwlyZWxpbmtfY29tbWFuZD1gJGVjaG8gIlgkcmVsaW5rX2NvbW1hbmQiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorICAgICAgZmkKKworICAgICAgIyBRdW90ZSAkZWNobyBmb3Igc2hpcHBpbmcuCisgICAgICBpZiB0ZXN0ICJYJGVjaG8iID0gIlgkU0hFTEwgJHByb2dwYXRoIC0tZmFsbGJhY2stZWNobyI7IHRoZW4KKwljYXNlICRwcm9ncGF0aCBpbgorCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgcWVjaG89IiRTSEVMTCAkcHJvZ3BhdGggLS1mYWxsYmFjay1lY2hvIjs7CisJKikgcWVjaG89IiRTSEVMTCBgcHdkYC8kcHJvZ3BhdGggLS1mYWxsYmFjay1lY2hvIjs7CisJZXNhYworCXFlY2hvPWAkZWNobyAiWCRxZWNobyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisgICAgICBlbHNlCisJcWVjaG89YCRlY2hvICJYJGVjaG8iIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorICAgICAgZmkKKworICAgICAgIyBPbmx5IGFjdHVhbGx5IGRvIHRoaW5ncyBpZiBvdXIgcnVuIGNvbW1hbmQgaXMgbm9uLW51bGwuCisgICAgICBpZiB0ZXN0IC16ICIkcnVuIjsgdGhlbgorCSMgd2luMzIgd2lsbCB0aGluayB0aGUgc2NyaXB0IGlzIGEgYmluYXJ5IGlmIGl0IGhhcworCSMgYSAuZXhlIHN1ZmZpeCwgc28gd2Ugc3RyaXAgaXQgb2ZmIGhlcmUuCisJY2FzZSAkb3V0cHV0IGluCisJICAqLmV4ZSkgb3V0cHV0PWAkZWNobyAkb3V0cHV0fCR7U0VEfSAncywuZXhlJCwsJ2AgOzsKKwllc2FjCisJIyB0ZXN0IGZvciBjeWd3aW4gYmVjYXVzZSBtdiBmYWlscyB3L28gLmV4ZSBleHRlbnNpb25zCisJY2FzZSAkaG9zdCBpbgorCSAgKmN5Z3dpbiopCisJICAgIGV4ZWV4dD0uZXhlCisJICAgIG91dHB1dG5hbWU9YCRlY2hvICRvdXRwdXRuYW1lfCR7U0VEfSAncywuZXhlJCwsJ2AgOzsKKwkgICopIGV4ZWV4dD0gOzsKKwllc2FjCisJY2FzZSAkaG9zdCBpbgorCSAgKmN5Z3dpbiogfCAqbWluZ3cqICkKKyAgICAgICAgICAgIG91dHB1dF9uYW1lPWBiYXNlbmFtZSAkb3V0cHV0YAorICAgICAgICAgICAgb3V0cHV0X3BhdGg9YGRpcm5hbWUgJG91dHB1dGAKKyAgICAgICAgICAgIGN3cmFwcGVyc291cmNlPSIkb3V0cHV0X3BhdGgvJG9iamRpci9sdC0kb3V0cHV0X25hbWUuYyIKKyAgICAgICAgICAgIGN3cmFwcGVyPSIkb3V0cHV0X3BhdGgvJG91dHB1dF9uYW1lLmV4ZSIKKyAgICAgICAgICAgICRybSAkY3dyYXBwZXJzb3VyY2UgJGN3cmFwcGVyCisgICAgICAgICAgICB0cmFwICIkcm0gJGN3cmFwcGVyc291cmNlICRjd3JhcHBlcjsgZXhpdCAkRVhJVF9GQUlMVVJFIiAxIDIgMTUKKworCSAgICBjYXQgPiAkY3dyYXBwZXJzb3VyY2UgPDxFT0YKKworLyogJGN3cmFwcGVyc291cmNlIC0gdGVtcG9yYXJ5IHdyYXBwZXIgZXhlY3V0YWJsZSBmb3IgJG9iamRpci8kb3V0cHV0bmFtZQorICAgR2VuZXJhdGVkIGJ5ICRQUk9HUkFNIC0gR05VICRQQUNLQUdFICRWRVJTSU9OJFRJTUVTVEFNUAorCisgICBUaGUgJG91dHB1dCBwcm9ncmFtIGNhbm5vdCBiZSBkaXJlY3RseSBleGVjdXRlZCB1bnRpbCBhbGwgdGhlIGxpYnRvb2wKKyAgIGxpYnJhcmllcyB0aGF0IGl0IGRlcGVuZHMgb24gYXJlIGluc3RhbGxlZC4KKworICAgVGhpcyB3cmFwcGVyIGV4ZWN1dGFibGUgc2hvdWxkIG5ldmVyIGJlIG1vdmVkIG91dCBvZiB0aGUgYnVpbGQgZGlyZWN0b3J5LgorICAgSWYgaXQgaXMsIGl0IHdpbGwgbm90IG9wZXJhdGUgY29ycmVjdGx5LgorCisgICBDdXJyZW50bHksIGl0IHNpbXBseSBleGVjcyB0aGUgd3JhcHBlciAqc2NyaXB0KiAiL2Jpbi9zaCAkb3V0cHV0IiwKKyAgIGJ1dCBjb3VsZCBldmVudHVhbGx5IGFic29yYiBhbGwgb2YgdGhlIHNjcmlwdHMgZnVuY3Rpb25hbGl0eSBhbmQKKyAgIGV4ZWMgJG9iamRpci8kb3V0cHV0bmFtZSBkaXJlY3RseS4KKyovCitFT0YKKwkgICAgY2F0ID4+ICRjd3JhcHBlcnNvdXJjZTw8IkVPRiIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2lmIGRlZmluZWQoUEFUSF9NQVgpCisjIGRlZmluZSBMVF9QQVRITUFYIFBBVEhfTUFYCisjZWxpZiBkZWZpbmVkKE1BWFBBVEhMRU4pCisjIGRlZmluZSBMVF9QQVRITUFYIE1BWFBBVEhMRU4KKyNlbHNlCisjIGRlZmluZSBMVF9QQVRITUFYIDEwMjQKKyNlbmRpZgorCisjaWZuZGVmIERJUl9TRVBBUkFUT1IKKyMgZGVmaW5lIERJUl9TRVBBUkFUT1IgJy8nCisjIGRlZmluZSBQQVRIX1NFUEFSQVRPUiAnOicKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1dJTjMyKSB8fCBkZWZpbmVkIChfX01TRE9TX18pIHx8IGRlZmluZWQgKF9fREpHUFBfXykgfHwgXAorICBkZWZpbmVkIChfX09TMl9fKQorIyBkZWZpbmUgSEFWRV9ET1NfQkFTRURfRklMRV9TWVNURU0KKyMgaWZuZGVmIERJUl9TRVBBUkFUT1JfMgorIyAgZGVmaW5lIERJUl9TRVBBUkFUT1JfMiAnXFwnCisjIGVuZGlmCisjIGlmbmRlZiBQQVRIX1NFUEFSQVRPUl8yCisjICBkZWZpbmUgUEFUSF9TRVBBUkFUT1JfMiAnOycKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIERJUl9TRVBBUkFUT1JfMgorIyBkZWZpbmUgSVNfRElSX1NFUEFSQVRPUihjaCkgKChjaCkgPT0gRElSX1NFUEFSQVRPUikKKyNlbHNlIC8qIERJUl9TRVBBUkFUT1JfMiAqLworIyBkZWZpbmUgSVNfRElSX1NFUEFSQVRPUihjaCkgXAorICAgICAgICAoKChjaCkgPT0gRElSX1NFUEFSQVRPUikgfHwgKChjaCkgPT0gRElSX1NFUEFSQVRPUl8yKSkKKyNlbmRpZiAvKiBESVJfU0VQQVJBVE9SXzIgKi8KKworI2lmbmRlZiBQQVRIX1NFUEFSQVRPUl8yCisjIGRlZmluZSBJU19QQVRIX1NFUEFSQVRPUihjaCkgKChjaCkgPT0gUEFUSF9TRVBBUkFUT1IpCisjZWxzZSAvKiBQQVRIX1NFUEFSQVRPUl8yICovCisjIGRlZmluZSBJU19QQVRIX1NFUEFSQVRPUihjaCkgKChjaCkgPT0gUEFUSF9TRVBBUkFUT1JfMikKKyNlbmRpZiAvKiBQQVRIX1NFUEFSQVRPUl8yICovCisKKyNkZWZpbmUgWE1BTExPQyh0eXBlLCBudW0pICAgICAgKCh0eXBlICopIHhtYWxsb2MgKChudW0pICogc2l6ZW9mKHR5cGUpKSkKKyNkZWZpbmUgWEZSRUUoc3RhbGUpIGRvIHsgXAorICBpZiAoc3RhbGUpIHsgZnJlZSAoKHZvaWQgKikgc3RhbGUpOyBzdGFsZSA9IDA7IH0gXAorfSB3aGlsZSAoMCkKKworLyogLURERUJVRyBpcyBmYWlybHkgY29tbW9uIGluIENGTEFHUy4gICovCisjdW5kZWYgREVCVUcKKyNpZiBkZWZpbmVkIERFQlVHV1JBUFBFUgorIyBkZWZpbmUgREVCVUcoZm9ybWF0LCAuLi4pIGZwcmludGYoc3RkZXJyLCBmb3JtYXQsIF9fVkFfQVJHU19fKQorI2Vsc2UKKyMgZGVmaW5lIERFQlVHKGZvcm1hdCwgLi4uKQorI2VuZGlmCisKK2NvbnN0IGNoYXIgKnByb2dyYW1fbmFtZSA9IE5VTEw7CisKK3ZvaWQgKiB4bWFsbG9jIChzaXplX3QgbnVtKTsKK2NoYXIgKiB4c3RyZHVwIChjb25zdCBjaGFyICpzdHJpbmcpOworY29uc3QgY2hhciAqIGJhc2VfbmFtZSAoY29uc3QgY2hhciAqbmFtZSk7CitjaGFyICogZmluZF9leGVjdXRhYmxlKGNvbnN0IGNoYXIgKndyYXBwZXIpOworaW50ICAgIGNoZWNrX2V4ZWN1dGFibGUoY29uc3QgY2hhciAqcGF0aCk7CitjaGFyICogc3RyZW5kemFwKGNoYXIgKnN0ciwgY29uc3QgY2hhciAqcGF0KTsKK3ZvaWQgbHRfZmF0YWwgKGNvbnN0IGNoYXIgKm1lc3NhZ2UsIC4uLik7CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgY2hhciAqKm5ld2FyZ3o7CisgIGludCBpOworCisgIHByb2dyYW1fbmFtZSA9IChjaGFyICopIHhzdHJkdXAgKGJhc2VfbmFtZSAoYXJndlswXSkpOworICBERUJVRygiKG1haW4pIGFyZ3ZbMF0gICAgICA6ICVzXG4iLGFyZ3ZbMF0pOworICBERUJVRygiKG1haW4pIHByb2dyYW1fbmFtZSA6ICVzXG4iLHByb2dyYW1fbmFtZSk7CisgIG5ld2FyZ3ogPSBYTUFMTE9DKGNoYXIgKiwgYXJnYysyKTsKK0VPRgorCisgICAgICAgICAgICBjYXQgPj4gJGN3cmFwcGVyc291cmNlIDw8RU9GCisgIG5ld2FyZ3pbMF0gPSAoY2hhciAqKSB4c3RyZHVwKCIkU0hFTEwiKTsKK0VPRgorCisgICAgICAgICAgICBjYXQgPj4gJGN3cmFwcGVyc291cmNlIDw8IkVPRiIKKyAgbmV3YXJnelsxXSA9IGZpbmRfZXhlY3V0YWJsZShhcmd2WzBdKTsKKyAgaWYgKG5ld2FyZ3pbMV0gPT0gTlVMTCkKKyAgICBsdF9mYXRhbCgiQ291bGRuJ3QgZmluZCAlcyIsIGFyZ3ZbMF0pOworICBERUJVRygiKG1haW4pIGZvdW5kIGV4ZSBhdCA6ICVzXG4iLG5ld2FyZ3pbMV0pOworICAvKiB3ZSBrbm93IHRoZSBzY3JpcHQgaGFzIHRoZSBzYW1lIG5hbWUsIHdpdGhvdXQgdGhlIC5leGUgKi8KKyAgLyogc28gbWFrZSBzdXJlIG5ld2FyZ3pbMV0gZG9lc24ndCBlbmQgaW4gLmV4ZSAqLworICBzdHJlbmR6YXAobmV3YXJnelsxXSwiLmV4ZSIpOworICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKQorICAgIG5ld2FyZ3pbaSsxXSA9IHhzdHJkdXAoYXJndltpXSk7CisgIG5ld2FyZ3pbYXJnYysxXSA9IE5VTEw7CisKKyAgZm9yIChpPTA7IGk8YXJnYysxOyBpKyspCisgIHsKKyAgICBERUJVRygiKG1haW4pIG5ld2FyZ3pbJWRdICAgOiAlc1xuIixpLG5ld2FyZ3pbaV0pOworICAgIDsKKyAgfQorCitFT0YKKworICAgICAgICAgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgICAgICAgICBtaW5ndyopCisgICAgICAgICAgICAgICAgY2F0ID4+ICRjd3JhcHBlcnNvdXJjZSA8PEVPRgorICBleGVjdigiJFNIRUxMIiwoY2hhciBjb25zdCAqKiluZXdhcmd6KTsKK0VPRgorICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICAqKQorICAgICAgICAgICAgICAgIGNhdCA+PiAkY3dyYXBwZXJzb3VyY2UgPDxFT0YKKyAgZXhlY3YoIiRTSEVMTCIsbmV3YXJneik7CitFT0YKKyAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIGVzYWMKKworICAgICAgICAgICAgY2F0ID4+ICRjd3JhcHBlcnNvdXJjZSA8PCJFT0YiCisgIHJldHVybiAxMjc7Cit9CisKK3ZvaWQgKgoreG1hbGxvYyAoc2l6ZV90IG51bSkKK3sKKyAgdm9pZCAqIHAgPSAodm9pZCAqKSBtYWxsb2MgKG51bSk7CisgIGlmICghcCkKKyAgICBsdF9mYXRhbCAoIk1lbW9yeSBleGhhdXN0ZWQiKTsKKworICByZXR1cm4gcDsKK30KKworY2hhciAqCit4c3RyZHVwIChjb25zdCBjaGFyICpzdHJpbmcpCit7CisgIHJldHVybiBzdHJpbmcgPyBzdHJjcHkgKChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoc3RyaW5nKSArIDEpLCBzdHJpbmcpIDogTlVMTAorOworfQorCitjb25zdCBjaGFyICoKK2Jhc2VfbmFtZSAoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgY29uc3QgY2hhciAqYmFzZTsKKworI2lmIGRlZmluZWQgKEhBVkVfRE9TX0JBU0VEX0ZJTEVfU1lTVEVNKQorICAvKiBTa2lwIG92ZXIgdGhlIGRpc2sgbmFtZSBpbiBNU0RPUyBwYXRobmFtZXMuICovCisgIGlmIChpc2FscGhhICgodW5zaWduZWQgY2hhciluYW1lWzBdKSAmJiBuYW1lWzFdID09ICc6JykKKyAgICBuYW1lICs9IDI7CisjZW5kaWYKKworICBmb3IgKGJhc2UgPSBuYW1lOyAqbmFtZTsgbmFtZSsrKQorICAgIGlmIChJU19ESVJfU0VQQVJBVE9SICgqbmFtZSkpCisgICAgICBiYXNlID0gbmFtZSArIDE7CisgIHJldHVybiBiYXNlOworfQorCitpbnQKK2NoZWNrX2V4ZWN1dGFibGUoY29uc3QgY2hhciAqIHBhdGgpCit7CisgIHN0cnVjdCBzdGF0IHN0OworCisgIERFQlVHKCIoY2hlY2tfZXhlY3V0YWJsZSkgIDogJXNcbiIsIHBhdGggPyAoKnBhdGggPyBwYXRoIDogIkVNUFRZISIpIDogIk5VTEwhIik7CisgIGlmICgoIXBhdGgpIHx8ICghKnBhdGgpKQorICAgIHJldHVybiAwOworCisgIGlmICgoc3RhdCAocGF0aCwgJnN0KSA+PSAwKSAmJgorICAgICAgKAorICAgICAgICAvKiBNaW5HVyAmIG5hdGl2ZSBXSU4zMiBkbyBub3Qgc3VwcG9ydCBTX0lYT1RIIG9yIFNfSVhHUlAgKi8KKyNpZiBkZWZpbmVkIChTX0lYT1RIKQorICAgICAgICgoc3Quc3RfbW9kZSAmIFNfSVhPVEgpID09IFNfSVhPVEgpIHx8CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTX0lYR1JQKQorICAgICAgICgoc3Quc3RfbW9kZSAmIFNfSVhHUlApID09IFNfSVhHUlApIHx8CisjZW5kaWYKKyAgICAgICAoKHN0LnN0X21vZGUgJiBTX0lYVVNSKSA9PSBTX0lYVVNSKSkKKyAgICAgICkKKyAgICByZXR1cm4gMTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCisvKiBTZWFyY2hlcyBmb3IgdGhlIGZ1bGwgcGF0aCBvZiB0aGUgd3JhcHBlci4gIFJldHVybnMKKyAgIG5ld2x5IGFsbG9jYXRlZCBmdWxsIHBhdGggbmFtZSBpZiBmb3VuZCwgTlVMTCBvdGhlcndpc2UgKi8KK2NoYXIgKgorZmluZF9leGVjdXRhYmxlIChjb25zdCBjaGFyKiB3cmFwcGVyKQoreworICBpbnQgaGFzX3NsYXNoID0gMDsKKyAgY29uc3QgY2hhciogcDsKKyAgY29uc3QgY2hhciogcF9uZXh0OworICAvKiBzdGF0aWMgYnVmZmVyIGZvciBnZXRjd2QgKi8KKyAgY2hhciB0bXBbTFRfUEFUSE1BWCArIDFdOworICBpbnQgdG1wX2xlbjsKKyAgY2hhciogY29uY2F0X25hbWU7CisKKyAgREVCVUcoIihmaW5kX2V4ZWN1dGFibGUpICA6ICVzXG4iLCB3cmFwcGVyID8gKCp3cmFwcGVyID8gd3JhcHBlciA6ICJFTVBUWSEiKSA6ICJOVUxMISIpOworCisgIGlmICgod3JhcHBlciA9PSBOVUxMKSB8fCAoKndyYXBwZXIgPT0gJ1wwJykpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogQWJzb2x1dGUgcGF0aD8gKi8KKyNpZiBkZWZpbmVkIChIQVZFX0RPU19CQVNFRF9GSUxFX1NZU1RFTSkKKyAgaWYgKGlzYWxwaGEgKCh1bnNpZ25lZCBjaGFyKXdyYXBwZXJbMF0pICYmIHdyYXBwZXJbMV0gPT0gJzonKQorICB7CisgICAgY29uY2F0X25hbWUgPSB4c3RyZHVwICh3cmFwcGVyKTsKKyAgICBpZiAoY2hlY2tfZXhlY3V0YWJsZShjb25jYXRfbmFtZSkpCisgICAgICByZXR1cm4gY29uY2F0X25hbWU7CisgICAgWEZSRUUoY29uY2F0X25hbWUpOworICB9CisgIGVsc2UKKyAgeworI2VuZGlmCisgICAgaWYgKElTX0RJUl9TRVBBUkFUT1IgKHdyYXBwZXJbMF0pKQorICAgIHsKKyAgICAgIGNvbmNhdF9uYW1lID0geHN0cmR1cCAod3JhcHBlcik7CisgICAgICBpZiAoY2hlY2tfZXhlY3V0YWJsZShjb25jYXRfbmFtZSkpCisgICAgICAgIHJldHVybiBjb25jYXRfbmFtZTsKKyAgICAgIFhGUkVFKGNvbmNhdF9uYW1lKTsKKyAgICB9CisjaWYgZGVmaW5lZCAoSEFWRV9ET1NfQkFTRURfRklMRV9TWVNURU0pCisgIH0KKyNlbmRpZgorCisgIGZvciAocCA9IHdyYXBwZXI7ICpwOyBwKyspCisgICAgaWYgKCpwID09ICcvJykKKyAgICB7CisgICAgICBoYXNfc2xhc2ggPSAxOworICAgICAgYnJlYWs7CisgICAgfQorICBpZiAoIWhhc19zbGFzaCkKKyAgeworICAgIC8qIG5vIHNsYXNoZXM7IHNlYXJjaCBQQVRIICovCisgICAgY29uc3QgY2hhciogcGF0aCA9IGdldGVudiAoIlBBVEgiKTsKKyAgICBpZiAocGF0aCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZvciAocCA9IHBhdGg7ICpwOyBwID0gcF9uZXh0KQorICAgICAgeworICAgICAgICBjb25zdCBjaGFyKiBxOworICAgICAgICBzaXplX3QgcF9sZW47CisgICAgICAgIGZvciAocSA9IHA7ICpxOyBxKyspCisgICAgICAgICAgaWYgKElTX1BBVEhfU0VQQVJBVE9SKCpxKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBwX2xlbiA9IHEgLSBwOworICAgICAgICBwX25leHQgPSAoKnEgPT0gJ1wwJyA/IHEgOiBxICsgMSk7CisgICAgICAgIGlmIChwX2xlbiA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgLyogZW1wdHkgcGF0aDogY3VycmVudCBkaXJlY3RvcnkgKi8KKyAgICAgICAgICBpZiAoZ2V0Y3dkICh0bXAsIExUX1BBVEhNQVgpID09IE5VTEwpCisgICAgICAgICAgICBsdF9mYXRhbCAoImdldGN3ZCBmYWlsZWQiKTsKKyAgICAgICAgICB0bXBfbGVuID0gc3RybGVuKHRtcCk7CisgICAgICAgICAgY29uY2F0X25hbWUgPSBYTUFMTE9DKGNoYXIsIHRtcF9sZW4gKyAxICsgc3RybGVuKHdyYXBwZXIpICsgMSk7CisgICAgICAgICAgbWVtY3B5IChjb25jYXRfbmFtZSwgdG1wLCB0bXBfbGVuKTsKKyAgICAgICAgICBjb25jYXRfbmFtZVt0bXBfbGVuXSA9ICcvJzsKKyAgICAgICAgICBzdHJjcHkgKGNvbmNhdF9uYW1lICsgdG1wX2xlbiArIDEsIHdyYXBwZXIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGNvbmNhdF9uYW1lID0gWE1BTExPQyhjaGFyLCBwX2xlbiArIDEgKyBzdHJsZW4od3JhcHBlcikgKyAxKTsKKyAgICAgICAgICBtZW1jcHkgKGNvbmNhdF9uYW1lLCBwLCBwX2xlbik7CisgICAgICAgICAgY29uY2F0X25hbWVbcF9sZW5dID0gJy8nOworICAgICAgICAgIHN0cmNweSAoY29uY2F0X25hbWUgKyBwX2xlbiArIDEsIHdyYXBwZXIpOworICAgICAgICB9CisgICAgICAgIGlmIChjaGVja19leGVjdXRhYmxlKGNvbmNhdF9uYW1lKSkKKyAgICAgICAgICByZXR1cm4gY29uY2F0X25hbWU7CisgICAgICAgIFhGUkVFKGNvbmNhdF9uYW1lKTsKKyAgICAgIH0KKyAgICB9CisgICAgLyogbm90IGZvdW5kIGluIFBBVEg7IGFzc3VtZSBjdXJkaXIgKi8KKyAgfQorICAvKiBSZWxhdGl2ZSBwYXRoIHwgbm90IGZvdW5kIGluIHBhdGg6IHByZXBlbmQgY3dkICovCisgIGlmIChnZXRjd2QgKHRtcCwgTFRfUEFUSE1BWCkgPT0gTlVMTCkKKyAgICBsdF9mYXRhbCAoImdldGN3ZCBmYWlsZWQiKTsKKyAgdG1wX2xlbiA9IHN0cmxlbih0bXApOworICBjb25jYXRfbmFtZSA9IFhNQUxMT0MoY2hhciwgdG1wX2xlbiArIDEgKyBzdHJsZW4od3JhcHBlcikgKyAxKTsKKyAgbWVtY3B5IChjb25jYXRfbmFtZSwgdG1wLCB0bXBfbGVuKTsKKyAgY29uY2F0X25hbWVbdG1wX2xlbl0gPSAnLyc7CisgIHN0cmNweSAoY29uY2F0X25hbWUgKyB0bXBfbGVuICsgMSwgd3JhcHBlcik7CisKKyAgaWYgKGNoZWNrX2V4ZWN1dGFibGUoY29uY2F0X25hbWUpKQorICAgIHJldHVybiBjb25jYXRfbmFtZTsKKyAgWEZSRUUoY29uY2F0X25hbWUpOworICByZXR1cm4gTlVMTDsKK30KKworY2hhciAqCitzdHJlbmR6YXAoY2hhciAqc3RyLCBjb25zdCBjaGFyICpwYXQpCit7CisgIHNpemVfdCBsZW4sIHBhdGxlbjsKKworICBhc3NlcnQoc3RyICE9IE5VTEwpOworICBhc3NlcnQocGF0ICE9IE5VTEwpOworCisgIGxlbiA9IHN0cmxlbihzdHIpOworICBwYXRsZW4gPSBzdHJsZW4ocGF0KTsKKworICBpZiAocGF0bGVuIDw9IGxlbikKKyAgeworICAgIHN0ciArPSBsZW4gLSBwYXRsZW47CisgICAgaWYgKHN0cmNtcChzdHIsIHBhdCkgPT0gMCkKKyAgICAgICpzdHIgPSAnXDAnOworICB9CisgIHJldHVybiBzdHI7Cit9CisKK3N0YXRpYyB2b2lkCitsdF9lcnJvcl9jb3JlIChpbnQgZXhpdF9zdGF0dXMsIGNvbnN0IGNoYXIgKiBtb2RlLAorICAgICAgICAgIGNvbnN0IGNoYXIgKiBtZXNzYWdlLCB2YV9saXN0IGFwKQoreworICBmcHJpbnRmIChzdGRlcnIsICIlczogJXM6ICIsIHByb2dyYW1fbmFtZSwgbW9kZSk7CisgIHZmcHJpbnRmIChzdGRlcnIsIG1lc3NhZ2UsIGFwKTsKKyAgZnByaW50ZiAoc3RkZXJyLCAiLlxuIik7CisKKyAgaWYgKGV4aXRfc3RhdHVzID49IDApCisgICAgZXhpdCAoZXhpdF9zdGF0dXMpOworfQorCit2b2lkCitsdF9mYXRhbCAoY29uc3QgY2hhciAqbWVzc2FnZSwgLi4uKQoreworICB2YV9saXN0IGFwOworICB2YV9zdGFydCAoYXAsIG1lc3NhZ2UpOworICBsdF9lcnJvcl9jb3JlIChFWElUX0ZBSUxVUkUsICJGQVRBTCIsIG1lc3NhZ2UsIGFwKTsKKyAgdmFfZW5kIChhcCk7Cit9CitFT0YKKyAgICAgICAgICAjIHdlIHNob3VsZCByZWFsbHkgdXNlIGEgYnVpbGQtcGxhdGZvcm0gc3BlY2lmaWMgY29tcGlsZXIKKyAgICAgICAgICAjIGhlcmUsIGJ1dCBPVE9ILCB0aGUgd3JhcHBlcnMgKHNoZWxsIHNjcmlwdCBhbmQgdGhpcyBDIG9uZSkKKyAgICAgICAgICAjIGFyZSBvbmx5IHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBleGVjdXRlIHRoZSAicmVhbCIgYmluYXJ5LgorICAgICAgICAgICMgU2luY2UgdGhlICJyZWFsIiBiaW5hcnkgaXMgYnVpbHQgZm9yICRob3N0LCB0aGVuIHRoaXMKKyAgICAgICAgICAjIHdyYXBwZXIgbWlnaHQgYXMgd2VsbCBiZSBidWlsdCBmb3IgJGhvc3QsIHRvby4KKyAgICAgICAgICAkcnVuICRMVENDICRMVENGTEFHUyAtcyAtbyAkY3dyYXBwZXIgJGN3cmFwcGVyc291cmNlCisgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICAkcm0gJG91dHB1dAorICAgICAgICB0cmFwICIkcm0gJG91dHB1dDsgZXhpdCAkRVhJVF9GQUlMVVJFIiAxIDIgMTUKKworCSRlY2hvID4gJG91dHB1dCAiXAorIyEgJFNIRUxMCisKKyMgJG91dHB1dCAtIHRlbXBvcmFyeSB3cmFwcGVyIHNjcmlwdCBmb3IgJG9iamRpci8kb3V0cHV0bmFtZQorIyBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gLSBHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QCisjCisjIFRoZSAkb3V0cHV0IHByb2dyYW0gY2Fubm90IGJlIGRpcmVjdGx5IGV4ZWN1dGVkIHVudGlsIGFsbCB0aGUgbGlidG9vbAorIyBsaWJyYXJpZXMgdGhhdCBpdCBkZXBlbmRzIG9uIGFyZSBpbnN0YWxsZWQuCisjCisjIFRoaXMgd3JhcHBlciBzY3JpcHQgc2hvdWxkIG5ldmVyIGJlIG1vdmVkIG91dCBvZiB0aGUgYnVpbGQgZGlyZWN0b3J5LgorIyBJZiBpdCBpcywgaXQgd2lsbCBub3Qgb3BlcmF0ZSBjb3JyZWN0bHkuCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKKyMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCitYc2VkPScke1NFRH0gLWUgMXMvXlgvLycKK3NlZF9xdW90ZV9zdWJzdD0nJHNlZF9xdW90ZV9zdWJzdCcKKworIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKKyMgaWYgQ0RQQVRIIGlzIHNldC4KKyh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKKworcmVsaW5rX2NvbW1hbmQ9XCIkcmVsaW5rX2NvbW1hbmRcIgorCisjIFRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgZGV0ZXJtaW5lcyBvdXIgb3BlcmF0aW9uIG1vZGUuCitpZiB0ZXN0IFwiXCRsaWJ0b29sX2luc3RhbGxfbWFnaWNcIiA9IFwiJG1hZ2ljXCI7IHRoZW4KKyAgIyBpbnN0YWxsIG1vZGUgbmVlZHMgdGhlIGZvbGxvd2luZyB2YXJpYWJsZToKKyAgbm90aW5zdF9kZXBsaWJzPSckbm90aW5zdF9kZXBsaWJzJworZWxzZQorICAjIFdoZW4gd2UgYXJlIHNvdXJjZWQgaW4gZXhlY3V0ZSBtb2RlLCBcJGZpbGUgYW5kIFwkZWNobyBhcmUgYWxyZWFkeSBzZXQuCisgIGlmIHRlc3QgXCJcJGxpYnRvb2xfZXhlY3V0ZV9tYWdpY1wiICE9IFwiJG1hZ2ljXCI7IHRoZW4KKyAgICBlY2hvPVwiJHFlY2hvXCIKKyAgICBmaWxlPVwiXCQwXCIKKyAgICAjIE1ha2Ugc3VyZSBlY2hvIHdvcmtzLgorICAgIGlmIHRlc3QgXCJYXCQxXCIgPSBYLS1uby1yZWV4ZWM7IHRoZW4KKyAgICAgICMgRGlzY2FyZCB0aGUgLS1uby1yZWV4ZWMgZmxhZywgYW5kIGNvbnRpbnVlLgorICAgICAgc2hpZnQKKyAgICBlbGlmIHRlc3QgXCJYXGAoXCRlY2hvICdcdCcpIDI+L2Rldi9udWxsXGBcIiA9ICdYXHQnOyB0aGVuCisgICAgICAjIFlpcHBlZSwgXCRlY2hvIHdvcmtzIQorICAgICAgOgorICAgIGVsc2UKKyAgICAgICMgUmVzdGFydCB1bmRlciB0aGUgY29ycmVjdCBzaGVsbCwgYW5kIHRoZW4gbWF5YmUgXCRlY2hvIHdpbGwgd29yay4KKyAgICAgIGV4ZWMgJFNIRUxMIFwiXCQwXCIgLS1uby1yZWV4ZWMgXCR7MStcIlwkQFwifQorICAgIGZpCisgIGZpXAorIgorCSRlY2hvID4+ICRvdXRwdXQgIlwKKworICAjIEZpbmQgdGhlIGRpcmVjdG9yeSB0aGF0IHRoaXMgc2NyaXB0IGxpdmVzIGluLgorICB0aGlzZGlyPVxgXCRlY2hvIFwiWFwkZmlsZVwiIHwgXCRYc2VkIC1lICdzJS9bXi9dKiQlJSdcYAorICB0ZXN0IFwieFwkdGhpc2RpclwiID0gXCJ4XCRmaWxlXCIgJiYgdGhpc2Rpcj0uCisKKyAgIyBGb2xsb3cgc3ltYm9saWMgbGlua3MgdW50aWwgd2UgZ2V0IHRvIHRoZSByZWFsIHRoaXNkaXIuCisgIGZpbGU9XGBscyAtbGQgXCJcJGZpbGVcIiB8ICR7U0VEfSAtbiAncy8uKi0+IC8vcCdcYAorICB3aGlsZSB0ZXN0IC1uIFwiXCRmaWxlXCI7IGRvCisgICAgZGVzdGRpcj1cYFwkZWNobyBcIlhcJGZpbGVcIiB8IFwkWHNlZCAtZSAncyUvW14vXSpcJCUlJ1xgCisKKyAgICAjIElmIHRoZXJlIHdhcyBhIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gY2hhbmdlIHRoaXNkaXIuCisgICAgaWYgdGVzdCBcInhcJGRlc3RkaXJcIiAhPSBcInhcJGZpbGVcIjsgdGhlbgorICAgICAgY2FzZSBcIlwkZGVzdGRpclwiIGluCisgICAgICBbXFxcXC9dKiB8IFtBLVphLXpdOltcXFxcL10qKSB0aGlzZGlyPVwiXCRkZXN0ZGlyXCIgOzsKKyAgICAgICopIHRoaXNkaXI9XCJcJHRoaXNkaXIvXCRkZXN0ZGlyXCIgOzsKKyAgICAgIGVzYWMKKyAgICBmaQorCisgICAgZmlsZT1cYFwkZWNobyBcIlhcJGZpbGVcIiB8IFwkWHNlZCAtZSAncyVeLiovJSUnXGAKKyAgICBmaWxlPVxgbHMgLWxkIFwiXCR0aGlzZGlyL1wkZmlsZVwiIHwgJHtTRUR9IC1uICdzLy4qLT4gLy9wJ1xgCisgIGRvbmUKKworICAjIFRyeSB0byBnZXQgdGhlIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lLgorICBhYnNkaXI9XGBjZCBcIlwkdGhpc2RpclwiICYmIHB3ZFxgCisgIHRlc3QgLW4gXCJcJGFic2RpclwiICYmIHRoaXNkaXI9XCJcJGFic2RpclwiCisiCisKKwlpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IHllczsgdGhlbgorCSAgJGVjaG8gPj4gJG91dHB1dCAiXAorICBwcm9ncmFtPWx0LSckb3V0cHV0bmFtZSckZXhlZXh0CisgIHByb2dkaXI9XCJcJHRoaXNkaXIvJG9iamRpclwiCisKKyAgaWYgdGVzdCAhIC1mIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiIHx8IFxcCisgICAgIHsgZmlsZT1cYGxzIC0xZHQgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCIgXCJcJHByb2dkaXIvLi4vXCRwcm9ncmFtXCIgMj4vZGV2L251bGwgfCAke1NFRH0gMXFcYDsgXFwKKyAgICAgICB0ZXN0IFwiWFwkZmlsZVwiICE9IFwiWFwkcHJvZ2Rpci9cJHByb2dyYW1cIjsgfTsgdGhlbgorCisgICAgZmlsZT1cIlwkXCQtXCRwcm9ncmFtXCIKKworICAgIGlmIHRlc3QgISAtZCBcIlwkcHJvZ2RpclwiOyB0aGVuCisgICAgICAkbWtkaXIgXCJcJHByb2dkaXJcIgorICAgIGVsc2UKKyAgICAgICRybSBcIlwkcHJvZ2Rpci9cJGZpbGVcIgorICAgIGZpIgorCisJICAkZWNobyA+PiAkb3V0cHV0ICJcCisKKyAgICAjIHJlbGluayBleGVjdXRhYmxlIGlmIG5lY2Vzc2FyeQorICAgIGlmIHRlc3QgLW4gXCJcJHJlbGlua19jb21tYW5kXCI7IHRoZW4KKyAgICAgIGlmIHJlbGlua19jb21tYW5kX291dHB1dD1cYGV2YWwgXCRyZWxpbmtfY29tbWFuZCAyPiYxXGA7IHRoZW4gOgorICAgICAgZWxzZQorCSRlY2hvIFwiXCRyZWxpbmtfY29tbWFuZF9vdXRwdXRcIiA+JjIKKwkkcm0gXCJcJHByb2dkaXIvXCRmaWxlXCIKKwlleGl0ICRFWElUX0ZBSUxVUkUKKyAgICAgIGZpCisgICAgZmkKKworICAgICRtdiBcIlwkcHJvZ2Rpci9cJGZpbGVcIiBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIiAyPi9kZXYvbnVsbCB8fAorICAgIHsgJHJtIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOworICAgICAgJG12IFwiXCRwcm9nZGlyL1wkZmlsZVwiIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOyB9CisgICAgJHJtIFwiXCRwcm9nZGlyL1wkZmlsZVwiCisgIGZpIgorCWVsc2UKKwkgICRlY2hvID4+ICRvdXRwdXQgIlwKKyAgcHJvZ3JhbT0nJG91dHB1dG5hbWUnCisgIHByb2dkaXI9XCJcJHRoaXNkaXIvJG9iamRpclwiCisiCisJZmkKKworCSRlY2hvID4+ICRvdXRwdXQgIlwKKworICBpZiB0ZXN0IC1mIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOyB0aGVuIgorCisJIyBFeHBvcnQgb3VyIHNobGlicGF0aF92YXIgaWYgd2UgaGF2ZSBvbmUuCisJaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgJiYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiICYmIHRlc3QgLW4gIiR0ZW1wX3JwYXRoIjsgdGhlbgorCSAgJGVjaG8gPj4gJG91dHB1dCAiXAorICAgICMgQWRkIG91ciBvd24gbGlicmFyeSBwYXRoIHRvICRzaGxpYnBhdGhfdmFyCisgICAgJHNobGlicGF0aF92YXI9XCIkdGVtcF9ycGF0aFwkJHNobGlicGF0aF92YXJcIgorCisgICAgIyBTb21lIHN5c3RlbXMgY2Fubm90IGNvcGUgd2l0aCBjb2xvbi10ZXJtaW5hdGVkICRzaGxpYnBhdGhfdmFyCisgICAgIyBUaGUgc2Vjb25kIGNvbG9uIGlzIGEgd29ya2Fyb3VuZCBmb3IgYSBidWcgaW4gQmVPUyBSNCBzZWQKKyAgICAkc2hsaWJwYXRoX3Zhcj1cYFwkZWNobyBcIlhcJCRzaGxpYnBhdGhfdmFyXCIgfCBcJFhzZWQgLWUgJ3MvOjoqXCQvLydcYAorCisgICAgZXhwb3J0ICRzaGxpYnBhdGhfdmFyCisiCisJZmkKKworCSMgZml4dXAgdGhlIGRsbCBzZWFyY2hwYXRoIGlmIHdlIG5lZWQgdG8uCisJaWYgdGVzdCAtbiAiJGRsbHNlYXJjaHBhdGgiOyB0aGVuCisJICAkZWNobyA+PiAkb3V0cHV0ICJcCisgICAgIyBBZGQgdGhlIGRsbCBzZWFyY2ggcGF0aCBjb21wb25lbnRzIHRvIHRoZSBleGVjdXRhYmxlIFBBVEgKKyAgICBQQVRIPSRkbGxzZWFyY2hwYXRoOlwkUEFUSAorIgorCWZpCisKKwkkZWNobyA+PiAkb3V0cHV0ICJcCisgICAgaWYgdGVzdCBcIlwkbGlidG9vbF9leGVjdXRlX21hZ2ljXCIgIT0gXCIkbWFnaWNcIjsgdGhlbgorICAgICAgIyBSdW4gdGhlIGFjdHVhbCBwcm9ncmFtIHdpdGggb3VyIGFyZ3VtZW50cy4KKyIKKwljYXNlICRob3N0IGluCisJIyBCYWNrc2xhc2hlcyBzZXBhcmF0ZSBkaXJlY3RvcmllcyBvbiBwbGFpbiB3aW5kb3dzCisJKi0qLW1pbmd3IHwgKi0qLW9zMiopCisJICAkZWNobyA+PiAkb3V0cHV0ICJcCisgICAgICBleGVjIFwiXCRwcm9nZGlyXFxcXFwkcHJvZ3JhbVwiIFwkezErXCJcJEBcIn0KKyIKKwkgIDs7CisKKwkqKQorCSAgJGVjaG8gPj4gJG91dHB1dCAiXAorICAgICAgZXhlYyBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIiBcJHsxK1wiXCRAXCJ9CisiCisJICA7OworCWVzYWMKKwkkZWNobyA+PiAkb3V0cHV0ICJcCisgICAgICBcJGVjaG8gXCJcJDA6IGNhbm5vdCBleGVjIFwkcHJvZ3JhbSBcJHsxK1wiXCRAXCJ9XCIKKyAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorICAgIGZpCisgIGVsc2UKKyAgICAjIFRoZSBwcm9ncmFtIGRvZXNuJ3QgZXhpc3QuCisgICAgXCRlY2hvIFwiXCQwOiBlcnJvcjogXFxcYFwkcHJvZ2Rpci9cJHByb2dyYW0nIGRvZXMgbm90IGV4aXN0XCIgMT4mMgorICAgIFwkZWNobyBcIlRoaXMgc2NyaXB0IGlzIGp1c3QgYSB3cmFwcGVyIGZvciBcJHByb2dyYW0uXCIgMT4mMgorICAgICRlY2hvIFwiU2VlIHRoZSAkUEFDS0FHRSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLlwiIDE+JjIKKyAgICBleGl0ICRFWElUX0ZBSUxVUkUKKyAgZmkKK2ZpXAorIgorCWNobW9kICt4ICRvdXRwdXQKKyAgICAgIGZpCisgICAgICBleGl0ICRFWElUX1NVQ0NFU1MKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgIyBTZWUgaWYgd2UgbmVlZCB0byBidWlsZCBhbiBvbGQtZmFzaGlvbmVkIGFyY2hpdmUuCisgICAgZm9yIG9sZGxpYiBpbiAkb2xkbGliczsgZG8KKworICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBjb252ZW5pZW5jZTsgdGhlbgorCW9sZG9ianM9IiRsaWJvYmpzX3NhdmUiCisJYWRkbGlicz0iJGNvbnZlbmllbmNlIgorCWJ1aWxkX2xpYnRvb2xfbGlicz1ubworICAgICAgZWxzZQorCWlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gbW9kdWxlOyB0aGVuCisJICBvbGRvYmpzPSIkbGlib2Jqc19zYXZlIgorCSAgYnVpbGRfbGlidG9vbF9saWJzPW5vCisJZWxzZQorCSAgb2xkb2Jqcz0iJG9sZF9kZXBsaWJzICRub25fcGljX29iamVjdHMiCisJZmkKKwlhZGRsaWJzPSIkb2xkX2NvbnZlbmllbmNlIgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJGFkZGxpYnMiOyB0aGVuCisJZ2VudG9wPSIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9eCIKKwlnZW5lcmF0ZWQ9IiRnZW5lcmF0ZWQgJGdlbnRvcCIKKworCWZ1bmNfZXh0cmFjdF9hcmNoaXZlcyAkZ2VudG9wICRhZGRsaWJzCisJb2xkb2Jqcz0iJG9sZG9ianMgJGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQiCisgICAgICBmaQorCisgICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgYXJjaGl2ZSBjb21tYW5kcy4KKyAgICAgIGlmIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIiAmJiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorICAgICAgIGNtZHM9JG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMKKyAgICAgIGVsc2UKKwkjIFBPU0lYIGRlbWFuZHMgbm8gcGF0aHMgdG8gYmUgZW5jb2RlZCBpbiBhcmNoaXZlcy4gIFdlIGhhdmUKKwkjIHRvIGF2b2lkIGNyZWF0aW5nIGFyY2hpdmVzIHdpdGggZHVwbGljYXRlIGJhc2VuYW1lcyBpZiB3ZQorCSMgbWlnaHQgaGF2ZSB0byBleHRyYWN0IHRoZW0gYWZ0ZXJ3YXJkcywgZS5nLiwgd2hlbiBjcmVhdGluZyBhCisJIyBzdGF0aWMgYXJjaGl2ZSBvdXQgb2YgYSBjb252ZW5pZW5jZSBsaWJyYXJ5LCBvciB3aGVuIGxpbmtpbmcKKwkjIHRoZSBlbnRpcmV0eSBvZiBhIGxpYnRvb2wgYXJjaGl2ZSBpbnRvIGFub3RoZXIgKGN1cnJlbnRseQorCSMgbm90IHN1cHBvcnRlZCBieSBsaWJ0b29sKS4KKwlpZiAoZm9yIG9iaiBpbiAkb2xkb2JqcworCSAgICBkbworCSAgICAgICRlY2hvICJYJG9iaiIgfCAkWHNlZCAtZSAncyVeLiovJSUnCisJICAgIGRvbmUgfCBzb3J0IHwgc29ydCAtdWMgPi9kZXYvbnVsbCAyPiYxKTsgdGhlbgorCSAgOgorCWVsc2UKKwkgICRlY2hvICJjb3B5aW5nIHNlbGVjdGVkIG9iamVjdCBmaWxlcyB0byBhdm9pZCBiYXNlbmFtZSBjb25mbGljdHMuLi4iCisKKwkgIGlmIHRlc3QgLXogIiRnZW50b3AiOyB0aGVuCisJICAgIGdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfXgiCisJICAgIGdlbmVyYXRlZD0iJGdlbmVyYXRlZCAkZ2VudG9wIgorCisJICAgICRzaG93ICIke3JtfXIgJGdlbnRvcCIKKwkgICAgJHJ1biAke3JtfXIgIiRnZW50b3AiCisJICAgICRzaG93ICIkbWtkaXIgJGdlbnRvcCIKKwkgICAgJHJ1biAkbWtkaXIgIiRnZW50b3AiCisJICAgIGV4aXRfc3RhdHVzPSQ/CisJICAgIGlmIHRlc3QgIiRleGl0X3N0YXR1cyIgLW5lIDAgJiYgdGVzdCAhIC1kICIkZ2VudG9wIjsgdGhlbgorCSAgICAgIGV4aXQgJGV4aXRfc3RhdHVzCisJICAgIGZpCisJICBmaQorCisJICBzYXZlX29sZG9ianM9JG9sZG9ianMKKwkgIG9sZG9ianM9CisJICBjb3VudGVyPTEKKwkgIGZvciBvYmogaW4gJHNhdmVfb2xkb2JqcworCSAgZG8KKwkgICAgb2JqYmFzZT1gJGVjaG8gIlgkb2JqIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisJICAgIGNhc2UgIiAkb2xkb2JqcyAiIGluCisJICAgICIgIikgb2xkb2Jqcz0kb2JqIDs7CisJICAgICpbXCAvXSIkb2JqYmFzZSAiKikKKwkgICAgICB3aGlsZSA6OyBkbworCQkjIE1ha2Ugc3VyZSB3ZSBkb24ndCBwaWNrIGFuIGFsdGVybmF0ZSBuYW1lIHRoYXQgYWxzbworCQkjIG92ZXJsYXBzLgorCQluZXdvYmo9bHQkY291bnRlci0kb2JqYmFzZQorCQljb3VudGVyPWBleHByICRjb3VudGVyICsgMWAKKwkJY2FzZSAiICRvbGRvYmpzICIgaW4KKwkJKltcIC9dIiRuZXdvYmogIiopIDs7CisJCSopIGlmIHRlc3QgISAtZiAiJGdlbnRvcC8kbmV3b2JqIjsgdGhlbiBicmVhazsgZmkgOzsKKwkJZXNhYworCSAgICAgIGRvbmUKKwkgICAgICAkc2hvdyAibG4gJG9iaiAkZ2VudG9wLyRuZXdvYmogfHwgY3AgJG9iaiAkZ2VudG9wLyRuZXdvYmoiCisJICAgICAgJHJ1biBsbiAiJG9iaiIgIiRnZW50b3AvJG5ld29iaiIgfHwKKwkgICAgICAkcnVuIGNwICIkb2JqIiAiJGdlbnRvcC8kbmV3b2JqIgorCSAgICAgIG9sZG9ianM9IiRvbGRvYmpzICRnZW50b3AvJG5ld29iaiIKKwkgICAgICA7OworCSAgICAqKSBvbGRvYmpzPSIkb2xkb2JqcyAkb2JqIiA7OworCSAgICBlc2FjCisJICBkb25lCisJZmkKKworCWV2YWwgY21kcz1cIiRvbGRfYXJjaGl2ZV9jbWRzXCIKKworCWlmIGxlbj1gZXhwciAiWCRjbWRzIiA6ICIuKiJgICYmCisJICAgICB0ZXN0ICIkbGVuIiAtbGUgIiRtYXhfY21kX2xlbiIgfHwgdGVzdCAiJG1heF9jbWRfbGVuIiAtbGUgLTE7IHRoZW4KKwkgIGNtZHM9JG9sZF9hcmNoaXZlX2NtZHMKKwllbHNlCisJICAjIHRoZSBjb21tYW5kIGxpbmUgaXMgdG9vIGxvbmcgdG8gbGluayBpbiBvbmUgc3RlcCwgbGluayBpbiBwYXJ0cworCSAgJGVjaG8gInVzaW5nIHBpZWNld2lzZSBhcmNoaXZlIGxpbmtpbmcuLi4iCisJICBzYXZlX1JBTkxJQj0kUkFOTElCCisJICBSQU5MSUI9OgorCSAgb2JqbGlzdD0KKwkgIGNvbmNhdF9jbWRzPQorCSAgc2F2ZV9vbGRvYmpzPSRvbGRvYmpzCisKKwkgICMgSXMgdGhlcmUgYSBiZXR0ZXIgd2F5IG9mIGZpbmRpbmcgdGhlIGxhc3Qgb2JqZWN0IGluIHRoZSBsaXN0PworCSAgZm9yIG9iaiBpbiAkc2F2ZV9vbGRvYmpzCisJICBkbworCSAgICBsYXN0X29sZG9iaj0kb2JqCisJICBkb25lCisJICBmb3Igb2JqIGluICRzYXZlX29sZG9ianMKKwkgIGRvCisJICAgIG9sZG9ianM9IiRvYmpsaXN0ICRvYmoiCisJICAgIG9iamxpc3Q9IiRvYmpsaXN0ICRvYmoiCisJICAgIGV2YWwgdGVzdF9jbWRzPVwiJG9sZF9hcmNoaXZlX2NtZHNcIgorCSAgICBpZiBsZW49YGV4cHIgIlgkdGVzdF9jbWRzIiA6ICIuKiIgMj4vZGV2L251bGxgICYmCisJICAgICAgIHRlc3QgIiRsZW4iIC1sZSAiJG1heF9jbWRfbGVuIjsgdGhlbgorCSAgICAgIDoKKwkgICAgZWxzZQorCSAgICAgICMgdGhlIGFib3ZlIGNvbW1hbmQgc2hvdWxkIGJlIHVzZWQgYmVmb3JlIGl0IGdldHMgdG9vIGxvbmcKKwkgICAgICBvbGRvYmpzPSRvYmpsaXN0CisJICAgICAgaWYgdGVzdCAiJG9iaiIgPSAiJGxhc3Rfb2xkb2JqIiA7IHRoZW4KKwkgICAgICAgIFJBTkxJQj0kc2F2ZV9SQU5MSUIKKwkgICAgICBmaQorCSAgICAgIHRlc3QgLXogIiRjb25jYXRfY21kcyIgfHwgY29uY2F0X2NtZHM9JGNvbmNhdF9jbWRzfgorCSAgICAgIGV2YWwgY29uY2F0X2NtZHM9XCJcJHtjb25jYXRfY21kc30kb2xkX2FyY2hpdmVfY21kc1wiCisJICAgICAgb2JqbGlzdD0KKwkgICAgZmkKKwkgIGRvbmUKKwkgIFJBTkxJQj0kc2F2ZV9SQU5MSUIKKwkgIG9sZG9ianM9JG9iamxpc3QKKwkgIGlmIHRlc3QgIlgkb2xkb2JqcyIgPSAiWCIgOyB0aGVuCisJICAgIGV2YWwgY21kcz1cIlwkY29uY2F0X2NtZHNcIgorCSAgZWxzZQorCSAgICBldmFsIGNtZHM9XCJcJGNvbmNhdF9jbWRzflwkb2xkX2FyY2hpdmVfY21kc1wiCisJICBmaQorCWZpCisgICAgICBmaQorICAgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisgICAgICBmb3IgY21kIGluICRjbWRzOyBkbworICAgICAgICBldmFsIGNtZD1cIiRjbWRcIgorCUlGUz0iJHNhdmVfaWZzIgorCSRzaG93ICIkY21kIgorCSRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPworICAgICAgZG9uZQorICAgICAgSUZTPSIkc2F2ZV9pZnMiCisgICAgZG9uZQorCisgICAgaWYgdGVzdCAtbiAiJGdlbmVyYXRlZCI7IHRoZW4KKyAgICAgICRzaG93ICIke3JtfXIkZ2VuZXJhdGVkIgorICAgICAgJHJ1biAke3JtfXIkZ2VuZXJhdGVkCisgICAgZmkKKworICAgICMgTm93IGNyZWF0ZSB0aGUgbGlidG9vbCBhcmNoaXZlLgorICAgIGNhc2UgJG91dHB1dCBpbgorICAgICoubGEpCisgICAgICBvbGRfbGlicmFyeT0KKyAgICAgIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXMgJiYgb2xkX2xpYnJhcnk9IiRsaWJuYW1lLiRsaWJleHQiCisgICAgICAkc2hvdyAiY3JlYXRpbmcgJG91dHB1dCIKKworICAgICAgIyBQcmVzZXJ2ZSBhbnkgdmFyaWFibGVzIHRoYXQgbWF5IGFmZmVjdCBjb21waWxlciBiZWhhdmlvcgorICAgICAgZm9yIHZhciBpbiAkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms7IGRvCisJaWYgZXZhbCB0ZXN0IC16IFwiXCR7JHZhcitzZXR9XCI7IHRoZW4KKwkgIHJlbGlua19jb21tYW5kPSJ7IHRlc3QgLXogXCJcJHskdmFyK3NldH1cIiB8fCB1bnNldCAkdmFyIHx8IHsgJHZhcj07IGV4cG9ydCAkdmFyOyB9OyB9OyAkcmVsaW5rX2NvbW1hbmQiCisJZWxpZiBldmFsIHZhcl92YWx1ZT1cJCR2YXI7IHRlc3QgLXogIiR2YXJfdmFsdWUiOyB0aGVuCisJICByZWxpbmtfY29tbWFuZD0iJHZhcj07IGV4cG9ydCAkdmFyOyAkcmVsaW5rX2NvbW1hbmQiCisJZWxzZQorCSAgdmFyX3ZhbHVlPWAkZWNobyAiWCR2YXJfdmFsdWUiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorCSAgcmVsaW5rX2NvbW1hbmQ9IiR2YXI9XCIkdmFyX3ZhbHVlXCI7IGV4cG9ydCAkdmFyOyAkcmVsaW5rX2NvbW1hbmQiCisJZmkKKyAgICAgIGRvbmUKKyAgICAgICMgUXVvdGUgdGhlIGxpbmsgY29tbWFuZCBmb3Igc2hpcHBpbmcuCisgICAgICByZWxpbmtfY29tbWFuZD0iKGNkIGBwd2RgOyAkU0hFTEwgJHByb2dwYXRoICRwcmVzZXJ2ZV9hcmdzIC0tbW9kZT1yZWxpbmsgJGxpYnRvb2xfYXJncyBAaW5zdF9wcmVmaXhfZGlyQCkiCisgICAgICByZWxpbmtfY29tbWFuZD1gJGVjaG8gIlgkcmVsaW5rX2NvbW1hbmQiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2F1dG9tYXRpYyIgPSB5ZXMgOyB0aGVuCisJcmVsaW5rX2NvbW1hbmQ9CisgICAgICBmaQorCisKKyAgICAgICMgT25seSBjcmVhdGUgdGhlIG91dHB1dCBpZiBub3QgYSBkcnkgcnVuLgorICAgICAgaWYgdGVzdCAteiAiJHJ1biI7IHRoZW4KKwlmb3IgaW5zdGFsbGVkIGluIG5vIHllczsgZG8KKwkgIGlmIHRlc3QgIiRpbnN0YWxsZWQiID0geWVzOyB0aGVuCisJICAgIGlmIHRlc3QgLXogIiRpbnN0YWxsX2xpYmRpciI7IHRoZW4KKwkgICAgICBicmVhaworCSAgICBmaQorCSAgICBvdXRwdXQ9IiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lImkKKwkgICAgIyBSZXBsYWNlIGFsbCB1bmluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcyB3aXRoIHRoZSBpbnN0YWxsZWQgb25lcworCSAgICBuZXdkZXBlbmRlbmN5X2xpYnM9CisJICAgIGZvciBkZXBsaWIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KKwkgICAgICBjYXNlICRkZXBsaWIgaW4KKwkgICAgICAqLmxhKQorCQluYW1lPWAkZWNobyAiWCRkZXBsaWIiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKwkJZXZhbCBsaWJkaXI9YCR7U0VEfSAtbiAtZSAncy9ebGliZGlyPVwoLipcKSQvXDEvcCcgJGRlcGxpYmAKKwkJaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KKwkJICAkZWNobyAiJG1vZGVuYW1lOiBcYCRkZXBsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgorCQkgIGV4aXQgJEVYSVRfRkFJTFVSRQorCQlmaQorCQluZXdkZXBlbmRlbmN5X2xpYnM9IiRuZXdkZXBlbmRlbmN5X2xpYnMgJGxpYmRpci8kbmFtZSIKKwkJOzsKKwkgICAgICAqKSBuZXdkZXBlbmRlbmN5X2xpYnM9IiRuZXdkZXBlbmRlbmN5X2xpYnMgJGRlcGxpYiIgOzsKKwkgICAgICBlc2FjCisJICAgIGRvbmUKKwkgICAgZGVwZW5kZW5jeV9saWJzPSIkbmV3ZGVwZW5kZW5jeV9saWJzIgorCSAgICBuZXdkbGZpbGVzPQorCSAgICBmb3IgbGliIGluICRkbGZpbGVzOyBkbworCSAgICAgIG5hbWU9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorCSAgICAgIGV2YWwgbGliZGlyPWAke1NFRH0gLW4gLWUgJ3MvXmxpYmRpcj1cKC4qXCkkL1wxL3AnICRsaWJgCisJICAgICAgaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KKwkJJGVjaG8gIiRtb2RlbmFtZTogXGAkbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKKwkJZXhpdCAkRVhJVF9GQUlMVVJFCisJICAgICAgZmkKKwkgICAgICBuZXdkbGZpbGVzPSIkbmV3ZGxmaWxlcyAkbGliZGlyLyRuYW1lIgorCSAgICBkb25lCisJICAgIGRsZmlsZXM9IiRuZXdkbGZpbGVzIgorCSAgICBuZXdkbHByZWZpbGVzPQorCSAgICBmb3IgbGliIGluICRkbHByZWZpbGVzOyBkbworCSAgICAgIG5hbWU9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorCSAgICAgIGV2YWwgbGliZGlyPWAke1NFRH0gLW4gLWUgJ3MvXmxpYmRpcj1cKC4qXCkkL1wxL3AnICRsaWJgCisJICAgICAgaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KKwkJJGVjaG8gIiRtb2RlbmFtZTogXGAkbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKKwkJZXhpdCAkRVhJVF9GQUlMVVJFCisJICAgICAgZmkKKwkgICAgICBuZXdkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyAkbGliZGlyLyRuYW1lIgorCSAgICBkb25lCisJICAgIGRscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzIgorCSAgZWxzZQorCSAgICBuZXdkbGZpbGVzPQorCSAgICBmb3IgbGliIGluICRkbGZpbGVzOyBkbworCSAgICAgIGNhc2UgJGxpYiBpbgorCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIGFicz0iJGxpYiIgOzsKKwkJKikgYWJzPWBwd2RgIi8kbGliIiA7OworCSAgICAgIGVzYWMKKwkgICAgICBuZXdkbGZpbGVzPSIkbmV3ZGxmaWxlcyAkYWJzIgorCSAgICBkb25lCisJICAgIGRsZmlsZXM9IiRuZXdkbGZpbGVzIgorCSAgICBuZXdkbHByZWZpbGVzPQorCSAgICBmb3IgbGliIGluICRkbHByZWZpbGVzOyBkbworCSAgICAgIGNhc2UgJGxpYiBpbgorCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIGFicz0iJGxpYiIgOzsKKwkJKikgYWJzPWBwd2RgIi8kbGliIiA7OworCSAgICAgIGVzYWMKKwkgICAgICBuZXdkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyAkYWJzIgorCSAgICBkb25lCisJICAgIGRscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzIgorCSAgZmkKKwkgICRybSAkb3V0cHV0CisJICAjIHBsYWNlIGRsbmFtZSBpbiBjb3JyZWN0IHBvc2l0aW9uIGZvciBjeWd3aW4KKwkgIHRkbG5hbWU9JGRsbmFtZQorCSAgY2FzZSAkaG9zdCwkb3V0cHV0LCRpbnN0YWxsZWQsJG1vZHVsZSwkZGxuYW1lIGluCisJICAgICpjeWd3aW4qLCpsYWkseWVzLG5vLCouZGxsIHwgKm1pbmd3KiwqbGFpLHllcyxubywqLmRsbCkgdGRsbmFtZT0uLi9iaW4vJGRsbmFtZSA7OworCSAgZXNhYworCSAgJGVjaG8gPiAkb3V0cHV0ICJcCisjICRvdXRwdXRuYW1lIC0gYSBsaWJ0b29sIGxpYnJhcnkgZmlsZQorIyBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gLSBHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QCisjCisjIFBsZWFzZSBETyBOT1QgZGVsZXRlIHRoaXMgZmlsZSEKKyMgSXQgaXMgbmVjZXNzYXJ5IGZvciBsaW5raW5nIHRoZSBsaWJyYXJ5LgorCisjIFRoZSBuYW1lIHRoYXQgd2UgY2FuIGRsb3BlbigzKS4KK2RsbmFtZT0nJHRkbG5hbWUnCisKKyMgTmFtZXMgb2YgdGhpcyBsaWJyYXJ5LgorbGlicmFyeV9uYW1lcz0nJGxpYnJhcnlfbmFtZXMnCisKKyMgVGhlIG5hbWUgb2YgdGhlIHN0YXRpYyBhcmNoaXZlLgorb2xkX2xpYnJhcnk9JyRvbGRfbGlicmFyeScKKworIyBMaWJyYXJpZXMgdGhhdCB0aGlzIG9uZSBkZXBlbmRzIHVwb24uCitkZXBlbmRlbmN5X2xpYnM9JyRkZXBlbmRlbmN5X2xpYnMnCisKKyMgVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgJGxpYm5hbWUuCitjdXJyZW50PSRjdXJyZW50CithZ2U9JGFnZQorcmV2aXNpb249JHJldmlzaW9uCisKKyMgSXMgdGhpcyBhbiBhbHJlYWR5IGluc3RhbGxlZCBsaWJyYXJ5PworaW5zdGFsbGVkPSRpbnN0YWxsZWQKKworIyBTaG91bGQgd2Ugd2FybiBhYm91dCBwb3J0YWJpbGl0eSB3aGVuIGxpbmtpbmcgYWdhaW5zdCAtbW9kdWxlcz8KK3Nob3VsZG5vdGxpbms9JG1vZHVsZQorCisjIEZpbGVzIHRvIGRsb3Blbi9kbHByZW9wZW4KK2Rsb3Blbj0nJGRsZmlsZXMnCitkbHByZW9wZW49JyRkbHByZWZpbGVzJworCisjIERpcmVjdG9yeSB0aGF0IHRoaXMgbGlicmFyeSBuZWVkcyB0byBiZSBpbnN0YWxsZWQgaW46CitsaWJkaXI9JyRpbnN0YWxsX2xpYmRpciciCisJICBpZiB0ZXN0ICIkaW5zdGFsbGVkIiA9IG5vICYmIHRlc3QgIiRuZWVkX3JlbGluayIgPSB5ZXM7IHRoZW4KKwkgICAgJGVjaG8gPj4gJG91dHB1dCAiXAorcmVsaW5rX2NvbW1hbmQ9XCIkcmVsaW5rX2NvbW1hbmRcIiIKKwkgIGZpCisJZG9uZQorICAgICAgZmkKKworICAgICAgIyBEbyBhIHN5bWJvbGljIGxpbmsgc28gdGhhdCB0aGUgbGlidG9vbCBhcmNoaXZlIGNhbiBiZSBmb3VuZCBpbgorICAgICAgIyBMRF9MSUJSQVJZX1BBVEggYmVmb3JlIHRoZSBwcm9ncmFtIGlzIGluc3RhbGxlZC4KKyAgICAgICRzaG93ICIoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICRvdXRwdXRuYW1lICYmICRMTl9TIC4uLyRvdXRwdXRuYW1lICRvdXRwdXRuYW1lKSIKKyAgICAgICRydW4gZXZhbCAnKGNkICRvdXRwdXRfb2JqZGlyICYmICRybSAkb3V0cHV0bmFtZSAmJiAkTE5fUyAuLi8kb3V0cHV0bmFtZSAkb3V0cHV0bmFtZSknIHx8IGV4aXQgJD8KKyAgICAgIDs7CisgICAgZXNhYworICAgIGV4aXQgJEVYSVRfU1VDQ0VTUworICAgIDs7CisKKyAgIyBsaWJ0b29sIGluc3RhbGwgbW9kZQorICBpbnN0YWxsKQorICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGluc3RhbGwiCisKKyAgICAjIFRoZXJlIG1heSBiZSBhbiBvcHRpb25hbCBzaCgxKSBhcmd1bWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mCisgICAgIyBpbnN0YWxsX3Byb2cgKGVzcGVjaWFsbHkgb24gV2luZG93cyBOVCkuCisgICAgaWYgdGVzdCAiJG5vbm9wdCIgPSAiJFNIRUxMIiB8fCB0ZXN0ICIkbm9ub3B0IiA9IC9iaW4vc2ggfHwKKyAgICAgICAjIEFsbG93IHRoZSB1c2Ugb2YgR05VIHNodG9vbCdzIGluc3RhbGwgY29tbWFuZC4KKyAgICAgICAkZWNobyAiWCRub25vcHQiIHwgZ3JlcCBzaHRvb2wgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICMgQWVzdGhldGljYWxseSBxdW90ZSBpdC4KKyAgICAgIGFyZz1gJGVjaG8gIlgkbm9ub3B0IiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKyAgICAgIGNhc2UgJGFyZyBpbgorICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCisJYXJnPSJcIiRhcmdcIiIKKwk7OworICAgICAgZXNhYworICAgICAgaW5zdGFsbF9wcm9nPSIkYXJnICIKKyAgICAgIGFyZz0iJDEiCisgICAgICBzaGlmdAorICAgIGVsc2UKKyAgICAgIGluc3RhbGxfcHJvZz0KKyAgICAgIGFyZz0kbm9ub3B0CisgICAgZmkKKworICAgICMgVGhlIHJlYWwgZmlyc3QgYXJndW1lbnQgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIHRoZSBpbnN0YWxsYXRpb24gcHJvZ3JhbS4KKyAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgaXQuCisgICAgYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorICAgIGNhc2UgJGFyZyBpbgorICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQorICAgICAgYXJnPSJcIiRhcmdcIiIKKyAgICAgIDs7CisgICAgZXNhYworICAgIGluc3RhbGxfcHJvZz0iJGluc3RhbGxfcHJvZyRhcmciCisKKyAgICAjIFdlIG5lZWQgdG8gYWNjZXB0IGF0IGxlYXN0IGFsbCB0aGUgQlNEIGluc3RhbGwgZmxhZ3MuCisgICAgZGVzdD0KKyAgICBmaWxlcz0KKyAgICBvcHRzPQorICAgIHByZXY9CisgICAgaW5zdGFsbF90eXBlPQorICAgIGlzZGlyPW5vCisgICAgc3RyaXBtZT0KKyAgICBmb3IgYXJnCisgICAgZG8KKyAgICAgIGlmIHRlc3QgLW4gIiRkZXN0IjsgdGhlbgorCWZpbGVzPSIkZmlsZXMgJGRlc3QiCisJZGVzdD0kYXJnCisJY29udGludWUKKyAgICAgIGZpCisKKyAgICAgIGNhc2UgJGFyZyBpbgorICAgICAgLWQpIGlzZGlyPXllcyA7OworICAgICAgLWYpIAorICAgICAgCWNhc2UgIiAkaW5zdGFsbF9wcm9nICIgaW4KKwkqW1xcXCAvXWNwXCAqKSA7OworCSopIHByZXY9JGFyZyA7OworCWVzYWMKKwk7OworICAgICAgLWcgfCAtbSB8IC1vKSBwcmV2PSRhcmcgOzsKKyAgICAgIC1zKQorCXN0cmlwbWU9IiAtcyIKKwljb250aW51ZQorCTs7CisgICAgICAtKikKKwk7OworICAgICAgKikKKwkjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZGVkIGFuIGFyZ3VtZW50LCB0aGVuIHNraXAgaXQuCisJaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCisJICBwcmV2PQorCWVsc2UKKwkgIGRlc3Q9JGFyZworCSAgY29udGludWUKKwlmaQorCTs7CisgICAgICBlc2FjCisKKyAgICAgICMgQWVzdGhldGljYWxseSBxdW90ZSB0aGUgYXJndW1lbnQuCisgICAgICBhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisgICAgICBjYXNlICRhcmcgaW4KKyAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQorCWFyZz0iXCIkYXJnXCIiCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIGluc3RhbGxfcHJvZz0iJGluc3RhbGxfcHJvZyAkYXJnIgorICAgIGRvbmUKKworICAgIGlmIHRlc3QgLXogIiRpbnN0YWxsX3Byb2ciOyB0aGVuCisgICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGFuIGluc3RhbGwgcHJvZ3JhbSIgMT4mMgorICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCisgICAgICBleGl0ICRFWElUX0ZBSUxVUkUKKyAgICBmaQorCisgICAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCisgICAgICAkZWNobyAiJG1vZGVuYW1lOiB0aGUgXGAkcHJldicgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiAxPiYyCisgICAgICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorICAgIGZpCisKKyAgICBpZiB0ZXN0IC16ICIkZmlsZXMiOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICIkZGVzdCI7IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiBubyBmaWxlIG9yIGRlc3RpbmF0aW9uIHNwZWNpZmllZCIgMT4mMgorICAgICAgZWxzZQorCSRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBkZXN0aW5hdGlvbiIgMT4mMgorICAgICAgZmkKKyAgICAgICRlY2hvICIkaGVscCIgMT4mMgorICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisgICAgZmkKKworICAgICMgU3RyaXAgYW55IHRyYWlsaW5nIHNsYXNoIGZyb20gdGhlIGRlc3RpbmF0aW9uLgorICAgIGRlc3Q9YCRlY2hvICJYJGRlc3QiIHwgJFhzZWQgLWUgJ3MlLyQlJSdgCisKKyAgICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBpcyBhIGRpcmVjdG9yeS4KKyAgICB0ZXN0IC1kICIkZGVzdCIgJiYgaXNkaXI9eWVzCisgICAgaWYgdGVzdCAiJGlzZGlyIiA9IHllczsgdGhlbgorICAgICAgZGVzdGRpcj0iJGRlc3QiCisgICAgICBkZXN0bmFtZT0KKyAgICBlbHNlCisgICAgICBkZXN0ZGlyPWAkZWNobyAiWCRkZXN0IiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCisgICAgICB0ZXN0ICJYJGRlc3RkaXIiID0gIlgkZGVzdCIgJiYgZGVzdGRpcj0uCisgICAgICBkZXN0bmFtZT1gJGVjaG8gIlgkZGVzdCIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorCisgICAgICAjIE5vdCBhIGRpcmVjdG9yeSwgc28gY2hlY2sgdG8gc2VlIHRoYXQgdGhlcmUgaXMgb25seSBvbmUgZmlsZSBzcGVjaWZpZWQuCisgICAgICBzZXQgZHVtbXkgJGZpbGVzCisgICAgICBpZiB0ZXN0ICIkIyIgLWd0IDI7IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiBcYCRkZXN0JyBpcyBub3QgYSBkaXJlY3RvcnkiIDE+JjIKKwkkZWNobyAiJGhlbHAiIDE+JjIKKwlleGl0ICRFWElUX0ZBSUxVUkUKKyAgICAgIGZpCisgICAgZmkKKyAgICBjYXNlICRkZXN0ZGlyIGluCisgICAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OworICAgICopCisgICAgICBmb3IgZmlsZSBpbiAkZmlsZXM7IGRvCisJY2FzZSAkZmlsZSBpbgorCSoubG8pIDs7CisJKikKKwkgICRlY2hvICIkbW9kZW5hbWU6IFxgJGRlc3RkaXInIG11c3QgYmUgYW4gYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUiIDE+JjIKKwkgICRlY2hvICIkaGVscCIgMT4mMgorCSAgZXhpdCAkRVhJVF9GQUlMVVJFCisJICA7OworCWVzYWMKKyAgICAgIGRvbmUKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgIyBUaGlzIHZhcmlhYmxlIHRlbGxzIHdyYXBwZXIgc2NyaXB0cyBqdXN0IHRvIHNldCB2YXJpYWJsZXMgcmF0aGVyCisgICAgIyB0aGFuIHJ1bm5pbmcgdGhlaXIgcHJvZ3JhbXMuCisgICAgbGlidG9vbF9pbnN0YWxsX21hZ2ljPSIkbWFnaWMiCisKKyAgICBzdGF0aWNsaWJzPQorICAgIGZ1dHVyZV9saWJkaXJzPQorICAgIGN1cnJlbnRfbGliZGlycz0KKyAgICBmb3IgZmlsZSBpbiAkZmlsZXM7IGRvCisKKyAgICAgICMgRG8gZWFjaCBpbnN0YWxsYXRpb24uCisgICAgICBjYXNlICRmaWxlIGluCisgICAgICAqLiRsaWJleHQpCisJIyBEbyB0aGUgc3RhdGljIGxpYnJhcmllcyBsYXRlci4KKwlzdGF0aWNsaWJzPSIkc3RhdGljbGlicyAkZmlsZSIKKwk7OworCisgICAgICAqLmxhKQorCSMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIGFyY2hpdmUuCisJaWYgKCR7U0VEfSAtZSAnMnEnICRmaWxlIHwgZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorCWVsc2UKKwkgICRlY2hvICIkbW9kZW5hbWU6IFxgJGZpbGUnIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgorCSAgJGVjaG8gIiRoZWxwIiAxPiYyCisJICBleGl0ICRFWElUX0ZBSUxVUkUKKwlmaQorCisJbGlicmFyeV9uYW1lcz0KKwlvbGRfbGlicmFyeT0KKwlyZWxpbmtfY29tbWFuZD0KKwkjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KKwljYXNlICRmaWxlIGluCisJKi8qIHwgKlxcKikgLiAkZmlsZSA7OworCSopIC4gLi8kZmlsZSA7OworCWVzYWMKKworCSMgQWRkIHRoZSBsaWJkaXIgdG8gY3VycmVudF9saWJkaXJzIGlmIGl0IGlzIHRoZSBkZXN0aW5hdGlvbi4KKwlpZiB0ZXN0ICJYJGRlc3RkaXIiID0gIlgkbGliZGlyIjsgdGhlbgorCSAgY2FzZSAiJGN1cnJlbnRfbGliZGlycyAiIGluCisJICAqIiAkbGliZGlyICIqKSA7OworCSAgKikgY3VycmVudF9saWJkaXJzPSIkY3VycmVudF9saWJkaXJzICRsaWJkaXIiIDs7CisJICBlc2FjCisJZWxzZQorCSAgIyBOb3RlIHRoZSBsaWJkaXIgYXMgYSBmdXR1cmUgbGliZGlyLgorCSAgY2FzZSAiJGZ1dHVyZV9saWJkaXJzICIgaW4KKwkgICoiICRsaWJkaXIgIiopIDs7CisJICAqKSBmdXR1cmVfbGliZGlycz0iJGZ1dHVyZV9saWJkaXJzICRsaWJkaXIiIDs7CisJICBlc2FjCisJZmkKKworCWRpcj1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYC8KKwl0ZXN0ICJYJGRpciIgPSAiWCRmaWxlLyIgJiYgZGlyPQorCWRpcj0iJGRpciRvYmpkaXIiCisKKwlpZiB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuCisJICAjIERldGVybWluZSB0aGUgcHJlZml4IHRoZSB1c2VyIGhhcyBhcHBsaWVkIHRvIG91ciBmdXR1cmUgZGlyLgorCSAgaW5zdF9wcmVmaXhfZGlyPWAkZWNobyAiJGRlc3RkaXIiIHwgJFNFRCAicyUkbGliZGlyXCQlJSJgCisKKwkgICMgRG9uJ3QgYWxsb3cgdGhlIHVzZXIgdG8gcGxhY2UgdXMgb3V0c2lkZSBvZiBvdXIgZXhwZWN0ZWQKKwkgICMgbG9jYXRpb24gYi9jIHRoaXMgcHJldmVudHMgZmluZGluZyBkZXBlbmRlbnQgbGlicmFyaWVzIHRoYXQKKwkgICMgYXJlIGluc3RhbGxlZCB0byB0aGUgc2FtZSBwcmVmaXguCisJICAjIEF0IHByZXNlbnQsIHRoaXMgY2hlY2sgZG9lc24ndCBhZmZlY3Qgd2luZG93cyAuZGxsJ3MgdGhhdAorCSAgIyBhcmUgaW5zdGFsbGVkIGludG8gJGxpYmRpci8uLi9iaW4gKGN1cnJlbnRseSwgdGhhdCB3b3JrcyBmaW5lKQorCSAgIyBidXQgaXQncyBzb21ldGhpbmcgdG8ga2VlcCBhbiBleWUgb24uCisJICBpZiB0ZXN0ICIkaW5zdF9wcmVmaXhfZGlyIiA9ICIkZGVzdGRpciI7IHRoZW4KKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogZXJyb3I6IGNhbm5vdCBpbnN0YWxsIFxgJGZpbGUnIHRvIGEgZGlyZWN0b3J5IG5vdCBlbmRpbmcgaW4gJGxpYmRpciIgMT4mMgorCSAgICBleGl0ICRFWElUX0ZBSUxVUkUKKwkgIGZpCisKKwkgIGlmIHRlc3QgLW4gIiRpbnN0X3ByZWZpeF9kaXIiOyB0aGVuCisJICAgICMgU3RpY2sgdGhlIGluc3RfcHJlZml4X2RpciBkYXRhIGludG8gdGhlIGxpbmsgY29tbWFuZC4KKwkgICAgcmVsaW5rX2NvbW1hbmQ9YCRlY2hvICIkcmVsaW5rX2NvbW1hbmQiIHwgJFNFRCAicyVAaW5zdF9wcmVmaXhfZGlyQCUtaW5zdC1wcmVmaXgtZGlyICRpbnN0X3ByZWZpeF9kaXIlImAKKwkgIGVsc2UKKwkgICAgcmVsaW5rX2NvbW1hbmQ9YCRlY2hvICIkcmVsaW5rX2NvbW1hbmQiIHwgJFNFRCAicyVAaW5zdF9wcmVmaXhfZGlyQCUlImAKKwkgIGZpCisKKwkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IHJlbGlua2luZyBcYCRmaWxlJyIgMT4mMgorCSAgJHNob3cgIiRyZWxpbmtfY29tbWFuZCIKKwkgIGlmICRydW4gZXZhbCAiJHJlbGlua19jb21tYW5kIjsgdGhlbiA6CisJICBlbHNlCisJICAgICRlY2hvICIkbW9kZW5hbWU6IGVycm9yOiByZWxpbmsgXGAkZmlsZScgd2l0aCB0aGUgYWJvdmUgY29tbWFuZCBiZWZvcmUgaW5zdGFsbGluZyBpdCIgMT4mMgorCSAgICBleGl0ICRFWElUX0ZBSUxVUkUKKwkgIGZpCisJZmkKKworCSMgU2VlIHRoZSBuYW1lcyBvZiB0aGUgc2hhcmVkIGxpYnJhcnkuCisJc2V0IGR1bW15ICRsaWJyYXJ5X25hbWVzCisJaWYgdGVzdCAtbiAiJDIiOyB0aGVuCisJICByZWFsbmFtZT0iJDIiCisJICBzaGlmdAorCSAgc2hpZnQKKworCSAgc3JjbmFtZT0iJHJlYWxuYW1lIgorCSAgdGVzdCAtbiAiJHJlbGlua19jb21tYW5kIiAmJiBzcmNuYW1lPSIkcmVhbG5hbWUiVAorCisJICAjIEluc3RhbGwgdGhlIHNoYXJlZCBsaWJyYXJ5IGFuZCBidWlsZCB0aGUgc3ltbGlua3MuCisJICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkZGlyLyRzcmNuYW1lICRkZXN0ZGlyLyRyZWFsbmFtZSIKKwkgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyAkZGlyLyRzcmNuYW1lICRkZXN0ZGlyLyRyZWFsbmFtZSIgfHwgZXhpdCAkPworCSAgaWYgdGVzdCAtbiAiJHN0cmlwbWUiICYmIHRlc3QgLW4gIiRzdHJpcGxpYiI7IHRoZW4KKwkgICAgJHNob3cgIiRzdHJpcGxpYiAkZGVzdGRpci8kcmVhbG5hbWUiCisJICAgICRydW4gZXZhbCAiJHN0cmlwbGliICRkZXN0ZGlyLyRyZWFsbmFtZSIgfHwgZXhpdCAkPworCSAgZmkKKworCSAgaWYgdGVzdCAiJCMiIC1ndCAwOyB0aGVuCisJICAgICMgRGVsZXRlIHRoZSBvbGQgc3ltbGlua3MsIGFuZCBjcmVhdGUgbmV3IG9uZXMuCisJICAgICMgVHJ5IGBsbiAtc2YnIGZpcnN0LCBiZWNhdXNlIHRoZSBgbG4nIGJpbmFyeSBtaWdodCBkZXBlbmQgb24KKwkgICAgIyB0aGUgc3ltbGluayB3ZSByZXBsYWNlISAgU29sYXJpcyAvYmluL2xuIGRvZXMgbm90IHVuZGVyc3RhbmQgLWYsCisJICAgICMgc28gd2UgYWxzbyBuZWVkIHRvIHRyeSBybSAmJiBsbiAtcy4KKwkgICAgZm9yIGxpbmtuYW1lCisJICAgIGRvCisJICAgICAgaWYgdGVzdCAiJGxpbmtuYW1lIiAhPSAiJHJlYWxuYW1lIjsgdGhlbgorICAgICAgICAgICAgICAgICRzaG93ICIoY2QgJGRlc3RkaXIgJiYgeyAkTE5fUyAtZiAkcmVhbG5hbWUgJGxpbmtuYW1lIHx8IHsgJHJtICRsaW5rbmFtZSAmJiAkTE5fUyAkcmVhbG5hbWUgJGxpbmtuYW1lOyB9OyB9KSIKKyAgICAgICAgICAgICAgICAkcnVuIGV2YWwgIihjZCAkZGVzdGRpciAmJiB7ICRMTl9TIC1mICRyZWFsbmFtZSAkbGlua25hbWUgfHwgeyAkcm0gJGxpbmtuYW1lICYmICRMTl9TICRyZWFsbmFtZSAkbGlua25hbWU7IH07IH0pIgorCSAgICAgIGZpCisJICAgIGRvbmUKKwkgIGZpCisKKwkgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBwb3N0aW5zdGFsbCBjb21tYW5kcy4KKwkgIGxpYj0iJGRlc3RkaXIvJHJlYWxuYW1lIgorCSAgY21kcz0kcG9zdGluc3RhbGxfY21kcworCSAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisJICBmb3IgY21kIGluICRjbWRzOyBkbworCSAgICBJRlM9IiRzYXZlX2lmcyIKKwkgICAgZXZhbCBjbWQ9XCIkY21kXCIKKwkgICAgJHNob3cgIiRjbWQiCisJICAgICRydW4gZXZhbCAiJGNtZCIgfHwgeworCSAgICAgIGx0X2V4aXQ9JD8KKworCSAgICAgICMgUmVzdG9yZSB0aGUgdW5pbnN0YWxsZWQgbGlicmFyeSBhbmQgZXhpdAorCSAgICAgIGlmIHRlc3QgIiRtb2RlIiA9IHJlbGluazsgdGhlbgorCQkkcnVuIGV2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkcm0gJHtyZWFsbmFtZX1UICYmICRtdiAke3JlYWxuYW1lfVUgJHJlYWxuYW1lKScKKwkgICAgICBmaQorCisJICAgICAgZXhpdCAkbHRfZXhpdAorCSAgICB9CisJICBkb25lCisJICBJRlM9IiRzYXZlX2lmcyIKKwlmaQorCisJIyBJbnN0YWxsIHRoZSBwc2V1ZG8tbGlicmFyeSBmb3IgaW5mb3JtYXRpb24gcHVycG9zZXMuCisJbmFtZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorCWluc3RuYW1lPSIkZGlyLyRuYW1lImkKKwkkc2hvdyAiJGluc3RhbGxfcHJvZyAkaW5zdG5hbWUgJGRlc3RkaXIvJG5hbWUiCisJJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nICRpbnN0bmFtZSAkZGVzdGRpci8kbmFtZSIgfHwgZXhpdCAkPworCisJIyBNYXliZSBpbnN0YWxsIHRoZSBzdGF0aWMgbGlicmFyeSwgdG9vLgorCXRlc3QgLW4gIiRvbGRfbGlicmFyeSIgJiYgc3RhdGljbGlicz0iJHN0YXRpY2xpYnMgJGRpci8kb2xkX2xpYnJhcnkiCisJOzsKKworICAgICAgKi5sbykKKwkjIEluc3RhbGwgKGkuZS4gY29weSkgYSBsaWJ0b29sIG9iamVjdC4KKworCSMgRmlndXJlIG91dCBkZXN0aW5hdGlvbiBmaWxlIG5hbWUsIGlmIGl0IHdhc24ndCBhbHJlYWR5IHNwZWNpZmllZC4KKwlpZiB0ZXN0IC1uICIkZGVzdG5hbWUiOyB0aGVuCisJICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RuYW1lIgorCWVsc2UKKwkgIGRlc3RmaWxlPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisJICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RmaWxlIgorCWZpCisKKwkjIERlZHVjZSB0aGUgbmFtZSBvZiB0aGUgZGVzdGluYXRpb24gb2xkLXN0eWxlIG9iamVjdCBmaWxlLgorCWNhc2UgJGRlc3RmaWxlIGluCisJKi5sbykKKwkgIHN0YXRpY2Rlc3Q9YCRlY2hvICJYJGRlc3RmaWxlIiB8ICRYc2VkIC1lICIkbG8ybyJgCisJICA7OworCSouJG9iamV4dCkKKwkgIHN0YXRpY2Rlc3Q9IiRkZXN0ZmlsZSIKKwkgIGRlc3RmaWxlPQorCSAgOzsKKwkqKQorCSAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGNvcHkgYSBsaWJ0b29sIG9iamVjdCB0byBcYCRkZXN0ZmlsZSciIDE+JjIKKwkgICRlY2hvICIkaGVscCIgMT4mMgorCSAgZXhpdCAkRVhJVF9GQUlMVVJFCisJICA7OworCWVzYWMKKworCSMgSW5zdGFsbCB0aGUgbGlidG9vbCBvYmplY3QgaWYgcmVxdWVzdGVkLgorCWlmIHRlc3QgLW4gIiRkZXN0ZmlsZSI7IHRoZW4KKwkgICRzaG93ICIkaW5zdGFsbF9wcm9nICRmaWxlICRkZXN0ZmlsZSIKKwkgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyAkZmlsZSAkZGVzdGZpbGUiIHx8IGV4aXQgJD8KKwlmaQorCisJIyBJbnN0YWxsIHRoZSBvbGQgb2JqZWN0IGlmIGVuYWJsZWQuCisJaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorCSAgIyBEZWR1Y2UgdGhlIG5hbWUgb2YgdGhlIG9sZC1zdHlsZSBvYmplY3QgZmlsZS4KKwkgIHN0YXRpY29iaj1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAiJGxvMm8iYAorCisJICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkc3RhdGljb2JqICRzdGF0aWNkZXN0IgorCSAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nIFwkc3RhdGljb2JqIFwkc3RhdGljZGVzdCIgfHwgZXhpdCAkPworCWZpCisJZXhpdCAkRVhJVF9TVUNDRVNTCisJOzsKKworICAgICAgKikKKwkjIEZpZ3VyZSBvdXQgZGVzdGluYXRpb24gZmlsZSBuYW1lLCBpZiBpdCB3YXNuJ3QgYWxyZWFkeSBzcGVjaWZpZWQuCisJaWYgdGVzdCAtbiAiJGRlc3RuYW1lIjsgdGhlbgorCSAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0bmFtZSIKKwllbHNlCisJICBkZXN0ZmlsZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorCSAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0ZmlsZSIKKwlmaQorCisJIyBJZiB0aGUgZmlsZSBpcyBtaXNzaW5nLCBhbmQgdGhlcmUgaXMgYSAuZXhlIG9uIHRoZSBlbmQsIHN0cmlwIGl0CisJIyBiZWNhdXNlIGl0IGlzIG1vc3QgbGlrZWx5IGEgbGlidG9vbCBzY3JpcHQgd2UgYWN0dWFsbHkgd2FudCB0bworCSMgaW5zdGFsbAorCXN0cmlwcGVkX2V4dD0iIgorCWNhc2UgJGZpbGUgaW4KKwkgICouZXhlKQorCSAgICBpZiB0ZXN0ICEgLWYgIiRmaWxlIjsgdGhlbgorCSAgICAgIGZpbGU9YCRlY2hvICRmaWxlfCR7U0VEfSAncywuZXhlJCwsJ2AKKwkgICAgICBzdHJpcHBlZF9leHQ9Ii5leGUiCisJICAgIGZpCisJICAgIDs7CisJZXNhYworCisJIyBEbyBhIHRlc3QgdG8gc2VlIGlmIHRoaXMgaXMgcmVhbGx5IGEgbGlidG9vbCBwcm9ncmFtLgorCWNhc2UgJGhvc3QgaW4KKwkqY3lnd2luKnwqbWluZ3cqKQorCSAgICB3cmFwcGVyPWAkZWNobyAkZmlsZSB8ICR7U0VEfSAtZSAncywuZXhlJCwsJ2AKKwkgICAgOzsKKwkqKQorCSAgICB3cmFwcGVyPSRmaWxlCisJICAgIDs7CisJZXNhYworCWlmICgke1NFRH0gLWUgJzRxJyAkd3JhcHBlciB8IGdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIik+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgIG5vdGluc3RfZGVwbGlicz0KKwkgIHJlbGlua19jb21tYW5kPQorCisJICAjIE5vdGUgdGhhdCBpdCBpcyBub3QgbmVjZXNzYXJ5IG9uIGN5Z3dpbi9taW5ndyB0byBhcHBlbmQgYSBkb3QgdG8KKwkgICMgZm9vIGV2ZW4gaWYgYm90aCBmb28gYW5kIEZJTEUuZXhlIGV4aXN0OiBhdXRvbWF0aWMtYXBwZW5kLS5leGUKKwkgICMgYmVoYXZpb3IgaGFwcGVucyBvbmx5IGZvciBleGVjKDMpLCBub3QgZm9yIG9wZW4oMikhICBBbHNvLCBzb3VyY2luZworCSAgIyBgRklMRS4nIGRvZXMgbm90IHdvcmsgb24gY3lnd2luIG1hbmFnZWQgbW91bnRzLgorCSAgIworCSAgIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCisJICBjYXNlICR3cmFwcGVyIGluCisJICAqLyogfCAqXFwqKSAuICR7d3JhcHBlcn0gOzsKKwkgICopIC4gLi8ke3dyYXBwZXJ9IDs7CisJICBlc2FjCisKKwkgICMgQ2hlY2sgdGhlIHZhcmlhYmxlcyB0aGF0IHNob3VsZCBoYXZlIGJlZW4gc2V0LgorCSAgaWYgdGVzdCAteiAiJG5vdGluc3RfZGVwbGlicyI7IHRoZW4KKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogaW52YWxpZCBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0IFxgJHdyYXBwZXInIiAxPiYyCisJICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorCSAgZmkKKworCSAgZmluYWxpemU9eWVzCisJICBmb3IgbGliIGluICRub3RpbnN0X2RlcGxpYnM7IGRvCisJICAgICMgQ2hlY2sgdG8gc2VlIHRoYXQgZWFjaCBsaWJyYXJ5IGlzIGluc3RhbGxlZC4KKwkgICAgbGliZGlyPQorCSAgICBpZiB0ZXN0IC1mICIkbGliIjsgdGhlbgorCSAgICAgICMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgorCSAgICAgIGNhc2UgJGxpYiBpbgorCSAgICAgICovKiB8ICpcXCopIC4gJGxpYiA7OworCSAgICAgICopIC4gLi8kbGliIDs7CisJICAgICAgZXNhYworCSAgICBmaQorCSAgICBsaWJmaWxlPSIkbGliZGlyLyJgJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdzJV4uKi8lJWcnYCAjIyMgdGVzdHN1aXRlOiBza2lwIG5lc3RlZCBxdW90aW5nIHRlc3QKKwkgICAgaWYgdGVzdCAtbiAiJGxpYmRpciIgJiYgdGVzdCAhIC1mICIkbGliZmlsZSI7IHRoZW4KKwkgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYCRsaWInIGhhcyBub3QgYmVlbiBpbnN0YWxsZWQgaW4gXGAkbGliZGlyJyIgMT4mMgorCSAgICAgIGZpbmFsaXplPW5vCisJICAgIGZpCisJICBkb25lCisKKwkgIHJlbGlua19jb21tYW5kPQorCSAgIyBOb3RlIHRoYXQgaXQgaXMgbm90IG5lY2Vzc2FyeSBvbiBjeWd3aW4vbWluZ3cgdG8gYXBwZW5kIGEgZG90IHRvCisJICAjIGZvbyBldmVuIGlmIGJvdGggZm9vIGFuZCBGSUxFLmV4ZSBleGlzdDogYXV0b21hdGljLWFwcGVuZC0uZXhlCisJICAjIGJlaGF2aW9yIGhhcHBlbnMgb25seSBmb3IgZXhlYygzKSwgbm90IGZvciBvcGVuKDIpISAgQWxzbywgc291cmNpbmcKKwkgICMgYEZJTEUuJyBkb2VzIG5vdCB3b3JrIG9uIGN5Z3dpbiBtYW5hZ2VkIG1vdW50cy4KKwkgICMKKwkgICMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgorCSAgY2FzZSAkd3JhcHBlciBpbgorCSAgKi8qIHwgKlxcKikgLiAke3dyYXBwZXJ9IDs7CisJICAqKSAuIC4vJHt3cmFwcGVyfSA7OworCSAgZXNhYworCisJICBvdXRwdXRuYW1lPQorCSAgaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgPSBubyAmJiB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuCisJICAgIGlmIHRlc3QgIiRmaW5hbGl6ZSIgPSB5ZXMgJiYgdGVzdCAteiAiJHJ1biI7IHRoZW4KKwkgICAgICB0bXBkaXI9YGZ1bmNfbWt0ZW1wZGlyYAorCSAgICAgIGZpbGU9YCRlY2hvICJYJGZpbGUkc3RyaXBwZWRfZXh0IiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisJICAgICAgb3V0cHV0bmFtZT0iJHRtcGRpci8kZmlsZSIKKwkgICAgICAjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCisJICAgICAgcmVsaW5rX2NvbW1hbmQ9YCRlY2hvICJYJHJlbGlua19jb21tYW5kIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dG5hbWUiJyVnJ2AKKworCSAgICAgICRzaG93ICIkcmVsaW5rX2NvbW1hbmQiCisJICAgICAgaWYgJHJ1biBldmFsICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuIDoKKwkgICAgICBlbHNlCisJCSRlY2hvICIkbW9kZW5hbWU6IGVycm9yOiByZWxpbmsgXGAkZmlsZScgd2l0aCB0aGUgYWJvdmUgY29tbWFuZCBiZWZvcmUgaW5zdGFsbGluZyBpdCIgMT4mMgorCQkke3JtfXIgIiR0bXBkaXIiCisJCWNvbnRpbnVlCisJICAgICAgZmkKKwkgICAgICBmaWxlPSIkb3V0cHV0bmFtZSIKKwkgICAgZWxzZQorCSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNhbm5vdCByZWxpbmsgXGAkZmlsZSciIDE+JjIKKwkgICAgZmkKKwkgIGVsc2UKKwkgICAgIyBJbnN0YWxsIHRoZSBiaW5hcnkgdGhhdCB3ZSBjb21waWxlZCBlYXJsaWVyLgorCSAgICBmaWxlPWAkZWNobyAiWCRmaWxlJHN0cmlwcGVkX2V4dCIgfCAkWHNlZCAtZSAicyVcKFteL10qXCkkJSRvYmpkaXIvXDElImAKKwkgIGZpCisJZmkKKworCSMgcmVtb3ZlIC5leGUgc2luY2UgY3lnd2luIC91c3IvYmluL2luc3RhbGwgd2lsbCBhcHBlbmQgYW5vdGhlcgorCSMgb25lIGFueXdheSAKKwljYXNlICRpbnN0YWxsX3Byb2csJGhvc3QgaW4KKwkqL3Vzci9iaW4vaW5zdGFsbCosKmN5Z3dpbiopCisJICBjYXNlICRmaWxlOiRkZXN0ZmlsZSBpbgorCSAgKi5leGU6Ki5leGUpCisJICAgICMgdGhpcyBpcyBvaworCSAgICA7OworCSAgKi5leGU6KikKKwkgICAgZGVzdGZpbGU9JGRlc3RmaWxlLmV4ZQorCSAgICA7OworCSAgKjoqLmV4ZSkKKwkgICAgZGVzdGZpbGU9YCRlY2hvICRkZXN0ZmlsZSB8ICR7U0VEfSAtZSAncywuZXhlJCwsJ2AKKwkgICAgOzsKKwkgIGVzYWMKKwkgIDs7CisJZXNhYworCSRzaG93ICIkaW5zdGFsbF9wcm9nJHN0cmlwbWUgJGZpbGUgJGRlc3RmaWxlIgorCSRydW4gZXZhbCAiJGluc3RhbGxfcHJvZ1wkc3RyaXBtZSBcJGZpbGUgXCRkZXN0ZmlsZSIgfHwgZXhpdCAkPworCXRlc3QgLW4gIiRvdXRwdXRuYW1lIiAmJiAke3JtfXIgIiR0bXBkaXIiCisJOzsKKyAgICAgIGVzYWMKKyAgICBkb25lCisKKyAgICBmb3IgZmlsZSBpbiAkc3RhdGljbGliczsgZG8KKyAgICAgIG5hbWU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKworICAgICAgIyBTZXQgdXAgdGhlIHJhbmxpYiBwYXJhbWV0ZXJzLgorICAgICAgb2xkbGliPSIkZGVzdGRpci8kbmFtZSIKKworICAgICAgJHNob3cgIiRpbnN0YWxsX3Byb2cgJGZpbGUgJG9sZGxpYiIKKyAgICAgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyBcJGZpbGUgXCRvbGRsaWIiIHx8IGV4aXQgJD8KKworICAgICAgaWYgdGVzdCAtbiAiJHN0cmlwbWUiICYmIHRlc3QgLW4gIiRvbGRfc3RyaXBsaWIiOyB0aGVuCisJJHNob3cgIiRvbGRfc3RyaXBsaWIgJG9sZGxpYiIKKwkkcnVuIGV2YWwgIiRvbGRfc3RyaXBsaWIgJG9sZGxpYiIgfHwgZXhpdCAkPworICAgICAgZmkKKworICAgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIHBvc3RpbnN0YWxsIGNvbW1hbmRzLgorICAgICAgY21kcz0kb2xkX3Bvc3RpbnN0YWxsX2NtZHMKKyAgICAgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JworICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KKwlJRlM9IiRzYXZlX2lmcyIKKwlldmFsIGNtZD1cIiRjbWRcIgorCSRzaG93ICIkY21kIgorCSRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPworICAgICAgZG9uZQorICAgICAgSUZTPSIkc2F2ZV9pZnMiCisgICAgZG9uZQorCisgICAgaWYgdGVzdCAtbiAiJGZ1dHVyZV9saWJkaXJzIjsgdGhlbgorICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogcmVtZW1iZXIgdG8gcnVuIFxgJHByb2duYW1lIC0tZmluaXNoJGZ1dHVyZV9saWJkaXJzJyIgMT4mMgorICAgIGZpCisKKyAgICBpZiB0ZXN0IC1uICIkY3VycmVudF9saWJkaXJzIjsgdGhlbgorICAgICAgIyBNYXliZSBqdXN0IGRvIGEgZHJ5IHJ1bi4KKyAgICAgIHRlc3QgLW4gIiRydW4iICYmIGN1cnJlbnRfbGliZGlycz0iIC1uJGN1cnJlbnRfbGliZGlycyIKKyAgICAgIGV4ZWNfY21kPSckU0hFTEwgJHByb2dwYXRoICRwcmVzZXJ2ZV9hcmdzIC0tZmluaXNoJGN1cnJlbnRfbGliZGlycycKKyAgICBlbHNlCisgICAgICBleGl0ICRFWElUX1NVQ0NFU1MKKyAgICBmaQorICAgIDs7CisKKyAgIyBsaWJ0b29sIGZpbmlzaCBtb2RlCisgIGZpbmlzaCkKKyAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiBmaW5pc2giCisgICAgbGliZGlycz0iJG5vbm9wdCIKKyAgICBhZG1pbmNtZHM9CisKKyAgICBpZiB0ZXN0IC1uICIkZmluaXNoX2NtZHMkZmluaXNoX2V2YWwiICYmIHRlc3QgLW4gIiRsaWJkaXJzIjsgdGhlbgorICAgICAgZm9yIGRpcgorICAgICAgZG8KKwlsaWJkaXJzPSIkbGliZGlycyAkZGlyIgorICAgICAgZG9uZQorCisgICAgICBmb3IgbGliZGlyIGluICRsaWJkaXJzOyBkbworCWlmIHRlc3QgLW4gIiRmaW5pc2hfY21kcyI7IHRoZW4KKwkgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBmaW5pc2ggY29tbWFuZHMuCisJICBjbWRzPSRmaW5pc2hfY21kcworCSAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisJICBmb3IgY21kIGluICRjbWRzOyBkbworCSAgICBJRlM9IiRzYXZlX2lmcyIKKwkgICAgZXZhbCBjbWQ9XCIkY21kXCIKKwkgICAgJHNob3cgIiRjbWQiCisJICAgICRydW4gZXZhbCAiJGNtZCIgfHwgYWRtaW5jbWRzPSIkYWRtaW5jbWRzCisgICAgICAgJGNtZCIKKwkgIGRvbmUKKwkgIElGUz0iJHNhdmVfaWZzIgorCWZpCisJaWYgdGVzdCAtbiAiJGZpbmlzaF9ldmFsIjsgdGhlbgorCSAgIyBEbyB0aGUgc2luZ2xlIGZpbmlzaF9ldmFsLgorCSAgZXZhbCBjbWRzPVwiJGZpbmlzaF9ldmFsXCIKKwkgICRydW4gZXZhbCAiJGNtZHMiIHx8IGFkbWluY21kcz0iJGFkbWluY21kcworICAgICAgICRjbWRzIgorCWZpCisgICAgICBkb25lCisgICAgZmkKKworICAgICMgRXhpdCBoZXJlIGlmIHRoZXkgd2FudGVkIHNpbGVudCBtb2RlLgorICAgIHRlc3QgIiRzaG93IiA9IDogJiYgZXhpdCAkRVhJVF9TVUNDRVNTCisKKyAgICAkZWNobyAiWC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iIHwgJFhzZWQKKyAgICAkZWNobyAiTGlicmFyaWVzIGhhdmUgYmVlbiBpbnN0YWxsZWQgaW46IgorICAgIGZvciBsaWJkaXIgaW4gJGxpYmRpcnM7IGRvCisgICAgICAkZWNobyAiICAgJGxpYmRpciIKKyAgICBkb25lCisgICAgJGVjaG8KKyAgICAkZWNobyAiSWYgeW91IGV2ZXIgaGFwcGVuIHRvIHdhbnQgdG8gbGluayBhZ2FpbnN0IGluc3RhbGxlZCBsaWJyYXJpZXMiCisgICAgJGVjaG8gImluIGEgZ2l2ZW4gZGlyZWN0b3J5LCBMSUJESVIsIHlvdSBtdXN0IGVpdGhlciB1c2UgbGlidG9vbCwgYW5kIgorICAgICRlY2hvICJzcGVjaWZ5IHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBsaWJyYXJ5LCBvciB1c2UgdGhlIFxgLUxMSUJESVInIgorICAgICRlY2hvICJmbGFnIGR1cmluZyBsaW5raW5nIGFuZCBkbyBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZzoiCisgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCisgICAgICAkZWNobyAiICAgLSBhZGQgTElCRElSIHRvIHRoZSBcYCRzaGxpYnBhdGhfdmFyJyBlbnZpcm9ubWVudCB2YXJpYWJsZSIKKyAgICAgICRlY2hvICIgICAgIGR1cmluZyBleGVjdXRpb24iCisgICAgZmkKKyAgICBpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCisgICAgICAkZWNobyAiICAgLSBhZGQgTElCRElSIHRvIHRoZSBcYCRydW5wYXRoX3ZhcicgZW52aXJvbm1lbnQgdmFyaWFibGUiCisgICAgICAkZWNobyAiICAgICBkdXJpbmcgbGlua2luZyIKKyAgICBmaQorICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgorICAgICAgbGliZGlyPUxJQkRJUgorICAgICAgZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgorCisgICAgICAkZWNobyAiICAgLSB1c2UgdGhlIFxgJGZsYWcnIGxpbmtlciBmbGFnIgorICAgIGZpCisgICAgaWYgdGVzdCAtbiAiJGFkbWluY21kcyI7IHRoZW4KKyAgICAgICRlY2hvICIgICAtIGhhdmUgeW91ciBzeXN0ZW0gYWRtaW5pc3RyYXRvciBydW4gdGhlc2UgY29tbWFuZHM6JGFkbWluY21kcyIKKyAgICBmaQorICAgIGlmIHRlc3QgLWYgL2V0Yy9sZC5zby5jb25mOyB0aGVuCisgICAgICAkZWNobyAiICAgLSBoYXZlIHlvdXIgc3lzdGVtIGFkbWluaXN0cmF0b3IgYWRkIExJQkRJUiB0byBcYC9ldGMvbGQuc28uY29uZiciCisgICAgZmkKKyAgICAkZWNobworICAgICRlY2hvICJTZWUgYW55IG9wZXJhdGluZyBzeXN0ZW0gZG9jdW1lbnRhdGlvbiBhYm91dCBzaGFyZWQgbGlicmFyaWVzIGZvciIKKyAgICAkZWNobyAibW9yZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyB0aGUgbGQoMSkgYW5kIGxkLnNvKDgpIG1hbnVhbCBwYWdlcy4iCisgICAgJGVjaG8gIlgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiB8ICRYc2VkCisgICAgZXhpdCAkRVhJVF9TVUNDRVNTCisgICAgOzsKKworICAjIGxpYnRvb2wgZXhlY3V0ZSBtb2RlCisgIGV4ZWN1dGUpCisgICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogZXhlY3V0ZSIKKworICAgICMgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBjb21tYW5kIG5hbWUuCisgICAgY21kPSIkbm9ub3B0IgorICAgIGlmIHRlc3QgLXogIiRjbWQiOyB0aGVuCisgICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgQ09NTUFORCIgMT4mMgorICAgICAgJGVjaG8gIiRoZWxwIgorICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisgICAgZmkKKworICAgICMgSGFuZGxlIC1kbG9wZW4gZmxhZ3MgaW1tZWRpYXRlbHkuCisgICAgZm9yIGZpbGUgaW4gJGV4ZWN1dGVfZGxmaWxlczsgZG8KKyAgICAgIGlmIHRlc3QgISAtZiAiJGZpbGUiOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogXGAkZmlsZScgaXMgbm90IGEgZmlsZSIgMT4mMgorCSRlY2hvICIkaGVscCIgMT4mMgorCWV4aXQgJEVYSVRfRkFJTFVSRQorICAgICAgZmkKKworICAgICAgZGlyPQorICAgICAgY2FzZSAkZmlsZSBpbgorICAgICAgKi5sYSkKKwkjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBhcmNoaXZlLgorCWlmICgke1NFRH0gLWUgJzJxJyAkZmlsZSB8IGdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKwllbHNlCisJICAkZWNobyAiJG1vZGVuYW1lOiBcYCRsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgorCSAgJGVjaG8gIiRoZWxwIiAxPiYyCisJICBleGl0ICRFWElUX0ZBSUxVUkUKKwlmaQorCisJIyBSZWFkIHRoZSBsaWJ0b29sIGxpYnJhcnkuCisJZGxuYW1lPQorCWxpYnJhcnlfbmFtZXM9CisKKwkjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KKwljYXNlICRmaWxlIGluCisJKi8qIHwgKlxcKikgLiAkZmlsZSA7OworCSopIC4gLi8kZmlsZSA7OworCWVzYWMKKworCSMgU2tpcCB0aGlzIGxpYnJhcnkgaWYgaXQgY2Fubm90IGJlIGRsb3BlbmVkLgorCWlmIHRlc3QgLXogIiRkbG5hbWUiOyB0aGVuCisJICAjIFdhcm4gaWYgaXQgd2FzIGEgc2hhcmVkIGxpYnJhcnkuCisJICB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyIgJiYgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAkZmlsZScgd2FzIG5vdCBsaW5rZWQgd2l0aCBcYC1leHBvcnQtZHluYW1pYyciCisJICBjb250aW51ZQorCWZpCisKKwlkaXI9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKKwl0ZXN0ICJYJGRpciIgPSAiWCRmaWxlIiAmJiBkaXI9LgorCisJaWYgdGVzdCAtZiAiJGRpci8kb2JqZGlyLyRkbG5hbWUiOyB0aGVuCisJICBkaXI9IiRkaXIvJG9iamRpciIKKwllbHNlCisJICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZmluZCBcYCRkbG5hbWUnIGluIFxgJGRpcicgb3IgXGAkZGlyLyRvYmpkaXInIiAxPiYyCisJICBleGl0ICRFWElUX0ZBSUxVUkUKKwlmaQorCTs7CisKKyAgICAgICoubG8pCisJIyBKdXN0IGFkZCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIC5sbyBmaWxlLgorCWRpcj1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAorCXRlc3QgIlgkZGlyIiA9ICJYJGZpbGUiICYmIGRpcj0uCisJOzsKKworICAgICAgKikKKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nIFxgLWRsb3BlbicgaXMgaWdub3JlZCBmb3Igbm9uLWxpYnRvb2wgbGlicmFyaWVzIGFuZCBvYmplY3RzIiAxPiYyCisJY29udGludWUKKwk7OworICAgICAgZXNhYworCisgICAgICAjIEdldCB0aGUgYWJzb2x1dGUgcGF0aG5hbWUuCisgICAgICBhYnNkaXI9YGNkICIkZGlyIiAmJiBwd2RgCisgICAgICB0ZXN0IC1uICIkYWJzZGlyIiAmJiBkaXI9IiRhYnNkaXIiCisKKyAgICAgICMgTm93IGFkZCB0aGUgZGlyZWN0b3J5IHRvIHNobGlicGF0aF92YXIuCisgICAgICBpZiBldmFsICJ0ZXN0IC16IFwiXCQkc2hsaWJwYXRoX3ZhclwiIjsgdGhlbgorCWV2YWwgIiRzaGxpYnBhdGhfdmFyPVwiXCRkaXJcIiIKKyAgICAgIGVsc2UKKwlldmFsICIkc2hsaWJwYXRoX3Zhcj1cIlwkZGlyOlwkJHNobGlicGF0aF92YXJcIiIKKyAgICAgIGZpCisgICAgZG9uZQorCisgICAgIyBUaGlzIHZhcmlhYmxlIHRlbGxzIHdyYXBwZXIgc2NyaXB0cyBqdXN0IHRvIHNldCBzaGxpYnBhdGhfdmFyCisgICAgIyByYXRoZXIgdGhhbiBydW5uaW5nIHRoZWlyIHByb2dyYW1zLgorICAgIGxpYnRvb2xfZXhlY3V0ZV9tYWdpYz0iJG1hZ2ljIgorCisgICAgIyBDaGVjayBpZiBhbnkgb2YgdGhlIGFyZ3VtZW50cyBpcyBhIHdyYXBwZXIgc2NyaXB0LgorICAgIGFyZ3M9CisgICAgZm9yIGZpbGUKKyAgICBkbworICAgICAgY2FzZSAkZmlsZSBpbgorICAgICAgLSopIDs7CisgICAgICAqKQorCSMgRG8gYSB0ZXN0IHRvIHNlZSBpZiB0aGlzIGlzIHJlYWxseSBhIGxpYnRvb2wgcHJvZ3JhbS4KKwlpZiAoJHtTRUR9IC1lICc0cScgJGZpbGUgfCBncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCisJICBjYXNlICRmaWxlIGluCisJICAqLyogfCAqXFwqKSAuICRmaWxlIDs7CisJICAqKSAuIC4vJGZpbGUgOzsKKwkgIGVzYWMKKworCSAgIyBUcmFuc2Zvcm0gYXJnIHRvIHdyYXBwZWQgbmFtZS4KKwkgIGZpbGU9IiRwcm9nZGlyLyRwcm9ncmFtIgorCWZpCisJOzsKKyAgICAgIGVzYWMKKyAgICAgICMgUXVvdGUgYXJndW1lbnRzICh0byBwcmVzZXJ2ZSBzaGVsbCBtZXRhY2hhcmFjdGVycykuCisgICAgICBmaWxlPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKyAgICAgIGFyZ3M9IiRhcmdzIFwiJGZpbGVcIiIKKyAgICBkb25lCisKKyAgICBpZiB0ZXN0IC16ICIkcnVuIjsgdGhlbgorICAgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCisJIyBFeHBvcnQgdGhlIHNobGlicGF0aF92YXIuCisJZXZhbCAiZXhwb3J0ICRzaGxpYnBhdGhfdmFyIgorICAgICAgZmkKKworICAgICAgIyBSZXN0b3JlIHNhdmVkIGVudmlyb25tZW50IHZhcmlhYmxlcworICAgICAgaWYgdGVzdCAiJHtzYXZlX0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbgorCUxDX0FMTD0iJHNhdmVfTENfQUxMIjsgZXhwb3J0IExDX0FMTAorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiR7c2F2ZV9MQU5HK3NldH0iID0gc2V0OyB0aGVuCisJTEFORz0iJHNhdmVfTEFORyI7IGV4cG9ydCBMQU5HCisgICAgICBmaQorCisgICAgICAjIE5vdyBwcmVwYXJlIHRvIGFjdHVhbGx5IGV4ZWMgdGhlIGNvbW1hbmQuCisgICAgICBleGVjX2NtZD0iXCRjbWQkYXJncyIKKyAgICBlbHNlCisgICAgICAjIERpc3BsYXkgd2hhdCB3b3VsZCBiZSBkb25lLgorICAgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCisJZXZhbCAiXCRlY2hvIFwiXCRzaGxpYnBhdGhfdmFyPVwkJHNobGlicGF0aF92YXJcIiIKKwkkZWNobyAiZXhwb3J0ICRzaGxpYnBhdGhfdmFyIgorICAgICAgZmkKKyAgICAgICRlY2hvICIkY21kJGFyZ3MiCisgICAgICBleGl0ICRFWElUX1NVQ0NFU1MKKyAgICBmaQorICAgIDs7CisKKyAgIyBsaWJ0b29sIGNsZWFuIGFuZCB1bmluc3RhbGwgbW9kZQorICBjbGVhbiB8IHVuaW5zdGFsbCkKKyAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiAkbW9kZSIKKyAgICBybT0iJG5vbm9wdCIKKyAgICBmaWxlcz0KKyAgICBybWZvcmNlPQorICAgIGV4aXRfc3RhdHVzPTAKKworICAgICMgVGhpcyB2YXJpYWJsZSB0ZWxscyB3cmFwcGVyIHNjcmlwdHMganVzdCB0byBzZXQgdmFyaWFibGVzIHJhdGhlcgorICAgICMgdGhhbiBydW5uaW5nIHRoZWlyIHByb2dyYW1zLgorICAgIGxpYnRvb2xfaW5zdGFsbF9tYWdpYz0iJG1hZ2ljIgorCisgICAgZm9yIGFyZworICAgIGRvCisgICAgICBjYXNlICRhcmcgaW4KKyAgICAgIC1mKSBybT0iJHJtICRhcmciOyBybWZvcmNlPXllcyA7OworICAgICAgLSopIHJtPSIkcm0gJGFyZyIgOzsKKyAgICAgICopIGZpbGVzPSIkZmlsZXMgJGFyZyIgOzsKKyAgICAgIGVzYWMKKyAgICBkb25lCisKKyAgICBpZiB0ZXN0IC16ICIkcm0iOyB0aGVuCisgICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGFuIFJNIHByb2dyYW0iIDE+JjIKKyAgICAgICRlY2hvICIkaGVscCIgMT4mMgorICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisgICAgZmkKKworICAgIHJtZGlycz0KKworICAgIG9yaWdvYmpkaXI9IiRvYmpkaXIiCisgICAgZm9yIGZpbGUgaW4gJGZpbGVzOyBkbworICAgICAgZGlyPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCisgICAgICBpZiB0ZXN0ICJYJGRpciIgPSAiWCRmaWxlIjsgdGhlbgorCWRpcj0uCisJb2JqZGlyPSIkb3JpZ29iamRpciIKKyAgICAgIGVsc2UKKwlvYmpkaXI9IiRkaXIvJG9yaWdvYmpkaXIiCisgICAgICBmaQorICAgICAgbmFtZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorICAgICAgdGVzdCAiJG1vZGUiID0gdW5pbnN0YWxsICYmIG9iamRpcj0iJGRpciIKKworICAgICAgIyBSZW1lbWJlciBvYmpkaXIgZm9yIHJlbW92YWwgbGF0ZXIsIGJlaW5nIGNhcmVmdWwgdG8gYXZvaWQgZHVwbGljYXRlcworICAgICAgaWYgdGVzdCAiJG1vZGUiID0gY2xlYW47IHRoZW4KKwljYXNlICIgJHJtZGlycyAiIGluCisJICAqIiAkb2JqZGlyICIqKSA7OworCSAgKikgcm1kaXJzPSIkcm1kaXJzICRvYmpkaXIiIDs7CisJZXNhYworICAgICAgZmkKKworICAgICAgIyBEb24ndCBlcnJvciBpZiB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0IGFuZCBybSAtZiB3YXMgdXNlZC4KKyAgICAgIGlmICh0ZXN0IC1MICIkZmlsZSIpID4vZGV2L251bGwgMj4mMSBcCisJfHwgKHRlc3QgLWggIiRmaWxlIikgPi9kZXYvbnVsbCAyPiYxIFwKKwl8fCB0ZXN0IC1mICIkZmlsZSI7IHRoZW4KKwk6CisgICAgICBlbGlmIHRlc3QgLWQgIiRmaWxlIjsgdGhlbgorCWV4aXRfc3RhdHVzPTEKKwljb250aW51ZQorICAgICAgZWxpZiB0ZXN0ICIkcm1mb3JjZSIgPSB5ZXM7IHRoZW4KKwljb250aW51ZQorICAgICAgZmkKKworICAgICAgcm1maWxlcz0iJGZpbGUiCisKKyAgICAgIGNhc2UgJG5hbWUgaW4KKyAgICAgICoubGEpCisJIyBQb3NzaWJseSBhIGxpYnRvb2wgYXJjaGl2ZSwgc28gdmVyaWZ5IGl0LgorCWlmICgke1NFRH0gLWUgJzJxJyAkZmlsZSB8IGdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAuICRkaXIvJG5hbWUKKworCSAgIyBEZWxldGUgdGhlIGxpYnRvb2wgbGlicmFyaWVzIGFuZCBzeW1saW5rcy4KKwkgIGZvciBuIGluICRsaWJyYXJ5X25hbWVzOyBkbworCSAgICBybWZpbGVzPSIkcm1maWxlcyAkb2JqZGlyLyRuIgorCSAgZG9uZQorCSAgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBybWZpbGVzPSIkcm1maWxlcyAkb2JqZGlyLyRvbGRfbGlicmFyeSIKKworCSAgY2FzZSAiJG1vZGUiIGluCisJICBjbGVhbikKKwkgICAgY2FzZSAiICAkbGlicmFyeV9uYW1lcyAiIGluCisJICAgICMgIiAgIiBpbiB0aGUgYmVnaW5uaW5nIGNhdGNoZXMgZW1wdHkgJGRsbmFtZQorCSAgICAqIiAkZGxuYW1lICIqKSA7OworCSAgICAqKSBybWZpbGVzPSIkcm1maWxlcyAkb2JqZGlyLyRkbG5hbWUiIDs7CisJICAgIGVzYWMKKwkgICAgIHRlc3QgLW4gIiRsaWJkaXIiICYmIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvJG5hbWUgJG9iamRpci8ke25hbWV9aSIKKwkgICAgOzsKKwkgIHVuaW5zdGFsbCkKKwkgICAgaWYgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiOyB0aGVuCisJICAgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIHBvc3R1bmluc3RhbGwgY29tbWFuZHMuCisJICAgICAgY21kcz0kcG9zdHVuaW5zdGFsbF9jbWRzCisJICAgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisJICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KKwkJSUZTPSIkc2F2ZV9pZnMiCisJCWV2YWwgY21kPVwiJGNtZFwiCisJCSRzaG93ICIkY21kIgorCQkkcnVuIGV2YWwgIiRjbWQiCisJCWlmIHRlc3QgIiQ/IiAtbmUgMCAmJiB0ZXN0ICIkcm1mb3JjZSIgIT0geWVzOyB0aGVuCisJCSAgZXhpdF9zdGF0dXM9MQorCQlmaQorCSAgICAgIGRvbmUKKwkgICAgICBJRlM9IiRzYXZlX2lmcyIKKwkgICAgZmkKKworCSAgICBpZiB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiOyB0aGVuCisJICAgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIG9sZF9wb3N0dW5pbnN0YWxsIGNvbW1hbmRzLgorCSAgICAgIGNtZHM9JG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMKKwkgICAgICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKKwkgICAgICBmb3IgY21kIGluICRjbWRzOyBkbworCQlJRlM9IiRzYXZlX2lmcyIKKwkJZXZhbCBjbWQ9XCIkY21kXCIKKwkJJHNob3cgIiRjbWQiCisJCSRydW4gZXZhbCAiJGNtZCIKKwkJaWYgdGVzdCAiJD8iIC1uZSAwICYmIHRlc3QgIiRybWZvcmNlIiAhPSB5ZXM7IHRoZW4KKwkJICBleGl0X3N0YXR1cz0xCisJCWZpCisJICAgICAgZG9uZQorCSAgICAgIElGUz0iJHNhdmVfaWZzIgorCSAgICBmaQorCSAgICAjIEZJWE1FOiBzaG91bGQgcmVpbnN0YWxsIHRoZSBiZXN0IHJlbWFpbmluZyBzaGFyZWQgbGlicmFyeS4KKwkgICAgOzsKKwkgIGVzYWMKKwlmaQorCTs7CisKKyAgICAgICoubG8pCisJIyBQb3NzaWJseSBhIGxpYnRvb2wgb2JqZWN0LCBzbyB2ZXJpZnkgaXQuCisJaWYgKCR7U0VEfSAtZSAnMnEnICRmaWxlIHwgZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKworCSAgIyBSZWFkIHRoZSAubG8gZmlsZQorCSAgLiAkZGlyLyRuYW1lCisKKwkgICMgQWRkIFBJQyBvYmplY3QgdG8gdGhlIGxpc3Qgb2YgZmlsZXMgdG8gcmVtb3ZlLgorCSAgaWYgdGVzdCAtbiAiJHBpY19vYmplY3QiIFwKKwkgICAgICYmIHRlc3QgIiRwaWNfb2JqZWN0IiAhPSBub25lOyB0aGVuCisJICAgIHJtZmlsZXM9IiRybWZpbGVzICRkaXIvJHBpY19vYmplY3QiCisJICBmaQorCisJICAjIEFkZCBub24tUElDIG9iamVjdCB0byB0aGUgbGlzdCBvZiBmaWxlcyB0byByZW1vdmUuCisJICBpZiB0ZXN0IC1uICIkbm9uX3BpY19vYmplY3QiIFwKKwkgICAgICYmIHRlc3QgIiRub25fcGljX29iamVjdCIgIT0gbm9uZTsgdGhlbgorCSAgICBybWZpbGVzPSIkcm1maWxlcyAkZGlyLyRub25fcGljX29iamVjdCIKKwkgIGZpCisJZmkKKwk7OworCisgICAgICAqKQorCWlmIHRlc3QgIiRtb2RlIiA9IGNsZWFuIDsgdGhlbgorCSAgbm9leGVuYW1lPSRuYW1lCisJICBjYXNlICRmaWxlIGluCisJICAqLmV4ZSkKKwkgICAgZmlsZT1gJGVjaG8gJGZpbGV8JHtTRUR9ICdzLC5leGUkLCwnYAorCSAgICBub2V4ZW5hbWU9YCRlY2hvICRuYW1lfCR7U0VEfSAncywuZXhlJCwsJ2AKKwkgICAgIyAkZmlsZSB3aXRoIC5leGUgaGFzIGFscmVhZHkgYmVlbiBhZGRlZCB0byBybWZpbGVzLAorCSAgICAjIGFkZCAkZmlsZSB3aXRob3V0IC5leGUKKwkgICAgcm1maWxlcz0iJHJtZmlsZXMgJGZpbGUiCisJICAgIDs7CisJICBlc2FjCisJICAjIERvIGEgdGVzdCB0byBzZWUgaWYgdGhpcyBpcyBhIGxpYnRvb2wgcHJvZ3JhbS4KKwkgIGlmICgke1NFRH0gLWUgJzRxJyAkZmlsZSB8IGdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAgIHJlbGlua19jb21tYW5kPQorCSAgICAuICRkaXIvJG5vZXhlbmFtZQorCisJICAgICMgbm90ZSAkbmFtZSBzdGlsbCBjb250YWlucyAuZXhlIGlmIGl0IHdhcyBpbiAkZmlsZSBvcmlnaW5hbGx5CisJICAgICMgYXMgZG9lcyB0aGUgdmVyc2lvbiBvZiAkZmlsZSB0aGF0IHdhcyBhZGRlZCBpbnRvICRybWZpbGVzCisJICAgIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvJG5hbWUgJG9iamRpci8ke25hbWV9Uy4ke29iamV4dH0iCisJICAgIGlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0geWVzICYmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KKwkgICAgICBybWZpbGVzPSIkcm1maWxlcyAkb2JqZGlyL2x0LSRuYW1lIgorCSAgICBmaQorCSAgICBpZiB0ZXN0ICJYJG5vZXhlbmFtZSIgIT0gIlgkbmFtZSIgOyB0aGVuCisJICAgICAgcm1maWxlcz0iJHJtZmlsZXMgJG9iamRpci9sdC0ke25vZXhlbmFtZX0uYyIKKwkgICAgZmkKKwkgIGZpCisJZmkKKwk7OworICAgICAgZXNhYworICAgICAgJHNob3cgIiRybSAkcm1maWxlcyIKKyAgICAgICRydW4gJHJtICRybWZpbGVzIHx8IGV4aXRfc3RhdHVzPTEKKyAgICBkb25lCisgICAgb2JqZGlyPSIkb3JpZ29iamRpciIKKworICAgICMgVHJ5IHRvIHJlbW92ZSB0aGUgJHtvYmpkaXJ9cyBpbiB0aGUgZGlyZWN0b3JpZXMgd2hlcmUgd2UgZGVsZXRlZCBmaWxlcworICAgIGZvciBkaXIgaW4gJHJtZGlyczsgZG8KKyAgICAgIGlmIHRlc3QgLWQgIiRkaXIiOyB0aGVuCisJJHNob3cgInJtZGlyICRkaXIiCisJJHJ1biBybWRpciAkZGlyID4vZGV2L251bGwgMj4mMQorICAgICAgZmkKKyAgICBkb25lCisKKyAgICBleGl0ICRleGl0X3N0YXR1cworICAgIDs7CisKKyAgIiIpCisgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIE1PREUiIDE+JjIKKyAgICAkZWNobyAiJGdlbmVyaWNfaGVscCIgMT4mMgorICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorICAgIDs7CisgIGVzYWMKKworICBpZiB0ZXN0IC16ICIkZXhlY19jbWQiOyB0aGVuCisgICAgJGVjaG8gIiRtb2RlbmFtZTogaW52YWxpZCBvcGVyYXRpb24gbW9kZSBcYCRtb2RlJyIgMT4mMgorICAgICRlY2hvICIkZ2VuZXJpY19oZWxwIiAxPiYyCisgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisgIGZpCitmaSAjIHRlc3QgLXogIiRzaG93X2hlbHAiCisKK2lmIHRlc3QgLW4gIiRleGVjX2NtZCI7IHRoZW4KKyAgZXZhbCBleGVjICRleGVjX2NtZAorICBleGl0ICRFWElUX0ZBSUxVUkUKK2ZpCisKKyMgV2UgbmVlZCB0byBkaXNwbGF5IGhlbHAgZm9yIGVhY2ggb2YgdGhlIG1vZGVzLgorY2FzZSAkbW9kZSBpbgorIiIpICRlY2hvIFwKKyJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIFtNT0RFLUFSR10uLi4KKworUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCisKKyAgICAtLWNvbmZpZyAgICAgICAgICBzaG93IGFsbCBjb25maWd1cmF0aW9uIHZhcmlhYmxlcworICAgIC0tZGVidWcgICAgICAgICAgIGVuYWJsZSB2ZXJib3NlIHNoZWxsIHRyYWNpbmcKKy1uLCAtLWRyeS1ydW4gICAgICAgICBkaXNwbGF5IGNvbW1hbmRzIHdpdGhvdXQgbW9kaWZ5aW5nIGFueSBmaWxlcworICAgIC0tZmVhdHVyZXMgICAgICAgIGRpc3BsYXkgYmFzaWMgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAorICAgIC0tZmluaXNoICAgICAgICAgIHNhbWUgYXMgXGAtLW1vZGU9ZmluaXNoJworICAgIC0taGVscCAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgICAtLW1vZGU9TU9ERSAgICAgICB1c2Ugb3BlcmF0aW9uIG1vZGUgTU9ERSBbZGVmYXVsdD1pbmZlcnJlZCBmcm9tIE1PREUtQVJHU10KKyAgICAtLXF1aWV0ICAgICAgICAgICBzYW1lIGFzIFxgLS1zaWxlbnQnCisgICAgLS1zaWxlbnQgICAgICAgICAgZG9uJ3QgcHJpbnQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcworICAgIC0tdGFnPVRBRyAgICAgICAgIHVzZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmcm9tIHRhZyBUQUcKKyAgICAtLXZlcnNpb24gICAgICAgICBwcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uCisKK01PREUgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgICAgY2xlYW4gICAgICAgICAgIHJlbW92ZSBmaWxlcyBmcm9tIHRoZSBidWlsZCBkaXJlY3RvcnkKKyAgICAgIGNvbXBpbGUgICAgICAgICBjb21waWxlIGEgc291cmNlIGZpbGUgaW50byBhIGxpYnRvb2wgb2JqZWN0CisgICAgICBleGVjdXRlICAgICAgICAgYXV0b21hdGljYWxseSBzZXQgbGlicmFyeSBwYXRoLCB0aGVuIHJ1biBhIHByb2dyYW0KKyAgICAgIGZpbmlzaCAgICAgICAgICBjb21wbGV0ZSB0aGUgaW5zdGFsbGF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzCisgICAgICBpbnN0YWxsICAgICAgICAgaW5zdGFsbCBsaWJyYXJpZXMgb3IgZXhlY3V0YWJsZXMKKyAgICAgIGxpbmsgICAgICAgICAgICBjcmVhdGUgYSBsaWJyYXJ5IG9yIGFuIGV4ZWN1dGFibGUKKyAgICAgIHVuaW5zdGFsbCAgICAgICByZW1vdmUgbGlicmFyaWVzIGZyb20gYW4gaW5zdGFsbGVkIGRpcmVjdG9yeQorCitNT0RFLUFSR1MgdmFyeSBkZXBlbmRpbmcgb24gdGhlIE1PREUuICBUcnkgXGAkbW9kZW5hbWUgLS1oZWxwIC0tbW9kZT1NT0RFJyBmb3IKK2EgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBNT0RFLgorCitSZXBvcnQgYnVncyB0byA8YnVnLWxpYnRvb2xAZ251Lm9yZz4uIgorICBleGl0ICRFWElUX1NVQ0NFU1MKKyAgOzsKKworY2xlYW4pCisgICRlY2hvIFwKKyJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1jbGVhbiBSTSBbUk0tT1BUSU9OXS4uLiBGSUxFLi4uCisKK1JlbW92ZSBmaWxlcyBmcm9tIHRoZSBidWlsZCBkaXJlY3RvcnkuCisKK1JNIGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIHRvIHVzZSB0byBkZWxldGUgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggRklMRQorKHR5cGljYWxseSBcYC9iaW4vcm0nKS4gIFJNLU9QVElPTlMgYXJlIG9wdGlvbnMgKHN1Y2ggYXMgXGAtZicpIHRvIGJlIHBhc3NlZAordG8gUk0uCisKK0lmIEZJTEUgaXMgYSBsaWJ0b29sIGxpYnJhcnksIG9iamVjdCBvciBwcm9ncmFtLCBhbGwgdGhlIGZpbGVzIGFzc29jaWF0ZWQKK3dpdGggaXQgYXJlIGRlbGV0ZWQuIE90aGVyd2lzZSwgb25seSBGSUxFIGl0c2VsZiBpcyBkZWxldGVkIHVzaW5nIFJNLiIKKyAgOzsKKworY29tcGlsZSkKKyAgJGVjaG8gXAorIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWNvbXBpbGUgQ09NUElMRS1DT01NQU5ELi4uIFNPVVJDRUZJTEUKKworQ29tcGlsZSBhIHNvdXJjZSBmaWxlIGludG8gYSBsaWJ0b29sIGxpYnJhcnkgb2JqZWN0LgorCitUaGlzIG1vZGUgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgb3B0aW9uczoKKworICAtbyBPVVRQVVQtRklMRSAgICBzZXQgdGhlIG91dHB1dCBmaWxlIG5hbWUgdG8gT1VUUFVULUZJTEUKKyAgLXByZWZlci1waWMgICAgICAgdHJ5IHRvIGJ1aWxkaW5nIFBJQyBvYmplY3RzIG9ubHkKKyAgLXByZWZlci1ub24tcGljICAgdHJ5IHRvIGJ1aWxkaW5nIG5vbi1QSUMgb2JqZWN0cyBvbmx5CisgIC1zdGF0aWMgICAgICAgICAgIGFsd2F5cyBidWlsZCBhIFxgLm8nIGZpbGUgc3VpdGFibGUgZm9yIHN0YXRpYyBsaW5raW5nCisKK0NPTVBJTEUtQ09NTUFORCBpcyBhIGNvbW1hbmQgdG8gYmUgdXNlZCBpbiBjcmVhdGluZyBhIFxgc3RhbmRhcmQnIG9iamVjdCBmaWxlCitmcm9tIHRoZSBnaXZlbiBTT1VSQ0VGSUxFLgorCitUaGUgb3V0cHV0IGZpbGUgbmFtZSBpcyBkZXRlcm1pbmVkIGJ5IHJlbW92aW5nIHRoZSBkaXJlY3RvcnkgY29tcG9uZW50IGZyb20KK1NPVVJDRUZJTEUsIHRoZW4gc3Vic3RpdHV0aW5nIHRoZSBDIHNvdXJjZSBjb2RlIHN1ZmZpeCBcYC5jJyB3aXRoIHRoZQorbGlicmFyeSBvYmplY3Qgc3VmZml4LCBcYC5sbycuIgorICA7OworCitleGVjdXRlKQorICAkZWNobyBcCisiVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9ZXhlY3V0ZSBDT01NQU5EIFtBUkdTXS4uLgorCitBdXRvbWF0aWNhbGx5IHNldCBsaWJyYXJ5IHBhdGgsIHRoZW4gcnVuIGEgcHJvZ3JhbS4KKworVGhpcyBtb2RlIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIG9wdGlvbnM6CisKKyAgLWRsb3BlbiBGSUxFICAgICAgYWRkIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBGSUxFIHRvIHRoZSBsaWJyYXJ5IHBhdGgKKworVGhpcyBtb2RlIHNldHMgdGhlIGxpYnJhcnkgcGF0aCBlbnZpcm9ubWVudCB2YXJpYWJsZSBhY2NvcmRpbmcgdG8gXGAtZGxvcGVuJworZmxhZ3MuCisKK0lmIGFueSBvZiB0aGUgQVJHUyBhcmUgbGlidG9vbCBleGVjdXRhYmxlIHdyYXBwZXJzLCB0aGVuIHRoZXkgYXJlIHRyYW5zbGF0ZWQKK2ludG8gdGhlaXIgY29ycmVzcG9uZGluZyB1bmluc3RhbGxlZCBiaW5hcnksIGFuZCBhbnkgb2YgdGhlaXIgcmVxdWlyZWQgbGlicmFyeQorZGlyZWN0b3JpZXMgYXJlIGFkZGVkIHRvIHRoZSBsaWJyYXJ5IHBhdGguCisKK1RoZW4sIENPTU1BTkQgaXMgZXhlY3V0ZWQsIHdpdGggQVJHUyBhcyBhcmd1bWVudHMuIgorICA7OworCitmaW5pc2gpCisgICRlY2hvIFwKKyJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1maW5pc2ggW0xJQkRJUl0uLi4KKworQ29tcGxldGUgdGhlIGluc3RhbGxhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcy4KKworRWFjaCBMSUJESVIgaXMgYSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyBsaWJ0b29sIGxpYnJhcmllcy4KKworVGhlIGNvbW1hbmRzIHRoYXQgdGhpcyBtb2RlIGV4ZWN1dGVzIG1heSByZXF1aXJlIHN1cGVydXNlciBwcml2aWxlZ2VzLiAgVXNlCit0aGUgXGAtLWRyeS1ydW4nIG9wdGlvbiBpZiB5b3UganVzdCB3YW50IHRvIHNlZSB3aGF0IHdvdWxkIGJlIGV4ZWN1dGVkLiIKKyAgOzsKKworaW5zdGFsbCkKKyAgJGVjaG8gXAorIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWluc3RhbGwgSU5TVEFMTC1DT01NQU5ELi4uCisKK0luc3RhbGwgZXhlY3V0YWJsZXMgb3IgbGlicmFyaWVzLgorCitJTlNUQUxMLUNPTU1BTkQgaXMgdGhlIGluc3RhbGxhdGlvbiBjb21tYW5kLiAgVGhlIGZpcnN0IGNvbXBvbmVudCBzaG91bGQgYmUKK2VpdGhlciB0aGUgXGBpbnN0YWxsJyBvciBcYGNwJyBwcm9ncmFtLgorCitUaGUgcmVzdCBvZiB0aGUgY29tcG9uZW50cyBhcmUgaW50ZXJwcmV0ZWQgYXMgYXJndW1lbnRzIHRvIHRoYXQgY29tbWFuZCAob25seQorQlNELWNvbXBhdGlibGUgaW5zdGFsbCBvcHRpb25zIGFyZSByZWNvZ25pemVkKS4iCisgIDs7CisKK2xpbmspCisgICRlY2hvIFwKKyJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1saW5rIExJTkstQ09NTUFORC4uLgorCitMaW5rIG9iamVjdCBmaWxlcyBvciBsaWJyYXJpZXMgdG9nZXRoZXIgdG8gZm9ybSBhbm90aGVyIGxpYnJhcnksIG9yIHRvCitjcmVhdGUgYW4gZXhlY3V0YWJsZSBwcm9ncmFtLgorCitMSU5LLUNPTU1BTkQgaXMgYSBjb21tYW5kIHVzaW5nIHRoZSBDIGNvbXBpbGVyIHRoYXQgeW91IHdvdWxkIHVzZSB0byBjcmVhdGUKK2EgcHJvZ3JhbSBmcm9tIHNldmVyYWwgb2JqZWN0IGZpbGVzLgorCitUaGUgZm9sbG93aW5nIGNvbXBvbmVudHMgb2YgTElOSy1DT01NQU5EIGFyZSB0cmVhdGVkIHNwZWNpYWxseToKKworICAtYWxsLXN0YXRpYyAgICAgICBkbyBub3QgZG8gYW55IGR5bmFtaWMgbGlua2luZyBhdCBhbGwKKyAgLWF2b2lkLXZlcnNpb24gICAgZG8gbm90IGFkZCBhIHZlcnNpb24gc3VmZml4IGlmIHBvc3NpYmxlCisgIC1kbG9wZW4gRklMRSAgICAgIFxgLWRscHJlb3BlbicgRklMRSBpZiBpdCBjYW5ub3QgYmUgZGxvcGVuZWQgYXQgcnVudGltZQorICAtZGxwcmVvcGVuIEZJTEUgICBsaW5rIGluIEZJTEUgYW5kIGFkZCBpdHMgc3ltYm9scyB0byBsdF9wcmVsb2FkZWRfc3ltYm9scworICAtZXhwb3J0LWR5bmFtaWMgICBhbGxvdyBzeW1ib2xzIGZyb20gT1VUUFVULUZJTEUgdG8gYmUgcmVzb2x2ZWQgd2l0aCBkbHN5bSgzKQorICAtZXhwb3J0LXN5bWJvbHMgU1lNRklMRQorCQkgICAgdHJ5IHRvIGV4cG9ydCBvbmx5IHRoZSBzeW1ib2xzIGxpc3RlZCBpbiBTWU1GSUxFCisgIC1leHBvcnQtc3ltYm9scy1yZWdleCBSRUdFWAorCQkgICAgdHJ5IHRvIGV4cG9ydCBvbmx5IHRoZSBzeW1ib2xzIG1hdGNoaW5nIFJFR0VYCisgIC1MTElCRElSICAgICAgICAgIHNlYXJjaCBMSUJESVIgZm9yIHJlcXVpcmVkIGluc3RhbGxlZCBsaWJyYXJpZXMKKyAgLWxOQU1FICAgICAgICAgICAgT1VUUFVULUZJTEUgcmVxdWlyZXMgdGhlIGluc3RhbGxlZCBsaWJyYXJ5IGxpYk5BTUUKKyAgLW1vZHVsZSAgICAgICAgICAgYnVpbGQgYSBsaWJyYXJ5IHRoYXQgY2FuIGRsb3BlbmVkCisgIC1uby1mYXN0LWluc3RhbGwgIGRpc2FibGUgdGhlIGZhc3QtaW5zdGFsbCBtb2RlCisgIC1uby1pbnN0YWxsICAgICAgIGxpbmsgYSBub3QtaW5zdGFsbGFibGUgZXhlY3V0YWJsZQorICAtbm8tdW5kZWZpbmVkICAgICBkZWNsYXJlIHRoYXQgYSBsaWJyYXJ5IGRvZXMgbm90IHJlZmVyIHRvIGV4dGVybmFsIHN5bWJvbHMKKyAgLW8gT1VUUFVULUZJTEUgICAgY3JlYXRlIE9VVFBVVC1GSUxFIGZyb20gdGhlIHNwZWNpZmllZCBvYmplY3RzCisgIC1vYmplY3RsaXN0IEZJTEUgIFVzZSBhIGxpc3Qgb2Ygb2JqZWN0IGZpbGVzIGZvdW5kIGluIEZJTEUgdG8gc3BlY2lmeSBvYmplY3RzCisgIC1wcmVjaW91cy1maWxlcy1yZWdleCBSRUdFWAorICAgICAgICAgICAgICAgICAgICBkb24ndCByZW1vdmUgb3V0cHV0IGZpbGVzIG1hdGNoaW5nIFJFR0VYCisgIC1yZWxlYXNlIFJFTEVBU0UgIHNwZWNpZnkgcGFja2FnZSByZWxlYXNlIGluZm9ybWF0aW9uCisgIC1ycGF0aCBMSUJESVIgICAgIHRoZSBjcmVhdGVkIGxpYnJhcnkgd2lsbCBldmVudHVhbGx5IGJlIGluc3RhbGxlZCBpbiBMSUJESVIKKyAgLVJbIF1MSUJESVIgICAgICAgYWRkIExJQkRJUiB0byB0aGUgcnVudGltZSBwYXRoIG9mIHByb2dyYW1zIGFuZCBsaWJyYXJpZXMKKyAgLXN0YXRpYyAgICAgICAgICAgZG8gbm90IGRvIGFueSBkeW5hbWljIGxpbmtpbmcgb2YgbGlidG9vbCBsaWJyYXJpZXMKKyAgLXZlcnNpb24taW5mbyBDVVJSRU5UWzpSRVZJU0lPTls6QUdFXV0KKwkJICAgIHNwZWNpZnkgbGlicmFyeSB2ZXJzaW9uIGluZm8gW2VhY2ggdmFyaWFibGUgZGVmYXVsdHMgdG8gMF0KKworQWxsIG90aGVyIG9wdGlvbnMgKGFyZ3VtZW50cyBiZWdpbm5pbmcgd2l0aCBcYC0nKSBhcmUgaWdub3JlZC4KKworRXZlcnkgb3RoZXIgYXJndW1lbnQgaXMgdHJlYXRlZCBhcyBhIGZpbGVuYW1lLiAgRmlsZXMgZW5kaW5nIGluIFxgLmxhJyBhcmUKK3RyZWF0ZWQgYXMgdW5pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMsIG90aGVyIGZpbGVzIGFyZSBzdGFuZGFyZCBvciBsaWJyYXJ5CitvYmplY3QgZmlsZXMuCisKK0lmIHRoZSBPVVRQVVQtRklMRSBlbmRzIGluIFxgLmxhJywgdGhlbiBhIGxpYnRvb2wgbGlicmFyeSBpcyBjcmVhdGVkLAorb25seSBsaWJyYXJ5IG9iamVjdHMgKFxgLmxvJyBmaWxlcykgbWF5IGJlIHNwZWNpZmllZCwgYW5kIFxgLXJwYXRoJyBpcworcmVxdWlyZWQsIGV4Y2VwdCB3aGVuIGNyZWF0aW5nIGEgY29udmVuaWVuY2UgbGlicmFyeS4KKworSWYgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5hJyBvciBcYC5saWInLCB0aGVuIGEgc3RhbmRhcmQgbGlicmFyeSBpcyBjcmVhdGVkCit1c2luZyBcYGFyJyBhbmQgXGByYW5saWInLCBvciBvbiBXaW5kb3dzIHVzaW5nIFxgbGliJy4KKworSWYgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5sbycgb3IgXGAuJHtvYmpleHR9JywgdGhlbiBhIHJlbG9hZGFibGUgb2JqZWN0IGZpbGUKK2lzIGNyZWF0ZWQsIG90aGVyd2lzZSBhbiBleGVjdXRhYmxlIHByb2dyYW0gaXMgY3JlYXRlZC4iCisgIDs7CisKK3VuaW5zdGFsbCkKKyAgJGVjaG8gXAorIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPXVuaW5zdGFsbCBSTSBbUk0tT1BUSU9OXS4uLiBGSUxFLi4uCisKK1JlbW92ZSBsaWJyYXJpZXMgZnJvbSBhbiBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LgorCitSTSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSB0byB1c2UgdG8gZGVsZXRlIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIEZJTEUKKyh0eXBpY2FsbHkgXGAvYmluL3JtJykuICBSTS1PUFRJT05TIGFyZSBvcHRpb25zIChzdWNoIGFzIFxgLWYnKSB0byBiZSBwYXNzZWQKK3RvIFJNLgorCitJZiBGSUxFIGlzIGEgbGlidG9vbCBsaWJyYXJ5LCBhbGwgdGhlIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBpdCBhcmUgZGVsZXRlZC4KK090aGVyd2lzZSwgb25seSBGSUxFIGl0c2VsZiBpcyBkZWxldGVkIHVzaW5nIFJNLiIKKyAgOzsKKworKikKKyAgJGVjaG8gIiRtb2RlbmFtZTogaW52YWxpZCBvcGVyYXRpb24gbW9kZSBcYCRtb2RlJyIgMT4mMgorICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgZXhpdCAkRVhJVF9GQUlMVVJFCisgIDs7Citlc2FjCisKKyRlY2hvCiskZWNobyAiVHJ5IFxgJG1vZGVuYW1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgb3RoZXIgbW9kZXMuIgorCitleGl0ICQ/CisKKyMgVGhlIFRBR3MgYmVsb3cgYXJlIGRlZmluZWQgc3VjaCB0aGF0IHdlIG5ldmVyIGdldCBpbnRvIGEgc2l0dWF0aW9uCisjIGluIHdoaWNoIHdlIGRpc2FibGUgYm90aCBraW5kcyBvZiBsaWJyYXJpZXMuICBHaXZlbiBjb25mbGljdGluZworIyBjaG9pY2VzLCB3ZSBnbyBmb3IgYSBzdGF0aWMgbGlicmFyeSwgdGhhdCBpcyB0aGUgbW9zdCBwb3J0YWJsZSwKKyMgc2luY2Ugd2UgY2FuJ3QgdGVsbCB3aGV0aGVyIHNoYXJlZCBsaWJyYXJpZXMgd2VyZSBkaXNhYmxlZCBiZWNhdXNlCisjIHRoZSB1c2VyIGFza2VkIGZvciB0aGF0IG9yIGJlY2F1c2UgdGhlIHBsYXRmb3JtIGRvZXNuJ3Qgc3VwcG9ydAorIyB0aGVtLiAgVGhpcyBpcyBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IG9uIEFJWCwgYmVjYXVzZSB3ZSBkb24ndAorIyBzdXBwb3J0IGhhdmluZyBib3RoIHN0YXRpYyBhbmQgc2hhcmVkIGxpYnJhcmllcyBlbmFibGVkIGF0IHRoZSBzYW1lCisjIHRpbWUgb24gdGhhdCBwbGF0Zm9ybSwgc28gd2UgZGVmYXVsdCB0byBhIHNoYXJlZC1vbmx5IGNvbmZpZ3VyYXRpb24uCisjIElmIGEgZGlzYWJsZS1zaGFyZWQgdGFnIGlzIGdpdmVuLCB3ZSdsbCBmYWxsYmFjayB0byBhIHN0YXRpYy1vbmx5CisjIGNvbmZpZ3VyYXRpb24uICBCdXQgd2UnbGwgbmV2ZXIgZ28gZnJvbSBzdGF0aWMtb25seSB0byBzaGFyZWQtb25seS4KKworIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiBkaXNhYmxlLXNoYXJlZAorZGlzYWJsZV9saWJzPXNoYXJlZAorIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogZGlzYWJsZS1zaGFyZWQKKworIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiBkaXNhYmxlLXN0YXRpYworZGlzYWJsZV9saWJzPXN0YXRpYworIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogZGlzYWJsZS1zdGF0aWMKKworIyBMb2NhbCBWYXJpYWJsZXM6CisjIG1vZGU6c2hlbGwtc2NyaXB0CisjIHNoLWluZGVudGF0aW9uOjIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L200L0NoYW5nZUxvZyBiL2xpYmdjcnlwdC0xLjQuNi9tNC9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMxNDMzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tNC9DaGFuZ2VMb2cKQEAgLTAsMCArMSwzNSBAQAorMjAwOS0wMS0yMiAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogbm9leGVjc3RhY2subTQ6IFJlcGxhY2Ugbm9uIHBvcnRhYmxlIGdyZXAgLXEuICBSZXBvcnRlZCBieQorCUFsYmVydCBDaGluLgorCisyMDA3LTAyLTIyICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBub2V4ZWNzdGFjay5tNDogQ2hhbmdlIGRlZmF1bHQgdG8gZW5hYmxlIGl0LgorCisyMDA3LTAyLTIwICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBNYWtlZmlsZS5hbTogTmV3LgorCisJKiBub2V4ZWNzdGFjay5tNDogIE5ldy4gIFRha2VuIGZyb20gZ251cGcgMS40CisKKzIwMDYtMTAtMTEgIE1hcmN1cyBCcmlua21hbm4gIDxtYXJjdXNAZzEwY29kZS5kZT4KKworCSogZmFsbGJhY2subTQ6IFJlbW92ZWQgYWdhaW4uCisKKzIwMDYtMTAtMTAgIE1hcmN1cyBCcmlua21hbm4gIDxtYXJjdXNAZzEwY29kZS5kZT4KKworCSogZmFsbGJhY2subTQ6IE5ldyBmaWxlIGZyb20gUHRoLgorCisyMDA2LTA3LTA0ICBNYXJjdXMgQnJpbmttYW5uICA8bWFyY3VzQGcxMGNvZGUuZGU+CisKKwkqIHN5c19zb2NrZXRfaC5tNCwgc29ja2xlbi5tNCwgb25jZW9ubHkubTQ6IE5ldyBmaWxlcyBmcm9tIGdudWxpYi4KKwkKKzIwMDQtMDQtMDYgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBsaWJ0b29sLm00OiBVcGRhdGVkIGZyb20gMS41LjQKKworMjAwMy0xMi0wOCAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIGxpYnRvb2wubTQ6IE5ldy4KKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L200L01ha2VmaWxlLmFtIGIvbGliZ2NyeXB0LTEuNC42L200L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNjVkMTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbTQvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSBAQAorRVhUUkFfRElTVCA9IGxpYnRvb2wubTQgb25jZW9ubHkubTQgc29ja2xlbi5tNCBzeXNfc29ja2V0X2gubTQgbm9leGVjc3RhY2subTQKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tNC9NYWtlZmlsZS5pbiBiL2xpYmdjcnlwdC0xLjQuNi9tNC9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjRlMDM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L200L01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMzYxIEBACisjIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjEwLjIgZnJvbSBNYWtlZmlsZS5hbS4KKyMgQGNvbmZpZ3VyZV9pbnB1dEAKKworIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCisjIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDggIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworQFNFVF9NQUtFQAorVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK2FtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKK2luc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0CitpbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCitpbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX3RyaXBsZXQgPSBAYnVpbGRACitob3N0X3RyaXBsZXQgPSBAaG9zdEAKK3N1YmRpciA9IG00CitESVNUX0NPTU1PTiA9ICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuaW4gQ2hhbmdlTG9nCitBQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00CithbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9tNC9saWJ0b29sLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L25vZXhlY3N0YWNrLm00ICQodG9wX3NyY2RpcikvbTQvb25jZW9ubHkubTQgXAorCSQodG9wX3NyY2RpcikvbTQvc29ja2xlbi5tNCAkKHRvcF9zcmNkaXIpL200L3N5c19zb2NrZXRfaC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2luY2x1ZGUubTQgJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuYWMKK2FtX19jb25maWd1cmVfZGVwcyA9ICQoYW1fX2FjbG9jYWxfbTRfZGVwcykgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKSBcCisJJChBQ0xPQ0FMX000KQorbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycworQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9jb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0KK1NPVVJDRVMgPQorRElTVF9TT1VSQ0VTID0KK0RJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCitBQ0xPQ0FMID0gQEFDTE9DQUxACitBTVRBUiA9IEBBTVRBUkAKK0FSID0gQEFSQAorQVMgPSBAQVNACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVdLID0gQEFXS0AKK0JVSUxEX0ZJTEVWRVJTSU9OID0gQEJVSUxEX0ZJTEVWRVJTSU9OQAorQlVJTERfUkVWSVNJT04gPSBAQlVJTERfUkVWSVNJT05ACitCVUlMRF9USU1FU1RBTVAgPSBAQlVJTERfVElNRVNUQU1QQAorQ0MgPSBAQ0NACitDQ0FTID0gQENDQVNACitDQ0FTREVQTU9ERSA9IEBDQ0FTREVQTU9ERUAKK0NDQVNGTEFHUyA9IEBDQ0FTRkxBR1NACitDQ0RFUE1PREUgPSBAQ0NERVBNT0RFQAorQ0ZMQUdTID0gQENGTEFHU0AKK0NQUCA9IEBDUFBACitDUFBGTEFHUyA9IEBDUFBGTEFHU0AKK0NYWCA9IEBDWFhACitDWFhDUFAgPSBAQ1hYQ1BQQAorQ1hYREVQTU9ERSA9IEBDWFhERVBNT0RFQAorQ1hYRkxBR1MgPSBAQ1hYRkxBR1NACitDWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAorREVGUyA9IEBERUZTQAorREVQRElSID0gQERFUERJUkAKK0RMTFRPT0wgPSBARExMVE9PTEAKK0RMX0xJQlMgPSBARExfTElCU0AKK0VDSE8gPSBARUNIT0AKK0VDSE9fQyA9IEBFQ0hPX0NACitFQ0hPX04gPSBARUNIT19OQAorRUNIT19UID0gQEVDSE9fVEAKK0VHUkVQID0gQEVHUkVQQAorRVhFRVhUID0gQEVYRUVYVEAKK0Y3NyA9IEBGNzdACitGQUxMQkFDS19TT0NLTEVOX1QgPSBARkFMTEJBQ0tfU09DS0xFTl9UQAorRkZMQUdTID0gQEZGTEFHU0AKK0dDUllQVF9DSVBIRVJTID0gQEdDUllQVF9DSVBIRVJTQAorR0NSWVBUX0RJR0VTVFMgPSBAR0NSWVBUX0RJR0VTVFNACitHQ1JZUFRfUFVCS0VZX0NJUEhFUlMgPSBAR0NSWVBUX1BVQktFWV9DSVBIRVJTQAorR0NSWVBUX1JBTkRPTSA9IEBHQ1JZUFRfUkFORE9NQAorR1BHX0VSUk9SX0NGTEFHUyA9IEBHUEdfRVJST1JfQ0ZMQUdTQAorR1BHX0VSUk9SX0NPTkZJRyA9IEBHUEdfRVJST1JfQ09ORklHQAorR1BHX0VSUk9SX0xJQlMgPSBAR1BHX0VSUk9SX0xJQlNACitHUkVQID0gQEdSRVBACitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAorSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKK0xERkxBR1MgPSBATERGTEFHU0AKK0xJQkdDUllQVF9DSVBIRVJTID0gQExJQkdDUllQVF9DSVBIRVJTQAorTElCR0NSWVBUX0NPTkZJR19BUElfVkVSU0lPTiA9IEBMSUJHQ1JZUFRfQ09ORklHX0FQSV9WRVJTSU9OQAorTElCR0NSWVBUX0NPTkZJR19DRkxBR1MgPSBATElCR0NSWVBUX0NPTkZJR19DRkxBR1NACitMSUJHQ1JZUFRfQ09ORklHX0xJQlMgPSBATElCR0NSWVBUX0NPTkZJR19MSUJTQAorTElCR0NSWVBUX0RJR0VTVFMgPSBATElCR0NSWVBUX0RJR0VTVFNACitMSUJHQ1JZUFRfTFRfQUdFID0gQExJQkdDUllQVF9MVF9BR0VACitMSUJHQ1JZUFRfTFRfQ1VSUkVOVCA9IEBMSUJHQ1JZUFRfTFRfQ1VSUkVOVEAKK0xJQkdDUllQVF9MVF9SRVZJU0lPTiA9IEBMSUJHQ1JZUFRfTFRfUkVWSVNJT05ACitMSUJHQ1JZUFRfUFVCS0VZX0NJUEhFUlMgPSBATElCR0NSWVBUX1BVQktFWV9DSVBIRVJTQAorTElCR0NSWVBUX1RIUkVBRF9NT0RVTEVTID0gQExJQkdDUllQVF9USFJFQURfTU9EVUxFU0AKK0xJQk9CSlMgPSBATElCT0JKU0AKK0xJQlMgPSBATElCU0AKK0xJQlRPT0wgPSBATElCVE9PTEAKK0xOX1MgPSBATE5fU0AKK0xUTElCT0JKUyA9IEBMVExJQk9CSlNACitNQUlOVCA9IEBNQUlOVEAKK01BS0VJTkZPID0gQE1BS0VJTkZPQAorTUtESVJfUCA9IEBNS0RJUl9QQAorTVBJX1NGTEFHUyA9IEBNUElfU0ZMQUdTQAorTk9FWEVDU1RBQ0tfRkxBR1MgPSBATk9FWEVDU1RBQ0tfRkxBR1NACitPQkpEVU1QID0gQE9CSkRVTVBACitPQkpFWFQgPSBAT0JKRVhUQAorUEFDS0FHRSA9IEBQQUNLQUdFQAorUEFDS0FHRV9CVUdSRVBPUlQgPSBAUEFDS0FHRV9CVUdSRVBPUlRACitQQUNLQUdFX05BTUUgPSBAUEFDS0FHRV9OQU1FQAorUEFDS0FHRV9TVFJJTkcgPSBAUEFDS0FHRV9TVFJJTkdACitQQUNLQUdFX1RBUk5BTUUgPSBAUEFDS0FHRV9UQVJOQU1FQAorUEFDS0FHRV9VUkwgPSBAUEFDS0FHRV9VUkxACitQQUNLQUdFX1ZFUlNJT04gPSBAUEFDS0FHRV9WRVJTSU9OQAorUEFUSF9TRVBBUkFUT1IgPSBAUEFUSF9TRVBBUkFUT1JACitQVEhfQ0ZMQUdTID0gQFBUSF9DRkxBR1NACitQVEhfQ09ORklHID0gQFBUSF9DT05GSUdACitQVEhfTElCUyA9IEBQVEhfTElCU0AKK1JBTkxJQiA9IEBSQU5MSUJACitSQyA9IEBSQ0AKK1NFVF9NQUtFID0gQFNFVF9NQUtFQAorU0hFTEwgPSBAU0hFTExACitTVFJJUCA9IEBTVFJJUEAKK1NZU19TT0NLRVRfSCA9IEBTWVNfU09DS0VUX0hACitWRVJTSU9OID0gQFZFUlNJT05ACithYnNfYnVpbGRkaXIgPSBAYWJzX2J1aWxkZGlyQAorYWJzX3NyY2RpciA9IEBhYnNfc3JjZGlyQAorYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAorYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACithY19jdF9DQyA9IEBhY19jdF9DQ0AKK2FjX2N0X0NYWCA9IEBhY19jdF9DWFhACithY19jdF9GNzcgPSBAYWNfY3RfRjc3QAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2FtX190YXIgPSBAYW1fX3RhckAKK2FtX191bnRhciA9IEBhbV9fdW50YXJACitiaW5kaXIgPSBAYmluZGlyQAorYnVpbGQgPSBAYnVpbGRACitidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKK2J1aWxkX2NwdSA9IEBidWlsZF9jcHVACitidWlsZF9vcyA9IEBidWlsZF9vc0AKK2J1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACitidWlsZGRpciA9IEBidWlsZGRpckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAorZG9jZGlyID0gQGRvY2RpckAKK2R2aWRpciA9IEBkdmlkaXJACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK2hvc3QgPSBAaG9zdEAKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK2hvc3RfY3B1ID0gQGhvc3RfY3B1QAoraG9zdF9vcyA9IEBob3N0X29zQAoraG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACitodG1sZGlyID0gQGh0bWxkaXJACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACitpbmZvZGlyID0gQGluZm9kaXJACitpbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACitsaWJkaXIgPSBAbGliZGlyQAorbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAorbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKK2xvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKK21hbmRpciA9IEBtYW5kaXJACitta2Rpcl9wID0gQG1rZGlyX3BACitvbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACitwZGZkaXIgPSBAcGRmZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK3BzZGlyID0gQHBzZGlyQAorc2JpbmRpciA9IEBzYmluZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK3RvcF9idWlsZF9wcmVmaXggPSBAdG9wX2J1aWxkX3ByZWZpeEAKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACitFWFRSQV9ESVNUID0gbGlidG9vbC5tNCBvbmNlb25seS5tNCBzb2NrbGVuLm00IHN5c19zb2NrZXRfaC5tNCBub2V4ZWNzdGFjay5tNAorYWxsOiBhbGwtYW0KKworLlNVRkZJWEVTOgorJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJQGZvciBkZXAgaW4gJD87IGRvIFwKKwkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAorCSAgICAqJCRkZXAqKSBcCisJICAgICAgKCBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2ggKSBcCisJICAgICAgICAmJiB7IGlmIHRlc3QgLWYgJEA7IHRoZW4gZXhpdCAwOyBlbHNlIGJyZWFrOyBmaTsgfTsgXAorCSAgICAgIGV4aXQgMTs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUgIG00L01ha2VmaWxlJzsgXAorCWNkICQodG9wX3NyY2RpcikgJiYgXAorCSAgJChBVVRPTUFLRSkgLS1nbnUgIG00L01ha2VmaWxlCisuUFJFQ0lPVVM6IE1ha2VmaWxlCitNYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJQGNhc2UgJyQ/JyBpbiBcCisJICAqY29uZmlnLnN0YXR1cyopIFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoOzsgXAorCSAgKikgXAorCSAgICBlY2hvICcgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpJzsgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSk7OyBcCisJZXNhYzsKKworJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXM6ICQodG9wX3NyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCisKKyQodG9wX3NyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorJChBQ0xPQ0FMX000KTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19hY2xvY2FsX200X2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCisKK21vc3RseWNsZWFuLWxpYnRvb2w6CisJLXJtIC1mICoubG8KKworY2xlYW4tbGlidG9vbDoKKwktcm0gLXJmIC5saWJzIF9saWJzCit0YWdzOiBUQUdTCitUQUdTOgorCitjdGFnczogQ1RBR1MKK0NUQUdTOgorCisKK2Rpc3RkaXI6ICQoRElTVEZJTEVTKQorCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJbGlzdD0nJChESVNURklMRVMpJzsgXAorCSAgZGlzdF9maWxlcz1gZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IFwKKwkgIHNlZCAtZSAic3xeJCRzcmNkaXJzdHJpcC98fDt0IiBcCisJICAgICAgLWUgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98O3QiYDsgXAorCWNhc2UgJCRkaXN0X2ZpbGVzIGluIFwKKwkgICovKikgJChNS0RJUl9QKSBgZWNobyAiJCRkaXN0X2ZpbGVzIiB8IFwKKwkJCSAgIHNlZCAnL1wvLyFkO3N8XnwkKGRpc3RkaXIpL3w7cywvW14vXSokJCwsJyB8IFwKKwkJCSAgIHNvcnQgLXVgIDs7IFwKKwllc2FjOyBcCisJZm9yIGZpbGUgaW4gJCRkaXN0X2ZpbGVzOyBkbyBcCisJICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCisJICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAorCSAgICBkaXI9YGVjaG8gIi8kJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAorCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKKwkgICAgICBjcCAtcFIgJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpJCRkaXIgfHwgZXhpdCAxOyBcCisJICAgIGZpOyBcCisJICAgIGNwIC1wUiAkJGQvJCRmaWxlICQoZGlzdGRpcikkJGRpciB8fCBleGl0IDE7IFwKKwkgIGVsc2UgXAorCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKKwkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCitjaGVjay1hbTogYWxsLWFtCitjaGVjazogY2hlY2stYW0KK2FsbC1hbTogTWFrZWZpbGUKK2luc3RhbGxkaXJzOgoraW5zdGFsbDogaW5zdGFsbC1hbQoraW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtYW0KK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLWFtCit1bmluc3RhbGw6IHVuaW5zdGFsbC1hbQorCitpbnN0YWxsLWFtOiBhbGwtYW0KKwlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQorCitpbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1hbQoraW5zdGFsbC1zdHJpcDoKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCisJICBgdGVzdCAteiAnJChTVFJJUCknIHx8IFwKKwkgICAgZWNobyAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyJgIGluc3RhbGwKK21vc3RseWNsZWFuLWdlbmVyaWM6CisKK2NsZWFuLWdlbmVyaWM6CisKK2Rpc3RjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQorCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6CisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKK2NsZWFuOiBjbGVhbi1hbQorCitjbGVhbi1hbTogY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIG1vc3RseWNsZWFuLWFtCisKK2Rpc3RjbGVhbjogZGlzdGNsZWFuLWFtCisJLXJtIC1mIE1ha2VmaWxlCitkaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1nZW5lcmljCisKK2R2aTogZHZpLWFtCisKK2R2aS1hbToKKworaHRtbDogaHRtbC1hbQorCitpbmZvOiBpbmZvLWFtCisKK2luZm8tYW06CisKK2luc3RhbGwtZGF0YS1hbToKKworaW5zdGFsbC1kdmk6IGluc3RhbGwtZHZpLWFtCisKK2luc3RhbGwtZXhlYy1hbToKKworaW5zdGFsbC1odG1sOiBpbnN0YWxsLWh0bWwtYW0KKworaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KKworaW5zdGFsbC1tYW46CisKK2luc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1hbQorCitpbnN0YWxsLXBzOiBpbnN0YWxsLXBzLWFtCisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQorCS1ybSAtZiBNYWtlZmlsZQorbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYworCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tYW0KKworbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbAorCitwZGY6IHBkZi1hbQorCitwZGYtYW06CisKK3BzOiBwcy1hbQorCitwcy1hbToKKwordW5pbnN0YWxsLWFtOgorCisuTUFLRTogaW5zdGFsbC1hbSBpbnN0YWxsLXN0cmlwCisKKy5QSE9OWTogYWxsIGFsbC1hbSBjaGVjayBjaGVjay1hbSBjbGVhbiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgXAorCWRpc3RjbGVhbiBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tbGlidG9vbCBkaXN0ZGlyIGR2aSBcCisJZHZpLWFtIGh0bWwgaHRtbC1hbSBpbmZvIGluZm8tYW0gaW5zdGFsbCBpbnN0YWxsLWFtIFwKKwlpbnN0YWxsLWRhdGEgaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZHZpIGluc3RhbGwtZHZpLWFtIFwKKwlpbnN0YWxsLWV4ZWMgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtaHRtbCBpbnN0YWxsLWh0bWwtYW0gXAorCWluc3RhbGwtaW5mbyBpbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1tYW4gaW5zdGFsbC1wZGYgXAorCWluc3RhbGwtcGRmLWFtIGluc3RhbGwtcHMgaW5zdGFsbC1wcy1hbSBpbnN0YWxsLXN0cmlwIFwKKwlpbnN0YWxsY2hlY2sgaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIG1haW50YWluZXItY2xlYW4gXAorCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBtb3N0bHljbGVhbi1nZW5lcmljIFwKKwltb3N0bHljbGVhbi1saWJ0b29sIHBkZiBwZGYtYW0gcHMgcHMtYW0gdW5pbnN0YWxsIHVuaW5zdGFsbC1hbQorCisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbTQvbGlidG9vbC5tNCBiL2xpYmdjcnlwdC0xLjQuNi9tNC9saWJ0b29sLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MDU1YTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbTQvbGlidG9vbC5tNApAQCAtMCwwICsxLDU5MzkgQEAKKyMgbGlidG9vbC5tNCAtIENvbmZpZ3VyZSBsaWJ0b29sIGZvciB0aGUgaG9zdCBzeXN0ZW0uIC0qLUF1dG9jb25mLSotCisjIyBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMQorIyMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIyBPcmlnaW5hbGx5IGJ5IEdvcmRvbiBNYXR6aWdrZWl0IDxnb3JkQGdudS5haS5taXQuZWR1PiwgMTk5NgorIyMKKyMjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIworIyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMjIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMjCisjIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisjIworIyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisjIHNlcmlhbCA0NyBBQ19QUk9HX0xJQlRPT0wKKyMgRGViaWFuICRSZXY6IDk2MSAkCisKKworIyBBQ19QUk9WSURFX0lGRUxTRShNQUNSTy1OQU1FLCBJRi1QUk9WSURFRCwgSUYtTk9ULVBST1ZJREVEKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBJZiB0aGlzIG1hY3JvIGlzIG5vdCBkZWZpbmVkIGJ5IEF1dG9jb25mLCBkZWZpbmUgaXQgaGVyZS4KK200X2lmZGVmKFtBQ19QUk9WSURFX0lGRUxTRV0sCisgICAgICAgICBbXSwKKyAgICAgICAgIFttNF9kZWZpbmUoW0FDX1BST1ZJREVfSUZFTFNFXSwKKwkgICAgICAgICBbbTRfaWZkZWYoW0FDX1BST1ZJREVfJDFdLAorCQkgICAgICAgICAgIFskMl0sIFskM10pXSldKQorCisKKyMgQUNfUFJPR19MSUJUT09MCisjIC0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0FDX1BST0dfTElCVE9PTF0sCitbQUNfUkVRVUlSRShbX0FDX1BST0dfTElCVE9PTF0pZG5sCitkbmwgSWYgQUNfUFJPR19DWFggaGFzIGFscmVhZHkgYmVlbiBleHBhbmRlZCwgcnVuIEFDX0xJQlRPT0xfQ1hYCitkbmwgaW1tZWRpYXRlbHksIG90aGVyd2lzZSwgaG9vayBpdCBpbiBhdCB0aGUgZW5kIG9mIEFDX1BST0dfQ1hYLgorICBBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19DWFhdLAorICAgIFtBQ19MSUJUT09MX0NYWF0sCisgICAgW2RlZmluZShbQUNfUFJPR19DWFhdLCBkZWZuKFtBQ19QUk9HX0NYWF0pW0FDX0xJQlRPT0xfQ1hYCisgIF0pXSkKK2RubCBBbmQgYSBzaW1pbGFyIHNldHVwIGZvciBGb3J0cmFuIDc3IHN1cHBvcnQKKyAgQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfRjc3XSwKKyAgICBbQUNfTElCVE9PTF9GNzddLAorICAgIFtkZWZpbmUoW0FDX1BST0dfRjc3XSwgZGVmbihbQUNfUFJPR19GNzddKVtBQ19MSUJUT09MX0Y3NworXSldKQorCitkbmwgUXVvdGUgQV1bTV9QUk9HX0dDSiBzbyB0aGF0IGFjbG9jYWwgZG9lc24ndCBicmluZyBpdCBpbiBuZWVkbGVzc2x5LgorZG5sIElmIGVpdGhlciBBQ19QUk9HX0dDSiBvciBBXVtNX1BST0dfR0NKIGhhdmUgYWxyZWFkeSBiZWVuIGV4cGFuZGVkLCBydW4KK2RubCBBQ19MSUJUT09MX0dDSiBpbW1lZGlhdGVseSwgb3RoZXJ3aXNlLCBob29rIGl0IGluIGF0IHRoZSBlbmQgb2YgYm90aC4KKyAgQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfR0NKXSwKKyAgICBbQUNfTElCVE9PTF9HQ0pdLAorICAgIFtBQ19QUk9WSURFX0lGRUxTRShbQV1bTV9QUk9HX0dDSl0sCisgICAgICBbQUNfTElCVE9PTF9HQ0pdLAorICAgICAgW0FDX1BST1ZJREVfSUZFTFNFKFtMVF9BQ19QUk9HX0dDSl0sCisJW0FDX0xJQlRPT0xfR0NKXSwKKyAgICAgIFtpZmRlZihbQUNfUFJPR19HQ0pdLAorCSAgICAgW2RlZmluZShbQUNfUFJPR19HQ0pdLCBkZWZuKFtBQ19QUk9HX0dDSl0pW0FDX0xJQlRPT0xfR0NKXSldKQorICAgICAgIGlmZGVmKFtBXVtNX1BST0dfR0NKXSwKKwkgICAgIFtkZWZpbmUoW0FdW01fUFJPR19HQ0pdLCBkZWZuKFtBXVtNX1BST0dfR0NKXSlbQUNfTElCVE9PTF9HQ0pdKV0pCisgICAgICAgaWZkZWYoW0xUX0FDX1BST0dfR0NKXSwKKwkgICAgIFtkZWZpbmUoW0xUX0FDX1BST0dfR0NKXSwKKwkJZGVmbihbTFRfQUNfUFJPR19HQ0pdKVtBQ19MSUJUT09MX0dDSl0pXSldKV0pCitdKV0pIyBBQ19QUk9HX0xJQlRPT0wKKworCisjIF9BQ19QUk9HX0xJQlRPT0wKKyMgLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW19BQ19QUk9HX0xJQlRPT0xdLAorW0FDX1JFUVVJUkUoW0FDX0xJQlRPT0xfU0VUVVBdKWRubAorQUNfQkVGT1JFKFskMF0sW0FDX0xJQlRPT0xfQ1hYXSlkbmwKK0FDX0JFRk9SRShbJDBdLFtBQ19MSUJUT09MX0Y3N10pZG5sCitBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9HQ0pdKWRubAorCisjIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVidWlsZCBsaWJ0b29sIHdoZW4gbmVlZGVkCitMSUJUT09MX0RFUFM9IiRhY19hdXhfZGlyL2x0bWFpbi5zaCIKKworIyBBbHdheXMgdXNlIG91ciBvd24gbGlidG9vbC4KK0xJQlRPT0w9JyQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sJworQUNfU1VCU1QoTElCVE9PTClkbmwKKworIyBQcmV2ZW50IG11bHRpcGxlIGV4cGFuc2lvbgorZGVmaW5lKFtBQ19QUk9HX0xJQlRPT0xdLCBbXSkKK10pIyBfQUNfUFJPR19MSUJUT09MCisKKworIyBBQ19MSUJUT09MX1NFVFVQCisjIC0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtBQ19MSUJUT09MX1NFVFVQXSwKK1tBQ19QUkVSRVEoMi41MClkbmwKK0FDX1JFUVVJUkUoW0FDX0VOQUJMRV9TSEFSRURdKWRubAorQUNfUkVRVUlSRShbQUNfRU5BQkxFX1NUQVRJQ10pZG5sCitBQ19SRVFVSVJFKFtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9CVUlMRF0pZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfTERdKWRubAorQUNfUkVRVUlSRShbQUNfUFJPR19MRF9SRUxPQURfRkxBR10pZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX05NXSlkbmwKKworQUNfUkVRVUlSRShbQUNfUFJPR19MTl9TXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0RFUExJQlNfQ0hFQ0tfTUVUSE9EXSlkbmwKKyMgQXV0b2NvbmYgMi4xMydzIEFDX09CSkVYVCBhbmQgQUNfRVhFRVhUIG1hY3JvcyBvbmx5IHdvcmtzIGZvciBDIGNvbXBpbGVycyEKK0FDX1JFUVVJUkUoW0FDX09CSkVYVF0pZG5sCitBQ19SRVFVSVJFKFtBQ19FWEVFWFRdKWRubAorZG5sCisKK0FDX0xJQlRPT0xfU1lTX01BWF9DTURfTEVOCitBQ19MSUJUT09MX1NZU19HTE9CQUxfU1lNQk9MX1BJUEUKK0FDX0xJQlRPT0xfT0JKRElSCisKK0FDX1JFUVVJUkUoW19MVF9BQ19TWVNfQ09NUElMRVJdKWRubAorX0xUX0FDX1BST0dfRUNIT19CQUNLU0xBU0gKKworY2FzZSAkaG9zdF9vcyBpbgorYWl4MyopCisgICMgQUlYIHNvbWV0aW1lcyBoYXMgcHJvYmxlbXMgd2l0aCB0aGUgR0NDIGNvbGxlY3QyIHByb2dyYW0uICBGb3Igc29tZQorICAjIHJlYXNvbiwgaWYgd2Ugc2V0IHRoZSBDT0xMRUNUX05BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgcHJvYmxlbXMKKyAgIyB2YW5pc2ggaW4gYSBwdWZmIG9mIHNtb2tlLgorICBpZiB0ZXN0ICJYJHtDT0xMRUNUX05BTUVTK3NldH0iICE9IFhzZXQ7IHRoZW4KKyAgICBDT0xMRUNUX05BTUVTPQorICAgIGV4cG9ydCBDT0xMRUNUX05BTUVTCisgIGZpCisgIDs7Citlc2FjCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKKyMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCitYc2VkPSdzZWQgLWUgcy9eWC8vJworW3NlZF9xdW90ZV9zdWJzdD0ncy9cKFtcXCJcXGAkXFxcXF1cKS9cXFwxL2cnXQorCisjIFNhbWUgYXMgYWJvdmUsIGJ1dCBkbyBub3QgcXVvdGUgdmFyaWFibGUgcmVmZXJlbmNlcy4KK1tkb3VibGVfcXVvdGVfc3Vic3Q9J3MvXChbXFwiXFxgXFxcXF1cKS9cXFwxL2cnXQorCisjIFNlZCBzdWJzdGl0dXRpb24gdG8gZGVsYXkgZXhwYW5zaW9uIG9mIGFuIGVzY2FwZWQgc2hlbGwgdmFyaWFibGUgaW4gYQorIyBkb3VibGVfcXVvdGVfc3Vic3QnZWQgc3RyaW5nLgorZGVsYXlfdmFyaWFibGVfc3Vic3Q9J3MvXFxcXFxcXFxcXFwkL1xcXFxcXCQvZycKKworIyBTZWQgc3Vic3RpdHV0aW9uIHRvIGF2b2lkIGFjY2lkZW50YWwgZ2xvYmJpbmcgaW4gZXZhbGVkIGV4cHJlc3Npb25zCitub19nbG9iX3N1YnN0PSdzL1wqL1xcXCovZycKKworIyBDb25zdGFudHM6CitybT0icm0gLWYiCisKKyMgR2xvYmFsIHZhcmlhYmxlczoKK2RlZmF1bHRfb2ZpbGU9bGlidG9vbAorY2FuX2J1aWxkX3NoYXJlZD15ZXMKKworIyBBbGwga25vd24gbGlua2VycyByZXF1aXJlIGEgYC5hJyBhcmNoaXZlIGZvciBzdGF0aWMgbGlua2luZyAoZXhjZXB0IE0kVkMsCisjIHdoaWNoIG5lZWRzICcubGliJykuCitsaWJleHQ9YQorbHRtYWluPSIkYWNfYXV4X2Rpci9sdG1haW4uc2giCitvZmlsZT0iJGRlZmF1bHRfb2ZpbGUiCit3aXRoX2dudV9sZD0iJGx0X2N2X3Byb2dfZ251X2xkIgorCitBQ19DSEVDS19UT09MKEFSLCBhciwgZmFsc2UpCitBQ19DSEVDS19UT09MKFJBTkxJQiwgcmFubGliLCA6KQorQUNfQ0hFQ0tfVE9PTChTVFJJUCwgc3RyaXAsIDopCisKK29sZF9DQz0iJENDIgorb2xkX0NGTEFHUz0iJENGTEFHUyIKKworIyBTZXQgc2FuZSBkZWZhdWx0cyBmb3IgdmFyaW91cyB2YXJpYWJsZXMKK3Rlc3QgLXogIiRBUiIgJiYgQVI9YXIKK3Rlc3QgLXogIiRBUl9GTEFHUyIgJiYgQVJfRkxBR1M9Y3J1Cit0ZXN0IC16ICIkQVMiICYmIEFTPWFzCit0ZXN0IC16ICIkQ0MiICYmIENDPWNjCit0ZXN0IC16ICIkTFRDQyIgJiYgTFRDQz0kQ0MKK3Rlc3QgLXogIiRETExUT09MIiAmJiBETExUT09MPWRsbHRvb2wKK3Rlc3QgLXogIiRMRCIgJiYgTEQ9bGQKK3Rlc3QgLXogIiRMTl9TIiAmJiBMTl9TPSJsbiAtcyIKK3Rlc3QgLXogIiRNQUdJQ19DTUQiICYmIE1BR0lDX0NNRD1maWxlCit0ZXN0IC16ICIkTk0iICYmIE5NPW5tCit0ZXN0IC16ICIkU0VEIiAmJiBTRUQ9c2VkCit0ZXN0IC16ICIkT0JKRFVNUCIgJiYgT0JKRFVNUD1vYmpkdW1wCit0ZXN0IC16ICIkUkFOTElCIiAmJiBSQU5MSUI9OgordGVzdCAteiAiJFNUUklQIiAmJiBTVFJJUD06Cit0ZXN0IC16ICIkYWNfb2JqZXh0IiAmJiBhY19vYmpleHQ9bworCisjIERldGVybWluZSBjb21tYW5kcyB0byBjcmVhdGUgb2xkLXN0eWxlIHN0YXRpYyBhcmNoaXZlcy4KK29sZF9hcmNoaXZlX2NtZHM9JyRBUiAkQVJfRkxBR1MgJG9sZGxpYiRvbGRvYmpzJG9sZF9kZXBsaWJzJworb2xkX3Bvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDY0NCAkb2xkbGliJworb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0KKworaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICBvcGVuYnNkKikKKyAgICBvbGRfcG9zdGluc3RhbGxfY21kcz0iXCRSQU5MSUIgLXQgXCRvbGRsaWJ+JG9sZF9wb3N0aW5zdGFsbF9jbWRzIgorICAgIDs7CisgICopCisgICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHM9IlwkUkFOTElCIFwkb2xkbGlifiRvbGRfcG9zdGluc3RhbGxfY21kcyIKKyAgICA7OworICBlc2FjCisgIG9sZF9hcmNoaXZlX2NtZHM9IiRvbGRfYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkb2xkbGliIgorZmkKKworIyBPbmx5IHBlcmZvcm0gdGhlIGNoZWNrIGZvciBmaWxlLCBpZiB0aGUgY2hlY2sgbWV0aG9kIHJlcXVpcmVzIGl0CitjYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgorZmlsZV9tYWdpYyopCisgIGlmIHRlc3QgIiRmaWxlX21hZ2ljX2NtZCIgPSAnJE1BR0lDX0NNRCc7IHRoZW4KKyAgICBBQ19QQVRIX01BR0lDCisgIGZpCisgIDs7Citlc2FjCisKK0FDX1BST1ZJREVfSUZFTFNFKFtBQ19MSUJUT09MX0RMT1BFTl0sIGVuYWJsZV9kbG9wZW49eWVzLCBlbmFibGVfZGxvcGVuPW5vKQorQUNfUFJPVklERV9JRkVMU0UoW0FDX0xJQlRPT0xfV0lOMzJfRExMXSwKK2VuYWJsZV93aW4zMl9kbGw9eWVzLCBlbmFibGVfd2luMzJfZGxsPW5vKQorCitBQ19BUkdfRU5BQkxFKFtsaWJ0b29sLWxvY2tdLAorICAgIFtBQ19IRUxQX1NUUklORyhbLS1kaXNhYmxlLWxpYnRvb2wtbG9ja10sCisJW2F2b2lkIGxvY2tpbmcgKG1pZ2h0IGJyZWFrIHBhcmFsbGVsIGJ1aWxkcyldKV0pCit0ZXN0ICJ4JGVuYWJsZV9saWJ0b29sX2xvY2siICE9IHhubyAmJiBlbmFibGVfbGlidG9vbF9sb2NrPXllcworCitBQ19BUkdfV0lUSChbcGljXSwKKyAgICBbQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1waWNdLAorCVt0cnkgdG8gdXNlIG9ubHkgUElDL25vbi1QSUMgb2JqZWN0cyBAPDpAZGVmYXVsdD11c2UgYm90aEA6PkBdKV0sCisgICAgW3BpY19tb2RlPSIkd2l0aHZhbCJdLAorICAgIFtwaWNfbW9kZT1kZWZhdWx0XSkKK3Rlc3QgLXogIiRwaWNfbW9kZSIgJiYgcGljX21vZGU9ZGVmYXVsdAorCisjIFVzZSBDIGZvciB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGluIHRoZSBsaWJ0b29sIHNjcmlwdAordGFnbmFtZT0KK0FDX0xJQlRPT0xfTEFOR19DX0NPTkZJRworX0xUX0FDX1RBR0NPTkZJRworXSkjIEFDX0xJQlRPT0xfU0VUVVAKKworCisjIF9MVF9BQ19TWVNfQ09NUElMRVIKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW19MVF9BQ19TWVNfQ09NUElMRVJdLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAorCisjIElmIG5vIEMgY29tcGlsZXIgd2FzIHNwZWNpZmllZCwgdXNlIENDLgorTFRDQz0ke0xUQ0MtIiRDQyJ9CisKKyMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCitjb21waWxlcj0kQ0MKK10pIyBfTFRfQUNfU1lTX0NPTVBJTEVSCisKKworIyBfTFRfQUNfU1lTX0xJQlBBVEhfQUlYCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTGlua3MgYSBtaW5pbWFsIHByb2dyYW0gYW5kIGNoZWNrcyB0aGUgZXhlY3V0YWJsZQorIyBmb3IgdGhlIHN5c3RlbSBkZWZhdWx0IGhhcmRjb2RlZCBsaWJyYXJ5IHBhdGguIEluIG1vc3QgY2FzZXMsCisjIHRoaXMgaXMgL3Vzci9saWI6L2xpYiwgYnV0IHdoZW4gdGhlIE1QSSBjb21waWxlcnMgYXJlIHVzZWQKKyMgdGhlIGxvY2F0aW9uIG9mIHRoZSBjb21tdW5pY2F0aW9uIGFuZCBNUEkgbGlicyBhcmUgaW5jbHVkZWQgdG9vLgorIyBJZiB3ZSBkb24ndCBmaW5kIGFueXRoaW5nLCB1c2UgdGhlIGRlZmF1bHQgbGlicmFyeSBwYXRoIGFjY29yZGluZworIyB0byB0aGUgYWl4IGxkIG1hbnVhbC4KK0FDX0RFRlVOKFtfTFRfQUNfU1lTX0xJQlBBVEhfQUlYXSwKK1tBQ19MSU5LX0lGRUxTRShBQ19MQU5HX1BST0dSQU0sWworYWl4X2xpYnBhdGg9YGR1bXAgLUggY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAnL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geyAvXjAvIHsgcy9eMCAgKlwoLipcKSQvXDEvOyBwOyB9Cit9J2AKKyMgQ2hlY2sgZm9yIGEgNjQtYml0IG9iamVjdCBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZy4KK2lmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9YGR1bXAgLUhYNjQgY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAnL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geyAvXjAvIHsgcy9eMCAgKlwoLipcKSQvXDEvOyBwOyB9Cit9J2A7IGZpXSxbXSkKK2lmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9Ii91c3IvbGliOi9saWIiOyBmaQorXSkjIF9MVF9BQ19TWVNfTElCUEFUSF9BSVgKKworCisjIF9MVF9BQ19TSEVMTF9JTklUKEFSRykKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW19MVF9BQ19TSEVMTF9JTklUXSwKK1tpZmRlZihbQUNfRElWRVJTSU9OX05PVElDRV0sCisJICAgICBbQUNfRElWRVJUX1BVU0goQUNfRElWRVJTSU9OX05PVElDRSldLAorCSBbQUNfRElWRVJUX1BVU0goTk9USUNFKV0pCiskMQorQUNfRElWRVJUX1BPUAorXSkjIF9MVF9BQ19TSEVMTF9JTklUCisKKworIyBfTFRfQUNfUFJPR19FQ0hPX0JBQ0tTTEFTSAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBZGQgc29tZSBjb2RlIHRvIHRoZSBzdGFydCBvZiB0aGUgZ2VuZXJhdGVkIGNvbmZpZ3VyZSBzY3JpcHQgd2hpY2gKKyMgd2lsbCBmaW5kIGFuIGVjaG8gY29tbWFuZCB3aGljaCBkb2Vzbid0IGludGVycHJldCBiYWNrc2xhc2hlcy4KK0FDX0RFRlVOKFtfTFRfQUNfUFJPR19FQ0hPX0JBQ0tTTEFTSF0sCitbX0xUX0FDX1NIRUxMX0lOSVQoWworIyBDaGVjayB0aGF0IHdlIGFyZSBydW5uaW5nIHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLgorU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KKworY2FzZSBYJEVDSE8gaW4KK1gqLS1mYWxsYmFjay1lY2hvKQorICAjIFJlbW92ZSBvbmUgbGV2ZWwgb2YgcXVvdGF0aW9uICh3aGljaCB3YXMgcmVxdWlyZWQgZm9yIE1ha2UpLgorICBFQ0hPPWBlY2hvICIkRUNITyIgfCBzZWQgJ3MsXFxcXFxbJF1cXFskXTAsJ1skXTAnLCdgCisgIDs7Citlc2FjCisKK2VjaG89JHtFQ0hPLWVjaG99CitpZiB0ZXN0ICJYWyRdMSIgPSBYLS1uby1yZWV4ZWM7IHRoZW4KKyAgIyBEaXNjYXJkIHRoZSAtLW5vLXJlZXhlYyBmbGFnLCBhbmQgY29udGludWUuCisgIHNoaWZ0CitlbGlmIHRlc3QgIlhbJF0xIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KKyAgIyBBdm9pZCBpbmxpbmUgZG9jdW1lbnQgaGVyZSwgaXQgbWF5IGJlIGxlZnQgb3ZlcgorICA6CitlbGlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyA7IHRoZW4KKyAgIyBZaXBwZWUsICRlY2hvIHdvcmtzIQorICA6CitlbHNlCisgICMgUmVzdGFydCB1bmRlciB0aGUgY29ycmVjdCBzaGVsbC4KKyAgZXhlYyAkU0hFTEwgIlskXTAiIC0tbm8tcmVleGVjICR7MSsiWyRdQCJ9CitmaQorCitpZiB0ZXN0ICJYWyRdMSIgPSBYLS1mYWxsYmFjay1lY2hvOyB0aGVuCisgICMgdXNlZCBhcyBmYWxsYmFjayBlY2hvCisgIHNoaWZ0CisgIGNhdCA8PEVPRgorWyRdKgorRU9GCisgIGV4aXQgMAorZmkKKworIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKKyMgaWYgQ0RQQVRIIGlzIHNldC4KK2lmIHRlc3QgIlgke0NEUEFUSCtzZXR9IiA9IFhzZXQ7IHRoZW4gQ0RQQVRIPTo7IGV4cG9ydCBDRFBBVEg7IGZpCisKK2lmIHRlc3QgLXogIiRFQ0hPIjsgdGhlbgoraWYgdGVzdCAiWCR7ZWNob190ZXN0X3N0cmluZytzZXR9IiAhPSBYc2V0OyB0aGVuCisjIGZpbmQgYSBzdHJpbmcgYXMgbGFyZ2UgYXMgcG9zc2libGUsIGFzIGxvbmcgYXMgdGhlIHNoZWxsIGNhbiBjb3BlIHdpdGggaXQKKyAgZm9yIGNtZCBpbiAnc2VkIDUwcSAiWyRdMCInICdzZWQgMjBxICJbJF0wIicgJ3NlZCAxMHEgIlskXTAiJyAnc2VkIDJxICJbJF0wIicgJ2VjaG8gdGVzdCc7IGRvCisgICAgIyBleHBlY3RlZCBzaXplczogbGVzcyB0aGFuIDJLYiwgMUtiLCA1MTIgYnl0ZXMsIDE2IGJ5dGVzLCAuLi4KKyAgICBpZiAoZWNob190ZXN0X3N0cmluZz0iYGV2YWwgJGNtZGAiKSAyPi9kZXYvbnVsbCAmJgorICAgICAgIGVjaG9fdGVzdF9zdHJpbmc9ImBldmFsICRjbWRgIiAmJgorICAgICAgICh0ZXN0ICJYJGVjaG9fdGVzdF9zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsCisgICAgdGhlbgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCitmaQorCitpZiB0ZXN0ICJYYCgkZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKKyAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKKyAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgorICA6CitlbHNlCisgICMgVGhlIFNvbGFyaXMsIEFJWCwgYW5kIERpZ2l0YWwgVW5peCBkZWZhdWx0IGVjaG8gcHJvZ3JhbXMgdW5xdW90ZQorICAjIGJhY2tzbGFzaGVzLiAgVGhpcyBtYWtlcyBpdCBpbXBvc3NpYmxlIHRvIHF1b3RlIGJhY2tzbGFzaGVzIHVzaW5nCisgICMgICBlY2hvICIkc29tZXRoaW5nIiB8IHNlZCAncy9cXC9cXFxcL2cnCisgICMKKyAgIyBTbywgZmlyc3Qgd2UgbG9vayBmb3IgYSB3b3JraW5nIGVjaG8gaW4gdGhlIHVzZXIncyBQQVRILgorCisgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICBmb3IgZGlyIGluICRQQVRIIC91c3IvdWNiOyBkbworICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgIGlmICh0ZXN0IC1mICRkaXIvZWNobyB8fCB0ZXN0IC1mICRkaXIvZWNobyRhY19leGVleHQpICYmCisgICAgICAgdGVzdCAiWGAoJGRpci9lY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgorICAgICAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkZGlyL2VjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCisgICAgICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCisgICAgICBlY2hvPSIkZGlyL2VjaG8iCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkbHRfc2F2ZV9pZnMiCisKKyAgaWYgdGVzdCAiWCRlY2hvIiA9IFhlY2hvOyB0aGVuCisgICAgIyBXZSBkaWRuJ3QgZmluZCBhIGJldHRlciBlY2hvLCBzbyBsb29rIGZvciBhbHRlcm5hdGl2ZXMuCisgICAgaWYgdGVzdCAiWGAocHJpbnQgLXIgJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCisgICAgICAgZWNob190ZXN0aW5nX3N0cmluZz1gKHByaW50IC1yICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgorICAgICAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgorICAgICAgIyBUaGlzIHNoZWxsIGhhcyBhIGJ1aWx0aW4gcHJpbnQgLXIgdGhhdCBkb2VzIHRoZSB0cmljay4KKyAgICAgIGVjaG89J3ByaW50IC1yJworICAgIGVsaWYgKHRlc3QgLWYgL2Jpbi9rc2ggfHwgdGVzdCAtZiAvYmluL2tzaCRhY19leGVleHQpICYmCisJIHRlc3QgIlgkQ09ORklHX1NIRUxMIiAhPSBYL2Jpbi9rc2g7IHRoZW4KKyAgICAgICMgSWYgd2UgaGF2ZSBrc2gsIHRyeSBydW5uaW5nIGNvbmZpZ3VyZSBhZ2FpbiB3aXRoIGl0LgorICAgICAgT1JJR0lOQUxfQ09ORklHX1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CisgICAgICBleHBvcnQgT1JJR0lOQUxfQ09ORklHX1NIRUxMCisgICAgICBDT05GSUdfU0hFTEw9L2Jpbi9rc2gKKyAgICAgIGV4cG9ydCBDT05GSUdfU0hFTEwKKyAgICAgIGV4ZWMgJENPTkZJR19TSEVMTCAiWyRdMCIgLS1uby1yZWV4ZWMgJHsxKyJbJF1AIn0KKyAgICBlbHNlCisgICAgICAjIFRyeSB1c2luZyBwcmludGYuCisgICAgICBlY2hvPSdwcmludGYgJXNcbicKKyAgICAgIGlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgorCSBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJGVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCisJIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgorCSMgQ29vbCwgcHJpbnRmIHdvcmtzCisJOgorICAgICAgZWxpZiBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJE9SSUdJTkFMX0NPTkZJR19TSEVMTCAiWyRdMCIgLS1mYWxsYmFjay1lY2hvICdcdCcpIDI+L2Rldi9udWxsYCAmJgorCSAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAnWFx0JyAmJgorCSAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkT1JJR0lOQUxfQ09ORklHX1NIRUxMICJbJF0wIiAtLWZhbGxiYWNrLWVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCisJICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCisJQ09ORklHX1NIRUxMPSRPUklHSU5BTF9DT05GSUdfU0hFTEwKKwlleHBvcnQgQ09ORklHX1NIRUxMCisJU0hFTEw9IiRDT05GSUdfU0hFTEwiCisJZXhwb3J0IFNIRUxMCisJZWNobz0iJENPTkZJR19TSEVMTCBbJF0wIC0tZmFsbGJhY2stZWNobyIKKyAgICAgIGVsaWYgZWNob190ZXN0aW5nX3N0cmluZz1gKCRDT05GSUdfU0hFTEwgIlskXTAiIC0tZmFsbGJhY2stZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAgJiYKKwkgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gJ1hcdCcgJiYKKwkgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJENPTkZJR19TSEVMTCAiWyRdMCIgLS1mYWxsYmFjay1lY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgorCSAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgorCWVjaG89IiRDT05GSUdfU0hFTEwgWyRdMCAtLWZhbGxiYWNrLWVjaG8iCisgICAgICBlbHNlCisJIyBtYXliZSB3aXRoIGEgc21hbGxlciBzdHJpbmcuLi4KKwlwcmV2PToKKworCWZvciBjbWQgaW4gJ2VjaG8gdGVzdCcgJ3NlZCAycSAiWyRdMCInICdzZWQgMTBxICJbJF0wIicgJ3NlZCAyMHEgIlskXTAiJyAnc2VkIDUwcSAiWyRdMCInOyBkbworCSAgaWYgKHRlc3QgIlgkZWNob190ZXN0X3N0cmluZyIgPSAiWGBldmFsICRjbWRgIikgMj4vZGV2L251bGwKKwkgIHRoZW4KKwkgICAgYnJlYWsKKwkgIGZpCisJICBwcmV2PSIkY21kIgorCWRvbmUKKworCWlmIHRlc3QgIiRwcmV2IiAhPSAnc2VkIDUwcSAiWyRdMCInOyB0aGVuCisJICBlY2hvX3Rlc3Rfc3RyaW5nPWBldmFsICRwcmV2YAorCSAgZXhwb3J0IGVjaG9fdGVzdF9zdHJpbmcKKwkgIGV4ZWMgJHtPUklHSU5BTF9DT05GSUdfU0hFTEwtJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH19ICJbJF0wIiAkezErIlskXUAifQorCWVsc2UKKwkgICMgT29wcy4gIFdlIGxvc3QgY29tcGxldGVseSwgc28ganVzdCBzdGljayB3aXRoIGVjaG8uCisJICBlY2hvPWVjaG8KKwlmaQorICAgICAgZmkKKyAgICBmaQorICBmaQorZmkKK2ZpCisKKyMgQ29weSBlY2hvIGFuZCBxdW90ZSB0aGUgY29weSBzdWl0YWJseSBmb3IgcGFzc2luZyB0byBsaWJ0b29sIGZyb20KKyMgdGhlIE1ha2VmaWxlLCBpbnN0ZWFkIG9mIHF1b3RpbmcgdGhlIG9yaWdpbmFsLCB3aGljaCBpcyB1c2VkIGxhdGVyLgorRUNITz0kZWNobworaWYgdGVzdCAiWCRFQ0hPIiA9ICJYJENPTkZJR19TSEVMTCBbJF0wIC0tZmFsbGJhY2stZWNobyI7IHRoZW4KKyAgIEVDSE89IiRDT05GSUdfU0hFTEwgXFxcJFxbJF0wIC0tZmFsbGJhY2stZWNobyIKK2ZpCisKK0FDX1NVQlNUKEVDSE8pCitdKV0pIyBfTFRfQUNfUFJPR19FQ0hPX0JBQ0tTTEFTSAorCisKKyMgX0xUX0FDX0xPQ0sKKyMgLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtfTFRfQUNfTE9DS10sCitbQUNfQVJHX0VOQUJMRShbbGlidG9vbC1sb2NrXSwKKyAgICBbQUNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1saWJ0b29sLWxvY2tdLAorCVthdm9pZCBsb2NraW5nIChtaWdodCBicmVhayBwYXJhbGxlbCBidWlsZHMpXSldKQordGVzdCAieCRlbmFibGVfbGlidG9vbF9sb2NrIiAhPSB4bm8gJiYgZW5hYmxlX2xpYnRvb2xfbG9jaz15ZXMKKworIyBTb21lIGZsYWdzIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgY29tcGlsZXIgb3IgbGlua2VyIGZvciBnb29kCisjIGxpYnRvb2wgc3VwcG9ydC4KK2Nhc2UgJGhvc3QgaW4KK2lhNjQtKi1ocHV4KikKKyAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgorICBlY2hvICdpbnQgaTsnID4gY29uZnRlc3QuJGFjX2V4dAorICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgorICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3QuJGFjX29iamV4dGAgaW4KKyAgICAqRUxGLTMyKikKKyAgICAgIEhQVVhfSUE2NF9NT0RFPSIzMiIKKyAgICAgIDs7CisgICAgKkVMRi02NCopCisgICAgICBIUFVYX0lBNjRfTU9ERT0iNjQiCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworKi0qLWlyaXg2KikKKyAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgorICBlY2hvICdbI11saW5lIF9fb2xpbmVfXyAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0CisgIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCisgICBpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19nbnVfbGQiID0geWVzOyB0aGVuCisgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC4kYWNfb2JqZXh0YCBpbgorICAgICozMi1iaXQqKQorICAgICAgTEQ9IiR7TEQtbGR9IC1tZWxmMzJic21pcCIKKyAgICAgIDs7CisgICAgKk4zMiopCisgICAgICBMRD0iJHtMRC1sZH0gLW1lbGYzMmJtaXBuMzIiCisgICAgICA7OworICAgICo2NC1iaXQqKQorICAgICAgTEQ9IiR7TEQtbGR9IC1tZWxmNjRibWlwIgorICAgICAgOzsKKyAgICBlc2FjCisgICBlbHNlCisgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC4kYWNfb2JqZXh0YCBpbgorICAgICozMi1iaXQqKQorICAgICAgTEQ9IiR7TEQtbGR9IC0zMiIKKyAgICAgIDs7CisgICAgKk4zMiopCisgICAgICBMRD0iJHtMRC1sZH0gLW4zMiIKKyAgICAgIDs7CisgICAgKjY0LWJpdCopCisgICAgICBMRD0iJHtMRC1sZH0gLTY0IgorICAgICAgOzsKKyAgICBlc2FjCisgICBmaQorICBmaQorICBybSAtcmYgY29uZnRlc3QqCisgIDs7CisKK3g4Nl82NC0qbGludXgqfHBwYyotKmxpbnV4Knxwb3dlcnBjKi0qbGludXgqfHMzOTAqLSpsaW51eCp8c3BhcmMqLSpsaW51eCopCisgICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KKyAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KKyAgICBjYXNlICJgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCIgaW4KKyAgICAqMzItYml0KikKKyAgICAgIGNhc2UgJGhvc3QgaW4KKyAgICAgICAgeDg2XzY0LSpsaW51eCopCisgICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl9pMzg2IgorICAgICAgICAgIDs7CisgICAgICAgIHBwYzY0LSpsaW51eCp8cG93ZXJwYzY0LSpsaW51eCopCisgICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjMycHBjbGludXgiCisgICAgICAgICAgOzsKKyAgICAgICAgczM5MHgtKmxpbnV4KikKKyAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmX3MzOTAiCisgICAgICAgICAgOzsKKyAgICAgICAgc3BhcmM2NC0qbGludXgqKQorICAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGYzMl9zcGFyYyIKKyAgICAgICAgICA7OworICAgICAgZXNhYworICAgICAgOzsKKyAgICAqNjQtYml0KikKKyAgICAgIGNhc2UgJGhvc3QgaW4KKyAgICAgICAgeDg2XzY0LSpsaW51eCopCisgICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl94ODZfNjQiCisgICAgICAgICAgOzsKKyAgICAgICAgcHBjKi0qbGludXgqfHBvd2VycGMqLSpsaW51eCopCisgICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0cHBjIgorICAgICAgICAgIDs7CisgICAgICAgIHMzOTAqLSpsaW51eCopCisgICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3MzOTAiCisgICAgICAgICAgOzsKKyAgICAgICAgc3BhcmMqLSpsaW51eCopCisgICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3NwYXJjIgorICAgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworCisqLSotc2NvMy4ydjUqKQorICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCisgIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCisgIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmXSwgbHRfY3ZfY2NfbmVlZHNfYmVsZiwKKyAgICBbQUNfTEFOR19QVVNIKEMpCisgICAgIEFDX1RSWV9MSU5LKFtdLFtdLFtsdF9jdl9jY19uZWVkc19iZWxmPXllc10sW2x0X2N2X2NjX25lZWRzX2JlbGY9bm9dKQorICAgICBBQ19MQU5HX1BPUF0pCisgIGlmIHRlc3QgeCIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgIT0geCJ5ZXMiOyB0aGVuCisgICAgIyB0aGlzIGlzIHByb2JhYmx5IGdjYyAyLjguMCwgZWdjcyAxLjAgb3IgbmV3ZXI7IG5vIG5lZWQgZm9yIC1iZWxmCisgICAgQ0ZMQUdTPSIkU0FWRV9DRkxBR1MiCisgIGZpCisgIDs7CitBQ19QUk9WSURFX0lGRUxTRShbQUNfTElCVE9PTF9XSU4zMl9ETExdLAorWyotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKikKKyAgQUNfQ0hFQ0tfVE9PTChETExUT09MLCBkbGx0b29sLCBmYWxzZSkKKyAgQUNfQ0hFQ0tfVE9PTChBUywgYXMsIGZhbHNlKQorICBBQ19DSEVDS19UT09MKE9CSkRVTVAsIG9iamR1bXAsIGZhbHNlKQorICA7OworICBdKQorZXNhYworCituZWVkX2xvY2tzPSIkZW5hYmxlX2xpYnRvb2xfbG9jayIKKworXSkjIF9MVF9BQ19MT0NLCisKKworIyBBQ19MSUJUT09MX0NPTVBJTEVSX09QVElPTihNRVNTQUdFLCBWQVJJQUJMRS1OQU1FLCBGTEFHUywKKyMJCVtPVVRQVVQtRklMRV0sIFtBQ1RJT04tU1VDQ0VTU10sIFtBQ1RJT04tRkFJTFVSRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gY29tcGlsZXIgb3B0aW9uIHdvcmtzCitBQ19ERUZVTihbQUNfTElCVE9PTF9DT01QSUxFUl9PUFRJT05dLAorW0FDX1JFUVVJUkUoW0xUX0FDX1BST0dfU0VEXSkKK0FDX0NBQ0hFX0NIRUNLKFskMV0sIFskMl0sCisgIFskMj1ubworICBpZmVsc2UoWyQ0XSwgLCBbYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0XSwgW2FjX291dGZpbGU9JDRdKQorICAgcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGx0X2NvbXBpbGVyX2ZsYWc9IiQzIgorICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKKyAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCisgICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCisgICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgorICAgIyBUaGUgb3B0aW9uIGlzIHJlZmVyZW5jZWQgdmlhIGEgdmFyaWFibGUgdG8gYXZvaWQgY29uZnVzaW5nIHNlZC4KKyAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAorICAgLWUgJ3M6LipGTEFHU30/IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAorICAgLWUgJ3M6IFtbXiBdXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCisgICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAorICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOl9fb2xpbmVfXzogJGx0X2NvbXBpbGVcIiIgPiZBU19NRVNTQUdFX0xPR19GRCkKKyAgIChldmFsICIkbHRfY29tcGlsZSIgMj5jb25mdGVzdC5lcnIpCisgICBhY19zdGF0dXM9JD8KKyAgIGNhdCBjb25mdGVzdC5lcnIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgZWNobyAiJGFzX21lOl9fb2xpbmVfXzogXCQ/ID0gJGFjX3N0YXR1cyIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyAiJGFjX291dGZpbGUiOyB0aGVuCisgICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncworICAgICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgICAgJDI9eWVzCisgICAgIGZpCisgICBmaQorICAgJHJtIGNvbmZ0ZXN0KgorXSkKKworaWYgdGVzdCB4IlskXSQyIiA9IHh5ZXM7IHRoZW4KKyAgICBpZmVsc2UoWyQ1XSwgLCA6LCBbJDVdKQorZWxzZQorICAgIGlmZWxzZShbJDZdLCAsIDosIFskNl0pCitmaQorXSkjIEFDX0xJQlRPT0xfQ09NUElMRVJfT1BUSU9OCisKKworIyBBQ19MSUJUT09MX0xJTktFUl9PUFRJT04oTUVTU0FHRSwgVkFSSUFCTEUtTkFNRSwgRkxBR1MsCisjICAgICAgICAgICAgICAgICAgICAgICAgICBbQUNUSU9OLVNVQ0NFU1NdLCBbQUNUSU9OLUZBSUxVUkVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gY29tcGlsZXIgb3B0aW9uIHdvcmtzCitBQ19ERUZVTihbQUNfTElCVE9PTF9MSU5LRVJfT1BUSU9OXSwKK1tBQ19DQUNIRV9DSEVDSyhbJDFdLCBbJDJdLAorICBbJDI9bm8KKyAgIHNhdmVfTERGTEFHUz0iJExERkxBR1MiCisgICBMREZMQUdTPSIkTERGTEFHUyAkMyIKKyAgIHByaW50ZiAiJGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisgICBpZiAoZXZhbCAkYWNfbGluayAyPmNvbmZ0ZXN0LmVycikgJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KKyAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCisgICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgICAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KKyAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgIGVsc2UKKyAgICAgICAkMj15ZXMKKyAgICAgZmkKKyAgIGZpCisgICAkcm0gY29uZnRlc3QqCisgICBMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgorXSkKKworaWYgdGVzdCB4IlskXSQyIiA9IHh5ZXM7IHRoZW4KKyAgICBpZmVsc2UoWyQ0XSwgLCA6LCBbJDRdKQorZWxzZQorICAgIGlmZWxzZShbJDVdLCAsIDosIFskNV0pCitmaQorXSkjIEFDX0xJQlRPT0xfTElOS0VSX09QVElPTgorCisKKyMgQUNfTElCVE9PTF9TWVNfTUFYX0NNRF9MRU4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtBQ19MSUJUT09MX1NZU19NQVhfQ01EX0xFTl0sCitbIyBmaW5kIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzCitBQ19NU0dfQ0hFQ0tJTkcoW3RoZSBtYXhpbXVtIGxlbmd0aCBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzXSkKK0FDX0NBQ0hFX1ZBTChbbHRfY3Zfc3lzX21heF9jbWRfbGVuXSwgW2RubAorICBpPTAKKyAgdGVzdHN0cmluZz0iQUJDRCIKKworICBjYXNlICRidWlsZF9vcyBpbgorICBtc2Rvc2RqZ3BwKikKKyAgICAjIE9uIERKR1BQLCB0aGlzIHRlc3QgY2FuIGJsb3cgdXAgcHJldHR5IGJhZGx5IGR1ZSB0byBwcm9ibGVtcyBpbiBsaWJjCisgICAgIyAoYW55IHNpbmdsZSBhcmd1bWVudCBleGNlZWRpbmcgMjAwMCBieXRlcyBjYXVzZXMgYSBidWZmZXIgb3ZlcnJ1bgorICAgICMgZHVyaW5nIGdsb2IgZXhwYW5zaW9uKS4gIEV2ZW4gaWYgaXQgd2VyZSBmaXhlZCwgdGhlIHJlc3VsdCBvZiB0aGlzCisgICAgIyBjaGVjayB3b3VsZCBiZSBsYXJnZXIgdGhhbiBpdCBzaG91bGQgYmUuCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTEyMjg4OyAgICAjIDEySyBpcyBhYm91dCByaWdodAorICAgIDs7CisKKyAgZ251KikKKyAgICAjIFVuZGVyIEdOVSBIdXJkLCB0aGlzIHRlc3QgaXMgbm90IHJlcXVpcmVkIGJlY2F1c2UgdGhlcmUgaXMKKyAgICAjIG5vIGxpbWl0IHRvIHRoZSBsZW5ndGggb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KKyAgICAjIExpYnRvb2wgd2lsbCBpbnRlcnByZXQgLTEgYXMgbm8gbGltaXQgd2hhdHNvZXZlcgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0tMTsKKyAgICA7OworCisgIGN5Z3dpbiogfCBtaW5ndyopCisgICAgIyBPbiBXaW45eC9NRSwgdGhpcyB0ZXN0IGJsb3dzIHVwIC0tIGl0IHN1Y2NlZWRzLCBidXQgdGFrZXMKKyAgICAjIGFib3V0IDUgbWludXRlcyBhcyB0aGUgdGVzdHN0cmluZyBncm93cyBleHBvbmVudGlhbGx5LgorICAgICMgV29yc2UsIHNpbmNlIDl4L01FIGFyZSBub3QgcHJlLWVtcHRpdmVseSBtdWx0aXRhc2tpbmcsCisgICAgIyB5b3UgZW5kIHVwIHdpdGggYSAiZnJvemVuIiBjb21wdXRlciwgZXZlbiB0aG91Z2ggd2l0aCBwYXRpZW5jZQorICAgICMgdGhlIHRlc3QgZXZlbnR1YWxseSBzdWNjZWVkcyAod2l0aCBhIG1heCBsaW5lIGxlbmd0aCBvZiAyNTZrKS4KKyAgICAjIEluc3RlYWQsIGxldCdzIGp1c3QgcHVudDogdXNlIHRoZSBtaW5pbXVtIGxpbmVsZW5ndGggcmVwb3J0ZWQgYnkKKyAgICAjIGFsbCBvZiB0aGUgc3VwcG9ydGVkIHBsYXRmb3JtczogODE5MiAob24gTlQvMksvWFApLgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj04MTkyOworICAgIDs7CisKKyAgYW1pZ2FvcyopCisgICAgIyBPbiBBbWlnYU9TIHdpdGggcGRrc2gsIHRoaXMgdGVzdCB0YWtlcyBob3VycywgbGl0ZXJhbGx5LgorICAgICMgU28gd2UganVzdCBwdW50IGFuZCB1c2UgYSBtaW5pbXVtIGxpbmUgbGVuZ3RoIG9mIDgxOTIuCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTgxOTI7CisgICAgOzsKKworICopCisgICAgIyBJZiB0ZXN0IGlzIG5vdCBhIHNoZWxsIGJ1aWx0LWluLCB3ZSdsbCBwcm9iYWJseSBlbmQgdXAgY29tcHV0aW5nIGEKKyAgICAjIG1heGltdW0gbGVuZ3RoIHRoYXQgaXMgb25seSBoYWxmIG9mIHRoZSBhY3R1YWwgbWF4aW11bSBsZW5ndGgsIGJ1dAorICAgICMgd2UgY2FuJ3QgdGVsbC4KKyAgICB3aGlsZSAodGVzdCAiWCJgJENPTkZJR19TSEVMTCBbJF0wIC0tZmFsbGJhY2stZWNobyAiWCR0ZXN0c3RyaW5nIiAyPi9kZXYvbnVsbGAgXAorCSAgICAgICA9ICJYWCR0ZXN0c3RyaW5nIikgPi9kZXYvbnVsbCAyPiYxICYmCisJICAgIG5ld19yZXN1bHQ9YGV4cHIgIlgkdGVzdHN0cmluZyIgOiAiLioiIDI+JjFgICYmCisJICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0kbmV3X3Jlc3VsdCAmJgorCSAgICB0ZXN0ICRpICE9IDE3ICMgMS8yIE1CIHNob3VsZCBiZSBlbm91Z2gKKyAgICBkbworICAgICAgaT1gZXhwciAkaSArIDFgCisgICAgICB0ZXN0c3RyaW5nPSR0ZXN0c3RyaW5nJHRlc3RzdHJpbmcKKyAgICBkb25lCisgICAgdGVzdHN0cmluZz0KKyAgICAjIEFkZCBhIHNpZ25pZmljYW50IHNhZmV0eSBmYWN0b3IgYmVjYXVzZSBDKysgY29tcGlsZXJzIGNhbiB0YWNrIG9uIG1hc3NpdmUKKyAgICAjIGFtb3VudHMgb2YgYWRkaXRpb25hbCBhcmd1bWVudHMgYmVmb3JlIHBhc3NpbmcgdGhlbSB0byB0aGUgbGlua2VyLgorICAgICMgSXQgYXBwZWFycyBhcyB0aG91Z2ggMS8yIGlzIGEgdXNhYmxlIHZhbHVlLgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwvIDJgCisgICAgOzsKKyAgZXNhYworXSkKK2lmIHRlc3QgLW4gJGx0X2N2X3N5c19tYXhfY21kX2xlbiA7IHRoZW4KKyAgQUNfTVNHX1JFU1VMVCgkbHRfY3Zfc3lzX21heF9jbWRfbGVuKQorZWxzZQorICBBQ19NU0dfUkVTVUxUKG5vbmUpCitmaQorXSkjIEFDX0xJQlRPT0xfU1lTX01BWF9DTURfTEVOCisKKworIyBfTFRfQUNfQ0hFQ0tfRExGQ04KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtfTFRfQUNfQ0hFQ0tfRExGQ05dLAorW0FDX0NIRUNLX0hFQURFUlMoZGxmY24uaClkbmwKK10pIyBfTFRfQUNfQ0hFQ0tfRExGQ04KKworCisjIF9MVF9BQ19UUllfRExPUEVOX1NFTEYgKEFDVElPTi1JRi1UUlVFLCBBQ1RJT04tSUYtVFJVRS1XLVVTQ09SRSwKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ1RJT04tSUYtRkFMU0UsIEFDVElPTi1JRi1DUk9TUy1DT01QSUxJTkcpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW19MVF9BQ19UUllfRExPUEVOX1NFTEZdLAorW0FDX1JFUVVJUkUoW19MVF9BQ19DSEVDS19ETEZDTl0pZG5sCitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgIFskNF0KK2Vsc2UKKyAgbHRfZGx1bmtub3duPTA7IGx0X2Rsbm9fdXNjb3JlPTE7IGx0X2RsbmVlZF91c2NvcmU9MgorICBsdF9zdGF0dXM9JGx0X2RsdW5rbm93bgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCitbI2xpbmUgX19vbGluZV9fICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworI2lmIEhBVkVfRExGQ05fSAorI2luY2x1ZGUgPGRsZmNuLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZmRlZiBSVExEX0dMT0JBTAorIyAgZGVmaW5lIExUX0RMR0xPQkFMCQlSVExEX0dMT0JBTAorI2Vsc2UKKyMgIGlmZGVmIERMX0dMT0JBTAorIyAgICBkZWZpbmUgTFRfRExHTE9CQUwJCURMX0dMT0JBTAorIyAgZWxzZQorIyAgICBkZWZpbmUgTFRfRExHTE9CQUwJCTAKKyMgIGVuZGlmCisjZW5kaWYKKworLyogV2UgbWF5IGhhdmUgdG8gZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cgaW4gdGhlIGNvbW1hbmQgbGluZSBpZiB3ZQorICAgZmluZCBvdXQgaXQgZG9lcyBub3Qgd29yayBpbiBzb21lIHBsYXRmb3JtLiAqLworI2lmbmRlZiBMVF9ETExBWllfT1JfTk9XCisjICBpZmRlZiBSVExEX0xBWlkKKyMgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJCVJUTERfTEFaWQorIyAgZWxzZQorIyAgICBpZmRlZiBETF9MQVpZCisjICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJCURMX0xBWlkKKyMgICAgZWxzZQorIyAgICAgIGlmZGVmIFJUTERfTk9XCisjICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwlSVExEX05PVworIyAgICAgIGVsc2UKKyMgICAgICAgIGlmZGVmIERMX05PVworIyAgICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwlETF9OT1cKKyMgICAgICAgIGVsc2UKKyMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJMAorIyAgICAgICAgZW5kaWYKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgdm9pZCBleGl0IChpbnQpOworI2VuZGlmCisKK3ZvaWQgZm5vcmQoKSB7IGludCBpPTQyO30KK2ludCBtYWluICgpCit7CisgIHZvaWQgKnNlbGYgPSBkbG9wZW4gKDAsIExUX0RMR0xPQkFMfExUX0RMTEFaWV9PUl9OT1cpOworICBpbnQgc3RhdHVzID0gJGx0X2RsdW5rbm93bjsKKworICBpZiAoc2VsZikKKyAgICB7CisgICAgICBpZiAoZGxzeW0gKHNlbGYsImZub3JkIikpICAgICAgIHN0YXR1cyA9ICRsdF9kbG5vX3VzY29yZTsKKyAgICAgIGVsc2UgaWYgKGRsc3ltKCBzZWxmLCJfZm5vcmQiKSkgc3RhdHVzID0gJGx0X2RsbmVlZF91c2NvcmU7CisgICAgICAvKiBkbGNsb3NlIChzZWxmKTsgKi8KKyAgICB9CisKKyAgICBleGl0IChzdGF0dXMpOworfV0KK0VPRgorICBpZiBBQ19UUllfRVZBTChhY19saW5rKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9IDI+L2Rldi9udWxsOyB0aGVuCisgICAgKC4vY29uZnRlc3Q7IGV4aXQ7ICkgMj4vZGV2L251bGwKKyAgICBsdF9zdGF0dXM9JD8KKyAgICBjYXNlIHgkbHRfc3RhdHVzIGluCisgICAgICB4JGx0X2Rsbm9fdXNjb3JlKSAkMSA7OworICAgICAgeCRsdF9kbG5lZWRfdXNjb3JlKSAkMiA7OworICAgICAgeCRsdF91bmtub3dufHgqKSAkMyA7OworICAgIGVzYWMKKyAgZWxzZSA6CisgICAgIyBjb21waWxhdGlvbiBmYWlsZWQKKyAgICAkMworICBmaQorZmkKK3JtIC1mciBjb25mdGVzdCoKK10pIyBfTFRfQUNfVFJZX0RMT1BFTl9TRUxGCisKKworIyBBQ19MSUJUT09MX0RMT1BFTl9TRUxGCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtBQ19MSUJUT09MX0RMT1BFTl9TRUxGXSwKK1tBQ19SRVFVSVJFKFtfTFRfQUNfQ0hFQ0tfRExGQ05dKWRubAoraWYgdGVzdCAieCRlbmFibGVfZGxvcGVuIiAhPSB4eWVzOyB0aGVuCisgIGVuYWJsZV9kbG9wZW49dW5rbm93bgorICBlbmFibGVfZGxvcGVuX3NlbGY9dW5rbm93bgorICBlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPXVua25vd24KK2Vsc2UKKyAgbHRfY3ZfZGxvcGVuPW5vCisgIGx0X2N2X2Rsb3Blbl9saWJzPQorCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgYmVvcyopCisgICAgbHRfY3ZfZGxvcGVuPSJsb2FkX2FkZF9vbiIKKyAgICBsdF9jdl9kbG9wZW5fbGlicz0KKyAgICBsdF9jdl9kbG9wZW5fc2VsZj15ZXMKKyAgICA7OworCisgIG1pbmd3KiB8IHB3MzIqKQorICAgIGx0X2N2X2Rsb3Blbj0iTG9hZExpYnJhcnkiCisgICAgbHRfY3ZfZGxvcGVuX2xpYnM9CisgICA7OworCisgIGN5Z3dpbiopCisgICAgbHRfY3ZfZGxvcGVuPSJkbG9wZW4iCisgICAgbHRfY3ZfZGxvcGVuX2xpYnM9CisgICA7OworCisgIGRhcndpbiopCisgICMgaWYgbGliZGwgaXMgaW5zdGFsbGVkIHdlIG5lZWQgdG8gbGluayBhZ2FpbnN0IGl0CisgICAgQUNfQ0hFQ0tfTElCKFtkbF0sIFtkbG9wZW5dLAorCQlbbHRfY3ZfZGxvcGVuPSJkbG9wZW4iIGx0X2N2X2Rsb3Blbl9saWJzPSItbGRsIl0sWworICAgIGx0X2N2X2Rsb3Blbj0iZHlsZCIKKyAgICBsdF9jdl9kbG9wZW5fbGlicz0KKyAgICBsdF9jdl9kbG9wZW5fc2VsZj15ZXMKKyAgICBdKQorICAgOzsKKworICAqKQorICAgIEFDX0NIRUNLX0ZVTkMoW3NobF9sb2FkXSwKKwkgIFtsdF9jdl9kbG9wZW49InNobF9sb2FkIl0sCisgICAgICBbQUNfQ0hFQ0tfTElCKFtkbGRdLCBbc2hsX2xvYWRdLAorCSAgICBbbHRfY3ZfZGxvcGVuPSJzaGxfbG9hZCIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1kbGQiXSwKKwlbQUNfQ0hFQ0tfRlVOQyhbZGxvcGVuXSwKKwkgICAgICBbbHRfY3ZfZGxvcGVuPSJkbG9wZW4iXSwKKwkgIFtBQ19DSEVDS19MSUIoW2RsXSwgW2Rsb3Blbl0sCisJCVtsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiXSwKKwkgICAgW0FDX0NIRUNLX0xJQihbc3ZsZF0sIFtkbG9wZW5dLAorCQkgIFtsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sc3ZsZCJdLAorCSAgICAgIFtBQ19DSEVDS19MSUIoW2RsZF0sIFtkbGRfbGlua10sCisJCSAgICBbbHRfY3ZfZGxvcGVuPSJkbGRfbGluayIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1kbGQiXSkKKwkgICAgICBdKQorCSAgICBdKQorCSAgXSkKKwldKQorICAgICAgXSkKKyAgICA7OworICBlc2FjCisKKyAgaWYgdGVzdCAieCRsdF9jdl9kbG9wZW4iICE9IHhubzsgdGhlbgorICAgIGVuYWJsZV9kbG9wZW49eWVzCisgIGVsc2UKKyAgICBlbmFibGVfZGxvcGVuPW5vCisgIGZpCisKKyAgY2FzZSAkbHRfY3ZfZGxvcGVuIGluCisgIGRsb3BlbikKKyAgICBzYXZlX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCisgICAgdGVzdCAieCRhY19jdl9oZWFkZXJfZGxmY25faCIgPSB4eWVzICYmIENQUEZMQUdTPSIkQ1BQRkxBR1MgLURIQVZFX0RMRkNOX0giCisKKyAgICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorICAgIGV2YWwgTERGTEFHUz1cIlwkTERGTEFHUyAkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXCIKKworICAgIHNhdmVfTElCUz0iJExJQlMiCisgICAgTElCUz0iJGx0X2N2X2Rsb3Blbl9saWJzICRMSUJTIgorCisgICAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgYSBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmXSwKKwkgIGx0X2N2X2Rsb3Blbl9zZWxmLCBbZG5sCisJICBfTFRfQUNfVFJZX0RMT1BFTl9TRUxGKAorCSAgICBsdF9jdl9kbG9wZW5fc2VsZj15ZXMsIGx0X2N2X2Rsb3Blbl9zZWxmPXllcywKKwkgICAgbHRfY3ZfZGxvcGVuX3NlbGY9bm8sIGx0X2N2X2Rsb3Blbl9zZWxmPWNyb3NzKQorICAgIF0pCisKKyAgICBpZiB0ZXN0ICJ4JGx0X2N2X2Rsb3Blbl9zZWxmIiA9IHh5ZXM7IHRoZW4KKyAgICAgIExERkxBR1M9IiRMREZMQUdTICRsaW5rX3N0YXRpY19mbGFnIgorICAgICAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgYSBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmXSwKKyAgICAJICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMsIFtkbmwKKwkgIF9MVF9BQ19UUllfRExPUEVOX1NFTEYoCisJICAgIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz15ZXMsIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz15ZXMsCisJICAgIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz1ubywgIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz1jcm9zcykKKyAgICAgIF0pCisgICAgZmkKKworICAgIENQUEZMQUdTPSIkc2F2ZV9DUFBGTEFHUyIKKyAgICBMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgorICAgIExJQlM9IiRzYXZlX0xJQlMiCisgICAgOzsKKyAgZXNhYworCisgIGNhc2UgJGx0X2N2X2Rsb3Blbl9zZWxmIGluCisgIHllc3xubykgZW5hYmxlX2Rsb3Blbl9zZWxmPSRsdF9jdl9kbG9wZW5fc2VsZiA7OworICAqKSBlbmFibGVfZGxvcGVuX3NlbGY9dW5rbm93biA7OworICBlc2FjCisKKyAgY2FzZSAkbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIGluCisgIHllc3xubykgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz0kbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIDs7CisgICopIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9dW5rbm93biA7OworICBlc2FjCitmaQorXSkjIEFDX0xJQlRPT0xfRExPUEVOX1NFTEYKKworCisjIEFDX0xJQlRPT0xfUFJPR19DQ19DX08oW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgdG8gc2VlIGlmIG9wdGlvbnMgLWMgYW5kIC1vIGFyZSBzaW11bHRhbmVvdXNseSBzdXBwb3J0ZWQgYnkgY29tcGlsZXIKK0FDX0RFRlVOKFtBQ19MSUJUT09MX1BST0dfQ0NfQ19PXSwKK1tBQ19SRVFVSVJFKFtfTFRfQUNfU1lTX0NPTVBJTEVSXSlkbmwKK0FDX0NBQ0hFX0NIRUNLKFtpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0XSwKKyAgW19MVF9BQ19UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9jX28sICQxKV0sCisgIFtfTFRfQUNfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfY19vLCAkMSk9bm8KKyAgICRybSAtciBjb25mdGVzdCAyPi9kZXYvbnVsbAorICAgbWtkaXIgY29uZnRlc3QKKyAgIGNkIGNvbmZ0ZXN0CisgICBta2RpciBvdXQKKyAgIHByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisKKyAgIGx0X2NvbXBpbGVyX2ZsYWc9Ii1vIG91dC9jb25mdGVzdDIuJGFjX29iamV4dCIKKyAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCisgICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgorICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucworICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KKyAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAorICAgLWUgJ3M6LipGTEFHU30/IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAorICAgLWUgJ3M6IFtbXiBdXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCisgICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAorICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOl9fb2xpbmVfXzogJGx0X2NvbXBpbGVcIiIgPiZBU19NRVNTQUdFX0xPR19GRCkKKyAgIChldmFsICIkbHRfY29tcGlsZSIgMj5vdXQvY29uZnRlc3QuZXJyKQorICAgYWNfc3RhdHVzPSQ/CisgICBjYXQgb3V0L2NvbmZ0ZXN0LmVyciA+JkFTX01FU1NBR0VfTE9HX0ZECisgICBlY2hvICIkYXNfbWU6X19vbGluZV9fOiBcJD8gPSAkYWNfc3RhdHVzIiA+JkFTX01FU1NBR0VfTE9HX0ZECisgICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zIG91dC9jb25mdGVzdDIuJGFjX29iamV4dAorICAgdGhlbgorICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKKyAgICAgaWYgdGVzdCAhIC1zIG91dC9jb25mdGVzdC5lcnI7IHRoZW4KKyAgICAgICBfTFRfQUNfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfY19vLCAkMSk9eWVzCisgICAgIGZpCisgICBmaQorICAgY2htb2QgdSt3IC4KKyAgICRybSBjb25mdGVzdCoKKyAgICMgU0dJIEMrKyBjb21waWxlciB3aWxsIGNyZWF0ZSBkaXJlY3Rvcnkgb3V0L2lpX2ZpbGVzLyBmb3IKKyAgICMgdGVtcGxhdGUgaW5zdGFudGlhdGlvbgorICAgdGVzdCAtZCBvdXQvaWlfZmlsZXMgJiYgJHJtIG91dC9paV9maWxlcy8qICYmIHJtZGlyIG91dC9paV9maWxlcworICAgJHJtIG91dC8qICYmIHJtZGlyIG91dAorICAgY2QgLi4KKyAgIHJtZGlyIGNvbmZ0ZXN0CisgICAkcm0gY29uZnRlc3QqCitdKQorXSkjIEFDX0xJQlRPT0xfUFJPR19DQ19DX08KKworCisjIEFDX0xJQlRPT0xfU1lTX0hBUkRfTElOS19MT0NLUyhbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIHRvIHNlZSBpZiB3ZSBjYW4gZG8gaGFyZCBsaW5rcyB0byBsb2NrIHNvbWUgZmlsZXMgaWYgbmVlZGVkCitBQ19ERUZVTihbQUNfTElCVE9PTF9TWVNfSEFSRF9MSU5LX0xPQ0tTXSwKK1tBQ19SRVFVSVJFKFtfTFRfQUNfTE9DS10pZG5sCisKK2hhcmRfbGlua3M9Im5vdHRlc3RlZCIKK2lmIHRlc3QgIiRfTFRfQUNfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfY19vLCAkMSkiID0gbm8gJiYgdGVzdCAiJG5lZWRfbG9ja3MiICE9IG5vOyB0aGVuCisgICMgZG8gbm90IG92ZXJ3cml0ZSB0aGUgdmFsdWUgb2YgbmVlZF9sb2NrcyBwcm92aWRlZCBieSB0aGUgdXNlcgorICBBQ19NU0dfQ0hFQ0tJTkcoW2lmIHdlIGNhbiBsb2NrIHdpdGggaGFyZCBsaW5rc10pCisgIGhhcmRfbGlua3M9eWVzCisgICRybSBjb25mdGVzdCoKKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KKyAgdG91Y2ggY29uZnRlc3QuYQorICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4mNSB8fCBoYXJkX2xpbmtzPW5vCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCisgIEFDX01TR19SRVNVTFQoWyRoYXJkX2xpbmtzXSkKKyAgaWYgdGVzdCAiJGhhcmRfbGlua3MiID0gbm87IHRoZW4KKyAgICBBQ19NU0dfV0FSTihbYCRDQycgZG9lcyBub3Qgc3VwcG9ydCBgLWMgLW8nLCBzbyBgbWFrZSAtaicgbWF5IGJlIHVuc2FmZV0pCisgICAgbmVlZF9sb2Nrcz13YXJuCisgIGZpCitlbHNlCisgIG5lZWRfbG9ja3M9bm8KK2ZpCitdKSMgQUNfTElCVE9PTF9TWVNfSEFSRF9MSU5LX0xPQ0tTCisKKworIyBBQ19MSUJUT09MX09CSkRJUgorIyAtLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0FDX0xJQlRPT0xfT0JKRElSXSwKK1tBQ19DQUNIRV9DSEVDSyhbZm9yIG9iamRpcl0sIFtsdF9jdl9vYmpkaXJdLAorW3JtIC1mIC5saWJzIDI+L2Rldi9udWxsCitta2RpciAubGlicyAyPi9kZXYvbnVsbAoraWYgdGVzdCAtZCAubGliczsgdGhlbgorICBsdF9jdl9vYmpkaXI9LmxpYnMKK2Vsc2UKKyAgIyBNUy1ET1MgZG9lcyBub3QgYWxsb3cgZmlsZW5hbWVzIHRoYXQgYmVnaW4gd2l0aCBhIGRvdC4KKyAgbHRfY3Zfb2JqZGlyPV9saWJzCitmaQorcm1kaXIgLmxpYnMgMj4vZGV2L251bGxdKQorb2JqZGlyPSRsdF9jdl9vYmpkaXIKK10pIyBBQ19MSUJUT09MX09CSkRJUgorCisKKyMgQUNfTElCVE9PTF9QUk9HX0xEX0hBUkRDT0RFX0xJQlBBVEgoW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIGhhcmRjb2RpbmcgYXR0cmlidXRlcy4KK0FDX0RFRlVOKFtBQ19MSUJUT09MX1BST0dfTERfSEFSRENPREVfTElCUEFUSF0sCitbQUNfTVNHX0NIRUNLSU5HKFtob3cgdG8gaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIHByb2dyYW1zXSkKK19MVF9BQ19UQUdWQVIoaGFyZGNvZGVfYWN0aW9uLCAkMSk9CitpZiB0ZXN0IC1uICIkX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSkiIHx8IFwKKyAgIHRlc3QgLW4gIiRfTFRfQUNfVEFHVkFSKHJ1bnBhdGhfdmFyICQxKSIgfHwgXAorICAgdGVzdCAiWCRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpIj0iWHllcyIgOyB0aGVuCisKKyAgIyBXZSBjYW4gaGFyZGNvZGUgbm9uLWV4aXN0YW50IGRpcmVjdG9yaWVzLgorICBpZiB0ZXN0ICIkX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKSIgIT0gbm8gJiYKKyAgICAgIyBJZiB0aGUgb25seSBtZWNoYW5pc20gdG8gYXZvaWQgaGFyZGNvZGluZyBpcyBzaGxpYnBhdGhfdmFyLCB3ZQorICAgICAjIGhhdmUgdG8gcmVsaW5rLCBvdGhlcndpc2Ugd2UgbWlnaHQgbGluayB3aXRoIGFuIGluc3RhbGxlZCBsaWJyYXJ5CisgICAgICMgd2hlbiB3ZSBzaG91bGQgYmUgbGlua2luZyB3aXRoIGEgeWV0LXRvLWJlLWluc3RhbGxlZCBvbmUKKyAgICAgIyMgdGVzdCAiJF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpIiAhPSBubyAmJgorICAgICB0ZXN0ICIkX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSkiICE9IG5vOyB0aGVuCisgICAgIyBMaW5raW5nIGFsd2F5cyBoYXJkY29kZXMgdGhlIHRlbXBvcmFyeSBsaWJyYXJ5IGRpcmVjdG9yeS4KKyAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpPXJlbGluaworICBlbHNlCisgICAgIyBXZSBjYW4gbGluayB3aXRob3V0IGhhcmRjb2RpbmcsIGFuZCB3ZSBjYW4gaGFyZGNvZGUgbm9uZXhpc3RpbmcgZGlycy4KKyAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpPWltbWVkaWF0ZQorICBmaQorZWxzZQorICAjIFdlIGNhbm5vdCBoYXJkY29kZSBhbnl0aGluZywgb3IgZWxzZSB3ZSBjYW4gb25seSBoYXJkY29kZSBleGlzdGluZworICAjIGRpcmVjdG9yaWVzLgorICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpPXVuc3VwcG9ydGVkCitmaQorQUNfTVNHX1JFU1VMVChbJF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfYWN0aW9uLCAkMSldKQorCitpZiB0ZXN0ICIkX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9hY3Rpb24sICQxKSIgPSByZWxpbms7IHRoZW4KKyAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkCisgIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KK2VsaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgfHwKKyAgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm87IHRoZW4KKyAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3QgbmVjZXNzYXJ5CisgIGVuYWJsZV9mYXN0X2luc3RhbGw9bmVlZGxlc3MKK2ZpCitdKSMgQUNfTElCVE9PTF9QUk9HX0xEX0hBUkRDT0RFX0xJQlBBVEgKKworCisjIEFDX0xJQlRPT0xfU1lTX0xJQl9TVFJJUAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtBQ19MSUJUT09MX1NZU19MSUJfU1RSSVBdLAorW3N0cmlwbGliPQorb2xkX3N0cmlwbGliPQorQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHN0cmlwcGluZyBsaWJyYXJpZXMgaXMgcG9zc2libGVdKQoraWYgdGVzdCAtbiAiJFNUUklQIiAmJiAkU1RSSVAgLVYgMj4mMSB8IGdyZXAgIkdOVSBzdHJpcCIgPi9kZXYvbnVsbDsgdGhlbgorICB0ZXN0IC16ICIkb2xkX3N0cmlwbGliIiAmJiBvbGRfc3RyaXBsaWI9IiRTVFJJUCAtLXN0cmlwLWRlYnVnIgorICB0ZXN0IC16ICIkc3RyaXBsaWIiICYmIHN0cmlwbGliPSIkU1RSSVAgLS1zdHJpcC11bm5lZWRlZCIKKyAgQUNfTVNHX1JFU1VMVChbeWVzXSkKK2Vsc2UKKyMgRklYTUUgLSBpbnNlcnQgc29tZSByZWFsIHRlc3RzLCBob3N0X29zIGlzbid0IHJlYWxseSBnb29kIGVub3VnaAorICBjYXNlICRob3N0X29zIGluCisgICBkYXJ3aW4qKQorICAgICAgIGlmIHRlc3QgLW4gIiRTVFJJUCIgOyB0aGVuCisgICAgICAgICBzdHJpcGxpYj0iJFNUUklQIC14IgorICAgICAgICAgQUNfTVNHX1JFU1VMVChbeWVzXSkKKyAgICAgICBlbHNlCisgIEFDX01TR19SRVNVTFQoW25vXSkKK2ZpCisgICAgICAgOzsKKyAgICopCisgIEFDX01TR19SRVNVTFQoW25vXSkKKyAgICA7OworICBlc2FjCitmaQorXSkjIEFDX0xJQlRPT0xfU1lTX0xJQl9TVFJJUAorCisKKyMgQUNfTElCVE9PTF9TWVNfRFlOQU1JQ19MSU5LRVIKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUE9SVE1FIEZpbGwgaW4geW91ciBsZC5zbyBjaGFyYWN0ZXJpc3RpY3MKK0FDX0RFRlVOKFtBQ19MSUJUT09MX1NZU19EWU5BTUlDX0xJTktFUl0sCitbQUNfTVNHX0NIRUNLSU5HKFtkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3NdKQorbGlicmFyeV9uYW1lc19zcGVjPQorbGlibmFtZV9zcGVjPSdsaWIkbmFtZScKK3NvbmFtZV9zcGVjPQorc2hyZXh0X2NtZHM9Ii5zbyIKK3Bvc3RpbnN0YWxsX2NtZHM9Citwb3N0dW5pbnN0YWxsX2NtZHM9CitmaW5pc2hfY21kcz0KK2ZpbmlzaF9ldmFsPQorc2hsaWJwYXRoX3Zhcj0KK3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD11bmtub3duCit2ZXJzaW9uX3R5cGU9bm9uZQorZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgorc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIiCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCBncmVwICJebGlicmFyaWVzOiIgfCAkU0VEIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICJzLD0vLC8sZyJgCisgIGlmIGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgZ3JlcCAnOycgPi9kZXYvbnVsbCA7IHRoZW4KKyAgICAjIGlmIHRoZSBwYXRoIGNvbnRhaW5zICI7IiB0aGVuIHdlIGFzc3VtZSBpdCB0byBiZSB0aGUgc2VwYXJhdG9yCisgICAgIyBvdGhlcndpc2UgZGVmYXVsdCB0byB0aGUgc3RhbmRhcmQgcGF0aCBzZXBhcmF0b3IgKGkuZS4gIjoiKSAtIGl0IGlzCisgICAgIyBhc3N1bWVkIHRoYXQgbm8gcGFydCBvZiBhIG5vcm1hbCBwYXRobmFtZSBjb250YWlucyAiOyIgYnV0IHRoYXQgc2hvdWxkCisgICAgIyBva2F5IGluIHRoZSByZWFsIHdvcmxkIHdoZXJlICI7IiBpbiBkaXJwYXRocyBpcyBpdHNlbGYgcHJvYmxlbWF0aWMuCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgJ3MvOy8gL2cnYAorICBlbHNlCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAorICBmaQorZWxzZQorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIiCitmaQorbmVlZF9saWJfcHJlZml4PXVua25vd24KK2hhcmRjb2RlX2ludG9fbGlicz1ubworCisjIHdoZW4geW91IHNldCBuZWVkX3ZlcnNpb24gdG8gbm8sIG1ha2Ugc3VyZSBpdCBkb2VzIG5vdCBjYXVzZSAtc2V0X3ZlcnNpb24KKyMgZmxhZ3MgdG8gYmUgbGVmdCB3aXRob3V0IGFyZ3VtZW50cworbmVlZF92ZXJzaW9uPXVua25vd24KKworY2FzZSAkaG9zdF9vcyBpbgorYWl4MyopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUuYScKKyAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisKKyAgIyBBSVggMyBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyB3ZSBhcHBlbmQgYSBtYWpvciB2ZXJzaW9uIHRvIHRoZSBuYW1lLgorICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICA7OworCithaXg0KiB8IGFpeDUqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisgICAgIyBBSVggNSBzdXBwb3J0cyBJQTY0CisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgZWxzZQorICAgICMgV2l0aCBHQ0MgdXAgdG8gMi45NS54LCBjb2xsZWN0MiB3b3VsZCBjcmVhdGUgYW4gaW1wb3J0IGZpbGUKKyAgICAjIGZvciBkZXBlbmRlbmNlIGxpYnJhcmllcy4gIFRoZSBpbXBvcnQgZmlsZSB3b3VsZCBzdGFydCB3aXRoCisgICAgIyB0aGUgbGluZSBgIyEgLicuICBUaGlzIHdvdWxkIGNhdXNlIHRoZSBnZW5lcmF0ZWQgbGlicmFyeSB0bworICAgICMgZGVwZW5kIG9uIGAuJywgYWx3YXlzIGFuIGludmFsaWQgbGlicmFyeS4gIFRoaXMgd2FzIGZpeGVkIGluCisgICAgIyBkZXZlbG9wbWVudCBzbmFwc2hvdHMgb2YgR0NDIHByaW9yIHRvIDMuMC4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXg0IHwgYWl4NC5bWzAxXV0gfCBhaXg0LltbMDFdXS4qKQorICAgICAgaWYgeyBlY2hvICcjaWYgX19HTlVDX18gPiAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID49IDk3KScKKwkgICBlY2hvICcgeWVzICcKKwkgICBlY2hvICcjZW5kaWYnOyB9IHwgJHtDQ30gLUUgLSB8IGdyZXAgeWVzID4gL2Rldi9udWxsOyB0aGVuCisJOgorICAgICAgZWxzZQorCWNhbl9idWlsZF9zaGFyZWQ9bm8KKyAgICAgIGZpCisgICAgICA7OworICAgIGVzYWMKKyAgICAjIEFJWCAob24gUG93ZXIqKSBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyBjdXJyZW50bHkgd2UgY2FuIG5vdCBoYXJkY29kZSBjb3JyZWN0CisgICAgIyBzb25hbWUgaW50byBleGVjdXRhYmxlLiBQcm9iYWJseSB3ZSBjYW4gYWRkIHZlcnNpb25pbmcgc3VwcG9ydCB0bworICAgICMgY29sbGVjdDIsIHNvIGFkZGl0aW9uYWwgbGlua3MgY2FuIGJlIHVzZWZ1bCBpbiBmdXR1cmUuCisgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisgICAgICAjIElmIHVzaW5nIHJ1biB0aW1lIGxpbmtpbmcgKG9uIEFJWCA0LjIgb3IgbGF0ZXIpIHVzZSBsaWI8bmFtZT4uc28KKyAgICAgICMgaW5zdGVhZCBvZiBsaWI8bmFtZT4uYSB0byBsZXQgcGVvcGxlIGtub3cgdGhhdCB0aGVzZSBhcmUgbm90CisgICAgICAjIHR5cGljYWwgQUlYIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBlbHNlCisgICAgICAjIFdlIHByZXNlcnZlIC5hIGFzIGV4dGVuc2lvbiBmb3Igc2hhcmVkIGxpYnJhcmllcyB0aHJvdWdoIEFJWDQuMgorICAgICAgIyBhbmQgbGF0ZXIgd2hlbiB3ZSBhcmUgbm90IGRvaW5nIHJ1biB0aW1lIGxpbmtpbmcuCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LmEgJGxpYm5hbWUuYScKKyAgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgZmkKKyAgICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKKyAgZmkKKyAgOzsKKworYW1pZ2FvcyopCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuaXhsaWJyYXJ5ICRsaWJuYW1lLmEnCisgICMgQ3JlYXRlICR7bGlibmFtZX1faXhsaWJyYXJ5LmEgZW50cmllcyBpbiAvc3lzL2xpYnMuCisgIGZpbmlzaF9ldmFsPSdmb3IgbGliIGluIGBscyAkbGliZGlyLyouaXhsaWJyYXJ5IDI+L2Rldi9udWxsYDsgZG8gbGlibmFtZT1gJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdcJydzJV4uKi9cKFtbXi9dXSpcKVwuaXhsaWJyYXJ5JCVcMSUnXCcnYDsgdGVzdCAkcm0gL3N5cy9saWJzLyR7bGlibmFtZX1faXhsaWJyYXJ5LmE7ICRzaG93ICJjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIjsgY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSB8fCBleGl0IDE7IGRvbmUnCisgIDs7CisKK2Jlb3MqKQorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCisgIHNobGlicGF0aF92YXI9TElCUkFSWV9QQVRICisgIDs7CisKK2JzZGk0KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9YMTEvbGliIC91c3IvY29udHJpYi9saWIgL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgIyB0aGUgZGVmYXVsdCBsZC5zby5jb25mIGFsc28gY29udGFpbnMgL3Vzci9jb250cmliL2xpYiBhbmQKKyAgIyAvdXNyL1gxMVI2L2xpYiAoL3Vzci9YMTEgaXMgYSBsaW5rIHRvIC91c3IvWDExUjYpLCBidXQgbGV0IHVzIGFsbG93CisgICMgbGlidG9vbCB0byBoYXJkLWNvZGUgdGhlc2UgaW50byBwcm9ncmFtcworICA7OworCitjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisgIHZlcnNpb25fdHlwZT13aW5kb3dzCisgIHNocmV4dF9jbWRzPSIuZGxsIgorICBuZWVkX3ZlcnNpb249bm8KKyAgbmVlZF9saWJfcHJlZml4PW5vCisKKyAgY2FzZSAkR0NDLCRob3N0X29zIGluCisgIHllcyxjeWd3aW4qIHwgeWVzLG1pbmd3KiB8IHllcyxwdzMyKikKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLmRsbC5hJworICAgICMgRExMIGlzIGluc3RhbGxlZCB0byAkKGxpYmRpcikvLi4vYmluIGJ5IHBvc3RpbnN0YWxsX2NtZHMKKyAgICBwb3N0aW5zdGFsbF9jbWRzPSdiYXNlX2ZpbGU9YGJhc2VuYW1lIFwke2ZpbGV9YH4KKyAgICAgIGRscGF0aD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGRpci8nXCcnXCR7YmFzZV9maWxlfSdcJydpO2VjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRsZGlyPSRkZXN0ZGlyL2BkaXJuYW1lIFwkZGxwYXRoYH4KKyAgICAgIHRlc3QgLWQgXCRkbGRpciB8fCBta2RpciAtcCBcJGRsZGlyfgorICAgICAgJGluc3RhbGxfcHJvZyAkZGlyLyRkbG5hbWUgXCRkbGRpci8kZGxuYW1lJworICAgIHBvc3R1bmluc3RhbGxfY21kcz0nZGxkbGw9YCRTSEVMTCAyPiYxIC1jICdcJycuICRmaWxlOyBlY2hvIFwkZGxuYW1lJ1wnJ2B+CisgICAgICBkbHBhdGg9JGRpci9cJGRsZGxsfgorICAgICAgICRybSBcJGRscGF0aCcKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgY3lnd2luKikKKyAgICAgICMgQ3lnd2luIERMTHMgdXNlICdjeWcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJworICAgICAgc29uYW1lX3NwZWM9J2BlY2hvICR7bGlibmFtZX0gfCBzZWQgLWUgJ3MvXmxpYi9jeWcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bWy5dXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliIC9saWIvdzMyYXBpIC9saWIgL3Vzci9sb2NhbC9saWIiCisgICAgICA7OworICAgIG1pbmd3KikKKyAgICAgICMgTWluR1cgRExMcyB1c2UgdHJhZGl0aW9uYWwgJ2xpYicgcHJlZml4CisgICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1tbLl1dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IGdyZXAgIl5saWJyYXJpZXM6IiB8ICRTRUQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgInMsPS8sLyxnImAKKyAgICAgIGlmIGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgW2dyZXAgJztbYy16Qy1aXTovJyA+L2Rldi9udWxsXTsgdGhlbgorICAgICAgICAjIEl0IGlzIG1vc3QgcHJvYmFibHkgYSBXaW5kb3dzIGZvcm1hdCBQQVRIIHByaW50ZWQgYnkKKyAgICAgICAgIyBtaW5ndyBnY2MsIGJ1dCB3ZSBhcmUgcnVubmluZyBvbiBDeWd3aW4uIEdjYyBwcmludHMgaXRzIHNlYXJjaAorICAgICAgICAjIHBhdGggd2l0aCA7IHNlcGFyYXRvcnMsIGFuZCB3aXRoIGRyaXZlIGxldHRlcnMuIFdlIGNhbiBoYW5kbGUgdGhlCisgICAgICAgICMgZHJpdmUgbGV0dGVycyAoY3lnd2luIGZpbGV1dGlscyB1bmRlcnN0YW5kcyB0aGVtKSwgc28gbGVhdmUgdGhlbSwKKyAgICAgICAgIyBlc3BlY2lhbGx5IGFzIHdlIG1pZ2h0IHBhc3MgZmlsZXMgZm91bmQgdGhlcmUgdG8gYSBtaW5ndyBvYmpkdW1wLAorICAgICAgICAjIHdoaWNoIHdvdWxkbid0IHVuZGVyc3RhbmQgYSBjeWd3aW5pZmllZCBwYXRoLiBBaGguCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICdzLzsvIC9nJ2AKKyAgICAgIGVsc2UKKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAorICAgICAgZmkKKyAgICAgIDs7CisgICAgcHczMiopCisgICAgICAjIHB3MzIgRExMcyB1c2UgJ3B3JyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL3B3LydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKKyAgICAgIDs7CisgICAgZXNhYworICAgIDs7CisKKyAgKikKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bWy5dXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUubGliJworICAgIDs7CisgIGVzYWMKKyAgZHluYW1pY19saW5rZXI9J1dpbjMyIGxkLmV4ZScKKyAgIyBGSVhNRTogZmlyc3Qgd2Ugc2hvdWxkIHNlYXJjaCAuIGFuZCB0aGUgZGlyZWN0b3J5IHRoZSBleGVjdXRhYmxlIGlzIGluCisgIHNobGlicGF0aF92YXI9UEFUSAorICA7OworCitkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZHlsZCIKKyAgdmVyc2lvbl90eXBlPWRhcndpbgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3ZlcnN1ZmZpeH0kc2hhcmVkX2V4dCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7bWFqb3J9JHNoYXJlZF9leHQgJHtsaWJuYW1lfSRzaGFyZWRfZXh0JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0JworICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIHNobGlicGF0aF92YXI9RFlMRF9MSUJSQVJZX1BBVEgKKyAgc2hyZXh0X2NtZHM9JyQodGVzdCAuJG1vZHVsZSA9IC55ZXMgJiYgZWNobyAuc28gfHwgZWNobyAuZHlsaWIpJworICAjIEFwcGxlJ3MgZ2NjIHByaW50cyAnZ2NjIC1wcmludC1zZWFyY2gtZGlycycgZG9lc24ndCBvcGVyYXRlIHRoZSBzYW1lLgorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IHRyICJcbiIgIiRQQVRIX1NFUEFSQVRPUiIgfCBzZWQgLWUgJ3MvbGlicmFyaWVzOi9AbGlicmFyaWVzOi8nIHwgdHIgIkAiICJcbiIgfCBncmVwICJebGlicmFyaWVzOiIgfCBzZWQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgInMsPS8sLyxnIiAtZSAicywkUEFUSF9TRVBBUkFUT1IsICxnIiAtZSAicywuKiwmIC9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIsZyJgCisgIGVsc2UKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWInCisgIGZpCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvbGliIC91c3IvbGliJworICA7OworCitkZ3V4KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSRzaGFyZWRfZXh0JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCitmcmVlYnNkMSopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7CisKK2tmcmVlYnNkKi1nbnUpCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGR5bmFtaWNfbGlua2VyPSdHTlUgbGQuc28nCisgIDs7CisKK2ZyZWVic2QqKQorICBvYmpmb3JtYXQ9YHRlc3QgLXggL3Vzci9iaW4vb2JqZm9ybWF0ICYmIC91c3IvYmluL29iamZvcm1hdCB8fCBlY2hvIGFvdXRgCisgIHZlcnNpb25fdHlwZT1mcmVlYnNkLSRvYmpmb3JtYXQKKyAgY2FzZSAkdmVyc2lvbl90eXBlIGluCisgICAgZnJlZWJzZC1lbGYqKQorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgICBuZWVkX3ZlcnNpb249bm8KKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgOzsKKyAgICBmcmVlYnNkLSopCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgICAgIG5lZWRfdmVyc2lvbj15ZXMKKyAgICAgIDs7CisgIGVzYWMKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBmcmVlYnNkMiopCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIDs7CisgIGZyZWVic2QzLlswMV0qIHwgZnJlZWJzZGVsZjMuWzAxXSopCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICAqKSAjIGZyb20gMy4yIG9uCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIDs7CisgIGVzYWMKKyAgOzsKKworZ251KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR7bWFqb3J9ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK2hwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorICAjIEdpdmUgYSBzb25hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgbWFqb3IgdmVyc2lvbiBzbyB0aGF0IGRsZC5zbCByZWZ1c2VzIHRvCisgICMgbGluayBhZ2FpbnN0IG90aGVyIHZlcnNpb25zLgorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBjYXNlICIkaG9zdF9jcHUiIGluCisgIGlhNjQqKQorICAgIHNocmV4dF9jbWRzPScuc28nCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc28iCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzICMgVW5sZXNzICtub2VudnZhciBpcyBzcGVjaWZpZWQuCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBpZiB0ZXN0ICJYJEhQVVhfSUE2NF9NT0RFIiA9IFgzMjsgdGhlbgorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9ocHV4MzIgL3Vzci9sb2NhbC9saWIvaHB1eDMyIC91c3IvbG9jYWwvbGliIgorICAgIGVsc2UKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvaHB1eDY0IC91c3IvbG9jYWwvbGliL2hwdXg2NCIKKyAgICBmaQorICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKKyAgICA7OworICAgaHBwYSo2NCopCisgICAgIHNocmV4dF9jbWRzPScuc2wnCisgICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKKyAgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEggIyBIb3cgc2hvdWxkIHdlIGhhbmRsZSBTSExJQl9QQVRICisgICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMgIyBVbmxlc3MgK25vZW52dmFyIGlzIHNwZWNpZmllZC4KKyAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvcGEyMF82NCAvdXNyL2Njcy9saWIvcGEyMF82NCIKKyAgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYworICAgICA7OworICAgKikKKyAgICBzaHJleHRfY21kcz0nLnNsJworICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCisgICAgc2hsaWJwYXRoX3Zhcj1TSExJQl9QQVRICisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vICMgK3MgaXMgcmVxdWlyZWQgdG8gZW5hYmxlIFNITElCX1BBVEgKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIDs7CisgIGVzYWMKKyAgIyBIUC1VWCBydW5zICpyZWFsbHkqIHNsb3dseSB1bmxlc3Mgc2hhcmVkIGxpYnJhcmllcyBhcmUgbW9kZSA1NTUuCisgIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDU1NSAkbGliJworICA7OworCitpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorICBjYXNlICRob3N0X29zIGluCisgICAgbm9uc3RvcHV4KikgdmVyc2lvbl90eXBlPW5vbnN0b3B1eCA7OworICAgICopCisJaWYgdGVzdCAiJGx0X2N2X3Byb2dfZ251X2xkIiA9IHllczsgdGhlbgorCQl2ZXJzaW9uX3R5cGU9bGludXgKKwllbHNlCisJCXZlcnNpb25fdHlwZT1pcml4CisJZmkgOzsKKyAgZXNhYworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBpcml4NSogfCBub25zdG9wdXgqKQorICAgIGxpYnN1ZmY9IHNobGlic3VmZj0KKyAgICA7OworICAqKQorICAgIGNhc2UgJExEIGluICMgbGlidG9vbC5tNCB3aWxsIGFkZCBvbmUgb2YgdGhlc2Ugc3dpdGNoZXMgdG8gTEQKKyAgICAqLTMyfCoiLTMyICJ8Ki1tZWxmMzJic21pcHwqIi1tZWxmMzJic21pcCAiKQorICAgICAgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz0zMi1iaXQ7OworICAgICotbjMyfCoiLW4zMiAifCotbWVsZjMyYm1pcG4zMnwqIi1tZWxmMzJibWlwbjMyICIpCisgICAgICBsaWJzdWZmPTMyIHNobGlic3VmZj1OMzIgbGlibWFnaWM9TjMyOzsKKyAgICAqLTY0fCoiLTY0ICJ8Ki1tZWxmNjRibWlwfCoiLW1lbGY2NGJtaXAgIikKKyAgICAgIGxpYnN1ZmY9NjQgc2hsaWJzdWZmPTY0IGxpYm1hZ2ljPTY0LWJpdDs7CisgICAgKikgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz1uZXZlci1tYXRjaDs7CisgICAgZXNhYworICAgIDs7CisgIGVzYWMKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZJHtzaGxpYnN1ZmZ9X1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IC91c3IvbG9jYWwvbGliJHtsaWJzdWZmfSIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSIKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCisjIE5vIHNoYXJlZCBsaWIgc3VwcG9ydCBmb3IgTGludXggb2xkbGQsIGFvdXQsIG9yIGNvZmYuCitsaW51eCpvbGRsZCogfCBsaW51eCphb3V0KiB8IGxpbnV4KmNvZmYqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCisjIFRoaXMgbXVzdCBiZSBMaW51eCBFTEYuCitsaW51eCopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbiAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgIyBUaGlzIGltcGxpZXMgbm8gZmFzdF9pbnN0YWxsLCB3aGljaCBpcyB1bmFjY2VwdGFibGUuCisgICMgU29tZSByZXdvcmsgd2lsbCBiZSBuZWVkZWQgdG8gYWxsb3cgZm9yIGZhc3RfaW5zdGFsbAorICAjIGJlZm9yZSB0aGlzIGNhbiBiZSBlbmFibGVkLgorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisKKyAgIyBBcHBlbmQgbGQuc28uY29uZiBjb250ZW50cyB0byB0aGUgc2VhcmNoIHBhdGgKKyAgaWYgdGVzdCAtZiAvZXRjL2xkLnNvLmNvbmY7IHRoZW4KKyAgICBsdF9sZF9leHRyYT1gJFNFRCAtZSAncy9bOixcdF0vIC9nO3MvPVtePV0qJC8vO3MvPVtePSBdKiAvIC9nJyAvZXRjL2xkLnNvLmNvbmYgfCB0ciAnXG4nICcgJ2AKKyAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAkbHRfbGRfZXh0cmEiCisgIGZpCisKKyAgIyBXZSB1c2VkIHRvIHRlc3QgZm9yIC9saWIvbGQuc28uMSBhbmQgZGlzYWJsZSBzaGFyZWQgbGlicmFyaWVzIG9uCisgICMgcG93ZXJwYywgYmVjYXVzZSBNa0xpbnV4IG9ubHkgc3VwcG9ydGVkIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB0aGUKKyAgIyBHTlUgZHluYW1pYyBsaW5rZXIuICBTaW5jZSB0aGlzIHdhcyBicm9rZW4gd2l0aCBjcm9zcyBjb21waWxlcnMsCisgICMgbW9zdCBwb3dlcnBjLWxpbnV4IGJveGVzIHN1cHBvcnQgZHluYW1pYyBsaW5raW5nIHRoZXNlIGRheXMgYW5kCisgICMgcGVvcGxlIGNhbiBhbHdheXMgLS1kaXNhYmxlLXNoYXJlZCwgdGhlIHRlc3Qgd2FzIHJlbW92ZWQsIGFuZCB3ZQorICAjIGFzc3VtZSB0aGUgR05VL0xpbnV4IGR5bmFtaWMgbGlua2VyIGlzIGluIHVzZS4KKyAgZHluYW1pY19saW5rZXI9J0dOVS9MaW51eCBsZC5zbycKKyAgOzsKKwora25ldGJzZCotZ251KQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBkeW5hbWljX2xpbmtlcj0nR05VIGxkLnNvJworICA7OworCituZXRic2QqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJworICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgKGEub3V0KSBsZC5zbycKKyAgZWxzZQorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIGxkLmVsZl9zbycKKyAgZmkKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK25ld3NvczYpCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICA7OworCitudG8tcW54KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgOzsKKworb3BlbmJzZCopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPXllcworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBvcGVuYnNkMi5bWzg5XV0gfCBvcGVuYnNkMi5bWzg5XV0uKikKKwlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKwk7OworICAgICAgKikKKwlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisJOzsKKyAgICAgIGVzYWMKKyAgZWxzZQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgZmkKKyAgOzsKKworb3MyKikKKyAgbGlibmFtZV9zcGVjPSckbmFtZScKKyAgc2hyZXh0X2NtZHM9Ii5kbGwiCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fSAkbGlibmFtZS5hJworICBkeW5hbWljX2xpbmtlcj0nT1MvMiBsZC5leGUnCisgIHNobGlicGF0aF92YXI9TElCUEFUSAorICA7OworCitvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgIHZlcnNpb25fdHlwZT1vc2YKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL3NobGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYi9jbXBscnMvY2MgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIgL3Zhci9zaGxpYiIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiCisgIDs7CisKK3NjbzMuMnY1KikKKyAgdmVyc2lvbl90eXBlPW9zZgorICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworc29sYXJpcyopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgIyBsZGQgY29tcGxhaW5zIHVubGVzcyBsaWJyYXJpZXMgYXJlIGV4ZWN1dGFibGUKKyAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgK3ggJGxpYicKKyAgOzsKKworc3Vub3M0KikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3Vzci9ldGMiIGxkY29uZmlnICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgIG5lZWRfbGliX3ByZWZpeD1ubworICBmaQorICBuZWVkX3ZlcnNpb249eWVzCisgIDs7CisKK3N5c3Y0IHwgc3lzdjQuMnV3MiogfCBzeXN2NC4zKiB8IHN5c3Y1KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBjYXNlICRob3N0X3ZlbmRvciBpbgorICAgIHNuaSkKKyAgICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgICAgbmVlZF9saWJfcHJlZml4PW5vCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUJsYXJnZWR5bnN5bScKKyAgICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisgICAgICA7OworICAgIHNpZW1lbnMpCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIDs7CisgICAgbW90b3JvbGEpCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIG5lZWRfdmVyc2lvbj1ubworICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy9saWIgL3Vzci9saWIgL3Vzci9jY3MvbGliJworICAgICAgOzsKKyAgZXNhYworICA7OworCitzeXN2NCpNUCopCisgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KKyAgICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yJworICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGZpCisgIDs7CisKK3V0czQqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIDs7CisKKyopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7Citlc2FjCitBQ19NU0dfUkVTVUxUKFskZHluYW1pY19saW5rZXJdKQordGVzdCAiJGR5bmFtaWNfbGlua2VyIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KK10pIyBBQ19MSUJUT09MX1NZU19EWU5BTUlDX0xJTktFUgorCisKKyMgX0xUX0FDX1RBR0NPTkZJRworIyAtLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbX0xUX0FDX1RBR0NPTkZJR10sCitbQUNfQVJHX1dJVEgoW3RhZ3NdLAorICAgIFtBQ19IRUxQX1NUUklORyhbLS13aXRoLXRhZ3NAPDpAPVRBR1NAOj5AXSwKKyAgICAgICAgW2luY2x1ZGUgYWRkaXRpb25hbCBjb25maWd1cmF0aW9ucyBAPDpAYXV0b21hdGljQDo+QF0pXSwKKyAgICBbdGFnbmFtZXM9IiR3aXRodmFsIl0pCisKK2lmIHRlc3QgLWYgIiRsdG1haW4iICYmIHRlc3QgLW4gIiR0YWduYW1lcyI7IHRoZW4KKyAgaWYgdGVzdCAhIC1mICIke29maWxlfSI7IHRoZW4KKyAgICBBQ19NU0dfV0FSTihbb3V0cHV0IGZpbGUgYCRvZmlsZScgZG9lcyBub3QgZXhpc3RdKQorICBmaQorCisgIGlmIHRlc3QgLXogIiRMVENDIjsgdGhlbgorICAgIGV2YWwgImAkU0hFTEwgJHtvZmlsZX0gLS1jb25maWcgfCBncmVwICdeTFRDQz0nYCIKKyAgICBpZiB0ZXN0IC16ICIkTFRDQyI7IHRoZW4KKyAgICAgIEFDX01TR19XQVJOKFtvdXRwdXQgZmlsZSBgJG9maWxlJyBkb2VzIG5vdCBsb29rIGxpa2UgYSBsaWJ0b29sIHNjcmlwdF0pCisgICAgZWxzZQorICAgICAgQUNfTVNHX1dBUk4oW3VzaW5nIGBMVENDPSRMVENDJywgZXh0cmFjdGVkIGZyb20gYCRvZmlsZSddKQorICAgIGZpCisgIGZpCisKKyAgIyBFeHRyYWN0IGxpc3Qgb2YgYXZhaWxhYmxlIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBpbiAkb2ZpbGUuCisgICMgTm90ZSB0aGF0IHRoaXMgYXNzdW1lcyB0aGUgZW50aXJlIGxpc3QgaXMgb24gb25lIGxpbmUuCisgIGF2YWlsYWJsZV90YWdzPWBncmVwICJeYXZhaWxhYmxlX3RhZ3M9IiAiJHtvZmlsZX0iIHwgJFNFRCAtZSAncy9hdmFpbGFibGVfdGFncz1cKC4qJFwpL1wxLycgLWUgJ3MvXCIvL2cnYAorCisgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgorICBmb3IgdGFnbmFtZSBpbiAkdGFnbmFtZXM7IGRvCisgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgIyBDaGVjayB3aGV0aGVyIHRhZ25hbWUgY29udGFpbnMgb25seSB2YWxpZCBjaGFyYWN0ZXJzCisgICAgY2FzZSBgJGVjaG8gIlgkdGFnbmFtZSIgfCAkWHNlZCAtZSAnczpbWy1fQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejEyMzQ1Njc4OTAsL11dOjpnJ2AgaW4KKyAgICAiIikgOzsKKyAgICAqKSAgQUNfTVNHX0VSUk9SKFtpbnZhbGlkIHRhZyBuYW1lOiAkdGFnbmFtZV0pCisJOzsKKyAgICBlc2FjCisKKyAgICBpZiBncmVwICJeIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZSQiIDwgIiR7b2ZpbGV9IiA+IC9kZXYvbnVsbAorICAgIHRoZW4KKyAgICAgIEFDX01TR19FUlJPUihbdGFnIG5hbWUgXCIkdGFnbmFtZVwiIGFscmVhZHkgZXhpc3RzXSkKKyAgICBmaQorCisgICAgIyBVcGRhdGUgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIHRhZ3MuCisgICAgaWYgdGVzdCAtbiAiJHRhZ25hbWUiOyB0aGVuCisgICAgICBlY2hvIGFwcGVuZGluZyBjb25maWd1cmF0aW9uIHRhZyBcIiR0YWduYW1lXCIgdG8gJG9maWxlCisKKyAgICAgIGNhc2UgJHRhZ25hbWUgaW4KKyAgICAgIENYWCkKKwlpZiB0ZXN0IC1uICIkQ1hYIiAmJiB0ZXN0ICJYJENYWCIgIT0gIlhubyI7IHRoZW4KKwkgIEFDX0xJQlRPT0xfTEFOR19DWFhfQ09ORklHCisJZWxzZQorCSAgdGFnbmFtZT0iIgorCWZpCisJOzsKKworICAgICAgRjc3KQorCWlmIHRlc3QgLW4gIiRGNzciICYmIHRlc3QgIlgkRjc3IiAhPSAiWG5vIjsgdGhlbgorCSAgQUNfTElCVE9PTF9MQU5HX0Y3N19DT05GSUcKKwllbHNlCisJICB0YWduYW1lPSIiCisJZmkKKwk7OworCisgICAgICBHQ0opCisJaWYgdGVzdCAtbiAiJEdDSiIgJiYgdGVzdCAiWCRHQ0oiICE9ICJYbm8iOyB0aGVuCisJICBBQ19MSUJUT09MX0xBTkdfR0NKX0NPTkZJRworCWVsc2UKKwkgIHRhZ25hbWU9IiIKKwlmaQorCTs7CisKKyAgICAgIFJDKQorCUFDX0xJQlRPT0xfTEFOR19SQ19DT05GSUcKKwk7OworCisgICAgICAqKQorCUFDX01TR19FUlJPUihbVW5zdXBwb3J0ZWQgdGFnIG5hbWU6ICR0YWduYW1lXSkKKwk7OworICAgICAgZXNhYworCisgICAgICAjIEFwcGVuZCB0aGUgbmV3IHRhZyBuYW1lIHRvIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSB0YWdzLgorICAgICAgaWYgdGVzdCAtbiAiJHRhZ25hbWUiIDsgdGhlbgorICAgICAgYXZhaWxhYmxlX3RhZ3M9IiRhdmFpbGFibGVfdGFncyAkdGFnbmFtZSIKKyAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkbHRfc2F2ZV9pZnMiCisKKyAgIyBOb3cgc3Vic3RpdHV0ZSB0aGUgdXBkYXRlZCBsaXN0IG9mIGF2YWlsYWJsZSB0YWdzLgorICBpZiBldmFsICJzZWQgLWUgJ3MvXmF2YWlsYWJsZV90YWdzPS4qXCQvYXZhaWxhYmxlX3RhZ3M9XCIkYXZhaWxhYmxlX3RhZ3NcIi8nIFwiJG9maWxlXCIgPiBcIiR7b2ZpbGV9VFwiIjsgdGhlbgorICAgIG12ICIke29maWxlfVQiICIkb2ZpbGUiCisgICAgY2htb2QgK3ggIiRvZmlsZSIKKyAgZWxzZQorICAgIHJtIC1mICIke29maWxlfVQiCisgICAgQUNfTVNHX0VSUk9SKFt1bmFibGUgdG8gdXBkYXRlIGxpc3Qgb2YgYXZhaWxhYmxlIHRhZ2dlZCBjb25maWd1cmF0aW9ucy5dKQorICBmaQorZmkKK10pIyBfTFRfQUNfVEFHQ09ORklHCisKKworIyBBQ19MSUJUT09MX0RMT1BFTgorIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBlbmFibGUgY2hlY2tzIGZvciBkbG9wZW4gc3VwcG9ydAorQUNfREVGVU4oW0FDX0xJQlRPT0xfRExPUEVOXSwKKyBbQUNfQkVGT1JFKFskMF0sW0FDX0xJQlRPT0xfU0VUVVBdKQorXSkjIEFDX0xJQlRPT0xfRExPUEVOCisKKworIyBBQ19MSUJUT09MX1dJTjMyX0RMTAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBkZWNsYXJlIHBhY2thZ2Ugc3VwcG9ydCBmb3IgYnVpbGRpbmcgd2luMzIgZGxsJ3MKK0FDX0RFRlVOKFtBQ19MSUJUT09MX1dJTjMyX0RMTF0sCitbQUNfQkVGT1JFKFskMF0sIFtBQ19MSUJUT09MX1NFVFVQXSkKK10pIyBBQ19MSUJUT09MX1dJTjMyX0RMTAorCisKKyMgQUNfRU5BQkxFX1NIQVJFRChbREVGQVVMVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLXNoYXJlZCBmbGFnCisjIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byBgeWVzJy4KK0FDX0RFRlVOKFtBQ19FTkFCTEVfU0hBUkVEXSwKK1tkZWZpbmUoW0FDX0VOQUJMRV9TSEFSRURfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAorQUNfQVJHX0VOQUJMRShbc2hhcmVkXSwKKyAgICBbQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXNoYXJlZEA8OkA9UEtHU0A6PkBdLAorCVtidWlsZCBzaGFyZWQgbGlicmFyaWVzIEA8OkBkZWZhdWx0PV1BQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFRbQDo+QF0pXSwKKyAgICBbcD0ke1BBQ0tBR0UtZGVmYXVsdH0KKyAgICBjYXNlICRlbmFibGV2YWwgaW4KKyAgICB5ZXMpIGVuYWJsZV9zaGFyZWQ9eWVzIDs7CisgICAgbm8pIGVuYWJsZV9zaGFyZWQ9bm8gOzsKKyAgICAqKQorICAgICAgZW5hYmxlX3NoYXJlZD1ubworICAgICAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgorICAgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCisgICAgICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisJSUZTPSIkbHRfc2F2ZV9pZnMiCisJaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKwkgIGVuYWJsZV9zaGFyZWQ9eWVzCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICAgOzsKKyAgICBlc2FjXSwKKyAgICBbZW5hYmxlX3NoYXJlZD1dQUNfRU5BQkxFX1NIQVJFRF9ERUZBVUxUKQorXSkjIEFDX0VOQUJMRV9TSEFSRUQKKworCisjIEFDX0RJU0FCTEVfU0hBUkVECisjIC0tLS0tLS0tLS0tLS0tLS0tCisjLSBzZXQgdGhlIGRlZmF1bHQgc2hhcmVkIGZsYWcgdG8gLS1kaXNhYmxlLXNoYXJlZAorQUNfREVGVU4oW0FDX0RJU0FCTEVfU0hBUkVEXSwKK1tBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pZG5sCitBQ19FTkFCTEVfU0hBUkVEKG5vKQorXSkjIEFDX0RJU0FCTEVfU0hBUkVECisKKworIyBBQ19FTkFCTEVfU1RBVElDKFtERUZBVUxUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGltcGxlbWVudCB0aGUgLS1lbmFibGUtc3RhdGljIGZsYWcKKyMgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGB5ZXMnLgorQUNfREVGVU4oW0FDX0VOQUJMRV9TVEFUSUNdLAorW2RlZmluZShbQUNfRU5BQkxFX1NUQVRJQ19ERUZBVUxUXSwgaWZlbHNlKCQxLCBubywgbm8sIHllcykpZG5sCitBQ19BUkdfRU5BQkxFKFtzdGF0aWNdLAorICAgIFtBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtc3RhdGljQDw6QD1QS0dTQDo+QF0sCisJW2J1aWxkIHN0YXRpYyBsaWJyYXJpZXMgQDw6QGRlZmF1bHQ9XUFDX0VOQUJMRV9TVEFUSUNfREVGQVVMVFtAOj5AXSldLAorICAgIFtwPSR7UEFDS0FHRS1kZWZhdWx0fQorICAgIGNhc2UgJGVuYWJsZXZhbCBpbgorICAgIHllcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKKyAgICBubykgZW5hYmxlX3N0YXRpYz1ubyA7OworICAgICopCisgICAgIGVuYWJsZV9zdGF0aWM9bm8KKyAgICAgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgorICAgICAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbworCUlGUz0iJGx0X3NhdmVfaWZzIgorCWlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCisJICBlbmFibGVfc3RhdGljPXllcworCWZpCisgICAgICBkb25lCisgICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICAgIDs7CisgICAgZXNhY10sCisgICAgW2VuYWJsZV9zdGF0aWM9XUFDX0VOQUJMRV9TVEFUSUNfREVGQVVMVCkKK10pIyBBQ19FTkFCTEVfU1RBVElDCisKKworIyBBQ19ESVNBQkxFX1NUQVRJQworIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBzZXQgdGhlIGRlZmF1bHQgc3RhdGljIGZsYWcgdG8gLS1kaXNhYmxlLXN0YXRpYworQUNfREVGVU4oW0FDX0RJU0FCTEVfU1RBVElDXSwKK1tBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pZG5sCitBQ19FTkFCTEVfU1RBVElDKG5vKQorXSkjIEFDX0RJU0FCTEVfU1RBVElDCisKKworIyBBQ19FTkFCTEVfRkFTVF9JTlNUQUxMKFtERUZBVUxUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGltcGxlbWVudCB0aGUgLS1lbmFibGUtZmFzdC1pbnN0YWxsIGZsYWcKKyMgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGB5ZXMnLgorQUNfREVGVU4oW0FDX0VOQUJMRV9GQVNUX0lOU1RBTExdLAorW2RlZmluZShbQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUXSwgaWZlbHNlKCQxLCBubywgbm8sIHllcykpZG5sCitBQ19BUkdfRU5BQkxFKFtmYXN0LWluc3RhbGxdLAorICAgIFtBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtZmFzdC1pbnN0YWxsQDw6QD1QS0dTQDo+QF0sCisgICAgW29wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBAPDpAZGVmYXVsdD1dQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUW0A6PkBdKV0sCisgICAgW3A9JHtQQUNLQUdFLWRlZmF1bHR9CisgICAgY2FzZSAkZW5hYmxldmFsIGluCisgICAgeWVzKSBlbmFibGVfZmFzdF9pbnN0YWxsPXllcyA7OworICAgIG5vKSBlbmFibGVfZmFzdF9pbnN0YWxsPW5vIDs7CisgICAgKikKKyAgICAgIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KKyAgICAgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgorICAgICAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbworCUlGUz0iJGx0X3NhdmVfaWZzIgorCWlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCisJICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcworCWZpCisgICAgICBkb25lCisgICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICAgIDs7CisgICAgZXNhY10sCisgICAgW2VuYWJsZV9mYXN0X2luc3RhbGw9XUFDX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVCkKK10pIyBBQ19FTkFCTEVfRkFTVF9JTlNUQUxMCisKKworIyBBQ19ESVNBQkxFX0ZBU1RfSU5TVEFMTAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBzZXQgdGhlIGRlZmF1bHQgdG8gLS1kaXNhYmxlLWZhc3QtaW5zdGFsbAorQUNfREVGVU4oW0FDX0RJU0FCTEVfRkFTVF9JTlNUQUxMXSwKK1tBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pZG5sCitBQ19FTkFCTEVfRkFTVF9JTlNUQUxMKG5vKQorXSkjIEFDX0RJU0FCTEVfRkFTVF9JTlNUQUxMCisKKworIyBBQ19MSUJUT09MX1BJQ01PREUoW01PREVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBpbXBsZW1lbnQgdGhlIC0td2l0aC1waWMgZmxhZworIyBNT0RFIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gYGJvdGgnLgorQUNfREVGVU4oW0FDX0xJQlRPT0xfUElDTU9ERV0sCitbQUNfQkVGT1JFKFskMF0sW0FDX0xJQlRPT0xfU0VUVVBdKWRubAorcGljX21vZGU9aWZlbHNlKCQjLDEsJDEsZGVmYXVsdCkKK10pIyBBQ19MSUJUT09MX1BJQ01PREUKKworCisjIEFDX1BST0dfRUdSRVAKKyMgLS0tLS0tLS0tLS0tLQorIyBUaGlzIGlzIHByZWRlZmluZWQgc3RhcnRpbmcgd2l0aCBBdXRvY29uZiAyLjU0LCBzbyB0aGlzIGNvbmRpdGlvbmFsCisjIGRlZmluaXRpb24gY2FuIGJlIHJlbW92ZWQgb25jZSB3ZSByZXF1aXJlIEF1dG9jb25mIDIuNTQgb3IgbGF0ZXIuCittNF9pZm5kZWYoW0FDX1BST0dfRUdSRVBdLCBbQUNfREVGVU4oW0FDX1BST0dfRUdSRVBdLAorW0FDX0NBQ0hFX0NIRUNLKFtmb3IgZWdyZXBdLCBbYWNfY3ZfcHJvZ19lZ3JlcF0sCisgICBbaWYgZWNobyBhIHwgKGdyZXAgLUUgJyhhfGIpJykgPi9kZXYvbnVsbCAyPiYxCisgICAgdGhlbiBhY19jdl9wcm9nX2VncmVwPSdncmVwIC1FJworICAgIGVsc2UgYWNfY3ZfcHJvZ19lZ3JlcD0nZWdyZXAnCisgICAgZmldKQorIEVHUkVQPSRhY19jdl9wcm9nX2VncmVwCisgQUNfU1VCU1QoW0VHUkVQXSkKK10pXSkKKworCisjIEFDX1BBVEhfVE9PTF9QUkVGSVgKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBmaW5kIGEgZmlsZSBwcm9ncmFtIHdoaWNoIGNhbiByZWNvZ25pc2Ugc2hhcmVkIGxpYnJhcnkKK0FDX0RFRlVOKFtBQ19QQVRIX1RPT0xfUFJFRklYXSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0VHUkVQXSlkbmwKK0FDX01TR19DSEVDS0lORyhbZm9yICQxXSkKK0FDX0NBQ0hFX1ZBTChsdF9jdl9wYXRoX01BR0lDX0NNRCwKK1tjYXNlICRNQUdJQ19DTUQgaW4KK1tbXFwvKl0gfCAgPzpbXFwvXSpdKQorICBsdF9jdl9wYXRoX01BR0lDX0NNRD0iJE1BR0lDX0NNRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisqKQorICBsdF9zYXZlX01BR0lDX0NNRD0iJE1BR0lDX0NNRCIKKyAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitkbmwgJGFjX2R1bW15IGZvcmNlcyBzcGxpdHRpbmcgb24gY29uc3RhbnQgdXNlci1zdXBwbGllZCBwYXRocy4KK2RubCBQT1NJWC4yIHdvcmQgc3BsaXR0aW5nIGlzIGRvbmUgb25seSBvbiB0aGUgb3V0cHV0IG9mIHdvcmQgZXhwYW5zaW9ucywKK2RubCBub3QgZXZlcnkgd29yZC4gIFRoaXMgY2xvc2VzIGEgbG9uZ3N0YW5kaW5nIHNoIHNlY3VyaXR5IGhvbGUuCisgIGFjX2R1bW15PSJpZmVsc2UoWyQyXSwgLCAkUEFUSCwgWyQyXSkiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyQxOyB0aGVuCisgICAgICBsdF9jdl9wYXRoX01BR0lDX0NNRD0iJGFjX2Rpci8kMSIKKyAgICAgIGlmIHRlc3QgLW4gIiRmaWxlX21hZ2ljX3Rlc3RfZmlsZSI7IHRoZW4KKwljYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgorCSJmaWxlX21hZ2ljICIqKQorCSAgZmlsZV9tYWdpY19yZWdleD0iYGV4cHIgXCIkZGVwbGlic19jaGVja19tZXRob2RcIiA6IFwiZmlsZV9tYWdpYyBcKC4qXClcImAiCisJICBNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKKwkgIGlmIGV2YWwgJGZpbGVfbWFnaWNfY21kIFwkZmlsZV9tYWdpY190ZXN0X2ZpbGUgMj4gL2Rldi9udWxsIHwKKwkgICAgJEVHUkVQICIkZmlsZV9tYWdpY19yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgOgorCSAgZWxzZQorCSAgICBjYXQgPDxFT0YgMT4mMgorCisqKiogV2FybmluZzogdGhlIGNvbW1hbmQgbGlidG9vbCB1c2VzIHRvIGRldGVjdCBzaGFyZWQgbGlicmFyaWVzLAorKioqICRmaWxlX21hZ2ljX2NtZCwgcHJvZHVjZXMgb3V0cHV0IHRoYXQgbGlidG9vbCBjYW5ub3QgcmVjb2duaXplLgorKioqIFRoZSByZXN1bHQgaXMgdGhhdCBsaWJ0b29sIG1heSBmYWlsIHRvIHJlY29nbml6ZSBzaGFyZWQgbGlicmFyaWVzCisqKiogYXMgc3VjaC4gIFRoaXMgd2lsbCBhZmZlY3QgdGhlIGNyZWF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzIHRoYXQKKyoqKiBkZXBlbmQgb24gc2hhcmVkIGxpYnJhcmllcywgYnV0IHByb2dyYW1zIGxpbmtlZCB3aXRoIHN1Y2ggbGlidG9vbAorKioqIGxpYnJhcmllcyB3aWxsIHdvcmsgcmVnYXJkbGVzcyBvZiB0aGlzIHByb2JsZW0uICBOZXZlcnRoZWxlc3MsIHlvdQorKioqIG1heSB3YW50IHRvIHJlcG9ydCB0aGUgcHJvYmxlbSB0byB5b3VyIHN5c3RlbSBtYW5hZ2VyIGFuZC9vciB0bworKioqIGJ1Zy1saWJ0b29sQGdudS5vcmcKKworRU9GCisJICBmaSA7OworCWVzYWMKKyAgICAgIGZpCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgIE1BR0lDX0NNRD0iJGx0X3NhdmVfTUFHSUNfQ01EIgorICA7OworZXNhY10pCitNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKK2lmIHRlc3QgLW4gIiRNQUdJQ19DTUQiOyB0aGVuCisgIEFDX01TR19SRVNVTFQoJE1BR0lDX0NNRCkKK2Vsc2UKKyAgQUNfTVNHX1JFU1VMVChubykKK2ZpCitdKSMgQUNfUEFUSF9UT09MX1BSRUZJWAorCisKKyMgQUNfUEFUSF9NQUdJQworIyAtLS0tLS0tLS0tLS0tCisjIGZpbmQgYSBmaWxlIHByb2dyYW0gd2hpY2ggY2FuIHJlY29nbmlzZSBhIHNoYXJlZCBsaWJyYXJ5CitBQ19ERUZVTihbQUNfUEFUSF9NQUdJQ10sCitbQUNfUEFUSF9UT09MX1BSRUZJWCgke2FjX3Rvb2xfcHJlZml4fWZpbGUsIC91c3IvYmluJFBBVEhfU0VQQVJBVE9SJFBBVEgpCitpZiB0ZXN0IC16ICIkbHRfY3ZfcGF0aF9NQUdJQ19DTUQiOyB0aGVuCisgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgICBBQ19QQVRIX1RPT0xfUFJFRklYKGZpbGUsIC91c3IvYmluJFBBVEhfU0VQQVJBVE9SJFBBVEgpCisgIGVsc2UKKyAgICBNQUdJQ19DTUQ9OgorICBmaQorZmkKK10pIyBBQ19QQVRIX01BR0lDCisKKworIyBBQ19QUk9HX0xECisjIC0tLS0tLS0tLS0KKyMgZmluZCB0aGUgcGF0aG5hbWUgdG8gdGhlIEdOVSBvciBub24tR05VIGxpbmtlcgorQUNfREVGVU4oW0FDX1BST0dfTERdLAorW0FDX0FSR19XSVRIKFtnbnUtbGRdLAorICAgIFtBQ19IRUxQX1NUUklORyhbLS13aXRoLWdudS1sZF0sCisJW2Fzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBAPDpAZGVmYXVsdD1ub0A6PkBdKV0sCisgICAgW3Rlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllc10sCisgICAgW3dpdGhfZ251X2xkPW5vXSkKK0FDX1JFUVVJUkUoW0xUX0FDX1BST0dfU0VEXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAorQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAorQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKK2FjX3Byb2c9bGQKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICMgQ2hlY2sgaWYgZ2NjIC1wcmludC1wcm9nLW5hbWU9bGQgZ2l2ZXMgYSBwYXRoLgorICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBsZCB1c2VkIGJ5ICRDQ10pCisgIGNhc2UgJGhvc3QgaW4KKyAgKi0qLW1pbmd3KikKKyAgICAjIGdjYyBsZWF2ZXMgYSB0cmFpbGluZyBjYXJyaWFnZSByZXR1cm4gd2hpY2ggdXBzZXRzIG1pbmd3CisgICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1IHwgdHIgLWQgJ1wwMTUnYCA7OworICAqKQorICAgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAgOzsKKyAgZXNhYworICBjYXNlICRhY19wcm9nIGluCisgICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCisgICAgW1tcXC9dXSogfCA/OltbXFwvXV0qKQorICAgICAgcmVfZGlyZWx0PScvW1teL11dW1teL11dKi9cLlwuLycKKyAgICAgICMgQ2Fub25pY2FsaXplIHRoZSBwYXRobmFtZSBvZiBsZAorICAgICAgYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgJFNFRCAncyVcXFxcJS8lZydgCisgICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KKwlhY19wcm9nPWBlY2hvICRhY19wcm9nfCAkU0VEICJzJSRyZV9kaXJlbHQlLyUiYAorICAgICAgZG9uZQorICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCisgICAgICA7OworICAiIikKKyAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KKyAgICBhY19wcm9nPWxkCisgICAgOzsKKyAgKikKKyAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCisgICAgd2l0aF9nbnVfbGQ9dW5rbm93bgorICAgIDs7CisgIGVzYWMKK2VsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBHTlUgbGRdKQorZWxzZQorICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBub24tR05VIGxkXSkKK2ZpCitBQ19DQUNIRV9WQUwobHRfY3ZfcGF0aF9MRCwKK1tpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCisgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyIgfHwgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyRhY19leGVleHQiOyB0aGVuCisgICAgICBsdF9jdl9wYXRoX0xEPSIkYWNfZGlyLyRhY19wcm9nIgorICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAorICAgICAgIyBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgorICAgICAgIyBCcmVhayBvbmx5IGlmIGl0IHdhcyB0aGUgR05VL25vbi1HTlUgbGQgdGhhdCB3ZSBwcmVmZXIuCisgICAgICBjYXNlIGAiJGx0X2N2X3BhdGhfTEQiIC12IDI+JjEgPC9kZXYvbnVsbGAgaW4KKyAgICAgICpHTlUqIHwgKid3aXRoIEJGRCcqKQorCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKKwk7OworICAgICAgKikKKwl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhaworCTs7CisgICAgICBlc2FjCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRsdF9zYXZlX2lmcyIKK2Vsc2UKKyAgbHRfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KK2ZpXSkKK0xEPSIkbHRfY3ZfcGF0aF9MRCIKK2lmIHRlc3QgLW4gIiRMRCI7IHRoZW4KKyAgQUNfTVNHX1JFU1VMVCgkTEQpCitlbHNlCisgIEFDX01TR19SRVNVTFQobm8pCitmaQordGVzdCAteiAiJExEIiAmJiBBQ19NU0dfRVJST1IoW25vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIXSkKK0FDX1BST0dfTERfR05VCitdKSMgQUNfUFJPR19MRAorCisKKyMgQUNfUFJPR19MRF9HTlUKKyMgLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtBQ19QUk9HX0xEX0dOVV0sCitbQUNfUkVRVUlSRShbQUNfUFJPR19FR1JFUF0pZG5sCitBQ19DQUNIRV9DSEVDSyhbaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGRdLCBsdF9jdl9wcm9nX2dudV9sZCwKK1sjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgorY2FzZSBgJExEIC12IDI+JjEgPC9kZXYvbnVsbGAgaW4KKypHTlUqIHwgKid3aXRoIEJGRCcqKQorICBsdF9jdl9wcm9nX2dudV9sZD15ZXMKKyAgOzsKKyopCisgIGx0X2N2X3Byb2dfZ251X2xkPW5vCisgIDs7Citlc2FjXSkKK3dpdGhfZ251X2xkPSRsdF9jdl9wcm9nX2dudV9sZAorXSkjIEFDX1BST0dfTERfR05VCisKKworIyBBQ19QUk9HX0xEX1JFTE9BRF9GTEFHCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgZmluZCByZWxvYWQgZmxhZyBmb3IgbGlua2VyCisjICAgLS0gUE9SVE1FIFNvbWUgbGlua2VycyBtYXkgbmVlZCBhIGRpZmZlcmVudCByZWxvYWQgZmxhZy4KK0FDX0RFRlVOKFtBQ19QUk9HX0xEX1JFTE9BRF9GTEFHXSwKK1tBQ19DQUNIRV9DSEVDSyhbZm9yICRMRCBvcHRpb24gdG8gcmVsb2FkIG9iamVjdCBmaWxlc10sCisgIGx0X2N2X2xkX3JlbG9hZF9mbGFnLAorICBbbHRfY3ZfbGRfcmVsb2FkX2ZsYWc9Jy1yJ10pCityZWxvYWRfZmxhZz0kbHRfY3ZfbGRfcmVsb2FkX2ZsYWcKK2Nhc2UgJHJlbG9hZF9mbGFnIGluCisiIiB8ICIgIiopIDs7CisqKSByZWxvYWRfZmxhZz0iICRyZWxvYWRfZmxhZyIgOzsKK2VzYWMKK3JlbG9hZF9jbWRzPSckTEQkcmVsb2FkX2ZsYWcgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKK10pIyBBQ19QUk9HX0xEX1JFTE9BRF9GTEFHCisKKworIyBBQ19ERVBMSUJTX0NIRUNLX01FVEhPRAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBob3cgdG8gY2hlY2sgZm9yIGxpYnJhcnkgZGVwZW5kZW5jaWVzCisjICAtLSBQT1JUTUUgZmlsbCBpbiB3aXRoIHRoZSBkeW5hbWljIGxpYnJhcnkgY2hhcmFjdGVyaXN0aWNzCitBQ19ERUZVTihbQUNfREVQTElCU19DSEVDS19NRVRIT0RdLAorW0FDX0NBQ0hFX0NIRUNLKFtob3cgdG8gcmVjb2duaXNlIGRlcGVuZGVudCBsaWJyYXJpZXNdLAorbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2QsCitbbHRfY3ZfZmlsZV9tYWdpY19jbWQ9JyRNQUdJQ19DTUQnCitsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0KK2x0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSd1bmtub3duJworIyBOZWVkIHRvIHNldCB0aGUgcHJlY2VkaW5nIHZhcmlhYmxlIG9uIGFsbCBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0CisjIGludGVybGlicmFyeSBkZXBlbmRlbmNpZXMuCisjICdub25lJyAtLSBkZXBlbmRlbmNpZXMgbm90IHN1cHBvcnRlZC4KKyMgYHVua25vd24nIC0tIHNhbWUgYXMgbm9uZSwgYnV0IGRvY3VtZW50cyB0aGF0IHdlIHJlYWxseSBkb24ndCBrbm93LgorIyAncGFzc19hbGwnIC0tIGFsbCBkZXBlbmRlbmNpZXMgcGFzc2VkIHdpdGggbm8gY2hlY2tzLgorIyAndGVzdF9jb21waWxlJyAtLSBjaGVjayBieSBtYWtpbmcgdGVzdCBwcm9ncmFtLgorIyAnZmlsZV9tYWdpYyBbW3JlZ2V4XV0nIC0tIGNoZWNrIGJ5IGxvb2tpbmcgZm9yIGZpbGVzIGluIGxpYnJhcnkgcGF0aAorIyB3aGljaCByZXNwb25kcyB0byB0aGUgJGZpbGVfbWFnaWNfY21kIHdpdGggYSBnaXZlbiBleHRlbmRlZCByZWdleC4KKyMgSWYgeW91IGhhdmUgYGZpbGUnIG9yIGVxdWl2YWxlbnQgb24geW91ciBzeXN0ZW0gYW5kIHlvdSdyZSBub3Qgc3VyZQorIyB3aGV0aGVyIGBwYXNzX2FsbCcgd2lsbCAqYWx3YXlzKiB3b3JrLCB5b3UgcHJvYmFibHkgd2FudCB0aGlzIG9uZS4KKworY2FzZSAkaG9zdF9vcyBpbgorYWl4NCogfCBhaXg1KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworYmVvcyopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK2JzZGk0KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFtbMC05XV1bWzAtOV1dKi1iaXQgW1tNTF1dU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIpJworICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nL3Vzci9iaW4vZmlsZSAtTCcKKyAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3NobGliL2xpYmMuc28KKyAgOzsKKworY3lnd2luKikKKyAgIyBmdW5jX3dpbjMyX2xpYmlkIGlzIGEgc2hlbGwgZnVuY3Rpb24gZGVmaW5lZCBpbiBsdG1haW4uc2gKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgXng4NiBhcmNoaXZlIGltcG9ydHxeeDg2IERMTCcKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9J2Z1bmNfd2luMzJfbGliaWQnCisgIDs7CisKK21pbmd3KiB8IHB3MzIqKQorICAjIEJhc2UgTVNZUy9NaW5HVyBkbyBub3QgcHJvdmlkZSB0aGUgJ2ZpbGUnIGNvbW1hbmQgbmVlZGVkIGJ5CisgICMgZnVuY193aW4zMl9saWJpZCBzaGVsbCBmdW5jdGlvbiwgc28gdXNlIGEgd2Vha2VyIHRlc3QgYmFzZWQgb24gJ29iamR1bXAnLgorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBmaWxlIGZvcm1hdCBwZWkqLWkzODYoLiphcmNoaXRlY3R1cmU6IGkzODYpPycKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9JyRPQkpEVU1QIC1mJworICA7OworCitkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitmcmVlYnNkKiB8IGtmcmVlYnNkKi1nbnUpCisgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4gL2Rldi9udWxsOyB0aGVuCisgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICBpKjg2ICkKKyAgICAgICMgTm90IHN1cmUgd2hldGhlciB0aGUgcHJlc2VuY2Ugb2YgT3BlbkJTRCBoZXJlIHdhcyBhIG1pc3Rha2UuCisgICAgICAjIExldCdzIGFjY2VwdCBib3RoIG9mIHRoZW0gdW50aWwgdGhpcyBpcyBjbGVhcmVkIHVwLgorICAgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKEZyZWVCU0R8T3BlbkJTRCkvaVtbMy05XV04NiAoY29tcGFjdCApP2RlbWFuZCBwYWdlZCBzaGFyZWQgbGlicmFyeScKKyAgICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKKyAgICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC91c3IvbGliL2xpYmMuc28uKmAKKyAgICAgIDs7CisgICAgZXNhYworICBlbHNlCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgZmkKKyAgOzsKKworZ251KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworaHB1eDEwLjIwKiB8IGhwdXgxMSopCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKKyAgY2FzZSAiJGhvc3RfY3B1IiBpbgorICBpYTY0KikKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoc1tbMC05XV1bWzAtOV1dW1swLTldXXxFTEYtW1swLTldXVtbMC05XV0pIHNoYXJlZCBvYmplY3QgZmlsZSAtIElBNjQnCisgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvaHB1eDMyL2xpYmMuc28KKyAgICA7OworICBocHBhKjY0KikKKyAgICBbbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKHNbMC05XVswLTldWzAtOV18RUxGLVswLTldWzAtOV0pIHNoYXJlZCBvYmplY3QgZmlsZSAtIFBBLVJJU0MgWzAtOV0uWzAtOV0nXQorICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL3BhMjBfNjQvbGliYy5zbAorICAgIDs7CisgICopCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKHNbWzAtOV1dW1swLTldXVtbMC05XV18UEEtUklTQ1tbMC05XV0uW1swLTldXSkgc2hhcmVkIGxpYnJhcnknCisgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvbGliYy5zbAorICAgIDs7CisgIGVzYWMKKyAgOzsKKworaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgY2FzZSAkTEQgaW4KKyAgKi0zMnwqIi0zMiAiKSBsaWJtYWdpYz0zMi1iaXQ7OworICAqLW4zMnwqIi1uMzIgIikgbGlibWFnaWM9TjMyOzsKKyAgKi02NHwqIi02NCAiKSBsaWJtYWdpYz02NC1iaXQ7OworICAqKSBsaWJtYWdpYz1uZXZlci1tYXRjaDs7CisgIGVzYWMKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworIyBUaGlzIG11c3QgYmUgTGludXggRUxGLgorbGludXgqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCituZXRic2QqIHwga25ldGJzZCotZ251KQorICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+IC9kZXYvbnVsbDsgdGhlbgorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbW14vXV0rKFwuc29cLltbMC05XV0rXC5bWzAtOV1dK3xfcGljXC5hKSQnCisgIGVsc2UKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW1teL11dKyhcLnNvfF9waWNcLmEpJCcKKyAgZmkKKyAgOzsKKworbmV3b3M2KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFtbMC05XV1bWzAtOV1dKi1iaXQgW1tNTF1dU0IgKGV4ZWN1dGFibGV8ZHluYW1pYyBsaWIpJworICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCisgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL2xpYm5scy5zbworICA7OworCitudG8tcW54KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9dW5rbm93bgorICA7OworCitvcGVuYnNkKikKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQorICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT1gZWNobyAvdXNyL2xpYi9saWJjLnNvLipgCisgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbWzAtOV1dW1swLTldXSotYml0IFtbTE1dXVNCIHNoYXJlZCBvYmplY3QnCisgIGVsc2UKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBPcGVuQlNELiogc2hhcmVkIGxpYnJhcnknCisgIGZpCisgIDs7CisKK29zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworc2NvMy4ydjUqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitzb2xhcmlzKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworc3lzdjQgfCBzeXN2NC4ydXcyKiB8IHN5c3Y0LjMqIHwgc3lzdjUqKQorICBjYXNlICRob3N0X3ZlbmRvciBpbgorICBtb3Rvcm9sYSkKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgW1swLTldXVtbMC05XV0qLWJpdCBbW01MXV1TQiAoc2hhcmVkIG9iamVjdHxkeW5hbWljIGxpYikgTVtbMC05XV1bWzAtOV1dKiBWZXJzaW9uIFtbMC05XV0nCisgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL3Vzci9saWIvbGliYy5zbypgCisgICAgOzsKKyAgbmNyKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgICAgOzsKKyAgc2VxdWVudCkKKyAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nL2Jpbi9maWxlJworICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbWzAtOV1dW1swLTldXSotYml0IFtbTE1dXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliICknCisgICAgOzsKKyAgc25pKQorICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPScvYmluL2ZpbGUnCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9ImZpbGVfbWFnaWMgRUxGIFtbMC05XV1bWzAtOV1dKi1iaXQgW1tMTV1dU0IgZHluYW1pYyBsaWIiCisgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L2xpYi9saWJjLnNvCisgICAgOzsKKyAgc2llbWVucykKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICAgIDs7CisgIGVzYWMKKyAgOzsKKworc3lzdjVPcGVuVU5JWDgqIHwgc3lzdjVVbml4V2FyZTcqIHwgc3lzdjV1d1tbNzhdXSogfCB1bml4d2FyZTcqIHwgc3lzdjQqdXcyKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKK2VzYWMKK10pCitmaWxlX21hZ2ljX2NtZD0kbHRfY3ZfZmlsZV9tYWdpY19jbWQKK2RlcGxpYnNfY2hlY2tfbWV0aG9kPSRsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZAordGVzdCAteiAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiAmJiBkZXBsaWJzX2NoZWNrX21ldGhvZD11bmtub3duCitdKSMgQUNfREVQTElCU19DSEVDS19NRVRIT0QKKworCisjIEFDX1BST0dfTk0KKyMgLS0tLS0tLS0tLQorIyBmaW5kIHRoZSBwYXRobmFtZSB0byBhIEJTRC1jb21wYXRpYmxlIG5hbWUgbGlzdGVyCitBQ19ERUZVTihbQUNfUFJPR19OTV0sCitbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBCU0QtY29tcGF0aWJsZSBubV0sIGx0X2N2X3BhdGhfTk0sCitbaWYgdGVzdCAtbiAiJE5NIjsgdGhlbgorICAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KKyAgbHRfY3ZfcGF0aF9OTT0iJE5NIgorZWxzZQorICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKKyAgZm9yIGFjX2RpciBpbiAkUEFUSCAvdXNyL2Njcy9iaW4gL3Vzci91Y2IgL2JpbjsgZG8KKyAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIHRtcF9ubT0iJGFjX2Rpci8ke2FjX3Rvb2xfcHJlZml4fW5tIgorICAgIGlmIHRlc3QgLWYgIiR0bXBfbm0iIHx8IHRlc3QgLWYgIiR0bXBfbm0kYWNfZXhlZXh0IiA7IHRoZW4KKyAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBubSBhY2NlcHRzIGEgQlNELWNvbXBhdCBmbGFnLgorICAgICAgIyBBZGRpbmcgdGhlIGBzZWQgMXEnIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBvbiBIUC1VWCwgd2hpY2ggc2F5czoKKyAgICAgICMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKKyAgICAgICMgVHJ1NjQncyBubSBjb21wbGFpbnMgdGhhdCAvZGV2L251bGwgaXMgYW4gaW52YWxpZCBvYmplY3QgZmlsZQorICAgICAgY2FzZSBgIiR0bXBfbm0iIC1CIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSdgIGluCisgICAgICAqL2Rldi9udWxsKiB8IConSW52YWxpZCBmaWxlIG9yIG9iamVjdCB0eXBlJyopCisJbHRfY3ZfcGF0aF9OTT0iJHRtcF9ubSAtQiIKKwlicmVhaworICAgICAgICA7OworICAgICAgKikKKwljYXNlIGAiJHRtcF9ubSIgLXAgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJ2AgaW4KKwkqL2Rldi9udWxsKikKKwkgIGx0X2N2X3BhdGhfTk09IiR0bXBfbm0gLXAiCisJICBicmVhaworCSAgOzsKKwkqKQorCSAgbHRfY3ZfcGF0aF9OTT0ke2x0X2N2X3BhdGhfTk09IiR0bXBfbm0ifSAjIGtlZXAgdGhlIGZpcnN0IG1hdGNoLCBidXQKKwkgIGNvbnRpbnVlICMgc28gdGhhdCB3ZSBjYW4gdHJ5IHRvIGZpbmQgb25lIHRoYXQgc3VwcG9ydHMgQlNEIGZsYWdzCisJICA7OworCWVzYWMKKyAgICAgIGVzYWMKKyAgICBmaQorICBkb25lCisgIElGUz0iJGx0X3NhdmVfaWZzIgorICB0ZXN0IC16ICIkbHRfY3ZfcGF0aF9OTSIgJiYgbHRfY3ZfcGF0aF9OTT1ubQorZmldKQorTk09IiRsdF9jdl9wYXRoX05NIgorXSkjIEFDX1BST0dfTk0KKworCisjIEFDX0NIRUNLX0xJQk0KKyMgLS0tLS0tLS0tLS0tLQorIyBjaGVjayBmb3IgbWF0aCBsaWJyYXJ5CitBQ19ERUZVTihbQUNfQ0hFQ0tfTElCTV0sCitbQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAorTElCTT0KK2Nhc2UgJGhvc3QgaW4KKyotKi1iZW9zKiB8ICotKi1jeWd3aW4qIHwgKi0qLXB3MzIqIHwgKi0qLWRhcndpbiopCisgICMgVGhlc2Ugc3lzdGVtIGRvbid0IGhhdmUgbGlibSwgb3IgZG9uJ3QgbmVlZCBpdAorICA7OworKi1uY3Itc3lzdjQuMyopCisgIEFDX0NIRUNLX0xJQihtdywgX213dmFsaWRjaGVja2wsIExJQk09Ii1sbXciKQorICBBQ19DSEVDS19MSUIobSwgY29zLCBMSUJNPSIkTElCTSAtbG0iKQorICA7OworKikKKyAgQUNfQ0hFQ0tfTElCKG0sIGNvcywgTElCTT0iLWxtIikKKyAgOzsKK2VzYWMKK10pIyBBQ19DSEVDS19MSUJNCisKKworIyBBQ19MSUJMVERMX0NPTlZFTklFTkNFKFtESVJFQ1RPUlldKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBzZXRzIExJQkxUREwgdG8gdGhlIGxpbmsgZmxhZ3MgZm9yIHRoZSBsaWJsdGRsIGNvbnZlbmllbmNlIGxpYnJhcnkgYW5kCisjIExURExJTkNMIHRvIHRoZSBpbmNsdWRlIGZsYWdzIGZvciB0aGUgbGlibHRkbCBoZWFkZXIgYW5kIGFkZHMKKyMgLS1lbmFibGUtbHRkbC1jb252ZW5pZW5jZSB0byB0aGUgY29uZmlndXJlIGFyZ3VtZW50cy4gIE5vdGUgdGhhdCBMSUJMVERMCisjIGFuZCBMVERMSU5DTCBhcmUgbm90IEFDX1NVQlNUZWQsIG5vciBpcyBBQ19DT05GSUdfU1VCRElSUyBjYWxsZWQuICBJZgorIyBESVJFQ1RPUlkgaXMgbm90IHByb3ZpZGVkLCBpdCBpcyBhc3N1bWVkIHRvIGJlIGBsaWJsdGRsJy4gIExJQkxUREwgd2lsbAorIyBiZSBwcmVmaXhlZCB3aXRoICcke3RvcF9idWlsZGRpcn0vJyBhbmQgTFRETElOQ0wgd2lsbCBiZSBwcmVmaXhlZCB3aXRoCisjICcke3RvcF9zcmNkaXJ9LycgKG5vdGUgdGhlIHNpbmdsZSBxdW90ZXMhKS4gIElmIHlvdXIgcGFja2FnZSBpcyBub3QKKyMgZmxhdCBhbmQgeW91J3JlIG5vdCB1c2luZyBhdXRvbWFrZSwgZGVmaW5lIHRvcF9idWlsZGRpciBhbmQKKyMgdG9wX3NyY2RpciBhcHByb3ByaWF0ZWx5IGluIHRoZSBNYWtlZmlsZXMuCitBQ19ERUZVTihbQUNfTElCTFRETF9DT05WRU5JRU5DRV0sCitbQUNfQkVGT1JFKFskMF0sW0FDX0xJQlRPT0xfU0VUVVBdKWRubAorICBjYXNlICRlbmFibGVfbHRkbF9jb252ZW5pZW5jZSBpbgorICBubykgQUNfTVNHX0VSUk9SKFt0aGlzIHBhY2thZ2UgbmVlZHMgYSBjb252ZW5pZW5jZSBsaWJsdGRsXSkgOzsKKyAgIiIpIGVuYWJsZV9sdGRsX2NvbnZlbmllbmNlPXllcworICAgICAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAtLWVuYWJsZS1sdGRsLWNvbnZlbmllbmNlIiA7OworICBlc2FjCisgIExJQkxUREw9JyR7dG9wX2J1aWxkZGlyfS8naWZlbHNlKCQjLDEsWyQxXSxbJ2xpYmx0ZGwnXSkvbGlibHRkbGMubGEKKyAgTFRETElOQ0w9Jy1JJHt0b3Bfc3JjZGlyfS8naWZlbHNlKCQjLDEsWyQxXSxbJ2xpYmx0ZGwnXSkKKyAgIyBGb3IgYmFja3dhcmRzIG5vbi1nZXR0ZXh0IGNvbnNpc3RlbnQgY29tcGF0aWJpbGl0eS4uLgorICBJTkNMVERMPSIkTFRETElOQ0wiCitdKSMgQUNfTElCTFRETF9DT05WRU5JRU5DRQorCisKKyMgQUNfTElCTFRETF9JTlNUQUxMQUJMRShbRElSRUNUT1JZXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgc2V0cyBMSUJMVERMIHRvIHRoZSBsaW5rIGZsYWdzIGZvciB0aGUgbGlibHRkbCBpbnN0YWxsYWJsZSBsaWJyYXJ5IGFuZAorIyBMVERMSU5DTCB0byB0aGUgaW5jbHVkZSBmbGFncyBmb3IgdGhlIGxpYmx0ZGwgaGVhZGVyIGFuZCBhZGRzCisjIC0tZW5hYmxlLWx0ZGwtaW5zdGFsbCB0byB0aGUgY29uZmlndXJlIGFyZ3VtZW50cy4gIE5vdGUgdGhhdCBMSUJMVERMCisjIGFuZCBMVERMSU5DTCBhcmUgbm90IEFDX1NVQlNUZWQsIG5vciBpcyBBQ19DT05GSUdfU1VCRElSUyBjYWxsZWQuICBJZgorIyBESVJFQ1RPUlkgaXMgbm90IHByb3ZpZGVkIGFuZCBhbiBpbnN0YWxsZWQgbGlibHRkbCBpcyBub3QgZm91bmQsIGl0IGlzCisjIGFzc3VtZWQgdG8gYmUgYGxpYmx0ZGwnLiAgTElCTFRETCB3aWxsIGJlIHByZWZpeGVkIHdpdGggJyR7dG9wX2J1aWxkZGlyfS8nCisjIGFuZCBMVERMSU5DTCB3aWxsIGJlIHByZWZpeGVkIHdpdGggJyR7dG9wX3NyY2Rpcn0vJyAobm90ZSB0aGUgc2luZ2xlCisjIHF1b3RlcyEpLiAgSWYgeW91ciBwYWNrYWdlIGlzIG5vdCBmbGF0IGFuZCB5b3UncmUgbm90IHVzaW5nIGF1dG9tYWtlLAorIyBkZWZpbmUgdG9wX2J1aWxkZGlyIGFuZCB0b3Bfc3JjZGlyIGFwcHJvcHJpYXRlbHkgaW4gdGhlIE1ha2VmaWxlcy4KKyMgSW4gdGhlIGZ1dHVyZSwgdGhpcyBtYWNybyBtYXkgaGF2ZSB0byBiZSBjYWxsZWQgYWZ0ZXIgQUNfUFJPR19MSUJUT09MLgorQUNfREVGVU4oW0FDX0xJQkxURExfSU5TVEFMTEFCTEVdLAorW0FDX0JFRk9SRShbJDBdLFtBQ19MSUJUT09MX1NFVFVQXSlkbmwKKyAgQUNfQ0hFQ0tfTElCKGx0ZGwsIGx0X2RsaW5pdCwKKyAgW3Rlc3QgeCIkZW5hYmxlX2x0ZGxfaW5zdGFsbCIgIT0geHllcyAmJiBlbmFibGVfbHRkbF9pbnN0YWxsPW5vXSwKKyAgW2lmIHRlc3QgeCIkZW5hYmxlX2x0ZGxfaW5zdGFsbCIgPSB4bm87IHRoZW4KKyAgICAgQUNfTVNHX1dBUk4oW2xpYmx0ZGwgbm90IGluc3RhbGxlZCwgYnV0IGluc3RhbGxhdGlvbiBkaXNhYmxlZF0pCisgICBlbHNlCisgICAgIGVuYWJsZV9sdGRsX2luc3RhbGw9eWVzCisgICBmaQorICBdKQorICBpZiB0ZXN0IHgiJGVuYWJsZV9sdGRsX2luc3RhbGwiID0geCJ5ZXMiOyB0aGVuCisgICAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAtLWVuYWJsZS1sdGRsLWluc3RhbGwiCisgICAgTElCTFRETD0nJHt0b3BfYnVpbGRkaXJ9LydpZmVsc2UoJCMsMSxbJDFdLFsnbGlibHRkbCddKS9saWJsdGRsLmxhCisgICAgTFRETElOQ0w9Jy1JJHt0b3Bfc3JjZGlyfS8naWZlbHNlKCQjLDEsWyQxXSxbJ2xpYmx0ZGwnXSkKKyAgZWxzZQorICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgLS1lbmFibGUtbHRkbC1pbnN0YWxsPW5vIgorICAgIExJQkxUREw9Ii1sbHRkbCIKKyAgICBMVERMSU5DTD0KKyAgZmkKKyAgIyBGb3IgYmFja3dhcmRzIG5vbi1nZXR0ZXh0IGNvbnNpc3RlbnQgY29tcGF0aWJpbGl0eS4uLgorICBJTkNMVERMPSIkTFRETElOQ0wiCitdKSMgQUNfTElCTFRETF9JTlNUQUxMQUJMRQorCisKKyMgQUNfTElCVE9PTF9DWFgKKyMgLS0tLS0tLS0tLS0tLS0KKyMgZW5hYmxlIHN1cHBvcnQgZm9yIEMrKyBsaWJyYXJpZXMKK0FDX0RFRlVOKFtBQ19MSUJUT09MX0NYWF0sCitbQUNfUkVRVUlSRShbX0xUX0FDX0xBTkdfQ1hYXSkKK10pIyBBQ19MSUJUT09MX0NYWAorCisKKyMgX0xUX0FDX0xBTkdfQ1hYCisjIC0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW19MVF9BQ19MQU5HX0NYWF0sCitbQUNfUkVRVUlSRShbQUNfUFJPR19DWFhdKQorQUNfUkVRVUlSRShbQUNfUFJPR19DWFhDUFBdKQorX0xUX0FDX1NIRUxMX0lOSVQoW3RhZ25hbWVzPSR7dGFnbmFtZXMrJHt0YWduYW1lc30sfUNYWF0pCitdKSMgX0xUX0FDX0xBTkdfQ1hYCisKKworIyBBQ19MSUJUT09MX0Y3NworIyAtLS0tLS0tLS0tLS0tLQorIyBlbmFibGUgc3VwcG9ydCBmb3IgRm9ydHJhbiA3NyBsaWJyYXJpZXMKK0FDX0RFRlVOKFtBQ19MSUJUT09MX0Y3N10sCitbQUNfUkVRVUlSRShbX0xUX0FDX0xBTkdfRjc3XSkKK10pIyBBQ19MSUJUT09MX0Y3NworCisKKyMgX0xUX0FDX0xBTkdfRjc3CisjIC0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW19MVF9BQ19MQU5HX0Y3N10sCitbQUNfUkVRVUlSRShbQUNfUFJPR19GNzddKQorX0xUX0FDX1NIRUxMX0lOSVQoW3RhZ25hbWVzPSR7dGFnbmFtZXMrJHt0YWduYW1lc30sfUY3N10pCitdKSMgX0xUX0FDX0xBTkdfRjc3CisKKworIyBBQ19MSUJUT09MX0dDSgorIyAtLS0tLS0tLS0tLS0tLQorIyBlbmFibGUgc3VwcG9ydCBmb3IgR0NKIGxpYnJhcmllcworQUNfREVGVU4oW0FDX0xJQlRPT0xfR0NKXSwKK1tBQ19SRVFVSVJFKFtfTFRfQUNfTEFOR19HQ0pdKQorXSkjIEFDX0xJQlRPT0xfR0NKCisKKworIyBfTFRfQUNfTEFOR19HQ0oKKyMgLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbX0xUX0FDX0xBTkdfR0NKXSwKK1tBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19HQ0pdLFtdLAorICBbQUNfUFJPVklERV9JRkVMU0UoW0FdW01fUFJPR19HQ0pdLFtdLAorICAgIFtBQ19QUk9WSURFX0lGRUxTRShbTFRfQUNfUFJPR19HQ0pdLFtdLAorICAgICAgW2lmZGVmKFtBQ19QUk9HX0dDSl0sW0FDX1JFUVVJUkUoW0FDX1BST0dfR0NKXSldLAorCSBbaWZkZWYoW0FdW01fUFJPR19HQ0pdLFtBQ19SRVFVSVJFKFtBXVtNX1BST0dfR0NKXSldLAorCSAgIFtBQ19SRVFVSVJFKFtBXVtDX1BST0dfR0NKX09SX0FdW01fUFJPR19HQ0pdKV0pXSldKV0pXSkKK19MVF9BQ19TSEVMTF9JTklUKFt0YWduYW1lcz0ke3RhZ25hbWVzKyR7dGFnbmFtZXN9LH1HQ0pdKQorXSkjIF9MVF9BQ19MQU5HX0dDSgorCisKKyMgQUNfTElCVE9PTF9SQworIyAtLS0tLS0tLS0tLS0tLQorIyBlbmFibGUgc3VwcG9ydCBmb3IgV2luZG93cyByZXNvdXJjZSBmaWxlcworQUNfREVGVU4oW0FDX0xJQlRPT0xfUkNdLAorW0FDX1JFUVVJUkUoW0xUX0FDX1BST0dfUkNdKQorX0xUX0FDX1NIRUxMX0lOSVQoW3RhZ25hbWVzPSR7dGFnbmFtZXMrJHt0YWduYW1lc30sfVJDXSkKK10pIyBBQ19MSUJUT09MX1JDCisKKworIyBBQ19MSUJUT09MX0xBTkdfQ19DT05GSUcKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEVuc3VyZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIHZhcnMgZm9yIHRoZSBDIGNvbXBpbGVyIGFyZQorIyBzdWl0YWJseSBkZWZpbmVkLiAgVGhvc2UgdmFyaWFibGVzIGFyZSBzdWJzZXF1ZW50bHkgdXNlZCBieQorIyBBQ19MSUJUT09MX0NPTkZJRyB0byB3cml0ZSB0aGUgY29tcGlsZXIgY29uZmlndXJhdGlvbiB0byBgbGlidG9vbCcuCitBQ19ERUZVTihbQUNfTElCVE9PTF9MQU5HX0NfQ09ORklHXSwgW19MVF9BQ19MQU5HX0NfQ09ORklHXSkKK0FDX0RFRlVOKFtfTFRfQUNfTEFOR19DX0NPTkZJR10sCitbbHRfc2F2ZV9DQz0iJENDIgorQUNfTEFOR19QVVNIKEMpCisKKyMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBDIHRlc3Qgc291cmNlcy4KK2FjX2V4dD1jCisKKyMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBDIHRlc3Qgc291cmNlcy4KK29iamV4dD1vCitfTFRfQUNfVEFHVkFSKG9iamV4dCwgJDEpPSRvYmpleHQKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKK2x0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0iaW50IHNvbWVfdmFyaWFibGUgPSAwO1xuIgorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cworbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSdpbnQgbWFpbigpe3JldHVybigwKTt9XG4nCisKK19MVF9BQ19TWVNfQ09NUElMRVIKKworIworIyBDaGVjayBmb3IgYW55IHNwZWNpYWwgc2hhcmVkIGxpYnJhcnkgY29tcGlsYXRpb24gZmxhZ3MuCisjCitfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY2Nfc2hsaWIsICQxKT0KK2lmIHRlc3QgIiRHQ0MiID0gbm87IHRoZW4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICBzY28zLjJ2NSopCisgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NjX3NobGliLCAkMSk9Jy1iZWxmJworICAgIDs7CisgIGVzYWMKK2ZpCitpZiB0ZXN0IC1uICIkX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NjX3NobGliLCAkMSkiOyB0aGVuCisgIEFDX01TR19XQVJOKFtgJENDJyByZXF1aXJlcyBgJF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jY19zaGxpYiwgJDEpJyB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzXSkKKyAgaWYgZWNobyAiJG9sZF9DQyAkb2xkX0NGTEFHUyAiIHwgZ3JlcCAiW1sgCV1dJF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jY19zaGxpYiwgJDEpW1sgCV1dIiA+L2Rldi9udWxsOyB0aGVuIDoKKyAgZWxzZQorICAgIEFDX01TR19XQVJOKFthZGQgYCRfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY2Nfc2hsaWIsICQxKScgdG8gdGhlIENDIG9yIENGTEFHUyBlbnYgdmFyaWFibGUgYW5kIHJlY29uZmlndXJlXSkKKyAgICBfTFRfQUNfVEFHVkFSKGx0X2N2X3Byb2dfY2NfY2FuX2J1aWxkX3NoYXJlZCwgJDEpPW5vCisgIGZpCitmaQorCisKKyMKKyMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBzdGF0aWMgZmxhZyBhY3R1YWxseSB3b3Jrcy4KKyMKK0FDX0xJQlRPT0xfTElOS0VSX09QVElPTihbaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSkgd29ya3NdLAorICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzLCAkMSksCisgICRfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSksCisgIFtdLAorICBbX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPV0pCisKKworIyMgQ0FWRUFUIEVNUFRPUjoKKyMjIFRoZXJlIGlzIG5vIGVuY2Fwc3VsYXRpb24gd2l0aGluIHRoZSBmb2xsb3dpbmcgbWFjcm9zLCBkbyBub3QgY2hhbmdlCisjIyB0aGUgcnVubmluZyBvcmRlciBvciBvdGhlcndpc2UgbW92ZSB0aGVtIGFyb3VuZCB1bmxlc3MgeW91IGtub3cgZXhhY3RseQorIyMgd2hhdCB5b3UgYXJlIGRvaW5nLi4uCitBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfTk9fUlRUSSgkMSkKK0FDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9QSUMoJDEpCitBQ19MSUJUT09MX1BST0dfQ0NfQ19PKCQxKQorQUNfTElCVE9PTF9TWVNfSEFSRF9MSU5LX0xPQ0tTKCQxKQorQUNfTElCVE9PTF9QUk9HX0xEX1NITElCUygkMSkKK0FDX0xJQlRPT0xfU1lTX0RZTkFNSUNfTElOS0VSKCQxKQorQUNfTElCVE9PTF9QUk9HX0xEX0hBUkRDT0RFX0xJQlBBVEgoJDEpCitBQ19MSUJUT09MX1NZU19MSUJfU1RSSVAKK0FDX0xJQlRPT0xfRExPUEVOX1NFTEYoJDEpCisKKyMgUmVwb3J0IHdoaWNoIGxpYnJhcmllIHR5cGVzIHdpbCBhY3R1YWxseSBiZSBidWlsdAorQUNfTVNHX0NIRUNLSU5HKFtpZiBsaWJ0b29sIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXNdKQorQUNfTVNHX1JFU1VMVChbJGNhbl9idWlsZF9zaGFyZWRdKQorCitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllc10pCit0ZXN0ICIkY2FuX2J1aWxkX3NoYXJlZCIgPSAibm8iICYmIGVuYWJsZV9zaGFyZWQ9bm8KKworIyBPbiBBSVgsIHNoYXJlZCBsaWJyYXJpZXMgYW5kIHN0YXRpYyBsaWJyYXJpZXMgdXNlIHRoZSBzYW1lIG5hbWVzcGFjZSwgYW5kCisjIGFyZSBhbGwgYnVpbHQgZnJvbSBQSUMuCitjYXNlICIkaG9zdF9vcyIgaW4KK2FpeDMqKQorICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubworICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICAgIGFyY2hpdmVfY21kcz0iJGFyY2hpdmVfY21kc35cJFJBTkxJQiBcJGxpYiIKKyAgICBwb3N0aW5zdGFsbF9jbWRzPSckUkFOTElCICRsaWInCisgIGZpCisgIDs7CisKK2FpeDQqIHwgYWl4NSopCisgIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NCAmJiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSBubyA7IHRoZW4KKyAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubworICBmaQorICA7OworICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworICAgIGNhc2UgIiRob3N0X29zIiBpbgorICAgIHJoYXBzb2R5KiB8IGRhcndpbjEuW1swMTJdXSkKKyAgICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nLXVuZGVmaW5lZCBzdXBwcmVzcycKKyAgICAgIDs7CisgICAgKikgIyBEYXJ3aW4gMS4zIG9uCisgICAgICBpZiB0ZXN0IC16ICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUfSA7IHRoZW4KKyAgICAgIAlfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9Jy1mbGF0X25hbWVzcGFjZSAtdW5kZWZpbmVkIHN1cHByZXNzJworICAgICAgZWxzZQorICAgICAgICBjYXNlICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUfSBpbgorICAgICAgICAgIDEwLltbMDEyXV0pCisgICAgICAgICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9Jy1mbGF0X25hbWVzcGFjZSAtdW5kZWZpbmVkIHN1cHByZXNzJworICAgICAgICAgICAgOzsKKyAgICAgICAgICAxMC4qKQorICAgICAgICAgICAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPSctdW5kZWZpbmVkIGR5bmFtaWNfbG9va3VwJworICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgZmkKKyAgICAgIDs7CisgICAgZXNhYworICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJworICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtZHluYW1pY2xpYiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lICRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmcnCisgICAgX0xUX0FDX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPSckQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFncycKKyAgICAjIERvbid0IGZpeCB0aGlzIGJ5IHVzaW5nIHRoZSBsZCAtZXhwb3J0ZWRfc3ltYm9sc19saXN0IGZsYWcsIGl0IGRvZXNuJ3QgZXhpc3QgaW4gb2xkZXIgZGFyd2luIGxkJ3MKKyAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgLWR5bmFtaWNsaWIgJGFsbG93X3VuZGVmaW5lZF9mbGFnICAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZ35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCisgICAgX0xUX0FDX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKT0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnICAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3N+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KKyAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpPXllcworICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPXVuc3VwcG9ydGVkCisgICAgX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPSctYWxsX2xvYWQgJGNvbnZlbmllbmNlJworICAgIF9MVF9BQ19UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworICBlbHNlCisgICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICBmaQorICAgIDs7Citlc2FjCitBQ19NU0dfUkVTVUxUKFskZW5hYmxlX3NoYXJlZF0pCisKK0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzXSkKKyMgTWFrZSBzdXJlIGVpdGhlciBlbmFibGVfc2hhcmVkIG9yIGVuYWJsZV9zdGF0aWMgaXMgeWVzLgordGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzIHx8IGVuYWJsZV9zdGF0aWM9eWVzCitBQ19NU0dfUkVTVUxUKFskZW5hYmxlX3N0YXRpY10pCisKK0FDX0xJQlRPT0xfQ09ORklHKCQxKQorCitBQ19MQU5HX1BPUAorQ0M9IiRsdF9zYXZlX0NDIgorXSkjIEFDX0xJQlRPT0xfTEFOR19DX0NPTkZJRworCisKKyMgQUNfTElCVE9PTF9MQU5HX0NYWF9DT05GSUcKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFycyBmb3IgdGhlIEMgY29tcGlsZXIgYXJlCisjIHN1aXRhYmx5IGRlZmluZWQuICBUaG9zZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5CisjIEFDX0xJQlRPT0xfQ09ORklHIHRvIHdyaXRlIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIHRvIGBsaWJ0b29sJy4KK0FDX0RFRlVOKFtBQ19MSUJUT09MX0xBTkdfQ1hYX0NPTkZJR10sIFtfTFRfQUNfTEFOR19DWFhfQ09ORklHKENYWCldKQorQUNfREVGVU4oW19MVF9BQ19MQU5HX0NYWF9DT05GSUddLAorW0FDX0xBTkdfUFVTSChDKyspCitBQ19SRVFVSVJFKFtBQ19QUk9HX0NYWF0pCitBQ19SRVFVSVJFKFtBQ19QUk9HX0NYWENQUF0pCisKK19MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPQorX0xUX0FDX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT1ubworX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9CitfTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPQorX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9CitfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQsICQxKT0KK19MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPQorX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9bm8KK19MVF9BQ19UQUdWQVIoaGFyZGNvZGVfYXV0b21hdGljLCAkMSk9bm8KK19MVF9BQ19UQUdWQVIobW9kdWxlX2NtZHMsICQxKT0KK19MVF9BQ19UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSk9CitfTFRfQUNfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT11bmtub3duCitfTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0kb2xkX2FyY2hpdmVfY21kcworX0xUX0FDX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPQorX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPQorX0xUX0FDX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9bm8KKworIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYmVmb3JlIGFuZCBhZnRlciB0aGUgb2JqZWN0IGJlaW5nIGxpbmtlZDoKK19MVF9BQ19UQUdWQVIocHJlZGVwX29iamVjdHMsICQxKT0KK19MVF9BQ19UQUdWQVIocG9zdGRlcF9vYmplY3RzLCAkMSk9CitfTFRfQUNfVEFHVkFSKHByZWRlcHMsICQxKT0KK19MVF9BQ19UQUdWQVIocG9zdGRlcHMsICQxKT0KK19MVF9BQ19UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSk9CisKKyMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBDKysgdGVzdCBzb3VyY2VzLgorYWNfZXh0PWNjCisKKyMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBDKysgdGVzdCBzb3VyY2VzLgorb2JqZXh0PW8KK19MVF9BQ19UQUdWQVIob2JqZXh0LCAkMSk9JG9iamV4dAorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSJpbnQgc29tZV92YXJpYWJsZSA9IDA7XG4iCisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCitsdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9J2ludCBtYWluKGludCwgY2hhciAqW10pIHsgcmV0dXJuKDApOyB9XG4nCisKKyMgbHRtYWluIG9ubHkgdXNlcyAkQ0MgZm9yIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzbyBtYWtlIHN1cmUgJENDIGlzIHNldC4KK19MVF9BQ19TWVNfQ09NUElMRVIKKworIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KK2x0X3NhdmVfQ0M9JENDCitsdF9zYXZlX0xEPSRMRAorbHRfc2F2ZV9HQ0M9JEdDQworR0NDPSRHWFgKK2x0X3NhdmVfd2l0aF9nbnVfbGQ9JHdpdGhfZ251X2xkCitsdF9zYXZlX3BhdGhfTEQ9JGx0X2N2X3BhdGhfTEQKK2lmIHRlc3QgLW4gIiR7bHRfY3ZfcHJvZ19nbnVfbGRjeHgrc2V0fSI7IHRoZW4KKyAgbHRfY3ZfcHJvZ19nbnVfbGQ9JGx0X2N2X3Byb2dfZ251X2xkY3h4CitlbHNlCisgIHVuc2V0IGx0X2N2X3Byb2dfZ251X2xkCitmaQoraWYgdGVzdCAtbiAiJHtsdF9jdl9wYXRoX0xEQ1hYK3NldH0iOyB0aGVuCisgIGx0X2N2X3BhdGhfTEQ9JGx0X2N2X3BhdGhfTERDWFgKK2Vsc2UKKyAgdW5zZXQgbHRfY3ZfcGF0aF9MRAorZmkKK3Rlc3QgLXogIiR7TERDWFgrc2V0fSIgfHwgTEQ9JExEQ1hYCitDQz0ke0NYWC0iYysrIn0KK2NvbXBpbGVyPSRDQworX0xUX0FDX1RBR1ZBUihjb21waWxlciwgJDEpPSRDQworY2NfYmFzZW5hbWU9YCRlY2hvIFgiJGNvbXBpbGVyIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisKKyMgV2UgZG9uJ3Qgd2FudCAtZm5vLWV4Y2VwdGlvbiB3ZW4gY29tcGlsaW5nIEMrKyBjb2RlLCBzbyBzZXQgdGhlCisjIG5vX2J1aWx0aW5fZmxhZyBzZXBhcmF0ZWx5CitpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSk9JyAtZm5vLWJ1aWx0aW4nCitlbHNlCisgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKT0KK2ZpCisKK2lmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisgICMgU2V0IHVwIGRlZmF1bHQgR05VIEMrKyBjb25maWd1cmF0aW9uCisKKyAgQUNfUFJPR19MRAorCisgICMgQ2hlY2sgaWYgR05VIEMrKyB1c2VzIEdOVSBsZCBhcyB0aGUgdW5kZXJseWluZyBsaW5rZXIsIHNpbmNlIHRoZQorICAjIGFyY2hpdmluZyBjb21tYW5kcyBiZWxvdyBhc3N1bWUgdGhhdCBHTlUgbGQgaXMgYmVpbmcgdXNlZC4KKyAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKyAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCisgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworCisgICAgIyBJZiBhcmNoaXZlX2NtZHMgcnVucyBMRCwgbm90IENDLCB3bGFyYyBzaG91bGQgYmUgZW1wdHkKKyAgICAjIFhYWCBJIHRoaW5rIHdsYXJjIGNhbiBiZSBlbGltaW5hdGVkIGluIGx0Y2YtY3h4LCBidXQgSSBuZWVkIHRvCisgICAgIyAgICAgaW52ZXN0aWdhdGUgaXQgYSBsaXR0bGUgYml0IG1vcmUuIChNTSkKKyAgICB3bGFyYz0nJHt3bH0nCisKKyAgICAjIGFuY2llbnQgR05VIGxkIGRpZG4ndCBzdXBwb3J0IC0td2hvbGUtYXJjaGl2ZSBldC4gYWwuCisgICAgaWYgZXZhbCAiYCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkYCAtLWhlbHAgMj4mMSIgfCBcCisJZ3JlcCAnbm8td2hvbGUtYXJjaGl2ZScgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgIF9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKKyAgICBlbHNlCisgICAgICBfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9CisgICAgZmkKKyAgZWxzZQorICAgIHdpdGhfZ251X2xkPW5vCisgICAgd2xhcmM9CisKKyAgICAjIEEgZ2VuZXJpYyBhbmQgdmVyeSBzaW1wbGUgZGVmYXVsdCBzaGFyZWQgbGlicmFyeSBjcmVhdGlvbgorICAgICMgY29tbWFuZCBmb3IgR05VIEMrKyBmb3IgdGhlIGNhc2Ugd2hlcmUgaXQgdXNlcyB0aGUgbmF0aXZlCisgICAgIyBsaW5rZXIsIGluc3RlYWQgb2YgR05VIGxkLiAgSWYgcG9zc2libGUsIHRoaXMgc2V0dGluZyBzaG91bGQKKyAgICAjIG92ZXJyaWRkZW4gdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIG5hdGl2ZSBsaW5rZXIgZmVhdHVyZXMgb24KKyAgICAjIHRoZSBwbGF0Zm9ybSBpdCBpcyBiZWluZyB1c2VkIG9uLgorICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW8gJGxpYicKKyAgZmkKKworICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKyAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgZ3JlcCAiXC1MIicKKworZWxzZQorICBHWFg9bm8KKyAgd2l0aF9nbnVfbGQ9bm8KKyAgd2xhcmM9CitmaQorCisjIFBPUlRNRTogZmlsbCBpbiBhIGRlc2NyaXB0aW9uIG9mIHlvdXIgc3lzdGVtJ3MgQysrIGxpbmsgY2hhcmFjdGVyaXN0aWNzCitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllc10pCitfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPXllcworY2FzZSAkaG9zdF9vcyBpbgorICBhaXgzKikKKyAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgOzsKKyAgYWl4NCogfCBhaXg1KikKKyAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAgICAgIyBPbiBJQTY0LCB0aGUgbGlua2VyIGRvZXMgcnVuIHRpbWUgbGlua2luZyBieSBkZWZhdWx0LCBzbyB3ZSBkb24ndAorICAgICAgIyBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuCisgICAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCisgICAgICBleHBfc3ltX2ZsYWc9Jy1CZXhwb3J0JworICAgICAgbm9fZW50cnlfZmxhZz0iIgorICAgIGVsc2UKKyAgICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KKworICAgICAgIyBUZXN0IGlmIHdlIGFyZSB0cnlpbmcgdG8gdXNlIHJ1biB0aW1lIGxpbmtpbmcgb3Igbm9ybWFsCisgICAgICAjIEFJWCBzdHlsZSBsaW5raW5nLiBJZiAtYnJ0bCBpcyBzb21ld2hlcmUgaW4gTERGTEFHUywgd2UKKyAgICAgICMgbmVlZCB0byBkbyBydW50aW1lIGxpbmtpbmcuCisgICAgICBjYXNlICRob3N0X29zIGluIGFpeDQuW1syM11dfGFpeDQuW1syM11dLip8YWl4NSopCisJZm9yIGxkX2ZsYWcgaW4gJExERkxBR1M7IGRvCisJICBjYXNlICRsZF9mbGFnIGluCisJICAqLWJydGwqKQorCSAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPXllcworCSAgICBicmVhaworCSAgICA7OworCSAgZXNhYworCWRvbmUKKyAgICAgIGVzYWMKKworICAgICAgZXhwX3N5bV9mbGFnPSctYmV4cG9ydCcKKyAgICAgIG5vX2VudHJ5X2ZsYWc9Jy1ibm9lbnRyeScKKyAgICBmaQorCisgICAgIyBXaGVuIGxhcmdlIGV4ZWN1dGFibGVzIG9yIHNoYXJlZCBvYmplY3RzIGFyZSBidWlsdCwgQUlYIGxkIGNhbgorICAgICMgaGF2ZSBwcm9ibGVtcyBjcmVhdGluZyB0aGUgdGFibGUgb2YgY29udGVudHMuICBJZiBsaW5raW5nIGEgbGlicmFyeQorICAgICMgb3IgcHJvZ3JhbSByZXN1bHRzIGluICJlcnJvciBUT0Mgb3ZlcmZsb3ciIGFkZCAtbW1pbmltYWwtdG9jIHRvCisgICAgIyBDWFhGTEFHUy9DRkxBR1MgZm9yIGcrKy9nY2MuICBJbiB0aGUgY2FzZXMgd2hlcmUgdGhhdCBpcyBub3QKKyAgICAjIGVub3VnaCB0byBmaXggdGhlIHByb2JsZW0sIGFkZCAtV2wsLWJiaWd0b2MgdG8gTERGTEFHUy4KKworICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JycKKyAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPSc6JworICAgIF9MVF9BQ19UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworCisgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICAgIGNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bMDEyXXxhaXg0LlswMTJdLiopCisgICAgICAjIFdlIG9ubHkgd2FudCB0byBkbyB0aGlzIG9uIEFJWCA0LjIgYW5kIGxvd2VyLCB0aGUgY2hlY2sKKyAgICAgICMgYmVsb3cgZm9yIGJyb2tlbiBjb2xsZWN0MiBkb2Vzbid0IHdvcmsgdW5kZXIgNC4zKworCWNvbGxlY3QybmFtZT1gJHtDQ30gLXByaW50LXByb2ctbmFtZT1jb2xsZWN0MmAKKwlpZiB0ZXN0IC1mICIkY29sbGVjdDJuYW1lIiAmJiBcCisJICAgc3RyaW5ncyAiJGNvbGxlY3QybmFtZSIgfCBncmVwIHJlc29sdmVfbGliX25hbWUgPi9kZXYvbnVsbAorCXRoZW4KKwkgICMgV2UgaGF2ZSByZXdvcmtlZCBjb2xsZWN0MgorCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKwllbHNlCisJICAjIFdlIGhhdmUgb2xkIGNvbGxlY3QyCisJICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXVuc3VwcG9ydGVkCisJICAjIEl0IGZhaWxzIHRvIGZpbmQgdW5pbnN0YWxsZWQgbGlicmFyaWVzIHdoZW4gdGhlIHVuaW5zdGFsbGVkCisJICAjIHBhdGggaXMgbm90IGxpc3RlZCBpbiB0aGUgbGlicGF0aC4gIFNldHRpbmcgaGFyZGNvZGVfbWludXNfTAorCSAgIyB0byB1bnN1cHBvcnRlZCBmb3JjZXMgcmVsaW5raW5nCisJICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKwkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCisJICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0KKwlmaQorICAgICAgZXNhYworICAgICAgc2hhcmVkX2ZsYWc9Jy1zaGFyZWQnCisgICAgZWxzZQorICAgICAgIyBub3QgdXNpbmcgZ2NjCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgVmlzdWFsQWdlIEMrKywgVmVyc2lvbiA1LjUgZm9yIEFJWCA1TCBmb3IgSUEtNjQsIEJldGEgMyBSZWxlYXNlCisJIyBjaG9rZXMgb24gLVdsLC1HLiBUaGUgZm9sbG93aW5nIGxpbmUgaXMgY29ycmVjdDoKKwlzaGFyZWRfZmxhZz0nLUcnCisgICAgICBlbHNlCisJaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJICBzaGFyZWRfZmxhZz0nJHt3bH0tRycKKwllbHNlCisJICBzaGFyZWRfZmxhZz0nJHt3bH0tYk06U1JFJworCWZpCisgICAgICBmaQorICAgIGZpCisKKyAgICAjIEl0IHNlZW1zIHRoYXQgLWJleHBhbGwgZG9lcyBub3QgZXhwb3J0IHN5bWJvbHMgYmVnaW5uaW5nIHdpdGgKKyAgICAjIHVuZGVyc2NvcmUgKF8pLCBzbyBpdCBpcyBiZXR0ZXIgdG8gZ2VuZXJhdGUgYSBsaXN0IG9mIHN5bWJvbHMgdG8gZXhwb3J0LgorICAgIF9MVF9BQ19UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9eWVzCisgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisgICAgICAjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW50aW1lIGxvYWRpbmcgZmxhZ3MgKC1icnRsKSwKKyAgICAgICMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKyAgICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nLWJlcm9rJworICAgICAgIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuIGVtcHR5IGV4ZWN1dGFibGUuCisgICAgICBfTFRfQUNfU1lTX0xJQlBBVEhfQUlYCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKKworICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9IlwkQ0MiJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyBgaWYgdGVzdCAieCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IiAhPSAieCI7IHRoZW4gZWNobyAiJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSI7IGVsc2UgOjsgZmlgICciXCR7d2x9JG5vX2VudHJ5X2ZsYWcgXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzICRzaGFyZWRfZmxhZyIKKyAgICAgZWxzZQorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tUiAkbGliZGlyOi91c3IvbGliOi9saWInCisJX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPSIteiBub2RlZnMiCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAnIlwke3dsfSRub19lbnRyeV9mbGFnIFwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyIKKyAgICAgIGVsc2UKKwkjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4gZW1wdHkgZXhlY3V0YWJsZS4KKwlfTFRfQUNfU1lTX0xJQlBBVEhfQUlYCisJX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCisJIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVuIHRpbWUgbG9hZGluZyBmbGFncywKKwkjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCisJX0xUX0FDX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tYmVybm90b2snCisJX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tYmVyb2snCisJIyAtYmV4cGFsbCBkb2VzIG5vdCBleHBvcnQgc3ltYm9scyBiZWdpbm5pbmcgd2l0aCB1bmRlcnNjb3JlIChfKQorCV9MVF9BQ19UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9eWVzCisJIyBFeHBvcnRlZCBzeW1ib2xzIGNhbiBiZSBwdWxsZWQgaW50byBzaGFyZWQgb2JqZWN0cyBmcm9tIGFyY2hpdmVzCisJX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScgJworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT15ZXMKKwkjIFRoaXMgaXMgc2ltaWxhciB0byBob3cgQUlYIHRyYWRpdGlvbmFsbHkgYnVpbGRzIGl0J3Mgc2hhcmVkIGxpYnJhcmllcy4KKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1iRTokZXhwb3J0X3N5bWJvbHMgJHt3bH0tYm5vZW50cnkke2FsbG93X3VuZGVmaW5lZF9mbGFnfX4kQVIgJEFSX0ZMQUdTICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lJHJlbGVhc2UuYSAkb3V0cHV0X29iamRpci8kc29uYW1lJworICAgICAgZmkKKyAgICBmaQorICAgIDs7CisgIGNob3J1cyopCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICopCisJIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCTs7CisgICAgZXNhYworICAgIDs7CisKKyAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQorICAgICMgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSkgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsCisgICAgIyBhcyB0aGVyZSBpcyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KKyAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorICAgIF9MVF9BQ19UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9bm8KKyAgICBfTFRfQUNfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT15ZXMKKworICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJ2F1dG8taW1wb3J0JyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1pbWFnZS1iYXNlPTB4MTAwMDAwMDAgJHt3bH0tLW91dC1pbXBsaWIsJGxpYicKKyAgICAgICMgSWYgdGhlIGV4cG9ydC1zeW1ib2xzIGZpbGUgYWxyZWFkeSBpcyBhIC5kZWYgZmlsZSAoMXN0IGxpbmUKKyAgICAgICMgaXMgRVhQT1JUUyksIHVzZSBpdCBhcyBpczsgb3RoZXJ3aXNlLCBwcmVwZW5kLi4uCisgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0naWYgdGVzdCAieGAkU0VEIDFxICRleHBvcnRfc3ltYm9sc2AiID0geEVYUE9SVFM7IHRoZW4KKwljcCAkZXhwb3J0X3N5bWJvbHMgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisgICAgICBlbHNlCisJZWNobyBFWFBPUlRTID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJY2F0ICRleHBvcnRfc3ltYm9scyA+PiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKyAgICAgIGZpfgorICAgICAgJENDIC1zaGFyZWQgLW5vc3RkbGliICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1pbWFnZS1iYXNlPTB4MTAwMDAwMDAgJHt3bH0tLW91dC1pbXBsaWIsJGxpYicKKyAgICBlbHNlCisgICAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgZmkKKyAgOzsKKworICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworICAgIGNhc2UgIiRob3N0X29zIiBpbgorICAgIHJoYXBzb2R5KiB8IGRhcndpbjEuW1swMTJdXSkKKyAgICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nLXVuZGVmaW5lZCBzdXBwcmVzcycKKyAgICAgIDs7CisgICAgKikgIyBEYXJ3aW4gMS4zIG9uCisgICAgICBpZiB0ZXN0IC16ICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUfSA7IHRoZW4KKyAgICAgIAlfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9Jy1mbGF0X25hbWVzcGFjZSAtdW5kZWZpbmVkIHN1cHByZXNzJworICAgICAgZWxzZQorICAgICAgICBjYXNlICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUfSBpbgorICAgICAgICAgIDEwLltbMDEyXV0pCisgICAgICAgICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9Jy1mbGF0X25hbWVzcGFjZSAtdW5kZWZpbmVkIHN1cHByZXNzJworICAgICAgICAgICAgOzsKKyAgICAgICAgICAxMC4qKQorICAgICAgICAgICAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPSctdW5kZWZpbmVkIGR5bmFtaWNfbG9va3VwJworICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgZmkKKyAgICAgIDs7CisgICAgZXNhYworICAgIGx0X2ludF9hcHBsZV9jY19zaW5nbGVfbW9kPW5vCisgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2VjaG8nCisgICAgaWYgJENDIC1kdW1wc3BlY3MgMj4mMSB8IGdyZXAgJ3NpbmdsZV9tb2R1bGUnID4vZGV2L251bGwgOyB0aGVuCisgICAgICBsdF9pbnRfYXBwbGVfY2Nfc2luZ2xlX21vZD15ZXMKKyAgICBmaQorICAgIGlmIHRlc3QgIlgkbHRfaW50X2FwcGxlX2NjX3NpbmdsZV9tb2QiID0gWHllcyA7IHRoZW4KKyAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtZHluYW1pY2xpYiAtc2luZ2xlX21vZHVsZSAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nJworICAgIGVsc2UKKyAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtciAke3dsfS1iaW5kX2F0X2xvYWQgLWtlZXBfcHJpdmF0ZV9leHRlcm5zIC1ub3N0ZGxpYiAtbyAke2xpYn0tbWFzdGVyLm8gJGxpYm9ianN+JENDIC1keW5hbWljbGliICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICR7bGlifS1tYXN0ZXIubyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nJworICAgIGZpCisgICAgX0xUX0FDX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPSckQ0MgJHt3bH0tYmluZF9hdF9sb2FkICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3MnCisKKyAgICAjIERvbid0IGZpeCB0aGlzIGJ5IHVzaW5nIHRoZSBsZCAtZXhwb3J0ZWRfc3ltYm9sc19saXN0IGZsYWcsIGl0IGRvZXNuJ3QgZXhpc3QgaW4gb2xkZXIgZGFyd2luIGxkJ3MKKyAgICBpZiB0ZXN0ICJYJGx0X2ludF9hcHBsZV9jY19zaW5nbGVfbW9kIiA9IFh5ZXMgOyB0aGVuCisgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgLWR5bmFtaWNsaWIgLXNpbmdsZV9tb2R1bGUgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZ35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCisgICAgZWxzZQorICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDIC1yICR7d2x9LWJpbmRfYXRfbG9hZCAta2VlcF9wcml2YXRlX2V4dGVybnMgLW5vc3RkbGliIC1vICR7bGlifS1tYXN0ZXIubyAkbGlib2Jqc34kQ0MgLWR5bmFtaWNsaWIgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJHtsaWJ9LW1hc3Rlci5vICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lICRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmd+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgIGZpCisgICAgX0xUX0FDX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKT0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnICAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3N+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KKyAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpPXllcworICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPXVuc3VwcG9ydGVkCisgICAgX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPSctYWxsX2xvYWQgJGNvbnZlbmllbmNlJworICAgIF9MVF9BQ19UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworICBlbHNlCisgICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICBmaQorICAgIDs7CisKKyAgZGd1eCopCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIGVjKyspCisJIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCTs7CisgICAgICBnaGN4KQorCSMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCisJIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCTs7CisgICAgICAqKQorCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwk7OworICAgIGVzYWMKKyAgICA7OworICBmcmVlYnNkWzEyXSopCisgICAgIyBDKysgc2hhcmVkIGxpYnJhcmllcyByZXBvcnRlZCB0byBiZSBmYWlybHkgYnJva2VuIGJlZm9yZSBzd2l0Y2ggdG8gRUxGCisgICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgIDs7CisgIGZyZWVic2QtZWxmKikKKyAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KKyAgICA7OworICBmcmVlYnNkKiB8IGtmcmVlYnNkKi1nbnUpCisgICAgIyBGcmVlQlNEIDMgYW5kIGxhdGVyIHVzZSBHTlUgQysrIGFuZCBHTlUgbGQgd2l0aCBzdGFuZGFyZCBFTEYKKyAgICAjIGNvbnZlbnRpb25zCisgICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT15ZXMKKyAgICA7OworICBnbnUqKQorICAgIDs7CisgIGhwdXg5KikKKyAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCisgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMgIyBOb3QgaW4gdGhlIHNlYXJjaCBQQVRILAorCQkJCSMgYnV0IGFzIHRoZSBkZWZhdWx0CisJCQkJIyBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKworICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgQ0MpCisgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIDs7CisgICAgYUNDKQorICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJHJtICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1iICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisgICAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKyAgICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorICAgICAgIworICAgICAgIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorICAgICAgIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KKyAgICAgICMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKKyAgICAgICMgZGVwZW5kZW5jaWVzLgorICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAoJENDIC1iICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxKSB8IGdyZXAgIlstXUwiYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGVjaG8gJGxpc3QnCisgICAgICA7OworICAgICopCisgICAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckcm0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kQ0MgLXNoYXJlZCAtbm9zdGRsaWIgLWZQSUMgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKKyAgICAgIGVsc2UKKyAgICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgICAgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIGZpCisgICAgICA7OworICAgIGVzYWMKKyAgICA7OworICBocHV4MTAqfGhwdXgxMSopCisgICAgaWYgdGVzdCAkd2l0aF9nbnVfbGQgPSBubzsgdGhlbgorICAgICAgY2FzZSAiJGhvc3RfY3B1IiBpbgorICAgICAgaHBwYSo2NCopCisJX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCwgJDEpPScrYiAkbGliZGlyJworCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKyAgICAgICAgOzsKKyAgICAgIGlhNjQqKQorCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCisgICAgICAgIDs7CisgICAgICAqKQorCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfStiICR7d2x9JGxpYmRpcicKKwlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisJX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKKyAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICAgIGNhc2UgIiRob3N0X2NwdSIgaW4KKyAgICBocHBhKjY0KikKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworICAgIGlhNjQqKQorICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcyAjIE5vdCBpbiB0aGUgc2VhcmNoIFBBVEgsCisJCQkJCSAgICAgICMgYnV0IGFzIHRoZSBkZWZhdWx0CisJCQkJCSAgICAgICMgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCisgICAgICA7OworICAgICopCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzICMgTm90IGluIHRoZSBzZWFyY2ggUEFUSCwKKwkJCQkJICAgICAgIyBidXQgYXMgdGhlIGRlZmF1bHQKKwkJCQkJICAgICAgIyBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKyAgICAgIDs7CisgICAgZXNhYworCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIENDKQorCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwk7OworICAgICAgYUNDKQorCWNhc2UgIiRob3N0X2NwdSIgaW4KKwlocHBhKjY0KnxpYTY0KikKKwkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtYiAraCAkc29uYW1lIC1vICRsaWIgJGxpbmtlcl9mbGFncyAkbGlib2JqcyAkZGVwbGlicycKKwkgIDs7CisJKikKKwkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwllc2FjCisJIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSMKKwkjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCisJIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KKwkjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisJIyBkZXBlbmRlbmNpZXMuCisJb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAoJENDIC1iICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxKSB8IGdyZXAgIlwtTCJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZWNobyAkbGlzdCcKKwk7OworICAgICAgKikKKwlpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorCSAgaWYgdGVzdCAkd2l0aF9nbnVfbGQgPSBubzsgdGhlbgorCSAgICBjYXNlICIkaG9zdF9jcHUiIGluCisJICAgIGlhNjQqfGhwcGEqNjQqKQorCSAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtYiAraCAkc29uYW1lIC1vICRsaWIgJGxpbmtlcl9mbGFncyAkbGlib2JqcyAkZGVwbGlicycKKwkgICAgICA7OworCSAgICAqKQorCSAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgIDs7CisJICAgIGVzYWMKKwkgIGZpCisJZWxzZQorCSAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJZmkKKwk7OworICAgIGVzYWMKKyAgICA7OworICBpcml4NSogfCBpcml4NiopCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIENDKQorCSMgU0dJIEMrKworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1hbGwgLW11bHRpZ290ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCisJIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCisJIyAiQ0MgLWFyIiwgd2hlcmUgIkNDIiBpcyB0aGUgSVJJWCBDKysgY29tcGlsZXIuICBUaGlzIGlzCisJIyBuZWNlc3NhcnkgdG8gbWFrZSBzdXJlIGluc3RhbnRpYXRlZCB0ZW1wbGF0ZXMgYXJlIGluY2x1ZGVkCisJIyBpbiB0aGUgYXJjaGl2ZS4KKwlfTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDIC1hciAtV1IsLXUgLW8gJG9sZGxpYiAkb2xkb2JqcycKKwk7OworICAgICAgKikKKwlpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorCSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwkgIGVsc2UKKwkgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgLW8gJGxpYicKKwkgIGZpCisJZmkKKwlfTFRfQUNfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKwk7OworICAgIGVzYWMKKyAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKyAgICA7OworICBsaW51eCopCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIEtDQykKKwkjIEt1Y2sgYW5kIEFzc29jaWF0ZXMsIEluYy4gKEtBSSkgQysrIENvbXBpbGVyCisKKwkjIEtDQyB3aWxsIG9ubHkgY3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkgaWYgdGhlIG91dHB1dCBmaWxlCisJIyBlbmRzIHdpdGggIi5zbyIgKG9yICIuc2wiIGZvciBIUC1VWCksIHNvIHJlbmFtZSB0aGUgbGlicmFyeQorCSMgdG8gaXRzIHByb3BlciBuYW1lICh3aXRoIHZlcnNpb24pIGFmdGVyIGxpbmtpbmcuCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0ndGVtcGV4dD1gZWNobyAkc2hhcmVkX2V4dCB8ICRTRUQgLWUgJ1wnJ3MvXChbW14oKTAtOUEtWmEtent9XV1cKS9cXFxcXDEvZydcJydgOyB0ZW1wbGliPWBlY2hvICRsaWIgfCAkU0VEIC1lICJzL1wke3RlbXBleHR9XC4uKi8uc28vImA7ICRDQyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLS1zb25hbWUgJHNvbmFtZSAtbyBcJHRlbXBsaWI7IG12IFwkdGVtcGxpYiAkbGliJworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSd0ZW1wZXh0PWBlY2hvICRzaGFyZWRfZXh0IHwgJFNFRCAtZSAnXCcncy9cKFtbXigpMC05QS1aYS16e31dXVwpL1xcXFxcMS9nJ1wnJ2A7IHRlbXBsaWI9YGVjaG8gJGxpYiB8ICRTRUQgLWUgInMvXCR7dGVtcGV4dH1cLi4qLy5zby8iYDsgJENDICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtLXNvbmFtZSAkc29uYW1lIC1vIFwkdGVtcGxpYiAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9sczsgbXYgXCR0ZW1wbGliICRsaWInCisJIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSMKKwkjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCisJIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KKwkjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisJIyBkZXBlbmRlbmNpZXMuCisJb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAkQ0MgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IC1vIGxpYmNvbmZ0ZXN0JHNoYXJlZF9leHQgMj4mMSB8IGdyZXAgImxkImA7IHJtIC1mIGxpYmNvbmZ0ZXN0JHNoYXJlZF9leHQ7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBlY2hvICRsaXN0JworCisJX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1ycGF0aCwkbGliZGlyJworCV9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKworCSMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZworCSMgIkNDIC1Cc3RhdGljIiwgd2hlcmUgIkNDIiBpcyB0aGUgS0FJIEMrKyBjb21waWxlci4KKwlfTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDIC1Cc3RhdGljIC1vICRvbGRsaWIgJG9sZG9ianMnCisJOzsKKyAgICAgIGljcGMpCisJIyBJbnRlbCBDKysKKwl3aXRoX2dudV9sZD15ZXMKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworCV9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJOzsKKyAgICAgIGN4eCkKKwkjIENvbXBhcSBDKysKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICAtbyAkbGliICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzJworCisJcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKwlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLXJwYXRoICRsaWJkaXInCisJX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorCisJIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSMKKwkjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCisJIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KKwkjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisJIyBkZXBlbmRlbmNpZXMuCisJb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAkQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgImxkImA7IHRlbXBsaXN0PWBlY2hvICR0ZW1wbGlzdCB8ICRTRUQgInMvXCheLipsZC4qXClcKCAuKmxkIC4qJFwpL1wxLyJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZWNobyAkbGlzdCcKKwk7OworICAgIGVzYWMKKyAgICA7OworICBseW54b3MqKQorICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICA7OworICBtODhrKikKKyAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgOzsKKyAgbXZzKikKKyAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgY3h4KQorCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwk7OworICAgICAgKikKKwkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJOzsKKyAgICBlc2FjCisgICAgOzsKKyAgbmV0YnNkKiB8IGtuZXRic2QqLWdudSkKKyAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCisgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUJzaGFyZWFibGUgIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGxpbmtlcl9mbGFncycKKyAgICAgIHdsYXJjPQorICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgIGZpCisgICAgIyBXb3JrYXJvdW5kIHNvbWUgYnJva2VuIHByZS0xLjUgdG9vbGNoYWlucworICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgY29uZnRlc3QuJG9iamV4dCB8ICRTRUQgLWUgInM6LWxnY2MgLWxjIC1sZ2NjOjoiJworICAgIDs7CisgIG9zZjMqKQorICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBLQ0MpCisJIyBLdWNrIGFuZCBBc3NvY2lhdGVzLCBJbmMuIChLQUkpIEMrKyBDb21waWxlcgorCisJIyBLQ0Mgd2lsbCBvbmx5IGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IGlmIHRoZSBvdXRwdXQgZmlsZQorCSMgZW5kcyB3aXRoICIuc28iIChvciAiLnNsIiBmb3IgSFAtVVgpLCBzbyByZW5hbWUgdGhlIGxpYnJhcnkKKwkjIHRvIGl0cyBwcm9wZXIgbmFtZSAod2l0aCB2ZXJzaW9uKSBhZnRlciBsaW5raW5nLgorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9J3RlbXBleHQ9YGVjaG8gJHNoYXJlZF9leHQgfCAkU0VEIC1lICdcJydzL1woW1teKCkwLTlBLVphLXp7fV1dXCkvXFxcXFwxL2cnXCcnYDsgdGVtcGxpYj1gZWNobyAkbGliIHwgJFNFRCAtZSAicy9cJHt0ZW1wZXh0fVwuLiovLnNvLyJgOyAkQ0MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC0tc29uYW1lICRzb25hbWUgLW8gXCR0ZW1wbGliOyBtdiBcJHRlbXBsaWIgJGxpYicKKworCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJworCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKworCSMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZworCSMgIkNDIC1Cc3RhdGljIiwgd2hlcmUgIkNDIiBpcyB0aGUgS0FJIEMrKyBjb21waWxlci4KKwlfTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDIC1Cc3RhdGljIC1vICRvbGRsaWIgJG9sZG9ianMnCisKKwk7OworICAgICAgUkNDKQorCSMgUmF0aW9uYWwgQysrIDIuNC4xCisJIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCTs7CisgICAgICBjeHgpCisJX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKworCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisJX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorCisJIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSMKKwkjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCisJIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KKwkjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisJIyBkZXBlbmRlbmNpZXMuCisJb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAkQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgImxkIiB8IGdyZXAgLXYgImxkOiJgOyB0ZW1wbGlzdD1gZWNobyAkdGVtcGxpc3QgfCAkU0VEICJzL1woXi4qbGQuKlwpXCggLipsZC4qJFwpL1wxLyJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZWNobyAkbGlzdCcKKwk7OworICAgICAgKikKKwlpZiB0ZXN0ICIkR1hYIiA9IHllcyAmJiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwkgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCisJICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisKKwkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisJICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisKKwkgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwICJcLUwiJworCisJZWxzZQorCSAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJZmkKKwk7OworICAgIGVzYWMKKyAgICA7OworICBvc2Y0KiB8IG9zZjUqKQorICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBLQ0MpCisJIyBLdWNrIGFuZCBBc3NvY2lhdGVzLCBJbmMuIChLQUkpIEMrKyBDb21waWxlcgorCisJIyBLQ0Mgd2lsbCBvbmx5IGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IGlmIHRoZSBvdXRwdXQgZmlsZQorCSMgZW5kcyB3aXRoICIuc28iIChvciAiLnNsIiBmb3IgSFAtVVgpLCBzbyByZW5hbWUgdGhlIGxpYnJhcnkKKwkjIHRvIGl0cyBwcm9wZXIgbmFtZSAod2l0aCB2ZXJzaW9uKSBhZnRlciBsaW5raW5nLgorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9J3RlbXBleHQ9YGVjaG8gJHNoYXJlZF9leHQgfCAkU0VEIC1lICdcJydzL1woW1teKCkwLTlBLVphLXp7fV1dXCkvXFxcXFwxL2cnXCcnYDsgdGVtcGxpYj1gZWNobyAkbGliIHwgJFNFRCAtZSAicy9cJHt0ZW1wZXh0fVwuLiovLnNvLyJgOyAkQ0MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC0tc29uYW1lICRzb25hbWUgLW8gXCR0ZW1wbGliOyBtdiBcJHRlbXBsaWIgJGxpYicKKworCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJworCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKworCSMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZworCSMgdGhlIEtBSSBDKysgY29tcGlsZXIuCisJX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtbyAkb2xkbGliICRvbGRvYmpzJworCTs7CisgICAgICBSQ0MpCisJIyBSYXRpb25hbCBDKysgMi40LjEKKwkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJOzsKKyAgICAgIGN4eCkKKwlfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW1zeW0gLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZm9yIGkgaW4gYGNhdCAkZXhwb3J0X3N5bWJvbHNgOyBkbyBwcmludGYgIiVzICVzXFxuIiAtZXhwb3J0ZWRfc3ltYm9sICJcJGkiID4+ICRsaWIuZXhwOyBkb25lfgorCSAgZWNobyAiLWhpZGRlbiI+PiAkbGliLmV4cH4KKwkgICRDQyAtc2hhcmVkJGFsbG93X3VuZGVmaW5lZF9mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgLVdsLC1pbnB1dCAtV2wsJGxpYi5leHAgIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbgkkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICRvYmpkaXIvc29fbG9jYXRpb25zIC1vICRsaWJ+CisJICAkcm0gJGxpYi5leHAnCisKKwlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLXJwYXRoICRsaWJkaXInCisJX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorCisJIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSMKKwkjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCisJIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KKwkjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisJIyBkZXBlbmRlbmNpZXMuCisJb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAkQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgImxkIiB8IGdyZXAgLXYgImxkOiJgOyB0ZW1wbGlzdD1gZWNobyAkdGVtcGxpc3QgfCAkU0VEICJzL1woXi4qbGQuKlwpXCggLipsZC4qJFwpL1wxLyJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZWNobyAkbGlzdCcKKwk7OworICAgICAgKikKKwlpZiB0ZXN0ICIkR1hYIiA9IHllcyAmJiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwkgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCisJIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tbXN5bSAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCisJICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorCisJICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgZ3JlcCAiXC1MIicKKworCWVsc2UKKwkgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCWZpCisJOzsKKyAgICBlc2FjCisgICAgOzsKKyAgcHNvcyopCisgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgIDs7CisgIHNjbyopCisgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIENDKQorCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwk7OworICAgICAgKikKKwkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJOzsKKyAgICBlc2FjCisgICAgOzsKKyAgc3Vub3M0KikKKyAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgQ0MpCisJIyBTdW4gQysrIDQueAorCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwk7OworICAgICAgbGNjKQorCSMgTHVjaWQKKwkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJOzsKKyAgICAgICopCisJIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCTs7CisgICAgZXNhYworICAgIDs7CisgIHNvbGFyaXMqKQorICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBDQykKKwkjIFN1biBDKysgNC4yLCA1LnggYW5kIENlbnRlcmxpbmUgQysrCisJX0xUX0FDX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScgLXpkZWZzJworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1ub2xpYiAtaCRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCSRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1ub2xpYiAke3dsfS1NICR7d2x9JGxpYi5leHAgLWgkc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfiRybSAkbGliLmV4cCcKKworCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCisJX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKwljYXNlICRob3N0X29zIGluCisJICBzb2xhcmlzMi5bMC01XSB8IHNvbGFyaXMyLlswLTVdLiopIDs7CisJICAqKQorCSAgICAjIFRoZSBDKysgY29tcGlsZXIgaXMgdXNlZCBhcyBsaW5rZXIgc28gd2UgbXVzdCB1c2UgJHdsCisJICAgICMgZmxhZyB0byBwYXNzIHRoZSBjb21tYW5kcyB0byB0aGUgdW5kZXJseWluZyBzeXN0ZW0KKwkgICAgIyBsaW5rZXIuCisJICAgICMgU3VwcG9ydGVkIHNpbmNlIFNvbGFyaXMgMi42IChtYXliZSAyLjUuMT8pCisJICAgIF9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0teiAke3dsfWFsbGV4dHJhY3QkY29udmVuaWVuY2UgJHt3bH0teiAke3dsfWRlZmF1bHRleHRyYWN0JworCSAgICA7OworCWVzYWMKKwlfTFRfQUNfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKworCSMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkjCisJIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorCSMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCisJIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQorCSMgZGVwZW5kZW5jaWVzLgorCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gJENDIC1HICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgZ3JlcCAiXC1bW0xSXV0iYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGVjaG8gJGxpc3QnCisKKwkjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKKwkjICJDQyAteGFyIiwgd2hlcmUgIkNDIiBpcyB0aGUgU3VuIEMrKyBjb21waWxlci4gIFRoaXMgaXMKKwkjIG5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgaW5zdGFudGlhdGVkIHRlbXBsYXRlcyBhcmUgaW5jbHVkZWQKKwkjIGluIHRoZSBhcmNoaXZlLgorCV9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSckQ0MgLXhhciAtbyAkb2xkbGliICRvbGRvYmpzJworCTs7CisgICAgICBnY3gpCisJIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCAkd2wkc29uYW1lIC1vICRsaWInCisKKwkjIFRoZSBDKysgY29tcGlsZXIgbXVzdCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgYXJjaGl2ZS4KKwlfTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDICRMREZMQUdTIC1hcmNoaXZlIC1vICRvbGRsaWIgJG9sZG9ianMnCisJOzsKKyAgICAgICopCisJIyBHTlUgQysrIGNvbXBpbGVyIHdpdGggU29sYXJpcyBsaW5rZXIKKwlpZiB0ZXN0ICIkR1hYIiA9IHllcyAmJiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwkgIF9MVF9BQ19UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LXogJHt3bH1kZWZzJworCSAgaWYgJENDIC0tdmVyc2lvbiB8IGdyZXAgLXYgJ14yXC43JyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJExERkxBR1MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWggJHdsJHNvbmFtZSAtbyAkbGliJworCSAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+JGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJCSRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAke3dsfS1NICR3bCRsaWIuZXhwIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfiRybSAkbGliLmV4cCcKKworCSAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9IiRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgZ3JlcCBcIlwtTFwiIgorCSAgZWxzZQorCSAgICAjIGcrKyAyLjcgYXBwZWFycyB0byByZXF1aXJlIGAtRycgTk9UIGAtc2hhcmVkJyBvbiB0aGlzCisJICAgICMgcGxhdGZvcm0uCisJICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyAtbm9zdGRsaWIgJExERkxBR1MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWggJHdsJHNvbmFtZSAtbyAkbGliJworCSAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+JGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJCSRDQyAtRyAtbm9zdGRsaWIgJHt3bH0tTSAkd2wkbGliLmV4cCAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc34kcm0gJGxpYi5leHAnCisKKwkgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSIkQ0MgLUcgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwIFwiXC1MXCIiCisJICBmaQorCisJICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tUiAkd2wkbGliZGlyJworCWZpCisJOzsKKyAgICBlc2FjCisgICAgOzsKKyAgc3lzdjVPcGVuVU5JWDgqIHwgc3lzdjVVbml4V2FyZTcqIHwgc3lzdjV1d1tbNzhdXSogfCB1bml4d2FyZTcqKQorICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworICAgIDs7CisgIHRhbmRlbSopCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIE5DQykKKwkjIE5vblN0b3AtVVggTkNDIDMuMjAKKwkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJOzsKKyAgICAgICopCisJIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCTs7CisgICAgZXNhYworICAgIDs7CisgIHZ4d29ya3MqKQorICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICA7OworICAqKQorICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICA7OworZXNhYworQUNfTVNHX1JFU1VMVChbJF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSldKQordGVzdCAiJF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSkiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubworCitfTFRfQUNfVEFHVkFSKEdDQywgJDEpPSIkR1hYIgorX0xUX0FDX1RBR1ZBUihMRCwgJDEpPSIkTEQiCisKKyMjIENBVkVBVCBFTVBUT1I6CisjIyBUaGVyZSBpcyBubyBlbmNhcHN1bGF0aW9uIHdpdGhpbiB0aGUgZm9sbG93aW5nIG1hY3JvcywgZG8gbm90IGNoYW5nZQorIyMgdGhlIHJ1bm5pbmcgb3JkZXIgb3Igb3RoZXJ3aXNlIG1vdmUgdGhlbSBhcm91bmQgdW5sZXNzIHlvdSBrbm93IGV4YWN0bHkKKyMjIHdoYXQgeW91IGFyZSBkb2luZy4uLgorQUNfTElCVE9PTF9QT1NUREVQX1BSRURFUCgkMSkKK0FDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9QSUMoJDEpCitBQ19MSUJUT09MX1BST0dfQ0NfQ19PKCQxKQorQUNfTElCVE9PTF9TWVNfSEFSRF9MSU5LX0xPQ0tTKCQxKQorQUNfTElCVE9PTF9QUk9HX0xEX1NITElCUygkMSkKK0FDX0xJQlRPT0xfU1lTX0RZTkFNSUNfTElOS0VSKCQxKQorQUNfTElCVE9PTF9QUk9HX0xEX0hBUkRDT0RFX0xJQlBBVEgoJDEpCitBQ19MSUJUT09MX1NZU19MSUJfU1RSSVAKK0FDX0xJQlRPT0xfRExPUEVOX1NFTEYoJDEpCisKK0FDX0xJQlRPT0xfQ09ORklHKCQxKQorCitBQ19MQU5HX1BPUAorQ0M9JGx0X3NhdmVfQ0MKK0xEQ1hYPSRMRAorTEQ9JGx0X3NhdmVfTEQKK0dDQz0kbHRfc2F2ZV9HQ0MKK3dpdGhfZ251X2xkY3h4PSR3aXRoX2dudV9sZAord2l0aF9nbnVfbGQ9JGx0X3NhdmVfd2l0aF9nbnVfbGQKK2x0X2N2X3BhdGhfTERDWFg9JGx0X2N2X3BhdGhfTEQKK2x0X2N2X3BhdGhfTEQ9JGx0X3NhdmVfcGF0aF9MRAorbHRfY3ZfcHJvZ19nbnVfbGRjeHg9JGx0X2N2X3Byb2dfZ251X2xkCitsdF9jdl9wcm9nX2dudV9sZD0kbHRfc2F2ZV93aXRoX2dudV9sZAorXSkjIEFDX0xJQlRPT0xfTEFOR19DWFhfQ09ORklHCisKKyMgQUNfTElCVE9PTF9QT1NUREVQX1BSRURFUChbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGaWd1cmUgb3V0ICJoaWRkZW4iIGxpYnJhcnkgZGVwZW5kZW5jaWVzIGZyb20gdmVyYm9zZQorIyBjb21waWxlciBvdXRwdXQgd2hlbiBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisjIFBhcnNlIHRoZSBjb21waWxlciBvdXRwdXQgYW5kIGV4dHJhY3QgdGhlIG5lY2Vzc2FyeQorIyBvYmplY3RzLCBsaWJyYXJpZXMgYW5kIGxpYnJhcnkgZmxhZ3MuCitBQ19ERUZVTihbQUNfTElCVE9PTF9QT1NUREVQX1BSRURFUF0sWworZG5sIHdlIGNhbid0IHVzZSB0aGUgbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIGhlcmUsCitkbmwgYmVjYXVzZSBpdCBjb250YWlucyBjb2RlIGludGVuZGVkIGZvciBhbiBleGVjdXRhYmxlLAorZG5sIG5vdCBhIGxpYnJhcnkuICBJdCdzIHBvc3NpYmxlIHdlIHNob3VsZCBsZXQgZWFjaAorZG5sIHRhZyBkZWZpbmUgYSBuZXcgbHRfPz8/P19saW5rX3Rlc3RfY29kZSB2YXJpYWJsZSwKK2RubCBidXQgaXQncyBvbmx5IHVzZWQgaGVyZS4uLgoraWZlbHNlKFskMV0sW10sW2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKK2ludCBhOwordm9pZCBmb28gKHZvaWQpIHsgYSA9IDA7IH0KK0VPRgorXSxbJDFdLFtDWFhdLFtjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCitjbGFzcyBGb28KK3sKK3B1YmxpYzoKKyAgRm9vICh2b2lkKSB7IGEgPSAwOyB9Citwcml2YXRlOgorICBpbnQgYTsKK307CitFT0YKK10sWyQxXSxbRjc3XSxbY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorICAgICAgc3Vicm91dGluZSBmb28KKyAgICAgIGltcGxpY2l0IG5vbmUKKyAgICAgIGludGVnZXIqNCBhCisgICAgICBhPTAKKyAgICAgIHJldHVybgorICAgICAgZW5kCitFT0YKK10sWyQxXSxbR0NKXSxbY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorcHVibGljIGNsYXNzIGZvbyB7CisgIHByaXZhdGUgaW50IGE7CisgIHB1YmxpYyB2b2lkIGJhciAodm9pZCkgeworICAgIGEgPSAwOworICB9Cit9OworRU9GCitdKQorZG5sIFBhcnNlIHRoZSBjb21waWxlciBvdXRwdXQgYW5kIGV4dHJhY3QgdGhlIG5lY2Vzc2FyeQorZG5sIG9iamVjdHMsIGxpYnJhcmllcyBhbmQgbGlicmFyeSBmbGFncy4KK2lmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCisgICMgUGFyc2UgdGhlIGNvbXBpbGVyIG91dHB1dCBhbmQgZXh0cmFjdCB0aGUgbmVjZXNzYXJ5CisgICMgb2JqZWN0cywgbGlicmFyaWVzIGFuZCBsaWJyYXJ5IGZsYWdzLgorCisgICMgU2VudGluZWwgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgb3Igbm90IHdlIGFyZSBiZWZvcmUKKyAgIyB0aGUgY29uZnRlc3Qgb2JqZWN0IGZpbGUuCisgIHByZV90ZXN0X29iamVjdF9kZXBzX2RvbmU9bm8KKworICAjIFRoZSBgKicgaW4gdGhlIGNhc2UgbWF0Y2hlcyBmb3IgYXJjaGl0ZWN0dXJlcyB0aGF0IHVzZSBgY2FzZScgaW4KKyAgIyAkb3V0cHV0X3ZlcmJvc2VfY21kIGNhbiB0cmlnZ2VyIGdsb2IgZXhwYW5zaW9uIGR1cmluZyB0aGUgbG9vcAorICAjIGV2YWwgd2l0aG91dCB0aGlzIHN1YnN0aXR1dGlvbi4KKyAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9ImAkZWNobyBcIlgkb3V0cHV0X3ZlcmJvc2VfbGlua19jbWRcIiB8ICRYc2VkIC1lIFwiJG5vX2dsb2Jfc3Vic3RcImAiCisKKyAgZm9yIHAgaW4gYGV2YWwgJG91dHB1dF92ZXJib3NlX2xpbmtfY21kYDsgZG8KKyAgICBjYXNlICRwIGluCisKKyAgICAtTCogfCAtUiogfCAtbCopCisgICAgICAgIyBTb21lIGNvbXBpbGVycyBwbGFjZSBzcGFjZSBiZXR3ZWVuICIte0wsUn0iIGFuZCB0aGUgcGF0aC4KKyAgICAgICAjIFJlbW92ZSB0aGUgc3BhY2UuCisgICAgICAgaWYgdGVzdCAkcCA9ICItTCIgXAorCSAgfHwgdGVzdCAkcCA9ICItUiI7IHRoZW4KKwkgcHJldj0kcAorCSBjb250aW51ZQorICAgICAgIGVsc2UKKwkgcHJldj0KKyAgICAgICBmaQorCisgICAgICAgaWYgdGVzdCAiJHByZV90ZXN0X29iamVjdF9kZXBzX2RvbmUiID0gbm87IHRoZW4KKwkgY2FzZSAkcCBpbgorCSAtTCogfCAtUiopCisJICAgIyBJbnRlcm5hbCBjb21waWxlciBsaWJyYXJ5IHBhdGhzIHNob3VsZCBjb21lIGFmdGVyIHRob3NlCisJICAgIyBwcm92aWRlZCB0aGUgdXNlci4gIFRoZSBwb3N0ZGVwcyBhbHJlYWR5IGNvbWUgYWZ0ZXIgdGhlCisJICAgIyB1c2VyIHN1cHBsaWVkIGxpYnMgc28gdGhlcmUgaXMgbm8gbmVlZCB0byBwcm9jZXNzIHRoZW0uCisJICAgaWYgdGVzdCAteiAiJF9MVF9BQ19UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSkiOyB0aGVuCisJICAgICBfTFRfQUNfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCwgJDEpPSIke3ByZXZ9JHtwfSIKKwkgICBlbHNlCisJICAgICBfTFRfQUNfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCwgJDEpPSIke19MVF9BQ19UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSl9ICR7cHJldn0ke3B9IgorCSAgIGZpCisJICAgOzsKKwkgIyBUaGUgIi1sIiBjYXNlIHdvdWxkIG5ldmVyIGNvbWUgYmVmb3JlIHRoZSBvYmplY3QgYmVpbmcKKwkgIyBsaW5rZWQsIHNvIGRvbid0IGJvdGhlciBoYW5kbGluZyB0aGlzIGNhc2UuCisJIGVzYWMKKyAgICAgICBlbHNlCisJIGlmIHRlc3QgLXogIiRfTFRfQUNfVEFHVkFSKHBvc3RkZXBzLCAkMSkiOyB0aGVuCisJICAgX0xUX0FDX1RBR1ZBUihwb3N0ZGVwcywgJDEpPSIke3ByZXZ9JHtwfSIKKwkgZWxzZQorCSAgIF9MVF9BQ19UQUdWQVIocG9zdGRlcHMsICQxKT0iJHtfTFRfQUNfVEFHVkFSKHBvc3RkZXBzLCAkMSl9ICR7cHJldn0ke3B9IgorCSBmaQorICAgICAgIGZpCisgICAgICAgOzsKKworICAgICouJG9iamV4dCkKKyAgICAgICAjIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSB0ZXN0IG9iamVjdCBmaWxlIG9ubHkgc2hvd3MgdXAKKyAgICAgICAjIG9uY2UgaW4gdGhlIGNvbXBpbGVyIG91dHB1dC4KKyAgICAgICBpZiB0ZXN0ICIkcCIgPSAiY29uZnRlc3QuJG9iamV4dCI7IHRoZW4KKwkgcHJlX3Rlc3Rfb2JqZWN0X2RlcHNfZG9uZT15ZXMKKwkgY29udGludWUKKyAgICAgICBmaQorCisgICAgICAgaWYgdGVzdCAiJHByZV90ZXN0X29iamVjdF9kZXBzX2RvbmUiID0gbm87IHRoZW4KKwkgaWYgdGVzdCAteiAiJF9MVF9BQ19UQUdWQVIocHJlZGVwX29iamVjdHMsICQxKSI7IHRoZW4KKwkgICBfTFRfQUNfVEFHVkFSKHByZWRlcF9vYmplY3RzLCAkMSk9IiRwIgorCSBlbHNlCisJICAgX0xUX0FDX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywgJDEpPSIkX0xUX0FDX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywgJDEpICRwIgorCSBmaQorICAgICAgIGVsc2UKKwkgaWYgdGVzdCAteiAiJF9MVF9BQ19UQUdWQVIocG9zdGRlcF9vYmplY3RzLCAkMSkiOyB0aGVuCisJICAgX0xUX0FDX1RBR1ZBUihwb3N0ZGVwX29iamVjdHMsICQxKT0iJHAiCisJIGVsc2UKKwkgICBfTFRfQUNfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywgJDEpPSIkX0xUX0FDX1RBR1ZBUihwb3N0ZGVwX29iamVjdHMsICQxKSAkcCIKKwkgZmkKKyAgICAgICBmaQorICAgICAgIDs7CisKKyAgICAqKSA7OyAjIElnbm9yZSB0aGUgcmVzdC4KKworICAgIGVzYWMKKyAgZG9uZQorCisgICMgQ2xlYW4gdXAuCisgIHJtIC1mIGEub3V0IGEuZXhlCitlbHNlCisgIGVjaG8gImxpYnRvb2wubTQ6IGVycm9yOiBwcm9ibGVtIGNvbXBpbGluZyAkMSB0ZXN0IHByb2dyYW0iCitmaQorCiskcm0gLWYgY29uZmVzdC4kb2JqZXh0CisKK2Nhc2UgIiAkX0xUX0FDX1RBR1ZBUihwb3N0ZGVwcywgJDEpICIgaW4KKyoiIC1sYyAiKikgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vIDs7Citlc2FjCitdKSMgQUNfTElCVE9PTF9QT1NUREVQX1BSRURFUAorCisjIEFDX0xJQlRPT0xfTEFOR19GNzdfQ09ORklHCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFbnN1cmUgdGhhdCB0aGUgY29uZmlndXJhdGlvbiB2YXJzIGZvciB0aGUgQyBjb21waWxlciBhcmUKKyMgc3VpdGFibHkgZGVmaW5lZC4gIFRob3NlIHZhcmlhYmxlcyBhcmUgc3Vic2VxdWVudGx5IHVzZWQgYnkKKyMgQUNfTElCVE9PTF9DT05GSUcgdG8gd3JpdGUgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gYGxpYnRvb2wnLgorQUNfREVGVU4oW0FDX0xJQlRPT0xfTEFOR19GNzdfQ09ORklHXSwgW19MVF9BQ19MQU5HX0Y3N19DT05GSUcoRjc3KV0pCitBQ19ERUZVTihbX0xUX0FDX0xBTkdfRjc3X0NPTkZJR10sCitbQUNfUkVRVUlSRShbQUNfUFJPR19GNzddKQorQUNfTEFOR19QVVNIKEZvcnRyYW4gNzcpCisKK19MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPQorX0xUX0FDX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT1ubworX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9CitfTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPQorX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9CitfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQsICQxKT0KK19MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPQorX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9bm8KK19MVF9BQ19UQUdWQVIoaGFyZGNvZGVfYXV0b21hdGljLCAkMSk9bm8KK19MVF9BQ19UQUdWQVIobW9kdWxlX2NtZHMsICQxKT0KK19MVF9BQ19UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSk9CitfTFRfQUNfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT11bmtub3duCitfTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0kb2xkX2FyY2hpdmVfY21kcworX0xUX0FDX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPQorX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPQorX0xUX0FDX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9bm8KKworIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIGY3NyB0ZXN0IHNvdXJjZXMuCithY19leHQ9ZgorCisjIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgZjc3IHRlc3Qgc291cmNlcy4KK29iamV4dD1vCitfTFRfQUNfVEFHVkFSKG9iamV4dCwgJDEpPSRvYmpleHQKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKK2x0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0iICAgICAgc3Vicm91dGluZSB0XG4gICAgICByZXR1cm5cbiAgICAgIGVuZFxuIgorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cworbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSIgICAgICBwcm9ncmFtIHRcbiAgICAgIGVuZFxuIgorCisjIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCitfTFRfQUNfU1lTX0NPTVBJTEVSCisKKyMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCitsdF9zYXZlX0NDPSIkQ0MiCitDQz0ke0Y3Ny0iZjc3In0KK2NvbXBpbGVyPSRDQworX0xUX0FDX1RBR1ZBUihjb21waWxlciwgJDEpPSRDQworY2NfYmFzZW5hbWU9YCRlY2hvIFgiJGNvbXBpbGVyIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisKK0FDX01TR19DSEVDS0lORyhbaWYgbGlidG9vbCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzXSkKK0FDX01TR19SRVNVTFQoWyRjYW5fYnVpbGRfc2hhcmVkXSkKKworQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXNdKQordGVzdCAiJGNhbl9idWlsZF9zaGFyZWQiID0gIm5vIiAmJiBlbmFibGVfc2hhcmVkPW5vCisKKyMgT24gQUlYLCBzaGFyZWQgbGlicmFyaWVzIGFuZCBzdGF0aWMgbGlicmFyaWVzIHVzZSB0aGUgc2FtZSBuYW1lc3BhY2UsIGFuZAorIyBhcmUgYWxsIGJ1aWx0IGZyb20gUElDLgorY2FzZSAiJGhvc3Rfb3MiIGluCithaXgzKikKKyAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKyAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgICBhcmNoaXZlX2NtZHM9IiRhcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRsaWIiCisgICAgcG9zdGluc3RhbGxfY21kcz0nJFJBTkxJQiAkbGliJworICBmaQorICA7OworYWl4NCogfCBhaXg1KikKKyAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKyAgOzsKK2VzYWMKK0FDX01TR19SRVNVTFQoWyRlbmFibGVfc2hhcmVkXSkKKworQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXNdKQorIyBNYWtlIHN1cmUgZWl0aGVyIGVuYWJsZV9zaGFyZWQgb3IgZW5hYmxlX3N0YXRpYyBpcyB5ZXMuCit0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgfHwgZW5hYmxlX3N0YXRpYz15ZXMKK0FDX01TR19SRVNVTFQoWyRlbmFibGVfc3RhdGljXSkKKwordGVzdCAiJF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSkiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubworCitfTFRfQUNfVEFHVkFSKEdDQywgJDEpPSIkRzc3IgorX0xUX0FDX1RBR1ZBUihMRCwgJDEpPSIkTEQiCisKK0FDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9QSUMoJDEpCitBQ19MSUJUT09MX1BST0dfQ0NfQ19PKCQxKQorQUNfTElCVE9PTF9TWVNfSEFSRF9MSU5LX0xPQ0tTKCQxKQorQUNfTElCVE9PTF9QUk9HX0xEX1NITElCUygkMSkKK0FDX0xJQlRPT0xfU1lTX0RZTkFNSUNfTElOS0VSKCQxKQorQUNfTElCVE9PTF9QUk9HX0xEX0hBUkRDT0RFX0xJQlBBVEgoJDEpCitBQ19MSUJUT09MX1NZU19MSUJfU1RSSVAKKworCitBQ19MSUJUT09MX0NPTkZJRygkMSkKKworQUNfTEFOR19QT1AKK0NDPSIkbHRfc2F2ZV9DQyIKK10pIyBBQ19MSUJUT09MX0xBTkdfRjc3X0NPTkZJRworCisKKyMgQUNfTElCVE9PTF9MQU5HX0dDSl9DT05GSUcKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFycyBmb3IgdGhlIEMgY29tcGlsZXIgYXJlCisjIHN1aXRhYmx5IGRlZmluZWQuICBUaG9zZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5CisjIEFDX0xJQlRPT0xfQ09ORklHIHRvIHdyaXRlIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIHRvIGBsaWJ0b29sJy4KK0FDX0RFRlVOKFtBQ19MSUJUT09MX0xBTkdfR0NKX0NPTkZJR10sIFtfTFRfQUNfTEFOR19HQ0pfQ09ORklHKEdDSildKQorQUNfREVGVU4oW19MVF9BQ19MQU5HX0dDSl9DT05GSUddLAorW0FDX0xBTkdfU0FWRQorCisjIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgSmF2YSB0ZXN0IHNvdXJjZXMuCithY19leHQ9amF2YQorCisjIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgSmF2YSB0ZXN0IHNvdXJjZXMuCitvYmpleHQ9bworX0xUX0FDX1RBR1ZBUihvYmpleHQsICQxKT0kb2JqZXh0CisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCitsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9ImNsYXNzIGZvbyB7fVxuIgorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cworbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSdwdWJsaWMgY2xhc3MgY29uZnRlc3QgeyBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd2KSB7fTsgfVxuJworCisjIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCitfTFRfQUNfU1lTX0NPTVBJTEVSCisKKyMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCitsdF9zYXZlX0NDPSIkQ0MiCitDQz0ke0dDSi0iZ2NqIn0KK2NvbXBpbGVyPSRDQworX0xUX0FDX1RBR1ZBUihjb21waWxlciwgJDEpPSRDQworCisjIEdDSiBkaWQgbm90IGV4aXN0IGF0IHRoZSB0aW1lIEdDQyBkaWRuJ3QgaW1wbGljaXRseSBsaW5rIGxpYmMgaW4uCitfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KKworIyMgQ0FWRUFUIEVNUFRPUjoKKyMjIFRoZXJlIGlzIG5vIGVuY2Fwc3VsYXRpb24gd2l0aGluIHRoZSBmb2xsb3dpbmcgbWFjcm9zLCBkbyBub3QgY2hhbmdlCisjIyB0aGUgcnVubmluZyBvcmRlciBvciBvdGhlcndpc2UgbW92ZSB0aGVtIGFyb3VuZCB1bmxlc3MgeW91IGtub3cgZXhhY3RseQorIyMgd2hhdCB5b3UgYXJlIGRvaW5nLi4uCitBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfTk9fUlRUSSgkMSkKK0FDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9QSUMoJDEpCitBQ19MSUJUT09MX1BST0dfQ0NfQ19PKCQxKQorQUNfTElCVE9PTF9TWVNfSEFSRF9MSU5LX0xPQ0tTKCQxKQorQUNfTElCVE9PTF9QUk9HX0xEX1NITElCUygkMSkKK0FDX0xJQlRPT0xfU1lTX0RZTkFNSUNfTElOS0VSKCQxKQorQUNfTElCVE9PTF9QUk9HX0xEX0hBUkRDT0RFX0xJQlBBVEgoJDEpCitBQ19MSUJUT09MX1NZU19MSUJfU1RSSVAKK0FDX0xJQlRPT0xfRExPUEVOX1NFTEYoJDEpCisKK0FDX0xJQlRPT0xfQ09ORklHKCQxKQorCitBQ19MQU5HX1JFU1RPUkUKK0NDPSIkbHRfc2F2ZV9DQyIKK10pIyBBQ19MSUJUT09MX0xBTkdfR0NKX0NPTkZJRworCisKKyMgQUNfTElCVE9PTF9MQU5HX1JDX0NPTkZJRworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFbnN1cmUgdGhhdCB0aGUgY29uZmlndXJhdGlvbiB2YXJzIGZvciB0aGUgV2luZG93cyByZXNvdXJjZSBjb21waWxlciBhcmUKKyMgc3VpdGFibHkgZGVmaW5lZC4gIFRob3NlIHZhcmlhYmxlcyBhcmUgc3Vic2VxdWVudGx5IHVzZWQgYnkKKyMgQUNfTElCVE9PTF9DT05GSUcgdG8gd3JpdGUgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gYGxpYnRvb2wnLgorQUNfREVGVU4oW0FDX0xJQlRPT0xfTEFOR19SQ19DT05GSUddLCBbX0xUX0FDX0xBTkdfUkNfQ09ORklHKFJDKV0pCitBQ19ERUZVTihbX0xUX0FDX0xBTkdfUkNfQ09ORklHXSwKK1tBQ19MQU5HX1NBVkUKKworIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIFJDIHRlc3Qgc291cmNlcy4KK2FjX2V4dD1yYworCisjIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgUkMgdGVzdCBzb3VyY2VzLgorb2JqZXh0PW8KK19MVF9BQ19UQUdWQVIob2JqZXh0LCAkMSk9JG9iamV4dAorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSdzYW1wbGUgTUVOVSB7IE1FTlVJVEVNICImU291cCIsIDEwMCwgQ0hFQ0tFRCB9XG4nCisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCitsdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9IiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiCisKKyMgbHRtYWluIG9ubHkgdXNlcyAkQ0MgZm9yIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzbyBtYWtlIHN1cmUgJENDIGlzIHNldC4KK19MVF9BQ19TWVNfQ09NUElMRVIKKworIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KK2x0X3NhdmVfQ0M9IiRDQyIKK0NDPSR7UkMtIndpbmRyZXMifQorY29tcGlsZXI9JENDCitfTFRfQUNfVEFHVkFSKGNvbXBpbGVyLCAkMSk9JENDCitfTFRfQUNfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfY19vLCAkMSk9eWVzCisKK0FDX0xJQlRPT0xfQ09ORklHKCQxKQorCitBQ19MQU5HX1JFU1RPUkUKK0NDPSIkbHRfc2F2ZV9DQyIKK10pIyBBQ19MSUJUT09MX0xBTkdfUkNfQ09ORklHCisKKworIyBBQ19MSUJUT09MX0NPTkZJRyhbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSWYgVEFHTkFNRSBpcyBub3QgcGFzc2VkLCB0aGVuIGNyZWF0ZSBhbiBpbml0aWFsIGxpYnRvb2wgc2NyaXB0CisjIHdpdGggYSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgdW50YWdnZWQgY29uZmlnIHZhcnMuICBPdGhlcndpc2UKKyMgYWRkIGNvZGUgdG8gY29uZmlnLnN0YXR1cyBmb3IgYXBwZW5kaW5nIHRoZSBjb25maWd1cmF0aW9uIG5hbWVkIGJ5CisjIFRBR05BTUUgZnJvbSB0aGUgbWF0Y2hpbmcgdGFnZ2VkIGNvbmZpZyB2YXJzLgorQUNfREVGVU4oW0FDX0xJQlRPT0xfQ09ORklHXSwKK1sjIFRoZSBlbHNlIGNsYXVzZSBzaG91bGQgb25seSBmaXJlIHdoZW4gYm9vdHN0cmFwcGluZyB0aGUKKyMgbGlidG9vbCBkaXN0cmlidXRpb24sIG90aGVyd2lzZSB5b3UgZm9yZ290IHRvIHNoaXAgbHRtYWluLnNoCisjIHdpdGggeW91ciBwYWNrYWdlLCBhbmQgeW91IHdpbGwgZ2V0IGNvbXBsYWludHMgdGhhdCB0aGVyZSBhcmUKKyMgbm8gcnVsZXMgdG8gZ2VuZXJhdGUgbHRtYWluLnNoLgoraWYgdGVzdCAtZiAiJGx0bWFpbiI7IHRoZW4KKyAgIyBTZWUgaWYgd2UgYXJlIHJ1bm5pbmcgb24genNoLCBhbmQgc2V0IHRoZSBvcHRpb25zIHdoaWNoIGFsbG93IG91ciBjb21tYW5kcyB0aHJvdWdoCisgICMgd2l0aG91dCByZW1vdmFsIG9mIFwgZXNjYXBlcy4KKyAgaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KKyAgICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorICBmaQorICAjIE5vdyBxdW90ZSBhbGwgdGhlIHRoaW5ncyB0aGF0IG1heSBjb250YWluIG1ldGFjaGFyYWN0ZXJzIHdoaWxlIGJlaW5nCisgICMgY2FyZWZ1bCBub3QgdG8gb3ZlcnF1b3RlIHRoZSBBQ19TVUJTVGVkIHZhbHVlcy4gIFdlIHRha2UgY29waWVzIG9mIHRoZQorICAjIHZhcmlhYmxlcyBhbmQgcXVvdGUgdGhlIGNvcGllcyBmb3IgZ2VuZXJhdGlvbiBvZiB0aGUgbGlidG9vbCBzY3JpcHQuCisgIGZvciB2YXIgaW4gZWNobyBvbGRfQ0Mgb2xkX0NGTEFHUyBBUiBBUl9GTEFHUyBFR1JFUCBSQU5MSUIgTE5fUyBMVENDIE5NIFwKKyAgICBTRUQgU0hFTEwgU1RSSVAgXAorICAgIGxpYm5hbWVfc3BlYyBsaWJyYXJ5X25hbWVzX3NwZWMgc29uYW1lX3NwZWMgZXh0cmFjdF9leHBzeW1zX2NtZHMgXAorICAgIG9sZF9zdHJpcGxpYiBzdHJpcGxpYiBmaWxlX21hZ2ljX2NtZCBmaW5pc2hfY21kcyBmaW5pc2hfZXZhbCBcCisgICAgZGVwbGlic19jaGVja19tZXRob2QgcmVsb2FkX2ZsYWcgcmVsb2FkX2NtZHMgbmVlZF9sb2NrcyBcCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCBcCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MgXAorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYyBcCisgICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyBcCisgICAgX0xUX0FDX1RBR1ZBUihjb21waWxlciwgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKENDLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIoTEQsICQxKSBcCisgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKSBcCisgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIodGhyZWFkX3NhZmVfZmxhZ19zcGVjLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKSBcCisgICAgX0xUX0FDX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMsICQxKSBcCisgICAgX0xUX0FDX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKHByZWRlcHMsICQxKSBcCisgICAgX0xUX0FDX1RBR1ZBUihwb3N0ZGVwcywgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCwgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKSBcCisgICAgX0xUX0FDX1RBR1ZBUihwb3N0aW5zdGFsbF9jbWRzLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIocG9zdHVuaW5zdGFsbF9jbWRzLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMsICQxKSBcCisgICAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKSBcCisgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9jX28sICQxKSBcCisgICAgX0xUX0FDX1RBR1ZBUihleGNsdWRlX2V4cHN5bXMsICQxKSBcCisgICAgX0xUX0FDX1RBR1ZBUihpbmNsdWRlX2V4cHN5bXMsICQxKTsgZG8KKworICAgIGNhc2UgJHZhciBpbgorICAgIF9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpIHwgXAorICAgIF9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcywgJDEpIHwgXAorICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSkgfCBcCisgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSkgfCBcCisgICAgX0xUX0FDX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpIHwgXAorICAgIF9MVF9BQ19UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSkgfCBcCisgICAgX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcywgJDEpIHwgXAorICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpIHwgXAorICAgIGV4dHJhY3RfZXhwc3ltc19jbWRzIHwgcmVsb2FkX2NtZHMgfCBmaW5pc2hfY21kcyB8IFwKKyAgICBwb3N0aW5zdGFsbF9jbWRzIHwgcG9zdHVuaW5zdGFsbF9jbWRzIHwgXAorICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzIHwgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyB8IFwKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgfCBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYykKKyAgICAgICMgRG91YmxlLXF1b3RlIGRvdWJsZS1ldmFsZWQgc3RyaW5ncy4KKyAgICAgIGV2YWwgImx0XyR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRkb3VibGVfcXVvdGVfc3Vic3RcIiAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCIgLWUgXCJcJGRlbGF5X3ZhcmlhYmxlX3N1YnN0XCJcYFxcXCIiCisgICAgICA7OworICAgICopCisgICAgICBldmFsICJsdF8kdmFyPVxcXCJcYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCJcYFxcXCIiCisgICAgICA7OworICAgIGVzYWMKKyAgZG9uZQorCisgIGNhc2UgJGx0X2VjaG8gaW4KKyAgKidcWyRdMCAtLWZhbGxiYWNrLWVjaG8iJykKKyAgICBsdF9lY2hvPWAkZWNobyAiWCRsdF9lY2hvIiB8ICRYc2VkIC1lICdzL1xcXFxcXFxbJF0wIC0tZmFsbGJhY2stZWNobyJbJF0vWyRdMCAtLWZhbGxiYWNrLWVjaG8iLydgCisgICAgOzsKKyAgZXNhYworCitpZmVsc2UoWyQxXSwgW10sCisgIFtjZmdmaWxlPSIke29maWxlfVQiCisgIHRyYXAgIiRybSBcIiRjZmdmaWxlXCI7IGV4aXQgMSIgMSAyIDE1CisgICRybSAtZiAiJGNmZ2ZpbGUiCisgIEFDX01TR19OT1RJQ0UoW2NyZWF0aW5nICRvZmlsZV0pXSwKKyAgW2NmZ2ZpbGU9IiRvZmlsZSJdKQorCisgIGNhdCA8PF9fRU9GX18gPj4gIiRjZmdmaWxlIgoraWZlbHNlKFskMV0sIFtdLAorWyMhICRTSEVMTAorCisjIGAkZWNobyAiJGNmZ2ZpbGUiIHwgc2VkICdzJV4uKi8lJSdgIC0gUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5ICRQUk9HUkFNIChHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QKQorIyBOT1RFOiBDaGFuZ2VzIG1hZGUgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdDogbG9vayBhdCBsdG1haW4uc2guCisjCisjIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMQorIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIExpYnRvb2w6CisjIE9yaWdpbmFsbHkgYnkgR29yZG9uIE1hdHppZ2tlaXQgPGdvcmRAZ251LmFpLm1pdC5lZHU+LCAxOTk2CisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisjCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworIyBBIHNlZCBwcm9ncmFtIHRoYXQgZG9lcyBub3QgdHJ1bmNhdGUgb3V0cHV0LgorU0VEPSRsdF9TRUQKKworIyBTZWQgdGhhdCBoZWxwcyB1cyBhdm9pZCBhY2NpZGVudGFsbHkgdHJpZ2dlcmluZyBlY2hvKDEpIG9wdGlvbnMgbGlrZSAtbi4KK1hzZWQ9IiRTRUQgLWUgcy9eWC8vIgorCisjIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAorIyBpZiBDRFBBVEggaXMgc2V0LgoraWYgdGVzdCAiWFwke0NEUEFUSCtzZXR9IiA9IFhzZXQ7IHRoZW4gQ0RQQVRIPTo7IGV4cG9ydCBDRFBBVEg7IGZpCisKKyMgVGhlIG5hbWVzIG9mIHRoZSB0YWdnZWQgY29uZmlndXJhdGlvbnMgc3VwcG9ydGVkIGJ5IHRoaXMgc2NyaXB0LgorYXZhaWxhYmxlX3RhZ3M9CisKKyMgIyMjIEJFR0lOIExJQlRPT0wgQ09ORklHXSwKK1sjICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lXSkKKworIyBMaWJ0b29sIHdhcyBjb25maWd1cmVkIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgorCisjIFNoZWxsIHRvIHVzZSB3aGVuIGludm9raW5nIHNoZWxsIHNjcmlwdHMuCitTSEVMTD0kbHRfU0hFTEwKKworIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLgorYnVpbGRfbGlidG9vbF9saWJzPSRlbmFibGVfc2hhcmVkCisKKyMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcy4KK2J1aWxkX29sZF9saWJzPSRlbmFibGVfc3RhdGljCisKKyMgV2hldGhlciBvciBub3QgdG8gYWRkIC1sYyBmb3IgYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4KK2J1aWxkX2xpYnRvb2xfbmVlZF9sYz0kX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpCisKKyMgV2hldGhlciBvciBub3QgdG8gZGlzYWxsb3cgc2hhcmVkIGxpYnMgd2hlbiBydW50aW1lIGxpYnMgYXJlIHN0YXRpYworYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzPSRfTFRfQUNfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKQorCisjIFdoZXRoZXIgb3Igbm90IHRvIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbi4KK2Zhc3RfaW5zdGFsbD0kZW5hYmxlX2Zhc3RfaW5zdGFsbAorCisjIFRoZSBob3N0IHN5c3RlbS4KK2hvc3RfYWxpYXM9JGhvc3RfYWxpYXMKK2hvc3Q9JGhvc3QKKworIyBBbiBlY2hvIHByb2dyYW0gdGhhdCBkb2VzIG5vdCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCitlY2hvPSRsdF9lY2hvCisKKyMgVGhlIGFyY2hpdmVyLgorQVI9JGx0X0FSCitBUl9GTEFHUz0kbHRfQVJfRkxBR1MKKworIyBBIEMgY29tcGlsZXIuCitMVENDPSRsdF9MVENDCisKKyMgQSBsYW5ndWFnZS1zcGVjaWZpYyBjb21waWxlci4KK0NDPSRsdF9bXV9MVF9BQ19UQUdWQVIoY29tcGlsZXIsICQxKQorCisjIElzIHRoZSBjb21waWxlciB0aGUgR05VIEMgY29tcGlsZXI/Cit3aXRoX2djYz0kX0xUX0FDX1RBR1ZBUihHQ0MsICQxKQorCisjIEFuIEVSRSBtYXRjaGVyLgorRUdSRVA9JGx0X0VHUkVQCisKKyMgVGhlIGxpbmtlciB1c2VkIHRvIGJ1aWxkIGxpYnJhcmllcy4KK0xEPSRsdF9bXV9MVF9BQ19UQUdWQVIoTEQsICQxKQorCisjIFdoZXRoZXIgd2UgbmVlZCBoYXJkIG9yIHNvZnQgbGlua3MuCitMTl9TPSRsdF9MTl9TCisKKyMgQSBCU0QtY29tcGF0aWJsZSBubSBwcm9ncmFtLgorTk09JGx0X05NCisKKyMgQSBzeW1ib2wgc3RyaXBwaW5nIHByb2dyYW0KK1NUUklQPSRsdF9TVFJJUAorCisjIFVzZWQgdG8gZXhhbWluZSBsaWJyYXJpZXMgd2hlbiBmaWxlX21hZ2ljX2NtZCBiZWdpbnMgImZpbGUiCitNQUdJQ19DTUQ9JE1BR0lDX0NNRAorCisjIFVzZWQgb24gY3lnd2luOiBETEwgY3JlYXRpb24gcHJvZ3JhbS4KK0RMTFRPT0w9IiRETExUT09MIgorCisjIFVzZWQgb24gY3lnd2luOiBvYmplY3QgZHVtcGVyLgorT0JKRFVNUD0iJE9CSkRVTVAiCisKKyMgVXNlZCBvbiBjeWd3aW46IGFzc2VtYmxlci4KK0FTPSIkQVMiCisKKyMgVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRlbXBvcmFyeSBsaWJ0b29sIGZpbGVzLgorb2JqZGlyPSRvYmpkaXIKKworIyBIb3cgdG8gY3JlYXRlIHJlbG9hZGFibGUgb2JqZWN0IGZpbGVzLgorcmVsb2FkX2ZsYWc9JGx0X3JlbG9hZF9mbGFnCityZWxvYWRfY21kcz0kbHRfcmVsb2FkX2NtZHMKKworIyBIb3cgdG8gcGFzcyBhIGxpbmtlciBmbGFnIHRocm91Z2ggdGhlIGNvbXBpbGVyLgord2w9JGx0X1tdX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSkKKworIyBPYmplY3QgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICJvIikuCitvYmpleHQ9IiRhY19vYmpleHQiCisKKyMgT2xkIGFyY2hpdmUgc3VmZml4IChub3JtYWxseSAiYSIpLgorbGliZXh0PSIkbGliZXh0IgorCisjIFNoYXJlZCBsaWJyYXJ5IHN1ZmZpeCAobm9ybWFsbHkgIi5zbyIpLgorc2hyZXh0X2NtZHM9JyRzaHJleHRfY21kcycKKworIyBFeGVjdXRhYmxlIGZpbGUgc3VmZml4IChub3JtYWxseSAiIikuCitleGVleHQ9IiRleGVleHQiCisKKyMgQWRkaXRpb25hbCBjb21waWxlciBmbGFncyBmb3IgYnVpbGRpbmcgbGlicmFyeSBvYmplY3RzLgorcGljX2ZsYWc9JGx0X1tdX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpCitwaWNfbW9kZT0kcGljX21vZGUKKworIyBXaGF0IGlzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIGNvbW1hbmQ/CittYXhfY21kX2xlbj0kbHRfY3Zfc3lzX21heF9jbWRfbGVuCisKKyMgRG9lcyBjb21waWxlciBzaW11bHRhbmVvdXNseSBzdXBwb3J0IC1jIGFuZCAtbyBvcHRpb25zPworY29tcGlsZXJfY19vPSRsdF9bXV9MVF9BQ19UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9jX28sICQxKQorCisjIE11c3Qgd2UgbG9jayBmaWxlcyB3aGVuIGRvaW5nIGNvbXBpbGF0aW9uID8KK25lZWRfbG9ja3M9JGx0X25lZWRfbG9ja3MKKworIyBEbyB3ZSBuZWVkIHRoZSBsaWIgcHJlZml4IGZvciBtb2R1bGVzPworbmVlZF9saWJfcHJlZml4PSRuZWVkX2xpYl9wcmVmaXgKKworIyBEbyB3ZSBuZWVkIGEgdmVyc2lvbiBmb3IgbGlicmFyaWVzPworbmVlZF92ZXJzaW9uPSRuZWVkX3ZlcnNpb24KKworIyBXaGV0aGVyIGRsb3BlbiBpcyBzdXBwb3J0ZWQuCitkbG9wZW5fc3VwcG9ydD0kZW5hYmxlX2Rsb3BlbgorCisjIFdoZXRoZXIgZGxvcGVuIG9mIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KK2Rsb3Blbl9zZWxmPSRlbmFibGVfZGxvcGVuX3NlbGYKKworIyBXaGV0aGVyIGRsb3BlbiBvZiBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCitkbG9wZW5fc2VsZl9zdGF0aWM9JGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWMKKworIyBDb21waWxlciBmbGFnIHRvIHByZXZlbnQgZHluYW1pYyBsaW5raW5nLgorbGlua19zdGF0aWNfZmxhZz0kbHRfW11fTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSkKKworIyBDb21waWxlciBmbGFnIHRvIHR1cm4gb2ZmIGJ1aWx0aW4gZnVuY3Rpb25zLgorbm9fYnVpbHRpbl9mbGFnPSRsdF9bXV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKQorCisjIENvbXBpbGVyIGZsYWcgdG8gYWxsb3cgcmVmbGV4aXZlIGRsb3BlbnMuCitleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JGx0X1tdX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKQorCisjIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgc2hhcmVkIG9iamVjdHMgZGlyZWN0bHkgZnJvbSBhcmNoaXZlcy4KK3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSRsdF9bXV9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKQorCisjIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgdGhyZWFkLXNhZmUgb2JqZWN0cy4KK3RocmVhZF9zYWZlX2ZsYWdfc3BlYz0kbHRfW11fTFRfQUNfVEFHVkFSKHRocmVhZF9zYWZlX2ZsYWdfc3BlYywgJDEpCisKKyMgTGlicmFyeSB2ZXJzaW9uaW5nIHR5cGUuCit2ZXJzaW9uX3R5cGU9JHZlcnNpb25fdHlwZQorCisjIEZvcm1hdCBvZiBsaWJyYXJ5IG5hbWUgcHJlZml4LgorbGlibmFtZV9zcGVjPSRsdF9saWJuYW1lX3NwZWMKKworIyBMaXN0IG9mIGFyY2hpdmUgbmFtZXMuICBGaXJzdCBuYW1lIGlzIHRoZSByZWFsIG9uZSwgdGhlIHJlc3QgYXJlIGxpbmtzLgorIyBUaGUgbGFzdCBuYW1lIGlzIHRoZSBvbmUgdGhhdCB0aGUgbGlua2VyIGZpbmRzIHdpdGggLWxOQU1FLgorbGlicmFyeV9uYW1lc19zcGVjPSRsdF9saWJyYXJ5X25hbWVzX3NwZWMKKworIyBUaGUgY29kZWQgbmFtZSBvZiB0aGUgbGlicmFyeSwgaWYgZGlmZmVyZW50IGZyb20gdGhlIHJlYWwgbmFtZS4KK3NvbmFtZV9zcGVjPSRsdF9zb25hbWVfc3BlYworCisjIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYW4gb2xkLXN0eWxlIGFyY2hpdmUuCitSQU5MSUI9JGx0X1JBTkxJQgorb2xkX2FyY2hpdmVfY21kcz0kbHRfW11fTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKQorb2xkX3Bvc3RpbnN0YWxsX2NtZHM9JGx0X29sZF9wb3N0aW5zdGFsbF9jbWRzCitvbGRfcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9vbGRfcG9zdHVuaW5zdGFsbF9jbWRzCisKKyMgQ3JlYXRlIGFuIG9sZC1zdHlsZSBhcmNoaXZlIGZyb20gYSBzaGFyZWQgYXJjaGl2ZS4KK29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9JGx0X1tdX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzLCAkMSkKKworIyBDcmVhdGUgYSB0ZW1wb3Jhcnkgb2xkLXN0eWxlIGFyY2hpdmUgdG8gbGluayBpbnN0ZWFkIG9mIGEgc2hhcmVkIGFyY2hpdmUuCitvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcz0kbHRfW11fTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzLCAkMSkKKworIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGEgc2hhcmVkIGFyY2hpdmUuCithcmNoaXZlX2NtZHM9JGx0X1tdX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKQorYXJjaGl2ZV9leHBzeW1fY21kcz0kbHRfW11fTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKQorcG9zdGluc3RhbGxfY21kcz0kbHRfcG9zdGluc3RhbGxfY21kcworcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9wb3N0dW5pbnN0YWxsX2NtZHMKKworIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGEgbG9hZGFibGUgbW9kdWxlIChhc3N1bWVkIHNhbWUgYXMgYWJvdmUgaWYgZW1wdHkpCittb2R1bGVfY21kcz0kbHRfW11fTFRfQUNfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSkKK21vZHVsZV9leHBzeW1fY21kcz0kbHRfW11fTFRfQUNfVEFHVkFSKG1vZHVsZV9leHBzeW1fY21kcywgJDEpCisKKyMgQ29tbWFuZHMgdG8gc3RyaXAgbGlicmFyaWVzLgorb2xkX3N0cmlwbGliPSRsdF9vbGRfc3RyaXBsaWIKK3N0cmlwbGliPSRsdF9zdHJpcGxpYgorCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCisjIHNoYXJlZCBsaWJyYXJ5LgorcHJlZGVwX29iamVjdHM9JGx0X1tdX0xUX0FDX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywgJDEpCisKKyMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQorIyBzaGFyZWQgbGlicmFyeS4KK3Bvc3RkZXBfb2JqZWN0cz0kbHRfW11fTFRfQUNfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywgJDEpCisKKyMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKKyMgc2hhcmVkIGxpYnJhcnkuCitwcmVkZXBzPSRsdF9bXV9MVF9BQ19UQUdWQVIocHJlZGVwcywgJDEpCisKKyMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQorIyBzaGFyZWQgbGlicmFyeS4KK3Bvc3RkZXBzPSRsdF9bXV9MVF9BQ19UQUdWQVIocG9zdGRlcHMsICQxKQorCisjIFRoZSBsaWJyYXJ5IHNlYXJjaCBwYXRoIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgY29tcGlsZXIgd2hlbiBsaW5raW5nCisjIGEgc2hhcmVkIGxpYnJhcnkuCitjb21waWxlcl9saWJfc2VhcmNoX3BhdGg9JGx0X1tdX0xUX0FDX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX3BhdGgsICQxKQorCisjIE1ldGhvZCB0byBjaGVjayB3aGV0aGVyIGRlcGVuZGVudCBsaWJyYXJpZXMgYXJlIHNoYXJlZCBvYmplY3RzLgorZGVwbGlic19jaGVja19tZXRob2Q9JGx0X2RlcGxpYnNfY2hlY2tfbWV0aG9kCisKKyMgQ29tbWFuZCB0byB1c2Ugd2hlbiBkZXBsaWJzX2NoZWNrX21ldGhvZCA9PSBmaWxlX21hZ2ljLgorZmlsZV9tYWdpY19jbWQ9JGx0X2ZpbGVfbWFnaWNfY21kCisKKyMgRmxhZyB0aGF0IGFsbG93cyBzaGFyZWQgbGlicmFyaWVzIHdpdGggdW5kZWZpbmVkIHN5bWJvbHMgdG8gYmUgYnVpbHQuCithbGxvd191bmRlZmluZWRfZmxhZz0kbHRfW11fTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSkKKworIyBGbGFnIHRoYXQgZm9yY2VzIG5vIHVuZGVmaW5lZCBzeW1ib2xzLgorbm9fdW5kZWZpbmVkX2ZsYWc9JGx0X1tdX0xUX0FDX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpCisKKyMgQ29tbWFuZHMgdXNlZCB0byBmaW5pc2ggYSBsaWJ0b29sIGxpYnJhcnkgaW5zdGFsbGF0aW9uIGluIGEgZGlyZWN0b3J5LgorZmluaXNoX2NtZHM9JGx0X2ZpbmlzaF9jbWRzCisKKyMgU2FtZSBhcyBhYm92ZSwgYnV0IGEgc2luZ2xlIHNjcmlwdCBmcmFnbWVudCB0byBiZSBldmFsZWQgYnV0IG5vdCBzaG93bi4KK2ZpbmlzaF9ldmFsPSRsdF9maW5pc2hfZXZhbAorCisjIFRha2UgdGhlIG91dHB1dCBvZiBubSBhbmQgcHJvZHVjZSBhIGxpc3Rpbmcgb2YgcmF3IHN5bWJvbHMgYW5kIEMgbmFtZXMuCitnbG9iYWxfc3ltYm9sX3BpcGU9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUKKworIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIHByb3BlciBDIGRlY2xhcmF0aW9uCitnbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbAorCisjIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgQyBuYW1lIGFkZHJlc3MgcGFpcgorZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MKKworIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBydW50aW1lIHBhdGggdmFyaWFibGUuCitydW5wYXRoX3Zhcj0kcnVucGF0aF92YXIKKworIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBwYXRoIHZhcmlhYmxlLgorc2hsaWJwYXRoX3Zhcj0kc2hsaWJwYXRoX3ZhcgorCisjIElzIHNobGlicGF0aCBzZWFyY2hlZCBiZWZvcmUgdGhlIGhhcmQtY29kZWQgbGlicmFyeSBzZWFyY2ggcGF0aD8KK3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD0kc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoCisKKyMgSG93IHRvIGhhcmRjb2RlIGEgc2hhcmVkIGxpYnJhcnkgcGF0aCBpbnRvIGFuIGV4ZWN1dGFibGUuCitoYXJkY29kZV9hY3Rpb249JF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfYWN0aW9uLCAkMSkKKworIyBXaGV0aGVyIHdlIHNob3VsZCBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gbGlicmFyaWVzLgoraGFyZGNvZGVfaW50b19saWJzPSRoYXJkY29kZV9pbnRvX2xpYnMKKworIyBGbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8gYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuCisjIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcyBub3QgZXhpc3QuCitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSRsdF9bXV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpCisKKyMgSWYgbGQgaXMgdXNlZCB3aGVuIGxpbmtpbmcsIGZsYWcgdG8gaGFyZGNvZGUgXCRsaWJkaXIgaW50bworIyBhIGJpbmFyeSBkdXJpbmcgbGlua2luZy4gVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiBcJGxpYmRpciBkb2VzCisjIG5vdCBleGlzdC4KK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQ9JGx0X1tdX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkLCAkMSkKKworIyBXaGV0aGVyIHdlIG5lZWQgYSBzaW5nbGUgLXJwYXRoIGZsYWcgd2l0aCBhIHNlcGFyYXRlZCBhcmd1bWVudC4KK2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9JGx0X1tdX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSkKKworIyBTZXQgdG8geWVzIGlmIHVzaW5nIERJUi9saWJOQU1FJHtzaGFyZWRfZXh0fSBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCisjIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9kaXJlY3Q9JF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSkKKworIyBTZXQgdG8geWVzIGlmIHVzaW5nIHRoZSAtTERJUiBmbGFnIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKKyMgcmVzdWx0aW5nIGJpbmFyeS4KK2hhcmRjb2RlX21pbnVzX0w9JF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpCisKKyMgU2V0IHRvIHllcyBpZiB1c2luZyBTSExJQlBBVEhfVkFSPURJUiBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8KKyMgdGhlIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9zaGxpYnBhdGhfdmFyPSRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKQorCisjIFNldCB0byB5ZXMgaWYgYnVpbGRpbmcgYSBzaGFyZWQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGhhcmRjb2RlcyBESVIgaW50byB0aGUgbGlicmFyeQorIyBhbmQgYWxsIHN1YnNlcXVlbnQgbGlicmFyaWVzIGFuZCBleGVjdXRhYmxlcyBsaW5rZWQgYWdhaW5zdCBpdC4KK2hhcmRjb2RlX2F1dG9tYXRpYz0kX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9hdXRvbWF0aWMsICQxKQorCisjIFZhcmlhYmxlcyB3aG9zZSB2YWx1ZXMgc2hvdWxkIGJlIHNhdmVkIGluIGxpYnRvb2wgd3JhcHBlciBzY3JpcHRzIGFuZAorIyByZXN0b3JlZCBhdCByZWxpbmsgdGltZS4KK3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsiCisKKyMgV2hldGhlciBsaWJ0b29sIG11c3QgbGluayBhIHByb2dyYW0gYWdhaW5zdCBhbGwgaXRzIGRlcGVuZGVuY3kgbGlicmFyaWVzLgorbGlua19hbGxfZGVwbGlicz0kX0xUX0FDX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSkKKworIyBDb21waWxlLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKK3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCisKKyMgUnVuLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKK3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRsdF9zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYworCisjIEZpeCB0aGUgc2hlbGwgdmFyaWFibGUgXCRzcmNmaWxlIGZvciB0aGUgY29tcGlsZXIuCitmaXhfc3JjZmlsZV9wYXRoPSIkX0xUX0FDX1RBR1ZBUihmaXhfc3JjZmlsZV9wYXRoLCAkMSkiCisKKyMgU2V0IHRvIHllcyBpZiBleHBvcnRlZCBzeW1ib2xzIGFyZSByZXF1aXJlZC4KK2Fsd2F5c19leHBvcnRfc3ltYm9scz0kX0xUX0FDX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKQorCisjIFRoZSBjb21tYW5kcyB0byBsaXN0IGV4cG9ydGVkIHN5bWJvbHMuCitleHBvcnRfc3ltYm9sc19jbWRzPSRsdF9bXV9MVF9BQ19UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpCisKKyMgVGhlIGNvbW1hbmRzIHRvIGV4dHJhY3QgdGhlIGV4cG9ydGVkIHN5bWJvbCBsaXN0IGZyb20gYSBzaGFyZWQgYXJjaGl2ZS4KK2V4dHJhY3RfZXhwc3ltc19jbWRzPSRsdF9leHRyYWN0X2V4cHN5bXNfY21kcworCisjIFN5bWJvbHMgdGhhdCBzaG91bGQgbm90IGJlIGxpc3RlZCBpbiB0aGUgcHJlbG9hZGVkIHN5bWJvbHMuCitleGNsdWRlX2V4cHN5bXM9JGx0X1tdX0xUX0FDX1RBR1ZBUihleGNsdWRlX2V4cHN5bXMsICQxKQorCisjIFN5bWJvbHMgdGhhdCBtdXN0IGFsd2F5cyBiZSBleHBvcnRlZC4KK2luY2x1ZGVfZXhwc3ltcz0kbHRfW11fTFRfQUNfVEFHVkFSKGluY2x1ZGVfZXhwc3ltcywgJDEpCisKK2lmZWxzZShbJDFdLFtdLAorWyMgIyMjIEVORCBMSUJUT09MIENPTkZJR10sCitbIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogJHRhZ25hbWVdKQorCitfX0VPRl9fCisKK2lmZWxzZShbJDFdLFtdLCBbCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgYWl4MyopCisgICAgY2F0IDw8XEVPRiA+PiAiJGNmZ2ZpbGUiCisKKyMgQUlYIHNvbWV0aW1lcyBoYXMgcHJvYmxlbXMgd2l0aCB0aGUgR0NDIGNvbGxlY3QyIHByb2dyYW0uICBGb3Igc29tZQorIyByZWFzb24sIGlmIHdlIHNldCB0aGUgQ09MTEVDVF9OQU1FUyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdGhlIHByb2JsZW1zCisjIHZhbmlzaCBpbiBhIHB1ZmYgb2Ygc21va2UuCitpZiB0ZXN0ICJYJHtDT0xMRUNUX05BTUVTK3NldH0iICE9IFhzZXQ7IHRoZW4KKyAgQ09MTEVDVF9OQU1FUz0KKyAgZXhwb3J0IENPTExFQ1RfTkFNRVMKK2ZpCitFT0YKKyAgICA7OworICBlc2FjCisKKyAgIyBXZSB1c2Ugc2VkIGluc3RlYWQgb2YgY2F0IGJlY2F1c2UgYmFzaCBvbiBESkdQUCBnZXRzIGNvbmZ1c2VkIGlmCisgICMgaWYgZmluZHMgbWl4ZWQgQ1IvTEYgYW5kIExGLW9ubHkgbGluZXMuICBTaW5jZSBzZWQgb3BlcmF0ZXMgaW4KKyAgIyB0ZXh0IG1vZGUsIGl0IHByb3Blcmx5IGNvbnZlcnRzIGxpbmVzIHRvIENSL0xGLiAgVGhpcyBiYXNoIHByb2JsZW0KKyAgIyBpcyByZXBvcnRlZGx5IGZpeGVkLCBidXQgd2h5IG5vdCBydW4gb24gb2xkIHZlcnNpb25zIHRvbz8KKyAgc2VkICckcScgIiRsdG1haW4iID4+ICIkY2ZnZmlsZSIgfHwgKHJtIC1mICIkY2ZnZmlsZSI7IGV4aXQgMSkKKworICBtdiAtZiAiJGNmZ2ZpbGUiICIkb2ZpbGUiIHx8IFwKKyAgICAocm0gLWYgIiRvZmlsZSIgJiYgY3AgIiRjZmdmaWxlIiAiJG9maWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUiKQorICBjaG1vZCAreCAiJG9maWxlIgorXSkKK2Vsc2UKKyAgIyBJZiB0aGVyZSBpcyBubyBNYWtlZmlsZSB5ZXQsIHdlIHJlbHkgb24gYSBtYWtlIHJ1bGUgdG8gZXhlY3V0ZQorICAjIGBjb25maWcuc3RhdHVzIC0tcmVjaGVjaycgdG8gcmVydW4gdGhlc2UgdGVzdHMgYW5kIGNyZWF0ZSB0aGUKKyAgIyBsaWJ0b29sIHNjcmlwdCB0aGVuLgorICBsdG1haW5faW49YGVjaG8gJGx0bWFpbiB8IHNlZCAtZSAncy9cLnNoJC8uaW4vJ2AKKyAgaWYgdGVzdCAtZiAiJGx0bWFpbl9pbiI7IHRoZW4KKyAgICB0ZXN0IC1mIE1ha2VmaWxlICYmIG1ha2UgIiRsdG1haW4iCisgIGZpCitmaQorXSkjIEFDX0xJQlRPT0xfQ09ORklHCisKKworIyBBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfTk9fUlRUSShbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfTk9fUlRUSV0sCitbQUNfUkVRVUlSRShbX0xUX0FDX1NZU19DT01QSUxFUl0pZG5sCisKK19MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKT0KKworaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpPScgLWZuby1idWlsdGluJworCisgIEFDX0xJQlRPT0xfQ09NUElMRVJfT1BUSU9OKFtpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9uc10sCisgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMsCisgICAgWy1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnNdLCBbXSwKKyAgICBbX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpPSIkX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMiXSkKK2ZpCitdKSMgQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX05PX1JUVEkKKworCisjIEFDX0xJQlRPT0xfU1lTX0dMT0JBTF9TWU1CT0xfUElQRQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtBQ19MSUJUT09MX1NZU19HTE9CQUxfU1lNQk9MX1BJUEVdLAorW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSkKK0FDX1JFUVVJUkUoW0FDX1BST0dfTk1dKQorQUNfUkVRVUlSRShbQUNfT0JKRVhUXSkKKyMgQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkIGJ5IEMgc3ltYm9sIGZyb20gbm0uCitBQ19NU0dfQ0hFQ0tJTkcoW2NvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dCBmcm9tICRjb21waWxlciBvYmplY3RdKQorQUNfQ0FDSEVfVkFMKFtsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlXSwKK1sKKyMgVGhlc2UgYXJlIHNhbmUgZGVmYXVsdHMgdGhhdCB3b3JrIG9uIGF0IGxlYXN0IGEgZmV3IG9sZCBzeXN0ZW1zLgorIyBbVGhleSBjb21lIGZyb20gVWx0cml4LiAgV2hhdCBjb3VsZCBiZSBvbGRlciB0aGFuIFVsdHJpeD8hISA7KV0KKworIyBDaGFyYWN0ZXIgY2xhc3MgZGVzY3JpYmluZyBOTSBnbG9iYWwgc3ltYm9sIGNvZGVzLgorc3ltY29kZT0nW1tCQ0RFR1JTVF1dJworCisjIFJlZ2V4cCB0byBtYXRjaCBzeW1ib2xzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gQy4KK3N5bXBhdD0nXChbW19BLVphLXpdXVtbX0EtWmEtejAtOV1dKlwpJworCisjIFRyYW5zZm9ybSB0aGUgYWJvdmUgaW50byBhIHJhdyBzeW1ib2wgYW5kIGEgQyBzeW1ib2wuCitzeW14ZnJtPSdcMSBcMlwzIFwzJworCisjIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBhIHByb3BlciBDIGRlY2xhcmF0aW9uCitsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGludCBcMTsvcCciCisKKyMgVHJhbnNmb3JtIGFuIGV4dHJhY3RlZCBzeW1ib2wgbGluZSBpbnRvIHN5bWJvbCBuYW1lIGFuZCBzeW1ib2wgYWRkcmVzcworbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9InNlZCAtbiAtZSAncy9eOiBcKFtbXiBdXSpcKSAkLyAge1xcXCJcMVxcXCIsIChsdF9wdHIpIDB9LC9wJyAtZSAncy9eJHN5bWNvZGUgXChbW14gXV0qXCkgXChbW14gXV0qXCkkLyAge1wiXDJcIiwgKGx0X3B0cikgXCZcMn0sL3AnIgorCisjIERlZmluZSBzeXN0ZW0tc3BlY2lmaWMgdmFyaWFibGVzLgorY2FzZSAkaG9zdF9vcyBpbgorYWl4KikKKyAgc3ltY29kZT0nW1tCQ0RUXV0nCisgIDs7CitjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisgIHN5bWNvZGU9J1tbQUJDREdJU1RXXV0nCisgIDs7CitocHV4KikgIyBJdHMgbGlua2VyIGRpc3Rpbmd1aXNoZXMgZGF0YSBmcm9tIGNvZGUgc3ltYm9scworICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAgIHN5bWNvZGU9J1tbQUJDREVHUlNUXV0nCisgIGZpCisgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXlQgLiogXCguKlwpJC9leHRlcm4gaW50IFwxKCk7L3AnIC1lICdzL14kc3ltY29kZSogLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCisgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSJzZWQgLW4gLWUgJ3MvXjogXChbW14gXV0qXCkgJC8gIHtcXFwiXDFcXFwiLCAobHRfcHRyKSAwfSwvcCcgLWUgJ3MvXiRzeW1jb2RlKiBcKFtbXiBdXSpcKSBcKFtbXiBdXSpcKSQvICB7XCJcMlwiLCAobHRfcHRyKSBcJlwyfSwvcCciCisgIDs7Citpcml4KiB8IG5vbnN0b3B1eCopCisgIHN5bWNvZGU9J1tbQkNERUdSU1RdXScKKyAgOzsKK29zZiopCisgIHN5bWNvZGU9J1tbQkNERUdRUlNUXV0nCisgIDs7Citzb2xhcmlzKiB8IHN5c3Y1KikKKyAgc3ltY29kZT0nW1tCRFJUXV0nCisgIDs7CitzeXN2NCkKKyAgc3ltY29kZT0nW1tERk5TVFVdXScKKyAgOzsKK2VzYWMKKworIyBIYW5kbGUgQ1JMRiBpbiBtaW5ndyB0b29sIGNoYWluCitvcHRfY3I9CitjYXNlICRidWlsZF9vcyBpbgorbWluZ3cqKQorICBvcHRfY3I9YGVjaG8gJ3hcezAsMVx9JyB8IHRyIHggJ1wwMTUnYCAjIG9wdGlvbiBjciBpbiByZWdleHAKKyAgOzsKK2VzYWMKKworIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gdXNlIGl0cyBzdGFuZGFyZCBzeW1ib2wgY29kZXMuCitjYXNlIGAkTk0gLVYgMj4mMWAgaW4KKypHTlUqIHwgKid3aXRoIEJGRCcqKQorICBzeW1jb2RlPSdbW0FCQ0RHSVJTVFddXScgOzsKK2VzYWMKKworIyBUcnkgd2l0aG91dCBhIHByZWZpeCB1bmRlcmNvcmUsIHRoZW4gd2l0aCBpdC4KK2ZvciBhY19zeW1wcmZ4IGluICIiICJfIjsgZG8KKworICAjIFdyaXRlIHRoZSByYXcgYW5kIEMgaWRlbnRpZmllcnMuCisgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9InNlZCAtbiAtZSAncy9eLipbWyAJXV1cKCRzeW1jb2RlJHN5bWNvZGUqXClbWyAJXV1bWyAJXV0qXCgkYWNfc3ltcHJmeFwpJHN5bXBhdCRvcHRfY3IkLyRzeW14ZnJtL3AnIgorCisgICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIHBpcGUgd29ya3MgY29ycmVjdGx5LgorICBwaXBlX3dvcmtzPW5vCisKKyAgcm0gLWYgY29uZnRlc3QqCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKK2NoYXIgbm1fdGVzdF92YXI7Cit2b2lkIG5tX3Rlc3RfZnVuYygpe30KKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCitpbnQgbWFpbigpe25tX3Rlc3RfdmFyPSdhJztubV90ZXN0X2Z1bmMoKTtyZXR1cm4oMCk7fQorRU9GCisKKyAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KKyAgICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KKyAgICBubGlzdD1jb25mdGVzdC5ubQorICAgIGlmIEFDX1RSWV9FVkFMKE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJG5saXN0KSAmJiB0ZXN0IC1zICIkbmxpc3QiOyB0aGVuCisgICAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgorICAgICAgaWYgc29ydCAiJG5saXN0IiB8IHVuaXEgPiAiJG5saXN0IlQ7IHRoZW4KKwltdiAtZiAiJG5saXN0IlQgIiRubGlzdCIKKyAgICAgIGVsc2UKKwlybSAtZiAiJG5saXN0IlQKKyAgICAgIGZpCisKKyAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2Ugc25hZ2dlZCBhbGwgdGhlIHN5bWJvbHMgd2UgbmVlZC4KKyAgICAgIGlmIGdyZXAgJyBubV90ZXN0X3ZhciQnICIkbmxpc3QiID4vZGV2L251bGw7IHRoZW4KKwlpZiBncmVwICcgbm1fdGVzdF9mdW5jJCcgIiRubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgorCSAgY2F0IDw8RU9GID4gY29uZnRlc3QuJGFjX2V4dAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitFT0YKKwkgICMgTm93IGdlbmVyYXRlIHRoZSBzeW1ib2wgZmlsZS4KKwkgIGV2YWwgIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCInIDwgIiRubGlzdCIgfCBncmVwIC12IG1haW4gPj4gY29uZnRlc3QuJGFjX2V4dCcKKworCSAgY2F0IDw8RU9GID4+IGNvbmZ0ZXN0LiRhY19leHQKKyNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KKyMgZGVmaW5lIGx0X3B0cl90IHZvaWQgKgorI2Vsc2UKKyMgZGVmaW5lIGx0X3B0cl90IGNoYXIgKgorIyBkZWZpbmUgY29uc3QKKyNlbmRpZgorCisvKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gKi8KK2NvbnN0IHN0cnVjdCB7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGx0X3B0cl90IGFkZHJlc3M7Cit9CitsdF9wcmVsb2FkZWRfc3ltYm9sc1tbXV0gPQoreworRU9GCisJICAkU0VEICJzL14kc3ltY29kZSRzeW1jb2RlKiBcKC4qXCkgXCguKlwpJC8gIHtcIlwyXCIsIChsdF9wdHJfdCkgXCZcMn0sLyIgPCAiJG5saXN0IiB8IGdyZXAgLXYgbWFpbiA+PiBjb25mdGVzdC4kYWNfZXh0CisJICBjYXQgPDxcRU9GID4+IGNvbmZ0ZXN0LiRhY19leHQKKyAgezAsIChsdF9wdHJfdCkgMH0KK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCitFT0YKKwkgICMgTm93IHRyeSBsaW5raW5nIHRoZSB0d28gZmlsZXMuCisJICBtdiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0c3RtLiRhY19vYmpleHQKKwkgIGx0X3NhdmVfTElCUz0iJExJQlMiCisJICBsdF9zYXZlX0NGTEFHUz0iJENGTEFHUyIKKwkgIExJQlM9ImNvbmZ0c3RtLiRhY19vYmpleHQiCisJICBDRkxBR1M9IiRDRkxBR1MkX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpIgorCSAgaWYgQUNfVFJZX0VWQUwoYWNfbGluaykgJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorCSAgICBwaXBlX3dvcmtzPXllcworCSAgZmkKKwkgIExJQlM9IiRsdF9zYXZlX0xJQlMiCisJICBDRkxBR1M9IiRsdF9zYXZlX0NGTEFHUyIKKwllbHNlCisJICBlY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJG5saXN0IiA+JkFTX01FU1NBR0VfTE9HX0ZECisJZmkKKyAgICAgIGVsc2UKKwllY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X3ZhciBpbiAkbmxpc3QiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICAgIGZpCisgICAgZWxzZQorICAgICAgZWNobyAiY2Fubm90IHJ1biAkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgIGZpCisgIGVsc2UKKyAgICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgZmkKKyAgcm0gLWYgY29uZnRlc3QqIGNvbmZ0c3QqCisKKyAgIyBEbyBub3QgdXNlIHRoZSBnbG9iYWxfc3ltYm9sX3BpcGUgdW5sZXNzIGl0IHdvcmtzLgorICBpZiB0ZXN0ICIkcGlwZV93b3JrcyIgPSB5ZXM7IHRoZW4KKyAgICBicmVhaworICBlbHNlCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0KKyAgZmkKK2RvbmUKK10pCitpZiB0ZXN0IC16ICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KKyAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9CitmaQoraWYgdGVzdCAteiAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiOyB0aGVuCisgIEFDX01TR19SRVNVTFQoZmFpbGVkKQorZWxzZQorICBBQ19NU0dfUkVTVUxUKG9rKQorZmkKK10pICMgQUNfTElCVE9PTF9TWVNfR0xPQkFMX1NZTUJPTF9QSVBFCisKKworIyBBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfUElDKFtUQUdOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX1BJQ10sCitbX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9CitfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9CitfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9CisKK0FDX01TR19DSEVDS0lORyhbZm9yICRjb21waWxlciBvcHRpb24gdG8gcHJvZHVjZSBQSUNdKQorIGlmZWxzZShbJDFdLFtDWFhdLFsKKyAgIyBDKysgc3BlY2lmaWMgY2FzZXMgZm9yIHBpYywgc3RhdGljLCB3bCwgZXRjLgorICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLXN0YXRpYycKKworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgqKQorICAgICAgIyBBbGwgQUlYIGNvZGUgaXMgUElDLgorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgorCV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICBmaQorICAgICAgOzsKKyAgICBhbWlnYW9zKikKKyAgICAgICMgRklYTUU6IHdlIG5lZWQgYXQgbGVhc3QgNjgwMjAgY29kZSB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLCBidXQKKyAgICAgICMgYWRkaW5nIHRoZSBgLW02ODAyMCcgZmxhZyB0byBHQ0MgcHJldmVudHMgYnVpbGRpbmcgYW55dGhpbmcgYmV0dGVyLAorICAgICAgIyBsaWtlIGAtbTY4MDQwJy4KKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLW02ODAyMCAtcmVzaWRlbnQzMiAtbWFsd2F5cy1yZXN0b3JlLWE0JworICAgICAgOzsKKyAgICBiZW9zKiB8IGN5Z3dpbiogfCBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqIHwgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIHRoZXNlIE9TZXMuCisgICAgICA7OworICAgIG1pbmd3KiB8IG9zMiogfCBwdzMyKikKKyAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKKyAgICAgICMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1ERExMX0VYUE9SVCcKKyAgICAgIDs7CisgICAgZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KKyAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZuby1jb21tb24nCisgICAgICA7OworICAgICpkamdwcCopCisgICAgICAjIERKR1BQIGRvZXMgbm90IHN1cHBvcnQgc2hhcmVkIGxpYnJhcmllcyBhdCBhbGwKKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KKyAgICAgIDs7CisgICAgc3lzdjQqTVAqKQorICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgorCV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0tS2NvbmZvcm1fcGljCisgICAgICBmaQorICAgICAgOzsKKyAgICBocHV4KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBJQTY0IEhQLVVYIGFuZCA2NC1iaXQgSFAtVVgsIGJ1dAorICAgICAgIyBub3QgZm9yIFBBIEhQLVVYLgorICAgICAgY2FzZSAiJGhvc3RfY3B1IiBpbgorICAgICAgaHBwYSo2NCp8aWE2NCopCisJOzsKKyAgICAgICopCisJX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKyAgICAqKQorICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKKyAgICAgIDs7CisgICAgZXNhYworICBlbHNlCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgYWl4NCogfCBhaXg1KikKKwkjIEFsbCBBSVggY29kZSBpcyBQSUMuCisJaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkgICMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCWVsc2UKKwkgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLWJuc28gLWJJOi9saWIvc3lzY2FsbHMuZXhwJworCWZpCisJOzsKKyAgICAgIGNob3J1cyopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwljeGNoNjgpCisJICAjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgorCSAgIyBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Ii0tbm9fYXV0b19pbnN0YW50aWF0aW9uIC11IF9fbWFpbiAtdSBfX3ByZW1haW4gLXUgX2Fib3J0IC1yICRDT09MX0RJUi9saWIvbGliT3JiLmEgJE1WTUVfRElSL2xpYi9DQy9saWJDLmEgJE1WTUVfRElSL2xpYi9jbGFzc2l4L2xpYmN4LnMuYSIKKwkgIDs7CisJZXNhYworCTs7CisgICAgICBkZ3V4KikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgZWMrKykKKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKwkgICAgOzsKKwkgIGdoY3gpCisJICAgICMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLXBpYycKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBmcmVlYnNkKiB8IGtmcmVlYnNkKi1nbnUpCisJIyBGcmVlQlNEIHVzZXMgR05VIEMrKworCTs7CisgICAgICBocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgQ0MpCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9IiR7YWNfY3ZfcHJvZ19jY193bH0tYSAke2FjX2N2X3Byb2dfY2Nfd2x9YXJjaGl2ZSIKKwkgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0OyB0aGVuCisJICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPScrWicKKwkgICAgZmkKKwkgICAgOzsKKwkgIGFDQykKKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0iJHthY19jdl9wcm9nX2NjX3dsfS1hICR7YWNfY3ZfcHJvZ19jY193bH1hcmNoaXZlIgorCSAgICBjYXNlICIkaG9zdF9jcHUiIGluCisJICAgIGhwcGEqNjQqfGlhNjQqKQorCSAgICAgICMgK1ogdGhlIGRlZmF1bHQKKwkgICAgICA7OworCSAgICAqKQorCSAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nK1onCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKQorCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKKwkgICAgIyBDQyBwaWMgZmxhZyAtS1BJQyBpcyB0aGUgZGVmYXVsdC4KKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBsaW51eCopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIEtDQykKKwkgICAgIyBLQUkgQysrIENvbXBpbGVyCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctLWJhY2tlbmQgLVdsLCcKKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKKwkgICAgOzsKKwkgIGljcGMpCisJICAgICMgSW50ZWwgQysrCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1zdGF0aWMnCisJICAgIDs7CisJICBjeHgpCisJICAgICMgQ29tcGFxIEMrKworCSAgICAjIE1ha2Ugc3VyZSB0aGUgUElDIGZsYWcgaXMgZW1wdHkuICBJdCBhcHBlYXJzIHRoYXQgYWxsIEFscGhhCisJICAgICMgTGludXggYW5kIENvbXBhcSBUcnU2NCBVbml4IG9iamVjdHMgYXJlIFBJQy4KKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPQorCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ub25fc2hhcmVkJworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIGx5bnhvcyopCisJOzsKKyAgICAgIG04OGsqKQorCTs7CisgICAgICBtdnMqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBjeHgpCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLVcgYyxleHBvcnRhbGwnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgbmV0YnNkKiB8IGtuZXRic2QqLWdudSkKKwk7OworICAgICAgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBLQ0MpCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctLWJhY2tlbmQgLVdsLCcKKwkgICAgOzsKKwkgIFJDQykKKwkgICAgIyBSYXRpb25hbCBDKysgMi40LjEKKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctcGljJworCSAgICA7OworCSAgY3h4KQorCSAgICAjIERpZ2l0YWwvQ29tcGFxIEMrKworCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgICAgIyBNYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGlzIGVtcHR5LiAgSXQgYXBwZWFycyB0aGF0IGFsbCBBbHBoYQorCSAgICAjIExpbnV4IGFuZCBDb21wYXEgVHJ1NjQgVW5peCBvYmplY3RzIGFyZSBQSUMuCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBwc29zKikKKwk7OworICAgICAgc2NvKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgQ0MpCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgc29sYXJpcyopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKQorCSAgICAjIFN1biBDKysgNC4yLCA1LnggYW5kIENlbnRlcmxpbmUgQysrCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctUW9wdGlvbiBsZCAnCisJICAgIDs7CisJICBnY3gpCisJICAgICMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLVBJQycKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBzdW5vczQqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBDQykKKwkgICAgIyBTdW4gQysrIDQueAorCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1waWMnCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJICAgIDs7CisJICBsY2MpCisJICAgICMgTHVjaWQKKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctcGljJworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIHRhbmRlbSopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIE5DQykKKwkgICAgIyBOb25TdG9wLVVYIE5DQyAzLjIwCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgdW5peHdhcmUqKQorCTs7CisgICAgICB2eHdvcmtzKikKKwk7OworICAgICAgKikKKwlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZCwgJDEpPW5vCisJOzsKKyAgICBlc2FjCisgIGZpCitdLAorWworICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLXN0YXRpYycKKworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeCopCisgICAgICAjIEFsbCBBSVggY29kZSBpcyBQSUMuCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYW1pZ2FvcyopCisgICAgICAjIEZJWE1FOiB3ZSBuZWVkIGF0IGxlYXN0IDY4MDIwIGNvZGUgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcywgYnV0CisgICAgICAjIGFkZGluZyB0aGUgYC1tNjgwMjAnIGZsYWcgdG8gR0NDIHByZXZlbnRzIGJ1aWxkaW5nIGFueXRoaW5nIGJldHRlciwKKyAgICAgICMgbGlrZSBgLW02ODA0MCcuCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1tNjgwMjAgLXJlc2lkZW50MzIgLW1hbHdheXMtcmVzdG9yZS1hNCcKKyAgICAgIDs7CisKKyAgICBiZW9zKiB8IGN5Z3dpbiogfCBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqIHwgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIHRoZXNlIE9TZXMuCisgICAgICA7OworCisgICAgbWluZ3cqIHwgcHczMiogfCBvczIqKQorICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZworICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLURETExfRVhQT1JUJworICAgICAgOzsKKworICAgIGRhcndpbiogfCByaGFwc29keSopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBvbiB0aGlzIHBsYXRmb3JtCisgICAgICAjIENvbW1vbiBzeW1ib2xzIG5vdCBhbGxvd2VkIGluIE1IX0RZTElCIGZpbGVzCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mbm8tY29tbW9uJworICAgICAgOzsKKworICAgIG1zZG9zZGpncHAqKQorICAgICAgIyBKdXN0IGJlY2F1c2Ugd2UgdXNlIEdDQyBkb2Vzbid0IG1lYW4gd2Ugc3VkZGVubHkgZ2V0IHNoYXJlZCBsaWJyYXJpZXMKKyAgICAgICMgb24gc3lzdGVtcyB0aGF0IGRvbid0IHN1cHBvcnQgdGhlbS4KKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkLCAkMSk9bm8KKyAgICAgIGVuYWJsZV9zaGFyZWQ9bm8KKyAgICAgIDs7CisKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCisJX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPS1LY29uZm9ybV9waWMKKyAgICAgIGZpCisgICAgICA7OworCisgICAgaHB1eCopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSUE2NCBIUC1VWCBhbmQgNjQtYml0IEhQLVVYLCBidXQKKyAgICAgICMgbm90IGZvciBQQSBIUC1VWC4KKyAgICAgIGNhc2UgIiRob3N0X2NwdSIgaW4KKyAgICAgIGhwcGEqNjQqfGlhNjQqKQorCSMgK1ogdGhlIGRlZmF1bHQKKwk7OworICAgICAgKikKKwlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworCTs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgKikKKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMnCisgICAgICA7OworICAgIGVzYWMKKyAgZWxzZQorICAgICMgUE9SVE1FIENoZWNrIGZvciBmbGFnIHRvIHBhc3MgbGlua2VyIGZsYWdzIHRocm91Z2ggdGhlIHN5c3RlbSBjb21waWxlci4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgYWl4KikKKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgorCV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICBlbHNlCisJX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctYm5zbyAtYkk6L2xpYi9zeXNjYWxscy5leHAnCisgICAgICBmaQorICAgICAgOzsKKworICAgIG1pbmd3KiB8IHB3MzIqIHwgb3MyKikKKyAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKKyAgICAgICMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1ERExMX0VYUE9SVCcKKyAgICAgIDs7CisKKyAgICBocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIElBNjQgSFAtVVggYW5kIDY0LWJpdCBIUC1VWCwgYnV0CisgICAgICAjIG5vdCBmb3IgUEEgSFAtVVguCisgICAgICBjYXNlICIkaG9zdF9jcHUiIGluCisgICAgICBocHBhKjY0KnxpYTY0KikKKwkjICtaIHRoZSBkZWZhdWx0CisJOzsKKyAgICAgICopCisJX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPScrWicKKwk7OworICAgICAgZXNhYworICAgICAgIyBJcyB0aGVyZSBhIGJldHRlciBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyB0aGF0IHdvcmtzIHdpdGggdGhlIGJ1bmRsZWQgQ0M/CisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9JyR7d2x9LWEgJHt3bH1hcmNoaXZlJworICAgICAgOzsKKworICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICAgICMgUElDICh3aXRoIC1LUElDKSBpcyB0aGUgZGVmYXVsdC4KKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLW5vbl9zaGFyZWQnCisgICAgICA7OworCisgICAgbmV3c29zNikKKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIGxpbnV4KikKKyAgICAgIGNhc2UgJENDIGluCisgICAgICBpY2MqIHwgZWNjKikKKwlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLXN0YXRpYycKKyAgICAgICAgOzsKKyAgICAgIGNjYyopCisgICAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgICAgICAjIEFsbCBBbHBoYSBjb2RlIGlzIFBJQy4KKyAgICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKKyAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICAgICMgQWxsIE9TRi8xIGNvZGUgaXMgUElDLgorICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKKyAgICAgIDs7CisKKyAgICBzY28zLjJ2NSopCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LcGljJworICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctZG4nCisgICAgICA7OworCisgICAgc29sYXJpcyopCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIHN1bm9zNCopCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVFvcHRpb24gbGQgJworICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctUElDJworICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICBzeXN2NCB8IHN5c3Y0LjJ1dzIqIHwgc3lzdjQuMyogfCBzeXN2NSopCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIHN5c3Y0Kk1QKikKKyAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KKwlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LY29uZm9ybV9waWMnCisJX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgdXRzNCopCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1waWMnCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgICopCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZCwgJDEpPW5vCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKK10pCitBQ19NU0dfUkVTVUxUKFskX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpXSkKKworIworIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGFjdHVhbGx5IHdvcmtzLgorIworaWYgdGVzdCAtbiAiJF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKSI7IHRoZW4KKyAgQUNfTElCVE9PTF9DT01QSUxFUl9PUFRJT04oW2lmICRjb21waWxlciBQSUMgZmxhZyAkX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpIHdvcmtzXSwKKyAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzLCAkMSksCisgICAgWyRfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSlpZmVsc2UoWyQxXSxbXSxbIC1EUElDXSxbaWZlbHNlKFskMV0sW0NYWF0sWyAtRFBJQ10sW10pXSldLCBbXSwKKyAgICBbY2FzZSAkX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpIGluCisgICAgICIiIHwgIiAiKikgOzsKKyAgICAgKikgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSIgJF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKSIgOzsKKyAgICAgZXNhY10sCisgICAgW19MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KKyAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQsICQxKT1ub10pCitmaQorY2FzZSAiJGhvc3Rfb3MiIGluCisgICMgRm9yIHBsYXRmb3JtcyB3aGljaCBkbyBub3Qgc3VwcG9ydCBQSUMsIC1EUElDIGlzIG1lYW5pbmdsZXNzOgorICAqZGpncHAqKQorICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KKyAgICA7OworICAqKQorICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0iJF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKWlmZWxzZShbJDFdLFtdLFsgLURQSUNdLFtpZmVsc2UoWyQxXSxbQ1hYXSxbIC1EUElDXSxbXSldKSIKKyAgICA7OworZXNhYworXSkKKworCisjIEFDX0xJQlRPT0xfUFJPR19MRF9TSExJQlMoW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2VlIGlmIHRoZSBsaW5rZXIgc3VwcG9ydHMgYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4KK0FDX0RFRlVOKFtBQ19MSUJUT09MX1BST0dfTERfU0hMSUJTXSwKK1tBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllc10pCitpZmVsc2UoWyQxXSxbQ1hYXSxbCisgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgYWl4NCogfCBhaXg1KikKKyAgICAjIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB3ZSBkb24ndCB3YW50IHRoZSAiLUMiIG9wdGlvbi4KKyAgICAjIC1DIG1lYW5zIGRlbWFuZ2xlIHRvIEFJWCBubSwgYnV0IG1lYW5zIGRvbid0IGRlbWFuZ2xlIHdpdGggR05VIG5tCisgICAgaWYgJE5NIC1WIDI+JjEgfCBncmVwICdHTlUnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NIC1CcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFxbJF0yID09ICJUIikgfHwgKFxbJF0yID09ICJEIikgfHwgKFxbJF0yID09ICJCIikpICYmIChbc3Vic3RyXShcWyRdMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXFskXTMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCisgICAgZWxzZQorICAgICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAtQkNwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXFskXTIgPT0gIlQiKSB8fCAoXFskXTIgPT0gIkQiKSB8fCAoXFskXTIgPT0gIkIiKSkgJiYgKFtzdWJzdHJdKFxbJF0zLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcWyRdMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKKyAgICBmaQorICAgIDs7CisgIHB3MzIqKQorICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSIkbHRkbGxfY21kcyIKKyAgOzsKKyAgY3lnd2luKiB8IG1pbmd3KikKKyAgICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEIC1lICdcJycvXltbQkNER1NdXSAvcy8uKiBcKFtbXiBdXSpcKS9cMSBEQVRBLydcJycgfCAkU0VEIC1lICdcJycvXltbQUlUV11dIC9zLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICA7OworICBsaW51eCopCisgICAgX0xUX0FDX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9bm8KKyAgOzsKKyAgKikKKyAgICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICA7OworICBlc2FjCitdLFsKKyAgcnVucGF0aF92YXI9CisgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0KKyAgX0xUX0FDX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9bm8KKyAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0KKyAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9CisgIF9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfRnJvbV9uZXdfY21kcywgJDEpPQorICBfTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzLCAkMSk9CisgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9CisgIF9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KKyAgX0xUX0FDX1RBR1ZBUih0aHJlYWRfc2FmZV9mbGFnX3NwZWMsICQxKT0KKyAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9CisgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCwgJDEpPQorICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0KKyAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT1ubworICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT11bnN1cHBvcnRlZAorICBfTFRfQUNfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT11bmtub3duCisgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfYXV0b21hdGljLCAkMSk9bm8KKyAgX0xUX0FDX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPQorICBfTFRfQUNfVEFHVkFSKG1vZHVsZV9leHBzeW1fY21kcywgJDEpPQorICBfTFRfQUNfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPW5vCisgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisgICMgaW5jbHVkZV9leHBzeW1zIHNob3VsZCBiZSBhIGxpc3Qgb2Ygc3BhY2Utc2VwYXJhdGVkIHN5bWJvbHMgdG8gYmUgKmFsd2F5cyoKKyAgIyBpbmNsdWRlZCBpbiB0aGUgc3ltYm9sIGxpc3QKKyAgX0xUX0FDX1RBR1ZBUihpbmNsdWRlX2V4cHN5bXMsICQxKT0KKyAgIyBleGNsdWRlX2V4cHN5bXMgY2FuIGJlIGFuIGV4dGVuZGVkIHJlZ2V4cCBvZiBzeW1ib2xzIHRvIGV4Y2x1ZGUKKyAgIyBpdCB3aWxsIGJlIHdyYXBwZWQgYnkgYCAoJyBhbmQgYCkkJywgc28gb25lIG11c3Qgbm90IG1hdGNoIGJlZ2lubmluZyBvcgorICAjIGVuZCBvZiBsaW5lLiAgRXhhbXBsZTogYGF8YmN8LipkLionIHdpbGwgZXhjbHVkZSB0aGUgc3ltYm9scyBgYScgYW5kIGBiYycsCisgICMgYXMgd2VsbCBhcyBhbnkgc3ltYm9sIHRoYXQgY29udGFpbnMgYGQnLgorICBfTFRfQUNfVEFHVkFSKGV4Y2x1ZGVfZXhwc3ltcywgJDEpPSJfR0xPQkFMX09GRlNFVF9UQUJMRV8iCisgICMgQWx0aG91Z2ggX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGlzIGEgdmFsaWQgc3ltYm9sIEMgbmFtZSwgbW9zdCBhLm91dAorICAjIHBsYXRmb3JtcyAoYWIpdXNlIGl0IGluIFBJQyBjb2RlLCBidXQgdGhlaXIgbGlua2VycyBnZXQgY29uZnVzZWQgaWYKKyAgIyB0aGUgc3ltYm9sIGlzIGV4cGxpY2l0bHkgcmVmZXJlbmNlZC4gIFNpbmNlIHBvcnRhYmxlIGNvZGUgY2Fubm90CisgICMgcmVseSBvbiB0aGlzIHN5bWJvbCBuYW1lLCBpdCdzIHByb2JhYmx5IGZpbmUgdG8gbmV2ZXIgaW5jbHVkZSBpdCBpbgorICAjIHByZWxvYWRlZCBzeW1ib2wgdGFibGVzLgorICBleHRyYWN0X2V4cHN5bXNfY21kcz0KKworICBjYXNlICRob3N0X29zIGluCisgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgICAjIEZJWE1FOiB0aGUgTVNWQysrIHBvcnQgaGFzbid0IGJlZW4gdGVzdGVkIGluIGEgbG9vb29uZyB0aW1lCisgICAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKKyAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgorICAgIGlmIHRlc3QgIiRHQ0MiICE9IHllczsgdGhlbgorICAgICAgd2l0aF9nbnVfbGQ9bm8KKyAgICBmaQorICAgIDs7CisgIG9wZW5ic2QqKQorICAgIHdpdGhfZ251X2xkPW5vCisgICAgOzsKKyAgZXNhYworCisgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9eWVzCisgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICAjIElmIGFyY2hpdmVfY21kcyBydW5zIExELCBub3QgQ0MsIHdsYXJjIHNob3VsZCBiZSBlbXB0eQorICAgIHdsYXJjPScke3dsfScKKworICAgICMgU2VlIGlmIEdOVSBsZCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgzKiB8IGFpeDQqIHwgYWl4NSopCisgICAgICAjIE9uIEFJWC9QUEMsIHRoZSBHTlUgbGlua2VyIGlzIHZlcnkgYnJva2VuCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQ7IHRoZW4KKwlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJY2F0IDw8RU9GIDE+JjIKKworKioqIFdhcm5pbmc6IHRoZSBHTlUgbGlua2VyLCBhdCBsZWFzdCB1cCB0byByZWxlYXNlIDIuOS4xLCBpcyByZXBvcnRlZAorKioqIHRvIGJlIHVuYWJsZSB0byByZWxpYWJseSBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBBSVguCisqKiogVGhlcmVmb3JlLCBsaWJ0b29sIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBJZiB5b3UKKyoqKiByZWFsbHkgY2FyZSBmb3Igc2hhcmVkIGxpYnJhcmllcywgeW91IG1heSB3YW50IHRvIG1vZGlmeSB5b3VyIFBBVEgKKyoqKiBzbyB0aGF0IGEgbm9uLUdOVSBsaW5rZXIgaXMgZm91bmQsIGFuZCB0aGVuIHJlc3RhcnQuCisKK0VPRgorICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBhbWlnYW9zKikKKyAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRybSAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiAkQVJfRkxBR1MgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvdXRwdXRfb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisKKyAgICAgICMgU2FtdWVsIEEuIEZhbHZvIElJIDxrYzV0amFAZG9scGhpbi5vcGVucHJvamVjdHMubmV0PiByZXBvcnRzCisgICAgICAjIHRoYXQgdGhlIHNlbWFudGljcyBvZiBkeW5hbWljIGxpYnJhcmllcyBvbiBBbWlnYU9TLCBhdCBsZWFzdCB1cAorICAgICAgIyB0byB2ZXJzaW9uIDQsIGlzIHRvIHNoYXJlIGRhdGEgYW1vbmcgbXVsdGlwbGUgcHJvZ3JhbXMgbGlua2VkCisgICAgICAjIHdpdGggdGhlIHNhbWUgZHluYW1pYyBsaWJyYXJ5LiAgU2luY2UgdGhpcyBkb2Vzbid0IG1hdGNoIHRoZQorICAgICAgIyBiZWhhdmlvciBvZiBzaGFyZWQgbGlicmFyaWVzIG9uIG90aGVyIHBsYXRmb3Jtcywgd2UgY2FuJ3QgdXNlCisgICAgICAjIHRoZW0uCisgICAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICA7OworCisgICAgYmVvcyopCisgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwlfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKKwkjIEpvc2VwaCBCZWNrZW5iYWNoIDxqcmIzQGJlc3QuY29tPiBzYXlzIHNvbWUgcmVsZWFzZXMgb2YgZ2NjCisJIyBzdXBwb3J0IC0tdW5kZWZpbmVkLiAgVGhpcyBkZXNlcnZlcyBzb21lIGludmVzdGlnYXRpb24uICBGSVhNRQorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtbm9zdGFydCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICBmaQorICAgICAgOzsKKworICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgICAgICMgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSkgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsCisgICAgICAjIGFzIHRoZXJlIGlzIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgorICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKyAgICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorICAgICAgX0xUX0FDX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT1ubworICAgICAgX0xUX0FDX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9eWVzCisgICAgICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEIC1lICdcJycvXltbQkNER1NdXSAvcy8uKiBcKFtbXiBdXSpcKS9cMSBEQVRBLydcJycgfCAkU0VEIC1lICdcJycvXltbQUlUV11dIC9zLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworCisgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICdhdXRvLWltcG9ydCcgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWltYWdlLWJhc2U9MHgxMDAwMDAwMCAke3dsfS0tb3V0LWltcGxpYiwkbGliJworCSMgSWYgdGhlIGV4cG9ydC1zeW1ib2xzIGZpbGUgYWxyZWFkeSBpcyBhIC5kZWYgZmlsZSAoMXN0IGxpbmUKKwkjIGlzIEVYUE9SVFMpLCB1c2UgaXQgYXMgaXM7IG90aGVyd2lzZSwgcHJlcGVuZC4uLgorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdpZiB0ZXN0ICJ4YCRTRUQgMXEgJGV4cG9ydF9zeW1ib2xzYCIgPSB4RVhQT1JUUzsgdGhlbgorCSAgY3AgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCWVsc2UKKwkgIGVjaG8gRVhQT1JUUyA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCSAgY2F0ICRleHBvcnRfc3ltYm9scyA+PiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKwlmaX4KKwkkQ0MgLXNoYXJlZCAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0taW1hZ2UtYmFzZT0weDEwMDAwMDAwICAke3dsfS0tb3V0LWltcGxpYiwkbGliJworICAgICAgZWxzZQorCWxkX3NobGlicz1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBuZXRic2QqIHwga25ldGJzZCotZ251KQorICAgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtQnNoYXJlYWJsZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1vICRsaWInCisJd2xhcmM9CisgICAgICBlbHNlCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzb2xhcmlzKiB8IHN5c3Y1KikKKyAgICAgIGlmICRMRCAtdiAyPiYxIHwgZ3JlcCAnQkZEIDJcLjgnID4gL2Rldi9udWxsOyB0aGVuCisJX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCWNhdCA8PEVPRiAxPiYyCisKKyoqKiBXYXJuaW5nOiBUaGUgcmVsZWFzZXMgMi44Liogb2YgdGhlIEdOVSBsaW5rZXIgY2Fubm90IHJlbGlhYmx5CisqKiogY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gU29sYXJpcyBzeXN0ZW1zLiAgVGhlcmVmb3JlLCBsaWJ0b29sCisqKiogaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIFdlIHVyZ2UgeW91IHRvIHVwZ3JhZGUgR05VCisqKiogYmludXRpbHMgdG8gcmVsZWFzZSAyLjkuMSBvciBuZXdlci4gIEFub3RoZXIgb3B0aW9uIGlzIHRvIG1vZGlmeQorKioqIHlvdXIgUEFUSCBvciBjb21waWxlciBjb25maWd1cmF0aW9uIHNvIHRoYXQgdGhlIG5hdGl2ZSBsaW5rZXIgaXMKKyoqKiB1c2VkLCBhbmQgdGhlbiByZXN0YXJ0LgorCitFT0YKKyAgICAgIGVsaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZWxzZQorCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3Vub3M0KikKKyAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICB3bGFyYz0KKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICBsaW51eCopCisgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICAgIHRtcF9hcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9IiR0bXBfYXJjaGl2ZV9jbWRzIgorICAgICAgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPW5vCisgICAgICBjYXNlIGAkTEQgLXYgMj4vZGV2L251bGxgIGluCisgICAgICAgICpcIFswMV0uKiB8ICpcIDIuW1swLTldXS4qIHwgKlwgMi4xMC4qKSA7OyAjIGNhdGNoIHZlcnNpb25zIDwgMi4xMQorICAgICAgICAqXCAyLjExLjkzLjAuMlwgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OyAjIFJINy4zIC4uLgorICAgICAgICAqXCAyLjExLjkyLjAuMTJcICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsgIyBNYW5kcmFrZSA4LjIgLi4uCisgICAgICAgICpcIDIuMTEuKikgOzsgIyBvdGhlciAyLjExIHZlcnNpb25zCisgICAgICAgICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsKKyAgICAgIGVzYWMKKyAgICAgIGlmIHRlc3QgJHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZyA9IHllczsgdGhlbgorICAgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CitjYXQgJGV4cG9ydF9zeW1ib2xzIHwgc2VkIC1lICJzL1woLipcKS9cMTsvIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CiskZWNobyAibG9jYWw6ICo7IH07IiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisgICAgICAgICRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS12ZXJzaW9uLXNjcmlwdCAke3dsfSRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlciAtbyAkbGliJworICAgICAgZWxzZQorICAgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0iJHRtcF9hcmNoaXZlX2NtZHMiCisgICAgICBmaQorICAgICAgX0xUX0FDX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9bm8KKyAgICBlbHNlCisgICAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgZmkKKyAgICA7OworCisgICAgKikKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICBmaQorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBpZiB0ZXN0ICIkX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKSIgPSB5ZXM7IHRoZW4KKyAgICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKyAgICAgICMgYW5jaWVudCBHTlUgbGQgZGlkbid0IHN1cHBvcnQgLS13aG9sZS1hcmNoaXZlIGV0LiBhbC4KKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJ25vLXdob2xlLWFyY2hpdmUnID4gL2Rldi9udWxsOyB0aGVuCisgCV9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKKyAgICAgIGVsc2UKKyAgCV9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KKyAgICAgIGZpCisgICAgZmkKKyAgZWxzZQorICAgICMgUE9SVE1FIGZpbGwgaW4gYSBkZXNjcmlwdGlvbiBvZiB5b3VyIHN5c3RlbSdzIGxpbmtlciAobm90IEdOVSBsZCkKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgYWl4MyopCisgICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKKyAgICAgIF9MVF9BQ19UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9eWVzCisgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJExEIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtYkU6JGV4cG9ydF9zeW1ib2xzIC1UNTEyIC1INTEyIC1iTTpTUkV+JEFSICRBUl9GTEFHUyAkbGliICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCisgICAgICAjIE5vdGU6IHRoaXMgbGlua2VyIGhhcmRjb2RlcyB0aGUgZGlyZWN0b3JpZXMgaW4gTElCUEFUSCBpZiB0aGVyZQorICAgICAgIyBhcmUgbm8gZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGJ5IC1MLgorICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAmJiB0ZXN0IC16ICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KKwkjIE5laXRoZXIgZGlyZWN0IGhhcmRjb2Rpbmcgbm9yIHN0YXRpYyBsaW5raW5nIGlzIHN1cHBvcnRlZCB3aXRoIGEKKwkjIGJyb2tlbiBjb2xsZWN0Mi4KKwlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXVuc3VwcG9ydGVkCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFpeDQqIHwgYWl4NSopCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgT24gSUE2NCwgdGhlIGxpbmtlciBkb2VzIHJ1biB0aW1lIGxpbmtpbmcgYnkgZGVmYXVsdCwgc28gd2UgZG9uJ3QKKwkjIGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC4KKwlhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCisJZXhwX3N5bV9mbGFnPSctQmV4cG9ydCcKKwlub19lbnRyeV9mbGFnPSIiCisgICAgICBlbHNlCisJIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gd2UgZG9uJ3Qgd2FudCB0aGUgIi1DIiBvcHRpb24uCisJIyAtQyBtZWFucyBkZW1hbmdsZSB0byBBSVggbm0sIGJ1dCBtZWFucyBkb24ndCBkZW1hbmdsZSB3aXRoIEdOVSBubQorCWlmICROTSAtViAyPiYxIHwgZ3JlcCAnR05VJyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgX0xUX0FDX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAtQnBnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcWyRdMiA9PSAiVCIpIHx8IChcWyRdMiA9PSAiRCIpIHx8IChcWyRdMiA9PSAiQiIpKSAmJiAoW3N1YnN0cl0oXFskXTMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFxbJF0zIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJworCWVsc2UKKwkgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gLUJDcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFxbJF0yID09ICJUIikgfHwgKFxbJF0yID09ICJEIikgfHwgKFxbJF0yID09ICJCIikpICYmIChbc3Vic3RyXShcWyRdMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXFskXTMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCisJZmkKKwlhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCisKKwkjIFRlc3QgaWYgd2UgYXJlIHRyeWluZyB0byB1c2UgcnVuIHRpbWUgbGlua2luZyBvciBub3JtYWwKKwkjIEFJWCBzdHlsZSBsaW5raW5nLiBJZiAtYnJ0bCBpcyBzb21ld2hlcmUgaW4gTERGTEFHUywgd2UKKwkjIG5lZWQgdG8gZG8gcnVudGltZSBsaW5raW5nLgorCWNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bWzIzXV18YWl4NC5bWzIzXV0uKnxhaXg1KikKKwkgIGZvciBsZF9mbGFnIGluICRMREZMQUdTOyBkbworICAJICBpZiAodGVzdCAkbGRfZmxhZyA9ICItYnJ0bCIgfHwgdGVzdCAkbGRfZmxhZyA9ICItV2wsLWJydGwiKTsgdGhlbgorICAJICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9eWVzCisgIAkgICAgYnJlYWsKKyAgCSAgZmkKKwkgIGRvbmUKKwllc2FjCisKKwlleHBfc3ltX2ZsYWc9Jy1iZXhwb3J0JworCW5vX2VudHJ5X2ZsYWc9Jy1ibm9lbnRyeScKKyAgICAgIGZpCisKKyAgICAgICMgV2hlbiBsYXJnZSBleGVjdXRhYmxlcyBvciBzaGFyZWQgb2JqZWN0cyBhcmUgYnVpbHQsIEFJWCBsZCBjYW4KKyAgICAgICMgaGF2ZSBwcm9ibGVtcyBjcmVhdGluZyB0aGUgdGFibGUgb2YgY29udGVudHMuICBJZiBsaW5raW5nIGEgbGlicmFyeQorICAgICAgIyBvciBwcm9ncmFtIHJlc3VsdHMgaW4gImVycm9yIFRPQyBvdmVyZmxvdyIgYWRkIC1tbWluaW1hbC10b2MgdG8KKyAgICAgICMgQ1hYRkxBR1MvQ0ZMQUdTIGZvciBnKysvZ2NjLiAgSW4gdGhlIGNhc2VzIHdoZXJlIHRoYXQgaXMgbm90CisgICAgICAjIGVub3VnaCB0byBmaXggdGhlIHByb2JsZW0sIGFkZCAtV2wsLWJiaWd0b2MgdG8gTERGTEFHUy4KKworICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPSc6JworICAgICAgX0xUX0FDX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJY2FzZSAkaG9zdF9vcyBpbiBhaXg0LlswMTJdfGFpeDQuWzAxMl0uKikKKwkjIFdlIG9ubHkgd2FudCB0byBkbyB0aGlzIG9uIEFJWCA0LjIgYW5kIGxvd2VyLCB0aGUgY2hlY2sKKwkjIGJlbG93IGZvciBicm9rZW4gY29sbGVjdDIgZG9lc24ndCB3b3JrIHVuZGVyIDQuMysKKwkgIGNvbGxlY3QybmFtZT1gJHtDQ30gLXByaW50LXByb2ctbmFtZT1jb2xsZWN0MmAKKwkgIGlmIHRlc3QgLWYgIiRjb2xsZWN0Mm5hbWUiICYmIFwKKyAgCSAgIHN0cmluZ3MgIiRjb2xsZWN0Mm5hbWUiIHwgZ3JlcCByZXNvbHZlX2xpYl9uYW1lID4vZGV2L251bGwKKwkgIHRoZW4KKyAgCSAgIyBXZSBoYXZlIHJld29ya2VkIGNvbGxlY3QyCisgIAkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisJICBlbHNlCisgIAkgICMgV2UgaGF2ZSBvbGQgY29sbGVjdDIKKyAgCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT11bnN1cHBvcnRlZAorICAJICAjIEl0IGZhaWxzIHRvIGZpbmQgdW5pbnN0YWxsZWQgbGlicmFyaWVzIHdoZW4gdGhlIHVuaW5zdGFsbGVkCisgIAkgICMgcGF0aCBpcyBub3QgbGlzdGVkIGluIHRoZSBsaWJwYXRoLiAgU2V0dGluZyBoYXJkY29kZV9taW51c19MCisgIAkgICMgdG8gdW5zdXBwb3J0ZWQgZm9yY2VzIHJlbGlua2luZworICAJICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKyAgCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKyAgCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9CisJICBmaQorCWVzYWMKKwlzaGFyZWRfZmxhZz0nLXNoYXJlZCcKKyAgICAgIGVsc2UKKwkjIG5vdCB1c2luZyBnY2MKKwlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAJIyBWaXN1YWxBZ2UgQysrLCBWZXJzaW9uIDUuNSBmb3IgQUlYIDVMIGZvciBJQS02NCwgQmV0YSAzIFJlbGVhc2UKKyAgCSMgY2hva2VzIG9uIC1XbCwtRy4gVGhlIGZvbGxvd2luZyBsaW5lIGlzIGNvcnJlY3Q6CisJICBzaGFyZWRfZmxhZz0nLUcnCisJZWxzZQorICAJaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJICAgIHNoYXJlZF9mbGFnPScke3dsfS1HJworCSAgZWxzZQorCSAgICBzaGFyZWRfZmxhZz0nJHt3bH0tYk06U1JFJworICAJZmkKKwlmaQorICAgICAgZmkKKworICAgICAgIyBJdCBzZWVtcyB0aGF0IC1iZXhwYWxsIGRvZXMgbm90IGV4cG9ydCBzeW1ib2xzIGJlZ2lubmluZyB3aXRoCisgICAgICAjIHVuZGVyc2NvcmUgKF8pLCBzbyBpdCBpcyBiZXR0ZXIgdG8gZ2VuZXJhdGUgYSBsaXN0IG9mIHN5bWJvbHMgdG8gZXhwb3J0LgorICAgICAgX0xUX0FDX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT15ZXMKKyAgICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1bnRpbWUgbG9hZGluZyBmbGFncyAoLWJydGwpLAorCSMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKwlfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9Jy1iZXJvaycKKyAgICAgICAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4gZW1wdHkgZXhlY3V0YWJsZS4KKyAgICAgICBfTFRfQUNfU1lTX0xJQlBBVEhfQUlYCisgICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9IlwkQ0MiJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyBgaWYgdGVzdCAieCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IiAhPSAieCI7IHRoZW4gZWNobyAiJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSI7IGVsc2UgOjsgZmlgICciXCR7d2x9JG5vX2VudHJ5X2ZsYWcgXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzICRzaGFyZWRfZmxhZyIKKyAgICAgICBlbHNlCisJaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1SICRsaWJkaXI6L3Vzci9saWI6L2xpYicKKwkgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0iLXogbm9kZWZzIgorCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAnIlwke3dsfSRub19lbnRyeV9mbGFnIFwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyIKKwllbHNlCisJICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbiBlbXB0eSBleGVjdXRhYmxlLgorCSBfTFRfQUNfU1lTX0xJQlBBVEhfQUlYCisJIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgorCSAgIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVuIHRpbWUgbG9hZGluZyBmbGFncywKKwkgICMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKwkgIF9MVF9BQ19UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWJlcm5vdG9rJworCSAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tYmVyb2snCisJICAjIC1iZXhwYWxsIGRvZXMgbm90IGV4cG9ydCBzeW1ib2xzIGJlZ2lubmluZyB3aXRoIHVuZGVyc2NvcmUgKF8pCisJICBfTFRfQUNfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPXllcworCSAgIyBFeHBvcnRlZCBzeW1ib2xzIGNhbiBiZSBwdWxsZWQgaW50byBzaGFyZWQgb2JqZWN0cyBmcm9tIGFyY2hpdmVzCisJICBfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyAnCisJICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9eWVzCisJICAjIFRoaXMgaXMgc2ltaWxhciB0byBob3cgQUlYIHRyYWRpdGlvbmFsbHkgYnVpbGRzIGl0J3Mgc2hhcmVkIGxpYnJhcmllcy4KKwkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWJFOiRleHBvcnRfc3ltYm9scyAke3dsfS1ibm9lbnRyeSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9fiRBUiAkQVJfRkxBR1MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUkcmVsZWFzZS5hICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCisJZmkKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYW1pZ2FvcyopCisgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckcm0gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBOQU1FICRsaWJuYW1lIiA+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTElCUkFSWV9JRCAxIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFZFUlNJT04gJG1ham9yIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFJFVklTSU9OICRyZXZpc2lvbiIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kQVIgJEFSX0ZMQUdTICRsaWIgJGxpYm9ianN+JFJBTkxJQiAkbGlifihjZCAkb3V0cHV0X29iamRpciAmJiBhMml4bGlicmFyeSAtMzIpJworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworICAgICAgIyBzZWUgY29tbWVudCBhYm91dCBkaWZmZXJlbnQgc2VtYW50aWNzIG9uIHRoZSBHTlUgbGQgc2VjdGlvbgorICAgICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgOzsKKworICAgIGJzZGk0KikKKyAgICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9LXJkeW5hbWljCisgICAgICA7OworCisgICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQorICAgICAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKKyAgICAgICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCisgICAgICAjIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsIGFzIHRoZXJlIGlzCisgICAgICAjIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgorICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyAnCisgICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKKyAgICAgICMgVGVsbCBsdG1haW4gdG8gbWFrZSAubGliIGZpbGVzLCBub3QgLmEgZmlsZXMuCisgICAgICBsaWJleHQ9bGliCisgICAgICAjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmRsbCBmaWxlcywgbm90IC5zbyBmaWxlcy4KKyAgICAgIHNocmV4dF9jbWRzPSIuZGxsIgorICAgICAgIyBGSVhNRTogU2V0dGluZyBsaW5rbmFtZXMgaGVyZSBpcyBhIGJhZCBoYWNrLgorICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1vICRsaWIgJGxpYm9ianMgJGNvbXBpbGVyX2ZsYWdzIGBlY2hvICIkZGVwbGlicyIgfCAkU0VEIC1lICdcJydzLyAtbGMkLy8nXCcnYCAtbGluayAtZGxsfmxpbmtuYW1lcz0nCisgICAgICAjIFRoZSBsaW5rZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGJ1aWxkIGEgLmxpYiBmaWxlIGlmIHdlIGJ1aWxkIGEgRExMLgorICAgICAgX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9Gcm9tX25ld19jbWRzLCAkMSk9J3RydWUnCisgICAgICAjIEZJWE1FOiBTaG91bGQgbGV0IHRoZSB1c2VyIHNwZWNpZnkgdGhlIGxpYiBwcm9ncmFtLgorICAgICAgX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9J2xpYiAvT1VUOiRvbGRsaWIkb2xkb2JqcyRvbGRfZGVwbGlicycKKyAgICAgIGZpeF9zcmNmaWxlX3BhdGg9J2BjeWdwYXRoIC13ICIkc3JjZmlsZSJgJworICAgICAgX0xUX0FDX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9eWVzCisgICAgICA7OworCisgICAgZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgICBpZiB0ZXN0ICIkR1hYIiA9IHllcyA7IHRoZW4KKyAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworICAgICAgY2FzZSAiJGhvc3Rfb3MiIGluCisgICAgICByaGFwc29keSogfCBkYXJ3aW4xLltbMDEyXV0pCisJX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPSctdW5kZWZpbmVkIHN1cHByZXNzJworCTs7CisgICAgICAqKSAjIERhcndpbiAxLjMgb24KKyAgICAgIGlmIHRlc3QgLXogJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVR9IDsgdGhlbgorICAgICAgCV9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nLWZsYXRfbmFtZXNwYWNlIC11bmRlZmluZWQgc3VwcHJlc3MnCisgICAgICBlbHNlCisgICAgICAgIGNhc2UgJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVR9IGluCisgICAgICAgICAgMTAuW1swMTJdXSkKKyAgICAgICAgICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nLWZsYXRfbmFtZXNwYWNlIC11bmRlZmluZWQgc3VwcHJlc3MnCisgICAgICAgICAgICA7OworICAgICAgICAgIDEwLiopCisgICAgICAgICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9Jy11bmRlZmluZWQgZHluYW1pY19sb29rdXAnCisgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgICBmaQorCTs7CisgICAgICBlc2FjCisgICAgCWx0X2ludF9hcHBsZV9jY19zaW5nbGVfbW9kPW5vCisgICAgCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJworICAgIAlpZiAkQ0MgLWR1bXBzcGVjcyAyPiYxIHwgZ3JlcCAnc2luZ2xlX21vZHVsZScgPi9kZXYvbnVsbCA7IHRoZW4KKyAgICAJICBsdF9pbnRfYXBwbGVfY2Nfc2luZ2xlX21vZD15ZXMKKyAgICAJZmkKKyAgICAJaWYgdGVzdCAiWCRsdF9pbnRfYXBwbGVfY2Nfc2luZ2xlX21vZCIgPSBYeWVzIDsgdGhlbgorICAgIAkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtZHluYW1pY2xpYiAtc2luZ2xlX21vZHVsZSAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nJworICAgIAllbHNlCisgICAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtciAke3dsfS1iaW5kX2F0X2xvYWQgLWtlZXBfcHJpdmF0ZV9leHRlcm5zIC1ub3N0ZGxpYiAtbyAke2xpYn0tbWFzdGVyLm8gJGxpYm9ianN+JENDIC1keW5hbWljbGliICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICR7bGlifS1tYXN0ZXIubyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nJworICAgICAgZmkKKyAgICAgIF9MVF9BQ19UQUdWQVIobW9kdWxlX2NtZHMsICQxKT0nJENDICR7d2x9LWJpbmRfYXRfbG9hZCAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzJworICAgICAgIyBEb24ndCBmaXggdGhpcyBieSB1c2luZyB0aGUgbGQgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBmbGFnLCBpdCBkb2Vzbid0IGV4aXN0IGluIG9sZGVyIGRhcndpbiBsZCdzCisgICAgICAgIGlmIHRlc3QgIlgkbHRfaW50X2FwcGxlX2NjX3NpbmdsZV9tb2QiID0gWHllcyA7IHRoZW4KKyAgICAgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgLWR5bmFtaWNsaWIgLXNpbmdsZV9tb2R1bGUgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZ35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCisgICAgICAgIGVsc2UKKyAgICAgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgLXIgJHt3bH0tYmluZF9hdF9sb2FkIC1rZWVwX3ByaXZhdGVfZXh0ZXJucyAtbm9zdGRsaWIgLW8gJHtsaWJ9LW1hc3Rlci5vICRsaWJvYmpzfiRDQyAtZHluYW1pY2xpYiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAke2xpYn0tbWFzdGVyLm8gJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZ35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCisgICAgICAgIGZpCisgICAgICAgICAgX0xUX0FDX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKT0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnICAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3N+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9hdXRvbWF0aWMsICQxKT15ZXMKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPXVuc3VwcG9ydGVkCisgICAgICBfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9Jy1hbGxfbG9hZCAkY29udmVuaWVuY2UnCisgICAgICBfTFRfQUNfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKyAgICBlbHNlCisgICAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgZmkKKyAgICAgIDs7CisKKyAgICBkZ3V4KikKKyAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgIGZyZWVic2QxKikKKyAgICAgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICAjIEZyZWVCU0QgMi4yLlswMTJdIGFsbG93cyB1cyB0byBpbmNsdWRlIGMrK3J0MC5vIHRvIGdldCBDKysgY29uc3RydWN0b3IKKyAgICAjIHN1cHBvcnQuICBGdXR1cmUgdmVyc2lvbnMgZG8gdGhpcyBhdXRvbWF0aWNhbGx5LCBidXQgYW4gZXhwbGljaXQgYysrcnQwLm8KKyAgICAjIGRvZXMgbm90IGJyZWFrIGFueXRoaW5nLCBhbmQgaGVscHMgc2lnbmlmaWNhbnRseSAoYXQgdGhlIGNvc3Qgb2YgYSBsaXR0bGUKKyAgICAjIGV4dHJhIHNwYWNlKS4KKyAgICBmcmVlYnNkMi4yKikKKyAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgL3Vzci9saWIvYysrcnQwLm8nCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgIyBVbmZvcnR1bmF0ZWx5LCBvbGRlciB2ZXJzaW9ucyBvZiBGcmVlQlNEIDIgZG8gbm90IGhhdmUgdGhpcyBmZWF0dXJlLgorICAgIGZyZWVic2QyKikKKyAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgICMgRnJlZUJTRCAzIGFuZCBncmVhdGVyIHVzZXMgZ2NjIC1zaGFyZWQgdG8gZG8gc2hhcmVkIGxpYnJhcmllcy4KKyAgICBmcmVlYnNkKiB8IGtmcmVlYnNkKi1nbnUpCisgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICBocHV4OSopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRybSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRDQyAtc2hhcmVkIC1mUElDICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICBlbHNlCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJHJtICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JExEIC1iICtiICRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICBmaQorICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKworICAgICAgIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKKyAgICAgICMgYnV0IGFzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisgICAgICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJworICAgICAgOzsKKworICAgIGhwdXgxMCogfCBocHV4MTEqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgLWEgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCWNhc2UgIiRob3N0X2NwdSIgaW4KKwlocHBhKjY0KnxpYTY0KikKKwkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwkqKQorCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJZXNhYworICAgICAgZWxzZQorCWNhc2UgIiRob3N0X2NwdSIgaW4KKwlocHBhKjY0KnxpYTY0KikKKwkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtYiAraCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIDs7CisJKikKKwkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtYiAraCAkc29uYW1lICtiICRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICA7OworCWVzYWMKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwljYXNlICIkaG9zdF9jcHUiIGluCisJaHBwYSo2NCopCisJICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisJICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQsICQxKT0nK2IgJGxpYmRpcicKKwkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKwkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KKwkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisJICA7OworCWlhNjQqKQorCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKwkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KKwkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisKKwkgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCisJICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKwkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworCSAgOzsKKwkqKQorCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKwkgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCisKKwkgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCisJICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKwkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworCSAgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgOzsKKworICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCwgJDEpPSctcnBhdGggJGxpYmRpcicKKyAgICAgIGZpCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorICAgICAgX0xUX0FDX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisgICAgICA7OworCisgICAgbmV0YnNkKiB8IGtuZXRic2QqLWdudSkKKyAgICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJyAgIyBhLm91dAorICAgICAgZWxzZQorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtc2hhcmVkIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgICAgICAjIEVMRgorICAgICAgZmkKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICBuZXdzb3M2KQorICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgIG9wZW5ic2QqKQorICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKKyAgICAgIGVsc2UKKyAgICAgICBjYXNlICRob3N0X29zIGluCisJIG9wZW5ic2RbWzAxXV0uKiB8IG9wZW5ic2QyLltbMC03XV0gfCBvcGVuYnNkMi5bWzAtN11dLiopCisJICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJworCSAgIDs7CisJICopCisJICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJworCSAgIDs7CisgICAgICAgZXNhYworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBvczIqKQorICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworICAgICAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCisgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckZWNobyAiTElCUkFSWSAkbGlibmFtZSBJTklUSU5TVEFOQ0UiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvICJERVNDUklQVElPTiBcIiRsaWJuYW1lXCIiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyBEQVRBID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyAiIFNJTkdMRSBOT05TSEFSRUQiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyBFWFBPUlRTID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn5lbXhleHAgJGxpYm9ianMgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRDQyAtWmRsbCAtWmNydGRsbCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYnCisgICAgICBfTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX0Zyb21fbmV3X2NtZHMsICQxKT0nZW14aW1wIC1vICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmEgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmJworICAgICAgOzsKKworICAgIG9zZjMqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworICAgICAgZWxzZQorCV9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisgICAgICBmaQorICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKyAgICAgIDs7CisKKyAgICBvc2Y0KiB8IG9zZjUqKQkjIGFzIG9zZjMqIHdpdGggdGhlIGFkZGl0aW9uIG9mIC1tc3ltIGZsYWcKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1tc3ltICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBlbHNlCisJX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZm9yIGkgaW4gYGNhdCAkZXhwb3J0X3N5bWJvbHNgOyBkbyBwcmludGYgIiVzICVzXFxuIiAtZXhwb3J0ZWRfc3ltYm9sICJcJGkiID4+ICRsaWIuZXhwOyBkb25lOyBlY2hvICItaGlkZGVuIj4+ICRsaWIuZXhwfgorCSRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWlucHV0ICRsaWIuZXhwICRsaW5rZXJfZmxhZ3MgJGxpYm9ianMgJGRlcGxpYnMgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYn4kcm0gJGxpYi5leHAnCisKKwkjIEJvdGggYyBhbmQgY3h4IGNvbXBpbGVyIHN1cHBvcnQgLXJwYXRoIGRpcmVjdGx5CisJX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1ycGF0aCAkbGliZGlyJworICAgICAgZmkKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKyAgICAgIDs7CisKKyAgICBzY28zLjJ2NSopCisgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tQmV4cG9ydCcKKyAgICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisgICAgICBoYXJkY29kZV9ydW5wYXRoX3Zhcj15ZXMKKyAgICAgIDs7CisKKyAgICBzb2xhcmlzKikKKyAgICAgIF9MVF9BQ19UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nIC16IHRleHQnCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LWggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH4kZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKwkgICRDQyAtc2hhcmVkICR7d2x9LU0gJHt3bH0kbGliLmV4cCAke3dsfS1oICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc34kcm0gJGxpYi5leHAnCisgICAgICBlbHNlCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorICAJJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLU0gJGxpYi5leHAgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3N+JHJtICRsaWIuZXhwJworICAgICAgZmkKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgc29sYXJpczIuW1swLTVdXSB8IHNvbGFyaXMyLltbMC01XV0uKikgOzsKKyAgICAgICopICMgU3VwcG9ydGVkIHNpbmNlIFNvbGFyaXMgMi42IChtYXliZSAyLjUuMT8pCisJX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScteiBhbGxleHRyYWN0JGNvbnZlbmllbmNlIC16IGRlZmF1bHRleHRyYWN0JyA7OworICAgICAgZXNhYworICAgICAgX0xUX0FDX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisgICAgICA7OworCisgICAgc3Vub3M0KikKKyAgICAgIGlmIHRlc3QgIngkaG9zdF92ZW5kb3IiID0geHNlcXVlbnQ7IHRoZW4KKwkjIFVzZSAkQ0MgdG8gbGluayB1bmRlciBzZXF1ZW50LCBiZWNhdXNlIGl0IHRocm93cyBpbiBzb21lIGV4dHJhIC5vCisJIyBmaWxlcyB0aGF0IG1ha2UgLmluaXQgYW5kIC5maW5pIHNlY3Rpb25zIHdvcmsuCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGVsc2UKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzdGF0aWMgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgZmkKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgIHN5c3Y0KQorICAgICAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KKwlzbmkpCisJICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcyAjIGlzIHRoaXMgcmVhbGx5IHRydWU/Pz8KKwk7OworCXNpZW1lbnMpCisJICAjIyBMRCBpcyBsZCBpdCBtYWtlcyBhIFBMQU1MSUIKKwkgICMjIENDIGp1c3QgbWFrZXMgYSBHcm9zc01vZHVsZS4KKwkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICBfTFRfQUNfVEFHVkFSKHJlbG9hZF9jbWRzLCAkMSk9JyRDQyAtciAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJworCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworICAgICAgICA7OworCW1vdG9yb2xhKQorCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubyAjTW90b3JvbGEgbWFudWFsIHNheXMgeWVzLCBidXQgbXkgdGVzdHMgc2F5IHRoZXkgbGllCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgc3lzdjQuMyopCisgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nLUJleHBvcnQnCisgICAgICA7OworCisgICAgc3lzdjQqTVAqKQorICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworCXJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisJaGFyZGNvZGVfcnVucGF0aF92YXI9eWVzCisJX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT15ZXMKKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjQuMnV3MiopCisgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPW5vCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgaGFyZGNvZGVfcnVucGF0aF92YXI9eWVzCisgICAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorICAgICAgOzsKKworICAgc3lzdjVPcGVuVU5JWDgqIHwgc3lzdjVVbml4V2FyZTcqIHwgIHN5c3Y1dXdbWzc4XV0qIHwgdW5peHdhcmU3KikKKyAgICAgIF9MVF9BQ19UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0teiAke3dsfXRleHQnCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LWggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZWxzZQorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1oICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGZpCisgICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgIHN5c3Y1KikKKyAgICAgIF9MVF9BQ19UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nIC16IHRleHQnCisgICAgICAjICRDQyAtc2hhcmVkIHdpdGhvdXQgR05VIGxkIHdpbGwgbm90IGNyZWF0ZSBhIGxpYnJhcnkgZnJvbSBDKysKKyAgICAgICMgb2JqZWN0IGZpbGVzIGFuZCBhIHN0YXRpYyBsaWJzdGRjKyssIGJldHRlciBhdm9pZCBpdCBieSBub3cKKyAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorICAJCSRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1NICRsaWIuZXhwIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfiRybSAkbGliLmV4cCcKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPQorICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKyAgICAgIDs7CisKKyAgICB1dHM0KikKKyAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgICopCisgICAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKK10pCitBQ19NU0dfUkVTVUxUKFskX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKV0pCit0ZXN0ICIkX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKSIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCisKK3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSJQQVRIICRzaGxpYnBhdGhfdmFyICRydW5wYXRoX3ZhciIKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsgR0NDX0VYRUNfUFJFRklYIENPTVBJTEVSX1BBVEggTElCUkFSWV9QQVRIIgorZmkKKworIworIyBEbyB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgbGluayBsaWJjPworIworY2FzZSAieCRfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSkiIGluCit4fHh5ZXMpCisgICMgQXNzdW1lIC1sYyBzaG91bGQgYmUgYWRkZWQKKyAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPXllcworCisgIGlmIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIGNhc2UgJF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSkgaW4KKyAgICAqJ34nKikKKyAgICAgICMgRklYTUU6IHdlIG1heSBoYXZlIHRvIGRlYWwgd2l0aCBtdWx0aS1jb21tYW5kIHNlcXVlbmNlcy4KKyAgICAgIDs7CisgICAgJyRDQyAnKikKKyAgICAgICMgVGVzdCB3aGV0aGVyIHRoZSBjb21waWxlciBpbXBsaWNpdGx5IGxpbmtzIHdpdGggLWxjIHNpbmNlIG9uIHNvbWUKKyAgICAgICMgc3lzdGVtcywgLWxnY2MgaGFzIHRvIGNvbWUgYmVmb3JlIC1sYy4gSWYgZ2NjIGFscmVhZHkgcGFzc2VzIC1sYworICAgICAgIyB0byBsZCwgZG9uJ3QgYWRkIC1sYyBiZWZvcmUgLWxnY2MuCisgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgLWxjIHNob3VsZCBiZSBleHBsaWNpdGx5IGxpbmtlZCBpbl0pCisgICAgICAkcm0gY29uZnRlc3QqCisgICAgICBwcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorCisgICAgICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVycjsgdGhlbgorICAgICAgICBzb25hbWU9Y29uZnRlc3QKKyAgICAgICAgbGliPWNvbmZ0ZXN0CisgICAgICAgIGxpYm9ianM9Y29uZnRlc3QuJGFjX29iamV4dAorICAgICAgICBkZXBsaWJzPQorICAgICAgICB3bD0kX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSkKKyAgICAgICAgY29tcGlsZXJfZmxhZ3M9LXYKKyAgICAgICAgbGlua2VyX2ZsYWdzPS12CisgICAgICAgIHZlcnN0cmluZz0KKyAgICAgICAgb3V0cHV0X29iamRpcj0uCisgICAgICAgIGxpYm5hbWU9Y29uZnRlc3QKKyAgICAgICAgbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZz0kX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpCisgICAgICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0KKyAgICAgICAgaWYgQUNfVFJZX0VWQUwoX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKSAyXD5cJjEgXHwgZ3JlcCBcIiAtbGMgXCIgXD4vZGV2L251bGwgMlw+XCYxKQorICAgICAgICB0aGVuCisJICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KKyAgICAgICAgZWxzZQorCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPXllcworICAgICAgICBmaQorICAgICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWcKKyAgICAgIGVsc2UKKyAgICAgICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1CisgICAgICBmaQorICAgICAgJHJtIGNvbmZ0ZXN0KgorICAgICAgQUNfTVNHX1JFU1VMVChbJF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKV0pCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKyAgOzsKK2VzYWMKK10pIyBBQ19MSUJUT09MX1BST0dfTERfU0hMSUJTCisKKworIyBfTFRfQUNfRklMRV9MVERMTF9DCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQmUgY2FyZWZ1bCB0aGF0IHRoZSBzdGFydCBtYXJrZXIgYWx3YXlzIGZvbGxvd3MgYSBuZXdsaW5lLgorQUNfREVGVU4oW19MVF9BQ19GSUxFX0xURExMX0NdLCBbCisjIC8qIGx0ZGxsLmMgc3RhcnRzIGhlcmUgKi8KKyMgI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjICNpbmNsdWRlIDx3aW5kb3dzLmg+CisjICN1bmRlZiBXSU4zMl9MRUFOX0FORF9NRUFOCisjICNpbmNsdWRlIDxzdGRpby5oPgorIworIyAjaWZuZGVmIF9fQ1lHV0lOX18KKyMgIyAgaWZkZWYgX19DWUdXSU4zMl9fCisjICMgICAgZGVmaW5lIF9fQ1lHV0lOX18gX19DWUdXSU4zMl9fCisjICMgIGVuZGlmCisjICNlbmRpZgorIworIyAjaWZkZWYgX19jcGx1c3BsdXMKKyMgZXh0ZXJuICJDIiB7CisjICNlbmRpZgorIyBCT09MIEFQSUVOVFJZIERsbE1haW4gKEhJTlNUQU5DRSBoSW5zdCwgRFdPUkQgcmVhc29uLCBMUFZPSUQgcmVzZXJ2ZWQpOworIyAjaWZkZWYgX19jcGx1c3BsdXMKKyMgfQorIyAjZW5kaWYKKyMKKyMgI2lmZGVmIF9fQ1lHV0lOX18KKyMgI2luY2x1ZGUgPGN5Z3dpbi9jeWd3aW5fZGxsLmg+CisjIERFQ0xBUkVfQ1lHV0lOX0RMTCggRGxsTWFpbiApOworIyAjZW5kaWYKKyMgSElOU1RBTkNFIF9faERsbEluc3RhbmNlX2Jhc2U7CisjCisjIEJPT0wgQVBJRU5UUlkKKyMgRGxsTWFpbiAoSElOU1RBTkNFIGhJbnN0LCBEV09SRCByZWFzb24sIExQVk9JRCByZXNlcnZlZCkKKyMgeworIyAgIF9faERsbEluc3RhbmNlX2Jhc2UgPSBoSW5zdDsKKyMgICByZXR1cm4gVFJVRTsKKyMgfQorIyAvKiBsdGRsbC5jIGVuZHMgaGVyZSAqLworXSkjIF9MVF9BQ19GSUxFX0xURExMX0MKKworCisjIF9MVF9BQ19UQUdWQVIoVkFSTkFNRSwgW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtfTFRfQUNfVEFHVkFSXSwgW2lmZWxzZShbJDJdLCBbXSwgWyQxXSwgWyQxXyQyXSldKQorCisKKyMgb2xkIG5hbWVzCitBQ19ERUZVTihbQU1fUFJPR19MSUJUT09MXSwgICBbQUNfUFJPR19MSUJUT09MXSkKK0FDX0RFRlVOKFtBTV9FTkFCTEVfU0hBUkVEXSwgIFtBQ19FTkFCTEVfU0hBUkVEKCRAKV0pCitBQ19ERUZVTihbQU1fRU5BQkxFX1NUQVRJQ10sICBbQUNfRU5BQkxFX1NUQVRJQygkQCldKQorQUNfREVGVU4oW0FNX0RJU0FCTEVfU0hBUkVEXSwgW0FDX0RJU0FCTEVfU0hBUkVEKCRAKV0pCitBQ19ERUZVTihbQU1fRElTQUJMRV9TVEFUSUNdLCBbQUNfRElTQUJMRV9TVEFUSUMoJEApXSkKK0FDX0RFRlVOKFtBTV9QUk9HX0xEXSwgICAgICAgIFtBQ19QUk9HX0xEXSkKK0FDX0RFRlVOKFtBTV9QUk9HX05NXSwgICAgICAgIFtBQ19QUk9HX05NXSkKKworIyBUaGlzIGlzIGp1c3QgdG8gc2lsZW5jZSBhY2xvY2FsIGFib3V0IHRoZSBtYWNybyBub3QgYmVpbmcgdXNlZAoraWZlbHNlKFtBQ19ESVNBQkxFX0ZBU1RfSU5TVEFMTF0pCisKK0FDX0RFRlVOKFtMVF9BQ19QUk9HX0dDSl0sCitbQUNfQ0hFQ0tfVE9PTChHQ0osIGdjaiwgbm8pCisgIHRlc3QgIngke0dDSkZMQUdTK3NldH0iID0geHNldCB8fCBHQ0pGTEFHUz0iLWcgLU8yIgorICBBQ19TVUJTVChHQ0pGTEFHUykKK10pCisKK0FDX0RFRlVOKFtMVF9BQ19QUk9HX1JDXSwKK1tBQ19DSEVDS19UT09MKFJDLCB3aW5kcmVzLCBubykKK10pCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBOT1RFOiBUaGlzIG1hY3JvIGhhcyBiZWVuIHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGludG8gICAjCisjICBHTlUgQXV0b2NvbmYgYXMgQUNfUFJPR19TRUQuICBXaGVuIGl0IGlzIGF2YWlsYWJsZSBpbiAgICMKKyMgIGEgcmVsZWFzZWQgdmVyc2lvbiBvZiBBdXRvY29uZiB3ZSBzaG91bGQgcmVtb3ZlIHRoaXMgICAgIworIyAgbWFjcm8gYW5kIHVzZSBpdCBpbnN0ZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTFRfQUNfUFJPR19TRUQKKyMgLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgZm9yIGEgZnVsbHktZnVuY3Rpb25hbCBzZWQgcHJvZ3JhbSwgdGhhdCB0cnVuY2F0ZXMKKyMgYXMgZmV3IGNoYXJhY3RlcnMgYXMgcG9zc2libGUuICBQcmVmZXIgR05VIHNlZCBpZiBmb3VuZC4KK0FDX0RFRlVOKFtMVF9BQ19QUk9HX1NFRF0sCitbQUNfTVNHX0NIRUNLSU5HKFtmb3IgYSBzZWQgdGhhdCBkb2VzIG5vdCB0cnVuY2F0ZSBvdXRwdXRdKQorQUNfQ0FDSEVfVkFMKGx0X2N2X3BhdGhfU0VELAorWyMgTG9vcCB0aHJvdWdoIHRoZSB1c2VyJ3MgcGF0aCBhbmQgdGVzdCBmb3Igc2VkIGFuZCBnc2VkLgorIyBUaGVuIHVzZSB0aGF0IGxpc3Qgb2Ygc2VkJ3MgYXMgb25lcyB0byB0ZXN0IGZvciB0cnVuY2F0aW9uLgorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgbHRfYWNfcHJvZyBpbiBzZWQgZ3NlZDsgZG8KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgICAgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGx0X2FjX3Byb2ckYWNfZXhlY19leHQiOyB0aGVuCisgICAgICAgIGx0X2FjX3NlZF9saXN0PSIkbHRfYWNfc2VkX2xpc3QgJGFzX2Rpci8kbHRfYWNfcHJvZyRhY19leGVjX2V4dCIKKyAgICAgIGZpCisgICAgZG9uZQorICBkb25lCitkb25lCitsdF9hY19tYXg9MAorbHRfYWNfY291bnQ9MAorIyBBZGQgL3Vzci94cGc0L2Jpbi9zZWQgYXMgaXQgaXMgdHlwaWNhbGx5IGZvdW5kIG9uIFNvbGFyaXMKKyMgYWxvbmcgd2l0aCAvYmluL3NlZCB0aGF0IHRydW5jYXRlcyBvdXRwdXQuCitmb3IgbHRfYWNfc2VkIGluICRsdF9hY19zZWRfbGlzdCAvdXNyL3hwZzQvYmluL3NlZDsgZG8KKyAgdGVzdCAhIC1mICRsdF9hY19zZWQgJiYgYnJlYWsKKyAgY2F0IC9kZXYvbnVsbCA+IGNvbmZ0ZXN0LmluCisgIGx0X2FjX2NvdW50PTAKKyAgZWNobyAkRUNIT19OICIwMTIzNDU2Nzg5JEVDSE9fQyIgPmNvbmZ0ZXN0LmluCisgICMgQ2hlY2sgZm9yIEdOVSBzZWQgYW5kIHNlbGVjdCBpdCBpZiBpdCBpcyBmb3VuZC4KKyAgaWYgIiRsdF9hY19zZWQiIC0tdmVyc2lvbiAyPiYxIDwgL2Rldi9udWxsIHwgZ3JlcCAnR05VJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgIGx0X2N2X3BhdGhfU0VEPSRsdF9hY19zZWQKKyAgICBicmVhaworICBmaQorICB3aGlsZSB0cnVlOyBkbworICAgIGNhdCBjb25mdGVzdC5pbiBjb25mdGVzdC5pbiA+Y29uZnRlc3QudG1wCisgICAgbXYgY29uZnRlc3QudG1wIGNvbmZ0ZXN0LmluCisgICAgY3AgY29uZnRlc3QuaW4gY29uZnRlc3QubmwKKyAgICBlY2hvID4+Y29uZnRlc3QubmwKKyAgICAkbHRfYWNfc2VkIC1lICdzL2EkLy8nIDwgY29uZnRlc3QubmwgPmNvbmZ0ZXN0Lm91dCB8fCBicmVhaworICAgIGNtcCAtcyBjb25mdGVzdC5vdXQgY29uZnRlc3QubmwgfHwgYnJlYWsKKyAgICAjIDEwMDAwIGNoYXJzIGFzIGlucHV0IHNlZW1zIG1vcmUgdGhhbiBlbm91Z2gKKyAgICB0ZXN0ICRsdF9hY19jb3VudCAtZ3QgMTAgJiYgYnJlYWsKKyAgICBsdF9hY19jb3VudD1gZXhwciAkbHRfYWNfY291bnQgKyAxYAorICAgIGlmIHRlc3QgJGx0X2FjX2NvdW50IC1ndCAkbHRfYWNfbWF4OyB0aGVuCisgICAgICBsdF9hY19tYXg9JGx0X2FjX2NvdW50CisgICAgICBsdF9jdl9wYXRoX1NFRD0kbHRfYWNfc2VkCisgICAgZmkKKyAgZG9uZQorZG9uZQorU0VEPSRsdF9jdl9wYXRoX1NFRAorXSkKK0FDX01TR19SRVNVTFQoWyRTRURdKQorXSkKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tNC9ub2V4ZWNzdGFjay5tNCBiL2xpYmdjcnlwdC0xLjQuNi9tNC9ub2V4ZWNzdGFjay5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWFiNDg0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L200L25vZXhlY3N0YWNrLm00CkBAIC0wLDAgKzEsNTUgQEAKKyMgbm9leGVjc3RhY2subTQKK2RubCBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK2RubAorZG5sIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKK2RubCBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCitkbmwgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCitkbmwgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2RubCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorZG5sIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCitkbmwgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKK2RubCBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyAgVVNBCisKK2RubCBDaGVja3Mgd2hldGhlciB0aGUgc3RhY2sgY2FuIGJlIG1hcmtlZCBub25leGVjdXRhYmxlIGJ5IHBhc3NpbmcgYW4KK2RubCBvcHRpb24gdG8gdGhlIEMtY29tcGlsZXIgd2hlbiBhY3Rpbmcgb24gLnMgZmlsZXMuICBSZXR1cm5zIHRoYXQKK2RubCBvcHRpb24gaW4gTk9FWEVDU1RBQ0tfRkxBR1MuCitkbmwgVGhpcyBtYWNybyBpcyBhZGFwdGVkIGZyb20gb25lIGZvdW5kIGluIEdMSUJDLTIuMy41LgorQUNfREVGVU4oW0NMX0FTX05PRVhFQ1NUQUNLXSxbCitBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSkKK0FDX1JFUVVJUkUoW0FNX1BST0dfQVNdKQorCitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgbm9uIGV4Y3V0YWJsZSBzdGFjayBzdXBwb3J0IGlzIHJlcXVlc3RlZF0pCitBQ19BUkdfRU5BQkxFKG5vZXhlY3N0YWNrLAorICAgICAgICAgICAgICBBQ19IRUxQX1NUUklORyhbLS1kaXNhYmxlLW5vZXhlY3N0YWNrXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGUgbm9uIGV4ZWN1dGFibGUgc3RhY2sgc3VwcG9ydF0pLAorICAgICAgICAgICAgICBub2V4ZWNzdGFja19zdXBwb3J0PSRlbmFibGV2YWwsIG5vZXhlY3N0YWNrX3N1cHBvcnQ9eWVzKQorQUNfTVNHX1JFU1VMVCgkbm9leGVjc3RhY2tfc3VwcG9ydCkKKworQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgYXNzZW1ibGVyIHN1cHBvcnRzIC0tbm9leGVjc3RhY2sgb3B0aW9uXSwKK2NsX2N2X2FzX25vZXhlY3N0YWNrLCBbZG5sCisgIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKK3ZvaWQgZm9vKCkge30KK0VPRgorICBpZiBBQ19UUllfQ09NTUFORChbJHtDQ30gJENGTEFHUyAkQ1BQRkxBR1MKKyAgICAgICAgICAgICAgICAgICAgIC1TIC1vIGNvbmZ0ZXN0LnMgY29uZnRlc3QuYyA+L2Rldi9udWxsXSkgXAorICAgICAmJiBncmVwIC5ub3RlLkdOVS1zdGFjayBjb25mdGVzdC5zID4vZGV2L251bGwgXAorICAgICAmJiBBQ19UUllfQ09NTUFORChbJHtDQ0FTfSAkQ0NBU0ZMQUdTICRDUFBGTEFHUyAtV2EsLS1ub2V4ZWNzdGFjaworICAgICAgICAgICAgICAgICAgICAgICAtYyAtbyBjb25mdGVzdC5vIGNvbmZ0ZXN0LnMgPi9kZXYvbnVsbF0pCisgIHRoZW4KKyAgICBjbF9jdl9hc19ub2V4ZWNzdGFjaz15ZXMKKyAgZWxzZQorICAgIGNsX2N2X2FzX25vZXhlY3N0YWNrPW5vCisgIGZpCisgIHJtIC1mIGNvbmZ0ZXN0Kl0pCisgIGlmIHRlc3QgIiRub2V4ZWNzdGFja19zdXBwb3J0IiA9IHllcyAtYSAiJGNsX2N2X2FzX25vZXhlY3N0YWNrIiA9IHllczsgdGhlbgorCU5PRVhFQ1NUQUNLX0ZMQUdTPSItV2EsLS1ub2V4ZWNzdGFjayIKKyAgZWxzZQorICAgICAgICBOT0VYRUNTVEFDS19GTEFHUz0KKyAgZmkKKyAgQUNfU1VCU1QoTk9FWEVDU1RBQ0tfRkxBR1MpCitdKQpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L200L29uY2Vvbmx5Lm00IGIvbGliZ2NyeXB0LTEuNC42L200L29uY2Vvbmx5Lm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkOTEzZmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbTQvb25jZW9ubHkubTQKQEAgLTAsMCArMSw2NiBAQAorIyBvbmNlb25seS5tNCBzZXJpYWwgNCAoZ2V0dGV4dC0wLjE1KQorZG5sIENvcHlyaWdodCAoQykgMjAwMi0yMDAzLCAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCitkbmwgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKK2RubCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKK2RubCBUaGlzIGZpbGUgZGVmaW5lcyBzb21lICJvbmNlIG9ubHkiIHZhcmlhbnRzIG9mIHN0YW5kYXJkIGF1dG9jb25mIG1hY3Jvcy4KK2RubCAgIEFDX0NIRUNLX0hFQURFUlNfT05DRSAgICAgICAgIGxpa2UgIEFDX0NIRUNLX0hFQURFUlMKK2RubCAgIEFDX0NIRUNLX0ZVTkNTX09OQ0UgICAgICAgICAgIGxpa2UgIEFDX0NIRUNLX0ZVTkNTCitkbmwgICBBQ19DSEVDS19ERUNMU19PTkNFICAgICAgICAgICBsaWtlICBBQ19DSEVDS19ERUNMUworZG5sICAgQUNfUkVRVUlSRShbQUNfSEVBREVSX1NURENdKSAgbGlrZSAgQUNfSEVBREVSX1NUREMKK2RubCBUaGUgYWR2YW50YWdlIGlzIHRoYXQgdGhlIGNoZWNrIGZvciBlYWNoIG9mIHRoZSBoZWFkZXJzL2Z1bmN0aW9ucy9kZWNscworZG5sIHdpbGwgYmUgcHV0IG9ubHkgb25jZSBpbnRvIHRoZSAnY29uZmlndXJlJyBmaWxlLiBJdCBrZWVwcyB0aGUgc2l6ZSBvZgorZG5sIHRoZSAnY29uZmlndXJlJyBmaWxlIGRvd24sIGFuZCBhdm9pZHMgcmVkdW5kYW50IG91dHB1dCB3aGVuICdjb25maWd1cmUnCitkbmwgaXMgcnVuLgorZG5sIFRoZSBkcmF3YmFjayBpcyB0aGF0IHRoZSBjaGVja3MgY2Fubm90IGJlIGNvbmRpdGlvbmFsaXplZC4gSWYgeW91IHdyaXRlCitkbmwgICBpZiBzb21lX2NvbmRpdGlvbjsgdGhlbiBnbF9DSEVDS19IRUFERVJTKHN0ZGxpYi5oKTsgZmkKK2RubCBpbnNpZGUgYW4gQUNfREVGVU5lZCBmdW5jdGlvbiwgdGhlIGdsX0NIRUNLX0hFQURFUlMgbWFjcm8gY2FsbCBleHBhbmRzIHRvCitkbmwgZW1wdHksIGFuZCB0aGUgY2hlY2sgd2lsbCBiZSBpbnNlcnRlZCBiZWZvcmUgdGhlIGJvZHkgb2YgdGhlIEFDX0RFRlVOZWQKK2RubCBmdW5jdGlvbi4KKworZG5sIFRoaXMgZmlsZSBpcyBvbmx5IG5lZWRlZCBpbiBhdXRvY29uZiA8PSAyLjU5LiAgTmV3ZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYKK2RubCBoYXZlIHRoaXMgbWFjcm8gYnVpbHQtaW4uICBCdXQgYWJvdXQgQUNfQ0hFQ0tfREVDTFNfT05DRTogbm90ZSB0aGF0IGluCitkbmwgYXV0b2NvbmYgPj0gMi42MCB0aGUgc3ltYm9sIHNlcGFyYXRvciBpcyBhIGNvbW1hLCB3aGVyZWFzIGhlcmUgaXQgaXMKK2RubCB3aGl0ZXNwYWNlLgorCitkbmwgQXV0b2NvbmYgdmVyc2lvbiAyLjU3IG9yIG5ld2VyIGlzIHJlY29tbWVuZGVkLgorQUNfUFJFUkVRKDIuNTQpCisKKyMgQUNfQ0hFQ0tfSEVBREVSU19PTkNFKEhFQURFUjEgSEVBREVSMiAuLi4pIGlzIGEgb25jZS1vbmx5IHZhcmlhbnQgb2YKKyMgQUNfQ0hFQ0tfSEVBREVSUyhIRUFERVIxIEhFQURFUjIgLi4uKS4KK0FDX0RFRlVOKFtBQ19DSEVDS19IRUFERVJTX09OQ0VdLCBbCisgIDoKKyAgQUNfRk9SRUFDSChbZ2xfSEVBREVSX05BTUVdLCBbJDFdLCBbCisgICAgQUNfREVGVU4oW2dsX0NIRUNLX0hFQURFUl9dbTRfcXVvdGUodHJhbnNsaXQobTRfZGVmbihbZ2xfSEVBREVSX05BTUVdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbLS4vXSwgW19fX10pKSwgWworICAgICAgQUNfQ0hFQ0tfSEVBREVSUyhnbF9IRUFERVJfTkFNRSkKKyAgICBdKQorICAgIEFDX1JFUVVJUkUoW2dsX0NIRUNLX0hFQURFUl9dbTRfcXVvdGUodHJhbnNsaXQoZ2xfSEVBREVSX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbLS4vXSwgW19fX10pKSkKKyAgXSkKK10pCisKKyMgQUNfQ0hFQ0tfRlVOQ1NfT05DRShGVU5DMSBGVU5DMiAuLi4pIGlzIGEgb25jZS1vbmx5IHZhcmlhbnQgb2YKKyMgQUNfQ0hFQ0tfRlVOQ1MoRlVOQzEgRlVOQzIgLi4uKS4KK0FDX0RFRlVOKFtBQ19DSEVDS19GVU5DU19PTkNFXSwgWworICA6CisgIEFDX0ZPUkVBQ0goW2dsX0ZVTkNfTkFNRV0sIFskMV0sIFsKKyAgICBBQ19ERUZVTihbZ2xfQ0hFQ0tfRlVOQ19dbTRfZGVmbihbZ2xfRlVOQ19OQU1FXSksIFsKKyAgICAgIEFDX0NIRUNLX0ZVTkNTKG00X2RlZm4oW2dsX0ZVTkNfTkFNRV0pKQorICAgIF0pCisgICAgQUNfUkVRVUlSRShbZ2xfQ0hFQ0tfRlVOQ19dbTRfZGVmbihbZ2xfRlVOQ19OQU1FXSkpCisgIF0pCitdKQorCisjIEFDX0NIRUNLX0RFQ0xTX09OQ0UoREVDTDEgREVDTDIgLi4uKSBpcyBhIG9uY2Utb25seSB2YXJpYW50IG9mCisjIEFDX0NIRUNLX0RFQ0xTKERFQ0wxLCBERUNMMiwgLi4uKS4KK0FDX0RFRlVOKFtBQ19DSEVDS19ERUNMU19PTkNFXSwgWworICA6CisgIEFDX0ZPUkVBQ0goW2dsX0RFQ0xfTkFNRV0sIFskMV0sIFsKKyAgICBBQ19ERUZVTihbZ2xfQ0hFQ0tfREVDTF9dbTRfZGVmbihbZ2xfREVDTF9OQU1FXSksIFsKKyAgICAgIEFDX0NIRUNLX0RFQ0xTKG00X2RlZm4oW2dsX0RFQ0xfTkFNRV0pKQorICAgIF0pCisgICAgQUNfUkVRVUlSRShbZ2xfQ0hFQ0tfREVDTF9dbTRfZGVmbihbZ2xfREVDTF9OQU1FXSkpCisgIF0pCitdKQpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L200L3NvY2tsZW4ubTQgYi9saWJnY3J5cHQtMS40LjYvbTQvc29ja2xlbi5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTM3NjVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L200L3NvY2tsZW4ubTQKQEAgLTAsMCArMSw1MiBAQAorIyBzb2NrbGVuLm00IHNlcmlhbCA0CitkbmwgQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCitkbmwgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKK2RubCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKK2RubCBGcm9tIEFsYmVydCBDaGluLCBXaW5kb3dzIGZpeGVzIGZyb20gU2ltb24gSm9zZWZzc29uLgorCitkbmwgQ2hlY2sgZm9yIHNvY2tsZW5fdDogaGlzdG9yaWNhbGx5IG9uIEJTRCBpdCBpcyBhbiBpbnQsIGFuZCBpbgorZG5sIFBPU0lYIDFnIGl0IGlzIGEgdHlwZSBvZiBpdHMgb3duLCBidXQgc29tZSBwbGF0Zm9ybXMgdXNlIGRpZmZlcmVudAorZG5sIHR5cGVzIGZvciB0aGUgYXJndW1lbnQgdG8gZ2V0c29ja29wdCwgZ2V0cGVlcm5hbWUsIGV0Yy4gIFNvIHdlCitkbmwgaGF2ZSB0byB0ZXN0IHRvIGZpbmQgc29tZXRoaW5nIHRoYXQgd2lsbCB3b3JrLgorCitkbmwgT24gbWluZ3czMiwgc29ja2xlbl90IGlzIGluIHdzMnRjcGlwLmggKCdpbnQnKSwgc28gd2UgdHJ5IHRvIGZpbmQKK2RubCBpdCB0aGVyZSBmaXJzdC4gIFRoYXQgZmlsZSBpcyBpbmNsdWRlZCBieSBnbnVsaWIncyBzb2NrZXRfLmgsIHdoaWNoCitkbmwgYWxsIHVzZXJzIG9mIHRoaXMgbW9kdWxlIHNob3VsZCBpbmNsdWRlLiAgQ3lnd2luIG11c3Qgbm90IGluY2x1ZGUKK2RubCB3czJ0Y3BpcC5oLgorQUNfREVGVU4oW2dsX1RZUEVfU09DS0xFTl9UXSwKKyAgW0FDX1JFUVVJUkUoW2dsX0hFQURFUl9TWVNfU09DS0VUXSlkbmwKKyAgIEFDX0NIRUNLX1RZUEUoW3NvY2tsZW5fdF0sICwKKyAgICAgW0FDX01TR19DSEVDS0lORyhbZm9yIHNvY2tsZW5fdCBlcXVpdmFsZW50XSkKKyAgICAgIEFDX0NBQ0hFX1ZBTChbZ2xfY3ZfZ2xfY3Zfc29ja2xlbl90X2VxdWl2XSwKKwlbIyBTeXN0ZW1zIGhhdmUgZWl0aGVyICJzdHJ1Y3Qgc29ja2FkZHIgKiIgb3IKKwkgIyAidm9pZCAqIiBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGdldHBlZXJuYW1lCisJIGdsX2N2X3NvY2tsZW5fdF9lcXVpdj0KKwkgZm9yIGFyZzIgaW4gInN0cnVjdCBzb2NrYWRkciIgdm9pZDsgZG8KKwkgICBmb3IgdCBpbiBpbnQgc2l6ZV90ICJ1bnNpZ25lZCBpbnQiICJsb25nIGludCIgInVuc2lnbmVkIGxvbmcgaW50IjsgZG8KKwkgICAgIEFDX1RSWV9DT01QSUxFKAorCSAgICAgICBbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCQkjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCisJCWludCBnZXRwZWVybmFtZSAoaW50LCAkYXJnMiAqLCAkdCAqKTtdLAorCSAgICAgICBbJHQgbGVuOworCQlnZXRwZWVybmFtZSAoMCwgMCwgJmxlbik7XSwKKwkgICAgICAgW2dsX2N2X3NvY2tsZW5fdF9lcXVpdj0iJHQiXSkKKwkgICAgIHRlc3QgIiRnbF9jdl9zb2NrbGVuX3RfZXF1aXYiICE9ICIiICYmIGJyZWFrCisJICAgZG9uZQorCSAgIHRlc3QgIiRnbF9jdl9zb2NrbGVuX3RfZXF1aXYiICE9ICIiICYmIGJyZWFrCisJIGRvbmUKKyAgICAgIF0pCisgICAgICBpZiB0ZXN0ICIkZ2xfY3Zfc29ja2xlbl90X2VxdWl2IiA9ICIiOyB0aGVuCisJQUNfTVNHX0VSUk9SKFtDYW5ub3QgZmluZCBhIHR5cGUgdG8gdXNlIGluIHBsYWNlIG9mIHNvY2tsZW5fdF0pCisgICAgICBmaQorICAgICAgQUNfTVNHX1JFU1VMVChbJGdsX2N2X3NvY2tsZW5fdF9lcXVpdl0pCisgICAgICBBQ19ERUZJTkVfVU5RVU9URUQoW3NvY2tsZW5fdF0sIFskZ2xfY3Zfc29ja2xlbl90X2VxdWl2XSwKKwlbdHlwZSB0byB1c2UgaW4gcGxhY2Ugb2Ygc29ja2xlbl90IGlmIG5vdCBkZWZpbmVkXSldLAorICAgICBbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorICAgICAgI2lmIEhBVkVfU1lTX1NPQ0tFVF9ICisgICAgICAjIGluY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyAgICAgICNlbGlmIEhBVkVfV1MyVENQSVBfSAorICAgICAgIyBpbmNsdWRlIDx3czJ0Y3BpcC5oPgorICAgICAgI2VuZGlmXSldKQpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L200L3N5c19zb2NrZXRfaC5tNCBiL2xpYmdjcnlwdC0xLjQuNi9tNC9zeXNfc29ja2V0X2gubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNlNDViNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tNC9zeXNfc29ja2V0X2gubTQKQEAgLTAsMCArMSwyMyBAQAorIyBzeXNfc29ja2V0X2gubTQgc2VyaWFsIDIKK2RubCBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KK2RubCBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorZG5sIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworZG5sIEZyb20gU2ltb24gSm9zZWZzc29uLgorCitBQ19ERUZVTihbZ2xfSEVBREVSX1NZU19TT0NLRVRdLAorWworICBBQ19DSEVDS19IRUFERVJTX09OQ0UoW3N5cy9zb2NrZXQuaF0pCisgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zeXNfc29ja2V0X2ggPSB5ZXM7IHRoZW4KKyAgICBTWVNfU09DS0VUX0g9JycKKyAgZWxzZQorICAgIGRubCBXZSBjYW5ub3QgdXNlIEFDX0NIRUNLX0hFQURFUlNfT05DRSBoZXJlLCBiZWNhdXNlIHRoYXQgd291bGQgbWFrZQorICAgIGRubCB0aGUgY2hlY2sgZm9yIHRob3NlIGhlYWRlcnMgdW5jb25kaXRpb25hbDsgeWV0IGN5Z3dpbiByZXBvcnRzCisgICAgZG5sIHRoYXQgdGhlIGhlYWRlcnMgYXJlIHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCAoc2luY2Ugb24KKyAgICBkbmwgY3lnd2luLCBhbGwgc29ja2V0IGluZm9ybWF0aW9uIHNob3VsZCBjb21lIGZyb20gc3lzL3NvY2tldC5oKS4KKyAgICBBQ19DSEVDS19IRUFERVJTKFt3aW5zb2NrMi5oIHdzMnRjcGlwLmhdKQorICAgIFNZU19TT0NLRVRfSD0nc3lzL3NvY2tldC5oJworICBmaQorICBBQ19TVUJTVChTWVNfU09DS0VUX0gpCitdKQpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21pc3NpbmcgYi9saWJnY3J5cHQtMS40LjYvbWlzc2luZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44OTRlNzg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21pc3NpbmcKQEAgLTAsMCArMSwzNjAgQEAKKyMhIC9iaW4vc2gKKyMgQ29tbW9uIHN0dWIgZm9yIGEgZmV3IG1pc3NpbmcgR05VIHByb2dyYW1zIHdoaWxlIGluc3RhbGxpbmcuCisKK3NjcmlwdHZlcnNpb249MjAwNS0wNi0wOC4yMQorCisjIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OSwgMjAwMCwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNQorIyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBPcmlnaW5hbGx5IGJ5IEZyYW4sY29pcyBQaW5hcmQgPHBpbmFyZEBpcm8udW1vbnRyZWFsLmNhPiwgMTk5Ni4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjIGFueSBsYXRlciB2ZXJzaW9uLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorIyAwMjExMC0xMzAxLCBVU0EuCisKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCitpZiB0ZXN0ICQjIC1lcSAwOyB0aGVuCisgIGVjaG8gMT4mMiAiVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiIKKyAgZXhpdCAxCitmaQorCitydW49OgorCisjIEluIHRoZSBjYXNlcyB3aGVyZSB0aGlzIG1hdHRlcnMsIGBtaXNzaW5nJyBpcyBiZWluZyBydW4gaW4gdGhlCisjIHNyY2RpciBhbHJlYWR5LgoraWYgdGVzdCAtZiBjb25maWd1cmUuYWM7IHRoZW4KKyAgY29uZmlndXJlX2FjPWNvbmZpZ3VyZS5hYworZWxzZQorICBjb25maWd1cmVfYWM9Y29uZmlndXJlLmluCitmaQorCittc2c9Im1pc3Npbmcgb24geW91ciBzeXN0ZW0iCisKK2Nhc2UgIiQxIiBpbgorLS1ydW4pCisgICMgVHJ5IHRvIHJ1biByZXF1ZXN0ZWQgcHJvZ3JhbSwgYW5kIGp1c3QgZXhpdCBpZiBpdCBzdWNjZWVkcy4KKyAgcnVuPQorICBzaGlmdAorICAiJEAiICYmIGV4aXQgMAorICAjIEV4aXQgY29kZSA2MyBtZWFucyB2ZXJzaW9uIG1pc21hdGNoLiAgVGhpcyBvZnRlbiBoYXBwZW5zCisgICMgd2hlbiB0aGUgdXNlciB0cnkgdG8gdXNlIGFuIGFuY2llbnQgdmVyc2lvbiBvZiBhIHRvb2wgb24KKyAgIyBhIGZpbGUgdGhhdCByZXF1aXJlcyBhIG1pbmltdW0gdmVyc2lvbi4gIEluIHRoaXMgY2FzZSB3ZQorICAjIHdlIHNob3VsZCBwcm9jZWVkIGhhcyBpZiB0aGUgcHJvZ3JhbSBoYWQgYmVlbiBhYnNlbnQsIG9yCisgICMgaWYgLS1ydW4gaGFkbid0IGJlZW4gcGFzc2VkLgorICBpZiB0ZXN0ICQ/ID0gNjM7IHRoZW4KKyAgICBydW49OgorICAgIG1zZz0icHJvYmFibHkgdG9vIG9sZCIKKyAgZmkKKyAgOzsKKworICAtaHwtLWh8LS1oZXwtLWhlbHwtLWhlbHApCisgICAgZWNobyAiXAorJDAgW09QVElPTl0uLi4gUFJPR1JBTSBbQVJHVU1FTlRdLi4uCisKK0hhbmRsZSBcYFBST0dSQU0gW0FSR1VNRU5UXS4uLicgZm9yIHdoZW4gUFJPR1JBTSBpcyBtaXNzaW5nLCBvciByZXR1cm4gYW4KK2Vycm9yIHN0YXR1cyBpZiB0aGVyZSBpcyBubyBrbm93biBoYW5kbGluZyBmb3IgUFJPR1JBTS4KKworT3B0aW9uczoKKyAgLWgsIC0taGVscCAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0CisgIC12LCAtLXZlcnNpb24gICBvdXRwdXQgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAorICAtLXJ1biAgICAgICAgICAgdHJ5IHRvIHJ1biB0aGUgZ2l2ZW4gY29tbWFuZCwgYW5kIGVtdWxhdGUgaXQgaWYgaXQgZmFpbHMKKworU3VwcG9ydGVkIFBST0dSQU0gdmFsdWVzOgorICBhY2xvY2FsICAgICAgdG91Y2ggZmlsZSBcYGFjbG9jYWwubTQnCisgIGF1dG9jb25mICAgICB0b3VjaCBmaWxlIFxgY29uZmlndXJlJworICBhdXRvaGVhZGVyICAgdG91Y2ggZmlsZSBcYGNvbmZpZy5oLmluJworICBhdXRvbWFrZSAgICAgdG91Y2ggYWxsIFxgTWFrZWZpbGUuaW4nIGZpbGVzCisgIGJpc29uICAgICAgICBjcmVhdGUgXGB5LnRhYi5bY2hdJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLltjaF0KKyAgZmxleCAgICAgICAgIGNyZWF0ZSBcYGxleC55eS5jJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLmMKKyAgaGVscDJtYW4gICAgIHRvdWNoIHRoZSBvdXRwdXQgZmlsZQorICBsZXggICAgICAgICAgY3JlYXRlIFxgbGV4Lnl5LmMnLCBpZiBwb3NzaWJsZSwgZnJvbSBleGlzdGluZyAuYworICBtYWtlaW5mbyAgICAgdG91Y2ggdGhlIG91dHB1dCBmaWxlCisgIHRhciAgICAgICAgICB0cnkgdGFyLCBnbnV0YXIsIGd0YXIsIHRoZW4gdGFyIHdpdGhvdXQgbm9uLXBvcnRhYmxlIGZsYWdzCisgIHlhY2MgICAgICAgICBjcmVhdGUgXGB5LnRhYi5bY2hdJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLltjaF0KKworU2VuZCBidWcgcmVwb3J0cyB0byA8YnVnLWF1dG9tYWtlQGdudS5vcmc+LiIKKyAgICBleGl0ICQ/CisgICAgOzsKKworICAtdnwtLXZ8LS12ZXwtLXZlcnwtLXZlcnN8LS12ZXJzaXwtLXZlcnNpb3wtLXZlcnNpb24pCisgICAgZWNobyAibWlzc2luZyAkc2NyaXB0dmVyc2lvbiAoR05VIEF1dG9tYWtlKSIKKyAgICBleGl0ICQ/CisgICAgOzsKKworICAtKikKKyAgICBlY2hvIDE+JjIgIiQwOiBVbmtub3duIFxgJDEnIG9wdGlvbiIKKyAgICBlY2hvIDE+JjIgIlRyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24iCisgICAgZXhpdCAxCisgICAgOzsKKworZXNhYworCisjIE5vdyBleGl0IGlmIHdlIGhhdmUgaXQsIGJ1dCBpdCBmYWlsZWQuICBBbHNvIGV4aXQgbm93IGlmIHdlCisjIGRvbid0IGhhdmUgaXQgYW5kIC0tdmVyc2lvbiB3YXMgcGFzc2VkIChtb3N0IGxpa2VseSB0byBkZXRlY3QKKyMgdGhlIHByb2dyYW0pLgorY2FzZSAiJDEiIGluCisgIGxleHx5YWNjKQorICAgICMgTm90IEdOVSBwcm9ncmFtcywgdGhleSBkb24ndCBoYXZlIC0tdmVyc2lvbi4KKyAgICA7OworCisgIHRhcikKKyAgICBpZiB0ZXN0IC1uICIkcnVuIjsgdGhlbgorICAgICAgIGVjaG8gMT4mMiAiRVJST1I6IFxgdGFyJyByZXF1aXJlcyAtLXJ1biIKKyAgICAgICBleGl0IDEKKyAgICBlbGlmIHRlc3QgIngkMiIgPSAieC0tdmVyc2lvbiIgfHwgdGVzdCAieCQyIiA9ICJ4LS1oZWxwIjsgdGhlbgorICAgICAgIGV4aXQgMQorICAgIGZpCisgICAgOzsKKworICAqKQorICAgIGlmIHRlc3QgLXogIiRydW4iICYmICgkMSAtLXZlcnNpb24pID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgICAjIFdlIGhhdmUgaXQsIGJ1dCBpdCBmYWlsZWQuCisgICAgICAgZXhpdCAxCisgICAgZWxpZiB0ZXN0ICJ4JDIiID0gIngtLXZlcnNpb24iIHx8IHRlc3QgIngkMiIgPSAieC0taGVscCI7IHRoZW4KKyAgICAgICAjIENvdWxkIG5vdCBydW4gLS12ZXJzaW9uIG9yIC0taGVscC4gIFRoaXMgaXMgcHJvYmFibHkgc29tZW9uZQorICAgICAgICMgcnVubmluZyBgJFRPT0wgLS12ZXJzaW9uJyBvciBgJFRPT0wgLS1oZWxwJyB0byBjaGVjayB3aGV0aGVyCisgICAgICAgIyAkVE9PTCBleGlzdHMgYW5kIG5vdCBrbm93aW5nICRUT09MIHVzZXMgbWlzc2luZy4KKyAgICAgICBleGl0IDEKKyAgICBmaQorICAgIDs7Citlc2FjCisKKyMgSWYgaXQgZG9lcyBub3QgZXhpc3QsIG9yIGZhaWxzIHRvIHJ1biAocG9zc2libHkgYW4gb3V0ZGF0ZWQgdmVyc2lvbiksCisjIHRyeSB0byBlbXVsYXRlIGl0LgorY2FzZSAiJDEiIGluCisgIGFjbG9jYWwqKQorICAgIGVjaG8gMT4mMiAiXAorV0FSTklORzogXGAkMScgaXMgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCisgICAgICAgICB5b3UgbW9kaWZpZWQgXGBhY2luY2x1ZGUubTQnIG9yIFxgJHtjb25maWd1cmVfYWN9Jy4gIFlvdSBtaWdodCB3YW50CisgICAgICAgICB0byBpbnN0YWxsIHRoZSBcYEF1dG9tYWtlJyBhbmQgXGBQZXJsJyBwYWNrYWdlcy4gIEdyYWIgdGhlbSBmcm9tCisgICAgICAgICBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCisgICAgdG91Y2ggYWNsb2NhbC5tNAorICAgIDs7CisKKyAgYXV0b2NvbmYpCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKKyAgICAgICAgIHlvdSBtb2RpZmllZCBcYCR7Y29uZmlndXJlX2FjfScuICBZb3UgbWlnaHQgd2FudCB0byBpbnN0YWxsIHRoZQorICAgICAgICAgXGBBdXRvY29uZicgYW5kIFxgR05VIG00JyBwYWNrYWdlcy4gIEdyYWIgdGhlbSBmcm9tIGFueSBHTlUKKyAgICAgICAgIGFyY2hpdmUgc2l0ZS4iCisgICAgdG91Y2ggY29uZmlndXJlCisgICAgOzsKKworICBhdXRvaGVhZGVyKQorICAgIGVjaG8gMT4mMiAiXAorV0FSTklORzogXGAkMScgaXMgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCisgICAgICAgICB5b3UgbW9kaWZpZWQgXGBhY2NvbmZpZy5oJyBvciBcYCR7Y29uZmlndXJlX2FjfScuICBZb3UgbWlnaHQgd2FudAorICAgICAgICAgdG8gaW5zdGFsbCB0aGUgXGBBdXRvY29uZicgYW5kIFxgR05VIG00JyBwYWNrYWdlcy4gIEdyYWIgdGhlbQorICAgICAgICAgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCisgICAgZmlsZXM9YHNlZCAtbiAncy9eWyBdKkFbQ01dX0NPTkZJR19IRUFERVIoXChbXildKlwpKS4qL1wxL3AnICR7Y29uZmlndXJlX2FjfWAKKyAgICB0ZXN0IC16ICIkZmlsZXMiICYmIGZpbGVzPSJjb25maWcuaCIKKyAgICB0b3VjaF9maWxlcz0KKyAgICBmb3IgZiBpbiAkZmlsZXM7IGRvCisgICAgICBjYXNlICIkZiIgaW4KKyAgICAgICo6KikgdG91Y2hfZmlsZXM9IiR0b3VjaF9maWxlcyAiYGVjaG8gIiRmIiB8CisJCQkJICAgICAgIHNlZCAtZSAncy9eW146XSo6Ly8nIC1lICdzLzouKi8vJ2A7OworICAgICAgKikgdG91Y2hfZmlsZXM9IiR0b3VjaF9maWxlcyAkZi5pbiI7OworICAgICAgZXNhYworICAgIGRvbmUKKyAgICB0b3VjaCAkdG91Y2hfZmlsZXMKKyAgICA7OworCisgIGF1dG9tYWtlKikKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgorICAgICAgICAgeW91IG1vZGlmaWVkIFxgTWFrZWZpbGUuYW0nLCBcYGFjaW5jbHVkZS5tNCcgb3IgXGAke2NvbmZpZ3VyZV9hY30nLgorICAgICAgICAgWW91IG1pZ2h0IHdhbnQgdG8gaW5zdGFsbCB0aGUgXGBBdXRvbWFrZScgYW5kIFxgUGVybCcgcGFja2FnZXMuCisgICAgICAgICBHcmFiIHRoZW0gZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCisgICAgZmluZCAuIC10eXBlIGYgLW5hbWUgTWFrZWZpbGUuYW0gLXByaW50IHwKKwkgICBzZWQgJ3MvXC5hbSQvLmluLycgfAorCSAgIHdoaWxlIHJlYWQgZjsgZG8gdG91Y2ggIiRmIjsgZG9uZQorICAgIDs7CisKKyAgYXV0b200dGUpCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyBuZWVkZWQsIGJ1dCBpcyAkbXNnLgorICAgICAgICAgWW91IG1pZ2h0IGhhdmUgbW9kaWZpZWQgc29tZSBmaWxlcyB3aXRob3V0IGhhdmluZyB0aGUKKyAgICAgICAgIHByb3BlciB0b29scyBmb3IgZnVydGhlciBoYW5kbGluZyB0aGVtLgorICAgICAgICAgWW91IGNhbiBnZXQgXGAkMScgYXMgcGFydCBvZiBcYEF1dG9jb25mJyBmcm9tIGFueSBHTlUKKyAgICAgICAgIGFyY2hpdmUgc2l0ZS4iCisKKyAgICBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gJ3MvLiotLW91dHB1dFsgPV0qXChbXiBdKlwpLiovXDEvcCdgCisgICAgdGVzdCAteiAiJGZpbGUiICYmIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAncy8uKi1vWyBdKlwoW14gXSpcKS4qL1wxL3AnYAorICAgIGlmIHRlc3QgLWYgIiRmaWxlIjsgdGhlbgorCXRvdWNoICRmaWxlCisgICAgZWxzZQorCXRlc3QgLXogIiRmaWxlIiB8fCBleGVjID4kZmlsZQorCWVjaG8gIiMhIC9iaW4vc2giCisJZWNobyAiIyBDcmVhdGVkIGJ5IEdOVSBBdXRvbWFrZSBtaXNzaW5nIGFzIGEgcmVwbGFjZW1lbnQgb2YiCisJZWNobyAiIyAgJCAkQCIKKwllY2hvICJleGl0IDAiCisJY2htb2QgK3ggJGZpbGUKKwlleGl0IDEKKyAgICBmaQorICAgIDs7CisKKyAgYmlzb258eWFjYykKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgorICAgICAgICAgeW91IG1vZGlmaWVkIGEgXGAueScgZmlsZS4gIFlvdSBtYXkgbmVlZCB0aGUgXGBCaXNvbicgcGFja2FnZQorICAgICAgICAgaW4gb3JkZXIgZm9yIHRob3NlIG1vZGlmaWNhdGlvbnMgdG8gdGFrZSBlZmZlY3QuICBZb3UgY2FuIGdldAorICAgICAgICAgXGBCaXNvbicgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCisgICAgcm0gLWYgeS50YWIuYyB5LnRhYi5oCisgICAgaWYgWyAkIyAtbmUgMSBdOyB0aGVuCisgICAgICAgIGV2YWwgTEFTVEFSRz0iXCR7JCN9IgorCWNhc2UgIiRMQVNUQVJHIiBpbgorCSoueSkKKwkgICAgU1JDRklMRT1gZWNobyAiJExBU1RBUkciIHwgc2VkICdzL3kkL2MvJ2AKKwkgICAgaWYgWyAtZiAiJFNSQ0ZJTEUiIF07IHRoZW4KKwkgICAgICAgICBjcCAiJFNSQ0ZJTEUiIHkudGFiLmMKKwkgICAgZmkKKwkgICAgU1JDRklMRT1gZWNobyAiJExBU1RBUkciIHwgc2VkICdzL3kkL2gvJ2AKKwkgICAgaWYgWyAtZiAiJFNSQ0ZJTEUiIF07IHRoZW4KKwkgICAgICAgICBjcCAiJFNSQ0ZJTEUiIHkudGFiLmgKKwkgICAgZmkKKwkgIDs7CisJZXNhYworICAgIGZpCisgICAgaWYgWyAhIC1mIHkudGFiLmggXTsgdGhlbgorCWVjaG8gPnkudGFiLmgKKyAgICBmaQorICAgIGlmIFsgISAtZiB5LnRhYi5jIF07IHRoZW4KKwllY2hvICdtYWluKCkgeyByZXR1cm4gMDsgfScgPnkudGFiLmMKKyAgICBmaQorICAgIDs7CisKKyAgbGV4fGZsZXgpCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKKyAgICAgICAgIHlvdSBtb2RpZmllZCBhIFxgLmwnIGZpbGUuICBZb3UgbWF5IG5lZWQgdGhlIFxgRmxleCcgcGFja2FnZQorICAgICAgICAgaW4gb3JkZXIgZm9yIHRob3NlIG1vZGlmaWNhdGlvbnMgdG8gdGFrZSBlZmZlY3QuICBZb3UgY2FuIGdldAorICAgICAgICAgXGBGbGV4JyBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKyAgICBybSAtZiBsZXgueXkuYworICAgIGlmIFsgJCMgLW5lIDEgXTsgdGhlbgorICAgICAgICBldmFsIExBU1RBUkc9IlwkeyQjfSIKKwljYXNlICIkTEFTVEFSRyIgaW4KKwkqLmwpCisJICAgIFNSQ0ZJTEU9YGVjaG8gIiRMQVNUQVJHIiB8IHNlZCAncy9sJC9jLydgCisJICAgIGlmIFsgLWYgIiRTUkNGSUxFIiBdOyB0aGVuCisJICAgICAgICAgY3AgIiRTUkNGSUxFIiBsZXgueXkuYworCSAgICBmaQorCSAgOzsKKwllc2FjCisgICAgZmkKKyAgICBpZiBbICEgLWYgbGV4Lnl5LmMgXTsgdGhlbgorCWVjaG8gJ21haW4oKSB7IHJldHVybiAwOyB9JyA+bGV4Lnl5LmMKKyAgICBmaQorICAgIDs7CisKKyAgaGVscDJtYW4pCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKKwkgeW91IG1vZGlmaWVkIGEgZGVwZW5kZW5jeSBvZiBhIG1hbnVhbCBwYWdlLiAgWW91IG1heSBuZWVkIHRoZQorCSBcYEhlbHAybWFuJyBwYWNrYWdlIGluIG9yZGVyIGZvciB0aG9zZSBtb2RpZmljYXRpb25zIHRvIHRha2UKKwkgZWZmZWN0LiAgWW91IGNhbiBnZXQgXGBIZWxwMm1hbicgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCisKKyAgICBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gJ3MvLiotbyBcKFteIF0qXCkuKi9cMS9wJ2AKKyAgICBpZiB0ZXN0IC16ICIkZmlsZSI7IHRoZW4KKwlmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gJ3MvLiotLW91dHB1dD1cKFteIF0qXCkuKi9cMS9wJ2AKKyAgICBmaQorICAgIGlmIFsgLWYgIiRmaWxlIiBdOyB0aGVuCisJdG91Y2ggJGZpbGUKKyAgICBlbHNlCisJdGVzdCAteiAiJGZpbGUiIHx8IGV4ZWMgPiRmaWxlCisJZWNobyAiLmFiIGhlbHAybWFuIGlzIHJlcXVpcmVkIHRvIGdlbmVyYXRlIHRoaXMgcGFnZSIKKwlleGl0IDEKKyAgICBmaQorICAgIDs7CisKKyAgbWFrZWluZm8pCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKKyAgICAgICAgIHlvdSBtb2RpZmllZCBhIFxgLnRleGknIG9yIFxgLnRleGluZm8nIGZpbGUsIG9yIGFueSBvdGhlciBmaWxlCisgICAgICAgICBpbmRpcmVjdGx5IGFmZmVjdGluZyB0aGUgYXNwZWN0IG9mIHRoZSBtYW51YWwuICBUaGUgc3B1cmlvdXMKKyAgICAgICAgIGNhbGwgbWlnaHQgYWxzbyBiZSB0aGUgY29uc2VxdWVuY2Ugb2YgdXNpbmcgYSBidWdneSBcYG1ha2UnIChBSVgsCisgICAgICAgICBEVSwgSVJJWCkuICBZb3UgbWlnaHQgd2FudCB0byBpbnN0YWxsIHRoZSBcYFRleGluZm8nIHBhY2thZ2Ugb3IKKyAgICAgICAgIHRoZSBcYEdOVSBtYWtlJyBwYWNrYWdlLiAgR3JhYiBlaXRoZXIgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCisgICAgIyBUaGUgZmlsZSB0byB0b3VjaCBpcyB0aGF0IHNwZWNpZmllZCB3aXRoIC1vIC4uLgorICAgIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAncy8uKi1vIFwoW14gXSpcKS4qL1wxL3AnYAorICAgIGlmIHRlc3QgLXogIiRmaWxlIjsgdGhlbgorICAgICAgIyAuLi4gb3IgaXQgaXMgdGhlIG9uZSBzcGVjaWZpZWQgd2l0aCBAc2V0ZmlsZW5hbWUgLi4uCisgICAgICBpbmZpbGU9YGVjaG8gIiQqIiB8IHNlZCAncy8uKiBcKFteIF0qXCkgKiQvXDEvJ2AKKyAgICAgIGZpbGU9YHNlZCAtbiAnL15Ac2V0ZmlsZW5hbWUvIHsgcy8uKiBcKFteIF0qXCkgKiQvXDEvOyBwOyBxOyB9JyAkaW5maWxlYAorICAgICAgIyAuLi4gb3IgaXQgaXMgZGVyaXZlZCBmcm9tIHRoZSBzb3VyY2UgbmFtZSAoZGlyL2YudGV4aSBiZWNvbWVzIGYuaW5mbykKKyAgICAgIHRlc3QgLXogIiRmaWxlIiAmJiBmaWxlPWBlY2hvICIkaW5maWxlIiB8IHNlZCAncywuKi8sLDtzLC5bXi5dKiQsLCdgLmluZm8KKyAgICBmaQorICAgICMgSWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QsIHRoZSB1c2VyIHJlYWxseSBuZWVkcyBtYWtlaW5mbzsKKyAgICAjIGxldCdzIGZhaWwgd2l0aG91dCB0b3VjaGluZyBhbnl0aGluZy4KKyAgICB0ZXN0IC1mICRmaWxlIHx8IGV4aXQgMQorICAgIHRvdWNoICRmaWxlCisgICAgOzsKKworICB0YXIpCisgICAgc2hpZnQKKworICAgICMgV2UgaGF2ZSBhbHJlYWR5IHRyaWVkIHRhciBpbiB0aGUgZ2VuZXJpYyBwYXJ0LgorICAgICMgTG9vayBmb3IgZ251dGFyL2d0YXIgYmVmb3JlIGludm9jYXRpb24gdG8gYXZvaWQgdWdseSBlcnJvcgorICAgICMgbWVzc2FnZXMuCisgICAgaWYgKGdudXRhciAtLXZlcnNpb24gPiAvZGV2L251bGwgMj4mMSk7IHRoZW4KKyAgICAgICBnbnV0YXIgIiRAIiAmJiBleGl0IDAKKyAgICBmaQorICAgIGlmIChndGFyIC0tdmVyc2lvbiA+IC9kZXYvbnVsbCAyPiYxKTsgdGhlbgorICAgICAgIGd0YXIgIiRAIiAmJiBleGl0IDAKKyAgICBmaQorICAgIGZpcnN0YXJnPSIkMSIKKyAgICBpZiBzaGlmdDsgdGhlbgorCWNhc2UgIiRmaXJzdGFyZyIgaW4KKwkqbyopCisJICAgIGZpcnN0YXJnPWBlY2hvICIkZmlyc3RhcmciIHwgc2VkIHMvby8vYAorCSAgICB0YXIgIiRmaXJzdGFyZyIgIiRAIiAmJiBleGl0IDAKKwkgICAgOzsKKwllc2FjCisJY2FzZSAiJGZpcnN0YXJnIiBpbgorCSpoKikKKwkgICAgZmlyc3Rhcmc9YGVjaG8gIiRmaXJzdGFyZyIgfCBzZWQgcy9oLy9gCisJICAgIHRhciAiJGZpcnN0YXJnIiAiJEAiICYmIGV4aXQgMAorCSAgICA7OworCWVzYWMKKyAgICBmaQorCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBJIGNhbid0IHNlZW0gdG8gYmUgYWJsZSB0byBydW4gXGB0YXInIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4KKyAgICAgICAgIFlvdSBtYXkgd2FudCB0byBpbnN0YWxsIEdOVSB0YXIgb3IgRnJlZSBwYXh1dGlscywgb3IgY2hlY2sgdGhlCisgICAgICAgICBjb21tYW5kIGxpbmUgYXJndW1lbnRzLiIKKyAgICBleGl0IDEKKyAgICA7OworCisgICopCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyBuZWVkZWQsIGFuZCBpcyAkbXNnLgorICAgICAgICAgWW91IG1pZ2h0IGhhdmUgbW9kaWZpZWQgc29tZSBmaWxlcyB3aXRob3V0IGhhdmluZyB0aGUKKyAgICAgICAgIHByb3BlciB0b29scyBmb3IgZnVydGhlciBoYW5kbGluZyB0aGVtLiAgQ2hlY2sgdGhlIFxgUkVBRE1FJyBmaWxlLAorICAgICAgICAgaXQgb2Z0ZW4gdGVsbHMgeW91IGFib3V0IHRoZSBuZWVkZWQgcHJlcmVxdWlzaXRlcyBmb3IgaW5zdGFsbGluZworICAgICAgICAgdGhpcyBwYWNrYWdlLiAgWW91IG1heSBhbHNvIHBlZWsgYXQgYW55IEdOVSBhcmNoaXZlIHNpdGUsIGluIGNhc2UKKyAgICAgICAgIHNvbWUgb3RoZXIgcGFja2FnZSB3b3VsZCBjb250YWluIHRoaXMgbWlzc2luZyBcYCQxJyBwcm9ncmFtLiIKKyAgICBleGl0IDEKKyAgICA7OworZXNhYworCitleGl0IDAKKworIyBMb2NhbCB2YXJpYWJsZXM6CisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKKyMgdGltZS1zdGFtcC1lbmQ6ICIkIgorIyBFbmQ6CmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbWtpbnN0YWxsZGlycyBiL2xpYmdjcnlwdC0xLjQuNi9ta2luc3RhbGxkaXJzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVmN2UxNmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbWtpbnN0YWxsZGlycwpAQCAtMCwwICsxLDE2MSBAQAorIyEgL2Jpbi9zaAorIyBta2luc3RhbGxkaXJzIC0tLSBtYWtlIGRpcmVjdG9yeSBoaWVyYXJjaHkKKworc2NyaXB0dmVyc2lvbj0yMDA2LTA1LTExLjE5CisKKyMgT3JpZ2luYWwgYXV0aG9yOiBOb2FoIEZyaWVkbWFuIDxmcmllZG1hbkBwcmVwLmFpLm1pdC5lZHU+CisjIENyZWF0ZWQ6IDE5OTMtMDUtMTYKKyMgUHVibGljIGRvbWFpbi4KKyMKKyMgVGhpcyBmaWxlIGlzIG1haW50YWluZWQgaW4gQXV0b21ha2UsIHBsZWFzZSByZXBvcnQKKyMgYnVncyB0byA8YnVnLWF1dG9tYWtlQGdudS5vcmc+IG9yIHNlbmQgcGF0Y2hlcyB0bworIyA8YXV0b21ha2UtcGF0Y2hlc0BnbnUub3JnPi4KKworbmw9JworJworSUZTPSIgIiIJJG5sIgorZXJyc3RhdHVzPTAKK2Rpcm1vZGU9CisKK3VzYWdlPSJcCitVc2FnZTogbWtpbnN0YWxsZGlycyBbLWhdIFstLWhlbHBdIFstLXZlcnNpb25dIFstbSBNT0RFXSBESVIgLi4uCisKK0NyZWF0ZSBlYWNoIGRpcmVjdG9yeSBESVIgKHdpdGggbW9kZSBNT0RFLCBpZiBzcGVjaWZpZWQpLCBpbmNsdWRpbmcgYWxsCitsZWFkaW5nIGZpbGUgbmFtZSBjb21wb25lbnRzLgorCitSZXBvcnQgYnVncyB0byA8YnVnLWF1dG9tYWtlQGdudS5vcmc+LiIKKworIyBwcm9jZXNzIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKK3doaWxlIHRlc3QgJCMgLWd0IDAgOyBkbworICBjYXNlICQxIGluCisgICAgLWggfCAtLWhlbHAgfCAtLWgqKSAgICAgICAgICMgLWggZm9yIGhlbHAKKyAgICAgIGVjaG8gIiR1c2FnZSIKKyAgICAgIGV4aXQgJD8KKyAgICAgIDs7CisgICAgLW0pICAgICAgICAgICAgICAgICAgICAgICAgICMgLW0gUEVSTSBhcmcKKyAgICAgIHNoaWZ0CisgICAgICB0ZXN0ICQjIC1lcSAwICYmIHsgZWNobyAiJHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KKyAgICAgIGRpcm1vZGU9JDEKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAgIC0tdmVyc2lvbikKKyAgICAgIGVjaG8gIiQwICRzY3JpcHR2ZXJzaW9uIgorICAgICAgZXhpdCAkPworICAgICAgOzsKKyAgICAtLSkgICAgICAgICAgICAgICAgICAgICAgICAgIyBzdG9wIG9wdGlvbiBwcm9jZXNzaW5nCisgICAgICBzaGlmdAorICAgICAgYnJlYWsKKyAgICAgIDs7CisgICAgLSopICAgICAgICAgICAgICAgICAgICAgICAgICMgdW5rbm93biBvcHRpb24KKyAgICAgIGVjaG8gIiR1c2FnZSIgMT4mMgorICAgICAgZXhpdCAxCisgICAgICA7OworICAgICopICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZpcnN0IG5vbi1vcHQgYXJnCisgICAgICBicmVhaworICAgICAgOzsKKyAgZXNhYworZG9uZQorCitmb3IgZmlsZQorZG8KKyAgaWYgdGVzdCAtZCAiJGZpbGUiOyB0aGVuCisgICAgc2hpZnQKKyAgZWxzZQorICAgIGJyZWFrCisgIGZpCitkb25lCisKK2Nhc2UgJCMgaW4KKyAgMCkgZXhpdCAwIDs7Citlc2FjCisKKyMgU29sYXJpcyA4J3MgbWtkaXIgLXAgaXNuJ3QgdGhyZWFkLXNhZmUuICBJZiB5b3UgbWtkaXIgLXAgYS9iIGFuZAorIyBta2RpciAtcCBhL2MgYXQgdGhlIHNhbWUgdGltZSwgYm90aCB3aWxsIGRldGVjdCB0aGF0IGEgaXMgbWlzc2luZywKKyMgb25lIHdpbGwgY3JlYXRlIGEsIHRoZW4gdGhlIG90aGVyIHdpbGwgdHJ5IHRvIGNyZWF0ZSBhIGFuZCBkaWUgd2l0aAorIyBhICJGaWxlIGV4aXN0cyIgZXJyb3IuICBUaGlzIGlzIGEgcHJvYmxlbSB3aGVuIGNhbGxpbmcgbWtpbnN0YWxsZGlycworIyBmcm9tIGEgcGFyYWxsZWwgbWFrZS4gIFdlIHVzZSAtLXZlcnNpb24gaW4gdGhlIHByb2JlIHRvIHJlc3RyaWN0CisjIG91cnNlbHZlcyB0byBHTlUgbWtkaXIsIHdoaWNoIGlzIHRocmVhZC1zYWZlLgorY2FzZSAkZGlybW9kZSBpbgorICAnJykKKyAgICBpZiBta2RpciAtcCAtLXZlcnNpb24gLiA+L2Rldi9udWxsIDI+JjEgJiYgdGVzdCAhIC1kIC4vLS12ZXJzaW9uOyB0aGVuCisgICAgICBlY2hvICJta2RpciAtcCAtLSAkKiIKKyAgICAgIGV4ZWMgbWtkaXIgLXAgLS0gIiRAIgorICAgIGVsc2UKKyAgICAgICMgT24gTmV4dFN0ZXAgYW5kIE9wZW5TdGVwLCB0aGUgYG1rZGlyJyBjb21tYW5kIGRvZXMgbm90CisgICAgICAjIHJlY29nbml6ZSBhbnkgb3B0aW9uLiAgSXQgd2lsbCBpbnRlcnByZXQgYWxsIG9wdGlvbnMgYXMKKyAgICAgICMgZGlyZWN0b3JpZXMgdG8gY3JlYXRlLCBhbmQgdGhlbiBhYm9ydCBiZWNhdXNlIGAuJyBhbHJlYWR5CisgICAgICAjIGV4aXN0cy4KKyAgICAgIHRlc3QgLWQgLi8tcCAmJiBybWRpciAuLy1wCisgICAgICB0ZXN0IC1kIC4vLS12ZXJzaW9uICYmIHJtZGlyIC4vLS12ZXJzaW9uCisgICAgZmkKKyAgICA7OworICAqKQorICAgIGlmIG1rZGlyIC1tICIkZGlybW9kZSIgLXAgLS12ZXJzaW9uIC4gPi9kZXYvbnVsbCAyPiYxICYmCisgICAgICAgdGVzdCAhIC1kIC4vLS12ZXJzaW9uOyB0aGVuCisgICAgICBlY2hvICJta2RpciAtbSAkZGlybW9kZSAtcCAtLSAkKiIKKyAgICAgIGV4ZWMgbWtkaXIgLW0gIiRkaXJtb2RlIiAtcCAtLSAiJEAiCisgICAgZWxzZQorICAgICAgIyBDbGVhbiB1cCBhZnRlciBOZXh0U3RlcCBhbmQgT3BlblN0ZXAgbWtkaXIuCisgICAgICBmb3IgZCBpbiAuLy1tIC4vLXAgLi8tLXZlcnNpb24gIi4vJGRpcm1vZGUiOworICAgICAgZG8KKyAgICAgICAgdGVzdCAtZCAkZCAmJiBybWRpciAkZAorICAgICAgZG9uZQorICAgIGZpCisgICAgOzsKK2VzYWMKKworZm9yIGZpbGUKK2RvCisgIGNhc2UgJGZpbGUgaW4KKyAgICAvKikgcGF0aGNvbXA9LyA7OworICAgICopICBwYXRoY29tcD0gOzsKKyAgZXNhYworICBvSUZTPSRJRlMKKyAgSUZTPS8KKyAgc2V0IGZub3JkICRmaWxlCisgIHNoaWZ0CisgIElGUz0kb0lGUworCisgIGZvciBkCisgIGRvCisgICAgdGVzdCAieCRkIiA9IHggJiYgY29udGludWUKKworICAgIHBhdGhjb21wPSRwYXRoY29tcCRkCisgICAgY2FzZSAkcGF0aGNvbXAgaW4KKyAgICAgIC0qKSBwYXRoY29tcD0uLyRwYXRoY29tcCA7OworICAgIGVzYWMKKworICAgIGlmIHRlc3QgISAtZCAiJHBhdGhjb21wIjsgdGhlbgorICAgICAgZWNobyAibWtkaXIgJHBhdGhjb21wIgorCisgICAgICBta2RpciAiJHBhdGhjb21wIiB8fCBsYXN0ZXJyPSQ/CisKKyAgICAgIGlmIHRlc3QgISAtZCAiJHBhdGhjb21wIjsgdGhlbgorCWVycnN0YXR1cz0kbGFzdGVycgorICAgICAgZWxzZQorCWlmIHRlc3QgISAteiAiJGRpcm1vZGUiOyB0aGVuCisJICBlY2hvICJjaG1vZCAkZGlybW9kZSAkcGF0aGNvbXAiCisJICBsYXN0ZXJyPQorCSAgY2htb2QgIiRkaXJtb2RlIiAiJHBhdGhjb21wIiB8fCBsYXN0ZXJyPSQ/CisKKwkgIGlmIHRlc3QgISAteiAiJGxhc3RlcnIiOyB0aGVuCisJICAgIGVycnN0YXR1cz0kbGFzdGVycgorCSAgZmkKKwlmaQorICAgICAgZmkKKyAgICBmaQorCisgICAgcGF0aGNvbXA9JHBhdGhjb21wLworICBkb25lCitkb25lCisKK2V4aXQgJGVycnN0YXR1cworCisjIExvY2FsIFZhcmlhYmxlczoKKyMgbW9kZTogc2hlbGwtc2NyaXB0CisjIHNoLWluZGVudGF0aW9uOiAyCisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKKyMgdGltZS1zdGFtcC1lbmQ6ICIkIgorIyBFbmQ6CmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL0NoYW5nZUxvZyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkODNmMjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL0NoYW5nZUxvZwpAQCAtMCwwICsxLDc5NCBAQAorMjAxMC0wMi0yMiAgQXVyZWxpZW4gSmFybm8gPGF1cmVsMzJAZGViaWFuLm9yZz4gICh3aykKKworCSogbG9uZ2xvbmcuaCAodW11bF9wcG1tKSA8bWlwcz4gW19fR05VQ19fID49IDQuNF06IFBhdGNoIGFjY29yZGluZworCXRvIHJlY29tbWVuZGVkIGdjYyA0LjQgY2hhbmdlcy4KKworMjAwOS0xMi0wOSAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogY29uZmlnLmxpbmtzOiBSZW1vdmUgYXNtIG1vZHVsZXMgZm9yIGFsbCBzcGFyYzY0LiAgVGhpcyBpcworCWRlYmlhbiM1NjAwMjguCisKKzIwMDgtMTItMDUgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIG1waWNvZGVyLmMgKG1waV9yZWFkX2Zyb21fYnVmZmVyKTogRG8gbm90IGJhaWwgb3V0IGlmIHRoZSBtcGkgaXMKKwlsYXJnZXIgdGhhbiB0aGUgYnVmZmVyIChwb3RlbnRpYWwgcHJvYmxlbSkuICBEbyBub3QgcHJpbnQgZXJyb3IKKwltZXNzYWdlcy4KKwkobXBpX2Zyb21zdHIpOiBSZXR1cm4gYW4gZXJyb3IgaW5zdGVhZCBvZiBoaXR0aW5nIGFuIGFzc2VydC4KKwkoZ2NyeV9tcGlfc2NhbikgPFBHUD46IEZpeCBwb3RlbnRpYWwgZG91YmxlIGZyZWUgcHJvYmxlbS4KKwkoZ2NyeV9tcGlfc2NhbikgPEhFWD46IEZpeCBwb3RlbnRpYWwgbWVtb3J5IGxlYWsuCisJKGRvX2dldF9idWZmZXIpOiBSZXR1cm4gTlVMTCBvbiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlLgorCShnY3J5X21waV9wcmludCk6IENoZWNrIHJlc3VsdCBvZiBkb19nZXRfYnVmZmVyLgorCShnY3J5X21waV9hcHJpbnQpOiBSZXR1cm4gZXJyb3Igb24gYSBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlLgorCisJKiBtcGljb2Rlci5jOiBSZS1pbmRlbnQuCisKKzIwMDgtMTItMDMgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIG1waS1wb3cuYyAoZ2NyeV9tcGlfcG93bSk6IEZpeCBsYXN0IGNoYW5nZS4gIEFzc2VydHMgYXJlIHJlYWxseQorCXVzZWZ1bCEKKworMjAwOC0xMi0wMiAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogbXBpLXBvdy5jIChnY3J5X21waV9wb3dtKTogUmUtaW5kZW50LgorCShnY3J5X21waV9wb3dtKTogU2ltcGxpZmllZCBhbGxvY2F0aW9uIG9mIHRoZSByZXN1bHQgdG8gZml4IGEKKwlkb3VibGUgZnJlZSBidWcuICBUaGlzIGlzIGJ1ZyM5NzcuICBSZXBvcnRlZCBieSBIYWFrb24gUmluZ2JlcmcuCisKKzIwMDgtMDgtMjAgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIG1waS1iaXQuYyAoZ2NyeV9tcGlfbHNoaWZ0KTogQWN0dWFsbHkgaW1wbGVtZW50LgorCisyMDA4LTA4LTE5ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBtcGktYml0LmMgKGdjcnlfbXBpX2xzaGlmdCk6IE5ldy4KKworMjAwNy0xMC0zMSAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogbXBpLW1vZC5jIChnY3J5X21waV9tb2QpOiBSZW1vdmUKKwkqIG1waS1pbnYuYyAoX2djcnlfbXBpX2ludm0pOiBSZW1vdmUgXyBwcmVmaXguCisJKiBtcGl1dGlsLmMgKF9nY3J5X21waV9zd2FwKTogUmVtb3ZlLgorCShfZ2NyeV9tcGlfbmV3KTogUmVtb3ZlLgorCShfZ2NyeV9tcGlfc25ldyk6IFJlbW92ZS4KKwkoZ2NyeV9tcGlfaW52bSk6IFJlbW92ZS4KKwkoZ2NyeV9tcGlfY29weSk6IFJlbW92ZSBhbmQgcmVuYW1lIF92ZXJzaW9uIHRvIHRoaXMuCisJKGdjcnlfbXBpX3NldCwgZ2NyeV9tcGlfc2V0X3VpKTogTWVyZ2Ugd2l0aCBfIHZlcnNpb24uCisJKiBtcGktaW52LmMgKGdjcnlfbXBpX2ludm0pOiBSZW1vdmUgXyBwcmVmaXggYW5kIHJldHVybiAxLgorCSogbXBpLW11bC5jIChnY3J5X21waV9tdWxfMmV4cCk6IFJlbW92ZSBhbmQgcmVuYW1lIF8gdmVyc2lvbiB0byB0aGlzLgorCisyMDA3LTEwLTI5ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBjb25maWcubGlua3M6IE5vIENhbmRhZGlhbiBDcm9zcyBoZXJlLCB0aHVzIHVzZSAkaG9zdCBpbnN0ZWFkIG9mCisJJHRhcmdldC4gIAorCisyMDA3LTEwLTI2ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBjb25maWcubGlua3MgKG1waV9vcHRpb25hbF9tb2R1bGVzKTogU3BlY2lhbCBydWxlcyBmb3IgQXBwbGUKKwlEYXJ3aW4gb24gaWEzMiBmcm9tIEdyZWdvciBSaWVwbC4KKworMjAwNy0wNS0wOSAgTWFyY3VzIEJyaW5rbWFubiAgPG1hcmN1c0BnMTBjb2RlLmRlPgorCisJKiBjb25maWcubGlua3M6IFJlbmFtZSBhc3NlbWJsZXIgZmlsZSBsaW5rcyBieSBzdWZmaXhpbmcgIi1hc20iLgorCSogTWFrZWZpbGUuYW0gKENDQVNDT01QSUxFLCBMVENDQVNDT01QSUxFLCBDTEVBTkZJTEVTLAorCWxpYm1waV9sYV9MSUJBREQsIGxpYm1waV9sYV9ERVBFTkRFTkNJRVMsIFNVRkZJWEVTLCAuUy5vLCAuUy5vYmosCisJLlMubG8pOiBSZW1vdmVkIHZhcmlhYmxlcyBhbmQgdGFyZ2V0cy4KKwkobXBpaF9hZGQxLCBtcGloX3N1YjEsIG1waWhfbXVsMSwgbXBpaF9tdWwyLCBtcGloX211bDMsCisJbXBpaF9sc2hpZnQsIG1waWhfcnNoaWZ0LCBtcGloX3VkaXYsIG1waWhfdWRpdl9xcm5uZCwKKwlub2Rpc3RfbGlibXBpX2xhX1NPVVJDRVMpOiBOZXcgdmFyaWFibGVzLgorCShESVNUQ0xFQU5GSUxFUyk6IFJlbmFtZSBhc3NlbWJsZXIgZmlsZSBsaW5rcyBieSBzdWZmaXhpbmcgIi1hc20iLgorCUFkZCB2YXJpYW50cyBmb3IgQyBmaWxlIGxpbmtzLgorCisyMDA3LTA1LTA0ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBjb25maWcubGlua3MgKHBhdGgpOiBBbGxvd3RoZSBzdWUgb2YgY29sb25zIGFzIGRlbGltaXRlcnMuIAorCisyMDA3LTA1LTAzICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBwZW50aXVtNC9kaXN0ZmlsZXM6IEZpeGVkLgorCisyMDA3LTA0LTMwICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBjb25maWcubGlua3M6IENyZWF0ZSBhIGZpbGUgbW9kLXNvdXJjZS1pbmZvLmguCisJKiBNYWtlZmlsZS5hbSAoRElTVENMRUFORklMRVMpOiBBZGQgdGhhdCBmaWxlLgorCSogbXBpdXRpbC5jIChfZ2NyeV9tcGlfZ2V0X2h3X2NvbmZpZyk6IE5ldy4KKworMjAwNy0wNC0yOCAgTWFyY3VzIEJyaW5rbWFubiAgPG1hcmN1c0BnMTBjb2RlLmRlPgorCisJKiBjb25maWcubGlua3M6IEFkZCBhZGRpdGlvbmFsIGFzc2VtYmxlciBzZWFyY2ggZGlyZWN0b3JpZXMuCisKKzIwMDctMDMtMjggIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGVjLmM6IE5ldy4KKworMjAwNy0wMy0yMyAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogbXBpLWJpdC5jIChfZ2NyeV9tcGlfbHNoaWZ0X2xpbWJzKTogQXNzaWduIEFQIGFmdGVyIHRoZSByZXNpemUuCisKKwkqIG1waS1kaXYuYyAoZ2NyeV9tcGlfbW9kLCBfZ2NyeV9tcGlfbW9kKTogTW92ZWQgdG8gLi4KKwkqIG1waS1tb2QuYzogLi4gbmV3IGZpbGUuCisJKF9nY3J5X21waV9iYXJyZXR0X2luaXQsIF9nY3J5X21waV9iYXJyZXR0X2ZyZWUpOiBOZXcuCisJKF9nY3J5X21waV9tb2RfYmFycmV0dCk6IE5ldy4KKwkoX2djcnlfbXBpX211bF9iYXJyZXR0KTogTmV3LgorCisyMDA3LTAzLTIyICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBtcGktZGl2LmMgKF9nY3J5X21waV9tb2QpOiBOZXcuCisJKiBtcGl1dGlsLmMgKF9nY3J5X21waV9uZXcsIF9nY3J5X21waV9zbmV3KTogTmV3LgorCisyMDA3LTAzLTEzICBXZXJuZXIgRGl0dG1hbm4gPFdlcm5lci5EaXR0bWFubkB0LW9ubGluZS5kZT4gICh3aykKKworCSogYW1kNjQvbXBpaC1hZGQxLlMsIGFtZDY0L21waWgtYWRkMS5TLCBhbWQ2NC9tcGloLWxzaGlmdC5TCisJKiBhbWQ2NC9tcGloLW11bDEuUywgYW1kNjQvbXBpaC1tdWwyLlMsIGFtZDY0L21waWgtbXVsMy5TCisJKiBhbWQ2NC9tcGloLXJzaGlmdC5TLCBhbWQ2NC9tcGloLXN1YjEuUzogTmV3LgorCSogY29uZmlnLmxpbmtzOiAgQWRkIGNhc2UgZm9yIHg4Nl82NC4KKworMjAwNy0wMi0yMyAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogbXBpLXBvdy5jIChnY3J5X21waV9wb3dtKTogUmVtb3ZlIHVudXNlZCB2YXIgRVNJR04uCisKKwkqIG1waXV0aWwuYyAoZ2NyeV9tcGlfZ2V0X2ZsYWcpOiBMZXQgaXQgcmV0dXJuIGEgdmFsdWUgdG8gc2lsZW50CisJTUlQU3BybyBjYyB3YXJuaW5nLgorCisyMDA3LTAyLTIxICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBtcGljb2Rlci5jIChfZ2NyeV9tcGlfc2V0X2J1ZmZlcik6IE1hZGUgQlVGRkVSIGEgdm9pZCouCisKKzIwMDYtMTEtMTUgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIE1ha2VmaWxlLmFtICguUy5vKTogQ2hlY2sgZm9yIHNyY2RpciBhbHNvIGluIGluIENQUCBwYXNzLgorCShJTkNMVURFUyk6IFJlbW92ZWQuCisJKEFNX0NQUEZMQUdTLCBBTV9DRkxBR1MpOiBOZXcsIG1vZGlmaWVkLiBNZXJnZWQgd2l0aCBNb3JpdHonCisJY2hhbmdlcy4KKworMjAwNi0xMS0wNSAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChBTV9DRkxBR1MpOiBBZGRlZCAtSSQodG9wX2J1aWxkZGlyKS9zcmMgc28gdGhhdCB0aGUKKwluZXcgZ2NyeXB0LmggaXMgdXNlZCwgbm90IHRoZSBvbmUgaW5zdGFsbGVkIGluIHRoZSBzeXN0ZW0uCisKKzIwMDYtMTAtMjMgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGNvbmZpZy5saW5rcyAobXBpX29wdGlvbmFsX21vZHVsZXMpOiBNYWtlIHN1cmUgdGhhdCBwb3dlcnBjNjQgaXMKKwltYXRjaGVkIGJlZm9yZSBhIGdlbmVyaWMgcG93ZXJwYy4gIFJlcG9ydGVkIGJ5IEFuZHJlYXMgTWV0emxlci4KKwlTaG91bGQgZml4IERlYmlhbiBidWcgMjg0NjA5LgorCisyMDA2LTA4LTI1ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBtcGktYml0LmMgKGdjcnlfbXBpX3JzaGlmdCk6IERvbid0IHNoaWZ0IGlmIE4gPT0gMCBidXQgZG8gYQorCXBsYWluIGNvcHkuCisKKzIwMDYtMDgtMDQgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIG1waS1iaXQuYyAoZ2NyeV9tcGlfcnNoaWZ0KTogUmV3cml0dGVuIHRvIHJlbW92ZSB0aGUgbGltaXRhdGlvbgorCW9uIE4gKHdoaWNoIHVzZWQgdG8gYmUgbGVzcyB0aGFuIEJJVFNfUEVSX01QSV9MSU1CKS4KKworMjAwNi0wOC0wMyAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogbXBpLWJpdC5jIChnY3J5X21waV9zZXRfYml0LCBnY3J5X21waV9zZXRfaGlnaGJpdCk6IEZpeGVkCisJYWxsb2NhdGlvbi4gIFJlcG9ydGVkIGJ5IGJwZ2NyeXB0IGF0IGl0YXBhcmljYS5vcmcuCisJKiBtcGl1dGlsLmMgKF9nY3J5X21waV9yZXNpemUpOiBDbGVhciB0aGUgbmV3IHBhcnQgb2YgdGhlIHJlc2l6ZWQKKwlsaW1iIHNwYWNlLgorCisyMDA2LTA3LTI2ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBtcGl1dGlsLmMgKGdjcnlfbXBpX3JhbmRvbWl6ZSk6IENoYW5nZWQgUCB0byB1bnNpZ25lZCBjaGFyKi4KKworCSogbXBpY29kZXIuYyAoZ2NyeV9tcGlfc2Nhbik6IENoYW5nZWQgYXJnIEJVRkZFUiB0byB2b2lkKi4KKwkobXBpX3JlYWRfZnJvbV9idWZmZXIpOiBNYWRlIEJVRkZFUiBhcmcgY29uc3QuCisJKGdjcnlfbXBpX3NjYW4pOiBSZW1vdmVkIG5vdyBuZWVkbGVzcyBjYXN0LiBBZGQgY2FzdCBmb3IgYXJnIHRvCisJbXBpX2Zyb21zdHIuCisJKGdjcnlfbXBpX3ByaW50KTogTWFkZSBUTVAgdW5zaWduZWQuCisKKwkqIE1ha2VmaWxlLmFtIChBTV9DQ0FTRkxBR1MpOiBOZXcuCisKKzIwMDUtMTAtMDkgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBtcGktY21wLmMgKGdjcnlfbXBpX2NtcF91aSk6IFJld3JpdHRlbjsgY29ycmVjdGx5IGhhbmRsZSBjYXNlIG9mCisJemVybyBsaW1icyBpbiBVLgorCisyMDA1LTA0LTI3ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogbXBpdXRpbC5jIChnY3J5X21waV9yYW5kb21pemUpOiBTdG9yZSByYW5kb20gZGF0YSBpbiBzZWN1cmUKKwltZW1vcnkgaWYgdGhlIGdpdmVuIE1QSSBpcyBzZWN1cmUgLSBub3QgdGhlIG90aGVyIHdheSBhcm91bmQgKGFyZ2wpLgorCisyMDA1LTA0LTIzICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogTWFrZWZpbGUuYW06IERvbid0IGFzc3VtZSB0aGUgY29tcGlsZXIgd2lsbCBwcmUtcHJvY2VzcyB0aGUgLlMKKwlmaWxlcy4gU29tZSBjb21waWxlcnMsIGxpa2UgdGhvc2UgZnJvbSBIUCBhbmQgSUJNLCBkb24ndCBkbworCXRoaXMuIFNvLCB3ZSB1c2UgdGhlIHNhbWUgc29sdXRpb24gZ251cGctMS40LjAgZG9lcy4gUHJlcHJvY2VzcworCWZpcnN0IGFuZCB0aGVuIGNvbXBpbGUuCisKKwkqIGhwcGExLjEvbXBpaC1tdWwzLlM6IEFkZCAibGV2ZWwgMS4xIiBkaXJlY3RpdmUgdG8gZGlzYWJsZQorCXdhcm5pbmcgYWJvdXQgdXNpbmcgUEEtUklTQzEuMSBvcGNvZGVzLgorCSogaHBwYTEuMS9tcGloLW11bDIuUzogTGlrZXdpc2UuCisJKiBocHBhMS4xL21waWgtbXVsMS5TOiBMaWtld2lzZS4KKwkqIGhwcGExLjEvdWRpdi1xcm5uZC5TOiBMaWtld2lzZS4KKworMjAwNS0wMi0xNiAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIG1waXV0aWwuYyAoX2djcnlfbXBpX2FsbG9jX2xpbWJfc3BhY2UpOiBSZXdyaXR0ZW4sIGZpeGVkIG1lbW9yeQorCWNvcnJ1cHRpb24uCisKKzIwMDUtMDItMDYgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBtcGl1dGlsLmMgKF9nY3J5X21waV9nZXRfdWksIGdjcnlfbXBpX2dldF91aSk6IE5ldyBmdW5jdGlvbnMuCisKKzIwMDUtMDEtMDUgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGhwcGExLjEvdWRpdi1xcm5uZC5TOiBSZXZlcnRlZCBjaGFuZ2Ugb2YgMjAwNC0wMy0wMiBidXQga2VwdCB0aGUKKwkuYWxpZ24gZGlyZWN0aXZlLgorCisyMDA0LTEyLTE2ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBjb25maWcubGlua3MgKG1waV9vcHRpb25hbF9tb2R1bGVzKTogTW92ZSBlbnRyeSBmb3IgcG93ZXJwYzY0CisJYmVmb3JlIGdlbmVyaWMgcG93ZXJwYy4gIFN1Z2dlc3RlZCBieSBSYWZhZWwgw4F2aWxhIGRlIEVzcMOtbmRvbGEuCisKKzIwMDQtMDMtMDIgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBocHBhMS4xL3VkaXYtcXJubmQuUzogQWxpZ25tZW50IGZpeCBmcm9tIExhbW9udCBKb25lcyBmb3IKKwlEZWJpYW4uICBUYWtlbiBmcm9tIGdudXBnLTEuMy4KKworCSogbG9uZ2xvbmcuaDogQWRkZWQgUG93ZXJQQyA2NCBiaXQgY29kZSBmcm9tIEdQTS00LjEuMiBidXQgZGlkbid0CisJZW5hYmxlIGl0IHlldC4gIFNvbWUgd2hpdGVzcGFjZSBjaGFuZ2VzIGluIEhQUEEgdG8gZml4IGFzc2VtYmxlcgorCXByb2JsZW1zIG9uIEhQLVVYLiAgRnJvbSBnbnVwZyAxLjMKKworCSogbXBpdXRpbC5jIChfZ2NyeV9tcGlfYWxsb2NfbGltYl9zcGFjZSk6IEJldHRlciBhbGxvY2F0ZQorCXNvbWV0aGluZyBldmVuIGlmIE5MSU1CUyBpcyBwYXNzZWQgYXMgMC4KKworCSogY29uZmlnLmxpbmtzOiBVcGRhdGVkIHN5c3RlbSBsaXN0IHRvIG1hdGNoIGdudXBnIDEuMy4KKworMjAwMy0xMi0xOSAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIG1waS1pbnRlcm5hbC5oIFtNX0RFQlVHXTogUmVtb3ZlZCB0aGlzIHVudXNlZCBjb2RlLgorCShzdHJ1Y3Qga2FyYXRzdWJhX2N0eCk6IEFkZGVkIFRTUEFDRV9OTElNQlMgYW5kCVRQX05MSU1CUy4KKwkqIG1waXV0aWwuYyAoX2djcnlfbXBpX2ZyZWVfbGltYl9zcGFjZSk6IEFkZCBhcmcgTkxJTUJTIGFuZCB3aXBlCisJb3V0IHRoZSBtZW1vcnkuICBDaGFuZ2VkIGFsbCBjYWxsZXJzLgorCSogbXBpaC1tdWwuYyAoX2djcnlfbXBpaF9tdWxfa2FyYXRzdWJhX2Nhc2UpOiBLZWVwIHRyYWNrIG9mCisJYWxsb2NhdGVkIGxpbWJzLgorCSogbXBpLWRpdi5jIChfZ2NyeV9tcGlfdGRpdl9xcik6IEtlZXAgdHJhY2sgb2YgYWxsb2NhdGVkIGxpbWJzLgorCSogbXBpLW11bC5jIChnY3J5X21waV9tdWwpOiBEaXR0by4KKwkqIG1waS1wb3cuYyAoZ2NyeV9tcGlfcG93bSk6IERpdHRvLgorCisJKiBNYW5pZmVzdDogRW1wdHkgbmV3IGZpbGUuICBBbHNvIGFkZCBNYW5pZmVzdCBmaWxlcyB0byBhbGwgQ1BVCisJc3BlY2lmaWMgZGlyZWN0b3JpZXMuCisJKiBNYWtlZmlsZS5hbTogQWRkZWQuCisKKwkqIG1waXV0aWwuYyAoZ2NyeV9tcGlfcmFuZG9taXplKTogVXNlIGdjcnlfY3JlYXRlX25vbmNlIGlmIFdFQUsKKwlyYW5kb20gaGFzIGJlZW4gcmVxdWVzdGVkLgorCisyMDAzLTEwLTMxICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogaTM4Ni9tcGloLXJzaGlmdC5TLCBpMzg2L21waWgtbHNoaWZ0LlM6IFVzZSAlZGwgYW5kIG5vdCAlZWR4IGZvcgorCXRlc3RiOyB0aGlzIGF2b2lkcyBhbiBhc3NlbWJsZXIgd2FybmluZy4KKworCSogbXBpLXBvdy5jIChnY3J5X21waV9wb3dtKTogcy9leHAvZXhwby8gdG8gYXZvaWQgc2hhZG93aW5nIHdhcm5pbmcuCisKKzIwMDMtMDgtMTkgIE1hcmN1cyBCcmlua21hbm4gIDxtYXJjdXNAZzEwY29kZS5kZT4KKworCSogTWFrZWZpbGUuYW0gKFNVRkZJWEVTKTogTmV3IHZhcmlhYmxlLgorCSguUy5vLCAuUy5sbywgLlMub2JqKTogUmV3cml0dGVuLgorCisyMDAzLTA3LTMwICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogbG9uZ2xvbmcuaCAoX19jbHpfdGFiKTogUmVuYW1lZCB0byBfZ2NyeV9jbHpfdGFiLgorCSogbXBpLWJpdC5jIChfX2Nsel90YWIpOiBMaWtld2lzZS4KKworMjAwMy0wNy0yNyAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIG1waWNvZGVyLmMgKGdjcnlfbXBpX3NjYW4pOiBOZXcgYXJndW1lbnQgQlVGTEVOIHRvIHJlcGxhY2UgdGhlCisJdXNlIG9mIHRoZSBpbnRpYWwgdmFsdWUgb2YgTkJZVEVTLiAgQ2hhbmdlZCBCVUZGRVIgdG8gdW5zaWduZWQuCisJKGdjcnlfbXBpX3ByaW50KTogTGlrZXdpc2UuCisJKGdjcnlfbXBpX2R1bXApOiBOZXcuCisJKF9nY3J5X2xvZ19tcGlkdW1wKTogTWFrZSB1c2Ugb2YgZ2NyeV9tcGlfZHVtcC4KKwkobXBpX3ByaW50KTogUmVtb3ZlZC4KKwkoZ2NyeV9tcGlfc2Nhbik6IEFsbG9jYXRlZCBtcGkgaW4gc2VjdXJlIG1lbW9yeSB3aGVuIHJlcXVpcmVkLgorCShnY3J5X21waV9hcHJpbnQpOiBDaGFuZ2VkIEJVRkZFUiB0byB1bnNpZ25lZCBjaGFyKi4KKworMjAwMy0wNy0xNCAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIG1waWNvZGVyLmM6IFVzZWQgZ2NyeV9lcnIqIHdyYXBwZXJzIGZvciBsaWJncGctZXJyb3Igc3ltYm9scy4KKworMjAwMy0wNi0xNiAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIG1waS1hZGQuYzogUmVwbGFjZSBsYXN0IG9jY3VyZW5jZXMgb2Ygb2xkIHR5cGUgbmFtZXMgd2l0aCBuZXdlcgorCW5hbWVzIChpLmUuIHJlcGxhY2UgTVBJIHdpdGggZ2NyeV9tcGlfdCkuCisJKiBtcGktYml0LmM6IExpa2V3aXNlLgorCSogbXBpLWNtcC5jOiBMaWtld2lzZS4KKwkqIG1waS1kaXYuYzogTGlrZXdpc2UuCisJKiBtcGktZ2NkLmM6IExpa2V3aXNlLgorCSogbXBpLWludGVybmFsLmg6IExpa2V3aXNlLgorCSogbXBpLWludi5jOiBMaWtld2lzZS4KKwkqIG1waS1tcG93LmM6IExpa2V3aXNlLgorCSogbXBpLW11bC5jOiBMaWtld2lzZS4KKwkqIG1waS1wb3cuYzogTGlrZXdpc2UuCisJKiBtcGktc2Nhbi5jOiBMaWtld2lzZS4KKwkqIG1waWNvZGVyLmM6IExpa2V3aXNlLgorCSogbXBpdXRpbC5jOiBMaWtld2lzZS4KKworMjAwMy0wNi0wOSAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIG1waWNvZGVyLmMgKGdjcnlfbXBpX3NjYW4pOiBBZGp1c3QgZm9yIGxpYmdwZy1lcnJvci4KKwkoZ2NyeV9tcGlfcHJpbnQpOiBMaWtld2lzZS4KKwkoZ2NyeV9tcGlfYXByaW50KTogTGlrZXdpc2UuCisKKzIwMDMtMDYtMDcgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBsb25nbG9uZy5oLCBtcGktYWRkLmMsIG1waS1iaXQuYywgbXBpLWNtcC5jLCBtcGktZGl2LmMsCisJbXBpLWdjZC5jLCBtcGktaW5saW5lLmMsIG1waS1pbmxpbmUuaCwgbXBpLWludGVybmFsLmgsIG1waS1pbnYuYywKKwltcGktbXBvdy5jLCBtcGktbXVsLmMsIG1waS1wb3cuYywgbXBpLXNjYW4uYywgbXBpY29kZXIuYywKKwltcGloLWRpdi5jLCBtcGloLW11bC5jLCBtcGl1dGlsLmMsIGdlbmVyaWMvbXBpLWFzbS1kZWZzLmgsCisJZ2VuZXJpYy9tcGloLWFkZDEuYywgZ2VuZXJpYy9tcGloLWxzaGlmdC5jLCBnZW5lcmljL21waWgtbXVsMS5jLAorCWdlbmVyaWMvbXBpaC1tdWwyLmMsIGdlbmVyaWMvbXBpaC1tdWwzLmMsIGdlbmVyaWMvbXBpaC1yc2hpZnQuYywKKwlnZW5lcmljL21waWgtc3ViMS5jLCBnZW5lcmljL3VkaXYtdy1zZGl2LmMsIGkzODYvc3ludGF4LmgsCisJbTY4ay9zeW50YXguaCwgbWlwczMvbXBpLWFzbS1kZWZzLmgsIHBvd2VycGMzMi9zeW50YXguaDogRWRpdGVkCisJYWxsIHByZXByb2Nlc3NvciBpbnN0cnVjdGlvbnMgdG8gcmVtb3ZlIHdoaXRlc3BhY2UgYmVmb3JlIHRoZSAnIycuCisJVGhpcyBpcyBub3QgcmVxdWlyZWQgYnkgQzg5LCBidXQgdGhlcmUgYXJlIHNvbWUgY29tcGlsZXJzIG91dAorCXRoZXJlIHRoYXQgZG9uJ3QgbGlrZSBpdC4gIFJlcGxhY2VkIGFueSBvY2N1cmVuY2Ugb2YgdGhlIG5vdworCWRlcHJlY2F0ZWQgdHlwZSBuYW1lcyB3aXRoIHRoZSBuZXcgb25lcy4KKworMjAwMy0wNS0yMSAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIG1waXV0aWwuYyAoX2djcnlfbXBpX2FsbG9jX2xpbWJfc3BhY2UpOiBPbmx5IHRyeSB0byBhbGxvY2F0ZQorCW1lbW9yeSBpbiBjYXNlIHRoZSBhbW91bnQgb2YgYnl0ZXMgdG8gYWxsb2NhdGUgaXMgbm9uLXplcm8uCisKKzIwMDMtMDQtMjcgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBtcGl1dGlsLmMgKF9nY3J5X21waV9yZXNpemUpOiBBbGxvY2F0ZSBzZWN1cmUgbWVtb3J5LCBpbiBjYXNlCisJYml0IHplcm8gb2YgYGZsYWdzJyBpcyBzZXQuCisKKwkqIG1waS1hZGQuYyAoZ2NyeV9tcGlfc3ViKTogU2ltcGxpZnkgZnVuY3Rpb247IGFsd2F5cyB1c2UgYQorCXRlbXBvcmFyeSB2YXJpYWJsZSBub3cuCisKKzIwMDMtMDQtMTUgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBsb25nbG9uZy5oICh1bXVsX3BwbW0pOiBTdXBwb3J0IFNIMyBhbmQgU0g0LiAgVGhhbmtzIHRvCisJa2F6dXlhLnNAanAueW9rb2dhd2EuY29tLgorCisyMDAzLTA0LTAyICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogbXBpY29kZXIuYyAoZ2NyeV9tcGlfcHJpbnQpOiBGaXhlZCB0ZXN0aW5nIGFnYWluc3QgcG9zc2libGUKKwl1bmluaXRpYWxpemVkIExFTi4gIFZhbGdyaW5kZWQgYnkgTmlrb3MgTWF2cm95YW5vcG91bG9zLgorCisyMDAzLTAxLTE1ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogbG9uZ2xvbmcuaDogUmVtb3ZlZCBzb21lIHNwYWNlcyBiZXR3ZWVuIGJhY2tzbGFzaGVzIGFuZCBuZXdsaW5lcy4KKworMjAwMi0wOS0yMCAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIG1waS1tdWwuYyAoZ2NyeV9tcGlfbXVsXzJleHApOiBOZXcuIFRoaXMgd2FzIGRlY2xhcmVkIGluCisJZ2NyeXB0LmggYnV0IG9ubHkgaW1wbGVtZW50ZWQgYXMgaW50ZXJuYWwgZnVuY3Rpb24uICBOb3RlZCBieSBUaW1vCisJYnV0IGEgZmV3IG1pbnV0ZXMgdG8gbGF0ZSBmb3IgdG9kYXkncyByZWxlYXNlLgorCisJKiBNYWtlZmlsZS5hbSAoRElTVENMRUFORklMRVMpOiBJbmNsdWRlIG1waS1hc20tZGVmcy5oCisKKzIwMDItMDktMTggIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBNYWtlZmlsZS5hbSAoLlMubG8pOiBQYXNzIC1EUElDLiBpMzg2LCBQUEMgYW5kIFNwYXJjIGNvZGUKKwlyZXF1aXJlIGl0LiAgSXQgd29ya2VkIGZvciBtZSBiZWNhdXNlIEkgYW0gdXNpbmcgdGhlIGk1ODYgY29kZS4KKworMjAwMi0wOC0yMyAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIE1ha2VmaWxlLmFtICguUy5sbyk6IEZpeGVkIGZvciBsaWJ0b29sIGJ1aWxkIHdpdGggLS1kaXNhYmxlLXNoYXJlZC4KKworMjAwMi0wNy0yNCAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIGxvbmdsb25nLmg6IFJlcGxhY2VkIGFsbCBLJlIgbXVsdGlsaW5lIHN0cmluZ3MgYnkgSVNPIG9uZXMgZm9yCisJdGhlIHNha2Ugb2YgbW9kZXJuIGNvbXBpbGVycy4gIFN1Z2dlc3RlZCBieSBNYXJjbyBQYXJyb25lLgorCisyMDAyLTA2LTI0ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogbXBpdXRpbC5jIChnY3J5X21waV9zd2FwKTogTmV3LgorCisJKiBtcGktZGl2LmMgKGdjcnlfbXBpX2Rpdik6IE5ldy4KKwkoZ2NyeV9tcGlfbW9kKTogTmV3LgorCSogbXBpLWludi5jIChnY3J5X21waV9pbnZtKTogTmV3LgorCisJKiBtcGljb2Rlci5jIChkb19nZXRfYnVmZmVyKTogTWFrZSBzdXJlIHRoYXQgd2UgYWxsb2NhdGUgYXQgbGVhc3QKKwlvbmUgYnl0ZS4KKworMjAwMi0wNi0xMiAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIGhwcGExLjEvdWRpdi1xcm5uZC5TOiBDaGFuZ2VzIGZvciBQSUMgYnkgUmFuZG9scGggQ2h1bmcuCisKKzIwMDItMDUtMTUgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBjb25maWcubGlua3M6IENobmFnZSB0aGUgd2F5IHRoZSBtcGkgbW9kdWxlcyBhcmUgZGV0ZXJtaW5lZC4KKwkqIE1ha2VmaWxlLmFtOiBSZXZhbXBlZCB0byBiZXR0ZXIgaGFuZGxlIG1vZHVsZXMKKworMjAwMi0wNS0xNCAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwlDaGFuZ2VkIGxpY2Vuc2Ugb2YgYWxsIGZpbGVzIHRvIHRoZSBMR1BMLgorCisyMDAyLTA0LTE4ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogbXBpY29kZXIuYyAoZ2NyeV9tcGlfc2Nhbik6IERvbid0IHVzZSBub3JtYWxpemUgb24gYSBOVUxMIE1QSS4KKworMjAwMi0wMy0yMCAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIG1waWNvZGVyLmMgKG1waV9yZWFkX2Zyb21fYnVmZmVyKTogQmFpbCBvdXQgb24gYSB6ZXJvIGxlbmd0aAorCWJ1ZmZlciBiZWNhdXNlIHdlIGNhbid0IGV2ZW50dWFsbHkgZG8gYW4gbWFsbG9jIG9mIHRoaXMgc2l6ZS4KKwlSZXBvcnRlZCBieSBUaW1vLgorCisyMDAyLTAxLTE0ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogbXBpLWludi5jIChfZ2NyeV9tcGlfaW52bSk6IFR5cG8gZml4ZXMsIG5vdGVkIGJ5IENhcmxvIFBlcmFzc2kuCisKKzIwMDEtMTEtMDEgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBtcGljb2Rlci5jIChnY3J5X21waV9zY2FuKTogQWxsb3cgdG8gcGFzcyBhIG5ieXRlcyBhcyBOVUxMIG9yCisJd2l0aCB2YWx1ZSAwIGZvciBmb3JtYXQgR0NSWV9GTVRfU1NILCBzbyB0aGF0IHRoZSBsZW5ndGggaXMgbm90CisJdXNlZCBmb3IgYW55IGNoZWNrcywgb25seSB0aGUgbGVuZ3RoIHN0b3JlZCBpbiB0aGUgYnVmZXIgaXMgdXNlZC4KKwlUaGlzIGlzIGEgbmljZSBmb3JtYXQgYmVjdWFzZSB3ZSBjYW4ganVzdCBwYXNzIGEgYnVmZmVyIGFyb3VuZCBhbmQKKwlkb24ndCBuZWVkIHRvIGNhcmUgYWJvdXQgaXRzIGxlbmd0aC4KKworMjAwMS0wOC0wMyAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIGNvbmZpZy5saW5rczogQ2hhbmdlZCB0aGUgd2F5IHRoZSBsaXN0IG9mIGZpbGVzIHRvIGJlCisJc3ltbGlua2VkIGlzIHJldHVybmVkLgorCisyMDAxLTA1LTMxICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogbXBpaC1jbXAuYzogUmVtb3ZlZCBhbmQgbW92ZWQgbXBpaGVscF9jbXAgdG8gLi4KKwkqIG1waS1pbmxpbmUuaDogLi4gaGVyZS4KKworCU1ham9yIGZ1bmN0aW9uIHJlbmFtaW5nLiBBbGwgZ2xvYmFsIGZ1bmN0aW9ucyBhcmUgbm93IHByZWZpeGVkCisJd2l0aCBfZ2NyeV8gb3IgZ2NyeV8uICBSZW5hbWVkIGFsc28gYWxsIG1waWhlbHBfIHRvIGp1c3QgbXBpaF8gc28KKwl0aGF0IGZ1bmN0aW9ucyBuYW1lcyBhcmUgbm90IGdldHRpbmcgdG8gbG9uZyBhbiB1bnJlYWRhYmxlIGFuZCBmb3IKKwliZXR0ZXIgbWF0Y2hpbmcgd2l0aCB0aGUgZmlsZW5hbWVzLgorCQorMjAwMS0wNS0yOCAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIG1waWNvZGVyLmMgKG1waV9mcm9tc3RyKTogTWFkZSBzdGF0aWMgYW5kIGFzc3VtZSB0aGF0IGFsbCBpbnB1dAorCWlzIGluIGhleGZvcm1hdC4KKworCVVwZGF0ZWQgYWxsIENQVSBzcGVjaWZpYyBjb2RlIHdpdGggdGhlIG9uZSBmcm9tIEdudVBHLTEuMC41LiAgVGhpcworCWlzIGp1c3QgYSBjaGFuZ2Ugb2YgdGV4dCBmb3JtYXR0aW5nIGFuZCB0aGUgdXNlIG9mIC5sYWJlbAorCWluc3RlYWQgb2YgbGFiZWxzIGZvciBocHBhIGFuZCBwYTcxMDAuCisKKwkqIGxvbmdsb25nLmg6IEZpeGVzIGZvciBBUk0gYnkgUGhpbCBCbHVuZGVsbC4KKworMjAwMS0wMy0yOSAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIG1waS1tdWwuYyAobXBpX211bCk6IE1ha2Ugc3VyZSB0aGF0IHNlY3JldCB0ZW1wb3JhcnkgcmVzdWx0cyBhcmUKKwlub3Qgc3RvcmVkIGluIHcuICBTdWdnZXN0ZWQgYnkgRmxvcmlhbiBXZWltZXIuCisKKwkqIGNvbmZpZy5saW5rczogVXNlIGkzODYgY29kZSBmb3IgaTM4Ni4gIEFjY29yZGluZyB0byB0ZXN0cyBieQorCUtldmluIFJ5ZGUgdGhlIGk1ODYgY29kZSBydW5zIHNsb3cgb24gaTM4NiBDUFVzLiAgRGl0dG8gZm9yIGk3ODYuCisKKzIwMDEtMDEtMTEgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBNYWtlZmlsZS5hbTogUmVtb3ZlZCBtcGkuaC4KKworMjAwMC0xMi0xOSAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIG1waS1pbnRlcm5hbC5oOiBQdXQgbGltYl90IGRlZmluaXRpb24gaW4gYW4gaWZkZWYuCisKKyAJTWFqb3IgY2hhbmdlOgorCVJlbW92ZWQgYWxsIEdudVBHIHN0dWZmIGFuZCByZW5hbWVkIHRoaXMgcGllY2Ugb2Ygc29mdHdhcmUKKwl0byBnY3J5cHQuIAorCisyMDAwLTExLTE0ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogbXBpLWludGVybmFsLmgsIG1waS5oOiBDaGFuZ2VkIHRoZSB3YXkgdGhleSBhcmUgY2FsbGVkIGFuZAorCWludHJvZHVjZWQgRElEX01QSV9MSU1QX1RZUEVERUYgaGFjay4gIFZlcnkgdWdseSwgc2hvdWxkIGFsbCBiZQorCXJldmFtcGVkLgorCQorCSogTWFrZWZpbGUuYW0gKE9NSVRfREVQRU5ERU5DSUVTKTogSGFjayB0byB3b3JrIGFyb3VuZCBkZXBlbmRlbmN5CisJcHJvYmxlbXMuCisKKzIwMDAtMTAtMTEgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBnZW5lcmljL21waS1hc20tZGVmcy5oOiBOZXcuCisJKiBtaXBzMy9tcGktYXNtLWRlZnMuaDogTmV3LgorCSogY29uZmlnLmxpbmtzOiBDcmVhdGUgYSBsaW5rIHRvIG9uZSBvZiB0aGUgYWJvdmUgZmlsZXMuCisKK0ZyaSBKdWwgMjggMTg6MTk6MTEgQ0VTVCAyMDAwICBXZXJuZXIgS29jaCAgPHdrQG9wZW5pdC5kZT4KKworICAqIG1waWNvZGVyLmMgKGdjcnlfbXBpX3NjYW4pOiBOb3JtYWxpemUgdGhlIHJldHVybmVkIE1QSS4KKworVHVlIEp1bCAyNSAxNzo0NDoxNSBDRVNUIDIwMDAgIFdlcm5lciBLb2NoICA8d2tAb3Blbml0LmRlPgorCisgICogY29uZmlnLmxpbmtzOiBTdXBwb3J0IGZvciBwb3dlcnBjLS1uZXRic2QgYnkgR2FicmllbCBSb3NlbmtvZXR0ZXIuCisKK01vbiBKdWwgMTcgMTY6MzU6NDcgQ0VTVCAyMDAwICBXZXJuZXIgS29jaCAgPHdrQD4KKworICAqIHBvd2VyLzogQWRkIGFsbCBmaWxlcyBmcm9tIEdNUCBmb3IgdGhpcyBDUFUuIENvbnZlcnRlZCBjb21tZW50cyB0bworICBDUFAgY29tbWVudHMgYmVjYXVzZSBzb21lIEFTZXMgY29tcGxhaW4gYWJvdXQgJyBpbiBjb21tZW50cy4KKworICAqIGNvbmZpZy5saW5rczogIFN1cHBvcnQgZm9yIEJTREkgNC54OyBieSBXYXluZSBDaGFwZXNraWUuIEFkZCBzdXBwb3J0CisgIGZvciBGcmVlQlNEIDUgYW5kIG1hZGUgdGhlIGNhc2Ugc3RtdCBsb29raW5nIG5pY2VyOyBieSBKdW4gS3VyaXlhbWEuCisgIEFkZCBzdXBwb3J0IGZvciBOZXRCU0QuCisgIChzcGFyYzgpOiBNYWRlIHRoZSBzZWFyY2ggcGF0aCB0aGUgc2FtZSBhcyBzcGFyYzkKKyAgKHNwYXJjNjQtdW5rbm93bi1saW51eC1nbnUpOiB1c2UgdWRpdiBtb2R1bGU7IGJ5IEFkYW0gTWl0Y2hlbGwuCisKKyAgKiBNYWtlZmlsZS5hbTogYy9TRkxBR1MvQVNGTEFHUy8uIFRoaXMgaGFzIG9ubHkgYmVlbiB1c2VkIGJ5IHRoZQorICBwb3dlcnBjIGFuZCBhY3R1YWxseSBuZXZlciBwYXNzZWQgdGhlIC1XYSxmb28gdG8gdGhlIGNjLgorCisgICogbXBpaC1kaXYuYyAobXBpaGVscF9kaXZyZW0pOiBUaGUgTVBOX0NPUFlfREVDUiBjb3BpZWQgb25lIGVsZW1lbnQKKyAgdG9vIG1hbnkuICBUaGlzIGlzIGEgZ21wMi4wLjJwOS50eHQgcGF0Y2guCisKKyAgKiBsb25nbG9uZy5oICh1bXVsX3BwbW0pOiBGaXhlcyBmb3IgQVJNLTQuIEJ5IFNlYW4gTWFjTGVubmFuLgorCisgICogbXBpLWludGVybmFsLmggKGthcmF0c3ViYV9jdHgpOiBOZXcuCisgICogbXBpaC1tdWwuYyAobXBpaGVscF9yZWxlYXNlX2thcmF0c3ViYV9jdHgpOiBOZXcuCisgIChtcGloZWxwX211bF9rYXJhdHN1YmFfY2FzZSk6IE5ldy4KKyAgKG1waWhlbHBfbXVsKTogU3BsaXR0ZWQgdG8gbWFrZSB1c2Ugb2YgdGhlIG5ldyBmdW5jdGlvbnMuCisgICogbXBpLXBvdy5jIChtcGlfcG93bSk6IE1ha2UgdXNlIG9mIHRoZSBuZXcgc3BsaXR0ZWQgZnVuY3Rpb24gdG8gYXZvaWQKKyAgbXVsdGlwbGUgYWxsb2NhdGlvbiBvZiB0ZW1wb3JhcnkgbWVtb3J5IGR1cmluZyB0aGUga2FyYXRzdWJhIG9wZXJhdGlvbnMuCisgICogbXBpX21wb3cuYzogUmVtb3ZlZCB0aGUgdW51c2VkIEJhcnJldHQgY29kZS4KKworMjAwMC0wMy0yMSAxNjoxNzozMCAgV2VybmVyIEtvY2ggICh3a0BoYWJpYnRpLm9wZW5pdC5kZSkKKworCSogY29uZmlnLmxpbmtzOiBBZGQgc3VwcG9ydCBmb3IgRnJlZUJTRCA1LgorCitNb24gSmFuIDI0IDIyOjI0OjM4IENFVCAyMDAwICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLmRlPgorCisJKiBtcGljb2Rlci5jIChnY3J5X21waV9hcHJpbnQpOiBOb3cgcmVhbGx5IHJldHVybnMgdGhlIGxlbmd0aC4KKworTW9uIEphbiAyNCAxMzowNDoyOCBDRVQgMjAwMCAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5kZT4KKworCSogbXBpdXRpbC5jOiBSZW1vdmVkIGFsbCBtZW1vcnkgZGVidWdnaW5nIGNvZGUuCisKKwkqIG1waWNvZGVyLmMgKGdjcnlfbXBpX2FwcmludCk6IE5ldy4KKworCSogUmVwbGFjZWQgYWxsIG1fIG1lbW9yeSBmdW5jdGlvbnMgYnkgZzEwXyBvbmVzLgorCitGcmkgRGVjIDMxIDE0OjA2OjU2IENFVCAxOTk5ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLmRlPgorCisJKiBtcGktYml0LmMgKGdjcnlfbXBpX2dldF9uYml0cyk6IE5ldy4KKworCSogbXBpdXRpbC5jIChtcGlfc2V0X3NlY3VyZSk6IG1hZGUgc3RhdGljLgorCShnY3J5X21waV9nZXRfZmxhZyk6IE5ldy4KKwkoZ2NyeV9tcGlfc2V0X2ZsYWcpOiBOZXcuCisJKGdjcnlfbXBpX2NsZWFyX2ZsYWcpOiBOZXcuCisJKG1waV9zZXRfb3BhcXVlKTogcmVuYW1lZCB0byBnY3J5X21waV9zZXRfb3BhcXVlLgorCShtcGlfZ2V0X29wYXF1ZSk6IHJlbmFtZWQgdG8gZ2NyeV9tcGlfZ2V0X29wYXF1ZS4KKworRnJpIERlYyAzMSAxMjo0ODozMSBDRVQgMTk5OSAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5kZT4KKworCSogbXBpY29kZXIuYyAobXBpX3JlYWRfZnJvbV9idWZmZXIpOiBNYWRlIHN0YXRpYy4KKwkoZ2NyeV9tcGlfcHJpbnQpOiBBIGJ1ZmZlciBvZiBOVUxMIGlzIG5vdyBhbGxvd2VkIHRvIGdldCB0aGUgcmVxdWlyZWQKKwlsZW5ndGggYmFjay4KKwkobXBpX2dldF9rZXlpZCk6IFJlbW92ZWQuCisJKG1waV9wcmludCk6IE1hZGUgc3RhdGljIC0gc2hvdWxkIGJlIHJlbW92ZWQuCisKK1dlZCBEZWMgIDggMjE6NTg6MzIgQ0VUIDE5OTkgIFdlcm5lciBLb2NoICA8d2tAZ251cGcuZGU+CisKKwkqIE1ha2VmaWxlLmFtIChJTkNMVURFUyk6IEFkZCAuLi9nY3J5cHQuCisKKwkqIGcxMG0uYyA6IFJlbW92ZWQuCisKKwkqIG1waWNvZGVyLmMgKG1waV93cml0ZSk6IFJlbW92ZWQuCisJKG1waV9yZWFkKTogUmVtb3ZlZC4KKwkoZ2NyeV9tcGlfc2Nhbik6IE5ldy4gVGFrZW4gZnJvbSAuLi9nY3J5cHQvbXBpYXBpLmMuCisJKGdjcnlfbXBpX3ByaW50KTogRGl0dG8uCisKKwkqIG1waS1wb3cuYyAobXBpX3Bvd20pOiBSZW5hbWVkIHRvIC4uLgorCShnY3J5X21waV9wb3dtKTogLi4uIHRoaXMuCisKKwkqIG1waXV0aWwuYyAoZ2NyeV9tcGlfbmV3KTogTmV3IGFzIGEgd3JhcHBlciBhcm91bmQgdGhlIG9sZCBmdW5jdGlvbi4KKwlUYWtlbiBmcm9tIC4uL2djcnlwdC9tcGlhcGkuYy4KKwkoZ2NyeV9tcGlfc25ldyk6IERpdHRvLgorCShnY3J5X21waV9yZWxlYXNlKTogRGl0dG8uCisJKGdjcnlfbXBpX2NvcHkpOiBEaXR0by4KKwkoZ2NyeV9tcGlfc2V0KTogRGl0dG8uCisJKGdjcnlfbXBpX3NldF91aSk6IERpdHRvLgorCShnY3J5X21waV9jbXApOiBEaXR0by4KKwkoZ2NyeV9tcGlfY21wX3VpKTogRGl0dG8uCisJKGdjcnlfbXBpX3JhbmRvbWl6ZSk6IERpdHRvLgorCisJKiBtcGljb2Rlci5jIChtcGlfcHJpbnQpOiBSZW1vdmVkIHRoZSBuYml0X2luZm8ga2x1ZGdlLgorCSogbXBpLWJpdHMuYyAobXBpX2dldF9uYml0cyk6IFJlcGxhY2VkIHRoZSBpc19wcm90ZWN0ZWQgc3R1ZmYgYnkKKwljaGVja2luZyB3aGV0aGVyIGl0IGlzIGFuIG9wYXF1ZSBtcGkgYW5kIHRoZW4gcmV0dXJucyBpdCdzIGxlbmd0aAorCWluIGJpdHMuCisJKiBtcGl1dGlsLmMgKG1waV9zZXRfb3BhcXVlKTogQ2hhbmdlZCB0aGUgaW50ZXJmYWNlIHRvIHRha2UgYSBudW1iZXIKKwlvZiBiaXRzIGZvciB0aGUgbGVuZ3RoLiAgQWRqdXN0ZWQgYWxsIHVzZXJzLgorCShtcGlfZ2V0X29wYXF1ZSk6IERpdHRvLgorCitGcmkgTm92IDE5IDE3OjE1OjIwIENFVCAxOTk5ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLmRlPgorCisJKiBtcGljb2Rlci5jIChnMTBfbG9nX21waWR1bXApOiBBZGQgYSB0ZW1wb3Jhcnkgd29ya2Fyb3VuZAorCisJKiBtcGloLW11bC5jIChtcGloZWxwX211bF9uKTogcy9tX2lzX2VjdXJlL2cxMF9pc19zZWN1cmUvCisKKwkqIG1waXV0aWwuYyAobXBpX2FsbG9jKTogUmVtdmVkIHRoZSBkZWJ1ZyBtb2RlIGJlY2F1c2UgaXQgaGFzIHR1cm5lZAorCW91dCwgdGhhdCB0aGlzIGZlYXR1cmUgd2FzIG5vdCB2ZXJ5IHVzZWZ1bCBpbiB0aGUgcGFzdC4gIFVzZSB0aGUKKwluZXcgYWxsb2MgZnVuY3Rpb25zLgorCShtcGlfYWxsb2Nfc2VjdXJlKTogRGl0dG8uCisJKG1waV9hbGxvY19saW1iX3NwYWNlKTogRGl0dG8uCisJKG1waV9mcmVlX2xpbWJfc3BhY2UpOiBEaXR0by4KKwkobXBpX3Jlc2l6ZSk6IERpdHRvLgorCShtcGlfZnJlZSk6IERpdHRvLgorCShtcGlfc2V0X3NlY3VyZSk6IFJlbW92ZWQgdGhlIGRlYnVnIHN0dWZmLgorCShtcGlfc2V0X29wYXF1ZSk6IERpdHRvLgorCShtcGlfY29weSk6IERpdHRvLgorCShtcGlfYWxsb2Nfc2V0X3VpKTogRGl0dG8uCisJKG1waV9tX2NoZWNrKTogVXNlIGcxMF8gd3JhcHBlci4KKworTW9uIEF1ZyAzMCAyMDozODozMyBDRVNUIDE5OTkgIFdlcm5lciBLb2NoICA8d2tAaXNpbC5kLnNodXR0bGUuZGU+CisKKworCSogY29uZmlnLmxpbmtzOiBBZGQgY2FzZSBsYWJlbCBmb3IgREpHUFAKKworV2VkIEp1bCAxNCAxOTo0MjowOCBDRVNUIDE5OTkgIFdlcm5lciBLb2NoICA8d2tAaXNpbC5kLnNodXR0bGUuZGU+CisKKworCSogTWFrZWZpbGUuYW06IFVzZSAucyBmaWxlcyBhcyB0ZW1wb3JhcmllcywgZGlzYWJsZWQgb3RoZXIgLlMgcnVsZXMuCisKK1dlZCBKdWwgIDcgMTM6MDg6NDAgQ0VTVCAxOTk5ICBXZXJuZXIgS29jaCAgPHdrQGlzaWwuZC5zaHV0dGxlLmRlPgorCisKKwkqIG1waWNvZGVyLmMgKGcxMF9sb2dfbXBpZHVtcCk6IE5ldy4KKworCSogTWFrZWZpbGUuYW06IFN1cHBvcnQgZm9yIGxpYnRvb2wuCisKK0ZyaSBKdWwgIDIgMTE6NDU6NTQgQ0VTVCAxOTk5ICBXZXJuZXIgS29jaCAgPHdrQGlzaWwuZC5zaHV0dGxlLmRlPgorCisKKwkqIG1waS1iaXQuYyAobXBpX2xzaGlmdF9saW1icyxtcGlfcnNoaWZ0X2xpbWJzKTogTmV3LgorCSogbXBpLW1wb3cuYyAoYmFycmV0dF9tdWxtKTogTmV3IGJ1dCBkaWFibGVkLgorCitUdWUgSnVuICAxIDE2OjAxOjQ2IENFU1QgMTk5OSAgV2VybmVyIEtvY2ggIDx3a0Bpc2lsLmQuc2h1dHRsZS5kZT4KKworCSogY29uZmlnLmxpbmtzIChpWzU2XTg2Ki0qLWZyZWVic2RlbGYqKTogTmV3LgorCitTdW4gTWF5IDIzIDE0OjIwOjIyIENFU1QgMTk5OSAgV2VybmVyIEtvY2ggIDx3a0Bpc2lsLmQuc2h1dHRsZS5kZT4KKworCSogY29uZmlnLmxpbmtzIChzeXNkZXAuaCk6IE5vdCBhbnkgbW9yZSBjb25kaXRpb25hbGx5IGNyZWF0ZWQuCisKK1R1ZSBNYXkgIDQgMTU6NDc6NTMgQ0VTVCAxOTk5ICBXZXJuZXIgS29jaCAgPHdrQGlzaWwuZC5zaHV0dGxlLmRlPgorCisJKiBtcGl1dGlsLmMgKG1waV9hbGxvY19saWtlKTogTmV3LgorCitNb24gQXByIDI2IDE3OjQ4OjE1IENFU1QgMTk5OSAgV2VybmVyIEtvY2ggIDx3a0Bpc2lsLmQuc2h1dHRsZS5kZT4KKworCSogbXBpaC1hZGQuYywgbXBpaC1zdWIuYzogUmVtb3ZlZAorCSogbXBpLWlubGluZS5jOiBOZXcuCisJKiBtcGktaW5saW5lLmg6IE1ha2UgaXQgdXNhYmxlIGJ5IG1waS1pbmxpbmUuYy4KKworU3VuIEFwciAxOCAxMDoxMToyOCBDRVNUIDE5OTkgIFdlcm5lciBLb2NoICA8d2tAaXNpbC5kLnNodXR0bGUuZGU+CisKKwkqIG1waWgtbXVsLmMgKG1waWhlbHBfbXVsX24pOiBGaXhlZCB1c2Ugb2YgbWVtb3J5IHJlZ2lvbi4KKwkobXBpaGVscF9tdWwpOiBEaXR0by4KKworV2VkIEFwciAgNyAyMDo1MTozOSBDRVNUIDE5OTkgIFdlcm5lciBLb2NoICA8d2tAaXNpbC5kLnNodXR0bGUuZGU+CisKKwkqIE1ha2VmaWxlLmFtOiBFeHBsaWNpdCBydWxlcyB0byBpbnZva2UgY3BwIG9uICouUworCitNb24gTWFyICA4IDIwOjQ3OjE3IENFVCAxOTk5ICBXZXJuZXIgS29jaCAgPHdrQGlzaWwuZC5zaHV0dGxlLmRlPgorCisJKiBjb25maWcubGlua3M6IFRha2UgYWR2YW50YWdlIG9mIHRoZSB3aXRoX3N5bWJvbF91bmRlcnNjb3JlIG1hY3JvLgorCUFkZCBzdXBwb3J0IGZvciBmcmVlYnNkIDQuCisKK1dlZCBGZWIgMjQgMTE6MDc6MjcgQ0VUIDE5OTkgIFdlcm5lciBLb2NoICA8d2tAaXNpbC5kLnNodXR0bGUuZGU+CisKKwkqIG1pcHMzL21waWgtc3ViMS5TOiBSZW1vdmVkIGxlZnQgb3ZlciBqdW5rIGluIGxhc3QgbGluZS4gKFNob3VsZCBJCisJYmxhbWUgbWUgb3IgbXkgZWRpdG9yPykuCisKK1NhdCBGZWIgMTMgMTI6MDQ6NDMgQ0VUIDE5OTkgIFdlcm5lciBLb2NoICA8d2tAaXNpbC5kLnNodXR0bGUuZGU+CisKKwkqIE1ha2VmaWxlLmFtOiBSZW1vdmVkIHRoZSArPS4gQWRkIE1QSV9PUFRfRkxBR1MuCisKK1NhdCBKYW4gIDkgMTY6MDI6MjMgQ0VUIDE5OTkgIFdlcm5lciBLb2NoICA8d2tAaXNpbC5kLnNodXR0bGUuZGU+CisKKwkqIG1waS1jbXAuYyAobXBpX2NtcF91aSk6IE5vcm1hbGl6ZWQgdGhlIGFyZy4KKworVGh1IEphbiAgNyAxODowMDo1OCBDRVQgMTk5OSAgV2VybmVyIEtvY2ggIDx3a0Bpc2lsLmQuc2h1dHRsZS5kZT4KKworCSogbXBpLWJpdC5jIChtcGlfbm9ybWFsaXplKTogTmV3LgorCShtcGlfZ2V0X25iaXRzKTogTm9ybWFsaXplIHRoZSBNUEkuCisJKiBtcGktYml0LmMgKG1waV9jbXApOiBOb3JtYWxpemUgdGhlIE1QSSBiZWZvcmUgdGhlIGNvbXBhcmUuCisKKworVHVlIERlYyAgOCAxMzoxNToxNiBDRVQgMTk5OCAgV2VybmVyIEtvY2ggIDx3a0Bpc2lsLmQuc2h1dHRsZS5kZT4KKworCSogY29uZmlnLmxpbmtzOiBNb3ZlZCB0aGUgY2FzZSBmb3IgcG93ZXJwYypsaW51eAorCSogcG93ZXJwY3AzMi8qLlM6IFJlbW92ZWQgc29tZSB1bmRlcnNjb3Jlcy4KKworVGh1IE5vdiAyNiAwNzoyNzo1MiAxOTk4ICBXZXJuZXIgS29jaCAgPHdlcm5lci5rb2NoQGd1dWcuZGU+CisKKwkqIGNvbmZpZy5saW5rczogU3VwcG9ydCBmb3IgcHBjIHdpdGggRUxGCisJKiBwb3dlcnBjMzIvc3ludGF4Lmg6IE5ldy4KKwkqIHBvd2VycGMzMi8qLlM6IEFwcGxpZWQgRUxGIHBhdGNoZXMgKGdsaWJjIHBhdGNoZXMpCisKK1R1ZSBOb3YgMTAgMTk6MzE6MzcgMTk5OCAgV2VybmVyIEtvY2ggICh3a0Bpc2lsLmQuc2h1dHRsZS5kZSkKKworCSogcG93ZXIqLyA6IFN0YXJ0ZWQgd2l0aCBzdHVmZiBmb3IgUFBDCisJKiBjb25maWcubGlua3M6IFNvbWUgc3R1ZmYgZm9yIFBQQy4KKwkqIGdlbmVyaWMvdWRpdi13LXNkaXYuYzogTmV3IGJ1dCBkaXNhYmxlZC4KKworVHVlIE9jdCAyNyAxMjozNzo0NiAxOTk4ICBXZXJuZXIgS29jaCAgKHdrQGlzaWwuZC5zaHV0dGxlLmRlKQorCisJKiBjb25maWcubGlua3MgKGZyZWVic2QpOiBGaXhlcyBmb3IgRnJlZUJTRCAzLjAKKworV2VkIE9jdCAxNCAwOTo1OTozMCAxOTk4ICBXZXJuZXIgS29jaCAgKHdrQGlzaWwuZC5zaHV0dGxlLmRlKQorCisJKiBjb25maWcubGlua3MgKGZyZWVic2QpOiBFTEYgcGF0Y2hlcyBmcm9tIEp1biBLdXJpeWFtYS4KKworVGh1IE9jdCAgOCAxMzoyODoxNyAxOTk4ICBXZXJuZXIgS29jaCAgKHdrQGlzaWwuZC5zaHV0dGxlLmRlKQorCisJKiBtcGktbXBvdy5jIChtcGlfbXVscG93bSk6IEZpeGVkIG1lbSBsZWFrIChtX2ZyZWUvbXBpX2ZyZWUpLgorCitUaHUgU2VwIDE3IDE4OjA4OjUwIDE5OTggIFdlcm5lciBLb2NoICAod2tAKG5vbmUpKQorCisJKiBocHBhMS4xL3VkaXYtcXJubmQuUzogRml4IGZyb20gU3RlZmZlbiBaYWhuIGZvciBIUFVYIDEwLjIwCisKK1RodSBBdWcgIDYgMTY6Mzk6MjggMTk5OCAgV2VybmVyIEtvY2gsbW9iaWwsLCwJKHdrQHRvYm9sZCkKKworCSogbXBpLWJpdC5jIChtcGlfc2V0X2J5dGVzKTogUmVtb3ZlZC4KKworV2VkIEF1ZyAgNSAxNToxMToxMiAxOTk4ICBXZXJuZXIgS29jaCAgKHdrQChub25lKSkKKworCSogbXBpY29kZXIuYyAobXBpX3JlYWRfZnJvbV9idWZmZXIpOiBOZXcuCisKKwkqIG1waXV0aWwuYyAobXBpX3NldF9vcGFxdWUpOiBOZXcuCisJKG1waV9nZXRfb3BhcXVlKTogTmV3LgorCShtcGlfY29weSk6IENoYW5nZWQgdG8gc3VwcG9ydCBvcGF1cWUgZmxhZworCShtcGlfZnJlZSk6IERpdHRvLgorCitTYXQgSnVsICA0IDEwOjExOjExIDE5OTggIFdlcm5lciBLb2NoICAod2tAaXNpbC5kLnNodXR0bGUuZGUpCisKKwkqIG1waXV0aWwuYyAobXBpX2NsZWFyKTogUmVzZXQgZmxhZ3MuCisJKG1waV9zZXQpOiBEaXR0by4KKwkobXBpX2FsbG9jX3NlY3VyZSk6IFNldCBmbGFnIHRvIDEgYW5kIG5vdCBvcmVkIHRoZSAxIGluLCB0c3NzLi4KKworRnJpIEp1biAyNiAxMToxOTowNiAxOTk4ICBXZXJuZXIgS29jaCAgKHdrQGlzaWwuZC5zaHV0dGxlLmRlKQorCisJKiBtcGl1dGlsLmMgKG1waV9hbGxvYyk6IHNldCBuYml0cyB0byAwLgorCShtcGlfYWxsb2Nfc2VjdXJlKTogRGl0dG8uCisJKG1waV9jbGVhcik6IERpdHRvLgorCitUaHUgSnVuIDI1IDExOjUwOjAxIDE5OTggIFdlcm5lciBLb2NoICAod2tAaXNpbC5kLnNodXR0bGUuZGUpCisKKwkqIG1pcHMzLyouUzogTmV3CisKK01vbiBNYXkgMTggMTM6NDc6MDYgMTk5OCAgV2VybmVyIEtvY2ggICh3a0Bpc2lsLmQuc2h1dHRsZS5kZSkKKworCSogY29uZmlnLmxpbmtzOiBzcGxpdCBtcGloLXNoaWZ0IGludG8gbXBpaC1bbHJdc2hpZnQgYW5kCisJY2hhbmdlZCBhbGwgaW1wbGVtZW50YXRpb25zLgorCSogbXBpL2FscGhhOiBhZGQgc29tZSBuZXcgYXNzZW1ibGVyIHN0dWZmLgorCitXZWQgTWF5IDEzIDExOjA0OjI5IDE5OTggIFdlcm5lciBLb2NoICAod2tAaXNpbC5kLnNodXR0bGUuZGUpCisKKwkqIGNvbmZpZy5saW5rczogQWRkIHN1cHBvcnQgZm9yIE1JUFMKKworVGh1IEFwciAgOSAxMTozMTozNiAxOTk4ICBXZXJuZXIgS29jaCAgKHdrQGlzaWwuZC5zaHV0dGxlLmRlKQorCisJKiBtcGljb2Rlci5jIChtcGlfZ2V0X3NlY3VyZV9idWZmZXIpOiBOZXcuCisKK1dlZCBBcHIgIDggMDk6NDQ6MzMgMTk5OCAgV2VybmVyIEtvY2ggICh3a0Bpc2lsLmQuc2h1dHRsZS5kZSkKKworCSogY29uZmlnLmxpbmtzOiBBcHBsaWVkIHNtYWxsIGZpeCBmcm9tIFVsZiBNw7ZsbGVyLgorCitNb24gQXByICA2IDEyOjM4OjUyIDE5OTggIFdlcm5lciBLb2NoICAod2tAaXNpbC5kLnNodXR0bGUuZGUpCisKKwkqIG1waWNvZGVyLmMgKG1waV9nZXRfYnVmZmVyKTogUmVtb3ZlZCByZXR1cm5lZCBsZWFkaW5nIHplcm9lcworCWFuZCBjaGFuZ2VkIGFsbCBjYWxsZXJzLgorCitUdWUgTWFyIDEwIDEzOjQwOjM0IDE5OTggIFdlcm5lciBLb2NoICAod2tAaXNpbC5kLnNodXR0bGUuZGUpCisKKwkqIG1waS1iaXQuYyAobXBpX2NsZWFyX2hpZ2hiaXQpOiBOZXcuCisKK01vbiBNYXIgIDIgMTk6Mjk6MDAgMTk5OCAgV2VybmVyIEtvY2ggICh3a0Bpc2lsLmQuc2h1dHRsZS5kZSkKKworCSogTWFrZWZpbGUuYW0gKERJU1RDTEVBTkZJTEVTKTogTmV3CisKK1RodSBGZWIgMjYgMDY6NDg6NTQgMTk5OCAgV2VybmVyIEtvY2ggICh3a0Bpc2lsLmQuc2h1dHRsZS5kZSkKKworCSogY29uZmlnLmxpbmtzIChYODZfQlJPS0VOX0FMSUdOKTogQWRkZWQgZm9yIHNvbWUgc3lzdGVtcy4KKworTW9uIEZlYiAyMyAxMjoyMTo0MCAxOTk4ICBXZXJuZXIgS29jaCAgKHdrQGlzaWwuZC5zaHV0dGxlLmRlKQorCisJKiBtcGkvbTY4ay9tcGloLXNoaWZ0LlMgKExzcGVjaWFsKTogQ2hhbmdlZCBkdXBsaWNhdGUgc3ltYm9sLgorCitNb24gRmViIDE2IDEzOjAwOjI3IDE5OTggIFdlcm5lciBLb2NoICAod2tAaXNpbC5kLnNodXR0bGUuZGUpCisKKwkqIGNvbmZpZy5saW5rcyA6IEFkZCBkZXRlY3Rpb24gb2YgbTY4ayBjcHVzCisKKworIENvcHlyaWdodCAxOTk4LDE5OTksMjAwMCwyMDAxLDIwMDIsMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRoZSBhdXRob3IgZ2l2ZXMKKyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0IGV2ZW4gdGhlCisgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL01ha2VmaWxlLmFtIGIvbGliZ2NyeXB0LTEuNC42L21waS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGZjNWRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDE3NyBAQAorIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBwcm9kdWNlIE1ha2VmaWxlLmluCisjIENvcHlyaWdodCAoQykgMTk5MiwgMTk5OSwgMjAwMCwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorIworIyBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKworIyAxLjUgbGVhZHMgdG8gYSBjb21iaW5hdG9yaWFsIGV4cGxvc2lvbiBkdWUgdG8gYWxsIHRoZSBjb25kaXRpb25hbHMKKyMgSSB3YXMgbm90IGFibGUgdG8gYnVpbGQgaXQgd2l0aCA2NE1lZ3MgLSAxLjYgZml4ZXMgdGhpcy4KKyMgbm90IGFueW1vcmUgcmVxdWlyZWQ6IEFVVE9NQUtFX09QVElPTlMgPSAxLjYKKworIyBOZWVkIHRvIGluY2x1ZGUgLi4vc3JjIGluIGFkZGl0aW9uIHRvIHRvcF9zcmNkaXIgYmVjYXVzZSBnY3J5cHQuaCBpcworIyBhIGJ1aWx0IGhlYWRlci4KK0FNX0NQUEZMQUdTID0gLUkuLi9zcmMgLUkkKHRvcF9zcmNkaXIpL3NyYworQU1fQ0ZMQUdTID0gJChHUEdfRVJST1JfQ0ZMQUdTKQorCitBTV9BU0ZMQUdTID0gJChNUElfU0ZMQUdTKQorQU1fQ0NBU0ZMQUdTID0gJChOT0VYRUNTVEFDS19GTEFHUykKKworRVhUUkFfRElTVCA9IE1hbmlmZXN0IGNvbmZpZy5saW5rcworRElTVENMRUFORklMRVMgPSBtcGktYXNtLWRlZnMuaCBcCisgICAgICAgICAgICAgICAgIG1waWgtYWRkMS1hc20uUyBtcGloLW11bDEtYXNtLlMgbXBpaC1tdWwyLWFzbS5TIG1waWgtbXVsMy1hc20uUyAgXAorCQkgbXBpaC1sc2hpZnQtYXNtLlMgbXBpaC1yc2hpZnQtYXNtLlMgbXBpaC1zdWIxLWFzbS5TIGFzbS1zeW50YXguaCBcCisgICAgICAgICAgICAgICAgIG1waWgtYWRkMS5jIG1waWgtbXVsMS5jIG1waWgtbXVsMi5jIG1waWgtbXVsMy5jICBcCisJCSBtcGloLWxzaGlmdC5jIG1waWgtcnNoaWZ0LmMgbXBpaC1zdWIxLmMgXAorCSAgICAgICAgIHN5c2RlcC5oIG1vZC1zb3VyY2UtaW5mby5oCisKKyMgQmV3YXJlOiBUaGUgZm9sbG93aW5nIGxpc3QgaXMgbm90IGEgY29tbWVudCBidXQgZ3JlcHBlZCBieQorIyAgICAgICAgIGNvbmZpZy5saW5rcyB0byBnZXQgdGhlIGxpc3Qgb2Ygc3ltbGlua2VkIG1vZHVsZXMKKyMgICAgICAgICBPcHRpb25hbCBtb2R1bGVzIGFyZSBtYXJrZWQgd2l0aCBhbiBPIGluIHRoZSBzZWNvbmQgY29sdW1uLgorI0JFR0lOX0FTTV9MSVNUCisjIG1waWgtYWRkMSAgICBDCisjIG1waWgtc3ViMSAgICBDCisjIG1waWgtbXVsMSAgICBDCisjIG1waWgtbXVsMiAgICBDCisjIG1waWgtbXVsMyAgICBDCisjIG1waWgtbHNoaWZ0ICBDCisjIG1waWgtcnNoaWZ0ICBDCisjIHVkaXYgICAgICAgICBPCisjIHVkaXYtcXJubmQgICBPCisjRU5EX0FTTV9MSVNUCisKKyMgTm90ZTogVGhpcyBmdW5jdGlvbiBoYXMgbm90IHlldCBiZWVuIGltcGxlbWVudGVkLiAgVGhlcmUgaXMgb25seSBhIGR1bW15IGluCisjIGdlbmVyaWMvCisjIHVkaXYtdy1zZGl2ICBPCisKKyMgQW5kIHdlIG5lZWQgdG8gaGF2ZSBjb25kaXRpb25hbHMgZm9yIGFsbCBtb2R1bGVzIGJlY2F1c2UKKyMgd2UgZG9uJ3Qga25vdyB3aGV0aGVyIHRoZXkgYXJlIC5jIG9yIC5TLiAgVmVyeSB1Z2x5OyBJIGtub3cuCisjIFJlbWVtYmVyIHRvIGRlZmluZSB0aGVtIGFsbCBpbiBjb25maWd1cmUuYWMKK2lmIE1QSV9NT0RfQVNNX01QSUhfQUREMQorbXBpaF9hZGQxID0gbXBpaC1hZGQxLWFzbS5TCitlbHNlCitpZiBNUElfTU9EX0NfTVBJSF9BREQxCittcGloX2FkZDEgPSBtcGloLWFkZDEuYworZWxzZQorbXBpaF9hZGQxID0gCitlbmRpZgorZW5kaWYKKworaWYgTVBJX01PRF9BU01fTVBJSF9TVUIxCittcGloX3N1YjEgPSBtcGloLXN1YjEtYXNtLlMKK2Vsc2UKK2lmIE1QSV9NT0RfQ19NUElIX1NVQjEKK21waWhfc3ViMSA9IG1waWgtc3ViMS5jCitlbHNlCittcGloX3N1YjEgPSAKK2VuZGlmCitlbmRpZgorCitpZiBNUElfTU9EX0FTTV9NUElIX01VTDEKK21waWhfbXVsMSA9IG1waWgtbXVsMS1hc20uUworZWxzZQoraWYgTVBJX01PRF9DX01QSUhfTVVMMQorbXBpaF9tdWwxID0gbXBpaC1tdWwxLmMKK2Vsc2UKK21waWhfbXVsMSA9IAorZW5kaWYKK2VuZGlmCisKK2lmIE1QSV9NT0RfQVNNX01QSUhfTVVMMgorbXBpaF9tdWwyID0gbXBpaC1tdWwyLWFzbS5TCitlbHNlCitpZiBNUElfTU9EX0NfTVBJSF9NVUwyCittcGloX211bDIgPSBtcGloLW11bDIuYworZWxzZQorbXBpaF9tdWwyID0gCitlbmRpZgorZW5kaWYKKworaWYgTVBJX01PRF9BU01fTVBJSF9NVUwzCittcGloX211bDMgPSBtcGloLW11bDMtYXNtLlMKK2Vsc2UKK2lmIE1QSV9NT0RfQ19NUElIX01VTDMKK21waWhfbXVsMyA9IG1waWgtbXVsMy5jCitlbHNlCittcGloX211bDMgPSAKK2VuZGlmCitlbmRpZgorCitpZiBNUElfTU9EX0FTTV9NUElIX0xTSElGVAorbXBpaF9sc2hpZnQgPSBtcGloLWxzaGlmdC1hc20uUworZWxzZQoraWYgTVBJX01PRF9DX01QSUhfTFNISUZUCittcGloX2xzaGlmdCA9IG1waWgtbHNoaWZ0LmMKK2Vsc2UKK21waWhfbHNoaWZ0ID0gCitlbmRpZgorZW5kaWYKKworaWYgTVBJX01PRF9BU01fTVBJSF9SU0hJRlQKK21waWhfcnNoaWZ0ID0gbXBpaC1yc2hpZnQtYXNtLlMKK2Vsc2UKK2lmIE1QSV9NT0RfQ19NUElIX1JTSElGVAorbXBpaF9yc2hpZnQgPSBtcGloLXJzaGlmdC5jCitlbHNlCittcGloX3JzaGlmdCA9IAorZW5kaWYKK2VuZGlmCisKK2lmIE1QSV9NT0RfQVNNX1VESVYKK3VkaXYgPSB1ZGl2LWFzbS5TCitlbHNlCitpZiBNUElfTU9EX0NfVURJVgordWRpdiA9IHVkaXYuYworZWxzZQordWRpdiA9IAorZW5kaWYKK2VuZGlmCisKK2lmIE1QSV9NT0RfQVNNX1VESVZfUVJOTkQKK3VkaXZfcXJubmQgPSB1ZGl2LXFybm5kLWFzbS5TCitlbHNlCitpZiBNUElfTU9EX0NfVURJVl9RUk5ORAordWRpdl9xcm5uZCA9IHVkaXYtcXJubmQuYworZWxzZQordWRpdl9xcm5uZCA9IAorZW5kaWYKK2VuZGlmCisKK25vaW5zdF9MVExJQlJBUklFUyA9IGxpYm1waS5sYQorCitsaWJtcGlfbGFfTERGTEFHUyA9Citub2Rpc3RfbGlibXBpX2xhX1NPVVJDRVMgPSAkKG1waWhfYWRkMSkgJChtcGloX3N1YjEpICQobXBpaF9tdWwxKSBcCisJJChtcGloX211bDIpICQobXBpaF9tdWwzKSAkKG1waWhfbHNoaWZ0KSAkKG1waWhfcnNoaWZ0KSBcCisJJCh1ZGl2KSAkKHVkaXZfcXJubmQpCitsaWJtcGlfbGFfU09VUkNFUyA9IGxvbmdsb25nLmgJICAgXAorCSAgICAgIG1waS1hZGQuYyAgICAgIFwKKwkgICAgICBtcGktYml0LmMgICAgICBcCisJICAgICAgbXBpLWNtcC5jICAgICAgXAorCSAgICAgIG1waS1kaXYuYyAgICAgIFwKKwkgICAgICBtcGktZ2NkLmMgICAgICBcCisJICAgICAgbXBpLWludGVybmFsLmggXAorCSAgICAgIG1waS1pbmxpbmUuaCAgIFwKKwkgICAgICBtcGktaW5saW5lLmMgICBcCisJICAgICAgbXBpLWludi5jICAgICAgXAorCSAgICAgIG1waS1tdWwuYyAgICAgIFwKKwkgICAgICBtcGktbW9kLmMgICAgICBcCisJICAgICAgbXBpLXBvdy5jICAgICAgXAorCSAgICAgIG1waS1tcG93LmMgICAgIFwKKwkgICAgICBtcGktc2Nhbi5jICAgICBcCisJICAgICAgbXBpY29kZXIuYyAgICAgXAorCSAgICAgIG1waWgtZGl2LmMgICAgIFwKKwkgICAgICBtcGloLW11bC5jICAgICBcCisJICAgICAgbXBpdXRpbC5jICAgICAgXAorICAgICAgICAgICAgICBlYy5jCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL01ha2VmaWxlLmluIGIvbGliZ2NyeXB0LTEuNC42L21waS9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODA0YWVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDY3MiBAQAorIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYnkgYXV0b21ha2UgMS4xMC4yIGZyb20gTWFrZWZpbGUuYW0uCisjIEBjb25maWd1cmVfaW5wdXRACisKKyMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAorIyAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKKyMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorIyBQQVJUSUNVTEFSIFBVUlBPU0UuCisKK0BTRVRfTUFLRUAKKworIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTksIDIwMDAsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyMKKyMgTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisKKyMgMS41IGxlYWRzIHRvIGEgY29tYmluYXRvcmlhbCBleHBsb3Npb24gZHVlIHRvIGFsbCB0aGUgY29uZGl0aW9uYWxzCisjIEkgd2FzIG5vdCBhYmxlIHRvIGJ1aWxkIGl0IHdpdGggNjRNZWdzIC0gMS42IGZpeGVzIHRoaXMuCisjIG5vdCBhbnltb3JlIHJlcXVpcmVkOiBBVVRPTUFLRV9PUFRJT05TID0gMS42CisKK1ZQQVRIID0gQHNyY2RpckAKK3BrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAorcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAorcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACithbV9fY2QgPSBDRFBBVEg9IiQke1pTSF9WRVJTSU9OKy59JChQQVRIX1NFUEFSQVRPUikiICYmIGNkCitpbnN0YWxsX3NoX0RBVEEgPSAkKGluc3RhbGxfc2gpIC1jIC1tIDY0NAoraW5zdGFsbF9zaF9QUk9HUkFNID0gJChpbnN0YWxsX3NoKSAtYworaW5zdGFsbF9zaF9TQ1JJUFQgPSAkKGluc3RhbGxfc2gpIC1jCitJTlNUQUxMX0hFQURFUiA9ICQoSU5TVEFMTF9EQVRBKQordHJhbnNmb3JtID0gJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKQorTk9STUFMX0lOU1RBTEwgPSA6CitQUkVfSU5TVEFMTCA9IDoKK1BPU1RfSU5TVEFMTCA9IDoKK05PUk1BTF9VTklOU1RBTEwgPSA6CitQUkVfVU5JTlNUQUxMID0gOgorUE9TVF9VTklOU1RBTEwgPSA6CitidWlsZF90cmlwbGV0ID0gQGJ1aWxkQAoraG9zdF90cmlwbGV0ID0gQGhvc3RACitzdWJkaXIgPSBtcGkKK0RJU1RfQ09NTU9OID0gJChzcmNkaXIpL01ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5pbiBDaGFuZ2VMb2cKK0FDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKK2FtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL200L2xpYnRvb2wubTQgXAorCSQodG9wX3NyY2RpcikvbTQvbm9leGVjc3RhY2subTQgJCh0b3Bfc3JjZGlyKS9tNC9vbmNlb25seS5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9zb2NrbGVuLm00ICQodG9wX3NyY2RpcikvbTQvc3lzX3NvY2tldF9oLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjaW5jbHVkZS5tNCAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5hYworYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKKwkkKEFDTE9DQUxfTTQpCitta2luc3RhbGxkaXJzID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzCitDT05GSUdfSEVBREVSID0gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5oCitDT05GSUdfQ0xFQU5fRklMRVMgPQorTFRMSUJSQVJJRVMgPSAkKG5vaW5zdF9MVExJQlJBUklFUykKK2xpYm1waV9sYV9MSUJBREQgPQorYW1fbGlibXBpX2xhX09CSkVDVFMgPSBtcGktYWRkLmxvIG1waS1iaXQubG8gbXBpLWNtcC5sbyBtcGktZGl2LmxvIFwKKwltcGktZ2NkLmxvIG1waS1pbmxpbmUubG8gbXBpLWludi5sbyBtcGktbXVsLmxvIG1waS1tb2QubG8gXAorCW1waS1wb3cubG8gbXBpLW1wb3cubG8gbXBpLXNjYW4ubG8gbXBpY29kZXIubG8gbXBpaC1kaXYubG8gXAorCW1waWgtbXVsLmxvIG1waXV0aWwubG8gZWMubG8KK0BNUElfTU9EX0FTTV9NUElIX0FERDFfRkFMU0VAQE1QSV9NT0RfQ19NUElIX0FERDFfVFJVRUBhbV9fb2JqZWN0c18xID0gbXBpaC1hZGQxLmxvCitATVBJX01PRF9BU01fTVBJSF9BREQxX1RSVUVAYW1fX29iamVjdHNfMSA9IG1waWgtYWRkMS1hc20ubG8KK0BNUElfTU9EX0FTTV9NUElIX1NVQjFfRkFMU0VAQE1QSV9NT0RfQ19NUElIX1NVQjFfVFJVRUBhbV9fb2JqZWN0c18yID0gbXBpaC1zdWIxLmxvCitATVBJX01PRF9BU01fTVBJSF9TVUIxX1RSVUVAYW1fX29iamVjdHNfMiA9IG1waWgtc3ViMS1hc20ubG8KK0BNUElfTU9EX0FTTV9NUElIX01VTDFfRkFMU0VAQE1QSV9NT0RfQ19NUElIX01VTDFfVFJVRUBhbV9fb2JqZWN0c18zID0gbXBpaC1tdWwxLmxvCitATVBJX01PRF9BU01fTVBJSF9NVUwxX1RSVUVAYW1fX29iamVjdHNfMyA9IG1waWgtbXVsMS1hc20ubG8KK0BNUElfTU9EX0FTTV9NUElIX01VTDJfRkFMU0VAQE1QSV9NT0RfQ19NUElIX01VTDJfVFJVRUBhbV9fb2JqZWN0c180ID0gbXBpaC1tdWwyLmxvCitATVBJX01PRF9BU01fTVBJSF9NVUwyX1RSVUVAYW1fX29iamVjdHNfNCA9IG1waWgtbXVsMi1hc20ubG8KK0BNUElfTU9EX0FTTV9NUElIX01VTDNfRkFMU0VAQE1QSV9NT0RfQ19NUElIX01VTDNfVFJVRUBhbV9fb2JqZWN0c181ID0gbXBpaC1tdWwzLmxvCitATVBJX01PRF9BU01fTVBJSF9NVUwzX1RSVUVAYW1fX29iamVjdHNfNSA9IG1waWgtbXVsMy1hc20ubG8KK0BNUElfTU9EX0FTTV9NUElIX0xTSElGVF9GQUxTRUBATVBJX01PRF9DX01QSUhfTFNISUZUX1RSVUVAYW1fX29iamVjdHNfNiA9IG1waWgtbHNoaWZ0LmxvCitATVBJX01PRF9BU01fTVBJSF9MU0hJRlRfVFJVRUBhbV9fb2JqZWN0c182ID0gbXBpaC1sc2hpZnQtYXNtLmxvCitATVBJX01PRF9BU01fTVBJSF9SU0hJRlRfRkFMU0VAQE1QSV9NT0RfQ19NUElIX1JTSElGVF9UUlVFQGFtX19vYmplY3RzXzcgPSBtcGloLXJzaGlmdC5sbworQE1QSV9NT0RfQVNNX01QSUhfUlNISUZUX1RSVUVAYW1fX29iamVjdHNfNyA9IG1waWgtcnNoaWZ0LWFzbS5sbworQE1QSV9NT0RfQVNNX1VESVZfRkFMU0VAQE1QSV9NT0RfQ19VRElWX1RSVUVAYW1fX29iamVjdHNfOCA9IHVkaXYubG8KK0BNUElfTU9EX0FTTV9VRElWX1RSVUVAYW1fX29iamVjdHNfOCA9IHVkaXYtYXNtLmxvCitATVBJX01PRF9BU01fVURJVl9RUk5ORF9GQUxTRUBATVBJX01PRF9DX1VESVZfUVJOTkRfVFJVRUBhbV9fb2JqZWN0c185ID0gdWRpdi1xcm5uZC5sbworQE1QSV9NT0RfQVNNX1VESVZfUVJOTkRfVFJVRUBhbV9fb2JqZWN0c185ID0gdWRpdi1xcm5uZC1hc20ubG8KK25vZGlzdF9saWJtcGlfbGFfT0JKRUNUUyA9ICQoYW1fX29iamVjdHNfMSkgJChhbV9fb2JqZWN0c18yKSBcCisJJChhbV9fb2JqZWN0c18zKSAkKGFtX19vYmplY3RzXzQpICQoYW1fX29iamVjdHNfNSkgXAorCSQoYW1fX29iamVjdHNfNikgJChhbV9fb2JqZWN0c183KSAkKGFtX19vYmplY3RzXzgpIFwKKwkkKGFtX19vYmplY3RzXzkpCitsaWJtcGlfbGFfT0JKRUNUUyA9ICQoYW1fbGlibXBpX2xhX09CSkVDVFMpIFwKKwkkKG5vZGlzdF9saWJtcGlfbGFfT0JKRUNUUykKK2xpYm1waV9sYV9MSU5LID0gJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgXAorCSQoTElCVE9PTEZMQUdTKSAtLW1vZGU9bGluayAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgXAorCSQobGlibXBpX2xhX0xERkxBR1MpICQoTERGTEFHUykgLW8gJEAKK0RFRkFVTFRfSU5DTFVERVMgPSAtSS5AYW1fX2lzcmNAIC1JJCh0b3BfYnVpbGRkaXIpCitkZXBjb21wID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS9kZXBjb21wCithbV9fZGVwZmlsZXNfbWF5YmUgPSBkZXBmaWxlcworQ1BQQVNDT01QSUxFID0gJChDQ0FTKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgXAorCSQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0NBU0ZMQUdTKSAkKENDQVNGTEFHUykKK0xUQ1BQQVNDT01QSUxFID0gJChMSUJUT09MKSAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIFwKKwktLW1vZGU9Y29tcGlsZSAkKENDQVMpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSBcCisJJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DQ0FTRkxBR1MpICQoQ0NBU0ZMQUdTKQorQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSBcCisJJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQorTFRDT01QSUxFID0gJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIFwKKwktLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgXAorCSQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKK0NDTEQgPSAkKENDKQorTElOSyA9ICQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSBcCisJLS1tb2RlPWxpbmsgJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpICQoQU1fTERGTEFHUykgXAorCSQoTERGTEFHUykgLW8gJEAKK1NPVVJDRVMgPSAkKGxpYm1waV9sYV9TT1VSQ0VTKSAkKG5vZGlzdF9saWJtcGlfbGFfU09VUkNFUykKK0RJU1RfU09VUkNFUyA9ICQobGlibXBpX2xhX1NPVVJDRVMpCitFVEFHUyA9IGV0YWdzCitDVEFHUyA9IGN0YWdzCitESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQorQUNMT0NBTCA9IEBBQ0xPQ0FMQAorQU1UQVIgPSBAQU1UQVJACitBUiA9IEBBUkAKK0FTID0gQEFTQAorQVVUT0NPTkYgPSBAQVVUT0NPTkZACitBVVRPSEVBREVSID0gQEFVVE9IRUFERVJACitBVVRPTUFLRSA9IEBBVVRPTUFLRUAKK0FXSyA9IEBBV0tACitCVUlMRF9GSUxFVkVSU0lPTiA9IEBCVUlMRF9GSUxFVkVSU0lPTkAKK0JVSUxEX1JFVklTSU9OID0gQEJVSUxEX1JFVklTSU9OQAorQlVJTERfVElNRVNUQU1QID0gQEJVSUxEX1RJTUVTVEFNUEAKK0NDID0gQENDQAorQ0NBUyA9IEBDQ0FTQAorQ0NBU0RFUE1PREUgPSBAQ0NBU0RFUE1PREVACitDQ0FTRkxBR1MgPSBAQ0NBU0ZMQUdTQAorQ0NERVBNT0RFID0gQENDREVQTU9ERUAKK0NGTEFHUyA9IEBDRkxBR1NACitDUFAgPSBAQ1BQQAorQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACitDWFggPSBAQ1hYQAorQ1hYQ1BQID0gQENYWENQUEAKK0NYWERFUE1PREUgPSBAQ1hYREVQTU9ERUAKK0NYWEZMQUdTID0gQENYWEZMQUdTQAorQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKK0RFRlMgPSBAREVGU0AKK0RFUERJUiA9IEBERVBESVJACitETExUT09MID0gQERMTFRPT0xACitETF9MSUJTID0gQERMX0xJQlNACitFQ0hPID0gQEVDSE9ACitFQ0hPX0MgPSBARUNIT19DQAorRUNIT19OID0gQEVDSE9fTkAKK0VDSE9fVCA9IEBFQ0hPX1RACitFR1JFUCA9IEBFR1JFUEAKK0VYRUVYVCA9IEBFWEVFWFRACitGNzcgPSBARjc3QAorRkFMTEJBQ0tfU09DS0xFTl9UID0gQEZBTExCQUNLX1NPQ0tMRU5fVEAKK0ZGTEFHUyA9IEBGRkxBR1NACitHQ1JZUFRfQ0lQSEVSUyA9IEBHQ1JZUFRfQ0lQSEVSU0AKK0dDUllQVF9ESUdFU1RTID0gQEdDUllQVF9ESUdFU1RTQAorR0NSWVBUX1BVQktFWV9DSVBIRVJTID0gQEdDUllQVF9QVUJLRVlfQ0lQSEVSU0AKK0dDUllQVF9SQU5ET00gPSBAR0NSWVBUX1JBTkRPTUAKK0dQR19FUlJPUl9DRkxBR1MgPSBAR1BHX0VSUk9SX0NGTEFHU0AKK0dQR19FUlJPUl9DT05GSUcgPSBAR1BHX0VSUk9SX0NPTkZJR0AKK0dQR19FUlJPUl9MSUJTID0gQEdQR19FUlJPUl9MSUJTQAorR1JFUCA9IEBHUkVQQAorSU5TVEFMTCA9IEBJTlNUQUxMQAorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKK0lOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACitJTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKK0lOU1RBTExfU1RSSVBfUFJPR1JBTSA9IEBJTlNUQUxMX1NUUklQX1BST0dSQU1ACitMREZMQUdTID0gQExERkxBR1NACitMSUJHQ1JZUFRfQ0lQSEVSUyA9IEBMSUJHQ1JZUFRfQ0lQSEVSU0AKK0xJQkdDUllQVF9DT05GSUdfQVBJX1ZFUlNJT04gPSBATElCR0NSWVBUX0NPTkZJR19BUElfVkVSU0lPTkAKK0xJQkdDUllQVF9DT05GSUdfQ0ZMQUdTID0gQExJQkdDUllQVF9DT05GSUdfQ0ZMQUdTQAorTElCR0NSWVBUX0NPTkZJR19MSUJTID0gQExJQkdDUllQVF9DT05GSUdfTElCU0AKK0xJQkdDUllQVF9ESUdFU1RTID0gQExJQkdDUllQVF9ESUdFU1RTQAorTElCR0NSWVBUX0xUX0FHRSA9IEBMSUJHQ1JZUFRfTFRfQUdFQAorTElCR0NSWVBUX0xUX0NVUlJFTlQgPSBATElCR0NSWVBUX0xUX0NVUlJFTlRACitMSUJHQ1JZUFRfTFRfUkVWSVNJT04gPSBATElCR0NSWVBUX0xUX1JFVklTSU9OQAorTElCR0NSWVBUX1BVQktFWV9DSVBIRVJTID0gQExJQkdDUllQVF9QVUJLRVlfQ0lQSEVSU0AKK0xJQkdDUllQVF9USFJFQURfTU9EVUxFUyA9IEBMSUJHQ1JZUFRfVEhSRUFEX01PRFVMRVNACitMSUJPQkpTID0gQExJQk9CSlNACitMSUJTID0gQExJQlNACitMSUJUT09MID0gQExJQlRPT0xACitMTl9TID0gQExOX1NACitMVExJQk9CSlMgPSBATFRMSUJPQkpTQAorTUFJTlQgPSBATUFJTlRACitNQUtFSU5GTyA9IEBNQUtFSU5GT0AKK01LRElSX1AgPSBATUtESVJfUEAKK01QSV9TRkxBR1MgPSBATVBJX1NGTEFHU0AKK05PRVhFQ1NUQUNLX0ZMQUdTID0gQE5PRVhFQ1NUQUNLX0ZMQUdTQAorT0JKRFVNUCA9IEBPQkpEVU1QQAorT0JKRVhUID0gQE9CSkVYVEAKK1BBQ0tBR0UgPSBAUEFDS0FHRUAKK1BBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAorUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKK1BBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAorUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKK1BBQ0tBR0VfVVJMID0gQFBBQ0tBR0VfVVJMQAorUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKK1BBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAorUFRIX0NGTEFHUyA9IEBQVEhfQ0ZMQUdTQAorUFRIX0NPTkZJRyA9IEBQVEhfQ09ORklHQAorUFRIX0xJQlMgPSBAUFRIX0xJQlNACitSQU5MSUIgPSBAUkFOTElCQAorUkMgPSBAUkNACitTRVRfTUFLRSA9IEBTRVRfTUFLRUAKK1NIRUxMID0gQFNIRUxMQAorU1RSSVAgPSBAU1RSSVBACitTWVNfU09DS0VUX0ggPSBAU1lTX1NPQ0tFVF9IQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorYWJzX2J1aWxkZGlyID0gQGFic19idWlsZGRpckAKK2Fic19zcmNkaXIgPSBAYWJzX3NyY2RpckAKK2Fic190b3BfYnVpbGRkaXIgPSBAYWJzX3RvcF9idWlsZGRpckAKK2Fic190b3Bfc3JjZGlyID0gQGFic190b3Bfc3JjZGlyQAorYWNfY3RfQ0MgPSBAYWNfY3RfQ0NACithY19jdF9DWFggPSBAYWNfY3RfQ1hYQAorYWNfY3RfRjc3ID0gQGFjX2N0X0Y3N0AKK2FtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAorYW1fX2xlYWRpbmdfZG90ID0gQGFtX19sZWFkaW5nX2RvdEAKK2FtX19xdW90ZSA9IEBhbV9fcXVvdGVACithbV9fdGFyID0gQGFtX190YXJACithbV9fdW50YXIgPSBAYW1fX3VudGFyQAorYmluZGlyID0gQGJpbmRpckAKK2J1aWxkID0gQGJ1aWxkQAorYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACitidWlsZF9jcHUgPSBAYnVpbGRfY3B1QAorYnVpbGRfb3MgPSBAYnVpbGRfb3NACitidWlsZF92ZW5kb3IgPSBAYnVpbGRfdmVuZG9yQAorYnVpbGRkaXIgPSBAYnVpbGRkaXJACitkYXRhZGlyID0gQGRhdGFkaXJACitkYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKK2RvY2RpciA9IEBkb2NkaXJACitkdmlkaXIgPSBAZHZpZGlyQAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACitob3N0ID0gQGhvc3RACitob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACitob3N0X2NwdSA9IEBob3N0X2NwdUAKK2hvc3Rfb3MgPSBAaG9zdF9vc0AKK2hvc3RfdmVuZG9yID0gQGhvc3RfdmVuZG9yQAoraHRtbGRpciA9IEBodG1sZGlyQAoraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAoraW5mb2RpciA9IEBpbmZvZGlyQAoraW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAorbGliZGlyID0gQGxpYmRpckAKK2xpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKK2xvY2FsZWRpciA9IEBsb2NhbGVkaXJACitsb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACittYW5kaXIgPSBAbWFuZGlyQAorbWtkaXJfcCA9IEBta2Rpcl9wQAorb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAorcGRmZGlyID0gQHBkZmRpckAKK3ByZWZpeCA9IEBwcmVmaXhACitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACitwc2RpciA9IEBwc2RpckAKK3NiaW5kaXIgPSBAc2JpbmRpckAKK3NoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAorc3JjZGlyID0gQHNyY2RpckAKK3N5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKK3RhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACit0b3BfYnVpbGRfcHJlZml4ID0gQHRvcF9idWlsZF9wcmVmaXhACit0b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorCisjIE5lZWQgdG8gaW5jbHVkZSAuLi9zcmMgaW4gYWRkaXRpb24gdG8gdG9wX3NyY2RpciBiZWNhdXNlIGdjcnlwdC5oIGlzCisjIGEgYnVpbHQgaGVhZGVyLgorQU1fQ1BQRkxBR1MgPSAtSS4uL3NyYyAtSSQodG9wX3NyY2Rpcikvc3JjCitBTV9DRkxBR1MgPSAkKEdQR19FUlJPUl9DRkxBR1MpCitBTV9BU0ZMQUdTID0gJChNUElfU0ZMQUdTKQorQU1fQ0NBU0ZMQUdTID0gJChOT0VYRUNTVEFDS19GTEFHUykKK0VYVFJBX0RJU1QgPSBNYW5pZmVzdCBjb25maWcubGlua3MKK0RJU1RDTEVBTkZJTEVTID0gbXBpLWFzbS1kZWZzLmggXAorICAgICAgICAgICAgICAgICBtcGloLWFkZDEtYXNtLlMgbXBpaC1tdWwxLWFzbS5TIG1waWgtbXVsMi1hc20uUyBtcGloLW11bDMtYXNtLlMgIFwKKwkJIG1waWgtbHNoaWZ0LWFzbS5TIG1waWgtcnNoaWZ0LWFzbS5TIG1waWgtc3ViMS1hc20uUyBhc20tc3ludGF4LmggXAorICAgICAgICAgICAgICAgICBtcGloLWFkZDEuYyBtcGloLW11bDEuYyBtcGloLW11bDIuYyBtcGloLW11bDMuYyAgXAorCQkgbXBpaC1sc2hpZnQuYyBtcGloLXJzaGlmdC5jIG1waWgtc3ViMS5jIFwKKwkgICAgICAgICBzeXNkZXAuaCBtb2Qtc291cmNlLWluZm8uaAorCitATVBJX01PRF9BU01fTVBJSF9BREQxX0ZBTFNFQEBNUElfTU9EX0NfTVBJSF9BREQxX0ZBTFNFQG1waWhfYWRkMSA9IAorQE1QSV9NT0RfQVNNX01QSUhfQUREMV9GQUxTRUBATVBJX01PRF9DX01QSUhfQUREMV9UUlVFQG1waWhfYWRkMSA9IG1waWgtYWRkMS5jCisKKyMgQmV3YXJlOiBUaGUgZm9sbG93aW5nIGxpc3QgaXMgbm90IGEgY29tbWVudCBidXQgZ3JlcHBlZCBieQorIyAgICAgICAgIGNvbmZpZy5saW5rcyB0byBnZXQgdGhlIGxpc3Qgb2Ygc3ltbGlua2VkIG1vZHVsZXMKKyMgICAgICAgICBPcHRpb25hbCBtb2R1bGVzIGFyZSBtYXJrZWQgd2l0aCBhbiBPIGluIHRoZSBzZWNvbmQgY29sdW1uLgorI0JFR0lOX0FTTV9MSVNUCisjIG1waWgtYWRkMSAgICBDCisjIG1waWgtc3ViMSAgICBDCisjIG1waWgtbXVsMSAgICBDCisjIG1waWgtbXVsMiAgICBDCisjIG1waWgtbXVsMyAgICBDCisjIG1waWgtbHNoaWZ0ICBDCisjIG1waWgtcnNoaWZ0ICBDCisjIHVkaXYgICAgICAgICBPCisjIHVkaXYtcXJubmQgICBPCisjRU5EX0FTTV9MSVNUCisKKyMgTm90ZTogVGhpcyBmdW5jdGlvbiBoYXMgbm90IHlldCBiZWVuIGltcGxlbWVudGVkLiAgVGhlcmUgaXMgb25seSBhIGR1bW15IGluCisjIGdlbmVyaWMvCisjIHVkaXYtdy1zZGl2ICBPCisKKyMgQW5kIHdlIG5lZWQgdG8gaGF2ZSBjb25kaXRpb25hbHMgZm9yIGFsbCBtb2R1bGVzIGJlY2F1c2UKKyMgd2UgZG9uJ3Qga25vdyB3aGV0aGVyIHRoZXkgYXJlIC5jIG9yIC5TLiAgVmVyeSB1Z2x5OyBJIGtub3cuCisjIFJlbWVtYmVyIHRvIGRlZmluZSB0aGVtIGFsbCBpbiBjb25maWd1cmUuYWMKK0BNUElfTU9EX0FTTV9NUElIX0FERDFfVFJVRUBtcGloX2FkZDEgPSBtcGloLWFkZDEtYXNtLlMKK0BNUElfTU9EX0FTTV9NUElIX1NVQjFfRkFMU0VAQE1QSV9NT0RfQ19NUElIX1NVQjFfRkFMU0VAbXBpaF9zdWIxID0gCitATVBJX01PRF9BU01fTVBJSF9TVUIxX0ZBTFNFQEBNUElfTU9EX0NfTVBJSF9TVUIxX1RSVUVAbXBpaF9zdWIxID0gbXBpaC1zdWIxLmMKK0BNUElfTU9EX0FTTV9NUElIX1NVQjFfVFJVRUBtcGloX3N1YjEgPSBtcGloLXN1YjEtYXNtLlMKK0BNUElfTU9EX0FTTV9NUElIX01VTDFfRkFMU0VAQE1QSV9NT0RfQ19NUElIX01VTDFfRkFMU0VAbXBpaF9tdWwxID0gCitATVBJX01PRF9BU01fTVBJSF9NVUwxX0ZBTFNFQEBNUElfTU9EX0NfTVBJSF9NVUwxX1RSVUVAbXBpaF9tdWwxID0gbXBpaC1tdWwxLmMKK0BNUElfTU9EX0FTTV9NUElIX01VTDFfVFJVRUBtcGloX211bDEgPSBtcGloLW11bDEtYXNtLlMKK0BNUElfTU9EX0FTTV9NUElIX01VTDJfRkFMU0VAQE1QSV9NT0RfQ19NUElIX01VTDJfRkFMU0VAbXBpaF9tdWwyID0gCitATVBJX01PRF9BU01fTVBJSF9NVUwyX0ZBTFNFQEBNUElfTU9EX0NfTVBJSF9NVUwyX1RSVUVAbXBpaF9tdWwyID0gbXBpaC1tdWwyLmMKK0BNUElfTU9EX0FTTV9NUElIX01VTDJfVFJVRUBtcGloX211bDIgPSBtcGloLW11bDItYXNtLlMKK0BNUElfTU9EX0FTTV9NUElIX01VTDNfRkFMU0VAQE1QSV9NT0RfQ19NUElIX01VTDNfRkFMU0VAbXBpaF9tdWwzID0gCitATVBJX01PRF9BU01fTVBJSF9NVUwzX0ZBTFNFQEBNUElfTU9EX0NfTVBJSF9NVUwzX1RSVUVAbXBpaF9tdWwzID0gbXBpaC1tdWwzLmMKK0BNUElfTU9EX0FTTV9NUElIX01VTDNfVFJVRUBtcGloX211bDMgPSBtcGloLW11bDMtYXNtLlMKK0BNUElfTU9EX0FTTV9NUElIX0xTSElGVF9GQUxTRUBATVBJX01PRF9DX01QSUhfTFNISUZUX0ZBTFNFQG1waWhfbHNoaWZ0ID0gCitATVBJX01PRF9BU01fTVBJSF9MU0hJRlRfRkFMU0VAQE1QSV9NT0RfQ19NUElIX0xTSElGVF9UUlVFQG1waWhfbHNoaWZ0ID0gbXBpaC1sc2hpZnQuYworQE1QSV9NT0RfQVNNX01QSUhfTFNISUZUX1RSVUVAbXBpaF9sc2hpZnQgPSBtcGloLWxzaGlmdC1hc20uUworQE1QSV9NT0RfQVNNX01QSUhfUlNISUZUX0ZBTFNFQEBNUElfTU9EX0NfTVBJSF9SU0hJRlRfRkFMU0VAbXBpaF9yc2hpZnQgPSAKK0BNUElfTU9EX0FTTV9NUElIX1JTSElGVF9GQUxTRUBATVBJX01PRF9DX01QSUhfUlNISUZUX1RSVUVAbXBpaF9yc2hpZnQgPSBtcGloLXJzaGlmdC5jCitATVBJX01PRF9BU01fTVBJSF9SU0hJRlRfVFJVRUBtcGloX3JzaGlmdCA9IG1waWgtcnNoaWZ0LWFzbS5TCitATVBJX01PRF9BU01fVURJVl9GQUxTRUBATVBJX01PRF9DX1VESVZfRkFMU0VAdWRpdiA9IAorQE1QSV9NT0RfQVNNX1VESVZfRkFMU0VAQE1QSV9NT0RfQ19VRElWX1RSVUVAdWRpdiA9IHVkaXYuYworQE1QSV9NT0RfQVNNX1VESVZfVFJVRUB1ZGl2ID0gdWRpdi1hc20uUworQE1QSV9NT0RfQVNNX1VESVZfUVJOTkRfRkFMU0VAQE1QSV9NT0RfQ19VRElWX1FSTk5EX0ZBTFNFQHVkaXZfcXJubmQgPSAKK0BNUElfTU9EX0FTTV9VRElWX1FSTk5EX0ZBTFNFQEBNUElfTU9EX0NfVURJVl9RUk5ORF9UUlVFQHVkaXZfcXJubmQgPSB1ZGl2LXFybm5kLmMKK0BNUElfTU9EX0FTTV9VRElWX1FSTk5EX1RSVUVAdWRpdl9xcm5uZCA9IHVkaXYtcXJubmQtYXNtLlMKK25vaW5zdF9MVExJQlJBUklFUyA9IGxpYm1waS5sYQorbGlibXBpX2xhX0xERkxBR1MgPSAKK25vZGlzdF9saWJtcGlfbGFfU09VUkNFUyA9ICQobXBpaF9hZGQxKSAkKG1waWhfc3ViMSkgJChtcGloX211bDEpIFwKKwkkKG1waWhfbXVsMikgJChtcGloX211bDMpICQobXBpaF9sc2hpZnQpICQobXBpaF9yc2hpZnQpIFwKKwkkKHVkaXYpICQodWRpdl9xcm5uZCkKKworbGlibXBpX2xhX1NPVVJDRVMgPSBsb25nbG9uZy5oCSAgIFwKKwkgICAgICBtcGktYWRkLmMgICAgICBcCisJICAgICAgbXBpLWJpdC5jICAgICAgXAorCSAgICAgIG1waS1jbXAuYyAgICAgIFwKKwkgICAgICBtcGktZGl2LmMgICAgICBcCisJICAgICAgbXBpLWdjZC5jICAgICAgXAorCSAgICAgIG1waS1pbnRlcm5hbC5oIFwKKwkgICAgICBtcGktaW5saW5lLmggICBcCisJICAgICAgbXBpLWlubGluZS5jICAgXAorCSAgICAgIG1waS1pbnYuYyAgICAgIFwKKwkgICAgICBtcGktbXVsLmMgICAgICBcCisJICAgICAgbXBpLW1vZC5jICAgICAgXAorCSAgICAgIG1waS1wb3cuYyAgICAgIFwKKwkgICAgICBtcGktbXBvdy5jICAgICBcCisJICAgICAgbXBpLXNjYW4uYyAgICAgXAorCSAgICAgIG1waWNvZGVyLmMgICAgIFwKKwkgICAgICBtcGloLWRpdi5jICAgICBcCisJICAgICAgbXBpaC1tdWwuYyAgICAgXAorCSAgICAgIG1waXV0aWwuYyAgICAgIFwKKyAgICAgICAgICAgICAgZWMuYworCithbGw6IGFsbC1hbQorCisuU1VGRklYRVM6CisuU1VGRklYRVM6IC5TIC5jIC5sbyAubyAub2JqCiskKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChzcmNkaXIpL01ha2VmaWxlLmFtICAkKGFtX19jb25maWd1cmVfZGVwcykKKwlAZm9yIGRlcCBpbiAkPzsgZG8gXAorCSAgY2FzZSAnJChhbV9fY29uZmlndXJlX2RlcHMpJyBpbiBcCisJICAgICokJGRlcCopIFwKKwkgICAgICAoIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaCApIFwKKwkgICAgICAgICYmIHsgaWYgdGVzdCAtZiAkQDsgdGhlbiBleGl0IDA7IGVsc2UgYnJlYWs7IGZpOyB9OyBcCisJICAgICAgZXhpdCAxOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwllY2hvICcgY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWdudSAgbXBpL01ha2VmaWxlJzsgXAorCWNkICQodG9wX3NyY2RpcikgJiYgXAorCSAgJChBVVRPTUFLRSkgLS1nbnUgIG1waS9NYWtlZmlsZQorLlBSRUNJT1VTOiBNYWtlZmlsZQorTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCUBjYXNlICckPycgaW4gXAorCSAgKmNvbmZpZy5zdGF0dXMqKSBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaDs7IFwKKwkgICopIFwKKwkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAorCWVzYWM7CisKKyQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorCiskKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19jb25maWd1cmVfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fYWNsb2NhbF9tNF9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorCitjbGVhbi1ub2luc3RMVExJQlJBUklFUzoKKwktdGVzdCAteiAiJChub2luc3RfTFRMSUJSQVJJRVMpIiB8fCBybSAtZiAkKG5vaW5zdF9MVExJQlJBUklFUykKKwlAbGlzdD0nJChub2luc3RfTFRMSUJSQVJJRVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICBkaXI9ImBlY2hvICQkcCB8IHNlZCAtZSAnc3wvW14vXSokJHx8J2AiOyBcCisJICB0ZXN0ICIkJGRpciIgIT0gIiQkcCIgfHwgZGlyPS47IFwKKwkgIGVjaG8gInJtIC1mIFwiJCR7ZGlyfS9zb19sb2NhdGlvbnNcIiI7IFwKKwkgIHJtIC1mICIkJHtkaXJ9L3NvX2xvY2F0aW9ucyI7IFwKKwlkb25lCitsaWJtcGkubGE6ICQobGlibXBpX2xhX09CSkVDVFMpICQobGlibXBpX2xhX0RFUEVOREVOQ0lFUykgCisJJChsaWJtcGlfbGFfTElOSykgICQobGlibXBpX2xhX09CSkVDVFMpICQobGlibXBpX2xhX0xJQkFERCkgJChMSUJTKQorCittb3N0bHljbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLiQoT0JKRVhUKQorCitkaXN0Y2xlYW4tY29tcGlsZToKKwktcm0gLWYgKi50YWIuYworCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZWMuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9tcGktYWRkLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbXBpLWJpdC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL21waS1jbXAuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9tcGktZGl2LlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbXBpLWdjZC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL21waS1pbmxpbmUuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9tcGktaW52LlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbXBpLW1vZC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL21waS1tcG93LlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbXBpLW11bC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL21waS1wb3cuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9tcGktc2Nhbi5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL21waWNvZGVyLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbXBpaC1hZGQxLWFzbS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL21waWgtYWRkMS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL21waWgtZGl2LlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbXBpaC1sc2hpZnQtYXNtLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbXBpaC1sc2hpZnQuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9tcGloLW11bC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL21waWgtbXVsMS1hc20uUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9tcGloLW11bDEuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9tcGloLW11bDItYXNtLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbXBpaC1tdWwyLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbXBpaC1tdWwzLWFzbS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL21waWgtbXVsMy5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL21waWgtcnNoaWZ0LWFzbS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL21waWgtcnNoaWZ0LlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbXBpaC1zdWIxLWFzbS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL21waWgtc3ViMS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL21waXV0aWwuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS91ZGl2LWFzbS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3VkaXYtcXJubmQtYXNtLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvdWRpdi1xcm5uZC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3VkaXYuUGxvQGFtX19xdW90ZUAKKworLlMubzoKK0BhbV9fZmFzdGRlcENDQVNfVFJVRUAJJChDUFBBU0NPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8CitAYW1fX2Zhc3RkZXBDQ0FTX1RSVUVACW12IC1mICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ0FTX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDQVNfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0FTREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ0FTX0ZBTFNFQAkkKENQUEFTQ09NUElMRSkgLWMgLW8gJEAgJDwKKworLlMub2JqOgorQGFtX19mYXN0ZGVwQ0NBU19UUlVFQAkkKENQUEFTQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgYCQoQ1lHUEFUSF9XKSAnJDwnYAorQGFtX19mYXN0ZGVwQ0NBU19UUlVFQAltdiAtZiAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NBU19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ0FTX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NBU0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NBU19GQUxTRUAJJChDUFBBU0NPTVBJTEUpIC1jIC1vICRAIGAkKENZR1BBVEhfVykgJyQ8J2AKKworLlMubG86CitAYW1fX2Zhc3RkZXBDQ0FTX1RSVUVACSQoTFRDUFBBU0NPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8CitAYW1fX2Zhc3RkZXBDQ0FTX1RSVUVACW12IC1mICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBsbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NBU19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NBU19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDQVNERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDQVNfRkFMU0VACSQoTFRDUFBBU0NPTVBJTEUpIC1jIC1vICRAICQ8CisKKy5jLm86CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ09NUElMRSkgLWMgJDwKKworLmMub2JqOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCBgJChDWUdQQVRIX1cpICckPCdgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ09NUElMRSkgLWMgYCQoQ1lHUEFUSF9XKSAnJDwnYAorCisuYy5sbzoKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoTFRDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCAkPAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUGxvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTFRDT01QSUxFKSAtYyAtbyAkQCAkPAorCittb3N0bHljbGVhbi1saWJ0b29sOgorCS1ybSAtZiAqLmxvCisKK2NsZWFuLWxpYnRvb2w6CisJLXJtIC1yZiAubGlicyBfbGlicworCitJRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkgJChUQUdTX0ZJTEVTKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCW1raWQgLWZJRCAkJHVuaXF1ZQordGFnczogVEFHUworCitUQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCXRhZ3M9OyBcCisJaGVyZT1gcHdkYDsgXAorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCR0YWdzJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAorCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAorCSAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAorCSAgICAkJHRhZ3MgJCR1bmlxdWU7IFwKKwlmaQorY3RhZ3M6IENUQUdTCitDVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwl0YWdzPTsgXAorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwl0ZXN0IC16ICIkKENUQUdTX0FSR1MpJCR0YWdzJCR1bmlxdWUiIFwKKwkgIHx8ICQoQ1RBR1MpICQoQ1RBR1NGTEFHUykgJChBTV9DVEFHU0ZMQUdTKSAkKENUQUdTX0FSR1MpIFwKKwkgICAgICQkdGFncyAkJHVuaXF1ZQorCitHVEFHUzoKKwloZXJlPWAkKGFtX19jZCkgJCh0b3BfYnVpbGRkaXIpICYmIHB3ZGAgXAorCSAgJiYgY2QgJCh0b3Bfc3JjZGlyKSBcCisJICAmJiBndGFncyAtaSAkKEdUQUdTX0FSR1MpICQkaGVyZQorCitkaXN0Y2xlYW4tdGFnczoKKwktcm0gLWYgVEFHUyBJRCBHVEFHUyBHUlRBR1MgR1NZTVMgR1BBVEggdGFncworCitkaXN0ZGlyOiAkKERJU1RGSUxFUykKKwlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJdG9wc3JjZGlyc3RyaXA9YGVjaG8gIiQodG9wX3NyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCWxpc3Q9JyQoRElTVEZJTEVTKSc7IFwKKwkgIGRpc3RfZmlsZXM9YGZvciBmaWxlIGluICQkbGlzdDsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBcCisJICBzZWQgLWUgInN8XiQkc3JjZGlyc3RyaXAvfHw7dCIgXAorCSAgICAgIC1lICJzfF4kJHRvcHNyY2RpcnN0cmlwL3wkKHRvcF9idWlsZGRpcikvfDt0ImA7IFwKKwljYXNlICQkZGlzdF9maWxlcyBpbiBcCisJICAqLyopICQoTUtESVJfUCkgYGVjaG8gIiQkZGlzdF9maWxlcyIgfCBcCisJCQkgICBzZWQgJy9cLy8hZDtzfF58JChkaXN0ZGlyKS98O3MsL1teL10qJCQsLCcgfCBcCisJCQkgICBzb3J0IC11YCA7OyBcCisJZXNhYzsgXAorCWZvciBmaWxlIGluICQkZGlzdF9maWxlczsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJGZpbGUgfHwgdGVzdCAtZCAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAorCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKKwkgICAgZGlyPWBlY2hvICIvJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKKwkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCisJICAgICAgY3AgLXBSICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKSQkZGlyIHx8IGV4aXQgMTsgXAorCSAgICBmaTsgXAorCSAgICBjcCAtcFIgJCRkLyQkZmlsZSAkKGRpc3RkaXIpJCRkaXIgfHwgZXhpdCAxOyBcCisJICBlbHNlIFwKKwkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorY2hlY2stYW06IGFsbC1hbQorY2hlY2s6IGNoZWNrLWFtCithbGwtYW06IE1ha2VmaWxlICQoTFRMSUJSQVJJRVMpCitpbnN0YWxsZGlyczoKK2luc3RhbGw6IGluc3RhbGwtYW0KK2luc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCitpbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQordW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KKworaW5zdGFsbC1hbTogYWxsLWFtCisJQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KKworaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stYW0KK2luc3RhbGwtc3RyaXA6CisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKKwkgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAorCSAgYHRlc3QgLXogJyQoU1RSSVApJyB8fCBcCisJICAgIGVjaG8gIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciYCBpbnN0YWxsCittb3N0bHljbGVhbi1nZW5lcmljOgorCitjbGVhbi1nZW5lcmljOgorCitkaXN0Y2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKKwktdGVzdCAteiAiJChESVNUQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoRElTVENMRUFORklMRVMpCisKK21haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCisJQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgorY2xlYW46IGNsZWFuLWFtCisKK2NsZWFuLWFtOiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgY2xlYW4tbm9pbnN0TFRMSUJSQVJJRVMgXAorCW1vc3RseWNsZWFuLWFtCisKK2Rpc3RjbGVhbjogZGlzdGNsZWFuLWFtCisJLXJtIC1yZiAuLyQoREVQRElSKQorCS1ybSAtZiBNYWtlZmlsZQorZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBcCisJZGlzdGNsZWFuLXRhZ3MKKworZHZpOiBkdmktYW0KKworZHZpLWFtOgorCitodG1sOiBodG1sLWFtCisKK2luZm86IGluZm8tYW0KKworaW5mby1hbToKKworaW5zdGFsbC1kYXRhLWFtOgorCitpbnN0YWxsLWR2aTogaW5zdGFsbC1kdmktYW0KKworaW5zdGFsbC1leGVjLWFtOgorCitpbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1hbQorCitpbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1hbQorCitpbnN0YWxsLW1hbjoKKworaW5zdGFsbC1wZGY6IGluc3RhbGwtcGRmLWFtCisKK2luc3RhbGwtcHM6IGluc3RhbGwtcHMtYW0KKworaW5zdGFsbGNoZWNrLWFtOgorCittYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLWFtCisJLXJtIC1yZiAuLyQoREVQRElSKQorCS1ybSAtZiBNYWtlZmlsZQorbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYworCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tYW0KKworbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCisJbW9zdGx5Y2xlYW4tbGlidG9vbAorCitwZGY6IHBkZi1hbQorCitwZGYtYW06CisKK3BzOiBwcy1hbQorCitwcy1hbToKKwordW5pbnN0YWxsLWFtOgorCisuTUFLRTogaW5zdGFsbC1hbSBpbnN0YWxsLXN0cmlwCisKKy5QSE9OWTogQ1RBR1MgR1RBR1MgYWxsIGFsbC1hbSBjaGVjayBjaGVjay1hbSBjbGVhbiBjbGVhbi1nZW5lcmljIFwKKwljbGVhbi1saWJ0b29sIGNsZWFuLW5vaW5zdExUTElCUkFSSUVTIGN0YWdzIGRpc3RjbGVhbiBcCisJZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWxpYnRvb2wgXAorCWRpc3RjbGVhbi10YWdzIGRpc3RkaXIgZHZpIGR2aS1hbSBodG1sIGh0bWwtYW0gaW5mbyBpbmZvLWFtIFwKKwlpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1kYXRhIGluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWR2aSBcCisJaW5zdGFsbC1kdmktYW0gaW5zdGFsbC1leGVjIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWh0bWwgXAorCWluc3RhbGwtaHRtbC1hbSBpbnN0YWxsLWluZm8gaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtbWFuIFwKKwlpbnN0YWxsLXBkZiBpbnN0YWxsLXBkZi1hbSBpbnN0YWxsLXBzIGluc3RhbGwtcHMtYW0gXAorCWluc3RhbGwtc3RyaXAgaW5zdGFsbGNoZWNrIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBcCisJbWFpbnRhaW5lci1jbGVhbiBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4gXAorCW1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1saWJ0b29sIFwKKwlwZGYgcGRmLWFtIHBzIHBzLWFtIHRhZ3MgdW5pbnN0YWxsIHVuaW5zdGFsbC1hbQorCisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL01hbmlmZXN0IGIvbGliZ2NyeXB0LTEuNC42L21waS9NYW5pZmVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjBkNjczCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9NYW5pZmVzdApAQCAtMCwwICsxLDQxIEBACisjIE1hbmlmZXN0IC0gY2hlY2tzdW1zIG9mIHRoZSBtcGkgZGlyZWN0b3J5CisjIENvcHlyaWdodCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisjCisjIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBnZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorCitNYWtlZmlsZS5hbQorY29uZmlnLmxpbmtzCitsb25nbG9uZy5oCittcGktYWRkLmMKK21waS1iaXQuYworbXBpLWNtcC5jCittcGktZGl2LmMKK21waS1nY2QuYworbXBpLWlubGluZS5jCittcGktaW5saW5lLmgKK21waS1pbnRlcm5hbC5oCittcGktaW52LmMKK21waS1tcG93LmMKK21waS1tdWwuYworbXBpLXBvdy5jCittcGktc2Nhbi5jCittcGljb2Rlci5jCittcGloLWRpdi5jCittcGloLW11bC5jCittcGl1dGlsLmMKKyRuYW1lcyQgaVFDVkF3VUFQK0xtZkRFQW5wODMyUy83QVFLWkpRUUFrUi9nUUlUVU0rNllneTlXQU9BTzE3YnR5S0FsQ3RHVFhwNVhTWitKM1gwby9yWW5lUmRTQ1c4OUlKdndGUkpqQU9jRkpkNTJNWHM2WlZGRi9SUUJDOE12Snp1UUNoYkV6dmloSzhvMlZnSzM0WVdqVSs2WEg5c0ZnUk1JZ3prSHMvNTFaWnhlUVVPUHkxWEY3VHlLQjBXRTdZQlVWaXNGaVJhcUIxcUdJT3M9PVozcUIKKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9hbHBoYS9SRUFETUUgYi9saWJnY3J5cHQtMS40LjYvbXBpL2FscGhhL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWMwYTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9hbHBoYS9SRUFETUUKQEAgLTAsMCArMSw1MyBAQAorVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgbXBuIGZ1bmN0aW9ucyBvcHRpbWl6ZWQgZm9yIERFQyBBbHBoYSBwcm9jZXNzb3JzLgorCitSRUxFVkFOVCBPUFRJTUlaQVRJT04gSVNTVUVTCisKK0VWNAorCisxLiBUaGlzIGNoaXAgaGFzIHZlcnkgbGltaXRlZCBzdG9yZSBiYW5kd2lkdGguICBUaGUgb24tY2hpcCBMMSBjYWNoZSBpcword3JpdGUtdGhyb3VnaCwgYW5kIGEgY2FjaGUgbGluZSBpcyB0cmFuc2ZlcmVkIGZyb20gdGhlIHN0b3JlIGJ1ZmZlciB0byB0aGUKK29mZi1jaGlwIEwyIGluIGFzIG11Y2ggMTUgY3ljbGVzIG9uIG1vc3Qgc3lzdGVtcy4gIFRoaXMgZGVsYXkgaHVydHMKK21wbl9hZGRfbiwgbXBuX3N1Yl9uLCBtcG5fbHNoaWZ0LCBhbmQgbXBuX3JzaGlmdC4KKworMi4gUGFpcmluZyBpcyBwb3NzaWJsZSBiZXR3ZWVuIG1lbW9yeSBpbnN0cnVjdGlvbnMgYW5kIGludGVnZXIgYXJpdGhtZXRpYworaW5zdHJ1Y3Rpb25zLgorCiszLiBtdWxxIGFuZCB1bXVsaCBpcyBkb2N1bWVudGVkIHRvIGhhdmUgYSBsYXRlbmN5IG9mIDIzIGN5Y2xlcywgYnV0IDIgb2YKK3RoZXNlIGN5Y2xlcyBhcmUgcGlwZWxpbmVkLiAgVGh1cywgbXVsdGlwbHkgaW5zdHJ1Y3Rpb25zIGNhbiBiZSBpc3N1ZWQgYXQgYQorcmF0ZSBvZiBvbmUgZWFjaCAyMW5kIGN5Y2xlLgorCitFVjUKKworMS4gVGhlIG1lbW9yeSBiYW5kd2lkdGggb2YgdGhpcyBjaGlwIHNlZW1zIGV4Y2VsbGVudCwgYm90aCBmb3IgbG9hZHMgYW5kCitzdG9yZXMuICBFdmVuIHdoZW4gdGhlIHdvcmtpbmcgc2V0IGlzIGxhcmdlciB0aGFuIHRoZSBvbi1jaGlwIEwxIGFuZCBMMgorY2FjaGVzLCB0aGUgcGVyZnJvbWFuY2UgcmVtYWluIGFsbW9zdCB1bmFmZmVjdGVkLgorCisyLiBtdWxxIGhhcyBhIG1lYXN1cmVkIGxhdGVuY3kgb2YgMTMgY3ljbGVzIGFuZCBhbiBpc3N1ZSByYXRlIG9mIDEgZWFjaCA4dGgKK2N5Y2xlLiAgdW11bGggaGFzIGEgbWVhc3VyZWQgbGF0ZW5jeSBvZiAxNSBjeWNsZXMgYW5kIGFuIGlzc3VlIHJhdGUgb2YgMQorZWFjaCAxMHRoIGN5Y2xlLiAgQnV0IHRoZSBleGFjdCB0aW1pbmcgaXMgc29tZXdoYXQgY29uZnVzaW5nLgorCiszLiBtcG5fYWRkX24uICBXaXRoIDQtZm9sZCB1bnJvbGxpbmcsIHdlIG5lZWQgMzcgaW5zdHJ1Y3Rpb25zLCB3aGVyZW9mIDEyCisgICBhcmUgbWVtb3J5IG9wZXJhdGlvbnMuICBUaGlzIHdpbGwgdGFrZSBhdCBsZWFzdAorCWNlaWwoMzcvMikgW2R1YWwgaXNzdWVdICsgMSBbdGFrZW4gYnJhbmNoXSA9IDIwIGN5Y2xlcworICAgV2UgaGF2ZSAxMiBtZW1vcnkgY3ljbGVzLCBwbHVzIDQgYWZ0ZXItc3RvcmUgY29uZmxpY3QgY3ljbGVzLCBvciAxNiBkYXRhCisgICBjYWNoZSBjeWNsZXMsIHdoaWNoIHNob3VsZCBiZSBjb21wbGV0ZWx5IGhpZGRlbiBpbiB0aGUgMjAgaXNzdWUgY3ljbGVzLgorICAgVGhlIGNvbXB1dGF0aW9uIGlzIGluaGVyZW50bHkgc2VyaWFsLCB3aXRoIHRoZXNlIGRlcGVuZGVuY2llczoKKyAgICAgYWRkcQorICAgICAvICAgXAorICAgYWRkcSAgY21wdWx0CisgICAgIHwgICAgIHwKKyAgIGNtcHVsdCAgfAorICAgICAgIFwgIC8KKyAgICAgICAgb3IKKyAgIEkuZS4sIHRoZXJlIGlzIGEgNCBjeWNsZSBwYXRoIGZvciBlYWNoIGxpbWIsIG1ha2luZyAxNiBjeWNsZXMgdGhlIGFic29sdXRlCisgICBtaW5pbXVtLiAgV2UgY291bGQgcmVwbGFjZSB0aGUgYG9yJyB3aXRoIGEgY21vdmVxL2Ntb3ZuZSwgd2hpY2ggd291bGQgc2F2ZQorICAgYSBjeWNsZSBvbiBFVjUsIGJ1dCB0aGF0IG1pZ2h0IHdhc3RlIGEgY3ljbGUgb24gRVY0LiAgQWxzbywgY21vdiB0YWtlcyAyCisgICBjeWNsZXMuCisgICAgIGFkZHEKKyAgICAgLyAgIFwKKyAgIGFkZHEgIGNtcHVsdAorICAgICB8ICAgICAgXAorICAgY21wdWx0IC0+IGNtb3ZuZQorCitTVEFUVVMKKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9hbHBoYS9kaXN0ZmlsZXMgYi9saWJnY3J5cHQtMS40LjYvbXBpL2FscGhhL2Rpc3RmaWxlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmFiOWZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9hbHBoYS9kaXN0ZmlsZXMKQEAgLTAsMCArMSwxMSBAQAorUkVBRE1FCittcGloLWFkZDEuUworbXBpaC1zdWIxLlMKK21waWgtbXVsMS5TCittcGloLW11bDIuUworbXBpaC1tdWwzLlMKK21waWgtbHNoaWZ0LlMKK21waWgtcnNoaWZ0LlMKKwordWRpdi1xcm5uZC5TCisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvYWxwaGEvbXBpaC1hZGQxLlMgYi9saWJnY3J5cHQtMS40LjYvbXBpL2FscGhhL21waWgtYWRkMS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZGJiMmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL2FscGhhL21waWgtYWRkMS5TCkBAIC0wLDAgKzEsMTI0IEBACisvKiBhbHBoYSAgYWRkX24gLS0gQWRkIHR3byBsaW1iIHZlY3RvcnMgb2YgdGhlIHNhbWUgbGVuZ3RoID4gMCBhbmQgc3RvcmUKKyAqCQkgICBzdW0gaW4gYSB0aGlyZCBsaW1iIHZlY3Rvci4KKyAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5OCwgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqCisgKiAgbXBpX2xpbWJfdAorICogIF9nY3J5X21waWhfYWRkX24oIG1waV9wdHJfdCByZXNfcHRyLAkoJDE2KQorICoJCSAgIG1waV9wdHJfdCBzMV9wdHIsCSgkMTcpCisgKgkJICAgbXBpX3B0cl90IHMyX3B0ciwJKCQxOCkKKyAqCQkgICBtcGlfc2l6ZV90IHNpemUpCSgkMTkpCisgKi8KKworCisJLnNldAlub3Jlb3JkZXIKKwkuc2V0CW5vYXQKKy50ZXh0CisJLmFsaWduCTMKKwkuZ2xvYmwJX2djcnlfbXBpaF9hZGRfbgorCS5lbnQJX2djcnlfbXBpaF9hZGRfbgorX2djcnlfbXBpaF9hZGRfbjoKKwkuZnJhbWUJJDMwLDAsJDI2LDAKKworCWxkcQkkMywwKCQxNykKKwlsZHEJJDQsMCgkMTgpCisKKwlzdWJxCSQxOSwxLCQxOQorCWFuZAkkMTksNC0xLCQyCSMgbnVtYmVyIG9mIGxpbWJzIGluIGZpcnN0IGxvb3AKKwliaXMJJDMxLCQzMSwkMAorCWJlcQkkMiwuTDAJCSMgaWYgbXVsdGlwbGUgb2YgNCBsaW1icywgc2tpcCBmaXJzdCBsb29wCisKKwlzdWJxCSQxOSwkMiwkMTkKKworLkxvb3AwOiBzdWJxCSQyLDEsJDIKKwlsZHEJJDUsOCgkMTcpCisJYWRkcQkkNCwkMCwkNAorCWxkcQkkNiw4KCQxOCkKKwljbXB1bHQJJDQsJDAsJDEKKwlhZGRxCSQzLCQ0LCQ0CisJY21wdWx0CSQ0LCQzLCQwCisJc3RxCSQ0LDAoJDE2KQorCW9yCSQwLCQxLCQwCisKKwlhZGRxCSQxNyw4LCQxNworCWFkZHEJJDE4LDgsJDE4CisJYmlzCSQ1LCQ1LCQzCisJYmlzCSQ2LCQ2LCQ0CisJYWRkcQkkMTYsOCwkMTYKKwlibmUJJDIsLkxvb3AwCisKKy5MMDoJYmVxCSQxOSwuTGVuZAorCisJLmFsaWduCTMKKy5Mb29wOglzdWJxCSQxOSw0LCQxOQorCisJbGRxCSQ1LDgoJDE3KQorCWFkZHEJJDQsJDAsJDQKKwlsZHEJJDYsOCgkMTgpCisJY21wdWx0CSQ0LCQwLCQxCisJYWRkcQkkMywkNCwkNAorCWNtcHVsdAkkNCwkMywkMAorCXN0cQkkNCwwKCQxNikKKwlvcgkkMCwkMSwkMAorCisJbGRxCSQzLDE2KCQxNykKKwlhZGRxCSQ2LCQwLCQ2CisJbGRxCSQ0LDE2KCQxOCkKKwljbXB1bHQJJDYsJDAsJDEKKwlhZGRxCSQ1LCQ2LCQ2CisJY21wdWx0CSQ2LCQ1LCQwCisJc3RxCSQ2LDgoJDE2KQorCW9yCSQwLCQxLCQwCisKKwlsZHEJJDUsMjQoJDE3KQorCWFkZHEJJDQsJDAsJDQKKwlsZHEJJDYsMjQoJDE4KQorCWNtcHVsdAkkNCwkMCwkMQorCWFkZHEJJDMsJDQsJDQKKwljbXB1bHQJJDQsJDMsJDAKKwlzdHEJJDQsMTYoJDE2KQorCW9yCSQwLCQxLCQwCisKKwlsZHEJJDMsMzIoJDE3KQorCWFkZHEJJDYsJDAsJDYKKwlsZHEJJDQsMzIoJDE4KQorCWNtcHVsdAkkNiwkMCwkMQorCWFkZHEJJDUsJDYsJDYKKwljbXB1bHQJJDYsJDUsJDAKKwlzdHEJJDYsMjQoJDE2KQorCW9yCSQwLCQxLCQwCisKKwlhZGRxCSQxNywzMiwkMTcKKwlhZGRxCSQxOCwzMiwkMTgKKwlhZGRxCSQxNiwzMiwkMTYKKwlibmUJJDE5LC5Mb29wCisKKy5MZW5kOglhZGRxCSQ0LCQwLCQ0CisJY21wdWx0CSQ0LCQwLCQxCisJYWRkcQkkMywkNCwkNAorCWNtcHVsdAkkNCwkMywkMAorCXN0cQkkNCwwKCQxNikKKwlvcgkkMCwkMSwkMAorCXJldAkkMzEsKCQyNiksMQorCisJLmVuZAlfZ2NyeV9tcGloX2FkZF9uCisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvYWxwaGEvbXBpaC1sc2hpZnQuUyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvYWxwaGEvbXBpaC1sc2hpZnQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWQ0YjE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9hbHBoYS9tcGloLWxzaGlmdC5TCkBAIC0wLDAgKzEsMTIyIEBACisvKiBhbHBoYSAtIGxlZnQgc2hpZnQKKyAqCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5OCwgMjAwMSwKKyAqICAgICAgICAgICAgICAgICAgICAyMDAyICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICoKKyAqIE5vdGU6IFRoaXMgY29kZSBpcyBoZWF2aWx5IGJhc2VkIG9uIHRoZSBHTlUgTVAgTGlicmFyeS4KKyAqCSBBY3R1YWxseSBpdCdzIHRoZSBzYW1lIGNvZGUgd2l0aCBvbmx5IG1pbm9yIGNoYW5nZXMgaW4gdGhlCisgKgkgd2F5IHRoZSBkYXRhIGlzIHN0b3JlZDsgdGhpcyBpcyB0byBzdXBwb3J0IHRoZSBhYnN0cmFjdGlvbgorICoJIG9mIGFuIG9wdGlvbmFsIHNlY3VyZSBtZW1vcnkgYWxsb2NhdGlvbiB3aGljaCBtYXkgYmUgdXNlZAorICoJIHRvIGF2b2lkIHJldmVhbGluZyBvZiBzZW5zaXRpdmUgZGF0YSBkdWUgdG8gcGFnaW5nIGV0Yy4KKyAqLworCisKKworLyoqKioqKioqKioqKioqKioqKioKKyAqIG1waV9saW1iX3QKKyAqIF9nY3J5X21waWhfbHNoaWZ0KCBtcGlfcHRyX3Qgd3AsCShyMTYpCisgKgkJICAgbXBpX3B0cl90IHVwLAkocjE3KQorICoJCSAgIG1waV9zaXplX3QgdXNpemUsCShyMTgpCisgKgkJICAgdW5zaWduZWQgY250KQkocjE5KQorICoKKyAqIFRoaXMgY29kZSBydW5zIGF0IDQuOCBjeWNsZXMvbGltYiBvbiB0aGUgMjEwNjQuICBXaXRoIGluZmluaXRlIHVucm9sbGluZywKKyAqIGl0IHdvdWxkIHRha2UgNCBjeWNsZXMvbGltYi4gIEl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBnZXQgZG93biB0byAzCisgKiBjeWNsZXMvbGltYiBzaW5jZSBib3RoIGxkcSBhbmQgc3RxIGNhbiBiZSBwYWlyZWQgd2l0aCB0aGUgb3RoZXIgdXNlZAorICogaW5zdHJ1Y3Rpb25zLiAgQnV0IHRoZXJlIGFyZSBtYW55IHJlc3RyaWN0aW9ucyBpbiB0aGUgMjEwNjQgcGlwZWxpbmUgdGhhdAorICogbWFrZXMgaXQgaGFyZCwgaWYgbm90IGltcG9zc2libGUsIHRvIGdldCBkb3duIHRvIDMgY3ljbGVzL2xpbWI6CisgKgorICogMS4gbGRxIGhhcyBhIDMgY3ljbGUgZGVsYXksIHNybCBhbmQgc2xsIGhhdmUgYSAyIGN5Y2xlIGRlbGF5LgorICogMi4gT25seSBhbGlnbmVkIGluc3RydWN0aW9uIHBhaXJzIGNhbiBiZSBwYWlyZWQuCisgKiAzLiBUaGUgc3RvcmUgYnVmZmVyIG9yIHNpbG8gbWlnaHQgbm90IGJlIGFibGUgdG8gZGVhbCB3aXRoIHRoZSBiYW5kd2lkdGguCisgKi8KKworCS5zZXQJbm9yZW9yZGVyCisJLnNldAlub2F0CisudGV4dAorCS5hbGlnbgkzCisJLmdsb2JsCV9nY3J5X21waWhfbHNoaWZ0CisJLmVudAlfZ2NyeV9tcGloX2xzaGlmdAorX2djcnlfbXBpaF9sc2hpZnQ6CisJLmZyYW1lCSQzMCwwLCQyNiwwCisKKwlzOGFkZHEJJDE4LCQxNywkMTcJIyBtYWtlIHIxNyBwb2ludCBhdCBlbmQgb2YgczEKKwlsZHEJJDQsLTgoJDE3KQkjIGxvYWQgZmlyc3QgbGltYgorCXN1YnEJJDE3LDgsJDE3CisJc3VicQkkMzEsJDE5LCQ3CisJczhhZGRxCSQxOCwkMTYsJDE2CSMgbWFrZSByMTYgcG9pbnQgYXQgZW5kIG9mIFJFUworCXN1YnEJJDE4LDEsJDE4CisJYW5kCSQxOCw0LTEsJDIwCSMgbnVtYmVyIG9mIGxpbWJzIGluIGZpcnN0IGxvb3AKKwlzcmwJJDQsJDcsJDAJIyBjb21wdXRlIGZ1bmN0aW9uIHJlc3VsdAorCisJYmVxCSQyMCwuTDAKKwlzdWJxCSQxOCwkMjAsJDE4CisKKwkuYWxpZ24JMworLkxvb3AwOgorCWxkcQkkMywtOCgkMTcpCisJc3VicQkkMTYsOCwkMTYKKwlzdWJxCSQxNyw4LCQxNworCXN1YnEJJDIwLDEsJDIwCisJc2xsCSQ0LCQxOSwkNQorCXNybAkkMywkNywkNgorCWJpcwkkMywkMywkNAorCWJpcwkkNSwkNiwkOAorCXN0cQkkOCwwKCQxNikKKwlibmUJJDIwLC5Mb29wMAorCisuTDA6CWJlcQkkMTgsLkxlbmQKKworCS5hbGlnbgkzCisuTG9vcDoJbGRxCSQzLC04KCQxNykKKwlzdWJxCSQxNiwzMiwkMTYKKwlzdWJxCSQxOCw0LCQxOAorCXNsbAkkNCwkMTksJDUKKwlzcmwJJDMsJDcsJDYKKworCWxkcQkkNCwtMTYoJDE3KQorCXNsbAkkMywkMTksJDEKKwliaXMJJDUsJDYsJDgKKwlzdHEJJDgsMjQoJDE2KQorCXNybAkkNCwkNywkMgorCisJbGRxCSQzLC0yNCgkMTcpCisJc2xsCSQ0LCQxOSwkNQorCWJpcwkkMSwkMiwkOAorCXN0cQkkOCwxNigkMTYpCisJc3JsCSQzLCQ3LCQ2CisKKwlsZHEJJDQsLTMyKCQxNykKKwlzbGwJJDMsJDE5LCQxCisJYmlzCSQ1LCQ2LCQ4CisJc3RxCSQ4LDgoJDE2KQorCXNybAkkNCwkNywkMgorCisJc3VicQkkMTcsMzIsJDE3CisJYmlzCSQxLCQyLCQ4CisJc3RxCSQ4LDAoJDE2KQorCisJYmd0CSQxOCwuTG9vcAorCisuTGVuZDoJc2xsCSQ0LCQxOSwkOAorCXN0cQkkOCwtOCgkMTYpCisJcmV0CSQzMSwoJDI2KSwxCisJLmVuZAlfZ2NyeV9tcGloX2xzaGlmdAorCisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvYWxwaGEvbXBpaC1tdWwxLlMgYi9saWJnY3J5cHQtMS40LjYvbXBpL2FscGhhL21waWgtbXVsMS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkOTFiMTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL2FscGhhL21waWgtbXVsMS5TCkBAIC0wLDAgKzEsOTAgQEAKKy8qIEFscGhhIDIxMDY0IG1waWgtbXVsMS5TIC0tIE11bHRpcGx5IGEgbGltYiB2ZWN0b3Igd2l0aCBhIGxpbWIgYW5kIHN0b3JlCisgKgkJCSAgICAgIHRoZSByZXN1bHQgaW4gYSBzZWNvbmQgbGltYiB2ZWN0b3IuCisgKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTQsIDE5OTUsIDE5OTgsIAorICogICAgICAgICAgICAgICAgICAgIDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICovCisKKworLyoqKioqKioqKioqKioqKioqKioKKyAqIG1waV9saW1iX3QKKyAqIF9nY3J5X21waWhfbXVsXzEoIG1waV9wdHJfdCByZXNfcHRyLAkocjE2KQorICoJCSAgbXBpX3B0cl90IHMxX3B0ciwJKHIxNykKKyAqCQkgIG1waV9zaXplX3QgczFfc2l6ZSwJKHIxOCkKKyAqCQkgIG1waV9saW1iX3QgczJfbGltYikJKHIxOSkKKyAqCisgKiBUaGlzIGNvZGUgcnVucyBhdCA0MiBjeWNsZXMvbGltYiBvbiB0aGUgRVY0IGFuZCAxOCBjeWNsZXMvbGltYiBvbiB0aGUgRVY1LgorICoKKyAqIFRvIGltcHJvdmUgcGVyZm9ybWFuY2UgZm9yIGxvbmcgbXVsdGlwbGljYXRpb25zLCB3ZSB3b3VsZCB1c2UKKyAqICdmZXRjaCcgZm9yIFMxIGFuZCAnZmV0Y2hfbScgZm9yIFJFUy4gIEl0J3Mgbm90IG9idmlvdXMgaG93IHRvIHVzZQorICogdGhlc2UgaW5zdHJ1Y3Rpb25zIHdpdGhvdXQgc2xvd2luZyBkb3duIHRoZSBnZW5lcmFsIGNvZGU6IDEuIFdlIGNhbgorICogb25seSBoYXZlIHR3byBwcmVmZXRjaGVzIGluIG9wZXJhdGlvbiBhdCBhbnkgdGltZSBpbiB0aGUgQWxwaGEKKyAqIGFyY2hpdGVjdHVyZS4gIDIuIFRoZXJlIHdpbGwgc2VsZG9tIGJlIGFueSBzcGVjaWFsIGFsaWdubWVudAorICogYmV0d2VlbiBSRVNfUFRSIGFuZCBTMV9QVFIuCU1heWJlIHdlIGNhbiBzaW1wbHkgZGl2aWRlIHRoZSBjdXJyZW50CisgKiBsb29wIGludG8gYW4gaW5uZXIgYW5kIG91dGVyIGxvb3AsIGhhdmluZyB0aGUgaW5uZXIgbG9vcCBoYW5kbGUKKyAqIGV4YWN0bHkgb25lIHByZWZldGNoIGJsb2NrPworICovCisKKwkuc2V0CW5vcmVvcmRlcgorCS5zZXQJbm9hdAorLnRleHQKKwkuYWxpZ24JMworCS5nbG9ibAlfZ2NyeV9tcGloX211bF8xCisJLmVudAlfZ2NyeV9tcGloX211bF8xIDIKK19nY3J5X21waWhfbXVsXzE6CisJLmZyYW1lCSQzMCwwLCQyNgorCisJbGRxCSQyLDAoJDE3KQkjICQyID0gczFfbGltYgorCXN1YnEJJDE4LDEsJDE4CSMgc2l6ZS0tCisJbXVscQkkMiwkMTksJDMJIyAkMyA9IHByb2RfbG93CisJYmljCSQzMSwkMzEsJDQJIyBjbGVhciBjeV9saW1iCisJdW11bGgJJDIsJDE5LCQwCSMgJDAgPSBwcm9kX2hpZ2gKKwliZXEJJDE4LExlbmQxCSMganVtcCBpZiBzaXplIHdhcyA9PSAxCisJbGRxCSQyLDgoJDE3KQkjICQyID0gczFfbGltYgorCXN1YnEJJDE4LDEsJDE4CSMgc2l6ZS0tCisJc3RxCSQzLDAoJDE2KQorCWJlcQkkMTgsTGVuZDIJIyBqdW1wIGlmIHNpemUgd2FzID09IDIKKworCS5hbGlnbgkzCitMb29wOgltdWxxCSQyLCQxOSwkMwkjICQzID0gcHJvZF9sb3cKKwlhZGRxCSQ0LCQwLCQwCSMgY3lfbGltYiA9IGN5X2xpbWIgKyAnY3knCisJc3VicQkkMTgsMSwkMTgJIyBzaXplLS0KKwl1bXVsaAkkMiwkMTksJDQJIyAkNCA9IGN5X2xpbWIKKwlsZHEJJDIsMTYoJDE3KQkjICQyID0gczFfbGltYgorCWFkZHEJJDE3LDgsJDE3CSMgczFfcHRyKysKKwlhZGRxCSQzLCQwLCQzCSMgJDMgPSBjeV9saW1iICsgcHJvZF9sb3cKKwlzdHEJJDMsOCgkMTYpCisJY21wdWx0CSQzLCQwLCQwCSMgJDAgPSBjYXJyeSBmcm9tIChjeV9saW1iICsgcHJvZF9sb3cpCisJYWRkcQkkMTYsOCwkMTYJIyByZXNfcHRyKysKKwlibmUJJDE4LExvb3AKKworTGVuZDI6CW11bHEJJDIsJDE5LCQzCSMgJDMgPSBwcm9kX2xvdworCWFkZHEJJDQsJDAsJDAJIyBjeV9saW1iID0gY3lfbGltYiArICdjeScKKwl1bXVsaAkkMiwkMTksJDQJIyAkNCA9IGN5X2xpbWIKKwlhZGRxCSQzLCQwLCQzCSMgJDMgPSBjeV9saW1iICsgcHJvZF9sb3cKKwljbXB1bHQJJDMsJDAsJDAJIyAkMCA9IGNhcnJ5IGZyb20gKGN5X2xpbWIgKyBwcm9kX2xvdykKKwlzdHEJJDMsOCgkMTYpCisJYWRkcQkkNCwkMCwkMAkjIGN5X2xpbWIgPSBwcm9kX2hpZ2ggKyBjeQorCXJldAkkMzEsKCQyNiksMQorTGVuZDE6CXN0cQkkMywwKCQxNikKKwlyZXQJJDMxLCgkMjYpLDEKKworCS5lbmQJX2djcnlfbXBpaF9tdWxfMQorCisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvYWxwaGEvbXBpaC1tdWwyLlMgYi9saWJnY3J5cHQtMS40LjYvbXBpL2FscGhhL21waWgtbXVsMi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlYjZiOTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL2FscGhhL21waWgtbXVsMi5TCkBAIC0wLDAgKzEsOTcgQEAKKy8qIEFscGhhIDIxMDY0IGFkZG11bF8xIC0tIE11bHRpcGx5IGEgbGltYiB2ZWN0b3Igd2l0aCBhIGxpbWIgYW5kIGFkZAorICoJCQkgICB0aGUgcmVzdWx0IHRvIGEgc2Vjb25kIGxpbWIgdmVjdG9yLgorICoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk0LCAxOTk1LCAxOTk4LAorICogICAgICAgICAgICAgICAgICAgIDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICovCisKKworLyoqKioqKioqKioqKioqKioqKioKKyAqIG1waV9saW1iX3QKKyAqIF9nY3J5X21waWhfYWRkbXVsXzEoIG1waV9wdHJfdCByZXNfcHRyLCAgICAgIChyMTYpCisgKgkJICAgICBtcGlfcHRyX3QgczFfcHRyLAkgICAgIChyMTcpCisgKgkJICAgICBtcGlfc2l6ZV90IHMxX3NpemUsICAgICAocjE4KQorICoJCSAgICAgbXBpX2xpbWJfdCBzMl9saW1iKSAgICAgKHIxOSkKKyAqCisgKiBUaGlzIGNvZGUgcnVucyBhdCA0MiBjeWNsZXMvbGltYiBvbiBFVjQgYW5kIDE4IGN5Y2xlcy9saW1iIG9uIEVWNS4KKyAqLworCisKKwkuc2V0CW5vcmVvcmRlcgorCS5zZXQJbm9hdAorLnRleHQKKwkuYWxpZ24JMworCS5nbG9ibAlfZ2NyeV9tcGloX2FkZG11bF8xCisJLmVudAlfZ2NyeV9tcGloX2FkZG11bF8xIDIKK19nY3J5X21waWhfYWRkbXVsXzE6CisJLmZyYW1lCSQzMCwwLCQyNgorCisJbGRxCSQyLDAoJDE3KQkjICQyID0gczFfbGltYgorCWFkZHEJJDE3LDgsJDE3CSMgczFfcHRyKysKKwlzdWJxCSQxOCwxLCQxOAkjIHNpemUtLQorCW11bHEJJDIsJDE5LCQzCSMgJDMgPSBwcm9kX2xvdworCWxkcQkkNSwwKCQxNikJIyAkNSA9ICpyZXNfcHRyCisJdW11bGgJJDIsJDE5LCQwCSMgJDAgPSBwcm9kX2hpZ2gKKwliZXEJJDE4LC5MZW5kMQkjIGp1bXAgaWYgc2l6ZSB3YXMgPT0gMQorCWxkcQkkMiwwKCQxNykJIyAkMiA9IHMxX2xpbWIKKwlhZGRxCSQxNyw4LCQxNwkjIHMxX3B0cisrCisJc3VicQkkMTgsMSwkMTgJIyBzaXplLS0KKwlhZGRxCSQ1LCQzLCQzCisJY21wdWx0CSQzLCQ1LCQ0CisJc3RxCSQzLDAoJDE2KQorCWFkZHEJJDE2LDgsJDE2CSMgcmVzX3B0cisrCisJYmVxCSQxOCwuTGVuZDIJIyBqdW1wIGlmIHNpemUgd2FzID09IDIKKworCS5hbGlnbgkzCisuTG9vcDoJbXVscQkkMiwkMTksJDMJIyAkMyA9IHByb2RfbG93CisJbGRxCSQ1LDAoJDE2KQkjICQ1ID0gKnJlc19wdHIKKwlhZGRxCSQ0LCQwLCQwCSMgY3lfbGltYiA9IGN5X2xpbWIgKyAnY3knCisJc3VicQkkMTgsMSwkMTgJIyBzaXplLS0KKwl1bXVsaAkkMiwkMTksJDQJIyAkNCA9IGN5X2xpbWIKKwlsZHEJJDIsMCgkMTcpCSMgJDIgPSBzMV9saW1iCisJYWRkcQkkMTcsOCwkMTcJIyBzMV9wdHIrKworCWFkZHEJJDMsJDAsJDMJIyAkMyA9IGN5X2xpbWIgKyBwcm9kX2xvdworCWNtcHVsdAkkMywkMCwkMAkjICQwID0gY2FycnkgZnJvbSAoY3lfbGltYiArIHByb2RfbG93KQorCWFkZHEJJDUsJDMsJDMKKwljbXB1bHQJJDMsJDUsJDUKKwlzdHEJJDMsMCgkMTYpCisJYWRkcQkkMTYsOCwkMTYJIyByZXNfcHRyKysKKwlhZGRxCSQ1LCQwLCQwCSMgY29tYmluZSBjYXJyaWVzCisJYm5lCSQxOCwuTG9vcAorCisuTGVuZDI6IG11bHEJJDIsJDE5LCQzCSMgJDMgPSBwcm9kX2xvdworCWxkcQkkNSwwKCQxNikJIyAkNSA9ICpyZXNfcHRyCisJYWRkcQkkNCwkMCwkMAkjIGN5X2xpbWIgPSBjeV9saW1iICsgJ2N5JworCXVtdWxoCSQyLCQxOSwkNAkjICQ0ID0gY3lfbGltYgorCWFkZHEJJDMsJDAsJDMJIyAkMyA9IGN5X2xpbWIgKyBwcm9kX2xvdworCWNtcHVsdAkkMywkMCwkMAkjICQwID0gY2FycnkgZnJvbSAoY3lfbGltYiArIHByb2RfbG93KQorCWFkZHEJJDUsJDMsJDMKKwljbXB1bHQJJDMsJDUsJDUKKwlzdHEJJDMsMCgkMTYpCisJYWRkcQkkNSwkMCwkMAkjIGNvbWJpbmUgY2FycmllcworCWFkZHEJJDQsJDAsJDAJIyBjeV9saW1iID0gcHJvZF9oaWdoICsgY3kKKwlyZXQJJDMxLCgkMjYpLDEKKy5MZW5kMTogYWRkcQkkNSwkMywkMworCWNtcHVsdAkkMywkNSwkNQorCXN0cQkkMywwKCQxNikKKwlhZGRxCSQwLCQ1LCQwCisJcmV0CSQzMSwoJDI2KSwxCisKKwkuZW5kCV9nY3J5X21waWhfYWRkbXVsXzEKKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9hbHBoYS9tcGloLW11bDMuUyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvYWxwaGEvbXBpaC1tdWwzLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q1ZDJhZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvYWxwaGEvbXBpaC1tdWwzLlMKQEAgLTAsMCArMSw5NSBAQAorLyogQWxwaGEgMjEwNjQJc3VibXVsXzEgLS0gTXVsdGlwbHkgYSBsaW1iIHZlY3RvciB3aXRoIGEgbGltYiBhbmQKKyAqCQkJICAgIHN1YnRyYWN0IHRoZSByZXN1bHQgZnJvbSBhIHNlY29uZCBsaW1iIHZlY3Rvci4KKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk0LCAxOTk1LCAxOTk4LCAKKyAqICAgICAgICAgICAgICAgICAgICAyMDAxLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqCisgKiBtcGlfbGltYl90CisgKiBfZ2NyeV9tcGloX3N1Ym11bF8xKCBtcGlfcHRyX3QgcmVzX3B0ciwgICAgICAocjE2ICAgKQorICoJCSAgICAgbXBpX3B0cl90IHMxX3B0ciwJICAgICAocjE3ICAgKQorICoJCSAgICAgbXBpX3NpemVfdCBzMV9zaXplLCAgICAgKHIxOCAgICkKKyAqCQkgICAgIG1waV9saW1iX3QgczJfbGltYikgICAgIChyMTkgICApCisgKgorICogVGhpcyBjb2RlIHJ1bnMgYXQgNDIgY3ljbGVzL2xpbWIgb24gRVY0IGFuZCAxOCBjeWNsZXMvbGltYiBvbiBFVjUuCisgKi8KKworCS5zZXQJbm9yZW9yZGVyCisJLnNldAlub2F0CisudGV4dAorCS5hbGlnbgkzCisJLmdsb2JsCV9nY3J5X21waWhfc3VibXVsXzEKKwkuZW50CV9nY3J5X21waWhfc3VibXVsXzEgMgorX2djcnlfbXBpaF9zdWJtdWxfMToKKwkuZnJhbWUJJDMwLDAsJDI2CisKKwlsZHEJJDIsMCgkMTcpCSMgJDIgPSBzMV9saW1iCisJYWRkcQkkMTcsOCwkMTcJIyBzMV9wdHIrKworCXN1YnEJJDE4LDEsJDE4CSMgc2l6ZS0tCisJbXVscQkkMiwkMTksJDMJIyAkMyA9IHByb2RfbG93CisJbGRxCSQ1LDAoJDE2KQkjICQ1ID0gKnJlc19wdHIKKwl1bXVsaAkkMiwkMTksJDAJIyAkMCA9IHByb2RfaGlnaAorCWJlcQkkMTgsLkxlbmQxCSMganVtcCBpZiBzaXplIHdhcyA9PSAxCisJbGRxCSQyLDAoJDE3KQkjICQyID0gczFfbGltYgorCWFkZHEJJDE3LDgsJDE3CSMgczFfcHRyKysKKwlzdWJxCSQxOCwxLCQxOAkjIHNpemUtLQorCXN1YnEJJDUsJDMsJDMKKwljbXB1bHQJJDUsJDMsJDQKKwlzdHEJJDMsMCgkMTYpCisJYWRkcQkkMTYsOCwkMTYJIyByZXNfcHRyKysKKwliZXEJJDE4LC5MZW5kMgkjIGp1bXAgaWYgc2l6ZSB3YXMgPT0gMgorCisJLmFsaWduCTMKKy5Mb29wOgltdWxxCSQyLCQxOSwkMwkjICQzID0gcHJvZF9sb3cKKwlsZHEJJDUsMCgkMTYpCSMgJDUgPSAqcmVzX3B0cgorCWFkZHEJJDQsJDAsJDAJIyBjeV9saW1iID0gY3lfbGltYiArICdjeScKKwlzdWJxCSQxOCwxLCQxOAkjIHNpemUtLQorCXVtdWxoCSQyLCQxOSwkNAkjICQ0ID0gY3lfbGltYgorCWxkcQkkMiwwKCQxNykJIyAkMiA9IHMxX2xpbWIKKwlhZGRxCSQxNyw4LCQxNwkjIHMxX3B0cisrCisJYWRkcQkkMywkMCwkMwkjICQzID0gY3lfbGltYiArIHByb2RfbG93CisJY21wdWx0CSQzLCQwLCQwCSMgJDAgPSBjYXJyeSBmcm9tIChjeV9saW1iICsgcHJvZF9sb3cpCisJc3VicQkkNSwkMywkMworCWNtcHVsdAkkNSwkMywkNQorCXN0cQkkMywwKCQxNikKKwlhZGRxCSQxNiw4LCQxNgkjIHJlc19wdHIrKworCWFkZHEJJDUsJDAsJDAJIyBjb21iaW5lIGNhcnJpZXMKKwlibmUJJDE4LC5Mb29wCisKKy5MZW5kMjogbXVscQkkMiwkMTksJDMJIyAkMyA9IHByb2RfbG93CisJbGRxCSQ1LDAoJDE2KQkjICQ1ID0gKnJlc19wdHIKKwlhZGRxCSQ0LCQwLCQwCSMgY3lfbGltYiA9IGN5X2xpbWIgKyAnY3knCisJdW11bGgJJDIsJDE5LCQ0CSMgJDQgPSBjeV9saW1iCisJYWRkcQkkMywkMCwkMwkjICQzID0gY3lfbGltYiArIHByb2RfbG93CisJY21wdWx0CSQzLCQwLCQwCSMgJDAgPSBjYXJyeSBmcm9tIChjeV9saW1iICsgcHJvZF9sb3cpCisJc3VicQkkNSwkMywkMworCWNtcHVsdAkkNSwkMywkNQorCXN0cQkkMywwKCQxNikKKwlhZGRxCSQ1LCQwLCQwCSMgY29tYmluZSBjYXJyaWVzCisJYWRkcQkkNCwkMCwkMAkjIGN5X2xpbWIgPSBwcm9kX2hpZ2ggKyBjeQorCXJldAkkMzEsKCQyNiksMQorLkxlbmQxOiBzdWJxCSQ1LCQzLCQzCisJY21wdWx0CSQ1LCQzLCQ1CisJc3RxCSQzLDAoJDE2KQorCWFkZHEJJDAsJDUsJDAKKwlyZXQJJDMxLCgkMjYpLDEKKworCS5lbmQJX2djcnlfbXBpaF9zdWJtdWxfMQorCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL2FscGhhL21waWgtcnNoaWZ0LlMgYi9saWJnY3J5cHQtMS40LjYvbXBpL2FscGhhL21waWgtcnNoaWZ0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBjOTgxNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvYWxwaGEvbXBpaC1yc2hpZnQuUwpAQCAtMCwwICsxLDExOCBAQAorLyogYWxwaGEgICAgcnNoaWZ0CisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5OCwgMTk5OSwKKyAqICAgICAgICAgICAgICAgICAgICAyMDAwLCAyMDAxLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqCisgKiBOb3RlOiBUaGlzIGNvZGUgaXMgaGVhdmlseSBiYXNlZCBvbiB0aGUgR05VIE1QIExpYnJhcnkuCisgKgkgQWN0dWFsbHkgaXQncyB0aGUgc2FtZSBjb2RlIHdpdGggb25seSBtaW5vciBjaGFuZ2VzIGluIHRoZQorICoJIHdheSB0aGUgZGF0YSBpcyBzdG9yZWQ7IHRoaXMgaXMgdG8gc3VwcG9ydCB0aGUgYWJzdHJhY3Rpb24KKyAqCSBvZiBhbiBvcHRpb25hbCBzZWN1cmUgbWVtb3J5IGFsbG9jYXRpb24gd2hpY2ggbWF5IGJlIHVzZWQKKyAqCSB0byBhdm9pZCByZXZlYWxpbmcgb2Ygc2Vuc2l0aXZlIGRhdGEgZHVlIHRvIHBhZ2luZyBldGMuCisgKi8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioKKyAqIG1waV9saW1iX3QKKyAqIF9nY3J5X21waWhfcnNoaWZ0KCBtcGlfcHRyX3Qgd3AsCShyMTYpCisgKgkJICAgbXBpX3B0cl90IHVwLAkocjE3KQorICoJCSAgIG1waV9zaXplX3QgdXNpemUsCShyMTgpCisgKgkJICAgdW5zaWduZWQgY250KQkocjE5KQorICoKKyAqIFRoaXMgY29kZSBydW5zIGF0IDQuOCBjeWNsZXMvbGltYiBvbiB0aGUgMjEwNjQuICBXaXRoIGluZmluaXRlIHVucm9sbGluZywKKyAqIGl0IHdvdWxkIHRha2UgNCBjeWNsZXMvbGltYi4gIEl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBnZXQgZG93biB0byAzCisgKiBjeWNsZXMvbGltYiBzaW5jZSBib3RoIGxkcSBhbmQgc3RxIGNhbiBiZSBwYWlyZWQgd2l0aCB0aGUgb3RoZXIgdXNlZAorICogaW5zdHJ1Y3Rpb25zLiAgQnV0IHRoZXJlIGFyZSBtYW55IHJlc3RyaWN0aW9ucyBpbiB0aGUgMjEwNjQgcGlwZWxpbmUgdGhhdAorICogbWFrZXMgaXQgaGFyZCwgaWYgbm90IGltcG9zc2libGUsIHRvIGdldCBkb3duIHRvIDMgY3ljbGVzL2xpbWI6CisgKgorICogMS4gbGRxIGhhcyBhIDMgY3ljbGUgZGVsYXksIHNybCBhbmQgc2xsIGhhdmUgYSAyIGN5Y2xlIGRlbGF5LgorICogMi4gT25seSBhbGlnbmVkIGluc3RydWN0aW9uIHBhaXJzIGNhbiBiZSBwYWlyZWQuCisgKiAzLiBUaGUgc3RvcmUgYnVmZmVyIG9yIHNpbG8gbWlnaHQgbm90IGJlIGFibGUgdG8gZGVhbCB3aXRoIHRoZSBiYW5kd2lkdGguCisgKi8KKworCS5zZXQJbm9yZW9yZGVyCisJLnNldAlub2F0CisudGV4dAorCS5hbGlnbgkzCisJLmdsb2JsCV9nY3J5X21waWhfcnNoaWZ0CisJLmVudAlfZ2NyeV9tcGloX3JzaGlmdAorX2djcnlfbXBpaF9yc2hpZnQ6CisJLmZyYW1lCSQzMCwwLCQyNiwwCisKKwlsZHEJJDQsMCgkMTcpCSMgbG9hZCBmaXJzdCBsaW1iCisJYWRkcQkkMTcsOCwkMTcKKwlzdWJxCSQzMSwkMTksJDcKKwlzdWJxCSQxOCwxLCQxOAorCWFuZAkkMTgsNC0xLCQyMAkjIG51bWJlciBvZiBsaW1icyBpbiBmaXJzdCBsb29wCisJc2xsCSQ0LCQ3LCQwCSMgY29tcHV0ZSBmdW5jdGlvbiByZXN1bHQKKworCWJlcQkkMjAsLlIwCisJc3VicQkkMTgsJDIwLCQxOAorCisJLmFsaWduCTMKKy5Sb29wMDoKKwlsZHEJJDMsMCgkMTcpCisJYWRkcQkkMTYsOCwkMTYKKwlhZGRxCSQxNyw4LCQxNworCXN1YnEJJDIwLDEsJDIwCisJc3JsCSQ0LCQxOSwkNQorCXNsbAkkMywkNywkNgorCWJpcwkkMywkMywkNAorCWJpcwkkNSwkNiwkOAorCXN0cQkkOCwtOCgkMTYpCisJYm5lCSQyMCwuUm9vcDAKKworLlIwOgliZXEJJDE4LC5SZW5kCisKKwkuYWxpZ24JMworLlJvb3A6CWxkcQkkMywwKCQxNykKKwlhZGRxCSQxNiwzMiwkMTYKKwlzdWJxCSQxOCw0LCQxOAorCXNybAkkNCwkMTksJDUKKwlzbGwJJDMsJDcsJDYKKworCWxkcQkkNCw4KCQxNykKKwlzcmwJJDMsJDE5LCQxCisJYmlzCSQ1LCQ2LCQ4CisJc3RxCSQ4LC0zMigkMTYpCisJc2xsCSQ0LCQ3LCQyCisKKwlsZHEJJDMsMTYoJDE3KQorCXNybAkkNCwkMTksJDUKKwliaXMJJDEsJDIsJDgKKwlzdHEJJDgsLTI0KCQxNikKKwlzbGwJJDMsJDcsJDYKKworCWxkcQkkNCwyNCgkMTcpCisJc3JsCSQzLCQxOSwkMQorCWJpcwkkNSwkNiwkOAorCXN0cQkkOCwtMTYoJDE2KQorCXNsbAkkNCwkNywkMgorCisJYWRkcQkkMTcsMzIsJDE3CisJYmlzCSQxLCQyLCQ4CisJc3RxCSQ4LC04KCQxNikKKworCWJndAkkMTgsLlJvb3AKKworLlJlbmQ6CXNybAkkNCwkMTksJDgKKwlzdHEJJDgsMCgkMTYpCisJcmV0CSQzMSwoJDI2KSwxCisJLmVuZAlfZ2NyeV9tcGloX3JzaGlmdAorCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL2FscGhhL21waWgtc3ViMS5TIGIvbGliZ2NyeXB0LTEuNC42L21waS9hbHBoYS9tcGloLXN1YjEuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTY0NDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9hbHBoYS9tcGloLXN1YjEuUwpAQCAtMCwwICsxLDEyNCBAQAorLyogQWxwaGEgIHN1Yl9uIC0tIFN1YnRyYWN0IHR3byBsaW1iIHZlY3RvcnMgb2YgdGhlIHNhbWUgbGVuZ3RoID4gMCBhbmQKKyAqCQkgIHN0b3JlIGRpZmZlcmVuY2UgaW4gYSB0aGlyZCBsaW1iIHZlY3Rvci4KKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk4LCAKKyAqICAgICAgICAgICAgICAgICAgICAyMDAxLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqCisgKiAgbXBpX2xpbWJfdAorICogIF9nY3J5X21waWhfc3ViX24oIG1waV9wdHJfdCByZXNfcHRyLAkocjE2KQorICoJCSAgIG1waV9wdHJfdCBzMV9wdHIsCShyMTcpCisgKgkJICAgbXBpX3B0cl90IHMyX3B0ciwJKHIxOCkKKyAqCQkgICBtcGlfc2l6ZV90IHNpemUpCShyMTkpCisgKi8KKworCS5zZXQJbm9yZW9yZGVyCisJLnNldAlub2F0CisudGV4dAorCS5hbGlnbgkzCisJLmdsb2JsCV9nY3J5X21waWhfc3ViX24KKwkuZW50CV9nY3J5X21waWhfc3ViX24KK19nY3J5X21waWhfc3ViX246CisJLmZyYW1lCSQzMCwwLCQyNiwwCisKKwlsZHEJJDMsMCgkMTcpCisJbGRxCSQ0LDAoJDE4KQorCisJc3VicQkkMTksMSwkMTkKKwlhbmQJJDE5LDQtMSwkMgkjIG51bWJlciBvZiBsaW1icyBpbiBmaXJzdCBsb29wCisJYmlzCSQzMSwkMzEsJDAKKwliZXEJJDIsLkwwCQkjIGlmIG11bHRpcGxlIG9mIDQgbGltYnMsIHNraXAgZmlyc3QgbG9vcAorCisJc3VicQkkMTksJDIsJDE5CisKKy5Mb29wMDogc3VicQkkMiwxLCQyCisJbGRxCSQ1LDgoJDE3KQorCWFkZHEJJDQsJDAsJDQKKwlsZHEJJDYsOCgkMTgpCisJY21wdWx0CSQ0LCQwLCQxCisJc3VicQkkMywkNCwkNAorCWNtcHVsdAkkMywkNCwkMAorCXN0cQkkNCwwKCQxNikKKwlvcgkkMCwkMSwkMAorCisJYWRkcQkkMTcsOCwkMTcKKwlhZGRxCSQxOCw4LCQxOAorCWJpcwkkNSwkNSwkMworCWJpcwkkNiwkNiwkNAorCWFkZHEJJDE2LDgsJDE2CisJYm5lCSQyLC5Mb29wMAorCisuTDA6CWJlcQkkMTksLkxlbmQKKworCS5hbGlnbgkzCisuTG9vcDoJc3VicQkkMTksNCwkMTkKKworCWxkcQkkNSw4KCQxNykKKwlhZGRxCSQ0LCQwLCQ0CisJbGRxCSQ2LDgoJDE4KQorCWNtcHVsdAkkNCwkMCwkMQorCXN1YnEJJDMsJDQsJDQKKwljbXB1bHQJJDMsJDQsJDAKKwlzdHEJJDQsMCgkMTYpCisJb3IJJDAsJDEsJDAKKworCWxkcQkkMywxNigkMTcpCisJYWRkcQkkNiwkMCwkNgorCWxkcQkkNCwxNigkMTgpCisJY21wdWx0CSQ2LCQwLCQxCisJc3VicQkkNSwkNiwkNgorCWNtcHVsdAkkNSwkNiwkMAorCXN0cQkkNiw4KCQxNikKKwlvcgkkMCwkMSwkMAorCisJbGRxCSQ1LDI0KCQxNykKKwlhZGRxCSQ0LCQwLCQ0CisJbGRxCSQ2LDI0KCQxOCkKKwljbXB1bHQJJDQsJDAsJDEKKwlzdWJxCSQzLCQ0LCQ0CisJY21wdWx0CSQzLCQ0LCQwCisJc3RxCSQ0LDE2KCQxNikKKwlvcgkkMCwkMSwkMAorCisJbGRxCSQzLDMyKCQxNykKKwlhZGRxCSQ2LCQwLCQ2CisJbGRxCSQ0LDMyKCQxOCkKKwljbXB1bHQJJDYsJDAsJDEKKwlzdWJxCSQ1LCQ2LCQ2CisJY21wdWx0CSQ1LCQ2LCQwCisJc3RxCSQ2LDI0KCQxNikKKwlvcgkkMCwkMSwkMAorCisJYWRkcQkkMTcsMzIsJDE3CisJYWRkcQkkMTgsMzIsJDE4CisJYWRkcQkkMTYsMzIsJDE2CisJYm5lCSQxOSwuTG9vcAorCisuTGVuZDoJYWRkcQkkNCwkMCwkNAorCWNtcHVsdAkkNCwkMCwkMQorCXN1YnEJJDMsJDQsJDQKKwljbXB1bHQJJDMsJDQsJDAKKwlzdHEJJDQsMCgkMTYpCisJb3IJJDAsJDEsJDAKKwlyZXQJJDMxLCgkMjYpLDEKKworCS5lbmQJX2djcnlfbXBpaF9zdWJfbgorCisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvYWxwaGEvdWRpdi1xcm5uZC5TIGIvbGliZ2NyeXB0LTEuNC42L21waS9hbHBoYS91ZGl2LXFybm5kLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQwYzUyZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvYWxwaGEvdWRpdi1xcm5uZC5TCkBAIC0wLDAgKzEsMTU5IEBACisvKiBBbHBoYSAyMTA2NCBfX3VkaXZfcXJubmQKKyAqCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NCwgMTk5NSwgMTk5OCwKKyAqICAgICAgICAgICAgICAgICAgICAyMDAxLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqCisgKiBOb3RlOiBUaGlzIGNvZGUgaXMgaGVhdmlseSBiYXNlZCBvbiB0aGUgR05VIE1QIExpYnJhcnkuCisgKgkgQWN0dWFsbHkgaXQncyB0aGUgc2FtZSBjb2RlIHdpdGggb25seSBtaW5vciBjaGFuZ2VzIGluIHRoZQorICoJIHdheSB0aGUgZGF0YSBpcyBzdG9yZWQ7IHRoaXMgaXMgdG8gc3VwcG9ydCB0aGUgYWJzdHJhY3Rpb24KKyAqCSBvZiBhbiBvcHRpb25hbCBzZWN1cmUgbWVtb3J5IGFsbG9jYXRpb24gd2hpY2ggbWF5IGJlIHVzZWQKKyAqCSB0byBhdm9pZCByZXZlYWxpbmcgb2Ygc2Vuc2l0aXZlIGRhdGEgZHVlIHRvIHBhZ2luZyBldGMuCisgKi8KKworCisKKwkuc2V0IG5vcmVvcmRlcgorCS5zZXQgbm9hdAorLnRleHQKKwkuYWxpZ24JMworCS5nbG9ibAlfX3VkaXZfcXJubmQKKwkuZW50CV9fdWRpdl9xcm5uZAorX191ZGl2X3Fybm5kOgorCS5mcmFtZSAkMzAsMCwkMjYsMAorCS5wcm9sb2d1ZSAwCisjZGVmaW5lIGNudAkkMgorI2RlZmluZSB0bXAJJDMKKyNkZWZpbmUgcmVtX3B0ciAkMTYKKyNkZWZpbmUgbjEJJDE3CisjZGVmaW5lIG4wCSQxOAorI2RlZmluZSBkCSQxOQorI2RlZmluZSBxYgkkMjAKKworCWxkaXEJY250LDE2CisJYmx0CWQsLkxhcmdlZGl2aXNvcgorCisuTG9vcDE6IGNtcGx0CW4wLDAsdG1wCisJYWRkcQluMSxuMSxuMQorCWJpcwluMSx0bXAsbjEKKwlhZGRxCW4wLG4wLG4wCisJY21wdWxlCWQsbjEscWIKKwlzdWJxCW4xLGQsdG1wCisJY21vdm5lCXFiLHRtcCxuMQorCWJpcwluMCxxYixuMAorCWNtcGx0CW4wLDAsdG1wCisJYWRkcQluMSxuMSxuMQorCWJpcwluMSx0bXAsbjEKKwlhZGRxCW4wLG4wLG4wCisJY21wdWxlCWQsbjEscWIKKwlzdWJxCW4xLGQsdG1wCisJY21vdm5lCXFiLHRtcCxuMQorCWJpcwluMCxxYixuMAorCWNtcGx0CW4wLDAsdG1wCisJYWRkcQluMSxuMSxuMQorCWJpcwluMSx0bXAsbjEKKwlhZGRxCW4wLG4wLG4wCisJY21wdWxlCWQsbjEscWIKKwlzdWJxCW4xLGQsdG1wCisJY21vdm5lCXFiLHRtcCxuMQorCWJpcwluMCxxYixuMAorCWNtcGx0CW4wLDAsdG1wCisJYWRkcQluMSxuMSxuMQorCWJpcwluMSx0bXAsbjEKKwlhZGRxCW4wLG4wLG4wCisJY21wdWxlCWQsbjEscWIKKwlzdWJxCW4xLGQsdG1wCisJY21vdm5lCXFiLHRtcCxuMQorCWJpcwluMCxxYixuMAorCXN1YnEJY250LDEsY250CisJYmd0CWNudCwuTG9vcDEKKwlzdHEJbjEsMChyZW1fcHRyKQorCWJpcwkkMzEsbjAsJDAKKwlyZXQJJDMxLCgkMjYpLDEKKworLkxhcmdlZGl2aXNvcjoKKwlhbmQJbjAsMSwkNAorCisJc3JsCW4wLDEsbjAKKwlzbGwJbjEsNjMsdG1wCisJb3IJdG1wLG4wLG4wCisJc3JsCW4xLDEsbjEKKworCWFuZAlkLDEsJDYKKwlzcmwJZCwxLCQ1CisJYWRkcQkkNSwkNiwkNQorCisuTG9vcDI6IGNtcGx0CW4wLDAsdG1wCisJYWRkcQluMSxuMSxuMQorCWJpcwluMSx0bXAsbjEKKwlhZGRxCW4wLG4wLG4wCisJY21wdWxlCSQ1LG4xLHFiCisJc3VicQluMSwkNSx0bXAKKwljbW92bmUJcWIsdG1wLG4xCisJYmlzCW4wLHFiLG4wCisJY21wbHQJbjAsMCx0bXAKKwlhZGRxCW4xLG4xLG4xCisJYmlzCW4xLHRtcCxuMQorCWFkZHEJbjAsbjAsbjAKKwljbXB1bGUJJDUsbjEscWIKKwlzdWJxCW4xLCQ1LHRtcAorCWNtb3ZuZQlxYix0bXAsbjEKKwliaXMJbjAscWIsbjAKKwljbXBsdAluMCwwLHRtcAorCWFkZHEJbjEsbjEsbjEKKwliaXMJbjEsdG1wLG4xCisJYWRkcQluMCxuMCxuMAorCWNtcHVsZQkkNSxuMSxxYgorCXN1YnEJbjEsJDUsdG1wCisJY21vdm5lCXFiLHRtcCxuMQorCWJpcwluMCxxYixuMAorCWNtcGx0CW4wLDAsdG1wCisJYWRkcQluMSxuMSxuMQorCWJpcwluMSx0bXAsbjEKKwlhZGRxCW4wLG4wLG4wCisJY21wdWxlCSQ1LG4xLHFiCisJc3VicQluMSwkNSx0bXAKKwljbW92bmUJcWIsdG1wLG4xCisJYmlzCW4wLHFiLG4wCisJc3VicQljbnQsMSxjbnQKKwliZ3QJY250LC5Mb29wMgorCisJYWRkcQluMSxuMSxuMQorCWFkZHEJJDQsbjEsbjEKKwlibmUJJDYsLkxPZGQKKwlzdHEJbjEsMChyZW1fcHRyKQorCWJpcwkkMzEsbjAsJDAKKwlyZXQJJDMxLCgkMjYpLDEKKworLkxPZGQ6CisJLyogcScgaW4gbjAuIHInIGluIG4xICovCisJYWRkcQluMSxuMCxuMQorCWNtcHVsdAluMSxuMCx0bXAJIyB0bXAgOj0gY2FycnkgZnJvbSBhZGRxCisJYmVxCXRtcCwuTExwNgorCWFkZHEJbjAsMSxuMAorCXN1YnEJbjEsZCxuMQorLkxMcDY6CWNtcHVsdAluMSxkLHRtcAorCWJuZQl0bXAsLkxMcDcKKwlhZGRxCW4wLDEsbjAKKwlzdWJxCW4xLGQsbjEKKy5MTHA3OgorCXN0cQluMSwwKHJlbV9wdHIpCisJYmlzCSQzMSxuMCwkMAorCXJldAkkMzEsKCQyNiksMQorCisJLmVuZAlfX3VkaXZfcXJubmQKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvYW1kNjQvZGlzdGZpbGVzIGIvbGliZ2NyeXB0LTEuNC42L21waS9hbWQ2NC9kaXN0ZmlsZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY2NGM4ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvYW1kNjQvZGlzdGZpbGVzCkBAIC0wLDAgKzEsNyBAQAorbXBpaC1hZGQxLlMKK21waWgtbHNoaWZ0LlMKK21waWgtbXVsMS5TCittcGloLW11bDIuUworbXBpaC1tdWwzLlMKK21waWgtcnNoaWZ0LlMKK21waWgtc3ViMS5TCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL2FtZDY0L21waWgtYWRkMS5TIGIvbGliZ2NyeXB0LTEuNC42L21waS9hbWQ2NC9tcGloLWFkZDEuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGVjODljCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9hbWQ2NC9tcGloLWFkZDEuUwpAQCAtMCwwICsxLDYzIEBACisvKiBBTUQ2NCAoeDg2XzY0KSBhZGRfbiAtLSBBZGQgdHdvIGxpbWIgdmVjdG9ycyBvZiB0aGUgc2FtZSBsZW5ndGggPiAwIGFuZCBzdG9yZQorICoJCSAgIHN1bSBpbiBhIHRoaXJkIGxpbWIgdmVjdG9yLgorICoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk0LCAxOTk1LCAxOTk4LCAKKyAqICAgICAgICAgICAgICAgICAgICAyMDAxLCAyMDAyLCAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqCisgKiBOb3RlOiBUaGlzIGNvZGUgaXMgaGVhdmlseSBiYXNlZCBvbiB0aGUgR05VIE1QIExpYnJhcnkuCisgKgkgQWN0dWFsbHkgaXQncyB0aGUgc2FtZSBjb2RlIHdpdGggb25seSBtaW5vciBjaGFuZ2VzIGluIHRoZQorICoJIHdheSB0aGUgZGF0YSBpcyBzdG9yZWQ7IHRoaXMgaXMgdG8gc3VwcG9ydCB0aGUgYWJzdHJhY3Rpb24KKyAqCSBvZiBhbiBvcHRpb25hbCBzZWN1cmUgbWVtb3J5IGFsbG9jYXRpb24gd2hpY2ggbWF5IGJlIHVzZWQKKyAqCSB0byBhdm9pZCByZXZlYWxpbmcgb2Ygc2Vuc2l0aXZlIGRhdGEgZHVlIHRvIHBhZ2luZyBldGMuCisgKi8KKworCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAiYXNtLXN5bnRheC5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqCisgKiAgbXBpX2xpbWJfdAorICogIF9nY3J5X21waWhfYWRkX24oIG1waV9wdHJfdCByZXNfcHRyLAlyZGkKKyAqCQkgICBtcGlfcHRyX3QgczFfcHRyLAkJcnNpCisgKgkJICAgbXBpX3B0cl90IHMyX3B0ciwJCXJkeAorICoJCSAgIG1waV9zaXplX3Qgc2l6ZSkJCXJjeAorICovCisKKy50ZXh0CisJLmdsb2JsIENfU1lNQk9MX05BTUUoX2djcnlfbXBpaF9hZGRfbikKK0NfU1lNQk9MX05BTUUoX2djcnlfbXBpaF9hZGRfbjopCisJbGVhcQkoJXJzaSwlcmN4LDgpLCAlcnNpCisJbGVhcQkoJXJkaSwlcmN4LDgpLCAlcmRpCisJbGVhcQkoJXJkeCwlcmN4LDgpLCAlcmR4CisJbmVncQklcmN4CisJeG9ybAklZWF4LCAlZWF4CQkvKiBjbGVhciBjeSAqLworCisJQUxJR04oNCkJCQkvKiBtaW5pbWFsIGFsaWdubWVudCBmb3IgY2xhaW1lZCBzcGVlZCAqLworLkxvb3A6CW1vdnEJKCVyc2ksJXJjeCw4KSwgJXJheAorCW1vdnEJKCVyZHgsJXJjeCw4KSwgJXIxMAorCWFkY3EJJXIxMCwgJXJheAorCW1vdnEJJXJheCwgKCVyZGksJXJjeCw4KQorCWluY3EJJXJjeAorCWpuZQkuTG9vcAorCisJbW92cQklcmN4LCAlcmF4CQkvKiB6ZXJvICVyYXggKi8KKwlhZGNxCSVyYXgsICVyYXgKKwlyZXQKKwkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL2FtZDY0L21waWgtbHNoaWZ0LlMgYi9saWJnY3J5cHQtMS40LjYvbXBpL2FtZDY0L21waWgtbHNoaWZ0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg3ZGQxYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvYW1kNjQvbXBpaC1sc2hpZnQuUwpAQCAtMCwwICsxLDc3IEBACisvKiBBTUQ2NCAoeDg2XzY0KSBsc2hpZnQgLS0gTGVmdCBzaGlmdCBhIGxpbWIgdmVjdG9yIGFuZCBzdG9yZQorICoJCSAgcmVzdWx0IGluIGEgc2Vjb25kIGxpbWIgdmVjdG9yLgorICoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk0LCAxOTk1LCAxOTk4LCAKKyAqICAgICAgICAgICAgICAgICAgICAyMDAxLCAyMDAyLCAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqCisgKiBOb3RlOiBUaGlzIGNvZGUgaXMgaGVhdmlseSBiYXNlZCBvbiB0aGUgR05VIE1QIExpYnJhcnkuCisgKgkgQWN0dWFsbHkgaXQncyB0aGUgc2FtZSBjb2RlIHdpdGggb25seSBtaW5vciBjaGFuZ2VzIGluIHRoZQorICoJIHdheSB0aGUgZGF0YSBpcyBzdG9yZWQ7IHRoaXMgaXMgdG8gc3VwcG9ydCB0aGUgYWJzdHJhY3Rpb24KKyAqCSBvZiBhbiBvcHRpb25hbCBzZWN1cmUgbWVtb3J5IGFsbG9jYXRpb24gd2hpY2ggbWF5IGJlIHVzZWQKKyAqCSB0byBhdm9pZCByZXZlYWxpbmcgb2Ygc2Vuc2l0aXZlIGRhdGEgZHVlIHRvIHBhZ2luZyBldGMuCisgKi8KKworCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAiYXNtLXN5bnRheC5oIgorCisvKioqKioqKioqKioqKioqKioqKgorICogbXBpX2xpbWJfdAorICogX2djcnlfbXBpaF9sc2hpZnQoIG1waV9wdHJfdCB3cCwJcmRpCisgKgkJICAgbXBpX3B0cl90IHVwLAlyc2kKKyAqCQkgICBtcGlfc2l6ZV90IHVzaXplLAlyZHgKKyAqCQkgICB1bnNpZ25lZCBjbnQpCXJjeAorICovCisKKy50ZXh0CisJLmdsb2JsIENfU1lNQk9MX05BTUUoX2djcnlfbXBpaF9sc2hpZnQpCitDX1NZTUJPTF9OQU1FKF9nY3J5X21waWhfbHNoaWZ0OikKKwltb3ZxCS04KCVyc2ksJXJkeCw4KSwgJW1tNworCW1vdmQJJWVjeCwgJW1tMQorCW1vdmwJJDY0LCAlZWF4CisJc3VibAklZWN4LCAlZWF4CisJbW92ZAklZWF4LCAlbW0wCisJbW92cQklbW03LCAlbW0zCisJcHNybHEJJW1tMCwgJW1tNworCW1vdmQJJW1tNywgJXJheAorCXN1YnEJJDIsICVyZHgKKwlqbAkuTGVuZG8KKworCUFMSUdOKDQpCQkJLyogbWluaW1hbCBhbGlnbm1lbnQgZm9yIGNsYWltZWQgc3BlZWQgKi8KKy5Mb29wOgltb3ZxCSglcnNpLCVyZHgsOCksICVtbTYKKwltb3ZxCSVtbTYsICVtbTIKKwlwc3JscQklbW0wLCAlbW02CisJcHNsbHEJJW1tMSwgJW1tMworCXBvcgklbW02LCAlbW0zCisJbW92cQklbW0zLCA4KCVyZGksJXJkeCw4KQorCWplCS5MZW5kZQorCW1vdnEJLTgoJXJzaSwlcmR4LDgpLCAlbW03CisJbW92cQklbW03LCAlbW0zCisJcHNybHEJJW1tMCwgJW1tNworCXBzbGxxCSVtbTEsICVtbTIKKwlwb3IJJW1tNywgJW1tMgorCW1vdnEJJW1tMiwgKCVyZGksJXJkeCw4KQorCXN1YnEJJDIsICVyZHgKKwlqZ2UJLkxvb3AKKworLkxlbmRvOgltb3ZxCSVtbTMsICVtbTIKKy5MZW5kZToJcHNsbHEJJW1tMSwgJW1tMgorCW1vdnEJJW1tMiwgKCVyZGkpCisJZW1tcworCXJldApkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9hbWQ2NC9tcGloLW11bDEuUyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvYW1kNjQvbXBpaC1tdWwxLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRiMGFiNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvYW1kNjQvbXBpaC1tdWwxLlMKQEAgLTAsMCArMSw2NSBAQAorLyogQU1ENjQgbXVsXzEgLS0gTXVsdGlwbHkgYSBsaW1iIHZlY3RvciB3aXRoIGEgbGltYiBhbmQgc3RvcmUKKyAqCQkJIHRoZSByZXN1bHQgaW4gYSBzZWNvbmQgbGltYiB2ZWN0b3IuCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NCwgMTk5OCwgCisgKiAgICAgICAgICAgICAgICAgICAgMjAwMSwgMjAwMiwgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKgorICogTm90ZTogVGhpcyBjb2RlIGlzIGhlYXZpbHkgYmFzZWQgb24gdGhlIEdOVSBNUCBMaWJyYXJ5LgorICoJIEFjdHVhbGx5IGl0J3MgdGhlIHNhbWUgY29kZSB3aXRoIG9ubHkgbWlub3IgY2hhbmdlcyBpbiB0aGUKKyAqCSB3YXkgdGhlIGRhdGEgaXMgc3RvcmVkOyB0aGlzIGlzIHRvIHN1cHBvcnQgdGhlIGFic3RyYWN0aW9uCisgKgkgb2YgYW4gb3B0aW9uYWwgc2VjdXJlIG1lbW9yeSBhbGxvY2F0aW9uIHdoaWNoIG1heSBiZSB1c2VkCisgKgkgdG8gYXZvaWQgcmV2ZWFsaW5nIG9mIHNlbnNpdGl2ZSBkYXRhIGR1ZSB0byBwYWdpbmcgZXRjLgorICovCisKKworI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImFzbS1zeW50YXguaCIKKworLyoqKioqKioqKioqKioqKioqKioKKyAqIG1waV9saW1iX3QKKyAqIF9nY3J5X21waWhfbXVsXzEoIG1waV9wdHJfdCByZXNfcHRyLAkocmRpKQorICoJCSAgbXBpX3B0cl90IHMxX3B0ciwJKHJzaSkKKyAqCQkgIG1waV9zaXplX3QgczFfc2l6ZSwJKHJkeCkKKyAqCQkgIG1waV9saW1iX3QgczJfbGltYikJKHJjeCkKKyAqLworCisKKwlURVhUCisJQUxJR04oNSkKKwkuYnl0ZQkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMAorCisJR0xPQkwJQ19TWU1CT0xfTkFNRShfZ2NyeV9tcGloX211bF8xKQorQ19TWU1CT0xfTkFNRShfZ2NyeV9tcGloX211bF8xOikKKworCW1vdnEJJXJkeCwgJXIxMQorCWxlYXEJKCVyc2ksJXJkeCw4KSwgJXJzaQorCWxlYXEJKCVyZGksJXJkeCw4KSwgJXJkaQorCW5lZ3EJJXIxMQorCXhvcmwJJXI4ZCwgJXI4ZAorCisuTG9vcDoJbW92cQkoJXJzaSwlcjExLDgpLCAlcmF4CisJbXVscQklcmN4CisJYWRkcQklcjgsICVyYXgKKwltb3ZsCSQwLCAlcjhkCisJYWRjcQklcmR4LCAlcjgKKwltb3ZxCSVyYXgsICglcmRpLCVyMTEsOCkKKwlpbmNxCSVyMTEKKwlqbmUJLkxvb3AKKworCW1vdnEJJXI4LCAlcmF4CisJcmV0CmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL2FtZDY0L21waWgtbXVsMi5TIGIvbGliZ2NyeXB0LTEuNC42L21waS9hbWQ2NC9tcGloLW11bDIuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTgwZjc2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9hbWQ2NC9tcGloLW11bDIuUwpAQCAtMCwwICsxLDEwNyBAQAorLyogQU1ENjQgYWRkbXVsMiAtLSBNdWx0aXBseSBhIGxpbWIgdmVjdG9yIHdpdGggYSBsaW1iIGFuZCBhZGQKKyAqCQkgICAgICB0aGUgcmVzdWx0IHRvIGEgc2Vjb25kIGxpbWIgdmVjdG9yLgorICoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk0LCAxOTk4LAorICogICAgICAgICAgICAgICAgICAgIDIwMDEsIDIwMDIsIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICoKKyAqIE5vdGU6IFRoaXMgY29kZSBpcyBoZWF2aWx5IGJhc2VkIG9uIHRoZSBHTlUgTVAgTGlicmFyeS4KKyAqCSBBY3R1YWxseSBpdCdzIHRoZSBzYW1lIGNvZGUgd2l0aCBvbmx5IG1pbm9yIGNoYW5nZXMgaW4gdGhlCisgKgkgd2F5IHRoZSBkYXRhIGlzIHN0b3JlZDsgdGhpcyBpcyB0byBzdXBwb3J0IHRoZSBhYnN0cmFjdGlvbgorICoJIG9mIGFuIG9wdGlvbmFsIHNlY3VyZSBtZW1vcnkgYWxsb2NhdGlvbiB3aGljaCBtYXkgYmUgdXNlZAorICoJIHRvIGF2b2lkIHJldmVhbGluZyBvZiBzZW5zaXRpdmUgZGF0YSBkdWUgdG8gcGFnaW5nIGV0Yy4KKyAqLworCisKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJhc20tc3ludGF4LmgiCisKKworLyoqKioqKioqKioqKioqKioqKioKKyAqIG1waV9saW1iX3QKKyAqIF9nY3J5X21waWhfYWRkbXVsXzIoIG1waV9wdHJfdCByZXNfcHRyLCAgICAgIChzcCArIDQpCisgKgkJICAgICBtcGlfcHRyX3QgczFfcHRyLAkgICAgIChzcCArIDgpCisgKgkJICAgICBtcGlfc2l6ZV90IHMxX3NpemUsICAgICAoc3AgKyAxMikKKyAqCQkgICAgIG1waV9saW1iX3QgczJfbGltYikgICAgIChzcCArIDE2KQorICovCisKKwkvKiBpODAzODYgYWRkbXVsXzEgLS0gTXVsdGlwbHkgYSBsaW1iIHZlY3RvciB3aXRoIGEgbGltYiBhbmQgYWRkCisgKgkJICAgICAgdGhlIHJlc3VsdCB0byBhIHNlY29uZCBsaW1iIHZlY3Rvci4KKyAqCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NCwgMTk5OCwKKyAqICAgICAgICAgICAgICAgICAgICAyMDAxLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqCisgKiBOb3RlOiBUaGlzIGNvZGUgaXMgaGVhdmlseSBiYXNlZCBvbiB0aGUgR05VIE1QIExpYnJhcnkuCisgKgkgQWN0dWFsbHkgaXQncyB0aGUgc2FtZSBjb2RlIHdpdGggb25seSBtaW5vciBjaGFuZ2VzIGluIHRoZQorICoJIHdheSB0aGUgZGF0YSBpcyBzdG9yZWQ7IHRoaXMgaXMgdG8gc3VwcG9ydCB0aGUgYWJzdHJhY3Rpb24KKyAqCSBvZiBhbiBvcHRpb25hbCBzZWN1cmUgbWVtb3J5IGFsbG9jYXRpb24gd2hpY2ggbWF5IGJlIHVzZWQKKyAqCSB0byBhdm9pZCByZXZlYWxpbmcgb2Ygc2Vuc2l0aXZlIGRhdGEgZHVlIHRvIHBhZ2luZyBldGMuCisgKi8KKworCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAiYXNtLXN5bnRheC5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqCisgKiBtcGlfbGltYl90CisgKiBfZ2NyeV9tcGloX2FkZG11bF8xKCBtcGlfcHRyX3QgcmVzX3B0ciwgICAocmRpKQorICoJCSAgICAgbXBpX3B0cl90IHMxX3B0ciwJICAgICAocnNpKQorICoJCSAgICAgbXBpX3NpemVfdCBzMV9zaXplLCAgICAgKHJkeCkKKyAqCQkgICAgIG1waV9saW1iX3QgczJfbGltYikgICAgIChyY3gpCisgKi8KKwlURVhUCisJR0xPQkwJQ19TWU1CT0xfTkFNRShfZ2NyeV9tcGloX2FkZG11bF8xKQorQ19TWU1CT0xfTkFNRShfZ2NyeV9tcGloX2FkZG11bF8xOikKKwltb3ZxCSVyZHgsICVyMTEKKwlsZWFxCSglcnNpLCVyZHgsOCksICVyc2kKKwlsZWFxCSglcmRpLCVyZHgsOCksICVyZGkKKwluZWdxCSVyMTEKKwl4b3JsCSVyOGQsICVyOGQKKwl4b3JsCSVyMTBkLCAlcjEwZAorCisJQUxJR04oMykJCQkvKiBtaW5pbWFsIGFsaWdubWVudCBmb3IgY2xhaW1lZCBzcGVlZCAqLworLkxvb3A6CW1vdnEJKCVyc2ksJXIxMSw4KSwgJXJheAorCW11bHEJJXJjeAorCWFkZHEJKCVyZGksJXIxMSw4KSwgJXJheAorCWFkY3EJJXIxMCwgJXJkeAorCWFkZHEJJXI4LCAlcmF4CisJbW92cQklcjEwLCAlcjgKKwltb3ZxCSVyYXgsICglcmRpLCVyMTEsOCkKKwlhZGNxCSVyZHgsICVyOAorCWluY3EJJXIxMQorCWpuZQkuTG9vcAorCisJbW92cQklcjgsICVyYXgKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvYW1kNjQvbXBpaC1tdWwzLlMgYi9saWJnY3J5cHQtMS40LjYvbXBpL2FtZDY0L21waWgtbXVsMy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNDU4YTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL2FtZDY0L21waWgtbXVsMy5TCkBAIC0wLDAgKzEsNjYgQEAKKy8qIEFNRDY0IHN1Ym11bF8xIC0tIE11bHRpcGx5IGEgbGltYiB2ZWN0b3Igd2l0aCBhIGxpbWIgYW5kIGFkZAorICoJCSAgICAgIHRoZSByZXN1bHQgdG8gYSBzZWNvbmQgbGltYiB2ZWN0b3IuCisgKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTQsIDE5OTgsIAorICogICAgICAgICAgICAgICAgICAgIDIwMDEsIDIwMDIsIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICoKKyAqIE5vdGU6IFRoaXMgY29kZSBpcyBoZWF2aWx5IGJhc2VkIG9uIHRoZSBHTlUgTVAgTGlicmFyeS4KKyAqCSBBY3R1YWxseSBpdCdzIHRoZSBzYW1lIGNvZGUgd2l0aCBvbmx5IG1pbm9yIGNoYW5nZXMgaW4gdGhlCisgKgkgd2F5IHRoZSBkYXRhIGlzIHN0b3JlZDsgdGhpcyBpcyB0byBzdXBwb3J0IHRoZSBhYnN0cmFjdGlvbgorICoJIG9mIGFuIG9wdGlvbmFsIHNlY3VyZSBtZW1vcnkgYWxsb2NhdGlvbiB3aGljaCBtYXkgYmUgdXNlZAorICoJIHRvIGF2b2lkIHJldmVhbGluZyBvZiBzZW5zaXRpdmUgZGF0YSBkdWUgdG8gcGFnaW5nIGV0Yy4KKyAqLworCisKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJhc20tc3ludGF4LmgiCisKKworLyoqKioqKioqKioqKioqKioqKioKKyAqIG1waV9saW1iX3QKKyAqIF9nY3J5X21waWhfc3VibXVsXzEoIG1waV9wdHJfdCByZXNfcHRyLCAgIChyZGkpCisgKgkJICAgICBtcGlfcHRyX3QgczFfcHRyLAkgICAgIChyc2kpCisgKgkJICAgICBtcGlfc2l6ZV90IHMxX3NpemUsICAgICAocmR4KQorICoJCSAgICAgbXBpX2xpbWJfdCBzMl9saW1iKSAgICAgKHJjeCkKKyAqLworCVRFWFQKKwlHTE9CTAlDX1NZTUJPTF9OQU1FKF9nY3J5X21waWhfc3VibXVsXzEpCitDX1NZTUJPTF9OQU1FKF9nY3J5X21waWhfc3VibXVsXzE6KQorCisJbW92cQklcmR4LCAlcjExCisJbGVhcQkoJXJzaSwlcjExLDgpLCAlcnNpCisJbGVhcQkoJXJkaSwlcjExLDgpLCAlcmRpCisJbmVncQklcjExCisJeG9ybAklcjhkLCAlcjhkCisKKwlBTElHTigzKQkJCS8qIG1pbmltYWwgYWxpZ25tZW50IGZvciBjbGFpbWVkIHNwZWVkICovCisuTG9vcDoJbW92cQkoJXJzaSwlcjExLDgpLCAlcmF4CisJbW92cQkoJXJkaSwlcjExLDgpLCAlcjEwCisJbXVscQklcmN4CisJc3VicQklcjgsICVyMTAKKwltb3ZsCSQwLCAlcjhkCisJYWRjbAklcjhkLCAlcjhkCisJc3VicQklcmF4LCAlcjEwCisJYWRjcQklcmR4LCAlcjgKKwltb3ZxCSVyMTAsICglcmRpLCVyMTEsOCkKKwlpbmNxCSVyMTEKKwlqbmUJLkxvb3AKKworCW1vdnEJJXI4LCAlcmF4CisJcmV0CmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL2FtZDY0L21waWgtcnNoaWZ0LlMgYi9saWJnY3J5cHQtMS40LjYvbXBpL2FtZDY0L21waWgtcnNoaWZ0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNmYzhmNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvYW1kNjQvbXBpaC1yc2hpZnQuUwpAQCAtMCwwICsxLDgwIEBACisvKiBBTUQ2NCAoeDg2XzY0KSByc2hpZnQgLS0gUmlnaHQgc2hpZnQgYSBsaW1iIHZlY3RvciBhbmQgc3RvcmUKKyAqCQkgIHJlc3VsdCBpbiBhIHNlY29uZCBsaW1iIHZlY3Rvci4KKyAqCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NCwgMTk5NSwgMTk5OCwgCisgKiAgICAgICAgICAgICAgICAgICAgMjAwMSwgMjAwMiwgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKgorICogTm90ZTogVGhpcyBjb2RlIGlzIGhlYXZpbHkgYmFzZWQgb24gdGhlIEdOVSBNUCBMaWJyYXJ5LgorICoJIEFjdHVhbGx5IGl0J3MgdGhlIHNhbWUgY29kZSB3aXRoIG9ubHkgbWlub3IgY2hhbmdlcyBpbiB0aGUKKyAqCSB3YXkgdGhlIGRhdGEgaXMgc3RvcmVkOyB0aGlzIGlzIHRvIHN1cHBvcnQgdGhlIGFic3RyYWN0aW9uCisgKgkgb2YgYW4gb3B0aW9uYWwgc2VjdXJlIG1lbW9yeSBhbGxvY2F0aW9uIHdoaWNoIG1heSBiZSB1c2VkCisgKgkgdG8gYXZvaWQgcmV2ZWFsaW5nIG9mIHNlbnNpdGl2ZSBkYXRhIGR1ZSB0byBwYWdpbmcgZXRjLgorICovCisKKworI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImFzbS1zeW50YXguaCIKKworLyoqKioqKioqKioqKioqKioqKioKKyAqIG1waV9saW1iX3QKKyAqIF9nY3J5X21waWhfcnNoaWZ0KCBtcGlfcHRyX3Qgd3AsCXJkaQorICoJCSAgIG1waV9wdHJfdCB1cCwJcnNpCisgKgkJICAgbXBpX3NpemVfdCB1c2l6ZSwJcmR4CisgKgkJICAgdW5zaWduZWQgY250KQlyY3gKKyAqLworCisudGV4dAorCS5nbG9ibCBDX1NZTUJPTF9OQU1FKF9nY3J5X21waWhfcnNoaWZ0KQorQ19TWU1CT0xfTkFNRShfZ2NyeV9tcGloX3JzaGlmdDopCisJbW92cQkoJXJzaSksICVtbTcKKwltb3ZkCSVlY3gsICVtbTEKKwltb3ZsCSQ2NCwgJWVheAorCXN1YmwJJWVjeCwgJWVheAorCW1vdmQJJWVheCwgJW1tMAorCW1vdnEJJW1tNywgJW1tMworCXBzbGxxCSVtbTAsICVtbTcKKwltb3ZkCSVtbTcsICVyYXgKKwlsZWFxCSglcnNpLCVyZHgsOCksICVyc2kKKwlsZWFxCSglcmRpLCVyZHgsOCksICVyZGkKKwluZWdxCSVyZHgKKwlhZGRxCSQyLCAlcmR4CisJamcJLkxlbmRvCisKKwlBTElHTig4KQkJCS8qIG1pbmltYWwgYWxpZ25tZW50IGZvciBjbGFpbWVkIHNwZWVkICovCisuTG9vcDoJbW92cQktOCglcnNpLCVyZHgsOCksICVtbTYKKwltb3ZxCSVtbTYsICVtbTIKKwlwc2xscQklbW0wLCAlbW02CisJcHNybHEJJW1tMSwgJW1tMworCXBvcgklbW02LCAlbW0zCisJbW92cQklbW0zLCAtMTYoJXJkaSwlcmR4LDgpCisJamUJLkxlbmRlCisJbW92cQkoJXJzaSwlcmR4LDgpLCAlbW03CisJbW92cQklbW03LCAlbW0zCisJcHNsbHEJJW1tMCwgJW1tNworCXBzcmxxCSVtbTEsICVtbTIKKwlwb3IJJW1tNywgJW1tMgorCW1vdnEJJW1tMiwgLTgoJXJkaSwlcmR4LDgpCisJYWRkcQkkMiwgJXJkeAorCWpsZQkuTG9vcAorCisuTGVuZG86CW1vdnEJJW1tMywgJW1tMgorLkxlbmRlOglwc3JscQklbW0xLCAlbW0yCisJbW92cQklbW0yLCAtOCglcmRpKQorCWVtbXMKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvYW1kNjQvbXBpaC1zdWIxLlMgYi9saWJnY3J5cHQtMS40LjYvbXBpL2FtZDY0L21waWgtc3ViMS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNjA5YjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL2FtZDY0L21waWgtc3ViMS5TCkBAIC0wLDAgKzEsNjEgQEAKKy8qIEFNRDY0ICh4ODZfNjQpIHN1Yl9uIC0tIFN1YnRyYWN0IHR3byBsaW1iIHZlY3RvcnMgb2YgdGhlIHNhbWUgbGVuZ3RoID4gMCBhbmQgc3RvcmUKKyAqCQkgICBzdW0gaW4gYSB0aGlyZCBsaW1iIHZlY3Rvci4KKyAqCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NCwgMTk5NSwgMTk5OCwgCisgKiAgICAgICAgICAgICAgICAgICAgMjAwMSwgMjAwMiwgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKgorICogTm90ZTogVGhpcyBjb2RlIGlzIGhlYXZpbHkgYmFzZWQgb24gdGhlIEdOVSBNUCBMaWJyYXJ5LgorICoJIEFjdHVhbGx5IGl0J3MgdGhlIHNhbWUgY29kZSB3aXRoIG9ubHkgbWlub3IgY2hhbmdlcyBpbiB0aGUKKyAqCSB3YXkgdGhlIGRhdGEgaXMgc3RvcmVkOyB0aGlzIGlzIHRvIHN1cHBvcnQgdGhlIGFic3RyYWN0aW9uCisgKgkgb2YgYW4gb3B0aW9uYWwgc2VjdXJlIG1lbW9yeSBhbGxvY2F0aW9uIHdoaWNoIG1heSBiZSB1c2VkCisgKgkgdG8gYXZvaWQgcmV2ZWFsaW5nIG9mIHNlbnNpdGl2ZSBkYXRhIGR1ZSB0byBwYWdpbmcgZXRjLgorICovCisKKworI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImFzbS1zeW50YXguaCIKKworCisvKioqKioqKioqKioqKioqKioqKgorICogIG1waV9saW1iX3QKKyAqICBfZ2NyeV9tcGloX3N1Yl9uKCBtcGlfcHRyX3QgcmVzX3B0ciwJcmRpCisgKgkJICAgbXBpX3B0cl90IHMxX3B0ciwJCXJzaQorICoJCSAgIG1waV9wdHJfdCBzMl9wdHIsCQlyZHgKKyAqCQkgICBtcGlfc2l6ZV90IHNpemUpCQlyY3gKKyAqLworLnRleHQKKwkuZ2xvYmwgQ19TWU1CT0xfTkFNRShfZ2NyeV9tcGloX3N1Yl9uKQorQ19TWU1CT0xfTkFNRShfZ2NyeV9tcGloX3N1Yl9uOikKKwlsZWFxCSglcnNpLCVyY3gsOCksICVyc2kKKwlsZWFxCSglcmRpLCVyY3gsOCksICVyZGkKKwlsZWFxCSglcmR4LCVyY3gsOCksICVyZHgKKwluZWdxCSVyY3gKKwl4b3JsCSVlYXgsICVlYXgJCS8qIGNsZWFyIGN5ICovCisKKwlBTElHTig0KQkJCS8qIG1pbmltYWwgYWxpZ25tZW50IGZvciBjbGFpbWVkIHNwZWVkICovCisuTG9vcDoJbW92cQkoJXJzaSwlcmN4LDgpLCAlcmF4CisJbW92cQkoJXJkeCwlcmN4LDgpLCAlcjEwCisJc2JicQklcjEwLCAlcmF4CisJbW92cQklcmF4LCAoJXJkaSwlcmN4LDgpCisJaW5jcQklcmN4CisJam5lCS5Mb29wCisKKwltb3ZxCSVyY3gsICVyYXgJCS8qIHplcm8gJXJheCAqLworCWFkY3EJJXJheCwgJXJheAorCXJldApkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9jb25maWcubGlua3MgYi9saWJnY3J5cHQtMS40LjYvbXBpL2NvbmZpZy5saW5rcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTUwNjM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9jb25maWcubGlua3MKQEAgLTAsMCArMSwzNjEgQEAKKyMgY29uZmlnLmxpbmtzIC0gaGVscGVyIGZvciAuLi9jb25maWd1cmUgICAgICAgICAgICAgLSotIG1vZGU6IHNoIC0qLQorIyBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyMKKyMgTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisjCisjIHNvdXJjZWQgYnkgLi4vY29uZmlndXJlIHRvIGdldCB0aGUgbGlzdCBvZiBmaWxlcyB0byBsaW5rCisjIHRoaXMgc2hvdWxkIHNldCAkbXBpX2xuX2xpc3QuCisjIE5vdGU6IHRoaXMgaXMgY2FsbGVkIGZyb20gdGhlIGFib3ZlIGRpcmVjdG9yeS4KKworbXBpX3NmbGFncz0KK21waV9leHRyYV9tb2R1bGVzPQorCit0ZXN0IC1kIC4vbXBpIHx8IG1rZGlyIC4vbXBpCisKKyMgV2UgZ3JlcCB0aGUgbGlzdCBvZiBtb2R1bGVzIGZyb20gdGhlIE1ha2VmaWxlIHNvIHRoYXQKKyMgd2UgZG9uJ3QgbmVlZCB0byBtYWludGFpbiB0aGVtIGhlcmUuCittcGlfc3RhbmRhcmRfbW9kdWxlcz1gJEFXSyAnL14jQkVHSU5fQVNNX0xJU1QvLC9eI0VORF9BU01fTElTVC8geworICAgICAgICAgICAgICAgICBpZiggJDMgIT0gIk8iICkgcHJpbnQgJDIgfScgICRzcmNkaXIvbXBpL01ha2VmaWxlLmFtYAorbXBpX29wdGlvbmFsX21vZHVsZXM9YCRBV0sgJy9eI0JFR0lOX0FTTV9MSVNULywvXiNFTkRfQVNNX0xJU1QvIHsKKyAgICAgICAgICAgICAgICAgaWYoICQzID09ICJPIiApIHByaW50ICQyIH0nICRzcmNkaXIvbXBpL01ha2VmaWxlLmFtYAorCisKK2VjaG8gJy8qIGNyZWF0ZWQgYnkgY29uZmlnLmxpbmtzIC0gZG8gbm90IGVkaXQgKi8nID4uL21waS9hc20tc3ludGF4LmgKK2VjaG8gIi8qIEhvc3Q6ICR7aG9zdH0gKi8iID4+Li9tcGkvYXNtLXN5bnRheC5oCisKK2lmIHRlc3QgIiR0cnlfYXNtX21vZHVsZXMiID0gInllcyIgOyB0aGVuCitjYXNlICIke2hvc3R9IiBpbgorICAgIHBvd2VycGMtYXBwbGUtZGFyd2luKiAgICAgICAgICB8IFwKKyAgICBpWzM0NTY3XTg2Ki0qLW9wZW5ic2RbMTJdKiAgICAgfCBcCisgICAgaVszNDU2N104NiotKi1vcGVuYnNkMy5bMDEyM10qKQorICAgICAgIGVjaG8gJy8qIE5vIHdvcmtpbmcgYXNzZW1ibGVyIG1vZHVsZXMgYXZhaWxhYmxlICovJyA+Pi4vbXBpL2FzbS1zeW50YXguaAorICAgICAgIHBhdGg9IiIKKyAgICAgICA7OworICAgIGlbMzQ2N104NiotKi1vcGVuYnNkKiAgICAgIHwgXAorICAgIGlbMzQ2N104NiotKi1mcmVlYnNkKi1lbGYgIHwgXAorICAgIGlbMzQ2N104NiotKi1mcmVlYnNkWzMtOV0qIHwgXAorICAgIGlbMzQ2N104NiotKi1mcmVlYnNkZWxmKiAgIHwgXAorICAgIGlbMzQ2N104NiotKi1uZXRic2QqICAgICAgIHwgXAorICAgIGlbMzQ2N104NiotKi1rKmJzZCopCisgICAgICAgZWNobyAnI2RlZmluZSBFTEZfU1lOVEFYJyA+Pi4vbXBpL2FzbS1zeW50YXguaAorICAgICAgIGNhdCAgJHNyY2Rpci9tcGkvaTM4Ni9zeW50YXguaAkgICA+Pi4vbXBpL2FzbS1zeW50YXguaAorICAgICAgIHBhdGg9ImkzODYiCisgICAgICAgOzsKKyAgICBpNTg2Ki0qLW9wZW5ic2QqICAgICAgICAgfCBcCisgICAgaTU4NiotKi1mcmVlYnNkKi1lbGYgICAgIHwgXAorICAgIGk1ODYqLSotZnJlZWJzZFszLTldKiAgICB8IFwKKyAgICBpNTg2Ki0qLWZyZWVic2RlbGYqICAgICAgfCBcCisgICAgaTU4NiotKi1uZXRic2QqCSAgICAgfCBcCisgICAgaTU4NiotKi1rKmJzZCoJICAgICB8IFwKKyAgICBwZW50aXVtLSotbmV0YnNkKgkgICAgIHwgXAorICAgIHBlbnRpdW1wcm8tKi1uZXRic2QqKQorICAgICAgIGVjaG8gJyNkZWZpbmUgRUxGX1NZTlRBWCcgPj4uL21waS9hc20tc3ludGF4LmgKKyAgICAgICBjYXQgICRzcmNkaXIvbXBpL2kzODYvc3ludGF4LmgJICAgPj4uL21waS9hc20tc3ludGF4LmgKKyAgICAgICBwYXRoPSJpNTg2IGkzODYiCisgICAgICAgOzsKKyAgICBpWzM0XTg2Ki0qLWJzZGk0KikKKyAgICAgICBlY2hvICcjZGVmaW5lIEVMRl9TWU5UQVgnID4+Li9tcGkvYXNtLXN5bnRheC5oCisgICAgICAgY2F0ICAkc3JjZGlyL21waS9pMzg2L3N5bnRheC5oCSA+Pi4vbXBpL2FzbS1zeW50YXguaAorICAgICAgIHBhdGg9ImkzODYiCisgICAgICAgOzsKKyAgICBpWzM0NjddODYqLSotbGludXhhb3V0KiAgfCBcCisgICAgaVszNDY3XTg2Ki0qLWxpbnV4b2xkbGQqIHwgXAorICAgIGlbMzQ2N104NiotKi0qYnNkKikKKwllY2hvICcjZGVmaW5lIEJTRF9TWU5UQVgnID4+Li9tcGkvYXNtLXN5bnRheC5oCisJZWNobyAnI2RlZmluZSBYODZfQlJPS0VOX0FMSUdOJyA+Pi4vbXBpL2FzbS1zeW50YXguaAorCWNhdCAgJHNyY2Rpci9tcGkvaTM4Ni9zeW50YXguaAkgICAgPj4uL21waS9hc20tc3ludGF4LmgKKwlwYXRoPSJpMzg2IgorCTs7CisgICAgaTU4NiotKi1saW51eGFvdXQqICB8IFwKKyAgICBpNTg2Ki0qLWxpbnV4b2xkbGQqIHwgXAorICAgIGk1ODYqLSotKmJzZCopCisJZWNobyAnI2RlZmluZSBCU0RfU1lOVEFYJyA+Pi4vbXBpL2FzbS1zeW50YXguaAorCWVjaG8gJyNkZWZpbmUgWDg2X0JST0tFTl9BTElHTicgPj4uL21waS9hc20tc3ludGF4LmgKKwljYXQgICRzcmNkaXIvbXBpL2kzODYvc3ludGF4LmgJICAgID4+Li9tcGkvYXNtLXN5bnRheC5oCisJcGF0aD0iaTU4NiBpMzg2IgorCTs7CisgICAgaVszNDY3XTg2Ki1tc2Rvc2RqZ3BwKiB8IFwKKyAgICBpWzM0XTg2Ki1hcHBsZS1kYXJ3aW4qKQorCWVjaG8gJyNkZWZpbmUgQlNEX1NZTlRBWCcgICAgICAgID4+Li9tcGkvYXNtLXN5bnRheC5oCisJY2F0ICAkc3JjZGlyL21waS9pMzg2L3N5bnRheC5oCSA+Pi4vbXBpL2FzbS1zeW50YXguaAorCXBhdGg9ImkzODYiCisJOzsKKyAgICBpNTg2Ki1tc2Rvc2RqZ3BwKiB8IFwKKyAgICBpWzU2N104NiotYXBwbGUtZGFyd2luKikKKwllY2hvICcjZGVmaW5lIEJTRF9TWU5UQVgnICAgICAgICA+Pi4vbXBpL2FzbS1zeW50YXguaAorCWNhdCAgJHNyY2Rpci9tcGkvaTM4Ni9zeW50YXguaAkgPj4uL21waS9hc20tc3ludGF4LmgKKwlwYXRoPSJpNTg2IGkzODYiCisJOzsKKyAgICBpWzM0NjddODYqLSotKikKKwllY2hvICcjZGVmaW5lIEVMRl9TWU5UQVgnID4+Li9tcGkvYXNtLXN5bnRheC5oCisJY2F0ICAkc3JjZGlyL21waS9pMzg2L3N5bnRheC5oCSAgICA+Pi4vbXBpL2FzbS1zeW50YXguaAorCXBhdGg9ImkzODYiCisJOzsKKyAgICBpNTg2Ki0qLSogIHwgXAorICAgIHBlbnRpdW0tKi0qICAgfCBcCisgICAgcGVudGl1bXByby0qLSopCisJZWNobyAnI2RlZmluZSBFTEZfU1lOVEFYJyA+Pi4vbXBpL2FzbS1zeW50YXguaAorCWNhdCAgJHNyY2Rpci9tcGkvaTM4Ni9zeW50YXguaAkgICAgPj4uL21waS9hc20tc3ludGF4LmgKKwlwYXRoPSJpNTg2IGkzODYiCisJOzsKKyAgICB4ODZfNjQtKi0qKQorCWVjaG8gJyNkZWZpbmUgRUxGX1NZTlRBWCcgPj4uL21waS9hc20tc3ludGF4LmgKKwljYXQgICRzcmNkaXIvbXBpL2kzODYvc3ludGF4LmgJICAgID4+Li9tcGkvYXNtLXN5bnRheC5oCisJcGF0aD0iYW1kNjQiCisJOzsKKyAgICBhbHBoYSotKi0qKQorCWVjaG8gJy8qIGNvbmZpZ3VyZWQgZm9yIGFscGhhICovJyA+Pi4vbXBpL2FzbS1zeW50YXguaAorCXBhdGg9ImFscGhhIgorCW1waV9leHRyYV9tb2R1bGVzPSJ1ZGl2LXFybm5kIgorCTs7CisgICAgaHBwYTcwMDAqLSotKikKKwllY2hvICcvKiBjb25maWd1cmVkIGZvciBIUFBBIChwYTcwMDApICovJyA+Pi4vbXBpL2FzbS1zeW50YXguaAorCXBhdGg9ImhwcGExLjEgaHBwYSIKKwltcGlfZXh0cmFfbW9kdWxlcz0idWRpdi1xcm5uZCIKKwk7OworICAgIGhwcGExLjAqLSotKikKKwllY2hvICcvKiBjb25maWd1cmVkIGZvciBIUFBBIDEuMCAqLycgPj4uL21waS9hc20tc3ludGF4LmgKKwlwYXRoPSJocHBhIgorCW1waV9leHRyYV9tb2R1bGVzPSJ1ZGl2LXFybm5kIgorCTs7CisgICAgaHBwYSotKi0qKQkjIGFzc3VtZSBwYTcxMDAKKwllY2hvICcvKiBjb25maWd1cmVkIGZvciBIUFBBIChwYTcxMDApICovJyA+Pi4vbXBpL2FzbS1zeW50YXguaAorCXBhdGg9InBhNzEwMCBocHBhMS4xIGhwcGEiCisJbXBpX2V4dHJhX21vZHVsZXM9InVkaXYtcXJubmQiCisJOzsKKyAgICBzcGFyYzY0LSotbGludXgtZ251KQorICAgICAgICBlY2hvICcvKiBObyB3b3JraW5nIGFzc2VtYmxlciBtb2R1bGVzIGF2YWlsYWJsZSAqLycgPj4uL21waS9hc20tc3ludGF4LmgKKwlwYXRoPSIiCisJOzsKKyAgICBzcGFyYzY0LXN1bi1zb2xhcmlzMiopCisgICAgICAgIGVjaG8gJy8qIE5vIHdvcmtpbmcgYXNzZW1ibGVyIG1vZHVsZXMgYXZhaWxhYmxlICovJyA+Pi4vbXBpL2FzbS1zeW50YXguaAorCXBhdGg9IiIKKyAgICAgICAgOzsKKyAgICBzcGFyYzY0LSotbmV0YnNkKiB8IHNwYXJjNjQtKi1mcmVlYnNkKiB8IHNwYXJjNjQtKi1vcGVuYnNkKikKKyAgICAgICAjIFRoZXJlIGFyZSBubyBzcGFyYzY0IGFzc2VtYmxlciBtb2R1bGVzIHRoYXQgd29yayBvbiB0aGUKKyAgICAgICAjICpCU0RzLCBzbyB1c2UgdGhlIGdlbmVyaWMgQyBmdW5jdGlvbnMuCisgICAgICAgZWNobyAnLyogTm8gd29ya2luZyBhc3NlbWJsZXIgbW9kdWxlcyBhdmFpbGFibGUgKi8nID4+Li9tcGkvYXNtLXN5bnRheC5oCisgICAgICAgcGF0aD0iIgorICAgICAgIDs7CisgICAgc3BhcmM2NCotKi0qKQorICAgICAgIGVjaG8gJy8qIE5vIHdvcmtpbmcgYXNzZW1ibGVyIG1vZHVsZXMgYXZhaWxhYmxlICovJyA+Pi4vbXBpL2FzbS1zeW50YXguaAorICAgICAgIHBhdGg9IiIKKyAgICAgICA7OworICAgIHNwYXJjOSotKi0qICAgICB8IFwKKyAgICB1bHRyYXNwYXJjKi0qLSogKQorCWVjaG8gJy8qIGNvbmZpZ3VyZWQgZm9yIHNwYXJjOSBvciBoaWdoZXIgKi8nID4+Li9tcGkvYXNtLXN5bnRheC5oCisJcGF0aD0ic3BhcmMzMnY4IHNwYXJjMzIiCisJOzsKKyAgICBzcGFyYzgqLSotKiAgICAgfCBcCisgICAgbWljcm9zcGFyYyotKi0qKQorCWVjaG8gJy8qIGNvbmZpZ3VyZWQgZm9yIHNwYXJjOCAqLycgPj4uL21waS9hc20tc3ludGF4LmgKKwlwYXRoPSJzcGFyYzMydjggc3BhcmMzMiIKKwk7OworICAgIHN1cGVyc3BhcmMqLSotKikKKwllY2hvICcvKiBjb25maWd1cmVkIGZvciBzdXBlcnNwYXJjICovJyA+Pi4vbXBpL2FzbS1zeW50YXguaAorCXBhdGg9InN1cGVyc3BhcmMgc3BhcmMzMnY4IHNwYXJjMzIiCisJbXBpX2V4dHJhX21vZHVsZXM9InVkaXYiCisJOzsKKyAgICBzcGFyYyotKi0qKQorCWVjaG8gJy8qIGNvbmZpZ3VyZWQgZm9yIHNwYXJjICovJyA+Pi4vbXBpL2FzbS1zeW50YXguaAorCXBhdGg9InNwYXJjMzIiCisJbXBpX2V4dHJhX21vZHVsZXM9InVkaXYiCisJOzsKKyAgICBtaXBzWzM0XSotKi0qIHwgXAorICAgIG1pcHMqLSotaXJpeDYqKQorICAgICAgIGVjaG8gJy8qIGNvbmZpZ3VyZWQgZm9yIE1JUFMzICovJyA+Pi4vbXBpL2FzbS1zeW50YXguaAorICAgICAgIHBhdGg9Im1pcHMzIgorICAgICAgIDs7CisgICAgbWlwcyotKi0qKQorICAgICAgIGVjaG8gJy8qIGNvbmZpZ3VyZWQgZm9yIE1JUFMyICovJyA+Pi4vbXBpL2FzbS1zeW50YXguaAorICAgICAgIHBhdGg9Im1pcHMyIgorICAgICAgIDs7CisKKyAgICAjIE1vdG9yb2xhIDY4ayBjb25maWd1cmF0aW9ucy4gIExldCBtNjhrIG1lYW4gNjgwMjAtNjgwNDAuCisgICAgIyBtYzY4MDAwIG9yIG1jNjgwNjAgY29uZmlndXJhdGlvbnMgbmVlZCB0byBiZSBzcGVjaWZpZWQgZXhwbGljaXRseQorICAgIG02ODBbMjM0XTAqLSotbGludXhhb3V0KiB8IFwKKyAgICBtNjhrKi0qLWxpbnV4YW91dCopCisJZWNobyAnI2RlZmluZSBNSVRfU1lOVEFYJyAgICAgICAgICAgPj4uL21waS9hc20tc3ludGF4LmgKKwljYXQgICRzcmNkaXIvbXBpL202OGsvc3ludGF4LmgJICAgID4+Li9tcGkvYXNtLXN5bnRheC5oCisJcGF0aD0ibTY4ay9tYzY4MDIwIG02OGsiCisJOzsKKyAgICBtNjgwNjAqLSotbGludXhhb3V0KikKKwllY2hvICcjZGVmaW5lIE1JVF9TWU5UQVgnICAgICAgICAgICA+Pi4vbXBpL2FzbS1zeW50YXguaAorCWNhdCAgJHNyY2Rpci9tcGkvbTY4ay9zeW50YXguaAkgICAgPj4uL21waS9hc20tc3ludGF4LmgKKwlwYXRoPSJtNjhrIgorCTs7CisgICAgbTY4MFsyMzRdMCotKi1saW51eCogfCBcCisgICAgbTY4ayotKi1saW51eCopCisJZWNobyAnI2RlZmluZSBFTEZfU1lOVEFYJyAgICAgICAgICAgPj4uL21waS9hc20tc3ludGF4LmgKKwljYXQgICRzcmNkaXIvbXBpL202OGsvc3ludGF4LmgJICAgID4+Li9tcGkvYXNtLXN5bnRheC5oCisJOzsKKyAgICBtNjgwNjAqLSotbGludXgqKQorCWVjaG8gJyNkZWZpbmUgRUxGX1NZTlRBWCcgICAgICAgICAgID4+Li9tcGkvYXNtLXN5bnRheC5oCisJY2F0ICAkc3JjZGlyL21waS9tNjhrL3N5bnRheC5oCSAgICA+Pi4vbXBpL2FzbS1zeW50YXguaAorCXBhdGg9Im02OGsiCisJOzsKKyAgICBtNjhrLWF0YXJpLW1pbnQpCisJZWNobyAnI2RlZmluZSBNSVRfU1lOVEFYJyAgICAgICAgICAgPj4uL21waS9hc20tc3ludGF4LmgKKwljYXQgICRzcmNkaXIvbXBpL202OGsvc3ludGF4LmgJICAgID4+Li9tcGkvYXNtLXN5bnRheC5oCisJcGF0aD0ibTY4ay9tYzY4MDIwIG02OGsiCisJOzsKKyAgICBtNjgwMDAqLSotKiB8IFwKKyAgICBtNjgwNjAqLSotKikKKwllY2hvICcjZGVmaW5lIE1JVF9TWU5UQVgnICAgICAgICAgICA+Pi4vbXBpL2FzbS1zeW50YXguaAorCWNhdCAgJHNyY2Rpci9tcGkvbTY4ay9zeW50YXguaAkgICAgPj4uL21waS9hc20tc3ludGF4LmgKKwlwYXRoPSJtNjhrL21jNjgwMDAiCisJOzsKKyAgICBtNjgwWzIzNF0wKi0qLSogfCBcCisgICAgbTY4ayotKi0qKQorCWVjaG8gJyNkZWZpbmUgTUlUX1NZTlRBWCcgICAgICAgICAgID4+Li9tcGkvYXNtLXN5bnRheC5oCisJY2F0ICAkc3JjZGlyL21waS9tNjhrL3N5bnRheC5oCSAgICA+Pi4vbXBpL2FzbS1zeW50YXguaAorCXBhdGg9Im02OGsvbWM2ODAyMCBtNjhrIgorCTs7CisKKyAgICBwb3dlcnBjKi0qLW5ldGJzZCogfCBwb3dlcnBjKi0qLW9wZW5ic2QqKQorICAgICAgIGVjaG8gJy8qIGNvbmZpZ3VyZWQge09wZW4sTmV0fUJTRCBvbiBwb3dlcnBjICovJyA+Pi4vbXBpL2FzbS1zeW50YXguaAorICAgICAgIGVjaG8gJyNkZWZpbmUgRUxGX1NZTlRBWCcgICAgICAgICAgICAgICAgID4+Li9tcGkvYXNtLXN5bnRheC5oCisgICAgICAgY2F0ICAgJHNyY2Rpci9tcGkvcG93ZXJwYzMyL3N5bnRheC5oCSA+Pi4vbXBpL2FzbS1zeW50YXguaAorICAgICAgIG1waV9zZmxhZ3M9Ii1XYSwtbXBwYyIKKyAgICAgICBwYXRoPSJwb3dlcnBjMzIiCisgICAgICAgOzsKKworICAgIHBwYzYyMC0qLSoJICAgIHwgXAorICAgIHBvd2VycGM2NCotKi0qKQorCW1waV9zZmxhZ3M9Ii1XYSwtbXBwYyIKKwlwYXRoPSJwb3dlcnBjNjQiCisJOzsKKyAgICBwb3dlcnBjKi0qLWxpbnV4KikKKwllY2hvICcvKiBjb25maWd1cmVkIGZvciBwb3dlcnBjL0VMRiAqLycgPj4uL21waS9hc20tc3ludGF4LmgKKwllY2hvICcjZGVmaW5lIEVMRl9TWU5UQVgnICAgICAgICAgICAgICAgPj4uL21waS9hc20tc3ludGF4LmgKKwljYXQgICAkc3JjZGlyL21waS9wb3dlcnBjMzIvc3ludGF4LmgJPj4uL21waS9hc20tc3ludGF4LmgKKwlwYXRoPSJwb3dlcnBjMzIiCisJOzsKKworICAgIHJzNjAwMC0qLWFpeFs0NTY3ODldKiAgICB8IFwKKyAgICByczYwMDAtKi1haXgzLjIuWzQ1Njc4OV0pCisJbXBpX3NmbGFncz0iLVdhLC1tcHdyIgorCXBhdGg9InBvd2VyIgorCW1waV9leHRyYV9tb2R1bGVzPSJ1ZGl2LXctc2RpdiIKKwk7OworICAgIHJzNjAwMC0qLSogfCBcCisgICAgcG93ZXItKi0qICB8IFwKKyAgICBwb3dlcjItKi0qKQorCW1waV9zZmxhZ3M9Ii1XYSwtbXBwYyIKKwlwYXRoPSJwb3dlciIKKwltcGlfZXh0cmFfbW9kdWxlcz0idWRpdi13LXNkaXYiCisJOzsKKyAgICBwb3dlcnBjLWlibS1haXg0LjIuKiApCisJIyBJIGFtIG5vdCBzdXJlIGFib3V0IHRoaXMgb25lIGJ1dCBhIG1hY2hpbmUgaWRlbnRpZmllZCBieQorCSMgcG93ZXJwYy1pYm0tYWl4NC4yLjEuMCBjYW5ub3QgdXNlIHRoZSBwb3dlcnBjMzIgY29kZS4KKwltcGlfc2ZsYWdzPSItV2EsLW1wd3IiCisJcGF0aD0icG93ZXIiCisJbXBpX2V4dHJhX21vZHVsZXM9InVkaXYtdy1zZGl2IgorCTs7CisgICAgcHBjNjAxLSotKikKKwltcGlfc2ZsYWdzPSItV2EsLW1wcGMiCisJcGF0aD0icG93ZXIgcG93ZXJwYzMyIgorCTs7CisgICAgcHBjNjBbMjM0XSotKi0qKQorCW1waV9zZmxhZ3M9Ii1XYSwtbXBwYyIKKwlwYXRoPSJwb3dlcnBjMzIiCisJOzsKKyAgICBwb3dlcnBjKi0qLSopCisJbXBpX3NmbGFncz0iLVdhLC1tcHBjIgorCXBhdGg9InBvd2VycGMzMiIKKwk7OworICAgICopCisJZWNobyAnLyogTm8gYXNzZW1ibGVyIG1vZHVsZXMgY29uZmlndXJlZCAqLycgPj4uL21waS9hc20tc3ludGF4LmgKKwlwYXRoPSIiCisJOzsKK2VzYWMKK2Vsc2UKKyAgICBlY2hvICcvKiBBc3NlbWJsZXIgbW9kdWxlcyBkaXNhYmxlZCBvbiByZXF1ZXN0ICovJyA+Pi4vbXBpL2FzbS1zeW50YXguaAorICAgIHBhdGg9IiIKK2ZpCisKKworIyBNYWtlIHN5c2RlcC5oCitlY2hvICcvKiBjcmVhdGVkIGJ5IGNvbmZpZy5saW5rcyAtIGRvIG5vdCBlZGl0ICovJyA+Li9tcGkvc3lzZGVwLmgKK2lmIHRlc3QgeCRhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUgPSB4eWVzOyB0aGVuCisgICAgY2F0IDw8RU9GID4+Li9tcGkvc3lzZGVwLmgKKyNpZiBfX1NURENfXworI2RlZmluZSBDX1NZTUJPTF9OQU1FKG5hbWUpIF8jI25hbWUKKyNlbHNlCisjZGVmaW5lIENfU1lNQk9MX05BTUUobmFtZSkgXy8qKi9uYW1lCisjZW5kaWYKK0VPRgorZWxzZQorICAgIGNhdCA8PEVPRiA+Pi4vbXBpL3N5c2RlcC5oCisjZGVmaW5lIENfU1lNQk9MX05BTUUobmFtZSkgbmFtZQorRU9GCitmaQorCisKKyMgRmlndXJlIHRoZSByZXF1aXJlZCBtb2R1bGVzIG91dAorbXBpX3JlcXVpcmVkX21vZHVsZXM9JG1waV9zdGFuZGFyZF9tb2R1bGVzCitpZiB0ZXN0ICIkbXBpX2V4dHJhX21vZHVsZXMiICE9ICIiOyB0aGVuCisgIGZvciBmbiBpbiAkbXBpX2V4dHJhX21vZHVsZXM7IGRvCisgICAgICBmb3IgaSBpbiAkbXBpX29wdGlvbmFsX21vZHVsZXM7IGRvIAorICAgICAgICAgIGlmIHRlc3QgIiRmbiIgPSAiJGkiIDsgdGhlbgorICAgICAgICAgICAgIG1waV9yZXF1aXJlZF9tb2R1bGVzPSIkbXBpX3JlcXVpcmVkX21vZHVsZXMgJGZuIgorICAgICAgICAgIGZpCisgICAgICBkb25lCisgIGRvbmUKK2ZpCisKKyMgVHJ5IHRvIGdldCBmaWxlIHRvIGxpbmsgZnJvbSB0aGUgYXNzZW1ibGVyIHN1YmRpcmVjdG9yeSBhbmQKKyMgaWYgdGhpcyBmYWlscyBnZXQgaXQgZnJvbSB0aGUgZ2VuZXJpYyBzdWJkaXJlY3RvcnkuCittcGlfbG5fbGlzdD0KK21waV9tb2RfbGlzdD0KK3BhdGg9YGVjaG8gIiRtcGlfZXh0cmFfcGF0aCAkcGF0aCBnZW5lcmljIiB8IHRyICc6JyAnICdgCitlY2hvICcvKiBDcmVhdGVkIGJ5IGNvbmZpZy5saW5rcyAtIGRvIG5vdCBlZGl0ICovJyA+Li9tcGkvbW9kLXNvdXJjZS1pbmZvLmgKK2VjaG8gIi8qIEhvc3Q6ICR7aG9zdH0gKi8iID4+Li9tcGkvbW9kLXNvdXJjZS1pbmZvLmgKK2VjaG8gInN0YXRpYyBjaGFyIG1vZF9zb3VyY2VfaW5mb1tdID0iID4+Li9tcGkvbW9kLXNvdXJjZS1pbmZvLmgKK2ZvciBmbiBpbiAkbXBpX3JlcXVpcmVkX21vZHVsZXMgOyBkbworICAgIGZudT1gZWNobyAkZm4gfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgbXBpX21vZF9jXyR7Zm51fT1ubworICAgIGV2YWwgbXBpX21vZF9hc21fJHtmbnV9PW5vCisgICAgZm9yIGRpciBpbiAkcGF0aCA7IGRvCisJcm0gLWYgJHNyY2Rpci9tcGkvJGZuLltTY10KKwlpZiB0ZXN0IC1mICRzcmNkaXIvbXBpLyRkaXIvJGZuLlMgOyB0aGVuCisgICAgICAgICAgICBlY2hvICIgIFwiOiRkaXIvJGZuLlNcIiIgPj4uL21waS9tb2Qtc291cmNlLWluZm8uaAorICAgICAgICAgICAgbXBpX2xuX2xpc3Q9IiRtcGlfbG5fbGlzdCBtcGkvJGZuLWFzbS5TOm1waS8kZGlyLyRmbi5TIgorICAgICAgICAgICAgZXZhbCBtcGlfbW9kX2FzbV8ke2ZudX09eWVzCisgICAgICAgICAgICBtcGlfbW9kX2xpc3Q9IiRtcGlfbW9kX2xpc3QgJGZuIgorCSAgICBicmVhazsKKwllbGlmIHRlc3QgLWYgJHNyY2Rpci9tcGkvJGRpci8kZm4uYyA7IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIiAgXCI6JGRpci8kZm4uY1wiIiA+Pi4vbXBpL21vZC1zb3VyY2UtaW5mby5oCisgICAgICAgICAgICBtcGlfbG5fbGlzdD0iJG1waV9sbl9saXN0IG1waS8kZm4uYzptcGkvJGRpci8kZm4uYyIKKyAgICAgICAgICAgIGV2YWwgbXBpX21vZF9jXyR7Zm51fT15ZXMKKyAgICAgICAgICAgIG1waV9tb2RfbGlzdD0iJG1waV9tb2RfbGlzdCAkZm4iCisJICAgIGJyZWFrOworCWZpCisgICAgZG9uZQorZG9uZQorZWNobyAiICA7IiA+Pi4vbXBpL21vZC1zb3VyY2UtaW5mby5oCisKKyMgU2FtZSB0aGluZyBmb3IgdGhlIGZpbGUgd2hpY2ggZGVmaW5lcyB0aGUgbGltYiBzaXplCitwYXRoPWBlY2hvICIkcGF0aCBnZW5lcmljIiB8IHRyICc6JyAnICdgCitmb3IgZGlyIGluICRwYXRoIDsgZG8KKyAgICBybSAtZiAkc3JjZGlyL21waS9tcGktYXNtLWRlZnMuaAorICAgIGlmIHRlc3QgLWYgJHNyY2Rpci9tcGkvJGRpci9tcGktYXNtLWRlZnMuaCA7IHRoZW4KKyAgICAgICAgbXBpX2xuX2xpc3Q9IiRtcGlfbG5fbGlzdCBtcGkvbXBpLWFzbS1kZWZzLmg6bXBpLyRkaXIvbXBpLWFzbS1kZWZzLmgiCisgICAgICAgIGJyZWFrOworICAgIGZpCitkb25lCisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvZWMuYyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTNhNWY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9lYy5jCkBAIC0wLDAgKzEsNzA5IEBACisvKiBlYy5jIC0gIEVsbGlwdGljIEN1cnZlIGZ1bmN0aW9ucworICAgQ29weXJpZ2h0IChDKSAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgIAorICAgTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgCisgICBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAgCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCisgICBVU0EuICAqLworCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAibXBpLWludGVybmFsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKyNpbmNsdWRlICJnMTBsaWIuaCIKKworCisjZGVmaW5lIHBvaW50X2luaXQoYSkgIF9nY3J5X21waV9lY19wb2ludF9pbml0ICgoYSkpCisjZGVmaW5lIHBvaW50X2ZyZWUoYSkgIF9nY3J5X21waV9lY19wb2ludF9mcmVlICgoYSkpCisKKworLyogT2JqZWN0IHRvIHJlcHJlc2VudCBhIHBvaW50IGluIHByb2plY3RpdmUgY29vcmRpbmF0ZXMuICovCisvKiBDdXJyZW50bHkgZGVmaW5lZCBpbiBtcGkuaCAqLworCisvKiBUaGlzIGNvbnRleHQgaXMgdXNlZCB3aXRoIGFsbCBvdXIgRUMgZnVuY3Rpb25zLiAqLworc3RydWN0IG1waV9lY19jdHhfcworeworICAvKiBEb21haW4gcGFyYW1ldGVycy4gICovCisgIGdjcnlfbXBpX3QgcDsgICAvKiBQcmltZSBzcGVjaWZ5aW5nIHRoZSBmaWVsZCBHRihwKS4gICovCisgIGdjcnlfbXBpX3QgYTsgICAvKiBGaXJzdCBjb2VmZmljaWVudCBvZiB0aGUgV2VpZXJzdHJhc3MgZXF1YXRpb24uICAqLworCisgIGludCBhX2lzX3BtaW51czM7ICAvKiBUcnVlIGlmIEEgPSBQIC0gMy4gKi8KKworICAvKiBTb21lIG9mdGVuIHVzZWQgY29uc3RhbnRzLiAgKi8KKyAgZ2NyeV9tcGlfdCBvbmU7CisgIGdjcnlfbXBpX3QgdHdvOworICBnY3J5X21waV90IHRocmVlOworICBnY3J5X21waV90IGZvdXI7CisgIGdjcnlfbXBpX3QgZWlnaHQ7CisgIGdjcnlfbXBpX3QgdHdvX2ludl9wOworCisgIC8qIFNjcmF0Y2ggdmFyaWFibGVzLiAgKi8KKyAgZ2NyeV9tcGlfdCBzY3JhdGNoWzExXTsKKyAgCisgIC8qIEhlbHBlciBmb3IgZmFzdCByZWR1Y3Rpb24uICAqLworLyogICBpbnQgbmlzdF9uYml0czsgL1wqIElmIHRoaXMgaXMgYSBOSVNUIGN1cnZlLCB0aGUgbnVtYmVyIG9mIGJpdHMuICAqXC8gKi8KKy8qICAgZ2NyeV9tcGlfdCBzWzEwXTsgKi8KKy8qICAgZ2NyeV9tcGlfdCBjOyAqLworCit9OworCisKKworLyogSW5pdGlhbGl6ZWQgYSBwb2ludCBvYmplY3QuICBnY3J5X21waV9lY19wb2ludF9mcmVlIHNoYWxsIGJlIHVzZWQKKyAgIHRvIHJlbGVhc2UgdGhpcyBvYmplY3QuICAqLwordm9pZAorX2djcnlfbXBpX2VjX3BvaW50X2luaXQgKG1waV9wb2ludF90ICpwKQoreworICBwLT54ID0gbXBpX25ldyAoMCk7CisgIHAtPnkgPSBtcGlfbmV3ICgwKTsKKyAgcC0+eiA9IG1waV9uZXcgKDApOworfQorCisKKy8qIFJlbGVhc2UgYSBwb2ludCBvYmplY3QuICovCit2b2lkCitfZ2NyeV9tcGlfZWNfcG9pbnRfZnJlZSAobXBpX3BvaW50X3QgKnApCit7CisgIG1waV9mcmVlIChwLT54KTsgcC0+eCA9IE5VTEw7CisgIG1waV9mcmVlIChwLT55KTsgcC0+eSA9IE5VTEw7CisgIG1waV9mcmVlIChwLT56KTsgcC0+eiA9IE5VTEw7Cit9CisKKy8qIFNldCB0aGUgdmFsdWUgZnJvbSBTIGludG8gRC4gICovCitzdGF0aWMgdm9pZAorcG9pbnRfc2V0IChtcGlfcG9pbnRfdCAqZCwgbXBpX3BvaW50X3QgKnMpCit7CisgIG1waV9zZXQgKGQtPngsIHMtPngpOworICBtcGlfc2V0IChkLT55LCBzLT55KTsKKyAgbXBpX3NldCAoZC0+eiwgcy0+eik7Cit9CisKKworCitzdGF0aWMgdm9pZAorZWNfYWRkbSAoZ2NyeV9tcGlfdCB3LCBnY3J5X21waV90IHUsIGdjcnlfbXBpX3QgdiwgbXBpX2VjX3QgY3R4KQoreworICBtcGlfYWRkbSAodywgdSwgdiwgY3R4LT5wKTsKK30KKworc3RhdGljIHZvaWQKK2VjX3N1Ym0gKGdjcnlfbXBpX3QgdywgZ2NyeV9tcGlfdCB1LCBnY3J5X21waV90IHYsIG1waV9lY190IGN0eCkKK3sKKyAgbXBpX3N1Ym0gKHcsIHUsIHYsIGN0eC0+cCk7Cit9CisKK3N0YXRpYyB2b2lkCitlY19tdWxtIChnY3J5X21waV90IHcsIGdjcnlfbXBpX3QgdSwgZ2NyeV9tcGlfdCB2LCBtcGlfZWNfdCBjdHgpCit7CisjaWYgMAorICAvKiBOT1RFOiBUaGlzIGNvZGUgd29ya3Mgb25seSBmb3IgbGltYiBzaXplcyBvZiAzMiBiaXQuICAqLworICBtcGlfbGltYl90ICp3cCwgKnNwOworCisgIGlmIChjdHgtPm5pc3RfbmJpdHMgPT0gMTkyKQorICAgIHsKKyAgICAgIG1waV9tdWwgKHcsIHUsIHYpOworICAgICAgbXBpX3Jlc2l6ZSAodywgMTIpOworICAgICAgd3AgPSB3LT5kOworCisgICAgICBzcCA9IGN0eC0+c1swXS0+ZDsKKyAgICAgIHNwWzAqMiswXSA9IHdwWzAqMiswXTsKKyAgICAgIHNwWzAqMisxXSA9IHdwWzAqMisxXTsKKyAgICAgIHNwWzEqMiswXSA9IHdwWzEqMiswXTsKKyAgICAgIHNwWzEqMisxXSA9IHdwWzEqMisxXTsKKyAgICAgIHNwWzIqMiswXSA9IHdwWzIqMiswXTsKKyAgICAgIHNwWzIqMisxXSA9IHdwWzIqMisxXTsKKworICAgICAgc3AgPSBjdHgtPnNbMV0tPmQ7CisgICAgICBzcFswKjIrMF0gPSB3cFszKjIrMF07CisgICAgICBzcFswKjIrMV0gPSB3cFszKjIrMV07CisgICAgICBzcFsxKjIrMF0gPSB3cFszKjIrMF07CisgICAgICBzcFsxKjIrMV0gPSB3cFszKjIrMV07CisgICAgICBzcFsyKjIrMF0gPSAwOworICAgICAgc3BbMioyKzFdID0gMDsKKworICAgICAgc3AgPSBjdHgtPnNbMl0tPmQ7CisgICAgICBzcFswKjIrMF0gPSAwOworICAgICAgc3BbMCoyKzFdID0gMDsKKyAgICAgIHNwWzEqMiswXSA9IHdwWzQqMiswXTsKKyAgICAgIHNwWzEqMisxXSA9IHdwWzQqMisxXTsKKyAgICAgIHNwWzIqMiswXSA9IHdwWzQqMiswXTsKKyAgICAgIHNwWzIqMisxXSA9IHdwWzQqMisxXTsKKworICAgICAgc3AgPSBjdHgtPnNbM10tPmQ7CisgICAgICBzcFswKjIrMF0gPSB3cFs1KjIrMF07CisgICAgICBzcFswKjIrMV0gPSB3cFs1KjIrMV07CisgICAgICBzcFsxKjIrMF0gPSB3cFs1KjIrMF07CisgICAgICBzcFsxKjIrMV0gPSB3cFs1KjIrMV07CisgICAgICBzcFsyKjIrMF0gPSB3cFs1KjIrMF07CisgICAgICBzcFsyKjIrMV0gPSB3cFs1KjIrMV07CisKKyAgICAgIGN0eC0+c1swXS0+bmxpbWJzID0gNjsKKyAgICAgIGN0eC0+c1sxXS0+bmxpbWJzID0gNjsKKyAgICAgIGN0eC0+c1syXS0+bmxpbWJzID0gNjsKKyAgICAgIGN0eC0+c1szXS0+bmxpbWJzID0gNjsKKworICAgICAgbXBpX2FkZCAoY3R4LT5jLCBjdHgtPnNbMF0sIGN0eC0+c1sxXSk7CisgICAgICBtcGlfYWRkIChjdHgtPmMsIGN0eC0+YywgY3R4LT5zWzJdKTsKKyAgICAgIG1waV9hZGQgKGN0eC0+YywgY3R4LT5jLCBjdHgtPnNbM10pOworCisgICAgICB3aGlsZSAoIG1waV9jbXAgKGN0eC0+YywgY3R4LT5wICkgPj0gMCApCisgICAgICAgIG1waV9zdWIgKCBjdHgtPmMsIGN0eC0+YywgY3R4LT5wICk7CisgICAgICBtcGlfc2V0ICh3LCBjdHgtPmMpOworICAgIH0KKyAgZWxzZSBpZiAoY3R4LT5uaXN0X25iaXRzID09IDM4NCkKKyAgICB7CisgICAgICBpbnQgaTsKKyAgICAgIG1waV9tdWwgKHcsIHUsIHYpOworICAgICAgbXBpX3Jlc2l6ZSAodywgMjQpOworICAgICAgd3AgPSB3LT5kOworCisjZGVmaW5lIE5FWFQoYSkgZG8geyBjdHgtPnNbKGEpXS0+bmxpbWJzID0gMTI7IFwKKyAgICAgICAgICAgICAgICAgICAgIHNwID0gY3R4LT5zWyhhKV0tPmQ7IFwKKyAgICAgICAgICAgICAgICAgICAgIGkgPSAwOyB9IHdoaWxlICgwKQorI2RlZmluZSBYKGEpIGRvIHsgc3BbaSsrXSA9IHdwWyhhKV07fSB3aGlsZSAoMCkKKyNkZWZpbmUgWDAoYSkgZG8geyBzcFtpKytdID0gMDsgfSB3aGlsZSAoMCkKKyAgICAgIE5FWFQoMCk7IAorICAgICAgWCgwKTtYKDEpO1goMik7WCgzKTtYKDQpO1goNSk7WCg2KTtYKDcpO1goOCk7WCg5KTtYKDEwKTtYKDExKTsKKyAgICAgIE5FWFQoMSk7CisgICAgICBYMCgpO1gwKCk7WDAoKTtYMCgpO1goMjEpO1goMjIpO1goMjMpO1gwKCk7WDAoKTtYMCgpO1gwKCk7WDAoKTsKKyAgICAgIE5FWFQoMik7CisgICAgICBYKDEyKTtYKDEzKTtYKDE0KTtYKDE1KTtYKDE2KTtYKDE3KTtYKDE4KTtYKDE5KTtYKDIwKTtYKDIxKTtYKDIyKTtYKDIzKTsKKyAgICAgIE5FWFQoMyk7CisgICAgICBYKDIxKTtYKDIyKTtYKDIzKTtYKDEyKTtYKDEzKTtYKDE0KTtYKDE1KTtYKDE2KTtYKDE3KTtYKDE4KTtYKDE5KTtYKDIwKTsKKyAgICAgIE5FWFQoNCk7CisgICAgICBYMCgpO1goMjMpO1gwKCk7WCgyMCk7WCgxMik7WCgxMyk7WCgxNCk7WCgxNSk7WCgxNik7WCgxNyk7WCgxOCk7WCgxOSk7CisgICAgICBORVhUKDUpOworICAgICAgWDAoKTtYMCgpO1gwKCk7WDAoKTtYKDIwKTtYKDIxKTtYKDIyKTtYKDIzKTtYMCgpO1gwKCk7WDAoKTtYMCgpOworICAgICAgTkVYVCg2KTsKKyAgICAgIFgoMjApO1gwKCk7WDAoKTtYKDIxKTtYKDIyKTtYKDIzKTtYMCgpO1gwKCk7WDAoKTtYMCgpO1gwKCk7WDAoKTsKKyAgICAgIE5FWFQoNyk7CisgICAgICBYKDIzKTtYKDEyKTtYKDEzKTtYKDE0KTtYKDE1KTtYKDE2KTtYKDE3KTtYKDE4KTtYKDE5KTtYKDIwKTtYKDIxKTtYKDIyKTsKKyAgICAgIE5FWFQoOCk7CisgICAgICBYMCgpO1goMjApO1goMjEpO1goMjIpO1goMjMpO1gwKCk7WDAoKTtYMCgpO1gwKCk7WDAoKTtYMCgpO1gwKCk7CisgICAgICBORVhUKDkpOworICAgICAgWDAoKTtYMCgpO1gwKCk7WCgyMyk7WCgyMyk7WDAoKTtYMCgpO1gwKCk7WDAoKTtYMCgpO1gwKCk7WDAoKTsKKyN1bmRlZiBYMAorI3VuZGVmIFgKKyN1bmRlZiBORVhUCisgICAgICBtcGlfYWRkIChjdHgtPmMsIGN0eC0+c1swXSwgY3R4LT5zWzFdKTsKKyAgICAgIG1waV9hZGQgKGN0eC0+YywgY3R4LT5jLCBjdHgtPnNbMV0pOworICAgICAgbXBpX2FkZCAoY3R4LT5jLCBjdHgtPmMsIGN0eC0+c1syXSk7CisgICAgICBtcGlfYWRkIChjdHgtPmMsIGN0eC0+YywgY3R4LT5zWzNdKTsKKyAgICAgIG1waV9hZGQgKGN0eC0+YywgY3R4LT5jLCBjdHgtPnNbNF0pOworICAgICAgbXBpX2FkZCAoY3R4LT5jLCBjdHgtPmMsIGN0eC0+c1s1XSk7CisgICAgICBtcGlfYWRkIChjdHgtPmMsIGN0eC0+YywgY3R4LT5zWzZdKTsKKyAgICAgIG1waV9zdWIgKGN0eC0+YywgY3R4LT5jLCBjdHgtPnNbN10pOworICAgICAgbXBpX3N1YiAoY3R4LT5jLCBjdHgtPmMsIGN0eC0+c1s4XSk7CisgICAgICBtcGlfc3ViIChjdHgtPmMsIGN0eC0+YywgY3R4LT5zWzldKTsKKworICAgICAgd2hpbGUgKCBtcGlfY21wIChjdHgtPmMsIGN0eC0+cCApID49IDAgKQorICAgICAgICBtcGlfc3ViICggY3R4LT5jLCBjdHgtPmMsIGN0eC0+cCApOworICAgICAgd2hpbGUgKCBjdHgtPmMtPnNpZ24gKQorICAgICAgICBtcGlfYWRkICggY3R4LT5jLCBjdHgtPmMsIGN0eC0+cCApOworICAgICAgbXBpX3NldCAodywgY3R4LT5jKTsKKyAgICB9CisgIGVsc2UKKyNlbmRpZiAvKjAqLworICAgIG1waV9tdWxtICh3LCB1LCB2LCBjdHgtPnApOworfQorCitzdGF0aWMgdm9pZAorZWNfcG93bSAoZ2NyeV9tcGlfdCB3LCBjb25zdCBnY3J5X21waV90IGIsIGNvbnN0IGdjcnlfbXBpX3QgZSwKKyAgICAgICAgIG1waV9lY190IGN0eCkKK3sKKyAgbXBpX3Bvd20gKHcsIGIsIGUsIGN0eC0+cCk7Cit9CisKK3N0YXRpYyB2b2lkCitlY19pbnZtIChnY3J5X21waV90IHgsIGdjcnlfbXBpX3QgYSwgbXBpX2VjX3QgY3R4KQoreworICBtcGlfaW52bSAoeCwgYSwgY3R4LT5wKTsKK30KKworCisKKy8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIG5ldyBjb250ZXh0IGZvciBlbGxpcHRpYyBjdXJ2ZSBiYXNlZCBvbiB0aGUKKyAgIGZpZWxkIEdGKHApLiAgUCBpcyB0aGUgcHJpbWUgc3BlY2lmeWluZyB0aHVpcyBmaWVsZCwgQSBpcyB0aGUgZmlyc3QKKyAgIGNvZWZmaWNpZW50LiAKKworICAgVGhpcyBjb250ZXh0IG5lZWRzIHRvIGJlIHJlbGVhc2VkIHVzaW5nIF9nY3J5X21waV9lY19mcmVlLiAgKi8KK21waV9lY190IAorX2djcnlfbXBpX2VjX2luaXQgKGdjcnlfbXBpX3QgcCwgZ2NyeV9tcGlfdCBhKQoreworICBpbnQgaTsKKyAgbXBpX2VjX3QgY3R4OworICBnY3J5X21waV90IHRtcDsKKworICBtcGlfbm9ybWFsaXplIChwKTsKKyAgbXBpX25vcm1hbGl6ZSAoYSk7CisKKyAgLyogRml4bWU6IERvIHdlIHdhbnQgdG8gY2hlY2sgc29tZSBjb25zdHJhaW50cz8gZS5nLgorICAgICBhIDwgcAorICAqLworCisgIGN0eCA9IGdjcnlfeGNhbGxvYyAoMSwgc2l6ZW9mICpjdHgpOworCisgIGN0eC0+cCA9IG1waV9jb3B5IChwKTsKKyAgY3R4LT5hID0gbXBpX2NvcHkgKGEpOworCisgIHRtcCA9IG1waV9hbGxvY19saWtlIChjdHgtPnApOworICBtcGlfc3ViX3VpICh0bXAsIGN0eC0+cCwgMyk7CisgIGN0eC0+YV9pc19wbWludXMzID0gIW1waV9jbXAgKGN0eC0+YSwgdG1wKTsKKyAgbXBpX2ZyZWUgKHRtcCk7CisKKworICAvKiBBbGxvY2F0ZSBjb25zdGFudHMuICAqLworICBjdHgtPm9uZSAgID0gbXBpX2FsbG9jX3NldF91aSAoMSk7CisgIGN0eC0+dHdvICAgPSBtcGlfYWxsb2Nfc2V0X3VpICgyKTsKKyAgY3R4LT50aHJlZSA9IG1waV9hbGxvY19zZXRfdWkgKDMpOworICBjdHgtPmZvdXIgID0gbXBpX2FsbG9jX3NldF91aSAoNCk7CisgIGN0eC0+ZWlnaHQgPSBtcGlfYWxsb2Nfc2V0X3VpICg4KTsKKyAgY3R4LT50d29faW52X3AgPSBtcGlfYWxsb2MgKDApOworICBlY19pbnZtIChjdHgtPnR3b19pbnZfcCwgY3R4LT50d28sIGN0eCk7CisKKyAgLyogQWxsb2NhdGUgc2NyYXRjaCB2YXJpYWJsZXMuICAqLworICBmb3IgKGk9MDsgaTwgRElNKGN0eC0+c2NyYXRjaCk7IGkrKykKKyAgICBjdHgtPnNjcmF0Y2hbaV0gPSBtcGlfYWxsb2NfbGlrZSAoY3R4LT5wKTsKKworICAvKiBQcmVwYXJlIGZvciBmYXN0IHJlZHVjdGlvbi4gICovCisgIC8qIEZJWE1FOiBuZWVkIGEgdGVzdCBmb3IgTklTVCB2YWx1ZXMuICBIb3dldmVyIGl0IGRvZXMgbm90IGdhaW4gdXMKKyAgICAgYW55IHJlYWwgYWR2YW50YWdlLCBmb3IgMzg0IGJpdHMgaXQgaXMgYWN0dWFsbHkgc2xvd2VyIHRoYW4gdXNpbmcKKyAgICAgbXBpX211bG0uICAqLworLyogICBjdHgtPm5pc3RfbmJpdHMgPSBtcGlfZ2V0X25iaXRzIChjdHgtPnApOyAqLworLyogICBpZiAoY3R4LT5uaXN0X25iaXRzID09IDE5MikgKi8KKy8qICAgICB7ICovCisvKiAgICAgICBmb3IgKGk9MDsgaSA8IDQ7IGkrKykgKi8KKy8qICAgICAgICAgY3R4LT5zW2ldID0gbXBpX25ldyAoMTkyKTsgKi8KKy8qICAgICAgIGN0eC0+YyAgICA9IG1waV9uZXcgKDE5MioyKTsgKi8KKy8qICAgICB9ICovCisvKiAgIGVsc2UgaWYgKGN0eC0+bmlzdF9uYml0cyA9PSAzODQpICovCisvKiAgICAgeyAqLworLyogICAgICAgZm9yIChpPTA7IGkgPCAxMDsgaSsrKSAqLworLyogICAgICAgICBjdHgtPnNbaV0gPSBtcGlfbmV3ICgzODQpOyAqLworLyogICAgICAgY3R4LT5jICAgID0gbXBpX25ldyAoMzg0KjIpOyAqLworLyogICAgIH0gKi8KKworICByZXR1cm4gY3R4OworfQorCit2b2lkCitfZ2NyeV9tcGlfZWNfZnJlZSAobXBpX2VjX3QgY3R4KQoreworICBpbnQgaTsKKworICBpZiAoIWN0eCkKKyAgICByZXR1cm47CisKKyAgbXBpX2ZyZWUgKGN0eC0+cCk7CisgIG1waV9mcmVlIChjdHgtPmEpOworCisgIG1waV9mcmVlIChjdHgtPm9uZSk7CisgIG1waV9mcmVlIChjdHgtPnR3byk7CisgIG1waV9mcmVlIChjdHgtPnRocmVlKTsKKyAgbXBpX2ZyZWUgKGN0eC0+Zm91cik7CisgIG1waV9mcmVlIChjdHgtPmVpZ2h0KTsKKworICBtcGlfZnJlZSAoY3R4LT50d29faW52X3ApOworCisgIGZvciAoaT0wOyBpPCBESU0oY3R4LT5zY3JhdGNoKTsgaSsrKQorICAgIG1waV9mcmVlIChjdHgtPnNjcmF0Y2hbaV0pOworCisvKiAgIGlmIChjdHgtPm5pc3RfbmJpdHMgPT0gMTkyKSAqLworLyogICAgIHsgKi8KKy8qICAgICAgIGZvciAoaT0wOyBpIDwgNDsgaSsrKSAqLworLyogICAgICAgICBtcGlfZnJlZSAoY3R4LT5zW2ldKTsgKi8KKy8qICAgICAgIG1waV9mcmVlIChjdHgtPmMpOyAqLworLyogICAgIH0gKi8KKy8qICAgZWxzZSBpZiAoY3R4LT5uaXN0X25iaXRzID09IDM4NCkgKi8KKy8qICAgICB7ICovCisvKiAgICAgICBmb3IgKGk9MDsgaSA8IDEwOyBpKyspICovCisvKiAgICAgICAgIG1waV9mcmVlIChjdHgtPnNbaV0pOyAqLworLyogICAgICAgbXBpX2ZyZWUgKGN0eC0+Yyk7ICovCisvKiAgICAgfSAqLworCisgIGdjcnlfZnJlZSAoY3R4KTsKK30KKworLyogQ29tcHV0ZSB0aGUgYWZmaW5lIGNvb3JkaW5hdGVzIGZyb20gdGhlIHByb2plY3RpdmUgY29vcmRpbmF0ZXMgaW4KKyAgIFBPSU5ULiAgU2V0IHRoZW0gaW50byBYIGFuZCBZLiAgSWYgb25lIGNvb3JkaW5hdGUgaXMgbm90IHJlcXVpcmVkLAorICAgWCBvciBZIG1heSBiZSBwYXNzZWQgYXMgTlVMTC4gIENUWCBpcyB0aGUgdXN1YWwgY29udGV4dC4gUmV0dXJuczogMAorICAgb24gc3VjY2VzcyBvciAhMCBpZiBQT0lOVCBpcyBhdCBpbmZpbml0eS4gICovCitpbnQKK19nY3J5X21waV9lY19nZXRfYWZmaW5lIChnY3J5X21waV90IHgsIGdjcnlfbXBpX3QgeSwgbXBpX3BvaW50X3QgKnBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIG1waV9lY190IGN0eCkKK3sKKyAgZ2NyeV9tcGlfdCB6MSwgejIsIHozOworCisgIGlmICghbXBpX2NtcF91aSAocG9pbnQtPnosIDApKQorICAgIHJldHVybiAtMTsKKworICB6MSA9IG1waV9uZXcgKDApOworICB6MiA9IG1waV9uZXcgKDApOworICBlY19pbnZtICh6MSwgcG9pbnQtPnosIGN0eCk7ICAvKiB6MSA9IHpeKC0xKSBtb2QgcCAgKi8KKyAgZWNfbXVsbSAoejIsIHoxLCB6MSwgY3R4KTsgICAgLyogejIgPSB6XigtMikgbW9kIHAgICovCisKKyAgaWYgKHgpCisgICAgZWNfbXVsbSAoeCwgcG9pbnQtPngsIHoyLCBjdHgpOworCisgIGlmICh5KQorICAgIHsKKyAgICAgIHozID0gbXBpX25ldyAoMCk7CisgICAgICBlY19tdWxtICh6MywgejIsIHoxLCBjdHgpOyAgICAgIC8qIHozID0gel4oLTMpIG1vZCBwICAqLworICAgICAgZWNfbXVsbSAoeSwgcG9pbnQtPnksIHozLCBjdHgpOworICAgICAgbXBpX2ZyZWUgKHozKTsKKyAgICB9CisKKyAgbXBpX2ZyZWUgKHoyKTsKKyAgbXBpX2ZyZWUgKHoxKTsKKyAgcmV0dXJuIDA7Cit9CisKKworCisKKwwKKy8qICBSRVNVTFQgPSAyICogUE9JTlQgICovCit2b2lkCitfZ2NyeV9tcGlfZWNfZHVwX3BvaW50IChtcGlfcG9pbnRfdCAqcmVzdWx0LCBtcGlfcG9pbnRfdCAqcG9pbnQsIG1waV9lY190IGN0eCkKK3sKKyNkZWZpbmUgeDMgKHJlc3VsdC0+eCkKKyNkZWZpbmUgeTMgKHJlc3VsdC0+eSkKKyNkZWZpbmUgejMgKHJlc3VsdC0+eikKKyNkZWZpbmUgdDEgKGN0eC0+c2NyYXRjaFswXSkKKyNkZWZpbmUgdDIgKGN0eC0+c2NyYXRjaFsxXSkKKyNkZWZpbmUgdDMgKGN0eC0+c2NyYXRjaFsyXSkKKyNkZWZpbmUgbDEgKGN0eC0+c2NyYXRjaFszXSkKKyNkZWZpbmUgbDIgKGN0eC0+c2NyYXRjaFs0XSkKKyNkZWZpbmUgbDMgKGN0eC0+c2NyYXRjaFs1XSkKKworICBpZiAoIW1waV9jbXBfdWkgKHBvaW50LT55LCAwKSB8fCAhbXBpX2NtcF91aSAocG9pbnQtPnosIDApKQorICAgIHsgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAvKiBQX3kgPT0gMCB8fCBQX3ogPT0gMCA9PiBbMToxOjBdICovCisgICAgICBtcGlfc2V0X3VpICh4MywgMSk7CisgICAgICBtcGlfc2V0X3VpICh5MywgMSk7CisgICAgICBtcGlfc2V0X3VpICh6MywgMCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKGN0eC0+YV9pc19wbWludXMzKSAgLyogVXNlIHRoZSBmYXN0ZXIgY2FzZS4gICovCisgICAgICAgIHsgICAgICAgICAgICAgICAKKyAgICAgICAgICAvKiBMMSA9IDMoWCAtIFpeMikoWCArIFpeMikgKi8KKyAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgVDE6IHVzZWQgZm9yIFpeMi4gKi8KKyAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgVDI6IHVzZWQgZm9yIHRoZSByaWdodCB0ZXJtLiAgKi8KKyAgICAgICAgICBlY19wb3dtICh0MSwgcG9pbnQtPnosIGN0eC0+dHdvLCBjdHgpOyAgIAorICAgICAgICAgIGVjX3N1Ym0gKGwxLCBwb2ludC0+eCwgdDEsIGN0eCk7ICAgCisgICAgICAgICAgZWNfbXVsbSAobDEsIGwxLCBjdHgtPnRocmVlLCBjdHgpOworICAgICAgICAgIGVjX2FkZG0gKHQyLCBwb2ludC0+eCwgdDEsIGN0eCk7ICAgCisgICAgICAgICAgZWNfbXVsbSAobDEsIGwxLCB0MiwgY3R4KTsgICAKKyAgICAgICAgfQorICAgICAgZWxzZSAvKiBTdGFuZGFyZCBjYXNlLiAqLworICAgICAgICB7CisgICAgICAgICAgLyogTDEgPSAzWF4yICsgYVpeNCAqLworICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICBUMTogdXNlZCBmb3IgYVpeNC4gKi8KKyAgICAgICAgICBlY19wb3dtIChsMSwgcG9pbnQtPngsIGN0eC0+dHdvLCBjdHgpOyAKKyAgICAgICAgICBlY19tdWxtIChsMSwgbDEsIGN0eC0+dGhyZWUsIGN0eCk7ICAKKyAgICAgICAgICBlY19wb3dtICh0MSwgcG9pbnQtPnosIGN0eC0+Zm91ciwgY3R4KTsgCisgICAgICAgICAgZWNfbXVsbSAodDEsIHQxLCBjdHgtPmEsIGN0eCk7ICAgIAorICAgICAgICAgIGVjX2FkZG0gKGwxLCBsMSwgdDEsIGN0eCk7IAorICAgICAgICB9CisgICAgICAvKiBaMyA9IDJZWiAqLworICAgICAgZWNfbXVsbSAoejMsIHBvaW50LT55LCBwb2ludC0+eiwgY3R4KTsKKyAgICAgIGVjX211bG0gKHozLCB6MywgY3R4LT50d28sIGN0eCk7ICAgICAgIAorCisgICAgICAvKiBMMiA9IDRYWV4yICovCisgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQyOiB1c2VkIGZvciBZMjsgcmVxdWlyZWQgbGF0ZXIuICovCisgICAgICBlY19wb3dtICh0MiwgcG9pbnQtPnksIGN0eC0+dHdvLCBjdHgpOworICAgICAgZWNfbXVsbSAobDIsIHQyLCBwb2ludC0+eCwgY3R4KTsKKyAgICAgIGVjX211bG0gKGwyLCBsMiwgY3R4LT5mb3VyLCBjdHgpOworCisgICAgICAvKiBYMyA9IEwxXjIgLSAyTDIgKi8KKyAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDE6IHVzZWQgZm9yIEwyXjIuICovCisgICAgICBlY19wb3dtICh4MywgbDEsIGN0eC0+dHdvLCBjdHgpOworICAgICAgZWNfbXVsbSAodDEsIGwyLCBjdHgtPnR3bywgY3R4KTsKKyAgICAgIGVjX3N1Ym0gKHgzLCB4MywgdDEsIGN0eCk7CisgICAgICAKKyAgICAgIC8qIEwzID0gOFleNCAqLworICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMjogdGFrZW4gZnJvbSBhYm92ZS4gKi8KKyAgICAgIGVjX3Bvd20gKHQyLCB0MiwgY3R4LT50d28sIGN0eCk7IAorICAgICAgZWNfbXVsbSAobDMsIHQyLCBjdHgtPmVpZ2h0LCBjdHgpOworCisgICAgICAvKiBZMyA9IEwxKEwyIC0gWDMpIC0gTDMgKi8KKyAgICAgIGVjX3N1Ym0gKHkzLCBsMiwgeDMsIGN0eCk7CisgICAgICBlY19tdWxtICh5MywgeTMsIGwxLCBjdHgpOworICAgICAgZWNfc3VibSAoeTMsIHkzLCBsMywgY3R4KTsKKyAgICB9CisKKyN1bmRlZiB4MworI3VuZGVmIHkzCisjdW5kZWYgejMKKyN1bmRlZiB0MQorI3VuZGVmIHQyCisjdW5kZWYgdDMKKyN1bmRlZiBsMQorI3VuZGVmIGwyCisjdW5kZWYgbDMKK30KKworCisKKy8qIFJFU1VMVCA9IFAxICsgUDIgKi8KK3ZvaWQKK19nY3J5X21waV9lY19hZGRfcG9pbnRzIChtcGlfcG9pbnRfdCAqcmVzdWx0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBtcGlfcG9pbnRfdCAqcDEsIG1waV9wb2ludF90ICpwMiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgbXBpX2VjX3QgY3R4KQoreworI2RlZmluZSB4MSAocDEtPnggICAgKQorI2RlZmluZSB5MSAocDEtPnkgICAgKQorI2RlZmluZSB6MSAocDEtPnogICAgKQorI2RlZmluZSB4MiAocDItPnggICAgKQorI2RlZmluZSB5MiAocDItPnkgICAgKQorI2RlZmluZSB6MiAocDItPnogICAgKQorI2RlZmluZSB4MyAocmVzdWx0LT54KQorI2RlZmluZSB5MyAocmVzdWx0LT55KQorI2RlZmluZSB6MyAocmVzdWx0LT56KQorI2RlZmluZSBsMSAoY3R4LT5zY3JhdGNoWzBdKQorI2RlZmluZSBsMiAoY3R4LT5zY3JhdGNoWzFdKQorI2RlZmluZSBsMyAoY3R4LT5zY3JhdGNoWzJdKQorI2RlZmluZSBsNCAoY3R4LT5zY3JhdGNoWzNdKQorI2RlZmluZSBsNSAoY3R4LT5zY3JhdGNoWzRdKQorI2RlZmluZSBsNiAoY3R4LT5zY3JhdGNoWzVdKQorI2RlZmluZSBsNyAoY3R4LT5zY3JhdGNoWzZdKQorI2RlZmluZSBsOCAoY3R4LT5zY3JhdGNoWzddKQorI2RlZmluZSBsOSAoY3R4LT5zY3JhdGNoWzhdKQorI2RlZmluZSB0MSAoY3R4LT5zY3JhdGNoWzldKQorI2RlZmluZSB0MiAoY3R4LT5zY3JhdGNoWzEwXSkKKworICBpZiAoICghbXBpX2NtcCAoeDEsIHgyKSkgJiYgKCFtcGlfY21wICh5MSwgeTIpKSAmJiAoIW1waV9jbXAgKHoxLCB6MikpICkKKyAgICB7CisgICAgICAvKiBTYW1lIHBvaW50OyBuZWVkIHRvIGNhbGwgdGhlIGR1cGxpY2F0ZSBmdW5jdGlvbi4gICovCisgICAgICBfZ2NyeV9tcGlfZWNfZHVwX3BvaW50IChyZXN1bHQsIHAxLCBjdHgpOworICAgIH0KKyAgZWxzZSBpZiAoIW1waV9jbXBfdWkgKHoxLCAwKSkKKyAgICB7CisgICAgICAvKiBQMSBpcyBhdCBpbmZpbml0eS4gICovCisgICAgICBtcGlfc2V0ICh4MywgcDItPngpOworICAgICAgbXBpX3NldCAoeTMsIHAyLT55KTsKKyAgICAgIG1waV9zZXQgKHozLCBwMi0+eik7CisgICAgfQorICBlbHNlIGlmICghbXBpX2NtcF91aSAoejIsIDApKQorICAgIHsKKyAgICAgIC8qIFAyIGlzIGF0IGluZmluaXR5LiAgKi8KKyAgICAgIG1waV9zZXQgKHgzLCBwMS0+eCk7CisgICAgICBtcGlfc2V0ICh5MywgcDEtPnkpOworICAgICAgbXBpX3NldCAoejMsIHAxLT56KTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpbnQgejFfaXNfb25lID0gIW1waV9jbXBfdWkgKHoxLCAxKTsKKyAgICAgIGludCB6Ml9pc19vbmUgPSAhbXBpX2NtcF91aSAoejIsIDEpOworCisgICAgICAvKiBsMSA9IHgxIHoyXjIgICovCisgICAgICAvKiBsMiA9IHgyIHoxXjIgICovCisgICAgICBpZiAoejJfaXNfb25lKQorICAgICAgICBtcGlfc2V0IChsMSwgeDEpOworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgZWNfcG93bSAobDEsIHoyLCBjdHgtPnR3bywgY3R4KTsgCisgICAgICAgICAgZWNfbXVsbSAobDEsIGwxLCB4MSwgY3R4KTsKKyAgICAgICAgfQorICAgICAgaWYgKHoxX2lzX29uZSkKKyAgICAgICAgbXBpX3NldCAobDIsIHgxKTsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGVjX3Bvd20gKGwyLCB6MSwgY3R4LT50d28sIGN0eCk7IAorICAgICAgICAgIGVjX211bG0gKGwyLCBsMiwgeDIsIGN0eCk7CisgICAgICAgIH0KKyAgICAgIC8qIGwzID0gbDEgLSBsMiAqLworICAgICAgZWNfc3VibSAobDMsIGwxLCBsMiwgY3R4KTsKKyAgICAgIC8qIGw0ID0geTEgejJeMyAgKi8KKyAgICAgIGVjX3Bvd20gKGw0LCB6MiwgY3R4LT50aHJlZSwgY3R4KTsKKyAgICAgIGVjX211bG0gKGw0LCBsNCwgeTEsIGN0eCk7CisgICAgICAvKiBsNSA9IHkyIHoxXjMgICovCisgICAgICBlY19wb3dtIChsNSwgejEsIGN0eC0+dGhyZWUsIGN0eCk7CisgICAgICBlY19tdWxtIChsNSwgbDUsIHkyLCBjdHgpOworICAgICAgLyogbDYgPSBsNCAtIGw1ICAqLworICAgICAgZWNfc3VibSAobDYsIGw0LCBsNSwgY3R4KTsKKworICAgICAgaWYgKCFtcGlfY21wX3VpIChsMywgMCkpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIW1waV9jbXBfdWkgKGw2LCAwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogUDEgYW5kIFAyIGFyZSB0aGUgc2FtZSAtIHVzZSBkdXBsaWNhdGUgZnVuY3Rpb24uICAqLworICAgICAgICAgICAgICBfZ2NyeV9tcGlfZWNfZHVwX3BvaW50IChyZXN1bHQsIHAxLCBjdHgpOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogUDEgaXMgdGhlIGludmVyc2Ugb2YgUDIuICAqLworICAgICAgICAgICAgICBtcGlfc2V0X3VpICh4MywgMSk7CisgICAgICAgICAgICAgIG1waV9zZXRfdWkgKHkzLCAxKTsKKyAgICAgICAgICAgICAgbXBpX3NldF91aSAoejMsIDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBsNyA9IGwxICsgbDIgICovCisgICAgICAgICAgZWNfYWRkbSAobDcsIGwxLCBsMiwgY3R4KTsKKyAgICAgICAgICAvKiBsOCA9IGw0ICsgbDUgICovCisgICAgICAgICAgZWNfYWRkbSAobDgsIGw0LCBsNSwgY3R4KTsKKyAgICAgICAgICAvKiB6MyA9IHoxIHoyIGwzICAqLworICAgICAgICAgIGVjX211bG0gKHozLCB6MSwgejIsIGN0eCk7CisgICAgICAgICAgZWNfbXVsbSAoejMsIHozLCBsMywgY3R4KTsKKyAgICAgICAgICAvKiB4MyA9IGw2XjIgLSBsNyBsM14yICAqLworICAgICAgICAgIGVjX3Bvd20gKHQxLCBsNiwgY3R4LT50d28sIGN0eCk7CisgICAgICAgICAgZWNfcG93bSAodDIsIGwzLCBjdHgtPnR3bywgY3R4KTsKKyAgICAgICAgICBlY19tdWxtICh0MiwgdDIsIGw3LCBjdHgpOworICAgICAgICAgIGVjX3N1Ym0gKHgzLCB0MSwgdDIsIGN0eCk7CisgICAgICAgICAgLyogbDkgPSBsNyBsM14yIC0gMiB4MyAgKi8KKyAgICAgICAgICBlY19tdWxtICh0MSwgeDMsIGN0eC0+dHdvLCBjdHgpOworICAgICAgICAgIGVjX3N1Ym0gKGw5LCB0MiwgdDEsIGN0eCk7CisgICAgICAgICAgLyogeTMgPSAobDkgbDYgLSBsOCBsM14zKS8yICAqLworICAgICAgICAgIGVjX211bG0gKGw5LCBsOSwgbDYsIGN0eCk7CisgICAgICAgICAgZWNfcG93bSAodDEsIGwzLCBjdHgtPnRocmVlLCBjdHgpOyAvKiBmaXhtZTogVXNlIHNhdmVkIHZhbHVlKi8KKyAgICAgICAgICBlY19tdWxtICh0MSwgdDEsIGw4LCBjdHgpOworICAgICAgICAgIGVjX3N1Ym0gKHkzLCBsOSwgdDEsIGN0eCk7CisgICAgICAgICAgZWNfbXVsbSAoeTMsIHkzLCBjdHgtPnR3b19pbnZfcCwgY3R4KTsKKyAgICAgICAgfQorICAgIH0KKworI3VuZGVmIHgxCisjdW5kZWYgeTEKKyN1bmRlZiB6MQorI3VuZGVmIHgyCisjdW5kZWYgeTIKKyN1bmRlZiB6MgorI3VuZGVmIHgzCisjdW5kZWYgeTMKKyN1bmRlZiB6MworI3VuZGVmIGwxCisjdW5kZWYgbDIKKyN1bmRlZiBsMworI3VuZGVmIGw0CisjdW5kZWYgbDUKKyN1bmRlZiBsNgorI3VuZGVmIGw3CisjdW5kZWYgbDgKKyN1bmRlZiBsOQorI3VuZGVmIHQxCisjdW5kZWYgdDIKK30KKworCisKKy8qIFNjYWxhciBwb2ludCBtdWx0aXBsaWNhdGlvbiAtIHRoZSBtYWluIGZ1bmN0aW9uIGZvciBFQ0MuICBJZiB0YWtlcworICAgYW4gaW50ZWdlciBTQ0FMQVIgYW5kIGEgUE9JTlQgYXMgd2VsbCBhcyB0aGUgdXN1YWwgY29udGV4dCBDVFguCisgICBSRVNVTFQgd2lsbCBiZSBzZXQgdG8gdGhlIHJlc3VsdGluZyBwb2ludC4gKi8KK3ZvaWQKK19nY3J5X21waV9lY19tdWxfcG9pbnQgKG1waV9wb2ludF90ICpyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X21waV90IHNjYWxhciwgbXBpX3BvaW50X3QgKnBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgbXBpX2VjX3QgY3R4KQoreworI2lmIDAKKyAgLyogU2ltcGxlIGxlZnQgdG8gcmlnaHQgYmluYXJ5IG1ldGhvZC4gIEdFQ0MgQWxnb3JpdGhtIDMuMjcgKi8KKyAgdW5zaWduZWQgaW50IG5iaXRzOworICBpbnQgaTsKKworICBuYml0cyA9IG1waV9nZXRfbmJpdHMgKHNjYWxhcik7CisgIG1waV9zZXRfdWkgKHJlc3VsdC0+eCwgMSk7CisgIG1waV9zZXRfdWkgKHJlc3VsdC0+eSwgMSk7CisgIG1waV9zZXRfdWkgKHJlc3VsdC0+eiwgMCk7IAorCisgIGZvciAoaT1uYml0cy0xOyBpID49IDA7IGktLSkKKyAgICB7CisgICAgICBfZ2NyeV9tcGlfZWNfZHVwX3BvaW50IChyZXN1bHQsIHJlc3VsdCwgY3R4KTsKKyAgICAgIGlmIChtcGlfdGVzdF9iaXQgKHNjYWxhciwgaSkgPT0gMSkKKyAgICAgICAgX2djcnlfbXBpX2VjX2FkZF9wb2ludHMgKHJlc3VsdCwgcmVzdWx0LCBwb2ludCwgY3R4KTsgCisgICAgfQorCisjZWxzZSAKKyAgZ2NyeV9tcGlfdCB4MSwgeTEsIHoxLCBrLCBoLCB5eTsKKyAgdW5zaWduZWQgaW50IGksIGxvb3BzOworICBtcGlfcG9pbnRfdCBwMSwgcDIsIHAxaW52OworCisgIHgxID0gbXBpX2FsbG9jX2xpa2UgKGN0eC0+cCk7CisgIHkxID0gbXBpX2FsbG9jX2xpa2UgKGN0eC0+cCk7CisgIGggID0gbXBpX2FsbG9jX2xpa2UgKGN0eC0+cCk7CisgIGsgID0gbXBpX2NvcHkgKHNjYWxhcik7CisgIHl5ID0gbXBpX2NvcHkgKHBvaW50LT55KTsgCisKKyAgaWYgKCBtcGlfaXNfbmVnIChrKSApCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBrLT5zaWduID0gMDsKKyAgICAgIGVjX2ludm0gKHl5LCB5eSwgY3R4KTsKKyAgICB9CisKKyAgaWYgKCFtcGlfY21wX3VpIChwb2ludC0+eiwgMSkpCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgbXBpX3NldCAoeDEsIHBvaW50LT54KTsKKyAgICAgIG1waV9zZXQgKHkxLCB5eSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZ2NyeV9tcGlfdCB6MiwgejM7CisKKyAgICAgIHoyID0gbXBpX2FsbG9jX2xpa2UgKGN0eC0+cCk7CisgICAgICB6MyA9IG1waV9hbGxvY19saWtlIChjdHgtPnApOworICAgICAgZWNfbXVsbSAoejIsIHBvaW50LT56LCBwb2ludC0+eiwgY3R4KTsgICAgICAKKyAgICAgIGVjX211bG0gKHozLCBwb2ludC0+eiwgejIsIGN0eCk7ICAgICAgCisgICAgICBlY19pbnZtICh6MiwgejIsIGN0eCk7ICAgICAgICAgIAorICAgICAgZWNfbXVsbSAoeDEsIHBvaW50LT54LCB6MiwgY3R4KTsKKyAgICAgIGVjX2ludm0gKHozLCB6MywgY3R4KTsgICAgICAgICAgCisgICAgICBlY19tdWxtICh5MSwgeXksIHozLCBjdHgpOyAgICAgIAorICAgICAgbXBpX2ZyZWUgKHoyKTsKKyAgICAgIG1waV9mcmVlICh6Myk7CisgICAgfQorICB6MSA9IG1waV9jb3B5IChjdHgtPm9uZSk7CisKKyAgbXBpX211bCAoaCwgaywgY3R4LT50aHJlZSk7IC8qIGggPSAzayAqLworICBsb29wcyA9IG1waV9nZXRfbmJpdHMgKGgpOworCisgIG1waV9zZXQgKHJlc3VsdC0+eCwgcG9pbnQtPngpOworICBtcGlfc2V0IChyZXN1bHQtPnksIHl5KTsgbXBpX2ZyZWUgKHl5KTsgeXkgPSBOVUxMOworICBtcGlfc2V0IChyZXN1bHQtPnosIHBvaW50LT56KTsgCisKKyAgcDEueCA9IHgxOyB4MSA9IE5VTEw7CisgIHAxLnkgPSB5MTsgeTEgPSBOVUxMOworICBwMS56ID0gejE7IHoxID0gTlVMTDsKKyAgcG9pbnRfaW5pdCAoJnAyKTsKKyAgcG9pbnRfaW5pdCAoJnAxaW52KTsKKworICBmb3IgKGk9bG9vcHMtMjsgaSA+IDA7IGktLSkKKyAgICB7IAorICAgICAgX2djcnlfbXBpX2VjX2R1cF9wb2ludCAocmVzdWx0LCByZXN1bHQsIGN0eCk7CisgICAgICBpZiAobXBpX3Rlc3RfYml0IChoLCBpKSA9PSAxICYmIG1waV90ZXN0X2JpdCAoaywgaSkgPT0gMCkKKyAgICAgICAgeyAKKyAgICAgICAgICBwb2ludF9zZXQgKCZwMiwgcmVzdWx0KTsKKyAgICAgICAgICBfZ2NyeV9tcGlfZWNfYWRkX3BvaW50cyAocmVzdWx0LCAmcDIsICZwMSwgY3R4KTsgCisgICAgICAgIH0KKyAgICAgIGlmIChtcGlfdGVzdF9iaXQgKGgsIGkpID09IDAgJiYgbXBpX3Rlc3RfYml0IChrLCBpKSA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgcG9pbnRfc2V0ICgmcDIsIHJlc3VsdCk7CisgICAgICAgICAgLyogSW52ZXJ0IHBvaW50OiB5ID0gcCAtIHkgbW9kIHAgICovCisgICAgICAgICAgcG9pbnRfc2V0ICgmcDFpbnYsICZwMSk7CisgICAgICAgICAgZWNfc3VibSAocDFpbnYueSwgY3R4LT5wLCBwMWludi55LCBjdHgpOworICAgICAgICAgIF9nY3J5X21waV9lY19hZGRfcG9pbnRzIChyZXN1bHQsICZwMiwgJnAxaW52LCBjdHgpOyAKKyAgICAgICAgfQorICAgIH0KKworICBwb2ludF9mcmVlICgmcDEpOworICBwb2ludF9mcmVlICgmcDIpOworICBwb2ludF9mcmVlICgmcDFpbnYpOworICBtcGlfZnJlZSAoaCk7CisgIG1waV9mcmVlIChrKTsKKyNlbmRpZgorfQorCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL2dlbmVyaWMvTWFuaWZlc3QgYi9saWJnY3J5cHQtMS40LjYvbXBpL2dlbmVyaWMvTWFuaWZlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQyOWZkZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvZ2VuZXJpYy9NYW5pZmVzdApAQCAtMCwwICsxLDI5IEBACisjIE1hbmlmZXN0IC0gY2hlY2tzdW1zIAorIyBDb3B5cmlnaHQgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorIworIyBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgZ2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKworbXBpaC1hZGQxLmMgaVFDVkF3VUFQK0xqMkRFQW5wODMyUy83QVFLbi9BUUF3UUxXZ2dsNnpOUTVFWitsRStqS1Y4VzNGc29nVzMvNnRwOVQ1cnJTUjVKbmxXeW9IUTkvUHU0a25PY0xqUzZuSWZWT2lBRWlmdTNudUl5c1FyOWpEU1NTSkEyTHlsU1VCU1hLTEtEYW1Qc09Dd1hPTHhpWk9Ec2xKVDNDQ0dBVXRMdlhKcldEYlRaUXJrRXV3bkxualFGRHp1QTdpWTlKTHJHOWtBb1hENlE9PVdvV20KK21waWgtbXVsMS5jIGlRQ1ZBd1VBUCtMa0NURUFucDgzMlMvN0FRS0ZWUVArTWhCTmpjWTczSnRuc0haZm5hVlpxM1RpS3dOMTUxY1dWNTFuRGMxUm5UYU1oU0lGZXVObGozdk5NTDJXMEduOG4rR255aVdFMlhYZFFFYWlrNkJMMDJlZWtVbjlhcTdJL3JkcG5USHVPalFQSzF1d2p1Tmw4UnVKOVlyRVJCQXhxNG9CNzFmK2l3TWFiOGRzTVNVbFZDK05kZUFvY1JxTExnblIvZWZrZExjPT0yVGtiCittcGloLW11bDIuYyBpUUNWQXdVQVArTGtNakVBbnA4MzJTLzdBUUxQZUFRQXFtUnp4RmUvbURxVGRaci9wVFhUOFJWeUIxdktCMEVpMlRIVjA1QnhtSTRPUHYzOXV5c2ZGcExNdC9JTnNYN0FHcWRPbGo0ak9aL3FOYUZYUjFjZU1ybFNYdm84dS9lcGs2ckNYRnA4MmtNN1FzOTgzTGpvUC8vUHJNQ2tZa1h3YmxhVnJnVUdpQlVDYnVQTWxpV1RLNnFLa3h4WHRFZnFaN25WYkVXZEJ4OD09S3dobAorbXBpaC1tdWwzLmMgaVFDVkF3VUFQK0xrVkRFQW5wODMyUy83QVFMOTFnUC9RZDVpWld4UmlONURkRUlWSEFlZG9OdmwyM05QclQyVVVkWHZuU0s0OURwcGxUeGtMaU1CajBXcUNheUcvWUlFVDJOcE1SQ2VMdkFaTmNTdDZsT20wYlNaRFlvMUh2L04rVW9xRDNWMU1jalkxNlJFQnYvbm5QYU1XTVpjeDdybDV5S1RWWmlYMlBnVjZvUU9MN1lmcnQ1WklPbHJIQlJzOVMyL3pjQ2FWejA9PTlCUWUKK21waWgtbHNoaWZ0LmMgaVFDVkF3VUFQK0xsQVRFQW5wODMyUy83QVFJQUNBUUFoTXJweDBTUlhFL0xOMU5rak1POW43NG5NcnZtellKeXJ1MGd3Mk80QllyVVB2RC9MV0dqdTJGWmFnZ0tWMElCam1pMGNEb0NyTmVLOUVHaktPTzFsZmdPRGJYMklaMUxVaHI5akR1TWowUVJxajZUOVlrQUZZVE5VazRHZnB3SWY3VDZZYm83Yzc4Sng5M1BpZENKdDdkMzllTU1FYWxvb0M3TFo0SVUzTk09PW5aNGsKK21waWgtcnNoaWZ0LmMgaVFDVkF3VUFQK0xsSWpFQW5wODMyUy83QVFLaXVBUC9lWUMyWlNjZCt0YUJ4L2tOelJ2R2pBMGVBWHZPUk1rTUxWNk90K09YVnpWVWkwNGVvUDJ5WGR4U05GS3dVajEycDhHV1hrZG9NRzNhT0dCS2cyYTdiWTVRNVJVaG8zaFVXYjlVc1ZZVlVmWExmN0lPVHQvM2E2TUxoMkNtVjVkRlBXSm1TbGJDeVFSY242bi9mTERlSjNBMmJXVFMvQmhxR2ZwT1hVSVUxd3M9PWpDZjgKK21waWgtc3ViMS5jIGlRQ1ZBd1VBUCtMbFp6RUFucDgzMlMvN0FRSUVQZ1AvZExIVERSYlByWUpoc0xwOVNqR3N0VTFNOC9JQzVYeXRjRHRPM05RZXU0bXg2dmFYanB1anRzVHZLSWJYNFFMNUlhaE5udFZWS3YxeEZMRW0yeUZnN0wybnMwdUQvbWZ3R2dPaENHMWoyby9TYVRBV1A1S3hQN2FlNVVEY1psMnc2Tld2RXVNajl0MzJ6bXppQVpqUDhXNzNBMzdGVXNwZVJEWWlMOXNRemtJPT1RUXprCit1ZGl2LXctc2Rpdi5jIGlRQ1ZBd1VBUCtMazBURUFucDgzMlMvN0FRSUNYQVFBc3hlMVNRRDQreFphWlRxQkMwVjlDeXVvMG1yZGNjblJGenRoT3RtMEFSd0tGWFUyY3VMVy9aQk9rbWVXT1ZtT0ZoQnAyMi9JOGRFR1luTUEzZ2NmbU9NQ3BOdTlpOXprL1hIZnB0ZHVuQTFNbk9lM0dzb1dnZkhMMHJocEF5UGhwL1gwNDNJQ0I0MU5FbG5udXhBRHVRUWxENFoxZmNhNXlnWXhNcjJjckpnPT1FSS82CittcGktYXNtLWRlZnMuaCBpUUNWQXdVQVArTGtnREVBbnA4MzJTLzdBUUswRmdRQXhKWjd4dlhob1phMzNHV2UyM0xSYjNhc3Juby9sb1pTeUFJWHJudHF0Vkg4TTNwRXNDWTBPeVc0cnk0aFgyUm54cHVoUkNNL1BkUk5MRzN4WHlNU1ZJaGtIVThXVlJMcXpGMkxMakVreVUzY0FtSG5uVFE5YU8vWHBVV3RKR1RaOHEyYnY3WnNBRWk0YVBsMHA2S2hQWGNQZ005dlEyWGN5T1BuM0RsMGQ2UT09eHBqSQorJG5hbWVzJCBpUUNWQXdVQVArTG1OREVBbnA4MzJTLzdBUUphK2dQK0tRTkpwYk5PZ2MrczJVWCtZYTJnRGFPRmNBUk9JbUlsbGhnM2VqOEVhQkY4eHhkSG1XVDF6YUt3VHdpM21vRUVsZXlrTVIxMDRZQUdXeVFlTWJGWWl1UFBCVytvaHJUNkt4UkJWSnBJQTlhdU9PcXFKTXlnbFp5b1IzSHY3Z2R1VllVVzFoL0RlYm5xaUtYS0VmelFERnFZdVQwYXl1dGVvT1I0QjVOSUNiRT09bkxTaApkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9nZW5lcmljL2Rpc3RmaWxlcyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvZ2VuZXJpYy9kaXN0ZmlsZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgxMGVlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvZ2VuZXJpYy9kaXN0ZmlsZXMKQEAgLTAsMCArMSwxMSBAQAorTWFuaWZlc3QKK21waWgtYWRkMS5jCittcGloLW11bDEuYworbXBpaC1tdWwyLmMKK21waWgtbXVsMy5jCittcGloLWxzaGlmdC5jCittcGloLXJzaGlmdC5jCittcGloLXN1YjEuYwordWRpdi13LXNkaXYuYworbXBpLWFzbS1kZWZzLmgKKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9nZW5lcmljL21waS1hc20tZGVmcy5oIGIvbGliZ2NyeXB0LTEuNC42L21waS9nZW5lcmljL21waS1hc20tZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNDI0ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL2dlbmVyaWMvbXBpLWFzbS1kZWZzLmgKQEAgLTAsMCArMSwxMCBAQAorLyogVGhpcyBmaWxlIGRlZmluZXMgc29tZSBiYXNpYyBjb25zdGFudHMgZm9yIHRoZSBNUEkgbWFjaGluZXJ5LiAgV2UKKyAqIG5lZWQgdG8gZGVmaW5lIHRoZSB0eXBlcyBvbiBhIHBlci1DUFUgYmFzaXMsIHNvIGl0IGlzIGRvbmUgd2l0aAorICogdGhpcyBmaWxlIGhlcmUuICAqLworI2RlZmluZSBCWVRFU19QRVJfTVBJX0xJTUIgIChTSVpFT0ZfVU5TSUdORURfTE9ORykKKworCisKKworCisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvZ2VuZXJpYy9tcGloLWFkZDEuYyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvZ2VuZXJpYy9tcGloLWFkZDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTg0ZGY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9nZW5lcmljL21waWgtYWRkMS5jCkBAIC0wLDAgKzEsNjUgQEAKKy8qIG1waWhlbHAtYWRkXzEuYyAgLSAgTVBJIGhlbHBlciBmdW5jdGlvbnMKKyAqIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NiwgMTk5NywgMTk5OCwgCisgKiAgICAgICAgICAgICAgIDIwMDAsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICoKKyAqIE5vdGU6IFRoaXMgY29kZSBpcyBoZWF2aWx5IGJhc2VkIG9uIHRoZSBHTlUgTVAgTGlicmFyeS4KKyAqCSBBY3R1YWxseSBpdCdzIHRoZSBzYW1lIGNvZGUgd2l0aCBvbmx5IG1pbm9yIGNoYW5nZXMgaW4gdGhlCisgKgkgd2F5IHRoZSBkYXRhIGlzIHN0b3JlZDsgdGhpcyBpcyB0byBzdXBwb3J0IHRoZSBhYnN0cmFjdGlvbgorICoJIG9mIGFuIG9wdGlvbmFsIHNlY3VyZSBtZW1vcnkgYWxsb2NhdGlvbiB3aGljaCBtYXkgYmUgdXNlZAorICoJIHRvIGF2b2lkIHJldmVhbGluZyBvZiBzZW5zaXRpdmUgZGF0YSBkdWUgdG8gcGFnaW5nIGV0Yy4KKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJtcGktaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCittcGlfbGltYl90CitfZ2NyeV9tcGloX2FkZF9uIChtcGlfcHRyX3QgcmVzX3B0ciwgbXBpX3B0cl90IHMxX3B0ciwKKyAgICAgICAgICAgICAgICAgIG1waV9wdHJfdCBzMl9wdHIsIG1waV9zaXplX3Qgc2l6ZSkKK3sKKyAgbXBpX2xpbWJfdCB4LCB5LCBjeTsKKyAgbXBpX3NpemVfdCBqOworCisgIC8qIFRoZSBsb29wIGNvdW50ZXIgYW5kIGluZGV4IEogZ29lcyBmcm9tIC1TSVpFIHRvIC0xLiAgVGhpcyB3YXkKKyAgICAgdGhlIGxvb3AgYmVjb21lcyBmYXN0ZXIuICAqLworICBqID0gLXNpemU7CisKKyAgLyogT2Zmc2V0IHRoZSBiYXNlIHBvaW50ZXJzIHRvIGNvbXBlbnNhdGUgZm9yIHRoZSBuZWdhdGl2ZSBpbmRpY2VzLiAqLworICBzMV9wdHIgLT0gajsKKyAgczJfcHRyIC09IGo7CisgIHJlc19wdHIgLT0gajsKKworICBjeSA9IDA7CisgIGRvIAorICAgIHsKKyAgICAgIHkgPSBzMl9wdHJbal07CisgICAgICB4ID0gczFfcHRyW2pdOworICAgICAgeSArPSBjeTsJCSAgLyogYWRkIHByZXZpb3VzIGNhcnJ5IHRvIG9uZSBhZGRlbmQgKi8KKyAgICAgIGN5ID0geSA8IGN5OwkgIC8qIGdldCBvdXQgY2FycnkgZnJvbSB0aGF0IGFkZGl0aW9uICovCisgICAgICB5ICs9IHg7IAkJICAvKiBhZGQgb3RoZXIgYWRkZW5kICovCisgICAgICBjeSArPSB5IDwgeDsJICAvKiBnZXQgb3V0IGNhcnJ5IGZyb20gdGhhdCBhZGQsIGNvbWJpbmUgKi8KKyAgICAgIHJlc19wdHJbal0gPSB5OworICAgIH0gCisgIHdoaWxlICggKytqICk7CisKKyAgcmV0dXJuIGN5OworfQorCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL2dlbmVyaWMvbXBpaC1sc2hpZnQuYyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvZ2VuZXJpYy9tcGloLWxzaGlmdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0OGMxMmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL2dlbmVyaWMvbXBpaC1sc2hpZnQuYwpAQCAtMCwwICsxLDY4IEBACisvKiBtcGktbHNoaWZ0LmMgIC0gTVBJIGhlbHBlciBmdW5jdGlvbnMKKyAqIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NiwgMTk5OCwgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKgorICogTm90ZTogVGhpcyBjb2RlIGlzIGhlYXZpbHkgYmFzZWQgb24gdGhlIEdOVSBNUCBMaWJyYXJ5LgorICoJIEFjdHVhbGx5IGl0J3MgdGhlIHNhbWUgY29kZSB3aXRoIG9ubHkgbWlub3IgY2hhbmdlcyBpbiB0aGUKKyAqCSB3YXkgdGhlIGRhdGEgaXMgc3RvcmVkOyB0aGlzIGlzIHRvIHN1cHBvcnQgdGhlIGFic3RyYWN0aW9uCisgKgkgb2YgYW4gb3B0aW9uYWwgc2VjdXJlIG1lbW9yeSBhbGxvY2F0aW9uIHdoaWNoIG1heSBiZSB1c2VkCisgKgkgdG8gYXZvaWQgcmV2ZWFsaW5nIG9mIHNlbnNpdGl2ZSBkYXRhIGR1ZSB0byBwYWdpbmcgZXRjLgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIm1waS1pbnRlcm5hbC5oIgorCisvKiBTaGlmdCBVIChwb2ludGVkIHRvIGJ5IFVQIGFuZCBVU0laRSBkaWdpdHMgbG9uZykgQ05UIGJpdHMgdG8gdGhlIGxlZnQKKyAqIGFuZCBzdG9yZSB0aGUgVVNJWkUgbGVhc3Qgc2lnbmlmaWNhbnQgZGlnaXRzIG9mIHRoZSByZXN1bHQgYXQgV1AuCisgKiBSZXR1cm4gdGhlIGJpdHMgc2hpZnRlZCBvdXQgZnJvbSB0aGUgbW9zdCBzaWduaWZpY2FudCBkaWdpdC4KKyAqCisgKiBBcmd1bWVudCBjb25zdHJhaW50czoKKyAqIDEuIDAgPCBDTlQgPCBCSVRTX1BFUl9NUF9MSU1CCisgKiAyLiBJZiB0aGUgcmVzdWx0IGlzIHRvIGJlIHdyaXR0ZW4gb3ZlciB0aGUgaW5wdXQsIFdQIG11c3QgYmUgPj0gVVAuCisgKi8KKworbXBpX2xpbWJfdAorX2djcnlfbXBpaF9sc2hpZnQoIG1waV9wdHJfdCB3cCwgbXBpX3B0cl90IHVwLCBtcGlfc2l6ZV90IHVzaXplLAorCQkJCQkgICAgdW5zaWduZWQgaW50IGNudCkKK3sKKyAgbXBpX2xpbWJfdCBoaWdoX2xpbWIsIGxvd19saW1iOworICB1bnNpZ25lZCBzaF8xLCBzaF8yOworICBtcGlfc2l6ZV90IGk7CisgIG1waV9saW1iX3QgcmV0dmFsOworCisgIHNoXzEgPSBjbnQ7CisgIHdwICs9IDE7CisgIHNoXzIgPSBCSVRTX1BFUl9NUElfTElNQiAtIHNoXzE7CisgIGkgPSB1c2l6ZSAtIDE7CisgIGxvd19saW1iID0gdXBbaV07CisgIHJldHZhbCA9IGxvd19saW1iID4+IHNoXzI7CisgIGhpZ2hfbGltYiA9IGxvd19saW1iOworICB3aGlsZSAoIC0taSA+PSAwICkgCisgICAgeworICAgICAgbG93X2xpbWIgPSB1cFtpXTsKKyAgICAgIHdwW2ldID0gKGhpZ2hfbGltYiA8PCBzaF8xKSB8IChsb3dfbGltYiA+PiBzaF8yKTsKKyAgICAgIGhpZ2hfbGltYiA9IGxvd19saW1iOworICAgIH0KKyAgd3BbaV0gPSBoaWdoX2xpbWIgPDwgc2hfMTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvZ2VuZXJpYy9tcGloLW11bDEuYyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvZ2VuZXJpYy9tcGloLW11bDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTgxOTdkCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9nZW5lcmljL21waWgtbXVsMS5jCkBAIC0wLDAgKzEsNjIgQEAKKy8qIG1waWhlbHAtbXVsXzEuYyAgLSAgTVBJIGhlbHBlciBmdW5jdGlvbnMKKyAqIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NiwgMTk5NywgMTk5OCwgMjAwMSwKKyAqICAgICAgICAgICAgICAgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKgorICogTm90ZTogVGhpcyBjb2RlIGlzIGhlYXZpbHkgYmFzZWQgb24gdGhlIEdOVSBNUCBMaWJyYXJ5LgorICoJIEFjdHVhbGx5IGl0J3MgdGhlIHNhbWUgY29kZSB3aXRoIG9ubHkgbWlub3IgY2hhbmdlcyBpbiB0aGUKKyAqCSB3YXkgdGhlIGRhdGEgaXMgc3RvcmVkOyB0aGlzIGlzIHRvIHN1cHBvcnQgdGhlIGFic3RyYWN0aW9uCisgKgkgb2YgYW4gb3B0aW9uYWwgc2VjdXJlIG1lbW9yeSBhbGxvY2F0aW9uIHdoaWNoIG1heSBiZSB1c2VkCisgKgkgdG8gYXZvaWQgcmV2ZWFsaW5nIG9mIHNlbnNpdGl2ZSBkYXRhIGR1ZSB0byBwYWdpbmcgZXRjLgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIm1waS1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKK21waV9saW1iX3QKK19nY3J5X21waWhfbXVsXzEoIG1waV9wdHJfdCByZXNfcHRyLCBtcGlfcHRyX3QgczFfcHRyLCBtcGlfc2l6ZV90IHMxX3NpemUsCisJCQkJCQkgICAgbXBpX2xpbWJfdCBzMl9saW1iKQoreworICBtcGlfbGltYl90IGN5X2xpbWI7CisgIG1waV9zaXplX3QgajsKKyAgbXBpX2xpbWJfdCBwcm9kX2hpZ2gsIHByb2RfbG93OworCisgIC8qIFRoZSBsb29wIGNvdW50ZXIgYW5kIGluZGV4IEogZ29lcyBmcm9tIC1TMV9TSVpFIHRvIC0xLiAgVGhpcyB3YXkKKyAgICogdGhlIGxvb3AgYmVjb21lcyBmYXN0ZXIuICAqLworICBqID0gLXMxX3NpemU7CisKKyAgLyogT2Zmc2V0IHRoZSBiYXNlIHBvaW50ZXJzIHRvIGNvbXBlbnNhdGUgZm9yIHRoZSBuZWdhdGl2ZSBpbmRpY2VzLiAgKi8KKyAgczFfcHRyIC09IGo7CisgIHJlc19wdHIgLT0gajsKKworICBjeV9saW1iID0gMDsKKyAgZG8gCisgICAgeworICAgICAgdW11bF9wcG1tKCBwcm9kX2hpZ2gsIHByb2RfbG93LCBzMV9wdHJbal0sIHMyX2xpbWIgKTsKKyAgICAgIHByb2RfbG93ICs9IGN5X2xpbWI7CisgICAgICBjeV9saW1iID0gKHByb2RfbG93IDwgY3lfbGltYj8xOjApICsgcHJvZF9oaWdoOworICAgICAgcmVzX3B0cltqXSA9IHByb2RfbG93OworICAgIH0gCisgIHdoaWxlKCArK2ogKTsKKworICByZXR1cm4gY3lfbGltYjsKK30KKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9nZW5lcmljL21waWgtbXVsMi5jIGIvbGliZ2NyeXB0LTEuNC42L21waS9nZW5lcmljL21waWgtbXVsMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNzU0OTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL2dlbmVyaWMvbXBpaC1tdWwyLmMKQEAgLTAsMCArMSw2OCBAQAorLyogbXBpaC1tdWwyLmMgIC0gIE1QSSBoZWxwZXIgZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTYsIDE5OTcsIDE5OTgsIDIwMDEsCisgKiAgICAgICAgICAgICAgIDIwMDIgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqCisgKiBOb3RlOiBUaGlzIGNvZGUgaXMgaGVhdmlseSBiYXNlZCBvbiB0aGUgR05VIE1QIExpYnJhcnkuCisgKgkgQWN0dWFsbHkgaXQncyB0aGUgc2FtZSBjb2RlIHdpdGggb25seSBtaW5vciBjaGFuZ2VzIGluIHRoZQorICoJIHdheSB0aGUgZGF0YSBpcyBzdG9yZWQ7IHRoaXMgaXMgdG8gc3VwcG9ydCB0aGUgYWJzdHJhY3Rpb24KKyAqCSBvZiBhbiBvcHRpb25hbCBzZWN1cmUgbWVtb3J5IGFsbG9jYXRpb24gd2hpY2ggbWF5IGJlIHVzZWQKKyAqCSB0byBhdm9pZCByZXZlYWxpbmcgb2Ygc2Vuc2l0aXZlIGRhdGEgZHVlIHRvIHBhZ2luZyBldGMuCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAibXBpLWludGVybmFsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworCittcGlfbGltYl90CitfZ2NyeV9tcGloX2FkZG11bF8xKCBtcGlfcHRyX3QgcmVzX3B0ciwgbXBpX3B0cl90IHMxX3B0ciwKKwkJICBtcGlfc2l6ZV90IHMxX3NpemUsIG1waV9saW1iX3QgczJfbGltYikKK3sKKyAgbXBpX2xpbWJfdCBjeV9saW1iOworICBtcGlfc2l6ZV90IGo7CisgIG1waV9saW1iX3QgcHJvZF9oaWdoLCBwcm9kX2xvdzsKKyAgbXBpX2xpbWJfdCB4OworCisgIC8qIFRoZSBsb29wIGNvdW50ZXIgYW5kIGluZGV4IEogZ29lcyBmcm9tIC1TSVpFIHRvIC0xLiAgVGhpcyB3YXkKKyAgICogdGhlIGxvb3AgYmVjb21lcyBmYXN0ZXIuICAqLworICBqID0gLXMxX3NpemU7CisgIHJlc19wdHIgLT0gajsKKyAgczFfcHRyIC09IGo7CisKKyAgY3lfbGltYiA9IDA7CisgIGRvIAorICAgIHsKKyAgICAgIHVtdWxfcHBtbSggcHJvZF9oaWdoLCBwcm9kX2xvdywgczFfcHRyW2pdLCBzMl9saW1iICk7CisKKyAgICAgIHByb2RfbG93ICs9IGN5X2xpbWI7CisgICAgICBjeV9saW1iID0gKHByb2RfbG93IDwgY3lfbGltYj8xOjApICsgcHJvZF9oaWdoOworCisgICAgICB4ID0gcmVzX3B0cltqXTsKKyAgICAgIHByb2RfbG93ID0geCArIHByb2RfbG93OworICAgICAgY3lfbGltYiArPSBwcm9kX2xvdyA8IHg/MTowOworICAgICAgcmVzX3B0cltqXSA9IHByb2RfbG93OworICAgIH0gCisgIHdoaWxlICggKytqICk7CisgICAgCisgIHJldHVybiBjeV9saW1iOworfQorCisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvZ2VuZXJpYy9tcGloLW11bDMuYyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvZ2VuZXJpYy9tcGloLW11bDMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTg0Zjk0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9nZW5lcmljL21waWgtbXVsMy5jCkBAIC0wLDAgKzEsNjggQEAKKy8qIG1waWgtbXVsMy5jICAtICBNUEkgaGVscGVyIGZ1bmN0aW9ucworICogQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk2LCAxOTk3LCAxOTk4LCAyMDAxLAorICogICAgICAgICAgICAgICAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqCisgKiBOb3RlOiBUaGlzIGNvZGUgaXMgaGVhdmlseSBiYXNlZCBvbiB0aGUgR05VIE1QIExpYnJhcnkuCisgKgkgQWN0dWFsbHkgaXQncyB0aGUgc2FtZSBjb2RlIHdpdGggb25seSBtaW5vciBjaGFuZ2VzIGluIHRoZQorICoJIHdheSB0aGUgZGF0YSBpcyBzdG9yZWQ7IHRoaXMgaXMgdG8gc3VwcG9ydCB0aGUgYWJzdHJhY3Rpb24KKyAqCSBvZiBhbiBvcHRpb25hbCBzZWN1cmUgbWVtb3J5IGFsbG9jYXRpb24gd2hpY2ggbWF5IGJlIHVzZWQKKyAqCSB0byBhdm9pZCByZXZlYWxpbmcgb2Ygc2Vuc2l0aXZlIGRhdGEgZHVlIHRvIHBhZ2luZyBldGMuCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAibXBpLWludGVybmFsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworCittcGlfbGltYl90CitfZ2NyeV9tcGloX3N1Ym11bF8xKCBtcGlfcHRyX3QgcmVzX3B0ciwgbXBpX3B0cl90IHMxX3B0ciwKKwkJICBtcGlfc2l6ZV90IHMxX3NpemUsIG1waV9saW1iX3QgczJfbGltYikKK3sKKyAgbXBpX2xpbWJfdCBjeV9saW1iOworICBtcGlfc2l6ZV90IGo7CisgIG1waV9saW1iX3QgcHJvZF9oaWdoLCBwcm9kX2xvdzsKKyAgbXBpX2xpbWJfdCB4OworCisgIC8qIFRoZSBsb29wIGNvdW50ZXIgYW5kIGluZGV4IEogZ29lcyBmcm9tIC1TSVpFIHRvIC0xLiAgVGhpcyB3YXkKKyAgICogdGhlIGxvb3AgYmVjb21lcyBmYXN0ZXIuICAqLworICBqID0gLXMxX3NpemU7CisgIHJlc19wdHIgLT0gajsKKyAgczFfcHRyIC09IGo7CisKKyAgY3lfbGltYiA9IDA7CisgIGRvIAorICAgIHsKKyAgICAgIHVtdWxfcHBtbSggcHJvZF9oaWdoLCBwcm9kX2xvdywgczFfcHRyW2pdLCBzMl9saW1iKTsKKworICAgICAgcHJvZF9sb3cgKz0gY3lfbGltYjsKKyAgICAgIGN5X2xpbWIgPSAocHJvZF9sb3cgPCBjeV9saW1iPzE6MCkgKyBwcm9kX2hpZ2g7CisKKyAgICAgIHggPSByZXNfcHRyW2pdOworICAgICAgcHJvZF9sb3cgPSB4IC0gcHJvZF9sb3c7CisgICAgICBjeV9saW1iICs9IHByb2RfbG93ID4geD8xOjA7CisgICAgICByZXNfcHRyW2pdID0gcHJvZF9sb3c7CisgICAgfSAKKyAgd2hpbGUoICsraiApOworCisgIHJldHVybiBjeV9saW1iOworfQorCisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvZ2VuZXJpYy9tcGloLXJzaGlmdC5jIGIvbGliZ2NyeXB0LTEuNC42L21waS9nZW5lcmljL21waWgtcnNoaWZ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQwNzk0ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvZ2VuZXJpYy9tcGloLXJzaGlmdC5jCkBAIC0wLDAgKzEsNjcgQEAKKy8qIG1waWgtcnNoaWZ0LmMgIC0gIE1QSSBoZWxwZXIgZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTYsIDE5OTgsIDE5OTksCisgKiAgICAgICAgICAgICAgIDIwMDAsIDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICoKKyAqIE5vdGU6IFRoaXMgY29kZSBpcyBoZWF2aWx5IGJhc2VkIG9uIHRoZSBHTlUgTVAgTGlicmFyeS4KKyAqCSBBY3R1YWxseSBpdCdzIHRoZSBzYW1lIGNvZGUgd2l0aCBvbmx5IG1pbm9yIGNoYW5nZXMgaW4gdGhlCisgKgkgd2F5IHRoZSBkYXRhIGlzIHN0b3JlZDsgdGhpcyBpcyB0byBzdXBwb3J0IHRoZSBhYnN0cmFjdGlvbgorICoJIG9mIGFuIG9wdGlvbmFsIHNlY3VyZSBtZW1vcnkgYWxsb2NhdGlvbiB3aGljaCBtYXkgYmUgdXNlZAorICoJIHRvIGF2b2lkIHJldmVhbGluZyBvZiBzZW5zaXRpdmUgZGF0YSBkdWUgdG8gcGFnaW5nIGV0Yy4KKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJtcGktaW50ZXJuYWwuaCIKKworCisvKiBTaGlmdCBVIChwb2ludGVkIHRvIGJ5IFVQIGFuZCBVU0laRSBsaW1icyBsb25nKSBDTlQgYml0cyB0byB0aGUgcmlnaHQKKyAqIGFuZCBzdG9yZSB0aGUgVVNJWkUgbGVhc3Qgc2lnbmlmaWNhbnQgbGltYnMgb2YgdGhlIHJlc3VsdCBhdCBXUC4KKyAqIFRoZSBiaXRzIHNoaWZ0ZWQgb3V0IHRvIHRoZSByaWdodCBhcmUgcmV0dXJuZWQuCisgKgorICogQXJndW1lbnQgY29uc3RyYWludHM6CisgKiAxLiAwIDwgQ05UIDwgQklUU19QRVJfTVBfTElNQgorICogMi4gSWYgdGhlIHJlc3VsdCBpcyB0byBiZSB3cml0dGVuIG92ZXIgdGhlIGlucHV0LCBXUCBtdXN0IGJlIDw9IFVQLgorICovCisKK21waV9saW1iX3QKK19nY3J5X21waWhfcnNoaWZ0KCBtcGlfcHRyX3Qgd3AsIG1waV9wdHJfdCB1cCwgbXBpX3NpemVfdCB1c2l6ZSwgdW5zaWduZWQgY250KQoreworICBtcGlfbGltYl90IGhpZ2hfbGltYiwgbG93X2xpbWI7CisgIHVuc2lnbmVkIHNoXzEsIHNoXzI7CisgIG1waV9zaXplX3QgaTsKKyAgbXBpX2xpbWJfdCByZXR2YWw7CisKKyAgc2hfMSA9IGNudDsKKyAgd3AgLT0gMTsKKyAgc2hfMiA9IEJJVFNfUEVSX01QSV9MSU1CIC0gc2hfMTsKKyAgaGlnaF9saW1iID0gdXBbMF07CisgIHJldHZhbCA9IGhpZ2hfbGltYiA8PCBzaF8yOworICBsb3dfbGltYiA9IGhpZ2hfbGltYjsKKyAgZm9yIChpPTE7IGkgPCB1c2l6ZTsgaSsrKQorICAgIHsKKyAgICAgIGhpZ2hfbGltYiA9IHVwW2ldOworICAgICAgd3BbaV0gPSAobG93X2xpbWIgPj4gc2hfMSkgfCAoaGlnaF9saW1iIDw8IHNoXzIpOworICAgICAgbG93X2xpbWIgPSBoaWdoX2xpbWI7CisgICAgfQorICB3cFtpXSA9IGxvd19saW1iID4+IHNoXzE7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9nZW5lcmljL21waWgtc3ViMS5jIGIvbGliZ2NyeXB0LTEuNC42L21waS9nZW5lcmljL21waWgtc3ViMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ODgyMWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL2dlbmVyaWMvbXBpaC1zdWIxLmMKQEAgLTAsMCArMSw2NiBAQAorLyogbXBpaGVscC1hZGRfMi5jICAtICBNUEkgaGVscGVyIGZ1bmN0aW9ucworICogQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk2LCAxOTk3LCAxOTk4LCAyMDAxLAorICogICAgICAgICAgICAgICAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqCisgKiBOb3RlOiBUaGlzIGNvZGUgaXMgaGVhdmlseSBiYXNlZCBvbiB0aGUgR05VIE1QIExpYnJhcnkuCisgKgkgQWN0dWFsbHkgaXQncyB0aGUgc2FtZSBjb2RlIHdpdGggb25seSBtaW5vciBjaGFuZ2VzIGluIHRoZQorICoJIHdheSB0aGUgZGF0YSBpcyBzdG9yZWQ7IHRoaXMgaXMgdG8gc3VwcG9ydCB0aGUgYWJzdHJhY3Rpb24KKyAqCSBvZiBhbiBvcHRpb25hbCBzZWN1cmUgbWVtb3J5IGFsbG9jYXRpb24gd2hpY2ggbWF5IGJlIHVzZWQKKyAqCSB0byBhdm9pZCByZXZlYWxpbmcgb2Ygc2Vuc2l0aXZlIGRhdGEgZHVlIHRvIHBhZ2luZyBldGMuCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAibXBpLWludGVybmFsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworbXBpX2xpbWJfdAorX2djcnlfbXBpaF9zdWJfbiggbXBpX3B0cl90IHJlc19wdHIsIG1waV9wdHJfdCBzMV9wdHIsCisJCQkJICBtcGlfcHRyX3QgczJfcHRyLCBtcGlfc2l6ZV90IHNpemUpCit7CisgIG1waV9saW1iX3QgeCwgeSwgY3k7CisgIG1waV9zaXplX3QgajsKKworICAvKiBUaGUgbG9vcCBjb3VudGVyIGFuZCBpbmRleCBKIGdvZXMgZnJvbSAtU0laRSB0byAtMS4gIFRoaXMgd2F5CisgICAgIHRoZSBsb29wIGJlY29tZXMgZmFzdGVyLiAgKi8KKyAgaiA9IC1zaXplOworCisgIC8qIE9mZnNldCB0aGUgYmFzZSBwb2ludGVycyB0byBjb21wZW5zYXRlIGZvciB0aGUgbmVnYXRpdmUgaW5kaWNlcy4gICovCisgIHMxX3B0ciAtPSBqOworICBzMl9wdHIgLT0gajsKKyAgcmVzX3B0ciAtPSBqOworCisgIGN5ID0gMDsKKyAgZG8gCisgICAgeworICAgICAgeSA9IHMyX3B0cltqXTsKKyAgICAgIHggPSBzMV9wdHJbal07CisgICAgICB5ICs9IGN5OwkJICAvKiBhZGQgcHJldmlvdXMgY2FycnkgdG8gc3VidHJhaGVuZCAqLworICAgICAgY3kgPSB5IDwgY3k7CQkgIC8qIGdldCBvdXQgY2FycnkgZnJvbSB0aGF0IGFkZGl0aW9uICovCisgICAgICB5ID0geCAtIHk7CQkgIC8qIG1haW4gc3VidHJhY3QgKi8KKyAgICAgIGN5ICs9IHkgPiB4OwkJICAvKiBnZXQgb3V0IGNhcnJ5IGZyb20gdGhlIHN1YnRyYWN0LCBjb21iaW5lICovCisgICAgICByZXNfcHRyW2pdID0geTsKKyAgICB9IAorICB3aGlsZSggKytqICk7CisKKyAgcmV0dXJuIGN5OworfQorCisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvZ2VuZXJpYy91ZGl2LXctc2Rpdi5jIGIvbGliZ2NyeXB0LTEuNC42L21waS9nZW5lcmljL3VkaXYtdy1zZGl2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgwZDk4YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvZ2VuZXJpYy91ZGl2LXctc2Rpdi5jCkBAIC0wLDAgKzEsMTMzIEBACisvKiBtcGloLXctc2RpdiAtLSBpbXBsZW1lbnQgdWRpdl9xcm5uZCBvbiBtYWNoaW5lcyB3aXRoIG9ubHkgc2lnbmVkCisgKgkgICAgICAJICBkaXZpc2lvbi4KKyAqIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NCwgMTk5NiwgMTk5OCwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqIENvbnRyaWJ1dGVkIGJ5IFBldGVyIEwuIE1vbnRnb21lcnkuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIm1waS1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKKworI2lmIDAgIC8qIG5vdCB5ZXQgcG9ydGVkIHRvIE1QSSAqLworCittcGlfbGltYl90CittcGloZWxwX3VkaXZfd19zZGl2KCBtcGlfbGltcF90ICpycCwKKwkJICAgICBtcGlfbGltcF90ICphMSwKKwkJICAgICBtcGlfbGltcF90ICphMCwKKwkJICAgICBtcGlfbGltcF90ICpkICAgKQoreworICBtcF9saW1iX3QgcSwgcjsKKyAgbXBfbGltYl90IGMwLCBjMSwgYjE7CisKKyAgaWYgKChtcGlfbGltYl9zaWduZWRfdCkgZCA+PSAwKQorICAgIHsKKyAgICAgIGlmIChhMSA8IGQgLSBhMSAtIChhMCA+PiAoQklUU19QRVJfTVBfTElNQiAtIDEpKSkKKwl7CisJICAvKiBkaXZpZGVuZCwgZGl2aXNvciwgYW5kIHF1b3RpZW50IGFyZSBub25uZWdhdGl2ZSAqLworCSAgc2Rpdl9xcm5uZCAocSwgciwgYTEsIGEwLCBkKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogQ29tcHV0ZSBjMSoyXjMyICsgYzAgPSBhMSoyXjMyICsgYTAgLSAyXjMxKmQgKi8KKwkgIHN1Yl9kZG1tc3MgKGMxLCBjMCwgYTEsIGEwLCBkID4+IDEsIGQgPDwgKEJJVFNfUEVSX01QX0xJTUIgLSAxKSk7CisJICAvKiBEaXZpZGUgKGMxKjJeMzIgKyBjMCkgYnkgZCAqLworCSAgc2Rpdl9xcm5uZCAocSwgciwgYzEsIGMwLCBkKTsKKwkgIC8qIEFkZCAyXjMxIHRvIHF1b3RpZW50ICovCisJICBxICs9IChtcF9saW1iX3QpIDEgPDwgKEJJVFNfUEVSX01QX0xJTUIgLSAxKTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYjEgPSBkID4+IDE7CQkJLyogZC8yLCBiZXR3ZWVuIDJeMzAgYW5kIDJeMzEgLSAxICovCisgICAgICBjMSA9IGExID4+IDE7CQkJLyogQS8yICovCisgICAgICBjMCA9IChhMSA8PCAoQklUU19QRVJfTVBfTElNQiAtIDEpKSArIChhMCA+PiAxKTsKKworICAgICAgaWYgKGExIDwgYjEpCQkJLyogQSA8IDJeMzIqYjEsIHNvIEEvMiA8IDJeMzEqYjEgKi8KKwl7CisJICBzZGl2X3Fybm5kIChxLCByLCBjMSwgYzAsIGIxKTsgLyogKEEvMikgLyAoZC8yKSAqLworCisJICByID0gMipyICsgKGEwICYgMSk7CQkvKiBSZW1haW5kZXIgZnJvbSBBLygyKmIxKSAqLworCSAgaWYgKChkICYgMSkgIT0gMCkKKwkgICAgeworCSAgICAgIGlmIChyID49IHEpCisJCXIgPSByIC0gcTsKKwkgICAgICBlbHNlIGlmIChxIC0gciA8PSBkKQorCQl7CisJCSAgciA9IHIgLSBxICsgZDsKKwkJICBxLS07CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICByID0gciAtIHEgKyAyKmQ7CisJCSAgcSAtPSAyOworCQl9CisJICAgIH0KKwl9CisgICAgICBlbHNlIGlmIChjMSA8IGIxKSAJCS8qIFNvIDJeMzEgPD0gKEEvMikvYjEgPCAyXjMyICovCisJeworCSAgYzEgPSAoYjEgLSAxKSAtIGMxOworCSAgYzAgPSB+YzA7CQkJLyogbG9naWNhbCBOT1QgKi8KKworCSAgc2Rpdl9xcm5uZCAocSwgciwgYzEsIGMwLCBiMSk7IC8qIChBLzIpIC8gKGQvMikgKi8KKworCSAgcSA9IH5xOwkJCS8qIChBLzIpL2IxICovCisJICByID0gKGIxIC0gMSkgLSByOworCisJICByID0gMipyICsgKGEwICYgMSk7CQkvKiBBLygyKmIxKSAqLworCisJICBpZiAoKGQgJiAxKSAhPSAwKQorCSAgICB7CisJICAgICAgaWYgKHIgPj0gcSkKKwkJciA9IHIgLSBxOworCSAgICAgIGVsc2UgaWYgKHEgLSByIDw9IGQpCisJCXsKKwkJICByID0gciAtIHEgKyBkOworCQkgIHEtLTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIHIgPSByIC0gcSArIDIqZDsKKwkJICBxIC09IDI7CisJCX0KKwkgICAgfQorCX0KKyAgICAgIGVsc2UJCQkJLyogSW1wbGllcyBjMSA9IGIxICovCisJewkJCQkvKiBIZW5jZSBhMSA9IGQgLSAxID0gMipiMSAtIDEgKi8KKwkgIGlmIChhMCA+PSAtZCkKKwkgICAgeworCSAgICAgIHEgPSAtMTsKKwkgICAgICByID0gYTAgKyBkOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBxID0gLTI7CisJICAgICAgciA9IGEwICsgMipkOworCSAgICB9CisJfQorICAgIH0KKworICAqcnAgPSByOworICByZXR1cm4gcTsKK30KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvaHBwYS9SRUFETUUgYi9saWJnY3J5cHQtMS40LjYvbXBpL2hwcGEvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMmQ1ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL2hwcGEvUkVBRE1FCkBAIC0wLDAgKzEsODQgQEAKK1RoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIG1wbiBmdW5jdGlvbnMgZm9yIHZhcmlvdXMgSFAgUEEtUklTQyBjaGlwcy4gIENvZGUKK3RoYXQgcnVucyBmYXN0ZXIgb24gdGhlIFBBNzEwMCBhbmQgbGF0ZXIgaW1wbGVtZW50YXRpb25zLCBpcyBpbiB0aGUgcGE3MTAwCitkaXJlY3RvcnkuCisKK1JFTEVWQU5UIE9QVElNSVpBVElPTiBJU1NVRVMKKworICBMb2FkIGFuZCBTdG9yZSB0aW1pbmcKKworT24gdGhlIFBBNzAwMCBubyBtZW1vcnkgaW5zdHJ1Y3Rpb25zIGNhbiBpc3N1ZSB0aGUgdHdvIGN5Y2xlcyBhZnRlciBhIHN0b3JlLgorRm9yIHRoZSBQQTcxMDAsIHRoaXMgaXMgcmVkdWNlZCB0byBvbmUgY3ljbGUuCisKK1RoZSBQQTcxMDAgaGFzIGEgbG9va3VwLWZyZWUgY2FjaGUsIHNvIGl0IGhlbHBzIHRvIHNjaGVkdWxlIGxvYWRzIGFuZCB0aGUKK2RlcGVuZGVudCBpbnN0cnVjdGlvbiByZWFsbHkgZmFyIGZyb20gZWFjaCBvdGhlci4KKworU1RBVFVTCisKKzEuIG1wbl9tdWxfMSBjb3VsZCBiZSBpbXByb3ZlZCB0byA2LjUgY3ljbGVzL2xpbWIgb24gdGhlIFBBNzEwMCwgdXNpbmcgdGhlCisgICBpbnN0cnVjdGlvbnMgYndsb3cgKGJ1dCBzb21lIHN3IHBpcGVsaW5pbmcgaXMgbmVlZGVkIHRvIGF2b2lkIHRoZQorICAgeG1weXUtZnN0ZHMgZGVsYXkpOgorCisJZmxkZHMJczFfcHRyCisKKwl4bXB5dQorCWZzdGRzCU4oJXIzMCkKKwl4bXB5dQorCWZzdGRzCU4oJXIzMCkKKworCWxkd3MJTiglcjMwKQorCWxkd3MJTiglcjMwKQorCWxkd3MJTiglcjMwKQorCWxkd3MJTiglcjMwKQorCisJYWRkYworCXN0d3MJcmVzX3B0cgorCWFkZGMKKwlzdHdzCXJlc19wdHIKKworCWFkZGliCUxvb3AKKworMi4gbXBuX2FkZG11bF8xIGNvdWxkIGJlIGltcHJvdmVkIGZyb20gdGhlIGN1cnJlbnQgMTAgdG8gNy41IGN5Y2xlcy9saW1iCisgICAoYXN5bXB0b3RpY2FsbHkpIG9uIHRoZSBQQTcxMDAsIHVzaW5nIHRoZSBpbnN0cnVjdGlvbnMgYmVsb3cuICBXaXRoIHByb3BlcgorICAgc3cgcGlwZWxpbmluZyBhbmQgdGhlIHVucm9sbGluZyBsZXZlbCBiZWxvdywgdGhlIHNwZWVkIGJlY29tZXMgOAorICAgY3ljbGVzL2xpbWIuCisKKwlmbGRkcwlzMV9wdHIKKwlmbGRkcwlzMV9wdHIKKworCXhtcHl1CisJZnN0ZHMJTiglcjMwKQorCXhtcHl1CisJZnN0ZHMJTiglcjMwKQorCXhtcHl1CisJZnN0ZHMJTiglcjMwKQorCXhtcHl1CisJZnN0ZHMJTiglcjMwKQorCisJbGR3cwlOKCVyMzApCisJbGR3cwlOKCVyMzApCisJbGR3cwlOKCVyMzApCisJbGR3cwlOKCVyMzApCisJbGR3cwlOKCVyMzApCisJbGR3cwlOKCVyMzApCisJbGR3cwlOKCVyMzApCisJbGR3cwlOKCVyMzApCisJYWRkYworCWFkZGMKKwlhZGRjCisJYWRkYworCWFkZGMJJXIwLCVyMCxjeS1saW1iCisKKwlsZHdzCXJlc19wdHIKKwlsZHdzCXJlc19wdHIKKwlsZHdzCXJlc19wdHIKKwlsZHdzCXJlc19wdHIKKwlhZGQKKwlzdHdzCXJlc19wdHIKKwlhZGRjCisJc3R3cwlyZXNfcHRyCisJYWRkYworCXN0d3MJcmVzX3B0cgorCWFkZGMKKwlzdHdzCXJlc19wdHIKKworCWFkZGliCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL2hwcGEvZGlzdGZpbGVzIGIvbGliZ2NyeXB0LTEuNC42L21waS9ocHBhL2Rpc3RmaWxlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjI0MjA1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9ocHBhL2Rpc3RmaWxlcwpAQCAtMCwwICsxLDcgQEAKK1JFQURNRQordWRpdi1xcm5uZC5TCittcGloLWFkZDEuUworbXBpaC1zdWIxLlMKK21waWgtbHNoaWZ0LlMKK21waWgtcnNoaWZ0LlMKKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9ocHBhL21waWgtYWRkMS5TIGIvbGliZ2NyeXB0LTEuNC42L21waS9ocHBhL21waWgtYWRkMS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYzBlNWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL2hwcGEvbXBpaC1hZGQxLlMKQEAgLTAsMCArMSw3MCBAQAorLyogaHBwYSBhZGRfbiAtLSBBZGQgdHdvIGxpbWIgdmVjdG9ycyBvZiB0aGUgc2FtZSBsZW5ndGggPiAwIGFuZCBzdG9yZQorICoJCSBzdW0gaW4gYSB0aGlyZCBsaW1iIHZlY3Rvci4KKyAqCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NCwgMTk5OCwKKyAqICAgICAgICAgICAgICAgICAgICAyMDAxLCAyMDAyIEZlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICoKKyAqIE5vdGU6IFRoaXMgY29kZSBpcyBoZWF2aWx5IGJhc2VkIG9uIHRoZSBHTlUgTVAgTGlicmFyeS4KKyAqCSBBY3R1YWxseSBpdCdzIHRoZSBzYW1lIGNvZGUgd2l0aCBvbmx5IG1pbm9yIGNoYW5nZXMgaW4gdGhlCisgKgkgd2F5IHRoZSBkYXRhIGlzIHN0b3JlZDsgdGhpcyBpcyB0byBzdXBwb3J0IHRoZSBhYnN0cmFjdGlvbgorICoJIG9mIGFuIG9wdGlvbmFsIHNlY3VyZSBtZW1vcnkgYWxsb2NhdGlvbiB3aGljaCBtYXkgYmUgdXNlZAorICoJIHRvIGF2b2lkIHJldmVhbGluZyBvZiBzZW5zaXRpdmUgZGF0YSBkdWUgdG8gcGFnaW5nIGV0Yy4KKyAqLworCisKKworLyoqKioqKioqKioqKioqKioqKioKKyAqICBtcGlfbGltYl90CisgKiAgX2djcnlfbXBpaF9hZGRfbiggbXBpX3B0cl90IHJlc19wdHIsCShncjI2KQorICoJCSAgIG1waV9wdHJfdCBzMV9wdHIsCShncjI1KQorICoJCSAgIG1waV9wdHJfdCBzMl9wdHIsCShncjI0KQorICoJCSAgIG1waV9zaXplX3Qgc2l6ZSkJKGdyMjMpCisgKgorICogT25lIG1pZ2h0IHdhbnQgdG8gdW5yb2xsIHRoaXMgYXMgZm9yIG90aGVyIHByb2Nlc3NvcnMsIGJ1dCBpdCB0dXJucworICogb3V0IHRoYXQgdGhlIGRhdGEgY2FjaGUgY29udGVudGlvbiBhZnRlciBhIHN0b3JlIG1ha2VzIHN1Y2gKKyAqIHVucm9sbGluZyB1c2VsZXNzLiAgV2UgY2FuJ3QgY29tZSB1bmRlciA1IGN5Y2xlcy9saW1iIGFueXdheS4KKyAqLworCisJLmNvZGUKKwkuZXhwb3J0IAlfZ2NyeV9tcGloX2FkZF9uCisJLmxhYmVsCQlfZ2NyeV9tcGloX2FkZF9uCisJLnByb2MKKwkuY2FsbGluZm8JZnJhbWU9MCxub19jYWxscworCS5lbnRyeQorCisJbGR3cyxtYSAJNCgwLCVyMjUpLCVyMjAKKwlsZHdzLG1hIAk0KDAsJXIyNCksJXIxOQorCisJYWRkaWIsPSAJLTEsJXIyMyxMJGVuZAk7IGNoZWNrIGZvciAoU0laRSA9PSAxKQorCSBhZGQJCSVyMjAsJXIxOSwlcjI4CTsgYWRkIGZpcnN0IGxpbWJzIGlnbm9yaW5nIGN5CisKKwkubGFiZWwgTCRsb29wCisJbGR3cyxtYSAJNCgwLCVyMjUpLCVyMjAKKwlsZHdzLG1hIAk0KDAsJXIyNCksJXIxOQorCXN0d3MsbWEgCSVyMjgsNCgwLCVyMjYpCisJYWRkaWIsPD4JLTEsJXIyMyxMJGxvb3AKKwkgYWRkYwkJJXIyMCwlcjE5LCVyMjgKKworCS5sYWJlbCBMJGVuZAorCXN0d3MJCSVyMjgsMCgwLCVyMjYpCisJYnYJCTAoJXIyKQorCSBhZGRjCQklcjAsJXIwLCVyMjgKKworCS5leGl0CisJLnByb2NlbmQKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvaHBwYS9tcGloLWxzaGlmdC5TIGIvbGliZ2NyeXB0LTEuNC42L21waS9ocHBhL21waWgtbHNoaWZ0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFiMjliYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvaHBwYS9tcGloLWxzaGlmdC5TCkBAIC0wLDAgKzEsNzcgQEAKKy8qIGhwcGEgICBsc2hpZnQKKyAqCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NCwgMTk5OAorICogICAgICAgICAgICAgICAgICAgIDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICovCisKKworCisvKioqKioqKioqKioqKioqKioqKgorICogbXBpX2xpbWJfdAorICogX2djcnlfbXBpaF9sc2hpZnQoIG1waV9wdHJfdCB3cCwJKGdyMjYpCisgKgkJICAgbXBpX3B0cl90IHVwLAkoZ3IyNSkKKyAqCQkgICBtcGlfc2l6ZV90IHVzaXplLAkoZ3IyNCkKKyAqCQkgICB1bnNpZ25lZCBjbnQpCShncjIzKQorICovCisKKwkuY29kZQorCS5leHBvcnQgCV9nY3J5X21waWhfbHNoaWZ0CisJLmxhYmVsCQlfZ2NyeV9tcGloX2xzaGlmdAorCS5wcm9jCisJLmNhbGxpbmZvCWZyYW1lPTY0LG5vX2NhbGxzCisJLmVudHJ5CisKKwlzaDJhZGQJCSVyMjQsJXIyNSwlcjI1CisJc2gyYWRkCQklcjI0LCVyMjYsJXIyNgorCWxkd3MsbWIgCS00KDAsJXIyNSksJXIyMgorCXN1YmkJCTMyLCVyMjMsJXIxCisJbXRzYXIJCSVyMQorCWFkZGliLD0gCS0xLCVyMjQsTCQwMDA0CisJdnNoZAkJJXIwLCVyMjIsJXIyOAkJOyBjb21wdXRlIGNhcnJ5IG91dCBsaW1iCisJbGR3cyxtYiAJLTQoMCwlcjI1KSwlcjI5CisJYWRkaWIsPSAJLTEsJXIyNCxMJDAwMDIKKwl2c2hkCQklcjIyLCVyMjksJXIyMAorCisJLmxhYmVsCUwkbG9vcAorCWxkd3MsbWIgCS00KDAsJXIyNSksJXIyMgorCXN0d3MsbWIgCSVyMjAsLTQoMCwlcjI2KQorCWFkZGliLD0gCS0xLCVyMjQsTCQwMDAzCisJdnNoZAkJJXIyOSwlcjIyLCVyMjAKKwlsZHdzLG1iIAktNCgwLCVyMjUpLCVyMjkKKwlzdHdzLG1iIAklcjIwLC00KDAsJXIyNikKKwlhZGRpYiw8PgktMSwlcjI0LEwkbG9vcAorCXZzaGQJCSVyMjIsJXIyOSwlcjIwCisKKwkubGFiZWwJTCQwMDAyCisJc3R3cyxtYiAJJXIyMCwtNCgwLCVyMjYpCisJdnNoZAkJJXIyOSwlcjAsJXIyMAorCWJ2CQkwKCVyMikKKwlzdHcJCSVyMjAsLTQoMCwlcjI2KQorCS5sYWJlbAlMJDAwMDMKKwlzdHdzLG1iIAklcjIwLC00KDAsJXIyNikKKwkubGFiZWwJTCQwMDA0CisJdnNoZAkJJXIyMiwlcjAsJXIyMAorCWJ2CQkwKCVyMikKKwlzdHcJCSVyMjAsLTQoMCwlcjI2KQorCisJLmV4aXQKKwkucHJvY2VuZAorCisKKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9ocHBhL21waWgtcnNoaWZ0LlMgYi9saWJnY3J5cHQtMS40LjYvbXBpL2hwcGEvbXBpaC1yc2hpZnQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2E5ZDRlCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9ocHBhL21waWgtcnNoaWZ0LlMKQEAgLTAsMCArMSw3MyBAQAorLyogaHBwYSAgIHJzaGlmdAorICoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk0LCAxOTk4LAorICogICAgICAgICAgICAgICAgICAgIDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqCisgKiBtcGlfbGltYl90CisgKiBfZ2NyeV9tcGloX3JzaGlmdCggbXBpX3B0cl90IHdwLCAgICAgICAoZ3IyNikKKyAqCQkgICBtcGlfcHRyX3QgdXAsICAgICAgIChncjI1KQorICoJCSAgIG1waV9zaXplX3QgdXNpemUsICAgKGdyMjQpCisgKgkJICAgdW5zaWduZWQgY250KSAgICAgICAoZ3IyMykKKyAqLworCisJLmNvZGUKKwkuZXhwb3J0IAlfZ2NyeV9tcGloX3JzaGlmdAorCS5sYWJlbAkJX2djcnlfbXBpaF9yc2hpZnQKKwkucHJvYworCS5jYWxsaW5mbwlmcmFtZT02NCxub19jYWxscworCS5lbnRyeQorCisJbGR3cyxtYSAJNCgwLCVyMjUpLCVyMjIKKwltdHNhcgkJJXIyMworCWFkZGliLD0gCS0xLCVyMjQsTCRyMDA0CisJdnNoZAkJJXIyMiwlcjAsJXIyOAkJOyBjb21wdXRlIGNhcnJ5IG91dCBsaW1iCisJbGR3cyxtYSAJNCgwLCVyMjUpLCVyMjkKKwlhZGRpYiw9IAktMSwlcjI0LEwkcjAwMgorCXZzaGQJCSVyMjksJXIyMiwlcjIwCisKKwkubGFiZWwJTCRyb29wCisJbGR3cyxtYSAJNCgwLCVyMjUpLCVyMjIKKwlzdHdzLG1hIAklcjIwLDQoMCwlcjI2KQorCWFkZGliLD0gCS0xLCVyMjQsTCRyMDAzCisJdnNoZAkJJXIyMiwlcjI5LCVyMjAKKwlsZHdzLG1hIAk0KDAsJXIyNSksJXIyOQorCXN0d3MsbWEgCSVyMjAsNCgwLCVyMjYpCisJYWRkaWIsPD4JLTEsJXIyNCxMJHJvb3AKKwl2c2hkCQklcjI5LCVyMjIsJXIyMAorCisJLmxhYmVsCUwkcjAwMgorCXN0d3MsbWEgCSVyMjAsNCgwLCVyMjYpCisJdnNoZAkJJXIwLCVyMjksJXIyMAorCWJ2CQkwKCVyMikKKwlzdHcJCSVyMjAsMCgwLCVyMjYpCisJLmxhYmVsCUwkcjAwMworCXN0d3MsbWEgCSVyMjAsNCgwLCVyMjYpCisJLmxhYmVsCUwkcjAwNAorCXZzaGQJCSVyMCwlcjIyLCVyMjAKKwlidgkJMCglcjIpCisJc3R3CQklcjIwLDAoMCwlcjI2KQorCisJLmV4aXQKKwkucHJvY2VuZAorCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL2hwcGEvbXBpaC1zdWIxLlMgYi9saWJnY3J5cHQtMS40LjYvbXBpL2hwcGEvbXBpaC1zdWIxLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQxOTdlNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvaHBwYS9tcGloLXN1YjEuUwpAQCAtMCwwICsxLDc4IEBACisvKiBocHBhICAgc3ViX24gLS0gU3ViIHR3byBsaW1iIHZlY3RvcnMgb2YgdGhlIHNhbWUgbGVuZ3RoID4gMCBhbmQgc3RvcmUKKyAqCQkgICBzdW0gaW4gYSB0aGlyZCBsaW1iIHZlY3Rvci4KKyAqCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NCwgMTk5OCwgCisgKiAgICAgICAgICAgICAgICAgICAgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKgorICogTm90ZTogVGhpcyBjb2RlIGlzIGhlYXZpbHkgYmFzZWQgb24gdGhlIEdOVSBNUCBMaWJyYXJ5LgorICoJIEFjdHVhbGx5IGl0J3MgdGhlIHNhbWUgY29kZSB3aXRoIG9ubHkgbWlub3IgY2hhbmdlcyBpbiB0aGUKKyAqCSB3YXkgdGhlIGRhdGEgaXMgc3RvcmVkOyB0aGlzIGlzIHRvIHN1cHBvcnQgdGhlIGFic3RyYWN0aW9uCisgKgkgb2YgYW4gb3B0aW9uYWwgc2VjdXJlIG1lbW9yeSBhbGxvY2F0aW9uIHdoaWNoIG1heSBiZSB1c2VkCisgKgkgdG8gYXZvaWQgcmV2ZWFsaW5nIG9mIHNlbnNpdGl2ZSBkYXRhIGR1ZSB0byBwYWdpbmcgZXRjLgorICovCisKKworI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImFzbS1zeW50YXguaCIKKworCisvKioqKioqKioqKioqKioqKioqKgorICogIG1waV9saW1iX3QKKyAqICBfZ2NyeV9tcGloX3N1Yl9uKCBtcGlfcHRyX3QgcmVzX3B0ciwJKGdyMjYpCisgKgkJICAgbXBpX3B0cl90IHMxX3B0ciwJKGdyMjUpCisgKgkJICAgbXBpX3B0cl90IHMyX3B0ciwJKGdyMjQpCisgKgkJICAgbXBpX3NpemVfdCBzaXplKQkoZ3IyMykKKyAqCisgKiBPbmUgbWlnaHQgd2FudCB0byB1bnJvbGwgdGhpcyBhcyBmb3Igb3RoZXIgcHJvY2Vzc29ycywgYnV0IGl0IHR1cm5zCisgKiBvdXQgdGhhdCB0aGUgZGF0YSBjYWNoZSBjb250ZW50aW9uIGFmdGVyIGEgc3RvcmUgbWFrZXMgc3VjaAorICogdW5yb2xsaW5nIHVzZWxlc3MuICBXZSBjYW4ndCBjb21lIHVuZGVyIDUgY3ljbGVzL2xpbWIgYW55d2F5LgorICovCisKKworCS5jb2RlCisJLmV4cG9ydCAJX2djcnlfbXBpaF9zdWJfbgorCS5sYWJlbAkJX2djcnlfbXBpaF9zdWJfbgorCS5wcm9jCisJLmNhbGxpbmZvCWZyYW1lPTAsbm9fY2FsbHMKKwkuZW50cnkKKworCWxkd3MsbWEgCTQoMCwlcjI1KSwlcjIwCisJbGR3cyxtYSAJNCgwLCVyMjQpLCVyMTkKKworCWFkZGliLD0gCS0xLCVyMjMsTCRlbmQJOyBjaGVjayBmb3IgKFNJWkUgPT0gMSkKKwkgc3ViCQklcjIwLCVyMTksJXIyOAk7IHN1YnRyYWN0IGZpcnN0IGxpbWJzIGlnbm9yaW5nIGN5CisKKwkubGFiZWwJTCRsb29wCisJbGR3cyxtYSAJNCgwLCVyMjUpLCVyMjAKKwlsZHdzLG1hIAk0KDAsJXIyNCksJXIxOQorCXN0d3MsbWEgCSVyMjgsNCgwLCVyMjYpCisJYWRkaWIsPD4JLTEsJXIyMyxMJGxvb3AKKwkgc3ViYgkJJXIyMCwlcjE5LCVyMjgKKworCS5sYWJlbAlMJGVuZAorCXN0d3MJCSVyMjgsMCgwLCVyMjYpCisJYWRkYwkJJXIwLCVyMCwlcjI4CisJYnYJCTAoJXIyKQorCSBzdWJpCQkxLCVyMjgsJXIyOAorCisJLmV4aXQKKwkucHJvY2VuZAorCisKKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9ocHBhL3VkaXYtcXJubmQuUyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvaHBwYS91ZGl2LXFybm5kLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTllYmY3YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvaHBwYS91ZGl2LXFybm5kLlMKQEAgLTAsMCArMSwyOTcgQEAKKy8qIEhQLVBBICBfX3VkaXZfcXJubmQgZGl2aXNpb24gc3VwcG9ydCwgdXNlZCBmcm9tIGxvbmdsb25nLmguCisgKgkgIFRoaXMgdmVyc2lvbiBydW5zIGZhc3Qgb24gcHJlLVBBNzAwMCBDUFVzLgorICoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk4LCAyMDAxLAorICogICAgICAgICAgICAgICAgICAgICAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqCisgKiBOb3RlOiBUaGlzIGNvZGUgaXMgaGVhdmlseSBiYXNlZCBvbiB0aGUgR05VIE1QIExpYnJhcnkuCisgKgkgQWN0dWFsbHkgaXQncyB0aGUgc2FtZSBjb2RlIHdpdGggb25seSBtaW5vciBjaGFuZ2VzIGluIHRoZQorICoJIHdheSB0aGUgZGF0YSBpcyBzdG9yZWQ7IHRoaXMgaXMgdG8gc3VwcG9ydCB0aGUgYWJzdHJhY3Rpb24KKyAqCSBvZiBhbiBvcHRpb25hbCBzZWN1cmUgbWVtb3J5IGFsbG9jYXRpb24gd2hpY2ggbWF5IGJlIHVzZWQKKyAqCSB0byBhdm9pZCByZXZlYWxpbmcgb2Ygc2Vuc2l0aXZlIGRhdGEgZHVlIHRvIHBhZ2luZyBldGMuCisgKi8KKworCisKKy8qIElOUFVUIFBBUkFNRVRFUlMKKyAqICAgcmVtX3B0cgkgICBncjI2CisgKiAgIG4xIAkgICBncjI1CisgKiAgIG4wIAkgICBncjI0CisgKiAgIGQJCSAgIGdyMjMKKyAqCisgKiAgIFRoZSBjb2RlIHNpemUgaXMgYSBiaXQgZXhjZXNzaXZlLglXZSBjb3VsZCBtZXJnZSB0aGUgbGFzdCB0d28gZHM7YWRkYworICogICBzZXF1ZW5jZXMgYnkgc2ltcGx5IG1vdmluZyB0aGUgImJiLDwgT2RkIiBpbnN0cnVjdGlvbiBkb3duLiAgVGhlIG9ubHkKKyAqICAgdHJvdWJsZSBpcyB0aGUgRkZGRkZGRkYgY29kZSB0aGF0IHdvdWxkIG5lZWQgc29tZSBoYWNraW5nLgorICovCisKKwkuY29kZQorCS5leHBvcnQgCV9fdWRpdl9xcm5uZAorCS5sYWJlbAkJX191ZGl2X3Fybm5kCisJLnByb2MKKwkuY2FsbGluZm8JZnJhbWU9MCxub19jYWxscworCS5lbnRyeQorCisJY29tYiw8CQklcjIzLDAsTCRsYXJnZWRpdmlzb3IKKwkgc3ViCQklcjAsJXIyMywlcjEJCTsgY2xlYXIgY3kgYXMgc2lkZS1lZmZlY3QKKwlkcwkJJXIwLCVyMSwlcjAKKwlhZGRjCQklcjI0LCVyMjQsJXIyNAorCWRzCQklcjI1LCVyMjMsJXIyNQorCWFkZGMJCSVyMjQsJXIyNCwlcjI0CisJZHMJCSVyMjUsJXIyMywlcjI1CisJYWRkYwkJJXIyNCwlcjI0LCVyMjQKKwlkcwkJJXIyNSwlcjIzLCVyMjUKKwlhZGRjCQklcjI0LCVyMjQsJXIyNAorCWRzCQklcjI1LCVyMjMsJXIyNQorCWFkZGMJCSVyMjQsJXIyNCwlcjI0CisJZHMJCSVyMjUsJXIyMywlcjI1CisJYWRkYwkJJXIyNCwlcjI0LCVyMjQKKwlkcwkJJXIyNSwlcjIzLCVyMjUKKwlhZGRjCQklcjI0LCVyMjQsJXIyNAorCWRzCQklcjI1LCVyMjMsJXIyNQorCWFkZGMJCSVyMjQsJXIyNCwlcjI0CisJZHMJCSVyMjUsJXIyMywlcjI1CisJYWRkYwkJJXIyNCwlcjI0LCVyMjQKKwlkcwkJJXIyNSwlcjIzLCVyMjUKKwlhZGRjCQklcjI0LCVyMjQsJXIyNAorCWRzCQklcjI1LCVyMjMsJXIyNQorCWFkZGMJCSVyMjQsJXIyNCwlcjI0CisJZHMJCSVyMjUsJXIyMywlcjI1CisJYWRkYwkJJXIyNCwlcjI0LCVyMjQKKwlkcwkJJXIyNSwlcjIzLCVyMjUKKwlhZGRjCQklcjI0LCVyMjQsJXIyNAorCWRzCQklcjI1LCVyMjMsJXIyNQorCWFkZGMJCSVyMjQsJXIyNCwlcjI0CisJZHMJCSVyMjUsJXIyMywlcjI1CisJYWRkYwkJJXIyNCwlcjI0LCVyMjQKKwlkcwkJJXIyNSwlcjIzLCVyMjUKKwlhZGRjCQklcjI0LCVyMjQsJXIyNAorCWRzCQklcjI1LCVyMjMsJXIyNQorCWFkZGMJCSVyMjQsJXIyNCwlcjI0CisJZHMJCSVyMjUsJXIyMywlcjI1CisJYWRkYwkJJXIyNCwlcjI0LCVyMjQKKwlkcwkJJXIyNSwlcjIzLCVyMjUKKwlhZGRjCQklcjI0LCVyMjQsJXIyNAorCWRzCQklcjI1LCVyMjMsJXIyNQorCWFkZGMJCSVyMjQsJXIyNCwlcjI0CisJZHMJCSVyMjUsJXIyMywlcjI1CisJYWRkYwkJJXIyNCwlcjI0LCVyMjQKKwlkcwkJJXIyNSwlcjIzLCVyMjUKKwlhZGRjCQklcjI0LCVyMjQsJXIyNAorCWRzCQklcjI1LCVyMjMsJXIyNQorCWFkZGMJCSVyMjQsJXIyNCwlcjI0CisJZHMJCSVyMjUsJXIyMywlcjI1CisJYWRkYwkJJXIyNCwlcjI0LCVyMjQKKwlkcwkJJXIyNSwlcjIzLCVyMjUKKwlhZGRjCQklcjI0LCVyMjQsJXIyNAorCWRzCQklcjI1LCVyMjMsJXIyNQorCWFkZGMJCSVyMjQsJXIyNCwlcjI0CisJZHMJCSVyMjUsJXIyMywlcjI1CisJYWRkYwkJJXIyNCwlcjI0LCVyMjQKKwlkcwkJJXIyNSwlcjIzLCVyMjUKKwlhZGRjCQklcjI0LCVyMjQsJXIyNAorCWRzCQklcjI1LCVyMjMsJXIyNQorCWFkZGMJCSVyMjQsJXIyNCwlcjI0CisJZHMJCSVyMjUsJXIyMywlcjI1CisJYWRkYwkJJXIyNCwlcjI0LCVyMjQKKwlkcwkJJXIyNSwlcjIzLCVyMjUKKwlhZGRjCQklcjI0LCVyMjQsJXIyNAorCWRzCQklcjI1LCVyMjMsJXIyNQorCWFkZGMJCSVyMjQsJXIyNCwlcjI4CisJZHMJCSVyMjUsJXIyMywlcjI1CisJY29tY2xyLD49CSVyMjUsJXIwLCVyMAorCWFkZGwJCSVyMjUsJXIyMywlcjI1CisJc3R3cwkJJXIyNSwwKDAsJXIyNikKKwlidgkJMCglcjIpCisJIGFkZGMJCSVyMjgsJXIyOCwlcjI4CisKKwkubGFiZWwJTCRsYXJnZWRpdmlzb3IKKwlleHRydQkJJXIyNCwzMSwxLCVyMTkJCTsgcjE5ID0gbjAgJiAxCisJYmIsPAkJJXIyMywzMSxMJG9kZAorCSBleHRydQkJJXIyMywzMCwzMSwlcjIyIAk7IHIyMiA9IGQgPj4gMQorCXNoZAkJJXIyNSwlcjI0LDEsJXIyNAk7IHIyNCA9IG5ldyBuMAorCWV4dHJ1CQklcjI1LDMwLDMxLCVyMjUgCTsgcjI1ID0gbmV3IG4xCisJc3ViCQklcjAsJXIyMiwlcjIxCisJZHMJCSVyMCwlcjIxLCVyMAorCWFkZGMJCSVyMjQsJXIyNCwlcjI0CisJZHMJCSVyMjUsJXIyMiwlcjI1CisJYWRkYwkJJXIyNCwlcjI0LCVyMjQKKwlkcwkJJXIyNSwlcjIyLCVyMjUKKwlhZGRjCQklcjI0LCVyMjQsJXIyNAorCWRzCQklcjI1LCVyMjIsJXIyNQorCWFkZGMJCSVyMjQsJXIyNCwlcjI0CisJZHMJCSVyMjUsJXIyMiwlcjI1CisJYWRkYwkJJXIyNCwlcjI0LCVyMjQKKwlkcwkJJXIyNSwlcjIyLCVyMjUKKwlhZGRjCQklcjI0LCVyMjQsJXIyNAorCWRzCQklcjI1LCVyMjIsJXIyNQorCWFkZGMJCSVyMjQsJXIyNCwlcjI0CisJZHMJCSVyMjUsJXIyMiwlcjI1CisJYWRkYwkJJXIyNCwlcjI0LCVyMjQKKwlkcwkJJXIyNSwlcjIyLCVyMjUKKwlhZGRjCQklcjI0LCVyMjQsJXIyNAorCWRzCQklcjI1LCVyMjIsJXIyNQorCWFkZGMJCSVyMjQsJXIyNCwlcjI0CisJZHMJCSVyMjUsJXIyMiwlcjI1CisJYWRkYwkJJXIyNCwlcjI0LCVyMjQKKwlkcwkJJXIyNSwlcjIyLCVyMjUKKwlhZGRjCQklcjI0LCVyMjQsJXIyNAorCWRzCQklcjI1LCVyMjIsJXIyNQorCWFkZGMJCSVyMjQsJXIyNCwlcjI0CisJZHMJCSVyMjUsJXIyMiwlcjI1CisJYWRkYwkJJXIyNCwlcjI0LCVyMjQKKwlkcwkJJXIyNSwlcjIyLCVyMjUKKwlhZGRjCQklcjI0LCVyMjQsJXIyNAorCWRzCQklcjI1LCVyMjIsJXIyNQorCWFkZGMJCSVyMjQsJXIyNCwlcjI0CisJZHMJCSVyMjUsJXIyMiwlcjI1CisJYWRkYwkJJXIyNCwlcjI0LCVyMjQKKwlkcwkJJXIyNSwlcjIyLCVyMjUKKwlhZGRjCQklcjI0LCVyMjQsJXIyNAorCWRzCQklcjI1LCVyMjIsJXIyNQorCWFkZGMJCSVyMjQsJXIyNCwlcjI0CisJZHMJCSVyMjUsJXIyMiwlcjI1CisJYWRkYwkJJXIyNCwlcjI0LCVyMjQKKwlkcwkJJXIyNSwlcjIyLCVyMjUKKwlhZGRjCQklcjI0LCVyMjQsJXIyNAorCWRzCQklcjI1LCVyMjIsJXIyNQorCWFkZGMJCSVyMjQsJXIyNCwlcjI0CisJZHMJCSVyMjUsJXIyMiwlcjI1CisJYWRkYwkJJXIyNCwlcjI0LCVyMjQKKwlkcwkJJXIyNSwlcjIyLCVyMjUKKwlhZGRjCQklcjI0LCVyMjQsJXIyNAorCWRzCQklcjI1LCVyMjIsJXIyNQorCWFkZGMJCSVyMjQsJXIyNCwlcjI0CisJZHMJCSVyMjUsJXIyMiwlcjI1CisJYWRkYwkJJXIyNCwlcjI0LCVyMjQKKwlkcwkJJXIyNSwlcjIyLCVyMjUKKwlhZGRjCQklcjI0LCVyMjQsJXIyNAorCWRzCQklcjI1LCVyMjIsJXIyNQorCWFkZGMJCSVyMjQsJXIyNCwlcjI0CisJZHMJCSVyMjUsJXIyMiwlcjI1CisJYWRkYwkJJXIyNCwlcjI0LCVyMjQKKwlkcwkJJXIyNSwlcjIyLCVyMjUKKwlhZGRjCQklcjI0LCVyMjQsJXIyNAorCWRzCQklcjI1LCVyMjIsJXIyNQorCWFkZGMJCSVyMjQsJXIyNCwlcjI0CisJZHMJCSVyMjUsJXIyMiwlcjI1CisJYWRkYwkJJXIyNCwlcjI0LCVyMjQKKwlkcwkJJXIyNSwlcjIyLCVyMjUKKwljb21jbHIsPj0JJXIyNSwlcjAsJXIwCisJYWRkbAkJJXIyNSwlcjIyLCVyMjUKKwlzaDFhZGRsIAklcjI1LCVyMTksJXIyNQorCXN0d3MJCSVyMjUsMCgwLCVyMjYpCisJYnYJCTAoJXIyKQorCSBhZGRjCQklcjI0LCVyMjQsJXIyOAorCisJLmxhYmVsCUwkb2RkCisJYWRkaWIsc3YsbgkxLCVyMjIsTCRGRi4uCQk7IHIyMiA9IChkIC8gMiArIDEpCisJc2hkCQklcjI1LCVyMjQsMSwlcjI0CTsgcjI0ID0gbmV3IG4wCisJZXh0cnUJCSVyMjUsMzAsMzEsJXIyNSAJOyByMjUgPSBuZXcgbjEKKwlzdWIJCSVyMCwlcjIyLCVyMjEKKwlkcwkJJXIwLCVyMjEsJXIwCisJYWRkYwkJJXIyNCwlcjI0LCVyMjQKKwlkcwkJJXIyNSwlcjIyLCVyMjUKKwlhZGRjCQklcjI0LCVyMjQsJXIyNAorCWRzCQklcjI1LCVyMjIsJXIyNQorCWFkZGMJCSVyMjQsJXIyNCwlcjI0CisJZHMJCSVyMjUsJXIyMiwlcjI1CisJYWRkYwkJJXIyNCwlcjI0LCVyMjQKKwlkcwkJJXIyNSwlcjIyLCVyMjUKKwlhZGRjCQklcjI0LCVyMjQsJXIyNAorCWRzCQklcjI1LCVyMjIsJXIyNQorCWFkZGMJCSVyMjQsJXIyNCwlcjI0CisJZHMJCSVyMjUsJXIyMiwlcjI1CisJYWRkYwkJJXIyNCwlcjI0LCVyMjQKKwlkcwkJJXIyNSwlcjIyLCVyMjUKKwlhZGRjCQklcjI0LCVyMjQsJXIyNAorCWRzCQklcjI1LCVyMjIsJXIyNQorCWFkZGMJCSVyMjQsJXIyNCwlcjI0CisJZHMJCSVyMjUsJXIyMiwlcjI1CisJYWRkYwkJJXIyNCwlcjI0LCVyMjQKKwlkcwkJJXIyNSwlcjIyLCVyMjUKKwlhZGRjCQklcjI0LCVyMjQsJXIyNAorCWRzCQklcjI1LCVyMjIsJXIyNQorCWFkZGMJCSVyMjQsJXIyNCwlcjI0CisJZHMJCSVyMjUsJXIyMiwlcjI1CisJYWRkYwkJJXIyNCwlcjI0LCVyMjQKKwlkcwkJJXIyNSwlcjIyLCVyMjUKKwlhZGRjCQklcjI0LCVyMjQsJXIyNAorCWRzCQklcjI1LCVyMjIsJXIyNQorCWFkZGMJCSVyMjQsJXIyNCwlcjI0CisJZHMJCSVyMjUsJXIyMiwlcjI1CisJYWRkYwkJJXIyNCwlcjI0LCVyMjQKKwlkcwkJJXIyNSwlcjIyLCVyMjUKKwlhZGRjCQklcjI0LCVyMjQsJXIyNAorCWRzCQklcjI1LCVyMjIsJXIyNQorCWFkZGMJCSVyMjQsJXIyNCwlcjI0CisJZHMJCSVyMjUsJXIyMiwlcjI1CisJYWRkYwkJJXIyNCwlcjI0LCVyMjQKKwlkcwkJJXIyNSwlcjIyLCVyMjUKKwlhZGRjCQklcjI0LCVyMjQsJXIyNAorCWRzCQklcjI1LCVyMjIsJXIyNQorCWFkZGMJCSVyMjQsJXIyNCwlcjI0CisJZHMJCSVyMjUsJXIyMiwlcjI1CisJYWRkYwkJJXIyNCwlcjI0LCVyMjQKKwlkcwkJJXIyNSwlcjIyLCVyMjUKKwlhZGRjCQklcjI0LCVyMjQsJXIyNAorCWRzCQklcjI1LCVyMjIsJXIyNQorCWFkZGMJCSVyMjQsJXIyNCwlcjI0CisJZHMJCSVyMjUsJXIyMiwlcjI1CisJYWRkYwkJJXIyNCwlcjI0LCVyMjQKKwlkcwkJJXIyNSwlcjIyLCVyMjUKKwlhZGRjCQklcjI0LCVyMjQsJXIyNAorCWRzCQklcjI1LCVyMjIsJXIyNQorCWFkZGMJCSVyMjQsJXIyNCwlcjI0CisJZHMJCSVyMjUsJXIyMiwlcjI1CisJYWRkYwkJJXIyNCwlcjI0LCVyMjQKKwlkcwkJJXIyNSwlcjIyLCVyMjUKKwlhZGRjCQklcjI0LCVyMjQsJXIyNAorCWRzCQklcjI1LCVyMjIsJXIyNQorCWFkZGMJCSVyMjQsJXIyNCwlcjI0CisJZHMJCSVyMjUsJXIyMiwlcjI1CisJYWRkYwkJJXIyNCwlcjI0LCVyMjQKKwlkcwkJJXIyNSwlcjIyLCVyMjUKKwlhZGRjCQklcjI0LCVyMjQsJXIyNAorCWRzCQklcjI1LCVyMjIsJXIyNQorCWFkZGMJCSVyMjQsJXIyNCwlcjI4CisJY29tY2xyLD49CSVyMjUsJXIwLCVyMAorCWFkZGwJCSVyMjUsJXIyMiwlcjI1CisJc2gxYWRkbCAJJXIyNSwlcjE5LCVyMjUKKzsgV2UgaGF2ZSBjb21wdXRlZCAobjEsLG4wKSAvIChkICsgMSksIHEnID0gcjI4LCByJyA9IHIyNQorCWFkZCxudXYgCSVyMjgsJXIyNSwlcjI1CisJYWRkbAkJJXIyNSwlcjEsJXIyNQorCWFkZGMJCSVyMCwlcjI4LCVyMjgKKwlzdWIsPDwJCSVyMjUsJXIyMywlcjAKKwlhZGRsCQklcjI1LCVyMSwlcjI1CisJc3R3cwkJJXIyNSwwKDAsJXIyNikKKwlidgkJMCglcjIpCisJIGFkZGMJCSVyMCwlcjI4LCVyMjgKKworOyBUaGlzIGlzIGp1c3QgYSBzcGVjaWFsIGNhc2Ugb2YgdGhlIGNvZGUgYWJvdmUuCis7IFdlIGNvbWUgaGVyZSB3aGVuIGQgPT0gMHhGRkZGRkZGRgorCS5sYWJlbAlMJEZGLi4KKwlhZGQsdXYJCSVyMjUsJXIyNCwlcjI0CisJc3ViLDw8CQklcjI0LCVyMjMsJXIwCisJbGRvCQkxKCVyMjQpLCVyMjQKKwlzdHdzCQklcjI0LDAoMCwlcjI2KQorCWJ2CQkwKCVyMikKKwkgYWRkYwkJJXIwLCVyMjUsJXIyOAorCisJLmV4aXQKKwkucHJvY2VuZApkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9ocHBhMS4xL2Rpc3RmaWxlcyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvaHBwYTEuMS9kaXN0ZmlsZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY4MjI3YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvaHBwYTEuMS9kaXN0ZmlsZXMKQEAgLTAsMCArMSw1IEBACit1ZGl2LXFybm5kLlMKK21waWgtbXVsMS5TCittcGloLW11bDIuUworbXBpaC1tdWwzLlMKKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9ocHBhMS4xL21waWgtbXVsMS5TIGIvbGliZ2NyeXB0LTEuNC42L21waS9ocHBhMS4xL21waWgtbXVsMS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1OTI2ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL2hwcGExLjEvbXBpaC1tdWwxLlMKQEAgLTAsMCArMSwxMTUgQEAKKy8qIGhwcGExLjEgIG11bF8xIC0tIE11bHRpcGx5IGEgbGltYiB2ZWN0b3Igd2l0aCBhIGxpbWIgYW5kIHN0b3JlCisgKgkJICAgICB0aGUgcmVzdWx0IGluIGEgc2Vjb25kIGxpbWIgdmVjdG9yLgorICoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk4LCAKKyAqICAgICAgICAgICAgICAgICAgICAyMDAxLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqCisgKiBOb3RlOiBUaGlzIGNvZGUgaXMgaGVhdmlseSBiYXNlZCBvbiB0aGUgR05VIE1QIExpYnJhcnkuCisgKgkgQWN0dWFsbHkgaXQncyB0aGUgc2FtZSBjb2RlIHdpdGggb25seSBtaW5vciBjaGFuZ2VzIGluIHRoZQorICoJIHdheSB0aGUgZGF0YSBpcyBzdG9yZWQ7IHRoaXMgaXMgdG8gc3VwcG9ydCB0aGUgYWJzdHJhY3Rpb24KKyAqCSBvZiBhbiBvcHRpb25hbCBzZWN1cmUgbWVtb3J5IGFsbG9jYXRpb24gd2hpY2ggbWF5IGJlIHVzZWQKKyAqCSB0byBhdm9pZCByZXZlYWxpbmcgb2Ygc2Vuc2l0aXZlIGRhdGEgZHVlIHRvIHBhZ2luZyBldGMuCisgKi8KKworCisvKioqKioqKioqKioqKioqKioqKgorICogbXBpX2xpbWJfdAorICogX2djcnlfbXBpaF9tdWxfMSggbXBpX3B0cl90IHJlc19wdHIsCShyMjYpCisgKgkJICBtcGlfcHRyX3QgczFfcHRyLAkocjI1KQorICoJCSAgbXBpX3NpemVfdCBzMV9zaXplLAkocjI0KQorICoJCSAgbXBpX2xpbWJfdCBzMl9saW1iKQkocjIzKQorICoKKyAqCisgKgorICogVGhpcyBydW5zIGF0IDkgY3ljbGVzL2xpbWIgb24gYSBQQTcwMDAuICBXaXRoIHRoZSB1c2VkIGluc3RydWN0aW9ucywgaXQgY2FuCisgKiBub3QgYmVjb21lIGZhc3RlciBkdWUgdG8gZGF0YSBjYWNoZSBjb250ZW50aW9uIGFmdGVyIGEgc3RvcmUuICBPbiB0aGUKKyAqIFBBNzEwMCBpdCBydW5zIGF0IDcgY3ljbGVzL2xpbWIsIGFuZCB0aGF0IGNhbiBub3QgYmUgaW1wcm92ZWQgZWl0aGVyLCBzaW5jZQorICogb25seSB0aGUgeG1weXUgZG9lcyBub3QgbmVlZCB0aGUgaW50ZWdlciBwaXBlbGluZSwgc28gdGhlIG9ubHkgZHVhbC1pc3N1ZQorICogd2Ugd2lsbCBnZXQgYXJlIGFkZGMreG1weXUuCVVucm9sbGluZyB3b3VsZCBub3QgaGVscCBlaXRoZXIgQ1BVLgorICoKKyAqIFdlIGNvdWxkIHVzZSBmbGRkcyB0byByZWFkIHR3byBsaW1icyBhdCBhIHRpbWUgZnJvbSB0aGUgUzEgYXJyYXksIGFuZCB0aGF0CisgKiBjb3VsZCBicmluZyBkb3duIHRoZSB0aW1lcyB0byA4LjUgYW5kIDYuNSBjeWNsZXMvbGltYiBmb3IgdGhlIFBBNzAwMCBhbmQKKyAqIFBBNzEwMCwgcmVzcGVjdGl2ZWx5LiAgV2UgZG9uJ3QgZG8gdGhhdCBzaW5jZSBpdCBkb2VzIG5vdCBzZWVtIHdvcnRoIHRoZQorICogKGFsaWdubWVudCkgdHJvdWJsZXMuLi4KKyAqCisgKiBBdCBsZWFzdCB0aGUgUEE3MTAwIGlzIHJ1bW9yZWQgdG8gYmUgYWJsZSB0byBkZWFsIHdpdGggY2FjaGUtbWlzc2VzCisgKiB3aXRob3V0IHN0YWxsaW5nIGluc3RydWN0aW9uIGlzc3VlLglJZiB0aGlzIGlzIHRydWUsIGFuZCB0aGUgY2FjaGUgaXMKKyAqIGFjdHVhbGx5IGFsc28gbG9ja3VwLWZyZWUsIHdlIHNob3VsZCB1c2UgYSBkZWVwZXIgc29mdHdhcmUgcGlwZWxpbmUsIGFuZAorICogbG9hZCBmcm9tIFMxIHZlcnkgZWFybHkhICAoVGhlIGxvYWRzIGFuZCBzdG9yZXMgdG8gLTEyKHNwKSB3aWxsIHN1cmVseSBiZQorICogaW4gdGhlIGNhY2hlLikKKyAqLworCisJLmxldmVsCQkxLjEKKworCS5jb2RlCisJLmV4cG9ydCAJX2djcnlfbXBpaF9tdWxfMQorCS5sYWJlbAkJX2djcnlfbXBpaF9tdWxfMQorCS5wcm9jCisJLmNhbGxpbmZvCWZyYW1lPTY0LG5vX2NhbGxzCisJLmVudHJ5CisKKwlsZG8JCTY0KCVyMzApLCVyMzAKKwlmbGR3cyxtYQk0KCVyMjUpLCVmcjUKKwlzdHcJCSVyMjMsLTE2KCVyMzApCQk7IG1vdmUgczJfbGltYiAuLi4KKwlhZGRpYiw9IAktMSwlcjI0LEwkanVzdF9vbmVfbGltYgorCSBmbGR3cwkJLTE2KCVyMzApLCVmcjQJCTsgLi4uIGludG8gZnI0CisJYWRkCQklcjAsJXIwLCVyMAkJOyBjbGVhciBjYXJyeQorCXhtcHl1CQklZnI0LCVmcjUsJWZyNgorCWZsZHdzLG1hCTQoJXIyNSksJWZyNworCWZzdGRzCQklZnI2LC0xNiglcjMwKQorCXhtcHl1CQklZnI0LCVmcjcsJWZyOAorCWxkdwkJLTEyKCVyMzApLCVyMTkJCTsgbGVhc3Qgc2lnbmlmaWNhbnQgbGltYiBpbiBwcm9kdWN0CisJbGR3CQktMTYoJXIzMCksJXIyOAorCisJZnN0ZHMJCSVmcjgsLTE2KCVyMzApCisJYWRkaWIsPSAJLTEsJXIyNCxMJGVuZAorCSBsZHcJCS0xMiglcjMwKSwlcjEKKworOyBNYWluIGxvb3AKKwkubGFiZWwJTCRsb29wCisJZmxkd3MsbWEJNCglcjI1KSwlZnI1CisJc3R3cyxtYSAJJXIxOSw0KCVyMjYpCisJYWRkYwkJJXIyOCwlcjEsJXIxOQorCXhtcHl1CQklZnI0LCVmcjUsJWZyNgorCWxkdwkJLTE2KCVyMzApLCVyMjgKKwlmc3RkcwkJJWZyNiwtMTYoJXIzMCkKKwlhZGRpYiw8PgktMSwlcjI0LEwkbG9vcAorCSBsZHcJCS0xMiglcjMwKSwlcjEKKworCS5sYWJlbAlMJGVuZAorCXN0d3MsbWEgCSVyMTksNCglcjI2KQorCWFkZGMJCSVyMjgsJXIxLCVyMTkKKwlsZHcJCS0xNiglcjMwKSwlcjI4CisJc3R3cyxtYSAJJXIxOSw0KCVyMjYpCisJYWRkYwkJJXIwLCVyMjgsJXIyOAorCWJ2CQkwKCVyMikKKwkgbGRvCQktNjQoJXIzMCksJXIzMAorCisJLmxhYmVsCUwkanVzdF9vbmVfbGltYgorCXhtcHl1CQklZnI0LCVmcjUsJWZyNgorCWZzdGRzCQklZnI2LC0xNiglcjMwKQorCWxkdwkJLTE2KCVyMzApLCVyMjgKKwlsZG8JCS02NCglcjMwKSwlcjMwCisJYnYJCTAoJXIyKQorCSBmc3R3cwkJJWZyNlIsMCglcjI2KQorCisJLmV4aXQKKwkucHJvY2VuZAorCisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvaHBwYTEuMS9tcGloLW11bDIuUyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvaHBwYTEuMS9tcGloLW11bDIuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDQ3YWI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9ocHBhMS4xL21waWgtbXVsMi5TCkBAIC0wLDAgKzEsMTE3IEBACisvKiBocHBhMS4xICAgYWRkbXVsXzEgLS0gTXVsdGlwbHkgYSBsaW1iIHZlY3RvciB3aXRoIGEgbGltYiBhbmQgYWRkCisgKgkJCSB0aGUgcmVzdWx0IHRvIGEgc2Vjb25kIGxpbWIgdmVjdG9yLgorICoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk4LAorICogICAgICAgICAgICAgICAgICAgIDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICoKKyAqIE5vdGU6IFRoaXMgY29kZSBpcyBoZWF2aWx5IGJhc2VkIG9uIHRoZSBHTlUgTVAgTGlicmFyeS4KKyAqCSBBY3R1YWxseSBpdCdzIHRoZSBzYW1lIGNvZGUgd2l0aCBvbmx5IG1pbm9yIGNoYW5nZXMgaW4gdGhlCisgKgkgd2F5IHRoZSBkYXRhIGlzIHN0b3JlZDsgdGhpcyBpcyB0byBzdXBwb3J0IHRoZSBhYnN0cmFjdGlvbgorICoJIG9mIGFuIG9wdGlvbmFsIHNlY3VyZSBtZW1vcnkgYWxsb2NhdGlvbiB3aGljaCBtYXkgYmUgdXNlZAorICoJIHRvIGF2b2lkIHJldmVhbGluZyBvZiBzZW5zaXRpdmUgZGF0YSBkdWUgdG8gcGFnaW5nIGV0Yy4KKyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqCisgKiBtcGlfbGltYl90CisgKiBfZ2NyeV9tcGloX2FkZG11bF8xKCBtcGlfcHRyX3QgcmVzX3B0ciwgICAgICAocjI2KQorICoJCSAgICAgbXBpX3B0cl90IHMxX3B0ciwJICAgICAocjI1KQorICoJCSAgICAgbXBpX3NpemVfdCBzMV9zaXplLCAgICAgKHIyNCkKKyAqCQkgICAgIG1waV9saW1iX3QgczJfbGltYikgICAgIChyMjMpCisgKgorICogVGhpcyBydW5zIGF0IDExIGN5Y2xlcy9saW1iIG9uIGEgUEE3MDAwLiAgV2l0aCB0aGUgdXNlZCBpbnN0cnVjdGlvbnMsIGl0CisgKiBjYW4gbm90IGJlY29tZSBmYXN0ZXIgZHVlIHRvIGRhdGEgY2FjaGUgY29udGVudGlvbiBhZnRlciBhIHN0b3JlLiAgT24gdGhlCisgKiBQQTcxMDAgaXQgcnVucyBhdCAxMCBjeWNsZXMvbGltYiwgYW5kIHRoYXQgY2FuIG5vdCBiZSBpbXByb3ZlZCBlaXRoZXIsCisgKiBzaW5jZSBvbmx5IHRoZSB4bXB5dSBkb2VzIG5vdCBuZWVkIHRoZSBpbnRlZ2VyIHBpcGVsaW5lLCBzbyB0aGUgb25seQorICogZHVhbC1pc3N1ZSB3ZSB3aWxsIGdldCBhcmUgYWRkYyt4bXB5dS4gIFVucm9sbGluZyBjb3VsZCBnYWluIGEgY3ljbGUvbGltYgorICogb24gdGhlIFBBNzEwMC4KKyAqCisgKiBUaGVyZSBhcmUgc29tZSBpZGVhcyBkZXNjcmliZWQgaW4gbXVsMS5TIHRoYXQgYXBwbGllcyB0byB0aGlzIGNvZGUgdG9vLgorICovCisKKwkubGV2ZWwJCTEuMQorCisJLmNvZGUKKwkuZXhwb3J0IAlfZ2NyeV9tcGloX2FkZG11bF8xCisJLmxhYmVsCQlfZ2NyeV9tcGloX2FkZG11bF8xCisJLnByb2MKKwkuY2FsbGluZm8JZnJhbWU9NjQsbm9fY2FsbHMKKwkuZW50cnkKKworCWxkbwkJNjQoJXIzMCksJXIzMAorCWZsZHdzLG1hCTQoJXIyNSksJWZyNQorCXN0dwkJJXIyMywtMTYoJXIzMCkJCTsgbW92ZSBzMl9saW1iIC4uLgorCWFkZGliLD0gCS0xLCVyMjQsTCRqdXN0X29uZV9saW1iCisJIGZsZHdzCQktMTYoJXIzMCksJWZyNAkJOyAuLi4gaW50byBmcjQKKwlhZGQJCSVyMCwlcjAsJXIwCQk7IGNsZWFyIGNhcnJ5CisJeG1weXUJCSVmcjQsJWZyNSwlZnI2CisJZmxkd3MsbWEJNCglcjI1KSwlZnI3CisJZnN0ZHMJCSVmcjYsLTE2KCVyMzApCisJeG1weXUJCSVmcjQsJWZyNywlZnI4CisJbGR3CQktMTIoJXIzMCksJXIxOQkJOyBsZWFzdCBzaWduaWZpY2FudCBsaW1iIGluIHByb2R1Y3QKKwlsZHcJCS0xNiglcjMwKSwlcjI4CisKKwlmc3RkcwkJJWZyOCwtMTYoJXIzMCkKKwlhZGRpYiw9IAktMSwlcjI0LEwkZW5kCisJIGxkdwkJLTEyKCVyMzApLCVyMQorCis7IE1haW4gbG9vcAorCS5sYWJlbAlMJGxvb3AKKwlsZHdzCQkwKCVyMjYpLCVyMjkKKwlmbGR3cyxtYQk0KCVyMjUpLCVmcjUKKwlhZGQJCSVyMjksJXIxOSwlcjE5CisJc3R3cyxtYSAJJXIxOSw0KCVyMjYpCisJYWRkYwkJJXIyOCwlcjEsJXIxOQorCXhtcHl1CQklZnI0LCVmcjUsJWZyNgorCWxkdwkJLTE2KCVyMzApLCVyMjgKKwlmc3RkcwkJJWZyNiwtMTYoJXIzMCkKKwlhZGRjCQklcjAsJXIyOCwlcjI4CisJYWRkaWIsPD4JLTEsJXIyNCxMJGxvb3AKKwkgbGR3CQktMTIoJXIzMCksJXIxCisKKwkubGFiZWwJTCRlbmQKKwlsZHcJCTAoJXIyNiksJXIyOQorCWFkZAkJJXIyOSwlcjE5LCVyMTkKKwlzdHdzLG1hIAklcjE5LDQoJXIyNikKKwlhZGRjCQklcjI4LCVyMSwlcjE5CisJbGR3CQktMTYoJXIzMCksJXIyOAorCWxkd3MJCTAoJXIyNiksJXIyOQorCWFkZGMJCSVyMCwlcjI4LCVyMjgKKwlhZGQJCSVyMjksJXIxOSwlcjE5CisJc3R3cyxtYSAJJXIxOSw0KCVyMjYpCisJYWRkYwkJJXIwLCVyMjgsJXIyOAorCWJ2CQkwKCVyMikKKwkgbGRvCQktNjQoJXIzMCksJXIzMAorCisJLmxhYmVsIEwkanVzdF9vbmVfbGltYgorCXhtcHl1CQklZnI0LCVmcjUsJWZyNgorCWxkdwkJMCglcjI2KSwlcjI5CisJZnN0ZHMJCSVmcjYsLTE2KCVyMzApCisJbGR3CQktMTIoJXIzMCksJXIxCisJbGR3CQktMTYoJXIzMCksJXIyOAorCWFkZAkJJXIyOSwlcjEsJXIxOQorCXN0dwkJJXIxOSwwKCVyMjYpCisJYWRkYwkJJXIwLCVyMjgsJXIyOAorCWJ2CQkwKCVyMikKKwkgbGRvCQktNjQoJXIzMCksJXIzMAorCisJLmV4aXQKKwkucHJvY2VuZAorCisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvaHBwYTEuMS9tcGloLW11bDMuUyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvaHBwYTEuMS9tcGloLW11bDMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzJhZGYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9ocHBhMS4xL21waWgtbXVsMy5TCkBAIC0wLDAgKzEsMTI2IEBACisvKiBocHBhMS4xICAgc3VibXVsXzEgLS0gTXVsdGlwbHkgYSBsaW1iIHZlY3RvciB3aXRoIGEgbGltYiBhbmQgYWRkCisgKgkJCSB0aGUgcmVzdWx0IHRvIGEgc2Vjb25kIGxpbWIgdmVjdG9yLgorICoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk4LCAKKyAqICAgICAgICAgICAgICAgICAgICAyMDAxLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqCisgKiBOb3RlOiBUaGlzIGNvZGUgaXMgaGVhdmlseSBiYXNlZCBvbiB0aGUgR05VIE1QIExpYnJhcnkuCisgKgkgQWN0dWFsbHkgaXQncyB0aGUgc2FtZSBjb2RlIHdpdGggb25seSBtaW5vciBjaGFuZ2VzIGluIHRoZQorICoJIHdheSB0aGUgZGF0YSBpcyBzdG9yZWQ7IHRoaXMgaXMgdG8gc3VwcG9ydCB0aGUgYWJzdHJhY3Rpb24KKyAqCSBvZiBhbiBvcHRpb25hbCBzZWN1cmUgbWVtb3J5IGFsbG9jYXRpb24gd2hpY2ggbWF5IGJlIHVzZWQKKyAqCSB0byBhdm9pZCByZXZlYWxpbmcgb2Ygc2Vuc2l0aXZlIGRhdGEgZHVlIHRvIHBhZ2luZyBldGMuCisgKi8KKworCisvKioqKioqKioqKioqKioqKioqKgorICogbXBpX2xpbWJfdAorICogX2djcnlfbXBpaF9zdWJtdWxfMSggbXBpX3B0cl90IHJlc19wdHIsICAgICAgKHIyNikKKyAqCQkgICAgIG1waV9wdHJfdCBzMV9wdHIsCSAgICAgKHIyNSkKKyAqCQkgICAgIG1waV9zaXplX3QgczFfc2l6ZSwgICAgIChyMjQpCisgKgkJICAgICBtcGlfbGltYl90IHMyX2xpbWIpICAgICAocjIzKQorICoKKyAqCisgKiBUaGlzIHJ1bnMgYXQgMTIgY3ljbGVzL2xpbWIgb24gYSBQQTcwMDAuICBXaXRoIHRoZSB1c2VkIGluc3RydWN0aW9ucywgaXQKKyAqIGNhbiBub3QgYmVjb21lIGZhc3RlciBkdWUgdG8gZGF0YSBjYWNoZSBjb250ZW50aW9uIGFmdGVyIGEgc3RvcmUuICBPbiB0aGUKKyAqIFBBNzEwMCBpdCBydW5zIGF0IDExIGN5Y2xlcy9saW1iLCBhbmQgdGhhdCBjYW4gbm90IGJlIGltcHJvdmVkIGVpdGhlciwKKyAqIHNpbmNlIG9ubHkgdGhlIHhtcHl1IGRvZXMgbm90IG5lZWQgdGhlIGludGVnZXIgcGlwZWxpbmUsIHNvIHRoZSBvbmx5CisgKiBkdWFsLWlzc3VlIHdlIHdpbGwgZ2V0IGFyZSBhZGRjK3htcHl1LiAgVW5yb2xsaW5nIGNvdWxkIGdhaW4gYSBjeWNsZS9saW1iCisgKiBvbiB0aGUgUEE3MTAwLgorICoKKyAqIFRoZXJlIGFyZSBzb21lIGlkZWFzIGRlc2NyaWJlZCBpbiBtdWwxLlMgdGhhdCBhcHBsaWVzIHRvIHRoaXMgY29kZSB0b28uCisgKgorICogSXQgc2VlbXMgcG9zc2libGUgdG8gbWFrZSB0aGlzIHJ1biBhcyBmYXN0IGFzIGFkZG11bF8xLCBpZiB3ZSB1c2UKKyAqCSBzdWIsPj49ICVyMjksJXIxOSwlcjIyCisgKgkgYWRkaQkgMSwlcjI4LCVyMjgKKyAqIGJ1dCB0aGF0IHJlcXVpcmVzIHJld29ya2luZyB0aGUgaGFpcnkgc29mdHdhcmUgcGlwZWxpbmUuLi4KKyAqLworCisJLmxldmVsCQkxLjEKKworCS5jb2RlCisJLmV4cG9ydCAJX2djcnlfbXBpaF9zdWJtdWxfMQorCS5sYWJlbAkJX2djcnlfbXBpaF9zdWJtdWxfMQorCS5wcm9jCisJLmNhbGxpbmZvCWZyYW1lPTY0LG5vX2NhbGxzCisJLmVudHJ5CisKKwlsZG8JCTY0KCVyMzApLCVyMzAKKwlmbGR3cyxtYQk0KCVyMjUpLCVmcjUKKwlzdHcJCSVyMjMsLTE2KCVyMzApCQk7IG1vdmUgczJfbGltYiAuLi4KKwlhZGRpYiw9IAktMSwlcjI0LEwkanVzdF9vbmVfbGltYgorCSBmbGR3cwkJLTE2KCVyMzApLCVmcjQJCTsgLi4uIGludG8gZnI0CisJYWRkCQklcjAsJXIwLCVyMAkJOyBjbGVhciBjYXJyeQorCXhtcHl1CQklZnI0LCVmcjUsJWZyNgorCWZsZHdzLG1hCTQoJXIyNSksJWZyNworCWZzdGRzCQklZnI2LC0xNiglcjMwKQorCXhtcHl1CQklZnI0LCVmcjcsJWZyOAorCWxkdwkJLTEyKCVyMzApLCVyMTkJCTsgbGVhc3Qgc2lnbmlmaWNhbnQgbGltYiBpbiBwcm9kdWN0CisJbGR3CQktMTYoJXIzMCksJXIyOAorCisJZnN0ZHMJCSVmcjgsLTE2KCVyMzApCisJYWRkaWIsPSAJLTEsJXIyNCxMJGVuZAorCSBsZHcJCS0xMiglcjMwKSwlcjEKKworOyBNYWluIGxvb3AKKwkubGFiZWwJTCRsb29wCisJbGR3cwkJMCglcjI2KSwlcjI5CisJZmxkd3MsbWEJNCglcjI1KSwlZnI1CisJc3ViCQklcjI5LCVyMTksJXIyMgorCWFkZAkJJXIyMiwlcjE5LCVyMAorCXN0d3MsbWEgCSVyMjIsNCglcjI2KQorCWFkZGMJCSVyMjgsJXIxLCVyMTkKKwl4bXB5dQkJJWZyNCwlZnI1LCVmcjYKKwlsZHcJCS0xNiglcjMwKSwlcjI4CisJZnN0ZHMJCSVmcjYsLTE2KCVyMzApCisJYWRkYwkJJXIwLCVyMjgsJXIyOAorCWFkZGliLDw+CS0xLCVyMjQsTCRsb29wCisJIGxkdwkJLTEyKCVyMzApLCVyMQorCisJLmxhYmVsCUwkZW5kCisJbGR3CQkwKCVyMjYpLCVyMjkKKwlzdWIJCSVyMjksJXIxOSwlcjIyCisJYWRkCQklcjIyLCVyMTksJXIwCisJc3R3cyxtYSAJJXIyMiw0KCVyMjYpCisJYWRkYwkJJXIyOCwlcjEsJXIxOQorCWxkdwkJLTE2KCVyMzApLCVyMjgKKwlsZHdzCQkwKCVyMjYpLCVyMjkKKwlhZGRjCQklcjAsJXIyOCwlcjI4CisJc3ViCQklcjI5LCVyMTksJXIyMgorCWFkZAkJJXIyMiwlcjE5LCVyMAorCXN0d3MsbWEgCSVyMjIsNCglcjI2KQorCWFkZGMJCSVyMCwlcjI4LCVyMjgKKwlidgkJMCglcjIpCisJIGxkbwkJLTY0KCVyMzApLCVyMzAKKworCS5sYWJlbAlMJGp1c3Rfb25lX2xpbWIKKwl4bXB5dQkJJWZyNCwlZnI1LCVmcjYKKwlsZHcJCTAoJXIyNiksJXIyOQorCWZzdGRzCQklZnI2LC0xNiglcjMwKQorCWxkdwkJLTEyKCVyMzApLCVyMQorCWxkdwkJLTE2KCVyMzApLCVyMjgKKwlzdWIJCSVyMjksJXIxLCVyMjIKKwlhZGQJCSVyMjIsJXIxLCVyMAorCXN0dwkJJXIyMiwwKCVyMjYpCisJYWRkYwkJJXIwLCVyMjgsJXIyOAorCWJ2CQkwKCVyMikKKwkgbGRvCQktNjQoJXIzMCksJXIzMAorCisJLmV4aXQKKwkucHJvY2VuZAorCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL2hwcGExLjEvdWRpdi1xcm5uZC5TIGIvbGliZ2NyeXB0LTEuNC42L21waS9ocHBhMS4xL3VkaXYtcXJubmQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjI4YjdiCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9ocHBhMS4xL3VkaXYtcXJubmQuUwpAQCAtMCwwICsxLDkyIEBACisvKiBIUC1QQSAgX191ZGl2X3Fybm5kIGRpdmlzaW9uIHN1cHBvcnQsIHVzZWQgZnJvbSBsb25nbG9uZy5oLgorICoJICBUaGlzIHZlcnNpb24gcnVucyBmYXN0IG9uIFBBIDcwMDAgYW5kIGxhdGVyLgorICoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk4LCAKKyAqICAgICAgICAgICAgICAgICAgICAyMDAxLCAyMDAyLCAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqCisgKiBOb3RlOiBUaGlzIGNvZGUgaXMgaGVhdmlseSBiYXNlZCBvbiB0aGUgR05VIE1QIExpYnJhcnkuCisgKgkgQWN0dWFsbHkgaXQncyB0aGUgc2FtZSBjb2RlIHdpdGggb25seSBtaW5vciBjaGFuZ2VzIGluIHRoZQorICoJIHdheSB0aGUgZGF0YSBpcyBzdG9yZWQ7IHRoaXMgaXMgdG8gc3VwcG9ydCB0aGUgYWJzdHJhY3Rpb24KKyAqCSBvZiBhbiBvcHRpb25hbCBzZWN1cmUgbWVtb3J5IGFsbG9jYXRpb24gd2hpY2ggbWF5IGJlIHVzZWQKKyAqCSB0byBhdm9pZCByZXZlYWxpbmcgb2Ygc2Vuc2l0aXZlIGRhdGEgZHVlIHRvIHBhZ2luZyBldGMuCisgKi8KKworCisKKy8qIElOUFVUIFBBUkFNRVRFUlMKKyAqICAgcmVtX3B0cgkgICBncjI2CisgKiAgIG4xIAkgICBncjI1CisgKiAgIG4wIAkgICBncjI0CisgKiAgIGQJCSAgIGdyMjMKKyAqLworCisJLmxldmVsCQkxLjEKKworICAgICAgICAuZGF0YQorCS5hbGlnbgkJOAorCS5sYWJlbCBMJDAwMDAKKwkud29yZAkJMHg0M2YwMDAwMAorCS53b3JkCQkweDAKKyAgICAgICAgLmNvZGUKKwkuZXhwb3J0IAlfX3VkaXZfcXJubmQKKwkubGFiZWwJCV9fdWRpdl9xcm5uZAorCS5wcm9jCisJLmNhbGxpbmZvCWZyYW1lPTY0LG5vX2NhbGxzCisJLmVudHJ5CisJbGRvCQk2NCglcjMwKSwlcjMwCisKKwlzdHdzCQklcjI1LC0xNigwLCVyMzApCTsgbl9oaQorCXN0d3MJCSVyMjQsLTEyKDAsJXIzMCkJOyBuX2xvCisgICAgICAgIHN0dyAgICAgICAgICAgICAlcjE5LC0zMiglcjMwKQorICAgICAgICBhZGRpbCAgICAgICAgICAgTFQlTCQwMDAwLCVyMTkKKyAgICAgICAgbGR3ICAgICAgICAgICAgIFJUJUwkMDAwMCglcjEpLCVyMQorCWZsZGRzCQktMTYoMCwlcjMwKSwlZnI1CisJc3R3cwkJJXIyMywtMTIoMCwlcjMwKQorCWNvbWliLDw9CTAsJXIyNSxMJDEKKwlmY252eGYsZGJsLGRibAklZnI1LCVmcjUKKyAgICAgICAgZmxkZHMgICAgICAgICAgIDAoMCwlcjEpLCVmcjQKKwlmYWRkLGRibAklZnI0LCVmcjUsJWZyNQorCS5sYWJlbAlMJDEKKwlmY3B5LHNnbAklZnIwLCVmcjZMCisJZmxkd3MJCS0xMigwLCVyMzApLCVmcjZSCisJZmNudnhmLGRibCxkYmwJJWZyNiwlZnI0CisKKwlmZGl2LGRibAklZnI1LCVmcjQsJWZyNQorCisJZmNudmZ4LGRibCxkYmwJJWZyNSwlZnI0CisJZnN0d3MJCSVmcjRSLC0xNiglcjMwKQorCXhtcHl1CQklZnI0UiwlZnI2UiwlZnI2CisJbGR3cwkJLTE2KCVyMzApLCVyMjgKKwlmc3RkcwkJJWZyNiwtMTYoMCwlcjMwKQorCWxkd3MJCS0xMigwLCVyMzApLCVyMjEKKwlsZHdzCQktMTYoMCwlcjMwKSwlcjIwCisJc3ViCQklcjI0LCVyMjEsJXIyMgorICAgICAgICBzdWJiICAgICAgICAgICAgJXIyNSwlcjIwLCVyMQorICAgICAgICBjb21pYiw9ICAgICAgICAgMCwlcjEsTCQyCisJbGRvCQktNjQoJXIzMCksJXIzMAorCisJYWRkCQklcjIyLCVyMjMsJXIyMgorCWxkbwkJLTEoJXIyOCksJXIyOAorCS5sYWJlbAlMJDIKKwlidgkJMCglcjIpCisJc3R3cwkJJXIyMiwwKDAsJXIyNikKKworCS5leGl0CisJLnByb2NlbmQKKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9pMzg2L01hbmlmZXN0IGIvbGliZ2NyeXB0LTEuNC42L21waS9pMzg2L01hbmlmZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMmJjOGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL2kzODYvTWFuaWZlc3QKQEAgLTAsMCArMSwyOCBAQAorIyBNYW5pZmVzdCAtIGNoZWNrc3VtcyAKKyMgQ29weXJpZ2h0IDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyMKKyMgTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIGdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisKK21waWgtYWRkMS5TCittcGloLW11bDEuUworbXBpaC1tdWwyLlMKK21waWgtbXVsMy5TCittcGloLWxzaGlmdC5TCittcGloLXJzaGlmdC5TCittcGloLXN1YjEuUworc3ludGF4LmgKKyRuYW1lcyQgaVFDVkF3VUFQK0xtT1RFQW5wODMyUy83QVFKWm1nUUExK0dJbDdyWGlFWTAweTV4RDJrRzVMbTJRRDZjOWFCTUU4aFRsODEyT0VjajB1bC9RU3BkdjhFMk5FS29vaWZyNFNpTFZoRVZmTE5hTHFBZ04zY0lzdHRuM3JSWDMvcE1DNUp3U0tIREpQc1VicE45dHpiNWRyMllDOUdHOW04eG5nQVFyTjExSVFQbkdmdkZMSksrb0RuRU1JQWVIRHBPblg5TmVRUERBUUE9PWJuT3kKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvaTM4Ni9kaXN0ZmlsZXMgYi9saWJnY3J5cHQtMS40LjYvbXBpL2kzODYvZGlzdGZpbGVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYjk5NzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL2kzODYvZGlzdGZpbGVzCkBAIC0wLDAgKzEsMTAgQEAKK01hbmlmZXN0CittcGloLWFkZDEuUworbXBpaC1tdWwxLlMKK21waWgtbXVsMi5TCittcGloLW11bDMuUworbXBpaC1sc2hpZnQuUworbXBpaC1yc2hpZnQuUworbXBpaC1zdWIxLlMKK3N5bnRheC5oCisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvaTM4Ni9tcGloLWFkZDEuUyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvaTM4Ni9tcGloLWFkZDEuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTJiMjMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9pMzg2L21waWgtYWRkMS5TCkBAIC0wLDAgKzEsMTE2IEBACisvKiBpODAzODYgYWRkX24gLS0gQWRkIHR3byBsaW1iIHZlY3RvcnMgb2YgdGhlIHNhbWUgbGVuZ3RoID4gMCBhbmQgc3RvcmUKKyAqCQkgICBzdW0gaW4gYSB0aGlyZCBsaW1iIHZlY3Rvci4KKyAqCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NCwgMTk5NSwgMTk5OCwgCisgKiAgICAgICAgICAgICAgICAgICAgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKgorICogTm90ZTogVGhpcyBjb2RlIGlzIGhlYXZpbHkgYmFzZWQgb24gdGhlIEdOVSBNUCBMaWJyYXJ5LgorICoJIEFjdHVhbGx5IGl0J3MgdGhlIHNhbWUgY29kZSB3aXRoIG9ubHkgbWlub3IgY2hhbmdlcyBpbiB0aGUKKyAqCSB3YXkgdGhlIGRhdGEgaXMgc3RvcmVkOyB0aGlzIGlzIHRvIHN1cHBvcnQgdGhlIGFic3RyYWN0aW9uCisgKgkgb2YgYW4gb3B0aW9uYWwgc2VjdXJlIG1lbW9yeSBhbGxvY2F0aW9uIHdoaWNoIG1heSBiZSB1c2VkCisgKgkgdG8gYXZvaWQgcmV2ZWFsaW5nIG9mIHNlbnNpdGl2ZSBkYXRhIGR1ZSB0byBwYWdpbmcgZXRjLgorICovCisKKworI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImFzbS1zeW50YXguaCIKKworCisvKioqKioqKioqKioqKioqKioqKgorICogIG1waV9saW1iX3QKKyAqICBfZ2NyeV9tcGloX2FkZF9uKCBtcGlfcHRyX3QgcmVzX3B0ciwJKHNwICsgNCkKKyAqCQkgICBtcGlfcHRyX3QgczFfcHRyLAkoc3AgKyA4KQorICoJCSAgIG1waV9wdHJfdCBzMl9wdHIsCShzcCArIDEyKQorICoJCSAgIG1waV9zaXplX3Qgc2l6ZSkJKHNwICsgMTYpCisgKi8KKworLnRleHQKKwlBTElHTiAoMykKKwkuZ2xvYmwgQ19TWU1CT0xfTkFNRShfZ2NyeV9tcGloX2FkZF9uKQorQ19TWU1CT0xfTkFNRShfZ2NyeV9tcGloX2FkZF9uOikKKwlwdXNobCAlZWRpCisJcHVzaGwgJWVzaQorCisJbW92bCAxMiglZXNwKSwlZWRpCQkvKiByZXNfcHRyICovCisJbW92bCAxNiglZXNwKSwlZXNpCQkvKiBzMV9wdHIgKi8KKwltb3ZsIDIwKCVlc3ApLCVlZHgJCS8qIHMyX3B0ciAqLworCW1vdmwgMjQoJWVzcCksJWVjeAkJLyogc2l6ZSAqLworCisJbW92bAklZWN4LCVlYXgKKwlzaHJsCSQzLCVlY3ggCQkvKiBjb21wdXRlIGNvdW50IGZvciB1bnJvbGxlZCBsb29wICovCisJbmVnbAklZWF4CisJYW5kbAkkNywlZWF4IAkJLyogZ2V0IGluZGV4IHdoZXJlIHRvIHN0YXJ0IGxvb3AgKi8KKwlqeglMb29wCQkJLyogbmVjZXNzYXJ5IHNwZWNpYWwgY2FzZSBmb3IgMCAqLworCWluY2wJJWVjeAkJCS8qIGFkanVzdCBsb29wIGNvdW50ICovCisJc2hsbAkkMiwlZWF4IAkJLyogYWRqdXN0bWVudCBmb3IgcG9pbnRlcnMuLi4gKi8KKwlzdWJsCSVlYXgsJWVkaQkJLyogLi4uIHNpbmNlIHRoZXkgYXJlIG9mZnNldCAuLi4gKi8KKwlzdWJsCSVlYXgsJWVzaQkJLyogLi4uIGJ5IGEgY29uc3RhbnQgd2hlbiB3ZSAuLi4gKi8KKwlzdWJsCSVlYXgsJWVkeAkJLyogLi4uIGVudGVyIHRoZSBsb29wICovCisJc2hybAkkMiwlZWF4IAkJLyogcmVzdG9yZSBwcmV2aW91cyB2YWx1ZSAqLworI2lmZGVmIFBJQworLyogQ2FsY3VsYXRlIHN0YXJ0IGFkZHJlc3MgaW4gbG9vcCBmb3IgUElDLiAgRHVlIHRvIGxpbWl0YXRpb25zIGluIHNvbWUKKyAgIGFzc2VtYmxlcnMsIExvb3AtTDAtMyBjYW5ub3QgYmUgcHV0IGludG8gdGhlIGxlYWwgKi8KKwljYWxsCUwwCitMMDoJbGVhbAkoJWVheCwlZWF4LDgpLCVlYXgKKwlhZGRsCSglZXNwKSwlZWF4CisJYWRkbAkkKExvb3AtTDAtMyksJWVheAorCWFkZGwJJDQsJWVzcAorI2Vsc2UKKy8qIENhbGN1bGF0ZSBzdGFydCBhZGRyZXNzIGluIGxvb3AgZm9yIG5vbi1QSUMuICAqLworCWxlYWwJKExvb3AgLSAzKSglZWF4LCVlYXgsOCksJWVheAorI2VuZGlmCisJam1wCSolZWF4CQkJLyoganVtcCBpbnRvIGxvb3AgKi8KKwlBTElHTiAoMykKK0xvb3A6CW1vdmwJKCVlc2kpLCVlYXgKKwlhZGNsCSglZWR4KSwlZWF4CisJbW92bAklZWF4LCglZWRpKQorCW1vdmwJNCglZXNpKSwlZWF4CisJYWRjbAk0KCVlZHgpLCVlYXgKKwltb3ZsCSVlYXgsNCglZWRpKQorCW1vdmwJOCglZXNpKSwlZWF4CisJYWRjbAk4KCVlZHgpLCVlYXgKKwltb3ZsCSVlYXgsOCglZWRpKQorCW1vdmwJMTIoJWVzaSksJWVheAorCWFkY2wJMTIoJWVkeCksJWVheAorCW1vdmwJJWVheCwxMiglZWRpKQorCW1vdmwJMTYoJWVzaSksJWVheAorCWFkY2wJMTYoJWVkeCksJWVheAorCW1vdmwJJWVheCwxNiglZWRpKQorCW1vdmwJMjAoJWVzaSksJWVheAorCWFkY2wJMjAoJWVkeCksJWVheAorCW1vdmwJJWVheCwyMCglZWRpKQorCW1vdmwJMjQoJWVzaSksJWVheAorCWFkY2wJMjQoJWVkeCksJWVheAorCW1vdmwJJWVheCwyNCglZWRpKQorCW1vdmwJMjgoJWVzaSksJWVheAorCWFkY2wJMjgoJWVkeCksJWVheAorCW1vdmwJJWVheCwyOCglZWRpKQorCWxlYWwJMzIoJWVkaSksJWVkaQorCWxlYWwJMzIoJWVzaSksJWVzaQorCWxlYWwJMzIoJWVkeCksJWVkeAorCWRlY2wJJWVjeAorCWpueglMb29wCisKKwlzYmJsCSVlYXgsJWVheAorCW5lZ2wJJWVheAorCisJcG9wbCAlZXNpCisJcG9wbCAlZWRpCisJcmV0CisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvaTM4Ni9tcGloLWxzaGlmdC5TIGIvbGliZ2NyeXB0LTEuNC42L21waS9pMzg2L21waWgtbHNoaWZ0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY4ZWQ5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvaTM4Ni9tcGloLWxzaGlmdC5TCkBAIC0wLDAgKzEsOTQgQEAKKy8qIGk4MDM4NiAgIGxzaGlmdAorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTQsIDE5OTgsCisgKiAgICAgICAgICAgICAgICAgICAgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKgorICogTm90ZTogVGhpcyBjb2RlIGlzIGhlYXZpbHkgYmFzZWQgb24gdGhlIEdOVSBNUCBMaWJyYXJ5LgorICoJIEFjdHVhbGx5IGl0J3MgdGhlIHNhbWUgY29kZSB3aXRoIG9ubHkgbWlub3IgY2hhbmdlcyBpbiB0aGUKKyAqCSB3YXkgdGhlIGRhdGEgaXMgc3RvcmVkOyB0aGlzIGlzIHRvIHN1cHBvcnQgdGhlIGFic3RyYWN0aW9uCisgKgkgb2YgYW4gb3B0aW9uYWwgc2VjdXJlIG1lbW9yeSBhbGxvY2F0aW9uIHdoaWNoIG1heSBiZSB1c2VkCisgKgkgdG8gYXZvaWQgcmV2ZWFsaW5nIG9mIHNlbnNpdGl2ZSBkYXRhIGR1ZSB0byBwYWdpbmcgZXRjLgorICovCisKKworI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImFzbS1zeW50YXguaCIKKworCisvKioqKioqKioqKioqKioqKioqKgorICogbXBpX2xpbWJfdAorICogX2djcnlfbXBpaF9sc2hpZnQoIG1waV9wdHJfdCB3cCwJKHNwICsgNCkKKyAqCQkgICBtcGlfcHRyX3QgdXAsCShzcCArIDgpCisgKgkJICAgbXBpX3NpemVfdCB1c2l6ZSwJKHNwICsgMTIpCisgKgkJICAgdW5zaWduZWQgY250KQkoc3AgKyAxNikKKyAqLworCisudGV4dAorCUFMSUdOICgzKQorCS5nbG9ibCBDX1NZTUJPTF9OQU1FKF9nY3J5X21waWhfbHNoaWZ0KQorQ19TWU1CT0xfTkFNRShfZ2NyeV9tcGloX2xzaGlmdDopCisJcHVzaGwJJWVkaQorCXB1c2hsCSVlc2kKKwlwdXNobAklZWJ4CisKKwltb3ZsCTE2KCVlc3ApLCVlZGkJCS8qIHJlc19wdHIgKi8KKwltb3ZsCTIwKCVlc3ApLCVlc2kJCS8qIHNfcHRyICovCisJbW92bAkyNCglZXNwKSwlZWR4CQkvKiBzaXplICovCisJbW92bAkyOCglZXNwKSwlZWN4CQkvKiBjbnQgKi8KKworCXN1YmwJJDQsJWVzaSAJCS8qIGFkanVzdCBzX3B0ciAqLworCisJbW92bAkoJWVzaSwlZWR4LDQpLCVlYngJLyogcmVhZCBtb3N0IHNpZ25pZmljYW50IGxpbWIgKi8KKwl4b3JsCSVlYXgsJWVheAorCXNobGRsCSVjbCwlZWJ4LCVlYXgJCS8qIGNvbXB1dGUgY2FycnkgbGltYiAqLworCWRlY2wJJWVkeAorCWp6CUxlbmQKKwlwdXNobAklZWF4CQkJLyogcHVzaCBjYXJyeSBsaW1iIG9udG8gc3RhY2sgKi8KKwl0ZXN0YgkkMSwlZGwKKwlqbnoJTDEJCQkvKiBlbnRlciBsb29wIGluIHRoZSBtaWRkbGUgKi8KKwltb3ZsCSVlYngsJWVheAorCisJQUxJR04gKDMpCitMb29wOgltb3ZsCSglZXNpLCVlZHgsNCksJWVieAkvKiBsb2FkIG5leHQgbG93ZXIgbGltYiAqLworCXNobGRsCSVjbCwlZWJ4LCVlYXgJCS8qIGNvbXB1dGUgcmVzdWx0IGxpbWIgKi8KKwltb3ZsCSVlYXgsKCVlZGksJWVkeCw0KQkvKiBzdG9yZSBpdCAqLworCWRlY2wJJWVkeAorTDE6CW1vdmwJKCVlc2ksJWVkeCw0KSwlZWF4CisJc2hsZGwJJWNsLCVlYXgsJWVieAorCW1vdmwJJWVieCwoJWVkaSwlZWR4LDQpCisJZGVjbAklZWR4CisJam56CUxvb3AKKworCXNobGwJJWNsLCVlYXgJCS8qIGNvbXB1dGUgbGVhc3Qgc2lnbmlmaWNhbnQgbGltYiAqLworCW1vdmwJJWVheCwoJWVkaSkJCS8qIHN0b3JlIGl0ICovCisKKwlwb3BsCSVlYXgJCQkvKiBwb3AgY2FycnkgbGltYiAqLworCisJcG9wbAklZWJ4CisJcG9wbAklZXNpCisJcG9wbAklZWRpCisJcmV0CisKK0xlbmQ6CXNobGwJJWNsLCVlYngJCS8qIGNvbXB1dGUgbGVhc3Qgc2lnbmlmaWNhbnQgbGltYiAqLworCW1vdmwJJWVieCwoJWVkaSkJCS8qIHN0b3JlIGl0ICovCisKKwlwb3BsCSVlYngKKwlwb3BsCSVlc2kKKwlwb3BsCSVlZGkKKwlyZXQKKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9pMzg2L21waWgtbXVsMS5TIGIvbGliZ2NyeXB0LTEuNC42L21waS9pMzg2L21waWgtbXVsMS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NzYwZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL2kzODYvbXBpaC1tdWwxLlMKQEAgLTAsMCArMSw4NCBAQAorLyogaTgwMzg2IG11bF8xIC0tIE11bHRpcGx5IGEgbGltYiB2ZWN0b3Igd2l0aCBhIGxpbWIgYW5kIHN0b3JlCisgKgkJCSB0aGUgcmVzdWx0IGluIGEgc2Vjb25kIGxpbWIgdmVjdG9yLgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTQsIDE5OTgsIAorICogICAgICAgICAgICAgICAgICAgIDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICoKKyAqIE5vdGU6IFRoaXMgY29kZSBpcyBoZWF2aWx5IGJhc2VkIG9uIHRoZSBHTlUgTVAgTGlicmFyeS4KKyAqCSBBY3R1YWxseSBpdCdzIHRoZSBzYW1lIGNvZGUgd2l0aCBvbmx5IG1pbm9yIGNoYW5nZXMgaW4gdGhlCisgKgkgd2F5IHRoZSBkYXRhIGlzIHN0b3JlZDsgdGhpcyBpcyB0byBzdXBwb3J0IHRoZSBhYnN0cmFjdGlvbgorICoJIG9mIGFuIG9wdGlvbmFsIHNlY3VyZSBtZW1vcnkgYWxsb2NhdGlvbiB3aGljaCBtYXkgYmUgdXNlZAorICoJIHRvIGF2b2lkIHJldmVhbGluZyBvZiBzZW5zaXRpdmUgZGF0YSBkdWUgdG8gcGFnaW5nIGV0Yy4KKyAqLworCisKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJhc20tc3ludGF4LmgiCisKKworLyoqKioqKioqKioqKioqKioqKioKKyAqIG1waV9saW1iX3QKKyAqIF9nY3J5X21waWhfbXVsXzEoIG1waV9wdHJfdCByZXNfcHRyLAkoc3AgKyA0KQorICoJCSAgbXBpX3B0cl90IHMxX3B0ciwJKHNwICsgOCkKKyAqCQkgIG1waV9zaXplX3QgczFfc2l6ZSwJKHNwICsgMTIpCisgKgkJICBtcGlfbGltYl90IHMyX2xpbWIpCShzcCArIDE2KQorICovCisKKyNkZWZpbmUgcmVzX3B0ciBlZGkKKyNkZWZpbmUgczFfcHRyCWVzaQorI2RlZmluZSBzaXplCWVjeAorI2RlZmluZSBzMl9saW1iIGVicAorCisJVEVYVAorCUFMSUdOICgzKQorCUdMT0JMCUNfU1lNQk9MX05BTUUoX2djcnlfbXBpaF9tdWxfMSkKK0NfU1lNQk9MX05BTUUoX2djcnlfbXBpaF9tdWxfMTopCisKKwlJTlNOMShwdXNoLGwJLFIoZWRpKSkKKwlJTlNOMShwdXNoLGwJLFIoZXNpKSkKKwlJTlNOMShwdXNoLGwJLFIoZWJ4KSkKKwlJTlNOMShwdXNoLGwJLFIoZWJwKSkKKworCUlOU04yKG1vdixsCSxSKHJlc19wdHIpLE1FTV9ESVNQKGVzcCwyMCkpCisJSU5TTjIobW92LGwJLFIoczFfcHRyKSxNRU1fRElTUChlc3AsMjQpKQorCUlOU04yKG1vdixsCSxSKHNpemUpLE1FTV9ESVNQKGVzcCwyOCkpCisJSU5TTjIobW92LGwJLFIoczJfbGltYiksTUVNX0RJU1AoZXNwLDMyKSkKKworCUlOU04yKGxlYSxsCSxSKHJlc19wdHIpLE1FTV9JTkRFWChyZXNfcHRyLHNpemUsNCkpCisJSU5TTjIobGVhLGwJLFIoczFfcHRyKSxNRU1fSU5ERVgoczFfcHRyLHNpemUsNCkpCisJSU5TTjEobmVnLGwJLFIoc2l6ZSkpCisJSU5TTjIoeG9yLGwJLFIoZWJ4KSxSKGVieCkpCisJQUxJR04gKDMpCitMb29wOgorCUlOU04yKG1vdixsCSxSKGVheCksTUVNX0lOREVYKHMxX3B0cixzaXplLDQpKQorCUlOU04xKG11bCxsCSxSKHMyX2xpbWIpKQorCUlOU04yKGFkZCxsCSxSKGVheCksUihlYngpKQorCUlOU04yKG1vdixsCSxNRU1fSU5ERVgocmVzX3B0cixzaXplLDQpLFIoZWF4KSkKKwlJTlNOMihhZGMsbAksUihlZHgpLCQwKQorCUlOU04yKG1vdixsCSxSKGVieCksUihlZHgpKQorCisJSU5TTjEoaW5jLGwJLFIoc2l6ZSkpCisJSU5TTjEoam56LAksTG9vcCkKKwlJTlNOMihtb3YsbAksUihlYXgpLFIoZWJ4KSkKKworCUlOU04xKHBvcCxsCSxSKGVicCkpCisJSU5TTjEocG9wLGwJLFIoZWJ4KSkKKwlJTlNOMShwb3AsbAksUihlc2kpKQorCUlOU04xKHBvcCxsCSxSKGVkaSkpCisJcmV0CisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvaTM4Ni9tcGloLW11bDIuUyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvaTM4Ni9tcGloLW11bDIuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Nzk0ZTExCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9pMzg2L21waWgtbXVsMi5TCkBAIC0wLDAgKzEsODYgQEAKKy8qIGk4MDM4NiBhZGRtdWxfMSAtLSBNdWx0aXBseSBhIGxpbWIgdmVjdG9yIHdpdGggYSBsaW1iIGFuZCBhZGQKKyAqCQkgICAgICB0aGUgcmVzdWx0IHRvIGEgc2Vjb25kIGxpbWIgdmVjdG9yLgorICoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk0LCAxOTk4LAorICogICAgICAgICAgICAgICAgICAgIDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICoKKyAqIE5vdGU6IFRoaXMgY29kZSBpcyBoZWF2aWx5IGJhc2VkIG9uIHRoZSBHTlUgTVAgTGlicmFyeS4KKyAqCSBBY3R1YWxseSBpdCdzIHRoZSBzYW1lIGNvZGUgd2l0aCBvbmx5IG1pbm9yIGNoYW5nZXMgaW4gdGhlCisgKgkgd2F5IHRoZSBkYXRhIGlzIHN0b3JlZDsgdGhpcyBpcyB0byBzdXBwb3J0IHRoZSBhYnN0cmFjdGlvbgorICoJIG9mIGFuIG9wdGlvbmFsIHNlY3VyZSBtZW1vcnkgYWxsb2NhdGlvbiB3aGljaCBtYXkgYmUgdXNlZAorICoJIHRvIGF2b2lkIHJldmVhbGluZyBvZiBzZW5zaXRpdmUgZGF0YSBkdWUgdG8gcGFnaW5nIGV0Yy4KKyAqLworCisKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJhc20tc3ludGF4LmgiCisKKworLyoqKioqKioqKioqKioqKioqKioKKyAqIG1waV9saW1iX3QKKyAqIF9nY3J5X21waWhfYWRkbXVsXzEoIG1waV9wdHJfdCByZXNfcHRyLCAgICAgIChzcCArIDQpCisgKgkJICAgICBtcGlfcHRyX3QgczFfcHRyLAkgICAgIChzcCArIDgpCisgKgkJICAgICBtcGlfc2l6ZV90IHMxX3NpemUsICAgICAoc3AgKyAxMikKKyAqCQkgICAgIG1waV9saW1iX3QgczJfbGltYikgICAgIChzcCArIDE2KQorICovCisKKyNkZWZpbmUgcmVzX3B0ciBlZGkKKyNkZWZpbmUgczFfcHRyCWVzaQorI2RlZmluZSBzaXplCWVjeAorI2RlZmluZSBzMl9saW1iIGVicAorCisJVEVYVAorCUFMSUdOICgzKQorCUdMT0JMCUNfU1lNQk9MX05BTUUoX2djcnlfbXBpaF9hZGRtdWxfMSkKK0NfU1lNQk9MX05BTUUoX2djcnlfbXBpaF9hZGRtdWxfMTopCisKKwlJTlNOMShwdXNoLGwJLFIoZWRpKSkKKwlJTlNOMShwdXNoLGwJLFIoZXNpKSkKKwlJTlNOMShwdXNoLGwJLFIoZWJ4KSkKKwlJTlNOMShwdXNoLGwJLFIoZWJwKSkKKworCUlOU04yKG1vdixsCSxSKHJlc19wdHIpLE1FTV9ESVNQKGVzcCwyMCkpCisJSU5TTjIobW92LGwJLFIoczFfcHRyKSxNRU1fRElTUChlc3AsMjQpKQorCUlOU04yKG1vdixsCSxSKHNpemUpLE1FTV9ESVNQKGVzcCwyOCkpCisJSU5TTjIobW92LGwJLFIoczJfbGltYiksTUVNX0RJU1AoZXNwLDMyKSkKKworCUlOU04yKGxlYSxsCSxSKHJlc19wdHIpLE1FTV9JTkRFWChyZXNfcHRyLHNpemUsNCkpCisJSU5TTjIobGVhLGwJLFIoczFfcHRyKSxNRU1fSU5ERVgoczFfcHRyLHNpemUsNCkpCisJSU5TTjEobmVnLGwJLFIoc2l6ZSkpCisJSU5TTjIoeG9yLGwJLFIoZWJ4KSxSKGVieCkpCisJQUxJR04gKDMpCitMb29wOgorCUlOU04yKG1vdixsCSxSKGVheCksTUVNX0lOREVYKHMxX3B0cixzaXplLDQpKQorCUlOU04xKG11bCxsCSxSKHMyX2xpbWIpKQorCUlOU04yKGFkZCxsCSxSKGVheCksUihlYngpKQorCUlOU04yKGFkYyxsCSxSKGVkeCksJDApCisJSU5TTjIoYWRkLGwJLE1FTV9JTkRFWChyZXNfcHRyLHNpemUsNCksUihlYXgpKQorCUlOU04yKGFkYyxsCSxSKGVkeCksJDApCisJSU5TTjIobW92LGwJLFIoZWJ4KSxSKGVkeCkpCisKKwlJTlNOMShpbmMsbAksUihzaXplKSkKKwlJTlNOMShqbnosCSxMb29wKQorCUlOU04yKG1vdixsCSxSKGVheCksUihlYngpKQorCisJSU5TTjEocG9wLGwJLFIoZWJwKSkKKwlJTlNOMShwb3AsbAksUihlYngpKQorCUlOU04xKHBvcCxsCSxSKGVzaSkpCisJSU5TTjEocG9wLGwJLFIoZWRpKSkKKwlyZXQKKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9pMzg2L21waWgtbXVsMy5TIGIvbGliZ2NyeXB0LTEuNC42L21waS9pMzg2L21waWgtbXVsMy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZjIwMTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL2kzODYvbXBpaC1tdWwzLlMKQEAgLTAsMCArMSw4NiBAQAorLyogaTgwMzg2IHN1Ym11bF8xIC0tIE11bHRpcGx5IGEgbGltYiB2ZWN0b3Igd2l0aCBhIGxpbWIgYW5kIGFkZAorICoJCSAgICAgIHRoZSByZXN1bHQgdG8gYSBzZWNvbmQgbGltYiB2ZWN0b3IuCisgKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTQsIDE5OTgsIAorICogICAgICAgICAgICAgICAgICAgIDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICoKKyAqIE5vdGU6IFRoaXMgY29kZSBpcyBoZWF2aWx5IGJhc2VkIG9uIHRoZSBHTlUgTVAgTGlicmFyeS4KKyAqCSBBY3R1YWxseSBpdCdzIHRoZSBzYW1lIGNvZGUgd2l0aCBvbmx5IG1pbm9yIGNoYW5nZXMgaW4gdGhlCisgKgkgd2F5IHRoZSBkYXRhIGlzIHN0b3JlZDsgdGhpcyBpcyB0byBzdXBwb3J0IHRoZSBhYnN0cmFjdGlvbgorICoJIG9mIGFuIG9wdGlvbmFsIHNlY3VyZSBtZW1vcnkgYWxsb2NhdGlvbiB3aGljaCBtYXkgYmUgdXNlZAorICoJIHRvIGF2b2lkIHJldmVhbGluZyBvZiBzZW5zaXRpdmUgZGF0YSBkdWUgdG8gcGFnaW5nIGV0Yy4KKyAqLworCisKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJhc20tc3ludGF4LmgiCisKKworLyoqKioqKioqKioqKioqKioqKioKKyAqIG1waV9saW1iX3QKKyAqIF9nY3J5X21waWhfc3VibXVsXzEoIG1waV9wdHJfdCByZXNfcHRyLCAgICAgIChzcCArIDQpCisgKgkJICAgICBtcGlfcHRyX3QgczFfcHRyLAkgICAgIChzcCArIDgpCisgKgkJICAgICBtcGlfc2l6ZV90IHMxX3NpemUsICAgICAoc3AgKyAxMikKKyAqCQkgICAgIG1waV9saW1iX3QgczJfbGltYikgICAgIChzcCArIDE2KQorICovCisKKyNkZWZpbmUgcmVzX3B0ciBlZGkKKyNkZWZpbmUgczFfcHRyCWVzaQorI2RlZmluZSBzaXplCWVjeAorI2RlZmluZSBzMl9saW1iIGVicAorCisJVEVYVAorCUFMSUdOICgzKQorCUdMT0JMCUNfU1lNQk9MX05BTUUoX2djcnlfbXBpaF9zdWJtdWxfMSkKK0NfU1lNQk9MX05BTUUoX2djcnlfbXBpaF9zdWJtdWxfMTopCisKKwlJTlNOMShwdXNoLGwJLFIoZWRpKSkKKwlJTlNOMShwdXNoLGwJLFIoZXNpKSkKKwlJTlNOMShwdXNoLGwJLFIoZWJ4KSkKKwlJTlNOMShwdXNoLGwJLFIoZWJwKSkKKworCUlOU04yKG1vdixsCSxSKHJlc19wdHIpLE1FTV9ESVNQKGVzcCwyMCkpCisJSU5TTjIobW92LGwJLFIoczFfcHRyKSxNRU1fRElTUChlc3AsMjQpKQorCUlOU04yKG1vdixsCSxSKHNpemUpLE1FTV9ESVNQKGVzcCwyOCkpCisJSU5TTjIobW92LGwJLFIoczJfbGltYiksTUVNX0RJU1AoZXNwLDMyKSkKKworCUlOU04yKGxlYSxsCSxSKHJlc19wdHIpLE1FTV9JTkRFWChyZXNfcHRyLHNpemUsNCkpCisJSU5TTjIobGVhLGwJLFIoczFfcHRyKSxNRU1fSU5ERVgoczFfcHRyLHNpemUsNCkpCisJSU5TTjEobmVnLGwJLFIoc2l6ZSkpCisJSU5TTjIoeG9yLGwJLFIoZWJ4KSxSKGVieCkpCisJQUxJR04gKDMpCitMb29wOgorCUlOU04yKG1vdixsCSxSKGVheCksTUVNX0lOREVYKHMxX3B0cixzaXplLDQpKQorCUlOU04xKG11bCxsCSxSKHMyX2xpbWIpKQorCUlOU04yKGFkZCxsCSxSKGVheCksUihlYngpKQorCUlOU04yKGFkYyxsCSxSKGVkeCksJDApCisJSU5TTjIoc3ViLGwJLE1FTV9JTkRFWChyZXNfcHRyLHNpemUsNCksUihlYXgpKQorCUlOU04yKGFkYyxsCSxSKGVkeCksJDApCisJSU5TTjIobW92LGwJLFIoZWJ4KSxSKGVkeCkpCisKKwlJTlNOMShpbmMsbAksUihzaXplKSkKKwlJTlNOMShqbnosCSxMb29wKQorCUlOU04yKG1vdixsCSxSKGVheCksUihlYngpKQorCisJSU5TTjEocG9wLGwJLFIoZWJwKSkKKwlJTlNOMShwb3AsbAksUihlYngpKQorCUlOU04xKHBvcCxsCSxSKGVzaSkpCisJSU5TTjEocG9wLGwJLFIoZWRpKSkKKwlyZXQKKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9pMzg2L21waWgtcnNoaWZ0LlMgYi9saWJnY3J5cHQtMS40LjYvbXBpL2kzODYvbXBpaC1yc2hpZnQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTIwZTU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9pMzg2L21waWgtcnNoaWZ0LlMKQEAgLTAsMCArMSw5NyBAQAorLyogaTgwMzg2ICAgcnNoaWZ0CisgKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTQsIDE5OTgsIAorICogICAgICAgICAgICAgICAgICAgIDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICoKKyAqIE5vdGU6IFRoaXMgY29kZSBpcyBoZWF2aWx5IGJhc2VkIG9uIHRoZSBHTlUgTVAgTGlicmFyeS4KKyAqCSBBY3R1YWxseSBpdCdzIHRoZSBzYW1lIGNvZGUgd2l0aCBvbmx5IG1pbm9yIGNoYW5nZXMgaW4gdGhlCisgKgkgd2F5IHRoZSBkYXRhIGlzIHN0b3JlZDsgdGhpcyBpcyB0byBzdXBwb3J0IHRoZSBhYnN0cmFjdGlvbgorICoJIG9mIGFuIG9wdGlvbmFsIHNlY3VyZSBtZW1vcnkgYWxsb2NhdGlvbiB3aGljaCBtYXkgYmUgdXNlZAorICoJIHRvIGF2b2lkIHJldmVhbGluZyBvZiBzZW5zaXRpdmUgZGF0YSBkdWUgdG8gcGFnaW5nIGV0Yy4KKyAqLworCisKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJhc20tc3ludGF4LmgiCisKKworLyoqKioqKioqKioqKioqKioqKioKKyAqIG1waV9saW1iX3QKKyAqIF9nY3J5X21waWhfcnNoaWZ0KCBtcGlfcHRyX3Qgd3AsCShzcCArIDQpCisgKgkJICAgbXBpX3B0cl90IHVwLAkoc3AgKyA4KQorICoJCSAgIG1waV9zaXplX3QgdXNpemUsCShzcCArIDEyKQorICoJCSAgIHVuc2lnbmVkIGNudCkJKHNwICsgMTYpCisgKi8KKworLnRleHQKKwlBTElHTiAoMykKKwkuZ2xvYmwgQ19TWU1CT0xfTkFNRShfZ2NyeV9tcGloX3JzaGlmdCkKK0NfU1lNQk9MX05BTUUoX2djcnlfbXBpaF9yc2hpZnQ6KQorCXB1c2hsCSVlZGkKKwlwdXNobAklZXNpCisJcHVzaGwJJWVieAorCisJbW92bAkxNiglZXNwKSwlZWRpCQkvKiB3cCAqLworCW1vdmwJMjAoJWVzcCksJWVzaQkJLyogdXAgKi8KKwltb3ZsCTI0KCVlc3ApLCVlZHgJCS8qIHVzaXplICovCisJbW92bAkyOCglZXNwKSwlZWN4CQkvKiBjbnQgKi8KKworCWxlYWwJLTQoJWVkaSwlZWR4LDQpLCVlZGkKKwlsZWFsCSglZXNpLCVlZHgsNCksJWVzaQorCW5lZ2wJJWVkeAorCisJbW92bAkoJWVzaSwlZWR4LDQpLCVlYngJLyogcmVhZCBsZWFzdCBzaWduaWZpY2FudCBsaW1iICovCisJeG9ybAklZWF4LCVlYXgKKwlzaHJkbAklY2wsJWVieCwlZWF4CQkvKiBjb21wdXRlIGNhcnJ5IGxpbWIgKi8KKwlpbmNsCSVlZHgKKwlqeglMZW5kMgorCXB1c2hsCSVlYXgJCQkvKiBwdXNoIGNhcnJ5IGxpbWIgb250byBzdGFjayAqLworCXRlc3RiCSQxLCVkbAorCWpueglMMgkJCS8qIGVudGVyIGxvb3AgaW4gdGhlIG1pZGRsZSAqLworCW1vdmwJJWVieCwlZWF4CisKKwlBTElHTiAoMykKK0xvb3AyOgkgbW92bAkgKCVlc2ksJWVkeCw0KSwlZWJ4CSAvKiBsb2FkIG5leHQgaGlnaGVyIGxpbWIgKi8KKwlzaHJkbAklY2wsJWVieCwlZWF4CQkvKiBjb21wdXRlIHJlc3VsdCBsaW1iICovCisJbW92bAklZWF4LCglZWRpLCVlZHgsNCkJLyogc3RvcmUgaXQgKi8KKwlpbmNsCSVlZHgKK0wyOgltb3ZsCSglZXNpLCVlZHgsNCksJWVheAorCXNocmRsCSVjbCwlZWF4LCVlYngKKwltb3ZsCSVlYngsKCVlZGksJWVkeCw0KQorCWluY2wJJWVkeAorCWpueglMb29wMgorCisJc2hybAklY2wsJWVheAkJLyogY29tcHV0ZSBtb3N0IHNpZ25pZmljYW50IGxpbWIgKi8KKwltb3ZsCSVlYXgsKCVlZGkpCQkvKiBzdG9yZSBpdCAqLworCisJcG9wbAklZWF4CQkJLyogcG9wIGNhcnJ5IGxpbWIgKi8KKworCXBvcGwJJWVieAorCXBvcGwJJWVzaQorCXBvcGwJJWVkaQorCXJldAorCitMZW5kMjoJc2hybAklY2wsJWVieAkJLyogY29tcHV0ZSBtb3N0IHNpZ25pZmljYW50IGxpbWIgKi8KKwltb3ZsCSVlYngsKCVlZGkpCQkvKiBzdG9yZSBpdCAqLworCisJcG9wbAklZWJ4CisJcG9wbAklZXNpCisJcG9wbAklZWRpCisJcmV0CisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvaTM4Ni9tcGloLXN1YjEuUyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvaTM4Ni9tcGloLXN1YjEuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDQ3ZjdhCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9pMzg2L21waWgtc3ViMS5TCkBAIC0wLDAgKzEsMTE3IEBACisvKiBpODAzODYgc3ViX24gLS0gU3ViIHR3byBsaW1iIHZlY3RvcnMgb2YgdGhlIHNhbWUgbGVuZ3RoID4gMCBhbmQgc3RvcmUKKyAqCQkgICBzdW0gaW4gYSB0aGlyZCBsaW1iIHZlY3Rvci4KKyAqCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NCwgMTk5NSwgMTk5OCwgCisgKiAgICAgICAgICAgICAgICAgICAgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKgorICogTm90ZTogVGhpcyBjb2RlIGlzIGhlYXZpbHkgYmFzZWQgb24gdGhlIEdOVSBNUCBMaWJyYXJ5LgorICoJIEFjdHVhbGx5IGl0J3MgdGhlIHNhbWUgY29kZSB3aXRoIG9ubHkgbWlub3IgY2hhbmdlcyBpbiB0aGUKKyAqCSB3YXkgdGhlIGRhdGEgaXMgc3RvcmVkOyB0aGlzIGlzIHRvIHN1cHBvcnQgdGhlIGFic3RyYWN0aW9uCisgKgkgb2YgYW4gb3B0aW9uYWwgc2VjdXJlIG1lbW9yeSBhbGxvY2F0aW9uIHdoaWNoIG1heSBiZSB1c2VkCisgKgkgdG8gYXZvaWQgcmV2ZWFsaW5nIG9mIHNlbnNpdGl2ZSBkYXRhIGR1ZSB0byBwYWdpbmcgZXRjLgorICovCisKKworI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImFzbS1zeW50YXguaCIKKworCisvKioqKioqKioqKioqKioqKioqKgorICogIG1waV9saW1iX3QKKyAqICBfZ2NyeV9tcGloX3N1Yl9uKCBtcGlfcHRyX3QgcmVzX3B0ciwJKHNwICsgNCkKKyAqCQkgICBtcGlfcHRyX3QgczFfcHRyLAkoc3AgKyA4KQorICoJCSAgIG1waV9wdHJfdCBzMl9wdHIsCShzcCArIDEyKQorICoJCSAgIG1waV9zaXplX3Qgc2l6ZSkJKHNwICsgMTYpCisgKi8KKworCisudGV4dAorCUFMSUdOICgzKQorCS5nbG9ibCBDX1NZTUJPTF9OQU1FKF9nY3J5X21waWhfc3ViX24pCitDX1NZTUJPTF9OQU1FKF9nY3J5X21waWhfc3ViX246KQorCXB1c2hsICVlZGkKKwlwdXNobCAlZXNpCisKKwltb3ZsIDEyKCVlc3ApLCVlZGkJCS8qIHJlc19wdHIgKi8KKwltb3ZsIDE2KCVlc3ApLCVlc2kJCS8qIHMxX3B0ciAqLworCW1vdmwgMjAoJWVzcCksJWVkeAkJLyogczJfcHRyICovCisJbW92bCAyNCglZXNwKSwlZWN4CQkvKiBzaXplICovCisKKwltb3ZsCSVlY3gsJWVheAorCXNocmwJJDMsJWVjeCAJCS8qIGNvbXB1dGUgY291bnQgZm9yIHVucm9sbGVkIGxvb3AgKi8KKwluZWdsCSVlYXgKKwlhbmRsCSQ3LCVlYXggCQkvKiBnZXQgaW5kZXggd2hlcmUgdG8gc3RhcnQgbG9vcCAqLworCWp6CUxvb3AJCQkvKiBuZWNlc3Nhcnkgc3BlY2lhbCBjYXNlIGZvciAwICovCisJaW5jbAklZWN4CQkJLyogYWRqdXN0IGxvb3AgY291bnQgKi8KKwlzaGxsCSQyLCVlYXggCQkvKiBhZGp1c3RtZW50IGZvciBwb2ludGVycy4uLiAqLworCXN1YmwJJWVheCwlZWRpCQkvKiAuLi4gc2luY2UgdGhleSBhcmUgb2Zmc2V0IC4uLiAqLworCXN1YmwJJWVheCwlZXNpCQkvKiAuLi4gYnkgYSBjb25zdGFudCB3aGVuIHdlIC4uLiAqLworCXN1YmwJJWVheCwlZWR4CQkvKiAuLi4gZW50ZXIgdGhlIGxvb3AgKi8KKwlzaHJsCSQyLCVlYXggCQkvKiByZXN0b3JlIHByZXZpb3VzIHZhbHVlICovCisjaWZkZWYgUElDCisvKiBDYWxjdWxhdGUgc3RhcnQgYWRkcmVzcyBpbiBsb29wIGZvciBQSUMuICBEdWUgdG8gbGltaXRhdGlvbnMgaW4gc29tZQorICAgYXNzZW1ibGVycywgTG9vcC1MMC0zIGNhbm5vdCBiZSBwdXQgaW50byB0aGUgbGVhbCAqLworCWNhbGwJTDAKK0wwOglsZWFsCSglZWF4LCVlYXgsOCksJWVheAorCWFkZGwJKCVlc3ApLCVlYXgKKwlhZGRsCSQoTG9vcC1MMC0zKSwlZWF4CisJYWRkbAkkNCwlZXNwCisjZWxzZQorLyogQ2FsY3VsYXRlIHN0YXJ0IGFkZHJlc3MgaW4gbG9vcCBmb3Igbm9uLVBJQy4gICovCisJbGVhbAkoTG9vcCAtIDMpKCVlYXgsJWVheCw4KSwlZWF4CisjZW5kaWYKKwlqbXAJKiVlYXgJCQkvKiBqdW1wIGludG8gbG9vcCAqLworCUFMSUdOICgzKQorTG9vcDoJbW92bAkoJWVzaSksJWVheAorCXNiYmwJKCVlZHgpLCVlYXgKKwltb3ZsCSVlYXgsKCVlZGkpCisJbW92bAk0KCVlc2kpLCVlYXgKKwlzYmJsCTQoJWVkeCksJWVheAorCW1vdmwJJWVheCw0KCVlZGkpCisJbW92bAk4KCVlc2kpLCVlYXgKKwlzYmJsCTgoJWVkeCksJWVheAorCW1vdmwJJWVheCw4KCVlZGkpCisJbW92bAkxMiglZXNpKSwlZWF4CisJc2JibAkxMiglZWR4KSwlZWF4CisJbW92bAklZWF4LDEyKCVlZGkpCisJbW92bAkxNiglZXNpKSwlZWF4CisJc2JibAkxNiglZWR4KSwlZWF4CisJbW92bAklZWF4LDE2KCVlZGkpCisJbW92bAkyMCglZXNpKSwlZWF4CisJc2JibAkyMCglZWR4KSwlZWF4CisJbW92bAklZWF4LDIwKCVlZGkpCisJbW92bAkyNCglZXNpKSwlZWF4CisJc2JibAkyNCglZWR4KSwlZWF4CisJbW92bAklZWF4LDI0KCVlZGkpCisJbW92bAkyOCglZXNpKSwlZWF4CisJc2JibAkyOCglZWR4KSwlZWF4CisJbW92bAklZWF4LDI4KCVlZGkpCisJbGVhbAkzMiglZWRpKSwlZWRpCisJbGVhbAkzMiglZXNpKSwlZXNpCisJbGVhbAkzMiglZWR4KSwlZWR4CisJZGVjbAklZWN4CisJam56CUxvb3AKKworCXNiYmwJJWVheCwlZWF4CisJbmVnbAklZWF4CisKKwlwb3BsICVlc2kKKwlwb3BsICVlZGkKKwlyZXQKKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9pMzg2L3N5bnRheC5oIGIvbGliZ2NyeXB0LTEuNC42L21waS9pMzg2L3N5bnRheC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZWRlOTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL2kzODYvc3ludGF4LmgKQEAgLTAsMCArMSw2OCBAQAorLyogc3ludGF4LmggLS0gRGVmaW5pdGlvbnMgZm9yIHg4NiBzeW50YXggdmFyaWF0aW9ucy4KKyAqCisgKiAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTQsIDE5OTUsIDE5OTgsIAorICogICAgICAgICAgICAgICAgICAgICAyMDAxLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqCisgKiBOb3RlOiBUaGlzIGNvZGUgaXMgaGVhdmlseSBiYXNlZCBvbiB0aGUgR05VIE1QIExpYnJhcnkuCisgKgkgQWN0dWFsbHkgaXQncyB0aGUgc2FtZSBjb2RlIHdpdGggb25seSBtaW5vciBjaGFuZ2VzIGluIHRoZQorICoJIHdheSB0aGUgZGF0YSBpcyBzdG9yZWQ7IHRoaXMgaXMgdG8gc3VwcG9ydCB0aGUgYWJzdHJhY3Rpb24KKyAqCSBvZiBhbiBvcHRpb25hbCBzZWN1cmUgbWVtb3J5IGFsbG9jYXRpb24gd2hpY2ggbWF5IGJlIHVzZWQKKyAqCSB0byBhdm9pZCByZXZlYWxpbmcgb2Ygc2Vuc2l0aXZlIGRhdGEgZHVlIHRvIHBhZ2luZyBldGMuCisgKi8KKworI3VuZGVmIEFMSUdOCisKKyNpZiBkZWZpbmVkIChCU0RfU1lOVEFYKSB8fCBkZWZpbmVkIChFTEZfU1lOVEFYKQorI2RlZmluZSBSKHIpICVyCisjZGVmaW5lIE1FTShiYXNlKShiYXNlKQorI2RlZmluZSBNRU1fRElTUChiYXNlLGRpc3BsYWNlbWVudClkaXNwbGFjZW1lbnQoUihiYXNlKSkKKyNkZWZpbmUgTUVNX0lOREVYKGJhc2UsaW5kZXgsc2l6ZSkoUihiYXNlKSxSKGluZGV4KSxzaXplKQorI2lmZGVmIF9fU1REQ19fCisjZGVmaW5lIElOU04xKG1uZW1vbmljLHNpemVfc3VmZml4LGRzdCltbmVtb25pYyMjc2l6ZV9zdWZmaXggZHN0CisjZGVmaW5lIElOU04yKG1uZW1vbmljLHNpemVfc3VmZml4LGRzdCxzcmMpbW5lbW9uaWMjI3NpemVfc3VmZml4IHNyYyxkc3QKKyNlbHNlCisjZGVmaW5lIElOU04xKG1uZW1vbmljLHNpemVfc3VmZml4LGRzdCltbmVtb25pYy8qKi9zaXplX3N1ZmZpeCBkc3QKKyNkZWZpbmUgSU5TTjIobW5lbW9uaWMsc2l6ZV9zdWZmaXgsZHN0LHNyYyltbmVtb25pYy8qKi9zaXplX3N1ZmZpeCBzcmMsZHN0CisjZW5kaWYKKyNkZWZpbmUgVEVYVCAudGV4dAorI2lmIGRlZmluZWQgKEJTRF9TWU5UQVgpCisjZGVmaW5lIEFMSUdOKGxvZykgLmFsaWduIGxvZworI2VuZGlmCisjaWYgZGVmaW5lZCAoRUxGX1NZTlRBWCkKKyNkZWZpbmUgQUxJR04obG9nKSAuYWxpZ24gMTw8KGxvZykKKyNlbmRpZgorI2RlZmluZSBHTE9CTCAuZ2xvYmwKKyNlbmRpZgorCisjaWZkZWYgSU5URUxfU1lOVEFYCisjZGVmaW5lIFIocikgcgorI2RlZmluZSBNRU0oYmFzZSlbYmFzZV0KKyNkZWZpbmUgTUVNX0RJU1AoYmFzZSxkaXNwbGFjZW1lbnQpW2Jhc2UrKGRpc3BsYWNlbWVudCldCisjZGVmaW5lIE1FTV9JTkRFWChiYXNlLGluZGV4LHNpemUpW2Jhc2UraW5kZXgqc2l6ZV0KKyNkZWZpbmUgSU5TTjEobW5lbW9uaWMsc2l6ZV9zdWZmaXgsZHN0KW1uZW1vbmljIGRzdAorI2RlZmluZSBJTlNOMihtbmVtb25pYyxzaXplX3N1ZmZpeCxkc3Qsc3JjKW1uZW1vbmljIGRzdCxzcmMKKyNkZWZpbmUgVEVYVCAudGV4dAorI2RlZmluZSBBTElHTihsb2cpIC5hbGlnbiBsb2cKKyNkZWZpbmUgR0xPQkwgLmdsb2JsCisjZW5kaWYKKworI2lmZGVmIFg4Nl9CUk9LRU5fQUxJR04KKyN1bmRlZiBBTElHTgorI2RlZmluZSBBTElHTihsb2cpIC5hbGlnbiBsb2csMHg5MAorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL2k1ODYvTWFuaWZlc3QgYi9saWJnY3J5cHQtMS40LjYvbXBpL2k1ODYvTWFuaWZlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQxZDdmOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvaTU4Ni9NYW5pZmVzdApAQCAtMCwwICsxLDI3IEBACisjIE1hbmlmZXN0IC0gY2hlY2tzdW1zIAorIyBDb3B5cmlnaHQgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorIworIyBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgZ2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKworbXBpaC1hZGQxLlMKK21waWgtbXVsMS5TCittcGloLW11bDIuUworbXBpaC1tdWwzLlMKK21waWgtbHNoaWZ0LlMKK21waWgtcnNoaWZ0LlMKK21waWgtc3ViMS5TCiskbmFtZXMkIGlRQ1ZBd1VBUCtMbVFERUFucDgzMlMvN0FRS0NtZ1FBaEcrRTdYMEtCNHFkVmYzc01iNlFyK0l2NUpsZWh6b3ViLzV2eFRSZ2VQS3pSdU9IaWRDblR6U1NveXpBKytVY0hyT2pIUVFETXNYbk82UHFwUzFkL1RLa3hqbkdON3JFOG12TVlsRkFUOFJzYXdUb3pTZmgxNG1DekkwSFREYmFLTDlaOHBjTUp0YWRCM1hxQXVxV0pOTzhreUVDSkZ3dXJ0M0RSV1hTV1M4PT1SdWc1CmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL2k1ODYvUkVBRE1FIGIvbGliZ2NyeXB0LTEuNC42L21waS9pNTg2L1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzNiMDgyCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9pNTg2L1JFQURNRQpAQCAtMCwwICsxLDI2IEBACitUaGlzIGRpcmVjdG9yeSBjb250YWlucyBtcG4gZnVuY3Rpb25zIG9wdGltaXplZCBmb3IgSW50ZWwgUGVudGl1bQorcHJvY2Vzc29ycy4KKworUkVMRVZBTlQgT1BUSU1JWkFUSU9OIElTU1VFUworCisxLiBQZW50aXVtIGRvZXNuJ3QgYWxsb2NhdGUgY2FjaGUgbGluZXMgb24gd3JpdGVzLCB1bmxpa2UgbW9zdCBvdGhlciBtb2Rlcm4KK3Byb2Nlc3NvcnMuICBTaW5jZSB0aGUgZnVuY3Rpb25zIGluIHRoZSBtcG4gY2xhc3MgZG8gYXJyYXkgd3JpdGVzLCB3ZSBoYXZlIHRvCitoYW5kbGUgYWxsb2NhdGluZyB0aGUgZGVzdGluYXRpb24gY2FjaGUgbGluZXMgYnkgcmVhZGluZyBhIHdvcmQgZnJvbSBpdCBpbiB0aGUKK2xvb3BzLCB0byBhY2hpZXZlIHRoZSBiZXN0IHBlcmZvcm1hbmNlLgorCisyLiBQYWlyaW5nIG9mIG1lbW9yeSBvcGVyYXRpb25zIHJlcXVpcmVzIHRoYXQgdGhlIHR3byBpc3N1ZWQgb3BlcmF0aW9ucyByZWZlcgordG8gZGlmZmVyZW50IGNhY2hlIGJhbmtzLiAgVGhlIHNpbXBsZXN0IHdheSB0byBpbnN1cmUgdGhpcyBpcyB0byByZWFkL3dyaXRlCit0d28gd29yZHMgZnJvbSB0aGUgc2FtZSBvYmplY3QuICBJZiB3ZSBtYWtlIG9wZXJhdGlvbnMgb24gZGlmZmVyZW50IG9iamVjdHMsCit0aGV5IG1pZ2h0IG9yIG1pZ2h0IG5vdCBiZSB0byB0aGUgc2FtZSBjYWNoZSBiYW5rLgorCitTVEFUVVMKKworMS4gbXBuX2xzaGlmdCBhbmQgbXBuX3JzaGlmdCBydW4gYXQgYWJvdXQgNiBjeWNsZXMvbGltYiwgYnV0IHRoZSBQZW50aXVtCitkb2N1bWVudGF0aW9uIGluZGljYXRlcyB0aGF0IHRoZXkgc2hvdWxkIHRha2Ugb25seSA0My84ID0gNS4zNzUgY3ljbGVzL2xpbWIsCitvciA1IGN5Y2xlcy9saW1iIGFzeW1wdG90aWNhbGx5LgorCisyLiBtcG5fYWRkX24gYW5kIG1wbl9zdWJfbiBydW4gYXQgYXN5bXB0b3RpY2FsbHkgMiBjeWNsZXMvbGltYi4gIER1ZSB0byBsb29wCitvdmVyaGVhZCBhbmQgb3RoZXIgZGVsYXlzIChjYWNoZSByZWZpbGw/KSwgdGhleSBydW4gYXQgb3IgbmVhciAyLjUgY3ljbGVzL2xpbWIuCisKKzMuIG1wbl9tdWxfMSwgbXBuX2FkZG11bF8xLCBtcG5fc3VibXVsXzEgYWxsIHJ1biAxIGN5Y2xlIGZhc3RlciB0aGFuIHRoZXkKK3Nob3VsZC4uLgpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9pNTg2L2Rpc3RmaWxlcyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvaTU4Ni9kaXN0ZmlsZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ2Zjc3NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvaTU4Ni9kaXN0ZmlsZXMKQEAgLTAsMCArMSwxMCBAQAorTWFuaWZlc3QKK21waWgtYWRkMS5TCittcGloLW11bDEuUworbXBpaC1tdWwyLlMKK21waWgtbXVsMy5TCittcGloLWxzaGlmdC5TCittcGloLXJzaGlmdC5TCittcGloLXN1YjEuUworUkVBRE1FCisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvaTU4Ni9tcGloLWFkZDEuUyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvaTU4Ni9tcGloLWFkZDEuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDM2ZDU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9pNTg2L21waWgtYWRkMS5TCkBAIC0wLDAgKzEsMTM1IEBACisvKiBpODA1ODYgYWRkX24gLS0gQWRkIHR3byBsaW1iIHZlY3RvcnMgb2YgdGhlIHNhbWUgbGVuZ3RoID4gMCBhbmQgc3RvcmUKKyAqCQkgICBzdW0gaW4gYSB0aGlyZCBsaW1iIHZlY3Rvci4KKyAqCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NCwgMTk5NSwgMTk5NiwgMTk5OCwKKyAqICAgICAgICAgICAgICAgICAgICAyMDAxLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqLworCisKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJhc20tc3ludGF4LmgiCisKKworLyoqKioqKioqKioqKioqKioqKioKKyAqICBtcGlfbGltYl90CisgKiAgX2djcnlfbXBpaF9hZGRfbiggbXBpX3B0cl90IHJlc19wdHIsCShzcCArIDQpCisgKgkJICAgbXBpX3B0cl90IHMxX3B0ciwJKHNwICsgOCkKKyAqCQkgICBtcGlfcHRyX3QgczJfcHRyLAkoc3AgKyAxMikKKyAqCQkgICBtcGlfc2l6ZV90IHNpemUpCShzcCArIDE2KQorICovCisKKy50ZXh0CisJQUxJR04gKDMpCisJLmdsb2JsIENfU1lNQk9MX05BTUUoX2djcnlfbXBpaF9hZGRfbikKK0NfU1lNQk9MX05BTUUoX2djcnlfbXBpaF9hZGRfbjopCisJcHVzaGwJJWVkaQorCXB1c2hsCSVlc2kKKwlwdXNobAklZWJ4CisJcHVzaGwJJWVicAorCisJbW92bAkyMCglZXNwKSwlZWRpCQkvKiByZXNfcHRyICovCisJbW92bAkyNCglZXNwKSwlZXNpCQkvKiBzMV9wdHIgKi8KKwltb3ZsCTI4KCVlc3ApLCVlYnAJCS8qIHMyX3B0ciAqLworCW1vdmwJMzIoJWVzcCksJWVjeAkJLyogc2l6ZSAqLworCisJbW92bAkoJWVicCksJWVieAorCisJZGVjbAklZWN4CisJbW92bAklZWN4LCVlZHgKKwlzaHJsCSQzLCVlY3gKKwlhbmRsCSQ3LCVlZHgKKwl0ZXN0bAklZWN4LCVlY3gJCS8qIHplcm8gY2FycnkgZmxhZyAqLworCWp6CUxlbmQKKwlwdXNobAklZWR4CisKKwlBTElHTiAoMykKK0xvb3A6CW1vdmwJMjgoJWVkaSksJWVheAkJLyogZmV0Y2ggZGVzdGluYXRpb24gY2FjaGUgbGluZSAqLworCWxlYWwJMzIoJWVkaSksJWVkaQorCitMMToJbW92bAkoJWVzaSksJWVheAorCW1vdmwJNCglZXNpKSwlZWR4CisJYWRjbAklZWJ4LCVlYXgKKwltb3ZsCTQoJWVicCksJWVieAorCWFkY2wJJWVieCwlZWR4CisJbW92bAk4KCVlYnApLCVlYngKKwltb3ZsCSVlYXgsLTMyKCVlZGkpCisJbW92bAklZWR4LC0yOCglZWRpKQorCitMMjoJbW92bAk4KCVlc2kpLCVlYXgKKwltb3ZsCTEyKCVlc2kpLCVlZHgKKwlhZGNsCSVlYngsJWVheAorCW1vdmwJMTIoJWVicCksJWVieAorCWFkY2wJJWVieCwlZWR4CisJbW92bAkxNiglZWJwKSwlZWJ4CisJbW92bAklZWF4LC0yNCglZWRpKQorCW1vdmwJJWVkeCwtMjAoJWVkaSkKKworTDM6CW1vdmwJMTYoJWVzaSksJWVheAorCW1vdmwJMjAoJWVzaSksJWVkeAorCWFkY2wJJWVieCwlZWF4CisJbW92bAkyMCglZWJwKSwlZWJ4CisJYWRjbAklZWJ4LCVlZHgKKwltb3ZsCTI0KCVlYnApLCVlYngKKwltb3ZsCSVlYXgsLTE2KCVlZGkpCisJbW92bAklZWR4LC0xMiglZWRpKQorCitMNDoJbW92bAkyNCglZXNpKSwlZWF4CisJbW92bAkyOCglZXNpKSwlZWR4CisJYWRjbAklZWJ4LCVlYXgKKwltb3ZsCTI4KCVlYnApLCVlYngKKwlhZGNsCSVlYngsJWVkeAorCW1vdmwJMzIoJWVicCksJWVieAorCW1vdmwJJWVheCwtOCglZWRpKQorCW1vdmwJJWVkeCwtNCglZWRpKQorCisJbGVhbAkzMiglZXNpKSwlZXNpCisJbGVhbAkzMiglZWJwKSwlZWJwCisJZGVjbAklZWN4CisJam56CUxvb3AKKworCXBvcGwJJWVkeAorTGVuZDoKKwlkZWNsCSVlZHgJCQkvKiB0ZXN0ICVlZHggdy9vIGNsb2JiZXJpbmcgY2FycnkgKi8KKwlqcwlMZW5kMgorCWluY2wJJWVkeAorTG9vcDI6CisJbGVhbAk0KCVlZGkpLCVlZGkKKwltb3ZsCSglZXNpKSwlZWF4CisJYWRjbAklZWJ4LCVlYXgKKwltb3ZsCTQoJWVicCksJWVieAorCW1vdmwJJWVheCwtNCglZWRpKQorCWxlYWwJNCglZXNpKSwlZXNpCisJbGVhbAk0KCVlYnApLCVlYnAKKwlkZWNsCSVlZHgKKwlqbnoJTG9vcDIKK0xlbmQyOgorCW1vdmwJKCVlc2kpLCVlYXgKKwlhZGNsCSVlYngsJWVheAorCW1vdmwJJWVheCwoJWVkaSkKKworCXNiYmwJJWVheCwlZWF4CisJbmVnbAklZWF4CisKKwlwb3BsCSVlYnAKKwlwb3BsCSVlYngKKwlwb3BsCSVlc2kKKwlwb3BsCSVlZGkKKwlyZXQKKworCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL2k1ODYvbXBpaC1sc2hpZnQuUyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvaTU4Ni9tcGloLWxzaGlmdC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMjVmZTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL2k1ODYvbXBpaC1sc2hpZnQuUwpAQCAtMCwwICsxLDIyOSBAQAorLyogaTgwNTg2ICAgbHNoaWZ0CisgKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTQsIDE5OTgsIAorICogICAgICAgICAgICAgICAgICAgIDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICoKKyAqIE5vdGU6IFRoaXMgY29kZSBpcyBoZWF2aWx5IGJhc2VkIG9uIHRoZSBHTlUgTVAgTGlicmFyeS4KKyAqCSBBY3R1YWxseSBpdCdzIHRoZSBzYW1lIGNvZGUgd2l0aCBvbmx5IG1pbm9yIGNoYW5nZXMgaW4gdGhlCisgKgkgd2F5IHRoZSBkYXRhIGlzIHN0b3JlZDsgdGhpcyBpcyB0byBzdXBwb3J0IHRoZSBhYnN0cmFjdGlvbgorICoJIG9mIGFuIG9wdGlvbmFsIHNlY3VyZSBtZW1vcnkgYWxsb2NhdGlvbiB3aGljaCBtYXkgYmUgdXNlZAorICoJIHRvIGF2b2lkIHJldmVhbGluZyBvZiBzZW5zaXRpdmUgZGF0YSBkdWUgdG8gcGFnaW5nIGV0Yy4KKyAqLworCisKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJhc20tc3ludGF4LmgiCisKKworLyoqKioqKioqKioqKioqKioqKioKKyAqIG1waV9saW1iX3QKKyAqIF9nY3J5X21waWhfbHNoaWZ0KCBtcGlfcHRyX3Qgd3AsCShzcCArIDQpCisgKgkJICAgbXBpX3B0cl90IHVwLAkoc3AgKyA4KQorICoJCSAgIG1waV9zaXplX3QgdXNpemUsCShzcCArIDEyKQorICoJCSAgIHVuc2lnbmVkIGNudCkJKHNwICsgMTYpCisgKi8KKworLnRleHQKKwlBTElHTiAoMykKKwkuZ2xvYmwgQ19TWU1CT0xfTkFNRShfZ2NyeV9tcGloX2xzaGlmdCkKK0NfU1lNQk9MX05BTUUoX2djcnlfbXBpaF9sc2hpZnQ6KQorCisJcHVzaGwJJWVkaQorCXB1c2hsCSVlc2kKKwlwdXNobAklZWJ4CisJcHVzaGwJJWVicAorCisJbW92bAkyMCglZXNwKSwlZWRpCQkvKiByZXNfcHRyICovCisJbW92bAkyNCglZXNwKSwlZXNpCQkvKiBzX3B0ciAqLworCW1vdmwJMjgoJWVzcCksJWVicAkJLyogc2l6ZSAqLworCW1vdmwJMzIoJWVzcCksJWVjeAkJLyogY250ICovCisKKy8qIFdlIGNhbiB1c2UgZmFzdGVyIGNvZGUgZm9yIHNoaWZ0LWJ5LTEgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zLiAgKi8KKwljbXAJJDEsJWVjeAorCWpuZQlMbm9ybWFsCisJbGVhbAk0KCVlc2kpLCVlYXgKKwljbXBsCSVlZGksJWVheAorCWpuYwlMc3BlY2lhbAkJLyoganVtcCBpZiBzX3B0ciArIDEgPj0gcmVzX3B0ciAqLworCWxlYWwJKCVlc2ksJWVicCw0KSwlZWF4CisJY21wbAklZWF4LCVlZGkKKwlqbmMJTHNwZWNpYWwJCS8qIGp1bXAgaWYgcmVzX3B0ciA+PSBzX3B0ciArIHNpemUgKi8KKworTG5vcm1hbDoKKwlsZWFsCS00KCVlZGksJWVicCw0KSwlZWRpCisJbGVhbAktNCglZXNpLCVlYnAsNCksJWVzaQorCisJbW92bAkoJWVzaSksJWVkeAorCXN1YmwJJDQsJWVzaQorCXhvcmwJJWVheCwlZWF4CisJc2hsZGwJJWNsLCVlZHgsJWVheAkJLyogY29tcHV0ZSBjYXJyeSBsaW1iICovCisJcHVzaGwJJWVheAkJCS8qIHB1c2ggY2FycnkgbGltYiBvbnRvIHN0YWNrICovCisKKwlkZWNsCSVlYnAKKwlwdXNobAklZWJwCisJc2hybAkkMywlZWJwCisJanoJTGVuZAorCisJbW92bAkoJWVkaSksJWVheAkJLyogZmV0Y2ggZGVzdGluYXRpb24gY2FjaGUgbGluZSAqLworCisJQUxJR04JKDIpCitMb29wOgltb3ZsCS0yOCglZWRpKSwlZWF4CQkvKiBmZXRjaCBkZXN0aW5hdGlvbiBjYWNoZSBsaW5lICovCisJbW92bAklZWR4LCVlYngKKworCW1vdmwJKCVlc2kpLCVlYXgKKwltb3ZsCS00KCVlc2kpLCVlZHgKKwlzaGxkbAklY2wsJWVheCwlZWJ4CisJc2hsZGwJJWNsLCVlZHgsJWVheAorCW1vdmwJJWVieCwoJWVkaSkKKwltb3ZsCSVlYXgsLTQoJWVkaSkKKworCW1vdmwJLTgoJWVzaSksJWVieAorCW1vdmwJLTEyKCVlc2kpLCVlYXgKKwlzaGxkbAklY2wsJWVieCwlZWR4CisJc2hsZGwJJWNsLCVlYXgsJWVieAorCW1vdmwJJWVkeCwtOCglZWRpKQorCW1vdmwJJWVieCwtMTIoJWVkaSkKKworCW1vdmwJLTE2KCVlc2kpLCVlZHgKKwltb3ZsCS0yMCglZXNpKSwlZWJ4CisJc2hsZGwJJWNsLCVlZHgsJWVheAorCXNobGRsCSVjbCwlZWJ4LCVlZHgKKwltb3ZsCSVlYXgsLTE2KCVlZGkpCisJbW92bAklZWR4LC0yMCglZWRpKQorCisJbW92bAktMjQoJWVzaSksJWVheAorCW1vdmwJLTI4KCVlc2kpLCVlZHgKKwlzaGxkbAklY2wsJWVheCwlZWJ4CisJc2hsZGwJJWNsLCVlZHgsJWVheAorCW1vdmwJJWVieCwtMjQoJWVkaSkKKwltb3ZsCSVlYXgsLTI4KCVlZGkpCisKKwlzdWJsCSQzMiwlZXNpCisJc3VibAkkMzIsJWVkaQorCWRlY2wJJWVicAorCWpueglMb29wCisKK0xlbmQ6CXBvcGwJJWVicAorCWFuZGwJJDcsJWVicAorCWp6CUxlbmQyCitMb29wMjoJbW92bAkoJWVzaSksJWVheAorCXNobGRsCSVjbCwlZWF4LCVlZHgKKwltb3ZsCSVlZHgsKCVlZGkpCisJbW92bAklZWF4LCVlZHgKKwlzdWJsCSQ0LCVlc2kKKwlzdWJsCSQ0LCVlZGkKKwlkZWNsCSVlYnAKKwlqbnoJTG9vcDIKKworTGVuZDI6CXNobGwJJWNsLCVlZHgJCS8qIGNvbXB1dGUgbGVhc3Qgc2lnbmlmaWNhbnQgbGltYiAqLworCW1vdmwJJWVkeCwoJWVkaSkJCS8qIHN0b3JlIGl0ICovCisKKwlwb3BsCSVlYXgJCQkvKiBwb3AgY2FycnkgbGltYiAqLworCisJcG9wbAklZWJwCisJcG9wbAklZWJ4CisJcG9wbAklZXNpCisJcG9wbAklZWRpCisJcmV0CisKKy8qIFdlIGxvb3AgZnJvbSBsZWFzdCBzaWduaWZpY2FudCBlbmQgb2YgdGhlIGFycmF5cywgd2hpY2ggaXMgb25seQorICAgcGVybWlzc2FibGUgaWYgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZG9uJ3Qgb3ZlcmxhcCwgc2luY2UgdGhlCisgICBmdW5jdGlvbiBpcyBkb2N1bWVudGVkIHRvIHdvcmsgZm9yIG92ZXJsYXBwaW5nIHNvdXJjZSBhbmQgZGVzdGluYXRpb24uCisqLworCitMc3BlY2lhbDoKKwltb3ZsCSglZXNpKSwlZWR4CisJYWRkbAkkNCwlZXNpCisKKwlkZWNsCSVlYnAKKwlwdXNobAklZWJwCisJc2hybAkkMywlZWJwCisKKwlhZGRsCSVlZHgsJWVkeAorCWluY2wJJWVicAorCWRlY2wJJWVicAorCWp6CUxMZW5kCisKKwltb3ZsCSglZWRpKSwlZWF4CQkvKiBmZXRjaCBkZXN0aW5hdGlvbiBjYWNoZSBsaW5lICovCisKKwlBTElHTgkoMikKK0xMb29wOgltb3ZsCTI4KCVlZGkpLCVlYXgJCS8qIGZldGNoIGRlc3RpbmF0aW9uIGNhY2hlIGxpbmUgKi8KKwltb3ZsCSVlZHgsJWVieAorCisJbW92bAkoJWVzaSksJWVheAorCW1vdmwJNCglZXNpKSwlZWR4CisJYWRjbAklZWF4LCVlYXgKKwltb3ZsCSVlYngsKCVlZGkpCisJYWRjbAklZWR4LCVlZHgKKwltb3ZsCSVlYXgsNCglZWRpKQorCisJbW92bAk4KCVlc2kpLCVlYngKKwltb3ZsCTEyKCVlc2kpLCVlYXgKKwlhZGNsCSVlYngsJWVieAorCW1vdmwJJWVkeCw4KCVlZGkpCisJYWRjbAklZWF4LCVlYXgKKwltb3ZsCSVlYngsMTIoJWVkaSkKKworCW1vdmwJMTYoJWVzaSksJWVkeAorCW1vdmwJMjAoJWVzaSksJWVieAorCWFkY2wJJWVkeCwlZWR4CisJbW92bAklZWF4LDE2KCVlZGkpCisJYWRjbAklZWJ4LCVlYngKKwltb3ZsCSVlZHgsMjAoJWVkaSkKKworCW1vdmwJMjQoJWVzaSksJWVheAorCW1vdmwJMjgoJWVzaSksJWVkeAorCWFkY2wJJWVheCwlZWF4CisJbW92bAklZWJ4LDI0KCVlZGkpCisJYWRjbAklZWR4LCVlZHgKKwltb3ZsCSVlYXgsMjgoJWVkaSkKKworCWxlYWwJMzIoJWVzaSksJWVzaQkJLyogdXNlIGxlYWwgbm90IHRvIGNsb2JiZXIgY2FycnkgKi8KKwlsZWFsCTMyKCVlZGkpLCVlZGkKKwlkZWNsCSVlYnAKKwlqbnoJTExvb3AKKworTExlbmQ6CXBvcGwJJWVicAorCXNiYmwJJWVheCwlZWF4CQkvKiBzYXZlIGNhcnJ5IGluICVlYXggKi8KKwlhbmRsCSQ3LCVlYnAKKwlqeglMTGVuZDIKKwlhZGRsCSVlYXgsJWVheAkJLyogcmVzdG9yZSBjYXJyeSBmcm9tIGVheCAqLworTExvb3AyOiBtb3ZsCSVlZHgsJWVieAorCW1vdmwJKCVlc2kpLCVlZHgKKwlhZGNsCSVlZHgsJWVkeAorCW1vdmwJJWVieCwoJWVkaSkKKworCWxlYWwJNCglZXNpKSwlZXNpCQkvKiB1c2UgbGVhbCBub3QgdG8gY2xvYmJlciBjYXJyeSAqLworCWxlYWwJNCglZWRpKSwlZWRpCisJZGVjbAklZWJwCisJam56CUxMb29wMgorCisJam1wCUxMMQorTExlbmQyOiBhZGRsCSVlYXgsJWVheAkJLyogcmVzdG9yZSBjYXJyeSBmcm9tIGVheCAqLworTEwxOgltb3ZsCSVlZHgsKCVlZGkpCQkvKiBzdG9yZSBsYXN0IGxpbWIgKi8KKworCXNiYmwJJWVheCwlZWF4CisJbmVnbAklZWF4CisKKwlwb3BsCSVlYnAKKwlwb3BsCSVlYngKKwlwb3BsCSVlc2kKKwlwb3BsCSVlZGkKKwlyZXQKKworCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL2k1ODYvbXBpaC1tdWwxLlMgYi9saWJnY3J5cHQtMS40LjYvbXBpL2k1ODYvbXBpaC1tdWwxLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYwMWQ5NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvaTU4Ni9tcGloLW11bDEuUwpAQCAtMCwwICsxLDg5IEBACisvKiBpODA1ODYgbXVsXzEgLS0gTXVsdGlwbHkgYSBsaW1iIHZlY3RvciB3aXRoIGEgbGltYiBhbmQgc3RvcmUKKyAqCQkJIHRoZSByZXN1bHQgaW4gYSBzZWNvbmQgbGltYiB2ZWN0b3IuCisgKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTQsIDE5OTYsIDE5OTgsCisgKiAgICAgICAgICAgICAgICAgICAgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKgorICogTm90ZTogVGhpcyBjb2RlIGlzIGhlYXZpbHkgYmFzZWQgb24gdGhlIEdOVSBNUCBMaWJyYXJ5LgorICoJIEFjdHVhbGx5IGl0J3MgdGhlIHNhbWUgY29kZSB3aXRoIG9ubHkgbWlub3IgY2hhbmdlcyBpbiB0aGUKKyAqCSB3YXkgdGhlIGRhdGEgaXMgc3RvcmVkOyB0aGlzIGlzIHRvIHN1cHBvcnQgdGhlIGFic3RyYWN0aW9uCisgKgkgb2YgYW4gb3B0aW9uYWwgc2VjdXJlIG1lbW9yeSBhbGxvY2F0aW9uIHdoaWNoIG1heSBiZSB1c2VkCisgKgkgdG8gYXZvaWQgcmV2ZWFsaW5nIG9mIHNlbnNpdGl2ZSBkYXRhIGR1ZSB0byBwYWdpbmcgZXRjLgorICovCisKKworI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImFzbS1zeW50YXguaCIKKworCisvKioqKioqKioqKioqKioqKioqKgorICogbXBpX2xpbWJfdAorICogX2djcnlfbXBpaF9tdWxfMSggbXBpX3B0cl90IHJlc19wdHIsCShzcCArIDQpCisgKgkJICBtcGlfcHRyX3QgczFfcHRyLAkoc3AgKyA4KQorICoJCSAgbXBpX3NpemVfdCBzMV9zaXplLAkoc3AgKyAxMikKKyAqCQkgIG1waV9saW1iX3QgczJfbGltYikJKHNwICsgMTYpCisgKi8KKworI2RlZmluZSByZXNfcHRyIGVkaQorI2RlZmluZSBzMV9wdHIJZXNpCisjZGVmaW5lIHNpemUJZWN4CisjZGVmaW5lIHMyX2xpbWIgZWJwCisKKwlURVhUCisJQUxJR04gKDMpCisJR0xPQkwJQ19TWU1CT0xfTkFNRShfZ2NyeV9tcGloX211bF8xKQorQ19TWU1CT0xfTkFNRShfZ2NyeV9tcGloX211bF8xOikKKworCUlOU04xKHB1c2gsbAksUihlZGkpKQorCUlOU04xKHB1c2gsbAksUihlc2kpKQorCUlOU04xKHB1c2gsbAksUihlYngpKQorCUlOU04xKHB1c2gsbAksUihlYnApKQorCisJSU5TTjIobW92LGwJLFIocmVzX3B0ciksTUVNX0RJU1AoZXNwLDIwKSkKKwlJTlNOMihtb3YsbAksUihzMV9wdHIpLE1FTV9ESVNQKGVzcCwyNCkpCisJSU5TTjIobW92LGwJLFIoc2l6ZSksTUVNX0RJU1AoZXNwLDI4KSkKKwlJTlNOMihtb3YsbAksUihzMl9saW1iKSxNRU1fRElTUChlc3AsMzIpKQorCisJSU5TTjIobGVhLGwJLFIocmVzX3B0ciksTUVNX0lOREVYKHJlc19wdHIsc2l6ZSw0KSkKKwlJTlNOMihsZWEsbAksUihzMV9wdHIpLE1FTV9JTkRFWChzMV9wdHIsc2l6ZSw0KSkKKwlJTlNOMShuZWcsbAksUihzaXplKSkKKwlJTlNOMih4b3IsbAksUihlYngpLFIoZWJ4KSkKKwlBTElHTiAoMykKKworTG9vcDoJSU5TTjIoYWRjLGwJLFIoZWJ4KSwkMCkKKwlJTlNOMihtb3YsbAksUihlYXgpLE1FTV9JTkRFWChzMV9wdHIsc2l6ZSw0KSkKKworCUlOU04xKG11bCxsCSxSKHMyX2xpbWIpKQorCisJSU5TTjIoYWRkLGwJLFIoZWJ4KSxSKGVheCkpCisKKwlJTlNOMihtb3YsbAksTUVNX0lOREVYKHJlc19wdHIsc2l6ZSw0KSxSKGVieCkpCisJSU5TTjEoaW5jLGwJLFIoc2l6ZSkpCisKKwlJTlNOMihtb3YsbAksUihlYngpLFIoZWR4KSkKKwlJTlNOMShqbnosCSxMb29wKQorCisJSU5TTjIoYWRjLGwJLFIoZWJ4KSwkMCkKKwlJTlNOMihtb3YsbAksUihlYXgpLFIoZWJ4KSkKKwlJTlNOMShwb3AsbAksUihlYnApKQorCUlOU04xKHBvcCxsCSxSKGVieCkpCisJSU5TTjEocG9wLGwJLFIoZXNpKSkKKwlJTlNOMShwb3AsbAksUihlZGkpKQorCXJldAorCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL2k1ODYvbXBpaC1tdWwyLlMgYi9saWJnY3J5cHQtMS40LjYvbXBpL2k1ODYvbXBpaC1tdWwyLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMyZDM2MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvaTU4Ni9tcGloLW11bDIuUwpAQCAtMCwwICsxLDkzIEBACisvKiBpODA1ODYgYWRkbXVsXzEgLS0gTXVsdGlwbHkgYSBsaW1iIHZlY3RvciB3aXRoIGEgbGltYiBhbmQgYWRkCisgKgkJICAgICAgdGhlIHJlc3VsdCB0byBhIHNlY29uZCBsaW1iIHZlY3Rvci4KKyAqCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NCwgMTk5OCwgCisgKiAgICAgICAgICAgICAgICAgICAgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKgorICogTm90ZTogVGhpcyBjb2RlIGlzIGhlYXZpbHkgYmFzZWQgb24gdGhlIEdOVSBNUCBMaWJyYXJ5LgorICoJIEFjdHVhbGx5IGl0J3MgdGhlIHNhbWUgY29kZSB3aXRoIG9ubHkgbWlub3IgY2hhbmdlcyBpbiB0aGUKKyAqCSB3YXkgdGhlIGRhdGEgaXMgc3RvcmVkOyB0aGlzIGlzIHRvIHN1cHBvcnQgdGhlIGFic3RyYWN0aW9uCisgKgkgb2YgYW4gb3B0aW9uYWwgc2VjdXJlIG1lbW9yeSBhbGxvY2F0aW9uIHdoaWNoIG1heSBiZSB1c2VkCisgKgkgdG8gYXZvaWQgcmV2ZWFsaW5nIG9mIHNlbnNpdGl2ZSBkYXRhIGR1ZSB0byBwYWdpbmcgZXRjLgorICovCisKKworI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImFzbS1zeW50YXguaCIKKworCisvKioqKioqKioqKioqKioqKioqKgorICogbXBpX2xpbWJfdAorICogX2djcnlfbXBpaF9hZGRtdWxfMSggbXBpX3B0cl90IHJlc19wdHIsICAgICAgKHNwICsgNCkKKyAqCQkgICAgIG1waV9wdHJfdCBzMV9wdHIsCSAgICAgKHNwICsgOCkKKyAqCQkgICAgIG1waV9zaXplX3QgczFfc2l6ZSwgICAgIChzcCArIDEyKQorICoJCSAgICAgbXBpX2xpbWJfdCBzMl9saW1iKSAgICAgKHNwICsgMTYpCisgKi8KKworI2RlZmluZSByZXNfcHRyIGVkaQorI2RlZmluZSBzMV9wdHIJZXNpCisjZGVmaW5lIHNpemUJZWN4CisjZGVmaW5lIHMyX2xpbWIgZWJwCisKKwlURVhUCisJQUxJR04gKDMpCisJR0xPQkwJQ19TWU1CT0xfTkFNRShfZ2NyeV9tcGloX2FkZG11bF8xKQorQ19TWU1CT0xfTkFNRShfZ2NyeV9tcGloX2FkZG11bF8xOikKKworCUlOU04xKHB1c2gsbAksUihlZGkpKQorCUlOU04xKHB1c2gsbAksUihlc2kpKQorCUlOU04xKHB1c2gsbAksUihlYngpKQorCUlOU04xKHB1c2gsbAksUihlYnApKQorCisJSU5TTjIobW92LGwJLFIocmVzX3B0ciksTUVNX0RJU1AoZXNwLDIwKSkKKwlJTlNOMihtb3YsbAksUihzMV9wdHIpLE1FTV9ESVNQKGVzcCwyNCkpCisJSU5TTjIobW92LGwJLFIoc2l6ZSksTUVNX0RJU1AoZXNwLDI4KSkKKwlJTlNOMihtb3YsbAksUihzMl9saW1iKSxNRU1fRElTUChlc3AsMzIpKQorCisJSU5TTjIobGVhLGwJLFIocmVzX3B0ciksTUVNX0lOREVYKHJlc19wdHIsc2l6ZSw0KSkKKwlJTlNOMihsZWEsbAksUihzMV9wdHIpLE1FTV9JTkRFWChzMV9wdHIsc2l6ZSw0KSkKKwlJTlNOMShuZWcsbAksUihzaXplKSkKKwlJTlNOMih4b3IsbAksUihlYngpLFIoZWJ4KSkKKwlBTElHTiAoMykKKworTG9vcDoJSU5TTjIoYWRjLGwJLFIoZWJ4KSwkMCkKKwlJTlNOMihtb3YsbAksUihlYXgpLE1FTV9JTkRFWChzMV9wdHIsc2l6ZSw0KSkKKworCUlOU04xKG11bCxsCSxSKHMyX2xpbWIpKQorCisJSU5TTjIoYWRkLGwJLFIoZWF4KSxSKGVieCkpCisJSU5TTjIobW92LGwJLFIoZWJ4KSxNRU1fSU5ERVgocmVzX3B0cixzaXplLDQpKQorCisJSU5TTjIoYWRjLGwJLFIoZWR4KSwkMCkKKwlJTlNOMihhZGQsbAksUihlYngpLFIoZWF4KSkKKworCUlOU04yKG1vdixsCSxNRU1fSU5ERVgocmVzX3B0cixzaXplLDQpLFIoZWJ4KSkKKwlJTlNOMShpbmMsbAksUihzaXplKSkKKworCUlOU04yKG1vdixsCSxSKGVieCksUihlZHgpKQorCUlOU04xKGpueiwJLExvb3ApCisKKwlJTlNOMihhZGMsbAksUihlYngpLCQwKQorCUlOU04yKG1vdixsCSxSKGVheCksUihlYngpKQorCUlOU04xKHBvcCxsCSxSKGVicCkpCisJSU5TTjEocG9wLGwJLFIoZWJ4KSkKKwlJTlNOMShwb3AsbAksUihlc2kpKQorCUlOU04xKHBvcCxsCSxSKGVkaSkpCisJcmV0CisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvaTU4Ni9tcGloLW11bDMuUyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvaTU4Ni9tcGloLW11bDMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTI3ZDRlCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9pNTg2L21waWgtbXVsMy5TCkBAIC0wLDAgKzEsOTMgQEAKKy8qIGk4MDU4NiBzdWJtdWxfMSAtLSBNdWx0aXBseSBhIGxpbWIgdmVjdG9yIHdpdGggYSBsaW1iIGFuZCBhZGQKKyAqCQkgICAgICB0aGUgcmVzdWx0IHRvIGEgc2Vjb25kIGxpbWIgdmVjdG9yLgorICoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk0LCAxOTk4LAorICogICAgICAgICAgICAgICAgICAgIDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICoKKyAqIE5vdGU6IFRoaXMgY29kZSBpcyBoZWF2aWx5IGJhc2VkIG9uIHRoZSBHTlUgTVAgTGlicmFyeS4KKyAqCSBBY3R1YWxseSBpdCdzIHRoZSBzYW1lIGNvZGUgd2l0aCBvbmx5IG1pbm9yIGNoYW5nZXMgaW4gdGhlCisgKgkgd2F5IHRoZSBkYXRhIGlzIHN0b3JlZDsgdGhpcyBpcyB0byBzdXBwb3J0IHRoZSBhYnN0cmFjdGlvbgorICoJIG9mIGFuIG9wdGlvbmFsIHNlY3VyZSBtZW1vcnkgYWxsb2NhdGlvbiB3aGljaCBtYXkgYmUgdXNlZAorICoJIHRvIGF2b2lkIHJldmVhbGluZyBvZiBzZW5zaXRpdmUgZGF0YSBkdWUgdG8gcGFnaW5nIGV0Yy4KKyAqLworCisKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJhc20tc3ludGF4LmgiCisKKworLyoqKioqKioqKioqKioqKioqKioKKyAqIG1waV9saW1iX3QKKyAqIF9nY3J5X21waWhfc3VibXVsXzEoIG1waV9wdHJfdCByZXNfcHRyLCAgICAgIChzcCArIDQpCisgKgkJICAgICBtcGlfcHRyX3QgczFfcHRyLAkgICAgIChzcCArIDgpCisgKgkJICAgICBtcGlfc2l6ZV90IHMxX3NpemUsICAgICAoc3AgKyAxMikKKyAqCQkgICAgIG1waV9saW1iX3QgczJfbGltYikgICAgIChzcCArIDE2KQorICovCisKKyNkZWZpbmUgcmVzX3B0ciBlZGkKKyNkZWZpbmUgczFfcHRyCWVzaQorI2RlZmluZSBzaXplCWVjeAorI2RlZmluZSBzMl9saW1iIGVicAorCisJVEVYVAorCUFMSUdOICgzKQorCUdMT0JMCUNfU1lNQk9MX05BTUUoX2djcnlfbXBpaF9zdWJtdWxfMSkKK0NfU1lNQk9MX05BTUUoX2djcnlfbXBpaF9zdWJtdWxfMTopCisKKwlJTlNOMShwdXNoLGwJLFIoZWRpKSkKKwlJTlNOMShwdXNoLGwJLFIoZXNpKSkKKwlJTlNOMShwdXNoLGwJLFIoZWJ4KSkKKwlJTlNOMShwdXNoLGwJLFIoZWJwKSkKKworCUlOU04yKG1vdixsCSxSKHJlc19wdHIpLE1FTV9ESVNQKGVzcCwyMCkpCisJSU5TTjIobW92LGwJLFIoczFfcHRyKSxNRU1fRElTUChlc3AsMjQpKQorCUlOU04yKG1vdixsCSxSKHNpemUpLE1FTV9ESVNQKGVzcCwyOCkpCisJSU5TTjIobW92LGwJLFIoczJfbGltYiksTUVNX0RJU1AoZXNwLDMyKSkKKworCUlOU04yKGxlYSxsCSxSKHJlc19wdHIpLE1FTV9JTkRFWChyZXNfcHRyLHNpemUsNCkpCisJSU5TTjIobGVhLGwJLFIoczFfcHRyKSxNRU1fSU5ERVgoczFfcHRyLHNpemUsNCkpCisJSU5TTjEobmVnLGwJLFIoc2l6ZSkpCisJSU5TTjIoeG9yLGwJLFIoZWJ4KSxSKGVieCkpCisJQUxJR04gKDMpCisKK0xvb3A6CUlOU04yKGFkYyxsCSxSKGVieCksJDApCisJSU5TTjIobW92LGwJLFIoZWF4KSxNRU1fSU5ERVgoczFfcHRyLHNpemUsNCkpCisKKwlJTlNOMShtdWwsbAksUihzMl9saW1iKSkKKworCUlOU04yKGFkZCxsCSxSKGVheCksUihlYngpKQorCUlOU04yKG1vdixsCSxSKGVieCksTUVNX0lOREVYKHJlc19wdHIsc2l6ZSw0KSkKKworCUlOU04yKGFkYyxsCSxSKGVkeCksJDApCisJSU5TTjIoc3ViLGwJLFIoZWJ4KSxSKGVheCkpCisKKwlJTlNOMihtb3YsbAksTUVNX0lOREVYKHJlc19wdHIsc2l6ZSw0KSxSKGVieCkpCisJSU5TTjEoaW5jLGwJLFIoc2l6ZSkpCisKKwlJTlNOMihtb3YsbAksUihlYngpLFIoZWR4KSkKKwlJTlNOMShqbnosCSxMb29wKQorCisJSU5TTjIoYWRjLGwJLFIoZWJ4KSwkMCkKKwlJTlNOMihtb3YsbAksUihlYXgpLFIoZWJ4KSkKKwlJTlNOMShwb3AsbAksUihlYnApKQorCUlOU04xKHBvcCxsCSxSKGVieCkpCisJSU5TTjEocG9wLGwJLFIoZXNpKSkKKwlJTlNOMShwb3AsbAksUihlZGkpKQorCXJldAorCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL2k1ODYvbXBpaC1yc2hpZnQuUyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvaTU4Ni9tcGloLXJzaGlmdC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NjFlM2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL2k1ODYvbXBpaC1yc2hpZnQuUwpAQCAtMCwwICsxLDIyOCBAQAorLyogaTgwNTg2ICAgcnNoaWZ0CisgKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTQsIDE5OTgsCisgKiAgICAgICAgICAgICAgICAgICAgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKgorICogTm90ZTogVGhpcyBjb2RlIGlzIGhlYXZpbHkgYmFzZWQgb24gdGhlIEdOVSBNUCBMaWJyYXJ5LgorICoJIEFjdHVhbGx5IGl0J3MgdGhlIHNhbWUgY29kZSB3aXRoIG9ubHkgbWlub3IgY2hhbmdlcyBpbiB0aGUKKyAqCSB3YXkgdGhlIGRhdGEgaXMgc3RvcmVkOyB0aGlzIGlzIHRvIHN1cHBvcnQgdGhlIGFic3RyYWN0aW9uCisgKgkgb2YgYW4gb3B0aW9uYWwgc2VjdXJlIG1lbW9yeSBhbGxvY2F0aW9uIHdoaWNoIG1heSBiZSB1c2VkCisgKgkgdG8gYXZvaWQgcmV2ZWFsaW5nIG9mIHNlbnNpdGl2ZSBkYXRhIGR1ZSB0byBwYWdpbmcgZXRjLgorICovCisKKworI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImFzbS1zeW50YXguaCIKKworCisKKy8qKioqKioqKioqKioqKioqKioqCisgKiBtcGlfbGltYl90CisgKiBfZ2NyeV9tcGloX3JzaGlmdCggbXBpX3B0cl90IHdwLAkoc3AgKyA0KQorICoJCSAgIG1waV9wdHJfdCB1cCwJKHNwICsgOCkKKyAqCQkgICBtcGlfc2l6ZV90IHVzaXplLAkoc3AgKyAxMikKKyAqCQkgICB1bnNpZ25lZCBjbnQpCShzcCArIDE2KQorICovCisKKy50ZXh0CisJQUxJR04gKDMpCisJLmdsb2JsIENfU1lNQk9MX05BTUUoX2djcnlfbXBpaF9yc2hpZnQpCitDX1NZTUJPTF9OQU1FKF9nY3J5X21waWhfcnNoaWZ0OikKKwlwdXNobAklZWRpCisJcHVzaGwJJWVzaQorCXB1c2hsCSVlYngKKwlwdXNobAklZWJwCisKKwltb3ZsCTIwKCVlc3ApLCVlZGkJCS8qIHJlc19wdHIgKi8KKwltb3ZsCTI0KCVlc3ApLCVlc2kJCS8qIHNfcHRyICovCisJbW92bAkyOCglZXNwKSwlZWJwCQkvKiBzaXplICovCisJbW92bAkzMiglZXNwKSwlZWN4CQkvKiBjbnQgKi8KKworLyogV2UgY2FuIHVzZSBmYXN0ZXIgY29kZSBmb3Igc2hpZnQtYnktMSB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnMuICAqLworCWNtcAkkMSwlZWN4CisJam5lCVJub3JtYWwKKwlsZWFsCTQoJWVkaSksJWVheAorCWNtcGwJJWVzaSwlZWF4CisJam5jCVJzcGVjaWFsCQkvKiBqdW1wIGlmIHJlc19wdHIgKyAxID49IHNfcHRyICovCisJbGVhbAkoJWVkaSwlZWJwLDQpLCVlYXgKKwljbXBsCSVlYXgsJWVzaQorCWpuYwlSc3BlY2lhbAkJLyoganVtcCBpZiBzX3B0ciA+PSByZXNfcHRyICsgc2l6ZSAqLworCitSbm9ybWFsOgorCW1vdmwJKCVlc2kpLCVlZHgKKwlhZGRsCSQ0LCVlc2kKKwl4b3JsCSVlYXgsJWVheAorCXNocmRsCSVjbCwlZWR4LCVlYXgJCS8qIGNvbXB1dGUgY2FycnkgbGltYiAqLworCXB1c2hsCSVlYXgJCQkvKiBwdXNoIGNhcnJ5IGxpbWIgb250byBzdGFjayAqLworCisJZGVjbAklZWJwCisJcHVzaGwJJWVicAorCXNocmwJJDMsJWVicAorCWp6CVJlbmQKKworCW1vdmwJKCVlZGkpLCVlYXgJCS8qIGZldGNoIGRlc3RpbmF0aW9uIGNhY2hlIGxpbmUgKi8KKworCUFMSUdOCSgyKQorUm9vcDoJbW92bAkyOCglZWRpKSwlZWF4CQkvKiBmZXRjaCBkZXN0aW5hdGlvbiBjYWNoZSBsaW5lICovCisJbW92bAklZWR4LCVlYngKKworCW1vdmwJKCVlc2kpLCVlYXgKKwltb3ZsCTQoJWVzaSksJWVkeAorCXNocmRsCSVjbCwlZWF4LCVlYngKKwlzaHJkbAklY2wsJWVkeCwlZWF4CisJbW92bAklZWJ4LCglZWRpKQorCW1vdmwJJWVheCw0KCVlZGkpCisKKwltb3ZsCTgoJWVzaSksJWVieAorCW1vdmwJMTIoJWVzaSksJWVheAorCXNocmRsCSVjbCwlZWJ4LCVlZHgKKwlzaHJkbAklY2wsJWVheCwlZWJ4CisJbW92bAklZWR4LDgoJWVkaSkKKwltb3ZsCSVlYngsMTIoJWVkaSkKKworCW1vdmwJMTYoJWVzaSksJWVkeAorCW1vdmwJMjAoJWVzaSksJWVieAorCXNocmRsCSVjbCwlZWR4LCVlYXgKKwlzaHJkbAklY2wsJWVieCwlZWR4CisJbW92bAklZWF4LDE2KCVlZGkpCisJbW92bAklZWR4LDIwKCVlZGkpCisKKwltb3ZsCTI0KCVlc2kpLCVlYXgKKwltb3ZsCTI4KCVlc2kpLCVlZHgKKwlzaHJkbAklY2wsJWVheCwlZWJ4CisJc2hyZGwJJWNsLCVlZHgsJWVheAorCW1vdmwJJWVieCwyNCglZWRpKQorCW1vdmwJJWVheCwyOCglZWRpKQorCisJYWRkbAkkMzIsJWVzaQorCWFkZGwJJDMyLCVlZGkKKwlkZWNsCSVlYnAKKwlqbnoJUm9vcAorCitSZW5kOglwb3BsCSVlYnAKKwlhbmRsCSQ3LCVlYnAKKwlqeglSZW5kMgorUm9vcDI6CW1vdmwJKCVlc2kpLCVlYXgKKwlzaHJkbAklY2wsJWVheCwlZWR4CQkvKiBjb21wdXRlIHJlc3VsdCBsaW1iICovCisJbW92bAklZWR4LCglZWRpKQorCW1vdmwJJWVheCwlZWR4CisJYWRkbAkkNCwlZXNpCisJYWRkbAkkNCwlZWRpCisJZGVjbAklZWJwCisJam56CVJvb3AyCisKK1JlbmQyOglzaHJsCSVjbCwlZWR4CQkvKiBjb21wdXRlIG1vc3Qgc2lnbmlmaWNhbnQgbGltYiAqLworCW1vdmwJJWVkeCwoJWVkaSkJCS8qIHN0b3JlIGl0ICovCisKKwlwb3BsCSVlYXgJCQkvKiBwb3AgY2FycnkgbGltYiAqLworCisJcG9wbAklZWJwCisJcG9wbAklZWJ4CisJcG9wbAklZXNpCisJcG9wbAklZWRpCisJcmV0CisKKy8qIFdlIGxvb3AgZnJvbSBsZWFzdCBzaWduaWZpY2FudCBlbmQgb2YgdGhlIGFycmF5cywgd2hpY2ggaXMgb25seQorICAgcGVybWlzc2FibGUgaWYgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZG9uJ3Qgb3ZlcmxhcCwgc2luY2UgdGhlCisgICBmdW5jdGlvbiBpcyBkb2N1bWVudGVkIHRvIHdvcmsgZm9yIG92ZXJsYXBwaW5nIHNvdXJjZSBhbmQgZGVzdGluYXRpb24uCisqLworCitSc3BlY2lhbDoKKwlsZWFsCS00KCVlZGksJWVicCw0KSwlZWRpCisJbGVhbAktNCglZXNpLCVlYnAsNCksJWVzaQorCisJbW92bAkoJWVzaSksJWVkeAorCXN1YmwJJDQsJWVzaQorCisJZGVjbAklZWJwCisJcHVzaGwJJWVicAorCXNocmwJJDMsJWVicAorCisJc2hybAkkMSwlZWR4CisJaW5jbAklZWJwCisJZGVjbAklZWJwCisJanoJUkxlbmQKKworCW1vdmwJKCVlZGkpLCVlYXgJCS8qIGZldGNoIGRlc3RpbmF0aW9uIGNhY2hlIGxpbmUgKi8KKworCUFMSUdOCSgyKQorUkxvb3A6CW1vdmwJLTI4KCVlZGkpLCVlYXgJCS8qIGZldGNoIGRlc3RpbmF0aW9uIGNhY2hlIGxpbmUgKi8KKwltb3ZsCSVlZHgsJWVieAorCisJbW92bAkoJWVzaSksJWVheAorCW1vdmwJLTQoJWVzaSksJWVkeAorCXJjcmwJJDEsJWVheAorCW1vdmwJJWVieCwoJWVkaSkKKwlyY3JsCSQxLCVlZHgKKwltb3ZsCSVlYXgsLTQoJWVkaSkKKworCW1vdmwJLTgoJWVzaSksJWVieAorCW1vdmwJLTEyKCVlc2kpLCVlYXgKKwlyY3JsCSQxLCVlYngKKwltb3ZsCSVlZHgsLTgoJWVkaSkKKwlyY3JsCSQxLCVlYXgKKwltb3ZsCSVlYngsLTEyKCVlZGkpCisKKwltb3ZsCS0xNiglZXNpKSwlZWR4CisJbW92bAktMjAoJWVzaSksJWVieAorCXJjcmwJJDEsJWVkeAorCW1vdmwJJWVheCwtMTYoJWVkaSkKKwlyY3JsCSQxLCVlYngKKwltb3ZsCSVlZHgsLTIwKCVlZGkpCisKKwltb3ZsCS0yNCglZXNpKSwlZWF4CisJbW92bAktMjgoJWVzaSksJWVkeAorCXJjcmwJJDEsJWVheAorCW1vdmwJJWVieCwtMjQoJWVkaSkKKwlyY3JsCSQxLCVlZHgKKwltb3ZsCSVlYXgsLTI4KCVlZGkpCisKKwlsZWFsCS0zMiglZXNpKSwlZXNpCQkvKiB1c2UgbGVhbCBub3QgdG8gY2xvYmJlciBjYXJyeSAqLworCWxlYWwJLTMyKCVlZGkpLCVlZGkKKwlkZWNsCSVlYnAKKwlqbnoJUkxvb3AKKworUkxlbmQ6CXBvcGwJJWVicAorCXNiYmwJJWVheCwlZWF4CQkvKiBzYXZlIGNhcnJ5IGluICVlYXggKi8KKwlhbmRsCSQ3LCVlYnAKKwlqeglSTGVuZDIKKwlhZGRsCSVlYXgsJWVheAkJLyogcmVzdG9yZSBjYXJyeSBmcm9tIGVheCAqLworUkxvb3AyOiBtb3ZsCSVlZHgsJWVieAorCW1vdmwJKCVlc2kpLCVlZHgKKwlyY3JsCSQxLCVlZHgKKwltb3ZsCSVlYngsKCVlZGkpCisKKwlsZWFsCS00KCVlc2kpLCVlc2kJCS8qIHVzZSBsZWFsIG5vdCB0byBjbG9iYmVyIGNhcnJ5ICovCisJbGVhbAktNCglZWRpKSwlZWRpCisJZGVjbAklZWJwCisJam56CVJMb29wMgorCisJam1wCVJMMQorUkxlbmQyOiBhZGRsCSVlYXgsJWVheAkJLyogcmVzdG9yZSBjYXJyeSBmcm9tIGVheCAqLworUkwxOgltb3ZsCSVlZHgsKCVlZGkpCQkvKiBzdG9yZSBsYXN0IGxpbWIgKi8KKworCW1vdmwJJDAsJWVheAorCXJjcmwJJDEsJWVheAorCisJcG9wbAklZWJwCisJcG9wbAklZWJ4CisJcG9wbAklZXNpCisJcG9wbAklZWRpCisJcmV0CisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvaTU4Ni9tcGloLXN1YjEuUyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvaTU4Ni9tcGloLXN1YjEuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjJkNTgwCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9pNTg2L21waWgtc3ViMS5TCkBAIC0wLDAgKzEsMTQyIEBACisvKiBpODA1ODYgc3ViX24gLS0gU3ViIHR3byBsaW1iIHZlY3RvcnMgb2YgdGhlIHNhbWUgbGVuZ3RoID4gMCBhbmQgc3RvcmUKKyAqCQkgICBzdW0gaW4gYSB0aGlyZCBsaW1iIHZlY3Rvci4KKyAqCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NCwgMTk5NSwgMTk5OCwgCisgKiAgICAgICAgICAgICAgICAgICAgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKgorICogTm90ZTogVGhpcyBjb2RlIGlzIGhlYXZpbHkgYmFzZWQgb24gdGhlIEdOVSBNUCBMaWJyYXJ5LgorICoJIEFjdHVhbGx5IGl0J3MgdGhlIHNhbWUgY29kZSB3aXRoIG9ubHkgbWlub3IgY2hhbmdlcyBpbiB0aGUKKyAqCSB3YXkgdGhlIGRhdGEgaXMgc3RvcmVkOyB0aGlzIGlzIHRvIHN1cHBvcnQgdGhlIGFic3RyYWN0aW9uCisgKgkgb2YgYW4gb3B0aW9uYWwgc2VjdXJlIG1lbW9yeSBhbGxvY2F0aW9uIHdoaWNoIG1heSBiZSB1c2VkCisgKgkgdG8gYXZvaWQgcmV2ZWFsaW5nIG9mIHNlbnNpdGl2ZSBkYXRhIGR1ZSB0byBwYWdpbmcgZXRjLgorICovCisKKworI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImFzbS1zeW50YXguaCIKKworCisvKioqKioqKioqKioqKioqKioqKgorICogIG1waV9saW1iX3QKKyAqICBfZ2NyeV9tcGloX3N1Yl9uKCBtcGlfcHRyX3QgcmVzX3B0ciwJKHNwICsgNCkKKyAqCQkgICBtcGlfcHRyX3QgczFfcHRyLAkoc3AgKyA4KQorICoJCSAgIG1waV9wdHJfdCBzMl9wdHIsCShzcCArIDEyKQorICoJCSAgIG1waV9zaXplX3Qgc2l6ZSkJKHNwICsgMTYpCisgKi8KKworCisudGV4dAorCUFMSUdOICgzKQorCS5nbG9ibCBDX1NZTUJPTF9OQU1FKF9nY3J5X21waWhfc3ViX24pCitDX1NZTUJPTF9OQU1FKF9nY3J5X21waWhfc3ViX246KQorCisJcHVzaGwJJWVkaQorCXB1c2hsCSVlc2kKKwlwdXNobAklZWJ4CisJcHVzaGwJJWVicAorCisJbW92bAkyMCglZXNwKSwlZWRpCQkvKiByZXNfcHRyICovCisJbW92bAkyNCglZXNwKSwlZXNpCQkvKiBzMV9wdHIgKi8KKwltb3ZsCTI4KCVlc3ApLCVlYnAJCS8qIHMyX3B0ciAqLworCW1vdmwJMzIoJWVzcCksJWVjeAkJLyogc2l6ZSAqLworCisJbW92bAkoJWVicCksJWVieAorCisJZGVjbAklZWN4CisJbW92bAklZWN4LCVlZHgKKwlzaHJsCSQzLCVlY3gKKwlhbmRsCSQ3LCVlZHgKKwl0ZXN0bAklZWN4LCVlY3gJCS8qIHplcm8gY2FycnkgZmxhZyAqLworCWp6CUxlbmQKKwlwdXNobAklZWR4CisKKwlBTElHTiAoMykKK0xvb3A6CW1vdmwJMjgoJWVkaSksJWVheAkJLyogZmV0Y2ggZGVzdGluYXRpb24gY2FjaGUgbGluZSAqLworCWxlYWwJMzIoJWVkaSksJWVkaQorCitMMToJbW92bAkoJWVzaSksJWVheAorCW1vdmwJNCglZXNpKSwlZWR4CisJc2JibAklZWJ4LCVlYXgKKwltb3ZsCTQoJWVicCksJWVieAorCXNiYmwJJWVieCwlZWR4CisJbW92bAk4KCVlYnApLCVlYngKKwltb3ZsCSVlYXgsLTMyKCVlZGkpCisJbW92bAklZWR4LC0yOCglZWRpKQorCitMMjoJbW92bAk4KCVlc2kpLCVlYXgKKwltb3ZsCTEyKCVlc2kpLCVlZHgKKwlzYmJsCSVlYngsJWVheAorCW1vdmwJMTIoJWVicCksJWVieAorCXNiYmwJJWVieCwlZWR4CisJbW92bAkxNiglZWJwKSwlZWJ4CisJbW92bAklZWF4LC0yNCglZWRpKQorCW1vdmwJJWVkeCwtMjAoJWVkaSkKKworTDM6CW1vdmwJMTYoJWVzaSksJWVheAorCW1vdmwJMjAoJWVzaSksJWVkeAorCXNiYmwJJWVieCwlZWF4CisJbW92bAkyMCglZWJwKSwlZWJ4CisJc2JibAklZWJ4LCVlZHgKKwltb3ZsCTI0KCVlYnApLCVlYngKKwltb3ZsCSVlYXgsLTE2KCVlZGkpCisJbW92bAklZWR4LC0xMiglZWRpKQorCitMNDoJbW92bAkyNCglZXNpKSwlZWF4CisJbW92bAkyOCglZXNpKSwlZWR4CisJc2JibAklZWJ4LCVlYXgKKwltb3ZsCTI4KCVlYnApLCVlYngKKwlzYmJsCSVlYngsJWVkeAorCW1vdmwJMzIoJWVicCksJWVieAorCW1vdmwJJWVheCwtOCglZWRpKQorCW1vdmwJJWVkeCwtNCglZWRpKQorCisJbGVhbAkzMiglZXNpKSwlZXNpCisJbGVhbAkzMiglZWJwKSwlZWJwCisJZGVjbAklZWN4CisJam56CUxvb3AKKworCXBvcGwJJWVkeAorTGVuZDoKKwlkZWNsCSVlZHgJCQkvKiB0ZXN0ICVlZHggdy9vIGNsb2JiZXJpbmcgY2FycnkgKi8KKwlqcwlMZW5kMgorCWluY2wJJWVkeAorTG9vcDI6CisJbGVhbAk0KCVlZGkpLCVlZGkKKwltb3ZsCSglZXNpKSwlZWF4CisJc2JibAklZWJ4LCVlYXgKKwltb3ZsCTQoJWVicCksJWVieAorCW1vdmwJJWVheCwtNCglZWRpKQorCWxlYWwJNCglZXNpKSwlZXNpCisJbGVhbAk0KCVlYnApLCVlYnAKKwlkZWNsCSVlZHgKKwlqbnoJTG9vcDIKK0xlbmQyOgorCW1vdmwJKCVlc2kpLCVlYXgKKwlzYmJsCSVlYngsJWVheAorCW1vdmwJJWVheCwoJWVkaSkKKworCXNiYmwJJWVheCwlZWF4CisJbmVnbAklZWF4CisKKwlwb3BsCSVlYnAKKwlwb3BsCSVlYngKKwlwb3BsCSVlc2kKKwlwb3BsCSVlZGkKKwlyZXQKKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9sb25nbG9uZy5oIGIvbGliZ2NyeXB0LTEuNC42L21waS9sb25nbG9uZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MzZkNDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL2xvbmdsb25nLmgKQEAgLTAsMCArMSwxNTc4IEBACisvKiBsb25nbG9uZy5oIC0tIGRlZmluaXRpb25zIGZvciBtaXhlZCBzaXplIDMyLzY0IGJpdCBhcml0aG1ldGljLgorICAgTm90ZTogSSBhZGRlZCBzb21lIHN0dWZmIGZvciB1c2Ugd2l0aCBnbnVwZworCitDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTYsIDE5OTgsCisgICAgICAgICAgICAgIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK29wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sCitNQSAwMjExMS0xMzA3LCBVU0EuICovCisKKy8qIFlvdSBoYXZlIHRvIGRlZmluZSB0aGUgZm9sbG93aW5nIGJlZm9yZSBpbmNsdWRpbmcgdGhpcyBmaWxlOgorCisgICBVV3R5cGUgLS0gQW4gdW5zaWduZWQgdHlwZSwgZGVmYXVsdCB0eXBlIGZvciBvcGVyYXRpb25zICh0eXBpY2FsbHkgYSAid29yZCIpCisgICBVSFd0eXBlIC0tIEFuIHVuc2lnbmVkIHR5cGUsIGF0IGxlYXN0IGhhbGYgdGhlIHNpemUgb2YgVVd0eXBlLgorICAgVURXdHlwZSAtLSBBbiB1bnNpZ25lZCB0eXBlLCBhdCBsZWFzdCB0d2ljZSBhcyBsYXJnZSBhIFVXdHlwZQorICAgV19UWVBFX1NJWkUgLS0gc2l6ZSBpbiBiaXRzIG9mIFVXdHlwZQorCisgICBTSXR5cGUsIFVTSXR5cGUgLS0gU2lnbmVkIGFuZCB1bnNpZ25lZCAzMiBiaXQgdHlwZXMuCisgICBESXR5cGUsIFVESXR5cGUgLS0gU2lnbmVkIGFuZCB1bnNpZ25lZCA2NCBiaXQgdHlwZXMuCisKKyAgIE9uIGEgMzIgYml0IG1hY2hpbmUgVVd0eXBlIHNob3VsZCB0eXBpY2FsbHkgYmUgVVNJdHlwZTsKKyAgIG9uIGEgNjQgYml0IG1hY2hpbmUsIFVXdHlwZSBzaG91bGQgdHlwaWNhbGx5IGJlIFVESXR5cGUuCisqLworCisjZGVmaW5lIF9fQklUUzQgKFdfVFlQRV9TSVpFIC8gNCkKKyNkZWZpbmUgX19sbF9CICgoVVd0eXBlKSAxIDw8IChXX1RZUEVfU0laRSAvIDIpKQorI2RlZmluZSBfX2xsX2xvd3BhcnQodCkgKChVV3R5cGUpICh0KSAmIChfX2xsX0IgLSAxKSkKKyNkZWZpbmUgX19sbF9oaWdocGFydCh0KSAoKFVXdHlwZSkgKHQpID4+IChXX1RZUEVfU0laRSAvIDIpKQorCisvKiBUaGlzIGlzIHVzZWQgdG8gbWFrZSBzdXJlIG5vIHVuZGVzaXJhYmxlIHNoYXJpbmcgYmV0d2VlbiBkaWZmZXJlbnQgbGlicmFyaWVzCisgICB0aGF0IHVzZSB0aGlzIGZpbGUgdGFrZXMgcGxhY2UuICAqLworI2lmbmRlZiBfX01QTgorI2RlZmluZSBfX01QTih4KSBfXyMjeAorI2VuZGlmCisKKy8qIERlZmluZSBhdXhpbGlhcnkgYXNtIG1hY3Jvcy4KKworICAgMSkgdW11bF9wcG1tKGhpZ2hfcHJvZCwgbG93X3Byb2QsIG11bHRpcGxlciwgbXVsdGlwbGljYW5kKSBtdWx0aXBsaWVzIHR3bworICAgVVd0eXBlIGludGVnZXJzIE1VTFRJUExFUiBhbmQgTVVMVElQTElDQU5ELCBhbmQgZ2VuZXJhdGVzIGEgdHdvIFVXdHlwZQorICAgd29yZCBwcm9kdWN0IGluIEhJR0hfUFJPRCBhbmQgTE9XX1BST0QuCisKKyAgIDIpIF9fdW11bHNpZGkzKGEsYikgbXVsdGlwbGllcyB0d28gVVd0eXBlIGludGVnZXJzIEEgYW5kIEIsIGFuZCByZXR1cm5zIGEKKyAgIFVEV3R5cGUgcHJvZHVjdC4gIFRoaXMgaXMganVzdCBhIHZhcmlhbnQgb2YgdW11bF9wcG1tLgorCisgICAzKSB1ZGl2X3Fybm5kKHF1b3RpZW50LCByZW1haW5kZXIsIGhpZ2hfbnVtZXJhdG9yLCBsb3dfbnVtZXJhdG9yLAorICAgZGVub21pbmF0b3IpIGRpdmlkZXMgYSBVRFd0eXBlLCBjb21wb3NlZCBieSB0aGUgVVd0eXBlIGludGVnZXJzCisgICBISUdIX05VTUVSQVRPUiBhbmQgTE9XX05VTUVSQVRPUiwgYnkgREVOT01JTkFUT1IgYW5kIHBsYWNlcyB0aGUgcXVvdGllbnQKKyAgIGluIFFVT1RJRU5UIGFuZCB0aGUgcmVtYWluZGVyIGluIFJFTUFJTkRFUi4JSElHSF9OVU1FUkFUT1IgbXVzdCBiZSBsZXNzCisgICB0aGFuIERFTk9NSU5BVE9SIGZvciBjb3JyZWN0IG9wZXJhdGlvbi4gIElmLCBpbiBhZGRpdGlvbiwgdGhlIG1vc3QKKyAgIHNpZ25pZmljYW50IGJpdCBvZiBERU5PTUlOQVRPUiBtdXN0IGJlIDEsIHRoZW4gdGhlIHByZS1wcm9jZXNzb3Igc3ltYm9sCisgICBVRElWX05FRURTX05PUk1BTElaQVRJT04gaXMgZGVmaW5lZCB0byAxLgorCisgICA0KSBzZGl2X3Fybm5kKHF1b3RpZW50LCByZW1haW5kZXIsIGhpZ2hfbnVtZXJhdG9yLCBsb3dfbnVtZXJhdG9yLAorICAgZGVub21pbmF0b3IpLiAgTGlrZSB1ZGl2X3Fybm5kIGJ1dCB0aGUgbnVtYmVycyBhcmUgc2lnbmVkLiAgVGhlIHF1b3RpZW50CisgICBpcyByb3VuZGVkIHRvd2FyZHMgMC4KKworICAgNSkgY291bnRfbGVhZGluZ196ZXJvcyhjb3VudCwgeCkgY291bnRzIHRoZSBudW1iZXIgb2YgemVyby1iaXRzIGZyb20gdGhlCisgICBtc2IgdG8gdGhlIGZpcnN0IG5vbi16ZXJvIGJpdCBpbiB0aGUgVVd0eXBlIFguICBUaGlzIGlzIHRoZSBudW1iZXIgb2YKKyAgIHN0ZXBzIFggbmVlZHMgdG8gYmUgc2hpZnRlZCBsZWZ0IHRvIHNldCB0aGUgbXNiLiAgVW5kZWZpbmVkIGZvciBYID09IDAsCisgICB1bmxlc3MgdGhlIHN5bWJvbCBDT1VOVF9MRUFESU5HX1pFUk9TXzAgaXMgZGVmaW5lZCB0byBzb21lIHZhbHVlLgorCisgICA2KSBjb3VudF90cmFpbGluZ196ZXJvcyhjb3VudCwgeCkgbGlrZSBjb3VudF9sZWFkaW5nX3plcm9zLCBidXQgY291bnRzCisgICBmcm9tIHRoZSBsZWFzdCBzaWduaWZpY2FudCBlbmQuCisKKyAgIDcpIGFkZF9zc2FhYWEoaGlnaF9zdW0sIGxvd19zdW0sIGhpZ2hfYWRkZW5kXzEsIGxvd19hZGRlbmRfMSwKKyAgIGhpZ2hfYWRkZW5kXzIsIGxvd19hZGRlbmRfMikgYWRkcyB0d28gVVd0eXBlIGludGVnZXJzLCBjb21wb3NlZCBieQorICAgSElHSF9BRERFTkRfMSBhbmQgTE9XX0FEREVORF8xLCBhbmQgSElHSF9BRERFTkRfMiBhbmQgTE9XX0FEREVORF8yCisgICByZXNwZWN0aXZlbHkuICBUaGUgcmVzdWx0IGlzIHBsYWNlZCBpbiBISUdIX1NVTSBhbmQgTE9XX1NVTS4gIE92ZXJmbG93CisgICAoaS5lLiBjYXJyeSBvdXQpIGlzIG5vdCBzdG9yZWQgYW55d2hlcmUsIGFuZCBpcyBsb3N0LgorCisgICA4KSBzdWJfZGRtbXNzKGhpZ2hfZGlmZmVyZW5jZSwgbG93X2RpZmZlcmVuY2UsIGhpZ2hfbWludWVuZCwgbG93X21pbnVlbmQsCisgICBoaWdoX3N1YnRyYWhlbmQsIGxvd19zdWJ0cmFoZW5kKSBzdWJ0cmFjdHMgdHdvIHR3by13b3JkIFVXdHlwZSBpbnRlZ2VycywKKyAgIGNvbXBvc2VkIGJ5IEhJR0hfTUlOVUVORF8xIGFuZCBMT1dfTUlOVUVORF8xLCBhbmQgSElHSF9TVUJUUkFIRU5EXzIgYW5kCisgICBMT1dfU1VCVFJBSEVORF8yIHJlc3BlY3RpdmVseS4gIFRoZSByZXN1bHQgaXMgcGxhY2VkIGluIEhJR0hfRElGRkVSRU5DRQorICAgYW5kIExPV19ESUZGRVJFTkNFLglPdmVyZmxvdyAoaS5lLiBjYXJyeSBvdXQpIGlzIG5vdCBzdG9yZWQgYW55d2hlcmUsCisgICBhbmQgaXMgbG9zdC4KKworICAgSWYgYW55IG9mIHRoZXNlIG1hY3JvcyBhcmUgbGVmdCB1bmRlZmluZWQgZm9yIGEgcGFydGljdWxhciBDUFUsCisgICBDIG1hY3JvcyBhcmUgdXNlZC4gICovCisKKy8qIFRoZSBDUFVzIGNvbWUgaW4gYWxwaGFiZXRpY2FsIG9yZGVyIGJlbG93LgorCisgICBQbGVhc2UgYWRkIHN1cHBvcnQgZm9yIG1vcmUgQ1BVcyBoZXJlLCBvciBpbXByb3ZlIHRoZSBjdXJyZW50IHN1cHBvcnQKKyAgIGZvciB0aGUgQ1BVcyBiZWxvdyEJKi8KKworI2lmZGVmIF9fcmlzY29zX18KKyNwcmFnbWEgY29udGludWVfYWZ0ZXJfaGFzaF9lcnJvcgorI2Vsc2UgLyogIV9fcmlzY29zX18gKi8KKyNpZiBkZWZpbmVkIChfX0dOVUNfXykgJiYgIWRlZmluZWQgKE5PX0FTTSkKKworLyogV2Ugc29tZXRpbWVzIG5lZWQgdG8gY2xvYmJlciAiY2MiIHdpdGggZ2NjMiwgYnV0IHRoYXQgd291bGQgbm90IGJlCisgICB1bmRlcnN0b29kIGJ5IGdjYzEuCVVzZSBjcHAgdG8gYXZvaWQgbWFqb3IgY29kZSBkdXBsaWNhdGlvbi4gICovCisjaWYgX19HTlVDX18gPCAyCisjZGVmaW5lIF9fQ0xPQkJFUl9DQworI2RlZmluZSBfX0FORF9DTE9CQkVSX0NDCisjZWxzZSAvKiBfX0dOVUNfXyA+PSAyICovCisjZGVmaW5lIF9fQ0xPQkJFUl9DQyA6ICJjYyIKKyNkZWZpbmUgX19BTkRfQ0xPQkJFUl9DQyAsICJjYyIKKyNlbmRpZiAvKiBfX0dOVUNfXyA8IDIgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKiogIEEyOUsgICoqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIChkZWZpbmVkIChfX2EyOWtfXykgfHwgZGVmaW5lZCAoX0FNMjlLKSkgJiYgV19UWVBFX1NJWkUgPT0gMzIKKyNkZWZpbmUgYWRkX3NzYWFhYShzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisgIF9fYXNtX18gKCJhZGQgJTEsJTQsJTVcbiIgICBcCisgICAgICAgICAgICJhZGRjICUwLCUyLCUzIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgOiAiPXIiICgoVVNJdHlwZSkoc2gpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgIj0mciIgKChVU0l0eXBlKShzbCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgIDogIiVyIiAoKFVTSXR5cGUpKGFoKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAickkiICgoVVNJdHlwZSkoYmgpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICIlciIgKChVU0l0eXBlKShhbCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgInJJIiAoKFVTSXR5cGUpKGJsKSkpCisjZGVmaW5lIHN1Yl9kZG1tc3Moc2gsIHNsLCBhaCwgYWwsIGJoLCBibCkgXAorICBfX2FzbV9fICgic3ViICUxLCU0LCU1XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICJzdWJjICUwLCUyLCUzIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgOiAiPXIiICgoVVNJdHlwZSkoc2gpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICI9JnIiICgoVVNJdHlwZSkoc2wpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgIDogInIiICgoVVNJdHlwZSkoYWgpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAickkiICgoVVNJdHlwZSkoYmgpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICJyIiAoKFVTSXR5cGUpKGFsKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgInJJIiAoKFVTSXR5cGUpKGJsKSkpCisjZGVmaW5lIHVtdWxfcHBtbSh4aCwgeGwsIG0wLCBtMSkgXAorICBkbyB7CQkJCQkJCQkJXAorICAgIFVTSXR5cGUgX19tMCA9IChtMCksIF9fbTEgPSAobTEpOwkJCQkJXAorICAgIF9fYXNtX18gKCJtdWx0aXBsdSAlMCwlMSwlMiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgOiAiPXIiICgoVVNJdHlwZSkoeGwpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICA6ICJyIiAoX19tMCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICAgInIiIChfX20xKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fYXNtX18gKCJtdWx0bXUgJTAsJTEsJTIiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgOiAiPXIiICgoVVNJdHlwZSkoeGgpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICA6ICJyIiAoX19tMCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICAgInIiIChfX20xKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorI2RlZmluZSB1ZGl2X3Fybm5kKHEsIHIsIG4xLCBuMCwgZCkgXAorICBfX2FzbV9fICgiZGl2aWR1ICUwLCUzLCU0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgIDogIj1yIiAoKFVTSXR5cGUpKHEpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiPXEiICgoVVNJdHlwZSkocikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICA6ICIxIiAoKFVTSXR5cGUpKG4xKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgInIiICgoVVNJdHlwZSkobjApKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiciIgKChVU0l0eXBlKShkKSkpCisjZGVmaW5lIGNvdW50X2xlYWRpbmdfemVyb3MoY291bnQsIHgpIFwKKyAgICBfX2FzbV9fICgiY2x6ICUwLCUxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgIDogIj1yIiAoKFVTSXR5cGUpKGNvdW50KSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgOiAiciIgKChVU0l0eXBlKSh4KSkpCisjZGVmaW5lIENPVU5UX0xFQURJTkdfWkVST1NfMCAzMgorI2VuZGlmIC8qIF9fYTI5a19fICovCisKKworI2lmIGRlZmluZWQgKF9fYWxwaGEpICYmIFdfVFlQRV9TSVpFID09IDY0CisjZGVmaW5lIHVtdWxfcHBtbShwaCwgcGwsIG0wLCBtMSkgXAorICBkbyB7CQkJCQkJCQkJXAorICAgIFVESXR5cGUgX19tMCA9IChtMCksIF9fbTEgPSAobTEpOwkJCQkJXAorICAgIF9fYXNtX18gKCJ1bXVsaCAlcjEsJTIsJTAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgOiAiPXIiICgoVURJdHlwZSkgcGgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICA6ICIlckoiIChfX20wKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICAgInJJIiAoX19tMSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChwbCkgPSBfX20wICogX19tMTsgCQkJCQkJXAorICB9IHdoaWxlICgwKQorI2RlZmluZSBVTVVMX1RJTUUgNDYKKyNpZm5kZWYgTE9OR0xPTkdfU1RBTkRBTE9ORQorI2RlZmluZSB1ZGl2X3Fybm5kKHEsIHIsIG4xLCBuMCwgZCkgXAorICBkbyB7IFVESXR5cGUgX19yOwkJCQkJCQlcCisgICAgKHEpID0gX191ZGl2X3Fybm5kICgmX19yLCAobjEpLCAobjApLCAoZCkpOyAJCQlcCisgICAgKHIpID0gX19yOwkJCQkJCQkJXAorICB9IHdoaWxlICgwKQorZXh0ZXJuIFVESXR5cGUgX191ZGl2X3Fybm5kICgpOworI2RlZmluZSBVRElWX1RJTUUgMjIwCisjZW5kaWYgLyogTE9OR0xPTkdfU1RBTkRBTE9ORSAqLworI2VuZGlmIC8qIF9fYWxwaGEgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqICBBUk0gICoqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBkZWZpbmVkIChfX2FybV9fKSAmJiBXX1RZUEVfU0laRSA9PSAzMgorI2RlZmluZSBhZGRfc3NhYWFhKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgX19hc21fXyAoImFkZHMgJTEsICU0LCAlNVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAiYWRjICAlMCwgJTIsICUzIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgIDogIj1yIiAoKFVTSXR5cGUpKHNoKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiPSZyIiAoKFVTSXR5cGUpKHNsKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICA6ICIlciIgKChVU0l0eXBlKShhaCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgInJJIiAoKFVTSXR5cGUpKGJoKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiJXIiICgoVVNJdHlwZSkoYWwpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICJySSIgKChVU0l0eXBlKShibCkpKQorI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgX19hc21fXyAoInN1YnMgJTEsICU0LCAlNVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAic2JjICAlMCwgJTIsICUzIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgIDogIj1yIiAoKFVTSXR5cGUpKHNoKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiPSZyIiAoKFVTSXR5cGUpKHNsKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICA6ICJyIiAoKFVTSXR5cGUpKGFoKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgInJJIiAoKFVTSXR5cGUpKGJoKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiciIgKChVU0l0eXBlKShhbCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICJySSIgKChVU0l0eXBlKShibCkpKQorI2lmIGRlZmluZWQgX19BUk1fQVJDSF8yX18gfHwgZGVmaW5lZCBfX0FSTV9BUkNIXzNfXworI2RlZmluZSB1bXVsX3BwbW0oeGgsIHhsLCBhLCBiKSBcCisgIF9fYXNtX18gKCIlQCBJbmxpbmVkIHVtdWxfcHBtbVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJIm1vdgklfHIwLCAlMiwgbHNyICMxNgkJQCBBQUFBXG4iICAgICAgICAgICAgICAgXAorCSJtb3YJJXxyMiwgJTMsIGxzciAjMTYJCUAgQkJCQlxuIiAgICAgICAgICAgICAgIFwKKwkiYmljCSV8cjEsICUyLCAlfHIwLCBsc2wgIzE2CQlAIGFhYWFcbiIgICAgICAgICAgICAgICBcCisJImJpYwklMCwgJTMsICV8cjIsIGxzbCAjMTYJCUAgYmJiYlxuIiAgICAgICAgICAgICAgIFwKKwkibXVsCSUxLCAlfHIxLCAlfHIyCQkJQCBhYWFhICogQkJCQlxuIiAgICAgICAgXAorCSJtdWwJJXxyMiwgJXxyMCwgJXxyMgkJQCBBQUFBICogQkJCQlxuIiAgICAgICAgXAorCSJtdWwJJXxyMSwgJTAsICV8cjEJCQlAIGFhYWEgKiBiYmJiXG4iICAgICAgICBcCisJIm11bAklMCwgJXxyMCwgJTAJCQlAIEFBQUEgKiBiYmJiXG4iICAgICAgICBcCisJImFkZHMJJXxyMCwgJTEsICUwCQkJQCBjZW50cmFsIHN1bVxuIiAgICAgICAgXAorCSJhZGRjcwklfHIyLCAlfHIyLCAjNjU1MzZcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkiYWRkcwklMSwgJXxyMSwgJXxyMCwgbHNsICMxNlxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkiYWRjCSUwLCAlfHIyLCAlfHIwLCBsc3IgIzE2IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgIDogIj0mciIgKChVU0l0eXBlKSh4aCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiPXIiICgoVVNJdHlwZSkoeGwpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICA6ICJyIiAoKFVTSXR5cGUpKGEpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgInIiICgoVVNJdHlwZSkoYikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgOiAicjAiLCAicjEiLCAicjIiKQorI2Vsc2UKKyNkZWZpbmUgdW11bF9wcG1tKHhoLCB4bCwgYSwgYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19hc21fXyAoIiVAIElubGluZWQgdW11bF9wcG1tXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAidW11bGwgJXIxLCAlcjAsICVyMiwgJXIzIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkgICA6ICI9JnIiICgoVVNJdHlwZSkoeGgpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJICAgICAiPXIiICgoVVNJdHlwZSkoeGwpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCSAgIDogInIiICgoVVNJdHlwZSkoYSkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkgICAgICJyIiAoKFVTSXR5cGUpKGIpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJICAgOiAicjAiLCAicjEiKQorI2VuZGlmCisjZGVmaW5lIFVNVUxfVElNRSAyMAorI2RlZmluZSBVRElWX1RJTUUgMTAwCisjZW5kaWYgLyogX19hcm1fXyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKiogIENMSVBQRVIgICoqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQgKF9fY2xpcHBlcl9fKSAmJiBXX1RZUEVfU0laRSA9PSAzMgorI2RlZmluZSB1bXVsX3BwbW0odzEsIHcwLCB1LCB2KSBcCisgICh7dW5pb24ge1VESXR5cGUgX19sbDsJCQkJCQlcCisJICAgc3RydWN0IHtVU0l0eXBlIF9fbCwgX19oO30gX19pOwkJCQlcCisJICB9IF9feHg7CQkJCQkJCVwKKyAgX19hc21fXyAoIm11bHd1eCAlMiwlMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICA6ICI9ciIgKF9feHguX19sbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgIDogIiUwIiAoKFVTSXR5cGUpKHUpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiciIgKChVU0l0eXBlKSh2KSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKHcxKSA9IF9feHguX19pLl9faDsgKHcwKSA9IF9feHguX19pLl9fbDt9KQorI2RlZmluZSBzbXVsX3BwbW0odzEsIHcwLCB1LCB2KSBcCisgICh7dW5pb24ge0RJdHlwZSBfX2xsOyAJCQkJCQlcCisJICAgc3RydWN0IHtTSXR5cGUgX19sLCBfX2g7fSBfX2k7CQkJCVwKKwkgIH0gX194eDsJCQkJCQkJXAorICBfX2FzbV9fICgibXVsd3ggJTIsJTAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgIDogIj1yIiAoX194eC5fX2xsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgOiAiJTAiICgoU0l0eXBlKSh1KSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICJyIiAoKFNJdHlwZSkodikpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAodzEpID0gX194eC5fX2kuX19oOyAodzApID0gX194eC5fX2kuX19sO30pCisjZGVmaW5lIF9fdW11bHNpZGkzKHUsIHYpIFwKKyAgKHtVREl0eXBlIF9fdzsJCQkJCQkJXAorICAgIF9fYXNtX18gKCJtdWx3dXggJTIsJTAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgOiAiPXIiIChfX3cpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICA6ICIlMCIgKChVU0l0eXBlKSh1KSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICAgInIiICgoVVNJdHlwZSkodikpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fdzsgfSkKKyNlbmRpZiAvKiBfX2NsaXBwZXJfXyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKiAgR01JQ1JPICAqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZCAoX19nbWljcm9fXykgJiYgV19UWVBFX1NJWkUgPT0gMzIKKyNkZWZpbmUgYWRkX3NzYWFhYShzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisgIF9fYXNtX18gKCJhZGQudyAlNSwlMVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgImFkZHggJTMsJTAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICA6ICI9ZyIgKChVU0l0eXBlKShzaCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgIj0mZyIgKChVU0l0eXBlKShzbCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgOiAiJTAiICgoVVNJdHlwZSkoYWgpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICJnIiAoKFVTSXR5cGUpKGJoKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgIiUxIiAoKFVTSXR5cGUpKGFsKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiZyIgKChVU0l0eXBlKShibCkpKQorI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgX19hc21fXyAoInN1Yi53ICU1LCUxXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAic3VieCAlMywlMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgIDogIj1nIiAoKFVTSXR5cGUpKHNoKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiPSZnIiAoKFVTSXR5cGUpKHNsKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICA6ICIwIiAoKFVTSXR5cGUpKGFoKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgImciICgoVVNJdHlwZSkoYmgpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiMSIgKChVU0l0eXBlKShhbCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICJnIiAoKFVTSXR5cGUpKGJsKSkpCisjZGVmaW5lIHVtdWxfcHBtbShwaCwgcGwsIG0wLCBtMSkgXAorICBfX2FzbV9fICgibXVseCAlMywlMCwlMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgIDogIj1nIiAoKFVTSXR5cGUpKHBoKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiPXIiICgoVVNJdHlwZSkocGwpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICA6ICIlMCIgKChVU0l0eXBlKShtMCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgImciICgoVVNJdHlwZSkobTEpKSkKKyNkZWZpbmUgdWRpdl9xcm5uZChxLCByLCBuaCwgbmwsIGQpIFwKKyAgX19hc21fXyAoImRpdnggJTQsJTAsJTEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICA6ICI9ZyIgKChVU0l0eXBlKShxKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgIj1yIiAoKFVTSXR5cGUpKHIpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgOiAiMSIgKChVU0l0eXBlKShuaCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICIwIiAoKFVTSXR5cGUpKG5sKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgImciICgoVVNJdHlwZSkoZCkpKQorI2RlZmluZSBjb3VudF9sZWFkaW5nX3plcm9zKGNvdW50LCB4KSBcCisgIF9fYXNtX18gKCJic2NoLzEgJTEsJTAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgOiAiPWciIChjb3VudCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICA6ICJnIiAoKFVTSXR5cGUpKHgpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgIjAiICgoVVNJdHlwZSkwKSkKKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKiAgSFBQQSAgKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZCAoX19ocHBhKSAmJiBXX1RZUEVfU0laRSA9PSAzMgorI2RlZmluZSBhZGRfc3NhYWFhKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgX19hc21fXyAoIglhZGQgJTQsJTUsJTFcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgCSAgICIJYWRkYyAlMiwlMywlMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgIDogIj1yIiAoKFVTSXR5cGUpKHNoKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiPSZyIiAoKFVTSXR5cGUpKHNsKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICA6ICIlck0iICgoVVNJdHlwZSkoYWgpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgInJNIiAoKFVTSXR5cGUpKGJoKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiJXJNIiAoKFVTSXR5cGUpKGFsKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICJyTSIgKChVU0l0eXBlKShibCkpKQorI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgX19hc21fXyAoIglzdWIgJTQsJTUsJTFcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgIglzdWJiICUyLCUzLCUwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgOiAiPXIiICgoVVNJdHlwZSkoc2gpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICI9JnIiICgoVVNJdHlwZSkoc2wpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgIDogInJNIiAoKFVTSXR5cGUpKGFoKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAick0iICgoVVNJdHlwZSkoYmgpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICJyTSIgKChVU0l0eXBlKShhbCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgInJNIiAoKFVTSXR5cGUpKGJsKSkpCisjaWYgZGVmaW5lZCAoX1BBX1JJU0MxXzEpCisjZGVmaW5lIHVtdWxfcHBtbSh3aCwgd2wsIHUsIHYpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICB1bmlvbiB7VURJdHlwZSBfX2xsOwkJCQkJCVwKKwkgICBzdHJ1Y3Qge1VTSXR5cGUgX19oLCBfX2w7fSBfX2k7CQkJCVwKKwkgIH0gX194eDsJCQkJCQkJXAorICAgIF9fYXNtX18gKCIJeG1weXUgJTEsJTIsJTAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgIDogIj0qZiIgKF9feHguX19sbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgOiAiKmYiICgoVVNJdHlwZSkodSkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAgICIqZiIgKChVU0l0eXBlKSh2KSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAod2gpID0gX194eC5fX2kuX19oOwkJCQkJCVwKKyAgICAod2wpID0gX194eC5fX2kuX19sOwkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgVU1VTF9USU1FIDgKKyNkZWZpbmUgVURJVl9USU1FIDYwCisjZWxzZQorI2RlZmluZSBVTVVMX1RJTUUgNDAKKyNkZWZpbmUgVURJVl9USU1FIDgwCisjZW5kaWYKKyNpZm5kZWYgTE9OR0xPTkdfU1RBTkRBTE9ORQorI2RlZmluZSB1ZGl2X3Fybm5kKHEsIHIsIG4xLCBuMCwgZCkgXAorICBkbyB7IFVTSXR5cGUgX19yOwkJCQkJCQlcCisgICAgKHEpID0gX191ZGl2X3Fybm5kICgmX19yLCAobjEpLCAobjApLCAoZCkpOyAJCQlcCisgICAgKHIpID0gX19yOwkJCQkJCQkJXAorICB9IHdoaWxlICgwKQorZXh0ZXJuIFVTSXR5cGUgX191ZGl2X3Fybm5kICgpOworI2VuZGlmIC8qIExPTkdMT05HX1NUQU5EQUxPTkUgKi8KKyNkZWZpbmUgY291bnRfbGVhZGluZ196ZXJvcyhjb3VudCwgeCkgXAorICBkbyB7CQkJCQkJCQkgICAgICAgXAorICAgIFVTSXR5cGUgX190bXA7CQkJCQkJICAgICAgIFwKKyAgICBfX2FzbV9fICgJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAiCWxkaSAgICAgICAgICAgICAxLCUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAgICAgICAiCWV4dHJ1LD0gCSUxLDE1LDE2LCUlcjAgIDsgQml0cyAzMS4uMTYgemVybz8gICAgICAgICBcbiIgXAorICAgICAgICIJZXh0cnUsdHIJJTEsMTUsMTYsJTEgICAgOyBOby4gIFNoaWZ0IGRvd24sIHNraXAgYWRkLlxuIiBcCisgICAgICAgIglsZG8JCTE2KCUwKSwlMCAgICAgIDsgWWVzLglQZXJmb3JtIGFkZC4gICAgICAgXG4iIFwKKyAgICAgICAiCWV4dHJ1LD0gCSUxLDIzLDgsJSVyMCAgIDsgQml0cyAxNS4uOCB6ZXJvPyAgICAgICAgICBcbiIgXAorICAgICAgICIJZXh0cnUsdHIJJTEsMjMsOCwlMSAgICAgOyBOby4gIFNoaWZ0IGRvd24sIHNraXAgYWRkLlxuIiBcCisgICAgICAgIglsZG8JCTgoJTApLCUwICAgICAgIDsgWWVzLglQZXJmb3JtIGFkZC4gICAgICAgXG4iIFwKKyAgICAgICAiCWV4dHJ1LD0gCSUxLDI3LDQsJSVyMCAgIDsgQml0cyA3Li40IHplcm8/ICAgICAgICAgICBcbiIgXAorICAgICAgICIJZXh0cnUsdHIJJTEsMjcsNCwlMSAgICAgOyBOby4gIFNoaWZ0IGRvd24sIHNraXAgYWRkLlxuIiBcCisgICAgICAgIglsZG8JCTQoJTApLCUwICAgICAgIDsgWWVzLglQZXJmb3JtIGFkZC4gICAgICAgXG4iIFwKKyAgICAgICAiCWV4dHJ1LD0gCSUxLDI5LDIsJSVyMCAgIDsgQml0cyAzLi4yIHplcm8/ICAgICAgICAgICBcbiIgXAorICAgICAgICIJZXh0cnUsdHIJJTEsMjksMiwlMSAgICAgOyBOby4gIFNoaWZ0IGRvd24sIHNraXAgYWRkLlxuIiBcCisgICAgICAgIglsZG8JCTIoJTApLCUwICAgICAgIDsgWWVzLglQZXJmb3JtIGFkZC4gICAgICAgXG4iIFwKKyAgICAgICAiCWV4dHJ1CQklMSwzMCwxLCUxICAgICA7IEV4dHJhY3QgYml0IDEuICAgICAgICAgICAgXG4iIFwKKyAgICAgICAiCXN1YgkJJTAsJTEsJTAgICAgICAgOyBTdWJ0cmFjdCBpdC4gICAgICAgICAgICAgICIgICBcCisgICAgICAgOiAiPXIiIChjb3VudCksICI9ciIgKF9fdG1wKSA6ICIxIiAoeCkpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBocHBhICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqICBJMzcwICAqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAoZGVmaW5lZCAoX19pMzcwX18pIHx8IGRlZmluZWQgKF9fbXZzX18pKSAmJiBXX1RZUEVfU0laRSA9PSAzMgorI2RlZmluZSB1bXVsX3BwbW0oeGgsIHhsLCBtMCwgbTEpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICB1bmlvbiB7VURJdHlwZSBfX2xsOwkJCQkJCVwKKwkgICBzdHJ1Y3Qge1VTSXR5cGUgX19oLCBfX2w7fSBfX2k7CQkJCVwKKwkgIH0gX194eDsJCQkJCQkJXAorICAgIFVTSXR5cGUgX19tMCA9IChtMCksIF9fbTEgPSAobTEpOwkJCQkJXAorICAgIF9fYXNtX18gKCJtciAlMCwlMyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgOiAiPXIiIChfX3h4Ll9faS5fX2gpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAgICI9ciIgKF9feHguX19pLl9fbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgIDogIiUxIiAoX19tMCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgICAiciIgKF9fbTEpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHhoKSA9IF9feHguX19pLl9faDsgKHhsKSA9IF9feHguX19pLl9fbDsJCQkJXAorICAgICh4aCkgKz0gKCgoKFNJdHlwZSkgX19tMCA+PiAzMSkgJiBfX20xKQkJCQlcCisJICAgICArICgoKFNJdHlwZSkgX19tMSA+PiAzMSkgJiBfX20wKSk7IAkJCVwKKyAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgc211bF9wcG1tKHhoLCB4bCwgbTAsIG0xKSBcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgdW5pb24ge0RJdHlwZSBfX2xsOyAJCQkJCQlcCisJICAgc3RydWN0IHtVU0l0eXBlIF9faCwgX19sO30gX19pOwkJCQlcCisJICB9IF9feHg7CQkJCQkJCVwKKyAgICBfX2FzbV9fICgibXIgJTAsJTMiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgIDogIj1yIiAoX194eC5fX2kuX19oKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgICAiPXIiIChfX3h4Ll9faS5fX2wpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICA6ICIlMSIgKG0wKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICAgInIiIChtMSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICh4aCkgPSBfX3h4Ll9faS5fX2g7ICh4bCkgPSBfX3h4Ll9faS5fX2w7CQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgc2Rpdl9xcm5uZChxLCByLCBuMSwgbjAsIGQpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICB1bmlvbiB7REl0eXBlIF9fbGw7IAkJCQkJCVwKKwkgICBzdHJ1Y3Qge1VTSXR5cGUgX19oLCBfX2w7fSBfX2k7CQkJCVwKKwkgIH0gX194eDsJCQkJCQkJXAorICAgIF9feHguX19pLl9faCA9IG4xOyBfX3h4Ll9faS5fX2wgPSBuMDsJCQkJXAorICAgIF9fYXNtX18gKCJkciAlMCwlMiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgOiAiPXIiIChfX3h4Ll9fbGwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICA6ICIwIiAoX194eC5fX2xsKSwgInIiIChkKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAocSkgPSBfX3h4Ll9faS5fX2w7IChyKSA9IF9feHguX19pLl9faDsJCQkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqICBJMzg2ICAqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAoZGVmaW5lZCAoX19pMzg2X18pIHx8IGRlZmluZWQgKF9faTQ4Nl9fKSkgJiYgV19UWVBFX1NJWkUgPT0gMzIKKyNkZWZpbmUgYWRkX3NzYWFhYShzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisgIF9fYXNtX18gKCJhZGRsICU1LCUxXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgImFkY2wgJTMsJTAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICA6ICI9ciIgKChVU0l0eXBlKShzaCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgIj0mciIgKChVU0l0eXBlKShzbCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgOiAiJTAiICgoVVNJdHlwZSkoYWgpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICJnIiAoKFVTSXR5cGUpKGJoKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgIiUxIiAoKFVTSXR5cGUpKGFsKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiZyIgKChVU0l0eXBlKShibCkpKQorI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgX19hc21fXyAoInN1YmwgJTUsJTFcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAic2JibCAlMywlMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgIDogIj1yIiAoKFVTSXR5cGUpKHNoKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiPSZyIiAoKFVTSXR5cGUpKHNsKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICA6ICIwIiAoKFVTSXR5cGUpKGFoKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgImciICgoVVNJdHlwZSkoYmgpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiMSIgKChVU0l0eXBlKShhbCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICJnIiAoKFVTSXR5cGUpKGJsKSkpCisjZGVmaW5lIHVtdWxfcHBtbSh3MSwgdzAsIHUsIHYpIFwKKyAgX19hc21fXyAoIm11bGwgJTMiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICA6ICI9YSIgKChVU0l0eXBlKSh3MCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgIj1kIiAoKFVTSXR5cGUpKHcxKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgOiAiJTAiICgoVVNJdHlwZSkodSkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICJybSIgKChVU0l0eXBlKSh2KSkpCisjZGVmaW5lIHVkaXZfcXJubmQocSwgciwgbjEsIG4wLCBkKSBcCisgIF9fYXNtX18gKCJkaXZsICU0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgOiAiPWEiICgoVVNJdHlwZSkocSkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICI9ZCIgKChVU0l0eXBlKShyKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgIDogIjAiICgoVVNJdHlwZSkobjApKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiMSIgKChVU0l0eXBlKShuMSkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICJybSIgKChVU0l0eXBlKShkKSkpCisjZGVmaW5lIGNvdW50X2xlYWRpbmdfemVyb3MoY291bnQsIHgpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBVU0l0eXBlIF9fY2J0bXA7CQkJCQkJCVwKKyAgICBfX2FzbV9fICgiYnNybCAlMSwlMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgIDogIj1yIiAoX19jYnRtcCkgOiAicm0iICgoVVNJdHlwZSkoeCkpKTsgICAgICAgICAgICAgICAgICAgXAorICAgIChjb3VudCkgPSBfX2NidG1wIF4gMzE7CQkJCQkJXAorICB9IHdoaWxlICgwKQorI2RlZmluZSBjb3VudF90cmFpbGluZ196ZXJvcyhjb3VudCwgeCkgXAorICBfX2FzbV9fICgiYnNmbCAlMSwlMCIgOiAiPXIiIChjb3VudCkgOiAicm0iICgoVVNJdHlwZSkoeCkpKQorI2lmbmRlZiBVTVVMX1RJTUUKKyNkZWZpbmUgVU1VTF9USU1FIDQwCisjZW5kaWYKKyNpZm5kZWYgVURJVl9USU1FCisjZGVmaW5lIFVESVZfVElNRSA0MAorI2VuZGlmCisjZW5kaWYgLyogODB4ODYgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKiogIEk4NjAgICoqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQgKF9faTg2MF9fKSAmJiBXX1RZUEVfU0laRSA9PSAzMgorI2RlZmluZSByc2hpZnRfcmhsYyhyLGgsbCxjKSBcCisgIF9fYXNtX18gKCJzaHIgJTMscjAscjBcbiIgIFwKKyAgICAgICAgICAgInNocmQgJTEsJTIsJTAiICAgXAorCSAgICI9ciIgKHIpIDogInIiIChoKSwgInIiIChsKSwgInJuIiAoYykpCisjZW5kaWYgLyogaTg2MCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKiogIEk5NjAgICoqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQgKF9faTk2MF9fKSAmJiBXX1RZUEVfU0laRSA9PSAzMgorI2RlZmluZSBhZGRfc3NhYWFhKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgX19hc21fXyAoImNtcG8gMSwwXG4iICAgICAgXAorICAgICAgICAgICAiYWRkYyAlNSwlNCwlMVxuIiBcCisgICAgICAgICAgICJhZGRjICUzLCUyLCUwIiAgIFwKKwkgICA6ICI9ciIgKChVU0l0eXBlKShzaCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgIj0mciIgKChVU0l0eXBlKShzbCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgOiAiJWRJIiAoKFVTSXR5cGUpKGFoKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICJkSSIgKChVU0l0eXBlKShiaCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgIiVkSSIgKChVU0l0eXBlKShhbCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiZEkiICgoVVNJdHlwZSkoYmwpKSkKKyNkZWZpbmUgc3ViX2RkbW1zcyhzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisgIF9fYXNtX18gKCJjbXBvIDAsMFxuIiAgICAgIFwKKyAgICAgICAgICAgInN1YmMgJTUsJTQsJTFcbiIgXAorICAgICAgICAgICAic3ViYyAlMywlMiwlMCIgICBcCisJICAgOiAiPXIiICgoVVNJdHlwZSkoc2gpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICI9JnIiICgoVVNJdHlwZSkoc2wpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgIDogImRJIiAoKFVTSXR5cGUpKGFoKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiZEkiICgoVVNJdHlwZSkoYmgpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICJkSSIgKChVU0l0eXBlKShhbCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgImRJIiAoKFVTSXR5cGUpKGJsKSkpCisjZGVmaW5lIHVtdWxfcHBtbSh3MSwgdzAsIHUsIHYpIFwKKyAgKHt1bmlvbiB7VURJdHlwZSBfX2xsOwkJCQkJCVwKKwkgICBzdHJ1Y3Qge1VTSXR5cGUgX19sLCBfX2g7fSBfX2k7CQkJCVwKKwkgIH0gX194eDsJCQkJCQkJXAorICBfX2FzbV9fICgiZW11bCAgICAgICAgJTIsJTEsJTAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgIDogIj1kIiAoX194eC5fX2xsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgOiAiJWRJIiAoKFVTSXR5cGUpKHUpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICJkSSIgKChVU0l0eXBlKSh2KSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAodzEpID0gX194eC5fX2kuX19oOyAodzApID0gX194eC5fX2kuX19sO30pCisjZGVmaW5lIF9fdW11bHNpZGkzKHUsIHYpIFwKKyAgKHtVREl0eXBlIF9fdzsJCQkJCQkJXAorICAgIF9fYXNtX18gKCJlbXVsICAgICAgJTIsJTEsJTAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgOiAiPWQiIChfX3cpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICA6ICIlZEkiICgoVVNJdHlwZSkodSkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICAgImRJIiAoKFVTSXR5cGUpKHYpKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fdzsgfSkKKyNkZWZpbmUgdWRpdl9xcm5uZChxLCByLCBuaCwgbmwsIGQpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICB1bmlvbiB7VURJdHlwZSBfX2xsOwkJCQkJCVwKKwkgICBzdHJ1Y3Qge1VTSXR5cGUgX19sLCBfX2g7fSBfX2k7CQkJCVwKKwkgIH0gX19ubjsJCQkJCQkJXAorICAgIF9fbm4uX19pLl9faCA9IChuaCk7IF9fbm4uX19pLl9fbCA9IChubCk7CQkJCVwKKyAgICBfX2FzbV9fICgiZWRpdiAlZCwlbiwlMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICA6ICI9ZCIgKF9fcnEuX19sbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgIDogImRJIiAoX19ubi5fX2xsKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiZEkiICgoVVNJdHlwZSkoZCkpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAocikgPSBfX3JxLl9faS5fX2w7IChxKSA9IF9fcnEuX19pLl9faDsJCQkJXAorICB9IHdoaWxlICgwKQorI2RlZmluZSBjb3VudF9sZWFkaW5nX3plcm9zKGNvdW50LCB4KSBcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgVVNJdHlwZSBfX2NidG1wOwkJCQkJCQlcCisgICAgX19hc21fXyAoInNjYW5iaXQgJTEsJTAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICA6ICI9ciIgKF9fY2J0bXApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgIDogInIiICgoVVNJdHlwZSkoeCkpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChjb3VudCkgPSBfX2NidG1wIF4gMzE7CQkJCQkJXAorICB9IHdoaWxlICgwKQorI2RlZmluZSBDT1VOVF9MRUFESU5HX1pFUk9TXzAgKC0zMikgLyogc2ljICovCisjaWYgZGVmaW5lZCAoX19pOTYwbXgpCQkvKiB3aGF0IGlzIHRoZSBwcm9wZXIgc3ltYm9sIHRvIHRlc3Q/Pz8gKi8KKyNkZWZpbmUgcnNoaWZ0X3JobGMocixoLGwsYykgXAorICBkbyB7CQkJCQkJCQkJXAorICAgIHVuaW9uIHtVREl0eXBlIF9fbGw7CQkJCQkJXAorCSAgIHN0cnVjdCB7VVNJdHlwZSBfX2wsIF9faDt9IF9faTsJCQkJXAorCSAgfSBfX25uOwkJCQkJCQlcCisgICAgX19ubi5fX2kuX19oID0gKGgpOyBfX25uLl9faS5fX2wgPSAobCk7CQkJCVwKKyAgICBfX2FzbV9fICgic2hyZSAlMiwlMSwlMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgIDogIj1kIiAocikgOiAiZEkiIChfX25uLl9fbGwpLCAiZEkiIChjKSk7ICAgICAgICAgICAgICAgICAgXAorICB9CisjZW5kaWYgLyogaTk2MG14ICovCisjZW5kaWYgLyogaTk2MCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKiAgNjgwMDAJKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAoZGVmaW5lZCAoX19tYzY4MDAwX18pIHx8IGRlZmluZWQgKF9fbWM2ODAyMF9fKSB8fCBkZWZpbmVkIChfX05lWFRfXykgfHwgZGVmaW5lZChtYzY4MDIwKSkgJiYgV19UWVBFX1NJWkUgPT0gMzIKKyNkZWZpbmUgYWRkX3NzYWFhYShzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisgIF9fYXNtX18gKCJhZGQlLmwgJTUsJTFcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgImFkZHglLmwgJTMsJTAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICA6ICI9ZCIgKChVU0l0eXBlKShzaCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgIj0mZCIgKChVU0l0eXBlKShzbCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgOiAiJTAiICgoVVNJdHlwZSkoYWgpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICJkIiAoKFVTSXR5cGUpKGJoKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgIiUxIiAoKFVTSXR5cGUpKGFsKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiZyIgKChVU0l0eXBlKShibCkpKQorI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgX19hc21fXyAoInN1YiUubCAlNSwlMVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAic3VieCUubCAlMywlMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgIDogIj1kIiAoKFVTSXR5cGUpKHNoKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiPSZkIiAoKFVTSXR5cGUpKHNsKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICA6ICIwIiAoKFVTSXR5cGUpKGFoKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgImQiICgoVVNJdHlwZSkoYmgpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiMSIgKChVU0l0eXBlKShhbCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICJnIiAoKFVTSXR5cGUpKGJsKSkpCisjaWYgKGRlZmluZWQgKF9fbWM2ODAyMF9fKSB8fCBkZWZpbmVkIChfX05lWFRfXykgfHwgZGVmaW5lZChtYzY4MDIwKSkKKyNkZWZpbmUgdW11bF9wcG1tKHcxLCB3MCwgdSwgdikgXAorICBfX2FzbV9fICgibXVsdSUubCAlMywlMTolMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgIDogIj1kIiAoKFVTSXR5cGUpKHcwKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiPWQiICgoVVNJdHlwZSkodzEpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICA6ICIlMCIgKChVU0l0eXBlKSh1KSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgImRtaSIgKChVU0l0eXBlKSh2KSkpCisjZGVmaW5lIFVNVUxfVElNRSA0NQorI2RlZmluZSB1ZGl2X3Fybm5kKHEsIHIsIG4xLCBuMCwgZCkgXAorICBfX2FzbV9fICgiZGl2dSUubCAlNCwlMTolMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgIDogIj1kIiAoKFVTSXR5cGUpKHEpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiPWQiICgoVVNJdHlwZSkocikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICA6ICIwIiAoKFVTSXR5cGUpKG4wKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgIjEiICgoVVNJdHlwZSkobjEpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiZG1pIiAoKFVTSXR5cGUpKGQpKSkKKyNkZWZpbmUgVURJVl9USU1FIDkwCisjZGVmaW5lIHNkaXZfcXJubmQocSwgciwgbjEsIG4wLCBkKSBcCisgIF9fYXNtX18gKCJkaXZzJS5sICU0LCUxOiUwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgOiAiPWQiICgoVVNJdHlwZSkocSkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICI9ZCIgKChVU0l0eXBlKShyKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgIDogIjAiICgoVVNJdHlwZSkobjApKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiMSIgKChVU0l0eXBlKShuMSkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICJkbWkiICgoVVNJdHlwZSkoZCkpKQorI2RlZmluZSBjb3VudF9sZWFkaW5nX3plcm9zKGNvdW50LCB4KSBcCisgIF9fYXNtX18gKCJiZmZmbyAlMXslYjI6JWIyfSwlMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgOiAiPWQiICgoVVNJdHlwZSkoY291bnQpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICA6ICJvZCIgKChVU0l0eXBlKSh4KSksICJuIiAoMCkpCisjZGVmaW5lIENPVU5UX0xFQURJTkdfWkVST1NfMCAzMgorI2Vsc2UgLyogbm90IG1jNjgwMjAgKi8KKyNkZWZpbmUgdW11bF9wcG1tKHhoLCB4bCwgYSwgYikgXAorICBkbyB7IFVTSXR5cGUgX191bXVsX3RtcDEsIF9fdW11bF90bXAyOwkJCSAgXAorCV9fYXNtX18gKCJ8IElubGluZWQgdW11bF9wcG1tICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiBcCisgIiAgICAgICAgbW92ZSUubCAlNSwlMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiBcCisgIiAgICAgICAgbW92ZSUubCAlMiwlMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiBcCisgIiAgICAgICAgbW92ZSUudyAlMywlMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiBcCisgIiAgICAgICAgc3dhcAklMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBzd2FwCSUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIgXAorICIgICAgICAgIG11bHUJJTIsJTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiBcCisgIiAgICAgICAgbXVsdQklMywlMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBtdWx1CSUyLCUzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIgXAorICIgICAgICAgIHN3YXAJJTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiBcCisgIiAgICAgICAgbXVsdQklNSwlMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBhZGQlLmwJJTMsJTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIgXAorICIgICAgICAgIGpjYwkxZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBhZGQlLmwJJSMweDEwMDAwLCUwICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIgXAorICIxOgltb3ZlJS5sICUyLCUzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIgXAorICIgICAgICAgIGNsciUudwklMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiBcCisgIiAgICAgICAgc3dhcAklMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBzd2FwCSUzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIgXAorICIgICAgICAgIGNsciUudwklMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiBcCisgIiAgICAgICAgYWRkJS5sCSUzLCUxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBhZGR4JS5sICUyLCUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICB8IEVuZCBpbmxpbmVkIHVtdWxfcHBtbSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICA6ICI9JmQiICgoVVNJdHlwZSkoeGgpKSwgIj0mZCIgKChVU0l0eXBlKSh4bCkpLCAgICAgXAorCQkiPWQiIChfX3VtdWxfdG1wMSksICI9JmQiIChfX3VtdWxfdG1wMikgICAgICAgICAgIFwKKwkgICAgICA6ICIlMiIgKChVU0l0eXBlKShhKSksICJkIiAoKFVTSXR5cGUpKGIpKSk7ICAgICAgICAgXAorICB9IHdoaWxlICgwKQorI2RlZmluZSBVTVVMX1RJTUUgMTAwCisjZGVmaW5lIFVESVZfVElNRSA0MDAKKyNlbmRpZiAvKiBub3QgbWM2ODAyMCAqLworI2VuZGlmIC8qIG1jNjgwMDAgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKiogIDg4MDAwCSoqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZCAoX19tODgwMDBfXykgJiYgV19UWVBFX1NJWkUgPT0gMzIKKyNkZWZpbmUgYWRkX3NzYWFhYShzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisgIF9fYXNtX18gKCJhZGR1LmNvICUxLCVyNCwlcjVcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgImFkZHUuY2kgJTAsJXIyLCVyMyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICA6ICI9ciIgKChVU0l0eXBlKShzaCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgIj0mciIgKChVU0l0eXBlKShzbCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgOiAiJXJKIiAoKFVTSXR5cGUpKGFoKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICJySiIgKChVU0l0eXBlKShiaCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgIiVySiIgKChVU0l0eXBlKShhbCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAickoiICgoVVNJdHlwZSkoYmwpKSkKKyNkZWZpbmUgc3ViX2RkbW1zcyhzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisgIF9fYXNtX18gKCJzdWJ1LmNvICUxLCVyNCwlcjVcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgInN1YnUuY2kgJTAsJXIyLCVyMyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICA6ICI9ciIgKChVU0l0eXBlKShzaCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgIj0mciIgKChVU0l0eXBlKShzbCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgOiAickoiICgoVVNJdHlwZSkoYWgpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICJySiIgKChVU0l0eXBlKShiaCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgInJKIiAoKFVTSXR5cGUpKGFsKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAickoiICgoVVNJdHlwZSkoYmwpKSkKKyNkZWZpbmUgY291bnRfbGVhZGluZ196ZXJvcyhjb3VudCwgeCkgXAorICBkbyB7CQkJCQkJCQkJXAorICAgIFVTSXR5cGUgX19jYnRtcDsJCQkJCQkJXAorICAgIF9fYXNtX18gKCJmZjEgJTAsJTEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgOiAiPXIiIChfX2NidG1wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICA6ICJyIiAoKFVTSXR5cGUpKHgpKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoY291bnQpID0gX19jYnRtcCBeIDMxOwkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgQ09VTlRfTEVBRElOR19aRVJPU18wIDYzIC8qIHNpYyAqLworI2lmIGRlZmluZWQgKF9fbTg4MTEwX18pCisjZGVmaW5lIHVtdWxfcHBtbSh3aCwgd2wsIHUsIHYpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICB1bmlvbiB7VURJdHlwZSBfX2xsOwkJCQkJCVwKKwkgICBzdHJ1Y3Qge1VTSXR5cGUgX19oLCBfX2w7fSBfX2k7CQkJCVwKKwkgIH0gX194OwkJCQkJCQlcCisgICAgX19hc21fXyAoIm11bHUuZCAlMCwlMSwlMiIgOiAiPXIiIChfX3guX19sbCkgOiAiciIgKHUpLCAiciIgKHYpKTsgICBcCisgICAgKHdoKSA9IF9feC5fX2kuX19oOyAJCQkJCQlcCisgICAgKHdsKSA9IF9feC5fX2kuX19sOyAJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZGVmaW5lIHVkaXZfcXJubmQocSwgciwgbjEsIG4wLCBkKSBcCisgICh7dW5pb24ge1VESXR5cGUgX19sbDsJCQkJCQlcCisJICAgc3RydWN0IHtVU0l0eXBlIF9faCwgX19sO30gX19pOwkJCQlcCisJICB9IF9feCwgX19xOwkJCQkJCQlcCisgIF9feC5fX2kuX19oID0gKG4xKTsgX194Ll9faS5fX2wgPSAobjApOwkJCQlcCisgIF9fYXNtX18gKCJkaXZ1LmQgJTAsJTEsJTIiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgOiAiPXIiIChfX3EuX19sbCkgOiAiciIgKF9feC5fX2xsKSwgInIiIChkKSk7ICAgICAgICAgICAgICAgIFwKKyAgKHIpID0gKG4wKSAtIF9fcS5fX2wgKiAoZCk7IChxKSA9IF9fcS5fX2w7IH0pCisjZGVmaW5lIFVNVUxfVElNRSA1CisjZGVmaW5lIFVESVZfVElNRSAyNQorI2Vsc2UKKyNkZWZpbmUgVU1VTF9USU1FIDE3CisjZGVmaW5lIFVESVZfVElNRSAxNTAKKyNlbmRpZiAvKiBfX204ODExMF9fICovCisjZW5kaWYgLyogX19tODgwMDBfXyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKiogIE1JUFMgICoqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQgKF9fbWlwc19fKSAmJiBXX1RZUEVfU0laRSA9PSAzMgorI2lmIChfX0dOVUNfXyA+PSA1KSB8fCAoX19HTlVDX18gPT0gNCAmJiBfX0dOVUNfTUlOT1JfXyA+PSA0KQorI2RlZmluZSB1bXVsX3BwbW0odzEsIHcwLCB1LCB2KSBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVURJdHlwZSBfcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX3IgPSAoVURJdHlwZSkgdSAqIHY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHcxKSA9IF9yID4+IDMyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHcwKSA9IChVU0l0eXBlKSBfcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisjZWxpZiBfX0dOVUNfXyA+IDIgfHwgX19HTlVDX01JTk9SX18gPj0gNworI2RlZmluZSB1bXVsX3BwbW0odzEsIHcwLCB1LCB2KSBcCisgIF9fYXNtX18gKCJtdWx0dSAlMiwlMyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgOiAiPWwiICgoVVNJdHlwZSkodzApKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICI9aCIgKChVU0l0eXBlKSh3MSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgIDogImQiICgoVVNJdHlwZSkodSkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiZCIgKChVU0l0eXBlKSh2KSkpCisjZWxzZQorI2RlZmluZSB1bXVsX3BwbW0odzEsIHcwLCB1LCB2KSBcCisgIF9fYXNtX18gKCJtdWx0dSAlMiwlMyBcbiIgXAorCSAgICJtZmxvICUwIFxuIiAgICAgXAorCSAgICJtZmhpICUxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgIDogIj1kIiAoKFVTSXR5cGUpKHcwKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiPWQiICgoVVNJdHlwZSkodzEpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICA6ICJkIiAoKFVTSXR5cGUpKHUpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgImQiICgoVVNJdHlwZSkodikpKQorI2VuZGlmCisjZGVmaW5lIFVNVUxfVElNRSAxMAorI2RlZmluZSBVRElWX1RJTUUgMTAwCisjZW5kaWYgLyogX19taXBzX18gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqICBNSVBTLzY0ICAqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAoZGVmaW5lZCAoX19taXBzKSAmJiBfX21pcHMgPj0gMykgJiYgV19UWVBFX1NJWkUgPT0gNjQKKyNpZiAoX19HTlVDX18gPj0gNSkgfHwgKF9fR05VQ19fID09IDQgJiYgX19HTlVDX01JTk9SX18gPj0gNCkKK3R5cGVkZWYgdW5zaWduZWQgaW50IFVUSXR5cGUgX19hdHRyaWJ1dGVfXyAoKG1vZGUgKFRJKSkpOworI2RlZmluZSB1bXVsX3BwbW0odzEsIHcwLCB1LCB2KSBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBVVEl0eXBlIF9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9yID0gKFVUSXR5cGUpIHUgKiB2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHcxKSA9IF9yID4+IDY0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAodzApID0gKFVESXR5cGUpIF9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorI2VsaWYgX19HTlVDX18gPiAyIHx8IF9fR05VQ19NSU5PUl9fID49IDcKKyNkZWZpbmUgdW11bF9wcG1tKHcxLCB3MCwgdSwgdikgXAorICBfX2FzbV9fICgiZG11bHR1ICUyLCUzIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgIDogIj1sIiAoKFVESXR5cGUpKHcwKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiPWgiICgoVURJdHlwZSkodzEpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICA6ICJkIiAoKFVESXR5cGUpKHUpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgImQiICgoVURJdHlwZSkodikpKQorI2Vsc2UKKyNkZWZpbmUgdW11bF9wcG1tKHcxLCB3MCwgdSwgdikgXAorICBfX2FzbV9fICgiZG11bHR1ICUyLCUzIFxuIiAgICBcCisJICAgIm1mbG8gJTAgXG4iICAgICAgICAgXAorCSAgICJtZmhpICUxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgIDogIj1kIiAoKFVESXR5cGUpKHcwKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiPWQiICgoVURJdHlwZSkodzEpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICA6ICJkIiAoKFVESXR5cGUpKHUpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgImQiICgoVURJdHlwZSkodikpKQorI2VuZGlmCisjZGVmaW5lIFVNVUxfVElNRSAyMAorI2RlZmluZSBVRElWX1RJTUUgMTQwCisjZW5kaWYgLyogX19taXBzX18gKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKiogIDMyMDAwCSoqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZCAoX19uczMyMDAwX18pICYmIFdfVFlQRV9TSVpFID09IDMyCisjZGVmaW5lIHVtdWxfcHBtbSh3MSwgdzAsIHUsIHYpIFwKKyAgKHt1bmlvbiB7VURJdHlwZSBfX2xsOwkJCQkJCVwKKwkgICBzdHJ1Y3Qge1VTSXR5cGUgX19sLCBfX2g7fSBfX2k7CQkJCVwKKwkgIH0gX194eDsJCQkJCQkJXAorICBfX2FzbV9fICgibWVpZCAlMiwlMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgIDogIj1nIiAoX194eC5fX2xsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgOiAiJTAiICgoVVNJdHlwZSkodSkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICJnIiAoKFVTSXR5cGUpKHYpKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAodzEpID0gX194eC5fX2kuX19oOyAodzApID0gX194eC5fX2kuX19sO30pCisjZGVmaW5lIF9fdW11bHNpZGkzKHUsIHYpIFwKKyAgKHtVREl0eXBlIF9fdzsJCQkJCQkJXAorICAgIF9fYXNtX18gKCJtZWlkICUyLCUwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgOiAiPWciIChfX3cpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICA6ICIlMCIgKChVU0l0eXBlKSh1KSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICAgImciICgoVVNJdHlwZSkodikpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fdzsgfSkKKyNkZWZpbmUgdWRpdl9xcm5uZChxLCByLCBuMSwgbjAsIGQpIFwKKyAgKHt1bmlvbiB7VURJdHlwZSBfX2xsOwkJCQkJCVwKKwkgICBzdHJ1Y3Qge1VTSXR5cGUgX19sLCBfX2g7fSBfX2k7CQkJCVwKKwkgIH0gX194eDsJCQkJCQkJXAorICBfX3h4Ll9faS5fX2ggPSAobjEpOyBfX3h4Ll9faS5fX2wgPSAobjApOwkJCQlcCisgIF9fYXNtX18gKCJkZWlkICUyLCUwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgOiAiPWciIChfX3h4Ll9fbGwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICA6ICIwIiAoX194eC5fX2xsKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgImciICgoVVNJdHlwZSkoZCkpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChyKSA9IF9feHguX19pLl9fbDsgKHEpID0gX194eC5fX2kuX19oOyB9KQorI2RlZmluZSBjb3VudF90cmFpbGluZ196ZXJvcyhjb3VudCx4KSBcCisgIGRvIHsKKyAgICBfX2FzbV9fICgiZmZzZCAgICAgICUyLCUwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgIDogIj1yIiAoKFVTSXR5cGUpIChjb3VudCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgOiAiMCIgKChVU0l0eXBlKSAwKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAgICJyIiAoKFVTSXR5cGUpICh4KSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBfX25zMzIwMDBfXyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKiAgUFBDICAqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgKGRlZmluZWQgKF9BUkNIX1BQQykgfHwgZGVmaW5lZCAoX0lCTVIyKSkgJiYgV19UWVBFX1NJWkUgPT0gMzIKKyNkZWZpbmUgYWRkX3NzYWFhYShzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChiaCkgJiYgKGJoKSA9PSAwKSAJCQlcCisgICAgICBfX2FzbV9fICgie2ElSTR8YWRkJUk0Y30gJTEsJTMsJTRcblx0e2F6ZXxhZGR6ZX0gJTAsJTIiICAgICAgICAgICBcCisJICAgICA6ICI9ciIgKChVU0l0eXBlKShzaCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICAgIj0mciIgKChVU0l0eXBlKShzbCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgOiAiJXIiICgoVVNJdHlwZSkoYWgpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAgICIlciIgKChVU0l0eXBlKShhbCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICAgInJJIiAoKFVTSXR5cGUpKGJsKSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChiaCkgJiYgKGJoKSA9PX4oVVNJdHlwZSkgMCkJCVwKKyAgICAgIF9fYXNtX18gKCJ7YSVJNHxhZGQlSTRjfSAlMSwlMywlNFxuXHR7YW1lfGFkZG1lfSAlMCwlMiIgICAgICAgICAgIFwKKwkgICAgIDogIj1yIiAoKFVTSXR5cGUpKHNoKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgICAiPSZyIiAoKFVTSXR5cGUpKHNsKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICA6ICIlciIgKChVU0l0eXBlKShhaCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICAgIiVyIiAoKFVTSXR5cGUpKGFsKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgICAickkiICgoVVNJdHlwZSkoYmwpKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZQkJCQkJCQkJXAorICAgICAgX19hc21fXyAoInthJUk1fGFkZCVJNWN9ICUxLCU0LCU1XG5cdHthZXxhZGRlfSAlMCwlMiwlMyIgICAgICAgICAgXAorCSAgICAgOiAiPXIiICgoVVNJdHlwZSkoc2gpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAgICI9JnIiICgoVVNJdHlwZSkoc2wpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgIDogIiVyIiAoKFVTSXR5cGUpKGFoKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgICAiciIgKChVU0l0eXBlKShiaCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAgICIlciIgKChVU0l0eXBlKShhbCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICAgInJJIiAoKFVTSXR5cGUpKGJsKSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKGFoKSAmJiAoYWgpID09IDApIAkJCVwKKyAgICAgIF9fYXNtX18gKCJ7c2YlSTN8c3ViZiVJM2N9ICUxLCU0LCUzXG5cdHtzZnplfHN1YmZ6ZX0gJTAsJTIiICAgICAgIFwKKwkgICAgICAgOiAiPXIiICgoVVNJdHlwZSkoc2gpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkgIj0mciIgKChVU0l0eXBlKShzbCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICAgOiAiciIgKChVU0l0eXBlKShiaCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkgInJJIiAoKFVTSXR5cGUpKGFsKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJICJyIiAoKFVTSXR5cGUpKGJsKSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKGFoKSAmJiAoYWgpID09fihVU0l0eXBlKSAwKQkJXAorICAgICAgX19hc21fXyAoIntzZiVJM3xzdWJmJUkzY30gJTEsJTQsJTNcblx0e3NmbWV8c3ViZm1lfSAlMCwlMiIgICAgICAgXAorCSAgICAgICA6ICI9ciIgKChVU0l0eXBlKShzaCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCSAiPSZyIiAoKFVTSXR5cGUpKHNsKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgICA6ICJyIiAoKFVTSXR5cGUpKGJoKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCSAickkiICgoVVNJdHlwZSkoYWwpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkgInIiICgoVVNJdHlwZSkoYmwpKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYmgpICYmIChiaCkgPT0gMCkJCQlcCisgICAgICBfX2FzbV9fICgie3NmJUkzfHN1YmYlSTNjfSAlMSwlNCwlM1xuXHR7YW1lfGFkZG1lfSAlMCwlMiIgICAgICAgICBcCisJICAgICAgIDogIj1yIiAoKFVTSXR5cGUpKHNoKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJICI9JnIiICgoVVNJdHlwZSkoc2wpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAgIDogInIiICgoVVNJdHlwZSkoYWgpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJICJySSIgKChVU0l0eXBlKShhbCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCSAiciIgKChVU0l0eXBlKShibCkpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChiaCkgJiYgKGJoKSA9PX4oVVNJdHlwZSkgMCkJCVwKKyAgICAgIF9fYXNtX18gKCJ7c2YlSTN8c3ViZiVJM2N9ICUxLCU0LCUzXG5cdHthemV8YWRkemV9ICUwLCUyIiAgICAgICAgIFwKKwkgICAgICAgOiAiPXIiICgoVVNJdHlwZSkoc2gpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkgIj0mciIgKChVU0l0eXBlKShzbCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICAgOiAiciIgKChVU0l0eXBlKShhaCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkgInJJIiAoKFVTSXR5cGUpKGFsKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJICJyIiAoKFVTSXR5cGUpKGJsKSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZQkJCQkJCQkJXAorICAgICAgX19hc21fXyAoIntzZiVJNHxzdWJmJUk0Y30gJTEsJTUsJTRcblx0e3NmZXxzdWJmZX0gJTAsJTMsJTIiICAgICAgXAorCSAgICAgICA6ICI9ciIgKChVU0l0eXBlKShzaCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCSAiPSZyIiAoKFVTSXR5cGUpKHNsKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgICA6ICJyIiAoKFVTSXR5cGUpKGFoKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCSAiciIgKChVU0l0eXBlKShiaCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkgInJJIiAoKFVTSXR5cGUpKGFsKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJICJyIiAoKFVTSXR5cGUpKGJsKSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisjZGVmaW5lIGNvdW50X2xlYWRpbmdfemVyb3MoY291bnQsIHgpIFwKKyAgX19hc21fXyAoIntjbnRsenxjbnRsend9ICUwLCUxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICA6ICI9ciIgKChVU0l0eXBlKShjb3VudCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgIDogInIiICgoVVNJdHlwZSkoeCkpKQorI2RlZmluZSBDT1VOVF9MRUFESU5HX1pFUk9TXzAgMzIKKyNpZiBkZWZpbmVkIChfQVJDSF9QUEMpCisjZGVmaW5lIHVtdWxfcHBtbShwaCwgcGwsIG0wLCBtMSkgXAorICBkbyB7CQkJCQkJCQkJXAorICAgIFVTSXR5cGUgX19tMCA9IChtMCksIF9fbTEgPSAobTEpOwkJCQkJXAorICAgIF9fYXNtX18gKCJtdWxod3UgJTAsJTEsJTIiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgOiAiPXIiICgoVVNJdHlwZSkgcGgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICA6ICIlciIgKF9fbTApLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICAgInIiIChfX20xKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChwbCkgPSBfX20wICogX19tMTsgCQkJCQkJXAorICB9IHdoaWxlICgwKQorI2RlZmluZSBVTVVMX1RJTUUgMTUKKyNkZWZpbmUgc211bF9wcG1tKHBoLCBwbCwgbTAsIG0xKSBcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgU0l0eXBlIF9fbTAgPSAobTApLCBfX20xID0gKG0xKTsJCQkJCVwKKyAgICBfX2FzbV9fICgibXVsaHcgJTAsJTEsJTIiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgIDogIj1yIiAoKFNJdHlwZSkgcGgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgOiAiJXIiIChfX20wKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAgICJyIiAoX19tMSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAocGwpID0gX19tMCAqIF9fbTE7IAkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgU01VTF9USU1FIDE0CisjZGVmaW5lIFVESVZfVElNRSAxMjAKKyNlbHNlCisjZGVmaW5lIHVtdWxfcHBtbSh4aCwgeGwsIG0wLCBtMSkgXAorICBkbyB7CQkJCQkJCQkJXAorICAgIFVTSXR5cGUgX19tMCA9IChtMCksIF9fbTEgPSAobTEpOwkJCQkJXAorICAgIF9fYXNtX18gKCJtdWwgJTAsJTIsJTMiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgOiAiPXIiICgoVVNJdHlwZSkoeGgpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAgICI9cSIgKChVU0l0eXBlKSh4bCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgIDogInIiIChfX20wKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgICAiciIgKF9fbTEpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHhoKSArPSAoKCgoU0l0eXBlKSBfX20wID4+IDMxKSAmIF9fbTEpCQkJCVwKKwkgICAgICsgKCgoU0l0eXBlKSBfX20xID4+IDMxKSAmIF9fbTApKTsgCQkJXAorICB9IHdoaWxlICgwKQorI2RlZmluZSBVTVVMX1RJTUUgOAorI2RlZmluZSBzbXVsX3BwbW0oeGgsIHhsLCBtMCwgbTEpIFwKKyAgX19hc21fXyAoIm11bCAlMCwlMiwlMyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICA6ICI9ciIgKChTSXR5cGUpKHhoKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgIj1xIiAoKFNJdHlwZSkoeGwpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgOiAiciIgKG0wKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICJyIiAobTEpKQorI2RlZmluZSBTTVVMX1RJTUUgNAorI2RlZmluZSBzZGl2X3Fybm5kKHEsIHIsIG5oLCBubCwgZCkgXAorICBfX2FzbV9fICgiZGl2ICUwLCUyLCU0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgIDogIj1yIiAoKFNJdHlwZSkocSkpLCAiPXEiICgoU0l0eXBlKShyKSkgICAgICAgICAgICAgICAgICAgICBcCisJICAgOiAiciIgKChTSXR5cGUpKG5oKSksICIxIiAoKFNJdHlwZSkobmwpKSwgInIiICgoU0l0eXBlKShkKSkpCisjZGVmaW5lIFVESVZfVElNRSAxMDAKKyNlbmRpZgorI2VuZGlmIC8qIFBvd2VyIGFyY2hpdGVjdHVyZSB2YXJpYW50cy4JKi8KKworLyogUG93ZXJwYyA2NCBiaXQgc3VwcG9ydCB0YWtlbiBmcm9tIGdtcC00LjEuMi4gKi8KKy8qIFdlIHNob3VsZCB0ZXN0IF9JQk1SMiBoZXJlIHdoZW4gd2UgYWRkIGFzc2VtYmx5IHN1cHBvcnQgZm9yIHRoZSBzeXN0ZW0KKyAgIHZlbmRvciBjb21waWxlcnMuICAqLworI2lmIDAgLyogTm90IHlldCBlbmFibGVkIGJlY3Vhc2Ugd2UgZG9uJ3QgaGF2ZSBoYXJkd2FyZSBmb3IgYSB0ZXN0LiAqLworI2lmIChkZWZpbmVkIChfQVJDSF9QUEMpIHx8IGRlZmluZWQgKF9fcG93ZXJwY19fKSkgJiYgV19UWVBFX1NJWkUgPT0gNjQKKyNkZWZpbmUgYWRkX3NzYWFhYShzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChiaCkgJiYgKGJoKSA9PSAwKQkJCQlcCisgICAgICBfX2FzbV9fICgie2ElSTR8YWRkJUk0Y30gJTEsJTMsJTRcblx0e2F6ZXxhZGR6ZX0gJTAsJTIiCQlcCisJICAgICA6ICI9ciIgKHNoKSwgIj0mciIgKHNsKSA6ICJyIiAoYWgpLCAiJXIiIChhbCksICJySSIgKGJsKSk7XAorICAgIGVsc2UgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChiaCkgJiYgKGJoKSA9PSB+KFVESXR5cGUpIDApCQlcCisgICAgICBfX2FzbV9fICgie2ElSTR8YWRkJUk0Y30gJTEsJTMsJTRcblx0e2FtZXxhZGRtZX0gJTAsJTIiCQlcCisJICAgICA6ICI9ciIgKHNoKSwgIj0mciIgKHNsKSA6ICJyIiAoYWgpLCAiJXIiIChhbCksICJySSIgKGJsKSk7XAorICAgIGVsc2UJCQkJCQkJCVwKKyAgICAgIF9fYXNtX18gKCJ7YSVJNXxhZGQlSTVjfSAlMSwlNCwlNVxuXHR7YWV8YWRkZX0gJTAsJTIsJTMiCQlcCisJICAgICA6ICI9ciIgKHNoKSwgIj0mciIgKHNsKQkJCQkJXAorCSAgICAgOiAiJXIiIChhaCksICJyIiAoYmgpLCAiJXIiIChhbCksICJySSIgKGJsKSk7CQlcCisgIH0gd2hpbGUgKDApCisjZGVmaW5lIHN1Yl9kZG1tc3Moc2gsIHNsLCBhaCwgYWwsIGJoLCBibCkgXAorICBkbyB7CQkJCQkJCQkJXAorICAgIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYWgpICYmIChhaCkgPT0gMCkJCQkJXAorICAgICAgX19hc21fXyAoIntzZiVJM3xzdWJmJUkzY30gJTEsJTQsJTNcblx0e3NmemV8c3ViZnplfSAlMCwlMiIJXAorCSAgICAgICA6ICI9ciIgKHNoKSwgIj0mciIgKHNsKSA6ICJyIiAoYmgpLCAickkiIChhbCksICJyIiAoYmwpKTtcCisgICAgZWxzZSBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKGFoKSAmJiAoYWgpID09IH4oVURJdHlwZSkgMCkJCVwKKyAgICAgIF9fYXNtX18gKCJ7c2YlSTN8c3ViZiVJM2N9ICUxLCU0LCUzXG5cdHtzZm1lfHN1YmZtZX0gJTAsJTIiCVwKKwkgICAgICAgOiAiPXIiIChzaCksICI9JnIiIChzbCkgOiAiciIgKGJoKSwgInJJIiAoYWwpLCAiciIgKGJsKSk7XAorICAgIGVsc2UgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChiaCkgJiYgKGJoKSA9PSAwKQkJCVwKKyAgICAgIF9fYXNtX18gKCJ7c2YlSTN8c3ViZiVJM2N9ICUxLCU0LCUzXG5cdHthbWV8YWRkbWV9ICUwLCUyIgkJXAorCSAgICAgICA6ICI9ciIgKHNoKSwgIj0mciIgKHNsKSA6ICJyIiAoYWgpLCAickkiIChhbCksICJyIiAoYmwpKTtcCisgICAgZWxzZSBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKGJoKSAmJiAoYmgpID09IH4oVURJdHlwZSkgMCkJCVwKKyAgICAgIF9fYXNtX18gKCJ7c2YlSTN8c3ViZiVJM2N9ICUxLCU0LCUzXG5cdHthemV8YWRkemV9ICUwLCUyIgkJXAorCSAgICAgICA6ICI9ciIgKHNoKSwgIj0mciIgKHNsKSA6ICJyIiAoYWgpLCAickkiIChhbCksICJyIiAoYmwpKTtcCisgICAgZWxzZQkJCQkJCQkJXAorICAgICAgX19hc21fXyAoIntzZiVJNHxzdWJmJUk0Y30gJTEsJTUsJTRcblx0e3NmZXxzdWJmZX0gJTAsJTMsJTIiCVwKKwkgICAgICAgOiAiPXIiIChzaCksICI9JnIiIChzbCkJCQkJCVwKKwkgICAgICAgOiAiciIgKGFoKSwgInIiIChiaCksICJySSIgKGFsKSwgInIiIChibCkpOwkJXAorICB9IHdoaWxlICgwKQorI2RlZmluZSBjb3VudF9sZWFkaW5nX3plcm9zKGNvdW50LCB4KSBcCisgIF9fYXNtX18gKCJjbnRsemQgJTAsJTEiIDogIj1yIiAoY291bnQpIDogInIiICh4KSkKKyNkZWZpbmUgQ09VTlRfTEVBRElOR19aRVJPU18wIDY0CisjZGVmaW5lIHVtdWxfcHBtbShwaCwgcGwsIG0wLCBtMSkgXAorICBkbyB7CQkJCQkJCQkJXAorICAgIFVESXR5cGUgX19tMCA9IChtMCksIF9fbTEgPSAobTEpOwkJCQkJXAorICAgIF9fYXNtX18gKCJtdWxoZHUgJTAsJTEsJTIiIDogIj1yIiAocGgpIDogIiVyIiAobTApLCAiciIgKG0xKSk7CVwKKyAgICAocGwpID0gX19tMCAqIF9fbTE7CQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgVU1VTF9USU1FIDE1CisjZGVmaW5lIHNtdWxfcHBtbShwaCwgcGwsIG0wLCBtMSkgXAorICBkbyB7CQkJCQkJCQkJXAorICAgIERJdHlwZSBfX20wID0gKG0wKSwgX19tMSA9IChtMSk7CQkJCQlcCisgICAgX19hc21fXyAoIm11bGhkICUwLCUxLCUyIiA6ICI9ciIgKHBoKSA6ICIlciIgKG0wKSwgInIiIChtMSkpOwlcCisgICAgKHBsKSA9IF9fbTAgKiBfX20xOwkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZGVmaW5lIFNNVUxfVElNRSAxNCAgLyogPz8/ICovCisjZGVmaW5lIFVESVZfVElNRSAxMjAgLyogPz8/ICovCisjZW5kaWYgLyogNjQtYml0IFBvd2VyUEMuICAqLworI2VuZGlmIC8qIGlmIDAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqICBQWVIgICoqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBkZWZpbmVkIChfX3B5cl9fKSAmJiBXX1RZUEVfU0laRSA9PSAzMgorI2RlZmluZSBhZGRfc3NhYWFhKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgX19hc21fXyAoImFkZHcgICAgICAgICU1LCUxIFxuIiBcCisJICAgImFkZHdjCSUzLCUwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICA6ICI9ciIgKChVU0l0eXBlKShzaCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgIj0mciIgKChVU0l0eXBlKShzbCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgOiAiJTAiICgoVVNJdHlwZSkoYWgpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICJnIiAoKFVTSXR5cGUpKGJoKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgIiUxIiAoKFVTSXR5cGUpKGFsKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiZyIgKChVU0l0eXBlKShibCkpKQorI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgX19hc21fXyAoInN1YncgICAgICAgICU1LCUxIFxuIiBcCisJICAgInN1YndiCSUzLCUwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICA6ICI9ciIgKChVU0l0eXBlKShzaCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgIj0mciIgKChVU0l0eXBlKShzbCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgOiAiMCIgKChVU0l0eXBlKShhaCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICJnIiAoKFVTSXR5cGUpKGJoKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgIjEiICgoVVNJdHlwZSkoYWwpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiZyIgKChVU0l0eXBlKShibCkpKQorLyogVGhpcyBpbnNuIHdvcmtzIG9uIFB5cmFtaWRzIHdpdGggQVAsIFhQLCBvciBNSSBDUFVzLCBidXQgbm90IHdpdGggU1AuICAqLworI2RlZmluZSB1bXVsX3BwbW0odzEsIHcwLCB1LCB2KSBcCisgICh7dW5pb24ge1VESXR5cGUgX19sbDsJCQkJCQlcCisJICAgc3RydWN0IHtVU0l0eXBlIF9faCwgX19sO30gX19pOwkJCQlcCisJICB9IF9feHg7CQkJCQkJCVwKKyAgX19hc21fXyAoIm1vdncgJTEsJVIwIFxuIiBcCisJICAgInVlbXVsICUyLCUwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICA6ICI9JnIiIChfX3h4Ll9fbGwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgIDogImciICgoVVNJdHlwZSkgKHUpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiZyIgKChVU0l0eXBlKSh2KSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKHcxKSA9IF9feHguX19pLl9faDsgKHcwKSA9IF9feHguX19pLl9fbDt9KQorI2VuZGlmIC8qIF9fcHlyX18gKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKiogIFJUL1JPTVAgICoqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQgKF9faWJtMDMyX18pIC8qIFJUL1JPTVAgKi8JJiYgV19UWVBFX1NJWkUgPT0gMzIKKyNkZWZpbmUgYWRkX3NzYWFhYShzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisgIF9fYXNtX18gKCJhICUxLCU1IFxuIiBcCisJICAgImFlICUwLCUzIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICA6ICI9ciIgKChVU0l0eXBlKShzaCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgIj0mciIgKChVU0l0eXBlKShzbCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgOiAiJTAiICgoVVNJdHlwZSkoYWgpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICJyIiAoKFVTSXR5cGUpKGJoKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgIiUxIiAoKFVTSXR5cGUpKGFsKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiciIgKChVU0l0eXBlKShibCkpKQorI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgX19hc21fXyAoInMgJTEsJTVcbiIgXAorCSAgICJzZSAlMCwlMyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgOiAiPXIiICgoVVNJdHlwZSkoc2gpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICI9JnIiICgoVVNJdHlwZSkoc2wpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgIDogIjAiICgoVVNJdHlwZSkoYWgpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiciIgKChVU0l0eXBlKShiaCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICIxIiAoKFVTSXR5cGUpKGFsKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgInIiICgoVVNJdHlwZSkoYmwpKSkKKyNkZWZpbmUgdW11bF9wcG1tKHBoLCBwbCwgbTAsIG0xKSBcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgVVNJdHlwZSBfX20wID0gKG0wKSwgX19tMSA9IChtMSk7CQkJCQlcCisgICAgX19hc21fXyAoCQkJCQkJCQlcCisgICAgICAgInMgICAgICAgcjIscjIgICAgXG4iIFwKKyAgICAgICAibXRzCXIxMCwlMiAgIFxuIiBcCisgICAgICAgIm0JcjIsJTMgICAgXG4iIFwKKyAgICAgICAibQlyMiwlMyAgICBcbiIgXAorICAgICAgICJtCXIyLCUzICAgIFxuIiBcCisgICAgICAgIm0JcjIsJTMgICAgXG4iIFwKKyAgICAgICAibQlyMiwlMyAgICBcbiIgXAorICAgICAgICJtCXIyLCUzICAgIFxuIiBcCisgICAgICAgIm0JcjIsJTMgICAgXG4iIFwKKyAgICAgICAibQlyMiwlMyAgICBcbiIgXAorICAgICAgICJtCXIyLCUzICAgIFxuIiBcCisgICAgICAgIm0JcjIsJTMgICAgXG4iIFwKKyAgICAgICAibQlyMiwlMyAgICBcbiIgXAorICAgICAgICJtCXIyLCUzICAgIFxuIiBcCisgICAgICAgIm0JcjIsJTMgICAgXG4iIFwKKyAgICAgICAibQlyMiwlMyAgICBcbiIgXAorICAgICAgICJtCXIyLCUzICAgIFxuIiBcCisgICAgICAgIm0JcjIsJTMgICAgXG4iIFwKKyAgICAgICAiY2FzCSUwLHIyLHIwIFxuIiBcCisgICAgICAgIm1mcwlyMTAsJTEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgIDogIj1yIiAoKFVTSXR5cGUpKHBoKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgICAiPXIiICgoVVNJdHlwZSkocGwpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICA6ICIlciIgKF9fbTApLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJInIiIChfX20xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICA6ICJyMiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAocGgpICs9ICgoKChTSXR5cGUpIF9fbTAgPj4gMzEpICYgX19tMSkJCQkJXAorCSAgICAgKyAoKChTSXR5cGUpIF9fbTEgPj4gMzEpICYgX19tMCkpOyAJCQlcCisgIH0gd2hpbGUgKDApCisjZGVmaW5lIFVNVUxfVElNRSAyMAorI2RlZmluZSBVRElWX1RJTUUgMjAwCisjZGVmaW5lIGNvdW50X2xlYWRpbmdfemVyb3MoY291bnQsIHgpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBpZiAoKHgpID49IDB4MTAwMDApIAkJCQkJCVwKKyAgICAgIF9fYXNtX18gKCJjbHogICAgICUwLCUxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICAgOiAiPXIiICgoVVNJdHlwZSkoY291bnQpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgICA6ICJyIiAoKFVTSXR5cGUpKHgpID4+IDE2KSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZQkJCQkJCQkJXAorICAgICAgeyAJCQkJCQkJCVwKKwlfX2FzbV9fICgiY2x6ICAgJTAsJTEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkgOiAiPXIiICgoVVNJdHlwZSkoY291bnQpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJIDogInIiICgoVVNJdHlwZSkoeCkpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKGNvdW50KSArPSAxNjsJCQkJCQkJXAorICAgICAgfSAJCQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBSVC9ST01QICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqICBTSDIgICoqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAoZGVmaW5lZCAoX19zaDJfXykgfHwgZGVmaW5lZChfX3NoM19fKSB8fCBkZWZpbmVkKF9fU0g0X18pICkgXAorICAgICYmIFdfVFlQRV9TSVpFID09IDMyCisjZGVmaW5lIHVtdWxfcHBtbSh3MSwgdzAsIHUsIHYpIFwKKyAgX19hc21fXyAoCQkJCQkJCQlcCisgICAgICAgICJkbXVsdS5sICUyLCUzXG4iICBcCisJInN0cwltYWNsLCUxXG4iIFwKKwkic3RzCW1hY2gsJTAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgIDogIj1yIiAoKFVTSXR5cGUpKHcxKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiPXIiICgoVVNJdHlwZSkodzApKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICA6ICJyIiAoKFVTSXR5cGUpKHUpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgInIiICgoVVNJdHlwZSkodikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgOiAibWFjbCIsICJtYWNoIikKKyNkZWZpbmUgVU1VTF9USU1FIDUKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKiogIFNQQVJDCSoqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZCAoX19zcGFyY19fKSAmJiBXX1RZUEVfU0laRSA9PSAzMgorI2RlZmluZSBhZGRfc3NhYWFhKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgX19hc21fXyAoImFkZGNjICVyNCwlNSwlMVxuIiBcCisJICAgImFkZHggJXIyLCUzLCUwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICA6ICI9ciIgKChVU0l0eXBlKShzaCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgIj0mciIgKChVU0l0eXBlKShzbCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgOiAiJXJKIiAoKFVTSXR5cGUpKGFoKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICJySSIgKChVU0l0eXBlKShiaCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgIiVySiIgKChVU0l0eXBlKShhbCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAickkiICgoVVNJdHlwZSkoYmwpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICBfX0NMT0JCRVJfQ0MpCisjZGVmaW5lIHN1Yl9kZG1tc3Moc2gsIHNsLCBhaCwgYWwsIGJoLCBibCkgXAorICBfX2FzbV9fICgic3ViY2MgJXI0LCU1LCUxXG4iIFwKKwkgICAic3VieCAlcjIsJTMsJTAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgIDogIj1yIiAoKFVTSXR5cGUpKHNoKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiPSZyIiAoKFVTSXR5cGUpKHNsKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICA6ICJySiIgKChVU0l0eXBlKShhaCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgInJJIiAoKFVTSXR5cGUpKGJoKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAickoiICgoVVNJdHlwZSkoYWwpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICJySSIgKChVU0l0eXBlKShibCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgIF9fQ0xPQkJFUl9DQykKKyNpZiBkZWZpbmVkIChfX3NwYXJjX3Y4X18pCisvKiBEb24ndCBtYXRjaCBpbW1lZGlhdGUgcmFuZ2UgYmVjYXVzZSwgMSkgaXQgaXMgbm90IG9mdGVuIHVzZWZ1bCwKKyAgIDIpIHRoZSAnSScgZmxhZyB0aGlua3Mgb2YgdGhlIHJhbmdlIGFzIGEgMTMgYml0IHNpZ25lZCBpbnRlcnZhbCwKKyAgIHdoaWxlIHdlIHdhbnQgdG8gbWF0Y2ggYSAxMyBiaXQgaW50ZXJ2YWwsIHNpZ24gZXh0ZW5kZWQgdG8gMzIgYml0cywKKyAgIGJ1dCBJTlRFUlBSRVRFRCBBUyBVTlNJR05FRC4gICovCisjZGVmaW5lIHVtdWxfcHBtbSh3MSwgdzAsIHUsIHYpIFwKKyAgX19hc21fXyAoInVtdWwgJTIsJTMsJTE7cmQgJSV5LCUwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICA6ICI9ciIgKChVU0l0eXBlKSh3MSkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgIj1yIiAoKFVTSXR5cGUpKHcwKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgOiAiciIgKChVU0l0eXBlKSh1KSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICJyIiAoKFVTSXR5cGUpKHYpKSkKKyNkZWZpbmUgVU1VTF9USU1FIDUKKyNpZm5kZWYgU1VQRVJTUEFSQwkvKiBTdXBlclNQQVJDJ3MgdWRpdiBvbmx5IGhhbmRsZXMgNTMgYml0IGRpdmlkZW5kcyAqLworI2RlZmluZSB1ZGl2X3Fybm5kKHEsIHIsIG4xLCBuMCwgZCkgXAorICBkbyB7CQkJCQkJCQkJXAorICAgIFVTSXR5cGUgX19xOwkJCQkJCQlcCisgICAgX19hc21fXyAoIm1vdiAlMSwlJXk7bm9wO25vcDtub3A7dWRpdiAlMiwlMywlMCIgICAgICAgICAgICAgICAgICAgICBcCisJICAgICA6ICI9ciIgKChVU0l0eXBlKShfX3EpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgIDogInIiICgoVVNJdHlwZSkobjEpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgICAiciIgKChVU0l0eXBlKShuMCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAgICJyIiAoKFVTSXR5cGUpKGQpKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAocikgPSAobjApIC0gX19xICogKGQpOwkJCQkJCVwKKyAgICAocSkgPSBfX3E7CQkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZGVmaW5lIFVESVZfVElNRSAyNQorI2VuZGlmIC8qIFNVUEVSU1BBUkMgKi8KKyNlbHNlIC8qICEgX19zcGFyY192OF9fICovCisjaWYgZGVmaW5lZCAoX19zcGFyY2xpdGVfXykKKy8qIFRoaXMgaGFzIGhhcmR3YXJlIG11bHRpcGx5IGJ1dCBub3QgZGl2aWRlLiAgSXQgYWxzbyBoYXMgdHdvIGFkZGl0aW9uYWwKKyAgIGluc3RydWN0aW9ucyBzY2FuIChmZnMgZnJvbSBoaWdoIGJpdCkgYW5kIGRpdnNjYy4gICovCisjZGVmaW5lIHVtdWxfcHBtbSh3MSwgdzAsIHUsIHYpIFwKKyAgX19hc21fXyAoInVtdWwgJTIsJTMsJTE7cmQgJSV5LCUwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICA6ICI9ciIgKChVU0l0eXBlKSh3MSkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgIj1yIiAoKFVTSXR5cGUpKHcwKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgOiAiciIgKChVU0l0eXBlKSh1KSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICJyIiAoKFVTSXR5cGUpKHYpKSkKKyNkZWZpbmUgVU1VTF9USU1FIDUKKyNkZWZpbmUgdWRpdl9xcm5uZChxLCByLCBuMSwgbjAsIGQpIFwKKyAgX19hc21fXyAoIiEgSW5saW5lZCB1ZGl2X3Fybm5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiBcCisgIiAgICAgICAgd3IJJSVnMCwlMiwlJXkJISBOb3QgYSBkZWxheWVkIHdyaXRlIGZvciBzcGFyY2xpdGUgIFxuIiBcCisgIiAgICAgICAgdHN0CSUlZzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBkaXZzY2MJJTMsJTQsJSVnMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBkaXZzY2MJJSVnMSwlNCwlJWcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBkaXZzY2MJJSVnMSwlNCwlJWcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBkaXZzY2MJJSVnMSwlNCwlJWcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBkaXZzY2MJJSVnMSwlNCwlJWcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBkaXZzY2MJJSVnMSwlNCwlJWcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBkaXZzY2MJJSVnMSwlNCwlJWcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBkaXZzY2MJJSVnMSwlNCwlJWcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBkaXZzY2MJJSVnMSwlNCwlJWcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBkaXZzY2MJJSVnMSwlNCwlJWcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBkaXZzY2MJJSVnMSwlNCwlJWcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBkaXZzY2MJJSVnMSwlNCwlJWcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBkaXZzY2MJJSVnMSwlNCwlJWcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBkaXZzY2MJJSVnMSwlNCwlJWcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBkaXZzY2MJJSVnMSwlNCwlJWcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBkaXZzY2MJJSVnMSwlNCwlJWcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBkaXZzY2MJJSVnMSwlNCwlJWcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBkaXZzY2MJJSVnMSwlNCwlJWcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBkaXZzY2MJJSVnMSwlNCwlJWcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBkaXZzY2MJJSVnMSwlNCwlJWcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBkaXZzY2MJJSVnMSwlNCwlJWcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBkaXZzY2MJJSVnMSwlNCwlJWcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBkaXZzY2MJJSVnMSwlNCwlJWcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBkaXZzY2MJJSVnMSwlNCwlJWcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBkaXZzY2MJJSVnMSwlNCwlJWcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBkaXZzY2MJJSVnMSwlNCwlJWcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBkaXZzY2MJJSVnMSwlNCwlJWcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBkaXZzY2MJJSVnMSwlNCwlJWcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBkaXZzY2MJJSVnMSwlNCwlJWcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBkaXZzY2MJJSVnMSwlNCwlJWcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBkaXZzY2MJJSVnMSwlNCwlJWcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBkaXZzY2MJJSVnMSwlNCwlMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICByZAklJXksJTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiBcCisgIiAgICAgICAgYmwsYSAxZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIgXAorICIgICAgICAgIGFkZAklMSwlNCwlMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiBcCisgIjE6CSEgRW5kIG9mIGlubGluZSB1ZGl2X3Fybm5kIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgOiAiPXIiICgoVVNJdHlwZSkocSkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICI9ciIgKChVU0l0eXBlKShyKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgIDogInIiICgoVVNJdHlwZSkobjEpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiciIgKChVU0l0eXBlKShuMCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICJySSIgKChVU0l0eXBlKShkKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgIDogIiVnMSIgX19BTkRfQ0xPQkJFUl9DQykKKyNkZWZpbmUgVURJVl9USU1FIDM3CisjZGVmaW5lIGNvdW50X2xlYWRpbmdfemVyb3MoY291bnQsIHgpIFwKKyAgX19hc21fXyAoInNjYW4gJTEsMCwlMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICA6ICI9ciIgKChVU0l0eXBlKSh4KSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgIDogInIiICgoVVNJdHlwZSkoY291bnQpKSkKKy8qIEVhcmx5IHNwYXJjbGl0ZXMgcmV0dXJuIDYzIGZvciBhbiBhcmd1bWVudCBvZiAwLCBidXQgdGhleSB3YXJuIHRoYXQgZnV0dXJlCisgICBpbXBsZW1lbnRhdGlvbnMgbWlnaHQgY2hhbmdlIHRoaXMuICBUaGVyZWZvcmUsIGxlYXZlIENPVU5UX0xFQURJTkdfWkVST1NfMAorICAgdW5kZWZpbmVkLiAgKi8KKyNlbmRpZiAvKiBfX3NwYXJjbGl0ZV9fICovCisjZW5kaWYgLyogX19zcGFyY192OF9fICovCisvKiBEZWZhdWx0IHRvIHNwYXJjIHY3IHZlcnNpb25zIG9mIHVtdWxfcHBtbSBhbmQgdWRpdl9xcm5uZC4gICovCisjaWZuZGVmIHVtdWxfcHBtbQorI2RlZmluZSB1bXVsX3BwbW0odzEsIHcwLCB1LCB2KSBcCisgIF9fYXNtX18gKCIhIElubGluZWQgdW11bF9wcG1tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiBcCisgIiAgICAgICAgd3IJJSVnMCwlMiwlJXkJISBTUEFSQyBoYXMgMC0zIGRlbGF5IGluc24gYWZ0ZXIgYSB3ciAgXG4iIFwKKyAiICAgICAgICBzcmEJJTMsMzEsJSVnMgkhIERvbid0IG1vdmUgdGhpcyBpbnNuICAgICAgICAgICAgICAgICBcbiIgXAorICIgICAgICAgIGFuZAklMiwlJWcyLCUlZzIJISBEb24ndCBtb3ZlIHRoaXMgaW5zbiAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBhbmRjYwklJWcwLDAsJSVnMQkhIERvbid0IG1vdmUgdGhpcyBpbnNuICAgICAgICAgICAgICAgICBcbiIgXAorICIgICAgICAgIG11bHNjYwklJWcxLCUzLCUlZzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiBcCisgIiAgICAgICAgbXVsc2NjCSUlZzEsJTMsJSVnMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBtdWxzY2MJJSVnMSwlMywlJWcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIgXAorICIgICAgICAgIG11bHNjYwklJWcxLCUzLCUlZzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiBcCisgIiAgICAgICAgbXVsc2NjCSUlZzEsJTMsJSVnMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBtdWxzY2MJJSVnMSwlMywlJWcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIgXAorICIgICAgICAgIG11bHNjYwklJWcxLCUzLCUlZzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiBcCisgIiAgICAgICAgbXVsc2NjCSUlZzEsJTMsJSVnMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBtdWxzY2MJJSVnMSwlMywlJWcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIgXAorICIgICAgICAgIG11bHNjYwklJWcxLCUzLCUlZzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiBcCisgIiAgICAgICAgbXVsc2NjCSUlZzEsJTMsJSVnMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBtdWxzY2MJJSVnMSwlMywlJWcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIgXAorICIgICAgICAgIG11bHNjYwklJWcxLCUzLCUlZzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiBcCisgIiAgICAgICAgbXVsc2NjCSUlZzEsJTMsJSVnMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBtdWxzY2MJJSVnMSwlMywlJWcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIgXAorICIgICAgICAgIG11bHNjYwklJWcxLCUzLCUlZzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiBcCisgIiAgICAgICAgbXVsc2NjCSUlZzEsJTMsJSVnMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBtdWxzY2MJJSVnMSwlMywlJWcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIgXAorICIgICAgICAgIG11bHNjYwklJWcxLCUzLCUlZzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiBcCisgIiAgICAgICAgbXVsc2NjCSUlZzEsJTMsJSVnMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBtdWxzY2MJJSVnMSwlMywlJWcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIgXAorICIgICAgICAgIG11bHNjYwklJWcxLCUzLCUlZzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiBcCisgIiAgICAgICAgbXVsc2NjCSUlZzEsJTMsJSVnMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBtdWxzY2MJJSVnMSwlMywlJWcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIgXAorICIgICAgICAgIG11bHNjYwklJWcxLCUzLCUlZzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiBcCisgIiAgICAgICAgbXVsc2NjCSUlZzEsJTMsJSVnMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBtdWxzY2MJJSVnMSwlMywlJWcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIgXAorICIgICAgICAgIG11bHNjYwklJWcxLCUzLCUlZzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiBcCisgIiAgICAgICAgbXVsc2NjCSUlZzEsJTMsJSVnMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBtdWxzY2MJJSVnMSwlMywlJWcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIgXAorICIgICAgICAgIG11bHNjYwklJWcxLCUzLCUlZzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiBcCisgIiAgICAgICAgbXVsc2NjCSUlZzEsJTMsJSVnMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICBtdWxzY2MJJSVnMSwwLCUlZzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIgXAorICIgICAgICAgIGFkZAklJWcxLCUlZzIsJTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iIFwKKyAiICAgICAgICByZAklJXksJTEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICA6ICI9ciIgKChVU0l0eXBlKSh3MSkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgIj1yIiAoKFVTSXR5cGUpKHcwKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgOiAiJXJJIiAoKFVTSXR5cGUpKHUpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICJyIiAoKFVTSXR5cGUpKHYpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgIDogIiVnMSIsICIlZzIiIF9fQU5EX0NMT0JCRVJfQ0MpCisjZGVmaW5lIFVNVUxfVElNRSAzOQkJLyogMzkgaW5zdHJ1Y3Rpb25zICovCisjZW5kaWYKKyNpZm5kZWYgdWRpdl9xcm5uZAorI2lmbmRlZiBMT05HTE9OR19TVEFOREFMT05FCisjZGVmaW5lIHVkaXZfcXJubmQocSwgciwgbjEsIG4wLCBkKSBcCisgIGRvIHsgVVNJdHlwZSBfX3I7CQkJCQkJCVwKKyAgICAocSkgPSBfX3VkaXZfcXJubmQgKCZfX3IsIChuMSksIChuMCksIChkKSk7IAkJCVwKKyAgICAocikgPSBfX3I7CQkJCQkJCQlcCisgIH0gd2hpbGUgKDApCitleHRlcm4gVVNJdHlwZSBfX3VkaXZfcXJubmQgKCk7CisjZGVmaW5lIFVESVZfVElNRSAxNDAKKyNlbmRpZiAvKiBMT05HTE9OR19TVEFOREFMT05FICovCisjZW5kaWYgLyogdWRpdl9xcm5uZCAqLworI2VuZGlmIC8qIF9fc3BhcmNfXyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKiAgVkFYICAqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZCAoX192YXhfXykgJiYgV19UWVBFX1NJWkUgPT0gMzIKKyNkZWZpbmUgYWRkX3NzYWFhYShzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisgIF9fYXNtX18gKCJhZGRsMiAlNSwlMVxuIiBcCisJICAgImFkd2MgJTMsJTAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICA6ICI9ZyIgKChVU0l0eXBlKShzaCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgIj0mZyIgKChVU0l0eXBlKShzbCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgOiAiJTAiICgoVVNJdHlwZSkoYWgpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICJnIiAoKFVTSXR5cGUpKGJoKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgIiUxIiAoKFVTSXR5cGUpKGFsKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiZyIgKChVU0l0eXBlKShibCkpKQorI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgX19hc21fXyAoInN1YmwyICU1LCUxXG4iIFwKKwkgICAic2J3YyAlMywlMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgIDogIj1nIiAoKFVTSXR5cGUpKHNoKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiPSZnIiAoKFVTSXR5cGUpKHNsKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICA6ICIwIiAoKFVTSXR5cGUpKGFoKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgImciICgoVVNJdHlwZSkoYmgpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiMSIgKChVU0l0eXBlKShhbCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICJnIiAoKFVTSXR5cGUpKGJsKSkpCisjZGVmaW5lIHVtdWxfcHBtbSh4aCwgeGwsIG0wLCBtMSkgXAorICBkbyB7CQkJCQkJCQkJXAorICAgIHVuaW9uIHtVREl0eXBlIF9fbGw7CQkJCQkJXAorCSAgIHN0cnVjdCB7VVNJdHlwZSBfX2wsIF9faDt9IF9faTsJCQkJXAorCSAgfSBfX3h4OwkJCQkJCQlcCisgICAgVVNJdHlwZSBfX20wID0gKG0wKSwgX19tMSA9IChtMSk7CQkJCQlcCisgICAgX19hc21fXyAoImVtdWwgJTEsJTIsJDAsJTAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICA6ICI9ZyIgKF9feHguX19sbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgIDogImciIChfX20wKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgICAiZyIgKF9fbTEpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHhoKSA9IF9feHguX19pLl9faDsgKHhsKSA9IF9feHguX19pLl9fbDsJCQkJXAorICAgICh4aCkgKz0gKCgoKFNJdHlwZSkgX19tMCA+PiAzMSkgJiBfX20xKQkJCQlcCisJICAgICArICgoKFNJdHlwZSkgX19tMSA+PiAzMSkgJiBfX20wKSk7IAkJCVwKKyAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgc2Rpdl9xcm5uZChxLCByLCBuMSwgbjAsIGQpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICB1bmlvbiB7REl0eXBlIF9fbGw7IAkJCQkJCVwKKwkgICBzdHJ1Y3Qge1NJdHlwZSBfX2wsIF9faDt9IF9faTsJCQkJXAorCSAgfSBfX3h4OwkJCQkJCQlcCisgICAgX194eC5fX2kuX19oID0gbjE7IF9feHguX19pLl9fbCA9IG4wOwkJCQlcCisgICAgX19hc21fXyAoImVkaXYgJTMsJTIsJTAsJTEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICA6ICI9ZyIgKHEpLCAiPWciIChyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgIDogImciIChfX3h4Ll9fbGwpLCAiZyIgKGQpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorI2VuZGlmIC8qIF9fdmF4X18gKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKiogIFo4MDAwCSoqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZCAoX196ODAwMF9fKSAmJiBXX1RZUEVfU0laRSA9PSAxNgorI2RlZmluZSBhZGRfc3NhYWFhKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgX19hc21fXyAoImFkZCAlSDEsJUg1XG5cdGFkYyAgJUgwLCVIMyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICA6ICI9ciIgKCh1bnNpZ25lZCBpbnQpKHNoKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgIj0mciIgKCh1bnNpZ25lZCBpbnQpKHNsKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgOiAiJTAiICgodW5zaWduZWQgaW50KShhaCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICJyIiAoKHVuc2lnbmVkIGludCkoYmgpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgIiUxIiAoKHVuc2lnbmVkIGludCkoYWwpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiclFSIiAoKHVuc2lnbmVkIGludCkoYmwpKSkKKyNkZWZpbmUgc3ViX2RkbW1zcyhzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisgIF9fYXNtX18gKCJzdWIgJUgxLCVINVxuXHRzYmMgICVIMCwlSDMiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgOiAiPXIiICgodW5zaWduZWQgaW50KShzaCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICI9JnIiICgodW5zaWduZWQgaW50KShzbCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgIDogIjAiICgodW5zaWduZWQgaW50KShhaCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAiciIgKCh1bnNpZ25lZCBpbnQpKGJoKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICIxIiAoKHVuc2lnbmVkIGludCkoYWwpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgInJRUiIgKCh1bnNpZ25lZCBpbnQpKGJsKSkpCisjZGVmaW5lIHVtdWxfcHBtbSh4aCwgeGwsIG0wLCBtMSkgXAorICBkbyB7CQkJCQkJCQkJXAorICAgIHVuaW9uIHtsb25nIGludCBfX2xsOwkJCQkJCVwKKwkgICBzdHJ1Y3Qge3Vuc2lnbmVkIGludCBfX2gsIF9fbDt9IF9faTsgCQkJXAorCSAgfSBfX3h4OwkJCQkJCQlcCisgICAgdW5zaWduZWQgaW50IF9fbTAgPSAobTApLCBfX20xID0gKG0xKTsJCQkJXAorICAgIF9fYXNtX18gKCJtdWx0ICAgICAgJVMwLCVIMyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgOiAiPXIiIChfX3h4Ll9faS5fX2gpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAgICI9ciIgKF9feHguX19pLl9fbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgIDogIiUxIiAoX19tMCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgICAiclFSIiAoX19tMSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHhoKSA9IF9feHguX19pLl9faDsgKHhsKSA9IF9feHguX19pLl9fbDsJCQkJXAorICAgICh4aCkgKz0gKCgoKHNpZ25lZCBpbnQpIF9fbTAgPj4gMTUpICYgX19tMSkgCQkJXAorCSAgICAgKyAoKChzaWduZWQgaW50KSBfX20xID4+IDE1KSAmIF9fbTApKTsJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYgLyogX196ODAwMF9fICovCisKKyNlbmRpZiAvKiBfX0dOVUNfXyAqLworI2VuZGlmIC8qICFfX3Jpc2Nvc19fICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqICBHZW5lcmljIFZlcnNpb25zCSoqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmICFkZWZpbmVkICh1bXVsX3BwbW0pICYmIGRlZmluZWQgKF9fdW11bHNpZGkzKQorI2RlZmluZSB1bXVsX3BwbW0ocGgsIHBsLCBtMCwgbTEpIFwKKyAgewkJCQkJCQkJCVwKKyAgICBVRFd0eXBlIF9fbGwgPSBfX3VtdWxzaWRpMyAobTAsIG0xKTsJCQkJXAorICAgIHBoID0gKFVXdHlwZSkgKF9fbGwgPj4gV19UWVBFX1NJWkUpOwkJCQlcCisgICAgcGwgPSAoVVd0eXBlKSBfX2xsOyAJCQkJCQlcCisgIH0KKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9fdW11bHNpZGkzKQorI2RlZmluZSBfX3VtdWxzaWRpMyh1LCB2KSBcCisgICh7VVd0eXBlIF9faGksIF9fbG87CQkJCQkJCVwKKyAgICB1bXVsX3BwbW0gKF9faGksIF9fbG8sIHUsIHYpOwkJCQkJXAorICAgICgoVURXdHlwZSkgX19oaSA8PCBXX1RZUEVfU0laRSkgfCBfX2xvOyB9KQorI2VuZGlmCisKKy8qIElmIHRoaXMgbWFjaGluZSBoYXMgbm8gaW5saW5lIGFzc2VtYmxlciwgdXNlIEMgbWFjcm9zLiAgKi8KKworI2lmICFkZWZpbmVkIChhZGRfc3NhYWFhKQorI2RlZmluZSBhZGRfc3NhYWFhKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBVV3R5cGUgX194OyAJCQkJCQkJXAorICAgIF9feCA9IChhbCkgKyAoYmwpOwkJCQkJCQlcCisgICAgKHNoKSA9IChhaCkgKyAoYmgpICsgKF9feCA8IChhbCkpOwkJCQkJXAorICAgIChzbCkgPSBfX3g7IAkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChzdWJfZGRtbXNzKQorI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBVV3R5cGUgX194OyAJCQkJCQkJXAorICAgIF9feCA9IChhbCkgLSAoYmwpOwkJCQkJCQlcCisgICAgKHNoKSA9IChhaCkgLSAoYmgpIC0gKF9feCA+IChhbCkpOwkJCQkJXAorICAgIChzbCkgPSBfX3g7IAkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworI2lmICFkZWZpbmVkICh1bXVsX3BwbW0pCisjZGVmaW5lIHVtdWxfcHBtbSh3MSwgdzAsIHUsIHYpIAkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIFVXdHlwZSBfX3gwLCBfX3gxLCBfX3gyLCBfX3gzOwkJCQkJXAorICAgIFVIV3R5cGUgX191bCwgX192bCwgX191aCwgX192aDsJCQkJCVwKKyAgICBVV3R5cGUgX191ID0gKHUpLCBfX3YgPSAodik7CQkJCQlcCisJCQkJCQkJCQlcCisgICAgX191bCA9IF9fbGxfbG93cGFydCAoX191KTsJCQkJCQlcCisgICAgX191aCA9IF9fbGxfaGlnaHBhcnQgKF9fdSk7IAkJCQkJXAorICAgIF9fdmwgPSBfX2xsX2xvd3BhcnQgKF9fdik7CQkJCQkJXAorICAgIF9fdmggPSBfX2xsX2hpZ2hwYXJ0IChfX3YpOyAJCQkJCVwKKwkJCQkJCQkJCVwKKyAgICBfX3gwID0gKFVXdHlwZSkgX191bCAqIF9fdmw7CQkJCQlcCisgICAgX194MSA9IChVV3R5cGUpIF9fdWwgKiBfX3ZoOwkJCQkJXAorICAgIF9feDIgPSAoVVd0eXBlKSBfX3VoICogX192bDsJCQkJCVwKKyAgICBfX3gzID0gKFVXdHlwZSkgX191aCAqIF9fdmg7CQkJCQlcCisJCQkJCQkJCQlcCisgICAgX194MSArPSBfX2xsX2hpZ2hwYXJ0IChfX3gwKTsvKiB0aGlzIGNhbid0IGdpdmUgY2FycnkgKi8gICAgICAgICAgICBcCisgICAgX194MSArPSBfX3gyOwkJLyogYnV0IHRoaXMgaW5kZWVkIGNhbiAqLwkJXAorICAgIGlmIChfX3gxIDwgX194MikJCS8qIGRpZCB3ZSBnZXQgaXQ/ICovCQkJXAorICAgICAgX194MyArPSBfX2xsX0I7CQkvKiB5ZXMsIGFkZCBpdCBpbiB0aGUgcHJvcGVyIHBvcy4gKi8JXAorCQkJCQkJCQkJXAorICAgICh3MSkgPSBfX3gzICsgX19sbF9oaWdocGFydCAoX194MSk7IAkJCQlcCisgICAgKHcwKSA9IChfX2xsX2xvd3BhcnQgKF9feDEpIDw8IFdfVFlQRV9TSVpFLzIpICsgX19sbF9sb3dwYXJ0IChfX3gwKTtcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworI2lmICFkZWZpbmVkICh1bXVsX3BwbW0pCisjZGVmaW5lIHNtdWxfcHBtbSh3MSwgdzAsIHUsIHYpIAkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIFVXdHlwZSBfX3cxOwkJCQkJCQlcCisgICAgVVd0eXBlIF9fbTAgPSAodSksIF9fbTEgPSAodik7CQkJCQlcCisgICAgdW11bF9wcG1tIChfX3cxLCB3MCwgX19tMCwgX19tMSk7CQkJCQlcCisgICAgKHcxKSA9IF9fdzEgLSAoLShfX20wID4+IChXX1RZUEVfU0laRSAtIDEpKSAmIF9fbTEpIAkJXAorCQktICgtKF9fbTEgPj4gKFdfVFlQRV9TSVpFIC0gMSkpICYgX19tMCk7CQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworLyogRGVmaW5lIHRoaXMgdW5jb25kaXRpb25hbGx5LCBzbyBpdCBjYW4gYmUgdXNlZCBmb3IgZGVidWdnaW5nLiAgKi8KKyNkZWZpbmUgX191ZGl2X3Fybm5kX2MocSwgciwgbjEsIG4wLCBkKSBcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgVVd0eXBlIF9fZDEsIF9fZDAsIF9fcTEsIF9fcTAsIF9fcjEsIF9fcjAsIF9fbTsJCQlcCisgICAgX19kMSA9IF9fbGxfaGlnaHBhcnQgKGQpOwkJCQkJCVwKKyAgICBfX2QwID0gX19sbF9sb3dwYXJ0IChkKTsJCQkJCQlcCisJCQkJCQkJCQlcCisgICAgX19yMSA9IChuMSkgJSBfX2QxOyAJCQkJCQlcCisgICAgX19xMSA9IChuMSkgLyBfX2QxOyAJCQkJCQlcCisgICAgX19tID0gKFVXdHlwZSkgX19xMSAqIF9fZDA7IAkJCQkJXAorICAgIF9fcjEgPSBfX3IxICogX19sbF9CIHwgX19sbF9oaWdocGFydCAobjApOwkJCQlcCisgICAgaWYgKF9fcjEgPCBfX20pCQkJCQkJCVwKKyAgICAgIHsgCQkJCQkJCQlcCisJX19xMS0tLCBfX3IxICs9IChkKTsJCQkJCQlcCisJaWYgKF9fcjEgPj0gKGQpKSAvKiBpLmUuIHdlIGRpZG4ndCBnZXQgY2Fycnkgd2hlbiBhZGRpbmcgdG8gX19yMSAqL1wKKwkgIGlmIChfX3IxIDwgX19tKQkJCQkJCVwKKwkgICAgX19xMS0tLCBfX3IxICs9IChkKTsJCQkJCVwKKyAgICAgIH0gCQkJCQkJCQlcCisgICAgX19yMSAtPSBfX207CQkJCQkJCVwKKwkJCQkJCQkJCVwKKyAgICBfX3IwID0gX19yMSAlIF9fZDE7IAkJCQkJCVwKKyAgICBfX3EwID0gX19yMSAvIF9fZDE7IAkJCQkJCVwKKyAgICBfX20gPSAoVVd0eXBlKSBfX3EwICogX19kMDsgCQkJCQlcCisgICAgX19yMCA9IF9fcjAgKiBfX2xsX0IgfCBfX2xsX2xvd3BhcnQgKG4wKTsJCQkJXAorICAgIGlmIChfX3IwIDwgX19tKQkJCQkJCQlcCisgICAgICB7IAkJCQkJCQkJXAorCV9fcTAtLSwgX19yMCArPSAoZCk7CQkJCQkJXAorCWlmIChfX3IwID49IChkKSkJCQkJCQlcCisJICBpZiAoX19yMCA8IF9fbSkJCQkJCQlcCisJICAgIF9fcTAtLSwgX19yMCArPSAoZCk7CQkJCQlcCisgICAgICB9IAkJCQkJCQkJXAorICAgIF9fcjAgLT0gX19tOwkJCQkJCQlcCisJCQkJCQkJCQlcCisgICAgKHEpID0gKFVXdHlwZSkgX19xMSAqIF9fbGxfQiB8IF9fcTA7CQkJCVwKKyAgICAocikgPSBfX3IwOyAJCQkJCQkJXAorICB9IHdoaWxlICgwKQorCisvKiBJZiB0aGUgcHJvY2Vzc29yIGhhcyBubyB1ZGl2X3Fybm5kIGJ1dCBzZGl2X3Fybm5kLCBnbyB0aHJvdWdoCisgICBfX3VkaXZfd19zZGl2IChkZWZpbmVkIGluIGxpYmdjYyBvciBlbHNld2hlcmUpLiAgKi8KKyNpZiAhZGVmaW5lZCAodWRpdl9xcm5uZCkgJiYgZGVmaW5lZCAoc2Rpdl9xcm5uZCkKKyNkZWZpbmUgdWRpdl9xcm5uZChxLCByLCBuaCwgbmwsIGQpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBVV3R5cGUgX19yOyAJCQkJCQkJXAorICAgIChxKSA9IF9fTVBOKHVkaXZfd19zZGl2KSAoJl9fciwgbmgsIG5sLCBkKTsgCQkJXAorICAgIChyKSA9IF9fcjsJCQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisvKiBJZiB1ZGl2X3Fybm5kIHdhcyBub3QgZGVmaW5lZCBmb3IgdGhpcyBwcm9jZXNzb3IsIHVzZSBfX3VkaXZfcXJubmRfYy4gICovCisjaWYgIWRlZmluZWQgKHVkaXZfcXJubmQpCisjZGVmaW5lIFVESVZfTkVFRFNfTk9STUFMSVpBVElPTiAxCisjZGVmaW5lIHVkaXZfcXJubmQgX191ZGl2X3Fybm5kX2MKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKGNvdW50X2xlYWRpbmdfemVyb3MpCitleHRlcm4KKyNpZmRlZiBfX1NURENfXworY29uc3QKKyNlbmRpZgordW5zaWduZWQgY2hhciBfZ2NyeV9jbHpfdGFiW107CisjZGVmaW5lIE1QSV9JTlRFUk5BTF9ORUVEX0NMWl9UQUIgMQorI2RlZmluZSBjb3VudF9sZWFkaW5nX3plcm9zKGNvdW50LCB4KSBcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgVVd0eXBlIF9feHIgPSAoeCk7CQkJCQkJCVwKKyAgICBVV3R5cGUgX19hOyAJCQkJCQkJXAorCQkJCQkJCQkJXAorICAgIGlmIChXX1RZUEVfU0laRSA8PSAzMikJCQkJCQlcCisgICAgICB7IAkJCQkJCQkJXAorCV9fYSA9IF9feHIgPCAoKFVXdHlwZSkgMSA8PCAyKl9fQklUUzQpCQkJCVwKKwkgID8gKF9feHIgPCAoKFVXdHlwZSkgMSA8PCBfX0JJVFM0KSA/IDAgOiBfX0JJVFM0KQkJXAorCSAgOiAoX194ciA8ICgoVVd0eXBlKSAxIDw8IDMqX19CSVRTNCkgPyAgMipfX0JJVFM0IDogMypfX0JJVFM0KTtcCisgICAgICB9IAkJCQkJCQkJXAorICAgIGVsc2UJCQkJCQkJCVwKKyAgICAgIHsgCQkJCQkJCQlcCisJZm9yIChfX2EgPSBXX1RZUEVfU0laRSAtIDg7IF9fYSA+IDA7IF9fYSAtPSA4KQkJCVwKKwkgIGlmICgoKF9feHIgPj4gX19hKSAmIDB4ZmYpICE9IDApCQkJCVwKKwkgICAgYnJlYWs7CQkJCQkJCVwKKyAgICAgIH0gCQkJCQkJCQlcCisJCQkJCQkJCQlcCisgICAgKGNvdW50KSA9IFdfVFlQRV9TSVpFIC0gKF9nY3J5X2Nsel90YWJbX194ciA+PiBfX2FdICsgX19hKTsJCVwKKyAgfSB3aGlsZSAoMCkKKy8qIFRoaXMgdmVyc2lvbiBnaXZlcyBhIHdlbGwtZGVmaW5lZCB2YWx1ZSBmb3IgemVyby4gKi8KKyNkZWZpbmUgQ09VTlRfTEVBRElOR19aRVJPU18wIFdfVFlQRV9TSVpFCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChjb3VudF90cmFpbGluZ196ZXJvcykKKy8qIERlZmluZSBjb3VudF90cmFpbGluZ196ZXJvcyB1c2luZyBjb3VudF9sZWFkaW5nX3plcm9zLiAgVGhlIGxhdHRlciBtaWdodCBiZQorICAgZGVmaW5lZCBpbiBhc20sIGJ1dCBpZiBpdCBpcyBub3QsIHRoZSBDIHZlcnNpb24gYWJvdmUgaXMgZ29vZCBlbm91Z2guICAqLworI2RlZmluZSBjb3VudF90cmFpbGluZ196ZXJvcyhjb3VudCwgeCkgXAorICBkbyB7CQkJCQkJCQkJXAorICAgIFVXdHlwZSBfX2N0el94ID0gKHgpOwkJCQkJCVwKKyAgICBVV3R5cGUgX19jdHpfYzsJCQkJCQkJXAorICAgIGNvdW50X2xlYWRpbmdfemVyb3MgKF9fY3R6X2MsIF9fY3R6X3ggJiAtX19jdHpfeCk7CQkJXAorICAgIChjb3VudCkgPSBXX1RZUEVfU0laRSAtIDEgLSBfX2N0el9jOwkJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworI2lmbmRlZiBVRElWX05FRURTX05PUk1BTElaQVRJT04KKyNkZWZpbmUgVURJVl9ORUVEU19OT1JNQUxJWkFUSU9OIDAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9tNjhrL01hbmlmZXN0IGIvbGliZ2NyeXB0LTEuNC42L21waS9tNjhrL01hbmlmZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMDUzOGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL202OGsvTWFuaWZlc3QKQEAgLTAsMCArMSwyNSBAQAorIyBNYW5pZmVzdCAtIGNoZWNrc3VtcyAKKyMgQ29weXJpZ2h0IDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyMKKyMgTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIGdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisKK3N5bnRheC5oCittcGloLWxzaGlmdC5TCittcGloLXJzaGlmdC5TCittcGloLWFkZDEuUworbXBpaC1zdWIxLlMKKyRuYW1lcyQgaVFDVkF3VUFQK0xtVERFQW5wODMyUy83QVFKSFVBUC9keGZxMlUwcERjNVpMb0Vpem9xZ2pqY25ISXliOUVqTUczWWp2Z0s2alE2MnlvQU9DdW8vakZZbEpTK01kdmU2YmdmZFR6WU1ybktWN0JHMlNFY3diMjYzcFZuSW50UzdaaEtRUGlNQ2JGZ1hXUjJWak4zK2Exdjh5alFEWnRncUVnbThPbFErdTdqS0JZMTNPcnlpdXE1blBOeHNYWnFKcGVsRzZaa2RnOU09PVBJZWUKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvbTY4ay9kaXN0ZmlsZXMgYi9saWJnY3J5cHQtMS40LjYvbXBpL202OGsvZGlzdGZpbGVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMmUzNmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL202OGsvZGlzdGZpbGVzCkBAIC0wLDAgKzEsOSBAQAorTWFuaWZlc3QKK3N5bnRheC5oCittcGloLWxzaGlmdC5TCittcGloLXJzaGlmdC5TCittcGloLWFkZDEuUworbXBpaC1zdWIxLlMKKworCisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvbTY4ay9tYzY4MDIwL01hbmlmZXN0IGIvbGliZ2NyeXB0LTEuNC42L21waS9tNjhrL21jNjgwMjAvTWFuaWZlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNiMjc2OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvbTY4ay9tYzY4MDIwL01hbmlmZXN0CkBAIC0wLDAgKzEsMjMgQEAKKyMgTWFuaWZlc3QgLSBjaGVja3N1bXMgCisjIENvcHlyaWdodCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisjCisjIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBnZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorCittcGloLW11bDEuUworbXBpaC1tdWwyLlMKK21waWgtbXVsMy5TCiskbmFtZXMkIGlRQ1ZBd1VBUCtMbVJURUFucDgzMlMvN0FRSzNyd1AvVHlHQmJpaTVIQ3JqRGlMQ1ZKSGlETmVPZEVOeDZBaWNSWG51NHZ1Sm1NbVBaMHkraTdNUHVzRGFlVGJJVUEwdzZSYUp4K0VwNDFuSXZ0aG1ORG5GZVBZNU13MHBJVUpjcEk3QUpSNHZZcXB3TlFBNm5sRWRuL20xamc2c1BMS1pYVVhOVWtocm9FemNIem9VKzEyQlBTK252U1hsd1Nrc2c2clhFR09KK01zPT1YQ1hQCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL202OGsvbWM2ODAyMC9kaXN0ZmlsZXMgYi9saWJnY3J5cHQtMS40LjYvbXBpL202OGsvbWM2ODAyMC9kaXN0ZmlsZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI5NjQzMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvbTY4ay9tYzY4MDIwL2Rpc3RmaWxlcwpAQCAtMCwwICsxLDQgQEAKK01hbmlmZXN0CittcGloLW11bDEuUworbXBpaC1tdWwyLlMKK21waWgtbXVsMy5TCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL202OGsvbWM2ODAyMC9tcGloLW11bDEuUyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvbTY4ay9tYzY4MDIwL21waWgtbXVsMS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwN2M5NGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL202OGsvbWM2ODAyMC9tcGloLW11bDEuUwpAQCAtMCwwICsxLDEwNCBAQAorLyogbWM2ODAyMCBfX21wbl9tdWxfMSAtLSBNdWx0aXBseSBhIGxpbWIgdmVjdG9yIHdpdGggYSBsaW1iIGFuZCBzdG9yZQorICogICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmVzdWx0IGluIGEgc2Vjb25kIGxpbWIgdmVjdG9yLgorICoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk0LCAxOTk2LCAxOTk4LAorICogICAgICAgICAgICAgICAgICAgIDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKiAgICAgICAKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqCisgKiBOb3RlOiBUaGlzIGNvZGUgaXMgaGVhdmlseSBiYXNlZCBvbiB0aGUgR05VIE1QIExpYnJhcnkuCisgKgkgQWN0dWFsbHkgaXQncyB0aGUgc2FtZSBjb2RlIHdpdGggb25seSBtaW5vciBjaGFuZ2VzIGluIHRoZQorICoJIHdheSB0aGUgZGF0YSBpcyBzdG9yZWQ7IHRoaXMgaXMgdG8gc3VwcG9ydCB0aGUgYWJzdHJhY3Rpb24KKyAqCSBvZiBhbiBvcHRpb25hbCBzZWN1cmUgbWVtb3J5IGFsbG9jYXRpb24gd2hpY2ggbWF5IGJlIHVzZWQKKyAqCSB0byBhdm9pZCByZXZlYWxpbmcgb2Ygc2Vuc2l0aXZlIGRhdGEgZHVlIHRvIHBhZ2luZyBldGMuCisgKi8KKworCisKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJhc20tc3ludGF4LmgiCisKKworLyoqKioqKioqKioqKioqKioqKioKKyAqIG1waV9saW1iX3QKKyAqIF9nY3J5X21waWhfbXVsXzEoIG1waV9wdHJfdCByZXNfcHRyLAkoc3AgKyA0KQorICoJCSAgbXBpX3B0cl90IHMxX3B0ciwJKHNwICsgOCkKKyAqCQkgIG1waV9zaXplX3QgczFfc2l6ZSwJKHNwICsgMTIpCisgKgkJICBtcGlfbGltYl90IHMyX2xpbWIpCShzcCArIDE2KQorICovCisKKworCVRFWFQKKwlBTElHTgorCUdMT0JMCUNfU1lNQk9MX05BTUUoX2djcnlfbXBpaF9tdWxfMSkKKworQ19TWU1CT0xfTkFNRShfZ2NyeV9tcGloX211bF8xOikKK1BST0xPRyhfZ2NyeV9tcGloX211bF8xKQorCisjZGVmaW5lIHJlc19wdHIgYTAKKyNkZWZpbmUgczFfcHRyIGExCisjZGVmaW5lIHMxX3NpemUgZDIKKyNkZWZpbmUgczJfbGltYiBkNAorCisvKiBTYXZlIHVzZWQgcmVnaXN0ZXJzIG9uIHRoZSBzdGFjay4gICovCisJbW92ZW1sCVIoZDIpLVIoZDQpLE1FTV9QUkVERUMoc3ApCisjaWYgMAorCW1vdmVsCVIoZDIpLE1FTV9QUkVERUMoc3ApCisJbW92ZWwJUihkMyksTUVNX1BSRURFQyhzcCkKKwltb3ZlbAlSKGQ0KSxNRU1fUFJFREVDKHNwKQorI2VuZGlmCisKKy8qIENvcHkgdGhlIGFyZ3VtZW50cyB0byByZWdpc3RlcnMuICBCZXR0ZXIgdXNlIG1vdmVtPwkqLworCW1vdmVsCU1FTV9ESVNQKHNwLDE2KSxSKHJlc19wdHIpCisJbW92ZWwJTUVNX0RJU1Aoc3AsMjApLFIoczFfcHRyKQorCW1vdmVsCU1FTV9ESVNQKHNwLDI0KSxSKHMxX3NpemUpCisJbW92ZWwJTUVNX0RJU1Aoc3AsMjgpLFIoczJfbGltYikKKworCWVvcncJIzEsUihzMV9zaXplKQorCWNscmwJUihkMSkKKwlsc3JsCSMxLFIoczFfc2l6ZSkKKwliY2MJTChMMSkKKwlzdWJxbAkjMSxSKHMxX3NpemUpCisJc3VibAlSKGQwKSxSKGQwKQkvKiAoZDAsY3kpIDw9ICgwLDApICovCisKK0woTG9vcDopCisJbW92ZWwJTUVNX1BPU1RJTkMoczFfcHRyKSxSKGQzKQorCW11bHVsCVIoczJfbGltYiksUihkMSk6UihkMykKKwlhZGR4bAlSKGQwKSxSKGQzKQorCW1vdmVsCVIoZDMpLE1FTV9QT1NUSU5DKHJlc19wdHIpCitMKEwxOikJbW92ZWwJTUVNX1BPU1RJTkMoczFfcHRyKSxSKGQzKQorCW11bHVsCVIoczJfbGltYiksUihkMCk6UihkMykKKwlhZGR4bAlSKGQxKSxSKGQzKQorCW1vdmVsCVIoZDMpLE1FTV9QT1NUSU5DKHJlc19wdHIpCisKKwlkYmYJUihzMV9zaXplKSxMKExvb3ApCisJY2xybAlSKGQzKQorCWFkZHhsCVIoZDMpLFIoZDApCisJc3VibAkjMHgxMDAwMCxSKHMxX3NpemUpCisJYmNjCUwoTG9vcCkKKworLyogUmVzdG9yZSB1c2VkIHJlZ2lzdGVycyBmcm9tIHN0YWNrIGZyYW1lLiAgKi8KKwltb3ZlbWwJTUVNX1BPU1RJTkMoc3ApLFIoZDIpLVIoZDQpCisjaWYgMAorCW1vdmVsCU1FTV9QT1NUSU5DKHNwKSxSKGQ0KQorCW1vdmVsCU1FTV9QT1NUSU5DKHNwKSxSKGQzKQorCW1vdmVsCU1FTV9QT1NUSU5DKHNwKSxSKGQyKQorI2VuZGlmCisJcnRzCitFUElMT0coX2djcnlfbXBpaF9tdWxfMSkKKworCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL202OGsvbWM2ODAyMC9tcGloLW11bDIuUyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvbTY4ay9tYzY4MDIwL21waWgtbXVsMi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YmFhOGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL202OGsvbWM2ODAyMC9tcGloLW11bDIuUwpAQCAtMCwwICsxLDk0IEBACisvKiBtYzY4MDIwIF9fbXBuX2FkZG11bF8xIC0tIE11bHRpcGx5IGEgbGltYiB2ZWN0b3Igd2l0aCBhIGxpbWIgYW5kIGFkZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmVzdWx0IHRvIGEgc2Vjb25kIGxpbWIgdmVjdG9yLgorICoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk0LCAxOTk2LCAxOTk4LCAKKyAqICAgICAgICAgICAgICAgICAgICAyMDAxLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICogICAgICAgCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKgorICogTm90ZTogVGhpcyBjb2RlIGlzIGhlYXZpbHkgYmFzZWQgb24gdGhlIEdOVSBNUCBMaWJyYXJ5LgorICoJIEFjdHVhbGx5IGl0J3MgdGhlIHNhbWUgY29kZSB3aXRoIG9ubHkgbWlub3IgY2hhbmdlcyBpbiB0aGUKKyAqCSB3YXkgdGhlIGRhdGEgaXMgc3RvcmVkOyB0aGlzIGlzIHRvIHN1cHBvcnQgdGhlIGFic3RyYWN0aW9uCisgKgkgb2YgYW4gb3B0aW9uYWwgc2VjdXJlIG1lbW9yeSBhbGxvY2F0aW9uIHdoaWNoIG1heSBiZSB1c2VkCisgKgkgdG8gYXZvaWQgcmV2ZWFsaW5nIG9mIHNlbnNpdGl2ZSBkYXRhIGR1ZSB0byBwYWdpbmcgZXRjLgorICovCisKKworI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImFzbS1zeW50YXguaCIKKworLyoqKioqKioqKioqKioqKioqKioKKyAqIG1waV9saW1iX3QKKyAqIF9nY3J5X21waWhfYWRkbXVsXzEoIG1waV9wdHJfdCByZXNfcHRyLCAgICAgIChzcCArIDQpCisgKgkJICAgICBtcGlfcHRyX3QgczFfcHRyLAkgICAgIChzcCArIDgpCisgKgkJICAgICBtcGlfc2l6ZV90IHMxX3NpemUsICAgICAoc3AgKyAxMikKKyAqCQkgICAgIG1waV9saW1iX3QgczJfbGltYikgICAgIChzcCArIDE2KQorICovCisKKworCVRFWFQKKwlBTElHTgorCUdMT0JMCUNfU1lNQk9MX05BTUUoX2djcnlfbXBpaF9hZGRtdWxfMSkKKworQ19TWU1CT0xfTkFNRShfZ2NyeV9tcGloX2FkZG11bF8xOikKK1BST0xPRyhfZ2NyeV9tcGloX2FkZG11bF8xKQorCisjZGVmaW5lIHJlc19wdHIgYTAKKyNkZWZpbmUgczFfcHRyIGExCisjZGVmaW5lIHMxX3NpemUgZDIKKyNkZWZpbmUgczJfbGltYiBkNAorCisvKiBTYXZlIHVzZWQgcmVnaXN0ZXJzIG9uIHRoZSBzdGFjay4gICovCisJbW92ZW1sCVIoZDIpLVIoZDUpLE1FTV9QUkVERUMoc3ApCisKKy8qIENvcHkgdGhlIGFyZ3VtZW50cyB0byByZWdpc3RlcnMuICBCZXR0ZXIgdXNlIG1vdmVtPwkqLworCW1vdmVsCU1FTV9ESVNQKHNwLDIwKSxSKHJlc19wdHIpCisJbW92ZWwJTUVNX0RJU1Aoc3AsMjQpLFIoczFfcHRyKQorCW1vdmVsCU1FTV9ESVNQKHNwLDI4KSxSKHMxX3NpemUpCisJbW92ZWwJTUVNX0RJU1Aoc3AsMzIpLFIoczJfbGltYikKKworCWVvcncJIzEsUihzMV9zaXplKQorCWNscmwJUihkMSkKKwljbHJsCVIoZDUpCisJbHNybAkjMSxSKHMxX3NpemUpCisJYmNjCUwoTDEpCisJc3VicWwJIzEsUihzMV9zaXplKQorCXN1YmwJUihkMCksUihkMCkJCS8qIChkMCxjeSkgPD0gKDAsMCkgKi8KKworTChMb29wOikKKwltb3ZlbAlNRU1fUE9TVElOQyhzMV9wdHIpLFIoZDMpCisJbXVsdWwJUihzMl9saW1iKSxSKGQxKTpSKGQzKQorCWFkZHhsCVIoZDApLFIoZDMpCisJYWRkeGwJUihkNSksUihkMSkKKwlhZGRsCVIoZDMpLE1FTV9QT1NUSU5DKHJlc19wdHIpCitMKEwxOikJbW92ZWwJTUVNX1BPU1RJTkMoczFfcHRyKSxSKGQzKQorCW11bHVsCVIoczJfbGltYiksUihkMCk6UihkMykKKwlhZGR4bAlSKGQxKSxSKGQzKQorCWFkZHhsCVIoZDUpLFIoZDApCisJYWRkbAlSKGQzKSxNRU1fUE9TVElOQyhyZXNfcHRyKQorCisJZGJmCVIoczFfc2l6ZSksTChMb29wKQorCWFkZHhsCVIoZDUpLFIoZDApCisJc3VibAkjMHgxMDAwMCxSKHMxX3NpemUpCisJYmNjCUwoTG9vcCkKKworLyogUmVzdG9yZSB1c2VkIHJlZ2lzdGVycyBmcm9tIHN0YWNrIGZyYW1lLiAgKi8KKwltb3ZlbWwJTUVNX1BPU1RJTkMoc3ApLFIoZDIpLVIoZDUpCisKKwlydHMKK0VQSUxPRyhfZ2NyeV9tcGloX2FkZG11bF8xKQorCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL202OGsvbWM2ODAyMC9tcGloLW11bDMuUyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvbTY4ay9tYzY4MDIwL21waWgtbXVsMy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NThlZjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL202OGsvbWM2ODAyMC9tcGloLW11bDMuUwpAQCAtMCwwICsxLDk3IEBACisvKiBtYzY4MDIwIF9fbXBuX3N1Ym11bF8xIC0tIE11bHRpcGx5IGEgbGltYiB2ZWN0b3Igd2l0aCBhIGxpbWIgYW5kIHN1YnRyYWN0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByZXN1bHQgZnJvbSBhIHNlY29uZCBsaW1iIHZlY3Rvci4KKyAqCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NCwgMTk5NiwgMTk5OCwgCisgKiAgICAgICAgICAgICAgICAgICAgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqICAgICAgIAorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICoKKyAqIE5vdGU6IFRoaXMgY29kZSBpcyBoZWF2aWx5IGJhc2VkIG9uIHRoZSBHTlUgTVAgTGlicmFyeS4KKyAqCSBBY3R1YWxseSBpdCdzIHRoZSBzYW1lIGNvZGUgd2l0aCBvbmx5IG1pbm9yIGNoYW5nZXMgaW4gdGhlCisgKgkgd2F5IHRoZSBkYXRhIGlzIHN0b3JlZDsgdGhpcyBpcyB0byBzdXBwb3J0IHRoZSBhYnN0cmFjdGlvbgorICoJIG9mIGFuIG9wdGlvbmFsIHNlY3VyZSBtZW1vcnkgYWxsb2NhdGlvbiB3aGljaCBtYXkgYmUgdXNlZAorICoJIHRvIGF2b2lkIHJldmVhbGluZyBvZiBzZW5zaXRpdmUgZGF0YSBkdWUgdG8gcGFnaW5nIGV0Yy4KKyAqLworCisKKworCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAiYXNtLXN5bnRheC5oIgorCisvKioqKioqKioqKioqKioqKioqKgorICogbXBpX2xpbWJfdAorICogX2djcnlfbXBpaF9zdWJtdWxfMSggbXBpX3B0cl90IHJlc19wdHIsICAgICAgKHNwICsgNCkKKyAqCQkgICAgIG1waV9wdHJfdCBzMV9wdHIsCSAgICAgKHNwICsgOCkKKyAqCQkgICAgIG1waV9zaXplX3QgczFfc2l6ZSwgICAgIChzcCArIDEyKQorICoJCSAgICAgbXBpX2xpbWJfdCBzMl9saW1iKSAgICAgKHNwICsgMTYpCisgKi8KKworCisJVEVYVAorCUFMSUdOCisJR0xPQkwJQ19TWU1CT0xfTkFNRShfZ2NyeV9tcGloX3N1Ym11bF8xKQorCitDX1NZTUJPTF9OQU1FKF9nY3J5X21waWhfc3VibXVsXzE6KQorUFJPTE9HKF9nY3J5X21waWhfc3VibXVsXzEpCisKKyNkZWZpbmUgcmVzX3B0ciBhMAorI2RlZmluZSBzMV9wdHIgYTEKKyNkZWZpbmUgczFfc2l6ZSBkMgorI2RlZmluZSBzMl9saW1iIGQ0CisKKy8qIFNhdmUgdXNlZCByZWdpc3RlcnMgb24gdGhlIHN0YWNrLiAgKi8KKwltb3ZlbWwJUihkMiktUihkNSksTUVNX1BSRURFQyhzcCkKKworLyogQ29weSB0aGUgYXJndW1lbnRzIHRvIHJlZ2lzdGVycy4gIEJldHRlciB1c2UgbW92ZW0/CSovCisJbW92ZWwJTUVNX0RJU1Aoc3AsMjApLFIocmVzX3B0cikKKwltb3ZlbAlNRU1fRElTUChzcCwyNCksUihzMV9wdHIpCisJbW92ZWwJTUVNX0RJU1Aoc3AsMjgpLFIoczFfc2l6ZSkKKwltb3ZlbAlNRU1fRElTUChzcCwzMiksUihzMl9saW1iKQorCisJZW9ydwkjMSxSKHMxX3NpemUpCisJY2xybAlSKGQxKQorCWNscmwJUihkNSkKKwlsc3JsCSMxLFIoczFfc2l6ZSkKKwliY2MJTChMMSkKKwlzdWJxbAkjMSxSKHMxX3NpemUpCisJc3VibAlSKGQwKSxSKGQwKQkvKiAoZDAsY3kpIDw9ICgwLDApICovCisKK0woTG9vcDopCisJbW92ZWwJTUVNX1BPU1RJTkMoczFfcHRyKSxSKGQzKQorCW11bHVsCVIoczJfbGltYiksUihkMSk6UihkMykKKwlhZGR4bAlSKGQwKSxSKGQzKQorCWFkZHhsCVIoZDUpLFIoZDEpCisJc3VibAlSKGQzKSxNRU1fUE9TVElOQyhyZXNfcHRyKQorTChMMTopCW1vdmVsCU1FTV9QT1NUSU5DKHMxX3B0ciksUihkMykKKwltdWx1bAlSKHMyX2xpbWIpLFIoZDApOlIoZDMpCisJYWRkeGwJUihkMSksUihkMykKKwlhZGR4bAlSKGQ1KSxSKGQwKQorCXN1YmwJUihkMyksTUVNX1BPU1RJTkMocmVzX3B0cikKKworCWRiZglSKHMxX3NpemUpLEwoTG9vcCkKKwlhZGR4bAlSKGQ1KSxSKGQwKQorCXN1YmwJIzB4MTAwMDAsUihzMV9zaXplKQorCWJjYwlMKExvb3ApCisKKy8qIFJlc3RvcmUgdXNlZCByZWdpc3RlcnMgZnJvbSBzdGFjayBmcmFtZS4gICovCisJbW92ZW1sCU1FTV9QT1NUSU5DKHNwKSxSKGQyKS1SKGQ1KQorCisJcnRzCitFUElMT0coX2djcnlfbXBpaF9zdWJtdWxfMSkKKworCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL202OGsvbXBpaC1hZGQxLlMgYi9saWJnY3J5cHQtMS40LjYvbXBpL202OGsvbXBpaC1hZGQxLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE4MmQyMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvbTY4ay9tcGloLWFkZDEuUwpAQCAtMCwwICsxLDkyIEBACisvKiBtYzY4MDIwIF9fbXBuX2FkZF9uIC0tIEFkZCB0d28gbGltYiB2ZWN0b3JzIG9mIHRoZSBzYW1lIGxlbmd0aCA+IDAgYW5kIHN0b3JlCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHN1bSBpbiBhIHRoaXJkIGxpbWIgdmVjdG9yLgorICoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk0LDE5OTYsIDE5OTgsIAorICogICAgICAgICAgICAgICAgICAgIDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKiAgICAgICAKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqCisgKiBOb3RlOiBUaGlzIGNvZGUgaXMgaGVhdmlseSBiYXNlZCBvbiB0aGUgR05VIE1QIExpYnJhcnkuCisgKgkgQWN0dWFsbHkgaXQncyB0aGUgc2FtZSBjb2RlIHdpdGggb25seSBtaW5vciBjaGFuZ2VzIGluIHRoZQorICoJIHdheSB0aGUgZGF0YSBpcyBzdG9yZWQ7IHRoaXMgaXMgdG8gc3VwcG9ydCB0aGUgYWJzdHJhY3Rpb24KKyAqCSBvZiBhbiBvcHRpb25hbCBzZWN1cmUgbWVtb3J5IGFsbG9jYXRpb24gd2hpY2ggbWF5IGJlIHVzZWQKKyAqCSB0byBhdm9pZCByZXZlYWxpbmcgb2Ygc2Vuc2l0aXZlIGRhdGEgZHVlIHRvIHBhZ2luZyBldGMuCisgKi8KKworCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAiYXNtLXN5bnRheC5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqCisgKiAgbXBpX2xpbWJfdAorICogIF9nY3J5X21waWhfYWRkX24oIG1waV9wdHJfdCByZXNfcHRyLAkoc3AgKyA0KQorICoJCSAgIG1waV9wdHJfdCBzMV9wdHIsCShzcCArIDgpCisgKgkJICAgbXBpX3B0cl90IHMyX3B0ciwJKHNwICsgMTYpCisgKgkJICAgbXBpX3NpemVfdCBzaXplKQkoc3AgKyAxMikKKyAqLworCisKKwlURVhUCisJQUxJR04KKwlHTE9CTAlDX1NZTUJPTF9OQU1FKF9nY3J5X21waWhfYWRkX24pCisKK0NfU1lNQk9MX05BTUUoX2djcnlfbXBpaF9hZGRfbjopCitQUk9MT0coX2djcnlfbXBpaF9hZGRfbikKKwkvKiBTYXZlIHVzZWQgcmVnaXN0ZXJzIG9uIHRoZSBzdGFjay4gICovCisJbW92ZWwJUihkMiksTUVNX1BSRURFQyhzcCkKKwltb3ZlbAlSKGEyKSxNRU1fUFJFREVDKHNwKQorCisJLyogQ29weSB0aGUgYXJndW1lbnRzIHRvIHJlZ2lzdGVycy4gIEJldHRlciB1c2UgbW92ZW0/CSovCisJbW92ZWwJTUVNX0RJU1Aoc3AsMTIpLFIoYTIpCisJbW92ZWwJTUVNX0RJU1Aoc3AsMTYpLFIoYTApCisJbW92ZWwJTUVNX0RJU1Aoc3AsMjApLFIoYTEpCisJbW92ZWwJTUVNX0RJU1Aoc3AsMjQpLFIoZDIpCisKKwllb3J3CSMxLFIoZDIpCisJbHNybAkjMSxSKGQyKQorCWJjYwlMKEwxKQorCXN1YnFsCSMxLFIoZDIpCS8qIGNsZWFycyBjeSBhcyBzaWRlIGVmZmVjdCAqLworCitMKExvb3A6KQorCW1vdmVsCU1FTV9QT1NUSU5DKGEwKSxSKGQwKQorCW1vdmVsCU1FTV9QT1NUSU5DKGExKSxSKGQxKQorCWFkZHhsCVIoZDEpLFIoZDApCisJbW92ZWwJUihkMCksTUVNX1BPU1RJTkMoYTIpCitMKEwxOikJbW92ZWwJTUVNX1BPU1RJTkMoYTApLFIoZDApCisJbW92ZWwJTUVNX1BPU1RJTkMoYTEpLFIoZDEpCisJYWRkeGwJUihkMSksUihkMCkKKwltb3ZlbAlSKGQwKSxNRU1fUE9TVElOQyhhMikKKworCWRiZglSKGQyKSxMKExvb3ApCQkvKiBsb29wIHVudGlsIDE2IGxzYiBvZiAlNCA9PSAtMSAqLworCXN1YnhsCVIoZDApLFIoZDApCS8qIGQwIDw9IC1jeTsgc2F2ZSBjeSBhcyAwIG9yIC0xIGluIGQwICovCisJc3VibAkjMHgxMDAwMCxSKGQyKQorCWJjcwlMKEwyKQorCWFkZGwJUihkMCksUihkMCkJLyogcmVzdG9yZSBjeSAqLworCWJyYQlMKExvb3ApCisKK0woTDI6KQorCW5lZ2wJUihkMCkKKworCS8qIFJlc3RvcmUgdXNlZCByZWdpc3RlcnMgZnJvbSBzdGFjayBmcmFtZS4gICovCisJbW92ZWwJTUVNX1BPU1RJTkMoc3ApLFIoYTIpCisJbW92ZWwJTUVNX1BPU1RJTkMoc3ApLFIoZDIpCisKKwlydHMKK0VQSUxPRyhfZ2NyeV9tcGloX2FkZF9uKQorCisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvbTY4ay9tcGloLWxzaGlmdC5TIGIvbGliZ2NyeXB0LTEuNC42L21waS9tNjhrL21waWgtbHNoaWZ0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMzZDFhYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvbTY4ay9tcGloLWxzaGlmdC5TCkBAIC0wLDAgKzEsMTY0IEBACisvKiBtYzY4MDIwIGxzaGlmdCAtLSBTaGlmdCBsZWZ0IGEgbG93LWxldmVsIG5hdHVyYWwtbnVtYmVyIGludGVnZXIuCisgKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTgsIDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKiAgICAgICAKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqCisgKiBOb3RlOiBUaGlzIGNvZGUgaXMgaGVhdmlseSBiYXNlZCBvbiB0aGUgR05VIE1QIExpYnJhcnkuCisgKgkgQWN0dWFsbHkgaXQncyB0aGUgc2FtZSBjb2RlIHdpdGggb25seSBtaW5vciBjaGFuZ2VzIGluIHRoZQorICoJIHdheSB0aGUgZGF0YSBpcyBzdG9yZWQ7IHRoaXMgaXMgdG8gc3VwcG9ydCB0aGUgYWJzdHJhY3Rpb24KKyAqCSBvZiBhbiBvcHRpb25hbCBzZWN1cmUgbWVtb3J5IGFsbG9jYXRpb24gd2hpY2ggbWF5IGJlIHVzZWQKKyAqCSB0byBhdm9pZCByZXZlYWxpbmcgb2Ygc2Vuc2l0aXZlIGRhdGEgZHVlIHRvIHBhZ2luZyBldGMuCisgKi8KKworCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAiYXNtLXN5bnRheC5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqCisgKiBtcGlfbGltYl90CisgKiBfZ2NyeV9tcGloX2xzaGlmdCggbXBpX3B0cl90IHdwLAkoc3AgKyA0KQorICoJCSAgIG1waV9wdHJfdCB1cCwJKHNwICsgOCkKKyAqCQkgICBtcGlfc2l6ZV90IHVzaXplLAkoc3AgKyAxMikKKyAqCQkgICB1bnNpZ25lZCBjbnQpCShzcCArIDE2KQorICovCisKKyNkZWZpbmUgcmVzX3B0ciBhMQorI2RlZmluZSBzX3B0ciBhMAorI2RlZmluZSBzX3NpemUgZDYKKyNkZWZpbmUgY250IGQ0CisKKwlURVhUCisJQUxJR04KKwlHTE9CTAlDX1NZTUJPTF9OQU1FKF9nY3J5X21waWhfbHNoaWZ0KQorCitDX1NZTUJPTF9OQU1FKF9nY3J5X21waWhfbHNoaWZ0OikKK1BST0xPRyhfZ2NyeV9tcGloX2xzaGlmdCkKKworCS8qIFNhdmUgdXNlZCByZWdpc3RlcnMgb24gdGhlIHN0YWNrLiAgKi8KKwltb3ZlbWwJUihkMiktUihkNikvUihhMiksTUVNX1BSRURFQyhzcCkKKworCS8qIENvcHkgdGhlIGFyZ3VtZW50cyB0byByZWdpc3RlcnMuICAqLworCW1vdmVsCU1FTV9ESVNQKHNwLDI4KSxSKHJlc19wdHIpCisJbW92ZWwJTUVNX0RJU1Aoc3AsMzIpLFIoc19wdHIpCisJbW92ZWwJTUVNX0RJU1Aoc3AsMzYpLFIoc19zaXplKQorCW1vdmVsCU1FTV9ESVNQKHNwLDQwKSxSKGNudCkKKworCW1vdmVxbAkjMSxSKGQ1KQorCWNtcGwJUihkNSksUihjbnQpCisJYm5lCUwoTG5vcm1hbCkKKwljbXBsCVIoc19wdHIpLFIocmVzX3B0cikKKwlibHMJTChMc3BlY2lhbCkJCS8qIGp1bXAgaWYgc19wdHIgPj0gcmVzX3B0ciAqLworI2lmIChkZWZpbmVkIChfX21jNjgwMjBfXykgfHwgZGVmaW5lZCAoX19OZVhUX18pIHx8IGRlZmluZWQobWM2ODAyMCkpCisJbGVhCU1FTV9JTkRYMShzX3B0cixzX3NpemUsbCw0KSxSKGEyKQorI2Vsc2UgLyogbm90IG1jNjgwMjAgKi8KKwltb3ZlbAlSKHNfc2l6ZSksUihkMCkKKwlhc2xsCSMyLFIoZDApCisJbGVhCU1FTV9JTkRYKHNfcHRyLGQwLGwpLFIoYTIpCisjZW5kaWYKKwljbXBsCVIocmVzX3B0ciksUihhMikKKwlibHMJTChMc3BlY2lhbCkJCS8qIGp1bXAgaWYgcmVzX3B0ciA+PSBzX3B0ciArIHNfc2l6ZSAqLworCitMKExub3JtYWw6KQorCW1vdmVxbAkjMzIsUihkNSkKKwlzdWJsCVIoY250KSxSKGQ1KQorCisjaWYgKGRlZmluZWQgKF9fbWM2ODAyMF9fKSB8fCBkZWZpbmVkIChfX05lWFRfXykgfHwgZGVmaW5lZChtYzY4MDIwKSkKKwlsZWEJTUVNX0lORFgxKHNfcHRyLHNfc2l6ZSxsLDQpLFIoc19wdHIpCisJbGVhCU1FTV9JTkRYMShyZXNfcHRyLHNfc2l6ZSxsLDQpLFIocmVzX3B0cikKKyNlbHNlIC8qIG5vdCBtYzY4MDAwICovCisJbW92ZWwJUihzX3NpemUpLFIoZDApCisJYXNsbAkjMixSKGQwKQorCWFkZGwJUihzX3NpemUpLFIoc19wdHIpCisJYWRkbAlSKHNfc2l6ZSksUihyZXNfcHRyKQorI2VuZGlmCisJbW92ZWwJTUVNX1BSRURFQyhzX3B0ciksUihkMikKKwltb3ZlbAlSKGQyKSxSKGQwKQorCWxzcmwJUihkNSksUihkMCkJCS8qIGNvbXB1dGUgY2FycnkgbGltYiAqLworCisJbHNsbAlSKGNudCksUihkMikKKwltb3ZlbAlSKGQyKSxSKGQxKQorCXN1YnFsCSMxLFIoc19zaXplKQorCWJlcQlMKExlbmQpCisJbHNybAkjMSxSKHNfc2l6ZSkKKwliY3MJTChMMSkKKwlzdWJxbAkjMSxSKHNfc2l6ZSkKKworTChMb29wOikKKwltb3ZlbAlNRU1fUFJFREVDKHNfcHRyKSxSKGQyKQorCW1vdmVsCVIoZDIpLFIoZDMpCisJbHNybAlSKGQ1KSxSKGQzKQorCW9ybAlSKGQzKSxSKGQxKQorCW1vdmVsCVIoZDEpLE1FTV9QUkVERUMocmVzX3B0cikKKwlsc2xsCVIoY250KSxSKGQyKQorTChMMTopCisJbW92ZWwJTUVNX1BSRURFQyhzX3B0ciksUihkMSkKKwltb3ZlbAlSKGQxKSxSKGQzKQorCWxzcmwJUihkNSksUihkMykKKwlvcmwJUihkMyksUihkMikKKwltb3ZlbAlSKGQyKSxNRU1fUFJFREVDKHJlc19wdHIpCisJbHNsbAlSKGNudCksUihkMSkKKworCWRiZglSKHNfc2l6ZSksTChMb29wKQorCXN1YmwJIzB4MTAwMDAsUihzX3NpemUpCisJYmNjCUwoTG9vcCkKKworTChMZW5kOikKKwltb3ZlbAlSKGQxKSxNRU1fUFJFREVDKHJlc19wdHIpIC8qIHN0b3JlIGxlYXN0IHNpZ25pZmljYW50IGxpbWIgKi8KKworLyogUmVzdG9yZSB1c2VkIHJlZ2lzdGVycyBmcm9tIHN0YWNrIGZyYW1lLiAgKi8KKwltb3ZlbWwJTUVNX1BPU1RJTkMoc3ApLFIoZDIpLVIoZDYpL1IoYTIpCisJcnRzCisKKy8qIFdlIGxvb3AgZnJvbSBsZWFzdCBzaWduaWZpY2FudCBlbmQgb2YgdGhlIGFycmF5cywgd2hpY2ggaXMgb25seQorICAgcGVybWlzc2FibGUgaWYgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZG9uJ3Qgb3ZlcmxhcCwgc2luY2UgdGhlCisgICBmdW5jdGlvbiBpcyBkb2N1bWVudGVkIHRvIHdvcmsgZm9yIG92ZXJsYXBwaW5nIHNvdXJjZSBhbmQgZGVzdGluYXRpb24uICAqLworCitMKExzcGVjaWFsOikKKwljbHJsCVIoZDApCQkJLyogaW5pdGlhbGl6ZSBjYXJyeSAqLworCWVvcncJIzEsUihzX3NpemUpCisJbHNybAkjMSxSKHNfc2l6ZSkKKwliY2MJTChMTDEpCisJc3VicWwJIzEsUihzX3NpemUpCisKK0woTExvb3A6KQorCW1vdmVsCU1FTV9QT1NUSU5DKHNfcHRyKSxSKGQyKQorCWFkZHhsCVIoZDIpLFIoZDIpCisJbW92ZWwJUihkMiksTUVNX1BPU1RJTkMocmVzX3B0cikKK0woTEwxOikKKwltb3ZlbAlNRU1fUE9TVElOQyhzX3B0ciksUihkMikKKwlhZGR4bAlSKGQyKSxSKGQyKQorCW1vdmVsCVIoZDIpLE1FTV9QT1NUSU5DKHJlc19wdHIpCisKKwlkYmYJUihzX3NpemUpLEwoTExvb3ApCisJYWRkeGwJUihkMCksUihkMCkJCS8qIHNhdmUgY3kgaW4gbHNiICovCisJc3VibAkjMHgxMDAwMCxSKHNfc2l6ZSkKKwliY3MJTChMTGVuZCkKKwlsc3JsCSMxLFIoZDApCQkvKiByZXN0b3JlIGN5ICovCisJYnJhCUwoTExvb3ApCisKK0woTExlbmQ6KQorLyogUmVzdG9yZSB1c2VkIHJlZ2lzdGVycyBmcm9tIHN0YWNrIGZyYW1lLiAgKi8KKwltb3ZlbWwJTUVNX1BPU1RJTkMoc3ApLFIoZDIpLVIoZDYpL1IoYTIpCisJcnRzCitFUElMT0coX2djcnlfbXBpaF9sc2hpZnQpCisKKworCisKKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9tNjhrL21waWgtcnNoaWZ0LlMgYi9saWJnY3J5cHQtMS40LjYvbXBpL202OGsvbXBpaC1yc2hpZnQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTlmNDM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9tNjhrL21waWgtcnNoaWZ0LlMKQEAgLTAsMCArMSwxNjIgQEAKKy8qIG1jNjgwMjAgcnNoaWZ0IC0tIFNoaWZ0IHJpZ2h0IGEgbG93LWxldmVsIG5hdHVyYWwtbnVtYmVyIGludGVnZXIuCisgKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTgsIDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKiAgICAgICAKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqCisgKiBOb3RlOiBUaGlzIGNvZGUgaXMgaGVhdmlseSBiYXNlZCBvbiB0aGUgR05VIE1QIExpYnJhcnkuCisgKgkgQWN0dWFsbHkgaXQncyB0aGUgc2FtZSBjb2RlIHdpdGggb25seSBtaW5vciBjaGFuZ2VzIGluIHRoZQorICoJIHdheSB0aGUgZGF0YSBpcyBzdG9yZWQ7IHRoaXMgaXMgdG8gc3VwcG9ydCB0aGUgYWJzdHJhY3Rpb24KKyAqCSBvZiBhbiBvcHRpb25hbCBzZWN1cmUgbWVtb3J5IGFsbG9jYXRpb24gd2hpY2ggbWF5IGJlIHVzZWQKKyAqCSB0byBhdm9pZCByZXZlYWxpbmcgb2Ygc2Vuc2l0aXZlIGRhdGEgZHVlIHRvIHBhZ2luZyBldGMuCisgKi8KKworCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAiYXNtLXN5bnRheC5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqCisgKiBtcGlfbGltYl90CisgKiBfZ2NyeV9tcGloX3JzaGlmdCggbXBpX3B0cl90IHdwLAkoc3AgKyA0KQorICoJCSAgIG1waV9wdHJfdCB1cCwJKHNwICsgOCkKKyAqCQkgICBtcGlfc2l6ZV90IHVzaXplLAkoc3AgKyAxMikKKyAqCQkgICB1bnNpZ25lZCBjbnQpCShzcCArIDE2KQorICovCisKKyNkZWZpbmUgcmVzX3B0ciBhMQorI2RlZmluZSBzX3B0ciBhMAorI2RlZmluZSBzX3NpemUgZDYKKyNkZWZpbmUgY250IGQ0CisKKwlURVhUCisJQUxJR04KKwlHTE9CTAlDX1NZTUJPTF9OQU1FKF9nY3J5X21waWhfcnNoaWZ0KQorCitDX1NZTUJPTF9OQU1FKF9nY3J5X21waWhfcnNoaWZ0OikKK1BST0xPRyhfZ2NyeV9tcGloX3JzaGlmdCkKKwkvKiBTYXZlIHVzZWQgcmVnaXN0ZXJzIG9uIHRoZSBzdGFjay4gICovCisJbW92ZW1sCVIoZDIpLVIoZDYpL1IoYTIpLE1FTV9QUkVERUMoc3ApCisKKwkvKiBDb3B5IHRoZSBhcmd1bWVudHMgdG8gcmVnaXN0ZXJzLiAgKi8KKwltb3ZlbAlNRU1fRElTUChzcCwyOCksUihyZXNfcHRyKQorCW1vdmVsCU1FTV9ESVNQKHNwLDMyKSxSKHNfcHRyKQorCW1vdmVsCU1FTV9ESVNQKHNwLDM2KSxSKHNfc2l6ZSkKKwltb3ZlbAlNRU1fRElTUChzcCw0MCksUihjbnQpCisKKwltb3ZlcWwJIzEsUihkNSkKKwljbXBsCVIoZDUpLFIoY250KQorCWJuZQlMKFJub3JtYWwpCisJY21wbAlSKHJlc19wdHIpLFIoc19wdHIpCisJYmxzCUwoUnNwZWNpYWwpCQkvKiBqdW1wIGlmIHJlc19wdHIgPj0gc19wdHIgKi8KKyNpZiAoZGVmaW5lZCAoX19tYzY4MDIwX18pIHx8IGRlZmluZWQgKF9fTmVYVF9fKSB8fCBkZWZpbmVkKG1jNjgwMjApKQorCWxlYQlNRU1fSU5EWDEocmVzX3B0cixzX3NpemUsbCw0KSxSKGEyKQorI2Vsc2UgLyogbm90IG1jNjgwMjAgKi8KKwltb3ZlbAlSKHNfc2l6ZSksUihkMCkKKwlhc2xsCSMyLFIoZDApCisJbGVhCU1FTV9JTkRYKHJlc19wdHIsZDAsbCksUihhMikKKyNlbmRpZgorCWNtcGwJUihzX3B0ciksUihhMikKKwlibHMJTChSc3BlY2lhbCkJCS8qIGp1bXAgaWYgc19wdHIgPj0gcmVzX3B0ciArIHNfc2l6ZSAqLworCitMKFJub3JtYWw6KQorCW1vdmVxbAkjMzIsUihkNSkKKwlzdWJsCVIoY250KSxSKGQ1KQorCW1vdmVsCU1FTV9QT1NUSU5DKHNfcHRyKSxSKGQyKQorCW1vdmVsCVIoZDIpLFIoZDApCisJbHNsbAlSKGQ1KSxSKGQwKQkJLyogY29tcHV0ZSBjYXJyeSBsaW1iICovCisKKwlsc3JsCVIoY250KSxSKGQyKQorCW1vdmVsCVIoZDIpLFIoZDEpCisJc3VicWwJIzEsUihzX3NpemUpCisJYmVxCUwoUmVuZCkKKwlsc3JsCSMxLFIoc19zaXplKQorCWJjcwlMKFIxKQorCXN1YnFsCSMxLFIoc19zaXplKQorCitMKFJvb3A6KQorCW1vdmVsCU1FTV9QT1NUSU5DKHNfcHRyKSxSKGQyKQorCW1vdmVsCVIoZDIpLFIoZDMpCisJbHNsbAlSKGQ1KSxSKGQzKQorCW9ybAlSKGQzKSxSKGQxKQorCW1vdmVsCVIoZDEpLE1FTV9QT1NUSU5DKHJlc19wdHIpCisJbHNybAlSKGNudCksUihkMikKK0woUjE6KQorCW1vdmVsCU1FTV9QT1NUSU5DKHNfcHRyKSxSKGQxKQorCW1vdmVsCVIoZDEpLFIoZDMpCisJbHNsbAlSKGQ1KSxSKGQzKQorCW9ybAlSKGQzKSxSKGQyKQorCW1vdmVsCVIoZDIpLE1FTV9QT1NUSU5DKHJlc19wdHIpCisJbHNybAlSKGNudCksUihkMSkKKworCWRiZglSKHNfc2l6ZSksTChSb29wKQorCXN1YmwJIzB4MTAwMDAsUihzX3NpemUpCisJYmNjCUwoUm9vcCkKKworTChSZW5kOikKKwltb3ZlbAlSKGQxKSxNRU0ocmVzX3B0cikgLyogc3RvcmUgbW9zdCBzaWduaWZpY2FudCBsaW1iICovCisKKy8qIFJlc3RvcmUgdXNlZCByZWdpc3RlcnMgZnJvbSBzdGFjayBmcmFtZS4gICovCisJbW92ZW1sCU1FTV9QT1NUSU5DKHNwKSxSKGQyKS1SKGQ2KS9SKGEyKQorCXJ0cworCisvKiBXZSBsb29wIGZyb20gbW9zdCBzaWduaWZpY2FudCBlbmQgb2YgdGhlIGFycmF5cywgd2hpY2ggaXMgb25seQorICAgcGVybWlzc2FibGUgaWYgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZG9uJ3Qgb3ZlcmxhcCwgc2luY2UgdGhlCisgICBmdW5jdGlvbiBpcyBkb2N1bWVudGVkIHRvIHdvcmsgZm9yIG92ZXJsYXBwaW5nIHNvdXJjZSBhbmQgZGVzdGluYXRpb24uICAqLworCitMKFJzcGVjaWFsOikKKyNpZiAoZGVmaW5lZCAoX19tYzY4MDIwX18pIHx8IGRlZmluZWQgKF9fTmVYVF9fKSB8fCBkZWZpbmVkKG1jNjgwMjApKQorCWxlYQlNRU1fSU5EWDEoc19wdHIsc19zaXplLGwsNCksUihzX3B0cikKKwlsZWEJTUVNX0lORFgxKHJlc19wdHIsc19zaXplLGwsNCksUihyZXNfcHRyKQorI2Vsc2UgLyogbm90IG1jNjgwMDAgKi8KKwltb3ZlbAlSKHNfc2l6ZSksUihkMCkKKwlhc2xsCSMyLFIoZDApCisJYWRkbAlSKHNfc2l6ZSksUihzX3B0cikKKwlhZGRsCVIoc19zaXplKSxSKHJlc19wdHIpCisjZW5kaWYKKworCWNscmwJUihkMCkJCQkvKiBpbml0aWFsaXplIGNhcnJ5ICovCisJZW9ydwkjMSxSKHNfc2l6ZSkKKwlsc3JsCSMxLFIoc19zaXplKQorCWJjYwlMKExSMSkKKwlzdWJxbAkjMSxSKHNfc2l6ZSkKKworTChMUm9vcDopCisJbW92ZWwJTUVNX1BSRURFQyhzX3B0ciksUihkMikKKwlyb3hybAkjMSxSKGQyKQorCW1vdmVsCVIoZDIpLE1FTV9QUkVERUMocmVzX3B0cikKK0woTFIxOikKKwltb3ZlbAlNRU1fUFJFREVDKHNfcHRyKSxSKGQyKQorCXJveHJsCSMxLFIoZDIpCisJbW92ZWwJUihkMiksTUVNX1BSRURFQyhyZXNfcHRyKQorCisJZGJmCVIoc19zaXplKSxMKExSb29wKQorCXJveHJsCSMxLFIoZDApCQkvKiBzYXZlIGN5IGluIG1zYiAqLworCXN1YmwJIzB4MTAwMDAsUihzX3NpemUpCisJYmNzCUwoTFJlbmQpCisJYWRkbAlSKGQwKSxSKGQwKQkJLyogcmVzdG9yZSBjeSAqLworCWJyYQlMKExSb29wKQorCitMKExSZW5kOikKKy8qIFJlc3RvcmUgdXNlZCByZWdpc3RlcnMgZnJvbSBzdGFjayBmcmFtZS4gICovCisJbW92ZW1sCU1FTV9QT1NUSU5DKHNwKSxSKGQyKS1SKGQ2KS9SKGEyKQorCXJ0cworRVBJTE9HKF9nY3J5X21waWhfcnNoaWZ0KQorCisKKworCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL202OGsvbXBpaC1zdWIxLlMgYi9saWJnY3J5cHQtMS40LjYvbXBpL202OGsvbXBpaC1zdWIxLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU3NTU1ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvbTY4ay9tcGloLXN1YjEuUwpAQCAtMCwwICsxLDkxIEBACisvKiBtYzY4MDIwIF9fbXBuX3N1Yl9uIC0tIFN1YnRyYWN0IHR3byBsaW1iIHZlY3RvcnMgb2YgdGhlIHNhbWUgbGVuZ3RoID4gMCBhbmQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUgZGlmZmVyZW5jZSBpbiBhIHRoaXJkIGxpbWIgdmVjdG9yLgorICoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk0LCAxOTk2LCAxOTk4LCAKKyAqICAgICAgICAgICAgICAgICAgICAyMDAxLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICogICAgICAgCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKgorICogTm90ZTogVGhpcyBjb2RlIGlzIGhlYXZpbHkgYmFzZWQgb24gdGhlIEdOVSBNUCBMaWJyYXJ5LgorICoJIEFjdHVhbGx5IGl0J3MgdGhlIHNhbWUgY29kZSB3aXRoIG9ubHkgbWlub3IgY2hhbmdlcyBpbiB0aGUKKyAqCSB3YXkgdGhlIGRhdGEgaXMgc3RvcmVkOyB0aGlzIGlzIHRvIHN1cHBvcnQgdGhlIGFic3RyYWN0aW9uCisgKgkgb2YgYW4gb3B0aW9uYWwgc2VjdXJlIG1lbW9yeSBhbGxvY2F0aW9uIHdoaWNoIG1heSBiZSB1c2VkCisgKgkgdG8gYXZvaWQgcmV2ZWFsaW5nIG9mIHNlbnNpdGl2ZSBkYXRhIGR1ZSB0byBwYWdpbmcgZXRjLgorICovCisKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJhc20tc3ludGF4LmgiCisKKworLyoqKioqKioqKioqKioqKioqKioKKyAqICBtcGlfbGltYl90CisgKiAgX2djcnlfbXBpaF9zdWJfbiggbXBpX3B0cl90IHJlc19wdHIsCShzcCArIDQpCisgKgkJICAgbXBpX3B0cl90IHMxX3B0ciwJKHNwICsgOCkKKyAqCQkgICBtcGlfcHRyX3QgczJfcHRyLAkoc3AgKyAxNikKKyAqCQkgICBtcGlfc2l6ZV90IHNpemUpCShzcCArIDEyKQorICovCisKKworCVRFWFQKKwlBTElHTgorCUdMT0JMCUNfU1lNQk9MX05BTUUoX2djcnlfbXBpaF9zdWJfbikKKworQ19TWU1CT0xfTkFNRShfZ2NyeV9tcGloX3N1Yl9uOikKK1BST0xPRyhfZ2NyeV9tcGloX3N1Yl9uKQorLyogU2F2ZSB1c2VkIHJlZ2lzdGVycyBvbiB0aGUgc3RhY2suICAqLworCW1vdmVsCVIoZDIpLE1FTV9QUkVERUMoc3ApCisJbW92ZWwJUihhMiksTUVNX1BSRURFQyhzcCkKKworLyogQ29weSB0aGUgYXJndW1lbnRzIHRvIHJlZ2lzdGVycy4gIEJldHRlciB1c2UgbW92ZW0/CSovCisJbW92ZWwJTUVNX0RJU1Aoc3AsMTIpLFIoYTIpCisJbW92ZWwJTUVNX0RJU1Aoc3AsMTYpLFIoYTApCisJbW92ZWwJTUVNX0RJU1Aoc3AsMjApLFIoYTEpCisJbW92ZWwJTUVNX0RJU1Aoc3AsMjQpLFIoZDIpCisKKwllb3J3CSMxLFIoZDIpCisJbHNybAkjMSxSKGQyKQorCWJjYwlMKEwxKQorCXN1YnFsCSMxLFIoZDIpCS8qIGNsZWFycyBjeSBhcyBzaWRlIGVmZmVjdCAqLworCitMKExvb3A6KQorCW1vdmVsCU1FTV9QT1NUSU5DKGEwKSxSKGQwKQorCW1vdmVsCU1FTV9QT1NUSU5DKGExKSxSKGQxKQorCXN1YnhsCVIoZDEpLFIoZDApCisJbW92ZWwJUihkMCksTUVNX1BPU1RJTkMoYTIpCitMKEwxOikJbW92ZWwJTUVNX1BPU1RJTkMoYTApLFIoZDApCisJbW92ZWwJTUVNX1BPU1RJTkMoYTEpLFIoZDEpCisJc3VieGwJUihkMSksUihkMCkKKwltb3ZlbAlSKGQwKSxNRU1fUE9TVElOQyhhMikKKworCWRiZglSKGQyKSxMKExvb3ApCQkvKiBsb29wIHVudGlsIDE2IGxzYiBvZiAlNCA9PSAtMSAqLworCXN1YnhsCVIoZDApLFIoZDApCS8qIGQwIDw9IC1jeTsgc2F2ZSBjeSBhcyAwIG9yIC0xIGluIGQwICovCisJc3VibAkjMHgxMDAwMCxSKGQyKQorCWJjcwlMKEwyKQorCWFkZGwJUihkMCksUihkMCkJLyogcmVzdG9yZSBjeSAqLworCWJyYQlMKExvb3ApCisKK0woTDI6KQorCW5lZ2wJUihkMCkKKworLyogUmVzdG9yZSB1c2VkIHJlZ2lzdGVycyBmcm9tIHN0YWNrIGZyYW1lLiAgKi8KKwltb3ZlbAlNRU1fUE9TVElOQyhzcCksUihhMikKKwltb3ZlbAlNRU1fUE9TVElOQyhzcCksUihkMikKKworCXJ0cworRVBJTE9HKF9nY3J5X21waWhfc3ViX24pCisKKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9tNjhrL3N5bnRheC5oIGIvbGliZ2NyeXB0LTEuNC42L21waS9tNjhrL3N5bnRheC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyN2RlOTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL202OGsvc3ludGF4LmgKQEAgLTAsMCArMSwxODUgQEAKKy8qIGFzbS5oIC0tIERlZmluaXRpb25zIGZvciA2OGsgc3ludGF4IHZhcmlhdGlvbnMuCisgKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTQsIDE5OTYsIDE5OTgsCisgKiAgICAgICAgICAgICAgICAgICAgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqICAgICAgIAorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICoKKyAqIE5vdGU6IFRoaXMgY29kZSBpcyBoZWF2aWx5IGJhc2VkIG9uIHRoZSBHTlUgTVAgTGlicmFyeS4KKyAqCSBBY3R1YWxseSBpdCdzIHRoZSBzYW1lIGNvZGUgd2l0aCBvbmx5IG1pbm9yIGNoYW5nZXMgaW4gdGhlCisgKgkgd2F5IHRoZSBkYXRhIGlzIHN0b3JlZDsgdGhpcyBpcyB0byBzdXBwb3J0IHRoZSBhYnN0cmFjdGlvbgorICoJIG9mIGFuIG9wdGlvbmFsIHNlY3VyZSBtZW1vcnkgYWxsb2NhdGlvbiB3aGljaCBtYXkgYmUgdXNlZAorICoJIHRvIGF2b2lkIHJldmVhbGluZyBvZiBzZW5zaXRpdmUgZGF0YSBkdWUgdG8gcGFnaW5nIGV0Yy4KKyAqLworCisKKyN1bmRlZiBBTElHTgorCisjaWZkZWYgTUlUX1NZTlRBWAorI2RlZmluZSBQUk9MT0cobmFtZSkKKyNkZWZpbmUgRVBJTE9HKG5hbWUpCisjZGVmaW5lIFIocilyCisjZGVmaW5lIE1FTShiYXNlKWJhc2VACisjZGVmaW5lIE1FTV9ESVNQKGJhc2UsZGlzcGxhY2VtZW50KWJhc2VAKGRpc3BsYWNlbWVudCkKKyNkZWZpbmUgTUVNX0lORFgoYmFzZSxpZHgsc2l6ZV9zdWZmaXgpYmFzZUAoaWR4OnNpemVfc3VmZml4KQorI2RlZmluZSBNRU1fSU5EWDEoYmFzZSxpZHgsc2l6ZV9zdWZmaXgsc2NhbGUpYmFzZUAoaWR4OnNpemVfc3VmZml4OnNjYWxlKQorI2RlZmluZSBNRU1fUFJFREVDKG1lbW9yeV9iYXNlKW1lbW9yeV9iYXNlQC0KKyNkZWZpbmUgTUVNX1BPU1RJTkMobWVtb3J5X2Jhc2UpbWVtb3J5X2Jhc2VAKworI2RlZmluZSBMKGxhYmVsKSBsYWJlbAorI2RlZmluZSBURVhUIC50ZXh0CisjZGVmaW5lIEFMSUdOIC5ldmVuCisjZGVmaW5lIEdMT0JMIC5nbG9ibAorI2RlZmluZSBtb3ZlcWwgbW92ZXEKKy8qIFVzZSB2YXJpYWJsZSBzaXplZCBvcGNvZGVzLiAgKi8KKyNkZWZpbmUgYmNjIGpjYworI2RlZmluZSBiY3MgamNzCisjZGVmaW5lIGJscyBqbHMKKyNkZWZpbmUgYmVxIGplcQorI2RlZmluZSBibmUgam5lCisjZGVmaW5lIGJyYSBqcmEKKyNlbmRpZgorCisjaWZkZWYgU09OWV9TWU5UQVgKKyNkZWZpbmUgUFJPTE9HKG5hbWUpCisjZGVmaW5lIEVQSUxPRyhuYW1lKQorI2RlZmluZSBSKHIpcgorI2RlZmluZSBNRU0oYmFzZSkoYmFzZSkKKyNkZWZpbmUgTUVNX0RJU1AoYmFzZSxkaXNwbGFjZW1lbnQpKGRpc3BsYWNlbWVudCxiYXNlKQorI2RlZmluZSBNRU1fSU5EWChiYXNlLGlkeCxzaXplX3N1ZmZpeCkoYmFzZSxpZHguc2l6ZV9zdWZmaXgpCisjZGVmaW5lIE1FTV9JTkRYMShiYXNlLGlkeCxzaXplX3N1ZmZpeCxzY2FsZSkoYmFzZSxpZHguc2l6ZV9zdWZmaXgqc2NhbGUpCisjZGVmaW5lIE1FTV9QUkVERUMobWVtb3J5X2Jhc2UpLShtZW1vcnlfYmFzZSkKKyNkZWZpbmUgTUVNX1BPU1RJTkMobWVtb3J5X2Jhc2UpKG1lbW9yeV9iYXNlKSsKKyNkZWZpbmUgTChsYWJlbCkgbGFiZWwKKyNkZWZpbmUgVEVYVCAudGV4dAorI2RlZmluZSBBTElHTiAuZXZlbgorI2RlZmluZSBHTE9CTCAuZ2xvYmwKKyNlbmRpZgorCisjaWZkZWYgTU9UT1JPTEFfU1lOVEFYCisjZGVmaW5lIFBST0xPRyhuYW1lKQorI2RlZmluZSBFUElMT0cobmFtZSkKKyNkZWZpbmUgUihyKXIKKyNkZWZpbmUgTUVNKGJhc2UpKGJhc2UpCisjZGVmaW5lIE1FTV9ESVNQKGJhc2UsZGlzcGxhY2VtZW50KShkaXNwbGFjZW1lbnQsYmFzZSkKKyNkZWZpbmUgTUVNX0lORFgoYmFzZSxpZHgsc2l6ZV9zdWZmaXgpKGJhc2UsaWR4LnNpemVfc3VmZml4KQorI2RlZmluZSBNRU1fSU5EWDEoYmFzZSxpZHgsc2l6ZV9zdWZmaXgsc2NhbGUpKGJhc2UsaWR4LnNpemVfc3VmZml4KnNjYWxlKQorI2RlZmluZSBNRU1fUFJFREVDKG1lbW9yeV9iYXNlKS0obWVtb3J5X2Jhc2UpCisjZGVmaW5lIE1FTV9QT1NUSU5DKG1lbW9yeV9iYXNlKShtZW1vcnlfYmFzZSkrCisjZGVmaW5lIEwobGFiZWwpIGxhYmVsCisjZGVmaW5lIFRFWFQKKyNkZWZpbmUgQUxJR04KKyNkZWZpbmUgR0xPQkwgWERFRgorI2RlZmluZSBsZWEgTEVBCisjZGVmaW5lIG1vdmVsIE1PVkUuTAorI2RlZmluZSBtb3ZlbWwgTU9WRU0uTAorI2RlZmluZSBtb3ZlcWwgTU9WRVEuTAorI2RlZmluZSBjbXBsIENNUC5MCisjZGVmaW5lIG9ybCBPUi5MCisjZGVmaW5lIGNscmwgQ0xSLkwKKyNkZWZpbmUgZW9ydyBFT1IuVworI2RlZmluZSBsc3JsIExTUi5MCisjZGVmaW5lIGxzbGwgTFNMLkwKKyNkZWZpbmUgcm94cmwgUk9YUi5MCisjZGVmaW5lIHJveGxsIFJPWEwuTAorI2RlZmluZSBhZGRsIEFERC5MCisjZGVmaW5lIGFkZHhsIEFERFguTAorI2RlZmluZSBhZGRxbCBBRERRLkwKKyNkZWZpbmUgc3VibCBTVUIuTAorI2RlZmluZSBzdWJ4bCBTVUJYLkwKKyNkZWZpbmUgc3VicWwgU1VCUS5MCisjZGVmaW5lIG5lZ2wgTkVHLkwKKyNkZWZpbmUgbXVsdWwgTVVMVS5MCisjZGVmaW5lIGJjYyBCQ0MKKyNkZWZpbmUgYmNzIEJDUworI2RlZmluZSBibHMgQkxTCisjZGVmaW5lIGJlcSBCRVEKKyNkZWZpbmUgYm5lIEJORQorI2RlZmluZSBicmEgQlJBCisjZGVmaW5lIGRiZiBEQkYKKyNkZWZpbmUgcnRzIFJUUworI2RlZmluZSBkMCBEMAorI2RlZmluZSBkMSBEMQorI2RlZmluZSBkMiBEMgorI2RlZmluZSBkMyBEMworI2RlZmluZSBkNCBENAorI2RlZmluZSBkNSBENQorI2RlZmluZSBkNiBENgorI2RlZmluZSBkNyBENworI2RlZmluZSBhMCBBMAorI2RlZmluZSBhMSBBMQorI2RlZmluZSBhMiBBMgorI2RlZmluZSBhMyBBMworI2RlZmluZSBhNCBBNAorI2RlZmluZSBhNSBBNQorI2RlZmluZSBhNiBBNgorI2RlZmluZSBhNyBBNworI2RlZmluZSBzcCBTUAorI2VuZGlmCisKKyNpZmRlZiBFTEZfU1lOVEFYCisjZGVmaW5lIFBST0xPRyhuYW1lKSAudHlwZSBuYW1lLEBmdW5jdGlvbgorI2RlZmluZSBFUElMT0cobmFtZSkgLnNpemUgbmFtZSwuLW5hbWUKKyNkZWZpbmUgTUVNKGJhc2UpKFIoYmFzZSkpCisjZGVmaW5lIE1FTV9ESVNQKGJhc2UsZGlzcGxhY2VtZW50KShkaXNwbGFjZW1lbnQsUihiYXNlKSkKKyNkZWZpbmUgTUVNX1BSRURFQyhtZW1vcnlfYmFzZSktKFIobWVtb3J5X2Jhc2UpKQorI2RlZmluZSBNRU1fUE9TVElOQyhtZW1vcnlfYmFzZSkoUihtZW1vcnlfYmFzZSkpKworI2lmZGVmIF9fU1REQ19fCisjZGVmaW5lIFJfKHIpJSMjcgorI2RlZmluZSBSKHIpUl8ocikKKyNkZWZpbmUgTUVNX0lORFhfKGJhc2UsaWR4LHNpemVfc3VmZml4KShSKGJhc2UpLFIoaWR4IyMuIyNzaXplX3N1ZmZpeCkpCisjZGVmaW5lIE1FTV9JTkRYKGJhc2UsaWR4LHNpemVfc3VmZml4KU1FTV9JTkRYXyhiYXNlLGlkeCxzaXplX3N1ZmZpeCkKKyNkZWZpbmUgTUVNX0lORFgxXyhiYXNlLGlkeCxzaXplX3N1ZmZpeCxzY2FsZSkoUihiYXNlKSxSKGlkeCMjLiMjc2l6ZV9zdWZmaXgqc2NhbGUpKQorI2RlZmluZSBNRU1fSU5EWDEoYmFzZSxpZHgsc2l6ZV9zdWZmaXgsc2NhbGUpTUVNX0lORFgxXyhiYXNlLGlkeCxzaXplX3N1ZmZpeCxzY2FsZSkKKyNkZWZpbmUgTChsYWJlbCkgLiMjbGFiZWwKKyNlbHNlCisjZGVmaW5lIFIociklLyoqL3IKKyNkZWZpbmUgTUVNX0lORFgoYmFzZSxpZHgsc2l6ZV9zdWZmaXgpKFIoYmFzZSksUihpZHgpLnNpemVfc3VmZml4KQorI2RlZmluZSBNRU1fSU5EWDEoYmFzZSxpZHgsc2l6ZV9zdWZmaXgsc2NhbGUpKFIoYmFzZSksUihpZHgpLnNpemVfc3VmZml4KnNjYWxlKQorI2RlZmluZSBMKGxhYmVsKSAuLyoqL2xhYmVsCisjZW5kaWYKKyNkZWZpbmUgVEVYVCAudGV4dAorI2RlZmluZSBBTElHTiAuYWxpZ24gMgorI2RlZmluZSBHTE9CTCAuZ2xvYmwKKyNkZWZpbmUgYmNjIGpiY2MKKyNkZWZpbmUgYmNzIGpiY3MKKyNkZWZpbmUgYmxzIGpibHMKKyNkZWZpbmUgYmVxIGpiZXEKKyNkZWZpbmUgYm5lIGpibmUKKyNkZWZpbmUgYnJhIGpicmEKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoU09OWV9TWU5UQVgpIHx8IGRlZmluZWQgKEVMRl9TWU5UQVgpCisjZGVmaW5lIG1vdmVsIG1vdmUubAorI2RlZmluZSBtb3ZlbWwgbW92ZW0ubAorI2RlZmluZSBtb3ZlcWwgbW92ZXEubAorI2RlZmluZSBjbXBsIGNtcC5sCisjZGVmaW5lIG9ybCBvci5sCisjZGVmaW5lIGNscmwgY2xyLmwKKyNkZWZpbmUgZW9ydyBlb3IudworI2RlZmluZSBsc3JsIGxzci5sCisjZGVmaW5lIGxzbGwgbHNsLmwKKyNkZWZpbmUgcm94cmwgcm94ci5sCisjZGVmaW5lIHJveGxsIHJveGwubAorI2RlZmluZSBhZGRsIGFkZC5sCisjZGVmaW5lIGFkZHhsIGFkZHgubAorI2RlZmluZSBhZGRxbCBhZGRxLmwKKyNkZWZpbmUgc3VibCBzdWIubAorI2RlZmluZSBzdWJ4bCBzdWJ4LmwKKyNkZWZpbmUgc3VicWwgc3VicS5sCisjZGVmaW5lIG5lZ2wgbmVnLmwKKyNkZWZpbmUgbXVsdWwgbXVsdS5sCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvbWlwczMvTWFuaWZlc3QgYi9saWJnY3J5cHQtMS40LjYvbXBpL21pcHMzL01hbmlmZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxOTExODQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL21pcHMzL01hbmlmZXN0CkBAIC0wLDAgKzEsMjggQEAKKyMgTWFuaWZlc3QgLSBjaGVja3N1bXMgCisjIENvcHlyaWdodCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisjCisjIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBnZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorCittcGloLWFkZDEuUworbXBpaC1zdWIxLlMKK21waWgtbXVsMS5TCittcGloLW11bDIuUworbXBpaC1tdWwzLlMKK21waWgtbHNoaWZ0LlMKK21waWgtcnNoaWZ0LlMKK21waS1hc20tZGVmcy5oCiskbmFtZXMkIGlRQ1ZBd1VBUCtMbVVURUFucDgzMlMvN0FRTG0vZ1AvUkhSMmFMTXdIUHhzcTBtR081SDBrbmVWbjhhOWw5eURORVpCZWZrWWNPSk1iN01aR0t4YkdzcHlFTmlVMDRNYzJURm5BMXdTOWdqTkhsUld0VVl4eG4vd3l1VjZCSVJnZnN0WHQyblhHZ0VRckswN0dJejhFVEZjWXFjeHU3SktpSUNJdVhaZ25JZ2R3Qkpzd2JCVjF6YU1VRFhlZzVCOHZra0VlUldqOGhRPT1JUVZPCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL21pcHMzL1JFQURNRSBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvbWlwczMvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NGIyYzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL21pcHMzL1JFQURNRQpAQCAtMCwwICsxLDIzIEBACitUaGlzIGRpcmVjdG9yeSBjb250YWlucyBtcG4gZnVuY3Rpb25zIG9wdGltaXplZCBmb3IgTUlQUzMuICBFeGFtcGxlIG9mCitwcm9jZXNzb3JzIHRoYXQgaW1wbGVtZW50IE1JUFMzIGFyZSBSNDAwMCwgUjQ0MDAsIFI0NjAwLCBSNDcwMCwgYW5kIFI4MDAwLgorCitSRUxFVkFOVCBPUFRJTUlaQVRJT04gSVNTVUVTCisKKzEuIE9uIHRoZSBSNDAwMCBhbmQgUjQ0MDAsIGJyYW5jaGVzLCBib3RoIHRoZSBwbGFpbiBhbmQgdGhlICJsaWtlbHkiIG9uZXMsCisgICB0YWtlIDMgY3ljbGVzIHRvIGV4ZWN1dGUuICAoVGhlIGZhc3Rlc3QgcG9zc2libGUgbG9vcCB3aWxsIHRha2UgNCBjeWNsZXMsCisgICBiZWNhdXNlIG9mIHRoZSBkZWxheSBpbnNuLikKKworICAgT24gdGhlIFI0NjAwLCBicmFuY2hlcyB0YWtlcyBhIHNpbmdsZSBjeWNsZQorCisgICBPbiB0aGUgUjgwMDAsIGJyYW5jaGVzIG9mdGVuIHRha2Ugbm8gbm90aWNhYmxlIGN5Y2xlcywgYXMgdGhleSBhcmUKKyAgIGV4ZWN1dGVkIGluIGEgc2VwYXJhdGUgZnVuY3Rpb24gdW5pdC4uCisKKzIuIFRoZSBSNDAwMCBhbmQgUjQ0MDAgaGF2ZSBhIGxvYWQgbGF0ZW5jeSBvZiA0IGN5Y2xlcy4KKworMy4gT24gdGhlIFI0MDAwIGFuZCBSNDQwMCwgbXVsdGlwbGllcyB0YWtlIGEgZGF0YS1kZXBlbmRlbnQgbnVtYmVyIG9mCisgICBjeWNsZXMsIGNvbnRyYXJ5IHRvIHRoZSBTR0kgZG9jdW1lbnRhdGlvbi4gIFRoZXJlIHNlZW0gdG8gYmUgMyBvciA0CisgICBwb3NzaWJsZSBsYXRlbmNpZXMuCisKK1NUQVRVUworCitHb29kLi4uCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL21pcHMzL2Rpc3RmaWxlcyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvbWlwczMvZGlzdGZpbGVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmOWI2ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL21pcHMzL2Rpc3RmaWxlcwpAQCAtMCwwICsxLDExIEBACitNYW5pZmVzdAorUkVBRE1FCittcGloLWFkZDEuUworbXBpaC1zdWIxLlMKK21waWgtbXVsMS5TCittcGloLW11bDIuUworbXBpaC1tdWwzLlMKK21waWgtbHNoaWZ0LlMKK21waWgtcnNoaWZ0LlMKK21waS1hc20tZGVmcy5oCisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvbWlwczMvbXBpLWFzbS1kZWZzLmggYi9saWJnY3J5cHQtMS40LjYvbXBpL21pcHMzL21waS1hc20tZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkOWE5YzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL21pcHMzL21waS1hc20tZGVmcy5oCkBAIC0wLDAgKzEsMTAgQEAKKy8qIFRoaXMgZmlsZSBkZWZpbmVzIHNvbWUgYmFzaWMgY29uc3RhbnRzIGZvciB0aGUgTVBJIG1hY2hpbmVyeS4gIFdlCisgKiBuZWVkIHRvIGRlZmluZSB0aGUgdHlwZXMgb24gYSBwZXItQ1BVIGJhc2lzLCBzbyBpdCBpcyBkb25lIHdpdGgKKyAqIHRoaXMgZmlsZSBoZXJlLiAgKi8KKyNkZWZpbmUgQllURVNfUEVSX01QSV9MSU1CICA4CisKKworCisKKworCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL21pcHMzL21waWgtYWRkMS5TIGIvbGliZ2NyeXB0LTEuNC42L21waS9taXBzMy9tcGloLWFkZDEuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2RiMDI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9taXBzMy9tcGloLWFkZDEuUwpAQCAtMCwwICsxLDEyNCBAQAorLyogbWlwczMgIGFkZF9uIC0tIEFkZCB0d28gbGltYiB2ZWN0b3JzIG9mIHRoZSBzYW1lIGxlbmd0aCA+IDAgYW5kIHN0b3JlCisgKgkJICAgc3VtIGluIGEgdGhpcmQgbGltYiB2ZWN0b3IuCisgKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTgsIDIwMDAKKyAqICAgICAgICAgICAgICAgICAgICAyMDAxLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqCisgKiAgbXBpX2xpbWJfdAorICogIF9nY3J5X21waWhfYWRkX24oIG1waV9wdHJfdCByZXNfcHRyLAkoJDQpCisgKgkJICAgbXBpX3B0cl90IHMxX3B0ciwJKCQ1KQorICoJCSAgIG1waV9wdHJfdCBzMl9wdHIsCSgkNikKKyAqCQkgICBtcGlfc2l6ZV90IHNpemUpCSgkNykKKyAqLworCisJLnRleHQKKwkuYWxpZ24JMgorCS5nbG9ibAlfZ2NyeV9tcGloX2FkZF9uCisJLmVudAlfZ2NyeV9tcGloX2FkZF9uCitfZ2NyeV9tcGloX2FkZF9uOgorCS5zZXQJbm9yZW9yZGVyCisJLnNldAlub21hY3JvCisKKwlsZAkkMTAsMCgkNSkKKwlsZAkkMTEsMCgkNikKKworCWRhZGRpdQkkNywkNywtMQorCWFuZAkkOSwkNyw0LTEJIyBudW1iZXIgb2YgbGltYnMgaW4gZmlyc3QgbG9vcAorCWJlcQkkOSwkMCwuTDAJIyBpZiBtdWx0aXBsZSBvZiA0IGxpbWJzLCBza2lwIGZpcnN0IGxvb3AKKwkgbW92ZQkkMiwkMAorCisJZHN1YnUJJDcsJDcsJDkKKworLkxvb3AwOiBkYWRkaXUJJDksJDksLTEKKwlsZAkkMTIsOCgkNSkKKwlkYWRkdQkkMTEsJDExLCQyCisJbGQJJDEzLDgoJDYpCisJc2x0dQkkOCwkMTEsJDIKKwlkYWRkdQkkMTEsJDEwLCQxMQorCXNsdHUJJDIsJDExLCQxMAorCXNkCSQxMSwwKCQ0KQorCW9yCSQyLCQyLCQ4CisKKwlkYWRkaXUJJDUsJDUsOAorCWRhZGRpdQkkNiwkNiw4CisJbW92ZQkkMTAsJDEyCisJbW92ZQkkMTEsJDEzCisJYm5lCSQ5LCQwLC5Mb29wMAorCSBkYWRkaXUgJDQsJDQsOAorCisuTDA6CWJlcQkkNywkMCwuTGVuZAorCSBub3AKKworLkxvb3A6CWRhZGRpdQkkNywkNywtNAorCisJbGQJJDEyLDgoJDUpCisJZGFkZHUJJDExLCQxMSwkMgorCWxkCSQxMyw4KCQ2KQorCXNsdHUJJDgsJDExLCQyCisJZGFkZHUJJDExLCQxMCwkMTEKKwlzbHR1CSQyLCQxMSwkMTAKKwlzZAkkMTEsMCgkNCkKKwlvcgkkMiwkMiwkOAorCisJbGQJJDEwLDE2KCQ1KQorCWRhZGR1CSQxMywkMTMsJDIKKwlsZAkkMTEsMTYoJDYpCisJc2x0dQkkOCwkMTMsJDIKKwlkYWRkdQkkMTMsJDEyLCQxMworCXNsdHUJJDIsJDEzLCQxMgorCXNkCSQxMyw4KCQ0KQorCW9yCSQyLCQyLCQ4CisKKwlsZAkkMTIsMjQoJDUpCisJZGFkZHUJJDExLCQxMSwkMgorCWxkCSQxMywyNCgkNikKKwlzbHR1CSQ4LCQxMSwkMgorCWRhZGR1CSQxMSwkMTAsJDExCisJc2x0dQkkMiwkMTEsJDEwCisJc2QJJDExLDE2KCQ0KQorCW9yCSQyLCQyLCQ4CisKKwlsZAkkMTAsMzIoJDUpCisJZGFkZHUJJDEzLCQxMywkMgorCWxkCSQxMSwzMigkNikKKwlzbHR1CSQ4LCQxMywkMgorCWRhZGR1CSQxMywkMTIsJDEzCisJc2x0dQkkMiwkMTMsJDEyCisJc2QJJDEzLDI0KCQ0KQorCW9yCSQyLCQyLCQ4CisKKwlkYWRkaXUJJDUsJDUsMzIKKwlkYWRkaXUJJDYsJDYsMzIKKworCWJuZQkkNywkMCwuTG9vcAorCSBkYWRkaXUgJDQsJDQsMzIKKworLkxlbmQ6CWRhZGR1CSQxMSwkMTEsJDIKKwlzbHR1CSQ4LCQxMSwkMgorCWRhZGR1CSQxMSwkMTAsJDExCisJc2x0dQkkMiwkMTEsJDEwCisJc2QJJDExLDAoJDQpCisJagkkMzEKKwlvcgkkMiwkMiwkOAorCisJLmVuZAlfZ2NyeV9tcGloX2FkZF9uCisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvbWlwczMvbXBpaC1sc2hpZnQuUyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvbWlwczMvbXBpaC1sc2hpZnQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODRjMTA5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9taXBzMy9tcGloLWxzaGlmdC5TCkBAIC0wLDAgKzEsOTcgQEAKKy8qIG1pcHMzICAgIGxzaGlmdAorICoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk4LCAyMDAwLAorICogICAgICAgICAgICAgICAgICAgIDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICovCisKKy8qKioqKioqKioqKioqKioqKioqCisgKiBtcGlfbGltYl90CisgKiBfZ2NyeV9tcGloX2xzaGlmdCggbXBpX3B0cl90IHdwLAkoJDQpCisgKgkJICAgbXBpX3B0cl90IHVwLAkoJDUpCisgKgkJICAgbXBpX3NpemVfdCB1c2l6ZSwJKCQ2KQorICoJCSAgIHVuc2lnbmVkIGNudCkJKCQ3KQorICovCisKKwkudGV4dAorCS5hbGlnbgkyCisJLmdsb2JsCV9nY3J5X21waWhfbHNoaWZ0CisJLmVudAlfZ2NyeV9tcGloX2xzaGlmdAorX2djcnlfbXBpaF9sc2hpZnQ6CisJLnNldAlub3Jlb3JkZXIKKwkuc2V0CW5vbWFjcm8KKworCWRzbGwJJDIsJDYsMworCWRhZGR1CSQ1LCQ1LCQyCSMgbWFrZSByNSBwb2ludCBhdCBlbmQgb2Ygc3JjCisJbGQJJDEwLC04KCQ1KQkjIGxvYWQgZmlyc3QgbGltYgorCWRzdWJ1CSQxMywkMCwkNworCWRhZGR1CSQ0LCQ0LCQyCSMgbWFrZSByNCBwb2ludCBhdCBlbmQgb2YgcmVzCisJZGFkZGl1CSQ2LCQ2LC0xCisJYW5kCSQ5LCQ2LDQtMQkjIG51bWJlciBvZiBsaW1icyBpbiBmaXJzdCBsb29wCisJYmVxCSQ5LCQwLC5MMAkjIGlmIG11bHRpcGxlIG9mIDQgbGltYnMsIHNraXAgZmlyc3QgbG9vcAorCSBkc3JsCSQyLCQxMCwkMTMJIyBjb21wdXRlIGZ1bmN0aW9uIHJlc3VsdAorCisJZHN1YnUJJDYsJDYsJDkKKworLkxvb3AwOiBsZAkkMywtMTYoJDUpCisJZGFkZGl1CSQ0LCQ0LC04CisJZGFkZGl1CSQ1LCQ1LC04CisJZGFkZGl1CSQ5LCQ5LC0xCisJZHNsbAkkMTEsJDEwLCQ3CisJZHNybAkkMTIsJDMsJDEzCisJbW92ZQkkMTAsJDMKKwlvcgkkOCwkMTEsJDEyCisJYm5lCSQ5LCQwLC5Mb29wMAorCSBzZAkkOCwwKCQ0KQorCisuTDA6CWJlcQkkNiwkMCwuTGVuZAorCSBub3AKKworLkxvb3A6CWxkCSQzLC0xNigkNSkKKwlkYWRkaXUJJDQsJDQsLTMyCisJZGFkZGl1CSQ2LCQ2LC00CisJZHNsbAkkMTEsJDEwLCQ3CisJZHNybAkkMTIsJDMsJDEzCisKKwlsZAkkMTAsLTI0KCQ1KQorCWRzbGwJJDE0LCQzLCQ3CisJb3IJJDgsJDExLCQxMgorCXNkCSQ4LDI0KCQ0KQorCWRzcmwJJDksJDEwLCQxMworCisJbGQJJDMsLTMyKCQ1KQorCWRzbGwJJDExLCQxMCwkNworCW9yCSQ4LCQxNCwkOQorCXNkCSQ4LDE2KCQ0KQorCWRzcmwJJDEyLCQzLCQxMworCisJbGQJJDEwLC00MCgkNSkKKwlkc2xsCSQxNCwkMywkNworCW9yCSQ4LCQxMSwkMTIKKwlzZAkkOCw4KCQ0KQorCWRzcmwJJDksJDEwLCQxMworCisJZGFkZGl1CSQ1LCQ1LC0zMgorCW9yCSQ4LCQxNCwkOQorCWJndHoJJDYsLkxvb3AKKwkgc2QJJDgsMCgkNCkKKworLkxlbmQ6CWRzbGwJJDgsJDEwLCQ3CisJagkkMzEKKwlzZAkkOCwtOCgkNCkKKwkuZW5kCV9nY3J5X21waWhfbHNoaWZ0CmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL21pcHMzL21waWgtbXVsMS5TIGIvbGliZ2NyeXB0LTEuNC42L21waS9taXBzMy9tcGloLW11bDEuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzAwOTlkCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9taXBzMy9tcGloLW11bDEuUwpAQCAtMCwwICsxLDg5IEBACisvKiBtaXBzMyBtcGloLW11bDEuUyAtLSBNdWx0aXBseSBhIGxpbWIgdmVjdG9yIHdpdGggYSBsaW1iIGFuZCBzdG9yZQorICoJCQl0aGUgcmVzdWx0IGluIGEgc2Vjb25kIGxpbWIgdmVjdG9yLgorICoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk0LCAxOTk1LCAxOTk4LCAyMDAwCisgKiAgICAgICAgICAgICAgICAgICAgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKi8KKworCisvKioqKioqKioqKioqKioqKioqKgorICogbXBpX2xpbWJfdAorICogX2djcnlfbXBpaF9tdWxfMSggbXBpX3B0cl90IHJlc19wdHIsCShyNCkKKyAqCQkgIG1waV9wdHJfdCBzMV9wdHIsCShyNSkKKyAqCQkgIG1waV9zaXplX3QgczFfc2l6ZSwJKHI2KQorICoJCSAgbXBpX2xpbWJfdCBzMl9saW1iKQkocjcpCisgKi8KKworCS50ZXh0CisJLmFsaWduCTQKKwkuZ2xvYmwJX2djcnlfbXBpaF9tdWxfMQorCS5lbnQJX2djcnlfbXBpaF9tdWxfMQorX2djcnlfbXBpaF9tdWxfMToKKwkuc2V0CW5vcmVvcmRlcgorCS5zZXQJbm9tYWNybworCisvKiAjIHdhcm0gdXAgcGhhc2UgMCAqLworCWxkCSQ4LDAoJDUpCisKKy8qICMgd2FybSB1cCBwaGFzZSAxICovCisJZGFkZGl1CSQ1LCQ1LDgKKwlkbXVsdHUJJDgsJDcKKworCWRhZGRpdQkkNiwkNiwtMQorCWJlcQkkNiwkMCwkTEMwCisJIG1vdmUJJDIsJDAJCSMgemVybyBjeTIKKworCWRhZGRpdQkkNiwkNiwtMQorCWJlcQkkNiwkMCwkTEMxCisJbGQJJDgsMCgkNSkJIyBsb2FkIG5ldyBzMSBsaW1iIGFzIGVhcmx5IGFzIHBvc3NpYmxlCisKK0xvb3A6CW1mbG8JJDEwCisJbWZoaQkkOQorCWRhZGRpdQkkNSwkNSw4CisJZGFkZHUJJDEwLCQxMCwkMgkjIGFkZCBvbGQgY2FycnkgbGltYiB0byBsb3cgcHJvZHVjdCBsaW1iCisJZG11bHR1CSQ4LCQ3CisJbGQJJDgsMCgkNSkJIyBsb2FkIG5ldyBzMSBsaW1iIGFzIGVhcmx5IGFzIHBvc3NpYmxlCisJZGFkZGl1CSQ2LCQ2LC0xCSMgZGVjcmVtZW50IGxvb3AgY291bnRlcgorCXNsdHUJJDIsJDEwLCQyCSMgY2FycnkgZnJvbSBwcmV2aW91cyBhZGRpdGlvbiAtPiAkMgorCXNkCSQxMCwwKCQ0KQorCWRhZGRpdQkkNCwkNCw4CisJYm5lCSQ2LCQwLExvb3AKKwkgZGFkZHUJJDIsJDksJDIJIyBhZGQgaGlnaCBwcm9kdWN0IGxpbWIgYW5kIGNhcnJ5IGZyb20gYWRkaXRpb24KKworLyogIyBjb29sIGRvd24gcGhhc2UgMSAqLworJExDMToJbWZsbwkkMTAKKwltZmhpCSQ5CisJZGFkZHUJJDEwLCQxMCwkMgorCXNsdHUJJDIsJDEwLCQyCisJZG11bHR1CSQ4LCQ3CisJc2QJJDEwLDAoJDQpCisJZGFkZGl1CSQ0LCQ0LDgKKwlkYWRkdQkkMiwkOSwkMgkjIGFkZCBoaWdoIHByb2R1Y3QgbGltYiBhbmQgY2FycnkgZnJvbSBhZGRpdGlvbgorCisvKiAjIGNvb2wgZG93biBwaGFzZSAwICovCiskTEMwOgltZmxvCSQxMAorCW1maGkJJDkKKwlkYWRkdQkkMTAsJDEwLCQyCisJc2x0dQkkMiwkMTAsJDIKKwlzZAkkMTAsMCgkNCkKKwlqCSQzMQorCWRhZGR1CSQyLCQ5LCQyCSMgYWRkIGhpZ2ggcHJvZHVjdCBsaW1iIGFuZCBjYXJyeSBmcm9tIGFkZGl0aW9uCisKKwkuZW5kCV9nY3J5X21waWhfbXVsXzEKKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9taXBzMy9tcGloLW11bDIuUyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvbWlwczMvbXBpaC1tdWwyLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E4Mjc2MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvbWlwczMvbXBpaC1tdWwyLlMKQEAgLTAsMCArMSwxMDEgQEAKKy8qIE1JUFMzICAgYWRkbXVsXzEgLS0gTXVsdGlwbHkgYSBsaW1iIHZlY3RvciB3aXRoIGEgc2luZ2xlIGxpbWIgYW5kCisgKgkJICAgICAgIGFkZCB0aGUgcHJvZHVjdCB0byBhIHNlY29uZCBsaW1iIHZlY3Rvci4KKyAqCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NCwgMTk5NSwgMTk5OCwgMjAwMAorICogICAgICAgICAgICAgICAgICAgIDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICovCisKKworLyoqKioqKioqKioqKioqKioqKioKKyAqIG1waV9saW1iX3QKKyAqIF9nY3J5X21waWhfYWRkbXVsXzEoIG1waV9wdHJfdCByZXNfcHRyLCAgICAgIChyNCkKKyAqCQkgICAgIG1waV9wdHJfdCBzMV9wdHIsCSAgICAgKHI1KQorICoJCSAgICAgbXBpX3NpemVfdCBzMV9zaXplLCAgICAgKHI2KQorICoJCSAgICAgbXBpX2xpbWJfdCBzMl9saW1iKSAgICAgKHI3KQorICovCisKKwkudGV4dAorCS5hbGlnbgk0CisJLmdsb2JsCV9nY3J5X21waWhfYWRkbXVsXzEKKwkuZW50CV9nY3J5X21waWhfYWRkbXVsXzEKK19nY3J5X21waWhfYWRkbXVsXzE6CisJLnNldAlub3Jlb3JkZXIKKwkuc2V0CW5vbWFjcm8KKworLyogIyB3YXJtIHVwIHBoYXNlIDAgKi8KKwlsZAkkOCwwKCQ1KQorCisvKiAjIHdhcm0gdXAgcGhhc2UgMSAqLworCWRhZGRpdQkkNSwkNSw4CisJZG11bHR1CSQ4LCQ3CisKKwlkYWRkaXUJJDYsJDYsLTEKKwliZXEJJDYsJDAsJExDMAorCSBtb3ZlCSQyLCQwCQkjIHplcm8gY3kyCisKKwlkYWRkaXUJJDYsJDYsLTEKKwliZXEJJDYsJDAsJExDMQorCWxkCSQ4LDAoJDUpCSMgbG9hZCBuZXcgczEgbGltYiBhcyBlYXJseSBhcyBwb3NzaWJsZQorCitMb29wOglsZAkkMTAsMCgkNCkKKwltZmxvCSQzCisJbWZoaQkkOQorCWRhZGRpdQkkNSwkNSw4CisJZGFkZHUJJDMsJDMsJDIJIyBhZGQgb2xkIGNhcnJ5IGxpbWIgdG8gbG93IHByb2R1Y3QgbGltYgorCWRtdWx0dQkkOCwkNworCWxkCSQ4LDAoJDUpCSMgbG9hZCBuZXcgczEgbGltYiBhcyBlYXJseSBhcyBwb3NzaWJsZQorCWRhZGRpdQkkNiwkNiwtMQkjIGRlY3JlbWVudCBsb29wIGNvdW50ZXIKKwlzbHR1CSQyLCQzLCQyCSMgY2FycnkgZnJvbSBwcmV2aW91cyBhZGRpdGlvbiAtPiAkMgorCWRhZGR1CSQzLCQxMCwkMworCXNsdHUJJDEwLCQzLCQxMAorCWRhZGR1CSQyLCQyLCQxMAorCXNkCSQzLDAoJDQpCisJZGFkZGl1CSQ0LCQ0LDgKKwlibmUJJDYsJDAsTG9vcAorCSBkYWRkdQkkMiwkOSwkMgkjIGFkZCBoaWdoIHByb2R1Y3QgbGltYiBhbmQgY2FycnkgZnJvbSBhZGRpdGlvbgorCisvKiAjIGNvb2wgZG93biBwaGFzZSAxICovCiskTEMxOglsZAkkMTAsMCgkNCkKKwltZmxvCSQzCisJbWZoaQkkOQorCWRhZGR1CSQzLCQzLCQyCisJc2x0dQkkMiwkMywkMgorCWRtdWx0dQkkOCwkNworCWRhZGR1CSQzLCQxMCwkMworCXNsdHUJJDEwLCQzLCQxMAorCWRhZGR1CSQyLCQyLCQxMAorCXNkCSQzLDAoJDQpCisJZGFkZGl1CSQ0LCQ0LDgKKwlkYWRkdQkkMiwkOSwkMgkjIGFkZCBoaWdoIHByb2R1Y3QgbGltYiBhbmQgY2FycnkgZnJvbSBhZGRpdGlvbgorCisvKiAjIGNvb2wgZG93biBwaGFzZSAwICovCiskTEMwOglsZAkkMTAsMCgkNCkKKwltZmxvCSQzCisJbWZoaQkkOQorCWRhZGR1CSQzLCQzLCQyCisJc2x0dQkkMiwkMywkMgorCWRhZGR1CSQzLCQxMCwkMworCXNsdHUJJDEwLCQzLCQxMAorCWRhZGR1CSQyLCQyLCQxMAorCXNkCSQzLDAoJDQpCisJagkkMzEKKwlkYWRkdQkkMiwkOSwkMgkjIGFkZCBoaWdoIHByb2R1Y3QgbGltYiBhbmQgY2FycnkgZnJvbSBhZGRpdGlvbgorCisJLmVuZAlfZ2NyeV9tcGloX2FkZG11bF8xCisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvbWlwczMvbXBpaC1tdWwzLlMgYi9saWJnY3J5cHQtMS40LjYvbXBpL21pcHMzL21waWgtbXVsMy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNDIxYTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL21pcHMzL21waWgtbXVsMy5TCkBAIC0wLDAgKzEsMTAxIEBACisvKiBNSVBTMyBzdWJtdWxfMSAtLSBNdWx0aXBseSBhIGxpbWIgdmVjdG9yIHdpdGggYSBzaW5nbGUgbGltYiBhbmQKKyAqCQkgICAgIHN1YnRyYWN0IHRoZSBwcm9kdWN0IGZyb20gYSBzZWNvbmQgbGltYiB2ZWN0b3IuCisgKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTQsIDE5OTUsIDE5OTgsIDIwMDAKKyAqICAgICAgICAgICAgICAgICAgICAyMDAxLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqCisgKiBtcGlfbGltYl90CisgKiBfZ2NyeV9tcGloX3N1Ym11bF8xKCBtcGlfcHRyX3QgcmVzX3B0ciwgICAgICAocjQpCisgKgkJICAgICBtcGlfcHRyX3QgczFfcHRyLAkgICAgIChyNSkKKyAqCQkgICAgIG1waV9zaXplX3QgczFfc2l6ZSwgICAgIChyNikKKyAqCQkgICAgIG1waV9saW1iX3QgczJfbGltYikgICAgIChyNykKKyAqLworCisJLnRleHQKKwkuYWxpZ24JNAorCS5nbG9ibAlfZ2NyeV9tcGloX3N1Ym11bF8xCisJLmVudAlfZ2NyeV9tcGloX3N1Ym11bF8xCitfZ2NyeV9tcGloX3N1Ym11bF8xOgorCS5zZXQJbm9yZW9yZGVyCisJLnNldAlub21hY3JvCisKKy8qICMgd2FybSB1cCBwaGFzZSAwICovCisJbGQJJDgsMCgkNSkKKworLyogIyB3YXJtIHVwIHBoYXNlIDEgKi8KKwlkYWRkaXUJJDUsJDUsOAorCWRtdWx0dQkkOCwkNworCisJZGFkZGl1CSQ2LCQ2LC0xCisJYmVxCSQ2LCQwLCRMQzAKKwkgbW92ZQkkMiwkMAkJIyB6ZXJvIGN5MgorCisJZGFkZGl1CSQ2LCQ2LC0xCisJYmVxCSQ2LCQwLCRMQzEKKwlsZAkkOCwwKCQ1KQkjIGxvYWQgbmV3IHMxIGxpbWIgYXMgZWFybHkgYXMgcG9zc2libGUKKworTG9vcDoJbGQJJDEwLDAoJDQpCisJbWZsbwkkMworCW1maGkJJDkKKwlkYWRkaXUJJDUsJDUsOAorCWRhZGR1CSQzLCQzLCQyCSMgYWRkIG9sZCBjYXJyeSBsaW1iIHRvIGxvdyBwcm9kdWN0IGxpbWIKKwlkbXVsdHUJJDgsJDcKKwlsZAkkOCwwKCQ1KQkjIGxvYWQgbmV3IHMxIGxpbWIgYXMgZWFybHkgYXMgcG9zc2libGUKKwlkYWRkaXUJJDYsJDYsLTEJIyBkZWNyZW1lbnQgbG9vcCBjb3VudGVyCisJc2x0dQkkMiwkMywkMgkjIGNhcnJ5IGZyb20gcHJldmlvdXMgYWRkaXRpb24gLT4gJDIKKwlkc3VidQkkMywkMTAsJDMKKwlzZ3R1CSQxMCwkMywkMTAKKwlkYWRkdQkkMiwkMiwkMTAKKwlzZAkkMywwKCQ0KQorCWRhZGRpdQkkNCwkNCw4CisJYm5lCSQ2LCQwLExvb3AKKwkgZGFkZHUJJDIsJDksJDIJIyBhZGQgaGlnaCBwcm9kdWN0IGxpbWIgYW5kIGNhcnJ5IGZyb20gYWRkaXRpb24KKworLyogIyBjb29sIGRvd24gcGhhc2UgMSAqLworJExDMToJbGQJJDEwLDAoJDQpCisJbWZsbwkkMworCW1maGkJJDkKKwlkYWRkdQkkMywkMywkMgorCXNsdHUJJDIsJDMsJDIKKwlkbXVsdHUJJDgsJDcKKwlkc3VidQkkMywkMTAsJDMKKwlzZ3R1CSQxMCwkMywkMTAKKwlkYWRkdQkkMiwkMiwkMTAKKwlzZAkkMywwKCQ0KQorCWRhZGRpdQkkNCwkNCw4CisJZGFkZHUJJDIsJDksJDIJIyBhZGQgaGlnaCBwcm9kdWN0IGxpbWIgYW5kIGNhcnJ5IGZyb20gYWRkaXRpb24KKworLyogIyBjb29sIGRvd24gcGhhc2UgMCAqLworJExDMDoJbGQJJDEwLDAoJDQpCisJbWZsbwkkMworCW1maGkJJDkKKwlkYWRkdQkkMywkMywkMgorCXNsdHUJJDIsJDMsJDIKKwlkc3VidQkkMywkMTAsJDMKKwlzZ3R1CSQxMCwkMywkMTAKKwlkYWRkdQkkMiwkMiwkMTAKKwlzZAkkMywwKCQ0KQorCWoJJDMxCisJZGFkZHUJJDIsJDksJDIJIyBhZGQgaGlnaCBwcm9kdWN0IGxpbWIgYW5kIGNhcnJ5IGZyb20gYWRkaXRpb24KKworCS5lbmQJX2djcnlfbXBpaF9zdWJtdWxfMQorCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL21pcHMzL21waWgtcnNoaWZ0LlMgYi9saWJnY3J5cHQtMS40LjYvbXBpL21pcHMzL21waWgtcnNoaWZ0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdlMDM1YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvbWlwczMvbXBpaC1yc2hpZnQuUwpAQCAtMCwwICsxLDk1IEBACisvKiBtaXBzMyAgICByc2hpZnQKKyAqCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5OCwgMjAwMAorICogICAgICAgICAgICAgICAgICAgIDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICovCisKKy8qKioqKioqKioqKioqKioqKioqCisgKiBtcGlfbGltYl90CisgKiBfZ2NyeV9tcGloX3JzaGlmdCggbXBpX3B0cl90IHdwLAkoJDQpCisgKgkJICAgbXBpX3B0cl90IHVwLAkoJDUpCisgKgkJICAgbXBpX3NpemVfdCB1c2l6ZSwJKCQ2KQorICoJCSAgIHVuc2lnbmVkIGNudCkJKCQ3KQorICovCisKKwkudGV4dAorCS5hbGlnbgkyCisJLmdsb2JsCV9nY3J5X21waWhfcnNoaWZ0CisJLmVudAlfZ2NyeV9tcGloX3JzaGlmdAorX2djcnlfbXBpaF9yc2hpZnQ6CisJLnNldAlub3Jlb3JkZXIKKwkuc2V0CW5vbWFjcm8KKworCWxkCSQxMCwwKCQ1KQkjIGxvYWQgZmlyc3QgbGltYgorCWRzdWJ1CSQxMywkMCwkNworCWRhZGRpdQkkNiwkNiwtMQorCWFuZAkkOSwkNiw0LTEJIyBudW1iZXIgb2YgbGltYnMgaW4gZmlyc3QgbG9vcAorCWJlcQkkOSwkMCwuTDAJIyBpZiBtdWx0aXBsZSBvZiA0IGxpbWJzLCBza2lwIGZpcnN0IGxvb3AKKwkgZHNsbAkkMiwkMTAsJDEzCSMgY29tcHV0ZSBmdW5jdGlvbiByZXN1bHQKKworCWRzdWJ1CSQ2LCQ2LCQ5CisKKy5Mb29wMDogbGQJJDMsOCgkNSkKKwlkYWRkaXUJJDQsJDQsOAorCWRhZGRpdQkkNSwkNSw4CisJZGFkZGl1CSQ5LCQ5LC0xCisJZHNybAkkMTEsJDEwLCQ3CisJZHNsbAkkMTIsJDMsJDEzCisJbW92ZQkkMTAsJDMKKwlvcgkkOCwkMTEsJDEyCisJYm5lCSQ5LCQwLC5Mb29wMAorCSBzZAkkOCwtOCgkNCkKKworLkwwOgliZXEJJDYsJDAsLkxlbmQKKwkgbm9wCisKKy5Mb29wOglsZAkkMyw4KCQ1KQorCWRhZGRpdQkkNCwkNCwzMgorCWRhZGRpdQkkNiwkNiwtNAorCWRzcmwJJDExLCQxMCwkNworCWRzbGwJJDEyLCQzLCQxMworCisJbGQJJDEwLDE2KCQ1KQorCWRzcmwJJDE0LCQzLCQ3CisJb3IJJDgsJDExLCQxMgorCXNkCSQ4LC0zMigkNCkKKwlkc2xsCSQ5LCQxMCwkMTMKKworCWxkCSQzLDI0KCQ1KQorCWRzcmwJJDExLCQxMCwkNworCW9yCSQ4LCQxNCwkOQorCXNkCSQ4LC0yNCgkNCkKKwlkc2xsCSQxMiwkMywkMTMKKworCWxkCSQxMCwzMigkNSkKKwlkc3JsCSQxNCwkMywkNworCW9yCSQ4LCQxMSwkMTIKKwlzZAkkOCwtMTYoJDQpCisJZHNsbAkkOSwkMTAsJDEzCisKKwlkYWRkaXUJJDUsJDUsMzIKKwlvcgkkOCwkMTQsJDkKKwliZ3R6CSQ2LC5Mb29wCisJIHNkCSQ4LC04KCQ0KQorCisuTGVuZDoJZHNybAkkOCwkMTAsJDcKKwlqCSQzMQorCXNkCSQ4LDAoJDQpCisJLmVuZAlfZ2NyeV9tcGloX3JzaGlmdAorCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL21pcHMzL21waWgtc3ViMS5TIGIvbGliZ2NyeXB0LTEuNC42L21waS9taXBzMy9tcGloLXN1YjEuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmFjNjc0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9taXBzMy9tcGloLXN1YjEuUwpAQCAtMCwwICsxLDEyNSBAQAorLyogbWlwczMgIHN1Yl9uIC0tIFN1YnRyYWN0IHR3byBsaW1iIHZlY3RvcnMgb2YgdGhlIHNhbWUgbGVuZ3RoID4gMCBhbmQKKyAqCQkgIHN0b3JlIGRpZmZlcmVuY2UgaW4gYSB0aGlyZCBsaW1iIHZlY3Rvci4KKyAqIAorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTgsIDE5OTksIDIwMDAsCisgKiAgICAgICAgICAgICAgICAgICAgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKi8KKworCisvKioqKioqKioqKioqKioqKioqKgorICogIG1waV9saW1iX3QKKyAqICBfZ2NyeV9tcGloX3N1Yl9uKCBtcGlfcHRyX3QgcmVzX3B0ciwJKHI0KQorICoJCSAgIG1waV9wdHJfdCBzMV9wdHIsCShyNSkKKyAqCQkgICBtcGlfcHRyX3QgczJfcHRyLAkocjYpCisgKgkJICAgbXBpX3NpemVfdCBzaXplKQkocjcpCisgKi8KKworCisJLnRleHQKKwkuYWxpZ24JMgorCS5nbG9ibAlfZ2NyeV9tcGloX3N1Yl9uCisJLmVudAlfZ2NyeV9tcGloX3N1Yl9uCitfZ2NyeV9tcGloX3N1Yl9uOgorCS5zZXQJbm9yZW9yZGVyCisJLnNldAlub21hY3JvCisKKwlsZAkkMTAsMCgkNSkKKwlsZAkkMTEsMCgkNikKKworCWRhZGRpdQkkNywkNywtMQorCWFuZAkkOSwkNyw0LTEJIyBudW1iZXIgb2YgbGltYnMgaW4gZmlyc3QgbG9vcAorCWJlcQkkOSwkMCwuTDAJIyBpZiBtdWx0aXBsZSBvZiA0IGxpbWJzLCBza2lwIGZpcnN0IGxvb3AKKwltb3ZlICAgJDIsJDAKKworCWRzdWJ1CSQ3LCQ3LCQ5CisKKy5Mb29wMDogZGFkZGl1CSQ5LCQ5LC0xCisJbGQJJDEyLDgoJDUpCisJZGFkZHUJJDExLCQxMSwkMgorCWxkCSQxMyw4KCQ2KQorCXNsdHUJJDgsJDExLCQyCisJZHN1YnUJJDExLCQxMCwkMTEKKwlzbHR1CSQyLCQxMCwkMTEKKwlzZAkkMTEsMCgkNCkKKwlvcgkkMiwkMiwkOAorCisJZGFkZGl1CSQ1LCQ1LDgKKwlkYWRkaXUJJDYsJDYsOAorCW1vdmUJJDEwLCQxMgorCW1vdmUJJDExLCQxMworCWJuZQkkOSwkMCwuTG9vcDAKKwkgZGFkZGl1ICQ0LCQ0LDgKKworLkwwOgliZXEJJDcsJDAsLkxlbmQKKwkgbm9wCisKKy5Mb29wOglkYWRkaXUJJDcsJDcsLTQKKworCWxkCSQxMiw4KCQ1KQorCWRhZGR1CSQxMSwkMTEsJDIKKwlsZAkkMTMsOCgkNikKKwlzbHR1CSQ4LCQxMSwkMgorCWRzdWJ1CSQxMSwkMTAsJDExCisJc2x0dQkkMiwkMTAsJDExCisJc2QJJDExLDAoJDQpCisJb3IJJDIsJDIsJDgKKworCWxkCSQxMCwxNigkNSkKKwlkYWRkdQkkMTMsJDEzLCQyCisJbGQJJDExLDE2KCQ2KQorCXNsdHUJJDgsJDEzLCQyCisJZHN1YnUJJDEzLCQxMiwkMTMKKwlzbHR1CSQyLCQxMiwkMTMKKwlzZAkkMTMsOCgkNCkKKwlvcgkkMiwkMiwkOAorCisJbGQJJDEyLDI0KCQ1KQorCWRhZGR1CSQxMSwkMTEsJDIKKwlsZAkkMTMsMjQoJDYpCisJc2x0dQkkOCwkMTEsJDIKKwlkc3VidQkkMTEsJDEwLCQxMQorCXNsdHUJJDIsJDEwLCQxMQorCXNkCSQxMSwxNigkNCkKKwlvcgkkMiwkMiwkOAorCisJbGQJJDEwLDMyKCQ1KQorCWRhZGR1CSQxMywkMTMsJDIKKwlsZAkkMTEsMzIoJDYpCisJc2x0dQkkOCwkMTMsJDIKKwlkc3VidQkkMTMsJDEyLCQxMworCXNsdHUJJDIsJDEyLCQxMworCXNkCSQxMywyNCgkNCkKKwlvcgkkMiwkMiwkOAorCisJZGFkZGl1CSQ1LCQ1LDMyCisJZGFkZGl1CSQ2LCQ2LDMyCisKKwlibmUJJDcsJDAsLkxvb3AKKwkgZGFkZGl1ICQ0LCQ0LDMyCisKKy5MZW5kOglkYWRkdQkkMTEsJDExLCQyCisJc2x0dQkkOCwkMTEsJDIKKwlkc3VidQkkMTEsJDEwLCQxMQorCXNsdHUJJDIsJDEwLCQxMQorCXNkCSQxMSwwKCQ0KQorCWoJJDMxCisJb3IJJDIsJDIsJDgKKworCS5lbmQJX2djcnlfbXBpaF9zdWJfbgorCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL21waS1hZGQuYyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvbXBpLWFkZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYTI1N2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL21waS1hZGQuYwpAQCAtMCwwICsxLDIzNiBAQAorLyogbXBpLWFkZC5jICAtICBNUEkgZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTYsIDE5OTgsIDIwMDEsIDIwMDIsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICoKKyAqIE5vdGU6IFRoaXMgY29kZSBpcyBoZWF2aWx5IGJhc2VkIG9uIHRoZSBHTlUgTVAgTGlicmFyeS4KKyAqCSBBY3R1YWxseSBpdCdzIHRoZSBzYW1lIGNvZGUgd2l0aCBvbmx5IG1pbm9yIGNoYW5nZXMgaW4gdGhlCisgKgkgd2F5IHRoZSBkYXRhIGlzIHN0b3JlZDsgdGhpcyBpcyB0byBzdXBwb3J0IHRoZSBhYnN0cmFjdGlvbgorICoJIG9mIGFuIG9wdGlvbmFsIHNlY3VyZSBtZW1vcnkgYWxsb2NhdGlvbiB3aGljaCBtYXkgYmUgdXNlZAorICoJIHRvIGF2b2lkIHJldmVhbGluZyBvZiBzZW5zaXRpdmUgZGF0YSBkdWUgdG8gcGFnaW5nIGV0Yy4KKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgIm1waS1pbnRlcm5hbC5oIgorCisKKy8qKioqKioqKioqKioqKioqCisgKiBBZGQgdGhlIHVuc2lnbmVkIGludGVnZXIgViB0byB0aGUgbXBpLWludGVnZXIgVSBhbmQgc3RvcmUgdGhlCisgKiByZXN1bHQgaW4gVy4gVSBhbmQgViBtYXkgYmUgdGhlIHNhbWUuCisgKi8KK3ZvaWQKK2djcnlfbXBpX2FkZF91aShnY3J5X21waV90IHcsIGdjcnlfbXBpX3QgdSwgdW5zaWduZWQgbG9uZyB2ICkKK3sKKyAgICBtcGlfcHRyX3Qgd3AsIHVwOworICAgIG1waV9zaXplX3QgdXNpemUsIHdzaXplOworICAgIGludCB1c2lnbiwgd3NpZ247CisKKyAgICB1c2l6ZSA9IHUtPm5saW1iczsKKyAgICB1c2lnbiA9IHUtPnNpZ247CisgICAgd3NpZ24gPSAwOworCisgICAgLyogSWYgbm90IHNwYWNlIGZvciBXIChhbmQgcG9zc2libGUgY2FycnkpLCBpbmNyZWFzZSBzcGFjZS4gICovCisgICAgd3NpemUgPSB1c2l6ZSArIDE7CisgICAgaWYoIHctPmFsbG9jZWQgPCB3c2l6ZSApCisJbXBpX3Jlc2l6ZSh3LCB3c2l6ZSk7CisKKyAgICAvKiBUaGVzZSBtdXN0IGJlIGFmdGVyIHJlYWxsb2MgKFUgbWF5IGJlIHRoZSBzYW1lIGFzIFcpLiAgKi8KKyAgICB1cCA9IHUtPmQ7CisgICAgd3AgPSB3LT5kOworCisgICAgaWYoICF1c2l6ZSApIHsgIC8qIHNpbXBsZSAqLworCXdwWzBdID0gdjsKKwl3c2l6ZSA9IHY/IDE6MDsKKyAgICB9CisgICAgZWxzZSBpZiggIXVzaWduICkgeyAgLyogbXBpIGlzIG5vdCBuZWdhdGl2ZSAqLworCW1waV9saW1iX3QgY3k7CisJY3kgPSBfZ2NyeV9tcGloX2FkZF8xKHdwLCB1cCwgdXNpemUsIHYpOworCXdwW3VzaXplXSA9IGN5OworCXdzaXplID0gdXNpemUgKyBjeTsKKyAgICB9CisgICAgZWxzZSB7ICAvKiBUaGUgc2lnbnMgYXJlIGRpZmZlcmVudC4gIE5lZWQgZXhhY3QgY29tcGFyaXNvbiB0byBkZXRlcm1pbmUKKwkgICAgICogd2hpY2ggb3BlcmFuZCB0byBzdWJ0cmFjdCBmcm9tIHdoaWNoLiAgKi8KKwlpZiggdXNpemUgPT0gMSAmJiB1cFswXSA8IHYgKSB7CisJICAgIHdwWzBdID0gdiAtIHVwWzBdOworCSAgICB3c2l6ZSA9IDE7CisJfQorCWVsc2UgeworCSAgICBfZ2NyeV9tcGloX3N1Yl8xKHdwLCB1cCwgdXNpemUsIHYpOworCSAgICAvKiBTaXplIGNhbiBkZWNyZWFzZSB3aXRoIGF0IG1vc3Qgb25lIGxpbWIuICovCisJICAgIHdzaXplID0gdXNpemUgLSAod3BbdXNpemUtMV09PTApOworCSAgICB3c2lnbiA9IDE7CisJfQorICAgIH0KKworICAgIHctPm5saW1icyA9IHdzaXplOworICAgIHctPnNpZ24gICA9IHdzaWduOworfQorCisKK3ZvaWQKK2djcnlfbXBpX2FkZChnY3J5X21waV90IHcsIGdjcnlfbXBpX3QgdSwgZ2NyeV9tcGlfdCB2KQoreworICAgIG1waV9wdHJfdCB3cCwgdXAsIHZwOworICAgIG1waV9zaXplX3QgdXNpemUsIHZzaXplLCB3c2l6ZTsKKyAgICBpbnQgdXNpZ24sIHZzaWduLCB3c2lnbjsKKworICAgIGlmKCB1LT5ubGltYnMgPCB2LT5ubGltYnMgKSB7IC8qIFN3YXAgVSBhbmQgVi4gKi8KKwl1c2l6ZSA9IHYtPm5saW1iczsKKwl1c2lnbiA9IHYtPnNpZ247CisJdnNpemUgPSB1LT5ubGltYnM7CisJdnNpZ24gPSB1LT5zaWduOworCXdzaXplID0gdXNpemUgKyAxOworCVJFU0laRV9JRl9ORUVERUQodywgd3NpemUpOworCS8qIFRoZXNlIG11c3QgYmUgYWZ0ZXIgcmVhbGxvYyAodSBvciB2IG1heSBiZSB0aGUgc2FtZSBhcyB3KS4gICovCisJdXAgICAgPSB2LT5kOworCXZwICAgID0gdS0+ZDsKKyAgICB9CisgICAgZWxzZSB7CisJdXNpemUgPSB1LT5ubGltYnM7CisJdXNpZ24gPSB1LT5zaWduOworCXZzaXplID0gdi0+bmxpbWJzOworCXZzaWduID0gdi0+c2lnbjsKKwl3c2l6ZSA9IHVzaXplICsgMTsKKwlSRVNJWkVfSUZfTkVFREVEKHcsIHdzaXplKTsKKwkvKiBUaGVzZSBtdXN0IGJlIGFmdGVyIHJlYWxsb2MgKHUgb3IgdiBtYXkgYmUgdGhlIHNhbWUgYXMgdykuICAqLworCXVwICAgID0gdS0+ZDsKKwl2cCAgICA9IHYtPmQ7CisgICAgfQorICAgIHdwID0gdy0+ZDsKKyAgICB3c2lnbiA9IDA7CisKKyAgICBpZiggIXZzaXplICkgeyAgLyogc2ltcGxlICovCisJTVBOX0NPUFkod3AsIHVwLCB1c2l6ZSApOworCXdzaXplID0gdXNpemU7CisJd3NpZ24gPSB1c2lnbjsKKyAgICB9CisgICAgZWxzZSBpZiggdXNpZ24gIT0gdnNpZ24gKSB7IC8qIGRpZmZlcmVudCBzaWduICovCisJLyogVGhpcyB0ZXN0IGlzIHJpZ2h0IHNpbmNlIFVTSVpFID49IFZTSVpFICovCisJaWYoIHVzaXplICE9IHZzaXplICkgeworCSAgICBfZ2NyeV9tcGloX3N1Yih3cCwgdXAsIHVzaXplLCB2cCwgdnNpemUpOworCSAgICB3c2l6ZSA9IHVzaXplOworCSAgICBNUE5fTk9STUFMSVpFKHdwLCB3c2l6ZSk7CisJICAgIHdzaWduID0gdXNpZ247CisJfQorCWVsc2UgaWYoIF9nY3J5X21waWhfY21wKHVwLCB2cCwgdXNpemUpIDwgMCApIHsKKwkgICAgX2djcnlfbXBpaF9zdWJfbih3cCwgdnAsIHVwLCB1c2l6ZSk7CisJICAgIHdzaXplID0gdXNpemU7CisJICAgIE1QTl9OT1JNQUxJWkUod3AsIHdzaXplKTsKKwkgICAgaWYoICF1c2lnbiApCisJCXdzaWduID0gMTsKKwl9CisJZWxzZSB7CisJICAgIF9nY3J5X21waWhfc3ViX24od3AsIHVwLCB2cCwgdXNpemUpOworCSAgICB3c2l6ZSA9IHVzaXplOworCSAgICBNUE5fTk9STUFMSVpFKHdwLCB3c2l6ZSk7CisJICAgIGlmKCB1c2lnbiApCisJCXdzaWduID0gMTsKKwl9CisgICAgfQorICAgIGVsc2UgeyAvKiBVIGFuZCBWIGhhdmUgc2FtZSBzaWduLiBBZGQgdGhlbS4gKi8KKwltcGlfbGltYl90IGN5ID0gX2djcnlfbXBpaF9hZGQod3AsIHVwLCB1c2l6ZSwgdnAsIHZzaXplKTsKKwl3cFt1c2l6ZV0gPSBjeTsKKwl3c2l6ZSA9IHVzaXplICsgY3k7CisJaWYoIHVzaWduICkKKwkgICAgd3NpZ24gPSAxOworICAgIH0KKworICAgIHctPm5saW1icyA9IHdzaXplOworICAgIHctPnNpZ24gPSB3c2lnbjsKK30KKworCisvKioqKioqKioqKioqKioqKgorICogU3VidHJhY3QgdGhlIHVuc2lnbmVkIGludGVnZXIgViBmcm9tIHRoZSBtcGktaW50ZWdlciBVIGFuZCBzdG9yZSB0aGUKKyAqIHJlc3VsdCBpbiBXLgorICovCit2b2lkCitnY3J5X21waV9zdWJfdWkoZ2NyeV9tcGlfdCB3LCBnY3J5X21waV90IHUsIHVuc2lnbmVkIGxvbmcgdiApCit7CisgICAgbXBpX3B0cl90IHdwLCB1cDsKKyAgICBtcGlfc2l6ZV90IHVzaXplLCB3c2l6ZTsKKyAgICBpbnQgdXNpZ24sIHdzaWduOworCisgICAgdXNpemUgPSB1LT5ubGltYnM7CisgICAgdXNpZ24gPSB1LT5zaWduOworICAgIHdzaWduID0gMDsKKworICAgIC8qIElmIG5vdCBzcGFjZSBmb3IgVyAoYW5kIHBvc3NpYmxlIGNhcnJ5KSwgaW5jcmVhc2Ugc3BhY2UuICAqLworICAgIHdzaXplID0gdXNpemUgKyAxOworICAgIGlmKCB3LT5hbGxvY2VkIDwgd3NpemUgKQorCW1waV9yZXNpemUodywgd3NpemUpOworCisgICAgLyogVGhlc2UgbXVzdCBiZSBhZnRlciByZWFsbG9jIChVIG1heSBiZSB0aGUgc2FtZSBhcyBXKS4gICovCisgICAgdXAgPSB1LT5kOworICAgIHdwID0gdy0+ZDsKKworICAgIGlmKCAhdXNpemUgKSB7ICAvKiBzaW1wbGUgKi8KKwl3cFswXSA9IHY7CisJd3NpemUgPSB2PyAxOjA7CisJd3NpZ24gPSAxOworICAgIH0KKyAgICBlbHNlIGlmKCB1c2lnbiApIHsJLyogbXBpIGFuZCB2IGFyZSBuZWdhdGl2ZSAqLworCW1waV9saW1iX3QgY3k7CisJY3kgPSBfZ2NyeV9tcGloX2FkZF8xKHdwLCB1cCwgdXNpemUsIHYpOworCXdwW3VzaXplXSA9IGN5OworCXdzaXplID0gdXNpemUgKyBjeTsKKyAgICB9CisgICAgZWxzZSB7ICAvKiBUaGUgc2lnbnMgYXJlIGRpZmZlcmVudC4gIE5lZWQgZXhhY3QgY29tcGFyaXNvbiB0byBkZXRlcm1pbmUKKwkgICAgICogd2hpY2ggb3BlcmFuZCB0byBzdWJ0cmFjdCBmcm9tIHdoaWNoLiAgKi8KKwlpZiggdXNpemUgPT0gMSAmJiB1cFswXSA8IHYgKSB7CisJICAgIHdwWzBdID0gdiAtIHVwWzBdOworCSAgICB3c2l6ZSA9IDE7CisJICAgIHdzaWduID0gMTsKKwl9CisJZWxzZSB7CisJICAgIF9nY3J5X21waWhfc3ViXzEod3AsIHVwLCB1c2l6ZSwgdik7CisJICAgIC8qIFNpemUgY2FuIGRlY3JlYXNlIHdpdGggYXQgbW9zdCBvbmUgbGltYi4gKi8KKwkgICAgd3NpemUgPSB1c2l6ZSAtICh3cFt1c2l6ZS0xXT09MCk7CisJfQorICAgIH0KKworICAgIHctPm5saW1icyA9IHdzaXplOworICAgIHctPnNpZ24gICA9IHdzaWduOworfQorCit2b2lkCitnY3J5X21waV9zdWIoZ2NyeV9tcGlfdCB3LCBnY3J5X21waV90IHUsIGdjcnlfbXBpX3QgdikKK3sKKyAgZ2NyeV9tcGlfdCB2diA9IG1waV9jb3B5ICh2KTsKKyAgdnYtPnNpZ24gPSAhIHZ2LT5zaWduOworICBnY3J5X21waV9hZGQgKHcsIHUsIHZ2KTsKKyAgbXBpX2ZyZWUgKHZ2KTsKK30KKworCit2b2lkCitnY3J5X21waV9hZGRtKCBnY3J5X21waV90IHcsIGdjcnlfbXBpX3QgdSwgZ2NyeV9tcGlfdCB2LCBnY3J5X21waV90IG0pCit7CisgICAgZ2NyeV9tcGlfYWRkKHcsIHUsIHYpOworICAgIF9nY3J5X21waV9mZGl2X3IoIHcsIHcsIG0gKTsKK30KKwordm9pZAorZ2NyeV9tcGlfc3VibSggZ2NyeV9tcGlfdCB3LCBnY3J5X21waV90IHUsIGdjcnlfbXBpX3QgdiwgZ2NyeV9tcGlfdCBtKQoreworICAgIGdjcnlfbXBpX3N1Yih3LCB1LCB2KTsKKyAgICBfZ2NyeV9tcGlfZmRpdl9yKCB3LCB3LCBtICk7Cit9CisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvbXBpLWJpdC5jIGIvbGliZ2NyeXB0LTEuNC42L21waS9tcGktYml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJjODIwYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvbXBpLWJpdC5jCkBAIC0wLDAgKzEsMzY1IEBACisvKiBtcGktYml0LmMgIC0gIE1QSSBiaXQgbGV2ZWwgZnVjbnRpb25zCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDEsIDIwMDIsIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIm1waS1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKKworI2lmZGVmIE1QSV9JTlRFUk5BTF9ORUVEX0NMWl9UQUIKKyNpZmRlZiBfX1NURENfXworY29uc3QKKyNlbmRpZgordW5zaWduZWQgY2hhcgorX2djcnlfY2x6X3RhYltdID0KK3sKKyAgMCwxLDIsMiwzLDMsMywzLDQsNCw0LDQsNCw0LDQsNCw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LAorICA2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsCisgIDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNywKKyAgNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LAorICA4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsCisgIDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCwKKyAgOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LAorICA4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsCit9OworI2VuZGlmCisKKworI2RlZmluZSBBX0xJTUJfMSAoKG1waV9saW1iX3QpMSkKKworCisvKioqKioqKioqKioqKioqKgorICogU29tZXRpbWVzIHdlIGhhdmUgTVNMIChtb3N0IHNpZ25pZmljYW50IGxpbWJzKSB3aGljaCBhcmUgMDsKKyAqIHRoaXMgaXMgZm9yIHNvbWUgcmVhc29ucyBub3QgZ29vZCwgc28gdGhpcyBmdW5jdGlvbiByZW1vdmVzIHRoZW0uCisgKi8KK3ZvaWQKK19nY3J5X21waV9ub3JtYWxpemUoIGdjcnlfbXBpX3QgYSApCit7CisgICAgaWYoIG1waV9pc19vcGFxdWUoYSkgKQorCXJldHVybjsKKworICAgIGZvciggOyBhLT5ubGltYnMgJiYgIWEtPmRbYS0+bmxpbWJzLTFdOyBhLT5ubGltYnMtLSApCisJOworfQorCisKKworLyoqKioqKioqKioqKioqKioKKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gQS4KKyAqLwordW5zaWduZWQgaW50CitnY3J5X21waV9nZXRfbmJpdHMoIGdjcnlfbXBpX3QgYSApCit7CisgICAgdW5zaWduZWQgbjsKKworICAgIGlmKCBtcGlfaXNfb3BhcXVlKGEpICkgeworCXJldHVybiBhLT5zaWduOyAvKiB3aGljaCBob2xkcyB0aGUgbnVtYmVyIG9mIGJpdHMgKi8KKyAgICB9CisKKyAgICBfZ2NyeV9tcGlfbm9ybWFsaXplKCBhICk7CisgICAgaWYoIGEtPm5saW1icyApIHsKKwltcGlfbGltYl90IGFsaW1iID0gYS0+ZFthLT5ubGltYnMtMV07CisJaWYoIGFsaW1iICkKKwkgICAgY291bnRfbGVhZGluZ196ZXJvcyggbiwgYWxpbWIgKTsKKwllbHNlCisJICAgIG4gPSBCSVRTX1BFUl9NUElfTElNQjsKKwluID0gQklUU19QRVJfTVBJX0xJTUIgLSBuICsgKGEtPm5saW1icy0xKSAqIEJJVFNfUEVSX01QSV9MSU1COworICAgIH0KKyAgICBlbHNlCisJbiA9IDA7CisgICAgcmV0dXJuIG47Cit9CisKKworLyoqKioqKioqKioqKioqKioKKyAqIFRlc3Qgd2hldGhlciBiaXQgTiBpcyBzZXQuCisgKi8KK2ludAorZ2NyeV9tcGlfdGVzdF9iaXQoIGdjcnlfbXBpX3QgYSwgdW5zaWduZWQgaW50IG4gKQoreworICAgIHVuc2lnbmVkIGludCBsaW1ibm8sIGJpdG5vOworICAgIG1waV9saW1iX3QgbGltYjsKKworICAgIGxpbWJubyA9IG4gLyBCSVRTX1BFUl9NUElfTElNQjsKKyAgICBiaXRubyAgPSBuICUgQklUU19QRVJfTVBJX0xJTUI7CisKKyAgICBpZiggbGltYm5vID49IGEtPm5saW1icyApCisJcmV0dXJuIDA7IC8qIHRvbyBmYXIgbGVmdDogdGhpcyBpcyBhIDAgKi8KKyAgICBsaW1iID0gYS0+ZFtsaW1ibm9dOworICAgIHJldHVybiAobGltYiAmIChBX0xJTUJfMSA8PCBiaXRubykpPyAxOiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqCisgKiBTZXQgYml0IE4gb2YgQS4KKyAqLwordm9pZAorZ2NyeV9tcGlfc2V0X2JpdCggZ2NyeV9tcGlfdCBhLCB1bnNpZ25lZCBpbnQgbiApCit7CisgIHVuc2lnbmVkIGludCBsaW1ibm8sIGJpdG5vOworCisgIGxpbWJubyA9IG4gLyBCSVRTX1BFUl9NUElfTElNQjsKKyAgYml0bm8gID0gbiAlIEJJVFNfUEVSX01QSV9MSU1COworCisgIGlmICggbGltYm5vID49IGEtPm5saW1icyApIAorICAgIHsKKyAgICAgIG1waV9yZXNpemUgKGEsIGxpbWJubysxICk7CisgICAgICBhLT5ubGltYnMgPSBsaW1ibm8rMTsKKyAgICB9CisgIGEtPmRbbGltYm5vXSB8PSAoQV9MSU1CXzE8PGJpdG5vKTsKK30KKworLyoqKioqKioqKioqKioqKioKKyAqIFNldCBiaXQgTiBvZiBBLiBhbmQgY2xlYXIgYWxsIGJpdHMgYWJvdmUKKyAqLwordm9pZAorZ2NyeV9tcGlfc2V0X2hpZ2hiaXQoIGdjcnlfbXBpX3QgYSwgdW5zaWduZWQgaW50IG4gKQoreworICB1bnNpZ25lZCBpbnQgbGltYm5vLCBiaXRubzsKKyAgCisgIGxpbWJubyA9IG4gLyBCSVRTX1BFUl9NUElfTElNQjsKKyAgYml0bm8gID0gbiAlIEJJVFNfUEVSX01QSV9MSU1COworICAKKyAgaWYgKCBsaW1ibm8gPj0gYS0+bmxpbWJzICkgCisgICAgeyAKKyAgICAgIG1waV9yZXNpemUgKGEsIGxpbWJubysxICk7CisgICAgICBhLT5ubGltYnMgPSBsaW1ibm8rMTsKKyAgICB9CisgIGEtPmRbbGltYm5vXSB8PSAoQV9MSU1CXzE8PGJpdG5vKTsKKyAgZm9yICggYml0bm8rKzsgYml0bm8gPCBCSVRTX1BFUl9NUElfTElNQjsgYml0bm8rKyApCisgICAgYS0+ZFtsaW1ibm9dICY9IH4oQV9MSU1CXzEgPDwgYml0bm8pOworICBhLT5ubGltYnMgPSBsaW1ibm8rMTsKK30KKworLyoqKioqKioqKioqKioqKioKKyAqIGNsZWFyIGJpdCBOIG9mIEEgYW5kIGFsbCBiaXRzIGFib3ZlCisgKi8KK3ZvaWQKK2djcnlfbXBpX2NsZWFyX2hpZ2hiaXQoIGdjcnlfbXBpX3QgYSwgdW5zaWduZWQgaW50IG4gKQoreworICAgIHVuc2lnbmVkIGludCBsaW1ibm8sIGJpdG5vOworCisgICAgbGltYm5vID0gbiAvIEJJVFNfUEVSX01QSV9MSU1COworICAgIGJpdG5vICA9IG4gJSBCSVRTX1BFUl9NUElfTElNQjsKKworICAgIGlmKCBsaW1ibm8gPj0gYS0+bmxpbWJzICkKKwlyZXR1cm47IC8qIG5vdCBhbGxvY2F0ZWQsIHRoZXJlZm9yZSBubyBuZWVkIHRvIGNsZWFyIGJpdHMKKwkJICAgOi0pICovCisKKyAgICBmb3IoIDsgYml0bm8gPCBCSVRTX1BFUl9NUElfTElNQjsgYml0bm8rKyApCisJYS0+ZFtsaW1ibm9dICY9IH4oQV9MSU1CXzEgPDwgYml0bm8pOworICAgIGEtPm5saW1icyA9IGxpbWJubysxOworfQorCisvKioqKioqKioqKioqKioqKgorICogQ2xlYXIgYml0IE4gb2YgQS4KKyAqLwordm9pZAorZ2NyeV9tcGlfY2xlYXJfYml0KCBnY3J5X21waV90IGEsIHVuc2lnbmVkIGludCBuICkKK3sKKyAgICB1bnNpZ25lZCBpbnQgbGltYm5vLCBiaXRubzsKKworICAgIGxpbWJubyA9IG4gLyBCSVRTX1BFUl9NUElfTElNQjsKKyAgICBiaXRubyAgPSBuICUgQklUU19QRVJfTVBJX0xJTUI7CisKKyAgICBpZiggbGltYm5vID49IGEtPm5saW1icyApCisJcmV0dXJuOyAvKiBkb24ndCBuZWVkIHRvIGNsZWFyIHRoaXMgYml0LCBpdCdzIHRvIGZhciB0byBsZWZ0ICovCisgICAgYS0+ZFtsaW1ibm9dICY9IH4oQV9MSU1CXzEgPDwgYml0bm8pOworfQorCisKKy8qKioqKioqKioqKioqKioqCisgKiBTaGlmdCBBIGJ5IENPVU5UIGxpbWJzIHRvIHRoZSByaWdodAorICogVGhpcyBpcyB1c2VkIG9ubHkgd2l0aGluIHRoZSBNUEkgbGlicmFyeQorICovCit2b2lkCitfZ2NyeV9tcGlfcnNoaWZ0X2xpbWJzKCBnY3J5X21waV90IGEsIHVuc2lnbmVkIGludCBjb3VudCApCit7CisgICAgbXBpX3B0cl90IGFwID0gYS0+ZDsKKyAgICBtcGlfc2l6ZV90IG4gPSBhLT5ubGltYnM7CisgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICBpZiggY291bnQgPj0gbiApIHsKKwlhLT5ubGltYnMgPSAwOworCXJldHVybjsKKyAgICB9CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgbiAtIGNvdW50OyBpKysgKQorCWFwW2ldID0gYXBbaStjb3VudF07CisgICAgYXBbaV0gPSAwOworICAgIGEtPm5saW1icyAtPSBjb3VudDsKK30KKworCisvKgorICogU2hpZnQgQSBieSBOIGJpdHMgdG8gdGhlIHJpZ2h0LgorICovCit2b2lkCitnY3J5X21waV9yc2hpZnQgKCBnY3J5X21waV90IHgsIGdjcnlfbXBpX3QgYSwgdW5zaWduZWQgaW50IG4gKQoreworICBtcGlfc2l6ZV90IHhzaXplOworICB1bnNpZ25lZCBpbnQgaTsKKyAgdW5zaWduZWQgaW50IG5saW1icyA9IChuL0JJVFNfUEVSX01QSV9MSU1CKTsKKyAgdW5zaWduZWQgaW50IG5iaXRzID0gKG4lQklUU19QRVJfTVBJX0xJTUIpOworCisgIGlmICggeCA9PSBhICkKKyAgICB7CisgICAgICAvKiBJbi1wbGFjZSBvcGVyYXRpb24uICAqLworICAgICAgaWYgKCBubGltYnMgPj0geC0+bmxpbWJzICkKKyAgICAgICAgeworICAgICAgICAgIHgtPm5saW1icyA9IDA7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgIGlmIChubGltYnMpCisgICAgICAgIHsKKyAgICAgICAgICBmb3IgKGk9MDsgaSA8IHgtPm5saW1icyAtIG5saW1iczsgaSsrICkKKyAgICAgICAgICAgIHgtPmRbaV0gPSB4LT5kW2krbmxpbWJzXTsKKyAgICAgICAgICB4LT5kW2ldID0gMDsKKyAgICAgICAgICB4LT5ubGltYnMgLT0gbmxpbWJzOworCisgICAgICAgIH0KKyAgICAgIGlmICggeC0+bmxpbWJzICYmIG5iaXRzICkKKyAgICAgICAgX2djcnlfbXBpaF9yc2hpZnQgKCB4LT5kLCB4LT5kLCB4LT5ubGltYnMsIG5iaXRzICk7CisgICAgfQorICBlbHNlIGlmICggbmxpbWJzICkKKyAgICB7CisgICAgICAvKiBDb3B5IGFuZCBzaGlmdCBieSBtb3JlIG9yIGVxdWFsIGJpdHMgdGhhbiBpbiBhIGxpbWIuICovCisgICAgICB4c2l6ZSA9IGEtPm5saW1iczsKKyAgICAgIHgtPnNpZ24gPSBhLT5zaWduOworICAgICAgUkVTSVpFX0lGX05FRURFRCAoeCwgeHNpemUpOworICAgICAgeC0+bmxpbWJzID0geHNpemU7CisgICAgICBmb3IgKGk9MDsgaSA8IGEtPm5saW1iczsgaSsrICkKKyAgICAgICAgeC0+ZFtpXSA9IGEtPmRbaV07CisgICAgICB4LT5ubGltYnMgPSBpOworCisgICAgICBpZiAoIG5saW1icyA+PSB4LT5ubGltYnMgKQorICAgICAgICB7CisgICAgICAgICAgeC0+bmxpbWJzID0gMDsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgaWYgKG5saW1icykKKyAgICAgICAgeworICAgICAgICAgIGZvciAoaT0wOyBpIDwgeC0+bmxpbWJzIC0gbmxpbWJzOyBpKysgKQorICAgICAgICAgICAgeC0+ZFtpXSA9IHgtPmRbaStubGltYnNdOworICAgICAgICAgIHgtPmRbaV0gPSAwOworICAgICAgICAgIHgtPm5saW1icyAtPSBubGltYnM7CisgICAgICAgIH0KKworICAgICAgaWYgKCB4LT5ubGltYnMgJiYgbmJpdHMgKQorICAgICAgICBfZ2NyeV9tcGloX3JzaGlmdCAoIHgtPmQsIHgtPmQsIHgtPm5saW1icywgbmJpdHMgKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBDb3B5IGFuZCBzaGlmdCBieSBsZXNzIHRoYW4gYml0cyBpbiBhIGxpbWIuICAqLworICAgICAgeHNpemUgPSBhLT5ubGltYnM7CisgICAgICB4LT5zaWduID0gYS0+c2lnbjsKKyAgICAgIFJFU0laRV9JRl9ORUVERUQgKHgsIHhzaXplKTsKKyAgICAgIHgtPm5saW1icyA9IHhzaXplOworICAgICAgCisgICAgICBpZiAoIHhzaXplICkKKyAgICAgICAgeworICAgICAgICAgIGlmIChuYml0cyApCisgICAgICAgICAgICBfZ2NyeV9tcGloX3JzaGlmdCAoeC0+ZCwgYS0+ZCwgeC0+bmxpbWJzLCBuYml0cyApOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogVGhlIHJzaGlmdCBoZWxwZXIgZnVuY3Rpb24gaXMgbm90IHNwZWNpZmllZCBmb3IKKyAgICAgICAgICAgICAgICAgTkJJVFM9PTAsIHRodXMgd2UgZG8gYSBwbGFpbiBjb3B5IGhlcmUuICovCisgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgeC0+bmxpbWJzOyBpKysgKQorICAgICAgICAgICAgICAgIHgtPmRbaV0gPSBhLT5kW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICBNUE5fTk9STUFMSVpFICh4LT5kLCB4LT5ubGltYnMpOworfQorCisKKy8qKioqKioqKioqKioqKioqCisgKiBTaGlmdCBBIGJ5IENPVU5UIGxpbWJzIHRvIHRoZSBsZWZ0CisgKiBUaGlzIGlzIHVzZWQgb25seSB3aXRoaW4gdGhlIE1QSSBsaWJyYXJ5CisgKi8KK3ZvaWQKK19nY3J5X21waV9sc2hpZnRfbGltYnMgKGdjcnlfbXBpX3QgYSwgdW5zaWduZWQgaW50IGNvdW50KQoreworICBtcGlfcHRyX3QgYXA7CisgIGludCBuID0gYS0+bmxpbWJzOworICBpbnQgaTsKKworICBpZiAoIWNvdW50IHx8ICFuKQorICAgIHJldHVybjsKKworICBSRVNJWkVfSUZfTkVFREVEIChhLCBuK2NvdW50KTsKKworICBhcCA9IGEtPmQ7CisgIGZvciAoaSA9IG4tMTsgaSA+PSAwOyBpLS0pCisgICAgYXBbaStjb3VudF0gPSBhcFtpXTsKKyAgZm9yIChpPTA7IGkgPCBjb3VudDsgaSsrICkKKyAgICBhcFtpXSA9IDA7CisgIGEtPm5saW1icyArPSBjb3VudDsKK30KKworCisvKgorICogU2hpZnQgQSBieSBOIGJpdHMgdG8gdGhlIGxlZnQuCisgKi8KK3ZvaWQKK2djcnlfbXBpX2xzaGlmdCAoIGdjcnlfbXBpX3QgeCwgZ2NyeV9tcGlfdCBhLCB1bnNpZ25lZCBpbnQgbiApCit7CisgIHVuc2lnbmVkIGludCBubGltYnMgPSAobi9CSVRTX1BFUl9NUElfTElNQik7CisgIHVuc2lnbmVkIGludCBuYml0cyA9IChuJUJJVFNfUEVSX01QSV9MSU1CKTsKKworICBpZiAoeCA9PSBhICYmICFuKQorICAgIHJldHVybjsgIC8qIEluLXBsYWNlIHNoaWZ0IHdpdGggYW4gYW1vdW50IG9mIHplcm8uICAqLworCisgIGlmICggeCAhPSBhICkKKyAgICB7CisgICAgICAvKiBDb3B5IEEgdG8gWC4gICovCisgICAgICB1bnNpZ25lZCBpbnQgYWxpbWJzID0gYS0+bmxpbWJzOworICAgICAgaW50IGFzaWduICA9IGEtPnNpZ247CisgICAgICBtcGlfcHRyX3QgeHAsIGFwOworCisgICAgICBSRVNJWkVfSUZfTkVFREVEICh4LCBhbGltYnMrbmxpbWJzKzEpOworICAgICAgeHAgPSB4LT5kOworICAgICAgYXAgPSBhLT5kOworICAgICAgTVBOX0NPUFkgKHhwLCBhcCwgYWxpbWJzKTsKKyAgICAgIHgtPm5saW1icyA9IGFsaW1iczsKKyAgICAgIHgtPmZsYWdzID0gYS0+ZmxhZ3M7CisgICAgICB4LT5zaWduID0gYXNpZ247CisgICAgfQorCisgIGlmIChubGltYnMgJiYgIW5iaXRzKQorICAgIHsKKyAgICAgIC8qIFNoaWZ0IGEgZnVsbCBudW1iZXIgb2YgbGltYnMuICAqLworICAgICAgX2djcnlfbXBpX2xzaGlmdF9saW1icyAoeCwgbmxpbWJzKTsKKyAgICB9CisgIGVsc2UgaWYgKG4pCisgICAgeworICAgICAgLyogV2UgdXNlIGEgdmVyeSBkdW1wIGFwcHJvYWNoOiBTaGlmdCBsZWZ0IGJ5IHRoZSBudW1iZXIgb2YKKyAgICAgICAgIGxpbWJzIHBsdXMgb25lIGFuZCB0aGFuIGZpeCBpdCB1cCBieSBhbiByc2hpZnQuICAqLworICAgICAgX2djcnlfbXBpX2xzaGlmdF9saW1icyAoeCwgbmxpbWJzKzEpOworICAgICAgZ2NyeV9tcGlfcnNoaWZ0ICh4LCB4LCBCSVRTX1BFUl9NUElfTElNQiAtIG5iaXRzKTsKKyAgICB9CisKKyAgTVBOX05PUk1BTElaRSAoeC0+ZCwgeC0+bmxpbWJzKTsKK30KKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9tcGktY21wLmMgYi9saWJnY3J5cHQtMS40LjYvbXBpL21waS1jbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGQxMDgzCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9tcGktY21wLmMKQEAgLTAsMCArMSw5MCBAQAorLyogbXBpLWNtcC5jICAtICBNUEkgZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDEsIDIwMDIsIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIm1waS1pbnRlcm5hbC5oIgorCitpbnQKK2djcnlfbXBpX2NtcF91aSAoZ2NyeV9tcGlfdCB1LCB1bnNpZ25lZCBsb25nIHYpCit7CisgIG1waV9saW1iX3QgbGltYiA9IHY7CisKKyAgX2djcnlfbXBpX25vcm1hbGl6ZSAodSk7CisKKyAgLyogSGFuZGxlIHRoZSBjYXNlIHRoYXQgVSBjb250YWlucyBubyBsaW1iLiAgKi8KKyAgaWYgKHUtPm5saW1icyA9PSAwKQorICAgIHJldHVybiAtKGxpbWIgIT0gMCk7CisKKyAgLyogSGFuZGxlIHRoZSBjYXNlIHRoYXQgVSBpcyBuZWdhdGl2ZS4gICovCisgIGlmICh1LT5zaWduKQorICAgIHJldHVybiAtMTsKKworICBpZiAodS0+bmxpbWJzID09IDEpCisgICAgeworICAgICAgLyogSGFuZGxlIHRoZSBjYXNlIHRoYXQgVSBjb250YWlucyBleGFjdGx5IG9uZSBsaW1iLiAgKi8KKworICAgICAgaWYgKHUtPmRbMF0gPiBsaW1iKQorCXJldHVybiAxOworICAgICAgaWYgKHUtPmRbMF0gPCBsaW1iKQorCXJldHVybiAtMTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgZWxzZQorICAgIC8qIEhhbmRsZSB0aGUgY2FzZSB0aGF0IFUgY29udGFpbnMgbW9yZSB0aGFuIG9uZSBsaW1iLiAgKi8KKyAgICByZXR1cm4gMTsKK30KKworaW50CitnY3J5X21waV9jbXAgKGdjcnlfbXBpX3QgdSwgZ2NyeV9tcGlfdCB2KQoreworICBtcGlfc2l6ZV90IHVzaXplOworICBtcGlfc2l6ZV90IHZzaXplOworICBpbnQgY21wOworCisgIF9nY3J5X21waV9ub3JtYWxpemUgKHUpOworICBfZ2NyeV9tcGlfbm9ybWFsaXplICh2KTsKKworICB1c2l6ZSA9IHUtPm5saW1iczsKKyAgdnNpemUgPSB2LT5ubGltYnM7CisKKyAgLyogQ29tcGFyZSBzaWduIGJpdHMuICAqLworCisgIGlmICghdS0+c2lnbiAmJiB2LT5zaWduKQorICAgIHJldHVybiAxOworICBpZiAodS0+c2lnbiAmJiAhdi0+c2lnbikKKyAgICByZXR1cm4gLTE7CisKKyAgLyogVSBhbmQgViBhcmUgZWl0aGVyIGJvdGggcG9zaXRpdmUgb3IgYm90aCBuZWdhdGl2ZS4gICovCisKKyAgaWYoIHVzaXplICE9IHZzaXplICYmICF1LT5zaWduICYmICF2LT5zaWduICkKKyAgICByZXR1cm4gdXNpemUgLSB2c2l6ZTsKKyAgaWYoIHVzaXplICE9IHZzaXplICYmIHUtPnNpZ24gJiYgdi0+c2lnbiApCisgICAgcmV0dXJuIHZzaXplICsgdXNpemU7CisgIGlmKCAhdXNpemUgKQorICAgIHJldHVybiAwOworICBpZiggIShjbXAgPSBfZ2NyeV9tcGloX2NtcCggdS0+ZCwgdi0+ZCwgdXNpemUgKSkgKQorICAgIHJldHVybiAwOworICBpZiggKGNtcCA8IDA/MTowKSA9PSAodS0+c2lnbj8xOjApKQorICAgIHJldHVybiAxOworCisgIHJldHVybiAtMTsKK30KZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvbXBpLWRpdi5jIGIvbGliZ2NyeXB0LTEuNC42L21waS9tcGktZGl2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ4YTJkMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvbXBpLWRpdi5jCkBAIC0wLDAgKzEsMzU4IEBACisvKiBtcGktZGl2LmMgIC0gIE1QSSBmdW5jdGlvbnMKKyAqIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NiwgMTk5OCwgMjAwMSwgMjAwMiwKKyAqICAgICAgICAgICAgICAgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKgorICogTm90ZTogVGhpcyBjb2RlIGlzIGhlYXZpbHkgYmFzZWQgb24gdGhlIEdOVSBNUCBMaWJyYXJ5LgorICoJIEFjdHVhbGx5IGl0J3MgdGhlIHNhbWUgY29kZSB3aXRoIG9ubHkgbWlub3IgY2hhbmdlcyBpbiB0aGUKKyAqCSB3YXkgdGhlIGRhdGEgaXMgc3RvcmVkOyB0aGlzIGlzIHRvIHN1cHBvcnQgdGhlIGFic3RyYWN0aW9uCisgKgkgb2YgYW4gb3B0aW9uYWwgc2VjdXJlIG1lbW9yeSBhbGxvY2F0aW9uIHdoaWNoIG1heSBiZSB1c2VkCisgKgkgdG8gYXZvaWQgcmV2ZWFsaW5nIG9mIHNlbnNpdGl2ZSBkYXRhIGR1ZSB0byBwYWdpbmcgZXRjLgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIm1waS1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisjaW5jbHVkZSAiZzEwbGliLmgiCisKKwordm9pZAorX2djcnlfbXBpX2ZkaXZfciggZ2NyeV9tcGlfdCByZW0sIGdjcnlfbXBpX3QgZGl2aWRlbmQsIGdjcnlfbXBpX3QgZGl2aXNvciApCit7CisgICAgaW50IGRpdmlzb3Jfc2lnbiA9IGRpdmlzb3ItPnNpZ247CisgICAgZ2NyeV9tcGlfdCB0ZW1wX2Rpdmlzb3IgPSBOVUxMOworCisgICAgLyogV2UgbmVlZCB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgdGhlIGRpdmlzb3IgYWZ0ZXIgdGhlIHJlbWFpbmRlciBoYXMgYmVlbgorICAgICAqIHByZWxpbWluYXJ5IGNhbGN1bGF0ZWQuCVdlIGhhdmUgdG8gY29weSBpdCB0byB0ZW1wb3Jhcnkgc3BhY2UgaWYgaXQncworICAgICAqIHRoZSBzYW1lIHZhcmlhYmxlIGFzIFJFTS4gICovCisgICAgaWYoIHJlbSA9PSBkaXZpc29yICkgeworCXRlbXBfZGl2aXNvciA9IG1waV9jb3B5KCBkaXZpc29yICk7CisJZGl2aXNvciA9IHRlbXBfZGl2aXNvcjsKKyAgICB9CisKKyAgICBfZ2NyeV9tcGlfdGRpdl9yKCByZW0sIGRpdmlkZW5kLCBkaXZpc29yICk7CisKKyAgICBpZiggKChkaXZpc29yX3NpZ24/MTowKSBeIChkaXZpZGVuZC0+c2lnbj8xOjApKSAmJiByZW0tPm5saW1icyApCisJZ2NyeV9tcGlfYWRkKCByZW0sIHJlbSwgZGl2aXNvcik7CisKKyAgICBpZiggdGVtcF9kaXZpc29yICkKKwltcGlfZnJlZSh0ZW1wX2Rpdmlzb3IpOworfQorCisKKworLyoqKioqKioqKioqKioqKioKKyAqIERpdmlzaW9uIHJvdW5kaW5nIHRoZSBxdW90aWVudCB0b3dhcmRzIC1pbmZpbml0eS4KKyAqIFRoZSByZW1haW5kZXIgZ2V0cyB0aGUgc2FtZSBzaWduIGFzIHRoZSBkZW5vbWluYXRvci4KKyAqIHJlbSBpcyBvcHRpb25hbAorICovCisKK3Vsb25nCitfZ2NyeV9tcGlfZmRpdl9yX3VpKCBnY3J5X21waV90IHJlbSwgZ2NyeV9tcGlfdCBkaXZpZGVuZCwgdWxvbmcgZGl2aXNvciApCit7CisgICAgbXBpX2xpbWJfdCBybGltYjsKKworICAgIHJsaW1iID0gX2djcnlfbXBpaF9tb2RfMSggZGl2aWRlbmQtPmQsIGRpdmlkZW5kLT5ubGltYnMsIGRpdmlzb3IgKTsKKyAgICBpZiggcmxpbWIgJiYgZGl2aWRlbmQtPnNpZ24gKQorCXJsaW1iID0gZGl2aXNvciAtIHJsaW1iOworCisgICAgaWYoIHJlbSApIHsKKwlyZW0tPmRbMF0gPSBybGltYjsKKwlyZW0tPm5saW1icyA9IHJsaW1iPyAxOjA7CisgICAgfQorICAgIHJldHVybiBybGltYjsKK30KKworCit2b2lkCitfZ2NyeV9tcGlfZmRpdl9xKCBnY3J5X21waV90IHF1b3QsIGdjcnlfbXBpX3QgZGl2aWRlbmQsIGdjcnlfbXBpX3QgZGl2aXNvciApCit7CisgICAgZ2NyeV9tcGlfdCB0bXAgPSBtcGlfYWxsb2MoIG1waV9nZXRfbmxpbWJzKHF1b3QpICk7CisgICAgX2djcnlfbXBpX2ZkaXZfcXIoIHF1b3QsIHRtcCwgZGl2aWRlbmQsIGRpdmlzb3IpOworICAgIG1waV9mcmVlKHRtcCk7Cit9CisKK3ZvaWQKK19nY3J5X21waV9mZGl2X3FyKCBnY3J5X21waV90IHF1b3QsIGdjcnlfbXBpX3QgcmVtLCBnY3J5X21waV90IGRpdmlkZW5kLCBnY3J5X21waV90IGRpdmlzb3IgKQoreworICAgIGludCBkaXZpc29yX3NpZ24gPSBkaXZpc29yLT5zaWduOworICAgIGdjcnlfbXBpX3QgdGVtcF9kaXZpc29yID0gTlVMTDsKKworICAgIGlmKCBxdW90ID09IGRpdmlzb3IgfHwgcmVtID09IGRpdmlzb3IgKSB7CisJdGVtcF9kaXZpc29yID0gbXBpX2NvcHkoIGRpdmlzb3IgKTsKKwlkaXZpc29yID0gdGVtcF9kaXZpc29yOworICAgIH0KKworICAgIF9nY3J5X21waV90ZGl2X3FyKCBxdW90LCByZW0sIGRpdmlkZW5kLCBkaXZpc29yICk7CisKKyAgICBpZiggKGRpdmlzb3Jfc2lnbiBeIGRpdmlkZW5kLT5zaWduKSAmJiByZW0tPm5saW1icyApIHsKKwlnY3J5X21waV9zdWJfdWkoIHF1b3QsIHF1b3QsIDEgKTsKKwlnY3J5X21waV9hZGQoIHJlbSwgcmVtLCBkaXZpc29yKTsKKyAgICB9CisKKyAgICBpZiggdGVtcF9kaXZpc29yICkKKwltcGlfZnJlZSh0ZW1wX2Rpdmlzb3IpOworfQorCisKKy8qIElmIGRlbiA9PSBxdW90LCBkZW4gbmVlZHMgdGVtcG9yYXJ5IHN0b3JhZ2UuCisgKiBJZiBkZW4gPT0gcmVtLCBkZW4gbmVlZHMgdGVtcG9yYXJ5IHN0b3JhZ2UuCisgKiBJZiBudW0gPT0gcXVvdCwgbnVtIG5lZWRzIHRlbXBvcmFyeSBzdG9yYWdlLgorICogSWYgZGVuIGhhcyB0ZW1wb3Jhcnkgc3RvcmFnZSwgaXQgY2FuIGJlIG5vcm1hbGl6ZWQgd2hpbGUgYmVpbmcgY29waWVkLAorICogICBpLmUgbm8gZXh0cmEgc3RvcmFnZSBzaG91bGQgYmUgYWxsb2NhdGVkLgorICovCisKK3ZvaWQKK19nY3J5X21waV90ZGl2X3IoIGdjcnlfbXBpX3QgcmVtLCBnY3J5X21waV90IG51bSwgZ2NyeV9tcGlfdCBkZW4pCit7CisgICAgX2djcnlfbXBpX3RkaXZfcXIoTlVMTCwgcmVtLCBudW0sIGRlbiApOworfQorCit2b2lkCitfZ2NyeV9tcGlfdGRpdl9xciggZ2NyeV9tcGlfdCBxdW90LCBnY3J5X21waV90IHJlbSwgZ2NyeV9tcGlfdCBudW0sIGdjcnlfbXBpX3QgZGVuKQoreworICAgIG1waV9wdHJfdCBucCwgZHA7CisgICAgbXBpX3B0cl90IHFwLCBycDsKKyAgICBtcGlfc2l6ZV90IG5zaXplID0gbnVtLT5ubGltYnM7CisgICAgbXBpX3NpemVfdCBkc2l6ZSA9IGRlbi0+bmxpbWJzOworICAgIG1waV9zaXplX3QgcXNpemUsIHJzaXplOworICAgIG1waV9zaXplX3Qgc2lnbl9yZW1haW5kZXIgPSBudW0tPnNpZ247CisgICAgbXBpX3NpemVfdCBzaWduX3F1b3RpZW50ID0gbnVtLT5zaWduIF4gZGVuLT5zaWduOworICAgIHVuc2lnbmVkIG5vcm1hbGl6YXRpb25fc3RlcHM7CisgICAgbXBpX2xpbWJfdCBxX2xpbWI7CisgICAgbXBpX3B0cl90IG1hcmtlcls1XTsKKyAgICB1bnNpZ25lZCBpbnQgbWFya2VyX25saW1ic1s1XTsKKyAgICBpbnQgbWFya2lkeD0wOworCisgICAgLyogRW5zdXJlIHNwYWNlIGlzIGVub3VnaCBmb3IgcXVvdGllbnQgYW5kIHJlbWFpbmRlci4KKyAgICAgKiBXZSBuZWVkIHNwYWNlIGZvciBhbiBleHRyYSBsaW1iIGluIHRoZSByZW1haW5kZXIsIGJlY2F1c2UgaXQncworICAgICAqIHVwLXNoaWZ0ZWQgKG5vcm1hbGl6ZWQpIGJlbG93LiAgKi8KKyAgICByc2l6ZSA9IG5zaXplICsgMTsKKyAgICBtcGlfcmVzaXplKCByZW0sIHJzaXplKTsKKworICAgIHFzaXplID0gcnNpemUgLSBkc2l6ZTsJICAvKiBxc2l6ZSBjYW5ub3QgYmUgYmlnZ2VyIHRoYW4gdGhpcy4JKi8KKyAgICBpZiggcXNpemUgPD0gMCApIHsKKwlpZiggbnVtICE9IHJlbSApIHsKKwkgICAgcmVtLT5ubGltYnMgPSBudW0tPm5saW1iczsKKwkgICAgcmVtLT5zaWduID0gbnVtLT5zaWduOworCSAgICBNUE5fQ09QWShyZW0tPmQsIG51bS0+ZCwgbnNpemUpOworCX0KKwlpZiggcXVvdCApIHsKKwkgICAgLyogVGhpcyBuZWVkcyB0byBmb2xsb3cgdGhlIGFzc2lnbm1lbnQgdG8gcmVtLCBpbiBjYXNlIHRoZQorCSAgICAgKiBudW1lcmF0b3IgYW5kIHF1b3RpZW50IGFyZSB0aGUgc2FtZS4gICovCisJICAgIHF1b3QtPm5saW1icyA9IDA7CisJICAgIHF1b3QtPnNpZ24gPSAwOworCX0KKwlyZXR1cm47CisgICAgfQorCisgICAgaWYoIHF1b3QgKQorCW1waV9yZXNpemUoIHF1b3QsIHFzaXplKTsKKworICAgIC8qIFJlYWQgcG9pbnRlcnMgaGVyZSwgd2hlbiByZWFsbG9jYXRpb24gaXMgZmluaXNoZWQuICAqLworICAgIG5wID0gbnVtLT5kOworICAgIGRwID0gZGVuLT5kOworICAgIHJwID0gcmVtLT5kOworCisgICAgLyogT3B0aW1pemUgZGl2aXNpb24gYnkgYSBzaW5nbGUtbGltYiBkaXZpc29yLiAgKi8KKyAgICBpZiggZHNpemUgPT0gMSApIHsKKwltcGlfbGltYl90IHJsaW1iOworCWlmKCBxdW90ICkgeworCSAgICBxcCA9IHF1b3QtPmQ7CisJICAgIHJsaW1iID0gX2djcnlfbXBpaF9kaXZtb2RfMSggcXAsIG5wLCBuc2l6ZSwgZHBbMF0gKTsKKwkgICAgcXNpemUgLT0gcXBbcXNpemUgLSAxXSA9PSAwOworCSAgICBxdW90LT5ubGltYnMgPSBxc2l6ZTsKKwkgICAgcXVvdC0+c2lnbiA9IHNpZ25fcXVvdGllbnQ7CisJfQorCWVsc2UKKwkgICAgcmxpbWIgPSBfZ2NyeV9tcGloX21vZF8xKCBucCwgbnNpemUsIGRwWzBdICk7CisJcnBbMF0gPSBybGltYjsKKwlyc2l6ZSA9IHJsaW1iICE9IDA/MTowOworCXJlbS0+bmxpbWJzID0gcnNpemU7CisJcmVtLT5zaWduID0gc2lnbl9yZW1haW5kZXI7CisJcmV0dXJuOworICAgIH0KKworCisgICAgaWYoIHF1b3QgKSB7CisJcXAgPSBxdW90LT5kOworCS8qIE1ha2Ugc3VyZSBRUCBhbmQgTlAgcG9pbnQgdG8gZGlmZmVyZW50IG9iamVjdHMuICBPdGhlcndpc2UgdGhlCisJICogbnVtZXJhdG9yIHdvdWxkIGJlIGdyYWR1YWxseSBvdmVyd3JpdHRlbiBieSB0aGUgcXVvdGllbnQgbGltYnMuICAqLworCWlmKHFwID09IG5wKSB7IC8qIENvcHkgTlAgb2JqZWN0IHRvIHRlbXBvcmFyeSBzcGFjZS4gICovCisgICAgICAgICAgICBtYXJrZXJfbmxpbWJzW21hcmtpZHhdID0gbnNpemU7CisJICAgIG5wID0gbWFya2VyW21hcmtpZHgrK10gPSBtcGlfYWxsb2NfbGltYl9zcGFjZShuc2l6ZSwKKwkJCQkJCQkgIG1waV9pc19zZWN1cmUocXVvdCkpOworCSAgICBNUE5fQ09QWShucCwgcXAsIG5zaXplKTsKKwl9CisgICAgfQorICAgIGVsc2UgLyogUHV0IHF1b3RpZW50IGF0IHRvcCBvZiByZW1haW5kZXIuICovCisJcXAgPSBycCArIGRzaXplOworCisgICAgY291bnRfbGVhZGluZ196ZXJvcyggbm9ybWFsaXphdGlvbl9zdGVwcywgZHBbZHNpemUgLSAxXSApOworCisgICAgLyogTm9ybWFsaXplIHRoZSBkZW5vbWluYXRvciwgaS5lLiBtYWtlIGl0cyBtb3N0IHNpZ25pZmljYW50IGJpdCBzZXQgYnkKKyAgICAgKiBzaGlmdGluZyBpdCBOT1JNQUxJWkFUSU9OX1NURVBTIGJpdHMgdG8gdGhlIGxlZnQuICBBbHNvIHNoaWZ0IHRoZQorICAgICAqIG51bWVyYXRvciB0aGUgc2FtZSBudW1iZXIgb2Ygc3RlcHMgKHRvIGtlZXAgdGhlIHF1b3RpZW50IHRoZSBzYW1lISkuCisgICAgICovCisgICAgaWYoIG5vcm1hbGl6YXRpb25fc3RlcHMgKSB7CisJbXBpX3B0cl90IHRwOworCW1waV9saW1iX3QgbmxpbWI7CisKKwkvKiBTaGlmdCB1cCB0aGUgZGVub21pbmF0b3Igc2V0dGluZyB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgb2YKKwkgKiB0aGUgbW9zdCBzaWduaWZpY2FudCB3b3JkLiAgVXNlIHRlbXBvcmFyeSBzdG9yYWdlIG5vdCB0byBjbG9iYmVyCisJICogdGhlIG9yaWdpbmFsIGNvbnRlbnRzIG9mIHRoZSBkZW5vbWluYXRvci4gICovCisgICAgICAgIG1hcmtlcl9ubGltYnNbbWFya2lkeF0gPSBkc2l6ZTsKKwl0cCA9IG1hcmtlclttYXJraWR4KytdID0gbXBpX2FsbG9jX2xpbWJfc3BhY2UoZHNpemUsbXBpX2lzX3NlY3VyZShkZW4pKTsKKwlfZ2NyeV9tcGloX2xzaGlmdCggdHAsIGRwLCBkc2l6ZSwgbm9ybWFsaXphdGlvbl9zdGVwcyApOworCWRwID0gdHA7CisKKwkvKiBTaGlmdCB1cCB0aGUgbnVtZXJhdG9yLCBwb3NzaWJseSBpbnRyb2R1Y2luZyBhIG5ldyBtb3N0CisJICogc2lnbmlmaWNhbnQgd29yZC4gIE1vdmUgdGhlIHNoaWZ0ZWQgbnVtZXJhdG9yIGluIHRoZSByZW1haW5kZXIKKwkgKiBtZWFud2hpbGUuICAqLworCW5saW1iID0gX2djcnlfbXBpaF9sc2hpZnQocnAsIG5wLCBuc2l6ZSwgbm9ybWFsaXphdGlvbl9zdGVwcyk7CisJaWYoIG5saW1iICkgeworCSAgICBycFtuc2l6ZV0gPSBubGltYjsKKwkgICAgcnNpemUgPSBuc2l6ZSArIDE7CisJfQorCWVsc2UKKwkgICAgcnNpemUgPSBuc2l6ZTsKKyAgICB9CisgICAgZWxzZSB7CisJLyogVGhlIGRlbm9taW5hdG9yIGlzIGFscmVhZHkgbm9ybWFsaXplZCwgYXMgcmVxdWlyZWQuCUNvcHkgaXQgdG8KKwkgKiB0ZW1wb3Jhcnkgc3BhY2UgaWYgaXQgb3ZlcmxhcHMgd2l0aCB0aGUgcXVvdGllbnQgb3IgcmVtYWluZGVyLiAgKi8KKwlpZiggZHAgPT0gcnAgfHwgKHF1b3QgJiYgKGRwID09IHFwKSkpIHsKKwkgICAgbXBpX3B0cl90IHRwOworCisgICAgICAgICAgICBtYXJrZXJfbmxpbWJzW21hcmtpZHhdID0gZHNpemU7CisJICAgIHRwID0gbWFya2VyW21hcmtpZHgrK10gPSBtcGlfYWxsb2NfbGltYl9zcGFjZShkc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGlfaXNfc2VjdXJlKGRlbikpOworCSAgICBNUE5fQ09QWSggdHAsIGRwLCBkc2l6ZSApOworCSAgICBkcCA9IHRwOworCX0KKworCS8qIE1vdmUgdGhlIG51bWVyYXRvciB0byB0aGUgcmVtYWluZGVyLiAgKi8KKwlpZiggcnAgIT0gbnAgKQorCSAgICBNUE5fQ09QWShycCwgbnAsIG5zaXplKTsKKworCXJzaXplID0gbnNpemU7CisgICAgfQorCisgICAgcV9saW1iID0gX2djcnlfbXBpaF9kaXZyZW0oIHFwLCAwLCBycCwgcnNpemUsIGRwLCBkc2l6ZSApOworCisgICAgaWYoIHF1b3QgKSB7CisJcXNpemUgPSByc2l6ZSAtIGRzaXplOworCWlmKHFfbGltYikgeworCSAgICBxcFtxc2l6ZV0gPSBxX2xpbWI7CisJICAgIHFzaXplICs9IDE7CisJfQorCisJcXVvdC0+bmxpbWJzID0gcXNpemU7CisJcXVvdC0+c2lnbiA9IHNpZ25fcXVvdGllbnQ7CisgICAgfQorCisgICAgcnNpemUgPSBkc2l6ZTsKKyAgICBNUE5fTk9STUFMSVpFIChycCwgcnNpemUpOworCisgICAgaWYoIG5vcm1hbGl6YXRpb25fc3RlcHMgJiYgcnNpemUgKSB7CisJX2djcnlfbXBpaF9yc2hpZnQocnAsIHJwLCByc2l6ZSwgbm9ybWFsaXphdGlvbl9zdGVwcyk7CisJcnNpemUgLT0gcnBbcnNpemUgLSAxXSA9PSAwPzE6MDsKKyAgICB9CisKKyAgICByZW0tPm5saW1icyA9IHJzaXplOworICAgIHJlbS0+c2lnbgk9IHNpZ25fcmVtYWluZGVyOworICAgIHdoaWxlKCBtYXJraWR4ICkKKyAgICAgIHsKKyAgICAgICAgbWFya2lkeC0tOworCV9nY3J5X21waV9mcmVlX2xpbWJfc3BhY2UgKG1hcmtlclttYXJraWR4XSwgbWFya2VyX25saW1ic1ttYXJraWR4XSk7CisgICAgICB9Cit9CisKK3ZvaWQKK19nY3J5X21waV90ZGl2X3FfMmV4cCggZ2NyeV9tcGlfdCB3LCBnY3J5X21waV90IHUsIHVuc2lnbmVkIGludCBjb3VudCApCit7CisgICAgbXBpX3NpemVfdCB1c2l6ZSwgd3NpemU7CisgICAgbXBpX3NpemVfdCBsaW1iX2NudDsKKworICAgIHVzaXplID0gdS0+bmxpbWJzOworICAgIGxpbWJfY250ID0gY291bnQgLyBCSVRTX1BFUl9NUElfTElNQjsKKyAgICB3c2l6ZSA9IHVzaXplIC0gbGltYl9jbnQ7CisgICAgaWYoIGxpbWJfY250ID49IHVzaXplICkKKwl3LT5ubGltYnMgPSAwOworICAgIGVsc2UgeworCW1waV9wdHJfdCB3cDsKKwltcGlfcHRyX3QgdXA7CisKKwlSRVNJWkVfSUZfTkVFREVEKCB3LCB3c2l6ZSApOworCXdwID0gdy0+ZDsKKwl1cCA9IHUtPmQ7CisKKwljb3VudCAlPSBCSVRTX1BFUl9NUElfTElNQjsKKwlpZiggY291bnQgKSB7CisJICAgIF9nY3J5X21waWhfcnNoaWZ0KCB3cCwgdXAgKyBsaW1iX2NudCwgd3NpemUsIGNvdW50ICk7CisJICAgIHdzaXplIC09ICF3cFt3c2l6ZSAtIDFdOworCX0KKwllbHNlIHsKKwkgICAgTVBOX0NPUFlfSU5DUiggd3AsIHVwICsgbGltYl9jbnQsIHdzaXplKTsKKwl9CisKKwl3LT5ubGltYnMgPSB3c2l6ZTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqCisgKiBDaGVjayB3aGV0aGVyIGRpdmlkZW5kIGlzIGRpdmlzaWJsZSBieSBkaXZpc29yCisgKiAobm90ZTogZGl2aXNvciBtdXN0IGZpdCBpbnRvIGEgbGltYikKKyAqLworaW50CitfZ2NyeV9tcGlfZGl2aXNpYmxlX3VpKGdjcnlfbXBpX3QgZGl2aWRlbmQsIHVsb25nIGRpdmlzb3IgKQoreworICAgIHJldHVybiAhX2djcnlfbXBpaF9tb2RfMSggZGl2aWRlbmQtPmQsIGRpdmlkZW5kLT5ubGltYnMsIGRpdmlzb3IgKTsKK30KKworCit2b2lkCitnY3J5X21waV9kaXYgKGdjcnlfbXBpX3QgcXVvdCwgZ2NyeV9tcGlfdCByZW0sIGdjcnlfbXBpX3QgZGl2aWRlbmQsIGdjcnlfbXBpX3QgZGl2aXNvciwgaW50IHJvdW5kKQoreworICBpZiAoIXJvdW5kKQorICAgIHsKKyAgICAgIGlmICghcmVtKQorICAgICAgICB7CisgICAgICAgICAgZ2NyeV9tcGlfdCB0bXAgPSBtcGlfYWxsb2MgKG1waV9nZXRfbmxpbWJzKHF1b3QpKTsKKyAgICAgICAgICBfZ2NyeV9tcGlfdGRpdl9xciAocXVvdCwgdG1wLCBkaXZpZGVuZCwgZGl2aXNvcik7CisgICAgICAgICAgbXBpX2ZyZWUgKHRtcCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgX2djcnlfbXBpX3RkaXZfcXIgKHF1b3QsIHJlbSwgZGl2aWRlbmQsIGRpdmlzb3IpOworICAgIH0KKyAgZWxzZSBpZiAocm91bmQgPCAwKQorICAgIHsKKyAgICAgIGlmICghcmVtKQorICAgICAgICBfZ2NyeV9tcGlfZmRpdl9xIChxdW90LCBkaXZpZGVuZCwgZGl2aXNvcik7CisgICAgICBlbHNlIGlmICghcXVvdCkKKyAgICAgICAgX2djcnlfbXBpX2ZkaXZfciAocmVtLCBkaXZpZGVuZCwgZGl2aXNvcik7CisgICAgICBlbHNlCisgICAgICAgIF9nY3J5X21waV9mZGl2X3FyIChxdW90LCByZW0sIGRpdmlkZW5kLCBkaXZpc29yKTsKKyAgICB9CisgIGVsc2UKKyAgICBsb2dfYnVnICgibXBpIHJvdW5kaW5nIHRvIGNlaWxpbmcgbm90IHlldCBpbXBsZW1lbnRlZFxuIik7Cit9CisKKworCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL21waS1nY2QuYyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvbXBpLWdjZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxODQxZTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL21waS1nY2QuYwpAQCAtMCwwICsxLDU0IEBACisvKiBtcGktZ2NkLmMgIC0gIE1QSSBmdW5jdGlvbnMKKyAqCUNvcHlyaWdodCAoQykgMTk5OCwgMjAwMSwgMjAwMiwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAibXBpLWludGVybmFsLmgiCisKKy8qKioqKioqKioqKioqKioqCisgKiBGaW5kIHRoZSBncmVhdGVzdCBjb21tb24gZGl2aXNvciBHIG9mIEEgYW5kIEIuCisgKiBSZXR1cm46IHRydWUgaWYgdGhpcyAxLCBmYWxzZSBpbiBhbGwgb3RoZXIgY2FzZXMKKyAqLworaW50CitnY3J5X21waV9nY2QoIGdjcnlfbXBpX3QgZywgZ2NyeV9tcGlfdCB4YSwgZ2NyeV9tcGlfdCB4YiApCit7CisgICAgZ2NyeV9tcGlfdCBhLCBiOworCisgICAgYSA9IG1waV9jb3B5KHhhKTsKKyAgICBiID0gbXBpX2NvcHkoeGIpOworCisgICAgLyogVEFPQ1AgVm9sIElJLCA0LjUuMiwgQWxnb3JpdGhtIEEgKi8KKyAgICBhLT5zaWduID0gMDsKKyAgICBiLT5zaWduID0gMDsKKyAgICB3aGlsZSggZ2NyeV9tcGlfY21wX3VpKCBiLCAwICkgKSB7CisJX2djcnlfbXBpX2ZkaXZfciggZywgYSwgYiApOyAvKiBnIHVzZWQgYXMgdGVtb3JhcnkgdmFyaWFibGUgKi8KKwltcGlfc2V0KGEsYik7CisJbXBpX3NldChiLGcpOworICAgIH0KKyAgICBtcGlfc2V0KGcsIGEpOworCisgICAgbXBpX2ZyZWUoYSk7CisgICAgbXBpX2ZyZWUoYik7CisgICAgcmV0dXJuICFnY3J5X21waV9jbXBfdWkoIGcsIDEpOworfQorCisKKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9tcGktaW5saW5lLmMgYi9saWJnY3J5cHQtMS40LjYvbXBpL21waS1pbmxpbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTk2OTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9tcGktaW5saW5lLmMKQEAgLTAsMCArMSwzNiBAQAorLyogbXBpLWlubGluZS5jCisgKglDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvKiBwdXQgdGhlIGlubGluZSBmdW5jdGlvbnMgYXMgcmVhbCBmdW5jdGlvbnMgaW50byB0aGUgbGliICovCisjZGVmaW5lIEcxMF9NUElfSU5MSU5FX0RFQ0wKKworI2luY2x1ZGUgIm1waS1pbnRlcm5hbC5oIgorCisvKiBhbHdheXMgaW5jbHVkZSB0aGUgaGVhZGVyIGJlY3Vhc2UgaXQgaXMgb25seQorICogaW5jbHVkZWQgYnkgbXBpLWludGVybmFsIGlmIF9fR0NDX18gaXMgZGVmaW5lZCBidXQgd2UKKyAqIG5lZWQgaXQgaGVyZSBpbiBhbGwgY2FzZXMgYW5kIHRoZSBhYm92ZSBkZWZpbml0aW9uIG9mCisgKiBvZiB0aGUgbWFjcm8gYWxsb3dzIHVzIHRvIGRvIHNvCisgKi8KKyNpbmNsdWRlICJtcGktaW5saW5lLmgiCisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvbXBpLWlubGluZS5oIGIvbGliZ2NyeXB0LTEuNC42L21waS9tcGktaW5saW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhkOWY1NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvbXBpLWlubGluZS5oCkBAIC0wLDAgKzEsMTU0IEBACisvKiBtcGktaW5saW5lLmggIC0gIEludGVybmFsIHRvIHRoZSBNdWx0aSBQcmVjaXNpb24gSW50ZWdlcnMKKyAqIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NiwgMTk5OCwgMTk5OSwKKyAqICAgICAgICAgICAgICAgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKgorICogTm90ZTogVGhpcyBjb2RlIGlzIGhlYXZpbHkgYmFzZWQgb24gdGhlIEdOVSBNUCBMaWJyYXJ5LgorICoJIEFjdHVhbGx5IGl0J3MgdGhlIHNhbWUgY29kZSB3aXRoIG9ubHkgbWlub3IgY2hhbmdlcyBpbiB0aGUKKyAqCSB3YXkgdGhlIGRhdGEgaXMgc3RvcmVkOyB0aGlzIGlzIHRvIHN1cHBvcnQgdGhlIGFic3RyYWN0aW9uCisgKgkgb2YgYW4gb3B0aW9uYWwgc2VjdXJlIG1lbW9yeSBhbGxvY2F0aW9uIHdoaWNoIG1heSBiZSB1c2VkCisgKgkgdG8gYXZvaWQgcmV2ZWFsaW5nIG9mIHNlbnNpdGl2ZSBkYXRhIGR1ZSB0byBwYWdpbmcgZXRjLgorICovCisKKyNpZm5kZWYgRzEwX01QSV9JTkxJTkVfSAorI2RlZmluZSBHMTBfTVBJX0lOTElORV9ICisKKyNpZm5kZWYgRzEwX01QSV9JTkxJTkVfREVDTAorI2RlZmluZSBHMTBfTVBJX0lOTElORV9ERUNMICBleHRlcm4gX19pbmxpbmVfXworI2VuZGlmCisKK0cxMF9NUElfSU5MSU5FX0RFQ0wgIG1waV9saW1iX3QKK19nY3J5X21waWhfYWRkXzEoIG1waV9wdHJfdCByZXNfcHRyLCBtcGlfcHRyX3QgczFfcHRyLAorCSAgICAgICBtcGlfc2l6ZV90IHMxX3NpemUsIG1waV9saW1iX3QgczJfbGltYikKK3sKKyAgICBtcGlfbGltYl90IHg7CisKKyAgICB4ID0gKnMxX3B0cisrOworICAgIHMyX2xpbWIgKz0geDsKKyAgICAqcmVzX3B0cisrID0gczJfbGltYjsKKyAgICBpZiggczJfbGltYiA8IHggKSB7IC8qIHN1bSBpcyBsZXNzIHRoYW4gdGhlIGxlZnQgb3BlcmFuZDogaGFuZGxlIGNhcnJ5ICovCisJd2hpbGUoIC0tczFfc2l6ZSApIHsKKwkgICAgeCA9ICpzMV9wdHIrKyArIDE7CS8qIGFkZCBjYXJyeSAqLworCSAgICAqcmVzX3B0cisrID0geDsJLyogYW5kIHN0b3JlICovCisJICAgIGlmKCB4ICkJCS8qIG5vdCAwIChubyBvdmVyZmxvdyk6IHdlIGNhbiBzdG9wICovCisJCWdvdG8gbGVhdmU7CisJfQorCXJldHVybiAxOyAvKiByZXR1cm4gY2FycnkgKHNpemUgb2YgczEgdG8gc21hbGwpICovCisgICAgfQorCisgIGxlYXZlOgorICAgIGlmKCByZXNfcHRyICE9IHMxX3B0ciApIHsgLyogbm90IHRoZSBzYW1lIHZhcmlhYmxlICovCisJbXBpX3NpemVfdCBpOwkgICAgICAgLyogY29weSB0aGUgcmVzdCAqLworCWZvciggaT0wOyBpIDwgczFfc2l6ZS0xOyBpKysgKQorCSAgICByZXNfcHRyW2ldID0gczFfcHRyW2ldOworICAgIH0KKyAgICByZXR1cm4gMDsgLyogbm8gY2FycnkgKi8KK30KKworCisKK0cxMF9NUElfSU5MSU5FX0RFQ0wgbXBpX2xpbWJfdAorX2djcnlfbXBpaF9hZGQobXBpX3B0cl90IHJlc19wdHIsIG1waV9wdHJfdCBzMV9wdHIsIG1waV9zaXplX3QgczFfc2l6ZSwKKwkJCSAgICAgICBtcGlfcHRyX3QgczJfcHRyLCBtcGlfc2l6ZV90IHMyX3NpemUpCit7CisgICAgbXBpX2xpbWJfdCBjeSA9IDA7CisKKyAgICBpZiggczJfc2l6ZSApCisJY3kgPSBfZ2NyeV9tcGloX2FkZF9uKCByZXNfcHRyLCBzMV9wdHIsIHMyX3B0ciwgczJfc2l6ZSApOworCisgICAgaWYoIHMxX3NpemUgLSBzMl9zaXplICkKKwljeSA9IF9nY3J5X21waWhfYWRkXzEoIHJlc19wdHIgKyBzMl9zaXplLCBzMV9wdHIgKyBzMl9zaXplLAorCQkJICAgIHMxX3NpemUgLSBzMl9zaXplLCBjeSk7CisgICAgcmV0dXJuIGN5OworfQorCisKK0cxMF9NUElfSU5MSU5FX0RFQ0wgbXBpX2xpbWJfdAorX2djcnlfbXBpaF9zdWJfMShtcGlfcHRyX3QgcmVzX3B0ciwgIG1waV9wdHJfdCBzMV9wdHIsCisJICAgICAgbXBpX3NpemVfdCBzMV9zaXplLCBtcGlfbGltYl90IHMyX2xpbWIgKQoreworICAgIG1waV9saW1iX3QgeDsKKworICAgIHggPSAqczFfcHRyKys7CisgICAgczJfbGltYiA9IHggLSBzMl9saW1iOworICAgICpyZXNfcHRyKysgPSBzMl9saW1iOworICAgIGlmKCBzMl9saW1iID4geCApIHsKKwl3aGlsZSggLS1zMV9zaXplICkgeworCSAgICB4ID0gKnMxX3B0cisrOworCSAgICAqcmVzX3B0cisrID0geCAtIDE7CisJICAgIGlmKCB4ICkKKwkJZ290byBsZWF2ZTsKKwl9CisJcmV0dXJuIDE7CisgICAgfQorCisgIGxlYXZlOgorICAgIGlmKCByZXNfcHRyICE9IHMxX3B0ciApIHsKKwltcGlfc2l6ZV90IGk7CisJZm9yKCBpPTA7IGkgPCBzMV9zaXplLTE7IGkrKyApCisJICAgIHJlc19wdHJbaV0gPSBzMV9wdHJbaV07CisgICAgfQorICAgIHJldHVybiAwOworfQorCisKKworRzEwX01QSV9JTkxJTkVfREVDTCAgIG1waV9saW1iX3QKK19nY3J5X21waWhfc3ViKCBtcGlfcHRyX3QgcmVzX3B0ciwgbXBpX3B0cl90IHMxX3B0ciwgbXBpX3NpemVfdCBzMV9zaXplLAorCQkJCW1waV9wdHJfdCBzMl9wdHIsIG1waV9zaXplX3QgczJfc2l6ZSkKK3sKKyAgICBtcGlfbGltYl90IGN5ID0gMDsKKworICAgIGlmKCBzMl9zaXplICkKKwljeSA9IF9nY3J5X21waWhfc3ViX24ocmVzX3B0ciwgczFfcHRyLCBzMl9wdHIsIHMyX3NpemUpOworCisgICAgaWYoIHMxX3NpemUgLSBzMl9zaXplICkKKwljeSA9IF9nY3J5X21waWhfc3ViXzEocmVzX3B0ciArIHMyX3NpemUsIHMxX3B0ciArIHMyX3NpemUsCisJCQkJICAgICAgczFfc2l6ZSAtIHMyX3NpemUsIGN5KTsKKyAgICByZXR1cm4gY3k7Cit9CisKKy8qKioqKioqKioqKioqKioqCisgKiBDb21wYXJlIE9QMV9QVFIvT1AxX1NJWkUgd2l0aCBPUDJfUFRSL09QMl9TSVpFLgorICogVGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucyBvbiB0aGUgcmVsYXRpdmUgc2l6ZXMgb2YKKyAqIHRoZSB0d28gYXJndW1lbnRzLgorICogUmV0dXJuIDEgaWYgT1AxID4gT1AyLCAwIGlmIHRoZXkgYXJlIGVxdWFsLCBhbmQgLTEgaWYgT1AxIDwgT1AyLgorICovCitHMTBfTVBJX0lOTElORV9ERUNMIGludAorX2djcnlfbXBpaF9jbXAoIG1waV9wdHJfdCBvcDFfcHRyLCBtcGlfcHRyX3Qgb3AyX3B0ciwgbXBpX3NpemVfdCBzaXplICkKK3sKKyAgICBtcGlfc2l6ZV90IGk7CisgICAgbXBpX2xpbWJfdCBvcDFfd29yZCwgb3AyX3dvcmQ7CisKKyAgICBmb3IoIGkgPSBzaXplIC0gMTsgaSA+PSAwIDsgaS0tKSB7CisJb3AxX3dvcmQgPSBvcDFfcHRyW2ldOworCW9wMl93b3JkID0gb3AyX3B0cltpXTsKKwlpZiggb3AxX3dvcmQgIT0gb3AyX3dvcmQgKQorCSAgICBnb3RvIGRpZmY7CisgICAgfQorICAgIHJldHVybiAwOworCisgIGRpZmY6CisgICAgLyogVGhpcyBjYW4gKm5vdCogYmUgc2ltcGxpZmllZCB0bworICAgICAqCSBvcDJfd29yZCAtIG9wMl93b3JkCisgICAgICogc2luY2UgdGhhdCBleHByZXNzaW9uIG1pZ2h0IGdpdmUgc2lnbmVkIG92ZXJmbG93LiAgKi8KKyAgICByZXR1cm4gKG9wMV93b3JkID4gb3AyX3dvcmQpID8gMSA6IC0xOworfQorCisKKyNlbmRpZiAvKkcxMF9NUElfSU5MSU5FX0gqLwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9tcGktaW50ZXJuYWwuaCBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvbXBpLWludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjljMWY5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvbXBpLWludGVybmFsLmgKQEAgLTAsMCArMSwyNzggQEAKKy8qIG1waS1pbnRlcm5hbC5oICAtICBJbnRlcm5hbCB0byB0aGUgTXVsdGkgUHJlY2lzaW9uIEludGVnZXJzCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTYsIDE5OTgsIDIwMDAsIDIwMDIsCisgKiAgICAgICAgICAgICAgIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICoKKyAqIE5vdGU6IFRoaXMgY29kZSBpcyBoZWF2aWx5IGJhc2VkIG9uIHRoZSBHTlUgTVAgTGlicmFyeS4KKyAqCSBBY3R1YWxseSBpdCdzIHRoZSBzYW1lIGNvZGUgd2l0aCBvbmx5IG1pbm9yIGNoYW5nZXMgaW4gdGhlCisgKgkgd2F5IHRoZSBkYXRhIGlzIHN0b3JlZDsgdGhpcyBpcyB0byBzdXBwb3J0IHRoZSBhYnN0cmFjdGlvbgorICoJIG9mIGFuIG9wdGlvbmFsIHNlY3VyZSBtZW1vcnkgYWxsb2NhdGlvbiB3aGljaCBtYXkgYmUgdXNlZAorICoJIHRvIGF2b2lkIHJldmVhbGluZyBvZiBzZW5zaXRpdmUgZGF0YSBkdWUgdG8gcGFnaW5nIGV0Yy4KKyAqLworCisjaWZuZGVmIEcxMF9NUElfSU5URVJOQUxfSAorI2RlZmluZSBHMTBfTVBJX0lOVEVSTkFMX0gKKworI2luY2x1ZGUgIm1waS1hc20tZGVmcy5oIgorCisjaWZuZGVmIEJJVFNfUEVSX01QSV9MSU1CCisjaWYgQllURVNfUEVSX01QSV9MSU1CID09IFNJWkVPRl9VTlNJR05FRF9JTlQKKyAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgbXBpX2xpbWJfdDsKKyAgdHlwZWRlZiAgIHNpZ25lZCBpbnQgbXBpX2xpbWJfc2lnbmVkX3Q7CisjZWxpZiBCWVRFU19QRVJfTVBJX0xJTUIgPT0gU0laRU9GX1VOU0lHTkVEX0xPTkcKKyAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBtcGlfbGltYl90OworICB0eXBlZGVmICAgc2lnbmVkIGxvbmcgaW50IG1waV9saW1iX3NpZ25lZF90OworI2VsaWYgQllURVNfUEVSX01QSV9MSU1CID09IFNJWkVPRl9VTlNJR05FRF9MT05HX0xPTkcKKyAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgaW50IG1waV9saW1iX3Q7CisgIHR5cGVkZWYgICBzaWduZWQgbG9uZyBsb25nIGludCBtcGlfbGltYl9zaWduZWRfdDsKKyNlbGlmIEJZVEVTX1BFUl9NUElfTElNQiA9PSBTSVpFT0ZfVU5TSUdORURfU0hPUlQKKyAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgbXBpX2xpbWJfdDsKKyAgdHlwZWRlZiAgIHNpZ25lZCBzaG9ydCBpbnQgbXBpX2xpbWJfc2lnbmVkX3Q7CisjZWxzZQorI2Vycm9yIEJZVEVTX1BFUl9NUElfTElNQiBkb2VzIG5vdCBtYXRjaCBhbnkgQyB0eXBlCisjZW5kaWYKKyNkZWZpbmUgQklUU19QRVJfTVBJX0xJTUIgICAgKDgqQllURVNfUEVSX01QSV9MSU1CKQorI2VuZGlmIC8qQklUU19QRVJfTVBJX0xJTUIqLworCisjaW5jbHVkZSAibXBpLmgiCisKKy8qIElmIEtBUkFUU1VCQV9USFJFU0hPTEQgaXMgbm90IGFscmVhZHkgZGVmaW5lZCwgZGVmaW5lIGl0IHRvIGEKKyAqIHZhbHVlIHdoaWNoIGlzIGdvb2Qgb24gbW9zdCBtYWNoaW5lcy4gICovCisKKy8qIHRlc3RlZCA0LCAxNiwgMzIgYW5kIDY0LCB3aGVyZSAxNiBnYXZlIHRoZSBiZXN0IHBlcmZvcm1hbmNlIHdoZW4KKyAqIGNoZWNraW5nIGEgNzY4IGFuZCBhIDEwMjQgYml0IEVsR2FtYWwgc2lnbmF0dXJlLgorICogKHdrIDIyLjEyLjk3KSAqLworI2lmbmRlZiBLQVJBVFNVQkFfVEhSRVNIT0xECisjZGVmaW5lIEtBUkFUU1VCQV9USFJFU0hPTEQgMTYKKyNlbmRpZgorCisvKiBUaGUgY29kZSBjYW4ndCBoYW5kbGUgS0FSQVRTVUJBX1RIUkVTSE9MRCBzbWFsbGVyIHRoYW4gMi4gICovCisjaWYgS0FSQVRTVUJBX1RIUkVTSE9MRCA8IDIKKyN1bmRlZiBLQVJBVFNVQkFfVEhSRVNIT0xECisjZGVmaW5lIEtBUkFUU1VCQV9USFJFU0hPTEQgMgorI2VuZGlmCisKKwordHlwZWRlZiBtcGlfbGltYl90ICptcGlfcHRyX3Q7IC8qIHBvaW50ZXIgdG8gYSBsaW1iICovCit0eXBlZGVmIGludCBtcGlfc2l6ZV90OyAgICAgICAgLyogKG11c3QgYmUgYSBzaWduZWQgdHlwZSkgKi8KKworI2RlZmluZSBBQlMoeCkgKHggPj0gMCA/IHggOiAteCkKKyNkZWZpbmUgTUlOKGwsbykgKChsKSA8IChvKSA/IChsKSA6IChvKSkKKyNkZWZpbmUgTUFYKGgsaSkgKChoKSA+IChpKSA/IChoKSA6IChpKSkKKyNkZWZpbmUgUkVTSVpFX0lGX05FRURFRChhLGIpIFwKKyAgICBkbyB7CQkJICAgXAorCWlmKCAoYSktPmFsbG9jZWQgPCAoYikgKSAgIFwKKwkgICAgbXBpX3Jlc2l6ZSgoYSksIChiKSk7ICBcCisgICAgfSB3aGlsZSgwKQorCisvKiBDb3B5IE4gbGltYnMgZnJvbSBTIHRvIEQuICAqLworI2RlZmluZSBNUE5fQ09QWSggZCwgcywgbikgXAorICAgIGRvIHsJCQkJXAorCW1waV9zaXplX3QgX2k7CQkJXAorCWZvciggX2kgPSAwOyBfaSA8IChuKTsgX2krKyApCVwKKwkgICAgKGQpW19pXSA9IChzKVtfaV07CQlcCisgICAgfSB3aGlsZSgwKQorCisjZGVmaW5lIE1QTl9DT1BZX0lOQ1IoIGQsIHMsIG4pIAlcCisgICAgZG8gewkJCQlcCisJbXBpX3NpemVfdCBfaTsJCQlcCisJZm9yKCBfaSA9IDA7IF9pIDwgKG4pOyBfaSsrICkJXAorCSAgICAoZClbX2ldID0gKGQpW19pXTsJCVwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIE1QTl9DT1BZX0RFQ1IoIGQsIHMsIG4gKSBcCisgICAgZG8gewkJCQlcCisJbXBpX3NpemVfdCBfaTsJCQlcCisJZm9yKCBfaSA9IChuKS0xOyBfaSA+PSAwOyBfaS0tKSBcCisJICAgKGQpW19pXSA9IChzKVtfaV07CQlcCisgICAgfSB3aGlsZSgwKQorCisvKiBaZXJvIE4gbGltYnMgYXQgRCAqLworI2RlZmluZSBNUE5fWkVSTyhkLCBuKSBcCisgICAgZG8gewkJCQkgIFwKKwlpbnQgIF9pOwkJCSAgXAorCWZvciggX2kgPSAwOyBfaSA8IChuKTsgX2krKyApICBcCisJICAgIChkKVtfaV0gPSAwOwkJICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIE1QTl9OT1JNQUxJWkUoZCwgbikgIFwKKyAgICBkbyB7CQkgICAgICAgXAorCXdoaWxlKCAobikgPiAwICkgeyAgICAgXAorCSAgICBpZiggKGQpWyhuKS0xXSApIFwKKwkJYnJlYWs7CSAgICAgICBcCisJICAgIChuKS0tOwkgICAgICAgXAorCX0JCSAgICAgICBcCisgICAgfSB3aGlsZSgwKQorCisjZGVmaW5lIE1QTl9OT1JNQUxJWkVfTk9UX1pFUk8oZCwgbikgXAorICAgIGRvIHsJCQkJICAgIFwKKwlmb3IoOzspIHsJCQkgICAgXAorCSAgICBpZiggKGQpWyhuKS0xXSApCQkgICAgXAorCQlicmVhazsJCQkgICAgXAorCSAgICAobiktLTsJCQkgICAgXAorCX0JCQkJICAgIFwKKyAgICB9IHdoaWxlKDApCisKKyNkZWZpbmUgTVBOX01VTF9OX1JFQ1VSU0UocHJvZHAsIHVwLCB2cCwgc2l6ZSwgdHNwYWNlKSBcCisgICAgZG8gewkJCQkJCVwKKwlpZiggKHNpemUpIDwgS0FSQVRTVUJBX1RIUkVTSE9MRCApCQlcCisJICAgIG11bF9uX2Jhc2VjYXNlIChwcm9kcCwgdXAsIHZwLCBzaXplKTsJXAorCWVsc2UJCQkJCQlcCisJICAgIG11bF9uIChwcm9kcCwgdXAsIHZwLCBzaXplLCB0c3BhY2UpOwlcCisgICAgfSB3aGlsZSAoMCk7CisKKworLyogRGl2aWRlIHRoZSB0d28tbGltYiBudW1iZXIgaW4gKE5ILCxOTCkgYnkgRCwgd2l0aCBESSBiZWluZyB0aGUgbGFyZ2VzdAorICogbGltYiBub3QgbGFyZ2VyIHRoYW4gKDIqKigyKkJJVFNfUEVSX01QX0xJTUIpKS9EIC0gKDIqKkJJVFNfUEVSX01QX0xJTUIpLgorICogSWYgdGhpcyB3b3VsZCB5aWVsZCBvdmVyZmxvdywgREkgc2hvdWxkIGJlIHRoZSBsYXJnZXN0IHBvc3NpYmxlIG51bWJlcgorICogKGkuZS4sIG9ubHkgb25lcykuICBGb3IgY29ycmVjdCBvcGVyYXRpb24sIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBvZiBECisgKiBoYXMgdG8gYmUgc2V0LiAgUHV0IHRoZSBxdW90aWVudCBpbiBRIGFuZCB0aGUgcmVtYWluZGVyIGluIFIuCisgKi8KKyNkZWZpbmUgVURJVl9RUk5ORF9QUkVJTlYocSwgciwgbmgsIG5sLCBkLCBkaSkgXAorICAgIGRvIHsJCQkJCQkJICAgIFwKKwltcGlfbGltYl90IF9xLCBfcWwsIF9yOyAJCQkJICAgIFwKKwltcGlfbGltYl90IF94aCwgX3hsOwkJCQkJICAgIFwKKwl1bXVsX3BwbW0gKF9xLCBfcWwsIChuaCksIChkaSkpOwkJCSAgICBcCisJX3EgKz0gKG5oKTsJLyogREkgaXMgMioqQklUU19QRVJfTVBJX0xJTUIgdG9vIHNtYWxsICovICBcCisJdW11bF9wcG1tIChfeGgsIF94bCwgX3EsIChkKSk7CQkJCSAgICBcCisJc3ViX2RkbW1zcyAoX3hoLCBfciwgKG5oKSwgKG5sKSwgX3hoLCBfeGwpOwkJICAgIFwKKwlpZiggX3hoICkgewkJCQkJCSAgICBcCisJICAgIHN1Yl9kZG1tc3MgKF94aCwgX3IsIF94aCwgX3IsIDAsIChkKSk7CQkgICAgXAorCSAgICBfcSsrOwkJCQkJCSAgICBcCisJICAgIGlmKCBfeGgpIHsJCQkJCQkgICAgXAorCQlzdWJfZGRtbXNzIChfeGgsIF9yLCBfeGgsIF9yLCAwLCAoZCkpOwkJICAgIFwKKwkJX3ErKzsJCQkJCQkgICAgXAorCSAgICB9CQkJCQkJCSAgICBcCisJfQkJCQkJCQkgICAgXAorCWlmKCBfciA+PSAoZCkgKSB7CQkJCQkgICAgXAorCSAgICBfciAtPSAoZCk7CQkJCQkJICAgIFwKKwkgICAgX3ErKzsJCQkJCQkgICAgXAorCX0JCQkJCQkJICAgIFwKKwkocikgPSBfcjsJCQkJCQkgICAgXAorCShxKSA9IF9xOwkJCQkJCSAgICBcCisgICAgfSB3aGlsZSAoMCkKKworCisvKi0tIG1waXV0aWwuYyAtLSovCisjZGVmaW5lIG1waV9hbGxvY19saW1iX3NwYWNlKG4sZikgIF9nY3J5X21waV9hbGxvY19saW1iX3NwYWNlKChuKSwoZikpCittcGlfcHRyX3QgX2djcnlfbXBpX2FsbG9jX2xpbWJfc3BhY2UoIHVuc2lnbmVkIG5saW1icywgaW50IHNlYyApOwordm9pZCBfZ2NyeV9tcGlfZnJlZV9saW1iX3NwYWNlKCBtcGlfcHRyX3QgYSwgdW5zaWduZWQgaW50IG5saW1icyApOwordm9pZCBfZ2NyeV9tcGlfYXNzaWduX2xpbWJfc3BhY2UoIGdjcnlfbXBpX3QgYSwgbXBpX3B0cl90IGFwLCB1bnNpZ25lZCBubGltYnMgKTsKKworLyotLSBtcGktYml0LmMgLS0qLworI2RlZmluZSBtcGlfcnNoaWZ0X2xpbWJzKGEsbikgIF9nY3J5X21waV9yc2hpZnRfbGltYnMgKChhKSwgKG4pKQorI2RlZmluZSBtcGlfbHNoaWZ0X2xpbWJzKGEsbikgIF9nY3J5X21waV9sc2hpZnRfbGltYnMgKChhKSwgKG4pKQorCit2b2lkIF9nY3J5X21waV9yc2hpZnRfbGltYnMoIGdjcnlfbXBpX3QgYSwgdW5zaWduZWQgaW50IGNvdW50ICk7Cit2b2lkIF9nY3J5X21waV9sc2hpZnRfbGltYnMoIGdjcnlfbXBpX3QgYSwgdW5zaWduZWQgaW50IGNvdW50ICk7CisKKworLyotLSBtcGloLWFkZC5jIC0tKi8KK21waV9saW1iX3QgX2djcnlfbXBpaF9hZGRfMShtcGlfcHRyX3QgcmVzX3B0ciwgIG1waV9wdHJfdCBzMV9wdHIsCisJCQkgbXBpX3NpemVfdCBzMV9zaXplLCBtcGlfbGltYl90IHMyX2xpbWIgKTsKK21waV9saW1iX3QgX2djcnlfbXBpaF9hZGRfbiggbXBpX3B0cl90IHJlc19wdHIsIG1waV9wdHJfdCBzMV9wdHIsCisJCQkgIG1waV9wdHJfdCBzMl9wdHIsICBtcGlfc2l6ZV90IHNpemUpOworbXBpX2xpbWJfdCBfZ2NyeV9tcGloX2FkZChtcGlfcHRyX3QgcmVzX3B0ciwgbXBpX3B0cl90IHMxX3B0ciwgbXBpX3NpemVfdCBzMV9zaXplLAorCQkgICAgICAgbXBpX3B0cl90IHMyX3B0ciwgbXBpX3NpemVfdCBzMl9zaXplKTsKKworLyotLSBtcGloLXN1Yi5jIC0tKi8KK21waV9saW1iX3QgX2djcnlfbXBpaF9zdWJfMSggbXBpX3B0cl90IHJlc19wdHIsICBtcGlfcHRyX3QgczFfcHRyLAorCQkJICBtcGlfc2l6ZV90IHMxX3NpemUsIG1waV9saW1iX3QgczJfbGltYiApOworbXBpX2xpbWJfdCBfZ2NyeV9tcGloX3N1Yl9uKCBtcGlfcHRyX3QgcmVzX3B0ciwgbXBpX3B0cl90IHMxX3B0ciwKKwkJCSAgbXBpX3B0cl90IHMyX3B0ciwgbXBpX3NpemVfdCBzaXplKTsKK21waV9saW1iX3QgX2djcnlfbXBpaF9zdWIobXBpX3B0cl90IHJlc19wdHIsIG1waV9wdHJfdCBzMV9wdHIsIG1waV9zaXplX3QgczFfc2l6ZSwKKwkJICAgICAgIG1waV9wdHJfdCBzMl9wdHIsIG1waV9zaXplX3QgczJfc2l6ZSk7CisKKy8qLS0gbXBpaC1jbXAuYyAtLSovCitpbnQgX2djcnlfbXBpaF9jbXAoIG1waV9wdHJfdCBvcDFfcHRyLCBtcGlfcHRyX3Qgb3AyX3B0ciwgbXBpX3NpemVfdCBzaXplICk7CisKKy8qLS0gbXBpaC1tdWwuYyAtLSovCisKK3N0cnVjdCBrYXJhdHN1YmFfY3R4IHsKKyAgICBzdHJ1Y3Qga2FyYXRzdWJhX2N0eCAqbmV4dDsKKyAgICBtcGlfcHRyX3QgdHNwYWNlOworICAgIHVuc2lnbmVkIGludCB0c3BhY2VfbmxpbWJzOworICAgIG1waV9zaXplX3QgdHNwYWNlX3NpemU7CisgICAgbXBpX3B0cl90IHRwOworICAgIHVuc2lnbmVkIGludCB0cF9ubGltYnM7CisgICAgbXBpX3NpemVfdCB0cF9zaXplOworfTsKKwordm9pZCBfZ2NyeV9tcGloX3JlbGVhc2Vfa2FyYXRzdWJhX2N0eCggc3RydWN0IGthcmF0c3ViYV9jdHggKmN0eCApOworCittcGlfbGltYl90IF9nY3J5X21waWhfYWRkbXVsXzEoIG1waV9wdHJfdCByZXNfcHRyLCBtcGlfcHRyX3QgczFfcHRyLAorCQkJICAgICBtcGlfc2l6ZV90IHMxX3NpemUsIG1waV9saW1iX3QgczJfbGltYik7CittcGlfbGltYl90IF9nY3J5X21waWhfc3VibXVsXzEoIG1waV9wdHJfdCByZXNfcHRyLCBtcGlfcHRyX3QgczFfcHRyLAorCQkJICAgICBtcGlfc2l6ZV90IHMxX3NpemUsIG1waV9saW1iX3QgczJfbGltYik7Cit2b2lkIF9nY3J5X21waWhfbXVsX24oIG1waV9wdHJfdCBwcm9kcCwgbXBpX3B0cl90IHVwLCBtcGlfcHRyX3QgdnAsCisJCQkJCQkgICBtcGlfc2l6ZV90IHNpemUpOworbXBpX2xpbWJfdCBfZ2NyeV9tcGloX211bCggbXBpX3B0cl90IHByb2RwLCBtcGlfcHRyX3QgdXAsIG1waV9zaXplX3QgdXNpemUsCisJCQkJCSBtcGlfcHRyX3QgdnAsIG1waV9zaXplX3QgdnNpemUpOwordm9pZCBfZ2NyeV9tcGloX3Nxcl9uX2Jhc2VjYXNlKCBtcGlfcHRyX3QgcHJvZHAsIG1waV9wdHJfdCB1cCwgbXBpX3NpemVfdCBzaXplICk7Cit2b2lkIF9nY3J5X21waWhfc3FyX24oIG1waV9wdHJfdCBwcm9kcCwgbXBpX3B0cl90IHVwLCBtcGlfc2l6ZV90IHNpemUsCisJCQkJCQltcGlfcHRyX3QgdHNwYWNlKTsKKwordm9pZCBfZ2NyeV9tcGloX211bF9rYXJhdHN1YmFfY2FzZSggbXBpX3B0cl90IHByb2RwLAorCQkJCSBtcGlfcHRyX3QgdXAsIG1waV9zaXplX3QgdXNpemUsCisJCQkJIG1waV9wdHJfdCB2cCwgbXBpX3NpemVfdCB2c2l6ZSwKKwkJCQkgc3RydWN0IGthcmF0c3ViYV9jdHggKmN0eCApOworCisKKy8qLS0gbXBpaC1tdWxfMS5jIChvciB4eHgvY3B1LyAqLlMpIC0tKi8KK21waV9saW1iX3QgX2djcnlfbXBpaF9tdWxfMSggbXBpX3B0cl90IHJlc19wdHIsIG1waV9wdHJfdCBzMV9wdHIsCisJCQkgIG1waV9zaXplX3QgczFfc2l6ZSwgbXBpX2xpbWJfdCBzMl9saW1iKTsKKworLyotLSBtcGloLWRpdi5jIC0tKi8KK21waV9saW1iX3QgX2djcnlfbXBpaF9tb2RfMShtcGlfcHRyX3QgZGl2aWRlbmRfcHRyLCBtcGlfc2l6ZV90IGRpdmlkZW5kX3NpemUsCisJCQkJCQkgbXBpX2xpbWJfdCBkaXZpc29yX2xpbWIpOworbXBpX2xpbWJfdCBfZ2NyeV9tcGloX2RpdnJlbSggbXBpX3B0cl90IHFwLCBtcGlfc2l6ZV90IHFleHRyYV9saW1icywKKwkJCSAgIG1waV9wdHJfdCBucCwgbXBpX3NpemVfdCBuc2l6ZSwKKwkJCSAgIG1waV9wdHJfdCBkcCwgbXBpX3NpemVfdCBkc2l6ZSk7CittcGlfbGltYl90IF9nY3J5X21waWhfZGl2bW9kXzEoIG1waV9wdHJfdCBxdW90X3B0ciwKKwkJCSAgICAgbXBpX3B0cl90IGRpdmlkZW5kX3B0ciwgbXBpX3NpemVfdCBkaXZpZGVuZF9zaXplLAorCQkJICAgICBtcGlfbGltYl90IGRpdmlzb3JfbGltYik7CisKKy8qLS0gbXBpaC1zaGlmdC5jIC0tKi8KK21waV9saW1iX3QgX2djcnlfbXBpaF9sc2hpZnQoIG1waV9wdHJfdCB3cCwgbXBpX3B0cl90IHVwLCBtcGlfc2l6ZV90IHVzaXplLAorCQkJCQkJCSAgIHVuc2lnbmVkIGNudCk7CittcGlfbGltYl90IF9nY3J5X21waWhfcnNoaWZ0KCBtcGlfcHRyX3Qgd3AsIG1waV9wdHJfdCB1cCwgbXBpX3NpemVfdCB1c2l6ZSwKKwkJCQkJCQkgICB1bnNpZ25lZCBjbnQpOworCisKKy8qIERlZmluZSBzdHVmZiBmb3IgbG9uZ2xvbmcuaC4gICovCisjZGVmaW5lIFdfVFlQRV9TSVpFIEJJVFNfUEVSX01QSV9MSU1CCisgIHR5cGVkZWYgbXBpX2xpbWJfdCAgIFVXdHlwZTsKKyAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgVUhXdHlwZTsKKyNpZiBkZWZpbmVkIChfX0dOVUNfXykKKyAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgVVFJdHlwZQkgIF9fYXR0cmlidXRlX18gKChtb2RlIChRSSkpKTsKKyAgdHlwZWRlZgkgICBpbnQgU0l0eXBlCSAgX19hdHRyaWJ1dGVfXyAoKG1vZGUgKFNJKSkpOworICB0eXBlZGVmIHVuc2lnbmVkIGludCBVU0l0eXBlCSAgX19hdHRyaWJ1dGVfXyAoKG1vZGUgKFNJKSkpOworICB0eXBlZGVmCSAgIGludCBESXR5cGUJICBfX2F0dHJpYnV0ZV9fICgobW9kZSAoREkpKSk7CisgIHR5cGVkZWYgdW5zaWduZWQgaW50IFVESXR5cGUJICBfX2F0dHJpYnV0ZV9fICgobW9kZSAoREkpKSk7CisjZWxzZQorICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgVVFJdHlwZTsKKyAgdHlwZWRlZgkgICBsb25nIFNJdHlwZTsKKyAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIFVTSXR5cGU7CisjZW5kaWYKKworI2lmZGVmIF9fR05VQ19fCisjaW5jbHVkZSAibXBpLWlubGluZS5oIgorI2VuZGlmCisKKyNlbmRpZiAvKkcxMF9NUElfSU5URVJOQUxfSCovCisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvbXBpLWludi5jIGIvbGliZ2NyeXB0LTEuNC42L21waS9tcGktaW52LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQyNjk0NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvbXBpLWludi5jCkBAIC0wLDAgKzEsMjY3IEBACisvKiBtcGktaW52LmMgIC0gIE1QSSBmdW5jdGlvbnMKKyAqCUNvcHlyaWdodCAoQykgMTk5OCwgMjAwMSwgMjAwMiwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAibXBpLWludGVybmFsLmgiCisjaW5jbHVkZSAiZzEwbGliLmgiCisKKy8qKioqKioqKioqKioqKioqCisgKiBDYWxjdWxhdGUgdGhlIG11bHRpcGxpY2F0aXZlIGludmVyc2UgWCBvZiBBIG1vZCBOCisgKiBUaGF0IGlzOiBGaW5kIHRoZSBzb2x1dGlvbiB4IGZvcgorICoJCTEgPSAoYSp4KSBtb2QgbgorICovCitpbnQKK2djcnlfbXBpX2ludm0oIGdjcnlfbXBpX3QgeCwgZ2NyeV9tcGlfdCBhLCBnY3J5X21waV90IG4gKQoreworI2lmIDAKKyAgICBnY3J5X21waV90IHUsIHYsIHUxLCB1MiwgdTMsIHYxLCB2MiwgdjMsIHEsIHQxLCB0MiwgdDM7CisgICAgZ2NyeV9tcGlfdCB0YSwgdGIsIHRjOworCisgICAgdSA9IG1waV9jb3B5KGEpOworICAgIHYgPSBtcGlfY29weShuKTsKKyAgICB1MSA9IG1waV9hbGxvY19zZXRfdWkoMSk7CisgICAgdTIgPSBtcGlfYWxsb2Nfc2V0X3VpKDApOworICAgIHUzID0gbXBpX2NvcHkodSk7CisgICAgdjEgPSBtcGlfYWxsb2Nfc2V0X3VpKDApOworICAgIHYyID0gbXBpX2FsbG9jX3NldF91aSgxKTsKKyAgICB2MyA9IG1waV9jb3B5KHYpOworICAgIHEgID0gbXBpX2FsbG9jKCBtcGlfZ2V0X25saW1icyh1KSsxICk7CisgICAgdDEgPSBtcGlfYWxsb2MoIG1waV9nZXRfbmxpbWJzKHUpKzEgKTsKKyAgICB0MiA9IG1waV9hbGxvYyggbXBpX2dldF9ubGltYnModSkrMSApOworICAgIHQzID0gbXBpX2FsbG9jKCBtcGlfZ2V0X25saW1icyh1KSsxICk7CisgICAgd2hpbGUoIG1waV9jbXBfdWkoIHYzLCAwICkgKSB7CisJbXBpX2ZkaXZfcSggcSwgdTMsIHYzICk7CisJbXBpX211bCh0MSwgdjEsIHEpOyBtcGlfbXVsKHQyLCB2MiwgcSk7IG1waV9tdWwodDMsIHYzLCBxKTsKKwltcGlfc3ViKHQxLCB1MSwgdDEpOyBtcGlfc3ViKHQyLCB1MiwgdDIpOyBtcGlfc3ViKHQzLCB1MywgdDMpOworCW1waV9zZXQodTEsIHYxKTsgbXBpX3NldCh1MiwgdjIpOyBtcGlfc2V0KHUzLCB2Myk7CisJbXBpX3NldCh2MSwgdDEpOyBtcGlfc2V0KHYyLCB0Mik7IG1waV9zZXQodjMsIHQzKTsKKyAgICB9CisgICAgLyoJbG9nX2RlYnVnKCJyZXN1bHQ6XG4iKTsKKwlsb2dfbXBpZHVtcCgicSA9IiwgcSApOworCWxvZ19tcGlkdW1wKCJ1MT0iLCB1MSk7CisJbG9nX21waWR1bXAoInUyPSIsIHUyKTsKKwlsb2dfbXBpZHVtcCgidTM9IiwgdTMpOworCWxvZ19tcGlkdW1wKCJ2MT0iLCB2MSk7CisJbG9nX21waWR1bXAoInYyPSIsIHYyKTsgKi8KKyAgICBtcGlfc2V0KHgsIHUxKTsKKworICAgIG1waV9mcmVlKHUxKTsKKyAgICBtcGlfZnJlZSh1Mik7CisgICAgbXBpX2ZyZWUodTMpOworICAgIG1waV9mcmVlKHYxKTsKKyAgICBtcGlfZnJlZSh2Mik7CisgICAgbXBpX2ZyZWUodjMpOworICAgIG1waV9mcmVlKHEpOworICAgIG1waV9mcmVlKHQxKTsKKyAgICBtcGlfZnJlZSh0Mik7CisgICAgbXBpX2ZyZWUodDMpOworICAgIG1waV9mcmVlKHUpOworICAgIG1waV9mcmVlKHYpOworI2VsaWYgMAorICAgIC8qIEV4dGVuZGVkIEV1Y2xpZCdzIGFsZ29yaXRobSAoU2VlIFRBT0NQIFZvbCBJSSwgNC41LjIsIEFsZyBYKQorICAgICAqIG1vZGlmaWVkIGFjY29yZGluZyB0byBNaWNoYWVsIFBlbmsncyBzb2x1dGlvbiBmb3IgRXhlcmNpc2UgMzUgKi8KKworICAgIC8qIEZJWE1FOiB3ZSBjYW4gc2ltcGxpZnkgdGhpcyBpbiBtb3N0IGNhc2VzIChzZWUgS251dGgpICovCisgICAgZ2NyeV9tcGlfdCB1LCB2LCB1MSwgdTIsIHUzLCB2MSwgdjIsIHYzLCB0MSwgdDIsIHQzOworICAgIHVuc2lnbmVkIGs7CisgICAgaW50IHNpZ247CisKKyAgICB1ID0gbXBpX2NvcHkoYSk7CisgICAgdiA9IG1waV9jb3B5KG4pOworICAgIGZvcihrPTA7ICFtcGlfdGVzdF9iaXQodSwwKSAmJiAhbXBpX3Rlc3RfYml0KHYsMCk7IGsrKyApIHsKKwltcGlfcnNoaWZ0KHUsIHUsIDEpOworCW1waV9yc2hpZnQodiwgdiwgMSk7CisgICAgfQorCisKKyAgICB1MSA9IG1waV9hbGxvY19zZXRfdWkoMSk7CisgICAgdTIgPSBtcGlfYWxsb2Nfc2V0X3VpKDApOworICAgIHUzID0gbXBpX2NvcHkodSk7CisgICAgdjEgPSBtcGlfY29weSh2KTsJCQkJICAgLyogIS0tIHVzZWQgYXMgY29uc3QgMSAqLworICAgIHYyID0gbXBpX2FsbG9jKCBtcGlfZ2V0X25saW1icyh1KSApOyBtcGlfc3ViKCB2MiwgdTEsIHUgKTsKKyAgICB2MyA9IG1waV9jb3B5KHYpOworICAgIGlmKCBtcGlfdGVzdF9iaXQodSwgMCkgKSB7IC8qIHUgaXMgb2RkICovCisJdDEgPSBtcGlfYWxsb2Nfc2V0X3VpKDApOworCXQyID0gbXBpX2FsbG9jX3NldF91aSgxKTsgdDItPnNpZ24gPSAxOworCXQzID0gbXBpX2NvcHkodik7IHQzLT5zaWduID0gIXQzLT5zaWduOworCWdvdG8gWTQ7CisgICAgfQorICAgIGVsc2UgeworCXQxID0gbXBpX2FsbG9jX3NldF91aSgxKTsKKwl0MiA9IG1waV9hbGxvY19zZXRfdWkoMCk7CisJdDMgPSBtcGlfY29weSh1KTsKKyAgICB9CisgICAgZG8geworCWRvIHsKKwkgICAgaWYoIG1waV90ZXN0X2JpdCh0MSwgMCkgfHwgbXBpX3Rlc3RfYml0KHQyLCAwKSApIHsgLyogb25lIGlzIG9kZCAqLworCQltcGlfYWRkKHQxLCB0MSwgdik7CisJCW1waV9zdWIodDIsIHQyLCB1KTsKKwkgICAgfQorCSAgICBtcGlfcnNoaWZ0KHQxLCB0MSwgMSk7CisJICAgIG1waV9yc2hpZnQodDIsIHQyLCAxKTsKKwkgICAgbXBpX3JzaGlmdCh0MywgdDMsIDEpOworCSAgWTQ6CisJICAgIDsKKwl9IHdoaWxlKCAhbXBpX3Rlc3RfYml0KCB0MywgMCApICk7IC8qIHdoaWxlIHQzIGlzIGV2ZW4gKi8KKworCWlmKCAhdDMtPnNpZ24gKSB7CisJICAgIG1waV9zZXQodTEsIHQxKTsKKwkgICAgbXBpX3NldCh1MiwgdDIpOworCSAgICBtcGlfc2V0KHUzLCB0Myk7CisJfQorCWVsc2UgeworCSAgICBtcGlfc3ViKHYxLCB2LCB0MSk7CisJICAgIHNpZ24gPSB1LT5zaWduOyB1LT5zaWduID0gIXUtPnNpZ247CisJICAgIG1waV9zdWIodjIsIHUsIHQyKTsKKwkgICAgdS0+c2lnbiA9IHNpZ247CisJICAgIHNpZ24gPSB0My0+c2lnbjsgdDMtPnNpZ24gPSAhdDMtPnNpZ247CisJICAgIG1waV9zZXQodjMsIHQzKTsKKwkgICAgdDMtPnNpZ24gPSBzaWduOworCX0KKwltcGlfc3ViKHQxLCB1MSwgdjEpOworCW1waV9zdWIodDIsIHUyLCB2Mik7CisJbXBpX3N1Yih0MywgdTMsIHYzKTsKKwlpZiggdDEtPnNpZ24gKSB7CisJICAgIG1waV9hZGQodDEsIHQxLCB2KTsKKwkgICAgbXBpX3N1Yih0MiwgdDIsIHUpOworCX0KKyAgICB9IHdoaWxlKCBtcGlfY21wX3VpKCB0MywgMCApICk7IC8qIHdoaWxlIHQzICE9IDAgKi8KKyAgICAvKiBtcGlfbHNoaWZ0KCB1MywgayApOyAqLworICAgIG1waV9zZXQoeCwgdTEpOworCisgICAgbXBpX2ZyZWUodTEpOworICAgIG1waV9mcmVlKHUyKTsKKyAgICBtcGlfZnJlZSh1Myk7CisgICAgbXBpX2ZyZWUodjEpOworICAgIG1waV9mcmVlKHYyKTsKKyAgICBtcGlfZnJlZSh2Myk7CisgICAgbXBpX2ZyZWUodDEpOworICAgIG1waV9mcmVlKHQyKTsKKyAgICBtcGlfZnJlZSh0Myk7CisjZWxzZQorICAgIC8qIEV4dGVuZGVkIEV1Y2xpZCdzIGFsZ29yaXRobSAoU2VlIFRBT0NQIFZvbCBJSSwgNC41LjIsIEFsZyBYKQorICAgICAqIG1vZGlmaWVkIGFjY29yZGluZyB0byBNaWNoYWVsIFBlbmsncyBzb2x1dGlvbiBmb3IgRXhlcmNpc2UgMzUKKyAgICAgKiB3aXRoIGZ1cnRoZXIgZW5oYW5jZW1lbnQgKi8KKyAgICBnY3J5X21waV90IHUsIHYsIHUxLCB1Mj1OVUxMLCB1MywgdjEsIHYyPU5VTEwsIHYzLCB0MSwgdDI9TlVMTCwgdDM7CisgICAgdW5zaWduZWQgazsKKyAgICBpbnQgc2lnbjsKKyAgICBpbnQgb2RkIDsKKworICAgIHUgPSBtcGlfY29weShhKTsKKyAgICB2ID0gbXBpX2NvcHkobik7CisKKyAgICBmb3Ioaz0wOyAhbXBpX3Rlc3RfYml0KHUsMCkgJiYgIW1waV90ZXN0X2JpdCh2LDApOyBrKysgKSB7CisJbXBpX3JzaGlmdCh1LCB1LCAxKTsKKwltcGlfcnNoaWZ0KHYsIHYsIDEpOworICAgIH0KKyAgICBvZGQgPSBtcGlfdGVzdF9iaXQodiwwKTsKKworICAgIHUxID0gbXBpX2FsbG9jX3NldF91aSgxKTsKKyAgICBpZiggIW9kZCApCisJdTIgPSBtcGlfYWxsb2Nfc2V0X3VpKDApOworICAgIHUzID0gbXBpX2NvcHkodSk7CisgICAgdjEgPSBtcGlfY29weSh2KTsKKyAgICBpZiggIW9kZCApIHsKKwl2MiA9IG1waV9hbGxvYyggbXBpX2dldF9ubGltYnModSkgKTsKKwltcGlfc3ViKCB2MiwgdTEsIHUgKTsgLyogVSBpcyB1c2VkIGFzIGNvbnN0IDEgKi8KKyAgICB9CisgICAgdjMgPSBtcGlfY29weSh2KTsKKyAgICBpZiggbXBpX3Rlc3RfYml0KHUsIDApICkgeyAvKiB1IGlzIG9kZCAqLworCXQxID0gbXBpX2FsbG9jX3NldF91aSgwKTsKKwlpZiggIW9kZCApIHsKKwkgICAgdDIgPSBtcGlfYWxsb2Nfc2V0X3VpKDEpOyB0Mi0+c2lnbiA9IDE7CisJfQorCXQzID0gbXBpX2NvcHkodik7IHQzLT5zaWduID0gIXQzLT5zaWduOworCWdvdG8gWTQ7CisgICAgfQorICAgIGVsc2UgeworCXQxID0gbXBpX2FsbG9jX3NldF91aSgxKTsKKwlpZiggIW9kZCApCisJICAgIHQyID0gbXBpX2FsbG9jX3NldF91aSgwKTsKKwl0MyA9IG1waV9jb3B5KHUpOworICAgIH0KKyAgICBkbyB7CisJZG8geworCSAgICBpZiggIW9kZCApIHsKKwkJaWYoIG1waV90ZXN0X2JpdCh0MSwgMCkgfHwgbXBpX3Rlc3RfYml0KHQyLCAwKSApIHsgLyogb25lIGlzIG9kZCAqLworCQkgICAgbXBpX2FkZCh0MSwgdDEsIHYpOworCQkgICAgbXBpX3N1Yih0MiwgdDIsIHUpOworCQl9CisJCW1waV9yc2hpZnQodDEsIHQxLCAxKTsKKwkJbXBpX3JzaGlmdCh0MiwgdDIsIDEpOworCQltcGlfcnNoaWZ0KHQzLCB0MywgMSk7CisJICAgIH0KKwkgICAgZWxzZSB7CisJCWlmKCBtcGlfdGVzdF9iaXQodDEsIDApICkKKwkJICAgIG1waV9hZGQodDEsIHQxLCB2KTsKKwkJbXBpX3JzaGlmdCh0MSwgdDEsIDEpOworCQltcGlfcnNoaWZ0KHQzLCB0MywgMSk7CisJICAgIH0KKwkgIFk0OgorCSAgICA7CisJfSB3aGlsZSggIW1waV90ZXN0X2JpdCggdDMsIDAgKSApOyAvKiB3aGlsZSB0MyBpcyBldmVuICovCisKKwlpZiggIXQzLT5zaWduICkgeworCSAgICBtcGlfc2V0KHUxLCB0MSk7CisJICAgIGlmKCAhb2RkICkKKwkJbXBpX3NldCh1MiwgdDIpOworCSAgICBtcGlfc2V0KHUzLCB0Myk7CisJfQorCWVsc2UgeworCSAgICBtcGlfc3ViKHYxLCB2LCB0MSk7CisJICAgIHNpZ24gPSB1LT5zaWduOyB1LT5zaWduID0gIXUtPnNpZ247CisJICAgIGlmKCAhb2RkICkKKwkJbXBpX3N1Yih2MiwgdSwgdDIpOworCSAgICB1LT5zaWduID0gc2lnbjsKKwkgICAgc2lnbiA9IHQzLT5zaWduOyB0My0+c2lnbiA9ICF0My0+c2lnbjsKKwkgICAgbXBpX3NldCh2MywgdDMpOworCSAgICB0My0+c2lnbiA9IHNpZ247CisJfQorCW1waV9zdWIodDEsIHUxLCB2MSk7CisJaWYoICFvZGQgKQorCSAgICBtcGlfc3ViKHQyLCB1MiwgdjIpOworCW1waV9zdWIodDMsIHUzLCB2Myk7CisJaWYoIHQxLT5zaWduICkgeworCSAgICBtcGlfYWRkKHQxLCB0MSwgdik7CisJICAgIGlmKCAhb2RkICkKKwkJbXBpX3N1Yih0MiwgdDIsIHUpOworCX0KKyAgICB9IHdoaWxlKCBtcGlfY21wX3VpKCB0MywgMCApICk7IC8qIHdoaWxlIHQzICE9IDAgKi8KKyAgICAvKiBtcGlfbHNoaWZ0KCB1MywgayApOyAqLworICAgIG1waV9zZXQoeCwgdTEpOworCisgICAgbXBpX2ZyZWUodTEpOworICAgIG1waV9mcmVlKHYxKTsKKyAgICBtcGlfZnJlZSh0MSk7CisgICAgaWYoICFvZGQgKSB7CisJbXBpX2ZyZWUodTIpOworCW1waV9mcmVlKHYyKTsKKwltcGlfZnJlZSh0Mik7CisgICAgfQorICAgIG1waV9mcmVlKHUzKTsKKyAgICBtcGlfZnJlZSh2Myk7CisgICAgbXBpX2ZyZWUodDMpOworCisgICAgbXBpX2ZyZWUodSk7CisgICAgbXBpX2ZyZWUodik7CisjZW5kaWYKKyAgICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvbXBpLW1vZC5jIGIvbGliZ2NyeXB0LTEuNC42L21waS9tcGktbW9kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ4YmYyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvbXBpLW1vZC5jCkBAIC0wLDAgKzEsMTg1IEBACisvKiBtcGktbW9kLmMgLSAgTW9kdWxhciByZWR1Y3Rpb24KKyAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMSwgMjAwMiwgMjAwMywKKyAgICAgICAgICAgICAgICAgMjAwNyAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAgCisgICBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICAKKyAgIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICAKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKKyAgIFVTQS4gICovCisKKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJtcGktaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorI2luY2x1ZGUgImcxMGxpYi5oIgorCisKKy8qIENvbnRleHQgdXNlZCB3aXRoIEJhcnJldHQgcmVkdWN0aW9uLiAgKi8KK3N0cnVjdCBiYXJyZXR0X2N0eF9zCit7CisgIGdjcnlfbXBpX3QgbTsgICAvKiBUaGUgbW9kdWx1cyAtIG1heSBub3QgYmUgbW9kaWZpZWQuICovCisgIGludCBtX2NvcGllZDsgICAvKiBJZiB0cnVlLCBNIG5lZWRzIHRvIGJlIHJlbGVhc2VkLiAgKi8KKyAgaW50IGs7CisgIGdjcnlfbXBpX3QgeTsgCisgIGdjcnlfbXBpX3QgcjE7ICAvKiBIZWxwZXIgTVBJLiAqLworICBnY3J5X21waV90IHIyOyAgLyogSGVscGVyIE1QSS4gKi8KKyAgZ2NyeV9tcGlfdCByMzsgIC8qIEhlbHBlciBNUEkgYWxsb2NhdGVkIG9uIGRlbWFuZC4gKi8KK307CisKKworCit2b2lkCitfZ2NyeV9tcGlfbW9kIChnY3J5X21waV90IHJlbSwgZ2NyeV9tcGlfdCBkaXZpZGVuZCwgZ2NyeV9tcGlfdCBkaXZpc29yKQoreworICBfZ2NyeV9tcGlfZmRpdl9yIChyZW0sIGRpdmlkZW5kLCBkaXZpc29yKTsKKyAgcmVtLT5zaWduID0gMDsKK30KKworCisvKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBuZXcgY29udGV4dCBmb3IgQmFycmV0dCBiYXNlZCBvcGVyYXRpb25zIG9uCisgICB0aGUgbW9kdWx1cyBNLiAgVGhpcyBjb250ZXh0IG5lZWRzIHRvIGJlIHJlbGVhc2VkIHVzaW5nCisgICBfZ2NyeV9tcGlfYmFycmV0dF9mcmVlLiAgSWYgQ09QWSBpcyB0cnVlIE0gd2lsbCBiZSB0cmFuc2ZlcnJlZCB0bworICAgdGhlIGNvbnRleHQgYW5kIHRoZSB1c2VyIG1heSBjaGFuZ2UgTS4gIElmIENPUFkgaXMgZmFsc2UsIE0gbWF5IG5vdAorICAgYmUgY2hhbmdlZCB1bnRpbCBnY3J5X21waV9iYXJyZXR0X2ZyZWUgaGFzIGJlZW4gY2FsbGVkLiAqLworbXBpX2JhcnJldHRfdCAKK19nY3J5X21waV9iYXJyZXR0X2luaXQgKGdjcnlfbXBpX3QgbSwgaW50IGNvcHkpCit7CisgIG1waV9iYXJyZXR0X3QgY3R4OworICBnY3J5X21waV90IHRtcDsKKworICBtcGlfbm9ybWFsaXplIChtKTsKKyAgY3R4ID0gZ2NyeV94Y2FsbG9jICgxLCBzaXplb2YgKmN0eCk7CisKKyAgaWYgKGNvcHkpCisgICAgeworICAgICAgY3R4LT5tID0gbXBpX2NvcHkgKG0pOworICAgICAgY3R4LT5tX2NvcGllZCA9IDE7CisgICAgfQorICBlbHNlCisgICAgY3R4LT5tID0gbTsKKworICBjdHgtPmsgPSBtcGlfZ2V0X25saW1icyAobSk7CisgIHRtcCA9IG1waV9hbGxvYyAoY3R4LT5rICsgMSk7CisKKyAgLyogQmFycmV0dCBwcmVjYWxjdWxhdGlvbjogeSA9IGZsb29yKGJeKDJrKSAvIG0pLiAqLworICBtcGlfc2V0X3VpICh0bXAsIDEpOworICBtcGlfbHNoaWZ0X2xpbWJzICh0bXAsIDIgKiBjdHgtPmspOworICBtcGlfZmRpdl9xICh0bXAsIHRtcCwgbSk7CisKKyAgY3R4LT55ICA9IHRtcDsKKyAgY3R4LT5yMSA9IG1waV9hbGxvYyAoIDIgKiBjdHgtPmsgKyAxICk7CisgIGN0eC0+cjIgPSBtcGlfYWxsb2MgKCAyICogY3R4LT5rICsgMSApOworCisgIHJldHVybiBjdHg7Cit9CisKK3ZvaWQKK19nY3J5X21waV9iYXJyZXR0X2ZyZWUgKG1waV9iYXJyZXR0X3QgY3R4KQoreworICBpZiAoY3R4KQorICAgIHsKKyAgICAgIG1waV9mcmVlIChjdHgtPnkpOworICAgICAgbXBpX2ZyZWUgKGN0eC0+cjEpOworICAgICAgbXBpX2ZyZWUgKGN0eC0+cjIpOworICAgICAgaWYgKGN0eC0+cjMpCisgICAgICAgIG1waV9mcmVlIChjdHgtPnIzKTsKKyAgICAgIGlmIChjdHgtPm1fY29waWVkKQorICAgICAgICBtcGlfZnJlZSAoY3R4LT5tKTsKKyAgICAgIGdjcnlfZnJlZSAoY3R4KTsKKyAgICB9Cit9CisKKworLyogUiA9IFggbW9kIE0KKworICAgVXNpbmcgQmFycmV0dCByZWR1Y3Rpb24uICBCZWZvcmUgdXNpbmcgdGhpcyBmdW5jdGlvbgorICAgX2djcnlfbXBpX2JhcnJldHRfaW5pdCBtdXN0IGhhdmUgYmVlbiBjYWxsZWQgdG8gZG8gdGhlCisgICBwcmVjYWxjdWxhdGlvbnMuICBDVFggaXMgdGhlIGNvbnRleHQgY3JlYXRlZCBieSB0aGlzIHByZWNhbGN1bGF0aW9uCisgICBhbmQgYWxzbyBjb252ZXlzIE0uICBJZiB0aGUgQmFycmV0IHJlZHVjdGlvbiBjb3VsZCBubyBiZSBkb25lIGEKKyAgIHN0YXJpZ2h0Zm9yd2FyZCByZWR1Y3Rpb24gbWV0aG9kIGlzIHVzZWQuCisKKyAgIFdlIGFzc3VtZSB0aGF0IHRoZXNlIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgIElucHV0OiAgeCA9KHhfMmstMSAuLi54XzApX2IKKyAJICAgbSA9KG1fay0xIC4uLi5tXzApX2IJICB3aXRoIG1fay0xICE9IDAKKyAgIE91dHB1dDogciA9IHggbW9kIG0KKyAqLwordm9pZAorX2djcnlfbXBpX21vZF9iYXJyZXR0IChnY3J5X21waV90IHIsIGdjcnlfbXBpX3QgeCwgbXBpX2JhcnJldHRfdCBjdHgpCit7CisgIGdjcnlfbXBpX3QgbSA9IGN0eC0+bTsKKyAgaW50IGsgPSBjdHgtPms7CisgIGdjcnlfbXBpX3QgeSA9IGN0eC0+eTsKKyAgZ2NyeV9tcGlfdCByMSA9IGN0eC0+cjE7CisgIGdjcnlfbXBpX3QgcjIgPSBjdHgtPnIyOworCisgIG1waV9ub3JtYWxpemUgKHgpOworICBpZiAobXBpX2dldF9ubGltYnMgKHgpID4gMiprICkKKyAgICB7CisgICAgICBtcGlfbW9kIChyLCB4LCBtKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogMS4gcTEgPSBmbG9vciggeCAvIGJeay0xKQorICAgKiAgICBxMiA9IHExICogeQorICAgKiAgICBxMyA9IGZsb29yKCBxMiAvIGJeaysxICkKKyAgICogQWN0dWFsbHksIHdlIGRvbid0IG5lZWQgcXgsIHdlIGNhbiB3b3JrIGRpcmVjdCBvbiByMiAKKyAgICovCisgIG1waV9zZXQgKCByMiwgeCApOworICBtcGlfcnNoaWZ0X2xpbWJzICggcjIsIGstMSApOworICBtcGlfbXVsICggcjIsIHIyLCB5ICk7CisgIG1waV9yc2hpZnRfbGltYnMgKCByMiwgaysxICk7CisKKyAgLyogMi4gcjEgPSB4IG1vZCBiXmsrMQorICAgKglyMiA9IHEzICogbSBtb2QgYl5rKzEKKyAgICoJciAgPSByMSAtIHIyCisgICAqIDMuIGlmIHIgPCAwIHRoZW4gIHIgPSByICsgYl5rKzEKKyAgICovCisgIG1waV9zZXQgKCByMSwgeCApOworICBpZiAoIHIxLT5ubGltYnMgPiBrKzEgKSAvKiBRdWljayBtb2R1bG8gb3BlcmF0aW9uLiAgKi8KKyAgICByMS0+bmxpbWJzID0gaysxOworICBtcGlfbXVsICggcjIsIHIyLCBtICk7CisgIGlmICggcjItPm5saW1icyA+IGsrMSApIC8qIFF1aWNrIG1vZHVsbyBvcGVyYXRpb24uICovCisgICAgcjItPm5saW1icyA9IGsrMTsKKyAgbXBpX3N1YiAoIHIsIHIxLCByMiApOworCisgIGlmICggbXBpX2lzX25lZyggciApICkKKyAgICB7CisgICAgICBpZiAoIWN0eC0+cjMpCisgICAgICAgIHsKKyAgICAgICAgICBjdHgtPnIzID0gbXBpX2FsbG9jICggayArIDIgKTsKKyAgICAgICAgICBtcGlfc2V0X3VpIChjdHgtPnIzLCAxKTsKKyAgICAgICAgICBtcGlfbHNoaWZ0X2xpbWJzIChjdHgtPnIzLCBrICsgMSApOworICAgICAgICB9CisgICAgICBtcGlfYWRkICggciwgciwgY3R4LT5yMyApOworICAgIH0KKyAgCisgIC8qIDQuIHdoaWxlIHIgPj0gbSBkbyByID0gciAtIG0gKi8KKyAgd2hpbGUgKCBtcGlfY21wKCByLCBtICkgPj0gMCApCisgICAgbXBpX3N1YiAoIHIsIHIsIG0gKTsKKworfQorCisKK3ZvaWQKK19nY3J5X21waV9tdWxfYmFycmV0dCAoZ2NyeV9tcGlfdCB3LCBnY3J5X21waV90IHUsIGdjcnlfbXBpX3QgdiwKKyAgICAgICAgICAgICAgICAgICAgICAgbXBpX2JhcnJldHRfdCBjdHgpCit7CisgIGdjcnlfbXBpX211bCAodywgdSwgdik7CisgIG1waV9tb2RfYmFycmV0dCAodywgdywgY3R4KTsKK30KKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9tcGktbXBvdy5jIGIvbGliZ2NyeXB0LTEuNC42L21waS9tcGktbXBvdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMWM1YjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL21waS1tcG93LmMKQEAgLTAsMCArMSwyMjQgQEAKKy8qIG1waS1tcG93LmMgIC0gIE1QSSBmdW5jdGlvbnMKKyAqCUNvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMSwgMjAwMiwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJtcGktaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorI2luY2x1ZGUgImcxMGxpYi5oIgorCisKKy8qIEJhcnJldHQgaXMgc2xvd2VyIHRoYW4gdGhlIGNsYXNzaWNhbCB3YXkuICBJdCBjYW4gYmUgdHdlYWtlZCBieQorICogdXNpbmcgcGFydGlhbCBtdWx0aXBsaWNhdGlvbnMKKyAqLworLyojZGVmaW5lIFVTRV9CQVJSRVRUKi8KKworCisKKyNpZmRlZiBVU0VfQkFSUkVUVAorc3RhdGljIHZvaWQgYmFycmV0dF9tdWxtKCBnY3J5X21waV90IHcsIGdjcnlfbXBpX3QgdSwgZ2NyeV9tcGlfdCB2LCBnY3J5X21waV90IG0sIGdjcnlfbXBpX3QgeSwgaW50IGssIGdjcnlfbXBpX3QgcjEsIGdjcnlfbXBpX3QgcjIgKTsKK3N0YXRpYyBnY3J5X21waV90IGluaXRfYmFycmV0dCggZ2NyeV9tcGlfdCBtLCBpbnQgKmssIGdjcnlfbXBpX3QgKnIxLCBnY3J5X21waV90ICpyMiApOworc3RhdGljIGludCBjYWxjX2JhcnJldHQoIGdjcnlfbXBpX3QgciwgZ2NyeV9tcGlfdCB4LCBnY3J5X21waV90IG0sIGdjcnlfbXBpX3QgeSwgaW50IGssIGdjcnlfbXBpX3QgcjEsIGdjcnlfbXBpX3QgcjIgICk7CisjZWxzZQorI2RlZmluZSBiYXJyZXR0X211bG0oIHcsIHUsIHYsIG0sIHksIGssIHIxLCByMiApIGdjcnlfbXBpX211bG0oICh3KSwgKHUpLCAodiksIChtKSApCisjZW5kaWYKKworCitzdGF0aWMgaW50CitidWlsZF9pbmRleCggZ2NyeV9tcGlfdCAqZXhwYXJyYXksIGludCBrLCBpbnQgaSwgaW50IHQgKQoreworICAgIGludCBqLCBiaXRubzsKKyAgICBpbnQgaWR4ID0gMDsKKworICAgIGJpdG5vID0gdC1pOworICAgIGZvcihqPWstMTsgaiA+PSAwOyBqLS0gKSB7CisJaWR4IDw8PSAxOworCWlmKCBtcGlfdGVzdF9iaXQoIGV4cGFycmF5W2pdLCBiaXRubyApICkKKwkgICAgaWR4IHw9IDE7CisgICAgfQorICAgIC8qbG9nX2RlYnVnKCJ0PSVkIGk9JWQgaWR4PSVkXG4iLCB0LCBpLCBpZHggKTsqLworICAgIHJldHVybiBpZHg7Cit9CisKKy8qKioqKioqKioqKioqKioqCisgKiBSRVMgPSAoQkFTRVswXSBeIEVYUFswXSkgKiAgKEJBU0VbMV0gXiBFWFBbMV0pICogLi4uICogbW9kIE0KKyAqLwordm9pZAorX2djcnlfbXBpX211bHBvd20oIGdjcnlfbXBpX3QgcmVzLCBnY3J5X21waV90ICpiYXNlYXJyYXksIGdjcnlfbXBpX3QgKmV4cGFycmF5LCBnY3J5X21waV90IG0pCit7CisgICAgaW50IGs7CS8qIG51bWJlciBvZiBlbGVtZW50cyAqLworICAgIGludCB0OwkvKiBiaXQgc2l6ZSBvZiBsYXJnZXN0IGV4cG9uZW50ICovCisgICAgaW50IGksIGosIGlkeDsKKyAgICBnY3J5X21waV90ICpHOwkvKiB0YWJsZSB3aXRoIHByZWNvbXB1dGVkIHZhbHVlcyBvZiBzaXplIDJeayAqLworICAgIGdjcnlfbXBpX3QgdG1wOworI2lmZGVmIFVTRV9CQVJSRVRUCisgICAgZ2NyeV9tcGlfdCBiYXJyZXR0X3ksIGJhcnJldHRfcjEsIGJhcnJldHRfcjI7CisgICAgaW50IGJhcnJldHRfazsKKyNlbmRpZgorCisgICAgZm9yKGs9MDsgYmFzZWFycmF5W2tdOyBrKysgKQorCTsKKyAgICBnY3J5X2Fzc2VydChrKTsKKyAgICBmb3IodD0wLCBpPTA7ICh0bXA9ZXhwYXJyYXlbaV0pOyBpKysgKSB7CisJLypsb2dfbXBpZHVtcCgiZXhwOiAiLCB0bXAgKTsqLworCWogPSBtcGlfZ2V0X25iaXRzKHRtcCk7CisJaWYoIGogPiB0ICkKKwkgICAgdCA9IGo7CisgICAgfQorICAgIC8qbG9nX21waWR1bXAoIm1vZDogIiwgbSApOyovCisgICAgZ2NyeV9hc3NlcnQgKGk9PWspOworICAgIGdjcnlfYXNzZXJ0ICh0KTsKKyAgICBnY3J5X2Fzc2VydCAoayA8IDEwKTsKKworICAgIEcgPSBnY3J5X3hjYWxsb2MoICgxPDxrKSAsIHNpemVvZiAqRyApOworI2lmZGVmIFVTRV9CQVJSRVRUCisgICAgYmFycmV0dF95ID0gaW5pdF9iYXJyZXR0KCBtLCAmYmFycmV0dF9rLCAmYmFycmV0dF9yMSwgJmJhcnJldHRfcjIgKTsKKyNlbmRpZgorICAgIC8qIGFuZCBjYWxjdWxhdGUgKi8KKyAgICB0bXAgPSAgbXBpX2FsbG9jKCBtcGlfZ2V0X25saW1icyhtKSsxICk7CisgICAgbXBpX3NldF91aSggcmVzLCAxICk7CisgICAgZm9yKGkgPSAxOyBpIDw9IHQ7IGkrKyApIHsKKwliYXJyZXR0X211bG0odG1wLCByZXMsIHJlcywgbSwgYmFycmV0dF95LCBiYXJyZXR0X2ssCisJCQkJICAgICAgIGJhcnJldHRfcjEsIGJhcnJldHRfcjIgKTsKKwlpZHggPSBidWlsZF9pbmRleCggZXhwYXJyYXksIGssIGksIHQgKTsKKwlnY3J5X2Fzc2VydCAoaWR4ID49IDAgJiYgaWR4IDwgKDE8PGspKTsKKwlpZiggIUdbaWR4XSApIHsKKwkgICAgaWYoICFpZHggKQorCQkgR1swXSA9IG1waV9hbGxvY19zZXRfdWkoIDEgKTsKKwkgICAgZWxzZSB7CisJCWZvcihqPTA7IGogPCBrOyBqKysgKSB7CisJCSAgICBpZiggKGlkeCAmICgxPDxqKSApICkgeworCQkJaWYoICFHW2lkeF0gKQorCQkJICAgIEdbaWR4XSA9IG1waV9jb3B5KCBiYXNlYXJyYXlbal0gKTsKKwkJCWVsc2UKKwkJCSAgICBiYXJyZXR0X211bG0oIEdbaWR4XSwgR1tpZHhdLCBiYXNlYXJyYXlbal0sCisJCQkJCSAgICAgICBtLCBiYXJyZXR0X3ksIGJhcnJldHRfaywgYmFycmV0dF9yMSwgYmFycmV0dF9yMgkpOworCQkgICAgfQorCQl9CisJCWlmKCAhR1tpZHhdICkKKwkJICAgIEdbaWR4XSA9IG1waV9hbGxvYygwKTsKKwkgICAgfQorCX0KKwliYXJyZXR0X211bG0ocmVzLCB0bXAsIEdbaWR4XSwgbSwgYmFycmV0dF95LCBiYXJyZXR0X2ssIGJhcnJldHRfcjEsIGJhcnJldHRfcjIJKTsKKyAgICB9CisKKyAgICAvKiBjbGVhbnVwICovCisgICAgbXBpX2ZyZWUodG1wKTsKKyNpZmRlZiBVU0VfQkFSUkVUVAorICAgIG1waV9mcmVlKGJhcnJldHRfeSk7CisgICAgbXBpX2ZyZWUoYmFycmV0dF9yMSk7CisgICAgbXBpX2ZyZWUoYmFycmV0dF9yMik7CisjZW5kaWYKKyAgICBmb3IoaT0wOyBpIDwgKDE8PGspOyBpKysgKQorCW1waV9mcmVlKEdbaV0pOworICAgIGdjcnlfZnJlZShHKTsKK30KKworCisKKyNpZmRlZiBVU0VfQkFSUkVUVAorc3RhdGljIHZvaWQKK2JhcnJldHRfbXVsbSggZ2NyeV9tcGlfdCB3LCBnY3J5X21waV90IHUsIGdjcnlfbXBpX3QgdiwgZ2NyeV9tcGlfdCBtLCBnY3J5X21waV90IHksIGludCBrLCBnY3J5X21waV90IHIxLCBnY3J5X21waV90IHIyCSkKK3sKKyAgICBtcGlfbXVsKHcsIHUsIHYpOworICAgIGlmKCBjYWxjX2JhcnJldHQoIHcsIHcsIG0sIHksIGssIHIxLCByMiApICkKKwltcGlfZmRpdl9yKCB3LCB3LCBtICk7Cit9CisKKy8qKioqKioqKioqKioqKioqCisgKiBCYXJyZXR0IHByZWNhbGN1bGF0aW9uOiB5ID0gZmxvb3IoYl4oMmspIC8gbSkKKyAqLworc3RhdGljIGdjcnlfbXBpX3QKK2luaXRfYmFycmV0dCggZ2NyeV9tcGlfdCBtLCBpbnQgKmssIGdjcnlfbXBpX3QgKnIxLCBnY3J5X21waV90ICpyMiApCit7CisgICAgZ2NyeV9tcGlfdCB0bXA7CisKKyAgICBtcGlfbm9ybWFsaXplKCBtICk7CisgICAgKmsgPSBtcGlfZ2V0X25saW1icyggbSApOworICAgIHRtcCA9IG1waV9hbGxvYyggKmsgKyAxICk7CisgICAgbXBpX3NldF91aSggdG1wLCAxICk7CisgICAgbXBpX2xzaGlmdF9saW1icyggdG1wLCAyICogKmsgKTsKKyAgICBtcGlfZmRpdl9xKCB0bXAsIHRtcCwgbSApOworICAgICpyMSA9IG1waV9hbGxvYyggMiogKmsgKyAxICk7CisgICAgKnIyID0gbXBpX2FsbG9jKCAyKiAqayArIDEgKTsKKyAgICByZXR1cm4gdG1wOworfQorCisvKioqKioqKioqKioqKioqKgorICogQmFycmV0dCByZWR1Y3Rpb246IFdlIGFzc3VtZSB0aGF0IHRoZXNlIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqIEdpdmVuIHggPSh4XzJrLTEgLi4ueF8wKV9iCisgKgkgbSA9KG1fay0xIC4uLi5tXzApX2IJICB3aXRoIG1fay0xICE9IDAKKyAqIE91dHB1dCByID0geCBtb2QgbQorICogQmVmb3JlIHVzaW5nIHRoaXMgZnVuY3Rpb24gaW5pdF9iYXJyZXQgbXVzdCBiZSB1c2VkIHRvIGNhbHVjYWx0ZSB5IGFuZCBrLgorICogUmV0dXJuczogZmFsc2UgPSBubyBlcnJvcgorICoJICAgIHRydWUgPSBjYW4ndCBwZXJmb3JtIGJhcnJldCByZWR1Y3Rpb24KKyAqLworc3RhdGljIGludAorY2FsY19iYXJyZXR0KCBnY3J5X21waV90IHIsIGdjcnlfbXBpX3QgeCwgZ2NyeV9tcGlfdCBtLCBnY3J5X21waV90IHksIGludCBrLCBnY3J5X21waV90IHIxLCBnY3J5X21waV90IHIyICkKK3sKKyAgICBpbnQgeHggPSBrID4gMyA/IGstMzowOworCisgICAgbXBpX25vcm1hbGl6ZSggeCApOworICAgIGlmKCBtcGlfZ2V0X25saW1icyh4KSA+IDIqayApCisJcmV0dXJuIDE7IC8qIGNhbid0IGRvIGl0ICovCisKKyAgICAvKiAxLiBxMSA9IGZsb29yKCB4IC8gYl5rLTEpCisgICAgICoJICBxMiA9IHExICogeQorICAgICAqCSAgcTMgPSBmbG9vciggcTIgLyBiXmsrMSApCisgICAgICogQWN0dWFsbHksIHdlIGRvbid0IG5lZWQgcXgsIHdlIGNhbiB3b3JrIGRpcmVjdCBvbiByMgorICAgICAqLworICAgIG1waV9zZXQoIHIyLCB4ICk7CisgICAgbXBpX3JzaGlmdF9saW1icyggcjIsIGstMSApOworICAgIG1waV9tdWwoIHIyLCByMiwgeSApOworICAgIG1waV9yc2hpZnRfbGltYnMoIHIyLCBrKzEgKTsKKworICAgIC8qIDIuIHIxID0geCBtb2QgYl5rKzEKKyAgICAgKgkgIHIyID0gcTMgKiBtIG1vZCBiXmsrMQorICAgICAqCSAgciAgPSByMSAtIHIyCisgICAgICogMy4gaWYgciA8IDAgdGhlbiAgciA9IHIgKyBiXmsrMQorICAgICAqLworICAgIG1waV9zZXQoIHIxLCB4ICk7CisgICAgaWYoIHIxLT5ubGltYnMgPiBrKzEgKSAvKiBxdWljayBtb2R1bG8gb3BlcmF0aW9uICovCisJcjEtPm5saW1icyA9IGsrMTsKKyAgICBtcGlfbXVsKCByMiwgcjIsIG0gKTsKKyAgICBpZiggcjItPm5saW1icyA+IGsrMSApIC8qIHF1aWNrIG1vZHVsbyBvcGVyYXRpb24gKi8KKwlyMi0+bmxpbWJzID0gaysxOworICAgIG1waV9zdWIoIHIsIHIxLCByMiApOworCisgICAgaWYoIG1waV9pc19uZWcoIHIgKSApIHsKKwlnY3J5X21waV90IHRtcDsKKworCXRtcCA9IG1waV9hbGxvYyggayArIDIgKTsKKwltcGlfc2V0X3VpKCB0bXAsIDEgKTsKKwltcGlfbHNoaWZ0X2xpbWJzKCB0bXAsIGsrMSApOworCW1waV9hZGQoIHIsIHIsIHRtcCApOworCW1waV9mcmVlKHRtcCk7CisgICAgfQorCisgICAgLyogNC4gd2hpbGUgciA+PSBtIGRvIHIgPSByIC0gbSAqLworICAgIHdoaWxlKCBtcGlfY21wKCByLCBtICkgPj0gMCApCisJbXBpX3N1YiggciwgciwgbSApOworCisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogVVNFX0JBUlJFVFQgKi8KKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9tcGktbXVsLmMgYi9saWJnY3J5cHQtMS40LjYvbXBpL21waS1tdWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWFlYWEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9tcGktbXVsLmMKQEAgLTAsMCArMSwyMTMgQEAKKy8qIG1waS1tdWwuYyAgLSAgTVBJIGZ1bmN0aW9ucworICogQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk2LCAxOTk4LCAyMDAxLCAyMDAyLCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqCisgKiBOb3RlOiBUaGlzIGNvZGUgaXMgaGVhdmlseSBiYXNlZCBvbiB0aGUgR05VIE1QIExpYnJhcnkuCisgKgkgQWN0dWFsbHkgaXQncyB0aGUgc2FtZSBjb2RlIHdpdGggb25seSBtaW5vciBjaGFuZ2VzIGluIHRoZQorICoJIHdheSB0aGUgZGF0YSBpcyBzdG9yZWQ7IHRoaXMgaXMgdG8gc3VwcG9ydCB0aGUgYWJzdHJhY3Rpb24KKyAqCSBvZiBhbiBvcHRpb25hbCBzZWN1cmUgbWVtb3J5IGFsbG9jYXRpb24gd2hpY2ggbWF5IGJlIHVzZWQKKyAqCSB0byBhdm9pZCByZXZlYWxpbmcgb2Ygc2Vuc2l0aXZlIGRhdGEgZHVlIHRvIHBhZ2luZyBldGMuCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAibXBpLWludGVybmFsLmgiCisKKwordm9pZAorZ2NyeV9tcGlfbXVsX3VpKCBnY3J5X21waV90IHByb2QsIGdjcnlfbXBpX3QgbXVsdCwgdW5zaWduZWQgbG9uZyBzbWFsbF9tdWx0ICkKK3sKKyAgICBtcGlfc2l6ZV90IHNpemUsIHByb2Rfc2l6ZTsKKyAgICBtcGlfcHRyX3QgIHByb2RfcHRyOworICAgIG1waV9saW1iX3QgY3k7CisgICAgaW50IHNpZ247CisKKyAgICBzaXplID0gbXVsdC0+bmxpbWJzOworICAgIHNpZ24gPSBtdWx0LT5zaWduOworCisgICAgaWYoICFzaXplIHx8ICFzbWFsbF9tdWx0ICkgeworCXByb2QtPm5saW1icyA9IDA7CisJcHJvZC0+c2lnbiA9IDA7CisJcmV0dXJuOworICAgIH0KKworICAgIHByb2Rfc2l6ZSA9IHNpemUgKyAxOworICAgIGlmKCBwcm9kLT5hbGxvY2VkIDwgcHJvZF9zaXplICkKKwltcGlfcmVzaXplKCBwcm9kLCBwcm9kX3NpemUgKTsKKyAgICBwcm9kX3B0ciA9IHByb2QtPmQ7CisKKyAgICBjeSA9IF9nY3J5X21waWhfbXVsXzEoIHByb2RfcHRyLCBtdWx0LT5kLCBzaXplLCAobXBpX2xpbWJfdClzbWFsbF9tdWx0ICk7CisgICAgaWYoIGN5ICkKKwlwcm9kX3B0cltzaXplKytdID0gY3k7CisgICAgcHJvZC0+bmxpbWJzID0gc2l6ZTsKKyAgICBwcm9kLT5zaWduID0gc2lnbjsKK30KKworCit2b2lkCitnY3J5X21waV9tdWxfMmV4cCggZ2NyeV9tcGlfdCB3LCBnY3J5X21waV90IHUsIHVuc2lnbmVkIGxvbmcgY250KQoreworICAgIG1waV9zaXplX3QgdXNpemUsIHdzaXplLCBsaW1iX2NudDsKKyAgICBtcGlfcHRyX3Qgd3A7CisgICAgbXBpX2xpbWJfdCB3bGltYjsKKyAgICBpbnQgdXNpZ24sIHdzaWduOworCisgICAgdXNpemUgPSB1LT5ubGltYnM7CisgICAgdXNpZ24gPSB1LT5zaWduOworCisgICAgaWYoICF1c2l6ZSApIHsKKwl3LT5ubGltYnMgPSAwOworCXctPnNpZ24gPSAwOworCXJldHVybjsKKyAgICB9CisKKyAgICBsaW1iX2NudCA9IGNudCAvIEJJVFNfUEVSX01QSV9MSU1COworICAgIHdzaXplID0gdXNpemUgKyBsaW1iX2NudCArIDE7CisgICAgaWYoIHctPmFsbG9jZWQgPCB3c2l6ZSApCisJbXBpX3Jlc2l6ZSh3LCB3c2l6ZSApOworICAgIHdwID0gdy0+ZDsKKyAgICB3c2l6ZSA9IHVzaXplICsgbGltYl9jbnQ7CisgICAgd3NpZ24gPSB1c2lnbjsKKworICAgIGNudCAlPSBCSVRTX1BFUl9NUElfTElNQjsKKyAgICBpZiggY250ICkgeworCXdsaW1iID0gX2djcnlfbXBpaF9sc2hpZnQoIHdwICsgbGltYl9jbnQsIHUtPmQsIHVzaXplLCBjbnQgKTsKKwlpZiggd2xpbWIgKSB7CisJICAgIHdwW3dzaXplXSA9IHdsaW1iOworCSAgICB3c2l6ZSsrOworCX0KKyAgICB9CisgICAgZWxzZSB7CisJTVBOX0NPUFlfREVDUiggd3AgKyBsaW1iX2NudCwgdS0+ZCwgdXNpemUgKTsKKyAgICB9CisKKyAgICAvKiBaZXJvIGFsbCB3aG9sZSBsaW1icyBhdCBsb3cgZW5kLiAgRG8gaXQgaGVyZSBhbmQgbm90IGJlZm9yZSBjYWxsaW5nCisgICAgICogbXBuX2xzaGlmdCwgbm90IHRvIGxvc2UgZm9yIFUgPT0gVy4gICovCisgICAgTVBOX1pFUk8oIHdwLCBsaW1iX2NudCApOworCisgICAgdy0+bmxpbWJzID0gd3NpemU7CisgICAgdy0+c2lnbiA9IHdzaWduOworfQorCisKK3ZvaWQKK2djcnlfbXBpX211bCggZ2NyeV9tcGlfdCB3LCBnY3J5X21waV90IHUsIGdjcnlfbXBpX3QgdikKK3sKKyAgICBtcGlfc2l6ZV90IHVzaXplLCB2c2l6ZSwgd3NpemU7CisgICAgbXBpX3B0cl90IHVwLCB2cCwgd3A7CisgICAgbXBpX2xpbWJfdCBjeTsKKyAgICBpbnQgdXNpZ24sIHZzaWduLCB1c2VjdXJlLCB2c2VjdXJlLCBzaWduX3Byb2R1Y3Q7CisgICAgaW50IGFzc2lnbl93cD0wOworICAgIG1waV9wdHJfdCB0bXBfbGltYj1OVUxMOworICAgIHVuc2lnbmVkIGludCB0bXBfbGltYl9ubGltYnMgPSAwOworCisgICAgaWYoIHUtPm5saW1icyA8IHYtPm5saW1icyApIHsgLyogU3dhcCBVIGFuZCBWLiAqLworCXVzaXplID0gdi0+bmxpbWJzOworCXVzaWduID0gdi0+c2lnbjsKKwl1c2VjdXJlID0gbXBpX2lzX3NlY3VyZSh2KTsKKwl1cCAgICA9IHYtPmQ7CisJdnNpemUgPSB1LT5ubGltYnM7CisJdnNpZ24gPSB1LT5zaWduOworCXZzZWN1cmUgPSBtcGlfaXNfc2VjdXJlKHUpOworCXZwICAgID0gdS0+ZDsKKyAgICB9CisgICAgZWxzZSB7CisJdXNpemUgPSB1LT5ubGltYnM7CisJdXNpZ24gPSB1LT5zaWduOworCXVzZWN1cmUgPSBtcGlfaXNfc2VjdXJlKHUpOworCXVwICAgID0gdS0+ZDsKKwl2c2l6ZSA9IHYtPm5saW1iczsKKwl2c2lnbiA9IHYtPnNpZ247CisJdnNlY3VyZSA9IG1waV9pc19zZWN1cmUodik7CisJdnAgICAgPSB2LT5kOworICAgIH0KKyAgICBzaWduX3Byb2R1Y3QgPSB1c2lnbiBeIHZzaWduOworICAgIHdwID0gdy0+ZDsKKworICAgIC8qIEVuc3VyZSBXIGhhcyBzcGFjZSBlbm91Z2ggdG8gc3RvcmUgdGhlIHJlc3VsdC4gICovCisgICAgd3NpemUgPSB1c2l6ZSArIHZzaXplOworICAgIGlmICggIW1waV9pc19zZWN1cmUgKHcpICYmIChtcGlfaXNfc2VjdXJlICh1KSB8fCBtcGlfaXNfc2VjdXJlICh2KSkgKSB7CisgICAgICAgIC8qIHcgaXMgbm90IGFsbG9jYXRlZCBpbiBzZWN1cmUgc3BhY2UgYnV0IHUgb3IgdiBpcy4gIFRvIG1ha2Ugc3VyZQorICAgICAgICAgKiB0aGF0IG5vIHRlbXBvcnJheSByZXN1bHRzIGFyZSBzdG9yZWQgaW4gdywgd2UgdGVtcG9yYXJ5IHVzZSAKKyAgICAgICAgICogYSBuZXdseSBhbGxvY2F0ZWQgbGltYiBzcGFjZSBmb3IgdyAqLworICAgICAgICB3cCA9IG1waV9hbGxvY19saW1iX3NwYWNlKCB3c2l6ZSwgMSApOworICAgICAgICBhc3NpZ25fd3AgPSAyOyAvKiBtYXJrIGl0IGFzIDIgc28gdGhhdCB3ZSBjYW4gbGF0ZXIgY29weSBpdCBiYWNrIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAqIG1vcm1hbCBtZW1vcnkgKi8KKyAgICB9CisgICAgZWxzZSBpZiggdy0+YWxsb2NlZCA8IHdzaXplICkgeworCWlmKCB3cCA9PSB1cCB8fCB3cCA9PSB2cCApIHsKKwkgICAgd3AgPSBtcGlfYWxsb2NfbGltYl9zcGFjZSggd3NpemUsIG1waV9pc19zZWN1cmUodykgKTsKKwkgICAgYXNzaWduX3dwID0gMTsKKwl9CisJZWxzZSB7CisJICAgIG1waV9yZXNpemUodywgd3NpemUgKTsKKwkgICAgd3AgPSB3LT5kOworCX0KKyAgICB9CisgICAgZWxzZSB7IC8qIE1ha2UgVSBhbmQgViBub3Qgb3ZlcmxhcCB3aXRoIFcuCSovCisJaWYoIHdwID09IHVwICkgeworCSAgICAvKiBXIGFuZCBVIGFyZSBpZGVudGljYWwuICBBbGxvY2F0ZSB0ZW1wb3Jhcnkgc3BhY2UgZm9yIFUuCSovCisgICAgICAgICAgICB0bXBfbGltYl9ubGltYnMgPSB1c2l6ZTsKKwkgICAgdXAgPSB0bXBfbGltYiA9IG1waV9hbGxvY19saW1iX3NwYWNlKCB1c2l6ZSwgdXNlY3VyZSAgKTsKKwkgICAgLyogSXMgViBpZGVudGljYWwgdG9vPyAgS2VlcCBpdCBpZGVudGljYWwgd2l0aCBVLiAgKi8KKwkgICAgaWYoIHdwID09IHZwICkKKwkJdnAgPSB1cDsKKwkgICAgLyogQ29weSB0byB0aGUgdGVtcG9yYXJ5IHNwYWNlLiAgKi8KKwkgICAgTVBOX0NPUFkoIHVwLCB3cCwgdXNpemUgKTsKKwl9CisJZWxzZSBpZiggd3AgPT0gdnAgKSB7CisJICAgIC8qIFcgYW5kIFYgYXJlIGlkZW50aWNhbC4gIEFsbG9jYXRlIHRlbXBvcmFyeSBzcGFjZSBmb3IgVi4JKi8KKyAgICAgICAgICAgIHRtcF9saW1iX25saW1icyA9IHZzaXplOworCSAgICB2cCA9IHRtcF9saW1iID0gbXBpX2FsbG9jX2xpbWJfc3BhY2UoIHZzaXplLCB2c2VjdXJlICk7CisJICAgIC8qIENvcHkgdG8gdGhlIHRlbXBvcmFyeSBzcGFjZS4gICovCisJICAgIE1QTl9DT1BZKCB2cCwgd3AsIHZzaXplICk7CisJfQorICAgIH0KKworICAgIGlmKCAhdnNpemUgKQorCXdzaXplID0gMDsKKyAgICBlbHNlIHsKKwljeSA9IF9nY3J5X21waWhfbXVsKCB3cCwgdXAsIHVzaXplLCB2cCwgdnNpemUgKTsKKwl3c2l6ZSAtPSBjeT8gMDoxOworICAgIH0KKworICAgIGlmKCBhc3NpZ25fd3AgKSB7CisgICAgICAgIGlmIChhc3NpZ25fd3AgPT0gMikgeworICAgICAgICAgICAgLyogY29weSB0aGUgdGVtcCB3cCBmcm9tIHNlY3VyZSBtZW1vcnkgYmFjayB0byBub3JtYWwgbWVtb3J5ICovCisJICAgIG1waV9wdHJfdCB0bXBfd3AgPSBtcGlfYWxsb2NfbGltYl9zcGFjZSAod3NpemUsIDApOworCSAgICBNUE5fQ09QWSAodG1wX3dwLCB3cCwgd3NpemUpOworICAgICAgICAgICAgX2djcnlfbXBpX2ZyZWVfbGltYl9zcGFjZSAod3AsIDApOworICAgICAgICAgICAgd3AgPSB0bXBfd3A7CisgICAgICAgIH0KKwlfZ2NyeV9tcGlfYXNzaWduX2xpbWJfc3BhY2UoIHcsIHdwLCB3c2l6ZSApOworICAgIH0KKyAgICB3LT5ubGltYnMgPSB3c2l6ZTsKKyAgICB3LT5zaWduID0gc2lnbl9wcm9kdWN0OworICAgIGlmKCB0bXBfbGltYiApCisJX2djcnlfbXBpX2ZyZWVfbGltYl9zcGFjZSAodG1wX2xpbWIsIHRtcF9saW1iX25saW1icyk7Cit9CisKKwordm9pZAorZ2NyeV9tcGlfbXVsbSggZ2NyeV9tcGlfdCB3LCBnY3J5X21waV90IHUsIGdjcnlfbXBpX3QgdiwgZ2NyeV9tcGlfdCBtKQoreworICAgIGdjcnlfbXBpX211bCh3LCB1LCB2KTsKKyAgICBfZ2NyeV9tcGlfZmRpdl9yKCB3LCB3LCBtICk7Cit9CisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvbXBpLXBvdy5jIGIvbGliZ2NyeXB0LTEuNC42L21waS9tcGktcG93LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E3ZWFkMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvbXBpLXBvdy5jCkBAIC0wLDAgKzEsMzI2IEBACisvKiBtcGktcG93LmMgIC0gIE1QSSBmdW5jdGlvbnMgZm9yIGV4cG9uZW50aWF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTYsIDE5OTgsIDIwMDAsIDIwMDIKKyAqICAgICAgICAgICAgICAgMjAwMyAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoKKyAqIE5vdGU6IFRoaXMgY29kZSBpcyBoZWF2aWx5IGJhc2VkIG9uIHRoZSBHTlUgTVAgTGlicmFyeS4KKyAqCSBBY3R1YWxseSBpdCdzIHRoZSBzYW1lIGNvZGUgd2l0aCBvbmx5IG1pbm9yIGNoYW5nZXMgaW4gdGhlCisgKgkgd2F5IHRoZSBkYXRhIGlzIHN0b3JlZDsgdGhpcyBpcyB0byBzdXBwb3J0IHRoZSBhYnN0cmFjdGlvbgorICoJIG9mIGFuIG9wdGlvbmFsIHNlY3VyZSBtZW1vcnkgYWxsb2NhdGlvbiB3aGljaCBtYXkgYmUgdXNlZAorICoJIHRvIGF2b2lkIHJldmVhbGluZyBvZiBzZW5zaXRpdmUgZGF0YSBkdWUgdG8gcGFnaW5nIGV0Yy4KKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgIm1waS1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKKworLyoqKioqKioqKioqKioqKioKKyAqIFJFUyA9IEJBU0UgXiBFWFBPIG1vZCBNT0QKKyAqLwordm9pZAorZ2NyeV9tcGlfcG93bSAoZ2NyeV9tcGlfdCByZXMsIAorICAgICAgICAgICAgICAgZ2NyeV9tcGlfdCBiYXNlLCBnY3J5X21waV90IGV4cG8sIGdjcnlfbXBpX3QgbW9kKQoreworICAvKiBQb2ludGVyIHRvIHRoZSBsaW1icyBvZiB0aGUgYXJndW1lbnRzLCB0aGVpciBzaXplIGFuZCBzaWducy4gKi8KKyAgbXBpX3B0cl90ICBycCwgZXAsIG1wLCBicDsKKyAgbXBpX3NpemVfdCBlc2l6ZSwgbXNpemUsIGJzaXplLCByc2l6ZTsKKyAgaW50ICAgICAgICAgICAgICAgbXNpZ24sIGJzaWduLCByc2lnbjsKKyAgLyogRmxhZ3MgdGVsbGluZyB0aGUgc2VjdXJlIGFsbG9jYXRpb24gc3RhdHVzIG9mIHRoZSBhcmd1bWVudHMuICAqLworICBpbnQgICAgICAgIGVzZWMsICBtc2VjLCAgYnNlYywgIHJzZWM7ICAKKyAgLyogU2l6ZSBvZiB0aGUgcmVzdWx0IGluY2x1ZGluZyBzcGFjZSBmb3IgdGVtcG9yYXJ5IHZhbHVlcy4gICovCisgIG1waV9zaXplX3Qgc2l6ZTsKKyAgLyogSGVscGVyLiAgKi8KKyAgaW50IG1vZF9zaGlmdF9jbnQ7CisgIGludCBuZWdhdGl2ZV9yZXN1bHQ7CisgIG1waV9wdHJfdCBtcF9tYXJrZXIgPSBOVUxMOworICBtcGlfcHRyX3QgYnBfbWFya2VyID0gTlVMTDsKKyAgbXBpX3B0cl90IGVwX21hcmtlciA9IE5VTEw7CisgIG1waV9wdHJfdCB4cF9tYXJrZXIgPSBOVUxMOworICB1bnNpZ25lZCBpbnQgbXBfbmxpbWJzID0gMDsKKyAgdW5zaWduZWQgaW50IGJwX25saW1icyA9IDA7CisgIHVuc2lnbmVkIGludCBlcF9ubGltYnMgPSAwOworICB1bnNpZ25lZCBpbnQgeHBfbmxpbWJzID0gMDsKKyAgbXBpX3B0cl90IHRzcGFjZSA9IE5VTEw7CisgIG1waV9zaXplX3QgdHNpemUgPSAwOyAKKworCisgIGVzaXplID0gZXhwby0+bmxpbWJzOworICBtc2l6ZSA9IG1vZC0+bmxpbWJzOworICBzaXplID0gMiAqIG1zaXplOworICBtc2lnbiA9IG1vZC0+c2lnbjsKKyAgCisgIGVzZWMgPSBtcGlfaXNfc2VjdXJlKGV4cG8pOworICBtc2VjID0gbXBpX2lzX3NlY3VyZShtb2QpOworICBic2VjID0gbXBpX2lzX3NlY3VyZShiYXNlKTsKKyAgcnNlYyA9IG1waV9pc19zZWN1cmUocmVzKTsKKworICBycCA9IHJlcy0+ZDsKKyAgZXAgPSBleHBvLT5kOworCisgIGlmICghbXNpemUpCisgICAgbXNpemUgPSAxIC8gbXNpemU7CSAgICAvKiBQcm92b2tlIGEgc2lnbmFsLiAgKi8KKworICBpZiAoIWVzaXplKSAKKyAgICB7CisgICAgICAvKiBFeHBvbmVudCBpcyB6ZXJvLCByZXN1bHQgaXMgMSBtb2QgTU9ELCBpLmUuLCAxIG9yIDAgZGVwZW5kaW5nCisgICAgICAgIG9uIGlmIE1PRCBlcXVhbHMgMS4gICovCisgICAgICBycFswXSA9IDE7CisgICAgICByZXMtPm5saW1icyA9IChtc2l6ZSA9PSAxICYmIG1vZC0+ZFswXSA9PSAxKSA/IDAgOiAxOworICAgICAgcmVzLT5zaWduID0gMDsKKyAgICAgIGdvdG8gbGVhdmU7CisgICAgfQorCisgIC8qIE5vcm1hbGl6ZSBNT0QgKGkuZS4gbWFrZSBpdHMgbW9zdCBzaWduaWZpY2FudCBiaXQgc2V0KSBhcworICAgICByZXF1aXJlZCBieSBtcG5fZGl2cmVtLiAgVGhpcyB3aWxsIG1ha2UgdGhlIGludGVybWVkaWF0ZSB2YWx1ZXMKKyAgICAgaW4gdGhlIGNhbGN1bGF0aW9uIHNsaWdodGx5IGxhcmdlciwgYnV0IHRoZSBjb3JyZWN0IHJlc3VsdCBpcworICAgICBvYnRhaW5lZCBhZnRlciBhIGZpbmFsIHJlZHVjdGlvbiB1c2luZyB0aGUgb3JpZ2luYWwgTU9EIHZhbHVlLiAqLworICBtcF9ubGltYnMgPSBtc2VjPyBtc2l6ZTowOworICBtcCA9IG1wX21hcmtlciA9IG1waV9hbGxvY19saW1iX3NwYWNlKG1zaXplLCBtc2VjKTsKKyAgY291bnRfbGVhZGluZ196ZXJvcyAobW9kX3NoaWZ0X2NudCwgbW9kLT5kW21zaXplLTFdKTsKKyAgaWYgKG1vZF9zaGlmdF9jbnQpCisgICAgX2djcnlfbXBpaF9sc2hpZnQgKG1wLCBtb2QtPmQsIG1zaXplLCBtb2Rfc2hpZnRfY250KTsKKyAgZWxzZQorICAgIE1QTl9DT1BZKCBtcCwgbW9kLT5kLCBtc2l6ZSApOworCisgIGJzaXplID0gYmFzZS0+bmxpbWJzOworICBic2lnbiA9IGJhc2UtPnNpZ247CisgIGlmIChic2l6ZSA+IG1zaXplKSAKKyAgICB7CisgICAgICAvKiBUaGUgYmFzZSBpcyBsYXJnZXIgdGhhbiB0aGUgbW9kdWxlLiAgUmVkdWNlIGl0LgorCisgICAgICAgICBBbGxvY2F0ZSAoQlNJWkUgKyAxKSB3aXRoIHNwYWNlIGZvciByZW1haW5kZXIgYW5kIHF1b3RpZW50LgorICAgICAgICAgKFRoZSBxdW90aWVudCBpcyAoYnNpemUgLSBtc2l6ZSArIDEpIGxpbWJzLikgICovCisgICAgICBicF9ubGltYnMgPSBic2VjID8gKGJzaXplICsgMSk6MDsKKyAgICAgIGJwID0gYnBfbWFya2VyID0gbXBpX2FsbG9jX2xpbWJfc3BhY2UoIGJzaXplICsgMSwgYnNlYyApOworICAgICAgTVBOX0NPUFkgKCBicCwgYmFzZS0+ZCwgYnNpemUgKTsKKyAgICAgIC8qIFdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIHF1b3RpZW50LCBzdG9yZSBpdCBhYm92ZSB0aGUKKyAgICAgICAqIHJlbWFpbmRlciwgYXQgQlAgKyBNU0laRS4gICovCisgICAgICBfZ2NyeV9tcGloX2RpdnJlbSggYnAgKyBtc2l6ZSwgMCwgYnAsIGJzaXplLCBtcCwgbXNpemUgKTsKKyAgICAgIGJzaXplID0gbXNpemU7CisgICAgICAvKiBDYW5vbmljYWxpemUgdGhlIGJhc2UsIHNpbmNlIHdlIGFyZSBnb2luZyB0byBtdWx0aXBseSB3aXRoIGl0CisJIHF1aXRlIGEgZmV3IHRpbWVzLiAgKi8KKyAgICAgIE1QTl9OT1JNQUxJWkUoIGJwLCBic2l6ZSApOworICAgIH0KKyAgZWxzZQorICAgIGJwID0gYmFzZS0+ZDsKKworICBpZiAoIWJzaXplKQorICAgIHsKKyAgICAgIHJlcy0+bmxpbWJzID0gMDsKKyAgICAgIHJlcy0+c2lnbiA9IDA7CisgICAgICBnb3RvIGxlYXZlOworICAgIH0KKworCisgIC8qIE1ha2UgQkFTRSwgRVhQTyBhbmQgTU9EIG5vdCBvdmVybGFwIHdpdGggUkVTLiAgKi8KKyAgaWYgKCBycCA9PSBicCApCisgICAgeworICAgICAgLyogUkVTIGFuZCBCQVNFIGFyZSBpZGVudGljYWwuICBBbGxvY2F0ZSB0ZW1wLiBzcGFjZSBmb3IgQkFTRS4gICovCisgICAgICBnY3J5X2Fzc2VydCAoIWJwX21hcmtlcik7CisgICAgICBicF9ubGltYnMgPSBic2VjPyBic2l6ZTowOworICAgICAgYnAgPSBicF9tYXJrZXIgPSBtcGlfYWxsb2NfbGltYl9zcGFjZSggYnNpemUsIGJzZWMgKTsKKyAgICAgIE1QTl9DT1BZKGJwLCBycCwgYnNpemUpOworICAgIH0KKyAgaWYgKCBycCA9PSBlcCApCisgICAgeworICAgICAgLyogUkVTIGFuZCBFWFBPIGFyZSBpZGVudGljYWwuICBBbGxvY2F0ZSB0ZW1wLiBzcGFjZSBmb3IgRVhQTy4gICovCisgICAgICBlcF9ubGltYnMgPSBlc2VjPyBlc2l6ZTowOworICAgICAgZXAgPSBlcF9tYXJrZXIgPSBtcGlfYWxsb2NfbGltYl9zcGFjZSggZXNpemUsIGVzZWMgKTsKKyAgICAgIE1QTl9DT1BZKGVwLCBycCwgZXNpemUpOworICAgIH0KKyAgaWYgKCBycCA9PSBtcCApIAorICAgIHsKKyAgICAgIC8qIFJFUyBhbmQgTU9EIGFyZSBpZGVudGljYWwuICBBbGxvY2F0ZSB0ZW1wb3Jhcnkgc3BhY2UgZm9yIE1PRC4qLworICAgICAgZ2NyeV9hc3NlcnQgKCFtcF9tYXJrZXIpOworICAgICAgbXBfbmxpbWJzID0gbXNlYz9tc2l6ZTowOworICAgICAgbXAgPSBtcF9tYXJrZXIgPSBtcGlfYWxsb2NfbGltYl9zcGFjZSggbXNpemUsIG1zZWMgKTsKKyAgICAgIE1QTl9DT1BZKG1wLCBycCwgbXNpemUpOworICAgIH0KKworICAvKiBDb3B5IGJhc2UgdG8gdGhlIHJlc3VsdC4gICovCisgIGlmIChyZXMtPmFsbG9jZWQgPCBzaXplKQorICAgIHsKKyAgICAgIG1waV9yZXNpemUgKHJlcywgc2l6ZSk7CisgICAgICBycCA9IHJlcy0+ZDsKKyAgICB9CisgIE1QTl9DT1BZICggcnAsIGJwLCBic2l6ZSApOworICByc2l6ZSA9IGJzaXplOworICByc2lnbiA9IGJzaWduOworICAKKyAgLyogTWFpbiBwcm9jZXNzaW5nLiAgKi8KKyAgeworICAgIG1waV9zaXplX3QgaTsKKyAgICBtcGlfcHRyX3QgeHA7CisgICAgaW50IGM7CisgICAgbXBpX2xpbWJfdCBlOworICAgIG1waV9saW1iX3QgY2FycnlfbGltYjsKKyAgICBzdHJ1Y3Qga2FyYXRzdWJhX2N0eCBrYXJhY3R4OworICAgIAorICAgIHhwX25saW1icyA9IG1zZWM/ICgyICogKG1zaXplICsgMSkpOjA7CisgICAgeHAgPSB4cF9tYXJrZXIgPSBtcGlfYWxsb2NfbGltYl9zcGFjZSggMiAqIChtc2l6ZSArIDEpLCBtc2VjICk7CisgICAgCisgICAgbWVtc2V0KCAma2FyYWN0eCwgMCwgc2l6ZW9mIGthcmFjdHggKTsKKyAgICBuZWdhdGl2ZV9yZXN1bHQgPSAoZXBbMF0gJiAxKSAmJiBiYXNlLT5zaWduOworICAgIAorICAgIGkgPSBlc2l6ZSAtIDE7CisgICAgZSA9IGVwW2ldOworICAgIGNvdW50X2xlYWRpbmdfemVyb3MgKGMsIGUpOworICAgIGUgPSAoZSA8PCBjKSA8PCAxOyAgICAgLyogU2hpZnQgdGhlIGV4cG8gYml0cyB0byB0aGUgbGVmdCwgbG9zZSBtc2IuICAqLworICAgIGMgPSBCSVRTX1BFUl9NUElfTElNQiAtIDEgLSBjOworCisgICAgLyogTWFpbiBsb29wLgorICAgICAKKyAgICAgICBNYWtlIHRoZSByZXN1bHQgYmUgcG9pbnRlZCB0byBhbHRlcm5hdGVseSBieSBYUCBhbmQgUlAuICBUaGlzCisgICAgICAgaGVscHMgdXMgYXZvaWQgYmxvY2sgY29weWluZywgd2hpY2ggd291bGQgb3RoZXJ3aXNlIGJlCisgICAgICAgbmVjZXNzYXJ5IHdpdGggdGhlIG92ZXJsYXAgcmVzdHJpY3Rpb25zIG9mCisgICAgICAgX2djcnlfbXBpaF9kaXZtb2QuIFdpdGggNTAlIHByb2JhYmlsaXR5IHRoZSByZXN1bHQgYWZ0ZXIgdGhpcworICAgICAgIGxvb3Agd2lsbCBiZSBpbiB0aGUgYXJlYSBvcmlnaW5hbGx5IHBvaW50ZWQgYnkgUlAgKD09UkVTLT5kKSwKKyAgICAgICBhbmQgd2l0aCA1MCUgcHJvYmFiaWxpdHkgaW4gdGhlIGFyZWEgb3JpZ2luYWxseSBwb2ludGVkIHRvIGJ5IFhQLiAqLworICAgIGZvciAoOzspCisgICAgICB7CisgICAgICAgIHdoaWxlIChjKSAKKyAgICAgICAgICB7CisgICAgICAgICAgICBtcGlfcHRyX3QgdHA7CisgICAgICAgICAgICBtcGlfc2l6ZV90IHhzaXplOworICAgICAgICAgICAgCisgICAgICAgICAgICAvKm1waWhfbXVsX24oeHAsIHJwLCBycCwgcnNpemUpOyovCisgICAgICAgICAgICBpZiAoIHJzaXplIDwgS0FSQVRTVUJBX1RIUkVTSE9MRCApCisgICAgICAgICAgICAgIF9nY3J5X21waWhfc3FyX25fYmFzZWNhc2UoIHhwLCBycCwgcnNpemUgKTsKKyAgICAgICAgICAgIGVsc2UgCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoICF0c3BhY2UgKSAKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHNpemUgPSAyICogcnNpemU7CisgICAgICAgICAgICAgICAgICAgIHRzcGFjZSA9IG1waV9hbGxvY19saW1iX3NwYWNlKCB0c2l6ZSwgMCApOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCB0c2l6ZSA8ICgyKnJzaXplKSApCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9nY3J5X21waV9mcmVlX2xpbWJfc3BhY2UgKHRzcGFjZSwgMCk7CisgICAgICAgICAgICAgICAgICAgIHRzaXplID0gMiAqIHJzaXplOworICAgICAgICAgICAgICAgICAgICB0c3BhY2UgPSBtcGlfYWxsb2NfbGltYl9zcGFjZSAodHNpemUsIDAgKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfZ2NyeV9tcGloX3Nxcl9uICh4cCwgcnAsIHJzaXplLCB0c3BhY2UpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHhzaXplID0gMiAqIHJzaXplOworICAgICAgICAgICAgaWYgKCB4c2l6ZSA+IG1zaXplICkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9nY3J5X21waWhfZGl2cmVtKHhwICsgbXNpemUsIDAsIHhwLCB4c2l6ZSwgbXAsIG1zaXplKTsKKyAgICAgICAgICAgICAgICB4c2l6ZSA9IG1zaXplOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRwID0gcnA7IHJwID0geHA7IHhwID0gdHA7CisgICAgICAgICAgICByc2l6ZSA9IHhzaXplOworCisgICAgICAgICAgICBpZiAoIChtcGlfbGltYl9zaWduZWRfdCllIDwgMCApCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKm1waWhfbXVsKCB4cCwgcnAsIHJzaXplLCBicCwgYnNpemUgKTsqLworICAgICAgICAgICAgICAgIGlmKCBic2l6ZSA8IEtBUkFUU1VCQV9USFJFU0hPTEQgKSAKKyAgICAgICAgICAgICAgICAgIF9nY3J5X21waWhfbXVsICggeHAsIHJwLCByc2l6ZSwgYnAsIGJzaXplICk7CisgICAgICAgICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgICAgICAgIF9nY3J5X21waWhfbXVsX2thcmF0c3ViYV9jYXNlICh4cCwgcnAsIHJzaXplLCBicCwgYnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmthcmFjdHgpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHhzaXplID0gcnNpemUgKyBic2l6ZTsKKyAgICAgICAgICAgICAgICBpZiAoIHhzaXplID4gbXNpemUgKSAKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2djcnlfbXBpaF9kaXZyZW0oeHAgKyBtc2l6ZSwgMCwgeHAsIHhzaXplLCBtcCwgbXNpemUpOworICAgICAgICAgICAgICAgICAgICB4c2l6ZSA9IG1zaXplOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHRwID0gcnA7IHJwID0geHA7IHhwID0gdHA7CisgICAgICAgICAgICAgICAgcnNpemUgPSB4c2l6ZTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZSA8PD0gMTsKKyAgICAgICAgICAgIGMtLTsKKyAgICAgICAgICB9CisKKyAgICAgICAgaS0tOworICAgICAgICBpZiAoIGkgPCAwICkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZSA9IGVwW2ldOworICAgICAgICBjID0gQklUU19QRVJfTVBJX0xJTUI7CisgICAgICB9CisKKyAgICAvKiBXZSBzaGlmdGVkIE1PRCwgdGhlIG1vZHVsbyByZWR1Y3Rpb24gYXJndW1lbnQsIGxlZnQKKyAgICAgICBNT0RfU0hJRlRfQ05UIHN0ZXBzLiAgQWRqdXN0IHRoZSByZXN1bHQgYnkgcmVkdWNpbmcgaXQgd2l0aCB0aGUKKyAgICAgICBvcmlnaW5hbCBNT0QuCisKKyAgICAgICBBbHNvIG1ha2Ugc3VyZSB0aGUgcmVzdWx0IGlzIHB1dCBpbiBSRVMtPmQgKHdoZXJlIGl0IGFscmVhZHkKKyAgICAgICBtaWdodCBiZSwgc2VlIGFib3ZlKS4gICovCisgICAgaWYgKCBtb2Rfc2hpZnRfY250ICkgCisgICAgICB7CisgICAgICAgIGNhcnJ5X2xpbWIgPSBfZ2NyeV9tcGloX2xzaGlmdCggcmVzLT5kLCBycCwgcnNpemUsIG1vZF9zaGlmdF9jbnQpOworICAgICAgICBycCA9IHJlcy0+ZDsKKyAgICAgICAgaWYgKCBjYXJyeV9saW1iICkKKyAgICAgICAgICB7CisgICAgICAgICAgICBycFtyc2l6ZV0gPSBjYXJyeV9saW1iOworICAgICAgICAgICAgcnNpemUrKzsKKyAgICAgICAgICB9CisgICAgICB9CisgICAgZWxzZSBpZiAocmVzLT5kICE9IHJwKQorICAgICAgeworICAgICAgICBNUE5fQ09QWSAocmVzLT5kLCBycCwgcnNpemUpOworICAgICAgICBycCA9IHJlcy0+ZDsKKyAgICAgIH0KKworICAgIGlmICggcnNpemUgPj0gbXNpemUgKSAKKyAgICAgIHsKKyAgICAgICAgX2djcnlfbXBpaF9kaXZyZW0ocnAgKyBtc2l6ZSwgMCwgcnAsIHJzaXplLCBtcCwgbXNpemUpOworICAgICAgICByc2l6ZSA9IG1zaXplOworICAgICAgfQorCisgICAgLyogUmVtb3ZlIGFueSBsZWFkaW5nIHplcm8gd29yZHMgZnJvbSB0aGUgcmVzdWx0LiAgKi8KKyAgICBpZiAoIG1vZF9zaGlmdF9jbnQgKQorICAgICAgX2djcnlfbXBpaF9yc2hpZnQoIHJwLCBycCwgcnNpemUsIG1vZF9zaGlmdF9jbnQpOworICAgIE1QTl9OT1JNQUxJWkUgKHJwLCByc2l6ZSk7CisgICAgCisgICAgX2djcnlfbXBpaF9yZWxlYXNlX2thcmF0c3ViYV9jdHggKCZrYXJhY3R4ICk7CisgIH0KKworICAvKiBGaXh1cCBmb3IgbmVnYXRpdmUgcmVzdWx0cy4gICovCisgIGlmICggbmVnYXRpdmVfcmVzdWx0ICYmIHJzaXplICkKKyAgICB7CisgICAgICBpZiAoIG1vZF9zaGlmdF9jbnQgKQorICAgICAgICBfZ2NyeV9tcGloX3JzaGlmdCggbXAsIG1wLCBtc2l6ZSwgbW9kX3NoaWZ0X2NudCk7CisgICAgICBfZ2NyeV9tcGloX3N1YiggcnAsIG1wLCBtc2l6ZSwgcnAsIHJzaXplKTsKKyAgICAgIHJzaXplID0gbXNpemU7CisgICAgICByc2lnbiA9IG1zaWduOworICAgICAgTVBOX05PUk1BTElaRShycCwgcnNpemUpOworICAgIH0KKyAgZ2NyeV9hc3NlcnQgKHJlcy0+ZCA9PSBycCk7CisgIHJlcy0+bmxpbWJzID0gcnNpemU7CisgIHJlcy0+c2lnbiA9IHJzaWduOworICAKKyBsZWF2ZToKKyAgaWYgKG1wX21hcmtlcikKKyAgICBfZ2NyeV9tcGlfZnJlZV9saW1iX3NwYWNlKCBtcF9tYXJrZXIsIG1wX25saW1icyApOworICBpZiAoYnBfbWFya2VyKQorICAgIF9nY3J5X21waV9mcmVlX2xpbWJfc3BhY2UoIGJwX21hcmtlciwgYnBfbmxpbWJzICk7CisgIGlmIChlcF9tYXJrZXIpCisgICAgX2djcnlfbXBpX2ZyZWVfbGltYl9zcGFjZSggZXBfbWFya2VyLCBlcF9ubGltYnMgKTsKKyAgaWYgKHhwX21hcmtlcikKKyAgICBfZ2NyeV9tcGlfZnJlZV9saW1iX3NwYWNlKCB4cF9tYXJrZXIsIHhwX25saW1icyApOworICBpZiAodHNwYWNlKQorICAgIF9nY3J5X21waV9mcmVlX2xpbWJfc3BhY2UoIHRzcGFjZSwgMCApOworfQorCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL21waS1zY2FuLmMgYi9saWJnY3J5cHQtMS40LjYvbXBpL21waS1zY2FuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA2OTljZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvbXBpLXNjYW4uYwpAQCAtMCwwICsxLDEzMiBAQAorLyogbXBpLXNjYW4uYyAgLSAgTVBJIGZ1bmN0aW9ucworICoJQ29weXJpZ2h0IChDKSAxOTk4LCAyMDAxLCAyMDAyLCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJtcGktaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCisvKioqKioqKioqKioqKioqKgorICogU2NhbiB0aHJvdWdoIGFuIG1waSBhbmQgcmV0dXJuIGJ5dGUgZm9yIGJ5dGUuIGEgLTEgaXMgcmV0dXJuZWQgdG8gaW5kaWNhdGUKKyAqIHRoZSBlbmQgb2YgdGhlIG1waS4gU2Nhbm5pbmcgaXMgZG9uZSBmcm9tIHRoZSBsc2IgdG8gdGhlIG1zYiwgcmV0dXJuZWQKKyAqIHZhbHVlcyBhcmUgaW4gdGhlIHJhbmdlIG9mIDAgLi4gMjU1LgorICoKKyAqIEZJWE1FOiBUaGlzIGNvZGUgaXMgVkVSWSB1Z2x5IQorICovCitpbnQKK19nY3J5X21waV9nZXRieXRlKCBnY3J5X21waV90IGEsIHVuc2lnbmVkIGlkeCApCit7CisgICAgaW50IGksIGo7CisgICAgdW5zaWduZWQgbjsKKyAgICBtcGlfcHRyX3QgYXA7CisgICAgbXBpX2xpbWJfdCBsaW1iOworCisgICAgYXAgPSBhLT5kOworICAgIGZvcihuPTAsaT0wOyBpIDwgYS0+bmxpbWJzOyBpKysgKSB7CisJbGltYiA9IGFwW2ldOworCWZvciggaj0wOyBqIDwgQllURVNfUEVSX01QSV9MSU1COyBqKyssIG4rKyApCisJICAgIGlmKCBuID09IGlkeCApCisJCXJldHVybiAobGltYiA+PiBqKjgpICYgMHhmZjsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCisKKy8qKioqKioqKioqKioqKioqCisgKiBQdXQgYSB2YWx1ZSBhdCBwb3NpdGlvbiBJRFggaW50byBBLiBpZHggY291bnRzIGZyb20gbHNiIHRvIG1zYgorICovCit2b2lkCitfZ2NyeV9tcGlfcHV0Ynl0ZSggZ2NyeV9tcGlfdCBhLCB1bnNpZ25lZCBpZHgsIGludCB4YyApCit7CisgICAgaW50IGksIGo7CisgICAgdW5zaWduZWQgbjsKKyAgICBtcGlfcHRyX3QgYXA7CisgICAgbXBpX2xpbWJfdCBsaW1iLCBjOworCisgICAgYyA9IHhjICYgMHhmZjsKKyAgICBhcCA9IGEtPmQ7CisgICAgZm9yKG49MCxpPTA7IGkgPCBhLT5hbGxvY2VkOyBpKysgKSB7CisJbGltYiA9IGFwW2ldOworCWZvciggaj0wOyBqIDwgQllURVNfUEVSX01QSV9MSU1COyBqKyssIG4rKyApCisJICAgIGlmKCBuID09IGlkeCApIHsKKwkgICAgICAjaWYgQllURVNfUEVSX01QSV9MSU1CID09IDQKKwkJaWYoIGogPT0gMCApCisJCSAgICBsaW1iID0gKGxpbWIgJiAweGZmZmZmZjAwKSB8IGM7CisJCWVsc2UgaWYoIGogPT0gMSApCisJCSAgICBsaW1iID0gKGxpbWIgJiAweGZmZmYwMGZmKSB8IChjPDw4KTsKKwkJZWxzZSBpZiggaiA9PSAyICkKKwkJICAgIGxpbWIgPSAobGltYiAmIDB4ZmYwMGZmZmYpIHwgKGM8PDE2KTsKKwkJZWxzZQorCQkgICAgbGltYiA9IChsaW1iICYgMHgwMGZmZmZmZikgfCAoYzw8MjQpOworCSAgICAgICNlbGlmIEJZVEVTX1BFUl9NUElfTElNQiA9PSA4CisJCWlmKCBqID09IDAgKQorCQkgICAgbGltYiA9IChsaW1iICYgMHhmZmZmZmZmZmZmZmZmZjAwKSB8IGM7CisJCWVsc2UgaWYoIGogPT0gMSApCisJCSAgICBsaW1iID0gKGxpbWIgJiAweGZmZmZmZmZmZmZmZjAwZmYpIHwgKGM8PDgpOworCQllbHNlIGlmKCBqID09IDIgKQorCQkgICAgbGltYiA9IChsaW1iICYgMHhmZmZmZmZmZmZmMDBmZmZmKSB8IChjPDwxNik7CisJCWVsc2UgaWYoIGogPT0gMyApCisJCSAgICBsaW1iID0gKGxpbWIgJiAweGZmZmZmZmZmMDBmZmZmZmYpIHwgKGM8PDI0KTsKKwkJZWxzZSBpZiggaiA9PSA0ICkKKwkJICAgIGxpbWIgPSAobGltYiAmIDB4ZmZmZmZmMDBmZmZmZmZmZikgfCAoYzw8MzIpOworCQllbHNlIGlmKCBqID09IDUgKQorCQkgICAgbGltYiA9IChsaW1iICYgMHhmZmZmMDBmZmZmZmZmZmZmKSB8IChjPDw0MCk7CisJCWVsc2UgaWYoIGogPT0gNiApCisJCSAgICBsaW1iID0gKGxpbWIgJiAweGZmMDBmZmZmZmZmZmZmZmYpIHwgKGM8PDQ4KTsKKwkJZWxzZQorCQkgICAgbGltYiA9IChsaW1iICYgMHgwMGZmZmZmZmZmZmZmZmZmKSB8IChjPDw1Nik7CisJICAgICAgI2Vsc2UKKwkJICNlcnJvciBwbGVhc2UgZW5oYW5jZSB0aGlzIGZ1bmN0aW9uLCBpdHMgdWdseSAtIGkga25vdy4KKwkgICAgICAjZW5kaWYKKwkJaWYoIGEtPm5saW1icyA8PSBpICkKKwkJICAgIGEtPm5saW1icyA9IGkrMTsKKwkJYXBbaV0gPSBsaW1iOworCQlyZXR1cm47CisJICAgIH0KKyAgICB9CisgICAgYWJvcnQoKTsgLyogaW5kZXggb3V0IG9mIHJhbmdlICovCit9CisKKworLyoqKioqKioqKioqKioqKioKKyAqIENvdW50IHRoZSBudW1iZXIgb2YgemVyb2JpdHMgYXQgdGhlIGxvdyBlbmQgb2YgQQorICovCit1bnNpZ25lZAorX2djcnlfbXBpX3RyYWlsaW5nX3plcm9zKCBnY3J5X21waV90IGEgKQoreworICAgIHVuc2lnbmVkIG4sIGNvdW50ID0gMDsKKworICAgIGZvcihuPTA7IG4gPCBhLT5ubGltYnM7IG4rKyApIHsKKwlpZiggYS0+ZFtuXSApIHsKKwkgICAgdW5zaWduZWQgbm47CisJICAgIG1waV9saW1iX3QgYWxpbWIgPSBhLT5kW25dOworCisJICAgIGNvdW50X3RyYWlsaW5nX3plcm9zKCBubiwgYWxpbWIgKTsKKwkgICAgY291bnQgKz0gbm47CisJICAgIGJyZWFrOworCX0KKwljb3VudCArPSBCSVRTX1BFUl9NUElfTElNQjsKKyAgICB9CisgICAgcmV0dXJuIGNvdW50OworCit9CisKKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9tcGljb2Rlci5jIGIvbGliZ2NyeXB0LTEuNC42L21waS9tcGljb2Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMGM3NmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL21waWNvZGVyLmMKQEAgLTAsMCArMSw3NTIgQEAKKy8qIG1waWNvZGVyLmMgIC0gIENvZGVyIGZvciB0aGUgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgTVBJcworICogQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzCisgKiAgICAgICAgICAgICAgIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAibXBpLWludGVybmFsLmgiCisjaW5jbHVkZSAiZzEwbGliLmgiCisKKyNkZWZpbmUgTUFYX0VYVEVSTl9NUElfQklUUyAxNjM4NAorCisvKiBIZWxwZXIgdXNlZCB0byBzY2FuIFBHUCBzdHlsZSBNUElzLiAgUmV0dXJucyBOVUxMIG9uIGZhaWx1cmUuICovCitzdGF0aWMgZ2NyeV9tcGlfdAorbXBpX3JlYWRfZnJvbV9idWZmZXIgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQgKnJldF9ucmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgc2VjdXJlKQoreworICBpbnQgaSwgajsKKyAgdW5zaWduZWQgaW50IG5iaXRzLCBuYnl0ZXMsIG5saW1icywgbnJlYWQ9MDsKKyAgbXBpX2xpbWJfdCBhOworICBnY3J5X21waV90IHZhbCA9IE1QSV9OVUxMOworICAKKyAgaWYgKCAqcmV0X25yZWFkIDwgMiApCisgICAgZ290byBsZWF2ZTsKKyAgbmJpdHMgPSBidWZmZXJbMF0gPDwgOCB8IGJ1ZmZlclsxXTsKKyAgaWYgKCBuYml0cyA+IE1BWF9FWFRFUk5fTVBJX0JJVFMgKQorICAgIHsKKy8qICAgICAgIGxvZ19kZWJ1ZyAoIm1waSB0b28gbGFyZ2UgKCV1IGJpdHMpXG4iLCBuYml0cyk7ICovCisgICAgICBnb3RvIGxlYXZlOworICAgIH0KKyAgZWxzZSBpZiggIW5iaXRzICkgCisgICAgeworLyogICAgICAgbG9nX2RlYnVnICgiYW4gbXBpIG9mIHNpemUgMCBpcyBub3QgYWxsb3dlZFxuIik7ICovCisgICAgICBnb3RvIGxlYXZlOworICAgIH0KKyAgYnVmZmVyICs9IDI7CisgIG5yZWFkID0gMjsKKworICBuYnl0ZXMgPSAobmJpdHMrNykgLyA4OworICBubGltYnMgPSAobmJ5dGVzK0JZVEVTX1BFUl9NUElfTElNQi0xKSAvIEJZVEVTX1BFUl9NUElfTElNQjsKKyAgdmFsID0gc2VjdXJlPyBtcGlfYWxsb2Nfc2VjdXJlIChubGltYnMpIDogbXBpX2FsbG9jIChubGltYnMpOworICBpID0gQllURVNfUEVSX01QSV9MSU1CIC0gbmJ5dGVzICUgQllURVNfUEVSX01QSV9MSU1COworICBpICU9IEJZVEVTX1BFUl9NUElfTElNQjsKKyAgaj0gdmFsLT5ubGltYnMgPSBubGltYnM7CisgIHZhbC0+c2lnbiA9IDA7CisgIGZvciAoIDsgaiA+IDA7IGotLSApCisgICAgeworICAgICAgYSA9IDA7CisgICAgICBmb3IgKDsgaSA8IEJZVEVTX1BFUl9NUElfTElNQjsgaSsrICkgCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoICsrbnJlYWQgPiAqcmV0X25yZWFkICkKKyAgICAgICAgICAgIHsKKy8qICAgICAgICAgICAgICAgbG9nX2RlYnVnICgibXBpIGxhcmdlciB0aGFuIGJ1ZmZlciIpOyAqLworICAgICAgICAgICAgICBtcGlfZnJlZSAodmFsKTsKKyAgICAgICAgICAgICAgdmFsID0gTlVMTDsKKyAgICAgICAgICAgICAgZ290byBsZWF2ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBhIDw8PSA4OworICAgICAgICAgIGEgfD0gKmJ1ZmZlcisrOworCX0KKyAgICAgIGkgPSAwOworICAgICAgdmFsLT5kW2otMV0gPSBhOworICAgIH0KKyAgCisgbGVhdmU6CisgICpyZXRfbnJlYWQgPSBucmVhZDsKKyAgcmV0dXJuIHZhbDsKK30KKworCisvKioqKioqKioqKioqKioqKgorICogRmlsbCB0aGUgbXBpIFZBTCBmcm9tIHRoZSBoZXggc3RyaW5nIGluIFNUUi4KKyAqLworc3RhdGljIGludAorbXBpX2Zyb21zdHIgKGdjcnlfbXBpX3QgdmFsLCBjb25zdCBjaGFyICpzdHIpCit7CisgIGludCBzaWduID0gMDsKKyAgaW50IHByZXBlbmRfemVybyA9IDA7CisgIGludCBpLCBqLCBjLCBjMSwgYzI7CisgIHVuc2lnbmVkIGludCBuYml0cywgbmJ5dGVzLCBubGltYnM7CisgIG1waV9saW1iX3QgYTsKKworICBpZiAoICpzdHIgPT0gJy0nICkKKyAgICB7CisgICAgICBzaWduID0gMTsKKyAgICAgIHN0cisrOworICAgIH0KKworICAvKiBTa2lwIG9wdGlvbmFsIGhleCBwcmVmaXguICAqLworICBpZiAoICpzdHIgPT0gJzAnICYmIHN0clsxXSA9PSAneCcgKQorICAgIHN0ciArPSAyOworCisgIG5iaXRzID0gNCAqIHN0cmxlbiAoc3RyKTsKKyAgaWYgKChuYml0cyAlIDgpKQorICAgIHByZXBlbmRfemVybyA9IDE7CisKKyAgbmJ5dGVzID0gKG5iaXRzKzcpIC8gODsKKyAgbmxpbWJzID0gKG5ieXRlcytCWVRFU19QRVJfTVBJX0xJTUItMSkgLyBCWVRFU19QRVJfTVBJX0xJTUI7CisKKyAgaWYgKCB2YWwtPmFsbG9jZWQgPCBubGltYnMgKQorICAgIG1waV9yZXNpemUgKHZhbCwgbmxpbWJzKTsKKworICBpID0gQllURVNfUEVSX01QSV9MSU1CIC0gKG5ieXRlcyAlIEJZVEVTX1BFUl9NUElfTElNQik7CisgIGkgJT0gQllURVNfUEVSX01QSV9MSU1COworICBqID0gdmFsLT5ubGltYnMgPSBubGltYnM7CisgIHZhbC0+c2lnbiA9IHNpZ247CisgIGZvciAoOyBqID4gMDsgai0tKQorICAgIHsKKyAgICAgIGEgPSAwOworICAgICAgZm9yICg7IGkgPCBCWVRFU19QRVJfTVBJX0xJTUI7IGkrKykKKyAgICAgICAgeworICAgICAgICAgIGlmIChwcmVwZW5kX3plcm8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGMxID0gJzAnOworICAgICAgICAgICAgICBwcmVwZW5kX3plcm8gPSAwOworCSAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgYzEgPSAqc3RyKys7CisKKyAgICAgICAgICBpZiAoIWMxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBtcGlfY2xlYXIgKHZhbCk7CisgICAgICAgICAgICAgIHJldHVybiAxOyAgLyogRXJyb3IuICAqLworCSAgICB9CisgICAgICAgICAgYzIgPSAqc3RyKys7CisgICAgICAgICAgaWYgKCFjMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbXBpX2NsZWFyICh2YWwpOworICAgICAgICAgICAgICByZXR1cm4gMTsgIC8qIEVycm9yLiAgKi8KKwkgICAgfQorICAgICAgICAgIGlmICggYzEgPj0gJzAnICYmIGMxIDw9ICc5JyApCisgICAgICAgICAgICBjID0gYzEgLSAnMCc7CisgICAgICAgICAgZWxzZSBpZiAoIGMxID49ICdhJyAmJiBjMSA8PSAnZicgKQorICAgICAgICAgICAgYyA9IGMxIC0gJ2EnICsgMTA7CisgICAgICAgICAgZWxzZSBpZiAoIGMxID49ICdBJyAmJiBjMSA8PSAnRicgKQorICAgICAgICAgICAgYyA9IGMxIC0gJ0EnICsgMTA7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBtcGlfY2xlYXIgKHZhbCk7CisgICAgICAgICAgICAgIHJldHVybiAxOyAgLyogRXJyb3IuICAqLworCSAgICB9CisgICAgICAgICAgYyA8PD0gNDsKKyAgICAgICAgICBpZiAoIGMyID49ICcwJyAmJiBjMiA8PSAnOScgKQorICAgICAgICAgICAgYyB8PSBjMiAtICcwJzsKKyAgICAgICAgICBlbHNlIGlmKCBjMiA+PSAnYScgJiYgYzIgPD0gJ2YnICkKKyAgICAgICAgICAgIGMgfD0gYzIgLSAnYScgKyAxMDsKKyAgICAgICAgICBlbHNlIGlmKCBjMiA+PSAnQScgJiYgYzIgPD0gJ0YnICkKKyAgICAgICAgICAgIGMgfD0gYzIgLSAnQScgKyAxMDsKKyAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICBtcGlfY2xlYXIodmFsKTsKKyAgICAgICAgICAgICAgcmV0dXJuIDE7ICAvKiBFcnJvci4gKi8KKwkgICAgfQorICAgICAgICAgIGEgPDw9IDg7CisgICAgICAgICAgYSB8PSBjOworCX0KKyAgICAgIGkgPSAwOworICAgICAgdmFsLT5kW2otMV0gPSBhOworICAgIH0KKyAgCisgIHJldHVybiAwOyAgLyogT2theS4gICovCit9CisKKworLyogRHVtcCB0aGUgdmFsdWUgb2YgQSBpbiBhIGZvcm1hdCBzdWl0YWJsZSBmb3IgZGVidWdnaW5nIHRvCisgICBMaWJnY3J5cHQncyBsb2dnaW5nIHN0cmVhbS4gIE5vdGUgdGhhdCBvbmUgbGVhZGluZyBzcGFjZSBidXQgbm8KKyAgIHRyYWlsaW5nIHNwYWNlIG9yIGxpbmVmZWVkIHdpbGwgYmUgcHJpbnRlZC4gIEl0IGlzIG9rYXkgdG8gcGFzcworICAgTlVMTCBmb3IgQS4gKi8KK3ZvaWQgCitnY3J5X21waV9kdW1wIChjb25zdCBnY3J5X21waV90IGEpCit7CisgIGludCBpOworCisgIGxvZ19wcmludGYgKCIgIik7CisgIGlmICghYSkKKyAgICBsb2dfcHJpbnRmICgiW01QSV9OVUxMXSIpOworICBlbHNlIAorICAgIHsKKyAgICAgIGlmIChhLT5zaWduKQorICAgICAgICBsb2dfcHJpbnRmICggIi0iKTsKKyNpZiBCWVRFU19QRVJfTVBJX0xJTUIgPT0gMgorIyBkZWZpbmUgWCAiNCIKKyNlbGlmIEJZVEVTX1BFUl9NUElfTElNQiA9PSA0CisjIGRlZmluZSBYICI4IgorI2VsaWYgQllURVNfUEVSX01QSV9MSU1CID09IDgKKyMgZGVmaW5lIFggIjE2IgorI2VsaWYgQllURVNfUEVSX01QSV9MSU1CID09IDE2CisjIGRlZmluZSBYICIzMiIKKyNlbHNlCisjIGVycm9yIHBsZWFzZSBkZWZpbmUgdGhlIGZvcm1hdCBoZXJlCisjZW5kaWYKKyAgICAgIGZvciAoaT1hLT5ubGltYnM7IGkgPiAwIDsgaS0tICkKKyAgICAgICAgeworICAgICAgICAgIGxvZ19wcmludGYgKGkgIT0gYS0+bmxpbWJzPyAiJTAiIFggImxYIjoiJWxYIiwgKHVsb25nKWEtPmRbaS0xXSk7CisgICAgICAgIH0KKyN1bmRlZiBYCisgICAgICBpZiAoIWEtPm5saW1icykKKyAgICAgICAgbG9nX3ByaW50ZiAoIjAiKTsKKyAgICB9Cit9CisKKy8qIENvbnZpZW5jZSBmdW5jdGlvbiB1c2VkIGludGVybmFsbHkuICovCit2b2lkCitfZ2NyeV9sb2dfbXBpZHVtcCAoY29uc3QgY2hhciAqdGV4dCwgZ2NyeV9tcGlfdCBhKQoreworICBsb2dfcHJpbnRmICgiJXM6IiwgdGV4dCk7CisgIGdjcnlfbXBpX2R1bXAgKGEpOworICBsb2dfcHJpbnRmICgiXG4iKTsKK30KKworCisvKiBSZXR1cm4gYW4gYWxsb2NhdGVkIGJ1ZmZlciB3aXRoIHRoZSBNUEkgKG1zYiBmaXJzdCkuICBOQllURVMKKyAgIHJlY2VpdmVzIHRoZSBsZW5ndGggb2YgdGhpcyBidWZmZXIuICBDYWxsZXIgbXVzdCBmcmVlIHRoZSByZXR1cm4KKyAgIHN0cmluZy4gIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBhbGxvY2F0ZWQgYnVmZmVyIHdpdGggTkJZVEVTIHNldAorICAgdG8gemVybyBpZiB0aGUgdmFsdWUgb2YgQSBpcyB6ZXJvLiAgSWYgc2lnbiBpcyBub3QgTlVMTCwgaXQgd2lsbCBiZQorICAgc2V0IHRvIHRoZSBzaWduIG9mIHRoZSBBLiAgT24gZXJyb3IgTlVMTCBpcyByZXR1cm5lZCBhbmQgRVJSTk8gc2V0CisgICBhcHByb3ByaWF0ZWx5LiAgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyICoKK2RvX2dldF9idWZmZXIgKGdjcnlfbXBpX3QgYSwgdW5zaWduZWQgaW50ICpuYnl0ZXMsIGludCAqc2lnbiwgaW50IGZvcmNlX3NlY3VyZSkKK3sKKyAgdW5zaWduZWQgY2hhciAqcCwgKmJ1ZmZlcjsKKyAgbXBpX2xpbWJfdCBhbGltYjsKKyAgaW50IGk7CisgIHNpemVfdCBuOworICAKKyAgaWYgKHNpZ24pCisgICAgKnNpZ24gPSBhLT5zaWduOworCisgICpuYnl0ZXMgPSBhLT5ubGltYnMgKiBCWVRFU19QRVJfTVBJX0xJTUI7CisgIG4gPSAqbmJ5dGVzPyAqbmJ5dGVzOjE7IC8qIEFsbG9jYXRlIGF0IGxlYXN0IG9uZSBieXRlLiAgKi8KKyAgcCA9IGJ1ZmZlciA9IChmb3JjZV9zZWN1cmUgfHwgbXBpX2lzX3NlY3VyZShhKSk/IGdjcnlfbWFsbG9jX3NlY3VyZSAobikKKwkJCQkJCSA6IGdjcnlfbWFsbG9jIChuKTsKKyAgaWYgKCFidWZmZXIpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgZm9yIChpPWEtPm5saW1icy0xOyBpID49IDA7IGktLSkKKyAgICB7CisgICAgICBhbGltYiA9IGEtPmRbaV07CisjaWYgQllURVNfUEVSX01QSV9MSU1CID09IDQKKyAgICAgICpwKysgPSBhbGltYiA+PiAyNDsKKyAgICAgICpwKysgPSBhbGltYiA+PiAxNjsKKyAgICAgICpwKysgPSBhbGltYiA+PiAgODsKKyAgICAgICpwKysgPSBhbGltYgkgIDsKKyNlbGlmIEJZVEVTX1BFUl9NUElfTElNQiA9PSA4CisgICAgICAqcCsrID0gYWxpbWIgPj4gNTY7CisgICAgICAqcCsrID0gYWxpbWIgPj4gNDg7CisgICAgICAqcCsrID0gYWxpbWIgPj4gNDA7CisgICAgICAqcCsrID0gYWxpbWIgPj4gMzI7CisgICAgICAqcCsrID0gYWxpbWIgPj4gMjQ7CisgICAgICAqcCsrID0gYWxpbWIgPj4gMTY7CisgICAgICAqcCsrID0gYWxpbWIgPj4gIDg7CisgICAgICAqcCsrID0gYWxpbWIJICA7CisjZWxzZQorIyAgICAgZXJyb3IgcGxlYXNlIGltcGxlbWVudCBmb3IgdGhpcyBsaW1iIHNpemUuCisjZW5kaWYKKyAgICB9CisKKyAgLyogVGhpcyBpcyBzdWItb3B0aW1hbCBidXQgd2UgbmVlZCB0byBkbyB0aGUgc2hpZnQgb3BlcmF0aW9uIGJlY2F1c2UKKyAgICAgdGhlIGNhbGxlciBoYXMgdG8gZnJlZSB0aGUgcmV0dXJuZWQgYnVmZmVyLiAgKi8KKyAgZm9yIChwPWJ1ZmZlcjsgISpwICYmICpuYnl0ZXM7IHArKywgLS0qbmJ5dGVzKQorICAgIDsKKyAgaWYgKHAgIT0gYnVmZmVyKQorICAgIG1lbW1vdmUgKGJ1ZmZlcixwLCAqbmJ5dGVzKTsKKyAgcmV0dXJuIGJ1ZmZlcjsKK30KKworCitieXRlICoKK19nY3J5X21waV9nZXRfYnVmZmVyIChnY3J5X21waV90IGEsIHVuc2lnbmVkIGludCAqbmJ5dGVzLCBpbnQgKnNpZ24pCit7CisgIHJldHVybiBkb19nZXRfYnVmZmVyIChhLCBuYnl0ZXMsIHNpZ24sIDApOworfQorCitieXRlICoKK19nY3J5X21waV9nZXRfc2VjdXJlX2J1ZmZlciAoZ2NyeV9tcGlfdCBhLCB1bnNpZ25lZCAqbmJ5dGVzLCBpbnQgKnNpZ24pCit7CisgIHJldHVybiBkb19nZXRfYnVmZmVyIChhLCBuYnl0ZXMsIHNpZ24sIDEpOworfQorCisKKy8qCisgKiBVc2UgdGhlIE5CWVRFUyBhdCBCVUZGRVJfQVJHIHRvIHVwZGF0ZSBBLiAgU2V0IHRoZSBzaWduIG9mIGEgdG8KKyAqIFNJR04uCisgKi8KK3ZvaWQKK19nY3J5X21waV9zZXRfYnVmZmVyIChnY3J5X21waV90IGEsIGNvbnN0IHZvaWQgKmJ1ZmZlcl9hcmcsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcywgaW50IHNpZ24pCit7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciA9IChjb25zdCB1bnNpZ25lZCBjaGFyKilidWZmZXJfYXJnOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpwOworICBtcGlfbGltYl90IGFsaW1iOworICBpbnQgbmxpbWJzOworICBpbnQgaTsKKyAgCisgIG5saW1icyA9IChuYnl0ZXMgKyBCWVRFU19QRVJfTVBJX0xJTUIgLSAxKSAvIEJZVEVTX1BFUl9NUElfTElNQjsKKyAgUkVTSVpFX0lGX05FRURFRChhLCBubGltYnMpOworICBhLT5zaWduID0gc2lnbjsKKyAgCisgIGZvciAoaT0wLCBwID0gYnVmZmVyK25ieXRlcy0xOyBwID49IGJ1ZmZlcitCWVRFU19QRVJfTVBJX0xJTUI7ICkgCisgICAgeworI2lmIEJZVEVTX1BFUl9NUElfTElNQiA9PSA0CisgICAgICBhbGltYiAgPSAqcC0tCSAgICA7CisgICAgICBhbGltYiB8PSAqcC0tIDw8ICA4IDsKKyAgICAgIGFsaW1iIHw9ICpwLS0gPDwgMTYgOworICAgICAgYWxpbWIgfD0gKnAtLSA8PCAyNCA7CisjZWxpZiBCWVRFU19QRVJfTVBJX0xJTUIgPT0gOAorICAgICAgYWxpbWIgID0gKG1waV9saW1iX3QpKnAtLQk7CisgICAgICBhbGltYiB8PSAobXBpX2xpbWJfdCkqcC0tIDw8ICA4IDsKKyAgICAgIGFsaW1iIHw9IChtcGlfbGltYl90KSpwLS0gPDwgMTYgOworICAgICAgYWxpbWIgfD0gKG1waV9saW1iX3QpKnAtLSA8PCAyNCA7CisgICAgICBhbGltYiB8PSAobXBpX2xpbWJfdCkqcC0tIDw8IDMyIDsKKyAgICAgIGFsaW1iIHw9IChtcGlfbGltYl90KSpwLS0gPDwgNDAgOworICAgICAgYWxpbWIgfD0gKG1waV9saW1iX3QpKnAtLSA8PCA0OCA7CisgICAgICBhbGltYiB8PSAobXBpX2xpbWJfdCkqcC0tIDw8IDU2IDsKKyNlbHNlCisjICAgICAgIGVycm9yIHBsZWFzZSBpbXBsZW1lbnQgZm9yIHRoaXMgbGltYiBzaXplLgorI2VuZGlmCisgICAgICBhLT5kW2krK10gPSBhbGltYjsKKyAgICB9CisgIGlmICggcCA+PSBidWZmZXIgKQorICAgIHsKKyNpZiBCWVRFU19QRVJfTVBJX0xJTUIgPT0gNAorICAgICAgYWxpbWIgID0gKnAtLTsKKyAgICAgIGlmIChwID49IGJ1ZmZlcikKKyAgICAgICAgYWxpbWIgfD0gKnAtLSA8PCAgODsKKyAgICAgIGlmIChwID49IGJ1ZmZlcikKKyAgICAgICAgYWxpbWIgfD0gKnAtLSA8PCAxNjsKKyAgICAgIGlmIChwID49IGJ1ZmZlcikKKyAgICAgICAgYWxpbWIgfD0gKnAtLSA8PCAyNDsKKyNlbGlmIEJZVEVTX1BFUl9NUElfTElNQiA9PSA4CisgICAgICBhbGltYiAgPSAobXBpX2xpbWJfdCkqcC0tOworICAgICAgaWYgKHAgPj0gYnVmZmVyKQorICAgICAgICBhbGltYiB8PSAobXBpX2xpbWJfdCkqcC0tIDw8IDg7CisgICAgICBpZiAocCA+PSBidWZmZXIpCisgICAgICAgIGFsaW1iIHw9IChtcGlfbGltYl90KSpwLS0gPDwgMTY7CisgICAgICBpZiAocCA+PSBidWZmZXIpCisgICAgICAgIGFsaW1iIHw9IChtcGlfbGltYl90KSpwLS0gPDwgMjQ7CisgICAgICBpZiAocCA+PSBidWZmZXIpCisgICAgICAgIGFsaW1iIHw9IChtcGlfbGltYl90KSpwLS0gPDwgMzI7CisgICAgICBpZiAocCA+PSBidWZmZXIpCisgICAgICAgIGFsaW1iIHw9IChtcGlfbGltYl90KSpwLS0gPDwgNDA7CisgICAgICBpZiAocCA+PSBidWZmZXIpCisgICAgICAgIGFsaW1iIHw9IChtcGlfbGltYl90KSpwLS0gPDwgNDg7CisgICAgICBpZiAocCA+PSBidWZmZXIpCisgICAgICAgIGFsaW1iIHw9IChtcGlfbGltYl90KSpwLS0gPDwgNTY7CisjZWxzZQorIyAgICAgZXJyb3IgcGxlYXNlIGltcGxlbWVudCBmb3IgdGhpcyBsaW1iIHNpemUuCisjZW5kaWYKKyAgICAgIGEtPmRbaSsrXSA9IGFsaW1iOworICAgIH0KKyAgYS0+bmxpbWJzID0gaTsKKyAgZ2NyeV9hc3NlcnQgKGkgPT0gbmxpbWJzKTsKK30KKworCisvKiBDb252ZXJ0IHRoZSBleHRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBhbiBpbnRlZ2VyIHN0b3JlZCBpbiBCVUZGRVIKKyAgIHdpdGggYSBsZW5ndGggb2YgQlVGTEVOIGludG8gYSBuZXdseSBjcmVhdGUgTVBJIHJldHVybmVkIGluCisgICBSRVRfTVBJLiAgSWYgTkJZVEVTIGlzIG5vdCBOVUxMLCBpdCB3aWxsIHJlY2VpdmUgdGhlIG51bWJlciBvZgorICAgYnl0ZXMgYWN0dWFsbHkgc2Nhbm5lZCBhZnRlciBhIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLiAgKi8KK2djcnlfZXJyb3JfdAorZ2NyeV9tcGlfc2NhbiAoc3RydWN0IGdjcnlfbXBpICoqcmV0X21waSwgZW51bSBnY3J5X21waV9mb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqYnVmZmVyX2FyZywgc2l6ZV90IGJ1Zmxlbiwgc2l6ZV90ICpuc2Nhbm5lZCkKK3sKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmZmVyID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIqKWJ1ZmZlcl9hcmc7CisgIHN0cnVjdCBnY3J5X21waSAqYSA9IE5VTEw7CisgIHVuc2lnbmVkIGludCBsZW47CisgIGludCBzZWN1cmUgPSAoYnVmZmVyICYmIGdjcnlfaXNfc2VjdXJlIChidWZmZXIpKTsKKworICBpZiAoZm9ybWF0ID09IEdDUllNUElfRk1UX1NTSCkKKyAgICBsZW4gPSAwOworICBlbHNlCisgICAgbGVuID0gYnVmbGVuOworICAKKyAgaWYgKGZvcm1hdCA9PSBHQ1JZTVBJX0ZNVF9TVEQpCisgICAgeworICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcyA9IGJ1ZmZlcjsKKworICAgICAgYSA9IHNlY3VyZT8gbXBpX2FsbG9jX3NlY3VyZSAoKGxlbitCWVRFU19QRVJfTVBJX0xJTUItMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9CWVRFU19QRVJfTVBJX0xJTUIpCisgICAgICAgICAgICAgICAgOiBtcGlfYWxsb2MgKChsZW4rQllURVNfUEVSX01QSV9MSU1CLTEpL0JZVEVTX1BFUl9NUElfTElNQik7CisgICAgICBpZiAobGVuKQorICAgICAgICB7IAorICAgICAgICAgIGEtPnNpZ24gPSAhISgqcyAmIDB4ODApOworICAgICAgICAgIGlmIChhLT5zaWduKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBGSVhNRTogd2UgaGF2ZSB0byBjb252ZXJ0IGZyb20gMmNvbXBsIHRvIG1hZ25pdHVkZSBmb3JtYXQgKi8KKyAgICAgICAgICAgICAgbXBpX2ZyZWUgKGEpOworICAgICAgICAgICAgICByZXR1cm4gZ2NyeV9lcnJvciAoR1BHX0VSUl9JTlRFUk5BTCk7CisJICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBfZ2NyeV9tcGlfc2V0X2J1ZmZlciAoYSwgcywgbGVuLCAwKTsKKwl9CisgICAgICBpZiAocmV0X21waSkKKyAgICAgICAgeworICAgICAgICAgIG1waV9ub3JtYWxpemUgKCBhICk7CisgICAgICAgICAgKnJldF9tcGkgPSBhOworCX0KKyAgICAgIGVsc2UKKyAgICAgICAgbXBpX2ZyZWUoYSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGVsc2UgaWYgKGZvcm1hdCA9PSBHQ1JZTVBJX0ZNVF9VU0cpCisgICAgeworICAgICAgYSA9IHNlY3VyZT8gbXBpX2FsbG9jX3NlY3VyZSAoKGxlbitCWVRFU19QRVJfTVBJX0xJTUItMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9CWVRFU19QRVJfTVBJX0xJTUIpCisgICAgICAgICAgICAgICAgOiBtcGlfYWxsb2MgKChsZW4rQllURVNfUEVSX01QSV9MSU1CLTEpL0JZVEVTX1BFUl9NUElfTElNQik7CisKKyAgICAgIGlmIChsZW4pCisgICAgICAgIF9nY3J5X21waV9zZXRfYnVmZmVyIChhLCBidWZmZXIsIGxlbiwgMCk7CisgICAgICBpZiAocmV0X21waSkKKyAgICAgICAgeworICAgICAgICAgIG1waV9ub3JtYWxpemUgKCBhICk7CisgICAgICAgICAgKnJldF9tcGkgPSBhOworCX0KKyAgICAgIGVsc2UKKyAgICAgICAgbXBpX2ZyZWUoYSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGVsc2UgaWYgKGZvcm1hdCA9PSBHQ1JZTVBJX0ZNVF9QR1ApCisgICAgeworICAgICAgYSA9IG1waV9yZWFkX2Zyb21fYnVmZmVyIChidWZmZXIsICZsZW4sIHNlY3VyZSk7CisgICAgICBpZiAobnNjYW5uZWQpCisgICAgICAgICpuc2Nhbm5lZCA9IGxlbjsKKyAgICAgIGlmIChyZXRfbXBpICYmIGEpCisgICAgICAgIHsKKyAgICAgICAgICBtcGlfbm9ybWFsaXplIChhKTsKKyAgICAgICAgICAqcmV0X21waSA9IGE7CisJfQorICAgICAgZWxzZSBpZiAoYSkKKyAgICAgICAgeworICAgICAgICAgIG1waV9mcmVlKGEpOworICAgICAgICAgIGEgPSBOVUxMOworICAgICAgICB9CisgICAgICByZXR1cm4gYT8gMCA6IGdjcnlfZXJyb3IgKEdQR19FUlJfSU5WX09CSik7CisgICAgfQorICBlbHNlIGlmIChmb3JtYXQgPT0gR0NSWU1QSV9GTVRfU1NIKQorICAgIHsKKyAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnMgPSBidWZmZXI7CisgICAgICBzaXplX3QgbjsKKyAgICAgIAorICAgICAgaWYgKGxlbiAmJiBsZW4gPCA0KQorICAgICAgICByZXR1cm4gZ2NyeV9lcnJvciAoR1BHX0VSUl9UT09fU0hPUlQpOworCisgICAgICBuID0gKHNbMF0gPDwgMjQgfCBzWzFdIDw8IDE2IHwgc1syXSA8PCA4IHwgc1szXSk7CisgICAgICBzICs9IDQ7IAorICAgICAgaWYgKGxlbikKKyAgICAgICAgbGVuIC09IDQ7CisgICAgICBpZiAobGVuICYmIG4gPiBsZW4pCisgICAgICAgIHJldHVybiBnY3J5X2Vycm9yIChHUEdfRVJSX1RPT19MQVJHRSk7CisKKyAgICAgIGEgPSBzZWN1cmU/IG1waV9hbGxvY19zZWN1cmUgKChuK0JZVEVTX1BFUl9NUElfTElNQi0xKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL0JZVEVTX1BFUl9NUElfTElNQikKKyAgICAgICAgICAgICAgICA6IG1waV9hbGxvYyAoKG4rQllURVNfUEVSX01QSV9MSU1CLTEpL0JZVEVTX1BFUl9NUElfTElNQik7CisgICAgICBpZiAobikKKyAgICAgICAgeworICAgICAgICAgIGEtPnNpZ24gPSAhISgqcyAmIDB4ODApOworICAgICAgICAgIGlmIChhLT5zaWduKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBGSVhNRTogd2UgaGF2ZSB0byBjb252ZXJ0IGZyb20gMmNvbXBsIHRvIG1hZ25pdHVkZSBmb3JtYXQgKi8KKyAgICAgICAgICAgICAgbXBpX2ZyZWUoYSk7CisgICAgICAgICAgICAgIHJldHVybiBnY3J5X2Vycm9yIChHUEdfRVJSX0lOVEVSTkFMKTsKKwkgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9nY3J5X21waV9zZXRfYnVmZmVyKCBhLCBzLCBuLCAwICk7CisJfQorICAgICAgaWYgKG5zY2FubmVkKQorICAgICAgICAqbnNjYW5uZWQgPSBuKzQ7CisgICAgICBpZiAocmV0X21waSkKKyAgICAgICAgeworICAgICAgICAgIG1waV9ub3JtYWxpemUgKCBhICk7CisgICAgICAgICAgKnJldF9tcGkgPSBhOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIG1waV9mcmVlKGEpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBlbHNlIGlmIChmb3JtYXQgPT0gR0NSWU1QSV9GTVRfSEVYKQorICAgIHsKKyAgICAgIC8qIFdlIGNhbiBvbmx5IGhhbmRsZSBDIHN0cmluZ3MgZm9yIG5vdy4gICovCisgICAgICBpZiAoYnVmbGVuKQorICAgICAgICByZXR1cm4gZ2NyeV9lcnJvciAoR1BHX0VSUl9JTlZfQVJHKTsgCisKKyAgICAgIGEgPSBzZWN1cmU/IG1waV9hbGxvY19zZWN1cmUgKDApIDogbXBpX2FsbG9jKDApOworICAgICAgaWYgKG1waV9mcm9tc3RyIChhLCAoY29uc3QgY2hhciAqKWJ1ZmZlcikpCisgICAgICAgIHsKKyAgICAgICAgICBtcGlfZnJlZSAoYSk7CisgICAgICAgICAgcmV0dXJuIGdjcnlfZXJyb3IgKEdQR19FUlJfSU5WX09CSik7CisgICAgICAgIH0KKyAgICAgIGlmIChyZXRfbXBpKSAKKyAgICAgICAgeworICAgICAgICAgIG1waV9ub3JtYWxpemUgKCBhICk7CisgICAgICAgICAgKnJldF9tcGkgPSBhOworCX0KKyAgICAgIGVsc2UKKyAgICAgICAgbXBpX2ZyZWUoYSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gZ2NyeV9lcnJvciAoR1BHX0VSUl9JTlZfQVJHKTsKK30KKworCisvKiBDb252ZXJ0IHRoZSBiaWcgaW50ZWdlciBBIGludG8gdGhlIGV4dGVybmFsIHJlcHJlc2VudGF0aW9uCisgICBkZXNjcmliZWQgYnkgRk9STUFUIGFuZCBzdG9yZSBpdCBpbiB0aGUgcHJvdmlkZWQgQlVGRkVSIHdoaWNoIGhhcworICAgYmVlbiBhbGxvY2F0ZWQgYnkgdGhlIHVzZXIgd2l0aCBhIHNpemUgb2YgQlVGTEVOIGJ5dGVzLiAgTldSSVRURU4KKyAgIHJlY2VpdmVzIHRoZSBhY3R1YWwgbGVuZ3RoIG9mIHRoZSBleHRlcm5hbCByZXByZXNlbnRhdGlvbiB1bmxlc3MgaXQKKyAgIGhhcyBiZWVuIHBhc3NlZCBhcyBOVUxMLiAgQlVGRkVSIG1heSBiZSBOVUxMIHRvIHF1ZXJ5IHRoZSByZXF1aXJlZAorICAgbGVuZ3RoLiAgKi8KK2djcnlfZXJyb3JfdAorZ2NyeV9tcGlfcHJpbnQgKGVudW0gZ2NyeV9tcGlfZm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpidWZmZXIsIHNpemVfdCBidWZsZW4sCisgICAgICAgICAgICAgICAgc2l6ZV90ICpud3JpdHRlbiwgc3RydWN0IGdjcnlfbXBpICphKQoreworICB1bnNpZ25lZCBpbnQgbmJpdHMgPSBtcGlfZ2V0X25iaXRzIChhKTsKKyAgc2l6ZV90IGxlbjsKKyAgc2l6ZV90IGR1bW15X253cml0dGVuOworICAKKyAgaWYgKCFud3JpdHRlbikKKyAgICBud3JpdHRlbiA9ICZkdW1teV9ud3JpdHRlbjsKKworICBsZW4gPSBidWZsZW47CisgICpud3JpdHRlbiA9IDA7CisgIGlmIChmb3JtYXQgPT0gR0NSWU1QSV9GTVRfU1REKSAKKyAgICB7CisgICAgICB1bnNpZ25lZCBjaGFyICp0bXA7CisgICAgICBpbnQgZXh0cmEgPSAwOworICAgICAgdW5zaWduZWQgaW50IG47CisgICAgICAKKyAgICAgIGlmIChhLT5zaWduKQorICAgICAgICByZXR1cm4gZ2NyeV9lcnJvciAoR1BHX0VSUl9JTlRFUk5BTCk7IC8qIENhbid0IGhhbmRsZSBpdCB5ZXQuICovCisKKyAgICAgIHRtcCA9IF9nY3J5X21waV9nZXRfYnVmZmVyIChhLCAmbiwgTlVMTCk7CisgICAgICBpZiAoIXRtcCkKKyAgICAgICAgcmV0dXJuIGdwZ19lcnJvcl9mcm9tX3N5c2Vycm9yICgpOworICAgICAgaWYgKG4gJiYgKCp0bXAgJiAweDgwKSkKKyAgICAgICAgeworICAgICAgICAgIG4rKzsKKyAgICAgICAgICBleHRyYT0xOworCX0KKyAgICAgIAorICAgICAgaWYgKGJ1ZmZlciAmJiBuID4gbGVuKQorICAgICAgICB7CisgICAgICAgICAgLyogVGhlIHByb3ZpZGVkIGJ1ZmZlciBpcyB0b28gc2hvcnQuICovCisgICAgICAgICAgZ2NyeV9mcmVlICh0bXApOworICAgICAgICAgIHJldHVybiBnY3J5X2Vycm9yIChHUEdfRVJSX1RPT19TSE9SVCk7ICAKKwl9CisgICAgICBpZiAoYnVmZmVyKQorICAgICAgICB7CisgICAgICAgICAgdW5zaWduZWQgY2hhciAqcyA9IGJ1ZmZlcjsKKworICAgICAgICAgIGlmIChleHRyYSkKKyAgICAgICAgICAgICpzKysgPSAwOworICAgICAgICAgIG1lbWNweSAocywgdG1wLCBuLWV4dHJhKTsKKwl9CisgICAgICBnY3J5X2ZyZWUodG1wKTsKKyAgICAgICpud3JpdHRlbiA9IG47CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGVsc2UgaWYgKGZvcm1hdCA9PSBHQ1JZTVBJX0ZNVF9VU0cpCisgICAgeworICAgICAgdW5zaWduZWQgaW50IG4gPSAobmJpdHMgKyA3KS84OworCisgICAgICAvKiBOb3RlOiAgV2UgaWdub3JlIHRoZSBzaWduIGZvciB0aGlzIGZvcm1hdC4gICovCisgICAgICAvKiBGSVhNRTogZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgd2Ugc2hvdWxkIHB1dCB0aGlzIGludG8KKwkgbXBpX2FwcmludCBiZWNhdXNlIHdlIGNhbiB0aGVuIHVzZSB0aGUgYnVmZmVyIGRpcmVjdGx5LiAgKi8KKyAgICAgIGlmIChidWZmZXIgJiYgbiA+IGxlbikKKyAgICAgICAgcmV0dXJuIGdjcnlfZXJyb3IgKEdQR19FUlJfVE9PX1NIT1JUKTsKKyAgICAgIGlmIChidWZmZXIpCisgICAgICAgIHsKKyAgICAgICAgICB1bnNpZ25lZCBjaGFyICp0bXA7CisKKyAgICAgICAgICB0bXAgPSBfZ2NyeV9tcGlfZ2V0X2J1ZmZlciAoYSwgJm4sIE5VTEwpOworICAgICAgICAgIGlmICghdG1wKQorICAgICAgICAgICAgcmV0dXJuIGdwZ19lcnJvcl9mcm9tX3N5c2Vycm9yICgpOworICAgICAgICAgIG1lbWNweSAoYnVmZmVyLCB0bXAsIG4pOworICAgICAgICAgIGdjcnlfZnJlZSAodG1wKTsKKwl9CisgICAgICAqbndyaXR0ZW4gPSBuOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBlbHNlIGlmIChmb3JtYXQgPT0gR0NSWU1QSV9GTVRfUEdQKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGludCBuID0gKG5iaXRzICsgNykvODsKKyAgICAgIAorICAgICAgLyogVGhlIFBHUCBmb3JtYXQgY2FuIG9ubHkgaGFuZGxlIHVuc2lnbmVkIGludGVnZXJzLiAgKi8KKyAgICAgIGlmKCBhLT5zaWduICkKKyAgICAgICAgcmV0dXJuIGdjcnlfZXJyb3IgKEdQR19FUlJfSU5WX0FSRyk7IAorCisgICAgICBpZiAoYnVmZmVyICYmIG4rMiA+IGxlbikKKyAgICAgICAgcmV0dXJuIGdjcnlfZXJyb3IgKEdQR19FUlJfVE9PX1NIT1JUKTsKKworICAgICAgaWYgKGJ1ZmZlcikKKyAgICAgICAgeworICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnRtcDsKKyAgICAgICAgICB1bnNpZ25lZCBjaGFyICpzID0gYnVmZmVyOworCisgICAgICAgICAgc1swXSA9IG5iaXRzID4+IDg7CisgICAgICAgICAgc1sxXSA9IG5iaXRzOworICAgICAgICAgIAorICAgICAgICAgIHRtcCA9IF9nY3J5X21waV9nZXRfYnVmZmVyIChhLCAmbiwgTlVMTCk7CisgICAgICAgICAgaWYgKCF0bXApCisgICAgICAgICAgICByZXR1cm4gZ3BnX2Vycm9yX2Zyb21fc3lzZXJyb3IgKCk7CisgICAgICAgICAgbWVtY3B5IChzKzIsIHRtcCwgbik7CisgICAgICAgICAgZ2NyeV9mcmVlICh0bXApOworCX0KKyAgICAgICpud3JpdHRlbiA9IG4rMjsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgZWxzZSBpZiAoZm9ybWF0ID09IEdDUllNUElfRk1UX1NTSCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBjaGFyICp0bXA7CisgICAgICBpbnQgZXh0cmEgPSAwOworICAgICAgdW5zaWduZWQgaW50IG47CisgICAgICAKKyAgICAgIGlmIChhLT5zaWduKQorICAgICAgICByZXR1cm4gZ2NyeV9lcnJvciAoR1BHX0VSUl9JTlRFUk5BTCk7IC8qIENhbid0IGhhbmRsZSBpdCB5ZXQuICAqLworICAgICAgCisgICAgICB0bXAgPSBfZ2NyeV9tcGlfZ2V0X2J1ZmZlciAoYSwgJm4sIE5VTEwpOworICAgICAgaWYgKCF0bXApCisgICAgICAgIHJldHVybiBncGdfZXJyb3JfZnJvbV9zeXNlcnJvciAoKTsKKyAgICAgIGlmIChuICYmICgqdG1wICYgMHg4MCkpCisgICAgICAgIHsKKyAgICAgICAgICBuKys7CisgICAgICAgICAgZXh0cmE9MTsKKwl9CisKKyAgICAgIGlmIChidWZmZXIgJiYgbis0ID4gbGVuKQorICAgICAgICB7CisgICAgICAgICAgZ2NyeV9mcmVlKHRtcCk7CisgICAgICAgICAgcmV0dXJuIGdjcnlfZXJyb3IgKEdQR19FUlJfVE9PX1NIT1JUKTsKKwl9CisKKyAgICAgIGlmIChidWZmZXIpCisgICAgICAgIHsKKyAgICAgICAgICB1bnNpZ25lZCBjaGFyICpzID0gYnVmZmVyOworICAgICAgICAgIAorICAgICAgICAgICpzKysgPSBuID4+IDI0OworICAgICAgICAgICpzKysgPSBuID4+IDE2OworICAgICAgICAgICpzKysgPSBuID4+IDg7CisgICAgICAgICAgKnMrKyA9IG47CisgICAgICAgICAgaWYgKGV4dHJhKQorICAgICAgICAgICAgKnMrKyA9IDA7CisgICAgICAgICAgCisgICAgICAgICAgbWVtY3B5IChzLCB0bXAsIG4tZXh0cmEpOworCX0KKyAgICAgIGdjcnlfZnJlZSAodG1wKTsKKyAgICAgICpud3JpdHRlbiA9IDQrbjsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgZWxzZSBpZiAoZm9ybWF0ID09IEdDUllNUElfRk1UX0hFWCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBjaGFyICp0bXA7CisgICAgICBpbnQgaTsKKyAgICAgIGludCBleHRyYSA9IDA7CisgICAgICB1bnNpZ25lZCBpbnQgbiA9IDA7CisgICAgICAKKyAgICAgIHRtcCA9IF9nY3J5X21waV9nZXRfYnVmZmVyIChhLCAmbiwgTlVMTCk7CisgICAgICBpZiAoIXRtcCkKKyAgICAgICAgcmV0dXJuIGdwZ19lcnJvcl9mcm9tX3N5c2Vycm9yICgpOworICAgICAgaWYgKCFuIHx8ICgqdG1wICYgMHg4MCkpCisgICAgICAgIGV4dHJhID0gMjsKKworICAgICAgaWYgKGJ1ZmZlciAmJiAyKm4gKyBleHRyYSArICEhYS0+c2lnbiArIDEgPiBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICBnY3J5X2ZyZWUodG1wKTsKKyAgICAgICAgICByZXR1cm4gZ2NyeV9lcnJvciAoR1BHX0VSUl9UT09fU0hPUlQpOworCX0KKyAgICAgIGlmIChidWZmZXIpCisgICAgICAgIHsKKyAgICAgICAgICB1bnNpZ25lZCBjaGFyICpzID0gYnVmZmVyOworCisgICAgICAgICAgaWYgKGEtPnNpZ24pCisgICAgICAgICAgICAqcysrID0gJy0nOworICAgICAgICAgIGlmIChleHRyYSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgKnMrKyA9ICcwJzsKKyAgICAgICAgICAgICAgKnMrKyA9ICcwJzsKKwkgICAgfQorICAgICAgICAgIAorICAgICAgICAgIGZvciAoaT0wOyBpIDwgbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYyA9IHRtcFtpXTsKKworICAgICAgICAgICAgICAqcysrID0gKGMgPj4gNCkgPCAxMD8gJzAnKyhjPj40KSA6ICdBJysoYz4+NCktMTAgOworICAgICAgICAgICAgICBjICY9IDE1OworICAgICAgICAgICAgICAqcysrID0gYyA8IDEwPyAnMCcrYyA6ICdBJytjLTEwIDsKKwkgICAgfQorICAgICAgICAgICpzKysgPSAwOworICAgICAgICAgICpud3JpdHRlbiA9IHMgLSBidWZmZXI7CisJfQorICAgICAgZWxzZSAKKyAgICAgICAgeworICAgICAgICAgICpud3JpdHRlbiA9IDIqbiArIGV4dHJhICsgISFhLT5zaWduICsgMTsKKwl9CisgICAgICBnY3J5X2ZyZWUgKHRtcCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gZ2NyeV9lcnJvciAoR1BHX0VSUl9JTlZfQVJHKTsKK30KKworCisvKgorICogTGlrZSBnY3J5X21waV9wcmludCBidXQgdGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgdGhlIGJ1ZmZlciBpdHNlbGYuCisgKiBUaGUgY2FsbGVyIGhhcyB0byBzdXBwbHkgdGhlIGFkZHJlc3Mgb2YgYSBwb2ludGVyLiAgTldSSVRURU4gbWF5IGJlCisgKiBOVUxMLgorICovCitnY3J5X2Vycm9yX3QKK2djcnlfbXBpX2FwcmludCAoZW51bSBnY3J5X21waV9mb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICoqYnVmZmVyLCBzaXplX3QgKm53cml0dGVuLAorCQkgc3RydWN0IGdjcnlfbXBpICphKQoreworICBzaXplX3QgbjsKKyAgZ2NyeV9lcnJvcl90IHJjOworICAKKyAgKmJ1ZmZlciA9IE5VTEw7CisgIHJjID0gZ2NyeV9tcGlfcHJpbnQgKGZvcm1hdCwgTlVMTCwgMCwgJm4sIGEpOworICBpZiAocmMpCisgICAgcmV0dXJuIHJjOworCisgICpidWZmZXIgPSBtcGlfaXNfc2VjdXJlKGEpID8gZ2NyeV9tYWxsb2Nfc2VjdXJlIChuKSA6IGdjcnlfbWFsbG9jIChuKTsKKyAgaWYgKCEqYnVmZmVyKQorICAgIHJldHVybiBncGdfZXJyb3JfZnJvbV9zeXNlcnJvciAoKTsKKyAgcmMgPSBnY3J5X21waV9wcmludCggZm9ybWF0LCAqYnVmZmVyLCBuLCAmbiwgYSApOworICBpZiAocmMpCisgICAgeworICAgICAgZ2NyeV9mcmVlKCpidWZmZXIpOworICAgICAgKmJ1ZmZlciA9IE5VTEw7CisgICAgfQorICBlbHNlIGlmIChud3JpdHRlbikKKyAgICAqbndyaXR0ZW4gPSBuOworICByZXR1cm4gcmM7Cit9CisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvbXBpaC1kaXYuYyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvbXBpaC1kaXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDFlMjA1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9tcGloLWRpdi5jCkBAIC0wLDAgKzEsNTM1IEBACisvKiBtcGloLWRpdi5jICAtICBNUEkgaGVscGVyIGZ1bmN0aW9ucworICogQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk2LCAxOTk4LCAyMDAwLAorICogICAgICAgICAgICAgICAyMDAxLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqCisgKiBOb3RlOiBUaGlzIGNvZGUgaXMgaGVhdmlseSBiYXNlZCBvbiB0aGUgR05VIE1QIExpYnJhcnkuCisgKgkgQWN0dWFsbHkgaXQncyB0aGUgc2FtZSBjb2RlIHdpdGggb25seSBtaW5vciBjaGFuZ2VzIGluIHRoZQorICoJIHdheSB0aGUgZGF0YSBpcyBzdG9yZWQ7IHRoaXMgaXMgdG8gc3VwcG9ydCB0aGUgYWJzdHJhY3Rpb24KKyAqCSBvZiBhbiBvcHRpb25hbCBzZWN1cmUgbWVtb3J5IGFsbG9jYXRpb24gd2hpY2ggbWF5IGJlIHVzZWQKKyAqCSB0byBhdm9pZCByZXZlYWxpbmcgb2Ygc2Vuc2l0aXZlIGRhdGEgZHVlIHRvIHBhZ2luZyBldGMuCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAibXBpLWludGVybmFsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworI2lmbmRlZiBVTVVMX1RJTUUKKyNkZWZpbmUgVU1VTF9USU1FIDEKKyNlbmRpZgorI2lmbmRlZiBVRElWX1RJTUUKKyNkZWZpbmUgVURJVl9USU1FIFVNVUxfVElNRQorI2VuZGlmCisKKy8qIEZJWE1FOiBXZSBzaG91bGQgYmUgdXNpbmcgaW52ZXJ0X2xpbWIgKG9yIGludmVydF9ub3JtYWxpemVkX2xpbWIpCisgKiBoZXJlIChub3QgdWRpdl9xcm5uZCkuCisgKi8KKworbXBpX2xpbWJfdAorX2djcnlfbXBpaF9tb2RfMShtcGlfcHRyX3QgZGl2aWRlbmRfcHRyLCBtcGlfc2l6ZV90IGRpdmlkZW5kX3NpemUsCisJCQkJICAgICAgbXBpX2xpbWJfdCBkaXZpc29yX2xpbWIpCit7CisgICAgbXBpX3NpemVfdCBpOworICAgIG1waV9saW1iX3QgbjEsIG4wLCByOworICAgIGludCBkdW1teTsKKworICAgIC8qIEJvdGNoOiBTaG91bGQgdGhpcyBiZSBoYW5kbGVkIGF0IGFsbD8gIFJlbHkgb24gY2FsbGVycz8JKi8KKyAgICBpZiggIWRpdmlkZW5kX3NpemUgKQorCXJldHVybiAwOworCisgICAgLyogSWYgbXVsdGlwbGljYXRpb24gaXMgbXVjaCBmYXN0ZXIgdGhhbiBkaXZpc2lvbiwgYW5kIHRoZQorICAgICAqIGRpdmlkZW5kIGlzIGxhcmdlLCBwcmUtaW52ZXJ0IHRoZSBkaXZpc29yLCBhbmQgdXNlCisgICAgICogb25seSBtdWx0aXBsaWNhdGlvbnMgaW4gdGhlIGlubmVyIGxvb3AuCisgICAgICoKKyAgICAgKiBUaGlzIHRlc3Qgc2hvdWxkIGJlIHJlYWQ6CisgICAgICoJIERvZXMgaXQgZXZlciBoZWxwIHRvIHVzZSB1ZGl2X3Fybm5kX3ByZWludj8KKyAgICAgKgkgICAmJiBEb2VzIHdoYXQgd2Ugc2F2ZSBjb21wZW5zYXRlIGZvciB0aGUgaW52ZXJzaW9uIG92ZXJoZWFkPworICAgICAqLworICAgIGlmKCBVRElWX1RJTUUgPiAoMiAqIFVNVUxfVElNRSArIDYpCisJJiYgKFVESVZfVElNRSAtICgyICogVU1VTF9USU1FICsgNikpICogZGl2aWRlbmRfc2l6ZSA+IFVESVZfVElNRSApIHsKKwlpbnQgbm9ybWFsaXphdGlvbl9zdGVwczsKKworCWNvdW50X2xlYWRpbmdfemVyb3MoIG5vcm1hbGl6YXRpb25fc3RlcHMsIGRpdmlzb3JfbGltYiApOworCWlmKCBub3JtYWxpemF0aW9uX3N0ZXBzICkgeworCSAgICBtcGlfbGltYl90IGRpdmlzb3JfbGltYl9pbnZlcnRlZDsKKworCSAgICBkaXZpc29yX2xpbWIgPDw9IG5vcm1hbGl6YXRpb25fc3RlcHM7CisKKwkgICAgLyogQ29tcHV0ZSAoMioqMk4gLSAyKipOICogRElWSVNPUl9MSU1CKSAvIERJVklTT1JfTElNQi4gIFRoZQorCSAgICAgKiByZXN1bHQgaXMgYSAoTisxKS1iaXQgYXBwcm94aW1hdGlvbiB0byAxL0RJVklTT1JfTElNQiwgd2l0aCB0aGUKKwkgICAgICogbW9zdCBzaWduaWZpY2FudCBiaXQgKHdpdGggd2VpZ2h0IDIqKk4pIGltcGxpY2l0LgorCSAgICAgKgorCSAgICAgKiBTcGVjaWFsIGNhc2UgZm9yIERJVklTT1JfTElNQiA9PSAxMDAuLi4wMDAuCisJICAgICAqLworCSAgICBpZiggIShkaXZpc29yX2xpbWIgPDwgMSkgKQorCQlkaXZpc29yX2xpbWJfaW52ZXJ0ZWQgPSB+KG1waV9saW1iX3QpMDsKKwkgICAgZWxzZQorCQl1ZGl2X3Fybm5kKGRpdmlzb3JfbGltYl9pbnZlcnRlZCwgZHVtbXksCisJCQkgICAtZGl2aXNvcl9saW1iLCAwLCBkaXZpc29yX2xpbWIpOworCisJICAgIG4xID0gZGl2aWRlbmRfcHRyW2RpdmlkZW5kX3NpemUgLSAxXTsKKwkgICAgciA9IG4xID4+IChCSVRTX1BFUl9NUElfTElNQiAtIG5vcm1hbGl6YXRpb25fc3RlcHMpOworCisJICAgIC8qIFBvc3NpYmxlIG9wdGltaXphdGlvbjoKKwkgICAgICogaWYgKHIgPT0gMAorCSAgICAgKiAmJiBkaXZpc29yX2xpbWIgPiAoKG4xIDw8IG5vcm1hbGl6YXRpb25fc3RlcHMpCisJICAgICAqCQkgICAgICAgfCAoZGl2aWRlbmRfcHRyW2RpdmlkZW5kX3NpemUgLSAyXSA+PiAuLi4pKSkKKwkgICAgICogLi4ub25lIGRpdmlzaW9uIGxlc3MuLi4KKwkgICAgICovCisJICAgIGZvciggaSA9IGRpdmlkZW5kX3NpemUgLSAyOyBpID49IDA7IGktLSkgeworCQluMCA9IGRpdmlkZW5kX3B0cltpXTsKKwkJVURJVl9RUk5ORF9QUkVJTlYoZHVtbXksIHIsIHIsCisJCQkJICAgKChuMSA8PCBub3JtYWxpemF0aW9uX3N0ZXBzKQorCQkJICB8IChuMCA+PiAoQklUU19QRVJfTVBJX0xJTUIgLSBub3JtYWxpemF0aW9uX3N0ZXBzKSkpLAorCQkJICBkaXZpc29yX2xpbWIsIGRpdmlzb3JfbGltYl9pbnZlcnRlZCk7CisJCW4xID0gbjA7CisJICAgIH0KKwkgICAgVURJVl9RUk5ORF9QUkVJTlYoZHVtbXksIHIsIHIsCisJCQkgICAgICBuMSA8PCBub3JtYWxpemF0aW9uX3N0ZXBzLAorCQkJICAgICAgZGl2aXNvcl9saW1iLCBkaXZpc29yX2xpbWJfaW52ZXJ0ZWQpOworCSAgICByZXR1cm4gciA+PiBub3JtYWxpemF0aW9uX3N0ZXBzOworCX0KKwllbHNlIHsKKwkgICAgbXBpX2xpbWJfdCBkaXZpc29yX2xpbWJfaW52ZXJ0ZWQ7CisKKwkgICAgLyogQ29tcHV0ZSAoMioqMk4gLSAyKipOICogRElWSVNPUl9MSU1CKSAvIERJVklTT1JfTElNQi4gIFRoZQorCSAgICAgKiByZXN1bHQgaXMgYSAoTisxKS1iaXQgYXBwcm94aW1hdGlvbiB0byAxL0RJVklTT1JfTElNQiwgd2l0aCB0aGUKKwkgICAgICogbW9zdCBzaWduaWZpY2FudCBiaXQgKHdpdGggd2VpZ2h0IDIqKk4pIGltcGxpY2l0LgorCSAgICAgKgorCSAgICAgKiBTcGVjaWFsIGNhc2UgZm9yIERJVklTT1JfTElNQiA9PSAxMDAuLi4wMDAuCisJICAgICAqLworCSAgICBpZiggIShkaXZpc29yX2xpbWIgPDwgMSkgKQorCQlkaXZpc29yX2xpbWJfaW52ZXJ0ZWQgPSB+KG1waV9saW1iX3QpMDsKKwkgICAgZWxzZQorCQl1ZGl2X3Fybm5kKGRpdmlzb3JfbGltYl9pbnZlcnRlZCwgZHVtbXksCisJCQkgICAgLWRpdmlzb3JfbGltYiwgMCwgZGl2aXNvcl9saW1iKTsKKworCSAgICBpID0gZGl2aWRlbmRfc2l6ZSAtIDE7CisJICAgIHIgPSBkaXZpZGVuZF9wdHJbaV07CisKKwkgICAgaWYoIHIgPj0gZGl2aXNvcl9saW1iICkKKwkJciA9IDA7CisJICAgIGVsc2UKKwkJaS0tOworCisJICAgIGZvciggOyBpID49IDA7IGktLSkgeworCQluMCA9IGRpdmlkZW5kX3B0cltpXTsKKwkJVURJVl9RUk5ORF9QUkVJTlYoZHVtbXksIHIsIHIsCisJCQkJICBuMCwgZGl2aXNvcl9saW1iLCBkaXZpc29yX2xpbWJfaW52ZXJ0ZWQpOworCSAgICB9CisJICAgIHJldHVybiByOworCX0KKyAgICB9CisgICAgZWxzZSB7CisJaWYoIFVESVZfTkVFRFNfTk9STUFMSVpBVElPTiApIHsKKwkgICAgaW50IG5vcm1hbGl6YXRpb25fc3RlcHM7CisKKwkgICAgY291bnRfbGVhZGluZ196ZXJvcyhub3JtYWxpemF0aW9uX3N0ZXBzLCBkaXZpc29yX2xpbWIpOworCSAgICBpZiggbm9ybWFsaXphdGlvbl9zdGVwcyApIHsKKwkJZGl2aXNvcl9saW1iIDw8PSBub3JtYWxpemF0aW9uX3N0ZXBzOworCisJCW4xID0gZGl2aWRlbmRfcHRyW2RpdmlkZW5kX3NpemUgLSAxXTsKKwkJciA9IG4xID4+IChCSVRTX1BFUl9NUElfTElNQiAtIG5vcm1hbGl6YXRpb25fc3RlcHMpOworCisJCS8qIFBvc3NpYmxlIG9wdGltaXphdGlvbjoKKwkJICogaWYgKHIgPT0gMAorCQkgKiAmJiBkaXZpc29yX2xpbWIgPiAoKG4xIDw8IG5vcm1hbGl6YXRpb25fc3RlcHMpCisJCSAqCQkgICB8IChkaXZpZGVuZF9wdHJbZGl2aWRlbmRfc2l6ZSAtIDJdID4+IC4uLikpKQorCQkgKiAuLi5vbmUgZGl2aXNpb24gbGVzcy4uLgorCQkgKi8KKwkJZm9yKGkgPSBkaXZpZGVuZF9zaXplIC0gMjsgaSA+PSAwOyBpLS0pIHsKKwkJICAgIG4wID0gZGl2aWRlbmRfcHRyW2ldOworCQkgICAgdWRpdl9xcm5uZCAoZHVtbXksIHIsIHIsCisJCQkJKChuMSA8PCBub3JtYWxpemF0aW9uX3N0ZXBzKQorCQkJIHwgKG4wID4+IChCSVRTX1BFUl9NUElfTElNQiAtIG5vcm1hbGl6YXRpb25fc3RlcHMpKSksCisJCQkgZGl2aXNvcl9saW1iKTsKKwkJICAgIG4xID0gbjA7CisJCX0KKwkJdWRpdl9xcm5uZCAoZHVtbXksIHIsIHIsCisJCQkgICAgbjEgPDwgbm9ybWFsaXphdGlvbl9zdGVwcywKKwkJCSAgICBkaXZpc29yX2xpbWIpOworCQlyZXR1cm4gciA+PiBub3JtYWxpemF0aW9uX3N0ZXBzOworCSAgICB9CisJfQorCS8qIE5vIG5vcm1hbGl6YXRpb24gbmVlZGVkLCBlaXRoZXIgYmVjYXVzZSB1ZGl2X3Fybm5kIGRvZXNuJ3QgcmVxdWlyZQorCSAqIGl0LCBvciBiZWNhdXNlIERJVklTT1JfTElNQiBpcyBhbHJlYWR5IG5vcm1hbGl6ZWQuICAqLworCWkgPSBkaXZpZGVuZF9zaXplIC0gMTsKKwlyID0gZGl2aWRlbmRfcHRyW2ldOworCisJaWYociA+PSBkaXZpc29yX2xpbWIpCisJICAgIHIgPSAwOworCWVsc2UKKwkgICAgaS0tOworCisJZm9yKDsgaSA+PSAwOyBpLS0pIHsKKwkgICAgbjAgPSBkaXZpZGVuZF9wdHJbaV07CisJICAgIHVkaXZfcXJubmQgKGR1bW15LCByLCByLCBuMCwgZGl2aXNvcl9saW1iKTsKKwl9CisJcmV0dXJuIHI7CisgICAgfQorfQorCisvKiBEaXZpZGUgbnVtIChOUC9OU0laRSkgYnkgZGVuIChEUC9EU0laRSkgYW5kIHdyaXRlCisgKiB0aGUgTlNJWkUtRFNJWkUgbGVhc3Qgc2lnbmlmaWNhbnQgcXVvdGllbnQgbGltYnMgYXQgUVAKKyAqIGFuZCB0aGUgRFNJWkUgbG9uZyByZW1haW5kZXIgYXQgTlAuCUlmIFFFWFRSQV9MSU1CUyBpcworICogbm9uLXplcm8sIGdlbmVyYXRlIHRoYXQgbWFueSBmcmFjdGlvbiBiaXRzIGFuZCBhcHBlbmQgdGhlbSBhZnRlciB0aGUKKyAqIG90aGVyIHF1b3RpZW50IGxpbWJzLgorICogUmV0dXJuIHRoZSBtb3N0IHNpZ25pZmljYW50IGxpbWIgb2YgdGhlIHF1b3RpZW50LCB0aGlzIGlzIGFsd2F5cyAwIG9yIDEuCisgKgorICogUHJlY29uZGl0aW9uczoKKyAqIDAuIE5TSVpFID49IERTSVpFLgorICogMS4gVGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IG9mIHRoZSBkaXZpc29yIG11c3QgYmUgc2V0LgorICogMi4gUVAgbXVzdCBlaXRoZXIgbm90IG92ZXJsYXAgd2l0aCB0aGUgaW5wdXQgb3BlcmFuZHMgYXQgYWxsLCBvcgorICogICAgUVAgKyBEU0laRSA+PSBOUCBtdXN0IGhvbGQgdHJ1ZS4JKFRoaXMgbWVhbnMgdGhhdCBpdCdzCisgKiAgICBwb3NzaWJsZSB0byBwdXQgdGhlIHF1b3RpZW50IGluIHRoZSBoaWdoIHBhcnQgb2YgTlVNLCByaWdodCBhZnRlciB0aGUKKyAqICAgIHJlbWFpbmRlciBpbiBOVU0uCisgKiAzLiBOU0laRSA+PSBEU0laRSwgZXZlbiBpZiBRRVhUUkFfTElNQlMgaXMgbm9uLXplcm8uCisgKi8KKworbXBpX2xpbWJfdAorX2djcnlfbXBpaF9kaXZyZW0oIG1waV9wdHJfdCBxcCwgbXBpX3NpemVfdCBxZXh0cmFfbGltYnMsCisgICAgICAgICAgICAgICAgICAgICAgbXBpX3B0cl90IG5wLCBtcGlfc2l6ZV90IG5zaXplLAorICAgICAgICAgICAgICAgICAgICAgIG1waV9wdHJfdCBkcCwgbXBpX3NpemVfdCBkc2l6ZSkKK3sKKyAgICBtcGlfbGltYl90IG1vc3Rfc2lnbmlmaWNhbnRfcV9saW1iID0gMDsKKworICAgIHN3aXRjaChkc2l6ZSkgeworICAgICAgY2FzZSAwOgorCS8qIFdlIGFyZSBhc2tlZCB0byBkaXZpZGUgYnkgemVybywgc28gZ28gYWhlYWQgYW5kIGRvIGl0ISAgKFRvIG1ha2UKKwkgICB0aGUgY29tcGlsZXIgbm90IHJlbW92ZSB0aGlzIHN0YXRlbWVudCwgcmV0dXJuIHRoZSB2YWx1ZS4pICAqLworCXJldHVybiAxIC8gZHNpemU7CisKKyAgICAgIGNhc2UgMToKKwl7CisJICAgIG1waV9zaXplX3QgaTsKKwkgICAgbXBpX2xpbWJfdCBuMTsKKwkgICAgbXBpX2xpbWJfdCBkOworCisJICAgIGQgPSBkcFswXTsKKwkgICAgbjEgPSBucFtuc2l6ZSAtIDFdOworCisJICAgIGlmKCBuMSA+PSBkICkgeworCQluMSAtPSBkOworCQltb3N0X3NpZ25pZmljYW50X3FfbGltYiA9IDE7CisJICAgIH0KKworCSAgICBxcCArPSBxZXh0cmFfbGltYnM7CisJICAgIGZvciggaSA9IG5zaXplIC0gMjsgaSA+PSAwOyBpLS0pCisJCXVkaXZfcXJubmQoIHFwW2ldLCBuMSwgbjEsIG5wW2ldLCBkICk7CisJICAgIHFwIC09IHFleHRyYV9saW1iczsKKworCSAgICBmb3IoIGkgPSBxZXh0cmFfbGltYnMgLSAxOyBpID49IDA7IGktLSApCisJCXVkaXZfcXJubmQgKHFwW2ldLCBuMSwgbjEsIDAsIGQpOworCisJICAgIG5wWzBdID0gbjE7CisJfQorCWJyZWFrOworCisgICAgICBjYXNlIDI6CisJeworCSAgICBtcGlfc2l6ZV90IGk7CisJICAgIG1waV9saW1iX3QgbjEsIG4wLCBuMjsKKwkgICAgbXBpX2xpbWJfdCBkMSwgZDA7CisKKwkgICAgbnAgKz0gbnNpemUgLSAyOworCSAgICBkMSA9IGRwWzFdOworCSAgICBkMCA9IGRwWzBdOworCSAgICBuMSA9IG5wWzFdOworCSAgICBuMCA9IG5wWzBdOworCisJICAgIGlmKCBuMSA+PSBkMSAmJiAobjEgPiBkMSB8fCBuMCA+PSBkMCkgKSB7CisJCXN1Yl9kZG1tc3MgKG4xLCBuMCwgbjEsIG4wLCBkMSwgZDApOworCQltb3N0X3NpZ25pZmljYW50X3FfbGltYiA9IDE7CisJICAgIH0KKworCSAgICBmb3IoIGkgPSBxZXh0cmFfbGltYnMgKyBuc2l6ZSAtIDIgLSAxOyBpID49IDA7IGktLSApIHsKKwkJbXBpX2xpbWJfdCBxOworCQltcGlfbGltYl90IHI7CisKKwkJaWYoIGkgPj0gcWV4dHJhX2xpbWJzICkKKwkJICAgIG5wLS07CisJCWVsc2UKKwkJICAgIG5wWzBdID0gMDsKKworCQlpZiggbjEgPT0gZDEgKSB7CisJCSAgICAvKiBRIHNob3VsZCBiZSBlaXRoZXIgMTExLi4xMTEgb3IgMTExLi4xMTAuICBOZWVkIHNwZWNpYWwKKwkJICAgICAqIHRyZWF0bWVudCBvZiB0aGlzIHJhcmUgY2FzZSBhcyBub3JtYWwgZGl2aXNpb24gd291bGQKKwkJICAgICAqIGdpdmUgb3ZlcmZsb3cuICAqLworCQkgICAgcSA9IH4obXBpX2xpbWJfdCkwOworCisJCSAgICByID0gbjAgKyBkMTsKKwkJICAgIGlmKCByIDwgZDEgKSB7ICAgLyogQ2FycnkgaW4gdGhlIGFkZGl0aW9uPyAqLworCQkJYWRkX3NzYWFhYSggbjEsIG4wLCByIC0gZDAsIG5wWzBdLCAwLCBkMCApOworCQkJcXBbaV0gPSBxOworCQkJY29udGludWU7CisJCSAgICB9CisJCSAgICBuMSA9IGQwIC0gKGQwICE9IDA/MTowKTsKKwkJICAgIG4wID0gLWQwOworCQl9CisJCWVsc2UgeworCQkgICAgdWRpdl9xcm5uZCAocSwgciwgbjEsIG4wLCBkMSk7CisJCSAgICB1bXVsX3BwbW0gKG4xLCBuMCwgZDAsIHEpOworCQl9CisKKwkJbjIgPSBucFswXTsKKwkgICAgICBxX3Rlc3Q6CisJCWlmKCBuMSA+IHIgfHwgKG4xID09IHIgJiYgbjAgPiBuMikgKSB7CisJCSAgICAvKiBUaGUgZXN0aW1hdGVkIFEgd2FzIHRvbyBsYXJnZS4gICovCisJCSAgICBxLS07CisJCSAgICBzdWJfZGRtbXNzIChuMSwgbjAsIG4xLCBuMCwgMCwgZDApOworCQkgICAgciArPSBkMTsKKwkJICAgIGlmKCByID49IGQxICkgICAgLyogSWYgbm90IGNhcnJ5LCB0ZXN0IFEgYWdhaW4uICAqLworCQkJZ290byBxX3Rlc3Q7CisJCX0KKworCQlxcFtpXSA9IHE7CisJCXN1Yl9kZG1tc3MgKG4xLCBuMCwgciwgbjIsIG4xLCBuMCk7CisJICAgIH0KKwkgICAgbnBbMV0gPSBuMTsKKwkgICAgbnBbMF0gPSBuMDsKKwl9CisJYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisJeworCSAgICBtcGlfc2l6ZV90IGk7CisJICAgIG1waV9saW1iX3QgZFgsIGQxLCBuMDsKKworCSAgICBucCArPSBuc2l6ZSAtIGRzaXplOworCSAgICBkWCA9IGRwW2RzaXplIC0gMV07CisJICAgIGQxID0gZHBbZHNpemUgLSAyXTsKKwkgICAgbjAgPSBucFtkc2l6ZSAtIDFdOworCisJICAgIGlmKCBuMCA+PSBkWCApIHsKKwkJaWYobjAgPiBkWCB8fCBfZ2NyeV9tcGloX2NtcChucCwgZHAsIGRzaXplIC0gMSkgPj0gMCApIHsKKwkJICAgIF9nY3J5X21waWhfc3ViX24obnAsIG5wLCBkcCwgZHNpemUpOworCQkgICAgbjAgPSBucFtkc2l6ZSAtIDFdOworCQkgICAgbW9zdF9zaWduaWZpY2FudF9xX2xpbWIgPSAxOworCQl9CisJICAgIH0KKworCSAgICBmb3IoIGkgPSBxZXh0cmFfbGltYnMgKyBuc2l6ZSAtIGRzaXplIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJbXBpX2xpbWJfdCBxOworCQltcGlfbGltYl90IG4xLCBuMjsKKwkJbXBpX2xpbWJfdCBjeV9saW1iOworCisJCWlmKCBpID49IHFleHRyYV9saW1icyApIHsKKwkJICAgIG5wLS07CisJCSAgICBuMiA9IG5wW2RzaXplXTsKKwkJfQorCQllbHNlIHsKKwkJICAgIG4yID0gbnBbZHNpemUgLSAxXTsKKwkJICAgIE1QTl9DT1BZX0RFQ1IgKG5wICsgMSwgbnAsIGRzaXplIC0gMSk7CisJCSAgICBucFswXSA9IDA7CisJCX0KKworCQlpZiggbjAgPT0gZFggKSB7CisJCSAgICAvKiBUaGlzIG1pZ2h0IG92ZXItZXN0aW1hdGUgcSwgYnV0IGl0J3MgcHJvYmFibHkgbm90IHdvcnRoCisJCSAgICAgKiB0aGUgZXh0cmEgY29kZSBoZXJlIHRvIGZpbmQgb3V0LiAgKi8KKwkJICAgIHEgPSB+KG1waV9saW1iX3QpMDsKKwkJfQorCQllbHNlIHsKKwkJICAgIG1waV9saW1iX3QgcjsKKworCQkgICAgdWRpdl9xcm5uZChxLCByLCBuMCwgbnBbZHNpemUgLSAxXSwgZFgpOworCQkgICAgdW11bF9wcG1tKG4xLCBuMCwgZDEsIHEpOworCisJCSAgICB3aGlsZSggbjEgPiByIHx8IChuMSA9PSByICYmIG4wID4gbnBbZHNpemUgLSAyXSkpIHsKKwkJCXEtLTsKKwkJCXIgKz0gZFg7CisJCQlpZiggciA8IGRYICkgLyogSS5lLiAiY2FycnkgaW4gcHJldmlvdXMgYWRkaXRpb24/IiAqLworCQkJICAgIGJyZWFrOworCQkJbjEgLT0gbjAgPCBkMTsKKwkJCW4wIC09IGQxOworCQkgICAgfQorCQl9CisKKwkJLyogUG9zc2libGUgb3B0aW1pemF0aW9uOiBXZSBhbHJlYWR5IGhhdmUgKHEgKiBuMCkgYW5kICgxICogbjEpCisJCSAqIGFmdGVyIHRoZSBjYWxjdWxhdGlvbiBvZiBxLglUYWtpbmcgYWR2YW50YWdlIG9mIHRoYXQsIHdlCisJCSAqIGNvdWxkIG1ha2UgdGhpcyBsb29wIG1ha2UgdHdvIGl0ZXJhdGlvbnMgbGVzcy4gICovCisJCWN5X2xpbWIgPSBfZ2NyeV9tcGloX3N1Ym11bF8xKG5wLCBkcCwgZHNpemUsIHEpOworCisJCWlmKCBuMiAhPSBjeV9saW1iICkgeworCQkgICAgX2djcnlfbXBpaF9hZGRfbihucCwgbnAsIGRwLCBkc2l6ZSk7CisJCSAgICBxLS07CisJCX0KKworCQlxcFtpXSA9IHE7CisJCW4wID0gbnBbZHNpemUgLSAxXTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICByZXR1cm4gbW9zdF9zaWduaWZpY2FudF9xX2xpbWI7Cit9CisKKworLyoqKioqKioqKioqKioqKioKKyAqIERpdmlkZSAoRElWSURFTkRfUFRSLCxESVZJREVORF9TSVpFKSBieSBESVZJU09SX0xJTUIuCisgKiBXcml0ZSBESVZJREVORF9TSVpFIGxpbWJzIG9mIHF1b3RpZW50IGF0IFFVT1RfUFRSLgorICogUmV0dXJuIHRoZSBzaW5nbGUtbGltYiByZW1haW5kZXIuCisgKiBUaGVyZSBhcmUgbm8gY29uc3RyYWludHMgb24gdGhlIHZhbHVlIG9mIHRoZSBkaXZpc29yLgorICoKKyAqIFFVT1RfUFRSIGFuZCBESVZJREVORF9QVFIgbWlnaHQgcG9pbnQgdG8gdGhlIHNhbWUgbGltYi4KKyAqLworCittcGlfbGltYl90CitfZ2NyeV9tcGloX2Rpdm1vZF8xKCBtcGlfcHRyX3QgcXVvdF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBtcGlfcHRyX3QgZGl2aWRlbmRfcHRyLCBtcGlfc2l6ZV90IGRpdmlkZW5kX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBtcGlfbGltYl90IGRpdmlzb3JfbGltYikKK3sKKyAgICBtcGlfc2l6ZV90IGk7CisgICAgbXBpX2xpbWJfdCBuMSwgbjAsIHI7CisgICAgaW50IGR1bW15OworCisgICAgaWYoICFkaXZpZGVuZF9zaXplICkKKwlyZXR1cm4gMDsKKworICAgIC8qIElmIG11bHRpcGxpY2F0aW9uIGlzIG11Y2ggZmFzdGVyIHRoYW4gZGl2aXNpb24sIGFuZCB0aGUKKyAgICAgKiBkaXZpZGVuZCBpcyBsYXJnZSwgcHJlLWludmVydCB0aGUgZGl2aXNvciwgYW5kIHVzZQorICAgICAqIG9ubHkgbXVsdGlwbGljYXRpb25zIGluIHRoZSBpbm5lciBsb29wLgorICAgICAqCisgICAgICogVGhpcyB0ZXN0IHNob3VsZCBiZSByZWFkOgorICAgICAqIERvZXMgaXQgZXZlciBoZWxwIHRvIHVzZSB1ZGl2X3Fybm5kX3ByZWludj8KKyAgICAgKiAmJiBEb2VzIHdoYXQgd2Ugc2F2ZSBjb21wZW5zYXRlIGZvciB0aGUgaW52ZXJzaW9uIG92ZXJoZWFkPworICAgICAqLworICAgIGlmKCBVRElWX1RJTUUgPiAoMiAqIFVNVUxfVElNRSArIDYpCisJJiYgKFVESVZfVElNRSAtICgyICogVU1VTF9USU1FICsgNikpICogZGl2aWRlbmRfc2l6ZSA+IFVESVZfVElNRSApIHsKKwlpbnQgbm9ybWFsaXphdGlvbl9zdGVwczsKKworCWNvdW50X2xlYWRpbmdfemVyb3MoIG5vcm1hbGl6YXRpb25fc3RlcHMsIGRpdmlzb3JfbGltYiApOworCWlmKCBub3JtYWxpemF0aW9uX3N0ZXBzICkgeworCSAgICBtcGlfbGltYl90IGRpdmlzb3JfbGltYl9pbnZlcnRlZDsKKworCSAgICBkaXZpc29yX2xpbWIgPDw9IG5vcm1hbGl6YXRpb25fc3RlcHM7CisKKwkgICAgLyogQ29tcHV0ZSAoMioqMk4gLSAyKipOICogRElWSVNPUl9MSU1CKSAvIERJVklTT1JfTElNQi4gIFRoZQorCSAgICAgKiByZXN1bHQgaXMgYSAoTisxKS1iaXQgYXBwcm94aW1hdGlvbiB0byAxL0RJVklTT1JfTElNQiwgd2l0aCB0aGUKKwkgICAgICogbW9zdCBzaWduaWZpY2FudCBiaXQgKHdpdGggd2VpZ2h0IDIqKk4pIGltcGxpY2l0LgorCSAgICAgKi8KKwkgICAgLyogU3BlY2lhbCBjYXNlIGZvciBESVZJU09SX0xJTUIgPT0gMTAwLi4uMDAwLiAgKi8KKwkgICAgaWYoICEoZGl2aXNvcl9saW1iIDw8IDEpICkKKwkJZGl2aXNvcl9saW1iX2ludmVydGVkID0gfihtcGlfbGltYl90KTA7CisJICAgIGVsc2UKKwkJdWRpdl9xcm5uZChkaXZpc29yX2xpbWJfaW52ZXJ0ZWQsIGR1bW15LAorCQkJICAgLWRpdmlzb3JfbGltYiwgMCwgZGl2aXNvcl9saW1iKTsKKworCSAgICBuMSA9IGRpdmlkZW5kX3B0cltkaXZpZGVuZF9zaXplIC0gMV07CisJICAgIHIgPSBuMSA+PiAoQklUU19QRVJfTVBJX0xJTUIgLSBub3JtYWxpemF0aW9uX3N0ZXBzKTsKKworCSAgICAvKiBQb3NzaWJsZSBvcHRpbWl6YXRpb246CisJICAgICAqIGlmIChyID09IDAKKwkgICAgICogJiYgZGl2aXNvcl9saW1iID4gKChuMSA8PCBub3JtYWxpemF0aW9uX3N0ZXBzKQorCSAgICAgKgkJICAgICAgIHwgKGRpdmlkZW5kX3B0cltkaXZpZGVuZF9zaXplIC0gMl0gPj4gLi4uKSkpCisJICAgICAqIC4uLm9uZSBkaXZpc2lvbiBsZXNzLi4uCisJICAgICAqLworCSAgICBmb3IoIGkgPSBkaXZpZGVuZF9zaXplIC0gMjsgaSA+PSAwOyBpLS0pIHsKKwkJbjAgPSBkaXZpZGVuZF9wdHJbaV07CisJCVVESVZfUVJOTkRfUFJFSU5WKCBxdW90X3B0cltpICsgMV0sIHIsIHIsCisJCQkJICAgKChuMSA8PCBub3JtYWxpemF0aW9uX3N0ZXBzKQorCQkJIHwgKG4wID4+IChCSVRTX1BFUl9NUElfTElNQiAtIG5vcm1hbGl6YXRpb25fc3RlcHMpKSksCisJCQkgICAgICBkaXZpc29yX2xpbWIsIGRpdmlzb3JfbGltYl9pbnZlcnRlZCk7CisJCW4xID0gbjA7CisJICAgIH0KKwkgICAgVURJVl9RUk5ORF9QUkVJTlYoIHF1b3RfcHRyWzBdLCByLCByLAorCQkJICAgICAgIG4xIDw8IG5vcm1hbGl6YXRpb25fc3RlcHMsCisJCQkgICAgICAgZGl2aXNvcl9saW1iLCBkaXZpc29yX2xpbWJfaW52ZXJ0ZWQpOworCSAgICByZXR1cm4gciA+PiBub3JtYWxpemF0aW9uX3N0ZXBzOworCX0KKwllbHNlIHsKKwkgICAgbXBpX2xpbWJfdCBkaXZpc29yX2xpbWJfaW52ZXJ0ZWQ7CisKKwkgICAgLyogQ29tcHV0ZSAoMioqMk4gLSAyKipOICogRElWSVNPUl9MSU1CKSAvIERJVklTT1JfTElNQi4gIFRoZQorCSAgICAgKiByZXN1bHQgaXMgYSAoTisxKS1iaXQgYXBwcm94aW1hdGlvbiB0byAxL0RJVklTT1JfTElNQiwgd2l0aCB0aGUKKwkgICAgICogbW9zdCBzaWduaWZpY2FudCBiaXQgKHdpdGggd2VpZ2h0IDIqKk4pIGltcGxpY2l0LgorCSAgICAgKi8KKwkgICAgLyogU3BlY2lhbCBjYXNlIGZvciBESVZJU09SX0xJTUIgPT0gMTAwLi4uMDAwLiAgKi8KKwkgICAgaWYoICEoZGl2aXNvcl9saW1iIDw8IDEpICkKKwkJZGl2aXNvcl9saW1iX2ludmVydGVkID0gfihtcGlfbGltYl90KSAwOworCSAgICBlbHNlCisJCXVkaXZfcXJubmQoZGl2aXNvcl9saW1iX2ludmVydGVkLCBkdW1teSwKKwkJCSAgIC1kaXZpc29yX2xpbWIsIDAsIGRpdmlzb3JfbGltYik7CisKKwkgICAgaSA9IGRpdmlkZW5kX3NpemUgLSAxOworCSAgICByID0gZGl2aWRlbmRfcHRyW2ldOworCisJICAgIGlmKCByID49IGRpdmlzb3JfbGltYiApCisJCXIgPSAwOworCSAgICBlbHNlCisJCXF1b3RfcHRyW2ktLV0gPSAwOworCisJICAgIGZvciggOyBpID49IDA7IGktLSApIHsKKwkJbjAgPSBkaXZpZGVuZF9wdHJbaV07CisJCVVESVZfUVJOTkRfUFJFSU5WKCBxdW90X3B0cltpXSwgciwgciwKKwkJCQkgICBuMCwgZGl2aXNvcl9saW1iLCBkaXZpc29yX2xpbWJfaW52ZXJ0ZWQpOworCSAgICB9CisJICAgIHJldHVybiByOworCX0KKyAgICB9CisgICAgZWxzZSB7CisJaWYoVURJVl9ORUVEU19OT1JNQUxJWkFUSU9OKSB7CisJICAgIGludCBub3JtYWxpemF0aW9uX3N0ZXBzOworCisJICAgIGNvdW50X2xlYWRpbmdfemVyb3MgKG5vcm1hbGl6YXRpb25fc3RlcHMsIGRpdmlzb3JfbGltYik7CisJICAgIGlmKCBub3JtYWxpemF0aW9uX3N0ZXBzICkgeworCQlkaXZpc29yX2xpbWIgPDw9IG5vcm1hbGl6YXRpb25fc3RlcHM7CisKKwkJbjEgPSBkaXZpZGVuZF9wdHJbZGl2aWRlbmRfc2l6ZSAtIDFdOworCQlyID0gbjEgPj4gKEJJVFNfUEVSX01QSV9MSU1CIC0gbm9ybWFsaXphdGlvbl9zdGVwcyk7CisKKwkJLyogUG9zc2libGUgb3B0aW1pemF0aW9uOgorCQkgKiBpZiAociA9PSAwCisJCSAqICYmIGRpdmlzb3JfbGltYiA+ICgobjEgPDwgbm9ybWFsaXphdGlvbl9zdGVwcykKKwkJICoJCSAgIHwgKGRpdmlkZW5kX3B0cltkaXZpZGVuZF9zaXplIC0gMl0gPj4gLi4uKSkpCisJCSAqIC4uLm9uZSBkaXZpc2lvbiBsZXNzLi4uCisJCSAqLworCQlmb3IoIGkgPSBkaXZpZGVuZF9zaXplIC0gMjsgaSA+PSAwOyBpLS0pIHsKKwkJICAgIG4wID0gZGl2aWRlbmRfcHRyW2ldOworCQkgICAgdWRpdl9xcm5uZCAocXVvdF9wdHJbaSArIDFdLCByLCByLAorCQkJICAgICAoKG4xIDw8IG5vcm1hbGl6YXRpb25fc3RlcHMpCisJCQkgfCAobjAgPj4gKEJJVFNfUEVSX01QSV9MSU1CIC0gbm9ybWFsaXphdGlvbl9zdGVwcykpKSwKKwkJCQlkaXZpc29yX2xpbWIpOworCQkgICAgbjEgPSBuMDsKKwkJfQorCQl1ZGl2X3Fybm5kIChxdW90X3B0clswXSwgciwgciwKKwkJCSAgICBuMSA8PCBub3JtYWxpemF0aW9uX3N0ZXBzLAorCQkJICAgIGRpdmlzb3JfbGltYik7CisJCXJldHVybiByID4+IG5vcm1hbGl6YXRpb25fc3RlcHM7CisJICAgIH0KKwl9CisJLyogTm8gbm9ybWFsaXphdGlvbiBuZWVkZWQsIGVpdGhlciBiZWNhdXNlIHVkaXZfcXJubmQgZG9lc24ndCByZXF1aXJlCisJICogaXQsIG9yIGJlY2F1c2UgRElWSVNPUl9MSU1CIGlzIGFscmVhZHkgbm9ybWFsaXplZC4gICovCisJaSA9IGRpdmlkZW5kX3NpemUgLSAxOworCXIgPSBkaXZpZGVuZF9wdHJbaV07CisKKwlpZihyID49IGRpdmlzb3JfbGltYikKKwkgICAgciA9IDA7CisJZWxzZQorCSAgICBxdW90X3B0cltpLS1dID0gMDsKKworCWZvcig7IGkgPj0gMDsgaS0tKSB7CisJICAgIG4wID0gZGl2aWRlbmRfcHRyW2ldOworCSAgICB1ZGl2X3Fybm5kKCBxdW90X3B0cltpXSwgciwgciwgbjAsIGRpdmlzb3JfbGltYiApOworCX0KKwlyZXR1cm4gcjsKKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9tcGloLW11bC5jIGIvbGliZ2NyeXB0LTEuNC42L21waS9tcGloLW11bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZjZmNTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL21waWgtbXVsLmMKQEAgLTAsMCArMSw1MzAgQEAKKy8qIG1waWgtbXVsLmMgIC0gIE1QSSBoZWxwZXIgZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTYsIDE5OTgsIDE5OTksIDIwMDAsCisgKiAgICAgICAgICAgICAgIDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICoKKyAqIE5vdGU6IFRoaXMgY29kZSBpcyBoZWF2aWx5IGJhc2VkIG9uIHRoZSBHTlUgTVAgTGlicmFyeS4KKyAqCSBBY3R1YWxseSBpdCdzIHRoZSBzYW1lIGNvZGUgd2l0aCBvbmx5IG1pbm9yIGNoYW5nZXMgaW4gdGhlCisgKgkgd2F5IHRoZSBkYXRhIGlzIHN0b3JlZDsgdGhpcyBpcyB0byBzdXBwb3J0IHRoZSBhYnN0cmFjdGlvbgorICoJIG9mIGFuIG9wdGlvbmFsIHNlY3VyZSBtZW1vcnkgYWxsb2NhdGlvbiB3aGljaCBtYXkgYmUgdXNlZAorICoJIHRvIGF2b2lkIHJldmVhbGluZyBvZiBzZW5zaXRpdmUgZGF0YSBkdWUgdG8gcGFnaW5nIGV0Yy4KKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJtcGktaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorI2luY2x1ZGUgImcxMGxpYi5oIgorCisjZGVmaW5lIE1QTl9NVUxfTl9SRUNVUlNFKHByb2RwLCB1cCwgdnAsIHNpemUsIHRzcGFjZSkgXAorICAgIGRvIHsJCQkJCQlcCisJaWYoIChzaXplKSA8IEtBUkFUU1VCQV9USFJFU0hPTEQgKQkJXAorCSAgICBtdWxfbl9iYXNlY2FzZSAocHJvZHAsIHVwLCB2cCwgc2l6ZSk7CVwKKwllbHNlCQkJCQkJXAorCSAgICBtdWxfbiAocHJvZHAsIHVwLCB2cCwgc2l6ZSwgdHNwYWNlKTsJXAorICAgIH0gd2hpbGUgKDApOworCisjZGVmaW5lIE1QTl9TUVJfTl9SRUNVUlNFKHByb2RwLCB1cCwgc2l6ZSwgdHNwYWNlKSBcCisgICAgZG8gewkJCQkJICAgIFwKKwlpZiAoKHNpemUpIDwgS0FSQVRTVUJBX1RIUkVTSE9MRCkJICAgIFwKKwkgICAgX2djcnlfbXBpaF9zcXJfbl9iYXNlY2FzZSAocHJvZHAsIHVwLCBzaXplKTsJIFwKKwllbHNlCQkJCQkgICAgXAorCSAgICBfZ2NyeV9tcGloX3Nxcl9uIChwcm9kcCwgdXAsIHNpemUsIHRzcGFjZSk7CSBcCisgICAgfSB3aGlsZSAoMCk7CisKKworCisKKy8qIE11bHRpcGx5IHRoZSBuYXR1cmFsIG51bWJlcnMgdSAocG9pbnRlZCB0byBieSBVUCkgYW5kIHYgKHBvaW50ZWQgdG8gYnkgVlApLAorICogYm90aCB3aXRoIFNJWkUgbGltYnMsIGFuZCBzdG9yZSB0aGUgcmVzdWx0IGF0IFBST0RQLiAgMiAqIFNJWkUgbGltYnMgYXJlCisgKiBhbHdheXMgc3RvcmVkLiAgUmV0dXJuIHRoZSBtb3N0IHNpZ25pZmljYW50IGxpbWIuCisgKgorICogQXJndW1lbnQgY29uc3RyYWludHM6CisgKiAxLiBQUk9EUCAhPSBVUCBhbmQgUFJPRFAgIT0gVlAsIGkuZS4gdGhlIGRlc3RpbmF0aW9uCisgKiAgICBtdXN0IGJlIGRpc3RpbmN0IGZyb20gdGhlIG11bHRpcGxpZXIgYW5kIHRoZSBtdWx0aXBsaWNhbmQuCisgKgorICoKKyAqIEhhbmRsZSBzaW1wbGUgY2FzZXMgd2l0aCB0cmFkaXRpb25hbCBtdWx0aXBsaWNhdGlvbi4KKyAqCisgKiBUaGlzIGlzIHRoZSBtb3N0IGNyaXRpY2FsIGNvZGUgb2YgbXVsdGlwbGljYXRpb24uICBBbGwgbXVsdGlwbGllcyByZWx5CisgKiBvbiB0aGlzLCBib3RoIHNtYWxsIGFuZCBodWdlLiAgU21hbGwgb25lcyBhcnJpdmUgaGVyZSBpbW1lZGlhdGVseS4gIEh1Z2UKKyAqIG9uZXMgYXJyaXZlIGhlcmUgYXMgdGhpcyBpcyB0aGUgYmFzZSBjYXNlIGZvciBLYXJhdHN1YmEncyByZWN1cnNpdmUKKyAqIGFsZ29yaXRobSBiZWxvdy4KKyAqLworCitzdGF0aWMgbXBpX2xpbWJfdAorbXVsX25fYmFzZWNhc2UoIG1waV9wdHJfdCBwcm9kcCwgbXBpX3B0cl90IHVwLAorCQkJCSBtcGlfcHRyX3QgdnAsIG1waV9zaXplX3Qgc2l6ZSkKK3sKKyAgICBtcGlfc2l6ZV90IGk7CisgICAgbXBpX2xpbWJfdCBjeTsKKyAgICBtcGlfbGltYl90IHZfbGltYjsKKworICAgIC8qIE11bHRpcGx5IGJ5IHRoZSBmaXJzdCBsaW1iIGluIFYgc2VwYXJhdGVseSwgYXMgdGhlIHJlc3VsdCBjYW4gYmUKKyAgICAgKiBzdG9yZWQgKG5vdCBhZGRlZCkgdG8gUFJPRC4gIFdlIGFsc28gYXZvaWQgYSBsb29wIGZvciB6ZXJvaW5nLiAgKi8KKyAgICB2X2xpbWIgPSB2cFswXTsKKyAgICBpZiggdl9saW1iIDw9IDEgKSB7CisJaWYoIHZfbGltYiA9PSAxICkKKwkgICAgTVBOX0NPUFkoIHByb2RwLCB1cCwgc2l6ZSApOworCWVsc2UKKwkgICAgTVBOX1pFUk8oIHByb2RwLCBzaXplICk7CisJY3kgPSAwOworICAgIH0KKyAgICBlbHNlCisJY3kgPSBfZ2NyeV9tcGloX211bF8xKCBwcm9kcCwgdXAsIHNpemUsIHZfbGltYiApOworCisgICAgcHJvZHBbc2l6ZV0gPSBjeTsKKyAgICBwcm9kcCsrOworCisgICAgLyogRm9yIGVhY2ggaXRlcmF0aW9uIGluIHRoZSBvdXRlciBsb29wLCBtdWx0aXBseSBvbmUgbGltYiBmcm9tCisgICAgICogVSB3aXRoIG9uZSBsaW1iIGZyb20gViwgYW5kIGFkZCBpdCB0byBQUk9ELiAgKi8KKyAgICBmb3IoIGkgPSAxOyBpIDwgc2l6ZTsgaSsrICkgeworCXZfbGltYiA9IHZwW2ldOworCWlmKCB2X2xpbWIgPD0gMSApIHsKKwkgICAgY3kgPSAwOworCSAgICBpZiggdl9saW1iID09IDEgKQorCSAgICAgICBjeSA9IF9nY3J5X21waWhfYWRkX24ocHJvZHAsIHByb2RwLCB1cCwgc2l6ZSk7CisJfQorCWVsc2UKKwkgICAgY3kgPSBfZ2NyeV9tcGloX2FkZG11bF8xKHByb2RwLCB1cCwgc2l6ZSwgdl9saW1iKTsKKworCXByb2RwW3NpemVdID0gY3k7CisJcHJvZHArKzsKKyAgICB9CisKKyAgICByZXR1cm4gY3k7Cit9CisKKworc3RhdGljIHZvaWQKK211bF9uKCBtcGlfcHRyX3QgcHJvZHAsIG1waV9wdHJfdCB1cCwgbXBpX3B0cl90IHZwLAorCQkJbXBpX3NpemVfdCBzaXplLCBtcGlfcHRyX3QgdHNwYWNlICkKK3sKKyAgICBpZiggc2l6ZSAmIDEgKSB7CisgICAgICAvKiBUaGUgc2l6ZSBpcyBvZGQsIGFuZCB0aGUgY29kZSBiZWxvdyBkb2Vzbid0IGhhbmRsZSB0aGF0LgorICAgICAgICogTXVsdGlwbHkgdGhlIGxlYXN0IHNpZ25pZmljYW50IChzaXplIC0gMSkgbGltYnMgd2l0aCBhIHJlY3Vyc2l2ZQorICAgICAgICogY2FsbCwgYW5kIGhhbmRsZSB0aGUgbW9zdCBzaWduaWZpY2FudCBsaW1iIG9mIFMxIGFuZCBTMgorICAgICAgICogc2VwYXJhdGVseS4KKyAgICAgICAqIEEgc2xpZ2h0bHkgZmFzdGVyIHdheSB0byBkbyB0aGlzIHdvdWxkIGJlIHRvIG1ha2UgdGhlIEthcmF0c3ViYQorICAgICAgICogY29kZSBiZWxvdyBiZWhhdmUgYXMgaWYgdGhlIHNpemUgd2VyZSBldmVuLCBhbmQgbGV0IGl0IGNoZWNrIGZvcgorICAgICAgICogb2RkIHNpemUgaW4gdGhlIGVuZC4gIEkuZS4sIGluIGVzc2VuY2UgbW92ZSB0aGlzIGNvZGUgdG8gdGhlIGVuZC4KKyAgICAgICAqIERvaW5nIHNvIHdvdWxkIHNhdmUgdXMgYSByZWN1cnNpdmUgY2FsbCwgYW5kIHBvdGVudGlhbGx5IG1ha2UgdGhlCisgICAgICAgKiBzdGFjayBncm93IGEgbG90IGxlc3MuCisgICAgICAgKi8KKyAgICAgIG1waV9zaXplX3QgZXNpemUgPSBzaXplIC0gMTsJIC8qIGV2ZW4gc2l6ZSAqLworICAgICAgbXBpX2xpbWJfdCBjeV9saW1iOworCisgICAgICBNUE5fTVVMX05fUkVDVVJTRSggcHJvZHAsIHVwLCB2cCwgZXNpemUsIHRzcGFjZSApOworICAgICAgY3lfbGltYiA9IF9nY3J5X21waWhfYWRkbXVsXzEoIHByb2RwICsgZXNpemUsIHVwLCBlc2l6ZSwgdnBbZXNpemVdICk7CisgICAgICBwcm9kcFtlc2l6ZSArIGVzaXplXSA9IGN5X2xpbWI7CisgICAgICBjeV9saW1iID0gX2djcnlfbXBpaF9hZGRtdWxfMSggcHJvZHAgKyBlc2l6ZSwgdnAsIHNpemUsIHVwW2VzaXplXSApOworICAgICAgcHJvZHBbZXNpemUgKyBzaXplXSA9IGN5X2xpbWI7CisgICAgfQorICAgIGVsc2UgeworCS8qIEFuYXRvbGlqIEFsZWtzZWV2aWNoIEthcmF0c3ViYSdzIGRpdmlkZS1hbmQtY29ucXVlciBhbGdvcml0aG0uCisJICoKKwkgKiBTcGxpdCBVIGluIHR3byBwaWVjZXMsIFUxIGFuZCBVMCwgc3VjaCB0aGF0CisJICogVSA9IFUwICsgVTEqKEIqKm4pLAorCSAqIGFuZCBWIGluIFYxIGFuZCBWMCwgc3VjaCB0aGF0CisJICogViA9IFYwICsgVjEqKEIqKm4pLgorCSAqCisJICogVVYgaXMgdGhlbiBjb21wdXRlZCByZWN1cnNpdmVseSB1c2luZyB0aGUgaWRlbnRpdHkKKwkgKgorCSAqCSAgMm4gICBuCSAgbgkJCW4KKwkgKiBVViA9IChCICArIEIgKVUgViAgKyAgQiAoVSAtVSApKFYgLVYgKSAgKyAgKEIgKyAxKVUgVgorCSAqCQkgIDEgMQkgICAgIDEJMCAgIDAgIDEJICAgICAgMCAwCisJICoKKwkgKiBXaGVyZSBCID0gMioqQklUU19QRVJfTVBfTElNQi4KKwkgKi8KKwltcGlfc2l6ZV90IGhzaXplID0gc2l6ZSA+PiAxOworCW1waV9saW1iX3QgY3k7CisJaW50IG5lZ2ZsZzsKKworCS8qIFByb2R1Y3QgSC4JICAgX19fX19fX19fX19fX19fXyAgX19fX19fX19fX19fX19fXworCSAqCQkgIHxfX19fX1UxIHggVjFfX19ffHxfX19fVTAgeCBWMF9fX19ffAorCSAqIFB1dCByZXN1bHQgaW4gdXBwZXIgcGFydCBvZiBQUk9EIGFuZCBwYXNzIGxvdyBwYXJ0IG9mIFRTUEFDRQorCSAqIGFzIG5ldyBUU1BBQ0UuCisJICovCisJTVBOX01VTF9OX1JFQ1VSU0UocHJvZHAgKyBzaXplLCB1cCArIGhzaXplLCB2cCArIGhzaXplLCBoc2l6ZSwgdHNwYWNlKTsKKworCS8qIFByb2R1Y3QgTS4JICAgX19fX19fX19fX19fX19fXworCSAqCQkgIHxfKFUxLVUwKShWMC1WMSlffAorCSAqLworCWlmKCBfZ2NyeV9tcGloX2NtcCh1cCArIGhzaXplLCB1cCwgaHNpemUpID49IDAgKSB7CisJICAgIF9nY3J5X21waWhfc3ViX24ocHJvZHAsIHVwICsgaHNpemUsIHVwLCBoc2l6ZSk7CisJICAgIG5lZ2ZsZyA9IDA7CisJfQorCWVsc2UgeworCSAgICBfZ2NyeV9tcGloX3N1Yl9uKHByb2RwLCB1cCwgdXAgKyBoc2l6ZSwgaHNpemUpOworCSAgICBuZWdmbGcgPSAxOworCX0KKwlpZiggX2djcnlfbXBpaF9jbXAodnAgKyBoc2l6ZSwgdnAsIGhzaXplKSA+PSAwICkgeworCSAgICBfZ2NyeV9tcGloX3N1Yl9uKHByb2RwICsgaHNpemUsIHZwICsgaHNpemUsIHZwLCBoc2l6ZSk7CisJICAgIG5lZ2ZsZyBePSAxOworCX0KKwllbHNlIHsKKwkgICAgX2djcnlfbXBpaF9zdWJfbihwcm9kcCArIGhzaXplLCB2cCwgdnAgKyBoc2l6ZSwgaHNpemUpOworCSAgICAvKiBObyBjaGFuZ2Ugb2YgTkVHRkxHLiAgKi8KKwl9CisJLyogUmVhZCB0ZW1wb3Jhcnkgb3BlcmFuZHMgZnJvbSBsb3cgcGFydCBvZiBQUk9ELgorCSAqIFB1dCByZXN1bHQgaW4gbG93IHBhcnQgb2YgVFNQQUNFIHVzaW5nIHVwcGVyIHBhcnQgb2YgVFNQQUNFCisJICogYXMgbmV3IFRTUEFDRS4KKwkgKi8KKwlNUE5fTVVMX05fUkVDVVJTRSh0c3BhY2UsIHByb2RwLCBwcm9kcCArIGhzaXplLCBoc2l6ZSwgdHNwYWNlICsgc2l6ZSk7CisKKwkvKiBBZGQvY29weSBwcm9kdWN0IEguICovCisJTVBOX0NPUFkgKHByb2RwICsgaHNpemUsIHByb2RwICsgc2l6ZSwgaHNpemUpOworCWN5ID0gX2djcnlfbXBpaF9hZGRfbiggcHJvZHAgKyBzaXplLCBwcm9kcCArIHNpemUsCisJCQkgICAgcHJvZHAgKyBzaXplICsgaHNpemUsIGhzaXplKTsKKworCS8qIEFkZCBwcm9kdWN0IE0gKGlmIE5FR0ZMRyBNIGlzIGEgbmVnYXRpdmUgbnVtYmVyKSAqLworCWlmKG5lZ2ZsZykKKwkgICAgY3kgLT0gX2djcnlfbXBpaF9zdWJfbihwcm9kcCArIGhzaXplLCBwcm9kcCArIGhzaXplLCB0c3BhY2UsIHNpemUpOworCWVsc2UKKwkgICAgY3kgKz0gX2djcnlfbXBpaF9hZGRfbihwcm9kcCArIGhzaXplLCBwcm9kcCArIGhzaXplLCB0c3BhY2UsIHNpemUpOworCisJLyogUHJvZHVjdCBMLgkgICBfX19fX19fX19fX19fX19fICBfX19fX19fX19fX19fX19fCisJICoJCSAgfF9fX19fX19fX19fX19fX198fF9fX19VMCB4IFYwX19fX198CisJICogUmVhZCB0ZW1wb3Jhcnkgb3BlcmFuZHMgZnJvbSBsb3cgcGFydCBvZiBQUk9ELgorCSAqIFB1dCByZXN1bHQgaW4gbG93IHBhcnQgb2YgVFNQQUNFIHVzaW5nIHVwcGVyIHBhcnQgb2YgVFNQQUNFCisJICogYXMgbmV3IFRTUEFDRS4KKwkgKi8KKwlNUE5fTVVMX05fUkVDVVJTRSh0c3BhY2UsIHVwLCB2cCwgaHNpemUsIHRzcGFjZSArIHNpemUpOworCisJLyogQWRkL2NvcHkgUHJvZHVjdCBMICh0d2ljZSkgKi8KKworCWN5ICs9IF9nY3J5X21waWhfYWRkX24ocHJvZHAgKyBoc2l6ZSwgcHJvZHAgKyBoc2l6ZSwgdHNwYWNlLCBzaXplKTsKKwlpZiggY3kgKQorCSAgX2djcnlfbXBpaF9hZGRfMShwcm9kcCArIGhzaXplICsgc2l6ZSwgcHJvZHAgKyBoc2l6ZSArIHNpemUsIGhzaXplLCBjeSk7CisKKwlNUE5fQ09QWShwcm9kcCwgdHNwYWNlLCBoc2l6ZSk7CisJY3kgPSBfZ2NyeV9tcGloX2FkZF9uKHByb2RwICsgaHNpemUsIHByb2RwICsgaHNpemUsIHRzcGFjZSArIGhzaXplLCBoc2l6ZSk7CisJaWYoIGN5ICkKKwkgICAgX2djcnlfbXBpaF9hZGRfMShwcm9kcCArIHNpemUsIHByb2RwICsgc2l6ZSwgc2l6ZSwgMSk7CisgICAgfQorfQorCisKK3ZvaWQKK19nY3J5X21waWhfc3FyX25fYmFzZWNhc2UoIG1waV9wdHJfdCBwcm9kcCwgbXBpX3B0cl90IHVwLCBtcGlfc2l6ZV90IHNpemUgKQoreworICAgIG1waV9zaXplX3QgaTsKKyAgICBtcGlfbGltYl90IGN5X2xpbWI7CisgICAgbXBpX2xpbWJfdCB2X2xpbWI7CisKKyAgICAvKiBNdWx0aXBseSBieSB0aGUgZmlyc3QgbGltYiBpbiBWIHNlcGFyYXRlbHksIGFzIHRoZSByZXN1bHQgY2FuIGJlCisgICAgICogc3RvcmVkIChub3QgYWRkZWQpIHRvIFBST0QuICBXZSBhbHNvIGF2b2lkIGEgbG9vcCBmb3IgemVyb2luZy4gICovCisgICAgdl9saW1iID0gdXBbMF07CisgICAgaWYoIHZfbGltYiA8PSAxICkgeworCWlmKCB2X2xpbWIgPT0gMSApCisJICAgIE1QTl9DT1BZKCBwcm9kcCwgdXAsIHNpemUgKTsKKwllbHNlCisJICAgIE1QTl9aRVJPKHByb2RwLCBzaXplKTsKKwljeV9saW1iID0gMDsKKyAgICB9CisgICAgZWxzZQorCWN5X2xpbWIgPSBfZ2NyeV9tcGloX211bF8xKCBwcm9kcCwgdXAsIHNpemUsIHZfbGltYiApOworCisgICAgcHJvZHBbc2l6ZV0gPSBjeV9saW1iOworICAgIHByb2RwKys7CisKKyAgICAvKiBGb3IgZWFjaCBpdGVyYXRpb24gaW4gdGhlIG91dGVyIGxvb3AsIG11bHRpcGx5IG9uZSBsaW1iIGZyb20KKyAgICAgKiBVIHdpdGggb25lIGxpbWIgZnJvbSBWLCBhbmQgYWRkIGl0IHRvIFBST0QuICAqLworICAgIGZvciggaT0xOyBpIDwgc2l6ZTsgaSsrKSB7CisJdl9saW1iID0gdXBbaV07CisJaWYoIHZfbGltYiA8PSAxICkgeworCSAgICBjeV9saW1iID0gMDsKKwkgICAgaWYoIHZfbGltYiA9PSAxICkKKwkJY3lfbGltYiA9IF9nY3J5X21waWhfYWRkX24ocHJvZHAsIHByb2RwLCB1cCwgc2l6ZSk7CisJfQorCWVsc2UKKwkgICAgY3lfbGltYiA9IF9nY3J5X21waWhfYWRkbXVsXzEocHJvZHAsIHVwLCBzaXplLCB2X2xpbWIpOworCisJcHJvZHBbc2l6ZV0gPSBjeV9saW1iOworCXByb2RwKys7CisgICAgfQorfQorCisKK3ZvaWQKK19nY3J5X21waWhfc3FyX24oIG1waV9wdHJfdCBwcm9kcCwKKyAgICAgICAgICAgICAgICAgIG1waV9wdHJfdCB1cCwgbXBpX3NpemVfdCBzaXplLCBtcGlfcHRyX3QgdHNwYWNlKQoreworICAgIGlmKCBzaXplICYgMSApIHsKKwkvKiBUaGUgc2l6ZSBpcyBvZGQsIGFuZCB0aGUgY29kZSBiZWxvdyBkb2Vzbid0IGhhbmRsZSB0aGF0LgorCSAqIE11bHRpcGx5IHRoZSBsZWFzdCBzaWduaWZpY2FudCAoc2l6ZSAtIDEpIGxpbWJzIHdpdGggYSByZWN1cnNpdmUKKwkgKiBjYWxsLCBhbmQgaGFuZGxlIHRoZSBtb3N0IHNpZ25pZmljYW50IGxpbWIgb2YgUzEgYW5kIFMyCisJICogc2VwYXJhdGVseS4KKwkgKiBBIHNsaWdodGx5IGZhc3RlciB3YXkgdG8gZG8gdGhpcyB3b3VsZCBiZSB0byBtYWtlIHRoZSBLYXJhdHN1YmEKKwkgKiBjb2RlIGJlbG93IGJlaGF2ZSBhcyBpZiB0aGUgc2l6ZSB3ZXJlIGV2ZW4sIGFuZCBsZXQgaXQgY2hlY2sgZm9yCisJICogb2RkIHNpemUgaW4gdGhlIGVuZC4gIEkuZS4sIGluIGVzc2VuY2UgbW92ZSB0aGlzIGNvZGUgdG8gdGhlIGVuZC4KKwkgKiBEb2luZyBzbyB3b3VsZCBzYXZlIHVzIGEgcmVjdXJzaXZlIGNhbGwsIGFuZCBwb3RlbnRpYWxseSBtYWtlIHRoZQorCSAqIHN0YWNrIGdyb3cgYSBsb3QgbGVzcy4KKwkgKi8KKwltcGlfc2l6ZV90IGVzaXplID0gc2l6ZSAtIDE7CSAgIC8qIGV2ZW4gc2l6ZSAqLworCW1waV9saW1iX3QgY3lfbGltYjsKKworCU1QTl9TUVJfTl9SRUNVUlNFKCBwcm9kcCwgdXAsIGVzaXplLCB0c3BhY2UgKTsKKwljeV9saW1iID0gX2djcnlfbXBpaF9hZGRtdWxfMSggcHJvZHAgKyBlc2l6ZSwgdXAsIGVzaXplLCB1cFtlc2l6ZV0gKTsKKwlwcm9kcFtlc2l6ZSArIGVzaXplXSA9IGN5X2xpbWI7CisJY3lfbGltYiA9IF9nY3J5X21waWhfYWRkbXVsXzEoIHByb2RwICsgZXNpemUsIHVwLCBzaXplLCB1cFtlc2l6ZV0gKTsKKworCXByb2RwW2VzaXplICsgc2l6ZV0gPSBjeV9saW1iOworICAgIH0KKyAgICBlbHNlIHsKKwltcGlfc2l6ZV90IGhzaXplID0gc2l6ZSA+PiAxOworCW1waV9saW1iX3QgY3k7CisKKwkvKiBQcm9kdWN0IEguCSAgIF9fX19fX19fX19fX19fX18gIF9fX19fX19fX19fX19fX18KKwkgKgkJICB8X19fX19VMSB4IFUxX19fX3x8X19fX1UwIHggVTBfX19fX3wKKwkgKiBQdXQgcmVzdWx0IGluIHVwcGVyIHBhcnQgb2YgUFJPRCBhbmQgcGFzcyBsb3cgcGFydCBvZiBUU1BBQ0UKKwkgKiBhcyBuZXcgVFNQQUNFLgorCSAqLworCU1QTl9TUVJfTl9SRUNVUlNFKHByb2RwICsgc2l6ZSwgdXAgKyBoc2l6ZSwgaHNpemUsIHRzcGFjZSk7CisKKwkvKiBQcm9kdWN0IE0uCSAgIF9fX19fX19fX19fX19fX18KKwkgKgkJICB8XyhVMS1VMCkoVTAtVTEpX3wKKwkgKi8KKwlpZiggX2djcnlfbXBpaF9jbXAoIHVwICsgaHNpemUsIHVwLCBoc2l6ZSkgPj0gMCApCisJICAgIF9nY3J5X21waWhfc3ViX24oIHByb2RwLCB1cCArIGhzaXplLCB1cCwgaHNpemUpOworCWVsc2UKKwkgICAgX2djcnlfbXBpaF9zdWJfbiAocHJvZHAsIHVwLCB1cCArIGhzaXplLCBoc2l6ZSk7CisKKwkvKiBSZWFkIHRlbXBvcmFyeSBvcGVyYW5kcyBmcm9tIGxvdyBwYXJ0IG9mIFBST0QuCisJICogUHV0IHJlc3VsdCBpbiBsb3cgcGFydCBvZiBUU1BBQ0UgdXNpbmcgdXBwZXIgcGFydCBvZiBUU1BBQ0UKKwkgKiBhcyBuZXcgVFNQQUNFLiAgKi8KKwlNUE5fU1FSX05fUkVDVVJTRSh0c3BhY2UsIHByb2RwLCBoc2l6ZSwgdHNwYWNlICsgc2l6ZSk7CisKKwkvKiBBZGQvY29weSBwcm9kdWN0IEggICovCisJTVBOX0NPUFkocHJvZHAgKyBoc2l6ZSwgcHJvZHAgKyBzaXplLCBoc2l6ZSk7CisJY3kgPSBfZ2NyeV9tcGloX2FkZF9uKHByb2RwICsgc2l6ZSwgcHJvZHAgKyBzaXplLAorCQkJICAgcHJvZHAgKyBzaXplICsgaHNpemUsIGhzaXplKTsKKworCS8qIEFkZCBwcm9kdWN0IE0gKGlmIE5FR0ZMRyBNIGlzIGEgbmVnYXRpdmUgbnVtYmVyKS4gICovCisJY3kgLT0gX2djcnlfbXBpaF9zdWJfbiAocHJvZHAgKyBoc2l6ZSwgcHJvZHAgKyBoc2l6ZSwgdHNwYWNlLCBzaXplKTsKKworCS8qIFByb2R1Y3QgTC4JICAgX19fX19fX19fX19fX19fXyAgX19fX19fX19fX19fX19fXworCSAqCQkgIHxfX19fX19fX19fX19fX19ffHxfX19fVTAgeCBVMF9fX19ffAorCSAqIFJlYWQgdGVtcG9yYXJ5IG9wZXJhbmRzIGZyb20gbG93IHBhcnQgb2YgUFJPRC4KKwkgKiBQdXQgcmVzdWx0IGluIGxvdyBwYXJ0IG9mIFRTUEFDRSB1c2luZyB1cHBlciBwYXJ0IG9mIFRTUEFDRQorCSAqIGFzIG5ldyBUU1BBQ0UuICAqLworCU1QTl9TUVJfTl9SRUNVUlNFICh0c3BhY2UsIHVwLCBoc2l6ZSwgdHNwYWNlICsgc2l6ZSk7CisKKwkvKiBBZGQvY29weSBQcm9kdWN0IEwgKHR3aWNlKS4JKi8KKwljeSArPSBfZ2NyeV9tcGloX2FkZF9uIChwcm9kcCArIGhzaXplLCBwcm9kcCArIGhzaXplLCB0c3BhY2UsIHNpemUpOworCWlmKCBjeSApCisJICAgIF9nY3J5X21waWhfYWRkXzEocHJvZHAgKyBoc2l6ZSArIHNpemUsIHByb2RwICsgaHNpemUgKyBzaXplLAorCQkJCQkJCSAgICBoc2l6ZSwgY3kpOworCisJTVBOX0NPUFkocHJvZHAsIHRzcGFjZSwgaHNpemUpOworCWN5ID0gX2djcnlfbXBpaF9hZGRfbiAocHJvZHAgKyBoc2l6ZSwgcHJvZHAgKyBoc2l6ZSwgdHNwYWNlICsgaHNpemUsIGhzaXplKTsKKwlpZiggY3kgKQorCSAgICBfZ2NyeV9tcGloX2FkZF8xIChwcm9kcCArIHNpemUsIHByb2RwICsgc2l6ZSwgc2l6ZSwgMSk7CisgICAgfQorfQorCisKKy8qIFRoaXMgc2hvdWxkIGJlIG1hZGUgaW50byBhbiBpbmxpbmUgZnVuY3Rpb24gaW4gZ21wLmguICAqLwordm9pZAorX2djcnlfbXBpaF9tdWxfbiggbXBpX3B0cl90IHByb2RwLAorICAgICAgICAgICAgICAgICAgICAgbXBpX3B0cl90IHVwLCBtcGlfcHRyX3QgdnAsIG1waV9zaXplX3Qgc2l6ZSkKK3sKKyAgICBpbnQgc2VjdXJlOworCisgICAgaWYoIHVwID09IHZwICkgeworCWlmKCBzaXplIDwgS0FSQVRTVUJBX1RIUkVTSE9MRCApCisJICAgIF9nY3J5X21waWhfc3FyX25fYmFzZWNhc2UoIHByb2RwLCB1cCwgc2l6ZSApOworCWVsc2UgeworCSAgICBtcGlfcHRyX3QgdHNwYWNlOworCSAgICBzZWN1cmUgPSBnY3J5X2lzX3NlY3VyZSggdXAgKTsKKwkgICAgdHNwYWNlID0gbXBpX2FsbG9jX2xpbWJfc3BhY2UoIDIgKiBzaXplLCBzZWN1cmUgKTsKKwkgICAgX2djcnlfbXBpaF9zcXJfbiggcHJvZHAsIHVwLCBzaXplLCB0c3BhY2UgKTsKKwkgICAgX2djcnlfbXBpX2ZyZWVfbGltYl9zcGFjZSAodHNwYWNlLCAyICogc2l6ZSApOworCX0KKyAgICB9CisgICAgZWxzZSB7CisJaWYoIHNpemUgPCBLQVJBVFNVQkFfVEhSRVNIT0xEICkKKwkgICAgbXVsX25fYmFzZWNhc2UoIHByb2RwLCB1cCwgdnAsIHNpemUgKTsKKwllbHNlIHsKKwkgICAgbXBpX3B0cl90IHRzcGFjZTsKKwkgICAgc2VjdXJlID0gZ2NyeV9pc19zZWN1cmUoIHVwICkgfHwgZ2NyeV9pc19zZWN1cmUoIHZwICk7CisJICAgIHRzcGFjZSA9IG1waV9hbGxvY19saW1iX3NwYWNlKCAyICogc2l6ZSwgc2VjdXJlICk7CisJICAgIG11bF9uIChwcm9kcCwgdXAsIHZwLCBzaXplLCB0c3BhY2UpOworCSAgICBfZ2NyeV9tcGlfZnJlZV9saW1iX3NwYWNlICh0c3BhY2UsIDIgKiBzaXplICk7CisJfQorICAgIH0KK30KKworCisKK3ZvaWQKK19nY3J5X21waWhfbXVsX2thcmF0c3ViYV9jYXNlKCBtcGlfcHRyX3QgcHJvZHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBpX3B0cl90IHVwLCBtcGlfc2l6ZV90IHVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1waV9wdHJfdCB2cCwgbXBpX3NpemVfdCB2c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qga2FyYXRzdWJhX2N0eCAqY3R4ICkKK3sKKyAgICBtcGlfbGltYl90IGN5OworCisgICAgaWYoICFjdHgtPnRzcGFjZSB8fCBjdHgtPnRzcGFjZV9zaXplIDwgdnNpemUgKSB7CisJaWYoIGN0eC0+dHNwYWNlICkKKwkgICAgX2djcnlfbXBpX2ZyZWVfbGltYl9zcGFjZSggY3R4LT50c3BhY2UsIGN0eC0+dHNwYWNlX25saW1icyApOworICAgICAgICBjdHgtPnRzcGFjZV9ubGltYnMgPSAyICogdnNpemU7CisJY3R4LT50c3BhY2UgPSBtcGlfYWxsb2NfbGltYl9zcGFjZSggMiAqIHZzaXplLAorCQkJCSAgICAgICAgICAgIChnY3J5X2lzX3NlY3VyZSggdXAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBnY3J5X2lzX3NlY3VyZSggdnAgKSkgKTsKKwljdHgtPnRzcGFjZV9zaXplID0gdnNpemU7CisgICAgfQorCisgICAgTVBOX01VTF9OX1JFQ1VSU0UoIHByb2RwLCB1cCwgdnAsIHZzaXplLCBjdHgtPnRzcGFjZSApOworCisgICAgcHJvZHAgKz0gdnNpemU7CisgICAgdXAgKz0gdnNpemU7CisgICAgdXNpemUgLT0gdnNpemU7CisgICAgaWYoIHVzaXplID49IHZzaXplICkgeworCWlmKCAhY3R4LT50cCB8fCBjdHgtPnRwX3NpemUgPCB2c2l6ZSApIHsKKwkgICAgaWYoIGN0eC0+dHAgKQorCQlfZ2NyeV9tcGlfZnJlZV9saW1iX3NwYWNlKCBjdHgtPnRwLCBjdHgtPnRwX25saW1icyApOworICAgICAgICAgICAgY3R4LT50cF9ubGltYnMgPSAyICogdnNpemU7CisJICAgIGN0eC0+dHAgPSBtcGlfYWxsb2NfbGltYl9zcGFjZSggMiAqIHZzaXplLCBnY3J5X2lzX3NlY3VyZSggdXAgKQorCQkJCQkJICAgICAgfHwgZ2NyeV9pc19zZWN1cmUoIHZwICkgKTsKKwkgICAgY3R4LT50cF9zaXplID0gdnNpemU7CisJfQorCisJZG8geworCSAgICBNUE5fTVVMX05fUkVDVVJTRSggY3R4LT50cCwgdXAsIHZwLCB2c2l6ZSwgY3R4LT50c3BhY2UgKTsKKwkgICAgY3kgPSBfZ2NyeV9tcGloX2FkZF9uKCBwcm9kcCwgcHJvZHAsIGN0eC0+dHAsIHZzaXplICk7CisJICAgIF9nY3J5X21waWhfYWRkXzEoIHByb2RwICsgdnNpemUsIGN0eC0+dHAgKyB2c2l6ZSwgdnNpemUsIGN5ICk7CisJICAgIHByb2RwICs9IHZzaXplOworCSAgICB1cCArPSB2c2l6ZTsKKwkgICAgdXNpemUgLT0gdnNpemU7CisJfSB3aGlsZSggdXNpemUgPj0gdnNpemUgKTsKKyAgICB9CisKKyAgICBpZiggdXNpemUgKSB7CisJaWYoIHVzaXplIDwgS0FSQVRTVUJBX1RIUkVTSE9MRCApIHsKKwkgICAgX2djcnlfbXBpaF9tdWwoIGN0eC0+dHNwYWNlLCB2cCwgdnNpemUsIHVwLCB1c2l6ZSApOworCX0KKwllbHNlIHsKKwkgICAgaWYoICFjdHgtPm5leHQgKSB7CisJCWN0eC0+bmV4dCA9IGdjcnlfeGNhbGxvYyggMSwgc2l6ZW9mICpjdHggKTsKKwkgICAgfQorCSAgICBfZ2NyeV9tcGloX211bF9rYXJhdHN1YmFfY2FzZSggY3R4LT50c3BhY2UsCisJCQkJCXZwLCB2c2l6ZSwKKwkJCQkJdXAsIHVzaXplLAorCQkJCQljdHgtPm5leHQgKTsKKwl9CisKKwljeSA9IF9nY3J5X21waWhfYWRkX24oIHByb2RwLCBwcm9kcCwgY3R4LT50c3BhY2UsIHZzaXplKTsKKwlfZ2NyeV9tcGloX2FkZF8xKCBwcm9kcCArIHZzaXplLCBjdHgtPnRzcGFjZSArIHZzaXplLCB1c2l6ZSwgY3kgKTsKKyAgICB9Cit9CisKKwordm9pZAorX2djcnlfbXBpaF9yZWxlYXNlX2thcmF0c3ViYV9jdHgoIHN0cnVjdCBrYXJhdHN1YmFfY3R4ICpjdHggKQoreworICAgIHN0cnVjdCBrYXJhdHN1YmFfY3R4ICpjdHgyOworCisgICAgaWYoIGN0eC0+dHAgKQorCV9nY3J5X21waV9mcmVlX2xpbWJfc3BhY2UoIGN0eC0+dHAsIGN0eC0+dHBfbmxpbWJzICk7CisgICAgaWYoIGN0eC0+dHNwYWNlICkKKwlfZ2NyeV9tcGlfZnJlZV9saW1iX3NwYWNlKCBjdHgtPnRzcGFjZSwgY3R4LT50c3BhY2VfbmxpbWJzICk7CisgICAgZm9yKCBjdHg9Y3R4LT5uZXh0OyBjdHg7IGN0eCA9IGN0eDIgKSB7CisJY3R4MiA9IGN0eC0+bmV4dDsKKwlpZiggY3R4LT50cCApCisgICAgICAgICAgICBfZ2NyeV9tcGlfZnJlZV9saW1iX3NwYWNlKCBjdHgtPnRwLCBjdHgtPnRwX25saW1icyApOworCWlmKCBjdHgtPnRzcGFjZSApCisJICAgIF9nY3J5X21waV9mcmVlX2xpbWJfc3BhY2UoIGN0eC0+dHNwYWNlLCBjdHgtPnRzcGFjZV9ubGltYnMgKTsKKwlnY3J5X2ZyZWUoIGN0eCApOworICAgIH0KK30KKworLyogTXVsdGlwbHkgdGhlIG5hdHVyYWwgbnVtYmVycyB1IChwb2ludGVkIHRvIGJ5IFVQLCB3aXRoIFVTSVpFIGxpbWJzKQorICogYW5kIHYgKHBvaW50ZWQgdG8gYnkgVlAsIHdpdGggVlNJWkUgbGltYnMpLCBhbmQgc3RvcmUgdGhlIHJlc3VsdCBhdAorICogUFJPRFAuICBVU0laRSArIFZTSVpFIGxpbWJzIGFyZSBhbHdheXMgc3RvcmVkLCBidXQgaWYgdGhlIGlucHV0CisgKiBvcGVyYW5kcyBhcmUgbm9ybWFsaXplZC4gIFJldHVybiB0aGUgbW9zdCBzaWduaWZpY2FudCBsaW1iIG9mIHRoZQorICogcmVzdWx0LgorICoKKyAqIE5PVEU6IFRoZSBzcGFjZSBwb2ludGVkIHRvIGJ5IFBST0RQIGlzIG92ZXJ3cml0dGVuIGJlZm9yZSBmaW5pc2hlZAorICogd2l0aCBVIGFuZCBWLCBzbyBvdmVybGFwIGlzIGFuIGVycm9yLgorICoKKyAqIEFyZ3VtZW50IGNvbnN0cmFpbnRzOgorICogMS4gVVNJWkUgPj0gVlNJWkUuCisgKiAyLiBQUk9EUCAhPSBVUCBhbmQgUFJPRFAgIT0gVlAsIGkuZS4gdGhlIGRlc3RpbmF0aW9uCisgKiAgICBtdXN0IGJlIGRpc3RpbmN0IGZyb20gdGhlIG11bHRpcGxpZXIgYW5kIHRoZSBtdWx0aXBsaWNhbmQuCisgKi8KKworbXBpX2xpbWJfdAorX2djcnlfbXBpaF9tdWwoIG1waV9wdHJfdCBwcm9kcCwgbXBpX3B0cl90IHVwLCBtcGlfc2l6ZV90IHVzaXplLAorICAgICAgICAgICAgICAgICAgIG1waV9wdHJfdCB2cCwgbXBpX3NpemVfdCB2c2l6ZSkKK3sKKyAgICBtcGlfcHRyX3QgcHJvZF9lbmRwID0gcHJvZHAgKyB1c2l6ZSArIHZzaXplIC0gMTsKKyAgICBtcGlfbGltYl90IGN5OworICAgIHN0cnVjdCBrYXJhdHN1YmFfY3R4IGN0eDsKKworICAgIGlmKCB2c2l6ZSA8IEtBUkFUU1VCQV9USFJFU0hPTEQgKSB7CisJbXBpX3NpemVfdCBpOworCW1waV9saW1iX3Qgdl9saW1iOworCisJaWYoICF2c2l6ZSApCisJICAgIHJldHVybiAwOworCisJLyogTXVsdGlwbHkgYnkgdGhlIGZpcnN0IGxpbWIgaW4gViBzZXBhcmF0ZWx5LCBhcyB0aGUgcmVzdWx0IGNhbiBiZQorCSAqIHN0b3JlZCAobm90IGFkZGVkKSB0byBQUk9ELglXZSBhbHNvIGF2b2lkIGEgbG9vcCBmb3IgemVyb2luZy4gICovCisJdl9saW1iID0gdnBbMF07CisJaWYoIHZfbGltYiA8PSAxICkgeworCSAgICBpZiggdl9saW1iID09IDEgKQorCQlNUE5fQ09QWSggcHJvZHAsIHVwLCB1c2l6ZSApOworCSAgICBlbHNlCisJCU1QTl9aRVJPKCBwcm9kcCwgdXNpemUgKTsKKwkgICAgY3kgPSAwOworCX0KKwllbHNlCisJICAgIGN5ID0gX2djcnlfbXBpaF9tdWxfMSggcHJvZHAsIHVwLCB1c2l6ZSwgdl9saW1iICk7CisKKwlwcm9kcFt1c2l6ZV0gPSBjeTsKKwlwcm9kcCsrOworCisJLyogRm9yIGVhY2ggaXRlcmF0aW9uIGluIHRoZSBvdXRlciBsb29wLCBtdWx0aXBseSBvbmUgbGltYiBmcm9tCisJICogVSB3aXRoIG9uZSBsaW1iIGZyb20gViwgYW5kIGFkZCBpdCB0byBQUk9ELgkqLworCWZvciggaSA9IDE7IGkgPCB2c2l6ZTsgaSsrICkgeworCSAgICB2X2xpbWIgPSB2cFtpXTsKKwkgICAgaWYoIHZfbGltYiA8PSAxICkgeworCQljeSA9IDA7CisJCWlmKCB2X2xpbWIgPT0gMSApCisJCSAgIGN5ID0gX2djcnlfbXBpaF9hZGRfbihwcm9kcCwgcHJvZHAsIHVwLCB1c2l6ZSk7CisJICAgIH0KKwkgICAgZWxzZQorCQljeSA9IF9nY3J5X21waWhfYWRkbXVsXzEocHJvZHAsIHVwLCB1c2l6ZSwgdl9saW1iKTsKKworCSAgICBwcm9kcFt1c2l6ZV0gPSBjeTsKKwkgICAgcHJvZHArKzsKKwl9CisKKwlyZXR1cm4gY3k7CisgICAgfQorCisgICAgbWVtc2V0KCAmY3R4LCAwLCBzaXplb2YgY3R4ICk7CisgICAgX2djcnlfbXBpaF9tdWxfa2FyYXRzdWJhX2Nhc2UoIHByb2RwLCB1cCwgdXNpemUsIHZwLCB2c2l6ZSwgJmN0eCApOworICAgIF9nY3J5X21waWhfcmVsZWFzZV9rYXJhdHN1YmFfY3R4KCAmY3R4ICk7CisgICAgcmV0dXJuICpwcm9kX2VuZHA7Cit9CisKKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9tcGl1dGlsLmMgYi9saWJnY3J5cHQtMS40LjYvbXBpL21waXV0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGM1MjExCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9tcGl1dGlsLmMKQEAgLTAsMCArMSw0NjIgQEAKKy8qIG1waXV0aWwuYWMgIC0gIFV0aWxpdHkgZnVuY3Rpb25zIGZvciBNUEkKKyAqIENvcHlyaWdodCAoQykgMTk5OCwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywKKyAqICAgICAgICAgICAgICAgMjAwNyAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZzEwbGliLmgiCisjaW5jbHVkZSAibXBpLWludGVybmFsLmgiCisjaW5jbHVkZSAibWVtb3J5LmgiCisjaW5jbHVkZSAibW9kLXNvdXJjZS1pbmZvLmgiCisKKworY29uc3QgY2hhciAqCitfZ2NyeV9tcGlfZ2V0X2h3X2NvbmZpZyAodm9pZCkKK3sKKyAgcmV0dXJuIG1vZF9zb3VyY2VfaW5mbyArIDE7Cit9CisKKworLyoqKioqKioqKioqKioqKioKKyAqIE5vdGU6ICBJdCB3YXMgYSBiYWQgaWRlYSB0byB1c2UgdGhlIG51bWJlciBvZiBsaW1icyB0byBhbGxvY2F0ZQorICoJICBiZWNhdXNlIG9uIGEgYWxwaGEgdGhlIGxpbWJzIGFyZSBsYXJnZSBidXQgd2Ugbm9ybWFsbHkgbmVlZAorICoJICBpbnRlZ2VycyBvZiBuIGJpdHMgLSBTbyB3ZSBzaG91bGQgY2hhbmdlIHRoaXMgdG8gYml0cyAob3IgYnl0ZXMpLgorICoKKyAqCSAgQnV0IG1waV9hbGxvYyBpcyB1c2VkIGluIGEgbG90IG9mIHBsYWNlcyA6LSguICBOZXcgY29kZQorICoJICBzaG91bGQgdXNlIG1waV9uZXcuCisgKi8KK2djcnlfbXBpX3QKK19nY3J5X21waV9hbGxvYyggdW5zaWduZWQgbmxpbWJzICkKK3sKKyAgICBnY3J5X21waV90IGE7CisKKyAgICBhID0gZ2NyeV94bWFsbG9jKCBzaXplb2YgKmEgKTsKKyAgICBhLT5kID0gbmxpbWJzPyBtcGlfYWxsb2NfbGltYl9zcGFjZSggbmxpbWJzLCAwICkgOiBOVUxMOworICAgIGEtPmFsbG9jZWQgPSBubGltYnM7CisgICAgYS0+bmxpbWJzID0gMDsKKyAgICBhLT5zaWduID0gMDsKKyAgICBhLT5mbGFncyA9IDA7CisgICAgcmV0dXJuIGE7Cit9CisKK3ZvaWQKK19nY3J5X21waV9tX2NoZWNrKCBnY3J5X21waV90IGEgKQoreworICAgIF9nY3J5X2NoZWNrX2hlYXAoYSk7CisgICAgX2djcnlfY2hlY2tfaGVhcChhLT5kKTsKK30KKworZ2NyeV9tcGlfdAorX2djcnlfbXBpX2FsbG9jX3NlY3VyZSggdW5zaWduZWQgbmxpbWJzICkKK3sKKyAgICBnY3J5X21waV90IGE7CisKKyAgICBhID0gZ2NyeV94bWFsbG9jKCBzaXplb2YgKmEgKTsKKyAgICBhLT5kID0gbmxpbWJzPyBtcGlfYWxsb2NfbGltYl9zcGFjZSggbmxpbWJzLCAxICkgOiBOVUxMOworICAgIGEtPmFsbG9jZWQgPSBubGltYnM7CisgICAgYS0+ZmxhZ3MgPSAxOworICAgIGEtPm5saW1icyA9IDA7CisgICAgYS0+c2lnbiA9IDA7CisgICAgcmV0dXJuIGE7Cit9CisKKworCittcGlfcHRyX3QKK19nY3J5X21waV9hbGxvY19saW1iX3NwYWNlKCB1bnNpZ25lZCBpbnQgbmxpbWJzLCBpbnQgc2VjdXJlICkKK3sKKyAgICBtcGlfcHRyX3QgcDsKKyAgICBzaXplX3QgbGVuOworCisgICAgbGVuID0gKG5saW1icyA/IG5saW1icyA6IDEpICogc2l6ZW9mIChtcGlfbGltYl90KTsKKyAgICBwID0gc2VjdXJlID8gZ2NyeV94bWFsbG9jX3NlY3VyZSAobGVuKSA6IGdjcnlfeG1hbGxvYyAobGVuKTsKKyAgICBpZiAoISBubGltYnMpCisgICAgICAqcCA9IDA7CisKKyAgICByZXR1cm4gcDsKK30KKwordm9pZAorX2djcnlfbXBpX2ZyZWVfbGltYl9zcGFjZSggbXBpX3B0cl90IGEsIHVuc2lnbmVkIGludCBubGltYnMpCit7CisgIGlmIChhKQorICAgIHsKKyAgICAgIHNpemVfdCBsZW4gPSBubGltYnMgKiBzaXplb2YobXBpX2xpbWJfdCk7CisgICAgICAKKyAgICAgIC8qIElmIHdlIGhhdmUgaW5mb3JtYXRpb24gb24gdGhlIG51bWJlciBvZiBhbGxvY2F0ZWQgbGltYnMsIHdlCisgICAgICAgICBiZXR0ZXIgd2lwZSB0aGF0IHNwYWNlIG91dC4gIFRoaXMgaXMgYSBmYWlsc2FmZSBmZWF0dXJlIGlmCisgICAgICAgICBzZWN1cmUgbWVtb3J5IGhhcyBiZWVuIGRpc2FibGVkIG9yIHdhcyBub3QgcHJvcGVybHkKKyAgICAgICAgIGltcGxlbWVudGVkIGluIHVzZXIgcHJvdmlkZWQgYWxsb2NhdGlvbiBmdW5jdGlvbnMuICovCisgICAgICBpZiAobGVuKQorICAgICAgICB3aXBlbWVtb3J5IChhLCBsZW4pOworICAgICAgZ2NyeV9mcmVlKGEpOworICAgIH0KK30KKworCit2b2lkCitfZ2NyeV9tcGlfYXNzaWduX2xpbWJfc3BhY2UoIGdjcnlfbXBpX3QgYSwgbXBpX3B0cl90IGFwLCB1bnNpZ25lZCBpbnQgbmxpbWJzICkKK3sKKyAgX2djcnlfbXBpX2ZyZWVfbGltYl9zcGFjZSAoYS0+ZCwgYS0+YWxsb2NlZCk7CisgIGEtPmQgPSBhcDsKKyAgYS0+YWxsb2NlZCA9IG5saW1iczsKK30KKworCisKKy8qKioqKioqKioqKioqKioqCisgKiBSZXNpemUgdGhlIGFycmF5IG9mIEEgdG8gTkxJTUJTLiBUaGUgYWRkaXRpb25hbCBzcGFjZSBpcyBjbGVhcmVkCisgKiAoc2V0IHRvIDApLgorICovCit2b2lkCitfZ2NyeV9tcGlfcmVzaXplIChnY3J5X21waV90IGEsIHVuc2lnbmVkIG5saW1icykKK3sKKyAgc2l6ZV90IGk7CisKKyAgaWYgKG5saW1icyA8PSBhLT5hbGxvY2VkKQorICAgIHsKKyAgICAgIC8qIFdlIG9ubHkgbmVlZCB0byBjbGVhciB0aGUgbmV3IHNwYWNlICh0aGlzIGlzIGEgbm9wIGlmIHRoZQorICAgICAgICAgbGltYiBzcGFjZSBpcyBhbHJlYWR5IG9mIHRoZSBjb3JyZWN0IHNpemUuICovCisgICAgICBmb3IgKGk9YS0+bmxpbWJzOyBpIDwgYS0+YWxsb2NlZDsgaSsrKQorICAgICAgICBhLT5kW2ldID0gMDsKKyAgICAgIHJldHVybjsgCisgICAgfQorCisgIC8qIEFjdHVhbGx5IHJlc2l6ZSB0aGUgbGltYiBzcGFjZS4gICovCisgIGlmIChhLT5kKQorICAgIHsKKyAgICAgIGEtPmQgPSBnY3J5X3hyZWFsbG9jIChhLT5kLCBubGltYnMgKiBzaXplb2YgKG1waV9saW1iX3QpKTsKKyAgICAgIGZvciAoaT1hLT5hbGxvY2VkOyBpIDwgbmxpbWJzOyBpKyspCisgICAgICAgIGEtPmRbaV0gPSAwOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChhLT5mbGFncyAmIDEpCisJLyogU2VjdXJlIG1lbW9yeSBpcyB3YW50ZWQuICAqLworCWEtPmQgPSBnY3J5X3hjYWxsb2Nfc2VjdXJlIChubGltYnMgLCBzaXplb2YgKG1waV9saW1iX3QpKTsKKyAgICAgIGVsc2UKKwkvKiBTdGFuZGFyZCBtZW1vcnkuICAqLworCWEtPmQgPSBnY3J5X3hjYWxsb2MgKG5saW1icyAsIHNpemVvZiAobXBpX2xpbWJfdCkpOworICAgIH0KKyAgYS0+YWxsb2NlZCA9IG5saW1iczsKK30KKwordm9pZAorX2djcnlfbXBpX2NsZWFyKCBnY3J5X21waV90IGEgKQoreworICAgIGEtPm5saW1icyA9IDA7CisgICAgYS0+ZmxhZ3MgPSAwOworfQorCisKK3ZvaWQKK19nY3J5X21waV9mcmVlKCBnY3J5X21waV90IGEgKQoreworICBpZiAoIWEgKQorICAgIHJldHVybjsKKyAgaWYgKChhLT5mbGFncyAmIDQpKQorICAgIGdjcnlfZnJlZSggYS0+ZCApOworICBlbHNlCisgICAgeworICAgICAgX2djcnlfbXBpX2ZyZWVfbGltYl9zcGFjZShhLT5kLCBhLT5hbGxvY2VkKTsKKyAgICB9CisgIGlmICgoYS0+ZmxhZ3MgJiB+NykpCisgICAgbG9nX2J1ZygiaW52YWxpZCBmbGFnIHZhbHVlIGluIG1waVxuIik7CisgIGdjcnlfZnJlZShhKTsKK30KKworc3RhdGljIHZvaWQKK21waV9zZXRfc2VjdXJlKCBnY3J5X21waV90IGEgKQoreworICBtcGlfcHRyX3QgYXAsIGJwOworCisgIGlmICggKGEtPmZsYWdzICYgMSkgKQorICAgIHJldHVybjsKKyAgYS0+ZmxhZ3MgfD0gMTsKKyAgYXAgPSBhLT5kOworICBpZiAoIWEtPm5saW1icykKKyAgICB7CisgICAgICBnY3J5X2Fzc2VydCAoIWFwKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGJwID0gbXBpX2FsbG9jX2xpbWJfc3BhY2UgKGEtPm5saW1icywgMSk7CisgIE1QTl9DT1BZKCBicCwgYXAsIGEtPm5saW1icyApOworICBhLT5kID0gYnA7CisgIF9nY3J5X21waV9mcmVlX2xpbWJfc3BhY2UgKGFwLCBhLT5hbGxvY2VkKTsKK30KKworCitnY3J5X21waV90CitnY3J5X21waV9zZXRfb3BhcXVlKCBnY3J5X21waV90IGEsIHZvaWQgKnAsIHVuc2lnbmVkIGludCBuYml0cyApCit7CisgIGlmICghYSkgCisgICAgYSA9IG1waV9hbGxvYygwKTsKKyAgICAKKyAgaWYoIGEtPmZsYWdzICYgNCApCisgICAgZ2NyeV9mcmVlKCBhLT5kICk7CisgIGVsc2UgCisgICAgX2djcnlfbXBpX2ZyZWVfbGltYl9zcGFjZSAoYS0+ZCwgYS0+YWxsb2NlZCk7CisKKyAgYS0+ZCA9IHA7CisgIGEtPmFsbG9jZWQgPSAwOworICBhLT5ubGltYnMgPSAwOworICBhLT5zaWduICA9IG5iaXRzOworICBhLT5mbGFncyA9IDQ7CisgIHJldHVybiBhOworfQorCisKK3ZvaWQgKgorZ2NyeV9tcGlfZ2V0X29wYXF1ZSggZ2NyeV9tcGlfdCBhLCB1bnNpZ25lZCBpbnQgKm5iaXRzICkKK3sKKyAgICBpZiggIShhLT5mbGFncyAmIDQpICkKKwlsb2dfYnVnKCJtcGlfZ2V0X29wYXF1ZSBvbiBub3JtYWwgbXBpXG4iKTsKKyAgICBpZiggbmJpdHMgKQorCSpuYml0cyA9IGEtPnNpZ247CisgICAgcmV0dXJuIGEtPmQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioKKyAqIE5vdGU6IFRoaXMgY29weSBmdW5jdGlvbiBzaG91bGQgbm90IGludGVycHJldCB0aGUgTVBJCisgKgkgYnV0IGNvcHkgaXQgdHJhbnNwYXJlbnRseS4KKyAqLworZ2NyeV9tcGlfdAorZ2NyeV9tcGlfY29weSggZ2NyeV9tcGlfdCBhICkKK3sKKyAgICBpbnQgaTsKKyAgICBnY3J5X21waV90IGI7CisKKyAgICBpZiggYSAmJiAoYS0+ZmxhZ3MgJiA0KSApIHsKKwl2b2lkICpwID0gZ2NyeV9pc19zZWN1cmUoYS0+ZCk/IGdjcnlfeG1hbGxvY19zZWN1cmUoIChhLT5zaWduKzcpLzggKQorCQkJCSAgICAgOiBnY3J5X3htYWxsb2MoIChhLT5zaWduKzcpLzggKTsKKwltZW1jcHkoIHAsIGEtPmQsIChhLT5zaWduKzcpLzggKTsKKwliID0gZ2NyeV9tcGlfc2V0X29wYXF1ZSggTlVMTCwgcCwgYS0+c2lnbiApOworICAgIH0KKyAgICBlbHNlIGlmKCBhICkgeworCWIgPSBtcGlfaXNfc2VjdXJlKGEpPyBtcGlfYWxsb2Nfc2VjdXJlKCBhLT5ubGltYnMgKQorCQkJICAgIDogbXBpX2FsbG9jKCBhLT5ubGltYnMgKTsKKwliLT5ubGltYnMgPSBhLT5ubGltYnM7CisJYi0+c2lnbiA9IGEtPnNpZ247CisJYi0+ZmxhZ3MgID0gYS0+ZmxhZ3M7CisJZm9yKGk9MDsgaSA8IGItPm5saW1iczsgaSsrICkKKwkgICAgYi0+ZFtpXSA9IGEtPmRbaV07CisgICAgfQorICAgIGVsc2UKKwliID0gTlVMTDsKKyAgICByZXR1cm4gYjsKK30KKworCisvKioqKioqKioqKioqKioqKgorICogVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgYW4gTVBJIHdoaWNoIGlzIG9wdGltaXplZCB0byBob2xkCisgKiBhIHZhbHVlIGFzIGxhcmdlIGFzIHRoZSBvbmUgZ2l2ZW4gaW4gdGhlIGFyZ3VtZW50IGFuZCBhbGxvY2F0ZXMgaXQKKyAqIHdpdGggdGhlIHNhbWUgZmxhZ3MgYXMgQS4KKyAqLworZ2NyeV9tcGlfdAorX2djcnlfbXBpX2FsbG9jX2xpa2UoIGdjcnlfbXBpX3QgYSApCit7CisgICAgZ2NyeV9tcGlfdCBiOworCisgICAgaWYoIGEgJiYgKGEtPmZsYWdzICYgNCkgKSB7CisJaW50IG4gPSAoYS0+c2lnbis3KS84OworCXZvaWQgKnAgPSBnY3J5X2lzX3NlY3VyZShhLT5kKT8gZ2NyeV9tYWxsb2Nfc2VjdXJlKCBuICkKKwkJCQkgICAgIDogZ2NyeV9tYWxsb2MoIG4gKTsKKwltZW1jcHkoIHAsIGEtPmQsIG4gKTsKKwliID0gZ2NyeV9tcGlfc2V0X29wYXF1ZSggTlVMTCwgcCwgYS0+c2lnbiApOworICAgIH0KKyAgICBlbHNlIGlmKCBhICkgeworCWIgPSBtcGlfaXNfc2VjdXJlKGEpPyBtcGlfYWxsb2Nfc2VjdXJlKCBhLT5ubGltYnMgKQorCQkJICAgIDogbXBpX2FsbG9jKCBhLT5ubGltYnMgKTsKKwliLT5ubGltYnMgPSAwOworCWItPnNpZ24gPSAwOworCWItPmZsYWdzID0gYS0+ZmxhZ3M7CisgICAgfQorICAgIGVsc2UKKwliID0gTlVMTDsKKyAgICByZXR1cm4gYjsKK30KKworCitnY3J5X21waV90CitnY3J5X21waV9zZXQoIGdjcnlfbXBpX3QgdywgZ2NyeV9tcGlfdCB1KQoreworICBtcGlfcHRyX3Qgd3AsIHVwOworICBtcGlfc2l6ZV90IHVzaXplID0gdS0+bmxpbWJzOworICBpbnQgdXNpZ24gPSB1LT5zaWduOworICAKKyAgaWYgKCF3KQorICAgIHcgPSBfZ2NyeV9tcGlfYWxsb2MoIG1waV9nZXRfbmxpbWJzKHUpICk7CisgIFJFU0laRV9JRl9ORUVERUQodywgdXNpemUpOworICB3cCA9IHctPmQ7CisgIHVwID0gdS0+ZDsKKyAgTVBOX0NPUFkoIHdwLCB1cCwgdXNpemUgKTsKKyAgdy0+bmxpbWJzID0gdXNpemU7CisgIHctPmZsYWdzID0gdS0+ZmxhZ3M7CisgIHctPnNpZ24gPSB1c2lnbjsKKyAgcmV0dXJuIHc7Cit9CisKKworZ2NyeV9tcGlfdAorZ2NyeV9tcGlfc2V0X3VpKCBnY3J5X21waV90IHcsIHVuc2lnbmVkIGxvbmcgdSkKK3sKKyAgaWYgKCF3KQorICAgIHcgPSBfZ2NyeV9tcGlfYWxsb2MgKDEpOworICAvKiBGSVhNRTogSWYgVSBpcyAwIHdlIGhhdmUgbm8gbmVlZCB0byByZXNpemUgYW5kIHRodXMgcG9zc2libGUKKyAgICAgYWxsb2NhdGluZyB0aGUgdGhlIGxpbWJzLiAqLworICBSRVNJWkVfSUZfTkVFREVEKHcsIDEpOworICB3LT5kWzBdID0gdTsKKyAgdy0+bmxpbWJzID0gdT8gMTowOworICB3LT5zaWduID0gMDsKKyAgdy0+ZmxhZ3MgPSAwOworICByZXR1cm4gdzsKK30KKworZ2NyeV9lcnJfY29kZV90CitfZ2NyeV9tcGlfZ2V0X3VpIChnY3J5X21waV90IHcsIHVuc2lnbmVkIGxvbmcgKnUpCit7CisgIGdjcnlfZXJyX2NvZGVfdCBlcnIgPSBHUEdfRVJSX05PX0VSUk9SOworICB1bnNpZ25lZCBsb25nIHggPSAwOworCisgIGlmICh3LT5ubGltYnMgPiAxKQorICAgIGVyciA9IEdQR19FUlJfVE9PX0xBUkdFOworICBlbHNlIGlmICh3LT5ubGltYnMgPT0gMSkKKyAgICB4ID0gdy0+ZFswXTsKKyAgZWxzZQorICAgIHggPSAwOworCisgIGlmICghIGVycikKKyAgICAqdSA9IHg7CisgIAorICByZXR1cm4gZXJyOworfQorCitnY3J5X2Vycm9yX3QKK2djcnlfbXBpX2dldF91aSAoZ2NyeV9tcGlfdCB3LCB1bnNpZ25lZCBsb25nICp1KQoreworICBnY3J5X2Vycl9jb2RlX3QgZXJyID0gR1BHX0VSUl9OT19FUlJPUjsKKworICBlcnIgPSBfZ2NyeV9tcGlfZ2V0X3VpICh3LCB1KTsKKyAgCisgIHJldHVybiBnY3J5X2Vycm9yIChlcnIpOworfQorCitnY3J5X21waV90CitfZ2NyeV9tcGlfYWxsb2Nfc2V0X3VpKCB1bnNpZ25lZCBsb25nIHUpCit7CisgICAgZ2NyeV9tcGlfdCB3ID0gbXBpX2FsbG9jKDEpOworICAgIHctPmRbMF0gPSB1OworICAgIHctPm5saW1icyA9IHU/IDE6MDsKKyAgICB3LT5zaWduID0gMDsKKyAgICByZXR1cm4gdzsKK30KKwordm9pZAorZ2NyeV9tcGlfc3dhcCggZ2NyeV9tcGlfdCBhLCBnY3J5X21waV90IGIpCit7CisgICAgc3RydWN0IGdjcnlfbXBpIHRtcDsKKworICAgIHRtcCA9ICphOyAqYSA9ICpiOyAqYiA9IHRtcDsKK30KKworCitnY3J5X21waV90CitnY3J5X21waV9uZXcoIHVuc2lnbmVkIGludCBuYml0cyApCit7CisgICAgcmV0dXJuIF9nY3J5X21waV9hbGxvYyAoIChuYml0cytCSVRTX1BFUl9NUElfTElNQi0xKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIEJJVFNfUEVSX01QSV9MSU1CICk7Cit9CisKKworZ2NyeV9tcGlfdAorZ2NyeV9tcGlfc25ldyggdW5zaWduZWQgaW50IG5iaXRzICkKK3sKKyAgcmV0dXJuIF9nY3J5X21waV9hbGxvY19zZWN1cmUgKCAobmJpdHMrQklUU19QRVJfTVBJX0xJTUItMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIEJJVFNfUEVSX01QSV9MSU1CICk7Cit9CisKK3ZvaWQKK2djcnlfbXBpX3JlbGVhc2UoIGdjcnlfbXBpX3QgYSApCit7CisgICAgX2djcnlfbXBpX2ZyZWUoIGEgKTsKK30KKwordm9pZAorZ2NyeV9tcGlfcmFuZG9taXplKCBnY3J5X21waV90IHcsCisJCSAgICB1bnNpZ25lZCBpbnQgbmJpdHMsIGVudW0gZ2NyeV9yYW5kb21fbGV2ZWwgbGV2ZWwgKQoreworICB1bnNpZ25lZCBjaGFyICpwOworICBzaXplX3QgbmJ5dGVzID0gKG5iaXRzKzcpLzg7CisgIAorICBpZiAobGV2ZWwgPT0gR0NSWV9XRUFLX1JBTkRPTSkKKyAgICB7CisgICAgICBwID0gbXBpX2lzX3NlY3VyZSh3KSA/IGdjcnlfeG1hbGxvY19zZWN1cmUgKG5ieXRlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZ2NyeV94bWFsbG9jIChuYnl0ZXMpOworICAgICAgZ2NyeV9jcmVhdGVfbm9uY2UgKHAsIG5ieXRlcyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcCA9IG1waV9pc19zZWN1cmUodykgPyBnY3J5X3JhbmRvbV9ieXRlc19zZWN1cmUgKG5ieXRlcywgbGV2ZWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGdjcnlfcmFuZG9tX2J5dGVzIChuYnl0ZXMsIGxldmVsKTsKKyAgICB9CisgIF9nY3J5X21waV9zZXRfYnVmZmVyKCB3LCBwLCBuYnl0ZXMsIDAgKTsKKyAgZ2NyeV9mcmVlIChwKTsKK30KKworCit2b2lkCitnY3J5X21waV9zZXRfZmxhZyggZ2NyeV9tcGlfdCBhLCBlbnVtIGdjcnlfbXBpX2ZsYWcgZmxhZyApCit7CisgICAgc3dpdGNoKCBmbGFnICkgeworICAgICAgY2FzZSBHQ1JZTVBJX0ZMQUdfU0VDVVJFOiAgbXBpX3NldF9zZWN1cmUoYSk7IGJyZWFrOworICAgICAgY2FzZSBHQ1JZTVBJX0ZMQUdfT1BBUVVFOgorICAgICAgZGVmYXVsdDogbG9nX2J1ZygiaW52YWxpZCBmbGFnIHZhbHVlXG4iKTsKKyAgICB9Cit9CisKK3ZvaWQKK2djcnlfbXBpX2NsZWFyX2ZsYWcoIGdjcnlfbXBpX3QgYSwgZW51bSBnY3J5X21waV9mbGFnIGZsYWcgKQoreworICAodm9pZClhOyAvKiBOb3QgeWV0IHVzZWQuICovCisKKyAgc3dpdGNoIChmbGFnKQorICAgIHsKKyAgICBjYXNlIEdDUllNUElfRkxBR19TRUNVUkU6CisgICAgY2FzZSBHQ1JZTVBJX0ZMQUdfT1BBUVVFOgorICAgIGRlZmF1bHQ6IGxvZ19idWcoImludmFsaWQgZmxhZyB2YWx1ZVxuIik7CisgICAgfQorfQorCitpbnQKK2djcnlfbXBpX2dldF9mbGFnKCBnY3J5X21waV90IGEsIGVudW0gZ2NyeV9tcGlfZmxhZyBmbGFnICkKK3sKKyAgc3dpdGNoIChmbGFnKQorICAgIHsKKyAgICBjYXNlIEdDUllNUElfRkxBR19TRUNVUkU6IHJldHVybiAoYS0+ZmxhZ3MgJiAxKTsKKyAgICBjYXNlIEdDUllNUElfRkxBR19PUEFRVUU6IHJldHVybiAoYS0+ZmxhZ3MgJiA0KTsKKyAgICBkZWZhdWx0OiBsb2dfYnVnKCJpbnZhbGlkIGZsYWcgdmFsdWVcbiIpOworICAgIH0KKyAgLypOT1RSRUFDSEVEKi8KKyAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvcGE3MTAwL01hbmlmZXN0IGIvbGliZ2NyeXB0LTEuNC42L21waS9wYTcxMDAvTWFuaWZlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA3NWFiMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvcGE3MTAwL01hbmlmZXN0CkBAIC0wLDAgKzEsMjIgQEAKKyMgTWFuaWZlc3QgLSBjaGVja3N1bXMgCisjIENvcHlyaWdodCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisjCisjIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorCittcGloLWxzaGlmdC5TCittcGloLXJzaGlmdC5TCiskbmFtZXMkIGlRQ1ZBd1VBUCtMbVZqRUFucDgzMlMvN0FRS2xFUVFBdjIreC9kK1owdDhGd3dIbHhLcElLT0pEcjllK1kyaTh5OG9yY0lFYTNkbndVNUxNT0gzRXpGb05TRDljcmMzMUZNb2tnbS9YNXhlTGpxUlRkY21HSHlKSlFKRFBKVkp5dWFPbTZxSEphRnp6ZkpqcmZNVzY2bkp4Zk5TWElpSW00RGdwUDIwTm11bWFvckxDa2lJWjVaODFLR0FjOEZpUmdnYlJWWXgrd3hvPT1Wamg5CmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL3BhNzEwMC9kaXN0ZmlsZXMgYi9saWJnY3J5cHQtMS40LjYvbXBpL3BhNzEwMC9kaXN0ZmlsZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFjZGU0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvcGE3MTAwL2Rpc3RmaWxlcwpAQCAtMCwwICsxLDQgQEAKK01hbmlmZXN0CittcGloLWxzaGlmdC5TCittcGloLXJzaGlmdC5TCisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvcGE3MTAwL21waWgtbHNoaWZ0LlMgYi9saWJnY3J5cHQtMS40LjYvbXBpL3BhNzEwMC9tcGloLWxzaGlmdC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZGUxOTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL3BhNzEwMC9tcGloLWxzaGlmdC5TCkBAIC0wLDAgKzEsOTYgQEAKKy8qIGhwcGEgICBsc2hpZnQKKyAqCSAgb3B0aW1pemVkIGZvciB0aGUgUEE3MTAwLCB3aGVyZSBpdCBydW5zIGF0IDMuMjUgY3ljbGVzL2xpbWIKKyAqIAorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTQsIDE5OTgsIAorICogICAgICAgICAgICAgICAgICAgIDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICovCisKKworCisvKioqKioqKioqKioqKioqKioqKgorICogbXBpX2xpbWJfdAorICogX2djcnlfbXBpaF9sc2hpZnQoIG1waV9wdHJfdCB3cCwJKGdyMjYpCisgKgkJICAgbXBpX3B0cl90IHVwLAkoZ3IyNSkKKyAqCQkgICBtcGlfc2l6ZV90IHVzaXplLAkoZ3IyNCkKKyAqCQkgICB1bnNpZ25lZCBjbnQpCShncjIzKQorICovCisKKwkuY29kZQorCS5leHBvcnQgCV9nY3J5X21waWhfbHNoaWZ0CisJLmxhYmVsCQlfZ2NyeV9tcGloX2xzaGlmdAorCS5wcm9jCisJLmNhbGxpbmZvCWZyYW1lPTY0LG5vX2NhbGxzCisJLmVudHJ5CisKKwlzaDJhZGQJCSVyMjQsJXIyNSwlcjI1CisJc2gyYWRkCQklcjI0LCVyMjYsJXIyNgorCWxkd3MsbWIgCS00KDAsJXIyNSksJXIyMgorCXN1YmkJCTMyLCVyMjMsJXIxCisJbXRzYXIJCSVyMQorCWFkZGliLD0gCS0xLCVyMjQsTCQwMDA0CisJdnNoZAkJJXIwLCVyMjIsJXIyOAkJOyBjb21wdXRlIGNhcnJ5IG91dCBsaW1iCisJbGR3cyxtYiAJLTQoMCwlcjI1KSwlcjI5CisJYWRkaWIsPD0JLTUsJXIyNCxMJHJlc3QKKwl2c2hkCQklcjIyLCVyMjksJXIyMAorCisJLmxhYmVsCUwkbG9vcAorCWxkd3MsbWIgCS00KDAsJXIyNSksJXIyMgorCXN0d3MsbWIgCSVyMjAsLTQoMCwlcjI2KQorCXZzaGQJCSVyMjksJXIyMiwlcjIwCisJbGR3cyxtYiAJLTQoMCwlcjI1KSwlcjI5CisJc3R3cyxtYiAJJXIyMCwtNCgwLCVyMjYpCisJdnNoZAkJJXIyMiwlcjI5LCVyMjAKKwlsZHdzLG1iIAktNCgwLCVyMjUpLCVyMjIKKwlzdHdzLG1iIAklcjIwLC00KDAsJXIyNikKKwl2c2hkCQklcjI5LCVyMjIsJXIyMAorCWxkd3MsbWIgCS00KDAsJXIyNSksJXIyOQorCXN0d3MsbWIgCSVyMjAsLTQoMCwlcjI2KQorCWFkZGliLD4gCS00LCVyMjQsTCRsb29wCisJdnNoZAkJJXIyMiwlcjI5LCVyMjAKKworCS5sYWJlbAlMJHJlc3QKKwlhZGRpYiw9IAk0LCVyMjQsTCRlbmQxCisJbm9wCisJLmxhYmVsCUwkZWxvb3AKKwlsZHdzLG1iIAktNCgwLCVyMjUpLCVyMjIKKwlzdHdzLG1iIAklcjIwLC00KDAsJXIyNikKKwlhZGRpYiw8PQktMSwlcjI0LEwkZW5kMgorCXZzaGQJCSVyMjksJXIyMiwlcjIwCisJbGR3cyxtYiAJLTQoMCwlcjI1KSwlcjI5CisJc3R3cyxtYiAJJXIyMCwtNCgwLCVyMjYpCisJYWRkaWIsPiAJLTEsJXIyNCxMJGVsb29wCisJdnNoZAkJJXIyMiwlcjI5LCVyMjAKKworCS5sYWJlbAlMJGVuZDEKKwlzdHdzLG1iIAklcjIwLC00KDAsJXIyNikKKwl2c2hkCQklcjI5LCVyMCwlcjIwCisJYnYJCTAoJXIyKQorCXN0dwkJJXIyMCwtNCgwLCVyMjYpCisJLmxhYmVsCUwkZW5kMgorCXN0d3MsbWIgCSVyMjAsLTQoMCwlcjI2KQorCS5sYWJlbAlMJDAwMDQKKwl2c2hkCQklcjIyLCVyMCwlcjIwCisJYnYJCTAoJXIyKQorCXN0dwkJJXIyMCwtNCgwLCVyMjYpCisKKwkuZXhpdAorCS5wcm9jZW5kCisKKworCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL3BhNzEwMC9tcGloLXJzaGlmdC5TIGIvbGliZ2NyeXB0LTEuNC42L21waS9wYTcxMDAvbXBpaC1yc2hpZnQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjI0MjAyCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9wYTcxMDAvbXBpaC1yc2hpZnQuUwpAQCAtMCwwICsxLDkyIEBACisvKiBocHBhICAgcnNoaWZ0CisgKgkgIG9wdGltaXplZCBmb3IgdGhlIFBBNzEwMCwgd2hlcmUgaXQgcnVucyBhdCAzLjI1IGN5Y2xlcy9saW1iCisgKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTQsIDE5OTgsCisgKiAgICAgICAgICAgICAgICAgICAgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqCisgKiBtcGlfbGltYl90CisgKiBfZ2NyeV9tcGloX3JzaGlmdCggbXBpX3B0cl90IHdwLCAgICAgICAoZ3IyNikKKyAqCQkgICBtcGlfcHRyX3QgdXAsICAgICAgIChncjI1KQorICoJCSAgIG1waV9zaXplX3QgdXNpemUsICAgKGdyMjQpCisgKgkJICAgdW5zaWduZWQgY250KSAgICAgICAoZ3IyMykKKyAqLworCisJLmNvZGUKKwkuZXhwb3J0IAlfZ2NyeV9tcGloX3JzaGlmdAorCS5sYWJlbAkJX2djcnlfbXBpaF9yc2hpZnQKKwkucHJvYworCS5jYWxsaW5mbwlmcmFtZT02NCxub19jYWxscworCS5lbnRyeQorCisJbGR3cyxtYSAJNCgwLCVyMjUpLCVyMjIKKwltdHNhcgkJJXIyMworCWFkZGliLD0gCS0xLCVyMjQsTCRyMDA0CisJdnNoZAkJJXIyMiwlcjAsJXIyOAkJOyBjb21wdXRlIGNhcnJ5IG91dCBsaW1iCisJbGR3cyxtYSAJNCgwLCVyMjUpLCVyMjkKKwlhZGRpYiw8PQktNSwlcjI0LEwkcnJlc3QKKwl2c2hkCQklcjI5LCVyMjIsJXIyMAorCisJLmxhYmVsCUwkcm9vcAorCWxkd3MsbWEgCTQoMCwlcjI1KSwlcjIyCisJc3R3cyxtYSAJJXIyMCw0KDAsJXIyNikKKwl2c2hkCQklcjIyLCVyMjksJXIyMAorCWxkd3MsbWEgCTQoMCwlcjI1KSwlcjI5CisJc3R3cyxtYSAJJXIyMCw0KDAsJXIyNikKKwl2c2hkCQklcjI5LCVyMjIsJXIyMAorCWxkd3MsbWEgCTQoMCwlcjI1KSwlcjIyCisJc3R3cyxtYSAJJXIyMCw0KDAsJXIyNikKKwl2c2hkCQklcjIyLCVyMjksJXIyMAorCWxkd3MsbWEgCTQoMCwlcjI1KSwlcjI5CisJc3R3cyxtYSAJJXIyMCw0KDAsJXIyNikKKwlhZGRpYiw+IAktNCwlcjI0LEwkcm9vcAorCXZzaGQJCSVyMjksJXIyMiwlcjIwCisKKwkubGFiZWwJTCRycmVzdAorCWFkZGliLD0gCTQsJXIyNCxMJHJlbmQxCisJbm9wCisJLmxhYmVsCUwkZXJvb3AKKwlsZHdzLG1hIAk0KDAsJXIyNSksJXIyMgorCXN0d3MsbWEgCSVyMjAsNCgwLCVyMjYpCisJYWRkaWIsPD0JLTEsJXIyNCxMJHJlbmQyCisJdnNoZAkJJXIyMiwlcjI5LCVyMjAKKwlsZHdzLG1hIAk0KDAsJXIyNSksJXIyOQorCXN0d3MsbWEgCSVyMjAsNCgwLCVyMjYpCisJYWRkaWIsPiAJLTEsJXIyNCxMJGVyb29wCisJdnNoZAkJJXIyOSwlcjIyLCVyMjAKKworCS5sYWJlbAlMJHJlbmQxCisJc3R3cyxtYQkJJXIyMCw0KDAsJXIyNikKKwl2c2hkCQklcjAsJXIyOSwlcjIwCisJYnYJCTAoJXIyKQorCXN0dwkJJXIyMCwwKDAsJXIyNikKKwkubGFiZWwJTCRyZW5kMgorCXN0d3MsbWEJCSVyMjAsNCgwLCVyMjYpCisJLmxhYmVsCUwkcjAwNAorCXZzaGQJCSVyMCwlcjIyLCVyMjAKKwlidgkJMCglcjIpCisJc3R3CQklcjIwLDAoMCwlcjI2KQorCisJLmV4aXQKKwkucHJvY2VuZAorCisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvcGVudGl1bTQvUkVBRE1FIGIvbGliZ2NyeXB0LTEuNC42L21waS9wZW50aXVtNC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE1ZmM3ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvcGVudGl1bTQvUkVBRE1FCkBAIC0wLDAgKzEsMTE1IEBACitDb3B5cmlnaHQgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorMDIxMTAtMTMwMSwgVVNBLgorCisKKworCisgICAgICAgICAgICAgICAgICAgSU5URUwgUEVOVElVTS00IE1QTiBTVUJST1VUSU5FUworCisKK1RoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIG1wbiBmdW5jdGlvbnMgb3B0aW1pemVkIGZvciBJbnRlbCBQZW50aXVtLTQuCisKK1RoZSBtbXggc3ViZGlyZWN0b3J5IGhhcyByb3V0aW5lcyB1c2luZyBNTVggaW5zdHJ1Y3Rpb25zLCB0aGUgc3NlMgorc3ViZGlyZWN0b3J5IGhhcyByb3V0aW5lcyB1c2luZyBTU0UyIGluc3RydWN0aW9ucy4gIEFsbCBQNHMgaGF2ZSB0aGVzZSwgdGhlCitzZXBhcmF0ZSBkaXJlY3RvcmllcyBhcmUganVzdCBzbyBjb25maWd1cmUgY2FuIG9taXQgdGhhdCBjb2RlIGlmIHRoZQorYXNzZW1ibGVyIGRvZXNuJ3Qgc3VwcG9ydCBpdC4KKworCitTVEFUVVMKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeWNsZXMvbGltYgorCisJbXBuX2FkZF9uL3N1Yl9uICAgICAgICAgICAgNCBub3JtYWwsIDYgaW4tcGxhY2UKKworCW1wbl9tdWxfMSAgICAgICAgICAgICAgICAgIDQgbm9ybWFsLCA2IGluLXBsYWNlCisJbXBuX2FkZG11bF8xICAgICAgICAgICAgICAgNgorCW1wbl9zdWJtdWxfMSAgICAgICAgICAgICAgIDcKKworCW1wbl9tdWxfYmFzZWNhc2UgICAgICAgICAgIDYgY3ljbGVzL2Nyb3NzcHJvZHVjdCAoYXBwcm94KQorCisJbXBuX3Nxcl9iYXNlY2FzZSAgICAgICAgICAgMy41IGN5Y2xlcy9jcm9zc3Byb2R1Y3QgKGFwcHJveCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgNy4wIGN5Y2xlcy90cmlhbmdsZXByb2R1Y3QgKGFwcHJveCkKKworCW1wbl9sL3JzaGlmdCAgICAgICAgICAgICAgIDEuNzUKKworCisKK1RoZSBzaGlmdHMgb3VnaHQgdG8gYmUgYWJsZSB0byBnbyBhdCAxLjUgYy9sLCBidXQgbm90IG11Y2ggZWZmb3J0IGhhcyBiZWVuCithcHBsaWVkIHRvIHRoZW0geWV0LgorCitJbi1wbGFjZSBvcGVyYXRpb25zLCBhbmQgYWxsIGFkZG11bCwgc3VibXVsLCBtdWxfYmFzZWNhc2UgYW5kIHNxcl9iYXNlY2FzZQorY2FsbHMsIHN1ZmZlciBmcm9tIHBpcGVsaW5lIGFub21hbGllcyBhc3NvY2lhdGVkIHdpdGggd3JpdGUgY29tYmluaW5nIGFuZAorbW92ZCByZWFkcyBhbmQgd3JpdGVzIHRvIHRoZSBzYW1lIG9yIG5lYXJieSBsb2NhdGlvbnMuICBUaGUgbW92cQoraW5zdHJ1Y3Rpb25zIGRvIG5vdCB0cmlnZ2VyIHRoZSBzYW1lIGhhcmR3YXJlIHByb2JsZW1zLiAgVW5mb3J0dW5hdGVseSwKK3VzaW5nIG1vdnEgYW5kIHNwbGl0dGluZy9jb21iaW5pbmcgc2VlbXMgdG8gcmVxdWlyZSB0b28gbWFueSBleHRyYQoraW5zdHJ1Y3Rpb25zIHRvIGhlbHAuICBQZXJoYXBzIGZ1dHVyZSBjaGlwIHN0ZXBwaW5ncyB3aWxsIGJlIGJldHRlci4KKworCisKK05PVEVTCisKK1RoZSBQZW50aXVtLTQgcGlwZWxpbmUgIk5ldGJ1cnN0IiwgcHJvdmlkZXMgZm9yIHF1aXRlIGEgbnVtYmVyIG9mIHN1cnByaXNlcy4KK01hbnkgdHJhZGl0aW9uYWwgeDg2IGluc3RydWN0aW9ucyBydW4gdmVyeSBzbG93bHksIHJlcXVpcmluZyB1c2Ugb2YKK2FsdGVyYXRpdmUgaW5zdHJ1Y3Rpb25zIGZvciBhY2NlcHRhYmxlIHBlcmZvcm1hbmNlLgorCithZGNsIGFuZCBzYmJsIGFyZSBxdWl0ZSBzbG93IGF0IDggY3ljbGVzIGZvciByZWctPnJlZy4gIHBhZGRxIG9mIDMyLWJpdHMKK3dpdGhpbiBhIDY0LWJpdCBtbXggcmVnaXN0ZXIgc2VlbXMgYmV0dGVyLCB0aG91Z2ggdGhlIGNvbWJpbmF0aW9uCitwYWRkcS9wc3JscSB3aGVuIHByb3BhZ2F0aW5nIGEgY2FycnkgaXMgc3RpbGwgYSA0IGN5Y2xlIGxhdGVuY3kuCisKK2luY2wgYW5kIGRlY2wgc2hvdWxkIGJlIGF2b2lkZWQsIGluc3RlYWQgdXNlIGFkZCAkMSBhbmQgc3ViICQxLiAgQXBwYXJlbnRseQordGhlIGNhcnJ5IGZsYWcgaXMgbm90IHNlcGFyYXRlbHkgcmVuYW1lZCwgc28gaW5jbCBhbmQgZGVjbCBkZXBlbmQgb24gYWxsCitwcmV2aW91cyBmbGFncy1zZXR0aW5nIGluc3RydWN0aW9ucy4KKworc2hsbCBhbmQgc2hybCBoYXZlIGEgNCBjeWNsZSBsYXRlbmN5LCBvciA4IHRpbWVzIHRoZSBsYXRlbmN5IG9mIHRoZSBmYXN0ZXN0CitpbnRlZ2VyIGluc3RydWN0aW9ucyAoYWRkbCwgc3VibCwgb3JsLCBhbmRsLCBhbmQgc29tZSBtb3JlKS4gIHNobGRsIGFuZAorc2hyZGwgc2VlbSB0byBoYXZlIDEzIGFuZCAxNSBjeWNsZXMgbGF0ZW5jeSwgcmVzcGVjdGl2ZWx5LiAgQml6YXJyZS4KKworbW92cSBtbXggLT4gbW14IGRvZXMgaGF2ZSA2IGN5Y2xlIGxhdGVuY3ksIGFzIG5vdGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLgorcHhvci9wb3Igb3Igc2ltaWxhciBjb21iaW5hdGlvbiBhdCAyIGN5Y2xlcyBsYXRlbmN5IGNhbiBiZSB1c2VkIGluc3RlYWQuCitUaGUgbW92cSBob3dldmVyIGV4ZWN1dGVzIGluIHRoZSBmbG9hdCB1bml0LCB0aGVyZWJ5IHNhdmluZyBNTVggZXhlY3V0aW9uCityZXNvdXJjZXMuICBXaXRoIHRoZSByaWdodCBqdWdnbGluZywgZGF0YSBtb3ZlcyBzaG91bGRuJ3QgYmUgb24gYSBkZXBlbmRlbnQKK2NoYWluLgorCitMMSBpcyB3cml0ZS10aHJvdWdoLCBidXQgdGhlIHdyaXRlLWNvbWJpbmluZyBzb3VuZHMgbGlrZSBpdCBkb2VzIGVub3VnaCB0bworbm90IHJlcXVpcmUgZXhwbGljaXQgZGVzdGluYXRpb24gcHJlZmV0Y2hpbmcuCisKK3htbSByZWdpc3RlcnMgc28gZmFyIGhhdmVuJ3QgZm91bmQgYSB1c2UsIGJ1dCBub3QgbXVjaCBlZmZvcnQgaGFzIGJlZW4KK2V4cGVuZGVkLiAgQSBjb25maWd1cmUgdGVzdCBmb3Igd2hldGhlciB0aGUgb3BlcmF0aW5nIHN5c3RlbSBrbm93cworZnhzYXZlL2Z4cmVzdG9yIHdpbGwgYmUgbmVlZGVkIGlmIHRoZXkncmUgdXNlZC4KKworCisKK1JFRkVSRU5DRVMKKworSW50ZWwgUGVudGl1bS00IHByb2Nlc3NvciBtYW51YWxzLAorCisJaHR0cDovL2RldmVsb3Blci5pbnRlbC5jb20vZGVzaWduL3BlbnRpdW00L21hbnVhbHMKKworIkludGVsIFBlbnRpdW0gNCBQcm9jZXNzb3IgT3B0aW1pemF0aW9uIFJlZmVyZW5jZSBNYW51YWwiLCBJbnRlbCwgMjAwMSwKK29yZGVyIG51bWJlciAyNDg5NjYuICBBdmFpbGFibGUgb24tbGluZToKKworCWh0dHA6Ly9kZXZlbG9wZXIuaW50ZWwuY29tL2Rlc2lnbi9wZW50aXVtNC9tYW51YWxzLzI0ODk2Ni5odG0KKworCisKKy0tLS0tLS0tLS0tLS0tLS0KK0xvY2FsIHZhcmlhYmxlczoKK21vZGU6IHRleHQKK2ZpbGwtY29sdW1uOiA3NgorRW5kOgpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9wZW50aXVtNC9kaXN0ZmlsZXMgYi9saWJnY3J5cHQtMS40LjYvbXBpL3BlbnRpdW00L2Rpc3RmaWxlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDE5Zjg1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9wZW50aXVtNC9kaXN0ZmlsZXMKQEAgLTAsMCArMSwzIEBACitSRUFETUUKKworCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL3BlbnRpdW00L21teC9kaXN0ZmlsZXMgYi9saWJnY3J5cHQtMS40LjYvbXBpL3BlbnRpdW00L21teC9kaXN0ZmlsZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYwZWE0MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvcGVudGl1bTQvbW14L2Rpc3RmaWxlcwpAQCAtMCwwICsxLDIgQEAKK21waWgtbHNoaWZ0LlMKK21waWgtcnNoaWZ0LlMKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvcGVudGl1bTQvbW14L21waWgtbHNoaWZ0LlMgYi9saWJnY3J5cHQtMS40LjYvbXBpL3BlbnRpdW00L21teC9tcGloLWxzaGlmdC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZGQxODQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL3BlbnRpdW00L21teC9tcGloLWxzaGlmdC5TCkBAIC0wLDAgKzEsNDU3IEBACisvKiBJbnRlbCBQZW50aXVtLTQgbXBuX2xzaGlmdCAtLSBsZWZ0IHNoaWZ0LgorICoKKyAqIENvcHlyaWdodCAyMDAxLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqCisgKiBOb3RlOiBUaGlzIGNvZGUgaXMgaGVhdmlseSBiYXNlZCBvbiB0aGUgR05VIE1QIExpYnJhcnkuCisgKgkgQWN0dWFsbHkgaXQncyB0aGUgc2FtZSBjb2RlIHdpdGggb25seSBtaW5vciBjaGFuZ2VzIGluIHRoZQorICoJIHdheSB0aGUgZGF0YSBpcyBzdG9yZWQ7IHRoaXMgaXMgdG8gc3VwcG9ydCB0aGUgYWJzdHJhY3Rpb24KKyAqCSBvZiBhbiBvcHRpb25hbCBzZWN1cmUgbWVtb3J5IGFsbG9jYXRpb24gd2hpY2ggbWF5IGJlIHVzZWQKKyAqCSB0byBhdm9pZCByZXZlYWxpbmcgb2Ygc2Vuc2l0aXZlIGRhdGEgZHVlIHRvIHBhZ2luZyBldGMuCisgKi8KKworCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAiYXNtLXN5bnRheC5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqCisgKiBtcGlfbGltYl90CisgKiBfZ2NyeV9tcGloX2xzaGlmdCggbXBpX3B0cl90IHdwLAkoc3AgKyA0KQorICoJCSAgIG1waV9wdHJfdCB1cCwJKHNwICsgOCkKKyAqCQkgICBtcGlfc2l6ZV90IHVzaXplLAkoc3AgKyAxMikKKyAqCQkgICB1bnNpZ25lZCBjbnQpCShzcCArIDE2KQorICoKKyAqIFA0IFdpbGxhbWV0dGUsIE5vcnRod29vZDogMS43NSBjeWNsZXMvbGltYgorICogUDQgUHJlc2NvdHQ6CQkgICAgIDIuMCBjeWNsZXMvbGltYgorICovCisKKy50ZXh0CisJQUxJR04gKDMpCisJLmdsb2JsIENfU1lNQk9MX05BTUUoX2djcnlfbXBpaF9sc2hpZnQpCitDX1NZTUJPTF9OQU1FKF9nY3J5X21waWhfbHNoaWZ0OikKKworCQorCXB1c2hsCSVlYngKKwlwdXNobAklZWRpCisKKworCW1vdmwJMjAoJWVzcCksICVlYXgKKwltb3ZsCTEyKCVlc3ApLCAlZWR4CisKKwltb3ZsCTE2KCVlc3ApLCAlZWJ4CisJbW92bAkyNCglZXNwKSwgJWVjeAorCisJY21wCSQ1LCAlZWF4CisJamFlCS5MdW5yb2xsCisKKwltb3ZsCS00KCVlYngsJWVheCw0KSwgJWVkaQkKKwlkZWNsCSVlYXgKKworCWpuegkuTHNpbXBsZQorCisJc2hsZGwJJWNsLCAlZWRpLCAlZWF4CQorCisJc2hsbAklY2wsICVlZGkKKworCW1vdmwJJWVkaSwgKCVlZHgpCQkKKwlwb3BsCSVlZGkJCQkKKworCXBvcGwJJWVieAorCisJcmV0CisKKworCisKKworLkxzaW1wbGU6CisJCisJCisJCisJCisJCisJCisJCisKKworCW1vdmQJKCVlYngsJWVheCw0KSwgJW1tNQkKKworCW1vdmQJJWVjeCwgJW1tNgkJCisJbmVnbAklZWN4CisKKwlwc2xscQklbW02LCAlbW01CisJYWRkbAkkMzIsICVlY3gKKworCW1vdmQJJWVjeCwgJW1tNworCXBzcmxxCSQzMiwgJW1tNQkJCisKKworLkxzaW1wbGVfdG9wOgorCQorCQorCQorCQorCQorCQorCQorCQorCQorCQorCQorCisJbW92cQktNCglZWJ4LCVlYXgsNCksICVtbTAKKwlkZWNsCSVlYXgKKworCXBzcmxxCSVtbTcsICVtbTAKKworCQorCisJbW92ZAklbW0wLCA0KCVlZHgsJWVheCw0KQorCWpuegkuTHNpbXBsZV90b3AKKworCisJbW92ZAkoJWVieCksICVtbTAKKworCW1vdmQJJW1tNSwgJWVheAorCXBzbGxxCSVtbTYsICVtbTAKKworCXBvcGwJJWVkaQorCXBvcGwJJWVieAorCisJbW92ZAklbW0wLCAoJWVkeCkKKworCWVtbXMKKworCXJldAorCisKKworCisKKwkuYWxpZ24JOCwgMHg5MAorLkx1bnJvbGw6CisJCisJCisJCisJCisJCisJCisJCisKKworCW1vdmQJLTQoJWVieCwlZWF4LDQpLCAlbW01CQorCWxlYWwJKCVlYngsJWVheCw0KSwgJWVkaQorCisJbW92ZAklZWN4LCAlbW02CQkKKwlhbmRsCSQ0LCAlZWRpCisKKwlwc2xscQklbW02LCAlbW01CisJanoJLkxzdGFydF9zcmNfYWxpZ25lZAorCisKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKworCW1vdnEJLTgoJWVieCwlZWF4LDQpLCAlbW0wCQorCisJcHNsbHEJJW1tNiwgJW1tMAorCWRlY2wJJWVheAorCisJcHNybHEJJDMyLCAlbW0wCisKKwkKKworCW1vdmQJJW1tMCwgKCVlZHgsJWVheCw0KQorLkxzdGFydF9zcmNfYWxpZ25lZDoKKworCW1vdnEJLTgoJWVieCwlZWF4LDQpLCAlbW0xCQorCWxlYWwJKCVlZHgsJWVheCw0KSwgJWVkaQorCisJYW5kbAkkNCwgJWVkaQorCXBzcmxxCSQzMiwgJW1tNQkJCisKKwltb3ZxCS0xNiglZWJ4LCVlYXgsNCksICVtbTMJCisJanoJLkxzdGFydF9kc3RfYWxpZ25lZAorCisJCisJCisJCisJCisJCisJCisJCisJCisJCisJCisJCisJCisJCisJCisJCisJCisJCisJCisKKwltb3ZxCSVtbTEsICVtbTAKKwlhZGRsCSQzMiwgJWVjeAkJCisKKwlwc2xscQklbW02LCAlbW0wCisKKwltb3ZkCSVlY3gsICVtbTYKKwlwc3JscQkkMzIsICVtbTAKKworCQorCisJbW92ZAklbW0wLCAtNCglZWR4LCVlYXgsNCkKKwlzdWJsCSQ0LCAlZWR4CisuTHN0YXJ0X2RzdF9hbGlnbmVkOgorCisKKwlwc2xscQklbW02LCAlbW0xCisJbmVnbAklZWN4CQkJCisKKwlhZGRsCSQ2NCwgJWVjeAkJCisJbW92cQklbW0zLCAlbW0yCisKKwltb3ZkCSVlY3gsICVtbTcKKwlzdWJsCSQ4LCAlZWF4CQkKKworCXBzcmxxCSVtbTcsICVtbTMKKworCXBvcgklbW0xLCAlbW0zCQkKKwlqYwkuTGZpbmlzaAorCisKKwkKKworCS5hbGlnbgk4LCAweDkwCisuTHVucm9sbF9sb29wOgorCQorCQorCQorCQorCQorCQorCQorCQorCQorCQorCQorCQorCQorCQorCQorCisJbW92cQk4KCVlYngsJWVheCw0KSwgJW1tMAorCXBzbGxxCSVtbTYsICVtbTIKKworCW1vdnEJJW1tMCwgJW1tMQorCXBzcmxxCSVtbTcsICVtbTAKKworCW1vdnEJJW1tMywgMjQoJWVkeCwlZWF4LDQpCQorCXBvcgklbW0yLCAlbW0wCisKKwltb3ZxCSglZWJ4LCVlYXgsNCksICVtbTMJCisJcHNsbHEJJW1tNiwgJW1tMQkJCisKKwltb3ZxCSVtbTAsIDE2KCVlZHgsJWVheCw0KQorCW1vdnEJJW1tMywgJW1tMgkJCisKKwlwc3JscQklbW03LCAlbW0zCQkKKwlzdWJsCSQ0LCAlZWF4CisKKwlwb3IJJW1tMSwgJW1tMwkJCisJam5jCS5MdW5yb2xsX2xvb3AKKworCisKKy5MZmluaXNoOgorCQorCisJdGVzdGIJJDIsICVhbAorCisJanoJLkxmaW5pc2hfbm9fdHdvCisKKwltb3ZxCTgoJWVieCwlZWF4LDQpLCAlbW0wCisJcHNsbHEJJW1tNiwgJW1tMgorCisJbW92cQklbW0wLCAlbW0xCisJcHNybHEJJW1tNywgJW1tMAorCisJbW92cQklbW0zLCAyNCglZWR4LCVlYXgsNCkJCisJcG9yCSVtbTIsICVtbTAKKworCW1vdnEJJW1tMSwgJW1tMgorCW1vdnEJJW1tMCwgJW1tMworCisJc3VibAkkMiwgJWVheAorLkxmaW5pc2hfbm9fdHdvOgorCisKKwkKKwkKKwkKKwkKKworCXRlc3RiCSQxLCAlYWwKKwltb3ZkCSVtbTUsICVlYXgJCisKKwlwb3BsCSVlZGkKKwlqegkuTGZpbmlzaF96ZXJvCisKKworCQorCQorCQorCQorCQorCQorCQorCQorCQorCQorCQorCQorCQorCQorCisKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKworCisJCisJCisJCisJCisKKworCW1vdmQJKCVlYngpLCAlbW0wCisJcHNsbHEJJW1tNiwgJW1tMgorCisJbW92cQklbW0zLCAxMiglZWR4KQorCXBzbGxxCSQzMiwgJW1tMAorCisJbW92cQklbW0wLCAlbW0xCisJcHNybHEJJW1tNywgJW1tMAorCisJcG9yCSVtbTIsICVtbTAKKwlwc2xscQklbW02LCAlbW0xCisKKwltb3ZxCSVtbTAsIDQoJWVkeCkKKwlwc3JscQkkMzIsICVtbTEKKworCWFuZGwJJDMyLCAlZWN4CisJcG9wbAklZWJ4CisKKwlqegkuTGZpbmlzaF9vbmVfdW5hbGlnbmVkCisKKwltb3ZkCSVtbTEsICglZWR4KQorLkxmaW5pc2hfb25lX3VuYWxpZ25lZDoKKworCWVtbXMKKworCXJldAorCisKKworCisuTGZpbmlzaF96ZXJvOgorCisJCisJCisJCisJCisJCisJCisJCisJCisJCisJCisJCisJCisJCisJCisKKworCQorCQorCQorCQorCQorCQorCQorCQorCQorCQorCQorCQorCQorCQorCisKKwkKKwkKKworCisJbW92cQklbW0zLCA4KCVlZHgpCisJYW5kbAkkMzIsICVlY3gKKworCXBzbGxxCSVtbTYsICVtbTIKKwlqegkuTGZpbmlzaF96ZXJvX3VuYWxpZ25lZAorCisJbW92cQklbW0yLCAoJWVkeCkKKy5MZmluaXNoX3plcm9fdW5hbGlnbmVkOgorCisJcHNybHEJJDMyLCAlbW0yCisJcG9wbAklZWJ4CisKKwltb3ZkCSVtbTUsICVlYXgJCisKKwltb3ZkCSVtbTIsIDQoJWVkeCkKKworCWVtbXMKKworCXJldApkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9wZW50aXVtNC9tbXgvbXBpaC1yc2hpZnQuUyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvcGVudGl1bTQvbW14L21waWgtcnNoaWZ0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMzNzRlMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvcGVudGl1bTQvbW14L21waWgtcnNoaWZ0LlMKQEAgLTAsMCArMSw0NTMgQEAKKy8qIEludGVsIFBlbnRpdW0tNCBtcG5fcnNoaWZ0IC0tIHJpZ2h0IHNoaWZ0LgorICoKKyAqIENvcHlyaWdodCAyMDAxLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqCisgKiBOb3RlOiBUaGlzIGNvZGUgaXMgaGVhdmlseSBiYXNlZCBvbiB0aGUgR05VIE1QIExpYnJhcnkuCisgKgkgQWN0dWFsbHkgaXQncyB0aGUgc2FtZSBjb2RlIHdpdGggb25seSBtaW5vciBjaGFuZ2VzIGluIHRoZQorICoJIHdheSB0aGUgZGF0YSBpcyBzdG9yZWQ7IHRoaXMgaXMgdG8gc3VwcG9ydCB0aGUgYWJzdHJhY3Rpb24KKyAqCSBvZiBhbiBvcHRpb25hbCBzZWN1cmUgbWVtb3J5IGFsbG9jYXRpb24gd2hpY2ggbWF5IGJlIHVzZWQKKyAqCSB0byBhdm9pZCByZXZlYWxpbmcgb2Ygc2Vuc2l0aXZlIGRhdGEgZHVlIHRvIHBhZ2luZyBldGMuCisgKi8KKworCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAiYXNtLXN5bnRheC5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqCisgKiBtcGlfbGltYl90CisgKiBfZ2NyeV9tcGloX3JzaGlmdCggbXBpX3B0cl90IHdwLAkoc3AgKyA0KQorICoJCSAgIG1waV9wdHJfdCB1cCwJKHNwICsgOCkKKyAqCQkgICBtcGlfc2l6ZV90IHVzaXplLAkoc3AgKyAxMikKKyAqCQkgICB1bnNpZ25lZCBjbnQpCShzcCArIDE2KQorICoKKyAqIFA0IFdpbGxhbWV0dGUsIE5vcnRod29vZDogMS43NSBjeWNsZXMvbGltYgorICogUDQgUHJlc2NvdHQ6CQkgICAgIDIuMCBjeWNsZXMvbGltYgorICovCisKKy50ZXh0CisJQUxJR04gKDMpCisJLmdsb2JsIENfU1lNQk9MX05BTUUoX2djcnlfbXBpaF9yc2hpZnQpCitDX1NZTUJPTF9OQU1FKF9nY3J5X21waWhfcnNoaWZ0OikKKwlwdXNobAklZWJ4CisJcHVzaGwJJWVkaQorCisKKwltb3ZsCTIwKCVlc3ApLCAlZWF4CisJbW92bAkxMiglZXNwKSwgJWVkeAorCisJbW92bAkxNiglZXNwKSwgJWVieAorCW1vdmwJMjQoJWVzcCksICVlY3gKKworCWNtcAkkNSwgJWVheAorCWphZQkuTHVucm9sbAorCisJZGVjbAklZWF4CisJbW92bAkoJWVieCksICVlZGkJCQorCisJam56CS5Mc2ltcGxlCisKKwlzaHJkbAklY2wsICVlZGksICVlYXgJCisKKwlzaHJsCSVjbCwgJWVkaQorCisJbW92bAklZWRpLCAoJWVkeCkJCQorCXBvcGwJJWVkaQkJCQorCisJcG9wbAklZWJ4CisKKwlyZXQKKworCisKKworCisJLmFsaWduCTgsIDB4OTAKKy5Mc2ltcGxlOgorCQorCQorCQorCQorCQorCQorCQorCisKKwltb3ZkCSglZWJ4KSwgJW1tNQkJCisJbGVhbAkoJWVieCwlZWF4LDQpLCAlZWJ4CQorCisJbW92ZAklZWN4LCAlbW02CQkKKwlsZWFsCS00KCVlZHgsJWVheCw0KSwgJWVkeAkKKworCXBzbGxxCSQzMiwgJW1tNQorCW5lZ2wJJWVheAorCisKKworCisKKworCisuTHNpbXBsZV90b3A6CisJCisJCisJCisJCisJCisJCisJCisJCisKKwltb3ZxCSglZWJ4LCVlYXgsNCksICVtbTAKKwlpbmNsCSVlYXgKKworCXBzcmxxCSVtbTYsICVtbTAKKworCW1vdmQJJW1tMCwgKCVlZHgsJWVheCw0KQorCWpuegkuTHNpbXBsZV90b3AKKworCisJbW92ZAkoJWVieCksICVtbTAKKwlwc3JscQklbW02LCAlbW01CQkKKworCXBzcmxxCSVtbTYsICVtbTAKKwlwb3BsCSVlZGkKKworCW1vdmQJJW1tNSwgJWVheAorCXBvcGwJJWVieAorCisJbW92ZAklbW0wLCA0KCVlZHgpCisKKwllbW1zCisKKwlyZXQKKworCisKKworCisJLmFsaWduCTgsIDB4OTAKKy5MdW5yb2xsOgorCQorCQorCQorCQorCQorCQorCQorCisKKwltb3ZkCSglZWJ4KSwgJW1tNQkJCisJbW92bAkkNCwgJWVkaQorCisJbW92ZAklZWN4LCAlbW02CQkKKwl0ZXN0bAklZWRpLCAlZWJ4CisKKwlwc2xscQkkMzIsICVtbTUKKwlqegkuTHN0YXJ0X3NyY19hbGlnbmVkCisKKworCQorCQorCQorCQorCQorCQorCQorCQorCQorCQorCQorCQorCQorCisJbW92cQkoJWVieCksICVtbTAJCQorCisJcHNybHEJJW1tNiwgJW1tMAorCWFkZGwJJDQsICVlYngKKworCWRlY2wJJWVheAorCisJbW92ZAklbW0wLCAoJWVkeCkKKwlhZGRsCSQ0LCAlZWR4CisuTHN0YXJ0X3NyY19hbGlnbmVkOgorCisKKwltb3ZxCSglZWJ4KSwgJW1tMQorCXRlc3RsCSVlZGksICVlZHgKKworCXBzcmxxCSVtbTYsICVtbTUJCQorCWp6CS5Mc3RhcnRfZHN0X2FsaWduZWQKKworCQorCQorCQorCQorCQorCQorCQorCQorCQorCQorCQorCQorCQorCQorCQorCisJbW92cQklbW0xLCAlbW0wCisJYWRkbAkkMzIsICVlY3gJCQorCisJcHNybHEJJW1tNiwgJW1tMAorCisJbW92ZAklZWN4LCAlbW02CisKKwltb3ZkCSVtbTAsICglZWR4KQorCWFkZGwJJDQsICVlZHgKKy5Mc3RhcnRfZHN0X2FsaWduZWQ6CisKKworCW1vdnEJOCglZWJ4KSwgJW1tMworCW5lZ2wJJWVjeAorCisJbW92cQklbW0zLCAlbW0yCQkKKwlhZGRsCSQ2NCwgJWVjeAorCisJbW92ZAklZWN4LCAlbW03CisJcHNybHEJJW1tNiwgJW1tMQorCisJbGVhbAktMTIoJWVieCwlZWF4LDQpLCAlZWJ4CisJbGVhbAktMjAoJWVkeCwlZWF4LDQpLCAlZWR4CisKKwlwc2xscQklbW03LCAlbW0zCisJc3VibAkkNywgJWVheAkJCisKKwlwb3IJJW1tMSwgJW1tMwkJCisJbmVnbAklZWF4CQkJCisKKwlqbnMJLkxmaW5pc2gKKworCisJCisJCisJCisJCisJCisJCisJCisJCisJCisJCisJCisJCisKKwkuYWxpZ24JOCwgMHg5MAorLkx1bnJvbGxfbG9vcDoKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKworCW1vdnEJKCVlYngsJWVheCw0KSwgJW1tMAorCXBzcmxxCSVtbTYsICVtbTIKKworCW1vdnEJJW1tMCwgJW1tMQorCXBzbGxxCSVtbTcsICVtbTAKKworCW1vdnEJJW1tMywgLTgoJWVkeCwlZWF4LDQpCQorCXBvcgklbW0yLCAlbW0wCisKKwltb3ZxCTgoJWVieCwlZWF4LDQpLCAlbW0zCQorCXBzcmxxCSVtbTYsICVtbTEJCQorCisJbW92cQklbW0wLCAoJWVkeCwlZWF4LDQpCisJbW92cQklbW0zLCAlbW0yCQkKKworCXBzbGxxCSVtbTcsICVtbTMJCQorCWFkZGwJJDQsICVlYXgKKworCXBvcgklbW0xLCAlbW0zCQkKKwlqcwkuTHVucm9sbF9sb29wCisKKworLkxmaW5pc2g6CisJCisKKwl0ZXN0YgkkMiwgJWFsCisKKwlqbnoJLkxmaW5pc2hfbm9fdHdvCisKKwltb3ZxCSglZWJ4LCVlYXgsNCksICVtbTAKKwlwc3JscQklbW02LCAlbW0yCisKKwltb3ZxCSVtbTAsICVtbTEKKwlwc2xscQklbW03LCAlbW0wCisKKwltb3ZxCSVtbTMsIC04KCVlZHgsJWVheCw0KQkKKwlwb3IJJW1tMiwgJW1tMAorCisJbW92cQklbW0xLCAlbW0yCisJbW92cQklbW0wLCAlbW0zCisKKwlhZGRsCSQyLCAlZWF4CisuTGZpbmlzaF9ub190d286CisKKworCQorCQorCQorCQorCisJdGVzdGIJJDEsICVhbAorCXBvcGwJJWVkaQorCisJbW92ZAklbW01LCAlZWF4CQorCWpuegkuTGZpbmlzaF96ZXJvCisKKworCQorCQorCQorCQorCQorCQorCQorCQorCQorCQorCQorCQorCQorCQorCisKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKworCisJCisJCisJCisKKworCW1vdmQJOCglZWJ4KSwgJW1tMAorCXBzcmxxCSVtbTYsICVtbTIKKworCW1vdnEJJW1tMCwgJW1tMQorCXBzbGxxCSVtbTcsICVtbTAKKworCW1vdnEJJW1tMywgKCVlZHgpCisJcG9yCSVtbTIsICVtbTAKKworCXBzcmxxCSVtbTYsICVtbTEKKwlhbmRsCSQzMiwgJWVjeAorCisJcG9wbAklZWJ4CisJanoJLkxmaW5pc2hfb25lX3VuYWxpZ25lZAorCisJCisJbW92ZAklbW0xLCAxNiglZWR4KQorLkxmaW5pc2hfb25lX3VuYWxpZ25lZDoKKworCW1vdnEJJW1tMCwgOCglZWR4KQorCisJZW1tcworCisJcmV0CisKKworCisKKy5MZmluaXNoX3plcm86CisKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKworCisJCisJCisJCisJCisJCisJCisJCisJCisJCisJCisJCisJCisJCisJCisKKworCQorCQorCQorCisKKwltb3ZxCSVtbTMsIDQoJWVkeCkKKwlwc3JscQklbW02LCAlbW0yCisKKwltb3ZkCSVtbTIsIDEyKCVlZHgpCisJYW5kbAkkMzIsICVlY3gKKworCXBvcGwJJWVieAorCWp6CS5MZmluaXNoX3plcm9fdW5hbGlnbmVkCisKKwltb3ZxCSVtbTIsIDEyKCVlZHgpCisuTGZpbmlzaF96ZXJvX3VuYWxpZ25lZDoKKworCWVtbXMKKworCXJldApkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9wZW50aXVtNC9zc2UyL2Rpc3RmaWxlcyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvcGVudGl1bTQvc3NlMi9kaXN0ZmlsZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI1MmNkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvcGVudGl1bTQvc3NlMi9kaXN0ZmlsZXMKQEAgLTAsMCArMSw1IEBACittcGloLWFkZDEuUworbXBpaC1tdWwxLlMKK21waWgtbXVsMi5TCittcGloLW11bDMuUworbXBpaC1zdWIxLlMKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvcGVudGl1bTQvc3NlMi9tcGloLWFkZDEuUyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvcGVudGl1bTQvc3NlMi9tcGloLWFkZDEuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWVkNjYzCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9wZW50aXVtNC9zc2UyL21waWgtYWRkMS5TCkBAIC0wLDAgKzEsOTEgQEAKKy8qIEludGVsIFBlbnRpdW0tNCBtcG5fYWRkX24gLS0gbXBuIGFkZGl0aW9uLgorICoKKyAqIENvcHlyaWdodCAyMDAxLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqCisgKiBOb3RlOiBUaGlzIGNvZGUgaXMgaGVhdmlseSBiYXNlZCBvbiB0aGUgR05VIE1QIExpYnJhcnkuCisgKgkgQWN0dWFsbHkgaXQncyB0aGUgc2FtZSBjb2RlIHdpdGggb25seSBtaW5vciBjaGFuZ2VzIGluIHRoZQorICoJIHdheSB0aGUgZGF0YSBpcyBzdG9yZWQ7IHRoaXMgaXMgdG8gc3VwcG9ydCB0aGUgYWJzdHJhY3Rpb24KKyAqCSBvZiBhbiBvcHRpb25hbCBzZWN1cmUgbWVtb3J5IGFsbG9jYXRpb24gd2hpY2ggbWF5IGJlIHVzZWQKKyAqCSB0byBhdm9pZCByZXZlYWxpbmcgb2Ygc2Vuc2l0aXZlIGRhdGEgZHVlIHRvIHBhZ2luZyBldGMuCisgKi8KKworCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAiYXNtLXN5bnRheC5oIgorCisKKwkvKioqKioqKioqKioqKioqKioqKgorICogIG1waV9saW1iX3QKKyAqICBfZ2NyeV9tcGloX2FkZF9uKCBtcGlfcHRyX3QgcmVzX3B0ciwJKHNwICsgNCkKKyAqCQkgICBtcGlfcHRyX3QgczFfcHRyLAkoc3AgKyA4KQorICoJCSAgIG1waV9wdHJfdCBzMl9wdHIsCShzcCArIDEyKQorICoJCSAgIG1waV9zaXplX3Qgc2l6ZSkJKHNwICsgMTYpCisgKgorICogUDQgV2lsbGFtZXR0ZSwgTm9ydGh3b29kOiA0LjAgY3ljbGVzL2xpbWIgaWYgZHN0IT1zcmMxIGFuZCBkc3QhPXNyYzIKKyAqCQkJICAgIDYuMCBjeWNsZXMvbGltYiBpZiBkc3Q9PXNyYzEgb3IgZHN0PT1zcmMyCisgKiBQNCBQcmVzY290dDoJCSAgICA+PSA1IGN5Y2xlcy9saW1iCisgKgorICogVGhlIDQgYy9sIGFjaGlldmVkIGhlcmUgaXNuJ3QgcGFydGljdWxhcmx5IGdvb2QsIGJ1dCBpcyBiZXR0ZXIgdGhhbiA5IGMvbAorICogZm9yIGEgYmFzaWMgYWRjIGxvb3AuCisgKi8KKworCVRFWFQKKwlBTElHTiAoMykKKwlHTE9CTCBDX1NZTUJPTF9OQU1FKF9nY3J5X21waWhfYWRkX24pCitDX1NZTUJPTF9OQU1FKF9nY3J5X21waWhfYWRkX246KQorCisJcHhvcgklbW0wLCAlbW0wCisJCisJbW92bAk4KCVlc3ApLCAlZWF4CQkvKiBzMV9wdHIgKi8KKwltb3ZsCSVlYngsIDgoJWVzcCkJCS8qIHJlLXVzZSBwYXJhbWV0ZXIgc3BhY2UgKi8KKwltb3ZsCTEyKCVlc3ApLCAlZWJ4CQkvKiByZXNfcHRyICovCisJbW92bAk0KCVlc3ApLCAlZWR4CQkvKiBzMl9wdHIgKi8KKwltb3ZsCTE2KCVlc3ApLCAlZWN4CQkvKiBzaXplICovCisKKwlsZWFsCSglZWF4LCVlY3gsNCksICVlYXgJLyogc3JjMSBlbmQgKi8KKwlsZWFsCSglZWJ4LCVlY3gsNCksICVlYngJLyogc3JjMiBlbmQgKi8KKwlsZWFsCSglZWR4LCVlY3gsNCksICVlZHgJLyogZHN0IGVuZCAqLworCW5lZ2wJJWVjeAkJCS8qIC1zaXplICovCisKK0x0b3A6CisvKgorCUMgZWF4CXNyYzEgZW5kCisJQyBlYngJc3JjMiBlbmQKKwlDIGVjeAljb3VudGVyLCBsaW1icywgbmVnYXRpdmUKKwlDIGVkeAlkc3QgZW5kCisJQyBtbTAJY2FycnkgYml0CisqLworCisJbW92ZAkoJWVheCwlZWN4LDQpLCAlbW0xCisJbW92ZAkoJWVieCwlZWN4LDQpLCAlbW0yCisJcGFkZHEJJW1tMiwgJW1tMQorCisJcGFkZHEJJW1tMSwgJW1tMAorCW1vdmQJJW1tMCwgKCVlZHgsJWVjeCw0KQorCisJcHNybHEJJDMyLCAlbW0wCisKKwlhZGRsCSQxLCAlZWN4CisJam56CUx0b3AKKworCisJbW92ZAklbW0wLCAlZWF4CisJbW92bAk4KCVlc3ApLCAlZWJ4CS8qIHJlc3RvcmUgc2F2ZWQgRUJYICovCisJZW1tcworCXJldApkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9wZW50aXVtNC9zc2UyL21waWgtbXVsMS5TIGIvbGliZ2NyeXB0LTEuNC42L21waS9wZW50aXVtNC9zc2UyL21waWgtbXVsMS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYzk4ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL3BlbnRpdW00L3NzZTIvbXBpaC1tdWwxLlMKQEAgLTAsMCArMSw5NiBAQAorLyogSW50ZWwgUGVudGl1bS00IG1wbl9tdWxfMSAtLSBNdWx0aXBseSBhIGxpbWIgdmVjdG9yIHdpdGggYSBsaW1iIGFuZCBzdG9yZQorICogdGhlIHJlc3VsdCBpbiBhIHNlY29uZCBsaW1iIHZlY3Rvci4KKyAqCisgKiBDb3B5cmlnaHQgMjAwMSwgMjAwMiwgMjAwMywgMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKgorICogTm90ZTogVGhpcyBjb2RlIGlzIGhlYXZpbHkgYmFzZWQgb24gdGhlIEdOVSBNUCBMaWJyYXJ5LgorICoJIEFjdHVhbGx5IGl0J3MgdGhlIHNhbWUgY29kZSB3aXRoIG9ubHkgbWlub3IgY2hhbmdlcyBpbiB0aGUKKyAqCSB3YXkgdGhlIGRhdGEgaXMgc3RvcmVkOyB0aGlzIGlzIHRvIHN1cHBvcnQgdGhlIGFic3RyYWN0aW9uCisgKgkgb2YgYW4gb3B0aW9uYWwgc2VjdXJlIG1lbW9yeSBhbGxvY2F0aW9uIHdoaWNoIG1heSBiZSB1c2VkCisgKgkgdG8gYXZvaWQgcmV2ZWFsaW5nIG9mIHNlbnNpdGl2ZSBkYXRhIGR1ZSB0byBwYWdpbmcgZXRjLgorICovCisKKworI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImFzbS1zeW50YXguaCIKKworCisvKioqKioqKioqKioqKioqKioqKgorICogbXBpX2xpbWJfdAorICogX2djcnlfbXBpaF9tdWxfMSggbXBpX3B0cl90IHJlc19wdHIsCShzcCArIDQpCisgKgkJICBtcGlfcHRyX3QgczFfcHRyLAkoc3AgKyA4KQorICoJCSAgbXBpX3NpemVfdCBzMV9zaXplLAkoc3AgKyAxMikKKyAqCQkgIG1waV9saW1iX3QgczJfbGltYikJKHNwICsgMTYpCisgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMgIT0gZHN0ICAgICAgc3JjID09IGRzdAorICogUDYgbW9kZWwgOSAgKEJhbmlhcykgICAgICAgICAgPy4/CisgKiBQNiBtb2RlbCAxMyAoRG90aGFuKSAgICAgICAgICA0Ljc1ICAgICAgICAgICAgNC43NQorICogUDQgbW9kZWwgMCAgKFdpbGxhbWV0dGUpICAgICAgNC4wICAgICAgICAgICAgIDYuMAorICogUDQgbW9kZWwgMSAgKD8pICAgICAgICAgICAgICAgNC4wICAgICAgICAgICAgIDYuMAorICogUDQgbW9kZWwgMiAgKE5vcnRod29vZCkgICAgICAgNC4wICAgICAgICAgICAgIDYuMAorICogUDQgbW9kZWwgMyAgKFByZXNjb3R0KSAgICAgICAgPy4/ICAgICAgICAgICAgID8uPworICogUDQgbW9kZWwgNCAgKE5vY29uYSkgICAgICAgICAgPy4/ICAgICAgICAgICAgID8uPworICogVW5mb3J0dW5hdGVseSB3aGVuIHNyYz09ZHN0IHRoZSB3cml0ZS1jb21iaW5pbmcgZGVzY3JpYmVkIGluCisgKiBwZW50aXVtNC9SRUFETUUgdGFrZXMgdXMgdXAgdG8gNiBjL2wuCisgKgorICovCisKKwlURVhUCisJQUxJR04gKDMpCisJR0xPQkwJQ19TWU1CT0xfTkFNRShfZ2NyeV9tcGloX211bF8xKQorQ19TWU1CT0xfTkFNRShfZ2NyeV9tcGloX211bF8xOik7IAorCisJcHhvcgklbW0wLCAlbW0wCisKKy5Mc3RhcnRfMWM6CisJbW92bAk4KCVlc3ApLCAlZWF4CisJbW92ZAkxNiglZXNwKSwgJW1tNworCW1vdmwJNCglZXNwKSwgJWVkeAorCW1vdmwJMTIoJWVzcCksICVlY3gKKworLkx0b3A6CisKKy8qCisJQyBlYXgJc3JjLCBpbmNyZW1lbnRpbmcKKwlDIGVieAorCUMgZWN4CWNvdW50ZXIsIHNpemUgaXRlcmF0aW9ucworCUMgZWR4CWRzdCwgaW5jcmVtZW50aW5nCisJQworCUMgbW0wCWNhcnJ5IGxpbWIKKwlDIG1tNwltdWx0aXBsaWVyCisqLworCQorCW1vdmQJKCVlYXgpLCAlbW0xCisJYWRkbAkkNCwgJWVheAorCXBtdWx1ZHEJJW1tNywgJW1tMQorCisJcGFkZHEJJW1tMSwgJW1tMAorCW1vdmQJJW1tMCwgKCVlZHgpCisJYWRkbAkkNCwgJWVkeAorCisJcHNybHEJJDMyLCAlbW0wCisKKwlzdWJsCSQxLCAlZWN4CisJam56CS5MdG9wCisKKworCW1vdmQJJW1tMCwgJWVheAorCWVtbXMKKwlyZXQKKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9wZW50aXVtNC9zc2UyL21waWgtbXVsMi5TIGIvbGliZ2NyeXB0LTEuNC42L21waS9wZW50aXVtNC9zc2UyL21waWgtbXVsMi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NzVhZGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL3BlbnRpdW00L3NzZTIvbXBpaC1tdWwyLlMKQEAgLTAsMCArMSwxMzYgQEAKKy8qIEludGVsIFBlbnRpdW0tNCBtcG5fYWRkbXVsXzEgLS0gTXVsdGlwbHkgYSBsaW1iIHZlY3RvciB3aXRoIGEgbGltYiBhbmQgYWRkCisgKiB0aGUgcmVzdWx0IHRvIGEgc2Vjb25kIGxpbWIgdmVjdG9yLgorICoKKyAqIENvcHlyaWdodCAyMDAxLCAyMDAyLCAyMDA0LCAyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqCisgKiBOb3RlOiBUaGlzIGNvZGUgaXMgaGVhdmlseSBiYXNlZCBvbiB0aGUgR05VIE1QIExpYnJhcnkuCisgKgkgQWN0dWFsbHkgaXQncyB0aGUgc2FtZSBjb2RlIHdpdGggb25seSBtaW5vciBjaGFuZ2VzIGluIHRoZQorICoJIHdheSB0aGUgZGF0YSBpcyBzdG9yZWQ7IHRoaXMgaXMgdG8gc3VwcG9ydCB0aGUgYWJzdHJhY3Rpb24KKyAqCSBvZiBhbiBvcHRpb25hbCBzZWN1cmUgbWVtb3J5IGFsbG9jYXRpb24gd2hpY2ggbWF5IGJlIHVzZWQKKyAqCSB0byBhdm9pZCByZXZlYWxpbmcgb2Ygc2Vuc2l0aXZlIGRhdGEgZHVlIHRvIHBhZ2luZyBldGMuCisgKi8KKworCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAiYXNtLXN5bnRheC5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqCisgKiBtcGlfbGltYl90CisgKiBfZ2NyeV9tcGloX2FkZG11bF8xKCBtcGlfcHRyX3QgcmVzX3B0ciwgICAgICAoc3AgKyA0KQorICoJCSAgICAgbXBpX3B0cl90IHMxX3B0ciwJICAgICAoc3AgKyA4KQorICoJCSAgICAgbXBpX3NpemVfdCBzMV9zaXplLCAgICAgKHNwICsgMTIpCisgKgkJICAgICBtcGlfbGltYl90IHMyX2xpbWIpICAgICAoc3AgKyAxNikKKyAqCisgKiBQMyBtb2RlbCA5ICAoQmFuaWFzKSAgICAgICAgICA/Lj8KKyAqIFAzIG1vZGVsIDEzIChEb3RoYW4pICAgICAgICAgIDUuOAorICogUDQgbW9kZWwgMCAgKFdpbGxhbWV0dGUpICAgICAgNS41CisgKiBQNCBtb2RlbCAxICAoPykgICAgICAgICAgICAgICA1LjUKKyAqIFA0IG1vZGVsIDIgIChOb3J0aHdvb2QpICAgICAgIDUuNQorICogUDQgbW9kZWwgMyAgKFByZXNjb3R0KSAgICAgICAgNi4wCisgKiBQNCBtb2RlbCA0ICAoTm9jb25hKQorICoKKyAqIE9ubHkgdGhlIGNhcnJ5IGxpbWIgcHJvcGFnYXRpb24gaXMgb24gdGhlIGRlcGVuZGVudCBjaGFpbiwgYnV0IHNvbWUgb3RoZXIKKyAqIFBlbnRpdW00IHBpcGVsaW5lIG1hZ2ljIGJyaW5ncyBkb3duIHBlcmZvcm1hbmNlIHRvIDYgY3ljbGVzL2wgZnJvbSB0aGUKKyAqIGlkZWFsIDQgY3ljbGVzL2wuCisgKi8KKworCisJVEVYVAorCUFMSUdOICg0KQorCUdMT0JMCUNfU1lNQk9MX05BTUUoX2djcnlfbXBpaF9hZGRtdWxfMSkKK0NfU1lNQk9MX05BTUUoX2djcnlfbXBpaF9hZGRtdWxfMTopCisKKwlweG9yCSVtbTQsICVtbTQKKy5Mc3RhcnRfMWM6CisJbW92bAk4KCVlc3ApLCAlZWF4CisJbW92bAkxMiglZXNwKSwgJWVjeAorCW1vdmwJNCglZXNwKSwgJWVkeAorCW1vdmQJMTYoJWVzcCksICVtbTcKKworLyoKKwlDIGVheAlzcmMsIGluY3JlbWVudGluZyA7IDVCCisJQyBlY3gJbG9vcCBjb3VudGVyLCBkZWNyZW1lbnRpbmcKKwlDIGVkeAlkc3QsIGluY3JlbWVudGluZworCUMKKwlDIG1tNAljYXJyeSwgbG93IDMyLWJpdHMKKwlDIG1tNwltdWx0aXBsaWVyCisqLworCisJbW92ZAkJKCVlYXgpLCAlbW0yCQorCXBtdWx1ZHEJCSVtbTcsICVtbTIKKworCXNocmwJJDEsICVlY3gKKwlqbmMJLkxldmVuCisKKwlsZWFsCQk0KCVlYXgpLCAlZWF4CisJbW92ZAkJKCVlZHgpLCAlbW0xCisJcGFkZHEJCSVtbTIsICVtbTEKKwlwYWRkcQkJJW1tMSwgJW1tNAorCW1vdmQJCSVtbTQsICglZWR4KQorCXBzcmxxCQkkMzIsICVtbTQKKworCXRlc3RsCSVlY3gsICVlY3gKKwlqegkuTHJ0bgorCWxlYWwJNCglZWR4KSwgJWVkeAorCisJbW92ZAkJKCVlYXgpLCAlbW0yCQorCXBtdWx1ZHEJCSVtbTcsICVtbTIKKy5MZXZlbjoKKwltb3ZkCQk0KCVlYXgpLCAlbW0wCQorCW1vdmQJCSglZWR4KSwgJW1tMQkKKwlwbXVsdWRxCQklbW03LCAlbW0wCisKKwlzdWJsCSQxLCAlZWN4CisJanoJLkxlbmQKKy5MbG9vcDoKKwlwYWRkcQkJJW1tMiwgJW1tMQkKKwltb3ZkCQk4KCVlYXgpLCAlbW0yCQorCXBhZGRxCQklbW0xLCAlbW00CQorCW1vdmQJCTQoJWVkeCksICVtbTMJCisJcG11bHVkcQkJJW1tNywgJW1tMgorCW1vdmQJCSVtbTQsICglZWR4KQorCXBzcmxxCQkkMzIsICVtbTQKKworCXBhZGRxCQklbW0wLCAlbW0zCQorCW1vdmQJCTEyKCVlYXgpLCAlbW0wCQorCXBhZGRxCQklbW0zLCAlbW00CQorCW1vdmQJCTgoJWVkeCksICVtbTEJCisJcG11bHVkcQkJJW1tNywgJW1tMAorCW1vdmQJCSVtbTQsIDQoJWVkeCkKKwlwc3JscQkJJDMyLCAlbW00CisKKwlsZWFsCTgoJWVheCksICVlYXgKKwlsZWFsCTgoJWVkeCksICVlZHgKKwlzdWJsCSQxLCAlZWN4CisJam56CS5MbG9vcAorLkxlbmQ6CisJcGFkZHEJCSVtbTIsICVtbTEJCisJcGFkZHEJCSVtbTEsICVtbTQJCisJbW92ZAkJNCglZWR4KSwgJW1tMwkKKwltb3ZkCQklbW00LCAoJWVkeCkKKwlwc3JscQkJJDMyLCAlbW00CisJcGFkZHEJCSVtbTAsICVtbTMJCisJcGFkZHEJCSVtbTMsICVtbTQJCisJbW92ZAkJJW1tNCwgNCglZWR4KQorCXBzcmxxCQkkMzIsICVtbTQKKy5McnRuOgorCW1vdmQJJW1tNCwgJWVheAorCWVtbXMKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvcGVudGl1bTQvc3NlMi9tcGloLW11bDMuUyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvcGVudGl1bTQvc3NlMi9tcGloLW11bDMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmNkMmE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9wZW50aXVtNC9zc2UyL21waWgtbXVsMy5TCkBAIC0wLDAgKzEsMTI3IEBACisvKiBJbnRlbCBQZW50aXVtLTQgbXBuX3N1Ym11bF8xIC0tIE11bHRpcGx5IGEgbGltYiB2ZWN0b3Igd2l0aCBhIGxpbWIgYW5kCisgKiBzdWJ0cmFjdCB0aGUgcmVzdWx0IGZyb20gYSBzZWNvbmQgbGltYiB2ZWN0b3IuCisgKgorICogQ29weXJpZ2h0IDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICoKKyAqIE5vdGU6IFRoaXMgY29kZSBpcyBoZWF2aWx5IGJhc2VkIG9uIHRoZSBHTlUgTVAgTGlicmFyeS4KKyAqCSBBY3R1YWxseSBpdCdzIHRoZSBzYW1lIGNvZGUgd2l0aCBvbmx5IG1pbm9yIGNoYW5nZXMgaW4gdGhlCisgKgkgd2F5IHRoZSBkYXRhIGlzIHN0b3JlZDsgdGhpcyBpcyB0byBzdXBwb3J0IHRoZSBhYnN0cmFjdGlvbgorICoJIG9mIGFuIG9wdGlvbmFsIHNlY3VyZSBtZW1vcnkgYWxsb2NhdGlvbiB3aGljaCBtYXkgYmUgdXNlZAorICoJIHRvIGF2b2lkIHJldmVhbGluZyBvZiBzZW5zaXRpdmUgZGF0YSBkdWUgdG8gcGFnaW5nIGV0Yy4KKyAqLworCisKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJhc20tc3ludGF4LmgiCisKKworLyoqKioqKioqKioqKioqKioqKioKKyAqIG1waV9saW1iX3QKKyAqIF9nY3J5X21waWhfc3VibXVsXzEoIG1waV9wdHJfdCByZXNfcHRyLCAgICAgIChzcCArIDQpCisgKgkJICAgICBtcGlfcHRyX3QgczFfcHRyLAkgICAgIChzcCArIDgpCisgKgkJICAgICBtcGlfc2l6ZV90IHMxX3NpemUsICAgICAoc3AgKyAxMikKKyAqCQkgICAgIG1waV9saW1iX3QgczJfbGltYikgICAgIChzcCArIDE2KQorICoKKyAqIFA0OiA3IGN5Y2xlcy9saW1iLCB1bnN0YWJsZSB0aW1pbmcsIGF0IGxlYXN0IG9uIGVhcmx5IFBlbnRpdW00IHNpbGljb24KKyAqICAgIChzdGVwcGluZyAxMCkuCisgKgorICogVGhpcyBjb2RlIGlzIG5vdCBwYXJ0aWN1bGFybHkgZ29vZCBhdCA3IGMvbC4gIFRoZSBkZXBlbmRlbnQgY2hhaW4gaXMgb25seQorICogNCBjL2wgYW5kIHRoZXJlJ3Mgb25seSA0IE1NWCB1bml0IGluc3RydWN0aW9ucywgc28gaXQncyBub3QgY2xlYXIgd2h5IHRoYXQKKyAqIHNwZWVkIGlzbid0IGFjaGlldmVkLgorICoKKyAqIFRoZSBhcnJhbmdlbWVudHMgbWFkZSBoZXJlIHRvIGdldCBhIHR3byBpbnN0cnVjdGlvbiBkZXBlbmRlbnQgY2hhaW4gYXJlCisgKiBzbGlnaHRseSBzdWJ0bGUuICBJbiB0aGUgbG9vcCB0aGUgY2FycnkgKG9yIGJvcnJvdyByYXRoZXIpIGlzIGEgbmVnYXRpdmUKKyAqIHNvIHRoYXQgYSBwYWRkcSBjYW4gYmUgdXNlZCB0byBnaXZlIGEgbG93IGxpbWIgcmVhZHkgdG8gc3RvcmUsIGFuZCBhIGhpZ2gKKyAqIGxpbWIgcmVhZHkgdG8gYmVjb21lIHRoZSBuZXcgY2FycnkgYWZ0ZXIgYSBwc3JscS4KKyAqCisgKiBJZiB0aGUgY2Fycnkgd2FzIGEgc2ltcGxlIHR3b3MgY29tcGxlbWVudCBuZWdhdGl2ZSB0aGVuIHRoZSBwc3JscSBzaGlmdAorICogd291bGQgbmVlZCB0byBicmluZyBpbiAwIGJpdHMgb3IgMSBiaXRzIGFjY29yZGluZyB0byB3aGV0aGVyIHRoZSBoaWdoIHdhcworICogemVybyBvciBub24temVybywgc2luY2UgYSBub24temVybyB2YWx1ZSB3b3VsZCByZXByZXNlbnQgYSBuZWdhdGl2ZQorICogbmVlZGluZyBzaWduIGV4dGVuc2lvbi4gIFRoYXQgd291bGRuJ3QgYmUgcGFydGljdWxhcmx5IGVhc3kgdG8gYXJyYW5nZSBhbmQKKyAqIGNlcnRhaW5seSB3b3VsZCBhZGQgYW4gaW5zdHJ1Y3Rpb24gdG8gdGhlIGRlcGVuZGVudCBjaGFpbiwgc28gaW5zdGVhZCBhbgorICogb2Zmc2V0IGlzIGFwcGxpZWQgc28gdGhhdCB0aGUgaGlnaCBsaW1iIHdpbGwgYmUgMHhGRkZGRkZGRitjLiAgV2l0aCBjIGluCisgKiB0aGUgcmFuZ2UgLTB4RkZGRkZGRkYgdG8gMCwgdGhlIHZhbHVlIDB4RkZGRkZGRkYrYyBpcyBpbiB0aGUgcmFuZ2UgMCB0bworICogMHhGRkZGRkZGRiBhbmQgaXMgdGhlcmVmb3JlIGFsd2F5cyBwb3NpdGl2ZSBhbmQgY2FuIGFsd2F5cyBoYXZlIDAgYml0cworICogc2hpZnRlZCBpbiwgd2hpY2ggaXMgd2hhdCBwc3JscSBkb2VzLgorICoKKyAqIFRoZSBleHRyYSAweEZGRkZGRkZGIG11c3QgYmUgc3VidHJhY3RlZCBiZWZvcmUgYyBpcyB1c2VkLCBidXQgdGhhdCBjYW4gYmUKKyAqIGRvbmUgb2ZmIHRoZSBkZXBlbmRlbnQgY2hhaW4uICBUaGUgdG90YWwgYWRqdXN0bWVudCB0aGVuIGlzIHRvIGFkZAorICogMHhGRkZGRkZGRjAwMDAwMDAwIHRvIG9mZnNldCB0aGUgbmV3IGNhcnJ5LCBhbmQgc3VidHJhY3QKKyAqIDB4MDAwMDAwMDBGRkZGRkZGRiB0byByZW1vdmUgdGhlIG9mZnNldCBmcm9tIHRoZSBjdXJyZW50IGNhcnJ5LCBmb3IgYSBuZXQKKyAqIGFkZCBvZiAweEZGRkZGRkZFMDAwMDAwMDEuICBJbiB0aGUgY29kZSB0aGlzIGlzIGFwcGxpZWQgdG8gdGhlIGRlc3RpbmF0aW9uCisgKiBsaW1iIHdoZW4gZmV0Y2hlZC4KKyAqCisgKiBJdCdzIGFsc28gcG9zc2libGUgdG8gdmlldyB0aGUgMHhGRkZGRkZGRiBhZGp1c3RtZW50IGFzIGEgb25lcy1jb21wbGVtZW50CisgKiBuZWdhdGl2ZSwgd2hpY2ggaXMgaG93IGl0J3MgdW5kb25lIGZvciB0aGUgcmV0dXJuIHZhbHVlLCBidXQgdGhhdCBkb2Vzbid0CisgKiBzZWVtIGFzIGNsZWFyLgorKi8KKworCVRFWFQKKwlBTElHTiAoNCkKKwlHTE9CTAlDX1NZTUJPTF9OQU1FKF9nY3J5X21waWhfc3VibXVsXzEpCitDX1NZTUJPTF9OQU1FKF9nY3J5X21waWhfc3VibXVsXzE6KQorCisJcHhvcgklbW0xLCAlbW0xCQkKKworLkxzdGFydF8xYzoKKwltb3ZsCTgoJWVzcCksICVlYXgKKwlwY21wZXFkCSVtbTAsICVtbTAKKworCW1vdmQJMTYoJWVzcCksICVtbTcKKwlwY21wZXFkCSVtbTYsICVtbTYKKworCW1vdmwJNCglZXNwKSwgJWVkeAorCXBzcmxxCSQzMiwgJW1tMAkJCisKKwltb3ZsCTEyKCVlc3ApLCAlZWN4CisJcHNsbHEJJDMyLCAlbW02CQkKKworCXBzdWJxCSVtbTAsICVtbTYJCQorCisJcHN1YnEJJW1tMSwgJW1tMAkJCisKKy8qCisJQyBlYXgJc3JjLCBpbmNyZW1lbnRpbmcKKwlDIGVieAorCUMgZWN4CWxvb3AgY291bnRlciwgZGVjcmVtZW50aW5nCisJQyBlZHgJZHN0LCBpbmNyZW1lbnRpbmcKKwlDCisJQyBtbTAJMHhGRkZGRkZGRiAtIGJvcnJvdworCUMgbW02CTB4RkZGRkZGRkUwMDAwMDAwMQorCUMgbW03CW11bHRpcGxpZXIKKyovCisJCisuTGxvb3A6CisJbW92ZAkoJWVheCksICVtbTEJCQorCWxlYWwJNCglZWF4KSwgJWVheAorCW1vdmQJKCVlZHgpLCAlbW0yCQkKKwlwYWRkcQklbW02LCAlbW0yCQkKKwlwbXVsdWRxCSVtbTcsICVtbTEKKwlwc3VicQklbW0xLCAlbW0yCQkKKwlwYWRkcQklbW0yLCAlbW0wCQkKKwlzdWJsCSQxLCAlZWN4CisJbW92ZAklbW0wLCAoJWVkeCkJCQorCXBzcmxxCSQzMiwgJW1tMAorCWxlYWwJNCglZWR4KSwgJWVkeAorCWpuegkuTGxvb3AKKworCW1vdmQJJW1tMCwgJWVheAorCW5vdGwJJWVheAorCWVtbXMKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvcGVudGl1bTQvc3NlMi9tcGloLXN1YjEuUyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvcGVudGl1bTQvc3NlMi9tcGloLXN1YjEuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzkwMGM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9wZW50aXVtNC9zc2UyL21waWgtc3ViMS5TCkBAIC0wLDAgKzEsMTEyIEBACisvKiBJbnRlbCBQZW50aXVtLTQgbXBuX3N1Yl9uIC0tIG1wbiBzdWJ0cmFjdGlvbi4KKyAqCisgKiBDb3B5cmlnaHQgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKgorICogTm90ZTogVGhpcyBjb2RlIGlzIGhlYXZpbHkgYmFzZWQgb24gdGhlIEdOVSBNUCBMaWJyYXJ5LgorICoJIEFjdHVhbGx5IGl0J3MgdGhlIHNhbWUgY29kZSB3aXRoIG9ubHkgbWlub3IgY2hhbmdlcyBpbiB0aGUKKyAqCSB3YXkgdGhlIGRhdGEgaXMgc3RvcmVkOyB0aGlzIGlzIHRvIHN1cHBvcnQgdGhlIGFic3RyYWN0aW9uCisgKgkgb2YgYW4gb3B0aW9uYWwgc2VjdXJlIG1lbW9yeSBhbGxvY2F0aW9uIHdoaWNoIG1heSBiZSB1c2VkCisgKgkgdG8gYXZvaWQgcmV2ZWFsaW5nIG9mIHNlbnNpdGl2ZSBkYXRhIGR1ZSB0byBwYWdpbmcgZXRjLgorICovCisKKworI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImFzbS1zeW50YXguaCIKKworCisvKioqKioqKioqKioqKioqKioqKgorICogIG1waV9saW1iX3QKKyAqICBfZ2NyeV9tcGloX3N1Yl9uKCBtcGlfcHRyX3QgcmVzX3B0ciwJKHNwICsgNCkKKyAqCQkgICBtcGlfcHRyX3QgczFfcHRyLAkoc3AgKyA4KQorICoJCSAgIG1waV9wdHJfdCBzMl9wdHIsCShzcCArIDEyKQorICoJCSAgIG1waV9zaXplX3Qgc2l6ZSkJKHNwICsgMTYpCisgKgorICogUDQgV2lsbGFtZXR0ZSwgTm9ydGh3b29kOiA0LjAgY3ljbGVzL2xpbWIgaWYgZHN0IT1zcmMxIGFuZCBkc3QhPXNyYzIKKyAqCQkJICAgICA2LjAgY3ljbGVzL2xpbWIgaWYgZHN0PT1zcmMxIG9yIGRzdD09c3JjMgorICogUDQgUHJlc2NvdHQ6CQkgICAgID49IDUgY3ljbGVzL2xpbWIKKyAqCisgKiBUaGUgbWFpbiBsb29wIGNvZGUgaXMgMnggdW5yb2xsZWQgc28gdGhhdCB0aGUgY2FycnkgYml0IGNhbiBhbHRlcm5hdGUKKyAqIGJldHdlZW4gbW0wIGFuZCBtbTEuCisgKi8KKworCisudGV4dAorCUFMSUdOICgzKQorCS5nbG9ibCBDX1NZTUJPTF9OQU1FKF9nY3J5X21waWhfc3ViX24pCitDX1NZTUJPTF9OQU1FKF9nY3J5X21waWhfc3ViX246KQorCisJcHhvcgklbW0wLCAlbW0wCisuTHN0YXJ0X25jOgorCW1vdmwJOCglZXNwKSwgJWVheAorCW1vdmwJJWVieCwgOCglZXNwKQorCW1vdmwJMTIoJWVzcCksICVlYngKKwltb3ZsCTQoJWVzcCksICVlZHgKKwltb3ZsCTE2KCVlc3ApLCAlZWN4CisKKwlsZWFsCSglZWF4LCVlY3gsNCksICVlYXgJCisJbGVhbAkoJWVieCwlZWN4LDQpLCAlZWJ4CQorCWxlYWwJKCVlZHgsJWVjeCw0KSwgJWVkeAkKKwluZWdsCSVlY3gJCQkKKworLkx0b3A6CisvKgorCUMgZWF4CXNyYzEgZW5kCisJQyBlYngJc3JjMiBlbmQKKwlDIGVjeAljb3VudGVyLCBsaW1icywgbmVnYXRpdmUKKwlDIGVkeAlkc3QgZW5kCisJQyBtbTAJY2FycnkgYml0CisqLworCisJbW92ZAkoJWVheCwlZWN4LDQpLCAlbW0xCisJbW92ZAkoJWVieCwlZWN4LDQpLCAlbW0yCisJcHN1YnEJJW1tMiwgJW1tMQorCisJcHN1YnEJJW1tMCwgJW1tMQorCW1vdmQJJW1tMSwgKCVlZHgsJWVjeCw0KQorCisJcHNybHEJJDYzLCAlbW0xCisKKwlhZGRsCSQxLCAlZWN4CisJanoJLkxkb25lX21tMQorCisJbW92ZAkoJWVheCwlZWN4LDQpLCAlbW0wCisJbW92ZAkoJWVieCwlZWN4LDQpLCAlbW0yCisJcHN1YnEJJW1tMiwgJW1tMAorCisJcHN1YnEJJW1tMSwgJW1tMAorCW1vdmQJJW1tMCwgKCVlZHgsJWVjeCw0KQorCisJcHNybHEJJDYzLCAlbW0wCisKKwlhZGRsCSQxLCAlZWN4CisJam56CS5MdG9wCisKKworCW1vdmQJJW1tMCwgJWVheAorCW1vdmwJOCglZXNwKSwgJWVieAorCWVtbXMKKwlyZXQKKworCisKKy5MZG9uZV9tbTE6CisJbW92ZAklbW0xLCAlZWF4CisJbW92bAk4KCVlc3ApLCAlZWJ4CisJZW1tcworCXJldApkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9wb3dlci9NYW5pZmVzdCBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvcG93ZXIvTWFuaWZlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYwZmMyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvcG93ZXIvTWFuaWZlc3QKQEAgLTAsMCArMSwyNyBAQAorIyBNYW5pZmVzdCAtIGNoZWNrc3VtcyAKKyMgQ29weXJpZ2h0IDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyMKKyMgTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisKK21waWgtYWRkMS5TCittcGloLWxzaGlmdC5TCittcGloLW11bDEuUworbXBpaC1tdWwyLlMKK21waWgtbXVsMy5TCittcGloLXJzaGlmdC5TCittcGloLXN1YjEuUworJG5hbWVzJCBpUUNWQXdVQVArTG1YVEVBbnA4MzJTLzdBUUorbmdQL1hZcjVGdmwvOFdHVkhjSUthZWh4dm5LY1NEMklMVFdaTkd1YmduV3A4ZWJJeFZpampRQ3hZbmVUVHkrek8wc05hQjAwMm5leXNjeWl3YUpqL0pRSXdaWGZyMDZ1R3dlSXFsU3B3cGo5bmRrb0pjOEU0L0ZadSs1TlRPK0UzUmFCREFEK1RwbytNVGZiQzFzMThwNWkrYW45M1ZyU1RnTmNrNVBQWVFyVWNQQT09c2wzdApkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9wb3dlci9kaXN0ZmlsZXMgYi9saWJnY3J5cHQtMS40LjYvbXBpL3Bvd2VyL2Rpc3RmaWxlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWJjMDA4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9wb3dlci9kaXN0ZmlsZXMKQEAgLTAsMCArMSw4IEBACitNYW5pZmVzdAorbXBpaC1hZGQxLlMKK21waWgtbHNoaWZ0LlMKK21waWgtbXVsMS5TCittcGloLW11bDIuUworbXBpaC1tdWwzLlMKK21waWgtcnNoaWZ0LlMKK21waWgtc3ViMS5TCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL3Bvd2VyL21waWgtYWRkMS5TIGIvbGliZ2NyeXB0LTEuNC42L21waS9wb3dlci9tcGloLWFkZDEuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzZiNTZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9wb3dlci9tcGloLWFkZDEuUwpAQCAtMCwwICsxLDg3IEBACisvKiBJQk0gUE9XRVIgYWRkX24gLS0gQWRkIHR3byBsaW1iIHZlY3RvcnMgb2YgZXF1YWwsIG5vbi16ZXJvIGxlbmd0aC4KKyAqCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NCwgMTk5NiwgMTk5OSwKKyAqICAgICAgICAgICAgICAgICAgICAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqLworCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAiYXNtLXN5bnRheC5oIgorCisvKgorIyBJTlBVVCBQQVJBTUVURVJTCisjIHJlc19wdHIJcjMKKyMgczFfcHRyCXI0CisjIHMyX3B0cglyNQorIyBzaXplCQlyNgorICovCisKKwkudG9jCisJLmV4dGVybiBfZ2NyeV9tcGloX2FkZF9uW0RTXQorCS5leHRlcm4gLl9nY3J5X21waWhfYWRkX24KKy5jc2VjdCBbUFJdCisJLmFsaWduIDIKKwkuZ2xvYmwgX2djcnlfbXBpaF9hZGRfbgorCS5nbG9ibCAuX2djcnlfbXBpaF9hZGRfbgorCS5jc2VjdCBfZ2NyeV9tcGloX2FkZF9uW0RTXQorX2djcnlfbXBpaF9hZGRfbjoKKwkubG9uZyAuX2djcnlfbXBpaF9hZGRfbiwgVE9DW3RjMF0sIDAKKwkuY3NlY3QgW1BSXQorLl9nY3J5X21waWhfYWRkX246CisJYW5kaWwuCTEwLDYsMQkJIyBvZGQgb3IgZXZlbiBudW1iZXIgb2YgbGltYnM/CisJbAk4LDAoNCkJCSMgbG9hZCBsZWFzdCBzaWduaWZpY2FudCBzMSBsaW1iCisJbAkwLDAoNSkJCSMgbG9hZCBsZWFzdCBzaWduaWZpY2FudCBzMiBsaW1iCisJY2FsCTMsLTQoMykgCSMgb2Zmc2V0IHJlc19wdHIsIGl0J3MgdXBkYXRlZCBiZWZvcmUgaXQncyB1c2VkCisJc3JpCTEwLDYsMQkJIyBjb3VudCBmb3IgdW5yb2xsZWQgbG9vcAorCWEJNywwLDgJCSMgYWRkIGxlYXN0IHNpZ25pZmljYW50IGxpbWJzLCBzZXQgY3kKKwltdGN0cgkxMAkJIyBjb3B5IGNvdW50IGludG8gQ1RSCisJYmVxCTAsTGV2ZW4gCSMgYnJhbmNoIGlmIGV2ZW4gIyBvZiBsaW1icyAoIyBvZiBsaW1icyA+PSAyKQorCisjIFdlIGhhdmUgYW4gb2RkICMgb2YgbGltYnMuICBBZGQgdGhlIGZpcnN0IGxpbWJzIHNlcGFyYXRlbHkuCisJY21waQkxLDEwLDAJCSMgaXMgY291bnQgZm9yIHVucm9sbGVkIGxvb3AgemVybz8KKwlibmUJMSxMMQkJIyBicmFuY2ggaWYgbm90CisJc3QJNyw0KDMpCisJYXplCTMsMTAJCSMgdXNlIHRoZSBmYWN0IHRoYXQgcjEwIGlzIHplcm8uLi4KKwlicgkJCSMgcmV0dXJuCisKKyMgV2UgYWRkZWQgbGVhc3Qgc2lnbmlmaWNhbnQgbGltYnMuICBOb3cgcmVsb2FkIHRoZSBuZXh0IGxpbWJzIHRvIGVudGVyIGxvb3AuCitMMToJbHUJOCw0KDQpCQkjIGxvYWQgczEgbGltYiBhbmQgdXBkYXRlIHMxX3B0cgorCWx1CTAsNCg1KQkJIyBsb2FkIHMyIGxpbWIgYW5kIHVwZGF0ZSBzMl9wdHIKKwlzdHUJNyw0KDMpCisJYWUJNywwLDgJCSMgYWRkIGxpbWJzLCBzZXQgY3kKK0xldmVuOglsdQk5LDQoNCkJCSMgbG9hZCBzMSBsaW1iIGFuZCB1cGRhdGUgczFfcHRyCisJbHUJMTAsNCg1KSAJIyBsb2FkIHMyIGxpbWIgYW5kIHVwZGF0ZSBzMl9wdHIKKwliZHoJTGVuZAkJIyBJZiBkb25lLCBza2lwIGxvb3AKKworTG9vcDoJbHUJOCw0KDQpCQkjIGxvYWQgczEgbGltYiBhbmQgdXBkYXRlIHMxX3B0cgorCWx1CTAsNCg1KQkJIyBsb2FkIHMyIGxpbWIgYW5kIHVwZGF0ZSBzMl9wdHIKKwlhZQkxMSw5LDEwIAkjIGFkZCBwcmV2aW91cyBsaW1icyB3aXRoIGN5LCBzZXQgY3kKKwlzdHUJNyw0KDMpCQkjCisJbHUJOSw0KDQpCQkjIGxvYWQgczEgbGltYiBhbmQgdXBkYXRlIHMxX3B0cgorCWx1CTEwLDQoNSkgCSMgbG9hZCBzMiBsaW1iIGFuZCB1cGRhdGUgczJfcHRyCisJYWUJNywwLDgJCSMgYWRkIHByZXZpb3VzIGxpbWJzIHdpdGggY3ksIHNldCBjeQorCXN0dQkxMSw0KDMpIAkjCisJYmRuCUxvb3AJCSMgZGVjcmVtZW50IENUUiBhbmQgbG9vcCBiYWNrCisKK0xlbmQ6CWFlCTExLDksMTAgCSMgYWRkIGxpbWJzIHdpdGggY3ksIHNldCBjeQorCXN0CTcsNCgzKQkJIworCXN0CTExLDgoMykgCSMKKwlsaWwJMywwCQkjIGxvYWQgY3kgaW50byAuLi4KKwlhemUJMywzCQkjIC4uLiByZXR1cm4gdmFsdWUgcmVnaXN0ZXIKKwlicgorCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL3Bvd2VyL21waWgtbHNoaWZ0LlMgYi9saWJnY3J5cHQtMS40LjYvbXBpL3Bvd2VyL21waWgtbHNoaWZ0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDllNDJkYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvcG93ZXIvbXBpaC1sc2hpZnQuUwpAQCAtMCwwICsxLDY0IEBACisvKiBJQk0gUE9XRVIgbHNoaWZ0CisgKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTQsIDE5OTksIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICovCisKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJhc20tc3ludGF4LmgiCisKKy8qCisjIElOUFVUIFBBUkFNRVRFUlMKKyMgcmVzX3B0cglyMworIyBzX3B0ciAJcjQKKyMgc2l6ZQkJcjUKKyMgY250CQlyNgorICovCisKKwkudG9jCisJLmV4dGVybiBfZ2NyeV9tcGloX2xzaGlmdFtEU10KKwkuZXh0ZXJuIC5fZ2NyeV9tcGloX2xzaGlmdAorLmNzZWN0IFtQUl0KKwkuYWxpZ24gMgorCS5nbG9ibCBfZ2NyeV9tcGloX2xzaGlmdAorCS5nbG9ibCAuX2djcnlfbXBpaF9sc2hpZnQKKwkuY3NlY3QgX2djcnlfbXBpaF9sc2hpZnRbRFNdCitfZ2NyeV9tcGloX2xzaGlmdDoKKwkubG9uZyAuX2djcnlfbXBpaF9sc2hpZnQsIFRPQ1t0YzBdLCAwCisJLmNzZWN0IFtQUl0KKy5fZ2NyeV9tcGloX2xzaGlmdDoKKwlzbGkJMCw1LDIKKwljYXgJOSwzLDAKKwljYXgJNCw0LDAKKwlzZmkJOCw2LDMyCisJbXRjdHIJNQkJIyBwdXQgbGltYiBjb3VudCBpbiBDVFIgbG9vcCByZWdpc3RlcgorCWx1CTAsLTQoNCkgCSMgcmVhZCBtb3N0IHNpZ25pZmljYW50IGxpbWIKKwlzcmUJMywwLDgJCSMgY29tcHV0ZSBjYXJyeSBvdXQgbGltYiwgYW5kIGluaXQgTVEgcmVnaXN0ZXIKKwliZHoJTGVuZDIJCSMgaWYganVzdCBvbmUgbGltYiwgc2tpcCBsb29wCisJbHUJMCwtNCg0KSAJIyByZWFkIDI6bmQgbW9zdCBzaWduaWZpY2FudCBsaW1iCisJc3JlcQk3LDAsOAkJIyBjb21wdXRlIG1vc3Qgc2lnbmlmaWNhbnQgbGltYiBvZiByZXN1bHQKKwliZHoJTGVuZAkJIyBpZiBqdXN0IHR3byBsaW1iLCBza2lwIGxvb3AKK0xvb3A6CWx1CTAsLTQoNCkgCSMgbG9hZCBuZXh0IGxvd2VyIGxpbWIKKwlzdHUJNywtNCg5KSAJIyBzdG9yZSBwcmV2aW91cyByZXN1bHQgZHVyaW5nIHJlYWQgbGF0ZW5jeQorCXNyZXEJNywwLDgJCSMgY29tcHV0ZSByZXN1bHQgbGltYgorCWJkbglMb29wCQkjIGxvb3AgYmFjayB1bnRpbCBDVFIgaXMgemVybworTGVuZDoJc3R1CTcsLTQoOSkgCSMgc3RvcmUgMjpuZCBsZWFzdCBzaWduaWZpY2FudCBsaW1iCitMZW5kMjoJc2xlCTcsMCw2CQkjIGNvbXB1dGUgbGVhc3Qgc2lnbmlmaWNhbnQgbGltYgorCXN0CTcsLTQoOSkgCSMgc3RvcmUgaXQKKwlicgorCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL3Bvd2VyL21waWgtbXVsMS5TIGIvbGliZ2NyeXB0LTEuNC42L21waS9wb3dlci9tcGloLW11bDEuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTAzNGZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9wb3dlci9tcGloLW11bDEuUwpAQCAtMCwwICsxLDExNSBAQAorLyogSUJNIFBPV0VSICBtdWxfMSAtLSBNdWx0aXBseSBhIGxpbWIgdmVjdG9yIHdpdGggYSBsaW1iIGFuZCBzdG9yZQorICogICAgICAgICAgICAgICAgICAgICB0aGUgcmVzdWx0IGluIGEgc2Vjb25kIGxpbWIgdmVjdG9yLgorICoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk0LCAxOTk5LCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqLworCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAiYXNtLXN5bnRheC5oIgorCisvKgorIyBJTlBVVCBQQVJBTUVURVJTCisjIHJlc19wdHIJcjMKKyMgczFfcHRyCXI0CisjIHNpemUJCXI1CisjIHMyX2xpbWIJcjYKKworIyBUaGUgUlMvNjAwMCBoYXMgbm8gdW5zaWduZWQgMzJ4MzItPjY0IGJpdCBtdWx0aXBsaWNhdGlvbiBpbnN0cnVjdGlvbi4gIFRvCisjIG9idGFpbiB0aGF0IG9wZXJhdGlvbiwgd2UgaGF2ZSB0byB1c2UgdGhlIDMyeDMyLT42NCBzaWduZWQgbXVsdGlwbGljYXRpb24KKyMgaW5zdHJ1Y3Rpb24sIGFuZCBhZGQgdGhlIGFwcHJvcHJpYXRlIGNvbXBlbnNhdGlvbiB0byB0aGUgaGlnaCBsaW1iIG9mIHRoZQorIyByZXN1bHQuICBXZSBhZGQgdGhlIG11bHRpcGxpY2FuZCBpZiB0aGUgbXVsdGlwbGllciBoYXMgaXRzIG1vc3Qgc2lnbmlmaWNhbnQKKyMgYml0IHNldCwgYW5kIHdlIGFkZCB0aGUgbXVsdGlwbGllciBpZiB0aGUgbXVsdGlwbGljYW5kIGhhcyBpdHMgbW9zdAorIyBzaWduaWZpY2FudCBiaXQgc2V0LglXZSBuZWVkIHRvIHByZXNlcnZlIHRoZSBjYXJyeSBmbGFnIGJldHdlZW4gZWFjaAorIyBpdGVyYXRpb24sIHNvIHdlIGhhdmUgdG8gY29tcHV0ZSB0aGUgY29tcGVuc2F0aW9uIGNhcmVmdWxseSAodGhlIG5hdHVyYWwsCisjIHNyYWkrYW5kIGRvZXNuJ3Qgd29yaykuICBTaW5jZSB0aGUgUE9XRVIgYXJjaGl0ZWN0dXJlIGhhcyBhIGJyYW5jaCB1bml0CisjIHdlIGNhbiBicmFuY2ggaW4gemVybyBjeWNsZXMsIHNvIHRoYXQncyBob3cgd2UgcGVyZm9ybSB0aGUgYWRkaXRpb25zLgorICovCisKKwkudG9jCisJLmNzZWN0IC5fZ2NyeV9tcGloX211bF8xW1BSXQorCS5hbGlnbiAyCisJLmdsb2JsIF9nY3J5X21waWhfbXVsXzEKKwkuZ2xvYmwgLl9nY3J5X21waWhfbXVsXzEKKwkuY3NlY3QgX2djcnlfbXBpaF9tdWxfMVtEU10KK19nY3J5X21waWhfbXVsXzE6CisJLmxvbmcgLl9nY3J5X21waWhfbXVsXzFbUFJdLCBUT0NbdGMwXSwgMAorCS5jc2VjdCAuX2djcnlfbXBpaF9tdWxfMVtQUl0KKy5fZ2NyeV9tcGloX211bF8xOgorCisJY2FsCTMsLTQoMykKKwlsCTAsMCg0KQorCWNtcGkJMCw2LDAKKwltdGN0cgk1CisJbXVsCTksMCw2CisJc3JhaQk3LDAsMzEKKwlhbmQJNyw3LDYKKwltZm1xCTgKKwlhaQkwLDAsMAkJIyByZXNldCBjYXJyeQorCWNheAk5LDksNworCWJsdAlMbmVnCitMcG9zOgliZHoJTGVuZAorTHBsb29wOiBsdQkwLDQoNCkKKwlzdHUJOCw0KDMpCisJY21waQkwLDAsMAorCW11bAkxMCwwLDYKKwltZm1xCTAKKwlhZQk4LDAsOQorCWJnZQlMcDAKKwljYXgJMTAsMTAsNiAJIyBhZGp1c3QgaGlnaCBsaW1iIGZvciBuZWdhdGl2ZSBsaW1iIGZyb20gczEKK0xwMDoJYmR6CUxlbmQwCisJbHUJMCw0KDQpCisJc3R1CTgsNCgzKQorCWNtcGkJMCwwLDAKKwltdWwJOSwwLDYKKwltZm1xCTAKKwlhZQk4LDAsMTAKKwliZ2UJTHAxCisJY2F4CTksOSw2CQkjIGFkanVzdCBoaWdoIGxpbWIgZm9yIG5lZ2F0aXZlIGxpbWIgZnJvbSBzMQorTHAxOgliZG4JTHBsb29wCisJYglMZW5kCisKK0xuZWc6CWNheAk5LDksMAorCWJkeglMZW5kCitMbmxvb3A6IGx1CTAsNCg0KQorCXN0dQk4LDQoMykKKwljbXBpCTAsMCwwCisJbXVsCTEwLDAsNgorCWNheAkxMCwxMCwwIAkjIGFkanVzdCBoaWdoIGxpbWIgZm9yIG5lZ2F0aXZlIHMyX2xpbWIKKwltZm1xCTAKKwlhZQk4LDAsOQorCWJnZQlMbjAKKwljYXgJMTAsMTAsNiAJIyBhZGp1c3QgaGlnaCBsaW1iIGZvciBuZWdhdGl2ZSBsaW1iIGZyb20gczEKK0xuMDoJYmR6CUxlbmQwCisJbHUJMCw0KDQpCisJc3R1CTgsNCgzKQorCWNtcGkJMCwwLDAKKwltdWwJOSwwLDYKKwljYXgJOSw5LDAJCSMgYWRqdXN0IGhpZ2ggbGltYiBmb3IgbmVnYXRpdmUgczJfbGltYgorCW1mbXEJMAorCWFlCTgsMCwxMAorCWJnZQlMbjEKKwljYXgJOSw5LDYJCSMgYWRqdXN0IGhpZ2ggbGltYiBmb3IgbmVnYXRpdmUgbGltYiBmcm9tIHMxCitMbjE6CWJkbglMbmxvb3AKKwliCUxlbmQKKworTGVuZDA6CWNhbAk5LDAoMTApCitMZW5kOglzdAk4LDQoMykKKwlhemUJMyw5CisJYnIKKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9wb3dlci9tcGloLW11bDIuUyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvcG93ZXIvbXBpaC1tdWwyLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA1NmU4ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvcG93ZXIvbXBpaC1tdWwyLlMKQEAgLTAsMCArMSwxMzAgQEAKKy8qIElCTSBQT1dFUiBhZGRtdWxfMSAtLSBNdWx0aXBseSBhIGxpbWIgdmVjdG9yIHdpdGggYSBsaW1iIGFuZCBhZGQKKyAqCQkJIHRoZSByZXN1bHQgdG8gYSBzZWNvbmQgbGltYiB2ZWN0b3IuCisgKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTQsIDE5OTksIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICovCisKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJhc20tc3ludGF4LmgiCisKKworCisvKgorIyBJTlBVVCBQQVJBTUVURVJTCisjIHJlc19wdHIJcjMKKyMgczFfcHRyCXI0CisjIHNpemUJCXI1CisjIHMyX2xpbWIJcjYKKworIyBUaGUgUlMvNjAwMCBoYXMgbm8gdW5zaWduZWQgMzJ4MzItPjY0IGJpdCBtdWx0aXBsaWNhdGlvbiBpbnN0cnVjdGlvbi4gIFRvCisjIG9idGFpbiB0aGF0IG9wZXJhdGlvbiwgd2UgaGF2ZSB0byB1c2UgdGhlIDMyeDMyLT42NCBzaWduZWQgbXVsdGlwbGljYXRpb24KKyMgaW5zdHJ1Y3Rpb24sIGFuZCBhZGQgdGhlIGFwcHJvcHJpYXRlIGNvbXBlbnNhdGlvbiB0byB0aGUgaGlnaCBsaW1iIG9mIHRoZQorIyByZXN1bHQuICBXZSBhZGQgdGhlIG11bHRpcGxpY2FuZCBpZiB0aGUgbXVsdGlwbGllciBoYXMgaXRzIG1vc3Qgc2lnbmlmaWNhbnQKKyMgYml0IHNldCwgYW5kIHdlIGFkZCB0aGUgbXVsdGlwbGllciBpZiB0aGUgbXVsdGlwbGljYW5kIGhhcyBpdHMgbW9zdAorIyBzaWduaWZpY2FudCBiaXQgc2V0LglXZSBuZWVkIHRvIHByZXNlcnZlIHRoZSBjYXJyeSBmbGFnIGJldHdlZW4gZWFjaAorIyBpdGVyYXRpb24sIHNvIHdlIGhhdmUgdG8gY29tcHV0ZSB0aGUgY29tcGVuc2F0aW9uIGNhcmVmdWxseSAodGhlIG5hdHVyYWwsCisjIHNyYWkrYW5kIGRvZXNuJ3Qgd29yaykuICBTaW5jZSB0aGUgUE9XRVIgYXJjaGl0ZWN0dXJlIGhhcyBhIGJyYW5jaCB1bml0CisjIHdlIGNhbiBicmFuY2ggaW4gemVybyBjeWNsZXMsIHNvIHRoYXQncyBob3cgd2UgcGVyZm9ybSB0aGUgYWRkaXRpb25zLgorICovCisKKwkudG9jCisJLmNzZWN0IC5fZ2NyeV9tcGloX2FkZG11bF8xW1BSXQorCS5hbGlnbiAyCisJLmdsb2JsIF9nY3J5X21waWhfYWRkbXVsXzEKKwkuZ2xvYmwgLl9nY3J5X21waWhfYWRkbXVsXzEKKwkuY3NlY3QgX2djcnlfbXBpaF9hZGRtdWxfMVtEU10KK19nY3J5X21waWhfYWRkbXVsXzE6CisJLmxvbmcgLl9nY3J5X21waWhfYWRkbXVsXzFbUFJdLCBUT0NbdGMwXSwgMAorCS5jc2VjdCAuX2djcnlfbXBpaF9hZGRtdWxfMVtQUl0KKy5fZ2NyeV9tcGloX2FkZG11bF8xOgorCisJY2FsCTMsLTQoMykKKwlsCTAsMCg0KQorCWNtcGkJMCw2LDAKKwltdGN0cgk1CisJbXVsCTksMCw2CisJc3JhaQk3LDAsMzEKKwlhbmQJNyw3LDYKKwltZm1xCTgKKwljYXgJOSw5LDcKKwlsCTcsNCgzKQorCWEJOCw4LDcJCSMgYWRkIHJlc19saW1iCisJYmx0CUxuZWcKK0xwb3M6CWJkeglMZW5kCisKK0xwbG9vcDogbHUJMCw0KDQpCisJc3R1CTgsNCgzKQorCWNtcGkJMCwwLDAKKwltdWwJMTAsMCw2CisJbWZtcQkwCisJYWUJOCwwLDkJCSMgbG93IGxpbWIgKyBvbGRfY3lfbGltYiArIG9sZCBjeQorCWwJNyw0KDMpCisJYXplCTEwLDEwCQkjIHByb3BhZ2F0ZSBjeSB0byBuZXcgY3lfbGltYgorCWEJOCw4LDcJCSMgYWRkIHJlc19saW1iCisJYmdlCUxwMAorCWNheAkxMCwxMCw2IAkjIGFkanVzdCBoaWdoIGxpbWIgZm9yIG5lZ2F0aXZlIGxpbWIgZnJvbSBzMQorTHAwOgliZHoJTGVuZDAKKwlsdQkwLDQoNCkKKwlzdHUJOCw0KDMpCisJY21waQkwLDAsMAorCW11bAk5LDAsNgorCW1mbXEJMAorCWFlCTgsMCwxMAorCWwJNyw0KDMpCisJYXplCTksOQorCWEJOCw4LDcKKwliZ2UJTHAxCisJY2F4CTksOSw2CQkjIGFkanVzdCBoaWdoIGxpbWIgZm9yIG5lZ2F0aXZlIGxpbWIgZnJvbSBzMQorTHAxOgliZG4JTHBsb29wCisKKwliCUxlbmQKKworTG5lZzoJY2F4CTksOSwwCisJYmR6CUxlbmQKK0xubG9vcDogbHUJMCw0KDQpCisJc3R1CTgsNCgzKQorCWNtcGkJMCwwLDAKKwltdWwJMTAsMCw2CisJbWZtcQk3CisJYWUJOCw3LDkKKwlsCTcsNCgzKQorCWFlCTEwLDEwLDAgCSMgcHJvcGFnYXRlIGN5IHRvIG5ldyBjeV9saW1iCisJYQk4LDgsNwkJIyBhZGQgcmVzX2xpbWIKKwliZ2UJTG4wCisJY2F4CTEwLDEwLDYgCSMgYWRqdXN0IGhpZ2ggbGltYiBmb3IgbmVnYXRpdmUgbGltYiBmcm9tIHMxCitMbjA6CWJkeglMZW5kMAorCWx1CTAsNCg0KQorCXN0dQk4LDQoMykKKwljbXBpCTAsMCwwCisJbXVsCTksMCw2CisJbWZtcQk3CisJYWUJOCw3LDEwCisJbAk3LDQoMykKKwlhZQk5LDksMAkJIyBwcm9wYWdhdGUgY3kgdG8gbmV3IGN5X2xpbWIKKwlhCTgsOCw3CQkjIGFkZCByZXNfbGltYgorCWJnZQlMbjEKKwljYXgJOSw5LDYJCSMgYWRqdXN0IGhpZ2ggbGltYiBmb3IgbmVnYXRpdmUgbGltYiBmcm9tIHMxCitMbjE6CWJkbglMbmxvb3AKKwliCUxlbmQKKworTGVuZDA6CWNhbAk5LDAoMTApCitMZW5kOglzdAk4LDQoMykKKwlhemUJMyw5CisJYnIKKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9wb3dlci9tcGloLW11bDMuUyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvcG93ZXIvbXBpaC1tdWwzLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJjMzE3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvcG93ZXIvbXBpaC1tdWwzLlMKQEAgLTAsMCArMSwxMzUgQEAKKy8qIElCTSBQT1dFUiBzdWJtdWxfMSAtLSBNdWx0aXBseSBhIGxpbWIgdmVjdG9yIHdpdGggYSBsaW1iIGFuZCBzdWJ0cmFjdAorICoJCQkgdGhlIHJlc3VsdCBmcm9tIGEgc2Vjb25kIGxpbWIgdmVjdG9yLgorICoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk0LCAxOTk5LCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqLworCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAiYXNtLXN5bnRheC5oIgorCisKKy8qCisKKyMgSU5QVVQgUEFSQU1FVEVSUworIyByZXNfcHRyCXIzCisjIHMxX3B0cglyNAorIyBzaXplCQlyNQorIyBzMl9saW1iCXI2CisKKyMgVGhlIFJTLzYwMDAgaGFzIG5vIHVuc2lnbmVkIDMyeDMyLT42NCBiaXQgbXVsdGlwbGljYXRpb24gaW5zdHJ1Y3Rpb24uICBUbworIyBvYnRhaW4gdGhhdCBvcGVyYXRpb24sIHdlIGhhdmUgdG8gdXNlIHRoZSAzMngzMi0+NjQgc2lnbmVkIG11bHRpcGxpY2F0aW9uCisjIGluc3RydWN0aW9uLCBhbmQgYWRkIHRoZSBhcHByb3ByaWF0ZSBjb21wZW5zYXRpb24gdG8gdGhlIGhpZ2ggbGltYiBvZiB0aGUKKyMgcmVzdWx0LiAgV2UgYWRkIHRoZSBtdWx0aXBsaWNhbmQgaWYgdGhlIG11bHRpcGxpZXIgaGFzIGl0cyBtb3N0IHNpZ25pZmljYW50CisjIGJpdCBzZXQsIGFuZCB3ZSBhZGQgdGhlIG11bHRpcGxpZXIgaWYgdGhlIG11bHRpcGxpY2FuZCBoYXMgaXRzIG1vc3QKKyMgc2lnbmlmaWNhbnQgYml0IHNldC4JV2UgbmVlZCB0byBwcmVzZXJ2ZSB0aGUgY2FycnkgZmxhZyBiZXR3ZWVuIGVhY2gKKyMgaXRlcmF0aW9uLCBzbyB3ZSBoYXZlIHRvIGNvbXB1dGUgdGhlIGNvbXBlbnNhdGlvbiBjYXJlZnVsbHkgKHRoZSBuYXR1cmFsLAorIyBzcmFpK2FuZCBkb2Vzbid0IHdvcmspLiAgU2luY2UgdGhlIFBPV0VSIGFyY2hpdGVjdHVyZSBoYXMgYSBicmFuY2ggdW5pdAorIyB3ZSBjYW4gYnJhbmNoIGluIHplcm8gY3ljbGVzLCBzbyB0aGF0J3MgaG93IHdlIHBlcmZvcm0gdGhlIGFkZGl0aW9ucy4KKyAqLworCisJLnRvYworCS5jc2VjdCAuX2djcnlfbXBpaF9zdWJtdWxfMVtQUl0KKwkuYWxpZ24gMgorCS5nbG9ibCBfZ2NyeV9tcGloX3N1Ym11bF8xCisJLmdsb2JsIC5fZ2NyeV9tcGloX3N1Ym11bF8xCisJLmNzZWN0IF9nY3J5X21waWhfc3VibXVsXzFbRFNdCitfZ2NyeV9tcGloX3N1Ym11bF8xOgorCS5sb25nIC5fZ2NyeV9tcGloX3N1Ym11bF8xW1BSXSwgVE9DW3RjMF0sIDAKKwkuY3NlY3QgLl9nY3J5X21waWhfc3VibXVsXzFbUFJdCisuX2djcnlfbXBpaF9zdWJtdWxfMToKKworCWNhbAkzLC00KDMpCisJbAkwLDAoNCkKKwljbXBpCTAsNiwwCisJbXRjdHIJNQorCW11bAk5LDAsNgorCXNyYWkJNywwLDMxCisJYW5kCTcsNyw2CisJbWZtcQkxMQorCWNheAk5LDksNworCWwJNyw0KDMpCisJc2YJOCwxMSw3CQkjIGFkZCByZXNfbGltYgorCWEJMTEsOCwxMSAJIyBpbnZlcnQgY3kgKHIxMSBpcyBqdW5rKQorCWJsdAlMbmVnCitMcG9zOgliZHoJTGVuZAorCitMcGxvb3A6IGx1CTAsNCg0KQorCXN0dQk4LDQoMykKKwljbXBpCTAsMCwwCisJbXVsCTEwLDAsNgorCW1mbXEJMAorCWFlCTExLDAsOQkJIyBsb3cgbGltYiArIG9sZF9jeV9saW1iICsgb2xkIGN5CisJbAk3LDQoMykKKwlhemUJMTAsMTAJCSMgcHJvcGFnYXRlIGN5IHRvIG5ldyBjeV9saW1iCisJc2YJOCwxMSw3CQkjIGFkZCByZXNfbGltYgorCWEJMTEsOCwxMSAJIyBpbnZlcnQgY3kgKHIxMSBpcyBqdW5rKQorCWJnZQlMcDAKKwljYXgJMTAsMTAsNiAJIyBhZGp1c3QgaGlnaCBsaW1iIGZvciBuZWdhdGl2ZSBsaW1iIGZyb20gczEKK0xwMDoJYmR6CUxlbmQwCisJbHUJMCw0KDQpCisJc3R1CTgsNCgzKQorCWNtcGkJMCwwLDAKKwltdWwJOSwwLDYKKwltZm1xCTAKKwlhZQkxMSwwLDEwCisJbAk3LDQoMykKKwlhemUJOSw5CisJc2YJOCwxMSw3CisJYQkxMSw4LDExIAkjIGludmVydCBjeSAocjExIGlzIGp1bmspCisJYmdlCUxwMQorCWNheAk5LDksNgkJIyBhZGp1c3QgaGlnaCBsaW1iIGZvciBuZWdhdGl2ZSBsaW1iIGZyb20gczEKK0xwMToJYmRuCUxwbG9vcAorCisJYglMZW5kCisKK0xuZWc6CWNheAk5LDksMAorCWJkeglMZW5kCitMbmxvb3A6IGx1CTAsNCg0KQorCXN0dQk4LDQoMykKKwljbXBpCTAsMCwwCisJbXVsCTEwLDAsNgorCW1mbXEJNworCWFlCTExLDcsOQorCWwJNyw0KDMpCisJYWUJMTAsMTAsMCAJIyBwcm9wYWdhdGUgY3kgdG8gbmV3IGN5X2xpbWIKKwlzZgk4LDExLDcJCSMgYWRkIHJlc19saW1iCisJYQkxMSw4LDExIAkjIGludmVydCBjeSAocjExIGlzIGp1bmspCisJYmdlCUxuMAorCWNheAkxMCwxMCw2IAkjIGFkanVzdCBoaWdoIGxpbWIgZm9yIG5lZ2F0aXZlIGxpbWIgZnJvbSBzMQorTG4wOgliZHoJTGVuZDAKKwlsdQkwLDQoNCkKKwlzdHUJOCw0KDMpCisJY21waQkwLDAsMAorCW11bAk5LDAsNgorCW1mbXEJNworCWFlCTExLDcsMTAKKwlsCTcsNCgzKQorCWFlCTksOSwwCQkjIHByb3BhZ2F0ZSBjeSB0byBuZXcgY3lfbGltYgorCXNmCTgsMTEsNwkJIyBhZGQgcmVzX2xpbWIKKwlhCTExLDgsMTEgCSMgaW52ZXJ0IGN5IChyMTEgaXMganVuaykKKwliZ2UJTG4xCisJY2F4CTksOSw2CQkjIGFkanVzdCBoaWdoIGxpbWIgZm9yIG5lZ2F0aXZlIGxpbWIgZnJvbSBzMQorTG4xOgliZG4JTG5sb29wCisJYglMZW5kCisKK0xlbmQwOgljYWwJOSwwKDEwKQorTGVuZDoJc3QJOCw0KDMpCisJYXplCTMsOQorCWJyCisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvcG93ZXIvbXBpaC1yc2hpZnQuUyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvcG93ZXIvbXBpaC1yc2hpZnQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTMxYTg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9wb3dlci9tcGloLXJzaGlmdC5TCkBAIC0wLDAgKzEsNjQgQEAKKy8qIElCTSBQT1dFUiByc2hpZnQKKyAqCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NCwgMTk5OSwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKi8KKworI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImFzbS1zeW50YXguaCIKKworCisvKgorIyBJTlBVVCBQQVJBTUVURVJTCisjIHJlc19wdHIJcjMKKyMgc19wdHIgCXI0CisjIHNpemUJCXI1CisjIGNudAkJcjYKKyovCisKKwkudG9jCisJLmV4dGVybiBfZ2NyeV9tcGloX3JzaGlmdFtEU10KKwkuZXh0ZXJuIC5fZ2NyeV9tcGloX3JzaGlmdAorLmNzZWN0IFtQUl0KKwkuYWxpZ24gMgorCS5nbG9ibCBfZ2NyeV9tcGloX3JzaGlmdAorCS5nbG9ibCAuX2djcnlfbXBpaF9yc2hpZnQKKwkuY3NlY3QgX2djcnlfbXBpaF9yc2hpZnRbRFNdCitfZ2NyeV9tcGloX3JzaGlmdDoKKwkubG9uZyAuX2djcnlfbXBpaF9yc2hpZnQsIFRPQ1t0YzBdLCAwCisJLmNzZWN0IFtQUl0KKy5fZ2NyeV9tcGloX3JzaGlmdDoKKwlzZmkJOCw2LDMyCisJbXRjdHIJNQkJIyBwdXQgbGltYiBjb3VudCBpbiBDVFIgbG9vcCByZWdpc3RlcgorCWwJMCwwKDQpCQkjIHJlYWQgbGVhc3Qgc2lnbmlmaWNhbnQgbGltYgorCWFpCTksMywtNAkJIyBhZGp1c3QgcmVzX3B0ciBzaW5jZSBpdCdzIG9mZnNldCBpbiB0aGUgc3R1OnMKKwlzbGUJMywwLDgJCSMgY29tcHV0ZSBjYXJyeSBsaW1iLCBhbmQgaW5pdCBNUSByZWdpc3RlcgorCWJkeglMZW5kMgkJIyBpZiBqdXN0IG9uZSBsaW1iLCBza2lwIGxvb3AKKwlsdQkwLDQoNCkJCSMgcmVhZCAyOm5kIGxlYXN0IHNpZ25pZmljYW50IGxpbWIKKwlzbGVxCTcsMCw4CQkjIGNvbXB1dGUgbGVhc3Qgc2lnbmlmaWNhbnQgbGltYiBvZiByZXN1bHQKKwliZHoJTGVuZAkJIyBpZiBqdXN0IHR3byBsaW1iLCBza2lwIGxvb3AKK0xvb3A6CWx1CTAsNCg0KQkJIyBsb2FkIG5leHQgaGlnaGVyIGxpbWIKKwlzdHUJNyw0KDkpCQkjIHN0b3JlIHByZXZpb3VzIHJlc3VsdCBkdXJpbmcgcmVhZCBsYXRlbmN5CisJc2xlcQk3LDAsOAkJIyBjb21wdXRlIHJlc3VsdCBsaW1iCisJYmRuCUxvb3AJCSMgbG9vcCBiYWNrIHVudGlsIENUUiBpcyB6ZXJvCitMZW5kOglzdHUJNyw0KDkpCQkjIHN0b3JlIDI6bmQgbW9zdCBzaWduaWZpY2FudCBsaW1iCitMZW5kMjoJc3JlCTcsMCw2CQkjIGNvbXB1dGUgbW9zdCBzaWduaWZpY2FudCBsaW1iCisJc3QJNyw0KDkpCQkjIHN0b3JlIGl0CisJYnIKKworCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL3Bvd2VyL21waWgtc3ViMS5TIGIvbGliZ2NyeXB0LTEuNC42L21waS9wb3dlci9tcGloLXN1YjEuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjc0OGZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9wb3dlci9tcGloLXN1YjEuUwpAQCAtMCwwICsxLDg4IEBACisvKiBJQk0gUE9XRVIgc3ViX24gLS0gU3VidHJhY3QgdHdvIGxpbWIgdmVjdG9ycyBvZiBlcXVhbCwgbm9uLXplcm8gbGVuZ3RoLgorICoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk5LAorICogICAgICAgICAgICAgICAgICAgIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICovCisKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJhc20tc3ludGF4LmgiCisKKy8qCisjIElOUFVUIFBBUkFNRVRFUlMKKyMgcmVzX3B0cglyMworIyBzMV9wdHIJcjQKKyMgczJfcHRyCXI1CisjIHNpemUJCXI2CisgKi8KKworCS50b2MKKwkuZXh0ZXJuIF9nY3J5X21waWhfc3ViX25bRFNdCisJLmV4dGVybiAuX2djcnlfbXBpaF9zdWJfbgorLmNzZWN0IFtQUl0KKwkuYWxpZ24gMgorCS5nbG9ibCBfZ2NyeV9tcGloX3N1Yl9uCisJLmdsb2JsIC5fZ2NyeV9tcGloX3N1Yl9uCisJLmNzZWN0IF9nY3J5X21waWhfc3ViX25bRFNdCitfZ2NyeV9tcGloX3N1Yl9uOgorCS5sb25nIC5fZ2NyeV9tcGloX3N1Yl9uLCBUT0NbdGMwXSwgMAorCS5jc2VjdCBbUFJdCisuX2djcnlfbXBpaF9zdWJfbjoKKwlhbmRpbC4JMTAsNiwxCQkjIG9kZCBvciBldmVuIG51bWJlciBvZiBsaW1icz8KKwlsCTgsMCg0KQkJIyBsb2FkIGxlYXN0IHNpZ25pZmljYW50IHMxIGxpbWIKKwlsCTAsMCg1KQkJIyBsb2FkIGxlYXN0IHNpZ25pZmljYW50IHMyIGxpbWIKKwljYWwJMywtNCgzKSAJIyBvZmZzZXQgcmVzX3B0ciwgaXQncyB1cGRhdGVkIGJlZm9yZSBpdCdzIHVzZWQKKwlzcmkJMTAsNiwxCQkjIGNvdW50IGZvciB1bnJvbGxlZCBsb29wCisJc2YJNywwLDgJCSMgc3VidHJhY3QgbGVhc3Qgc2lnbmlmaWNhbnQgbGltYnMsIHNldCBjeQorCW10Y3RyCTEwCQkjIGNvcHkgY291bnQgaW50byBDVFIKKwliZXEJMCxMZXZlbiAJIyBicmFuY2ggaWYgZXZlbiAjIG9mIGxpbWJzICgjIG9mIGxpbWJzID49IDIpCisKKyMgV2UgaGF2ZSBhbiBvZGQgIyBvZiBsaW1icy4gIEFkZCB0aGUgZmlyc3QgbGltYnMgc2VwYXJhdGVseS4KKwljbXBpCTEsMTAsMAkJIyBpcyBjb3VudCBmb3IgdW5yb2xsZWQgbG9vcCB6ZXJvPworCWJuZQkxLEwxCQkjIGJyYW5jaCBpZiBub3QKKwlzdAk3LDQoMykKKwlzZmUJMywwLDAJCSMgbG9hZCAhY3kgaW50byAuLi4KKwlzZmkJMywzLDAJCSMgLi4uIHJldHVybiB2YWx1ZSByZWdpc3RlcgorCWJyCQkJIyByZXR1cm4KKworIyBXZSBhZGRlZCBsZWFzdCBzaWduaWZpY2FudCBsaW1icy4gIE5vdyByZWxvYWQgdGhlIG5leHQgbGltYnMgdG8gZW50ZXIgbG9vcC4KK0wxOglsdQk4LDQoNCkJCSMgbG9hZCBzMSBsaW1iIGFuZCB1cGRhdGUgczFfcHRyCisJbHUJMCw0KDUpCQkjIGxvYWQgczIgbGltYiBhbmQgdXBkYXRlIHMyX3B0cgorCXN0dQk3LDQoMykKKwlzZmUJNywwLDgJCSMgc3VidHJhY3QgbGltYnMsIHNldCBjeQorTGV2ZW46CWx1CTksNCg0KQkJIyBsb2FkIHMxIGxpbWIgYW5kIHVwZGF0ZSBzMV9wdHIKKwlsdQkxMCw0KDUpIAkjIGxvYWQgczIgbGltYiBhbmQgdXBkYXRlIHMyX3B0cgorCWJkeglMZW5kCQkjIElmIGRvbmUsIHNraXAgbG9vcAorCitMb29wOglsdQk4LDQoNCkJCSMgbG9hZCBzMSBsaW1iIGFuZCB1cGRhdGUgczFfcHRyCisJbHUJMCw0KDUpCQkjIGxvYWQgczIgbGltYiBhbmQgdXBkYXRlIHMyX3B0cgorCXNmZQkxMSwxMCw5IAkjIHN1YnRyYWN0IHByZXZpb3VzIGxpbWJzIHdpdGggY3ksIHNldCBjeQorCXN0dQk3LDQoMykJCSMKKwlsdQk5LDQoNCkJCSMgbG9hZCBzMSBsaW1iIGFuZCB1cGRhdGUgczFfcHRyCisJbHUJMTAsNCg1KSAJIyBsb2FkIHMyIGxpbWIgYW5kIHVwZGF0ZSBzMl9wdHIKKwlzZmUJNywwLDgJCSMgc3VidHJhY3QgcHJldmlvdXMgbGltYnMgd2l0aCBjeSwgc2V0IGN5CisJc3R1CTExLDQoMykgCSMKKwliZG4JTG9vcAkJIyBkZWNyZW1lbnQgQ1RSIGFuZCBsb29wIGJhY2sKKworTGVuZDoJc2ZlCTExLDEwLDkgCSMgc3VidHJhY3QgbGltYnMgd2l0aCBjeSwgc2V0IGN5CisJc3QJNyw0KDMpCQkjCisJc3QJMTEsOCgzKSAJIworCXNmZQkzLDAsMAkJIyBsb2FkICFjeSBpbnRvIC4uLgorCXNmaQkzLDMsMAkJIyAuLi4gcmV0dXJuIHZhbHVlIHJlZ2lzdGVyCisJYnIKKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9wb3dlcnBjMzIvTWFuaWZlc3QgYi9saWJnY3J5cHQtMS40LjYvbXBpL3Bvd2VycGMzMi9NYW5pZmVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmFiNmVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9wb3dlcnBjMzIvTWFuaWZlc3QKQEAgLTAsMCArMSwyOCBAQAorIyBNYW5pZmVzdCAtIGNoZWNrc3VtcyAKKyMgQ29weXJpZ2h0IDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyMKKyMgTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisKK21waWgtYWRkMS5TCittcGloLXN1YjEuUworbXBpaC1tdWwxLlMKK21waWgtbXVsMi5TCittcGloLW11bDMuUworbXBpaC1sc2hpZnQuUworbXBpaC1yc2hpZnQuUworc3ludGF4LmgKKyRuYW1lcyQgaVFDVkF3VUFQK0xtWXpFQW5wODMyUy83QVFJL2NRUCtNY2c5ckYvYy9iSlRZNDhQRTEvQVJ0N3ZDTXRwSWx2OWFsWlNTU3JVM1dIekN0djluVmN6Rm13SFUzRGRLRmF3aWdZMkRsalFjSzkyZFo1WmxPZnBGTk16NFBLbFZNV2FLRGsraktscW0yZHh2bEh1cUV2WFBwakZBRTJnSHJocTVxTFhTNVpIZU1MSklFSzg0R1lDNmZqZkxVTWRaVTNhbHRYVFVCdm9YaEE9PVlheCsKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvcG93ZXJwYzMyL2Rpc3RmaWxlcyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvcG93ZXJwYzMyL2Rpc3RmaWxlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDg2NjE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9wb3dlcnBjMzIvZGlzdGZpbGVzCkBAIC0wLDAgKzEsMTAgQEAKK01hbmlmZXN0CittcGloLWFkZDEuUworbXBpaC1zdWIxLlMKK21waWgtbXVsMS5TCittcGloLW11bDIuUworbXBpaC1tdWwzLlMKK21waWgtbHNoaWZ0LlMKK21waWgtcnNoaWZ0LlMKK3N5bnRheC5oCisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvcG93ZXJwYzMyL21waWgtYWRkMS5TIGIvbGliZ2NyeXB0LTEuNC42L21waS9wb3dlcnBjMzIvbXBpaC1hZGQxLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY2MWY1ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvcG93ZXJwYzMyL21waWgtYWRkMS5TCkBAIC0wLDAgKzEsMTM2IEBACisvKiBQb3dlclBDLTMyIGFkZF9uIC0tIEFkZCB0d28gbGltYiB2ZWN0b3JzIG9mIGVxdWFsLCBub24temVybyBsZW5ndGguCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk0LCAxOTk1LCAxOTk4LCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqLworCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAiYXNtLXN5bnRheC5oIgorCisKKyNpZm5kZWYgVVNFX1BQQ19QQVRDSEVTCisKKy8qKioqKioqKioqKioqKioqKioqCisgKiAgbXBpX2xpbWJfdAorICogIF9nY3J5X21waWhfYWRkX24oIG1waV9wdHJfdCByZXNfcHRyLAkocjMpCisgKgkJICAgbXBpX3B0cl90IHMxX3B0ciwJKHI0KQorICoJCSAgIG1waV9wdHJfdCBzMl9wdHIsCShyNSkKKyAqCQkgICBtcGlfc2l6ZV90IHNpemUpCShyNikKKyAqLworCisJLnRvYworCS5leHRlcm4gX2djcnlfbXBpaF9hZGRfbltEU10KKwkuZXh0ZXJuIC5fZ2NyeV9tcGloX2FkZF9uCisuY3NlY3QgW1BSXQorCS5hbGlnbiAyCisJLmdsb2JsIF9nY3J5X21waWhfYWRkX24KKwkuZ2xvYmwgLl9nY3J5X21waWhfYWRkX24KKwkuY3NlY3QgX2djcnlfbXBpaF9hZGRfbltEU10KK19nY3J5X21waWhfYWRkX246CisJLmxvbmcgLl9nY3J5X21waWhfYWRkX24sIFRPQ1t0YzBdLCAwCisJLmNzZWN0IFtQUl0KKy5fZ2NyeV9tcGloX2FkZF9uOgorCW10Y3RyCTYJCSMgY29weSBzaXplIGludG8gQ1RSCisJbHd6CTgsMCg0KQkJIyBsb2FkIGxlYXN0IHNpZ25pZmljYW50IHMxIGxpbWIKKwlsd3oJMCwwKDUpCQkjIGxvYWQgbGVhc3Qgc2lnbmlmaWNhbnQgczIgbGltYgorCWFkZGkJMywzLC00CQkjIG9mZnNldCByZXNfcHRyLCBpdCBpcyB1cGRhdGVkIGJlZm9yZSB1c2VkCisJYWRkYwk3LDAsOAkJIyBhZGQgbGVhc3Qgc2lnbmlmaWNhbnQgbGltYnMsIHNldCBjeQorCWJkeglMZW5kCQkjIElmIGRvbmUsIHNraXAgbG9vcAorTG9vcDoJbHd6dQk4LDQoNCkJCSMgbG9hZCBzMSBsaW1iIGFuZCB1cGRhdGUgczFfcHRyCisJbHd6dQkwLDQoNSkJCSMgbG9hZCBzMiBsaW1iIGFuZCB1cGRhdGUgczJfcHRyCisJc3R3dQk3LDQoMykJCSMgc3RvcmUgcHJldmlvdXMgbGltYiBpbiBsb2FkIGxhdGVuY3kgc2xvdAorCWFkZGUJNywwLDgJCSMgYWRkIG5ldyBsaW1icyB3aXRoIGN5LCBzZXQgY3kKKwliZG56CUxvb3AJCSMgZGVjcmVtZW50IENUUiBhbmQgbG9vcCBiYWNrCitMZW5kOglzdHcJNyw0KDMpCQkjIHN0b3JlIHVsdGltYXRlIHJlc3VsdCBsaW1iCisJbGkJMywwCQkjIGxvYWQgY3kgaW50byAuLi4KKwlhZGR6ZQkzLDMJCSMgLi4uIHJldHVybiB2YWx1ZSByZWdpc3RlcgorCWJscgorCisjZWxzZQorLyogQWRkIHR3byBsaW1iIHZlY3RvcnMgb2YgZXF1YWwsIG5vbi16ZXJvIGxlbmd0aCBmb3IgUG93ZXJQQy4KKyAgIENvcHlyaWdodCAoQykgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICAgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwKKyAgIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgkqLworCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAiYXNtLXN5bnRheC5oIgorCisKKy8qIG1wX2xpbWJfdCBtcG5fYWRkX24gKG1wX3B0ciByZXNfcHRyLCBtcF9zcmNwdHIgczFfcHRyLCBtcF9zcmNwdHIgczJfcHRyLAorCQkJbXBfc2l6ZV90IHNpemUpCisgICBDYWxjdWxhdGUgczErczIgYW5kIHB1dCByZXN1bHQgaW4gcmVzX3B0cjsgcmV0dXJuIGNhcnJ5LCAwIG9yIDEuICAqLworCisvKiBOb3RlIG9uIG9wdGltaXNhdGlvbjogVGhpcyBjb2RlIGlzIG9wdGltYWwgZm9yIHRoZSA2MDEuICBBbG1vc3QgZXZlcnkgb3RoZXIKKyAgIHBvc3NpYmxlIDItdW5yb2xsZWQgaW5uZXIgbG9vcCB3aWxsIG5vdCBiZS4JQWxzbywgd2F0Y2ggb3V0IGZvciB0aGUKKyAgIGFsaWdubWVudC4uLiAgKi8KKworRUFMSUdOKF9nY3J5X21waWhfYWRkX24sMywwKQorLyogU2V0IHVwIGZvciBsb29wIGJlbG93LiAgKi8KKyAgICAgICBtdGNyZiAweDAxLCVyNgorICAgICAgIHNyd2kuICVyNywlcjYsMQorICAgICAgIGxpICAgICVyMTAsMAorICAgICAgIG10Y3RyICVyNworICAgICAgIGJ0ICAgIDMxLDJmCisKKy8qIENsZWFyIHRoZSBjYXJyeS4gICovCisgICAgICAgYWRkaWMgJXIwLCVyMCwwCisvKiBBZGp1c3QgcG9pbnRlcnMgZm9yIGxvb3AuICAqLworICAgICAgIGFkZGkgICVyMywlcjMsLTQKKyAgICAgICBhZGRpICAlcjQsJXI0LC00CisgICAgICAgYWRkaSAgJXI1LCVyNSwtNAorICAgICAgIGIgICAgIDBmCisKKzI6ICAgICBsd3ogICVyNywwKCVyNSkKKyAgICAgICBsd3ogICVyNiwwKCVyNCkKKyAgICAgICBhZGRjICVyNiwlcjYsJXI3CisgICAgICAgc3R3ICAlcjYsMCglcjMpCisJYmVxICAxZgorCisvKiBUaGUgbG9vcC4gICovCisKKy8qIEFsaWduIHN0YXJ0IG9mIGxvb3AgdG8gYW4gb2RkIHdvcmQgYm91bmRhcnkgdG8gZ3VhcmFudGVlIHRoYXQgdGhlCisgICBsYXN0IHR3byB3b3JkcyBjYW4gYmUgZmV0Y2hlZCBpbiBvbmUgYWNjZXNzIChmb3IgNjAxKS4gICovCiswOiAgICAgbHd6ICAlcjksNCglcjQpCisgICAgICAgbHd6ICAlcjgsNCglcjUpCisgICAgICAgbHd6dSAlcjYsOCglcjQpCisgICAgICAgbHd6dSAlcjcsOCglcjUpCisgICAgICAgYWRkZSAlcjgsJXI5LCVyOAorICAgICAgIHN0dyAgJXI4LDQoJXIzKQorICAgICAgIGFkZGUgJXI2LCVyNiwlcjcKKyAgICAgICBzdHd1ICVyNiw4KCVyMykKKyAgICAgICBiZG56IDBiCisvKiBSZXR1cm4gdGhlIGNhcnJ5LiAgKi8KKzE6ICAgICBhZGR6ZSAlcjMsJXIxMAorICAgICAgIGJscgorRU5EKF9nY3J5X21waWhfYWRkX24pCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9wb3dlcnBjMzIvbXBpaC1sc2hpZnQuUyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvcG93ZXJwYzMyL21waWgtbHNoaWZ0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIzMTA5NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvcG93ZXJwYzMyL21waWgtbHNoaWZ0LlMKQEAgLTAsMCArMSwxOTggQEAKKy8qIFBvd2VyUEMtMzIgbHNoaWZ0CisgKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTgsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICovCisKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJhc20tc3ludGF4LmgiCisKKworI2lmbmRlZiBVU0VfUFBDX1BBVENIRVMKKworLyoqKioqKioqKioqKioqKioqKioKKyAqIG1waV9saW1iX3QKKyAqIF9nY3J5X21waWhfbHNoaWZ0KCBtcGlfcHRyX3Qgd3AsCShyMykKKyAqCQkgICBtcGlfcHRyX3QgdXAsCShyNCkKKyAqCQkgICBtcGlfc2l6ZV90IHVzaXplLAkocjUpCisgKgkJICAgdW5zaWduZWQgY250KQkocjYpCisgKi8KKworCS50b2MKKy5jc2VjdAkudGV4dFtQUl0KKwkuYWxpZ24JMgorCS5nbG9ibAlfZ2NyeV9tcGloX2xzaGlmdAorCS5nbG9ibAkuX2djcnlfbXBpaF9sc2hpZnQKKwkuY3NlY3QJX2djcnlfbXBpaF9sc2hpZnRbRFNdCitfZ2NyeV9tcGloX2xzaGlmdDoKKwkubG9uZwkuX2djcnlfbXBpaF9sc2hpZnQsICBUT0NbdGMwXSwJICAwCisJLmNzZWN0CS50ZXh0W1BSXQorLl9nY3J5X21waWhfbHNoaWZ0OgorCW10Y3RyCTUJCSMgY29weSBzaXplIGludG8gQ1RSCisJc2x3aQkwLDUsMgorCWFkZAk3LDMsMAkJIyBtYWtlIHI3IHBvaW50IGF0IGVuZCBvZiByZXMKKwlhZGQJNCw0LDAJCSMgbWFrZSByNCBwb2ludCBhdCBlbmQgb2YgczEKKwlzdWJmaWMJOCw2LDMyCisJbHd6dQkxMSwtNCg0KQkjIGxvYWQgZmlyc3QgczEgbGltYgorCXNydwkzLDExLDgJCSMgY29tcHV0ZSBmdW5jdGlvbiByZXR1cm4gdmFsdWUKKwliZHoJTGVuZDEKKworTG9vcDoJbHd6dQkxMCwtNCg0KQorCXNsdwk5LDExLDYKKwlzcncJMTIsMTAsOAorCW9yCTksOSwxMgorCXN0d3UJOSwtNCg3KQorCWJkeglMZW5kMgorCWx3enUJMTEsLTQoNCkKKwlzbHcJOSwxMCw2CisJc3J3CTEyLDExLDgKKwlvcgk5LDksMTIKKwlzdHd1CTksLTQoNykKKwliZG56CUxvb3AKKworTGVuZDE6CXNsdwkwLDExLDYKKwlzdHcJMCwtNCg3KQorCWJscgorCitMZW5kMjoJc2x3CTAsMTAsNgorCXN0dwkwLC00KDcpCisJYmxyCisKKyNlbHNlCisvKiBTaGlmdCBhIGxpbWIgbGVmdCwgbG93IGxldmVsIHJvdXRpbmUuCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAgIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsCisgICB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4JKi8KKworLyogbXBfbGltYl90IG1wbl9sc2hpZnQgKG1wX3B0ciB3cCwgbXBfc3JjcHRyIHVwLCBtcF9zaXplX3QgdXNpemUsCisJCQl1bnNpZ25lZCBpbnQgY250KSAgKi8KKworRUFMSUdOKF9nY3J5X21waWhfbHNoaWZ0LDMsMCkKKyAgICAgICBtdGN0ciAgICVyNQkgICAgICAgIyBjb3B5IHNpemUgaW50byBDVFIKKyAgICAgICBjbXBsd2kgICVjcjAsJXI1LDE2ICAgICAjIGlzIHNpemUgPCAxNgorICAgICAgIHNsd2kgICAgJXIwLCVyNSwyCisgICAgICAgYWRkICAgICAlcjcsJXIzLCVyMCAgICAgIyBtYWtlIHI3IHBvaW50IGF0IGVuZCBvZiByZXMKKyAgICAgICBhZGQgICAgICVyNCwlcjQsJXIwICAgICAjIG1ha2UgcjQgcG9pbnQgYXQgZW5kIG9mIHMxCisgICAgICAgbHd6dSAgICAlcjExLC00KCVyNCkgICAgIyBsb2FkIGZpcnN0IHMxIGxpbWIKKyAgICAgICBzdWJmaWMgICVyOCwlcjYsMzIKKyAgICAgICBzcncgICAgICVyMywlcjExLCVyOCAgICAjIGNvbXB1dGUgZnVuY3Rpb24gcmV0dXJuIHZhbHVlCisgICAgICAgYmdlICAgICAlY3IwLEwoYmlnKSAgICAgIyBicmFuY2ggaWYgc2l6ZSA+PSAxNgorCisgICAgICAgYmR6ICAgICBMKGVuZDEpCisKKzA6ICAgICBsd3p1ICAgICVyMTAsLTQoJXI0KQorICAgICAgIHNsdyAgICAgJXI5LCVyMTEsJXI2CisgICAgICAgc3J3ICAgICAlcjEyLCVyMTAsJXI4CisgICAgICAgb3IgICAgICAlcjksJXI5LCVyMTIKKyAgICAgICBzdHd1ICAgICVyOSwtNCglcjcpCisgICAgICAgYmR6ICAgICBMKGVuZDIpCisgICAgICAgbHd6dSAgICAlcjExLC00KCVyNCkKKyAgICAgICBzbHcgICAgICVyOSwlcjEwLCVyNgorICAgICAgIHNydyAgICAgJXIxMiwlcjExLCVyOAorICAgICAgIG9yICAgICAgJXI5LCVyOSwlcjEyCisgICAgICAgc3R3dSAgICAlcjksLTQoJXI3KQorICAgICAgIGJkbnogICAgMGIKKworTChlbmQxKTpzbHcgICAgJXIwLCVyMTEsJXI2CisgICAgICAgc3R3ICAgICAlcjAsLTQoJXI3KQorICAgICAgIGJscgorCisKKy8qIEd1YXJhbnRlZWQgbm90IHRvIHN1Y2NlZWQuICAqLworTChib29tKTogdHdlcQkgJXIwLCVyMAorCisvKiBXZSBpbWl0YXRlIGEgY2FzZSBzdGF0ZW1lbnQsIGJ5IHVzaW5nICh5dWshKSBmaXhlZC1sZW5ndGggY29kZSBjaHVua3MsCisgICBvZiBzaXplIDQqMTIgYnl0ZXMuCVdlIGhhdmUgdG8gZG8gdGhpcyAob3Igc29tZXRoaW5nKSB0byBtYWtlIHRoaXMgUElDLiAgKi8KK0woYmlnKTogICAgICAgIG1mbHIgICAgJXI5CisgICAgICAgYmx0bC0gICAlY3IwLEwoYm9vbSkgICAgIyBOZXZlciB0YWtlbiwgb25seSB1c2VkIHRvIHNldCBMUi4KKyAgICAgICBzbHdpICAgICVyMTAsJXI2LDQKKyAgICAgICBtZmxyICAgICVyMTIKKyAgICAgICBhZGQgICAgICVyMTAsJXIxMiwlcjEwCisgICAgICAgc2x3aSAgICAlcjgsJXI2LDUKKyAgICAgICBhZGQgICAgICVyMTAsJXI4LCVyMTAKKyAgICAgICBtdGN0ciAgICVyMTAKKyAgICAgICBhZGRpICAgICVyNSwlcjUsLTEKKyAgICAgICBtdGxyICAgICVyOQorICAgICAgIGJjdHIKKworTChlbmQyKTpzbHcgICAgJXIwLCVyMTAsJXI2CisgICAgICAgc3R3ICAgICAlcjAsLTQoJXI3KQorICAgICAgIGJscgorCisjZGVmaW5lIERPX0xTSElGVChuKSBcCisgICAgICAgbXRjdHIgICAlcjU7CQkJCQkJICAgICAgIFwKKzA6ICAgICBsd3p1ICAgICVyMTAsLTQoJXI0KTsJCQkJCSAgICAgICBcCisgICAgICAgc2x3aSAgICAlcjksJXIxMSxuOwkJCQkJICAgICAgIFwKKyAgICAgICBpbnNsd2kgICVyOSwlcjEwLG4sMzItbjsgCQkJCSAgICAgICBcCisgICAgICAgc3R3dSAgICAlcjksLTQoJXI3KTsJCQkJCSAgICAgICBcCisgICAgICAgYmR6LSAgICBMKGVuZDIpOyAJCQkJCSAgICAgICBcCisgICAgICAgbHd6dSAgICAlcjExLC00KCVyNCk7CQkJCQkgICAgICAgXAorICAgICAgIHNsd2kgICAgJXI5LCVyMTAsbjsJCQkJCSAgICAgICBcCisgICAgICAgaW5zbHdpICAlcjksJXIxMSxuLDMyLW47IAkJCQkgICAgICAgXAorICAgICAgIHN0d3UgICAgJXI5LC00KCVyNyk7CQkJCQkgICAgICAgXAorICAgICAgIGJkbnogICAgMGI7CQkJCQkJICAgICAgIFwKKyAgICAgICBiICAgICAgIEwoZW5kMSkKKworICAgICAgIERPX0xTSElGVCgxKQorICAgICAgIERPX0xTSElGVCgyKQorICAgICAgIERPX0xTSElGVCgzKQorICAgICAgIERPX0xTSElGVCg0KQorICAgICAgIERPX0xTSElGVCg1KQorICAgICAgIERPX0xTSElGVCg2KQorICAgICAgIERPX0xTSElGVCg3KQorICAgICAgIERPX0xTSElGVCg4KQorICAgICAgIERPX0xTSElGVCg5KQorICAgICAgIERPX0xTSElGVCgxMCkKKyAgICAgICBET19MU0hJRlQoMTEpCisgICAgICAgRE9fTFNISUZUKDEyKQorICAgICAgIERPX0xTSElGVCgxMykKKyAgICAgICBET19MU0hJRlQoMTQpCisgICAgICAgRE9fTFNISUZUKDE1KQorICAgICAgIERPX0xTSElGVCgxNikKKyAgICAgICBET19MU0hJRlQoMTcpCisgICAgICAgRE9fTFNISUZUKDE4KQorICAgICAgIERPX0xTSElGVCgxOSkKKyAgICAgICBET19MU0hJRlQoMjApCisgICAgICAgRE9fTFNISUZUKDIxKQorICAgICAgIERPX0xTSElGVCgyMikKKyAgICAgICBET19MU0hJRlQoMjMpCisgICAgICAgRE9fTFNISUZUKDI0KQorICAgICAgIERPX0xTSElGVCgyNSkKKyAgICAgICBET19MU0hJRlQoMjYpCisgICAgICAgRE9fTFNISUZUKDI3KQorICAgICAgIERPX0xTSElGVCgyOCkKKyAgICAgICBET19MU0hJRlQoMjkpCisgICAgICAgRE9fTFNISUZUKDMwKQorICAgICAgIERPX0xTSElGVCgzMSkKKworRU5EKF9nY3J5X21waWhfbHNoaWZ0KQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL3Bvd2VycGMzMi9tcGloLW11bDEuUyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvcG93ZXJwYzMyL21waWgtbXVsMS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNDE4ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL3Bvd2VycGMzMi9tcGloLW11bDEuUwpAQCAtMCwwICsxLDEyMCBAQAorLyogUG93ZXJQQy0zMiBtdWxfMSAtLSBNdWx0aXBseSBhIGxpbWIgdmVjdG9yIHdpdGggYSBsaW1iIGFuZCBzdG9yZQorICoJCSAgICAgICB0aGUgcmVzdWx0IGluIGEgc2Vjb25kIGxpbWIgdmVjdG9yLgorICoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LAorICogICAgICAgICAgICAgICAgICAgIDE5OTgsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICovCisKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJhc20tc3ludGF4LmgiCisKKworI2lmbmRlZiBVU0VfUFBDX1BBVENIRVMKKworLyoqKioqKioqKioqKioqKioqKioKKyAqIG1waV9saW1iX3QKKyAqIF9nY3J5X21waWhfbXVsXzEoIG1waV9wdHJfdCByZXNfcHRyLAkocjMpCisgKgkJICBtcGlfcHRyX3QgczFfcHRyLAkocjQpCisgKgkJICBtcGlfc2l6ZV90IHMxX3NpemUsCShyNSkKKyAqCQkgIG1waV9saW1iX3QgczJfbGltYikJKHI2KQorICoKKyAqIFRoaXMgaXMgYSBmYWlybHkgc3RyYWlnaHRmb3J3YXJkIGltcGxlbWVudGF0aW9uLiAgVGhlIHRpbWluZyBvZiB0aGUgUEM2MDEKKyAqIGlzIGhhcmQgdG8gdW5kZXJzdGFuZCwgc28gSSB3aWxsIHdhaXQgdG8gb3B0aW1pemUgdGhpcyB1bnRpbCBJIGhhdmUgc29tZQorICogaGFyZHdhcmUgdG8gcGxheSB3aXRoLgorICoKKyAqIFRoZSBjb2RlIHRyaXZpYWxseSBnZW5lcmFsaXplcyB0byA2NCBiaXQgbGltYnMgZm9yIHRoZSBQQzYyMC4KKyAqLworCisJLnRvYworCS5jc2VjdCAuX2djcnlfbXBpaF9tdWxfMVtQUl0KKwkuYWxpZ24gMgorCS5nbG9ibCBfZ2NyeV9tcGloX211bF8xCisJLmdsb2JsIC5fZ2NyeV9tcGloX211bF8xCisJLmNzZWN0IF9nY3J5X21waWhfbXVsXzFbRFNdCitfZ2NyeV9tcGloX211bF8xOgorCS5sb25nIC5fZ2NyeV9tcGloX211bF8xW1BSXSwgVE9DW3RjMF0sIDAKKwkuY3NlY3QgLl9nY3J5X21waWhfbXVsXzFbUFJdCisuX2djcnlfbXBpaF9tdWxfMToKKwltdGN0cgk1CisKKwlsd3oJMCwwKDQpCisJbXVsbHcJNywwLDYKKwltdWxod3UJMTAsMCw2CisJYWRkaQkzLDMsLTQJCSMgYWRqdXN0IHJlc19wdHIKKwlhZGRpYwk1LDUsMAkJIyBjbGVhciBjeSB3aXRoIGR1bW15IGluc24KKwliZHoJTGVuZAorCitMb29wOglsd3p1CTAsNCg0KQorCXN0d3UJNyw0KDMpCisJbXVsbHcJOCwwLDYKKwlhZGRlCTcsOCwxMAorCW11bGh3dQkxMCwwLDYKKwliZG56CUxvb3AKKworTGVuZDoJc3R3CTcsNCgzKQorCWFkZHplCTMsMTAKKwlibHIKKworI2Vsc2UKKy8qIE11bHRpcGx5IGEgbGltYiB2ZWN0b3IgYnkgYSBsaW1iLCBmb3IgUG93ZXJQQy4KKyAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICAgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwKKyAgIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgkqLworCisKKy8qIG1wX2xpbWJfdCBtcG5fbXVsXzEgKG1wX3B0ciByZXNfcHRyLCBtcF9zcmNwdHIgczFfcHRyLAorCQkJbXBfc2l6ZV90IHMxX3NpemUsIG1wX2xpbWJfdCBzMl9saW1iKQorICAgQ2FsY3VsYXRlIHMxKnMyIGFuZCBwdXQgcmVzdWx0IGluIHJlc19wdHI7IHJldHVybiBjYXJyeS4gICovCisKK0VOVFJZKF9nY3J5X21waWhfbXVsXzEpCisgICAgICAgbXRjdHIgICAlcjUKKworICAgICAgIGx3eiAgICAgJXIwLDAoJXI0KQorICAgICAgIG11bGx3ICAgJXI3LCVyMCwlcjYKKyAgICAgICBtdWxod3UgICVyMTAsJXIwLCVyNgorICAgICAgIGFkZGkgICAgJXIzLCVyMywtNAkgICAgICAgIyBhZGp1c3QgcmVzX3B0cgorICAgICAgIGFkZGljICAgJXI1LCVyNSwwCSAgICAgICAjIGNsZWFyIGN5IHdpdGggZHVtbXkgaW5zbgorICAgICAgIGJkeiAgICAgMWYKKworMDogICAgIGx3enUgICAgJXIwLDQoJXI0KQorICAgICAgIHN0d3UgICAgJXI3LDQoJXIzKQorICAgICAgIG11bGx3ICAgJXI4LCVyMCwlcjYKKyAgICAgICBhZGRlICAgICVyNywlcjgsJXIxMAorICAgICAgIG11bGh3dSAgJXIxMCwlcjAsJXI2CisgICAgICAgYmRueiAgICAwYgorCisxOiAgICAgc3R3ICAgICAlcjcsNCglcjMpCisgICAgICAgYWRkemUgICAlcjMsJXIxMAorICAgICAgIGJscgorRU5EKF9nY3J5X21waWhfbXVsXzEpCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvcG93ZXJwYzMyL21waWgtbXVsMi5TIGIvbGliZ2NyeXB0LTEuNC42L21waS9wb3dlcnBjMzIvbXBpaC1tdWwyLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ5N2I4MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvcG93ZXJwYzMyL21waWgtbXVsMi5TCkBAIC0wLDAgKzEsMTI3IEBACisvKiBQb3dlclBDLTMyIGFkZG11bF8xIC0tIE11bHRpcGx5IGEgbGltYiB2ZWN0b3Igd2l0aCBhIGxpbWIgYW5kIGFkZAorICoJCQkgIHRoZSByZXN1bHQgdG8gYSBzZWNvbmQgbGltYiB2ZWN0b3IuCisgKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTgsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICovCisKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJhc20tc3ludGF4LmgiCisKKworI2lmbmRlZiBVU0VfUFBDX1BBVENIRVMKKworLyoqKioqKioqKioqKioqKioqKioKKyAqIG1waV9saW1iX3QKKyAqIF9nY3J5X21waWhfYWRkbXVsXzEoIG1waV9wdHJfdCByZXNfcHRyLCAgICAgIChyMykKKyAqCQkgICAgIG1waV9wdHJfdCBzMV9wdHIsCSAgICAgKHI0KQorICoJCSAgICAgbXBpX3NpemVfdCBzMV9zaXplLCAgICAgKHI1KQorICoJCSAgICAgbXBpX2xpbWJfdCBzMl9saW1iKSAgICAgKHI2KQorICoKKyAqIFRoaXMgaXMgYSBmYWlybHkgc3RyYWlnaHRmb3J3YXJkIGltcGxlbWVudGF0aW9uLiAgVGhlIHRpbWluZyBvZiB0aGUgUEM2MDEKKyAqIGlzIGhhcmQgdG8gdW5kZXJzdGFuZCwgc28gSSB3aWxsIHdhaXQgdG8gb3B0aW1pemUgdGhpcyB1bnRpbCBJIGhhdmUgc29tZQorICogaGFyZHdhcmUgdG8gcGxheSB3aXRoLgorICoKKyAqIFRoZSBjb2RlIHRyaXZpYWxseSBnZW5lcmFsaXplcyB0byA2NCBiaXQgbGltYnMgZm9yIHRoZSBQQzYyMC4KKyAqLworCisKKwkudG9jCisJLmNzZWN0IC5fZ2NyeV9tcGloX2FkZG11bF8xW1BSXQorCS5hbGlnbiAyCisJLmdsb2JsIF9nY3J5X21waWhfYWRkbXVsXzEKKwkuZ2xvYmwgLl9nY3J5X21waWhfYWRkbXVsXzEKKwkuY3NlY3QgX2djcnlfbXBpaF9hZGRtdWxfMVtEU10KK19nY3J5X21waWhfYWRkbXVsXzE6CisJLmxvbmcgLl9nY3J5X21waWhfYWRkbXVsXzFbUFJdLCBUT0NbdGMwXSwgMAorCS5jc2VjdCAuX2djcnlfbXBpaF9hZGRtdWxfMVtQUl0KKy5fZ2NyeV9tcGloX2FkZG11bF8xOgorCW10Y3RyCTUKKworCWx3egkwLDAoNCkKKwltdWxsdwk3LDAsNgorCW11bGh3dQkxMCwwLDYKKwlsd3oJOSwwKDMpCisJYWRkYwk4LDcsOQorCWFkZGkJMywzLC00CisJYmR6CUxlbmQKKworTG9vcDoJbHd6dQkwLDQoNCkKKwlzdHd1CTgsNCgzKQorCW11bGx3CTgsMCw2CisJYWRkZQk3LDgsMTAKKwltdWxod3UJMTAsMCw2CisJbHd6CTksNCgzKQorCWFkZHplCTEwLDEwCisJYWRkYwk4LDcsOQorCWJkbnoJTG9vcAorCitMZW5kOglzdHcJOCw0KDMpCisJYWRkemUJMywxMAorCWJscgorCisjZWxzZQorLyogTXVsdGlwbHkgYSBsaW1iIHZlY3RvciBieSBhIHNpbmdsZSBsaW1iLCBmb3IgUG93ZXJQQy4KKyAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICAgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwKKyAgIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgkqLworCisKKy8qIG1wX2xpbWJfdCBtcG5fYWRkbXVsXzEgKG1wX3B0ciByZXNfcHRyLCBtcF9zcmNwdHIgczFfcHRyLAorCQkJICAgbXBfc2l6ZV90IHMxX3NpemUsIG1wX2xpbWJfdCBzMl9saW1iKQorICAgQ2FsY3VsYXRlIHJlcytzMSpzMiBhbmQgcHV0IHJlc3VsdCBiYWNrIGluIHJlczsgcmV0dXJuIGNhcnJ5LiAgKi8KK0VOVFJZKF9nY3J5X21waWhfYWRkbXVsXzEpCisgICAgICAgbXRjdHIgICAlcjUKKworICAgICAgIGx3eiAgICAgJXIwLDAoJXI0KQorICAgICAgIG11bGx3ICAgJXI3LCVyMCwlcjYKKyAgICAgICBtdWxod3UgICVyMTAsJXIwLCVyNgorICAgICAgIGx3eiAgICAgJXI5LDAoJXIzKQorICAgICAgIGFkZGMgICAgJXI4LCVyNywlcjkKKyAgICAgICBhZGRpICAgICVyMywlcjMsLTQJICAgICAgIC8qIGFkanVzdCByZXNfcHRyICovCisgICAgICAgYmR6ICAgICAxZgorCiswOiAgICAgbHd6dSAgICAlcjAsNCglcjQpCisgICAgICAgc3R3dSAgICAlcjgsNCglcjMpCisgICAgICAgbXVsbHcgICAlcjgsJXIwLCVyNgorICAgICAgIGFkZGUgICAgJXI3LCVyOCwlcjEwCisgICAgICAgbXVsaHd1ICAlcjEwLCVyMCwlcjYKKyAgICAgICBsd3ogICAgICVyOSw0KCVyMykKKyAgICAgICBhZGR6ZSAgICVyMTAsJXIxMAorICAgICAgIGFkZGMgICAgJXI4LCVyNywlcjkKKyAgICAgICBiZG56ICAgIDBiCisKKzE6ICAgICBzdHcgICAgICVyOCw0KCVyMykKKyAgICAgICBhZGR6ZSAgICVyMywlcjEwCisgICAgICAgYmxyCitFTkQoX2djcnlfbXBpaF9hZGRtdWxfMSkKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9wb3dlcnBjMzIvbXBpaC1tdWwzLlMgYi9saWJnY3J5cHQtMS40LjYvbXBpL3Bvd2VycGMzMi9tcGloLW11bDMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDEwZGJiCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9wb3dlcnBjMzIvbXBpaC1tdWwzLlMKQEAgLTAsMCArMSwxMzAgQEAKKy8qIFBvd2VyUEMtMzIgc3VibXVsXzEgLS0gTXVsdGlwbHkgYSBsaW1iIHZlY3RvciB3aXRoIGEgbGltYiBhbmQgc3VidHJhY3QKKyAqCQkJICB0aGUgcmVzdWx0IGZyb20gYSBzZWNvbmQgbGltYiB2ZWN0b3IuCisgKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTgsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICovCisKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJhc20tc3ludGF4LmgiCisKKworI2lmbmRlZiBVU0VfUFBDX1BBVENIRVMKKworLyoqKioqKioqKioqKioqKioqKioKKyAqIG1waV9saW1iX3QKKyAqIF9nY3J5X21waWhfc3VibXVsXzEoIG1waV9wdHJfdCByZXNfcHRyLCAgICAgIChyMykKKyAqCQkgICAgIG1waV9wdHJfdCBzMV9wdHIsCSAgICAgKHI0KQorICoJCSAgICAgbXBpX3NpemVfdCBzMV9zaXplLCAgICAgKHI1KQorICoJCSAgICAgbXBpX2xpbWJfdCBzMl9saW1iKSAgICAgKHI2KQorICoKKyAqIFRoaXMgaXMgYSBmYWlybHkgc3RyYWlnaHRmb3J3YXJkIGltcGxlbWVudGF0aW9uLiAgVGhlIHRpbWluZyBvZiB0aGUgUEM2MDEKKyAqIGlzIGhhcmQgdG8gdW5kZXJzdGFuZCwgc28gSSB3aWxsIHdhaXQgdG8gb3B0aW1pemUgdGhpcyB1bnRpbCBJIGhhdmUgc29tZQorICogaGFyZHdhcmUgdG8gcGxheSB3aXRoLgorICoKKyAqIFRoZSBjb2RlIHRyaXZpYWxseSBnZW5lcmFsaXplcyB0byA2NCBiaXQgbGltYnMgZm9yIHRoZSBQQzYyMC4KKyAqLworCisJLnRvYworCS5jc2VjdCAuX2djcnlfbXBpaF9zdWJtdWxfMVtQUl0KKwkuYWxpZ24gMgorCS5nbG9ibCBfZ2NyeV9tcGloX3N1Ym11bF8xCisJLmdsb2JsIC5fZ2NyeV9tcGloX3N1Ym11bF8xCisJLmNzZWN0IF9nY3J5X21waWhfc3VibXVsXzFbRFNdCitfZ2NyeV9tcGloX3N1Ym11bF8xOgorCS5sb25nIC5fZ2NyeV9tcGloX3N1Ym11bF8xW1BSXSwgVE9DW3RjMF0sIDAKKwkuY3NlY3QgLl9nY3J5X21waWhfc3VibXVsXzFbUFJdCisuX2djcnlfbXBpaF9zdWJtdWxfMToKKwltdGN0cgk1CisKKwlsd3oJMCwwKDQpCisJbXVsbHcJNywwLDYKKwltdWxod3UJMTAsMCw2CisJbHd6CTksMCgzKQorCXN1YmZjCTgsNyw5CisJYWRkYwk3LDcsOAkJIyBpbnZlcnQgY3kgKHI3IGlzIGp1bmspCisJYWRkaQkzLDMsLTQKKwliZHoJTGVuZAorCitMb29wOglsd3p1CTAsNCg0KQorCXN0d3UJOCw0KDMpCisJbXVsbHcJOCwwLDYKKwlhZGRlCTcsOCwxMAorCW11bGh3dQkxMCwwLDYKKwlsd3oJOSw0KDMpCisJYWRkemUJMTAsMTAKKwlzdWJmYwk4LDcsOQorCWFkZGMJNyw3LDgJCSMgaW52ZXJ0IGN5IChyNyBpcyBqdW5rKQorCWJkbnoJTG9vcAorCitMZW5kOglzdHcJOCw0KDMpCisJYWRkemUJMywxMAorCWJscgorCisjZWxzZQorLyogTXVsdGlwbHkgYSBsaW1iIHZlY3RvciBieSBhIHNpbmdsZSBsaW1iLCBmb3IgUG93ZXJQQy4KKyAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICAgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwKKyAgIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgkqLworCisvKiBtcF9saW1iX3QgbXBuX3N1Ym11bF8xIChtcF9wdHIgcmVzX3B0ciwgbXBfc3JjcHRyIHMxX3B0ciwKKwkJCSAgIG1wX3NpemVfdCBzMV9zaXplLCBtcF9saW1iX3QgczJfbGltYikKKyAgIENhbGN1bGF0ZSByZXMtczEqczIgYW5kIHB1dCByZXN1bHQgYmFjayBpbiByZXM7IHJldHVybiBjYXJyeS4gICovCisKK0VOVFJZKF9nY3J5X21waWhfc3VibXVsXzEpCisgICAgICAgbXRjdHIgICAlcjUKKworICAgICAgIGx3eiAgICAgJXIwLDAoJXI0KQorICAgICAgIG11bGx3ICAgJXI3LCVyMCwlcjYKKyAgICAgICBtdWxod3UgICVyMTAsJXIwLCVyNgorICAgICAgIGx3eiAgICAgJXI5LDAoJXIzKQorICAgICAgIHN1YmYgICAgJXI4LCVyNywlcjkKKyAgICAgICBhZGRjICAgICVyNywlcjcsJXI4CSAgICAgICAjIGludmVydCBjeSAocjcgaXMganVuaykKKyAgICAgICBhZGRpICAgICVyMywlcjMsLTQJICAgICAgICMgYWRqdXN0IHJlc19wdHIKKyAgICAgICBiZHogICAgIDFmCisKKzA6ICAgICBsd3p1ICAgICVyMCw0KCVyNCkKKyAgICAgICBzdHd1ICAgICVyOCw0KCVyMykKKyAgICAgICBtdWxsdyAgICVyOCwlcjAsJXI2CisgICAgICAgYWRkZSAgICAlcjcsJXI4LCVyMTAKKyAgICAgICBtdWxod3UgICVyMTAsJXIwLCVyNgorICAgICAgIGx3eiAgICAgJXI5LDQoJXIzKQorICAgICAgIGFkZHplICAgJXIxMCwlcjEwCisgICAgICAgc3ViZiAgICAlcjgsJXI3LCVyOQorICAgICAgIGFkZGMgICAgJXI3LCVyNywlcjgJICAgICAgICMgaW52ZXJ0IGN5IChyNyBpcyBqdW5rKQorICAgICAgIGJkbnogICAgMGIKKworMTogICAgIHN0dyAgICAgJXI4LDQoJXIzKQorICAgICAgIGFkZHplICAgJXIzLCVyMTAKKyAgICAgICBibHIKK0VORChfZ2NyeV9tcGloX3N1Ym11bF8xKQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL3Bvd2VycGMzMi9tcGloLXJzaGlmdC5TIGIvbGliZ2NyeXB0LTEuNC42L21waS9wb3dlcnBjMzIvbXBpaC1yc2hpZnQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODM0OWVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9wb3dlcnBjMzIvbXBpaC1yc2hpZnQuUwpAQCAtMCwwICsxLDEzMSBAQAorLyogUG93ZXJQQy0zMiByc2hpZnQKKyAqCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5OCwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKi8KKworCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAiYXNtLXN5bnRheC5oIgorCisKKyNpZm5kZWYgVVNFX1BQQ19QQVRDSEVTCisKKy8qKioqKioqKioqKioqKioqKioqCisgKiBtcGlfbGltYl90CisgKiBfZ2NyeV9tcGloX3JzaGlmdCggbXBpX3B0cl90IHdwLAkocjMpCisgKgkJICAgbXBpX3B0cl90IHVwLAkocjQpCisgKgkJICAgbXBpX3NpemVfdCB1c2l6ZSwJKHI1KQorICoJCSAgIHVuc2lnbmVkIGNudCkJKHI2KQorICovCisKKwkudG9jCisuY3NlY3QJLnRleHRbUFJdCisJLmFsaWduCTIKKwkuZ2xvYmwJX2djcnlfbXBpaF9yc2hpZnQKKwkuZ2xvYmwJLl9nY3J5X21waWhfcnNoaWZ0CisJLmNzZWN0CV9nY3J5X21waWhfcnNoaWZ0W0RTXQorX2djcnlfbXBpaF9yc2hpZnQ6CisJLmxvbmcJLl9nY3J5X21waWhfcnNoaWZ0LCAgVE9DW3RjMF0sCSAgMAorCS5jc2VjdAkudGV4dFtQUl0KKy5fZ2NyeV9tcGloX3JzaGlmdDoKKwltdGN0cgk1CQkjIGNvcHkgc2l6ZSBpbnRvIENUUgorCWFkZGkJNywzLC00CQkjIG1vdmUgYWRqdXN0ZWQgcmVzX3B0ciB0byBmcmVlIHJldHVybiByZWcKKwlzdWJmaWMJOCw2LDMyCisJbHd6CTExLDAoNCkgCSMgbG9hZCBmaXJzdCBzMSBsaW1iCisJc2x3CTMsMTEsOAkJIyBjb21wdXRlIGZ1bmN0aW9uIHJldHVybiB2YWx1ZQorCWJkeglMZW5kMQorCitMb29wOglsd3p1CTEwLDQoNCkKKwlzcncJOSwxMSw2CisJc2x3CTEyLDEwLDgKKwlvcgk5LDksMTIKKwlzdHd1CTksNCg3KQorCWJkeglMZW5kMgorCWx3enUJMTEsNCg0KQorCXNydwk5LDEwLDYKKwlzbHcJMTIsMTEsOAorCW9yCTksOSwxMgorCXN0d3UJOSw0KDcpCisJYmRueglMb29wCisKK0xlbmQxOglzcncJMCwxMSw2CisJc3R3CTAsNCg3KQorCWJscgorCitMZW5kMjoJc3J3CTAsMTAsNgorCXN0dwkwLDQoNykKKwlibHIKKworI2Vsc2UKKy8qIFNoaWZ0IGEgbGltYiByaWdodCwgbG93IGxldmVsIHJvdXRpbmUuCisgICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAgIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsCisgICB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4JKi8KKworCisvKiBJTlBVVCBQQVJBTUVURVJTCisgICByZXNfcHRyICAgICByMworICAgczFfcHRyICAgICAgcjQKKyAgIHNpemUgCSAgICAgICByNQorICAgY250CSAgICAgICByNiAgKi8KKworRU5UUlkoX2djcnlfbXBpaF9yc2hpZnQpCisgICAgICAgbXRjdHIgICA1CSAgICAgICAjIGNvcHkgc2l6ZSBpbnRvIENUUgorICAgICAgIGFkZGkgICAgNywzLC00CSAgICAgICAjIG1vdmUgYWRqdXN0ZWQgcmVzX3B0ciB0byBmcmVlIHJldHVybiByZWcKKyAgICAgICBzdWJmaWMgIDgsNiwzMgorICAgICAgIGx3eiAgICAgMTEsMCg0KQkgICAgICAgIyBsb2FkIGZpcnN0IHMxIGxpbWIKKyAgICAgICBzbHcgICAgIDMsMTEsOAkgICAgICAgIyBjb21wdXRlIGZ1bmN0aW9uIHJldHVybiB2YWx1ZQorICAgICAgIGJkeiAgICAgMWYKKworMDogICAgIGx3enUgICAgMTAsNCg0KQorICAgICAgIHNydyAgICAgOSwxMSw2CisgICAgICAgc2x3ICAgICAxMiwxMCw4CisgICAgICAgb3IgICAgICA5LDksMTIKKyAgICAgICBzdHd1ICAgIDksNCg3KQorICAgICAgIGJkeiAgICAgMmYKKyAgICAgICBsd3p1ICAgIDExLDQoNCkKKyAgICAgICBzcncgICAgIDksMTAsNgorICAgICAgIHNsdyAgICAgMTIsMTEsOAorICAgICAgIG9yICAgICAgOSw5LDEyCisgICAgICAgc3R3dSAgICA5LDQoNykKKyAgICAgICBiZG56ICAgIDBiCisKKzE6ICAgICBzcncgICAgIDAsMTEsNgorICAgICAgIHN0dyAgICAgMCw0KDcpCisgICAgICAgYmxyCisKKzI6ICAgICBzcncgICAgIDAsMTAsNgorICAgICAgIHN0dyAgICAgMCw0KDcpCisgICAgICAgYmxyCitFTkQoX2djcnlfbXBpaF9yc2hpZnQpCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvcG93ZXJwYzMyL21waWgtc3ViMS5TIGIvbGliZ2NyeXB0LTEuNC42L21waS9wb3dlcnBjMzIvbXBpaC1zdWIxLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYxMmVhOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvcG93ZXJwYzMyL21waWgtc3ViMS5TCkBAIC0wLDAgKzEsMTMzIEBACisvKiBQb3dlclBDLTMyICBzdWJfbiAtLSBTdWJ0cmFjdCB0d28gbGltYiB2ZWN0b3JzIG9mIHRoZSBzYW1lIGxlbmd0aCA+IDAKKyAqCQkJYW5kIHN0b3JlIGRpZmZlcmVuY2UgaW4gYSB0aGlyZCBsaW1iIHZlY3Rvci4KKyAqCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NCwgMTk5NSwgMTk5OCwKKyAqICAgICAgICAgICAgICAgICAgICAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqLworCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAiYXNtLXN5bnRheC5oIgorCisKKyNpZm5kZWYgVVNFX1BQQ19QQVRDSEVTCisKKy8qKioqKioqKioqKioqKioqKioqCisgKiAgbXBpX2xpbWJfdAorICogIF9nY3J5X21waWhfc3ViX24oIG1waV9wdHJfdCByZXNfcHRyLAkocjMpCisgKgkJICAgbXBpX3B0cl90IHMxX3B0ciwJKHI0KQorICoJCSAgIG1waV9wdHJfdCBzMl9wdHIsCShyNSkKKyAqCQkgICBtcGlfc2l6ZV90IHNpemUpCShyNikKKyAqLworCisJLnRvYworCS5leHRlcm4gX2djcnlfbXBpaF9zdWJfbltEU10KKwkuZXh0ZXJuIC5fZ2NyeV9tcGloX3N1Yl9uCisuY3NlY3QgW1BSXQorCS5hbGlnbiAyCisJLmdsb2JsIF9nY3J5X21waWhfc3ViX24KKwkuZ2xvYmwgLl9nY3J5X21waWhfc3ViX24KKwkuY3NlY3QgX2djcnlfbXBpaF9zdWJfbltEU10KK19nY3J5X21waWhfc3ViX246CisJLmxvbmcgLl9nY3J5X21waWhfc3ViX24sIFRPQ1t0YzBdLCAwCisJLmNzZWN0IFtQUl0KKy5fZ2NyeV9tcGloX3N1Yl9uOgorCW10Y3RyCTYJCSMgY29weSBzaXplIGludG8gQ1RSCisJbHd6CTgsMCg0KQkJIyBsb2FkIGxlYXN0IHNpZ25pZmljYW50IHMxIGxpbWIKKwlsd3oJMCwwKDUpCQkjIGxvYWQgbGVhc3Qgc2lnbmlmaWNhbnQgczIgbGltYgorCWFkZGkJMywzLC00CQkjIG9mZnNldCByZXNfcHRyLCBpdCBpcyB1cGRhdGVkIGJlZm9yZSB1c2VkCisJc3ViZmMJNywwLDgJCSMgYWRkIGxlYXN0IHNpZ25pZmljYW50IGxpbWJzLCBzZXQgY3kKKwliZHoJTGVuZAkJIyBJZiBkb25lLCBza2lwIGxvb3AKK0xvb3A6CWx3enUJOCw0KDQpCQkjIGxvYWQgczEgbGltYiBhbmQgdXBkYXRlIHMxX3B0cgorCWx3enUJMCw0KDUpCQkjIGxvYWQgczIgbGltYiBhbmQgdXBkYXRlIHMyX3B0cgorCXN0d3UJNyw0KDMpCQkjIHN0b3JlIHByZXZpb3VzIGxpbWIgaW4gbG9hZCBsYXRlbmN5IHNsb3QKKwlzdWJmZQk3LDAsOAkJIyBhZGQgbmV3IGxpbWJzIHdpdGggY3ksIHNldCBjeQorCWJkbnoJTG9vcAkJIyBkZWNyZW1lbnQgQ1RSIGFuZCBsb29wIGJhY2sKK0xlbmQ6CXN0dwk3LDQoMykJCSMgc3RvcmUgdWx0aW1hdGUgcmVzdWx0IGxpbWIKKwlzdWJmZQkzLDAsMAkJIyBsb2FkICFjeSBpbnRvIC4uLgorCXN1YmZpYwkzLDMsMAkJIyAuLi4gcmV0dXJuIHZhbHVlIHJlZ2lzdGVyCisJYmxyCisKKyNlbHNlCisvKiBTdWJ0cmFjdCB0d28gbGltYiB2ZWN0b3JzIG9mIGVxdWFsLCBub24temVybyBsZW5ndGggZm9yIFBvd2VyUEMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAgIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsCisgICB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4JKi8KKworLyogbXBfbGltYl90IG1wbl9zdWJfbiAobXBfcHRyIHJlc19wdHIsIG1wX3NyY3B0ciBzMV9wdHIsIG1wX3NyY3B0ciBzMl9wdHIsCisJCQltcF9zaXplX3Qgc2l6ZSkKKyAgIENhbGN1bGF0ZSBzMS1zMiBhbmQgcHV0IHJlc3VsdCBpbiByZXNfcHRyOyByZXR1cm4gYm9ycm93LCAwIG9yIDEuICAqLworCisvKiBOb3RlIG9uIG9wdGltaXNhdGlvbjogVGhpcyBjb2RlIGlzIG9wdGltYWwgZm9yIHRoZSA2MDEuICBBbG1vc3QgZXZlcnkgb3RoZXIKKyAgIHBvc3NpYmxlIDItdW5yb2xsZWQgaW5uZXIgbG9vcCB3aWxsIG5vdCBiZS4JQWxzbywgd2F0Y2ggb3V0IGZvciB0aGUKKyAgIGFsaWdubWVudC4uLiAgKi8KKworRUFMSUdOKF9nY3J5X21waWhfc3ViX24sMywxKQorLyogU2V0IHVwIGZvciBsb29wIGJlbG93LiAgKi8KKyAgICAgICBtdGNyZiAweDAxLCVyNgorICAgICAgIHNyd2kuICVyNywlcjYsMQorICAgICAgIG10Y3RyICVyNworICAgICAgIGJ0ICAgIDMxLDJmCisKKy8qIFNldCB0aGUgY2FycnkgKGNsZWFyIHRoZSBib3Jyb3cpLiAgKi8KKyAgICAgICBzdWJmYyAlcjAsJXIwLCVyMAorLyogQWRqdXN0IHBvaW50ZXJzIGZvciBsb29wLiAgKi8KKyAgICAgICBhZGRpICAlcjMsJXIzLC00CisgICAgICAgYWRkaSAgJXI0LCVyNCwtNAorICAgICAgIGFkZGkgICVyNSwlcjUsLTQKKyAgICAgICBiICAgICAwZgorCisyOiAgICAgbHd6ICAgJXI3LDAoJXI1KQorICAgICAgIGx3eiAgICVyNiwwKCVyNCkKKyAgICAgICBzdWJmYyAlcjYsJXI3LCVyNgorICAgICAgIHN0dyAgICVyNiwwKCVyMykKKwliZXEgICAxZgorCisvKiBBbGlnbiBzdGFydCBvZiBsb29wIHRvIGFuIG9kZCB3b3JkIGJvdW5kYXJ5IHRvIGd1YXJhbnRlZSB0aGF0IHRoZQorICAgbGFzdCB0d28gd29yZHMgY2FuIGJlIGZldGNoZWQgaW4gb25lIGFjY2VzcyAoZm9yIDYwMSkuICBUaGlzIHR1cm5zCisgICBvdXQgdG8gYmUgaW1wb3J0YW50LiAgKi8KKzA6CisgICAgICAgbHd6ICAgJXI5LDQoJXI0KQorICAgICAgIGx3eiAgICVyOCw0KCVyNSkKKyAgICAgICBsd3p1ICAlcjYsOCglcjQpCisgICAgICAgbHd6dSAgJXI3LDgoJXI1KQorICAgICAgIHN1YmZlICVyOCwlcjgsJXI5CisgICAgICAgc3R3ICAgJXI4LDQoJXIzKQorICAgICAgIHN1YmZlICVyNiwlcjcsJXI2CisgICAgICAgc3R3dSAgJXI2LDgoJXIzKQorICAgICAgIGJkbnogIDBiCisvKiBSZXR1cm4gdGhlIGJvcnJvdy4gKi8KKzE6ICAgICBzdWJmZSAlcjMsJXIzLCVyMworICAgICAgIG5lZyAgICVyMywlcjMKKyAgICAgICBibHIKK0VORChfZ2NyeV9tcGloX3N1Yl9uKQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL3Bvd2VycGMzMi9zeW50YXguaCBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvcG93ZXJwYzMyL3N5bnRheC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNGFmOWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL3Bvd2VycGMzMi9zeW50YXguaApAQCAtMCwwICsxLDc1IEBACisvKiBnbXAyLTIuMC4yLXBwYy9tcG4vcG93ZXJwYy1saW51eC9zeW50YXguaCAgIFR1ZSBPY3QJNiAxOToyNzowMSAxOTk4ICovCisvKiBGcm9tIGdsaWJjJ3Mgc3lzZGVwcy91bml4L3N5c3YvbGludXgvcG93ZXJwYy9zeXNkZXAuaCAqLworCisvKiBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAgIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsCisgICB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4JKi8KKworCisjZGVmaW5lIFVTRV9QUENfUEFUQ0hFUyAxCisKKy8qIFRoaXMgc2VlbXMgdG8gYWx3YXlzIGJlIHRoZSBjYXNlIG9uIFBQQy4gICovCisjZGVmaW5lIEFMSUdOQVJHKGxvZzIpIGxvZzIKKy8qIEZvciBFTEYgd2UgbmVlZCB0aGUgYC50eXBlJyBkaXJlY3RpdmUgdG8gbWFrZSBzaGFyZWQgbGlicyB3b3JrIHJpZ2h0LiAgKi8KKyNkZWZpbmUgQVNNX1RZUEVfRElSRUNUSVZFKG5hbWUsdHlwZWFyZykgLnR5cGUgbmFtZSx0eXBlYXJnOworI2RlZmluZSBBU01fU0laRV9ESVJFQ1RJVkUobmFtZSkgLnNpemUgbmFtZSwuLW5hbWUKKyNkZWZpbmUgQVNNX0dMT0JBTF9ESVJFQ1RJVkUgICAuZ2xvYmwKKworI2lmZGVmIF9fU1REQ19fCisjZGVmaW5lIENfTEFCRUwobmFtZSkgQ19TWU1CT0xfTkFNRShuYW1lKSMjOgorI2Vsc2UKKyNkZWZpbmUgQ19MQUJFTChuYW1lKSBDX1NZTUJPTF9OQU1FKG5hbWUpLyoqLzoKKyNlbmRpZgorCisjaWZkZWYgX19TVERDX18KKyNkZWZpbmUgTChib2R5KSAuTCMjYm9keQorI2Vsc2UKKyNkZWZpbmUgTChib2R5KSAuTC8qKi9ib2R5CisjZW5kaWYKKworLyogTm8gcHJvZmlsaW5nIG9mIGdtcCdzIGFzc2VtYmx5IGZvciBub3cuLi4gKi8KKyNkZWZpbmUgQ0FMTF9NQ09VTlQgLyogbm8gcHJvZmlsaW5nICovCisKKyNkZWZpbmUgICAgICAgIEVOVFJZKG5hbWUpCQkJCSAgICBcCisgIEFTTV9HTE9CQUxfRElSRUNUSVZFIENfU1lNQk9MX05BTUUobmFtZSk7CQkgICAgXAorICBBU01fVFlQRV9ESVJFQ1RJVkUgKENfU1lNQk9MX05BTUUobmFtZSksQGZ1bmN0aW9uKQkgICAgXAorICAuYWxpZ24gQUxJR05BUkcoMik7CQkJCQkgICAgXAorICBDX0xBQkVMKG5hbWUpIAkJCQkJICAgIFwKKyAgQ0FMTF9NQ09VTlQKKworI2RlZmluZSBFQUxJR05fV18wICAvKiBObyB3b3JkcyB0byBpbnNlcnQuICAqLworI2RlZmluZSBFQUxJR05fV18xICBub3AKKyNkZWZpbmUgRUFMSUdOX1dfMiAgbm9wO25vcAorI2RlZmluZSBFQUxJR05fV18zICBub3A7bm9wO25vcAorI2RlZmluZSBFQUxJR05fV180ICBFQUxJR05fV18zO25vcAorI2RlZmluZSBFQUxJR05fV181ICBFQUxJR05fV180O25vcAorI2RlZmluZSBFQUxJR05fV182ICBFQUxJR05fV181O25vcAorI2RlZmluZSBFQUxJR05fV183ICBFQUxJR05fV182O25vcAorCisvKiBFQUxJR04gaXMgbGlrZSBFTlRSWSwgYnV0IGRvZXMgYWxpZ25tZW50IHRvICd3b3JkcycqNCBieXRlcworICAgcGFzdCBhIDJeYWxpZ24gYm91bmRhcnkuICAqLworI2RlZmluZSBFQUxJR04obmFtZSwgYWxpZ250LCB3b3JkcykJCQlcCisgIEFTTV9HTE9CQUxfRElSRUNUSVZFIENfU1lNQk9MX05BTUUobmFtZSk7CQlcCisgIEFTTV9UWVBFX0RJUkVDVElWRSAoQ19TWU1CT0xfTkFNRShuYW1lKSxAZnVuY3Rpb24pCVwKKyAgLmFsaWduIEFMSUdOQVJHKGFsaWdudCk7CQkJCVwKKyAgRUFMSUdOX1dfIyN3b3JkczsJCQkJCVwKKyAgQ19MQUJFTChuYW1lKQorCisjdW5kZWYgRU5ECisjZGVmaW5lIEVORChuYW1lKQkJICAgICBcCisgIEFTTV9TSVpFX0RJUkVDVElWRShuYW1lKQorCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL3Bvd2VycGM2NC9kaXN0ZmlsZXMgYi9saWJnY3J5cHQtMS40LjYvbXBpL3Bvd2VycGM2NC9kaXN0ZmlsZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvcG93ZXJwYzY0L2Rpc3RmaWxlcwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9zcGFyYzMyL01hbmlmZXN0IGIvbGliZ2NyeXB0LTEuNC42L21waS9zcGFyYzMyL01hbmlmZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNzkyMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL3NwYXJjMzIvTWFuaWZlc3QKQEAgLTAsMCArMSwyNCBAQAorIyBNYW5pZmVzdCAtIGNoZWNrc3VtcyAKKyMgQ29weXJpZ2h0IDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyMKKyMgTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisKK21waWgtbHNoaWZ0LlMKK21waWgtcnNoaWZ0LlMKK21waWgtYWRkMS5TCit1ZGl2LlMKKyRuYW1lcyQgaVFDVkF3VUFQK0xtYURFQW5wODMyUy83QVFJU0hnUC9aNW9yVStDUEtCZVJGQ29nU1FEbTRwN0oyVnBEb3ZVNm10Zk1UZGpocVd1WkcwVTZ5OFdxSDBhajNVU2Z6aU9odGM4WWpRSFErOTdnMytFbklXWmdMakthY1dDNnBTY1kvUWJBVEVwRjFEMFdyY2VhNXJrM3FSMXQ3aXNkQlZWT3J4ZWRaNXZ1ajVPcDJ6eC8wT2xQSSt3dDZmVHRXODhCZEcvYTZ3L1pVLzg9PVB5NmgKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvc3BhcmMzMi9kaXN0ZmlsZXMgYi9saWJnY3J5cHQtMS40LjYvbXBpL3NwYXJjMzIvZGlzdGZpbGVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMGYxOGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL3NwYXJjMzIvZGlzdGZpbGVzCkBAIC0wLDAgKzEsNiBAQAorTWFuaWZlc3QKK21waWgtbHNoaWZ0LlMKK21waWgtcnNoaWZ0LlMKK21waWgtYWRkMS5TCit1ZGl2LlMKKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9zcGFyYzMyL21waWgtYWRkMS5TIGIvbGliZ2NyeXB0LTEuNC42L21waS9zcGFyYzMyL21waWgtYWRkMS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYTgwY2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL3NwYXJjMzIvbXBpaC1hZGQxLlMKQEAgLTAsMCArMSwyMzkgQEAKKy8qIFNQQVJDIF9hZGRfbiAtLSBBZGQgdHdvIGxpbWIgdmVjdG9ycyBvZiB0aGUgc2FtZSBsZW5ndGggPiAwIGFuZCBzdG9yZQorICoJCSAgIHN1bSBpbiBhIHRoaXJkIGxpbWIgdmVjdG9yLgorICoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk4LAorICogICAgICAgICAgICAgICAgICAgIDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICovCisKKworCisvKioqKioqKioqKioqKioqKioqKgorICogIG1waV9saW1iX3QKKyAqICBfZ2NyeV9tcGloX2FkZF9uKCBtcGlfcHRyX3QgcmVzX3B0ciwKKyAqCQkgICBtcGlfcHRyX3QgczFfcHRyLAorICoJCSAgIG1waV9wdHJfdCBzMl9wdHIsCisgKgkJICAgbXBpX3NpemVfdCBzaXplKQorICovCisKKyEgSU5QVVQgUEFSQU1FVEVSUworI2RlZmluZSByZXNfcHRyICVvMAorI2RlZmluZSBzMV9wdHIJJW8xCisjZGVmaW5lIHMyX3B0cgklbzIKKyNkZWZpbmUgc2l6ZQklbzMKKworI2luY2x1ZGUgInN5c2RlcC5oIgorCisJLnRleHQKKwkuYWxpZ24JNAorCS5nbG9iYWwgQ19TWU1CT0xfTkFNRShfZ2NyeV9tcGloX2FkZF9uKQorQ19TWU1CT0xfTkFNRShfZ2NyeV9tcGloX2FkZF9uKToKKwl4b3IJczJfcHRyLHJlc19wdHIsJWcxCisJYW5kY2MJJWcxLDQsJWcwCisJYm5lCUwxCQkJISBicmFuY2ggaWYgYWxpZ25tZW50IGRpZmZlcnMKKwlub3AKKyEgKiogIFYxYSAgKioKK0wwOglhbmRjYwlyZXNfcHRyLDQsJWcwCQkhIHJlc19wdHIgdW5hbGlnbmVkPyBTaWRlIGVmZmVjdDogY3k9MAorCWJlCUxfdjEJCQkhIGlmIG5vLCBicmFuY2gKKwlub3AKKy8qIEFkZCBsZWFzdCBzaWduaWZpY2FudCBsaW1iIHNlcGFyYXRlbHkgdG8gYWxpZ24gcmVzX3B0ciBhbmQgczJfcHRyICovCisJbGQJW3MxX3B0cl0sJWc0CisJYWRkCXMxX3B0ciw0LHMxX3B0cgorCWxkCVtzMl9wdHJdLCVnMgorCWFkZAlzMl9wdHIsNCxzMl9wdHIKKwlhZGQJc2l6ZSwtMSxzaXplCisJYWRkY2MJJWc0LCVnMiwlbzQKKwlzdAklbzQsW3Jlc19wdHJdCisJYWRkCXJlc19wdHIsNCxyZXNfcHRyCitMX3YxOglhZGR4CSVnMCwlZzAsJW80CQkhIHNhdmUgY3kgaW4gcmVnaXN0ZXIKKwljbXAJc2l6ZSwyCQkJISBpZiBzaXplIDwgMiAuLi4KKwlibAlMZW5kMgkJCSEgLi4uIGJyYW5jaCB0byB0YWlsIGNvZGUKKwlzdWJjYwklZzAsJW80LCVnMAkJISByZXN0b3JlIGN5CisKKwlsZAlbczFfcHRyKzBdLCVnNAorCWFkZGNjCXNpemUsLTEwLHNpemUKKwlsZAlbczFfcHRyKzRdLCVnMQorCWxkZAlbczJfcHRyKzBdLCVnMgorCWJsdAlMZmluMQorCXN1YmNjCSVnMCwlbzQsJWcwCQkhIHJlc3RvcmUgY3kKKy8qIEFkZCBibG9ja3Mgb2YgOCBsaW1icyB1bnRpbCBsZXNzIHRoYW4gOCBsaW1icyByZW1haW4gKi8KK0xvb3AxOglhZGR4Y2MJJWc0LCVnMiwlbzQKKwlsZAlbczFfcHRyKzhdLCVnNAorCWFkZHhjYwklZzEsJWczLCVvNQorCWxkCVtzMV9wdHIrMTJdLCVnMQorCWxkZAlbczJfcHRyKzhdLCVnMgorCXN0ZAklbzQsW3Jlc19wdHIrMF0KKwlhZGR4Y2MJJWc0LCVnMiwlbzQKKwlsZAlbczFfcHRyKzE2XSwlZzQKKwlhZGR4Y2MJJWcxLCVnMywlbzUKKwlsZAlbczFfcHRyKzIwXSwlZzEKKwlsZGQJW3MyX3B0cisxNl0sJWcyCisJc3RkCSVvNCxbcmVzX3B0cis4XQorCWFkZHhjYwklZzQsJWcyLCVvNAorCWxkCVtzMV9wdHIrMjRdLCVnNAorCWFkZHhjYwklZzEsJWczLCVvNQorCWxkCVtzMV9wdHIrMjhdLCVnMQorCWxkZAlbczJfcHRyKzI0XSwlZzIKKwlzdGQJJW80LFtyZXNfcHRyKzE2XQorCWFkZHhjYwklZzQsJWcyLCVvNAorCWxkCVtzMV9wdHIrMzJdLCVnNAorCWFkZHhjYwklZzEsJWczLCVvNQorCWxkCVtzMV9wdHIrMzZdLCVnMQorCWxkZAlbczJfcHRyKzMyXSwlZzIKKwlzdGQJJW80LFtyZXNfcHRyKzI0XQorCWFkZHgJJWcwLCVnMCwlbzQJCSEgc2F2ZSBjeSBpbiByZWdpc3RlcgorCWFkZGNjCXNpemUsLTgsc2l6ZQorCWFkZAlzMV9wdHIsMzIsczFfcHRyCisJYWRkCXMyX3B0ciwzMixzMl9wdHIKKwlhZGQJcmVzX3B0ciwzMixyZXNfcHRyCisJYmdlCUxvb3AxCisJc3ViY2MJJWcwLCVvNCwlZzAJCSEgcmVzdG9yZSBjeQorCitMZmluMToJYWRkY2MJc2l6ZSw4LTIsc2l6ZQorCWJsdAlMZW5kMQorCXN1YmNjCSVnMCwlbzQsJWcwCQkhIHJlc3RvcmUgY3kKKy8qIEFkZCBibG9ja3Mgb2YgMiBsaW1icyB1bnRpbCBsZXNzIHRoYW4gMiBsaW1icyByZW1haW4gKi8KK0xvb3BlMTogYWRkeGNjCSVnNCwlZzIsJW80CisJbGQJW3MxX3B0cis4XSwlZzQKKwlhZGR4Y2MJJWcxLCVnMywlbzUKKwlsZAlbczFfcHRyKzEyXSwlZzEKKwlsZGQJW3MyX3B0cis4XSwlZzIKKwlzdGQJJW80LFtyZXNfcHRyKzBdCisJYWRkeAklZzAsJWcwLCVvNAkJISBzYXZlIGN5IGluIHJlZ2lzdGVyCisJYWRkY2MJc2l6ZSwtMixzaXplCisJYWRkCXMxX3B0ciw4LHMxX3B0cgorCWFkZAlzMl9wdHIsOCxzMl9wdHIKKwlhZGQJcmVzX3B0ciw4LHJlc19wdHIKKwliZ2UJTG9vcGUxCisJc3ViY2MJJWcwLCVvNCwlZzAJCSEgcmVzdG9yZSBjeQorTGVuZDE6CWFkZHhjYwklZzQsJWcyLCVvNAorCWFkZHhjYwklZzEsJWczLCVvNQorCXN0ZAklbzQsW3Jlc19wdHIrMF0KKwlhZGR4CSVnMCwlZzAsJW80CQkhIHNhdmUgY3kgaW4gcmVnaXN0ZXIKKworCWFuZGNjCXNpemUsMSwlZzAKKwliZQlMcmV0MQorCXN1YmNjCSVnMCwlbzQsJWcwCQkhIHJlc3RvcmUgY3kKKy8qIEFkZCBsYXN0IGxpbWIgKi8KKwlsZAlbczFfcHRyKzhdLCVnNAorCWxkCVtzMl9wdHIrOF0sJWcyCisJYWRkeGNjCSVnNCwlZzIsJW80CisJc3QJJW80LFtyZXNfcHRyKzhdCisKK0xyZXQxOglyZXRsCisJYWRkeAklZzAsJWcwLCVvMAkhIHJldHVybiBjYXJyeS1vdXQgZnJvbSBtb3N0IHNpZ24uIGxpbWIKKworTDE6CXhvcglzMV9wdHIscmVzX3B0ciwlZzEKKwlhbmRjYwklZzEsNCwlZzAKKwlibmUJTDIKKwlub3AKKyEgKiogIFYxYiAgKioKKwltb3YJczJfcHRyLCVnMQorCW1vdglzMV9wdHIsczJfcHRyCisJYglMMAorCW1vdgklZzEsczFfcHRyCisKKyEgKiogIFYyICAqKgorLyogSWYgd2UgY29tZSBoZXJlLCB0aGUgYWxpZ25tZW50IG9mIHMxX3B0ciBhbmQgcmVzX3B0ciBhcyB3ZWxsIGFzIHRoZQorICAgYWxpZ25tZW50IG9mIHMyX3B0ciBhbmQgcmVzX3B0ciBkaWZmZXIuICBTaW5jZSB0aGVyZSBhcmUgb25seSB0d28gd2F5cworICAgdGhpbmdzIGNhbiBiZSBhbGlnbmVkICh0aGF0IHdlIGNhcmUgYWJvdXQpIHdlIG5vdyBrbm93IHRoYXQgdGhlIGFsaWdubWVudAorICAgb2YgczFfcHRyIGFuZCBzMl9wdHIgYXJlIHRoZSBzYW1lLiAgKi8KKworTDI6CWNtcAlzaXplLDEKKwliZQlMam9uZQorCW5vcAorCWFuZGNjCXMxX3B0ciw0LCVnMAkJISBzMV9wdHIgdW5hbGlnbmVkPyBTaWRlIGVmZmVjdDogY3k9MAorCWJlCUxfdjIJCQkhIGlmIG5vLCBicmFuY2gKKwlub3AKKy8qIEFkZCBsZWFzdCBzaWduaWZpY2FudCBsaW1iIHNlcGFyYXRlbHkgdG8gYWxpZ24gczFfcHRyIGFuZCBzMl9wdHIgKi8KKwlsZAlbczFfcHRyXSwlZzQKKwlhZGQJczFfcHRyLDQsczFfcHRyCisJbGQJW3MyX3B0cl0sJWcyCisJYWRkCXMyX3B0ciw0LHMyX3B0cgorCWFkZAlzaXplLC0xLHNpemUKKwlhZGRjYwklZzQsJWcyLCVvNAorCXN0CSVvNCxbcmVzX3B0cl0KKwlhZGQJcmVzX3B0ciw0LHJlc19wdHIKKworTF92MjoJYWRkeAklZzAsJWcwLCVvNAkJISBzYXZlIGN5IGluIHJlZ2lzdGVyCisJYWRkY2MJc2l6ZSwtOCxzaXplCisJYmx0CUxmaW4yCisJc3ViY2MJJWcwLCVvNCwlZzAJCSEgcmVzdG9yZSBjeQorLyogQWRkIGJsb2NrcyBvZiA4IGxpbWJzIHVudGlsIGxlc3MgdGhhbiA4IGxpbWJzIHJlbWFpbiAqLworTG9vcDI6CWxkZAlbczFfcHRyKzBdLCVnMgorCWxkZAlbczJfcHRyKzBdLCVvNAorCWFkZHhjYwklZzIsJW80LCVnMgorCXN0CSVnMixbcmVzX3B0ciswXQorCWFkZHhjYwklZzMsJW81LCVnMworCXN0CSVnMyxbcmVzX3B0cis0XQorCWxkZAlbczFfcHRyKzhdLCVnMgorCWxkZAlbczJfcHRyKzhdLCVvNAorCWFkZHhjYwklZzIsJW80LCVnMgorCXN0CSVnMixbcmVzX3B0cis4XQorCWFkZHhjYwklZzMsJW81LCVnMworCXN0CSVnMyxbcmVzX3B0cisxMl0KKwlsZGQJW3MxX3B0cisxNl0sJWcyCisJbGRkCVtzMl9wdHIrMTZdLCVvNAorCWFkZHhjYwklZzIsJW80LCVnMgorCXN0CSVnMixbcmVzX3B0cisxNl0KKwlhZGR4Y2MJJWczLCVvNSwlZzMKKwlzdAklZzMsW3Jlc19wdHIrMjBdCisJbGRkCVtzMV9wdHIrMjRdLCVnMgorCWxkZAlbczJfcHRyKzI0XSwlbzQKKwlhZGR4Y2MJJWcyLCVvNCwlZzIKKwlzdAklZzIsW3Jlc19wdHIrMjRdCisJYWRkeGNjCSVnMywlbzUsJWczCisJc3QJJWczLFtyZXNfcHRyKzI4XQorCWFkZHgJJWcwLCVnMCwlbzQJCSEgc2F2ZSBjeSBpbiByZWdpc3RlcgorCWFkZGNjCXNpemUsLTgsc2l6ZQorCWFkZAlzMV9wdHIsMzIsczFfcHRyCisJYWRkCXMyX3B0ciwzMixzMl9wdHIKKwlhZGQJcmVzX3B0ciwzMixyZXNfcHRyCisJYmdlCUxvb3AyCisJc3ViY2MJJWcwLCVvNCwlZzAJCSEgcmVzdG9yZSBjeQorCitMZmluMjoJYWRkY2MJc2l6ZSw4LTIsc2l6ZQorCWJsdAlMZW5kMgorCXN1YmNjCSVnMCwlbzQsJWcwCQkhIHJlc3RvcmUgY3kKK0xvb3BlMjogbGRkCVtzMV9wdHIrMF0sJWcyCisJbGRkCVtzMl9wdHIrMF0sJW80CisJYWRkeGNjCSVnMiwlbzQsJWcyCisJc3QJJWcyLFtyZXNfcHRyKzBdCisJYWRkeGNjCSVnMywlbzUsJWczCisJc3QJJWczLFtyZXNfcHRyKzRdCisJYWRkeAklZzAsJWcwLCVvNAkJISBzYXZlIGN5IGluIHJlZ2lzdGVyCisJYWRkY2MJc2l6ZSwtMixzaXplCisJYWRkCXMxX3B0ciw4LHMxX3B0cgorCWFkZAlzMl9wdHIsOCxzMl9wdHIKKwlhZGQJcmVzX3B0ciw4LHJlc19wdHIKKwliZ2UJTG9vcGUyCisJc3ViY2MJJWcwLCVvNCwlZzAJCSEgcmVzdG9yZSBjeQorTGVuZDI6CWFuZGNjCXNpemUsMSwlZzAKKwliZQlMcmV0MgorCXN1YmNjCSVnMCwlbzQsJWcwCQkhIHJlc3RvcmUgY3kKKy8qIEFkZCBsYXN0IGxpbWIgKi8KK0xqb25lOglsZAlbczFfcHRyXSwlZzQKKwlsZAlbczJfcHRyXSwlZzIKKwlhZGR4Y2MJJWc0LCVnMiwlbzQKKwlzdAklbzQsW3Jlc19wdHJdCisKK0xyZXQyOglyZXRsCisJYWRkeAklZzAsJWcwLCVvMAkhIHJldHVybiBjYXJyeS1vdXQgZnJvbSBtb3N0IHNpZ24uIGxpbWIKKworCisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvc3BhcmMzMi9tcGloLWxzaGlmdC5TIGIvbGliZ2NyeXB0LTEuNC42L21waS9zcGFyYzMyL21waWgtbHNoaWZ0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQyMmFiMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvc3BhcmMzMi9tcGloLWxzaGlmdC5TCkBAIC0wLDAgKzEsOTcgQEAKKy8qIHNwYXJjIGxzaGlmdAorICoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk4LAorICogICAgICAgICAgICAgICAgICAgIDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICovCisKKworISBJTlBVVCBQQVJBTUVURVJTCishIHJlc19wdHIJJW8wCishIHNyY19wdHIJJW8xCishIHNpemUJCSVvMgorISBjbnQJCSVvMworCisjaW5jbHVkZSAic3lzZGVwLmgiCisKKwkudGV4dAorCS5hbGlnbgk0CisJLmdsb2JhbCBDX1NZTUJPTF9OQU1FKF9nY3J5X21waWhfbHNoaWZ0KQorQ19TWU1CT0xfTkFNRShfZ2NyeV9tcGloX2xzaGlmdCk6CisJc2xsCSVvMiwyLCVnMQorCWFkZAklbzEsJWcxLCVvMQkhIG1ha2UgJW8xIHBvaW50IGF0IGVuZCBvZiBzcmMKKwlsZAlbJW8xLTRdLCVnMgkhIGxvYWQgZmlyc3QgbGltYgorCXN1YgklZzAsJW8zLCVvNQkhIG5lZ2F0ZSBzaGlmdCBjb3VudAorCWFkZAklbzAsJWcxLCVvMAkhIG1ha2UgJW8wIHBvaW50IGF0IGVuZCBvZiByZXMKKwlhZGQJJW8yLC0xLCVvMgorCWFuZGNjCSVvMiw0LTEsJWc0CSEgbnVtYmVyIG9mIGxpbWJzIGluIGZpcnN0IGxvb3AKKwlzcmwJJWcyLCVvNSwlZzEJISBjb21wdXRlIGZ1bmN0aW9uIHJlc3VsdAorCWJlCUwwCQkhIGlmIG11bHRpcGxlIG9mIDQgbGltYnMsIHNraXAgZmlyc3QgbG9vcAorCXN0CSVnMSxbJXNwKzgwXQorCisJc3ViCSVvMiwlZzQsJW8yCSEgYWRqdXN0IGNvdW50IGZvciBtYWluIGxvb3AKKworTG9vcDA6CWxkCVslbzEtOF0sJWczCisJYWRkCSVvMCwtNCwlbzAKKwlhZGQJJW8xLC00LCVvMQorCWFkZGNjCSVnNCwtMSwlZzQKKwlzbGwJJWcyLCVvMywlbzQKKwlzcmwJJWczLCVvNSwlZzEKKwltb3YJJWczLCVnMgorCW9yCSVvNCwlZzEsJW80CisJYm5lCUxvb3AwCisJIHN0CSVvNCxbJW8wKzBdCisKK0wwOgl0c3QJJW8yCisJYmUJTGVuZAorCSBub3AKKworTG9vcDoJbGQJWyVvMS04XSwlZzMKKwlhZGQJJW8wLC0xNiwlbzAKKwlhZGRjYwklbzIsLTQsJW8yCisJc2xsCSVnMiwlbzMsJW80CisJc3JsCSVnMywlbzUsJWcxCisKKwlsZAlbJW8xLTEyXSwlZzIKKwlzbGwJJWczLCVvMywlZzQKKwlvcgklbzQsJWcxLCVvNAorCXN0CSVvNCxbJW8wKzEyXQorCXNybAklZzIsJW81LCVnMQorCisJbGQJWyVvMS0xNl0sJWczCisJc2xsCSVnMiwlbzMsJW80CisJb3IJJWc0LCVnMSwlZzQKKwlzdAklZzQsWyVvMCs4XQorCXNybAklZzMsJW81LCVnMQorCisJbGQJWyVvMS0yMF0sJWcyCisJc2xsCSVnMywlbzMsJWc0CisJb3IJJW80LCVnMSwlbzQKKwlzdAklbzQsWyVvMCs0XQorCXNybAklZzIsJW81LCVnMQorCisJYWRkCSVvMSwtMTYsJW8xCisJb3IJJWc0LCVnMSwlZzQKKwlibmUJTG9vcAorCSBzdAklZzQsWyVvMCswXQorCitMZW5kOglzbGwJJWcyLCVvMywlZzIKKwlzdAklZzIsWyVvMC00XQorCXJldGwKKwlsZAlbJXNwKzgwXSwlbzAKKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9zcGFyYzMyL21waWgtcnNoaWZ0LlMgYi9saWJnY3J5cHQtMS40LjYvbXBpL3NwYXJjMzIvbXBpaC1yc2hpZnQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDNkYjQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9zcGFyYzMyL21waWgtcnNoaWZ0LlMKQEAgLTAsMCArMSw5MyBAQAorLyogc3BhcmMgcnNoaWZ0CisgKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTgsCisgKiAgICAgICAgICAgICAgICAgICAgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKi8KKworISBJTlBVVCBQQVJBTUVURVJTCishIHJlc19wdHIJJW8wCishIHNyY19wdHIJJW8xCishIHNpemUJCSVvMgorISBjbnQJCSVvMworCisjaW5jbHVkZSAic3lzZGVwLmgiCisKKwkudGV4dAorCS5hbGlnbgk0CisJLmdsb2JhbCBDX1NZTUJPTF9OQU1FKF9nY3J5X21waWhfcnNoaWZ0KQorQ19TWU1CT0xfTkFNRShfZ2NyeV9tcGloX3JzaGlmdCk6CisJbGQJWyVvMV0sJWcyCSEgbG9hZCBmaXJzdCBsaW1iCisJc3ViCSVnMCwlbzMsJW81CSEgbmVnYXRlIHNoaWZ0IGNvdW50CisJYWRkCSVvMiwtMSwlbzIKKwlhbmRjYwklbzIsNC0xLCVnNAkhIG51bWJlciBvZiBsaW1icyBpbiBmaXJzdCBsb29wCisJc2xsCSVnMiwlbzUsJWcxCSEgY29tcHV0ZSBmdW5jdGlvbiByZXN1bHQKKwliZQlMMAkJISBpZiBtdWx0aXBsZSBvZiA0IGxpbWJzLCBza2lwIGZpcnN0IGxvb3AKKwlzdAklZzEsWyVzcCs4MF0KKworCXN1YgklbzIsJWc0LCVvMgkhIGFkanVzdCBjb3VudCBmb3IgbWFpbiBsb29wCisKK0xvb3AwOglsZAlbJW8xKzRdLCVnMworCWFkZAklbzAsNCwlbzAKKwlhZGQJJW8xLDQsJW8xCisJYWRkY2MJJWc0LC0xLCVnNAorCXNybAklZzIsJW8zLCVvNAorCXNsbAklZzMsJW81LCVnMQorCW1vdgklZzMsJWcyCisJb3IJJW80LCVnMSwlbzQKKwlibmUJTG9vcDAKKwkgc3QJJW80LFslbzAtNF0KKworTDA6CXRzdAklbzIKKwliZQlMZW5kCisJIG5vcAorCitMb29wOglsZAlbJW8xKzRdLCVnMworCWFkZAklbzAsMTYsJW8wCisJYWRkY2MJJW8yLC00LCVvMgorCXNybAklZzIsJW8zLCVvNAorCXNsbAklZzMsJW81LCVnMQorCisJbGQJWyVvMSs4XSwlZzIKKwlzcmwJJWczLCVvMywlZzQKKwlvcgklbzQsJWcxLCVvNAorCXN0CSVvNCxbJW8wLTE2XQorCXNsbAklZzIsJW81LCVnMQorCisJbGQJWyVvMSsxMl0sJWczCisJc3JsCSVnMiwlbzMsJW80CisJb3IJJWc0LCVnMSwlZzQKKwlzdAklZzQsWyVvMC0xMl0KKwlzbGwJJWczLCVvNSwlZzEKKworCWxkCVslbzErMTZdLCVnMgorCXNybAklZzMsJW8zLCVnNAorCW9yCSVvNCwlZzEsJW80CisJc3QJJW80LFslbzAtOF0KKwlzbGwJJWcyLCVvNSwlZzEKKworCWFkZAklbzEsMTYsJW8xCisJb3IJJWc0LCVnMSwlZzQKKwlibmUJTG9vcAorCSBzdAklZzQsWyVvMC00XQorCitMZW5kOglzcmwJJWcyLCVvMywlZzIKKwlzdAklZzIsWyVvMC0wXQorCXJldGwKKwlsZAlbJXNwKzgwXSwlbzAKKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9zcGFyYzMyL3VkaXYuUyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvc3BhcmMzMi91ZGl2LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA2YjVjMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvc3BhcmMzMi91ZGl2LlMKQEAgLTAsMCArMSwxOTUgQEAKKy8qIFNQQVJDIHY3IF9fdWRpdl9xcm5uZCBkaXZpc2lvbiBzdXBwb3J0LCB1c2VkIGZyb20gbG9uZ2xvbmcuaC4KKyAqICAgICAgICAgICBUaGlzIGlzIGZvciB2NyBDUFVzIHdpdGhvdXQgYSBmbG9hdGluZy1wb2ludCB1bml0LgorICoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk2LCAxOTk4LAorICogICAgICAgICAgICAgICAgICAgIDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKiAgICAgICAKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqCisgKiBOb3RlOiBUaGlzIGNvZGUgaXMgaGVhdmlseSBiYXNlZCBvbiB0aGUgR05VIE1QIExpYnJhcnkuCisgKgkgQWN0dWFsbHkgaXQncyB0aGUgc2FtZSBjb2RlIHdpdGggb25seSBtaW5vciBjaGFuZ2VzIGluIHRoZQorICoJIHdheSB0aGUgZGF0YSBpcyBzdG9yZWQ7IHRoaXMgaXMgdG8gc3VwcG9ydCB0aGUgYWJzdHJhY3Rpb24KKyAqCSBvZiBhbiBvcHRpb25hbCBzZWN1cmUgbWVtb3J5IGFsbG9jYXRpb24gd2hpY2ggbWF5IGJlIHVzZWQKKyAqCSB0byBhdm9pZCByZXZlYWxpbmcgb2Ygc2Vuc2l0aXZlIGRhdGEgZHVlIHRvIHBhZ2luZyBldGMuCisgKi8KKworCishIElOUFVUIFBBUkFNRVRFUlMKKyEgcmVtX3B0cglvMAorISBuMQkJbzEKKyEgbjAJCW8yCishIGQJCW8zCisKKyNpbmNsdWRlICJzeXNkZXAuaCIKKworCS50ZXh0CisJLmFsaWduIDQKKwkuZ2xvYmFsIENfU1lNQk9MX05BTUUoX191ZGl2X3Fybm5kKQorQ19TWU1CT0xfTkFNRShfX3VkaXZfcXJubmQpOgorCXRzdAklbzMKKwlibmVnCUxhcmdlZGl2aXNvcgorCW1vdgk4LCVnMQorCisJYglMcDEKKwlhZGR4Y2MJJW8yLCVvMiwlbzIKKworTHBsb3A6CWJjYwlMbjEKKwlhZGR4Y2MJJW8yLCVvMiwlbzIKK0xwMToJYWRkeAklbzEsJW8xLCVvMQorCXN1YmNjCSVvMSwlbzMsJW80CisJYmNjCUxuMgorCWFkZHhjYwklbzIsJW8yLCVvMgorTHAyOglhZGR4CSVvMSwlbzEsJW8xCisJc3ViY2MJJW8xLCVvMywlbzQKKwliY2MJTG4zCisJYWRkeGNjCSVvMiwlbzIsJW8yCitMcDM6CWFkZHgJJW8xLCVvMSwlbzEKKwlzdWJjYwklbzEsJW8zLCVvNAorCWJjYwlMbjQKKwlhZGR4Y2MJJW8yLCVvMiwlbzIKK0xwNDoJYWRkeAklbzEsJW8xLCVvMQorCWFkZGNjCSVnMSwtMSwlZzEKKwlibmUJTHBsb3AKKwlzdWJjYwklbzEsJW8zLCVvNAorCWJjYwlMbjUKKwlhZGR4Y2MJJW8yLCVvMiwlbzIKK0xwNToJc3QJJW8xLFslbzBdCisJcmV0bAorCXhub3IJJWcwLCVvMiwlbzAKKworTG5sb3A6CWJjYwlMcDEKKwlhZGR4Y2MJJW8yLCVvMiwlbzIKK0xuMToJYWRkeAklbzQsJW80LCVvNAorCXN1YmNjCSVvNCwlbzMsJW8xCisJYmNjCUxwMgorCWFkZHhjYwklbzIsJW8yLCVvMgorTG4yOglhZGR4CSVvNCwlbzQsJW80CisJc3ViY2MJJW80LCVvMywlbzEKKwliY2MJTHAzCisJYWRkeGNjCSVvMiwlbzIsJW8yCitMbjM6CWFkZHgJJW80LCVvNCwlbzQKKwlzdWJjYwklbzQsJW8zLCVvMQorCWJjYwlMcDQKKwlhZGR4Y2MJJW8yLCVvMiwlbzIKK0xuNDoJYWRkeAklbzQsJW80LCVvNAorCWFkZGNjCSVnMSwtMSwlZzEKKwlibmUJTG5sb3AKKwlzdWJjYwklbzQsJW8zLCVvMQorCWJjYwlMcDUKKwlhZGR4Y2MJJW8yLCVvMiwlbzIKK0xuNToJc3QJJW80LFslbzBdCisJcmV0bAorCXhub3IJJWcwLCVvMiwlbzAKKworTGFyZ2VkaXZpc29yOgorCWFuZAklbzIsMSwlbzUJISAlbzUgPSBuMCAmIDEKKworCXNybAklbzIsMSwlbzIKKwlzbGwJJW8xLDMxLCVnMgorCW9yCSVnMiwlbzIsJW8yCSEgJW8yID0gbG8objFuMCA+PiAxKQorCXNybAklbzEsMSwlbzEJISAlbzEgPSBoaShuMW4wID4+IDEpCisKKwlhbmQJJW8zLDEsJWcyCisJc3JsCSVvMywxLCVnMwkhICVnMyA9IGZsb29yKGQgLyAyKQorCWFkZAklZzMsJWcyLCVnMwkhICVnMyA9IGNlaWwoZCAvIDIpCisKKwliCUxMcDEKKwlhZGR4Y2MJJW8yLCVvMiwlbzIKKworTExwbG9wOiBiY2MJTExuMQorCWFkZHhjYwklbzIsJW8yLCVvMgorTExwMToJYWRkeAklbzEsJW8xLCVvMQorCXN1YmNjCSVvMSwlZzMsJW80CisJYmNjCUxMbjIKKwlhZGR4Y2MJJW8yLCVvMiwlbzIKK0xMcDI6CWFkZHgJJW8xLCVvMSwlbzEKKwlzdWJjYwklbzEsJWczLCVvNAorCWJjYwlMTG4zCisJYWRkeGNjCSVvMiwlbzIsJW8yCitMTHAzOglhZGR4CSVvMSwlbzEsJW8xCisJc3ViY2MJJW8xLCVnMywlbzQKKwliY2MJTExuNAorCWFkZHhjYwklbzIsJW8yLCVvMgorTExwNDoJYWRkeAklbzEsJW8xLCVvMQorCWFkZGNjCSVnMSwtMSwlZzEKKwlibmUJTExwbG9wCisJc3ViY2MJJW8xLCVnMywlbzQKKwliY2MJTExuNQorCWFkZHhjYwklbzIsJW8yLCVvMgorTExwNToJYWRkCSVvMSwlbzEsJW8xCSEgPDwgMQorCXRzdAklZzIKKwlibmUJT2RkcAorCWFkZAklbzUsJW8xLCVvMQorCXN0CSVvMSxbJW8wXQorCXJldGwKKwl4bm9yCSVnMCwlbzIsJW8wCisKK0xMbmxvcDogYmNjCUxMcDEKKwlhZGR4Y2MJJW8yLCVvMiwlbzIKK0xMbjE6CWFkZHgJJW80LCVvNCwlbzQKKwlzdWJjYwklbzQsJWczLCVvMQorCWJjYwlMTHAyCisJYWRkeGNjCSVvMiwlbzIsJW8yCitMTG4yOglhZGR4CSVvNCwlbzQsJW80CisJc3ViY2MJJW80LCVnMywlbzEKKwliY2MJTExwMworCWFkZHhjYwklbzIsJW8yLCVvMgorTExuMzoJYWRkeAklbzQsJW80LCVvNAorCXN1YmNjCSVvNCwlZzMsJW8xCisJYmNjCUxMcDQKKwlhZGR4Y2MJJW8yLCVvMiwlbzIKK0xMbjQ6CWFkZHgJJW80LCVvNCwlbzQKKwlhZGRjYwklZzEsLTEsJWcxCisJYm5lCUxMbmxvcAorCXN1YmNjCSVvNCwlZzMsJW8xCisJYmNjCUxMcDUKKwlhZGR4Y2MJJW8yLCVvMiwlbzIKK0xMbjU6CWFkZAklbzQsJW80LCVvNAkhIDw8IDEKKwl0c3QJJWcyCisJYm5lCU9kZG4KKwlhZGQJJW81LCVvNCwlbzQKKwlzdAklbzQsWyVvMF0KKwlyZXRsCisJeG5vcgklZzAsJW8yLCVvMAorCitPZGRwOgl4bm9yCSVnMCwlbzIsJW8yCisJISBxJyBpbiAlbzIuIHInIGluICVvMQorCWFkZGNjCSVvMSwlbzIsJW8xCisJYmNjCUxMcDYKKwlhZGR4CSVvMiwwLCVvMgorCXN1YgklbzEsJW8zLCVvMQorTExwNjoJc3ViY2MJJW8xLCVvMywlZzAKKwliY3MJTExwNworCXN1YngJJW8yLC0xLCVvMgorCXN1YgklbzEsJW8zLCVvMQorTExwNzoJc3QJJW8xLFslbzBdCisJcmV0bAorCW1vdgklbzIsJW8wCisKK09kZG46CXhub3IJJWcwLCVvMiwlbzIKKwkhIHEnIGluICVvMi4gcicgaW4gJW80CisJYWRkY2MJJW80LCVvMiwlbzQKKwliY2MJTExuNgorCWFkZHgJJW8yLDAsJW8yCisJc3ViCSVvNCwlbzMsJW80CitMTG42OglzdWJjYwklbzQsJW8zLCVnMAorCWJjcwlMTG43CisJc3VieAklbzIsLTEsJW8yCisJc3ViCSVvNCwlbzMsJW80CitMTG43OglzdAklbzQsWyVvMF0KKwlyZXRsCisJbW92CSVvMiwlbzAKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvc3BhcmMzMnY4L01hbmlmZXN0IGIvbGliZ2NyeXB0LTEuNC42L21waS9zcGFyYzMydjgvTWFuaWZlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMxY2U2YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvc3BhcmMzMnY4L01hbmlmZXN0CkBAIC0wLDAgKzEsMjMgQEAKKyMgTWFuaWZlc3QgLSBjaGVja3N1bXMgCisjIENvcHlyaWdodCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisjCisjIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorCittcGloLW11bDEuUworbXBpaC1tdWwyLlMKK21waWgtbXVsMy5TCiskbmFtZXMkIGlRQ1ZBd1VBUCtMbWJqRUFucDgzMlMvN0FRS1EyZ1FBb3RwQ3BZOXJPSlVDZFpIYkRMWFhCOWkxVVVNcmFSS2JWV2ltdEtxNDkzWTJkMndjcVhDSzJXYUdzMUFlUEszSzZRazZtc3haMFBMNUhvN0tnSE1renNaK3dHMEVVemlpdVgweVpSVFdObTByM1RZZXJQNlNkV0g1R09WZFNYbjdja2twcGsyc1ZPb2tmUVR5K1Rtcm5haDMrZGxZSm91amFuK2ZtWFdONlVzPT1Eb2xNCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL3NwYXJjMzJ2OC9kaXN0ZmlsZXMgYi9saWJnY3J5cHQtMS40LjYvbXBpL3NwYXJjMzJ2OC9kaXN0ZmlsZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU5YTUzMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvc3BhcmMzMnY4L2Rpc3RmaWxlcwpAQCAtMCwwICsxLDUgQEAKK01hbmlmZXN0CittcGloLW11bDEuUworbXBpaC1tdWwyLlMKK21waWgtbXVsMy5TCisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvc3BhcmMzMnY4L21waWgtbXVsMS5TIGIvbGliZ2NyeXB0LTEuNC42L21waS9zcGFyYzMydjgvbXBpaC1tdWwxLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNmY2RkYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvc3BhcmMzMnY4L21waWgtbXVsMS5TCkBAIC0wLDAgKzEsMTA5IEBACisvKiBTUEFSQyB2OCBfX21wbl9tdWxfMSAtLSBNdWx0aXBseSBhIGxpbWIgdmVjdG9yIHdpdGggYSBzaW5nbGUgbGltYiBhbmQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlIHRoZSBwcm9kdWN0IGluIGEgc2Vjb25kIGxpbWIgdmVjdG9yLgorICoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk0LCAxOTk1LCAxOTk4LAorICogICAgICAgICAgICAgICAgICAgIDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKiAgICAgICAKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqCisgKiBOb3RlOiBUaGlzIGNvZGUgaXMgaGVhdmlseSBiYXNlZCBvbiB0aGUgR05VIE1QIExpYnJhcnkuCisgKgkgQWN0dWFsbHkgaXQncyB0aGUgc2FtZSBjb2RlIHdpdGggb25seSBtaW5vciBjaGFuZ2VzIGluIHRoZQorICoJIHdheSB0aGUgZGF0YSBpcyBzdG9yZWQ7IHRoaXMgaXMgdG8gc3VwcG9ydCB0aGUgYWJzdHJhY3Rpb24KKyAqCSBvZiBhbiBvcHRpb25hbCBzZWN1cmUgbWVtb3J5IGFsbG9jYXRpb24gd2hpY2ggbWF5IGJlIHVzZWQKKyAqCSB0byBhdm9pZCByZXZlYWxpbmcgb2Ygc2Vuc2l0aXZlIGRhdGEgZHVlIHRvIHBhZ2luZyBldGMuCisgKi8KKworCisKKyEgSU5QVVQgUEFSQU1FVEVSUworISByZXNfcHRyCW8wCishIHMxX3B0cglvMQorISBzaXplCQlvMgorISBzMl9saW1iCW8zCisKKyNpbmNsdWRlICJzeXNkZXAuaCIKKworLnRleHQKKwkuYWxpZ24JOAorCS5nbG9iYWwgQ19TWU1CT0xfTkFNRShfZ2NyeV9tcGloX211bF8xKQorQ19TWU1CT0xfTkFNRShfZ2NyeV9tcGloX211bF8xKToKKwlzbGwJJW8yLDQsJWcxCisJYW5kCSVnMSwoNC0xKTw8NCwlZzEKKyNpZiBQSUMKKwltb3YJJW83LCVnNCAJCSEgU2F2ZSByZXR1cm4gYWRkcmVzcyByZWdpc3RlcgorCWNhbGwJMWYKKwlhZGQJJW83LExMLTFmLCVnMworMToJbW92CSVnNCwlbzcgCQkhIFJlc3RvcmUgcmV0dXJuIGFkZHJlc3MgcmVnaXN0ZXIKKyNlbHNlCisJc2V0aGkJJWhpKExMKSwlZzMKKwlvcgklZzMsJWxvKExMKSwlZzMKKyNlbmRpZgorCWptcAklZzMrJWcxCisJbGQJWyVvMSswXSwlbzQJISAxCitMTDoKK0xMMDA6CWFkZAklbzAsLTQsJW8wCisJYWRkCSVvMSwtNCwlbzEKKwliCUxvb3AwMAkJLyogNCwgOCwgMTIsIC4uLiAqLworCW9yY2MJJWcwLCVnMCwlZzIKK0xMMDE6CWIJTG9vcDAxCQkvKiAxLCA1LCA5LCAuLi4gKi8KKwlvcmNjCSVnMCwlZzAsJWcyCisJbm9wCisJbm9wCitMTDEwOglhZGQJJW8wLC0xMiwlbzAJLyogMiwgNiwgMTAsIC4uLiAqLworCWFkZAklbzEsNCwlbzEKKwliCUxvb3AxMAorCW9yY2MJJWcwLCVnMCwlZzIKKwlub3AKK0xMMTE6CWFkZAklbzAsLTgsJW8wCS8qIDMsIDcsIDExLCAuLi4gKi8KKwlhZGQJJW8xLC04LCVvMQorCWIJTG9vcDExCisJb3JjYwklZzAsJWcwLCVnMgorCitMb29wOglhZGRjYwklZzMsJWcyLCVnMwkhIDEKKwlsZAlbJW8xKzRdLCVvNAkhIDIKKwlzdAklZzMsWyVvMCswXQkhIDEKKwlyZAkleSwlZzIJCSEgMQorTG9vcDAwOiB1bXVsCSVvNCwlbzMsJWczCSEgMgorCWFkZHhjYwklZzMsJWcyLCVnMwkhIDIKKwlsZAlbJW8xKzhdLCVvNAkhIDMKKwlzdAklZzMsWyVvMCs0XQkhIDIKKwlyZAkleSwlZzIJCSEgMgorTG9vcDExOiB1bXVsCSVvNCwlbzMsJWczCSEgMworCWFkZHhjYwklZzMsJWcyLCVnMwkhIDMKKwlsZAlbJW8xKzEyXSwlbzQJISA0CisJYWRkCSVvMSwxNiwlbzEKKwlzdAklZzMsWyVvMCs4XQkhIDMKKwlyZAkleSwlZzIJCSEgMworTG9vcDEwOiB1bXVsCSVvNCwlbzMsJWczCSEgNAorCWFkZHhjYwklZzMsJWcyLCVnMwkhIDQKKwlsZAlbJW8xKzBdLCVvNAkhIDEKKwlzdAklZzMsWyVvMCsxMl0JISA0CisJYWRkCSVvMCwxNiwlbzAKKwlyZAkleSwlZzIJCSEgNAorCWFkZHgJJWcwLCVnMiwlZzIKK0xvb3AwMTogYWRkY2MJJW8yLC00LCVvMgorCWJnCUxvb3AKKwl1bXVsCSVvNCwlbzMsJWczCSEgMQorCisJYWRkY2MJJWczLCVnMiwlZzMJISA0CisJc3QJJWczLFslbzArMF0JISA0CisJcmQJJXksJWcyCQkhIDQKKworCXJldGwKKwlhZGR4CSVnMCwlZzIsJW8wCisKKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9zcGFyYzMydjgvbXBpaC1tdWwyLlMgYi9saWJnY3J5cHQtMS40LjYvbXBpL3NwYXJjMzJ2OC9tcGloLW11bDIuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjVjYzQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9zcGFyYzMydjgvbXBpaC1tdWwyLlMKQEAgLTAsMCArMSwxMzIgQEAKKy8qIFNQQVJDIHY4IF9fbXBuX2FkZG11bF8xIC0tIE11bHRpcGx5IGEgbGltYiB2ZWN0b3Igd2l0aCBhIGxpbWIgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGQgdGhlIHJlc3VsdCB0byBhIHNlY29uZCBsaW1iIHZlY3Rvci4KKyAqCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5OCwgCisgKiAgICAgICAgICAgICAgICAgICAgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqICAgICAgIAorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICoKKyAqIE5vdGU6IFRoaXMgY29kZSBpcyBoZWF2aWx5IGJhc2VkIG9uIHRoZSBHTlUgTVAgTGlicmFyeS4KKyAqCSBBY3R1YWxseSBpdCdzIHRoZSBzYW1lIGNvZGUgd2l0aCBvbmx5IG1pbm9yIGNoYW5nZXMgaW4gdGhlCisgKgkgd2F5IHRoZSBkYXRhIGlzIHN0b3JlZDsgdGhpcyBpcyB0byBzdXBwb3J0IHRoZSBhYnN0cmFjdGlvbgorICoJIG9mIGFuIG9wdGlvbmFsIHNlY3VyZSBtZW1vcnkgYWxsb2NhdGlvbiB3aGljaCBtYXkgYmUgdXNlZAorICoJIHRvIGF2b2lkIHJldmVhbGluZyBvZiBzZW5zaXRpdmUgZGF0YSBkdWUgdG8gcGFnaW5nIGV0Yy4KKyAqLworCisKKworISBJTlBVVCBQQVJBTUVURVJTCishIHJlc19wdHIJbzAKKyEgczFfcHRyCW8xCishIHNpemUJCW8yCishIHMyX2xpbWIJbzMKKworI2luY2x1ZGUgInN5c2RlcC5oIgorCisudGV4dAorCS5hbGlnbiA0CisJLmdsb2JhbCBDX1NZTUJPTF9OQU1FKF9nY3J5X21waWhfYWRkbXVsXzEpCitDX1NZTUJPTF9OQU1FKF9nY3J5X21waWhfYWRkbXVsXzEpOgorCW9yY2MJJWcwLCVnMCwlZzIKKwlsZAlbJW8xKzBdLCVvNAkhIDEKKworCXNsbAklbzIsNCwlZzEKKwlhbmQJJWcxLCg0LTEpPDw0LCVnMQorI2lmIFBJQworCW1vdgklbzcsJWc0IAkJISBTYXZlIHJldHVybiBhZGRyZXNzIHJlZ2lzdGVyCisJY2FsbAkxZgorCWFkZAklbzcsTEwtMWYsJWczCisxOgltb3YJJWc0LCVvNyAJCSEgUmVzdG9yZSByZXR1cm4gYWRkcmVzcyByZWdpc3RlcgorI2Vsc2UKKwlzZXRoaQklaGkoTEwpLCVnMworCW9yCSVnMywlbG8oTEwpLCVnMworI2VuZGlmCisJam1wCSVnMyslZzEKKwlub3AKK0xMOgorTEwwMDoJYWRkCSVvMCwtNCwlbzAKKwliCUxvb3AwMAkJLyogNCwgOCwgMTIsIC4uLiAqLworCWFkZAklbzEsLTQsJW8xCisJbm9wCitMTDAxOgliCUxvb3AwMQkJLyogMSwgNSwgOSwgLi4uICovCisJbm9wCisJbm9wCisJbm9wCitMTDEwOglhZGQJJW8wLC0xMiwlbzAJLyogMiwgNiwgMTAsIC4uLiAqLworCWIJTG9vcDEwCisJYWRkCSVvMSw0LCVvMQorCW5vcAorTEwxMToJYWRkCSVvMCwtOCwlbzAJLyogMywgNywgMTEsIC4uLiAqLworCWIJTG9vcDExCisJYWRkCSVvMSwtOCwlbzEKKwlub3AKKworMToJYWRkY2MJJWczLCVnMiwlZzMJISAxCisJbGQJWyVvMSs0XSwlbzQJISAyCisJcmQJJXksJWcyCQkhIDEKKwlhZGR4CSVnMCwlZzIsJWcyCisJbGQJWyVvMCswXSwlZzEJISAyCisJYWRkY2MJJWcxLCVnMywlZzMKKwlzdAklZzMsWyVvMCswXQkhIDEKK0xvb3AwMDogdW11bAklbzQsJW8zLCVnMwkhIDIKKwlsZAlbJW8wKzRdLCVnMQkhIDIKKwlhZGR4Y2MJJWczLCVnMiwlZzMJISAyCisJbGQJWyVvMSs4XSwlbzQJISAzCisJcmQJJXksJWcyCQkhIDIKKwlhZGR4CSVnMCwlZzIsJWcyCisJbm9wCisJYWRkY2MJJWcxLCVnMywlZzMKKwlzdAklZzMsWyVvMCs0XQkhIDIKK0xvb3AxMTogdW11bAklbzQsJW8zLCVnMwkhIDMKKwlhZGR4Y2MJJWczLCVnMiwlZzMJISAzCisJbGQJWyVvMSsxMl0sJW80CSEgNAorCXJkCSV5LCVnMgkJISAzCisJYWRkCSVvMSwxNiwlbzEKKwlhZGR4CSVnMCwlZzIsJWcyCisJbGQJWyVvMCs4XSwlZzEJISAyCisJYWRkY2MJJWcxLCVnMywlZzMKKwlzdAklZzMsWyVvMCs4XQkhIDMKK0xvb3AxMDogdW11bAklbzQsJW8zLCVnMwkhIDQKKwlhZGR4Y2MJJWczLCVnMiwlZzMJISA0CisJbGQJWyVvMSswXSwlbzQJISAxCisJcmQJJXksJWcyCQkhIDQKKwlhZGR4CSVnMCwlZzIsJWcyCisJbGQJWyVvMCsxMl0sJWcxCSEgMgorCWFkZGNjCSVnMSwlZzMsJWczCisJc3QJJWczLFslbzArMTJdCSEgNAorCWFkZAklbzAsMTYsJW8wCisJYWRkeAklZzAsJWcyLCVnMgorTG9vcDAxOiBhZGRjYwklbzIsLTQsJW8yCisJYmcJMWIKKwl1bXVsCSVvNCwlbzMsJWczCSEgMQorCisJYWRkY2MJJWczLCVnMiwlZzMJISA0CisJcmQJJXksJWcyCQkhIDQKKwlhZGR4CSVnMCwlZzIsJWcyCisJbGQJWyVvMCswXSwlZzEJISAyCisJYWRkY2MJJWcxLCVnMywlZzMKKwlzdAklZzMsWyVvMCswXQkhIDQKKwlhZGR4CSVnMCwlZzIsJW8wCisKKwlyZXRsCisJIG5vcAorCisKKyEJdW11bCwgbGQsIGFkZHhjYywgcmQsIHN0CisKKyEJdW11bCwgbGQsIGFkZHhjYywgcmQsIGxkLCBhZGRjYywgc3QsIGFkZHgKKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L21waS9zcGFyYzMydjgvbXBpaC1tdWwzLlMgYi9saWJnY3J5cHQtMS40LjYvbXBpL3NwYXJjMzJ2OC9tcGloLW11bDMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2JiMTk0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9zcGFyYzMydjgvbXBpaC1tdWwzLlMKQEAgLTAsMCArMSw2NyBAQAorLyogU1BBUkMgdjggX19tcG5fc3VibXVsXzEgLS0gTXVsdGlwbHkgYSBsaW1iIHZlY3RvciB3aXRoIGEgbGltYiBhbmQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRyYWN0IHRoZSByZXN1bHQgZnJvbSBhIHNlY29uZCBsaW1iIHZlY3Rvci4KKyAqCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5OCwgCisgKiAgICAgICAgICAgICAgICAgICAgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqICAgICAgIAorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICoKKyAqIE5vdGU6IFRoaXMgY29kZSBpcyBoZWF2aWx5IGJhc2VkIG9uIHRoZSBHTlUgTVAgTGlicmFyeS4KKyAqCSBBY3R1YWxseSBpdCdzIHRoZSBzYW1lIGNvZGUgd2l0aCBvbmx5IG1pbm9yIGNoYW5nZXMgaW4gdGhlCisgKgkgd2F5IHRoZSBkYXRhIGlzIHN0b3JlZDsgdGhpcyBpcyB0byBzdXBwb3J0IHRoZSBhYnN0cmFjdGlvbgorICoJIG9mIGFuIG9wdGlvbmFsIHNlY3VyZSBtZW1vcnkgYWxsb2NhdGlvbiB3aGljaCBtYXkgYmUgdXNlZAorICoJIHRvIGF2b2lkIHJldmVhbGluZyBvZiBzZW5zaXRpdmUgZGF0YSBkdWUgdG8gcGFnaW5nIGV0Yy4KKyAqLworCisgICAgICAgIAorISBJTlBVVCBQQVJBTUVURVJTCishIHJlc19wdHIJbzAKKyEgczFfcHRyCW8xCishIHNpemUJCW8yCishIHMyX2xpbWIJbzMKKworI2luY2x1ZGUgInN5c2RlcC5oIgorCisudGV4dAorCS5hbGlnbiA0CisJLmdsb2JhbCBDX1NZTUJPTF9OQU1FKF9nY3J5X21waWhfc3VibXVsXzEpCitDX1NZTUJPTF9OQU1FKF9nY3J5X21waWhfc3VibXVsXzEpOgorCXN1YgklZzAsJW8yLCVvMgkJISBuZWdhdGUgLi4uCisJc2xsCSVvMiwyLCVvMgkJISAuLi4gYW5kIHNjYWxlIHNpemUKKwlzdWIJJW8xLCVvMiwlbzEJCSEgbzEgaXMgb2Zmc2V0IHMxX3B0cgorCXN1YgklbzAsJW8yLCVnMQkJISBnMSBpcyBvZmZzZXQgcmVzX3B0cgorCisJbW92CTAsJW8wCQkJISBjbGVhciBjeV9saW1iCisKK0xvb3A6CWxkCVslbzErJW8yXSwlbzQKKwlsZAlbJWcxKyVvMl0sJWcyCisJdW11bAklbzQsJW8zLCVvNQorCXJkCSV5LCVnMworCWFkZGNjCSVvNSwlbzAsJW81CisJYWRkeAklZzMsMCwlbzAKKwlzdWJjYwklZzIsJW81LCVnMgorCWFkZHgJJW8wLDAsJW8wCisJc3QJJWcyLFslZzErJW8yXQorCisJYWRkY2MJJW8yLDQsJW8yCisJYm5lCUxvb3AKKwkgbm9wCisKKwlyZXRsCisJIG5vcAorCisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvc3VwZXJzcGFyYy9NYW5pZmVzdCBiL2xpYmdjcnlwdC0xLjQuNi9tcGkvc3VwZXJzcGFyYy9NYW5pZmVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjliOTdiCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9zdXBlcnNwYXJjL01hbmlmZXN0CkBAIC0wLDAgKzEsMjEgQEAKKyMgTWFuaWZlc3QgLSBjaGVja3N1bXMgCisjIENvcHlyaWdodCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisjCisjIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorCit1ZGl2LlMKKyRuYW1lcyQgaVFDVkF3VUFQK0xtZGpFQW5wODMyUy83QVFJclVnUUEzWW11clpoSzdyMjBEcVJ2ZzBnd05lOWpNRGNGZlVZNFpQaFc1SGtHek1ibXJ4WHRqNUR4NTBSSVB0ZXVtNzJiWEUrSWhjbmdsalFiL2Nza2lONUhpOW9jMmEyQ1BoeVRxVkZFZUd5RitrSjE3MEdJMXBWZkZPZnpiVkcwRjRuRXdtNWxHSGd2L252RnN2cmptbUFYVlcxdi95azVOMzV3YmlMdmlPRnJMT1E9PWJ5RmMKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9tcGkvc3VwZXJzcGFyYy9kaXN0ZmlsZXMgYi9saWJnY3J5cHQtMS40LjYvbXBpL3N1cGVyc3BhcmMvZGlzdGZpbGVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmN2MwYTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvbXBpL3N1cGVyc3BhcmMvZGlzdGZpbGVzCkBAIC0wLDAgKzEsMyBAQAorTWFuaWZlc3QKK3VkaXYuUworCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvbXBpL3N1cGVyc3BhcmMvdWRpdi5TIGIvbGliZ2NyeXB0LTEuNC42L21waS9zdXBlcnNwYXJjL3VkaXYuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWU1MDZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L21waS9zdXBlcnNwYXJjL3VkaXYuUwpAQCAtMCwwICsxLDExOCBAQAorLyogU3VwZXJTUEFSQyBfX3VkaXZfcXJubmQgZGl2aXNpb24gc3VwcG9ydCwgdXNlZCBmcm9tIGxvbmdsb25nLmguCisgKiAgICAgICAgICAgIFRoaXMgaXMgZm9yIFN1cGVyU1BBUkMgb25seSwgdG8gY29tcGVuc2F0ZSBmb3IgaXRzCisgKiAgICAgICAgICAgIHNlbWktZnVuY3Rpb25hbCB1ZGl2IGluc3RydWN0aW9uLgorICoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk2LCAxOTk4LAorICogICAgICAgICAgICAgICAgICAgIDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKiAgICAgICAKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqCisgKiBOb3RlOiBUaGlzIGNvZGUgaXMgaGVhdmlseSBiYXNlZCBvbiB0aGUgR05VIE1QIExpYnJhcnkuCisgKgkgQWN0dWFsbHkgaXQncyB0aGUgc2FtZSBjb2RlIHdpdGggb25seSBtaW5vciBjaGFuZ2VzIGluIHRoZQorICoJIHdheSB0aGUgZGF0YSBpcyBzdG9yZWQ7IHRoaXMgaXMgdG8gc3VwcG9ydCB0aGUgYWJzdHJhY3Rpb24KKyAqCSBvZiBhbiBvcHRpb25hbCBzZWN1cmUgbWVtb3J5IGFsbG9jYXRpb24gd2hpY2ggbWF5IGJlIHVzZWQKKyAqCSB0byBhdm9pZCByZXZlYWxpbmcgb2Ygc2Vuc2l0aXZlIGRhdGEgZHVlIHRvIHBhZ2luZyBldGMuCisgKi8KKworCisKKyEgSU5QVVQgUEFSQU1FVEVSUworISByZW1fcHRyCWkwCishIG4xCQlpMQorISBuMAkJaTIKKyEgZAkJaTMKKworI2luY2x1ZGUgInN5c2RlcC5oIgorI3VuZGVmIHJldAkvKiBLbHVkZ2UgZm9yIGdsaWJjICovCisKKwkudGV4dAorCS5hbGlnbgk4CitMQzA6CS5kb3VibGUgMHI0Mjk0OTY3Mjk2CitMQzE6CS5kb3VibGUgMHIyMTQ3NDgzNjQ4CisKKwkuYWxpZ24JNAorCS5nbG9iYWwgQ19TWU1CT0xfTkFNRShfX3VkaXZfcXJubmQpCitDX1NZTUJPTF9OQU1FKF9fdWRpdl9xcm5uZCk6CisJISNQUk9MT0dVRSMgMAorCXNhdmUJJXNwLC0xMDQsJXNwCisJISNQUk9MT0dVRSMgMQorCXN0CSVpMSxbJWZwLThdCisJbGQJWyVmcC04XSwlZjEwCisJc2V0aGkJJWhpKExDMCksJW83CisJZml0b2QJJWYxMCwlZjQKKwlsZGQJWyVvNyslbG8oTEMwKV0sJWY4CisJY21wCSVpMSwwCisJYmdlCUwyNDgKKwltb3YJJWkwLCVpNQorCWZhZGRkCSVmNCwlZjgsJWY0CitMMjQ4OgorCXN0CSVpMixbJWZwLThdCisJbGQJWyVmcC04XSwlZjEwCisJZm11bGQJJWY0LCVmOCwlZjYKKwljbXAJJWkyLDAKKwliZ2UJTDI0OQorCWZpdG9kCSVmMTAsJWYyCisJZmFkZGQJJWYyLCVmOCwlZjIKK0wyNDk6CisJc3QJJWkzLFslZnAtOF0KKwlmYWRkZAklZjYsJWYyLCVmMgorCWxkCVslZnAtOF0sJWYxMAorCWNtcAklaTMsMAorCWJnZQlMMjUwCisJZml0b2QJJWYxMCwlZjQKKwlmYWRkZAklZjQsJWY4LCVmNAorTDI1MDoKKwlmZGl2ZAklZjIsJWY0LCVmMgorCXNldGhpCSVoaShMQzEpLCVvNworCWxkZAlbJW83KyVsbyhMQzEpXSwlZjQKKwlmY21wZWQJJWYyLCVmNAorCW5vcAorCWZiZ2UsYQlMMjUxCisJZnN1YmQJJWYyLCVmNCwlZjIKKwlmZHRvaQklZjIsJWYyCisJc3QJJWYyLFslZnAtOF0KKwliCUwyNTIKKwlsZAlbJWZwLThdLCVpNAorTDI1MToKKwlmZHRvaQklZjIsJWYyCisJc3QJJWYyLFslZnAtOF0KKwlsZAlbJWZwLThdLCVpNAorCXNldGhpCSVoaSgtMjE0NzQ4MzY0OCksJWcyCisJeG9yCSVpNCwlZzIsJWk0CitMMjUyOgorCXVtdWwJJWkzLCVpNCwlZzMKKwlyZAkleSwlaTAKKwlzdWJjYwklaTIsJWczLCVvNworCXN1YnhjYwklaTEsJWkwLCVnMAorCWJlCUwyNTMKKwljbXAJJW83LCVpMworCisJYWRkCSVpNCwtMSwlaTAKKwlhZGQJJW83LCVpMywlbzcKKwlzdAklbzcsWyVpNV0KKwlyZXQKKwlyZXN0b3JlCitMMjUzOgorCWJsdQlMMjQ2CisJbW92CSVpNCwlaTAKKwlhZGQJJWk0LDEsJWkwCisJc3ViCSVvNywlaTMsJW83CitMMjQ2OgorCXN0CSVvNyxbJWk1XQorCXJldAorCXJlc3RvcmUKKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L3JhbmRvbS9DaGFuZ2VMb2cgYi9saWJnY3J5cHQtMS40LjYvcmFuZG9tL0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTYzOWM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L3JhbmRvbS9DaGFuZ2VMb2cKQEAgLTAsMCArMSwxMzkgQEAKKzIwMDktMTItMTAgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIHJuZHczMi5jIChzeXN0ZW1faXNfdzIwMDApOiBOZXcuCisJKF9nY3J5X3JuZHczMl9nYXRoZXJfcmFuZG9tKTogU2V0IGl0LgorCShzbG93X2dhdGhlcmVyKTogSWdub3JlIFN5c3RlbU9iamVjdEluZm9ybWF0aW9uIG9uIFcyMDAwLiAgRml4ZXMKKwlidWcjMTE2Ny4KKworMjAwOS0wNi0yNCAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogcm5kaHcuYyAocG9sbF9wYWRsb2NrKTogQXNtIGNoYW5nZSBmcm9tIEZlZG9yYS4KKworMjAwOS0wMS0yMiAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogcmFuZG9tLmMgKF9nY3J5X3JhbmRvbV9kZWluaXRfZXh0ZXJuYWxfdGVzdCk6IERvIG5vdCByZXR1cm4gYQorCXZhbHVlLiAgUmVwb3J0ZWQgQWxiZXJ0IENoaW4uCisKKzIwMDgtMDktMTYgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIHJhbmRvbS1maXBzLmMgKHg5MzFfYWVzX2RyaXZlcik6IE5vIHJlLXNlZWRpbmcgd2l0aCB0ZXN0IGNvbnRleHRzLgorCShfZ2NyeV9ybmdmaXBzX2luaXRfZXh0ZXJuYWxfdGVzdCk6IEZpeCBzZXR0aW5nIG9mIHRlc3RfZHRfcHRyLgorCShzdHJ1Y3Qgcm5nX2NvbnRleHQpOiBBZGQgZmxhZyBURVNUX05PX0RVUF9DSEVDSy4KKwkoeDkzMV9hZXNfZHJpdmVyKTogVXNlIHRoYXQgZmxhZy4KKwkoX2djcnlfcm5nZmlwc19pbml0X2V4dGVybmFsX3Rlc3QpOiBBZGQgYXJnIEZMQUdTIGFuZCB1c2UgaXQgdG8KKwltb2RpZnkgdGhlIHRlc3QuCisJKiByYW5kb20uYyAoX2djcnlfcmFuZG9tX2luaXRfZXh0ZXJuYWxfdGVzdCk6IFBhc3MgRkxBR1MuCisKKzIwMDgtMDktMTUgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIHJhbmRvbS5jIChfZ2NyeV9yYW5kb21faW5pdF9leHRlcm5hbF90ZXN0KTogTmV3LgorCShfZ2NyeV9yYW5kb21fcnVuX2V4dGVybmFsX3Rlc3QpOiBOZXcuIAorCShfZ2NyeV9yYW5kb21fZGVpbml0X2V4dGVybmFsX3Rlc3QpOiBOZXcuCisJKiByYW5kb20tZmlwcy5jIChzdHJ1Y3Qgcm5nX2NvbnRleHQpOiBUdXJuIFRFU1RfRFRfQ09VTlRFUiBpbnRvIGEKKwkzMiBiaXQgaW50ZWdlci4KKwkoeDkzMV9nZXRfZHQpOiBEaXR0by4KKwkoc2VsZnRlc3Rfa2F0KTogSW50aWFsaXplIGl0IGFjY29yZGluZ2x5LgorCShfZ2NyeV9ybmdmaXBzX2luaXRfZXh0ZXJuYWxfdGVzdCk6IE5ldy4KKwkoX2djcnlfcm5nZmlwc19ydW5fZXh0ZXJuYWxfdGVzdCk6IE5ldy4gCisJKF9nY3J5X3JuZ2ZpcHNfZGVpbml0X2V4dGVybmFsX3Rlc3QpOiBOZXcuCisKKzIwMDgtMDktMDUgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIHJhbmRvbS5jIChfZ2NyeV9yYW5kb21fc2VsZnRlc3QpOiBSZXR1cm4gc3VjY2VzcyBpZiBub3QgaW4gZmlwcworCW1vZGUuCisKKzIwMDgtMDktMDEgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIHJhbmRvbS1maXBzLmMgKHg5MzFfZ2V0X2R0KSBbVzMyXTogRG8gbm90IHVzZSBnZXRwcGlkLgorCShnZXRfZW50cm9weSk6IFByZXBhcmUgZm9yIHVzZSB1bmRlciBXaW5kb3dzLgorCShfZ2NyeV9ybmdmaXBzX3NlbGZ0ZXN0KTogRGl0dG8uCisJKGVudHJvcHlfY29sbGVjdF9jYik6IE1ha2Ugc3VyZSB0aGF0IHRoZSBnYXRoZXJlciBuZXZlciBvdmVyZmxvd3MKKwl0aGUgYnVmZmVycy4KKworMjAwOC0wOC0yOSAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogcmFuZG9tLWZpcHMuYyAoU0VFRF9UVEwpOiBOZXcuCisJKHN0cnVjdCBybmdfY29udGV4dCk6IEFkZCBVU0VfQ09VTlRFUiwgcmVtb3ZlIE5FRURfU1RST05HX0VOVFJPUFkuCisJKHg5MzFfYWVzX2RyaXZlcik6IERvIHJlLXNlZWRpbmcgaWYgcmVxdWlyZWQuCisJKHg5MzFfZ2VuZXJhdGVfa2V5LCB4OTMxX2dlbmVyYXRlX3NlZWQpOiBGYWN0b3IgY29tbW9uIGNvZGUgb3V0IHRvIC4uCisJKGdldF9lbnRyb3B5KTogLi4gbmV3LiAgQWx3YXlzIHVzZSAvZGV2L3JhbmRvbS4KKwkoeDkzMV9nZW5lcmF0ZV9rZXkpOiBTZWVkIGtleSBmb3Igbm9uY2VfY29udGV4dCBmcm9tIHN0ZF9ybmdfY29udGV4dC4KKwkoeDkzMV9yZXNlZWQpOiBOZXcuIFNlZWQgbm9uY2UgY29udGV4dCBmcm9tIHN0ZF9ybmdfY29udGV4dC4KKwkoZ2V0X3JhbmRvbSk6IFVzZSB4OTMxX3Jlc2VlZC4KKwkoX2djcnlfcm5nZmlwc19zZWxmdGVzdCk6IFJldHVybiBhbiBlcnJvciBpZiBubyAvZGV2L3JhZG9tIHN1cHBvcnQKKwloYXMgYmVlbiBjb21waWxlZCBpbi4KKwkoZ2V0X3JhbmRvbSk6IFJlbW92ZSBsb2NraW5nLgorCShfZ2NyeV9ybmdmaXBzX3JhbmRvbWl6ZSwgX2djcnlfcm5nZmlwc19jcmVhdGVfbm9uY2UpOiBMb2NrIGhlcmUuCisKKzIwMDgtMDgtMjggIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIHJhbmRvbS1kYWVtb24uYyAoY29ubmVjdF90b19zb2NrZXQpOiBVc2UgR1BHX0VSUl9FTkFNRVRPT0xPTkcuCisKKzIwMDgtMDgtMjUgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIHJhbmRvbS1maXBzLmMgKHg5MzFfYWVzKTogVGFrZSBkYXRldGltZV9HVCBmcm9tIGFuIGFyZy4KKwkoeDkzMV9hZXNfZHJpdmVyKTogQ2FsbCB4OTMxX2dldF9kdCBoZXJlLgorCSh4OTMxX2dldF9kdCk6IEltcGxlbWVudCB0aGUgS0FUIGhhY2suCisJKHg5MzFfZ2VuZXJhdGVfc2VlZCk6IENvcHkgdGhlIHNlZWQgdmFsdWUgdG8gdGhlIHByb3ZpZGVkIGJ1ZmZlci4KKwkoc2VsZnRlc3Rfa2F0KTogTmV3LgorCisyMDA4LTA4LTIyICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiByYW5kb20uYyAoX2djcnlfdXBkYXRlX3JhbmRvbV9zZWVkX2ZpbGUpOiBNb3ZlIG9wZXJhdGlvbmFsIGNoZWNrCisJdG8gX2djcnlfdmNvbnRyb2wuCisJKF9nY3J5X2Zhc3RfcmFuZG9tX3BvbGwpOiBEaXR0by4KKwkoX2djcnlfcmFuZG9tX3NlbGZ0ZXN0KTogTmV3LgorCSogcmFuZG9tLWZpcHMuYyAoX2djcnlfcm5nZmlwc19zZWxmdGVzdCk6IE5ldy4KKworMjAwOC0wOC0yMSAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogcmFuZG9tLWZpcHMuYzogRmluaXNoIGltcGxlbWVudGF0aW9uLgorCisyMDA4LTA4LTE1ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiByYW5kb20tZmlwcy5jOiBOZXcuCisKKwkqIHJhbmRvbS1jc3BybmcuYyAocHJvY2Vzcy1jYiwgcHJvZ3Jlc3NfY2JfZGF0YSk6IE1vdmUgdG8KKwlyYW5kb20uYy4KKwkoX2djcnlfcmVnaXN0ZXJfcmFuZG9tX3Byb2dyZXNzLCBfZ2NyeV9yYW5kb21fcHJvZ3Jlc3MpOiBEaXR0by4KKwkoX2djcnlfcmFuZG9tX2luaXRpYWxpemUpOiBSZW5hbWUgdG8gX2djcnlfcm5nY3Nwcm5nX2luaXRpYWxpemUuCisJKF9nY3J5X3JhbmRvbV9kdW1wX3N0YXRzKTogUmVuYW1lIHRvIF9nY3J5X3JuZ2NzcHJuZ19kdW1wX3N0YXRzLgorCShfZ2NyeV9zZWN1cmVfcmFuZG9tX2FsbG9jKTogUmVuYW1lIHRvCisJX2djcnlfcm5nY3Nwcm5nX3NlY3VyZV9hbGxvYy4KKwkoX2djcnlfZW5hYmxlX3F1aWNrX3JhbmRvbV9nZW4pOiBSZW5hbWUgdG8KKwlfZ2NyeV9ybmdjc3BybmdfZW5hYmxlX3F1aWNrX2dlbi4KKwkoX2djcnlfc2V0X3JhbmRvbV9kYWVtb25fc29ja2V0KTogUmVuYW1lIHRvCisJX2djcnlfcm5nY3Nwcm5nX3NldF9kYWVtb25fc29ja2V0LgorCShfZ2NyeV91c2VfcmFuZG9tX2RhZW1vbik6IFJlbmFtZSB0byBfZ2NyeV9ybmdjc3BybmdfdXNlX2RhZW1vbi4KKwkoX2djcnlfcmFuZG9tX2lzX2Zha2VkKTogUmVuYW1lIHRvIF9nY3J5X3JuZ2NzcHJuZ19pc19mYWtlZC4KKwkoZ2NyeV9yYW5kb21fYWRkX2J5dGVzKTogUmVuYW1lIHRvIF9nY3J5X3JuZ2NzcHJuZ19hZGRfYnl0ZXMuCisJKGdjcnlfcmFuZG9tX2J5dGVzKTogUmVtb3ZlCisJKGdjcnlfcmFuZG9tX2J5dGVzX3NlY3VyZSk6IFJlbW92ZS4KKwkoZ2NyeV9yYW5kb21pemUpOiBSZW5hbWUgdG8gX2djcnlfcm5nY3Nwcm5nX3JhbmRvbWl6ZS4KKwkoX2djcnlfc2V0X3JhbmRvbV9zZWVkX2ZpbGUpOiBSZW5hbWUgdG8KKwlfZ2NyeV9ybmdjc3Bybmdfc2V0X3NlZWRfZmlsZS4KKwkoX2djcnlfdXBkYXRlX3JhbmRvbV9zZWVkX2ZpbGUpOiBSZW5hbWUgdG8KKwlfZ2NyeV9ybmdjc3BybmdfdXBkYXRlX3NlZWRfZmlsZS4KKwkoX2djcnlfZmFzdF9yYW5kb21fcG9sbCk6IFJlbmFtZSB0byBfZ2NyeV9ybmdjc3BybmdfZmFzdF9wb2xsLgorCShnY3J5X2NyZWF0ZV9ub25jZSk6IFJlbmFtZSB0byBfZ2NyeV9ybmdjc3BybmdfY3JlYXRlX25vbmNlLgorCisJKiByYW5kb20uYzogRmFjdG9yIGFsbCBjb2RlIG91dCB0byByYW5kb20tY3Nwcm5nLmMgYW5kIGltcGxlbWVudAorCXdyYXBwZXIgZnVuY3Rpb25zLgorCisyMDA4LTA3LTA1ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiByYW5kb20tZGFlbW9uLmMsIHJhbmRvbS5oLCBybmRody5jLCBybmR1bml4LmMsIHJhbmQtaW50ZXJuYWwuaCAqCisJcmFuZG9tLmMsIHJuZGVnZC5jLCBybmRsaW51eC5jLCBybmR3MzIuYzogTW92ZSBmcm9tIC4uL2NpcGhlci8gdG8KKwloZXJlLgorCSogTWFrZWZpbGUuYW06IE5ldy4KKworIENvcHlyaWdodCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IGFzIGEgc3BlY2lhbCBleGNlcHRpb24gdGhlIGF1dGhvciBnaXZlcworIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQgZXZlbiB0aGUKKyBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKwkKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9yYW5kb20vTWFrZWZpbGUuYW0gYi9saWJnY3J5cHQtMS40LjYvcmFuZG9tL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNjEwOWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvcmFuZG9tL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDkgQEAKKyMgTWFrZWZpbGUgZm9yIGNpcGhlciBtb2R1bGVzCisjIENvcHlyaWdodCAoQykgMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorIworIyBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBwcm9kdWNlIE1ha2VmaWxlLmluCisKKyMgTmVlZCB0byBpbmNsdWRlIC4uL3NyYyBpbiBhZGRpdGlvbiB0byB0b3Bfc3JjZGlyIGJlY2F1c2UgZ2NyeXB0LmggaXMKKyMgYSBidWlsdCBoZWFkZXIuCitBTV9DUFBGTEFHUyA9IC1JLi4vc3JjIC1JJCh0b3Bfc3JjZGlyKS9zcmMgCitBTV9DRkxBR1MgPSAkKEdQR19FUlJPUl9DRkxBR1MpCisKK25vaW5zdF9MVExJQlJBUklFUyA9IGxpYnJhbmRvbS5sYQorCitHQ1JZUFRfTU9EVUxFUyA9IEBHQ1JZUFRfUkFORE9NQAorCitsaWJyYW5kb21fbGFfREVQRU5ERU5DSUVTID0gJChHQ1JZUFRfTU9EVUxFUykKK2xpYnJhbmRvbV9sYV9MSUJBREQgPSAkKEdDUllQVF9NT0RVTEVTKQorCitsaWJyYW5kb21fbGFfU09VUkNFUyA9IFwKK3JhbmRvbS5jIHJhbmRvbS5oIFwKK3JhbmQtaW50ZXJuYWwuaCBcCityYW5kb20tY3Nwcm5nLmMgXAorcmFuZG9tLWZpcHMuYyBcCitybmRody5jCisKK2lmIFVTRV9SQU5ET01fREFFTU9OCitsaWJyYW5kb21fbGFfU09VUkNFUyArPSByYW5kb20tZGFlbW9uLmMgCitlbmRpZiBVU0VfUkFORE9NX0RBRU1PTgorCisKK0VYVFJBX2xpYnJhbmRvbV9sYV9TT1VSQ0VTID0gXAorcm5kbGludXguYyBcCitybmRlZ2QuYyBcCitybmR1bml4LmMgXAorcm5kdzMyLmMgCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvcmFuZG9tL01ha2VmaWxlLmluIGIvbGliZ2NyeXB0LTEuNC42L3JhbmRvbS9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzlhYmM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L3JhbmRvbS9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDUxOSBAQAorIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYnkgYXV0b21ha2UgMS4xMC4yIGZyb20gTWFrZWZpbGUuYW0uCisjIEBjb25maWd1cmVfaW5wdXRACisKKyMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAorIyAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKKyMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorIyBQQVJUSUNVTEFSIFBVUlBPU0UuCisKK0BTRVRfTUFLRUAKKworIyBNYWtlZmlsZSBmb3IgY2lwaGVyIG1vZHVsZXMKKyMgQ29weXJpZ2h0IChDKSAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisjCisjIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIHByb2R1Y2UgTWFrZWZpbGUuaW4KKworVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK2FtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKK2luc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0CitpbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCitpbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX3RyaXBsZXQgPSBAYnVpbGRACitob3N0X3RyaXBsZXQgPSBAaG9zdEAKK0BVU0VfUkFORE9NX0RBRU1PTl9UUlVFQGFtX19hcHBlbmRfMSA9IHJhbmRvbS1kYWVtb24uYyAKK3N1YmRpciA9IHJhbmRvbQorRElTVF9DT01NT04gPSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmluIENoYW5nZUxvZworQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAorYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvbTQvbGlidG9vbC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9ub2V4ZWNzdGFjay5tNCAkKHRvcF9zcmNkaXIpL200L29uY2Vvbmx5Lm00IFwKKwkkKHRvcF9zcmNkaXIpL200L3NvY2tsZW4ubTQgJCh0b3Bfc3JjZGlyKS9tNC9zeXNfc29ja2V0X2gubTQgXAorCSQodG9wX3NyY2RpcikvYWNpbmNsdWRlLm00ICQodG9wX3NyY2RpcikvY29uZmlndXJlLmFjCithbV9fY29uZmlndXJlX2RlcHMgPSAkKGFtX19hY2xvY2FsX200X2RlcHMpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykgXAorCSQoQUNMT0NBTF9NNCkKK21raW5zdGFsbGRpcnMgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMKK0NPTkZJR19IRUFERVIgPSAkKHRvcF9idWlsZGRpcikvY29uZmlnLmgKK0NPTkZJR19DTEVBTl9GSUxFUyA9CitMVExJQlJBUklFUyA9ICQobm9pbnN0X0xUTElCUkFSSUVTKQorYW1fX0RFUEVOREVOQ0lFU18xID0KK2FtX19saWJyYW5kb21fbGFfU09VUkNFU19ESVNUID0gcmFuZG9tLmMgcmFuZG9tLmggcmFuZC1pbnRlcm5hbC5oIFwKKwlyYW5kb20tY3Nwcm5nLmMgcmFuZG9tLWZpcHMuYyBybmRody5jIHJhbmRvbS1kYWVtb24uYworQFVTRV9SQU5ET01fREFFTU9OX1RSVUVAYW1fX29iamVjdHNfMSA9IHJhbmRvbS1kYWVtb24ubG8KK2FtX2xpYnJhbmRvbV9sYV9PQkpFQ1RTID0gcmFuZG9tLmxvIHJhbmRvbS1jc3BybmcubG8gcmFuZG9tLWZpcHMubG8gXAorCXJuZGh3LmxvICQoYW1fX29iamVjdHNfMSkKK2xpYnJhbmRvbV9sYV9PQkpFQ1RTID0gJChhbV9saWJyYW5kb21fbGFfT0JKRUNUUykKK0RFRkFVTFRfSU5DTFVERVMgPSAtSS5AYW1fX2lzcmNAIC1JJCh0b3BfYnVpbGRkaXIpCitkZXBjb21wID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS9kZXBjb21wCithbV9fZGVwZmlsZXNfbWF5YmUgPSBkZXBmaWxlcworQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSBcCisJJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQorTFRDT01QSUxFID0gJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIFwKKwktLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgXAorCSQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKK0NDTEQgPSAkKENDKQorTElOSyA9ICQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSBcCisJLS1tb2RlPWxpbmsgJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpICQoQU1fTERGTEFHUykgXAorCSQoTERGTEFHUykgLW8gJEAKK1NPVVJDRVMgPSAkKGxpYnJhbmRvbV9sYV9TT1VSQ0VTKSAkKEVYVFJBX2xpYnJhbmRvbV9sYV9TT1VSQ0VTKQorRElTVF9TT1VSQ0VTID0gJChhbV9fbGlicmFuZG9tX2xhX1NPVVJDRVNfRElTVCkgXAorCSQoRVhUUkFfbGlicmFuZG9tX2xhX1NPVVJDRVMpCitFVEFHUyA9IGV0YWdzCitDVEFHUyA9IGN0YWdzCitESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQorQUNMT0NBTCA9IEBBQ0xPQ0FMQAorQU1UQVIgPSBAQU1UQVJACitBUiA9IEBBUkAKK0FTID0gQEFTQAorQVVUT0NPTkYgPSBAQVVUT0NPTkZACitBVVRPSEVBREVSID0gQEFVVE9IRUFERVJACitBVVRPTUFLRSA9IEBBVVRPTUFLRUAKK0FXSyA9IEBBV0tACitCVUlMRF9GSUxFVkVSU0lPTiA9IEBCVUlMRF9GSUxFVkVSU0lPTkAKK0JVSUxEX1JFVklTSU9OID0gQEJVSUxEX1JFVklTSU9OQAorQlVJTERfVElNRVNUQU1QID0gQEJVSUxEX1RJTUVTVEFNUEAKK0NDID0gQENDQAorQ0NBUyA9IEBDQ0FTQAorQ0NBU0RFUE1PREUgPSBAQ0NBU0RFUE1PREVACitDQ0FTRkxBR1MgPSBAQ0NBU0ZMQUdTQAorQ0NERVBNT0RFID0gQENDREVQTU9ERUAKK0NGTEFHUyA9IEBDRkxBR1NACitDUFAgPSBAQ1BQQAorQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACitDWFggPSBAQ1hYQAorQ1hYQ1BQID0gQENYWENQUEAKK0NYWERFUE1PREUgPSBAQ1hYREVQTU9ERUAKK0NYWEZMQUdTID0gQENYWEZMQUdTQAorQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKK0RFRlMgPSBAREVGU0AKK0RFUERJUiA9IEBERVBESVJACitETExUT09MID0gQERMTFRPT0xACitETF9MSUJTID0gQERMX0xJQlNACitFQ0hPID0gQEVDSE9ACitFQ0hPX0MgPSBARUNIT19DQAorRUNIT19OID0gQEVDSE9fTkAKK0VDSE9fVCA9IEBFQ0hPX1RACitFR1JFUCA9IEBFR1JFUEAKK0VYRUVYVCA9IEBFWEVFWFRACitGNzcgPSBARjc3QAorRkFMTEJBQ0tfU09DS0xFTl9UID0gQEZBTExCQUNLX1NPQ0tMRU5fVEAKK0ZGTEFHUyA9IEBGRkxBR1NACitHQ1JZUFRfQ0lQSEVSUyA9IEBHQ1JZUFRfQ0lQSEVSU0AKK0dDUllQVF9ESUdFU1RTID0gQEdDUllQVF9ESUdFU1RTQAorR0NSWVBUX1BVQktFWV9DSVBIRVJTID0gQEdDUllQVF9QVUJLRVlfQ0lQSEVSU0AKK0dDUllQVF9SQU5ET00gPSBAR0NSWVBUX1JBTkRPTUAKK0dQR19FUlJPUl9DRkxBR1MgPSBAR1BHX0VSUk9SX0NGTEFHU0AKK0dQR19FUlJPUl9DT05GSUcgPSBAR1BHX0VSUk9SX0NPTkZJR0AKK0dQR19FUlJPUl9MSUJTID0gQEdQR19FUlJPUl9MSUJTQAorR1JFUCA9IEBHUkVQQAorSU5TVEFMTCA9IEBJTlNUQUxMQAorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKK0lOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACitJTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKK0lOU1RBTExfU1RSSVBfUFJPR1JBTSA9IEBJTlNUQUxMX1NUUklQX1BST0dSQU1ACitMREZMQUdTID0gQExERkxBR1NACitMSUJHQ1JZUFRfQ0lQSEVSUyA9IEBMSUJHQ1JZUFRfQ0lQSEVSU0AKK0xJQkdDUllQVF9DT05GSUdfQVBJX1ZFUlNJT04gPSBATElCR0NSWVBUX0NPTkZJR19BUElfVkVSU0lPTkAKK0xJQkdDUllQVF9DT05GSUdfQ0ZMQUdTID0gQExJQkdDUllQVF9DT05GSUdfQ0ZMQUdTQAorTElCR0NSWVBUX0NPTkZJR19MSUJTID0gQExJQkdDUllQVF9DT05GSUdfTElCU0AKK0xJQkdDUllQVF9ESUdFU1RTID0gQExJQkdDUllQVF9ESUdFU1RTQAorTElCR0NSWVBUX0xUX0FHRSA9IEBMSUJHQ1JZUFRfTFRfQUdFQAorTElCR0NSWVBUX0xUX0NVUlJFTlQgPSBATElCR0NSWVBUX0xUX0NVUlJFTlRACitMSUJHQ1JZUFRfTFRfUkVWSVNJT04gPSBATElCR0NSWVBUX0xUX1JFVklTSU9OQAorTElCR0NSWVBUX1BVQktFWV9DSVBIRVJTID0gQExJQkdDUllQVF9QVUJLRVlfQ0lQSEVSU0AKK0xJQkdDUllQVF9USFJFQURfTU9EVUxFUyA9IEBMSUJHQ1JZUFRfVEhSRUFEX01PRFVMRVNACitMSUJPQkpTID0gQExJQk9CSlNACitMSUJTID0gQExJQlNACitMSUJUT09MID0gQExJQlRPT0xACitMTl9TID0gQExOX1NACitMVExJQk9CSlMgPSBATFRMSUJPQkpTQAorTUFJTlQgPSBATUFJTlRACitNQUtFSU5GTyA9IEBNQUtFSU5GT0AKK01LRElSX1AgPSBATUtESVJfUEAKK01QSV9TRkxBR1MgPSBATVBJX1NGTEFHU0AKK05PRVhFQ1NUQUNLX0ZMQUdTID0gQE5PRVhFQ1NUQUNLX0ZMQUdTQAorT0JKRFVNUCA9IEBPQkpEVU1QQAorT0JKRVhUID0gQE9CSkVYVEAKK1BBQ0tBR0UgPSBAUEFDS0FHRUAKK1BBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAorUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKK1BBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAorUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKK1BBQ0tBR0VfVVJMID0gQFBBQ0tBR0VfVVJMQAorUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKK1BBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAorUFRIX0NGTEFHUyA9IEBQVEhfQ0ZMQUdTQAorUFRIX0NPTkZJRyA9IEBQVEhfQ09ORklHQAorUFRIX0xJQlMgPSBAUFRIX0xJQlNACitSQU5MSUIgPSBAUkFOTElCQAorUkMgPSBAUkNACitTRVRfTUFLRSA9IEBTRVRfTUFLRUAKK1NIRUxMID0gQFNIRUxMQAorU1RSSVAgPSBAU1RSSVBACitTWVNfU09DS0VUX0ggPSBAU1lTX1NPQ0tFVF9IQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorYWJzX2J1aWxkZGlyID0gQGFic19idWlsZGRpckAKK2Fic19zcmNkaXIgPSBAYWJzX3NyY2RpckAKK2Fic190b3BfYnVpbGRkaXIgPSBAYWJzX3RvcF9idWlsZGRpckAKK2Fic190b3Bfc3JjZGlyID0gQGFic190b3Bfc3JjZGlyQAorYWNfY3RfQ0MgPSBAYWNfY3RfQ0NACithY19jdF9DWFggPSBAYWNfY3RfQ1hYQAorYWNfY3RfRjc3ID0gQGFjX2N0X0Y3N0AKK2FtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAorYW1fX2xlYWRpbmdfZG90ID0gQGFtX19sZWFkaW5nX2RvdEAKK2FtX19xdW90ZSA9IEBhbV9fcXVvdGVACithbV9fdGFyID0gQGFtX190YXJACithbV9fdW50YXIgPSBAYW1fX3VudGFyQAorYmluZGlyID0gQGJpbmRpckAKK2J1aWxkID0gQGJ1aWxkQAorYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACitidWlsZF9jcHUgPSBAYnVpbGRfY3B1QAorYnVpbGRfb3MgPSBAYnVpbGRfb3NACitidWlsZF92ZW5kb3IgPSBAYnVpbGRfdmVuZG9yQAorYnVpbGRkaXIgPSBAYnVpbGRkaXJACitkYXRhZGlyID0gQGRhdGFkaXJACitkYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKK2RvY2RpciA9IEBkb2NkaXJACitkdmlkaXIgPSBAZHZpZGlyQAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACitob3N0ID0gQGhvc3RACitob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACitob3N0X2NwdSA9IEBob3N0X2NwdUAKK2hvc3Rfb3MgPSBAaG9zdF9vc0AKK2hvc3RfdmVuZG9yID0gQGhvc3RfdmVuZG9yQAoraHRtbGRpciA9IEBodG1sZGlyQAoraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAoraW5mb2RpciA9IEBpbmZvZGlyQAoraW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAorbGliZGlyID0gQGxpYmRpckAKK2xpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKK2xvY2FsZWRpciA9IEBsb2NhbGVkaXJACitsb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACittYW5kaXIgPSBAbWFuZGlyQAorbWtkaXJfcCA9IEBta2Rpcl9wQAorb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAorcGRmZGlyID0gQHBkZmRpckAKK3ByZWZpeCA9IEBwcmVmaXhACitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACitwc2RpciA9IEBwc2RpckAKK3NiaW5kaXIgPSBAc2JpbmRpckAKK3NoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAorc3JjZGlyID0gQHNyY2RpckAKK3N5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKK3RhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACit0b3BfYnVpbGRfcHJlZml4ID0gQHRvcF9idWlsZF9wcmVmaXhACit0b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorCisjIE5lZWQgdG8gaW5jbHVkZSAuLi9zcmMgaW4gYWRkaXRpb24gdG8gdG9wX3NyY2RpciBiZWNhdXNlIGdjcnlwdC5oIGlzCisjIGEgYnVpbHQgaGVhZGVyLgorQU1fQ1BQRkxBR1MgPSAtSS4uL3NyYyAtSSQodG9wX3NyY2Rpcikvc3JjIAorQU1fQ0ZMQUdTID0gJChHUEdfRVJST1JfQ0ZMQUdTKQorbm9pbnN0X0xUTElCUkFSSUVTID0gbGlicmFuZG9tLmxhCitHQ1JZUFRfTU9EVUxFUyA9IEBHQ1JZUFRfUkFORE9NQAorbGlicmFuZG9tX2xhX0RFUEVOREVOQ0lFUyA9ICQoR0NSWVBUX01PRFVMRVMpCitsaWJyYW5kb21fbGFfTElCQUREID0gJChHQ1JZUFRfTU9EVUxFUykKK2xpYnJhbmRvbV9sYV9TT1VSQ0VTID0gcmFuZG9tLmMgcmFuZG9tLmggcmFuZC1pbnRlcm5hbC5oIFwKKwlyYW5kb20tY3Nwcm5nLmMgcmFuZG9tLWZpcHMuYyBybmRody5jICQoYW1fX2FwcGVuZF8xKQorRVhUUkFfbGlicmFuZG9tX2xhX1NPVVJDRVMgPSBcCitybmRsaW51eC5jIFwKK3JuZGVnZC5jIFwKK3JuZHVuaXguYyBcCitybmR3MzIuYyAKKworYWxsOiBhbGwtYW0KKworLlNVRkZJWEVTOgorLlNVRkZJWEVTOiAuYyAubG8gLm8gLm9iagorJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJQGZvciBkZXAgaW4gJD87IGRvIFwKKwkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAorCSAgICAqJCRkZXAqKSBcCisJICAgICAgKCBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2ggKSBcCisJICAgICAgICAmJiB7IGlmIHRlc3QgLWYgJEA7IHRoZW4gZXhpdCAwOyBlbHNlIGJyZWFrOyBmaTsgfTsgXAorCSAgICAgIGV4aXQgMTs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUgIHJhbmRvbS9NYWtlZmlsZSc7IFwKKwljZCAkKHRvcF9zcmNkaXIpICYmIFwKKwkgICQoQVVUT01BS0UpIC0tZ251ICByYW5kb20vTWFrZWZpbGUKKy5QUkVDSU9VUzogTWFrZWZpbGUKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwlAY2FzZSAnJD8nIGluIFwKKwkgICpjb25maWcuc3RhdHVzKikgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2g7OyBcCisJICAqKSBcCisJICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSknOyBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKKwllc2FjOworCiskKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKworJCh0b3Bfc3JjZGlyKS9jb25maWd1cmU6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCiskKEFDTE9DQUxfTTQpOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKworY2xlYW4tbm9pbnN0TFRMSUJSQVJJRVM6CisJLXRlc3QgLXogIiQobm9pbnN0X0xUTElCUkFSSUVTKSIgfHwgcm0gLWYgJChub2luc3RfTFRMSUJSQVJJRVMpCisJQGxpc3Q9JyQobm9pbnN0X0xUTElCUkFSSUVTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgZGlyPSJgZWNobyAkJHAgfCBzZWQgLWUgJ3N8L1teL10qJCR8fCdgIjsgXAorCSAgdGVzdCAiJCRkaXIiICE9ICIkJHAiIHx8IGRpcj0uOyBcCisJICBlY2hvICJybSAtZiBcIiQke2Rpcn0vc29fbG9jYXRpb25zXCIiOyBcCisJICBybSAtZiAiJCR7ZGlyfS9zb19sb2NhdGlvbnMiOyBcCisJZG9uZQorbGlicmFuZG9tLmxhOiAkKGxpYnJhbmRvbV9sYV9PQkpFQ1RTKSAkKGxpYnJhbmRvbV9sYV9ERVBFTkRFTkNJRVMpIAorCSQoTElOSykgICQobGlicmFuZG9tX2xhX09CSkVDVFMpICQobGlicmFuZG9tX2xhX0xJQkFERCkgJChMSUJTKQorCittb3N0bHljbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLiQoT0JKRVhUKQorCitkaXN0Y2xlYW4tY29tcGlsZToKKwktcm0gLWYgKi50YWIuYworCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcmFuZG9tLWNzcHJuZy5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3JhbmRvbS1kYWVtb24uUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9yYW5kb20tZmlwcy5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3JhbmRvbS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3JuZGVnZC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3JuZGh3LlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcm5kbGludXguUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9ybmR1bml4LlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcm5kdzMyLlBsb0BhbV9fcXVvdGVACisKKy5jLm86CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ09NUElMRSkgLWMgJDwKKworLmMub2JqOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCBgJChDWUdQQVRIX1cpICckPCdgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ09NUElMRSkgLWMgYCQoQ1lHUEFUSF9XKSAnJDwnYAorCisuYy5sbzoKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoTFRDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCAkPAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUGxvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTFRDT01QSUxFKSAtYyAtbyAkQCAkPAorCittb3N0bHljbGVhbi1saWJ0b29sOgorCS1ybSAtZiAqLmxvCisKK2NsZWFuLWxpYnRvb2w6CisJLXJtIC1yZiAubGlicyBfbGlicworCitJRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkgJChUQUdTX0ZJTEVTKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCW1raWQgLWZJRCAkJHVuaXF1ZQordGFnczogVEFHUworCitUQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCXRhZ3M9OyBcCisJaGVyZT1gcHdkYDsgXAorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCR0YWdzJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAorCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAorCSAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAorCSAgICAkJHRhZ3MgJCR1bmlxdWU7IFwKKwlmaQorY3RhZ3M6IENUQUdTCitDVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwl0YWdzPTsgXAorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwl0ZXN0IC16ICIkKENUQUdTX0FSR1MpJCR0YWdzJCR1bmlxdWUiIFwKKwkgIHx8ICQoQ1RBR1MpICQoQ1RBR1NGTEFHUykgJChBTV9DVEFHU0ZMQUdTKSAkKENUQUdTX0FSR1MpIFwKKwkgICAgICQkdGFncyAkJHVuaXF1ZQorCitHVEFHUzoKKwloZXJlPWAkKGFtX19jZCkgJCh0b3BfYnVpbGRkaXIpICYmIHB3ZGAgXAorCSAgJiYgY2QgJCh0b3Bfc3JjZGlyKSBcCisJICAmJiBndGFncyAtaSAkKEdUQUdTX0FSR1MpICQkaGVyZQorCitkaXN0Y2xlYW4tdGFnczoKKwktcm0gLWYgVEFHUyBJRCBHVEFHUyBHUlRBR1MgR1NZTVMgR1BBVEggdGFncworCitkaXN0ZGlyOiAkKERJU1RGSUxFUykKKwlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJdG9wc3JjZGlyc3RyaXA9YGVjaG8gIiQodG9wX3NyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCWxpc3Q9JyQoRElTVEZJTEVTKSc7IFwKKwkgIGRpc3RfZmlsZXM9YGZvciBmaWxlIGluICQkbGlzdDsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBcCisJICBzZWQgLWUgInN8XiQkc3JjZGlyc3RyaXAvfHw7dCIgXAorCSAgICAgIC1lICJzfF4kJHRvcHNyY2RpcnN0cmlwL3wkKHRvcF9idWlsZGRpcikvfDt0ImA7IFwKKwljYXNlICQkZGlzdF9maWxlcyBpbiBcCisJICAqLyopICQoTUtESVJfUCkgYGVjaG8gIiQkZGlzdF9maWxlcyIgfCBcCisJCQkgICBzZWQgJy9cLy8hZDtzfF58JChkaXN0ZGlyKS98O3MsL1teL10qJCQsLCcgfCBcCisJCQkgICBzb3J0IC11YCA7OyBcCisJZXNhYzsgXAorCWZvciBmaWxlIGluICQkZGlzdF9maWxlczsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJGZpbGUgfHwgdGVzdCAtZCAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAorCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKKwkgICAgZGlyPWBlY2hvICIvJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKKwkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCisJICAgICAgY3AgLXBSICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKSQkZGlyIHx8IGV4aXQgMTsgXAorCSAgICBmaTsgXAorCSAgICBjcCAtcFIgJCRkLyQkZmlsZSAkKGRpc3RkaXIpJCRkaXIgfHwgZXhpdCAxOyBcCisJICBlbHNlIFwKKwkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorY2hlY2stYW06IGFsbC1hbQorY2hlY2s6IGNoZWNrLWFtCithbGwtYW06IE1ha2VmaWxlICQoTFRMSUJSQVJJRVMpCitpbnN0YWxsZGlyczoKK2luc3RhbGw6IGluc3RhbGwtYW0KK2luc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCitpbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQordW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KKworaW5zdGFsbC1hbTogYWxsLWFtCisJQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KKworaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stYW0KK2luc3RhbGwtc3RyaXA6CisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKKwkgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAorCSAgYHRlc3QgLXogJyQoU1RSSVApJyB8fCBcCisJICAgIGVjaG8gIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciYCBpbnN0YWxsCittb3N0bHljbGVhbi1nZW5lcmljOgorCitjbGVhbi1nZW5lcmljOgorCitkaXN0Y2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKKworbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgorCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKKwlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCitjbGVhbjogY2xlYW4tYW0KKworY2xlYW4tYW06IGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBjbGVhbi1ub2luc3RMVExJQlJBUklFUyBcCisJbW9zdGx5Y2xlYW4tYW0KKworZGlzdGNsZWFuOiBkaXN0Y2xlYW4tYW0KKwktcm0gLXJmIC4vJChERVBESVIpCisJLXJtIC1mIE1ha2VmaWxlCitkaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIFwKKwlkaXN0Y2xlYW4tdGFncworCitkdmk6IGR2aS1hbQorCitkdmktYW06CisKK2h0bWw6IGh0bWwtYW0KKworaW5mbzogaW5mby1hbQorCitpbmZvLWFtOgorCitpbnN0YWxsLWRhdGEtYW06CisKK2luc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1hbQorCitpbnN0YWxsLWV4ZWMtYW06CisKK2luc3RhbGwtaHRtbDogaW5zdGFsbC1odG1sLWFtCisKK2luc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLWFtCisKK2luc3RhbGwtbWFuOgorCitpbnN0YWxsLXBkZjogaW5zdGFsbC1wZGYtYW0KKworaW5zdGFsbC1wczogaW5zdGFsbC1wcy1hbQorCitpbnN0YWxsY2hlY2stYW06CisKK21haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tYW0KKwktcm0gLXJmIC4vJChERVBESVIpCisJLXJtIC1mIE1ha2VmaWxlCittYWludGFpbmVyLWNsZWFuLWFtOiBkaXN0Y2xlYW4tYW0gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljCisKK21vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1hbQorCittb3N0bHljbGVhbi1hbTogbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1nZW5lcmljIFwKKwltb3N0bHljbGVhbi1saWJ0b29sCisKK3BkZjogcGRmLWFtCisKK3BkZi1hbToKKworcHM6IHBzLWFtCisKK3BzLWFtOgorCit1bmluc3RhbGwtYW06CisKKy5NQUtFOiBpbnN0YWxsLWFtIGluc3RhbGwtc3RyaXAKKworLlBIT05ZOiBDVEFHUyBHVEFHUyBhbGwgYWxsLWFtIGNoZWNrIGNoZWNrLWFtIGNsZWFuIGNsZWFuLWdlbmVyaWMgXAorCWNsZWFuLWxpYnRvb2wgY2xlYW4tbm9pbnN0TFRMSUJSQVJJRVMgY3RhZ3MgZGlzdGNsZWFuIFwKKwlkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tbGlidG9vbCBcCisJZGlzdGNsZWFuLXRhZ3MgZGlzdGRpciBkdmkgZHZpLWFtIGh0bWwgaHRtbC1hbSBpbmZvIGluZm8tYW0gXAorCWluc3RhbGwgaW5zdGFsbC1hbSBpbnN0YWxsLWRhdGEgaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZHZpIFwKKwlpbnN0YWxsLWR2aS1hbSBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtaHRtbCBcCisJaW5zdGFsbC1odG1sLWFtIGluc3RhbGwtaW5mbyBpbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1tYW4gXAorCWluc3RhbGwtcGRmIGluc3RhbGwtcGRmLWFtIGluc3RhbGwtcHMgaW5zdGFsbC1wcy1hbSBcCisJaW5zdGFsbC1zdHJpcCBpbnN0YWxsY2hlY2sgaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIFwKKwltYWludGFpbmVyLWNsZWFuIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBcCisJbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wgXAorCXBkZiBwZGYtYW0gcHMgcHMtYW0gdGFncyB1bmluc3RhbGwgdW5pbnN0YWxsLWFtCisKKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9yYW5kb20vcmFuZC1pbnRlcm5hbC5oIGIvbGliZ2NyeXB0LTEuNC42L3JhbmRvbS9yYW5kLWludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM0ZDgyOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9yYW5kb20vcmFuZC1pbnRlcm5hbC5oCkBAIC0wLDAgKzEsMTM3IEBACisvKiByYW5kLWludGVybmFsLmggLSBoZWFkZXIgdG8gZ2x1ZSB0aGUgcmFuZG9tIGZ1bmN0aW9ucworICoJQ29weXJpZ2h0IChDKSAxOTk4LCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIGdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIEcxMF9SQU5EX0lOVEVSTkFMX0gKKyNkZWZpbmUgRzEwX1JBTkRfSU5URVJOQUxfSAorCisjaW5jbHVkZSAiLi4vc3JjL2NpcGhlci1wcm90by5oIgorCisvKiBDb25zdGFudHMgdXNlZCB0byBkZWZpbmUgdGhlIG9yaWdpbiBvZiByYW5kb20gYWRkZWQgdG8gdGhlIHBvb2wuCisgICBUaGUgY29kZSBpcyBzZW5zaXRpdmUgdG8gdGhlIG9yZGVyIG9mIHRoZSB2YWx1ZXMuICAqLworZW51bSByYW5kb21fb3JpZ2lucyAKKyAgeworICAgIFJBTkRPTV9PUklHSU5fSU5JVCA9IDAsICAgICAgLyogVXNlZCBvbmx5IGZvciBpbml0aWFsaXphdGlvbi4gKi8KKyAgICBSQU5ET01fT1JJR0lOX0VYVEVSTkFMID0gMSwgIC8qIEFkZGVkIGZyb20gYW4gZXh0ZXJuYWwgc291cmNlLiAgKi8KKyAgICBSQU5ET01fT1JJR0lOX0ZBU1RQT0xMID0gMiwgIC8qIEZhc3QgcmFuZG9tIHBvbGwgZnVuY3Rpb24uICAqLworICAgIFJBTkRPTV9PUklHSU5fU0xPV1BPTEwgPSAzLCAgLyogU2xvdyBwb2xsIGZ1bmN0aW9uLiAgKi8KKyAgICBSQU5ET01fT1JJR0lOX0VYVFJBUE9MTCA9IDQgIC8qIFVzZWQgdG8gbWFyayBhbiBleHRyYSBwb29sIHNlZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1ZSB0byBhIEdDUllfVkVSWV9TVFJPTkdfUkFORE9NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gcmVxdWVzdC4gICovCisgIH07CisKKworCisvKi0tIHJhbmRvbS5jIC0tKi8KK3ZvaWQgX2djcnlfcmFuZG9tX3Byb2dyZXNzIChjb25zdCBjaGFyICp3aGF0LCBpbnQgcHJpbnRjaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjdXJyZW50LCBpbnQgdG90YWwpOworCisKKy8qLS0gcmFuZG9tLWNzcHJuZy5jIC0tKi8KK3ZvaWQgX2djcnlfcm5nY3Nwcm5nX2luaXRpYWxpemUgKGludCBmdWxsKTsKK3ZvaWQgX2djcnlfcm5nY3Nwcm5nX2R1bXBfc3RhdHMgKHZvaWQpOwordm9pZCBfZ2NyeV9ybmdjc3Bybmdfc2VjdXJlX2FsbG9jICh2b2lkKTsKK3ZvaWQgX2djcnlfcm5nY3Nwcm5nX2VuYWJsZV9xdWlja19nZW4gKHZvaWQpOwordm9pZCBfZ2NyeV9ybmdjc3Bybmdfc2V0X2RhZW1vbl9zb2NrZXQgKGNvbnN0IGNoYXIgKnNvY2tldG5hbWUpOworaW50ICBfZ2NyeV9ybmdjc3BybmdfdXNlX2RhZW1vbiAoaW50IG9ub2ZmKTsKK2ludCAgX2djcnlfcm5nY3Nwcm5nX2lzX2Zha2VkICh2b2lkKTsKK2djcnlfZXJyb3JfdCBfZ2NyeV9ybmdjc3BybmdfYWRkX2J5dGVzIChjb25zdCB2b2lkICpidWYsIHNpemVfdCBidWZsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHF1YWxpdHkpOwordm9pZCAqX2djcnlfcm5nY3Nwcm5nX2dldF9ieXRlcyAoc2l6ZV90IG5ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gZ2NyeV9yYW5kb21fbGV2ZWwgbGV2ZWwpOwordm9pZCAqX2djcnlfcm5nY3Nwcm5nX2dldF9ieXRlc19zZWN1cmUgKHNpemVfdCBuYnl0ZXMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gZ2NyeV9yYW5kb21fbGV2ZWwgbGV2ZWwpOwordm9pZCBfZ2NyeV9ybmdjc3BybmdfcmFuZG9taXplICh2b2lkICpidWZmZXIsIHNpemVfdCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gZ2NyeV9yYW5kb21fbGV2ZWwgbGV2ZWwpOwordm9pZCBfZ2NyeV9ybmdjc3Bybmdfc2V0X3NlZWRfZmlsZSAoY29uc3QgY2hhciAqbmFtZSk7Cit2b2lkIF9nY3J5X3JuZ2NzcHJuZ191cGRhdGVfc2VlZF9maWxlICh2b2lkKTsKK3ZvaWQgX2djcnlfcm5nY3Nwcm5nX2Zhc3RfcG9sbCAodm9pZCk7Cit2b2lkIF9nY3J5X3JuZ2NzcHJuZ19jcmVhdGVfbm9uY2UgKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCk7CisKKy8qLS0gcmFuZG9tLXJuZ2NzcHJuZy5jIC0tKi8KK3ZvaWQgX2djcnlfcm5nZmlwc19pbml0aWFsaXplIChpbnQgZnVsbCk7Cit2b2lkIF9nY3J5X3JuZ2ZpcHNfZHVtcF9zdGF0cyAodm9pZCk7CitpbnQgIF9nY3J5X3JuZ2ZpcHNfaXNfZmFrZWQgKHZvaWQpOworZ2NyeV9lcnJvcl90IF9nY3J5X3JuZ2ZpcHNfYWRkX2J5dGVzIChjb25zdCB2b2lkICpidWYsIHNpemVfdCBidWZsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHF1YWxpdHkpOwordm9pZCAqX2djcnlfcm5nZmlwc19nZXRfYnl0ZXMgKHNpemVfdCBuYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBnY3J5X3JhbmRvbV9sZXZlbCBsZXZlbCk7Cit2b2lkICpfZ2NyeV9ybmdmaXBzX2dldF9ieXRlc19zZWN1cmUgKHNpemVfdCBuYnl0ZXMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGdjcnlfcmFuZG9tX2xldmVsIGxldmVsKTsKK3ZvaWQgX2djcnlfcm5nZmlwc19yYW5kb21pemUgKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBnY3J5X3JhbmRvbV9sZXZlbCBsZXZlbCk7Cit2b2lkIF9nY3J5X3JuZ2ZpcHNfY3JlYXRlX25vbmNlICh2b2lkICpidWZmZXIsIHNpemVfdCBsZW5ndGgpOworCitnY3J5X2Vycm9yX3QgX2djcnlfcm5nZmlwc19zZWxmdGVzdCAoc2VsZnRlc3RfcmVwb3J0X2Z1bmNfdCByZXBvcnQpOworCitnY3J5X2Vycl9jb2RlX3QgX2djcnlfcm5nZmlwc19pbml0X2V4dGVybmFsX3Rlc3QgKHZvaWQgKipyX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qga2V5bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpzZWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2VlZGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqZHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkdGxlbik7CitnY3J5X2Vycl9jb2RlX3QgX2djcnlfcm5nZmlwc19ydW5fZXh0ZXJuYWxfdGVzdCAodm9pZCAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpidWZmZXIsIHNpemVfdCBidWZsZW4pOwordm9pZCBfZ2NyeV9ybmdmaXBzX2RlaW5pdF9leHRlcm5hbF90ZXN0ICh2b2lkICpjb250ZXh0KTsKKworCisKKworCisvKi0tIHJuZGxpbnV4LmMgLS0qLworaW50IF9nY3J5X3JuZGxpbnV4X2dhdGhlcl9yYW5kb20gKHZvaWQgKCphZGQpIChjb25zdCB2b2lkICosIHNpemVfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSByYW5kb21fb3JpZ2lucyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gcmFuZG9tX29yaWdpbnMgb3JpZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgsIGludCBsZXZlbCk7CisKKy8qLS0gcm5kdW5peC5jIC0tKi8KK2ludCBfZ2NyeV9ybmR1bml4X2dhdGhlcl9yYW5kb20gKHZvaWQgKCphZGQpIChjb25zdCB2b2lkICosIHNpemVfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIHJhbmRvbV9vcmlnaW5zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gcmFuZG9tX29yaWdpbnMgb3JpZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCwgaW50IGxldmVsKTsKKworLyotLSBybmRlbGcuYyAtLSovCitpbnQgX2djcnlfcm5kZWdkX2dhdGhlcl9yYW5kb20gKHZvaWQgKCphZGQpIChjb25zdCB2b2lkICosIHNpemVfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gcmFuZG9tX29yaWdpbnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIHJhbmRvbV9vcmlnaW5zIG9yaWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCwgaW50IGxldmVsKTsKK2ludCBfZ2NyeV9ybmRlZ2RfY29ubmVjdF9zb2NrZXQgKGludCBub2ZhaWwpOworCisvKi0tIHJuZHczMi5jIC0tKi8KK2ludCBfZ2NyeV9ybmR3MzJfZ2F0aGVyX3JhbmRvbSAodm9pZCAoKmFkZCkgKGNvbnN0IHZvaWQgKiwgc2l6ZV90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSByYW5kb21fb3JpZ2lucyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gcmFuZG9tX29yaWdpbnMgb3JpZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoLCBpbnQgbGV2ZWwpOwordm9pZCBfZ2NyeV9ybmR3MzJfZ2F0aGVyX3JhbmRvbV9mYXN0ICh2b2lkICgqYWRkKShjb25zdCB2b2lkKiwgc2l6ZV90LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSByYW5kb21fb3JpZ2lucyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gcmFuZG9tX29yaWdpbnMgb3JpZ2luICk7CisKKy8qLS0gcm5kaHcuYyAtLSovCitpbnQgX2djcnlfcm5kaHdfZmFpbGVkX3AgKHZvaWQpOwordm9pZCBfZ2NyeV9ybmRod19wb2xsX2Zhc3QgKHZvaWQgKCphZGQpKGNvbnN0IHZvaWQqLCBzaXplX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSByYW5kb21fb3JpZ2lucyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSByYW5kb21fb3JpZ2lucyBvcmlnaW4pOworc2l6ZV90IF9nY3J5X3JuZGh3X3BvbGxfc2xvdyAodm9pZCAoKmFkZCkoY29uc3Qgdm9pZCosIHNpemVfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gcmFuZG9tX29yaWdpbnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSByYW5kb21fb3JpZ2lucyBvcmlnaW4pOworCisKKworI2VuZGlmIC8qRzEwX1JBTkRfSU5URVJOQUxfSCovCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvcmFuZG9tL3JhbmRvbS1jc3BybmcuYyBiL2xpYmdjcnlwdC0xLjQuNi9yYW5kb20vcmFuZG9tLWNzcHJuZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYTk3N2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvcmFuZG9tL3JhbmRvbS1jc3BybmcuYwpAQCAtMCwwICsxLDEzOTcgQEAKKy8qIHJhbmRvbS1jc3BybmcuYyAtIENTUFJORyBzdHlsZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciAobGliZ2NyeXB0IGNsYXNzaWMpCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgsIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsCisgKiAgICAgICAgICAgICAgIDIwMDcsIDIwMDggIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisvKgorICAgVGhpcyByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBpcyBtb2RlbGxlZCBhZnRlciB0aGUgb25lIGRlc2NyaWJlZCBpbgorICAgUGV0ZXIgR3V0bWFubidzIDE5OTggVXNlbml4IFNlY3VyaXR5IFN5bXBvc2l1bSBwYXBlcjogIlNvZnR3YXJlCisgICBHZW5lcmF0aW9uIG9mIFByYWN0aWNhbGx5IFN0cm9uZyBSYW5kb20gTnVtYmVycyIuICBTZWUgYWxzbyBjaGFwdGVyCisgICA2IGluIGhpcyBib29rICJDcnlwdG9ncmFwaGljIFNlY3VyaXR5IEFyY2hpdGVjdHVyZSIsIE5ldyBZb3JrLAorICAgMjAwNCwgSVNCTiAwLTM4Ny05NTM4Ny02LgorCisgICBOb3RlIHRoYXQgdGhlIGFjcm9ueW0gQ1NQUk5HIHN0YW5kcyBmb3IgIkNvbnRpbnVvdXNseSBTZWVkZWQKKyAgIFBzZXVkb1JhbmRvbSBOdW1iZXIgR2VuZXJhdG9yIiBhcyB1c2VkIGluIFBldGVyJ3MgaW1wbGVtZW50YXRpb24gb2YKKyAgIHRoZSBwYXBlciBhbmQgbm90IG9ubHkgZm9yICJDcnlwdG9ncmFwaGljYWxseSBTZWN1cmUgUHNldWRvUmFuZG9tCisgICBOdW1iZXIgR2VuZXJhdG9yIi4KKyAqLworCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2lmZGVmCUhBVkVfR0VUSFJUSU1FCisjaW5jbHVkZSA8c3lzL3RpbWVzLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX0dFVFRJTUVPRkRBWQorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX0dFVFJVU0FHRQorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2VuZGlmCisjaWZkZWYgX19NSU5HVzMyX18KKyNpbmNsdWRlIDxwcm9jZXNzLmg+CisjZW5kaWYKKyNpbmNsdWRlICJnMTBsaWIuaCIKKyNpbmNsdWRlICIuLi9jaXBoZXIvcm1kLmgiCisjaW5jbHVkZSAicmFuZG9tLmgiCisjaW5jbHVkZSAicmFuZC1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImNpcGhlci5oIiAvKiBSZXF1aXJlZCBmb3IgdGhlIHJtZDE2MF9oYXNoX2J1ZmZlcigpIHByb3RvdHlwZS4gICovCisjaW5jbHVkZSAiYXRoLmgiCisKKyNpZm5kZWYgUkFORF9NQVggICAvKiBGb3IgU3VuT1MuICovCisjZGVmaW5lIFJBTkRfTUFYIDMyNzY3CisjZW5kaWYKKworLyogQ2hlY2sgd2hldGhlciB3ZSBjYW4gbG9jayB0aGUgc2VlZCBmaWxlIHJlYWQgd3JpdGUuICovCisjaWYgZGVmaW5lZChIQVZFX0ZDTlRMKSAmJiBkZWZpbmVkKEhBVkVfRlRSVU5DQVRFKSAmJiAhZGVmaW5lZChIQVZFX1czMl9TWVNURU0pCisjZGVmaW5lIExPQ0tfU0VFRF9GSUxFIDEKKyNlbHNlCisjZGVmaW5lIExPQ0tfU0VFRF9GSUxFIDAKKyNlbmRpZgorCisvKiBEZWZpbmUgdGhlIGNvbnN0YW50IHdlIHVzZSBmb3IgdHJhbnNmb3JtaW5nIHRoZSBwb29sIGF0IHJlYWQtb3V0LiAqLworI2lmIFNJWkVPRl9VTlNJR05FRF9MT05HID09IDgKKyNkZWZpbmUgQUREX1ZBTFVFIDB4YTVhNWE1YTVhNWE1YTVhNQorI2VsaWYgU0laRU9GX1VOU0lHTkVEX0xPTkcgPT0gNAorI2RlZmluZSBBRERfVkFMVUUgMHhhNWE1YTVhNQorI2Vsc2UKKyNlcnJvciB3ZWlyZCBzaXplIGZvciBhbiB1bnNpZ25lZCBsb25nCisjZW5kaWYKKworLyogQ29udHN0YW50cyBwZXJ0YWluaW5nIHRvIHRoZSBoYXNoIHBvb2wuICovCisjZGVmaW5lIEJMT0NLTEVOICA2NCAgIC8qIEhhc2ggdGhpcyBhbW91bnQgb2YgYnl0ZXMuLi4gKi8KKyNkZWZpbmUgRElHRVNUTEVOIDIwICAgLyogLi4uIGludG8gYSBkaWdlc3Qgb2YgdGhpcyBsZW5ndGggKHJtZDE2MCkuICovCisvKiBQT09MQkxPQ0tTIGlzIHRoZSBudW1iZXIgb2YgZGlnZXN0cyB3aGljaCBtYWtlIHVwIHRoZSBwb29sLiAgKi8KKyNkZWZpbmUgUE9PTEJMT0NLUyAzMAorLyogUE9PTFNJWkUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBkaWdlc3QgbGVuZ3RoIHRvIG1ha2UgdGhlIEFORAorICAgb3BlcmF0aW9ucyBmYXN0ZXIsIHRoZSBzaXplIHNob3VsZCBhbHNvIGJlIGEgbXVsdGlwbGUgb2YgdW5zaWduZWQKKyAgIGxvbmcuICAqLworI2RlZmluZSBQT09MU0laRSAoUE9PTEJMT0NLUypESUdFU1RMRU4pCisjaWYgKFBPT0xTSVpFICUgU0laRU9GX1VOU0lHTkVEX0xPTkcpCisjZXJyb3IgUGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHBvb2xzaXplIGlzIGEgbXVsdGlwbGUgb2YgdW5zaWduZWQgbG9uZworI2VuZGlmCisjZGVmaW5lIFBPT0xXT1JEUyAoUE9PTFNJWkUgLyBTSVpFT0ZfVU5TSUdORURfTE9ORykKKworCisvKiBSTkRQT09MIGlzIHRoZSBwb29sIHdlIHVzZSB0byBjb2xsZWN0IHRoZSBlbnRyb3B5IGFuZCB0byBzdGlyIGl0CisgICB1cC4gIEl0cyBhbGxvY2F0ZWQgc2l6ZSBpcyBQT09MU0laRStCTE9DS0xFTi4gIE5vdGUgdGhhdCB0aGlzIGlzCisgICBhbHNvIGFuIGluZGljYXRpb24gb24gd2hldGhlciB0aGUgbW9kdWxlIGhhcyBiZWVuIGZ1bGx5CisgICBpbml0aWFsaXplZC4gKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpybmRwb29sOwkKKworLyogS0VZUE9PTCBpcyB1c2VkIGFzIGEgc2NyYXRjaCBjb3B5IHRvIHJlYWQgb3V0IHJhbmRvbSBmcm9tIFJORFBPT0wuCisgICBJdHMgYWxsb2NhdGVkIHNpemUgaXMgYWxzbyBQT09MU0laRStCTE9DS0xFTi4gICovCitzdGF0aWMgdW5zaWduZWQgY2hhciAqa2V5cG9vbDsJCisKKy8qIFRoaXMgaXMgdGhlIG9mZnNldCBpbnRvIFJORFBPT0wgd2hlcmUgdGhlIG5leHQgcmFuZG9tIGJ5dGVzIGFyZSB0bworICAgYmUgbWl4ZWQgaW4uICAqLworc3RhdGljIHNpemVfdCBwb29sX3dyaXRlcG9zOworCisvKiBXaGVuIHJlYWRpbmcgZGF0YSBvdXQgb2YgS0VZUE9PTCwgd2Ugc3RhcnQgdGhlIHJlYWQgYXQgZGlmZmVyZW50CisgICBwb3NpdGlvbnMuICBUaGlzIHZhcmlhYmxlIGtlZXBzIHRyYWNrIG9uIHdoZXJlIHRvIHJlYWQgbmV4dC4gICovCitzdGF0aWMgc2l6ZV90IHBvb2xfcmVhZHBvczsKKworLyogVGhpcyBmbGFnIGlzIHNldCB0byB0cnVlIGFzIHNvb24gYXMgdGhlIHBvb2wgaGFzIGJlZW4gY29tcGxldGVseQorICAgZmlsbGVkIHRoZSBmaXJzdCB0aW1lLiAgVGhpcyBtYXkgaGFwcGVuIGVpdGhlciBieSByZXJlYWRpbmcgYSBzZWVkCisgICBmaWxlIG9yIGJ5IGFkZGluZyBlbm91Z2ggZW50cm9weS4gICovCitzdGF0aWMgaW50IHBvb2xfZmlsbGVkOworCisvKiBUaGlzIGNvdW50ZXIgaXMgdXNlZCB0byB0cmFjayB3aGV0aGVyIHRoZSBpbml0aWFsIHNlZWRpbmcgaGFzIGJlZW4KKyAgIGRvbmUgd2l0aCBlbm91Z2ggYnl0ZXMgZnJvbSBhIHJlbGlhYmxlIGVudHJvcHkgc291cmNlLiAgKi8KK3N0YXRpYyBzaXplX3QgcG9vbF9maWxsZWRfY291bnRlcjsKKworLyogSWYgcmFuZG9tIG9mIGxldmVsIEdDUllfVkVSWV9TVFJPTkdfUkFORE9NIGhhcyBiZWVuIHJlcXVlc3RlZCB3ZQorICAgaGF2ZSBzdHJpY3RlciByZXF1aXJlbWVudHMgb24gd2hhdCBraW5kIG9mIGVudHJvcHkgaXMgaW4gdGhlIHBvb2wuCisgICBJbiBwYXJ0aWN1bGFyIFBPT0xfRklMTEVEIGlzIG5vdCBzdWZmaWNpZW50LiAgVGh1cyB3ZSBhZGQgc29tZQorICAgZXh0cmEgc2VlZGluZyBhbmQgc2V0IHRoaXMgZmxhZyB0byB0cnVlIGlmIHRoZSBleHRyYSBzZWVkaW5nIGhhcworICAgYmVlbiBkb25lLiAgKi8KK3N0YXRpYyBpbnQgZGlkX2luaXRpYWxfZXh0cmFfc2VlZGluZzsKKworLyogVGhpcyB2YXJpYWJsZSBpcyB1c2VkIHRvIGVzdGltYXRlZCB0aGUgYW1vdW50IG9mIGZyZXNoIGVudHJvcHkKKyAgIGF2YWlsYWJsZSBpbiBSTkRQT09MLiAgKi8KK3N0YXRpYyBpbnQgcG9vbF9iYWxhbmNlOworCisvKiBBZnRlciBhIG1peGluZyBvcGVyYXRpb24gdGhpcyB2YXJpYWJsZSB3aWxsIGJlIHNldCB0byB0cnVlIGFuZAorICAgY2xlYXJlZCBpZiBuZXcgZW50cm9weSBoYXMgYmVlbiBhZGRlZCBvciBhIHJlbWl4IGlzIHJlcXVpcmVkIGZvcgorICAgb3RlaHIgcmVhc29ucy4gICovCitzdGF0aWMgaW50IGp1c3RfbWl4ZWQ7CisKKy8qIFRoZSBuYW1lIG9mIHRoZSBzZWVkIGZpbGUgb3IgTlVMTCBpZiBubyBzZWVkIGZpbGUgaGFzIGJlZW4gZGVmaW5lZC4KKyAgIFRoZSBzZWVkIGZpbGUgbmVlZHMgdG8gYmUgcmVnc2l0ZXJlZCBhdCBpbml0aWFsaWF0aW9uIHRpbWUuICBXZQorICAga2VlcCBhIG1hbGxvY2VkIGNvcHkgaGVyZS4gICovCitzdGF0aWMgY2hhciAqc2VlZF9maWxlX25hbWU7CisKKy8qIElmIGEgc2VlZCBmaWxlIGhhcyBiZWVuIHJlZ2lzdGVyZWQgYW5kIG1heWJlIHVwZGF0ZWQgb24gZXhpdCB0aGlzCisgICBmbGFnIHNldC4gKi8KK3N0YXRpYyBpbnQgYWxsb3dfc2VlZF9maWxlX3VwZGF0ZTsKKworLyogT3B0aW9uIGZsYWcgc2V0IGF0IGluaXRpYWxpYXRpb24gdGltZSB0byBmb3JjZSBhbGxvY2F0aW9uIG9mIHRoZQorICAgcG9vbCBpbiBzZWN1cmUgbWVtb3J5LiAgKi8KK3N0YXRpYyBpbnQgc2VjdXJlX2FsbG9jOworCisvKiBUaGlzIGZ1bmN0aW9uIHBvaW50ZXIgaXMgc2V0IHRvIHRoZSBhY3R1YWwgZW50cm9weSBnYXRoZXJpbmcKKyAgIGZ1bmN0aW9uIGR1cmluZyBpbml0YWlsaXphdGlvbi4gIEFmdGVyIGluaXRpYWxpemF0aW9uIGl0IGlzCisgICBndWFyYW50ZWVkIHRvIHBvaW50IHRvIGZ1bmN0aW9uLiAgKE9uIHN5c3RlbXMgd2l0aG91dCBhIHJhbmRvbQorICAgZ2F0aGVyZXIgbW9kdWxlIGEgZHVtbXkgZnVuY3Rpb24gaXMgdXNlZCkuKi8KK3N0YXRpYyBpbnQgKCpzbG93X2dhdGhlcl9mbmMpKHZvaWQgKCopKGNvbnN0IHZvaWQqLCBzaXplX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIHJhbmRvbV9vcmlnaW5zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gcmFuZG9tX29yaWdpbnMsIHNpemVfdCwgaW50KTsKKworLyogVGhpcyBmdW5jdGlvbiBpcyBzZXQgdG8gdGhlIGFjdHVhbCBmYXN0IGVudHJvcHkgZ2F0aGVyaW5nIGZ1Y250aW9uCisgICBkdXJpbmcgaW5pdGlhbGl6YXRpb24uICBJZiBpdCBpcyBOVUxMLCBubyBzdWNoIGZ1bmN0aW9uIGlzCisgICBhdmFpbGFibGUuICovCitzdGF0aWMgdm9pZCAoKmZhc3RfZ2F0aGVyX2ZuYykodm9pZCAoKikoY29uc3Qgdm9pZCosIHNpemVfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIHJhbmRvbV9vcmlnaW5zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIHJhbmRvbV9vcmlnaW5zKTsKKworCisvKiBPcHRpb24gZmxhZyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQgdGhlIHRlc3Qgc3VpdGUuICBJZiBzZXQKKyAgIHJlcXVlc3RzIGZvciB2ZXJ5IHN0cm9uZyByYW5kb20gYXJlIGRlZ3JhZGVkIHRvIHN0cm9uZyByYW5kb20uICBOb3QKKyAgIHVzZWQgYnkgcmVndWxhciBhcHBsaWNhdGlvbnMuICAqLworc3RhdGljIGludCBxdWlja190ZXN0OworCisvKiBPbiBzeXN0ZW1zIHdpdGhvdXQgZW50cm9weSBnYXRoZXJpbmcgbW9kdWxlcywgdGhpcyBmbGFnIGlzIHNldCB0bworICAgaW5kaWNhdGUgdGhhdCB0aGUgcmFuZG9tIGdlbmVyYXRvciBpcyBub3Qgd29ya2luZyBwcm9wZXJseS4gIEEKKyAgIHdhcm5pbmcgbWVzc2FnZSBpcyBpc3N1ZWQgYXMgd2VsbC4gIFRoaXMgaXMgdXNlZnVsIG9ubHkgZm9yCisgICBkZWJ1Z2dpbmcgYW5kIGR1cmluZyBkZXZlbG9wbWVudC4gICovCitzdGF0aWMgaW50IGZha2VkX3JuZzsKKworLyogVGhpcyBpcyB0aGUgbG9jayB3ZSB1c2UgdG8gcHJvdGVjdCBhbGwgcG9vbCBvcGVyYXRpb25zLiAgKi8KK3N0YXRpYyBhdGhfbXV0ZXhfdCBwb29sX2xvY2sgPSBBVEhfTVVURVhfSU5JVElBTElaRVI7CisKKy8qIFRoaXMgaXMgYSBoZWxwZXIgZm9yIGFzc2VydCBjYWxscy4gIFRoZXNlIGNhbGxzIGFyZSB1c2VkIHRvIGFzc2VydAorICAgdGhhdCBmdW5jdGlvbnMgYXJlIGNhbGxlZCBpbiBhIGxvY2tlZCBzdGF0ZS4gIEl0IGlzIG5vdCBtZWFudCB0byBiZQorICAgdGhyZWFkLXNhZmUgYnV0IGFzIGEgbWV0aG9kIHRvIGdldCBhd2FyZSBvZiBtaXNzaW5nIGxvY2tzIGluIHRoZQorICAgdGVzdCBzdWl0ZS4gICovCitzdGF0aWMgaW50IHBvb2xfaXNfbG9ja2VkOworCisvKiBUaGlzIGlzIHRoZSBsb2NrIHdlIHVzZSB0byBwcm90ZWN0IHRoZSBidWZmZXIgdXNlZCBieSB0aGUgbm9uY2UKKyAgIGdlbmVyYXRpb24uICAqLworc3RhdGljIGF0aF9tdXRleF90IG5vbmNlX2J1ZmZlcl9sb2NrID0gQVRIX01VVEVYX0lOSVRJQUxJWkVSOworCisKKy8qIFdlIGtlZXAgc29tZSBjb3VudGVycyBpbiB0aGlzIHN0cnVjdHVyZSBmb3IgdGhlIHNha2Ugb2YgdGhlCisgICBfZ2NyeV9yYW5kb21fZHVtcF9zdGF0cyAoKSBmdW5jdGlvbi4gICovCitzdGF0aWMgc3RydWN0Cit7CisgIHVuc2lnbmVkIGxvbmcgbWl4cm5kOworICB1bnNpZ25lZCBsb25nIG1peGtleTsKKyAgdW5zaWduZWQgbG9uZyBzbG93cG9sbHM7CisgIHVuc2lnbmVkIGxvbmcgZmFzdHBvbGxzOworICB1bnNpZ25lZCBsb25nIGdldGJ5dGVzMTsKKyAgdW5zaWduZWQgbG9uZyBuZ2V0Ynl0ZXMxOworICB1bnNpZ25lZCBsb25nIGdldGJ5dGVzMjsKKyAgdW5zaWduZWQgbG9uZyBuZ2V0Ynl0ZXMyOworICB1bnNpZ25lZCBsb25nIGFkZGJ5dGVzOworICB1bnNpZ25lZCBsb25nIG5hZGRieXRlczsKK30gcm5kc3RhdHM7CisKKworCisvKiAtLS0gU3R1ZmYgcGVydGFpbmluZyB0byB0aGUgcmFuZG9tIGRhZW1vbiBzdXBwb3J0LiAtLS0gKi8KKyNpZmRlZiBVU0VfUkFORE9NX0RBRU1PTgorCisvKiBJZiBBTExPV19EQUVNT04gaXMgdHJ1ZSwgdGhlIG1vZHVsZSB3aWxsIHRyeSB0byB1c2UgdGhlIHJhbmRvbQorICAgZGFlbW9uIGZpcnN0LiAgSWYgdGhlIGRhZW1vbiBoYXMgZmFpbGVkLCB0aGlzIHZhcmlhYmxlIGlzIHNldCB0bworICAgYmFjayB0byBmYWxzZSBhbmQgdGhlIGNvZGUgY29udGludWVzIGFzIG5vcm1hbC4gIE5vdGUsIHdlIGRvbid0CisgICB0ZXN0IHRoaXMgZmxhZyBpbiBhIGxvY2tlZCBzdGF0ZSBiZWNhdXNlIGEgd3JvbmcgdmFsdWUgZG9lcyBub3QKKyAgIGhhcm0gYW5kIHRoZSB0cmhlYWQgd2lsbCBmaW5kIG91dCBpdHNlbGYgdGhhdCB0aGUgZGFlbW9uIGRvZXMgbm90CisgICB3b3JrIGFuZCBzZXQgaXQgKGFnYWluKSB0byBmYWxzZS4gICovCitzdGF0aWMgaW50IGFsbG93X2RhZW1vbjsgICAgICAgCisKKy8qIER1cmluZyBpbml0aWFsaXphdGlvbiwgdGhlIHVzZXIgbWF5IHNldCBhIG5vbi1kZWZhdWx0IHNvY2tldCBuYW1lCisgICBmb3IgYWNjZXNzaW5nIHRoZSByYW5kb20gZGFlbW9uLiAgSWYgdGhpcyB2YWx1ZSBpcyBOVUxMLCB0aGUKKyAgIGRlZmF1bHQgbmFtZSB3aWxsIGJlIHVzZWQuICovCitzdGF0aWMgY2hhciAqZGFlbW9uX3NvY2tldF9uYW1lOworCisjZW5kaWYgLypVU0VfUkFORE9NX0RBRU1PTiovCisKKworCisvKiAtLS0gIFByb3RvdHlwZXMgIC0tLSAqLworc3RhdGljIHZvaWQgcmVhZF9wb29sIChieXRlICpidWZmZXIsIHNpemVfdCBsZW5ndGgsIGludCBsZXZlbCApOworc3RhdGljIHZvaWQgYWRkX3JhbmRvbW5lc3MgKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSByYW5kb21fb3JpZ2lucyBvcmlnaW4pOworc3RhdGljIHZvaWQgcmFuZG9tX3BvbGwgKHZvaWQpOworc3RhdGljIHZvaWQgZG9fZmFzdF9yYW5kb21fcG9sbCAodm9pZCk7CitzdGF0aWMgaW50ICgqZ2V0Zm5jX2dhdGhlcl9yYW5kb20gKHZvaWQpKSh2b2lkICgqKShjb25zdCB2b2lkKiwgc2l6ZV90LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gcmFuZG9tX29yaWdpbnMpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gcmFuZG9tX29yaWdpbnMsIHNpemVfdCwgaW50KTsKK3N0YXRpYyB2b2lkICgqZ2V0Zm5jX2Zhc3RfcmFuZG9tX3BvbGwgKHZvaWQpKSh2b2lkICgqKShjb25zdCB2b2lkKiwgc2l6ZV90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gcmFuZG9tX29yaWdpbnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gcmFuZG9tX29yaWdpbnMpOworc3RhdGljIHZvaWQgcmVhZF9yYW5kb21fc291cmNlIChlbnVtIHJhbmRvbV9vcmlnaW5zIG9yaWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCwgaW50IGxldmVsKTsKK3N0YXRpYyBpbnQgZ2F0aGVyX2Zha2VkICh2b2lkICgqYWRkKShjb25zdCB2b2lkKiwgc2l6ZV90LCBlbnVtIHJhbmRvbV9vcmlnaW5zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIHJhbmRvbV9vcmlnaW5zLCBzaXplX3QgbGVuZ3RoLCBpbnQgbGV2ZWwgKTsKKworCisMCisvKiAtLS0gIEZ1bmN0aW9ucyAgLS0tICovCisKKworLyogQmFzaWMgaW5pdGlhbGl6YXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gaW5pdGlhbGl6ZSBtdXRleGVzIGFuZAorICAgc3VjaC4gIEl0IGRvZXMgbm90IHJ1biBhIGZ1bGwgaW5pdGlhbGl6YXRpb24gc28gdGhhdCB0aGUgZmlsbGluZyBvZgorICAgdGhlIHJhbmRvbSBwb29sIGNhbiBiZSBkZWxheWVkIHVudGlsIGl0IGlzIGFjdHVhbGx5IG5lZWRlZC4gIFdlCisgICBhc3N1bWUgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgYmVmb3JlIGFueSBjb25jdXJyZW50IGFjY2VzcworICAgaGFwcGVucy4gKi8KK3N0YXRpYyB2b2lkCitpbml0aWFsaXplX2Jhc2ljcyh2b2lkKQoreworICBzdGF0aWMgaW50IGluaXRpYWxpemVkOworICBpbnQgZXJyOworCisgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgeworICAgICAgaW5pdGlhbGl6ZWQgPSAxOworICAgICAgZXJyID0gYXRoX211dGV4X2luaXQgKCZwb29sX2xvY2spOworICAgICAgaWYgKGVycikKKyAgICAgICAgbG9nX2ZhdGFsICgiZmFpbGVkIHRvIGNyZWF0ZSB0aGUgcG9vbCBsb2NrOiAlc1xuIiwgc3RyZXJyb3IgKGVycikgKTsKKyAgICAgIAorICAgICAgZXJyID0gYXRoX211dGV4X2luaXQgKCZub25jZV9idWZmZXJfbG9jayk7CisgICAgICBpZiAoZXJyKQorICAgICAgICBsb2dfZmF0YWwgKCJmYWlsZWQgdG8gY3JlYXRlIHRoZSBub25jZSBidWZmZXIgbG9jazogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycikgKTsKKworI2lmZGVmIFVTRV9SQU5ET01fREFFTU9OCisgICAgICBfZ2NyeV9kYWVtb25faW5pdGlhbGl6ZV9iYXNpY3MgKCk7CisjZW5kaWYgLypVU0VfUkFORE9NX0RBRU1PTiovCisKKyAgICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGFyZSBzdGlsbCB1c2luZyB0aGUgdmFsdWVzIHdlIGhhdmUKKyAgICAgICAgIHRyYWRpdGlvbmFsbHkgdXNlZCBmb3IgdGhlIHJhbmRvbSBsZXZlbHMuICAqLworICAgICAgZ2NyeV9hc3NlcnQgKEdDUllfV0VBS19SQU5ET00gPT0gMCAKKyAgICAgICAgICAgICAgICAgICAmJiBHQ1JZX1NUUk9OR19SQU5ET00gPT0gMQorICAgICAgICAgICAgICAgICAgICYmIEdDUllfVkVSWV9TVFJPTkdfUkFORE9NID09IDIpOworICAgIH0KK30KKworLyogVGFrZSB0aGUgcG9vbCBsb2NrLiAqLworc3RhdGljIHZvaWQKK2xvY2tfcG9vbCAodm9pZCkKK3sKKyAgaW50IGVycjsgCisKKyAgZXJyID0gYXRoX211dGV4X2xvY2sgKCZwb29sX2xvY2spOworICBpZiAoZXJyKQorICAgIGxvZ19mYXRhbCAoImZhaWxlZCB0byBhY3F1aXJlIHRoZSBwb29sIGxvY2s6ICVzXG4iLCBzdHJlcnJvciAoZXJyKSk7CisgIHBvb2xfaXNfbG9ja2VkID0gMTsKK30KKworLyogUmVsZWFzZSB0aGUgcG9vbCBsb2NrLiAqLworc3RhdGljIHZvaWQKK3VubG9ja19wb29sICh2b2lkKQoreworICBpbnQgZXJyOyAKKworICBwb29sX2lzX2xvY2tlZCA9IDA7CisgIGVyciA9IGF0aF9tdXRleF91bmxvY2sgKCZwb29sX2xvY2spOworICBpZiAoZXJyKQorICAgIGxvZ19mYXRhbCAoImZhaWxlZCB0byByZWxlYXNlIHRoZSBwb29sIGxvY2s6ICVzXG4iLCBzdHJlcnJvciAoZXJyKSk7Cit9CisKKworLyogRnVsbCBpbml0aWFsaXphdGlvbiBvZiB0aGlzIG1vZHVsZS4gKi8KK3N0YXRpYyB2b2lkCitpbml0aWFsaXplKHZvaWQpCit7CisgIC8qIEFsdGhvdWdoIHRoZSBiYXNpYyBpbml0aWFsaXphdGlvbiBzaG91bGQgaGF2ZSBoYXBwZW5lZCBhbHJlYWR5LAorICAgICB3ZSBjYWxsIGl0IGhlcmUgdG8gbWFrZSBzdXJlIHRoYXQgYWxsIHByZXJlcXVpc2l0ZXMgYXJlIG1ldC4gICovCisgIGluaXRpYWxpemVfYmFzaWNzICgpOworCisgIC8qIE5vdyB3ZSBjYW4gbG9vayB0aGUgcG9vbCBhbmQgY29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIGlmCisgICAgIG5lY2Vzc2FyeS4gICovCisgIGxvY2tfcG9vbCAoKTsKKyAgaWYgKCFybmRwb29sKQorICAgIHsKKyAgICAgIC8qIFRoZSBkYXRhIGJ1ZmZlciBpcyBhbGxvY2F0ZWQgc29tZXdoYXQgbGFyZ2VyLCBzbyB0aGF0IHdlIGNhbgorICAgICAgICAgdXNlIHRoaXMgZXh0cmEgc3BhY2UgKHdoaWNoIGlzIGFsbG9jYXRlZCBpbiBzZWN1cmUgbWVtb3J5KSBhcworICAgICAgICAgYSB0ZW1wb3JhcnkgaGFzaCBidWZmZXIgKi8KKyAgICAgIHJuZHBvb2wgPSAoc2VjdXJlX2FsbG9jCisgICAgICAgICAgICAgICAgID8gZ2NyeV94Y2FsbG9jX3NlY3VyZSAoMSwgUE9PTFNJWkUgKyBCTE9DS0xFTikKKyAgICAgICAgICAgICAgICAgOiBnY3J5X3hjYWxsb2MgKDEsIFBPT0xTSVpFICsgQkxPQ0tMRU4pKTsKKyAgICAgIGtleXBvb2wgPSAoc2VjdXJlX2FsbG9jCisgICAgICAgICAgICAgICAgID8gZ2NyeV94Y2FsbG9jX3NlY3VyZSAoMSwgUE9PTFNJWkUgKyBCTE9DS0xFTikKKyAgICAgICAgICAgICAgICAgOiBnY3J5X3hjYWxsb2MgKDEsIFBPT0xTSVpFICsgQkxPQ0tMRU4pKTsKKworICAgICAgLyogU2V0dXAgdGhlIHNsb3cgZW50cm9weSBnYXRoZXJpbmcgZnVuY3Rpb24uICBUaGUgY29kZSByZXF1aXJlcworICAgICAgICAgdGhhdCB0aGlzIGZ1bmN0aW9uIGV4aXN0cy4gKi8KKyAgICAgIHNsb3dfZ2F0aGVyX2ZuYyA9IGdldGZuY19nYXRoZXJfcmFuZG9tICgpOworICAgICAgaWYgKCFzbG93X2dhdGhlcl9mbmMpCisgICAgICAgIHsKKyAgICAgICAgICBmYWtlZF9ybmcgPSAxOworICAgICAgICAgIHNsb3dfZ2F0aGVyX2ZuYyA9IGdhdGhlcl9mYWtlZDsKKwl9CisgICAgICAKKyAgICAgIC8qIFNldHVwIHRoZSBmYXN0IGVudHJvcHkgZ2F0aGVyaW5nIGZ1bmN0aW9uLiAgKi8KKyAgICAgIGZhc3RfZ2F0aGVyX2ZuYyA9IGdldGZuY19mYXN0X3JhbmRvbV9wb2xsICgpOworCisgICAgfQorICB1bmxvY2tfcG9vbCAoKTsKK30KKworCisKKworLyogSW5pdGlhbGl6ZSB0aGlzIHJhbmRvbSBzdWJzeXN0ZW0uICBJZiBGVUxMIGlzIGZhbHNlLCB0aGlzIGZ1bmN0aW9uCisgICBtZXJlbHkgY2FsbHMgdGhlIGluaXRpYWxpemUgYW5kIGRvZXMgbm90IGRvIGFueXRoaW5nIG1vcmUuICBEb2luZworICAgdGhpcyBpcyBub3QgcmVhbGx5IHJlcXVpcmVkIGJ1dCB3aGVuIHJ1bm5pbmcgaW4gYSB0aHJlYWRlZAorICAgZW52aXJvbm1lbnQgd2UgbWlnaHQgZ2V0IGEgcmFjZSBjb25kaXRpb24gb3RoZXJ3aXNlLiAqLwordm9pZAorX2djcnlfcm5nY3Nwcm5nX2luaXRpYWxpemUgKGludCBmdWxsKQoreworICBpZiAoIWZ1bGwpCisgICAgaW5pdGlhbGl6ZV9iYXNpY3MgKCk7CisgIGVsc2UKKyAgICBpbml0aWFsaXplICgpOworfQorCisKK3ZvaWQKK19nY3J5X3JuZ2NzcHJuZ19kdW1wX3N0YXRzICh2b2lkKQoreworICAvKiBJbiB0aGVvcnkgd2Ugd291bGQgbmVlZCB0byBsb2NrIHRoZSBzdGF0cyBoZXJlLiAgSG93ZXZlciB0aGlzCisgICAgIGZ1bmN0aW9uIGlzIHVzdWFsbHkgY2FsbGVkIGR1cmluZyBjbGVhbnVwIGFuZCB0aGVuIHdlIF9taWdodF8gcnVuCisgICAgIGludG8gcHJvYmxlbXMuICAqLworCisgIGxvZ19pbmZvICgicmFuZG9tIHVzYWdlOiBwb29sc2l6ZT0lZCBtaXhlZD0lbHUgcG9sbHM9JWx1LyVsdSBhZGRlZD0lbHUvJWx1XG4iCisJICAgICIgICAgICAgICAgICAgIG91dG1peD0lbHUgZ2V0bHZsMT0lbHUvJWx1IGdldGx2bDI9JWx1LyVsdSVzXG4iLAorICAgICAgICAgICAgUE9PTFNJWkUsIHJuZHN0YXRzLm1peHJuZCwgcm5kc3RhdHMuc2xvd3BvbGxzLCBybmRzdGF0cy5mYXN0cG9sbHMsCisgICAgICAgICAgICBybmRzdGF0cy5uYWRkYnl0ZXMsIHJuZHN0YXRzLmFkZGJ5dGVzLAorICAgICAgICAgICAgcm5kc3RhdHMubWl4a2V5LCBybmRzdGF0cy5uZ2V0Ynl0ZXMxLCBybmRzdGF0cy5nZXRieXRlczEsCisgICAgICAgICAgICBybmRzdGF0cy5uZ2V0Ynl0ZXMyLCBybmRzdGF0cy5nZXRieXRlczIsCisgICAgICAgICAgICBfZ2NyeV9ybmRod19mYWlsZWRfcCgpPyAiIChod3JuZyBmYWlsZWQpIjoiIik7Cit9CisKKworLyogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGR1cmluZyBpbml0aWFsaXphdGlvbiBhbmQgYmVmb3JlCisgICBpbnRpYWxpemF0aW9uIG9mIHRoaXMgbW9kdWxlIHRvIHBsYWNlIHRoZSByYW5kb20gcG9vbHMgaW50byBzZWN1cmUKKyAgIG1lbW9yeS4gICovCit2b2lkCitfZ2NyeV9ybmdjc3Bybmdfc2VjdXJlX2FsbG9jICh2b2lkKQoreworICBzZWN1cmVfYWxsb2MgPSAxOworfQorCisKKy8qIFRoaXMgbWF5IGJlIGNhbGxlZCBiZWZvcmUgZnVsbCBpbml0aWFsaXphdGlvbiB0byBkZWdyYWRlIHRoZQorICAgcXVhbGl0eSBvZiB0aGUgUk5HIGZvciB0aGUgc2FrZSBvZiBhIGZhc3RlciBydW5uaW5nIHRlc3Qgc3VpdGUuICAqLwordm9pZAorX2djcnlfcm5nY3Nwcm5nX2VuYWJsZV9xdWlja19nZW4gKHZvaWQpCit7CisgIHF1aWNrX3Rlc3QgPSAxOworfQorCisKK3ZvaWQKK19nY3J5X3JuZ2NzcHJuZ19zZXRfZGFlbW9uX3NvY2tldCAoY29uc3QgY2hhciAqc29ja2V0bmFtZSkKK3sKKyNpZmRlZiBVU0VfUkFORE9NX0RBRU1PTgorICBpZiAoZGFlbW9uX3NvY2tldF9uYW1lKQorICAgIEJVRyAoKTsKKworICBkYWVtb25fc29ja2V0X25hbWUgPSBnY3J5X3hzdHJkdXAgKHNvY2tldG5hbWUpOworI2Vsc2UgLyohVVNFX1JBTkRPTV9EQUVNT04qLworICAodm9pZClzb2NrZXRuYW1lOworI2VuZGlmIC8qIVVTRV9SQU5ET01fREFFTU9OKi8KK30KKworLyogV2l0aCBPTk9GRiBzZXQgdG8gMSwgZW5hYmxlIHRoZSB1c2Ugb2YgdGhlIGRhZW1vbi4gIFdpdGggT05PRkYgc2V0CisgICB0byAwLCBkaXNhYmxlIHRoZSB1c2Ugb2YgdGhlIGRhZW1vbi4gIFdpdGggT05PRiBzZXQgdG8gLTEsIHJldHVybgorICAgd2hldGhlciB0aGUgZGFlbW9uIGhhcyBiZWVuIGVuYWJsZWQuICovCitpbnQKK19nY3J5X3JuZ2NzcHJuZ191c2VfZGFlbW9uIChpbnQgb25vZmYpCit7CisjaWZkZWYgVVNFX1JBTkRPTV9EQUVNT04KKyAgaW50IGxhc3Q7CisgIAorICAvKiBUaGlzIGlzIG5vdCByZWFsbHkgdGhyZWFkIHNhZmUuICBIb3dldmVyIGl0IGlzIGV4cGVjdGVkIHRoYXQgdGhpcworICAgICBmdW5jdGlvbiBpcyBiZWluZyBjYWxsZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uIGFuZCBhdCB0aGF0IHBvaW50CisgICAgIHdlIGFyZSBmb3Igb3RoZXIgcmVhc29ucyBub3QgcmVhbGx5IHRocmVhZCBzYWZlLiAgV2UgZG8gbm90IHdhbnQKKyAgICAgdG8gbG9jayBpdCBiZWNhdXNlIHdlIG1pZ2h0IGV2ZW50dWFsbHkgZGVjaWRlIHRoYXQgdGhpcyBmdW5jdGlvbgorICAgICBtYXkgZXZlbiBiZSBjYWxsZWQgcHJpb3IgdG8gZ2NyeV9jaGVja192ZXJzaW9uLiAgKi8KKyAgbGFzdCA9IGFsbG93X2RhZW1vbjsKKyAgaWYgKG9ub2ZmICE9IC0xKQorICAgIGFsbG93X2RhZW1vbiA9IG9ub2ZmOworCisgIHJldHVybiBsYXN0OworI2Vsc2UgLyohVVNFX1JBTkRPTV9EQUVNT04qLworICAodm9pZClvbm9mZjsKKyAgcmV0dXJuIDA7CisjZW5kaWYgLyohVVNFX1JBTkRPTV9EQUVNT04qLworfQorCisKKy8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIG5vIHJlYWwgUk5HIGlzIGF2YWlsYWJsZSBvciB0aGUKKyAgIHF1YWxpdHkgb2YgdGhlIFJORyBoYXMgYmVlbiBkZWdyYWRlZCBmb3IgdGVzdCBwdXJwb3Nlcy4gICovCitpbnQKK19nY3J5X3JuZ2NzcHJuZ19pc19mYWtlZCAodm9pZCkKK3sKKyAgLyogV2UgbmVlZCB0byBpbml0aWFsaXplIGR1ZSB0byB0aGUgcnVudGltZSBkZXRlcm1pbmF0aW9uIG9mCisgICAgIGF2YWlsYWJsZSBlbnRyb3B5IGdhdGhlciBtb2R1bGVzLiAgKi8KKyAgaW5pdGlhbGl6ZSgpOworICByZXR1cm4gKGZha2VkX3JuZyB8fCBxdWlja190ZXN0KTsKK30KKworCisvKiBBZGQgQlVGTEVOIGJ5dGVzIGZyb20gQlVGIHRvIHRoZSBpbnRlcm5hbCByYW5kb20gcG9vbC4gIFFVQUxJVFkKKyAgIHNob3VsZCBiZSBpbiB0aGUgcmFuZ2Ugb2YgMC4uMTAwIHRvIGluZGljYXRlIHRoZSBnb29kbmVzcyBvZiB0aGUKKyAgIGVudHJvcHkgYWRkZWQsIG9yIC0xIGZvciBnb29kbmVzcyBub3Qga25vd24uICAqLworZ2NyeV9lcnJvcl90CitfZ2NyeV9ybmdjc3BybmdfYWRkX2J5dGVzIChjb25zdCB2b2lkICpidWYsIHNpemVfdCBidWZsZW4sIGludCBxdWFsaXR5KQoreworICBzaXplX3QgbmJ5dGVzOworICBjb25zdCBjaGFyICpidWZwdHI7CisKKyAgaWYgKHF1YWxpdHkgPT0gLTEpCisgICAgcXVhbGl0eSA9IDM1OworICBlbHNlIGlmIChxdWFsaXR5ID4gMTAwKQorICAgIHF1YWxpdHkgPSAxMDA7CisgIGVsc2UgaWYgKHF1YWxpdHkgPCAwKQorICAgIHF1YWxpdHkgPSAwOworICAgICAgCisgIGlmICghYnVmKQorICAgIHJldHVybiBncGdfZXJyb3IgKEdQR19FUlJfSU5WX0FSRyk7CisKKyAgaWYgKCFidWZsZW4gfHwgcXVhbGl0eSA8IDEwKQorICAgIHJldHVybiAwOyAvKiBUYWtlIGEgc2hvcnRjdXQuICovCisKKyAgLyogQmVjYXVzZSB3ZSBkb24ndCBpbmNyZW1lbnQgdGhlIGVudHJvcHkgZXN0aW1hdGlvbiB3aXRoIEZBU1RQT0xMLAorICAgICB3ZSBkb24ndCBuZWVkIHRvIHRha2UgbG9jayB0aGF0IGVzdGltYXRpb24gd2hpbGUgYWRkaW5nIGZyb20gYW4KKyAgICAgZXh0ZXJuYWwgc291cmNlLiAgVGhpcyBsaW1pdGVkIGVudHJvcHkgZXN0aW1hdGlvbiBhbHNvIG1lYW5zIHRoYXQKKyAgICAgd2UgY2FuJ3QgdGFrZSBRVUFMSVRZIGludG8gYWNjb3VudC4gICovCisgIGluaXRpYWxpemVfYmFzaWNzICgpOworICBidWZwdHIgPSBidWY7CisgIHdoaWxlIChidWZsZW4pCisgICAgeworICAgICAgbmJ5dGVzID0gYnVmbGVuID4gUE9PTFNJWkU/IFBPT0xTSVpFIDogYnVmbGVuOworICAgICAgbG9ja19wb29sICgpOworICAgICAgaWYgKHJuZHBvb2wpCisgICAgICAgIGFkZF9yYW5kb21uZXNzIChidWZwdHIsIG5ieXRlcywgUkFORE9NX09SSUdJTl9FWFRFUk5BTCk7CisgICAgICB1bmxvY2tfcG9vbCAoKTsKKyAgICAgIGJ1ZnB0ciArPSBuYnl0ZXM7CisgICAgICBidWZsZW4gLT0gbmJ5dGVzOworICAgIH0KKyAgcmV0dXJuIDA7Cit9ICAgCisKKyAgICAKKy8qIFB1YmxpYyBmdW5jdGlvbiB0byBmaWxsIHRoZSBidWZmZXIgd2l0aCBMRU5HVEggYnl0ZXMgb2YKKyAgIGNyeXB0b2dyYXBoaWNhbGx5IHN0cm9uZyByYW5kb20gYnl0ZXMuICBMZXZlbCBHQ1JZX1dFQUtfUkFORE9NIGlzCisgICBub3QgdmVyeSBzdHJvbmcsIEdDUllfU1RST05HX1JBTkRPTSBpcyBzdHJvbmcgZW5vdWdoIGZvciBtb3N0CisgICB1c2FnZSwgR0NSWV9WRVJZX1NUUk9OR19SQU5ET00gaXMgZ29vZCBmb3Iga2V5IGdlbmVyYXRpb24gc3R1ZmYgYnV0CisgICBtYXkgYmUgdmVyeSBzbG93LiAgKi8KK3ZvaWQKK19nY3J5X3JuZ2NzcHJuZ19yYW5kb21pemUgKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gZ2NyeV9yYW5kb21fbGV2ZWwgbGV2ZWwpCit7CisgIHVuc2lnbmVkIGNoYXIgKnA7CisKKyAgLyogTWFrZSBzdXJlIHdlIGFyZSBpbml0aWFsaXplZC4gKi8KKyAgaW5pdGlhbGl6ZSAoKTsKKworICAvKiBIYW5kbGUgb3VyIGhhY2sgdXNlZCBmb3IgcmVncmVzc2lvbiB0ZXN0cyBvZiBMaWJnY3J5cHQuICovCisgIGlmICggcXVpY2tfdGVzdCAmJiBsZXZlbCA+IEdDUllfU1RST05HX1JBTkRPTSApCisgICAgbGV2ZWwgPSBHQ1JZX1NUUk9OR19SQU5ET007CisKKyAgLyogTWFrZSBzdXJlIHRoZSBsZXZlbCBpcyBva2F5LiAqLworICBsZXZlbCAmPSAzOworCisjaWZkZWYgVVNFX1JBTkRPTV9EQUVNT04KKyAgaWYgKGFsbG93X2RhZW1vbgorICAgICAgJiYgIV9nY3J5X2RhZW1vbl9yYW5kb21pemUgKGRhZW1vbl9zb2NrZXRfbmFtZSwgYnVmZmVyLCBsZW5ndGgsIGxldmVsKSkKKyAgICByZXR1cm47IC8qIFRoZSBkYWVtb24gc3VjY2VlZGVkLiAqLworICBhbGxvd19kYWVtb24gPSAwOyAvKiBEYWVtb24gZmFpbGVkIC0gc3dpdGNoIG9mZi4gKi8KKyNlbmRpZiAvKlVTRV9SQU5ET01fREFFTU9OKi8KKworICAvKiBBY3F1aXJlIHRoZSBwb29sIGxvY2suICovCisgIGxvY2tfcG9vbCAoKTsKKworICAvKiBVcGRhdGUgdGhlIHN0YXRpc3RpY3MuICovCisgIGlmIChsZXZlbCA+PSBHQ1JZX1ZFUllfU1RST05HX1JBTkRPTSkKKyAgICB7CisgICAgICBybmRzdGF0cy5nZXRieXRlczIgKz0gbGVuZ3RoOworICAgICAgcm5kc3RhdHMubmdldGJ5dGVzMisrOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJuZHN0YXRzLmdldGJ5dGVzMSArPSBsZW5ndGg7CisgICAgICBybmRzdGF0cy5uZ2V0Ynl0ZXMxKys7CisgICAgfQorCisgIC8qIFJlYWQgdGhlIHJhbmRvbSBpbnRvIHRoZSBwcm92aWRlZCBidWZmZXIuICovCisgIGZvciAocCA9IGJ1ZmZlcjsgbGVuZ3RoID4gMDspCisgICAgeworICAgICAgc2l6ZV90IG47CisKKyAgICAgIG4gPSBsZW5ndGggPiBQT09MU0laRT8gUE9PTFNJWkUgOiBsZW5ndGg7CisgICAgICByZWFkX3Bvb2wgKHAsIG4sIGxldmVsKTsKKyAgICAgIGxlbmd0aCAtPSBuOworICAgICAgcCArPSBuOworICAgIH0KKworICAvKiBSZWxlYXNlIHRoZSBwb29sIGxvY2suICovCisgIHVubG9ja19wb29sICgpOworfQorCisKKworCisvKgorICAgTWl4IHRoZSBwb29sOgorCisgICB8Li4uLi4uLi5ibG9ja3MqMjBieXRlLi4uLi4uLi58MjBieXRlfC4uNDRieXRlLi58CisgICA8Li40NGJ5dGUuLj4gICAgICAgICAgIDwyMGJ5dGU+IAorICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICstLS0tLS0rCisgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLSsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgICAgICAgICAgdgorICAgfC4uLi4uLi4uYmxvY2tzKjIwYnl0ZS4uLi4uLi4ufDIwYnl0ZXwuLjQ0Ynl0ZS4ufAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC4uLi4uNjRieXRlcy4uLi4uPiAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgSGFzaAorICAgICAgdgorICAgfC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4ufDIwYnl0ZXwuLjQ0Ynl0ZS4ufAorICAgPDIwYnl0ZT48MjBieXRlPjwuLjQ0Ynl0ZS4uPgorICAgICAgfCAgICAgICAgICAgICAgICB8CisgICAgICB8ICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ICAgICAgICB2CisgICB8Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi58MjBieXRlfC4uNDRieXRlLi58CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Li4uLi42NGJ5dGUuLi4uLi4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICBIYXNoCisgICAgICAgICAgICAgIHYKKyAgIHwuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLnwyMGJ5dGV8Li40NGJ5dGUuLnwKKyAgIDwyMGJ5dGU+PDIwYnl0ZT48Li40NGJ5dGUuLj4KKworICAgYW5kIHNvIG9uIHVudGlsIHdlIGRpZCB0aGlzIGZvciBhbGwgYmxvY2tzLiAKKworICAgVG8gYmV0dGVyIHByb3RlY3QgYWdhaW5zdCBpbXBsZW1lbnRhdGlvbiBlcnJvcnMgaW4gdGhpcyBjb2RlLCB3ZQorICAgeG9yIGEgZGlnZXN0IG9mIHRoZSBlbnRpcmUgcG9vbCBpbnRvIHRoZSBwb29sIGJlZm9yZSBtaXhpbmcuCisKKyAgIE5vdGU6IHRoaXMgZnVuY3Rpb24gbXVzdCBvbmx5IGJlIGNhbGxlZCB3aXRoIGEgbG9ja2VkIHBvb2wuCisgKi8KK3N0YXRpYyB2b2lkCittaXhfcG9vbCh1bnNpZ25lZCBjaGFyICpwb29sKQoreworICBzdGF0aWMgdW5zaWduZWQgY2hhciBmYWlsc2FmZV9kaWdlc3RbRElHRVNUTEVOXTsKKyAgc3RhdGljIGludCBmYWlsc2FmZV9kaWdlc3RfdmFsaWQ7CisKKyAgdW5zaWduZWQgY2hhciAqaGFzaGJ1ZiA9IHBvb2wgKyBQT09MU0laRTsKKyAgdW5zaWduZWQgY2hhciAqcCwgKnBlbmQ7CisgIGludCBpLCBuOworICBSTUQxNjBfQ09OVEVYVCBtZDsKKworI2lmIERJR0VTVExFTiAhPSAyMAorI2Vycm9yIG11c3QgaGF2ZSBhIGRpZ2VzdCBsZW5ndGggb2YgMjAgZm9yIHJpcGUtbWQtMTYwCisjZW5kaWYKKworICBnY3J5X2Fzc2VydCAocG9vbF9pc19sb2NrZWQpOworICBfZ2NyeV9ybWQxNjBfaW5pdCggJm1kICk7CisKKyAgLyogTG9vcCBvdmVyIHRoZSBwb29sLiAgKi8KKyAgcGVuZCA9IHBvb2wgKyBQT09MU0laRTsKKyAgbWVtY3B5KGhhc2hidWYsIHBlbmQgLSBESUdFU1RMRU4sIERJR0VTVExFTiApOworICBtZW1jcHkoaGFzaGJ1ZitESUdFU1RMRU4sIHBvb2wsIEJMT0NLTEVOLURJR0VTVExFTik7CisgIF9nY3J5X3JtZDE2MF9taXhibG9jayggJm1kLCBoYXNoYnVmKTsKKyAgbWVtY3B5KHBvb2wsIGhhc2hidWYsIDIwICk7CisKKyAgaWYgKGZhaWxzYWZlX2RpZ2VzdF92YWxpZCAmJiBwb29sID09IHJuZHBvb2wpCisgICAgeworICAgICAgZm9yIChpPTA7IGkgPCAyMDsgaSsrKQorICAgICAgICBwb29sW2ldIF49IGZhaWxzYWZlX2RpZ2VzdFtpXTsKKyAgICB9CisgIAorICBwID0gcG9vbDsKKyAgZm9yIChuPTE7IG4gPCBQT09MQkxPQ0tTOyBuKyspCisgICAgeworICAgICAgbWVtY3B5IChoYXNoYnVmLCBwLCBESUdFU1RMRU4pOworCisgICAgICBwICs9IERJR0VTVExFTjsKKyAgICAgIGlmIChwK0RJR0VTVExFTitCTE9DS0xFTiA8IHBlbmQpCisgICAgICAgIG1lbWNweSAoaGFzaGJ1ZitESUdFU1RMRU4sIHArRElHRVNUTEVOLCBCTE9DS0xFTi1ESUdFU1RMRU4pOworICAgICAgZWxzZSAKKyAgICAgICAgeworICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnBwID0gcCArIERJR0VTVExFTjsKKyAgICAgICAgICAKKyAgICAgICAgICBmb3IgKGk9RElHRVNUTEVOOyBpIDwgQkxPQ0tMRU47IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICggcHAgPj0gcGVuZCApCisgICAgICAgICAgICAgICAgcHAgPSBwb29sOworICAgICAgICAgICAgICBoYXNoYnVmW2ldID0gKnBwKys7CisJICAgIH0KKwl9CisgICAgICAKKyAgICAgIF9nY3J5X3JtZDE2MF9taXhibG9jayAoICZtZCwgaGFzaGJ1Zik7CisgICAgICBtZW1jcHkocCwgaGFzaGJ1ZiwgMjAgKTsKKyAgICB9CisKKyAgICAvKiBPdXIgaGFzaCBpbXBsZW1lbnRhdGlvbiBkb2VzIG9ubHkgbGVhdmUgc21hbGwgcGFydHMgKDY0IGJ5dGVzKQorICAgICAgIG9mIHRoZSBwb29sIG9uIHRoZSBzdGFjaywgc28gaXQgaXMgb2theSBub3QgdG8gcmVxdWlyZSBzZWN1cmUKKyAgICAgICBtZW1vcnkgaGVyZS4gIEJlZm9yZSB3ZSB1c2UgdGhpcyBwb29sLCBpdCB3aWxsIGJlIGNvcGllZCB0byB0aGUKKyAgICAgICBoZWxwIGJ1ZmZlciBhbnl3YXkuICovCisgICAgaWYgKCBwb29sID09IHJuZHBvb2wpCisgICAgICB7CisgICAgICAgIF9nY3J5X3JtZDE2MF9oYXNoX2J1ZmZlciAoZmFpbHNhZmVfZGlnZXN0LCBwb29sLCBQT09MU0laRSk7CisgICAgICAgIGZhaWxzYWZlX2RpZ2VzdF92YWxpZCA9IDE7CisgICAgICB9CisKKyAgICBfZ2NyeV9idXJuX3N0YWNrICgzODQpOyAvKiBmb3IgdGhlIHJtZDE2MF9taXhibG9jaygpLCBybWQxNjBfaGFzaF9idWZmZXIgKi8KK30KKworCit2b2lkCitfZ2NyeV9ybmdjc3Bybmdfc2V0X3NlZWRfZmlsZSAoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgaWYgKHNlZWRfZmlsZV9uYW1lKQorICAgIEJVRyAoKTsKKyAgc2VlZF9maWxlX25hbWUgPSBnY3J5X3hzdHJkdXAgKG5hbWUpOworfQorCisKKy8qIExvY2sgYW4gb3BlbiBmaWxlIGlkZW50aWZpZWQgYnkgZmlsZSBkZXNjcmlwdG9yIEZEIGFuZCB3YWl0IGEKKyAgIHJlYXNvbmFibGUgdGltZSB0byBzdWNjZWVkLiAgV2l0aCBGT1JfV1JJVEUgc2V0IHRvIHRydWUgYSB3cml0ZQorICAgbG9jayB3aWxsIGJlIHRha2VuLiAgRk5BTUUgaXMgdXNlZCBvbmx5IGZvciBkaWFnbm9zdGljcy4gUmV0dXJucyAwCisgICBvbiBzdWNjZXNzIG9yIC0xIG9uIGVycm9yLiAqLworc3RhdGljIGludAorbG9ja19zZWVkX2ZpbGUgKGludCBmZCwgY29uc3QgY2hhciAqZm5hbWUsIGludCBmb3Jfd3JpdGUpCit7CisjaWYgTE9DS19TRUVEX0ZJTEUKKyAgc3RydWN0IGZsb2NrIGxjazsKKyAgc3RydWN0IHRpbWV2YWwgdHY7CisgIGludCBiYWNrb2ZmPTA7CisKKyAgLyogV2UgdGFrZSBhIGxvY2sgb24gdGhlIGVudGlyZSBmaWxlLiAqLworICBtZW1zZXQgKCZsY2ssIDAsIHNpemVvZiBsY2spOworICBsY2subF90eXBlID0gZm9yX3dyaXRlPyBGX1dSTENLIDogRl9SRExDSzsKKyAgbGNrLmxfd2hlbmNlID0gU0VFS19TRVQ7CisKKyAgd2hpbGUgKGZjbnRsIChmZCwgRl9TRVRMSywgJmxjaykgPT0gLTEpCisgICAgeworICAgICAgaWYgKGVycm5vICE9IEVBR0FJTiAmJiBlcnJubyAhPSBFQUNDRVMpCisgICAgICAgIHsKKyAgICAgICAgICBsb2dfaW5mbyAoXygiY2FuJ3QgbG9jayBgJXMnOiAlc1xuIiksIGZuYW1lLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgaWYgKGJhY2tvZmYgPiAyKSAvKiBTaG93IHRoZSBmaXJzdCBtZXNzYWdlIGFmdGVyIH4yLjI1IHNlY29uZHMuICovCisgICAgICAgIGxvZ19pbmZvKCBfKCJ3YWl0aW5nIGZvciBsb2NrIG9uIGAlcycuLi5cbiIpLCBmbmFtZSk7CisgICAgICAKKyAgICAgIHR2LnR2X3NlYyA9IGJhY2tvZmY7CisgICAgICB0di50dl91c2VjID0gMjUwMDAwOworICAgICAgc2VsZWN0ICgwLCBOVUxMLCBOVUxMLCBOVUxMLCAmdHYpOworICAgICAgaWYgKGJhY2tvZmYgPCAxMCkKKyAgICAgICAgYmFja29mZisrIDsKKyAgICB9CisjZW5kaWYgLypMT0NLX1NFRURfRklMRSovCisgIHJldHVybiAwOworfQorCisKKy8qIFJlYWQgaW4gYSBzZWVkIGZyb20gdGhlIHJhbmRvbV9zZWVkIGZpbGUgYW5kIHJldHVybiB0cnVlIGlmIHRoaXMKKyAgIHdhcyBzdWNjZXNzZnVsLgorCisgICBOb3RlOiBNdWx0aXBsZSBpbnN0YW5jZXMgb2YgYXBwbGljYXRpb25zIHNoYXJpbmcgdGhlIHNhbWUgcmFuZG9tCisgICBzZWVkIGZpbGUgY2FuIGJlIHN0YXJ0ZWQgaW4gcGFyYWxsZWwsIGluIHdoaWNoIGNhc2UgdGhleSB3aWxsIHJlYWQKKyAgIG91dCB0aGUgc2FtZSBwb29sIGFuZCB0aGVuIHJhY2UgZm9yIHVwZGF0aW5nIGl0ICh0aGUgbGFzdCB1cGRhdGUKKyAgIG92ZXJ3cml0ZXMgZWFybGllciB1cGRhdGVzKS4gIFRoZXkgd2lsbCBkaWZmZXJlbnRpYXRlIG9ubHkgYnkgdGhlCisgICB3ZWFrIGVudHJvcHkgdGhhdCBpcyBhZGRlZCBpbiByZWFkX3NlZWRfZmlsZSBiYXNlZCBvbiB0aGUgUElEIGFuZAorICAgY2xvY2ssIGFuZCB1cCB0byAxNiBieXRlcyBvZiB3ZWFrIHJhbmRvbSBub24tYmxvY2tpbmdseS4gIFRoZQorICAgY29uc2VxdWVuY2UgaXMgdGhhdCB0aGUgb3V0cHV0IG9mIHRoZXNlIGRpZmZlcmVudCBpbnN0YW5jZXMgaXMKKyAgIGNvcnJlbGF0ZWQgdG8gc29tZSBleHRlbnQuICBJbiB0aGUgcGVyZmVjdCBzY2VuYXJpbywgdGhlIGF0dGFja2VyCisgICBjYW4gY29udHJvbCAob3IgYXQgbGVhc3QgZ3Vlc3MpIHRoZSBQSUQgYW5kIGNsb2NrIG9mIHRoZQorICAgYXBwbGljYXRpb24sIGFuZCBkcmFpbiB0aGUgc3lzdGVtJ3MgZW50cm9weSBwb29sIHRvIHJlZHVjZSB0aGUgInVwCisgICB0byAxNiBieXRlcyIgYWJvdmUgdG8gMC4gIFRoZW4gdGhlIGRlcGVuZGVuY2llcyBvZiB0aGUgaW5pdGFsCisgICBzdGF0ZXMgb2YgdGhlIHBvb2xzIGFyZSBjb21wbGV0ZWx5IGtub3duLiAgKi8KK3N0YXRpYyBpbnQKK3JlYWRfc2VlZF9maWxlICh2b2lkKQoreworICBpbnQgZmQ7CisgIHN0cnVjdCBzdGF0IHNiOworICB1bnNpZ25lZCBjaGFyIGJ1ZmZlcltQT09MU0laRV07CisgIGludCBuOworCisgIGdjcnlfYXNzZXJ0IChwb29sX2lzX2xvY2tlZCk7CisKKyAgaWYgKCFzZWVkX2ZpbGVfbmFtZSkKKyAgICByZXR1cm4gMDsKKyAgCisjaWZkZWYgSEFWRV9ET1NJU0hfU1lTVEVNCisgIGZkID0gb3Blbiggc2VlZF9maWxlX25hbWUsIE9fUkRPTkxZIHwgT19CSU5BUlkgKTsKKyNlbHNlCisgIGZkID0gb3Blbiggc2VlZF9maWxlX25hbWUsIE9fUkRPTkxZICk7CisjZW5kaWYKKyAgaWYoIGZkID09IC0xICYmIGVycm5vID09IEVOT0VOVCkKKyAgICB7CisgICAgICBhbGxvd19zZWVkX2ZpbGVfdXBkYXRlID0gMTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBpZiAoZmQgPT0gLTEgKQorICAgIHsKKyAgICAgIGxvZ19pbmZvKF8oImNhbid0IG9wZW4gYCVzJzogJXNcbiIpLCBzZWVkX2ZpbGVfbmFtZSwgc3RyZXJyb3IoZXJybm8pICk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGlmIChsb2NrX3NlZWRfZmlsZSAoZmQsIHNlZWRfZmlsZV9uYW1lLCAwKSkKKyAgICB7CisgICAgICBjbG9zZSAoZmQpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBpZiAoZnN0YXQoIGZkLCAmc2IgKSApCisgICAgeworICAgICAgbG9nX2luZm8oXygiY2FuJ3Qgc3RhdCBgJXMnOiAlc1xuIiksIHNlZWRfZmlsZV9uYW1lLCBzdHJlcnJvcihlcnJubykgKTsKKyAgICAgIGNsb3NlKGZkKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgaWYgKCFTX0lTUkVHKHNiLnN0X21vZGUpICkKKyAgICB7CisgICAgICBsb2dfaW5mbyhfKCJgJXMnIGlzIG5vdCBhIHJlZ3VsYXIgZmlsZSAtIGlnbm9yZWRcbiIpLCBzZWVkX2ZpbGVfbmFtZSApOworICAgICAgY2xvc2UoZmQpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBpZiAoIXNiLnN0X3NpemUgKQorICAgIHsKKyAgICAgIGxvZ19pbmZvKF8oIm5vdGU6IHJhbmRvbV9zZWVkIGZpbGUgaXMgZW1wdHlcbiIpICk7CisgICAgICBjbG9zZShmZCk7CisgICAgICBhbGxvd19zZWVkX2ZpbGVfdXBkYXRlID0gMTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgaWYgKHNiLnN0X3NpemUgIT0gUE9PTFNJWkUgKSAKKyAgICB7CisgICAgICBsb2dfaW5mbyhfKCJ3YXJuaW5nOiBpbnZhbGlkIHNpemUgb2YgcmFuZG9tX3NlZWQgZmlsZSAtIG5vdCB1c2VkXG4iKSApOworICAgICAgY2xvc2UoZmQpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGRvCisgICAgeworICAgICAgbiA9IHJlYWQoIGZkLCBidWZmZXIsIFBPT0xTSVpFICk7CisgICAgfSAKKyAgd2hpbGUgKG4gPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIgKTsKKworICBpZiAobiAhPSBQT09MU0laRSkKKyAgICB7CisgICAgICBsb2dfZmF0YWwoXygiY2FuJ3QgcmVhZCBgJXMnOiAlc1xuIiksIHNlZWRfZmlsZV9uYW1lLHN0cmVycm9yKGVycm5vKSApOworICAgICAgY2xvc2UoZmQpOy8qTk9UUkVBQ0hFRCovCisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIAorICBjbG9zZShmZCk7CisKKyAgYWRkX3JhbmRvbW5lc3MoIGJ1ZmZlciwgUE9PTFNJWkUsIFJBTkRPTV9PUklHSU5fSU5JVCApOworICAvKiBhZGQgc29tZSBtaW5vciBlbnRyb3B5IHRvIHRoZSBwb29sIG5vdyAodGhpcyB3aWxsIGFsc28gZm9yY2UgYSBtaXhpbmcpICovCisgIHsJCisgICAgcGlkX3QgeCA9IGdldHBpZCgpOworICAgIGFkZF9yYW5kb21uZXNzKCAmeCwgc2l6ZW9mKHgpLCBSQU5ET01fT1JJR0lOX0lOSVQgKTsKKyAgfQorICB7CisgICAgdGltZV90IHggPSB0aW1lKE5VTEwpOworICAgIGFkZF9yYW5kb21uZXNzKCAmeCwgc2l6ZW9mKHgpLCBSQU5ET01fT1JJR0lOX0lOSVQgKTsKKyAgfQorICB7CQorICAgIGNsb2NrX3QgeCA9IGNsb2NrKCk7CisgICAgYWRkX3JhbmRvbW5lc3MoICZ4LCBzaXplb2YoeCksIFJBTkRPTV9PUklHSU5fSU5JVCApOworICB9CisKKyAgLyogQW5kIHJlYWQgYSBmZXcgYnl0ZXMgZnJvbSBvdXIgZW50cm9weSBzb3VyY2UuICBCeSB1c2luZyBhIGxldmVsCisgICAqIG9mIDAgdGhpcyB3aWxsIG5vdCBibG9jayBhbmQgbWlnaHQgbm90IHJldHVybiBhbnl0aGluZyB3aXRoIHNvbWUKKyAgICogZW50cm9weSBkcml2ZXJzLCBob3dldmVyIHRoZSBybmRsaW51eCBkcml2ZXIgd2lsbCB1c2UKKyAgICogL2Rldi91cmFuZG9tIGFuZCByZXR1cm4gc29tZSBzdHVmZiAtIERvIG5vdCByZWFkIHRvbyBtdWNoIGFzIHdlCisgICAqIHdhbnQgdG8gYmUgZnJpZW5kbHkgdG8gdGhlIHNjYXJlIHN5c3RlbSBlbnRyb3B5IHJlc291cmNlLiAqLworICByZWFkX3JhbmRvbV9zb3VyY2UgKCBSQU5ET01fT1JJR0lOX0lOSVQsIDE2LCBHQ1JZX1dFQUtfUkFORE9NICk7CisKKyAgYWxsb3dfc2VlZF9maWxlX3VwZGF0ZSA9IDE7CisgIHJldHVybiAxOworfQorCisKK3ZvaWQKK19nY3J5X3JuZ2NzcHJuZ191cGRhdGVfc2VlZF9maWxlICh2b2lkKQoreworICB1bnNpZ25lZCBsb25nICpzcCwgKmRwOworICBpbnQgZmQsIGk7CisKKyAgLyogV2UgZG8gb25seSBhIGJhc2ljIGluaXRpYWxpemF0aW9uIHNvIHRoYXQgd2UgY2FuIGxvY2sgdGhlIHBvb2wuCisgICAgIFRoaXMgaXMgcmVxdWlyZWQgdG8gY29wZSB3aXRoIHRoZSBjYXNlIHRoYXQgdGhpcyBmdW5jdGlvbiBpcworICAgICBjYWxsZWQgYnkgc29tZSBjbGVhbnVwIGNvZGUgYXQgYSBwb2ludCB3aGVyZSB0aGUgUk5HIGhhcyBuZXZlcgorICAgICBiZWVuIGluaXRpYWxpemVkLiAgKi8KKyAgaW5pdGlhbGl6ZV9iYXNpY3MgKCk7CisgIGxvY2tfcG9vbCAoKTsKKworICBpZiAoICFzZWVkX2ZpbGVfbmFtZSB8fCAhcm5kcG9vbCB8fCAhcG9vbF9maWxsZWQgKQorICAgIHsKKyAgICAgIHVubG9ja19wb29sICgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgaWYgKCAhYWxsb3dfc2VlZF9maWxlX3VwZGF0ZSApCisgICAgeworICAgICAgdW5sb2NrX3Bvb2wgKCk7CisgICAgICBsb2dfaW5mbyhfKCJub3RlOiByYW5kb21fc2VlZCBmaWxlIG5vdCB1cGRhdGVkXG4iKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGF0IHRoZXJlIGlzIHNvbWV0aGluZyBpbiB0aGUgcG9vbCBhbmQKKyAgICAgdGh1cyB3ZSBjYW4gY29uY2x1ZGUgdGhhdCB0aGUgcG9vbCBoYXMgYmVlbiBmdWxseSBpbml0aWFsaXplZC4gICovCisKKworICAvKiBDb3B5IHRoZSBlbnRyb3B5IHBvb2wgdG8gYSBzY3JhdGNoIHBvb2wgYW5kIG1peCBib3RoIG9mIHRoZW0uICovCisgIGZvciAoaT0wLGRwPSh1bnNpZ25lZCBsb25nKilrZXlwb29sLCBzcD0odW5zaWduZWQgbG9uZyopcm5kcG9vbDsKKyAgICAgICBpIDwgUE9PTFdPUkRTOyBpKyssIGRwKyssIHNwKysgKSAKKyAgICB7CisgICAgICAqZHAgPSAqc3AgKyBBRERfVkFMVUU7CisgICAgfQorICBtaXhfcG9vbChybmRwb29sKTsgcm5kc3RhdHMubWl4cm5kKys7CisgIG1peF9wb29sKGtleXBvb2wpOyBybmRzdGF0cy5taXhrZXkrKzsKKworI2lmIGRlZmluZWQoSEFWRV9ET1NJU0hfU1lTVEVNKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCisgIGZkID0gb3BlbiAoc2VlZF9maWxlX25hbWUsIE9fV1JPTkxZfE9fQ1JFQVR8T19UUlVOQ3xPX0JJTkFSWSwKKyAgICAgICAgICAgICBTX0lSVVNSfFNfSVdVU1IgKTsKKyNlbHNlCisjIGlmIExPQ0tfU0VFRF9GSUxFCisgICAgZmQgPSBvcGVuIChzZWVkX2ZpbGVfbmFtZSwgT19XUk9OTFl8T19DUkVBVCwgU19JUlVTUnxTX0lXVVNSICk7CisjIGVsc2UKKyAgICBmZCA9IG9wZW4gKHNlZWRfZmlsZV9uYW1lLCBPX1dST05MWXxPX0NSRUFUfE9fVFJVTkMsIFNfSVJVU1J8U19JV1VTUiApOworIyBlbmRpZgorI2VuZGlmCisKKyAgaWYgKGZkID09IC0xICkKKyAgICBsb2dfaW5mbyAoXygiY2FuJ3QgY3JlYXRlIGAlcyc6ICVzXG4iKSwgc2VlZF9maWxlX25hbWUsIHN0cmVycm9yKGVycm5vKSApOworICBlbHNlIGlmIChsb2NrX3NlZWRfZmlsZSAoZmQsIHNlZWRfZmlsZV9uYW1lLCAxKSkKKyAgICB7CisgICAgICBjbG9zZSAoZmQpOworICAgIH0KKyNpZiBMT0NLX1NFRURfRklMRQorICBlbHNlIGlmIChmdHJ1bmNhdGUgKGZkLCAwKSkKKyAgICB7CisgICAgICBsb2dfaW5mbyhfKCJjYW4ndCB3cml0ZSBgJXMnOiAlc1xuIiksIHNlZWRfZmlsZV9uYW1lLCBzdHJlcnJvcihlcnJubykpOworICAgICAgY2xvc2UgKGZkKTsKKyAgICB9CisjZW5kaWYgLypMT0NLX1NFRURfRklMRSovCisgIGVsc2UgCisgICAgeworICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgIGkgPSB3cml0ZSAoZmQsIGtleXBvb2wsIFBPT0xTSVpFICk7CisgICAgICAgIH0gCisgICAgICB3aGlsZSAoaSA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUik7CisgICAgICBpZiAoaSAhPSBQT09MU0laRSkgCisgICAgICAgIGxvZ19pbmZvIChfKCJjYW4ndCB3cml0ZSBgJXMnOiAlc1xuIiksc2VlZF9maWxlX25hbWUsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICBpZiAoY2xvc2UoZmQpKQorICAgICAgICBsb2dfaW5mbyAoXygiY2FuJ3QgY2xvc2UgYCVzJzogJXNcbiIpLHNlZWRfZmlsZV9uYW1lLCBzdHJlcnJvcihlcnJubykpOworICAgIH0KKyAgCisgIHVubG9ja19wb29sICgpOworfQorCisKKy8qIFJlYWQgcmFuZG9tIG91dCBvZiB0aGUgcG9vbC4gIFRoaXMgZnVuY3Rpb24gaXMgdGhlIGNvcmUgb2YgdGhlCisgICBwdWJsaWMgcmFuZG9tIGZ1bmN0aW9ucy4gIE5vdGUgdGhhdCBMZXZlbCBHQ1JZX1dFQUtfUkFORE9NIGlzIG5vdAorICAgYW55bW9yZSBoYW5kbGVkIHNwZWNpYWwgYW5kIGluIGZhY3QgaXMgYW4gYWxpYXMgaW4gdGhlIEFQSSBmb3IKKyAgIGxldmVsIEdDUllfU1RST05HX1JBTkRPTS4gIE11c3QgYmUgY2FsbGVkIHdpdGggdGhlIHBvb2wgYWxyZWFkeQorICAgbG9ja2VkLiAgKi8KK3N0YXRpYyB2b2lkCityZWFkX3Bvb2wgKGJ5dGUgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCwgaW50IGxldmVsKQoreworICBpbnQgaTsKKyAgdW5zaWduZWQgbG9uZyAqc3AsICpkcDsKKyAgLyogVGhlIHZvbGF0aWxlIGlzIHRoZXJlIHRvIG1ha2Ugc3VyZSB0aGUgY29tcGlsZXIgZG9lcyBub3Qgb3B0aW1pemUKKyAgICAgdGhlIGNvZGUgYXdheSBpbiBjYXNlIHRoZSBnZXRwaWQgZnVuY3Rpb24gaXMgYmFkbHkgYXR0cmlidXRlZC4KKyAgICAgTm90ZSB0aGF0IHdlIGtlZXAgYSBwaWQgaW4gYSBzdGF0aWMgdmFyaWFibGUgYXMgd2VsbCBhcyBpbiBhCisgICAgIHN0YWNrIGJhc2VkIG9uZTsgdGhlIGxhdHRlciBpcyB0byBkZXRlY3QgaWxsIGJlaGF2aW5nIHRocmVhZAorICAgICBsaWJyYXJpZXMsIGlnbm9yaW5nIHRoZSBwb29sIG11dGV4ZXMuICovCisgIHN0YXRpYyB2b2xhdGlsZSBwaWRfdCBteV9waWQgPSAocGlkX3QpKC0xKTsgCisgIHZvbGF0aWxlIHBpZF90IG15X3BpZDI7CisKKyAgZ2NyeV9hc3NlcnQgKHBvb2xfaXNfbG9ja2VkKTsKKworIHJldHJ5OgorICAvKiBHZXQgb3VyIG93biBwaWQsIHNvIHRoYXQgd2UgY2FuIGRldGVjdCBhIGZvcmsuICovCisgIG15X3BpZDIgPSBnZXRwaWQgKCk7CisgIGlmIChteV9waWQgPT0gKHBpZF90KSgtMSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBteV9waWQgPSBteV9waWQyOworICBpZiAoIG15X3BpZCAhPSBteV9waWQyICkKKyAgICB7CisgICAgICAvKiBXZSBkZXRlY3RlZCBhIHBsYWluIGZvcms7IGkuZS4gd2UgYXJlIG5vdyB0aGUgY2hpbGQuICBVcGRhdGUKKyAgICAgICAgIHRoZSBzdGF0aWMgcGlkIGFuZCBhZGQgc29tZSByYW5kb21uZXNzLiAqLworICAgICAgcGlkX3QgeDsKKworICAgICAgbXlfcGlkID0gbXlfcGlkMjsKKyAgICAgIHggPSBteV9waWQ7CisgICAgICBhZGRfcmFuZG9tbmVzcyAoJngsIHNpemVvZih4KSwgUkFORE9NX09SSUdJTl9JTklUKTsKKyAgICAgIGp1c3RfbWl4ZWQgPSAwOyAvKiBNYWtlIHN1cmUgaXQgd2lsbCBnZXQgbWl4ZWQuICovCisgICAgfQorCisgIGdjcnlfYXNzZXJ0IChwb29sX2lzX2xvY2tlZCk7CisKKyAgLyogT3VyIGNvZGUgZG9lcyBub3QgYWxsb3cgdG8gZXh0cmFjdCBtb3JlIHRoYW4gUE9PTFNJWkUuICBCZXR0ZXIKKyAgICAgY2hlY2sgaXQgaGVyZS4gKi8KKyAgaWYgKGxlbmd0aCA+IFBPT0xTSVpFKQorICAgIHsKKyAgICAgIGxvZ19idWcoInRvbyBtYW55IHJhbmRvbSBiaXRzIHJlcXVlc3RlZFxuIik7CisgICAgfQorCisgIGlmICghcG9vbF9maWxsZWQpCisgICAgeworICAgICAgaWYgKHJlYWRfc2VlZF9maWxlKCkgKQorICAgICAgICBwb29sX2ZpbGxlZCA9IDE7CisgICAgfQorCisgIC8qIEZvciBsZXZlbCAyIHF1YWxpdHkgKGtleSBnZW5lcmF0aW9uKSB3ZSBhbHdheXMgbWFrZSBzdXJlIHRoYXQgdGhlCisgICAgIHBvb2wgaGFzIGJlZW4gc2VlZGVkIGVub3VnaCBpbml0aWFsbHkuICovCisgIGlmIChsZXZlbCA9PSBHQ1JZX1ZFUllfU1RST05HX1JBTkRPTSAmJiAhZGlkX2luaXRpYWxfZXh0cmFfc2VlZGluZykKKyAgICB7CisgICAgICBzaXplX3QgbmVlZGVkOworCisgICAgICBwb29sX2JhbGFuY2UgPSAwOworICAgICAgbmVlZGVkID0gbGVuZ3RoIC0gcG9vbF9iYWxhbmNlOworICAgICAgaWYgKG5lZWRlZCA8IFBPT0xTSVpFLzIpCisgICAgICAgIG5lZWRlZCA9IFBPT0xTSVpFLzI7CisgICAgICBlbHNlIGlmKCBuZWVkZWQgPiBQT09MU0laRSApCisgICAgICAgIEJVRyAoKTsKKyAgICAgIHJlYWRfcmFuZG9tX3NvdXJjZSAoUkFORE9NX09SSUdJTl9FWFRSQVBPTEwsIG5lZWRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR0NSWV9WRVJZX1NUUk9OR19SQU5ET00pOworICAgICAgcG9vbF9iYWxhbmNlICs9IG5lZWRlZDsKKyAgICAgIGRpZF9pbml0aWFsX2V4dHJhX3NlZWRpbmcgPSAxOworICAgIH0KKworICAvKiBGb3IgbGV2ZWwgMiBtYWtlIHN1cmUgdGhhdCB0aGVyZSBpcyBlbm91Z2ggcmFuZG9tIGluIHRoZSBwb29sLiAqLworICBpZiAobGV2ZWwgPT0gR0NSWV9WRVJZX1NUUk9OR19SQU5ET00gJiYgcG9vbF9iYWxhbmNlIDwgbGVuZ3RoKQorICAgIHsKKyAgICAgIHNpemVfdCBuZWVkZWQ7CisgICAgICAKKyAgICAgIGlmIChwb29sX2JhbGFuY2UgPCAwKQorICAgICAgICBwb29sX2JhbGFuY2UgPSAwOworICAgICAgbmVlZGVkID0gbGVuZ3RoIC0gcG9vbF9iYWxhbmNlOworICAgICAgaWYgKG5lZWRlZCA+IFBPT0xTSVpFKQorICAgICAgICBCVUcgKCk7CisgICAgICByZWFkX3JhbmRvbV9zb3VyY2UgKFJBTkRPTV9PUklHSU5fRVhUUkFQT0xMLCBuZWVkZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdDUllfVkVSWV9TVFJPTkdfUkFORE9NKTsKKyAgICAgIHBvb2xfYmFsYW5jZSArPSBuZWVkZWQ7CisgICAgfQorCisgIC8qIE1ha2Ugc3VyZSB0aGUgcG9vbCBpcyBmaWxsZWQuICovCisgIHdoaWxlICghcG9vbF9maWxsZWQpCisgICAgcmFuZG9tX3BvbGwoKTsKKworICAvKiBBbHdheXMgZG8gYSBmYXN0IHJhbmRvbSBwb2xsICh3ZSBoYXZlIHRvIHVzZSB0aGUgdW5sb2NrZWQgdmVyc2lvbikuICovCisgIGRvX2Zhc3RfcmFuZG9tX3BvbGwoKTsKKyAgCisgIC8qIE1peCB0aGUgcGlkIGluIHNvIHRoYXQgd2UgZm9yIHN1cmUgd29uJ3QgZGVsaXZlciB0aGUgc2FtZSByYW5kb20KKyAgICAgYWZ0ZXIgYSBmb3JrLiAqLworICB7CisgICAgcGlkX3QgYXBpZCA9IG15X3BpZDsKKyAgICBhZGRfcmFuZG9tbmVzcyAoJmFwaWQsIHNpemVvZiAoYXBpZCksIFJBTkRPTV9PUklHSU5fSU5JVCk7CisgIH0KKworICAvKiBNaXggdGhlIHBvb2wgKGlmIGFkZF9yYW5kb21uZXNzKCkgZGlkbid0IGl0KS4gKi8KKyAgaWYgKCFqdXN0X21peGVkKQorICAgIHsKKyAgICAgIG1peF9wb29sKHJuZHBvb2wpOworICAgICAgcm5kc3RhdHMubWl4cm5kKys7CisgICAgfQorCisgIC8qIENyZWF0ZSBhIG5ldyBwb29sLiAqLworICBmb3IoaT0wLGRwPSh1bnNpZ25lZCBsb25nKilrZXlwb29sLCBzcD0odW5zaWduZWQgbG9uZyopcm5kcG9vbDsKKyAgICAgIGkgPCBQT09MV09SRFM7IGkrKywgZHArKywgc3ArKyApCisgICAgKmRwID0gKnNwICsgQUREX1ZBTFVFOworCisgIC8qIE1peCBib3RoIHBvb2xzLiAqLworICBtaXhfcG9vbChybmRwb29sKTsgcm5kc3RhdHMubWl4cm5kKys7CisgIG1peF9wb29sKGtleXBvb2wpOyBybmRzdGF0cy5taXhrZXkrKzsKKworICAvKiBSZWFkIHRoZSByZXF1ZXN0ZWQgZGF0YS4gIFdlIHVzZSBhIHJlYWQgcG9pbnRlciB0byByZWFkIGZyb20gYQorICAgICBkaWZmZXJlbnQgcG9zaXRpb24gZWFjaCB0aW1lLiAgKi8KKyAgd2hpbGUgKGxlbmd0aC0tKQorICAgIHsKKyAgICAgICpidWZmZXIrKyA9IGtleXBvb2xbcG9vbF9yZWFkcG9zKytdOworICAgICAgaWYgKHBvb2xfcmVhZHBvcyA+PSBQT09MU0laRSkKKyAgICAgICAgcG9vbF9yZWFkcG9zID0gMDsKKyAgICAgIHBvb2xfYmFsYW5jZS0tOworICAgIH0KKyAKKyAgaWYgKHBvb2xfYmFsYW5jZSA8IDApCisgICAgcG9vbF9iYWxhbmNlID0gMDsKKworICAvKiBDbGVhciB0aGUga2V5cG9vbC4gKi8KKyAgbWVtc2V0IChrZXlwb29sLCAwLCBQT09MU0laRSk7CisKKyAgLyogV2UgbmVlZCB0byBkZXRlY3Qgd2hldGhlciBhIGZvcmsgaGFzIGhhcHBlbmVkLiAgQSBmb3JrIG1pZ2h0IGhhdmUKKyAgICAgYW4gaWRlbnRpY2FsIHBvb2wgYW5kIHRodXMgdGhlIGNoaWxkIGFuZCB0aGUgcGFyZW50IGNvdWxkIGVtaXQKKyAgICAgdGhlIHZlcnkgc2FtZSByYW5kb20gbnVtYmVyLiAgVGhpcyB0ZXN0IGhlcmUgaXMgdG8gZGV0ZWN0IGZvcmtzCisgICAgIGluIGEgbXVsdGktdGhyZWFkZWQgcHJvY2Vzcy4gIEl0IGRvZXMgbm90IHdvcmsgd2l0aCBhbGwgdGhyZWFkCisgICAgIGltcGxlbWVudGF0aW9ucyBpbiBwYXJ0aWN1bGFyIG5vdCB3aXRoIHB0aHJlYWRzLiAgSG93ZXZlciBpdCBpcworICAgICBnb29kIGVub3VnaCBmb3IgR05VIFB0aC4gKi8KKyAgaWYgKCBnZXRwaWQgKCkgIT0gbXlfcGlkMiApCisgICAgeworICAgICAgcGlkX3QgeCA9IGdldHBpZCgpOworICAgICAgYWRkX3JhbmRvbW5lc3MgKCZ4LCBzaXplb2YoeCksIFJBTkRPTV9PUklHSU5fSU5JVCk7CisgICAgICBqdXN0X21peGVkID0gMDsgLyogTWFrZSBzdXJlIGl0IHdpbGwgZ2V0IG1peGVkLiAqLworICAgICAgbXlfcGlkID0geDsgICAgIC8qIEFsc28gdXBkYXRlIHRoZSBzdGF0aWMgcGlkLiAqLworICAgICAgZ290byByZXRyeTsKKyAgICB9Cit9CisKKworCisvKiBBZGQgTEVOR1RIIGJ5dGVzIG9mIHJhbmRvbW5lc3MgZnJvbSBidWZmZXIgdG8gdGhlIHBvb2wuICBPUklHSU4gaXMKKyAgIHVzZWQgdG8gc3BlY2lmeSB0aGUgcmFuZG9tbmVzcyBvcmlnaW4uICBUaGlzIGlzIG9uZSBvZiB0aGUKKyAgIFJBTkRPTV9PUklHSU5fKiB2YWx1ZXMuICovCitzdGF0aWMgdm9pZAorYWRkX3JhbmRvbW5lc3MgKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCwgZW51bSByYW5kb21fb3JpZ2lucyBvcmlnaW4pCit7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAgPSBidWZmZXI7CisgIHNpemVfdCBjb3VudCA9IDA7CisKKyAgZ2NyeV9hc3NlcnQgKHBvb2xfaXNfbG9ja2VkKTsKKworICBybmRzdGF0cy5hZGRieXRlcyArPSBsZW5ndGg7CisgIHJuZHN0YXRzLm5hZGRieXRlcysrOworICB3aGlsZSAobGVuZ3RoLS0gKQorICAgIHsKKyAgICAgIHJuZHBvb2xbcG9vbF93cml0ZXBvcysrXSBePSAqcCsrOworICAgICAgY291bnQrKzsKKyAgICAgIGlmIChwb29sX3dyaXRlcG9zID49IFBPT0xTSVpFICkKKyAgICAgICAgeworICAgICAgICAgIC8qIEl0IGlzIHBvc3NpYmxlIHRoYXQgd2UgYXJlIGludm9rZWQgYmVmb3JlIHRoZSBwb29sIGlzCisgICAgICAgICAgICAgZmlsbGVkIHVzaW5nIGFuIHVucmVsaWFibGUgb3JpZ2luIG9mIGVudHJvcHksIGZvciBleGFtcGxlCisgICAgICAgICAgICAgdGhlIGZhc3QgcmFuZG9tIHBvbGwuICBUbyBhdm9pZCBmbGFnZ2luZyB0aGUgcG9vbCBhcworICAgICAgICAgICAgIGZpbGxlZCBpbiB0aGlzIGNhc2UsIHdlIHRyYWNrIHRoZSBpbml0aWFsIGZpbGxpbmcgc3RhdGUKKyAgICAgICAgICAgICBzZXBhcmF0ZWx5LiAgU2VlIGFsc28gdGhlIHJlbWFya3MgYWJvdXQgdGhlIHNlZWQgZmlsZS4gKi8KKyAgICAgICAgICBpZiAob3JpZ2luID49IFJBTkRPTV9PUklHSU5fU0xPV1BPTEwgJiYgIXBvb2xfZmlsbGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBwb29sX2ZpbGxlZF9jb3VudGVyICs9IGNvdW50OworICAgICAgICAgICAgICBjb3VudCA9IDA7CisgICAgICAgICAgICAgIGlmIChwb29sX2ZpbGxlZF9jb3VudGVyID49IFBPT0xTSVpFKQorICAgICAgICAgICAgICAgIHBvb2xfZmlsbGVkID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBwb29sX3dyaXRlcG9zID0gMDsKKyAgICAgICAgICBtaXhfcG9vbChybmRwb29sKTsgcm5kc3RhdHMubWl4cm5kKys7CisgICAgICAgICAganVzdF9taXhlZCA9ICFsZW5ndGg7CisJfQorICAgIH0KK30KKworCisKK3N0YXRpYyB2b2lkCityYW5kb21fcG9sbCgpCit7CisgIHJuZHN0YXRzLnNsb3dwb2xscysrOworICByZWFkX3JhbmRvbV9zb3VyY2UgKFJBTkRPTV9PUklHSU5fU0xPV1BPTEwsIFBPT0xTSVpFLzUsIEdDUllfU1RST05HX1JBTkRPTSk7Cit9CisKKworLyogUnVudGltZSBkZXRlcm1pbmF0aW9uIG9mIHRoZSBzbG93IGVudHJvcHkgZ2F0aGVyaW5nIG1vZHVsZS4gICovCitzdGF0aWMgaW50ICgqCitnZXRmbmNfZ2F0aGVyX3JhbmRvbSAodm9pZCkpKHZvaWQgKCopKGNvbnN0IHZvaWQqLCBzaXplX3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIHJhbmRvbV9vcmlnaW5zKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gcmFuZG9tX29yaWdpbnMsIHNpemVfdCwgaW50KQoreworICBpbnQgKCpmbmMpKHZvaWQgKCopKGNvbnN0IHZvaWQqLCBzaXplX3QsIGVudW0gcmFuZG9tX29yaWdpbnMpLCAKKyAgICAgICAgICAgICBlbnVtIHJhbmRvbV9vcmlnaW5zLCBzaXplX3QsIGludCk7CisgIAorI2lmIFVTRV9STkRMSU5VWAorICBpZiAoICFhY2Nlc3MgKE5BTUVfT0ZfREVWX1JBTkRPTSwgUl9PSykKKyAgICAgICAmJiAhYWNjZXNzIChOQU1FX09GX0RFVl9VUkFORE9NLCBSX09LKSkKKyAgICB7CisgICAgICBmbmMgPSBfZ2NyeV9ybmRsaW51eF9nYXRoZXJfcmFuZG9tOworICAgICAgcmV0dXJuIGZuYzsKKyAgICB9CisjZW5kaWYKKworI2lmIFVTRV9STkRFR0QKKyAgaWYgKCBfZ2NyeV9ybmRlZ2RfY29ubmVjdF9zb2NrZXQgKDEpICE9IC0xICkKKyAgICB7CisgICAgICBmbmMgPSBfZ2NyeV9ybmRlZ2RfZ2F0aGVyX3JhbmRvbTsKKyAgICAgIHJldHVybiBmbmM7CisgICAgfQorI2VuZGlmCisKKyNpZiBVU0VfUk5EVU5JWAorICBmbmMgPSBfZ2NyeV9ybmR1bml4X2dhdGhlcl9yYW5kb207CisgIHJldHVybiBmbmM7CisjZW5kaWYKKworI2lmIFVTRV9STkRXMzIKKyAgZm5jID0gX2djcnlfcm5kdzMyX2dhdGhlcl9yYW5kb207CisgIHJldHVybiBmbmM7CisjZW5kaWYKKworICBsb2dfZmF0YWwgKF8oIm5vIGVudHJvcHkgZ2F0aGVyaW5nIG1vZHVsZSBkZXRlY3RlZFxuIikpOworCisgIHJldHVybiBOVUxMOyAvKk5PVFJFQUNIRUQqLworfQorCisvKiBSdW50aW1lIGRldGVybWluYXRpb24gb2YgdGhlIGZhc3QgZW50cm9weSBnYXRoZXJpbmcgZnVuY3Rpb24uCisgICAoQ3VycmVudGx5IGEgY29tcGlsZSB0aW1lIG1ldGhvZCBpcyB1c2VkLikgICovCitzdGF0aWMgdm9pZCAoKgorZ2V0Zm5jX2Zhc3RfcmFuZG9tX3BvbGwgKHZvaWQpKSggdm9pZCAoKikoY29uc3Qgdm9pZCosIHNpemVfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gcmFuZG9tX29yaWdpbnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSByYW5kb21fb3JpZ2lucykKK3sKKyNpZiBVU0VfUk5EVzMyCisgIHJldHVybiBfZ2NyeV9ybmR3MzJfZ2F0aGVyX3JhbmRvbV9mYXN0OworI2VuZGlmCisgIHJldHVybiBOVUxMOworfQorCisKKworc3RhdGljIHZvaWQKK2RvX2Zhc3RfcmFuZG9tX3BvbGwgKHZvaWQpCit7CisgIGdjcnlfYXNzZXJ0IChwb29sX2lzX2xvY2tlZCk7CisKKyAgcm5kc3RhdHMuZmFzdHBvbGxzKys7CisKKyAgaWYgKGZhc3RfZ2F0aGVyX2ZuYykKKyAgICBmYXN0X2dhdGhlcl9mbmMgKGFkZF9yYW5kb21uZXNzLCBSQU5ET01fT1JJR0lOX0ZBU1RQT0xMKTsKKworICAvKiBDb250aW51ZSB3aXRoIHRoZSBnZW5lcmljIGZ1bmN0aW9ucy4gKi8KKyNpZiBIQVZFX0dFVEhSVElNRQorICB7CQorICAgIGhydGltZV90IHR2OworICAgIHR2ID0gZ2V0aHJ0aW1lKCk7CisgICAgYWRkX3JhbmRvbW5lc3MoICZ0diwgc2l6ZW9mKHR2KSwgUkFORE9NX09SSUdJTl9GQVNUUE9MTCApOworICB9CisjZWxpZiBIQVZFX0dFVFRJTUVPRkRBWQorICB7CQorICAgIHN0cnVjdCB0aW1ldmFsIHR2OworICAgIGlmKCBnZXR0aW1lb2ZkYXkoICZ0diwgTlVMTCApICkKKyAgICAgIEJVRygpOworICAgIGFkZF9yYW5kb21uZXNzKCAmdHYudHZfc2VjLCBzaXplb2YodHYudHZfc2VjKSwgUkFORE9NX09SSUdJTl9GQVNUUE9MTCApOworICAgIGFkZF9yYW5kb21uZXNzKCAmdHYudHZfdXNlYywgc2l6ZW9mKHR2LnR2X3VzZWMpLCBSQU5ET01fT1JJR0lOX0ZBU1RQT0xMICk7CisgIH0KKyNlbGlmIEhBVkVfQ0xPQ0tfR0VUVElNRQorICB7CXN0cnVjdCB0aW1lc3BlYyB0djsKKyAgaWYoIGNsb2NrX2dldHRpbWUoIENMT0NLX1JFQUxUSU1FLCAmdHYgKSA9PSAtMSApCisgICAgQlVHKCk7CisgIGFkZF9yYW5kb21uZXNzKCAmdHYudHZfc2VjLCBzaXplb2YodHYudHZfc2VjKSwgUkFORE9NX09SSUdJTl9GQVNUUE9MTCApOworICBhZGRfcmFuZG9tbmVzcyggJnR2LnR2X25zZWMsIHNpemVvZih0di50dl9uc2VjKSwgUkFORE9NX09SSUdJTl9GQVNUUE9MTCApOworICB9CisjZWxzZSAvKiB1c2UgdGltZXMgKi8KKyMgaWZuZGVmIEhBVkVfRE9TSVNIX1NZU1RFTQorICB7CXN0cnVjdCB0bXMgYnVmOworICB0aW1lcyggJmJ1ZiApOworICBhZGRfcmFuZG9tbmVzcyggJmJ1Ziwgc2l6ZW9mIGJ1ZiwgUkFORE9NX09SSUdJTl9GQVNUUE9MTCApOworICB9CisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIEhBVkVfR0VUUlVTQUdFCisjIGlmZGVmIFJVU0FHRV9TRUxGCisgIHsJCisgICAgc3RydWN0IHJ1c2FnZSBidWY7CisgICAgLyogUU5YL05ldXRyaW5vIGRvZXMgcmV0dXJuIEVOT1NZUyAtIHNvIHdlIGp1c3QgaWdub3JlIGl0IGFuZCBhZGQKKyAgICAgICB3aGF0ZXZlciBpcyBpbiBidWYuICBJbiBhIGNocm9vdCBlbnZpcm9ubWVudCBpdCBtaWdodCBub3Qgd29yaworICAgICAgIGF0IGFsbCAoaS5lLiBiZWNhdXNlIC9wcm9jLyBpcyBub3QgYWNjZXNzaWJsZSksIHNvIHdlIGJldHRlcgorICAgICAgIGlnbm9yZSBhbGwgZXJyb3IgY29kZXMgYW5kIGhvcGUgZm9yIHRoZSBiZXN0LiAqLworICAgIGdldHJ1c2FnZSAoUlVTQUdFX1NFTEYsICZidWYgKTsKKyAgICBhZGRfcmFuZG9tbmVzcyggJmJ1Ziwgc2l6ZW9mIGJ1ZiwgUkFORE9NX09SSUdJTl9GQVNUUE9MTCApOworICAgIG1lbXNldCggJmJ1ZiwgMCwgc2l6ZW9mIGJ1ZiApOworICB9CisjIGVsc2UgLyohUlVTQUdFX1NFTEYqLworIyAgaWZkZWYgX19HQ0NfXworIyAgIHdhcm5pbmcgVGhlcmUgaXMgbm8gUlVTQUdFX1NFTEYgb24gdGhpcyBzeXN0ZW0KKyMgIGVuZGlmCisjIGVuZGlmIC8qIVJVU0FHRV9TRUxGKi8KKyNlbmRpZiAvKkhBVkVfR0VUUlVTQUdFKi8KKworICAvKiBUaW1lIGFuZCBjbG9jayBhcmUgYXZhaWxhYmUgb24gYWxsIHN5c3RlbXMgLSBzbyB3ZSBiZXR0ZXIgZG8gaXQKKyAgICAganVzdCBpbiBjYXNlIG9uZSBvZiB0aGUgYWJvdmUgZnVuY3Rpb25zIGRpZG4ndCB3b3JrLiAgKi8KKyAgeworICAgIHRpbWVfdCB4ID0gdGltZShOVUxMKTsKKyAgICBhZGRfcmFuZG9tbmVzcyggJngsIHNpemVvZih4KSwgUkFORE9NX09SSUdJTl9GQVNUUE9MTCApOworICB9CisgIHsJCisgICAgY2xvY2tfdCB4ID0gY2xvY2soKTsKKyAgICBhZGRfcmFuZG9tbmVzcyggJngsIHNpemVvZih4KSwgUkFORE9NX09SSUdJTl9GQVNUUE9MTCApOworICB9CisKKyAgLyogSWYgdGhlIHN5c3RlbSBmZWF0dXJlcyBhIGZhc3QgaGFyZHdhcmUgUk5HLCByZWFkIHNvbWUgYnl0ZXMgZnJvbQorICAgICB0aGVyZS4gICovCisgIF9nY3J5X3JuZGh3X3BvbGxfZmFzdCAoYWRkX3JhbmRvbW5lc3MsIFJBTkRPTV9PUklHSU5fRkFTVFBPTEwpOworfQorCisKKy8qIFRoZSBmYXN0IHJhbmRvbSBwb29sIGZ1bmN0aW9uIGFzIGNhbGxlZCBhdCBzb21lIHBsYWNlcyBpbgorICAgbGliZ2NyeXB0LiAgVGhpcyBpcyBtZXJlbHkgYSB3cmFwcGVyIHRvIG1ha2Ugc3VyZSB0aGF0IHRoaXMgbW9kdWxlCisgICBpcyBpbml0YWxpemVkIGFuZCB0byBsb29rIHRoZSBwb29sLiAgTm90ZSwgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIGEKKyAgIE5PUCB1bmxlc3MgYSByYW5kb20gZnVuY3Rpb24gaGFzIGJlZW4gdXNlZCBvciBfZ2NyeV9pbml0aWFsaXplICgxKQorICAgaGFzIGJlZW4gdXNlZC4gIFdlIHVzZSB0aGlzIGhhY2sgc28gdGhhdCB0aGUgaW50ZXJuYWwgdXNlIG9mIHRoaXMKKyAgIGZ1bmN0aW9uIGluIGNpcGhlcl9vcGVuIGFuZCBtZF9vcGVuIHdvbid0IHN0YXJ0IGZpbGxpbmcgdXAgdGhlCisgICByYW5kb20gcG9vbCwgZXZlbiBpZiBubyByYW5kb20gd2lsbCBiZSByZXF1aXJlZCBieSB0aGUgcHJvY2Vzcy4gKi8KK3ZvaWQKK19nY3J5X3JuZ2NzcHJuZ19mYXN0X3BvbGwgKHZvaWQpCit7CisgIGluaXRpYWxpemVfYmFzaWNzICgpOworCisgIGxvY2tfcG9vbCAoKTsKKyAgaWYgKHJuZHBvb2wpCisgICAgeworICAgICAgLyogWWVzLCB3ZSBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQuICovCisgICAgICBkb19mYXN0X3JhbmRvbV9wb2xsICgpOworICAgIH0KKyAgdW5sb2NrX3Bvb2wgKCk7Cit9CisKKworCitzdGF0aWMgdm9pZAorcmVhZF9yYW5kb21fc291cmNlIChlbnVtIHJhbmRvbV9vcmlnaW5zIG9yZ2luLCBzaXplX3QgbGVuZ3RoLCBpbnQgbGV2ZWwgKQoreworICBpZiAoICFzbG93X2dhdGhlcl9mbmMgKQorICAgIGxvZ19mYXRhbCAoIlNsb3cgZW50cm9weSBnYXRoZXJpbmcgbW9kdWxlIG5vdCB5ZXQgaW5pdGlhbGl6ZWRcbiIpOworCisgIGlmICggc2xvd19nYXRoZXJfZm5jIChhZGRfcmFuZG9tbmVzcywgb3JnaW4sIGxlbmd0aCwgbGV2ZWwpIDwgMCkKKyAgICBsb2dfZmF0YWwgKCJObyB3YXkgdG8gZ2F0aGVyIGVudHJvcHkgZm9yIHRoZSBSTkdcbiIpOworfQorCisKK3N0YXRpYyBpbnQKK2dhdGhlcl9mYWtlZCAodm9pZCAoKmFkZCkoY29uc3Qgdm9pZCosIHNpemVfdCwgZW51bSByYW5kb21fb3JpZ2lucyksCisgICAgICAgICAgICAgIGVudW0gcmFuZG9tX29yaWdpbnMgb3JpZ2luLCBzaXplX3QgbGVuZ3RoLCBpbnQgbGV2ZWwgKQoreworICBzdGF0aWMgaW50IGluaXRpYWxpemVkPTA7CisgIHNpemVfdCBuOworICBjaGFyICpidWZmZXIsICpwOworICAKKyAgKHZvaWQpYWRkOworICAodm9pZClsZXZlbDsKKyAgCisgIGlmICggIWluaXRpYWxpemVkICkKKyAgICB7CisgICAgICBsb2dfaW5mbyhfKCJXQVJOSU5HOiB1c2luZyBpbnNlY3VyZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciEhXG4iKSk7CisgICAgICBpbml0aWFsaXplZD0xOworI2lmZGVmIEhBVkVfUkFORAorICAgICAgc3JhbmQoIHRpbWUoTlVMTCkqZ2V0cGlkKCkpOworI2Vsc2UKKyAgICAgIHNyYW5kb20oIHRpbWUoTlVMTCkqZ2V0cGlkKCkpOworI2VuZGlmCisgICAgfQorCisgIHAgPSBidWZmZXIgPSBnY3J5X3htYWxsb2MoIGxlbmd0aCApOworICBuID0gbGVuZ3RoOworI2lmZGVmIEhBVkVfUkFORAorICB3aGlsZSAoIG4tLSApCisgICAgKnArKyA9ICgodW5zaWduZWQpKDEgKyAoaW50KSAoMjU2LjAqcmFuZCgpLyhSQU5EX01BWCsxLjApKSktMSk7CisjZWxzZQorICB3aGlsZSAoIG4tLSApCisgICAgKnArKyA9ICgodW5zaWduZWQpKDEgKyAoaW50KSAoMjU2LjAqcmFuZG9tKCkvKFJBTkRfTUFYKzEuMCkpKS0xKTsKKyNlbmRpZgorICBhZGRfcmFuZG9tbmVzcyAoIGJ1ZmZlciwgbGVuZ3RoLCBvcmlnaW4gKTsKKyAgZ2NyeV9mcmVlIChidWZmZXIpOworICByZXR1cm4gMDsgLyogb2theSAqLworfQorCisKKy8qIENyZWF0ZSBhbiB1bnByZWRpY2FibGUgbm9uY2Ugb2YgTEVOR1RIIGJ5dGVzIGluIEJVRkZFUi4gKi8KK3ZvaWQKK19nY3J5X3JuZ2NzcHJuZ19jcmVhdGVfbm9uY2UgKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkKK3sKKyAgc3RhdGljIHVuc2lnbmVkIGNoYXIgbm9uY2VfYnVmZmVyWzIwKzhdOworICBzdGF0aWMgaW50IG5vbmNlX2J1ZmZlcl9pbml0aWFsaXplZCA9IDA7CisgIHN0YXRpYyB2b2xhdGlsZSBwaWRfdCBteV9waWQ7IC8qIFRoZSB2b2xhdGlsZSBpcyB0aGVyZSB0byBtYWtlIHN1cmUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVyIGRvZXMgbm90IG9wdGltaXplIHRoZSBjb2RlIGF3YXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gY2FzZSB0aGUgZ2V0cGlkIGZ1bmN0aW9uIGlzIGJhZGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZWQuICovCisgIHZvbGF0aWxlIHBpZF90IGFwaWQ7CisgIHVuc2lnbmVkIGNoYXIgKnA7CisgIHNpemVfdCBuOworICBpbnQgZXJyOworCisgIC8qIE1ha2Ugc3VyZSB3ZSBhcmUgaW5pdGlhbGl6ZWQuICovCisgIGluaXRpYWxpemUgKCk7CisKKyNpZmRlZiBVU0VfUkFORE9NX0RBRU1PTgorICBpZiAoYWxsb3dfZGFlbW9uCisgICAgICAmJiAhX2djcnlfZGFlbW9uX2NyZWF0ZV9ub25jZSAoZGFlbW9uX3NvY2tldF9uYW1lLCBidWZmZXIsIGxlbmd0aCkpCisgICAgcmV0dXJuOyAvKiBUaGUgZGFlbW9uIHN1Y2NlZWRlZC4gKi8KKyAgYWxsb3dfZGFlbW9uID0gMDsgLyogRGFlbW9uIGZhaWxlZCAtIHN3aXRjaCBvZmYuICovCisjZW5kaWYgLypVU0VfUkFORE9NX0RBRU1PTiovCisKKyAgLyogQWNxdWlyZSB0aGUgbm9uY2UgYnVmZmVyIGxvY2suICovCisgIGVyciA9IGF0aF9tdXRleF9sb2NrICgmbm9uY2VfYnVmZmVyX2xvY2spOworICBpZiAoZXJyKQorICAgIGxvZ19mYXRhbCAoImZhaWxlZCB0byBhY3F1aXJlIHRoZSBub25jZSBidWZmZXIgbG9jazogJXNcbiIsCisgICAgICAgICAgICAgICBzdHJlcnJvciAoZXJyKSk7CisKKyAgYXBpZCA9IGdldHBpZCAoKTsKKyAgLyogVGhlIGZpcnN0IHRpbWUgaW50aWFsaXplIG91ciBidWZmZXIuICovCisgIGlmICghbm9uY2VfYnVmZmVyX2luaXRpYWxpemVkKQorICAgIHsKKyAgICAgIHRpbWVfdCBhdGltZSA9IHRpbWUgKE5VTEwpOworICAgICAgcGlkX3QgeHBpZCA9IGFwaWQ7CisKKyAgICAgIG15X3BpZCA9IGFwaWQ7CisKKyAgICAgIGlmICgoc2l6ZW9mIGFwaWQgKyBzaXplb2YgYXRpbWUpID4gc2l6ZW9mIG5vbmNlX2J1ZmZlcikKKyAgICAgICAgQlVHICgpOworCisgICAgICAvKiBJbml0aWFsaXplIHRoZSBmaXJzdCAyMCBieXRlcyB3aXRoIGEgcmVhc29uYWJsZSB2YWx1ZSBzbyB0aGF0CisgICAgICAgICBhIGZhaWx1cmUgb2YgZ2NyeV9yYW5kb21pemUgd29uJ3QgYWZmZWN0IHVzIHRvbyBtdWNoLiAgRG9uJ3QKKyAgICAgICAgIGNhcmUgYWJvdXQgdGhlIHVuaW5pdGlhbGl6ZWQgcmVtYWluaW5nIGJ5dGVzLiAqLworICAgICAgcCA9IG5vbmNlX2J1ZmZlcjsKKyAgICAgIG1lbWNweSAocCwgJnhwaWQsIHNpemVvZiB4cGlkKTsKKyAgICAgIHAgKz0gc2l6ZW9mIHhwaWQ7CisgICAgICBtZW1jcHkgKHAsICZhdGltZSwgc2l6ZW9mIGF0aW1lKTsgCisKKyAgICAgIC8qIEluaXRpYWxpemUgdGhlIG5ldmVyIGNoYW5naW5nIHByaXZhdGUgcGFydCBvZiA2NCBiaXRzLiAqLworICAgICAgZ2NyeV9yYW5kb21pemUgKG5vbmNlX2J1ZmZlcisyMCwgOCwgR0NSWV9XRUFLX1JBTkRPTSk7CisKKyAgICAgIG5vbmNlX2J1ZmZlcl9pbml0aWFsaXplZCA9IDE7CisgICAgfQorICBlbHNlIGlmICggbXlfcGlkICE9IGFwaWQgKQorICAgIHsKKyAgICAgIC8qIFdlIGZvcmtlZC4gTmVlZCB0byByZXNlZWQgdGhlIGJ1ZmZlciAtIGRvaW5nIHRoaXMgZm9yIHRoZQorICAgICAgICAgcHJpdmF0ZSBwYXJ0IHNob3VsZCBiZSBzdWZmaWNpZW50LiAqLworICAgICAgZ2NyeV9yYW5kb21pemUgKG5vbmNlX2J1ZmZlcisyMCwgOCwgR0NSWV9XRUFLX1JBTkRPTSk7CisgICAgICAvKiBVcGRhdGUgdGhlIHBpZCBzbyB0aGF0IHdlIHdvbid0IHJ1biBpbnRvIGhlcmUgYWdhaW4gYW5kCisgICAgICAgICBhZ2Fpbi4gKi8KKyAgICAgIG15X3BpZCA9IGFwaWQ7CisgICAgfQorCisgIC8qIENyZWF0ZSB0aGUgbm9uY2UgYnkgaGFzaGluZyB0aGUgZW50aXJlIGJ1ZmZlciwgcmV0dXJuaW5nIHRoZSBoYXNoCisgICAgIGFuZCB1cGRhdGluZyB0aGUgZmlyc3QgMjAgYnl0ZXMgb2YgdGhlIGJ1ZmZlciB3aXRoIHRoaXMgaGFzaC4gKi8KKyAgZm9yIChwID0gYnVmZmVyOyBsZW5ndGggPiAwOyBsZW5ndGggLT0gbiwgcCArPSBuKQorICAgIHsKKyAgICAgIF9nY3J5X3NoYTFfaGFzaF9idWZmZXIgKG5vbmNlX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbmNlX2J1ZmZlciwgc2l6ZW9mIG5vbmNlX2J1ZmZlcik7CisgICAgICBuID0gbGVuZ3RoID4gMjA/IDIwIDogbGVuZ3RoOworICAgICAgbWVtY3B5IChwLCBub25jZV9idWZmZXIsIG4pOworICAgIH0KKworCisgIC8qIFJlbGVhc2UgdGhlIG5vbmNlIGJ1ZmZlciBsb2NrLiAqLworICBlcnIgPSBhdGhfbXV0ZXhfdW5sb2NrICgmbm9uY2VfYnVmZmVyX2xvY2spOworICBpZiAoZXJyKQorICAgIGxvZ19mYXRhbCAoImZhaWxlZCB0byByZWxlYXNlIHRoZSBub25jZSBidWZmZXIgbG9jazogJXNcbiIsCisgICAgICAgICAgICAgICBzdHJlcnJvciAoZXJyKSk7CisKK30KZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9yYW5kb20vcmFuZG9tLWRhZW1vbi5jIGIvbGliZ2NyeXB0LTEuNC42L3JhbmRvbS9yYW5kb20tZGFlbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUwM2JhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9yYW5kb20vcmFuZG9tLWRhZW1vbi5jCkBAIC0wLDAgKzEsMzYwIEBACisvKiByYW5kb20tZGFlbW9uLmMgIC0gQWNjZXNzIHRvIHRoZSBleHRlcm5hbCByYW5kb20gZGFlbW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqLworCisvKgorICAgVGhlIGZ1bmN0aW9ucyBoZXJlIGFyZSB1c2VkIGJ5IHJhbmRvbS5jIHRvIGRpdmVydCBjYWxscyB0byBhbgorICAgZXh0ZXJuYWwgcmFuZG9tIG51bWJlciBkYWVtb24uICBUaGUgYWN0dWFsIGRhZW1vbiB3ZSB1c2UgaXMKKyAgIGdjcnlwdHJuZC4gIFN1Y2ggYSBkYWVtb24gaXMgdXNlZnVsIHRvIGtlZXAgYSBwZXJzaXN0ZW50IHBvb2wgaW4KKyAgIG1lbW9yeSBvdmVyIGludm9jYXRpb25zIG9mIGEgc2luZ2xlIGFwcGxpY2F0aW9uIGFuZCB0byBhbGxvdworICAgcHJpb3JpdGl6aW5nIGFjY2VzcyB0byB0aGUgYWN0dWFsIGVudHJvcHkgc291cmNlcy4gIFRoZSBkcmF3YmFjayBpcworICAgdGhhdCB3ZSBuZWVkIHRvIHVzZSBJUEMgKGkuZS4gdW5peCBkb21haW4gc29ja2V0KSB0byBjb252ZXkKKyAgIHNlbnNpdGl2ZSBkYXRhLgorICovCisKKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy91bi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJnMTBsaWIuaCIKKyNpbmNsdWRlICJyYW5kb20uaCIKKyNpbmNsdWRlICJhdGguaCIKKworDAorCisvKiBUaGlzIGlzIGRlZmF1bHQgc29ja2V0IG5hbWUgd2UgdXNlIGluIGNhc2UgdGhlIHByb3ZpZGVkIHNvY2tldCBuYW1lCisgICBpcyBOVUxMLiAgKi8KKyNkZWZpbmUgUkFORE9NX0RBRU1PTl9TT0NLRVQgIi92YXIvcnVuL2xpYmdjcnlwdC9TLmdjcnlwdHJuZCIKKworLyogVGhlIGxvY2sgc2VyaWFsaXppbmcgYWNjZXNzIHRvIHRoZSBkYWVtb24uICAqLworc3RhdGljIGF0aF9tdXRleF90IGRhZW1vbl9sb2NrID0gQVRIX01VVEVYX0lOSVRJQUxJWkVSOworCisvKiBUaGUgc29ja2V0IGNvbm5lY3RlZCB0byB0aGUgZGFlbW9uLiAgKi8KK3N0YXRpYyBpbnQgZGFlbW9uX3NvY2tldCA9IC0xOyAKKworLyogQ3JlYXRlcyBhIHNvY2tldCBjb25uZWN0ZWQgdG8gdGhlIGRhZW1vbi4gIE9uIHN1Y2Nlc3MsIHN0b3JlIHRoZQorICAgc29ja2V0IGZkIGluICpTT0NLLiAgUmV0dXJucyBlcnJvciBjb2RlLiAgKi8KK3N0YXRpYyBnY3J5X2Vycm9yX3QKK2Nvbm5lY3RfdG9fc29ja2V0IChjb25zdCBjaGFyICpzb2NrZXRuYW1lLCBpbnQgKnNvY2spCit7CisgIHN0cnVjdCBzb2NrYWRkcl91biAqc3J2cl9hZGRyOworICBzb2NrbGVuX3QgYWRkcmxlbjsKKyAgZ2NyeV9lcnJvcl90IGVycjsKKyAgaW50IGZkOworICBpbnQgcmM7CisKKyAgc3J2cl9hZGRyID0gTlVMTDsKKworICAvKiBDcmVhdGUgYSBzb2NrZXQuICovCisgIGZkID0gc29ja2V0IChBRl9VTklYLCBTT0NLX1NUUkVBTSwgMCk7CisgIGlmIChmZCA9PSAtMSkKKyAgICB7CisgICAgICBsb2dfZXJyb3IgKCJjYW4ndCBjcmVhdGUgc29ja2V0OiAlc1xuIiwgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBlcnIgPSBnY3J5X2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAvKiBTZXQgdXAgYWRkcmVzcy4gICovCisgIHNydnJfYWRkciA9IGdjcnlfbWFsbG9jIChzaXplb2YgKnNydnJfYWRkcik7IAorICBpZiAoISBzcnZyX2FkZHIpCisgICAgeworICAgICAgbG9nX2Vycm9yICgibWFsbG9jIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yIChlcnJubykpOworICAgICAgZXJyID0gZ2NyeV9lcnJvcl9mcm9tX2Vycm5vIChlcnJubyk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisgIG1lbXNldCAoc3J2cl9hZGRyLCAwLCBzaXplb2YgKnNydnJfYWRkcik7CisgIHNydnJfYWRkci0+c3VuX2ZhbWlseSA9IEFGX1VOSVg7CisgIGlmIChzdHJsZW4gKHNvY2tldG5hbWUpICsgMSA+PSBzaXplb2YgKHNydnJfYWRkci0+c3VuX3BhdGgpKQorICAgIHsKKyAgICAgIGxvZ19lcnJvciAoInNvY2tldCBuYW1lIGAlcycgdG9vIGxvbmdcbiIsIHNvY2tldG5hbWUpOworICAgICAgZXJyID0gZ2NyeV9lcnJvciAoR1BHX0VSUl9FTkFNRVRPT0xPTkcpOworICAgICAgZ290byBvdXQ7CisgICAgfQorICBzdHJjcHkgKHNydnJfYWRkci0+c3VuX3BhdGgsIHNvY2tldG5hbWUpOworICBhZGRybGVuID0gKG9mZnNldG9mIChzdHJ1Y3Qgc29ja2FkZHJfdW4sIHN1bl9wYXRoKQorICAgICAgICAgICAgICsgc3RybGVuIChzcnZyX2FkZHItPnN1bl9wYXRoKSArIDEpOworCisgIC8qIENvbm5lY3Qgc29ja2V0LiAgKi8KKyAgcmMgPSBjb25uZWN0IChmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSBzcnZyX2FkZHIsIGFkZHJsZW4pOworICBpZiAocmMgPT0gLTEpCisgICAgeworICAgICAgbG9nX2Vycm9yICgiZXJyb3IgY29ubmVjdGluZyBzb2NrZXQgYCVzJzogJXNcbiIsCisJCSBzcnZyX2FkZHItPnN1bl9wYXRoLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGVyciA9IGdjcnlfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGVyciA9IDA7CisKKyBvdXQ6CisKKyAgZ2NyeV9mcmVlIChzcnZyX2FkZHIpOworICBpZiAoZXJyKQorICAgIHsKKyAgICAgIGNsb3NlIChmZCk7CisgICAgICBmZCA9IC0xOworICAgIH0KKyAgKnNvY2sgPSBmZDsKKworICByZXR1cm4gZXJyOworfQorCisKKy8qIEluaXRpYWxpemUgYmFzaWNzIG9mIHRoaXMgbW9kdWxlLiBUaGlzIHNob3VsZCBiZSB2aWV3ZWQgYXMgYQorICAgY29uc3RydWN0b3IgdG8gcHJlcGFyZSBsb2NraW5nLiAqLwordm9pZAorX2djcnlfZGFlbW9uX2luaXRpYWxpemVfYmFzaWNzICh2b2lkKQoreworICBzdGF0aWMgaW50IGluaXRpYWxpemVkOworICBpbnQgZXJyOworCisgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgeworICAgICAgaW5pdGlhbGl6ZWQgPSAxOworICAgICAgZXJyID0gYXRoX211dGV4X2luaXQgKCZkYWVtb25fbG9jayk7CisgICAgICBpZiAoZXJyKQorICAgICAgICBsb2dfZmF0YWwgKCJmYWlsZWQgdG8gY3JlYXRlIHRoZSBkYWVtb24gbG9jazogJXNcbiIsIHN0cmVycm9yIChlcnIpICk7CisgICAgfQorfQorCisKKworLyogU2VuZCBMRU5HVEggYnl0ZXMgb2YgQlVGRkVSIHRvIGZpbGUgZGVzY3JpcHRvciBGRC4gIFJldHVybnMgMCBvbgorICAgc3VjY2VzcyBvciBhbm90aGVyIHZhbHVlIG9uIHdyaXRlIGVycm9yLiAqLworc3RhdGljIGludAord3JpdGVuIChpbnQgZmQsIGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkKK3sKKyAgc3NpemVfdCBuOworICAgICAgCisgIHdoaWxlIChsZW5ndGgpCisgICAgeworICAgICAgZG8KKyAgICAgICAgbiA9IGF0aF93cml0ZSAoZmQsIGJ1ZmZlciwgbGVuZ3RoKTsKKyAgICAgIHdoaWxlIChuIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CisgICAgICBpZiAobiA8IDApCisgICAgICAgICB7CisgICAgICAgICAgIGxvZ19lcnJvciAoIndyaXRlIGVycm9yOiAlc1xuIiwgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgIHJldHVybiAtMTsgLyogd3JpdGUgZXJyb3IgKi8KKyAgICAgICAgIH0KKyAgICAgIGxlbmd0aCAtPSBuOworICAgICAgYnVmZmVyID0gKGNvbnN0IGNoYXIqKWJ1ZmZlciArIG47CisgICAgfQorICByZXR1cm4gMDsgIC8qIE9rYXkgKi8KK30KKworc3RhdGljIGludAorcmVhZG4gKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3QgYnVmbGVuLCBzaXplX3QgKnJldF9ucmVhZCkKK3sKKyAgc2l6ZV90IG5sZWZ0ID0gYnVmbGVuOworICBpbnQgbnJlYWQ7CisgIGNoYXIgKnA7CisgIAorICBwID0gYnVmOworICB3aGlsZSAobmxlZnQgPiAwKQorICAgIHsKKyAgICAgIG5yZWFkID0gYXRoX3JlYWQgKGZkLCBidWYsIG5sZWZ0KTsKKyAgICAgIGlmIChucmVhZCA8IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAobnJlYWQgPT0gRUlOVFIpCisgICAgICAgICAgICBucmVhZCA9IDA7CisgICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoIW5yZWFkKQorICAgICAgICBicmVhazsgLyogRU9GICovCisgICAgICBubGVmdCAtPSBucmVhZDsKKyAgICAgIGJ1ZiA9IChjaGFyKilidWYgKyBucmVhZDsKKyAgICB9CisgIGlmIChyZXRfbnJlYWQpCisgICAgKnJldF9ucmVhZCA9IGJ1ZmxlbiAtIG5sZWZ0OworICByZXR1cm4gMDsKK30KKworLyogVGhpcyBmdW5jdGlvbnMgcmVxdWVzdHMgUkVRX05CWVRFUyBmcm9tIHRoZSBkYWVtb24uICBJZiBOT05DRSBpcworICAgdHJ1ZSwgdGhlIGRhdGEgc2hvdWxkIGJlIHN1aXRlZCBmb3IgYSBub25jZS4gIElmIE5PTkNFIGlzIEZBTFNFLAorICAgZGF0YSBvZiByYW5kb20gbGV2ZWwgTEVWRUwgd2lsbCBiZSBnZW5lcmF0ZWQuICBUaGUgcmV0cmlldmVkIHJhbmRvbQorICAgZGF0YSB3aWxsIGJlIHN0b3JlZCBpbiBCVUZGRVIuICBSZXR1cm5zIGVycm9yIGNvZGUuICAqLworc3RhdGljIGdjcnlfZXJyb3JfdAorY2FsbF9kYWVtb24gKGNvbnN0IGNoYXIgKnNvY2tldG5hbWUsCisgICAgICAgICAgICAgdm9pZCAqYnVmZmVyLCBzaXplX3QgcmVxX25ieXRlcywgaW50IG5vbmNlLAorCSAgICAgZW51bSBnY3J5X3JhbmRvbV9sZXZlbCBsZXZlbCkKK3sKKyAgc3RhdGljIGludCBpbml0aWFsaXplZDsKKyAgdW5zaWduZWQgY2hhciBidWZbMjU1XTsKKyAgZ2NyeV9lcnJvcl90IGVyciA9IDA7CisgIHNpemVfdCBuYnl0ZXM7CisgIHNpemVfdCBucmVhZDsKKyAgaW50IHJjOworCisgIGlmICghcmVxX25ieXRlcykKKyAgICByZXR1cm4gMDsKKworICBhdGhfbXV0ZXhfbG9jayAoJmRhZW1vbl9sb2NrKTsKKworICAvKiBPcGVuIHRoZSBzb2NrZXQgaWYgdGhhdCBoYXMgbm90IGJlZW4gZG9uZS4gKi8KKyAgaWYgKCFpbml0aWFsaXplZCkKKyAgICB7CisgICAgICBpbml0aWFsaXplZCA9IDE7CisgICAgICBlcnIgPSBjb25uZWN0X3RvX3NvY2tldCAoc29ja2V0bmFtZSA/IHNvY2tldG5hbWUgOiBSQU5ET01fREFFTU9OX1NPQ0tFVCwKKwkJCSAgICAgICAmZGFlbW9uX3NvY2tldCk7CisgICAgICBpZiAoZXJyKQorICAgICAgICB7CisgICAgICAgICAgZGFlbW9uX3NvY2tldCA9IC0xOworICAgICAgICAgIGxvZ19pbmZvICgibm90IHVzaW5nIHJhbmRvbSBkYWVtb25cbiIpOworICAgICAgICAgIGF0aF9tdXRleF91bmxvY2sgKCZkYWVtb25fbG9jayk7CisgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKworICAvKiBDaGVjayB0aGF0IHdlIGhhdmUgYSB2YWxpZCBzb2NrZXQgZGVzY3JpcHRvci4gKi8KKyAgaWYgKCBkYWVtb25fc29ja2V0ID09IC0xICkKKyAgICB7CisgICAgICBhdGhfbXV0ZXhfdW5sb2NrICgmZGFlbW9uX2xvY2spOworICAgICAgcmV0dXJuIGdjcnlfZXJyb3IgKEdQR19FUlJfSU5URVJOQUwpOworICAgIH0KKworCisgIC8qIERvIHRoZSByZWFsIHdvcmsuICAqLworCisgIGRvCisgICAgeworICAgICAgLyogUHJvY2VzcyBpbiBjaHVua3MuICAqLworICAgICAgbmJ5dGVzID0gcmVxX25ieXRlcyA+IHNpemVvZiAoYnVmKSA/IHNpemVvZiAoYnVmKSA6IHJlcV9uYnl0ZXM7CisgICAgICByZXFfbmJ5dGVzIC09IG5ieXRlczsKKworICAgICAgLyogQ29uc3RydWN0IHJlcXVlc3QuICAqLworICAgICAgYnVmWzBdID0gMzsKKyAgICAgIGlmIChub25jZSkKKwlidWZbMV0gPSAxMDsKKyAgICAgIGVsc2UgaWYgKGxldmVsID09IEdDUllfVkVSWV9TVFJPTkdfUkFORE9NKQorCWJ1ZlsxXSA9IDEyOworICAgICAgZWxzZSBpZiAobGV2ZWwgPT0gR0NSWV9TVFJPTkdfUkFORE9NKQorCWJ1ZlsxXSA9IDExOworICAgICAgYnVmWzJdID0gbmJ5dGVzOworCisgICAgICAvKiBTZW5kIHJlcXVlc3QuICAqLworICAgICAgcmMgPSB3cml0ZW4gKGRhZW1vbl9zb2NrZXQsIGJ1ZiwgMyk7CisgICAgICBpZiAocmMgPT0gLTEpCisJeworCSAgZXJyID0gZ2NyeV9lcnJvcl9mcm9tX2Vycm5vIChlcnJubyk7CisJICBicmVhazsKKwl9CisJCisgICAgICAvKiBSZXRyaWV2ZSByZXNwb25zZS4gICovCisKKyAgICAgIHJjID0gcmVhZG4gKGRhZW1vbl9zb2NrZXQsIGJ1ZiwgMiwgJm5yZWFkKTsKKyAgICAgIGlmIChyYyA9PSAtMSkKKwl7CisJICBlcnIgPSBnY3J5X2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKTsKKwkgIGxvZ19lcnJvciAoInJlYWQgZXJyb3I6ICVzXG4iLCBnY3J5X3N0cmVycm9yIChlcnIpKTsKKwkgIGJyZWFrOworCX0KKyAgICAgIGlmIChucmVhZCAmJiBidWZbMF0pCisJeworCSAgbG9nX2Vycm9yICgicmFuZG9tIGRhZW1vbiByZXR1cm5lZCBlcnJvciBjb2RlICVkXG4iLCBidWZbMF0pOworCSAgZXJyID0gZ2NyeV9lcnJvciAoR1BHX0VSUl9JTlRFUk5BTCk7IC8qID8gKi8KKwkgIGJyZWFrOworCX0KKyAgICAgIGlmIChucmVhZCAhPSAyKQorCXsKKwkgIGxvZ19lcnJvciAoInJlc3BvbnNlIHRvbyBzbWFsbFxuIik7CisJICBlcnIgPSBnY3J5X2Vycm9yIChHUEdfRVJSX1BST1RPQ09MX1ZJT0xBVElPTik7IC8qID8gKi8KKwkgIGJyZWFrOworCX0KKworICAgICAgLyogICAgICBpZiAoMSkqLwkJCS8qIERvIHRoaXMgaW4gdmVyYm9zZSBtb2RlPyAqLworICAgICAgLyoJbG9nX2luZm8gKCJyZWNlaXZlZCByZXNwb25zZSB3aXRoICVkIGJ5dGVzIG9mIGRhdGFcbiIsIGJ1ZlsxXSk7Ki8KKworICAgICAgaWYgKGJ1ZlsxXSA8IG5ieXRlcykKKwl7CisJICBsb2dfZXJyb3IgKCJlcnJvcjogc2VydmVyIHJldHVybmVkIGxlc3MgYnl0ZXMgdGhhbiByZXF1ZXN0ZWRcbiIpOworCSAgZXJyID0gZ2NyeV9lcnJvciAoR1BHX0VSUl9QUk9UT0NPTF9WSU9MQVRJT04pOyAvKiA/ICovCisJICBicmVhazsKKwl9CisgICAgICBlbHNlIGlmIChidWZbMV0gPiBuYnl0ZXMpCisJeworCSAgbG9nX2Vycm9yICgid2FybmluZzogc2VydmVyIHJldHVybmVkIG1vcmUgYnl0ZXMgdGhhbiByZXF1ZXN0ZWRcbiIpOworCSAgZXJyID0gZ2NyeV9lcnJvciAoR1BHX0VSUl9QUk9UT0NPTF9WSU9MQVRJT04pOyAvKiA/ICovCisJICBicmVhazsKKwl9CisKKyAgICAgIGFzc2VydCAobmJ5dGVzIDw9IHNpemVvZiAoYnVmKSk7CisKKyAgICAgIHJjID0gcmVhZG4gKGRhZW1vbl9zb2NrZXQsIGJ1ZiwgbmJ5dGVzLCAmbnJlYWQpOworICAgICAgaWYgKHJjID09IC0xKQorCXsKKwkgIGVyciA9IGdjcnlfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pOworCSAgbG9nX2Vycm9yICgicmVhZCBlcnJvcjogJXNcbiIsIGdjcnlfc3RyZXJyb3IgKGVycikpOworCSAgYnJlYWs7CisJfQorICAgICAgCisgICAgICBpZiAobnJlYWQgIT0gbmJ5dGVzKQorCXsKKwkgIGxvZ19lcnJvciAoInRvbyBsaXR0bGUgcmFuZG9tIGRhdGEgcmVhZFxuIik7CisJICBlcnIgPSBnY3J5X2Vycm9yIChHUEdfRVJSX0lOVEVSTkFMKTsKKwkgIGJyZWFrOworCX0KKworICAgICAgLyogU3VjY2Vzc2Z1bHkgcmVhZCBhbm90aGVyIGNodW5rIG9mIGRhdGEuICAqLworICAgICAgbWVtY3B5IChidWZmZXIsIGJ1ZiwgbmJ5dGVzKTsKKyAgICAgIGJ1ZmZlciA9ICgoY2hhciAqKSBidWZmZXIpICsgbmJ5dGVzOworICAgIH0KKyAgd2hpbGUgKHJlcV9uYnl0ZXMpOworCisgIGF0aF9tdXRleF91bmxvY2sgKCZkYWVtb25fbG9jayk7CisKKyAgcmV0dXJuIGVycjsKK30KKworLyogSW50ZXJuYWwgZnVuY3Rpb24gdG8gZmlsbCBCVUZGRVIgd2l0aCBMRU5HVEggYnl0ZXMgb2YgcmFuZG9tLiAgV2UKKyAgIHN1cHBvcnQgR0NSWV9TVFJPTkdfUkFORE9NIGFuZCBHQ1JZX1ZFUllfU1RST05HX1JBTkRPTSBoZXJlLgorICAgUmV0dXJuIDAgb24gc3VjY2Vzcy4gKi8KK2ludAorX2djcnlfZGFlbW9uX3JhbmRvbWl6ZSAoY29uc3QgY2hhciAqc29ja2V0bmFtZSwgCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsIHNpemVfdCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGdjcnlfcmFuZG9tX2xldmVsIGxldmVsKQoreworICBnY3J5X2Vycm9yX3QgZXJyOworCisgIGVyciA9IGNhbGxfZGFlbW9uIChzb2NrZXRuYW1lLCBidWZmZXIsIGxlbmd0aCwgMCwgbGV2ZWwpOworCisgIHJldHVybiBlcnIgPyAtMSA6IDA7Cit9CisKKworLyogSW50ZXJuYWwgZnVuY3Rpb24gdG8gZmlsbCBCVUZGRVIgd2l0aCBOQllURVMgb2YgZGF0YSB1c2FibGUgZm9yIGEKKyAgIG5vbmNlLiAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MuICovCitpbnQKK19nY3J5X2RhZW1vbl9jcmVhdGVfbm9uY2UgKGNvbnN0IGNoYXIgKnNvY2tldG5hbWUsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkKK3sKKyAgZ2NyeV9lcnJvcl90IGVycjsKKworICBlcnIgPSBjYWxsX2RhZW1vbiAoc29ja2V0bmFtZSwgYnVmZmVyLCBsZW5ndGgsIDEsIDApOworCisgIHJldHVybiBlcnIgPyAtMSA6IDA7Cit9CisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L3JhbmRvbS9yYW5kb20tZmlwcy5jIGIvbGliZ2NyeXB0LTEuNC42L3JhbmRvbS9yYW5kb20tZmlwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NjdlNzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvcmFuZG9tL3JhbmRvbS1maXBzLmMKQEAgLTAsMCArMSwxMTE4IEBACisvKiByYW5kb20tZmlwcy5jIC0gRklQUyBzdHlsZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICogQ29weXJpZ2h0IChDKSAyMDA4ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworLyoKKyAgIFRoZSBjb3JlIG9mIHRoaXMgZGV0ZXJtaW5pc3RpYyByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBpcworICAgaW1wbGVtZW50ZWQgYWNjb3JkaW5nIHRvIHRoZSBkb2N1bWVudCAiTklTVC1SZWNvbW1lbmRlZCBSYW5kb20KKyAgIE51bWJlciBHZW5lcmF0b3IgQmFzZWQgb24gQU5TSSBYOS4zMSBBcHBlbmRpeCBBLjIuNCBVc2luZyB0aGUgMy1LZXkKKyAgIFRyaXBsZSBERVMgYW5kIEFFUyBBbGdvcml0aG1zIiAoMjAwNS0wMS0zMSkuICBUaGlzIGltcGxlbWVudGF0aW9uCisgICB1c2VzIHRoZSBBRVMgdmFyaWFudC4KKworICAgVGhlcmUgYXJlIDMgcmFuZG9tIGNvbnRleHQgd2hpY2ggbWFwIHRvIHRoZSBkaWZmZXJlbnQgbGV2ZWxzIG9mCisgICByYW5kb20gcXVhbGl0eToKKworICAgR2VuZXJhdG9yICAgICAgICAgICAgICAgIFNlZWQgYW5kIEtleSAgICAgICAgS2VybmVsIGVudHJvcHkgKGluaXQvcmVzZWVkKQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBHQ1JZX1ZFUllfU1RST05HX1JBTkRPTSAgL2Rldi9yYW5kb20gICAgICAgICAyNTYvMTI4IGJpdHMKKyAgIEdDUllfU1RST05HX1JBTkRPTSAgICAgICAvZGV2L3JhbmRvbSAgICAgICAgIDI1Ni8xMjggYml0cworICAgZ2NyeV9jcmVhdGVfbm9uY2UgICAgICAgIEdDUllfU1RST05HX1JBTkRPTSAgbi9hCisKKyAgIEFsbCByYW5kb20gZ2VuZXJhdG9ycyByZXR1cm4gdGhlaXIgZGF0YSBpbiAxMjggYml0IGJsb2Nrcy4gIElmIHRoZQorICAgY2FsbGVyIHJlcXVlc3RlZCBsZXNzIGJpdHMsIHRoZSBleHRyYSBiaXRzIGFyZSBub3QgdXNlZC4gIFRoZSBrZXkKKyAgIGZvciBlYWNoIGdlbmVyYXRvciBpcyBvbmx5IHNldCBvbmNlIGF0IHRoZSBmaXJzdCB0aW1lIGEgZ2VuZXJhdG9yCisgICBpcyB1c2VkLiAgVGhlIHNlZWQgdmFsdWUgaXMgc2V0IHdpdGggdGhlIGtleSBhbmQgYWdhaW4gYWZ0ZXIgMTAwMAorICAgKFNFRURfVFRMKSBvdXRwdXQgYmxvY2tzOyB0aGUgcmUtc2VlZGluZyBpcyBkaXNhYmxlZCBpbiB0ZXN0IG1vZGUuCisKKyAgIFRoZSBHQ1JZX1ZFUllfU1RST05HX1JBTkRPTSBhbmQgR0NSWV9TVFJPTkdfUkFORE9NIGdlbmVyYXRvcnMgYXJlCisgICBrZXllZCBhbmQgc2VlZGVkIGZyb20gdGhlIC9kZXYvcmFuZG9tIGRldmljZS4gIFRodXMgdGhlc2UKKyAgIGdlbmVyYXRvcnMgbWF5IGJsb2NrIHVudGlsIHRoZSBrZXJuZWwgaGFzIGNvbGxlY3RlZCBlbm91Z2ggZW50cm9weS4KKworICAgVGhlIGdjcnlfY3JlYXRlX25vbmNlIGdlbmVyYXRvciBpcyBrZXllZCBhbmQgc2VlZGVkIGZyb20gdGhlCisgICBHQ1JZX1NUUk9OR19SQU5ET00gZ2VuZXJhdG9yLiAgSXQgbWF5IGFsc28gYmxvY2sgaWYgdGhlCisgICBHQ1JZX1NUUk9OR19SQU5ET00gZ2VuZXJhdG9yIGhhcyBub3QgeWV0IGJlZW4gdXNlZCBiZWZvcmUgYW5kIHRodXMKKyAgIGdldHMgaW5pdGlhbGl6ZWQgb24gdGhlIGZpcnN0IHVzZSBieSBnY3J5X2NyZWF0ZV9ub25jZS4gIFRoaXMKKyAgIHNwZWNpYWwgdHJlYXRtZW50IGlzIGp1c3RpZmllZCBieSB0aGUgd2Vha2VyIHJlcXVpcmVtZW50cyBmb3IgYQorICAgbm9uY2UgZ2VuZXJhdG9yIGFuZCB0byBzYXZlIHByZWNpb3VzIGtlcm5lbCBlbnRyb3B5IGZvciB1c2UgYnkgdGhlCisgICByZWFsIHJhbmRvbSBnZW5lcmF0b3JzLgorCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpZmRlZiBIQVZFX0dFVFRJTUVPRkRBWQorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImcxMGxpYi5oIgorI2luY2x1ZGUgInJhbmRvbS5oIgorI2luY2x1ZGUgInJhbmQtaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJhdGguaCIKKworLyogVGhpcyBpcyB0aGUgbG9jayB3ZSB1c2UgdG8gc2VyaWFsaXplIGFjY2VzcyB0byB0aGlzIFJORy4gIFRoZSBleHRyYQorICAgaW50ZWdlciB2YXJpYWJsZSBpcyBvbmx5IHVzZWQgdG8gY2hlY2sgdGhlIGxvY2tpbmcgc3RhdGU7IHRoYXQgaXMsCisgICBpdCBpcyBub3QgbWVhbnQgdG8gYmUgdGhyZWFkLXNhZmUgYnV0IG1lcmVseSBhcyBhIGZhaWxzYWZlIGZlYXR1cmUKKyAgIHRvIGFzc2VydCBwcm9wZXIgbG9ja2luZy4gICovCitzdGF0aWMgYXRoX211dGV4X3QgZmlwc19ybmdfbG9jayA9IEFUSF9NVVRFWF9JTklUSUFMSVpFUjsKK3N0YXRpYyBpbnQgZmlwc19ybmdfaXNfbG9ja2VkOworCisKKy8qIFRoZSByZXF1aXJlZCBzaXplIGZvciB0aGUgdGVtcG9yYXJ5IGJ1ZmZlciBvZiB0aGUgeDkzMV9hZXNfZHJpdmVyCisgICBmdW5jdGlvbiBhbmQgdGhlIGJ1ZmZlciBpdHNlbGYgd2hpY2ggd2lsbCBiZSBhbGxvY2F0ZWQgaW4gc2VjdXJlCisgICBtZW1vcnkuICBUaGlzIG5lZWRzIHRvIGJlIGdsb2JhbCB2YXJpYWJsZSBmb3IgcHJvcGVyIGluaXRpYWxpemF0aW9uCisgICBhbmQgdG8gYWxsb3cgc2h1dHRpbmcgZG93biB0aGUgUk5HIHdpdGhvdXQgbGVha2luZyBtZW1vcnkuICBNYXkKKyAgIG9ubHkgYmUgdXNlZCB3aGlsZSBob2xkaW5nIHRoZSBGSVBTX1JOR19MT0NLLgorCisgICBUaGlzIHZhcmlhYmxlIGlzIGFsc28gdXNlZCB0byBhdm9pZCBkdXBsaWNhdGUgaW5pdGlhbGl6YXRpb24uICAqLworI2RlZmluZSBURU1QVkFMVUVfRk9SX1g5MzFfQUVTX0RSSVZFUl9TSVpFIDQ4CitzdGF0aWMgdW5zaWduZWQgY2hhciAqdGVtcHZhbHVlX2Zvcl94OTMxX2Flc19kcml2ZXI7CisKKworLyogQWZ0ZXIgaGF2aW5nIHJldHJpZXZlZCB0aGlzIG51bWJlciBvZiBibG9ja3MgZnJvbSB0aGUgUk5HLCB3ZSB3YW50CisgICB0byBkbyBhIHJlc2VlZGluZy4gICovCisjZGVmaW5lIFNFRURfVFRMIDEwMDAKKworCisvKiBUaGUgbGVuZ3RoIG9mIHRoZSBrZXkgd2UgdXNlOiAgMTYgYnl0ZXMgKDEyOCBiaXQpIGZvciBBRVMxMjguICAqLworI2RlZmluZSBYOTMxX0FFU19LRVlMRU4gIDE2CisvKiBBIGdsb2JhbCBidWZmZXIgdXNlZCB0byBjb21tdW5pY2F0ZSBiZXR3ZWVuIHRoZSB4OTMxX2dlbmVyYXRlX2tleQorICAgYW5kIHg5MzFfZ2VuZXJhdGVfc2VlZCBmdW5jdGlvbnMgYW5kIHRoZSBlbnRyb3B5X2NvbGxlY3RfY2IKKyAgIGZ1bmN0aW9uLiAgSXQgbWF5IG9ubHkgYmUgdXNlZCBieSB0aGVzZSBmdW5jdGlvbnMuICovCitzdGF0aWMgdW5zaWduZWQgY2hhciAqZW50cm9weV9jb2xsZWN0X2J1ZmZlcjsgIC8qIEJ1ZmZlci4gICovCitzdGF0aWMgc2l6ZV90IGVudHJvcHlfY29sbGVjdF9idWZmZXJfbGVuOyAgICAgIC8qIFVzZWQgbGVuZ3RoLiAgKi8KK3N0YXRpYyBzaXplX3QgZW50cm9weV9jb2xsZWN0X2J1ZmZlcl9zaXplOyAgICAgLyogQWxsb2NhdGVkIGxlbmd0aC4gICovCisKKworLyogVGhpcyByYW5kb20gY29udGV4dCB0eXBlIGlzIHVzZWQgdG8gdHJhY2sgcHJvcGVydGllcyBvZiBvbmUgcmFuZG9tCisgICBnZW5lcmF0b3IuIFRoZWUgY29udGV4dCBhcmUgdXN1YWxseSBhbGxvY2F0ZWQgaW4gc2VjdXJlIG1lbW9yeSBzbworICAgdGhhdCB0aGUgc2VlZCB2YWx1ZSBpcyB3ZWxsIHByb3RlY3RlZC4gIFRoZXJlIGFyZSBhIGNvdWJsZSBvZiBndWFyZAorICAgZmllbGRzIHRvIGhlbHAgZGV0ZWN0aW5nIGFwcGxpY2F0aW9ucyBhY2NpZGVudGx5IG92ZXJ3cml0aW5nIHBhcnRzCisgICBvZiB0aGUgbWVtb3J5LiAqLworc3RydWN0IHJuZ19jb250ZXh0Cit7CisgIHVuc2lnbmVkIGNoYXIgZ3VhcmRfMFsxXTsKKworICAvKiBUaGUgaGFuZGxlIG9mIHRoZSBjaXBoZXIgdXNlZCBieSB0aGUgUk5HLiAgSWYgdGhpcyBvbmUgaXMgbm90CisgICAgIE5VTEwgYSBjaXBoZXIgaGFuZGxlIGFsb25nIHdpdGggYSByYW5kb20ga2V5IGhhcyBiZWVuCisgICAgIGVzdGFibGlzaGVkLiAgKi8KKyAgZ2NyeV9jaXBoZXJfaGRfdCBjaXBoZXJfaGQ7CisKKyAgLyogSWYgdGhpcyBmbGFnIGlzIHRydWUsIHRoZSBTRUVEX1YgYnVmZmVyIGJlbG93IGNhcnJpZXMgYSB2YWxpZAorICAgICBzZWVkLiAgKi8KKyAgaW50IGlzX3NlZWRlZDoxOworCisgIC8qIFRoZSB2ZXJ5IGZpcnN0IGJsb2NrIGdlbmVyYXRlZCBpcyB1c2VkIHRvIGNvbXBhcmUgdGhlIHJlc3VsdAorICAgICBhZ2FpbnN0IHRoZSBsYXN0IHJlc3VsdC4gIFRoaXMgZmxhZyBpbmRpY2F0ZXMgdGhhdCBzdWNoIGEgYmxvY2sKKyAgICAgaXMgYXZhaWxhYmxlLiAgKi8KKyAgaW50IGNvbXBhcmVfdmFsdWVfdmFsaWQ6MTsKKworICAvKiBBIGNvdW50ZXIgdXNlZCB0byB0cmlnZ2VyIHJlLXNlZWRpbmcuICAqLworICB1bnNpZ25lZCBpbnQgdXNlX2NvdW50ZXI7CisKKyAgdW5zaWduZWQgY2hhciBndWFyZF8xWzFdOworCisgIC8qIFRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgc2VlZCB2YWx1ZSBWLiAgKi8KKyAgdW5zaWduZWQgY2hhciBzZWVkX1ZbMTZdOworCisgIHVuc2lnbmVkIGNoYXIgZ3VhcmRfMlsxXTsKKworICAvKiBUaGUgbGFzdCByZXN1bHQgZnJvbSB0aGUgeDkzMV9hZXMgZnVjbnRpb24uICBPbmx5IHZhbGlkIGlmCisgICAgIGNvbXBhcmVfdmFsdWVfdmFsaWQgaXMgc2V0LiAgKi8KKyAgdW5zaWduZWQgY2hhciBjb21wYXJlX3ZhbHVlWzE2XTsKKworICB1bnNpZ25lZCBjaGFyIGd1YXJkXzNbMV07CisKKyAgLyogVGhlIGV4dGVybmFsIHRlc3QgbWF5IHdhbnQgdG8gc3VwcHJlc3MgdGhlIGR1cGxpY2F0ZSBib2NrIGNoZWNrLgorICAgICBUaGlzIGlzIGRvbmUgaWYgdGhlIHRoaXMgZmxhZyBpcyBzZXQuICAqLworICB1bnNpZ25lZCBjaGFyIHRlc3Rfbm9fZHVwX2NoZWNrOworICAvKiBUbyBpbXBsZW1lbnQgYSBLQVQgd2UgbmVlZCB0byBwcm92aWRlIGEga25vdyBEVCB2YWx1ZS4gIFRvCisgICAgIGFjY29tcGxpc2ggdGhpcyB0aGUgeDkzMV9nZXRfZHQgZnVuY3Rpb24gY2hlY2tzIHdoZXRoZXIgdGhpcworICAgICBmaWVsZCBpcyBub3QgTlVMTCBhbmQgdGhlbiB1c2VzIHRoZSAxNiBieXRlcyBhdCB0aGlzIGFkZHJlc3MgZm9yCisgICAgIHRoZSBEVCB2YWx1ZS4gIEhvd2V2ZXIgdGhlIGxhc3QgNCBieXRlcyBhcmUgcmVwbGFjZWQgYnkgdGhlCisgICAgIHZhbHVlIG9mIGZpZWxkIFRFU1RfRFRfQ09VTlRFUiB3aGljaCB3aWxsIGJlIGluY3JlbWVudGVkIGFmdGVyCisgICAgIGVhY2ggaW52b2NhdGlvbiBvZiB4OTMxX2dldF9kdC4gV2UgdXNlIGEgcG9pbnRlciBhbmQgbm90IGEgYnVmZmVyCisgICAgIGJlY2F1c2UgdGhlcmUgaXMgbm8gbmVlZCB0byBwdXQgdGhpcyB2YWx1ZSBpbnRvIHNlY3VyZSBtZW1vcnkuICAqLworICBjb25zdCB1bnNpZ25lZCBjaGFyICp0ZXN0X2R0X3B0cjsKKyAgdTMyIHRlc3RfZHRfY291bnRlcjsKKworICAvKiBXZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIHByb2Nlc3Mgd2hpY2ggZGlkIHRoZSBpbml0aWFsaXphdGlvbgorICAgICBzbyB0aGF0IHdlIGNhbiBkZXRlY3QgYSBmb3JrLiAgVGhlIHZvbGF0aWxlIG1vZGlmaWVyIGlzIHJlcXVpcmVkCisgICAgIHNvIHRoYXQgdGhlIGNvbXBpbGVyIGRvZXMgbm90IG9wdGltaXplIGl0IGF3YXkgaW4gY2FzZSB0aGUgZ2V0cGlkCisgICAgIGZ1bmN0aW9uIGlzIGJhZGx5IGF0dHJpYnV0ZWQuICAqLyAKKyAgcGlkX3Qga2V5X2luaXRfcGlkOworICBwaWRfdCBzZWVkX2luaXRfcGlkOworfTsKK3R5cGVkZWYgc3RydWN0IHJuZ19jb250ZXh0ICpybmdfY29udGV4dF90OworCisKKy8qIFRoZSByYW5kb20gY29udGV4dCB1c2VkIGZvciB0aGUgbm9uY2UgZ2VuZXJhdG9yLiAgTWF5IG9ubHkgYmUgdXNlZAorICAgd2hpbGUgaG9sZGluZyB0aGUgRklQU19STkdfTE9DSy4gICovCitzdGF0aWMgcm5nX2NvbnRleHRfdCBub25jZV9jb250ZXh0OworLyogVGhlIHJhbmRvbSBjb250ZXh0IHVzZWQgZm9yIHRoZSBzdGFuZGFyZCByYW5kb20gZ2VuZXJhdG9yLiAgTWF5CisgICBvbmx5IGJlIHVzZWQgd2hpbGUgaG9sZGluZyB0aGUgRklQU19STkdfTE9DSy4gICovCitzdGF0aWMgcm5nX2NvbnRleHRfdCBzdGRfcm5nX2NvbnRleHQ7CisvKiBUaGUgcmFuZG9tIGNvbnRleHQgdXNlZCBmb3IgdGhlIHZlcnkgc3Ryb25nIHJhbmRvbSBnZW5lcmF0b3IuICBNYXkKKyAgIG9ubHkgYmUgdXNlZCB3aGlsZSBob2xkaW5nIHRoZSBGSVBTX1JOR19MT0NLLiAgKi8KK3N0YXRpYyBybmdfY29udGV4dF90IHN0cm9uZ19ybmdfY29udGV4dDsKKworCisvKiAtLS0gTG9jYWwgcHJvdG90eXBlcyAtLS0gICovCitzdGF0aWMgdm9pZCB4OTMxX3Jlc2VlZCAocm5nX2NvbnRleHRfdCBybmdfY3R4KTsKK3N0YXRpYyB2b2lkIGdldF9yYW5kb20gKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCwgcm5nX2NvbnRleHRfdCBybmdfY3R4KTsKKworCisKKwwKKy8qIC0tLSBGdW5jdGlvbnMgIC0tLSAqLworCisvKiBCYXNpYyBpbml0aWFsaXphdGlvbiBpcyByZXF1aXJlZCB0byBpbml0aWFsaXplIG11dGV4ZXMgYW5kCisgICBkbyBhIGZldyBjaGVja3Mgb24gdGhlIGltcGxlbWVudGF0aW9uLiAgKi8KK3N0YXRpYyB2b2lkCitiYXNpY19pbml0aWFsaXphdGlvbiAodm9pZCkKK3sKKyAgc3RhdGljIGludCBpbml0aWFsaXplZDsKKyAgaW50IG15X2Vycm5vOworCisgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgcmV0dXJuOworICBpbml0aWFsaXplZCA9IDE7CisKKyAgbXlfZXJybm8gPSBhdGhfbXV0ZXhfaW5pdCAoJmZpcHNfcm5nX2xvY2spOworICBpZiAobXlfZXJybm8pCisgICAgbG9nX2ZhdGFsICgiZmFpbGVkIHRvIGNyZWF0ZSB0aGUgUk5HIGxvY2s6ICVzXG4iLCBzdHJlcnJvciAobXlfZXJybm8pKTsKKyAgZmlwc19ybmdfaXNfbG9ja2VkID0gMDsKKyAgICAgIAorICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBhcmUgc3RpbGwgdXNpbmcgdGhlIHZhbHVlcyB3ZSBoYXZlCisgICAgIHRyYWRpdGlvbmFsbHkgdXNlZCBmb3IgdGhlIHJhbmRvbSBsZXZlbHMuICAqLworICBnY3J5X2Fzc2VydCAoR0NSWV9XRUFLX1JBTkRPTSA9PSAwIAorICAgICAgICAgICAgICAgJiYgR0NSWV9TVFJPTkdfUkFORE9NID09IDEKKyAgICAgICAgICAgICAgICYmIEdDUllfVkVSWV9TVFJPTkdfUkFORE9NID09IDIpOworCit9CisKKworLyogQWNxdWlyZSB0aGUgZmlwc19ybmdfbG9jay4gICovCitzdGF0aWMgdm9pZAorbG9ja19ybmcgKHZvaWQpCit7CisgIGludCBteV9lcnJubzsKKworICBteV9lcnJubyA9IGF0aF9tdXRleF9sb2NrICgmZmlwc19ybmdfbG9jayk7CisgIGlmIChteV9lcnJubykKKyAgICBsb2dfZmF0YWwgKCJmYWlsZWQgdG8gYWNxdWlyZSB0aGUgUk5HIGxvY2s6ICVzXG4iLCBzdHJlcnJvciAobXlfZXJybm8pKTsKKyAgZmlwc19ybmdfaXNfbG9ja2VkID0gMTsKK30KKworCisvKiBSZWxlYXNlIHRoZSBmaXBzX3JuZ19sb2NrLiAgKi8KK3N0YXRpYyB2b2lkCit1bmxvY2tfcm5nICh2b2lkKQoreworICBpbnQgbXlfZXJybm87CisKKyAgZmlwc19ybmdfaXNfbG9ja2VkID0gMDsKKyAgbXlfZXJybm8gPSBhdGhfbXV0ZXhfdW5sb2NrICgmZmlwc19ybmdfbG9jayk7CisgIGlmIChteV9lcnJubykKKyAgICBsb2dfZmF0YWwgKCJmYWlsZWQgdG8gcmVsZWFzZSB0aGUgUk5HIGxvY2s6ICVzXG4iLCBzdHJlcnJvciAobXlfZXJybm8pKTsKK30KKworc3RhdGljIHZvaWQKK3NldHVwX2d1YXJkcyAocm5nX2NvbnRleHRfdCBybmdfY3R4KQoreworICAvKiBTZXQgdGhlIGd1YXJkcyB0byBzb21lIGFyYml0cmFyeSB2YWx1ZXMuICAqLworICBybmdfY3R4LT5ndWFyZF8wWzBdID0gMTc7CisgIHJuZ19jdHgtPmd1YXJkXzFbMF0gPSA0MjsKKyAgcm5nX2N0eC0+Z3VhcmRfMlswXSA9IDEzNzsKKyAgcm5nX2N0eC0+Z3VhcmRfM1swXSA9IDI1MjsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX2d1YXJkcyAocm5nX2NvbnRleHRfdCBybmdfY3R4KQoreworICBpZiAoIHJuZ19jdHgtPmd1YXJkXzBbMF0gIT0gMTcKKyAgICAgICB8fCBybmdfY3R4LT5ndWFyZF8xWzBdICE9IDQyCisgICAgICAgfHwgcm5nX2N0eC0+Z3VhcmRfMlswXSAhPSAxMzcKKyAgICAgICB8fCBybmdfY3R4LT5ndWFyZF8zWzBdICE9IDI1MiApCisgICAgbG9nX2ZhdGFsICgibWVtb3J5IGNvcnJ1cHRpb24gZGV0ZWN0ZWQgaW4gUk5HIGNvbnRleHQgJXBcbiIsIHJuZ19jdHgpOworfQorCisKKy8qIEdldCB0aGUgRFQgdmVjdG9yIGZvciB1c2Ugd2l0aCB0aGUgY29yZSBQUk5HIGZ1bmN0aW9uLiAgQnVmZmVyCisgICBuZWVkcyB0byBiZSBwcm92aWRlZCBieSB0aGUgY2FsbGVyIHdpdGggYSBzaXplIG9mIGF0IGxlYXN0IExFTkdUSAorICAgYnl0ZXMuIFJOR19DVFggbmVlZHMgdG8gYmUgcGFzc2VkIHRvIGFsbG93IGZvciBhIEtBVC4gIFRoZSAxNiBieXRlCisgICB0aW1lc3RhbXAgd2UgY29uc3RydWN0IGlzIG1hZGUgdXAgdGhlIHJlYWwgdGltZSBhbmQgdGhyZWUgY291bnRlcnM6CisKKyAgIEJ1ZmZlcjogICAgICAgMDAxMTIyMzM0NDU1NjY3Nzg4OTlBQUJCQ0NEREVFRkYKKyAgICAgICAgICAgICAgICAgIS0tKy0tLSEhLSstISErISEtLSstLS0hIS0tKy0tLSEgICAgIAorICAgc2Vjb25kcyAtLS0tLS0tLS0vICAgICAgfCAgIHwgICAgfCAgICAgICB8CisgICBtaWNyb3NlY29uZHMgLS0tLS0tLS0tLS0vICAgfCAgICB8ICAgICAgIHwKKyAgIGNvdW50ZXIyIC0tLS0tLS0tLS0tLS0tLS0tLS0vICAgIHwgICAgICAgfAorICAgY291bnRlcjEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLyAgICAgICB8CisgICBjb3VudGVyMCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8KKworICAgQ291bnRlciAyIGlzIGp1c3QgMTIgYml0cyB3aWRlIGFuZCB1c2VkIHRvIHRyYWNrIGZyYWN0aW9ucyBvZgorICAgbWlsbGlzZWNvbmRzIHdoZXJlYXMgY291bnRlcnMgMSBhbmQgMCBhcmUgY29tYmluZWQgdG8gYSBmcmVlCisgICBydW5uaW5nIDY0IGJpdCBjb3VudGVyLiAgKi8KK3N0YXRpYyB2b2lkIAoreDkzMV9nZXRfZHQgKHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCwgcm5nX2NvbnRleHRfdCBybmdfY3R4KQoreworICBnY3J5X2Fzc2VydCAobGVuZ3RoID09IDE2KTsgLyogVGhpcyBsZW5ndGggaXMgcmVxdWlyZWQgZm9yIHVzZSB3aXRoIEFFUy4gICovCisgIGdjcnlfYXNzZXJ0IChmaXBzX3JuZ19pc19sb2NrZWQpOworCisgIC8qIElmIHRoZSByYW5kb20gY29udGV4dCBpbmRpY2F0ZXMgdGhhdCBhIHRlc3QgRFQgc2hvdWxkIGJlIHVzZWQsCisgICAgIHRha2UgdGhlIERUIHZhbHVlIGZyb20gdGhlIGNvbnRleHQuICBGb3Igc2FmZXR5IHJlYXNvbnMgd2UgZG8KKyAgICAgdGhpcyBvbmx5IGlmIHRoZSBjb250ZXh0IGlzIG5vdCBvbmUgb2YgdGhlIHJlZ3VsYXIgY29udGV4dHMuICAqLworICBpZiAocm5nX2N0eC0+dGVzdF9kdF9wdHIgCisgICAgICAmJiBybmdfY3R4ICE9IG5vbmNlX2NvbnRleHQKKyAgICAgICYmIHJuZ19jdHggIT0gc3RkX3JuZ19jb250ZXh0CisgICAgICAmJiBybmdfY3R4ICE9IHN0cm9uZ19ybmdfY29udGV4dCkKKyAgICB7CisgICAgICBtZW1jcHkgKGJ1ZmZlciwgcm5nX2N0eC0+dGVzdF9kdF9wdHIsIDE2KTsKKyAgICAgIGJ1ZmZlclsxMl0gPSAocm5nX2N0eC0+dGVzdF9kdF9jb3VudGVyID4+IDI0KTsKKyAgICAgIGJ1ZmZlclsxM10gPSAocm5nX2N0eC0+dGVzdF9kdF9jb3VudGVyID4+IDE2KTsKKyAgICAgIGJ1ZmZlclsxNF0gPSAocm5nX2N0eC0+dGVzdF9kdF9jb3VudGVyID4+IDgpOworICAgICAgYnVmZmVyWzE1XSA9IHJuZ19jdHgtPnRlc3RfZHRfY291bnRlcjsKKyAgICAgIHJuZ19jdHgtPnRlc3RfZHRfY291bnRlcisrOworICAgICAgcmV0dXJuOworICAgIH0KKworCisjaWYgSEFWRV9HRVRUSU1FT0ZEQVkKKyAgeworICAgIHN0YXRpYyB1MzIgbGFzdF9zZWMsIGxhc3RfdXNlYzsKKyAgICBzdGF0aWMgdTMyIGNvdW50ZXIxLCBjb3VudGVyMDsKKyAgICBzdGF0aWMgdTE2IGNvdW50ZXIyOworICAgIAorICAgIHVuc2lnbmVkIGludCB1c2VjOworICAgIHN0cnVjdCB0aW1ldmFsIHR2OworCisgICAgaWYgKCFsYXN0X3NlYykKKyAgICAgIHsKKyAgICAgICAgLyogVGhpcyBpcyB0aGUgdmVyeSBmaXJzdCB0aW1lIHdlIGFyZSBjYWxsZWQ6IFNldCB0aGUgY291bnRlcnMKKyAgICAgICAgICAgdG8gYW4gbm90IHNvIGVhc3kgcHJlZGljdGFibGUgdmFsdWUgdG8gYXZvaWQgYWx3YXlzCisgICAgICAgICAgIHN0YXJ0aW5nIGF0IDAuICBOb3QgcmVhbGx5IG5lZWRlZCBidXQgaXQgZG9lc24ndCBoYXJtLiAgKi8KKyAgICAgICAgY291bnRlcjEgPSAodTMyKWdldHBpZCAoKTsKKyNpZm5kZWYgSEFWRV9XMzJfU1lTVEVNCisgICAgICAgIGNvdW50ZXIwID0gKHUzMilnZXRwcGlkICgpOworI2VuZGlmCisgICAgICB9CisKKworICAgIGlmIChnZXR0aW1lb2ZkYXkgKCZ0diwgTlVMTCkpCisgICAgICBsb2dfZmF0YWwgKCJnZXR0aW1lb2ZkYXkoKSBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvciAoZXJybm8pKTsKKworICAgIC8qIFRoZSBtaWNyb3NlY29uZHMgcGFydCBpcyBhbHdheXMgbGVzcyB0aGFuIDEgbWlsbG9uICgweDBmNDI0MCkuCisgICAgICAgVGh1cyB3ZSBkb24ndCBjYXJlIGFib3V0IHRoZSBNU0IgYW5kIGluIGFkZGl0aW9uIHNoaWZ0IGl0IHRvCisgICAgICAgdGhlIGxlZnQgYnkgNCBiaXRzLiAgKi8KKyAgICB1c2VjID0gdHYudHZfdXNlYzsKKyAgICB1c2VjIDw8PSA0OworICAgIC8qIElmIHdlIGdvdCB0aGUgc2FtZSB0aW1lIGFzIGJ5IHRoZSBsYXN0IGludm9jYXRpb24sIGJ1bXAgdXAKKyAgICAgICBjb3VudGVyMiBhbmQgc2F2ZSB0aGUgdGltZSBmb3IgdGhlIG5leHQgaW52b2NhdGlvbi4gICovCisgICAgaWYgKHR2LnR2X3NlYyA9PSBsYXN0X3NlYyAmJiB1c2VjID09IGxhc3RfdXNlYykKKyAgICAgIHsKKyAgICAgICAgY291bnRlcjIrKzsKKyAgICAgICAgY291bnRlcjIgJj0gMHgwZmZmOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgY291bnRlcjIgPSAwOworICAgICAgICBsYXN0X3NlYyA9IHR2LnR2X3NlYzsKKyAgICAgICAgbGFzdF91c2VjID0gdXNlYzsKKyAgICAgIH0KKyAgICAvKiBGaWxsIHRoZSBidWZmZXIgd2l0aCB0aGUgdGltZXN0YW1wLiAgKi8KKyAgICBidWZmZXJbMF0gPSAoKHR2LnR2X3NlYyA+PiAyNCkgJiAweGZmKTsKKyAgICBidWZmZXJbMV0gPSAoKHR2LnR2X3NlYyA+PiAxNikgJiAweGZmKTsKKyAgICBidWZmZXJbMl0gPSAoKHR2LnR2X3NlYyA+PiA4KSAmIDB4ZmYpOworICAgIGJ1ZmZlclszXSA9ICh0di50dl9zZWMgJiAweGZmKTsKKyAgICBidWZmZXJbNF0gPSAoKHVzZWMgPj4gMTYpICYgMHhmZik7CisgICAgYnVmZmVyWzVdID0gKCh1c2VjID4+IDgpICYgMHhmZik7CisgICAgYnVmZmVyWzZdID0gKCh1c2VjICYgMHhmMCkgfCAoKGNvdW50ZXIyID4+IDgpICYgMHgwZikpOworICAgIGJ1ZmZlcls3XSA9IChjb3VudGVyMiAmIDB4ZmYpOworICAgIC8qIEFkZCB0aGUgZnJlZSBydW5uaW5nIGNvdW50ZXIuICAqLworICAgIGJ1ZmZlcls4XSAgPSAoKGNvdW50ZXIxID4+IDI0KSAmIDB4ZmYpOworICAgIGJ1ZmZlcls5XSAgPSAoKGNvdW50ZXIxID4+IDE2KSAmIDB4ZmYpOworICAgIGJ1ZmZlclsxMF0gPSAoKGNvdW50ZXIxID4+IDgpICYgMHhmZik7IAorICAgIGJ1ZmZlclsxMV0gPSAoKGNvdW50ZXIxKSAmIDB4ZmYpOworICAgIGJ1ZmZlclsxMl0gPSAoKGNvdW50ZXIwID4+IDI0KSAmIDB4ZmYpOworICAgIGJ1ZmZlclsxM10gPSAoKGNvdW50ZXIwID4+IDE2KSAmIDB4ZmYpOworICAgIGJ1ZmZlclsxNF0gPSAoKGNvdW50ZXIwID4+IDgpICYgMHhmZik7IAorICAgIGJ1ZmZlclsxNV0gPSAoKGNvdW50ZXIwKSAmIDB4ZmYpOworICAgIC8qIEJ1bXAgdXAgdGhhdCBjb3VudGVyLiAgKi8KKyAgICBpZiAoISsrY291bnRlcjApCisgICAgICArK2NvdW50ZXIxOworICB9CisjZWxzZQorICBsb2dfZmF0YWwgKCJnZXR0aW1lb2ZkYXkoKSBub3QgYXZhaWxhYmxlIG9uIHRoaXMgc3lzdGVtXG4iKTsKKyNlbmRpZgorCisgIC8qIGxvZ19wcmludGhleCAoIng5MzFfZ2V0X2R0OiAiLCBidWZmZXIsIDE2KTsgKi8KK30KKworCisvKiBYT1IgdGhlIGJ1ZmZlcnMgQSBhbmQgQiB3aGljaCBhcmUgZWFjaCBvZiBMRU5HVEggYnl0ZXMgYW5kIHN0b3JlCisgICB0aGUgcmVzdWx0IGF0IFIuICBSIG5lZWRzIHRvIGJlIHByb3ZpZGVkIGJ5IHRoZSBjYWxsZXIgd2l0aCBhIHNpemUKKyAgIG9mIGF0IGxlYXN0IExFTkdUSCBieXRlcy4gICovCitzdGF0aWMgdm9pZAoreG9yX2J1ZmZlciAodW5zaWduZWQgY2hhciAqciwgCisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICphLCBjb25zdCB1bnNpZ25lZCBjaGFyICpiLCBzaXplX3QgbGVuZ3RoKQoreworICBmb3IgKCA7IGxlbmd0aDsgbGVuZ3RoLS0sIGErKywgYisrLCByKyspCisgICAgKnIgPSAoKmEgXiAqYik7Cit9CisKKworLyogRW5jcnlwdCBMRU5HVEggYnl0ZXMgb2YgSU5QVVQgdG8gT1VUUFVUIHVzaW5nIEtFWS4gIExFTkdUSAorICAgbmVlZHMgdG8gYmUgMTYuICovCitzdGF0aWMgdm9pZAorZW5jcnlwdF9hZXMgKGdjcnlfY2lwaGVyX2hkX3Qga2V5LCAKKyAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXRwdXQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmlucHV0LCBzaXplX3QgbGVuZ3RoKQoreworICBncGdfZXJyb3JfdCBlcnI7CisKKyAgZ2NyeV9hc3NlcnQgKGxlbmd0aCA9PSAxNik7CisKKyAgZXJyID0gZ2NyeV9jaXBoZXJfZW5jcnlwdCAoa2V5LCBvdXRwdXQsIGxlbmd0aCwgaW5wdXQsIGxlbmd0aCk7CisgIGlmIChlcnIpCisgICAgbG9nX2ZhdGFsICgiQUVTIGVuY3J5cHRpb24gaW4gUk5HIGZhaWxlZDogJXNcbiIsIGdjcnlfc3RyZXJyb3IgKGVycikpOworfQorCisKKy8qIFRoZSBjb3JlIEFOU0kgWDkuMzEsIEFwcGVuZGl4IEEuMi40IGZ1bmN0aW9uIHVzaW5nIEFFUy4gIFRoZSBjYWxsZXIKKyAgIG5lZWRzIHRvIHBhc3MgYSAxNiBieXRlIGJ1ZmZlciBmb3IgdGhlIHJlc3VsdCwgdGhlIDE2IGJ5dGUKKyAgIGRhdGV0aW1lX0RUIHZhbHVlIGFuZCB0aGUgMTYgYnl0ZSBzZWVkIHZhbHVlIFYuICBUaGUgY2FsbGVyIGFsc28KKyAgIG5lZWRzIHRvIHBhc3MgYW4gYXBwcm9wcmlhdGUgS0VZIGFuZCBtYWtlIHN1cmUgdG8gcGFzcyBhIHZhbGlkCisgICBzZWVkX1YuICBUaGUgY2FsbGVyIGFsc28gbmVlZHMgdG8gcHJvdmlkZSB0d28gMTYgYnl0ZXMgYnVmZmVyIGZvcgorICAgaW50ZXJtZWRpYXRlIHJlc3VsdHMsIHRoZXkgbWF5IGJlIHJldXNlZCBieSB0aGUgY2FsbGVyIGxhdGVyLgorCisgICBPbiByZXR1cm4gdGhlIHJlc3VsdCBpcyBzdG9yZWQgYXQgUkVTVUxUX1IgYW5kIHRoZSBTRUVEX1YgaXMKKyAgIHVwZGF0ZWQuICBNYXkgb25seSBiZSB1c2VkIHdoaWxlIGhvbGRpbmcgdGhlIGxvY2suICAqLworc3RhdGljIHZvaWQKK3g5MzFfYWVzICh1bnNpZ25lZCBjaGFyIHJlc3VsdF9SWzE2XSwgCisgICAgICAgICAgdW5zaWduZWQgY2hhciBkYXRldGltZV9EVFsxNl0sIHVuc2lnbmVkIGNoYXIgc2VlZF9WWzE2XSwKKyAgICAgICAgICBnY3J5X2NpcGhlcl9oZF90IGtleSwKKyAgICAgICAgICB1bnNpZ25lZCBjaGFyIGludGVybWVkaWF0ZV9JWzE2XSwgdW5zaWduZWQgY2hhciB0ZW1wX3hvclsxNl0pCit7CisgIC8qIExldCBlZGUqWChZKSByZXByZXNlbnQgdGhlIEFFUyBlbmNyeXB0aW9uIG9mIFkgdW5kZXIgdGhlIGtleSAqWC4KKworICAgICBMZXQgViBiZSBhIDEyOC1iaXQgc2VlZCB2YWx1ZSB3aGljaCBpcyBhbHNvIGtlcHQgc2VjcmV0LCBhbmQgWE9SCisgICAgIGJlIHRoZSBleGNsdXNpdmUtb3Igb3BlcmF0b3IuIExldCBEVCBiZSBhIGRhdGUvdGltZSB2ZWN0b3Igd2hpY2gKKyAgICAgaXMgdXBkYXRlZCBvbiBlYWNoIGl0ZXJhdGlvbi4gSSBpcyBhIGludGVybWVkaWF0ZSB2YWx1ZS4gCisKKyAgICAgSSA9IGVkZSpLKERUKSAgKi8KKyAgZW5jcnlwdF9hZXMgKGtleSwgaW50ZXJtZWRpYXRlX0ksIGRhdGV0aW1lX0RULCAxNik7CisKKyAgLyogUiA9IGVkZSpLKEkgWE9SIFYpICovCisgIHhvcl9idWZmZXIgKHRlbXBfeG9yLCBpbnRlcm1lZGlhdGVfSSwgc2VlZF9WLCAxNik7CisgIGVuY3J5cHRfYWVzIChrZXksIHJlc3VsdF9SLCB0ZW1wX3hvciwgMTYpOworCisgIC8qIFYgPSBlZGUqSyhSIFhPUiBJKS4gICovCisgIHhvcl9idWZmZXIgKHRlbXBfeG9yLCByZXN1bHRfUiwgaW50ZXJtZWRpYXRlX0ksIDE2KTsKKyAgZW5jcnlwdF9hZXMgKGtleSwgc2VlZF9WLCB0ZW1wX3hvciwgMTYpOworCisgIC8qIFplcm8gb3V0IHRlbXBvcmFyeSB2YWx1ZXMuICAqLworICB3aXBlbWVtb3J5IChpbnRlcm1lZGlhdGVfSSwgMTYpOworICB3aXBlbWVtb3J5ICh0ZW1wX3hvciwgMTYpOworfQorCisKKy8qIFRoZSBoaWdoIGxldmVsIGRyaXZlciB0byB4OTMxX2Flcy4gIFRoaXMgb25lIGRvZXMgdGhlIHJlcXVpcmVkCisgICB0ZXN0cyBhbmQgY2FsbHMgdGhlIGNvcmUgZnVuY3Rpb24gdW50aWwgdGhlIGVudGlyZSBidWZmZXIgaGFzIGJlZW4KKyAgIGZpbGxlZC4gIE9VVFBVVCBpcyBhIGNhbGxlciBwcm92aWRlZCBidWZmZXIgb2YgTEVOR1RIIGJ5dGVzIHRvCisgICByZWNlaXZlIHRoZSByYW5kb20sIFJOR19DVFggaXMgdGhlIGNvbnRleHQgb2YgdGhlIFJORy4gIFRoZSBjb250ZXh0CisgICBtdXN0IGJlIHByb3Blcmx5IGluaXRpYWxpemVkLiAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MuICovCitzdGF0aWMgaW50Cit4OTMxX2Flc19kcml2ZXIgKHVuc2lnbmVkIGNoYXIgKm91dHB1dCwgc2l6ZV90IGxlbmd0aCwgcm5nX2NvbnRleHRfdCBybmdfY3R4KQoreworICB1bnNpZ25lZCBjaGFyIGRhdGV0aW1lX0RUWzE2XTsKKyAgdW5zaWduZWQgY2hhciAqaW50ZXJtZWRpYXRlX0ksICp0ZW1wX2J1ZmZlciwgKnJlc3VsdF9idWZmZXI7CisgIHNpemVfdCBuYnl0ZXM7CisKKyAgZ2NyeV9hc3NlcnQgKGZpcHNfcm5nX2lzX2xvY2tlZCk7CisgIGdjcnlfYXNzZXJ0IChybmdfY3R4LT5jaXBoZXJfaGQpOworICBnY3J5X2Fzc2VydCAocm5nX2N0eC0+aXNfc2VlZGVkKTsKKworICBnY3J5X2Fzc2VydCAodGVtcHZhbHVlX2Zvcl94OTMxX2Flc19kcml2ZXIpOworICBnY3J5X2Fzc2VydCAoVEVNUFZBTFVFX0ZPUl9YOTMxX0FFU19EUklWRVJfU0laRSA9PSA0OCk7CisgIGludGVybWVkaWF0ZV9JID0gdGVtcHZhbHVlX2Zvcl94OTMxX2Flc19kcml2ZXI7CisgIHRlbXBfYnVmZmVyICAgID0gdGVtcHZhbHVlX2Zvcl94OTMxX2Flc19kcml2ZXIgKyAxNjsKKyAgcmVzdWx0X2J1ZmZlciAgPSB0ZW1wdmFsdWVfZm9yX3g5MzFfYWVzX2RyaXZlciArIDMyOworCisgIHdoaWxlIChsZW5ndGgpCisgICAgeworICAgICAgLyogVW5sZXNzIHdlIGFyZSBydW5uaW5nIHdpdGggYSB0ZXN0IGNvbnRleHQsIHdlIHJlcXVpcmUgYSBuZXcKKyAgICAgICAgIHNlZWQgYWZ0ZXIgc29tZSB0aW1lLiAgKi8KKyAgICAgIGlmICghcm5nX2N0eC0+dGVzdF9kdF9wdHIgJiYgcm5nX2N0eC0+dXNlX2NvdW50ZXIgPiBTRUVEX1RUTCkKKyAgICAgICAgeworICAgICAgICAgIHg5MzFfcmVzZWVkIChybmdfY3R4KTsKKyAgICAgICAgICBybmdfY3R4LT51c2VfY291bnRlciA9IDA7CisgICAgICAgIH0KKworICAgICAgLyogRHVlIHRvIHRoZSBkZXNpZ24gb2YgdGhlIFJORywgd2UgYWx3YXlzIHJlY2VpdmUgMTYgYnl0ZXMgKDEyOAorICAgICAgICAgYml0KSBvZiByYW5kb20gZXZlbiBpZiB3ZSByZXF1aXJlIGxlc3MuICBUaGUgZXh0cmEgYnl0ZXMKKyAgICAgICAgIHJldHVybmVkIGFyZSBub3QgdXNlZC4gIEludGhlb3J5IHdlIGNvdWxkIHNhdmUgdGhlbSBmb3IgdGhlCisgICAgICAgICBuZXh0IGludm9jYXRpb24sIGJ1dCB0aGF0IHdvdWxkIG1ha2UgdGhlIGNvbnRyb2wgZmxvdyBoYXJkZXIKKyAgICAgICAgIHRvIHJlYWQuICAqLworICAgICAgbmJ5dGVzID0gbGVuZ3RoIDwgMTY/IGxlbmd0aCA6IDE2OworCisgICAgICB4OTMxX2dldF9kdCAoZGF0ZXRpbWVfRFQsIDE2LCBybmdfY3R4KTsKKyAgICAgIHg5MzFfYWVzIChyZXN1bHRfYnVmZmVyLAorICAgICAgICAgICAgICAgIGRhdGV0aW1lX0RULCBybmdfY3R4LT5zZWVkX1YsIHJuZ19jdHgtPmNpcGhlcl9oZCwKKyAgICAgICAgICAgICAgICBpbnRlcm1lZGlhdGVfSSwgdGVtcF9idWZmZXIpOworICAgICAgcm5nX2N0eC0+dXNlX2NvdW50ZXIrKzsKKworICAgICAgaWYgKHJuZ19jdHgtPnRlc3Rfbm9fZHVwX2NoZWNrCisgICAgICAgICAgJiYgcm5nX2N0eC0+dGVzdF9kdF9wdHIKKyAgICAgICAgICAmJiBybmdfY3R4ICE9IG5vbmNlX2NvbnRleHQKKyAgICAgICAgICAmJiBybmdfY3R4ICE9IHN0ZF9ybmdfY29udGV4dAorICAgICAgICAgICYmIHJuZ19jdHggIT0gc3Ryb25nX3JuZ19jb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgLyogVGhpcyBpcyBhIHRlc3QgY29udGV4dCB3aGljaCBkb2VzIG5vdCB3YW50IHRoZSBkdXBsaWNhdGUKKyAgICAgICAgICAgICBibG9jayBjaGVjay4gKi8KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogRG8gYSBiYXNpYyBjaGVjayBvbiB0aGUgb3V0cHV0IHRvIGF2b2lkIGEgc3R1Y2sgZ2VuZXJhdG9yLiAgKi8KKyAgICAgICAgICBpZiAoIXJuZ19jdHgtPmNvbXBhcmVfdmFsdWVfdmFsaWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIEZpcnN0IHRpbWUgdXNlZCwgb25seSBzYXZlIHRoZSByZXN1bHQuICAqLworICAgICAgICAgICAgICBtZW1jcHkgKHJuZ19jdHgtPmNvbXBhcmVfdmFsdWUsIHJlc3VsdF9idWZmZXIsIDE2KTsKKyAgICAgICAgICAgICAgcm5nX2N0eC0+Y29tcGFyZV92YWx1ZV92YWxpZCA9IDE7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgIGlmICghbWVtY21wIChybmdfY3R4LT5jb21wYXJlX3ZhbHVlLCByZXN1bHRfYnVmZmVyLCAxNikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIE9vb3BzLCB3ZSByZWNlaXZlZCB0aGUgc2FtZSAxMjggYml0IGJsb2NrIC0gdGhhdCBzaG91bGQKKyAgICAgICAgICAgICAgICAgaW4gdGhlb3J5IG5ldmVyIGhhcHBlbi4gIFRoZSBGSVBTIHJlcXVpcmVtZW50IHNheXMgdGhhdAorICAgICAgICAgICAgICAgICB3ZSBuZWVkIHRvIHB1dCBvdXJzZWxmIGludG8gdGhlIGVycm9yIHN0YXRlIGluIHN1Y2gKKyAgICAgICAgICAgICAgICAgY2FzZS4gICovCisgICAgICAgICAgICAgIGZpcHNfc2lnbmFsX2Vycm9yICgiZHVwbGljYXRlIDEyOCBiaXQgYmxvY2sgcmV0dXJuZWQgYnkgUk5HIik7CisgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBtZW1jcHkgKHJuZ19jdHgtPmNvbXBhcmVfdmFsdWUsIHJlc3VsdF9idWZmZXIsIDE2KTsKKyAgICAgICAgfQorICAgICAgCisgICAgICAvKiBBcHBlbmQgdG8gb3V0YnV0LiAgKi8KKyAgICAgIG1lbWNweSAob3V0cHV0LCByZXN1bHRfYnVmZmVyLCBuYnl0ZXMpOworICAgICAgd2lwZW1lbW9yeSAocmVzdWx0X2J1ZmZlciwgMTYpOworICAgICAgb3V0cHV0ICs9IG5ieXRlczsKKyAgICAgIGxlbmd0aCAtPSBuYnl0ZXM7CisgICAgfQorCisgIHJldHVybiAwOworfQorCisKKy8qIENhbGxiYWNrIGZvciB4OTMxX2dlbmVyYXRlX2tleS4gTm90ZSB0aGF0IHRoaXMgY2FsbGJhY2sgdXNlcyB0aGUKKyAgIGdsb2JhbCBFTlRST1BZX0NPTExFQ1RfQlVGRkVSIHdoaWNoIGhhcyBiZWVuIHNldHVwIGJ5IGdldF9lbnRyb3B5LgorICAgT1JJR0lOIGlzIG5vdCB1c2VkIGJ1dCByZXF1aXJlZCBkdWUgdG8gdGhlIGRlc2lnbiBvZiBlbnRyb3B5CisgICBnYXRoZXJpbmcgbW9kdWxlLiAqLworc3RhdGljIHZvaWQKK2VudHJvcHlfY29sbGVjdF9jYiAoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICBlbnVtIHJhbmRvbV9vcmlnaW5zIG9yaWdpbikKK3sKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqcCA9IGJ1ZmZlcjsKKworICAodm9pZClvcmlnaW47CisKKyAgZ2NyeV9hc3NlcnQgKGZpcHNfcm5nX2lzX2xvY2tlZCk7CisgIGdjcnlfYXNzZXJ0IChlbnRyb3B5X2NvbGxlY3RfYnVmZmVyKTsKKworICAvKiBOb3RlIHRoYXQgd2UgbmVlZCB0byBwcm90ZWN0IGFnYWluc3QgZ2F0aGVyZXJzIHJldHVybmluZyBtb3JlCisgICAgIHRoYW4gdGhlIHJlcXVlc3RlZCBieXRlcyAoZS5nLiBybmR3MzIpLiAgKi8KKyAgd2hpbGUgKGxlbmd0aC0tICYmIGVudHJvcHlfY29sbGVjdF9idWZmZXJfbGVuIDwgZW50cm9weV9jb2xsZWN0X2J1ZmZlcl9zaXplKQorICAgIHsKKyAgICAgIGVudHJvcHlfY29sbGVjdF9idWZmZXJbZW50cm9weV9jb2xsZWN0X2J1ZmZlcl9sZW4rK10gXj0gKnArKzsKKyAgICB9Cit9CisKKworLyogR2V0IE5CWVRFUyBvZiBlbnRyb3B5IGZyb20gdGhlIGtlcm5lbCBkZXZpY2UuICBUaGUgY2FsbGVycyBuZWVkcyB0bworICAgZnJlZSB0aGUgcmV0dXJuZWQgYnVmZmVyLiAgVGhlIGZ1bmN0aW9uIGVpdGhlciBzdWNjZWVkcyBvcgorICAgdGVybWluYXRlcyB0aGUgcHJvY2VzcyBpbiBjYXNlIG9mIGEgZmF0YWwgZXJyb3IuICovCitzdGF0aWMgdm9pZCAqCitnZXRfZW50cm9weSAoc2l6ZV90IG5ieXRlcykKK3sKKyAgdm9pZCAqcmVzdWx0OworICBpbnQgcmM7CisKKyAgZ2NyeV9hc3NlcnQgKCFlbnRyb3B5X2NvbGxlY3RfYnVmZmVyKTsKKyAgZW50cm9weV9jb2xsZWN0X2J1ZmZlciA9IGdjcnlfeG1hbGxvY19zZWN1cmUgKG5ieXRlcyk7CisgIGVudHJvcHlfY29sbGVjdF9idWZmZXJfc2l6ZSA9IG5ieXRlczsKKyAgZW50cm9weV9jb2xsZWN0X2J1ZmZlcl9sZW4gPSAwOworCisjaWYgVVNFX1JORExJTlVYCisgIHJjID0gX2djcnlfcm5kbGludXhfZ2F0aGVyX3JhbmRvbSAoZW50cm9weV9jb2xsZWN0X2NiLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg5MzFfQUVTX0tFWUxFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ1JZX1ZFUllfU1RST05HX1JBTkRPTSk7CisjZWxpZiBVU0VfUk5EVzMyCisgIGRvIAorICAgIHsKKyAgICAgIHJjID0gX2djcnlfcm5kdzMyX2dhdGhlcl9yYW5kb20gKGVudHJvcHlfY29sbGVjdF9jYiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg5MzFfQUVTX0tFWUxFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDUllfVkVSWV9TVFJPTkdfUkFORE9NKTsKKyAgICB9CisgIHdoaWxlIChyYyA+PSAwICYmIGVudHJvcHlfY29sbGVjdF9idWZmZXJfbGVuIDwgZW50cm9weV9jb2xsZWN0X2J1ZmZlcl9zaXplKTsKKyNlbHNlCisgIHJjID0gLTE7CisjZW5kaWYKKworICBpZiAocmMgPCAwIHx8IGVudHJvcHlfY29sbGVjdF9idWZmZXJfbGVuICE9IGVudHJvcHlfY29sbGVjdF9idWZmZXJfc2l6ZSkKKyAgICB7CisgICAgICBnY3J5X2ZyZWUgKGVudHJvcHlfY29sbGVjdF9idWZmZXIpOworICAgICAgZW50cm9weV9jb2xsZWN0X2J1ZmZlciA9IE5VTEw7CisgICAgICBsb2dfZmF0YWwgKCJlcnJvciBnZXR0aW5nIGVudHJvcHkgZGF0YVxuIik7CisgICAgfQorICByZXN1bHQgPSBlbnRyb3B5X2NvbGxlY3RfYnVmZmVyOworICBlbnRyb3B5X2NvbGxlY3RfYnVmZmVyID0gTlVMTDsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKiBHZW5lcmF0ZSBhIGtleSBmb3IgdXNlIHdpdGggeDkzMV9hZXMuICBUaGUgZnVuY3Rpb24gcmV0dXJucyBhCisgICBoYW5kbGUgdG8gdGhlIGNpcGhlciBjb250ZXh0IHJlYWRpbHkgcHJlcGFyZWQgZm9yIEVDQiBlbmNyeXB0aW9uLgorICAgSWYgRk9SX05PTkNFIGlzIHRydWUsIHRoZSBrZXkgaXMgcmV0cmlldmVkIGJ5IHJlYWRvbmcgcmFuZG9tIGZyb20KKyAgIHRoZSBzdGFuZGFyZCBnZW5lcmF0b3IuICBPbiBlcnJvciBOVUxMIGlzIHJldHVybmVkLiAgKi8KK3N0YXRpYyBnY3J5X2NpcGhlcl9oZF90Cit4OTMxX2dlbmVyYXRlX2tleSAoaW50IGZvcl9ub25jZSkKK3sKKyAgZ2NyeV9jaXBoZXJfaGRfdCBoZDsKKyAgZ3BnX2Vycm9yX3QgZXJyOworICB2b2lkICpidWZmZXI7CisKKyAgZ2NyeV9hc3NlcnQgKGZpcHNfcm5nX2lzX2xvY2tlZCk7CisKKyAgLyogQWxsb2NhdGUgYSBjaXBoZXIgY29udGV4dC4gICovCisgIGVyciA9IGdjcnlfY2lwaGVyX29wZW4gKCZoZCwgR0NSWV9DSVBIRVJfQUVTMTI4LCBHQ1JZX0NJUEhFUl9NT0RFX0VDQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR0NSWV9DSVBIRVJfU0VDVVJFKTsKKyAgaWYgKGVycikKKyAgICB7CisgICAgICBsb2dfZXJyb3IgKCJlcnJvciBjcmVhdGluZyBjaXBoZXIgY29udGV4dCBmb3IgUk5HOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgZ2NyeV9zdHJlcnJvciAoZXJyKSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgLyogR2V0IGEga2V5IGZyb20gdGhlIHN0YW5kYXJkIFJORyBvciBmcm9tIHRoZSBlbnRyb3B5IHNvdXJjZS4gICovCisgIGlmIChmb3Jfbm9uY2UpCisgICAgeworICAgICAgYnVmZmVyID0gZ2NyeV94bWFsbG9jIChYOTMxX0FFU19LRVlMRU4pOworICAgICAgZ2V0X3JhbmRvbSAoYnVmZmVyLCBYOTMxX0FFU19LRVlMRU4sIHN0ZF9ybmdfY29udGV4dCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYnVmZmVyID0gZ2V0X2VudHJvcHkgKFg5MzFfQUVTX0tFWUxFTik7CisgICAgfQorCisgIC8qIFNldCB0aGUga2V5IGFuZCBkZWxldGUgdGhlIGJ1ZmZlciBiZWNhdXNlIHRoZSBrZXkgaXMgbm93IHBhcnQgb2YKKyAgICAgdGhlIGNpcGhlciBjb250ZXh0LiAgKi8KKyAgZXJyID0gZ2NyeV9jaXBoZXJfc2V0a2V5IChoZCwgYnVmZmVyLCBYOTMxX0FFU19LRVlMRU4pOworICB3aXBlbWVtb3J5IChidWZmZXIsIFg5MzFfQUVTX0tFWUxFTik7CisgIGdjcnlfZnJlZSAoYnVmZmVyKTsKKyAgaWYgKGVycikKKyAgICB7CisgICAgICBsb2dfZXJyb3IgKCJlcnJvciBjcmVhdGluZyBrZXkgZm9yIFJORzogJXNcbiIsIGdjcnlfc3RyZXJyb3IgKGVycikpOworICAgICAgZ2NyeV9jaXBoZXJfY2xvc2UgKGhkKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICByZXR1cm4gaGQ7Cit9CisKKworLyogR2VuZXJhdGUgYSBrZXkgZm9yIHVzZSB3aXRoIHg5MzFfYWVzLiAgVGhlIGZ1bmN0aW9uIGNvcGllcyBhIHNlZWQKKyAgIG9mIExFTkdUSCBieXRlcyBpbnRvIFNFRURfQlVGRkVSLiBMRU5HVEggbmVlZHMgdG8gYnkgZ2l2ZW4gYXMgMTYuICAqLworc3RhdGljIHZvaWQKK3g5MzFfZ2VuZXJhdGVfc2VlZCAodW5zaWduZWQgY2hhciAqc2VlZF9idWZmZXIsIHNpemVfdCBsZW5ndGgpCit7CisgIHZvaWQgKmJ1ZmZlcjsKKworICBnY3J5X2Fzc2VydCAoZmlwc19ybmdfaXNfbG9ja2VkKTsKKyAgZ2NyeV9hc3NlcnQgKGxlbmd0aCA9PSAxNik7CisKKyAgYnVmZmVyID0gZ2V0X2VudHJvcHkgKFg5MzFfQUVTX0tFWUxFTik7CisKKyAgbWVtY3B5IChzZWVkX2J1ZmZlciwgYnVmZmVyLCBYOTMxX0FFU19LRVlMRU4pOworICB3aXBlbWVtb3J5IChidWZmZXIsIFg5MzFfQUVTX0tFWUxFTik7CisgIGdjcnlfZnJlZSAoYnVmZmVyKTsKK30KKworCisKKy8qIFJlc2VlZCBhIGdlbmVyYXRvci4gIFRoaXMgaXMgYWxzbyB1c2VkIGZvciB0aGUgaW5pdGlhbCBzZWVkaW5nLiAqLworc3RhdGljIHZvaWQKK3g5MzFfcmVzZWVkIChybmdfY29udGV4dF90IHJuZ19jdHgpCit7CisgIGdjcnlfYXNzZXJ0IChmaXBzX3JuZ19pc19sb2NrZWQpOworCisgIGlmIChybmdfY3R4ID09IG5vbmNlX2NvbnRleHQpCisgICAgeworICAgICAgLyogVGhlIG5vbmNlIGNvbnRleHQgaXMgc3BlY2lhbC4gIEl0IHdpbGwgYmUgc2VlZGVkIHVzaW5nIHRoZQorICAgICAgICAgc3RhbmRhcmQgcmFuZG9tIGdlbmVyYXRvci4gICovCisgICAgICBnZXRfcmFuZG9tIChybmdfY3R4LT5zZWVkX1YsIDE2LCBzdGRfcm5nX2NvbnRleHQpOworICAgICAgcm5nX2N0eC0+aXNfc2VlZGVkID0gMTsKKyAgICAgIHJuZ19jdHgtPnNlZWRfaW5pdF9waWQgPSBnZXRwaWQgKCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogVGhlIG90aGVyIHR3byBnZW5lcmF0b3JzIGFyZSBzZWVkZWQgZnJvbSAvZGV2L3JhbmRvbS4gICovCisgICAgICB4OTMxX2dlbmVyYXRlX3NlZWQgKHJuZ19jdHgtPnNlZWRfViwgMTYpOworICAgICAgcm5nX2N0eC0+aXNfc2VlZGVkID0gMTsKKyAgICAgIHJuZ19jdHgtPnNlZWRfaW5pdF9waWQgPSBnZXRwaWQgKCk7CisgICAgfQorfQorCisKKy8qIENvcmUgcmFuZG9tIGZ1bmN0aW9uLiAgVGhpcyBpcyB1c2VkIGZvciBib3RoIG5vbmNlIGFuZCByYW5kb20KKyAgIGdlbmVyYXRvci4gIFRoZSBhY3R1YWwgUk5HIHRvIGJlIHVzZWQgZGVwZW5kcyBvbiB0aGUgcmFuZG9tIGNvbnRleHQKKyAgIFJOR19DVFggcGFzc2VkLiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggdGhlIFJORyBub3QKKyAgIHlldCBsb2NrZWQuICAqLworc3RhdGljIHZvaWQKK2dldF9yYW5kb20gKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCwgcm5nX2NvbnRleHRfdCBybmdfY3R4KQoreworICBnY3J5X2Fzc2VydCAoYnVmZmVyKTsKKyAgZ2NyeV9hc3NlcnQgKHJuZ19jdHgpOworCisgIGNoZWNrX2d1YXJkcyAocm5nX2N0eCk7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgY2lwaGVyIGhhbmRsZSBhbmQgdGh1cyBzZXR1cCB0aGUga2V5IGlmIG5lZWRlZC4gICovCisgIGlmICghcm5nX2N0eC0+Y2lwaGVyX2hkKQorICAgIHsKKyAgICAgIGlmIChybmdfY3R4ID09IG5vbmNlX2NvbnRleHQpCisgICAgICAgIHJuZ19jdHgtPmNpcGhlcl9oZCA9IHg5MzFfZ2VuZXJhdGVfa2V5ICgxKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcm5nX2N0eC0+Y2lwaGVyX2hkID0geDkzMV9nZW5lcmF0ZV9rZXkgKDApOworICAgICAgaWYgKCFybmdfY3R4LT5jaXBoZXJfaGQpCisgICAgICAgIGdvdG8gYmFpbG91dDsKKyAgICAgIHJuZ19jdHgtPmtleV9pbml0X3BpZCA9IGdldHBpZCAoKTsKKyAgICB9CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgc2VlZCB2YWx1ZSBpZiBuZWVkZWQuICAqLworICBpZiAoIXJuZ19jdHgtPmlzX3NlZWRlZCkKKyAgICB4OTMxX3Jlc2VlZCAocm5nX2N0eCk7CisKKyAgaWYgKHJuZ19jdHgtPmtleV9pbml0X3BpZCAhPSBnZXRwaWQgKCkKKyAgICAgIHx8IHJuZ19jdHgtPnNlZWRfaW5pdF9waWQgIT0gZ2V0cGlkICgpKQorICAgIHsKKyAgICAgIC8qIFdlIGFyZSBpbiBhIGNoaWxkIG9mIHVzLiAgQmVjYXVzZSB3ZSBoYXZlIG5vIHdheSB5ZXQgdG8gZG8KKyAgICAgICAgIHByb3BlciByZS1pbml0aWFsaXphdGlvbiAoaW5jbHVkaW5nIHNlbGYtY2hlY2tzIGV0YyksIHRoZQorICAgICAgICAgb25seSBjaGFuY2Ugd2UgaGF2ZSBpcyB0byBiYWlsIG91dC4gIE9idml1c2x5IGEgZm9yay9leGVjCisgICAgICAgICB3b24ndCBoYXJtIGJlY2F1c2UgdGhlIGV4ZWMgb3ZlcndyaXRlcyB0aGUgb2xkIGltYWdlLiAqLworICAgICAgZmlwc19zaWduYWxfZXJyb3IgKCJmb3JrIHdpdGhvdXQgcHJvcGVyIHJlLWluaXRpYWxpemF0aW9uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZGV0ZWN0ZWQgaW4gUk5HIik7CisgICAgICBnb3RvIGJhaWxvdXQ7CisgICAgfQorCisgIGlmICh4OTMxX2Flc19kcml2ZXIgKGJ1ZmZlciwgbGVuZ3RoLCBybmdfY3R4KSkKKyAgICBnb3RvIGJhaWxvdXQ7CisKKyAgY2hlY2tfZ3VhcmRzIChybmdfY3R4KTsKKyAgcmV0dXJuOworCisgYmFpbG91dDoKKyAgbG9nX2ZhdGFsICgic2V2ZXJlIGVycm9yIGdldHRpbmcgcmFuZG9tXG4iKTsKKyAgLypOT1RSRUFDSEVEKi8KK30KKworCisMCisvKiAtLS0gUHVibGljIEZ1bmN0aW9ucyAtLS0gKi8KKworLyogSW5pdGlhbGl6ZSB0aGlzIHJhbmRvbSBzdWJzeXN0ZW0uICBJZiBGVUxMIGlzIGZhbHNlLCB0aGlzIGZ1bmN0aW9uCisgICBtZXJlbHkgY2FsbHMgdGhlIGJhc2ljIGluaXRpYWxpemF0aW9uIG9mIHRoZSBtb2R1bGUgYW5kIGRvZXMgbm90IGRvCisgICBhbnl0aGluZyBtb3JlLiAgRG9pbmcgdGhpcyBpcyBub3QgcmVhbGx5IHJlcXVpcmVkIGJ1dCB3aGVuIHJ1bm5pbmcKKyAgIGluIGEgdGhyZWFkZWQgZW52aXJvbm1lbnQgd2UgbWlnaHQgZ2V0IGEgcmFjZSBjb25kaXRpb24KKyAgIG90aGVyd2lzZS4gKi8KK3ZvaWQKK19nY3J5X3JuZ2ZpcHNfaW5pdGlhbGl6ZSAoaW50IGZ1bGwpCit7CisgIGJhc2ljX2luaXRpYWxpemF0aW9uICgpOworICBpZiAoIWZ1bGwpCisgICAgcmV0dXJuOworCisgIC8qIEFsbG9jYXRlIHRlbXBvcmFyeSBidWZmZXJzLiAgSWYgdGhhdCBidWZmZXIgYWxyZWFkeSBleGlzdHMgd2UKKyAgICAga25vdyB0aGF0IHdlIGFyZSBhbHJlYWR5IGluaXRpYWxpemVkLiAgKi8KKyAgbG9ja19ybmcgKCk7CisgIGlmICghdGVtcHZhbHVlX2Zvcl94OTMxX2Flc19kcml2ZXIpCisgICAgeworICAgICAgdGVtcHZhbHVlX2Zvcl94OTMxX2Flc19kcml2ZXIKKyAgICAgICAgPSBnY3J5X3htYWxsb2Nfc2VjdXJlIChURU1QVkFMVUVfRk9SX1g5MzFfQUVTX0RSSVZFUl9TSVpFKTsKKworICAgICAgLyogQWxsb2NhdGUgdGhlIHJhbmRvbSBjb250ZXh0cy4gIE5vdGUgdGhhdCB3ZSBkbyBub3QgbmVlZCB0byB1c2UKKyAgICAgICAgIHNlY3VyZSBtZW1vcnkgZm9yIHRoZSBub25jZSBjb250ZXh0LiAgKi8KKyAgICAgIG5vbmNlX2NvbnRleHQgPSBnY3J5X3hjYWxsb2MgKDEsIHNpemVvZiAqbm9uY2VfY29udGV4dCk7CisgICAgICBzZXR1cF9ndWFyZHMgKG5vbmNlX2NvbnRleHQpOworCisgICAgICBzdGRfcm5nX2NvbnRleHQgPSBnY3J5X3hjYWxsb2Nfc2VjdXJlICgxLCBzaXplb2YgKnN0ZF9ybmdfY29udGV4dCk7CisgICAgICBzZXR1cF9ndWFyZHMgKHN0ZF9ybmdfY29udGV4dCk7CisgICAgICAKKyAgICAgIHN0cm9uZ19ybmdfY29udGV4dCA9IGdjcnlfeGNhbGxvY19zZWN1cmUgKDEsIHNpemVvZiAqc3Ryb25nX3JuZ19jb250ZXh0KTsKKyAgICAgIHNldHVwX2d1YXJkcyAoc3Ryb25nX3JuZ19jb250ZXh0KTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBBbHJlYWR5IGluaXRpYWxpemVkLiBEbyBzb21lIHNhbml0eSBjaGVja3MuICAqLworICAgICAgZ2NyeV9hc3NlcnQgKCFub25jZV9jb250ZXh0LT50ZXN0X2R0X3B0cik7CisgICAgICBnY3J5X2Fzc2VydCAoIXN0ZF9ybmdfY29udGV4dC0+dGVzdF9kdF9wdHIpOworICAgICAgZ2NyeV9hc3NlcnQgKCFzdHJvbmdfcm5nX2NvbnRleHQtPnRlc3RfZHRfcHRyKTsKKyAgICAgIGNoZWNrX2d1YXJkcyAobm9uY2VfY29udGV4dCk7CisgICAgICBjaGVja19ndWFyZHMgKHN0ZF9ybmdfY29udGV4dCk7CisgICAgICBjaGVja19ndWFyZHMgKHN0cm9uZ19ybmdfY29udGV4dCk7CisgICAgfQorICB1bmxvY2tfcm5nICgpOworfQorCisKKy8qIFByaW50IHNvbWUgc3RhdGlzdGljcyBhYm91dCB0aGUgUk5HLiAgKi8KK3ZvaWQKK19nY3J5X3JuZ2ZpcHNfZHVtcF9zdGF0cyAodm9pZCkKK3sKKyAgLyogTm90IHlldCBpbXBsZW1lbnRlZC4gICovCit9CisKKworLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgbm8gcmVhbCBSTkcgaXMgYXZhaWxhYmxlIG9yIHRoZQorICAgcXVhbGl0eSBvZiB0aGUgUk5HIGhhcyBiZWVuIGRlZ3JhZGVkIGZvciB0ZXN0IHB1cnBvc2VzLiAgKi8KK2ludAorX2djcnlfcm5nZmlwc19pc19mYWtlZCAodm9pZCkKK3sKKyAgcmV0dXJuIDA7ICAvKiBGYWtlZCByYW5kb20gaXMgbm90IGFsbG93ZWQuICAqLworfQorCisKKy8qIEFkZCBCVUZMRU4gYnl0ZXMgZnJvbSBCVUYgdG8gdGhlIGludGVybmFsIHJhbmRvbSBwb29sLiAgUVVBTElUWQorICAgc2hvdWxkIGJlIGluIHRoZSByYW5nZSBvZiAwLi4xMDAgdG8gaW5kaWNhdGUgdGhlIGdvb2RuZXNzIG9mIHRoZQorICAgZW50cm9weSBhZGRlZCwgb3IgLTEgZm9yIGdvb2RuZXNzIG5vdCBrbm93bi4gKi8KK2djcnlfZXJyb3JfdAorX2djcnlfcm5nZmlwc19hZGRfYnl0ZXMgKGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbiwgaW50IHF1YWxpdHkpCit7CisgICh2b2lkKWJ1ZjsKKyAgKHZvaWQpYnVmbGVuOworICAodm9pZClxdWFsaXR5OworICByZXR1cm4gMDsgIC8qIE5vdCBpbXBsZW1lbnRlZC4gKi8KK30gICAKKworICAgIAorLyogUHVibGljIGZ1bmN0aW9uIHRvIGZpbGwgdGhlIGJ1ZmZlciB3aXRoIExFTkdUSCBieXRlcyBvZgorICAgY3J5cHRvZ3JhcGhpY2FsbHkgc3Ryb25nIHJhbmRvbSBieXRlcy4gIExldmVsIEdDUllfV0VBS19SQU5ET00gaXMKKyAgIGhlcmUgbWFwcGVkIHRvIEdDUllfU1RST05HX1JBTkRPTSwgR0NSWV9TVFJPTkdfUkFORE9NIGlzIHN0cm9uZworICAgZW5vdWdoIGZvciBtb3N0IHVzYWdlLCBHQ1JZX1ZFUllfU1RST05HX1JBTkRPTSBpcyBnb29kIGZvciBrZXkKKyAgIGdlbmVyYXRpb24gc3R1ZmYgYnV0IG1heSBiZSB2ZXJ5IHNsb3cuICAqLwordm9pZAorX2djcnlfcm5nZmlwc19yYW5kb21pemUgKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGdjcnlfcmFuZG9tX2xldmVsIGxldmVsKQoreworICBfZ2NyeV9ybmdmaXBzX2luaXRpYWxpemUgKDEpOyAgLyogQXV0by1pbml0aWFsaXplIGlmIG5lZWRlZC4gICovCisgIAorICBsb2NrX3JuZyAoKTsKKyAgaWYgKGxldmVsID09IEdDUllfVkVSWV9TVFJPTkdfUkFORE9NKQorICAgIGdldF9yYW5kb20gKGJ1ZmZlciwgbGVuZ3RoLCBzdHJvbmdfcm5nX2NvbnRleHQpOworICBlbHNlCisgICAgZ2V0X3JhbmRvbSAoYnVmZmVyLCBsZW5ndGgsIHN0ZF9ybmdfY29udGV4dCk7CisgIHVubG9ja19ybmcgKCk7Cit9CisKKworLyogQ3JlYXRlIGFuIHVucHJlZGljYWJsZSBub25jZSBvZiBMRU5HVEggYnl0ZXMgaW4gQlVGRkVSLiAqLwordm9pZAorX2djcnlfcm5nZmlwc19jcmVhdGVfbm9uY2UgKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkKK3sKKyAgX2djcnlfcm5nZmlwc19pbml0aWFsaXplICgxKTsgIC8qIEF1dG8taW5pdGlhbGl6ZSBpZiBuZWVkZWQuICAqLworCisgIGxvY2tfcm5nICgpOworICBnZXRfcmFuZG9tIChidWZmZXIsIGxlbmd0aCwgbm9uY2VfY29udGV4dCk7CisgIHVubG9ja19ybmcgKCk7Cit9CisKKworLyogUnVuIGEgS25vdy1BbnN3ZXItVGVzdCB1c2luZyBhIGRlZGljYXRlZCB0ZXN0IGNvbnRleHQuICBOb3RlIHRoYXQKKyAgIHdlIGNhbid0IHVzZSB0aGUgc2FtcGxlcyBmcm9tIHRoZSBOSVNSIFJOR1ZTIGRvY3VtZW50IGJlY2F1c2UgdGhleQorICAgZG9uJ3QgdGFrZSB0aGUgcmVxdWlyZW1lbnQgdG8gdGhyb3cgYXdheSB0aGUgZmlyc3QgYmxvY2sgYW5kIHVzZQorICAgdGhhdCBmb3IgZHVwbGljYXRlIGNoZWNrIGluIGFjY291bnQuICBUaHVzIHdlIG1hZGUgdXAgb3VyIG93biB0ZXN0CisgICB2ZWN0b3JzLiAqLworc3RhdGljIGdjcnlfZXJyX2NvZGVfdAorc2VsZnRlc3Rfa2F0IChzZWxmdGVzdF9yZXBvcnRfZnVuY190IHJlcG9ydCkKK3sKKyAgc3RhdGljIHN0cnVjdCAKKyAgeworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIga2V5WzE2XTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGR0WzE2XTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyIHZbMTZdOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgclszXVsxNl07CisgIH0gdHZbXSA9CisgICAgeworICAgICAgeyB7IDB4YjksIDB4Y2EsIDB4N2YsIDB4ZDYsIDB4YTAsIDB4ZjUsIDB4ZDMsIDB4NDIsCisgICAgICAgICAgMHgxOSwgMHg2ZCwgMHg4NCwgMHg5MSwgMHg3NiwgMHgxYywgMHgzYiwgMHhiZSB9LAorICAgICAgICB7IDB4NDgsIDB4YjIsIDB4ODIsIDB4OTgsIDB4NjgsIDB4YzIsIDB4ODAsIDB4MDAsCisgICAgICAgICAgMHgwMCwgMHgwMCwgMHgyOCwgMHgxOCwgMHgwMCwgMHgwMCwgMHgyNSwgMHgwMCB9LAorICAgICAgICB7IDB4NTIsIDB4MTcsIDB4OGQsIDB4MjksIDB4YTIsIDB4ZDUsIDB4ODQsIDB4MTIsCisgICAgICAgICAgMHg5ZCwgMHg4OSwgMHg5YSwgMHg0NSwgMHg4MiwgMHgwMiwgMHhmNywgMHg3NyB9LAorICAgICAgICB7IHsgMHg0MiwgMHg5YywgMHgwOCwgMHgzZCwgMHg4MiwgMHhmNCwgMHg4YSwgMHg0MCwKKyAgICAgICAgICAgIDB4NjYsIDB4YjUsIDB4NDksIDB4MjcsIDB4YWIsIDB4NDIsIDB4YzcsIDB4YzMgfSwKKyAgICAgICAgICB7IDB4MGUsIDB4YjcsIDB4NjEsIDB4M2MsIDB4ZmUsIDB4YjAsIDB4YmUsIDB4NzMsCisgICAgICAgICAgICAweGY3LCAweDZlLCAweDZkLCAweDZmLCAweDFkLCAweGEzLCAweDE0LCAweGZhIH0sCisgICAgICAgICAgeyAweGJiLCAweDRiLCAweGMxLCAweDBlLCAweGM1LCAweGZiLCAweGNkLCAweDQ2LAorICAgICAgICAgICAgMHhiZSwgMHgyOCwgMHg2MSwgMHhlNywgMHgwMywgMHgyYiwgMHgzNywgMHg3ZCB9IH0gfSwKKyAgICAgIHsgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSwKKyAgICAgICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSwKKyAgICAgICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSwKKyAgICAgICAgeyB7IDB4ZjcsIDB4OTUsIDB4YmQsIDB4NGEsIDB4NTIsIDB4ZTIsIDB4OWUsIDB4ZDcsCisgICAgICAgICAgICAweDEzLCAweGQzLCAweDEzLCAweGZhLCAweDIwLCAweGU5LCAweDhkLCAweGJjIH0sCisgICAgICAgICAgeyAweGM4LCAweGQxLCAweGU1LCAweDExLCAweDU5LCAweDUyLCAweGY3LCAweGZhLAorICAgICAgICAgICAgMHgzNywgMHgzOCwgMHhiNCwgMHhjNSwgMHhjZSwgMHhiMiwgMHhiMCwgMHg5YSB9LAorICAgICAgICAgIHsgMHgwZCwgMHg5YywgMHhjNSwgMHgwZCwgMHgxNiwgMHhlMSwgMHhiYywgMHhlZCwgCisgICAgICAgICAgICAweGNmLCAweDYwLCAweDYyLCAweDA5LCAweDlkLCAweDIwLCAweDgzLCAweDdlIH0gfSB9LAorICAgICAgeyB7IDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCisgICAgICAgICAgMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiB9LAorICAgICAgICB7IDB4ODAsIDB4MDAsIDB4ODEsIDB4MDEsIDB4ODIsIDB4MDIsIDB4ODMsIDB4MDMsCisgICAgICAgICAgMHhhMCwgMHgyMCwgMHhhMSwgMHgyMSwgMHhhMiwgMHgyMiwgMHhhMywgMHgyMyB9LAorICAgICAgICB7IDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgICAgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiB9LAorICAgICAgICB7IHsgMHg5NiwgMHhlZCwgMHhjYywgMHhjMywgMHhkZCwgMHgwNCwgMHg3ZiwgMHg3NSwKKyAgICAgICAgICAgIDB4NjMsIDB4MTksIDB4MzcsIDB4NmYsIDB4MTUsIDB4MjIsIDB4NTcsIDB4NTYgfSwKKyAgICAgICAgICB7IDB4N2EsIDB4MTQsIDB4NzYsIDB4NzcsIDB4OTUsIDB4MTcsIDB4N2UsIDB4YzgsCisgICAgICAgICAgICAweDkyLCAweGU4LCAweGRkLCAweDE1LCAweGNiLCAweDFmLCAweGJjLCAweGIxIH0sCisgICAgICAgICAgeyAweDI1LCAweDNlLCAweDJlLCAweGEyLCAweDQxLCAweDFiLCAweGRkLCAweGY1LCAKKyAgICAgICAgICAgIDB4MjEsIDB4NDgsIDB4NDEsIDB4NzEsIDB4YjMsIDB4OGQsIDB4MmYsIDB4NGMgfSB9IH0KKyAgICB9OworICBpbnQgdHZpZHgsIHJpZHg7CisgIHJuZ19jb250ZXh0X3QgdGVzdF9jdHg7CisgIGdwZ19lcnJvcl90IGVycjsKKyAgY29uc3QgY2hhciAqZXJydHh0ID0gTlVMTDsKKyAgdW5zaWduZWQgY2hhciByZXN1bHRbMTZdOworCisgIGdjcnlfYXNzZXJ0ICh0ZW1wdmFsdWVfZm9yX3g5MzFfYWVzX2RyaXZlcik7CisKKyAgdGVzdF9jdHggPSBnY3J5X3hjYWxsb2MgKDEsIHNpemVvZiAqdGVzdF9jdHgpOworICBzZXR1cF9ndWFyZHMgKHRlc3RfY3R4KTsKKyAgCisgIGxvY2tfcm5nICgpOworCisgIGZvciAodHZpZHg9MDsgdHZpZHggPCBESU0gKHR2KTsgdHZpZHgrKykKKyAgICB7CisgICAgICAvKiBTZXR1cCB0aGUga2V5LiAgKi8KKyAgICAgIGVyciA9IGdjcnlfY2lwaGVyX29wZW4gKCZ0ZXN0X2N0eC0+Y2lwaGVyX2hkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NSWV9DSVBIRVJfQUVTMTI4LCBHQ1JZX0NJUEhFUl9NT0RFX0VDQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDUllfQ0lQSEVSX1NFQ1VSRSk7CisgICAgICBpZiAoZXJyKQorICAgICAgICB7CisgICAgICAgICAgZXJydHh0ID0gImVycm9yIGNyZWF0aW5nIGNpcGhlciBjb250ZXh0IGZvciBSTkciOworICAgICAgICAgIGdvdG8gbGVhdmU7CisgICAgICAgIH0KKworICAgICAgZXJyID0gZ2NyeV9jaXBoZXJfc2V0a2V5ICh0ZXN0X2N0eC0+Y2lwaGVyX2hkLCB0dlt0dmlkeF0ua2V5LCAxNik7CisgICAgICBpZiAoZXJyKQorICAgICAgICB7CisgICAgICAgICAgZXJydHh0ID0gImVycm9yIHNldHRpbmcga2V5IGZvciBSTkciOworICAgICAgICAgIGdvdG8gbGVhdmU7CisgICAgICAgIH0KKyAgICAgIHRlc3RfY3R4LT5rZXlfaW5pdF9waWQgPSBnZXRwaWQgKCk7CisgICAgICAKKyAgICAgIC8qIFNldHVwIHRoZSBzZWVkLiAgKi8KKyAgICAgIG1lbWNweSAodGVzdF9jdHgtPnNlZWRfViwgdHZbdHZpZHhdLnYsIDE2KTsKKyAgICAgIHRlc3RfY3R4LT5pc19zZWVkZWQgPSAxOworICAgICAgdGVzdF9jdHgtPnNlZWRfaW5pdF9waWQgPSBnZXRwaWQgKCk7CisgICAgICAKKyAgICAgIC8qIFNldHVwIGEgRFQgdmFsdWUuICAqLworICAgICAgdGVzdF9jdHgtPnRlc3RfZHRfcHRyID0gdHZbdHZpZHhdLmR0OworICAgICAgdGVzdF9jdHgtPnRlc3RfZHRfY291bnRlciA9ICggKHR2W3R2aWR4XS5kdFsxMl0gPDwgMjQpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8KHR2W3R2aWR4XS5kdFsxM10gPDwgMTYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwodHZbdHZpZHhdLmR0WzE0XSA8PCA4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8KHR2W3R2aWR4XS5kdFsxNV0pICk7CisKKyAgICAgIC8qIEdldCBhbmQgY29tcGFyZSB0aGUgZmlyc3QgdGhyZWUgcmVzdWx0cy4gICovCisgICAgICBmb3IgKHJpZHg9MDsgcmlkeCA8IDM7IHJpZHgrKykKKyAgICAgICAgeworICAgICAgICAgIC8qIENvbXB1dGUgdGhlIG5leHQgdmFsdWUuICAqLworICAgICAgICAgIGlmICh4OTMxX2Flc19kcml2ZXIgKHJlc3VsdCwgMTYsIHRlc3RfY3R4KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZXJydHh0ID0gIlg5LjMxIFJORyBjb3JlIGZ1bmN0aW9uIGZhaWxlZCI7CisgICAgICAgICAgICAgIGdvdG8gbGVhdmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgLyogQ29tcGFyZSBpdCB0byB0aGUga25vd24gdmFsdWUuICAqLworICAgICAgICAgIGlmIChtZW1jbXAgKHJlc3VsdCwgdHZbdHZpZHhdLnJbcmlkeF0sIDE2KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogbG9nX3ByaW50aGV4ICgieDkzMV9hZXMgZ290OiAiLCByZXN1bHQsIDE2KTsgKi8KKyAgICAgICAgICAgICAgLyogbG9nX3ByaW50aGV4ICgieDkzMV9hZXMgZXhwOiAiLCB0dlt0dmlkeF0ucltyaWR4XSwgMTYpOyAqLworICAgICAgICAgICAgICBlcnJ0eHQgPSAiUk5HIG91dHB1dCBkb2VzIG5vdCBtYXRjaCBrbm93biB2YWx1ZSI7CisgICAgICAgICAgICAgIGdvdG8gbGVhdmU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgLyogVGhpcyB0ZXN0IGlzIGFjdHVhbCBwcmV0dHkgcG9pbnRsZXNzIGJlY2F1c2Ugd2UgdXNlIGEgbG9jYWwgdGVzdAorICAgICAgICAgY29udGV4dC4gICovCisgICAgICBpZiAodGVzdF9jdHgtPmtleV9pbml0X3BpZCAhPSBnZXRwaWQgKCkKKyAgICAgICAgICB8fCB0ZXN0X2N0eC0+c2VlZF9pbml0X3BpZCAhPSBnZXRwaWQgKCkpCisgICAgICAgIHsKKyAgICAgICAgICBlcnJ0eHQgPSAiZm9yayBkZXRlY3Rpb24gZmFpbGVkIjsKKyAgICAgICAgICBnb3RvIGxlYXZlOworICAgICAgICB9CisKKyAgICAgIGdjcnlfY2lwaGVyX2Nsb3NlICh0ZXN0X2N0eC0+Y2lwaGVyX2hkKTsKKyAgICAgIHRlc3RfY3R4LT5jaXBoZXJfaGQgPSBOVUxMOworICAgICAgdGVzdF9jdHgtPmlzX3NlZWRlZCA9IDA7CisgICAgICBjaGVja19ndWFyZHMgKHRlc3RfY3R4KTsKKyAgICB9CisKKyBsZWF2ZToKKyAgdW5sb2NrX3JuZyAoKTsKKyAgZ2NyeV9jaXBoZXJfY2xvc2UgKHRlc3RfY3R4LT5jaXBoZXJfaGQpOworICBjaGVja19ndWFyZHMgKHRlc3RfY3R4KTsKKyAgZ2NyeV9mcmVlICh0ZXN0X2N0eCk7CisgIGlmIChyZXBvcnQgJiYgZXJydHh0KQorICAgIHJlcG9ydCAoInJhbmRvbSIsIDAsICJLQVQiLCBlcnJ0eHQpOworICByZXR1cm4gZXJydHh0PyBHUEdfRVJSX1NFTEZURVNUX0ZBSUxFRCA6IDA7Cit9CisKKworLyogUnVuIHRoZSBzZWxmLXRlc3RzLiAgKi8KK2djcnlfZXJyb3JfdAorX2djcnlfcm5nZmlwc19zZWxmdGVzdCAoc2VsZnRlc3RfcmVwb3J0X2Z1bmNfdCByZXBvcnQpCit7CisgIGdjcnlfZXJyX2NvZGVfdCBlYzsKKworI2lmIGRlZmluZWQoVVNFX1JORExJTlVYKSB8fCBkZWZpbmVkKFVTRV9STkRXMzIpCisgIHsKKyAgICBjaGFyIGJ1ZmZlcls4XTsKKworICAgIC8qIERvIGEgc2ltcGxlIHRlc3QgdXNpbmcgdGhlIHB1YmxpYyBpbnRlcmZhY2UuICBUaGlzIHdpbGwgYWxzbworICAgICAgIGVuZm9yY2UgZnVsbCBpbnRpYWxpemF0aW9uIG9mIHRoZSBSTkcuICBXZSBuZWVkIHRvIGJlIGZ1bGx5CisgICAgICAgaW5pdGlhbGl6ZWQgZHVlIHRvIHRoZSBnbG9iYWwgcmVxdWlyZW1lbnQgb2YgdGhlCisgICAgICAgdGVtcHZhbHVlX2Zvcl94OTMxX2Flc19kcml2ZXIgc3R1ZmYuICovCisgICAgZ2NyeV9yYW5kb21pemUgKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgR0NSWV9TVFJPTkdfUkFORE9NKTsKKyAgfQorCisgIGVjID0gc2VsZnRlc3Rfa2F0IChyZXBvcnQpOworCisjZWxzZSAvKiEoVVNFX1JORExJTlVYfHxVU0VfUk5EVzMyKSovCisgIHJlcG9ydCAoInJhbmRvbSIsIDAsICJzZXR1cCIsICJubyBlbnRyb3B5IGdhdGhlcmluZyBtb2R1bGUiKTsKKyAgZWMgPSBHUEdfRVJSX1NFTEZURVNUX0ZBSUxFRDsKKyNlbmRpZgorICByZXR1cm4gZ3BnX2Vycm9yIChlYyk7Cit9CisKKworLyogQ3JlYXRlIGEgbmV3IHRlc3QgY29udGV4dCBmb3IgYW4gZXh0ZXJuYWwgUk5HIHRlc3QgZHJpdmVyLiAgT24KKyAgIHN1Y2Nlc3MgdGhlIHRlc3QgY29udGV4dCBpcyBzdG9yZWQgYXQgUl9DT05URVhUOyBvbiBmYWlsdXJlIE5VTEwgaXMKKyAgIHN0b3JlZCBhdCBSX0NPTlRFWFQgYW5kIGFuIGVycm9yIGNvZGUgaXMgcmV0dXJuZWQuICAqLworZ2NyeV9lcnJfY29kZV90CitfZ2NyeV9ybmdmaXBzX2luaXRfZXh0ZXJuYWxfdGVzdCAodm9pZCAqKnJfY29udGV4dCwgdW5zaWduZWQgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmtleSwgc2l6ZV90IGtleWxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpzZWVkLCBzaXplX3Qgc2VlZGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpkdCwgc2l6ZV90IGR0bGVuKQoreworICBncGdfZXJyb3JfdCBlcnI7CisgIHJuZ19jb250ZXh0X3QgdGVzdF9jdHg7CisKKyAgX2djcnlfcm5nZmlwc19pbml0aWFsaXplICgxKTsgIC8qIEF1dG8taW5pdGlhbGl6ZSBpZiBuZWVkZWQuICAqLworICAKKyAgaWYgKCFyX2NvbnRleHQKKyAgICAgIHx8ICFrZXkgIHx8IGtleWxlbiAgIT0gMTYgCisgICAgICB8fCAhc2VlZCB8fCBzZWVkbGVuICE9IDE2CisgICAgICB8fCAhZHQgICB8fCBkdGxlbiAgICE9IDE2ICkKKyAgICByZXR1cm4gR1BHX0VSUl9JTlZfQVJHOworCisgIHRlc3RfY3R4ID0gZ2NyeV9jYWxsb2MgKDEsIHNpemVvZiAqdGVzdF9jdHggKyBkdGxlbik7CisgIGlmICghdGVzdF9jdHgpCisgICAgcmV0dXJuIGdwZ19lcnJfY29kZV9mcm9tX3N5c2Vycm9yICgpOworICBzZXR1cF9ndWFyZHMgKHRlc3RfY3R4KTsKKyAgCisgIC8qIFNldHVwIHRoZSBrZXkuICAqLworICBlcnIgPSBnY3J5X2NpcGhlcl9vcGVuICgmdGVzdF9jdHgtPmNpcGhlcl9oZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR0NSWV9DSVBIRVJfQUVTMTI4LCBHQ1JZX0NJUEhFUl9NT0RFX0VDQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR0NSWV9DSVBIRVJfU0VDVVJFKTsKKyAgaWYgKGVycikKKyAgICBnb3RvIGxlYXZlOworCisgIGVyciA9IGdjcnlfY2lwaGVyX3NldGtleSAodGVzdF9jdHgtPmNpcGhlcl9oZCwga2V5LCBrZXlsZW4pOworICBpZiAoZXJyKQorICAgIGdvdG8gbGVhdmU7CisKKyAgdGVzdF9jdHgtPmtleV9pbml0X3BpZCA9IGdldHBpZCAoKTsKKyAgICAgIAorICAvKiBTZXR1cCB0aGUgc2VlZC4gICovCisgIG1lbWNweSAodGVzdF9jdHgtPnNlZWRfViwgc2VlZCwgc2VlZGxlbik7CisgIHRlc3RfY3R4LT5pc19zZWVkZWQgPSAxOworICB0ZXN0X2N0eC0+c2VlZF9pbml0X3BpZCA9IGdldHBpZCAoKTsKKyAgCisgIC8qIFNldHVwIGEgRFQgdmFsdWUuICBCZWNhdXNlIG91ciBjb250ZXh0IHN0cnVjdHVyZSBvbmx5IHN0b3JlcyBhCisgICAgIHBvaW50ZXIgd2UgY29weSB0aGUgRFQgdmFsdWUgdG8gdGhlIGV4dHJhIHNwYWNlIHdlIGFsbG9jYXRlZCBpbgorICAgICB0aGUgdGVzdF9jdHggYW5kIHNldCB0aGUgcG9pbnRlciB0byB0aGF0IGFkZHJlc3MuICAqLworICBtZW1jcHkgKCh1bnNpZ25lZCBjaGFyKil0ZXN0X2N0eCArIHNpemVvZiAqdGVzdF9jdHgsIGR0LCBkdGxlbik7CisgIHRlc3RfY3R4LT50ZXN0X2R0X3B0ciA9ICh1bnNpZ25lZCBjaGFyKil0ZXN0X2N0eCArIHNpemVvZiAqdGVzdF9jdHg7IAorICB0ZXN0X2N0eC0+dGVzdF9kdF9jb3VudGVyID0gKCAodGVzdF9jdHgtPnRlc3RfZHRfcHRyWzEyXSA8PCAyNCkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCh0ZXN0X2N0eC0+dGVzdF9kdF9wdHJbMTNdIDw8IDE2KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwodGVzdF9jdHgtPnRlc3RfZHRfcHRyWzE0XSA8PCA4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwodGVzdF9jdHgtPnRlc3RfZHRfcHRyWzE1XSkgKTsKKworICBpZiAoIChmbGFncyAmIDEpICkKKyAgICB0ZXN0X2N0eC0+dGVzdF9ub19kdXBfY2hlY2sgPSAxOworCisgIGNoZWNrX2d1YXJkcyAodGVzdF9jdHgpOworICAvKiBBbGwgZmluZS4gICovCisgIGVyciA9IDA7CisKKyBsZWF2ZToKKyAgaWYgKGVycikKKyAgICB7CisgICAgICBnY3J5X2NpcGhlcl9jbG9zZSAodGVzdF9jdHgtPmNpcGhlcl9oZCk7CisgICAgICBnY3J5X2ZyZWUgKHRlc3RfY3R4KTsKKyAgICAgICpyX2NvbnRleHQgPSBOVUxMOworICAgIH0KKyAgZWxzZQorICAgICpyX2NvbnRleHQgPSB0ZXN0X2N0eDsKKyAgcmV0dXJuIGdjcnlfZXJyX2NvZGUgKGVycik7Cit9CisKKworLyogR2V0IEJVRkxFTiBieXRlcyBmcm9tIHRoZSBSTkcgdXNpbmcgdGhlIHRlc3QgQ09OVEVYVCBhbmQgc3RvcmUgdGhlbQorICAgYXQgQlVGRkVSLiAgUmV0dXJuIDAgb24gc3VjY2VzcyBvciBhbiBlcnJvciBjb2RlLiAgKi8KK2djcnlfZXJyX2NvZGVfdAorX2djcnlfcm5nZmlwc19ydW5fZXh0ZXJuYWxfdGVzdCAodm9pZCAqY29udGV4dCwgY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmbGVuKQoreworICBybmdfY29udGV4dF90IHRlc3RfY3R4ID0gY29udGV4dDsKKworICBpZiAoIXRlc3RfY3R4IHx8ICFidWZmZXIgfHwgYnVmbGVuICE9IDE2KQorICAgIHJldHVybiBHUEdfRVJSX0lOVl9BUkc7CisKKyAgbG9ja19ybmcgKCk7CisgIGdldF9yYW5kb20gKGJ1ZmZlciwgYnVmbGVuLCB0ZXN0X2N0eCk7CisgIHVubG9ja19ybmcgKCk7CisgIHJldHVybiAwOworfQorCisvKiBSZWxlYXNlIHRoZSB0ZXN0IENPTlRFWFQuICAqLwordm9pZAorX2djcnlfcm5nZmlwc19kZWluaXRfZXh0ZXJuYWxfdGVzdCAodm9pZCAqY29udGV4dCkKK3sKKyAgcm5nX2NvbnRleHRfdCB0ZXN0X2N0eCA9IGNvbnRleHQ7CisKKyAgaWYgKHRlc3RfY3R4KQorICAgIHsKKyAgICAgIGdjcnlfY2lwaGVyX2Nsb3NlICh0ZXN0X2N0eC0+Y2lwaGVyX2hkKTsKKyAgICAgIGdjcnlfZnJlZSAodGVzdF9jdHgpOworICAgIH0KK30KKworCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvcmFuZG9tL3JhbmRvbS5jIGIvbGliZ2NyeXB0LTEuNC42L3JhbmRvbS9yYW5kb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGY4N2UyCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L3JhbmRvbS9yYW5kb20uYwpAQCAtMCwwICsxLDMyMyBAQAorLyogcmFuZG9tLmMgLSBSYW5kb20gbnVtYmVyIHN3aXRjaAorICogQ29weXJpZ2h0IChDKSAyMDA4ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworLyoKKyAgVGhpcyBtb2R1bGUgc3dpdGNoZXMgYmV0d2VlbiBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb25zIG9mIHJhbmRvbQorICBudW1iZXIgZ2VuZXJhdG9ycyBhbmQgcHJvdmlkZXMgYSBmZXcgaGVscCBmdW5jdGlvbnMuCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgImcxMGxpYi5oIgorI2luY2x1ZGUgInJhbmRvbS5oIgorI2luY2x1ZGUgInJhbmQtaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJhdGguaCIKKworCisvKiBJZiBub3QgTlVMTCBhIHByb2dyZXNzIGZ1bmN0aW9uIGNhbGxlZCBmcm9tIGNlcnRhaW4gcGxhY2VzIGFuZCB0aGUKKyAgIG9wYXF1ZSB2YWx1ZSBwYXNzZWQgYWxvbmcuICBSZWdpc3RyZWQgYnkKKyAgIF9nY3J5X3JlZ2lzdGVyX3JhbmRvbV9wcm9ncmVzcyAoKS4gKi8KK3N0YXRpYyB2b2lkICgqcHJvZ3Jlc3NfY2IpICh2b2lkICosY29uc3QgY2hhciosaW50LGludCwgaW50ICk7CitzdGF0aWMgdm9pZCAqcHJvZ3Jlc3NfY2JfZGF0YTsKKworCisKKwwKKy8qIC0tLSAgRnVuY3Rpb25zICAtLS0gKi8KKworCisvKiBVc2VkIHRvIHJlZ2lzdGVyIGEgcHJvZ3Jlc3MgY2FsbGJhY2suICBUaGlzIG5lZWRzIHRvIGJlIGNhbGxlZAorICAgYmVmb3JlIGFueSB0aHJlYWRzIGFyZSBjcmVhdGVkLiAqLwordm9pZAorX2djcnlfcmVnaXN0ZXJfcmFuZG9tX3Byb2dyZXNzICh2b2lkICgqY2IpKHZvaWQgKixjb25zdCBjaGFyKixpbnQsaW50LGludCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNiX2RhdGEgKQoreworICBwcm9ncmVzc19jYiA9IGNiOworICBwcm9ncmVzc19jYl9kYXRhID0gY2JfZGF0YTsKK30KKworCisvKiBUaGlzIHByb2dyZXNzIGZ1bmN0aW9uIGlzIGN1cnJlbnRseSB1c2VkIGJ5IHRoZSByYW5kb20gbW9kdWxlcyB0bworICAgZ2l2ZSBoaW50cyBvbiBob3cgbXVjaCBtb3JlIGVudHJvcHkgaXMgcmVxdWlyZWQuICovCit2b2lkCitfZ2NyeV9yYW5kb21fcHJvZ3Jlc3MgKGNvbnN0IGNoYXIgKndoYXQsIGludCBwcmludGNoYXIsIGludCBjdXJyZW50LCBpbnQgdG90YWwpCit7CisgIGlmIChwcm9ncmVzc19jYikKKyAgICBwcm9ncmVzc19jYiAocHJvZ3Jlc3NfY2JfZGF0YSwgd2hhdCwgcHJpbnRjaGFyLCBjdXJyZW50LCB0b3RhbCk7Cit9CisKKworCisvKiBJbml0aWFsaXplIHRoaXMgcmFuZG9tIHN1YnN5c3RlbS4gIElmIEZVTEwgaXMgZmFsc2UsIHRoaXMgZnVuY3Rpb24KKyAgIG1lcmVseSBjYWxscyB0aGUgYmFzaWMgaW5pdGlhbGl6YXRpb24gb2YgdGhlIG1vZHVsZSBhbmQgZG9lcyBub3QgZG8KKyAgIGFueXRoaW5nIG1vcmUuICBEb2luZyB0aGlzIGlzIG5vdCByZWFsbHkgcmVxdWlyZWQgYnV0IHdoZW4gcnVubmluZworICAgaW4gYSB0aHJlYWRlZCBlbnZpcm9ubWVudCB3ZSBtaWdodCBnZXQgYSByYWNlIGNvbmRpdGlvbgorICAgb3RoZXJ3aXNlLiAqLwordm9pZAorX2djcnlfcmFuZG9tX2luaXRpYWxpemUgKGludCBmdWxsKQoreworICBpZiAoZmlwc19tb2RlICgpKQorICAgIF9nY3J5X3JuZ2ZpcHNfaW5pdGlhbGl6ZSAoZnVsbCk7CisgIGVsc2UKKyAgICBfZ2NyeV9ybmdjc3BybmdfaW5pdGlhbGl6ZSAoZnVsbCk7Cit9CisKKwordm9pZAorX2djcnlfcmFuZG9tX2R1bXBfc3RhdHMgKHZvaWQpCit7CisgIGlmIChmaXBzX21vZGUgKCkpCisgICAgX2djcnlfcm5nZmlwc19kdW1wX3N0YXRzICgpOworICBlbHNlCisgICAgX2djcnlfcm5nY3Nwcm5nX2R1bXBfc3RhdHMgKCk7Cit9CisKKworLyogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGR1cmluZyBpbml0aWFsaXphdGlvbiBhbmQgYmVvcmUKKyAgIGludGlhbGl6YXRpb24gb2YgdGhpcyBtb2R1bGUgdG8gcGxhY2UgdGhlIHJhbmRvbSBwb29scyBpbnRvIHNlY3VyZQorICAgbWVtb3J5LiAgKi8KK3ZvaWQKK19nY3J5X3NlY3VyZV9yYW5kb21fYWxsb2MgKHZvaWQpCit7CisgIGlmIChmaXBzX21vZGUgKCkpCisgICAgOyAgLyogTm90IHVzZWQ7IHRoZSBmaXBzIHJuZyBpcyBhbGxvd3MgaW4gc2VjdXJlIG1vZGUuICAqLworICBlbHNlCisgICAgX2djcnlfcm5nY3Nwcm5nX3NlY3VyZV9hbGxvYyAoKTsKK30KKworCisvKiBUaGlzIG1heSBiZSBjYWxsZWQgYmVmb3JlIGZ1bGwgaW5pdGlhbGl6YXRpb24gdG8gZGVncmFkZSB0aGUKKyAgIHF1YWxpdHkgb2YgdGhlIFJORyBmb3IgdGhlIHNha2Ugb2YgYSBmYXN0ZXIgcnVubmluZyB0ZXN0IHN1aXRlLiAgKi8KK3ZvaWQKK19nY3J5X2VuYWJsZV9xdWlja19yYW5kb21fZ2VuICh2b2lkKQoreworICBpZiAoZmlwc19tb2RlICgpKQorICAgIDsgIC8qIE5vdCB1c2VkLiAgKi8KKyAgZWxzZQorICAgIF9nY3J5X3JuZ2NzcHJuZ19lbmFibGVfcXVpY2tfZ2VuICgpOworfQorCisKK3ZvaWQKK19nY3J5X3NldF9yYW5kb21fZGFlbW9uX3NvY2tldCAoY29uc3QgY2hhciAqc29ja2V0bmFtZSkKK3sKKyAgaWYgKGZpcHNfbW9kZSAoKSkKKyAgICA7ICAvKiBOb3QgdXNlZC4gICovCisgIGVsc2UKKyAgICBfZ2NyeV9ybmdjc3Bybmdfc2V0X2RhZW1vbl9zb2NrZXQgKHNvY2tldG5hbWUpOworfQorCisvKiBXaXRoIE9OT0ZGIHNldCB0byAxLCBlbmFibGUgdGhlIHVzZSBvZiB0aGUgZGFlbW9uLiAgV2l0aCBPTk9GRiBzZXQKKyAgIHRvIDAsIGRpc2FibGUgdGhlIHVzZSBvZiB0aGUgZGFlbW9uLiAgV2l0aCBPTk9GIHNldCB0byAtMSwgcmV0dXJuCisgICB3aGV0aGVyIHRoZSBkYWVtb24gaGFzIGJlZW4gZW5hYmxlZC4gKi8KK2ludAorX2djcnlfdXNlX3JhbmRvbV9kYWVtb24gKGludCBvbm9mZikKK3sKKyAgaWYgKGZpcHNfbW9kZSAoKSkKKyAgICByZXR1cm4gMDsgLyogTmV2ZXIgZW5hYmxlZCBpbiBmaXBzIG1vZGUuICAqLworICBlbHNlCisgICAgcmV0dXJuIF9nY3J5X3JuZ2NzcHJuZ191c2VfZGFlbW9uIChvbm9mZik7Cit9CisKKworLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgbm8gcmVhbCBSTkcgaXMgYXZhaWxhYmxlIG9yIHRoZQorICAgcXVhbGl0eSBvZiB0aGUgUk5HIGhhcyBiZWVuIGRlZ3JhZGVkIGZvciB0ZXN0IHB1cnBvc2VzLiAgKi8KK2ludAorX2djcnlfcmFuZG9tX2lzX2Zha2VkICh2b2lkKQoreworICBpZiAoZmlwc19tb2RlICgpKQorICAgIHJldHVybiBfZ2NyeV9ybmdmaXBzX2lzX2Zha2VkICgpOworICBlbHNlCisgICAgcmV0dXJuIF9nY3J5X3JuZ2NzcHJuZ19pc19mYWtlZCAoKTsKK30KKworCisvKiBBZGQgQlVGTEVOIGJ5dGVzIGZyb20gQlVGIHRvIHRoZSBpbnRlcm5hbCByYW5kb20gcG9vbC4gIFFVQUxJVFkKKyAgIHNob3VsZCBiZSBpbiB0aGUgcmFuZ2Ugb2YgMC4uMTAwIHRvIGluZGljYXRlIHRoZSBnb29kbmVzcyBvZiB0aGUKKyAgIGVudHJvcHkgYWRkZWQsIG9yIC0xIGZvciBnb29kbmVzcyBub3Qga25vd24uICAqLworZ2NyeV9lcnJvcl90CitnY3J5X3JhbmRvbV9hZGRfYnl0ZXMgKGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbiwgaW50IHF1YWxpdHkpCit7CisgIGlmIChmaXBzX21vZGUgKCkpCisgICAgcmV0dXJuIDA7IC8qIE5vIG5lZWQgZm9yIHRoaXMgaW4gZmlwcyBtb2RlLiAgKi8KKyAgZWxzZQorICAgIHJldHVybiBfZ2NyeV9ybmdjc3BybmdfYWRkX2J5dGVzIChidWYsIGJ1ZmxlbiwgcXVhbGl0eSk7Cit9ICAgCisKKyAgCisvKiBIZWxwZXIgZnVuY3Rpb24uICAqLyAKK3N0YXRpYyB2b2lkCitkb19yYW5kb21pemUgKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCwgZW51bSBnY3J5X3JhbmRvbV9sZXZlbCBsZXZlbCkKK3sKKyAgaWYgKGZpcHNfbW9kZSAoKSkKKyAgICBfZ2NyeV9ybmdmaXBzX3JhbmRvbWl6ZSAoYnVmZmVyLCBsZW5ndGgsIGxldmVsKTsKKyAgZWxzZQorICAgIF9nY3J5X3JuZ2NzcHJuZ19yYW5kb21pemUgKGJ1ZmZlciwgbGVuZ3RoLCBsZXZlbCk7Cit9CisKKy8qIFRoZSBwdWJsaWMgZnVuY3Rpb24gdG8gcmV0dXJuIHJhbmRvbSBkYXRhIG9mIHRoZSBxdWFsaXR5IExFVkVMLgorICAgUmV0dXJucyBhIHBvaW50ZXIgdG8gYSBuZXdseSBhbGxvY2F0ZWQgYW5kIHJhbmRvbWl6ZWQgYnVmZmVyIG9mCisgICBMRVZFTCBhbmQgTkJZVEVTIGxlbmd0aC4gIENhbGxlciBtdXN0IGZyZWUgdGhlIGJ1ZmZlci4gICovCit2b2lkICoKK2djcnlfcmFuZG9tX2J5dGVzIChzaXplX3QgbmJ5dGVzLCBlbnVtIGdjcnlfcmFuZG9tX2xldmVsIGxldmVsKQoreworICB2b2lkICpidWZmZXI7CisKKyAgYnVmZmVyID0gZ2NyeV94bWFsbG9jIChuYnl0ZXMpOworICBkb19yYW5kb21pemUgKGJ1ZmZlciwgbmJ5dGVzLCBsZXZlbCk7CisgIHJldHVybiBidWZmZXI7Cit9CisKKworLyogVGhlIHB1YmxpYyBmdW5jdGlvbiB0byByZXR1cm4gcmFuZG9tIGRhdGEgb2YgdGhlIHF1YWxpdHkgTEVWRUw7CisgICB0aGlzIHZlcnNpb24gb2YgdGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJhbmRvbSBpbiBhIGJ1ZmZlciBhbGxvY2F0ZWQKKyAgIGluIHNlY3VyZSBtZW1vcnkuICBDYWxsZXIgbXVzdCBmcmVlIHRoZSBidWZmZXIuICovCit2b2lkICoKK2djcnlfcmFuZG9tX2J5dGVzX3NlY3VyZSAoc2l6ZV90IG5ieXRlcywgZW51bSBnY3J5X3JhbmRvbV9sZXZlbCBsZXZlbCkKK3sKKyAgdm9pZCAqYnVmZmVyOworCisgIC8qIEhpc3RvcmljYWwgbm90ZSAoMS4zLjAtLTEuNC4xKTogVGhlIGJ1ZmZlciB3YXMgb25seSBhbGxvY2F0ZWQKKyAgICAgaW4gc2VjdXJlIG1lbW9yeSBpZiB0aGUgcG9vbCBpbiByYW5kb20tY3Nwcm5nLmMgd2FzIGFsc28gc2V0IHRvCisgICAgIHVzZSBzZWN1cmUgbWVtb3J5LiAgKi8KKyAgYnVmZmVyID0gZ2NyeV94bWFsbG9jX3NlY3VyZSAobmJ5dGVzKTsKKyAgZG9fcmFuZG9taXplIChidWZmZXIsIG5ieXRlcywgbGV2ZWwpOworICByZXR1cm4gYnVmZmVyOworfQorCisKKy8qIFB1YmxpYyBmdW5jdGlvbiB0byBmaWxsIHRoZSBidWZmZXIgd2l0aCBMRU5HVEggYnl0ZXMgb2YKKyAgIGNyeXB0b2dyYXBoaWNhbGx5IHN0cm9uZyByYW5kb20gYnl0ZXMuICBMZXZlbCBHQ1JZX1dFQUtfUkFORE9NIGlzCisgICBub3QgdmVyeSBzdHJvbmcsIEdDUllfU1RST05HX1JBTkRPTSBpcyBzdHJvbmcgZW5vdWdoIGZvciBtb3N0CisgICB1c2FnZSwgR0NSWV9WRVJZX1NUUk9OR19SQU5ET00gaXMgZ29vZCBmb3Iga2V5IGdlbmVyYXRpb24gc3R1ZmYgYnV0CisgICBtYXkgYmUgdmVyeSBzbG93LiAgKi8KK3ZvaWQKK2djcnlfcmFuZG9taXplICh2b2lkICpidWZmZXIsIHNpemVfdCBsZW5ndGgsIGVudW0gZ2NyeV9yYW5kb21fbGV2ZWwgbGV2ZWwpCit7CisgIGRvX3JhbmRvbWl6ZSAoYnVmZmVyLCBsZW5ndGgsIGxldmVsKTsKK30KKworCisvKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGUgdG8gYmUgdXNlZCBhcyBhIHNlZWQKKyAgIGZpbGUgZm9yIHRoZSBQUk5HLiAgVGhpcyBmdWNudGlvbiBzaG91bGQgYmUgY2FsbGVkIHByaW9yIHRvIHRoZQorICAgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHJhbmRvbSBtb2R1bGUuICBOQU1FIG1heSBub3QgYmUgTlVMTC4gICovCit2b2lkCitfZ2NyeV9zZXRfcmFuZG9tX3NlZWRfZmlsZSAoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgaWYgKGZpcHNfbW9kZSAoKSkKKyAgICA7IC8qIE5vIG5lZWQgZm9yIHRoaXMgaW4gZmlwcyBtb2RlLiAgKi8KKyAgZWxzZQorICAgIF9nY3J5X3JuZ2NzcHJuZ19zZXRfc2VlZF9maWxlIChuYW1lKTsKK30KKworCisvKiBJZiBhIHNlZWQgZmlsZSBoYXMgYmVlbiBzZXR1cCwgdGhpcyBmdW5jdGlvbiBtYXkgYmUgdXNlZCB0byB3cml0ZQorICAgYmFjayB0aGUgcmFuZG9tIG51bWJlcnMgZW50cm9weSBwb29sLiAgKi8KK3ZvaWQKK19nY3J5X3VwZGF0ZV9yYW5kb21fc2VlZF9maWxlICh2b2lkKQoreworICBpZiAoZmlwc19tb2RlICgpKQorICAgIDsgLyogTm8gbmVlZCBmb3IgdGhpcyBpbiBmaXBzIG1vZGUuICAqLworICBlbHNlCisgICAgX2djcnlfcm5nY3Nwcm5nX3VwZGF0ZV9zZWVkX2ZpbGUgKCk7Cit9CisKKworCisvKiBUaGUgZmFzdCByYW5kb20gcG9vbCBmdW5jdGlvbiBhcyBjYWxsZWQgYXQgc29tZSBwbGFjZXMgaW4KKyAgIGxpYmdjcnlwdC4gIFRoaXMgaXMgbWVyZWx5IGEgd3JhcHBlciB0byBtYWtlIHN1cmUgdGhhdCB0aGlzIG1vZHVsZQorICAgaXMgaW5pdGFsaXplZCBhbmQgdG8gbG9jayB0aGUgcG9vbC4gIE5vdGUsIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBhCisgICBOT1AgdW5sZXNzIGEgcmFuZG9tIGZ1bmN0aW9uIGhhcyBiZWVuIHVzZWQgb3IgX2djcnlfaW5pdGlhbGl6ZSAoMSkKKyAgIGhhcyBiZWVuIHVzZWQuICBXZSB1c2UgdGhpcyBoYWNrIHNvIHRoYXQgdGhlIGludGVybmFsIHVzZSBvZiB0aGlzCisgICBmdW5jdGlvbiBpbiBjaXBoZXJfb3BlbiBhbmQgbWRfb3BlbiB3b24ndCBzdGFydCBmaWxsaW5nIHVwIHRoZQorICAgcmFuZG9tIHBvb2wsIGV2ZW4gaWYgbm8gcmFuZG9tIHdpbGwgYmUgcmVxdWlyZWQgYnkgdGhlIHByb2Nlc3MuICovCit2b2lkCitfZ2NyeV9mYXN0X3JhbmRvbV9wb2xsICh2b2lkKQoreworICBpZiAoZmlwc19tb2RlICgpKQorICAgIDsgLyogTm8gbmVlZCBmb3IgdGhpcyBpbiBmaXBzIG1vZGUuICAqLworICBlbHNlCisgICAgX2djcnlfcm5nY3Nwcm5nX2Zhc3RfcG9sbCAoKTsKK30KKworCisKKy8qIENyZWF0ZSBhbiB1bnByZWRpY2FibGUgbm9uY2Ugb2YgTEVOR1RIIGJ5dGVzIGluIEJVRkZFUi4gKi8KK3ZvaWQKK2djcnlfY3JlYXRlX25vbmNlICh2b2lkICpidWZmZXIsIHNpemVfdCBsZW5ndGgpCit7CisgIGlmIChmaXBzX21vZGUgKCkpCisgICAgX2djcnlfcm5nZmlwc19jcmVhdGVfbm9uY2UgKGJ1ZmZlciwgbGVuZ3RoKTsKKyAgZWxzZQorICAgIF9nY3J5X3JuZ2NzcHJuZ19jcmVhdGVfbm9uY2UgKGJ1ZmZlciwgbGVuZ3RoKTsKK30KKworCisvKiBSdW4gdGhlIHNlbGYtdGVzdHMgZm9yIHRoZSBSTkcuICBUaGlzIGlzIGN1cnJlbnRseSBvbmx5IGltcGxlbWVudGVkCisgICBmb3IgdGhlIEZJUFMgZ2VuZXJhdG9yLiAgKi8KK2dwZ19lcnJvcl90CitfZ2NyeV9yYW5kb21fc2VsZnRlc3QgKHNlbGZ0ZXN0X3JlcG9ydF9mdW5jX3QgcmVwb3J0KQoreworICBpZiAoZmlwc19tb2RlICgpKQorICAgIHJldHVybiBfZ2NyeV9ybmdmaXBzX3NlbGZ0ZXN0IChyZXBvcnQpOworICBlbHNlCisgICAgcmV0dXJuIDA7IC8qIE5vIHNlbGZ0ZXN0cyB5ZXQuICAqLworfQorCisKKy8qIENyZWF0ZSBhIG5ldyB0ZXN0IGNvbnRleHQgZm9yIGFuIGV4dGVybmFsIFJORyB0ZXN0IGRyaXZlci4gIE9uCisgICBzdWNjZXNzIHRoZSB0ZXN0IGNvbnRleHQgaXMgc3RvcmVkIGF0IFJfQ09OVEVYVDsgb24gZmFpbHVyZSBOVUxMIGlzCisgICBzdG9yZWQgYXQgUl9DT05URVhUIGFuZCBhbiBlcnJvciBjb2RlIGlzIHJldHVybmVkLiAgKi8KK2djcnlfZXJyX2NvZGVfdAorX2djcnlfcmFuZG9tX2luaXRfZXh0ZXJuYWxfdGVzdCAodm9pZCAqKnJfY29udGV4dCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICprZXksIHNpemVfdCBrZXlsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpzZWVkLCBzaXplX3Qgc2VlZGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmR0LCBzaXplX3QgZHRsZW4pCit7CisgICh2b2lkKWZsYWdzOworICBpZiAoZmlwc19tb2RlICgpKQorICAgIHJldHVybiBfZ2NyeV9ybmdmaXBzX2luaXRfZXh0ZXJuYWxfdGVzdCAocl9jb250ZXh0LCBmbGFncywga2V5LCBrZXlsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWVkLCBzZWVkbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHQsIGR0bGVuKTsKKyAgZWxzZQorICAgIHJldHVybiBHUEdfRVJSX05PVF9TVVBQT1JURUQ7Cit9CisKKy8qIEdldCBCVUZMRU4gYnl0ZXMgZnJvbSB0aGUgUk5HIHVzaW5nIHRoZSB0ZXN0IENPTlRFWFQgYW5kIHN0b3JlIHRoZW0KKyAgIGF0IEJVRkZFUi4gIFJldHVybiAwIG9uIHN1Y2Nlc3Mgb3IgYW4gZXJyb3IgY29kZS4gICovCitnY3J5X2Vycl9jb2RlX3QKK19nY3J5X3JhbmRvbV9ydW5fZXh0ZXJuYWxfdGVzdCAodm9pZCAqY29udGV4dCwgY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmbGVuKQoreworICBpZiAoZmlwc19tb2RlICgpKQorICAgIHJldHVybiBfZ2NyeV9ybmdmaXBzX3J1bl9leHRlcm5hbF90ZXN0IChjb250ZXh0LCBidWZmZXIsIGJ1Zmxlbik7CisgIGVsc2UKKyAgICByZXR1cm4gR1BHX0VSUl9OT1RfU1VQUE9SVEVEOworfQorCisvKiBSZWxlYXNlIHRoZSB0ZXN0IENPTlRFWFQuICAqLwordm9pZAorX2djcnlfcmFuZG9tX2RlaW5pdF9leHRlcm5hbF90ZXN0ICh2b2lkICpjb250ZXh0KQoreworICBpZiAoZmlwc19tb2RlICgpKQorICAgIF9nY3J5X3JuZ2ZpcHNfZGVpbml0X2V4dGVybmFsX3Rlc3QgKGNvbnRleHQpOworfQpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L3JhbmRvbS9yYW5kb20uaCBiL2xpYmdjcnlwdC0xLjQuNi9yYW5kb20vcmFuZG9tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA3NWQ5YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9yYW5kb20vcmFuZG9tLmgKQEAgLTAsMCArMSw3MiBAQAorLyogcmFuZG9tLmggLSByYW5kb20gZnVuY3Rpb25zCisgKglDb3B5cmlnaHQgKEMpIDE5OTgsIDIwMDIsIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICovCisjaWZuZGVmIEcxMF9SQU5ET01fSAorI2RlZmluZSBHMTBfUkFORE9NX0gKKworI2luY2x1ZGUgInR5cGVzLmgiCisKKy8qLS0gcmFuZG9tLmMgLS0qLwordm9pZCBfZ2NyeV9yZWdpc3Rlcl9yYW5kb21fcHJvZ3Jlc3MgKHZvaWQgKCpjYikodm9pZCAqLGNvbnN0IGNoYXIqLGludCxpbnQsaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjYl9kYXRhICk7CisKK3ZvaWQgX2djcnlfcmFuZG9tX2luaXRpYWxpemUgKGludCBmdWxsKTsKK3ZvaWQgX2djcnlfcmFuZG9tX2R1bXBfc3RhdHModm9pZCk7Cit2b2lkIF9nY3J5X3NlY3VyZV9yYW5kb21fYWxsb2Modm9pZCk7Cit2b2lkIF9nY3J5X2VuYWJsZV9xdWlja19yYW5kb21fZ2VuICh2b2lkKTsKK2ludCAgX2djcnlfcmFuZG9tX2lzX2Zha2VkKHZvaWQpOwordm9pZCBfZ2NyeV9zZXRfcmFuZG9tX2RhZW1vbl9zb2NrZXQgKGNvbnN0IGNoYXIgKnNvY2tldG5hbWUpOworaW50ICBfZ2NyeV91c2VfcmFuZG9tX2RhZW1vbiAoaW50IG9ub2ZmKTsKK3ZvaWQgX2djcnlfc2V0X3JhbmRvbV9zZWVkX2ZpbGUgKGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCBfZ2NyeV91cGRhdGVfcmFuZG9tX3NlZWRfZmlsZSAodm9pZCk7CisKK2J5dGUgKl9nY3J5X2dldF9yYW5kb21fYml0cyggc2l6ZV90IG5iaXRzLCBpbnQgbGV2ZWwsIGludCBzZWN1cmUgKTsKK3ZvaWQgX2djcnlfZmFzdF9yYW5kb21fcG9sbCggdm9pZCApOworCitnY3J5X2Vycl9jb2RlX3QgX2djcnlfcmFuZG9tX2luaXRfZXh0ZXJuYWxfdGVzdCAodm9pZCAqKnJfY29udGV4dCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qga2V5bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnNlZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNlZWRsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqZHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkdGxlbik7CitnY3J5X2Vycl9jb2RlX3QgX2djcnlfcmFuZG9tX3J1bl9leHRlcm5hbF90ZXN0ICh2b2lkICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmbGVuKTsKK3ZvaWQgICAgICAgICAgICBfZ2NyeV9yYW5kb21fZGVpbml0X2V4dGVybmFsX3Rlc3QgKHZvaWQgKmNvbnRleHQpOworCisKKy8qLS0gcm5kZWdkLmMgLS0qLworZ3BnX2Vycm9yX3QgX2djcnlfcm5kZWdkX3NldF9zb2NrZXRfbmFtZSAoY29uc3QgY2hhciAqbmFtZSk7CisKKy8qLS0gcmFuZG9tLWRhZW1vbi5jIChvbmx5IHVzZWQgZnJvbSByYW5kb20uYykgLS0qLworI2lmZGVmIFVTRV9SQU5ET01fREFFTU9OCit2b2lkIF9nY3J5X2RhZW1vbl9pbml0aWFsaXplX2Jhc2ljcyAodm9pZCk7CitpbnQgX2djcnlfZGFlbW9uX3JhbmRvbWl6ZSAoY29uc3QgY2hhciAqc29ja2V0bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsIHNpemVfdCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBnY3J5X3JhbmRvbV9sZXZlbCBsZXZlbCk7CitpbnQgX2djcnlfZGFlbW9uX2NyZWF0ZV9ub25jZSAoY29uc3QgY2hhciAqc29ja2V0bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsIHNpemVfdCBsZW5ndGgpOworI2VuZGlmIC8qVVNFX1JBTkRPTV9EQUVNT04qLworCisjZW5kaWYgLypHMTBfUkFORE9NX0gqLworCisKKworCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvcmFuZG9tL3JuZGVnZC5jIGIvbGliZ2NyeXB0LTEuNC42L3JhbmRvbS9ybmRlZ2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2E1ZTBmCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L3JhbmRvbS9ybmRlZ2QuYwpAQCAtMCwwICsxLDI5MCBAQAorLyogcm5kZWdkLmMgIC0JaW50ZXJmYWNlIHRvIHRoZSBFR0QKKyAqCUNvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMiwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy91bi5oPgorI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAiZzEwbGliLmgiCisjaW5jbHVkZSAiY2lwaGVyLmgiCisjaW5jbHVkZSAicmFuZC1pbnRlcm5hbC5oIgorCisjaWZuZGVmIG9mZnNldG9mCisjZGVmaW5lIG9mZnNldG9mKHR5cGUsIG1lbWJlcikgKChzaXplX3QpICYoKHR5cGUgKikwKS0+bWVtYmVyKQorI2VuZGlmCisKK3N0YXRpYyBpbnQgZWdkX3NvY2tldCA9IC0xOworCisvKiBBbGxvY2F0ZWQgbmFtZSBvZiB0aGUgc29ja2V0IGlmIHN1cHBsaWVkIGF0IHJ1bnRpbWUuICAqLworc3RhdGljIGNoYXIgKnVzZXJfc29ja2V0X25hbWU7CisKKworLyogQWxsb2NhdGUgYSBuZXcgZmlsZW5hbWUgZnJvbSBGSVJTVF9QQVJUIGFuZCBTRUNPTkRfUEFSVCBhbmQgdG8KKyAgIHRpbGRlIGV4cGFuc2lvbiBmb3IgZmlyc3RfcGFydC4gIFNFQ09ORF9QQVJUIG1pZ2h0IGJlIE5VTEwuCisgKi8KK3N0YXRpYyBjaGFyICoKK215X21ha2VfZmlsZW5hbWUgKGNvbnN0IGNoYXIgKmZpcnN0X3BhcnQsIGNvbnN0IGNoYXIgKnNlY29uZF9wYXJ0KQoreworICBzaXplX3QgbjsKKyAgY2hhciAqbmFtZSwgKmhvbWUsICpwOworCisgIG4gPSBzdHJsZW4oZmlyc3RfcGFydCkrMTsKKyAgaWYgKHNlY29uZF9wYXJ0KQorICAgIG4gKz0gc3RybGVuIChzZWNvbmRfcGFydCkgKyAxOworCisgIGhvbWUgPSBOVUxMOworICBpZiggKmZpcnN0X3BhcnQgPT0gJ34nICYmIGZpcnN0X3BhcnRbMV0gPT0gJy8nCisgICAgICAmJiAoaG9tZSA9IGdldGVudigiSE9NRSIpKSAmJiAqaG9tZSApCisgICAgbiArPSBzdHJsZW4oaG9tZSk7CisKKyAgbmFtZSA9IGdjcnlfeG1hbGxvYyhuKTsKKyAgcCA9IChob21lCisgICAgICAgPyBzdHBjcHkgKHN0cGNweSAobmFtZSwgaG9tZSksIGZpcnN0X3BhcnQrMSApCisgICAgICAgOiBzdHBjcHkgKG5hbWUsIGZpcnN0X3BhcnQpICk7CisKKyAgaWYgKHNlY29uZF9wYXJ0KQorICAgIHN0cmNweSAoc3RwY3B5KHAsIi8iKSwgc2Vjb25kX3BhcnQpOworCisgIHJldHVybiBuYW1lOworfQorCisKK3N0YXRpYyBpbnQKK2RvX3dyaXRlKCBpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IG5ieXRlcyApCit7CisgIHNpemVfdCBubGVmdCA9IG5ieXRlczsKKyAgaW50IG53cml0dGVuOworICAKKyAgd2hpbGUoIG5sZWZ0ID4gMCApIAorICAgIHsKKyAgICAgIG53cml0dGVuID0gd3JpdGUoIGZkLCBidWYsIG5sZWZ0KTsKKyAgICAgIGlmKCBud3JpdHRlbiA8IDAgKQorICAgICAgICB7CisgICAgICAgICAgaWYoIGVycm5vID09IEVJTlRSICkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIHJldHVybiAtMTsKKwl9CisgICAgICBubGVmdCAtPSBud3JpdHRlbjsKKyAgICAgIGJ1ZiA9IChjaGFyKilidWYgKyBud3JpdHRlbjsKKyAgICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50Citkb19yZWFkKCBpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IG5ieXRlcyApCit7CisgIGludCBuLCBucmVhZCA9IDA7CisKKyAgZG8KKyAgICB7CisgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgbiA9IHJlYWQoZmQsIChjaGFyKilidWYgKyBucmVhZCwgbmJ5dGVzICk7CisgICAgICAgIH0gCisgICAgICB3aGlsZSggbiA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUiApOworICAgICAgaWYoIG4gPT0gLTEpCisgICAgICAgIHJldHVybiBucmVhZD8gbnJlYWQ6LTE7CisgICAgICBpZiggbiA9PSAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgICBucmVhZCArPSBuOworICAgICAgbmJ5dGVzIC09IG47CisgICAgfSAKKyAgd2hpbGUoIG5yZWFkIDwgbmJ5dGVzICk7CisgIHJldHVybiBucmVhZDsKK30KKworCisvKiBOb3RlIHRoYXQgaGlzIGZ1Y250aW9uIGlzIG5vdCB0aHJlYWQtc2FmZS4gICovCitncGdfZXJyb3JfdAorX2djcnlfcm5kZWdkX3NldF9zb2NrZXRfbmFtZSAoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgY2hhciAqbmV3bmFtZTsKKyAgc3RydWN0IHNvY2thZGRyX3VuIGFkZHI7CisKKyAgbmV3bmFtZSA9IG15X21ha2VfZmlsZW5hbWUgKG5hbWUsIE5VTEwpOworICBpZiAoc3RybGVuIChuZXduYW1lKSsxID49IHNpemVvZiBhZGRyLnN1bl9wYXRoKQorICAgIHsKKyAgICAgIGdjcnlfZnJlZSAobmV3bmFtZSk7CisgICAgICByZXR1cm4gZ3BnX2Vycm9yX2Zyb21fc3lzZXJyb3IgKCk7CisgICAgfQorICBnY3J5X2ZyZWUgKHVzZXJfc29ja2V0X25hbWUpOworICB1c2VyX3NvY2tldF9uYW1lID0gbmV3bmFtZTsKKyAgcmV0dXJuIDA7Cit9CisKKworLyogQ29ubmVjdCB0byB0aGUgRUdEIGFuZCByZXR1cm4gdGhlIGZpbGUgZGVzY3JpcHRvci4gIFJldHVybiAtMSBvbgorICAgZXJyb3IuICBXaXRoIE5PRkFJTCBzZXQgdG8gdHJ1ZSwgc2lsZW50bHkgZmFpbCBhbmQgcmV0dXJuIHRoZQorICAgZXJyb3IsIG90aGVyd2lzZSBwcmludCBhbiBlcnJvciBtZXNzYWdlIGFuZCBkaWUuICovCitpbnQKK19nY3J5X3JuZGVnZF9jb25uZWN0X3NvY2tldCAoaW50IG5vZmFpbCkKK3sKKyAgaW50IGZkOworICBjb25zdCBjaGFyICpibmFtZSA9IE5VTEw7CisgIGNoYXIgKm5hbWU7CisgIHN0cnVjdCBzb2NrYWRkcl91biBhZGRyOworICBpbnQgYWRkcl9sZW47CisKKyAgaWYgKGVnZF9zb2NrZXQgIT0gLTEpCisgICAgeworICAgICAgY2xvc2UgKGVnZF9zb2NrZXQpOworICAgICAgZWdkX3NvY2tldCA9IC0xOworICAgIH0KKworI2lmZGVmIEVHRF9TT0NLRVRfTkFNRQorICBibmFtZSA9IEVHRF9TT0NLRVRfTkFNRTsKKyNlbmRpZgorICBpZiAodXNlcl9zb2NrZXRfbmFtZSkKKyAgICB7CisgICAgICBuYW1lID0gZ2NyeV9zdHJkdXAgKHVzZXJfc29ja2V0X25hbWUpOworICAgICAgaWYgKCFuYW1lKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFub2ZhaWwpCisgICAgICAgICAgICBsb2dfZmF0YWwgKCJlcnJvciBhbGxvY2F0aW5nIG1lbW9yeSBpbiBybmRlZ2Q6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykgKTsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UgaWYgKCAhYm5hbWUgfHwgISpibmFtZSApCisgICAgbmFtZSA9IG15X21ha2VfZmlsZW5hbWUgKCJ+Ly5nbnVwZyIsICJlbnRyb3B5Iik7CisgIGVsc2UKKyAgICBuYW1lID0gbXlfbWFrZV9maWxlbmFtZSAoYm5hbWUsIE5VTEwpOworCisgIGlmIChzdHJsZW4obmFtZSkrMSA+PSBzaXplb2YgYWRkci5zdW5fcGF0aCkKKyAgICBsb2dfZmF0YWwgKCJFR0Qgc29ja2V0bmFtZSBpcyB0b28gbG9uZ1xuIik7CisgIAorICBtZW1zZXQoICZhZGRyLCAwLCBzaXplb2YgYWRkciApOworICBhZGRyLnN1bl9mYW1pbHkgPSBBRl9VTklYOworICBzdHJjcHkoIGFkZHIuc3VuX3BhdGgsIG5hbWUgKTsJICAKKyAgYWRkcl9sZW4gPSAob2Zmc2V0b2YoIHN0cnVjdCBzb2NrYWRkcl91biwgc3VuX3BhdGggKQorICAgICAgICAgICAgICArIHN0cmxlbiggYWRkci5zdW5fcGF0aCApKTsKKyAgCisgIGZkID0gc29ja2V0KEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKTsKKyAgaWYgKGZkID09IC0xICYmICFub2ZhaWwpCisgICAgbG9nX2ZhdGFsKCJjYW4ndCBjcmVhdGUgdW5peCBkb21haW4gc29ja2V0OiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pICk7CisgIGVsc2UgaWYgKGNvbm5lY3QgKGZkLCAoc3RydWN0IHNvY2thZGRyKikmYWRkciwgYWRkcl9sZW4pID09IC0xKQorICAgIHsKKyAgICAgIGlmICghbm9mYWlsKQorICAgICAgICBsb2dfZmF0YWwoImNhbid0IGNvbm5lY3QgdG8gRUdEIHNvY2tldCBgJXMnOiAlc1xuIiwKKwkJICBuYW1lLCBzdHJlcnJvcihlcnJubykgKTsKKyAgICAgIGNsb3NlIChmZCk7CisgICAgICBmZCA9IC0xOworICAgIH0KKyAgZ2NyeV9mcmVlKG5hbWUpOworICBpZiAoZmQgIT0gLTEpCisgICAgZWdkX3NvY2tldCA9IGZkOworICByZXR1cm4gZmQ7Cit9CisKKy8qKioqKioqKioqKioqKioqCisgKiBOb3RlOiBXZSBhbHdheXMgdXNlIHRoZSBoaWdoZXN0IGxldmVsLgorICogVG8gYm9vc3QgdGhlIHBlcmZvcm1hbmNlIHdlIG1heSB3YW50IHRvIGFkZCBzb21lCisgKiBhZGRpdGlvbmFsIGNvZGUgZm9yIGxldmVsIDEKKyAqCisgKiBVc2luZyBhIGxldmVsIG9mIDAgc2hvdWxkIG5ldmVyIGJsb2NrIGFuZCBiZXR0ZXIgYWRkIG5vdGhpbmcKKyAqIHRvIHRoZSBwb29sLiAgU28gdGhpcyBpcyBqdXN0IGEgZHVtbXkgZm9yIEVHRC4KKyAqLworaW50CitfZ2NyeV9ybmRlZ2RfZ2F0aGVyX3JhbmRvbSAodm9pZCAoKmFkZCkoY29uc3Qgdm9pZCosIHNpemVfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIHJhbmRvbV9vcmlnaW5zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIHJhbmRvbV9vcmlnaW5zIG9yaWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoLCBpbnQgbGV2ZWwgKQoreworICBpbnQgZmQgPSBlZ2Rfc29ja2V0OworICBpbnQgbjsKKyAgYnl0ZSBidWZmZXJbMjU2KzJdOworICBpbnQgbmJ5dGVzOworICBpbnQgZG9fcmVzdGFydCA9IDA7CisKKyAgaWYoICFsZW5ndGggKQorICAgIHJldHVybiAwOworICBpZiggIWxldmVsICkKKyAgICByZXR1cm4gMDsKKworIHJlc3RhcnQ6CisgIGlmIChmZCA9PSAtMSB8fCBkb19yZXN0YXJ0KQorICAgIGZkID0gX2djcnlfcm5kZWdkX2Nvbm5lY3Rfc29ja2V0ICgwKTsKKworICBkb19yZXN0YXJ0ID0gMDsKKworICBuYnl0ZXMgPSBsZW5ndGggPCAyNTU/IGxlbmd0aCA6IDI1NTsKKyAgLyogRmlyc3QgdGltZSB3ZSBkbyBpdCB3aXRoIGEgbm9uIGJsb2NraW5nIHJlcXVlc3QgKi8KKyAgYnVmZmVyWzBdID0gMTsgLyogbm9uIGJsb2NraW5nICovCisgIGJ1ZmZlclsxXSA9IG5ieXRlczsKKyAgaWYoIGRvX3dyaXRlKCBmZCwgYnVmZmVyLCAyICkgPT0gLTEgKQorICAgIGxvZ19mYXRhbCgiY2FuJ3Qgd3JpdGUgdG8gdGhlIEVHRDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSApOworICBuID0gZG9fcmVhZCggZmQsIGJ1ZmZlciwgMSApOworICBpZiggbiA9PSAtMSApCisgICAgeworICAgICAgbG9nX2Vycm9yKCJyZWFkIGVycm9yIG9uIEVHRDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICBkb19yZXN0YXJ0ID0gMTsKKyAgICAgIGdvdG8gcmVzdGFydDsKKyAgICB9CisgIG4gPSBidWZmZXJbMF07CisgIGlmKCBuICkKKyAgICB7CisgICAgICBuID0gZG9fcmVhZCggZmQsIGJ1ZmZlciwgbiApOworICAgICAgaWYoIG4gPT0gLTEgKQorICAgICAgICB7CisgICAgICAgICAgbG9nX2Vycm9yKCJyZWFkIGVycm9yIG9uIEVHRDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgZG9fcmVzdGFydCA9IDE7CisgICAgICAgICAgZ290byByZXN0YXJ0OworCX0KKyAgICAgICgqYWRkKSggYnVmZmVyLCBuLCBvcmlnaW4gKTsKKyAgICAgIGxlbmd0aCAtPSBuOworICAgIH0KKworICBpZiggbGVuZ3RoICkKKyAgICB7CisgICAgICBsb2dfaW5mbyAoCisgICAgICBfKCJQbGVhc2Ugd2FpdCwgZW50cm9weSBpcyBiZWluZyBnYXRoZXJlZC4gRG8gc29tZSB3b3JrIGlmIGl0IHdvdWxkXG4iCisgICAgICAgICJrZWVwIHlvdSBmcm9tIGdldHRpbmcgYm9yZWQsIGJlY2F1c2UgaXQgd2lsbCBpbXByb3ZlIHRoZSBxdWFsaXR5XG4iCisgICAgICAgICJvZiB0aGUgZW50cm9weS5cbiIpICk7CisgICAgfQorICB3aGlsZSggbGVuZ3RoICkKKyAgICB7CisgICAgICBuYnl0ZXMgPSBsZW5ndGggPCAyNTU/IGxlbmd0aCA6IDI1NTsKKworICAgICAgYnVmZmVyWzBdID0gMjsgLyogYmxvY2tpbmcgKi8KKyAgICAgIGJ1ZmZlclsxXSA9IG5ieXRlczsKKyAgICAgIGlmKCBkb193cml0ZSggZmQsIGJ1ZmZlciwgMiApID09IC0xICkKKyAgICAgICAgbG9nX2ZhdGFsKCJjYW4ndCB3cml0ZSB0byB0aGUgRUdEOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pICk7CisgICAgICBuID0gZG9fcmVhZCggZmQsIGJ1ZmZlciwgbmJ5dGVzICk7CisgICAgICBpZiggbiA9PSAtMSApCisgICAgICAgIHsKKyAgICAgICAgICBsb2dfZXJyb3IoInJlYWQgZXJyb3Igb24gRUdEOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICBkb19yZXN0YXJ0ID0gMTsKKyAgICAgICAgICBnb3RvIHJlc3RhcnQ7CisJfQorICAgICAgKCphZGQpKCBidWZmZXIsIG4sIG9yaWdpbiApOworICAgICAgbGVuZ3RoIC09IG47CisgICAgfQorICBtZW1zZXQoYnVmZmVyLCAwLCBzaXplb2YoYnVmZmVyKSApOworCisgIHJldHVybiAwOyAvKiBzdWNjZXNzICovCit9CmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvcmFuZG9tL3JuZGh3LmMgYi9saWJnY3J5cHQtMS40LjYvcmFuZG9tL3JuZGh3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk2MWQxMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9yYW5kb20vcm5kaHcuYwpAQCAtMCwwICsxLDEzOCBAQAorLyogcm5kaHcuYyAgLSBBY2Nlc3MgdG8gdGhlIGV4dGVybmFsIHJhbmRvbSBkYWVtb24KKyAqIENvcHlyaWdodCAoQykgMjAwNyAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlICJnMTBsaWIuaCIKKyNpbmNsdWRlICJyYW5kLWludGVybmFsLmgiCisKKyN1bmRlZiBVU0VfUEFETE9DSworI2lmZGVmIEVOQUJMRV9QQURMT0NLX1NVUFBPUlQKKyMgaWYgZGVmaW5lZCAoX19pMzg2X18pICYmIFNJWkVPRl9VTlNJR05FRF9MT05HID09IDQgJiYgZGVmaW5lZCAoX19HTlVDX18pCisjIGRlZmluZSBVU0VfUEFETE9DSworIyBlbmRpZgorI2VuZGlmIC8qRU5BQkxFX1BBRExPQ0tfU1VQUE9SVCovCisKKy8qIEtlZXAgdHJhY2sgb24gd2hldGhlciB0aGUgUk5HIGhhcyBwcm9ibGVtcy4gICovCitzdGF0aWMgdm9sYXRpbGUgaW50IHJuZ19mYWlsZWQ7CisKKworI2lmZGVmIFVTRV9QQURMT0NLCitzdGF0aWMgc2l6ZV90Citwb2xsX3BhZGxvY2sgKHZvaWQgKCphZGQpKGNvbnN0IHZvaWQqLCBzaXplX3QsIGVudW0gcmFuZG9tX29yaWdpbnMpLAorICAgICAgICAgICAgICBlbnVtIHJhbmRvbV9vcmlnaW5zIG9yaWdpbiwgaW50IGZhc3QpCit7CisgIHZvbGF0aWxlIGNoYXIgYnVmZmVyWzY0KzhdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkICg4KSkpOworICB2b2xhdGlsZSBjaGFyICpwOworICB1bnNpZ25lZCBpbnQgbmJ5dGVzLCBzdGF0dXM7CisgIAorICAvKiBQZXRlciBHdXRtYW5uJ3MgY3J5cHRsaWIgdGVzdHMgYWdhaW4gd2hldGhlciB0aGUgUk5HIGlzIGVuYWJsZWQKKyAgICAgYnV0IHdlIGRvbid0IGRvIHNvLiAgV2Ugd291bGQgaGF2ZSB0byBkbyB0aGlzIGFsc28gZm9yIG91ciBBRVMKKyAgICAgaW1wbGVtZW50YWlvbiBhbmQgdGhhdCBpcyBkZWZpbml0ZWx5IHRvbyB0aW1lIGNvbnN1bWluZy4gIFRoZXJlCisgICAgIHdvdWxkIGJlIGEgcmFjZSBjb25kaXRpb24gYW55d2F5LiAgVGh1cyB3ZSBhc3N1bWUgdGhhdCB0aGUgT1MKKyAgICAgZG9lcyBub3QgY2hhbmdlIHRoZSBQYWRsb2NrIGluaXRpYWxpemF0aW9uIHdoaWxlIGEgdXNlciBwcm9jZXNzCisgICAgIGlzIHJ1bm5pbmcuICAqLworICBwID0gYnVmZmVyOworICBuYnl0ZXMgPSAwOworICB3aGlsZSAobmJ5dGVzIDwgNjQpCisgICAgeworICAgICAgYXNtIHZvbGF0aWxlIAorICAgICAgICAoIm1vdmwgJTEsICUlZWRpXG5cdCIgICAgICAgICAvKiBTZXQgYnVmZmVyLiAgKi8KKyAgICAgICAgICJ4b3JsICUlZWR4LCAlJWVkeFxuXHQiICAgICAgLyogUmVxdWVzdCB1cCB0byA4IGJ5dGVzLiAgKi8KKyAgICAgICAgICIuYnl0ZSAweDBmLCAweGE3LCAweGMwXG5cdCIgLyogWFNUT1JFIFJORy4gKi8KKyAgICAgICAgIDogIj1hIiAoc3RhdHVzKQorICAgICAgICAgOiAiZyIgKHApCisgICAgICAgICA6ICIlZWR4IiwgIiVlZGkiLCAiY2MiCisgICAgICAgICApOworICAgICAgaWYgKChzdGF0dXMgJiAoMTw8NikpICAgICAgICAgLyogUk5HIHN0aWxsIGVuYWJsZWQuICAqLworICAgICAgICAgICYmICEoc3RhdHVzICYgKDE8PDEzKSkgICAgLyogdm9uIE5ldW1hbm4gY29ycmVjdG9yIGlzIGVuYWJsZWQuICAqLworICAgICAgICAgICYmICEoc3RhdHVzICYgKDE8PDE0KSkgICAgLyogU3RyaW5nIGZpbHRlciBpcyBkaXNhYmxlZC4gICovCisgICAgICAgICAgJiYgIShzdGF0dXMgJiAweDFjMDApICAgICAvKiBCSUFTIHZvbHRhZ2UgYXQgZGVmYXVsdC4gICovCisgICAgICAgICAgJiYgKCEoc3RhdHVzICYgMHgxZikgfHwgKHN0YXR1cyAmIDB4MWYpID09IDgpIC8qIFNhbml0eSBjaGVjay4gICovCisgICAgICAgICAgKQorICAgICAgICB7CisgICAgICAgICAgbmJ5dGVzICs9IChzdGF0dXMgJiAweDFmKTsKKyAgICAgICAgICBpZiAoZmFzdCkKKyAgICAgICAgICAgIGJyZWFrOyAvKiBEb24ndCBnZXQgaW50byB0aGUgbG9vcCB3aXRoIHRoZSBmYXN0IGZsYWcgc2V0LiAgKi8KKyAgICAgICAgICBwICs9IChzdGF0dXMgJiAweDFmKTsKKyAgICAgICAgfQorICAgICAgZWxzZSAKKyAgICAgICAgeworICAgICAgICAgIC8qIElmIHRoZXJlIHdhcyBhbiBlcnJvciB3ZSBuZWVkIHRvIGJyZWFrIHRoZSBsb29wIGFuZAorICAgICAgICAgICAgIHJlY29yZCB0aGF0IHRoZXJlIGlzIHNvbWV0aGluZyB3cm9uZyB3aXRoIHRoZSBwYWRsb2NrCisgICAgICAgICAgICAgUk5HLiAgKi8KKyAgICAgICAgICBybmdfZmFpbGVkID0gMTsKKyAgICAgICAgICBicmVhazsgCisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKG5ieXRlcykKKyAgICB7CisgICAgICAoKmFkZCkgKCh2b2lkKilidWZmZXIsIG5ieXRlcywgb3JpZ2luKTsKKyAgICAgIHdpcGVtZW1vcnkgKGJ1ZmZlciwgbmJ5dGVzKTsKKyAgICB9CisgIHJldHVybiBuYnl0ZXM7Cit9CisjZW5kaWYgLypVU0VfUEFETE9DSyovCisKKworaW50CitfZ2NyeV9ybmRod19mYWlsZWRfcCAodm9pZCkKK3sKKyAgcmV0dXJuIHJuZ19mYWlsZWQ7Cit9CisKKworLyogVHJ5IHRvIHJlYWQgcmFuZG9tIGZyb20gYSBoYXJkd2FyZSBSTkcgaWYgYSBmYXN0IG9uZSBpcworICAgYXZhaWxhYmxlLiAgKi8KK3ZvaWQKK19nY3J5X3JuZGh3X3BvbGxfZmFzdCAodm9pZCAoKmFkZCkoY29uc3Qgdm9pZCosIHNpemVfdCwgZW51bSByYW5kb21fb3JpZ2lucyksCisgICAgICAgICAgICAgICAgICAgICAgIGVudW0gcmFuZG9tX29yaWdpbnMgb3JpZ2luKQoreworICAodm9pZClhZGQ7CisgICh2b2lkKW9yaWdpbjsKKworI2lmZGVmIFVTRV9QQURMT0NLCisgIGlmICgoX2djcnlfZ2V0X2h3X2ZlYXR1cmVzICgpICYgSFdGX1BBRExPQ0tfUk5HKSkKKyAgICBwb2xsX3BhZGxvY2sgKGFkZCwgb3JpZ2luLCAxKTsKKyNlbmRpZiAgCit9CisKKworLyogUmVhZCA2NCBieXRlcyBmcm9tIGEgaGFyZHdhcmUgUk5HIGFuZCByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcworICAgYWN0dWFsbHkgcmVhZC4gICovCitzaXplX3QKK19nY3J5X3JuZGh3X3BvbGxfc2xvdyAodm9pZCAoKmFkZCkoY29uc3Qgdm9pZCosIHNpemVfdCwgZW51bSByYW5kb21fb3JpZ2lucyksCisgICAgICAgICAgICAgICAgICAgICAgIGVudW0gcmFuZG9tX29yaWdpbnMgb3JpZ2luKQoreworICBzaXplX3QgbmJ5dGVzID0gMDsKKworICAodm9pZClhZGQ7CisgICh2b2lkKW9yaWdpbjsKKworI2lmZGVmIFVTRV9QQURMT0NLCisgIGlmICgoX2djcnlfZ2V0X2h3X2ZlYXR1cmVzICgpICYgSFdGX1BBRExPQ0tfUk5HKSkKKyAgICBuYnl0ZXMgKz0gcG9sbF9wYWRsb2NrIChhZGQsIG9yaWdpbiwgMCk7CisjZW5kaWYgIAorCisgIHJldHVybiBuYnl0ZXM7Cit9CmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvcmFuZG9tL3JuZGxpbnV4LmMgYi9saWJnY3J5cHQtMS40LjYvcmFuZG9tL3JuZGxpbnV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc0ZWY2ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9yYW5kb20vcm5kbGludXguYwpAQCAtMCwwICsxLDE2NyBAQAorLyogcm5kbGludXguYyAgLSAgcmF3IHJhbmRvbSBudW1iZXIgZm9yIE9TZXMgd2l0aCAvZGV2L3JhbmRvbQorICogQ29weXJpZ2h0IChDKSAxOTk4LCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA3ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpZmRlZiBIQVZFX0dFVFRJTUVPRkRBWQorIyBpbmNsdWRlIDxzeXMvdGltZXMuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlICJnMTBsaWIuaCIKKyNpbmNsdWRlICJyYW5kLWludGVybmFsLmgiCisKK3N0YXRpYyBpbnQgb3Blbl9kZXZpY2UgKCBjb25zdCBjaGFyICpuYW1lICk7CisKKworc3RhdGljIGludAorc2V0X2Nsb2V4ZWNfZmxhZyAoaW50IGZkKQoreworICBpbnQgb2xkZmxhZ3M7CisKKyAgb2xkZmxhZ3M9IGZjbnRsIChmZCwgRl9HRVRGRCwgMCk7CisgIGlmIChvbGRmbGFncyA8IDApCisgICAgcmV0dXJuIG9sZGZsYWdzOworICBvbGRmbGFncyB8PSBGRF9DTE9FWEVDOworICByZXR1cm4gZmNudGwgKGZkLCBGX1NFVEZELCBvbGRmbGFncyk7Cit9CisKKworCisvKgorICogVXNlZCB0byBvcGVuIHRoZSAvZGV2L3JhbmRvbSBkZXZpY2VzIChMaW51eCwgeEJTRCwgU29sYXJpcyAoaWYgaXQgZXhpc3RzKSkuCisgKi8KK3N0YXRpYyBpbnQKK29wZW5fZGV2aWNlICggY29uc3QgY2hhciAqbmFtZSApCit7CisgIGludCBmZDsKKworICBmZCA9IG9wZW4gKCBuYW1lLCBPX1JET05MWSApOworICBpZiAoIGZkID09IC0xICkKKyAgICBsb2dfZmF0YWwgKCJjYW4ndCBvcGVuICVzOiAlc1xuIiwgbmFtZSwgc3RyZXJyb3IoZXJybm8pICk7CisKKyAgaWYgKHNldF9jbG9leGVjX2ZsYWcgKGZkKSkKKyAgICBsb2dfZXJyb3IgKCJlcnJvciBzZXR0aW5nIEZEX0NMT0VYRUMgb24gZmQgJWQ6ICVzXG4iLAorICAgICAgICAgICAgICAgZmQsIHN0cmVycm9yIChlcnJubykpOworCisgIC8qIFdlIHVzZWQgdG8gZG8gdGhlIGZvbGxvd2luZyBjaGVjaywgaG93ZXZlciBpdCB0dXJuZWQgb3V0IHRoYXQgdGhpcworICAgICBpcyBub3QgcG9ydGFibGUgc2luY2UgbW9yZSBPU2VzIHByb3ZpZGUgYSByYW5kb20gZGV2aWNlIHdoaWNoIGlzCisgICAgIHNvbWV0aW1lcyBpbXBsZW1lbnRlZCBhcyBhbm90aGVyIGRldmljZSB0eXBlLiAKKyAgICAgCisgICAgIHN0cnVjdCBzdGF0IHNiOworCisgICAgIGlmKCBmc3RhdCggZmQsICZzYiApICkKKyAgICAgICAgbG9nX2ZhdGFsKCJzdGF0KCkgb2ZmICVzIGZhaWxlZDogJXNcbiIsIG5hbWUsIHN0cmVycm9yKGVycm5vKSApOworICAgICBpZiggKCFTX0lTQ0hSKHNiLnN0X21vZGUpKSAmJiAoIVNfSVNGSUZPKHNiLnN0X21vZGUpKSApCisgICAgICAgIGxvZ19mYXRhbCgiaW52YWxpZCByYW5kb20gZGV2aWNlIVxuIiApOworICAqLworICByZXR1cm4gZmQ7Cit9CisKKworaW50CitfZ2NyeV9ybmRsaW51eF9nYXRoZXJfcmFuZG9tICh2b2lkICgqYWRkKShjb25zdCB2b2lkKiwgc2l6ZV90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSByYW5kb21fb3JpZ2lucyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIHJhbmRvbV9vcmlnaW5zIG9yaWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgsIGludCBsZXZlbCApCit7CisgIHN0YXRpYyBpbnQgZmRfdXJhbmRvbSA9IC0xOworICBzdGF0aWMgaW50IGZkX3JhbmRvbSA9IC0xOworICBpbnQgZmQ7CisgIGludCBuOworICBpbnQgd2Fybj0wOworICBieXRlIGJ1ZmZlcls3NjhdOworICBzaXplX3Qgbl9odzsKKworICAvKiBGaXJzdCByZWFkIGZyb20gYSBoYXJkd2FyZSBzb3VyY2UuICBIb3dldmVyIGxldCBpdCBhY2NvdW50IG9ubHkKKyAgICAgZm9yIHVwIHRvIDUwJSBvZiB0aGUgcmVxdWVzdGVkIGJ5dGVzLiAgKi8KKyAgbl9odyA9IF9nY3J5X3JuZGh3X3BvbGxfc2xvdyAoYWRkLCBvcmlnaW4pOworICBpZiAobl9odyA+IGxlbmd0aC8yKQorICAgIG5faHcgPSBsZW5ndGgvMjsKKyAgaWYgKGxlbmd0aCA+IDEpCisgICAgbGVuZ3RoIC09IG5faHc7CisKKyAgLyogT3BlbiB0aGUgcmVxdWVzdGVkIGRldmljZS4gICovCisgIGlmIChsZXZlbCA+PSAyKQorICAgIHsKKyAgICAgIGlmKCBmZF9yYW5kb20gPT0gLTEgKQorICAgICAgICBmZF9yYW5kb20gPSBvcGVuX2RldmljZSAoIE5BTUVfT0ZfREVWX1JBTkRPTSApOworICAgICAgZmQgPSBmZF9yYW5kb207CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYoIGZkX3VyYW5kb20gPT0gLTEgKQorICAgICAgICBmZF91cmFuZG9tID0gb3Blbl9kZXZpY2UgKCBOQU1FX09GX0RFVl9VUkFORE9NICk7CisgICAgICBmZCA9IGZkX3VyYW5kb207CisgICAgfQorCisgIC8qIEFuZCBlbnRlciB0aGUgcmVhZCBsb29wLiAgKi8KKyAgd2hpbGUgKGxlbmd0aCkKKyAgICB7CisgICAgICBmZF9zZXQgcmZkczsKKyAgICAgIHN0cnVjdCB0aW1ldmFsIHR2OworICAgICAgaW50IHJjOworICAgICAgCisgICAgICBGRF9aRVJPKCZyZmRzKTsKKyAgICAgIEZEX1NFVChmZCwgJnJmZHMpOworICAgICAgdHYudHZfc2VjID0gMzsKKyAgICAgIHR2LnR2X3VzZWMgPSAwOworICAgICAgaWYoICEocmM9c2VsZWN0KGZkKzEsICZyZmRzLCBOVUxMLCBOVUxMLCAmdHYpKSApCisgICAgICAgIHsKKyAgICAgICAgICBpZiggIXdhcm4gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZ2NyeV9yYW5kb21fcHJvZ3Jlc3MgKCJuZWVkX2VudHJvcHkiLCAnWCcsIDAsIChpbnQpbGVuZ3RoKTsKKwkgICAgICB3YXJuID0gMTsKKwkgICAgfQorCSAgY29udGludWU7CisJfQorCWVsc2UgaWYoIHJjID09IC0xICkKKyAgICAgICAgICB7CisJICAgIGxvZ19lcnJvciAoInNlbGVjdCgpIGVycm9yOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkgICAgY29udGludWU7CisgICAgICAgICAgfQorCisJZG8gCisgICAgICAgICAgeworCSAgICBpbnQgbmJ5dGVzID0gbGVuZ3RoIDwgc2l6ZW9mKGJ1ZmZlcik/IGxlbmd0aCA6IHNpemVvZihidWZmZXIpOworCSAgICBuID0gcmVhZChmZCwgYnVmZmVyLCBuYnl0ZXMgKTsKKwkgICAgaWYoIG4gPj0gMCAmJiBuID4gbmJ5dGVzICkgCisgICAgICAgICAgICAgIHsKKwkJbG9nX2Vycm9yKCJib2d1cyByZWFkIGZyb20gcmFuZG9tIGRldmljZSAobj0lZClcbiIsIG4gKTsKKwkJbiA9IG5ieXRlczsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0gCisgICAgICAgIHdoaWxlKCBuID09IC0xICYmIGVycm5vID09IEVJTlRSICk7CisJaWYoIG4gPT0gLTEgKQorICAgICAgICAgIGxvZ19mYXRhbCgicmVhZCBlcnJvciBvbiByYW5kb20gZGV2aWNlOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkoKmFkZCkoIGJ1ZmZlciwgbiwgb3JpZ2luICk7CisJbGVuZ3RoIC09IG47CisgICAgfQorICBtZW1zZXQoYnVmZmVyLCAwLCBzaXplb2YoYnVmZmVyKSApOworCisgIHJldHVybiAwOyAvKiBzdWNjZXNzICovCit9CmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvcmFuZG9tL3JuZHVuaXguYyBiL2xpYmdjcnlwdC0xLjQuNi9yYW5kb20vcm5kdW5peC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYWY5YWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvcmFuZG9tL3JuZHVuaXguYwpAQCAtMCwwICsxLDg4MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQkJCQkJCQkJICAgICoKKyAqCQkJCQkJCQkJICAgICoKKyAqICAgVW5peCBSYW5kb21uZXNzLUdhdGhlcmluZyBDb2RlCQkJCQkgICAgKgorICoJCQkJCQkJCQkgICAgKgorICogICBDb3B5cmlnaHQgUGV0ZXIgR3V0bWFubiwgUGF1bCBLZW5kYWxsLCBhbmQgQ2hyaXMgV2VkZ3dvb2QgMTk5Ni0xOTk5LiAgICoKKyAqICAgSGVhdmlseSBtb2RpZmllZCBmb3IgR251UEcgYnkgV2VybmVyIEtvY2gJCQkJICAgICoKKyAqCQkJCQkJCQkJICAgICoKKyAqCQkJCQkJCQkJICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGlzIG1vZHVsZSBpcyBwYXJ0IG9mIHRoZSBjcnlwdGxpYiBjb250aW51b3VzbHkgc2VlZGVkIHBzZXVkb3JhbmRvbQorICAgbnVtYmVyIGdlbmVyYXRvci4gIEZvciB1c2FnZSBjb25kaXRpb25zLCBzZWUgbGliX3JhbmQuYworCisgICBbSGVyZSBpcyB0aGUgbm90aWNlIGZyb20gbGliX3JhbmQuYzpdCisKKyAgIFRoaXMgbW9kdWxlIGFuZCB0aGUgbWlzYy9ybmQqLmMgbW9kdWxlcyByZXByZXNlbnQgdGhlIGNyeXB0bGliCisgICBjb250aW51b3VzbHkgc2VlZGVkIHBzZXVkb3JhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIChDU1BSTkcpIGFzIGRlc2NyaWJlZCBpbgorICAgbXkgMTk5OCBVc2VuaXggU2VjdXJpdHkgU3ltcG9zaXVtIHBhcGVyICJUaGUgZ2VuZXJhdGlvbiBvZiByYW5kb20gbnVtYmVycworICAgZm9yIGNyeXB0b2dyYXBoaWMgcHVycG9zZXMiLgorCisgICBUaGUgQ1NQUk5HIGNvZGUgaXMgY29weXJpZ2h0IFBldGVyIEd1dG1hbm4gKGFuZCB2YXJpb3VzIG90aGVycykgMTk5NiwKKyAgIDE5OTcsIDE5OTgsIDE5OTksIGFsbCByaWdodHMgcmVzZXJ2ZWQuICBSZWRpc3RyaWJ1dGlvbiBvZiB0aGUgQ1NQUk5HCisgICBtb2R1bGVzIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZQorICAgICAgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgaW4gaXRzIGVudGlyZXR5LgorCisgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGNvcHlyaWdodCBub3RpY2UgaW4KKyAgICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAzLiBBIGNvcHkgb2YgYW55IGJ1Z2ZpeGVzIG9yIGVuaGFuY2VtZW50cyBtYWRlIG11c3QgYmUgcHJvdmlkZWQgdG8gdGhlCisgICAgICBhdXRob3IsIDxwZ3V0MDAxQGNzLmF1Y2tsYW5kLmFjLm56PiB0byBhbGxvdyB0aGVtIHRvIGJlIGFkZGVkIHRvIHRoZQorICAgICAgYmFzZWxpbmUgdmVyc2lvbiBvZiB0aGUgY29kZS4KKworICBBTFRFUk5BVElWRUxZLCB0aGUgY29kZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMi4xIG9yIGFueSBsYXRlciB2ZXJzaW9uCisgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBpbiB3aGljaCBjYXNlIHRoZQorICBwcm92aXNpb25zIG9mIHRoZSBHTlUgTEdQTCBhcmUgcmVxdWlyZWQgSU5TVEVBRCBPRiB0aGUgYWJvdmUKKyAgcmVzdHJpY3Rpb25zLgorCisgIEFsdGhvdWdoIG5vdCByZXF1aXJlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIExHUEwsIGl0IHdvdWxkIHN0aWxsIGJlCisgIG5pY2UgaWYgeW91IGNvdWxkIG1ha2UgYW55IGNoYW5nZXMgYXZhaWxhYmxlIHRvIHRoZSBhdXRob3IgdG8gYWxsb3cKKyAgYSBjb25zaXN0ZW50IGNvZGUgYmFzZSB0byBiZSBtYWludGFpbmVkLiAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgVGhlIGFib3ZlIGFsdGVybmF0aXZlIHdhcyBjaGFuZ2VkIGZyb20gR1BMIHRvIExHUEwgb24gMjAwNy0wOC0yMiB3aXRoCisgcGVybWlzc2lvbiBmcm9tIFBldGVyIEd1dG1hbm46CisgPT09PT09PT09PQorIEZyb206IHBndXQwMDEgPHBndXQwMDFAY3MuYXVja2xhbmQuYWMubno+CisgU3ViamVjdDogUmU6IExHUEwgZm9yIHRoZSB3aW5kb3dzIGVudHJvcHkgZ2F0aGVyZXIKKyBUbzogd2tAZ251cGcub3JnCisgRGF0ZTogV2VkLCAyMiBBdWcgMjAwNyAwMzowNTo0MiArMTIwMAorIAorIEhpLAorIAorID5BcyBvZiBub3cgbGliZ2NyeXB0IGlzIEdQTCB1bmRlciBXaW5kb3dzIGR1ZSB0byB0aGF0IG1vZHVsZSBhbmQgc29tZSBwZW9wbGUKKyA+d291bGQgcmVhbGx5IGxpa2UgdG8gc2VlIGl0IHVuZGVyIExHUEwgdG9vLiAgQ2FuIHlvdSBkbyBzdWNoIGEgbGljZW5zZSBjaGFuZ2UKKyA+dG8gTEdQTCB2ZXJzaW9uIDI/ICBOb3RlIHRoYXQgTEdQTCBnaXZlIHRoZSB1c2VyIHRoZSBvcHRpb24gdG8gcmVsaWNlbnNlIGl0CisgPnVuZGVyIEdQTCwgc28gdGhlIGNoYW5nZSB3b3VsZCBiZSBwcmV0dHkgZWFzeSBhbmQgYmFja3dhciBjb21wYXRpYmxlLgorIAorIFN1cmUuICBJIGFzc3VtZWQgdGhhdCBzaW5jZSBHUEcgd2FzIEdQTGQsIHlvdSdkIHByZWZlciB0aGUgR1BMIGZvciB0aGUgZW50cm9weQorIGNvZGUgYXMgd2VsbCwgYnV0IElhbiBhc2tlZCBmb3IgTEdQTCBhcyBhbiBvcHRpb24gc28gYXMgb2YgdGhlIG5leHQgcmVsZWFzZQorIEknbGwgaGF2ZSBMR1BMIGluIHRoZXJlLiAgWW91IGNhbiBjb25zaWRlciBpdCB0byBiZSByZXRyb2FjdGl2ZSwgc28geW91cgorIGN1cnJlbnQgdmVyc2lvbiB3aWxsIGJlIExHUExkIGFzIHdlbGwuCisgCisgUGV0ZXIuCisgPT09PT09PT09PQorIEZyb206IHBndXQwMDEgPHBndXQwMDFAY3MuYXVja2xhbmQuYWMubno+CisgU3ViamVjdDogUmU6IExHUEwgZm9yIHRoZSB3aW5kb3dzIGVudHJvcHkgZ2F0aGVyZXIKKyBUbzogd2tAZ251cGcub3JnCisgRGF0ZTogV2VkLCAyMiBBdWcgMjAwNyAyMDo1MDowOCArMTIwMAorIAorID5Xb3VsZCB5b3UgbWluZCB0byBleHRlbmQgdGhpcyBhbHNvIHRvIHRoZSBVbml4IGVudHJvcHkgZ2F0aGVyZXIgd2hpY2ggaXMKKyA+c3RpbGwgdXNlZCBvbiBzeXN0ZW1zIHdpdGhvdXQgL2Rldi9yYW5kb20gYW5kIHdoZW4gRUdEIGlzIG5vdCBpbnN0YWxsZWQ/IFRoYXQKKyA+d291bGQgYmUgdGhlIGxhc3QgR1BMZWQgcGllY2UgaW4gTGliZ2NyeXB0LgorIAorIFN1cmUsIGl0IGNvdmVycyB0aGUgZW50aXJlIGVudHJvcHktZ2F0aGVyaW5nIHN1YnN5c3RlbS4KKyAKKyBQZXRlci4KKyA9PT09PT09PT0KKyovCisKKy8qIEdlbmVyYWwgaW5jbHVkZXMgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qIE9TLXNwZWNpZmljIGluY2x1ZGVzICovCisKKyNpZmRlZiBfX29zZl9fCisgIC8qIFNvbWV3aGVyZSBpbiB0aGUgbW9yYXNzIG9mIHN5c3RlbS1zcGVjaWZpYyBjcnVmdCB3aGljaCBPU0YvMSBwdWxscyBpbgorICAgKiB2aWEgdGhlIGZvbGxvd2luZyBpbmNsdWRlcyBhcmUgdmFyaW91cyBlbmRpYW5uZXNzIGRlZmluZXMsIHNvIHdlCisgICAqIHVuZGVmaW5lIHRoZSBjcnlwdGxpYiBvbmVzLCB3aGljaCBhcmVuJ3QgcmVhbGx5IG5lZWRlZCBmb3IgdGhpcyBtb2R1bGUKKyAgICogYW55d2F5ICovCisjdW5kZWYgQklHX0VORElBTgorI3VuZGVmIExJVFRMRV9FTkRJQU4KKyNlbmRpZgkJCQkvKiBfX29zZl9fICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHB3ZC5oPgorI2lmbmRlZiBfX1FOWF9fCisjaW5jbHVkZSA8c3lzL2Vycm5vLmg+CisjaW5jbHVkZSA8c3lzL2lwYy5oPgorI2VuZGlmCQkJCS8qIF9fUU5YX18gKi8KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgkJLyogU0NPIGFuZCBTdW5PUyBuZWVkIHRoaXMgYmVmb3JlIHJlc291cmNlLmggKi8KKyNpZm5kZWYgX19RTlhfXworI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2VuZGlmCQkJCS8qIF9fUU5YX18gKi8KKyNpZiBkZWZpbmVkKCBfQUlYICkgfHwgZGVmaW5lZCggX19RTlhfXyApCisjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorI2VuZGlmCQkJCS8qIF9BSVggKi8KKyNpZm5kZWYgX19RTlhfXworI2luY2x1ZGUgPHN5cy9zaG0uaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvc2lnbmFsLmg+CisjZW5kaWYJCQkJLyogX19RTlhfXyAqLworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CQkvKiBWZXJzY2hpZWRlbmUga29taXNjaGUgVHlwZW4gKi8KKyNpZiBkZWZpbmVkKCBfX2hwdXggKSAmJiAoIE9TX1ZFUlNJT04gPT0gOSApCisjaW5jbHVkZSA8dmZvcmsuaD4KKyNlbmRpZgkJCQkvKiBfX2hwdXggOS54LCBhZnRlciB0aGF0IGl0J3MgaW4gdW5pc3RkLmggKi8KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorLyogI2luY2x1ZGUgPGtpdGNoZW5zaW5rLmg+ICovCisjaWZkZWYgX19RTlhfXworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHByb2Nlc3MuaD4KKyNlbmRpZgkJICAgICAgLyogX19RTlhfXyAqLworI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlICJ0eXBlcy5oIiAgLyogZm9yIGJ5dGUgYW5kIHUzMiB0eXBlZGVmcyAqLworI2luY2x1ZGUgImcxMGxpYi5oIgorI2luY2x1ZGUgInJhbmQtaW50ZXJuYWwuaCIKKworI2lmbmRlZiBFQUdBSU4KKyNkZWZpbmUgRUFHQUlOCUVXT1VMREJMT0NLCisjZW5kaWYKKyNpZm5kZWYgU1RESU5fRklMRU5PCisjZGVmaW5lIFNURElOX0ZJTEVOTyAwCisjZW5kaWYKKyNpZm5kZWYgU1RET1VUX0ZJTEVOTworI2RlZmluZSBTVERPVVRfRklMRU5PIDEKKyNlbmRpZgorCisjZGVmaW5lIEdBVEhFUl9CVUZTSVpFCQk0OTE1MgkvKiBVc3VhbGx5IGFib3V0IDI1SyBhcmUgZmlsbGVkICovCisKKy8qIFRoZSBzdHJ1Y3R1cmUgY29udGFpbmluZyBpbmZvcm1hdGlvbiBvbiByYW5kb20tZGF0YSBzb3VyY2VzLiAgRWFjaAorICogcmVjb3JkIGNvbnRhaW5zIHRoZSBzb3VyY2UgYW5kIGEgcmVsYXRpdmUgZXN0aW1hdGUgb2YgaXRzIHVzZWZ1bG5lc3MKKyAqICh3ZWlnaHRpbmcpIHdoaWNoIGlzIHVzZWQgdG8gc2NhbGUgdGhlIG51bWJlciBvZiBrQiBvZiBvdXRwdXQgZnJvbSB0aGUKKyAqIHNvdXJjZSAodG90YWwgPSBkYXRhX2J5dGVzIC8gdXNlZnVsbmVzcykuICBVc3VhbGx5IHRoZSB3ZWlnaHRpbmcgaXMgaW4gdGhlCisgKiByYW5nZSAxLTMgKG9yIDAgZm9yIGVzcGVjaWFsbHkgdXNlbGVzcyBzb3VyY2VzKSwgcmVzdWx0aW5nIGluIGEgdXNlZnVsbmVzcworICogcmF0aW5nIG9mIDEuLi4zIGZvciBlYWNoIGtCIG9mIHNvdXJjZSBvdXRwdXQgKG9yIDAgZm9yIHRoZSB1c2VsZXNzCisgKiBzb3VyY2VzKS4KKyAqCisgKiBJZiB0aGUgc291cmNlIGlzIGNvbnN0YW50bHkgY2hhbmdpbmcgKGNlcnRhaW4gdHlwZXMgb2YgbmV0d29yayBzdGF0aXN0aWNzCisgKiBoYXZlIHRoaXMgY2hhcmFjdGVyaXN0aWMpIGJ1dCB0aGUgYW1vdW50IG9mIG91dHB1dCBpcyBzbWFsbCwgdGhlIHdlaWdodGluZworICogaXMgZ2l2ZW4gYXMgYSBuZWdhdGl2ZSB2YWx1ZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBvdXRwdXQgc2hvdWxkIGJlIHRyZWF0ZWQKKyAqIGFzIGlmIGEgbWluaW11bSBvZiAxSyBvZiBvdXRwdXQgaGFkIGJlZW4gb2J0YWluZWQuICBJZiB0aGUgc291cmNlIHByb2R1Y2VzCisgKiBhIGxvdCBvZiBvdXRwdXQgdGhlbiB0aGUgc2NhbGUgZmFjdG9yIGlzIGZyYWN0aW9uYWwsIHJlc3VsdGluZyBpbiBhCisgKiB1c2VmdWxuZXNzIHJhdGluZyBvZiA8IDEgZm9yIGVhY2gga0Igb2Ygc291cmNlIG91dHB1dC4KKyAqCisgKiBJbiBvcmRlciB0byBwcm92aWRlIGVub3VnaCByYW5kb21uZXNzIHRvIHNhdGlzZnkgdGhlIHJlcXVpcmVtZW50cyBmb3IgYQorICogc2xvdyBwb2xsLCB3ZSBuZWVkIHRvIGFjY3VtdWxhdGUgYXQgbGVhc3QgMjAgcG9pbnRzIG9mIHVzZWZ1bG5lc3MgKGEKKyAqIHR5cGljYWwgc3lzdGVtIHNob3VsZCBnZXQgYWJvdXQgMzAgcG9pbnRzKS4KKyAqCisgKiBTb21lIHBvdGVudGlhbCBvcHRpb25zIGFyZSBtaXNzZWQgb3V0IGJlY2F1c2Ugb2Ygc3BlY2lhbCBjb25zaWRlcmF0aW9ucy4KKyAqIHBzdGF0IC1pIGFuZCBwc3RhdCAtZiBjYW4gcHJvZHVjZSBhbWF6aW5nIGFtb3VudHMgb2Ygb3V0cHV0ICh0aGUgcmVjb3JkCisgKiBpcyA2MDBLIG9uIGFuIE9yYWNsZSBzZXJ2ZXIpIHdoaWNoIGZsb29kcyB0aGUgYnVmZmVyIGFuZCBkb2Vzbid0IHlpZWxkCisgKiBhbnl0aGluZyB1c2VmdWwgKGFwYXJ0IGZyb20gcGVyaGFwcyBpbmNyZWFzaW5nIHRoZSBlbnRyb3B5IG9mIHRoZSB2bXN0YXQKKyAqIG91dHB1dCBhIGJpdCksIHNvIHdlIGRvbid0IGJvdGhlciB3aXRoIHRoaXMuICBwc3RhdCBpbiBnZW5lcmFsIHByb2R1Y2VzCisgKiBxdWl0ZSBhIGJpdCBvZiBvdXRwdXQsIGJ1dCBpdCBkb2Vzbid0IGNoYW5nZSBtdWNoIG92ZXIgdGltZSwgc28gaXQgZ2V0cworICogdmVyeSBsb3cgd2VpZ2h0aW5ncy4gIG5ldHN0YXQgLXMgcHJvZHVjZXMgY29uc3RhbnRseS1jaGFuZ2luZyBvdXRwdXQgYnV0CisgKiBhbHNvIHByb2R1Y2VzIHF1aXRlIGEgYml0IG9mIGl0LCBzbyBpdCBvbmx5IGdldHMgYSB3ZWlnaHRpbmcgb2YgMiByYXRoZXIKKyAqIHRoYW4gMy4gIFRoZSBzYW1lIGhvbGRzIGZvciBuZXRzdGF0IC1pbiwgd2hpY2ggZ2V0cyAxIHJhdGhlciB0aGFuIDIuCisgKgorICogU29tZSBiaW5hcmllcyBhcmUgc3RvcmVkIGluIGRpZmZlcmVudCBsb2NhdGlvbnMgb24gZGlmZmVyZW50IHN5c3RlbXMgc28KKyAqIGFsdGVybmF0aXZlIHBhdGhzIGFyZSBnaXZlbiBmb3IgdGhlbS4gIFRoZSBjb2RlIHNvcnRzIG91dCB3aGljaCBvbmUgdG8KKyAqIHJ1biBieSBpdHNlbGYsIG9uY2UgaXQgZmluZHMgYW4gZXhlY3RhYmxlIHNvbWV3aGVyZSBpdCBtb3ZlcyBvbiB0byB0aGUKKyAqIG5leHQgc291cmNlLiAgVGhlIHNvdXJjZXMgYXJlIGFycmFuZ2VkIHJvdWdobHkgaW4gdGhlaXIgb3JkZXIgb2YKKyAqIHVzZWZ1bG5lc3MsIG9jY2FzaW9uYWxseSBzb3VyY2VzIHdoaWNoIHByb3ZpZGUgYSB0aW55IGFtb3VudCBvZgorICogcmVsYXRpdmVseSB1c2VsZXNzIGRhdGEgYXJlIHBsYWNlZCBhaGVhZCBvZiBvbmVzIHdoaWNoIHByb3ZpZGUgYSBsYXJnZQorICogYW1vdW50IG9mIHBvc3NpYmx5IHVzZWZ1bCBkYXRhIGJlY2F1c2UgYW5vdGhlciAxMDAgYnl0ZXMgY2FuJ3QgaHVydCwgYW5kCisgKiBpdCBtZWFucyB0aGUgYnVmZmVyIHdvbid0IGJlIHN3YW1wZWQgYnkgb25lIG9yIHR3byBoaWdoLW91dHB1dCBzb3VyY2VzLgorICogQWxsIHRoZSBoaWdoLW91dHB1dCBzb3VyY2VzIGFyZSBjbHVzdGVyZWQgdG93YXJkcyB0aGUgZW5kIG9mIHRoZSBsaXN0CisgKiBmb3IgdGhpcyByZWFzb24uICBTb21lIGJpbmFyaWVzIGFyZSBjaGVja2VkIGZvciBpbiBhIGNlcnRhaW4gb3JkZXIsIGZvcgorICogZXhhbXBsZSB1bmRlciBTbG93YXJpcyAvdXNyL3VjYi9wcyB1bmRlcnN0YW5kcyBhdXggYXMgYW4gYXJnLCBidXQgdGhlCisgKiBvdGhlcnMgZG9uJ3QuICBTb21lIHN5c3RlbXMgaGF2ZSBjb25kaXRpb25hbCBkZWZpbmVzIGVuYWJsaW5nIGFsdGVybmF0aXZlcworICogdG8gY29tbWFuZHMgd2hpY2ggZG9uJ3QgdW5kZXJzdGFuZCB0aGUgdXN1YWwgb3B0aW9ucyBidXQgd2lsbCBwcm92aWRlCisgKiBlbm91Z2ggb3V0cHV0IChpbiB0aGUgZm9ybSBvZiBlcnJvciBtZXNzYWdlcykgdG8gbG9vayBsaWtlIHRoZXkncmUgdGhlCisgKiByZWFsIHRoaW5nLCBjYXVzaW5nIGFsdGVybmF0aXZlIG9wdGlvbnMgdG8gYmUgc2tpcHBlZCAod2UgY2FuJ3QgY2hlY2sgdGhlCisgKiByZXR1cm4gZWl0aGVyIGJlY2F1c2Ugc29tZSBjb21tYW5kcyByZXR1cm4gcGVjdWxpYXIsIG5vbi16ZXJvIHN0YXR1cyBldmVuCisgKiB3aGVuIHRoZXkncmUgd29ya2luZyBjb3JyZWN0bHkpLgorICoKKyAqIEluIG9yZGVyIHRvIG1heGltaXNlIHVzZSBvZiB0aGUgYnVmZmVyLCB0aGUgY29kZSBwZXJmb3JtcyBhIGZvcm0gb2YgcnVuLQorICogbGVuZ3RoIGNvbXByZXNzaW9uIG9uIGl0cyBpbnB1dCB3aGVyZSBhIHJlcGVhdGVkIHNlcXVlbmNlIG9mIGJ5dGVzIGlzCisgKiByZXBsYWNlZCBieSB0aGUgb2NjdXJyZW5jZSBjb3VudCBtb2QgMjU2LiAgU29tZSBjb21tYW5kcyBvdXRwdXQgYW4gYXdmdWwKKyAqIGxvdCBvZiB3aGl0ZXNwYWNlLCB0aGlzIG1lYXN1cmUgZ3JlYXRseSBpbmNyZWFzZXMgdGhlIGFtb3VudCBvZiBkYXRhIHdlCisgKiBjYW4gZml0IGluIHRoZSBidWZmZXIuCisgKgorICogV2hlbiB3ZSBzY2FsZSB0aGUgd2VpZ2h0aW5nIHVzaW5nIHRoZSBTQygpIG1hY3JvLCBzb21lIHByZXByb2Nlc3NvcnMgbWF5CisgKiBnaXZlIGEgZGl2aXNpb24gYnkgemVybyB3YXJuaW5nIGZvciB0aGUgbW9zdCBvYnZpb3VzIGV4cHJlc3Npb24KKyAqICd3ZWlnaHQgPyAxMDI0IC8gd2VpZ2h0IDogMCcgKGFuZCBnY2MgMi43LjIuMiBkaWVzIHdpdGggYSBkaXZpc2lvbiBieSB6ZXJvCisgKiB0cmFwKSwgc28gd2UgZGVmaW5lIGEgdmFsdWUgU0NfMCB3aGljaCBldmFsdWF0ZXMgdG8gemVybyB3aGVuIGZlZCB0bworICogJzEwMjQgLyBTQ18wJyAqLworCisjZGVmaW5lIFNDKCB3ZWlnaHQgKQkoIDEwMjQgLyB3ZWlnaHQgKQkvKiBTY2FsZSBmYWN0b3IgKi8KKyNkZWZpbmUgU0NfMAkJCTE2Mzg0CS8qIFNDKCBTQ18wICkgZXZhbHV0ZXMgdG8gMCAqLworCitzdGF0aWMgc3RydWN0IFJJIHsKKyAgICBjb25zdCBjaGFyICpwYXRoOwkJLyogUGF0aCB0byBjaGVjayBmb3IgZXhpc3RlbmNlIG9mIHNvdXJjZSAqLworICAgIGNvbnN0IGNoYXIgKmFyZzsJCS8qIEFyZ3MgZm9yIHNvdXJjZSAqLworICAgIGNvbnN0IGludCB1c2VmdWxuZXNzOwkvKiBVc2VmdWxuZXNzIG9mIHNvdXJjZSAqLworICAgIEZJTEUgKnBpcGU7IAkJLyogUGlwZSB0byBzb3VyY2UgYXMgRklMRSAqICovCisgICAgaW50IHBpcGVGRDsgCQkvKiBQaXBlIHRvIHNvdXJjZSBhcyBGRCAqLworICAgIHBpZF90IHBpZDsJCQkvKiBwaWQgb2YgY2hpbGQgZm9yIHdhaXRwaWQoKSAqLworICAgIGludCBsZW5ndGg7IAkJLyogUXVhbnRpdHkgb2Ygb3V0cHV0IHByb2R1Y2VkICovCisgICAgY29uc3QgaW50IGhhc0FsdGVybmF0aXZlOwkgICAgLyogV2hldGhlciBzb3VyY2UgaGFzIGFsdC5sb2NhdGlvbiAqLworfSBkYXRhU291cmNlc1tdID0geworCisgICAgewkiL2Jpbi92bXN0YXQiLCAiLXMiLCBTQygtMyksIE5VTEwsIDAsIDAsIDAsIDEgICAgfSwKKyAgICB7CSIvdXNyL2Jpbi92bXN0YXQiLCAiLXMiLCBTQygtMyksIE5VTEwsIDAsIDAsIDAsIDB9LAorICAgIHsJIi9iaW4vdm1zdGF0IiwgIi1jIiwgU0MoLTMpLCBOVUxMLCAwLCAwLCAwLCAxICAgICB9LAorICAgIHsJIi91c3IvYmluL3Ztc3RhdCIsICItYyIsIFNDKC0zKSwgTlVMTCwgMCwgMCwgMCwgMH0sCisgICAgewkiL3Vzci9iaW4vcGZzdGF0IiwgTlVMTCwgU0MoLTIpLCBOVUxMLCAwLCAwLCAwLCAwfSwKKyAgICB7CSIvYmluL3Ztc3RhdCIsICItaSIsIFNDKC0yKSwgTlVMTCwgMCwgMCwgMCwgMSAgICAgfSwKKyAgICB7CSIvdXNyL2Jpbi92bXN0YXQiLCAiLWkiLCBTQygtMiksIE5VTEwsIDAsIDAsIDAsIDB9LAorICAgIHsJIi91c3IvdWNiL25ldHN0YXQiLCAiLXMiLCBTQygyKSwgTlVMTCwgMCwgMCwgMCwgMSB9LAorICAgIHsJIi91c3IvYmluL25ldHN0YXQiLCAiLXMiLCBTQygyKSwgTlVMTCwgMCwgMCwgMCwgMSB9LAorICAgIHsJIi91c3Ivc2Jpbi9uZXRzdGF0IiwgIi1zIiwgU0MoMiksIE5VTEwsIDAsIDAsIDAsIDF9LAorICAgIHsJIi91c3IvZXRjL25ldHN0YXQiLCAiLXMiLCBTQygyKSwgTlVMTCwgMCwgMCwgMCwgMH0sCisgICAgewkiL3Vzci9iaW4vbmZzc3RhdCIsIE5VTEwsIFNDKDIpLCBOVUxMLCAwLCAwLCAwLCAwfSwKKyAgICB7CSIvdXNyL3VjYi9uZXRzdGF0IiwgIi1tIiwgU0MoLTEpLCBOVUxMLCAwLCAwLCAwLCAxICB9LAorICAgIHsJIi91c3IvYmluL25ldHN0YXQiLCAiLW0iLCBTQygtMSksIE5VTEwsIDAsIDAsIDAsIDEgIH0sCisgICAgewkiL3Vzci9zYmluL25ldHN0YXQiLCAiLW0iLCBTQygtMSksIE5VTEwsIDAsIDAsIDAsIDEgfSwKKyAgICB7CSIvdXNyL2V0Yy9uZXRzdGF0IiwgIi1tIiwgU0MoLTEpLCBOVUxMLCAwLCAwLCAwLCAwIH0sCisgICAgewkiL2Jpbi9uZXRzdGF0IiwgICAgICItaW4iLCBTQygtMSksIE5VTEwsIDAsIDAsIDAsIDEgfSwKKyAgICB7CSIvdXNyL3VjYi9uZXRzdGF0IiwgIi1pbiIsIFNDKC0xKSwgTlVMTCwgMCwgMCwgMCwgMSB9LAorICAgIHsJIi91c3IvYmluL25ldHN0YXQiLCAiLWluIiwgU0MoLTEpLCBOVUxMLCAwLCAwLCAwLCAxIH0sCisgICAgewkiL3Vzci9zYmluL25ldHN0YXQiLCAiLWluIiwgU0MoLTEpLCBOVUxMLCAwLCAwLCAwLCAxfSwKKyAgICB7CSIvdXNyL2V0Yy9uZXRzdGF0IiwgIi1pbiIsIFNDKC0xKSwgTlVMTCwgMCwgMCwgMCwgMH0sCisgICAgewkiL3Vzci9zYmluL3NubXBfcmVxdWVzdCIsICJsb2NhbGhvc3QgcHVibGljIGdldCAxLjMuNi4xLjIuMS43LjEuMCIsCisJCQkJICAgIFNDKC0xKSwgTlVMTCwgMCwgMCwgMCwgMCB9LCAvKiBVRFAgaW4gKi8KKyAgICB7CSIvdXNyL3NiaW4vc25tcF9yZXF1ZXN0IiwgImxvY2FsaG9zdCBwdWJsaWMgZ2V0IDEuMy42LjEuMi4xLjcuNC4wIiwKKwkJCQkgICAgU0MoLTEpLCBOVUxMLCAwLCAwLCAwLCAwIH0sICAvKiBVRFAgb3V0ICovCisgICAgewkiL3Vzci9zYmluL3NubXBfcmVxdWVzdCIsICJsb2NhbGhvc3QgcHVibGljIGdldCAxLjMuNi4xLjIuMS40LjMuMCIsCisJCQkJICAgIFNDKC0xKSwgTlVMTCwgMCwgMCwgMCwgMCB9LCAvKiBJUCA/ICovCisgICAgewkiL3Vzci9zYmluL3NubXBfcmVxdWVzdCIsICJsb2NhbGhvc3QgcHVibGljIGdldCAxLjMuNi4xLjIuMS42LjEwLjAiLAorCQkJCSAgICBTQygtMSksIE5VTEwsIDAsIDAsIDAsIDAgfSwgLyogVENQID8gKi8KKyAgICB7CSIvdXNyL3NiaW4vc25tcF9yZXF1ZXN0IiwgImxvY2FsaG9zdCBwdWJsaWMgZ2V0IDEuMy42LjEuMi4xLjYuMTEuMCIsCisJCQkJICAgIFNDKC0xKSwgTlVMTCwgMCwgMCwgMCwgMCB9LCAvKiBUQ1AgPyAqLworICAgIHsJIi91c3Ivc2Jpbi9zbm1wX3JlcXVlc3QiLCAibG9jYWxob3N0IHB1YmxpYyBnZXQgMS4zLjYuMS4yLjEuNi4xMy4wIiwKKwkJCQkgICAgU0MoLTEpLCBOVUxMLCAwLCAwLCAwLCAwIH0sIC8qIFRDUCA/ICovCisgICAgewkiL3Vzci9iaW4vbXBzdGF0IiwgTlVMTCwgU0MoMSksIE5VTEwsIDAsIDAsIDAsIDAgICAgIH0sCisgICAgewkiL3Vzci9iaW4vdyIsIE5VTEwsIFNDKDEpLCBOVUxMLCAwLCAwLCAwLCAxICAgICAgICAgICB9LAorICAgIHsJIi91c3IvYnNkL3ciLCBOVUxMLCBTQygxKSwgTlVMTCwgMCwgMCwgMCwgMCAgICAgICAgICB9LAorICAgIHsJIi91c3IvYmluL2RmIiwgTlVMTCwgU0MoMSksIE5VTEwsIDAsIDAsIDAsIDEgICAgICAgICAgfSwKKyAgICB7CSIvYmluL2RmIiwgTlVMTCwgU0MoMSksIE5VTEwsIDAsIDAsIDAsIDAgICAgICAgICAgICAgfSwKKyAgICB7CSIvdXNyL3NiaW4vcG9ydHN0YXQiLCBOVUxMLCBTQygxKSwgTlVMTCwgMCwgMCwgMCwgMCAgfSwKKyAgICB7CSIvdXNyL2Jpbi9pb3N0YXQiLCBOVUxMLCBTQyhTQ18wKSwgTlVMTCwgMCwgMCwgMCwgMCAgfSwKKyAgICB7CSIvdXNyL2Jpbi91cHRpbWUiLCBOVUxMLCBTQyhTQ18wKSwgTlVMTCwgMCwgMCwgMCwgMSAgIH0sCisgICAgewkiL3Vzci9ic2QvdXB0aW1lIiwgTlVMTCwgU0MoU0NfMCksIE5VTEwsIDAsIDAsIDAsIDAgIH0sCisgICAgewkiL2Jpbi92bXN0YXQiLCAiLWYiLCBTQyhTQ18wKSwgTlVMTCwgMCwgMCwgMCwgMSAgICAgICB9LAorICAgIHsJIi91c3IvYmluL3Ztc3RhdCIsICItZiIsIFNDKFNDXzApLCBOVUxMLCAwLCAwLCAwLCAwICB9LAorICAgIHsJIi9iaW4vdm1zdGF0IiwgTlVMTCwgU0MoU0NfMCksIE5VTEwsIDAsIDAsIDAsIDEgICAgICAgfSwKKyAgICB7CSIvdXNyL2Jpbi92bXN0YXQiLCBOVUxMLCBTQyhTQ18wKSwgTlVMTCwgMCwgMCwgMCwgMCAgfSwKKyAgICB7CSIvdXNyL3VjYi9uZXRzdGF0IiwgIi1uIiwgU0MoMC41KSwgTlVMTCwgMCwgMCwgMCwgMSAgIH0sCisgICAgewkiL3Vzci9iaW4vbmV0c3RhdCIsICItbiIsIFNDKDAuNSksIE5VTEwsIDAsIDAsIDAsIDEgICB9LAorICAgIHsJIi91c3Ivc2Jpbi9uZXRzdGF0IiwgIi1uIiwgU0MoMC41KSwgTlVMTCwgMCwgMCwgMCwgMSAgfSwKKyAgICB7CSIvdXNyL2V0Yy9uZXRzdGF0IiwgIi1uIiwgU0MoMC41KSwgTlVMTCwgMCwgMCwgMCwgMCAgfSwKKyNpZiBkZWZpbmVkKCBfX3NnaSApIHx8IGRlZmluZWQoIF9faHB1eCApCisgICAgewkiL2Jpbi9wcyIsICItZWwiLCBTQygwLjMpLCBOVUxMLCAwLCAwLCAwLCAxICAgICAgICAgICB9LAorI2VuZGlmCQkJCS8qIF9fc2dpIHx8IF9faHB1eCAqLworICAgIHsJIi91c3IvdWNiL3BzIiwgImF1eCIsIFNDKDAuMyksIE5VTEwsIDAsIDAsIDAsIDEgICAgICAgfSwKKyAgICB7CSIvdXNyL2Jpbi9wcyIsICJhdXgiLCBTQygwLjMpLCBOVUxMLCAwLCAwLCAwLCAxICAgICAgIH0sCisgICAgewkiL2Jpbi9wcyIsICJhdXgiLCBTQygwLjMpLCBOVUxMLCAwLCAwLCAwLCAwICAgICAgICAgIH0sCisgICAgeyAgICIvYmluL3BzIiwgIi1BIiwgU0MoMC4zKSwgTlVMTCwgMCwgMCwgMCwgMCAgICAgICAgICAgfSwgLypRTlgqLworICAgIHsJIi91c3IvYmluL2lwY3MiLCAiLWEiLCBTQygwLjUpLCBOVUxMLCAwLCAwLCAwLCAxICAgICAgfSwKKyAgICB7CSIvYmluL2lwY3MiLCAiLWEiLCBTQygwLjUpLCBOVUxMLCAwLCAwLCAwLCAwICAgICAgICAgfSwKKyAgICAvKiBVbnJlbGlhYmxlIHNvdXJjZSwgZGVwZW5kcyBvbiBzeXN0ZW0gdXNhZ2UgKi8KKyAgICB7CSIvZXRjL3BzdGF0IiwgIi1wIiwgU0MoMC41KSwgTlVMTCwgMCwgMCwgMCwgMSAgICAgICAgIH0sCisgICAgewkiL2Jpbi9wc3RhdCIsICItcCIsIFNDKDAuNSksIE5VTEwsIDAsIDAsIDAsIDAgICAgICAgIH0sCisgICAgewkiL2V0Yy9wc3RhdCIsICItUyIsIFNDKDAuMiksIE5VTEwsIDAsIDAsIDAsIDEgICAgICAgICB9LAorICAgIHsJIi9iaW4vcHN0YXQiLCAiLVMiLCBTQygwLjIpLCBOVUxMLCAwLCAwLCAwLCAwICAgICAgICB9LAorICAgIHsJIi9ldGMvcHN0YXQiLCAiLXYiLCBTQygwLjIpLCBOVUxMLCAwLCAwLCAwLCAxICAgICAgICAgfSwKKyAgICB7CSIvYmluL3BzdGF0IiwgIi12IiwgU0MoMC4yKSwgTlVMTCwgMCwgMCwgMCwgMCAgICAgICAgfSwKKyAgICB7CSIvZXRjL3BzdGF0IiwgIi14IiwgU0MoMC4yKSwgTlVMTCwgMCwgMCwgMCwgMSAgICAgICAgIH0sCisgICAgewkiL2Jpbi9wc3RhdCIsICIteCIsIFNDKDAuMiksIE5VTEwsIDAsIDAsIDAsIDAgICAgICAgIH0sCisgICAgewkiL2V0Yy9wc3RhdCIsICItdCIsIFNDKDAuMSksIE5VTEwsIDAsIDAsIDAsIDEgICAgICAgICB9LAorICAgIHsJIi9iaW4vcHN0YXQiLCAiLXQiLCBTQygwLjEpLCBOVUxMLCAwLCAwLCAwLCAwICAgICAgICB9LAorICAgIC8qIHBzdGF0IGlzIHlvdXIgZnJpZW5kICovCisgICAgewkiL3Vzci9iaW4vbGFzdCIsICItbiA1MCIsIFNDKDAuMyksIE5VTEwsIDAsIDAsIDAsIDEgICB9LAorI2lmZGVmIF9fc2dpCisgICAgewkiL3Vzci9ic2QvbGFzdCIsICItNTAiLCBTQygwLjMpLCBOVUxMLCAwLCAwLCAwLCAwICAgIH0sCisjZW5kaWYJCQkJLyogX19zZ2kgKi8KKyNpZmRlZiBfX2hwdXgKKyAgICB7CSIvZXRjL2xhc3QiLCAiLTUwIiwgU0MoMC4zKSwgTlVMTCwgMCwgMCwgMCwgMCAgICAgICAgfSwKKyNlbmRpZgkJCQkvKiBfX2hwdXggKi8KKyAgICB7CSIvdXNyL2JzZC9sYXN0IiwgIi1uIDUwIiwgU0MoMC4zKSwgTlVMTCwgMCwgMCwgMCwgMCAgfSwKKyAgICB7CSIvdXNyL3NiaW4vc25tcF9yZXF1ZXN0IiwgImxvY2FsaG9zdCBwdWJsaWMgZ2V0IDEuMy42LjEuMi4xLjUuMS4wIiwKKwkJCQlTQygwLjEpLCBOVUxMLCAwLCAwLCAwLCAwIH0sIC8qIElDTVAgPyAqLworICAgIHsJIi91c3Ivc2Jpbi9zbm1wX3JlcXVlc3QiLCAibG9jYWxob3N0IHB1YmxpYyBnZXQgMS4zLjYuMS4yLjEuNS4zLjAiLAorCQkJCVNDKDAuMSksIE5VTEwsIDAsIDAsIDAsIDAgfSwgLyogSUNNUCA/ICovCisgICAgewkiL2V0Yy9hcnAiLCAiLWEiLCBTQygwLjEpLCBOVUxMLCAwLCAwLCAwLCAxICB9LAorICAgIHsJIi91c3IvZXRjL2FycCIsICItYSIsIFNDKDAuMSksIE5VTEwsIDAsIDAsIDAsIDEgIH0sCisgICAgewkiL3Vzci9iaW4vYXJwIiwgIi1hIiwgU0MoMC4xKSwgTlVMTCwgMCwgMCwgMCwgMSAgfSwKKyAgICB7CSIvdXNyL3NiaW4vYXJwIiwgIi1hIiwgU0MoMC4xKSwgTlVMTCwgMCwgMCwgMCwgMCB9LAorICAgIHsJIi91c3Ivc2Jpbi9yaXBxdWVyeSIsICItbncgMSAxMjcuMC4wLjEiLAorCQkJCVNDKDAuMSksIE5VTEwsIDAsIDAsIDAsIDAgfSwKKyAgICB7CSIvYmluL2xwc3RhdCIsICItdCIsIFNDKDAuMSksIE5VTEwsIDAsIDAsIDAsIDEgICAgIH0sCisgICAgewkiL3Vzci9iaW4vbHBzdGF0IiwgIi10IiwgU0MoMC4xKSwgTlVMTCwgMCwgMCwgMCwgMSB9LAorICAgIHsJIi91c3IvdWNiL2xwc3RhdCIsICItdCIsIFNDKDAuMSksIE5VTEwsIDAsIDAsIDAsIDAgfSwKKyAgICB7CSIvdXNyL2Jpbi90Y3BkdW1wIiwgIi1jIDUgLWVmdnZ4IiwgU0MoMSksIE5VTEwsIDAsIDAsIDAsIDAgfSwKKyAgICAvKiBUaGlzIGlzIHZlcnkgZW52aXJvbm1lbnQtZGVwZW5kYW50LiAgSWYgbmV0d29yayB0cmFmZmljIGlzIGxvdywgaXQnbGwKKyAgICAgKiBwcm9iYWJseSB0aW1lIG91dCBiZWZvcmUgZGVsaXZlcmluZyA1IHBhY2tldHMsIHdoaWNoIGlzIE9LIGJlY2F1c2UKKyAgICAgKiBpdCdsbCBwcm9iYWJseSBiZSBmaXhlZCBzdHVmZiBsaWtlIEFSUCBhbnl3YXkgKi8KKyAgICB7CSIvdXNyL3NiaW4vYWR2ZnNzdGF0IiwgIi1iIHVzcl9kb21haW4iLAorCQkJCVNDKFNDXzApLCBOVUxMLCAwLCAwLCAwLCAwfSwKKyAgICB7CSIvdXNyL3NiaW4vYWR2ZnNzdGF0IiwgIi1sIDIgdXNyX2RvbWFpbiIsCisJCQkJU0MoMC41KSwgTlVMTCwgMCwgMCwgMCwgMH0sCisgICAgewkiL3Vzci9zYmluL2FkdmZzc3RhdCIsICItcCB1c3JfZG9tYWluIiwKKwkJCQlTQyhTQ18wKSwgTlVMTCwgMCwgMCwgMCwgMH0sCisgICAgLyogVGhpcyBpcyBhIGNvbXBsZXggYW5kIHNjcmV3YmFsbCBwcm9ncmFtLiAgU29tZSBzeXN0ZW1zIGhhdmUgdGhpbmdzCisgICAgICogbGlrZSByWF9kbW4sIHggPSBpbnRlZ2VyLCBmb3IgUkFJRCBzeXN0ZW1zLCBidXQgdGhlIHN0YXRpc3RpY3MgYXJlCisgICAgICogcHJldHR5IGRvZGd5ICovCisjaWZkZWYgX19RTlhOVE9fXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB7ICIvYmluL3BpZGluIiwgIi1GJUElQiVjJWQlRSVJJUolSyVtJU0lbiVOJXAlUCVTJXMlVCIsIFNDKDAuMyksCisgICAgICAgICAgICAgTlVMTCwgMCwgMCwgMCwgMCAgICAgICB9LAorI2VuZGlmICAgICAKKyNpZiAwCisgICAgLyogVGhlIGZvbGxvd2luZyBhcmVuJ3QgZW5hYmxlZCBzaW5jZSB0aGV5J3JlIHNvbWV3aGF0IHNsb3cgYW5kIG5vdCB2ZXJ5CisgICAgICogdW5wcmVkaWN0YWJsZSwgaG93ZXZlciB0aGV5IGdpdmUgYW4gaW5kaWNhdGlvbiBvZiB0aGUgc29ydCBvZiBzb3VyY2VzCisgICAgICogeW91IGNhbiB1c2UgKGZvciBleGFtcGxlIHRoZSBmaW5nZXIgbWlnaHQgYmUgbW9yZSB1c2VmdWwgb24gYQorICAgICAqIGZpcmV3YWxsZWQgaW50ZXJuYWwgbmV0d29yaykgKi8KKyAgICB7CSIvdXNyL2Jpbi9maW5nZXIiLCAiQG1sLm1lZGlhLm1pdC5lZHUiLCBTQygwLjkpLCBOVUxMLCAwLCAwLCAwLCAwIH0sCisgICAgewkiL3Vzci9sb2NhbC9iaW4vd2dldCIsICItTyAtIGh0dHA6Ly9sYXZhcmFuZC5zZ2kuY29tL2Jsb2NrLmh0bWwiLAorCQkJCVNDKDAuOSksIE5VTEwsIDAsIDAsIDAsIDAgfSwKKyAgICB7CSIvYmluL2NhdCIsICIvdXNyL3Nwb29sL21xdWV1ZS9zeXNsb2ciLCBTQygwLjkpLCBOVUxMLCAwLCAwLCAwLCAwIH0sCisjZW5kaWYJCQkJLyogMCAqLworICAgIHsJTlVMTCwgTlVMTCwgMCwgTlVMTCwgMCwgMCwgMCwgMCB9Cit9OworCitzdGF0aWMgYnl0ZSAqZ2F0aGVyX2J1ZmZlcjsJICAgIC8qIGJ1ZmZlciBmb3IgZ2F0aGVyaW5nIHJhbmRvbSBub2lzZSAqLworc3RhdGljIGludCBnYXRoZXJfYnVmZmVyX3NpemU7CSAgICAvKiBzaXplIG9mIHRoZSBtZW1vcnkgYnVmZmVyICovCitzdGF0aWMgdWlkX3QgZ2F0aGVyZXJfdWlkOworCisvKiBUaGUgbWVzc2FnZSBzdHJ1Y3R1cmUgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBwYXJlbnQgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgIHVzZWZ1bG5lc3M7CS8qIHVzZWZ1bG5lc3Mgb2YgZGF0YSAqLworICAgIGludCAgbmRhdGE7IAkvKiB2YWxpZCBieXRlcyBpbiBkYXRhICovCisgICAgY2hhciBkYXRhWzUwMF07CS8qIGdhdGhlcmVkIGRhdGEgKi8KK30gR0FUSEVSX01TRzsKKworI2lmbmRlZiBIQVZFX1dBSVRQSUQKK3N0YXRpYyBwaWRfdAord2FpdHBpZChwaWRfdCBwaWQsIGludCAqc3RhdHB0ciwgaW50IG9wdGlvbnMpCit7CisjaWZkZWYgSEFWRV9XQUlUNAorCXJldHVybiB3YWl0NChwaWQsIHN0YXRwdHIsIG9wdGlvbnMsIE5VTEwpOworI2Vsc2UKKwkvKiBJZiB3YWl0NCBpcyBhbHNvIG5vdCBhdmFpbGFibGUsIHRyeSB3YWl0MyBmb3IgU1ZSMyB2YXJpYW50cyAqLworCS8qIExlc3MgaWRlYWwgYmVjYXVzZSBjYW4ndCBhY3R1YWxseSByZXF1ZXN0IGEgc3BlY2lmaWMgcGlkICovCisJLyogRm9yIHRoYXQgcmVhc29uLCBmaXJzdCBjaGVjayB0byBzZWUgaWYgcGlkIGlzIGZvciBhbiAqLworCS8qICAgZXhpc3RpbmcgcHJvY2Vzcy4gKi8KKwlpbnQgdG1wX3BpZCwgZHVtbXlzdGF0OzsKKwlpZiAoa2lsbChwaWQsIDApID09IC0xKSB7CisJCWVycm5vID0gRUNISUxEOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChzdGF0cHRyID09IE5VTEwpCisJCXN0YXRwdHIgPSAmZHVtbXlzdGF0OworCXdoaWxlICgoKHRtcF9waWQgPSB3YWl0MyhzdGF0cHRyLCBvcHRpb25zLCAwKSkgIT0gcGlkKSAmJgorCQkgICAgKHRtcF9waWQgIT0gLTEpICYmICh0bXBfcGlkICE9IDApICYmIChwaWQgIT0gLTEpKQorCSAgICA7CisJcmV0dXJuIHRtcF9waWQ7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKiBVbmRlciBTdW5PUyBwb3BlbigpIGRvZXNuJ3QgcmVjb3JkIHRoZSBwaWQgb2YgdGhlIGNoaWxkIHByb2Nlc3MuICBXaGVuCisgKiBwY2xvc2UoKSBpcyBjYWxsZWQsIGluc3RlYWQgb2YgY2FsbGluZyB3YWl0cGlkKCkgZm9yIHRoZSBjb3JyZWN0IGNoaWxkLCBpdAorICogY2FsbHMgd2FpdCgpIHJlcGVhdGVkbHkgdW50aWwgdGhlIHJpZ2h0IGNoaWxkIGlzIHJlYXBlZC4gIFRoZSBwcm9ibGVtIGlzCisgKiB0aGF0IHRoaXMgcmVhcHMgYW55IG90aGVyIGNoaWxkcmVuIHRoYXQgaGFwcGVuIHRvIGhhdmUgZGllZCBhdCB0aGF0CisgKiBtb21lbnQsIGFuZCB3aGVuIHRoZWlyIHBjbG9zZSgpIGNvbWVzIGFsb25nLCB0aGUgcHJvY2VzcyBoYW5ncyBmb3JldmVyLgorICogVGhlIGZpeCBpcyB0byB1c2UgYSB3cmFwcGVyIGZvciBwb3BlbigpL3BjbG9zZSgpIHdoaWNoIHNhdmVzIHRoZSBwaWQgaW4KKyAqIHRoZSBkYXRhU291cmNlcyBzdHJ1Y3R1cmUgKGNvZGUgYWRhcHRlZCBmcm9tIEdOVS1saWJjJ3MgcG9wZW4oKSBjYWxsKS4KKyAqCisgKiBBdXQgdmlhbSBpbnZlbmlhbSBhdXQgZmFjaWFtICovCisKK3N0YXRpYyBGSUxFICoKK215X3BvcGVuKHN0cnVjdCBSSSAqZW50cnkpCit7CisgICAgaW50IHBpcGVkZXNbMl07CisgICAgRklMRSAqc3RyZWFtOworCisgICAgLyogQ3JlYXRlIHRoZSBwaXBlICovCisgICAgaWYgKHBpcGUocGlwZWRlcykgPCAwKQorCXJldHVybiAoTlVMTCk7CisKKyAgICAvKiBGb3JrIG9mZiB0aGUgY2hpbGQgKCJ2Zm9yaygpIGlzIGxpa2UgYW4gT1Mgb3JnYXNtLiAgQWxsIE9TJ3Mgd2FudCB0bworICAgICAqIGRvIGl0LCBidXQgbW9zdCBqdXN0IGVuZCB1cCBmYWtpbmcgaXQiIC0gQ2hyaXMgV2VkZ3dvb2QpLiAgSWYgeW91ciBPUworICAgICAqIHN1cHBvcnRzIGl0LCB5b3Ugc2hvdWxkIHRyeSB0byB1c2UgdmZvcmsoKSBoZXJlIGJlY2F1c2UgaXQncyBzb21ld2hhdAorICAgICAqIG1vcmUgZWZmaWNpZW50ICovCisjaWYgZGVmaW5lZCggc3VuICkgfHwgZGVmaW5lZCggX191bHRyaXhfXyApIHx8IGRlZmluZWQoIF9fb3NmX18gKSB8fCBcCisJZGVmaW5lZChfX2hwdXgpCisgICAgZW50cnktPnBpZCA9IHZmb3JrKCk7CisjZWxzZQkJCQkvKiAgKi8KKyAgICBlbnRyeS0+cGlkID0gZm9yaygpOworI2VuZGlmCQkJCS8qIFVuaXhlbiB3aGljaCBoYXZlIHZmb3JrKCkgKi8KKyAgICBpZiAoZW50cnktPnBpZCA9PSAocGlkX3QpIC0gMSkgeworCS8qIFRoZSBmb3JrIGZhaWxlZCAqLworCWNsb3NlKHBpcGVkZXNbMF0pOworCWNsb3NlKHBpcGVkZXNbMV0pOworCXJldHVybiAoTlVMTCk7CisgICAgfQorCisgICAgaWYgKGVudHJ5LT5waWQgPT0gKHBpZF90KSAwKSB7CisJc3RydWN0IHBhc3N3ZCAqcGFzc3dkOworCisJLyogV2UgYXJlIHRoZSBjaGlsZC4gIE1ha2UgdGhlIHJlYWQgc2lkZSBvZiB0aGUgcGlwZSBiZSBzdGRvdXQgKi8KKwlpZiAoZHVwMihwaXBlZGVzW1NURE9VVF9GSUxFTk9dLCBTVERPVVRfRklMRU5PKSA8IDApCisJICAgIGV4aXQoMTI3KTsKKworCS8qIE5vdyB0aGF0IGV2ZXJ5dGhpbmcgaXMgc2V0IHVwLCBnaXZlIHVwIG91ciBwZXJtaXNzaW9ucyB0byBtYWtlCisJICogc3VyZSB3ZSBkb24ndCByZWFkIGFueXRoaW5nIHNlbnNpdGl2ZS4gIElmIHRoZSBnZXRwd25hbSgpIGZhaWxzLAorCSAqIHdlIGRlZmF1bHQgdG8gLTEsIHdoaWNoIGlzIHVzdWFsbHkgbm9ib2R5ICovCisJaWYgKGdhdGhlcmVyX3VpZCA9PSAodWlkX3QpLTEgJiYgXAorCSAgICAocGFzc3dkID0gZ2V0cHduYW0oIm5vYm9keSIpKSAhPSBOVUxMKQorCSAgICBnYXRoZXJlcl91aWQgPSBwYXNzd2QtPnB3X3VpZDsKKworCXNldHVpZChnYXRoZXJlcl91aWQpOworCisJLyogQ2xvc2UgdGhlIHBpcGUgZGVzY3JpcHRvcnMgKi8KKwljbG9zZShwaXBlZGVzW1NURElOX0ZJTEVOT10pOworCWNsb3NlKHBpcGVkZXNbU1RET1VUX0ZJTEVOT10pOworCisJLyogVHJ5IGFuZCBleGVjIHRoZSBwcm9ncmFtICovCisJZXhlY2woZW50cnktPnBhdGgsIGVudHJ5LT5wYXRoLCBlbnRyeS0+YXJnLCBOVUxMKTsKKworCS8qIERpZSBpZiB0aGUgZXhlYyBmYWlsZWQgKi8KKwlleGl0KDEyNyk7CisgICAgfQorCisgICAgLyogV2UgYXJlIHRoZSBwYXJlbnQuICBDbG9zZSB0aGUgaXJyZWxldmFudCBzaWRlIG9mIHRoZSBwaXBlIGFuZCBvcGVuCisgICAgICogdGhlIHJlbGV2YW50IHNpZGUgYXMgYSBuZXcgc3RyZWFtLiAgTWFyayBvdXIgc2lkZSBvZiB0aGUgcGlwZSB0bworICAgICAqIGNsb3NlIG9uIGV4ZWMsIHNvIG5ldyBjaGlsZHJlbiB3b24ndCBzZWUgaXQgKi8KKyAgICBjbG9zZShwaXBlZGVzW1NURE9VVF9GSUxFTk9dKTsKKworI2lmZGVmIEZEX0NMT0VYRUMKKyAgICBmY250bChwaXBlZGVzW1NURElOX0ZJTEVOT10sIEZfU0VURkQsIEZEX0NMT0VYRUMpOworI2VuZGlmCisKKyAgICBzdHJlYW0gPSBmZG9wZW4ocGlwZWRlc1tTVERJTl9GSUxFTk9dLCAiciIpOworCisgICAgaWYgKHN0cmVhbSA9PSBOVUxMKSB7CisJaW50IHNhdmVkRXJybm8gPSBlcnJubzsKKworCS8qIFRoZSBzdHJlYW0gY291bGRuJ3QgYmUgb3BlbmVkIG9yIHRoZSBjaGlsZCBzdHJ1Y3R1cmUgY291bGRuJ3QgYmUKKwkgKiBhbGxvY2F0ZWQuICBLaWxsIHRoZSBjaGlsZCBhbmQgY2xvc2UgdGhlIG90aGVyIHNpZGUgb2YgdGhlIHBpcGUgKi8KKwlraWxsKGVudHJ5LT5waWQsIFNJR0tJTEwpOworCWlmIChzdHJlYW0gPT0gTlVMTCkKKwkgICAgY2xvc2UocGlwZWRlc1tTVERPVVRfRklMRU5PXSk7CisJZWxzZQorCSAgICBmY2xvc2Uoc3RyZWFtKTsKKworCXdhaXRwaWQoZW50cnktPnBpZCwgTlVMTCwgMCk7CisKKwllbnRyeS0+cGlkID0gMDsKKwllcnJubyA9IHNhdmVkRXJybm87CisJcmV0dXJuIChOVUxMKTsKKyAgICB9CisKKyAgICByZXR1cm4gKHN0cmVhbSk7Cit9CisKK3N0YXRpYyBpbnQKK215X3BjbG9zZShzdHJ1Y3QgUkkgKmVudHJ5KQoreworICAgIGludCBzdGF0dXMgPSAwOworCisgICAgaWYgKGZjbG9zZShlbnRyeS0+cGlwZSkpCisJcmV0dXJuICgtMSk7CisKKyAgICAvKiBXZSBpZ25vcmUgdGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoZSBwcm9jZXNzIGJlY2F1c2Ugc29tZQorICAgICAgIHByb2dyYW1zIHJldHVybiBmdW5ueSB2YWx1ZXMgd2hpY2ggd291bGQgcmVzdWx0IGluIHRoZSBpbnB1dAorICAgICAgIGJlaW5nIGRpc2NhcmRlZCBldmVuIGlmIHRoZXkgZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5LiAgVGhpcyBpc24ndAorICAgICAgIGEgcHJvYmxlbSBiZWNhdXNlIHRoZSByZXN1bHQgZGF0YSBzaXplIHRocmVzaG9sZCB3aWxsIGZpbHRlcgorICAgICAgIG91dCBhbnkgcHJvZ3JhbXMgd2hpY2ggZXhpdCB3aXRoIGEgdXNhZ2UgbWVzc2FnZSB3aXRob3V0CisgICAgICAgcHJvZHVjaW5nIHVzZWZ1bCBvdXRwdXQuICAqLworICAgIGlmICh3YWl0cGlkKGVudHJ5LT5waWQsIE5VTEwsIDApICE9IGVudHJ5LT5waWQpCisJc3RhdHVzID0gLTE7CisKKyAgICBlbnRyeS0+cGlwZSA9IE5VTEw7CisgICAgZW50cnktPnBpZCA9IDA7CisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCisKKy8qIFVuaXggc2xvdyBwb2xsICh3aXRob3V0IHNwZWNpYWwgc3VwcG9ydCBmb3IgTGludXgpCisgKgorICogSWYgYSBmZXcgb2YgdGhlIHJhbmRvbW5lc3Mgc291cmNlcyBjcmVhdGUgYSBsYXJnZSBhbW91bnQgb2Ygb3V0cHV0IHRoZW4KKyAqIHRoZSBzbG93UG9sbCgpIHN0b3BzIG9uY2UgdGhlIGJ1ZmZlciBoYXMgYmVlbiBmaWxsZWQgKGJ1dCBiZWZvcmUgYWxsIHRoZQorICogcmFuZG9tbmVzcyBzb3VyY2VzIGhhdmUgYmVlbiBzdWNrZWQgZHJ5KSBzbyB0aGF0IHRoZSAndXNlZnVsbmVzcycgZmFjdG9yCisgKiByZW1haW5zIGJlbG93IHRoZSB0aHJlc2hvbGQuICBGb3IgdGhpcyByZWFzb24gdGhlIGdhdGhlcmVyIGJ1ZmZlciBoYXMgdG8KKyAqIGJlIGZhaXJseSBzaXplYWJsZSBvbiBtb2RlcmF0ZWx5IGxvYWRlZCBzeXN0ZW1zLiAgVGhpcyBpcyBzb21ldGhpbmcgb2YgYQorICogYnVnIHNpbmNlIHRoZSB1c2VmdWxuZXNzIHNob3VsZCBiZSBpbmZsdWVuY2VkIGJ5IHRoZSBhbW91bnQgb2Ygb3V0cHV0IGFzCisgKiB3ZWxsIGFzIHRoZSBzb3VyY2UgdHlwZSAqLworCisKK3N0YXRpYyBpbnQKK3Nsb3dfcG9sbChGSUxFICpkYmdmcCwgaW50IGRiZ2FsbCwgc2l6ZV90ICpuYnl0ZXMgKQoreworICAgIGludCBtb3JlU291cmNlczsKKyAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgICBmZF9zZXQgZmRzOworI2lmIGRlZmluZWQoIF9faHB1eCApCisgICAgc2l6ZV90IG1heEZEID0gMDsKKyNlbHNlCisgICAgaW50IG1heEZEID0gMDsKKyNlbmRpZiAvKiBPUy1zcGVjaWZpYyBicm9rZW5uZXNzICovCisgICAgaW50IGJ1ZlBvcywgaSwgdXNlZnVsbmVzcyA9IDA7CisKKworICAgIC8qIEZpcmUgdXAgZWFjaCByYW5kb21uZXNzIHNvdXJjZSAqLworICAgIEZEX1pFUk8oJmZkcyk7CisgICAgZm9yIChpID0gMDsgZGF0YVNvdXJjZXNbaV0ucGF0aCAhPSBOVUxMOyBpKyspIHsKKwkvKiBTaW5jZSBwb3BlbigpIGlzIGEgZmFpcmx5IGhlYXZ5IGZ1bmN0aW9uLCB3ZSBjaGVjayB0byBzZWUgd2hldGhlcgorCSAqIHRoZSBleGVjdXRhYmxlIGV4aXN0cyBiZWZvcmUgd2UgdHJ5IHRvIHJ1biBpdCAqLworCWlmIChhY2Nlc3MoZGF0YVNvdXJjZXNbaV0ucGF0aCwgWF9PSykpIHsKKwkgICAgaWYoIGRiZ2ZwICYmIGRiZ2FsbCApCisJCWZwcmludGYoZGJnZnAsICIlcyBub3QgcHJlc2VudCVzXG4iLCBkYXRhU291cmNlc1tpXS5wYXRoLAorCQkJICAgICAgIGRhdGFTb3VyY2VzW2ldLmhhc0FsdGVybmF0aXZlID8KKwkJCQkJIiwgaGFzIGFsdGVybmF0aXZlcyIgOiAiIik7CisJICAgIGRhdGFTb3VyY2VzW2ldLnBpcGUgPSBOVUxMOworCX0KKwllbHNlCisJICAgIGRhdGFTb3VyY2VzW2ldLnBpcGUgPSBteV9wb3BlbigmZGF0YVNvdXJjZXNbaV0pOworCisJaWYgKGRhdGFTb3VyY2VzW2ldLnBpcGUgIT0gTlVMTCkgeworCSAgICBkYXRhU291cmNlc1tpXS5waXBlRkQgPSBmaWxlbm8oZGF0YVNvdXJjZXNbaV0ucGlwZSk7CisJICAgIGlmIChkYXRhU291cmNlc1tpXS5waXBlRkQgPiBtYXhGRCkKKwkJbWF4RkQgPSBkYXRhU291cmNlc1tpXS5waXBlRkQ7CisKKyNpZmRlZiBPX05PTkJMT0NLIC8qIE9oaGggd2hhdCBhIGhhY2sgKHVzZWQgZm9yIEF0YXJpKSAqLworCSAgICBmY250bChkYXRhU291cmNlc1tpXS5waXBlRkQsIEZfU0VURkwsIE9fTk9OQkxPQ0spOworI2Vsc2UKKyNlcnJvciBPX05PTkJMT0NLIGlzIG1pc3NpbmcKKyNlbmRpZgorCisJICAgIEZEX1NFVChkYXRhU291cmNlc1tpXS5waXBlRkQsICZmZHMpOworCSAgICBkYXRhU291cmNlc1tpXS5sZW5ndGggPSAwOworCisJICAgIC8qIElmIHRoZXJlIGFyZSBhbHRlcm5hdGl2ZXMgZm9yIHRoaXMgY29tbWFuZCwgZG9uJ3QgdHJ5IGFuZAorCSAgICAgKiBleGVjdXRlIHRoZW0gKi8KKwkgICAgd2hpbGUgKGRhdGFTb3VyY2VzW2ldLmhhc0FsdGVybmF0aXZlKSB7CisJCWlmKCBkYmdmcCAmJiBkYmdhbGwgKQorCQkgICAgZnByaW50ZihkYmdmcCwgIlNraXBwaW5nICVzXG4iLCBkYXRhU291cmNlc1tpICsgMV0ucGF0aCk7CisJCWkrKzsKKwkgICAgfQorCX0KKyAgICB9CisKKworICAgIC8qIFN1Y2sgYWxsIHRoZSBkYXRhIHdlIGNhbiBnZXQgZnJvbSBlYWNoIG9mIHRoZSBzb3VyY2VzICovCisgICAgYnVmUG9zID0gMDsKKyAgICBtb3JlU291cmNlcyA9IDE7CisgICAgd2hpbGUgKG1vcmVTb3VyY2VzICYmIGJ1ZlBvcyA8PSBnYXRoZXJfYnVmZmVyX3NpemUpIHsKKwkvKiBXYWl0IGZvciBkYXRhIHRvIGJlY29tZSBhdmFpbGFibGUgZnJvbSBhbnkgb2YgdGhlIHNvdXJjZXMsIHdpdGggYQorCSAqIHRpbWVvdXQgb2YgMTAgc2Vjb25kcy4gIFRoaXMgYWRkcyBldmVuIG1vcmUgcmFuZG9tbmVzcyBzaW5jZSBkYXRhCisJICogYmVjb21lcyBhdmFpbGFibGUgaW4gYSBub25kZXRlcm1pbmlzdGljIGZhc2hpb24uICBLdWRvcyB0byBIUCdzIFFBCisJICogZGVwYXJ0bWVudCBmb3IgbWFuYWdpbmcgdG8gc2hpcCBhIHNlbGVjdCgpIHdoaWNoIGJyZWFrcyBpdHMgb3duCisJICogcHJvdG90eXBlICovCisJdHYudHZfc2VjID0gMTA7CisJdHYudHZfdXNlYyA9IDA7CisKKyNpZiBkZWZpbmVkKCBfX2hwdXggKSAmJiAoIE9TX1ZFUlNJT04gPT0gOSApCisJaWYgKHNlbGVjdChtYXhGRCArIDEsIChpbnQgKikmZmRzLCBOVUxMLCBOVUxMLCAmdHYpID09IC0xKQorI2Vsc2UgIC8qICAqLworCWlmIChzZWxlY3QobWF4RkQgKyAxLCAmZmRzLCBOVUxMLCBOVUxMLCAmdHYpID09IC0xKQorI2VuZGlmIC8qIF9faHB1eCAqLworCSAgICBicmVhazsKKworCS8qIE9uZSBvZiB0aGUgc291cmNlcyBoYXMgZGF0YSBhdmFpbGFibGUsIHJlYWQgaXQgaW50byB0aGUgYnVmZmVyICovCisJZm9yIChpID0gMDsgZGF0YVNvdXJjZXNbaV0ucGF0aCAhPSBOVUxMOyBpKyspIHsKKwkgICAgaWYoIGRhdGFTb3VyY2VzW2ldLnBpcGUgJiYgRkRfSVNTRVQoZGF0YVNvdXJjZXNbaV0ucGlwZUZELCAmZmRzKSkgeworCQlzaXplX3Qgbm9CeXRlczsKKworCQlpZiAoKG5vQnl0ZXMgPSBmcmVhZChnYXRoZXJfYnVmZmVyICsgYnVmUG9zLCAxLAorCQkJCSAgICAgZ2F0aGVyX2J1ZmZlcl9zaXplIC0gYnVmUG9zLAorCQkJCSAgICAgZGF0YVNvdXJjZXNbaV0ucGlwZSkpID09IDApIHsKKwkJICAgIGlmIChteV9wY2xvc2UoJmRhdGFTb3VyY2VzW2ldKSA9PSAwKSB7CisJCQlpbnQgdG90YWwgPSAwOworCisJCQkvKiBUcnkgYW5kIGVzdGltYXRlIGhvdyBtdWNoIGVudHJvcHkgd2UncmUgZ2V0dGluZworCQkJICogZnJvbSBhIGRhdGEgc291cmNlICovCisJCQlpZiAoZGF0YVNvdXJjZXNbaV0udXNlZnVsbmVzcykgeworCQkJICAgIGlmIChkYXRhU291cmNlc1tpXS51c2VmdWxuZXNzIDwgMCkKKwkJCQl0b3RhbCA9IChkYXRhU291cmNlc1tpXS5sZW5ndGggKyA5OTkpCisJCQkJCS8gLWRhdGFTb3VyY2VzW2ldLnVzZWZ1bG5lc3M7CisJCQkgICAgZWxzZQorCQkJCXRvdGFsID0gZGF0YVNvdXJjZXNbaV0ubGVuZ3RoCisJCQkJCS8gZGF0YVNvdXJjZXNbaV0udXNlZnVsbmVzczsKKwkJCX0KKwkJCWlmKCBkYmdmcCApCisJCQkgICAgZnByaW50ZihkYmdmcCwKKwkJCSAgICAgICAiJXMgJXMgY29udHJpYnV0ZWQgJWQgYnl0ZXMsICIKKwkJCSAgICAgICAidXNlZnVsbmVzcyA9ICVkXG4iLCBkYXRhU291cmNlc1tpXS5wYXRoLAorCQkJICAgICAgIChkYXRhU291cmNlc1tpXS5hcmcgIT0gTlVMTCkgPworCQkJCSAgICAgICBkYXRhU291cmNlc1tpXS5hcmcgOiAiIiwKKwkJCQkgICAgICBkYXRhU291cmNlc1tpXS5sZW5ndGgsIHRvdGFsKTsKKwkJCWlmKCBkYXRhU291cmNlc1tpXS5sZW5ndGggKQorCQkJICAgIHVzZWZ1bG5lc3MgKz0gdG90YWw7CisJCSAgICB9CisJCSAgICBkYXRhU291cmNlc1tpXS5waXBlID0gTlVMTDsKKwkJfQorCQllbHNlIHsKKwkJICAgIGludCBjdXJyUG9zID0gYnVmUG9zOworCQkgICAgaW50IGVuZFBvcyA9IGJ1ZlBvcyArIG5vQnl0ZXM7CisKKwkJICAgIC8qIFJ1bi1sZW5ndGggY29tcHJlc3MgdGhlIGlucHV0IGJ5dGUgc2VxdWVuY2UgKi8KKwkJICAgIHdoaWxlIChjdXJyUG9zIDwgZW5kUG9zKSB7CisJCQlpbnQgY2ggPSBnYXRoZXJfYnVmZmVyW2N1cnJQb3NdOworCisJCQkvKiBJZiBpdCdzIGEgc2luZ2xlIGJ5dGUsIGp1c3QgY29weSBpdCBvdmVyICovCisJCQlpZiAoY2ggIT0gZ2F0aGVyX2J1ZmZlcltjdXJyUG9zICsgMV0pIHsKKwkJCSAgICBnYXRoZXJfYnVmZmVyW2J1ZlBvcysrXSA9IGNoOworCQkJICAgIGN1cnJQb3MrKzsKKwkJCX0KKwkJCWVsc2UgeworCQkJICAgIGludCBjb3VudCA9IDA7CisKKwkJCSAgICAvKiBJdCdzIGEgcnVuIG9mIHJlcGVhdGVkIGJ5dGVzLCByZXBsYWNlIHRoZW0KKwkJCSAgICAgKiB3aXRoIHRoZSBieXRlIGNvdW50IG1vZCAyNTYgKi8KKwkJCSAgICB3aGlsZSAoKGNoID09IGdhdGhlcl9idWZmZXJbY3VyclBvc10pCisJCQkJICAgICYmIGN1cnJQb3MgPCBlbmRQb3MpIHsKKwkJCQljb3VudCsrOworCQkJCWN1cnJQb3MrKzsKKwkJCSAgICB9CisJCQkgICAgZ2F0aGVyX2J1ZmZlcltidWZQb3MrK10gPSBjb3VudDsKKwkJCSAgICBub0J5dGVzIC09IGNvdW50IC0gMTsKKwkJCX0KKwkJICAgIH0KKworCQkgICAgLyogUmVtZW1iZXIgdGhlIG51bWJlciBvZiAoY29tcHJlc3NlZCkgYnl0ZXMgb2YgaW5wdXQgd2UKKwkJICAgICAqIG9idGFpbmVkICovCisJCSAgICBkYXRhU291cmNlc1tpXS5sZW5ndGggKz0gbm9CeXRlczsKKwkJfQorCSAgICB9CisJfQorCisJLyogQ2hlY2sgaWYgdGhlcmUgaXMgbW9yZSBpbnB1dCBhdmFpbGFibGUgb24gYW55IG9mIHRoZSBzb3VyY2VzICovCisJbW9yZVNvdXJjZXMgPSAwOworCUZEX1pFUk8oJmZkcyk7CisJZm9yIChpID0gMDsgZGF0YVNvdXJjZXNbaV0ucGF0aCAhPSBOVUxMOyBpKyspIHsKKwkgICAgaWYgKGRhdGFTb3VyY2VzW2ldLnBpcGUgIT0gTlVMTCkgeworCQlGRF9TRVQoZGF0YVNvdXJjZXNbaV0ucGlwZUZELCAmZmRzKTsKKwkJbW9yZVNvdXJjZXMgPSAxOworCSAgICB9CisJfQorICAgIH0KKworICAgIGlmKCBkYmdmcCApIHsKKwlmcHJpbnRmKGRiZ2ZwLCAiR290ICVkIGJ5dGVzLCB1c2VmdWxuZXNzID0gJWRcbiIsIGJ1ZlBvcywgdXNlZnVsbmVzcyk7CisJZmZsdXNoKGRiZ2ZwKTsKKyAgICB9CisgICAgKm5ieXRlcyA9IGJ1ZlBvczsKKyAgICByZXR1cm4gdXNlZnVsbmVzczsKK30KKworLyoqKioqKioqKioqKioqKioKKyAqIFN0YXJ0IHRoZSBnYXRoZXJlciBwcm9jZXNzIHdoaWNoIHdyaXRlcyBtZXNzYWdlcyBvZgorICogdHlwZSBHQVRIRVJFUl9NU0cgdG8gcGlwZWRlcworICovCitzdGF0aWMgdm9pZAorc3RhcnRfZ2F0aGVyZXIoIGludCBwaXBlZmQgKQoreworICAgIEZJTEUgKmRiZ2ZwID0gTlVMTDsKKyAgICBpbnQgZGJnYWxsOworCisgICAgeworCWNvbnN0IGNoYXIgKnMgPSBnZXRlbnYoIkdOVVBHX1JORFVOSVhfREJHIik7CisJaWYoIHMgKSB7CisJICAgIGRiZ2ZwID0gKCpzPT0nLScgJiYgIXNbMV0pPyBzdGRvdXQgOiBmb3BlbihzLCAiYSIpOworCSAgICBpZiggIWRiZ2ZwICkKKwkJbG9nX2luZm8oImNhbid0IG9wZW4gZGVidWcgZmlsZSBgJXMnOiAlc1xuIiwKKwkJCSAgICAgcywgc3RyZXJyb3IoZXJybm8pICk7CisJICAgIGVsc2UKKwkJZnByaW50ZihkYmdmcCwiXG5TVEFSVCBSTkRVTklYIERFQlVHIHBpZD0lZFxuIiwgKGludClnZXRwaWQoKSk7CisJfQorCWRiZ2FsbCA9ICEhZ2V0ZW52KCJHTlVQR19STkRVTklYX0RCR0FMTCIpOworICAgIH0KKyAgICAvKiBjbG9zZSBhbGwgZmlsZXMgYnV0IHRoZSBvbmVzIHdlIG5lZWQgKi8KKyAgICB7CWludCBubWF4LCBuMSwgbjIsIGk7CisjaWZkZWYgX1NDX09QRU5fTUFYCisJaWYoIChubWF4PXN5c2NvbmYoIF9TQ19PUEVOX01BWCApKSA8IDAgKSB7CisjaWZkZWYgX1BPU0lYX09QRU5fTUFYCisJICAgIG5tYXggPSBfUE9TSVhfT1BFTl9NQVg7CisjZWxzZQorCSAgICBubWF4ID0gMjA7IC8qIGFzc3VtZSBhIHJlYXNvbmFibGUgdmFsdWUgKi8KKyNlbmRpZgorCX0KKyNlbHNlIC8qIV9TQ19PUEVOX01BWCovCisJbm1heCA9IDIwOyAvKiBhc3N1bWUgYSByZWFzb25hYmxlIHZhbHVlICovCisjZW5kaWYgLyohX1NDX09QRU5fTUFYKi8KKwluMSA9IGZpbGVubyggc3RkZXJyICk7CisJbjIgPSBkYmdmcD8gZmlsZW5vKCBkYmdmcCApIDogLTE7CisJZm9yKGk9MDsgaSA8IG5tYXg7IGkrKyApIHsKKwkgICAgaWYoIGkgIT0gbjEgJiYgaSAhPSBuMiAmJiBpICE9IHBpcGVmZCApCisJCWNsb3NlKGkpOworCX0KKwllcnJubyA9IDA7CisgICAgfQorCisKKyAgICAvKiBTZXQgdXAgdGhlIGJ1ZmZlci4gIE5vdCBldGhhdCB3ZSB1c2UgYSBwbGFpbiBzdGFuZGFyZCBtYWxsb2MgaGVyZS4gKi8KKyAgICBnYXRoZXJfYnVmZmVyX3NpemUgPSBHQVRIRVJfQlVGU0laRTsKKyAgICBnYXRoZXJfYnVmZmVyID0gbWFsbG9jKCBnYXRoZXJfYnVmZmVyX3NpemUgKTsKKyAgICBpZiggIWdhdGhlcl9idWZmZXIgKSB7CisJbG9nX2Vycm9yKCJvdXQgb2YgY29yZSB3aGlsZSBhbGxvY2F0aW5nIHRoZSBnYXRoZXJlciBidWZmZXJcbiIpOworCWV4aXQoMik7CisgICAgfQorCisgICAgLyogUmVzZXQgdGhlIFNJR0MoSClMRCBoYW5kbGVyIHRvIHRoZSBzeXN0ZW0gZGVmYXVsdC4gIFRoaXMgaXMgbmVjZXNzYXJ5CisgICAgICogYmVjYXVzZSBpZiB0aGUgcHJvZ3JhbSB3aGljaCBjcnlwdGxpYiBpcyBhIHBhcnQgb2YgaW5zdGFsbHMgaXRzIG93bgorICAgICAqIFNJR0MoSClMRCBoYW5kbGVyLCBpdCB3aWxsIGVuZCB1cCByZWFwaW5nIHRoZSBjcnlwdGxpYiBjaGlsZHJlbiBiZWZvcmUKKyAgICAgKiBjcnlwdGxpYiBjYW4uICBBcyBhIHJlc3VsdCwgbXlfcGNsb3NlKCkgd2lsbCBjYWxsIHdhaXRwaWQoKSBvbiBhCisgICAgICogcHJvY2VzcyB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIHJlYXBlZCBieSB0aGUgaW5zdGFsbGVkIGhhbmRsZXIgYW5kCisgICAgICogcmV0dXJuIGFuIGVycm9yLCBzbyB0aGUgcmVhZCBkYXRhIHdvbid0IGJlIGFkZGVkIHRvIHRoZSByYW5kb21uZXNzCisgICAgICogcG9vbC4gIFRoZXJlIGFyZSB0d28gdHlwZXMgb2YgU0lHQyhIKUxEIG5hbWluZywgdGhlIFN5c1YgU0lHQ0xEIGFuZAorICAgICAqIHRoZSBCU0QvUG9zaXggU0lHQ0hMRCwgc28gd2UgbmVlZCB0byBoYW5kbGUgZWl0aGVyIHBvc3NpYmlsaXR5ICovCisjaWZkZWYgU0lHQ0xECisgICAgc2lnbmFsKFNJR0NMRCwgU0lHX0RGTCk7CisjZWxzZQorICAgIHNpZ25hbChTSUdDSExELCBTSUdfREZMKTsKKyNlbmRpZgorCisgICAgZmNsb3NlKHN0ZGVycik7CQkvKiBBcnJnaGghISAgSXQncyBTdHVhcnQgY29kZSEhICovCisKKyAgICBmb3IoOzspIHsKKwlHQVRIRVJfTVNHIG1zZzsKKwlzaXplX3QgbmJ5dGVzOworCWNvbnN0IGNoYXIgKnA7CisKKwltc2cudXNlZnVsbmVzcyA9IHNsb3dfcG9sbCggZGJnZnAsIGRiZ2FsbCwgJm5ieXRlcyApOworCXAgPSBnYXRoZXJfYnVmZmVyOworCXdoaWxlKCBuYnl0ZXMgKSB7CisJICAgIG1zZy5uZGF0YSA9IG5ieXRlcyA+IHNpemVvZihtc2cuZGF0YSk/IHNpemVvZihtc2cuZGF0YSkgOiBuYnl0ZXM7CisJICAgIG1lbWNweSggbXNnLmRhdGEsIHAsIG1zZy5uZGF0YSApOworCSAgICBuYnl0ZXMgLT0gbXNnLm5kYXRhOworCSAgICBwICs9IG1zZy5uZGF0YTsKKworCSAgICB3aGlsZSggd3JpdGUoIHBpcGVmZCwgJm1zZywgc2l6ZW9mKG1zZykgKSAhPSBzaXplb2YobXNnKSApIHsKKwkJaWYoIGVycm5vID09IEVJTlRSICkKKwkJICAgIGNvbnRpbnVlOworCQlpZiggZXJybm8gPT0gRUFHQUlOICkgeworCQkgICAgc3RydWN0IHRpbWV2YWwgdHY7CisJCSAgICB0di50dl9zZWMgPSAwOworCQkgICAgdHYudHZfdXNlYyA9IDUwMDAwOworCQkgICAgc2VsZWN0KDAsIE5VTEwsIE5VTEwsIE5VTEwsICZ0dik7CisJCSAgICBjb250aW51ZTsKKwkJfQorCQlpZiggZXJybm8gPT0gRVBJUEUgKSAvKiBwYXJlbnQgaGFzIGV4aXRlZCwgc28gZ2l2ZSB1cCAqLworCQkgICBleGl0KDApOworCisJCS8qIHdlIGNhbid0IGRvIHZlcnkgbXVjaCBoZXJlIGJlY2F1c2Ugc3RkZXJyIGlzIGNsb3NlZCAqLworCQlpZiggZGJnZnAgKQorCQkgICAgZnByaW50ZihkYmdmcCwgImdhdGhlcmVyIGNhbid0IHdyaXRlIHRvIHBpcGU6ICVzXG4iLAorCQkJCSAgICBzdHJlcnJvcihlcnJubykgKTsKKwkJLyogd2Ugc3RhcnQgYSBuZXcgcG9sbCB0byBnaXZlIHRoZSBzeXN0ZW0gc29tZSB0aW1lICovCisJCW5ieXRlcyA9IDA7CisJCWJyZWFrOworCSAgICB9CisJfQorICAgIH0KKyAgICAvKiB3ZSBhcmUga2lsbGVkIHdoZW4gdGhlIHBhcmVudCBkaWVzICovCit9CisKKworc3RhdGljIGludAorcmVhZF9hX21zZyggaW50IGZkLCBHQVRIRVJfTVNHICptc2cgKQoreworICAgIGNoYXIgKmJ1ZmZlciA9IChjaGFyKiltc2c7CisgICAgc2l6ZV90IGxlbmd0aCA9IHNpemVvZiggKm1zZyApOworICAgIGludCBuOworCisgICAgZG8geworCWRvIHsKKwkgICAgbiA9IHJlYWQoZmQsIGJ1ZmZlciwgbGVuZ3RoICk7CisJfSB3aGlsZSggbiA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUiApOworCWlmKCBuID09IC0xICkKKwkgICAgcmV0dXJuIC0xOworCWJ1ZmZlciArPSBuOworCWxlbmd0aCAtPSBuOworICAgIH0gd2hpbGUoIGxlbmd0aCApOworICAgIHJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqCisgKiBVc2luZyBhIGxldmVsIG9mIDAgc2hvdWxkIG5ldmVyIGJsb2NrIGFuZCBiZXR0ZXIgYWRkIG5vdGhpbmcKKyAqIHRvIHRoZSBwb29sLiAgU28gdGhpcyBpcyBqdXN0IGEgZHVtbXkgZm9yIHRoaXMgZ2F0aGVyZXIuCisgKi8KK2ludAorX2djcnlfcm5kdW5peF9nYXRoZXJfcmFuZG9tICh2b2lkICgqYWRkKShjb25zdCB2b2lkKiwgc2l6ZV90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIHJhbmRvbV9vcmlnaW5zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSByYW5kb21fb3JpZ2lucyBvcmlnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgsIGludCBsZXZlbCApCit7CisgICAgc3RhdGljIHBpZF90IGdhdGhlcmVyX3BpZCA9IDA7CisgICAgc3RhdGljIGludCBwaXBlZGVzWzJdOworICAgIEdBVEhFUl9NU0cgbXNnOworICAgIHNpemVfdCBuOworCisgICAgaWYoICFsZXZlbCApCisJcmV0dXJuIDA7CisKKyAgICBpZiggIWdhdGhlcmVyX3BpZCApIHsKKwkvKiBNYWtlIHN1cmUgd2UgYXJlIG5vdCBzZXR1aWQuICovCisJaWYgKCBnZXR1aWQoKSAhPSBnZXRldWlkKCkgKQorCSAgICBCVUcoKTsKKwkvKiB0aW1lIHRvIHN0YXJ0IHRoZSBnYXRoZXJlciBwcm9jZXNzICovCisJaWYoIHBpcGUoIHBpcGVkZXMgKSApIHsKKwkgICAgbG9nX2Vycm9yKCJwaXBlKCkgZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkgICAgcmV0dXJuIC0xOworCX0KKwlnYXRoZXJlcl9waWQgPSBmb3JrKCk7CisJaWYoIGdhdGhlcmVyX3BpZCA9PSAtMSApIHsKKwkgICAgbG9nX2Vycm9yKCJjYW4ndCBmb3IgZ2F0aGVyZXIgcHJvY2VzczogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJICAgIHJldHVybiAtMTsKKwl9CisJaWYoICFnYXRoZXJlcl9waWQgKSB7CisJICAgIHN0YXJ0X2dhdGhlcmVyKCBwaXBlZGVzWzFdICk7CisJICAgIC8qIG9vcHMsIGNhbid0IGhhcHBlbiAqLworCSAgICByZXR1cm4gLTE7CisJfQorICAgIH0KKworICAgIC8qIG5vdyByZWFkIGZyb20gdGhlIGdhdGhlcmVyICovCisgICAgd2hpbGUoIGxlbmd0aCApIHsKKwlpbnQgZ29vZG5lc3M7CisJdWxvbmcgc3VidHJhY3Q7CisKKwlpZiggcmVhZF9hX21zZyggcGlwZWRlc1swXSwgJm1zZyApICkgeworCSAgICBsb2dfZXJyb3IoInJlYWRpbmcgZnJvbSBnYXRoZXJlciBwaXBlIGZhaWxlZDogJXNcbiIsCisJCQkJCQkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJICAgIHJldHVybiAtMTsKKwl9CisKKworCWlmKCBsZXZlbCA+IDEgKSB7CisJICAgIGlmKCBtc2cudXNlZnVsbmVzcyA+IDMwICkKKwkJZ29vZG5lc3MgPSAxMDA7CisJICAgIGVsc2UgaWYgKCBtc2cudXNlZnVsbmVzcyApCisJCWdvb2RuZXNzID0gbXNnLnVzZWZ1bG5lc3MgKiAxMDAgLyAzMDsKKwkgICAgZWxzZQorCQlnb29kbmVzcyA9IDA7CisJfQorCWVsc2UgaWYoIGxldmVsICkgeworCSAgICBpZiggbXNnLnVzZWZ1bG5lc3MgPiAxNSApCisJCWdvb2RuZXNzID0gMTAwOworCSAgICBlbHNlIGlmICggbXNnLnVzZWZ1bG5lc3MgKQorCQlnb29kbmVzcyA9IG1zZy51c2VmdWxuZXNzICogMTAwIC8gMTU7CisJICAgIGVsc2UKKwkJZ29vZG5lc3MgPSAwOworCX0KKwllbHNlCisJICAgIGdvb2RuZXNzID0gMTAwOyAvKiBnb29kbmVzcyBvZiBsZXZlbCAwIGlzIGFsd2F5cyAxMDAgJSAqLworCisJbiA9IG1zZy5uZGF0YTsKKwlpZiggbiA+IGxlbmd0aCApCisJICAgIG4gPSBsZW5ndGg7CisJKCphZGQpKCBtc2cuZGF0YSwgbiwgb3JpZ2luICk7CisKKwkvKiB0aGlzIGlzIHRoZSB0cmljayBob3cgd2UgY29wZSB3aXRoIHRoZSBnb29kbmVzcyAqLworCXN1YnRyYWN0ID0gKHVsb25nKW4gKiBnb29kbmVzcyAvIDEwMDsKKwkvKiBzdWJ0cmFjdCBhdCBsZWFzdCAxIGJ5dGUgdG8gYXZvaWQgaW5maW5pdGUgbG9vcHMgKi8KKwlsZW5ndGggLT0gc3VidHJhY3QgPyBzdWJ0cmFjdCA6IDE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvcmFuZG9tL3JuZHczMi5jIGIvbGliZ2NyeXB0LTEuNC42L3JhbmRvbS9ybmR3MzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjUwYzA2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L3JhbmRvbS9ybmR3MzIuYwpAQCAtMCwwICsxLDk4MCBAQAorLyogcm5kdzMyLmMgIC0gIFczMiBlbnRyb3B5IGdhdGhlcmVyCisgKiBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDIsIDIwMDMsIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKiBDb3B5cmlnaHQgUGV0ZXIgR3V0bWFubiwgTWF0dCBUaG9tbGluc29uIGFuZCBCbGFrZSBDb3ZlcmV0dCAxOTk2LTIwMDYKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRoZSBjb2RlIGhlcmUgaXMgYmFzZWQgb24gY29kZSBmcm9tIENyeXB0bGliIDMuMCBiZXRhIGJ5IFBldGVyIEd1dG1hbm4uCisgKiBTb3VyY2UgZmlsZSBtaXNjL3JuZHdpbjMyLmMgIldpbjMyIFJhbmRvbW5lc3MtR2F0aGVyaW5nIENvZGUiIHdpdGggdGhpcworICogY29weXJpZ2h0IG5vdGljZToKKyAqCisgKiBUaGlzIG1vZHVsZSBpcyBwYXJ0IG9mIHRoZSBjcnlwdGxpYiBjb250aW51b3VzbHkgc2VlZGVkIHBzZXVkb3JhbmRvbQorICogbnVtYmVyIGdlbmVyYXRvci4gIEZvciB1c2FnZSBjb25kaXRpb25zLCBzZWUgbGliX3JhbmQuYworICoKKyAqIFtIZXJlIGlzIHRoZSBub3RpY2UgZnJvbSBsaWJfcmFuZC5jLCB3aGljaCBpcyBub3cgY2FsbGVkIGRldl9zeXMuY10KKyAqCisgKiBUaGlzIG1vZHVsZSBhbmQgdGhlIG1pc2Mvcm5kKi5jIG1vZHVsZXMgcmVwcmVzZW50IHRoZSBjcnlwdGxpYgorICogY29udGludW91c2x5IHNlZWRlZCBwc2V1ZG9yYW5kb20gbnVtYmVyIGdlbmVyYXRvciAoQ1NQUk5HKSBhcyBkZXNjcmliZWQgaW4KKyAqIG15IDE5OTggVXNlbml4IFNlY3VyaXR5IFN5bXBvc2l1bSBwYXBlciAiVGhlIGdlbmVyYXRpb24gb2YgcmFuZG9tIG51bWJlcnMKKyAqIGZvciBjcnlwdG9ncmFwaGljIHB1cnBvc2VzIi4KKyAqCisgKiBUaGUgQ1NQUk5HIGNvZGUgaXMgY29weXJpZ2h0IFBldGVyIEd1dG1hbm4gKGFuZCB2YXJpb3VzIG90aGVycykgMTk5NiwKKyAqIDE5OTcsIDE5OTgsIDE5OTksIGFsbCByaWdodHMgcmVzZXJ2ZWQuICBSZWRpc3RyaWJ1dGlvbiBvZiB0aGUgQ1NQUk5HCisgKiBtb2R1bGVzIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlCisgKiAgICBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBpbiBpdHMgZW50aXJldHkuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBjb3B5cmlnaHQgbm90aWNlIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBIGNvcHkgb2YgYW55IGJ1Z2ZpeGVzIG9yIGVuaGFuY2VtZW50cyBtYWRlIG11c3QgYmUgcHJvdmlkZWQgdG8gdGhlCisgKiAgICBhdXRob3IsIDxwZ3V0MDAxQGNzLmF1Y2tsYW5kLmFjLm56PiB0byBhbGxvdyB0aGVtIHRvIGJlIGFkZGVkIHRvIHRoZQorICogICAgYmFzZWxpbmUgdmVyc2lvbiBvZiB0aGUgY29kZS4KKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGUgY29kZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIuMSBvciBhbnkgbGF0ZXIgdmVyc2lvbgorICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGluIHdoaWNoIGNhc2UgdGhlCisgKiBwcm92aXNpb25zIG9mIHRoZSBHTlUgTEdQTCBhcmUgcmVxdWlyZWQgSU5TVEVBRCBPRiB0aGUgYWJvdmUKKyAqIHJlc3RyaWN0aW9ucy4KKyAqCisgKiBBbHRob3VnaCBub3QgcmVxdWlyZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBMR1BMLCBpdCB3b3VsZCBzdGlsbAorICogYmUgbmljZSBpZiB5b3UgY291bGQgbWFrZSBhbnkgY2hhbmdlcyBhdmFpbGFibGUgdG8gdGhlIGF1dGhvciB0bworICogYWxsb3cgYSBjb25zaXN0ZW50IGNvZGUgYmFzZSB0byBiZSBtYWludGFpbmVkLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRoZSBhYm92ZSBhbHRlcm5hdGl2ZSB3YXMgY2hhbmdlZCBmcm9tIEdQTCB0byBMR1BMIG9uIDIwMDctMDgtMjIgd2l0aAorICogcGVybWlzc2lvbiBmcm9tIFBldGVyIEd1dG1hbm46CisgKj09PT09PT09PT0KKyBGcm9tOiBwZ3V0MDAxIDxwZ3V0MDAxQGNzLmF1Y2tsYW5kLmFjLm56PgorIFN1YmplY3Q6IFJlOiBMR1BMIGZvciB0aGUgd2luZG93cyBlbnRyb3B5IGdhdGhlcmVyCisgVG86IHdrQGdudXBnLm9yZworIERhdGU6IFdlZCwgMjIgQXVnIDIwMDcgMDM6MDU6NDIgKzEyMDAKKworIEhpLAorCisgPkFzIG9mIG5vdyBsaWJnY3J5cHQgaXMgR1BMIHVuZGVyIFdpbmRvd3MgZHVlIHRvIHRoYXQgbW9kdWxlIGFuZCBzb21lIHBlb3BsZQorID53b3VsZCByZWFsbHkgbGlrZSB0byBzZWUgaXQgdW5kZXIgTEdQTCB0b28uICBDYW4geW91IGRvIHN1Y2ggYSBsaWNlbnNlIGNoYW5nZQorID50byBMR1BMIHZlcnNpb24gMj8gIE5vdGUgdGhhdCBMR1BMIGdpdmUgdGhlIHVzZXIgdGhlIG9wdGlvbiB0byByZWxpY2Vuc2UgaXQKKyA+dW5kZXIgR1BMLCBzbyB0aGUgY2hhbmdlIHdvdWxkIGJlIHByZXR0eSBlYXN5IGFuZCBiYWNrd2FyIGNvbXBhdGlibGUuCisKKyBTdXJlLiAgSSBhc3N1bWVkIHRoYXQgc2luY2UgR1BHIHdhcyBHUExkLCB5b3UnZCBwcmVmZXIgdGhlIEdQTCBmb3IgdGhlIGVudHJvcHkKKyBjb2RlIGFzIHdlbGwsIGJ1dCBJYW4gYXNrZWQgZm9yIExHUEwgYXMgYW4gb3B0aW9uIHNvIGFzIG9mIHRoZSBuZXh0IHJlbGVhc2UKKyBJJ2xsIGhhdmUgTEdQTCBpbiB0aGVyZS4gIFlvdSBjYW4gY29uc2lkZXIgaXQgdG8gYmUgcmV0cm9hY3RpdmUsIHNvIHlvdXIKKyBjdXJyZW50IHZlcnNpb24gd2lsbCBiZSBMR1BMZCBhcyB3ZWxsLgorCisgUGV0ZXIuCisgKj09PT09PT09PT0KKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmZGVmIF9fR05VQ19fICAKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorCisKKyNpbmNsdWRlICJ0eXBlcy5oIgorI2luY2x1ZGUgImcxMGxpYi5oIgorI2luY2x1ZGUgInJhbmQtaW50ZXJuYWwuaCIKKworCisvKiBEZWZpbml0aW9ucyB3aGljaCBhcmUgbWlzc2luZyBmcm9tIHRoZSBjdXJyZW50IEdOVSBXaW5kb3dzMzJBcGkuICAqLworI2lmbmRlZiBJT0NUTF9ESVNLX1BFUkZPUk1BTkNFCisjZGVmaW5lIElPQ1RMX0RJU0tfUEVSRk9STUFOQ0UgIDB4MDAwNzAwMjAKKyNlbmRpZgorCisvKiBUaGlzIHVzZWQgdG8gYmUgKDYqOCs1KjQrOCoyKSwgYnV0IFBldGVyIEd1dG1hbm4gZmlndXJlZCBhIGxhcmdlcgorICAgdmFsdWUgaW4gYSBuZXdlciByZWxlYXNlLiBTbyB3ZSB1c2UgYSBmYXIgbGFyZ2VyIHZhbHVlLiAqLworI2RlZmluZSBTSVpFT0ZfRElTS19QRVJGT1JNQU5DRV9TVFJVQ1QgMjU2CisKKy8qIFdlIGRvbid0IGluY2x1ZGUgd2luY3J5cHQuaCBzbyBkZWZpbmUgaXQgaGVyZS4gICovCisjZGVmaW5lIEhDUllQVFBST1YgIEhBTkRMRQorCisKKy8qIFdoZW4gd2UgcXVlcnkgdGhlIHBlcmZvcm1hbmNlIGNvdW50ZXJzLCB3ZSBhbGxvY2F0ZSBhbiBpbml0aWFsIGJ1ZmZlciBhbmQKKyAqIHRoZW4gcmVhbGxvY2F0ZSBpdCBhcyByZXF1aXJlZCB1bnRpbCBSZWdRdWVyeVZhbHVlRXgoKSBzdG9wcyByZXR1cm5pbmcKKyAqIEVSUk9SX01PUkVfREFUQS4gIFRoZSBmb2xsb3dpbmcgdmFsdWVzIGRlZmluZSB0aGUgaW5pdGlhbCBidWZmZXIgc2l6ZSBhbmQKKyAqIHN0ZXAgc2l6ZSBieSB3aGljaCB0aGUgYnVmZmVyIGlzIGluY3JlYXNlZAorICovCisjZGVmaW5lIFBFUkZPUk1BTkNFX0JVRkZFUl9TSVpFICAgICAgICAgNjU1MzYgICAvKiBTdGFydCBhdCA2NEsgKi8KKyNkZWZpbmUgUEVSRk9STUFOQ0VfQlVGRkVSX1NURVAgICAgICAgICAxNjM4NCAgIC8qIFN0ZXAgYnkgMTZLICovCisKKworLyogVGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkIGZyb20gdGhlIHN5c3RlbSBSTkcgb24gZWFjaCBzbG93IHBvbGwuICAqLworI2RlZmluZSBTWVNURU1STkdfQllURVMgNjQKKworLyogSW50ZWwgQ2hpcHNldCBDU1AgdHlwZSBhbmQgbmFtZSAqLworI2RlZmluZSBQUk9WX0lOVEVMX1NFQyAgMjIKKyNkZWZpbmUgSU5URUxfREVGX1BST1YgICJJbnRlbCBIYXJkd2FyZSBDcnlwdG9ncmFwaGljIFNlcnZpY2UgUHJvdmlkZXIiCisKKworCisKKy8qIFR5cGUgZGVmaW5pdGlvbnMgZm9yIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIGNhbGwgTmV0QVBJMzIgZnVuY3Rpb25zLiAgKi8KK3R5cGVkZWYgRFdPUkQgKFdJTkFQSSAqTkVUU1RBVElTVElDU0dFVCkoTFBXU1RSIHN6U2VydmVyLCBMUFdTVFIgc3pTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0xldmVsLCBEV09SRCBkd09wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQllURSAqbHBCdWZmZXIpOwordHlwZWRlZiBEV09SRCAoV0lOQVBJICpORVRBUElCVUZGRVJTSVpFKShMUFZPSUQgbHBCdWZmZXIsIExQRFdPUkQgY2JCdWZmZXIpOwordHlwZWRlZiBEV09SRCAoV0lOQVBJICpORVRBUElCVUZGRVJGUkVFKShMUFZPSUQgbHBCdWZmZXIpOworCisvKiBUeXBlIGRlZmluaXRpb25zIGZvciBmdW5jdGlvbiBwb2ludGVycyB0byBjYWxsIG5hdGl2ZSBOVCBmdW5jdGlvbnMuICAqLwordHlwZWRlZiBEV09SRCAoV0lOQVBJICpOVFFVRVJZU1lTVEVNSU5GT1JNQVRJT04pKERXT1JEIHN5c3RlbUluZm9ybWF0aW9uQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFZPSUQgc3lzdGVtSW5mb3JtYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUxPTkcgc3lzdGVtSW5mb3JtYXRpb25MZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFVMT05HIHJldHVybkxlbmd0aCk7Cit0eXBlZGVmIERXT1JEIChXSU5BUEkgKk5UUVVFUllJTkZPUk1BVElPTlBST0NFU1MpCisgICAgIChIQU5ETEUgcHJvY2Vzc0hhbmRsZSwgRFdPUkQgcHJvY2Vzc0luZm9ybWF0aW9uQ2xhc3MsCisgICAgICBQVk9JRCBwcm9jZXNzSW5mb3JtYXRpb24sIFVMT05HIHByb2Nlc3NJbmZvcm1hdGlvbkxlbmd0aCwKKyAgICAgIFBVTE9ORyByZXR1cm5MZW5ndGgpOwordHlwZWRlZiBEV09SRCAoV0lOQVBJICpOVFBPV0VSSU5GT1JNQVRJT04pCisgICAgIChEV09SRCBwb3dlckluZm9ybWF0aW9uQ2xhc3MsIFBWT0lEIGlucHV0QnVmZmVyLAorICAgICAgVUxPTkcgaW5wdXRCdWZmZXJMZW5ndGgsIFBWT0lEIG91dHB1dEJ1ZmZlciwgVUxPTkcgb3V0cHV0QnVmZmVyTGVuZ3RoICk7CisKKy8qIFR5cGUgZGVmaW5pdGlvbnMgZm9yIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIGNhbGwgQ3J5cHRvQVBJIGZ1bmN0aW9ucy4gKi8KK3R5cGVkZWYgQk9PTCAoV0lOQVBJICpDUllQVEFDUVVJUkVDT05URVhUKShIQ1JZUFRQUk9WICpwaFByb3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDVFNUUiBwc3pDb250YWluZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDVFNUUiBwc3pQcm92aWRlciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdQcm92VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0ZsYWdzKTsKK3R5cGVkZWYgQk9PTCAoV0lOQVBJICpDUllQVEdFTlJBTkRPTSkoSENSWVBUUFJPViBoUHJvdiwgRFdPUkQgZHdMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJZVEUgKnBiQnVmZmVyKTsKK3R5cGVkZWYgQk9PTCAoV0lOQVBJICpDUllQVFJFTEVBU0VDT05URVhUKShIQ1JZUFRQUk9WIGhQcm92LCBEV09SRCBkd0ZsYWdzKTsKKworLyogU29tZXdoYXQgYWx0ZXJuYXRpdmUgZnVuY3Rpb25hbGl0eSBhdmFpbGFibGUgYXMgYSBkaXJlY3QgY2FsbCwgZm9yIAorICAgV2luZG93cyBYUCBhbmQgbmV3ZXIuICBUaGlzIGlzIHRoZSBDcnlwdG9BUEkgUk5HLCB3aGljaCBpc24ndCBhbnl3aGVyZQorICAgbmVhciBhcyBnb29kIGFzIHRoZSBIVyBSTkcsIGJ1dCB3ZSB1c2UgaXQgaWYgaXQncyBwcmVzZW50IG9uIHRoZSBiYXNpcworICAgdGhhdCBhdCBsZWFzdCBpdCBjYW4ndCBtYWtlIHRoaW5ncyBhbnkgd29yc2UuICBUaGlzIGRpcmVjdCBhY2Nlc3MgdmVyc2lvbiAKKyAgIGlzIG9ubHkgYXZhaWxhYmxlIHVuZGVyIFdpbmRvd3MgWFAsIHdlIGRvbid0IGdvIG91dCBvZiBvdXIgd2F5IHRvIGFjY2VzcworICAgdGhlIG1vcmUgZ2VuZXJhbCBDcnlwdG9BUEkgb25lIHNpbmNlIHRoZSBtYWluIHB1cnBvc2Ugb2YgdXNpbmcgaXQgaXMgdG8gCisgICB0YWtlIGFkdmFudGFnZSBvZiBhbnkgcG9zc2libGUgZnV0dXJlIGhhcmR3YXJlIFJOR3MgdGhhdCBtYXkgYmUgYWRkZWQsIAorICAgZm9yIGV4YW1wbGUgdmlhIFRDUEEgZGV2aWNlcy4gICovCit0eXBlZGVmIEJPT0wgKFdJTkFQSSAqUlRMR0VOUkFORE9NKShQVk9JRCBSYW5kb21CdWZmZXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUxPTkcgUmFuZG9tQnVmZmVyTGVuZ3RoKTsKKworCisKKy8qIE1CTSBkYXRhIHN0cnVjdHVyZXMsIG9yaWdpbmFsbHkgYnkgQWxleGFuZGVyIHZhbiBLYWFtLCBjb252ZXJ0ZWQgdG8gQyBieQorICAgQW5kZXJzQE1hamxhbmQub3JnLCBmaW5hbGx5IHVwZGF0ZWQgYnkgQ2hyaXMgWmFocnQgPHRlY2huMEBpYXN0YXRlLmVkdT4gKi8KKyNkZWZpbmUgQnVzVHlwZSAgICAgICAgIGNoYXIKKyNkZWZpbmUgU01CVHlwZSAgICAgICAgIGNoYXIKKyNkZWZpbmUgU2Vuc29yVHlwZSAgICAgIGNoYXIKKwordHlwZWRlZiBzdHJ1Y3QgCit7CisgIFNlbnNvclR5cGUgaVR5cGU7ICAgICAgICAgICAgICAgLyogVHlwZSBvZiBzZW5zb3IuICAqLworICBpbnQgQ291bnQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzZW5zb3IgZm9yIHRoYXQgdHlwZS4gICovCit9IFNoYXJlZEluZGV4OworCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgU2Vuc29yVHlwZSBzc1R5cGU7ICAgICAgICAgICAgICAvKiBUeXBlIG9mIHNlbnNvciAqLworICB1bnNpZ25lZCBjaGFyIHNzTmFtZVsxMl07ICAgICAgIC8qIE5hbWUgb2Ygc2Vuc29yICovCisgIGNoYXIgc3NwYWRkaW5nMVszXTsgICAgICAgICAgICAgLyogUGFkZGluZyBvZiAzIGJ5dGVzICovCisgIGRvdWJsZSBzc0N1cnJlbnQ7ICAgICAgICAgICAgICAgLyogQ3VycmVudCB2YWx1ZSAqLworICBkb3VibGUgc3NMb3c7ICAgICAgICAgICAgICAgICAgIC8qIExvd2VzdCByZWFkb3V0ICovCisgIGRvdWJsZSBzc0hpZ2g7ICAgICAgICAgICAgICAgICAgLyogSGlnaGVzdCByZWFkb3V0ICovCisgIGxvbmcgc3NDb3VudDsgICAgICAgICAgICAgICAgICAgLyogVG90YWwgbnVtYmVyIG9mIHJlYWRvdXQgKi8KKyAgY2hhciBzc3BhZGRpbmcyWzRdOyAgICAgICAgICAgICAvKiBQYWRkaW5nIG9mIDQgYnl0ZXMgKi8KKyAgbG9uZyBkb3VibGUgc3NUb3RhbDsgICAgICAgICAgICAvKiBUb3RhbCBhbW91dCBvZiBhbGwgcmVhZG91dHMgKi8KKyAgY2hhciBzc3BhZGRpbmczWzZdOyAgICAgICAgICAgICAvKiBQYWRkaW5nIG9mIDYgYnl0ZXMgKi8KKyAgZG91YmxlIHNzQWxhcm0xOyAgICAgICAgICAgICAgICAvKiBUZW1wICYgZmFuOiBoaWdoIGFsYXJtOyB2b2x0YWdlOiAlIG9mZiAqLworICBkb3VibGUgc3NBbGFybTI7ICAgICAgICAgICAgICAgIC8qIFRlbXA6IGxvdyBhbGFybSAqLworfSBTaGFyZWRTZW5zb3I7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIHNob3J0IHNpU01CX0Jhc2U7ICAgICAgICAgICAgICAgLyogU01CdXMgYmFzZSBhZGRyZXNzICovCisgIEJ1c1R5cGUgc2lTTUJfVHlwZTsgICAgICAgICAgICAgLyogU01CdXMvSXNhIGJ1cyB1c2VkIHRvIGFjY2VzcyBjaGlwICovCisgIFNNQlR5cGUgc2lTTUJfQ29kZTsgICAgICAgICAgICAgLyogU01CdXMgc3ViIHR5cGUsIEludGVsLCBBTUQgb3IgQUxpICovCisgIGNoYXIgc2lTTUJfQWRkcjsgICAgICAgICAgICAgICAgLyogQWRkcmVzcyBvZiBzZW5zb3IgY2hpcCBvbiBTTUJ1cyAqLworICB1bnNpZ25lZCBjaGFyIHNpU01CX05hbWVbNDFdOyAgIC8qIE5pY2UgbmFtZSBmb3IgU01CdXMgKi8KKyAgc2hvcnQgc2lJU0FfQmFzZTsgICAgICAgICAgICAgICAvKiBJU0EgYmFzZSBhZGRyZXNzIG9mIHNlbnNvciBjaGlwIG9uIElTQSAqLworICBpbnQgc2lDaGlwVHlwZTsgICAgICAgICAgICAgICAgIC8qIENoaXAgbnIsIGNvbm5lY3RzIHdpdGggQ2hpcGluZm8uaW5pICovCisgIGNoYXIgc2lWb2x0YWdlU3ViVHlwZTsgICAgICAgICAgLyogU3Vidm9sdGFnZSBvcHRpb24gc2VsZWN0ZWQgKi8KK30gU2hhcmVkSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgZG91YmxlIHNkVmVyc2lvbjsgICAgICAgICAgICAgICAvKiBWZXJzaW9uIG51bWJlciAoZXhhbXBsZTogNTEwOTApICovCisgIFNoYXJlZEluZGV4IHNkSW5kZXhbMTBdOyAgICAgICAgLyogU2Vuc29yIGluZGV4ICovCisgIFNoYXJlZFNlbnNvciBzZFNlbnNvclsxMDBdOyAgICAgLyogU2Vuc29yIGluZm8gKi8KKyAgU2hhcmVkSW5mbyBzZEluZm87ICAgICAgICAgICAgICAvKiBNaXNjLmluZm8gKi8KKyAgdW5zaWduZWQgY2hhciBzZFN0YXJ0WzQxXTsgICAgICAvKiBTdGFydCB0aW1lICovCisKKyAgLyogV2UgZG9uJ3QgdXNlIHRoZSBuZXh0IHR3byBmaWVsZHMgYm90aCBiZWNhdXNlIHRoZXkncmUgbm90IHJhbmRvbQorICAgICBhbmQgYmVjYXVzZSBpdCBwcm92aWRlcyBhIG5pY2Ugc2FmZXR5IG1hcmdpbiBpbiBjYXNlIG9mIGRhdGEgc2l6ZQorICAgICBtaXMtIGVzdGltYXRlcyAod2UgYWx3YXlzIHVuZGVyLWVzdGltYXRlIHRoZSBidWZmZXIgc2l6ZSkuICAqLworI2lmIDAKKyAgdW5zaWduZWQgY2hhciBzZEN1cnJlbnRbNDFdOyAgICAvKiBDdXJyZW50IHRpbWUgKi8KKyAgdW5zaWduZWQgY2hhciBzZFBhdGhbMjU2XTsgICAgICAvKiBNQk0gcGF0aCAqLworI2VuZGlmIC8qMCovCit9IFNoYXJlZERhdGE7CisKKworCisvKiBPbmUgdGltZSBpbnRpYWxpemVkIGhhbmRsZXMgYW5kIGZ1bmN0aW9uIHBvaW50ZXJzLiAgV2UgdXNlIGR5bmFtaWMKKyAgIGxvYWRpbmcgb2YgdGhlIERMTHMgdG8gZG8gd2l0aG91dCB0aGVtIGluIGNhc2UgbGliZ2NyeXB0IGRvZXMgbm90CisgICBuZWVkIGFueSByYW5kb20uICAqLworc3RhdGljIEhBTkRMRSBoTmV0QVBJMzI7CitzdGF0aWMgTkVUU1RBVElTVElDU0dFVCBwTmV0U3RhdGlzdGljc0dldDsKK3N0YXRpYyBORVRBUElCVUZGRVJTSVpFIHBOZXRBcGlCdWZmZXJTaXplOworc3RhdGljIE5FVEFQSUJVRkZFUkZSRUUgcE5ldEFwaUJ1ZmZlckZyZWU7CisKK3N0YXRpYyBIQU5ETEUgaE5UQVBJOworc3RhdGljIE5UUVVFUllTWVNURU1JTkZPUk1BVElPTiAgcE50UXVlcnlTeXN0ZW1JbmZvcm1hdGlvbjsKK3N0YXRpYyBOVFFVRVJZSU5GT1JNQVRJT05QUk9DRVNTIHBOdFF1ZXJ5SW5mb3JtYXRpb25Qcm9jZXNzOworc3RhdGljIE5UUE9XRVJJTkZPUk1BVElPTiAgICAgICAgcE50UG93ZXJJbmZvcm1hdGlvbjsKKworc3RhdGljIEhBTkRMRSBoQWR2QVBJMzI7CitzdGF0aWMgQ1JZUFRBQ1FVSVJFQ09OVEVYVCBwQ3J5cHRBY3F1aXJlQ29udGV4dDsKK3N0YXRpYyBDUllQVEdFTlJBTkRPTSAgICAgIHBDcnlwdEdlblJhbmRvbTsKK3N0YXRpYyBDUllQVFJFTEVBU0VDT05URVhUIHBDcnlwdFJlbGVhc2VDb250ZXh0Oworc3RhdGljIFJUTEdFTlJBTkRPTSAgICAgICAgcFJ0bEdlblJhbmRvbTsKKworCisvKiBPdGhlciBtb2R1bGUgZ2xvYmFsIHZhcmlhYmxlcy4gICovCitzdGF0aWMgaW50IHN5c3RlbV9ybmdfYXZhaWxhYmxlOyAvKiBXaGV0aGVyIGEgc3lzdGVtIFJORyBpcyBhdmFpbGFibGUuICAqLworc3RhdGljIEhDUllQVFBST1YgaFJOR1Byb3Y7ICAgICAgLyogSGFuZGxlIHRvIEludGVsIFJORyBDU1AuICovCisKK3N0YXRpYyBpbnQgZGVidWdfbWU7ICAvKiBEZWJ1ZyBmbGFnLiAgKi8KKworc3RhdGljIGludCBzeXN0ZW1faXNfdzIwMDA7ICAgICAvKiBUcnVlIGlmIHJ1bm5pbmcgb24gVzIwMDAuICAqLworCisKKworDAorLyogVHJ5IGFuZCBjb25uZWN0IHRvIHRoZSBzeXN0ZW0gUk5HIGlmIHRoZXJlJ3Mgb25lIHByZXNlbnQuICovCitzdGF0aWMgdm9pZCAKK2luaXRfc3lzdGVtX3JuZyAodm9pZCkKK3sKKyAgc3lzdGVtX3JuZ19hdmFpbGFibGUgPSAwOworICBoUk5HUHJvdiA9IE5VTEw7CisKKyAgaEFkdkFQSTMyID0gR2V0TW9kdWxlSGFuZGxlICgiQWR2QVBJMzIuZGxsIik7CisgIGlmICghaEFkdkFQSTMyKQorICAgIHJldHVybjsKKworICBwQ3J5cHRBY3F1aXJlQ29udGV4dCA9IChDUllQVEFDUVVJUkVDT05URVhUKQorICAgIEdldFByb2NBZGRyZXNzIChoQWR2QVBJMzIsICJDcnlwdEFjcXVpcmVDb250ZXh0QSIpOworICBwQ3J5cHRHZW5SYW5kb20gPSAoQ1JZUFRHRU5SQU5ET00pCisgICAgR2V0UHJvY0FkZHJlc3MgKGhBZHZBUEkzMiwgIkNyeXB0R2VuUmFuZG9tIik7CisgIHBDcnlwdFJlbGVhc2VDb250ZXh0ID0gKENSWVBUUkVMRUFTRUNPTlRFWFQpCisgICAgR2V0UHJvY0FkZHJlc3MgKGhBZHZBUEkzMiwgIkNyeXB0UmVsZWFzZUNvbnRleHQiKTsKKyAgCisgIC8qIEdldCBhIHBvaW50ZXIgdG8gdGhlIG5hdGl2ZSByYW5kb21uZXNzIGZ1bmN0aW9uIGlmIGl0J3MgYXZhaWxhYmxlLiAgCisgICAgIFRoaXMgaXNuJ3QgZXhwb3J0ZWQgYnkgbmFtZSwgc28gd2UgaGF2ZSB0byBnZXQgaXQgYnkgb3JkaW5hbC4gICovCisgIHBSdGxHZW5SYW5kb20gPSAoUlRMR0VOUkFORE9NKQorICAgIEdldFByb2NBZGRyZXNzIChoQWR2QVBJMzIsICJTeXN0ZW1GdW5jdGlvbjAzNiIpOworCisgIC8qIFRyeSBhbmQgY29ubmVjdCB0byB0aGUgUElJSSBSTkcgQ1NQLiAgVGhlIEFNRCA3Njggc291dGhicmlkZ2UgKGZyb20gCisgICAgIHRoZSA3NjAgTVAgY2hpcHNldCkgYWxzbyBoYXMgYSBoYXJkd2FyZSBSTkcsIGJ1dCB0aGVyZSBkb2Vzbid0IGFwcGVhciAKKyAgICAgdG8gYmUgYW55IGRyaXZlciBzdXBwb3J0IGZvciB0aGlzIGFzIHRoZXJlIGlzIGZvciB0aGUgSW50ZWwgUk5HIHNvIHdlIAorICAgICBjYW4ndCBkbyBtdWNoIHdpdGggaXQuICBPVE9IIHRoZSBJbnRlbCBSTkcgaXMgYWxzbyBlZmZlY3RpdmVseSBkZWFkIAorICAgICBhcyB3ZWxsLCBtb3N0bHkgZHVlIHRvIHZpcnR1YWxseSBub25leGlzdGFudCBzdXBwb3J0L21hcmtldGluZyBieSAKKyAgICAgSW50ZWwsIGl0J3MgaW5jbHVkZWQgaGVyZSBtb3N0bHkgZm9yIGZvcm0ncyBzYWtlLiAgKi8KKyAgaWYgKCAoIXBDcnlwdEFjcXVpcmVDb250ZXh0IHx8ICFwQ3J5cHRHZW5SYW5kb20gfHwgIXBDcnlwdFJlbGVhc2VDb250ZXh0CisgICAgICAgIHx8ICFwQ3J5cHRBY3F1aXJlQ29udGV4dCAoJmhSTkdQcm92LCBOVUxMLCBJTlRFTF9ERUZfUFJPViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9WX0lOVEVMX1NFQywgMCkgKQorICAgICAgICYmICFwUnRsR2VuUmFuZG9tKQorICAgIHsKKyAgICAgIGhBZHZBUEkzMiA9IE5VTEw7CisgICAgfQorICBlbHNlCisgICAgc3lzdGVtX3JuZ19hdmFpbGFibGUgPSAxOworfQorCisKKy8qIFJlYWQgZGF0YSBmcm9tIHRoZSBzeXN0ZW0gUk5HIGlmIGF2YWlsYXZsZS4gICovCitzdGF0aWMgdm9pZCAKK3JlYWRfc3lzdGVtX3JuZyAodm9pZCAoKmFkZCkoY29uc3Qgdm9pZCosIHNpemVfdCwgZW51bSByYW5kb21fb3JpZ2lucyksCisgICAgICAgICAgICAgICAgIGVudW0gcmFuZG9tX29yaWdpbnMgcmVxdWVzdGVyKQoreworICBCWVRFIGJ1ZmZlclsgU1lTVEVNUk5HX0JZVEVTICsgOCBdOworICBpbnQgcXVhbGl0eSA9IDA7CisKKyAgaWYgKCFzeXN0ZW1fcm5nX2F2YWlsYWJsZSkKKyAgICByZXR1cm47CisKKyAgLyogUmVhZCBTWVNURU1STkdfQllURVMgYnl0ZXMgZnJvbSB0aGUgc3lzdGVtIFJORy4gIFdlIGRvbid0IHJlbHkgb24KKyAgICAgdGhpcyBmb3IgYWxsIG91ciByYW5kb21uZXNzIHJlcXVpcmVtZW50cyAocGFydGljdWxhcmx5IHRoZQorICAgICBzb2Z0d2FyZSBSTkcpIGluIGNhc2UgaXQncyBicm9rZW4gaW4gc29tZSB3YXkuICAqLworICBpZiAoaFJOR1Byb3YpCisgICAgeworICAgICAgaWYgKHBDcnlwdEdlblJhbmRvbSAoaFJOR1Byb3YsIFNZU1RFTVJOR19CWVRFUywgYnVmZmVyKSkKKyAgICAgICAgcXVhbGl0eSA9IDgwOworICAgIH0KKyAgZWxzZSBpZiAocFJ0bEdlblJhbmRvbSkKKyAgICB7CisgICAgICBpZiAoIHBSdGxHZW5SYW5kb20gKGJ1ZmZlciwgU1lTVEVNUk5HX0JZVEVTKSkKKyAgICAgICAgcXVhbGl0eSA9IDUwOworICAgIH0KKyAgaWYgKHF1YWxpdHkgPiAwKQorICAgIHsKKyAgICAgIGlmIChkZWJ1Z19tZSkKKyAgICAgICAgbG9nX2RlYnVnICgicm5kdzMyI3JlYWRfc3lzdGVtX3JuZzogZ290ICVkIGJ5dGVzIG9mIHF1YWxpdHkgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgU1lTVEVNUk5HX0JZVEVTLCBxdWFsaXR5KTsKKyAgICAgICgqYWRkKSAoYnVmZmVyLCBTWVNURU1STkdfQllURVMsIHJlcXVlc3Rlcik7CisgICAgICB3aXBlbWVtb3J5IChidWZmZXIsIFNZU1RFTVJOR19CWVRFUyk7CisgICAgfQorfQorCisKKy8qIFJlYWQgZGF0YSBmcm9tIE1CTS4gIFRoaXMgY29tbXVuaWNhdGVzIHZpYSBzaGFyZWQgbWVtb3J5LCBzbyBhbGwgd2UKKyAgIG5lZWQgdG8gZG8gaXMgbWFwIGEgZmlsZSBhbmQgcmVhZCB0aGUgZGF0YSBvdXQuICAqLworc3RhdGljIHZvaWQKK3JlYWRfbWJtX2RhdGEgKHZvaWQgKCphZGQpKGNvbnN0IHZvaWQqLCBzaXplX3QsIGVudW0gcmFuZG9tX29yaWdpbnMpLCAKKyAgICAgICAgICAgICAgIGVudW0gcmFuZG9tX29yaWdpbnMgcmVxdWVzdGVyKQoreworICBIQU5ETEUgaE1CTURhdGE7CisgIFNoYXJlZERhdGEgKm1ibURhdGFQdHI7CisKKyAgaE1CTURhdGEgPSBPcGVuRmlsZU1hcHBpbmcgKEZJTEVfTUFQX1JFQUQsIEZBTFNFLCAiJE0kQiRNJDUkUyREJCIgKTsKKyAgaWYgKGhNQk1EYXRhKQorICAgIHsKKyAgICAgIG1ibURhdGFQdHIgPSAoU2hhcmVkRGF0YSopTWFwVmlld09mRmlsZSAoaE1CTURhdGEsIEZJTEVfTUFQX1JFQUQsMCwwLDApOworICAgICAgaWYgKG1ibURhdGFQdHIpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZGVidWdfbWUpCisgICAgICAgICAgICBsb2dfZGVidWcgKCJybmR3MzIjcmVhZF9tYm1fZGF0YTogZ290ICVkIGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAoaW50KXNpemVvZiAoU2hhcmVkRGF0YSkpOworICAgICAgICAgICgqYWRkKSAobWJtRGF0YVB0ciwgc2l6ZW9mIChTaGFyZWREYXRhKSwgcmVxdWVzdGVyKTsKKyAgICAgICAgICBVbm1hcFZpZXdPZkZpbGUgKG1ibURhdGFQdHIpOworICAgICAgICB9CisgICAgICBDbG9zZUhhbmRsZSAoaE1CTURhdGEpOworICAgIH0KK30KKworCisvKiBGYWxsYmFjayBtZXRob2QgdXNpbmcgdGhlIHJlZ2lzdHJ5IHRvIHBvbGwgdGhlIHN0YXRpc3RpY3MuICAqLworc3RhdGljIHZvaWQKK3JlZ2lzdHJ5X3BvbGwgKHZvaWQgKCphZGQpKGNvbnN0IHZvaWQqLCBzaXplX3QsIGVudW0gcmFuZG9tX29yaWdpbnMpLCAKKyAgICAgICAgICAgICAgIGVudW0gcmFuZG9tX29yaWdpbnMgcmVxdWVzdGVyKQoreworICBzdGF0aWMgaW50IGNiUGVyZkRhdGEgPSBQRVJGT1JNQU5DRV9CVUZGRVJfU0laRTsKKyAgaW50IGl0ZXJhdGlvbnM7CisgIERXT1JEIGR3U2l6ZSwgc3RhdHVzOworICBQRVJGX0RBVEFfQkxPQ0sgKnBQZXJmRGF0YTsKKworICAvKiBHZXQgaW5mb3JtYXRpb24gZnJvbSB0aGUgc3lzdGVtIHBlcmZvcm1hbmNlIGNvdW50ZXJzLiAgVGhpcyBjYW4gdGFrZSBhCisgICAgIGZldyBzZWNvbmRzIHRvIGRvLiAgSW4gc29tZSBlbnZpcm9ubWVudHMgdGhlIGNhbGwgdG8gUmVnUXVlcnlWYWx1ZUV4KCkKKyAgICAgY2FuIHByb2R1Y2UgYW4gYWNjZXNzIHZpb2xhdGlvbiBhdCBzb21lIHJhbmRvbSB0aW1lIGluIHRoZSBmdXR1cmUsIGluCisgICAgIHNvbWUgY2FzZXMgYWRkaW5nIGEgc2hvcnQgZGVsYXkgYWZ0ZXIgdGhlIGZvbGxvd2luZyBjb2RlIGJsb2NrIG1ha2VzCisgICAgIHRoZSBwcm9ibGVtIGdvIGF3YXkuICBUaGlzIHByb2JsZW0gaXMgZXh0cmVtZWx5IGRpZmZpY3VsdCB0bworICAgICByZXByb2R1Y2UsIEkgaGF2ZW4ndCBiZWVuIGFibGUgdG8gZ2V0IGl0IHRvIG9jY3VyIGRlc3BpdGUgcnVubmluZyBpdAorICAgICBvbiBhIG51bWJlciBvZiBtYWNoaW5lcy4gIE1TIGtub3dsZWRnZSBiYXNlIGFydGljbGUgUTE3ODg4NyBjb3ZlcnMKKyAgICAgdGhpcyB0eXBlIG9mIHByb2JsZW0sIGl0J3MgdHlwaWNhbGx5IGNhdXNlZCBieSBhbiBleHRlcm5hbCBkcml2ZXIgb3IKKyAgICAgb3RoZXIgcHJvZ3JhbSB0aGF0IGFkZHMgaXRzIG93biB2YWx1ZXMgdW5kZXIgdGhlCisgICAgIEhLRVlfUEVSRk9STUFOQ0VfREFUQSBrZXkuICBUaGUgTlQga2VybmVsLCB2aWEgQWR2YXBpMzIuZGxsLCBjYWxscyB0aGUKKyAgICAgcmVxdWlyZWQgZXh0ZXJuYWwgbW9kdWxlIHRvIG1hcCBpbiB0aGUgZGF0YSBpbnNpZGUgYW4gU0VIIHRyeS9leGNlcHQKKyAgICAgYmxvY2ssIHNvIHByb2JsZW1zIGluIHRoZSBtb2R1bGUncyBjb2xsZWN0IGZ1bmN0aW9uIGRvbid0IHBvcCB1cCB1bnRpbAorICAgICBhZnRlciBpdCBoYXMgZmluaXNoZWQsIHNvIHRoZSBmYXVsdCBhcHBlYXJzIHRvIG9jY3VyIGluIEFkdmFwaTMyLmRsbC4KKyAgICAgVGhlcmUgbWF5IGJlIHByb2JsZW1zIGluIHRoZSBOVCBrZXJuZWwgYXMgd2VsbCB0aG91Z2gsIGEgbG93LWxldmVsCisgICAgIG1lbW9yeSBjaGVja2VyIGluZGljYXRlZCB0aGF0IEV4cGFuZEVudmlyb25tZW50U3RyaW5ncygpIGluCisgICAgIEtlcm5lbDMyLmRsbCwgY2FsbGVkIGFuIGludGVybWluYWJsZSBudW1iZXIgb2YgY2FsbHMgZG93biBpbnNpZGUKKyAgICAgUmVnUXVlcnlWYWx1ZUV4KCksIHdhcyBvdmVyd3JpdGluZyBtZW1vcnkgKGl0IHdyb3RlIHR3aWNlIHRoZQorICAgICBhbGxvY2F0ZWQgc2l6ZSBvZiBhIGJ1ZmZlciB0byBhIGJ1ZmZlciBhbGxvY2F0ZWQgYnkgdGhlIE5UIGtlcm5lbCkuCisgICAgIE9UT0ggdGhpcyBjb3VsZCBiZSBjb21pbmcgZnJvbSB0aGUgZXh0ZXJuYWwgbW9kdWxlIGNhbGxpbmcgYmFjayBpbnRvCisgICAgIHRoZSBrZXJuZWwsIHdoaWNoIGV2ZW50dWFsbHkgY2F1c2VzIHRoZSBwcm9ibGVtIGRlc2NyaWJlZCBhYm92ZS4KKworICAgICBQb3NzaWJseSBhcyBhbiBleHRlbnNpb24gb2YgdGhlIHByb2JsZW0gdGhhdCB0aGUga3JubFdhaXRTZW1hcGhvcmUoKQorICAgICBjYWxsIGFib3ZlIHdvcmtzIGFyb3VuZCwgcnVubmluZyB0d28gaW5zdGFuY2VzIG9mIGNyeXB0bGliIChlLmcuIHR3bworICAgICBhcHBsaWNhdGlvbnMgdGhhdCB1c2UgaXQpIHVuZGVyIE5UNCBjYW4gcmVzdWx0IGluIG9uZSBvZiB0aGVtIGhhbmdpbmcKKyAgICAgaW4gdGhlIFJlZ1F1ZXJ5VmFsdWVFeCgpIGNhbGwuICBUaGlzIGhhcHBlbnMgb25seSB1bmRlciBOVDQgYW5kIGlzCisgICAgIGhhcmQgdG8gcmVwcm9kdWNlIGluIGFueSBjb25zaXN0ZW50IG1hbm5lci4KKworICAgICBPbmUgd29ya2Fyb3VuZCB0aGF0IGhlbHBzIGEgYml0IGlzIHRvIHJlYWQgdGhlIHJlZ2lzdHJ5IGFzIGEgcmVtb3RlCisgICAgIChyYXRoZXIgdGhhbiBsb2NhbCkgcmVnaXN0cnksIGl0J3MgcG9zc2libGUgdGhhdCB0aGUgdXNlIG9mIGEgbmV0d29yaworICAgICBSUEMgY2FsbCBpc29sYXRlcyB0aGUgY2FsbGluZyBhcHAgZnJvbSB0aGUgcHJvYmxlbSBpbiB0aGF0IHdoYXRldmVyCisgICAgIHNlcnZpY2UgaGFuZGxlcyB0aGUgUlBDIGlzIHRha2luZyB0aGUgaGl0IGFuZCBub3QgYWZmZWN0aW5nIHRoZQorICAgICBjYWxsaW5nIGFwcC4gIFNpbmNlIHRoaXMgd291bGQgcmVxdWlyZSBhbm90aGVyIHJvdW5kIG9mIGV4dGVuc2l2ZQorICAgICB0ZXN0aW5nIHRvIHZlcmlmeSBhbmQgdGhlIE5UIG5hdGl2ZSBBUEkgY2FsbCBpcyB3b3JraW5nIGZpbmUsIHdlJ2xsCisgICAgIHN0aWNrIHdpdGggdGhlIG5hdGl2ZSBBUEkgY2FsbCBmb3Igbm93LgorCisgICAgIFNvbWUgdmVyc2lvbnMgb2YgTlQ0IGhhZCBhIHByb2JsZW0gd2hlcmUgdGhlIGFtb3VudCBvZiBkYXRhIHJldHVybmVkCisgICAgIHdhcyBtaXMtcmVwb3J0ZWQgYW5kIHdvdWxkIG5ldmVyIHNldHRsZSBkb3duLCBiZWNhdXNlIG9mIHRoaXMgdGhlIGNvZGUKKyAgICAgYmVsb3cgaW5jbHVkZXMgYSBzYWZldHktY2F0Y2ggdGhhdCBiYWlscyBvdXQgYWZ0ZXIgMTAgYXR0ZW1wdHMgaGF2ZQorICAgICBiZWVuIG1hZGUsIHRoaXMgcmVzdWx0cyBpbiBubyBkYXRhIGJlaW5nIHJldHVybmVkIGJ1dCBhdCBkb2VzIGVuc3VyZQorICAgICB0aGF0IHRoZSB0aHJlYWQgd2lsbCB0ZXJtaW5hdGUuCisKKyAgICAgSW4gYWRkaXRpb24gdG8gdGhlc2UgcHJvYmxlbXMgdGhlIGNvZGUgaW4gUmVnUXVlcnlWYWx1ZUV4KCkgdGhhdAorICAgICBlc3RpbWF0ZXMgdGhlIGFtb3VudCBvZiBtZW1vcnkgcmVxdWlyZWQgdG8gcmV0dXJuIHRoZSBwZXJmb3JtYW5jZQorICAgICBjb3VudGVyIGluZm9ybWF0aW9uIGlzbid0IHZlcnkgYWNjdXJhdGUgKGl0J3MgbXVjaCB3b3JzZSB0aGFuIHRoZQorICAgICAic2xpZ2h0bHktaW5hY2N1cmF0ZSIgbGV2ZWwgdGhhdCB0aGUgTVMgZG9jcyB3YXJuIGFib3V0LCBpdCdzIHVzdWFsbHkKKyAgICAgd2lsZGx5IG9mZikgc2luY2UgaXQgYWx3YXlzIHJldHVybnMgYSB3b3JzdC1jYXNlIGVzdGltYXRlIHdoaWNoIGlzCisgICAgIHVzdWFsbHkgbm93aGVyZSBuZWFyIHRoZSBhY3R1YWwgYW1vdW50IHJlcXVpcmVkLiAgRm9yIGV4YW1wbGUgaXQgbWF5CisgICAgIHJlcG9ydCB0aGF0IDEyOEsgb2YgbWVtb3J5IGlzIHJlcXVpcmVkLCBidXQgb25seSByZXR1cm4gNjRLIG9mIGRhdGEuCisKKyAgICAgRXZlbiB3b3JzZSB0aGFuIHRoZSByZWdpc3RyeS1iYXNlZCBwZXJmb3JtYW5jZSBjb3VudGVycyBpcyB0aGUKKyAgICAgcGVyZm9ybWFuY2UgZGF0YSBoZWxwZXIgKFBESCkgc2hpbSB0aGF0IHRyaWVzIHRvIG1ha2UgdGhlIGNvdW50ZXJzCisgICAgIGxvb2sgbGlrZSB0aGUgb2xkIFdpbjE2IEFQSSAod2hpY2ggaXMgYWxzbyB1c2VkIGJ5IFdpbjk1KS4gIFVuZGVyIE5UCisgICAgIHRoaXMgY2FuIGNvbnN1bWUgdGVucyBvZiBNQiBvZiBtZW1vcnkgYW5kIGh1Z2UgYW1vdW50cyBvZiBDUFUgdGltZQorICAgICB3aGlsZSBpdCBnYXRoZXJzIGl0cyBkYXRhLCBhbmQgZXZlbiBydW5uaW5nIG9uY2UgY2FuIHN0aWxsIGNvbnN1bWUKKyAgICAgYWJvdXQgMS8yTUIgb2YgbWVtb3J5ICovCisgIHBQZXJmRGF0YSA9IGdjcnlfeG1hbGxvYyAoY2JQZXJmRGF0YSk7CisgIGZvciAoaXRlcmF0aW9ucz0wOyBpdGVyYXRpb25zIDwgMTA7IGl0ZXJhdGlvbnMrKykKKyAgICB7CisgICAgICBkd1NpemUgPSBjYlBlcmZEYXRhOworICAgICAgaWYgKCBkZWJ1Z19tZSApCisgICAgICAgIGxvZ19kZWJ1ZyAoInJuZHczMiNzbG93X2dhdGhlcmVyX250OiBnZXQgcGVyZiBkYXRhXG4iICk7CisKKyAgICAgIHN0YXR1cyA9IFJlZ1F1ZXJ5VmFsdWVFeCAoSEtFWV9QRVJGT1JNQU5DRV9EQVRBLCAiR2xvYmFsIiwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgKExQQllURSkgcFBlcmZEYXRhLCAmZHdTaXplKTsKKyAgICAgIGlmIChzdGF0dXMgPT0gRVJST1JfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgIGlmICghbWVtY21wIChwUGVyZkRhdGEtPlNpZ25hdHVyZSwgTCJQRVJGIiwgOCkpCisgICAgICAgICAgICAoKmFkZCkgKCBwUGVyZkRhdGEsIGR3U2l6ZSwgcmVxdWVzdGVyICk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgbG9nX2RlYnVnICgicm5kdzMyOiBubyBQRVJGIHNpZ25hdHVyZVxuIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0YXR1cyA9PSBFUlJPUl9NT1JFX0RBVEEpCisgICAgICAgIHsKKyAgICAgICAgICBjYlBlcmZEYXRhICs9IFBFUkZPUk1BTkNFX0JVRkZFUl9TVEVQOworICAgICAgICAgIHBQZXJmRGF0YSA9IGdjcnlfeHJlYWxsb2MgKHBQZXJmRGF0YSwgY2JQZXJmRGF0YSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHN0YXRpYyBpbnQgYmVlbl9oZXJlOworCisgICAgICAgICAgLyogU2lsZW5jZSB0aGUgZXJyb3IgbWVzc2FnZS4gIEluIHBhcnRpY3VsYXIgdW5kZXIgV2luZSAoYXMKKyAgICAgICAgICAgICBvZiAyMDA4KSB3ZSB3b3VsZCBnZXQgc3dhbXBlZCB3aXRoIHN1Y2ggZGlhZ25vdGlzY3MuICBPbmUKKyAgICAgICAgICAgICBzdWNoIGRpYWdub3Rpc2NzIHNob3VsZCBiZSBlbm91Z2guICAqLworICAgICAgICAgIGlmIChiZWVuX2hlcmUgIT0gc3RhdHVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBiZWVuX2hlcmUgPSBzdGF0dXM7CisgICAgICAgICAgICAgIGxvZ19kZWJ1ZyAoInJuZHczMjogZ2V0IHBlcmZvcm1hbmNlIGRhdGEgcHJvYmxlbTogZWM9JWxkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgIGdjcnlfZnJlZSAocFBlcmZEYXRhKTsKKworICAvKiBBbHRob3VnaCB0aGlzIGlzbid0IGRvY3VtZW50ZWQgaW4gdGhlIFdpbjMyIEFQSSBkb2NzLCBpdCdzIG5lY2Vzc2FyeQorICAgICB0byBleHBsaWNpdGx5IGNsb3NlIHRoZSBIS0VZX1BFUkZPUk1BTkNFX0RBVEEga2V5IGFmdGVyIHVzZSAoaXQncworICAgICBpbXBsaWNpdGx5IG9wZW5lZCBvbiB0aGUgZmlyc3QgY2FsbCB0byBSZWdRdWVyeVZhbHVlRXgoKSkuICBJZiB0aGlzCisgICAgIGlzbid0IGRvbmUgdGhlbiBhbnkgc3lzdGVtIGNvbXBvbmVudHMgd2hpY2ggcHJvdmlkZSBwZXJmb3JtYW5jZSBkYXRhCisgICAgIGNhbid0IGJlIHJlbW92ZWQgb3IgY2hhbmdlZCB3aGlsZSB0aGUgaGFuZGxlIHJlbWFpbnMgYWN0aXZlLiAgKi8KKyAgUmVnQ2xvc2VLZXkgKEhLRVlfUEVSRk9STUFOQ0VfREFUQSk7Cit9CisKKworc3RhdGljIHZvaWQKK3Nsb3dfZ2F0aGVyZXIgKCB2b2lkICgqYWRkKShjb25zdCB2b2lkKiwgc2l6ZV90LCBlbnVtIHJhbmRvbV9vcmlnaW5zKSwgCisgICAgICAgICAgICAgICAgZW51bSByYW5kb21fb3JpZ2lucyByZXF1ZXN0ZXIgKQoreworICBzdGF0aWMgaW50IGlzX2luaXRpYWxpemVkID0gMDsKKyAgc3RhdGljIGludCBpc193b3Jrc3RhdGlvbiA9IDE7CisgIEhBTkRMRSBoRGV2aWNlOworICBEV09SRCBkd1R5cGUsIGR3U2l6ZSwgZHdSZXN1bHQ7CisgIFVMT05HIHVsU2l6ZTsKKyAgaW50IGRyaXZlX25vLCBzdGF0dXM7CisgIGludCBub19yZXN1bHRzID0gMDsKKyAgdm9pZCAqYnVmZmVyOworCisgIGlmICggIWlzX2luaXRpYWxpemVkICkKKyAgICB7CisgICAgICBIS0VZIGhLZXk7CisKKyAgICAgIGlmICggZGVidWdfbWUgKQorICAgICAgICBsb2dfZGVidWcgKCJybmR3MzIjc2xvd19nYXRoZXJlcjogaW5pdCB0b29sa2l0XG4iICk7CisgICAgICAvKiBGaW5kIG91dCB3aGV0aGVyIHRoaXMgaXMgYW4gTlQgc2VydmVyIG9yIHdvcmtzdGF0aW9uIGlmIG5lY2Vzc2FyeSAqLworICAgICAgaWYgKFJlZ09wZW5LZXlFeCAoSEtFWV9MT0NBTF9NQUNISU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgIlNZU1RFTVxcQ3VycmVudENvbnRyb2xTZXRcXENvbnRyb2xcXFByb2R1Y3RPcHRpb25zIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIEtFWV9SRUFELCAmaEtleSkgPT0gRVJST1JfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgIEJZVEUgc3pWYWx1ZVszMiArIDhdOworICAgICAgICAgIGR3U2l6ZSA9IDMyOworCisgICAgICAgICAgaWYgKCBkZWJ1Z19tZSApCisgICAgICAgICAgICBsb2dfZGVidWcgKCJybmR3MzIjc2xvd19nYXRoZXJlcjogY2hlY2sgcHJvZHVjdCBvcHRpb25zXG4iICk7CisKKyAgICAgICAgICBzdGF0dXMgPSBSZWdRdWVyeVZhbHVlRXggKGhLZXksICJQcm9kdWN0VHlwZSIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzelZhbHVlLCAmZHdTaXplKTsKKyAgICAgICAgICBpZiAoc3RhdHVzID09IEVSUk9SX1NVQ0NFU1MgJiYgc3RyaWNtcCAoc3pWYWx1ZSwgIldpbk5UIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIE5vdGU6IFRoZXJlIGFyZSAoYXQgbGVhc3QpIHRocmVlIGNhc2VzIGZvciBQcm9kdWN0VHlwZToKKyAgICAgICAgICAgICAgICAgV2luTlQgPSBOVCBXb3Jrc3RhdGlvbiwgU2VydmVyTlQgPSBOVCBTZXJ2ZXIsIExhbm1hbk5UID0KKyAgICAgICAgICAgICAgICAgTlQgU2VydmVyIGFjdGluZyBhcyBhIERvbWFpbiBDb250cm9sbGVyLiAgKi8KKyAgICAgICAgICAgICAgaXNfd29ya3N0YXRpb24gPSAwOworICAgICAgICAgICAgICBpZiAoIGRlYnVnX21lICkKKyAgICAgICAgICAgICAgICBsb2dfZGVidWcgKCJybmR3MzI6IHRoaXMgaXMgYSBOVCBzZXJ2ZXJcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgIFJlZ0Nsb3NlS2V5IChoS2V5KTsKKyAgICAgICAgfQorCisgICAgICAvKiBUaGUgZm9sbG93aW5nIGFyZSBmaXhlZCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBwcm9jZXNzIHNvIHdlCisgICAgICAgICBvbmx5IGFkZCB0aGVtIG9uY2UgKi8KKyAgICAgIC8qIHJlYWRQblBEYXRhICgpOyAgLSB3ZSBoYXZlIG5vdCBpbXBsZW1lbnRlZCB0aGF0LiAgKi8KKworICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgTmV0QVBJMzIgZnVuY3Rpb24gcG9pbnRlcnMgaWYgbmVjZXNzYXJ5ICovCisgICAgICBoTmV0QVBJMzIgPSBMb2FkTGlicmFyeSAoIk5FVEFQSTMyLkRMTCIpOworICAgICAgaWYgKGhOZXRBUEkzMikKKyAgICAgICAgeworICAgICAgICAgIGlmIChkZWJ1Z19tZSkKKyAgICAgICAgICAgIGxvZ19kZWJ1ZyAoInJuZHczMiNzbG93X2dhdGhlcmVyOiBuZXRhcGkzMiBsb2FkZWRcbiIgKTsKKyAgICAgICAgICBwTmV0U3RhdGlzdGljc0dldCA9IChORVRTVEFUSVNUSUNTR0VUKQorICAgICAgICAgICAgR2V0UHJvY0FkZHJlc3MgKGhOZXRBUEkzMiwgIk5ldFN0YXRpc3RpY3NHZXQiKTsKKyAgICAgICAgICBwTmV0QXBpQnVmZmVyU2l6ZSA9IChORVRBUElCVUZGRVJTSVpFKQorICAgICAgICAgICAgR2V0UHJvY0FkZHJlc3MgKGhOZXRBUEkzMiwgIk5ldEFwaUJ1ZmZlclNpemUiKTsKKyAgICAgICAgICBwTmV0QXBpQnVmZmVyRnJlZSA9IChORVRBUElCVUZGRVJGUkVFKQorICAgICAgICAgICAgR2V0UHJvY0FkZHJlc3MgKGhOZXRBUEkzMiwgIk5ldEFwaUJ1ZmZlckZyZWUiKTsKKworICAgICAgICAgIGlmICghcE5ldFN0YXRpc3RpY3NHZXQgfHwgIXBOZXRBcGlCdWZmZXJTaXplIHx8ICFwTmV0QXBpQnVmZmVyRnJlZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgRnJlZUxpYnJhcnkgKGhOZXRBUEkzMik7CisgICAgICAgICAgICAgIGhOZXRBUEkzMiA9IE5VTEw7CisgICAgICAgICAgICAgIGxvZ19kZWJ1ZyAoInJuZHczMjogTm8gTkVUQVBJIGZvdW5kXG4iICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgTlQga2VybmVsIG5hdGl2ZSBBUEkgZnVuY3Rpb24gcG9pbnRlcnMgaWYgbmVjZXNzYXJ5ICovCisgICAgICBoTlRBUEkgPSBHZXRNb2R1bGVIYW5kbGUgKCJOVERsbC5kbGwiKTsKKyAgICAgIGlmIChoTlRBUEkpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBHZXQgYSBwb2ludGVyIHRvIHRoZSBOVCBuYXRpdmUgaW5mb3JtYXRpb24gcXVlcnkgZnVuY3Rpb25zICovCisgICAgICAgICAgcE50UXVlcnlTeXN0ZW1JbmZvcm1hdGlvbiA9IChOVFFVRVJZU1lTVEVNSU5GT1JNQVRJT04pCisgICAgICAgICAgICBHZXRQcm9jQWRkcmVzcyAoaE5UQVBJLCAiTnRRdWVyeVN5c3RlbUluZm9ybWF0aW9uIik7CisgICAgICAgICAgcE50UXVlcnlJbmZvcm1hdGlvblByb2Nlc3MgPSAoTlRRVUVSWUlORk9STUFUSU9OUFJPQ0VTUykKKyAgICAgICAgICAgIEdldFByb2NBZGRyZXNzIChoTlRBUEksICJOdFF1ZXJ5SW5mb3JtYXRpb25Qcm9jZXNzIik7CisgICAgICAgICAgcE50UG93ZXJJbmZvcm1hdGlvbiA9IChOVFBPV0VSSU5GT1JNQVRJT04pCisgICAgICAgICAgICBHZXRQcm9jQWRkcmVzcyhoTlRBUEksICJOdFBvd2VySW5mb3JtYXRpb24iKTsKKworICAgICAgICAgIGlmICghcE50UXVlcnlTeXN0ZW1JbmZvcm1hdGlvbiB8fCAhcE50UXVlcnlJbmZvcm1hdGlvblByb2Nlc3MpCisgICAgICAgICAgICBoTlRBUEkgPSBOVUxMOworICAgICAgICB9CisKKworICAgICAgaXNfaW5pdGlhbGl6ZWQgPSAxOworICAgIH0KKyAgCisgIHJlYWRfc3lzdGVtX3JuZyAoIGFkZCwgcmVxdWVzdGVyICk7CisgIHJlYWRfbWJtX2RhdGEgKCBhZGQsIHJlcXVlc3RlciApOworICAKKyAgLyogR2V0IG5ldHdvcmsgc3RhdGlzdGljcy4gICAgTm90ZTogQm90aCBOVCBXb3Jrc3RhdGlvbiBhbmQgTlQgU2VydmVyIGJ5CisgICAgIGRlZmF1bHQgd2lsbCBiZSBydW5uaW5nIGJvdGggdGhlIHdvcmtzdGF0aW9uIGFuZCBzZXJ2ZXIgc2VydmljZXMuICBUaGUKKyAgICAgaGV1cmlzdGljIGJlbG93IGlzIHByb2JhYmx5IHVzZWZ1bCB0aG91Z2ggb24gdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUKKyAgICAgbWFqb3JpdHkgb2YgdGhlIG5ldHdvcmsgdHJhZmZpYyB3aWxsIGJlIHZpYSB0aGUgYXBwcm9wcmlhdGUgc2VydmljZS4KKyAgICAgSW4gYW55IGNhc2UgdGhlIG5ldHdvcmsgc3RhdGlzdGljcyByZXR1cm4gYWxtb3N0IG5vIHJhbmRvbW5lc3MuICAqLworICB7CisgICAgTFBCWVRFIGxwQnVmZmVyOworICAgIAorICAgIGlmIChoTmV0QVBJMzIKKyAgICAgICAgJiYgIXBOZXRTdGF0aXN0aWNzR2V0IChOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3dvcmtzdGF0aW9uID8gTCJMYW5tYW5Xb3Jrc3RhdGlvbiIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiTGFubWFuU2VydmVyIiwgMCwgMCwgJmxwQnVmZmVyKSkKKyAgICAgIHsKKyAgICAgICAgaWYgKCBkZWJ1Z19tZSApCisgICAgICAgICAgbG9nX2RlYnVnICgicm5kdzMyI3Nsb3dfZ2F0aGVyZXI6IGdldCBuZXRzdGF0c1xuIiApOworICAgICAgICBwTmV0QXBpQnVmZmVyU2l6ZSAobHBCdWZmZXIsICZkd1NpemUpOworICAgICAgICAoKmFkZCkgKCBscEJ1ZmZlciwgZHdTaXplLCByZXF1ZXN0ZXIgKTsKKyAgICAgICAgcE5ldEFwaUJ1ZmZlckZyZWUgKGxwQnVmZmVyKTsKKyAgICAgIH0KKyAgfQorCisgIC8qIEdldCBkaXNrIEkvTyBzdGF0aXN0aWNzIGZvciBhbGwgdGhlIGhhcmQgZHJpdmVzLiAgMTAwIGlzIGFuCisgICAgIGFyYml0cmFyeSBmYWlsc2FmZSBsaW1pdC4gICovCisgIGZvciAoZHJpdmVfbm8gPSAwOyBkcml2ZV9ubyA8IDEwMCA7IGRyaXZlX25vKyspCisgICAgeworICAgICAgY2hhciBkaXNrUGVyZm9ybWFuY2VbU0laRU9GX0RJU0tfUEVSRk9STUFOQ0VfU1RSVUNUICsgOF07CisgICAgICBjaGFyIHN6RGV2aWNlWzUwXTsKKyAgICAgIAorICAgICAgLyogQ2hlY2sgd2hldGhlciB3ZSBjYW4gYWNjZXNzIHRoaXMgZGV2aWNlLiAgKi8KKyAgICAgIHNucHJpbnRmIChzekRldmljZSwgc2l6ZW9mIHN6RGV2aWNlLCAiXFxcXC5cXFBoeXNpY2FsRHJpdmUlZCIsCisgICAgICAgICAgICAgICAgZHJpdmVfbm8pOworICAgICAgaERldmljZSA9IENyZWF0ZUZpbGUgKHN6RGV2aWNlLCAwLCBGSUxFX1NIQVJFX1JFQUQgfCBGSUxFX1NIQVJFX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE9QRU5fRVhJU1RJTkcsIDAsIE5VTEwpOworICAgICAgaWYgKGhEZXZpY2UgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisgICAgICAgIGJyZWFrOyAvKiBObyBtb3JlIGRyaXZlcy4gICovCisgICAgICAgIAorICAgICAgLyogTm90ZTogVGhpcyBvbmx5IHdvcmtzIGlmIHlvdSBoYXZlIHR1cm5lZCBvbiB0aGUgZGlzayBwZXJmb3JtYW5jZQorICAgICAgICAgY291bnRlcnMgd2l0aCAnZGlza3BlcmYgLXknLiAgVGhlc2UgY291bnRlcnMgYXJlIG9mZiBieSBkZWZhdWx0LiAqLworICAgICAgZHdTaXplID0gc2l6ZW9mIGRpc2tQZXJmb3JtYW5jZTsKKyAgICAgIGlmIChEZXZpY2VJb0NvbnRyb2wgKGhEZXZpY2UsIElPQ1RMX0RJU0tfUEVSRk9STUFOQ0UsIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNrUGVyZm9ybWFuY2UsIFNJWkVPRl9ESVNLX1BFUkZPUk1BTkNFX1NUUlVDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZkd1NpemUsIE5VTEwpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCBkZWJ1Z19tZSApCisgICAgICAgICAgICBsb2dfZGVidWcgKCJybmR3MzIjc2xvd19nYXRoZXJlcjogaW9zdGF0IGRyaXZlICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBkcml2ZV9ubyk7CisgICAgICAgICAgKCphZGQpIChkaXNrUGVyZm9ybWFuY2UsIGR3U2l6ZSwgcmVxdWVzdGVyKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgbG9nX2luZm8gKCJOT1RFOiB5b3Ugc2hvdWxkIHJ1biAnZGlza3BlcmYgLXknICIKKyAgICAgICAgICAgICAgICAgICAgInRvIGVuYWJsZSB0aGUgZGlzayBzdGF0aXN0aWNzXG4iKTsKKyAgICAgICAgfQorICAgICAgQ2xvc2VIYW5kbGUgKGhEZXZpY2UpOworICAgIH0KKworICAvKiBJbiB0aGVvcnkgd2Ugc2hvdWxkIGJlIHVzaW5nIHRoZSBXaW4zMiBwZXJmb3JtYW5jZSBxdWVyeSBBUEkgdG8gb2J0YWluCisgICAgIHVucHJlZGljdGFibGUgZGF0YSBmcm9tIHRoZSBzeXN0ZW0sIGhvd2V2ZXIgdGhpcyBpcyBzbyB1bnJlbGlhYmxlIChzZWUKKyAgICAgdGhlIG11bHRpcGxlIHNldHMgb2YgY29tbWVudHMgaW4gcmVnaXN0cnlQb2xsKCkpIHRoYXQgaXQncyB0b28gcmlza3kKKyAgICAgdG8gcmVseSBvbiBpdCBleGNlcHQgYXMgYSBmYWxsYmFjayBpbiBlbWVyZ2VuY2llcy4gIEluc3RlYWQsIHdlIHJlbHkKKyAgICAgbW9zdGx5IG9uIHRoZSBOVCBuYXRpdmUgQVBJIGZ1bmN0aW9uIE50UXVlcnlTeXN0ZW1JbmZvcm1hdGlvbigpLCB3aGljaAorICAgICBoYXMgdGhlIGR1YWwgYWR2YW50YWdlcyB0aGF0IGl0IGRvZXNuJ3QgaGF2ZSBhcyBtYW55IChrbm93bikgcHJvYmxlbXMKKyAgICAgYXMgdGhlIFdpbjMyIGVxdWl2YWxlbnQgYW5kIHRoYXQgaXQgZG9lc24ndCBhY2Nlc3MgdGhlIGRhdGEgaW5kaXJlY3RseQorICAgICB2aWEgcHNldWRvLXJlZ2lzdHJ5IGtleXMsIHdoaWNoIG1lYW5zIHRoYXQgaXQncyBtdWNoIGZhc3Rlci4gIE5vdGUKKyAgICAgdGhhdCB0aGUgV2luMzIgZXF1aXZhbGVudCBhY3R1YWxseSB3b3JrcyBhbG1vc3QgYWxsIG9mIHRoZSB0aW1lLCB0aGUKKyAgICAgcHJvYmxlbSBpcyB0aGF0IG9uIG9uZSBvciB0d28gc3lzdGVtcyBpdCBjYW4gZmFpbCBpbiBzdHJhbmdlIHdheXMgdGhhdAorICAgICBhcmUgbmV2ZXIgdGhlIHNhbWUgYW5kIGNhbid0IGJlIHJlcHJvZHVjZWQgb24gYW55IG90aGVyIHN5c3RlbSwgd2hpY2gKKyAgICAgaXMgd2h5IHdlIHVzZSB0aGUgbmF0aXZlIEFQSSBoZXJlLiAgTWljcm9zb2Z0IG9mZmljaWFsbHkgZG9jdW1lbnRlZAorICAgICB0aGlzIGZ1bmN0aW9uIGluIGVhcmx5IDIwMDMsIHNvIGl0J2xsIGJlIGZhaXJseSBzYWZlIHRvIHVzZS4gICovCisgIGlmICggIWhOVEFQSSApCisgICAgeworICAgICAgcmVnaXN0cnlfcG9sbCAoYWRkLCByZXF1ZXN0ZXIpOworICAgICAgcmV0dXJuOworICAgIH0KKworCisgIC8qIFNjYW4gdGhlIGZpcnN0IDY0IHBvc3NpYmxlIGluZm9ybWF0aW9uIHR5cGVzICh3ZSBkb24ndCBib3RoZXIgd2l0aAorICAgICBpbmNyZWFzaW5nIHRoZSBidWZmZXIgc2l6ZSBhcyB3ZSBkbyB3aXRoIHRoZSBXaW4zMiB2ZXJzaW9uIG9mIHRoZQorICAgICBwZXJmb3JtYW5jZSBkYXRhIHJlYWQsIHdlIG1heSBtaXNzIGEgZmV3IGNsYXNzZXMgYnV0IGl0J3Mgbm8gYmlnIGRlYWwpLgorICAgICBUaGlzIHNjYW4gdHlwaWNhbGx5IHlpZWxkcyBhcm91bmQgMjAgcGllY2VzIG9mIGRhdGEsIHRoZXJlJ3Mgbm90aGluZworICAgICBpbiB0aGUgcmFuZ2UgNjUuLi4xMjggc28gY2hhbmNlcyBhcmUgdGhlcmUgd29uJ3QgYmUgYW55dGhpbmcgYWJvdmUKKyAgICAgdGhlcmUgZWl0aGVyLiAgKi8KKyAgYnVmZmVyID0gZ2NyeV94bWFsbG9jIChQRVJGT1JNQU5DRV9CVUZGRVJfU0laRSk7CisgIGZvciAoZHdUeXBlID0gMDsgZHdUeXBlIDwgNjQ7IGR3VHlwZSsrKQorICAgIHsKKyAgICAgIHN3aXRjaCAoZHdUeXBlKQorICAgICAgICB7CisgICAgICAgICAgLyogSUQgMTcgPSBTeXN0ZW1PYmplY3RJbmZvcm1hdGlvbiBoYW5ncyBvbiBzb21lIHdpbjJrIHN5c3RlbXMuICAqLworICAgICAgICBjYXNlIDE3OgorICAgICAgICAgIGlmIChzeXN0ZW1faXNfdzIwMDApCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICAgIC8qIFNvbWUgaW5mb3JtYXRpb24gdHlwZXMgYXJlIHdyaXRlLW9ubHkgKHRoZSBJRHMgYXJlIHNoYXJlZCB3aXRoCisgICAgICAgICAgICAgYSBzZXQtaW5mb3JtYXRpb24gY2FsbCksIHdlIHNraXAgdGhlc2UuICAqLworICAgICAgICBjYXNlIDI2OiBjYXNlIDI3OiBjYXNlIDM4OiBjYXNlIDQ2OiBjYXNlIDQ3OiBjYXNlIDQ4OiBjYXNlIDUyOgorICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgLyogSUQgNTMgPSBTeXN0ZW1TZXNzaW9uUHJvY2Vzc0luZm9ybWF0aW9uIHJlYWRzIGlucHV0IGZyb20gdGhlCisgICAgICAgICAgICAgb3V0cHV0IGJ1ZmZlciwgd2hpY2ggaGFzIHRvIGNvbnRhaW4gYSBzZXNzaW9uIElEIGFuZCBwb2ludGVyCisgICAgICAgICAgICAgdG8gdGhlIGFjdHVhbCBidWZmZXIgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIHNlc3Npb24gaW5mb3JtYXRpb24uCisgICAgICAgICAgICAgQmVjYXVzZSB0aGlzIGlzbid0IGEgc3RhbmRhcmQgcXVlcnksIHdlIHNraXAgdGhpcy4gICovCisgICAgICAgIGNhc2UgIDUzOgorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgIC8qIFF1ZXJ5IHRoZSBpbmZvIGZvciB0aGlzIElELiAgU29tZSByZXN1bHRzIChmb3IgZXhhbXBsZSBmb3IKKyAgICAgICAgIElEID0gNiwgU3lzdGVtQ2FsbENvdW50cykgYXJlIG9ubHkgYXZhaWxhYmxlIGluIGNoZWNrZWQgYnVpbGRzCisgICAgICAgICBvZiB0aGUga2VybmVsLiAgQSBzbWFsbGVyIHN1YmNsZXNzIG9mIHJlc3VsdHMgcmVxdWlyZSB0aGF0CisgICAgICAgICBjZXJ0YWluIHN5c3RlbSBjb25maWcgZmxhZ3MgYmUgc2V0LCBmb3IgZXhhbXBsZQorICAgICAgICAgU3lzdGVtT2JqZWN0SW5mb3JtYXRpb24gcmVxdWlyZXMgdGhhdCB0aGUKKyAgICAgICAgIEZMR19NQUlOVEFJTl9PQkpFQ1RfVFlQRUxJU1QgYmUgc2V0IGluIE50R2xvYmFsRmxhZ3MuICBUbyBhdm9pZAorICAgICAgICAgaGF2aW5nIHRvIHNwZWNpYWwtY2FzZSBhbGwgb2YgdGhlc2UsIHdlIHRyeSByZWFkaW5nIGVhY2ggb25lIGFuZAorICAgICAgICAgb25seSB1c2UgdGhvc2UgZm9yIHdoaWNoIHdlIGdldCBhIHN1Y2Nlc3Mgc3RhdHVzLiAgKi8KKyAgICAgIGR3UmVzdWx0ID0gcE50UXVlcnlTeXN0ZW1JbmZvcm1hdGlvbiAoZHdUeXBlLCBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFUkZPUk1BTkNFX0JVRkZFUl9TSVpFIC0gMjA0OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVsU2l6ZSk7CisgICAgICBpZiAoZHdSZXN1bHQgIT0gRVJST1JfU1VDQ0VTUykKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIC8qIFNvbWUgY2FsbHMgKGUuZy4gSUQgPSAyMywgU3lzdGVtUHJvY2Vzc29yU3RhdGlzdGljcywgYW5kIElEID0gMjQsCisgICAgICAgICBTeXN0ZW1EcGNJbmZvcm1hdGlvbikgaW5jb3JyZWN0bHkgcmV0dXJuIGEgbGVuZ3RoIG9mIHplcm8sIHNvIHdlCisgICAgICAgICBtYW51YWxseSBhZGp1c3QgdGhlIGxlbmd0aCB0byB0aGUgY29ycmVjdCB2YWx1ZS4gICovCisgICAgICBpZiAoICF1bFNpemUgKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGR3VHlwZSA9PSAyMykKKyAgICAgICAgICAgIHVsU2l6ZSA9IDYgKiBzaXplb2YgKFVMT05HKTsKKyAgICAgICAgICBlbHNlIGlmIChkd1R5cGUgPT0gMjQpCisgICAgICAgICAgICB1bFNpemUgPSA1ICogc2l6ZW9mIChVTE9ORyk7CisgICAgICAgIH0KKworICAgICAgLyogSWYgd2UgZ290IHNvbWUgZGF0YSBiYWNrLCBhZGQgaXQgdG8gdGhlIGVudHJvcHkgcG9vbC4gICovCisgICAgICBpZiAodWxTaXplID4gMCAmJiB1bFNpemUgPD0gUEVSRk9STUFOQ0VfQlVGRkVSX1NJWkUgLSAyMDQ4KQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRlYnVnX21lKQorICAgICAgICAgICAgbG9nX2RlYnVnICgicm5kdzMyI3Nsb3dfZ2F0aGVyZXI6ICVsdSBieXRlcyBmcm9tIHN5c2luZm8gJWxkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICB1bFNpemUsIGR3VHlwZSk7CisgICAgICAgICAgKCphZGQpIChidWZmZXIsIHVsU2l6ZSwgcmVxdWVzdGVyKTsKKyAgICAgICAgICBub19yZXN1bHRzKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgLyogTm93IHdlIHdvdWxkIGRvIHRoZSBzYW1lIGZvciB0aGUgcHJvY2VzcyBpbmZvcm1hdGlvbi4gIFRoaXMKKyAgICAgY2FsbCB3b3VsZCByYXRoZXIgdWdseSBpbiB0aGF0IGl0IHJlcXVpcmVzIGFuIGV4YWN0IGxlbmd0aAorICAgICBtYXRjaCBmb3IgdGhlIGRhdGEgcmV0dXJuZWQsIGZhaWxpbmcgd2l0aCBhCisgICAgIFNUQVRVU19JTkZPX0xFTkdUSF9NSVNNQVRDSCBlcnJvciBjb2RlICgweEMwMDAwMDA0KSBpZiB0aGUKKyAgICAgbGVuZ3RoIGlzbid0IGFuIGV4YWN0IG1hdGNoLiAgSXQgcmVxdWlyZXMgYSBjb21waWxlciB0byBoYW5kbGUKKyAgICAgY29tcGxleCBuZXN0ZWQgc3RydWN0cywgYWxpZ25tZW50IGlzc3VlcywgYW5kIHNvIG9uLCBhbmQKKyAgICAgd2l0aG91dCB0aGUgaGVhZGVycyBpbiB3aGljaCB0aGUgZW50cmllcyBhcmUgZGVjbGFyZWQgaXQncworICAgICBhbG1vc3QgaW1wb3NzaWJsZSB0byBkby4gIFRodXMgd2UgZG9uJ3QuICAqLworCisKKyAgLyogRmluYWxseSwgZG8gdGhlIHNhbWUgZm9yIHRoZSBzeXN0ZW0gcG93ZXIgc3RhdHVzIGluZm9ybWF0aW9uLiAgVGhlcmUKKyAgICAgYXJlIG9ubHkgYSBsaW1pdGVkIG51bWJlciBvZiB1c2VmdWwgaW5mb3JtYXRpb24gdHlwZXMgYXZhaWxhYmxlIHNvIHdlCisgICAgIHJlc3RyaWN0IG91cnNlbHZlcyB0byB0aGUgdXNlZnVsIHR5cGVzLiAgSW4gYWRkaXRpb24gc2luY2UgdGhpcworICAgICBmdW5jdGlvbiBkb2Vzbid0IHJldHVybiBsZW5ndGggaW5mb3JtYXRpb24sIHdlIGhhdmUgdG8gaGFyZGNvZGUgaW4KKyAgICAgbGVuZ3RoIGRhdGEuICAqLworICBpZiAocE50UG93ZXJJbmZvcm1hdGlvbikKKyAgICB7CisgICAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsgaW50IHR5cGU7IGludCBzaXplOyB9IHBvd2VySW5mb1tdID0geworICAgICAgICB7IDAsIDEyOCB9LCAgICAgLyogU3lzdGVtUG93ZXJQb2xpY3lBYyAqLworICAgICAgICB7IDEsIDEyOCB9LCAgICAgLyogU3lzdGVtUG93ZXJQb2xpY3lEYyAqLworICAgICAgICB7IDQsIDY0IH0sICAgICAgLyogU3lzdGVtUG93ZXJDYXBhYmlsaXRpZXMgKi8KKyAgICAgICAgeyA1LCA0OCB9LCAgICAgIC8qIFN5c3RlbUJhdHRlcnlTdGF0ZSAqLworICAgICAgICB7IDExLCA0OCB9LCAgICAgLyogUHJvY2Vzc29ySW5mb3JtYXRpb24gKi8KKyAgICAgICAgeyAxMiwgMjQgfSwgICAgIC8qIFN5c3RlbVBvd2VySW5mb3JtYXRpb24gKi8KKyAgICAgICAgeyAtMSwgLTEgfQorICAgICAgfTsKKyAgICAgIGludCBpOworCisgICAgICAvKiBUaGUgMTAwIGlzIGEgZmFpbHNhZmUgbGltaXQuICAqLworICAgICAgZm9yIChpID0gMDsgcG93ZXJJbmZvW2ldLnR5cGUgIT0gLTEgJiYgaSA8IDEwMDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgIC8qIFF1ZXJ5IHRoZSBpbmZvIGZvciB0aGlzIElEICovCisgICAgICAgICAgZHdSZXN1bHQgPSBwTnRQb3dlckluZm9ybWF0aW9uIChwb3dlckluZm9baV0udHlwZSwgTlVMTCwgMCwgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEVSRk9STUFOQ0VfQlVGRkVSX1NJWkUgLSAyMDQ4KTsKKyAgICAgICAgICBpZiAoZHdSZXN1bHQgIT0gRVJST1JfU1VDQ0VTUykKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIGlmIChkZWJ1Z19tZSkKKyAgICAgICAgICAgIGxvZ19kZWJ1ZyAoInJuZHczMiNzbG93X2dhdGhlcmVyOiAldSBieXRlcyBmcm9tIHBvd2VyaW5mbyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcG93ZXJJbmZvW2ldLnNpemUsIGkpOworICAgICAgICAgICgqYWRkKSAoYnVmZmVyLCBwb3dlckluZm9baV0uc2l6ZSwgcmVxdWVzdGVyKTsKKyAgICAgICAgICBub19yZXN1bHRzKys7CisgICAgICAgIH0KKyAgICAgIGdjcnlfYXNzZXJ0IChpIDwgMTAwKTsKKyAgICB9CisgIGdjcnlfZnJlZSAoYnVmZmVyKTsKKworICAvKiBXZSBjb3VsZG4ndCBnZXQgZW5vdWdoIHJlc3VsdHMgZnJvbSB0aGUga2VybmVsLCBmYWxsIGJhY2sgdG8gdGhlCisgICAgIHNvbWV3aGF0IHRyb3VibGVzb21lIHJlZ2lzdHJ5IHBvbGwuICAqLworICBpZiAobm9fcmVzdWx0cyA8IDE1KQorICAgIHJlZ2lzdHJ5X3BvbGwgKGFkZCwgcmVxdWVzdGVyKTsKK30KKworCitpbnQKK19nY3J5X3JuZHczMl9nYXRoZXJfcmFuZG9tICh2b2lkICgqYWRkKShjb25zdCB2b2lkKiwgc2l6ZV90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gcmFuZG9tX29yaWdpbnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gcmFuZG9tX29yaWdpbnMgb3JpZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgsIGludCBsZXZlbCApCit7CisgIHN0YXRpYyBpbnQgaXNfaW5pdGlhbGl6ZWQ7CisKKyAgaWYgKCFsZXZlbCkKKyAgICByZXR1cm4gMDsKKworICAvKiBXZSBkb24ndCBkaWZmZXJlbnRpYXRlIGJldHdlZW4gbGV2ZWwgMSBhbmQgMiBoZXJlIGJlY2F1c2UgdGhlcmUKKyAgICAgaXMgbm8gaW50ZXJuYWwgZW50cm9weSBwb29sIGFzIGEgc2NhcnkgcmVzb3VyY2UuICBJdCBtYXkgYWxsIHdvcmsKKyAgICAgc2xvd2VyLCBidXQgYmVjYXVzZSBvdXIgZW50cm9weSBzb3VyY2Ugd2lsbCBuZXZlciBibG9jayBidXQKKyAgICAgZGVsaXZlciBzb21lIG5vdCBlYXN5IHRvIG1lYXN1cmUgZW50cm9weSwgd2UgYXNzdW1lIGxldmVsIDIuICAqLworCisgIGlmICghaXNfaW5pdGlhbGl6ZWQpCisgICAgeworICAgICAgT1NWRVJTSU9OSU5GTyBvc3ZpID0geyBzaXplb2YoIG9zdmkgKSB9OworCisgICAgICBHZXRWZXJzaW9uRXgoICZvc3ZpICk7CisgICAgICBpZiAoIG9zdmkuZHdQbGF0Zm9ybUlkICE9IFZFUl9QTEFURk9STV9XSU4zMl9OVCkKKyAgICAgICAgbG9nX2ZhdGFsICgiY2FuIG9ubHkgcnVuIG9uIGEgV2luZG93cyBOVCBwbGF0Zm9ybVxuIiApOworICAgICAgc3lzdGVtX2lzX3cyMDAwID0gKG9zdmkuZHdNYWpvclZlcnNpb24gPT0gNSAmJiBvc3ZpLmR3TWlub3JWZXJzaW9uID09IDApOworICAgICAgaW5pdF9zeXN0ZW1fcm5nICgpOworICAgICAgaXNfaW5pdGlhbGl6ZWQgPSAxOworICAgIH0KKworICBpZiAoZGVidWdfbWUpCisgICAgbG9nX2RlYnVnICgicm5kdzMyI2dhdGhlcl9yYW5kb206IG9yaT0lZCBsZW49JXUgbHZsPSVkXG4iLAorICAgICAgICAgICAgICAgb3JpZ2luLCAodW5zaWduZWQgaW50KWxlbmd0aCwgbGV2ZWwgKTsKKworICBzbG93X2dhdGhlcmVyIChhZGQsIG9yaWdpbik7CisKKyAgcmV0dXJuIDA7Cit9CisKKworCit2b2lkCitfZ2NyeV9ybmR3MzJfZ2F0aGVyX3JhbmRvbV9mYXN0ICh2b2lkICgqYWRkKShjb25zdCB2b2lkKiwgc2l6ZV90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSByYW5kb21fb3JpZ2lucyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIHJhbmRvbV9vcmlnaW5zIG9yaWdpbikKK3sKKyAgc3RhdGljIGludCBhZGRlZEZpeGVkSXRlbXMgPSAwOworCisgIGlmICggZGVidWdfbWUgKQorICAgIGxvZ19kZWJ1ZyAoInJuZHczMiNnYXRoZXJfcmFuZG9tX2Zhc3Q6IG9yaT0lZFxuIiwgb3JpZ2luICk7CisKKyAgLyogR2V0IHZhcmlvdXMgYmFzaWMgcGllY2VzIG9mIHN5c3RlbSBpbmZvcm1hdGlvbjogSGFuZGxlIG9mIGFjdGl2ZQorICAgICB3aW5kb3csIGhhbmRsZSBvZiB3aW5kb3cgd2l0aCBtb3VzZSBjYXB0dXJlLCBoYW5kbGUgb2YgY2xpcGJvYXJkCisgICAgIG93bmVyIGhhbmRsZSBvZiBzdGFydCBvZiBjbHBib2FyZCB2aWV3ZXIgbGlzdCwgcHNldWRvaGFuZGxlIG9mCisgICAgIGN1cnJlbnQgcHJvY2VzcywgY3VycmVudCBwcm9jZXNzIElELCBwc2V1ZG9oYW5kbGUgb2YgY3VycmVudAorICAgICB0aHJlYWQsIGN1cnJlbnQgdGhyZWFkIElELCBoYW5kbGUgb2YgZGVza3RvcCB3aW5kb3csIGhhbmRsZSBvZgorICAgICB3aW5kb3cgd2l0aCBrZXlib2FyZCBmb2N1cywgd2hldGhlciBzeXN0ZW0gcXVldWUgaGFzIGFueSBldmVudHMsCisgICAgIGN1cnNvciBwb3NpdGlvbiBmb3IgbGFzdCBtZXNzYWdlLCAxIG1zIHRpbWUgZm9yIGxhc3QgbWVzc2FnZSwKKyAgICAgaGFuZGxlIG9mIHdpbmRvdyB3aXRoIGNsaXBib2FyZCBvcGVuLCBoYW5kbGUgb2YgcHJvY2VzcyBoZWFwLAorICAgICBoYW5kbGUgb2YgcHJvY3Mgd2luZG93IHN0YXRpb24sIHR5cGVzIG9mIGV2ZW50cyBpbiBpbnB1dCBxdWV1ZSwKKyAgICAgYW5kIG1pbGxpc2Vjb25kcyBzaW5jZSBXaW5kb3dzIHdhcyBzdGFydGVkLiAgKi8KKworICB7CisgICAgYnl0ZSBidWZmZXJbMjAqc2l6ZW9mKHVsb25nKV0sICpidWZwdHI7CisKKyAgICBidWZwdHIgPSBidWZmZXI7CisjZGVmaW5lIEFERChmKSAgZG8geyB1bG9uZyBhbG9uZyA9ICh1bG9uZykoZik7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgbWVtY3B5IChidWZwdHIsICZhbG9uZywgc2l6ZW9mIChhbG9uZykgKTsgIFwKKyAgICAgICAgICAgICAgICAgICAgIGJ1ZnB0ciArPSBzaXplb2YgKGFsb25nKTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoMCkKKworICAgIEFERCAoIEdldEFjdGl2ZVdpbmRvdyAoKSk7CisgICAgQUREICggR2V0Q2FwdHVyZSAoKSk7CisgICAgQUREICggR2V0Q2xpcGJvYXJkT3duZXIgKCkpOworICAgIEFERCAoIEdldENsaXBib2FyZFZpZXdlciAoKSk7CisgICAgQUREICggR2V0Q3VycmVudFByb2Nlc3MgKCkpOworICAgIEFERCAoIEdldEN1cnJlbnRQcm9jZXNzSWQgKCkpOworICAgIEFERCAoIEdldEN1cnJlbnRUaHJlYWQgKCkpOworICAgIEFERCAoIEdldEN1cnJlbnRUaHJlYWRJZCAoKSk7CisgICAgQUREICggR2V0RGVza3RvcFdpbmRvdyAoKSk7CisgICAgQUREICggR2V0Rm9jdXMgKCkpOworICAgIEFERCAoIEdldElucHV0U3RhdGUgKCkpOworICAgIEFERCAoIEdldE1lc3NhZ2VQb3MgKCkpOworICAgIEFERCAoIEdldE1lc3NhZ2VUaW1lICgpKTsKKyAgICBBREQgKCBHZXRPcGVuQ2xpcGJvYXJkV2luZG93ICgpKTsKKyAgICBBREQgKCBHZXRQcm9jZXNzSGVhcCAoKSk7CisgICAgQUREICggR2V0UHJvY2Vzc1dpbmRvd1N0YXRpb24gKCkpOworICAgIEFERCAoIEdldFF1ZXVlU3RhdHVzIChRU19BTExFVkVOVFMpKTsKKyAgICBBREQgKCBHZXRUaWNrQ291bnQgKCkpOworCisgICAgZ2NyeV9hc3NlcnQgKCBidWZwdHItYnVmZmVyIDwgc2l6ZW9mIChidWZmZXIpICk7CisgICAgKCphZGQpICggYnVmZmVyLCBidWZwdHItYnVmZmVyLCBvcmlnaW4gKTsKKyN1bmRlZiBBREQKKyAgfQorCisgIC8qIEdldCBtdWx0aXdvcmQgc3lzdGVtIGluZm9ybWF0aW9uOiBDdXJyZW50IGNhcmV0IHBvc2l0aW9uLCBjdXJyZW50CisgICAgIG1vdXNlIGN1cnNvciBwb3NpdGlvbi4gICovCisgIHsKKyAgICBQT0lOVCBwb2ludDsKKworICAgIEdldENhcmV0UG9zICgmcG9pbnQpOworICAgICgqYWRkKSAoICZwb2ludCwgc2l6ZW9mIChwb2ludCksIG9yaWdpbiApOworICAgIEdldEN1cnNvclBvcyAoJnBvaW50KTsKKyAgICAoKmFkZCkgKCAmcG9pbnQsIHNpemVvZiAocG9pbnQpLCBvcmlnaW4gKTsKKyAgfQorCisgIC8qIEdldCBwZXJjZW50IG9mIG1lbW9yeSBpbiB1c2UsIGJ5dGVzIG9mIHBoeXNpY2FsIG1lbW9yeSwgYnl0ZXMgb2YKKyAgICAgZnJlZSBwaHlzaWNhbCBtZW1vcnksIGJ5dGVzIGluIHBhZ2luZyBmaWxlLCBmcmVlIGJ5dGVzIGluIHBhZ2luZworICAgICBmaWxlLCB1c2VyIGJ5dGVzIG9mIGFkZHJlc3Mgc3BhY2UsIGFuZCBmcmVlIHVzZXIgYnl0ZXMuICAqLworICB7CisgICAgTUVNT1JZU1RBVFVTIG1lbW9yeVN0YXR1czsKKworICAgIG1lbW9yeVN0YXR1cy5kd0xlbmd0aCA9IHNpemVvZiAoTUVNT1JZU1RBVFVTKTsKKyAgICBHbG9iYWxNZW1vcnlTdGF0dXMgKCZtZW1vcnlTdGF0dXMpOworICAgICgqYWRkKSAoICZtZW1vcnlTdGF0dXMsIHNpemVvZiAobWVtb3J5U3RhdHVzKSwgb3JpZ2luICk7CisgIH0KKworICAvKiBHZXQgdGhyZWFkIGFuZCBwcm9jZXNzIGNyZWF0aW9uIHRpbWUsIGV4aXQgdGltZSwgdGltZSBpbiBrZXJuZWwKKyAgICAgbW9kZSwgYW5kIHRpbWUgaW4gdXNlciBtb2RlIGluIDEwMG5zIGludGVydmFscy4gICovCisgIHsKKyAgICBIQU5ETEUgaGFuZGxlOworICAgIEZJTEVUSU1FIGNyZWF0aW9uVGltZSwgZXhpdFRpbWUsIGtlcm5lbFRpbWUsIHVzZXJUaW1lOworICAgIERXT1JEIG1pbmltdW1Xb3JraW5nU2V0U2l6ZSwgbWF4aW11bVdvcmtpbmdTZXRTaXplOworCisgICAgaGFuZGxlID0gR2V0Q3VycmVudFRocmVhZCAoKTsKKyAgICBHZXRUaHJlYWRUaW1lcyAoaGFuZGxlLCAmY3JlYXRpb25UaW1lLCAmZXhpdFRpbWUsCisgICAgICAgICAgICAgICAgICAgICZrZXJuZWxUaW1lLCAmdXNlclRpbWUpOworICAgICgqYWRkKSAoICZjcmVhdGlvblRpbWUsIHNpemVvZiAoY3JlYXRpb25UaW1lKSwgb3JpZ2luICk7CisgICAgKCphZGQpICggJmV4aXRUaW1lLCBzaXplb2YgKGV4aXRUaW1lKSwgb3JpZ2luICk7CisgICAgKCphZGQpICggJmtlcm5lbFRpbWUsIHNpemVvZiAoa2VybmVsVGltZSksIG9yaWdpbiApOworICAgICgqYWRkKSAoICZ1c2VyVGltZSwgc2l6ZW9mICh1c2VyVGltZSksIG9yaWdpbiApOworCisgICAgaGFuZGxlID0gR2V0Q3VycmVudFByb2Nlc3MgKCk7CisgICAgR2V0UHJvY2Vzc1RpbWVzIChoYW5kbGUsICZjcmVhdGlvblRpbWUsICZleGl0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICZrZXJuZWxUaW1lLCAmdXNlclRpbWUpOworICAgICgqYWRkKSAoICZjcmVhdGlvblRpbWUsIHNpemVvZiAoY3JlYXRpb25UaW1lKSwgb3JpZ2luICk7CisgICAgKCphZGQpICggJmV4aXRUaW1lLCBzaXplb2YgKGV4aXRUaW1lKSwgb3JpZ2luICk7CisgICAgKCphZGQpICggJmtlcm5lbFRpbWUsIHNpemVvZiAoa2VybmVsVGltZSksIG9yaWdpbiApOworICAgICgqYWRkKSAoICZ1c2VyVGltZSwgc2l6ZW9mICh1c2VyVGltZSksIG9yaWdpbiApOworCisgICAgLyogR2V0IHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHdvcmtpbmcgc2V0IHNpemUgZm9yIHRoZSBjdXJyZW50CisgICAgICAgcHJvY2Vzcy4gICovCisgICAgR2V0UHJvY2Vzc1dvcmtpbmdTZXRTaXplIChoYW5kbGUsICZtaW5pbXVtV29ya2luZ1NldFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4aW11bVdvcmtpbmdTZXRTaXplKTsKKyAgICAoKmFkZCkgKCAmbWluaW11bVdvcmtpbmdTZXRTaXplLAorICAgICAgICAgICAgIHNpemVvZiAobWluaW11bVdvcmtpbmdTZXRTaXplKSwgb3JpZ2luICk7CisgICAgKCphZGQpICggJm1heGltdW1Xb3JraW5nU2V0U2l6ZSwKKyAgICAgICAgICAgICBzaXplb2YgKG1heGltdW1Xb3JraW5nU2V0U2l6ZSksIG9yaWdpbiApOworICB9CisKKworICAvKiBUaGUgZm9sbG93aW5nIGFyZSBmaXhlZCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBwcm9jZXNzIHNvIHdlIG9ubHkKKyAgICogYWRkIHRoZW0gb25jZSAqLworICBpZiAoIWFkZGVkRml4ZWRJdGVtcykKKyAgICB7CisgICAgICBTVEFSVFVQSU5GTyBzdGFydHVwSW5mbzsKKworICAgICAgLyogR2V0IG5hbWUgb2YgZGVza3RvcCwgY29uc29sZSB3aW5kb3cgdGl0bGUsIG5ldyB3aW5kb3cKKyAgICAgICAgIHBvc2l0aW9uIGFuZCBzaXplLCB3aW5kb3cgZmxhZ3MsIGFuZCBoYW5kbGVzIGZvciBzdGRpbiwKKyAgICAgICAgIHN0ZG91dCwgYW5kIHN0ZGVyci4gICovCisgICAgICBzdGFydHVwSW5mby5jYiA9IHNpemVvZiAoU1RBUlRVUElORk8pOworICAgICAgR2V0U3RhcnR1cEluZm8gKCZzdGFydHVwSW5mbyk7CisgICAgICAoKmFkZCkgKCAmc3RhcnR1cEluZm8sIHNpemVvZiAoU1RBUlRVUElORk8pLCBvcmlnaW4gKTsKKyAgICAgIGFkZGVkRml4ZWRJdGVtcyA9IDE7CisgICAgfQorCisgIC8qIFRoZSBwZXJmb3JtYW5jZSBvZiBRUEMgdmFyaWVzIGRlcGVuZGluZyBvbiB0aGUgYXJjaGl0ZWN0dXJlIGl0J3MKKyAgICAgcnVubmluZyBvbiBhbmQgb24gdGhlIE9TLCB0aGUgTVMgZG9jdW1lbnRhdGlvbiBpcyB2YWd1ZSBhYm91dCB0aGUKKyAgICAgZGV0YWlscyBiZWNhdXNlIGl0IHZhcmllcyBzbyBtdWNoLiAgVW5kZXIgV2luOXgvTUUgaXQgcmVhZHMgdGhlCisgICAgIDEuMTkzMTgwIE1IeiBQSUMgdGltZXIuICBVbmRlciBOVC9XaW4ySy9YUCBpdCBtYXkgb3IgbWF5IG5vdCByZWFkIHRoZQorICAgICA2NC1iaXQgVFNDIGRlcGVuZGluZyBvbiB0aGUgSEFMIGFuZCBhc3NvcnRlZCBvdGhlciBjaXJjdW1zdGFuY2VzLAorICAgICBnZW5lcmFsbHkgb24gbWFjaGluZXMgd2l0aCBhIHVuaXByb2Nlc3NvciBIQUwKKyAgICAgS2VRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigpIHVzZXMgYSAzLjU3OTU0NU1IeiB0aW1lciBhbmQgb24gbWFjaGluZXMKKyAgICAgd2l0aCBhIG11bHRpcHJvY2Vzc29yIG9yIEFQSUMgSEFMIGl0IHVzZXMgdGhlIFRTQyAodGhlIGV4YWN0IHRpbWUKKyAgICAgc291cmNlIGlzIGNvbnRyb2xsZWQgYnkgdGhlIEhhbHBVc2U4MjU0IGZsYWcgaW4gdGhlIGtlcm5lbCkuICBUaGF0CisgICAgIGNob2ljZSBvZiB0aW1lIHNvdXJjZXMgaXMgc29tZXdoYXQgcGVjdWxpYXIgYmVjYXVzZSBvbiBhCisgICAgIG11bHRpcHJvY2Vzc29yIG1hY2hpbmUgaXQncyB0aGVvcmV0aWNhbGx5IHBvc3NpYmxlIHRvIGdldCBjb21wbGV0ZWx5CisgICAgIGRpZmZlcmVudCBUU0MgcmVhZGluZ3MgZGVwZW5kaW5nIG9uIHdoaWNoIENQVSB5b3UncmUgY3VycmVudGx5CisgICAgIHJ1bm5pbmcgb24sIHdoaWxlIGZvciB1bmlwcm9jZXNzb3IgbWFjaGluZXMgaXQncyBub3QgYSBwcm9ibGVtLgorICAgICBIb3dldmVyLCB0aGUga2VybmVsIGFwcGVhcnMgdG8gc3luY2hyb25pc2UgdGhlIFRTQ3MgYWNyb3NzIENQVXMgYXQKKyAgICAgYm9vdCB0aW1lIChpdCByZXNldHMgdGhlIFRTQyBhcyBwYXJ0IG9mIGl0cyBzeXN0ZW0gaW5pdCksIHNvIHRoaXMKKyAgICAgc2hvdWxkbid0IHJlYWxseSBiZSBhIHByb2JsZW0uICBVbmRlciBXaW5DRSBpdCdzIGNvbXBsZXRlbHkgcGxhdGZvcm0tCisgICAgIGRlcGVuZGFudCwgaWYgdGhlcmUncyBubyBoYXJkd2FyZSBwZXJmb3JtYW5jZSBjb3VudGVyIGF2YWlsYWJsZSwgaXQKKyAgICAgdXNlcyB0aGUgMW1zIHN5c3RlbSB0aW1lci4KKyAgICAgCisgICAgIEFub3RoZXIgZmVhdHVyZSBvZiB0aGUgVFNDIChhbHRob3VnaCBpdCBkb2Vzbid0IHJlYWxseSBhZmZlY3QgdXMgaGVyZSkKKyAgICAgaXMgdGhhdCBtb2JpbGUgQ1BVcyB3aWxsIHR1cm4gb2ZmIHRoZSBUU0Mgd2hlbiB0aGV5IGlkbGUsIFBlbnRpdW1zCisgICAgIHdpbGwgY2hhbmdlIHRoZSByYXRlIG9mIHRoZSBjb3VudGVyIHdoZW4gdGhleSBjbG9jay10aHJvdHRsZSAodG8KKyAgICAgbWF0Y2ggdGhlIGN1cnJlbnQgQ1BVIHNwZWVkKSwgYW5kIGh5cGVydGhyZWFkaW5nIFBlbnRpdW1zIHdpbGwgdHVybgorICAgICBpdCBvZmYgd2hlbiBib3RoIHRocmVhZHMgYXJlIGlkbGUgKHRoaXMgbW9yZSBvciBsZXNzIG1ha2VzIHNlbnNlLAorICAgICBzaW5jZSB0aGUgQ1BVIHdpbGwgYmUgaW4gdGhlIGhhbHRlZCBzdGF0ZSBhbmQgbm90IGV4ZWN1dGluZyBhbnkKKyAgICAgaW5zdHJ1Y3Rpb25zIHRvIGNvdW50KS4KKyAgICAgCisgICAgIFRvIG1ha2UgdGhpbmdzIHVuYW1iaWd1b3VzLCB3ZSBkZXRlY3QgYSBDUFUgbmV3IGVub3VnaCB0byBjYWxsIFJEVFNDCisgICAgIGRpcmVjdGx5IGJ5IGNoZWNraW5nIGZvciBDUFVJRCBjYXBhYmlsaXRpZXMsIGFuZCBmYWxsIGJhY2sgdG8gUVBDIGlmCisgICAgIHRoaXMgaXNuJ3QgcHJlc2VudC4gICovCisjaWZkZWYgX19HTlVDX18gIAorLyogICBGSVhNRTogV2Ugd291bGQgbmVlZCB0byBpbXBsZW1lbnQgdGhlIENQVSBmZWF0dXJlIHRlc3RzIGZpcnN0LiAgKi8KKy8qICAgaWYgKGNwdV9oYXNfZmVhdHVyZV9yZHRzYykgKi8KKy8qICAgICB7ICovCisvKiAgICAgICB1aW50MzJfdCBsbywgaGk7ICovCisgICAgICAvKiBXZSBjYW5ub3QgdXNlICI9QSIsIHNpbmNlIHRoaXMgd291bGQgdXNlICVyYXggb24geDg2XzY0LiAqLworLyogICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJyZHRzYyIgOiAiPWEiIChsbyksICI9ZCIgKGhpKSk7ICovCisgICAgICAvKiBJZ25vcmUgaGlnaCAzMiBiaXRzLCBod2ljaCBhcmUgPjFzIHJlcy4gICovCisvKiAgICAgICAoKmFkZCkgKCZsbywgNCwgb3JpZ2luICk7ICovCisvKiAgICAgfSAqLworLyogICBlbHNlICovCisjZW5kaWYgLyohX19HTlVDX18qLworICAgIHsKKyAgICAgIExBUkdFX0lOVEVHRVIgcGVyZm9ybWFuY2VDb3VudDsKKyAgICAgIAorICAgICAgaWYgKFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyICgmcGVyZm9ybWFuY2VDb3VudCkpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIGRlYnVnX21lICkKKyAgICAgICAgICBsb2dfZGVidWcgKCJybmR3MzIjZ2F0aGVyX3JhbmRvbV9mYXN0OiBwZXJmIGRhdGFcbiIpOworICAgICAgICAgICgqYWRkKSAoJnBlcmZvcm1hbmNlQ291bnQsIHNpemVvZiAocGVyZm9ybWFuY2VDb3VudCksIG9yaWdpbik7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIE1pbGxpc2Vjb25kIGFjY3VyYWN5IGF0IGJlc3QuLi4gKi8KKyAgICAgICAgICBEV09SRCBhd29yZCA9IEdldFRpY2tDb3VudCAoKTsKKyAgICAgICAgICAoKmFkZCkgKCZhd29yZCwgc2l6ZW9mIChhd29yZCksIG9yaWdpbiApOworICAgICAgICB9CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9zcmMvQ2hhbmdlTG9nIGIvbGliZ2NyeXB0LTEuNC42L3NyYy9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE4MDI3YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9zcmMvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsMjEzOCBAQAorMjAxMC0wNy0xMyAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogZ2NyeXB0LmguaW4gKEdDUllfQ0lQSEVSX01PREVfQUVTV1JBUCk6IE5ldy4KKworMjAxMC0wNy0wOSAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogZ2NyeXB0LmguaW4gKEdDUllfTURfVElHRVIxLCBHQ1JZX01EX1RJR0VSMik6IE5ldy4KKworCSogZ2NyeXB0LmguaW4gWyFfX0dOVUNfXyAmJiBXMzJdOiBUeXBlZGVmIHNzaXplX3QgYW5kIHBpZF90IHRvCisJaGVscCBidWlsZGluZyB3aXRoIE1TVkMuCisJKiBnY3J5cHQuaC5pbiBbVzMyXTogSW5jbHVkZSB0aW1lLmggYW5kIG5vdCBzeXMvdGltZS5oLgorCisyMDA5LTExLTI5ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBod2ZlYXR1cmVzLmMgKGRldGVjdF9pYTMyX2dudWMpOiBSZXBsYWNlICI9ciIgYnkgIityIiBzbyB0aGF0CisJSEFTX0NQVURJRCBpcyBhbHdheXMgaW5pdGlhbGl6ZWQuICBUaGFua3MgdG8gQmVuIEh1dGNoaW5ncyBmb3IKKwlwb2ludGluZyBvdXQgdGhpcyBwcm9ibGVtLgorCisyMDA5LTA2LTI0ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBmaXBzLmMgKF9nY3J5X2luaXRpYWxpemVfZmlwc19tb2RlKTogTm8gRklQUyBtb2RlIGlmCisJL3Byb2MvdmVyc2lvbiBoYXMgaW5zdWZmaWNpZW50IHBlcm1pc3Npb25zLgorCisyMDA5LTAyLTAyICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBhdGguaDogSW5jbHVkZSBzeXMvdGltZS5oLiAgRml4ZXMgYnVnIzk5My4KKworMjAwOS0wMS0yMiAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogZmlwcy5jIChfZ2NyeV9pbml0aWFsaXplX2ZpcHNfbW9kZSk6IFJlbW92ZSBzdXBlcmZsdW91cyBjb25zdAorCWZyb20gc3RhdGljIHN0cmluZy4gIFJlcG9ydGVkIGJ5IEFsYmVydCBDaGluLgorCSogaG1hYzI1Ni5jIChzZWxmdGVzdCk6IERpdHRvIGFuZCBjaGFuZ2UgdG8gdW5zaWduZWQgY2hhci4KKworMjAwOC0xMi0xMCAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogaG1hYzI1Ni5jIChmaW5hbGl6ZSk6IEZpeCBmb3IgYmlnIGVuZGlhbiBob3N0cy4KKworMjAwOC0xMi0wNSAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogZ2xvYmFsLmMgKGdjcnlfZnJlZSk6IFNhdmUgYW5kIHJlc3RvcmUgRVJSTk8gaWYgc2V0LgorCisyMDA4LTExLTI0ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBzZXhwLmMgKGdldF9pbnRlcm5hbF9idWZmZXIpOiBOZXcuCisJKHNleHBfc3NjYW4pOiBBZGQgZm9ybWF0IGNoYXJhY3RlciBTLgorCSogY2lwaGVyLXByb3RvLmggKHBrX2V4dF9nZW5lcmF0ZV90KTogQWRkIGZpZWxkIEVYVFJBSU5GTyAgY2hhbmdlZAorCWFsbCBpbXBsZW1lbnRvcnMuCisKKwkqIGNpcGhlci1wcm90by5oIChwa19leHRfZ2VuZXJhdGVfdCk6IFNpbXBsaWZ5LiAKKwkocGtfZ2V0X3BhcmFtKTogTmV3LgorCShwa19leHRyYV9zcGVjX3QpOiBBZGQgZmllbGQgR0VUX1BBUkFNLgorCSogY2lwaGVyLmggKFBVQktFWV9GTEFHX1RSQU5TSUVOVF9LRVkpOiBSZW1vdmUuCisJKF9nY3J5X3B1YmtleV9leHRyYXNwZWNfZWxnKTogTmV3LgorCisyMDA4LTExLTA1ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBjaXBoZXIuaCAoQ0lQSEVSX0lORk9fTk9fV0VBS19LRVkpOiBOZXcuCisKKwkqIGNpcGhlci1wcm90by5oIChjaXBoZXJfc2V0X2V4dHJhX2luZm9fdCk6IE5ldy4KKwkoY2lwaGVyX2V4dHJhX3NwZWMpOiBBZGQgZmllbGQgU0VUX0VYVFJBX0lORk8uCisKKzIwMDgtMTAtMzAgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGcxMGxpYi5oIChHQ0NfQVRUUl9GT1JNQVRfQVJHKTogTmV3LgorCShfZ2NyeV9nZXR0ZXh0KTogVXNlIGl0LgorCisyMDA4LTEwLTI0ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBnbG9iYWwuYyAoaW5hY3RpdmVfZmlwc19tb2RlKTogTW92ZSB0byBmaXBzLmMuIAorCShnY3J5X3NldF9hbGxvY2F0aW9uX2hhbmRsZXIpOiBGYWN0b3IgY29kZSBvdXQgdG8gLi4uCisJKiBmaXBzLmMgKF9nY3J5X2luYWN0aXZhdGVfZmlwc19tb2RlKTogTmV3LgorCShfZ2NyeV9pc19maXBzX21vZGVfaW5hY3RpdmUpOiBOZXcuCisKKzIwMDgtMDktMjkgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGdjcnlwdC1tb2R1bGUuaCAoR0NSWV9NT0RVTEVfSURfVVNFUiwgR0NSWV9NT0RVTEVfSURfVVNFUl9MQVNUKToKKwlOZXcuCisJKiBtb2R1bGUuYyAoTU9EVUxFX0lEX1VTRVIsIE1PRFVMRV9JRF9VU0VSX0xBU1QpOiBEZWZpbmUgdXNpbmcgbmV3CisJbWFjcm9zLgorCisyMDA4LTA5LTIwICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBobWFjMjU2LmMgKGZpbmFsaXplKSBbV09SRFNfQklHRU5ESUFOXTogRml4IHNpZ2J1cyBwcm9ibGVtLgorCisyMDA4LTA5LTE4ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBjaXBoZXItcHJvdG8uaCAocGtfZXh0X2dlbmVyYXRlX3QpOiBBZGQgYXJncyBRQklUUywgTkFNRSwgRE9NQUlOLgorCisJKiBmaXBzLmMgKGZpcHNfbmV3X3N0YXRlKTogQWxsb3cgRXJyb3IgPT4gRXJyb3IgdHJhbnNpdGlvbi4KKworMjAwOC0wOS0xOCAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogZ2NyeXB0LmguaW4gKGdjcnlfZmlwc19tb2RlX2FjdGl2ZSk6IE5ldy4KKworCSogc2VjbWVtLmMgKF9nY3J5X3NlY21lbV9pbml0KTogRmFjdG9yIG1vc3QgY29kZSBvdXQgdG8gLi4KKwkoc2VjbWVtX2luaXQpOiAuLiBuZXcuCisJKERFRkFVTFRfUE9PTF9TSVpFKTogUmVuYW1lIHRvIE1JTklNVU1fUE9PTF9TSVpFLgorCShTVEFOREFSRF9QT09MX1NJWkUpOiBOZXcuCisJKF9nY3J5X3NlY21lbV9tYWxsb2NfaW50ZXJuYWwpOiBEb24ndCBhYm9ydCBpZiB0aGUgcG9vbCBpcyBub3QKKwlpbml0aWFsaXplZCBidXQgdHJ5IHRvIG91dCBpbnRpYWxpemUgaXQgZmlyc3QgYW5kIG9ubHkgdGhlbiBwcmludAorCWFuIGVycm9yIG1lc3NhZ2UgYW5kIHJldHVybiBOVUxMLiAgSWYgdGhlIHBvb2wgaXMgbm90IGxvY2tlZCB3aGlsZQorCWluIEZJUFMgbW9kZSwgcmV0dXJuIE5VTEwuCisKKwkqIGZpcHMuYyAoRklQU19GT1JDRV9GSUxFKTogTmV3IGNvbnN0YW50LiAgQ2hhbmdlIHRoZSBmaWxlIG5hbWUgdG8KKwkiL2V0Yy9nY3J5cHQvZmlwc19lbmFibGVkIi4KKwkoZW5mb3JjZWRfZmlwc19tb2RlKTogTmV3LgorCShfZ2NyeV9pbml0aWFsaXplX2ZpcHNfbW9kZSk6IFNldCB0aGF0IGZsYWcuCisJKF9nY3J5X2VuZm9yY2VkX2ZpcHNfbW9kZSk6IE5ldy4KKwkqIGdsb2JhbC5jIChpbmFjdGl2ZV9maXBzX21vZGUpOiBOZXcuCisJKF9nY3J5X3Zjb250cm9sKTogVGFrZSB0aGF0IGZsYWcgaW4gYWNjb3VudCBmb3IJR0NSWUNUTF9GSVBTX01PREVfUC4KKwkoZ2NyeV9zZXRfYWxsb2NhdGlvbl9oYW5kbGVyKTogVGFrZSBjYXJlIG9mIHRoZSBlbmZvcmNlZCBmaXBzIG1kb2UKKwlmbGFnLgorCShnZXRfbm9fc2VjdXJlX21lbW9yeSk6IE5ldy4KKwkoZG9fbWFsbG9jLCBnY3J5X2lzX3NlY3VyZSk6IFVzZSBpdC4KKworMjAwOC0wOS0xNiAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogZ2xvYmFsLmMgKHByaW50X2NvbmZpZyk6IFVzZSB5L24gZm9yIGZpcHMgbW9kZS4KKworCSogZmlwcy5jIChmaXBzX25ld19zdGF0ZSk6IEFsbG93IHRyYW5zaXRpb24gdG8gRXJyb3IgYW5kCisJRmF0YWwtZXJyb3IgZnJvbSBJbml0LgorCisyMDA4LTA5LTE1ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBmaXBzLmMgW0hBVkVfU1lTTE9HXTogSW5jbHVkZSBzeXNsb2cuaC4KKwkoX2djcnlfaW5pdGlhbGl6ZV9maXBzX21vZGUsIGxvY2tfZnNtLCB1bmxvY2tfZnNtKQorCShfZ2NyeV9maXBzX3NpZ25hbF9lcnJvciwgZmlwc19uZXdfc3RhdGUpCisJKF9nY3J5X2ZpcHNfbm9yZXR1cm4pIFtIQVZFX1NZU0xPR106IEFsc28gbG9nIHZpYSBzeXNsb2cuCisJKGNoZWNrX2JpbmFyeV9pbnRlZ3JpdHkpIFtIQVZFX1NZU0xPR106IExvZyBmYWlsdXJlLgorCSogZ2xvYmFsLmggW0hBVkVfU1lTTE9HXTogSW5jbHVkZSBzeXNsb2cuaC4KKwkoX2djcnlfZ2xvYmFsX2lzX29wZXJhdGlvbmFsKSBbSEFWRV9TWVNMT0ddOiBQcmludCB3YXJuaW5nLgorCisJKiBnbG9iYWwuYyAoX2djcnlfdmNvbnRyb2wpOiBVc2UgR0NSWUNUTF9JTklUSUFMSVpBVElPTl9GSU5JU0hFRAorCXRvIHJ1biBwb3dlci11cCB0ZXN0cy4gIEFkZCB1bnB1Ymxpc2hlZCBjb250cm9sIGNvbW1hbmRzIDU4LTYwLgorCisJKiBnbG9iYWwuYyAoX2djcnlfZ2xvYmFsX2lzX29wZXJhdGlvbmFsKTogTmV3LgorCSogZzEwbGliLmggKGZpcHNfaXNfb3BlcmF0aW9uYWwpOiBDaGFuZ2UgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uLgorCisyMDA4LTA5LTEyICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBmaXBzLmMgKF9nY3J5X2ZpcHNfcnVuX3NlbGZ0ZXN0cyk6IEFkZCBhcmcgRVhURU5ERUQuCisJKHJ1bl9jaXBoZXJfc2VsZnRlc3RzLCBydW5fZGlnZXN0X3NlbGZ0ZXN0cywgcnVuX2htYWNfc2VsZnRlc3RzKSAKKwkocnVuX3B1YmtleV9zZWxmdGVzdHMpOiBEaXR0by4KKwkqIGNpcGhlci1wcm90by5oIChzZWxmdGVzdF9mdW5jX3QpOiBBZGQgYXJnIEVYVEVOREVECisKKzIwMDgtMDktMTEgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGZpcHMuYzogSW5jbHVkZSBzdHJpbmcuaC4KKwkobG94dG9pXzEsIGxveHRvaV8yLCBsb3hkaWdpdF9wKTogTmV3LgorCShjaGVja19iaW5hcnlfaW50ZWdyaXR5KTogQ2hhbmdlIHRoZSBmb3JtYXQgb2YgdGhlIGV4cGVjdGVkIGZpbGUuCisKKwkqIGZpcHMuYyAoX2djcnlfZmlwc19ydW5fc2VsZnRlc3RzKTogUnVuIHJhbmRvbSB0ZXN0cyBiZWZvcmUgdGhlCisJcHVia2V5IHRlc3RzLgorCisyMDA4LTA5LTA1ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBnY3J5cHQuaC5pbiAoR0NZUkNUTF9TRUxGVEVTVCk6IE5ldy4KKwkqIGdsb2JhbC5jIChfZ2NyeV92Y29udHJvbCk6IEltcGxlbWVudC4KKwkqIGZpcHMuYyAoX2djcnlfZmlwc19ydW5fc2VsZnRlc3RzKTogRG8gc3RhdGUgdHJhbnNpdGlvbnMgb25seSBpZgorCWluIGZpcHMgbW9kZS4gIFJldHVybiBhbiBlcnJvciBjb2RlLgorCisyMDA4LTA5LTAxICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBzdGRtZW0uYzogUmUtaW5kZW50ZWQuCisKKzIwMDgtMDgtMjkgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGZpcHMuYyAoX2djcnlfaW5pdGlhbGl6ZV9maXBzX21vZGUpOiBDaGFuZ2VkIC9wcm9jIGZpbGUgdG8gdGVzdAorCWZvciBGSVBTIG1vZGUuCisKKwkqIGNpcGhlci1wcm90by5oIChwa19jb21wdXRlX2tleWdyaXBfdCk6IE5ldy4KKwkocGtfZXh0cmFfc3BlYyk6IEFkZCBmaWVsZCBjb21wX2tleWdyaXAuCisKKzIwMDgtMDgtMjggIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGh3ZmVhdHVyZXMuYyAoX2djcnlfZGV0ZWN0X2h3X2ZlYXR1cmVzKTogRGlzYWJsZSBoYXJkd2FyZQorCWRldGVjdGlvbiBpbiBGSVBTIG1vZGUuCisKKzIwMDgtMDgtMjcgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGdsb2JhbC5jIChfZ2NyeV92Y29udHJvbCk6IEFsbG93IHJ1bm5pbmcgc2VsZnRlc3RzIGZyb20gZXJyb3IKKwlzdGF0ZS4KKwkoZ2NyeV9zZXRfb3V0b2Zjb3JlX2hhbmRsZXIpOiBPbmx5IHByaW50IGEgd2FybmluZyBpZiB1c2VkIGluIEZJUFMKKwltb2RlLgorCShnY3J5X3htYWxsb2MsIGdjcnlfeHJlYWxsb2MsIGdjcnlfeG1hbGxvY19zZWN1cmUsIGdjcnlfeHN0cmR1cCk6CisJSWdub3JlIGFuIG91dG9mY29yZSBoYW5kbGVyIGluIEZJUFMgbW9kZS4KKworCSogZmlwcy5jIChfZ2NyeV9maXBzX3Rlc3RfZXJyb3Jfb3Jfb3BlcmF0aW9uYWwpOiBOZXcuCisJKGZpcHNfbmV3X3N0YXRlKTogQWxsb3cgdHJhbnNpdGlvbiBmcm9tIGVycm9yIGludG8gc2VsZnRlc3QuCisJRGlzYWxsb3cgZXJyb3IgdG8gaW5pdC4KKworMjAwOC0wOC0yNiAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogZmlwcy5jIChmaXBzX25ld19zdGF0ZSk6IFByaW50IHN0YXRlIHRyYW5zaXRpb25zIG9ubHkgYXQKKwl2ZXJib3NpdHkgbGV2ZWwgb2YgMi4KKwkocmVwb3J0ZXIpOiBMaWtld2lzZS4KKworCSogY2lwaGVyLXByb3RvLmggKHBrX2V4dF9nZW5lcmF0ZV90KTogTmV3LgorCShwa19leHRyYV9zcGVjKTogQWRkIG1lbWJlciBleHRfZ2VuZXJhdGUuCisJKiBjaXBoZXIuaCAoUFVCS0VZX0ZMQUdfVFJBTlNJRU5UX0tFWSk6IE5ldy4KKworMjAwOC0wOC0yMiAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogaG1hYzI1Ni5jIChfZ2NyeV9obWFjMjU2X2ZpbGUpOiBOZXcuCisJKG1haW4pOiBOZXcgb3B0aW9uIC0tYmluYXJ5LgorCSogZmlwcy5jIChjaGVja19iaW5hcnlfaW50ZWdyaXR5KTogTmV3LgorCShfZ2NyeV9maXBzX3J1bl9zZWxmdGVzdHMpOiBSdW4gaXQuCisKKwkqIGdsb2JhbC5jIChfZ2NyeV92Y29udHJvbCkgPEdDUllDVExfVVBEQVRFX1JBTkRPTV9TRUVEX0ZJTEU+OgorCUNoZWNrIGZvciBmaXBzIG9wZXJhdGlvbmFsIHN0YXRlLgorCShfZ2NyeV92Y29udHJvbCkgPEdDUllDVExfRkFTVF9QT0xMPjogRGl0dC4KKworMjAwOC0wOC0yMSAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogbWlzYy5jIChfZ2NyeV9sb2dfcHJpbnRoZXgpOiBOZXcuCisKKzIwMDgtMDgtMjAgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGcxMGxpYi5oIChnY3J5X2Fzc2VydCk6IE5ldy4gIHVzZSB0aGlzIGF0IGFsbW9zdCBhbGwgcGxhY2VzCisJd2hlcmUgd2UgdXNlZCBhIHBsYWluIGFzc2VydC4KKwkqIG1pc2MuYyAoX2djcnlfYXNzZXJ0X2ZhaWxlZCk6IE5ldy4KKwkoX2djcnlfYnVnKTogQWxzbyB1c2UgZnVuYyB2YXJpYW50IGZvciBJU08tQzk5LgorCisyMDA4LTA4LTE5ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiB2aXNpYmlsaXR5LmMsIHZpc2liaWxpdHkuaCAoZ2NyeV9tcGlfbHNoaWZ0KTogTmV3LgorCSogbGliZ2NyeXB0LnZlcnMsIGxpYmdjcnlwdC5kZWYsIGdjcnlwdC5oLmluOiBEaXR0by4KKworMjAwOC0wOC0xNSAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogZ2NyeXB0LmguaW4gKGdjcnlfY2lwaGVyX3NldGtleSk6IFJlcGxhY2UgbWFjcm8gYnkgZnVuY3Rpb24uCisJKGdjcnlfY2lwaGVyX3NldGl2KTogIERpdHRvLgorCShnY3J5X2NpcGhlcl9zZXRjdHIpOiBEaXR0by4KKwkqIHZpc2liaWxpdHkuYyAoZ2NyeV9jaXBoZXJfc2V0a2V5LCBnY3J5X2NpcGhlcl9zZXRpdikgCisJKGdjcnlfY2lwaGVyX3NldGN0cik6IE5ldy4KKwkqIHZpc2liaWxpdHkuaCAoZ2NyeV9jaXBoZXJfc2V0a2V5LCBnY3J5X2NpcGhlcl9zZXRpdikgCisJKGdjcnlfY2lwaGVyX3NldGN0cik6IE5ldy4KKwkqIGxpYmdjcnlwdC52ZXJzIChnY3J5X2NpcGhlcl9zZXRrZXksIGdjcnlfY2lwaGVyX3NldGl2KQorCShnY3J5X2NpcGhlcl9zZXRjdHIpOiBOZXcuCisJKiBsaWJnY3J5cHQuZGVmIChnY3J5X2NpcGhlcl9zZXRrZXksIGdjcnlfY2lwaGVyX3NldGl2KSAKKwkoZ2NyeV9jaXBoZXJfc2V0Y3RyKTogTmV3LgorCisJKiBobWFjMjU2LmgsIGhtYWMyNTYuYzogTmV3LgorCSogTWFrZWZpbGUuYW0gKGhtYWMyNTZfU09VUkNFUyk6IE5ldy4gCisJKiBNYWtlZmlsZS5hbSAoYmluX1BST0dSQU1TKTogQWRkIGhtYWMyNTYuCisKKwkqIGdjcnlwdC5oLmluIChzdHJ1Y3QgZ2NyeV90aHJlYWRfY2JzKTogQ2hhbmdlIHR5cGUgb2YgT1BUSU9OIHRvCisJdW5zaWduZWQgaW50LiAgQWx0aG91Z2ggdGhpcyBpcyBhIHR5cGUgY2hhbmdlIGl0IGRvZXMgbm90IG1ha2UgYQorCWRpZmZlcmVuY2UuCisJKiBhdGguYyAoYXRoX2luc3RhbGwpOiBUYWtlIHRoZSB2ZXJzaW9uIG9mIHRoZSBvcHRpb24gZmllbGQgaW4KKwlhY2NvdW50LgorCQorCSogdmlzaWJpbGl0eS5jIChnY3J5X3BrX2VuY3J5cHQsIGdjcnlfcGtfZGVjcnlwdCwgZ2NyeV9wa19zaWduKQorCShnY3J5X3BrX3ZlcmlmeSwgZ2NyeV9wa190ZXN0a2V5LCBnY3J5X3BrX2dlbmtleSkKKwkoZ2NyeV9wa19nZXRfbmJpdHMsIGdjcnlfcGtfZ2V0X2tleWdyaXApCisJKGdjcnlfbWRfb3BlbiwgZ2NyeV9tZF9jb3B5LCBnY3J5X21kX2VuYWJsZSkgCisJKGdjcnlfbWRfd3JpdGUsIG1kX2ZpbmFsLCBnY3J5X21kX2N0bCwgZ2NyeV9tZF9zZXRrZXkpIAorCShnY3J5X21kX2hhc2hfYnVmZmVyLCBnY3J5X21kX2dldF9hbGdvLCBnY3J5X21kX2luZm8pIAorCShnY3J5X21kX2lzX2VuYWJsZWQpCisJKGdjcnlfY2lwaGVyX29wZW4sIGdjcnlfY2lwaGVyX2VuY3J5cHQpCisJKGdjcnlfY2lwaGVyX2RlY3J5cHQsIGdjcnlfY2lwaGVyX2N0bCkKKwkoZ2NyeV9jaXBoZXJfYWxnb19pbmZvKTogQ2hlY2sgd2hldGhlciB0aGUgbGlicmFyeSBpcyBvcGVyYXRpb25hbC4KKworCSogY2lwaGVyLXByb3RvLmg6IE5ldy4KKwkqIGNpcGhlci5oOiBJbmNsdWRlIGNpcGhlci1wcm90by5oLgorCSogdmlzaWJpbGl0eS5oOiBSZW1vdmUgZHVwbGljYXRlIG1hY3JvIGRlZmluaXRpb25zLiAgUmVtb3ZlCisJZ2NyeV9jaXBoZXJfcmVnaXN0ZXIsIGdjcnlfbWRfcmVnaXN0ZXIsCWdjcnlfcGtfcmVnaXN0ZXIgbWFjcm9zLgorCSogdmlzaWJpbGl0eS5jOiBJbmNsdWRlIGNpcGhlci1wcm90by5oLiAKKwkoZ2NyeV9jaXBoZXJfcmVnaXN0ZXIpOiBQYXNzIGR1bW15IGV4dHJhIGFyZ3MgdG8gdGhlIGludGVybmFsCisJcmVnaXN0ZXIgZnVuY3Rpb24uCisJKGdjcnlfbWRfcmVnaXN0ZXIsIGdjcnlfcGtfcmVnaXN0ZXIpOiBEaXR0by4KKwkqIGcxMGxpYi5oIChzdHJ1Y3QgZ2NyeV9tb2R1bGUpOiBBZGQgZmllbGQgRVhUUkFTUEVDLgorCSogbW9kdWxlLmMgKF9nY3J5X21vZHVsZV9hZGQpOiBBZGQgYXJnIEVYVFJBU1BFQy4gIENoYW5nZWQgYWxsCisJY2FsbGVycyB0byBwYXNzIE5VTEwuCisKKwkqIGZpcHMuYzogTmV3LgorCSogZ2NyeXB0LmguaW4gKEdDUllDVExfRklQU19NT0RFX1ApOiBOZXcuCisJKiBnbG9iYWwuYyAoZ2xvYmFsX2luaXQpOiBDYWxsIGZpcHMgaW5pdGlhbGl6YXRpb24uCisJKF9nY3J5X3Zjb250cm9sKTogQWRkIEdDUllDVExfRklQU19NT0RFX1AgY29kZS4KKwkocHJpbnRfY29uZmlnKTogQWRkIGNvbmZpZyBpdGVtIGZpcHMtbW9kZS4KKwkoZ2NyeV9zZXRfYWxsb2NhdGlvbl9oYW5kbGVyKTogRG8gbm90IGFsbG93IHRoZSB1c2Ugb2YgY3VzdG9tCisJYWxsb2NhdGlvbiBoYW5kbGVycy4KKwkoZ2NyeV9zZXRfb3V0b2Zjb3JlX2hhbmRsZXIpOiBEaXR0by4KKwkoX2djcnlfZ2V0X2RlYnVnX2ZsYWcpOiBEbyBub3QgcmV0dXJuIGFueSBkZWJ1ZyBmbGFncyBpbiBmaXBzIG1vZGUuCisJKiBtaXNjLmMgKF9nY3J5X2xvZ3YpOiBTaWduYWwgZmlwcyBlcnJvciBvbiBCVUcgb3IgRkFUQUwuCisJKF9nY3J5X2ZhdGFsX2Vycm9yKTogRGl0dG8uCisKKzIwMDgtMDctMDUgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIE1ha2VmaWxlLmFtOiBJbmNsdWRlIGxpYnJhbmRvbS5sYS4KKworMjAwOC0wNC0xOCAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogbWlzc2luZy1zdHJpbmcuYyAodmFzcHJpbnRmKTogUmVtb3ZlLiAgSXQgaXMgbm90IHVzZWQuICBSZXBvcnRlZAorCWJ5IFNpbW9uIEpvc2Vmc3Nvbi4KKworMjAwOC0wMy0xMSAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogZ2NyeXB0LmguaW4gKGdjcnlfYWNfZW1fdCwgZ2NyeV9hY19zY2hlbWVfdCk6IFJlbW92ZSB0cmFpbGluZworCWNvbW1hIGZvciBmdWxsIEMtODkgY29tcGF0aWJpbGl0eS4KKwkKKzIwMDgtMDEtMjEgIE1hcmN1cyBCcmlua21hbm4gIDxtYXJjdXNAZzEwY29kZS5kZT4KKworCSogaHdmZWF0dXJlcy5jIChkZXRlY3RfaWEzMl9nbnVjKTogRml4IGlubGluZSBhc20uCisKKzIwMDctMTItMTEgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIHZpc2liaWxpdHkuYyAoZ2NyeV9tZF9oYXNoX2J1ZmZlcik6IERvbid0IHVzZSByZXR1cm4gdm9yIGEgdm9pZAorCWZ1bmN0aW9uLiAgSGV5LCB3aHkgZG9lcyBnY2Mgbm90IGNvbXBsYWluIGFib3V0IHRoaXM/CisJKGdjcnlfYWNfaW9faW5pdF92YSk6IERpdHRvLgorCisyMDA3LTEyLTA1ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBod2ZlYXR1cmVzLmMgKGRldGVjdF9pYTMyX2dudWMpOiBEZXBlbmQgb24gRU5BQkxFX1BBRExPQ0tfU1VQUE9SVC4KKworMjAwNy0xMi0wMyAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogbWlzYy5jIChfZ2NyeV9sb2d2KTogVXNlIGFib3J0IGZvciBlcnJvciBsZXZlbHMgZmF0YWwgYW5kIGJ1ZyBhcworCXRoaXMgaXMgbW9yZSBhcHByb3JpYXRlIGZvciBhIGxpYnJhcnkuICBUZXJtaW5hdGUgdGhlIHNlY21lbQorCWJlZm9yZSBkb2luZyBzby4KKwkoX2djcnlfZmF0YWxfZXJyb3IpOiBUZXJtaW5hdGUgc2VjbWVtIGJlZm9yZSBhYm9ydC4KKwkqIHNlY21lbS5jIChfZ2NyeV9zZWNtZW1fbWFsbG9jX2ludGVybmFsKTogVXNlIGxvZ19idWcgaW5zdGVhZCBvZgorCWV4aXQuCisKKzIwMDctMTEtMjkgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGh3ZmVhdHVyZXMuYyAoZGV0ZWN0X2lhMzJfZ251Yyk6IERldGVjdCBQYWRsb2NrIGVuZ2luZS4KKworMjAwNy0xMS0xMyAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogZ2NyeXB0LmguaW4gKF9HQ1JZX0dDQ19BVFRSX01BTExPQyk6IEZpeGVkIGdjYyB2ZXJzaW9uIGNoZWNrLgorCVJlcG9ydGVkIGJ5IEdhYnJpZWxlIE1vbnRpLgorCisyMDA3LTEwLTMxICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBnbG9iYWwuYyAoZ2NyeV9jb250cm9sKTogRmFjdG9yIG1vc3QgY29kZSBvdXQgdG8gLi4KKwkoX2djcnlfdmNvbnRyb2wpOiAuLiBuZXcuCisJKiBzZXhwLmMgKF9nY3J5X3NleHBfdmJ1aWxkKTogTmV3LgorCSogbXBpLmggKF9nY3J5X21waV9zZXQsIF9nY3J5X21waV9zZXRfdWksIF9nY3J5X21waV9pbnZtKTogUmVtb3ZlCisJcHJvdG90eXBlcyBhcyB0aGV5IGFyZSBhbHJlYWR5IGluIGdjcnlwdC5oLgorCisyMDA3LTEwLTMwICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBzZXhwLmMgKGdjcnlfc2V4cF9udGhfc3RyaW5nKTogUmVwbGFjZSBieSBfZ2NyeV9zZXhwX250aF9zdHJpbmcuCisKKwkqIHZpc2liaWxpdHkuaCwgdmlzaWJpbGl0eS5jOiBOZXcuCisJKiBnMTBsaWIuaDogSW5jbHVkZSB2aXNpYmlsaXR5LmggaW5zdGVhZCBvZiBnY3J5cHQuaC4KKwkqIGdsb2JhbHMuYyAoX2djcnlfbWFsbG9jKTogUmVuYW1lIHRvIC4uCisJKGRvX21hbGxvYyk6IC4uIHRoaXMuCisKKwkqIGh3ZmVhdHVyZXMuYzogTmV3LgorCSogZ2xvYmFsLmMgKGdsb2JhbF9pbml0KTogRGV0ZWN0IGZlYXR1cmVzLgorCShwcmludF9jb25maWcpOiBQcmludCB0aGVtLgorCisyMDA3LTA4LTIyICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBkdW1wc2V4cC5jOiBOZXcuCisJKiBNYWtlZmlsZS5hbSAoYmluX1BST0dSQU1TKTogSW5zdGFsbCBpdC4KKworCSogZ2V0cmFuZG9tLmMgKHByaW50X3ZlcnNpb24pOiBVc2UgbmV3IHN0YW5kYXJkIGxpY2Vuc2UgbGluZS4KKwkqIGdjcnlwdHJuZC5jIChwcmludF92ZXJzaW9uKTogRGl0dG8uCisKKzIwMDctMDYtMDYgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGdjcnlwdC5oLmluIChHQ1JZX1RIUkVBRF9PUFRJT05fUFRIX0lNUEwpOiBGYWN0cm9yIG5ldHdvcmsKKwlyZWxhdGVkIGNvZGUgb3V0IHNvIHRoYXQgdGhlIHByb3RvdHlwZXMgY2FuIGJlIGFkanVzdGVkIGZvciBXMzIuCisJKF9HQ1JZX1RIUkVBRF9PUFRJT05fUFRIX0lNUExfTkVUKTogTmV3LgorCisyMDA3LTA1LTA5ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBsaWJnY3J5cHQubTQ6IFByaW50IGZvdW5kIHZlcnNpb24gb24gc3VjY2Vzcy4KKworMjAwNy0wNS0wOSAgTWFyY3VzIEJyaW5rbWFubiAgPG1hcmN1c0BnMTBjb2RlLmRlPgorCisJKiBnY3J5cHQuaC5pbiAoZ2NyeV9hY19pb190KTogQWRkIG5hbWUgZm9yIGFub255bW91cyB1bmlvbiwgYW5kIG1hcmsKKwlhbGwgbWVtYmVycyBhcyBpbnRlcm5hbCAoYWN0dWFsbHk6IGRlcHJlY2F0ZWQpLgorCisyMDA3LTA1LTA0ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBNYWtlZmlsZS5hbSAoLnJjLmxvKTogTmV3IHRvIHJlcGxhY2UgZ21ha2Ugc3BlY2lmaWMgc3VmZml4IHJ1bGUuCisKKzIwMDctMDUtMDMgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGxpYmdjcnlwdC5kZWYgKGdjcnlfc2V4cF9udGhfc3RyaW5nKTogTmV3LgorCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBBZGQgbGliZ2NyeXB0LmRlZi4KKworMjAwNy0wNS0wMiAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogZ2xvYmFsLmMgKHByaW50X2NvbmZpZyk6IFByaW50IGNpcGhlcnMsIGRpZ2VzdHMgYW5kIHB1YmtleXMuCisKKzIwMDctMDUtMDIgIERhdmlkIFNoYXcgIDxkc2hhd0BqYWJiZXJ3b2NreS5jb20+CisKKwkqIGNpcGhlci5oLCBnY3J5cHQuaC5pbjogQWRkIENhbWVsbGlhLgorCisyMDA3LTA0LTMwICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBnY3J5cHQuaC5pbiAoR0NSWUNUTF9QUklOVF9DT05GSUcpOiBOZXcuCisJKEdDUllDVExfU0VUX1JOREVHRF9TT0NLRVQpOiBOZXcuCisJKiBnbG9iYWwuYyAoZ2NyeV9jb250cm9sKTogQWRkIEdDUllDVExfUFJJTlRfQ09ORklHIGFuZAorCUdDUllDVExfU0VUX1JOREVHRF9TT0NLRVQuCisJKHByaW50X2NvbmZpZyk6IE5ldy4KKwkqIG1pc2MuYyAoX2djcnlfbG9nX2luZm9fd2l0aF9kdW1teV9mcCk6IE5ldy4KKworMjAwNy0wNC0xOCAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogZ2NyeXB0LmguaW4gKGdjcnlfc2V4cF9udGhfc3RyaW5nKTogTmV3LgorCisJKiBzZXhwLmMgKGdjcnlfc2V4cF9udGhfZGF0YSk6IEZhY3RvcmVkIGNvZGUgb3V0IHRvIC4uLgorCShzZXhwX250aF9kYXRhKTogLi4uIG5ldy4KKwkoZ2NyeV9zZXhwX250aF9zdHJpbmcpOiBOZXcuCisJKGdjcnlfc2V4cF9udGhfbXBpKTogUmVpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiBzZXhwX250ZF9kYXRhLgorCisyMDA3LTA0LTE2ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBzZWNtZW0uYyAoaW5pdF9wb29sKTogVXNlIHN5c2NvbmYoKSBpZiBhdmFpbGFibGUgdG8gZGV0ZXJtaW5lCisJcGFnZSBzaXplLgorCQorMjAwNy0wMy0yMiAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogbXBpLmggKG1waV9tb2QpOiBOZXcuCisJKG1waV9uZXcsIG1waV9zbmV3KTogTmV3LgorCisJKiBnY3J5cHQuaC5pbjogQWRkIEdDUllfUEtfRUNEU0EuCisKKzIwMDctMDMtMTYgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGdjcnlwdC5oLmluIChHQ1JZX1RIUkVBRF9PUFRJT05fUFRIUkVBRF9JTVBMKTogRml4ZWQgdHlwbworCWludHJvZHVjZWQgYnkgbWUgb24gMjAwNi0xMC0yMy4KKworMjAwNy0wMi0yMiAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogZ2NyeXB0LmguaW4gKGdjcnlfYWNfaWRfdG9fbmFtZSwgZ2NyeV9hY19uYW1lX3RvX2lkKTogTWFyayBhcworCWRlcHJlY2F0ZWQuCisKKwkqIGxpYmdjcnlwdC5kZWYgKGdjcnlfZmFzdF9yYW5kb21fcG9sbCk6IFJlbW92ZWQgLSBpdCBpcyBhIG1hY3JvLgorCShnY3J5X2NpcGhlcl9yZWdpc3RlciwgZ2NyeV9jaXBoZXJfdW5yZWdpc3Rlcik6IE5ldy4KKwkoZ2NyeV9tZF9yZWdpc3RlciwgZ2NyeV9tZF91bnJlZ2lzdGVyKTogTmV3LgorCShnY3J5X3BrX3JlZ2lzdGVyLCBnY3J5X3BrX3VucmVnaXN0ZXIpOiBOZXcuCisJKGdjcnlfYWNfZGF0YV9mcm9tX3NleHAsIGdjcnlfYWNfZGF0YV90b19zZXhwKTogTmV3LgorCShnY3J5X2FjX2lvX2luaXQsIGdjcnlfYWNfaW9faW5pdF92YSk6IE5ldy4KKwkoZ2NyeV9hY19kYXRhX2VuY3J5cHRfc2NoZW1lLCBnY3J5X2FjX2RhdGFfZGVjcnlwdF9zY2hlbWUpOiBOZXcuCisJKGdjcnlfYWNfZGF0YV9zaWduX3NjaGVtZSwgZ2NyeV9hY19kYXRhX3ZlcmlmeV9zY2hlbWUpOiBOZXcuCisKKwkqIG1pc3Npbmctc3RyaW5nLmM6IEluY2x1ZGUgc3RkaW8uaCBmb3IgdGhlIHZzcHJpbnRmIHByb3RvdHlwZS4KKworCSogYXRoLmggKHN0cnVjdCBhdGhfb3BzKSBbX1dJTjMyXTogVXNlIGludCBpbnN0ZWFkIG9mIHNvY2tsZW5fdC4KKworMjAwNy0wMi0yMSAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogbGliZ2NyeXB0LmRlZiAoZ2NyeV9jcmVhdGVfbm9uY2UsIGdjcnlfZmFzdF9yYW5kb21fcG9sbCkKKwkoZ2NyeV9tZF9kZWJ1Zyk6IE5ldy4KKworCSogbGliZ2NyeXB0LWNvbmZpZy5pbjogUmVtb3ZlIGR1cGxpY2F0ZXMgZnJvbSAtLWNmbGFncyBhbmQgLS1saWJzLgorCVByaW50IGEgZXJyb3IgZm9yIG9wdGlvbiAtLXRocmVhZC4KKworCSogZ2NyeXB0LmguaW4gKGdjcnlfc2V4cF9zcHJpbnQpOiBDaGFuZ2UgQlVGRkVSIGZyb20gY2hhciogdG8gdm9pZCouCisJKGdjcnlfbWRfY3RsKTogQ2hhbmdlIEJVRkZFUiBmcm9tIHVuc2lnbmVkIGNoYXIqIHRvIHZvaWQqLgorCShnY3J5X21kX2RlYnVnKTogTmV3LgorCShnY3J5X2NpcGhlcl9lbmNyeXB0LCBnY3J5X2NpcGhlcl9kZWNyeXB0KTogQ2hhbmdlIGJ1ZmZlciBhcmdzIHRvCisJdm9pZCouCisJKGdjcnlfcmFuZG9taXplKTogQ2hhbmdlIEJVRkZFUiB0byB2b2lkLgorCShnY3J5X2NyZWF0ZV9ub25jZSk6IERpdHRvLgorCisJKiBsaWJnY3J5cHQudmVycyAoZ2NyeV9tZF9kZWJ1Zyk6IE5ldy4KKworCSogc2V4cC5jIChnY3J5X3NleHBfc3ByaW50KTogRGl0dG8uCisJKG5vcm1hbGl6ZSk6IE1ha2UgUCB1bnNpZ25lZC4KKwkoZ2NyeV9zZXhwX250aF9kYXRhKTogQ2FzdCByZXR1cm4gdmFsdWUgdG8gY2hhciouCisJKHNleHBfc3NjYW4pOiBGaXggc2lnbi91bnNpZ25lZCBjb25mbGljdHMuCisJKHdoaXRlc3BhY2VwKTogQ2hhbmdlIFAgdG8gY2hhciouCisJKHVucXVvdGVfc3RyaW5nKTogQ2hhbmdlIFNUUklORyB0byBjaGFyKi4KKwkoY29udmVydF90b19oZXgpOiBDaGFuZ2UgREVTVCB0byBjaGFyKi4KKwkoY29udmVydF90b19zdHJpbmcpOiBDaGFuZ2UgREVTVCBhbmQgUCB0byBjaGFyKi4KKwkoY29udmVydF90b190b2tlbik6IENobmFnZSBERVNUIHRvIGNoYXIqLgorCShnY3J5X3NleHBfY2Fub25fbGVuKTogQ2hhbmdlIERJU1BISU5UIHRvIHVuc2lnbmVkIGNoYXIqLgorCisJKiBnY3J5cHQtbW9kdWxlLmggKGdjcnlfcGtfc3BlYyk6IE1hZGUgQUxJQVNFUyBhIGNvbnN0LgorCShnY3J5X21kX3dyaXRlX3QpOiBDaGFuZ2VkIEJVRiB0byBhIGNvbnN0IHZvaWQqLgorCisyMDA3LTAyLTEyICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBnY3J5cHQuaC5pbjogSW5jbHVkZSBzdGRsaWIuaCBmb3IgdGhlIHNha2UgZm8gdGhlIHRyaGVhZGluZworCW1hY3Jvcy4gIFN1Z2dlc3RlZCBieSBBbmRyZWFzIE1ldHpsZXIuCisKKwkqIHNlY21lbS5jIChwdHJfaW50b19wb29sX3ApOiBOZXcuCisJKF9nY3J5X3ByaXZhdGVfaXNfc2VjdXJlKTogSW1wbGVtZW50IGluIHRlcm1zIG9mIG5ldyBmdW5jdGlvbi4KKwkoQkxPQ0tfVkFMSUQpOiBSZW1vdmVkLiAgUmVwbGFjZWQgYWxsIHVzZXJzIGJ5IG5ldyBmdW5jdGlvbi4KKworMjAwNy0wMS0zMSAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogc2VjbWVtLmMgKF9nY3J5X3ByaXZhdGVfaXNfc2VjdXJlKTogRml4ZWQgc2V2ZXJlIGltcGxlbWVudGF0aW9uCisJZmxhdy4gIE1pZ2h0IGJlIHRoZSByZWFzb24gZm9yIHNvbWUgb2YgdGhlIG1vcmUgb2JzY3VyZSBidWdzLgorCShNQl9XSVBFX09VVCk6IFVzZSB3aXBlbWVtb3J5Mi4KKworMjAwNi0xMC0yMyAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogZ2NyeXB0LmguaW4gKEdDUllfVEhSRUFEX09QVElPTl9QVEhSRUFEX0lNUEwpOiBBZGQgc29tZSBjYXN0IGZvcgorCXVzZSBieSBDLWRvdWJsZXBsdXMuICBJbiBnZW5lcmFsIEkgZG9uJ3QgbGlrZSB0aGlzIGJ1dCBkdWUgdG8KKwlwdWJsaWMgZGVtYW5kIEkgZ2l2ZSB1cCA7LSkKKworMjAwNi0xMC0xOSAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogZ2xvYmFsLmMgKGdjcnlfY29udHJvbCkgPEdDUllDVExfSU5JVF9TRUNNRU0+OiBSZXR1cm4gYW4gZXJyb3IKKwlpZiB0aGUgbWVtb3J5IGNvdWxkIG5vdCBiZSBsb2NrZWQuCisJKiBzZWNtZW0uYyAobm90X2xvY2tlZCk6IE5ldy4KKwkoX2djcnlfc2VjbWVtX2dldF9mbGFncyk6IFJldHVybiB0aGF0IGZsYWcuCisJKiBzZWNtZW0uaCAoR0NSWV9TRUNNRU1fRkxBR19OT1RfTE9DS0VEKTogTmV3LgorCisyMDA2LTEwLTA1ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBtb2R1bGUuYyAoX2djcnlfbW9kdWxlX2lkX25ldyk6IERvbid0IGFzc2lnbiBtb2R1bGVzIGluIHRoZSByYW5nZQorCXRoZSByYW5nZSBvZiAxMDI0Li40MDk2LgorCSogZ2NyeXB0LmggKEdDUllfTURfVVNFUiwgR0NSWV9NRF9VU0VSX0xBU1QpOiBOZXcKKwkoR0NSWV9QS19VU0VSLCBHQ1JZX1BLX1VTRVJfTEFTVCk6IE5ldy4KKwkoR0NSWV9DSVBIRVJfVVNFUiwgR0NSWV9DSVBIRVJfVVNFUl9MQVNUKTogTmV3LgorCisyMDA2LTEwLTEyICBNYXJjdXMgQnJpbmttYW5uICA8bWFyY3VzQGcxMGNvZGUuZGU+CisKKwkqIGdjcnlwdC5oLmluOiBSZXBsYWNlIHNvY2tsZW5fdCB3aXRoIGdjcnlfc29ja2xlbl90LgorCisyMDA2LTEwLTExICBNYXJjdXMgQnJpbmttYW5uICA8bWFyY3VzQGcxMGNvZGUuZGU+CisKKwkqIGdjcnlwdC5oLmluOiBSZXBsYWNlIHZlcnNpb24gYnkgQFZFUlNJT05ALgorCisyMDA2LTEwLTEwICBNYXJjdXMgQnJpbmttYW5uICA8bWFyY3VzQGcxMGNvZGUuZGU+CisKKwkqIGdjcnlwdC5oOiBBZGQgZmFsbGJhY2sgdHlwZSBmb3Igc29ja2xlbl90LiAgTW92ZSB0byAuLi4KKwkqIGdjcnlwdC5oLmluOiAuLi4gdGhpcyBmaWxlLgorCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBBZGQgZ2NyeXB0LmguaW4uCisKKzIwMDYtMDktMDQgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGdjcnlwdC5oOiBSZW1vdmVkIHNvbWUgdHJhaWxpbmcgY29tbWEgaW4gZW51bXMuCisKKzIwMDYtMDgtMjkgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGdsb2JhbC5jIChnY3J5X3hyZWFsbG9jKTogUGFzcyBzZWN1cmUgZmxhZyB0byBvdXRvZmNvcmUgaGFuZGxlci4KKworCSogZ2NyeXB0LmggKEdDUllfQ0lQSEVSX1NFRUQpOiBOZXcuCisKKzIwMDYtMDgtMjEgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGdjcnlwdC5oIChHQ1JZQ1RMX0ZBS0VEX1JBTkRPTV9QKTogTmV3LgorCisyMDA2LTA3LTI5ICBNYXJjdXMgQnJpbmttYW5uICA8bWFyY3VzQGcxMGNvZGUuZGU+CisKKwkqIHNlY21lbS5jIChpbml0X3Bvb2wpOiBDbG9zZSBGRCBhZnRlciBlc3RhYmxpc2hpbmcgdGhlIG1hcHBpbmcuCisKKzIwMDYtMDctMTIgIE1hcmN1cyBCcmlua21hbm4gIDxtYXJjdXNAZzEwY29kZS5kZT4KKworCSogYXRoLmMgKGF0aF9tdXRleF9kZXN0cm95KTogTWljcm9vcHRpbWl6ZSBkZXN0cnVjdGlvbiBvZiB1bnVzZWQKKwlzdGF0aXRpY2FsbHkgaW5pdGlhbGl6ZWQgbXV0ZXhlcy4gIFN1Z2dlc3RlZCBieSBWaWN0b3IgU3Rpbm5lcgorCTx2aWN0b3Iuc3Rpbm5lckBpbmwuZnI+LgorCisJKiBnY3J5cHQuaCAoR0NSWV9USFJFQURfT1BUSU9OX1BUSFJFQURfSU1QTCwKKwkoR0NSWV9USFJFQURfT1BUSU9OX1BUSF9JTVBMKTogQWRkIG1pc3NpbmcgaW5pdGlhbGl6ZXJzIHRvCisJc3VwcHJlc3MgZ2NjIHdhcm5pbmcuCisJU3VibWl0dGVkIGJ5IFZpY3RvciBTdGlubmVyIDx2aWN0b3Iuc3Rpbm5lckBpbmwuZnI+LgorCisyMDA2LTA3LTA0ICBNYXJjdXMgQnJpbmttYW5uICA8bWFyY3VzQGcxMGNvZGUuZGU+CisKKwkqIGF0aC5jOiBBdm9pZCB3YXJuaW5nIGFib3V0IGRvdWJsZSBkZWZpbmVkIHR5cGUgYnl0ZSBhbmQgb3RoZXIKKwloYWNrcyB0byBsZXQgaXQgYnVpbGQgZm9yIFczMiAoYmFja3BvcnRlZCBmcm9tIExJQkdDUllQVC0xLTItQlJBTkNIKS4KKwkqIGF0aC5oLCBnY3J5cHQuaCwgdGVzdHMvYmVuY2htYXJrLmMsIHNyYy90eXBlcy5oOiBMaWtld2lzZS4KKworCSogZ2NyeXB0Lmg6IFJldmVydCBsYXN0IGNoYW5nZSwgYW5kIGluc3RlYWQ6CisJW19XSU4zMiB8fCBfX1dJTjMyX19dOiBEbyBub3QgaW5jbHVkZSA8c3lzL3NvY2tldC5oPiwgYnV0CisJPHdpbnNvY2syLmg+IGFuZCA8d3MydGNwaXAuaD4uCisJU3VnZ2VzdGVkIGJ5IFNpbW9uIEpvc2Vmc3NvbiA8amFzQGV4dHVuZG8uY29tPi4KKwkKKwkqIE1ha2VmaWxlLmFtIChpbnN0YWxsLWRhdGEtbG9jYWwsIHVuaW5zdGFsbC1sb2NhbCwgJS5sbywKKwkoaW5zdGFsbC1kZWYtZmlsZSwgdW5pbnN0YWxsLWRlZi1maWxlKTogTmV3IHRhcmdldHMuCisJKExUUkNDT01QSUxFLCBnY3J5cHRfcmVzLCBnY3J5cHRfcmVzX2xkZmxhZywgbm9fdW5kZWZpbmVkLAorCShleHBvcnRfc3ltYm9scywgZ2NyeXB0X2RlcHMpOiBOZXcgdmFyaWFibGVzLgorCSogdmVyc2lvbmluZm8ucmMuaW46IE5ldyBmaWxlLgorCSogbGliZ2NyeXB0LmRlZjogTmV3IGZpbGUgZnJvbSAuLi93MzItZGxsL2xpYmdjcnlwdC5kZWYuCisKKwkqIGdjcnlwdC5oIFshSEFWRV9TWVNfU09DS0VUX0hdOiBEbyBub3QgaW5jbHVkZSBzeXMvc29ja2V0LmgsIGJ1dAorCXRoZSBhcHByb3ByaWF0ZSB3aW5kb3dzIHNvY2tldCBoZWFkZXIuCisKKzIwMDYtMDYtMjEgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGdsb2JhbC5jIChnY3J5X3hjYWxsb2MsIGdjcnlfeGNhbGxvY19zZWN1cmUpOiBNYWRlIHNhZmUgYWdhaW5zdAorCWludGVnZXIgb3ZlcmZsb3cuCisKKwkqIHNleHAuYyAobWFrZV9zcGFjZSk6IFJldHVybiBhbiBlcnJvciBvbiBvdXQgb2YgY29yZS4KKwkoc2V4cF9zc2Nhbik6IFJlbW92ZSBhbGwgeG1hbGxvYyBzdHlsZSBjYWxscyBhbmQgcmV0dXJuIHByb3BlcgorCWVycm9yIGNvZGVzIG9uIGFsbG9jYXRpb24gZmFpbHVyZXMuCisJKGdjcnlfc2V4cF9maW5kX3Rva2VuKTogRGl0dG8uCisJKGdjcnlfc2V4cF9udGgpOiAKKwkKKwkqIHNleHAuYyAoZ2NyeV9zZXhwX2ZpbmRfdG9rZW4pOiBSZS1pbmRlbnRlZCBhbmQgcmVtb3ZlZCBhIGNydWZ0CisJIndoaWxlKGxldmVsKTsiIHdoaWNoIGZvcnR1bmF0ZWx5IGhhZCBubyBlZmZlY3QuCisKKzIwMDYtMDQtMjggIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGdjcnlwdC5oIChHQ1JZX01EX1NIQTIyNCk6IENoYW5nZSB2YWx1ZSBmcm9tIDMwNiB0byAxMSB0byBtYXRjaAorCXRoZSB1c2UgaW4gT3BlblBHUC4gIFRoZXJlIGhhcyBiZWVuIG5vIHJlbGVhc2UgeWV0LCBzbyB3ZSBjYW4KKwlzYWZlbHkgZG8gaXQuCisKKzIwMDYtMDQtMjIgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBnY3J5cHQuaCAoZ2NyeV9jdGxfY21kcyk6IE5ldyBjb21tYW5kczoKKwlHQ1JZQ1RMX1NFVF9SQU5ET01fREFFTU9OX1NPQ0tFVCwgR0NSWUNUTF9VU0VfUkFORE9NX0RBRU1PTi4gIAorCSogZ2xvYmFsLmMgKGdjcnlfY29udHJvbCk6IEhhbmRsZSBuZXcgY29tbWFuZHMsIGNhbGxpbmcKKwlfZ2NyeV9zZXRfcmFuZG9tX2RhZW1vbl9zb2NrZXQoKSBhbmQgX2djcnlfdXNlX3JhbmRvbV9kYWVtb24oKS4KKworMjAwNi0wNC0xOCAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogZ2NyeXB0LmggKEdDUllfUEtfVVNBR0VfQ0VSVCwgR0NSWV9QS19VU0FHRV9BVVRIKQorCShHQ1JZX1BLX1VTQUdFX1VOS04pOiBOZXcuCisKKzIwMDYtMDQtMDEgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBnY3J5cHQuaCAoZ2NyeV9hY19lbWVfcGtjc192MV81KTogUmVtb3ZlZCBtZW1iZXJzOiBrZXksIGhhbmRsZTsKKwlhZGRlZCBtZW1iZXI6IGtleV9zaXplLgorCisJKiBzZWNtZW0uYyAoTUJfRkxBR19BQ1RJVkUpOiBXcml0ZSBicmFjZXMgYXJvdW5kIE1CX0ZMQUdfQUNUSVZFCisJZGVmaW5pdGlvbi4KKworMjAwNi0wMy0xNSAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogZ2V0cmFuZG9tLmM6IE5ldy4KKworMjAwNi0wMy0xNCAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogZ2NyeXB0cm5kLmM6IE5ldy4KKworMjAwNi0wMy0xMCAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogZ2NyeXB0Lmg6IEFkZCBHQ1JZX01EX1NIQTIyNC4KKworMjAwNS0xMS0wMiAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGdjcnlwdC5oOiBVcGRhdGUgY29tbWVudHMgZm9yIGZ1bmN0aW9uczogZ2NyeV9jaXBoZXJfYWxnb19uYW1lLAorCWdjcnlfcGtfYWxnb19uYW1lLgorCisyMDA1LTEwLTMxICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogZ2xvYmFsLmM6IEFkZGVkIGRvY3VtZW50YXRpb24uCisKKzIwMDUtMTAtMTYgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBnbG9iYWwuYyAoZ2xvYmFsX2luaXQpOiBVc2UgZ2NyeV9lcnJvcl90IGluc3RlYWQgb2YKKwlnY3J5X2Vycl9jb2RlX3Q7IHVzZSBnb3RvIGluc3RlYWQgb2YgaWYgY29uc3RydWN0cy4KKworCSogc3RkbWVtLmM6IEluc2VydGVkIGRlc2NyaXB0aW9uIG9mIHRoZSBsYXllcmVkIG1lbW9yeSBtYW5hZ2VtZW50CisJaW4gTGliZ2NyeXB0LgorCisJKiBnMTBsaWIuaDogUmVtb3ZlZCBHMTBfSTE4Tl9IIHJlbGF0ZWQgY2hlY2s7IGl0IHNlZW1zIHRvIGJlIGEKKwlHbnVQRyByZWxpY3QgKExpYmdjcnlwdCBkb2VzIG5vdCBkZWZpbmUgdGhpcyBzeW1ib2wgYW55d2hlcmUpLgorCShGTEFHX01PRFVMRV9ESVNBQkxFRCk6IERvbid0IGZvcmdldCBwYXJhbnRoZXNlcyBhcm91bmQgc2hpZnRlZAorCXZhbHVlLgorCQorCVJlbW92ZWQgR0NDX0FUVFJfUFVSRSBtYWNybyBkZWZpbml0aW9ucywgc2luY2UgZ2NyeXB0LmggZG9lcworCWFscmVhZHkgY29udGFpbiBzdWNoIGEgbWFjcm8gbmFtZWQgX0dDUllfR0NDX0FUVFJfUFVSRSwgd2hpY2ggd2UKKwljYW4gdXNlIGhlcmUgYXMgd2VsbC4KKworCUxpa2V3aXNlIGZvciBHQ0NfQVRUUl9NQUxMT0MgYW5kIF9HQ1JZX0dDQ19BVFRSX01BTExPQy4KKworCSogc3RkbWVtLmg6IFVzZSBfR0NSWV9HQ0NfQVRUUl9NQUxMT0MgaW5zdGVhZCBvZiBHQ0NfQVRUUl9NQUxMT0MuCisJKiBzZWNtZW0uaDogTGlrZXdpc2UuCisKKzIwMDUtMTAtMDkgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBnbG9iYWwuYyAoZ2NyeV9jb250cm9sKTogQ2FsbCBnbG9iYWxfaW5pdCgpIGFmdGVyIHBhc3NpbmcgdGhyZWFkCisJY2JzIHRvIGF0aC4gIGdsb2JhbF9pbml0KCkgTVVTVCB0byBiZSBjYWxsZWQgQUZURVIgcGFzc2luZyB0aGUgY2JzCisJdG8gYXRoIGFuZCBCRUZPUkUgY2FsbGluZyBsaWJyYXJ5IGZ1bmN0aW9ucywgd2hpY2ggbWFrZSB1c2Ugb2YKKwlhdGguICBUaGlzIGNoYW5nZSBjb21iaW5lcyBjYnMgaW5zdGFsbGluZyB3aXRoIGF0aCBpbml0aWFsaXphdGlvbgorCWFuZCB0aHVzIHJlbW92ZXMgdGhlIG5lZWQgdG8gY2FsbCBvdGhlciBsaWJyYXJ5IGluaXRpYWxpemF0aW9uCisJZnVuY3Rpb25zIGluYmV0d2VlbiBsaWtlIGUuZy4gZ2NyeV9jaGVja192ZXJzaW9uKCkuCisKKzIwMDUtMTAtMDEgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBhdGguYzogQXNzaWduIGNvcHlyaWdodCB0byBGU0YuCisJKiBhdGguaDogTGlrZXdpc2UuCisKKzIwMDUtMDYtMjUgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBNYWtlZmlsZS5hbSAocGtnY29uZmlnZGlyLCBwa2djb25maWdfREFUQSk6IFJlbW92ZWQgdmFyaWFibGVzLgorCSogbGliZ2NyeXB0LnBjLmluOiBSZW1vdmVkIGZpbGUgLSB3ZSBkbyBub3Qgd2FudCB0byBzdXBwb3J0IGEKKwlzZWNvbmQsIGZvcmVpZ24gY29uZmlndXJhdGlvbiBzeXN0ZW0uCisKKzIwMDUtMDYtMTcgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBnbG9iYWwuYyAoZ2NyeV94c3RyZHVwKTogUmVtb3ZlZCBzdXBlcmZsdW91cyBzdHJjcHkgY2FsbC4KKworMjAwNS0wNC0yMiAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChwa2djb25maWdkaXIsIHBrZ2NvbmZpZ19EQVRBKTogTmV3OyBzdXBwb3J0IGZvcgorCXBrZ2NvbmZpZyBwcm92aWRlZCBieSBBbGJlcnQgQ2hpbi4KKwkqIGxpYmdjcnlwdC5wYy5pbiAoQ2ZsYWdzKTogTmV3IGZpbGUuCisKKzIwMDUtMDQtMTYgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBnMTBsaWIuaCAoX2djcnlfYWNfaW5pdCk6IERlY2xhcmUuCisJKiBnbG9iYWwuYyAoZ2xvYmFsX2luaXQpOiBDYWxsIF9nY3J5X2FjX2luaXQ7IGRvbid0IGZvcmdldCB0byBzZXQKKwllcnIuCisKKzIwMDUtMDQtMTQgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIHNleHAuYyAod2hpdGVzcGFjZXApOiBOZXcuCisJKHNleHBfc3NjYW4pOiBSZXBsYWNlZCBpc2RpZ2l0IGFuZCBpc3NwYWNlIGJ5IHdoaXRlc3BhY2VwIGFuZAorCWRpZ2l0cC4KKworMjAwNS0wNC0xMSAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGdjcnlwdC5oIChnY3J5X21kX2FsZ29zKTogQWRkZWQ6IEdDUllfTURfV0hJUkxQT09MLgorCSogY2lwaGVyLmggKF9nY3J5X2RpZ2VzdF9zcGVjX3doaXJscG9vbCk6IERlY2xhcmUuCisKKzIwMDUtMDMtMzAgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBsaWJnY3J5cHQudmVyczogQWRkZWQ6IGdjcnlfYWNfaW9faW5pdCwgZ3J5X2FjX2lvX2luaXRfdmEuCisKKwkqIGdjcnlwdC5oIChnY3J5X2FjX2RhdGFfcmVhZF9jYl90LCBnY3J5X2FjX2RhdGFfd3JpdGVfY2JfdCwKKwlnY3J5X2FjX2lvX21vZGVfdCwgZ2NyeV9hY19pb190eXBlX3QsIGdjcnlfYWNfaW9fdCk6IE5ldyB0eXBlcy4KKwkoZ2NyeV9hY19pb19pbml0X3ZhKTogRGVjbGFyZSBmdW5jdGlvbi4KKwkoZ2NyeV9hY19kYXRhX2VuY29kZSwgZ2NyeV9hY19kYXRhX2RlY29kZSwKKwlnY3J5X2FjX2RhdGFfZW5jcnlwdF9zY2hlbWUsIGdjcnlfYWNfZGF0YV9kZWNyeXB0X3NjaGVtZSwKKwlnY3J5X2FjX2RhdGFfc2lnbl9zY2hlbWUsIGdjcnlfYWNfZGF0YV92ZXJpZnlfc2NoZW1lKTogVXNlCisJZ2NyeV9hY19pb190eXBlX3Qgb2JqZWN0cyBpbnN0ZWFkIG9mIG1lbW9yeSBzdHJpbmdzIGRpcmVjdGx5LgorCisyMDA1LTAzLTAzICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogbGliZ2NyeXB0LnZlcnM6IEFkZGVkOiBnY3J5X2FjX2RhdGFfdG9fc2V4cCgpIGFuZAorCWdjcnlfYWNfZGF0YV9mcm9tX3NleHAoKS4KKworMjAwNS0wMi0yMiAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogZ2xvYmFsLmMgKF9nY3J5X21hbGxvYyk6IE1ha2Ugc3VyZSBFUlJOTyBpcyBzZXQgaWYgd2UgcmV0dXJuCisJTlVMTC4gIFJlbW92ZSB1bm5lZWRlZCBpbml0aWFsaXphdGlvbiBvZiBNIHRvIGFsbG93IHRoZSBjb21waWxlcgorCXRvIGNhdGNoIGVycm9ycy4KKwkoZ2NyeV9yZWFsbG9jKTogTWFrZSBzdXJlIEVSUk5PIGlzIHNldCBpZiB3ZSByZXR1cm4gTlVMTD4KKworMjAwNS0wMi0xMyAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGdjcnlwdC5oOiBEZWNsYXJlIG5ldyBmdW5jdGlvbnM6IGdjcnlfYWNfZGF0YV9lbmNyeXB0X3NjaGVtZSwKKwlnY3J5X2FjX2RhdGFfZGVjcnlwdF9zY2hlbWUsIGdjcnlfYWNfZGF0YV9zaWduX3NjaGVtZSwKKwlnY3J5X2FjX2RhdGFfdmVyaWZ5X3NjaGVtZSwgZ2NyeV9hY19kYXRhX2VuY29kZSwKKwlnY3J5X2FjX2RhdGFfZGVjb2RlLCBnY3J5X2FjX2RhdGFfdG9fc2V4cCwgZ2NyeV9hY19kYXRhX2Zyb21fc2V4cC4KKwlOZXcgdHlwZXM6IGdjcnlfYWNfZW1zYV9wa2NzX3YxXzVfdCwgZ2NyeV9hY19zc2FfcGtjc192MV81X3QsCisJZ2NyeV9tZF9hbGdvX3QuCisJTmV3IGVudW1lcmF0aW9uIGxpc3RzOiBnY3J5X2FjX3NjaGVtZV90LCBnY3J5X2FjX2VtX3QuCisJKiBsaWJnY3J5cHQudmVyczogQWRkZWQgbmV3IGFjIGZ1bmN0aW9ucy4KKwkqIGcxMGxpYi5oOiBEZWNsYXJlIGZ1bmN0aW9uOiBfZ2NyeV9wa19nZXRfZWxlbWVudHMuCisJKiBtcGkuaCAobXBpX2dldF91aSk6IE5ldyBtYWNyby4KKwlEZWNsYXJlIGZ1bmN0aW9uOiBfZ2NyeV9tcGlfZ2V0X3VpLgorCisyMDA0LTExLTA5ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBnY3J5cHQuaDogUmVtb3ZlZCAzIHRyYWlsaW5nIGNvbW1hcyBmcm9tIGVudW1zLiAgTm90ZWQgYnkgSGVpa28KKwlTdGFtZXIuCisKKzIwMDQtMDktMjEgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5kZT4KKworCSogc2V4cC5jIChzZXhwX3NzY2FuKTogUmVtb3ZlZCBDKysgc3R5bGUgY29tbWVudHMuICBOb3RlZCBieSBZb2FubgorCVZhbmRvb3JzZWxhZXJlLgorCisyMDA0LTA4LTIzICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogZ2xvYmFsLmM6IERvIG5vdCBpbmNsdWRlIDxhc3NlcnQuaD4uIAorCSogc2V4cC5jOiBMaWtld2lzZS4KKwkqIG1vZHVsZS5jOiBMaWtld2lzZS4KKwkqIG1pc2MuYzogTGlrZXdpc2UuCisKKzIwMDQtMDgtMTggIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBzZWNtZW0uYyAoX2djcnlfc2VjbWVtX2luaXQpOiBUcnkgdG8gbG9jayBwb29sIGludG8gY29yZSBub3QKKwlvbmx5IHdoZW4gcnVubmluZyB3aXRoIHJvb3QgcHJpdmlsZWdlcy4KKworMjAwNC0wOC0xNiAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmRlPgorCisJKiBzZWNtZW0uaCAoX2djcnlfc2VjbWVtX3NldF9mbGFncyxfZ2NyeV9zZWNtZW1fZ2V0X2ZsYWdzKToKKwlSZW1vdmVkIF9fcHVyZV9fLgorCShHQ1JZX1NFQ01FTV9GTEFHX05PX1dBUk5JTkcpOiBQdXQgbWFjcm8gdmFsdWUgaW50byBwYXJlbnMuCisKKwkqIHNlY21lbS5jIChfZ2NyeV9zZWNtZW1faW5pdCk6IERlZmVyIHByaW50aW5nIG9mIHRoZSB3YXJuaW5nLgorCisyMDA0LTA4LTEwICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogZ2NyeXB0Lmg6IEluY2x1ZGUgPHN5cy90aW1lLmg+LCB0aGFua3MgdG8gU2ltb24gSm9zZWZzc29uLgorCisyMDA0LTA1LTA3ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogZ2NyeXB0Lmg6IEFkZGVkIEdDUllDVExfRkFTVF9QT0xMLgorCShnY3J5X2Zhc3RfcmFuZG9tX3BvbGwpOiBOZXcuCisJKiBnbG9iYWwuYyAoZ2NyeV9jb250cm9sKSA8SU5JVElBTElaQVRJT05fRklOSVNIRUQ+OiBEbyBvbmx5IGJhc2ljCisJcmFuZG9tIHN1YnN5c3RlbSBpbml0LgorCShnY3J5X2NvbnRyb2wpIDxGQVNUX1BPTEw+OiBOZXcuCisKKzIwMDQtMDQtMjIgIE1hcmN1cyBCcmlua21hbm4gIDxtYXJjdXNAZzEwY29kZS5kZT4KKworCSogbGliZ2NyeXB0Lm00OiBRdW90ZSBmaXJzdCBhcmd1bWVudCB0byBBQ19ERUZVTi4KKworMjAwNC0wNC0xNSAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIHNlY21lbS5jIChfZ2NyeV9zZWNtZW1fbWFsbG9jX2ludGVybmFsKTogUmVtb3ZlZCBvbGQgZXh0cmEgaW5mbworCWVycm9yIG91dHB1dC4KKwkoX2djcnlfc2VjbWVtX3Rlcm0pOiBVc2Ugd2lwZW1lbW9yeTIgaGVyZS4KKworCSogbWlzYy5jIChfZ2NyeV9idXJuX3N0YWNrKTogVXNlIHdpcGVtZW1vcnkgdG8gYXZvaWQgb3B0aW1pemF0aW9ucy4KKworCSogc3RyaW5nLmM6IFJlbW92ZWQuICBXYXMgbmV2ZXIgdXNlZC4KKwkqIGdsb2JhbC5jIChnY3J5X3N0cmR1cCk6IFJlcGxhY2VkIGJ5IHRoZSB2ZXJzaW9uIGZyb20gc3RyaW5nLmMKKwkoZ2NyeV94c3RyZHVwKTogUmV3cml0dGVuLgorCSogZ2NyeXB0Lmg6IFJlbW92ZWQgZHVwbGljYXRlIHByb3RvdHlwZSBmb3IgZ2NyeV9zdHJkdXAuCisKKzIwMDQtMDMtMjkgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBzZWNtZW0uYyAoX2djcnlfc2VjbWVtX3JlYWxsb2MpOiBGaXhlZCBkb3VibGUgdW5sb2NrOyBidWcKKwltYW5pZmVzdGVkIGl0c2VsZiBkdWUgdG8gdGhlIG1vcmUgcmlnb3JvdXMgY2hlY2tpbmcgaW4gdGhlIGNoYW5nZWQKKwlhdGguaAorCisJKiBsaWJnY3J5cHQtY29uZmlnLmluIChPcHRpb25zKTogSWdub3JlIHRoZSBvYnNvbGV0ZSAtLXRocmVhZHMKKwlvcHRpb24gZm9yIG5vdy4KKworMjAwNC0wMy0xNyAgTWFyY3VzIEJyaW5rbWFubiAgPG1hcmN1c0BnMTBjb2RlLmRlPgorCisJKiBsaWJnY3J5cHQtY29uZmlnLmluIChpbmNsdWRlZGlyLCBsaWJkaXIpOiBRdW90ZSdlbS4gIFVzZQorCSRncGdfZXJyb3JfY2ZsYWdzIGFuZCAkZ3BnX2Vycm9yX2xpYnMuICBGaXggY29uc3RydWN0aW9uIG9mCisJJGluY2x1ZGVzLgorCisyMDA0LTAzLTE0ICBNYXJjdXMgQnJpbmttYW5uICA8bWFyY3VzQGcxMGNvZGUuZGU+CisKKwkqIGxpYmdjcnlwdC1jb25maWcuaW4gKGluY2x1ZGVkaXIsIGxpYmRpcik6IE5ldyB2YXJpYWJsZXMuICBGb3IKKwktLWNmbGFncywgZG9uJ3QgdGVzdCAkY2ZsYWdzLiAgQWxzbyBjaGVjayBhZ2FpbnN0IC9pbmNsdWRlIGZvciB0aGUKKwlHTlUvSHVyZC4gIERvbid0IG92ZXJ3cml0ZSBidXQgZXh0ZW5kICRjZmxhZ3NfZmluYWwuICBMaWtld2lzZSBmb3IKKwktLWxpYnMuCisKKzIwMDQtMDMtMTAgIE1hcmN1cyBCcmlua21hbm4gIDxtYXJjdXNAZzEwY29kZS5kZT4KKworCSogTWFrZWZpbGUuYW0gKGx0bGliX2xpYmdjcnlwdF9wdGhyZWFkLCBsdGxpYl9saWJnY3J5cHRfcHRoKTogUmVtb3ZlZC4KKwkobGliX0xUTElCUkFSSUVTKTogUmVtb3ZlIHRob3NlIHZhcmlhYmxlcyBmcm9tIGhlcmUuCisJKGxpYmdjcnlwdF9wdGhyZWFkX2xhX1NPVVJDRVMsIGxpYmdjcnlwdF9wdGhyZWFkX2xhX0xERkxBR1MsCisJKGxpYmdjcnlwdF9wdGhyZWFkX2xhX0RFUEVOREVOQ0lFUywgbGliZ2NyeXB0X3B0aHJlYWRfbGFfTElCQURELAorCShsaWJnY3J5cHRfcHRoX2xhX1NPVVJDRVMsIGxpYmdjcnlwdF9wdGhfbGFfTERGTEFHUywKKwkobGliZ2NyeXB0X3B0aF9sYV9ERVBFTkRFTkNJRVMsIGxpYmdjcnlwdF9wdGhfbGFfTElCQURELAorCShub2luc3RfTFRMSUJSQVJJRVMpOiBSZW1vdmVkLgorCShsaWJnY3J5cHRfcmVhbF9sYV9TT1VSQ0VTKTogTWVyZ2Ugd2l0aCAuLi4KKwkobGliZ2NyeXB0X2xhX1NPVVJDRVMpOiAuLi4gbGlrZXdpc2UuCisJKGxpYmdjcnlwdF9yZWFsX2xhX0RFUEVOREVOQ0lFUyk6IE1lcmdlIHdpdGggLi4uCisJKGxpYmdjcnlwdF9sYV9ERVBFTkRFTkNJRVMpOiAuLi4gdGhpcy4KKwkobGliZ2NyeXB0X3JlYWxfbGFfTElCQUREKTogTWVyZ2Ugd2l0aCAuLi4KKwkobGliZ2NyeXB0X2xhX0xJQkFERCk6IC4uLiB0aGlzLgorCSogbGliZ2NyeXB0LWNvbmZpZy5pbiAobGlic19wdGhyZWFkLCBsaWJzX3B0aCwgY2ZsYWdzX3B0aCkgCisJKGNmbGFnc19wdGhyZWFkLCB0aHJlYWRfbW9kdWxlLCB0aHJlYWRfbW9kdWxlcyk6IFJlbW92ZWQuCisJKE9wdGlvbnMpOiBSZW1vdmUgLS10aHJlYWQgb3B0aW9uIGZyb20gaGVscCBvdXRwdXQuICBJZiB0aGUgb3B0aW9uCisJaXMgc3BlY2lmaWVkLCBvdXRwdXQgYW4gZXJyb3IgYW5kIGV4aXQuCisJRm9yIC0tY2ZsYWdzIGFuZCAtLWxpYnMgb3B0aW9uLCByZW1vdmUgcHRoIGFuZCBwdGhyZWFkIGZyb20gb3V0cHV0LgorCSogZ2NyeXB0Lmg6IEluY2x1ZGUgPHN5cy90eXBlcy5oPiBhbmQgPHN5cy9zb2NrZXQuaD4uCisJKGVudW0gZ2NyeV9jdGxfY21kcyk6IEFkZCBHQ1JZQ1RMX1NFVF9USFJFQURfQ0JTLgorCShnY3J5X3RocmVhZF9jYnMpOiBOZXcgc3RydWN0LgorCSogZ2xvYmFsLmMgKGdjcnlfY29udHJvbCk6IEltcGxlbWVudCBHQ1JZQ1RMX1NFVF9USFJFQURfQ0JTLgorCShnbG9iYWxfaW5pdCk6IERvbid0IGNhbGwgYXRoX2luaXQgaGVyZS4KKwkqIGF0aC5oOiBSZXdyaXR0ZW4uCisJKiBhdGguYzogUmV3cml0dGVuLgorCisyMDA0LTAzLTA2ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogbGliZ2NyeXB0LWNvbmZpZy5pbjogcy8tLXNvbmFtZS1udW1iZXIvLS1hcGktdmVyc2lvbi8KKwkqIGxpYmdjcnlwdC5tNDogQ2hhbmdlZCB0ZXN0IGZvciBBUEkgdmVyc2lvbi4KKworMjAwNC0wMy0wNSAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIGxpYmdjcnlwdC5tNDogT3B0aW9uYWxseSBjaGVjayB0aGUgU09OQU1FIG51bWJlci4KKworCSogbGliZ2NyeXB0LWNvbmZpZy5pbjogQWRkIG9wdGlvbiAtLXNvbmFtZS1udW1iZXIKKworMjAwNC0wMy0wMSAgTWFyY3VzIEJyaW5rbWFubiAgPG1hcmN1c0BnMTBjb2RlLmRlPgorCisJKiBNYWtlZmlsZS5hbSAobGliZ2NyeXB0X2xhX1NPVVJDRVMpOiBBZGQgYXRoLmMuCisJKiBhdGguYyAoYXRoX2luaXQpOiBBZGQgbWlzc2luZyBmdW5jdGlvbi4KKworCSogTWFrZWZpbGUuYW0gKGF0aF9wdGhfc3JjKTogUmVtb3ZlZC4KKwkoYXRoX3B0aHJlYWRfc3JjKTogUmVtb3ZlZC4KKwkobGliZ2NyeXB0X2xhX1NPVVJDRVMpOiBSZW1vdmUgYXRoLWNvbXBhdCwgJChhdGhfcHRoX3NyYykgYW5kCisJJChhdGhfcHRocmVhZF9zcmMpLgorCSogYXRoLWNvbXBhdC5jLCBhdGgtcHRoLWNvbXBhdC5jLCBhdGgtcHRocmVhZC1jb21wYXQuYzogRmlsZXMKKwlyZW1vdmVkLgorCQorMjAwNC0wMi0yMCAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIGdjcnlwdC5oIChHQ1JZX1BSSU1FX0NIRUNLX0FUX0dPVF9QUklNRSkKKwkoR0NSWV9QUklNRV9DSEVDS19BVF9GSU5JU0gpLAorCShHQ1JZX1BSSU1FX0NIRUNLX0FUX01BWUJFX1BSSU1FKTogTmV3LgorCisyMDA0LTAyLTE4ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogbGliZ2NyeXB0LWNvbmZpZy5pbjogSWdub3JlIHNldHRpbmcgb2YgLS1wcmVmaXguCisKKzIwMDQtMDItMTMgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBnY3J5cHQuaDogQWRkZWQgR0NSWV9DSVBIRVJfUkZDMjI2OF8xMjgsIGFsc3Rob3VnaCBub3QgeWV0CisJc3VwcG9ydGVkLgorCisyMDA0LTAyLTA2ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogZ2NyeXB0Lmg6IEFkZGVkIEdDUllfQ0lQSEVSX1JGQzIyNjhfNDAuCisKKzIwMDQtMDItMDMgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBzZWNtZW0uYyAoX2djcnlfc2VjbWVtX2luaXQpOiBEbyBub3QgcHJpbnQgdGhlICJub3QgbG9ja2VkIGludG8KKwljb3JlIHdhcm5pbmciIGlmIHRoZSBOT19XQVJOSU5HIGZsYWcgaGFzIGJlZW4gc2V0LgorCisJKiBzZXhwLmMgKHNleHBfc3NjYW4pOiBBbGxvY2F0ZSByZXN1bHQgaW4gc2VjdXJlIG1lbW9yeSBpZiBCVUZGRVIKKwlpcyBpbiBzZWN1cmUgbWVtb3J5LiBTd2l0Y2ggdG8gc2VjdXJlIG1lbW9yeSBmb3IgdGhlIGEgc2VjdXJlICViCisJZm9ybWF0IGl0ZW0uIEV4dHJhIHBhcmFub2lkIHdpcGUgb24gZXJyb3IuCisJKGdjcnlfc2V4cF9yZWxlYXNlKTogQWRkZWQgcGFyYW5vaWQgd2lwaW5nIGZvciBzZWN1cmVseSBhbGxvY2F0ZWQKKwlTLWV4cHJlc3Npb25zLgorCisyMDA0LTAxLTI1ICBNb3JpdHogU2NodWx0ZSAgPG1vQGcxMGNvZGUuY29tPgorCisJKiBhdGguaDogSW5jbHVkZSA8Y29uZmlnLmg+LgorCisyMDA0LTAxLTEyICBNb3JpdHogU2NodWx0ZSAgPG1vQGcxMGNvZGUuY29tPgorCisJKiBnY3J5cHQuaDogQWRqdXN0ZWQgZGVjbGFyYXRpb25zIG9mOiBnY3J5X2FjX2RhdGFfc2V0LAorCWdjcnlfYWNfZGF0YV9nZXRfbmFtZSwgZ2NyeV9hY19kYXRhX2dldF9pbmRleCwKKwlnY3J5X2FjX2tleV9wYWlyX2dlbmVyYXRlLCBnY3J5X2FjX2tleV90ZXN0LAorCWdjcnlfYWNfa2V5X2dldF9uYml0cywgZ2NyeV9hY19rZXlfZ2V0X2dyaXAuCisKKwkqIGdjcnlwdC5oIChHQ1JZX0FDX0ZMQUdfREFUQV9OT19CTElORElORyk6IFJlbW92ZWQgc3ltYm9sLgorCShHQ1JZX0FDX0ZMQUdfREVBTExPQywgR0NSWV9BQ19GTEFHX0NPUFkpIAorCShHQ1JZX0FDX0ZMQUdfTk9fQkxJTkRJTkcpOiBOZXcgc3ltYm9scy4KKworCSogZ2xvYmFsLmMgKGdjcnlfc3RyZHVwKTogUmVtb3ZlZCBmdW5jdGlvbi4KKwkqIHN0cmluZy5jOiBOZXcgZmlsZS4KKwkqIE1ha2VmaWxlLmFtIChsaWJnY3J5cHRfcmVhbF9sYV9TT1VSQ0VTKTogQWRkZWQ6IHN0cmluZy5jLgorCSogc3RyaW5nLmMgKGdjcnlfc3RyZHVwKTogTmV3IGZ1bmN0aW9uLgorCSogZ2NyeXB0LmggKGdjcnlfc3RyZHVwKTogRGVjbGFyZS4KKworMjAwMy0xMi0xOSAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIGcxMGxpYi5oICh3aXBlbWVtb3J5LCB3aXBlbWVtb3J5Mik6IE5ldzsgdGFrZW4gZnJvbSBnbnVwZy4KKworMjAwMy0xMS0xNCAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIGdsb2JhbC5jIChnY3J5X3N0cmR1cCk6IERvbid0IGNvcHkgdGhlIHN0cmluZyBhZnRlciBhIG1hbGxvYworCWVycm9yLgorCisyMDAzLTExLTExICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogc2V4cC5jIChzZXhwX3NzY2FuKTogSW1wbGVtZW50ZWQgIiViIiBmb3JtYXQgc3BlY2lmaWVyLgorCisyMDAzLTExLTExICBNb3JpdHogU2NodWx0ZSAgPG1vQGcxMGNvZGUuY29tPgorCisJKiBsaWJnY3J5cHQubTQ6IERvIG5vdCBzZXQgcHJlZml4IHdoZW4gY2FsbGluZyBsaWJnY3J5cHQtY29uZmlnLgorCVRoYW5rcyB0byBOaWtvcyBNYXZyb3lhbm9wb3Vsb3MuCisKKzIwMDMtMTEtMDggIE1vcml0eiBTY2h1bHRlICA8bW9AZzEwY29kZS5jb20+CisKKwkqIGNpcGhlci5oIChzbWFsbF9wcmltZV9udW1iZXJzKTogUmVtb3ZlZCBkZWNsYXJhdGlvbi4KKwkoUFVCS0VZX0ZMQUdfTk9fQkxJTkRJTkcpOiBQdXQgYnJhY2VzIGFyb3VuZCBzaGlmdC4KKworMjAwMy0xMS0wNCAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIGNpcGhlci5oIChfZ2NyeV9zaGExX2hhc19idWZmZXIpOiBOZXcuCisKKwkqIGdjcnlwdC5oIChnY3J5X2NyZWF0ZV9ub25jZSk6IE5ldy4KKworMjAwMy0xMC0zMSAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIGxpYmdjcnlwdC52ZXJzIChfZ2NyeV9nZW5lcmF0ZV9lbGdfcHJpbWUpOiBSZW1vdmVkIHRoaXMgc3ltYm9sOworCWdudXRscyBkb2VzIG5vdCBuZWVkIGl0IGFueW1vcmUuCisKKwkqIHNlY21lbS5jIChtYl9nZXRfbmV3KTogcy9wb29sL2Jsb2NrLyBkdWUgdG8gZ2xvYmFsIHBvb2wuCisKKwkqIG1pc2MuYyAoZ2NyeV9zZXRfbG9nX2hhbmRsZXIpOiBzL2xvZ2YvZi8gdG8gYXZvaWQgc2hhZG93aW5nCisJd2FybmluZyBhZ2FpbnN0IGEgYnVpbHRpbi4KKworCSogYXRoLXB0aC1jb21wYXQuYzogY2FzdCBwdGhfY29ubmVjdCB0byBnZXQgcmlkIG9mIHRoZSBjb25zdAorCXByb3RvdHlwZS4KKworMjAwMy0xMC0yNyAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIGF0aC5oIChBVEhfTVVURVhfSU5JVElBTElaRVIpOiBSZW1vdmVkIHNwdXJpb3VzIHNlbWljb2xvbi4KKworMjAwMy0xMC0yNyAgTW9yaXR6IFNjaHVsdGUgIDxtb0BnMTBjb2RlLmNvbT4KKworCSogbGliZ2NyeXB0LWNvbmZpZy5pbjogSW5jbHVkZSBsaWJzL2NmbGFncyBvZiBsaWJncGctZXJyb3IuCisKKwkqIHNleHAuYyAoc2V4cF9zc2Nhbik6IENsZWFuZWQgdXAsIGRlYWxsb2NhdGUgc2Nhbm5lZCBzZXhwIG9uCisJZXJyb3IuCisKKwkqIG1vZHVsZS5jIChNT0RVTEVfSURfTUlOKTogTmV3IHN5bWJvbCwgdXNlIGl0LgorCisyMDAzLTEwLTI3ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogZ2NyeXB0LmggKGdjcnlfcGtfdGVzdGtleSk6IERvYyBmaXguCisKKzIwMDMtMDktMjkgIE1vcml0eiBTY2h1bHRlICA8bW9AZzEwY29kZS5jb20+CisKKwkqIGxpYmdjcnlwdC1jb25maWcuaW46IEZpeCAtLWFsZ29yaXRobXMgb3B0aW9uLgorCisyMDAzLTEwLTIzICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogZ2NyeXB0LmggKGdjcnlfZXJyX2NvZGUpOiBVc2UgR1BHX0VSUl9JTkxJTkUgaW5zdGVhZCBvZgorCV9faW5saW5lX18uCisKKwkqIHNlY21lbS5jIChsb2NrX3Bvb2wpOiBEb24ndCBwcmludCB0aGUgd2FybmluZyBmb3IgY2VydGFpbgorCXN5c3RlbXMsIGhhbmRsZSBFTk9NRU0uCisKKzIwMDMtMTAtMjEgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBzZWNtZW0uYyAoX2djcnlfc2VjbWVtX2R1bXBfc3RhdHMpOiBGaXhlZCBmb3JtYXQgc2VwY2lmaWVyIGZvciBhCisJc2l6ZV90LiAgUmVwb3J0ZWQgYnkgU3RlcGhhbmUgQ29ydGhlc3kuCisKKzIwMDMtMTAtMTAgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBnbG9iYWwuYyAoX2djcnlfbWFsbG9jKTogSGFuZGxlIHRoZSBub19zZWN1cmVfbWVtb3J5IG9wdGlvbi4KKworCSogZ2NyeXB0LmggKGdjcnlfcHJpbWVfZ3JvdXBfZ2VuZXJhdG9yKTogTmV3LgorCShnY3J5X3ByaW1lX3JlbGVhc2VfZmFjdG9ycyk6IE5ldy4KKworMjAwMy0xMC0wNyAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIHNleHAuYyAoc2V4cF9zc2Nhbik6IENoZWNrIHRoYXQgcGFyZW50aGVzaXMgYXJlIG1hdGNoaW5nLgorCisyMDAzLTA5LTI4ICBNb3JpdHogU2NodWx0ZSAgPG1vQGcxMGNvZGUuY29tPgorCisJKiBnMTBsaWIuaDogRGVjbGFyZTogX2djcnlfbWFsbG9jLgorCShHQ1JZX0FMTE9DX0ZMQUdfU0VDVVJFKTogTmV3IHN5bWJvbC4KKworCSogZ2xvYmFsLmMgKF9nY3J5X21hbGxvYyk6IE5ldyBmdW5jdGlvbi4uLgorCShnY3J5X21hbGxvYyk6IC4uLiB1c2UgaXQuCisJKGdjcnlfbWFsbG9jX3NlY3VyZSk6IExpa2V3aXNlLgorCisJKiBhdGguYzogQ2hhbmdlIExpY2Vuc2UgdG8gTEdQTC4KKwkqIGF0aC1wdGhyZWFkLWNvbXBhdC5jOiBMaWtld2lzZS4KKwkqIGF0aC1wdGhyZWFkLmM6IExpa2V3aXNlLgorCSogYXRoLXB0aC1jb21wYXQuYzogTGlrZXdpc2UuCisJKiBhdGgtcHRoLmM6IExpa2V3aXNlLgorCSogYXRoLmg6IExpa2V3aXNlLgorCSogYXRoLWNvbXBhdC5jOiBMaWtld2lzZS4KKworCSogc2VjbWVtLmMgKF9nY3J5X3NlY21lbV9yZWFsbG9jKTogRG8gbm90IGZvcmdldCB0byByZWxlYXNlIHNlY21lbQorCWxvY2suICBUaGFua3MgdG8gbG93IGhhbG8gZm9yIHRyaWdnZXJpbmcgdGhpcyBidWcuCisKKzIwMDMtMDktMDQgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBnY3J5cHQuaCAoX0dDUllfRVJSX1NPVVJDRV9ERUZBVUxUKTogUmVtb3ZlZCBjcnVmdC4KKwkoZ2NyeV9wcmltZV9jaGVja19mdW5jX3QpOiBSZW5hbWVkIGFyZyBmb3IgY2xhcml0eS4KKworMjAwMy0wOS0wMiAgTW9yaXR6IFNjaHVsdGUgIDxtb0BnMTBjb2RlLmNvbT4KKworCSogZ2NyeXB0LmggKEdDUllfUFJJTUVfRkxBR19TUEVDSUFMX0ZBQ1RPUik6IE5ldyBzeW1ib2wuCisKKzIwMDMtMDktMDEgIE1vcml0eiBTY2h1bHRlICA8bW9AZzEwY29kZS5jb20+CisKKwkqIGdjcnlwdC5oIChnY3J5X3JhbmRvbV9sZXZlbF90KTogTmV3IHR5cGUuCisJKGdjcnlfcHJpbWVfY2hlY2tfZnVuY190KTogTGlrZXdpc2UuCisJKEdDUllfUFJJTUVfRkxBR19TRUNSRVQpOiBOZXcgc3ltYm9sLgorCShnY3J5X3ByaW1lX2dlbmVyYXRlLCBnY3J5X3ByaW1lX2NoZWNrKTogRGVjbGFyZSBmdW5jdGlvbnMuCisKKzIwMDMtMDgtMjggIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBNYWtlZmlsZS5hbSAobGliZ2NyeXB0X3B0aF9sYV9MREZMQUdTKTogUmVtb3ZlZCBQVEhfQ0ZMQUdTIGNydWZ0LgorCisyMDAzLTA4LTI3ICBNb3JpdHogU2NodWx0ZSAgPG1vQGcxMGNvZGUuY29tPgorCisJKiBnbG9iYWwuYyAoZ2NyeV9jb250cm9sKTogUmVtb3ZlIGNhbGwgdG8gYXRoX2RlaW5pdC4KKworCSogTWFrZWZpbGUuYW0gKGxpYmdjcnlwdF9yZWFsX2xhX0RFUEVOREVOQ0lFUyk6IEZpeGVkLgorCShsaWJnY3J5cHRfcmVhbF9sYV9MSUJBREQpOiBGaXhlZC4KKwlSZW1vdmVkIHVuZWNlc3NhcnkgdmFyaWFibGVzLgorCisJKiBsaWJnY3J5cHQtY29uZmlnLmluOiBBZGp1c3RlZCBzY3JpcHQgZm9yIG5ldyB0aHJlYWQgaGFuZGxpbmcuCisKKwkqIE1ha2VmaWxlLmFtOiBOZXcgdmVyc2lvbiwgYmFzZWQgb24gR1BHTUVzIE1ha2VmaWxlLmFtLgorCisJKiBhdGguYywgYXRoLWNvbXBhdC5jLCBhdGguaCwgYXRoLXB0aC5jLCBhdGgtcHRoLWNvbXBhdC5jLAorCWF0aC1wdGhyZWFkLmMsIGF0aC1wdGhyZWFkLWNvbXBhdC5jOiBOZXcgZmlsZXMsIG1lcmdlZCBmcm9tIEdQR01FLgorCSogYXRoLmMsIGF0aC5oLCBhdGgtcHRocmVhZC5jLCBhdGgtcHRoLmM6IFJlbW92ZWQgZmlsZXMuCisKKzIwMDMtMDgtMDggIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBnbG9iYWwuYyAoZ2NyeV9yZWFsbG9jKTogUmVtb3ZlIEZJWE1FIGFib3V0IGBjbGVhcmluZyBvdXQKKwlyZWFsbG9jZWQgbWVtb3J5Jywgc2luY2UgX2djcnlfc2VjbWVtX3JlYWxsb2MgdGFrZXMgY2FyZSBvZgorCW92ZXJ3cml0aW5nIG9sZCBtZW1vcnkuCisKKzIwMDMtMDgtMDcgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBtb2R1bGUuYyAoX2djcnlfbW9kdWxlX3JlbGVhc2UpOiBEb24ndCBhY3QgaWYgbW9kdWxlIGlzIE5VTEwuCisKKzIwMDMtMDctMzAgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBnY3J5cHQuaCAoZW51bSBnY3J5X2FjX2lkKTogQWRkZWQ6IEdDUllfQUNfRUxHX0UuCisJUmV2ZXJ0ZWQgY2hhbmdlOiB1c2UgZ2NyeV9tZF9mbGFncyBlbnVtZXJhdGlvbiBsaXN0IGluc3RlYWQgb2YKKwlkZWZpbmVzLgorCisyMDAzLTA3LTI5ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogZ2xvYmFsLmMgKGdjcnlfY29udHJvbCk6IEFkZCBHQ1JZQ1RMX1NFVF9SQU5ET01fU0VFRF9GSUxFIGFuZAorCUdDUllDVExfVVBEQVRFX1JBTkRPTV9TRUVEX0ZJTEUuCisJKiBnY3J5cHQuaDogRGl0dG8uICBSZW5hbWVkIGluZGV4IHRvIGlkeCwgc28gYXZvaWQgd2FybmluZworCXJlbGF0ZWQgdG8gdGhlIG9sZCBpbmRleCBmdW5jdGlvbi4KKworMjAwMy0wNy0yOCAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGdsb2JhbC5jIChnY3J5X2Vycl9jb2RlX2Zyb21fZXJybm8sIGdjcnlfZXJyX2NvZGVfdG9fZXJybm8pCisJKGdjcnlfZXJyX21ha2VfZnJvbV9lcnJubywgZ2NyeV9lcnJvcl9mcm9tX2Vycm5vKTogTmV3IGZ1bmN0aW9ucy4KKworCSogZ2NyeXB0Lmg6IERlY2xhcmVkOiBnY3J5X2Vycl9jb2RlX2Zyb21fZXJybm8sCisJZ2NyeV9lcnJfY29kZV90b19lcnJubywgZ2NyeV9lcnJfbWFrZV9mcm9tX2Vycm5vLAorCWdjcnlfZXJyb3JfZnJvbV9lcnJuby4KKworCSogTWFrZWZpbGUuYW0gKGluY2x1ZGVfSEVBREVSUyk6IEFkZGVkOiBnY3J5cHQtbW9kdWxlLmguCisKKwkqIGdjcnlwdC5oOiBJbmNsdWRlIDxnY3J5cHQtbW9kdWxlLmg+LgorCisJKiBnY3J5cHQtbW9kdWxlLmg6IE5ldyBmaWxlLgorCisyMDAzLTA3LTI3ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogZ2NyeXB0LmggKGdjcnlfbXBpX3NjYW4sIGdjcnlfbXBpX3ByaW50KTogQVBJIGNoYW5nZS4KKwkoZ2NyeV9tcGlfZHVtcCk6IE5ldy4KKworMjAwMy0wNy0yMSAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGdjcnlwdC5oOiBEZWNsYXJlZDogZ2NyeV9hY19rZXlfZGF0YV9nZXQuCisJKGdjcnlfcGtfc3BlYyk6IFJlbmFtZWQgbWVtYmVyIGBzZXhwX25hbWVzJyBpbnRvIGBhbGlhc2VzJy4KKworMjAwMy0wNy0yMCAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGdjcnlwdC5oIChnY3J5X21kX29pZF9zcGVjX3QpOiBOZXcgdHlwZS4KKwkoZ2NyeV9tZF9zcGVjKTogTmV3IG1lbWJlcjogb2lkcy4KKworMjAwMy0wNy0xOSAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGdjcnlwdC5oIChnY3J5X2NpcGhlcl9vaWRfc3BlY190KTogTmV3IHR5cGUuCisJKGdjcnlfY2lwaGVyX3NwZWMpOiBOZXcgbWVtYmVyOiBvaWRzOworCisyMDAzLTA3LTE4ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogZ2NyeXB0LmggKGdjcnlfbXBpX3NldF9vcGFxdWUpOiBBZGQgYSB3YXJuaW5nIGNvbW1lbnQuCisKKzIwMDMtMDctMTUgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBzZWNtZW0uYyAoY29tcHJlc3NfcG9vbCk6IFJlbW92ZSBmdW5jdGlvbiwgc2luY2UgdW51c2VkIGJsb2NrcworCWFyZSBhdXRvbWF0aWNhbGx5IGNvbmNhdGVuYWQuCisKKwkqIGdjcnlwdC5oOiBCdW1wZWQgdmVyc2lvbiBudW1iZXIgdXAgdG8gMS4xLjQyLWN2cy4KKworMjAwMy0wNy0xNCAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGdjcnlwdC5oIChnY3J5X2NpcGhlcl9zcGVjKTogTmV3IG1lbWJlcjogYWxpYXNlcy4KKworCSogTWFrZWZpbGUuYW0gKG5vaW5zdF9QUk9HUkFNUywgdGVzdGFwaV9TT1VSQ0VTLCB0ZXN0YXBhaV9MREFERCwKKwliZW5jaG1hcmtfU09VUkNFUywgYmVuY2htYXJrX0xEQUREKTogUmVtb3ZlZC4KKworCSogYmVuY2htYXJrLmMsIHRlc3RhcGkuYzogUmVtb3ZlZCBmaWxlcy4KKworCSogbXBpLmg6IFJlbW92ZWQgZGlzYWJsZWQgdHlwZWRlZi4KKwkqIGcxMGxpYi5oOiBMaWtld2lzZS4KKworCSogYmVuY2htYXJrLmMsIGcxMGxpYi5oLCBnY3J5cHQuaCwgZ2xvYmFsLmMsIG1vZHVsZS5jLCBzZXhwLmM6CisJVXNlZCBnY3J5X2Vyciogd3JhcHBlcnMgZm9yIGxpYmdwZy1lcnJvciBzeW1ib2xzLgorCisyMDAzLTA3LTEyICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogZ2xvYmFsLmM6IExpa2V3aXNlLgorCisJKiBnY3J5cHQuaDogTmV3IHR5cGU6IGdjcnlfZXJyb3JfdCwgZ2NyeV9lcnJfY29kZV90IGFuZAorCWdjcnlfZXJyX3NvdXJjZV90LgorCShnY3J5X2Vycl9tYWtlLCBnY3J5X2Vycm9yLCBnY3J5X2Vycl9jb2RlLCBnY3J5X2Vycl9zb3VyY2UpOiBOZXcKKwlmdW5jdGlvbnMuCisKKwkqIGdsb2JhbC5jIChnY3J5X3N0cmVycm9yKTogTmV3IGZ1bmN0aW9uLgorCShnY3J5X3N0cnNvdXJjZSk6IE5ldyBmdW5jdGlvbi4KKworCSogZ2NyeXB0Lmg6IE5ldyBzeW1ib2w6IEdDUllfQ0lQSEVSX1RXT0ZJU0gxMjguCisKKzIwMDMtMDctMDkgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBnY3J5cHQuaCAoZW51bSBnY3J5X21kX2ZsYWdzKTogUmVtb3ZlZCwgdXNlZCBkZWZpbmUgaW5zdGVhZCwKKwlzaW5jZSB0aGF0IGlzIG1vcmUgY29tbW9uIHRoYW4gYW4gZW51bWVyYXRpb24gbGlzdCB3aGVuIGl0IGNvbWVzCisJdG8gZmxhZ3MgdGhhdCBjYW4gYmUgYml0d2lzZSBPUmVkLgorCQorMjAwMy0wNy0wOCAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGdsb2JhbC5jOiBVc2UgbmV3IHR5cGVzIGZvciBoYW5kbGVycy4KKworCSogZ2NyeXB0Lmg6IERlY2xhcmU6IGdjcnlfYWNfZGF0YV9jb3B5LgorCisyMDAzLTA3LTA3ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogc2V4cC5jIChnY3J5X3NleHBfYnVpbGRfYXJyYXkpOiBVc2UgZHVtbXkgYXJndW1lbnQgcG9pbnRlci4KKwlUaGFua3MgdG8gU2ltb24gSm9zZWZzc29uIDxqYXNAZXh0dW5kZS5jb20+LgorCisJKiBnY3J5cHQuaDogRGVjbGFyZTogZ2NyeV9jaXBoZXJfbGlzdCwgZ2NyeV9wa19saXN0LCBnY3J5X21kX2xpc3QuCisJCisyMDAzLTA3LTA1ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogZ2NyeXB0Lmg6IERlY2xhcmU6IGdjcnlfY2lwaGVyX3JlZ2lzdGVyLCBnY3J5X2NpcGhlcl91bnJlZ2lzdGVyLAorCWdjcnlfbWRfcmVnaXN0ZXIsIGdjcnlfbWRfdW5yZWdpc3RlciwgZ2NyeV9wa19yZWdpc3RlciwKKwlnY3J5X3BrX3VucmVnaXN0ZXIuCisJKGdjcnlfY2lwaGVyX3NwZWMpOiBSZW1vdmVkIG1lbWJlcjogYWxnb3JpdGhtLgorCShnY3J5X3BrX3NwZWMpOiBMaWtld2lzZS4KKwkoZ2NyeV9tZF9zcGVjKTogTGlrZXdpc2UuCisJQWRqdXN0ZWQgZGVjbGFyYXRpb25zOiBnY3J5X2NpcGhlcl9yZWdpc3RlciwgZ2NyeV9wa19yZWdpc3RlciwKKwlnY3J5X21kX3JlZ2lzdGVyLgorCisJKiBtb2R1bGUuYzogUmVwbGFjZWQgYWxsIG9jY3VyZW5jZXMgb2YgYGlkJyB3aXRoIGBtb2RfaWQnLCBzaW5jZQorCWBpZCcgaXMgYSBrZXl3b3JkIGluIG9iai1jLgorCisJKiBnY3J5cHQuaCAoZ2NyeV9jaXBoZXJfc3BlYyk6IFJlbmFtZWQgbWVtYmVyIGBpZCcgdG8gYGFsZ29yaXRobScuCisJKGdjcnlfcGtfc3BlYyk6IExpa2V3aXNlLgorCShnY3J5X21kX3NwZWMpOiBMaWtld2lzZS4KKworCSogY2lwaGVyLmg6IFJlbW92ZWQgdHlwZXM6IGdjcnlfcHVia2V5X2dlbmVyYXRlX3QsCisJZ2NyeV9wdWJrZXlfY2hlY2tfc2VjcmV0X2tleV90LCBnY3J5X3B1YmtleV9lbmNyeXB0X3QsCisJZ2NyeV9wdWJrZXlfZGVjcnlwdF90LCBnY3J5X3B1YmtleV9zaWduX3QsIGdjcnlfcHVia2V5X3ZlcmlmeV90LAorCWdjcnlfcHVia2V5X2dldF9uYml0c190LCBnY3J5X3BrX3NwZWNfdCwgZ2NyeV9kaWdlc3RfaW5pdF90LAorCWdjcnlfZGlnZXN0X3dyaXRlX3QsIGdjcnlfZGlnZXN0X2ZpbmFsX3QsIGdjcnlfZGlnZXN0X3JlYWRfdCwKKwlnY3J5X2RpZ2VzdF9zcGVjX3QsIGdjcnlfY2lwaGVyX3NldGtleV90LCBnY3J5X2NpcGhlcl9lbmNyeXB0X3QsCisJZ2NyeV9jaXBoZXJfZGVjcnlwdF90LCBnY3J5X2NpcGhlcl9zdGVuY3J5cHRfdCwKKwlnY3J5X2NpcGhlcl9zdGRlY3J5cHRfdCwgZ2NyeV9jaXBoZXJfc3BlY190LgorCisJKiBnY3J5cHQuaDogTmV3IHR5cGVzOiBnY3J5X3BrX2dlbmVyYXRlX3QsCisJZ2NyeV9wa19jaGVja19zZWNyZXRfa2V5X3QsIGdjcnlfcGtfZW5jcnlwdF90LCBnY3J5X3BrX2RlY3J5cHRfdCwKKwlnY3J5X3BrX3NpZ25fdCwgZ2NyeV9wa192ZXJpZnlfdCwgZ2NyeV9wa19nZXRfbmJpdHNfdCwKKwlnY3J5X3BrX3NwZWNfdCwgZ2NyeV9tZF9pbml0X3QsIGdjcnlfbWRfd3JpdGVfdCwgZ2NyeV9tZF9maW5hbF90LAorCWdjcnlfbWRfcmVhZF90LCBnY3J5X21kX3NwZWNfdCwgZ2NyeV9jaXBoZXJfc2V0a2V5X3QsCisJZ2NyeV9jaXBoZXJfZW5jcnlwdF90LCBnY3J5X2NpcGhlcl9kZWNyeXB0X3QsCisJZ2NyeV9jaXBoZXJfc3RlbmNyeXB0X3QsIGdjcnlfY2lwaGVyX3N0ZGVjcnlwdF90LAorCWdjcnlfY2lwaGVyX3NwZWNfdCwgZ2NyeV9tb2R1bGVfdC4KKworMjAwMy0wNy0wNCAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIG1vZHVsZS5jIChfZ2NyeV9tb2R1bGVfbGlzdCk6IE5ldyBmdW5jdGlvbi4KKworMjAwMy0wNy0wMiAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIG1vZHVsZS5jIChfZ2NyeV9tb2R1bGVfbG9va3VwKTogRml4ZWQgdHlwby4KKworCSogZ2NyeXB0Lmg6IEFkZGVkIGFsbCBkZWZpbml0aW9ucyBhbmQgZGVjbGFyYXRpb25zIG5lY2Vzc2FyeSBmb3IKKwl0aGUgbmV3IGFjIGludGVyZmFjZS4KKworMjAwMy0wNi0zMCAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGcxMGxpYi5oOiBBZGRlZCBkZWNsYXJhdGlvbnM6IF9nY3J5X3BrX21vZHVsZV9sb29rdXAsCisJX2djcnlfcGtfbW9kdWxlX3JlbGVhc2UuCisKKzIwMDMtMDYtMTggIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBiZW5jaG1hcmsuYyAoY2lwaGVyX2JlbmNoKTogQWRqdXN0ZWQgZm9yIG5ldyBBUEkgb2YgZ2V0X2Jsa2xlbgorCWFuZCBnZXRfa2V5bGVuLgorCisJKiBnY3J5cHQuaCAoZ2NyeV9jaXBoZXJfZ2V0X2FsZ29fYmxrbGVuKQorCShnY3J5X2NpcGhlcl9nZXRfYWxnb19rZXlsZW4pOiBSZXBsYWNlZCBtYWNybyBieSBmdW5jaW9uLgorCisyMDAzLTA2LTE4ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogY2lwaGVyLmg6IFJlbmFtZWQgdHlwZXMgR2NyeURpZ2VzdFNwZWMsIEdjcnlDaXBoZXJTcGVjIGFuZAorCUdjcnlQdWJrZXlTcGVjIGludG86IGdjcnlfZGlnZXN0X3NwZWNfdCwgZ2NyeV9jaXBoZXJfc3BlY190IGFuZAorCWdjcnlfcHVia2V5X3NwZWNfdC4KKwkoZ2NyeV9wdWJrZXlfc3BlYyk6IERlZmluZWQgbWVtYmVyIGBpZCcgYXMgdW5zaWduZWQuCisJKGdjcnlfZGlnZXN0X3NwZWMpOiBMaWtld2lzZS4KKwkoZ2NyeV9jaXBoZXJfc3BlYyk6IExpa2V3aXNlLgorCisJKiBtb2R1bGUuYyAoX2djcnlfbW9kdWxlX2lkX25ldyk6IE5ldyBmdW5jdGlvbi4KKwkoX2djcnlfbW9kdWxlX2FkZCk6IEdlbmVyYXRlIGEgbmV3IElEIHZpYSBfZ2NyeV9tb2R1bGVfaWRfbmV3IGluCisJY2FzZSBgaWQnIGlzIHplcm8uCisKKwkqIGcxMGxpYi5oLCBtb2R1bGUuYzogUmVwbGFjZSBvbGQgdHlwZSBHY3J5TW9kdWxlIHdpdGggbmV3ZXIgb25lOgorCWdjcnlfbW9kdWxlX3QuCisKKwkqIG1vZHVsZS5jIChfZ2NyeV9tb2R1bGVfYWRkKTogQWRkZWQgYXJndW1lbnQgYGlkJywgdXNlIGl0LgorCisJKiBnMTBsaWIuaDogQWRkZWQgZGVjbGFyYXRpb246IF9nY3J5X21vZHVsZV9sb29rdXBfaWQuCisJKF9nY3J5X21vZHVsZV9hZGQpOiBBZGRlZCBhcmd1bWVudCBgaWQnLgorCisJKiBtb2R1bGUuYyAoX2djcnlfbW9kdWxlX2xvb2t1cF9pZCk6IE5ldyBmdW5jdGlvbi4KKworCSogZzEwbGliLmggKHN0cnVjdCBnY3J5X21vZHVsZSk6IE5ldyBtZW1iZXI6IGlkLgorCisJKiBnY3J5cHQuaDogTmV3IHR5cGU6IGdjcnlfaGFuZGxlcl9wcm9ncmVzc190LAorCWdjcnlfaGFuZGxlcl9hbGxvY190LCBnY3J5X2hhYW5kbGVyX3NlY3VyZV9jaGVja190LAorCWdjcnlfaGFuZGxlcl9yZWFsbG9jX3QsIGdjcnlfaGFuZGxlcl9mcmVlX3QsCisJZ2NyeV9oYW5kbGVyX25vX21lbV90LCBnY3J5X2hhbmRsZXJfZXJyb3JfdCwgZ2NyeV9oYW5kbGVyX2xvZ190LgorCVVzZSBuZXcgdHlwZXMuCisKKwkqIGNpcGhlci5oOiBJbmNsdWRlIDxnY3J5cHQuaD4uCisJTmV3IHR5cGVzOiBnY3J5X3BrX2dlbmVyYXRlX3QsIGdjcnlfcGtfY2hlY2tfc2VjcmV0X2tleV90LAorCWdjcnlfcGtfZW5jcnlwdF90LCBnY3J5X3BrX2RlY3J5cHRfdCwgZ2NyeV9wa19zaWduX3QsCisJZ2NyeV9wa192ZXJpZnlfdCwgZ2NyeV9wa19nZXRfbmJpdHNfdCwgZ2NyeV9tZF9pbml0X3QsCisJZ2NyeV9tZF93cml0ZV90LCBnY3J5X21kX2ZpbmFsX3QsIGdjcnlfbWRfcmVhZF90LAorCWdjcnlfY2lwaGVyX3NldGtleV90LCBnY3J5X2NpcGhlcl9lbmNyeXB0X3QsCisJZ2NyeV9jaXBoZXJfZGVjcnlwdF90LCBnY3J5X2NpcGhlcl9zdGVuY3J5cHRfdCwKKwlnY3J5X2NpcGhlcl9zdGRlY3J5cHRfdC4KKwlVc2UgbmV3IHR5cGVzLgorCisyMDAzLTA2LTE3ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKEFNX0NGTEFHUyk6IEFkZGVkOiBAR1BHX0VSUk9SX0NGTEFHU0AuCisKKzIwMDMtMDYtMTYgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBnMTBsaWIuaDogUmVwbGFjZSBsYXN0IG9jY3VyZW5jZXMgb2Ygb2xkIHR5cGUgbmFtZXMgd2l0aCBuZXdlcgorCW5hbWVzIChpLmUuIHJlcGxhY2UgTVBJIHdpdGggZ2NyeV9tcGlfdCkuCisJKiBtcGkuaDogTGlrZXdpc2UuCisJKiBzZXhwLmM6IExpa2V3aXNlLgorCisyMDAzLTA2LTE1ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogdGVzdGFwaS5jICh0ZXN0X2dlbmtleSk6IFVzZSBncGdfc3RyZXJyb3IgaW5zdGVhZCBvZgorCWdjcnlfc3RyZXJyb3IuCisKKwkqIGdsb2JhbC5jIChnY3J5X2NvbnRyb2wpOiBGaXhlZCB0eXBvLgorCisJKiBtaXNjLmMgKF9nY3J5X2ZhdGFsX2Vycm9yKTogVXNlIGdwZ19zdHJlcnJvciBpbnN0ZWFkIG9mCisJZ2NyeV9zdHJlcnJvci4KKworCSogdHlwZXMuaCAoU1RSTElTVCk6IFJlbW92ZWQgdHlwZSBzaW5jZSBpdCBpcyBub3QgdXNlZC4KKworMjAwMy0wNi0xMSAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGdsb2JhbC5jIChnbG9iYWxfaW5pdCk6IENhbGw6IF9nY3J5X2NpcGhlcl9pbml0LCBfZ2NyeV9tZF9pbml0LAorCV9nY3J5X3BrX2luaXQuCisKKwkqIGcxMGxpYi5oOiBEZWNsYXJlOiBfZ2NyeV9jaXBoZXJfaW5pdCwgX2djcnlfbWRfaW5pdCwKKwlfZ2NyeV9wa19pbml0LgorCQorCSogZ2xvYmFsLmMgKGdjcnlfc3RyZXJyb3IpOiBSZW1vdmUgY29tcGF0aWJpbGl0eSBjb2RlLgorCisJKiBNYWtlZmlsZS5hbTogUmVtb3ZlIHN1cHBvcnQgbGliZ3BnLWVycm9yIHNwZWNpYWwgaGFuZGxpbmcuCisJKEFNX0NQUEZMQUdTKTogQWRkIEBHUEdfRVJST1JfQ0ZMQUdTQAorCisJKiBnY3J5cHQuaDogTGlrZXdpc2UuCisKKzIwMDMtMDYtMTMgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBnY3J5cHQuaCAoZ2NyeV9tZF9nZXRfYWxnbyk6IFJldmVydGVkIHRvIG9sZCBBUEkuICBUaGlzIGlzIGEKKwljb252ZW5pZW5jZSBmdW5jdGlvbiBhbnl3YXkgYW5kIGVycm9yIGNoZWNraW5nIGlzIG5vdCBhcHByb3JpYXRlLgorCShnY3J5X21kX2lzX2VuYWJsZWQpOiBOZXcuCisJKGdjcnlfbWRfaXNfc2VjdXJlKTogUmVwbGFjZWQgbWFjcm8gYnkgZnVuY3Rpb24gYW5kIHJldmVydGVkIHRvIG9sZAorCUFQSS4KKworMjAwMy0wNi0xMSAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIGdjcnlwdC5oIChHQ1JZRVJSKTogRGVmaW5lIF9HQ1JZX0VSUl9TT1VSQ0VfREVGQVVMVCBpbnN0ZWFkIG9mCisJR1BHX0VSUl9TT1VSQ0VfREVGQVVMVCwgc28gdGhhdCBsaWJncGctZXJyb3Igc3RpbGwgd29ya3MgZGVzcGl0ZQorCXRoZSB1c2Ugb2YgdGhlIG9sZCBnY3J5cHQgZXJyb3IgY29kZXMuCisJKGdjcnlfbWRfY29weSk6IFN3YXBwZWQgYXJndW1lbnRzLgorCQorMjAwMy0wNi0wOSAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIE1ha2VmaWxlLmFtOiBTdXBwb3J0IGZvciBsaWJncGctZXJyb3IuCisKKzIwMDMtMDYtMDggIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBzZXhwLmMgKGdjcnlfc2V4cF9jcmVhdGUpOiBFeHBlY3Qgc2FuZSBlcnJvciB2YWx1ZXMgZnJvbQorCWdjcnlfc2V4cF9jYW5vbl9sZW4gaW5zdGVhZCBvZiB0aGUgYGhpc3RvcmljYWwnIHZhbHVlcy4KKworMjAwMy0wNi0wNyAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGF0aC5jLCBhdGguYywgYXRoLXB0aC5jLCBhdGgtcHRocmVhZC5jLCBiZW5jaG1hcmsuYywgY2lwaGVyLmgsCisJZzEwbGliLmgsIGdjcnlwdC5oLCBnbG9iYWwuYywgbWlzYy5jLCBtaXNzaW5nLXN0cmluZy5jLCBtb2R1bGUuYywKKwltcGkuaCwgc2VjbWVtLmMsIHNlY21lbS5oLCBzZXhwLmMsIHN0ZG1lbS5jLCBzdGRtZW0uaCwgdGVzdGFwaS5jLAorCXR5cGVzLmg6IEVkaXRlZCBhbGwgcHJlcHJvY2Vzc29yIGluc3RydWN0aW9ucyB0byByZW1vdmUgd2hpdGVzcGFjZQorCWJlZm9yZSB0aGUgJyMnLiAgVGhpcyBpcyBub3QgcmVxdWlyZWQgYnkgQzg5LCBidXQgdGhlcmUgYXJlIHNvbWUKKwljb21waWxlcnMgb3V0IHRoZXJlIHRoYXQgZG9uJ3QgbGlrZSBpdC4gIFJlcGxhY2VkIGFueSBvY2N1cmVuY2Ugb2YKKwl0aGUgbm93IGRlcHJlY2F0ZWQgdHlwZSBuYW1lcyB3aXRoIHRoZSBuZXcgb25lcy4KKwkKKwkqIGdjcnlwdC5oOiBSZS1vcmdhbml6ZWQgY2hlY2tpbmcgZm9yIGdjYyBmZWF0dXJlczsgTmV3IG1hY3JvOgorCV9HQ1JZX0dDQ19BVFRSX0RFUFJFQ0FURUQuCisJSW5jbHVkZSBjb3B5IG9mIGxpYmdwZy1lcnJvcidzIGdwZy1lcnJvci5oIGluIG9yZGVyIHRvIG1ha2UgaXQKKwllYXN5IHRvIGJ1aWxkIGxpYmdjcnlwdCB3aXRob3V0IG5lZWRpbmcgbGliZ3BnLWVycm9yLmguCisKKwkoR0NSWV9NUEksIEdjcnlNUEksIEdDUllfU0VYUCwgR2NyeVNleHAsIEdDUllfQ0lQSEVSX0hELAorCUdjcnlDaXBoZXJIZCwgR0NSWV9NRF9IRCwgR2NyeU1ESGQpOiBEZWNsYXJlZCBkZXByZWNhdGVkLgorCShnY3J5X21waV90LCBnY3J5X3NleHBfdCwgZ2NyeV9jaXBoZXJfaGRfdCwgZ2NyeV9tZF9oZF90KTogTmV3CisJdHlwZXMuCisKKzIwMDMtMDYtMDQgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBzZXhwLmMgKHNleHBfc3NjYW4pOiBOZXcgYXJndW1lbnQ6IGFyZ19saXN0LCBhZGp1c3RlZCBhbGwKKwljYWxsZXJzLgorCShBUkdfTkVYVCk6IE5ldyBtYWNyby4KKwkoc2V4cF9zc2Nhbik6IFVzZSBBUkdfTkVYVCBmb3IgcmVjZWl2aW5nIGZvcm1hdCBzdHJpbmcgYXJndW1lbnRzLgorCShnY3J5X3NleHBfYnVpbGRfYXJyYXkpOiBOZXcgZnVuY3Rpb24uCisKKzIwMDMtMDYtMDIgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBnY3J5cHQuaDogQWRkZWQgc29tZSBjb21tZW50cyBkZXNjcmliaW5nIHRoZSBnY3J5X3NleHBfKgorCWZ1bmN0aW9ucy4KKwlJbmNsdWRlIDxncGctZXJyb3IuaD4gaW5zdGVhZCBvZiA8Z3BnL2Vycm9yLmg+LgorCisyMDAzLTA2LTAxICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogc2V4cC5jIChPTERQQVJTRUNPREUpOiBSZW1vdmVkIG1hY3JvLi4uCisJKGdjcnlfc2V4cF9jYW5vbl9sZW4pOiAuLi4gYW5kIGRvIG5vdCB1c2UgaXQuCisKKwkqIGdjcnlwdC5oIChnY3J5X2Vycm5vKTogUmVtb3ZlZCBkZWNsYXJhdGlvbi4KKworCSogZzEwbGliLmggKHN0cmluZ190b19wdWJrZXlfYWxnbywgcHVia2V5X2FsZ29fdG9fc3RyaW5nLAorCXB1YmtleV9uYml0cyk6IFJlbW92ZWQgZGVjbGFyYXRpb25zIGZvciBub24tZXhpc3RpbmcgZnVuY3Rpb25zLgorCisyMDAzLTA1LTMxICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogY2lwaGVyLmggKGlzX1JTQSwgaXNfRUxHQU1BTCk6IFJlbW92ZWQgbWFjcm9zLgorCisJKiBnMTBsaWIuaCAoc2V0X2xhc3RlcnIpOiBSZW1vdmVkIG1hY3JvLgorCShfZ2NyeV9zZXRfbGFzdGVycik6IFJlbW92ZWQgZGVjbGFyYXRpb24uCisKKwkqIGdjcnlwdC5oOiBDaGFuZ2VkIGRlY2xhcmF0aW9ucyBmb3I6IGdjcnlfcGtfYWxnb19pbmZvLAorCWdjcnlfbWRfb3BlbiwgZ2NyeV9tZF9jb3B5LCBnY3J5X21kX2FsZ29faW5mbywgZ2NyeV9tZF9pbmZvLAorCWdjcnlfbWRfZ2V0X2FsZ28sIGdjcnlfcmFuZG9tX2FkZF9ieXRlcy4KKwkKKwkoZ2NyeV9tZF9pc19zZWN1cmUpOiBBZGp1c3QgbWFjcm8gZm9yIG5ldyBBUEkuCisKKzIwMDMtMDUtMjkgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBnY3J5cHQuaDogQ2hhbmdlZCBkZWNsYXJhdGlvbnMgZm9yOiBnY3J5X2NpcGhlcl9vcGVuLAorCWdjcnlfY2lwaGVyX2luZm8sIGdjcnlfY2lwaGVyX2FsZ29faW5mby4KKwkoZ2NyeV9jaXBoZXJfZ2V0X2FsZ29fa2V5bGVuKTogQWRqdXN0ZXIgZm9yIG5ldworCWdjcnlfY2lwaGVyX2FsZ29faW5mbyBpbnRlcmZhY2UuCisJKGdjcnlfY2lwaGVyX2dldF9hbGdvX2Jsa2xlbik6IExpa2V3aXNlLgorCisJKiBnbG9iYWwuYyAoZ2NyeV9lcnJubyk6IFJlbW92ZWQgZnVuY3Rpb24uCisJKGdjcnlfc3RyZXJyb3IpOiBEbyBub3QgdXNlIGdjcnlfZXJybm8uCisJKF9nY3J5X3NldF9sYXN0ZXJyKTogUmVtb3ZlZCBmdW5jdGlvbi4KKwkobGFzdF9lYyk6IFJlbW92ZWQgdmFyaWFibGUuCisKKzIwMDMtMDUtMjcgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBnY3J5cHQuaCAoZW51bSBnY3J5X2NpcGhlcl9hbGdvcyk6IE1ha2UgU2VycGVudCBJRHMgZG8gbm90CisJY29uZmxpY3Qgd2l0aCBPcGVuUEdQLiAgUmVwb3J0ZWQgYnkgVGltbyBTY2h1bHouCisKKwkqIGdsb2JhbC5jIChnY3J5X2NvbnRyb2wpOiBGaXhlZCBuYW1lIG9mIGVudW0gbGlzdC4KKworMjAwMy0wNS0yNSAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGNpcGhlci5oIChnY3J5X2NpcGhlcl9zcGVjKTogQWRqdXN0IHJldHVybiB0eXBlIG9mIGBzZXRrZXknIGZvcgorCWxpYmdwZy1lcnJvci4KKwkoZ2NyeV9wdWJrZXlfc3BlYyk6IEFkanVzdCByZXR1cm4gdHlwZSBvZiBgZ2VuZXJhdGUnLAorCWBjaGVja19zZWNyZXRfa2V5JywgYGVuY3J5cHQnLCBgZGVjcnlwdCcsIGBzaWduJyBhbmQgYHZlcmlmeScgZm9yCisJbGliZ3BnLWVycm9yLgorCisJKiBzZXhwLmMgKGdjcnlfc2V4cF9jYW5vbl9sZW4pOiBBZGp1c3RlZCBmb3IgbGliZ3BnLWVycm9yLgorCShnY3J5X3NleHBfY3JlYXRlKTogTGlrZXdpc2UuCisJKGdjcnlfc2V4cF9uZXcpOiBMaWtld2lzZS4KKwkoc2V4cF9zc2Nhbik6IExpa2V3aXNlLgorCShnY3J5X3NleHBfYnVpbGQpOiBMaWtld2lzZS4KKwkoZ2NyeV9zZXhwX3NzY2FuKTogTGlrZXdpc2UuCisKKwkqIG1vZHVsZS5jIChfZ2NyeV9tb2R1bGVfYWRkKTogTGlrZXdpc2UuCisKKwkqIGdsb2JhbC5jIChsYXN0X2VjKTogQ2hhbmdlIHR5cGUgdG8gZ3BnX2Vycm9yX3QuCisJKGdjcnlfY29udHJvbCk6IEFkanVzdCBmb3IgbGliZ3BnLWVycm9yLgorCShnY3J5X2Vycm5vKTogTGlrZXdpc2UuCisJKGdjcnlfc3RyZXJyb3IpOiBMaWtld2lzZS4KKwkoX2djcnlfc2V0X2xhc3RlcnIpOiBMaWtld2lzZS4KKwkoZ2NyeV94bWFsbG9jKTogTGlrZXdpc2UuCisJKGdjcnlfeHJlYWxsb2MpOiBMaWtld2lzZS4KKworMjAwMy0wNS0yMiAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIHR5cGVzLmg6IE1lcmdlZCBjb2RlIGZyb20gR251UEcgcmVnYXJkaW5nIFU2NF9DLgorCisJKiBtaXNzaW5nLXN0cmluZy5jIChzdHJzZXApOiBSZW1vdmVkIGZ1bmN0aW9uLgorCisJKiBnMTBsaWIuaDogUmVtb3ZlZCBkZWNsYXJhdGlvbnM6IHN0cnNlcCwgc3RybHdyLgorCisJKiBzZWNtZW0uYyAoc2VjbWVtX2xvY2spOiBOZXcgdmFyaWFibGUuCisJKFNFQ01FTV9MT0NLLCBTRUNNRU1fVU5MT0NLKTogTmV3IG1hY3Jvcy4KKwkoX2djcnlfc2VjbWVtX3NldF9mbGFncyk6IFVzZSBTRUNNRU1fTE9DSyBhbmQgU0VDTUVNX1VOTE9DSy4KKwkoX2djcnlfc2VjbWVtX2dldF9mbGFncyk6IExpa2V3aXNlLgorCShfZ2NyeV9zZWNtZW1faW5pdCk6IExpa2V3aWUuCisJKF9nY3J5X3NlY21lbV9tYWxsb2MpOiBMaWtld2lzZS4KKwkoX2djcnlfc2VjbWVtX2ZyZWUpOiBMaWtld2lzZS4KKwkoX2djcnlfc2VjbWVtX21hbGxvYyk6IFJlbmFtZWQgdG8gLi4uCisJKF9nY3J5X3NlY21lbV9tYWxsb2NfaW50ZXJuYWwpOiAuLi4gdGhpcy4KKwkoX2djcnlfc2VjbWVtX21hbGxvYyk6IE5ldyBmdW5jdGlvbiwgdXNlIFNFQ01FTV9MT0NLLAorCVNFQ01FTV9VTkxPQ0ssIGNhbGwgX2djcnlfc2VjbWVtX21hbGxvY19pbnRlcm5hbC4KKwkoX2djcnlfc2VjbWVtX2ZyZWUpOiBSZW5hbWVkIHRvIC4uLgorCShfZ2NyeV9zZWNtZW1fZnJlZV9pbnRlcm5hbCk6IC4uLiB0aGlzLgorCShfZ2NyeV9zZWNtZW1fZnJlZSk6IE5ldyBmdW5jdGlvbiwgdXNlIFNFQ01FTV9MT0NLLCBTRUNNRU1fVU5MT0NLLAorCWNhbGwgX2djcnlfc2VjbWVtX2ZyZWVfaW50ZXJuYWwuCisJKF9nY3J5X3NlY21lbV9yZWFsbG9jKTogVXNlIFNFQ01FTV9MT0NLLCBTRUNNRU1fVU5MT0NLLCBjYWxsCisJX2djcnlfc2VjbWVtX21hbGxvY19pbnRlcm5hbCBhbmQgX2djcnlfc2VjbWVtX2ZyZWVfaW50ZXJuYWwuCisJKF9nY3J5X3ByaXZhdGVfaXNfc2VjdXJlKTogVXNlIFNFQ01FTV9MT0NLLCBTRUNNRU1fVU5MT0NLLgorCShfZ2NyeV9zZWNtZW1fZHVtcF9zdGF0cyk6IExpa2V3aXNlLgorCShfZ2NyeV9zZWNtZW1fbWFsbG9jX2ludGVybmFsKTogUmVtb3ZlZCB1bnVzZWQgdmFyaWFibGU6CisJY29tcHJlc3NlZC4KKwlJbmNsdWRlICJhdGguaCIuCisKKzIwMDMtMDUtMjEgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBnY3J5cHQuaCAoR0NSWV9DSVBIRVJfU0VSUEVOVDEyOCwgR0NSWV9DSVBIRVJfU0VSUEVOVDE5MiwKKwlHQ1JZX0NJUEhFUl9TRVJQRU5UMjU2KTogTmV3IHN5bWJvbHMuCisKKzIwMDMtMDUtMTkgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBnY3J5cHQuaDogUmV2ZXJzZWQgY2hhbmdlcyBmcm9tIDIwMDMtMDMtMDMgc2luY2UgdGhleSB3b3VsZCBoYXZlCisJYmVlbiBhbiB1bm5lY2Vzc2FyeSBBQkkgYnJlYWsuCisKKzIwMDMtMDUtMTMgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBzZWNtZW0uYyAoc3RhdHNfdXBkYXRlKTogTmV3IGZ1bmN0aW9uLgorCShCTE9DS19IRUFEX1NJWkUpOiBOZXcgc3ltYm9sLgorCShNQl9GTEFHX0FDVElWRSk6IE5ldyBzeW1ib2wuCisJKEFERFJfVE9fQkxPQ0ssIEJMT0NLX1ZBTElEKTogTmV3IG1hY3Jvcy4KKwkobWJfZ2V0X25leHQpOiBOZXcgZnVuY3Rpb24uCisJKG1iX2dldF9wcmV2KTogTmV3IGZ1bmN0aW9uLgorCShtYl9tZXJnZSk6IE5ldyBmdW5jdGlvbi4KKwkobWJfZ2V0X25ldyk6IE5ldyBmdW5jdGlvbi4KKwkodW51c2VkX2Jsb2Nrcyk6IFJlbW92ZWQgdmFyaWFibGUuCisJKGluaXRfcG9vbCk6IEluaXRpYWxpemUgbmV3IG1lbW9yeSBwb29sLgorCShfZ2NyeV9zZWNtZW1fbWFsbG9jKTogVXNlIG5ldyBoZWFwIG1hbmFnZW1lbnQgY29kZS4KKwkoX2djcnlfc2VjbWVtX2ZyZWUpOiBMaWtld2lzZS4KKwkoX2djcnlfc2VjbWVtX3JlYWxsb2MpOiBMaWtld2lzZS4KKwlSZW5hbWVkIHR5cGUgTUVNQkxPQ0sgdG8gbWVtYmxvY2tfdC4KKworMjAwMy0wNC0yNyAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGNpcGhlci5oIChnY3J5X3B1YmtleV9zcGVjKTogTmV3IG1lbWJlcjogc2V4cF9uYW1lcy4KKworMjAwMy0wNC0yMyAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGNpcGhlci5oIChnY3J5X3B1YmtleV9zcGVjKTogUmVtb3ZlZCBtZW1iZXJzOiBucGtleSwgbnNrZXksCisJbmVuYywgbnNpZy4KKwkoZ2NyeV9wdWJrZXlfc3BlYyk6IEFkZGVkIG1lbWJlcnM6IGVsZW1lbnRzX3BrZXksIGVsZW1lbnRzX3NrZXksCisJZWxlbWVudHNfZW5jLCBlbGVtZW50c19zaWcsIGVsZW1lbnRzX2dyaXAuCisKKzIwMDMtMDQtMTcgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBnMTBsaWIuaCAoR2NyeU1vZHVsZSk6IE5ldyB0eXBlZGVmLgorCisJKiBnY3J5cHQuaCAoZ2NyeV9jaXBoZXJfcmVnaXN0ZXIsIGdjcnlfY2lwaGVyX3VucmVnaXN0ZXIsCisJZ2NyeV9kaWdlc3RfcmVnaXN0ZXIsIGdjcnlfZGlnZXN0X3VucmVnaXN0ZXIsCisJZ2NyeV9wdWJrZXlfcmVnaXN0ZXIsIGdjcnlfcHVia2V5X3VucmVnaXN0ZXIpOiBGdW5jdGlvbgorCWRlY2xhcmF0aW9ucyByZW1vdmVkIC0gZm9yIG5vdy4KKwkKKwkqIGdjcnlwdC5oIChHY3J5TW9kdWxlKTogRGVjbGFyYXRpb24gcmVtb3ZlZC4KKwkqIGdjcnlwdC5oIChHY3J5UHVia2V5U3BlYywgR2NyeURpZ2VzdFNwZWMsIEdjcnlDaXBoZXJTcGVjKToKKwlUeXBlcyBNb3ZlZC4uLiAKKwkqIGNpcGhlci5oOiAuLi4gaGVyZS4KKworMjAwMy0wNC0xNyAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGNpcGhlci5oOiBEZWNsYXJlIGRpZ2VzdF9zcGVjX3NoYTUxMiBhbmQgZGlnZXN0X3NwZWNfMzg0LgorCisyMDAzLTA0LTE2ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogbW9kdWxlLmMgKF9nY3J5X21vZHVsZV91c2UpOiBOZXcgZnVuY3Rpb24uCisJKiBnMTBsaWIuaCAoX2djcnlfbW9kdWxlX3VzZSk6IERlY2xhcmUgZnVuY3Rpb24uCisKKwkqIGxpYmdjcnlwdC1jb25maWcuaW46IFN1cHBvcnQgZm9yIC0tYWxnb3JpdGhtcyBzd2l0Y2gsIHdoaWNoCisJcHJpbnRzIHRoZSBhbGdvcml0aG1zIGluY2x1ZGVkIGluIHRoZSBidWlsdCBsaWJnY3J5cHQuCisKKwkqIGdsb2JhbC5jIChnY3J5X3NldF9wcm9ncmVzc19oYW5kbGVyKTogUmVnaXN0ZXIgcHJvZ3Jlc3MKKwlmdW5jdGlvbnMgZGVwZW5kaW5nIG9uIHRoZSBlbmFibGVkIGFsZ29yaXRobXMuCisKKzIwMDMtMDQtMDcgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBNYWtlZmlsZS5hbSAobGliZ2NyeXB0X2xhX1NPVVJDRVMpOiBBZGRlZCBtb2R1bGUuYworCisJKiBtb2R1bGUuYzogTmV3IGZpbGUuCisJKF9nY3J5X21vZHVsZV9hZGQpOiBOZXcgZnVuY3Rpb24uCisJKF9nY3J5X21vZHVsZV9kcm9wKTogTmV3IGZ1bmN0aW9uLgorCShfZ2NyeV9tb2R1bGVfbG9va3VwKTogTmV3IGZ1bmN0aW9uLgorCShfZ2NyeV9tb2R1bGVfcmVsZWFzZSk6IE5ldyBmdW5jdGlvbi4KKworCSogZzEwbGliLmggKEdjcnlNb2R1bGUpOiBOZXcgdHlwZXMuCisJKEZMQUdfTU9EVUxFX0RJU0FCTEVEKTogTmV3IHN5bWJvbC4KKwlBZGRlZCBkZWNsYXJhdGlvbnMgZm9yIF9nY3J5X21vZHVsZV9hZGQsIF9nY3J5X21vZHVsZV9yZWxlYXNlIGFuZAorCV9nY3J5X21vZHVsZV9sb29rdXAuCisKKwkqIGdjcnlwdC5oOiBOZXcgdHlwZXM6IEdjcnlQdWJrZXlTcGVjLCBHY3J5RGlnZXN0U3BlYywKKwlHY3J5Q2lwaGVyU3BlYy4KKwlBZGRlZCBkZWNsYXJhdGlvbnMgZm9yOiBnY3J5X2NpcGhlcl9yZWdpc3RlciwKKwlnY3J5X2NpcGhlcl91bnJlZ2lzdGVyLCBnY3J5X2RpZ2VzdF9yZWdpc3RlciwKKwlnY3J5X2RpZ2VzdF91bnJlZ2lzdGVyLCBnY3J5X3B1YmtleV9yZWdpc3RlciBhbmQKKwlnY3J5X3B1YmtleV91bnJlZ2lzdGVyLgorCisJKiBjaXBoZXIuaDogUmVtb3ZlZCBzeW1ib2xzOiBDSVBIRVJfQUxHT19OT05FLCBDSVBIRVJfQUxHT19JREVBLAorCUNJUEhFUl9BTEdPXzNERVMsIENJUEhFUl9BTEdPX0NBU1Q1LCBDSVBIRVJfQUxHT19CTE9XRklTSCwKKwlDSVBIRVJfQUxHT19TQUZFUl9TSzEyOCwgQ0lQSEVSX0FMR09fREVTX1NLLCBDSVBIRVJfQUxHT19UV09GSVNILAorCUNJUEhFUl9BTEdPX1RXT0ZJU0hfT0xELCBDSVBIRVJfQUxHT19EVU1NWSwgUFVCS0VZX1VTQUdFX1NJRywKKwlQVUJLRVlfVVNBR0VfRU5DLCBESUdFU1RfQUxHT19NRDUsIERJR0VTVF9BTEdPX1NIQTEsCisJRElHRVNUX0FMR09fUk1EMTYwLCBESUdFU1RfQUxHT19USUdFUiwgUFVCS0VZX0FMR09fUlNBLAorCVBVQktFWV9BTEdPX1JTQV9FLCBQVUJLRVlfQUxHT19SU0FfUywgUFVCS0VZX0FMR09fRFNBLAorCVBVQktFWV9BTEdPX0VMR0FNQUwsIFBVQktFWV9BTEdPX0VMR0FNQUxfRS4KKworMjAwMy0wNC0wMiAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGJlbmNobWFyay5jIChtZF9iZW5jaCk6IEZpeCBlcnJvciBtZXNzYWdlLgorCisyMDAzLTAzLTMxICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogYmVuY2htYXJrLmMgKGNpcGhlcl9iZW5jaCk6IEFkZGVkIENUUiBtb2RlLgorCisyMDAzLTAzLTMwICBTaW1vbiBKb3NlZnNzb24gIDxqYXNAZXh0dW5kby5jb20+CisKKwkqIGdjcnlwdC5oIChlbnVtIGdjcnlfY29udHJvbF9jbWRzKTogQWRkIEdDUllfU0VUX0NUUi4KKwkoZW51bSBnY3J5X2NpcGhlcl9tb2Rlcyk6IEFkZCBHQ1JZX0NJUEhFUl9NT0RFX0NUUi4KKwkoZ2NyeV9jaXBoZXJfc2V0Y3RyKTogTmV3IG1hY3JvIHRvIHNldCBjb3VudGVyLgorCisyMDAzLTAzLTE5ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogY2lwaGVyLmggKFBVQktFWV9GTEFHX05PX0JMSU5ESU5HKTogTmV3IHN5bWJvbC4KKworMjAwMy0wMy0yMiAgU2ltb24gSm9zZWZzc29uICA8amFzQGV4dHVuZG8uY29tPgorCisJKiBnY3J5cHQuaDogQWRkIEdDUllDVExfU0VUX0NCQ19NQUMgYW5kIEdDUllfQ0lQSEVSX0NCQ19NQUMuCisKKzIwMDMtMDMtMTkgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBnMTBsaWIuaDogQWRqdXN0ZWQgcHJpbWVnZW4uYyBwcm90b3R5cGVzLgorCisyMDAzLTAzLTEyICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogc2V4cC5jIChzZXhwX3NzY2FuKTogSW5pdGlhbGl6ZSBOTS4gIFRoYW5rcyB0byBJYW4gUGV0ZXJzIGZvcgorCXZhbGdyaW5kaW5nIHRoaXMuCisKKzIwMDMtMDMtMDYgIE1vcml0eiBTY2h1bHRlICA8bW9AZzEwY29kZS5jb20+CisKKwkqIHNlY21lbS5oIChHQ1JZX1NFQ01FTV9GTEFHX05PX1dBUk5JTkcsCisJR0NSWV9TRUNNRU1fRkxBR19TVVNQRU5EX1dBUk5JTkcpOiBOZXcgc3ltYm9scy4KKworCSogZ2xvYmFsLmMgKGdjcnlfY29udHJvbCk6IFVzZQorCUdDUllfU0VDTUVNX0ZMQUdfe05PLFNVU1BFTkR9X1dBUk5JTkcsIGluc3RlYWQgb2YgaGFyZC1jb2RlZAorCXZhbHVlcy4KKwkqIHNlY21lbS5jIChfZ2NyeV9zZWNtZW1fc2V0X2ZsYWdzKTogTGlrZXdpc2UuCisJKiBzZWNtZW0uYyAoX2djcnlfc2VjbWVtX2dldF9mbGFncyk6IExpa2V3aXNlLgorCQorMjAwMy0wMy0wMyAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIG1pc2MuYzogUmVtb3ZlZCBvbGQgRklYTUUsIHNpbmNlIHRoZXJlIGlzIGFscmVhZHkgYSBmdW5jdGlvbiB0bworCXNldCB0aGUgdmFsdWUgb2YgYHZlcmJvc2l0eV9sZXZlbCcuCisKKwkqIGdjcnlwdC5oOiBSZW1vdmVkIGVudW1lcmF0aW9uIGxpc3Q6IGdjcnlfY3RsX2NtZHMuCisJTmV3IGVudW1lcmF0aW9uIGxpc3RzOiBnY3J5X2dsb2JhbF9jb250cm9sX2NtZHMsCisJZ2NyeV9jb250cm9sX2NtZHMsIGdjcnlfaW5mb19jbWRzLCBnY3J5X2FsZ29faW5mb19jbWRzLgorCisyMDAzLTAzLTAyICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogZ2NyeXB0LmggKGdjcnlfY2lwaGVyX3Jlc2V0KTogTmV3IG1hY3JvIGZvciByZXNldHRpbmcgYSBoYW5kbGUuCisKKzIwMDMtMDItMjggIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBzZWNtZW0uYyAoREVGQVVMVF9QQUdFU0laRSk6IE5ldyBzeW1ib2wuCisJKGluaXRfcG9vbCk6IFVzZSBERUZBVUxUX1BBR0VTSVpFLgorCisyMDAzLTAyLTIzICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogc2VjbWVtLmg6IEZpeCB0eXBvIGluIGRlY2xhcmF0aW9uIG9mIF9nY3J5X3NlY21lbV90ZXJtLgorCisJKiBzZXhwLmM6IE1vdmUgbWFjcm8gZGVmaW5pdGlvbnMgb2YgYGRpZ2l0cCcsIGBvY3RkaWdpdCcsIGBhbHBoYXAnCisJYW5kIGBoZXhkaWdpdCcgLi4uCisJKiBnMTBsaWIuaDogLi4uIGhlcmUuCisKKwkqIG1pc2MuYyAoX2djcnlfYnVybl9zdGFjayk6IE5ldyBmdW5jdGlvbiAoZm9ybWVyIG5hbWU6CisJYnVybl9zdGFjaykuCisKKwkqIGcxMGxpYi5oIChidXJuX3N0YWNrKTogRGVjbGFyZSBfZ2NyeV9idXJuX3N0YWNrKCkuCisKKzIwMDMtMDEtMjQgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBnbG9iYWwuYyAoZ2NyeV9zZXRfcHJvZ3Jlc3NfaGFuZGxlcik6IFJlZ2lzdGVyIGEgcmFuZG9tIHByb2dyZXNzCisJaGFuZGxlci4KKworMjAwMy0wMS0yMyAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIGdjcnlwdC5oIChHQ1JZX0VOQUJMRV9RVUlDS19SQU5ET00pOiBOZXcuIAorCSogZ2xvYmFsLmMgKGdjcnlfY29udHJvbCk6IE1ha2UgdXNlIG9mIGl0LgorCisyMDAzLTAxLTIxICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogZ2NyeXB0LmggKGdjcnlfcmFuZG9tX2FkZF9ieXRlcyk6IEFkZCBRVUFMSVRZIGFyZ3VtZW50LgorCisyMDAzLTAxLTIxICBUaW1vIFNjaHVseiAgPHR3b2FkYXlAZnJlYWttYWlsLmRlPgorCisJKiBnY3J5cHQuaCAoZ2NyeV9yYW5kb21fYWRkX2J5dGVzKTogTmV3LgorCQorMjAwMy0wMS0yMCAgU2ltb24gSm9zZWZzc29uICA8amFzQGV4dHVuZG8uY29tPgorCisJKiBnY3J5cHQuaCAoZ2NyeV9tZF9hbGdvcyk6IEFkZCBHQ1JZX01EX0NSQzMyLAorCUdDUllfTURfQ1JDMzJfUkZDMTUxMCwgR0NSWV9NRF9DUkMyNF9SRkMyNDQwLgorCisyMDAzLTAxLTE2ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogZ2NyeXB0LmggKGdjcnlfbWRfd3JpdGUpOiBDaGFuZ2VkIHR5cGUgb2YgMm5kIGFyZ3VtZW50IHRvIHZvaWQqLgorCShnY3J5X21kX2hhc2hfYnVmZmVyKTogQ2hhbmdlZCB0eXBlIG9mIGJvdGggYnVmZmVycyB0byB2b2lkKi4KKwkoZ2NyeV9tZF9zZXRrZXkpOiBDaGFuZ2VkIHR5cGUgb2YgMm5kIGFyZ3VtZW50IHRvIHZvaWQqLgorCShnY3J5X21kX2dldF9hc25vaWQpOiBOZXcuCisKKzIwMDMtMDEtMTUgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBzZXhwLmMgKGdjcnlfc2V4cF9sZW5ndGgpOiBGaXhlZC4gIFRoaXMgd2FzIHNlcmlvdXNseSBicm9rZW4uCisKKzIwMDMtMDEtMTQgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBnY3J5cHQuaCAoR0NSWUVSUl9JTlZfRkxBRyksIGdsb2JhbC5jIChnY3J5X3N0cmVycm9yKTogTmV3LgorCisyMDAzLTAxLTAyICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogbGliZ2NyeXB0LnZlcnM6IFRlbXBvcmFyeSBleHBvcnQgX2djcnlfZ2VuZXJhdGVfZWxnX3ByaW1lIGZvcgorCXVzZSBieSBHTlVUTFMuIAorCisyMDAyLTEyLTIxICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogZ2NyeXB0Lmg6IE1ha2UgdXNlIG9mIGdjYydzIHB1cmUgYW5kIG1hbGxvYyBhdHRyaWJ1dGVzIAorCShnY3J5X21kX3B1dGMpOiBVc2UgYSBoZWxwZXIgdmFyaWFibGUgdG8gYXZvaWQgbXVsdGlwbGUKKwlldmFsdWF0aW9uIG9mIEguIAorCSogZzEwbGliLmgsIHN0ZG1lbS5oLCBzZWNtZW0uaDogVXNlIGdjYyBhdHRyaWJ1dGVzIHB1cmUgYW5kIG1hbGxvYy4KKworCSogc3RkbWVtLmMgKHVzZV9tX2d1YXJkKTogRG9uJ3QgZGVmYXVsdCB0byB5ZXMuCisKKzIwMDItMTItMTkgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBnbG9iYWwuYyAoZ2xvYmFsX2luaXQpOiBUaGUgbWVhdCB3YXMgbmV2ZXIgcnVuIGR1ZSB0byBhIGZhdWx0eQorCWNoZWNrLiBUaGFua3MgdG8gTmlrb3MgZm9yIHBvaW50aW5nIHRoaXMgb3V0LgorCQorCSogZ2xvYmFsLmMgKGdjcnlfY29udHJvbCk6IFJldHVybiAxIGFuZCBub3QgLTEgZm9yIHRoZQorCWluaXRpYWxpemF0aW9uIHRlc3RzLgorCisJKiBsaWJnY3J5cHQudmVyczogTmV3LgorCSogTWFrZWZpbGUuYW06IFVzZSB0aGlzIGluc3RlYWQgb2YgdGhlIGJ1aWxkIHN5bWJvbCBmaWxlLgorCisJKiBnbG9iYWwuYyAoZ2NyeV9jb250cm9sKSA8aW5pdGlhbGl6YXRpb24+OiBDYWxsIHRoZSByYW5kb20gbW9kdWxlCisJaW5pdGlhbGl6ZXIgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHBvb2wgbG9jayBmbGFnIGhhcyBiZWVuCisJaW5pdGlhbGl6ZWQuCisKKzIwMDItMTItMDkgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBnbG9iYWwuYyAoZ2NyeV9jYWxsb2MsZ2NyeV9jYWxsb2Nfc2VjdXJlKTogQ2hlY2sgZm9yIG92ZXJmbG93LgorCU5vdGVkIGJ5IEZsb3JpYW4gV2VpbWVyLiAKKworMjAwMi0xMS0xMCAgU2ltb24gSm9zZWZzc29uICA8amFzQGV4dHVuZG8uY29tPgorCisJKiBnY3J5cHQuaCAoZ2NyeV9jdGxfY21kcyk6IE5ldyBHQ1JZQ1RMX1NFVF9DQkNfQ1RTIGNvbnRyb2wgZmxhZy4KKwkoZ2NyeV9jaXBoZXJfZmxhZ3MpOiBOZXcgR0NSWV9DSVBIRVJfQ0JDX0NUUyBnY3J5X2NpcGhlcl9vcGVuKCkgZmxhZy4KKwkoZ2NyeV9jaXBoZXJfY3RzKTogTmV3IG1hY3JvIGZvciB0b2dnbGluZyBDVFMuCisKKzIwMDItMTEtMTAgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBnY3J5cHQuaCAoR0NSWV9NRF9NRDQpOiBOZXcuICBXZSB1c2UgYSBub24gT3BlblBHUCB2YWx1ZSBoZXJlLiAKKworMjAwMi0wOS0yMCAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIGF0aC5jOiBJbmNsdWRlIHN5cy50aW1lLmggaWYgc3lzL3NlbGVjdC5oIGRvZXMgbm90IGV4aXN0LgorCShhdGhfc2VsZWN0LCBhdGhfd2FpdHBpZCk6IFNob3J0Y3V0IGZvciBXaW5kb3dzLgorCSogYXRoLmg6IEluY2x1ZGUgc29tZSBXaW5kb3dzIGhlYWRlcnMuICBCeSBUaW1vLgorCisyMDAyLTA5LTE4ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogYXRoLmg6IFByZWZpeCBhdGhfZGVpbml0LgorCisyMDAyLTA5LTE3ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogYmVuY2htYXJrLmM6IE5ldy4KKwkobXBpX2JlbmNoLCBkb19wb3dtKTogQWRkIGEgYSBzaW1wbGUgdGVzdCBmb3IgUlNBLgorCisJKiBnbG9iYWwuYyAoZ2xvYmFsX2luaXQpOiBOZXcuICBVc2UgaXQgaW5zdGVhZCBvZiB0aGUgc2V0dGluZworCWFueV9pbml0X2RvbmUuICBJbml0aWFsaXplIHRoZSBBVEggc3lzdGVtLgorCShnY3J5X2NoZWNrX3ZlcnNpb24pOiBIb29rIGdsb2JhbF9pbml0IGluLiAgVGhpcyBpcyB0aGUgc3VnZ2VzdGVkCisJd2F5IHRvIGluaXRpYWxpemUgdGhlIGxpYnJhcnkuCisJKF9nY3J5X25vX2ludGVybmFsX2xvY2tpbmcpOiBSZW1vdmVkLiAgV2Ugc2ltcGx5IGNhbGwgYSBhdGhfZGVpbml0CisJYW5kIGxlYXZlIGl0IHRvIEFUSCB0byBkaXNiYWxlIHRoZSBsb2NraW5nLgorCisJKiBhdGguYywgYXRoLmgsIGF0aC1wdGguYywgYXRoLXB0aHJlYWQuYzogTmV3LiBUYWtlbiBmcm9tIEdQR01FLgorCSogbXV0ZXguaDogUmVtb3ZlZC4KKwkqIE1ha2VmaWxlLmFtIChhdGhfY29tcG9uZW50cyk6IE5ldy4KKworMjAwMi0wOS0xNiAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIHNlY21lbS5jIChfZ2NyeV9zZWNtZW1fZHVtcF9zdGF0cyk6IFJlcGxhY2VkIGZwcmludGYgYnkgbG9nXyouCisKKzIwMDItMDgtMjMgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBtaXNzaW5nLXN0cmluZy5jOiBSZW1vdmVkIHVubmVlZGVkIHN0cmx3ci4KKworCSogbGliZ2NyeXB0Lm00OiBNYWRlIG11Y2ggbW9yZSBzaW1wbGUuCisJKiBsaWJnY3J5cHQtY29uZmlnLmluOiBNYWRlIC0tcHJlZml4IHdvcmsgZm9yIC0tbGlicy4KKworMjAwMi0wOC0xNCAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIGdjcnlwdC5oOiBBZGQgR0NSWV9DSVBHRVJfREVTLiAgSW5jbHVkZWQgc3RyaW5nLmggZm9yIHNpemVfdC4KKwlTdWdnZXN0ZWQgYnkgU2ltb24gSm9zZWZzc29uLgorCisyMDAyLTA3LTI1ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogY2lwaGVyLmg6IEFkZGVkIHByb3RvdHlwZXMgZm9yIHByb2dyZXNzIGZ1bmN0aW9ucy4KKwkqIGdsb2JhbC5jOiBJbmNsdWRlIGNpcGhlci5oIGZvciB0aG9zZSBwcm90b3R5cGVzLgorCisJKiBzdGRtZW0uYyAoX2djcnlfcHJpdmF0ZV9yZWFsbG9jKTogUmVwbGFjZWQgdm9pZCogYnkgY2hhciAqIGZvcgorCXBvaW50ZXIgYXJpdGhtZXRpYyByZWFzb25zLiAgTm90ZWQgYnkgU3RlcGhhbiBBdXN0ZXJtdWVobGUuCisKKzIwMDItMDYtMjQgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBtaXNzaW5nLXN0cmluZy5jOiBJbmNsdWRlIGN0eXBlLmguCisKKwkqIGdjcnlwdC5oIChnY3J5X21waV9pbnZtLCBnY3J5X21waV9kaXYsIGdjcnlfbXBpX21vZCkKKwkoZ2NyeV9tcGlfc3dhcCk6IE5ldy4KKworMjAwMi0wNi0xOCAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIGdjcnlwdC5oOiBBZGRlZCBhIGJ1bmNoIG9mIGJyaWVmIGZ1bmN0aW9uIGRlc2NyaXB0aW9ucy4KKworMjAwMi0wNS0yMSAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIG1pc2MuYyAoX2djcnlfbG9nX3ByaW50Zik6IERvbid0IGluaXRpYWxpemUgYSB2YV9saXN0LiAgTm90ZWQgYnkKKwlKZWZmIEpvaG5zb24uCisKKwkqIGdsb2JhbC5jIChnY3J5X3NldF9wcm9ncmVzc19oYW5kbGVyKTogTmV3LgorCisJKiBnY3J5cHQuaDogUmVwbGFjZWQgdGhlIHR5cGVkZWYgZm9yIGJ5dGUuCisKKzIwMDItMDUtMTYgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBtaXNzaW5nLXN0cmluZy5jOiBOZXcuCisKKwkqIGdjcnlwdC5oOiBBZGQgbmV3IGVycm9yIGNvZGVzIEdDUllFUlJfU0VYUF8gYW5kIHR5cGVkZWZzCisJR2NyeU1QSSwgR2NyeVNleHAsIEdjcnlDaXBoZXJIZCwgR2NyeU1ESGQgYXMgYWxpYXNlcyBmb3IgdGhlIG9sZAorCW9uZXMgdXNpbmcgYW4gdW5kZXJzY29yZS4KKworCSogZ2xvYmFsLmMgKGdjcnlfc3RyZXJyb3IpOiBBZGQgc3RyaW5ncyBmcm8gdGhlIG5ldyBlcnJvciBjb2Rlcy4KKwkqIHNleHAuYyAoZ2NyeV9zZXhwX2Nhbm9uX2xlbik6IFVzZSBhIG1hY3JvIHRvIGNvbnZlcnQgZnJvbSBuZXcgdG8KKwlvbGQgZXJyb3IgY29kZXMuCisJKGdjcnlfc2V4cF9jcmVhdGUsZ2NyeV9zZXhwX25ldyk6IE5ldy4KKworMjAwMi0wNS0xNSAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIG11dGV4LmggKERFRklORV9MT0NBTF9NVVRFWCk6IE1hY3JvIHRvIGRlZmluZSBhIG11dGV4IGFuZAorCWluaXRpYWxpemUgaXQgc28gdGhhdCB3ZSBjYW4gZGV0ZWN0IGFuIHVuaXRpYWxpemVkIG11dGV4IGFuZCBkb24ndAorCXJlYWQgZnJvbSBzdGRpbi4KKworMjAwMi0wNS0xNCAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwlDaGFuZ2VkIGxpY2Vuc2Ugb2YgYWxsIGZpbGVzIHRvIHRoZSBMR1BMLgorCisyMDAyLTA1LTA3ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogZ2xvYmFsLmMgKGdjcnlfY29udHJvbCk6IEFkZCBjb21tYW5kcworCUdDUllDVExfQU5ZX0lOSVRJQUxJWkFUSU9OX1AgYW5kIEdDUllDVExfSU5JVElBTElaQVRJT05fRklOSVNIRURfUAorCXNvIHRoYXQgb3RoZXIgbGlicmFyaWVzIGFyZSBhYmxlIHRvIGNoZWNrIGZvciByZXF1aXJlZAorCWluaXRpYWxpemF0aW9ucy4KKworMjAwMi0wNS0wMiAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIGdjcnlwdC5oIChHQ1JZQ1RMX0RJU0FCTEVfSU5URVJOQUxfTE9DS0lORyk6IE5ldy4KKwkqIGdsb2JhbC5jIChnY3J5X2NvbnRyb2wpOiBJbXBsZW1lbnQgaXQuCisJKF9nY3J5X25vX2ludGVybmFsX2xvY2tpbmcpOiBOZXcuCisJKiBtdXRleC5oOiBQcmVmaXhlZCBhbGwgZnVjbnRpb25zIHdpdGggX2djcnlfLiAgQnlwYXNzIGFsbAorCWZ1bmN0aW9ucyB3aGVuIGRlc2lyZWQuCisKKwkqIGdjcnlwdC5oIChHQ1JZQ1RMX0RJU0FCTEVfU0VDTUVNKTogTmV3LgorCSogZ2xvYmFsLmMgKGdjcnlfY29udHJvbCxnY3J5X21hbGxvY19zZWN1cmUsZ2NyeV9pc19zZWN1cmUpOgorCUltcGxlbWVudCBpdCBoZXJlLgorCSogc2VjbWVtLmMgKF9nY3J5X3ByaXZhdGVfaXNfc2VjdXJlKTogUmV0dXJuIGZhbHNlIGlmIHRoZSBwb29sIGlzCisJbm90IGluaXRpYWxpemVkLgorCisJKiBnY3J5cHQuaCAoR0NSWUNUTF9JTklUSUFMSVpBVElPTl9GSU5JU0hFRCk6IE5ldy4KKworCSogZ2NyeXB0LmggKGdjcnlfY2lwaGVyX2FsZ29zKTogUmVwbGFjZWQgUklOREFFTCBieSBBRVMgYW5kIGNoYW5nZQorCXRoZSBtYWNyb3MgdG8gZXhwYW5kIGZyb20gcmlqZGFlbCB0byBhZXMuCisKKwkqIHN0ZG1lbS5jIChfZ2NyeV9wcml2YXRlX21hbGxvYyk6IFJldHVybiBOVUxMIGZvciAwIGJ5dGUgYWxsb2NhdGlvbi4KKwkoX2djcnlfcHJpdmF0ZV9tYWxsb2Nfc2VjdXJlKTogRGl0dG8uCisKKwkqIGcxMGxpYi5oOiAgQ29waWVkIHRoZSBKTkxJQl9HQ0MgbWFjcm9zIGZyb20gLi4vam5saWIvbWlzY2hlbHAuaAorCWFuZCByZW1vdmVkIHRoZSBpbmNsdXNpb24gb2YgdGhhdCBmaWxlLgorCisyMDAyLTA0LTE1ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogZ2xvYmFsLmMgKGdjcnlfc3RyZHVwKTogTmV3LgorCisyMDAyLTAzLTE4ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogbXV0ZXguaDogTmV3IGZpbGUgd2l0aCBhIHBvcnRhYmxlIHRocmVhZCBtdXRleCBpbXBsZW1lbnRhdGlvbgorCXdyaXR0ZW4gYnkgTWFyY3VzIEJyaW5rbWFubi4gIFRha2VuIGZyb20gR1BHTUUuCisKKzIwMDItMDItMTggIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBzZXhwLmMgKGdjcnlfc2V4cF9zc2Nhbik6IERvbid0IGluaXRpYWxpemUgdGhlIGR1bW15CisJdmFyaWFibGUuICBTdWdnZXN0ZWQgYnkgSm9yZGkgTWFsbGFjaC4KKworMjAwMi0wMS0zMSAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIHNleHAuYyAoc3VpdGFibGVfZW5jb2RpbmcsY29udmVydF90b19oZXgsY29udmVydF90b19zdHJpbmcpCisJKGNvbnZlcnRfdG9fdG9rZW4pOiBOZXcuCisJKGdjcnlfc2V4cF9zcHJpbnQpOiBCZXR0ZXIgZm9ybWF0dGluZyBvZiBhZHZhbmNlZCBlbmNvZGluZywgZG9lcworCW5vdyBpbnNlcnQgTEZzIGFuZCBlc2NhcGVzIGFsbCB1bnByaW50YWJsZSBjaGFyYWN0ZXJzLgorCSh1bnF1b3RlX3N0cmluZyk6IE5ldy4KKwkoc2V4cF9zc2Nhbik6IEltcGxlbWVudGVkIHRoZSBtaXNzaW5nIGNvbnZlcnNpb24gb2YgcXVvdGVkIHN0cmluZ3MuCisKKzIwMDItMDEtMjYgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBsaWJnY3J5cHQtY29uZmlnLmluOiBBZGQgY29weXJpZ2h0IG5vdGljZS4KKworMjAwMi0wMS0xMSAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIHNleHAuYyAoZ2NyeV9zZXhwX2Nhbm9uX2xlbik6IEZpeGVkIGxhc3QgY2hhbmdlLgorCisyMDAyLTAxLTAxICBUaW1vIFNjaHVseiA8dHNAd2lucHQub3JnPgorCisJKiBzdGRtZW0uYyAoX2djcnlfcHJpdmF0ZV9yZWFsbG9jKTogSWYgcG9pbnRlciBpcyBOVUxMIG5vdyByZWFsbG9jCisJYmVoYXZlcyBsaWtlIG1hbGxvYy4KKworMjAwMS0xMi0yMCAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIHNleHAuYyAoZ2NyeV9zZXhwX2Nhbm9uX2xlbik6IERlc2NyaWJlIHRoZSBlcnJvciBjb2RlcyBhbmQKKwlyZXR1cm4gYW4gZXJyb3IgaWYgdGhpcyBpcyBub3QgYSBTLUV4cDsgaS5lLiBpdCBkb2VzIG5vdCBzdGFydAorCXdpdGggYW4gb3BlbiBwYXJlbnRoZXNpcy4KKworMjAwMS0xMi0xOCAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIHNleHAuYyAoZ2NyeV9zZXhwX2Nhbm9uX2xlbik6IEZpeGVkIHRoZSB0ZXN0IG9uIE5VTEwgYnVmZmVyLgorCisJKiBNYWtlZmlsZS5hbSAoRElTVENMRUFORklMRVMpOiBJbmNsdWRlIGxpYmdjcnlwdC5zeW0KKworCSogc2V4cC5jOiBSZW1vdmVkIHRoZSBjb21tZW50ZWQgdGVzdCBjb2RlIGJlY2F1c2Ugd2Ugbm93IGhhdmUgYQorCXRlc3QgaW4gLi4vdGVzdHMvCisKKzIwMDEtMTItMTcgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBzZXhwLmMgKGdjcnlfc2V4cF9jYW5vbl9sZW4pOiBOZXcuCisKKzIwMDEtMTItMTEgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBnY3J5cHQuaDogRml4ZWQgQUVTMTI4IG1hY3JvLCBhZGQgZW51bSBmb3IgT0ZCIG1vZGUuCisKKzIwMDEtMTItMDUgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBtaXNjLmMgKF9nY3J5X2xvZ19wcmludGYpOiBOZXcuCisJKiBzZXhwLmMgKGR1bXBfc3RyaW5nLGdjcnlfc2V4cF9kdW1wKTogVXNlIGxvZ2dpbmcgZnVuY3Rpb25zCisJaW5zdGVhZCBvZiBzdGRlcnIuCisKKzIwMDEtMTEtMTYgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBnY3J5cHQuaDogTmV3IGNvbnN0YW50IEdDUllDVExfSVNfQUxHT19FTkFCTEVELgorCisyMDAxLTEwLTAyICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogZ2NyeXB0Lmg6IFJlbW92ZWQgYSBjb3VwbGUgb2YgdHJhaWxpbmcgY29tbWFzLgorCisyMDAxLTA4LTI4ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogc2V4cC5jIChzZXhwX3NzY2FuKTogQWRkIGFuIGFyZ3VtZW50IHRvIGVuYWJsZSB0aGUKKwlhcmdfcHRyLiBDaGFuZ2VkIGFsbCBjYWxsZXJzLiAgU3VnZ2VzdGVkIGJ5IFRvbSBIb2xyb3lkLgorCisyMDAxLTA4LTAzICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogZ2xvYmFsLmMgKGdjcnlfc3RyZXJyb3IpOiBVcGRhdGVkIGxpc3Qgb2YgZXJyb3IgY29kZXMuCisKKzIwMDEtMDctMjMgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBnY3J5cHQuaDogUmVwbGFjZWQgdGhlIGxhc3QgdWxvbmcuICBOb3RlZCBieSBSYW1pIExlaHRpLgorCisyMDAxLTA1LTMxICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogZ2NyeXB0LmgsIG1waS5oOiBNYWRlIHNvbWUgbXBpIGZ1bmN0aW9ucyBwdWJsaWMuCisKKwkqIHdyYXBwZXIuYzogUmVtb3ZlZC4KKwkqIGdsb2JhbC5jOiBSZW5hbWVkIGFsbCBnMTBfIHByZWZpeGVkIGZ1bmN0aW9ucyB3aGljaCBoYWQgd3JhcHBlcnMgCisJdG8gZ2NyeV94eHguIFNvIHdlIG5vdyB1c2UgdGhlIGV4cG9ydGVkIG1lbW9yeSBmdW5jdGlvbnMgaW5lcm5hbGx5LgorCisJUmVuYW1lZCBhbGwgZzEwXyBwcmVmaXhlZCBmdW5jdGlvbnMgdG8gX2djcnlfIHByZWZpeGVkIG9uZXMuCisJCisJKiBnMTBsaWIuaCAoX0dDUllQVF9JTl9MSUJHQ1JZUFQpOiBSZXBsYWNlIGRlZmludGlvbiBieSBhIHRlc3Qgb24gaXQuCisKKzIwMDEtMDUtMjggIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBsaWJnY3J5cHQubTQ6IENoZWNrIEdDUllQVF9WRVJTSU9OIG1hY3JvIGFuZCBub3QgTElCR0NSWVBUX1ZFUlNJT04uCisKKwkqIG1waS5oOiBSZW1vdmVkIG1waV9mcm9tc3RyIHByb3RvdHlwZS4KKworMjAwMS0wMS0xMSAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIE1ha2VmaWxlLmFtIChsaWJnY3J5cHRfbGFfU09VUkNFUyk6IEFkZCBtcGkuaAorCisyMDAwLTEyLTE5ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogdHlwZXMuaDogTW92ZWQgZnJvbSAuLi9pbmNsdWRlIHRvIGhlcmUuCisKKyAJTWFqb3IgY2hhbmdlOgorCVJlbW92ZWQgYWxsIEdudVBHIHN0dWZmIGFuZCByZW5hbWVkIHRoaXMgcGllY2Ugb2Ygc29mdHdhcmUKKwl0byBnY3J5cHQuIAorCisyMDAwLTExLTE0ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogbXBpLmg6IE1vdmVkIHRvIC4uL21waS4KKworCSogTWFrZWZpbGUuYW0gKE9NSVRfREVQRU5ERU5DSUVTKTogSGFjayB0byB3b3JrIGFyb3VuZCBkZXBlbmRlbmN5CisJcHJvYmxlbXMuCisKKzIwMDAtMTAtMTEgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBtcGkuaDogQ2hhbmdlZCB0aGUgd2F5IG1waV9saW1iX3QgaXMgZGVmaW5lZC4KKworMjAwMC0xMC0xMCAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIE1ha2VmaWxlLmFtOiBUYWtlIHZlcnNpb24taW5mbyBmcm9tIGNvbmZpZ3VyZS4KKworMjAwMC0xMC0wOSAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIGdjcnlwdC5oOiBOZXcgY2lwaGVyIG1vZGUsIG5ldyBhbGdvIEFyY2ZvdXIgYW5kIG5ldyBlcnJvciBjb2RlCisJR0NSWUVSUl9JTlZfQ0lQSEVSX01PREUuCisJKiBnbG9iYWwuYyAoZ2NyeV9zdHJlcnJvcik6IE5ldyBlcnJvcmNvZGUuCisKK1dlZCBPY3QgIDQgMTM6MTY6MTggQ0VTVCAyMDAwICBXZXJuZXIgS29jaCAgPHdrQG9wZW5pdC5kZT4KKworICAgICAgICAqIGdjcnlwdC5oIChnY3J5X21kX3NldGtleSk6IFJlcGxhY2VkIG1hY3JvIGJ5IGZ1bmN0aW9uIHByb3RvdHlwZS4KKworTW9uIFNlcCAxOCAxNjozNTo0NSBDRVNUIDIwMDAgIFdlcm5lciBLb2NoICA8d2tAb3Blbml0LmRlPgorCisgICAgICAgICogZ2NyeXB0LmggKEdDUllDVExfR0VUX0FMR09fVVNBR0UpOiBOZXcuCisKKyAgICAgICAgKiBzZWNtZW0uYyAoc2VjbWVtX3JlYWxsb2MpOiBjaGVjayBmb3IgZmFpbGVkIHNlY21lbV9tYWxsb2MuICBCeQorICAgICAgICBNYXR0IEtyYWFpLgorCitNb24gSnVsIDMxIDEwOjA0OjQ3IENFU1QgMjAwMCAgV2VybmVyIEtvY2ggIDx3a0BvcGVuaXQuZGU+CisKKyAgKiBzZXhwLmM6IFJlbW92ZWQgdGhlIGRhdGFsZW4gZmllbGRzIGZyb20gbGlzdCB0YWdzLgorICAoZ2NyeV9zZXhwX2Nhcl9kYXRhLGdjcnlfc2V4cF9jZHJfZGF0YSxnY3J5X3NleHBfY2FyX21waSwKKyAgIGdjcnlfc2V4cF9jZHJfbXBpKTogUmVtb3ZlZC4KKyAgKGdjcnlfc2V4cF9udGgsZ2NyeV9zZXhwX250aF9kYXRhLGdjcnlfc2V4cF9udGhfbXBpKTogTmV3LgorCitGcmkgSnVsIDI4IDE4OjE5OjExIENFU1QgMjAwMCAgV2VybmVyIEtvY2ggIDx3a0BvcGVuaXQuZGU+CisKKyAgKiBzZXhwLmMgKHNleHBfc3NjYW4pOiBGaXhlZCByZWFsbG9jYXRpb24gdG8gc2VjdXJlIG1lbW9yeS4KKyAgKG5ld19lbXB0eV9saXN0KTogUmVtb3ZlZAorICAoZ2NyeV9zZXhwX2xlbmd0aCk6IE5ldy4KKyAgKGdjcnlfc2V4cF9lbnVtKTogUmVtb3ZlZC4KKyAgKG5vcm1hbGl6ZSk6IE5ldy4gUmV3b3JrZWQgdGhlIHdob2xlIHRoaW5nIHRvIHVzZSBOVUxMIGZvciBhbiBlbXB0eSBsaXN0LgorICAobWFrZV9zcGFjZSk6IE5ldyBpbnN0ZWFkIG9mIHRoZSBtYWNyby4KKworVHVlIEp1bCAyNSAxNzo0NDoxNSBDRVNUIDIwMDAgIFdlcm5lciBLb2NoICA8d2tAb3Blbml0LmRlPgorCisgICogc2V4cC5jOiBNYWpvciByZXdyaXRlLgorICAoZ2NyeV9zZXhwX3NzY2FuKTogUmVvcmRlcmVkIGFyZ3VtZW50cy4gIE1vdmVkIGZ1bmN0aW9uYWxpdHkgdG8gLi4KKyAgKHNleHBfc3NjYW4pOiAuLiB0aGlzLgorICAoZ2NyeV9zZXhwX2J1aWxkKTogTmV3LgorICAoZ2NyeV9zZXhwX25ld19uYW1lX21waSwgZ2NyeV9zZXhwX25ld19uYW1lX2RhdGEsIGdjcnlfc2V4cF9uZXdfZGF0YSwKKyAgIGdjcnlfc2V4cF9uZXdfbXBpKTogUmVtb3ZlZC4KKworRnJpIEp1bCAxNCAxOTozODoyMyBDRVNUIDIwMDAgIFdlcm5lciBLb2NoICA8d2tAPgorCisgICogZ2NyeXB0LmggKGdjcnlfbWRfc3RhcnRfZGVidWcsIGdjcnlfbWRfc3RvcF9kZWJ1Zyk6IE5ldy4KKyAgKGdjcnlfY3RsX2NtZHMpOiBOZXcgY29udHJvbCB2YWx1ZXMKKworICAqIHNleHAuYyAoZ2NyeV9zZXhwX3NzY2FuKTogQWRkIGhleCBmb3JtYXQgcGFyc2luZy4KKworICAqIHNlY21lbS5jIChsb2NrX3Bvb2wpOiBDaGVjayBmb3IgRU5PU1lTIHJldHVybiBteSBtbG9jaygpIG9uIG9sZCBTQ09zLgorICAocG9vbF9pc19tbWFwcGVkKTogTWFkZSB2b2xhdGlsZS4KKyAgKGxvY2tfcG9vbCk6IE5vIG1vcmUgd2FybmluZyBmb3IgUU5YLiBCeSBTYW0gUm9iZXJ0cy4KKyAgKGxvY2tfcG9vbCxzZWNtZW1faW5pdCk6IEFkZGl0aW9uYWwgY2hlY2sgZm9yIGRyb3BwZWQgcHJpdnMuCisKKzIwMDAtMDMtMjEgMDk6MTg6NDggIFdlcm5lciBLb2NoICAod2tAaGFiaWJ0aS5nbnVwZy5kZSkKKworCSogZ2NyeXB0LmggKGdjcnlfbWRfc2V0a2V5KTogTmV3LgorCShHQ1JZX01EX0ZMQUdfSE1BQyk6IE5ldy4KKworTW9uIEphbiAzMSAxNjozNzozNCBDRVQgMjAwMCAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5kZT4KKworCSogTWFrZWZpbGUuYW06IEFkZCBnMTBsaWIuaAorCitUaHUgSmFuIDI3IDE4OjAwOjQ0IENFVCAyMDAwICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLmRlPgorCisJKiBzZXhwLmMgKGdjcnlfc2V4cF9zc2Nhbik6IEFsbG93IE5VTEwgZm9yIGVycm9mZi4KKworTW9uIEphbiAyNCAyMjoyNDozOCBDRVQgMjAwMCAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5kZT4KKworCSogc2V4cC5jIChnY3J5X3NleHBfYWxpc3QpOiBOZXcuCisKK01vbiBKYW4gMjQgMTM6MDQ6MjggQ0VUIDIwMDAgIFdlcm5lciBLb2NoICA8d2tAZ251cGcuZGU+CisKKwkqIHNlY21lbS5jOiBNb3ZlZCBmcm9tIC4uL3V0aWwgdG8gaGVyZS4KKwkqIHNlY21lbS5oOiBOZXcuCisJKiBzdGRtZW0uYzogTmV3LiBCYXNlZCBvbiB0aGUgb2xkIC4uL3V0aWwvbWVtb3J5LmMuCisJKiBzdGRtZW0uaDogTmV3LgorCitXZWQgRGVjICA4IDIxOjU4OjMyIENFVCAxOTk5ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLmRlPgorCisJKiBnY3J5cHQubTQ6IE5ldy4KKwkqIGdjcnlwdC1jb25maWc6IE5ldy4KKworCSogbXBpLmggKG1waV9nZXRfbmJpdF9pbmZvKTogUmVtb3ZlZAorCShtcGlfc2V0X25iaXRfaW5mbyk6IFJlbW92ZWQuCisJKHN0cnVjdCBnY3J5X21waSk6IFJlbW92ZWQgdGhlIG5iaXRzIGZpZWxkLgorCisJKiBtaXNjLmMgKGcxMF9sb2dfdmVyYm9zaXR5KTogTmV3LgorCisJKiBnbG9iYWwuYyAoZzEwX3hzdHJkdXApOiBOZXcuCisKKwkqIG1waWFwaS5jOiBSZW1vdmVkLgorCisJKiBtcGkuaDogTW92ZWQgZnJvbSAuLi9pbmNsdWRlIHRvIGhlcmUuICBSZW1vdmVkIHNvbWUgb2Jzb2xldGUKKwlwcm90b3R5cGVzIGFuZCB0aGUgaW9idWYuaCBoZWFkZXIuCisJKiBjaXBoZXIuaDogTW92ZWQgZnJvbSAuLi9pbmNsdWRlIHRvIGhlcmUuIFJlbW92ZWQgdGhlIG1waS5oIGhlYWRlci4KKwkqIGcxMGxpYi5oOiBNb3ZlZCBmcm9tIC4uL2luY2x1ZGUgdG8gaGVyZS4KKworRnJpIE5vdiAxOSAxNzoxNToyMCBDRVQgMTk5OSAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5kZT4KKworCSogc2V4cC5jIChkdW1wX3N0cmluZyk6IE5ldy4gIFRha2VuIGZyb20gZ251cGcvdXRpbC9taXNjdXRpbC5jLgorCShkb19kdW1wX2xpc3QpOiBzL3ByaW50X3N0cmluZy9kdW1wX3N0cmluZy8uCisKKwkqIHRlc3RhcGkuYzogTmV3LgorCisJKiBtcGlhcGkuYyAoZ2NyeV9tcGlfcmFuZG9taXplKTogVXNlIG5ldyByYW5kb20gQVBJLgorCitTYXQgTm92IDEzIDE3OjQ0OjIzIENFVCAxOTk5ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLmRlPgorCisJKiBnbG9hYmwuYyAoZ2NyeV9jb250cm9sKTogQWRkIGNhc2VzIGZvciBkdW1waW5nIHJhbmRvbQorCWFuZCBzZWNtZW0gc3RhdHMuCisKK1R1ZSBPY3QgMjYgMTQ6MTA6MjEgQ0VTVCAxOTk5ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLmRlPgorCisJKiBwa2FwaS5jOiBSZW1vdmVkLgorCisJKiBzeW1hcGkuYzogUmVtb3ZlZC4KKworCSogZzEwbGliLmg6ICBNb3ZlZCB0byAuLi9pbmNsdWRlLgorCisJKiBtZGFwaS5jOiBSZW1vdmVkLgorCitXZWQgSnVsICA3IDEzOjA4OjQwIENFU1QgMTk5OSAgV2VybmVyIEtvY2ggIDx3a0Bpc2lsLmQuc2h1dHRsZS5kZT4KKworCSogc2V4cC5jOiBOZXcuCisKK1R1ZSBEZWMgIDggMTM6MTU6MTYgQ0VUIDE5OTggIFdlcm5lciBLb2NoICA8d2tAaXNpbC5kLnNodXR0bGUuZGU+CisKKwkqIGdjcnlwdC5oOiBOZXcKKwkqIG1waWFwaS5jOiBOZXcKKworCQorIENvcHlyaWdodCAoQykgMTk5OCwxOTk5LDIwMDAsMjAwMSwyMDAyLDIwMDMKKwkgICAgICAgMjAwNCwgMjAwNSwgMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRoZSBhdXRob3IgZ2l2ZXMKKyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0IGV2ZW4gdGhlCisgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvc3JjL01ha2VmaWxlLmFtIGIvbGliZ2NyeXB0LTEuNC42L3NyYy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDRiNWUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L3NyYy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDEzMiBAQAorIyBNYWtlZmlsZS5hbSAtIGZvciBnY3J5cHQvc3JjCisjIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwKKyMgICAgICAgICAgICAgICAyMDA2LCAyMDA3ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorIworIyBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKworIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBwcm9kdWNlIE1ha2VmaWxlLmluCisKK0VYVFJBX0RJU1QgPSBNYW5pZmVzdCBsaWJnY3J5cHQtY29uZmlnLmluIGxpYmdjcnlwdC5tNCBsaWJnY3J5cHQudmVycyBcCisgICAgICAgICAgICAgZ2NyeXB0LmguaW4gbGliZ2NyeXB0LmRlZgorYmluX1NDUklQVFMgPSBsaWJnY3J5cHQtY29uZmlnCittNGRhdGFkaXIgPSAkKGRhdGFkaXIpL2FjbG9jYWwKK200ZGF0YV9EQVRBID0gbGliZ2NyeXB0Lm00CitpbmNsdWRlX0hFQURFUlMgPSBnY3J5cHQuaCBnY3J5cHQtbW9kdWxlLmgKKworbGliX0xUTElCUkFSSUVTID0gbGliZ2NyeXB0LmxhCitiaW5fUFJPR1JBTVMgPSBkdW1wc2V4cCBobWFjMjU2CitpZiBVU0VfUkFORE9NX0RBRU1PTgorc2Jpbl9QUk9HUkFNUyA9IGdjcnlwdHJuZAorYmluX1BST0dSQU1TICs9IGdldHJhbmRvbQorZW5kaWYgVVNFX1JBTkRPTV9EQUVNT04KKworCitpZiBIQVZFX0xEX1ZFUlNJT05fU0NSSVBUCisgIGxpYmdjcnlwdF92ZXJzaW9uX3NjcmlwdF9jbWQgPSAtV2wsLS12ZXJzaW9uLXNjcmlwdD0kKHNyY2RpcikvbGliZ2NyeXB0LnZlcnMKK2Vsc2UKKyAgbGliZ2NyeXB0X3ZlcnNpb25fc2NyaXB0X2NtZCA9IAorZW5kaWYKKworbGliZ2NyeXB0X2xhX0NGTEFHUyA9IEBHUEdfRVJST1JfQ0ZMQUdTQAorbGliZ2NyeXB0X2xhX1NPVVJDRVMgPSBnMTBsaWIuaCB2aXNpYmlsaXR5LmMgdmlzaWJpbGl0eS5oIHR5cGVzLmggXAorCWNpcGhlci5oIGNpcGhlci1wcm90by5oIFwKKwltaXNjLmMgZ2xvYmFsLmMgc2V4cC5jIGh3ZmVhdHVyZXMuYyBcCisJc3RkbWVtLmMgc3RkbWVtLmggc2VjbWVtLmMgc2VjbWVtLmggXAorCW1waS5oIG1pc3Npbmctc3RyaW5nLmMgbW9kdWxlLmMgZmlwcy5jIFwKKwlobWFjMjU2LmMgaG1hYzI1Ni5oIFwKKwlhdGguaCBhdGguYworCitpZiBIQVZFX1czMl9TWVNURU0KKworTFRSQ0NPTVBJTEUgPSAkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoUkMpIFwKKyAgICAgYGVjaG8gJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpIHwgXAorICAgICBzZWQgLWUgJ3MvLUkvLS1pbmNsdWRlLWRpciAvZztzLy1ELy0tZGVmaW5lIC9nJ2AKKworLnJjLmxvOgorCSQoTFRSQ0NPTVBJTEUpIC1pICQ8IC1vICRACisKK2djcnlwdF9yZXMgPSB2ZXJzaW9uaW5mby5sbworZ2NyeXB0X3Jlc19sZGZsYWcgPSAtV2wsLmxpYnMvdmVyc2lvbmluZm8ubworCitub191bmRlZmluZWQgPSAtbm8tdW5kZWZpbmVkCitleHBvcnRfc3ltYm9scyA9IC1leHBvcnQtc3ltYm9scyAkKHNyY2RpcikvbGliZ2NyeXB0LmRlZgorCitpbnN0YWxsLWRlZi1maWxlOgorCSQoSU5TVEFMTCkgJChzcmNkaXIpL2xpYmdjcnlwdC5kZWYgJChERVNURElSKSQobGliZGlyKS9saWJnY3J5cHQuZGVmCisKK3VuaW5zdGFsbC1kZWYtZmlsZToKKwktcm0gJChERVNURElSKSQobGliZGlyKS9saWJnY3J5cHQuZGVmCisKK2djcnlwdF9kZXBzID0gJChnY3J5cHRfcmVzKSBsaWJnY3J5cHQuZGVmCisKK2Vsc2UgIUhBVkVfVzMyX1NZU1RFTQorCitnY3J5cHRfcmVzID0KK2djcnlwdF9yZXNfbGRmbGFnID0KK25vX3VuZGVmaW5lZCA9CitleHBvcnRfc3ltYm9scyA9CitpbnN0YWxsLWRlZi1maWxlOgordW5pbnN0YWxsLWRlZi1maWxlOgorCitnY3J5cHRfZGVwcyA9CisKK2VuZGlmICFIQVZFX1czMl9TWVNURU0KKworCitsaWJnY3J5cHRfbGFfTERGTEFHUyA9ICQoZ2NyeXB0X3Jlc19sZGZsYWcpICQobm9fdW5kZWZpbmVkKSAkKGV4cG9ydF9zeW1ib2xzKSBcCisJJChsaWJnY3J5cHRfdmVyc2lvbl9zY3JpcHRfY21kKSAtdmVyc2lvbi1pbmZvIFwKKwlATElCR0NSWVBUX0xUX0NVUlJFTlRAOkBMSUJHQ1JZUFRfTFRfUkVWSVNJT05AOkBMSUJHQ1JZUFRfTFRfQUdFQAorbGliZ2NyeXB0X2xhX0RFUEVOREVOQ0lFUyA9IFwKKwkuLi9jaXBoZXIvbGliY2lwaGVyLmxhIFwKKwkuLi9yYW5kb20vbGlicmFuZG9tLmxhIFwKKwkuLi9tcGkvbGlibXBpLmxhIFwKKwkkKHNyY2RpcikvbGliZ2NyeXB0LnZlcnMgJChnY3J5cHRfZGVwcykKK2xpYmdjcnlwdF9sYV9MSUJBREQgPSBcCisJLi4vY2lwaGVyL2xpYmNpcGhlci5sYSBcCisJLi4vcmFuZG9tL2xpYnJhbmRvbS5sYSBcCisJLi4vbXBpL2xpYm1waS5sYSBcCisJQExUTElCT0JKU0AgQEdQR19FUlJPUl9MSUJTQAorCisKK2R1bXBzZXhwX1NPVVJDRVMgPSBkdW1wc2V4cC5jCitkdW1wc2V4cF9MREFERCA9IAorCitobWFjMjU2X1NPVVJDRVMgPSBobWFjMjU2LmMKK2htYWMyNTZfQ0ZMQUdTID0gLURTVEFOREFMT05FCitobWFjMjU2X0xEQUREID0gCisKK2lmIFVTRV9SQU5ET01fREFFTU9OCitnY3J5cHRybmRfU09VUkNFUyA9IGdjcnlwdHJuZC5jCitnY3J5cHRybmRfQ0ZMQUdTID0gJChHUEdfRVJST1JfQ0ZMQUdTKSAkKFBUSF9DRkxBR1MpCitnY3J5cHRybmRfTERBREQgPSBsaWJnY3J5cHQubGEgJChQVEhfTElCUykKKworZ2V0cmFuZG9tX1NPVVJDRVMgPSBnZXRyYW5kb20uYworZW5kaWYgVVNFX1JBTkRPTV9EQUVNT04KKworCitpbnN0YWxsLWRhdGEtbG9jYWw6IGluc3RhbGwtZGVmLWZpbGUKKwordW5pbnN0YWxsLWxvY2FsOiB1bmluc3RhbGwtZGVmLWZpbGUKKworIyBGSVhNRTogV2UgbmVlZCB0byBmaWd1cmUgb3V0IGhvdyB0byBnZXQgdGhlIGFjdHVhbCBuYW1lIChwYXJzaW5nCisjIGxpYmdjcnlwdC5sYT8pIGFuZCBob3cgdG8gY3JlYXRlIHRoZSBobWFjIGZpbGUgYWxyZWFkeSBhdCBsaW5rIHRpbWUKKyMgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCB3aXRob3V0IGluc3RhbGxpbmcgbGliZ2NyeXB0IGZpcnN0LgorI2luc3RhbGwtZXhlYy1ob29rOgorIwkuL2htYWMyNTYgIldoYXQgYW0gSSwgYSBkb2N0b3Igb3IgYSBtb29uc2h1dHRsZSBjb25kdWN0b3I/IiBcCisjICAgICAgICAgIDwgJChERVNURElSKSQobGliZGlyKS9saWJnY3J5cHQuc28uMTEuNS4wIFwKKyMgICAgICAgICAgPiAkKERFU1RESVIpJChsaWJkaXIpLy5saWJnY3J5cHQuc28uMTEuNS4wLmhtYWMKKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L3NyYy9NYWtlZmlsZS5pbiBiL2xpYmdjcnlwdC0xLjQuNi9zcmMvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYwOTMyMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9zcmMvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSw5MjIgQEAKKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTAuMiBmcm9tIE1ha2VmaWxlLmFtLgorIyBAY29uZmlndXJlX2lucHV0QAorCisjIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKKyMgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCitAU0VUX01BS0VACisKKyMgTWFrZWZpbGUuYW0gLSBmb3IgZ2NyeXB0L3NyYworIyBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsCisjICAgICAgICAgICAgICAgMjAwNiwgMjAwNyAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyMKKyMgTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisKKworCisKKworVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK2FtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKK2luc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0CitpbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCitpbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX3RyaXBsZXQgPSBAYnVpbGRACitob3N0X3RyaXBsZXQgPSBAaG9zdEAKK2Jpbl9QUk9HUkFNUyA9IGR1bXBzZXhwJChFWEVFWFQpIGhtYWMyNTYkKEVYRUVYVCkgJChhbV9fRVhFRVhUXzEpCitAVVNFX1JBTkRPTV9EQUVNT05fVFJVRUBzYmluX1BST0dSQU1TID0gZ2NyeXB0cm5kJChFWEVFWFQpCitAVVNFX1JBTkRPTV9EQUVNT05fVFJVRUBhbV9fYXBwZW5kXzEgPSBnZXRyYW5kb20KK3N1YmRpciA9IHNyYworRElTVF9DT01NT04gPSAkKGluY2x1ZGVfSEVBREVSUykgJChzcmNkaXIpL01ha2VmaWxlLmFtIFwKKwkkKHNyY2RpcikvTWFrZWZpbGUuaW4gJChzcmNkaXIpL2djcnlwdC5oLmluIFwKKwkkKHNyY2RpcikvbGliZ2NyeXB0LWNvbmZpZy5pbiAkKHNyY2RpcikvdmVyc2lvbmluZm8ucmMuaW4gXAorCUNoYW5nZUxvZworQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAorYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvbTQvbGlidG9vbC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9ub2V4ZWNzdGFjay5tNCAkKHRvcF9zcmNkaXIpL200L29uY2Vvbmx5Lm00IFwKKwkkKHRvcF9zcmNkaXIpL200L3NvY2tsZW4ubTQgJCh0b3Bfc3JjZGlyKS9tNC9zeXNfc29ja2V0X2gubTQgXAorCSQodG9wX3NyY2RpcikvYWNpbmNsdWRlLm00ICQodG9wX3NyY2RpcikvY29uZmlndXJlLmFjCithbV9fY29uZmlndXJlX2RlcHMgPSAkKGFtX19hY2xvY2FsX200X2RlcHMpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykgXAorCSQoQUNMT0NBTF9NNCkKK21raW5zdGFsbGRpcnMgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMKK0NPTkZJR19IRUFERVIgPSAkKHRvcF9idWlsZGRpcikvY29uZmlnLmgKK0NPTkZJR19DTEVBTl9GSUxFUyA9IGdjcnlwdC5oIGxpYmdjcnlwdC1jb25maWcgdmVyc2lvbmluZm8ucmMKK2FtX192cGF0aF9hZGpfc2V0dXAgPSBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAnc3wufC58ZydgOworYW1fX3ZwYXRoX2FkaiA9IGNhc2UgJCRwIGluIFwKKyAgICAkKHNyY2RpcikvKikgZj1gZWNobyAiJCRwIiB8IHNlZCAic3xeJCRzcmNkaXJzdHJpcC98fCJgOzsgXAorICAgICopIGY9JCRwOzsgXAorICBlc2FjOworYW1fX3N0cmlwX2RpciA9IGBlY2hvICQkcCB8IHNlZCAtZSAnc3xeLiovfHwnYDsKK2FtX19pbnN0YWxsZGlycyA9ICIkKERFU1RESVIpJChsaWJkaXIpIiAiJChERVNURElSKSQoYmluZGlyKSIgXAorCSIkKERFU1RESVIpJChzYmluZGlyKSIgIiQoREVTVERJUikkKGJpbmRpcikiIFwKKwkiJChERVNURElSKSQobTRkYXRhZGlyKSIgIiQoREVTVERJUikkKGluY2x1ZGVkaXIpIgorbGliTFRMSUJSQVJJRVNfSU5TVEFMTCA9ICQoSU5TVEFMTCkKK0xUTElCUkFSSUVTID0gJChsaWJfTFRMSUJSQVJJRVMpCithbV9saWJnY3J5cHRfbGFfT0JKRUNUUyA9IGxpYmdjcnlwdF9sYS12aXNpYmlsaXR5LmxvIFwKKwlsaWJnY3J5cHRfbGEtbWlzYy5sbyBsaWJnY3J5cHRfbGEtZ2xvYmFsLmxvIFwKKwlsaWJnY3J5cHRfbGEtc2V4cC5sbyBsaWJnY3J5cHRfbGEtaHdmZWF0dXJlcy5sbyBcCisJbGliZ2NyeXB0X2xhLXN0ZG1lbS5sbyBsaWJnY3J5cHRfbGEtc2VjbWVtLmxvIFwKKwlsaWJnY3J5cHRfbGEtbWlzc2luZy1zdHJpbmcubG8gbGliZ2NyeXB0X2xhLW1vZHVsZS5sbyBcCisJbGliZ2NyeXB0X2xhLWZpcHMubG8gbGliZ2NyeXB0X2xhLWhtYWMyNTYubG8gXAorCWxpYmdjcnlwdF9sYS1hdGgubG8KK2xpYmdjcnlwdF9sYV9PQkpFQ1RTID0gJChhbV9saWJnY3J5cHRfbGFfT0JKRUNUUykKK2xpYmdjcnlwdF9sYV9MSU5LID0gJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgXAorCSQoTElCVE9PTEZMQUdTKSAtLW1vZGU9bGluayAkKENDTEQpICQobGliZ2NyeXB0X2xhX0NGTEFHUykgXAorCSQoQ0ZMQUdTKSAkKGxpYmdjcnlwdF9sYV9MREZMQUdTKSAkKExERkxBR1MpIC1vICRACitAVVNFX1JBTkRPTV9EQUVNT05fVFJVRUBhbV9fRVhFRVhUXzEgPSBnZXRyYW5kb20kKEVYRUVYVCkKK2JpblBST0dSQU1TX0lOU1RBTEwgPSAkKElOU1RBTExfUFJPR1JBTSkKK3NiaW5QUk9HUkFNU19JTlNUQUxMID0gJChJTlNUQUxMX1BST0dSQU0pCitQUk9HUkFNUyA9ICQoYmluX1BST0dSQU1TKSAkKHNiaW5fUFJPR1JBTVMpCithbV9kdW1wc2V4cF9PQkpFQ1RTID0gZHVtcHNleHAuJChPQkpFWFQpCitkdW1wc2V4cF9PQkpFQ1RTID0gJChhbV9kdW1wc2V4cF9PQkpFQ1RTKQorZHVtcHNleHBfREVQRU5ERU5DSUVTID0KK2FtX19nY3J5cHRybmRfU09VUkNFU19ESVNUID0gZ2NyeXB0cm5kLmMKK0BVU0VfUkFORE9NX0RBRU1PTl9UUlVFQGFtX2djcnlwdHJuZF9PQkpFQ1RTID0gIFwKK0BVU0VfUkFORE9NX0RBRU1PTl9UUlVFQAlnY3J5cHRybmQtZ2NyeXB0cm5kLiQoT0JKRVhUKQorZ2NyeXB0cm5kX09CSkVDVFMgPSAkKGFtX2djcnlwdHJuZF9PQkpFQ1RTKQorYW1fX0RFUEVOREVOQ0lFU18xID0KK0BVU0VfUkFORE9NX0RBRU1PTl9UUlVFQGdjcnlwdHJuZF9ERVBFTkRFTkNJRVMgPSBsaWJnY3J5cHQubGEgXAorQFVTRV9SQU5ET01fREFFTU9OX1RSVUVACSQoYW1fX0RFUEVOREVOQ0lFU18xKQorZ2NyeXB0cm5kX0xJTksgPSAkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSBcCisJJChMSUJUT09MRkxBR1MpIC0tbW9kZT1saW5rICQoQ0NMRCkgJChnY3J5cHRybmRfQ0ZMQUdTKSBcCisJJChDRkxBR1MpICQoQU1fTERGTEFHUykgJChMREZMQUdTKSAtbyAkQAorYW1fX2dldHJhbmRvbV9TT1VSQ0VTX0RJU1QgPSBnZXRyYW5kb20uYworQFVTRV9SQU5ET01fREFFTU9OX1RSVUVAYW1fZ2V0cmFuZG9tX09CSkVDVFMgPSBnZXRyYW5kb20uJChPQkpFWFQpCitnZXRyYW5kb21fT0JKRUNUUyA9ICQoYW1fZ2V0cmFuZG9tX09CSkVDVFMpCitnZXRyYW5kb21fTERBREQgPSAkKExEQUREKQorYW1faG1hYzI1Nl9PQkpFQ1RTID0gaG1hYzI1Ni1obWFjMjU2LiQoT0JKRVhUKQoraG1hYzI1Nl9PQkpFQ1RTID0gJChhbV9obWFjMjU2X09CSkVDVFMpCitobWFjMjU2X0RFUEVOREVOQ0lFUyA9CitobWFjMjU2X0xJTksgPSAkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgXAorCS0tbW9kZT1saW5rICQoQ0NMRCkgJChobWFjMjU2X0NGTEFHUykgJChDRkxBR1MpICQoQU1fTERGTEFHUykgXAorCSQoTERGTEFHUykgLW8gJEAKK2JpblNDUklQVF9JTlNUQUxMID0gJChJTlNUQUxMX1NDUklQVCkKK1NDUklQVFMgPSAkKGJpbl9TQ1JJUFRTKQorREVGQVVMVF9JTkNMVURFUyA9IC1JLkBhbV9faXNyY0AgLUkkKHRvcF9idWlsZGRpcikKK2RlcGNvbXAgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL2RlcGNvbXAKK2FtX19kZXBmaWxlc19tYXliZSA9IGRlcGZpbGVzCitDT01QSUxFID0gJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpIFwKKwkkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCitMVENPTVBJTEUgPSAkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgXAorCS0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSBcCisJJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQorQ0NMRCA9ICQoQ0MpCitMSU5LID0gJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIFwKKwktLW1vZGU9bGluayAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgJChBTV9MREZMQUdTKSBcCisJJChMREZMQUdTKSAtbyAkQAorU09VUkNFUyA9ICQobGliZ2NyeXB0X2xhX1NPVVJDRVMpICQoZHVtcHNleHBfU09VUkNFUykgXAorCSQoZ2NyeXB0cm5kX1NPVVJDRVMpICQoZ2V0cmFuZG9tX1NPVVJDRVMpICQoaG1hYzI1Nl9TT1VSQ0VTKQorRElTVF9TT1VSQ0VTID0gJChsaWJnY3J5cHRfbGFfU09VUkNFUykgJChkdW1wc2V4cF9TT1VSQ0VTKSBcCisJJChhbV9fZ2NyeXB0cm5kX1NPVVJDRVNfRElTVCkgJChhbV9fZ2V0cmFuZG9tX1NPVVJDRVNfRElTVCkgXAorCSQoaG1hYzI1Nl9TT1VSQ0VTKQorbTRkYXRhREFUQV9JTlNUQUxMID0gJChJTlNUQUxMX0RBVEEpCitEQVRBID0gJChtNGRhdGFfREFUQSkKK2luY2x1ZGVIRUFERVJTX0lOU1RBTEwgPSAkKElOU1RBTExfSEVBREVSKQorSEVBREVSUyA9ICQoaW5jbHVkZV9IRUFERVJTKQorRVRBR1MgPSBldGFncworQ1RBR1MgPSBjdGFncworRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FNVEFSID0gQEFNVEFSQAorQVIgPSBAQVJACitBUyA9IEBBU0AKK0FVVE9DT05GID0gQEFVVE9DT05GQAorQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAorQVVUT01BS0UgPSBAQVVUT01BS0VACitBV0sgPSBAQVdLQAorQlVJTERfRklMRVZFUlNJT04gPSBAQlVJTERfRklMRVZFUlNJT05ACitCVUlMRF9SRVZJU0lPTiA9IEBCVUlMRF9SRVZJU0lPTkAKK0JVSUxEX1RJTUVTVEFNUCA9IEBCVUlMRF9USU1FU1RBTVBACitDQyA9IEBDQ0AKK0NDQVMgPSBAQ0NBU0AKK0NDQVNERVBNT0RFID0gQENDQVNERVBNT0RFQAorQ0NBU0ZMQUdTID0gQENDQVNGTEFHU0AKK0NDREVQTU9ERSA9IEBDQ0RFUE1PREVACitDRkxBR1MgPSBAQ0ZMQUdTQAorQ1BQID0gQENQUEAKK0NQUEZMQUdTID0gQENQUEZMQUdTQAorQ1hYID0gQENYWEAKK0NYWENQUCA9IEBDWFhDUFBACitDWFhERVBNT0RFID0gQENYWERFUE1PREVACitDWFhGTEFHUyA9IEBDWFhGTEFHU0AKK0NZR1BBVEhfVyA9IEBDWUdQQVRIX1dACitERUZTID0gQERFRlNACitERVBESVIgPSBAREVQRElSQAorRExMVE9PTCA9IEBETExUT09MQAorRExfTElCUyA9IEBETF9MSUJTQAorRUNITyA9IEBFQ0hPQAorRUNIT19DID0gQEVDSE9fQ0AKK0VDSE9fTiA9IEBFQ0hPX05ACitFQ0hPX1QgPSBARUNIT19UQAorRUdSRVAgPSBARUdSRVBACitFWEVFWFQgPSBARVhFRVhUQAorRjc3ID0gQEY3N0AKK0ZBTExCQUNLX1NPQ0tMRU5fVCA9IEBGQUxMQkFDS19TT0NLTEVOX1RACitGRkxBR1MgPSBARkZMQUdTQAorR0NSWVBUX0NJUEhFUlMgPSBAR0NSWVBUX0NJUEhFUlNACitHQ1JZUFRfRElHRVNUUyA9IEBHQ1JZUFRfRElHRVNUU0AKK0dDUllQVF9QVUJLRVlfQ0lQSEVSUyA9IEBHQ1JZUFRfUFVCS0VZX0NJUEhFUlNACitHQ1JZUFRfUkFORE9NID0gQEdDUllQVF9SQU5ET01ACitHUEdfRVJST1JfQ0ZMQUdTID0gQEdQR19FUlJPUl9DRkxBR1NACitHUEdfRVJST1JfQ09ORklHID0gQEdQR19FUlJPUl9DT05GSUdACitHUEdfRVJST1JfTElCUyA9IEBHUEdfRVJST1JfTElCU0AKK0dSRVAgPSBAR1JFUEAKK0lOU1RBTEwgPSBASU5TVEFMTEAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitJTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAorSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACitJTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAorTERGTEFHUyA9IEBMREZMQUdTQAorTElCR0NSWVBUX0NJUEhFUlMgPSBATElCR0NSWVBUX0NJUEhFUlNACitMSUJHQ1JZUFRfQ09ORklHX0FQSV9WRVJTSU9OID0gQExJQkdDUllQVF9DT05GSUdfQVBJX1ZFUlNJT05ACitMSUJHQ1JZUFRfQ09ORklHX0NGTEFHUyA9IEBMSUJHQ1JZUFRfQ09ORklHX0NGTEFHU0AKK0xJQkdDUllQVF9DT05GSUdfTElCUyA9IEBMSUJHQ1JZUFRfQ09ORklHX0xJQlNACitMSUJHQ1JZUFRfRElHRVNUUyA9IEBMSUJHQ1JZUFRfRElHRVNUU0AKK0xJQkdDUllQVF9MVF9BR0UgPSBATElCR0NSWVBUX0xUX0FHRUAKK0xJQkdDUllQVF9MVF9DVVJSRU5UID0gQExJQkdDUllQVF9MVF9DVVJSRU5UQAorTElCR0NSWVBUX0xUX1JFVklTSU9OID0gQExJQkdDUllQVF9MVF9SRVZJU0lPTkAKK0xJQkdDUllQVF9QVUJLRVlfQ0lQSEVSUyA9IEBMSUJHQ1JZUFRfUFVCS0VZX0NJUEhFUlNACitMSUJHQ1JZUFRfVEhSRUFEX01PRFVMRVMgPSBATElCR0NSWVBUX1RIUkVBRF9NT0RVTEVTQAorTElCT0JKUyA9IEBMSUJPQkpTQAorTElCUyA9IEBMSUJTQAorTElCVE9PTCA9IEBMSUJUT09MQAorTE5fUyA9IEBMTl9TQAorTFRMSUJPQkpTID0gQExUTElCT0JKU0AKK01BSU5UID0gQE1BSU5UQAorTUFLRUlORk8gPSBATUFLRUlORk9ACitNS0RJUl9QID0gQE1LRElSX1BACitNUElfU0ZMQUdTID0gQE1QSV9TRkxBR1NACitOT0VYRUNTVEFDS19GTEFHUyA9IEBOT0VYRUNTVEFDS19GTEFHU0AKK09CSkRVTVAgPSBAT0JKRFVNUEAKK09CSkVYVCA9IEBPQkpFWFRACitQQUNLQUdFID0gQFBBQ0tBR0VACitQQUNLQUdFX0JVR1JFUE9SVCA9IEBQQUNLQUdFX0JVR1JFUE9SVEAKK1BBQ0tBR0VfTkFNRSA9IEBQQUNLQUdFX05BTUVACitQQUNLQUdFX1NUUklORyA9IEBQQUNLQUdFX1NUUklOR0AKK1BBQ0tBR0VfVEFSTkFNRSA9IEBQQUNLQUdFX1RBUk5BTUVACitQQUNLQUdFX1VSTCA9IEBQQUNLQUdFX1VSTEAKK1BBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACitQQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKK1BUSF9DRkxBR1MgPSBAUFRIX0NGTEFHU0AKK1BUSF9DT05GSUcgPSBAUFRIX0NPTkZJR0AKK1BUSF9MSUJTID0gQFBUSF9MSUJTQAorUkFOTElCID0gQFJBTkxJQkAKK1JDID0gQFJDQAorU0VUX01BS0UgPSBAU0VUX01BS0VACitTSEVMTCA9IEBTSEVMTEAKK1NUUklQID0gQFNUUklQQAorU1lTX1NPQ0tFVF9IID0gQFNZU19TT0NLRVRfSEAKK1ZFUlNJT04gPSBAVkVSU0lPTkAKK2Fic19idWlsZGRpciA9IEBhYnNfYnVpbGRkaXJACithYnNfc3JjZGlyID0gQGFic19zcmNkaXJACithYnNfdG9wX2J1aWxkZGlyID0gQGFic190b3BfYnVpbGRkaXJACithYnNfdG9wX3NyY2RpciA9IEBhYnNfdG9wX3NyY2RpckAKK2FjX2N0X0NDID0gQGFjX2N0X0NDQAorYWNfY3RfQ1hYID0gQGFjX2N0X0NYWEAKK2FjX2N0X0Y3NyA9IEBhY19jdF9GNzdACithbV9faW5jbHVkZSA9IEBhbV9faW5jbHVkZUAKK2FtX19sZWFkaW5nX2RvdCA9IEBhbV9fbGVhZGluZ19kb3RACithbV9fcXVvdGUgPSBAYW1fX3F1b3RlQAorYW1fX3RhciA9IEBhbV9fdGFyQAorYW1fX3VudGFyID0gQGFtX191bnRhckAKK2JpbmRpciA9IEBiaW5kaXJACitidWlsZCA9IEBidWlsZEAKK2J1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAorYnVpbGRfY3B1ID0gQGJ1aWxkX2NwdUAKK2J1aWxkX29zID0gQGJ1aWxkX29zQAorYnVpbGRfdmVuZG9yID0gQGJ1aWxkX3ZlbmRvckAKK2J1aWxkZGlyID0gQGJ1aWxkZGlyQAorZGF0YWRpciA9IEBkYXRhZGlyQAorZGF0YXJvb3RkaXIgPSBAZGF0YXJvb3RkaXJACitkb2NkaXIgPSBAZG9jZGlyQAorZHZpZGlyID0gQGR2aWRpckAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAoraG9zdCA9IEBob3N0QAoraG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAoraG9zdF9jcHUgPSBAaG9zdF9jcHVACitob3N0X29zID0gQGhvc3Rfb3NACitob3N0X3ZlbmRvciA9IEBob3N0X3ZlbmRvckAKK2h0bWxkaXIgPSBAaHRtbGRpckAKK2luY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKK2luZm9kaXIgPSBAaW5mb2RpckAKK2luc3RhbGxfc2ggPSBAaW5zdGFsbF9zaEAKK2xpYmRpciA9IEBsaWJkaXJACitsaWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACitsb2NhbGVkaXIgPSBAbG9jYWxlZGlyQAorbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAorbWFuZGlyID0gQG1hbmRpckAKK21rZGlyX3AgPSBAbWtkaXJfcEAKK29sZGluY2x1ZGVkaXIgPSBAb2xkaW5jbHVkZWRpckAKK3BkZmRpciA9IEBwZGZkaXJACitwcmVmaXggPSBAcHJlZml4QAorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAorcHNkaXIgPSBAcHNkaXJACitzYmluZGlyID0gQHNiaW5kaXJACitzaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKK3NyY2RpciA9IEBzcmNkaXJACitzeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAordG9wX2J1aWxkX3ByZWZpeCA9IEB0b3BfYnVpbGRfcHJlZml4QAordG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK0VYVFJBX0RJU1QgPSBNYW5pZmVzdCBsaWJnY3J5cHQtY29uZmlnLmluIGxpYmdjcnlwdC5tNCBsaWJnY3J5cHQudmVycyBcCisgICAgICAgICAgICAgZ2NyeXB0LmguaW4gbGliZ2NyeXB0LmRlZgorCitiaW5fU0NSSVBUUyA9IGxpYmdjcnlwdC1jb25maWcKK200ZGF0YWRpciA9ICQoZGF0YWRpcikvYWNsb2NhbAorbTRkYXRhX0RBVEEgPSBsaWJnY3J5cHQubTQKK2luY2x1ZGVfSEVBREVSUyA9IGdjcnlwdC5oIGdjcnlwdC1tb2R1bGUuaAorbGliX0xUTElCUkFSSUVTID0gbGliZ2NyeXB0LmxhCitASEFWRV9MRF9WRVJTSU9OX1NDUklQVF9GQUxTRUBsaWJnY3J5cHRfdmVyc2lvbl9zY3JpcHRfY21kID0gCitASEFWRV9MRF9WRVJTSU9OX1NDUklQVF9UUlVFQGxpYmdjcnlwdF92ZXJzaW9uX3NjcmlwdF9jbWQgPSAtV2wsLS12ZXJzaW9uLXNjcmlwdD0kKHNyY2RpcikvbGliZ2NyeXB0LnZlcnMKK2xpYmdjcnlwdF9sYV9DRkxBR1MgPSBAR1BHX0VSUk9SX0NGTEFHU0AKK2xpYmdjcnlwdF9sYV9TT1VSQ0VTID0gZzEwbGliLmggdmlzaWJpbGl0eS5jIHZpc2liaWxpdHkuaCB0eXBlcy5oIFwKKwljaXBoZXIuaCBjaXBoZXItcHJvdG8uaCBcCisJbWlzYy5jIGdsb2JhbC5jIHNleHAuYyBod2ZlYXR1cmVzLmMgXAorCXN0ZG1lbS5jIHN0ZG1lbS5oIHNlY21lbS5jIHNlY21lbS5oIFwKKwltcGkuaCBtaXNzaW5nLXN0cmluZy5jIG1vZHVsZS5jIGZpcHMuYyBcCisJaG1hYzI1Ni5jIGhtYWMyNTYuaCBcCisJYXRoLmggYXRoLmMKKworQEhBVkVfVzMyX1NZU1RFTV9UUlVFQExUUkNDT01QSUxFID0gJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKFJDKSBcCitASEFWRV9XMzJfU1lTVEVNX1RSVUVAICAgICBgZWNobyAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgfCBcCitASEFWRV9XMzJfU1lTVEVNX1RSVUVAICAgICBzZWQgLWUgJ3MvLUkvLS1pbmNsdWRlLWRpciAvZztzLy1ELy0tZGVmaW5lIC9nJ2AKKworQEhBVkVfVzMyX1NZU1RFTV9GQUxTRUBnY3J5cHRfcmVzID0gCitASEFWRV9XMzJfU1lTVEVNX1RSVUVAZ2NyeXB0X3JlcyA9IHZlcnNpb25pbmZvLmxvCitASEFWRV9XMzJfU1lTVEVNX0ZBTFNFQGdjcnlwdF9yZXNfbGRmbGFnID0gCitASEFWRV9XMzJfU1lTVEVNX1RSVUVAZ2NyeXB0X3Jlc19sZGZsYWcgPSAtV2wsLmxpYnMvdmVyc2lvbmluZm8ubworQEhBVkVfVzMyX1NZU1RFTV9GQUxTRUBub191bmRlZmluZWQgPSAKK0BIQVZFX1czMl9TWVNURU1fVFJVRUBub191bmRlZmluZWQgPSAtbm8tdW5kZWZpbmVkCitASEFWRV9XMzJfU1lTVEVNX0ZBTFNFQGV4cG9ydF9zeW1ib2xzID0gCitASEFWRV9XMzJfU1lTVEVNX1RSVUVAZXhwb3J0X3N5bWJvbHMgPSAtZXhwb3J0LXN5bWJvbHMgJChzcmNkaXIpL2xpYmdjcnlwdC5kZWYKK0BIQVZFX1czMl9TWVNURU1fRkFMU0VAZ2NyeXB0X2RlcHMgPSAKK0BIQVZFX1czMl9TWVNURU1fVFJVRUBnY3J5cHRfZGVwcyA9ICQoZ2NyeXB0X3JlcykgbGliZ2NyeXB0LmRlZgorbGliZ2NyeXB0X2xhX0xERkxBR1MgPSAkKGdjcnlwdF9yZXNfbGRmbGFnKSAkKG5vX3VuZGVmaW5lZCkgJChleHBvcnRfc3ltYm9scykgXAorCSQobGliZ2NyeXB0X3ZlcnNpb25fc2NyaXB0X2NtZCkgLXZlcnNpb24taW5mbyBcCisJQExJQkdDUllQVF9MVF9DVVJSRU5UQDpATElCR0NSWVBUX0xUX1JFVklTSU9OQDpATElCR0NSWVBUX0xUX0FHRUAKKworbGliZ2NyeXB0X2xhX0RFUEVOREVOQ0lFUyA9IFwKKwkuLi9jaXBoZXIvbGliY2lwaGVyLmxhIFwKKwkuLi9yYW5kb20vbGlicmFuZG9tLmxhIFwKKwkuLi9tcGkvbGlibXBpLmxhIFwKKwkkKHNyY2RpcikvbGliZ2NyeXB0LnZlcnMgJChnY3J5cHRfZGVwcykKKworbGliZ2NyeXB0X2xhX0xJQkFERCA9IFwKKwkuLi9jaXBoZXIvbGliY2lwaGVyLmxhIFwKKwkuLi9yYW5kb20vbGlicmFuZG9tLmxhIFwKKwkuLi9tcGkvbGlibXBpLmxhIFwKKwlATFRMSUJPQkpTQCBAR1BHX0VSUk9SX0xJQlNACisKK2R1bXBzZXhwX1NPVVJDRVMgPSBkdW1wc2V4cC5jCitkdW1wc2V4cF9MREFERCA9IAoraG1hYzI1Nl9TT1VSQ0VTID0gaG1hYzI1Ni5jCitobWFjMjU2X0NGTEFHUyA9IC1EU1RBTkRBTE9ORQoraG1hYzI1Nl9MREFERCA9IAorQFVTRV9SQU5ET01fREFFTU9OX1RSVUVAZ2NyeXB0cm5kX1NPVVJDRVMgPSBnY3J5cHRybmQuYworQFVTRV9SQU5ET01fREFFTU9OX1RSVUVAZ2NyeXB0cm5kX0NGTEFHUyA9ICQoR1BHX0VSUk9SX0NGTEFHUykgJChQVEhfQ0ZMQUdTKQorQFVTRV9SQU5ET01fREFFTU9OX1RSVUVAZ2NyeXB0cm5kX0xEQUREID0gbGliZ2NyeXB0LmxhICQoUFRIX0xJQlMpCitAVVNFX1JBTkRPTV9EQUVNT05fVFJVRUBnZXRyYW5kb21fU09VUkNFUyA9IGdldHJhbmRvbS5jCithbGw6IGFsbC1hbQorCisuU1VGRklYRVM6CisuU1VGRklYRVM6IC5jIC5sbyAubyAub2JqIC5yYworJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJQGZvciBkZXAgaW4gJD87IGRvIFwKKwkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAorCSAgICAqJCRkZXAqKSBcCisJICAgICAgKCBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2ggKSBcCisJICAgICAgICAmJiB7IGlmIHRlc3QgLWYgJEA7IHRoZW4gZXhpdCAwOyBlbHNlIGJyZWFrOyBmaTsgfTsgXAorCSAgICAgIGV4aXQgMTs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUgIHNyYy9NYWtlZmlsZSc7IFwKKwljZCAkKHRvcF9zcmNkaXIpICYmIFwKKwkgICQoQVVUT01BS0UpIC0tZ251ICBzcmMvTWFrZWZpbGUKKy5QUkVDSU9VUzogTWFrZWZpbGUKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwlAY2FzZSAnJD8nIGluIFwKKwkgICpjb25maWcuc3RhdHVzKikgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2g7OyBcCisJICAqKSBcCisJICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSknOyBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKKwllc2FjOworCiskKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKworJCh0b3Bfc3JjZGlyKS9jb25maWd1cmU6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCiskKEFDTE9DQUxfTTQpOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKK2djcnlwdC5oOiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cyAkKHNyY2RpcikvZ2NyeXB0LmguaW4KKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQAorbGliZ2NyeXB0LWNvbmZpZzogJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMgJChzcmNkaXIpL2xpYmdjcnlwdC1jb25maWcuaW4KKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQAordmVyc2lvbmluZm8ucmM6ICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzICQoc3JjZGlyKS92ZXJzaW9uaW5mby5yYy5pbgorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRACitpbnN0YWxsLWxpYkxUTElCUkFSSUVTOiAkKGxpYl9MVExJQlJBUklFUykKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwl0ZXN0IC16ICIkKGxpYmRpcikiIHx8ICQoTUtESVJfUCkgIiQoREVTVERJUikkKGxpYmRpcikiCisJQGxpc3Q9JyQobGliX0xUTElCUkFSSUVTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gXAorCSAgICBmPSQoYW1fX3N0cmlwX2RpcikgXAorCSAgICBlY2hvICIgJChMSUJUT09MKSAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1pbnN0YWxsICQobGliTFRMSUJSQVJJRVNfSU5TVEFMTCkgJChJTlNUQUxMX1NUUklQX0ZMQUcpICckJHAnICckKERFU1RESVIpJChsaWJkaXIpLyQkZiciOyBcCisJICAgICQoTElCVE9PTCkgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9aW5zdGFsbCAkKGxpYkxUTElCUkFSSUVTX0lOU1RBTEwpICQoSU5TVEFMTF9TVFJJUF9GTEFHKSAiJCRwIiAiJChERVNURElSKSQobGliZGlyKS8kJGYiOyBcCisJICBlbHNlIDo7IGZpOyBcCisJZG9uZQorCit1bmluc3RhbGwtbGliTFRMSUJSQVJJRVM6CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlAbGlzdD0nJChsaWJfTFRMSUJSQVJJRVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICBwPSQoYW1fX3N0cmlwX2RpcikgXAorCSAgZWNobyAiICQoTElCVE9PTCkgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9dW5pbnN0YWxsIHJtIC1mICckKERFU1RESVIpJChsaWJkaXIpLyQkcCciOyBcCisJICAkKExJQlRPT0wpICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPXVuaW5zdGFsbCBybSAtZiAiJChERVNURElSKSQobGliZGlyKS8kJHAiOyBcCisJZG9uZQorCitjbGVhbi1saWJMVExJQlJBUklFUzoKKwktdGVzdCAteiAiJChsaWJfTFRMSUJSQVJJRVMpIiB8fCBybSAtZiAkKGxpYl9MVExJQlJBUklFUykKKwlAbGlzdD0nJChsaWJfTFRMSUJSQVJJRVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICBkaXI9ImBlY2hvICQkcCB8IHNlZCAtZSAnc3wvW14vXSokJHx8J2AiOyBcCisJICB0ZXN0ICIkJGRpciIgIT0gIiQkcCIgfHwgZGlyPS47IFwKKwkgIGVjaG8gInJtIC1mIFwiJCR7ZGlyfS9zb19sb2NhdGlvbnNcIiI7IFwKKwkgIHJtIC1mICIkJHtkaXJ9L3NvX2xvY2F0aW9ucyI7IFwKKwlkb25lCitsaWJnY3J5cHQubGE6ICQobGliZ2NyeXB0X2xhX09CSkVDVFMpICQobGliZ2NyeXB0X2xhX0RFUEVOREVOQ0lFUykgCisJJChsaWJnY3J5cHRfbGFfTElOSykgLXJwYXRoICQobGliZGlyKSAkKGxpYmdjcnlwdF9sYV9PQkpFQ1RTKSAkKGxpYmdjcnlwdF9sYV9MSUJBREQpICQoTElCUykKK2luc3RhbGwtYmluUFJPR1JBTVM6ICQoYmluX1BST0dSQU1TKQorCUAkKE5PUk1BTF9JTlNUQUxMKQorCXRlc3QgLXogIiQoYmluZGlyKSIgfHwgJChNS0RJUl9QKSAiJChERVNURElSKSQoYmluZGlyKSIKKwlAbGlzdD0nJChiaW5fUFJPR1JBTVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICBwMT1gZWNobyAkJHB8c2VkICdzLyQoRVhFRVhUKSQkLy8nYDsgXAorCSAgaWYgdGVzdCAtZiAkJHAgXAorCSAgICAgfHwgdGVzdCAtZiAkJHAxIFwKKwkgIDsgdGhlbiBcCisJICAgIGY9YGVjaG8gIiQkcDEiIHwgc2VkICdzLF4uKi8sLDskKHRyYW5zZm9ybSk7cy8kJC8kKEVYRUVYVCkvJ2A7IFwKKwkgICBlY2hvICIgJChJTlNUQUxMX1BST0dSQU1fRU5WKSAkKExJQlRPT0wpICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWluc3RhbGwgJChiaW5QUk9HUkFNU19JTlNUQUxMKSAnJCRwJyAnJChERVNURElSKSQoYmluZGlyKS8kJGYnIjsgXAorCSAgICQoSU5TVEFMTF9QUk9HUkFNX0VOVikgJChMSUJUT09MKSAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1pbnN0YWxsICQoYmluUFJPR1JBTVNfSU5TVEFMTCkgIiQkcCIgIiQoREVTVERJUikkKGJpbmRpcikvJCRmIiB8fCBleGl0IDE7IFwKKwkgIGVsc2UgOjsgZmk7IFwKKwlkb25lCisKK3VuaW5zdGFsbC1iaW5QUk9HUkFNUzoKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCUBsaXN0PSckKGJpbl9QUk9HUkFNUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGY9YGVjaG8gIiQkcCIgfCBzZWQgJ3MsXi4qLywsO3MvJChFWEVFWFQpJCQvLzskKHRyYW5zZm9ybSk7cy8kJC8kKEVYRUVYVCkvJ2A7IFwKKwkgIGVjaG8gIiBybSAtZiAnJChERVNURElSKSQoYmluZGlyKS8kJGYnIjsgXAorCSAgcm0gLWYgIiQoREVTVERJUikkKGJpbmRpcikvJCRmIjsgXAorCWRvbmUKKworY2xlYW4tYmluUFJPR1JBTVM6CisJQGxpc3Q9JyQoYmluX1BST0dSQU1TKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgZj1gZWNobyAkJHB8c2VkICdzLyQoRVhFRVhUKSQkLy8nYDsgXAorCSAgZWNobyAiIHJtIC1mICQkcCAkJGYiOyBcCisJICBybSAtZiAkJHAgJCRmIDsgXAorCWRvbmUKK2luc3RhbGwtc2JpblBST0dSQU1TOiAkKHNiaW5fUFJPR1JBTVMpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJdGVzdCAteiAiJChzYmluZGlyKSIgfHwgJChNS0RJUl9QKSAiJChERVNURElSKSQoc2JpbmRpcikiCisJQGxpc3Q9JyQoc2Jpbl9QUk9HUkFNUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIHAxPWBlY2hvICQkcHxzZWQgJ3MvJChFWEVFWFQpJCQvLydgOyBcCisJICBpZiB0ZXN0IC1mICQkcCBcCisJICAgICB8fCB0ZXN0IC1mICQkcDEgXAorCSAgOyB0aGVuIFwKKwkgICAgZj1gZWNobyAiJCRwMSIgfCBzZWQgJ3MsXi4qLywsOyQodHJhbnNmb3JtKTtzLyQkLyQoRVhFRVhUKS8nYDsgXAorCSAgIGVjaG8gIiAkKElOU1RBTExfUFJPR1JBTV9FTlYpICQoTElCVE9PTCkgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9aW5zdGFsbCAkKHNiaW5QUk9HUkFNU19JTlNUQUxMKSAnJCRwJyAnJChERVNURElSKSQoc2JpbmRpcikvJCRmJyI7IFwKKwkgICAkKElOU1RBTExfUFJPR1JBTV9FTlYpICQoTElCVE9PTCkgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9aW5zdGFsbCAkKHNiaW5QUk9HUkFNU19JTlNUQUxMKSAiJCRwIiAiJChERVNURElSKSQoc2JpbmRpcikvJCRmIiB8fCBleGl0IDE7IFwKKwkgIGVsc2UgOjsgZmk7IFwKKwlkb25lCisKK3VuaW5zdGFsbC1zYmluUFJPR1JBTVM6CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlAbGlzdD0nJChzYmluX1BST0dSQU1TKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgZj1gZWNobyAiJCRwIiB8IHNlZCAncyxeLiovLCw7cy8kKEVYRUVYVCkkJC8vOyQodHJhbnNmb3JtKTtzLyQkLyQoRVhFRVhUKS8nYDsgXAorCSAgZWNobyAiIHJtIC1mICckKERFU1RESVIpJChzYmluZGlyKS8kJGYnIjsgXAorCSAgcm0gLWYgIiQoREVTVERJUikkKHNiaW5kaXIpLyQkZiI7IFwKKwlkb25lCisKK2NsZWFuLXNiaW5QUk9HUkFNUzoKKwlAbGlzdD0nJChzYmluX1BST0dSQU1TKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgZj1gZWNobyAkJHB8c2VkICdzLyQoRVhFRVhUKSQkLy8nYDsgXAorCSAgZWNobyAiIHJtIC1mICQkcCAkJGYiOyBcCisJICBybSAtZiAkJHAgJCRmIDsgXAorCWRvbmUKK2R1bXBzZXhwJChFWEVFWFQpOiAkKGR1bXBzZXhwX09CSkVDVFMpICQoZHVtcHNleHBfREVQRU5ERU5DSUVTKSAKKwlAcm0gLWYgZHVtcHNleHAkKEVYRUVYVCkKKwkkKExJTkspICQoZHVtcHNleHBfT0JKRUNUUykgJChkdW1wc2V4cF9MREFERCkgJChMSUJTKQorZ2NyeXB0cm5kJChFWEVFWFQpOiAkKGdjcnlwdHJuZF9PQkpFQ1RTKSAkKGdjcnlwdHJuZF9ERVBFTkRFTkNJRVMpIAorCUBybSAtZiBnY3J5cHRybmQkKEVYRUVYVCkKKwkkKGdjcnlwdHJuZF9MSU5LKSAkKGdjcnlwdHJuZF9PQkpFQ1RTKSAkKGdjcnlwdHJuZF9MREFERCkgJChMSUJTKQorZ2V0cmFuZG9tJChFWEVFWFQpOiAkKGdldHJhbmRvbV9PQkpFQ1RTKSAkKGdldHJhbmRvbV9ERVBFTkRFTkNJRVMpIAorCUBybSAtZiBnZXRyYW5kb20kKEVYRUVYVCkKKwkkKExJTkspICQoZ2V0cmFuZG9tX09CSkVDVFMpICQoZ2V0cmFuZG9tX0xEQUREKSAkKExJQlMpCitobWFjMjU2JChFWEVFWFQpOiAkKGhtYWMyNTZfT0JKRUNUUykgJChobWFjMjU2X0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIGhtYWMyNTYkKEVYRUVYVCkKKwkkKGhtYWMyNTZfTElOSykgJChobWFjMjU2X09CSkVDVFMpICQoaG1hYzI1Nl9MREFERCkgJChMSUJTKQoraW5zdGFsbC1iaW5TQ1JJUFRTOiAkKGJpbl9TQ1JJUFRTKQorCUAkKE5PUk1BTF9JTlNUQUxMKQorCXRlc3QgLXogIiQoYmluZGlyKSIgfHwgJChNS0RJUl9QKSAiJChERVNURElSKSQoYmluZGlyKSIKKwlAbGlzdD0nJChiaW5fU0NSSVBUUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgLWYgIiQkcCI7IHRoZW4gZD07IGVsc2UgZD0iJChzcmNkaXIpLyI7IGZpOyBcCisJICBpZiB0ZXN0IC1mICQkZCQkcDsgdGhlbiBcCisJICAgIGY9YGVjaG8gIiQkcCIgfCBzZWQgJ3N8Xi4qL3x8OyQodHJhbnNmb3JtKSdgOyBcCisJICAgIGVjaG8gIiAkKGJpblNDUklQVF9JTlNUQUxMKSAnJCRkJCRwJyAnJChERVNURElSKSQoYmluZGlyKS8kJGYnIjsgXAorCSAgICAkKGJpblNDUklQVF9JTlNUQUxMKSAiJCRkJCRwIiAiJChERVNURElSKSQoYmluZGlyKS8kJGYiOyBcCisJICBlbHNlIDo7IGZpOyBcCisJZG9uZQorCit1bmluc3RhbGwtYmluU0NSSVBUUzoKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCUBsaXN0PSckKGJpbl9TQ1JJUFRTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgZj1gZWNobyAiJCRwIiB8IHNlZCAnc3xeLiovfHw7JCh0cmFuc2Zvcm0pJ2A7IFwKKwkgIGVjaG8gIiBybSAtZiAnJChERVNURElSKSQoYmluZGlyKS8kJGYnIjsgXAorCSAgcm0gLWYgIiQoREVTVERJUikkKGJpbmRpcikvJCRmIjsgXAorCWRvbmUKKworbW9zdGx5Y2xlYW4tY29tcGlsZToKKwktcm0gLWYgKi4kKE9CSkVYVCkKKworZGlzdGNsZWFuLWNvbXBpbGU6CisJLXJtIC1mICoudGFiLmMKKworQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2R1bXBzZXhwLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9nY3J5cHRybmQtZ2NyeXB0cm5kLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9nZXRyYW5kb20uUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2htYWMyNTYtaG1hYzI1Ni5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZ2NyeXB0X2xhLWF0aC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmdjcnlwdF9sYS1maXBzLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZ2NyeXB0X2xhLWdsb2JhbC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmdjcnlwdF9sYS1obWFjMjU2LlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZ2NyeXB0X2xhLWh3ZmVhdHVyZXMuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJnY3J5cHRfbGEtbWlzYy5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmdjcnlwdF9sYS1taXNzaW5nLXN0cmluZy5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmdjcnlwdF9sYS1tb2R1bGUuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJnY3J5cHRfbGEtc2VjbWVtLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZ2NyeXB0X2xhLXNleHAuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJnY3J5cHRfbGEtc3RkbWVtLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZ2NyeXB0X2xhLXZpc2liaWxpdHkuUGxvQGFtX19xdW90ZUAKKworLmMubzoKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgJDwKK0BhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDT01QSUxFKSAtYyAkPAorCisuYy5vYmo6CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAIGAkKENZR1BBVEhfVykgJyQ8J2AKK0BhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDT01QSUxFKSAtYyBgJChDWUdQQVRIX1cpICckPCdgCisKKy5jLmxvOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChMVENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMVENPTVBJTEUpIC1jIC1vICRAICQ8CisKK2xpYmdjcnlwdF9sYS12aXNpYmlsaXR5LmxvOiB2aXNpYmlsaXR5LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnY3J5cHRfbGFfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmdjcnlwdF9sYS12aXNpYmlsaXR5LmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJnY3J5cHRfbGEtdmlzaWJpbGl0eS5UcG8gLWMgLW8gbGliZ2NyeXB0X2xhLXZpc2liaWxpdHkubG8gYHRlc3QgLWYgJ3Zpc2liaWxpdHkuYycgfHwgZWNobyAnJChzcmNkaXIpLydgdmlzaWJpbGl0eS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvbGliZ2NyeXB0X2xhLXZpc2liaWxpdHkuVHBvICQoREVQRElSKS9saWJnY3J5cHRfbGEtdmlzaWJpbGl0eS5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3Zpc2liaWxpdHkuYycgb2JqZWN0PSdsaWJnY3J5cHRfbGEtdmlzaWJpbGl0eS5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnY3J5cHRfbGFfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZ2NyeXB0X2xhLXZpc2liaWxpdHkubG8gYHRlc3QgLWYgJ3Zpc2liaWxpdHkuYycgfHwgZWNobyAnJChzcmNkaXIpLydgdmlzaWJpbGl0eS5jCisKK2xpYmdjcnlwdF9sYS1taXNjLmxvOiBtaXNjLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnY3J5cHRfbGFfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmdjcnlwdF9sYS1taXNjLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJnY3J5cHRfbGEtbWlzYy5UcG8gLWMgLW8gbGliZ2NyeXB0X2xhLW1pc2MubG8gYHRlc3QgLWYgJ21pc2MuYycgfHwgZWNobyAnJChzcmNkaXIpLydgbWlzYy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvbGliZ2NyeXB0X2xhLW1pc2MuVHBvICQoREVQRElSKS9saWJnY3J5cHRfbGEtbWlzYy5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J21pc2MuYycgb2JqZWN0PSdsaWJnY3J5cHRfbGEtbWlzYy5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnY3J5cHRfbGFfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZ2NyeXB0X2xhLW1pc2MubG8gYHRlc3QgLWYgJ21pc2MuYycgfHwgZWNobyAnJChzcmNkaXIpLydgbWlzYy5jCisKK2xpYmdjcnlwdF9sYS1nbG9iYWwubG86IGdsb2JhbC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2NyeXB0X2xhX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJnY3J5cHRfbGEtZ2xvYmFsLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJnY3J5cHRfbGEtZ2xvYmFsLlRwbyAtYyAtbyBsaWJnY3J5cHRfbGEtZ2xvYmFsLmxvIGB0ZXN0IC1mICdnbG9iYWwuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ2xvYmFsLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS9saWJnY3J5cHRfbGEtZ2xvYmFsLlRwbyAkKERFUERJUikvbGliZ2NyeXB0X2xhLWdsb2JhbC5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2dsb2JhbC5jJyBvYmplY3Q9J2xpYmdjcnlwdF9sYS1nbG9iYWwubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2NyeXB0X2xhX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmdjcnlwdF9sYS1nbG9iYWwubG8gYHRlc3QgLWYgJ2dsb2JhbC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BnbG9iYWwuYworCitsaWJnY3J5cHRfbGEtc2V4cC5sbzogc2V4cC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2NyeXB0X2xhX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJnY3J5cHRfbGEtc2V4cC5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZ2NyeXB0X2xhLXNleHAuVHBvIC1jIC1vIGxpYmdjcnlwdF9sYS1zZXhwLmxvIGB0ZXN0IC1mICdzZXhwLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNleHAuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYmdjcnlwdF9sYS1zZXhwLlRwbyAkKERFUERJUikvbGliZ2NyeXB0X2xhLXNleHAuUGxvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzZXhwLmMnIG9iamVjdD0nbGliZ2NyeXB0X2xhLXNleHAubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2NyeXB0X2xhX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmdjcnlwdF9sYS1zZXhwLmxvIGB0ZXN0IC1mICdzZXhwLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNleHAuYworCitsaWJnY3J5cHRfbGEtaHdmZWF0dXJlcy5sbzogaHdmZWF0dXJlcy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2NyeXB0X2xhX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJnY3J5cHRfbGEtaHdmZWF0dXJlcy5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZ2NyeXB0X2xhLWh3ZmVhdHVyZXMuVHBvIC1jIC1vIGxpYmdjcnlwdF9sYS1od2ZlYXR1cmVzLmxvIGB0ZXN0IC1mICdod2ZlYXR1cmVzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGh3ZmVhdHVyZXMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYmdjcnlwdF9sYS1od2ZlYXR1cmVzLlRwbyAkKERFUERJUikvbGliZ2NyeXB0X2xhLWh3ZmVhdHVyZXMuUGxvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdod2ZlYXR1cmVzLmMnIG9iamVjdD0nbGliZ2NyeXB0X2xhLWh3ZmVhdHVyZXMubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2NyeXB0X2xhX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmdjcnlwdF9sYS1od2ZlYXR1cmVzLmxvIGB0ZXN0IC1mICdod2ZlYXR1cmVzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGh3ZmVhdHVyZXMuYworCitsaWJnY3J5cHRfbGEtc3RkbWVtLmxvOiBzdGRtZW0uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdjcnlwdF9sYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZ2NyeXB0X2xhLXN0ZG1lbS5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZ2NyeXB0X2xhLXN0ZG1lbS5UcG8gLWMgLW8gbGliZ2NyeXB0X2xhLXN0ZG1lbS5sbyBgdGVzdCAtZiAnc3RkbWVtLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHN0ZG1lbS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvbGliZ2NyeXB0X2xhLXN0ZG1lbS5UcG8gJChERVBESVIpL2xpYmdjcnlwdF9sYS1zdGRtZW0uUGxvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzdGRtZW0uYycgb2JqZWN0PSdsaWJnY3J5cHRfbGEtc3RkbWVtLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdjcnlwdF9sYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJnY3J5cHRfbGEtc3RkbWVtLmxvIGB0ZXN0IC1mICdzdGRtZW0uYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3RkbWVtLmMKKworbGliZ2NyeXB0X2xhLXNlY21lbS5sbzogc2VjbWVtLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnY3J5cHRfbGFfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmdjcnlwdF9sYS1zZWNtZW0ubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmdjcnlwdF9sYS1zZWNtZW0uVHBvIC1jIC1vIGxpYmdjcnlwdF9sYS1zZWNtZW0ubG8gYHRlc3QgLWYgJ3NlY21lbS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzZWNtZW0uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYmdjcnlwdF9sYS1zZWNtZW0uVHBvICQoREVQRElSKS9saWJnY3J5cHRfbGEtc2VjbWVtLlBsbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc2VjbWVtLmMnIG9iamVjdD0nbGliZ2NyeXB0X2xhLXNlY21lbS5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnY3J5cHRfbGFfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZ2NyeXB0X2xhLXNlY21lbS5sbyBgdGVzdCAtZiAnc2VjbWVtLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNlY21lbS5jCisKK2xpYmdjcnlwdF9sYS1taXNzaW5nLXN0cmluZy5sbzogbWlzc2luZy1zdHJpbmcuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdjcnlwdF9sYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZ2NyeXB0X2xhLW1pc3Npbmctc3RyaW5nLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJnY3J5cHRfbGEtbWlzc2luZy1zdHJpbmcuVHBvIC1jIC1vIGxpYmdjcnlwdF9sYS1taXNzaW5nLXN0cmluZy5sbyBgdGVzdCAtZiAnbWlzc2luZy1zdHJpbmcuYycgfHwgZWNobyAnJChzcmNkaXIpLydgbWlzc2luZy1zdHJpbmcuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYmdjcnlwdF9sYS1taXNzaW5nLXN0cmluZy5UcG8gJChERVBESVIpL2xpYmdjcnlwdF9sYS1taXNzaW5nLXN0cmluZy5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J21pc3Npbmctc3RyaW5nLmMnIG9iamVjdD0nbGliZ2NyeXB0X2xhLW1pc3Npbmctc3RyaW5nLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdjcnlwdF9sYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJnY3J5cHRfbGEtbWlzc2luZy1zdHJpbmcubG8gYHRlc3QgLWYgJ21pc3Npbmctc3RyaW5nLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYG1pc3Npbmctc3RyaW5nLmMKKworbGliZ2NyeXB0X2xhLW1vZHVsZS5sbzogbW9kdWxlLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnY3J5cHRfbGFfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmdjcnlwdF9sYS1tb2R1bGUubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmdjcnlwdF9sYS1tb2R1bGUuVHBvIC1jIC1vIGxpYmdjcnlwdF9sYS1tb2R1bGUubG8gYHRlc3QgLWYgJ21vZHVsZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Btb2R1bGUuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYmdjcnlwdF9sYS1tb2R1bGUuVHBvICQoREVQRElSKS9saWJnY3J5cHRfbGEtbW9kdWxlLlBsbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nbW9kdWxlLmMnIG9iamVjdD0nbGliZ2NyeXB0X2xhLW1vZHVsZS5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnY3J5cHRfbGFfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZ2NyeXB0X2xhLW1vZHVsZS5sbyBgdGVzdCAtZiAnbW9kdWxlLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYG1vZHVsZS5jCisKK2xpYmdjcnlwdF9sYS1maXBzLmxvOiBmaXBzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnY3J5cHRfbGFfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmdjcnlwdF9sYS1maXBzLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJnY3J5cHRfbGEtZmlwcy5UcG8gLWMgLW8gbGliZ2NyeXB0X2xhLWZpcHMubG8gYHRlc3QgLWYgJ2ZpcHMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZmlwcy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvbGliZ2NyeXB0X2xhLWZpcHMuVHBvICQoREVQRElSKS9saWJnY3J5cHRfbGEtZmlwcy5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2ZpcHMuYycgb2JqZWN0PSdsaWJnY3J5cHRfbGEtZmlwcy5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnY3J5cHRfbGFfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZ2NyeXB0X2xhLWZpcHMubG8gYHRlc3QgLWYgJ2ZpcHMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZmlwcy5jCisKK2xpYmdjcnlwdF9sYS1obWFjMjU2LmxvOiBobWFjMjU2LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnY3J5cHRfbGFfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmdjcnlwdF9sYS1obWFjMjU2LmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJnY3J5cHRfbGEtaG1hYzI1Ni5UcG8gLWMgLW8gbGliZ2NyeXB0X2xhLWhtYWMyNTYubG8gYHRlc3QgLWYgJ2htYWMyNTYuYycgfHwgZWNobyAnJChzcmNkaXIpLydgaG1hYzI1Ni5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvbGliZ2NyeXB0X2xhLWhtYWMyNTYuVHBvICQoREVQRElSKS9saWJnY3J5cHRfbGEtaG1hYzI1Ni5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2htYWMyNTYuYycgb2JqZWN0PSdsaWJnY3J5cHRfbGEtaG1hYzI1Ni5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJnY3J5cHRfbGFfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZ2NyeXB0X2xhLWhtYWMyNTYubG8gYHRlc3QgLWYgJ2htYWMyNTYuYycgfHwgZWNobyAnJChzcmNkaXIpLydgaG1hYzI1Ni5jCisKK2xpYmdjcnlwdF9sYS1hdGgubG86IGF0aC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2NyeXB0X2xhX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJnY3J5cHRfbGEtYXRoLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJnY3J5cHRfbGEtYXRoLlRwbyAtYyAtbyBsaWJnY3J5cHRfbGEtYXRoLmxvIGB0ZXN0IC1mICdhdGguYycgfHwgZWNobyAnJChzcmNkaXIpLydgYXRoLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS9saWJnY3J5cHRfbGEtYXRoLlRwbyAkKERFUERJUikvbGliZ2NyeXB0X2xhLWF0aC5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2F0aC5jJyBvYmplY3Q9J2xpYmdjcnlwdF9sYS1hdGgubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ2NyeXB0X2xhX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmdjcnlwdF9sYS1hdGgubG8gYHRlc3QgLWYgJ2F0aC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BhdGguYworCitnY3J5cHRybmQtZ2NyeXB0cm5kLm86IGdjcnlwdHJuZC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChnY3J5cHRybmRfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGdjcnlwdHJuZC1nY3J5cHRybmQubyAtTUQgLU1QIC1NRiAkKERFUERJUikvZ2NyeXB0cm5kLWdjcnlwdHJuZC5UcG8gLWMgLW8gZ2NyeXB0cm5kLWdjcnlwdHJuZC5vIGB0ZXN0IC1mICdnY3J5cHRybmQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ2NyeXB0cm5kLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS9nY3J5cHRybmQtZ2NyeXB0cm5kLlRwbyAkKERFUERJUikvZ2NyeXB0cm5kLWdjcnlwdHJuZC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZ2NyeXB0cm5kLmMnIG9iamVjdD0nZ2NyeXB0cm5kLWdjcnlwdHJuZC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChnY3J5cHRybmRfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZ2NyeXB0cm5kLWdjcnlwdHJuZC5vIGB0ZXN0IC1mICdnY3J5cHRybmQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ2NyeXB0cm5kLmMKKworZ2NyeXB0cm5kLWdjcnlwdHJuZC5vYmo6IGdjcnlwdHJuZC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChnY3J5cHRybmRfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGdjcnlwdHJuZC1nY3J5cHRybmQub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9nY3J5cHRybmQtZ2NyeXB0cm5kLlRwbyAtYyAtbyBnY3J5cHRybmQtZ2NyeXB0cm5kLm9iaiBgaWYgdGVzdCAtZiAnZ2NyeXB0cm5kLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ2NyeXB0cm5kLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2djcnlwdHJuZC5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvZ2NyeXB0cm5kLWdjcnlwdHJuZC5UcG8gJChERVBESVIpL2djcnlwdHJuZC1nY3J5cHRybmQuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2djcnlwdHJuZC5jJyBvYmplY3Q9J2djcnlwdHJuZC1nY3J5cHRybmQub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChnY3J5cHRybmRfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZ2NyeXB0cm5kLWdjcnlwdHJuZC5vYmogYGlmIHRlc3QgLWYgJ2djcnlwdHJuZC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2djcnlwdHJuZC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nY3J5cHRybmQuYyc7IGZpYAorCitobWFjMjU2LWhtYWMyNTYubzogaG1hYzI1Ni5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChobWFjMjU2X0NGTEFHUykgJChDRkxBR1MpIC1NVCBobWFjMjU2LWhtYWMyNTYubyAtTUQgLU1QIC1NRiAkKERFUERJUikvaG1hYzI1Ni1obWFjMjU2LlRwbyAtYyAtbyBobWFjMjU2LWhtYWMyNTYubyBgdGVzdCAtZiAnaG1hYzI1Ni5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BobWFjMjU2LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS9obWFjMjU2LWhtYWMyNTYuVHBvICQoREVQRElSKS9obWFjMjU2LWhtYWMyNTYuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2htYWMyNTYuYycgb2JqZWN0PSdobWFjMjU2LWhtYWMyNTYubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoaG1hYzI1Nl9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBobWFjMjU2LWhtYWMyNTYubyBgdGVzdCAtZiAnaG1hYzI1Ni5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BobWFjMjU2LmMKKworaG1hYzI1Ni1obWFjMjU2Lm9iajogaG1hYzI1Ni5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChobWFjMjU2X0NGTEFHUykgJChDRkxBR1MpIC1NVCBobWFjMjU2LWhtYWMyNTYub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9obWFjMjU2LWhtYWMyNTYuVHBvIC1jIC1vIGhtYWMyNTYtaG1hYzI1Ni5vYmogYGlmIHRlc3QgLWYgJ2htYWMyNTYuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdobWFjMjU2LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2htYWMyNTYuYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpL2htYWMyNTYtaG1hYzI1Ni5UcG8gJChERVBESVIpL2htYWMyNTYtaG1hYzI1Ni5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0naG1hYzI1Ni5jJyBvYmplY3Q9J2htYWMyNTYtaG1hYzI1Ni5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGhtYWMyNTZfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gaG1hYzI1Ni1obWFjMjU2Lm9iaiBgaWYgdGVzdCAtZiAnaG1hYzI1Ni5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2htYWMyNTYuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvaG1hYzI1Ni5jJzsgZmlgCisKK21vc3RseWNsZWFuLWxpYnRvb2w6CisJLXJtIC1mICoubG8KKworY2xlYW4tbGlidG9vbDoKKwktcm0gLXJmIC5saWJzIF9saWJzCitpbnN0YWxsLW00ZGF0YURBVEE6ICQobTRkYXRhX0RBVEEpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJdGVzdCAteiAiJChtNGRhdGFkaXIpIiB8fCAkKE1LRElSX1ApICIkKERFU1RESVIpJChtNGRhdGFkaXIpIgorCUBsaXN0PSckKG00ZGF0YV9EQVRBKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAtZiAiJCRwIjsgdGhlbiBkPTsgZWxzZSBkPSIkKHNyY2RpcikvIjsgZmk7IFwKKwkgIGY9JChhbV9fc3RyaXBfZGlyKSBcCisJICBlY2hvICIgJChtNGRhdGFEQVRBX0lOU1RBTEwpICckJGQkJHAnICckKERFU1RESVIpJChtNGRhdGFkaXIpLyQkZiciOyBcCisJICAkKG00ZGF0YURBVEFfSU5TVEFMTCkgIiQkZCQkcCIgIiQoREVTVERJUikkKG00ZGF0YWRpcikvJCRmIjsgXAorCWRvbmUKKwordW5pbnN0YWxsLW00ZGF0YURBVEE6CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlAbGlzdD0nJChtNGRhdGFfREFUQSknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGY9JChhbV9fc3RyaXBfZGlyKSBcCisJICBlY2hvICIgcm0gLWYgJyQoREVTVERJUikkKG00ZGF0YWRpcikvJCRmJyI7IFwKKwkgIHJtIC1mICIkKERFU1RESVIpJChtNGRhdGFkaXIpLyQkZiI7IFwKKwlkb25lCitpbnN0YWxsLWluY2x1ZGVIRUFERVJTOiAkKGluY2x1ZGVfSEVBREVSUykKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwl0ZXN0IC16ICIkKGluY2x1ZGVkaXIpIiB8fCAkKE1LRElSX1ApICIkKERFU1RESVIpJChpbmNsdWRlZGlyKSIKKwlAbGlzdD0nJChpbmNsdWRlX0hFQURFUlMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0IC1mICIkJHAiOyB0aGVuIGQ9OyBlbHNlIGQ9IiQoc3JjZGlyKS8iOyBmaTsgXAorCSAgZj0kKGFtX19zdHJpcF9kaXIpIFwKKwkgIGVjaG8gIiAkKGluY2x1ZGVIRUFERVJTX0lOU1RBTEwpICckJGQkJHAnICckKERFU1RESVIpJChpbmNsdWRlZGlyKS8kJGYnIjsgXAorCSAgJChpbmNsdWRlSEVBREVSU19JTlNUQUxMKSAiJCRkJCRwIiAiJChERVNURElSKSQoaW5jbHVkZWRpcikvJCRmIjsgXAorCWRvbmUKKwordW5pbnN0YWxsLWluY2x1ZGVIRUFERVJTOgorCUAkKE5PUk1BTF9VTklOU1RBTEwpCisJQGxpc3Q9JyQoaW5jbHVkZV9IRUFERVJTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgZj0kKGFtX19zdHJpcF9kaXIpIFwKKwkgIGVjaG8gIiBybSAtZiAnJChERVNURElSKSQoaW5jbHVkZWRpcikvJCRmJyI7IFwKKwkgIHJtIC1mICIkKERFU1RESVIpJChpbmNsdWRlZGlyKS8kJGYiOyBcCisJZG9uZQorCitJRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkgJChUQUdTX0ZJTEVTKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCW1raWQgLWZJRCAkJHVuaXF1ZQordGFnczogVEFHUworCitUQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCXRhZ3M9OyBcCisJaGVyZT1gcHdkYDsgXAorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCR0YWdzJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAorCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAorCSAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAorCSAgICAkJHRhZ3MgJCR1bmlxdWU7IFwKKwlmaQorY3RhZ3M6IENUQUdTCitDVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwl0YWdzPTsgXAorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwl0ZXN0IC16ICIkKENUQUdTX0FSR1MpJCR0YWdzJCR1bmlxdWUiIFwKKwkgIHx8ICQoQ1RBR1MpICQoQ1RBR1NGTEFHUykgJChBTV9DVEFHU0ZMQUdTKSAkKENUQUdTX0FSR1MpIFwKKwkgICAgICQkdGFncyAkJHVuaXF1ZQorCitHVEFHUzoKKwloZXJlPWAkKGFtX19jZCkgJCh0b3BfYnVpbGRkaXIpICYmIHB3ZGAgXAorCSAgJiYgY2QgJCh0b3Bfc3JjZGlyKSBcCisJICAmJiBndGFncyAtaSAkKEdUQUdTX0FSR1MpICQkaGVyZQorCitkaXN0Y2xlYW4tdGFnczoKKwktcm0gLWYgVEFHUyBJRCBHVEFHUyBHUlRBR1MgR1NZTVMgR1BBVEggdGFncworCitkaXN0ZGlyOiAkKERJU1RGSUxFUykKKwlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJdG9wc3JjZGlyc3RyaXA9YGVjaG8gIiQodG9wX3NyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCWxpc3Q9JyQoRElTVEZJTEVTKSc7IFwKKwkgIGRpc3RfZmlsZXM9YGZvciBmaWxlIGluICQkbGlzdDsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBcCisJICBzZWQgLWUgInN8XiQkc3JjZGlyc3RyaXAvfHw7dCIgXAorCSAgICAgIC1lICJzfF4kJHRvcHNyY2RpcnN0cmlwL3wkKHRvcF9idWlsZGRpcikvfDt0ImA7IFwKKwljYXNlICQkZGlzdF9maWxlcyBpbiBcCisJICAqLyopICQoTUtESVJfUCkgYGVjaG8gIiQkZGlzdF9maWxlcyIgfCBcCisJCQkgICBzZWQgJy9cLy8hZDtzfF58JChkaXN0ZGlyKS98O3MsL1teL10qJCQsLCcgfCBcCisJCQkgICBzb3J0IC11YCA7OyBcCisJZXNhYzsgXAorCWZvciBmaWxlIGluICQkZGlzdF9maWxlczsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJGZpbGUgfHwgdGVzdCAtZCAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAorCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKKwkgICAgZGlyPWBlY2hvICIvJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKKwkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCisJICAgICAgY3AgLXBSICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKSQkZGlyIHx8IGV4aXQgMTsgXAorCSAgICBmaTsgXAorCSAgICBjcCAtcFIgJCRkLyQkZmlsZSAkKGRpc3RkaXIpJCRkaXIgfHwgZXhpdCAxOyBcCisJICBlbHNlIFwKKwkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorY2hlY2stYW06IGFsbC1hbQorY2hlY2s6IGNoZWNrLWFtCithbGwtYW06IE1ha2VmaWxlICQoTFRMSUJSQVJJRVMpICQoUFJPR1JBTVMpICQoU0NSSVBUUykgJChEQVRBKSBcCisJCSQoSEVBREVSUykKK2luc3RhbGwtYmluUFJPR1JBTVM6IGluc3RhbGwtbGliTFRMSUJSQVJJRVMKKworaW5zdGFsbGRpcnM6CisJZm9yIGRpciBpbiAiJChERVNURElSKSQobGliZGlyKSIgIiQoREVTVERJUikkKGJpbmRpcikiICIkKERFU1RESVIpJChzYmluZGlyKSIgIiQoREVTVERJUikkKGJpbmRpcikiICIkKERFU1RESVIpJChtNGRhdGFkaXIpIiAiJChERVNURElSKSQoaW5jbHVkZWRpcikiOyBkbyBcCisJICB0ZXN0IC16ICIkJGRpciIgfHwgJChNS0RJUl9QKSAiJCRkaXIiOyBcCisJZG9uZQoraW5zdGFsbDogaW5zdGFsbC1hbQoraW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtYW0KK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLWFtCit1bmluc3RhbGw6IHVuaW5zdGFsbC1hbQorCitpbnN0YWxsLWFtOiBhbGwtYW0KKwlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQorCitpbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1hbQoraW5zdGFsbC1zdHJpcDoKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCisJICBgdGVzdCAteiAnJChTVFJJUCknIHx8IFwKKwkgICAgZWNobyAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyJgIGluc3RhbGwKK21vc3RseWNsZWFuLWdlbmVyaWM6CisKK2NsZWFuLWdlbmVyaWM6CisKK2Rpc3RjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQorCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6CisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKK2NsZWFuOiBjbGVhbi1hbQorCitjbGVhbi1hbTogY2xlYW4tYmluUFJPR1JBTVMgY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJMVExJQlJBUklFUyBcCisJY2xlYW4tbGlidG9vbCBjbGVhbi1zYmluUFJPR1JBTVMgbW9zdGx5Y2xlYW4tYW0KKworZGlzdGNsZWFuOiBkaXN0Y2xlYW4tYW0KKwktcm0gLXJmIC4vJChERVBESVIpCisJLXJtIC1mIE1ha2VmaWxlCitkaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIFwKKwlkaXN0Y2xlYW4tdGFncworCitkdmk6IGR2aS1hbQorCitkdmktYW06CisKK2h0bWw6IGh0bWwtYW0KKworaW5mbzogaW5mby1hbQorCitpbmZvLWFtOgorCitpbnN0YWxsLWRhdGEtYW06IGluc3RhbGwtZGF0YS1sb2NhbCBpbnN0YWxsLWluY2x1ZGVIRUFERVJTIFwKKwlpbnN0YWxsLW00ZGF0YURBVEEKKworaW5zdGFsbC1kdmk6IGluc3RhbGwtZHZpLWFtCisKK2luc3RhbGwtZXhlYy1hbTogaW5zdGFsbC1iaW5QUk9HUkFNUyBpbnN0YWxsLWJpblNDUklQVFMgXAorCWluc3RhbGwtbGliTFRMSUJSQVJJRVMgaW5zdGFsbC1zYmluUFJPR1JBTVMKKworaW5zdGFsbC1odG1sOiBpbnN0YWxsLWh0bWwtYW0KKworaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KKworaW5zdGFsbC1tYW46CisKK2luc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1hbQorCitpbnN0YWxsLXBzOiBpbnN0YWxsLXBzLWFtCisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQorCS1ybSAtcmYgLi8kKERFUERJUikKKwktcm0gLWYgTWFrZWZpbGUKK21haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCisKK21vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWdlbmVyaWMgXAorCW1vc3RseWNsZWFuLWxpYnRvb2wKKworcGRmOiBwZGYtYW0KKworcGRmLWFtOgorCitwczogcHMtYW0KKworcHMtYW06CisKK3VuaW5zdGFsbC1hbTogdW5pbnN0YWxsLWJpblBST0dSQU1TIHVuaW5zdGFsbC1iaW5TQ1JJUFRTIFwKKwl1bmluc3RhbGwtaW5jbHVkZUhFQURFUlMgdW5pbnN0YWxsLWxpYkxUTElCUkFSSUVTIFwKKwl1bmluc3RhbGwtbG9jYWwgdW5pbnN0YWxsLW00ZGF0YURBVEEgdW5pbnN0YWxsLXNiaW5QUk9HUkFNUworCisuTUFLRTogaW5zdGFsbC1hbSBpbnN0YWxsLXN0cmlwCisKKy5QSE9OWTogQ1RBR1MgR1RBR1MgYWxsIGFsbC1hbSBjaGVjayBjaGVjay1hbSBjbGVhbiBjbGVhbi1iaW5QUk9HUkFNUyBcCisJY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJMVExJQlJBUklFUyBjbGVhbi1saWJ0b29sIFwKKwljbGVhbi1zYmluUFJPR1JBTVMgY3RhZ3MgZGlzdGNsZWFuIGRpc3RjbGVhbi1jb21waWxlIFwKKwlkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tdGFncyBkaXN0ZGlyIGR2aSBcCisJZHZpLWFtIGh0bWwgaHRtbC1hbSBpbmZvIGluZm8tYW0gaW5zdGFsbCBpbnN0YWxsLWFtIFwKKwlpbnN0YWxsLWJpblBST0dSQU1TIGluc3RhbGwtYmluU0NSSVBUUyBpbnN0YWxsLWRhdGEgXAorCWluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWRhdGEtbG9jYWwgaW5zdGFsbC1kdmkgaW5zdGFsbC1kdmktYW0gXAorCWluc3RhbGwtZXhlYyBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1odG1sIGluc3RhbGwtaHRtbC1hbSBcCisJaW5zdGFsbC1pbmNsdWRlSEVBREVSUyBpbnN0YWxsLWluZm8gaW5zdGFsbC1pbmZvLWFtIFwKKwlpbnN0YWxsLWxpYkxUTElCUkFSSUVTIGluc3RhbGwtbTRkYXRhREFUQSBpbnN0YWxsLW1hbiBcCisJaW5zdGFsbC1wZGYgaW5zdGFsbC1wZGYtYW0gaW5zdGFsbC1wcyBpbnN0YWxsLXBzLWFtIFwKKwlpbnN0YWxsLXNiaW5QUk9HUkFNUyBpbnN0YWxsLXN0cmlwIGluc3RhbGxjaGVjayBcCisJaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIG1haW50YWluZXItY2xlYW4gXAorCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBtb3N0bHljbGVhbi1jb21waWxlIFwKKwltb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wgcGRmIHBkZi1hbSBwcyBwcy1hbSBcCisJdGFncyB1bmluc3RhbGwgdW5pbnN0YWxsLWFtIHVuaW5zdGFsbC1iaW5QUk9HUkFNUyBcCisJdW5pbnN0YWxsLWJpblNDUklQVFMgdW5pbnN0YWxsLWluY2x1ZGVIRUFERVJTIFwKKwl1bmluc3RhbGwtbGliTFRMSUJSQVJJRVMgdW5pbnN0YWxsLWxvY2FsIHVuaW5zdGFsbC1tNGRhdGFEQVRBIFwKKwl1bmluc3RhbGwtc2JpblBST0dSQU1TCisKKworQEhBVkVfVzMyX1NZU1RFTV9UUlVFQC5yYy5sbzoKK0BIQVZFX1czMl9TWVNURU1fVFJVRUAJJChMVFJDQ09NUElMRSkgLWkgJDwgLW8gJEAKKworQEhBVkVfVzMyX1NZU1RFTV9UUlVFQGluc3RhbGwtZGVmLWZpbGU6CitASEFWRV9XMzJfU1lTVEVNX1RSVUVACSQoSU5TVEFMTCkgJChzcmNkaXIpL2xpYmdjcnlwdC5kZWYgJChERVNURElSKSQobGliZGlyKS9saWJnY3J5cHQuZGVmCisKK0BIQVZFX1czMl9TWVNURU1fVFJVRUB1bmluc3RhbGwtZGVmLWZpbGU6CitASEFWRV9XMzJfU1lTVEVNX1RSVUVACS1ybSAkKERFU1RESVIpJChsaWJkaXIpL2xpYmdjcnlwdC5kZWYKK0BIQVZFX1czMl9TWVNURU1fRkFMU0VAaW5zdGFsbC1kZWYtZmlsZToKK0BIQVZFX1czMl9TWVNURU1fRkFMU0VAdW5pbnN0YWxsLWRlZi1maWxlOgorCitpbnN0YWxsLWRhdGEtbG9jYWw6IGluc3RhbGwtZGVmLWZpbGUKKwordW5pbnN0YWxsLWxvY2FsOiB1bmluc3RhbGwtZGVmLWZpbGUKKworIyBGSVhNRTogV2UgbmVlZCB0byBmaWd1cmUgb3V0IGhvdyB0byBnZXQgdGhlIGFjdHVhbCBuYW1lIChwYXJzaW5nCisjIGxpYmdjcnlwdC5sYT8pIGFuZCBob3cgdG8gY3JlYXRlIHRoZSBobWFjIGZpbGUgYWxyZWFkeSBhdCBsaW5rIHRpbWUKKyMgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCB3aXRob3V0IGluc3RhbGxpbmcgbGliZ2NyeXB0IGZpcnN0LgorI2luc3RhbGwtZXhlYy1ob29rOgorIwkuL2htYWMyNTYgIldoYXQgYW0gSSwgYSBkb2N0b3Igb3IgYSBtb29uc2h1dHRsZSBjb25kdWN0b3I/IiBcCisjICAgICAgICAgIDwgJChERVNURElSKSQobGliZGlyKS9saWJnY3J5cHQuc28uMTEuNS4wIFwKKyMgICAgICAgICAgPiAkKERFU1RESVIpJChsaWJkaXIpLy5saWJnY3J5cHQuc28uMTEuNS4wLmhtYWMKKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9zcmMvTWFuaWZlc3QgYi9saWJnY3J5cHQtMS40LjYvc3JjL01hbmlmZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMDAzZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvc3JjL01hbmlmZXN0CkBAIC0wLDAgKzEsNTggQEAKKyMgTWFuaWZlc3QgLSBjaGVja3N1bXMgb2YgdGhlIHNyYyBkaXJlY3RvcnkKKyMgQ29weXJpZ2h0IDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyMKKyMgTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIGdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisKKyMgQ2hlY2tzdW1zIGZvciBhbGwgc291cmNlIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5LiBGb3JtYXQgaXMKKyMgZmlsZW5hbWUsIGJsYW5rcywgYmFzZS02NCBwYXJ0IG9mIGFuIE9wZW5QR1AgZGV0YWNoZWQgc2lnbmF0dXJlCisjIHdpdGhvdXQgdGhlIGhlYWRlciBsaW5lcy4gIEJsYW5rIGxpbmVzIGFuZCBsaW5lcyBiZWdpbm5pbmcgd2l0aCBhCisjIGhhc2ggbWFyayBhcmUgaWdub3JlZC4gIEEgdG9vbCB0byBwcm9jZXNzIHRoaXMgZmlsZSBpcyBhdmFpbGFibGUgYnkKKyMgY3ZzIC1kIDpwc2VydmVyOmFub25jdnNAY3ZzLmdudXBnLm9yZzovY3ZzL3drIGNvIG1pc2Mtc2NyaXB0cy9tYW5pZmVzdC10b29sCisjCisjIFRoZSBzcGVjaWFsIGVudHJ5ICIkbmFtZXMkIiBob2xkcyBhIHNpZ25hdHVyZSBvdmVyIGFsbCBzb3J0ZWQKKyMgZmlsZW5hbWVzIGV4Y2x1ZGluZyBpdHNlbGYuCisKK2djcnlwdC5oIGlRQ1ZBd1VBUUg1UnNURUFucDgzMlMvN0FRSzd4Z1ArS2MzTlk5bGlwWmthQU1ybkhEa1FWTGRIWXdUYlpXdUdPWWRUTHA4WHk3QXVoOXd0V1Y5aHJXVlVxcytreER6VC8yaUY2WGtPM1dUM3JmL1BtUS9RMFRJR2ZPeWpFM2MvcXZCL2pWaXBwYXhvR2RhM3RuR3BPRHl0ZEkzWFBoZlBTMFNzOG5EemZDU3RQQkdBRXEwT1ZVN2ltbkV4ckZ6aFJYdCtHbGpyMG8wPT1ZYWd6CitnY3J5cHQtbW9kdWxlLmggaVFDVkF3VUFRSDVVWHpFQW5wODMyUy83QVFKTVFnUUF6dW16OWFhWmVsaHcrRnhUQ2VWYWRwaEJ4dDFiYk5Rdk1ybmRkWVlibHlKditBY3haOVp4R3oyb1BldXNONThRZzU0RFFjYVczbFloVGduV2ZYdWx0c2krUnV4bHo3NDAwT1VyelNYT2wzQXQ3S3NzZE9EQW9zY0Z6WklnaDk0RzlselF4RUJyOWxUWEk5UjNMc1BGSlA2bXVORzRmcmNOQkFBNDJ5Y2tLN3c9PUJCcDUKKworYXRoLmMgaVFDVkF3VUFRSDVFK0RFQW5wODMyUy83QVFLRnBnUCtLU1pIdFZjbmg5RkZnZ0l5SEtiQUxVbGpXMkZYYXVhc1p2RnlOOFNrL21JTWdLeHlYRk9HMVRIQkFVeldMYUtXSUVXVStXa1lVN3VUaHFCdHBuRUltTTVBZW5XemJRdUpqZnRQQzNnVkhPOHlqam1CV0Q0em1KajI4aHRvS0RvYS94RHNvcXVtckh4YWUzRlljYUNXdFlHVmpNL1BibCtPTVJNT0ZBaHAwaG89PWxRWjMKK2F0aC5oIGlRQ1ZBd1VBUUg1Rk9ERUFucDgzMlMvN0FRS2l1UVFBZzRLK0tPQW4xTFdCWk4zMk1BaG1zNEZlWktvY2UwZkF1Wlc3QnB5WTRjQ3hJVmd4cXJ0VUM5MENEeWt3OFhlZ0ZmT3l5WXJnZDBObWFNVmRZN0haRG5jTk92SVB4cGdGUVBDWnJ5Y3NNT29BdG9Wd2pLNzA0UkRlTm8zem1leXhUS2VESCszTTFKN0ptTGlhZmFFZFNiT0M4ZmxYL1cwaWNhVjBPbDRkbUJjPT1MbDZ3CisKK2NpcGhlci5oIGlRQ1ZBd1VBUUg1RlV6RUFucDgzMlMvN0FRSktMZ1A5R1NTazlmN0VJTklScVNRSDFYS1grZFl6dDNwaERIZHFGVFVHSWZZTmg3WXpHZHkwZHJ2Z0ZoRzRrMTVucURvdUtSdUZWTS9oS1kzWlZZN0pjY21LWEtHQUg2K1pZU2hvRzZMTUZmSUdnRFg4em5lMGROeGM3MlBMZm5zM2ZWeE5uL1JsSG1IQmtyUStwcGpSOUhuU3RoRm1PcXpiUWFXMUJLbWMzWjJ4NUdVPT1sSWVXCitnMTBsaWIuaCBpUUNWQXdVQVFINUZlakVBbnA4MzJTLzdBUUo3NXdQL1pqT3lid1JpeDVlb1hkZlZlWFBqb1B5Z2VqenBZSkpkTVVHTjNZNVV0a2ZCdTltUFJFc0tmdlo2dEgrRXZqeCszeGZlQWI0YlUvazJtUk1wMHRpV25rMmtvVG9TMDh2STl1eG5pb0tRcjlvdWxaSDZyMjhTK05MU2dNUXVFR04xSk5Va3k2UlE5VFROUm5kZVRqS0tTckVqWjdWNmJ2K3JiOEExYllDS0Nocz09UDVtaworbXBpLmggaVFDVkF3VUFRSDVGd3pFQW5wODMyUy83QVFKSjR3UDlFM2pWa2NPOU0wWXRTQkhJYmpHM2hEV0tXWHppODZBbFVoNTFxaUU4LzJYUDBGZmpBNFRvc3l2bWljWnM3ajQ4SGl0QUJ5cjl0SE9TeG5iZW83TkJmMTdJQ3dBbzZFcXR5K3dLRGcrZXlMZUVHVXk3VnBWSzNSSlJRQUE0SCtrbDNTMmwzWU1US2YzV0psYmM3cWtXU1hac3BkeTVjOXNBeGVvZENLckF1YlU9PW9BTGYKKworZ2xvYmFsLmMgaVFDVkF3VUFRSDVIRnpFQW5wODMyUy83QVFKYytRUUF2aTUzWmtNQ3pMblZVTEh2aEk2VytFWDUzN3ppOW44Y3BsWWd1dklKcVVoQVpyUDY4eUdBSXlxeUNPTmJaVkR5Qjd3cWVYZFVNTHpNazdXOGZnK3h1azVKU0RwcHBBUWYybS9iZFF5emU2WFZxSnNvNjgyZVlCTTgrYjl6L0lWRXZMYUZ3aFpjT0tPMWJjWHVkQmxCQ2NKZ1ZEcHVwZlR0QVdnUG5ld2lsOVE9PVh3eTEKK21pc2MuYyBpUUNWQXdVQVFINUlJakVBbnA4MzJTLzdBUUtOSkFRQWtFcHlZM2ZDRzd0dkFESkZBVzl4QTdERVF3TENhOFltaVVoSHZyRXNXT0k0WWd2UzdMVWJXV2M3VnFLK3J5T1J2WExLUkFWaWV6bmJuSEF1eTBUS3RxZG5tQS9rVW1pdXJTMGFoNVNXcVIvaXVBZUp0dDBSR3NtWmFaNm9hMm00UFoyWTJHQ0hTVFpxY2NsdndzZXRTOWVxNUFpcHhIeFlGVWx0dTV3R1pOST09dHdNMgorbWlzc2luZy1zdHJpbmcuYyBpUUNWQXdVQVFINUpmakVBbnA4MzJTLzdBUUkzWlFRQWc1NWVFSmJHUVFIeUJFSkd4dnQvRlhwUWlYY29EaXQzWkh6dmRhUW4vTlVnZExqQ0hpV1Z6aHlDWEFDR2l2TFdNTk1vZERhU2FaazA3M05YeFZrV2ZQY1g5dmtGLy9XdWd3emlkZDVQM0JmdTVrMzVvK1h4ejgyZnNrNUt1RkdHcTFtQlVaMDd4VVlROEtrS2toQURVa3IwUWlRQXV5cHAwNzlZcTB1VUM3UT09enZLbgorbW9kdWxlLmMgaVFDVkF3VUFRSDVKdmpFQW5wODMyUy83QVFLbE1nUUFqWllUWE1wV2I1a0h4Q01YelJpMDY5S3UvNC94bldzRCtTMGRqZTFMaUt6Q25ScHdUVHhBUnpjL3kxMFk4T2N5Z2tNdVI0dW5FYVdlZE8rOXN5amp0eTNmQkNjdWUvajdZbExpdHE1RUM5VUU0bzIzcG9XdldDdVg5VGFkbTJESzVxZjRwN3NtTUoyMk8yMmNMVFlUVkN5QW9ZVFEyeEM4YWp6QnNCUmtYODA9PXlSUkQKK3NlY21lbS5jIGlRQ1ZBd1VBUUg1TExERUFucDgzMlMvN0FRS3RGd1FBd1kyd0JyNldKQzFjd3FwLzFEUW9Lekh4OUMzcGxPTnhiWk1hendSN1ZNSTgzTlViQkFidjFtY3hwZVpXWG1iMmRScm5zUjFWQmJOUERTYkpMTjVUNmN6TFEybkliNm1ucTl1OElwNFNBYStHQ1dmRFY0QVV0QUo0aE4veXZXbzhpRUt1K0tENWlKNnhKaDMxTmRYanQ1eWs2dm5rNDZTQTZSNEZrSGRJRVhjPT1VS1ZyCitzZWNtZW0uaCBpUUNWQXdVQVFINUxUREVBbnA4MzJTLzdBUUlzSndRQWtaVXU0aHZtaDlOWENMTm05OCt0R1pGeldZdlpPL05mZkMyd2RQRThRL09UYS9tM2crb0JiRWhhVjF6ZTNvWTR0MUYvcDdaSEZ4NUNzSXA0elZqeVBreGxuaThBQVZNVU9Rci9Mb3B5eG91SG4yT2pLTytkVnFlY1dRZjAxK25QV2prbGJMMkZaM21ROTlrMnFlV1psVlNrejBubTh1MzlGM3Y3ejNPVENzcz09QUpxRQorc2V4cC5jIGlRQ1ZBd1VBUUg1TG9qRUFucDgzMlMvN0FRS0NUUVFBcmxyajFLR3dSMng5M2ZjeU4zTTBpWHVHa0JxNVI5S051KzFCcTA0RzRTTGxwWjFSUlkwT2pWM0w5VG8xQkhUZDAxbFhsTzhNTno3TnBSeFdsRzFTdzVGb2hiQmxoV1pRUmNXOEdkQWF3SlBjZklZMlk4RWs2WXg4cXVaS2JrOXVEM2JjQm1TdG1nMFArVElBMG5yMjBibXRmQjN1WDJLUVZIUXFXWlFUNXFVPT1QOEZFCitzdGRtZW0uYyBpUUNWQXdVQVFINUx6akVBbnA4MzJTLzdBUUxPVUFQOUZVMTZpdFhCQnJrZlJER21oVWpBT2VFRUtkZCticlEzWGRUOHhvTHZQL0lILzZVMUtxM2FtcFAyL3hjTDRrd1ZkejJydzZOUnpQN2psTC95TTN0VzcyMmxTUy9KUEprSCsyK3FVa2NiMGZZTm9xbC9XWVBNWXAxL016dTZ0dFhuamFnMWNRR2xLSXlZQUQrRzZoM0Z0cEx3UXkwaEVKb3BuRjkrT3ZkOFU3QT09Q2tpWgorc3RkbWVtLmggaVFDVkF3VUFRSDVMOGpFQW5wODMyUy83QVFJSDB3UCtMeXFoMHRqKytzMkw3OVRtZi9ncWdDSytITE14VGRkY2V3RjNYYnNZZjlUNUZtTGV6MWd6NkdndGk0U3M5Vmpvek9BM3RpM3RyQ2lBL1lOUm1WOUFZdzR6TFVQbStNc2pKdXZlTC9BZ0I5SGRvRDJ2K1JmSm0wV3dnU0tpeXNwKzhpeWpnM1Bsb3BtaGJhNGNHdU9QNU1KM0NXVHFZd1BtSlZzY1VLQzZnMzg9PTAyTU4KKwordHlwZXMuaCBpUUNWQXdVQVFINU1LVEVBbnA4MzJTLzdBUUxxVEFQNkEzbVVNRDVNTWtCa2VicTRiUlk2QnEwS3NnZEtmWjhUTGhjMm84N2dGYXk4WUQwVW9tM1lKTkcyTEYvckFJY3QyaWg0allKYUliNWRSZkowS0pvUGkyRVRkNDYySjhPRkNMNGZqcTlUYVNqQjJwWGNCK2tXb3h6UGFzR05nMlVrazBkUTZsdkYxdFNZcnR0MzJQVkk3cS9VYVBzalR5bGdSbXpMZlgvVnhyVT09T011MworCisKKyMgQ29uZmlndXJhdGlvbgorTWFrZWZpbGUuYW0gaVFDVkF3VUFRSDVXVmpFQW5wODMyUy83QVFMbXNRUC9iYkk4L1VXQUM1eUlUVmhHY0NPQ2JOL0ZhTXFYVktqeEVTem82R1RzMDJqeEsxeTNSdXVhb05VMXNzUVpHQXhwRmlNSlc4dTkzM1YzeVRIRk14V3B3SGVtRG5FeXYvYThZQUN4SkJRMHRRZ3BnSFM3MTZCak1iSE9mY3VPaXMyV2xDT09tMEVyamhBWU5hNE5RMXEzandrT3ZURExGcGRucWFXSTJ3V24wOFU9PVlqdW4KK2xpYmdjcnlwdC5tNCBpUUNWQXdVQVFINU1iVEVBbnA4MzJTLzdBUUoxdUFRQTFDNnhJN3FYaUtWdFVlWGF3aFB5dEFsZG9zcnpjWG1xejM0eGk3SmtsUXF3ODNkNjhXdFdIRk1CRVVhN01LZmk0V0NidVFiN0ZqR1V2TVJ3NXovVDllejdDb0Rla0hjNjMrY0lJWkxRMjN3ZVVLOEdhQTF1UUxvRDBzY21UNDFKNVJrQmxKYkg3Y2sxelJkM2QwNG83NXJXTkVVTml0NktCdnJRNFBkOG9ROD09dU1nQgorbGliZ2NyeXB0LWNvbmZpZy5pbiBpUUNWQXdVQVFINVViekVBbnA4MzJTLzdBUUpJU2dQK05iZDJBUW5ETS9rOHNRTGJ2ejhZWmp3WDNMaWdaTStBa0YxVkF3eUFtNllPVTNuclhuejV0K2NYa1FEMmRrejRMMkYwQUFzSWtGaUpzcmdtWmdDcDJoMUw2TGVGbkgraG9JZDlSaGJZdzROa0RhSGIrTUM5SmNhbHBjZkZ2dnhxNnZNL1czN2JTRmltTTc4UCs1UkxLeXBYQ3l0VlFOQUFhSVJnWmpWZlhZOD09SUdEUworbGliZ2NyeXB0LnZlcnMgaVFDVkF3VUFRSDVNalRFQW5wODMyUy83QVFLQ2RRUUFvdEc2WjN6ZGNlUEkwVjMzWVkyc2g5MXVZa0xCTmhRdytQenlFM0JSUkFWaE1HTE9CRDFuU1dKSEp2RTNleUNWT3FGWTBabXZwVmV4NTFGYTBEL1R3c0pPTzRSVnhmMUw5YmJBbmN1OU91RVhhR1hLeXRMWnA1NFRsaURUQVdHRHEwbHZ0eDFUdkREZ3RNOFRiYmFYdk1iamZRNHdYQnhkTHZhZW5GQ1RsUjQ9PWtnSHEKKworJG5hbWVzJCBpUUNWQXdVQVFINVVoREVBbnA4MzJTLzdBUUsvandQOUg3QTNtSTk5TTFOR3VoRCsxNkMrMmdKSUlUQjhHSmVZZVVkM3ZtOGtXUTVuNzZXeU1DZGVBNjJxbjBKVWRkSUJqQWJhZ3RmdlRMNWFlc25EOU1saEVHYU5sSGF1VTdTSU5USUo4bmpLZjg3RUFBZkRacmhTL3RHRHppQzJuYWtNUHdlUnhYUUNMRFdIa0JQallmcnNwU0xMb2hqZGVncUJ2VE55Vk03NitLRT09M3A5WgpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L3NyYy9hdGguYyBiL2xpYmdjcnlwdC0xLjQuNi9zcmMvYXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMyNzRjZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9zcmMvYXRoLmMKQEAgLTAsMCArMSwzNDUgQEAKKy8qIGF0aC5jIC0gVGhyZWFkLXNhZmVuZXNzIGxpYnJhcnkuCisgICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAKKyAgIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgCisgICBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIExpYmdjcnlwdDsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4gIC8qIFJpZ2h0OiBXZSBuZWVkIHRvIHVzZSBhc3NlcnQgYW5kIG5vdCBnY3J5X2Fzc2VydC4gICovCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaWZkZWYgSEFWRV9TWVNfU0VMRUNUX0gKKyMgaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmbmRlZiBfV0lOMzIKKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgImF0aC5oIgorCisKKwwKKy8qIFRoZSBpbnRlcmZhY2UgdGFibGUuICAqLworc3RhdGljIHN0cnVjdCBhdGhfb3BzIG9wczsKKworLyogVHJ1ZSBpZiB3ZSBzaG91bGQgdXNlIHRoZSBleHRlcm5hbCBjYWxsYmFja3MuICAqLworc3RhdGljIGludCBvcHNfc2V0OworCisKKy8qIEZvciB0aGUgZHVtbXkgaW50ZXJmYWNlLiAgKi8KKyNkZWZpbmUgTVVURVhfVU5MT0NLRUQJKChhdGhfbXV0ZXhfdCkgMCkKKyNkZWZpbmUgTVVURVhfTE9DS0VECSgoYXRoX211dGV4X3QpIDEpCisjZGVmaW5lIE1VVEVYX0RFU1RST1lFRAkoKGF0aF9tdXRleF90KSAyKQorCisKKy8qIFJldHVybiB0aGUgdGhyZWFkIHR5cGUgZnJvbSB0aGUgb3B0aW9uIGZpZWxkLiAqLworI2RlZmluZSBHRVRfT1BUSU9OKGEpICAgICgoYSkgJiAweGZmKQorLyogUmV0dXJuIHRoZSB2ZXJzaW9uIG51bWJlciBmcm9tIHRoZSBvcHRpb24gZmllbGQuICAqLworI2RlZmluZSBHRVRfVkVSU0lPTihhKSAgICgoKGEpID4+IDgpJiAweGZmKQorCisKKwwKKy8qIFRoZSBsb2NrIHdlIHRha2Ugd2hpbGUgY2hlY2tpbmcgZm9yIGxhenkgbG9jayBpbml0aWFsaXphdGlvbi4gICovCitzdGF0aWMgYXRoX211dGV4X3QgY2hlY2tfaW5pdF9sb2NrID0gQVRIX01VVEVYX0lOSVRJQUxJWkVSOworCitpbnQKK2F0aF9pbml0ICh2b2lkKQoreworICBpbnQgZXJyID0gMDsKKworICBpZiAob3BzX3NldCkKKyAgICB7CisgICAgICBpZiAob3BzLmluaXQpCisJZXJyID0gKCpvcHMuaW5pdCkgKCk7CisgICAgICBpZiAoZXJyKQorCXJldHVybiBlcnI7CisgICAgICBlcnIgPSAoKm9wcy5tdXRleF9pbml0KSAoJmNoZWNrX2luaXRfbG9jayk7CisgICAgfQorICByZXR1cm4gZXJyOworfQorCisKKy8qIEluaXRpYWxpemUgdGhlIGxvY2tpbmcgbGlicmFyeS4gIFJldHVybnMgMCBpZiB0aGUgb3BlcmF0aW9uIHdhcworICAgc3VjY2Vzc2Z1bCwgRUlOVkFMIGlmIHRoZSBvcGVyYXRpb24gdGFibGUgd2FzIGludmFsaWQgYW5kIEVCVVNZIGlmCisgICB3ZSBhbHJlYWR5IHdlcmUgaW5pdGlhbGl6ZWQuICAqLworZ3BnX2Vycl9jb2RlX3QKK2F0aF9pbnN0YWxsIChzdHJ1Y3QgYXRoX29wcyAqYXRoX29wcywgaW50IGNoZWNrX29ubHkpCit7CisgIGlmIChjaGVja19vbmx5KQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGludCBvcHRpb24gPSAwOworICAgICAgCisgICAgICAvKiBDaGVjayBpZiB0aGUgcmVxdWVzdGVkIHRocmVhZCBvcHRpb24gaXMgY29tcGF0aWJsZSB0byB0aGUKKwkgdGhyZWFkIG9wdGlvbiB3ZSBhcmUgYWxyZWFkeSBjb21taXR0ZWQgdG8uICAqLworICAgICAgaWYgKGF0aF9vcHMpCisJb3B0aW9uID0gYXRoX29wcy0+b3B0aW9uOworCisgICAgICBpZiAoIW9wc19zZXQgJiYgR0VUX09QVElPTiAob3B0aW9uKSkKKwlyZXR1cm4gR1BHX0VSUl9OT1RfU1VQUE9SVEVEOworCisgICAgICBpZiAoR0VUX09QVElPTiAob3BzLm9wdGlvbikgPT0gQVRIX1RIUkVBRF9PUFRJT05fVVNFUgorCSAgfHwgR0VUX09QVElPTiAob3B0aW9uKSA9PSBBVEhfVEhSRUFEX09QVElPTl9VU0VSCisJICB8fCBHRVRfT1BUSU9OIChvcHMub3B0aW9uKSAhPSBHRVRfT1BUSU9OIChvcHRpb24pCisgICAgICAgICAgfHwgR0VUX1ZFUlNJT04gKG9wcy5vcHRpb24pICE9IEdFVF9WRVJTSU9OIChvcHRpb24pKQorCXJldHVybiBHUEdfRVJSX05PVF9TVVBQT1JURUQ7CisKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAKKyAgaWYgKGF0aF9vcHMpCisgICAgeworICAgICAgLyogSXQgaXMgY29udmVuaWVudCB0byBub3QgcmVxdWlyZSBERVNUUk9ZLiAgKi8KKyAgICAgIGlmICghYXRoX29wcy0+bXV0ZXhfaW5pdCB8fCAhYXRoX29wcy0+bXV0ZXhfbG9jaworCSAgfHwgIWF0aF9vcHMtPm11dGV4X3VubG9jaykKKwlyZXR1cm4gR1BHX0VSUl9JTlZfQVJHOworCisgICAgICBvcHMgPSAqYXRoX29wczsKKyAgICAgIG9wc19zZXQgPSAxOworICAgIH0KKyAgZWxzZQorICAgIG9wc19zZXQgPSAwOworCisgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQKK211dGV4X2luaXQgKGF0aF9tdXRleF90ICpsb2NrLCBpbnQganVzdF9jaGVjaykKK3sKKyAgaW50IGVyciA9IDA7CisKKyAgaWYgKGp1c3RfY2hlY2spCisgICAgKCpvcHMubXV0ZXhfbG9jaykgKCZjaGVja19pbml0X2xvY2spOworICBpZiAoKmxvY2sgPT0gQVRIX01VVEVYX0lOSVRJQUxJWkVSIHx8ICFqdXN0X2NoZWNrKQorICAgIGVyciA9ICgqb3BzLm11dGV4X2luaXQpIChsb2NrKTsKKyAgaWYgKGp1c3RfY2hlY2spCisgICAgKCpvcHMubXV0ZXhfdW5sb2NrKSAoJmNoZWNrX2luaXRfbG9jayk7CisgIHJldHVybiBlcnI7Cit9CisKKworaW50CithdGhfbXV0ZXhfaW5pdCAoYXRoX211dGV4X3QgKmxvY2spCit7CisgIGlmIChvcHNfc2V0KQorICAgIHJldHVybiBtdXRleF9pbml0IChsb2NrLCAwKTsKKworI2lmbmRlZiBOREVCVUcKKyAgKmxvY2sgPSBNVVRFWF9VTkxPQ0tFRDsKKyNlbmRpZgorICByZXR1cm4gMDsKK30KKworCitpbnQKK2F0aF9tdXRleF9kZXN0cm95IChhdGhfbXV0ZXhfdCAqbG9jaykKK3sKKyAgaWYgKG9wc19zZXQpCisgICAgeworICAgICAgaWYgKCFvcHMubXV0ZXhfZGVzdHJveSkKKwlyZXR1cm4gMDsKKworICAgICAgKCpvcHMubXV0ZXhfbG9jaykgKCZjaGVja19pbml0X2xvY2spOworICAgICAgaWYgKCpsb2NrID09IEFUSF9NVVRFWF9JTklUSUFMSVpFUikKKwl7CisJICAoKm9wcy5tdXRleF91bmxvY2spICgmY2hlY2tfaW5pdF9sb2NrKTsKKwkgIHJldHVybiAwOworCX0KKyAgICAgICgqb3BzLm11dGV4X3VubG9jaykgKCZjaGVja19pbml0X2xvY2spOworICAgICAgcmV0dXJuICgqb3BzLm11dGV4X2Rlc3Ryb3kpIChsb2NrKTsKKyAgICB9CisKKyNpZm5kZWYgTkRFQlVHCisgIGFzc2VydCAoKmxvY2sgPT0gTVVURVhfVU5MT0NLRUQpOworCisgICpsb2NrID0gTVVURVhfREVTVFJPWUVEOworI2VuZGlmCisgIHJldHVybiAwOworfQorCisKK2ludAorYXRoX211dGV4X2xvY2sgKGF0aF9tdXRleF90ICpsb2NrKQoreworICBpZiAob3BzX3NldCkKKyAgICB7CisgICAgICBpbnQgcmV0ID0gbXV0ZXhfaW5pdCAobG9jaywgMSk7CisgICAgICBpZiAocmV0KQorCXJldHVybiByZXQ7CisgICAgICByZXR1cm4gKCpvcHMubXV0ZXhfbG9jaykgKGxvY2spOworICAgIH0KKworI2lmbmRlZiBOREVCVUcKKyAgYXNzZXJ0ICgqbG9jayA9PSBNVVRFWF9VTkxPQ0tFRCk7CisKKyAgKmxvY2sgPSBNVVRFWF9MT0NLRUQ7CisjZW5kaWYKKyAgcmV0dXJuIDA7Cit9CisKKworaW50CithdGhfbXV0ZXhfdW5sb2NrIChhdGhfbXV0ZXhfdCAqbG9jaykKK3sKKyAgaWYgKG9wc19zZXQpCisgICAgeworICAgICAgaW50IHJldCA9IG11dGV4X2luaXQgKGxvY2ssIDEpOworICAgICAgaWYgKHJldCkKKwlyZXR1cm4gcmV0OworICAgICAgcmV0dXJuICgqb3BzLm11dGV4X3VubG9jaykgKGxvY2spOworICAgIH0KKworI2lmbmRlZiBOREVCVUcKKyAgYXNzZXJ0ICgqbG9jayA9PSBNVVRFWF9MT0NLRUQpOworCisgICpsb2NrID0gTVVURVhfVU5MT0NLRUQ7CisjZW5kaWYKKyAgcmV0dXJuIDA7Cit9CisKKworc3NpemVfdAorYXRoX3JlYWQgKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3QgbmJ5dGVzKQoreworICBpZiAob3BzX3NldCAmJiBvcHMucmVhZCkKKyAgICByZXR1cm4gKCpvcHMucmVhZCkgKGZkLCBidWYsIG5ieXRlcyk7CisgIGVsc2UKKyAgICByZXR1cm4gcmVhZCAoZmQsIGJ1ZiwgbmJ5dGVzKTsKK30KKworCitzc2l6ZV90CithdGhfd3JpdGUgKGludCBmZCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgbmJ5dGVzKQoreworICBpZiAob3BzX3NldCAmJiBvcHMud3JpdGUpCisgICAgcmV0dXJuICgqb3BzLndyaXRlKSAoZmQsIGJ1ZiwgbmJ5dGVzKTsKKyAgZWxzZQorICAgIHJldHVybiB3cml0ZSAoZmQsIGJ1ZiwgbmJ5dGVzKTsKK30KKworCitzc2l6ZV90CisjaWZkZWYgX1dJTjMyCithdGhfc2VsZWN0IChpbnQgbmZkLCB2b2lkICpyc2V0LCB2b2lkICp3c2V0LCB2b2lkICplc2V0LAorCSAgICBzdHJ1Y3QgdGltZXZhbCAqdGltZW91dCkKKyNlbHNlCithdGhfc2VsZWN0IChpbnQgbmZkLCBmZF9zZXQgKnJzZXQsIGZkX3NldCAqd3NldCwgZmRfc2V0ICplc2V0LAorCSAgICBzdHJ1Y3QgdGltZXZhbCAqdGltZW91dCkKKyNlbmRpZgoreworICBpZiAob3BzX3NldCAmJiBvcHMuc2VsZWN0KQorICAgIHJldHVybiAoKm9wcy5zZWxlY3QpIChuZmQsIHJzZXQsIHdzZXQsIGVzZXQsIHRpbWVvdXQpOworICBlbHNlCisjaWZkZWYgX1dJTjMyCisgICAgcmV0dXJuIC0xOworI2Vsc2UKKyAgICByZXR1cm4gc2VsZWN0IChuZmQsIHJzZXQsIHdzZXQsIGVzZXQsIHRpbWVvdXQpOworI2VuZGlmCit9CisKKyAKK3NzaXplX3QKK2F0aF93YWl0cGlkIChwaWRfdCBwaWQsIGludCAqc3RhdHVzLCBpbnQgb3B0aW9ucykKK3sKKyAgaWYgKG9wc19zZXQgJiYgb3BzLndhaXRwaWQpCisgICAgcmV0dXJuICgqb3BzLndhaXRwaWQpIChwaWQsIHN0YXR1cywgb3B0aW9ucyk7CisgIGVsc2UKKyNpZmRlZiBfV0lOMzIKKyAgICByZXR1cm4gLTE7CisjZWxzZQorICAgIHJldHVybiB3YWl0cGlkIChwaWQsIHN0YXR1cywgb3B0aW9ucyk7CisjZW5kaWYKK30KKworCitpbnQKKyNpZmRlZiBfV0lOMzIKK2F0aF9hY2NlcHQgKGludCBzLCB2b2lkICphZGRyLCBpbnQgKmxlbmd0aF9wdHIpCisjZWxzZQorYXRoX2FjY2VwdCAoaW50IHMsIHN0cnVjdCBzb2NrYWRkciAqYWRkciwgc29ja2xlbl90ICpsZW5ndGhfcHRyKQorI2VuZGlmCit7CisgIGlmIChvcHNfc2V0ICYmIG9wcy5hY2NlcHQpCisgICAgcmV0dXJuICgqb3BzLmFjY2VwdCkgKHMsIGFkZHIsIGxlbmd0aF9wdHIpOworICBlbHNlCisjaWZkZWYgX1dJTjMyCisgICAgcmV0dXJuIC0xOworI2Vsc2UKKyAgICByZXR1cm4gYWNjZXB0IChzLCBhZGRyLCBsZW5ndGhfcHRyKTsKKyNlbmRpZgorfQorCisKK2ludAorI2lmZGVmIF9XSU4zMgorYXRoX2Nvbm5lY3QgKGludCBzLCB2b2lkICphZGRyLCBpbnQgbGVuZ3RoKQorI2Vsc2UKK2F0aF9jb25uZWN0IChpbnQgcywgc3RydWN0IHNvY2thZGRyICphZGRyLCBzb2NrbGVuX3QgbGVuZ3RoKQorI2VuZGlmCit7CisgIGlmIChvcHNfc2V0ICYmIG9wcy5jb25uZWN0KQorICAgIHJldHVybiAoKm9wcy5jb25uZWN0KSAocywgYWRkciwgbGVuZ3RoKTsKKyAgZWxzZQorI2lmZGVmIF9XSU4zMgorICAgIHJldHVybiAtMTsKKyNlbHNlCisgICAgcmV0dXJuIGNvbm5lY3QgKHMsIGFkZHIsIGxlbmd0aCk7CisjZW5kaWYKK30KKworCitpbnQKKyNpZmRlZiBfV0lOMzIKK2F0aF9zZW5kbXNnIChpbnQgcywgY29uc3Qgdm9pZCAqbXNnLCBpbnQgZmxhZ3MpCisjZWxzZQorYXRoX3NlbmRtc2cgKGludCBzLCBjb25zdCBzdHJ1Y3QgbXNnaGRyICptc2csIGludCBmbGFncykKKyNlbmRpZgoreworICBpZiAob3BzX3NldCAmJiBvcHMuc2VuZG1zZykKKyAgICByZXR1cm4gKCpvcHMuc2VuZG1zZykgKHMsIG1zZywgZmxhZ3MpOworICBlbHNlCisjaWZkZWYgX1dJTjMyCisgICAgcmV0dXJuIC0xOworI2Vsc2UKKyAgICByZXR1cm4gc2VuZG1zZyAocywgbXNnLCBmbGFncyk7CisjZW5kaWYKK30KKworCitpbnQKKyNpZmRlZiBfV0lOMzIKK2F0aF9yZWN2bXNnIChpbnQgcywgdm9pZCAqbXNnLCBpbnQgZmxhZ3MpCisjZWxzZQorYXRoX3JlY3Ztc2cgKGludCBzLCBzdHJ1Y3QgbXNnaGRyICptc2csIGludCBmbGFncykKKyNlbmRpZgoreworICBpZiAob3BzX3NldCAmJiBvcHMucmVjdm1zZykKKyAgICByZXR1cm4gKCpvcHMucmVjdm1zZykgKHMsIG1zZywgZmxhZ3MpOworICBlbHNlCisjaWZkZWYgX1dJTjMyCisgICAgcmV0dXJuIC0xOworI2Vsc2UKKyAgICByZXR1cm4gcmVjdm1zZyAocywgbXNnLCBmbGFncyk7CisjZW5kaWYKK30KKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L3NyYy9hdGguaCBiL2xpYmdjcnlwdC0xLjQuNi9zcmMvYXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgxM2E0YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9zcmMvYXRoLmgKQEAgLTAsMCArMSwxNDAgQEAKKy8qIGF0aC5oIC0gVGhyZWFkLXNhZmVuZXNzIGxpYnJhcnkuCisgICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAKKyAgIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgCisgICBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIExpYmdjcnlwdDsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIEFUSF9ICisjZGVmaW5lIEFUSF9ICisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZWxzZQorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGdwZy1lcnJvci5oPgorCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4gIC8qIFJlcXVpcmVkIGJ5IEludGVyaXguICAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKwwKKy8qIERlZmluZSBfQVRIX0VYVF9TWU1fUFJFRklYIGlmIHlvdSB3YW50IHRvIGdpdmUgYWxsIGV4dGVybmFsIHN5bWJvbHMKKyAgIGEgcHJlZml4LiAgKi8KKyNkZWZpbmUgX0FUSF9FWFRfU1lNX1BSRUZJWCBfZ2NyeV8KKworI2lmZGVmIF9BVEhfRVhUX1NZTV9QUkVGSVgKKyNkZWZpbmUgX0FUSF9QUkVGSVgxKHgseSkgeCAjIyB5CisjZGVmaW5lIF9BVEhfUFJFRklYMih4LHkpIF9BVEhfUFJFRklYMSh4LHkpCisjZGVmaW5lIF9BVEhfUFJFRklYKHgpIF9BVEhfUFJFRklYMihfQVRIX0VYVF9TWU1fUFJFRklYLHgpCisjZGVmaW5lIGF0aF9pbnN0YWxsIF9BVEhfUFJFRklYKGF0aF9pbnN0YWxsKQorI2RlZmluZSBhdGhfaW5pdCBfQVRIX1BSRUZJWChhdGhfaW5pdCkKKyNkZWZpbmUgYXRoX211dGV4X2luaXQgX0FUSF9QUkVGSVgoYXRoX211dGV4X2luaXQpCisjZGVmaW5lIGF0aF9tdXRleF9kZXN0cm95IF9BVEhfUFJFRklYKGF0aF9tdXRleF9kZXN0cm95KQorI2RlZmluZSBhdGhfbXV0ZXhfbG9jayBfQVRIX1BSRUZJWChhdGhfbXV0ZXhfbG9jaykKKyNkZWZpbmUgYXRoX211dGV4X3VubG9jayBfQVRIX1BSRUZJWChhdGhfbXV0ZXhfdW5sb2NrKQorI2RlZmluZSBhdGhfcmVhZCBfQVRIX1BSRUZJWChhdGhfcmVhZCkKKyNkZWZpbmUgYXRoX3dyaXRlIF9BVEhfUFJFRklYKGF0aF93cml0ZSkKKyNkZWZpbmUgYXRoX3NlbGVjdCBfQVRIX1BSRUZJWChhdGhfc2VsZWN0KQorI2RlZmluZSBhdGhfd2FpdHBpZCBfQVRIX1BSRUZJWChhdGhfd2FpdHBpZCkKKyNkZWZpbmUgYXRoX2Nvbm5lY3QgX0FUSF9QUkVGSVgoYXRoX2Nvbm5lY3QpCisjZGVmaW5lIGF0aF9hY2NlcHQgX0FUSF9QUkVGSVgoYXRoX2FjY2VwdCkKKyNkZWZpbmUgYXRoX3NlbmRtc2cgX0FUSF9QUkVGSVgoYXRoX3NlbmRtc2cpCisjZGVmaW5lIGF0aF9yZWN2bXNnIF9BVEhfUFJFRklYKGF0aF9yZWN2bXNnKQorI2VuZGlmCisKKwwKK2VudW0gYXRoX3RocmVhZF9vcHRpb24KKyAgeworICAgIEFUSF9USFJFQURfT1BUSU9OX0RFRkFVTFQgPSAwLAorICAgIEFUSF9USFJFQURfT1BUSU9OX1VTRVIgPSAxLAorICAgIEFUSF9USFJFQURfT1BUSU9OX1BUSCA9IDIsCisgICAgQVRIX1RIUkVBRF9PUFRJT05fUFRIUkVBRCA9IDMKKyAgfTsKKworc3RydWN0IGF0aF9vcHMKK3sKKyAgLyogVGhlIE9QVElPTiBmaWVsZCBlbmNvZGVzIHRoZSB0aHJlYWQgbW9kZWwgYW5kIHRoZSB2ZXJzaW9uIG51bWJlcgorICAgICBvZiB0aGlzIHN0cnVjdHVyZS4gICAKKyAgICAgICBCaXRzICA3IC0gMCAgYXJlIHVzZWQgZm9yIHRoZSB0aHJlYWQgbW9kZWwKKyAgICAgICBCaXRzIDE1IC0gOCAgYXJlIHVzZWQgZm9yIHRoZSB2ZXJzaW9uIG51bWJlci4KKyAgKi8KKyAgdW5zaWduZWQgaW50IG9wdGlvbjsKKworICBpbnQgKCppbml0KSAodm9pZCk7CisgIGludCAoKm11dGV4X2luaXQpICh2b2lkICoqcHJpdik7CisgIGludCAoKm11dGV4X2Rlc3Ryb3kpICh2b2lkICpwcml2KTsKKyAgaW50ICgqbXV0ZXhfbG9jaykgKHZvaWQgKnByaXYpOworICBpbnQgKCptdXRleF91bmxvY2spICh2b2lkICpwcml2KTsKKyAgc3NpemVfdCAoKnJlYWQpIChpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IG5ieXRlcyk7CisgIHNzaXplX3QgKCp3cml0ZSkgKGludCBmZCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgbmJ5dGVzKTsKKyNpZmRlZiBfV0lOMzIKKyAgc3NpemVfdCAoKnNlbGVjdCkgKGludCBuZmQsIHZvaWQgKnJzZXQsIHZvaWQgKndzZXQsIHZvaWQgKmVzZXQsCisJCSAgICAgc3RydWN0IHRpbWV2YWwgKnRpbWVvdXQpOworICBzc2l6ZV90ICgqd2FpdHBpZCkgKHBpZF90IHBpZCwgaW50ICpzdGF0dXMsIGludCBvcHRpb25zKTsKKyAgaW50ICgqYWNjZXB0KSAoaW50IHMsIHZvaWQgICphZGRyLCBpbnQgKmxlbmd0aF9wdHIpOworICBpbnQgKCpjb25uZWN0KSAoaW50IHMsIHZvaWQgKmFkZHIsIGludCBsZW5ndGgpOworICBpbnQgKCpzZW5kbXNnKSAoaW50IHMsIGNvbnN0IHZvaWQgKm1zZywgaW50IGZsYWdzKTsKKyAgaW50ICgqcmVjdm1zZykgKGludCBzLCB2b2lkICptc2csIGludCBmbGFncyk7CisjZWxzZQorICBzc2l6ZV90ICgqc2VsZWN0KSAoaW50IG5mZCwgZmRfc2V0ICpyc2V0LCBmZF9zZXQgKndzZXQsIGZkX3NldCAqZXNldCwKKwkJICAgICBzdHJ1Y3QgdGltZXZhbCAqdGltZW91dCk7CisgIHNzaXplX3QgKCp3YWl0cGlkKSAocGlkX3QgcGlkLCBpbnQgKnN0YXR1cywgaW50IG9wdGlvbnMpOworICBpbnQgKCphY2NlcHQpIChpbnQgcywgc3RydWN0IHNvY2thZGRyICphZGRyLCBzb2NrbGVuX3QgKmxlbmd0aF9wdHIpOworICBpbnQgKCpjb25uZWN0KSAoaW50IHMsIHN0cnVjdCBzb2NrYWRkciAqYWRkciwgc29ja2xlbl90IGxlbmd0aCk7CisgIGludCAoKnNlbmRtc2cpIChpbnQgcywgY29uc3Qgc3RydWN0IG1zZ2hkciAqbXNnLCBpbnQgZmxhZ3MpOworICBpbnQgKCpyZWN2bXNnKSAoaW50IHMsIHN0cnVjdCBtc2doZHIgKm1zZywgaW50IGZsYWdzKTsKKyNlbmRpZgorfTsKKworZ3BnX2Vycl9jb2RlX3QgYXRoX2luc3RhbGwgKHN0cnVjdCBhdGhfb3BzICphdGhfb3BzLCBpbnQgY2hlY2tfb25seSk7CitpbnQgYXRoX2luaXQgKHZvaWQpOworCisKKy8qIEZ1bmN0aW9ucyBmb3IgbXV0dWFsIGV4Y2x1c2lvbi4gICovCit0eXBlZGVmIHZvaWQgKmF0aF9tdXRleF90OworI2RlZmluZSBBVEhfTVVURVhfSU5JVElBTElaRVIgMAorCitpbnQgYXRoX211dGV4X2luaXQgKGF0aF9tdXRleF90ICptdXRleCk7CitpbnQgYXRoX211dGV4X2Rlc3Ryb3kgKGF0aF9tdXRleF90ICptdXRleCk7CitpbnQgYXRoX211dGV4X2xvY2sgKGF0aF9tdXRleF90ICptdXRleCk7CitpbnQgYXRoX211dGV4X3VubG9jayAoYXRoX211dGV4X3QgKm11dGV4KTsKKworLyogUmVwbGFjZW1lbnQgZm9yIHRoZSBQT1NJWCBmdW5jdGlvbnMsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGFsbG93CisgICBvdGhlciAodXNlci1sZXZlbCkgdGhyZWFkcyB0byBydW4uICAqLworc3NpemVfdCBhdGhfcmVhZCAoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBuYnl0ZXMpOworc3NpemVfdCBhdGhfd3JpdGUgKGludCBmZCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgbmJ5dGVzKTsKKyNpZmRlZiBfV0lOMzIKK3NzaXplX3QgYXRoX3NlbGVjdCAoaW50IG5mZCwgdm9pZCAqcnNldCwgdm9pZCAqd3NldCwgdm9pZCAqZXNldCwKKwkJICAgIHN0cnVjdCB0aW1ldmFsICp0aW1lb3V0KTsKK3NzaXplX3QgYXRoX3dhaXRwaWQgKHBpZF90IHBpZCwgaW50ICpzdGF0dXMsIGludCBvcHRpb25zKTsKK2ludCBhdGhfYWNjZXB0IChpbnQgcywgdm9pZCAqYWRkciwgaW50ICpsZW5ndGhfcHRyKTsKK2ludCBhdGhfY29ubmVjdCAoaW50IHMsIHZvaWQgKmFkZHIsIGludCBsZW5ndGgpOworaW50IGF0aF9zZW5kbXNnIChpbnQgcywgY29uc3Qgdm9pZCAqbXNnLCBpbnQgZmxhZ3MpOworaW50IGF0aF9yZWN2bXNnIChpbnQgcywgdm9pZCAqbXNnLCBpbnQgZmxhZ3MpOworI2Vsc2UKK3NzaXplX3QgYXRoX3NlbGVjdCAoaW50IG5mZCwgZmRfc2V0ICpyc2V0LCBmZF9zZXQgKndzZXQsIGZkX3NldCAqZXNldCwKKwkJICAgIHN0cnVjdCB0aW1ldmFsICp0aW1lb3V0KTsKK3NzaXplX3QgYXRoX3dhaXRwaWQgKHBpZF90IHBpZCwgaW50ICpzdGF0dXMsIGludCBvcHRpb25zKTsKK2ludCBhdGhfYWNjZXB0IChpbnQgcywgc3RydWN0IHNvY2thZGRyICphZGRyLCBzb2NrbGVuX3QgKmxlbmd0aF9wdHIpOworaW50IGF0aF9jb25uZWN0IChpbnQgcywgc3RydWN0IHNvY2thZGRyICphZGRyLCBzb2NrbGVuX3QgbGVuZ3RoKTsKK2ludCBhdGhfc2VuZG1zZyAoaW50IHMsIGNvbnN0IHN0cnVjdCBtc2doZHIgKm1zZywgaW50IGZsYWdzKTsKK2ludCBhdGhfcmVjdm1zZyAoaW50IHMsIHN0cnVjdCBtc2doZHIgKm1zZywgaW50IGZsYWdzKTsKKyNlbmRpZiAKKworI2VuZGlmCS8qIEFUSF9IICovCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvc3JjL2NpcGhlci1wcm90by5oIGIvbGliZ2NyeXB0LTEuNC42L3NyYy9jaXBoZXItcHJvdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTUzMjM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L3NyYy9jaXBoZXItcHJvdG8uaApAQCAtMCwwICsxLDExNSBAQAorLyogY2lwaGVyLXByb3RvLmggLSBJbnRlcm5hbCBkZWNsYXJhdGlvbnMKKyAqCUNvcHlyaWdodCAoQykgMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBnZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworLyogVGhpcyBmaWxlIGhhcyBiZWVuIGZhY3RvcmVkIG91dCBmcm9tIGNpcGhlci5oIHNvIHRoYXQgaXQgY2FuIGJlCisgICB1c2VkIHN0YW5kYWxvbmUgaW4gdmlzaWJpbGl0eS5jIC4gKi8KKworI2lmbmRlZiBHMTBfQ0lQSEVSX1BST1RPX0gKKyNkZWZpbmUgRzEwX0NJUEhFUl9QUk9UT19ICisKKy8qIERlZmluaXRpb24gb2YgYSBmdW5jdGlvbiB1c2VkIHRvIHJlcG9ydCBzZWxmdGVzdCBmYWlsdXJlcy4gCisgICBET01BSU4gaXMgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZnVuY3Rpb24gYmxvY2s6CisgICAgICAgICAgImNpcGhlciIsICJkaWdlc3QiLCAicHVia2V5IG9yICJyYW5kb20iLAorICAgQUxHTyAgIGlzIHRoZSBhbGdvcml0aG0gdW5kZXIgdGVzdCwKKyAgIFdIQVQgICBpcyBhIHN0cmluZyBkZXNjcmliaW5nIHdoYXQgaGFzIGJlZW4gdGVzdGVkLAorICAgREVTQyAgIGlzIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGVycm9yLiAqLwordHlwZWRlZiB2b2lkICgqc2VsZnRlc3RfcmVwb3J0X2Z1bmNfdCkoY29uc3QgY2hhciAqZG9tYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsZ28sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqd2hhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycmRlc2MpOworCisvKiBEZWZpbml0aW9uIG9mIHRoZSBzZWxmdGVzdCBmdW5jdGlvbnMuICAqLwordHlwZWRlZiBncGdfZXJyX2NvZGVfdCAoKnNlbGZ0ZXN0X2Z1bmNfdCkKKyAgICAgKGludCBhbGdvLCBpbnQgZXh0ZW5kZWQsIHNlbGZ0ZXN0X3JlcG9ydF9mdW5jX3QgcmVwb3J0KTsKKworCisvKiBBbiBleHRlbmRlZCB0eXBlIG9mIHRoZSBnZW5lcmF0ZSBmdW5jdGlvbi4gICovCit0eXBlZGVmIGdjcnlfZXJyX2NvZGVfdCAoKnBrX2V4dF9nZW5lcmF0ZV90KQorICAgICAoaW50IGFsZ28sCisgICAgICB1bnNpZ25lZCBpbnQgbmJpdHMsCisgICAgICB1bnNpZ25lZCBsb25nIGV2YWx1ZSwKKyAgICAgIGdjcnlfc2V4cF90IGdlbnBhcm1zLAorICAgICAgZ2NyeV9tcGlfdCAqc2tleSwKKyAgICAgIGdjcnlfbXBpX3QgKipyZXRmYWN0b3JzLAorICAgICAgZ2NyeV9zZXhwX3QgKmV4dHJhaW5mbyk7CisKKy8qIFRoZSB0eXBlIHVzZWQgdG8gY29tcHV0ZSB0aGUga2V5Z3JpcC4gICovCit0eXBlZGVmIGdwZ19lcnJfY29kZV90ICgqcGtfY29tcF9rZXlncmlwX3QpCisgICAgIChnY3J5X21kX2hkX3QgbWQsIGdjcnlfc2V4cF90IGtleXBhcm0pOworCisvKiBUaGUgdHlwZSB1c2VkIHRvIHF1ZXJ0IEVDQyBjdXJ2ZSBwYXJhbWV0ZXJzLiAgKi8KK3R5cGVkZWYgZ2NyeV9lcnJfY29kZV90ICgqcGtfZ2V0X3BhcmFtX3QpCisgICAgIChjb25zdCBjaGFyICpuYW1lLCBnY3J5X21waV90ICpwa2V5KTsKKworLyogVGhlIHR5cGUgdXNlZCB0byBjb252ZXkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byBhIGNpcGhlci4gICovCit0eXBlZGVmIGdwZ19lcnJfY29kZV90ICgqY2lwaGVyX3NldF9leHRyYV9pbmZvX3QpCisgICAgICh2b2lkICpjLCBpbnQgd2hhdCwgY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnVmbGVuKTsKKworCisvKiBFeHRyYSBtb2R1bGUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmVzLiAgVGhlc2UgYXJlIHVzZWQgZm9yIGludGVybmFsCisgICBtb2R1bGVzIHdoaWNoIHByb3ZpZGUgbW9yZSBmdW5jdGlvbnMgdGhhbiBhdmFpbGFibGUgdGhyb3VnaCB0aGUKKyAgIHB1YmxpYyBhbGdvcml0aG0gcmVnaXN0ZXIgQVBJcy4gICovCit0eXBlZGVmIHN0cnVjdCBjaXBoZXJfZXh0cmFfc3BlYworeworICBzZWxmdGVzdF9mdW5jX3Qgc2VsZnRlc3Q7CisgIGNpcGhlcl9zZXRfZXh0cmFfaW5mb190IHNldF9leHRyYV9pbmZvOworfSBjaXBoZXJfZXh0cmFfc3BlY190OworCit0eXBlZGVmIHN0cnVjdCBtZF9leHRyYV9zcGVjCit7CisgIHNlbGZ0ZXN0X2Z1bmNfdCBzZWxmdGVzdDsKK30gbWRfZXh0cmFfc3BlY190OworCit0eXBlZGVmIHN0cnVjdCBwa19leHRyYV9zcGVjCit7CisgIHNlbGZ0ZXN0X2Z1bmNfdCBzZWxmdGVzdDsKKyAgcGtfZXh0X2dlbmVyYXRlX3QgZXh0X2dlbmVyYXRlOworICBwa19jb21wX2tleWdyaXBfdCBjb21wX2tleWdyaXA7CisgIHBrX2dldF9wYXJhbV90IGdldF9wYXJhbTsKK30gcGtfZXh0cmFfc3BlY190OworCisKKworLyogVGhlIHByaXZhdGUgcmVnaXN0ZXIgZnVuY3Rpb25zLiAqLworZ2NyeV9lcnJvcl90IF9nY3J5X2NpcGhlcl9yZWdpc3RlciAoZ2NyeV9jaXBoZXJfc3BlY190ICpjaXBoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaXBoZXJfZXh0cmFfc3BlY190ICpleHRyYXNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmFsZ29yaXRobV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfbW9kdWxlX3QgKm1vZHVsZSk7CitnY3J5X2Vycm9yX3QgX2djcnlfbWRfcmVnaXN0ZXIgKGdjcnlfbWRfc3BlY190ICpjaXBoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kX2V4dHJhX3NwZWNfdCAqZXh0cmFzcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmFsZ29yaXRobV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NyeV9tb2R1bGVfdCAqbW9kdWxlKTsKK2djcnlfZXJyb3JfdCBfZ2NyeV9wa19yZWdpc3RlciAoZ2NyeV9wa19zcGVjX3QgKmNpcGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGtfZXh0cmFfc3BlY190ICpleHRyYXNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqYWxnb3JpdGhtX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X21vZHVsZV90ICptb2R1bGUpOworCisvKiBUaGUgc2VsZnRlc3QgZnVuY3Rpb25zLiAgKi8KK2djcnlfZXJyb3JfdCBfZ2NyeV9jaXBoZXJfc2VsZnRlc3QgKGludCBhbGdvLCBpbnQgZXh0ZW5kZWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZnRlc3RfcmVwb3J0X2Z1bmNfdCByZXBvcnQpOworZ2NyeV9lcnJvcl90IF9nY3J5X21kX3NlbGZ0ZXN0IChpbnQgYWxnbywgaW50IGV4dGVuZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmdGVzdF9yZXBvcnRfZnVuY190IHJlcG9ydCk7CitnY3J5X2Vycm9yX3QgX2djcnlfcGtfc2VsZnRlc3QgKGludCBhbGdvLCBpbnQgZXh0ZW5kZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZ0ZXN0X3JlcG9ydF9mdW5jX3QgcmVwb3J0KTsKK2djcnlfZXJyb3JfdCBfZ2NyeV9obWFjX3NlbGZ0ZXN0IChpbnQgYWxnbywgaW50IGV4dGVuZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZ0ZXN0X3JlcG9ydF9mdW5jX3QgcmVwb3J0KTsKKworZ2NyeV9lcnJvcl90IF9nY3J5X3JhbmRvbV9zZWxmdGVzdCAoc2VsZnRlc3RfcmVwb3J0X2Z1bmNfdCByZXBvcnQpOworCisjZW5kaWYgLypHMTBfQ0lQSEVSX1BST1RPX0gqLwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L3NyYy9jaXBoZXIuaCBiL2xpYmdjcnlwdC0xLjQuNi9zcmMvY2lwaGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhiYWFiNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9zcmMvY2lwaGVyLmgKQEAgLTAsMCArMSwxMzkgQEAKKy8qIGNpcGhlci5oCisgKglDb3B5cmlnaHQgKEMpIDE5OTgsIDIwMDIsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgZ2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICovCisjaWZuZGVmIEcxMF9DSVBIRVJfSAorI2RlZmluZSBHMTBfQ0lQSEVSX0gKKworI2luY2x1ZGUgPGdjcnlwdC5oPgorCisjZGVmaW5lIERCR19DSVBIRVIgX2djcnlfZ2V0X2RlYnVnX2ZsYWcoIDEgKQorCisjaW5jbHVkZSAiLi4vcmFuZG9tL3JhbmRvbS5oIgorCisjZGVmaW5lIFBVQktFWV9GTEFHX05PX0JMSU5ESU5HICAgICgxIDw8IDApCisKKyNkZWZpbmUgQ0lQSEVSX0lORk9fTk9fV0VBS19LRVkgICAgMQorCisjaW5jbHVkZSAiY2lwaGVyLXByb3RvLmgiCisKKworLyotLSBybWQxNjAuYyAtLSovCit2b2lkIF9nY3J5X3JtZDE2MF9oYXNoX2J1ZmZlciAodm9pZCAqb3V0YnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCk7CisvKi0tIHNoYTEuYyAtLSovCit2b2lkIF9nY3J5X3NoYTFfaGFzaF9idWZmZXIgKHZvaWQgKm91dGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoKTsKKworLyotLSByaWpuZGFlbC5jIC0tKi8KK3ZvaWQgX2djcnlfYWVzX2NmYl9lbmMgKHZvaWQgKmNvbnRleHQsIHVuc2lnbmVkIGNoYXIgKml2LCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm91dGJ1ZiwgY29uc3Qgdm9pZCAqaW5idWYsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbmJsb2Nrcyk7Cit2b2lkIF9nY3J5X2Flc19jZmJfZGVjICh2b2lkICpjb250ZXh0LCB1bnNpZ25lZCBjaGFyICppdiwgCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvdXRidWZfYXJnLCBjb25zdCB2b2lkICppbmJ1Zl9hcmcsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbmJsb2Nrcyk7Cit2b2lkIF9nY3J5X2Flc19jYmNfZW5jICh2b2lkICpjb250ZXh0LCB1bnNpZ25lZCBjaGFyICppdiwgCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvdXRidWZfYXJnLCBjb25zdCB2b2lkICppbmJ1Zl9hcmcsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbmJsb2NrcywgaW50IGNiY19tYWMpOwordm9pZCBfZ2NyeV9hZXNfY2JjX2RlYyAodm9pZCAqY29udGV4dCwgdW5zaWduZWQgY2hhciAqaXYsIAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqb3V0YnVmX2FyZywgY29uc3Qgdm9pZCAqaW5idWZfYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5ibG9ja3MpOworCisKKy8qLS0gZHNhLmMgLS0qLwordm9pZCBfZ2NyeV9yZWdpc3Rlcl9wa19kc2FfcHJvZ3Jlc3MgKGdjcnlfaGFuZGxlcl9wcm9ncmVzc190IGNiYywgdm9pZCAqY2JfZGF0YSk7CisKKy8qLS0gZWxnYW1hbC5jIC0tKi8KK3ZvaWQgX2djcnlfcmVnaXN0ZXJfcGtfZWxnX3Byb2dyZXNzIChnY3J5X2hhbmRsZXJfcHJvZ3Jlc3NfdCBjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjYl9kYXRhKTsKKworCisvKi0tIGVjYy5jIC0tKi8KK3ZvaWQgX2djcnlfcmVnaXN0ZXJfcGtfZWNjX3Byb2dyZXNzIChnY3J5X2hhbmRsZXJfcHJvZ3Jlc3NfdCBjYmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2JfZGF0YSk7CisKKworLyotLSBwcmltZWdlbi5jIC0tKi8KK3ZvaWQgX2djcnlfcmVnaXN0ZXJfcHJpbWVnZW5fcHJvZ3Jlc3MgKGdjcnlfaGFuZGxlcl9wcm9ncmVzc190IGNiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2JfZGF0YSk7CisKKy8qLS0gcHVia2V5LmMgLS0qLworY29uc3QgY2hhciAqIF9nY3J5X3BrX2FsaWFzZWRfYWxnb19uYW1lIChpbnQgYWxnb3JpdGhtKTsKKworLyogRGVjbGFyYXRpb25zIGZvciB0aGUgY2lwaGVyIHNwZWNpZmljYXRpb25zLiAgKi8KK2V4dGVybiBnY3J5X2NpcGhlcl9zcGVjX3QgX2djcnlfY2lwaGVyX3NwZWNfYmxvd2Zpc2g7CitleHRlcm4gZ2NyeV9jaXBoZXJfc3BlY190IF9nY3J5X2NpcGhlcl9zcGVjX2RlczsKK2V4dGVybiBnY3J5X2NpcGhlcl9zcGVjX3QgX2djcnlfY2lwaGVyX3NwZWNfdHJpcGxlZGVzOworZXh0ZXJuIGdjcnlfY2lwaGVyX3NwZWNfdCBfZ2NyeV9jaXBoZXJfc3BlY19hcmNmb3VyOworZXh0ZXJuIGdjcnlfY2lwaGVyX3NwZWNfdCBfZ2NyeV9jaXBoZXJfc3BlY19jYXN0NTsKK2V4dGVybiBnY3J5X2NpcGhlcl9zcGVjX3QgX2djcnlfY2lwaGVyX3NwZWNfYWVzOworZXh0ZXJuIGdjcnlfY2lwaGVyX3NwZWNfdCBfZ2NyeV9jaXBoZXJfc3BlY19hZXMxOTI7CitleHRlcm4gZ2NyeV9jaXBoZXJfc3BlY190IF9nY3J5X2NpcGhlcl9zcGVjX2FlczI1NjsKK2V4dGVybiBnY3J5X2NpcGhlcl9zcGVjX3QgX2djcnlfY2lwaGVyX3NwZWNfdHdvZmlzaDsKK2V4dGVybiBnY3J5X2NpcGhlcl9zcGVjX3QgX2djcnlfY2lwaGVyX3NwZWNfdHdvZmlzaDEyODsKK2V4dGVybiBnY3J5X2NpcGhlcl9zcGVjX3QgX2djcnlfY2lwaGVyX3NwZWNfc2VycGVudDEyODsKK2V4dGVybiBnY3J5X2NpcGhlcl9zcGVjX3QgX2djcnlfY2lwaGVyX3NwZWNfc2VycGVudDE5MjsKK2V4dGVybiBnY3J5X2NpcGhlcl9zcGVjX3QgX2djcnlfY2lwaGVyX3NwZWNfc2VycGVudDI1NjsKK2V4dGVybiBnY3J5X2NpcGhlcl9zcGVjX3QgX2djcnlfY2lwaGVyX3NwZWNfcmZjMjI2OF80MDsKK2V4dGVybiBnY3J5X2NpcGhlcl9zcGVjX3QgX2djcnlfY2lwaGVyX3NwZWNfc2VlZDsKK2V4dGVybiBnY3J5X2NpcGhlcl9zcGVjX3QgX2djcnlfY2lwaGVyX3NwZWNfY2FtZWxsaWExMjg7CitleHRlcm4gZ2NyeV9jaXBoZXJfc3BlY190IF9nY3J5X2NpcGhlcl9zcGVjX2NhbWVsbGlhMTkyOworZXh0ZXJuIGdjcnlfY2lwaGVyX3NwZWNfdCBfZ2NyeV9jaXBoZXJfc3BlY19jYW1lbGxpYTI1NjsKKworZXh0ZXJuIGNpcGhlcl9leHRyYV9zcGVjX3QgX2djcnlfY2lwaGVyX2V4dHJhc3BlY190cmlwbGVkZXM7CitleHRlcm4gY2lwaGVyX2V4dHJhX3NwZWNfdCBfZ2NyeV9jaXBoZXJfZXh0cmFzcGVjX2FlczsKK2V4dGVybiBjaXBoZXJfZXh0cmFfc3BlY190IF9nY3J5X2NpcGhlcl9leHRyYXNwZWNfYWVzMTkyOworZXh0ZXJuIGNpcGhlcl9leHRyYV9zcGVjX3QgX2djcnlfY2lwaGVyX2V4dHJhc3BlY19hZXMyNTY7CisKKworLyogRGVjbGFyYXRpb25zIGZvciB0aGUgZGlnZXN0IHNwZWNpZmljYXRpb25zLiAgKi8KK2V4dGVybiBnY3J5X21kX3NwZWNfdCBfZ2NyeV9kaWdlc3Rfc3BlY19jcmMzMjsKK2V4dGVybiBnY3J5X21kX3NwZWNfdCBfZ2NyeV9kaWdlc3Rfc3BlY19jcmMzMl9yZmMxNTEwOworZXh0ZXJuIGdjcnlfbWRfc3BlY190IF9nY3J5X2RpZ2VzdF9zcGVjX2NyYzI0X3JmYzI0NDA7CitleHRlcm4gZ2NyeV9tZF9zcGVjX3QgX2djcnlfZGlnZXN0X3NwZWNfbWQ0OworZXh0ZXJuIGdjcnlfbWRfc3BlY190IF9nY3J5X2RpZ2VzdF9zcGVjX21kNTsKK2V4dGVybiBnY3J5X21kX3NwZWNfdCBfZ2NyeV9kaWdlc3Rfc3BlY19ybWQxNjA7CitleHRlcm4gZ2NyeV9tZF9zcGVjX3QgX2djcnlfZGlnZXN0X3NwZWNfc2hhMTsKK2V4dGVybiBnY3J5X21kX3NwZWNfdCBfZ2NyeV9kaWdlc3Rfc3BlY19zaGEyMjQ7CitleHRlcm4gZ2NyeV9tZF9zcGVjX3QgX2djcnlfZGlnZXN0X3NwZWNfc2hhMjU2OworZXh0ZXJuIGdjcnlfbWRfc3BlY190IF9nY3J5X2RpZ2VzdF9zcGVjX3NoYTUxMjsKK2V4dGVybiBnY3J5X21kX3NwZWNfdCBfZ2NyeV9kaWdlc3Rfc3BlY19zaGEzODQ7CitleHRlcm4gZ2NyeV9tZF9zcGVjX3QgX2djcnlfZGlnZXN0X3NwZWNfdGlnZXI7CitleHRlcm4gZ2NyeV9tZF9zcGVjX3QgX2djcnlfZGlnZXN0X3NwZWNfdGlnZXIxOworZXh0ZXJuIGdjcnlfbWRfc3BlY190IF9nY3J5X2RpZ2VzdF9zcGVjX3RpZ2VyMjsKK2V4dGVybiBnY3J5X21kX3NwZWNfdCBfZ2NyeV9kaWdlc3Rfc3BlY193aGlybHBvb2w7CisKK2V4dGVybiBtZF9leHRyYV9zcGVjX3QgX2djcnlfZGlnZXN0X2V4dHJhc3BlY19zaGExOworZXh0ZXJuIG1kX2V4dHJhX3NwZWNfdCBfZ2NyeV9kaWdlc3RfZXh0cmFzcGVjX3NoYTIyNDsKK2V4dGVybiBtZF9leHRyYV9zcGVjX3QgX2djcnlfZGlnZXN0X2V4dHJhc3BlY19zaGEyNTY7CitleHRlcm4gbWRfZXh0cmFfc3BlY190IF9nY3J5X2RpZ2VzdF9leHRyYXNwZWNfc2hhMzg0OworZXh0ZXJuIG1kX2V4dHJhX3NwZWNfdCBfZ2NyeV9kaWdlc3RfZXh0cmFzcGVjX3NoYTUxMjsKKworLyogRGVjbGFyYXRpb25zIGZvciB0aGUgcHVia2V5IGNpcGhlciBzcGVjaWZpY2F0aW9ucy4gICovCitleHRlcm4gZ2NyeV9wa19zcGVjX3QgX2djcnlfcHVia2V5X3NwZWNfcnNhOworZXh0ZXJuIGdjcnlfcGtfc3BlY190IF9nY3J5X3B1YmtleV9zcGVjX2VsZzsKK2V4dGVybiBnY3J5X3BrX3NwZWNfdCBfZ2NyeV9wdWJrZXlfc3BlY19kc2E7CitleHRlcm4gZ2NyeV9wa19zcGVjX3QgX2djcnlfcHVia2V5X3NwZWNfZWNkc2E7CisKK2V4dGVybiBwa19leHRyYV9zcGVjX3QgX2djcnlfcHVia2V5X2V4dHJhc3BlY19yc2E7IAorZXh0ZXJuIHBrX2V4dHJhX3NwZWNfdCBfZ2NyeV9wdWJrZXlfZXh0cmFzcGVjX2RzYTsgCitleHRlcm4gcGtfZXh0cmFfc3BlY190IF9nY3J5X3B1YmtleV9leHRyYXNwZWNfZWxnOyAKK2V4dGVybiBwa19leHRyYV9zcGVjX3QgX2djcnlfcHVia2V5X2V4dHJhc3BlY19lY2RzYTsgCisKKworI2VuZGlmIC8qRzEwX0NJUEhFUl9IKi8KZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9zcmMvZHVtcHNleHAuYyBiL2xpYmdjcnlwdC0xLjQuNi9zcmMvZHVtcHNleHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjVjMGQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L3NyYy9kdW1wc2V4cC5jCkBAIC0wLDAgKzEsNjEzIEBACisvKiBkdW1wc2V4cC5jIC0gRHVtcCBTLWV4cHJlc3Npb25zLgorICogQ29weXJpZ2h0IChDKSAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIEdldHJhbmRvbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwKKyAqIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogR2V0cmFuZG9tIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjZGVmaW5lIFBHTSAiZHVtcHNleHAiCisjZGVmaW5lIE1ZVkVSU0lPTl9MSU5FIFBHTSAiIChMaWJnY3J5cHQpICIgVkVSU0lPTgorI2RlZmluZSBCVUdSRVBPUlRfTElORSAiXG5SZXBvcnQgYnVncyB0byA8YnVnLWxpYmdjcnlwdEBnbnVwZy5vcmc+LlxuIgorCisKK3N0YXRpYyBpbnQgdmVyYm9zZTsgIC8qIFZlcmJvc2UgbW9kZS4gICovCitzdGF0aWMgaW50IGRlY2ltYWw7ICAvKiBQcmludCBhZGRyZXNzZXMgaW4gZGVjaW1hbC4gICovCitzdGF0aWMgaW50IGFzc3VtZV9oZXg7ICAvKiBBc3N1bWUgaW5wdXQgaXMgaGV4ZW5jb2RlZC4gICovCisKK3N0YXRpYyB2b2lkCitwcmludF92ZXJzaW9uIChpbnQgd2l0aF9oZWxwKQoreworICBmcHV0cyAoTVlWRVJTSU9OX0xJTkUgIlxuIgorICAgICAgICAgIkNvcHlyaWdodCAoQykgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy5cbiIKKyAgICAgICAgICJMaWNlbnNlIEdQTHYyKzogR05VIEdQTCB2ZXJzaW9uIDIgb3IgbGF0ZXIgIgorICAgICAgICAgIjxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbD5cbiIKKyAgICAgICAgICJUaGlzIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBhcmUgZnJlZSB0byBjaGFuZ2UgYW5kIHJlZGlzdHJpYnV0ZSBpdC5cbiIKKyAgICAgICAgICJUaGVyZSBpcyBOTyBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3LlxuIiwKKyAgICAgICAgIHN0ZG91dCk7CisgICAgICAgIAorICBpZiAod2l0aF9oZWxwKQorICAgIGZwdXRzICgiXG4iCisgICAgICAgICAgICJVc2FnZTogIiBQR00gIiBbT1BUSU9OU10gW2ZpbGVdXG4iCisgICAgICAgICAgICJEZWJ1ZyB0b29sIGZvciBTLWV4cHJlc3Npb25zXG4iCisgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgIiAgLS1kZWNpbWFsICAgICBQcmludCBvZmZzZXRzIHVzaW5nIGRlY2ltYWwgbm90YXRpb25cbiIKKyAgICAgICAgICAgIiAgLS1hc3N1bWUtaGV4ICBBc3N1bWUgaW5wdXQgaXMgYSBoZXggZHVtcFxuIgorICAgICAgICAgICAiICAtLXZlcmJvc2UgICAgIFNob3cgd2hhdCB3ZSBhcmUgZG9pbmdcbiIKKyAgICAgICAgICAgIiAgLS12ZXJzaW9uICAgICBQcmludCB2ZXJzaW9uIG9mIHRoZSBwcm9ncmFtIGFuZCBleGl0XG4iCisgICAgICAgICAgICIgIC0taGVscCAgICAgICAgRGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXRcbiIKKyAgICAgICAgICAgQlVHUkVQT1JUX0xJTkUsIHN0ZG91dCApOworICAKKyAgZXhpdCAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK3ByaW50X3VzYWdlICh2b2lkKQoreworICBmcHV0cyAoInVzYWdlOiAiIFBHTSAiIFtPUFRJT05TXSBOQllURVNcbiIsIHN0ZGVycik7CisgIGZwdXRzICgiICAgICAgICh1c2UgLS1oZWxwIHRvIGRpc3BsYXkgb3B0aW9ucylcbiIsIHN0ZGVycik7CisgIGV4aXQgKDEpOworfQorCisKKyNkZWZpbmUgc3BhY2VfcChhKSAgICAoKGEpPT0nICcgfHwgKGEpPT0nXG4nIHx8IChhKT09J1xyJyB8fCAoYSk9PSdcdCcpCisjZGVmaW5lIGRpZ2l0X3AoYSkgICAgKChhKSA+PSAnMCcgJiYgKGEpIDw9ICc5JykKKyNkZWZpbmUgb2N0ZGlnaXRfcChhKSAoKGEpID49ICcwJyAmJiAoYSkgPD0gJzcnKQorI2RlZmluZSBhbHBoYV9wKGEpICAgICggICAoKGEpID49ICdBJyAmJiAoYSkgPD0gJ1onKSAgXAorICAgICAgICAgICAgICAgICAgICAgICB8fCAoKGEpID49ICdhJyAmJiAoYSkgPD0gJ3onKSkKKyNkZWZpbmUgaGV4ZGlnaXRfcChhKSAoZGlnaXRfcCAoYSkgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoYSkgPj0gJ0EnICYmIChhKSA8PSAnRicpICBcCisgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoYSkgPj0gJ2EnICYmIChhKSA8PSAnZicpKQorI2RlZmluZSB4dG9pXzEoYSkgICAgICgoYSkgPD0gJzknPyAoKGEpLSAnMCcpOiBcCisgICAgICAgICAgICAgICAgICAgICAgIChhKSA8PSAnRic/ICgoYSktJ0EnKzEwKTooKGEpLSdhJysxMCkpCisKKworLyogUmV0dXJuIHRydWUgaWYgUCBwb2ludHMgdG8gYSBieXRlIGNvbnRhaW5pbmcgYSB3aGl0ZXNwYWNlIGFjY29yZGluZworICAgdG8gdGhlIFMtZXhwcmVzc2lvbnMgZGVmaW5pdGlvbi4gKi8KK3N0YXRpYyBpbmxpbmUgaW50Cit3aGl0ZXNwYWNlX3AgKGludCBjKQoreyAKKyAgc3dpdGNoIChjKQorICAgIHsKKyAgICBjYXNlICcgJzogY2FzZSAnXHQnOiBjYXNlICdcdic6IGNhc2UgJ1xmJzogY2FzZSAnXHInOiBjYXNlICdcbic6IHJldHVybiAxOworICAgIGRlZmF1bHQ6IHJldHVybiAwOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2xvZ2l0IChjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKyAgdmFfbGlzdCBhcmdfcHRyOworCisgIHZhX3N0YXJ0IChhcmdfcHRyLCBmb3JtYXQpIDsKKyAgZnB1dHMgKFBHTSAiOiAiLCBzdGRlcnIpOworICB2ZnByaW50ZiAoc3RkZXJyLCBmb3JtYXQsIGFyZ19wdHIpOworICBwdXRjICgnXG4nLCBzdGRlcnIpOworICB2YV9lbmQgKGFyZ19wdHIpOworfQorCisvKiBUaGUgcmF3IGRhdGEgYnVmZmVyIGFuZCBpdHMgY3VycmVudCBsZW5ndGggKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGRhdGFidWZmZXJbMTZdOworc3RhdGljIGludCBkYXRhYnVmZmVybGVuOworLyogVGhlIG51bWJlciBvZiBieXRlcyBpbiBkYXRhYnVmZmVyIHdoaWNoIHNob3VsZCBiZSBza2lwcGVkIGF0IGEgZmx1c2guICAqLworc3RhdGljIGludCBza2lwZGF0YWJ1ZmZlcmxlbjsKKy8qIFRoZSBudW1iZXIgb2YgcmF3IGJ5dGVzIHByaW50ZWQgb24gdGhlIGxhc3QgbGluZS4gICovCitzdGF0aWMgaW50IG5ieXRlc3ByaW50ZWQ7CisvKiBUaGUgZmlsZSBvZmZzZXQgb2YgdGhlIGN1cnJlbnQgZGF0YSBidWZmZXIgLiAgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGRhdGFidWZmZXJvZmZzZXQ7CisKKworCitzdGF0aWMgaW50CitteV9nZXRjIChGSUxFICpmcCkKK3sKKyAgaW50IGMxLCBjMjsKKworICBpZiAoIWFzc3VtZV9oZXgpCisgICAgcmV0dXJuIGdldGMgKGZwKTsKKworICB3aGlsZSAoIChjMT1nZXRjIChmcCkpICE9IEVPRiAmJiBzcGFjZV9wIChjMSkgKQorICAgIDsKKyAgaWYgKGMxID09IEVPRikKKyAgICByZXR1cm4gRU9GOworCisgIGlmICghaGV4ZGlnaXRfcCAoYzEpKQorICAgIHsKKyAgICAgIGxvZ2l0ICgibm9uIGhleC1kaWdpdCBlbmNvdW50ZXJlZFxuIik7CisgICAgICByZXR1cm4gRU9GOworICAgIH0KKworICB3aGlsZSAoIChjMj1nZXRjIChmcCkpICE9IEVPRiAmJiBzcGFjZV9wIChjMikgKQorICAgIDsKKyAgaWYgKGMyID09IEVPRikKKyAgICB7CisgICAgICBsb2dpdCAoImVycm9yIHJlYWRpbmcgc2Vjb25kIGhleCBuaWJibGVcbiIpOworICAgICAgcmV0dXJuIEVPRjsKKyAgICB9CisgIGlmICghaGV4ZGlnaXRfcCAoYzIpKQorICAgIHsKKyAgICAgIGxvZ2l0ICgic2Vjb25kIGhleCBuaWJibGUgaXMgbm90IGEgaGV4LWRpZ2l0XG4iKTsKKyAgICAgIHJldHVybiBFT0Y7CisgICAgfQorICByZXR1cm4geHRvaV8xIChjMSkgKiAxNiArIHh0b2lfMSAoYzIpOworfQorCisKKworCisKKy8qIEZsdXNoIHRoZSByYXcgZGF0YSBidWZmZXIuICAqLworc3RhdGljIHZvaWQKK2ZsdXNoZGF0YWJ1ZmZlciAodm9pZCkKK3sKKyAgaW50IGk7CisKKyAgaWYgKCFkYXRhYnVmZmVybGVuKQorICAgIHJldHVybjsKKyAgbmJ5dGVzcHJpbnRlZCA9IDA7CisgIGlmIChkZWNpbWFsKQorICAgIHByaW50ZiAoIiUwOGx1ICIsIGRhdGFidWZmZXJvZmZzZXQpOworICBlbHNlCisgICAgcHJpbnRmICgiJTA4bHggIiwgZGF0YWJ1ZmZlcm9mZnNldCk7CisgIGZvciAoaT0wOyBpIDwgZGF0YWJ1ZmZlcmxlbjsgaSsrKQorICAgIHsKKyAgICAgIGlmIChpID09IDgpCisgICAgICAgIHB1dGNoYXIgKCcgJyk7CisgICAgICBpZiAoaSA8IHNraXBkYXRhYnVmZmVybGVuKQorICAgICAgICBmcHV0cyAoIiAgICIsIHN0ZG91dCk7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGYgKCIgJTAyeCIsIGRhdGFidWZmZXJbaV0pOworICAgICAgICAgIGRhdGFidWZmZXJvZmZzZXQrKzsKKyAgICAgICAgfQorICAgICAgbmJ5dGVzcHJpbnRlZCsrOworICAgIH0KKyAgZm9yICg7IGkgPCBzaXplb2YgKGRhdGFidWZmZXIpOyBpKyspCisgICAgeworICAgICAgaWYgKGkgPT0gOCkKKyAgICAgICAgcHV0Y2hhciAoJyAnKTsKKyAgICAgIGZwdXRzICgiICAgIiwgc3Rkb3V0KTsKKyAgICB9CisgIGZwdXRzICgiICB8Iiwgc3Rkb3V0KTsKKyAgZm9yIChpPTA7IGkgPCBkYXRhYnVmZmVybGVuOyBpKyspCisgICAgeworICAgICAgaWYgKGkgPCBza2lwZGF0YWJ1ZmZlcmxlbikKKyAgICAgICAgcHV0Y2hhciAoJyAnKTsKKyAgICAgIGVsc2UgaWYgKGRhdGFidWZmZXJbaV0gPj0gJyAnICYmIGRhdGFidWZmZXJbaV0gPD0gJ34nCisgICAgICAgICAgICAgICAmJiBkYXRhYnVmZmVyW2ldICE9ICd8JykKKyAgICAgICAgcHV0Y2hhciAoZGF0YWJ1ZmZlcltpXSk7CisgICAgICBlbHNlCisgICAgICAgIHB1dGNoYXIgKCcuJyk7CisgICAgfQorICBwdXRjaGFyICgnfCcpOworICBwdXRjaGFyICgnXG4nKTsKKyAgZGF0YWJ1ZmZlcmxlbiA9IDA7CisgIHNraXBkYXRhYnVmZmVybGVuID0gMDsKK30KKworCisvKiBBZGQgQyB0byB0aGUgcmF3IGRhdGEgYnVmZmVyIGFuZCBmbHVzaCBhcyBuZWVkZWQuICAqLworc3RhdGljIHZvaWQKK2FkZHJhd2RhdGEgKGludCBjKQoreworICBpZiAoIGRhdGFidWZmZXJsZW4gPj0gc2l6ZW9mIGRhdGFidWZmZXIgKQorICAgIGZsdXNoZGF0YWJ1ZmZlciAoKTsKKyAgZGF0YWJ1ZmZlcltkYXRhYnVmZmVybGVuKytdID0gYzsKK30KKworCitzdGF0aWMgdm9pZCAKK3ByaW50Y3Vyc29yIChpbnQgYm90aCkKK3sKKyAgaW50IGk7CisgCisgIGZsdXNoZGF0YWJ1ZmZlciAoKTsKKyAgcHJpbnRmICgiJThzICIsICIiKTsKKyAgZm9yIChpPTA7IGkgPCBzaXplb2YgKGRhdGFidWZmZXIpOyBpKyspCisgICAgeworICAgICAgaWYgKGkgPT0gOCkKKyAgICAgICAgcHV0Y2hhciAoJyAnKTsKKyAgICAgIGlmIChpKzEgPT0gbmJ5dGVzcHJpbnRlZCkKKyAgICAgICAgeworICAgICAgICAgIGZwdXRzICgiIF4gIiwgc3Rkb3V0KTsKKyAgICAgICAgICBpZiAoIWJvdGgpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBmcHV0cyAoIiAgICIsIHN0ZG91dCk7CisgICAgfQorICBpZiAoYm90aCkKKyAgICB7CisgICAgICBmcHV0cyAoIiAgICIsIHN0ZG91dCk7CisgICAgICBmb3IgKGk9MDsgaSA8IG5ieXRlc3ByaW50ZWQtMTsgaSsrKQorICAgICAgICBwdXRjaGFyICgnICcpOworICAgICAgcHV0Y2hhciAoJ14nKTsKKyAgICB9CisgIGRhdGFidWZmZXJsZW4gPSBza2lwZGF0YWJ1ZmZlcmxlbiA9IG5ieXRlc3ByaW50ZWQ7Cit9CisKK3N0YXRpYyB2b2lkIAorcHJpbnRlcnIgKGNvbnN0IGNoYXIgKnRleHQpCit7CisgIHByaW50Y3Vyc29yICgxKTsKKyAgcHJpbnRmICgiXG4gICAgICAgICAgRXJyb3I6ICVzXG4iLCB0ZXh0KTsKK30KKworc3RhdGljIHZvaWQgCitwcmludGN0bCAoY29uc3QgY2hhciAqdGV4dCkKK3sKKyAgaWYgKHZlcmJvc2UpCisgICAgeworICAgICAgcHJpbnRjdXJzb3IgKDApOworICAgICAgcHJpbnRmICgiJXNcbiIsIHRleHQpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgCitwcmludGNociAoaW50IGMpCit7CisgICh2b2lkKWM7Cit9CisKK3N0YXRpYyB2b2lkCitwcmludGhleCAoaW50IGMpCit7CisgICh2b2lkKWM7Cit9CisKKworCisKKworCitzdGF0aWMgaW50CitwYXJzZV9hbmRfcHJpbnQgKEZJTEUgKmZwKQoreworICBzdGF0aWMgY29uc3QgY2hhciB0b2tlbmNoYXJzW10gPQorICAgICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIKKyAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiCisgICAgIjAxMjM0NTY3ODktLi9fOiorPSI7CisgIGludCBjOworICBpbnQgbGV2ZWwgPSAwOworICBpbnQgdG9rZW5jID0gMDsKKyAgaW50IGhleGNvdW50ID0gMDsKKyAgaW50IGRpc3BoaW50ID0gMDsKKyAgdW5zaWduZWQgbG9uZyBkYXRhbGVuID0gMDsKKyAgY2hhciBxdW90ZV9idWZbMTBdOworICBpbnQgcXVvdGVfaWR4ID0gMDsKKyAgZW51bSAKKyAgICB7CisgICAgICBJTklUX1NUQVRFID0gMCwgSU5fTlVNQkVSLCBQUkVfREFUQSwgSU5fREFUQSwgSU5fU1RSSU5HLAorICAgICAgSU5fRVNDQVBFLCBJTl9PQ1RfRVNDLCBJTl9IRVhfRVNDLAorICAgICAgQ1JfRVNDLCBMRl9FU0MsIElOX0hFWEZNVCwgSU5fQkFTRTY0CisgICAgfQorICBzdGF0ZSA9IElOSVRfU1RBVEU7CisgIAorCisgIHdoaWxlICgoYyA9IG15X2dldGMgKGZwKSkgIT0gRU9GICkKKyAgICB7CisgICAgICBhZGRyYXdkYXRhIChjKTsKKyAgICAgIHN3aXRjaCAoc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBJTklUX1NUQVRFOgorICAgICAgICAgIGlmICh0b2tlbmMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChzdHJjaHIgKHRva2VuY2hhcnMsIGMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHByaW50Y2hyIChjKTsKKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgdG9rZW5jID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgcGFyc2VfaW5pdF9zdGF0ZToKKyAgICAgICAgICBpZiAoYyA9PSAnKCcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChkaXNwaGludCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwcmludGVyciAoInVubWF0Y2hlZCBkaXNwbGF5IGhpbnQiKTsKKyAgICAgICAgICAgICAgICAgIGRpc3BoaW50ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHByaW50Y3RsICgib3BlbiIpOworICAgICAgICAgICAgICBsZXZlbCsrOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJyknKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoZGlzcGhpbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcHJpbnRlcnIgKCJ1bm1hdGNoZWQgZGlzcGxheSBoaW50Iik7CisgICAgICAgICAgICAgICAgICBkaXNwaGludCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBwcmludGN0bCAoImNsb3NlIik7CisgICAgICAgICAgICAgIGxldmVsLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnXCInKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBzdGF0ZSA9IElOX1NUUklORzsKKyAgICAgICAgICAgICAgcHJpbnRjdGwgKCJiZWdpbnN0cmluZyIpOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJyMnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBzdGF0ZSA9IElOX0hFWEZNVDsKKyAgICAgICAgICAgICAgaGV4Y291bnQgPSAwOworICAgICAgICAgICAgICBwcmludGN0bCAoImJlZ2luaGV4Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnfCcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHN0YXRlID0gSU5fQkFTRTY0OworICAgICAgICAgICAgICBwcmludGN0bCAoImJlZ2luYmFzZTY0Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnWycpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChkaXNwaGludCkKKyAgICAgICAgICAgICAgICBwcmludGVyciAoIm5lc3RlZCBkaXNwbGF5IGhpbnQiKTsKKyAgICAgICAgICAgICAgZGlzcGhpbnQgPSBjOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJ10nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoIWRpc3BoaW50KQorICAgICAgICAgICAgICAgIHByaW50ZXJyICgibm8gb3BlbiBkaXNwbGF5IGhpbnQiKTsKKyAgICAgICAgICAgICAgZGlzcGhpbnQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoYyA9PSAnMCcpCisgICAgICAgICAgICAgICAgcHJpbnRlcnIgKCJ6ZXJvIHByZWZpeGVkIGxlbmd0aCIpOworICAgICAgICAgICAgICBzdGF0ZSA9IElOX05VTUJFUjsKKyAgICAgICAgICAgICAgZGF0YWxlbiA9IChjIC0gJzAnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChzdHJjaHIgKHRva2VuY2hhcnMsIGMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBwcmludGNociAoYyk7CisgICAgICAgICAgICAgIHRva2VuYyA9IGM7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAod2hpdGVzcGFjZV9wIChjKSkKKyAgICAgICAgICAgIDsKKyAgICAgICAgICBlbHNlIGlmIChjID09ICd7JykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcHJpbnRlcnIgKCJyZXNjYW5uaW5nIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChjID09ICcmJyB8fCBjID09ICdcXCcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHByaW50ZXJyICgicmVzZXJ2ZWQgcHVuY3R1YXRpb24gZGV0ZWN0ZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHByaW50ZXJyICgiYmFkIGNoYXJhY3RlciBkZXRlY3RlZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSU5fTlVNQkVSOgorICAgICAgICAgIGlmIChkaWdpdF9wIChjKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyB0bXAgPSBkYXRhbGVuICogMTAgKyAoYyAtICcwJyk7CisgICAgICAgICAgICAgIGlmICh0bXAgPCBkYXRhbGVuKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHByaW50ZXJyICgib3ZlcmZsb3cgaW4gZGF0YSBsZW5ndGgiKTsKKyAgICAgICAgICAgICAgICAgIHN0YXRlID0gSU5JVF9TVEFURTsKKyAgICAgICAgICAgICAgICAgIGRhdGFsZW4gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGRhdGFsZW4gPSB0bXA7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnOicpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICghZGF0YWxlbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwcmludGVyciAoIm5vIGRhdGEgbGVuZ3RoIik7CisgICAgICAgICAgICAgICAgICBzdGF0ZSA9IElOSVRfU1RBVEU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc3RhdGUgPSBQUkVfREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChjID09ICdcIicgfHwgYyA9PSAnIycgfHwgYyA9PSAnfCcgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBXZSBpZ25vcmUgdGhlIG9wdGlvbmFsIGxlbmd0aCBhbmQgZGl2ZXJ0IHRvIHRoZSBpbml0CisgICAgICAgICAgICAgICAgIHN0YXRlIHBhcnNlciBjb2RlLiAqLworICAgICAgICAgICAgICBnb3RvIHBhcnNlX2luaXRfc3RhdGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJpbnRlcnIgKCJpbnZhbGlkIGxlbmd0aCBzcGVjaWZpY2F0aW9uIik7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBQUkVfREFUQToKKyAgICAgICAgICBzdGF0ZSA9IElOX0RBVEE7CisgICAgICAgICAgcHJpbnRjdGwgKCJiZWdpbmRhdGEiKTsKKyAgICAgICAgY2FzZSBJTl9EQVRBOgorICAgICAgICAgIGlmIChkYXRhbGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBwcmludGhleCAoYyk7CisgICAgICAgICAgICAgIGRhdGFsZW4tLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoIWRhdGFsZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHN0YXRlID0gSU5JVF9TVEFURTsKKyAgICAgICAgICAgICAgcHJpbnRjdGwgKCJlbmRkYXRhIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJTl9TVFJJTkc6CisgICAgICAgICAgaWYgKGMgPT0gJ1wiJykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcHJpbnRjdGwgKCJlbmRzdHJpbmciKTsKKyAgICAgICAgICAgICAgc3RhdGUgPSBJTklUX1NUQVRFOworICAgICAgICAgICAgfSAKKyAgICAgICAgICBlbHNlIGlmIChjID09ICdcXCcpCisgICAgICAgICAgICBzdGF0ZSA9IElOX0VTQ0FQRTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBwcmludGNociAoYyk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJTl9FU0NBUEU6CisgICAgICAgICAgc3dpdGNoIChjKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSAnYic6IGNhc2UgJ3QnOiBjYXNlICd2JzogY2FzZSAnbic6IGNhc2UgJ2YnOgorICAgICAgICAgICAgY2FzZSAncic6IGNhc2UgJyInOiBjYXNlICdcJyc6IGNhc2UgJ1xcJzoKKyAgICAgICAgICAgICAgcHJpbnRoZXggKGMpOworICAgICAgICAgICAgICBzdGF0ZSA9IElOX1NUUklORzsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOgorICAgICAgICAgICAgY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzoKKyAgICAgICAgICAgICAgc3RhdGUgPSBJTl9PQ1RfRVNDOworICAgICAgICAgICAgICBxdW90ZV9pZHggPSAwOworICAgICAgICAgICAgICBxdW90ZV9idWZbcXVvdGVfaWR4KytdID0gYzsgCisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhc2UgJ3gnOgorICAgICAgICAgICAgICBzdGF0ZSA9IElOX0hFWF9FU0M7CisgICAgICAgICAgICAgIHF1b3RlX2lkeCA9IDA7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhc2UgJ1xyJzoKKyAgICAgICAgICAgICAgc3RhdGUgPSBDUl9FU0M7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhc2UgJ1xuJzoKKyAgICAgICAgICAgICAgc3RhdGUgPSBMRl9FU0M7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBwcmludGVyciAoImludmFsaWQgZXNjYXBlIHNlcXVlbmNlIik7CisgICAgICAgICAgICAgIHN0YXRlID0gSU5fU1RSSU5HOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgY2FzZSBJTl9PQ1RfRVNDOiAKKyAgICAgICAgICBzdGF0ZSA9IElOX1NUUklORzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJTl9IRVhfRVNDOiAKKyAgICAgICAgICBzdGF0ZSA9IElOX1NUUklORzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDUl9FU0M6CisgICAgICAgICAgc3RhdGUgPSBJTl9TVFJJTkc7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTEZfRVNDOgorICAgICAgICAgIHN0YXRlID0gSU5fU1RSSU5HOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSU5fSEVYRk1UOgorICAgICAgICAgIGlmIChoZXhkaWdpdF9wIChjKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcHJpbnRjaHIgKGMpOworICAgICAgICAgICAgICBoZXhjb3VudCsrOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJyMnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoKGhleGNvdW50ICYgMSkpCisgICAgICAgICAgICAgICAgcHJpbnRlcnIgKCJvZGQgbnVtYmVyIG9mIGhleCBkaWdpdHMiKTsKKyAgICAgICAgICAgICAgcHJpbnRjdGwgKCJlbmRoZXgiKTsKKyAgICAgICAgICAgICAgc3RhdGUgPSBJTklUX1NUQVRFOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKCF3aGl0ZXNwYWNlX3AgKGMpKQorICAgICAgICAgICAgcHJpbnRlcnIgKCJiYWQgaGV4IGNoYXJhY3RlciIpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSU5fQkFTRTY0OgorICAgICAgICAgIGlmIChjID09ICd8JykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcHJpbnRjdGwgKCJlbmRiYXNlNjQiKTsKKyAgICAgICAgICAgICAgc3RhdGUgPSBJTklUX1NUQVRFOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaW50Y2hyIChjKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGxvZ2l0ICgiaW52YWxpZCBzdGF0ZSAlZCBkZXRlY3RlZCIsIHN0YXRlKTsKKyAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgfQorICAgIH0KKyAgZmx1c2hkYXRhYnVmZmVyICgpOworICBpZiAoZmVycm9yIChmcCkpCisgICAgeworICAgICAgbG9naXQgKCJlcnJvciByZWFkaW5nIGlucHV0OiAlc1xuIiwgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICByZXR1cm4gMDsKK30KKworCisKK2ludCAKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgaW50IHJjOworCisgIGlmIChhcmdjKQorICAgIHsKKyAgICAgIGFyZ2MtLTsgYXJndisrOworICAgIH0KKyAgd2hpbGUgKGFyZ2MgJiYgKiphcmd2ID09ICctJyAmJiAoKmFyZ3YpWzFdID09ICctJykKKyAgICB7CisgICAgICBpZiAoISgqYXJndilbMl0pCisgICAgICAgIHsKKyAgICAgICAgICBhcmdjLS07IGFyZ3YrKzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3YsICItLXZlcnNpb24iKSkKKyAgICAgICAgcHJpbnRfdmVyc2lvbiAoMCk7CisgICAgICBlbHNlIGlmICghc3RyY21wICgqYXJndiwgIi0taGVscCIpKQorICAgICAgICBwcmludF92ZXJzaW9uICgxKTsKKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKCphcmd2LCAiLS12ZXJib3NlIikpCisgICAgICAgIHsKKyAgICAgICAgICBhcmdjLS07IGFyZ3YrKzsKKyAgICAgICAgICB2ZXJib3NlID0gMTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3YsICItLWRlY2ltYWwiKSkKKyAgICAgICAgeworICAgICAgICAgIGFyZ2MtLTsgYXJndisrOworICAgICAgICAgIGRlY2ltYWwgPSAxOworICAgICAgICB9CisgICAgICBlbHNlIGlmICghc3RyY21wICgqYXJndiwgIi0tYXNzdW1lLWhleCIpKQorICAgICAgICB7CisgICAgICAgICAgYXJnYy0tOyBhcmd2Kys7CisgICAgICAgICAgYXNzdW1lX2hleCA9IDE7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcHJpbnRfdXNhZ2UgKCk7CisgICAgfSAgICAgICAgICAKKworICBpZiAoIWFyZ2MpCisgICAgeworICAgICAgcmMgPSBwYXJzZV9hbmRfcHJpbnQgKHN0ZGluKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmb3IgKDsgYXJnYzsgYXJnYy0tKQorICAgICAgICB7CisgICAgICAgICAgRklMRSAqZnAgPSBmb3BlbiAoKmFyZ3YsICJyYiIpOworICAgICAgICAgIGlmICghZnApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGxvZ2l0ICgiY2FuJ3Qgb3BlbiBgJXMnOiAlc1xuIiwgKmFyZ3YsIHN0cmVycm9yIChlcnJubykpOworICAgICAgICAgICAgICByYyA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKCBwYXJzZV9hbmRfcHJpbnQgKGZwKSApCisgICAgICAgICAgICAgICAgcmMgPSAxOworICAgICAgICAgICAgICBmY2xvc2UgKGZwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgCisKKyAgcmV0dXJuICFyYzsKK30KKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L3NyYy9maXBzLmMgYi9saWJnY3J5cHQtMS40LjYvc3JjL2ZpcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWYzMDQyCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L3NyYy9maXBzLmMKQEAgLTAsMCArMSw4NTIgQEAKKy8qIGZpcHMuYyAtIEZJUFMgbW9kZSBtYW5hZ2VtZW50CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmZGVmIEVOQUJMRV9ITUFDX0JJTkFSWV9DSEVDSworIyBpbmNsdWRlIDxkbGZjbi5oPiAKKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTTE9HCisjIGluY2x1ZGUgPHN5c2xvZy5oPgorI2VuZGlmIC8qSEFWRV9TWVNMT0cqLworCisjaW5jbHVkZSAiZzEwbGliLmgiCisjaW5jbHVkZSAiYXRoLmgiCisjaW5jbHVkZSAiY2lwaGVyLXByb3RvLmgiCisjaW5jbHVkZSAiaG1hYzI1Ni5oIgorCisKKy8qIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHVzZWQgdG8gZm9jZSBsaWJnY3J5cHQgaW50byBmaXBzIG1vZGUuICovCisjZGVmaW5lIEZJUFNfRk9SQ0VfRklMRSAiL2V0Yy9nY3J5cHQvZmlwc19lbmFibGVkIgorCisKKy8qIFRoZSBzdGF0ZXMgb2YgdGhlIGZpbml0ZSBzdGF0ZSBtYWNoaW5lIHVzZWQgaW4gZmlwcyBtb2RlLiAgKi8KK2VudW0gbW9kdWxlX3N0YXRlcyAKKyAgeworICAgIC8qIFBPV0VST0ZGIGNhbm5vdCBiZSByZXByZXNlbnRlZC4gICovCisgICAgU1RBVEVfUE9XRVJPTiAgPSAwLAorICAgIFNUQVRFX0lOSVQsCisgICAgU1RBVEVfU0VMRlRFU1QsCisgICAgU1RBVEVfT1BFUkFUSU9OQUwsCisgICAgU1RBVEVfRVJST1IsCisgICAgU1RBVEVfRkFUQUxFUlJPUiwKKyAgICBTVEFURV9TSFVURE9XTgorICB9OworCisKKy8qIEZsYWcgdGVsbGluZyB3aGV0aGVyIHdlIGFyZSBpbiBmaXBzIG1vZGUuICBJdCB1c2VzIGludmVyc2UgbG9naWMgc28KKyAgIHRoYXQgZmlwcyBtb2RlIGlzIHRoZSBkZWZhdWx0IHVubGVzcyBjaGFuZ2VkIGJ5IHRoZSBpbnRpYWxpemF0aW9uCisgICBjb2RlLiBUbyBjaGVjayB3aGV0aGVyIGZpcHMgbW9kZSBpcyBlbmFibGVkLCB1c2UgdGhlIGZ1bmN0aW9uCisgICBmaXBzX21vZGUoKSEgKi8KK3N0YXRpYyBpbnQgbm9fZmlwc19tb2RlX3JlcXVpcmVkOworCisvKiBGbGFnIHRvIGluZGljYXRlIHRoYXQgd2UgYXJlIGluIHRoZSBlbmZvcmNlZCBGSVBTIG1vZGUuICAqLworc3RhdGljIGludCBlbmZvcmNlZF9maXBzX21vZGU7CisKKy8qIElmIHRoaXMgZmxhZyBpcyBzZXQsIHRoZSBhcHBsaWNhdGlvbiBtYXkgbm8gbG9uZ2VyIGFzc3VtZSB0aGF0IHRoZQorICAgcHJvY2VzcyBpcyBydW5uaW5nIGluIEZJUFMgbW9kZS4gIFRoaXMgZmxhZyBpcyBwcm90ZWN0ZWQgYnkgdGhlCisgICBGU01fTE9DSy4gICovCitzdGF0aWMgaW50IGluYWN0aXZlX2ZpcHNfbW9kZTsKKworLyogVGhpcyBpcyB0aGUgbG9jayB3ZSB1c2UgdG8gcHJvdGVjdCB0aGUgRlNNLiAgKi8KK3N0YXRpYyBhdGhfbXV0ZXhfdCBmc21fbG9jayA9IEFUSF9NVVRFWF9JTklUSUFMSVpFUjsKKworLyogVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIEZTTS4gIFRoZSB3aG9sZSBzdGF0ZSBtYWNoaW5lcnkgaXMgb25seQorICAgdXNlZCB3aGlsZSBpbiBmaXBzIG1vZGUuIENoYW5nZSB0aGlzIG9ubHkgd2hpbGUgaG9sZGluZyBmc21fbG9jay4gKi8KK3N0YXRpYyBlbnVtIG1vZHVsZV9zdGF0ZXMgY3VycmVudF9zdGF0ZTsKKworCisKKworDAorc3RhdGljIHZvaWQgZmlwc19uZXdfc3RhdGUgKGVudW0gbW9kdWxlX3N0YXRlcyBuZXdfc3RhdGUpOworCisKKwwKKy8qIENvbnZlcnQgbG93ZXJjYXNlIGhleCBkaWdpdHM7IGFzc3VtZXMgdmFsaWQgaGV4IGRpZ2l0cy4gKi8KKyNkZWZpbmUgbG94dG9pXzEocCkgICAoKihwKSA8PSAnOSc/ICgqKHApLSAnMCcpOiAoKihwKS0nYScrMTApKQorI2RlZmluZSBsb3h0b2lfMihwKSAgICgobG94dG9pXzEocCkgKiAxNikgKyBsb3h0b2lfMSgocCkrMSkpCisKKy8qIFJldHVybnMgdHJ1ZSBpZiBQIHBvaW50cyB0byBhIGxvd2VyY2FzZSBoZXggZGlnaXQuICovCisjZGVmaW5lIGxveGRpZ2l0X3AocCkgISFzdHJjaHIgKCIwMTIzNDU2Nzg5MGFiY2RlZiIsICoocCkpCisKKworDAorLyogQ2hlY2sgd2hldGhlciB0aGUgT1MgaXMgaW4gRklQUyBtb2RlIGFuZCByZWNvcmQgdGhhdCBpbiBhIG1vZHVsZQorICAgbG9jYWwgdmFyaWFibGUuICBJZiBGT1JDRSBpcyBwYXNzZWQgYXMgdHJ1ZSwgZmlwcyBtb2RlIHdpbGwgYmUKKyAgIGVuYWJsZWQgYW55d2F5LiBOb3RlOiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCB0aHJlYWQtc2FmZSBhbmQgc2hvdWxkCisgICBiZSBjYWxsZWQgYmVmb3JlIGFueSB0aHJlYWRzIGFyZSBjcmVhdGVkLiAgVGhpcyBmdW5jdGlvbiBtYXkgb25seQorICAgYmUgY2FsbGVkIG9uY2UuICAqLwordm9pZAorX2djcnlfaW5pdGlhbGl6ZV9maXBzX21vZGUgKGludCBmb3JjZSkKK3sKKyAgc3RhdGljIGludCBkb25lOworICBncGdfZXJyb3JfdCBlcnI7CisgICAgICAKKyAgLyogTWFrZSBzdXJlIHdlIGFyZSBub3QgYWNjaWRlbnRseSBjYWxsZWQgdHdpY2UuICAqLworICBpZiAoZG9uZSkKKyAgICB7CisgICAgICBpZiAoIGZpcHNfbW9kZSAoKSApCisgICAgICAgIHsKKyAgICAgICAgICBmaXBzX25ld19zdGF0ZSAoU1RBVEVfRkFUQUxFUlJPUik7CisgICAgICAgICAgZmlwc19ub3JldHVybiAoKTsKKyAgICAgICAgfQorICAgICAgLyogSWYgbm90IGluIGZpcHMgbW9kZSBhbiBhc3NlcnQgaXMgc3VmZmljaWVudC4gICovCisgICAgICBnY3J5X2Fzc2VydCAoIWRvbmUpOworICAgIH0KKyAgZG9uZSA9IDE7CisKKyAgLyogSWYgdGhlIGNhbGxpbmcgYXBwbGljYXRpb24gZXhwbGljaXRseSByZXF1ZXN0ZWQgZmlwc21vZGUsIGRvIHNvLiAgKi8KKyAgaWYgKGZvcmNlKQorICAgIHsKKyAgICAgIGdjcnlfYXNzZXJ0ICghbm9fZmlwc19tb2RlX3JlcXVpcmVkKTsKKyAgICAgIGdvdG8gbGVhdmU7CisgICAgfQorCisgIC8qIEZvciB0ZXN0aW5nIHRoZSBzeXN0ZW0gaXQgaXMgdXNlZnVsIHRvIG92ZXJyaWRlIHRoZSBzeXN0ZW0KKyAgICAgcHJvdmlkZWQgZGV0ZWN0aW9uIG9mIHRoZSBGSVBTIG1vZGUgYW5kIGZvcmNlIEZJUFMgbW9kZSB1c2luZyBhCisgICAgIGZpbGUuICBUaGUgZmlsZW5hbWUgaXMgaGFyZHdpcmVkIHNvIHRoYXQgdGhlcmUgd29uJ3QgYmUgYW55CisgICAgIGNvbmZ1c2lvbiBvbiB3aGV0aGVyIC9ldGMvZ2NyeXB0LyBvciAvdXNyL2xvY2FsL2V0Yy9nY3J5cHQvIGlzCisgICAgIGFjdHVhbGx5IHVzZWQuICBUaGUgZmlsZSBpdHNlbGYgbWF5IGJlIGVtcHR5LiAgKi8KKyAgaWYgKCAhYWNjZXNzIChGSVBTX0ZPUkNFX0ZJTEUsIEZfT0spICkKKyAgICB7CisgICAgICBnY3J5X2Fzc2VydCAoIW5vX2ZpcHNfbW9kZV9yZXF1aXJlZCk7CisgICAgICBnb3RvIGxlYXZlOworICAgIH0KKworICAvKiBDaGVja2luZyBiYXNlZCBvbiAvcHJvYyBmaWxlIHByb3BlcnRpZXMuICAqLworICB7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgcHJvY2ZuYW1lW10gPSAiL3Byb2Mvc3lzL2NyeXB0by9maXBzX2VuYWJsZWQiOworICAgIEZJTEUgKmZwOworICAgIGludCBzYXZlZF9lcnJubzsKKworICAgIGZwID0gZm9wZW4gKHByb2NmbmFtZSwgInIiKTsKKyAgICBpZiAoZnApCisgICAgICB7CisgICAgICAgIGNoYXIgbGluZVsyNTZdOworICAgICAgICAKKyAgICAgICAgaWYgKGZnZXRzIChsaW5lLCBzaXplb2YgbGluZSwgZnApICYmIGF0b2kgKGxpbmUpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFN5c3RlbSBpcyBpbiBmaXBzIG1vZGUuICAqLworICAgICAgICAgICAgZmNsb3NlIChmcCk7CisgICAgICAgICAgICBnY3J5X2Fzc2VydCAoIW5vX2ZpcHNfbW9kZV9yZXF1aXJlZCk7CisgICAgICAgICAgICBnb3RvIGxlYXZlOworICAgICAgICAgIH0KKyAgICAgICAgZmNsb3NlIChmcCk7CisgICAgICB9CisgICAgZWxzZSBpZiAoKHNhdmVkX2Vycm5vID0gZXJybm8pICE9IEVOT0VOVAorICAgICAgICAgICAgICYmIHNhdmVkX2Vycm5vICE9IEVBQ0NFUworICAgICAgICAgICAgICYmICFhY2Nlc3MgKCIvcHJvYy92ZXJzaW9uIiwgRl9PSykgKQorICAgICAgeworICAgICAgICAvKiBQcm9ibGVtIHJlYWRpbmcgdGhlIGZpcHMgZmlsZSBkZXNwaXRlIHRoYXQgd2UgaGF2ZSB0aGUgcHJvYworICAgICAgICAgICBmaWxlIHN5c3RlbS4gIFdlIGJldHRlciBzdG9wIHJpZ2h0IGF3YXkuICovCisgICAgICAgIGxvZ19pbmZvICgiRkFUQUw6IGVycm9yIHJlYWRpbmcgYCVzJyBpbiBsaWJnY3J5cHQ6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgcHJvY2ZuYW1lLCBzdHJlcnJvciAoc2F2ZWRfZXJybm8pKTsKKyNpZmRlZiBIQVZFX1NZU0xPRworICAgICAgICBzeXNsb2cgKExPR19VU0VSfExPR19FUlIsICJMaWJnY3J5cHQgZXJyb3I6ICIKKyAgICAgICAgICAgICAgICAicmVhZGluZyBgJXMnIGZhaWxlZDogJXMgLSBhYm9ydCIsCisgICAgICAgICAgICAgICAgcHJvY2ZuYW1lLCBzdHJlcnJvciAoc2F2ZWRfZXJybm8pKTsKKyNlbmRpZiAvKkhBVkVfU1lTTE9HKi8KKyAgICAgICAgYWJvcnQgKCk7CisgICAgICB9CisgIH0KKyAgCisgIC8qIEZpcHMgbm90IG5vdCByZXF1ZXN0ZWQsIHNldCBmbGFnLiAgKi8KKyAgbm9fZmlwc19tb2RlX3JlcXVpcmVkID0gMTsKKworIGxlYXZlOgorICBpZiAoIW5vX2ZpcHNfbW9kZV9yZXF1aXJlZCkKKyAgICB7CisgICAgICAvKiBZZXMsIHdlIGFyZSBpbiBGSVBTIG1vZGUuICAqLworICAgICAgRklMRSAqZnA7CisKKyAgICAgIC8qIEludGl0aWFsaXplIHRoZSBsb2NrIHRvIHByb3RlY3QgdGhlIEZTTS4gICovCisgICAgICBlcnIgPSBhdGhfbXV0ZXhfaW5pdCAoJmZzbV9sb2NrKTsKKyAgICAgIGlmIChlcnIpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBJZiB0aGF0IGZhaWxzIHdlIGNhbid0IGRvIGFueXRoaW5nIGJ1dCBhYm9ydCB0aGUKKyAgICAgICAgICAgICBwcm9jZXNzLiBXZSBuZWVkIHRvIHVzZSBsb2dfaW5mbyBzbyB0aGF0IHRoZSBGU00gd29uJ3QKKyAgICAgICAgICAgICBnZXQgaW52b2x2ZWQuICAqLworICAgICAgICAgIGxvZ19pbmZvICgiRkFUQUw6IGZhaWxlZCB0byBjcmVhdGUgdGhlIEZTTSBsb2NrIGluIGxpYmdjcnlwdDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvciAoZXJyKSk7CisjaWZkZWYgSEFWRV9TWVNMT0cKKyAgICAgICAgICBzeXNsb2cgKExPR19VU0VSfExPR19FUlIsICJMaWJnY3J5cHQgZXJyb3I6ICIKKyAgICAgICAgICAgICAgICAgICJjcmVhdGluZyBGU00gbG9jayBmYWlsZWQ6ICVzIC0gYWJvcnQiLAorICAgICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycikpOworI2VuZGlmIC8qSEFWRV9TWVNMT0cqLworICAgICAgICAgIGFib3J0ICgpOworICAgICAgICB9CisKKyAgICAgIAorICAgICAgLyogSWYgdGhlIEZJUFMgZm9yY2UgZmlsZXMgZXhpc3RzLCBpcyByZWFkYWJsZSBhbmQgaGFzIGEgbnVtYmVyCisgICAgICAgICAhPSAwIG9uIGl0cyBmaXJzdCBsaW5lLCB3ZSBlbmFibGUgdGhlIGVuZm9yY2VkIGZpcHMgbW9kZS4gICovCisgICAgICBmcCA9IGZvcGVuIChGSVBTX0ZPUkNFX0ZJTEUsICJyIik7CisgICAgICBpZiAoZnApCisgICAgICAgIHsKKyAgICAgICAgICBjaGFyIGxpbmVbMjU2XTsKKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoZmdldHMgKGxpbmUsIHNpemVvZiBsaW5lLCBmcCkgJiYgYXRvaSAobGluZSkpCisgICAgICAgICAgICBlbmZvcmNlZF9maXBzX21vZGUgPSAxOworICAgICAgICAgIGZjbG9zZSAoZnApOworICAgICAgICB9CisKKyAgICAgIC8qIE5vdyBnZXQgdXMgaW50byB0aGUgSU5JVCBzdGF0ZS4gICovCisgICAgICBmaXBzX25ld19zdGF0ZSAoU1RBVEVfSU5JVCk7CisgICAgICAKKyAgICB9CisgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2xvY2tfZnNtICh2b2lkKQoreworICBncGdfZXJyb3JfdCBlcnI7CisKKyAgZXJyID0gYXRoX211dGV4X2xvY2sgKCZmc21fbG9jayk7CisgIGlmIChlcnIpCisgICAgeworICAgICAgbG9nX2luZm8gKCJGQVRBTDogZmFpbGVkIHRvIGFjcXVpcmUgdGhlIEZTTSBsb2NrIGluIGxpYmdyeXB0OiAlc1xuIiwgCisgICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycikpOworI2lmZGVmIEhBVkVfU1lTTE9HCisgICAgICBzeXNsb2cgKExPR19VU0VSfExPR19FUlIsICJMaWJnY3J5cHQgZXJyb3I6ICIKKyAgICAgICAgICAgICAgImFjcXVpcmluZyBGU00gbG9jayBmYWlsZWQ6ICVzIC0gYWJvcnQiLAorICAgICAgICAgICAgICBzdHJlcnJvciAoZXJyKSk7CisjZW5kaWYgLypIQVZFX1NZU0xPRyovCisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCit1bmxvY2tfZnNtICh2b2lkKQoreworICBncGdfZXJyb3JfdCBlcnI7CisKKyAgZXJyID0gYXRoX211dGV4X3VubG9jayAoJmZzbV9sb2NrKTsKKyAgaWYgKGVycikKKyAgICB7CisgICAgICBsb2dfaW5mbyAoIkZBVEFMOiBmYWlsZWQgdG8gcmVsZWFzZSB0aGUgRlNNIGxvY2sgaW4gbGliZ3J5cHQ6ICVzXG4iLAorICAgICAgICAgICAgICAgIHN0cmVycm9yIChlcnIpKTsKKyNpZmRlZiBIQVZFX1NZU0xPRworICAgICAgc3lzbG9nIChMT0dfVVNFUnxMT0dfRVJSLCAiTGliZ2NyeXB0IGVycm9yOiAiCisgICAgICAgICAgICAgICJyZWxlYXNpbmcgRlNNIGxvY2sgZmFpbGVkOiAlcyAtIGFib3J0IiwKKyAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycikpOworI2VuZGlmIC8qSEFWRV9TWVNMT0cqLworICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCisKKy8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIGZpcHMgbW9kZSBpcyBlbmFibGVkLiAgVGhpcyBpcworICAgaW5kZXBlbmRlbnQgb2YgdGhlIGZpcHMgcmVxdWlyZWQgZmluaXRlIHN0YXRlIG1hY2hpbmUgYW5kIG9ubHkgdXNlZAorICAgdG8gZW5hYmxlIGZpcHMgc3BlY2lmaWMgY29kZS4gIFBsZWFzZSB1c2UgdGhlIGZpcHNfbW9kZSBtYWNybworICAgaW5zdGVhZCBvZiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gZGlyZWN0bHkuICovCitpbnQKK19nY3J5X2ZpcHNfbW9kZSAodm9pZCkKK3sKKyAgLyogTm8gbG9ja2luZyBpcyByZXF1aXJlZCBiZWNhdXNlIHdlIGhhdmUgdGhlIHJlcXVpcmVtZW50IHRoYXQgdGhpcworICAgICB2YXJpYWJsZSBpcyBvbmx5IGluaXRpYWxpemVkIG9uY2Ugd2l0aCBubyBvdGhlciB0aHJlYWRzCisgICAgIGV4aXN0aW5nLiAgKi8KKyAgcmV0dXJuICFub19maXBzX21vZGVfcmVxdWlyZWQ7Cit9CisKKworLyogUmV0dXJuIGEgZmxhZyB0ZWxsaW5nIHdoZXRoZXIgd2UgYXJlIGluIHRoZSBlbmZvcmNlZCBmaXBzIG1vZGUuICAqLworaW50IAorX2djcnlfZW5mb3JjZWRfZmlwc19tb2RlICh2b2lkKQoreworICByZXR1cm4gZW5mb3JjZWRfZmlwc19tb2RlOworfQorCisKKy8qIElmIHdlIGRvIG5vdCB3YW50IHRvIGVuZm9yY2UgdGhlIGZpcHMgbW9kZSwgd2UgY2FuIHNldCBhIGZsYWcgc28KKyAgIHRoYXQgdGhlIGFwcGxpY2F0aW9uIG1heSBjaGVjayB3aGV0aGVyIGl0IGlzIHN0aWxsIGluIGZpcHMgbW9kZS4KKyAgIFRFWFQgd2lsbCBiZSBwcmludGVkIGFzIHBhcnQgb2YgYSBzeXNsb2cgbWVzc2FnZS4gIFRoaXMgZnVuY3Rpb24KKyAgIG1heSBvbmx5IGJlIGJlIGNhbGxlZCBpZiBpbiBmaXBzIG1vZGUuICovCit2b2lkCitfZ2NyeV9pbmFjdGl2YXRlX2ZpcHNfbW9kZSAoY29uc3QgY2hhciAqdGV4dCkKK3sKKyAgZ2NyeV9hc3NlcnQgKF9nY3J5X2ZpcHNfbW9kZSAoKSk7CisKKyAgaWYgKF9nY3J5X2VuZm9yY2VkX2ZpcHNfbW9kZSAoKSApCisgICAgeworICAgICAgLyogR2V0IHVzIGludG8gdGhlIGVycm9yIHN0YXRlLiAqLworICAgICAgZmlwc19zaWduYWxfZXJyb3IgKHRleHQpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBsb2NrX2ZzbSAoKTsKKyAgaWYgKCFpbmFjdGl2ZV9maXBzX21vZGUpCisgICAgeworICAgICAgaW5hY3RpdmVfZmlwc19tb2RlID0gMTsKKyAgICAgIHVubG9ja19mc20gKCk7CisjaWZkZWYgSEFWRV9TWVNMT0cKKyAgICAgIHN5c2xvZyAoTE9HX1VTRVJ8TE9HX1dBUk5JTkcsICJMaWJnY3J5cHQgd2FybmluZzogIgorICAgICAgICAgICAgICAiJXMgLSBGSVBTIG1vZGUgaW5hY3RpdmF0ZWQiLCB0ZXh0KTsKKyNlbmRpZiAvKkhBVkVfU1lTTE9HKi8KKyAgICB9CisgIGVsc2UKKyAgICB1bmxvY2tfZnNtICgpOworfQorCisKKy8qIFJldHVybiB0aGUgRklQUyBtb2RlIGluYWN0aXZlIGZsYWcuICBJZiBpdCBpcyB0cnVlIHRoZSBGSVBTIG1vZGUgaXMKKyAgIG5vdCBhbnltb3JlIGFjdGl2ZS4gICovCitpbnQKK19nY3J5X2lzX2ZpcHNfbW9kZV9pbmFjdGl2ZSAodm9pZCkKK3sKKyAgaW50IGZsYWc7CisKKyAgaWYgKCFfZ2NyeV9maXBzX21vZGUgKCkpCisgICAgcmV0dXJuIDA7CisgIGxvY2tfZnNtICgpOworICBmbGFnID0gaW5hY3RpdmVfZmlwc19tb2RlOworICB1bmxvY2tfZnNtICgpOworICByZXR1cm4gZmxhZzsKK30KKworCisKK3N0YXRpYyBjb25zdCBjaGFyICoKK3N0YXRlMnN0ciAoZW51bSBtb2R1bGVfc3RhdGVzIHN0YXRlKQoreworICBjb25zdCBjaGFyICpzOworCisgIHN3aXRjaCAoc3RhdGUpCisgICAgeworICAgIGNhc2UgU1RBVEVfUE9XRVJPTjogICAgIHMgPSAiUG93ZXItT24iOyBicmVhazsKKyAgICBjYXNlIFNUQVRFX0lOSVQ6ICAgICAgICBzID0gIkluaXQiOyBicmVhazsKKyAgICBjYXNlIFNUQVRFX1NFTEZURVNUOiAgICBzID0gIlNlbGYtVGVzdCI7IGJyZWFrOworICAgIGNhc2UgU1RBVEVfT1BFUkFUSU9OQUw6IHMgPSAiT3BlcmF0aW9uYWwiOyBicmVhazsKKyAgICBjYXNlIFNUQVRFX0VSUk9SOiAgICAgICBzID0gIkVycm9yIjsgYnJlYWs7CisgICAgY2FzZSBTVEFURV9GQVRBTEVSUk9SOiAgcyA9ICJGYXRhbC1FcnJvciI7IGJyZWFrOworICAgIGNhc2UgU1RBVEVfU0hVVERPV046ICAgIHMgPSAiU2h1dGRvd24iOyBicmVhazsKKyAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICBzID0gIj8iOyBicmVhazsKKyAgICB9CisgIHJldHVybiBzOworfQorCisKKy8qIFJldHVybiB0cnVlIGlmIHRoZSBsaWJyYXJ5IGlzIGluIHRoZSBvcGVyYXRpb25hbCBzdGF0ZS4gICovCitpbnQgCitfZ2NyeV9maXBzX2lzX29wZXJhdGlvbmFsICh2b2lkKQoreworICBpbnQgcmVzdWx0OworCisgIGlmICghZmlwc19tb2RlICgpKQorICAgIHJlc3VsdCA9IDE7CisgIGVsc2UKKyAgICB7CisgICAgICBsb2NrX2ZzbSAoKTsKKyAgICAgIGlmIChjdXJyZW50X3N0YXRlID09IFNUQVRFX0lOSVQpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBJZiB3ZSBhcmUgc3RpbGwgaW4gdGhlIElOSVQgc3RhdGUsIHdlIG5lZWQgdG8gcnVuIHRoZQorICAgICAgICAgICAgIHNlbGZ0ZXN0cyBzbyB0aGF0IHRoZSBGU00gY2FuIGV2ZW50dWFsbHkgZ2V0IGludG8KKyAgICAgICAgICAgICBvcGVyYXRpb25hbCBzdGF0ZS4gIEdpdmVuIHRoYXQgd2Ugd291bGQgbmVlZCBhIDItcGhhc2UKKyAgICAgICAgICAgICBpbml0aWFsaXphdGlvbiBvZiBsaWJnY3J5cHQsIGJ1dCB0aGF0IGhhcyB0cmFkaXRpb25hbGx5CisgICAgICAgICAgICAgbm90IGJlZW4gZW5mb3JjZWQsIHdlIHVzZSB0aGlzIG9uIGRlbWFuZCBzZWxmLXRlc3QKKyAgICAgICAgICAgICBjaGVja2luZy4gIE5vdGUgdGhhdCBQcm9wZXIgYXBwbGljYXRpb25zIHdvdWxkIGRvIHRoZQorICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHNwZWNpZmljIGxpYmdjcnlwdCBpbml0aWFsaXphdGlvbiBiZXR3ZWVuIGEKKyAgICAgICAgICAgICBnY3J5X2NoZWNrX3ZlcnNpb24oKSBhbmQgZ2NyeV9jb250cm9sCisgICAgICAgICAgICAgKEdDUllDVExfSU5JVElBTElaQVRJT05fRklOSVNIRUQpIHdoZXJlIHRoZSBsYXR0ZXIgd2lsbAorICAgICAgICAgICAgIHJ1biB0aGUgc2VsZnRlc3RzLiAgVGhlIGRyYXdiYWNrIG9mIHRoZXNlIG9uLWRlbWFuZAorICAgICAgICAgICAgIHNlbGYtdGVzdHMgYXJlIGEgc21hbGwgY2hhbmNlIHRoYXQgc2VsZi10ZXN0cyBhcmUKKyAgICAgICAgICAgICBwZXJmb3JtZWQgYnkgc2V2ZXJlYWwgdGhyZWFkczsgdGhhdCBpcyBubyBwcm9ibGVtIGJlY2F1c2UKKyAgICAgICAgICAgICBvdXIgRlNNIG1ha2Ugc3VyZSB0aGF0IHdlIHdvbid0IG92ZXJzZWUgYW55IGVycm9yLiAqLworICAgICAgICAgIHVubG9ja19mc20gKCk7CisgICAgICAgICAgX2djcnlfZmlwc19ydW5fc2VsZnRlc3RzICgwKTsKKyAgICAgICAgICBsb2NrX2ZzbSAoKTsKKyAgICAgICAgfQorCisgICAgICByZXN1bHQgPSAoY3VycmVudF9zdGF0ZSA9PSBTVEFURV9PUEVSQVRJT05BTCk7CisgICAgICB1bmxvY2tfZnNtICgpOworICAgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKiBUaGlzIGlzIHRlc3Qgb24gd2V0aGVyIHRoZSBsaWJyYXJ5IGlzIGluIHRoZSBvcGVyYXRpb25hbCBzdGF0ZS4gIEluCisgICBjb250cmFzdCB0byBfZ2NyeV9maXBzX2lzX29wZXJhdGlvbmFsIHRoaXMgZnVuY3Rpb24gd29uJ3QgZG8gYQorICAgc3RhdGUgdHJhbnNpdGlvbiBvbiB0aGUgZmx5LiAgKi8KK2ludAorX2djcnlfZmlwc190ZXN0X29wZXJhdGlvbmFsICh2b2lkKQoreworICBpbnQgcmVzdWx0OworCisgIGlmICghZmlwc19tb2RlICgpKQorICAgIHJlc3VsdCA9IDE7CisgIGVsc2UKKyAgICB7CisgICAgICBsb2NrX2ZzbSAoKTsKKyAgICAgIHJlc3VsdCA9IChjdXJyZW50X3N0YXRlID09IFNUQVRFX09QRVJBVElPTkFMKTsKKyAgICAgIHVubG9ja19mc20gKCk7CisgICAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisKKy8qIFRoaXMgaXMgYSB0ZXN0IG9uIHdoZXRoZXIgdGhlIGxpYnJhcnkgaXMgaW4gdGhlIGVycm9yIG9yCisgICBvcGVyYXRpb25hbCBzdGF0ZS4gKi8KK2ludAorX2djcnlfZmlwc190ZXN0X2Vycm9yX29yX29wZXJhdGlvbmFsICh2b2lkKQoreworICBpbnQgcmVzdWx0OworCisgIGlmICghZmlwc19tb2RlICgpKQorICAgIHJlc3VsdCA9IDE7CisgIGVsc2UKKyAgICB7CisgICAgICBsb2NrX2ZzbSAoKTsKKyAgICAgIHJlc3VsdCA9IChjdXJyZW50X3N0YXRlID09IFNUQVRFX09QRVJBVElPTkFMCisgICAgICAgICAgICAgICAgfHwgY3VycmVudF9zdGF0ZSA9PSBTVEFURV9FUlJPUik7CisgICAgICB1bmxvY2tfZnNtICgpOworICAgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMgdm9pZAorcmVwb3J0ZXIgKGNvbnN0IGNoYXIgKmRvbWFpbiwgaW50IGFsZ28sIGNvbnN0IGNoYXIgKndoYXQsIGNvbnN0IGNoYXIgKmVycnR4dCkKK3sKKyAgaWYgKCFlcnJ0eHQgJiYgIV9nY3J5X2xvZ192ZXJib3NpdHkgKDIpKQorICAgIHJldHVybjsKKworICBsb2dfaW5mbyAoImxpYmdjcnlwdCBzZWxmdGVzdDogJXMgJXMlcyAoJWQpOiAlcyVzJXMlc1xuIiwKKyAgICAgICAgICAgICFzdHJjbXAgKGRvbWFpbiwgImhtYWMiKT8gImRpZ2VzdCI6ZG9tYWluLAorICAgICAgICAgICAgIXN0cmNtcCAoZG9tYWluLCAiaG1hYyIpPyAiSE1BQy0iOiIiLAorICAgICAgICAgICAgIXN0cmNtcCAoZG9tYWluLCAiY2lwaGVyIik/IF9nY3J5X2NpcGhlcl9hbGdvX25hbWUgKGFsZ28pIDoKKyAgICAgICAgICAgICFzdHJjbXAgKGRvbWFpbiwgImRpZ2VzdCIpPyBfZ2NyeV9tZF9hbGdvX25hbWUgKGFsZ28pIDoKKyAgICAgICAgICAgICFzdHJjbXAgKGRvbWFpbiwgImhtYWMiKT8gICBfZ2NyeV9tZF9hbGdvX25hbWUgKGFsZ28pIDoKKyAgICAgICAgICAgICFzdHJjbXAgKGRvbWFpbiwgInB1YmtleSIpPyBfZ2NyeV9wa19hbGdvX25hbWUgKGFsZ28pIDogIiIsCisgICAgICAgICAgICBhbGdvLCBlcnJ0eHQ/IGVycnR4dDoiT2theSIsIAorICAgICAgICAgICAgd2hhdD8iICgiOiIiLCB3aGF0PyB3aGF0OiIiLCB3aGF0PyIpIjoiIik7IAorfQorCisvKiBSdW4gc2VsZi10ZXN0cyBmb3IgYWxsIHJlcXVpcmVkIGNpcGhlciBhbGdvcml0aG1zLiAgUmV0dXJuIDAgb24KKyAgIHN1Y2Nlc3MuICovCitzdGF0aWMgaW50CitydW5fY2lwaGVyX3NlbGZ0ZXN0cyAoaW50IGV4dGVuZGVkKQoreworICBzdGF0aWMgaW50IGFsZ29zW10gPSAKKyAgICB7CisgICAgICBHQ1JZX0NJUEhFUl8zREVTLAorICAgICAgR0NSWV9DSVBIRVJfQUVTMTI4LAorICAgICAgR0NSWV9DSVBIRVJfQUVTMTkyLAorICAgICAgR0NSWV9DSVBIRVJfQUVTMjU2LAorICAgICAgMAorICAgIH07CisgIGludCBpZHg7CisgIGdwZ19lcnJvcl90IGVycjsKKyAgaW50IGFueWVyciA9IDA7CisKKyAgZm9yIChpZHg9MDsgYWxnb3NbaWR4XTsgaWR4KyspCisgICAgeworICAgICAgZXJyID0gX2djcnlfY2lwaGVyX3NlbGZ0ZXN0IChhbGdvc1tpZHhdLCBleHRlbmRlZCwgcmVwb3J0ZXIpOworICAgICAgcmVwb3J0ZXIgKCJjaXBoZXIiLCBhbGdvc1tpZHhdLCBOVUxMLAorICAgICAgICAgICAgICAgIGVycj8gZ3BnX3N0cmVycm9yIChlcnIpOk5VTEwpOworICAgICAgaWYgKGVycikKKyAgICAgICAgYW55ZXJyID0gMTsKKyAgICB9CisgIHJldHVybiBhbnllcnI7Cit9CisKKworLyogUnVuIHNlbGYtdGVzdHMgZm9yIGFsbCByZXF1aXJlZCBoYXNoIGFsZ29yaXRobXMuICBSZXR1cm4gMCBvbgorICAgc3VjY2Vzcy4gKi8KK3N0YXRpYyBpbnQKK3J1bl9kaWdlc3Rfc2VsZnRlc3RzIChpbnQgZXh0ZW5kZWQpCit7CisgIHN0YXRpYyBpbnQgYWxnb3NbXSA9IAorICAgIHsKKyAgICAgIEdDUllfTURfU0hBMSwKKyAgICAgIEdDUllfTURfU0hBMjI0LAorICAgICAgR0NSWV9NRF9TSEEyNTYsCisgICAgICBHQ1JZX01EX1NIQTM4NCwKKyAgICAgIEdDUllfTURfU0hBNTEyLAorICAgICAgMAorICAgIH07CisgIGludCBpZHg7CisgIGdwZ19lcnJvcl90IGVycjsKKyAgaW50IGFueWVyciA9IDA7CisKKyAgZm9yIChpZHg9MDsgYWxnb3NbaWR4XTsgaWR4KyspCisgICAgeworICAgICAgZXJyID0gX2djcnlfbWRfc2VsZnRlc3QgKGFsZ29zW2lkeF0sIGV4dGVuZGVkLCByZXBvcnRlcik7CisgICAgICByZXBvcnRlciAoImRpZ2VzdCIsIGFsZ29zW2lkeF0sIE5VTEwsCisgICAgICAgICAgICAgICAgZXJyPyBncGdfc3RyZXJyb3IgKGVycik6TlVMTCk7CisgICAgICBpZiAoZXJyKQorICAgICAgICBhbnllcnIgPSAxOworICAgIH0KKyAgcmV0dXJuIGFueWVycjsKK30KKworCisvKiBSdW4gc2VsZi10ZXN0cyBmb3IgYWxsIEhNQUMgYWxnb3JpdGhtcy4gIFJldHVybiAwIG9uIHN1Y2Nlc3MuICovCitzdGF0aWMgaW50CitydW5faG1hY19zZWxmdGVzdHMgKGludCBleHRlbmRlZCkKK3sKKyAgc3RhdGljIGludCBhbGdvc1tdID0gCisgICAgeworICAgICAgR0NSWV9NRF9TSEExLAorICAgICAgR0NSWV9NRF9TSEEyMjQsCisgICAgICBHQ1JZX01EX1NIQTI1NiwKKyAgICAgIEdDUllfTURfU0hBMzg0LAorICAgICAgR0NSWV9NRF9TSEE1MTIsCisgICAgICAwCisgICAgfTsKKyAgaW50IGlkeDsKKyAgZ3BnX2Vycm9yX3QgZXJyOworICBpbnQgYW55ZXJyID0gMDsKKworICBmb3IgKGlkeD0wOyBhbGdvc1tpZHhdOyBpZHgrKykKKyAgICB7CisgICAgICBlcnIgPSBfZ2NyeV9obWFjX3NlbGZ0ZXN0IChhbGdvc1tpZHhdLCBleHRlbmRlZCwgcmVwb3J0ZXIpOworICAgICAgcmVwb3J0ZXIgKCJobWFjIiwgYWxnb3NbaWR4XSwgTlVMTCwKKyAgICAgICAgICAgICAgICBlcnI/IGdwZ19zdHJlcnJvciAoZXJyKTpOVUxMKTsKKyAgICAgIGlmIChlcnIpCisgICAgICAgIGFueWVyciA9IDE7CisgICAgfQorICByZXR1cm4gYW55ZXJyOworfQorCisKKy8qIFJ1biBzZWxmLXRlc3RzIGZvciBhbGwgcmVxdWlyZWQgcHVibGljIGtleSBhbGdvcml0aG1zLiAgUmV0dXJuIDAgb24KKyAgIHN1Y2Nlc3MuICovCitzdGF0aWMgaW50CitydW5fcHVia2V5X3NlbGZ0ZXN0cyAoaW50IGV4dGVuZGVkKQoreworICBzdGF0aWMgaW50IGFsZ29zW10gPSAKKyAgICB7CisgICAgICBHQ1JZX1BLX1JTQSwKKyAgICAgIEdDUllfUEtfRFNBLAorICAgICAgLyogR0NSWV9QS19FQ0RTQSBpcyBub3QgZW5hYmxlZCBpbiBmaXBzIG1vZGUuICAqLworICAgICAgMAorICAgIH07CisgIGludCBpZHg7CisgIGdwZ19lcnJvcl90IGVycjsKKyAgaW50IGFueWVyciA9IDA7CisKKyAgZm9yIChpZHg9MDsgYWxnb3NbaWR4XTsgaWR4KyspCisgICAgeworICAgICAgZXJyID0gX2djcnlfcGtfc2VsZnRlc3QgKGFsZ29zW2lkeF0sIGV4dGVuZGVkLCByZXBvcnRlcik7CisgICAgICByZXBvcnRlciAoInB1YmtleSIsIGFsZ29zW2lkeF0sIE5VTEwsCisgICAgICAgICAgICAgICAgZXJyPyBncGdfc3RyZXJyb3IgKGVycik6TlVMTCk7CisgICAgICBpZiAoZXJyKQorICAgICAgICBhbnllcnIgPSAxOworICAgIH0KKyAgcmV0dXJuIGFueWVycjsKK30KKworCisvKiBSdW4gc2VsZi10ZXN0cyBmb3IgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLiAgUmV0dXJucyAwIG9uCisgICBzdWNjZXNzLiAqLworc3RhdGljIGludAorcnVuX3JhbmRvbV9zZWxmdGVzdHMgKHZvaWQpCit7CisgIGdwZ19lcnJvcl90IGVycjsKKworICBlcnIgPSBfZ2NyeV9yYW5kb21fc2VsZnRlc3QgKHJlcG9ydGVyKTsKKyAgcmVwb3J0ZXIgKCJyYW5kb20iLCAwLCBOVUxMLCBlcnI/IGdwZ19zdHJlcnJvciAoZXJyKTpOVUxMKTsKKyAgCisgIHJldHVybiAhIWVycjsKK30KKworLyogUnVuIGFuIGludGVncml0eSBjaGVjayBvbiB0aGUgYmluYXJ5LiAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MuICAqLworc3RhdGljIGludAorY2hlY2tfYmluYXJ5X2ludGVncml0eSAodm9pZCkKK3sKKyNpZmRlZiBFTkFCTEVfSE1BQ19CSU5BUllfQ0hFQ0sKKyAgZ3BnX2Vycm9yX3QgZXJyOworICBEbF9pbmZvIGluZm87CisgIHVuc2lnbmVkIGNoYXIgZGlnZXN0WzMyXTsKKyAgaW50IGRsZW47CisgIGNoYXIgKmZuYW1lID0gTlVMTDsKKyAgY29uc3QgY2hhciBrZXlbXSA9ICJXaGF0IGFtIEksIGEgZG9jdG9yIG9yIGEgbW9vbnNodXR0bGUgY29uZHVjdG9yPyI7CisgIAorICBpZiAoIWRsYWRkciAoImdjcnlfY2hlY2tfdmVyc2lvbiIsICZpbmZvKSkKKyAgICBlcnIgPSBncGdfZXJyb3JfZnJvbV9zeXNlcnJvciAoKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGRsZW4gPSBfZ2NyeV9obWFjMjU2X2ZpbGUgKGRpZ2VzdCwgc2l6ZW9mIGRpZ2VzdCwgaW5mby5kbGlfZm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXksIHN0cmxlbiAoa2V5KSk7CisgICAgICBpZiAoZGxlbiA8IDApCisgICAgICAgIGVyciA9IGdwZ19lcnJvcl9mcm9tX3N5c2Vycm9yICgpOworICAgICAgZWxzZSBpZiAoZGxlbiAhPSAzMikKKyAgICAgICAgZXJyID0gZ3BnX2Vycm9yIChHUEdfRVJSX0lOVEVSTkFMKTsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGZuYW1lID0gZ2NyeV9tYWxsb2MgKHN0cmxlbiAoaW5mby5kbGlfZm5hbWUpICsgMSArIDUgKyAxICk7CisgICAgICAgICAgaWYgKCFmbmFtZSkKKyAgICAgICAgICAgIGVyciA9IGdwZ19lcnJvcl9mcm9tX3N5c2Vycm9yICgpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgRklMRSAqZnA7CisgICAgICAgICAgICAgIGNoYXIgKnA7CisKKyAgICAgICAgICAgICAgLyogUHJlZml4IHRoZSBiYXNlbmFtZSB3aXRoIGEgZG90LiAgKi8KKyAgICAgICAgICAgICAgc3RyY3B5IChmbmFtZSwgaW5mby5kbGlfZm5hbWUpOworICAgICAgICAgICAgICBwID0gc3RycmNociAoZm5hbWUsICcvJyk7CisgICAgICAgICAgICAgIGlmIChwKQorICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHAgPSBmbmFtZTsKKyAgICAgICAgICAgICAgbWVtbW92ZSAocCsxLCBwLCBzdHJsZW4gKHApKzEpOworICAgICAgICAgICAgICAqcCA9ICcuJzsKKyAgICAgICAgICAgICAgc3RyY2F0IChmbmFtZSwgIi5obWFjIik7CisKKyAgICAgICAgICAgICAgLyogT3BlbiB0aGUgZmlsZS4gICovCisgICAgICAgICAgICAgIGZwID0gZm9wZW4gKGZuYW1lLCAiciIpOworICAgICAgICAgICAgICBpZiAoIWZwKQorICAgICAgICAgICAgICAgIGVyciA9IGdwZ19lcnJvcl9mcm9tX3N5c2Vycm9yICgpOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLyogQSBidWZmZXIgb2YgNjQgYnl0ZXMgcGx1cyBvbmUgZm9yIGEgTEYgYW5kIG9uZSB0bworICAgICAgICAgICAgICAgICAgICAgZGV0ZWN0IGdhcmJhZ2UuICAqLworICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBidWZmZXJbNjQrMSsxXTsgCisgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzOworICAgICAgICAgICAgICAgICAgaW50IG47CisKKyAgICAgICAgICAgICAgICAgIC8qIFRoZSBITUFDIGZpbGVzIGNvbnNpc3RzIG9mIGxvd2VyY2FzZSBoZXggZGlnaXRzCisgICAgICAgICAgICAgICAgICAgICBvbmx5IHdpdGggYW4gb3B0aW9uYWwgdHJhaWxpbmcgbGluZWZlZWQuICBGYWlsIGlmCisgICAgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBhbnkgZ2FyYmFnZS4gICovCisgICAgICAgICAgICAgICAgICBlcnIgPSBncGdfZXJyb3IgKEdQR19FUlJfU0VMRlRFU1RfRkFJTEVEKTsKKyAgICAgICAgICAgICAgICAgIG4gPSBmcmVhZCAoYnVmZmVyLCAxLCBzaXplb2YgYnVmZmVyLCBmcCk7CisgICAgICAgICAgICAgICAgICBpZiAobiA9PSA2NCB8fCAobiA9PSA2NSAmJiBidWZmZXJbNjRdID09ICdcbicpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyWzY0XSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgZm9yIChuPTAsIHM9IGJ1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPCAzMiAmJiBsb3hkaWdpdF9wIChzKSAmJiBsb3hkaWdpdF9wIChzKzEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgbisrLCBzICs9IDIpCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJbbl0gPSBsb3h0b2lfMiAocyk7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKCBuID09IDMyICYmICFtZW1jbXAgKGRpZ2VzdCwgYnVmZmVyLCAzMikgKQorICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZmNsb3NlIChmcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICByZXBvcnRlciAoImJpbmFyeSIsIDAsIGZuYW1lLCBlcnI/IGdwZ19zdHJlcnJvciAoZXJyKTpOVUxMKTsKKyNpZmRlZiBIQVZFX1NZU0xPRworICBpZiAoZXJyKQorICAgIHN5c2xvZyAoTE9HX1VTRVJ8TE9HX0VSUiwgIkxpYmdjcnlwdCBlcnJvcjogIgorICAgICAgICAgICAgImludGVncml0eSBjaGVjayB1c2luZyBgJXMnIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgZm5hbWU/IGZuYW1lOiJbP10iLCBncGdfc3RyZXJyb3IgKGVycikpOworI2VuZGlmIC8qSEFWRV9TWVNMT0cqLworICBnY3J5X2ZyZWUgKGZuYW1lKTsKKyAgcmV0dXJuICEhZXJyOworI2Vsc2UKKyAgcmV0dXJuIDA7CisjZW5kaWYKK30KKworCisvKiBSdW4gdGhlIHNlbGYtdGVzdHMuICBJZiBFWFRFTkRFRCBpcyB0cnVlLCBleHRlbmRlZCB2ZXJzaW9ucyBvZiB0aGUKKyAgIHNlbGZ0ZXN0IGFyZSBydW4sIHRoYXQgaXMgbW9yZSB0ZXN0cyB0aGFuIHJlcXVpcmVkIGJ5IEZJUFMuICAqLworZ3BnX2Vycl9jb2RlX3QKK19nY3J5X2ZpcHNfcnVuX3NlbGZ0ZXN0cyAoaW50IGV4dGVuZGVkKQoreworICBlbnVtIG1vZHVsZV9zdGF0ZXMgcmVzdWx0ID0gU1RBVEVfRVJST1I7CisgIGdjcnlfZXJyX2NvZGVfdCBlYyA9IEdQR19FUlJfU0VMRlRFU1RfRkFJTEVEOworICAKKyAgaWYgKGZpcHNfbW9kZSAoKSkKKyAgICBmaXBzX25ld19zdGF0ZSAoU1RBVEVfU0VMRlRFU1QpOworCisgIGlmIChydW5fY2lwaGVyX3NlbGZ0ZXN0cyAoZXh0ZW5kZWQpKQorICAgIGdvdG8gbGVhdmU7CisKKyAgaWYgKHJ1bl9kaWdlc3Rfc2VsZnRlc3RzIChleHRlbmRlZCkpCisgICAgZ290byBsZWF2ZTsKKworICBpZiAocnVuX2htYWNfc2VsZnRlc3RzIChleHRlbmRlZCkpCisgICAgZ290byBsZWF2ZTsKKworICAvKiBSdW4gcmFuZG9tIHRlc3RzIGJlZm9yZSB0aGUgcHVia2V5IHRlc3RzIGJlY2F1c2UgdGhlIGxhdHRlcgorICAgICByZXF1aXJlIHJhbmRvbS4gICovCisgIGlmIChydW5fcmFuZG9tX3NlbGZ0ZXN0cyAoKSkKKyAgICBnb3RvIGxlYXZlOworCisgIGlmIChydW5fcHVia2V5X3NlbGZ0ZXN0cyAoZXh0ZW5kZWQpKQorICAgIGdvdG8gbGVhdmU7CisKKyAgLyogTm93IGNoZWNrIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIGJpbmFyeS4gIFdlIGRvIHRoaXMgdGhpcyBhZnRlcgorICAgICBoYXZpbmcgY2hlY2tlZCB0aGUgSE1BQyBjb2RlLiAgKi8KKyAgaWYgKGNoZWNrX2JpbmFyeV9pbnRlZ3JpdHkgKCkpCisgICAgZ290byBsZWF2ZTsKKworICAvKiBBbGwgc2VsZnRlc3RzIHBhc3NlZC4gICovCisgIHJlc3VsdCA9IFNUQVRFX09QRVJBVElPTkFMOworICBlYyA9IDA7CisKKyBsZWF2ZToKKyAgaWYgKGZpcHNfbW9kZSAoKSkKKyAgICBmaXBzX25ld19zdGF0ZSAocmVzdWx0KTsKKworICByZXR1cm4gZWM7Cit9CisKKworLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHRlbGwgdGhlIEZTTSBhYm91dCBlcnJvcnMgaW4gdGhlIGxpYnJhcnkuCisgICBUaGUgRlNNIHdpbGwgYmUgcHV0IGludG8gYW4gZXJyb3Igc3RhdGUuICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QKKyAgIGJlIGNhbGxlZCBkaXJlY3RseSBidXQgYnkgb25lIG9mIHRoZSBtYWNyb3MKKworICAgICBmaXBzX3NpZ25hbF9lcnJvciAoZGVzY3JpcHRpb24pCisgICAgIGZpcHNfc2lnbmFsX2ZhdGFsX2Vycm9yIChkZXNjcmlwdGlvbikKKworICAgd2hlcmUgREVTQ1JJUFRJT04gaXMgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZXJyb3IuICovCit2b2lkCitfZ2NyeV9maXBzX3NpZ25hbF9lcnJvciAoY29uc3QgY2hhciAqc3JjZmlsZSwgaW50IHNyY2xpbmUsIGNvbnN0IGNoYXIgKnNyY2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX2ZhdGFsLCBjb25zdCBjaGFyICpkZXNjcmlwdGlvbikKK3sKKyAgaWYgKCFmaXBzX21vZGUgKCkpCisgICAgcmV0dXJuOyAgLyogTm90IHJlcXVpcmVkLiAgKi8KKworICAvKiBTZXQgbmV3IHN0YXRlIGJlZm9yZSBwcmludGluZyBhbiBlcnJvci4gICovCisgIGZpcHNfbmV3X3N0YXRlIChpc19mYXRhbD8gU1RBVEVfRkFUQUxFUlJPUiA6IFNUQVRFX0VSUk9SKTsKKworICAvKiBQcmludCBlcnJvci4gICovCisgIGxvZ19pbmZvICgiJXNlcnJvciBpbiBsaWJnY3J5cHQsIGZpbGUgJXMsIGxpbmUgJWQlcyVzOiAlc1xuIiwKKyAgICAgICAgICAgIGlzX2ZhdGFsPyAiZmF0YWwgIjoiIiwKKyAgICAgICAgICAgIHNyY2ZpbGUsIHNyY2xpbmUsIAorICAgICAgICAgICAgc3JjZnVuYz8gIiwgZnVuY3Rpb24gIjoiIiwgc3JjZnVuYz8gc3JjZnVuYzoiIiwKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPyBkZXNjcmlwdGlvbiA6ICJubyBkZXNjcmlwdGlvbiBhdmFpbGFibGUiKTsKKyNpZmRlZiBIQVZFX1NZU0xPRworICBzeXNsb2cgKExPR19VU0VSfExPR19FUlIsICJMaWJnY3J5cHQgZXJyb3I6ICIKKyAgICAgICAgICAiJXNlcnJvciBpbiBmaWxlICVzLCBsaW5lICVkJXMlczogJXMiLAorICAgICAgICAgIGlzX2ZhdGFsPyAiZmF0YWwgIjoiIiwKKyAgICAgICAgICBzcmNmaWxlLCBzcmNsaW5lLCAKKyAgICAgICAgICBzcmNmdW5jPyAiLCBmdW5jdGlvbiAiOiIiLCBzcmNmdW5jPyBzcmNmdW5jOiIiLAorICAgICAgICAgIGRlc2NyaXB0aW9uPyBkZXNjcmlwdGlvbiA6ICJubyBkZXNjcmlwdGlvbiBhdmFpbGFibGUiKTsKKyNlbmRpZiAvKkhBVkVfU1lTTE9HKi8KK30KKworCisvKiBQZXJmb3JtIGEgc3RhdGUgdHJhbnNpdGlvbiB0byBORVdfU1RBVEUuICBJZiB0aGlzIGlzIGFuIGludmFsaWQKKyAgIHRyYW5zaXRpb24sIHRoZSBtb2R1bGUgd2lsbCBnbyBpbnRvIGEgZmF0YWwgZXJyb3Igc3RhdGUuICovCitzdGF0aWMgdm9pZAorZmlwc19uZXdfc3RhdGUgKGVudW0gbW9kdWxlX3N0YXRlcyBuZXdfc3RhdGUpCit7CisgIGludCBvayA9IDA7CisgIGVudW0gbW9kdWxlX3N0YXRlcyBsYXN0X3N0YXRlOworCisgIGxvY2tfZnNtICgpOworCisgIGxhc3Rfc3RhdGUgPSBjdXJyZW50X3N0YXRlOworICBzd2l0Y2ggKGN1cnJlbnRfc3RhdGUpCisgICAgeworICAgIGNhc2UgU1RBVEVfUE9XRVJPTjoKKyAgICAgIGlmIChuZXdfc3RhdGUgPT0gU1RBVEVfSU5JVAorICAgICAgICAgIHx8IG5ld19zdGF0ZSA9PSBTVEFURV9FUlJPUgorICAgICAgICAgIHx8IG5ld19zdGF0ZSA9PSBTVEFURV9GQVRBTEVSUk9SKQorICAgICAgICBvayA9IDE7CisgICAgICBicmVhazsKKworICAgIGNhc2UgU1RBVEVfSU5JVDoKKyAgICAgIGlmIChuZXdfc3RhdGUgPT0gU1RBVEVfU0VMRlRFU1QKKyAgICAgICAgICB8fCBuZXdfc3RhdGUgPT0gU1RBVEVfRVJST1IKKyAgICAgICAgICB8fCBuZXdfc3RhdGUgPT0gU1RBVEVfRkFUQUxFUlJPUikKKyAgICAgICAgb2sgPSAxOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIFNUQVRFX1NFTEZURVNUOgorICAgICAgaWYgKG5ld19zdGF0ZSA9PSBTVEFURV9PUEVSQVRJT05BTAorICAgICAgICAgIHx8IG5ld19zdGF0ZSA9PSBTVEFURV9FUlJPUgorICAgICAgICAgIHx8IG5ld19zdGF0ZSA9PSBTVEFURV9GQVRBTEVSUk9SKQorICAgICAgICBvayA9IDE7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgU1RBVEVfT1BFUkFUSU9OQUw6CisgICAgICBpZiAobmV3X3N0YXRlID09IFNUQVRFX1NIVVRET1dOIAorICAgICAgICAgIHx8IG5ld19zdGF0ZSA9PSBTVEFURV9TRUxGVEVTVAorICAgICAgICAgIHx8IG5ld19zdGF0ZSA9PSBTVEFURV9FUlJPUgorICAgICAgICAgIHx8IG5ld19zdGF0ZSA9PSBTVEFURV9GQVRBTEVSUk9SKQorICAgICAgICBvayA9IDE7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgU1RBVEVfRVJST1I6CisgICAgICBpZiAobmV3X3N0YXRlID09IFNUQVRFX1NIVVRET1dOCisgICAgICAgICAgfHwgbmV3X3N0YXRlID09IFNUQVRFX0VSUk9SCisgICAgICAgICAgfHwgbmV3X3N0YXRlID09IFNUQVRFX0ZBVEFMRVJST1IKKyAgICAgICAgICB8fCBuZXdfc3RhdGUgPT0gU1RBVEVfU0VMRlRFU1QpCisgICAgICAgIG9rID0gMTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBTVEFURV9GQVRBTEVSUk9SOgorICAgICAgaWYgKG5ld19zdGF0ZSA9PSBTVEFURV9TSFVURE9XTiApCisgICAgICAgIG9rID0gMTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBTVEFURV9TSFVURE9XTjoKKyAgICAgIC8qIFdlIHdvbid0IHNlZSBhbnkgdHJhbnNpdGlvbiAqZnJvbSogU2h1dGRvd24gYmVjYXVzZSB0aGUgb25seQorICAgICAgICAgYWxsb3dlZCBuZXcgc3RhdGUgaXMgUG93ZXItT2ZmIGFuZCB0aGF0IG9uZSBjYW4ndCBiZQorICAgICAgICAgcmVwcmVzZW50ZWQuICAqLworICAgICAgYnJlYWs7CisgICAgICAKKyAgICB9CisKKyAgaWYgKG9rKQorICAgIHsKKyAgICAgIGN1cnJlbnRfc3RhdGUgPSBuZXdfc3RhdGU7CisgICAgfQorCisgIHVubG9ja19mc20gKCk7CisKKyAgaWYgKCFvayB8fCBfZ2NyeV9sb2dfdmVyYm9zaXR5ICgyKSkKKyAgICBsb2dfaW5mbyAoImxpYmdjcnlwdCBzdGF0ZSB0cmFuc2l0aW9uICVzID0+ICVzICVzXG4iLAorICAgICAgICAgICAgICBzdGF0ZTJzdHIgKGxhc3Rfc3RhdGUpLCBzdGF0ZTJzdHIgKG5ld19zdGF0ZSksCisgICAgICAgICAgICAgIG9rPyAiZ3JhbnRlZCI6ImRlbmllZCIpOworICAKKyAgaWYgKCFvaykKKyAgICB7CisgICAgICAvKiBJbnZhbGlkIHN0YXRlIHRyYW5zaXRpb24uICBIYWx0aW5nIGxpYnJhcnkuICovCisjaWZkZWYgSEFWRV9TWVNMT0cKKyAgICAgIHN5c2xvZyAoTE9HX1VTRVJ8TE9HX0VSUiwgCisgICAgICAgICAgICAgICJMaWJnY3J5cHQgZXJyb3I6IGludmFsaWQgc3RhdGUgdHJhbnNpdGlvbiAlcyA9PiAlcyIsCisgICAgICAgICAgICAgIHN0YXRlMnN0ciAobGFzdF9zdGF0ZSksIHN0YXRlMnN0ciAobmV3X3N0YXRlKSk7CisjZW5kaWYgLypIQVZFX1NZU0xPRyovCisgICAgICBmaXBzX25vcmV0dXJuICgpOworICAgIH0KKyAgZWxzZSBpZiAobmV3X3N0YXRlID09IFNUQVRFX0VSUk9SIHx8IG5ld19zdGF0ZSA9PSBTVEFURV9GQVRBTEVSUk9SKQorICAgIHsKKyNpZmRlZiBIQVZFX1NZU0xPRworICAgICAgc3lzbG9nIChMT0dfVVNFUnxMT0dfV0FSTklORywgCisgICAgICAgICAgICAgICJMaWJnY3J5cHQgbm90aWNlOiBzdGF0ZSB0cmFuc2l0aW9uICVzID0+ICVzIiwKKyAgICAgICAgICAgICAgc3RhdGUyc3RyIChsYXN0X3N0YXRlKSwgc3RhdGUyc3RyIChuZXdfc3RhdGUpKTsKKyNlbmRpZiAvKkhBVkVfU1lTTE9HKi8KKyAgICB9Cit9CisKKworCisKKy8qIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCB0byBlbnN1cmUgdGhhdCB0aGUgZXhlY3V0aW9uIHNoYWxsCisgICBub3QgY29udGludWUuICovCit2b2lkCitfZ2NyeV9maXBzX25vcmV0dXJuICh2b2lkKQoreworI2lmZGVmIEhBVkVfU1lTTE9HCisgIHN5c2xvZyAoTE9HX1VTRVJ8TE9HX0VSUiwgIkxpYmdjcnlwdCB0ZXJtaW5hdGVkIHRoZSBhcHBsaWNhdGlvbiIpOworI2VuZGlmIC8qSEFWRV9TWVNMT0cqLworICBmZmx1c2ggKE5VTEwpOworICBhYm9ydCAoKTsKKyAgLypOT1RSRUFDSEVEKi8KK30KZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9zcmMvZzEwbGliLmggYi9saWJnY3J5cHQtMS40LjYvc3JjL2cxMGxpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZWI5MGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvc3JjL2cxMGxpYi5oCkBAIC0wLDAgKzEsMzU4IEBACisvKiBnMTBsaWIuaCAtIEludGVybmFsIGRlZmluaXRpb25zIGZvciBsaWJnY3J5cHQKKyAqIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNQorICogICAgICAgICAgICAgICAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIGdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisvKiBUaGlzIGhlYWRlciBpcyB0byBiZSB1c2VkIGluc2lkZSBvZiBsaWJnY3J5cHQgaW4gcGxhY2Ugb2YgZ2NyeXB0LmguCisgICBUaGlzIHdheSB3ZSBjYW4gYmV0dGVyIGRpc3Rpbmd1aXNoIGJldHdlZW4gaW50ZXJuYWwgYW5kIGV4dGVybmFsCisgICB1c2FnZSBvZiBnY3J5cHQuaC4gKi8KKworI2lmbmRlZiBHMTBMSUJfSAorI2RlZmluZSBHMTBMSUJfSCAxCisKKyNpZmRlZiBfR0NSWVBUX0gKKyNlcnJvciAgZ2NyeXB0LmggYWxyZWFkeSBpbmNsdWRlZAorI2VuZGlmCisKKyNpZm5kZWYgX0dDUllQVF9JTl9MSUJHQ1JZUFQgCisjZXJyb3Igc29tZXRoaW5nIGlzIHdyb25nIHdpdGggY29uZmlnLmgKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2luY2x1ZGUgInZpc2liaWxpdHkuaCIKKyNpbmNsdWRlICJ0eXBlcy5oIgorCisKKwwKKworLyogQXR0cmlidXRlIGhhbmRsaW5nIG1hY3Jvcy4gICovCisKKyNpZiBfX0dOVUNfXyA+IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPj0gNSApCisjZGVmaW5lIEpOTElCX0dDQ19NX0ZVTkNUSU9OIDEKKyNkZWZpbmUgSk5MSUJfR0NDX0FfTlIgCSAgICAgX19hdHRyaWJ1dGVfXyAoKG5vcmV0dXJuKSkKKyNkZWZpbmUgSk5MSUJfR0NDX0FfUFJJTlRGKCBmLCBhICkgIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZixmLGEpKSkKKyNkZWZpbmUgSk5MSUJfR0NDX0FfTlJfUFJJTlRGKCBmLCBhICkgXAorCQkJICAgIF9fYXR0cmlidXRlX18gKChub3JldHVybiwgZm9ybWF0IChwcmludGYsZixhKSkpCisjZGVmaW5lIEdDQ19BVFRSX05PUkVUVVJOICBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9fKSkKKyNlbHNlCisjZGVmaW5lIEpOTElCX0dDQ19BX05SCisjZGVmaW5lIEpOTElCX0dDQ19BX1BSSU5URiggZiwgYSApCisjZGVmaW5lIEpOTElCX0dDQ19BX05SX1BSSU5URiggZiwgYSApCisjZGVmaW5lIEdDQ19BVFRSX05PUkVUVVJOIAorI2VuZGlmCisKKyNpZiBfX0dOVUNfXyA+PSAzIAorLyogQWNjb3JkaW5nIHRvIGdsaWJjIHRoaXMgYXR0cmlidXRlIGlzIGF2YWlsYWJsZSBzaW5jZSAyLjggaG93ZXZlciB3ZQorICAgYmV0dGVyIHBsYXkgc2FmZSBhbmQgdXNlIGl0IG9ubHkgd2l0aCBnY2MgMyBvciBuZXdlci4gKi8KKyNkZWZpbmUgR0NDX0FUVFJfRk9STUFUX0FSRyhhKSAgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdF9hcmcgKGEpKSkKKyNlbHNlCisjZGVmaW5lIEdDQ19BVFRSX0ZPUk1BVF9BUkcoYSkgIAorI2VuZGlmCisKKworLyogR2V0dGV4dCBtYWNyb3MuICAqLworCisjZGVmaW5lIF8oYSkgIF9nY3J5X2dldHRleHQoYSkKKyNkZWZpbmUgTl8oYSkgKGEpCisKKy8qIFNvbWUgaGFuZHkgbWFjcm9zICovCisjaWZuZGVmIFNUUgorI2RlZmluZSBTVFIodikgI3YKKyNlbmRpZgorI2RlZmluZSBTVFIyKHYpIFNUUih2KQorI2RlZmluZSBESU0odikgKHNpemVvZih2KS9zaXplb2YoKHYpWzBdKSkKKyNkZWZpbmUgRElNb2YodHlwZSxtZW1iZXIpICAgRElNKCgodHlwZSAqKTApLT5tZW1iZXIpCisKKwwKKworLyotLSBzcmMvZ2xvYmFsLmMgLSovCitpbnQgX2djcnlfZ2xvYmFsX2lzX29wZXJhdGlvbmFsICh2b2lkKTsKK2djcnlfZXJyb3JfdCBfZ2NyeV92Y29udHJvbCAoZW51bSBnY3J5X2N0bF9jbWRzIGNtZCwgdmFfbGlzdCBhcmdfcHRyKTsKK3ZvaWQgIF9nY3J5X2NoZWNrX2hlYXAgKGNvbnN0IHZvaWQgKmEpOworaW50IF9nY3J5X2dldF9kZWJ1Z19mbGFnICh1bnNpZ25lZCBpbnQgbWFzayk7CisKKworLyotLSBzcmMvbWlzYy5jIC0tKi8KKworI2lmIGRlZmluZWQoSk5MSUJfR0NDX01fRlVOQ1RJT04pIHx8IF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAordm9pZCBfZ2NyeV9idWcgKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZ1bmMpIEdDQ19BVFRSX05PUkVUVVJOOwordm9pZCBfZ2NyeV9hc3NlcnRfZmFpbGVkIChjb25zdCBjaGFyICpleHByLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnVuYykgR0NDX0FUVFJfTk9SRVRVUk47CisjZWxzZQordm9pZCBfZ2NyeV9idWcgKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKTsKK3ZvaWQgX2djcnlfYXNzZXJ0X2ZhaWxlZCAoY29uc3QgY2hhciAqZXhwciwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpOworI2VuZGlmCisKK2NvbnN0IGNoYXIgKl9nY3J5X2dldHRleHQgKGNvbnN0IGNoYXIgKmtleSkgR0NDX0FUVFJfRk9STUFUX0FSRygxKTsKK3ZvaWQgX2djcnlfZmF0YWxfZXJyb3IoaW50IHJjLCBjb25zdCBjaGFyICp0ZXh0ICkgSk5MSUJfR0NDX0FfTlI7Cit2b2lkIF9nY3J5X2xvZyggaW50IGxldmVsLCBjb25zdCBjaGFyICpmbXQsIC4uLiApIEpOTElCX0dDQ19BX1BSSU5URigyLDMpOwordm9pZCBfZ2NyeV9sb2dfYnVnKCBjb25zdCBjaGFyICpmbXQsIC4uLiApICAgSk5MSUJfR0NDX0FfTlJfUFJJTlRGKDEsMik7Cit2b2lkIF9nY3J5X2xvZ19mYXRhbCggY29uc3QgY2hhciAqZm10LCAuLi4gKSBKTkxJQl9HQ0NfQV9OUl9QUklOVEYoMSwyKTsKK3ZvaWQgX2djcnlfbG9nX2Vycm9yKCBjb25zdCBjaGFyICpmbXQsIC4uLiApIEpOTElCX0dDQ19BX1BSSU5URigxLDIpOwordm9pZCBfZ2NyeV9sb2dfaW5mbyggY29uc3QgY2hhciAqZm10LCAuLi4gKSAgSk5MSUJfR0NDX0FfUFJJTlRGKDEsMik7CitpbnQgIF9nY3J5X2xvZ19pbmZvX3dpdGhfZHVtbXlfZnAgKEZJTEUgKmZwLCBjb25zdCBjaGFyICpmbXQsIC4uLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKTkxJQl9HQ0NfQV9QUklOVEYoMiwzKTsKK3ZvaWQgX2djcnlfbG9nX2RlYnVnKCBjb25zdCBjaGFyICpmbXQsIC4uLiApIEpOTElCX0dDQ19BX1BSSU5URigxLDIpOwordm9pZCBfZ2NyeV9sb2dfcHJpbnRmICggY29uc3QgY2hhciAqZm10LCAuLi4gKSBKTkxJQl9HQ0NfQV9QUklOVEYoMSwyKTsKK3ZvaWQgX2djcnlfbG9nX3ByaW50aGV4IChjb25zdCBjaGFyICp0ZXh0LCBjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBsZW5ndGgpOworCit2b2lkIF9nY3J5X3NldF9sb2dfdmVyYm9zaXR5KCBpbnQgbGV2ZWwgKTsKK2ludCBfZ2NyeV9sb2dfdmVyYm9zaXR5KCBpbnQgbGV2ZWwgKTsKKworI2lmZGVmIEpOTElCX0dDQ19NX0ZVTkNUSU9OCisjZGVmaW5lIEJVRygpIF9nY3J5X2J1ZyggX19GSUxFX18gLCBfX0xJTkVfXywgX19GVU5DVElPTl9fICkKKyNkZWZpbmUgZ2NyeV9hc3NlcnQoZXhwcikgKChleHByKT8gKHZvaWQpMCBcCisgICAgICAgICA6IF9nY3J5X2Fzc2VydF9mYWlsZWQgKFNUUihleHByKSwgX19GSUxFX18sIF9fTElORV9fLCBfX0ZVTkNUSU9OX18pKQorI2VsaWYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjZGVmaW5lIEJVRygpIF9nY3J5X2J1ZyggX19GSUxFX18gLCBfX0xJTkVfXywgX19mdW5jX18gKQorI2RlZmluZSBnY3J5X2Fzc2VydChleHByKSAoKGV4cHIpPyAodm9pZCkwIFwKKyAgICAgICAgIDogX2djcnlfYXNzZXJ0X2ZhaWxlZCAoU1RSKGV4cHIpLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKSkKKyNlbHNlCisjZGVmaW5lIEJVRygpIF9nY3J5X2J1ZyggX19GSUxFX18gLCBfX0xJTkVfXyApCisjZGVmaW5lIGdjcnlfYXNzZXJ0KGV4cHIpICgoZXhwcik/ICh2b2lkKTAgXAorICAgICAgICAgOiBfZ2NyeV9hc3NlcnRfZmFpbGVkIChTVFIoZXhwciksIF9fRklMRV9fLCBfX0xJTkVfXykpCisjZW5kaWYKKworCisjZGVmaW5lIGxvZ19idWcgICAgIF9nY3J5X2xvZ19idWcKKyNkZWZpbmUgbG9nX2ZhdGFsICAgX2djcnlfbG9nX2ZhdGFsCisjZGVmaW5lIGxvZ19lcnJvciAgIF9nY3J5X2xvZ19lcnJvcgorI2RlZmluZSBsb2dfaW5mbyAgICBfZ2NyeV9sb2dfaW5mbworI2RlZmluZSBsb2dfZGVidWcgICBfZ2NyeV9sb2dfZGVidWcKKyNkZWZpbmUgbG9nX3ByaW50ZiAgX2djcnlfbG9nX3ByaW50ZgorI2RlZmluZSBsb2dfcHJpbnRoZXggX2djcnlfbG9nX3ByaW50aGV4CisKKworLyotLSBzcmMvaHdmZWF0dXJlcy5jIC0tKi8KKy8qIChEbyBub3QgY2hhbmdlIHRoZXNlIHZhbHVlcyB1bmxlc3Mgc3luY2VkIHdpdGggdGhlIGFzbSBjb2RlLikgICovCisjZGVmaW5lIEhXRl9QQURMT0NLX1JORyAgMQorI2RlZmluZSBIV0ZfUEFETE9DS19BRVMgIDIKKyNkZWZpbmUgSFdGX1BBRExPQ0tfU0hBICA0CisjZGVmaW5lIEhXRl9QQURMT0NLX01NVUwgOAorCit1bnNpZ25lZCBpbnQgX2djcnlfZ2V0X2h3X2ZlYXR1cmVzICh2b2lkKTsKK3ZvaWQgX2djcnlfZGV0ZWN0X2h3X2ZlYXR1cmVzICh2b2lkKTsKKworCisvKi0tIG1waS9tcGl1dGlsLmMgLS0qLworY29uc3QgY2hhciAqX2djcnlfbXBpX2dldF9od19jb25maWcgKHZvaWQpOworCisKKy8qLS0gY2lwaGVyL3B1YmtleS5jIC0tKi8KKworLyogRklYTUU6IHNob3VsZG4ndCB0aGlzIGdvIGludG8gbXBpLmg/ICAqLworI2lmbmRlZiBtcGlfcG93bQorI2RlZmluZSBtcGlfcG93bSh3LGIsZSxtKSAgIGdjcnlfbXBpX3Bvd20oICh3KSwgKGIpLCAoZSksIChtKSApCisjZW5kaWYKKworLyotLSBwcmltZWdlbi5jIC0tKi8KK2djcnlfbXBpX3QgX2djcnlfZ2VuZXJhdGVfc2VjcmV0X3ByaW1lICh1bnNpZ25lZCBpbnQgbmJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X3JhbmRvbV9sZXZlbF90IHJhbmRvbV9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAoKmV4dHJhX2NoZWNrKSh2b2lkKiwgZ2NyeV9tcGlfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpleHRyYV9jaGVja19hcmcpOworZ2NyeV9tcGlfdCBfZ2NyeV9nZW5lcmF0ZV9wdWJsaWNfcHJpbWUgKHVuc2lnbmVkIGludCBuYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfcmFuZG9tX2xldmVsX3QgcmFuZG9tX2xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICgqZXh0cmFfY2hlY2spKHZvaWQqLCBnY3J5X21waV90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmV4dHJhX2NoZWNrX2FyZyk7CitnY3J5X21waV90IF9nY3J5X2dlbmVyYXRlX2VsZ19wcmltZSAoaW50IG1vZGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwYml0cywgdW5zaWduZWQgaW50IHFiaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfbXBpX3QgZywgZ2NyeV9tcGlfdCAqKmZhY3RvcnMpOworZ2NyeV9tcGlfdCBfZ2NyeV9kZXJpdmVfeDkzMV9wcmltZSAoY29uc3QgZ2NyeV9tcGlfdCB4cCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY3J5X21waV90IHhwMSwgY29uc3QgZ2NyeV9tcGlfdCB4cDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY3J5X21waV90IGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X21waV90ICpyX3AxLCBnY3J5X21waV90ICpyX3AyKTsKK2dwZ19lcnJfY29kZV90IF9nY3J5X2dlbmVyYXRlX2ZpcHMxODZfMl9wcmltZQorICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50IHBiaXRzLCB1bnNpZ25lZCBpbnQgcWJpdHMsCisgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpzZWVkLCBzaXplX3Qgc2VlZGxlbiwKKyAgICAgICAgICAgICAgICAgIGdjcnlfbXBpX3QgKnJfcSwgZ2NyeV9tcGlfdCAqcl9wLAorICAgICAgICAgICAgICAgICAgaW50ICpyX2NvdW50ZXIsCisgICAgICAgICAgICAgICAgICB2b2lkICoqcl9zZWVkLCBzaXplX3QgKnJfc2VlZGxlbik7CitncGdfZXJyX2NvZGVfdCBfZ2NyeV9nZW5lcmF0ZV9maXBzMTg2XzNfcHJpbWUgCisgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQgcGJpdHMsIHVuc2lnbmVkIGludCBxYml0cywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnNlZWQsIHNpemVfdCBzZWVkbGVuLAorICAgICAgICAgICAgICAgICAgZ2NyeV9tcGlfdCAqcl9xLCBnY3J5X21waV90ICpyX3AsCisgICAgICAgICAgICAgICAgICBpbnQgKnJfY291bnRlciwKKyAgICAgICAgICAgICAgICAgIHZvaWQgKipyX3NlZWQsIHNpemVfdCAqcl9zZWVkbGVuLCBpbnQgKnJfaGFzaGFsZ28pOworCisKKy8qIFJlcGxhY2VtZW50cyBvZiBtaXNzaW5nIGZ1bmN0aW9ucyAobWlzc2luZy1zdHJpbmcuYykuICAqLworI2lmbmRlZiBIQVZFX1NUUENQWQorY2hhciAqc3RwY3B5IChjaGFyICphLCBjb25zdCBjaGFyICpiKTsKKyNlbmRpZgorI2lmbmRlZiBIQVZFX1NUUkNBU0VDTVAKK2ludCBzdHJjYXNlY21wIChjb25zdCBjaGFyICphLCBjb25zdCBjaGFyICpiKSBfR0NSWV9HQ0NfQVRUUl9QVVJFOworI2VuZGlmCisKKy8qIE1hY3JvcyB1c2VkIHRvIHJlbmFtZSBtaXNzaW5nIGZ1bmN0aW9ucy4gICovCisjaWZuZGVmIEhBVkVfU1RSVE9VTAorI2RlZmluZSBzdHJ0b3VsKGEsYixjKSAgKCh1bnNpZ25lZCBsb25nKXN0cnRvbCgoYSksKGIpLChjKSkpCisjZW5kaWYKKyNpZm5kZWYgSEFWRV9NRU1NT1ZFCisjZGVmaW5lIG1lbW1vdmUoZCwgcywgbikgYmNvcHkoKHMpLCAoZCksIChuKSkKKyNlbmRpZgorI2lmbmRlZiBIQVZFX1NUUklDTVAKKyNkZWZpbmUgc3RyaWNtcChhLGIpCSBzdHJjYXNlY21wKCAoYSksIChiKSApCisjZW5kaWYKKyNpZm5kZWYgSEFWRV9BVEVYSVQKKyNkZWZpbmUgYXRleGl0KGEpICAgIChvbl9leGl0KChhKSwwKSkKKyNlbmRpZgorI2lmbmRlZiBIQVZFX1JBSVNFCisjZGVmaW5lIHJhaXNlKGEpIGtpbGwoZ2V0cGlkKCksIChhKSkKKyNlbmRpZgorCisKKy8qIFN0YWNrIGJ1cm5pbmcuICAqLworCit2b2lkIF9nY3J5X2J1cm5fc3RhY2sgKGludCBieXRlcyk7CisKKworLyogVG8gYXZvaWQgdGhhdCBhIGNvbXBpbGVyIG9wdGltaXplcyBjZXJ0YWluIG1lbXNldCBjYWxscyBhd2F5LCB0aGVzZQorICAgbWFjcm9zIG1heSBiZSB1c2VkIGluc3RlYWQuICovCisjZGVmaW5lIHdpcGVtZW1vcnkyKF9wdHIsX3NldCxfbGVuKSBkbyB7IFwKKyAgICAgICAgICAgICAgdm9sYXRpbGUgY2hhciAqX3ZwdHI9KHZvbGF0aWxlIGNoYXIgKikoX3B0cik7IFwKKyAgICAgICAgICAgICAgc2l6ZV90IF92bGVuPShfbGVuKTsgXAorICAgICAgICAgICAgICB3aGlsZShfdmxlbikgeyAqX3ZwdHI9KF9zZXQpOyBfdnB0cisrOyBfdmxlbi0tOyB9IFwKKyAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMCkKKyNkZWZpbmUgd2lwZW1lbW9yeShfcHRyLF9sZW4pIHdpcGVtZW1vcnkyKF9wdHIsMCxfbGVuKQorCisKKworLyogRGlnaXQgcHJlZGljYXRlcy4gICovCisKKyNkZWZpbmUgZGlnaXRwKHApICAgKCoocCkgPj0gJzAnICYmICoocCkgPD0gJzknKQorI2RlZmluZSBvY3RkaWdpdHAocCkgKCoocCkgPj0gJzAnICYmICoocCkgPD0gJzcnKQorI2RlZmluZSBhbHBoYXAoYSkgICAgKCAgICgqKGEpID49ICdBJyAmJiAqKGEpIDw9ICdaJykgIFwKKyAgICAgICAgICAgICAgICAgICAgICB8fCAoKihhKSA+PSAnYScgJiYgKihhKSA8PSAneicpKQorI2RlZmluZSBoZXhkaWdpdHAoYSkgKGRpZ2l0cCAoYSkgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgfHwgKCooYSkgPj0gJ0EnICYmICooYSkgPD0gJ0YnKSAgXAorICAgICAgICAgICAgICAgICAgICAgIHx8ICgqKGEpID49ICdhJyAmJiAqKGEpIDw9ICdmJykpCisKKy8qIE1hbmFnZW1lbnQgZm9yIGNpcGhlcnMvZGlnZXN0cy9wdWJrZXktY2lwaGVycy4gICovCisKKy8qIFN0cnVjdHVyZSBmb3IgZWFjaCByZWdpc3RlcmVkIGBtb2R1bGUnLiAgKi8KK3N0cnVjdCBnY3J5X21vZHVsZQoreworICBzdHJ1Y3QgZ2NyeV9tb2R1bGUgKm5leHQ7ICAgICAvKiBMaXN0IHBvaW50ZXJzLiAgICAgICovCisgIHN0cnVjdCBnY3J5X21vZHVsZSAqKnByZXZwOworICB2b2lkICpzcGVjOwkJCS8qIFBvaW50ZXIgdG8gdGhlIHN1YnN5c3RlbS1zcGVjaWZpYworCQkJCSAgIHNwZWNpZmljYXRpb24gc3RydWN0dXJlLiAgKi8KKyAgdm9pZCAqZXh0cmFzcGVjOwkJLyogUG9pbnRlciB0byB0aGUgc3Vic3lzdGVtLXNwZWNpZmljCisJCQkJICAgZXh0cmEgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUuICAqLworICBpbnQgZmxhZ3M7CQkJLyogQXNzb2NpYXRlZCBmbGFncy4gICAqLworICBpbnQgY291bnRlcjsJCQkvKiBVc2UgY291bnRlci4gICAgICAgICovCisgIHVuc2lnbmVkIGludCBtb2RfaWQ7CQkvKiBJRCBvZiB0aGlzIG1vZHVsZS4gICovCit9OworCisvKiBGbGFncyBmb3IgdGhlIGBmbGFncycgbWVtYmVyIG9mIGdjcnlfbW9kdWxlX3QuICAqLworI2RlZmluZSBGTEFHX01PRFVMRV9ESVNBQkxFRCAoMSA8PCAwKQorCitnY3J5X2Vycl9jb2RlX3QgX2djcnlfbW9kdWxlX2FkZCAoZ2NyeV9tb2R1bGVfdCAqZW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqc3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpleHRyYXNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NyeV9tb2R1bGVfdCAqbW9kdWxlKTsKKwordHlwZWRlZiBpbnQgKCpnY3J5X21vZHVsZV9sb29rdXBfdCkgKHZvaWQgKnNwZWMsIHZvaWQgKmRhdGEpOworCisvKiBMb29rdXAgYSBtb2R1bGUgc3BlY2lmaWNhdGlvbiBieSBpdCdzIElELiAgQWZ0ZXIgYSBzdWNjZXNzZnVsbAorICAgbG9va3VwLCB0aGUgbW9kdWxlIGhhcyBpdCdzIHJlc291cmNlIGNvdW50ZXIgaW5jcmVtZW50ZWQuICAqLworZ2NyeV9tb2R1bGVfdCBfZ2NyeV9tb2R1bGVfbG9va3VwX2lkIChnY3J5X21vZHVsZV90IGVudHJpZXMsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBpZCk7CisKKy8qIEludGVybmFsIGZ1bmN0aW9uLiAgTG9va3VwIGEgbW9kdWxlIHNwZWNpZmljYXRpb24uICAqLworZ2NyeV9tb2R1bGVfdCBfZ2NyeV9tb2R1bGVfbG9va3VwIChnY3J5X21vZHVsZV90IGVudHJpZXMsIHZvaWQgKmRhdGEsCisJCQkJICAgIGdjcnlfbW9kdWxlX2xvb2t1cF90IGZ1bmMpOworCisvKiBSZWxlYXNlIGEgbW9kdWxlLiAgSW4gY2FzZSB0aGUgdXNlLWNvdW50ZXIgcmVhY2hlcyB6ZXJvLCBkZXN0cm95CisgICB0aGUgbW9kdWxlLiAgKi8KK3ZvaWQgX2djcnlfbW9kdWxlX3JlbGVhc2UgKGdjcnlfbW9kdWxlX3QgZW50cnkpOworCisvKiBBZGQgYSByZWZlcmVuY2UgdG8gYSBtb2R1bGUuICAqLwordm9pZCBfZ2NyeV9tb2R1bGVfdXNlIChnY3J5X21vZHVsZV90IG1vZHVsZSk7CisKKy8qIFJldHVybiBhIGxpc3Qgb2YgbW9kdWxlIElEcy4gICovCitnY3J5X2Vycl9jb2RlX3QgX2djcnlfbW9kdWxlX2xpc3QgKGdjcnlfbW9kdWxlX3QgbW9kdWxlcywKKwkJCQkgIGludCAqbGlzdCwgaW50ICpsaXN0X2xlbmd0aCk7CisKK2djcnlfZXJyX2NvZGVfdCBfZ2NyeV9jaXBoZXJfaW5pdCAodm9pZCk7CitnY3J5X2Vycl9jb2RlX3QgX2djcnlfbWRfaW5pdCAodm9pZCk7CitnY3J5X2Vycl9jb2RlX3QgX2djcnlfcGtfaW5pdCAodm9pZCk7CitnY3J5X2Vycl9jb2RlX3QgX2djcnlfYWNfaW5pdCAodm9pZCk7CisKK2djcnlfZXJyX2NvZGVfdCBfZ2NyeV9wa19tb2R1bGVfbG9va3VwIChpbnQgaWQsIGdjcnlfbW9kdWxlX3QgKm1vZHVsZSk7Cit2b2lkIF9nY3J5X3BrX21vZHVsZV9yZWxlYXNlIChnY3J5X21vZHVsZV90IG1vZHVsZSk7CitnY3J5X2Vycl9jb2RlX3QgX2djcnlfcGtfZ2V0X2VsZW1lbnRzIChpbnQgYWxnbywgY2hhciAqKmVuYywgY2hhciAqKnNpZyk7CisKKy8qIE1lbW9yeSBtYW5hZ2VtZW50LiAgKi8KKyNkZWZpbmUgR0NSWV9BTExPQ19GTEFHX1NFQ1VSRSAoMSA8PCAwKQorCisKKy8qLS0gc2V4cC5jIC0tKi8KK2djcnlfZXJyb3JfdCBfZ2NyeV9zZXhwX3ZidWlsZCAoZ2NyeV9zZXhwX3QgKnJldHNleHAsIHNpemVfdCAqZXJyb2ZmLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ19wdHIpOworY2hhciAqX2djcnlfc2V4cF9udGhfc3RyaW5nIChjb25zdCBnY3J5X3NleHBfdCBsaXN0LCBpbnQgbnVtYmVyKTsKKworCisvKi0tIGZpcHMuYyAtLSovCisKK3ZvaWQgX2djcnlfaW5pdGlhbGl6ZV9maXBzX21vZGUgKGludCBmb3JjZSk7CisKK2ludCBfZ2NyeV9maXBzX21vZGUgKHZvaWQpOworI2RlZmluZSBmaXBzX21vZGUoKSBfZ2NyeV9maXBzX21vZGUgKCkKKworaW50IF9nY3J5X2VuZm9yY2VkX2ZpcHNfbW9kZSAodm9pZCk7CisKK3ZvaWQgX2djcnlfaW5hY3RpdmF0ZV9maXBzX21vZGUgKGNvbnN0IGNoYXIgKnRleHQpOworaW50IF9nY3J5X2lzX2ZpcHNfbW9kZV9pbmFjdGl2ZSAodm9pZCk7CisKKwordm9pZCBfZ2NyeV9maXBzX3NpZ25hbF9lcnJvciAoY29uc3QgY2hhciAqc3JjZmlsZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjbGluZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzcmNmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGVzY3JpcHRpb24pOworI2lmZGVmIEpOTElCX0dDQ19NX0ZVTkNUSU9OCisjIGRlZmluZSBmaXBzX3NpZ25hbF9lcnJvcihhKSBcCisgICAgICAgICAgIF9nY3J5X2ZpcHNfc2lnbmFsX2Vycm9yIChfX0ZJTEVfXywgX19MSU5FX18sIF9fRlVOQ1RJT05fXywgMCwgKGEpKQorIyBkZWZpbmUgZmlwc19zaWduYWxfZmF0YWxfZXJyb3IoYSkgXAorICAgICAgICAgICBfZ2NyeV9maXBzX3NpZ25hbF9lcnJvciAoX19GSUxFX18sIF9fTElORV9fLCBfX0ZVTkNUSU9OX18sIDEsIChhKSkKKyNlbHNlCisjIGRlZmluZSBmaXBzX3NpZ25hbF9lcnJvcihhKSBcCisgICAgICAgICAgIF9nY3J5X2ZpcHNfc2lnbmFsX2Vycm9yIChfX0ZJTEVfXywgX19MSU5FX18sIE5VTEwsIDAsIChhKSkKKyMgZGVmaW5lIGZpcHNfc2lnbmFsX2ZhdGFsX2Vycm9yKGEpIFwKKyAgICAgICAgICAgX2djcnlfZmlwc19zaWduYWxfZXJyb3IgKF9fRklMRV9fLCBfX0xJTkVfXywgTlVMTCwgMSwgKGEpKQorI2VuZGlmCisKK2ludCBfZ2NyeV9maXBzX2lzX29wZXJhdGlvbmFsICh2b2lkKTsKKyNkZWZpbmUgZmlwc19pc19vcGVyYXRpb25hbCgpICAgKF9nY3J5X2dsb2JhbF9pc19vcGVyYXRpb25hbCAoKSkKKyNkZWZpbmUgZmlwc19ub3Rfb3BlcmF0aW9uYWwoKSAgKEdDUllfR1BHX0VSUl9OT1RfT1BFUkFUSU9OQUwpCisKK2ludCBfZ2NyeV9maXBzX3Rlc3Rfb3BlcmF0aW9uYWwgKHZvaWQpOworaW50IF9nY3J5X2ZpcHNfdGVzdF9lcnJvcl9vcl9vcGVyYXRpb25hbCAodm9pZCk7CisKK2dwZ19lcnJfY29kZV90IF9nY3J5X2ZpcHNfcnVuX3NlbGZ0ZXN0cyAoaW50IGV4dGVuZGVkKTsKKwordm9pZCBfZ2NyeV9maXBzX25vcmV0dXJuICh2b2lkKTsKKyNkZWZpbmUgZmlwc19ub3JldHVybigpICAoX2djcnlfZmlwc19ub3JldHVybiAoKSkKKworCisKKyNlbmRpZiAvKiBHMTBMSUJfSCAqLwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L3NyYy9nY3J5cHQtbW9kdWxlLmggYi9saWJnY3J5cHQtMS40LjYvc3JjL2djcnlwdC1tb2R1bGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzE3YjcwCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L3NyYy9nY3J5cHQtbW9kdWxlLmgKQEAgLTAsMCArMSwyMzMgQEAKKy8qIGdjcnlwdC1tb2R1bGUuaCAtIEdOVSBDcnlwdG9ncmFwaGljIExpYnJhcnkgSW50ZXJmYWNlCisgICBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgIAorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICAKKyAgIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgIAorICAgTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgIAorICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKy8qCisgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIG5lY2Vzc2FyeSBkZWNsYXJhdGlvbnMvZGVmaW5pdGlvbnMgZm9yCisgICB3b3JraW5nIHdpdGggTGliZ2NyeXB0IG1vZHVsZXMuICAKKyAqLworCisjaWZuZGVmIF9HQ1JZUFRfTU9EVUxFX0gKKyNkZWZpbmUgX0dDUllQVF9NT0RVTEVfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2lmIDAgLyoga2VlcCBFbWFjc2VucydzIGF1dG8taW5kZW50IGhhcHB5ICovCit9CisjZW5kaWYKKyNlbmRpZgorCisvKiBUaGUgaW50ZXJmYWNlcyB1c2luZyB0aGUgbW9kdWxlIHN5c3RlbSByZXNlcnZlIGEgY2VydGFpbiByYW5nZSBvZgorICAgSURzIGZvciBhcHBsaWNhdGlvbiB1c2UuICBUaGVzZSBJRHMgYXJlIG5vdCB2YWxpZCB3aXRoaW4gTGliZ2NyeXB0CisgICBidXQgTGliZ2NyeXB0IG1ha2VzIHN1cmUgbmV2ZXIgdG8gYWxsb2NhdGUgc3VjaCBhIG1vZHVsZSBJRC4gICovCisjZGVmaW5lIEdDUllfTU9EVUxFX0lEX1VTRVIgICAgICAxMDI0IAorI2RlZmluZSBHQ1JZX01PRFVMRV9JRF9VU0VSX0xBU1QgNDA5NQorCisKKy8qIFRoaXMgdHlwZSByZXByZXNlbnRzIGEgYG1vZHVsZScuICAqLwordHlwZWRlZiBzdHJ1Y3QgZ2NyeV9tb2R1bGUgKmdjcnlfbW9kdWxlX3Q7CisKKy8qIENoZWNrIHRoYXQgdGhlIGxpYnJhcnkgZnVsZmlsbHMgdGhlIHZlcnNpb24gcmVxdWlyZW1lbnQuICAqLworCisvKiBUeXBlIGZvciB0aGUgY2lwaGVyX3NldGtleSBmdW5jdGlvbi4gICovCit0eXBlZGVmIGdjcnlfZXJyX2NvZGVfdCAoKmdjcnlfY2lwaGVyX3NldGtleV90KSAodm9pZCAqYywKKwkJCQkJCSBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksCisJCQkJCQkgdW5zaWduZWQga2V5bGVuKTsKKworLyogVHlwZSBmb3IgdGhlIGNpcGhlcl9lbmNyeXB0IGZ1bmN0aW9uLiAgKi8KK3R5cGVkZWYgdm9pZCAoKmdjcnlfY2lwaGVyX2VuY3J5cHRfdCkgKHZvaWQgKmMsCisJCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dGJ1ZiwKKwkJCQkgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaW5idWYpOworCisvKiBUeXBlIGZvciB0aGUgY2lwaGVyX2RlY3J5cHQgZnVuY3Rpb24uICAqLwordHlwZWRlZiB2b2lkICgqZ2NyeV9jaXBoZXJfZGVjcnlwdF90KSAodm9pZCAqYywKKwkJCQkgICAgICAgdW5zaWduZWQgY2hhciAqb3V0YnVmLAorCQkJCSAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbmJ1Zik7CisKKy8qIFR5cGUgZm9yIHRoZSBjaXBoZXJfc3RlbmNyeXB0IGZ1bmN0aW9uLiAgKi8KK3R5cGVkZWYgdm9pZCAoKmdjcnlfY2lwaGVyX3N0ZW5jcnlwdF90KSAodm9pZCAqYywKKwkJCQkJIHVuc2lnbmVkIGNoYXIgKm91dGJ1ZiwKKwkJCQkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluYnVmLAorCQkJCQkgdW5zaWduZWQgaW50IG4pOworCisvKiBUeXBlIGZvciB0aGUgY2lwaGVyX3N0ZGVjcnlwdCBmdW5jdGlvbi4gICovCit0eXBlZGVmIHZvaWQgKCpnY3J5X2NpcGhlcl9zdGRlY3J5cHRfdCkgKHZvaWQgKmMsCisJCQkJCSB1bnNpZ25lZCBjaGFyICpvdXRidWYsCisJCQkJCSBjb25zdCB1bnNpZ25lZCBjaGFyICppbmJ1ZiwKKwkJCQkJIHVuc2lnbmVkIGludCBuKTsKKwordHlwZWRlZiBzdHJ1Y3QgZ2NyeV9jaXBoZXJfb2lkX3NwZWMKK3sKKyAgY29uc3QgY2hhciAqb2lkOworICBpbnQgbW9kZTsKK30gZ2NyeV9jaXBoZXJfb2lkX3NwZWNfdDsKKworLyogTW9kdWxlIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIGZvciBjaXBoZXJzLiAgKi8KK3R5cGVkZWYgc3RydWN0IGdjcnlfY2lwaGVyX3NwZWMKK3sKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgY29uc3QgY2hhciAqKmFsaWFzZXM7CisgIGdjcnlfY2lwaGVyX29pZF9zcGVjX3QgKm9pZHM7CisgIHNpemVfdCBibG9ja3NpemU7CisgIHNpemVfdCBrZXlsZW47CisgIHNpemVfdCBjb250ZXh0c2l6ZTsKKyAgZ2NyeV9jaXBoZXJfc2V0a2V5X3Qgc2V0a2V5OworICBnY3J5X2NpcGhlcl9lbmNyeXB0X3QgZW5jcnlwdDsKKyAgZ2NyeV9jaXBoZXJfZGVjcnlwdF90IGRlY3J5cHQ7CisgIGdjcnlfY2lwaGVyX3N0ZW5jcnlwdF90IHN0ZW5jcnlwdDsKKyAgZ2NyeV9jaXBoZXJfc3RkZWNyeXB0X3Qgc3RkZWNyeXB0OworfSBnY3J5X2NpcGhlcl9zcGVjX3Q7CisKKy8qIFJlZ2lzdGVyIGEgbmV3IGNpcGhlciBtb2R1bGUgd2hvc2Ugc3BlY2lmaWNhdGlvbiBjYW4gYmUgZm91bmQgaW4KKyAgIENJUEhFUi4gIE9uIHN1Y2Nlc3MsIGEgbmV3IGFsZ29yaXRobSBJRCBpcyBzdG9yZWQgaW4gQUxHT1JJVEhNX0lECisgICBhbmQgYSBwb2ludGVyIHJlcHJlc2VudGluZyB0aGlzIG1vZHVsZSBpcyBzdG9yZWQgaW4gTU9EVUxFLiAgKi8KK2djcnlfZXJyb3JfdCBnY3J5X2NpcGhlcl9yZWdpc3RlciAoZ2NyeV9jaXBoZXJfc3BlY190ICpjaXBoZXIsCisJCQkJICAgaW50ICphbGdvcml0aG1faWQsCisJCQkJICAgZ2NyeV9tb2R1bGVfdCAqbW9kdWxlKTsKKworLyogVW5yZWdpc3RlciB0aGUgY2lwaGVyIGlkZW50aWZpZWQgYnkgTU9EVUxFLCB3aGljaCBtdXN0IGhhdmUgYmVlbgorICAgcmVnaXN0ZXJlZCB3aXRoIGdjcnlfY2lwaGVyX3JlZ2lzdGVyLiAgKi8KK3ZvaWQgZ2NyeV9jaXBoZXJfdW5yZWdpc3RlciAoZ2NyeV9tb2R1bGVfdCBtb2R1bGUpOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqICovCisKKy8qIFR5cGUgZm9yIHRoZSBwa19nZW5lcmF0ZSBmdW5jdGlvbi4gICovCit0eXBlZGVmIGdjcnlfZXJyX2NvZGVfdCAoKmdjcnlfcGtfZ2VuZXJhdGVfdCkgKGludCBhbGdvLAorCQkJCQkgICAgICAgdW5zaWduZWQgaW50IG5iaXRzLAorCQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB1c2VfZSwKKwkJCQkJICAgICAgIGdjcnlfbXBpX3QgKnNrZXksCisJCQkJCSAgICAgICBnY3J5X21waV90ICoqcmV0ZmFjdG9ycyk7CisKKy8qIFR5cGUgZm9yIHRoZSBwa19jaGVja19zZWNyZXRfa2V5IGZ1bmN0aW9uLiAgKi8KK3R5cGVkZWYgZ2NyeV9lcnJfY29kZV90ICgqZ2NyeV9wa19jaGVja19zZWNyZXRfa2V5X3QpIChpbnQgYWxnbywKKwkJCQkJCSAgICAgICBnY3J5X21waV90ICpza2V5KTsKKworLyogVHlwZSBmb3IgdGhlIHBrX2VuY3J5cHQgZnVuY3Rpb24uICAqLwordHlwZWRlZiBnY3J5X2Vycl9jb2RlX3QgKCpnY3J5X3BrX2VuY3J5cHRfdCkgKGludCBhbGdvLAorCQkJCQkgICAgICBnY3J5X21waV90ICpyZXNhcnIsCisJCQkJCSAgICAgIGdjcnlfbXBpX3QgZGF0YSwKKwkJCQkJICAgICAgZ2NyeV9tcGlfdCAqcGtleSwKKwkJCQkJICAgICAgaW50IGZsYWdzKTsKKworLyogVHlwZSBmb3IgdGhlIHBrX2RlY3J5cHQgZnVuY3Rpb24uICAqLwordHlwZWRlZiBnY3J5X2Vycl9jb2RlX3QgKCpnY3J5X3BrX2RlY3J5cHRfdCkgKGludCBhbGdvLAorCQkJCQkgICAgICBnY3J5X21waV90ICpyZXN1bHQsCisJCQkJCSAgICAgIGdjcnlfbXBpX3QgKmRhdGEsCisJCQkJCSAgICAgIGdjcnlfbXBpX3QgKnNrZXksCisJCQkJCSAgICAgIGludCBmbGFncyk7CisKKy8qIFR5cGUgZm9yIHRoZSBwa19zaWduIGZ1bmN0aW9uLiAgKi8KK3R5cGVkZWYgZ2NyeV9lcnJfY29kZV90ICgqZ2NyeV9wa19zaWduX3QpIChpbnQgYWxnbywKKwkJCQkJICAgZ2NyeV9tcGlfdCAqcmVzYXJyLAorCQkJCQkgICBnY3J5X21waV90IGRhdGEsCisJCQkJCSAgIGdjcnlfbXBpX3QgKnNrZXkpOworCisvKiBUeXBlIGZvciB0aGUgcGtfdmVyaWZ5IGZ1bmN0aW9uLiAgKi8KK3R5cGVkZWYgZ2NyeV9lcnJfY29kZV90ICgqZ2NyeV9wa192ZXJpZnlfdCkgKGludCBhbGdvLAorCQkJCQkgICAgIGdjcnlfbXBpX3QgaGFzaCwKKwkJCQkJICAgICBnY3J5X21waV90ICpkYXRhLAorCQkJCQkgICAgIGdjcnlfbXBpX3QgKnBrZXksCisJCQkJCSAgICAgaW50ICgqY21wKSAodm9pZCAqLCBnY3J5X21waV90KSwKKwkJCQkJICAgICB2b2lkICpvcGFxdWV2KTsKKworLyogVHlwZSBmb3IgdGhlIHBrX2dldF9uYml0cyBmdW5jdGlvbi4gICovCit0eXBlZGVmIHVuc2lnbmVkICgqZ2NyeV9wa19nZXRfbmJpdHNfdCkgKGludCBhbGdvLCBnY3J5X21waV90ICpwa2V5KTsKKworLyogTW9kdWxlIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIGZvciBtZXNzYWdlIGRpZ2VzdHMuICAqLwordHlwZWRlZiBzdHJ1Y3QgZ2NyeV9wa19zcGVjCit7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGNvbnN0IGNoYXIgKiphbGlhc2VzOworICBjb25zdCBjaGFyICplbGVtZW50c19wa2V5OworICBjb25zdCBjaGFyICplbGVtZW50c19za2V5OworICBjb25zdCBjaGFyICplbGVtZW50c19lbmM7CisgIGNvbnN0IGNoYXIgKmVsZW1lbnRzX3NpZzsKKyAgY29uc3QgY2hhciAqZWxlbWVudHNfZ3JpcDsKKyAgaW50IHVzZTsKKyAgZ2NyeV9wa19nZW5lcmF0ZV90IGdlbmVyYXRlOworICBnY3J5X3BrX2NoZWNrX3NlY3JldF9rZXlfdCBjaGVja19zZWNyZXRfa2V5OworICBnY3J5X3BrX2VuY3J5cHRfdCBlbmNyeXB0OworICBnY3J5X3BrX2RlY3J5cHRfdCBkZWNyeXB0OworICBnY3J5X3BrX3NpZ25fdCBzaWduOworICBnY3J5X3BrX3ZlcmlmeV90IHZlcmlmeTsKKyAgZ2NyeV9wa19nZXRfbmJpdHNfdCBnZXRfbmJpdHM7Cit9IGdjcnlfcGtfc3BlY190OworCisvKiBSZWdpc3RlciBhIG5ldyBwdWJrZXkgbW9kdWxlIHdob3NlIHNwZWNpZmljYXRpb24gY2FuIGJlIGZvdW5kIGluCisgICBQVUJLRVkuICBPbiBzdWNjZXNzLCBhIG5ldyBhbGdvcml0aG0gSUQgaXMgc3RvcmVkIGluIEFMR09SSVRITV9JRAorICAgYW5kIGEgcG9pbnRlciByZXByZXNlbnRoaW5nIHRoaXMgbW9kdWxlIGlzIHN0b3JlZCBpbiBNT0RVTEUuICAqLworZ2NyeV9lcnJvcl90IGdjcnlfcGtfcmVnaXN0ZXIgKGdjcnlfcGtfc3BlY190ICpwdWJrZXksCisJCQkgICAgICAgdW5zaWduZWQgaW50ICphbGdvcml0aG1faWQsCisJCQkgICAgICAgZ2NyeV9tb2R1bGVfdCAqbW9kdWxlKTsKKworLyogVW5yZWdpc3RlciB0aGUgcHVia2V5IGlkZW50aWZpZWQgYnkgSUQsIHdoaWNoIG11c3QgaGF2ZSBiZWVuCisgICByZWdpc3RlcmVkIHdpdGggZ2NyeV9wa19yZWdpc3Rlci4gICovCit2b2lkIGdjcnlfcGtfdW5yZWdpc3RlciAoZ2NyeV9tb2R1bGVfdCBtb2R1bGUpOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqICovCisKKy8qIFR5cGUgZm9yIHRoZSBtZF9pbml0IGZ1bmN0aW9uLiAgKi8KK3R5cGVkZWYgdm9pZCAoKmdjcnlfbWRfaW5pdF90KSAodm9pZCAqYyk7CisKKy8qIFR5cGUgZm9yIHRoZSBtZF93cml0ZSBmdW5jdGlvbi4gICovCit0eXBlZGVmIHZvaWQgKCpnY3J5X21kX3dyaXRlX3QpICh2b2lkICpjLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBuYnl0ZXMpOworCisvKiBUeXBlIGZvciB0aGUgbWRfZmluYWwgZnVuY3Rpb24uICAqLwordHlwZWRlZiB2b2lkICgqZ2NyeV9tZF9maW5hbF90KSAodm9pZCAqYyk7CisKKy8qIFR5cGUgZm9yIHRoZSBtZF9yZWFkIGZ1bmN0aW9uLiAgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhciAqKCpnY3J5X21kX3JlYWRfdCkgKHZvaWQgKmMpOworCit0eXBlZGVmIHN0cnVjdCBnY3J5X21kX29pZF9zcGVjCit7CisgIGNvbnN0IGNoYXIgKm9pZHN0cmluZzsKK30gZ2NyeV9tZF9vaWRfc3BlY190OworCisvKiBNb2R1bGUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgZm9yIG1lc3NhZ2UgZGlnZXN0cy4gICovCit0eXBlZGVmIHN0cnVjdCBnY3J5X21kX3NwZWMKK3sKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgdW5zaWduZWQgY2hhciAqYXNub2lkOworICBpbnQgYXNubGVuOworICBnY3J5X21kX29pZF9zcGVjX3QgKm9pZHM7CisgIGludCBtZGxlbjsKKyAgZ2NyeV9tZF9pbml0X3QgaW5pdDsKKyAgZ2NyeV9tZF93cml0ZV90IHdyaXRlOworICBnY3J5X21kX2ZpbmFsX3QgZmluYWw7CisgIGdjcnlfbWRfcmVhZF90IHJlYWQ7CisgIHNpemVfdCBjb250ZXh0c2l6ZTsgLyogYWxsb2NhdGUgdGhpcyBhbW91bnQgb2YgY29udGV4dCAqLworfSBnY3J5X21kX3NwZWNfdDsKKworLyogUmVnaXN0ZXIgYSBuZXcgZGlnZXN0IG1vZHVsZSB3aG9zZSBzcGVjaWZpY2F0aW9uIGNhbiBiZSBmb3VuZCBpbgorICAgRElHRVNULiAgT24gc3VjY2VzcywgYSBuZXcgYWxnb3JpdGhtIElEIGlzIHN0b3JlZCBpbiBBTEdPUklUSE1fSUQKKyAgIGFuZCBhIHBvaW50ZXIgcmVwcmVzZW50aGluZyB0aGlzIG1vZHVsZSBpcyBzdG9yZWQgaW4gTU9EVUxFLiAgKi8KK2djcnlfZXJyb3JfdCBnY3J5X21kX3JlZ2lzdGVyIChnY3J5X21kX3NwZWNfdCAqZGlnZXN0LAorCQkJICAgICAgIHVuc2lnbmVkIGludCAqYWxnb3JpdGhtX2lkLAorCQkJICAgICAgIGdjcnlfbW9kdWxlX3QgKm1vZHVsZSk7CisKKy8qIFVucmVnaXN0ZXIgdGhlIGRpZ2VzdCBpZGVudGlmaWVkIGJ5IElELCB3aGljaCBtdXN0IGhhdmUgYmVlbgorICAgcmVnaXN0ZXJlZCB3aXRoIGdjcnlfZGlnZXN0X3JlZ2lzdGVyLiAgKi8KK3ZvaWQgZ2NyeV9tZF91bnJlZ2lzdGVyIChnY3J5X21vZHVsZV90IG1vZHVsZSk7CisKKyNpZiAwIC8qIGtlZXAgRW1hY3NlbnMncyBhdXRvLWluZGVudCBoYXBweSAqLworeworI2VuZGlmCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvc3JjL2djcnlwdC5oIGIvbGliZ2NyeXB0LTEuNC42L3NyYy9nY3J5cHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjE3OWYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L3NyYy9nY3J5cHQuaApAQCAtMCwwICsxLDE4MzkgQEAKKy8qIGdjcnlwdC5oIC0gIEdOVSBDcnlwdG9ncmFwaGljIExpYnJhcnkgSW50ZXJmYWNlICAgICAgICAgICAgICAtKi0gYyAtKi0KKyAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNgorICAgICAgICAgICAgICAgICAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgIAorICAgTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgCisgICBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAgCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKyAgIEZpbGU6IHNyYy9nY3J5cHQuaC4gIEdlbmVyYXRlZCBmcm9tIGdjcnlwdC5oLmluIGJ5IGNvbmZpZ3VyZS4gKi8KKworI2lmbmRlZiBfR0NSWVBUX0gKKyNkZWZpbmUgX0dDUllQVF9ICisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdwZy1lcnJvci5oPgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpZiBkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzJfXworIyBpbmNsdWRlIDx3aW5zb2NrMi5oPgorIyBpbmNsdWRlIDx3czJ0Y3BpcC5oPgorIyBpbmNsdWRlIDx0aW1lLmg+CisjIGlmbmRlZiBfX0dOVUNfXworICB0eXBlZGVmIGxvbmcgc3NpemVfdDsKKyAgdHlwZWRlZiBpbnQgIHBpZF90OworIyBlbmRpZiAvKiFfX0dOVUNfXyovCisjZWxzZQorIyBpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjIGluY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYgLyohX1dJTjMyKi8KKwordHlwZWRlZiBzb2NrbGVuX3QgZ2NyeV9zb2NrbGVuX3Q7CisKKworLyogVGhpcyBpcyByZXF1aXJlZCBmb3IgZXJyb3IgY29kZSBjb21wYXRpYmlsaXR5LiAqLworI2RlZmluZSBfR0NSWV9FUlJfU09VUkNFX0RFRkFVTFQgR1BHX0VSUl9TT1VSQ0VfR0NSWVBUCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjaWYgMCAvKiAoS2VlcCBFbWFjc2VucycgYXV0by1pbmRlbnQgaGFwcHkuKSAqLworfQorI2VuZGlmCisjZW5kaWYKKworLyogVGhlIHZlcnNpb24gb2YgdGhpcyBoZWFkZXIgc2hvdWxkIG1hdGNoIHRoZSBvbmUgb2YgdGhlIGxpYnJhcnkuIEl0CisgICBzaG91bGQgbm90IGJlIHVzZWQgYnkgYSBwcm9ncmFtIGJlY2F1c2UgZ2NyeV9jaGVja192ZXJzaW9uKCkgc2hvdWxkCisgICByZXR1cm4gdGhlIHNhbWUgdmVyc2lvbi4gIFRoZSBwdXJwb3NlIG9mIHRoaXMgbWFjcm8gaXMgdG8gbGV0CisgICBhdXRvY29uZiAodXNpbmcgdGhlIEFNX1BBVEhfR0NSWVBUIG1hY3JvKSBjaGVjayB0aGF0IHRoaXMgaGVhZGVyCisgICBtYXRjaGVzIHRoZSBpbnN0YWxsZWQgbGlicmFyeS4gICovCisjZGVmaW5lIEdDUllQVF9WRVJTSU9OICIxLjQuNiIKKworLyogSW50ZXJuYWw6IFdlIGNhbid0IHVzZSB0aGUgY29udmVuaWVuY2UgbWFjcm9zIGZvciB0aGUgbXVsdGkKKyAgIHByZWNpc2lvbiBpbnRlZ2VyIGZ1bmN0aW9ucyB3aGVuIGJ1aWxkaW5nIHRoaXMgbGlicmFyeS4gKi8KKyNpZmRlZiBfR0NSWVBUX0lOX0xJQkdDUllQVAorI2lmbmRlZiBHQ1JZUFRfTk9fTVBJX01BQ1JPUworI2RlZmluZSBHQ1JZUFRfTk9fTVBJX01BQ1JPUyAxCisjZW5kaWYKKyNlbmRpZgorCisvKiBXZSB3YW50IHRvIHVzZSBnY2MgYXR0cmlidXRlcyB3aGVuIHBvc3NpYmxlLiAgV2FybmluZzogRG9uJ3QgdXNlCisgICB0aGVzZSBtYWNyb3MgaW4geW91ciBwcm9ncmFtczogQXMgaW5kaWNhdGVkIGJ5IHRoZSBsZWFkaW5nCisgICB1bmRlcnNjb3JlIHRoZXkgYXJlIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLiAqLworI2lmZGVmIF9fR05VQ19fCisKKyNkZWZpbmUgX0dDUllfR0NDX1ZFUlNJT04gKF9fR05VQ19fICogMTAwMDAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIF9fR05VQ19NSU5PUl9fICogMTAwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBfX0dOVUNfUEFUQ0hMRVZFTF9fKQorCisjaWYgX0dDUllfR0NDX1ZFUlNJT04gPj0gMzAxMDAKKyNkZWZpbmUgX0dDUllfR0NDX0FUVFJfREVQUkVDQVRFRCBfX2F0dHJpYnV0ZV9fICgoX19kZXByZWNhdGVkX18pKQorI2VuZGlmCisKKyNpZiBfR0NSWV9HQ0NfVkVSU0lPTiA+PSAyOTYwMAorI2RlZmluZSBfR0NSWV9HQ0NfQVRUUl9QVVJFICBfX2F0dHJpYnV0ZV9fICgoX19wdXJlX18pKQorI2VuZGlmCisKKyNpZiBfR0NSWV9HQ0NfVkVSU0lPTiA+PSAzMDIwMAorI2RlZmluZSBfR0NSWV9HQ0NfQVRUUl9NQUxMT0MgIF9fYXR0cmlidXRlX18gKChfX21hbGxvY19fKSkKKyNlbmRpZgorCisjZW5kaWYgLypfX0dOVUNfXyovCisKKyNpZm5kZWYgX0dDUllfR0NDX0FUVFJfREVQUkVDQVRFRAorI2RlZmluZSBfR0NSWV9HQ0NfQVRUUl9ERVBSRUNBVEVECisjZW5kaWYKKyNpZm5kZWYgX0dDUllfR0NDX0FUVFJfUFVSRQorI2RlZmluZSBfR0NSWV9HQ0NfQVRUUl9QVVJFCisjZW5kaWYKKyNpZm5kZWYgX0dDUllfR0NDX0FUVFJfTUFMTE9DCisjZGVmaW5lIF9HQ1JZX0dDQ19BVFRSX01BTExPQworI2VuZGlmCisKKy8qIFNvbWUgbWVtYmVycyBpbiBhIHB1YmxpYyB0eXBlIHNob3VsZCBvbmx5IGJlIHVzZWQgaW50ZXJuYWxseS4KKyAgIFRoZXJlIGlzIG5vICJpbnRlcm5hbCIgYXR0cmlidXRlLCBzbyB3ZSBhYnVzZSB0aGUgZGVwcmVjYXRlZAorICAgYXR0cmlidXRlIHRvIGRpc2NvdXJhZ2UgZXh0ZXJuYWwgdXNlLiAgKi8KKyNpZmRlZiBfR0NSWVBUX0lOX0xJQkdDUllQVAorI2RlZmluZSBfR0NSWV9BVFRSX0lOVEVSTkFMCisjZWxzZQorI2RlZmluZSBfR0NSWV9BVFRSX0lOVEVSTkFMCV9HQ1JZX0dDQ19BVFRSX0RFUFJFQ0FURUQKKyNlbmRpZgorCisvKiBXcmFwcGVycyBmb3IgdGhlIGxpYmdwZy1lcnJvciBsaWJyYXJ5LiAgKi8KKwordHlwZWRlZiBncGdfZXJyb3JfdCBnY3J5X2Vycm9yX3Q7Cit0eXBlZGVmIGdwZ19lcnJfY29kZV90IGdjcnlfZXJyX2NvZGVfdDsKK3R5cGVkZWYgZ3BnX2Vycl9zb3VyY2VfdCBnY3J5X2Vycl9zb3VyY2VfdDsKKworc3RhdGljIEdQR19FUlJfSU5MSU5FIGdjcnlfZXJyb3JfdAorZ2NyeV9lcnJfbWFrZSAoZ2NyeV9lcnJfc291cmNlX3Qgc291cmNlLCBnY3J5X2Vycl9jb2RlX3QgY29kZSkKK3sKKyAgcmV0dXJuIGdwZ19lcnJfbWFrZSAoc291cmNlLCBjb2RlKTsKK30KKworLyogVGhlIHVzZXIgY2FuIGRlZmluZSBHUEdfRVJSX1NPVVJDRV9ERUZBVUxUIGJlZm9yZSBpbmNsdWRpbmcgdGhpcworICAgZmlsZSB0byBzcGVjaWZ5IGEgZGVmYXVsdCBzb3VyY2UgZm9yIGdwZ19lcnJvci4gICovCisjaWZuZGVmIEdDUllfRVJSX1NPVVJDRV9ERUZBVUxUCisjZGVmaW5lIEdDUllfRVJSX1NPVVJDRV9ERUZBVUxUICBHUEdfRVJSX1NPVVJDRV9VU0VSXzEKKyNlbmRpZgorCitzdGF0aWMgR1BHX0VSUl9JTkxJTkUgZ2NyeV9lcnJvcl90CitnY3J5X2Vycm9yIChnY3J5X2Vycl9jb2RlX3QgY29kZSkKK3sKKyAgcmV0dXJuIGdjcnlfZXJyX21ha2UgKEdDUllfRVJSX1NPVVJDRV9ERUZBVUxULCBjb2RlKTsKK30KKworc3RhdGljIEdQR19FUlJfSU5MSU5FIGdjcnlfZXJyX2NvZGVfdAorZ2NyeV9lcnJfY29kZSAoZ2NyeV9lcnJvcl90IGVycikKK3sKKyAgcmV0dXJuIGdwZ19lcnJfY29kZSAoZXJyKTsKK30KKworCitzdGF0aWMgR1BHX0VSUl9JTkxJTkUgZ2NyeV9lcnJfc291cmNlX3QKK2djcnlfZXJyX3NvdXJjZSAoZ2NyeV9lcnJvcl90IGVycikKK3sKKyAgcmV0dXJuIGdwZ19lcnJfc291cmNlIChlcnIpOworfQorCisvKiBSZXR1cm4gYSBwb2ludGVyIHRvIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZXJyb3IKKyAgIGNvZGUgaW4gdGhlIGVycm9yIHZhbHVlIEVSUi4gICovCitjb25zdCBjaGFyICpnY3J5X3N0cmVycm9yIChnY3J5X2Vycm9yX3QgZXJyKTsKKworLyogUmV0dXJuIGEgcG9pbnRlciB0byBhIHN0cmluZyBjb250YWluaW5nIGEgZGVzY3JpcHRpb24gb2YgdGhlIGVycm9yCisgICBzb3VyY2UgaW4gdGhlIGVycm9yIHZhbHVlIEVSUi4gICovCitjb25zdCBjaGFyICpnY3J5X3N0cnNvdXJjZSAoZ2NyeV9lcnJvcl90IGVycik7CisKKy8qIFJldHJpZXZlIHRoZSBlcnJvciBjb2RlIGZvciB0aGUgc3lzdGVtIGVycm9yIEVSUi4gIFRoaXMgcmV0dXJucworICAgR1BHX0VSUl9VTktOT1dOX0VSUk5PIGlmIHRoZSBzeXN0ZW0gZXJyb3IgaXMgbm90IG1hcHBlZCAocmVwb3J0CisgICB0aGlzKS4gICovCitnY3J5X2Vycl9jb2RlX3QgZ2NyeV9lcnJfY29kZV9mcm9tX2Vycm5vIChpbnQgZXJyKTsKKworLyogUmV0cmlldmUgdGhlIHN5c3RlbSBlcnJvciBmb3IgdGhlIGVycm9yIGNvZGUgQ09ERS4gIFRoaXMgcmV0dXJucyAwCisgICBpZiBDT0RFIGlzIG5vdCBhIHN5c3RlbSBlcnJvciBjb2RlLiAgKi8KK2ludCBnY3J5X2Vycl9jb2RlX3RvX2Vycm5vIChnY3J5X2Vycl9jb2RlX3QgY29kZSk7CisKKy8qIFJldHVybiBhbiBlcnJvciB2YWx1ZSB3aXRoIHRoZSBlcnJvciBzb3VyY2UgU09VUkNFIGFuZCB0aGUgc3lzdGVtCisgICBlcnJvciBFUlIuICAqLworZ2NyeV9lcnJvcl90IGdjcnlfZXJyX21ha2VfZnJvbV9lcnJubyAoZ2NyeV9lcnJfc291cmNlX3Qgc291cmNlLCBpbnQgZXJyKTsKKworLyogUmV0dXJuIGFuIGVycm9yIHZhbHVlIHdpdGggdGhlIHN5c3RlbSBlcnJvciBFUlIuICAqLworZ2NyeV9lcnJfY29kZV90IGdjcnlfZXJyb3JfZnJvbV9lcnJubyAoaW50IGVycik7CisKKwwKKy8qIFRoaXMgZW51bSBpcyBkZXByZWNhdGVkOyBpdCBpcyBvbmx5IGRlY2xhcmVkIGZvciB0aGUgc2FrZSBvZgorICAgY29tcGxldGUgQVBJIGNvbXBhdGliaWxpdHkuICAqLworZW51bSBnY3J5X3RocmVhZF9vcHRpb24KKyAgeworICAgIF9HQ1JZX1RIUkVBRF9PUFRJT05fRFVNTVkKKyAgfSBfR0NSWV9HQ0NfQVRUUl9ERVBSRUNBVEVEOworCisKKy8qIENvbnN0YW50cyBkZWZpbmluZyB0aGUgdGhyZWFkIG1vZGVsIHRvIHVzZS4gIFVzZWQgd2l0aCB0aGUgT1BUSU9OCisgICBmaWVsZCBvZiB0aGUgc3RydWN0IGdjcnlfdGhyZWFkX2Nicy4gICovCisjZGVmaW5lIEdDUllfVEhSRUFEX09QVElPTl9ERUZBVUxUICAwCisjZGVmaW5lIEdDUllfVEhSRUFEX09QVElPTl9VU0VSICAgICAxCisjZGVmaW5lIEdDUllfVEhSRUFEX09QVElPTl9QVEggICAgICAyCisjZGVmaW5lIEdDUllfVEhSRUFEX09QVElPTl9QVEhSRUFEICAzCisKKy8qIFRoZSB2ZXJzaW9uIG51bWJlciBlbmNvZGVkIGluIHRoZSBPUFRJT04gZmllbGQgb2YgdGhlIHN0cnVjdAorICAgZ2NyeV90aHJlYWRfY2JzLiAgKi8KKyNkZWZpbmUgR0NSWV9USFJFQURfT1BUSU9OX1ZFUlNJT04gIDAKKworLyogV3JhcHBlciBmb3Igc3RydWN0IGF0aF9vcHMuICAqLworc3RydWN0IGdjcnlfdGhyZWFkX2NicworeworICAvKiBUaGUgT1BUSU9OIGZpZWxkIGVuY29kZXMgdGhlIHRocmVhZCBtb2RlbCBhbmQgdGhlIHZlcnNpb24gbnVtYmVyCisgICAgIG9mIHRoaXMgc3RydWN0dXJlLiAgIAorICAgICAgIEJpdHMgIDcgLSAwICBhcmUgdXNlZCBmb3IgdGhlIHRocmVhZCBtb2RlbAorICAgICAgIEJpdHMgMTUgLSA4ICBhcmUgdXNlZCBmb3IgdGhlIHZlcnNpb24gbnVtYmVyLgorICAqLworICB1bnNpZ25lZCBpbnQgb3B0aW9uOworCisgIGludCAoKmluaXQpICh2b2lkKTsKKyAgaW50ICgqbXV0ZXhfaW5pdCkgKHZvaWQgKipwcml2KTsKKyAgaW50ICgqbXV0ZXhfZGVzdHJveSkgKHZvaWQgKipwcml2KTsKKyAgaW50ICgqbXV0ZXhfbG9jaykgKHZvaWQgKipwcml2KTsKKyAgaW50ICgqbXV0ZXhfdW5sb2NrKSAodm9pZCAqKnByaXYpOworICBzc2l6ZV90ICgqcmVhZCkgKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3QgbmJ5dGVzKTsKKyAgc3NpemVfdCAoKndyaXRlKSAoaW50IGZkLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBuYnl0ZXMpOworI2lmZGVmIF9XSU4zMgorICBzc2l6ZV90ICgqc2VsZWN0KSAoaW50IG5mZCwgdm9pZCAqcnNldCwgdm9pZCAqd3NldCwgdm9pZCAqZXNldCwKKwkJICAgICBzdHJ1Y3QgdGltZXZhbCAqdGltZW91dCk7CisgIHNzaXplX3QgKCp3YWl0cGlkKSAocGlkX3QgcGlkLCBpbnQgKnN0YXR1cywgaW50IG9wdGlvbnMpOworICBpbnQgKCphY2NlcHQpIChpbnQgcywgdm9pZCAgKmFkZHIsIGludCAqbGVuZ3RoX3B0cik7CisgIGludCAoKmNvbm5lY3QpIChpbnQgcywgdm9pZCAqYWRkciwgZ2NyeV9zb2NrbGVuX3QgbGVuZ3RoKTsKKyAgaW50ICgqc2VuZG1zZykgKGludCBzLCBjb25zdCB2b2lkICptc2csIGludCBmbGFncyk7CisgIGludCAoKnJlY3Ztc2cpIChpbnQgcywgdm9pZCAqbXNnLCBpbnQgZmxhZ3MpOworI2Vsc2UKKyAgc3NpemVfdCAoKnNlbGVjdCkgKGludCBuZmQsIGZkX3NldCAqcnNldCwgZmRfc2V0ICp3c2V0LCBmZF9zZXQgKmVzZXQsCisJCSAgICAgc3RydWN0IHRpbWV2YWwgKnRpbWVvdXQpOworICBzc2l6ZV90ICgqd2FpdHBpZCkgKHBpZF90IHBpZCwgaW50ICpzdGF0dXMsIGludCBvcHRpb25zKTsKKyAgaW50ICgqYWNjZXB0KSAoaW50IHMsIHN0cnVjdCBzb2NrYWRkciAqYWRkciwgZ2NyeV9zb2NrbGVuX3QgKmxlbmd0aF9wdHIpOworICBpbnQgKCpjb25uZWN0KSAoaW50IHMsIHN0cnVjdCBzb2NrYWRkciAqYWRkciwgZ2NyeV9zb2NrbGVuX3QgbGVuZ3RoKTsKKyAgaW50ICgqc2VuZG1zZykgKGludCBzLCBjb25zdCBzdHJ1Y3QgbXNnaGRyICptc2csIGludCBmbGFncyk7CisgIGludCAoKnJlY3Ztc2cpIChpbnQgcywgc3RydWN0IG1zZ2hkciAqbXNnLCBpbnQgZmxhZ3MpOworI2VuZGlmCit9OworCisjaWZkZWYgX1dJTjMyCisjIGRlZmluZSBfR0NSWV9USFJFQURfT1BUSU9OX1BUSF9JTVBMX05FVAkJCQkgICAgICBcCitzdGF0aWMgc3NpemVfdCBnY3J5X3B0aF9zZWxlY3QgKGludCBuZmQsIHZvaWQgKnJzZXQsIHZvaWQgKndzZXQsCSAgICAgIFwKKwkJCQl2b2lkICplc2V0LCBzdHJ1Y3QgdGltZXZhbCAqdGltZW91dCkJICAgICAgXAorICB7IHJldHVybiBwdGhfc2VsZWN0IChuZmQsIHJzZXQsIHdzZXQsIGVzZXQsIHRpbWVvdXQpOyB9CQkgICAgICBcCitzdGF0aWMgc3NpemVfdCBnY3J5X3B0aF93YWl0cGlkIChwaWRfdCBwaWQsIGludCAqc3RhdHVzLCBpbnQgb3B0aW9ucykJICAgICAgXAorICB7IHJldHVybiBwdGhfd2FpdHBpZCAocGlkLCBzdGF0dXMsIG9wdGlvbnMpOyB9CQkJICAgICAgXAorc3RhdGljIGludCBnY3J5X3B0aF9hY2NlcHQgKGludCBzLCB2b2lkICphZGRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJICAgIGdjcnlfc29ja2xlbl90ICpsZW5ndGhfcHRyKQkJCSAgICAgIFwKKyAgeyByZXR1cm4gcHRoX2FjY2VwdCAocywgYWRkciwgbGVuZ3RoX3B0cik7IH0JCQkJICAgICAgXAorc3RhdGljIGludCBnY3J5X3B0aF9jb25uZWN0IChpbnQgcywgdm9pZCAqYWRkciwJCSAgICAgICAgICAgICAgICAgICAgICBcCisJCQkgICAgIGdjcnlfc29ja2xlbl90IGxlbmd0aCkJCQkgICAgICBcCisgIHsgcmV0dXJuIHB0aF9jb25uZWN0IChzLCBhZGRyLCBsZW5ndGgpOyB9CisjZWxzZSAvKiFfV0lOMzIqLworIyBkZWZpbmUgX0dDUllfVEhSRUFEX09QVElPTl9QVEhfSU1QTF9ORVQJCQkJICAgICAgXAorc3RhdGljIHNzaXplX3QgZ2NyeV9wdGhfc2VsZWN0IChpbnQgbmZkLCBmZF9zZXQgKnJzZXQsIGZkX3NldCAqd3NldCwJICAgICAgXAorCQkJCWZkX3NldCAqZXNldCwgc3RydWN0IHRpbWV2YWwgKnRpbWVvdXQpCSAgICAgIFwKKyAgeyByZXR1cm4gcHRoX3NlbGVjdCAobmZkLCByc2V0LCB3c2V0LCBlc2V0LCB0aW1lb3V0KTsgfQkJICAgICAgXAorc3RhdGljIHNzaXplX3QgZ2NyeV9wdGhfd2FpdHBpZCAocGlkX3QgcGlkLCBpbnQgKnN0YXR1cywgaW50IG9wdGlvbnMpCSAgICAgIFwKKyAgeyByZXR1cm4gcHRoX3dhaXRwaWQgKHBpZCwgc3RhdHVzLCBvcHRpb25zKTsgfQkJCSAgICAgIFwKK3N0YXRpYyBpbnQgZ2NyeV9wdGhfYWNjZXB0IChpbnQgcywgc3RydWN0IHNvY2thZGRyICphZGRyLAkJICAgICAgXAorCQkJICAgIGdjcnlfc29ja2xlbl90ICpsZW5ndGhfcHRyKQkJCSAgICAgIFwKKyAgeyByZXR1cm4gcHRoX2FjY2VwdCAocywgYWRkciwgbGVuZ3RoX3B0cik7IH0JCQkJICAgICAgXAorc3RhdGljIGludCBnY3J5X3B0aF9jb25uZWN0IChpbnQgcywgc3RydWN0IHNvY2thZGRyICphZGRyLAkJICAgICAgXAorCQkJICAgICBnY3J5X3NvY2tsZW5fdCBsZW5ndGgpCQkJICAgICAgXAorICB7IHJldHVybiBwdGhfY29ubmVjdCAocywgYWRkciwgbGVuZ3RoKTsgfQorI2VuZGlmIC8qIV9XSU4zMiovCisKKworCisjZGVmaW5lIEdDUllfVEhSRUFEX09QVElPTl9QVEhfSU1QTAkJCQkJICAgICAgXAorc3RhdGljIGludCBnY3J5X3B0aF9pbml0ICh2b2lkKQkJCQkJCSAgICAgIFwKK3sgcmV0dXJuIChwdGhfaW5pdCAoKSA9PSBGQUxTRSkgPyBlcnJubyA6IDA7IH0JCQkJICAgICAgXAorc3RhdGljIGludCBnY3J5X3B0aF9tdXRleF9pbml0ICh2b2lkICoqcHJpdikJCQkJICAgICAgXAorewkJCQkJCQkJCSAgICAgIFwKKyAgaW50IGVyciA9IDA7CQkJCQkJCQkgICAgICBcCisgIHB0aF9tdXRleF90ICpsb2NrID0gbWFsbG9jIChzaXplb2YgKHB0aF9tdXRleF90KSk7CQkJICAgICAgXAorCQkJCQkJCQkJICAgICAgXAorICBpZiAoIWxvY2spCQkJCQkJCQkgICAgICBcCisgICAgZXJyID0gRU5PTUVNOwkJCQkJCQkgICAgICBcCisgIGlmICghZXJyKQkJCQkJCQkJICAgICAgXAorICAgIHsJCQkJCQkJCQkgICAgICBcCisgICAgICBlcnIgPSBwdGhfbXV0ZXhfaW5pdCAobG9jayk7CQkJCQkgICAgICBcCisgICAgICBpZiAoZXJyID09IEZBTFNFKQkJCQkJCQkgICAgICBcCisJZXJyID0gZXJybm87CQkJCQkJCSAgICAgIFwKKyAgICAgIGVsc2UJCQkJCQkJCSAgICAgIFwKKwllcnIgPSAwOwkJCQkJCQkgICAgICBcCisgICAgICBpZiAoZXJyKQkJCQkJCQkJICAgICAgXAorCWZyZWUgKGxvY2spOwkJCQkJCQkgICAgICBcCisgICAgICBlbHNlCQkJCQkJCQkgICAgICBcCisJKnByaXYgPSBsb2NrOwkJCQkJCQkgICAgICBcCisgICAgfQkJCQkJCQkJCSAgICAgIFwKKyAgcmV0dXJuIGVycjsJCQkJCQkJCSAgICAgIFwKK30JCQkJCQkJCQkgICAgICBcCitzdGF0aWMgaW50IGdjcnlfcHRoX211dGV4X2Rlc3Ryb3kgKHZvaWQgKipsb2NrKQkJCQkgICAgICBcCisgIHsgLyogR05VIFB0aCBoYXMgbm8gZGVzdHJ1Y3RvciBmdW5jdGlvbi4gICovIGZyZWUgKCpsb2NrKTsgcmV0dXJuIDA7IH0gICAgICBcCitzdGF0aWMgaW50IGdjcnlfcHRoX211dGV4X2xvY2sgKHZvaWQgKipsb2NrKQkJCQkgICAgICBcCisgIHsgcmV0dXJuICgocHRoX211dGV4X2FjcXVpcmUgKCpsb2NrLCAwLCBOVUxMKSkgPT0gRkFMU0UpCQkgICAgICBcCisgICAgICA/IGVycm5vIDogMDsgfQkJCQkJCQkgICAgICBcCitzdGF0aWMgaW50IGdjcnlfcHRoX211dGV4X3VubG9jayAodm9pZCAqKmxvY2spCQkJCSAgICAgIFwKKyAgeyByZXR1cm4gKChwdGhfbXV0ZXhfcmVsZWFzZSAoKmxvY2spKSA9PSBGQUxTRSkJCQkgICAgICBcCisgICAgICA/IGVycm5vIDogMDsgfQkJCQkJCQkgICAgICBcCitzdGF0aWMgc3NpemVfdCBnY3J5X3B0aF9yZWFkIChpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IG5ieXRlcykJCSAgICAgIFwKKyAgeyByZXR1cm4gcHRoX3JlYWQgKGZkLCBidWYsIG5ieXRlcyk7IH0JCQkJICAgICAgXAorc3RhdGljIHNzaXplX3QgZ2NyeV9wdGhfd3JpdGUgKGludCBmZCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgbmJ5dGVzKQkgICAgICBcCisgIHsgcmV0dXJuIHB0aF93cml0ZSAoZmQsIGJ1ZiwgbmJ5dGVzKTsgfQkJCQkgICAgICBcCitfR0NSWV9USFJFQURfT1BUSU9OX1BUSF9JTVBMX05FVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJCQkJCQkgICAgICBcCisvKiBOb3RlOiBHTlUgUHRoIGlzIG1pc3NpbmcgcHRoX3NlbmRtc2cgYW5kIHB0aF9yZWN2bXNnLiAgKi8JCSAgICAgIFwKK3N0YXRpYyBzdHJ1Y3QgZ2NyeV90aHJlYWRfY2JzIGdjcnlfdGhyZWFkc19wdGggPSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEdDUllfVEhSRUFEX09QVElPTl9QVEggfCAoR0NSWV9USFJFQURfT1BUSU9OX1ZFUlNJT04gPDwgOCkpLCAgICAgICAgICAgICAgIFwKKyAgZ2NyeV9wdGhfaW5pdCwgZ2NyeV9wdGhfbXV0ZXhfaW5pdCwgZ2NyeV9wdGhfbXV0ZXhfZGVzdHJveSwJCSAgICAgIFwKKyAgZ2NyeV9wdGhfbXV0ZXhfbG9jaywgZ2NyeV9wdGhfbXV0ZXhfdW5sb2NrLCBnY3J5X3B0aF9yZWFkLCBnY3J5X3B0aF93cml0ZSwgIFwKKyAgZ2NyeV9wdGhfc2VsZWN0LCBnY3J5X3B0aF93YWl0cGlkLCBnY3J5X3B0aF9hY2NlcHQsIGdjcnlfcHRoX2Nvbm5lY3QsICAgICAgIFwKKyAgTlVMTCwgTlVMTCB9CisKKworI2RlZmluZSBHQ1JZX1RIUkVBRF9PUFRJT05fUFRIUkVBRF9JTVBMCQkJCQkgICAgICBcCitzdGF0aWMgaW50IGdjcnlfcHRocmVhZF9tdXRleF9pbml0ICh2b2lkICoqcHJpdikJCQkgICAgICBcCit7CQkJCQkJCQkJICAgICAgXAorICBpbnQgZXJyID0gMDsJCQkJCQkJCSAgICAgIFwKKyAgcHRocmVhZF9tdXRleF90ICpsb2NrID0gKHB0aHJlYWRfbXV0ZXhfdCopbWFsbG9jIChzaXplb2YgKHB0aHJlYWRfbXV0ZXhfdCkpO1wKKwkJCQkJCQkJCSAgICAgIFwKKyAgaWYgKCFsb2NrKQkJCQkJCQkJICAgICAgXAorICAgIGVyciA9IEVOT01FTTsJCQkJCQkJICAgICAgXAorICBpZiAoIWVycikJCQkJCQkJCSAgICAgIFwKKyAgICB7CQkJCQkJCQkJICAgICAgXAorICAgICAgZXJyID0gcHRocmVhZF9tdXRleF9pbml0IChsb2NrLCBOVUxMKTsJCQkJICAgICAgXAorICAgICAgaWYgKGVycikJCQkJCQkJCSAgICAgIFwKKwlmcmVlIChsb2NrKTsJCQkJCQkJICAgICAgXAorICAgICAgZWxzZQkJCQkJCQkJICAgICAgXAorCSpwcml2ID0gbG9jazsJCQkJCQkJICAgICAgXAorICAgIH0JCQkJCQkJCQkgICAgICBcCisgIHJldHVybiBlcnI7CQkJCQkJCQkgICAgICBcCit9CQkJCQkJCQkJICAgICAgXAorc3RhdGljIGludCBnY3J5X3B0aHJlYWRfbXV0ZXhfZGVzdHJveSAodm9pZCAqKmxvY2spCQkJICAgICAgXAorICB7IGludCBlcnIgPSBwdGhyZWFkX211dGV4X2Rlc3Ryb3kgKChwdGhyZWFkX211dGV4X3QqKSpsb2NrKTsgICAgICAgICAgICAgICAgXAorICAgIGZyZWUgKCpsb2NrKTsgcmV0dXJuIGVycjsgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGludCBnY3J5X3B0aHJlYWRfbXV0ZXhfbG9jayAodm9pZCAqKmxvY2spCQkJICAgICAgXAorICB7IHJldHVybiBwdGhyZWFkX211dGV4X2xvY2sgKChwdGhyZWFkX211dGV4X3QqKSpsb2NrKTsgfQkJICAgICAgXAorc3RhdGljIGludCBnY3J5X3B0aHJlYWRfbXV0ZXhfdW5sb2NrICh2b2lkICoqbG9jaykJCQkgICAgICBcCisgIHsgcmV0dXJuIHB0aHJlYWRfbXV0ZXhfdW5sb2NrICgocHRocmVhZF9tdXRleF90KikqbG9jayk7IH0JCSAgICAgIFwKKwkJCQkJCQkJCSAgICAgIFwKK3N0YXRpYyBzdHJ1Y3QgZ2NyeV90aHJlYWRfY2JzIGdjcnlfdGhyZWFkc19wdGhyZWFkID0gewkJCSAgICAgIFwKKyAgKEdDUllfVEhSRUFEX09QVElPTl9QVEhSRUFEIHwgKEdDUllfVEhSRUFEX09QVElPTl9WRVJTSU9OIDw8IDgpKSwgICAgICAgICAgIFwKKyAgTlVMTCwgZ2NyeV9wdGhyZWFkX211dGV4X2luaXQsIGdjcnlfcHRocmVhZF9tdXRleF9kZXN0cm95LAkJICAgICAgXAorICBnY3J5X3B0aHJlYWRfbXV0ZXhfbG9jaywgZ2NyeV9wdGhyZWFkX211dGV4X3VubG9jaywgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH0KKworDAorLyogVGhlIGRhdGEgb2JqZWN0IHVzZWQgdG8gaG9sZCBhIG11bHRpIHByZWNpc2lvbiBpbnRlZ2VyLiAgKi8KK3N0cnVjdCBnY3J5X21waTsKK3R5cGVkZWYgc3RydWN0IGdjcnlfbXBpICpnY3J5X21waV90OworCisjaWZuZGVmIEdDUllQVF9OT19ERVBSRUNBVEVECit0eXBlZGVmIHN0cnVjdCBnY3J5X21waSAqR0NSWV9NUEkgX0dDUllfR0NDX0FUVFJfREVQUkVDQVRFRDsKK3R5cGVkZWYgc3RydWN0IGdjcnlfbXBpICpHY3J5TVBJIF9HQ1JZX0dDQ19BVFRSX0RFUFJFQ0FURUQ7CisjZW5kaWYKKworDAorCisvKiBDaGVjayB0aGF0IHRoZSBsaWJyYXJ5IGZ1bGZpbGxzIHRoZSB2ZXJzaW9uIHJlcXVpcmVtZW50LiAgKi8KK2NvbnN0IGNoYXIgKmdjcnlfY2hlY2tfdmVyc2lvbiAoY29uc3QgY2hhciAqcmVxX3ZlcnNpb24pOworCisvKiBDb2RlcyBmb3IgZnVuY3Rpb24gZGlzcGF0Y2hlcnMuICAqLworCisvKiBDb2RlcyB1c2VkIHdpdGggdGhlIGdjcnlfY29udHJvbCBmdW5jdGlvbi4gKi8KK2VudW0gZ2NyeV9jdGxfY21kcyAKKyAgeworICAgIEdDUllDVExfU0VUX0tFWSAgPSAxLAorICAgIEdDUllDVExfU0VUX0lWICAgPSAyLAorICAgIEdDUllDVExfQ0ZCX1NZTkMgPSAzLAorICAgIEdDUllDVExfUkVTRVQgICAgPSA0LCAgIC8qIGUuZy4gZm9yIE1EcyAqLworICAgIEdDUllDVExfRklOQUxJWkUgPSA1LAorICAgIEdDUllDVExfR0VUX0tFWUxFTiA9IDYsCisgICAgR0NSWUNUTF9HRVRfQkxLTEVOID0gNywKKyAgICBHQ1JZQ1RMX1RFU1RfQUxHTyA9IDgsCisgICAgR0NSWUNUTF9JU19TRUNVUkUgPSA5LAorICAgIEdDUllDVExfR0VUX0FTTk9JRCA9IDEwLAorICAgIEdDUllDVExfRU5BQkxFX0FMR08gPSAxMSwKKyAgICBHQ1JZQ1RMX0RJU0FCTEVfQUxHTyA9IDEyLAorICAgIEdDUllDVExfRFVNUF9SQU5ET01fU1RBVFMgPSAxMywKKyAgICBHQ1JZQ1RMX0RVTVBfU0VDTUVNX1NUQVRTID0gMTQsCisgICAgR0NSWUNUTF9HRVRfQUxHT19OUEtFWSAgICA9IDE1LAorICAgIEdDUllDVExfR0VUX0FMR09fTlNLRVkgICAgPSAxNiwKKyAgICBHQ1JZQ1RMX0dFVF9BTEdPX05TSUdOICAgID0gMTcsCisgICAgR0NSWUNUTF9HRVRfQUxHT19ORU5DUiAgICA9IDE4LAorICAgIEdDUllDVExfU0VUX1ZFUkJPU0lUWSAgICAgPSAxOSwKKyAgICBHQ1JZQ1RMX1NFVF9ERUJVR19GTEFHUyAgID0gMjAsCisgICAgR0NSWUNUTF9DTEVBUl9ERUJVR19GTEFHUyA9IDIxLAorICAgIEdDUllDVExfVVNFX1NFQ1VSRV9STkRQT09MPSAyMiwKKyAgICBHQ1JZQ1RMX0RVTVBfTUVNT1JZX1NUQVRTID0gMjMsCisgICAgR0NSWUNUTF9JTklUX1NFQ01FTSAgICAgICA9IDI0LAorICAgIEdDUllDVExfVEVSTV9TRUNNRU0gICAgICAgPSAyNSwKKyAgICBHQ1JZQ1RMX0RJU0FCTEVfU0VDTUVNX1dBUk4gPSAyNywKKyAgICBHQ1JZQ1RMX1NVU1BFTkRfU0VDTUVNX1dBUk4gPSAyOCwKKyAgICBHQ1JZQ1RMX1JFU1VNRV9TRUNNRU1fV0FSTiAgPSAyOSwKKyAgICBHQ1JZQ1RMX0RST1BfUFJJVlMgICAgICAgICAgPSAzMCwKKyAgICBHQ1JZQ1RMX0VOQUJMRV9NX0dVQVJEICAgICAgPSAzMSwKKyAgICBHQ1JZQ1RMX1NUQVJUX0RVTVAgICAgICAgICAgPSAzMiwKKyAgICBHQ1JZQ1RMX1NUT1BfRFVNUCAgICAgICAgICAgPSAzMywKKyAgICBHQ1JZQ1RMX0dFVF9BTEdPX1VTQUdFICAgICAgPSAzNCwKKyAgICBHQ1JZQ1RMX0lTX0FMR09fRU5BQkxFRCAgICAgPSAzNSwKKyAgICBHQ1JZQ1RMX0RJU0FCTEVfSU5URVJOQUxfTE9DS0lORyA9IDM2LAorICAgIEdDUllDVExfRElTQUJMRV9TRUNNRU0gICAgICA9IDM3LAorICAgIEdDUllDVExfSU5JVElBTElaQVRJT05fRklOSVNIRUQgPSAzOCwKKyAgICBHQ1JZQ1RMX0lOSVRJQUxJWkFUSU9OX0ZJTklTSEVEX1AgPSAzOSwKKyAgICBHQ1JZQ1RMX0FOWV9JTklUSUFMSVpBVElPTl9QID0gNDAsCisgICAgR0NSWUNUTF9TRVRfQ0JDX0NUUyA9IDQxLAorICAgIEdDUllDVExfU0VUX0NCQ19NQUMgPSA0MiwKKyAgICBHQ1JZQ1RMX1NFVF9DVFIgPSA0MywKKyAgICBHQ1JZQ1RMX0VOQUJMRV9RVUlDS19SQU5ET00gPSA0NCwKKyAgICBHQ1JZQ1RMX1NFVF9SQU5ET01fU0VFRF9GSUxFID0gNDUsCisgICAgR0NSWUNUTF9VUERBVEVfUkFORE9NX1NFRURfRklMRSA9IDQ2LAorICAgIEdDUllDVExfU0VUX1RIUkVBRF9DQlMgPSA0NywKKyAgICBHQ1JZQ1RMX0ZBU1RfUE9MTCA9IDQ4LAorICAgIEdDUllDVExfU0VUX1JBTkRPTV9EQUVNT05fU09DS0VUID0gNDksCisgICAgR0NSWUNUTF9VU0VfUkFORE9NX0RBRU1PTiA9IDUwLAorICAgIEdDUllDVExfRkFLRURfUkFORE9NX1AgPSA1MSwKKyAgICBHQ1JZQ1RMX1NFVF9STkRFR0RfU09DS0VUID0gNTIsCisgICAgR0NSWUNUTF9QUklOVF9DT05GSUcgPSA1MywKKyAgICBHQ1JZQ1RMX09QRVJBVElPTkFMX1AgPSA1NCwKKyAgICBHQ1JZQ1RMX0ZJUFNfTU9ERV9QID0gNTUsCisgICAgR0NSWUNUTF9GT1JDRV9GSVBTX01PREUgPSA1NiwKKyAgICBHQ1JZQ1RMX1NFTEZURVNUID0gNTcKKyAgICAvKiBOb3RlOiA1OCAuLiA2MiBhcmUgdXNlZCBpbnRlcm5hbGx5LiAgKi8KKyAgfTsKKworLyogUGVyZm9ybSB2YXJpb3VzIG9wZXJhdGlvbnMgZGVmaW5lZCBieSBDTUQuICovCitnY3J5X2Vycm9yX3QgZ2NyeV9jb250cm9sIChlbnVtIGdjcnlfY3RsX2NtZHMgQ01ELCAuLi4pOworCisMCisvKiBTLWV4cHJlc3Npb24gbWFuYWdlbWVudC4gKi8gCisKKy8qIFRoZSBvYmplY3QgdG8gcmVwcmVzZW50IGFuIFMtZXhwcmVzc2lvbiBhcyB1c2VkIHdpdGggdGhlIHB1YmxpYyBrZXkKKyAgIGZ1bmN0aW9ucy4gICovCitzdHJ1Y3QgZ2NyeV9zZXhwOwordHlwZWRlZiBzdHJ1Y3QgZ2NyeV9zZXhwICpnY3J5X3NleHBfdDsKKworI2lmbmRlZiBHQ1JZUFRfTk9fREVQUkVDQVRFRAordHlwZWRlZiBzdHJ1Y3QgZ2NyeV9zZXhwICpHQ1JZX1NFWFAgX0dDUllfR0NDX0FUVFJfREVQUkVDQVRFRDsKK3R5cGVkZWYgc3RydWN0IGdjcnlfc2V4cCAqR2NyeVNleHAgX0dDUllfR0NDX0FUVFJfREVQUkVDQVRFRDsKKyNlbmRpZgorCisvKiBUaGUgcG9zc2libGUgdmFsdWVzIGZvciB0aGUgUy1leHByZXNzaW9uIGZvcm1hdC4gKi8KK2VudW0gZ2NyeV9zZXhwX2Zvcm1hdAorICB7CisgICAgR0NSWVNFWFBfRk1UX0RFRkFVTFQgICA9IDAsCisgICAgR0NSWVNFWFBfRk1UX0NBTk9OICAgICA9IDEsCisgICAgR0NSWVNFWFBfRk1UX0JBU0U2NCAgICA9IDIsCisgICAgR0NSWVNFWFBfRk1UX0FEVkFOQ0VEICA9IDMKKyAgfTsKKworLyogQ3JlYXRlIGFuIG5ldyBTLWV4cHJlc3Npb24gb2JqZWN0IGZyb20gQlVGRkVSIG9mIHNpemUgTEVOR1RIIGFuZAorICAgcmV0dXJuIGl0IGluIFJFVFNFWFAuICBXaXRoIEFVVE9ERVRFQ1Qgc2V0IHRvIDAgdGhlIGRhdGEgaW4gQlVGRkVSCisgICBpcyBleHBlY3RlZCB0byBiZSBpbiBjYW5vbml6ZWQgZm9ybWF0LiAgKi8KK2djcnlfZXJyb3JfdCBnY3J5X3NleHBfbmV3IChnY3J5X3NleHBfdCAqcmV0c2V4cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1dG9kZXRlY3QpOworCisgLyogU2FtZSBhcyBnY3J5X3NleHBfbmV3IGJ1dCBhbGxvd3MgdG8gcGFzcyBhIEZSRUVGTkMgd2hpY2ggaGFzIHRoZQorICAgIGVmZmVjdCB0byB0cmFuc2ZlciBvd25lcnNoaXAgb2YgQlVGRkVSIHRvIHRoZSBjcmVhdGVkIG9iamVjdC4gICovCitnY3J5X2Vycm9yX3QgZ2NyeV9zZXhwX2NyZWF0ZSAoZ2NyeV9zZXhwX3QgKnJldHNleHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdXRvZGV0ZWN0LCB2b2lkICgqZnJlZWZuYykgKHZvaWQgKikpOworCisvKiBTY2FuIEJVRkZFUiBhbmQgcmV0dXJuIGEgbmV3IFMtZXhwcmVzc2lvbiBvYmplY3QgaW4gUkVUU0VYUC4gIFRoaXMKKyAgIGZ1bmN0aW9uIGV4cGVjdHMgYSBwcmludGYgbGlrZSBzdHJpbmcgaW4gQlVGRkVSLiAgKi8KK2djcnlfZXJyb3JfdCBnY3J5X3NleHBfc3NjYW4gKGdjcnlfc2V4cF90ICpyZXRzZXhwLCBzaXplX3QgKmVycm9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCk7CisKKy8qIFNhbWUgYXMgZ2NyeV9zZXhwX3NzY2FuIGJ1dCBleHBlY3RzIGEgc3RyaW5nIGluIEZPUk1BVCBhbmQgY2FuIHRodXMKKyAgIG9ubHkgYmUgdXNlZCBmb3IgY2VydGFpbiBlbmNvZGluZ3MuICAqLworZ2NyeV9lcnJvcl90IGdjcnlfc2V4cF9idWlsZCAoZ2NyeV9zZXhwX3QgKnJldHNleHAsIHNpemVfdCAqZXJyb2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOworCisvKiBMaWtlIGdjcnlfc2V4cF9idWlsZCwgYnV0IHVzZXMgYW4gYXJyYXkgaW5zdGVhZCBvZiB2YXJpYWJsZQorICAgZnVuY3Rpb24gYXJndW1lbnRzLiAgKi8KK2djcnlfZXJyb3JfdCBnY3J5X3NleHBfYnVpbGRfYXJyYXkgKGdjcnlfc2V4cF90ICpyZXRzZXhwLCBzaXplX3QgKmVycm9mZiwKKwkJCQkgICAgY29uc3QgY2hhciAqZm9ybWF0LCB2b2lkICoqYXJnX2xpc3QpOworCisvKiBSZWxlYXNlIHRoZSBTLWV4cHJlc3Npb24gb2JqZWN0IFNFWFAgKi8KK3ZvaWQgZ2NyeV9zZXhwX3JlbGVhc2UgKGdjcnlfc2V4cF90IHNleHApOworCisvKiBDYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiBhbiBjYW5vbml6ZWQgUy1leHByZXNpb24gaW4gQlVGRkVSIGFuZAorICAgY2hlY2sgZm9yIGEgdmFsaWQgZW5jb2RpbmcuICovCitzaXplX3QgZ2NyeV9zZXhwX2Nhbm9uX2xlbiAoY29uc3QgdW5zaWduZWQgY2hhciAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmVycm9mZiwgZ2NyeV9lcnJvcl90ICplcnJjb2RlKTsKKworLyogQ29waWVzIHRoZSBTLWV4cHJlc3Npb24gb2JqZWN0IFNFWFAgaW50byBCVUZGRVIgdXNpbmcgdGhlIGZvcm1hdAorICAgc3BlY2lmaWVkIGluIE1PREUuICAqLworc2l6ZV90IGdjcnlfc2V4cF9zcHJpbnQgKGdjcnlfc2V4cF90IHNleHAsIGludCBtb2RlLCB2b2lkICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG1heGxlbmd0aCk7CisKKy8qIER1bXBzIHRoZSBTLWV4cHJlc3Npb24gb2JqZWN0IEEgaW4gYSBmb3JtYXQgc3VpdGFibGUgZm9yIGRlYnVnZ2luZworICAgdG8gTGliZ2NyeXB0J3MgbG9nZ2luZyBzdHJlYW0uICAqLwordm9pZCBnY3J5X3NleHBfZHVtcCAoY29uc3QgZ2NyeV9zZXhwX3QgYSk7CisKK2djcnlfc2V4cF90IGdjcnlfc2V4cF9jb25zIChjb25zdCBnY3J5X3NleHBfdCBhLCBjb25zdCBnY3J5X3NleHBfdCBiKTsKK2djcnlfc2V4cF90IGdjcnlfc2V4cF9hbGlzdCAoY29uc3QgZ2NyeV9zZXhwX3QgKmFycmF5KTsKK2djcnlfc2V4cF90IGdjcnlfc2V4cF92bGlzdCAoY29uc3QgZ2NyeV9zZXhwX3QgYSwgLi4uKTsKK2djcnlfc2V4cF90IGdjcnlfc2V4cF9hcHBlbmQgKGNvbnN0IGdjcnlfc2V4cF90IGEsIGNvbnN0IGdjcnlfc2V4cF90IG4pOworZ2NyeV9zZXhwX3QgZ2NyeV9zZXhwX3ByZXBlbmQgKGNvbnN0IGdjcnlfc2V4cF90IGEsIGNvbnN0IGdjcnlfc2V4cF90IG4pOworCisvKiBTY2FuIHRoZSBTLWV4cHJlc3Npb24gZm9yIGEgc3VibGlzdCB3aXRoIGEgdHlwZSAodGhlIGNhciBvZiB0aGUKKyAgIGxpc3QpIG1hdGNoaW5nIHRoZSBzdHJpbmcgVE9LRU4uICBJZiBUT0tMRU4gaXMgbm90IDAsIHRoZSB0b2tlbiBpcworICAgYXNzdW1lZCB0byBiZSByYXcgbWVtb3J5IG9mIHRoaXMgbGVuZ3RoLiAgVGhlIGZ1bmN0aW9uIHJldHVybnMgYQorICAgbmV3bHkgYWxsb2NhdGVkIFMtZXhwcmVzc2lvbiBjb25zaXN0aW5nIG9mIHRoZSBmb3VuZCBzdWJsaXN0IG9yCisgICBgTlVMTCcgd2hlbiBub3QgZm91bmQuICAqLworZ2NyeV9zZXhwX3QgZ2NyeV9zZXhwX2ZpbmRfdG9rZW4gKGdjcnlfc2V4cF90IGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRvaywgc2l6ZV90IHRva2xlbik7CisvKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgTElTVC4gIEZvciBhIHZhbGlkIFMtZXhwcmVzc2lvbiB0aGlzCisgICBzaG91bGQgYmUgYXQgbGVhc3QgMS4gICovCitpbnQgZ2NyeV9zZXhwX2xlbmd0aCAoY29uc3QgZ2NyeV9zZXhwX3QgbGlzdCk7CisKKy8qIENyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IFMtZXhwcmVzc2lvbiBmcm9tIHRoZSBlbGVtZW50IHdpdGggaW5kZXgKKyAgIE5VTUJFUiBpbiBMSVNULiAgTm90ZSB0aGF0IHRoZSBmaXJzdCBlbGVtZW50IGhhcyB0aGUgaW5kZXggMC4gIElmCisgICB0aGVyZSBpcyBubyBzdWNoIGVsZW1lbnQsIGBOVUxMJyBpcyByZXR1cm5lZC4gICovCitnY3J5X3NleHBfdCBnY3J5X3NleHBfbnRoIChjb25zdCBnY3J5X3NleHBfdCBsaXN0LCBpbnQgbnVtYmVyKTsKKworLyogQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgUy1leHByZXNzaW9uIGZyb20gdGhlIGZpcnN0IGVsZW1lbnQgaW4KKyAgIExJU1Q7IHRoaXMgY2FsbGVkIHRoZSAidHlwZSIgYW5kIHNob3VsZCBhbHdheXMgZXhpc3QgYW5kIGJlIGEKKyAgIHN0cmluZy4gYE5VTEwnIGlzIHJldHVybmVkIGluIGNhc2Ugb2YgYSBwcm9ibGVtLiAgKi8KK2djcnlfc2V4cF90IGdjcnlfc2V4cF9jYXIgKGNvbnN0IGdjcnlfc2V4cF90IGxpc3QpOworCisvKiBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyBsaXN0IGZvcm0gYWxsIGVsZW1lbnRzIGV4Y2VwdCBmb3IgdGhlIGZpcnN0CisgICBvbmUuICBOb3RlLCB0aGF0IHRoaXMgZnVuY3Rpb24gbWF5IHJldHVybiBhbiBpbnZhbGlkIFMtZXhwcmVzc2lvbgorICAgYmVjYXVzZSBpdCBpcyBub3QgZ3VhcmFudGVlZCwgdGhhdCB0aGUgdHlwZSBleGlzdHMgYW5kIGlzIGEgc3RyaW5nLgorICAgSG93ZXZlciwgZm9yIHBhcnNpbmcgYSBjb21wbGV4IFMtZXhwcmVzc2lvbiBpdCBtaWdodCBiZSB1c2VmdWwgZm9yCisgICBpbnRlcm1lZGlhdGUgbGlzdHMuICBSZXR1cm5zIGBOVUxMJyBvbiBlcnJvci4gICovCitnY3J5X3NleHBfdCBnY3J5X3NleHBfY2RyIChjb25zdCBnY3J5X3NleHBfdCBsaXN0KTsKKworZ2NyeV9zZXhwX3QgZ2NyeV9zZXhwX2NhZHIgKGNvbnN0IGdjcnlfc2V4cF90IGxpc3QpOworCisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBnZXQgZGF0YSBmcm9tIGEgTElTVC4gIEEgcG9pbnRlciB0byB0aGUKKyAgIGFjdHVhbCBkYXRhIHdpdGggaW5kZXggTlVNQkVSIGlzIHJldHVybmVkIGFuZCB0aGUgbGVuZ3RoIG9mIHRoaXMKKyAgIGRhdGEgd2lsbCBiZSBzdG9yZWQgdG8gREFUQUxFTi4gIElmIHRoZXJlIGlzIG5vIGRhdGEgYXQgdGhlIGdpdmVuCisgICBpbmRleCBvciB0aGUgaW5kZXggcmVwcmVzZW50cyBhbm90aGVyIGxpc3QsIGBOVUxMJyBpcyByZXR1cm5lZC4KKyAgICpOb3RlOiogVGhlIHJldHVybmVkIHBvaW50ZXIgaXMgdmFsaWQgYXMgbG9uZyBhcyBMSVNUIGlzIG5vdAorICAgbW9kaWZpZWQgb3IgcmVsZWFzZWQuICAqLworY29uc3QgY2hhciAqZ2NyeV9zZXhwX250aF9kYXRhIChjb25zdCBnY3J5X3NleHBfdCBsaXN0LCBpbnQgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmRhdGFsZW4pOworCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZ2V0IGFuZCBjb252ZXJ0IGRhdGEgZnJvbSBhIExJU1QuICBUaGUKKyAgIGRhdGEgaXMgYXNzdW1lZCB0byBiZSBhIE51bCB0ZXJtaW5hdGVkIHN0cmluZy4gIFRoZSBjYWxsZXIgbXVzdAorICAgcmVsZWFzZSB0aGUgcmV0dXJuZWQgdmFsdWUgdXNpbmcgYGdjcnlfZnJlZScuICBJZiB0aGVyZSBpcyBubyBkYXRhCisgICBhdCB0aGUgZ2l2ZW4gaW5kZXgsIHRoZSBpbmRleCByZXByZXNlbnRzIGEgbGlzdCBvciB0aGUgdmFsdWUgY2FuJ3QKKyAgIGJlIGNvbnZlcnRlZCB0byBhIHN0cmluZywgYE5VTEwnIGlzIHJldHVybmVkLiAgKi8KK2NoYXIgKmdjcnlfc2V4cF9udGhfc3RyaW5nIChnY3J5X3NleHBfdCBsaXN0LCBpbnQgbnVtYmVyKTsKKworLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGdldCBhbmQgY29udmVydCBkYXRhIGZyb20gYSBMSVNULiBUaGlzCisgICBkYXRhIGlzIGFzc3VtZWQgdG8gYmUgYW4gTVBJIHN0b3JlZCBpbiB0aGUgZm9ybWF0IGRlc2NyaWJlZCBieQorICAgTVBJRk1UIGFuZCByZXR1cm5lZCBhcyBhIHN0YW5kYXJkIExpYmdjcnlwdCBNUEkuICBUaGUgY2FsbGVyIG11c3QKKyAgIHJlbGVhc2UgdGhpcyByZXR1cm5lZCB2YWx1ZSB1c2luZyBgZ2NyeV9tcGlfcmVsZWFzZScuICBJZiB0aGVyZSBpcworICAgbm8gZGF0YSBhdCB0aGUgZ2l2ZW4gaW5kZXgsIHRoZSBpbmRleCByZXByZXNlbnRzIGEgbGlzdCBvciB0aGUKKyAgIHZhbHVlIGNhbid0IGJlIGNvbnZlcnRlZCB0byBhbiBNUEksIGBOVUxMJyBpcyByZXR1cm5lZC4gICovCitnY3J5X21waV90IGdjcnlfc2V4cF9udGhfbXBpIChnY3J5X3NleHBfdCBsaXN0LCBpbnQgbnVtYmVyLCBpbnQgbXBpZm10KTsKKworCisMCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICBNdWx0aSBQcmVjaXNpb24gSW50ZWdlciBGdW5jdGlvbnMgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIERpZmZlcmVudCBmb3JtYXRzIG9mIGV4dGVybmFsIGJpZyBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uLiAqLworZW51bSBnY3J5X21waV9mb3JtYXQgCisgIHsKKyAgICBHQ1JZTVBJX0ZNVF9OT05FPSAwLAorICAgIEdDUllNUElfRk1UX1NURCA9IDEsICAgIC8qIFR3b3MgY29tcGxlbWVudCBzdG9yZWQgd2l0aG91dCBsZW5ndGguICAqLworICAgIEdDUllNUElfRk1UX1BHUCA9IDIsICAgIC8qIEFzIHVzZWQgYnkgT3BlblBHUCAodW5zaWduZWQgb25seSkuICAqLworICAgIEdDUllNUElfRk1UX1NTSCA9IDMsICAgIC8qIEFzIHVzZWQgYnkgU1NIIChsaWtlIFNURCBidXQgd2l0aCBsZW5ndGgpLiAgKi8KKyAgICBHQ1JZTVBJX0ZNVF9IRVggPSA0LCAgICAvKiBIZXggZm9ybWF0LiAqLworICAgIEdDUllNUElfRk1UX1VTRyA9IDUgICAgIC8qIExpa2UgU1REIGJ1dCB1bnNpZ25lZC4gKi8KKyAgfTsKKworLyogRmxhZ3MgdXNlZCBmb3IgY3JlYXRpbmcgYmlnIGludGVnZXJzLiAgKi8KK2VudW0gZ2NyeV9tcGlfZmxhZyAKKyAgeworICAgIEdDUllNUElfRkxBR19TRUNVUkUgPSAxLCAgLyogQWxsb2NhdGUgdGhlIG51bWJlciBpbiAic2VjdXJlIiBtZW1vcnkuICAqLworICAgIEdDUllNUElfRkxBR19PUEFRVUUgPSAyICAgLyogVGhlIG51bWJlciBpcyBub3QgYSByZWFsIG9uZSBidXQganVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSB3YXkgdG8gc3RvcmUgc29tZSBieXRlcy4gIFRoaXMgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWZ1bCBmb3IgZW5jcnlwdGVkIGJpZyBpbnRlZ2Vycy4gICovCisgIH07CisKKworLyogQWxsb2NhdGUgYSBuZXcgYmlnIGludGVnZXIgb2JqZWN0LCBpbml0aWFsaXplIGl0IHdpdGggMCBhbmQKKyAgIGluaXRpYWxseSBhbGxvY2F0ZSBtZW1vcnkgZm9yIGEgbnVtYmVyIG9mIGF0IGxlYXN0IE5CSVRTLiAqLworZ2NyeV9tcGlfdCBnY3J5X21waV9uZXcgKHVuc2lnbmVkIGludCBuYml0cyk7CisKKy8qIFNhbWUgYXMgZ2NyeV9tcGlfbmV3KCkgYnV0IGFsbG9jYXRlIGluICJzZWN1cmUiIG1lbW9yeS4gKi8KK2djcnlfbXBpX3QgZ2NyeV9tcGlfc25ldyAodW5zaWduZWQgaW50IG5iaXRzKTsKKworLyogUmVsZWFzZSB0aGUgbnVtYmVyIEEgYW5kIGZyZWUgYWxsIGFzc29jaWF0ZWQgcmVzb3VyY2VzLiAqLwordm9pZCBnY3J5X21waV9yZWxlYXNlIChnY3J5X21waV90IGEpOworCisvKiBDcmVhdGUgYSBuZXcgbnVtYmVyIHdpdGggdGhlIHNhbWUgdmFsdWUgYXMgQS4gKi8KK2djcnlfbXBpX3QgZ2NyeV9tcGlfY29weSAoY29uc3QgZ2NyeV9tcGlfdCBhKTsKKworLyogU3RvcmUgdGhlIGJpZyBpbnRlZ2VyIHZhbHVlIFUgaW4gVy4gKi8KK2djcnlfbXBpX3QgZ2NyeV9tcGlfc2V0IChnY3J5X21waV90IHcsIGNvbnN0IGdjcnlfbXBpX3QgdSk7CisKKy8qIFN0b3JlIHRoZSB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlIFUgaW4gVy4gKi8KK2djcnlfbXBpX3QgZ2NyeV9tcGlfc2V0X3VpIChnY3J5X21waV90IHcsIHVuc2lnbmVkIGxvbmcgdSk7CisKKy8qIFN3YXAgdGhlIHZhbHVlcyBvZiBBIGFuZCBCLiAqLwordm9pZCBnY3J5X21waV9zd2FwIChnY3J5X21waV90IGEsIGdjcnlfbXBpX3QgYik7CisKKy8qIENvbXBhcmUgdGhlIGJpZyBpbnRlZ2VyIG51bWJlciBVIGFuZCBWIHJldHVybmluZyAwIGZvciBlcXVhbGl0eSwgYQorICAgcG9zaXRpdmUgdmFsdWUgZm9yIFUgPiBWIGFuZCBhIG5lZ2F0aXZlIGZvciBVIDwgVi4gKi8KK2ludCBnY3J5X21waV9jbXAgKGNvbnN0IGdjcnlfbXBpX3QgdSwgY29uc3QgZ2NyeV9tcGlfdCB2KTsKKworLyogQ29tcGFyZSB0aGUgYmlnIGludGVnZXIgbnVtYmVyIFUgd2l0aCB0aGUgdW5zaWduZWQgaW50ZWdlciBWCisgICByZXR1cm5pbmcgMCBmb3IgZXF1YWxpdHksIGEgcG9zaXRpdmUgdmFsdWUgZm9yIFUgPiBWIGFuZCBhIG5lZ2F0aXZlCisgICBmb3IgVSA8IFYuICovCitpbnQgZ2NyeV9tcGlfY21wX3VpIChjb25zdCBnY3J5X21waV90IHUsIHVuc2lnbmVkIGxvbmcgdik7CisKKy8qIENvbnZlcnQgdGhlIGV4dGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIGFuIGludGVnZXIgc3RvcmVkIGluIEJVRkZFUgorICAgd2l0aCBhIGxlbmd0aCBvZiBCVUZMRU4gaW50byBhIG5ld2x5IGNyZWF0ZSBNUEkgcmV0dXJuZWQgaW4KKyAgIFJFVF9NUEkuICBJZiBOU0NBTk5FRCBpcyBub3QgTlVMTCwgaXQgd2lsbCByZWNlaXZlIHRoZSBudW1iZXIgb2YKKyAgIGJ5dGVzIGFjdHVhbGx5IHNjYW5uZWQgYWZ0ZXIgYSBzdWNjZXNzZnVsIG9wZXJhdGlvbi4gKi8KK2djcnlfZXJyb3JfdCBnY3J5X21waV9zY2FuIChnY3J5X21waV90ICpyZXRfbXBpLCBlbnVtIGdjcnlfbXBpX2Zvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnVmbGVuLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKm5zY2FubmVkKTsKKworLyogQ29udmVydCB0aGUgYmlnIGludGVnZXIgQSBpbnRvIHRoZSBleHRlcm5hbCByZXByZXNlbnRhdGlvbgorICAgZGVzY3JpYmVkIGJ5IEZPUk1BVCBhbmQgc3RvcmUgaXQgaW4gdGhlIHByb3ZpZGVkIEJVRkZFUiB3aGljaCBoYXMKKyAgIGJlZW4gYWxsb2NhdGVkIGJ5IHRoZSB1c2VyIHdpdGggYSBzaXplIG9mIEJVRkxFTiBieXRlcy4gIE5XUklUVEVOCisgICByZWNlaXZlcyB0aGUgYWN0dWFsIGxlbmd0aCBvZiB0aGUgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24gdW5sZXNzIGl0CisgICBoYXMgYmVlbiBwYXNzZWQgYXMgTlVMTC4gKi8KK2djcnlfZXJyb3JfdCBnY3J5X21waV9wcmludCAoZW51bSBnY3J5X21waV9mb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpidWZmZXIsIHNpemVfdCBidWZsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqbndyaXR0ZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjcnlfbXBpX3QgYSk7CisKKy8qIENvbnZlcnQgdGhlIGJpZyBpbnRlZ2VyIEEgaW50IHRoZSBleHRlcm5hbCByZXByZXNlbnRhdGlvbiBkZXNjcmliZWQKKyAgIGJ5IEZPUk1BVCBhbmQgc3RvcmUgaXQgaW4gYSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyIHdoaWNoIGFkZHJlc3MKKyAgIHdpbGwgYmUgcHV0IGludG8gQlVGRkVSLiAgTldSSVRURU4gcmVjZWl2ZXMgdGhlIGFjdHVhbCBsZW5ndGhzIG9mIHRoZQorICAgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24uICovCitnY3J5X2Vycm9yX3QgZ2NyeV9tcGlfYXByaW50IChlbnVtIGdjcnlfbXBpX2Zvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICoqYnVmZmVyLCBzaXplX3QgKm53cml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NyeV9tcGlfdCBhKTsKKworLyogRHVtcCB0aGUgdmFsdWUgb2YgQSBpbiBhIGZvcm1hdCBzdWl0YWJsZSBmb3IgZGVidWdnaW5nIHRvCisgICBMaWJnY3J5cHQncyBsb2dnaW5nIHN0cmVhbS4gIE5vdGUgdGhhdCBvbmUgbGVhZGluZyBzcGFjZSBidXQgbm8KKyAgIHRyYWlsaW5nIHNwYWNlIG9yIGxpbmVmZWVkIHdpbGwgYmUgcHJpbnRlZC4gIEl0IGlzIG9rYXkgdG8gcGFzcworICAgTlVMTCBmb3IgQS4gKi8KK3ZvaWQgZ2NyeV9tcGlfZHVtcCAoY29uc3QgZ2NyeV9tcGlfdCBhKTsKKworCisvKiBXID0gVSArIFYuICAqLwordm9pZCBnY3J5X21waV9hZGQgKGdjcnlfbXBpX3QgdywgZ2NyeV9tcGlfdCB1LCBnY3J5X21waV90IHYpOworCisvKiBXID0gVSArIFYuICBWIGlzIGFuIHVuc2lnbmVkIGludGVnZXIuICovCit2b2lkIGdjcnlfbXBpX2FkZF91aSAoZ2NyeV9tcGlfdCB3LCBnY3J5X21waV90IHUsIHVuc2lnbmVkIGxvbmcgdik7CisKKy8qIFcgPSBVICsgViBtb2QgTS4gKi8KK3ZvaWQgZ2NyeV9tcGlfYWRkbSAoZ2NyeV9tcGlfdCB3LCBnY3J5X21waV90IHUsIGdjcnlfbXBpX3QgdiwgZ2NyeV9tcGlfdCBtKTsKKworLyogVyA9IFUgLSBWLiAqLwordm9pZCBnY3J5X21waV9zdWIgKGdjcnlfbXBpX3QgdywgZ2NyeV9tcGlfdCB1LCBnY3J5X21waV90IHYpOworCisvKiBXID0gVSAtIFYuICBWIGlzIGFuIHVuc2lnbmVkIGludGVnZXIuICovCit2b2lkIGdjcnlfbXBpX3N1Yl91aSAoZ2NyeV9tcGlfdCB3LCBnY3J5X21waV90IHUsIHVuc2lnbmVkIGxvbmcgdiApOworCisvKiBXID0gVSAtIFYgbW9kIE0gKi8KK3ZvaWQgZ2NyeV9tcGlfc3VibSAoZ2NyeV9tcGlfdCB3LCBnY3J5X21waV90IHUsIGdjcnlfbXBpX3QgdiwgZ2NyeV9tcGlfdCBtKTsKKworLyogVyA9IFUgKiBWLiAqLwordm9pZCBnY3J5X21waV9tdWwgKGdjcnlfbXBpX3QgdywgZ2NyeV9tcGlfdCB1LCBnY3J5X21waV90IHYpOworCisvKiBXID0gVSAqIFYuICBWIGlzIGFuIHVuc2lnbmVkIGludGVnZXIuICovCit2b2lkIGdjcnlfbXBpX211bF91aSAoZ2NyeV9tcGlfdCB3LCBnY3J5X21waV90IHUsIHVuc2lnbmVkIGxvbmcgdiApOworCisvKiBXID0gVSAqIFYgbW9kIE0uICovCit2b2lkIGdjcnlfbXBpX211bG0gKGdjcnlfbXBpX3QgdywgZ2NyeV9tcGlfdCB1LCBnY3J5X21waV90IHYsIGdjcnlfbXBpX3QgbSk7CisKKy8qIFcgPSBVICogKDIgXiBDTlQpLiAqLwordm9pZCBnY3J5X21waV9tdWxfMmV4cCAoZ2NyeV9tcGlfdCB3LCBnY3J5X21waV90IHUsIHVuc2lnbmVkIGxvbmcgY250KTsKKworLyogUSA9IERJVklERU5EIC8gRElWSVNPUiwgUiA9IERJVklERU5EICUgRElWSVNPUiwKKyAgIFEgb3IgUiBtYXkgYmUgcGFzc2VkIGFzIE5VTEwuICBST1VORCBzaG91bGQgYmUgbmVnYXRpdmUgb3IgMC4gKi8KK3ZvaWQgZ2NyeV9tcGlfZGl2IChnY3J5X21waV90IHEsIGdjcnlfbXBpX3QgciwKKyAgICAgICAgICAgICAgICAgICBnY3J5X21waV90IGRpdmlkZW5kLCBnY3J5X21waV90IGRpdmlzb3IsIGludCByb3VuZCk7CisKKy8qIFIgPSBESVZJREVORCAlIERJVklTT1IgKi8KK3ZvaWQgZ2NyeV9tcGlfbW9kIChnY3J5X21waV90IHIsIGdjcnlfbXBpX3QgZGl2aWRlbmQsIGdjcnlfbXBpX3QgZGl2aXNvcik7CisKKy8qIFcgPSBCIF4gRSBtb2QgTS4gKi8KK3ZvaWQgZ2NyeV9tcGlfcG93bSAoZ2NyeV9tcGlfdCB3LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBnY3J5X21waV90IGIsIGNvbnN0IGdjcnlfbXBpX3QgZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NyeV9tcGlfdCBtKTsKKworLyogU2V0IEcgdG8gdGhlIGdyZWF0ZXN0IGNvbW1vbiBkaXZpc29yIG9mIEEgYW5kIEIuICAKKyAgIFJldHVybiB0cnVlIGlmIHRoZSBHIGlzIDEuICovCitpbnQgZ2NyeV9tcGlfZ2NkIChnY3J5X21waV90IGcsIGdjcnlfbXBpX3QgYSwgZ2NyeV9tcGlfdCBiKTsKKworLyogU2V0IFggdG8gdGhlIG11bHRpcGxpY2F0aXZlIGludmVyc2Ugb2YgQSBtb2QgTS4KKyAgIFJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBleGlzdHMuICovCitpbnQgZ2NyeV9tcGlfaW52bSAoZ2NyeV9tcGlfdCB4LCBnY3J5X21waV90IGEsIGdjcnlfbXBpX3QgbSk7CisKKworLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYml0cyByZXF1aXJlZCB0byByZXByZXNlbnQgQS4gKi8KK3Vuc2lnbmVkIGludCBnY3J5X21waV9nZXRfbmJpdHMgKGdjcnlfbXBpX3QgYSk7CisKKy8qIFJldHVybiB0cnVlIHdoZW4gYml0IG51bWJlciBOIChjb3VudGluZyBmcm9tIDApIGlzIHNldCBpbiBBLiAqLworaW50ICAgICAgZ2NyeV9tcGlfdGVzdF9iaXQgKGdjcnlfbXBpX3QgYSwgdW5zaWduZWQgaW50IG4pOworCisvKiBTZXQgYml0IG51bWJlciBOIGluIEEuICovCit2b2lkICAgICBnY3J5X21waV9zZXRfYml0IChnY3J5X21waV90IGEsIHVuc2lnbmVkIGludCBuKTsKKworLyogQ2xlYXIgYml0IG51bWJlciBOIGluIEEuICovCit2b2lkICAgICBnY3J5X21waV9jbGVhcl9iaXQgKGdjcnlfbXBpX3QgYSwgdW5zaWduZWQgaW50IG4pOworCisvKiBTZXQgYml0IG51bWJlciBOIGluIEEgYW5kIGNsZWFyIGFsbCBiaXRzIGdyZWF0ZXIgdGhhbiBOLiAqLwordm9pZCAgICAgZ2NyeV9tcGlfc2V0X2hpZ2hiaXQgKGdjcnlfbXBpX3QgYSwgdW5zaWduZWQgaW50IG4pOworCisvKiBDbGVhciBiaXQgbnVtYmVyIE4gaW4gQSBhbmQgYWxsIGJpdHMgZ3JlYXRlciB0aGFuIE4uICovCit2b2lkICAgICBnY3J5X21waV9jbGVhcl9oaWdoYml0IChnY3J5X21waV90IGEsIHVuc2lnbmVkIGludCBuKTsKKworLyogU2hpZnQgdGhlIHZhbHVlIG9mIEEgYnkgTiBiaXRzIHRvIHRoZSByaWdodCBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbiBYLiAqLwordm9pZCAgICAgZ2NyeV9tcGlfcnNoaWZ0IChnY3J5X21waV90IHgsIGdjcnlfbXBpX3QgYSwgdW5zaWduZWQgaW50IG4pOworCisvKiBTaGlmdCB0aGUgdmFsdWUgb2YgQSBieSBOIGJpdHMgdG8gdGhlIGxlZnQgYW5kIHN0b3JlIHRoZSByZXN1bHQgaW4gWC4gKi8KK3ZvaWQgICAgIGdjcnlfbXBpX2xzaGlmdCAoZ2NyeV9tcGlfdCB4LCBnY3J5X21waV90IGEsIHVuc2lnbmVkIGludCBuKTsKKworLyogU3RvcmUgTkJJVFMgb2YgdGhlIHZhbHVlIFAgcG9pbnRzIHRvIGluIEEgYW5kIG1hcmsgQSBhcyBhbiBvcGFxdWUKKyAgIHZhbHVlLiAgV0FSTklORzogTmV2ZXIgdXNlIGFuIG9wYXF1ZSBNUEkgZm9yIGFueXRoaW5nIHRoaW5nIGVsc2UgdGhlbiAKKyAgIGdjcnlfbXBpX3JlbGVhc2UsIGdjcnlfbXBpX2dldF9vcGFxdWUuICovCitnY3J5X21waV90IGdjcnlfbXBpX3NldF9vcGFxdWUgKGdjcnlfbXBpX3QgYSwgdm9pZCAqcCwgdW5zaWduZWQgaW50IG5iaXRzKTsKKworLyogUmV0dXJuIGEgcG9pbnRlciB0byBhbiBvcGFxdWUgdmFsdWUgc3RvcmVkIGluIEEgYW5kIHJldHVybiBpdHMgc2l6ZQorICAgaW4gTkJJVFMuICBOb3RlIHRoYXQgdGhlIHJldHVybmVkIHBvaW50ZXIgaXMgc3RpbGwgb3duZWQgYnkgQSBhbmQKKyAgIHRoYXQgdGhlIGZ1bmN0aW9uIHNob3VsZCBuZXZlciBiZSB1c2VkIGZvciBhbiBub24tb3BhcXVlIE1QSS4gKi8KK3ZvaWQgKmdjcnlfbXBpX2dldF9vcGFxdWUgKGdjcnlfbXBpX3QgYSwgdW5zaWduZWQgaW50ICpuYml0cyk7CisKKy8qIFNldCB0aGUgRkxBRyBmb3IgdGhlIGJpZyBpbnRlZ2VyIEEuICBDdXJyZW50bHkgb25seSB0aGUgZmxhZworICAgR0NSWU1QSV9GTEFHX1NFQ1VSRSBpcyBhbGxvd2VkIHRvIGNvbnZlcnQgQSBpbnRvIGFuIGJpZyBpbnRnZXIKKyAgIHN0b3JlZCBpbiAic2VjdXJlIiBtZW1vcnkuICovCit2b2lkIGdjcnlfbXBpX3NldF9mbGFnIChnY3J5X21waV90IGEsIGVudW0gZ2NyeV9tcGlfZmxhZyBmbGFnKTsKKworLyogQ2xlYXIgRkxBRyBmb3IgdGhlIGJpZyBpbnRlZ2VyIEEuICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBpcworICAgY3VycmVudGx5IHVzZWxlc3MgYXMgbm8gZmxhZ3MgYXJlIGFsbG93ZWQuICovCit2b2lkIGdjcnlfbXBpX2NsZWFyX2ZsYWcgKGdjcnlfbXBpX3QgYSwgZW51bSBnY3J5X21waV9mbGFnIGZsYWcpOworCisvKiBSZXR1cm4gdHJ1ZSB3aGVuIHRoZSBGTEFHIGlzIHNldCBmb3IgQS4gKi8KK2ludCBnY3J5X21waV9nZXRfZmxhZyAoZ2NyeV9tcGlfdCBhLCBlbnVtIGdjcnlfbXBpX2ZsYWcgZmxhZyk7CisKKy8qIFVubGVzcyB0aGUgR0NSWVBUX05PX01QSV9NQUNST1MgaXMgdXNlZCwgcHJvdmlkZSBhIGNvdXBsZSBvZgorICAgY29udmVuaWVuY2UgbWFjcm9zIGZvciB0aGUgYmlnIGludGVnZXIgZnVuY3Rpb25zLiAqLworI2lmbmRlZiBHQ1JZUFRfTk9fTVBJX01BQ1JPUworI2RlZmluZSBtcGlfbmV3KG4pICAgICAgICAgIGdjcnlfbXBpX25ldyggKG4pICkKKyNkZWZpbmUgbXBpX3NlY3VyZV9uZXcoIG4gKSBnY3J5X21waV9zbmV3KCAobikgKQorI2RlZmluZSBtcGlfcmVsZWFzZShhKSAgICAgIFwKKyAgZG8gXAorICAgIHsgXAorICAgICAgZ2NyeV9tcGlfcmVsZWFzZSAoKGEpKTsgXAorICAgICAgKGEpID0gTlVMTDsgXAorICAgIH0gXAorICB3aGlsZSAoMCkKKworI2RlZmluZSBtcGlfY29weSggYSApICAgICAgICAgIGdjcnlfbXBpX2NvcHkoIChhKSApCisjZGVmaW5lIG1waV9zZXQoIHcsIHUpICAgICAgICAgZ2NyeV9tcGlfc2V0KCAodyksICh1KSApCisjZGVmaW5lIG1waV9zZXRfdWkoIHcsIHUpICAgICAgZ2NyeV9tcGlfc2V0X3VpKCAodyksICh1KSApCisjZGVmaW5lIG1waV9jbXAoIHUsIHYgKSAgICAgICAgZ2NyeV9tcGlfY21wKCAodSksICh2KSApCisjZGVmaW5lIG1waV9jbXBfdWkoIHUsIHYgKSAgICAgZ2NyeV9tcGlfY21wX3VpKCAodSksICh2KSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgbXBpX2FkZF91aSh3LHUsdikgICAgICBnY3J5X21waV9hZGRfdWkoKHcpLCh1KSwodikpCisjZGVmaW5lIG1waV9hZGQodyx1LHYpICAgICAgICAgZ2NyeV9tcGlfYWRkICgodyksKHUpLCh2KSkKKyNkZWZpbmUgbXBpX2FkZG0odyx1LHYsbSkgICAgICBnY3J5X21waV9hZGRtICgodyksKHUpLCh2KSwobSkpCisjZGVmaW5lIG1waV9zdWJfdWkodyx1LHYpICAgICAgZ2NyeV9tcGlfc3ViX3VpICgodyksKHUpLCh2KSkKKyNkZWZpbmUgbXBpX3N1Yih3LHUsdikgICAgICAgICBnY3J5X21waV9zdWIgKCh3KSwodSksKHYpKQorI2RlZmluZSBtcGlfc3VibSh3LHUsdixtKSAgICAgIGdjcnlfbXBpX3N1Ym0gKCh3KSwodSksKHYpLChtKSkKKyNkZWZpbmUgbXBpX211bF91aSh3LHUsdikgICAgICBnY3J5X21waV9tdWxfdWkgKCh3KSwodSksKHYpKQorI2RlZmluZSBtcGlfbXVsXzJleHAodyx1LHYpICAgIGdjcnlfbXBpX211bF8yZXhwICgodyksKHUpLCh2KSkKKyNkZWZpbmUgbXBpX211bCh3LHUsdikgICAgICAgICBnY3J5X21waV9tdWwgKCh3KSwodSksKHYpKQorI2RlZmluZSBtcGlfbXVsbSh3LHUsdixtKSAgICAgIGdjcnlfbXBpX211bG0gKCh3KSwodSksKHYpLChtKSkKKyNkZWZpbmUgbXBpX3Bvd20odyxiLGUsbSkgICAgICBnY3J5X21waV9wb3dtICggKHcpLCAoYiksIChlKSwgKG0pICkKKyNkZWZpbmUgbXBpX3RkaXYocSxyLGEsbSkgICAgICBnY3J5X21waV9kaXYgKCAocSksIChyKSwgKGEpLCAobSksIDApCisjZGVmaW5lIG1waV9mZGl2KHEscixhLG0pICAgICAgZ2NyeV9tcGlfZGl2ICggKHEpLCAociksIChhKSwgKG0pLCAtMSkKKyNkZWZpbmUgbXBpX21vZChyLGEsbSkgICAgICAgICBnY3J5X21waV9tb2QgKChyKSwgKGEpLCAobSkpCisjZGVmaW5lIG1waV9nY2QoZyxhLGIpICAgICAgICAgZ2NyeV9tcGlfZ2NkICggKGcpLCAoYSksIChiKSApCisjZGVmaW5lIG1waV9pbnZtKGcsYSxiKSAgICAgICAgZ2NyeV9tcGlfaW52bSAoIChnKSwgKGEpLCAoYikgKQorCisjZGVmaW5lIG1waV9nZXRfbmJpdHMoYSkgICAgICAgZ2NyeV9tcGlfZ2V0X25iaXRzICgoYSkpCisjZGVmaW5lIG1waV90ZXN0X2JpdChhLGIpICAgICAgZ2NyeV9tcGlfdGVzdF9iaXQgKChhKSwoYikpCisjZGVmaW5lIG1waV9zZXRfYml0KGEsYikgICAgICAgZ2NyeV9tcGlfc2V0X2JpdCAoKGEpLChiKSkKKyNkZWZpbmUgbXBpX3NldF9oaWdoYml0KGEsYikgICBnY3J5X21waV9zZXRfaGlnaGJpdCAoKGEpLChiKSkKKyNkZWZpbmUgbXBpX2NsZWFyX2JpdChhLGIpICAgICBnY3J5X21waV9jbGVhcl9iaXQgKChhKSwoYikpCisjZGVmaW5lIG1waV9jbGVhcl9oaWdoYml0KGEsYikgZ2NyeV9tcGlfY2xlYXJfaGlnaGJpdCAoKGEpLChiKSkKKyNkZWZpbmUgbXBpX3JzaGlmdChhLGIsYykgICAgICBnY3J5X21waV9yc2hpZnQgKChhKSwoYiksKGMpKQorI2RlZmluZSBtcGlfbHNoaWZ0KGEsYixjKSAgICAgIGdjcnlfbXBpX2xzaGlmdCAoKGEpLChiKSwoYykpCisKKyNkZWZpbmUgbXBpX3NldF9vcGFxdWUoYSxiLGMpICBnY3J5X21waV9zZXRfb3BhcXVlKCAoYSksIChiKSwgKGMpICkKKyNkZWZpbmUgbXBpX2dldF9vcGFxdWUoYSxiKSAgICBnY3J5X21waV9nZXRfb3BhcXVlKCAoYSksIChiKSApCisjZW5kaWYgLyogR0NSWVBUX05PX01QSV9NQUNST1MgKi8KKworCisMCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIFN5bW1ldHJpYyBDaXBoZXIgRnVuY3Rpb25zICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGUgZGF0YSBvYmplY3QgdXNlZCB0byBob2xkIGEgaGFuZGxlIHRvIGFuIGVuY3J5cHRpb24gb2JqZWN0LiAgKi8KK3N0cnVjdCBnY3J5X2NpcGhlcl9oYW5kbGU7Cit0eXBlZGVmIHN0cnVjdCBnY3J5X2NpcGhlcl9oYW5kbGUgKmdjcnlfY2lwaGVyX2hkX3Q7CisKKyNpZm5kZWYgR0NSWVBUX05PX0RFUFJFQ0FURUQKK3R5cGVkZWYgc3RydWN0IGdjcnlfY2lwaGVyX2hhbmRsZSAqR0NSWV9DSVBIRVJfSEQgX0dDUllfR0NDX0FUVFJfREVQUkVDQVRFRDsKK3R5cGVkZWYgc3RydWN0IGdjcnlfY2lwaGVyX2hhbmRsZSAqR2NyeUNpcGhlckhkIF9HQ1JZX0dDQ19BVFRSX0RFUFJFQ0FURUQ7CisjZW5kaWYKKworLyogQWxsIHN5bW1ldHJpYyBlbmNyeXB0aW9uIGFsZ29yaXRobXMgYXJlIGlkZW50aWZpZWQgYnkgdGhlaXIgSURzLgorICAgTW9yZSBJRHMgbWF5IGJlIHJlZ2lzdGVyZWQgYXQgcnVudGltZS4gKi8KK2VudW0gZ2NyeV9jaXBoZXJfYWxnb3MKKyAgeworICAgIEdDUllfQ0lQSEVSX05PTkUgICAgICAgID0gMCwKKyAgICBHQ1JZX0NJUEhFUl9JREVBICAgICAgICA9IDEsCisgICAgR0NSWV9DSVBIRVJfM0RFUyAgICAgICAgPSAyLAorICAgIEdDUllfQ0lQSEVSX0NBU1Q1ICAgICAgID0gMywKKyAgICBHQ1JZX0NJUEhFUl9CTE9XRklTSCAgICA9IDQsCisgICAgR0NSWV9DSVBIRVJfU0FGRVJfU0sxMjggPSA1LAorICAgIEdDUllfQ0lQSEVSX0RFU19TSyAgICAgID0gNiwKKyAgICBHQ1JZX0NJUEhFUl9BRVMgICAgICAgICA9IDcsCisgICAgR0NSWV9DSVBIRVJfQUVTMTkyICAgICAgPSA4LAorICAgIEdDUllfQ0lQSEVSX0FFUzI1NiAgICAgID0gOSwKKyAgICBHQ1JZX0NJUEhFUl9UV09GSVNIICAgICA9IDEwLAorCisgICAgLyogT3RoZXIgY2lwaGVyIG51bWJlcnMgYXJlIGFib3ZlIDMwMCBmb3IgT3BlblBHUCByZWFzb25zLiAqLworICAgIEdDUllfQ0lQSEVSX0FSQ0ZPVVIgICAgID0gMzAxLCAgLyogRnVsbHkgY29tcGF0aWJsZSB3aXRoIFJTQSdzIFJDNCAodG0pLiAqLworICAgIEdDUllfQ0lQSEVSX0RFUyAgICAgICAgID0gMzAyLCAgLyogWWVzLCB0aGlzIGlzIHNpbmdsZSBrZXkgNTYgYml0IERFUy4gKi8KKyAgICBHQ1JZX0NJUEhFUl9UV09GSVNIMTI4ICA9IDMwMywKKyAgICBHQ1JZX0NJUEhFUl9TRVJQRU5UMTI4ICA9IDMwNCwKKyAgICBHQ1JZX0NJUEhFUl9TRVJQRU5UMTkyICA9IDMwNSwKKyAgICBHQ1JZX0NJUEhFUl9TRVJQRU5UMjU2ICA9IDMwNiwKKyAgICBHQ1JZX0NJUEhFUl9SRkMyMjY4XzQwICA9IDMwNywgIC8qIFJvbidzIENpcGhlciAyICg0MCBiaXQpLiAqLworICAgIEdDUllfQ0lQSEVSX1JGQzIyNjhfMTI4ID0gMzA4LCAgLyogUm9uJ3MgQ2lwaGVyIDIgKDEyOCBiaXQpLiAqLworICAgIEdDUllfQ0lQSEVSX1NFRUQgICAgICAgID0gMzA5LCAgLyogMTI4IGJpdCBjaXBoZXIgZGVzY3JpYmVkIGluIFJGQzQyNjkuICovCisgICAgR0NSWV9DSVBIRVJfQ0FNRUxMSUExMjggPSAzMTAsCisgICAgR0NSWV9DSVBIRVJfQ0FNRUxMSUExOTIgPSAzMTEsCisgICAgR0NSWV9DSVBIRVJfQ0FNRUxMSUEyNTYgPSAzMTIKKyAgfTsKKworLyogVGhlIFJpam5kYWVsIGFsZ29yaXRobSBpcyBiYXNpY2FsbHkgQUVTLCBzbyBwcm92aWRlIHNvbWUgbWFjcm9zLiAqLworI2RlZmluZSBHQ1JZX0NJUEhFUl9BRVMxMjggICAgICBHQ1JZX0NJUEhFUl9BRVMgICAgCisjZGVmaW5lIEdDUllfQ0lQSEVSX1JJSk5EQUVMICAgIEdDUllfQ0lQSEVSX0FFUyAgICAKKyNkZWZpbmUgR0NSWV9DSVBIRVJfUklKTkRBRUwxMjggR0NSWV9DSVBIRVJfQUVTMTI4IAorI2RlZmluZSBHQ1JZX0NJUEhFUl9SSUpOREFFTDE5MiBHQ1JZX0NJUEhFUl9BRVMxOTIgCisjZGVmaW5lIEdDUllfQ0lQSEVSX1JJSk5EQUVMMjU2IEdDUllfQ0lQSEVSX0FFUzI1NiAKKworLyogVGhlIHN1cHBvcnRlZCBlbmNyeXB0aW9uIG1vZGVzLiAgTm90ZSB0aGF0IG5vdCBhbGwgb2YgdGhlbSBhcmUKKyAgIHN1cHBvcnRlZCBmb3IgZWFjaCBhbGdvcml0aG0uICovCitlbnVtIGdjcnlfY2lwaGVyX21vZGVzIAorICB7CisgICAgR0NSWV9DSVBIRVJfTU9ERV9OT05FICAgPSAwLCAgLyogTm90IHlldCBzcGVjaWZpZWQuICovCisgICAgR0NSWV9DSVBIRVJfTU9ERV9FQ0IgICAgPSAxLCAgLyogRWxlY3Ryb25pYyBjb2RlYm9vay4gKi8KKyAgICBHQ1JZX0NJUEhFUl9NT0RFX0NGQiAgICA9IDIsICAvKiBDaXBoZXIgZmVlZGJhY2suICovCisgICAgR0NSWV9DSVBIRVJfTU9ERV9DQkMgICAgPSAzLCAgLyogQ2lwaGVyIGJsb2NrIGNoYWluaW5nLiAqLworICAgIEdDUllfQ0lQSEVSX01PREVfU1RSRUFNID0gNCwgIC8qIFVzZWQgd2l0aCBzdHJlYW0gY2lwaGVycy4gKi8KKyAgICBHQ1JZX0NJUEhFUl9NT0RFX09GQiAgICA9IDUsICAvKiBPdXRlciBmZWVkYmFjay4gKi8KKyAgICBHQ1JZX0NJUEhFUl9NT0RFX0NUUiAgICA9IDYsICAvKiBDb3VudGVyLiAqLworICAgIEdDUllfQ0lQSEVSX01PREVfQUVTV1JBUD0gNyAgIC8qIEFFUy1XUkFQIGFsZ29yaXRobS4gICovCisgIH07CisKKy8qIEZsYWdzIHVzZWQgd2l0aCB0aGUgb3BlbiBmdW5jdGlvbi4gKi8gCitlbnVtIGdjcnlfY2lwaGVyX2ZsYWdzCisgIHsKKyAgICBHQ1JZX0NJUEhFUl9TRUNVUkUgICAgICA9IDEsICAvKiBBbGxvY2F0ZSBpbiBzZWN1cmUgbWVtb3J5LiAqLworICAgIEdDUllfQ0lQSEVSX0VOQUJMRV9TWU5DID0gMiwgIC8qIEVuYWJsZSBDRkIgc3luYyBtb2RlLiAqLworICAgIEdDUllfQ0lQSEVSX0NCQ19DVFMgICAgID0gNCwgIC8qIEVuYWJsZSBDQkMgY2lwaGVyIHRleHQgc3RlYWxpbmcgKENUUykuICovCisgICAgR0NSWV9DSVBIRVJfQ0JDX01BQyAgICAgPSA4ICAgLyogRW5hYmxlIENCQyBtZXNzYWdlIGF1dGguIGNvZGUgKE1BQykuICovCisgIH07CisKKworLyogQ3JlYXRlIGEgaGFuZGxlIGZvciBhbGdvcml0aG0gQUxHTyB0byBiZSB1c2VkIGluIE1PREUuICBGTEFHUyBtYXkKKyAgIGJlIGdpdmVuIGFzIGFuIGJpdHdpc2UgT1Igb2YgdGhlIGdjcnlfY2lwaGVyX2ZsYWdzIHZhbHVlcy4gKi8KK2djcnlfZXJyb3JfdCBnY3J5X2NpcGhlcl9vcGVuIChnY3J5X2NpcGhlcl9oZF90ICpoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxnbywgaW50IG1vZGUsIHVuc2lnbmVkIGludCBmbGFncyk7CisKKy8qIENsb3NlIHRoZSBjaW9oZXIgaGFuZGxlIEggYW5kIHJlbGVhc2UgYWxsIHJlc291cmNlLiAqLwordm9pZCBnY3J5X2NpcGhlcl9jbG9zZSAoZ2NyeV9jaXBoZXJfaGRfdCBoKTsKKworLyogUGVyZm9ybSB2YXJpb3VzIG9wZXJhdGlvbnMgb24gdGhlIGNpcGhlciBvYmplY3QgSC4gKi8KK2djcnlfZXJyb3JfdCBnY3J5X2NpcGhlcl9jdGwgKGdjcnlfY2lwaGVyX2hkX3QgaCwgaW50IGNtZCwgdm9pZCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmbGVuKTsKKworLyogUmV0cmlldmUgdmFyaW91cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2lwaGVyIG9iamVjdCBILiAqLworZ2NyeV9lcnJvcl90IGdjcnlfY2lwaGVyX2luZm8gKGdjcnlfY2lwaGVyX2hkX3QgaCwgaW50IHdoYXQsIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqbmJ5dGVzKTsKKworLyogUmV0cmlldmUgdmFyaW91cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2lwaGVyIGFsZ29yaXRobSBBTEdPLiAqLworZ2NyeV9lcnJvcl90IGdjcnlfY2lwaGVyX2FsZ29faW5mbyAoaW50IGFsZ28sIGludCB3aGF0LCB2b2lkICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqbmJ5dGVzKTsKKworLyogTWFwIHRoZSBjaXBoZXIgYWxnb3JpdGhtIHdob3NlIElEIGlzIGNvbnRhaW5lZCBpbiBBTEdPUklUSE0gdG8gYQorICAgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhbGdvcml0aG0gbmFtZS4gIEZvciB1bmtub3duIGFsZ29yaXRobQorICAgSURzIHRoaXMgZnVuY3Rpb24gcmV0dXJucyAiPyIuICAqLworY29uc3QgY2hhciAqZ2NyeV9jaXBoZXJfYWxnb19uYW1lIChpbnQgYWxnb3JpdGhtKSBfR0NSWV9HQ0NfQVRUUl9QVVJFOworCisvKiBNYXAgdGhlIGFsZ29yaXRobSBuYW1lIE5BTUUgdG8gYW4gY2lwaGVyIGFsZ29yaXRobSBJRC4gIFJldHVybiAwIGlmCisgICB0aGUgYWxnb3JpdGhtIG5hbWUgaXMgbm90IGtub3duLiAqLworaW50IGdjcnlfY2lwaGVyX21hcF9uYW1lIChjb25zdCBjaGFyICpuYW1lKSBfR0NSWV9HQ0NfQVRUUl9QVVJFOworCisvKiBHaXZlbiBhbiBBU04uMSBvYmplY3QgaWRlbnRpZmllciBpbiBzdGFuZGFyZCBJRVRGIGRvdHRlZCBkZWNpbWFsCisgICBmb3JtYXQgaW4gU1RSSU5HLCByZXR1cm4gdGhlIGVuY3J5cHRpb24gbW9kZSBhc3NvY2lhdGVkIHdpdGggdGhhdAorICAgT0lEIG9yIDAgaWYgbm90IGtub3duIG9yIGFwcGxpY2FibGUuICovCitpbnQgZ2NyeV9jaXBoZXJfbW9kZV9mcm9tX29pZCAoY29uc3QgY2hhciAqc3RyaW5nKSBfR0NSWV9HQ0NfQVRUUl9QVVJFOworCisvKiBFbmNyeXB0IHRoZSBwbGFpbnRleHQgb2Ygc2l6ZSBJTkxFTiBpbiBJTiB1c2luZyB0aGUgY2lwaGVyIGhhbmRsZSBICisgICBpbnRvIHRoZSBidWZmZXIgT1VUIHdoaWNoIGhhcyBhbiBhbGxvY2F0ZWQgbGVuZ3RoIG9mIE9VVFNJWkUuICBGb3IKKyAgIG1vc3QgYWxnb3JpdGhtcyBpdCBpcyBwb3NzaWJsZSB0byBwYXNzIE5VTEwgZm9yIGluIGFuZCAwIGZvciBJTkxFTgorICAgYW5kIGRvIGEgaW4tcGxhY2UgZGVjcnlwdGlvbiBvZiB0aGUgZGF0YSBwcm92aWRlZCBpbiBPVVQuICAqLworZ2NyeV9lcnJvcl90IGdjcnlfY2lwaGVyX2VuY3J5cHQgKGdjcnlfY2lwaGVyX2hkX3QgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvdXQsIHNpemVfdCBvdXRzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmluLCBzaXplX3QgaW5sZW4pOworCisvKiBUaGUgY291bnRlcnBhcnQgdG8gZ2NyeV9jaXBoZXJfZW5jcnlwdC4gICovCitnY3J5X2Vycm9yX3QgZ2NyeV9jaXBoZXJfZGVjcnlwdCAoZ2NyeV9jaXBoZXJfaGRfdCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm91dCwgc2l6ZV90IG91dHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqaW4sIHNpemVfdCBpbmxlbik7CisKKy8qIFNldCBLRVkgb2YgbGVuZ3RoIEtFWUxFTiBieXRlcyBmb3IgdGhlIGNpcGhlciBoYW5kbGUgSEQuICAqLworZ2NyeV9lcnJvcl90IGdjcnlfY2lwaGVyX3NldGtleSAoZ2NyeV9jaXBoZXJfaGRfdCBoZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmtleSwgc2l6ZV90IGtleWxlbik7CisKKworLyogU2V0IGluaXRpYWxpemF0aW9uIHZlY3RvciBJViBvZiBsZW5ndGggSVZMRU4gZm9yIHRoZSBjaXBoZXIgaGFuZGxlIEhELiAqLworZ2NyeV9lcnJvcl90IGdjcnlfY2lwaGVyX3NldGl2IChnY3J5X2NpcGhlcl9oZF90IGhkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICppdiwgc2l6ZV90IGl2bGVuKTsKKworCisvKiBSZXNldCB0aGUgaGFuZGxlIHRvIHRoZSBzdGF0ZSBhZnRlciBvcGVuLiAgKi8KKyNkZWZpbmUgZ2NyeV9jaXBoZXJfcmVzZXQoaCkgIGdjcnlfY2lwaGVyX2N0bCAoKGgpLCBHQ1JZQ1RMX1JFU0VULCBOVUxMLCAwKQorCisvKiBQZXJmb3JtIHRoZSBPcGVuUEdQIHN5bmMgb3BlcmF0aW9uIGlmIHRoaXMgaXMgZW5hYmxlZCBmb3IgdGhlCisgICBjaXBoZXIgaGFuZGxlIEguICovCisjZGVmaW5lIGdjcnlfY2lwaGVyX3N5bmMoaCkgIGdjcnlfY2lwaGVyX2N0bCggKGgpLCBHQ1JZQ1RMX0NGQl9TWU5DLCBOVUxMLCAwKQorCisvKiBFbmFibGUgb3IgZGlzYWJsZSBDVFMgaW4gZnV0dXJlIGNhbGxzIHRvIGdjcnlfZW5jcnlwdCgpLiBDQkMgbW9kZSBvbmx5LiAqLworI2RlZmluZSBnY3J5X2NpcGhlcl9jdHMoaCxvbikgIGdjcnlfY2lwaGVyX2N0bCggKGgpLCBHQ1JZQ1RMX1NFVF9DQkNfQ1RTLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgb24gKQorCisvKiBTZXQgY291bnRlciBmb3IgQ1RSIG1vZGUuICAoQ1RSLENUUkxFTikgbXVzdCBkZW5vdGUgYSBidWZmZXIgb2YKKyAgIGJsb2NrIHNpemUgbGVuZ3RoLCBvciAoTlVMTCwwKSB0byBzZXQgdGhlIENUUiB0byB0aGUgYWxsLXplcm8gYmxvY2suICovCitncGdfZXJyb3JfdCBnY3J5X2NpcGhlcl9zZXRjdHIgKGdjcnlfY2lwaGVyX2hkX3QgaGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmN0ciwgc2l6ZV90IGN0cmxlbik7CisKKy8qIFJldHJpZXZlZCB0aGUga2V5IGxlbmd0aCBpbiBieXRlcyB1c2VkIHdpdGggYWxnb3JpdGhtIEEuICovCitzaXplX3QgZ2NyeV9jaXBoZXJfZ2V0X2FsZ29fa2V5bGVuIChpbnQgYWxnbyk7CisKKy8qIFJldHJpZXZlIHRoZSBibG9jayBsZW5ndGggaW4gYnl0ZXMgdXNlZCB3aXRoIGFsZ29yaXRobSBBLiAqLworc2l6ZV90IGdjcnlfY2lwaGVyX2dldF9hbGdvX2Jsa2xlbiAoaW50IGFsZ28pOworCisvKiBSZXR1cm4gMCBpZiB0aGUgYWxnb3JpdGhtIEEgaXMgYXZhaWxhYmxlIGZvciB1c2UuICovCisjZGVmaW5lIGdjcnlfY2lwaGVyX3Rlc3RfYWxnbyhhKSBcCisgICAgICAgICAgICBnY3J5X2NpcGhlcl9hbGdvX2luZm8oIChhKSwgR0NSWUNUTF9URVNUX0FMR08sIE5VTEwsIE5VTEwgKQorCisvKiBHZXQgYSBsaXN0IGNvbnNpc3Rpbmcgb2YgdGhlIElEcyBvZiB0aGUgbG9hZGVkIGNpcGhlciBtb2R1bGVzLiAgSWYKKyAgIExJU1QgaXMgemVybywgd3JpdGUgdGhlIG51bWJlciBvZiBsb2FkZWQgY2lwaGVyIG1vZHVsZXMgdG8KKyAgIExJU1RfTEVOR1RIIGFuZCByZXR1cm4uICBJZiBMSVNUIGlzIG5vbi16ZXJvLCB0aGUgZmlyc3QKKyAgICpMSVNUX0xFTkdUSCBhbGdvcml0aG0gSURzIGFyZSBzdG9yZWQgaW4gTElTVCwgd2hpY2ggbXVzdCBiZSBvZgorICAgYWNjb3JkaW5nIHNpemUuICBJbiBjYXNlIHRoZXJlIGFyZSBsZXNzIGNpcGhlciBtb2R1bGVzIHRoYW4KKyAgICpMSVNUX0xFTkdUSCwgKkxJU1RfTEVOR1RIIGlzIHVwZGF0ZWQgdG8gdGhlIGNvcnJlY3QgbnVtYmVyLiAgKi8KK2djcnlfZXJyb3JfdCBnY3J5X2NpcGhlcl9saXN0IChpbnQgKmxpc3QsIGludCAqbGlzdF9sZW5ndGgpOworCisMCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICBBc3ltbWV0cmljIENpcGhlciBGdW5jdGlvbnMgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGUgYWxnb3JpdGhtcyBhbmQgdGhlaXIgSURzIHdlIHN1cHBvcnQuICovCitlbnVtIGdjcnlfcGtfYWxnb3MgCisgIHsKKyAgICBHQ1JZX1BLX1JTQSAgID0gMSwKKyAgICBHQ1JZX1BLX1JTQV9FID0gMiwgICAgICAvKiAoZGVwcmVjYXRlZCkgKi8KKyAgICBHQ1JZX1BLX1JTQV9TID0gMywgICAgICAvKiAoZGVwcmVjYXRlZCkgKi8KKyAgICBHQ1JZX1BLX0VMR19FID0gMTYsCisgICAgR0NSWV9QS19EU0EgICA9IDE3LAorICAgIEdDUllfUEtfRUxHICAgPSAyMCwKKyAgICBHQ1JZX1BLX0VDRFNBID0gMzAxCisgIH07CisKKy8qIEZsYWdzIGRlc2NyaWJpbmcgdXNhZ2UgY2FwYWJpbGl0aWVzIG9mIGEgUEsgYWxnb3JpdGhtLiAqLworI2RlZmluZSBHQ1JZX1BLX1VTQUdFX1NJR04gMSAgIC8qIEdvb2QgZm9yIHNpZ25hdHVyZXMuICovICAgICAgICAgICAgCisjZGVmaW5lIEdDUllfUEtfVVNBR0VfRU5DUiAyICAgLyogR29vZCBmb3IgZW5jcnlwdGlvbi4gKi8gICAgICAgICAgICAKKyNkZWZpbmUgR0NSWV9QS19VU0FHRV9DRVJUIDQgICAvKiBHb29kIHRvIGNlcnRpZnkgb3RoZXIga2V5cy4gKi8KKyNkZWZpbmUgR0NSWV9QS19VU0FHRV9BVVRIIDggICAvKiBHb29kIGZvciBhdXRoZW50aWNhdGlvbi4gKi8gICAgICAgIAorI2RlZmluZSBHQ1JZX1BLX1VTQUdFX1VOS04gMTI4IC8qIFVua25vd24gdXNhZ2UgZmxhZy4gKi8gICAgICAgICAgCisKKy8qIEVuY3J5cHQgdGhlIERBVEEgdXNpbmcgdGhlIHB1YmxpYyBrZXkgUEtFWSBhbmQgc3RvcmUgdGhlIHJlc3VsdCBhcworICAgYSBuZXdseSBjcmVhdGVkIFMtZXhwcmVzc2lvbiBhdCBSRVNVTFQuICovCitnY3J5X2Vycm9yX3QgZ2NyeV9wa19lbmNyeXB0IChnY3J5X3NleHBfdCAqcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NyeV9zZXhwX3QgZGF0YSwgZ2NyeV9zZXhwX3QgcGtleSk7CisKKy8qIERlY3J5cHQgdGhlIERBVEEgdXNpbmcgdGhlIHByaXZhdGUga2V5IFNLRVkgYW5kIHN0b3JlIHRoZSByZXN1bHQgYXMKKyAgIGEgbmV3bHkgY3JlYXRlZCBTLWV4cHJlc3Npb24gYXQgUkVTVUxULiAqLworZ2NyeV9lcnJvcl90IGdjcnlfcGtfZGVjcnlwdCAoZ2NyeV9zZXhwX3QgKnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfc2V4cF90IGRhdGEsIGdjcnlfc2V4cF90IHNrZXkpOworCisvKiBTaWduIHRoZSBEQVRBIHVzaW5nIHRoZSBwcml2YXRlIGtleSBTS0VZIGFuZCBzdG9yZSB0aGUgcmVzdWx0IGFzCisgICBhIG5ld2x5IGNyZWF0ZWQgUy1leHByZXNzaW9uIGF0IFJFU1VMVC4gKi8KK2djcnlfZXJyb3JfdCBnY3J5X3BrX3NpZ24gKGdjcnlfc2V4cF90ICpyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X3NleHBfdCBkYXRhLCBnY3J5X3NleHBfdCBza2V5KTsKKworLyogQ2hlY2sgdGhlIHNpZ25hdHVyZSBTSUdWQUwgb24gREFUQSB1c2luZyB0aGUgcHVibGljIGtleSBQS0VZLiAqLworZ2NyeV9lcnJvcl90IGdjcnlfcGtfdmVyaWZ5IChnY3J5X3NleHBfdCBzaWd2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfc2V4cF90IGRhdGEsIGdjcnlfc2V4cF90IHBrZXkpOworCisvKiBDaGVjayB0aGF0IHByaXZhdGUgS0VZIGlzIHNhbmUuICovCitnY3J5X2Vycm9yX3QgZ2NyeV9wa190ZXN0a2V5IChnY3J5X3NleHBfdCBrZXkpOworCisvKiBHZW5lcmF0ZSBhIG5ldyBrZXkgcGFpciBhY2NvcmRpbmcgdG8gdGhlIHBhcmFtZXRlcnMgZ2l2ZW4gaW4KKyAgIFNfUEFSTVMuICBUaGUgbmV3IGtleSBwYWlyIGlzIHJldHVybmVkIGluIGFzIGFuIFMtZXhwcmVzc2lvbiBpbgorICAgUl9LRVkuICovCitnY3J5X2Vycm9yX3QgZ2NyeV9wa19nZW5rZXkgKGdjcnlfc2V4cF90ICpyX2tleSwgZ2NyeV9zZXhwX3Qgc19wYXJtcyk7CisKKy8qIENhdGNoIGFsbCBmdW5jdGlvbiBmb3IgbWlzY2VsbGFuZW91cyBvcGVyYXRpb25zLiAqLworZ2NyeV9lcnJvcl90IGdjcnlfcGtfY3RsIChpbnQgY21kLCB2b2lkICpidWZmZXIsIHNpemVfdCBidWZsZW4pOworCisvKiBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHVibGljIGtleSBhbGdvcml0aG0gQUxHTy4gKi8KK2djcnlfZXJyb3JfdCBnY3J5X3BrX2FsZ29faW5mbyAoaW50IGFsZ28sIGludCB3aGF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsIHNpemVfdCAqbmJ5dGVzKTsKKworLyogTWFwIHRoZSBwdWJsaWMga2V5IGFsZ29yaXRobSB3aG9zZSBJRCBpcyBjb250YWluZWQgaW4gQUxHT1JJVEhNIHRvCisgICBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYWxnb3JpdGhtIG5hbWUuICBGb3IgdW5rbm93bgorICAgYWxnb3JpdGhtIElEcyB0aGlzIGZ1bmN0aW9ucyByZXR1cm5zICI/Ii4gKi8KK2NvbnN0IGNoYXIgKmdjcnlfcGtfYWxnb19uYW1lIChpbnQgYWxnb3JpdGhtKSBfR0NSWV9HQ0NfQVRUUl9QVVJFOworCisvKiBNYXAgdGhlIGFsZ29yaXRobSBOQU1FIHRvIGEgcHVibGljIGtleSBhbGdvcml0aG0gSWQuICBSZXR1cm4gMCBpZgorICAgdGhlIGFsZ29yaXRobSBuYW1lIGlzIG5vdCBrbm93bi4gKi8KK2ludCBnY3J5X3BrX21hcF9uYW1lIChjb25zdCBjaGFyKiBuYW1lKSBfR0NSWV9HQ0NfQVRUUl9QVVJFOworCisvKiBSZXR1cm4gd2hhdCBpcyBjb21tb25seSByZWZlcnJlZCBhcyB0aGUga2V5IGxlbmd0aCBmb3IgdGhlIGdpdmVuCisgICBwdWJsaWMgb3IgcHJpdmF0ZSBLRVkuICAqLwordW5zaWduZWQgaW50IGdjcnlfcGtfZ2V0X25iaXRzIChnY3J5X3NleHBfdCBrZXkpIF9HQ1JZX0dDQ19BVFRSX1BVUkU7CisKKy8qIFBsZWFzZSBub3RlIHRoYXQga2V5Z3JpcCBpcyBzdGlsbCBleHBlcmltZW50YWwgYW5kIHNob3VsZCBub3QgYmUKKyAgIHVzZWQgd2l0aG91dCBjb250YWN0aW5nIHRoZSBhdXRob3IuICovCit1bnNpZ25lZCBjaGFyICpnY3J5X3BrX2dldF9rZXlncmlwIChnY3J5X3NleHBfdCBrZXksIHVuc2lnbmVkIGNoYXIgKmFycmF5KTsKKworLyogUmV0dXJuIDAgaWYgdGhlIHB1YmxpYyBrZXkgYWxnb3JpdGhtIEEgaXMgYXZhaWxhYmxlIGZvciB1c2UuICovCisjZGVmaW5lIGdjcnlfcGtfdGVzdF9hbGdvKGEpIFwKKyAgICAgICAgICAgIGdjcnlfcGtfYWxnb19pbmZvKCAoYSksIEdDUllDVExfVEVTVF9BTEdPLCBOVUxMLCBOVUxMICkKKworLyogR2V0IGEgbGlzdCBjb25zaXN0aW5nIG9mIHRoZSBJRHMgb2YgdGhlIGxvYWRlZCBwdWJrZXkgbW9kdWxlcy4gIElmCisgICBMSVNUIGlzIHplcm8sIHdyaXRlIHRoZSBudW1iZXIgb2YgbG9hZGVkIHB1YmtleSBtb2R1bGVzIHRvCisgICBMSVNUX0xFTkdUSCBhbmQgcmV0dXJuLiAgSWYgTElTVCBpcyBub24temVybywgdGhlIGZpcnN0CisgICAqTElTVF9MRU5HVEggYWxnb3JpdGhtIElEcyBhcmUgc3RvcmVkIGluIExJU1QsIHdoaWNoIG11c3QgYmUgb2YKKyAgIGFjY29yZGluZyBzaXplLiAgSW4gY2FzZSB0aGVyZSBhcmUgbGVzcyBwdWJrZXkgbW9kdWxlcyB0aGFuCisgICAqTElTVF9MRU5HVEgsICpMSVNUX0xFTkdUSCBpcyB1cGRhdGVkIHRvIHRoZSBjb3JyZWN0IG51bWJlci4gICovCitnY3J5X2Vycm9yX3QgZ2NyeV9wa19saXN0IChpbnQgKmxpc3QsIGludCAqbGlzdF9sZW5ndGgpOworCisMCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgQ3J5cHRvZ3JhaGljIEhhc2ggRnVuY3Rpb25zICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEFsZ29yaXRobSBJRHMgZm9yIHRoZSBoYXNoIGZ1bmN0aW9ucyB3ZSBrbm93IGFib3V0LiBOb3QgYWxsIG9mIHRoZW0KKyAgIGFyZSBpbXBsZW1udGVkLiAqLworZW51bSBnY3J5X21kX2FsZ29zCisgIHsKKyAgICBHQ1JZX01EX05PTkUgICAgPSAwLCAgCisgICAgR0NSWV9NRF9NRDUgICAgID0gMSwKKyAgICBHQ1JZX01EX1NIQTEgICAgPSAyLAorICAgIEdDUllfTURfUk1EMTYwICA9IDMsCisgICAgR0NSWV9NRF9NRDIgICAgID0gNSwKKyAgICBHQ1JZX01EX1RJR0VSICAgPSA2LCAgIC8qIFRJR0VSLzE5MiBhcyB1c2VkIGJ5IEdudVBHIDw9IDEuMy4yLiAqLworICAgIEdDUllfTURfSEFWQUwgICA9IDcsICAgLyogSEFWQUwsIDUgcGFzcywgMTYwIGJpdC4gKi8KKyAgICBHQ1JZX01EX1NIQTI1NiAgPSA4LAorICAgIEdDUllfTURfU0hBMzg0ICA9IDksCisgICAgR0NSWV9NRF9TSEE1MTIgID0gMTAsCisgICAgR0NSWV9NRF9TSEEyMjQgID0gMTEsCisgICAgR0NSWV9NRF9NRDQgICAgID0gMzAxLAorICAgIEdDUllfTURfQ1JDMzIgICAgICAgICA9IDMwMiwKKyAgICBHQ1JZX01EX0NSQzMyX1JGQzE1MTAgPSAzMDMsCisgICAgR0NSWV9NRF9DUkMyNF9SRkMyNDQwID0gMzA0LAorICAgIEdDUllfTURfV0hJUkxQT09MID0gMzA1LAorICAgIEdDUllfTURfVElHRVIxICA9IDMwNiwgLyogVElHRVIgKGZpeGVkKS4gICovCisgICAgR0NSWV9NRF9USUdFUjIgID0gMzA3ICAvKiBUSUdFUjIgdmFyaWFudC4gICAqLworICB9OworCisvKiBGbGFncyB1c2VkIHdpdGggdGhlIG9wZW4gZnVuY3Rpb24uICAqLworZW51bSBnY3J5X21kX2ZsYWdzCisgIHsKKyAgICBHQ1JZX01EX0ZMQUdfU0VDVVJFID0gMSwgIC8qIEFsbG9jYXRlIGFsbCBidWZmZXJzIGluICJzZWN1cmUiIG1lbW9yeS4gICovCisgICAgR0NSWV9NRF9GTEFHX0hNQUMgICA9IDIgICAvKiBNYWtlIGFuIEhNQUMgb3V0IG9mIHRoaXMgYWxnb3JpdGhtLiAgKi8KKyAgfTsKKworLyogKEZvcndhcmQgZGVjbGFyYXRpb24uKSAgKi8KK3N0cnVjdCBnY3J5X21kX2NvbnRleHQ7CisKKy8qIFRoaXMgb2JqZWN0IGlzIHVzZWQgdG8gaG9sZCBhIGhhbmRsZSB0byBhIG1lc3NhZ2UgZGlnZXN0IG9iamVjdC4KKyAgIFRoaXMgc3RydWN0dXJlIGlzIHByaXZhdGUgLSBvbmx5IHRvIGJlIHVzZWQgYnkgdGhlIHB1YmxpYyBnY3J5X21kXyoKKyAgIG1hY3Jvcy4gICovCit0eXBlZGVmIHN0cnVjdCBnY3J5X21kX2hhbmRsZSAKK3sKKyAgLyogQWN0dWFsIGNvbnRleHQuICAqLworICBzdHJ1Y3QgZ2NyeV9tZF9jb250ZXh0ICpjdHg7CisgIAorICAvKiBCdWZmZXIgbWFuYWdlbWVudC4gICovCisgIGludCAgYnVmcG9zOworICBpbnQgIGJ1ZnNpemU7CisgIHVuc2lnbmVkIGNoYXIgYnVmWzFdOworfSAqZ2NyeV9tZF9oZF90OworCisvKiBDb21wYXRpYmlsaXR5IHR5cGVzLCBkbyBub3QgdXNlIHRoZW0uICAqLworI2lmbmRlZiBHQ1JZUFRfTk9fREVQUkVDQVRFRAordHlwZWRlZiBzdHJ1Y3QgZ2NyeV9tZF9oYW5kbGUgKkdDUllfTURfSEQgX0dDUllfR0NDX0FUVFJfREVQUkVDQVRFRDsKK3R5cGVkZWYgc3RydWN0IGdjcnlfbWRfaGFuZGxlICpHY3J5TURIZCBfR0NSWV9HQ0NfQVRUUl9ERVBSRUNBVEVEOworI2VuZGlmCisKKy8qIENyZWF0ZSBhIG1lc3NhZ2UgZGlnZXN0IG9iamVjdCBmb3IgYWxnb3JpdGhtIEFMR08uICBGTEFHUyBtYXkgYmUKKyAgIGdpdmVuIGFzIGFuIGJpdHdpc2UgT1Igb2YgdGhlIGdjcnlfbWRfZmxhZ3MgdmFsdWVzLiAgQUxHTyBtYXkgYmUKKyAgIGdpdmVuIGFzIDAgaWYgdGhlIGFsZ29yaXRobXMgdG8gYmUgdXNlZCBhcmUgbGF0ZXIgc2V0IHVzaW5nCisgICBnY3J5X21kX2VuYWJsZS4gICovCitnY3J5X2Vycm9yX3QgZ2NyeV9tZF9vcGVuIChnY3J5X21kX2hkX3QgKmgsIGludCBhbGdvLCB1bnNpZ25lZCBpbnQgZmxhZ3MpOworCisvKiBSZWxlYXNlIHRoZSBtZXNzYWdlIGRpZ2VzdCBvYmplY3QgSEQuICAqLwordm9pZCBnY3J5X21kX2Nsb3NlIChnY3J5X21kX2hkX3QgaGQpOworCisvKiBBZGQgdGhlIG1lc3NhZ2UgZGlnZXN0IGFsZ29yaXRobSBBTEdPIHRvIHRoZSBkaWdlc3Qgb2JqZWN0IEhELiAgKi8KK2djcnlfZXJyb3JfdCBnY3J5X21kX2VuYWJsZSAoZ2NyeV9tZF9oZF90IGhkLCBpbnQgYWxnbyk7CisKKy8qIENyZWF0ZSBhIG5ldyBkaWdlc3Qgb2JqZWN0IGFzIGFuIGV4YWN0IGNvcHkgb2YgdGhlIG9iamVjdCBIRC4gICovCitnY3J5X2Vycm9yX3QgZ2NyeV9tZF9jb3B5IChnY3J5X21kX2hkX3QgKmJoZCwgZ2NyeV9tZF9oZF90IGFoZCk7CisKKy8qIFJlc2V0IHRoZSBkaWdlc3Qgb2JqZWN0IEhEIHRvIGl0cyBpbml0aWFsIHN0YXRlLiAgKi8KK3ZvaWQgZ2NyeV9tZF9yZXNldCAoZ2NyeV9tZF9oZF90IGhkKTsKKworLyogUGVyZm9ybSB2YXJpb3VzIG9wZXJhdGlvbnMgb24gdGhlIGRpZ2VzdCBvYmplY3QgSEQuICovCitnY3J5X2Vycm9yX3QgZ2NyeV9tZF9jdGwgKGdjcnlfbWRfaGRfdCBoZCwgaW50IGNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnVmbGVuKTsKKworLyogUGFzcyBMRU5HVEggYnl0ZXMgb2YgZGF0YSBpbiBCVUZGRVIgdG8gdGhlIGRpZ2VzdCBvYmplY3QgSEQgc28gdGhhdAorICAgaXQgY2FuIHVwZGF0ZSB0aGUgZGlnZXN0IHZhbHVlcy4gIFRoaXMgaXMgdGhlIGFjdHVhbCBoYXNoCisgICBmdW5jdGlvbi4gKi8KK3ZvaWQgZ2NyeV9tZF93cml0ZSAoZ2NyeV9tZF9oZF90IGhkLCBjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBsZW5ndGgpOworCisvKiBSZWFkIG91dCB0aGUgZmluYWwgZGlnZXN0IGZyb20gSEQgcmV0dXJuIHRoZSBkaWdlc3QgdmFsdWUgZm9yCisgICBhbGdvcml0aG0gQUxHTy4gKi8KK3Vuc2lnbmVkIGNoYXIgKmdjcnlfbWRfcmVhZCAoZ2NyeV9tZF9oZF90IGhkLCBpbnQgYWxnbyk7CisKKy8qIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSB0aGUgaGFzaCBmcm9tIHRoZSBkYXRhIGluIEJVRkZFUgorICAgb2Ygc2l6ZSBMRU5HVEggdXNpbmcgdGhlIGFsZ29yaXRobSBBTEdPIGF2b2lkaW5nIHRoZSBjcmVhdGluZyBvZiBhCisgICBoYXNoIG9iamVjdC4gIFRoZSBoYXNoIGlzIHJldHVybmVkIGluIHRoZSBjYWxsZXIgcHJvdmlkZWQgYnVmZmVyCisgICBESUdFU1Qgd2hpY2ggbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUgZGlnZXN0IG9mIHRoZSBnaXZlbgorICAgYWxnb3JpdGhtLiAqLwordm9pZCBnY3J5X21kX2hhc2hfYnVmZmVyIChpbnQgYWxnbywgdm9pZCAqZGlnZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBsZW5ndGgpOworCisvKiBSZXRyaWV2ZSB0aGUgYWxnb3JpdGhtIHVzZWQgd2l0aCBIRC4gIFRoaXMgZG9lcyBub3Qgd29yayByZWxpYWJsZQorICAgaWYgbW9yZSB0aGFuIG9uZSBhbGdvcml0aG0gaXMgZW5hYmxlZCBpbiBIRC4gKi8KK2ludCBnY3J5X21kX2dldF9hbGdvIChnY3J5X21kX2hkX3QgaGQpOworCisvKiBSZXRyaWV2ZSB0aGUgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBkaWdlc3QgeWllbGRlZCBieSBhbGdvcml0aG0KKyAgIEFMR08uICovCit1bnNpZ25lZCBpbnQgZ2NyeV9tZF9nZXRfYWxnb19kbGVuIChpbnQgYWxnbyk7CisKKy8qIFJldHVybiB0cnVlIGlmIHRoZSB0aGUgYWxnb3JpdGhtIEFMR08gaXMgZW5hYmxlZCBpbiB0aGUgZGlnZXN0CisgICBvYmplY3QgQS4gKi8KK2ludCBnY3J5X21kX2lzX2VuYWJsZWQgKGdjcnlfbWRfaGRfdCBhLCBpbnQgYWxnbyk7CisKKy8qIFJldHVybiB0cnVlIGlmIHRoZSBkaWdlc3Qgb2JqZWN0IEEgaXMgYWxsb2NhdGVkIGluICJzZWN1cmUiIG1lbW9yeS4gKi8KK2ludCBnY3J5X21kX2lzX3NlY3VyZSAoZ2NyeV9tZF9oZF90IGEpOworCisvKiBSZXRyaWV2ZSB2YXJpb3VzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QgSC4gICovCitnY3J5X2Vycm9yX3QgZ2NyeV9tZF9pbmZvIChnY3J5X21kX2hkX3QgaCwgaW50IHdoYXQsIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpuYnl0ZXMpOworCisvKiBSZXRyaWV2ZSB2YXJpb3VzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhbGdvcml0aG0gQUxHTy4gICovCitnY3J5X2Vycm9yX3QgZ2NyeV9tZF9hbGdvX2luZm8gKGludCBhbGdvLCBpbnQgd2hhdCwgdm9pZCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqbmJ5dGVzKTsKKworLyogTWFwIHRoZSBkaWdlc3QgYWxnb3JpdGhtIGlkIEFMR08gdG8gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlCisgICBhbGdvcml0aG0gbmFtZS4gIEZvciB1bmtub3duIGFsZ29yaXRobXMgdGhpcyBmdW5jdGlvbiByZXR1cm5zCisgICAiPyIuICovCitjb25zdCBjaGFyICpnY3J5X21kX2FsZ29fbmFtZSAoaW50IGFsZ28pIF9HQ1JZX0dDQ19BVFRSX1BVUkU7CisKKy8qIE1hcCB0aGUgYWxnb3JpdGhtIE5BTUUgdG8gYSBkaWdlc3QgYWxnb3JpdGhtIElkLiAgUmV0dXJuIDAgaWYKKyAgIHRoZSBhbGdvcml0aG0gbmFtZSBpcyBub3Qga25vd24uICovCitpbnQgZ2NyeV9tZF9tYXBfbmFtZSAoY29uc3QgY2hhciogbmFtZSkgX0dDUllfR0NDX0FUVFJfUFVSRTsKKworLyogRm9yIHVzZSB3aXRoIHRoZSBITUFDIGZlYXR1cmUsIHRoZSBzZXQgTUFDIGtleSB0byB0aGUgS0VZIG9mCisgICBLRVlMRU4gYnl0ZXMuICovCitnY3J5X2Vycm9yX3QgZ2NyeV9tZF9zZXRrZXkgKGdjcnlfbWRfaGRfdCBoZCwgY29uc3Qgdm9pZCAqa2V5LCBzaXplX3Qga2V5bGVuKTsKKworLyogU3RhcnQgb3Igc3RvcCBkZWJ1Z2dpbmcgZm9yIGRpZ2VzdCBoYW5kbGUgSEQ7IGkuZS4gY3JlYXRlIGEgZmlsZQorICAgbmFtZWQgZGJnbWQtPG4+LjxzdWZmaXg+IHdoaWxlIGhhc2hpbmcuICBJZiBTVUZGSVggaXMgTlVMTCwKKyAgIGRlYnVnZ2luZyBzdG9wcyBhbmQgdGhlIGZpbGUgd2lsbCBiZSBjbG9zZWQuICovCit2b2lkIGdjcnlfbWRfZGVidWcgKGdjcnlfbWRfaGRfdCBoZCwgY29uc3QgY2hhciAqc3VmZml4KTsKKworCisvKiBVcGRhdGUgdGhlIGhhc2gocykgb2YgSCB3aXRoIHRoZSBjaGFyYWN0ZXIgQy4gIFRoaXMgaXMgYSBidWZmZXJlZAorICAgdmVyc2lvbiBvZiB0aGUgZ2NyeV9tZF93cml0ZSBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgZ2NyeV9tZF9wdXRjKGgsYykgIFwKKyAgICAgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZ2NyeV9tZF9oZF90IGhfXyA9IChoKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmKCAoaF9fKS0+YnVmcG9zID09IChoX18pLT5idWZzaXplICkgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZ2NyeV9tZF93cml0ZSggKGhfXyksIE5VTEwsIDAgKTsgICAgICBcCisgICAgICAgICAgICAgICAgKGhfXyktPmJ1ZlsoaF9fKS0+YnVmcG9zKytdID0gKGMpICYgMHhmZjsgXAorICAgICAgICAgICAgfSB3aGlsZSgwKQorCisvKiBGaW5hbGl6ZSB0aGUgZGlnZXN0IGNhbGN1bGF0aW9uLiAgVGhpcyBpcyBub3QgcmVhbGx5IG5lZWRlZCBiZWNhdXNlCisgICBnY3J5X21kX3JlYWQoKSBkb2VzIHRoaXMgaW1wbGljaXRseS4gKi8KKyNkZWZpbmUgZ2NyeV9tZF9maW5hbChhKSBcCisgICAgICAgICAgICBnY3J5X21kX2N0bCAoKGEpLCBHQ1JZQ1RMX0ZJTkFMSVpFLCBOVUxMLCAwKQorCisvKiBSZXR1cm4gMCBpZiB0aGUgYWxnb3JpdGhtIEEgaXMgYXZhaWxhYmxlIGZvciB1c2UuICovCisjZGVmaW5lIGdjcnlfbWRfdGVzdF9hbGdvKGEpIFwKKyAgICAgICAgICAgIGdjcnlfbWRfYWxnb19pbmZvKCAoYSksIEdDUllDVExfVEVTVF9BTEdPLCBOVUxMLCBOVUxMICkKKworLyogUmV0dXJuIGFuIERFUiBlbmNvZGVkIEFTTi4xIE9JRCBmb3IgdGhlIGFsZ29yaXRobSBBIGluIGJ1ZmZlciBCLiBOCisgICBtdXN0IHBvaW50IHRvIHNpemVfdCB2YXJpYWJsZSB3aXRoIHRoZSBhdmFpbGFibGUgc2l6ZSBvZiBidWZmZXIgQi4KKyAgIEFmdGVyIHJldHVybiBpdCB3aWxsIHJlY2VpdmUgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSByZXR1cm5lZAorICAgT0lELiAqLworI2RlZmluZSBnY3J5X21kX2dldF9hc25vaWQoYSxiLG4pIFwKKyAgICAgICAgICAgIGdjcnlfbWRfYWxnb19pbmZvKChhKSwgR0NSWUNUTF9HRVRfQVNOT0lELCAoYiksIChuKSkKKworLyogRW5hYmxlIGRlYnVnZ2luZyBmb3IgZGlnZXN0IG9iamVjdCBBOyBpLmUuIGNyZWF0ZSBmaWxlcyBuYW1lZAorICAgZGJnbWQtPG4+LjxzdHJpbmc+IHdoaWxlIGhhc2hpbmcuICBCIGlzIGEgc3RyaW5nIHVzZWQgYXMgdGhlIHN1ZmZpeAorICAgZm9yIHRoZSBmaWxlbmFtZS4gIFRoaXMgbWFjcm8gaXMgZGVwcmVjYXRlZCwgdXNlIGdjcnlfbWRfZGVidWcuICovCisjaWZuZGVmIEdDUllQVF9OT19ERVBSRUNBVEVECisjZGVmaW5lIGdjcnlfbWRfc3RhcnRfZGVidWcoYSxiKSBcCisgICAgICAgICAgICBnY3J5X21kX2N0bCggKGEpLCBHQ1JZQ1RMX1NUQVJUX0RVTVAsIChiKSwgMCApCisKKy8qIERpc2FibGUgdGhlIGRlYnVnZ2luZyBvZiBBLiAgVGhpcyBtYWNybyBpcyBkZXByZWNhdGVkLCB1c2UKKyAgIGdjcnlfbWRfZGVidWcuICAqLworI2RlZmluZSBnY3J5X21kX3N0b3BfZGVidWcoYSxiKSBcCisgICAgICAgICAgICBnY3J5X21kX2N0bCggKGEpLCBHQ1JZQ1RMX1NUT1BfRFVNUCwgKGIpLCAwICkKKyNlbmRpZgorCisvKiBHZXQgYSBsaXN0IGNvbnNpc3Rpbmcgb2YgdGhlIElEcyBvZiB0aGUgbG9hZGVkIG1lc3NhZ2UgZGlnZXN0CisgICBtb2R1bGVzLiAgSWYgTElTVCBpcyB6ZXJvLCB3cml0ZSB0aGUgbnVtYmVyIG9mIGxvYWRlZCBtZXNzYWdlCisgICBkaWdlc3QgbW9kdWxlcyB0byBMSVNUX0xFTkdUSCBhbmQgcmV0dXJuLiAgSWYgTElTVCBpcyBub24temVybywgdGhlCisgICBmaXJzdCAqTElTVF9MRU5HVEggYWxnb3JpdGhtIElEcyBhcmUgc3RvcmVkIGluIExJU1QsIHdoaWNoIG11c3QgYmUKKyAgIG9mIGFjY29yZGluZyBzaXplLiAgSW4gY2FzZSB0aGVyZSBhcmUgbGVzcyBtZXNzYWdlIGRpZ2VzdCBtb2R1bGVzCisgICB0aGFuICpMSVNUX0xFTkdUSCwgKkxJU1RfTEVOR1RIIGlzIHVwZGF0ZWQgdG8gdGhlIGNvcnJlY3QKKyAgIG51bWJlci4gICovCitnY3J5X2Vycm9yX3QgZ2NyeV9tZF9saXN0IChpbnQgKmxpc3QsIGludCAqbGlzdF9sZW5ndGgpOworCisMCisKKy8qIEFsdGVybmF0aXZlIGludGVyZmFjZSBmb3IgYXN5bW1ldHJpYyBjcnlwdG9ncmFwaHkuICBUaGlzIGludGVyZmFjZQorICAgaXMgZGVwcmVjYXRlZC4gICovCisKKy8qIFRoZSBhbGdvcml0aG0gSURzLiAqLwordHlwZWRlZiBlbnVtIGdjcnlfYWNfaWQKKyAgeworICAgIEdDUllfQUNfUlNBID0gMSwKKyAgICBHQ1JZX0FDX0RTQSA9IDE3LAorICAgIEdDUllfQUNfRUxHID0gMjAsCisgICAgR0NSWV9BQ19FTEdfRSA9IDE2CisgIH0KK2djcnlfYWNfaWRfdDsKKworLyogS2V5IHR5cGVzLiAgKi8KK3R5cGVkZWYgZW51bSBnY3J5X2FjX2tleV90eXBlCisgIHsKKyAgICBHQ1JZX0FDX0tFWV9TRUNSRVQsCisgICAgR0NSWV9BQ19LRVlfUFVCTElDCisgIH0KK2djcnlfYWNfa2V5X3R5cGVfdDsKKworLyogRW5jb2RpbmcgbWV0aG9kcy4gICovCit0eXBlZGVmIGVudW0gZ2NyeV9hY19lbQorICB7CisgICAgR0NSWV9BQ19FTUVfUEtDU19WMV81LAorICAgIEdDUllfQUNfRU1TQV9QS0NTX1YxXzUKKyAgfQorZ2NyeV9hY19lbV90OworCisvKiBFbmNyeXB0aW9uIGFuZCBTaWduYXR1cmUgc2NoZW1lcy4gICovCit0eXBlZGVmIGVudW0gZ2NyeV9hY19zY2hlbWUKKyAgeworICAgIEdDUllfQUNfRVNfUEtDU19WMV81LAorICAgIEdDUllfQUNfU1NBX1BLQ1NfVjFfNQorICB9CitnY3J5X2FjX3NjaGVtZV90OworCisvKiBBQyBkYXRhLiAgKi8KKyNkZWZpbmUgR0NSWV9BQ19GTEFHX0RFQUxMT0MgICAgICgxIDw8IDApCisjZGVmaW5lIEdDUllfQUNfRkxBR19DT1BZICAgICAgICAoMSA8PCAxKQorI2RlZmluZSBHQ1JZX0FDX0ZMQUdfTk9fQkxJTkRJTkcgKDEgPDwgMikKKworLyogVGhpcyB0eXBlIHJlcHJlc2VudHMgYSBgZGF0YSBzZXQnLiAgKi8KK3R5cGVkZWYgc3RydWN0IGdjcnlfYWNfZGF0YSAqZ2NyeV9hY19kYXRhX3Q7CisKKy8qIFRoaXMgdHlwZSByZXByZXNlbnRzIGEgc2luZ2xlIGBrZXknLCBlaXRoZXIgYSBzZWNyZXQgb25lIG9yIGEKKyAgIHB1YmxpYyBvbmUuICAqLwordHlwZWRlZiBzdHJ1Y3QgZ2NyeV9hY19rZXkgKmdjcnlfYWNfa2V5X3Q7CisKKy8qIFRoaXMgdHlwZSByZXByZXNlbnRzIGEgYGtleSBwYWlyJyBjb250YWluaW5nIGEgc2VjcmV0IGFuZCBhIHB1YmxpYworICAga2V5LiAgKi8KK3R5cGVkZWYgc3RydWN0IGdjcnlfYWNfa2V5X3BhaXIgKmdjcnlfYWNfa2V5X3BhaXJfdDsKKworLyogVGhpcyB0eXBlIHJlcHJlc2VudHMgYSBgaGFuZGxlJyB0aGF0IGlzIG5lZWRlZCBieSBmdW5jdGlvbnMKKyAgIHBlcmZvcm1pbmcgY3J5cHRvZ3JhcGhpYyBvcGVyYXRpb25zLiAgKi8KK3R5cGVkZWYgc3RydWN0IGdjcnlfYWNfaGFuZGxlICpnY3J5X2FjX2hhbmRsZV90OworCit0eXBlZGVmIGdwZ19lcnJvcl90ICgqZ2NyeV9hY19kYXRhX3JlYWRfY2JfdCkgKHZvaWQgKm9wYXF1ZSwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwKKwkJCQkJICAgICAgIHNpemVfdCAqYnVmZmVyX24pOworCit0eXBlZGVmIGdwZ19lcnJvcl90ICgqZ2NyeV9hY19kYXRhX3dyaXRlX2NiX3QpICh2b2lkICpvcGFxdWUsCisJCQkJCQl1bnNpZ25lZCBjaGFyICpidWZmZXIsCisJCQkJCQlzaXplX3QgYnVmZmVyX24pOworCit0eXBlZGVmIGVudW0KKyAgeworICAgIEdDUllfQUNfSU9fUkVBREFCTEUsCisgICAgR0NSWV9BQ19JT19XUklUQUJMRQorICB9CitnY3J5X2FjX2lvX21vZGVfdDsKKwordHlwZWRlZiBlbnVtCisgIHsKKyAgICBHQ1JZX0FDX0lPX1NUUklORywKKyAgICBHQ1JZX0FDX0lPX0NBTExCQUNLCisgIH0KK2djcnlfYWNfaW9fdHlwZV90OworCit0eXBlZGVmIHN0cnVjdCBnY3J5X2FjX2lvCit7CisgIC8qIFRoaXMgaXMgYW4gSU5URVJOQUwgc3RydWN0dXJlLCBkbyBOT1QgdXNlIG1hbnVhbGx5LiAgKi8KKyAgZ2NyeV9hY19pb19tb2RlX3QgbW9kZSBfR0NSWV9BVFRSX0lOVEVSTkFMOworICBnY3J5X2FjX2lvX3R5cGVfdCB0eXBlIF9HQ1JZX0FUVFJfSU5URVJOQUw7CisgIHVuaW9uCisgIHsKKyAgICB1bmlvbgorICAgIHsKKyAgICAgIHN0cnVjdAorICAgICAgeworCWdjcnlfYWNfZGF0YV9yZWFkX2NiX3QgY2I7CisJdm9pZCAqb3BhcXVlOworICAgICAgfSBjYWxsYmFjazsKKyAgICAgIHN0cnVjdAorICAgICAgeworCXVuc2lnbmVkIGNoYXIgKmRhdGE7CisJc2l6ZV90IGRhdGFfbjsKKyAgICAgIH0gc3RyaW5nOworICAgICAgdm9pZCAqb3BhcXVlOworICAgIH0gcmVhZGFibGU7CisgICAgdW5pb24KKyAgICB7CisgICAgICBzdHJ1Y3QKKyAgICAgIHsKKwlnY3J5X2FjX2RhdGFfd3JpdGVfY2JfdCBjYjsKKwl2b2lkICpvcGFxdWU7CisgICAgICB9IGNhbGxiYWNrOworICAgICAgc3RydWN0CisgICAgICB7CisJdW5zaWduZWQgY2hhciAqKmRhdGE7CisJc2l6ZV90ICpkYXRhX247CisgICAgICB9IHN0cmluZzsKKyAgICAgIHZvaWQgKm9wYXF1ZTsKKyAgICB9IHdyaXRhYmxlOworICB9IGlvIF9HQ1JZX0FUVFJfSU5URVJOQUw7Cit9CitnY3J5X2FjX2lvX3Q7CisKKy8qIFRoZSBjYWxsZXIgb2YgZ2NyeV9hY19rZXlfcGFpcl9nZW5lcmF0ZSBjYW4gcHJvdmlkZSBvbmUgb2YgdGhlc2UKKyAgIHN0cnVjdHVyZXMgaW4gb3JkZXIgdG8gaW5mbHVlbmNlIHRoZSBrZXkgZ2VuZXJhdGlvbiBwcm9jZXNzIGluIGFuCisgICBhbGdvcml0aG0tc3BlY2lmaWMgd2F5LiAgKi8KK3R5cGVkZWYgc3RydWN0IGdjcnlfYWNfa2V5X3NwZWNfcnNhCit7CisgIGdjcnlfbXBpX3QgZTsgICAgICAgICAgICAgICAgIC8qIEUgdG8gdXNlLiAgKi8KK30gZ2NyeV9hY19rZXlfc3BlY19yc2FfdDsKKworLyogU3RydWN0dXJlIHVzZWQgZm9yIHBhc3NpbmcgZGF0YSB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlCisgICBgRU1FLVBLQ1MtVjFfNScgZW5jb2RpbmcgbWV0aG9kLiAgKi8KK3R5cGVkZWYgc3RydWN0IGdjcnlfYWNfZW1lX3BrY3NfdjFfNQoreworICBzaXplX3Qga2V5X3NpemU7Cit9IGdjcnlfYWNfZW1lX3BrY3NfdjFfNV90OworCit0eXBlZGVmIGVudW0gZ2NyeV9tZF9hbGdvcyBnY3J5X21kX2FsZ29fdDsKKworLyogU3RydWN0dXJlIHVzZWQgZm9yIHBhc3NpbmcgZGF0YSB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlCisgICBgRU1TQS1QS0NTLVYxXzUnIGVuY29kaW5nIG1ldGhvZC4gICovCit0eXBlZGVmIHN0cnVjdCBnY3J5X2FjX2Vtc2FfcGtjc192MV81Cit7CisgIGdjcnlfbWRfYWxnb190IG1kOworICBzaXplX3QgZW1fbjsKK30gZ2NyeV9hY19lbXNhX3BrY3NfdjFfNV90OworCisvKiBTdHJ1Y3R1cmUgdXNlZCBmb3IgcGFzc2luZyBkYXRhIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKKyAgIGBTU0EtUEtDUy1WMV81JyBzaWduYXR1cmUgc2NoZW1lLiAgKi8KK3R5cGVkZWYgc3RydWN0IGdjcnlfYWNfc3NhX3BrY3NfdjFfNQoreworICBnY3J5X21kX2FsZ29fdCBtZDsKK30gZ2NyeV9hY19zc2FfcGtjc192MV81X3Q7CisKKy8qIFJldHVybnMgYSBuZXcsIGVtcHR5IGRhdGEgc2V0IGluIERBVEEuICAqLworZ2NyeV9lcnJvcl90IGdjcnlfYWNfZGF0YV9uZXcgKGdjcnlfYWNfZGF0YV90ICpkYXRhKTsKKworLyogRGVzdHJveSB0aGUgZGF0YSBzZXQgREFUQS4gICovCit2b2lkIGdjcnlfYWNfZGF0YV9kZXN0cm95IChnY3J5X2FjX2RhdGFfdCBkYXRhKTsKKworLyogQ3JlYXRlIGEgY29weSBvZiB0aGUgZGF0YSBzZXQgREFUQSBhbmQgc3RvcmUgaXQgaW4gREFUQV9DUC4gICovCitnY3J5X2Vycm9yX3QgZ2NyeV9hY19kYXRhX2NvcHkgKGdjcnlfYWNfZGF0YV90ICpkYXRhX2NwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfYWNfZGF0YV90IGRhdGEpOworCisvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBuYW1lZCBNUEkgdmFsdWVzIGluc2lkZSBvZiB0aGUgZGF0YSBzZXQKKyAgIERBVEEuICAqLwordW5zaWduZWQgaW50IGdjcnlfYWNfZGF0YV9sZW5ndGggKGdjcnlfYWNfZGF0YV90IGRhdGEpOworCisvKiBEZXN0cm95IGFueSB2YWx1ZXMgY29udGFpbmVkIGluIHRoZSBkYXRhIHNldCBEQVRBLiAgKi8KK3ZvaWQgZ2NyeV9hY19kYXRhX2NsZWFyIChnY3J5X2FjX2RhdGFfdCBkYXRhKTsKKworLyogQWRkIHRoZSB2YWx1ZSBNUEkgdG8gREFUQSB3aXRoIHRoZSBsYWJlbCBOQU1FLiAgSWYgRkxBR1MgY29udGFpbnMKKyAgIEdDUllfQUNfRkxBR19EQVRBX0NPUFksIHRoZSBkYXRhIHNldCB3aWxsIGNvbnRhaW4gY29waWVzIG9mIE5BTUUKKyAgIGFuZCBNUEkuICBJZiBGTEFHUyBjb250YWlucyBHQ1JZX0FDX0ZMQUdfREFUQV9ERUFMTE9DIG9yCisgICBHQ1JZX0FDX0ZMQUdfREFUQV9DT1BZLCB0aGUgdmFsdWVzIGNvbnRhaW5lZCBpbiB0aGUgZGF0YSBzZXQgd2lsbAorICAgYmUgZGVhbGxvY2F0ZWQgd2hlbiB0aGV5IGFyZSB0byBiZSByZW1vdmVkIGZyb20gdGhlIGRhdGEgc2V0LiAgKi8KK2djcnlfZXJyb3JfdCBnY3J5X2FjX2RhdGFfc2V0IChnY3J5X2FjX2RhdGFfdCBkYXRhLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgZ2NyeV9tcGlfdCBtcGkpOworCisvKiBTdG9yZSB0aGUgdmFsdWUgbGFiZWxsZWQgd2l0aCBOQU1FIGZvdW5kIGluIERBVEEgaW4gTVBJLiAgSWYgRkxBR1MKKyAgIGNvbnRhaW5zIEdDUllfQUNfRkxBR19DT1BZLCBzdG9yZSBhIGNvcHkgb2YgdGhlIE1QSSB2YWx1ZSBjb250YWluZWQKKyAgIGluIHRoZSBkYXRhIHNldC4gIE1QSSBtYXkgYmUgTlVMTC4gICovCitnY3J5X2Vycm9yX3QgZ2NyeV9hY19kYXRhX2dldF9uYW1lIChnY3J5X2FjX2RhdGFfdCBkYXRhLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBnY3J5X21waV90ICptcGkpOworCisvKiBTdG9yZXMgaW4gTkFNRSBhbmQgTVBJIHRoZSBuYW1lZCBNUEkgdmFsdWUgY29udGFpbmVkIGluIHRoZSBkYXRhCisgICBzZXQgREFUQSB3aXRoIHRoZSBpbmRleCBJRFguICBJZiBGTEFHUyBjb250YWlucyBHQ1JZX0FDX0ZMQUdfQ09QWSwKKyAgIHN0b3JlIGNvcGllcyBvZiB0aGUgdmFsdWVzIGNvbnRhaW5lZCBpbiB0aGUgZGF0YSBzZXQuIE5BTUUgb3IgTVBJCisgICBtYXkgYmUgTlVMTC4gICovCitnY3J5X2Vycm9yX3QgZ2NyeV9hY19kYXRhX2dldF9pbmRleCAoZ2NyeV9hY19kYXRhX3QgZGF0YSwgdW5zaWduZWQgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKm5hbWUsIGdjcnlfbXBpX3QgKm1waSk7CisKKy8qIENvbnZlcnQgdGhlIGRhdGEgc2V0IERBVEEgaW50byBhIG5ldyBTLUV4cHJlc3Npb24sIHdoaWNoIGlzIHRvIGJlCisgICBzdG9yZWQgaW4gU0VYUCwgYWNjb3JkaW5nIHRvIHRoZSBpZGVudGlmaWVycyBjb250YWluZWQgaW4KKyAgIElERU5USUZJRVJTLiAgKi8KK2djcnlfZXJyb3JfdCBnY3J5X2FjX2RhdGFfdG9fc2V4cCAoZ2NyeV9hY19kYXRhX3QgZGF0YSwgZ2NyeV9zZXhwX3QgKnNleHAsCisJCQkJICAgY29uc3QgY2hhciAqKmlkZW50aWZpZXJzKTsKKworLyogQ3JlYXRlIGEgbmV3IGRhdGEgc2V0LCB3aGljaCBpcyB0byBiZSBzdG9yZWQgaW4gREFUQV9TRVQsIGZyb20gdGhlCisgICBTLUV4cHJlc3Npb24gU0VYUCwgYWNjb3JkaW5nIHRvIHRoZSBpZGVudGlmaWVycyBjb250YWluZWQgaW4KKyAgIElERU5USUZJRVJTLiAgKi8KK2djcnlfZXJyb3JfdCBnY3J5X2FjX2RhdGFfZnJvbV9zZXhwIChnY3J5X2FjX2RhdGFfdCAqZGF0YSwgZ2NyeV9zZXhwX3Qgc2V4cCwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKippZGVudGlmaWVycyk7CisKKy8qIEluaXRpYWxpemUgQUNfSU8gYWNjb3JkaW5nIHRvIE1PREUsIFRZUEUgYW5kIHRoZSB2YXJpYWJsZSBsaXN0IG9mCisgICBhcmd1bWVudHMuICBUaGUgbGlzdCBvZiB2YXJpYWJsZSBhcmd1bWVudHMgdG8gc3BlY2lmeSBkZXBlbmRzIG9uCisgICB0aGUgZ2l2ZW4gVFlQRS4gICovCit2b2lkIGdjcnlfYWNfaW9faW5pdCAoZ2NyeV9hY19pb190ICphY19pbywgZ2NyeV9hY19pb19tb2RlX3QgbW9kZSwKKwkJICAgICAgZ2NyeV9hY19pb190eXBlX3QgdHlwZSwgLi4uKTsKKworLyogSW5pdGlhbGl6ZSBBQ19JTyBhY2NvcmRpbmcgdG8gTU9ERSwgVFlQRSBhbmQgdGhlIHZhcmlhYmxlIGxpc3Qgb2YKKyAgIGFyZ3VtZW50cyBBUC4gIFRoZSBsaXN0IG9mIHZhcmlhYmxlIGFyZ3VtZW50cyB0byBzcGVjaWZ5IGRlcGVuZHMgb24KKyAgIHRoZSBnaXZlbiBUWVBFLiAgKi8KK3ZvaWQgZ2NyeV9hY19pb19pbml0X3ZhIChnY3J5X2FjX2lvX3QgKmFjX2lvLCBnY3J5X2FjX2lvX21vZGVfdCBtb2RlLAorCQkJIGdjcnlfYWNfaW9fdHlwZV90IHR5cGUsIHZhX2xpc3QgYXApOworCisvKiBDcmVhdGUgYSBuZXcgYWMgaGFuZGxlLiAgKi8KK2djcnlfZXJyb3JfdCBnY3J5X2FjX29wZW4gKGdjcnlfYWNfaGFuZGxlX3QgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfYWNfaWRfdCBhbGdvcml0aG0sIHVuc2lnbmVkIGludCBmbGFncyk7CisKKy8qIERlc3Ryb3kgYW4gYWMgaGFuZGxlLiAgKi8KK3ZvaWQgZ2NyeV9hY19jbG9zZSAoZ2NyeV9hY19oYW5kbGVfdCBoYW5kbGUpOworCisvKiBJbml0aWFsaXplIGEga2V5IGZyb20gYSBnaXZlbiBkYXRhIHNldC4gICovCitnY3J5X2Vycm9yX3QgZ2NyeV9hY19rZXlfaW5pdCAoZ2NyeV9hY19rZXlfdCAqa2V5LCBnY3J5X2FjX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X2FjX2tleV90eXBlX3QgdHlwZSwgZ2NyeV9hY19kYXRhX3QgZGF0YSk7CisKKy8qIEdlbmVyYXRlcyBhIG5ldyBrZXkgcGFpciB2aWEgdGhlIGhhbmRsZSBIQU5ETEUgb2YgTkJJVFMgYml0cyBhbmQKKyAgIHN0b3JlcyBpdCBpbiBLRVlfUEFJUi4gIEluIGNhc2Ugbm9uLXN0YW5kYXJkIHNldHRpbmdzIGFyZSB3YW50ZWQsIGEKKyAgIHBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUgb2YgdHlwZSBnY3J5X2FjX2tleV9zcGVjXzxhbGdvcml0aG0+X3QsCisgICBtYXRjaGluZyB0aGUgc2VsZWN0ZWQgYWxnb3JpdGhtLCBjYW4gYmUgZ2l2ZW4gYXMgS0VZX1NQRUMuCisgICBNSVNDX0RBVEEgaXMgbm90IHVzZWQgeWV0LiAgKi8KK2djcnlfZXJyb3JfdCBnY3J5X2FjX2tleV9wYWlyX2dlbmVyYXRlIChnY3J5X2FjX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbmJpdHMsIHZvaWQgKnNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NyeV9hY19rZXlfcGFpcl90ICprZXlfcGFpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X21waV90ICoqbWlzY19kYXRhKTsKKworLyogUmV0dXJucyB0aGUga2V5IG9mIHR5cGUgV0hJQ0ggb3V0IG9mIHRoZSBrZXkgcGFpciBLRVlfUEFJUi4gICovCitnY3J5X2FjX2tleV90IGdjcnlfYWNfa2V5X3BhaXJfZXh0cmFjdCAoZ2NyeV9hY19rZXlfcGFpcl90IGtleV9wYWlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfYWNfa2V5X3R5cGVfdCB3aGljaCk7CisKKy8qIFJldHVybnMgdGhlIGRhdGEgc2V0IGNvbnRhaW5lZCBpbiB0aGUga2V5IEtFWS4gICovCitnY3J5X2FjX2RhdGFfdCBnY3J5X2FjX2tleV9kYXRhX2dldCAoZ2NyeV9hY19rZXlfdCBrZXkpOworCisvKiBWZXJpZmllcyB0aGF0IHRoZSBrZXkgS0VZIGlzIHNhbmUgdmlhIEhBTkRMRS4gICovCitnY3J5X2Vycm9yX3QgZ2NyeV9hY19rZXlfdGVzdCAoZ2NyeV9hY19oYW5kbGVfdCBoYW5kbGUsIGdjcnlfYWNfa2V5X3Qga2V5KTsKKworLyogU3RvcmVzIHRoZSBudW1iZXIgb2YgYml0cyBvZiB0aGUga2V5IEtFWSBpbiBOQklUUyB2aWEgSEFORExFLiAgKi8KK2djcnlfZXJyb3JfdCBnY3J5X2FjX2tleV9nZXRfbmJpdHMgKGdjcnlfYWNfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NyeV9hY19rZXlfdCBrZXksIHVuc2lnbmVkIGludCAqbmJpdHMpOworCisvKiBXcml0ZXMgdGhlIDIwIGJ5dGUgbG9uZyBrZXkgZ3JpcCBvZiB0aGUga2V5IEtFWSB0byBLRVlfR1JJUCB2aWEKKyAgIEhBTkRMRS4gICovCitnY3J5X2Vycm9yX3QgZ2NyeV9hY19rZXlfZ2V0X2dyaXAgKGdjcnlfYWNfaGFuZGxlX3QgaGFuZGxlLCBnY3J5X2FjX2tleV90IGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqa2V5X2dyaXApOworCisvKiBEZXN0cm95IGEga2V5LiAgKi8KK3ZvaWQgZ2NyeV9hY19rZXlfZGVzdHJveSAoZ2NyeV9hY19rZXlfdCBrZXkpOworCisvKiBEZXN0cm95IGEga2V5IHBhaXIuICAqLwordm9pZCBnY3J5X2FjX2tleV9wYWlyX2Rlc3Ryb3kgKGdjcnlfYWNfa2V5X3BhaXJfdCBrZXlfcGFpcik7CisKKy8qIEVuY29kZXMgYSBtZXNzYWdlIGFjY29yZGluZyB0byB0aGUgZW5jb2RpbmcgbWV0aG9kIE1FVEhPRC4gIE9QVElPTlMKKyAgIG11c3QgYmUgYSBwb2ludGVyIHRvIGEgbWV0aG9kLXNwZWNpZmljIHN0cnVjdHVyZQorICAgKGdjcnlfYWNfZW0qX3QpLiAgKi8KK2djcnlfZXJyb3JfdCBnY3J5X2FjX2RhdGFfZW5jb2RlIChnY3J5X2FjX2VtX3QgbWV0aG9kLAorCQkJCSAgdW5zaWduZWQgaW50IGZsYWdzLCB2b2lkICpvcHRpb25zLAorCQkJCSAgZ2NyeV9hY19pb190ICppb19yZWFkLAorCQkJCSAgZ2NyeV9hY19pb190ICppb193cml0ZSk7CisKKy8qIERlY29kZXMgYSBtZXNzYWdlIGFjY29yZGluZyB0byB0aGUgZW5jb2RpbmcgbWV0aG9kIE1FVEhPRC4gIE9QVElPTlMKKyAgIG11c3QgYmUgYSBwb2ludGVyIHRvIGEgbWV0aG9kLXNwZWNpZmljIHN0cnVjdHVyZQorICAgKGdjcnlfYWNfZW0qX3QpLiAgKi8KK2djcnlfZXJyb3JfdCBnY3J5X2FjX2RhdGFfZGVjb2RlIChnY3J5X2FjX2VtX3QgbWV0aG9kLAorCQkJCSAgdW5zaWduZWQgaW50IGZsYWdzLCB2b2lkICpvcHRpb25zLAorCQkJCSAgZ2NyeV9hY19pb190ICppb19yZWFkLAorCQkJCSAgZ2NyeV9hY19pb190ICppb193cml0ZSk7CisKKy8qIEVuY3J5cHQgdGhlIHBsYWluIHRleHQgTVBJIHZhbHVlIERBVEFfUExBSU4gd2l0aCB0aGUga2V5IEtFWSB1bmRlcgorICAgdGhlIGNvbnRyb2wgb2YgdGhlIGZsYWdzIEZMQUdTIGFuZCBzdG9yZSB0aGUgcmVzdWx0aW5nIGRhdGEgc2V0CisgICBpbnRvIERBVEFfRU5DUllQVEVELiAgKi8KK2djcnlfZXJyb3JfdCBnY3J5X2FjX2RhdGFfZW5jcnlwdCAoZ2NyeV9hY19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NyeV9hY19rZXlfdCBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfbXBpX3QgZGF0YV9wbGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NyeV9hY19kYXRhX3QgKmRhdGFfZW5jcnlwdGVkKTsKKworLyogRGVjcnlwdCB0aGUgZGVjcnlwdGVkIGRhdGEgY29udGFpbmVkIGluIHRoZSBkYXRhIHNldCBEQVRBX0VOQ1JZUFRFRAorICAgd2l0aCB0aGUga2V5IEtFWSB1bmRlciB0aGUgY29udHJvbCBvZiB0aGUgZmxhZ3MgRkxBR1MgYW5kIHN0b3JlIHRoZQorICAgcmVzdWx0aW5nIHBsYWluIHRleHQgTVBJIHZhbHVlIGluIERBVEFfUExBSU4uICAqLworZ2NyeV9lcnJvcl90IGdjcnlfYWNfZGF0YV9kZWNyeXB0IChnY3J5X2FjX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X2FjX2tleV90IGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NyeV9tcGlfdCAqZGF0YV9wbGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NyeV9hY19kYXRhX3QgZGF0YV9lbmNyeXB0ZWQpOworCisvKiBTaWduIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiBEQVRBIHdpdGggdGhlIGtleSBLRVkgYW5kIHN0b3JlIHRoZQorICAgcmVzdWx0aW5nIHNpZ25hdHVyZSBpbiB0aGUgZGF0YSBzZXQgREFUQV9TSUdOQVRVUkUuICAqLworZ2NyeV9lcnJvcl90IGdjcnlfYWNfZGF0YV9zaWduIChnY3J5X2FjX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NyeV9hY19rZXlfdCBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfbXBpX3QgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NyeV9hY19kYXRhX3QgKmRhdGFfc2lnbmF0dXJlKTsKKworLyogVmVyaWZ5IHRoYXQgdGhlIHNpZ25hdHVyZSBjb250YWluZWQgaW4gdGhlIGRhdGEgc2V0IERBVEFfU0lHTkFUVVJFCisgICBpcyBpbmRlZWQgdGhlIHJlc3VsdCBvZiBzaWduaW5nIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiBEQVRBIHdpdGggdGhlCisgICBzZWNyZXQga2V5IGJlbG9uZ2luZyB0byB0aGUgcHVibGljIGtleSBLRVkuICAqLworZ2NyeV9lcnJvcl90IGdjcnlfYWNfZGF0YV92ZXJpZnkgKGdjcnlfYWNfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfYWNfa2V5X3Qga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfbXBpX3QgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X2FjX2RhdGFfdCBkYXRhX3NpZ25hdHVyZSk7CisKKy8qIEVuY3J5cHRzIHRoZSBwbGFpbiB0ZXh0IHJlYWRhYmxlIGZyb20gSU9fTUVTU0FHRSB0aHJvdWdoIEhBTkRMRQorICAgd2l0aCB0aGUgcHVibGljIGtleSBLRVkgYWNjb3JkaW5nIHRvIFNDSEVNRSwgRkxBR1MgYW5kIE9QVFMuICBJZgorICAgT1BUUyBpcyBub3QgTlVMTCwgaXQgaGFzIHRvIGJlIGEgcG9pbnRlciB0byBhIHN0cnVjdHVyZSBzcGVjaWZpYyB0bworICAgdGhlIGNob3NlbiBzY2hlbWUgKGdjcnlfYWNfZXNfKl90KS4gIFRoZSBlbmNyeXB0ZWQgbWVzc2FnZSBpcworICAgd3JpdHRlbiB0byBJT19DSVBIRVIuICovCitnY3J5X2Vycm9yX3QgZ2NyeV9hY19kYXRhX2VuY3J5cHRfc2NoZW1lIChnY3J5X2FjX2hhbmRsZV90IGhhbmRsZSwKKwkJCQkJICBnY3J5X2FjX3NjaGVtZV90IHNjaGVtZSwKKwkJCQkJICB1bnNpZ25lZCBpbnQgZmxhZ3MsIHZvaWQgKm9wdHMsCisJCQkJCSAgZ2NyeV9hY19rZXlfdCBrZXksCisJCQkJCSAgZ2NyeV9hY19pb190ICppb19tZXNzYWdlLAorCQkJCQkgIGdjcnlfYWNfaW9fdCAqaW9fY2lwaGVyKTsKKworLyogRGVjcnlwdHMgdGhlIGNpcGhlciB0ZXh0IHJlYWRhYmxlIGZyb20gSU9fQ0lQSEVSIHRocm91Z2ggSEFORExFCisgICB3aXRoIHRoZSBzZWNyZXQga2V5IEtFWSBhY2NvcmRpbmcgdG8gU0NIRU1FLCBAdmFye2ZsYWdzfSBhbmQgT1BUUy4KKyAgIElmIE9QVFMgaXMgbm90IE5VTEwsIGl0IGhhcyB0byBiZSBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUgc3BlY2lmaWMKKyAgIHRvIHRoZSBjaG9zZW4gc2NoZW1lIChnY3J5X2FjX2VzXypfdCkuICBUaGUgZGVjcnlwdGVkIG1lc3NhZ2UgaXMKKyAgIHdyaXR0ZW4gdG8gSU9fTUVTU0FHRS4gICovCitnY3J5X2Vycm9yX3QgZ2NyeV9hY19kYXRhX2RlY3J5cHRfc2NoZW1lIChnY3J5X2FjX2hhbmRsZV90IGhhbmRsZSwKKwkJCQkJICBnY3J5X2FjX3NjaGVtZV90IHNjaGVtZSwKKwkJCQkJICB1bnNpZ25lZCBpbnQgZmxhZ3MsIHZvaWQgKm9wdHMsCisJCQkJCSAgZ2NyeV9hY19rZXlfdCBrZXksCisJCQkJCSAgZ2NyeV9hY19pb190ICppb19jaXBoZXIsCisJCQkJCSAgZ2NyeV9hY19pb190ICppb19tZXNzYWdlKTsKKworLyogU2lnbnMgdGhlIG1lc3NhZ2UgcmVhZGFibGUgZnJvbSBJT19NRVNTQUdFIHRocm91Z2ggSEFORExFIHdpdGggdGhlCisgICBzZWNyZXQga2V5IEtFWSBhY2NvcmRpbmcgdG8gU0NIRU1FLCBGTEFHUyBhbmQgT1BUUy4gIElmIE9QVFMgaXMgbm90CisgICBOVUxMLCBpdCBoYXMgdG8gYmUgYSBwb2ludGVyIHRvIGEgc3RydWN0dXJlIHNwZWNpZmljIHRvIHRoZSBjaG9zZW4KKyAgIHNjaGVtZSAoZ2NyeV9hY19zc2FfKl90KS4gIFRoZSBzaWduYXR1cmUgaXMgd3JpdHRlbiB0bworICAgSU9fU0lHTkFUVVJFLiAgKi8KK2djcnlfZXJyb3JfdCBnY3J5X2FjX2RhdGFfc2lnbl9zY2hlbWUgKGdjcnlfYWNfaGFuZGxlX3QgaGFuZGxlLAorCQkJCSAgICAgICBnY3J5X2FjX3NjaGVtZV90IHNjaGVtZSwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IGZsYWdzLCB2b2lkICpvcHRzLAorCQkJCSAgICAgICBnY3J5X2FjX2tleV90IGtleSwKKwkJCQkgICAgICAgZ2NyeV9hY19pb190ICppb19tZXNzYWdlLAorCQkJCSAgICAgICBnY3J5X2FjX2lvX3QgKmlvX3NpZ25hdHVyZSk7CisKKy8qIFZlcmlmaWVzIHRocm91Z2ggSEFORExFIHRoYXQgdGhlIHNpZ25hdHVyZSByZWFkYWJsZSBmcm9tCisgICBJT19TSUdOQVRVUkUgaXMgaW5kZWVkIHRoZSByZXN1bHQgb2Ygc2lnbmluZyB0aGUgbWVzc2FnZSByZWFkYWJsZQorICAgZnJvbSBJT19NRVNTQUdFIHdpdGggdGhlIHNlY3JldCBrZXkgYmVsb25naW5nIHRvIHRoZSBwdWJsaWMga2V5IEtFWQorICAgYWNjb3JkaW5nIHRvIFNDSEVNRSBhbmQgT1BUUy4gIElmIE9QVFMgaXMgbm90IE5VTEwsIGl0IGhhcyB0byBiZSBhbgorICAgYW5vbnltb3VzIHN0cnVjdHVyZSAoZ2NyeV9hY19zc2FfKl90KSBzcGVjaWZpYyB0byB0aGUgY2hvc2VuCisgICBzY2hlbWUuICAqLworZ2NyeV9lcnJvcl90IGdjcnlfYWNfZGF0YV92ZXJpZnlfc2NoZW1lIChnY3J5X2FjX2hhbmRsZV90IGhhbmRsZSwKKwkJCQkJIGdjcnlfYWNfc2NoZW1lX3Qgc2NoZW1lLAorCQkJCQkgdW5zaWduZWQgaW50IGZsYWdzLCB2b2lkICpvcHRzLAorCQkJCQkgZ2NyeV9hY19rZXlfdCBrZXksCisJCQkJCSBnY3J5X2FjX2lvX3QgKmlvX21lc3NhZ2UsCisJCQkJCSBnY3J5X2FjX2lvX3QgKmlvX3NpZ25hdHVyZSk7CisKKy8qIFN0b3JlIHRoZSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhbGdvcml0aG0gd2hvc2UgaWQgaXMgZ2l2ZW4KKyAgIGluIEFMR09SSVRITSBpbiBOQU1FLiAgVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkOyB1c2UKKyAgIGdjcnlfcGtfYWxnb19uYW1lLiAqLworI2lmbmRlZiBHQ1JZUFRfTk9fREVQUkVDQVRFRAorZ2NyeV9lcnJvcl90IGdjcnlfYWNfaWRfdG9fbmFtZSAoZ2NyeV9hY19pZF90IGFsZ29yaXRobSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipuYW1lKSAKKyAgICAgLyogKi8gICAgICAgICAgICAgICAgICAgICAgX0dDUllfR0NDX0FUVFJfREVQUkVDQVRFRDsKKy8qIFN0b3JlIHRoZSBudW1lcmljIElEIG9mIHRoZSBhbGdvcml0aG0gd2hvc2UgdGV4dHVhbCByZXByZXNlbnRhdGlvbgorICAgaXMgY29udGFpbmVkIGluIE5BTUUgaW4gQUxHT1JJVEhNLiAgVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkOworICAgdXNlIGdjcnlfcGtfbWFwX25hbWUuICovCitnY3J5X2Vycm9yX3QgZ2NyeV9hY19uYW1lX3RvX2lkIChjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NyeV9hY19pZF90ICphbGdvcml0aG0pCisgICAgIC8qICovICAgICAgICAgICAgICAgICAgICAgIF9HQ1JZX0dDQ19BVFRSX0RFUFJFQ0FURUQ7CisjZW5kaWYKKworDAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBSYW5kb20gR2VuZXJhdGluZyBGdW5jdGlvbnMgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhlIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIHJhbmRvbSBxdWFsaXR5LiAgVGhlIHJ1bGUgb2YgdGh1bWIgaXMKKyAgIHRvIHVzZSBTVFJPTkcgZm9yIHNlc3Npb24ga2V5cyBhbmQgVkVSWV9TVFJPTkcgZm9yIGtleSBtYXRlcmlhbC4KKyAgIFdFQUsgaXMgdXN1YWxseSBhbiBhbGlhcyBmb3IgU1RST05HIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYW55bW9yZQorICAgKGV4Y2VwdCB3aXRoIGdjcnlfbXBpX3JhbmRvbWl6ZSk7IHVzZSBnY3J5X2NyZWF0ZV9ub25jZSBpbnN0ZWFkLiAqLwordHlwZWRlZiBlbnVtIGdjcnlfcmFuZG9tX2xldmVsCisgIHsKKyAgICBHQ1JZX1dFQUtfUkFORE9NID0gMCwKKyAgICBHQ1JZX1NUUk9OR19SQU5ET00gPSAxLAorICAgIEdDUllfVkVSWV9TVFJPTkdfUkFORE9NID0gMgorICB9CitnY3J5X3JhbmRvbV9sZXZlbF90OworCisvKiBGaWxsIEJVRkZFUiB3aXRoIExFTkdUSCBieXRlcyBvZiByYW5kb20sIHVzaW5nIHJhbmRvbSBudW1iZXJzIG9mCisgICBxdWFsaXR5IExFVkVMLiAqLwordm9pZCBnY3J5X3JhbmRvbWl6ZSAodm9pZCAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgZW51bSBnY3J5X3JhbmRvbV9sZXZlbCBsZXZlbCk7CisKKy8qIEFkZCB0aGUgZXh0ZXJuYWwgcmFuZG9tIGZyb20gQlVGRkVSIHdpdGggTEVOR1RIIGJ5dGVzIGludG8gdGhlCisgICBwb29sLiBRVUFMSVRZIHNob3VsZCBlaXRoZXIgYmUgLTEgZm9yIHVua25vd24gb3IgaW4gdGhlIHJhbmdlIG9mIDAKKyAgIHRvIDEwMCAqLworZ2NyeV9lcnJvcl90IGdjcnlfcmFuZG9tX2FkZF9ieXRlcyAoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHF1YWxpdHkpOworCisvKiBJZiByYW5kb20gbnVtYmVycyBhcmUgdXNlZCBpbiBhbiBhcHBsaWNhdGlvbiwgdGhpcyBtYWNybyBzaG91bGQgYmUKKyAgIGNhbGxlZCBmcm9tIHRpbWUgdG8gdGltZSBzbyB0aGF0IG5ldyBzdHVmZiBnZXRzIGFkZGVkIHRvIHRoZQorICAgaW50ZXJuYWwgcG9vbCBvZiB0aGUgUk5HLiAgKi8KKyNkZWZpbmUgZ2NyeV9mYXN0X3JhbmRvbV9wb2xsKCkgIGdjcnlfY29udHJvbCAoR0NSWUNUTF9GQVNUX1BPTEwsIE5VTEwpCisKKworLyogUmV0dXJuIE5CWVRFUyBvZiBhbGxvY2F0ZWQgcmFuZG9tIHVzaW5nIGEgcmFuZG9tIG51bWJlcnMgb2YgcXVhbGl0eQorICAgTEVWRUwuICovCit2b2lkICpnY3J5X3JhbmRvbV9ieXRlcyAoc2l6ZV90IG5ieXRlcywgZW51bSBnY3J5X3JhbmRvbV9sZXZlbCBsZXZlbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICBfR0NSWV9HQ0NfQVRUUl9NQUxMT0M7CisKKy8qIFJldHVybiBOQllURVMgb2YgYWxsb2NhdGVkIHJhbmRvbSB1c2luZyBhIHJhbmRvbSBudW1iZXJzIG9mIHF1YWxpdHkKKyAgIExFVkVMLiAgVGhlIHJhbmRvbSBudW1iZXJzIGFyZSBjcmVhdGVkIHJldHVybmVkIGluICJzZWN1cmUiCisgICBtZW1vcnkuICovCit2b2lkICpnY3J5X3JhbmRvbV9ieXRlc19zZWN1cmUgKHNpemVfdCBuYnl0ZXMsIGVudW0gZ2NyeV9yYW5kb21fbGV2ZWwgbGV2ZWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9HQ1JZX0dDQ19BVFRSX01BTExPQzsKKworCisvKiBTZXQgdGhlIGJpZyBpbnRlZ2VyIFcgdG8gYSByYW5kb20gdmFsdWUgb2YgTkJJVFMgdXNpbmcgYSByYW5kb20KKyAgIGdlbmVyYXRvciB3aXRoIHF1YWxpdHkgTEVWRUwuICBOb3RlIHRoYXQgYnkgdXNpbmcgYSBsZXZlbCBvZgorICAgR0NSWV9XRUFLX1JBTkRPTSBnY3J5X2NyZWF0ZV9ub25jZSBpcyB1c2VkIGludGVybmFsbHkuICovCit2b2lkIGdjcnlfbXBpX3JhbmRvbWl6ZSAoZ2NyeV9tcGlfdCB3LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuYml0cywgZW51bSBnY3J5X3JhbmRvbV9sZXZlbCBsZXZlbCk7CisKKworLyogQ3JlYXRlIGFuIHVucHJlZGljYWJsZSBub25jZSBvZiBMRU5HVEggYnl0ZXMgaW4gQlVGRkVSLiAqLwordm9pZCBnY3J5X2NyZWF0ZV9ub25jZSAodm9pZCAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoKTsKKworCisKKworDAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFByaW1lIE51bWJlciBGdW5jdGlvbnMgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTW9kZSB2YWx1ZXMgcGFzc2VkIHRvIGEgZ2NyeV9wcmltZV9jaGVja19mdW5jX3QuICovCisjZGVmaW5lIEdDUllfUFJJTUVfQ0hFQ0tfQVRfRklOSVNIICAgICAgMAorI2RlZmluZSBHQ1JZX1BSSU1FX0NIRUNLX0FUX0dPVF9QUklNRSAgIDEKKyNkZWZpbmUgR0NSWV9QUklNRV9DSEVDS19BVF9NQVlCRV9QUklNRSAyCisKKy8qIFRoZSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIDEgaWYgdGhlIG9wZXJhdGlvbiBzaGFsbCBjb250aW51ZSwgMCB0bworICAgcmVqZWN0IHRoZSBwcmltZSBjYW5kaWRhdGUuICovCit0eXBlZGVmIGludCAoKmdjcnlfcHJpbWVfY2hlY2tfZnVuY190KSAodm9pZCAqYXJnLCBpbnQgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X21waV90IGNhbmRpZGF0ZSk7CisKKy8qIEZsYWdzIGZvciBnY3J5X3ByaW1lX2dlbmVyYXRlKCk6ICAqLworCisvKiBBbGxvY2F0ZSBwcmltZSBudW1iZXJzIGFuZCBmYWN0b3JzIGluIHNlY3VyZSBtZW1vcnkuICAqLworI2RlZmluZSBHQ1JZX1BSSU1FX0ZMQUdfU0VDUkVUICAgICAgICAgKDEgPDwgMCkKKworLyogTWFrZSBzdXJlIHRoYXQgYXQgbGVhc3Qgb25lIHByaW1lIGZhY3RvciBpcyBvZiBzaXplCisgICBgRkFDVE9SX0JJVFMnLiAgKi8KKyNkZWZpbmUgR0NSWV9QUklNRV9GTEFHX1NQRUNJQUxfRkFDVE9SICgxIDw8IDEpCisKKy8qIEdlbmVyYXRlIGEgbmV3IHByaW1lIG51bWJlciBvZiBQUklNRV9CSVRTIGJpdHMgYW5kIHN0b3JlIGl0IGluCisgICBQUklNRS4gIElmIEZBQ1RPUl9CSVRTIGlzIG5vbi16ZXJvLCBvbmUgb2YgdGhlIHByaW1lIGZhY3RvcnMgb2YKKyAgIChwcmltZSAtIDEpIC8gMiBtdXN0IGJlIEZBQ1RPUl9CSVRTIGJpdHMgbG9uZy4gIElmIEZBQ1RPUlMgaXMKKyAgIG5vbi16ZXJvLCBhbGxvY2F0ZSBhIG5ldywgTlVMTC10ZXJtaW5hdGVkIGFycmF5IGhvbGRpbmcgdGhlIHByaW1lCisgICBmYWN0b3JzIGFuZCBzdG9yZSBpdCBpbiBGQUNUT1JTLiAgRkxBR1MgbWlnaHQgYmUgdXNlZCB0byBpbmZsdWVuY2UKKyAgIHRoZSBwcmltZSBudW1iZXIgZ2VuZXJhdGlvbiBwcm9jZXNzLiAgKi8KK2djcnlfZXJyb3JfdCBnY3J5X3ByaW1lX2dlbmVyYXRlIChnY3J5X21waV90ICpwcmltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcHJpbWVfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmFjdG9yX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NyeV9tcGlfdCAqKmZhY3RvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NyeV9wcmltZV9jaGVja19mdW5jX3QgY2JfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjYl9hcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NyeV9yYW5kb21fbGV2ZWxfdCByYW5kb21fbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzKTsKKworLyogRmluZCBhIGdlbmVyYXRvciBmb3IgUFJJTUUgd2hlcmUgdGhlIGZhY3Rvcml6YXRpb24gb2YgKHByaW1lLTEpIGlzCisgICBpbiB0aGUgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IEZBQ1RPUlMuIFJldHVybiB0aGUgZ2VuZXJhdG9yIGFzIGEKKyAgIG5ld2x5IGFsbG9jYXRlZCBNUEkgaW4gUl9HLiAgSWYgU1RBUlRfRyBpcyBub3QgTlVMTCwgdXNlIHRoaXMgYXMKKyAgIHRlaCBzdGFydCBmb3IgdGhlIHNlYXJjaC4gKi8KK2djcnlfZXJyb3JfdCBnY3J5X3ByaW1lX2dyb3VwX2dlbmVyYXRvciAoZ2NyeV9tcGlfdCAqcl9nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X21waV90IHByaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X21waV90ICpmYWN0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X21waV90IHN0YXJ0X2cpOworCisKKy8qIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIHJlbGVhc2UgdGhlIEZBQ1RPUlMgYXJyYXkuICovCit2b2lkIGdjcnlfcHJpbWVfcmVsZWFzZV9mYWN0b3JzIChnY3J5X21waV90ICpmYWN0b3JzKTsKKworCisvKiBDaGVjayB3ZXRoZXIgdGhlIG51bWJlciBYIGlzIHByaW1lLiAgKi8KK2djcnlfZXJyb3JfdCBnY3J5X3ByaW1lX2NoZWNrIChnY3J5X21waV90IHgsIHVuc2lnbmVkIGludCBmbGFncyk7CisKKworDAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgIE1pc2NlbGxhbmVvdXMgU3R1ZmYgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTG9nIGxldmVscyB1c2VkIGJ5IHRoZSBpbnRlcm5hbCBsb2dnaW5nIGZhY2lsaXR5LiAqLworZW51bSBnY3J5X2xvZ19sZXZlbHMgCisgIHsKKyAgICBHQ1JZX0xPR19DT05UICAgPSAwLCAgICAvKiAoQ29udGludWUgdGhlIGxhc3QgbG9nIGxpbmUuKSAqLworICAgIEdDUllfTE9HX0lORk8gICA9IDEwLAorICAgIEdDUllfTE9HX1dBUk4gICA9IDIwLAorICAgIEdDUllfTE9HX0VSUk9SICA9IDMwLAorICAgIEdDUllfTE9HX0ZBVEFMICA9IDQwLAorICAgIEdDUllfTE9HX0JVRyAgICA9IDUwLAorICAgIEdDUllfTE9HX0RFQlVHICA9IDEwMAorICB9OworCisvKiBUeXBlIGZvciBwcm9ncmVzcyBoYW5kbGVycy4gICovCit0eXBlZGVmIHZvaWQgKCpnY3J5X2hhbmRsZXJfcHJvZ3Jlc3NfdCkgKHZvaWQgKiwgY29uc3QgY2hhciAqLCBpbnQsIGludCwgaW50KTsKKworLyogVHlwZSBmb3IgbWVtb3J5IGFsbG9jYXRpb24gaGFuZGxlcnMuICAqLwordHlwZWRlZiB2b2lkICooKmdjcnlfaGFuZGxlcl9hbGxvY190KSAoc2l6ZV90IG4pOworCisvKiBUeXBlIGZvciBzZWN1cmUgbWVtb3J5IGNoZWNrIGhhbmRsZXJzLiAgKi8KK3R5cGVkZWYgaW50ICgqZ2NyeV9oYW5kbGVyX3NlY3VyZV9jaGVja190KSAoY29uc3Qgdm9pZCAqKTsKKworLyogVHlwZSBmb3IgbWVtb3J5IHJlYWxsb2NhdGlvbiBoYW5kbGVycy4gICovCit0eXBlZGVmIHZvaWQgKigqZ2NyeV9oYW5kbGVyX3JlYWxsb2NfdCkgKHZvaWQgKnAsIHNpemVfdCBuKTsKKworLyogVHlwZSBmb3IgbWVtb3J5IGZyZWUgaGFuZGxlcnMuICAqLwordHlwZWRlZiB2b2lkICgqZ2NyeV9oYW5kbGVyX2ZyZWVfdCkgKHZvaWQgKik7CisKKy8qIFR5cGUgZm9yIG91dC1vZi1tZW1vcnkgaGFuZGxlcnMuICAqLwordHlwZWRlZiBpbnQgKCpnY3J5X2hhbmRsZXJfbm9fbWVtX3QpICh2b2lkICosIHNpemVfdCwgdW5zaWduZWQgaW50KTsKKworLyogVHlwZSBmb3IgZmF0YWwgZXJyb3IgaGFuZGxlcnMuICAqLwordHlwZWRlZiB2b2lkICgqZ2NyeV9oYW5kbGVyX2Vycm9yX3QpICh2b2lkICosIGludCwgY29uc3QgY2hhciAqKTsKKworLyogVHlwZSBmb3IgbG9nZ2luZyBoYW5kbGVycy4gICovCit0eXBlZGVmIHZvaWQgKCpnY3J5X2hhbmRsZXJfbG9nX3QpICh2b2lkICosIGludCwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKKworLyogQ2VydGFpbiBvcGVyYXRpb25zIGNhbiBwcm92aWRlIHByb2dyZXNzIGluZm9ybWF0aW9uLiAgVGhpcyBmdW5jdGlvbgorICAgaXMgdXNlZCB0byByZWdpc3RlciBhIGhhbmRsZXIgZm9yIHJldHJpZXZpbmcgdGhlc2UgaW5mb3JtYXRpb24uICovCit2b2lkIGdjcnlfc2V0X3Byb2dyZXNzX2hhbmRsZXIgKGdjcnlfaGFuZGxlcl9wcm9ncmVzc190IGNiLCB2b2lkICpjYl9kYXRhKTsKKworCisvKiBSZWdpc3RlciBhIGN1c3RvbSBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbnMuICovCit2b2lkIGdjcnlfc2V0X2FsbG9jYXRpb25faGFuZGxlciAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfaGFuZGxlcl9hbGxvY190IGZ1bmNfYWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfaGFuZGxlcl9hbGxvY190IGZ1bmNfYWxsb2Nfc2VjdXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X2hhbmRsZXJfc2VjdXJlX2NoZWNrX3QgZnVuY19zZWN1cmVfY2hlY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfaGFuZGxlcl9yZWFsbG9jX3QgZnVuY19yZWFsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X2hhbmRsZXJfZnJlZV90IGZ1bmNfZnJlZSk7CisKKy8qIFJlZ2lzdGVyIGEgZnVuY3Rpb24gdXNlZCBpbnN0ZWFkIG9mIHRoZSBpbnRlcm5hbCBvdXQgb2YgbWVtb3J5CisgICBoYW5kbGVyLiAqLwordm9pZCBnY3J5X3NldF9vdXRvZmNvcmVfaGFuZGxlciAoZ2NyeV9oYW5kbGVyX25vX21lbV90IGgsIHZvaWQgKm9wYXF1ZSk7CisKKy8qIFJlZ2lzdGVyIGEgZnVuY3Rpb24gdXNlZCBpbnN0ZWFkIG9mIHRoZSBpbnRlcm5hbCBmYXRhbCBlcnJvcgorICAgaGFuZGxlci4gKi8KK3ZvaWQgZ2NyeV9zZXRfZmF0YWxlcnJvcl9oYW5kbGVyIChnY3J5X2hhbmRsZXJfZXJyb3JfdCBmbmMsIHZvaWQgKm9wYXF1ZSk7CisKKy8qIFJlZ2lzdGVyIGEgZnVuY3Rpb24gdXNlZCBpbnN0ZWFkIG9mIHRoZSBpbnRlcm5hbCBsb2dnaW5nCisgICBmYWNpbGl0eS4gKi8KK3ZvaWQgZ2NyeV9zZXRfbG9nX2hhbmRsZXIgKGdjcnlfaGFuZGxlcl9sb2dfdCBmLCB2b2lkICpvcGFxdWUpOworCisvKiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4gKi8KK3ZvaWQgZ2NyeV9zZXRfZ2V0dGV4dF9oYW5kbGVyIChjb25zdCBjaGFyICooKmYpKGNvbnN0IGNoYXIqKSk7CisKKy8qIExpYmdjcnlwdCB1c2VzIGl0cyBvd24gbWVtb3J5IGFsbG9jYXRpb24uICBJdCBpcyBpbXBvcnRhbnQgdG8gdXNlCisgICBnY3J5X2ZyZWUgKCkgdG8gcmVsZWFzZSBtZW1vcnkgYWxsb2NhdGVkIGJ5IGxpYmdjcnlwdC4gKi8KK3ZvaWQgKmdjcnlfbWFsbG9jIChzaXplX3QgbikgX0dDUllfR0NDX0FUVFJfTUFMTE9DOwordm9pZCAqZ2NyeV9jYWxsb2MgKHNpemVfdCBuLCBzaXplX3QgbSkgX0dDUllfR0NDX0FUVFJfTUFMTE9DOwordm9pZCAqZ2NyeV9tYWxsb2Nfc2VjdXJlIChzaXplX3QgbikgX0dDUllfR0NDX0FUVFJfTUFMTE9DOwordm9pZCAqZ2NyeV9jYWxsb2Nfc2VjdXJlIChzaXplX3Qgbiwgc2l6ZV90IG0pIF9HQ1JZX0dDQ19BVFRSX01BTExPQzsKK3ZvaWQgKmdjcnlfcmVhbGxvYyAodm9pZCAqYSwgc2l6ZV90IG4pOworY2hhciAqZ2NyeV9zdHJkdXAgKGNvbnN0IGNoYXIgKnN0cmluZykgX0dDUllfR0NDX0FUVFJfTUFMTE9DOwordm9pZCAqZ2NyeV94bWFsbG9jIChzaXplX3QgbikgX0dDUllfR0NDX0FUVFJfTUFMTE9DOwordm9pZCAqZ2NyeV94Y2FsbG9jIChzaXplX3Qgbiwgc2l6ZV90IG0pIF9HQ1JZX0dDQ19BVFRSX01BTExPQzsKK3ZvaWQgKmdjcnlfeG1hbGxvY19zZWN1cmUgKHNpemVfdCBuKSBfR0NSWV9HQ0NfQVRUUl9NQUxMT0M7Cit2b2lkICpnY3J5X3hjYWxsb2Nfc2VjdXJlIChzaXplX3Qgbiwgc2l6ZV90IG0pIF9HQ1JZX0dDQ19BVFRSX01BTExPQzsKK3ZvaWQgKmdjcnlfeHJlYWxsb2MgKHZvaWQgKmEsIHNpemVfdCBuKTsKK2NoYXIgKmdjcnlfeHN0cmR1cCAoY29uc3QgY2hhciAqIGEpIF9HQ1JZX0dDQ19BVFRSX01BTExPQzsKK3ZvaWQgIGdjcnlfZnJlZSAodm9pZCAqYSk7CisKKy8qIFJldHVybiB0cnVlIGlmIEEgaXMgYWxsb2NhdGVkIGluICJzZWN1cmUiIG1lbW9yeS4gKi8KK2ludCBnY3J5X2lzX3NlY3VyZSAoY29uc3Qgdm9pZCAqYSkgX0dDUllfR0NDX0FUVFJfUFVSRTsKKworLyogUmV0dXJuIHRydWUgaWYgTGliZ2NyeXB0IGlzIGluIEZJUFMgbW9kZS4gICovCisjZGVmaW5lIGdjcnlfZmlwc19tb2RlX2FjdGl2ZSgpICAhIWdjcnlfY29udHJvbCAoR0NSWUNUTF9GSVBTX01PREVfUCwgMCkKKworCisvKiBJbmNsdWRlIHN1cHBvcnQgZm9yIExpYmdjcnlwdCBtb2R1bGVzLiAgKi8KKyNpbmNsdWRlIDxnY3J5cHQtbW9kdWxlLmg+CisKKyNpZiAwIC8qIChLZWVwIEVtYWNzZW5zJyBhdXRvLWluZGVudCBoYXBweS4pICovCit7CisjZW5kaWYKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogX0dDUllQVF9IICovCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvc3JjL2djcnlwdC5oLmluIGIvbGliZ2NyeXB0LTEuNC42L3NyYy9nY3J5cHQuaC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDFjYjRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L3NyYy9nY3J5cHQuaC5pbgpAQCAtMCwwICsxLDE4MzkgQEAKKy8qIGdjcnlwdC5oIC0gIEdOVSBDcnlwdG9ncmFwaGljIExpYnJhcnkgSW50ZXJmYWNlICAgICAgICAgICAgICAtKi0gYyAtKi0KKyAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNgorICAgICAgICAgICAgICAgICAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgIAorICAgTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgCisgICBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAgCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKyAgIEZpbGU6IEBjb25maWd1cmVfaW5wdXRAICovCisKKyNpZm5kZWYgX0dDUllQVF9ICisjZGVmaW5lIF9HQ1JZUFRfSAorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxncGctZXJyb3IuaD4KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaWYgZGVmaW5lZCBfV0lOMzIgfHwgZGVmaW5lZCBfX1dJTjMyX18KKyMgaW5jbHVkZSA8d2luc29jazIuaD4KKyMgaW5jbHVkZSA8d3MydGNwaXAuaD4KKyMgaW5jbHVkZSA8dGltZS5oPgorIyBpZm5kZWYgX19HTlVDX18KKyAgdHlwZWRlZiBsb25nIHNzaXplX3Q7CisgIHR5cGVkZWYgaW50ICBwaWRfdDsKKyMgZW5kaWYgLyohX19HTlVDX18qLworI2Vsc2UKKyMgaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorIyBpbmNsdWRlIDxzeXMvdGltZS5oPgorI2VuZGlmIC8qIV9XSU4zMiovCisKK0BGQUxMQkFDS19TT0NLTEVOX1RACisKKworLyogVGhpcyBpcyByZXF1aXJlZCBmb3IgZXJyb3IgY29kZSBjb21wYXRpYmlsaXR5LiAqLworI2RlZmluZSBfR0NSWV9FUlJfU09VUkNFX0RFRkFVTFQgR1BHX0VSUl9TT1VSQ0VfR0NSWVBUCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjaWYgMCAvKiAoS2VlcCBFbWFjc2VucycgYXV0by1pbmRlbnQgaGFwcHkuKSAqLworfQorI2VuZGlmCisjZW5kaWYKKworLyogVGhlIHZlcnNpb24gb2YgdGhpcyBoZWFkZXIgc2hvdWxkIG1hdGNoIHRoZSBvbmUgb2YgdGhlIGxpYnJhcnkuIEl0CisgICBzaG91bGQgbm90IGJlIHVzZWQgYnkgYSBwcm9ncmFtIGJlY2F1c2UgZ2NyeV9jaGVja192ZXJzaW9uKCkgc2hvdWxkCisgICByZXR1cm4gdGhlIHNhbWUgdmVyc2lvbi4gIFRoZSBwdXJwb3NlIG9mIHRoaXMgbWFjcm8gaXMgdG8gbGV0CisgICBhdXRvY29uZiAodXNpbmcgdGhlIEFNX1BBVEhfR0NSWVBUIG1hY3JvKSBjaGVjayB0aGF0IHRoaXMgaGVhZGVyCisgICBtYXRjaGVzIHRoZSBpbnN0YWxsZWQgbGlicmFyeS4gICovCisjZGVmaW5lIEdDUllQVF9WRVJTSU9OICJAVkVSU0lPTkAiCisKKy8qIEludGVybmFsOiBXZSBjYW4ndCB1c2UgdGhlIGNvbnZlbmllbmNlIG1hY3JvcyBmb3IgdGhlIG11bHRpCisgICBwcmVjaXNpb24gaW50ZWdlciBmdW5jdGlvbnMgd2hlbiBidWlsZGluZyB0aGlzIGxpYnJhcnkuICovCisjaWZkZWYgX0dDUllQVF9JTl9MSUJHQ1JZUFQKKyNpZm5kZWYgR0NSWVBUX05PX01QSV9NQUNST1MKKyNkZWZpbmUgR0NSWVBUX05PX01QSV9NQUNST1MgMQorI2VuZGlmCisjZW5kaWYKKworLyogV2Ugd2FudCB0byB1c2UgZ2NjIGF0dHJpYnV0ZXMgd2hlbiBwb3NzaWJsZS4gIFdhcm5pbmc6IERvbid0IHVzZQorICAgdGhlc2UgbWFjcm9zIGluIHlvdXIgcHJvZ3JhbXM6IEFzIGluZGljYXRlZCBieSB0aGUgbGVhZGluZworICAgdW5kZXJzY29yZSB0aGV5IGFyZSBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZS4gKi8KKyNpZmRlZiBfX0dOVUNfXworCisjZGVmaW5lIF9HQ1JZX0dDQ19WRVJTSU9OIChfX0dOVUNfXyAqIDEwMDAwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBfX0dOVUNfTUlOT1JfXyAqIDEwMCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgX19HTlVDX1BBVENITEVWRUxfXykKKworI2lmIF9HQ1JZX0dDQ19WRVJTSU9OID49IDMwMTAwCisjZGVmaW5lIF9HQ1JZX0dDQ19BVFRSX0RFUFJFQ0FURUQgX19hdHRyaWJ1dGVfXyAoKF9fZGVwcmVjYXRlZF9fKSkKKyNlbmRpZgorCisjaWYgX0dDUllfR0NDX1ZFUlNJT04gPj0gMjk2MDAKKyNkZWZpbmUgX0dDUllfR0NDX0FUVFJfUFVSRSAgX19hdHRyaWJ1dGVfXyAoKF9fcHVyZV9fKSkKKyNlbmRpZgorCisjaWYgX0dDUllfR0NDX1ZFUlNJT04gPj0gMzAyMDAKKyNkZWZpbmUgX0dDUllfR0NDX0FUVFJfTUFMTE9DICBfX2F0dHJpYnV0ZV9fICgoX19tYWxsb2NfXykpCisjZW5kaWYKKworI2VuZGlmIC8qX19HTlVDX18qLworCisjaWZuZGVmIF9HQ1JZX0dDQ19BVFRSX0RFUFJFQ0FURUQKKyNkZWZpbmUgX0dDUllfR0NDX0FUVFJfREVQUkVDQVRFRAorI2VuZGlmCisjaWZuZGVmIF9HQ1JZX0dDQ19BVFRSX1BVUkUKKyNkZWZpbmUgX0dDUllfR0NDX0FUVFJfUFVSRQorI2VuZGlmCisjaWZuZGVmIF9HQ1JZX0dDQ19BVFRSX01BTExPQworI2RlZmluZSBfR0NSWV9HQ0NfQVRUUl9NQUxMT0MKKyNlbmRpZgorCisvKiBTb21lIG1lbWJlcnMgaW4gYSBwdWJsaWMgdHlwZSBzaG91bGQgb25seSBiZSB1c2VkIGludGVybmFsbHkuCisgICBUaGVyZSBpcyBubyAiaW50ZXJuYWwiIGF0dHJpYnV0ZSwgc28gd2UgYWJ1c2UgdGhlIGRlcHJlY2F0ZWQKKyAgIGF0dHJpYnV0ZSB0byBkaXNjb3VyYWdlIGV4dGVybmFsIHVzZS4gICovCisjaWZkZWYgX0dDUllQVF9JTl9MSUJHQ1JZUFQKKyNkZWZpbmUgX0dDUllfQVRUUl9JTlRFUk5BTAorI2Vsc2UKKyNkZWZpbmUgX0dDUllfQVRUUl9JTlRFUk5BTAlfR0NSWV9HQ0NfQVRUUl9ERVBSRUNBVEVECisjZW5kaWYKKworLyogV3JhcHBlcnMgZm9yIHRoZSBsaWJncGctZXJyb3IgbGlicmFyeS4gICovCisKK3R5cGVkZWYgZ3BnX2Vycm9yX3QgZ2NyeV9lcnJvcl90OwordHlwZWRlZiBncGdfZXJyX2NvZGVfdCBnY3J5X2Vycl9jb2RlX3Q7Cit0eXBlZGVmIGdwZ19lcnJfc291cmNlX3QgZ2NyeV9lcnJfc291cmNlX3Q7CisKK3N0YXRpYyBHUEdfRVJSX0lOTElORSBnY3J5X2Vycm9yX3QKK2djcnlfZXJyX21ha2UgKGdjcnlfZXJyX3NvdXJjZV90IHNvdXJjZSwgZ2NyeV9lcnJfY29kZV90IGNvZGUpCit7CisgIHJldHVybiBncGdfZXJyX21ha2UgKHNvdXJjZSwgY29kZSk7Cit9CisKKy8qIFRoZSB1c2VyIGNhbiBkZWZpbmUgR1BHX0VSUl9TT1VSQ0VfREVGQVVMVCBiZWZvcmUgaW5jbHVkaW5nIHRoaXMKKyAgIGZpbGUgdG8gc3BlY2lmeSBhIGRlZmF1bHQgc291cmNlIGZvciBncGdfZXJyb3IuICAqLworI2lmbmRlZiBHQ1JZX0VSUl9TT1VSQ0VfREVGQVVMVAorI2RlZmluZSBHQ1JZX0VSUl9TT1VSQ0VfREVGQVVMVCAgR1BHX0VSUl9TT1VSQ0VfVVNFUl8xCisjZW5kaWYKKworc3RhdGljIEdQR19FUlJfSU5MSU5FIGdjcnlfZXJyb3JfdAorZ2NyeV9lcnJvciAoZ2NyeV9lcnJfY29kZV90IGNvZGUpCit7CisgIHJldHVybiBnY3J5X2Vycl9tYWtlIChHQ1JZX0VSUl9TT1VSQ0VfREVGQVVMVCwgY29kZSk7Cit9CisKK3N0YXRpYyBHUEdfRVJSX0lOTElORSBnY3J5X2Vycl9jb2RlX3QKK2djcnlfZXJyX2NvZGUgKGdjcnlfZXJyb3JfdCBlcnIpCit7CisgIHJldHVybiBncGdfZXJyX2NvZGUgKGVycik7Cit9CisKKworc3RhdGljIEdQR19FUlJfSU5MSU5FIGdjcnlfZXJyX3NvdXJjZV90CitnY3J5X2Vycl9zb3VyY2UgKGdjcnlfZXJyb3JfdCBlcnIpCit7CisgIHJldHVybiBncGdfZXJyX3NvdXJjZSAoZXJyKTsKK30KKworLyogUmV0dXJuIGEgcG9pbnRlciB0byBhIHN0cmluZyBjb250YWluaW5nIGEgZGVzY3JpcHRpb24gb2YgdGhlIGVycm9yCisgICBjb2RlIGluIHRoZSBlcnJvciB2YWx1ZSBFUlIuICAqLworY29uc3QgY2hhciAqZ2NyeV9zdHJlcnJvciAoZ2NyeV9lcnJvcl90IGVycik7CisKKy8qIFJldHVybiBhIHBvaW50ZXIgdG8gYSBzdHJpbmcgY29udGFpbmluZyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBlcnJvcgorICAgc291cmNlIGluIHRoZSBlcnJvciB2YWx1ZSBFUlIuICAqLworY29uc3QgY2hhciAqZ2NyeV9zdHJzb3VyY2UgKGdjcnlfZXJyb3JfdCBlcnIpOworCisvKiBSZXRyaWV2ZSB0aGUgZXJyb3IgY29kZSBmb3IgdGhlIHN5c3RlbSBlcnJvciBFUlIuICBUaGlzIHJldHVybnMKKyAgIEdQR19FUlJfVU5LTk9XTl9FUlJOTyBpZiB0aGUgc3lzdGVtIGVycm9yIGlzIG5vdCBtYXBwZWQgKHJlcG9ydAorICAgdGhpcykuICAqLworZ2NyeV9lcnJfY29kZV90IGdjcnlfZXJyX2NvZGVfZnJvbV9lcnJubyAoaW50IGVycik7CisKKy8qIFJldHJpZXZlIHRoZSBzeXN0ZW0gZXJyb3IgZm9yIHRoZSBlcnJvciBjb2RlIENPREUuICBUaGlzIHJldHVybnMgMAorICAgaWYgQ09ERSBpcyBub3QgYSBzeXN0ZW0gZXJyb3IgY29kZS4gICovCitpbnQgZ2NyeV9lcnJfY29kZV90b19lcnJubyAoZ2NyeV9lcnJfY29kZV90IGNvZGUpOworCisvKiBSZXR1cm4gYW4gZXJyb3IgdmFsdWUgd2l0aCB0aGUgZXJyb3Igc291cmNlIFNPVVJDRSBhbmQgdGhlIHN5c3RlbQorICAgZXJyb3IgRVJSLiAgKi8KK2djcnlfZXJyb3JfdCBnY3J5X2Vycl9tYWtlX2Zyb21fZXJybm8gKGdjcnlfZXJyX3NvdXJjZV90IHNvdXJjZSwgaW50IGVycik7CisKKy8qIFJldHVybiBhbiBlcnJvciB2YWx1ZSB3aXRoIHRoZSBzeXN0ZW0gZXJyb3IgRVJSLiAgKi8KK2djcnlfZXJyX2NvZGVfdCBnY3J5X2Vycm9yX2Zyb21fZXJybm8gKGludCBlcnIpOworCisMCisvKiBUaGlzIGVudW0gaXMgZGVwcmVjYXRlZDsgaXQgaXMgb25seSBkZWNsYXJlZCBmb3IgdGhlIHNha2Ugb2YKKyAgIGNvbXBsZXRlIEFQSSBjb21wYXRpYmlsaXR5LiAgKi8KK2VudW0gZ2NyeV90aHJlYWRfb3B0aW9uCisgIHsKKyAgICBfR0NSWV9USFJFQURfT1BUSU9OX0RVTU1ZCisgIH0gX0dDUllfR0NDX0FUVFJfREVQUkVDQVRFRDsKKworCisvKiBDb25zdGFudHMgZGVmaW5pbmcgdGhlIHRocmVhZCBtb2RlbCB0byB1c2UuICBVc2VkIHdpdGggdGhlIE9QVElPTgorICAgZmllbGQgb2YgdGhlIHN0cnVjdCBnY3J5X3RocmVhZF9jYnMuICAqLworI2RlZmluZSBHQ1JZX1RIUkVBRF9PUFRJT05fREVGQVVMVCAgMAorI2RlZmluZSBHQ1JZX1RIUkVBRF9PUFRJT05fVVNFUiAgICAgMQorI2RlZmluZSBHQ1JZX1RIUkVBRF9PUFRJT05fUFRIICAgICAgMgorI2RlZmluZSBHQ1JZX1RIUkVBRF9PUFRJT05fUFRIUkVBRCAgMworCisvKiBUaGUgdmVyc2lvbiBudW1iZXIgZW5jb2RlZCBpbiB0aGUgT1BUSU9OIGZpZWxkIG9mIHRoZSBzdHJ1Y3QKKyAgIGdjcnlfdGhyZWFkX2Nicy4gICovCisjZGVmaW5lIEdDUllfVEhSRUFEX09QVElPTl9WRVJTSU9OICAwCisKKy8qIFdyYXBwZXIgZm9yIHN0cnVjdCBhdGhfb3BzLiAgKi8KK3N0cnVjdCBnY3J5X3RocmVhZF9jYnMKK3sKKyAgLyogVGhlIE9QVElPTiBmaWVsZCBlbmNvZGVzIHRoZSB0aHJlYWQgbW9kZWwgYW5kIHRoZSB2ZXJzaW9uIG51bWJlcgorICAgICBvZiB0aGlzIHN0cnVjdHVyZS4gICAKKyAgICAgICBCaXRzICA3IC0gMCAgYXJlIHVzZWQgZm9yIHRoZSB0aHJlYWQgbW9kZWwKKyAgICAgICBCaXRzIDE1IC0gOCAgYXJlIHVzZWQgZm9yIHRoZSB2ZXJzaW9uIG51bWJlci4KKyAgKi8KKyAgdW5zaWduZWQgaW50IG9wdGlvbjsKKworICBpbnQgKCppbml0KSAodm9pZCk7CisgIGludCAoKm11dGV4X2luaXQpICh2b2lkICoqcHJpdik7CisgIGludCAoKm11dGV4X2Rlc3Ryb3kpICh2b2lkICoqcHJpdik7CisgIGludCAoKm11dGV4X2xvY2spICh2b2lkICoqcHJpdik7CisgIGludCAoKm11dGV4X3VubG9jaykgKHZvaWQgKipwcml2KTsKKyAgc3NpemVfdCAoKnJlYWQpIChpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IG5ieXRlcyk7CisgIHNzaXplX3QgKCp3cml0ZSkgKGludCBmZCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgbmJ5dGVzKTsKKyNpZmRlZiBfV0lOMzIKKyAgc3NpemVfdCAoKnNlbGVjdCkgKGludCBuZmQsIHZvaWQgKnJzZXQsIHZvaWQgKndzZXQsIHZvaWQgKmVzZXQsCisJCSAgICAgc3RydWN0IHRpbWV2YWwgKnRpbWVvdXQpOworICBzc2l6ZV90ICgqd2FpdHBpZCkgKHBpZF90IHBpZCwgaW50ICpzdGF0dXMsIGludCBvcHRpb25zKTsKKyAgaW50ICgqYWNjZXB0KSAoaW50IHMsIHZvaWQgICphZGRyLCBpbnQgKmxlbmd0aF9wdHIpOworICBpbnQgKCpjb25uZWN0KSAoaW50IHMsIHZvaWQgKmFkZHIsIGdjcnlfc29ja2xlbl90IGxlbmd0aCk7CisgIGludCAoKnNlbmRtc2cpIChpbnQgcywgY29uc3Qgdm9pZCAqbXNnLCBpbnQgZmxhZ3MpOworICBpbnQgKCpyZWN2bXNnKSAoaW50IHMsIHZvaWQgKm1zZywgaW50IGZsYWdzKTsKKyNlbHNlCisgIHNzaXplX3QgKCpzZWxlY3QpIChpbnQgbmZkLCBmZF9zZXQgKnJzZXQsIGZkX3NldCAqd3NldCwgZmRfc2V0ICplc2V0LAorCQkgICAgIHN0cnVjdCB0aW1ldmFsICp0aW1lb3V0KTsKKyAgc3NpemVfdCAoKndhaXRwaWQpIChwaWRfdCBwaWQsIGludCAqc3RhdHVzLCBpbnQgb3B0aW9ucyk7CisgIGludCAoKmFjY2VwdCkgKGludCBzLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIGdjcnlfc29ja2xlbl90ICpsZW5ndGhfcHRyKTsKKyAgaW50ICgqY29ubmVjdCkgKGludCBzLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIGdjcnlfc29ja2xlbl90IGxlbmd0aCk7CisgIGludCAoKnNlbmRtc2cpIChpbnQgcywgY29uc3Qgc3RydWN0IG1zZ2hkciAqbXNnLCBpbnQgZmxhZ3MpOworICBpbnQgKCpyZWN2bXNnKSAoaW50IHMsIHN0cnVjdCBtc2doZHIgKm1zZywgaW50IGZsYWdzKTsKKyNlbmRpZgorfTsKKworI2lmZGVmIF9XSU4zMgorIyBkZWZpbmUgX0dDUllfVEhSRUFEX09QVElPTl9QVEhfSU1QTF9ORVQJCQkJICAgICAgXAorc3RhdGljIHNzaXplX3QgZ2NyeV9wdGhfc2VsZWN0IChpbnQgbmZkLCB2b2lkICpyc2V0LCB2b2lkICp3c2V0LAkgICAgICBcCisJCQkJdm9pZCAqZXNldCwgc3RydWN0IHRpbWV2YWwgKnRpbWVvdXQpCSAgICAgIFwKKyAgeyByZXR1cm4gcHRoX3NlbGVjdCAobmZkLCByc2V0LCB3c2V0LCBlc2V0LCB0aW1lb3V0KTsgfQkJICAgICAgXAorc3RhdGljIHNzaXplX3QgZ2NyeV9wdGhfd2FpdHBpZCAocGlkX3QgcGlkLCBpbnQgKnN0YXR1cywgaW50IG9wdGlvbnMpCSAgICAgIFwKKyAgeyByZXR1cm4gcHRoX3dhaXRwaWQgKHBpZCwgc3RhdHVzLCBvcHRpb25zKTsgfQkJCSAgICAgIFwKK3N0YXRpYyBpbnQgZ2NyeV9wdGhfYWNjZXB0IChpbnQgcywgdm9pZCAqYWRkciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCSAgICBnY3J5X3NvY2tsZW5fdCAqbGVuZ3RoX3B0cikJCQkgICAgICBcCisgIHsgcmV0dXJuIHB0aF9hY2NlcHQgKHMsIGFkZHIsIGxlbmd0aF9wdHIpOyB9CQkJCSAgICAgIFwKK3N0YXRpYyBpbnQgZ2NyeV9wdGhfY29ubmVjdCAoaW50IHMsIHZvaWQgKmFkZHIsCQkgICAgICAgICAgICAgICAgICAgICAgXAorCQkJICAgICBnY3J5X3NvY2tsZW5fdCBsZW5ndGgpCQkJICAgICAgXAorICB7IHJldHVybiBwdGhfY29ubmVjdCAocywgYWRkciwgbGVuZ3RoKTsgfQorI2Vsc2UgLyohX1dJTjMyKi8KKyMgZGVmaW5lIF9HQ1JZX1RIUkVBRF9PUFRJT05fUFRIX0lNUExfTkVUCQkJCSAgICAgIFwKK3N0YXRpYyBzc2l6ZV90IGdjcnlfcHRoX3NlbGVjdCAoaW50IG5mZCwgZmRfc2V0ICpyc2V0LCBmZF9zZXQgKndzZXQsCSAgICAgIFwKKwkJCQlmZF9zZXQgKmVzZXQsIHN0cnVjdCB0aW1ldmFsICp0aW1lb3V0KQkgICAgICBcCisgIHsgcmV0dXJuIHB0aF9zZWxlY3QgKG5mZCwgcnNldCwgd3NldCwgZXNldCwgdGltZW91dCk7IH0JCSAgICAgIFwKK3N0YXRpYyBzc2l6ZV90IGdjcnlfcHRoX3dhaXRwaWQgKHBpZF90IHBpZCwgaW50ICpzdGF0dXMsIGludCBvcHRpb25zKQkgICAgICBcCisgIHsgcmV0dXJuIHB0aF93YWl0cGlkIChwaWQsIHN0YXR1cywgb3B0aW9ucyk7IH0JCQkgICAgICBcCitzdGF0aWMgaW50IGdjcnlfcHRoX2FjY2VwdCAoaW50IHMsIHN0cnVjdCBzb2NrYWRkciAqYWRkciwJCSAgICAgIFwKKwkJCSAgICBnY3J5X3NvY2tsZW5fdCAqbGVuZ3RoX3B0cikJCQkgICAgICBcCisgIHsgcmV0dXJuIHB0aF9hY2NlcHQgKHMsIGFkZHIsIGxlbmd0aF9wdHIpOyB9CQkJCSAgICAgIFwKK3N0YXRpYyBpbnQgZ2NyeV9wdGhfY29ubmVjdCAoaW50IHMsIHN0cnVjdCBzb2NrYWRkciAqYWRkciwJCSAgICAgIFwKKwkJCSAgICAgZ2NyeV9zb2NrbGVuX3QgbGVuZ3RoKQkJCSAgICAgIFwKKyAgeyByZXR1cm4gcHRoX2Nvbm5lY3QgKHMsIGFkZHIsIGxlbmd0aCk7IH0KKyNlbmRpZiAvKiFfV0lOMzIqLworCisKKworI2RlZmluZSBHQ1JZX1RIUkVBRF9PUFRJT05fUFRIX0lNUEwJCQkJCSAgICAgIFwKK3N0YXRpYyBpbnQgZ2NyeV9wdGhfaW5pdCAodm9pZCkJCQkJCQkgICAgICBcCit7IHJldHVybiAocHRoX2luaXQgKCkgPT0gRkFMU0UpID8gZXJybm8gOiAwOyB9CQkJCSAgICAgIFwKK3N0YXRpYyBpbnQgZ2NyeV9wdGhfbXV0ZXhfaW5pdCAodm9pZCAqKnByaXYpCQkJCSAgICAgIFwKK3sJCQkJCQkJCQkgICAgICBcCisgIGludCBlcnIgPSAwOwkJCQkJCQkJICAgICAgXAorICBwdGhfbXV0ZXhfdCAqbG9jayA9IG1hbGxvYyAoc2l6ZW9mIChwdGhfbXV0ZXhfdCkpOwkJCSAgICAgIFwKKwkJCQkJCQkJCSAgICAgIFwKKyAgaWYgKCFsb2NrKQkJCQkJCQkJICAgICAgXAorICAgIGVyciA9IEVOT01FTTsJCQkJCQkJICAgICAgXAorICBpZiAoIWVycikJCQkJCQkJCSAgICAgIFwKKyAgICB7CQkJCQkJCQkJICAgICAgXAorICAgICAgZXJyID0gcHRoX211dGV4X2luaXQgKGxvY2spOwkJCQkJICAgICAgXAorICAgICAgaWYgKGVyciA9PSBGQUxTRSkJCQkJCQkJICAgICAgXAorCWVyciA9IGVycm5vOwkJCQkJCQkgICAgICBcCisgICAgICBlbHNlCQkJCQkJCQkgICAgICBcCisJZXJyID0gMDsJCQkJCQkJICAgICAgXAorICAgICAgaWYgKGVycikJCQkJCQkJCSAgICAgIFwKKwlmcmVlIChsb2NrKTsJCQkJCQkJICAgICAgXAorICAgICAgZWxzZQkJCQkJCQkJICAgICAgXAorCSpwcml2ID0gbG9jazsJCQkJCQkJICAgICAgXAorICAgIH0JCQkJCQkJCQkgICAgICBcCisgIHJldHVybiBlcnI7CQkJCQkJCQkgICAgICBcCit9CQkJCQkJCQkJICAgICAgXAorc3RhdGljIGludCBnY3J5X3B0aF9tdXRleF9kZXN0cm95ICh2b2lkICoqbG9jaykJCQkJICAgICAgXAorICB7IC8qIEdOVSBQdGggaGFzIG5vIGRlc3RydWN0b3IgZnVuY3Rpb24uICAqLyBmcmVlICgqbG9jayk7IHJldHVybiAwOyB9ICAgICAgXAorc3RhdGljIGludCBnY3J5X3B0aF9tdXRleF9sb2NrICh2b2lkICoqbG9jaykJCQkJICAgICAgXAorICB7IHJldHVybiAoKHB0aF9tdXRleF9hY3F1aXJlICgqbG9jaywgMCwgTlVMTCkpID09IEZBTFNFKQkJICAgICAgXAorICAgICAgPyBlcnJubyA6IDA7IH0JCQkJCQkJICAgICAgXAorc3RhdGljIGludCBnY3J5X3B0aF9tdXRleF91bmxvY2sgKHZvaWQgKipsb2NrKQkJCQkgICAgICBcCisgIHsgcmV0dXJuICgocHRoX211dGV4X3JlbGVhc2UgKCpsb2NrKSkgPT0gRkFMU0UpCQkJICAgICAgXAorICAgICAgPyBlcnJubyA6IDA7IH0JCQkJCQkJICAgICAgXAorc3RhdGljIHNzaXplX3QgZ2NyeV9wdGhfcmVhZCAoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBuYnl0ZXMpCQkgICAgICBcCisgIHsgcmV0dXJuIHB0aF9yZWFkIChmZCwgYnVmLCBuYnl0ZXMpOyB9CQkJCSAgICAgIFwKK3N0YXRpYyBzc2l6ZV90IGdjcnlfcHRoX3dyaXRlIChpbnQgZmQsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IG5ieXRlcykJICAgICAgXAorICB7IHJldHVybiBwdGhfd3JpdGUgKGZkLCBidWYsIG5ieXRlcyk7IH0JCQkJICAgICAgXAorX0dDUllfVEhSRUFEX09QVElPTl9QVEhfSU1QTF9ORVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCQkJCQkJICAgICAgXAorLyogTm90ZTogR05VIFB0aCBpcyBtaXNzaW5nIHB0aF9zZW5kbXNnIGFuZCBwdGhfcmVjdm1zZy4gICovCQkgICAgICBcCitzdGF0aWMgc3RydWN0IGdjcnlfdGhyZWFkX2NicyBnY3J5X3RocmVhZHNfcHRoID0geyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChHQ1JZX1RIUkVBRF9PUFRJT05fUFRIIHwgKEdDUllfVEhSRUFEX09QVElPTl9WRVJTSU9OIDw8IDgpKSwgICAgICAgICAgICAgICBcCisgIGdjcnlfcHRoX2luaXQsIGdjcnlfcHRoX211dGV4X2luaXQsIGdjcnlfcHRoX211dGV4X2Rlc3Ryb3ksCQkgICAgICBcCisgIGdjcnlfcHRoX211dGV4X2xvY2ssIGdjcnlfcHRoX211dGV4X3VubG9jaywgZ2NyeV9wdGhfcmVhZCwgZ2NyeV9wdGhfd3JpdGUsICBcCisgIGdjcnlfcHRoX3NlbGVjdCwgZ2NyeV9wdGhfd2FpdHBpZCwgZ2NyeV9wdGhfYWNjZXB0LCBnY3J5X3B0aF9jb25uZWN0LCAgICAgICBcCisgIE5VTEwsIE5VTEwgfQorCisKKyNkZWZpbmUgR0NSWV9USFJFQURfT1BUSU9OX1BUSFJFQURfSU1QTAkJCQkJICAgICAgXAorc3RhdGljIGludCBnY3J5X3B0aHJlYWRfbXV0ZXhfaW5pdCAodm9pZCAqKnByaXYpCQkJICAgICAgXAorewkJCQkJCQkJCSAgICAgIFwKKyAgaW50IGVyciA9IDA7CQkJCQkJCQkgICAgICBcCisgIHB0aHJlYWRfbXV0ZXhfdCAqbG9jayA9IChwdGhyZWFkX211dGV4X3QqKW1hbGxvYyAoc2l6ZW9mIChwdGhyZWFkX211dGV4X3QpKTtcCisJCQkJCQkJCQkgICAgICBcCisgIGlmICghbG9jaykJCQkJCQkJCSAgICAgIFwKKyAgICBlcnIgPSBFTk9NRU07CQkJCQkJCSAgICAgIFwKKyAgaWYgKCFlcnIpCQkJCQkJCQkgICAgICBcCisgICAgewkJCQkJCQkJCSAgICAgIFwKKyAgICAgIGVyciA9IHB0aHJlYWRfbXV0ZXhfaW5pdCAobG9jaywgTlVMTCk7CQkJCSAgICAgIFwKKyAgICAgIGlmIChlcnIpCQkJCQkJCQkgICAgICBcCisJZnJlZSAobG9jayk7CQkJCQkJCSAgICAgIFwKKyAgICAgIGVsc2UJCQkJCQkJCSAgICAgIFwKKwkqcHJpdiA9IGxvY2s7CQkJCQkJCSAgICAgIFwKKyAgICB9CQkJCQkJCQkJICAgICAgXAorICByZXR1cm4gZXJyOwkJCQkJCQkJICAgICAgXAorfQkJCQkJCQkJCSAgICAgIFwKK3N0YXRpYyBpbnQgZ2NyeV9wdGhyZWFkX211dGV4X2Rlc3Ryb3kgKHZvaWQgKipsb2NrKQkJCSAgICAgIFwKKyAgeyBpbnQgZXJyID0gcHRocmVhZF9tdXRleF9kZXN0cm95ICgocHRocmVhZF9tdXRleF90KikqbG9jayk7ICAgICAgICAgICAgICAgIFwKKyAgICBmcmVlICgqbG9jayk7IHJldHVybiBlcnI7IH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBpbnQgZ2NyeV9wdGhyZWFkX211dGV4X2xvY2sgKHZvaWQgKipsb2NrKQkJCSAgICAgIFwKKyAgeyByZXR1cm4gcHRocmVhZF9tdXRleF9sb2NrICgocHRocmVhZF9tdXRleF90KikqbG9jayk7IH0JCSAgICAgIFwKK3N0YXRpYyBpbnQgZ2NyeV9wdGhyZWFkX211dGV4X3VubG9jayAodm9pZCAqKmxvY2spCQkJICAgICAgXAorICB7IHJldHVybiBwdGhyZWFkX211dGV4X3VubG9jayAoKHB0aHJlYWRfbXV0ZXhfdCopKmxvY2spOyB9CQkgICAgICBcCisJCQkJCQkJCQkgICAgICBcCitzdGF0aWMgc3RydWN0IGdjcnlfdGhyZWFkX2NicyBnY3J5X3RocmVhZHNfcHRocmVhZCA9IHsJCQkgICAgICBcCisgIChHQ1JZX1RIUkVBRF9PUFRJT05fUFRIUkVBRCB8IChHQ1JZX1RIUkVBRF9PUFRJT05fVkVSU0lPTiA8PCA4KSksICAgICAgICAgICBcCisgIE5VTEwsIGdjcnlfcHRocmVhZF9tdXRleF9pbml0LCBnY3J5X3B0aHJlYWRfbXV0ZXhfZGVzdHJveSwJCSAgICAgIFwKKyAgZ2NyeV9wdGhyZWFkX211dGV4X2xvY2ssIGdjcnlfcHRocmVhZF9tdXRleF91bmxvY2ssICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9CisKKwwKKy8qIFRoZSBkYXRhIG9iamVjdCB1c2VkIHRvIGhvbGQgYSBtdWx0aSBwcmVjaXNpb24gaW50ZWdlci4gICovCitzdHJ1Y3QgZ2NyeV9tcGk7Cit0eXBlZGVmIHN0cnVjdCBnY3J5X21waSAqZ2NyeV9tcGlfdDsKKworI2lmbmRlZiBHQ1JZUFRfTk9fREVQUkVDQVRFRAordHlwZWRlZiBzdHJ1Y3QgZ2NyeV9tcGkgKkdDUllfTVBJIF9HQ1JZX0dDQ19BVFRSX0RFUFJFQ0FURUQ7Cit0eXBlZGVmIHN0cnVjdCBnY3J5X21waSAqR2NyeU1QSSBfR0NSWV9HQ0NfQVRUUl9ERVBSRUNBVEVEOworI2VuZGlmCisKKwwKKworLyogQ2hlY2sgdGhhdCB0aGUgbGlicmFyeSBmdWxmaWxscyB0aGUgdmVyc2lvbiByZXF1aXJlbWVudC4gICovCitjb25zdCBjaGFyICpnY3J5X2NoZWNrX3ZlcnNpb24gKGNvbnN0IGNoYXIgKnJlcV92ZXJzaW9uKTsKKworLyogQ29kZXMgZm9yIGZ1bmN0aW9uIGRpc3BhdGNoZXJzLiAgKi8KKworLyogQ29kZXMgdXNlZCB3aXRoIHRoZSBnY3J5X2NvbnRyb2wgZnVuY3Rpb24uICovCitlbnVtIGdjcnlfY3RsX2NtZHMgCisgIHsKKyAgICBHQ1JZQ1RMX1NFVF9LRVkgID0gMSwKKyAgICBHQ1JZQ1RMX1NFVF9JViAgID0gMiwKKyAgICBHQ1JZQ1RMX0NGQl9TWU5DID0gMywKKyAgICBHQ1JZQ1RMX1JFU0VUICAgID0gNCwgICAvKiBlLmcuIGZvciBNRHMgKi8KKyAgICBHQ1JZQ1RMX0ZJTkFMSVpFID0gNSwKKyAgICBHQ1JZQ1RMX0dFVF9LRVlMRU4gPSA2LAorICAgIEdDUllDVExfR0VUX0JMS0xFTiA9IDcsCisgICAgR0NSWUNUTF9URVNUX0FMR08gPSA4LAorICAgIEdDUllDVExfSVNfU0VDVVJFID0gOSwKKyAgICBHQ1JZQ1RMX0dFVF9BU05PSUQgPSAxMCwKKyAgICBHQ1JZQ1RMX0VOQUJMRV9BTEdPID0gMTEsCisgICAgR0NSWUNUTF9ESVNBQkxFX0FMR08gPSAxMiwKKyAgICBHQ1JZQ1RMX0RVTVBfUkFORE9NX1NUQVRTID0gMTMsCisgICAgR0NSWUNUTF9EVU1QX1NFQ01FTV9TVEFUUyA9IDE0LAorICAgIEdDUllDVExfR0VUX0FMR09fTlBLRVkgICAgPSAxNSwKKyAgICBHQ1JZQ1RMX0dFVF9BTEdPX05TS0VZICAgID0gMTYsCisgICAgR0NSWUNUTF9HRVRfQUxHT19OU0lHTiAgICA9IDE3LAorICAgIEdDUllDVExfR0VUX0FMR09fTkVOQ1IgICAgPSAxOCwKKyAgICBHQ1JZQ1RMX1NFVF9WRVJCT1NJVFkgICAgID0gMTksCisgICAgR0NSWUNUTF9TRVRfREVCVUdfRkxBR1MgICA9IDIwLAorICAgIEdDUllDVExfQ0xFQVJfREVCVUdfRkxBR1MgPSAyMSwKKyAgICBHQ1JZQ1RMX1VTRV9TRUNVUkVfUk5EUE9PTD0gMjIsCisgICAgR0NSWUNUTF9EVU1QX01FTU9SWV9TVEFUUyA9IDIzLAorICAgIEdDUllDVExfSU5JVF9TRUNNRU0gICAgICAgPSAyNCwKKyAgICBHQ1JZQ1RMX1RFUk1fU0VDTUVNICAgICAgID0gMjUsCisgICAgR0NSWUNUTF9ESVNBQkxFX1NFQ01FTV9XQVJOID0gMjcsCisgICAgR0NSWUNUTF9TVVNQRU5EX1NFQ01FTV9XQVJOID0gMjgsCisgICAgR0NSWUNUTF9SRVNVTUVfU0VDTUVNX1dBUk4gID0gMjksCisgICAgR0NSWUNUTF9EUk9QX1BSSVZTICAgICAgICAgID0gMzAsCisgICAgR0NSWUNUTF9FTkFCTEVfTV9HVUFSRCAgICAgID0gMzEsCisgICAgR0NSWUNUTF9TVEFSVF9EVU1QICAgICAgICAgID0gMzIsCisgICAgR0NSWUNUTF9TVE9QX0RVTVAgICAgICAgICAgID0gMzMsCisgICAgR0NSWUNUTF9HRVRfQUxHT19VU0FHRSAgICAgID0gMzQsCisgICAgR0NSWUNUTF9JU19BTEdPX0VOQUJMRUQgICAgID0gMzUsCisgICAgR0NSWUNUTF9ESVNBQkxFX0lOVEVSTkFMX0xPQ0tJTkcgPSAzNiwKKyAgICBHQ1JZQ1RMX0RJU0FCTEVfU0VDTUVNICAgICAgPSAzNywKKyAgICBHQ1JZQ1RMX0lOSVRJQUxJWkFUSU9OX0ZJTklTSEVEID0gMzgsCisgICAgR0NSWUNUTF9JTklUSUFMSVpBVElPTl9GSU5JU0hFRF9QID0gMzksCisgICAgR0NSWUNUTF9BTllfSU5JVElBTElaQVRJT05fUCA9IDQwLAorICAgIEdDUllDVExfU0VUX0NCQ19DVFMgPSA0MSwKKyAgICBHQ1JZQ1RMX1NFVF9DQkNfTUFDID0gNDIsCisgICAgR0NSWUNUTF9TRVRfQ1RSID0gNDMsCisgICAgR0NSWUNUTF9FTkFCTEVfUVVJQ0tfUkFORE9NID0gNDQsCisgICAgR0NSWUNUTF9TRVRfUkFORE9NX1NFRURfRklMRSA9IDQ1LAorICAgIEdDUllDVExfVVBEQVRFX1JBTkRPTV9TRUVEX0ZJTEUgPSA0NiwKKyAgICBHQ1JZQ1RMX1NFVF9USFJFQURfQ0JTID0gNDcsCisgICAgR0NSWUNUTF9GQVNUX1BPTEwgPSA0OCwKKyAgICBHQ1JZQ1RMX1NFVF9SQU5ET01fREFFTU9OX1NPQ0tFVCA9IDQ5LAorICAgIEdDUllDVExfVVNFX1JBTkRPTV9EQUVNT04gPSA1MCwKKyAgICBHQ1JZQ1RMX0ZBS0VEX1JBTkRPTV9QID0gNTEsCisgICAgR0NSWUNUTF9TRVRfUk5ERUdEX1NPQ0tFVCA9IDUyLAorICAgIEdDUllDVExfUFJJTlRfQ09ORklHID0gNTMsCisgICAgR0NSWUNUTF9PUEVSQVRJT05BTF9QID0gNTQsCisgICAgR0NSWUNUTF9GSVBTX01PREVfUCA9IDU1LAorICAgIEdDUllDVExfRk9SQ0VfRklQU19NT0RFID0gNTYsCisgICAgR0NSWUNUTF9TRUxGVEVTVCA9IDU3CisgICAgLyogTm90ZTogNTggLi4gNjIgYXJlIHVzZWQgaW50ZXJuYWxseS4gICovCisgIH07CisKKy8qIFBlcmZvcm0gdmFyaW91cyBvcGVyYXRpb25zIGRlZmluZWQgYnkgQ01ELiAqLworZ2NyeV9lcnJvcl90IGdjcnlfY29udHJvbCAoZW51bSBnY3J5X2N0bF9jbWRzIENNRCwgLi4uKTsKKworDAorLyogUy1leHByZXNzaW9uIG1hbmFnZW1lbnQuICovIAorCisvKiBUaGUgb2JqZWN0IHRvIHJlcHJlc2VudCBhbiBTLWV4cHJlc3Npb24gYXMgdXNlZCB3aXRoIHRoZSBwdWJsaWMga2V5CisgICBmdW5jdGlvbnMuICAqLworc3RydWN0IGdjcnlfc2V4cDsKK3R5cGVkZWYgc3RydWN0IGdjcnlfc2V4cCAqZ2NyeV9zZXhwX3Q7CisKKyNpZm5kZWYgR0NSWVBUX05PX0RFUFJFQ0FURUQKK3R5cGVkZWYgc3RydWN0IGdjcnlfc2V4cCAqR0NSWV9TRVhQIF9HQ1JZX0dDQ19BVFRSX0RFUFJFQ0FURUQ7Cit0eXBlZGVmIHN0cnVjdCBnY3J5X3NleHAgKkdjcnlTZXhwIF9HQ1JZX0dDQ19BVFRSX0RFUFJFQ0FURUQ7CisjZW5kaWYKKworLyogVGhlIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIFMtZXhwcmVzc2lvbiBmb3JtYXQuICovCitlbnVtIGdjcnlfc2V4cF9mb3JtYXQKKyAgeworICAgIEdDUllTRVhQX0ZNVF9ERUZBVUxUICAgPSAwLAorICAgIEdDUllTRVhQX0ZNVF9DQU5PTiAgICAgPSAxLAorICAgIEdDUllTRVhQX0ZNVF9CQVNFNjQgICAgPSAyLAorICAgIEdDUllTRVhQX0ZNVF9BRFZBTkNFRCAgPSAzCisgIH07CisKKy8qIENyZWF0ZSBhbiBuZXcgUy1leHByZXNzaW9uIG9iamVjdCBmcm9tIEJVRkZFUiBvZiBzaXplIExFTkdUSCBhbmQKKyAgIHJldHVybiBpdCBpbiBSRVRTRVhQLiAgV2l0aCBBVVRPREVURUNUIHNldCB0byAwIHRoZSBkYXRhIGluIEJVRkZFUgorICAgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gY2Fub25pemVkIGZvcm1hdC4gICovCitnY3J5X2Vycm9yX3QgZ2NyeV9zZXhwX25ldyAoZ2NyeV9zZXhwX3QgKnJldHNleHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdXRvZGV0ZWN0KTsKKworIC8qIFNhbWUgYXMgZ2NyeV9zZXhwX25ldyBidXQgYWxsb3dzIHRvIHBhc3MgYSBGUkVFRk5DIHdoaWNoIGhhcyB0aGUKKyAgICBlZmZlY3QgdG8gdHJhbnNmZXIgb3duZXJzaGlwIG9mIEJVRkZFUiB0byB0aGUgY3JlYXRlZCBvYmplY3QuICAqLworZ2NyeV9lcnJvcl90IGdjcnlfc2V4cF9jcmVhdGUgKGdjcnlfc2V4cF90ICpyZXRzZXhwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXV0b2RldGVjdCwgdm9pZCAoKmZyZWVmbmMpICh2b2lkICopKTsKKworLyogU2NhbiBCVUZGRVIgYW5kIHJldHVybiBhIG5ldyBTLWV4cHJlc3Npb24gb2JqZWN0IGluIFJFVFNFWFAuICBUaGlzCisgICBmdW5jdGlvbiBleHBlY3RzIGEgcHJpbnRmIGxpa2Ugc3RyaW5nIGluIEJVRkZFUi4gICovCitnY3J5X2Vycm9yX3QgZ2NyeV9zZXhwX3NzY2FuIChnY3J5X3NleHBfdCAqcmV0c2V4cCwgc2l6ZV90ICplcnJvZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpidWZmZXIsIHNpemVfdCBsZW5ndGgpOworCisvKiBTYW1lIGFzIGdjcnlfc2V4cF9zc2NhbiBidXQgZXhwZWN0cyBhIHN0cmluZyBpbiBGT1JNQVQgYW5kIGNhbiB0aHVzCisgICBvbmx5IGJlIHVzZWQgZm9yIGNlcnRhaW4gZW5jb2RpbmdzLiAgKi8KK2djcnlfZXJyb3JfdCBnY3J5X3NleHBfYnVpbGQgKGdjcnlfc2V4cF90ICpyZXRzZXhwLCBzaXplX3QgKmVycm9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKKworLyogTGlrZSBnY3J5X3NleHBfYnVpbGQsIGJ1dCB1c2VzIGFuIGFycmF5IGluc3RlYWQgb2YgdmFyaWFibGUKKyAgIGZ1bmN0aW9uIGFyZ3VtZW50cy4gICovCitnY3J5X2Vycm9yX3QgZ2NyeV9zZXhwX2J1aWxkX2FycmF5IChnY3J5X3NleHBfdCAqcmV0c2V4cCwgc2l6ZV90ICplcnJvZmYsCisJCQkJICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgdm9pZCAqKmFyZ19saXN0KTsKKworLyogUmVsZWFzZSB0aGUgUy1leHByZXNzaW9uIG9iamVjdCBTRVhQICovCit2b2lkIGdjcnlfc2V4cF9yZWxlYXNlIChnY3J5X3NleHBfdCBzZXhwKTsKKworLyogQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgYW4gY2Fub25pemVkIFMtZXhwcmVzaW9uIGluIEJVRkZFUiBhbmQKKyAgIGNoZWNrIGZvciBhIHZhbGlkIGVuY29kaW5nLiAqLworc2l6ZV90IGdjcnlfc2V4cF9jYW5vbl9sZW4gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICplcnJvZmYsIGdjcnlfZXJyb3JfdCAqZXJyY29kZSk7CisKKy8qIENvcGllcyB0aGUgUy1leHByZXNzaW9uIG9iamVjdCBTRVhQIGludG8gQlVGRkVSIHVzaW5nIHRoZSBmb3JtYXQKKyAgIHNwZWNpZmllZCBpbiBNT0RFLiAgKi8KK3NpemVfdCBnY3J5X3NleHBfc3ByaW50IChnY3J5X3NleHBfdCBzZXhwLCBpbnQgbW9kZSwgdm9pZCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBtYXhsZW5ndGgpOworCisvKiBEdW1wcyB0aGUgUy1leHByZXNzaW9uIG9iamVjdCBBIGluIGEgZm9ybWF0IHN1aXRhYmxlIGZvciBkZWJ1Z2dpbmcKKyAgIHRvIExpYmdjcnlwdCdzIGxvZ2dpbmcgc3RyZWFtLiAgKi8KK3ZvaWQgZ2NyeV9zZXhwX2R1bXAgKGNvbnN0IGdjcnlfc2V4cF90IGEpOworCitnY3J5X3NleHBfdCBnY3J5X3NleHBfY29ucyAoY29uc3QgZ2NyeV9zZXhwX3QgYSwgY29uc3QgZ2NyeV9zZXhwX3QgYik7CitnY3J5X3NleHBfdCBnY3J5X3NleHBfYWxpc3QgKGNvbnN0IGdjcnlfc2V4cF90ICphcnJheSk7CitnY3J5X3NleHBfdCBnY3J5X3NleHBfdmxpc3QgKGNvbnN0IGdjcnlfc2V4cF90IGEsIC4uLik7CitnY3J5X3NleHBfdCBnY3J5X3NleHBfYXBwZW5kIChjb25zdCBnY3J5X3NleHBfdCBhLCBjb25zdCBnY3J5X3NleHBfdCBuKTsKK2djcnlfc2V4cF90IGdjcnlfc2V4cF9wcmVwZW5kIChjb25zdCBnY3J5X3NleHBfdCBhLCBjb25zdCBnY3J5X3NleHBfdCBuKTsKKworLyogU2NhbiB0aGUgUy1leHByZXNzaW9uIGZvciBhIHN1Ymxpc3Qgd2l0aCBhIHR5cGUgKHRoZSBjYXIgb2YgdGhlCisgICBsaXN0KSBtYXRjaGluZyB0aGUgc3RyaW5nIFRPS0VOLiAgSWYgVE9LTEVOIGlzIG5vdCAwLCB0aGUgdG9rZW4gaXMKKyAgIGFzc3VtZWQgdG8gYmUgcmF3IG1lbW9yeSBvZiB0aGlzIGxlbmd0aC4gIFRoZSBmdW5jdGlvbiByZXR1cm5zIGEKKyAgIG5ld2x5IGFsbG9jYXRlZCBTLWV4cHJlc3Npb24gY29uc2lzdGluZyBvZiB0aGUgZm91bmQgc3VibGlzdCBvcgorICAgYE5VTEwnIHdoZW4gbm90IGZvdW5kLiAgKi8KK2djcnlfc2V4cF90IGdjcnlfc2V4cF9maW5kX3Rva2VuIChnY3J5X3NleHBfdCBsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0b2ssIHNpemVfdCB0b2tsZW4pOworLyogUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIExJU1QuICBGb3IgYSB2YWxpZCBTLWV4cHJlc3Npb24gdGhpcworICAgc2hvdWxkIGJlIGF0IGxlYXN0IDEuICAqLworaW50IGdjcnlfc2V4cF9sZW5ndGggKGNvbnN0IGdjcnlfc2V4cF90IGxpc3QpOworCisvKiBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyBTLWV4cHJlc3Npb24gZnJvbSB0aGUgZWxlbWVudCB3aXRoIGluZGV4CisgICBOVU1CRVIgaW4gTElTVC4gIE5vdGUgdGhhdCB0aGUgZmlyc3QgZWxlbWVudCBoYXMgdGhlIGluZGV4IDAuICBJZgorICAgdGhlcmUgaXMgbm8gc3VjaCBlbGVtZW50LCBgTlVMTCcgaXMgcmV0dXJuZWQuICAqLworZ2NyeV9zZXhwX3QgZ2NyeV9zZXhwX250aCAoY29uc3QgZ2NyeV9zZXhwX3QgbGlzdCwgaW50IG51bWJlcik7CisKKy8qIENyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IFMtZXhwcmVzc2lvbiBmcm9tIHRoZSBmaXJzdCBlbGVtZW50IGluCisgICBMSVNUOyB0aGlzIGNhbGxlZCB0aGUgInR5cGUiIGFuZCBzaG91bGQgYWx3YXlzIGV4aXN0IGFuZCBiZSBhCisgICBzdHJpbmcuIGBOVUxMJyBpcyByZXR1cm5lZCBpbiBjYXNlIG9mIGEgcHJvYmxlbS4gICovCitnY3J5X3NleHBfdCBnY3J5X3NleHBfY2FyIChjb25zdCBnY3J5X3NleHBfdCBsaXN0KTsKKworLyogQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgbGlzdCBmb3JtIGFsbCBlbGVtZW50cyBleGNlcHQgZm9yIHRoZSBmaXJzdAorICAgb25lLiAgTm90ZSwgdGhhdCB0aGlzIGZ1bmN0aW9uIG1heSByZXR1cm4gYW4gaW52YWxpZCBTLWV4cHJlc3Npb24KKyAgIGJlY2F1c2UgaXQgaXMgbm90IGd1YXJhbnRlZWQsIHRoYXQgdGhlIHR5cGUgZXhpc3RzIGFuZCBpcyBhIHN0cmluZy4KKyAgIEhvd2V2ZXIsIGZvciBwYXJzaW5nIGEgY29tcGxleCBTLWV4cHJlc3Npb24gaXQgbWlnaHQgYmUgdXNlZnVsIGZvcgorICAgaW50ZXJtZWRpYXRlIGxpc3RzLiAgUmV0dXJucyBgTlVMTCcgb24gZXJyb3IuICAqLworZ2NyeV9zZXhwX3QgZ2NyeV9zZXhwX2NkciAoY29uc3QgZ2NyeV9zZXhwX3QgbGlzdCk7CisKK2djcnlfc2V4cF90IGdjcnlfc2V4cF9jYWRyIChjb25zdCBnY3J5X3NleHBfdCBsaXN0KTsKKworCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZ2V0IGRhdGEgZnJvbSBhIExJU1QuICBBIHBvaW50ZXIgdG8gdGhlCisgICBhY3R1YWwgZGF0YSB3aXRoIGluZGV4IE5VTUJFUiBpcyByZXR1cm5lZCBhbmQgdGhlIGxlbmd0aCBvZiB0aGlzCisgICBkYXRhIHdpbGwgYmUgc3RvcmVkIHRvIERBVEFMRU4uICBJZiB0aGVyZSBpcyBubyBkYXRhIGF0IHRoZSBnaXZlbgorICAgaW5kZXggb3IgdGhlIGluZGV4IHJlcHJlc2VudHMgYW5vdGhlciBsaXN0LCBgTlVMTCcgaXMgcmV0dXJuZWQuCisgICAqTm90ZToqIFRoZSByZXR1cm5lZCBwb2ludGVyIGlzIHZhbGlkIGFzIGxvbmcgYXMgTElTVCBpcyBub3QKKyAgIG1vZGlmaWVkIG9yIHJlbGVhc2VkLiAgKi8KK2NvbnN0IGNoYXIgKmdjcnlfc2V4cF9udGhfZGF0YSAoY29uc3QgZ2NyeV9zZXhwX3QgbGlzdCwgaW50IG51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpkYXRhbGVuKTsKKworLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGdldCBhbmQgY29udmVydCBkYXRhIGZyb20gYSBMSVNULiAgVGhlCisgICBkYXRhIGlzIGFzc3VtZWQgdG8gYmUgYSBOdWwgdGVybWluYXRlZCBzdHJpbmcuICBUaGUgY2FsbGVyIG11c3QKKyAgIHJlbGVhc2UgdGhlIHJldHVybmVkIHZhbHVlIHVzaW5nIGBnY3J5X2ZyZWUnLiAgSWYgdGhlcmUgaXMgbm8gZGF0YQorICAgYXQgdGhlIGdpdmVuIGluZGV4LCB0aGUgaW5kZXggcmVwcmVzZW50cyBhIGxpc3Qgb3IgdGhlIHZhbHVlIGNhbid0CisgICBiZSBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcsIGBOVUxMJyBpcyByZXR1cm5lZC4gICovCitjaGFyICpnY3J5X3NleHBfbnRoX3N0cmluZyAoZ2NyeV9zZXhwX3QgbGlzdCwgaW50IG51bWJlcik7CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBnZXQgYW5kIGNvbnZlcnQgZGF0YSBmcm9tIGEgTElTVC4gVGhpcworICAgZGF0YSBpcyBhc3N1bWVkIHRvIGJlIGFuIE1QSSBzdG9yZWQgaW4gdGhlIGZvcm1hdCBkZXNjcmliZWQgYnkKKyAgIE1QSUZNVCBhbmQgcmV0dXJuZWQgYXMgYSBzdGFuZGFyZCBMaWJnY3J5cHQgTVBJLiAgVGhlIGNhbGxlciBtdXN0CisgICByZWxlYXNlIHRoaXMgcmV0dXJuZWQgdmFsdWUgdXNpbmcgYGdjcnlfbXBpX3JlbGVhc2UnLiAgSWYgdGhlcmUgaXMKKyAgIG5vIGRhdGEgYXQgdGhlIGdpdmVuIGluZGV4LCB0aGUgaW5kZXggcmVwcmVzZW50cyBhIGxpc3Qgb3IgdGhlCisgICB2YWx1ZSBjYW4ndCBiZSBjb252ZXJ0ZWQgdG8gYW4gTVBJLCBgTlVMTCcgaXMgcmV0dXJuZWQuICAqLworZ2NyeV9tcGlfdCBnY3J5X3NleHBfbnRoX21waSAoZ2NyeV9zZXhwX3QgbGlzdCwgaW50IG51bWJlciwgaW50IG1waWZtdCk7CisKKworDAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgTXVsdGkgUHJlY2lzaW9uIEludGVnZXIgRnVuY3Rpb25zICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBEaWZmZXJlbnQgZm9ybWF0cyBvZiBleHRlcm5hbCBiaWcgaW50ZWdlciByZXByZXNlbnRhdGlvbi4gKi8KK2VudW0gZ2NyeV9tcGlfZm9ybWF0IAorICB7CisgICAgR0NSWU1QSV9GTVRfTk9ORT0gMCwKKyAgICBHQ1JZTVBJX0ZNVF9TVEQgPSAxLCAgICAvKiBUd29zIGNvbXBsZW1lbnQgc3RvcmVkIHdpdGhvdXQgbGVuZ3RoLiAgKi8KKyAgICBHQ1JZTVBJX0ZNVF9QR1AgPSAyLCAgICAvKiBBcyB1c2VkIGJ5IE9wZW5QR1AgKHVuc2lnbmVkIG9ubHkpLiAgKi8KKyAgICBHQ1JZTVBJX0ZNVF9TU0ggPSAzLCAgICAvKiBBcyB1c2VkIGJ5IFNTSCAobGlrZSBTVEQgYnV0IHdpdGggbGVuZ3RoKS4gICovCisgICAgR0NSWU1QSV9GTVRfSEVYID0gNCwgICAgLyogSGV4IGZvcm1hdC4gKi8KKyAgICBHQ1JZTVBJX0ZNVF9VU0cgPSA1ICAgICAvKiBMaWtlIFNURCBidXQgdW5zaWduZWQuICovCisgIH07CisKKy8qIEZsYWdzIHVzZWQgZm9yIGNyZWF0aW5nIGJpZyBpbnRlZ2Vycy4gICovCitlbnVtIGdjcnlfbXBpX2ZsYWcgCisgIHsKKyAgICBHQ1JZTVBJX0ZMQUdfU0VDVVJFID0gMSwgIC8qIEFsbG9jYXRlIHRoZSBudW1iZXIgaW4gInNlY3VyZSIgbWVtb3J5LiAgKi8KKyAgICBHQ1JZTVBJX0ZMQUdfT1BBUVVFID0gMiAgIC8qIFRoZSBudW1iZXIgaXMgbm90IGEgcmVhbCBvbmUgYnV0IGp1c3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgd2F5IHRvIHN0b3JlIHNvbWUgYnl0ZXMuICBUaGlzIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VmdWwgZm9yIGVuY3J5cHRlZCBiaWcgaW50ZWdlcnMuICAqLworICB9OworCisKKy8qIEFsbG9jYXRlIGEgbmV3IGJpZyBpbnRlZ2VyIG9iamVjdCwgaW5pdGlhbGl6ZSBpdCB3aXRoIDAgYW5kCisgICBpbml0aWFsbHkgYWxsb2NhdGUgbWVtb3J5IGZvciBhIG51bWJlciBvZiBhdCBsZWFzdCBOQklUUy4gKi8KK2djcnlfbXBpX3QgZ2NyeV9tcGlfbmV3ICh1bnNpZ25lZCBpbnQgbmJpdHMpOworCisvKiBTYW1lIGFzIGdjcnlfbXBpX25ldygpIGJ1dCBhbGxvY2F0ZSBpbiAic2VjdXJlIiBtZW1vcnkuICovCitnY3J5X21waV90IGdjcnlfbXBpX3NuZXcgKHVuc2lnbmVkIGludCBuYml0cyk7CisKKy8qIFJlbGVhc2UgdGhlIG51bWJlciBBIGFuZCBmcmVlIGFsbCBhc3NvY2lhdGVkIHJlc291cmNlcy4gKi8KK3ZvaWQgZ2NyeV9tcGlfcmVsZWFzZSAoZ2NyeV9tcGlfdCBhKTsKKworLyogQ3JlYXRlIGEgbmV3IG51bWJlciB3aXRoIHRoZSBzYW1lIHZhbHVlIGFzIEEuICovCitnY3J5X21waV90IGdjcnlfbXBpX2NvcHkgKGNvbnN0IGdjcnlfbXBpX3QgYSk7CisKKy8qIFN0b3JlIHRoZSBiaWcgaW50ZWdlciB2YWx1ZSBVIGluIFcuICovCitnY3J5X21waV90IGdjcnlfbXBpX3NldCAoZ2NyeV9tcGlfdCB3LCBjb25zdCBnY3J5X21waV90IHUpOworCisvKiBTdG9yZSB0aGUgdW5zaWduZWQgaW50ZWdlciB2YWx1ZSBVIGluIFcuICovCitnY3J5X21waV90IGdjcnlfbXBpX3NldF91aSAoZ2NyeV9tcGlfdCB3LCB1bnNpZ25lZCBsb25nIHUpOworCisvKiBTd2FwIHRoZSB2YWx1ZXMgb2YgQSBhbmQgQi4gKi8KK3ZvaWQgZ2NyeV9tcGlfc3dhcCAoZ2NyeV9tcGlfdCBhLCBnY3J5X21waV90IGIpOworCisvKiBDb21wYXJlIHRoZSBiaWcgaW50ZWdlciBudW1iZXIgVSBhbmQgViByZXR1cm5pbmcgMCBmb3IgZXF1YWxpdHksIGEKKyAgIHBvc2l0aXZlIHZhbHVlIGZvciBVID4gViBhbmQgYSBuZWdhdGl2ZSBmb3IgVSA8IFYuICovCitpbnQgZ2NyeV9tcGlfY21wIChjb25zdCBnY3J5X21waV90IHUsIGNvbnN0IGdjcnlfbXBpX3Qgdik7CisKKy8qIENvbXBhcmUgdGhlIGJpZyBpbnRlZ2VyIG51bWJlciBVIHdpdGggdGhlIHVuc2lnbmVkIGludGVnZXIgVgorICAgcmV0dXJuaW5nIDAgZm9yIGVxdWFsaXR5LCBhIHBvc2l0aXZlIHZhbHVlIGZvciBVID4gViBhbmQgYSBuZWdhdGl2ZQorICAgZm9yIFUgPCBWLiAqLworaW50IGdjcnlfbXBpX2NtcF91aSAoY29uc3QgZ2NyeV9tcGlfdCB1LCB1bnNpZ25lZCBsb25nIHYpOworCisvKiBDb252ZXJ0IHRoZSBleHRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBhbiBpbnRlZ2VyIHN0b3JlZCBpbiBCVUZGRVIKKyAgIHdpdGggYSBsZW5ndGggb2YgQlVGTEVOIGludG8gYSBuZXdseSBjcmVhdGUgTVBJIHJldHVybmVkIGluCisgICBSRVRfTVBJLiAgSWYgTlNDQU5ORUQgaXMgbm90IE5VTEwsIGl0IHdpbGwgcmVjZWl2ZSB0aGUgbnVtYmVyIG9mCisgICBieXRlcyBhY3R1YWxseSBzY2FubmVkIGFmdGVyIGEgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uICovCitnY3J5X2Vycm9yX3QgZ2NyeV9tcGlfc2NhbiAoZ2NyeV9tcGlfdCAqcmV0X21waSwgZW51bSBnY3J5X21waV9mb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ1ZmxlbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpuc2Nhbm5lZCk7CisKKy8qIENvbnZlcnQgdGhlIGJpZyBpbnRlZ2VyIEEgaW50byB0aGUgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24KKyAgIGRlc2NyaWJlZCBieSBGT1JNQVQgYW5kIHN0b3JlIGl0IGluIHRoZSBwcm92aWRlZCBCVUZGRVIgd2hpY2ggaGFzCisgICBiZWVuIGFsbG9jYXRlZCBieSB0aGUgdXNlciB3aXRoIGEgc2l6ZSBvZiBCVUZMRU4gYnl0ZXMuICBOV1JJVFRFTgorICAgcmVjZWl2ZXMgdGhlIGFjdHVhbCBsZW5ndGggb2YgdGhlIGV4dGVybmFsIHJlcHJlc2VudGF0aW9uIHVubGVzcyBpdAorICAgaGFzIGJlZW4gcGFzc2VkIGFzIE5VTEwuICovCitnY3J5X2Vycm9yX3QgZ2NyeV9tcGlfcHJpbnQgKGVudW0gZ2NyeV9tcGlfZm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKm53cml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY3J5X21waV90IGEpOworCisvKiBDb252ZXJ0IHRoZSBiaWcgaW50ZWdlciBBIGludCB0aGUgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24gZGVzY3JpYmVkCisgICBieSBGT1JNQVQgYW5kIHN0b3JlIGl0IGluIGEgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlciB3aGljaCBhZGRyZXNzCisgICB3aWxsIGJlIHB1dCBpbnRvIEJVRkZFUi4gIE5XUklUVEVOIHJlY2VpdmVzIHRoZSBhY3R1YWwgbGVuZ3RocyBvZiB0aGUKKyAgIGV4dGVybmFsIHJlcHJlc2VudGF0aW9uLiAqLworZ2NyeV9lcnJvcl90IGdjcnlfbXBpX2FwcmludCAoZW51bSBnY3J5X21waV9mb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqKmJ1ZmZlciwgc2l6ZV90ICpud3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjcnlfbXBpX3QgYSk7CisKKy8qIER1bXAgdGhlIHZhbHVlIG9mIEEgaW4gYSBmb3JtYXQgc3VpdGFibGUgZm9yIGRlYnVnZ2luZyB0bworICAgTGliZ2NyeXB0J3MgbG9nZ2luZyBzdHJlYW0uICBOb3RlIHRoYXQgb25lIGxlYWRpbmcgc3BhY2UgYnV0IG5vCisgICB0cmFpbGluZyBzcGFjZSBvciBsaW5lZmVlZCB3aWxsIGJlIHByaW50ZWQuICBJdCBpcyBva2F5IHRvIHBhc3MKKyAgIE5VTEwgZm9yIEEuICovCit2b2lkIGdjcnlfbXBpX2R1bXAgKGNvbnN0IGdjcnlfbXBpX3QgYSk7CisKKworLyogVyA9IFUgKyBWLiAgKi8KK3ZvaWQgZ2NyeV9tcGlfYWRkIChnY3J5X21waV90IHcsIGdjcnlfbXBpX3QgdSwgZ2NyeV9tcGlfdCB2KTsKKworLyogVyA9IFUgKyBWLiAgViBpcyBhbiB1bnNpZ25lZCBpbnRlZ2VyLiAqLwordm9pZCBnY3J5X21waV9hZGRfdWkgKGdjcnlfbXBpX3QgdywgZ2NyeV9tcGlfdCB1LCB1bnNpZ25lZCBsb25nIHYpOworCisvKiBXID0gVSArIFYgbW9kIE0uICovCit2b2lkIGdjcnlfbXBpX2FkZG0gKGdjcnlfbXBpX3QgdywgZ2NyeV9tcGlfdCB1LCBnY3J5X21waV90IHYsIGdjcnlfbXBpX3QgbSk7CisKKy8qIFcgPSBVIC0gVi4gKi8KK3ZvaWQgZ2NyeV9tcGlfc3ViIChnY3J5X21waV90IHcsIGdjcnlfbXBpX3QgdSwgZ2NyeV9tcGlfdCB2KTsKKworLyogVyA9IFUgLSBWLiAgViBpcyBhbiB1bnNpZ25lZCBpbnRlZ2VyLiAqLwordm9pZCBnY3J5X21waV9zdWJfdWkgKGdjcnlfbXBpX3QgdywgZ2NyeV9tcGlfdCB1LCB1bnNpZ25lZCBsb25nIHYgKTsKKworLyogVyA9IFUgLSBWIG1vZCBNICovCit2b2lkIGdjcnlfbXBpX3N1Ym0gKGdjcnlfbXBpX3QgdywgZ2NyeV9tcGlfdCB1LCBnY3J5X21waV90IHYsIGdjcnlfbXBpX3QgbSk7CisKKy8qIFcgPSBVICogVi4gKi8KK3ZvaWQgZ2NyeV9tcGlfbXVsIChnY3J5X21waV90IHcsIGdjcnlfbXBpX3QgdSwgZ2NyeV9tcGlfdCB2KTsKKworLyogVyA9IFUgKiBWLiAgViBpcyBhbiB1bnNpZ25lZCBpbnRlZ2VyLiAqLwordm9pZCBnY3J5X21waV9tdWxfdWkgKGdjcnlfbXBpX3QgdywgZ2NyeV9tcGlfdCB1LCB1bnNpZ25lZCBsb25nIHYgKTsKKworLyogVyA9IFUgKiBWIG1vZCBNLiAqLwordm9pZCBnY3J5X21waV9tdWxtIChnY3J5X21waV90IHcsIGdjcnlfbXBpX3QgdSwgZ2NyeV9tcGlfdCB2LCBnY3J5X21waV90IG0pOworCisvKiBXID0gVSAqICgyIF4gQ05UKS4gKi8KK3ZvaWQgZ2NyeV9tcGlfbXVsXzJleHAgKGdjcnlfbXBpX3QgdywgZ2NyeV9tcGlfdCB1LCB1bnNpZ25lZCBsb25nIGNudCk7CisKKy8qIFEgPSBESVZJREVORCAvIERJVklTT1IsIFIgPSBESVZJREVORCAlIERJVklTT1IsCisgICBRIG9yIFIgbWF5IGJlIHBhc3NlZCBhcyBOVUxMLiAgUk9VTkQgc2hvdWxkIGJlIG5lZ2F0aXZlIG9yIDAuICovCit2b2lkIGdjcnlfbXBpX2RpdiAoZ2NyeV9tcGlfdCBxLCBnY3J5X21waV90IHIsCisgICAgICAgICAgICAgICAgICAgZ2NyeV9tcGlfdCBkaXZpZGVuZCwgZ2NyeV9tcGlfdCBkaXZpc29yLCBpbnQgcm91bmQpOworCisvKiBSID0gRElWSURFTkQgJSBESVZJU09SICovCit2b2lkIGdjcnlfbXBpX21vZCAoZ2NyeV9tcGlfdCByLCBnY3J5X21waV90IGRpdmlkZW5kLCBnY3J5X21waV90IGRpdmlzb3IpOworCisvKiBXID0gQiBeIEUgbW9kIE0uICovCit2b2lkIGdjcnlfbXBpX3Bvd20gKGdjcnlfbXBpX3QgdywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NyeV9tcGlfdCBiLCBjb25zdCBnY3J5X21waV90IGUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjcnlfbXBpX3QgbSk7CisKKy8qIFNldCBHIHRvIHRoZSBncmVhdGVzdCBjb21tb24gZGl2aXNvciBvZiBBIGFuZCBCLiAgCisgICBSZXR1cm4gdHJ1ZSBpZiB0aGUgRyBpcyAxLiAqLworaW50IGdjcnlfbXBpX2djZCAoZ2NyeV9tcGlfdCBnLCBnY3J5X21waV90IGEsIGdjcnlfbXBpX3QgYik7CisKKy8qIFNldCBYIHRvIHRoZSBtdWx0aXBsaWNhdGl2ZSBpbnZlcnNlIG9mIEEgbW9kIE0uCisgICBSZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgZXhpc3RzLiAqLworaW50IGdjcnlfbXBpX2ludm0gKGdjcnlfbXBpX3QgeCwgZ2NyeV9tcGlfdCBhLCBnY3J5X21waV90IG0pOworCisKKy8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJpdHMgcmVxdWlyZWQgdG8gcmVwcmVzZW50IEEuICovCit1bnNpZ25lZCBpbnQgZ2NyeV9tcGlfZ2V0X25iaXRzIChnY3J5X21waV90IGEpOworCisvKiBSZXR1cm4gdHJ1ZSB3aGVuIGJpdCBudW1iZXIgTiAoY291bnRpbmcgZnJvbSAwKSBpcyBzZXQgaW4gQS4gKi8KK2ludCAgICAgIGdjcnlfbXBpX3Rlc3RfYml0IChnY3J5X21waV90IGEsIHVuc2lnbmVkIGludCBuKTsKKworLyogU2V0IGJpdCBudW1iZXIgTiBpbiBBLiAqLwordm9pZCAgICAgZ2NyeV9tcGlfc2V0X2JpdCAoZ2NyeV9tcGlfdCBhLCB1bnNpZ25lZCBpbnQgbik7CisKKy8qIENsZWFyIGJpdCBudW1iZXIgTiBpbiBBLiAqLwordm9pZCAgICAgZ2NyeV9tcGlfY2xlYXJfYml0IChnY3J5X21waV90IGEsIHVuc2lnbmVkIGludCBuKTsKKworLyogU2V0IGJpdCBudW1iZXIgTiBpbiBBIGFuZCBjbGVhciBhbGwgYml0cyBncmVhdGVyIHRoYW4gTi4gKi8KK3ZvaWQgICAgIGdjcnlfbXBpX3NldF9oaWdoYml0IChnY3J5X21waV90IGEsIHVuc2lnbmVkIGludCBuKTsKKworLyogQ2xlYXIgYml0IG51bWJlciBOIGluIEEgYW5kIGFsbCBiaXRzIGdyZWF0ZXIgdGhhbiBOLiAqLwordm9pZCAgICAgZ2NyeV9tcGlfY2xlYXJfaGlnaGJpdCAoZ2NyeV9tcGlfdCBhLCB1bnNpZ25lZCBpbnQgbik7CisKKy8qIFNoaWZ0IHRoZSB2YWx1ZSBvZiBBIGJ5IE4gYml0cyB0byB0aGUgcmlnaHQgYW5kIHN0b3JlIHRoZSByZXN1bHQgaW4gWC4gKi8KK3ZvaWQgICAgIGdjcnlfbXBpX3JzaGlmdCAoZ2NyeV9tcGlfdCB4LCBnY3J5X21waV90IGEsIHVuc2lnbmVkIGludCBuKTsKKworLyogU2hpZnQgdGhlIHZhbHVlIG9mIEEgYnkgTiBiaXRzIHRvIHRoZSBsZWZ0IGFuZCBzdG9yZSB0aGUgcmVzdWx0IGluIFguICovCit2b2lkICAgICBnY3J5X21waV9sc2hpZnQgKGdjcnlfbXBpX3QgeCwgZ2NyeV9tcGlfdCBhLCB1bnNpZ25lZCBpbnQgbik7CisKKy8qIFN0b3JlIE5CSVRTIG9mIHRoZSB2YWx1ZSBQIHBvaW50cyB0byBpbiBBIGFuZCBtYXJrIEEgYXMgYW4gb3BhcXVlCisgICB2YWx1ZS4gIFdBUk5JTkc6IE5ldmVyIHVzZSBhbiBvcGFxdWUgTVBJIGZvciBhbnl0aGluZyB0aGluZyBlbHNlIHRoZW4gCisgICBnY3J5X21waV9yZWxlYXNlLCBnY3J5X21waV9nZXRfb3BhcXVlLiAqLworZ2NyeV9tcGlfdCBnY3J5X21waV9zZXRfb3BhcXVlIChnY3J5X21waV90IGEsIHZvaWQgKnAsIHVuc2lnbmVkIGludCBuYml0cyk7CisKKy8qIFJldHVybiBhIHBvaW50ZXIgdG8gYW4gb3BhcXVlIHZhbHVlIHN0b3JlZCBpbiBBIGFuZCByZXR1cm4gaXRzIHNpemUKKyAgIGluIE5CSVRTLiAgTm90ZSB0aGF0IHRoZSByZXR1cm5lZCBwb2ludGVyIGlzIHN0aWxsIG93bmVkIGJ5IEEgYW5kCisgICB0aGF0IHRoZSBmdW5jdGlvbiBzaG91bGQgbmV2ZXIgYmUgdXNlZCBmb3IgYW4gbm9uLW9wYXF1ZSBNUEkuICovCit2b2lkICpnY3J5X21waV9nZXRfb3BhcXVlIChnY3J5X21waV90IGEsIHVuc2lnbmVkIGludCAqbmJpdHMpOworCisvKiBTZXQgdGhlIEZMQUcgZm9yIHRoZSBiaWcgaW50ZWdlciBBLiAgQ3VycmVudGx5IG9ubHkgdGhlIGZsYWcKKyAgIEdDUllNUElfRkxBR19TRUNVUkUgaXMgYWxsb3dlZCB0byBjb252ZXJ0IEEgaW50byBhbiBiaWcgaW50Z2VyCisgICBzdG9yZWQgaW4gInNlY3VyZSIgbWVtb3J5LiAqLwordm9pZCBnY3J5X21waV9zZXRfZmxhZyAoZ2NyeV9tcGlfdCBhLCBlbnVtIGdjcnlfbXBpX2ZsYWcgZmxhZyk7CisKKy8qIENsZWFyIEZMQUcgZm9yIHRoZSBiaWcgaW50ZWdlciBBLiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMKKyAgIGN1cnJlbnRseSB1c2VsZXNzIGFzIG5vIGZsYWdzIGFyZSBhbGxvd2VkLiAqLwordm9pZCBnY3J5X21waV9jbGVhcl9mbGFnIChnY3J5X21waV90IGEsIGVudW0gZ2NyeV9tcGlfZmxhZyBmbGFnKTsKKworLyogUmV0dXJuIHRydWUgd2hlbiB0aGUgRkxBRyBpcyBzZXQgZm9yIEEuICovCitpbnQgZ2NyeV9tcGlfZ2V0X2ZsYWcgKGdjcnlfbXBpX3QgYSwgZW51bSBnY3J5X21waV9mbGFnIGZsYWcpOworCisvKiBVbmxlc3MgdGhlIEdDUllQVF9OT19NUElfTUFDUk9TIGlzIHVzZWQsIHByb3ZpZGUgYSBjb3VwbGUgb2YKKyAgIGNvbnZlbmllbmNlIG1hY3JvcyBmb3IgdGhlIGJpZyBpbnRlZ2VyIGZ1bmN0aW9ucy4gKi8KKyNpZm5kZWYgR0NSWVBUX05PX01QSV9NQUNST1MKKyNkZWZpbmUgbXBpX25ldyhuKSAgICAgICAgICBnY3J5X21waV9uZXcoIChuKSApCisjZGVmaW5lIG1waV9zZWN1cmVfbmV3KCBuICkgZ2NyeV9tcGlfc25ldyggKG4pICkKKyNkZWZpbmUgbXBpX3JlbGVhc2UoYSkgICAgICBcCisgIGRvIFwKKyAgICB7IFwKKyAgICAgIGdjcnlfbXBpX3JlbGVhc2UgKChhKSk7IFwKKyAgICAgIChhKSA9IE5VTEw7IFwKKyAgICB9IFwKKyAgd2hpbGUgKDApCisKKyNkZWZpbmUgbXBpX2NvcHkoIGEgKSAgICAgICAgICBnY3J5X21waV9jb3B5KCAoYSkgKQorI2RlZmluZSBtcGlfc2V0KCB3LCB1KSAgICAgICAgIGdjcnlfbXBpX3NldCggKHcpLCAodSkgKQorI2RlZmluZSBtcGlfc2V0X3VpKCB3LCB1KSAgICAgIGdjcnlfbXBpX3NldF91aSggKHcpLCAodSkgKQorI2RlZmluZSBtcGlfY21wKCB1LCB2ICkgICAgICAgIGdjcnlfbXBpX2NtcCggKHUpLCAodikgKQorI2RlZmluZSBtcGlfY21wX3VpKCB1LCB2ICkgICAgIGdjcnlfbXBpX2NtcF91aSggKHUpLCAodikgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIG1waV9hZGRfdWkodyx1LHYpICAgICAgZ2NyeV9tcGlfYWRkX3VpKCh3KSwodSksKHYpKQorI2RlZmluZSBtcGlfYWRkKHcsdSx2KSAgICAgICAgIGdjcnlfbXBpX2FkZCAoKHcpLCh1KSwodikpCisjZGVmaW5lIG1waV9hZGRtKHcsdSx2LG0pICAgICAgZ2NyeV9tcGlfYWRkbSAoKHcpLCh1KSwodiksKG0pKQorI2RlZmluZSBtcGlfc3ViX3VpKHcsdSx2KSAgICAgIGdjcnlfbXBpX3N1Yl91aSAoKHcpLCh1KSwodikpCisjZGVmaW5lIG1waV9zdWIodyx1LHYpICAgICAgICAgZ2NyeV9tcGlfc3ViICgodyksKHUpLCh2KSkKKyNkZWZpbmUgbXBpX3N1Ym0odyx1LHYsbSkgICAgICBnY3J5X21waV9zdWJtICgodyksKHUpLCh2KSwobSkpCisjZGVmaW5lIG1waV9tdWxfdWkodyx1LHYpICAgICAgZ2NyeV9tcGlfbXVsX3VpICgodyksKHUpLCh2KSkKKyNkZWZpbmUgbXBpX211bF8yZXhwKHcsdSx2KSAgICBnY3J5X21waV9tdWxfMmV4cCAoKHcpLCh1KSwodikpCisjZGVmaW5lIG1waV9tdWwodyx1LHYpICAgICAgICAgZ2NyeV9tcGlfbXVsICgodyksKHUpLCh2KSkKKyNkZWZpbmUgbXBpX211bG0odyx1LHYsbSkgICAgICBnY3J5X21waV9tdWxtICgodyksKHUpLCh2KSwobSkpCisjZGVmaW5lIG1waV9wb3dtKHcsYixlLG0pICAgICAgZ2NyeV9tcGlfcG93bSAoICh3KSwgKGIpLCAoZSksIChtKSApCisjZGVmaW5lIG1waV90ZGl2KHEscixhLG0pICAgICAgZ2NyeV9tcGlfZGl2ICggKHEpLCAociksIChhKSwgKG0pLCAwKQorI2RlZmluZSBtcGlfZmRpdihxLHIsYSxtKSAgICAgIGdjcnlfbXBpX2RpdiAoIChxKSwgKHIpLCAoYSksIChtKSwgLTEpCisjZGVmaW5lIG1waV9tb2QocixhLG0pICAgICAgICAgZ2NyeV9tcGlfbW9kICgociksIChhKSwgKG0pKQorI2RlZmluZSBtcGlfZ2NkKGcsYSxiKSAgICAgICAgIGdjcnlfbXBpX2djZCAoIChnKSwgKGEpLCAoYikgKQorI2RlZmluZSBtcGlfaW52bShnLGEsYikgICAgICAgIGdjcnlfbXBpX2ludm0gKCAoZyksIChhKSwgKGIpICkKKworI2RlZmluZSBtcGlfZ2V0X25iaXRzKGEpICAgICAgIGdjcnlfbXBpX2dldF9uYml0cyAoKGEpKQorI2RlZmluZSBtcGlfdGVzdF9iaXQoYSxiKSAgICAgIGdjcnlfbXBpX3Rlc3RfYml0ICgoYSksKGIpKQorI2RlZmluZSBtcGlfc2V0X2JpdChhLGIpICAgICAgIGdjcnlfbXBpX3NldF9iaXQgKChhKSwoYikpCisjZGVmaW5lIG1waV9zZXRfaGlnaGJpdChhLGIpICAgZ2NyeV9tcGlfc2V0X2hpZ2hiaXQgKChhKSwoYikpCisjZGVmaW5lIG1waV9jbGVhcl9iaXQoYSxiKSAgICAgZ2NyeV9tcGlfY2xlYXJfYml0ICgoYSksKGIpKQorI2RlZmluZSBtcGlfY2xlYXJfaGlnaGJpdChhLGIpIGdjcnlfbXBpX2NsZWFyX2hpZ2hiaXQgKChhKSwoYikpCisjZGVmaW5lIG1waV9yc2hpZnQoYSxiLGMpICAgICAgZ2NyeV9tcGlfcnNoaWZ0ICgoYSksKGIpLChjKSkKKyNkZWZpbmUgbXBpX2xzaGlmdChhLGIsYykgICAgICBnY3J5X21waV9sc2hpZnQgKChhKSwoYiksKGMpKQorCisjZGVmaW5lIG1waV9zZXRfb3BhcXVlKGEsYixjKSAgZ2NyeV9tcGlfc2V0X29wYXF1ZSggKGEpLCAoYiksIChjKSApCisjZGVmaW5lIG1waV9nZXRfb3BhcXVlKGEsYikgICAgZ2NyeV9tcGlfZ2V0X29wYXF1ZSggKGEpLCAoYikgKQorI2VuZGlmIC8qIEdDUllQVF9OT19NUElfTUFDUk9TICovCisKKworDAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBTeW1tZXRyaWMgQ2lwaGVyIEZ1bmN0aW9ucyAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhlIGRhdGEgb2JqZWN0IHVzZWQgdG8gaG9sZCBhIGhhbmRsZSB0byBhbiBlbmNyeXB0aW9uIG9iamVjdC4gICovCitzdHJ1Y3QgZ2NyeV9jaXBoZXJfaGFuZGxlOwordHlwZWRlZiBzdHJ1Y3QgZ2NyeV9jaXBoZXJfaGFuZGxlICpnY3J5X2NpcGhlcl9oZF90OworCisjaWZuZGVmIEdDUllQVF9OT19ERVBSRUNBVEVECit0eXBlZGVmIHN0cnVjdCBnY3J5X2NpcGhlcl9oYW5kbGUgKkdDUllfQ0lQSEVSX0hEIF9HQ1JZX0dDQ19BVFRSX0RFUFJFQ0FURUQ7Cit0eXBlZGVmIHN0cnVjdCBnY3J5X2NpcGhlcl9oYW5kbGUgKkdjcnlDaXBoZXJIZCBfR0NSWV9HQ0NfQVRUUl9ERVBSRUNBVEVEOworI2VuZGlmCisKKy8qIEFsbCBzeW1tZXRyaWMgZW5jcnlwdGlvbiBhbGdvcml0aG1zIGFyZSBpZGVudGlmaWVkIGJ5IHRoZWlyIElEcy4KKyAgIE1vcmUgSURzIG1heSBiZSByZWdpc3RlcmVkIGF0IHJ1bnRpbWUuICovCitlbnVtIGdjcnlfY2lwaGVyX2FsZ29zCisgIHsKKyAgICBHQ1JZX0NJUEhFUl9OT05FICAgICAgICA9IDAsCisgICAgR0NSWV9DSVBIRVJfSURFQSAgICAgICAgPSAxLAorICAgIEdDUllfQ0lQSEVSXzNERVMgICAgICAgID0gMiwKKyAgICBHQ1JZX0NJUEhFUl9DQVNUNSAgICAgICA9IDMsCisgICAgR0NSWV9DSVBIRVJfQkxPV0ZJU0ggICAgPSA0LAorICAgIEdDUllfQ0lQSEVSX1NBRkVSX1NLMTI4ID0gNSwKKyAgICBHQ1JZX0NJUEhFUl9ERVNfU0sgICAgICA9IDYsCisgICAgR0NSWV9DSVBIRVJfQUVTICAgICAgICAgPSA3LAorICAgIEdDUllfQ0lQSEVSX0FFUzE5MiAgICAgID0gOCwKKyAgICBHQ1JZX0NJUEhFUl9BRVMyNTYgICAgICA9IDksCisgICAgR0NSWV9DSVBIRVJfVFdPRklTSCAgICAgPSAxMCwKKworICAgIC8qIE90aGVyIGNpcGhlciBudW1iZXJzIGFyZSBhYm92ZSAzMDAgZm9yIE9wZW5QR1AgcmVhc29ucy4gKi8KKyAgICBHQ1JZX0NJUEhFUl9BUkNGT1VSICAgICA9IDMwMSwgIC8qIEZ1bGx5IGNvbXBhdGlibGUgd2l0aCBSU0EncyBSQzQgKHRtKS4gKi8KKyAgICBHQ1JZX0NJUEhFUl9ERVMgICAgICAgICA9IDMwMiwgIC8qIFllcywgdGhpcyBpcyBzaW5nbGUga2V5IDU2IGJpdCBERVMuICovCisgICAgR0NSWV9DSVBIRVJfVFdPRklTSDEyOCAgPSAzMDMsCisgICAgR0NSWV9DSVBIRVJfU0VSUEVOVDEyOCAgPSAzMDQsCisgICAgR0NSWV9DSVBIRVJfU0VSUEVOVDE5MiAgPSAzMDUsCisgICAgR0NSWV9DSVBIRVJfU0VSUEVOVDI1NiAgPSAzMDYsCisgICAgR0NSWV9DSVBIRVJfUkZDMjI2OF80MCAgPSAzMDcsICAvKiBSb24ncyBDaXBoZXIgMiAoNDAgYml0KS4gKi8KKyAgICBHQ1JZX0NJUEhFUl9SRkMyMjY4XzEyOCA9IDMwOCwgIC8qIFJvbidzIENpcGhlciAyICgxMjggYml0KS4gKi8KKyAgICBHQ1JZX0NJUEhFUl9TRUVEICAgICAgICA9IDMwOSwgIC8qIDEyOCBiaXQgY2lwaGVyIGRlc2NyaWJlZCBpbiBSRkM0MjY5LiAqLworICAgIEdDUllfQ0lQSEVSX0NBTUVMTElBMTI4ID0gMzEwLAorICAgIEdDUllfQ0lQSEVSX0NBTUVMTElBMTkyID0gMzExLAorICAgIEdDUllfQ0lQSEVSX0NBTUVMTElBMjU2ID0gMzEyCisgIH07CisKKy8qIFRoZSBSaWpuZGFlbCBhbGdvcml0aG0gaXMgYmFzaWNhbGx5IEFFUywgc28gcHJvdmlkZSBzb21lIG1hY3Jvcy4gKi8KKyNkZWZpbmUgR0NSWV9DSVBIRVJfQUVTMTI4ICAgICAgR0NSWV9DSVBIRVJfQUVTICAgIAorI2RlZmluZSBHQ1JZX0NJUEhFUl9SSUpOREFFTCAgICBHQ1JZX0NJUEhFUl9BRVMgICAgCisjZGVmaW5lIEdDUllfQ0lQSEVSX1JJSk5EQUVMMTI4IEdDUllfQ0lQSEVSX0FFUzEyOCAKKyNkZWZpbmUgR0NSWV9DSVBIRVJfUklKTkRBRUwxOTIgR0NSWV9DSVBIRVJfQUVTMTkyIAorI2RlZmluZSBHQ1JZX0NJUEhFUl9SSUpOREFFTDI1NiBHQ1JZX0NJUEhFUl9BRVMyNTYgCisKKy8qIFRoZSBzdXBwb3J0ZWQgZW5jcnlwdGlvbiBtb2Rlcy4gIE5vdGUgdGhhdCBub3QgYWxsIG9mIHRoZW0gYXJlCisgICBzdXBwb3J0ZWQgZm9yIGVhY2ggYWxnb3JpdGhtLiAqLworZW51bSBnY3J5X2NpcGhlcl9tb2RlcyAKKyAgeworICAgIEdDUllfQ0lQSEVSX01PREVfTk9ORSAgID0gMCwgIC8qIE5vdCB5ZXQgc3BlY2lmaWVkLiAqLworICAgIEdDUllfQ0lQSEVSX01PREVfRUNCICAgID0gMSwgIC8qIEVsZWN0cm9uaWMgY29kZWJvb2suICovCisgICAgR0NSWV9DSVBIRVJfTU9ERV9DRkIgICAgPSAyLCAgLyogQ2lwaGVyIGZlZWRiYWNrLiAqLworICAgIEdDUllfQ0lQSEVSX01PREVfQ0JDICAgID0gMywgIC8qIENpcGhlciBibG9jayBjaGFpbmluZy4gKi8KKyAgICBHQ1JZX0NJUEhFUl9NT0RFX1NUUkVBTSA9IDQsICAvKiBVc2VkIHdpdGggc3RyZWFtIGNpcGhlcnMuICovCisgICAgR0NSWV9DSVBIRVJfTU9ERV9PRkIgICAgPSA1LCAgLyogT3V0ZXIgZmVlZGJhY2suICovCisgICAgR0NSWV9DSVBIRVJfTU9ERV9DVFIgICAgPSA2LCAgLyogQ291bnRlci4gKi8KKyAgICBHQ1JZX0NJUEhFUl9NT0RFX0FFU1dSQVA9IDcgICAvKiBBRVMtV1JBUCBhbGdvcml0aG0uICAqLworICB9OworCisvKiBGbGFncyB1c2VkIHdpdGggdGhlIG9wZW4gZnVuY3Rpb24uICovIAorZW51bSBnY3J5X2NpcGhlcl9mbGFncworICB7CisgICAgR0NSWV9DSVBIRVJfU0VDVVJFICAgICAgPSAxLCAgLyogQWxsb2NhdGUgaW4gc2VjdXJlIG1lbW9yeS4gKi8KKyAgICBHQ1JZX0NJUEhFUl9FTkFCTEVfU1lOQyA9IDIsICAvKiBFbmFibGUgQ0ZCIHN5bmMgbW9kZS4gKi8KKyAgICBHQ1JZX0NJUEhFUl9DQkNfQ1RTICAgICA9IDQsICAvKiBFbmFibGUgQ0JDIGNpcGhlciB0ZXh0IHN0ZWFsaW5nIChDVFMpLiAqLworICAgIEdDUllfQ0lQSEVSX0NCQ19NQUMgICAgID0gOCAgIC8qIEVuYWJsZSBDQkMgbWVzc2FnZSBhdXRoLiBjb2RlIChNQUMpLiAqLworICB9OworCisKKy8qIENyZWF0ZSBhIGhhbmRsZSBmb3IgYWxnb3JpdGhtIEFMR08gdG8gYmUgdXNlZCBpbiBNT0RFLiAgRkxBR1MgbWF5CisgICBiZSBnaXZlbiBhcyBhbiBiaXR3aXNlIE9SIG9mIHRoZSBnY3J5X2NpcGhlcl9mbGFncyB2YWx1ZXMuICovCitnY3J5X2Vycm9yX3QgZ2NyeV9jaXBoZXJfb3BlbiAoZ2NyeV9jaXBoZXJfaGRfdCAqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsZ28sIGludCBtb2RlLCB1bnNpZ25lZCBpbnQgZmxhZ3MpOworCisvKiBDbG9zZSB0aGUgY2lvaGVyIGhhbmRsZSBIIGFuZCByZWxlYXNlIGFsbCByZXNvdXJjZS4gKi8KK3ZvaWQgZ2NyeV9jaXBoZXJfY2xvc2UgKGdjcnlfY2lwaGVyX2hkX3QgaCk7CisKKy8qIFBlcmZvcm0gdmFyaW91cyBvcGVyYXRpb25zIG9uIHRoZSBjaXBoZXIgb2JqZWN0IEguICovCitnY3J5X2Vycm9yX3QgZ2NyeV9jaXBoZXJfY3RsIChnY3J5X2NpcGhlcl9oZF90IGgsIGludCBjbWQsIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1Zmxlbik7CisKKy8qIFJldHJpZXZlIHZhcmlvdXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNpcGhlciBvYmplY3QgSC4gKi8KK2djcnlfZXJyb3JfdCBnY3J5X2NpcGhlcl9pbmZvIChnY3J5X2NpcGhlcl9oZF90IGgsIGludCB3aGF0LCB2b2lkICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKm5ieXRlcyk7CisKKy8qIFJldHJpZXZlIHZhcmlvdXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNpcGhlciBhbGdvcml0aG0gQUxHTy4gKi8KK2djcnlfZXJyb3JfdCBnY3J5X2NpcGhlcl9hbGdvX2luZm8gKGludCBhbGdvLCBpbnQgd2hhdCwgdm9pZCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKm5ieXRlcyk7CisKKy8qIE1hcCB0aGUgY2lwaGVyIGFsZ29yaXRobSB3aG9zZSBJRCBpcyBjb250YWluZWQgaW4gQUxHT1JJVEhNIHRvIGEKKyAgIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYWxnb3JpdGhtIG5hbWUuICBGb3IgdW5rbm93biBhbGdvcml0aG0KKyAgIElEcyB0aGlzIGZ1bmN0aW9uIHJldHVybnMgIj8iLiAgKi8KK2NvbnN0IGNoYXIgKmdjcnlfY2lwaGVyX2FsZ29fbmFtZSAoaW50IGFsZ29yaXRobSkgX0dDUllfR0NDX0FUVFJfUFVSRTsKKworLyogTWFwIHRoZSBhbGdvcml0aG0gbmFtZSBOQU1FIHRvIGFuIGNpcGhlciBhbGdvcml0aG0gSUQuICBSZXR1cm4gMCBpZgorICAgdGhlIGFsZ29yaXRobSBuYW1lIGlzIG5vdCBrbm93bi4gKi8KK2ludCBnY3J5X2NpcGhlcl9tYXBfbmFtZSAoY29uc3QgY2hhciAqbmFtZSkgX0dDUllfR0NDX0FUVFJfUFVSRTsKKworLyogR2l2ZW4gYW4gQVNOLjEgb2JqZWN0IGlkZW50aWZpZXIgaW4gc3RhbmRhcmQgSUVURiBkb3R0ZWQgZGVjaW1hbAorICAgZm9ybWF0IGluIFNUUklORywgcmV0dXJuIHRoZSBlbmNyeXB0aW9uIG1vZGUgYXNzb2NpYXRlZCB3aXRoIHRoYXQKKyAgIE9JRCBvciAwIGlmIG5vdCBrbm93biBvciBhcHBsaWNhYmxlLiAqLworaW50IGdjcnlfY2lwaGVyX21vZGVfZnJvbV9vaWQgKGNvbnN0IGNoYXIgKnN0cmluZykgX0dDUllfR0NDX0FUVFJfUFVSRTsKKworLyogRW5jcnlwdCB0aGUgcGxhaW50ZXh0IG9mIHNpemUgSU5MRU4gaW4gSU4gdXNpbmcgdGhlIGNpcGhlciBoYW5kbGUgSAorICAgaW50byB0aGUgYnVmZmVyIE9VVCB3aGljaCBoYXMgYW4gYWxsb2NhdGVkIGxlbmd0aCBvZiBPVVRTSVpFLiAgRm9yCisgICBtb3N0IGFsZ29yaXRobXMgaXQgaXMgcG9zc2libGUgdG8gcGFzcyBOVUxMIGZvciBpbiBhbmQgMCBmb3IgSU5MRU4KKyAgIGFuZCBkbyBhIGluLXBsYWNlIGRlY3J5cHRpb24gb2YgdGhlIGRhdGEgcHJvdmlkZWQgaW4gT1VULiAgKi8KK2djcnlfZXJyb3JfdCBnY3J5X2NpcGhlcl9lbmNyeXB0IChnY3J5X2NpcGhlcl9oZF90IGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqb3V0LCBzaXplX3Qgb3V0c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICppbiwgc2l6ZV90IGlubGVuKTsKKworLyogVGhlIGNvdW50ZXJwYXJ0IHRvIGdjcnlfY2lwaGVyX2VuY3J5cHQuICAqLworZ2NyeV9lcnJvcl90IGdjcnlfY2lwaGVyX2RlY3J5cHQgKGdjcnlfY2lwaGVyX2hkX3QgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvdXQsIHNpemVfdCBvdXRzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmluLCBzaXplX3QgaW5sZW4pOworCisvKiBTZXQgS0VZIG9mIGxlbmd0aCBLRVlMRU4gYnl0ZXMgZm9yIHRoZSBjaXBoZXIgaGFuZGxlIEhELiAgKi8KK2djcnlfZXJyb3JfdCBnY3J5X2NpcGhlcl9zZXRrZXkgKGdjcnlfY2lwaGVyX2hkX3QgaGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICprZXksIHNpemVfdCBrZXlsZW4pOworCisKKy8qIFNldCBpbml0aWFsaXphdGlvbiB2ZWN0b3IgSVYgb2YgbGVuZ3RoIElWTEVOIGZvciB0aGUgY2lwaGVyIGhhbmRsZSBIRC4gKi8KK2djcnlfZXJyb3JfdCBnY3J5X2NpcGhlcl9zZXRpdiAoZ2NyeV9jaXBoZXJfaGRfdCBoZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqaXYsIHNpemVfdCBpdmxlbik7CisKKworLyogUmVzZXQgdGhlIGhhbmRsZSB0byB0aGUgc3RhdGUgYWZ0ZXIgb3Blbi4gICovCisjZGVmaW5lIGdjcnlfY2lwaGVyX3Jlc2V0KGgpICBnY3J5X2NpcGhlcl9jdGwgKChoKSwgR0NSWUNUTF9SRVNFVCwgTlVMTCwgMCkKKworLyogUGVyZm9ybSB0aGUgT3BlblBHUCBzeW5jIG9wZXJhdGlvbiBpZiB0aGlzIGlzIGVuYWJsZWQgZm9yIHRoZQorICAgY2lwaGVyIGhhbmRsZSBILiAqLworI2RlZmluZSBnY3J5X2NpcGhlcl9zeW5jKGgpICBnY3J5X2NpcGhlcl9jdGwoIChoKSwgR0NSWUNUTF9DRkJfU1lOQywgTlVMTCwgMCkKKworLyogRW5hYmxlIG9yIGRpc2FibGUgQ1RTIGluIGZ1dHVyZSBjYWxscyB0byBnY3J5X2VuY3J5cHQoKS4gQ0JDIG1vZGUgb25seS4gKi8KKyNkZWZpbmUgZ2NyeV9jaXBoZXJfY3RzKGgsb24pICBnY3J5X2NpcGhlcl9jdGwoIChoKSwgR0NSWUNUTF9TRVRfQ0JDX0NUUywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIG9uICkKKworLyogU2V0IGNvdW50ZXIgZm9yIENUUiBtb2RlLiAgKENUUixDVFJMRU4pIG11c3QgZGVub3RlIGEgYnVmZmVyIG9mCisgICBibG9jayBzaXplIGxlbmd0aCwgb3IgKE5VTEwsMCkgdG8gc2V0IHRoZSBDVFIgdG8gdGhlIGFsbC16ZXJvIGJsb2NrLiAqLworZ3BnX2Vycm9yX3QgZ2NyeV9jaXBoZXJfc2V0Y3RyIChnY3J5X2NpcGhlcl9oZF90IGhkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpjdHIsIHNpemVfdCBjdHJsZW4pOworCisvKiBSZXRyaWV2ZWQgdGhlIGtleSBsZW5ndGggaW4gYnl0ZXMgdXNlZCB3aXRoIGFsZ29yaXRobSBBLiAqLworc2l6ZV90IGdjcnlfY2lwaGVyX2dldF9hbGdvX2tleWxlbiAoaW50IGFsZ28pOworCisvKiBSZXRyaWV2ZSB0aGUgYmxvY2sgbGVuZ3RoIGluIGJ5dGVzIHVzZWQgd2l0aCBhbGdvcml0aG0gQS4gKi8KK3NpemVfdCBnY3J5X2NpcGhlcl9nZXRfYWxnb19ibGtsZW4gKGludCBhbGdvKTsKKworLyogUmV0dXJuIDAgaWYgdGhlIGFsZ29yaXRobSBBIGlzIGF2YWlsYWJsZSBmb3IgdXNlLiAqLworI2RlZmluZSBnY3J5X2NpcGhlcl90ZXN0X2FsZ28oYSkgXAorICAgICAgICAgICAgZ2NyeV9jaXBoZXJfYWxnb19pbmZvKCAoYSksIEdDUllDVExfVEVTVF9BTEdPLCBOVUxMLCBOVUxMICkKKworLyogR2V0IGEgbGlzdCBjb25zaXN0aW5nIG9mIHRoZSBJRHMgb2YgdGhlIGxvYWRlZCBjaXBoZXIgbW9kdWxlcy4gIElmCisgICBMSVNUIGlzIHplcm8sIHdyaXRlIHRoZSBudW1iZXIgb2YgbG9hZGVkIGNpcGhlciBtb2R1bGVzIHRvCisgICBMSVNUX0xFTkdUSCBhbmQgcmV0dXJuLiAgSWYgTElTVCBpcyBub24temVybywgdGhlIGZpcnN0CisgICAqTElTVF9MRU5HVEggYWxnb3JpdGhtIElEcyBhcmUgc3RvcmVkIGluIExJU1QsIHdoaWNoIG11c3QgYmUgb2YKKyAgIGFjY29yZGluZyBzaXplLiAgSW4gY2FzZSB0aGVyZSBhcmUgbGVzcyBjaXBoZXIgbW9kdWxlcyB0aGFuCisgICAqTElTVF9MRU5HVEgsICpMSVNUX0xFTkdUSCBpcyB1cGRhdGVkIHRvIHRoZSBjb3JyZWN0IG51bWJlci4gICovCitnY3J5X2Vycm9yX3QgZ2NyeV9jaXBoZXJfbGlzdCAoaW50ICpsaXN0LCBpbnQgKmxpc3RfbGVuZ3RoKTsKKworDAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgQXN5bW1ldHJpYyBDaXBoZXIgRnVuY3Rpb25zICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhlIGFsZ29yaXRobXMgYW5kIHRoZWlyIElEcyB3ZSBzdXBwb3J0LiAqLworZW51bSBnY3J5X3BrX2FsZ29zIAorICB7CisgICAgR0NSWV9QS19SU0EgICA9IDEsCisgICAgR0NSWV9QS19SU0FfRSA9IDIsICAgICAgLyogKGRlcHJlY2F0ZWQpICovCisgICAgR0NSWV9QS19SU0FfUyA9IDMsICAgICAgLyogKGRlcHJlY2F0ZWQpICovCisgICAgR0NSWV9QS19FTEdfRSA9IDE2LAorICAgIEdDUllfUEtfRFNBICAgPSAxNywKKyAgICBHQ1JZX1BLX0VMRyAgID0gMjAsCisgICAgR0NSWV9QS19FQ0RTQSA9IDMwMQorICB9OworCisvKiBGbGFncyBkZXNjcmliaW5nIHVzYWdlIGNhcGFiaWxpdGllcyBvZiBhIFBLIGFsZ29yaXRobS4gKi8KKyNkZWZpbmUgR0NSWV9QS19VU0FHRV9TSUdOIDEgICAvKiBHb29kIGZvciBzaWduYXR1cmVzLiAqLyAgICAgICAgICAgIAorI2RlZmluZSBHQ1JZX1BLX1VTQUdFX0VOQ1IgMiAgIC8qIEdvb2QgZm9yIGVuY3J5cHRpb24uICovICAgICAgICAgICAgCisjZGVmaW5lIEdDUllfUEtfVVNBR0VfQ0VSVCA0ICAgLyogR29vZCB0byBjZXJ0aWZ5IG90aGVyIGtleXMuICovCisjZGVmaW5lIEdDUllfUEtfVVNBR0VfQVVUSCA4ICAgLyogR29vZCBmb3IgYXV0aGVudGljYXRpb24uICovICAgICAgICAKKyNkZWZpbmUgR0NSWV9QS19VU0FHRV9VTktOIDEyOCAvKiBVbmtub3duIHVzYWdlIGZsYWcuICovICAgICAgICAgIAorCisvKiBFbmNyeXB0IHRoZSBEQVRBIHVzaW5nIHRoZSBwdWJsaWMga2V5IFBLRVkgYW5kIHN0b3JlIHRoZSByZXN1bHQgYXMKKyAgIGEgbmV3bHkgY3JlYXRlZCBTLWV4cHJlc3Npb24gYXQgUkVTVUxULiAqLworZ2NyeV9lcnJvcl90IGdjcnlfcGtfZW5jcnlwdCAoZ2NyeV9zZXhwX3QgKnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfc2V4cF90IGRhdGEsIGdjcnlfc2V4cF90IHBrZXkpOworCisvKiBEZWNyeXB0IHRoZSBEQVRBIHVzaW5nIHRoZSBwcml2YXRlIGtleSBTS0VZIGFuZCBzdG9yZSB0aGUgcmVzdWx0IGFzCisgICBhIG5ld2x5IGNyZWF0ZWQgUy1leHByZXNzaW9uIGF0IFJFU1VMVC4gKi8KK2djcnlfZXJyb3JfdCBnY3J5X3BrX2RlY3J5cHQgKGdjcnlfc2V4cF90ICpyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X3NleHBfdCBkYXRhLCBnY3J5X3NleHBfdCBza2V5KTsKKworLyogU2lnbiB0aGUgREFUQSB1c2luZyB0aGUgcHJpdmF0ZSBrZXkgU0tFWSBhbmQgc3RvcmUgdGhlIHJlc3VsdCBhcworICAgYSBuZXdseSBjcmVhdGVkIFMtZXhwcmVzc2lvbiBhdCBSRVNVTFQuICovCitnY3J5X2Vycm9yX3QgZ2NyeV9wa19zaWduIChnY3J5X3NleHBfdCAqcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NyeV9zZXhwX3QgZGF0YSwgZ2NyeV9zZXhwX3Qgc2tleSk7CisKKy8qIENoZWNrIHRoZSBzaWduYXR1cmUgU0lHVkFMIG9uIERBVEEgdXNpbmcgdGhlIHB1YmxpYyBrZXkgUEtFWS4gKi8KK2djcnlfZXJyb3JfdCBnY3J5X3BrX3ZlcmlmeSAoZ2NyeV9zZXhwX3Qgc2lndmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X3NleHBfdCBkYXRhLCBnY3J5X3NleHBfdCBwa2V5KTsKKworLyogQ2hlY2sgdGhhdCBwcml2YXRlIEtFWSBpcyBzYW5lLiAqLworZ2NyeV9lcnJvcl90IGdjcnlfcGtfdGVzdGtleSAoZ2NyeV9zZXhwX3Qga2V5KTsKKworLyogR2VuZXJhdGUgYSBuZXcga2V5IHBhaXIgYWNjb3JkaW5nIHRvIHRoZSBwYXJhbWV0ZXJzIGdpdmVuIGluCisgICBTX1BBUk1TLiAgVGhlIG5ldyBrZXkgcGFpciBpcyByZXR1cm5lZCBpbiBhcyBhbiBTLWV4cHJlc3Npb24gaW4KKyAgIFJfS0VZLiAqLworZ2NyeV9lcnJvcl90IGdjcnlfcGtfZ2Vua2V5IChnY3J5X3NleHBfdCAqcl9rZXksIGdjcnlfc2V4cF90IHNfcGFybXMpOworCisvKiBDYXRjaCBhbGwgZnVuY3Rpb24gZm9yIG1pc2NlbGxhbmVvdXMgb3BlcmF0aW9ucy4gKi8KK2djcnlfZXJyb3JfdCBnY3J5X3BrX2N0bCAoaW50IGNtZCwgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnVmbGVuKTsKKworLyogUmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHB1YmxpYyBrZXkgYWxnb3JpdGhtIEFMR08uICovCitnY3J5X2Vycm9yX3QgZ2NyeV9wa19hbGdvX2luZm8gKGludCBhbGdvLCBpbnQgd2hhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyLCBzaXplX3QgKm5ieXRlcyk7CisKKy8qIE1hcCB0aGUgcHVibGljIGtleSBhbGdvcml0aG0gd2hvc2UgSUQgaXMgY29udGFpbmVkIGluIEFMR09SSVRITSB0bworICAgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFsZ29yaXRobSBuYW1lLiAgRm9yIHVua25vd24KKyAgIGFsZ29yaXRobSBJRHMgdGhpcyBmdW5jdGlvbnMgcmV0dXJucyAiPyIuICovCitjb25zdCBjaGFyICpnY3J5X3BrX2FsZ29fbmFtZSAoaW50IGFsZ29yaXRobSkgX0dDUllfR0NDX0FUVFJfUFVSRTsKKworLyogTWFwIHRoZSBhbGdvcml0aG0gTkFNRSB0byBhIHB1YmxpYyBrZXkgYWxnb3JpdGhtIElkLiAgUmV0dXJuIDAgaWYKKyAgIHRoZSBhbGdvcml0aG0gbmFtZSBpcyBub3Qga25vd24uICovCitpbnQgZ2NyeV9wa19tYXBfbmFtZSAoY29uc3QgY2hhciogbmFtZSkgX0dDUllfR0NDX0FUVFJfUFVSRTsKKworLyogUmV0dXJuIHdoYXQgaXMgY29tbW9ubHkgcmVmZXJyZWQgYXMgdGhlIGtleSBsZW5ndGggZm9yIHRoZSBnaXZlbgorICAgcHVibGljIG9yIHByaXZhdGUgS0VZLiAgKi8KK3Vuc2lnbmVkIGludCBnY3J5X3BrX2dldF9uYml0cyAoZ2NyeV9zZXhwX3Qga2V5KSBfR0NSWV9HQ0NfQVRUUl9QVVJFOworCisvKiBQbGVhc2Ugbm90ZSB0aGF0IGtleWdyaXAgaXMgc3RpbGwgZXhwZXJpbWVudGFsIGFuZCBzaG91bGQgbm90IGJlCisgICB1c2VkIHdpdGhvdXQgY29udGFjdGluZyB0aGUgYXV0aG9yLiAqLwordW5zaWduZWQgY2hhciAqZ2NyeV9wa19nZXRfa2V5Z3JpcCAoZ2NyeV9zZXhwX3Qga2V5LCB1bnNpZ25lZCBjaGFyICphcnJheSk7CisKKy8qIFJldHVybiAwIGlmIHRoZSBwdWJsaWMga2V5IGFsZ29yaXRobSBBIGlzIGF2YWlsYWJsZSBmb3IgdXNlLiAqLworI2RlZmluZSBnY3J5X3BrX3Rlc3RfYWxnbyhhKSBcCisgICAgICAgICAgICBnY3J5X3BrX2FsZ29faW5mbyggKGEpLCBHQ1JZQ1RMX1RFU1RfQUxHTywgTlVMTCwgTlVMTCApCisKKy8qIEdldCBhIGxpc3QgY29uc2lzdGluZyBvZiB0aGUgSURzIG9mIHRoZSBsb2FkZWQgcHVia2V5IG1vZHVsZXMuICBJZgorICAgTElTVCBpcyB6ZXJvLCB3cml0ZSB0aGUgbnVtYmVyIG9mIGxvYWRlZCBwdWJrZXkgbW9kdWxlcyB0bworICAgTElTVF9MRU5HVEggYW5kIHJldHVybi4gIElmIExJU1QgaXMgbm9uLXplcm8sIHRoZSBmaXJzdAorICAgKkxJU1RfTEVOR1RIIGFsZ29yaXRobSBJRHMgYXJlIHN0b3JlZCBpbiBMSVNULCB3aGljaCBtdXN0IGJlIG9mCisgICBhY2NvcmRpbmcgc2l6ZS4gIEluIGNhc2UgdGhlcmUgYXJlIGxlc3MgcHVia2V5IG1vZHVsZXMgdGhhbgorICAgKkxJU1RfTEVOR1RILCAqTElTVF9MRU5HVEggaXMgdXBkYXRlZCB0byB0aGUgY29ycmVjdCBudW1iZXIuICAqLworZ2NyeV9lcnJvcl90IGdjcnlfcGtfbGlzdCAoaW50ICpsaXN0LCBpbnQgKmxpc3RfbGVuZ3RoKTsKKworDAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIENyeXB0b2dyYWhpYyBIYXNoIEZ1bmN0aW9ucyAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBBbGdvcml0aG0gSURzIGZvciB0aGUgaGFzaCBmdW5jdGlvbnMgd2Uga25vdyBhYm91dC4gTm90IGFsbCBvZiB0aGVtCisgICBhcmUgaW1wbGVtbnRlZC4gKi8KK2VudW0gZ2NyeV9tZF9hbGdvcworICB7CisgICAgR0NSWV9NRF9OT05FICAgID0gMCwgIAorICAgIEdDUllfTURfTUQ1ICAgICA9IDEsCisgICAgR0NSWV9NRF9TSEExICAgID0gMiwKKyAgICBHQ1JZX01EX1JNRDE2MCAgPSAzLAorICAgIEdDUllfTURfTUQyICAgICA9IDUsCisgICAgR0NSWV9NRF9USUdFUiAgID0gNiwgICAvKiBUSUdFUi8xOTIgYXMgdXNlZCBieSBHbnVQRyA8PSAxLjMuMi4gKi8KKyAgICBHQ1JZX01EX0hBVkFMICAgPSA3LCAgIC8qIEhBVkFMLCA1IHBhc3MsIDE2MCBiaXQuICovCisgICAgR0NSWV9NRF9TSEEyNTYgID0gOCwKKyAgICBHQ1JZX01EX1NIQTM4NCAgPSA5LAorICAgIEdDUllfTURfU0hBNTEyICA9IDEwLAorICAgIEdDUllfTURfU0hBMjI0ICA9IDExLAorICAgIEdDUllfTURfTUQ0ICAgICA9IDMwMSwKKyAgICBHQ1JZX01EX0NSQzMyICAgICAgICAgPSAzMDIsCisgICAgR0NSWV9NRF9DUkMzMl9SRkMxNTEwID0gMzAzLAorICAgIEdDUllfTURfQ1JDMjRfUkZDMjQ0MCA9IDMwNCwKKyAgICBHQ1JZX01EX1dISVJMUE9PTCA9IDMwNSwKKyAgICBHQ1JZX01EX1RJR0VSMSAgPSAzMDYsIC8qIFRJR0VSIChmaXhlZCkuICAqLworICAgIEdDUllfTURfVElHRVIyICA9IDMwNyAgLyogVElHRVIyIHZhcmlhbnQuICAgKi8KKyAgfTsKKworLyogRmxhZ3MgdXNlZCB3aXRoIHRoZSBvcGVuIGZ1bmN0aW9uLiAgKi8KK2VudW0gZ2NyeV9tZF9mbGFncworICB7CisgICAgR0NSWV9NRF9GTEFHX1NFQ1VSRSA9IDEsICAvKiBBbGxvY2F0ZSBhbGwgYnVmZmVycyBpbiAic2VjdXJlIiBtZW1vcnkuICAqLworICAgIEdDUllfTURfRkxBR19ITUFDICAgPSAyICAgLyogTWFrZSBhbiBITUFDIG91dCBvZiB0aGlzIGFsZ29yaXRobS4gICovCisgIH07CisKKy8qIChGb3J3YXJkIGRlY2xhcmF0aW9uLikgICovCitzdHJ1Y3QgZ2NyeV9tZF9jb250ZXh0OworCisvKiBUaGlzIG9iamVjdCBpcyB1c2VkIHRvIGhvbGQgYSBoYW5kbGUgdG8gYSBtZXNzYWdlIGRpZ2VzdCBvYmplY3QuCisgICBUaGlzIHN0cnVjdHVyZSBpcyBwcml2YXRlIC0gb25seSB0byBiZSB1c2VkIGJ5IHRoZSBwdWJsaWMgZ2NyeV9tZF8qCisgICBtYWNyb3MuICAqLwordHlwZWRlZiBzdHJ1Y3QgZ2NyeV9tZF9oYW5kbGUgCit7CisgIC8qIEFjdHVhbCBjb250ZXh0LiAgKi8KKyAgc3RydWN0IGdjcnlfbWRfY29udGV4dCAqY3R4OworICAKKyAgLyogQnVmZmVyIG1hbmFnZW1lbnQuICAqLworICBpbnQgIGJ1ZnBvczsKKyAgaW50ICBidWZzaXplOworICB1bnNpZ25lZCBjaGFyIGJ1ZlsxXTsKK30gKmdjcnlfbWRfaGRfdDsKKworLyogQ29tcGF0aWJpbGl0eSB0eXBlcywgZG8gbm90IHVzZSB0aGVtLiAgKi8KKyNpZm5kZWYgR0NSWVBUX05PX0RFUFJFQ0FURUQKK3R5cGVkZWYgc3RydWN0IGdjcnlfbWRfaGFuZGxlICpHQ1JZX01EX0hEIF9HQ1JZX0dDQ19BVFRSX0RFUFJFQ0FURUQ7Cit0eXBlZGVmIHN0cnVjdCBnY3J5X21kX2hhbmRsZSAqR2NyeU1ESGQgX0dDUllfR0NDX0FUVFJfREVQUkVDQVRFRDsKKyNlbmRpZgorCisvKiBDcmVhdGUgYSBtZXNzYWdlIGRpZ2VzdCBvYmplY3QgZm9yIGFsZ29yaXRobSBBTEdPLiAgRkxBR1MgbWF5IGJlCisgICBnaXZlbiBhcyBhbiBiaXR3aXNlIE9SIG9mIHRoZSBnY3J5X21kX2ZsYWdzIHZhbHVlcy4gIEFMR08gbWF5IGJlCisgICBnaXZlbiBhcyAwIGlmIHRoZSBhbGdvcml0aG1zIHRvIGJlIHVzZWQgYXJlIGxhdGVyIHNldCB1c2luZworICAgZ2NyeV9tZF9lbmFibGUuICAqLworZ2NyeV9lcnJvcl90IGdjcnlfbWRfb3BlbiAoZ2NyeV9tZF9oZF90ICpoLCBpbnQgYWxnbywgdW5zaWduZWQgaW50IGZsYWdzKTsKKworLyogUmVsZWFzZSB0aGUgbWVzc2FnZSBkaWdlc3Qgb2JqZWN0IEhELiAgKi8KK3ZvaWQgZ2NyeV9tZF9jbG9zZSAoZ2NyeV9tZF9oZF90IGhkKTsKKworLyogQWRkIHRoZSBtZXNzYWdlIGRpZ2VzdCBhbGdvcml0aG0gQUxHTyB0byB0aGUgZGlnZXN0IG9iamVjdCBIRC4gICovCitnY3J5X2Vycm9yX3QgZ2NyeV9tZF9lbmFibGUgKGdjcnlfbWRfaGRfdCBoZCwgaW50IGFsZ28pOworCisvKiBDcmVhdGUgYSBuZXcgZGlnZXN0IG9iamVjdCBhcyBhbiBleGFjdCBjb3B5IG9mIHRoZSBvYmplY3QgSEQuICAqLworZ2NyeV9lcnJvcl90IGdjcnlfbWRfY29weSAoZ2NyeV9tZF9oZF90ICpiaGQsIGdjcnlfbWRfaGRfdCBhaGQpOworCisvKiBSZXNldCB0aGUgZGlnZXN0IG9iamVjdCBIRCB0byBpdHMgaW5pdGlhbCBzdGF0ZS4gICovCit2b2lkIGdjcnlfbWRfcmVzZXQgKGdjcnlfbWRfaGRfdCBoZCk7CisKKy8qIFBlcmZvcm0gdmFyaW91cyBvcGVyYXRpb25zIG9uIHRoZSBkaWdlc3Qgb2JqZWN0IEhELiAqLworZ2NyeV9lcnJvcl90IGdjcnlfbWRfY3RsIChnY3J5X21kX2hkX3QgaGQsIGludCBjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ1Zmxlbik7CisKKy8qIFBhc3MgTEVOR1RIIGJ5dGVzIG9mIGRhdGEgaW4gQlVGRkVSIHRvIHRoZSBkaWdlc3Qgb2JqZWN0IEhEIHNvIHRoYXQKKyAgIGl0IGNhbiB1cGRhdGUgdGhlIGRpZ2VzdCB2YWx1ZXMuICBUaGlzIGlzIHRoZSBhY3R1YWwgaGFzaAorICAgZnVuY3Rpb24uICovCit2b2lkIGdjcnlfbWRfd3JpdGUgKGdjcnlfbWRfaGRfdCBoZCwgY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoKTsKKworLyogUmVhZCBvdXQgdGhlIGZpbmFsIGRpZ2VzdCBmcm9tIEhEIHJldHVybiB0aGUgZGlnZXN0IHZhbHVlIGZvcgorICAgYWxnb3JpdGhtIEFMR08uICovCit1bnNpZ25lZCBjaGFyICpnY3J5X21kX3JlYWQgKGdjcnlfbWRfaGRfdCBoZCwgaW50IGFsZ28pOworCisvKiBDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBjYWxjdWxhdGUgdGhlIGhhc2ggZnJvbSB0aGUgZGF0YSBpbiBCVUZGRVIKKyAgIG9mIHNpemUgTEVOR1RIIHVzaW5nIHRoZSBhbGdvcml0aG0gQUxHTyBhdm9pZGluZyB0aGUgY3JlYXRpbmcgb2YgYQorICAgaGFzaCBvYmplY3QuICBUaGUgaGFzaCBpcyByZXR1cm5lZCBpbiB0aGUgY2FsbGVyIHByb3ZpZGVkIGJ1ZmZlcgorICAgRElHRVNUIHdoaWNoIG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlIGRpZ2VzdCBvZiB0aGUgZ2l2ZW4KKyAgIGFsZ29yaXRobS4gKi8KK3ZvaWQgZ2NyeV9tZF9oYXNoX2J1ZmZlciAoaW50IGFsZ28sIHZvaWQgKmRpZ2VzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoKTsKKworLyogUmV0cmlldmUgdGhlIGFsZ29yaXRobSB1c2VkIHdpdGggSEQuICBUaGlzIGRvZXMgbm90IHdvcmsgcmVsaWFibGUKKyAgIGlmIG1vcmUgdGhhbiBvbmUgYWxnb3JpdGhtIGlzIGVuYWJsZWQgaW4gSEQuICovCitpbnQgZ2NyeV9tZF9nZXRfYWxnbyAoZ2NyeV9tZF9oZF90IGhkKTsKKworLyogUmV0cmlldmUgdGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgZGlnZXN0IHlpZWxkZWQgYnkgYWxnb3JpdGhtCisgICBBTEdPLiAqLwordW5zaWduZWQgaW50IGdjcnlfbWRfZ2V0X2FsZ29fZGxlbiAoaW50IGFsZ28pOworCisvKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgdGhlIGFsZ29yaXRobSBBTEdPIGlzIGVuYWJsZWQgaW4gdGhlIGRpZ2VzdAorICAgb2JqZWN0IEEuICovCitpbnQgZ2NyeV9tZF9pc19lbmFibGVkIChnY3J5X21kX2hkX3QgYSwgaW50IGFsZ28pOworCisvKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZGlnZXN0IG9iamVjdCBBIGlzIGFsbG9jYXRlZCBpbiAic2VjdXJlIiBtZW1vcnkuICovCitpbnQgZ2NyeV9tZF9pc19zZWN1cmUgKGdjcnlfbWRfaGRfdCBhKTsKKworLyogUmV0cmlldmUgdmFyaW91cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IEguICAqLworZ2NyeV9lcnJvcl90IGdjcnlfbWRfaW5mbyAoZ2NyeV9tZF9oZF90IGgsIGludCB3aGF0LCB2b2lkICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqbmJ5dGVzKTsKKworLyogUmV0cmlldmUgdmFyaW91cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYWxnb3JpdGhtIEFMR08uICAqLworZ2NyeV9lcnJvcl90IGdjcnlfbWRfYWxnb19pbmZvIChpbnQgYWxnbywgaW50IHdoYXQsIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKm5ieXRlcyk7CisKKy8qIE1hcCB0aGUgZGlnZXN0IGFsZ29yaXRobSBpZCBBTEdPIHRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZQorICAgYWxnb3JpdGhtIG5hbWUuICBGb3IgdW5rbm93biBhbGdvcml0aG1zIHRoaXMgZnVuY3Rpb24gcmV0dXJucworICAgIj8iLiAqLworY29uc3QgY2hhciAqZ2NyeV9tZF9hbGdvX25hbWUgKGludCBhbGdvKSBfR0NSWV9HQ0NfQVRUUl9QVVJFOworCisvKiBNYXAgdGhlIGFsZ29yaXRobSBOQU1FIHRvIGEgZGlnZXN0IGFsZ29yaXRobSBJZC4gIFJldHVybiAwIGlmCisgICB0aGUgYWxnb3JpdGhtIG5hbWUgaXMgbm90IGtub3duLiAqLworaW50IGdjcnlfbWRfbWFwX25hbWUgKGNvbnN0IGNoYXIqIG5hbWUpIF9HQ1JZX0dDQ19BVFRSX1BVUkU7CisKKy8qIEZvciB1c2Ugd2l0aCB0aGUgSE1BQyBmZWF0dXJlLCB0aGUgc2V0IE1BQyBrZXkgdG8gdGhlIEtFWSBvZgorICAgS0VZTEVOIGJ5dGVzLiAqLworZ2NyeV9lcnJvcl90IGdjcnlfbWRfc2V0a2V5IChnY3J5X21kX2hkX3QgaGQsIGNvbnN0IHZvaWQgKmtleSwgc2l6ZV90IGtleWxlbik7CisKKy8qIFN0YXJ0IG9yIHN0b3AgZGVidWdnaW5nIGZvciBkaWdlc3QgaGFuZGxlIEhEOyBpLmUuIGNyZWF0ZSBhIGZpbGUKKyAgIG5hbWVkIGRiZ21kLTxuPi48c3VmZml4PiB3aGlsZSBoYXNoaW5nLiAgSWYgU1VGRklYIGlzIE5VTEwsCisgICBkZWJ1Z2dpbmcgc3RvcHMgYW5kIHRoZSBmaWxlIHdpbGwgYmUgY2xvc2VkLiAqLwordm9pZCBnY3J5X21kX2RlYnVnIChnY3J5X21kX2hkX3QgaGQsIGNvbnN0IGNoYXIgKnN1ZmZpeCk7CisKKworLyogVXBkYXRlIHRoZSBoYXNoKHMpIG9mIEggd2l0aCB0aGUgY2hhcmFjdGVyIEMuICBUaGlzIGlzIGEgYnVmZmVyZWQKKyAgIHZlcnNpb24gb2YgdGhlIGdjcnlfbWRfd3JpdGUgZnVuY3Rpb24uICovCisjZGVmaW5lIGdjcnlfbWRfcHV0YyhoLGMpICBcCisgICAgICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGdjcnlfbWRfaGRfdCBoX18gPSAoaCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiggKGhfXyktPmJ1ZnBvcyA9PSAoaF9fKS0+YnVmc2l6ZSApICAgICBcCisgICAgICAgICAgICAgICAgICAgIGdjcnlfbWRfd3JpdGUoIChoX18pLCBOVUxMLCAwICk7ICAgICAgXAorICAgICAgICAgICAgICAgIChoX18pLT5idWZbKGhfXyktPmJ1ZnBvcysrXSA9IChjKSAmIDB4ZmY7IFwKKyAgICAgICAgICAgIH0gd2hpbGUoMCkKKworLyogRmluYWxpemUgdGhlIGRpZ2VzdCBjYWxjdWxhdGlvbi4gIFRoaXMgaXMgbm90IHJlYWxseSBuZWVkZWQgYmVjYXVzZQorICAgZ2NyeV9tZF9yZWFkKCkgZG9lcyB0aGlzIGltcGxpY2l0bHkuICovCisjZGVmaW5lIGdjcnlfbWRfZmluYWwoYSkgXAorICAgICAgICAgICAgZ2NyeV9tZF9jdGwgKChhKSwgR0NSWUNUTF9GSU5BTElaRSwgTlVMTCwgMCkKKworLyogUmV0dXJuIDAgaWYgdGhlIGFsZ29yaXRobSBBIGlzIGF2YWlsYWJsZSBmb3IgdXNlLiAqLworI2RlZmluZSBnY3J5X21kX3Rlc3RfYWxnbyhhKSBcCisgICAgICAgICAgICBnY3J5X21kX2FsZ29faW5mbyggKGEpLCBHQ1JZQ1RMX1RFU1RfQUxHTywgTlVMTCwgTlVMTCApCisKKy8qIFJldHVybiBhbiBERVIgZW5jb2RlZCBBU04uMSBPSUQgZm9yIHRoZSBhbGdvcml0aG0gQSBpbiBidWZmZXIgQi4gTgorICAgbXVzdCBwb2ludCB0byBzaXplX3QgdmFyaWFibGUgd2l0aCB0aGUgYXZhaWxhYmxlIHNpemUgb2YgYnVmZmVyIEIuCisgICBBZnRlciByZXR1cm4gaXQgd2lsbCByZWNlaXZlIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgcmV0dXJuZWQKKyAgIE9JRC4gKi8KKyNkZWZpbmUgZ2NyeV9tZF9nZXRfYXNub2lkKGEsYixuKSBcCisgICAgICAgICAgICBnY3J5X21kX2FsZ29faW5mbygoYSksIEdDUllDVExfR0VUX0FTTk9JRCwgKGIpLCAobikpCisKKy8qIEVuYWJsZSBkZWJ1Z2dpbmcgZm9yIGRpZ2VzdCBvYmplY3QgQTsgaS5lLiBjcmVhdGUgZmlsZXMgbmFtZWQKKyAgIGRiZ21kLTxuPi48c3RyaW5nPiB3aGlsZSBoYXNoaW5nLiAgQiBpcyBhIHN0cmluZyB1c2VkIGFzIHRoZSBzdWZmaXgKKyAgIGZvciB0aGUgZmlsZW5hbWUuICBUaGlzIG1hY3JvIGlzIGRlcHJlY2F0ZWQsIHVzZSBnY3J5X21kX2RlYnVnLiAqLworI2lmbmRlZiBHQ1JZUFRfTk9fREVQUkVDQVRFRAorI2RlZmluZSBnY3J5X21kX3N0YXJ0X2RlYnVnKGEsYikgXAorICAgICAgICAgICAgZ2NyeV9tZF9jdGwoIChhKSwgR0NSWUNUTF9TVEFSVF9EVU1QLCAoYiksIDAgKQorCisvKiBEaXNhYmxlIHRoZSBkZWJ1Z2dpbmcgb2YgQS4gIFRoaXMgbWFjcm8gaXMgZGVwcmVjYXRlZCwgdXNlCisgICBnY3J5X21kX2RlYnVnLiAgKi8KKyNkZWZpbmUgZ2NyeV9tZF9zdG9wX2RlYnVnKGEsYikgXAorICAgICAgICAgICAgZ2NyeV9tZF9jdGwoIChhKSwgR0NSWUNUTF9TVE9QX0RVTVAsIChiKSwgMCApCisjZW5kaWYKKworLyogR2V0IGEgbGlzdCBjb25zaXN0aW5nIG9mIHRoZSBJRHMgb2YgdGhlIGxvYWRlZCBtZXNzYWdlIGRpZ2VzdAorICAgbW9kdWxlcy4gIElmIExJU1QgaXMgemVybywgd3JpdGUgdGhlIG51bWJlciBvZiBsb2FkZWQgbWVzc2FnZQorICAgZGlnZXN0IG1vZHVsZXMgdG8gTElTVF9MRU5HVEggYW5kIHJldHVybi4gIElmIExJU1QgaXMgbm9uLXplcm8sIHRoZQorICAgZmlyc3QgKkxJU1RfTEVOR1RIIGFsZ29yaXRobSBJRHMgYXJlIHN0b3JlZCBpbiBMSVNULCB3aGljaCBtdXN0IGJlCisgICBvZiBhY2NvcmRpbmcgc2l6ZS4gIEluIGNhc2UgdGhlcmUgYXJlIGxlc3MgbWVzc2FnZSBkaWdlc3QgbW9kdWxlcworICAgdGhhbiAqTElTVF9MRU5HVEgsICpMSVNUX0xFTkdUSCBpcyB1cGRhdGVkIHRvIHRoZSBjb3JyZWN0CisgICBudW1iZXIuICAqLworZ2NyeV9lcnJvcl90IGdjcnlfbWRfbGlzdCAoaW50ICpsaXN0LCBpbnQgKmxpc3RfbGVuZ3RoKTsKKworDAorCisvKiBBbHRlcm5hdGl2ZSBpbnRlcmZhY2UgZm9yIGFzeW1tZXRyaWMgY3J5cHRvZ3JhcGh5LiAgVGhpcyBpbnRlcmZhY2UKKyAgIGlzIGRlcHJlY2F0ZWQuICAqLworCisvKiBUaGUgYWxnb3JpdGhtIElEcy4gKi8KK3R5cGVkZWYgZW51bSBnY3J5X2FjX2lkCisgIHsKKyAgICBHQ1JZX0FDX1JTQSA9IDEsCisgICAgR0NSWV9BQ19EU0EgPSAxNywKKyAgICBHQ1JZX0FDX0VMRyA9IDIwLAorICAgIEdDUllfQUNfRUxHX0UgPSAxNgorICB9CitnY3J5X2FjX2lkX3Q7CisKKy8qIEtleSB0eXBlcy4gICovCit0eXBlZGVmIGVudW0gZ2NyeV9hY19rZXlfdHlwZQorICB7CisgICAgR0NSWV9BQ19LRVlfU0VDUkVULAorICAgIEdDUllfQUNfS0VZX1BVQkxJQworICB9CitnY3J5X2FjX2tleV90eXBlX3Q7CisKKy8qIEVuY29kaW5nIG1ldGhvZHMuICAqLwordHlwZWRlZiBlbnVtIGdjcnlfYWNfZW0KKyAgeworICAgIEdDUllfQUNfRU1FX1BLQ1NfVjFfNSwKKyAgICBHQ1JZX0FDX0VNU0FfUEtDU19WMV81CisgIH0KK2djcnlfYWNfZW1fdDsKKworLyogRW5jcnlwdGlvbiBhbmQgU2lnbmF0dXJlIHNjaGVtZXMuICAqLwordHlwZWRlZiBlbnVtIGdjcnlfYWNfc2NoZW1lCisgIHsKKyAgICBHQ1JZX0FDX0VTX1BLQ1NfVjFfNSwKKyAgICBHQ1JZX0FDX1NTQV9QS0NTX1YxXzUKKyAgfQorZ2NyeV9hY19zY2hlbWVfdDsKKworLyogQUMgZGF0YS4gICovCisjZGVmaW5lIEdDUllfQUNfRkxBR19ERUFMTE9DICAgICAoMSA8PCAwKQorI2RlZmluZSBHQ1JZX0FDX0ZMQUdfQ09QWSAgICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgR0NSWV9BQ19GTEFHX05PX0JMSU5ESU5HICgxIDw8IDIpCisKKy8qIFRoaXMgdHlwZSByZXByZXNlbnRzIGEgYGRhdGEgc2V0Jy4gICovCit0eXBlZGVmIHN0cnVjdCBnY3J5X2FjX2RhdGEgKmdjcnlfYWNfZGF0YV90OworCisvKiBUaGlzIHR5cGUgcmVwcmVzZW50cyBhIHNpbmdsZSBga2V5JywgZWl0aGVyIGEgc2VjcmV0IG9uZSBvciBhCisgICBwdWJsaWMgb25lLiAgKi8KK3R5cGVkZWYgc3RydWN0IGdjcnlfYWNfa2V5ICpnY3J5X2FjX2tleV90OworCisvKiBUaGlzIHR5cGUgcmVwcmVzZW50cyBhIGBrZXkgcGFpcicgY29udGFpbmluZyBhIHNlY3JldCBhbmQgYSBwdWJsaWMKKyAgIGtleS4gICovCit0eXBlZGVmIHN0cnVjdCBnY3J5X2FjX2tleV9wYWlyICpnY3J5X2FjX2tleV9wYWlyX3Q7CisKKy8qIFRoaXMgdHlwZSByZXByZXNlbnRzIGEgYGhhbmRsZScgdGhhdCBpcyBuZWVkZWQgYnkgZnVuY3Rpb25zCisgICBwZXJmb3JtaW5nIGNyeXB0b2dyYXBoaWMgb3BlcmF0aW9ucy4gICovCit0eXBlZGVmIHN0cnVjdCBnY3J5X2FjX2hhbmRsZSAqZ2NyeV9hY19oYW5kbGVfdDsKKwordHlwZWRlZiBncGdfZXJyb3JfdCAoKmdjcnlfYWNfZGF0YV9yZWFkX2NiX3QpICh2b2lkICpvcGFxdWUsCisJCQkJCSAgICAgICB1bnNpZ25lZCBjaGFyICpidWZmZXIsCisJCQkJCSAgICAgICBzaXplX3QgKmJ1ZmZlcl9uKTsKKwordHlwZWRlZiBncGdfZXJyb3JfdCAoKmdjcnlfYWNfZGF0YV93cml0ZV9jYl90KSAodm9pZCAqb3BhcXVlLAorCQkJCQkJdW5zaWduZWQgY2hhciAqYnVmZmVyLAorCQkJCQkJc2l6ZV90IGJ1ZmZlcl9uKTsKKwordHlwZWRlZiBlbnVtCisgIHsKKyAgICBHQ1JZX0FDX0lPX1JFQURBQkxFLAorICAgIEdDUllfQUNfSU9fV1JJVEFCTEUKKyAgfQorZ2NyeV9hY19pb19tb2RlX3Q7CisKK3R5cGVkZWYgZW51bQorICB7CisgICAgR0NSWV9BQ19JT19TVFJJTkcsCisgICAgR0NSWV9BQ19JT19DQUxMQkFDSworICB9CitnY3J5X2FjX2lvX3R5cGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZ2NyeV9hY19pbworeworICAvKiBUaGlzIGlzIGFuIElOVEVSTkFMIHN0cnVjdHVyZSwgZG8gTk9UIHVzZSBtYW51YWxseS4gICovCisgIGdjcnlfYWNfaW9fbW9kZV90IG1vZGUgX0dDUllfQVRUUl9JTlRFUk5BTDsKKyAgZ2NyeV9hY19pb190eXBlX3QgdHlwZSBfR0NSWV9BVFRSX0lOVEVSTkFMOworICB1bmlvbgorICB7CisgICAgdW5pb24KKyAgICB7CisgICAgICBzdHJ1Y3QKKyAgICAgIHsKKwlnY3J5X2FjX2RhdGFfcmVhZF9jYl90IGNiOworCXZvaWQgKm9wYXF1ZTsKKyAgICAgIH0gY2FsbGJhY2s7CisgICAgICBzdHJ1Y3QKKyAgICAgIHsKKwl1bnNpZ25lZCBjaGFyICpkYXRhOworCXNpemVfdCBkYXRhX247CisgICAgICB9IHN0cmluZzsKKyAgICAgIHZvaWQgKm9wYXF1ZTsKKyAgICB9IHJlYWRhYmxlOworICAgIHVuaW9uCisgICAgeworICAgICAgc3RydWN0CisgICAgICB7CisJZ2NyeV9hY19kYXRhX3dyaXRlX2NiX3QgY2I7CisJdm9pZCAqb3BhcXVlOworICAgICAgfSBjYWxsYmFjazsKKyAgICAgIHN0cnVjdAorICAgICAgeworCXVuc2lnbmVkIGNoYXIgKipkYXRhOworCXNpemVfdCAqZGF0YV9uOworICAgICAgfSBzdHJpbmc7CisgICAgICB2b2lkICpvcGFxdWU7CisgICAgfSB3cml0YWJsZTsKKyAgfSBpbyBfR0NSWV9BVFRSX0lOVEVSTkFMOworfQorZ2NyeV9hY19pb190OworCisvKiBUaGUgY2FsbGVyIG9mIGdjcnlfYWNfa2V5X3BhaXJfZ2VuZXJhdGUgY2FuIHByb3ZpZGUgb25lIG9mIHRoZXNlCisgICBzdHJ1Y3R1cmVzIGluIG9yZGVyIHRvIGluZmx1ZW5jZSB0aGUga2V5IGdlbmVyYXRpb24gcHJvY2VzcyBpbiBhbgorICAgYWxnb3JpdGhtLXNwZWNpZmljIHdheS4gICovCit0eXBlZGVmIHN0cnVjdCBnY3J5X2FjX2tleV9zcGVjX3JzYQoreworICBnY3J5X21waV90IGU7ICAgICAgICAgICAgICAgICAvKiBFIHRvIHVzZS4gICovCit9IGdjcnlfYWNfa2V5X3NwZWNfcnNhX3Q7CisKKy8qIFN0cnVjdHVyZSB1c2VkIGZvciBwYXNzaW5nIGRhdGEgdG8gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZQorICAgYEVNRS1QS0NTLVYxXzUnIGVuY29kaW5nIG1ldGhvZC4gICovCit0eXBlZGVmIHN0cnVjdCBnY3J5X2FjX2VtZV9wa2NzX3YxXzUKK3sKKyAgc2l6ZV90IGtleV9zaXplOworfSBnY3J5X2FjX2VtZV9wa2NzX3YxXzVfdDsKKwordHlwZWRlZiBlbnVtIGdjcnlfbWRfYWxnb3MgZ2NyeV9tZF9hbGdvX3Q7CisKKy8qIFN0cnVjdHVyZSB1c2VkIGZvciBwYXNzaW5nIGRhdGEgdG8gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZQorICAgYEVNU0EtUEtDUy1WMV81JyBlbmNvZGluZyBtZXRob2QuICAqLwordHlwZWRlZiBzdHJ1Y3QgZ2NyeV9hY19lbXNhX3BrY3NfdjFfNQoreworICBnY3J5X21kX2FsZ29fdCBtZDsKKyAgc2l6ZV90IGVtX247Cit9IGdjcnlfYWNfZW1zYV9wa2NzX3YxXzVfdDsKKworLyogU3RydWN0dXJlIHVzZWQgZm9yIHBhc3NpbmcgZGF0YSB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlCisgICBgU1NBLVBLQ1MtVjFfNScgc2lnbmF0dXJlIHNjaGVtZS4gICovCit0eXBlZGVmIHN0cnVjdCBnY3J5X2FjX3NzYV9wa2NzX3YxXzUKK3sKKyAgZ2NyeV9tZF9hbGdvX3QgbWQ7Cit9IGdjcnlfYWNfc3NhX3BrY3NfdjFfNV90OworCisvKiBSZXR1cm5zIGEgbmV3LCBlbXB0eSBkYXRhIHNldCBpbiBEQVRBLiAgKi8KK2djcnlfZXJyb3JfdCBnY3J5X2FjX2RhdGFfbmV3IChnY3J5X2FjX2RhdGFfdCAqZGF0YSk7CisKKy8qIERlc3Ryb3kgdGhlIGRhdGEgc2V0IERBVEEuICAqLwordm9pZCBnY3J5X2FjX2RhdGFfZGVzdHJveSAoZ2NyeV9hY19kYXRhX3QgZGF0YSk7CisKKy8qIENyZWF0ZSBhIGNvcHkgb2YgdGhlIGRhdGEgc2V0IERBVEEgYW5kIHN0b3JlIGl0IGluIERBVEFfQ1AuICAqLworZ2NyeV9lcnJvcl90IGdjcnlfYWNfZGF0YV9jb3B5IChnY3J5X2FjX2RhdGFfdCAqZGF0YV9jcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X2FjX2RhdGFfdCBkYXRhKTsKKworLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgbmFtZWQgTVBJIHZhbHVlcyBpbnNpZGUgb2YgdGhlIGRhdGEgc2V0CisgICBEQVRBLiAgKi8KK3Vuc2lnbmVkIGludCBnY3J5X2FjX2RhdGFfbGVuZ3RoIChnY3J5X2FjX2RhdGFfdCBkYXRhKTsKKworLyogRGVzdHJveSBhbnkgdmFsdWVzIGNvbnRhaW5lZCBpbiB0aGUgZGF0YSBzZXQgREFUQS4gICovCit2b2lkIGdjcnlfYWNfZGF0YV9jbGVhciAoZ2NyeV9hY19kYXRhX3QgZGF0YSk7CisKKy8qIEFkZCB0aGUgdmFsdWUgTVBJIHRvIERBVEEgd2l0aCB0aGUgbGFiZWwgTkFNRS4gIElmIEZMQUdTIGNvbnRhaW5zCisgICBHQ1JZX0FDX0ZMQUdfREFUQV9DT1BZLCB0aGUgZGF0YSBzZXQgd2lsbCBjb250YWluIGNvcGllcyBvZiBOQU1FCisgICBhbmQgTVBJLiAgSWYgRkxBR1MgY29udGFpbnMgR0NSWV9BQ19GTEFHX0RBVEFfREVBTExPQyBvcgorICAgR0NSWV9BQ19GTEFHX0RBVEFfQ09QWSwgdGhlIHZhbHVlcyBjb250YWluZWQgaW4gdGhlIGRhdGEgc2V0IHdpbGwKKyAgIGJlIGRlYWxsb2NhdGVkIHdoZW4gdGhleSBhcmUgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBkYXRhIHNldC4gICovCitnY3J5X2Vycm9yX3QgZ2NyeV9hY19kYXRhX3NldCAoZ2NyeV9hY19kYXRhX3QgZGF0YSwgdW5zaWduZWQgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGdjcnlfbXBpX3QgbXBpKTsKKworLyogU3RvcmUgdGhlIHZhbHVlIGxhYmVsbGVkIHdpdGggTkFNRSBmb3VuZCBpbiBEQVRBIGluIE1QSS4gIElmIEZMQUdTCisgICBjb250YWlucyBHQ1JZX0FDX0ZMQUdfQ09QWSwgc3RvcmUgYSBjb3B5IG9mIHRoZSBNUEkgdmFsdWUgY29udGFpbmVkCisgICBpbiB0aGUgZGF0YSBzZXQuICBNUEkgbWF5IGJlIE5VTEwuICAqLworZ2NyeV9lcnJvcl90IGdjcnlfYWNfZGF0YV9nZXRfbmFtZSAoZ2NyeV9hY19kYXRhX3QgZGF0YSwgdW5zaWduZWQgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgZ2NyeV9tcGlfdCAqbXBpKTsKKworLyogU3RvcmVzIGluIE5BTUUgYW5kIE1QSSB0aGUgbmFtZWQgTVBJIHZhbHVlIGNvbnRhaW5lZCBpbiB0aGUgZGF0YQorICAgc2V0IERBVEEgd2l0aCB0aGUgaW5kZXggSURYLiAgSWYgRkxBR1MgY29udGFpbnMgR0NSWV9BQ19GTEFHX0NPUFksCisgICBzdG9yZSBjb3BpZXMgb2YgdGhlIHZhbHVlcyBjb250YWluZWQgaW4gdGhlIGRhdGEgc2V0LiBOQU1FIG9yIE1QSQorICAgbWF5IGJlIE5VTEwuICAqLworZ2NyeV9lcnJvcl90IGdjcnlfYWNfZGF0YV9nZXRfaW5kZXggKGdjcnlfYWNfZGF0YV90IGRhdGEsIHVuc2lnbmVkIGludCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipuYW1lLCBnY3J5X21waV90ICptcGkpOworCisvKiBDb252ZXJ0IHRoZSBkYXRhIHNldCBEQVRBIGludG8gYSBuZXcgUy1FeHByZXNzaW9uLCB3aGljaCBpcyB0byBiZQorICAgc3RvcmVkIGluIFNFWFAsIGFjY29yZGluZyB0byB0aGUgaWRlbnRpZmllcnMgY29udGFpbmVkIGluCisgICBJREVOVElGSUVSUy4gICovCitnY3J5X2Vycm9yX3QgZ2NyeV9hY19kYXRhX3RvX3NleHAgKGdjcnlfYWNfZGF0YV90IGRhdGEsIGdjcnlfc2V4cF90ICpzZXhwLAorCQkJCSAgIGNvbnN0IGNoYXIgKippZGVudGlmaWVycyk7CisKKy8qIENyZWF0ZSBhIG5ldyBkYXRhIHNldCwgd2hpY2ggaXMgdG8gYmUgc3RvcmVkIGluIERBVEFfU0VULCBmcm9tIHRoZQorICAgUy1FeHByZXNzaW9uIFNFWFAsIGFjY29yZGluZyB0byB0aGUgaWRlbnRpZmllcnMgY29udGFpbmVkIGluCisgICBJREVOVElGSUVSUy4gICovCitnY3J5X2Vycm9yX3QgZ2NyeV9hY19kYXRhX2Zyb21fc2V4cCAoZ2NyeV9hY19kYXRhX3QgKmRhdGEsIGdjcnlfc2V4cF90IHNleHAsCisJCQkJICAgICBjb25zdCBjaGFyICoqaWRlbnRpZmllcnMpOworCisvKiBJbml0aWFsaXplIEFDX0lPIGFjY29yZGluZyB0byBNT0RFLCBUWVBFIGFuZCB0aGUgdmFyaWFibGUgbGlzdCBvZgorICAgYXJndW1lbnRzLiAgVGhlIGxpc3Qgb2YgdmFyaWFibGUgYXJndW1lbnRzIHRvIHNwZWNpZnkgZGVwZW5kcyBvbgorICAgdGhlIGdpdmVuIFRZUEUuICAqLwordm9pZCBnY3J5X2FjX2lvX2luaXQgKGdjcnlfYWNfaW9fdCAqYWNfaW8sIGdjcnlfYWNfaW9fbW9kZV90IG1vZGUsCisJCSAgICAgIGdjcnlfYWNfaW9fdHlwZV90IHR5cGUsIC4uLik7CisKKy8qIEluaXRpYWxpemUgQUNfSU8gYWNjb3JkaW5nIHRvIE1PREUsIFRZUEUgYW5kIHRoZSB2YXJpYWJsZSBsaXN0IG9mCisgICBhcmd1bWVudHMgQVAuICBUaGUgbGlzdCBvZiB2YXJpYWJsZSBhcmd1bWVudHMgdG8gc3BlY2lmeSBkZXBlbmRzIG9uCisgICB0aGUgZ2l2ZW4gVFlQRS4gICovCit2b2lkIGdjcnlfYWNfaW9faW5pdF92YSAoZ2NyeV9hY19pb190ICphY19pbywgZ2NyeV9hY19pb19tb2RlX3QgbW9kZSwKKwkJCSBnY3J5X2FjX2lvX3R5cGVfdCB0eXBlLCB2YV9saXN0IGFwKTsKKworLyogQ3JlYXRlIGEgbmV3IGFjIGhhbmRsZS4gICovCitnY3J5X2Vycm9yX3QgZ2NyeV9hY19vcGVuIChnY3J5X2FjX2hhbmRsZV90ICpoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X2FjX2lkX3QgYWxnb3JpdGhtLCB1bnNpZ25lZCBpbnQgZmxhZ3MpOworCisvKiBEZXN0cm95IGFuIGFjIGhhbmRsZS4gICovCit2b2lkIGdjcnlfYWNfY2xvc2UgKGdjcnlfYWNfaGFuZGxlX3QgaGFuZGxlKTsKKworLyogSW5pdGlhbGl6ZSBhIGtleSBmcm9tIGEgZ2l2ZW4gZGF0YSBzZXQuICAqLworZ2NyeV9lcnJvcl90IGdjcnlfYWNfa2V5X2luaXQgKGdjcnlfYWNfa2V5X3QgKmtleSwgZ2NyeV9hY19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NyeV9hY19rZXlfdHlwZV90IHR5cGUsIGdjcnlfYWNfZGF0YV90IGRhdGEpOworCisvKiBHZW5lcmF0ZXMgYSBuZXcga2V5IHBhaXIgdmlhIHRoZSBoYW5kbGUgSEFORExFIG9mIE5CSVRTIGJpdHMgYW5kCisgICBzdG9yZXMgaXQgaW4gS0VZX1BBSVIuICBJbiBjYXNlIG5vbi1zdGFuZGFyZCBzZXR0aW5ncyBhcmUgd2FudGVkLCBhCisgICBwb2ludGVyIHRvIGEgc3RydWN0dXJlIG9mIHR5cGUgZ2NyeV9hY19rZXlfc3BlY188YWxnb3JpdGhtPl90LAorICAgbWF0Y2hpbmcgdGhlIHNlbGVjdGVkIGFsZ29yaXRobSwgY2FuIGJlIGdpdmVuIGFzIEtFWV9TUEVDLgorICAgTUlTQ19EQVRBIGlzIG5vdCB1c2VkIHlldC4gICovCitnY3J5X2Vycm9yX3QgZ2NyeV9hY19rZXlfcGFpcl9nZW5lcmF0ZSAoZ2NyeV9hY19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5iaXRzLCB2b2lkICpzcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfYWNfa2V5X3BhaXJfdCAqa2V5X3BhaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NyeV9tcGlfdCAqKm1pc2NfZGF0YSk7CisKKy8qIFJldHVybnMgdGhlIGtleSBvZiB0eXBlIFdISUNIIG91dCBvZiB0aGUga2V5IHBhaXIgS0VZX1BBSVIuICAqLworZ2NyeV9hY19rZXlfdCBnY3J5X2FjX2tleV9wYWlyX2V4dHJhY3QgKGdjcnlfYWNfa2V5X3BhaXJfdCBrZXlfcGFpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X2FjX2tleV90eXBlX3Qgd2hpY2gpOworCisvKiBSZXR1cm5zIHRoZSBkYXRhIHNldCBjb250YWluZWQgaW4gdGhlIGtleSBLRVkuICAqLworZ2NyeV9hY19kYXRhX3QgZ2NyeV9hY19rZXlfZGF0YV9nZXQgKGdjcnlfYWNfa2V5X3Qga2V5KTsKKworLyogVmVyaWZpZXMgdGhhdCB0aGUga2V5IEtFWSBpcyBzYW5lIHZpYSBIQU5ETEUuICAqLworZ2NyeV9lcnJvcl90IGdjcnlfYWNfa2V5X3Rlc3QgKGdjcnlfYWNfaGFuZGxlX3QgaGFuZGxlLCBnY3J5X2FjX2tleV90IGtleSk7CisKKy8qIFN0b3JlcyB0aGUgbnVtYmVyIG9mIGJpdHMgb2YgdGhlIGtleSBLRVkgaW4gTkJJVFMgdmlhIEhBTkRMRS4gICovCitnY3J5X2Vycm9yX3QgZ2NyeV9hY19rZXlfZ2V0X25iaXRzIChnY3J5X2FjX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfYWNfa2V5X3Qga2V5LCB1bnNpZ25lZCBpbnQgKm5iaXRzKTsKKworLyogV3JpdGVzIHRoZSAyMCBieXRlIGxvbmcga2V5IGdyaXAgb2YgdGhlIGtleSBLRVkgdG8gS0VZX0dSSVAgdmlhCisgICBIQU5ETEUuICAqLworZ2NyeV9lcnJvcl90IGdjcnlfYWNfa2V5X2dldF9ncmlwIChnY3J5X2FjX2hhbmRsZV90IGhhbmRsZSwgZ2NyeV9hY19rZXlfdCBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmtleV9ncmlwKTsKKworLyogRGVzdHJveSBhIGtleS4gICovCit2b2lkIGdjcnlfYWNfa2V5X2Rlc3Ryb3kgKGdjcnlfYWNfa2V5X3Qga2V5KTsKKworLyogRGVzdHJveSBhIGtleSBwYWlyLiAgKi8KK3ZvaWQgZ2NyeV9hY19rZXlfcGFpcl9kZXN0cm95IChnY3J5X2FjX2tleV9wYWlyX3Qga2V5X3BhaXIpOworCisvKiBFbmNvZGVzIGEgbWVzc2FnZSBhY2NvcmRpbmcgdG8gdGhlIGVuY29kaW5nIG1ldGhvZCBNRVRIT0QuICBPUFRJT05TCisgICBtdXN0IGJlIGEgcG9pbnRlciB0byBhIG1ldGhvZC1zcGVjaWZpYyBzdHJ1Y3R1cmUKKyAgIChnY3J5X2FjX2VtKl90KS4gICovCitnY3J5X2Vycm9yX3QgZ2NyeV9hY19kYXRhX2VuY29kZSAoZ2NyeV9hY19lbV90IG1ldGhvZCwKKwkJCQkgIHVuc2lnbmVkIGludCBmbGFncywgdm9pZCAqb3B0aW9ucywKKwkJCQkgIGdjcnlfYWNfaW9fdCAqaW9fcmVhZCwKKwkJCQkgIGdjcnlfYWNfaW9fdCAqaW9fd3JpdGUpOworCisvKiBEZWNvZGVzIGEgbWVzc2FnZSBhY2NvcmRpbmcgdG8gdGhlIGVuY29kaW5nIG1ldGhvZCBNRVRIT0QuICBPUFRJT05TCisgICBtdXN0IGJlIGEgcG9pbnRlciB0byBhIG1ldGhvZC1zcGVjaWZpYyBzdHJ1Y3R1cmUKKyAgIChnY3J5X2FjX2VtKl90KS4gICovCitnY3J5X2Vycm9yX3QgZ2NyeV9hY19kYXRhX2RlY29kZSAoZ2NyeV9hY19lbV90IG1ldGhvZCwKKwkJCQkgIHVuc2lnbmVkIGludCBmbGFncywgdm9pZCAqb3B0aW9ucywKKwkJCQkgIGdjcnlfYWNfaW9fdCAqaW9fcmVhZCwKKwkJCQkgIGdjcnlfYWNfaW9fdCAqaW9fd3JpdGUpOworCisvKiBFbmNyeXB0IHRoZSBwbGFpbiB0ZXh0IE1QSSB2YWx1ZSBEQVRBX1BMQUlOIHdpdGggdGhlIGtleSBLRVkgdW5kZXIKKyAgIHRoZSBjb250cm9sIG9mIHRoZSBmbGFncyBGTEFHUyBhbmQgc3RvcmUgdGhlIHJlc3VsdGluZyBkYXRhIHNldAorICAgaW50byBEQVRBX0VOQ1JZUFRFRC4gICovCitnY3J5X2Vycm9yX3QgZ2NyeV9hY19kYXRhX2VuY3J5cHQgKGdjcnlfYWNfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfYWNfa2V5X3Qga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X21waV90IGRhdGFfcGxhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfYWNfZGF0YV90ICpkYXRhX2VuY3J5cHRlZCk7CisKKy8qIERlY3J5cHQgdGhlIGRlY3J5cHRlZCBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgZGF0YSBzZXQgREFUQV9FTkNSWVBURUQKKyAgIHdpdGggdGhlIGtleSBLRVkgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlIGZsYWdzIEZMQUdTIGFuZCBzdG9yZSB0aGUKKyAgIHJlc3VsdGluZyBwbGFpbiB0ZXh0IE1QSSB2YWx1ZSBpbiBEQVRBX1BMQUlOLiAgKi8KK2djcnlfZXJyb3JfdCBnY3J5X2FjX2RhdGFfZGVjcnlwdCAoZ2NyeV9hY19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NyeV9hY19rZXlfdCBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfbXBpX3QgKmRhdGFfcGxhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfYWNfZGF0YV90IGRhdGFfZW5jcnlwdGVkKTsKKworLyogU2lnbiB0aGUgZGF0YSBjb250YWluZWQgaW4gREFUQSB3aXRoIHRoZSBrZXkgS0VZIGFuZCBzdG9yZSB0aGUKKyAgIHJlc3VsdGluZyBzaWduYXR1cmUgaW4gdGhlIGRhdGEgc2V0IERBVEFfU0lHTkFUVVJFLiAgKi8KK2djcnlfZXJyb3JfdCBnY3J5X2FjX2RhdGFfc2lnbiAoZ2NyeV9hY19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfYWNfa2V5X3Qga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X21waV90IGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfYWNfZGF0YV90ICpkYXRhX3NpZ25hdHVyZSk7CisKKy8qIFZlcmlmeSB0aGF0IHRoZSBzaWduYXR1cmUgY29udGFpbmVkIGluIHRoZSBkYXRhIHNldCBEQVRBX1NJR05BVFVSRQorICAgaXMgaW5kZWVkIHRoZSByZXN1bHQgb2Ygc2lnbmluZyB0aGUgZGF0YSBjb250YWluZWQgaW4gREFUQSB3aXRoIHRoZQorICAgc2VjcmV0IGtleSBiZWxvbmdpbmcgdG8gdGhlIHB1YmxpYyBrZXkgS0VZLiAgKi8KK2djcnlfZXJyb3JfdCBnY3J5X2FjX2RhdGFfdmVyaWZ5IChnY3J5X2FjX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X2FjX2tleV90IGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X21waV90IGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NyeV9hY19kYXRhX3QgZGF0YV9zaWduYXR1cmUpOworCisvKiBFbmNyeXB0cyB0aGUgcGxhaW4gdGV4dCByZWFkYWJsZSBmcm9tIElPX01FU1NBR0UgdGhyb3VnaCBIQU5ETEUKKyAgIHdpdGggdGhlIHB1YmxpYyBrZXkgS0VZIGFjY29yZGluZyB0byBTQ0hFTUUsIEZMQUdTIGFuZCBPUFRTLiAgSWYKKyAgIE9QVFMgaXMgbm90IE5VTEwsIGl0IGhhcyB0byBiZSBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUgc3BlY2lmaWMgdG8KKyAgIHRoZSBjaG9zZW4gc2NoZW1lIChnY3J5X2FjX2VzXypfdCkuICBUaGUgZW5jcnlwdGVkIG1lc3NhZ2UgaXMKKyAgIHdyaXR0ZW4gdG8gSU9fQ0lQSEVSLiAqLworZ2NyeV9lcnJvcl90IGdjcnlfYWNfZGF0YV9lbmNyeXB0X3NjaGVtZSAoZ2NyeV9hY19oYW5kbGVfdCBoYW5kbGUsCisJCQkJCSAgZ2NyeV9hY19zY2hlbWVfdCBzY2hlbWUsCisJCQkJCSAgdW5zaWduZWQgaW50IGZsYWdzLCB2b2lkICpvcHRzLAorCQkJCQkgIGdjcnlfYWNfa2V5X3Qga2V5LAorCQkJCQkgIGdjcnlfYWNfaW9fdCAqaW9fbWVzc2FnZSwKKwkJCQkJICBnY3J5X2FjX2lvX3QgKmlvX2NpcGhlcik7CisKKy8qIERlY3J5cHRzIHRoZSBjaXBoZXIgdGV4dCByZWFkYWJsZSBmcm9tIElPX0NJUEhFUiB0aHJvdWdoIEhBTkRMRQorICAgd2l0aCB0aGUgc2VjcmV0IGtleSBLRVkgYWNjb3JkaW5nIHRvIFNDSEVNRSwgQHZhcntmbGFnc30gYW5kIE9QVFMuCisgICBJZiBPUFRTIGlzIG5vdCBOVUxMLCBpdCBoYXMgdG8gYmUgYSBwb2ludGVyIHRvIGEgc3RydWN0dXJlIHNwZWNpZmljCisgICB0byB0aGUgY2hvc2VuIHNjaGVtZSAoZ2NyeV9hY19lc18qX3QpLiAgVGhlIGRlY3J5cHRlZCBtZXNzYWdlIGlzCisgICB3cml0dGVuIHRvIElPX01FU1NBR0UuICAqLworZ2NyeV9lcnJvcl90IGdjcnlfYWNfZGF0YV9kZWNyeXB0X3NjaGVtZSAoZ2NyeV9hY19oYW5kbGVfdCBoYW5kbGUsCisJCQkJCSAgZ2NyeV9hY19zY2hlbWVfdCBzY2hlbWUsCisJCQkJCSAgdW5zaWduZWQgaW50IGZsYWdzLCB2b2lkICpvcHRzLAorCQkJCQkgIGdjcnlfYWNfa2V5X3Qga2V5LAorCQkJCQkgIGdjcnlfYWNfaW9fdCAqaW9fY2lwaGVyLAorCQkJCQkgIGdjcnlfYWNfaW9fdCAqaW9fbWVzc2FnZSk7CisKKy8qIFNpZ25zIHRoZSBtZXNzYWdlIHJlYWRhYmxlIGZyb20gSU9fTUVTU0FHRSB0aHJvdWdoIEhBTkRMRSB3aXRoIHRoZQorICAgc2VjcmV0IGtleSBLRVkgYWNjb3JkaW5nIHRvIFNDSEVNRSwgRkxBR1MgYW5kIE9QVFMuICBJZiBPUFRTIGlzIG5vdAorICAgTlVMTCwgaXQgaGFzIHRvIGJlIGEgcG9pbnRlciB0byBhIHN0cnVjdHVyZSBzcGVjaWZpYyB0byB0aGUgY2hvc2VuCisgICBzY2hlbWUgKGdjcnlfYWNfc3NhXypfdCkuICBUaGUgc2lnbmF0dXJlIGlzIHdyaXR0ZW4gdG8KKyAgIElPX1NJR05BVFVSRS4gICovCitnY3J5X2Vycm9yX3QgZ2NyeV9hY19kYXRhX3NpZ25fc2NoZW1lIChnY3J5X2FjX2hhbmRsZV90IGhhbmRsZSwKKwkJCQkgICAgICAgZ2NyeV9hY19zY2hlbWVfdCBzY2hlbWUsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBmbGFncywgdm9pZCAqb3B0cywKKwkJCQkgICAgICAgZ2NyeV9hY19rZXlfdCBrZXksCisJCQkJICAgICAgIGdjcnlfYWNfaW9fdCAqaW9fbWVzc2FnZSwKKwkJCQkgICAgICAgZ2NyeV9hY19pb190ICppb19zaWduYXR1cmUpOworCisvKiBWZXJpZmllcyB0aHJvdWdoIEhBTkRMRSB0aGF0IHRoZSBzaWduYXR1cmUgcmVhZGFibGUgZnJvbQorICAgSU9fU0lHTkFUVVJFIGlzIGluZGVlZCB0aGUgcmVzdWx0IG9mIHNpZ25pbmcgdGhlIG1lc3NhZ2UgcmVhZGFibGUKKyAgIGZyb20gSU9fTUVTU0FHRSB3aXRoIHRoZSBzZWNyZXQga2V5IGJlbG9uZ2luZyB0byB0aGUgcHVibGljIGtleSBLRVkKKyAgIGFjY29yZGluZyB0byBTQ0hFTUUgYW5kIE9QVFMuICBJZiBPUFRTIGlzIG5vdCBOVUxMLCBpdCBoYXMgdG8gYmUgYW4KKyAgIGFub255bW91cyBzdHJ1Y3R1cmUgKGdjcnlfYWNfc3NhXypfdCkgc3BlY2lmaWMgdG8gdGhlIGNob3NlbgorICAgc2NoZW1lLiAgKi8KK2djcnlfZXJyb3JfdCBnY3J5X2FjX2RhdGFfdmVyaWZ5X3NjaGVtZSAoZ2NyeV9hY19oYW5kbGVfdCBoYW5kbGUsCisJCQkJCSBnY3J5X2FjX3NjaGVtZV90IHNjaGVtZSwKKwkJCQkJIHVuc2lnbmVkIGludCBmbGFncywgdm9pZCAqb3B0cywKKwkJCQkJIGdjcnlfYWNfa2V5X3Qga2V5LAorCQkJCQkgZ2NyeV9hY19pb190ICppb19tZXNzYWdlLAorCQkJCQkgZ2NyeV9hY19pb190ICppb19zaWduYXR1cmUpOworCisvKiBTdG9yZSB0aGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgYWxnb3JpdGhtIHdob3NlIGlkIGlzIGdpdmVuCisgICBpbiBBTEdPUklUSE0gaW4gTkFNRS4gIFRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZDsgdXNlCisgICBnY3J5X3BrX2FsZ29fbmFtZS4gKi8KKyNpZm5kZWYgR0NSWVBUX05PX0RFUFJFQ0FURUQKK2djcnlfZXJyb3JfdCBnY3J5X2FjX2lkX3RvX25hbWUgKGdjcnlfYWNfaWRfdCBhbGdvcml0aG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqbmFtZSkgCisgICAgIC8qICovICAgICAgICAgICAgICAgICAgICAgIF9HQ1JZX0dDQ19BVFRSX0RFUFJFQ0FURUQ7CisvKiBTdG9yZSB0aGUgbnVtZXJpYyBJRCBvZiB0aGUgYWxnb3JpdGhtIHdob3NlIHRleHR1YWwgcmVwcmVzZW50YXRpb24KKyAgIGlzIGNvbnRhaW5lZCBpbiBOQU1FIGluIEFMR09SSVRITS4gIFRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZDsKKyAgIHVzZSBnY3J5X3BrX21hcF9uYW1lLiAqLworZ2NyeV9lcnJvcl90IGdjcnlfYWNfbmFtZV90b19pZCAoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfYWNfaWRfdCAqYWxnb3JpdGhtKQorICAgICAvKiAqLyAgICAgICAgICAgICAgICAgICAgICBfR0NSWV9HQ0NfQVRUUl9ERVBSRUNBVEVEOworI2VuZGlmCisKKwwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgUmFuZG9tIEdlbmVyYXRpbmcgRnVuY3Rpb25zICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoZSBwb3NzaWJsZSB2YWx1ZXMgZm9yIHRoZSByYW5kb20gcXVhbGl0eS4gIFRoZSBydWxlIG9mIHRodW1iIGlzCisgICB0byB1c2UgU1RST05HIGZvciBzZXNzaW9uIGtleXMgYW5kIFZFUllfU1RST05HIGZvciBrZXkgbWF0ZXJpYWwuCisgICBXRUFLIGlzIHVzdWFsbHkgYW4gYWxpYXMgZm9yIFNUUk9ORyBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGFueW1vcmUKKyAgIChleGNlcHQgd2l0aCBnY3J5X21waV9yYW5kb21pemUpOyB1c2UgZ2NyeV9jcmVhdGVfbm9uY2UgaW5zdGVhZC4gKi8KK3R5cGVkZWYgZW51bSBnY3J5X3JhbmRvbV9sZXZlbAorICB7CisgICAgR0NSWV9XRUFLX1JBTkRPTSA9IDAsCisgICAgR0NSWV9TVFJPTkdfUkFORE9NID0gMSwKKyAgICBHQ1JZX1ZFUllfU1RST05HX1JBTkRPTSA9IDIKKyAgfQorZ2NyeV9yYW5kb21fbGV2ZWxfdDsKKworLyogRmlsbCBCVUZGRVIgd2l0aCBMRU5HVEggYnl0ZXMgb2YgcmFuZG9tLCB1c2luZyByYW5kb20gbnVtYmVycyBvZgorICAgcXVhbGl0eSBMRVZFTC4gKi8KK3ZvaWQgZ2NyeV9yYW5kb21pemUgKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgIGVudW0gZ2NyeV9yYW5kb21fbGV2ZWwgbGV2ZWwpOworCisvKiBBZGQgdGhlIGV4dGVybmFsIHJhbmRvbSBmcm9tIEJVRkZFUiB3aXRoIExFTkdUSCBieXRlcyBpbnRvIHRoZQorICAgcG9vbC4gUVVBTElUWSBzaG91bGQgZWl0aGVyIGJlIC0xIGZvciB1bmtub3duIG9yIGluIHRoZSByYW5nZSBvZiAwCisgICB0byAxMDAgKi8KK2djcnlfZXJyb3JfdCBnY3J5X3JhbmRvbV9hZGRfYnl0ZXMgKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBxdWFsaXR5KTsKKworLyogSWYgcmFuZG9tIG51bWJlcnMgYXJlIHVzZWQgaW4gYW4gYXBwbGljYXRpb24sIHRoaXMgbWFjcm8gc2hvdWxkIGJlCisgICBjYWxsZWQgZnJvbSB0aW1lIHRvIHRpbWUgc28gdGhhdCBuZXcgc3R1ZmYgZ2V0cyBhZGRlZCB0byB0aGUKKyAgIGludGVybmFsIHBvb2wgb2YgdGhlIFJORy4gICovCisjZGVmaW5lIGdjcnlfZmFzdF9yYW5kb21fcG9sbCgpICBnY3J5X2NvbnRyb2wgKEdDUllDVExfRkFTVF9QT0xMLCBOVUxMKQorCisKKy8qIFJldHVybiBOQllURVMgb2YgYWxsb2NhdGVkIHJhbmRvbSB1c2luZyBhIHJhbmRvbSBudW1iZXJzIG9mIHF1YWxpdHkKKyAgIExFVkVMLiAqLwordm9pZCAqZ2NyeV9yYW5kb21fYnl0ZXMgKHNpemVfdCBuYnl0ZXMsIGVudW0gZ2NyeV9yYW5kb21fbGV2ZWwgbGV2ZWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgX0dDUllfR0NDX0FUVFJfTUFMTE9DOworCisvKiBSZXR1cm4gTkJZVEVTIG9mIGFsbG9jYXRlZCByYW5kb20gdXNpbmcgYSByYW5kb20gbnVtYmVycyBvZiBxdWFsaXR5CisgICBMRVZFTC4gIFRoZSByYW5kb20gbnVtYmVycyBhcmUgY3JlYXRlZCByZXR1cm5lZCBpbiAic2VjdXJlIgorICAgbWVtb3J5LiAqLwordm9pZCAqZ2NyeV9yYW5kb21fYnl0ZXNfc2VjdXJlIChzaXplX3QgbmJ5dGVzLCBlbnVtIGdjcnlfcmFuZG9tX2xldmVsIGxldmVsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfR0NSWV9HQ0NfQVRUUl9NQUxMT0M7CisKKworLyogU2V0IHRoZSBiaWcgaW50ZWdlciBXIHRvIGEgcmFuZG9tIHZhbHVlIG9mIE5CSVRTIHVzaW5nIGEgcmFuZG9tCisgICBnZW5lcmF0b3Igd2l0aCBxdWFsaXR5IExFVkVMLiAgTm90ZSB0aGF0IGJ5IHVzaW5nIGEgbGV2ZWwgb2YKKyAgIEdDUllfV0VBS19SQU5ET00gZ2NyeV9jcmVhdGVfbm9uY2UgaXMgdXNlZCBpbnRlcm5hbGx5LiAqLwordm9pZCBnY3J5X21waV9yYW5kb21pemUgKGdjcnlfbXBpX3QgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbmJpdHMsIGVudW0gZ2NyeV9yYW5kb21fbGV2ZWwgbGV2ZWwpOworCisKKy8qIENyZWF0ZSBhbiB1bnByZWRpY2FibGUgbm9uY2Ugb2YgTEVOR1RIIGJ5dGVzIGluIEJVRkZFUi4gKi8KK3ZvaWQgZ2NyeV9jcmVhdGVfbm9uY2UgKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCk7CisKKworCisKKwwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBQcmltZSBOdW1iZXIgRnVuY3Rpb25zICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE1vZGUgdmFsdWVzIHBhc3NlZCB0byBhIGdjcnlfcHJpbWVfY2hlY2tfZnVuY190LiAqLworI2RlZmluZSBHQ1JZX1BSSU1FX0NIRUNLX0FUX0ZJTklTSCAgICAgIDAKKyNkZWZpbmUgR0NSWV9QUklNRV9DSEVDS19BVF9HT1RfUFJJTUUgICAxCisjZGVmaW5lIEdDUllfUFJJTUVfQ0hFQ0tfQVRfTUFZQkVfUFJJTUUgMgorCisvKiBUaGUgZnVuY3Rpb24gc2hvdWxkIHJldHVybiAxIGlmIHRoZSBvcGVyYXRpb24gc2hhbGwgY29udGludWUsIDAgdG8KKyAgIHJlamVjdCB0aGUgcHJpbWUgY2FuZGlkYXRlLiAqLwordHlwZWRlZiBpbnQgKCpnY3J5X3ByaW1lX2NoZWNrX2Z1bmNfdCkgKHZvaWQgKmFyZywgaW50IG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NyeV9tcGlfdCBjYW5kaWRhdGUpOworCisvKiBGbGFncyBmb3IgZ2NyeV9wcmltZV9nZW5lcmF0ZSgpOiAgKi8KKworLyogQWxsb2NhdGUgcHJpbWUgbnVtYmVycyBhbmQgZmFjdG9ycyBpbiBzZWN1cmUgbWVtb3J5LiAgKi8KKyNkZWZpbmUgR0NSWV9QUklNRV9GTEFHX1NFQ1JFVCAgICAgICAgICgxIDw8IDApCisKKy8qIE1ha2Ugc3VyZSB0aGF0IGF0IGxlYXN0IG9uZSBwcmltZSBmYWN0b3IgaXMgb2Ygc2l6ZQorICAgYEZBQ1RPUl9CSVRTJy4gICovCisjZGVmaW5lIEdDUllfUFJJTUVfRkxBR19TUEVDSUFMX0ZBQ1RPUiAoMSA8PCAxKQorCisvKiBHZW5lcmF0ZSBhIG5ldyBwcmltZSBudW1iZXIgb2YgUFJJTUVfQklUUyBiaXRzIGFuZCBzdG9yZSBpdCBpbgorICAgUFJJTUUuICBJZiBGQUNUT1JfQklUUyBpcyBub24temVybywgb25lIG9mIHRoZSBwcmltZSBmYWN0b3JzIG9mCisgICAocHJpbWUgLSAxKSAvIDIgbXVzdCBiZSBGQUNUT1JfQklUUyBiaXRzIGxvbmcuICBJZiBGQUNUT1JTIGlzCisgICBub24temVybywgYWxsb2NhdGUgYSBuZXcsIE5VTEwtdGVybWluYXRlZCBhcnJheSBob2xkaW5nIHRoZSBwcmltZQorICAgZmFjdG9ycyBhbmQgc3RvcmUgaXQgaW4gRkFDVE9SUy4gIEZMQUdTIG1pZ2h0IGJlIHVzZWQgdG8gaW5mbHVlbmNlCisgICB0aGUgcHJpbWUgbnVtYmVyIGdlbmVyYXRpb24gcHJvY2Vzcy4gICovCitnY3J5X2Vycm9yX3QgZ2NyeV9wcmltZV9nZW5lcmF0ZSAoZ2NyeV9tcGlfdCAqcHJpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHByaW1lX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZhY3Rvcl9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfbXBpX3QgKipmYWN0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfcHJpbWVfY2hlY2tfZnVuY190IGNiX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2JfYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfcmFuZG9tX2xldmVsX3QgcmFuZG9tX2xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFncyk7CisKKy8qIEZpbmQgYSBnZW5lcmF0b3IgZm9yIFBSSU1FIHdoZXJlIHRoZSBmYWN0b3JpemF0aW9uIG9mIChwcmltZS0xKSBpcworICAgaW4gdGhlIE5VTEwgdGVybWluYXRlZCBhcnJheSBGQUNUT1JTLiBSZXR1cm4gdGhlIGdlbmVyYXRvciBhcyBhCisgICBuZXdseSBhbGxvY2F0ZWQgTVBJIGluIFJfRy4gIElmIFNUQVJUX0cgaXMgbm90IE5VTEwsIHVzZSB0aGlzIGFzCisgICB0ZWggc3RhcnQgZm9yIHRoZSBzZWFyY2guICovCitnY3J5X2Vycm9yX3QgZ2NyeV9wcmltZV9ncm91cF9nZW5lcmF0b3IgKGdjcnlfbXBpX3QgKnJfZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NyeV9tcGlfdCBwcmltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NyeV9tcGlfdCAqZmFjdG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NyeV9tcGlfdCBzdGFydF9nKTsKKworCisvKiBDb252ZW5pZW5jZSBmdW5jdGlvbiB0byByZWxlYXNlIHRoZSBGQUNUT1JTIGFycmF5LiAqLwordm9pZCBnY3J5X3ByaW1lX3JlbGVhc2VfZmFjdG9ycyAoZ2NyeV9tcGlfdCAqZmFjdG9ycyk7CisKKworLyogQ2hlY2sgd2V0aGVyIHRoZSBudW1iZXIgWCBpcyBwcmltZS4gICovCitnY3J5X2Vycm9yX3QgZ2NyeV9wcmltZV9jaGVjayAoZ2NyeV9tcGlfdCB4LCB1bnNpZ25lZCBpbnQgZmxhZ3MpOworCisKKwwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICBNaXNjZWxsYW5lb3VzIFN0dWZmICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIExvZyBsZXZlbHMgdXNlZCBieSB0aGUgaW50ZXJuYWwgbG9nZ2luZyBmYWNpbGl0eS4gKi8KK2VudW0gZ2NyeV9sb2dfbGV2ZWxzIAorICB7CisgICAgR0NSWV9MT0dfQ09OVCAgID0gMCwgICAgLyogKENvbnRpbnVlIHRoZSBsYXN0IGxvZyBsaW5lLikgKi8KKyAgICBHQ1JZX0xPR19JTkZPICAgPSAxMCwKKyAgICBHQ1JZX0xPR19XQVJOICAgPSAyMCwKKyAgICBHQ1JZX0xPR19FUlJPUiAgPSAzMCwKKyAgICBHQ1JZX0xPR19GQVRBTCAgPSA0MCwKKyAgICBHQ1JZX0xPR19CVUcgICAgPSA1MCwKKyAgICBHQ1JZX0xPR19ERUJVRyAgPSAxMDAKKyAgfTsKKworLyogVHlwZSBmb3IgcHJvZ3Jlc3MgaGFuZGxlcnMuICAqLwordHlwZWRlZiB2b2lkICgqZ2NyeV9oYW5kbGVyX3Byb2dyZXNzX3QpICh2b2lkICosIGNvbnN0IGNoYXIgKiwgaW50LCBpbnQsIGludCk7CisKKy8qIFR5cGUgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGhhbmRsZXJzLiAgKi8KK3R5cGVkZWYgdm9pZCAqKCpnY3J5X2hhbmRsZXJfYWxsb2NfdCkgKHNpemVfdCBuKTsKKworLyogVHlwZSBmb3Igc2VjdXJlIG1lbW9yeSBjaGVjayBoYW5kbGVycy4gICovCit0eXBlZGVmIGludCAoKmdjcnlfaGFuZGxlcl9zZWN1cmVfY2hlY2tfdCkgKGNvbnN0IHZvaWQgKik7CisKKy8qIFR5cGUgZm9yIG1lbW9yeSByZWFsbG9jYXRpb24gaGFuZGxlcnMuICAqLwordHlwZWRlZiB2b2lkICooKmdjcnlfaGFuZGxlcl9yZWFsbG9jX3QpICh2b2lkICpwLCBzaXplX3Qgbik7CisKKy8qIFR5cGUgZm9yIG1lbW9yeSBmcmVlIGhhbmRsZXJzLiAgKi8KK3R5cGVkZWYgdm9pZCAoKmdjcnlfaGFuZGxlcl9mcmVlX3QpICh2b2lkICopOworCisvKiBUeXBlIGZvciBvdXQtb2YtbWVtb3J5IGhhbmRsZXJzLiAgKi8KK3R5cGVkZWYgaW50ICgqZ2NyeV9oYW5kbGVyX25vX21lbV90KSAodm9pZCAqLCBzaXplX3QsIHVuc2lnbmVkIGludCk7CisKKy8qIFR5cGUgZm9yIGZhdGFsIGVycm9yIGhhbmRsZXJzLiAgKi8KK3R5cGVkZWYgdm9pZCAoKmdjcnlfaGFuZGxlcl9lcnJvcl90KSAodm9pZCAqLCBpbnQsIGNvbnN0IGNoYXIgKik7CisKKy8qIFR5cGUgZm9yIGxvZ2dpbmcgaGFuZGxlcnMuICAqLwordHlwZWRlZiB2b2lkICgqZ2NyeV9oYW5kbGVyX2xvZ190KSAodm9pZCAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CisKKy8qIENlcnRhaW4gb3BlcmF0aW9ucyBjYW4gcHJvdmlkZSBwcm9ncmVzcyBpbmZvcm1hdGlvbi4gIFRoaXMgZnVuY3Rpb24KKyAgIGlzIHVzZWQgdG8gcmVnaXN0ZXIgYSBoYW5kbGVyIGZvciByZXRyaWV2aW5nIHRoZXNlIGluZm9ybWF0aW9uLiAqLwordm9pZCBnY3J5X3NldF9wcm9ncmVzc19oYW5kbGVyIChnY3J5X2hhbmRsZXJfcHJvZ3Jlc3NfdCBjYiwgdm9pZCAqY2JfZGF0YSk7CisKKworLyogUmVnaXN0ZXIgYSBjdXN0b20gbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zLiAqLwordm9pZCBnY3J5X3NldF9hbGxvY2F0aW9uX2hhbmRsZXIgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X2hhbmRsZXJfYWxsb2NfdCBmdW5jX2FsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X2hhbmRsZXJfYWxsb2NfdCBmdW5jX2FsbG9jX3NlY3VyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NyeV9oYW5kbGVyX3NlY3VyZV9jaGVja190IGZ1bmNfc2VjdXJlX2NoZWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X2hhbmRsZXJfcmVhbGxvY190IGZ1bmNfcmVhbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NyeV9oYW5kbGVyX2ZyZWVfdCBmdW5jX2ZyZWUpOworCisvKiBSZWdpc3RlciBhIGZ1bmN0aW9uIHVzZWQgaW5zdGVhZCBvZiB0aGUgaW50ZXJuYWwgb3V0IG9mIG1lbW9yeQorICAgaGFuZGxlci4gKi8KK3ZvaWQgZ2NyeV9zZXRfb3V0b2Zjb3JlX2hhbmRsZXIgKGdjcnlfaGFuZGxlcl9ub19tZW1fdCBoLCB2b2lkICpvcGFxdWUpOworCisvKiBSZWdpc3RlciBhIGZ1bmN0aW9uIHVzZWQgaW5zdGVhZCBvZiB0aGUgaW50ZXJuYWwgZmF0YWwgZXJyb3IKKyAgIGhhbmRsZXIuICovCit2b2lkIGdjcnlfc2V0X2ZhdGFsZXJyb3JfaGFuZGxlciAoZ2NyeV9oYW5kbGVyX2Vycm9yX3QgZm5jLCB2b2lkICpvcGFxdWUpOworCisvKiBSZWdpc3RlciBhIGZ1bmN0aW9uIHVzZWQgaW5zdGVhZCBvZiB0aGUgaW50ZXJuYWwgbG9nZ2luZworICAgZmFjaWxpdHkuICovCit2b2lkIGdjcnlfc2V0X2xvZ19oYW5kbGVyIChnY3J5X2hhbmRsZXJfbG9nX3QgZiwgdm9pZCAqb3BhcXVlKTsKKworLyogUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuICovCit2b2lkIGdjcnlfc2V0X2dldHRleHRfaGFuZGxlciAoY29uc3QgY2hhciAqKCpmKShjb25zdCBjaGFyKikpOworCisvKiBMaWJnY3J5cHQgdXNlcyBpdHMgb3duIG1lbW9yeSBhbGxvY2F0aW9uLiAgSXQgaXMgaW1wb3J0YW50IHRvIHVzZQorICAgZ2NyeV9mcmVlICgpIHRvIHJlbGVhc2UgbWVtb3J5IGFsbG9jYXRlZCBieSBsaWJnY3J5cHQuICovCit2b2lkICpnY3J5X21hbGxvYyAoc2l6ZV90IG4pIF9HQ1JZX0dDQ19BVFRSX01BTExPQzsKK3ZvaWQgKmdjcnlfY2FsbG9jIChzaXplX3Qgbiwgc2l6ZV90IG0pIF9HQ1JZX0dDQ19BVFRSX01BTExPQzsKK3ZvaWQgKmdjcnlfbWFsbG9jX3NlY3VyZSAoc2l6ZV90IG4pIF9HQ1JZX0dDQ19BVFRSX01BTExPQzsKK3ZvaWQgKmdjcnlfY2FsbG9jX3NlY3VyZSAoc2l6ZV90IG4sIHNpemVfdCBtKSBfR0NSWV9HQ0NfQVRUUl9NQUxMT0M7Cit2b2lkICpnY3J5X3JlYWxsb2MgKHZvaWQgKmEsIHNpemVfdCBuKTsKK2NoYXIgKmdjcnlfc3RyZHVwIChjb25zdCBjaGFyICpzdHJpbmcpIF9HQ1JZX0dDQ19BVFRSX01BTExPQzsKK3ZvaWQgKmdjcnlfeG1hbGxvYyAoc2l6ZV90IG4pIF9HQ1JZX0dDQ19BVFRSX01BTExPQzsKK3ZvaWQgKmdjcnlfeGNhbGxvYyAoc2l6ZV90IG4sIHNpemVfdCBtKSBfR0NSWV9HQ0NfQVRUUl9NQUxMT0M7Cit2b2lkICpnY3J5X3htYWxsb2Nfc2VjdXJlIChzaXplX3QgbikgX0dDUllfR0NDX0FUVFJfTUFMTE9DOwordm9pZCAqZ2NyeV94Y2FsbG9jX3NlY3VyZSAoc2l6ZV90IG4sIHNpemVfdCBtKSBfR0NSWV9HQ0NfQVRUUl9NQUxMT0M7Cit2b2lkICpnY3J5X3hyZWFsbG9jICh2b2lkICphLCBzaXplX3Qgbik7CitjaGFyICpnY3J5X3hzdHJkdXAgKGNvbnN0IGNoYXIgKiBhKSBfR0NSWV9HQ0NfQVRUUl9NQUxMT0M7Cit2b2lkICBnY3J5X2ZyZWUgKHZvaWQgKmEpOworCisvKiBSZXR1cm4gdHJ1ZSBpZiBBIGlzIGFsbG9jYXRlZCBpbiAic2VjdXJlIiBtZW1vcnkuICovCitpbnQgZ2NyeV9pc19zZWN1cmUgKGNvbnN0IHZvaWQgKmEpIF9HQ1JZX0dDQ19BVFRSX1BVUkU7CisKKy8qIFJldHVybiB0cnVlIGlmIExpYmdjcnlwdCBpcyBpbiBGSVBTIG1vZGUuICAqLworI2RlZmluZSBnY3J5X2ZpcHNfbW9kZV9hY3RpdmUoKSAgISFnY3J5X2NvbnRyb2wgKEdDUllDVExfRklQU19NT0RFX1AsIDApCisKKworLyogSW5jbHVkZSBzdXBwb3J0IGZvciBMaWJnY3J5cHQgbW9kdWxlcy4gICovCisjaW5jbHVkZSA8Z2NyeXB0LW1vZHVsZS5oPgorCisjaWYgMCAvKiAoS2VlcCBFbWFjc2VucycgYXV0by1pbmRlbnQgaGFwcHkuKSAqLworeworI2VuZGlmCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qIF9HQ1JZUFRfSCAqLwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L3NyYy9nY3J5cHRybmQuYyBiL2xpYmdjcnlwdC0xLjQuNi9zcmMvZ2NyeXB0cm5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE1ZmVjYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9zcmMvZ2NyeXB0cm5kLmMKQEAgLTAsMCArMSw2ODEgQEAKKy8qIGdjcnlwdHJuZC5jIC0gTGliZ2NyeXB0IFJhbmRvbSBOdW1iZXIgRGFlbW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogR2NyeXB0ZW5kIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLAorICogb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBHY3J5cHRybmQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qIFdlIHJlcXVpcmUgdnN5c2xvZyBwdGgKKyAgIFdlIG5lZWQgdG8gdGVzdCBmb3I6ICBzZXRybGltaXQKKworICAgV2Ugc2hvdWxkIGFsc28gcHJpb3JpdGl6ZSByZXF1ZXN0cy4gIFRoaXMgaXMgYmVzdCBkb25lIGJ5IHB1dHRpbmcKKyAgIHRoZSByZXF1ZXN0cyBpbnRvIHF1ZXVlcyBhbmQgaGF2ZSBhIG1haW4gdGhyZWFkIHByb2Nlc3NpbmcgdGhlc2UKKyAgIHF1ZXVlcy4KKworICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdGltZXMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvdW4uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHB0aC5oPgorI2luY2x1ZGUgPGdjcnlwdC5oPgorCisjZGVmaW5lIFBHTSAiZ2NyeXB0cm5kIgorI2RlZmluZSBNWVZFUlNJT05fTElORSBQR00gIiAoTGliZ2NyeXB0KSAiIFZFUlNJT04KKyNkZWZpbmUgQlVHUkVQT1JUX0xJTkUgIlxuUmVwb3J0IGJ1Z3MgdG8gPGJ1Zy1saWJnY3J5cHRAZ251cGcub3JnPi5cbiIKKworLyogUHRoIHdyYXBwZXIgZnVuY3Rpb24gZGVmaW5pdGlvbnMuICovCitHQ1JZX1RIUkVBRF9PUFRJT05fUFRIX0lNUEw7CisKKworLyogRmxhZyBzZXQgdG8gdHJ1ZSBpZiB3ZSBoYXZlIGJlZW4gZGFlbW9uaXplZC4gKi8KK3N0YXRpYyBpbnQgcnVubmluZ19kZXRhY2hlZDsKKy8qIEZsYWcgaW5kaWNhdGluZyB0aGF0IGEgc2h1dGRvd24gaGFzIGJlZW4gcmVxdWVzdGVkLiAgKi8KK3N0YXRpYyBpbnQgc2h1dGRvd25fcGVuZGluZzsKKy8qIENvdW50ZXIgZm9yIGFjdGl2ZSBjb25uZWN0aW9ucy4gICovCitzdGF0aWMgaW50IGFjdGl2ZV9jb25uZWN0aW9uczsKKworCisKKy8qIExvY2FsIHByb3RvdHlwZXMuICAqLworc3RhdGljIHZvaWQgc2VydmUgKGludCBsaXN0ZW5fZmQpOworCisKKworDAorCisvKiBUbyBhdm9pZCB0aGF0IGEgY29tcGlsZXIgb3B0aW1pemVzIGNlcnRhaW4gbWVtc2V0IGNhbGxzIGF3YXksIHRoZXNlCisgICBtYWNyb3MgbWF5IGJlIHVzZWQgaW5zdGVhZC4gKi8KKyNkZWZpbmUgd2lwZW1lbW9yeTIoX3B0cixfc2V0LF9sZW4pIGRvIHsgXAorICAgICAgICAgICAgICB2b2xhdGlsZSBjaGFyICpfdnB0cj0odm9sYXRpbGUgY2hhciAqKShfcHRyKTsgXAorICAgICAgICAgICAgICBzaXplX3QgX3ZsZW49KF9sZW4pOyBcCisgICAgICAgICAgICAgIHdoaWxlKF92bGVuKSB7ICpfdnB0cj0oX3NldCk7IF92cHRyKys7IF92bGVuLS07IH0gXAorICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwKQorI2RlZmluZSB3aXBlbWVtb3J5KF9wdHIsX2xlbikgd2lwZW1lbW9yeTIoX3B0ciwwLF9sZW4pCisKKworCisKKy8qIEVycm9yIHByaW50aW5nIHV0aWxpdHkuICBQUklPUklUWSBzaG91bGQgYmUgb25lIG9mIHN5c2xvZydzCisgICBwcmlvcml0eSBsZXZlbHMuICBUaGlzIGZ1Y250aW9ucyBwcmludHMgdG8gdGhlIHN0ZGVycm8gb3Igc3lzbG9nCisgICBkZXBlbmRpbmcgb24gd2hldGhlciB3ZSBhcmUgYWxyZWFkeSBkYWVtb25pemVkLiAqLworc3RhdGljIHZvaWQKK2xvZ2l0IChpbnQgcHJpb3JpdHksIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICB2YV9saXN0IGFyZ19wdHI7CisKKyAgdmFfc3RhcnQgKGFyZ19wdHIsIGZvcm1hdCkgOworICBpZiAocnVubmluZ19kZXRhY2hlZCkKKyAgICB7CisgICAgICB2c3lzbG9nIChwcmlvcml0eSwgZm9ybWF0LCBhcmdfcHRyKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmcHV0cyAoUEdNICI6ICIsIHN0ZGVycik7CisgICAgICB2ZnByaW50ZiAoc3RkZXJyLCBmb3JtYXQsIGFyZ19wdHIpOworICAgICAgcHV0YyAoJ1xuJywgc3RkZXJyKTsKKyAgICB9CisgIHZhX2VuZCAoYXJnX3B0cik7Cit9CisKKy8qIENhbGxiYWNrIHVzZWQgYnkgbGliZ2NyeXB0IGZvciBsb2dnaW5nLiAqLworc3RhdGljIHZvaWQKK215X2djcnlfbG9nZ2VyICh2b2lkICpkdW1teSwgaW50IGxldmVsLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJnX3B0cikKK3sKKyAgKHZvaWQpZHVtbXk7CisKKyAgLyogTWFwIHRoZSBsb2cgbGV2ZWxzLiAqLworICBzd2l0Y2ggKGxldmVsKQorICAgIHsKKyAgICBjYXNlIEdDUllfTE9HX0NPTlQ6IGxldmVsID0gTE9HX0lORk8gLyogRklYTUUgKi87IGJyZWFrOworICAgIGNhc2UgR0NSWV9MT0dfSU5GTzogbGV2ZWwgPSBMT0dfSU5GTzsgYnJlYWs7CisgICAgY2FzZSBHQ1JZX0xPR19XQVJOOiBsZXZlbCA9IExPR19XQVJOSU5HOyBicmVhazsKKyAgICBjYXNlIEdDUllfTE9HX0VSUk9SOmxldmVsID0gTE9HX0VSUjsgYnJlYWs7CisgICAgY2FzZSBHQ1JZX0xPR19GQVRBTDpsZXZlbCA9IExPR19DUklUOyBicmVhazsKKyAgICBjYXNlIEdDUllfTE9HX0JVRzogIGxldmVsID0gTE9HX0NSSVQ7IGJyZWFrOworICAgIGNhc2UgR0NSWV9MT0dfREVCVUc6bGV2ZWwgPSBMT0dfREVCVUc7IGJyZWFrOworICAgIGRlZmF1bHQ6ICAgICAgICAgICAgbGV2ZWwgPSBMT0dfRVJSOyBicmVhazsgIAorICAgIH0KKyAgaWYgKHJ1bm5pbmdfZGV0YWNoZWQpCisgICAgeworICAgICAgdnN5c2xvZyAobGV2ZWwsIGZvcm1hdCwgYXJnX3B0cik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZnB1dHMgKFBHTSAiOiAiLCBzdGRlcnIpOworICAgICAgdmZwcmludGYgKHN0ZGVyciwgZm9ybWF0LCBhcmdfcHRyKTsKKyAgICAgIGlmICghKmZvcm1hdCB8fCBmb3JtYXRbc3RybGVuIChmb3JtYXQpLTFdICE9ICdcbicpCisgICAgICAgIHB1dGMgKCdcbicsIHN0ZGVycik7CisgICAgfQorfQorCisKKy8qIFRoZSBjbGVhbnVwIGhhbmRsZXIgLSB1c2VkIHRvIHdpcGUgb3V0IHRoZSBzZWN1cmUgbWVtb3J5LiAqLworc3RhdGljIHZvaWQKK2NsZWFudXAgKHZvaWQpCit7CisgIGdjcnlfY29udHJvbCAoR0NSWUNUTF9URVJNX1NFQ01FTSApOworfQorCisKKy8qIE1ha2UgdXMgYSBkYWVtb24gYW5kIG9wZW4gdGhlIHN5c2xvZy4gKi8KK3N0YXRpYyB2b2lkCitkYWVtb25pemUgKHZvaWQpCit7CisgIGludCBpOworICBwaWRfdCBwaWQ7CisKKyAgZmZsdXNoIChOVUxMKTsKKworICBwaWQgPSBmb3JrICgpOworICBpZiAocGlkID09IChwaWRfdCktMSkgCisgICAgeworICAgICAgbG9naXQgKExPR19DUklULCAiZm9yayBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisgIGlmIChwaWQpCisgICAgZXhpdCAoMCk7IAorCisgIGlmIChzZXRzaWQoKSA9PSAtMSkKKyAgICB7CisgICAgICBsb2dpdCAoTE9HX0NSSVQsICJzZXRzaWQoKSBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKyAgCisgIHNpZ25hbCAoU0lHSFVQLCBTSUdfSUdOKTsKKworICBwaWQgPSBmb3JrICgpOworICBpZiAocGlkID09IChwaWRfdCktMSkgCisgICAgeworICAgICAgbG9naXQgKExPR19DUklULCBQR00gIjogc2Vjb25kIGZvcmsgZmFpbGVkOiAlcyIsIHN0cmVycm9yIChlcnJubykpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorICBpZiAocGlkKQorICAgIGV4aXQgKDApOyAvKiBGaXJzdCBjaGlsZCBleGl0cy4gKi8KKworICBydW5uaW5nX2RldGFjaGVkID0gMTsKKworICBpZiAoY2hkaXIoIi8iKSkKKyAgICB7CisgICAgICBsb2dpdCAoTE9HX0NSSVQsICJjaGRpcihcIi9cIikgZmFpbGVkOiAlcyIsIHN0cmVycm9yIChlcnJubykpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorICB1bWFzayAoMCk7CisKKyAgZm9yIChpPTA7IGkgPD0gMjsgaSsrKQorICAgIGNsb3NlIChpKTsKKworICBvcGVubG9nIChQR00sIExPR19QSUQsIExPR19EQUVNT04pOworfQorCisKK3N0YXRpYyB2b2lkCitkaXNhYmxlX2NvcmVfZHVtcHMgKHZvaWQpCit7CisjaWZkZWYgSEFWRV9TRVRSTElNSVQKKyAgc3RydWN0IHJsaW1pdCBsaW1pdDsKKworICBpZiAoZ2V0cmxpbWl0IChSTElNSVRfQ09SRSwgJmxpbWl0KSkKKyAgICBsaW1pdC5ybGltX21heCA9IDA7CisgIGxpbWl0LnJsaW1fY3VyID0gMDsKKyAgaWYoICFzZXRybGltaXQgKFJMSU1JVF9DT1JFLCAmbGltaXQpICkKKyAgICByZXR1cm4gMDsKKyAgaWYgKGVycm5vICE9IEVJTlZBTCAmJiBlcnJubyAhPSBFTk9TWVMpCisgICAgbG9naXQgKExPR19FUlIsICJjYW4ndCBkaXNhYmxlIGNvcmUgZHVtcHM6ICVzXG4iLCBzdHJlcnJvciAoZXJybm8pKTsKKyNlbmRpZiAvKiBIQVZFX1NFVFJMSU1JVCAqLworfQorCisKKworc3RhdGljIHZvaWQKK3ByaW50X3ZlcnNpb24gKGludCB3aXRoX2hlbHApCit7CisgIGZwdXRzIChNWVZFUlNJT05fTElORSAiXG4iCisgICAgICAgICAiQ29weXJpZ2h0IChDKSAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLlxuIgorICAgICAgICAgIkxpY2Vuc2UgR1BMdjIrOiBHTlUgR1BMIHZlcnNpb24gMiBvciBsYXRlciAiCisgICAgICAgICAiPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sPlxuIgorICAgICAgICAgIlRoaXMgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGFyZSBmcmVlIHRvIGNoYW5nZSBhbmQgcmVkaXN0cmlidXRlIGl0LlxuIgorICAgICAgICAgIlRoZXJlIGlzIE5PIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXcuXG4iLAorICAgICAgICAgc3Rkb3V0KTsKKyAgICAgICAgCisgIGlmICh3aXRoX2hlbHApCisgICAgZnB1dHMgKCJcbiIKKyAgICAgICAgICAgIlVzYWdlOiAiIFBHTSAiIFtPUFRJT05TXSBbU09DS0VUTkFNRV1cbiIKKyAgICAgICAgICAgIlN0YXJ0IExpYmdjcnlwdCdzIHJhbmRvbSBudW1iZXIgZGFlbW9uIGxpc3RlbmluZyIKKyAgICAgICAgICAgIiBvbiBzb2NrZXQgU09DS0VUTkFNRVxuIgorICAgICAgICAgICAiU09DS0VUTkFNRSBkZWZhdWx0cyB0byBYWFhcbiIKKyAgICAgICAgICAgIlxuIgorICAgICAgICAgICAiICAtLW5vLWRldGFjaCAgIGRvIG5vdCBkZWF0YWNoIGZyb20gdGhlIGNvbnNvbGVcbiIgICAgICAgIAorICAgICAgICAgICAiICAtLXZlcnNpb24gICAgIHByaW50IHZlcnNpb24gb2YgdGhlIHByb2dyYW0gYW5kIGV4aXRcbiIKKyAgICAgICAgICAgIiAgLS1oZWxwICAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdFxuIgorICAgICAgICAgICBCVUdSRVBPUlRfTElORSwgc3Rkb3V0ICk7CisgIAorICBleGl0ICgwKTsKK30KKworc3RhdGljIGludAorcHJpbnRfdXNhZ2UgKHZvaWQpCit7CisgIGZwdXRzICgidXNhZ2U6ICIgUEdNICIgW09QVElPTlNdIFtTT0NLRVROQU1FXVxuIiwgc3RkZXJyKTsKKyAgZnB1dHMgKCIgICAgICAgKHVzZSAtLWhlbHAgdG8gZGlzcGxheSBvcHRpb25zKVxuIiwgc3RkZXJyKTsKKyAgZXhpdCAoMSk7Cit9CisKKworaW50IAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBpbnQgbm9fZGV0YWNoID0gMDsKKyAgZ3BnX2Vycm9yX3QgZXJyOworICBzdHJ1Y3Qgc29ja2FkZHJfdW4gKnNydnJfYWRkcjsKKyAgc29ja2xlbl90IGFkZHJsZW47CisgIGludCBmZDsKKyAgaW50IHJjOworICBjb25zdCBjaGFyICpzb2NrZXRuYW1lID0gIi92YXIvcnVuL2xpYmdjcnlwdC9TLmdjcnlwdHJuZCI7CisKKyAKKyAgaWYgKGFyZ2MpCisgICAgeworICAgICAgYXJnYy0tOyBhcmd2Kys7CisgICAgfQorICB3aGlsZSAoYXJnYyAmJiAqKmFyZ3YgPT0gJy0nICYmICgqYXJndilbMV0gPT0gJy0nKQorICAgIHsKKyAgICAgIGlmICghKCphcmd2KVsyXSkKKyAgICAgICAgeworICAgICAgICAgIGFyZ2MtLTsgYXJndisrOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBlbHNlIGlmICghc3RyY21wICgqYXJndiwgIi0tdmVyc2lvbiIpKQorICAgICAgICBwcmludF92ZXJzaW9uICgwKTsKKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKCphcmd2LCAiLS1oZWxwIikpCisgICAgICAgIHByaW50X3ZlcnNpb24gKDEpOworICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3YsICItLW5vLWRldGFjaCIpKQorICAgICAgICB7CisgICAgICAgICAgbm9fZGV0YWNoID0gMTsKKyAgICAgICAgICBhcmdjLS07IGFyZ3YrKzsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBwcmludF91c2FnZSAoKTsKKyAgICB9ICAgICAgICAgIAorIAorICBpZiAoYXJnYyA9PSAxKQorICAgIHNvY2tldG5hbWUgPSBhcmd2WzBdOworICBlbHNlIGlmIChhcmdjID4gMSkKKyAgICBwcmludF91c2FnZSAoKTsKKworICBpZiAoIW5vX2RldGFjaCkKKyAgICBkYWVtb25pemUgKCk7CisKKyAgc2lnbmFsIChTSUdQSVBFLCBTSUdfSUdOKTsKKworICBsb2dpdCAoTE9HX05PVElDRSwgInN0YXJ0ZWQgdmVyc2lvbiAiIFZFUlNJT04gKTsKKworICAvKiBMaWJnY3J5cHQgcmVxdWlyZXMgdXMgdG8gcmVnaXN0ZXIgdGhlIHRocmVhZGluZyBtb2RlbCBiZWZvcmUgd2UKKyAgICAgZG8gYW55dGhpbmcgZWxzZSB3aXRoIGl0LiBOb3RlIHRoYXQgdGhpcyBhbHNvIGNhbGxzIHB0aF9pbml0LiAgV2UKKyAgICAgZG8gdGhlIGluaXRpYWxpemF0aW9uIHdoaWxlIGFscmVhZHkgcnVubmluZyBhcyBhIGRhZW1vbiB0byBhdm9pZAorICAgICBvdmVyaGVhZCB3aXRoIGRvdWJsZSBpbml0aWFsaXphdGlvbiBvZiBMaWJnY3J5cHQuICovCisgIGVyciA9IGdjcnlfY29udHJvbCAoR0NSWUNUTF9TRVRfVEhSRUFEX0NCUywgJmdjcnlfdGhyZWFkc19wdGgpOworICBpZiAoZXJyKQorICAgIHsKKyAgICAgIGxvZ2l0IChMT0dfQ1JJVCwgImNhbid0IHJlZ2lzdGVyIEdOVSBQdGggd2l0aCBMaWJnY3J5cHQ6ICVzIiwKKyAgICAgICAgICAgICBncGdfc3RyZXJyb3IgKGVycikpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIC8qIENoZWNrIHRoYXQgdGhlIGxpYmdjcnlwdCB2ZXJzaW9uIGlzIHN1ZmZpY2llbnQuICAqLworICBpZiAoIWdjcnlfY2hlY2tfdmVyc2lvbiAoVkVSU0lPTikgKQorICAgIHsKKyAgICAgIGxvZ2l0IChMT0dfQ1JJVCwgImxpYmdjcnlwdCBpcyB0b28gb2xkIChuZWVkICVzLCBoYXZlICVzKSIsCisgICAgICAgICAgICAgVkVSU0lPTiwgZ2NyeV9jaGVja192ZXJzaW9uIChOVUxMKSApOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIC8qIFJlZ2lzdGVyIHRoZSBsb2dnaW5nIGNhbGxiYWNrIGFuZCB0ZWxsIExpYmNncnlwdCB0byBwdXQgdGhlCisgICAgIHJhbmRvbSBwb29sIGludG8gc2VjdXJlIG1lbW9yeS4gKi8KKyAgZ2NyeV9zZXRfbG9nX2hhbmRsZXIgKG15X2djcnlfbG9nZ2VyLCBOVUxMKTsKKyAgZ2NyeV9jb250cm9sIChHQ1JZQ1RMX1VTRV9TRUNVUkVfUk5EUE9PTCk7CisKKyAgLyogT2J2aW91c2x5IHdlIGRvbid0IHdhbnQgdG8gYWxsb3cgYW55IGNvcmUgZHVtcHMuICovCisgIGRpc2FibGVfY29yZV9kdW1wcyAoKTsKKworICAvKiBJbml0aWFsaXplIHRoZSBzZWN1cmUgbWVtb3J5IHN0dWZmIHdoaWNoIHdpbGwgYWxzbyBkcm9wIGFueSBleHRyYQorICAgICBwcml2aWxlZ2VzIHdlIGhhdmUuICovCisgIGdjcnlfY29udHJvbCAoR0NSWUNUTF9JTklUX1NFQ01FTSwgMTYzODQsIDApOworCisgIC8qIFJlZ2lzdGVyIGEgY2xlYW51cCBoYW5kbGVyLiAqLworICBhdGV4aXQgKGNsZWFudXApOworCisgIC8qIENyZWF0ZSBhbmQgbGlzdGVuIG9uIHRoZSBzb2NrZXQuICovCisgIGZkID0gc29ja2V0IChBRl9VTklYLCBTT0NLX1NUUkVBTSwgMCk7CisgIGlmIChmZCA9PSAtMSkKKyAgICB7CisgICAgICBsb2dpdCAoTE9HX0NSSVQsICJjYW4ndCBjcmVhdGUgc29ja2V0OiAlcyIsIHN0cmVycm9yIChlcnJubykpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorICBzcnZyX2FkZHIgPSBnY3J5X3htYWxsb2MgKHNpemVvZiAqc3J2cl9hZGRyKTsgCisgIG1lbXNldCAoc3J2cl9hZGRyLCAwLCBzaXplb2YgKnNydnJfYWRkcik7CisgIHNydnJfYWRkci0+c3VuX2ZhbWlseSA9IEFGX1VOSVg7CisgIGlmIChzdHJsZW4gKHNvY2tldG5hbWUpICsgMSA+PSBzaXplb2YgKHNydnJfYWRkci0+c3VuX3BhdGgpKQorICAgIHsKKyAgICAgIGxvZ2l0IChMT0dfQ1JJVCwgInNvY2tldCBuYW1lIGAlcycgdG9vIGxvbmciLCBzb2NrZXRuYW1lKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKyAgc3RyY3B5IChzcnZyX2FkZHItPnN1bl9wYXRoLCBzb2NrZXRuYW1lKTsKKyAgYWRkcmxlbiA9IChvZmZzZXRvZiAoc3RydWN0IHNvY2thZGRyX3VuLCBzdW5fcGF0aCkKKyAgICAgICAgICAgICArIHN0cmxlbiAoc3J2cl9hZGRyLT5zdW5fcGF0aCkgKyAxKTsKKyAgcmMgPSBiaW5kIChmZCwgKHN0cnVjdCBzb2NrYWRkciopIHNydnJfYWRkciwgYWRkcmxlbik7CisgIGlmIChyYyA9PSAtMSAmJiBlcnJubyA9PSBFQUREUklOVVNFKQorICAgIHsKKyAgICAgIHJlbW92ZSAoc29ja2V0bmFtZSk7CisgICAgICByYyA9IGJpbmQgKGZkLCAoc3RydWN0IHNvY2thZGRyKikgc3J2cl9hZGRyLCBhZGRybGVuKTsKKyAgICB9CisgIGlmIChyYyA9PSAtMSkKKyAgICB7CisgICAgICBsb2dpdCAoTE9HX0NSSVQsICJlcnJvciBiaW5kaW5nIHNvY2tldCB0byBgJXMnOiAlcyIsCisgICAgICAgICAgICAgc3J2cl9hZGRyLT5zdW5fcGF0aCwgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBjbG9zZSAoZmQpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGlmIChsaXN0ZW4gKGZkLCA1ICkgPT0gLTEpCisgICAgeworICAgICAgbG9naXQgKExPR19DUklULCAibGlzdGVuKCkgZmFpbGVkOiAlcyIsIHN0cmVycm9yIChlcnJubykpOworICAgICAgY2xvc2UgKGZkKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKyAgCisgIGxvZ2l0IChMT0dfSU5GTywgImxpc3RlbmluZyBvbiBzb2NrZXQgYCVzJywgZmQ9JWQiLAorICAgICAgICAgc3J2cl9hZGRyLT5zdW5fcGF0aCwgZmQpOworCisgIHNlcnZlIChmZCk7CisgIGNsb3NlIChmZCk7CisKKyAgbG9naXQgKExPR19OT1RJQ0UsICJzdG9wcGVkIHZlcnNpb24gIiBWRVJTSU9OICk7CisgIHJldHVybiAwOworfQorCisKKy8qIFNlbmQgTEVOR1RIIGJ5dGVzIG9mIEJVRkZFUiB0byBmaWxlIGRlc2NyaXB0b3IgRkQuICBSZXR1cm5zIDAgb24KKyAgIHN1Y2Nlc3Mgb3IgYW5vdGhlciB2YWx1ZSBvbiB3cml0ZSBlcnJvci4gKi8KK3N0YXRpYyBpbnQKK3dyaXRlbiAoaW50IGZkLCBjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBsZW5ndGgpCit7CisgIHdoaWxlIChsZW5ndGgpCisgICAgeworICAgICAgc3NpemVfdCBuID0gcHRoX3dyaXRlIChmZCwgYnVmZmVyLCBsZW5ndGgpOworICAgICAgaWYgKG4gPCAwKQorICAgICAgICAgeworICAgICAgICAgICBsb2dpdCAoTE9HX0VSUiwgImNvbm5lY3Rpb24gJWQ6IHdyaXRlIGVycm9yOiAlcyIsCisgICAgICAgICAgICAgICAgICBmZCwgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgIHJldHVybiAtMTsgLyogd3JpdGUgZXJyb3IgKi8KKyAgICAgICAgIH0KKyAgICAgIGxlbmd0aCAtPSBuOworICAgICAgYnVmZmVyID0gKGNvbnN0IGNoYXIqKWJ1ZmZlciArIG47CisgICAgfQorICByZXR1cm4gMDsgIC8qIE9rYXkgKi8KK30KKworCisvKiBTZW5kIGFuIGVycm9yIHJlc3BvbnNlIGJhY2suICBSZXR1cm5zIDAgb24gc3VjY2Vzcy4gKi8KK3N0YXRpYyBpbnQKK3NlbmRfZXJyb3IgKGludCBmZCwgaW50IGVycmNvZGUpCit7CisgIHVuc2lnbmVkIGNoYXIgYnVmWzJdOworCisgIGJ1ZlswXSA9IGVycmNvZGU7CisgIGJ1ZlsxXSA9IDA7CisgIHJldHVybiB3cml0ZW4gKGZkLCBidWYsIDIgKTsKK30KKworLyogU2VuZCBhIHBvbmcgcmVzcG9uc2UgYmFjay4gIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIGFub3RoZXIgdmFsdWUKKyAgIG9uIHdyaXRlIGVycm9yLiAgKi8KK3N0YXRpYyBpbnQKK3NlbmRfcG9uZyAoaW50IGZkKQoreworICByZXR1cm4gd3JpdGVuIChmZCwgIlx4MDBceDA0cG9uZyIsIDYpOworfQorCisvKiBTZW5kIGEgbm9uY2Ugb2Ygc2l6ZSBMRU5HVEggYmFjay4gUmV0dXJuIDAgb24gc3VjY2Vzcy4gKi8KK3N0YXRpYyBpbnQKK3NlbmRfbm9uY2UgKGludCBmZCwgaW50IGxlbmd0aCkKK3sKKyAgdW5zaWduZWQgY2hhciBidWZbMisyNTVdOworICBpbnQgcmM7CisKKyAgYXNzZXJ0IChsZW5ndGggPj0gMCAmJiBsZW5ndGggPD0gMjU1KTsKKyAgYnVmWzBdID0gMDsKKyAgYnVmWzFdID0gbGVuZ3RoOworICBnY3J5X2NyZWF0ZV9ub25jZSAoYnVmKzIsIGxlbmd0aCk7CisgIHJjID0gd3JpdGVuIChmZCwgYnVmLCAyK2xlbmd0aCApOworICB3aXBlbWVtb3J5IChidWYrMiwgbGVuZ3RoKTsKKyAgcmV0dXJuIHJjOworfQorCisvKiBTZW5kIGEgcmFuZG9tIG9mIHNpemUgTEVOR1RIIHdpdGggcXVhbGl0eSBMRVZFTCBiYWNrLiBSZXR1cm4gMCBvbgorICAgc3VjY2Vzcy4gKi8KK3N0YXRpYyBpbnQKK3NlbmRfcmFuZG9tIChpbnQgZmQsIGludCBsZW5ndGgsIGludCBsZXZlbCkKK3sKKyAgdW5zaWduZWQgY2hhciBidWZbMisyNTVdOworICBpbnQgcmM7CisKKyAgYXNzZXJ0IChsZW5ndGggPj0gMCAmJiBsZW5ndGggPD0gMjU1KTsKKyAgYXNzZXJ0IChsZXZlbCA9PSBHQ1JZX1NUUk9OR19SQU5ET00gfHwgbGV2ZWwgPT0gR0NSWV9WRVJZX1NUUk9OR19SQU5ET00pOworICBidWZbMF0gPSAwOworICBidWZbMV0gPSBsZW5ndGg7CisgIC8qIE5vdGUgdGhhdCB3ZSBkb24ndCBib3RoZXIgcHV0dGluZyB0aGUgcmFuZG9tIHN0dWZmIGludG8gc2VjdXJlCisgICAgIG1lbW9yeSBiZWNhdXNlIHRoaXMgZGFlbW9uIGlzIGFueXdheSBpbnRlbmRlZCB0byBiZSBydW4gdW5kZXIKKyAgICAgcm9vdCBhbmQgaXQgaXMgcXVlc3Rpb25hYmxlIHdoZXRoZXIgdGhlIGtlcm5lbCBidWZmZXJzIGV0Yy4gYXJlCisgICAgIGVxdWFsbHkgd2VsbCBwcm90ZWN0ZWQuICovCisgIGdjcnlfcmFuZG9taXplIChidWYrMiwgbGVuZ3RoLCBsZXZlbCk7CisgIHJjID0gd3JpdGVuIChmZCwgYnVmLCAyK2xlbmd0aCApOworICB3aXBlbWVtb3J5IChidWYrMiwgbGVuZ3RoKTsKKyAgcmV0dXJuIHJjOworfQorCisvKiBNYWluIHByb2Nlc3NpbmcgbG9vcCBmb3IgYSBjb25uZWN0aW9uLgorCisgICBBIHJlcXVlc3QgaXMgbWFkZSB1cCBvZjoKKworICAgIDEgYnl0ZSAgVG90YWwgbGVuZ3RoIG9mIHJlcXVlc3Q7IG11c3QgYmUgMworICAgIDEgYnl0ZSAgQ29tbWFuZAorICAgICAgICAgICAgMCAgID0gUGluZworICAgICAgICAgICAgMTAgID0gR2V0Tm9uY2UKKyAgICAgICAgICAgIDExICA9IEdldFN0cm9uZ1JhbmRvbQorICAgICAgICAgICAgMTIgID0gR2V0VmVyeVN0cm9uZ1JhbmRvbQorICAgICAgICAgICAgKGFsbCBvdGhlciB2YWx1ZXMgYXJlIHJlc2VydmVkKQorICAgIDEgYnl0ZSAgTnVtYmVyIG9mIHJlcXVlc3RlZCBieXRlcy4KKyAgICAgICAgICAgIFRoaXMgaXMgaWdub3JlZCBmb3IgY29tbWFuZCBQaW5nLgorCisgICBBIHJlc3BvbnNlIGlzIG1hZGUgdXAgb2Y6CisKKyAgICAxIGJ5dGUgIEVycm9yIENvZGUKKyAgICAgICAgICAgIDAgICAgPSBFdmVyeXRoaW5nIGlzIGZpbmUKKyAgICAgICAgICAgIDEgICAgPSBCYWQgQ29tbWFuZAorICAgICAgICAgICAgMHhmZiA9IE90aGVyIGVycm9yLgorICAgICAgICAgICAgKEZvciBhIGJhZCByZXF1ZXN0IHRoZSBjb25uZWN0aW9uIHdpbGwgc2ltcGx5IGJlIGNsb3NlZCkKKyAgICAxIGJ5dGUgIExlbmd0aCBvZiBkYXRhCisgICAgbiBieXRlICBkYXRhCisKKyAgIFRoZSByZXF1ZXN0cyBhcmUgcmVhZCBhcyBsb25nIGFzIHRoZSBjb25uZWN0aW9uIGlzIG9wZW4uCisKKworICovCitzdGF0aWMgdm9pZAorY29ubmVjdGlvbl9sb29wIChpbnQgZmQpCit7CisgIHVuc2lnbmVkIGNoYXIgcmVxdWVzdFszXTsKKyAgdW5zaWduZWQgY2hhciAqcDsKKyAgaW50IG5sZWZ0LCBuOworICBpbnQgcmM7CisKKyAgZm9yICg7OykKKyAgICB7CisgICAgICBmb3IgKG5sZWZ0PTMsIHA9cmVxdWVzdDsgbmxlZnQgPiAwOyApCisgICAgICAgIHsKKyAgICAgICAgICBuID0gcHRoX3JlYWQgKGZkLCBwLCBubGVmdCk7CisgICAgICAgICAgaWYgKCFuICYmIHAgPT0gcmVxdWVzdCkKKyAgICAgICAgICAgIHJldHVybjsgLyogQ2xpZW50IHRlcm1pbmF0ZWQgY29ubmVjdGlvbi4gKi8KKyAgICAgICAgICBpZiAobiA8PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBsb2dpdCAoTE9HX0VSUiwgImNvbm5lY3Rpb24gJWQ6IHJlYWQgZXJyb3I6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgIGZkLCBuPyBzdHJlcnJvciAoZXJybm8pIDogIlVuZXhwZWN0ZWQgRU9GIik7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBwICs9IG47CisgICAgICAgICAgbmxlZnQgLT0gbjsKKyAgICAgICAgfQorICAgICAgaWYgKHJlcXVlc3RbMF0gIT0gMykKKyAgICAgICAgeworICAgICAgICAgIGxvZ2l0IChMT0dfRVJSLCAiY29ubmVjdGlvbiAlZDogaW52YWxpZCBsZW5ndGggKCVkKSBvZiByZXF1ZXN0IiwKKyAgICAgICAgICAgICAgICAgZmQsIHJlcXVlc3RbMF0pOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICBzd2l0Y2ggKHJlcXVlc3RbMV0pCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAwOiAvKiBQaW5nICovCisgICAgICAgICAgcmMgPSBzZW5kX3BvbmcgKGZkKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMDogLyogR2V0Tm9uY2UgKi8KKyAgICAgICAgICByYyA9IHNlbmRfbm9uY2UgKGZkLCByZXF1ZXN0WzJdKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMTogLyogR2V0U3Ryb25nUmFuZG9tICovCisgICAgICAgICAgcmMgPSBzZW5kX3JhbmRvbSAoZmQsIHJlcXVlc3RbMl0sIEdDUllfU1RST05HX1JBTkRPTSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTI6IC8qIEdldFZlcnlTdHJvbmdSYW5kb20gKi8KKyAgICAgICAgICByYyA9IHNlbmRfcmFuZG9tIChmZCwgcmVxdWVzdFsyXSwgR0NSWV9WRVJZX1NUUk9OR19SQU5ET00pOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6IC8qIEludmFsaWQgY29tbWFuZCAqLworICAgICAgICAgIHJjID0gc2VuZF9lcnJvciAoZmQsIDEpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBpZiAocmMpCisgICAgICAgIGJyZWFrOyAvKiBBIHdyaXRlIGVycm9yIG9jY3VyZWQgd2hpbGUgc2VuZGluZyB0aGUgcmVzcG9uc2UuICovCisgICAgfQorfQorCisKKworLyogRW50cnkgcG9pbnQgZm9yIGEgY29ubmVjdGlvbidzIHRocmVhZC4gKi8KK3N0YXRpYyB2b2lkICoKK2Nvbm5lY3Rpb25fdGhyZWFkICh2b2lkICphcmcpCit7CisgIGludCBmZCA9IChpbnQpYXJnOworCisgIGFjdGl2ZV9jb25uZWN0aW9ucysrOworICBsb2dpdCAoTE9HX0lORk8sICJjb25uZWN0aW9uIGhhbmRsZXIgZm9yIGZkICVkIHN0YXJ0ZWQiLCBmZCk7CisKKyAgY29ubmVjdGlvbl9sb29wIChmZCk7CisKKyAgY2xvc2UgKGZkKTsKKyAgbG9naXQgKExPR19JTkZPLCAiY29ubmVjdGlvbiBoYW5kbGVyIGZvciBmZCAlZCB0ZXJtaW5hdGVkIiwgZmQpOworICBhY3RpdmVfY29ubmVjdGlvbnMtLTsKKyAgCisgIHJldHVybiBOVUxMOworfQorCisKKy8qIFRoaXMgc2lnbmFsIGhhbmRsZXIgaXMgY2FsbGVkIGZyb20gdGhlIG1haW4gbG9vcCBiZXR3ZWVuIGFjZXB0aW5nCisgICBjb25uZWN0aW9ucy4gIEl0IGlzIGNhbGxlZCBvbiB0aGUgcmVndWxhciBzdGFjaywgdGh1cyBubyBzcGVjaWFsCisgICBjYXV0aW9uIG5lZWRzIHRvIGJlIHRha2VuLiAgSXQgcmV0dXJucyB0cnVlIHRvIGluZGljYXRlIHRoYXQgdGhlCisgICBwcm9jZXNzIHNob3VsZCB0ZXJtaW5hdGUuICovCitzdGF0aWMgaW50CitoYW5kbGVfc2lnbmFsIChpbnQgc2lnbm8pCit7CisgIHN3aXRjaCAoc2lnbm8pCisgICAgeworICAgIGNhc2UgU0lHSFVQOgorICAgICAgbG9naXQgKExPR19OT1RJQ0UsICJTSUdIVVAgcmVjZWl2ZWQgLSByZS1yZWFkaW5nIGNvbmZpZ3VyYXRpb24iKTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBTSUdVU1IxOgorICAgICAgbG9naXQgKExPR19OT1RJQ0UsICJTSUdVU1IxIHJlY2VpdmVkIC0gbm8gYWN0aW9uIGRlZmluZWQiKTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBTSUdVU1IyOgorICAgICAgbG9naXQgKExPR19OT1RJQ0UsICJTSUdVU1IyIHJlY2VpdmVkIC0gbm8gYWN0aW9uIGRlZmluZWQiKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTSUdURVJNOgorICAgICAgaWYgKCFzaHV0ZG93bl9wZW5kaW5nKQorICAgICAgICBsb2dpdCAoTE9HX05PVElDRSwgIlNJR1RFUk0gcmVjZWl2ZWQgLSBzaHV0dGluZyBkb3duIC4uLiIpOworICAgICAgZWxzZQorICAgICAgICBsb2dpdCAoTE9HX05PVElDRSwgIlNJR1RFUk0gcmVjZWl2ZWQgLSBzdGlsbCAlZCBhY3RpdmUgY29ubmVjdGlvbnMiLAorICAgICAgICAgICAgICAgYWN0aXZlX2Nvbm5lY3Rpb25zKTsKKyAgICAgIHNodXRkb3duX3BlbmRpbmcrKzsKKyAgICAgIGlmIChzaHV0ZG93bl9wZW5kaW5nID4gMikKKyAgICAgICAgeworICAgICAgICAgIGxvZ2l0IChMT0dfTk9USUNFLCAic2h1dGRvd24gZm9yY2VkIik7CisgICAgICAgICAgcmV0dXJuIDE7CisJfQorICAgICAgYnJlYWs7CisgICAgICAgIAorICAgIGNhc2UgU0lHSU5UOgorICAgICAgbG9naXQgKExPR19OT1RJQ0UsICJTSUdJTlQgcmVjZWl2ZWQgLSBpbW1lZGlhdGUgc2h1dGRvd24iKTsKKyAgICAgIHJldHVybiAxOworCisgICAgZGVmYXVsdDoKKyAgICAgIGxvZ2l0IChMT0dfTk9USUNFLCAic2lnbmFsICVkIHJlY2VpdmVkIC0gbm8gYWN0aW9uIGRlZmluZWRcbiIsIHNpZ25vKTsKKyAgICB9CisgIHJldHVybiAwOworfQorCisKKworLyogTWFpbiBzZXJ2ZXIgbG9vcC4gIFRoaXMgaXMgY2FsbGVkIHdpdGggdGhlIEZEIG9mIHRoZSBsaXN0ZW5pbmcKKyAgIHNvY2tldC4gKi8KK3N0YXRpYyB2b2lkCitzZXJ2ZSAoaW50IGxpc3Rlbl9mZCkKK3sKKyAgcHRoX2F0dHJfdCB0YXR0cjsKKyAgcHRoX2V2ZW50X3QgZXY7CisgIHNpZ3NldF90IHNpZ3M7CisgIGludCBzaWdubzsKKyAgc3RydWN0IHNvY2thZGRyX3VuIHBhZGRyOworICBzb2NrbGVuX3QgcGxlbiA9IHNpemVvZiAocGFkZHIpOworICBpbnQgZmQ7CisKKyAgdGF0dHIgPSBwdGhfYXR0cl9uZXcoKTsKKyAgcHRoX2F0dHJfc2V0ICh0YXR0ciwgUFRIX0FUVFJfSk9JTkFCTEUsIDApOworICBwdGhfYXR0cl9zZXQgKHRhdHRyLCBQVEhfQVRUUl9TVEFDS19TSVpFLCAyNTYqMTAyNCk7CisgIHB0aF9hdHRyX3NldCAodGF0dHIsIFBUSF9BVFRSX05BTUUsICJjb25uZWN0aW9uIik7CisKKyAgc2lnZW1wdHlzZXQgKCZzaWdzKTsKKyAgc2lnYWRkc2V0ICgmc2lncywgU0lHSFVQKTsKKyAgc2lnYWRkc2V0ICgmc2lncywgU0lHVVNSMSk7CisgIHNpZ2FkZHNldCAoJnNpZ3MsIFNJR1VTUjIpOworICBzaWdhZGRzZXQgKCZzaWdzLCBTSUdJTlQpOworICBzaWdhZGRzZXQgKCZzaWdzLCBTSUdURVJNKTsKKyAgZXYgPSBwdGhfZXZlbnQgKFBUSF9FVkVOVF9TSUdTLCAmc2lncywgJnNpZ25vKTsKKworICBmb3IgKDs7KQorICAgIHsKKyAgICAgIGlmIChzaHV0ZG93bl9wZW5kaW5nKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFhY3RpdmVfY29ubmVjdGlvbnMpCisgICAgICAgICAgICBicmVhazsgLyogUmVhZHkuICovCisKKyAgICAgICAgICAvKiBEbyBub3QgYWNjZXB0IGFueW1vcmUgY29ubmVjdGlvbnMgYnV0IHdhaXQgZm9yIGV4aXN0aW5nCisgICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gdGVybWluYXRlLiAgKi8KKyAgICAgICAgICBzaWdubyA9IDA7CisgICAgICAgICAgcHRoX3dhaXQgKGV2KTsKKyAgICAgICAgICBpZiAocHRoX2V2ZW50X29jY3VycmVkIChldikgJiYgc2lnbm8pCisgICAgICAgICAgICBpZiAoaGFuZGxlX3NpZ25hbCAoc2lnbm8pKQorICAgICAgICAgICAgICBicmVhazsgLyogU3RvcCB0aGUgbG9vcC4gKi8KKyAgICAgICAgICBjb250aW51ZTsKKwl9CisKKyAgICAgIGdjcnlfZmFzdF9yYW5kb21fcG9sbCAoKTsKKyAgICAgIGZkID0gcHRoX2FjY2VwdF9ldiAobGlzdGVuX2ZkLCAoc3RydWN0IHNvY2thZGRyICopJnBhZGRyLCAmcGxlbiwgZXYpOworICAgICAgaWYgKGZkID09IC0xKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHB0aF9ldmVudF9vY2N1cnJlZCAoZXYpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoaGFuZGxlX3NpZ25hbCAoc2lnbm8pKQorICAgICAgICAgICAgICAgIGJyZWFrOyAvKiBTdG9wIHRoZSBsb29wLiAqLworICAgICAgICAgICAgICBjb250aW51ZTsKKwkgICAgfQorICAgICAgICAgIGxvZ2l0IChMT0dfV0FSTklORywgImFjY2VwdCBmYWlsZWQ6ICVzIC0gd2FpdGluZyAxc1xuIiwKKyAgICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgZ2NyeV9mYXN0X3JhbmRvbV9wb2xsICgpOworICAgICAgICAgIHB0aF9zbGVlcCAoMSk7CisgICAgICAgICAgY29udGludWU7CisJfQorCisgICAgICBpZiAoIXB0aF9zcGF3biAodGF0dHIsIGNvbm5lY3Rpb25fdGhyZWFkLCAodm9pZCopZmQpKQorICAgICAgICB7CisgICAgICAgICAgbG9naXQgKExPR19FUlIsICJlcnJvciBzcGF3bmluZyBjb25uZWN0aW9uIGhhbmRsZXI6ICVzXG4iLAorICAgICAgICAgICAgICAgICBzdHJlcnJvciAoZXJybm8pICk7CisgICAgICAgICAgY2xvc2UgKGZkKTsKKwl9CisgICAgfQorICAKKyAgcHRoX2V2ZW50X2ZyZWUgKGV2LCBQVEhfRlJFRV9BTEwpOworfQorCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvc3JjL2dldHJhbmRvbS5jIGIvbGliZ2NyeXB0LTEuNC42L3NyYy9nZXRyYW5kb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGM5YjRiCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L3NyYy9nZXRyYW5kb20uYwpAQCAtMCwwICsxLDMyNyBAQAorLyogZ2V0cmFuZG9tLmMgLSBMaWJnY3J5cHQgUmFuZG9tIE51bWJlciBjbGllbnQKKyAqIENvcHlyaWdodCAoQykgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBHZXRyYW5kb20gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsCisgKiBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEdldHJhbmRvbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3VuLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2RlZmluZSBQR00gImdldHJhbmRvbSIKKyNkZWZpbmUgTVlWRVJTSU9OX0xJTkUgUEdNICIgKExpYmdjcnlwdCkgIiBWRVJTSU9OCisjZGVmaW5lIEJVR1JFUE9SVF9MSU5FICJcblJlcG9ydCBidWdzIHRvIDxidWctbGliZ2NyeXB0QGdudXBnLm9yZz4uXG4iCisKKworc3RhdGljIHZvaWQKK2xvZ2l0IChjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKyAgdmFfbGlzdCBhcmdfcHRyOworCisgIHZhX3N0YXJ0IChhcmdfcHRyLCBmb3JtYXQpIDsKKyAgZnB1dHMgKFBHTSAiOiAiLCBzdGRlcnIpOworICB2ZnByaW50ZiAoc3RkZXJyLCBmb3JtYXQsIGFyZ19wdHIpOworICBwdXRjICgnXG4nLCBzdGRlcnIpOworICB2YV9lbmQgKGFyZ19wdHIpOworfQorCisKKy8qIFNlbmQgTEVOR1RIIGJ5dGVzIG9mIEJVRkZFUiB0byBmaWxlIGRlc2NyaXB0b3IgRkQuICBSZXR1cm5zIDAgb24KKyAgIHN1Y2Nlc3Mgb3IgYW5vdGhlciB2YWx1ZSBvbiB3cml0ZSBlcnJvci4gKi8KK3N0YXRpYyBpbnQKK3dyaXRlbiAoaW50IGZkLCBjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBsZW5ndGgpCit7CisgIHdoaWxlIChsZW5ndGgpCisgICAgeworICAgICAgc3NpemVfdCBuOworICAgICAgCisgICAgICBkbworICAgICAgICBuID0gd3JpdGUgKGZkLCBidWZmZXIsIGxlbmd0aCk7CisgICAgICB3aGlsZSAobiA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOworICAgICAgaWYgKG4gPCAwKQorICAgICAgICAgeworICAgICAgICAgICBsb2dpdCAoIndyaXRlIGVycm9yOiAlcyIsIHN0cmVycm9yIChlcnJubykpOworICAgICAgICAgICByZXR1cm4gLTE7IC8qIHdyaXRlIGVycm9yICovCisgICAgICAgICB9CisgICAgICBsZW5ndGggLT0gbjsKKyAgICAgIGJ1ZmZlciA9IChjb25zdCBjaGFyICopYnVmZmVyICsgbjsKKyAgICB9CisgIHJldHVybiAwOyAgLyogT2theSAqLworfQorCisKKworCitzdGF0aWMgdm9pZAorcHJpbnRfdmVyc2lvbiAoaW50IHdpdGhfaGVscCkKK3sKKyAgZnB1dHMgKE1ZVkVSU0lPTl9MSU5FICJcbiIKKyAgICAgICAgICJDb3B5cmlnaHQgKEMpIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuXG4iCisgICAgICAgICAiTGljZW5zZSBHUEx2Mis6IEdOVSBHUEwgdmVyc2lvbiAyIG9yIGxhdGVyICIKKyAgICAgICAgICI8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWw+XG4iCisgICAgICAgICAiVGhpcyBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgYXJlIGZyZWUgdG8gY2hhbmdlIGFuZCByZWRpc3RyaWJ1dGUgaXQuXG4iCisgICAgICAgICAiVGhlcmUgaXMgTk8gV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdy5cbiIsCisgICAgICAgICBzdGRvdXQpOworICAgICAgICAKKyAgaWYgKHdpdGhfaGVscCkKKyAgICBmcHV0cyAoIlxuIgorICAgICAgICAgICAiVXNhZ2U6ICIgUEdNICIgW09QVElPTlNdIE5CWVRFU1xuIgorICAgICAgICAgICAiQ29ubmVjdCB0byBsaWJnY3J5cHQncyByYW5kb20gbnVtYmVyIGRhZW1vbiBhbmQgIgorICAgICAgICAgICAicmV0dXJuIHJhbmRvbSBudW1iZXJzIgorICAgICAgICAgICAiXG4iCisgICAgICAgICAgICIgIC0tbm9uY2UgICAgICAgUmV0dXJuIHdlYWsgcmFuZG9tIHN1aXRhYmxlIGZvciBhIG5vbmNlXG4iCisgICAgICAgICAgICIgIC0tdmVyeS1zdHJvbmcgUmV0dXJuIHZlcnkgc3Ryb25nIHJhbmRvbVxuIgorICAgICAgICAgICAiICAtLXBpbmcgICAgICAgIFNlbmQgYSBwaW5nXG4iCisgICAgICAgICAgICIgIC0tc29ja2V0IE5BTUUgTmFtZSBvZiBzb2Nra2V0IHRvIGNvbm5lY3QgdG9cbiIgICAgICAgIAorICAgICAgICAgICAiICAtLWhleCAgICAgICAgIFJldHVybiByZXN1bHQgYXMgYSBoZXggZHVtcFxuIgorICAgICAgICAgICAiICAtLXZlcmJvc2UgICAgIFNob3cgd2hhdCB3ZSBhcmUgZG9pbmdcbiIKKyAgICAgICAgICAgIiAgLS12ZXJzaW9uICAgICBQcmludCB2ZXJzaW9uIG9mIHRoZSBwcm9ncmFtIGFuZCBleGl0XG4iCisgICAgICAgICAgICIgIC0taGVscCAgICAgICAgRGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXRcbiIKKyAgICAgICAgICAgQlVHUkVQT1JUX0xJTkUsIHN0ZG91dCApOworICAKKyAgZXhpdCAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK3ByaW50X3VzYWdlICh2b2lkKQoreworICBmcHV0cyAoInVzYWdlOiAiIFBHTSAiIFtPUFRJT05TXSBOQllURVNcbiIsIHN0ZGVycik7CisgIGZwdXRzICgiICAgICAgICh1c2UgLS1oZWxwIHRvIGRpc3BsYXkgb3B0aW9ucylcbiIsIHN0ZGVycik7CisgIGV4aXQgKDEpOworfQorCisKK2ludCAKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgc3RydWN0IHNvY2thZGRyX3VuICpzcnZyX2FkZHI7CisgIHNvY2tsZW5fdCBhZGRybGVuOworICBpbnQgZmQ7CisgIGludCByYzsKKyAgdW5zaWduZWQgY2hhciBidWZmZXJbMzAwXTsKKyAgaW50IG5sZWZ0LCBucmVhZDsKKyAgY29uc3QgY2hhciAqc29ja2V0bmFtZSA9ICIvdmFyL3J1bi9saWJnY3J5cHQvUy5nY3J5cHRybmQiOworICBpbnQgZG9fcGluZyA9IDA7CisgIGludCBnZXRfbm9uY2UgPSAwOworICBpbnQgZ2V0X3Zlcnlfc3Ryb25nID0gMDsKKyAgaW50IHJlcV9uYnl0ZXMsIG5ieXRlcywgbjsKKyAgaW50IHZlcmJvc2UgPSAwOworICBpbnQgZmFpbCA9IDA7CisgIGludCBkb19oZXggPSAwOworIAorICBpZiAoYXJnYykKKyAgICB7CisgICAgICBhcmdjLS07IGFyZ3YrKzsKKyAgICB9CisgIHdoaWxlIChhcmdjICYmICoqYXJndiA9PSAnLScgJiYgKCphcmd2KVsxXSA9PSAnLScpCisgICAgeworICAgICAgaWYgKCEoKmFyZ3YpWzJdKQorICAgICAgICB7CisgICAgICAgICAgYXJnYy0tOyBhcmd2Kys7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKCphcmd2LCAiLS12ZXJzaW9uIikpCisgICAgICAgIHByaW50X3ZlcnNpb24gKDApOworICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3YsICItLWhlbHAiKSkKKyAgICAgICAgcHJpbnRfdmVyc2lvbiAoMSk7CisgICAgICBlbHNlIGlmICghc3RyY21wICgqYXJndiwgIi0tc29ja2V0IikgJiYgYXJnYyA+IDEgKQorICAgICAgICB7CisgICAgICAgICAgYXJnYy0tOyBhcmd2Kys7CisgICAgICAgICAgc29ja2V0bmFtZSA9ICphcmd2OworICAgICAgICAgIGFyZ2MtLTsgYXJndisrOworICAgICAgICB9CisgICAgICBlbHNlIGlmICghc3RyY21wICgqYXJndiwgIi0tbm9uY2UiKSkKKyAgICAgICAgeworICAgICAgICAgIGFyZ2MtLTsgYXJndisrOworICAgICAgICAgIGdldF9ub25jZSA9IDE7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKCphcmd2LCAiLS12ZXJ5LXN0cm9uZyIpKQorICAgICAgICB7CisgICAgICAgICAgYXJnYy0tOyBhcmd2Kys7CisgICAgICAgICAgZ2V0X3Zlcnlfc3Ryb25nID0gMTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3YsICItLXBpbmciKSkKKyAgICAgICAgeworICAgICAgICAgIGFyZ2MtLTsgYXJndisrOworICAgICAgICAgIGRvX3BpbmcgPSAxOworICAgICAgICB9CisgICAgICBlbHNlIGlmICghc3RyY21wICgqYXJndiwgIi0taGV4IikpCisgICAgICAgIHsKKyAgICAgICAgICBhcmdjLS07IGFyZ3YrKzsKKyAgICAgICAgICBkb19oZXggPSAxOworICAgICAgICB9CisgICAgICBlbHNlIGlmICghc3RyY21wICgqYXJndiwgIi0tdmVyYm9zZSIpKQorICAgICAgICB7CisgICAgICAgICAgYXJnYy0tOyBhcmd2Kys7CisgICAgICAgICAgdmVyYm9zZSA9IDE7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcHJpbnRfdXNhZ2UgKCk7CisgICAgfSAgICAgICAgICAKKworIAorICBpZiAoIWFyZ2MgJiYgZG9fcGluZykKKyAgICA7IC8qIFRoaXMgaXMgYWxsb3dlZC4gKi8KKyAgZWxzZSBpZiAoYXJnYyAhPSAxKQorICAgIHByaW50X3VzYWdlICgpOworICByZXFfbmJ5dGVzID0gYXJnYz8gYXRvaSAoKmFyZ3YpIDogMDsKKyAgCisgIGlmIChyZXFfbmJ5dGVzIDwgMCkKKyAgICBwcmludF91c2FnZSAoKTsKKworICAvKiBDcmVhdGUgYSBzb2NrZXQuICovCisgIGZkID0gc29ja2V0IChBRl9VTklYLCBTT0NLX1NUUkVBTSwgMCk7CisgIGlmIChmZCA9PSAtMSkKKyAgICB7CisgICAgICBsb2dpdCAoImNhbid0IGNyZWF0ZSBzb2NrZXQ6ICVzIiwgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisgIHNydnJfYWRkciA9IG1hbGxvYyAoc2l6ZW9mICpzcnZyX2FkZHIpOyAKKyAgaWYgKCFzcnZyX2FkZHIpCisgICAgeworICAgICAgbG9naXQgKCJtYWxsb2MgZmFpbGVkOiAlcyIsIHN0cmVycm9yIChlcnJubykpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorICBtZW1zZXQgKHNydnJfYWRkciwgMCwgc2l6ZW9mICpzcnZyX2FkZHIpOworICBzcnZyX2FkZHItPnN1bl9mYW1pbHkgPSBBRl9VTklYOworICBpZiAoc3RybGVuIChzb2NrZXRuYW1lKSArIDEgPj0gc2l6ZW9mIChzcnZyX2FkZHItPnN1bl9wYXRoKSkKKyAgICB7CisgICAgICBsb2dpdCAoInNvY2tldCBuYW1lIGAlcycgdG9vIGxvbmciLCBzb2NrZXRuYW1lKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKyAgc3RyY3B5IChzcnZyX2FkZHItPnN1bl9wYXRoLCBzb2NrZXRuYW1lKTsKKyAgYWRkcmxlbiA9IChvZmZzZXRvZiAoc3RydWN0IHNvY2thZGRyX3VuLCBzdW5fcGF0aCkKKyAgICAgICAgICAgICArIHN0cmxlbiAoc3J2cl9hZGRyLT5zdW5fcGF0aCkgKyAxKTsKKyAgcmMgPSBjb25uZWN0IChmZCwgKHN0cnVjdCBzb2NrYWRkciopIHNydnJfYWRkciwgYWRkcmxlbik7CisgIGlmIChyYyA9PSAtMSkKKyAgICB7CisgICAgICBsb2dpdCAoImVycm9yIGNvbm5lY3Rpbmcgc29ja2V0IGAlcyc6ICVzIiwKKyAgICAgICAgICAgICBzcnZyX2FkZHItPnN1bl9wYXRoLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGNsb3NlIChmZCk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgZG8KKyAgICB7CisgICAgICBuYnl0ZXMgPSByZXFfbmJ5dGVzID4gMjU1PyAyNTUgOiByZXFfbmJ5dGVzOworICAgICAgcmVxX25ieXRlcyAtPSBuYnl0ZXM7CisKKyAgICAgIGJ1ZmZlclswXSA9IDM7CisgICAgICBpZiAoZG9fcGluZykKKyAgICAgICAgYnVmZmVyWzFdID0gMDsKKyAgICAgIGVsc2UgaWYgKGdldF9ub25jZSkKKyAgICAgICAgYnVmZmVyWzFdID0gMTA7CisgICAgICBlbHNlIGlmIChnZXRfdmVyeV9zdHJvbmcpCisgICAgICAgIGJ1ZmZlclsxXSA9IDEyOworICAgICAgZWxzZQorICAgICAgICBidWZmZXJbMV0gPSAxMTsKKyAgICAgIGJ1ZmZlclsyXSA9IG5ieXRlczsKKyAgICAgIGlmICh3cml0ZW4gKGZkLCBidWZmZXIsIDMpKQorICAgICAgICBmYWlsID0gMTsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGZvciAobmxlZnQ9MiwgbnJlYWQ9MDsgbmxlZnQgPiAwOyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRvIAorICAgICAgICAgICAgICAgIG4gPSByZWFkIChmZCwgYnVmZmVyK25yZWFkLCBubGVmdCk7CisgICAgICAgICAgICAgIHdoaWxlIChuIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CisgICAgICAgICAgICAgIGlmIChuIDwgMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBsb2dpdCAoInJlYWQgZXJyb3I6ICVzIiwgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIG5sZWZ0IC09IG47CisgICAgICAgICAgICAgIG5yZWFkICs9IG47CisgICAgICAgICAgICAgIGlmIChucmVhZCAmJiBidWZmZXJbMF0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgbG9naXQgKCJzZXJ2ZXIgcmV0dXJuZWQgZXJyb3IgY29kZSAlZCIsIGJ1ZmZlclswXSk7CisgICAgICAgICAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAgICAgICBsb2dpdCAoInJlY2VpdmVkIHJlc3BvbnNlIHdpdGggJWQgYnl0ZXMgb2YgZGF0YSIsIGJ1ZmZlclsxXSk7CisgICAgICAgICAgaWYgKGJ1ZmZlclsxXSA8IG5ieXRlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbG9naXQgKCJ3YXJuaW5nOiBzZXJ2ZXIgcmV0dXJuZWQgbGVzcyBieXRlcyB0aGFuIHJlcXVlc3RlZCIpOworICAgICAgICAgICAgICBmYWlsID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChidWZmZXJbMV0gPiBuYnl0ZXMgJiYgIWRvX3BpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGxvZ2l0ICgid2FybmluZzogc2VydmVyIHJldHVybmVkIG1vcmUgYnl0ZXMgdGhhbiByZXF1ZXN0ZWQiKTsKKyAgICAgICAgICAgICAgZmFpbCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgbmJ5dGVzID0gYnVmZmVyWzFdOworICAgICAgICAgIGlmIChuYnl0ZXMgPiBzaXplb2YgYnVmZmVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBsb2dpdCAoImJ1ZmZlciB0b28gc2hvcnQgdG8gcmVjZWl2ZSBkYXRhIik7CisgICAgICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgZm9yIChubGVmdD1uYnl0ZXMsIG5yZWFkPTA7IG5sZWZ0ID4gMDsgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkbyAKKyAgICAgICAgICAgICAgICBuID0gcmVhZCAoZmQsIGJ1ZmZlcitucmVhZCwgbmxlZnQpOworICAgICAgICAgICAgICB3aGlsZSAobiA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOworICAgICAgICAgICAgICBpZiAobiA8IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgbG9naXQgKCJyZWFkIGVycm9yOiAlcyIsIHN0cmVycm9yIChlcnJubykpOworICAgICAgICAgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBubGVmdCAtPSBuOworICAgICAgICAgICAgICBucmVhZCArPSBuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGRvX2hleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZm9yIChuPTA7IG4gPCBuYnl0ZXM7IG4rKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAoIW4pCisgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCEobiAlIDE2KSkKKyAgICAgICAgICAgICAgICAgICAgcHV0Y2hhciAoJ1xuJyk7CisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHB1dGNoYXIgKCcgJyk7CisgICAgICAgICAgICAgICAgICBwcmludGYgKCIlMDJYIiwgYnVmZmVyW25dKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmIChuYnl0ZXMpCisgICAgICAgICAgICAgICAgcHV0Y2hhciAoJ1xuJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoZndyaXRlIChidWZmZXIsIG5ieXRlcywgMSwgc3Rkb3V0KSAhPSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGxvZ2l0ICgiZXJyb3Igd3JpdGluZyB0byBzdGRvdXQ6ICVzIiwgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgICAgICAgICBmYWlsID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgIHdoaWxlICghZmFpbCAmJiByZXFfbmJ5dGVzKTsKKworICBjbG9zZSAoZmQpOworICBmcmVlIChzcnZyX2FkZHIpOworICByZXR1cm4gZmFpbD8gMSA6IDA7Cit9CisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9zcmMvZ2xvYmFsLmMgYi9saWJnY3J5cHQtMS40LjYvc3JjL2dsb2JhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2OTUxM2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvc3JjL2dsb2JhbC5jCkBAIC0wLDAgKzEsMTA2OSBAQAorLyogZ2xvYmFsLmMgIC0JZ2xvYmFsIGNvbnRyb2wgZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMKKyAqICAgICAgICAgICAgICAgMjAwNCwgMjAwNSwgMjAwNiwgMjAwOCAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgZ2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2lmZGVmIEhBVkVfU1lTTE9HCisjIGluY2x1ZGUgPHN5c2xvZy5oPgorI2VuZGlmIC8qSEFWRV9TWVNMT0cqLworCisjaW5jbHVkZSAiZzEwbGliLmgiCisjaW5jbHVkZSAiY2lwaGVyLmgiCisjaW5jbHVkZSAic3RkbWVtLmgiIC8qIG91ciBvd24gbWVtb3J5IGFsbG9jYXRvciAqLworI2luY2x1ZGUgInNlY21lbS5oIiAvKiBvdXIgb3duIHNlY21lbSBhbGxvY2F0b3IgKi8KKyNpbmNsdWRlICJhdGguaCIKKworDAorCisvKioqKioqKioqKioqKioqKgorICogZmxhZyBiaXRzOiAwIDogZ2VuZXJhbCBjaXBoZXIgZGVidWcKKyAqCSAgICAgIDEgOiBnZW5lcmFsIE1QSSBkZWJ1ZworICovCitzdGF0aWMgdW5zaWduZWQgaW50IGRlYnVnX2ZsYWdzOworCisvKiBnY3J5X2NvbnRyb2wgKEdDUllDVExfU0VUX0ZJUFNfTU9ERSksIHNldHMgdGhpcyBmbGFnIHNvIHRoYXQgdGhlCisgICBpbnRpYWxpemF0aW9uIGNvZGUgc3dpY3RoZWQgZmlwcyBtb2RlIG9uLiAgKi8KK3N0YXRpYyBpbnQgZm9yY2VfZmlwc19tb2RlOworCisvKiBDb250cm9sbGVkIGJ5IGdsb2JhbF9pbml0KCkuICAqLworc3RhdGljIGludCBhbnlfaW5pdF9kb25lOworCisKKworLyogTWVtb3J5IG1hbmFnZW1lbnQuICovCisKK3N0YXRpYyBnY3J5X2hhbmRsZXJfYWxsb2NfdCBhbGxvY19mdW5jOworc3RhdGljIGdjcnlfaGFuZGxlcl9hbGxvY190IGFsbG9jX3NlY3VyZV9mdW5jOworc3RhdGljIGdjcnlfaGFuZGxlcl9zZWN1cmVfY2hlY2tfdCBpc19zZWN1cmVfZnVuYzsKK3N0YXRpYyBnY3J5X2hhbmRsZXJfcmVhbGxvY190IHJlYWxsb2NfZnVuYzsKK3N0YXRpYyBnY3J5X2hhbmRsZXJfZnJlZV90IGZyZWVfZnVuYzsKK3N0YXRpYyBnY3J5X2hhbmRsZXJfbm9fbWVtX3Qgb3V0b2Zjb3JlX2hhbmRsZXI7CitzdGF0aWMgdm9pZCAqb3V0b2Zjb3JlX2hhbmRsZXJfdmFsdWU7CitzdGF0aWMgaW50IG5vX3NlY3VyZV9tZW1vcnk7CisKKworDAorCisKKy8qIFRoaXMgaXMgb3VyIGhhbmRtYWRlIGNvbnN0cnVjdG9yLiAgSXQgZ2V0cyBjYWxsZWQgYnkgYW55IGZ1bmN0aW9uCisgICBsaWtlbHkgdG8gYmUgY2FsbGVkIGF0IHN0YXJ0dXAuICBUaGUgc3VnZ2VzdGVkIHdheSBmb3IgYW4KKyAgIGFwcGxpY2F0aW9uIHRvIG1ha2Ugc3VyZSB0aGF0IHRoaXMgaGFzIGJlZW4gY2FsbGVkIGlzIGJ5IHVzaW5nCisgICBnY3J5X2NoZWNrX3ZlcnNpb24uICovCitzdGF0aWMgdm9pZAorZ2xvYmFsX2luaXQgKHZvaWQpCit7CisgIGdjcnlfZXJyb3JfdCBlcnIgPSAwOworCisgIGlmIChhbnlfaW5pdF9kb25lKQorICAgIHJldHVybjsKKyAgYW55X2luaXRfZG9uZSA9IDE7CisKKyAgLyogSW5pdGlhbGl6ZSBvdXIgcG9ydGFibGUgdGhyZWFkL211dGV4IHdyYXBwZXIuICAqLworICBlcnIgPSBhdGhfaW5pdCAoKTsKKyAgaWYgKGVycikKKyAgICBnb3RvIGZhaWw7CisgIAorICAvKiBTZWUgd2hldGhlciB0aGUgc3lzdGVtIGlzIGluIEZJUFMgbW9kZS4gIFRoaXMgbmVlZHMgdG8gY29tZSBhcworICAgICBlYXJseSBhcyBwb3NzaWJsZSBwdXQgYWZ0ZXIgdGhlIEFUSCBoYXMgYmVlbiBpbml0aWFsaXplZC4gICovCisgIF9nY3J5X2luaXRpYWxpemVfZmlwc19tb2RlIChmb3JjZV9maXBzX21vZGUpOworCisgIC8qIEJlZm9yZSB3ZSBkbyBhbnkgb3RoZXIgaW5pdGlhbGl6YXRpb24gd2UgbmVlZCB0byB0ZXN0IGF2YWlsYWJsZQorICAgICBoYXJkd2FyZSBmZWF0dXJlcy4gICovCisgIF9nY3J5X2RldGVjdF9od19mZWF0dXJlcyAoKTsKKworICBlcnIgPSBfZ2NyeV9jaXBoZXJfaW5pdCAoKTsKKyAgaWYgKGVycikKKyAgICBnb3RvIGZhaWw7CisgIGVyciA9IF9nY3J5X21kX2luaXQgKCk7CisgIGlmIChlcnIpCisgICAgZ290byBmYWlsOworICBlcnIgPSBfZ2NyeV9wa19pbml0ICgpOworICBpZiAoZXJyKQorICAgIGdvdG8gZmFpbDsKKyNpZiAwCisgIC8qIEhtbW0sIGFzIG9mIG5vdyBhY19pbml0IGRvZXMgbm90aGluZy4gKi8KKyAgaWYgKCAhZmlwc19tb2RlICgpICkKKyAgICB7CisgICAgICBlcnIgPSBfZ2NyeV9hY19pbml0ICgpOworICAgICAgaWYgKGVycikKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyNlbmRpZgorCisgIHJldHVybjsKKworIGZhaWw6CisgIEJVRyAoKTsKK30KKworCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgbWFjcm8gZmlwc19pc19vcGVyYXRpb25hbCBhbmQgbWFrZXMKKyAgIHN1cmUgdGhhdCB0aGUgbWluaW1hbCBpbml0aWFsaXphdGlvbiBoYXMgYmVlbiBkb25lLiAgVGhpcyBpcyBmYXIKKyAgIGZyb20gYSBwZXJmZWN0IHNvbHV0aW9uIGFuZCBoaWRlcyBwcm9ibGVtcyB3aXRoIGFuIGltcHJvcGVyCisgICBpbml0aWFsaXphdGlvbiBidXQgYXQgbGVhc3QgaW4gc2luZ2xlLXRocmVhZGVkIG1vZGUgaXQgc2hvdWxkIHdvcmsKKyAgIHJlbGlhYmxlLiAKKworICAgVGhlIHJlYXNvbiB3ZSBuZWVkIHRoaXMgaXMgdGhhdCBhIGxvdCBvZiBhcHBsaWNhdGlvbnMgZG9uJ3QgdXNlCisgICBMaWJnY3J5cHQgcHJvcGVybHkgYnkgbm90IHJ1bm5pbmcgYW55IGluaXRpYWxpemF0aW9uIGNvZGUgYXQgYWxsLgorICAgVGhleSBqdXN0IGNhbGwgYSBMaWJnY3J5cHQgZnVuY3Rpb24gYW5kIHRoYXQgaXMgYWxsIHdoYXQgdGhleSB3YW50LgorICAgTm93IHdpdGggdGhlIEZJUFMgbW9kZSwgdGhhdCBoYXMgdGhlIHNpZGUgZWZmZWN0IG9mIGVudGVyaW5nIEZJUFMKKyAgIG1vZGUgKGZvciBzZWN1cml0eSByZWFzb25zLCBGSVBTIG1vZGUgaXMgdGhlIGRlZmF1bHQgaWYgbm8KKyAgIGluaXRpYWxpemF0aW9uIGhhcyBiZWVuIGRvbmUpIGFuZCBiYWlsaW5nIG91dCBpbW1lZGlhdGVseSBiZWNhdXNlCisgICB0aGUgRlNNIGlzIGluIHRoZSB3cm9uZyBzdGF0ZS4gIElmIHdlIGFsd2F5cyBydW4gdGhlIGluaXQgY29kZSwKKyAgIExpYmdjcnlwdCBjYW4gdGVzdCBmb3IgRklQUyBtb2RlIGFuZCBhdCBsZWFzdCBpZiBub3QgaW4gRklQUyBtb2RlLAorICAgaXQgd2lsbCBiZWhhdmUgYXMgYmVmb3JlLiAgTm90ZSB0aGF0IHRoaXMgb24tdGhlLWZseSBpbml0aWFsaXphdGlvbgorICAgaXMgb25seSBkb25lIGZvciB0aGUgY3J5cHRvZ3JhcGhpYyBmdW5jdGlvbnMgc3ViamVjdCB0byBGSVBTIG1vZGUKKyAgIGFuZCB0aHVzIG5vdCBhbGwgQVBJIGNhbGxzIHdpbGwgZG8gc3VjaCBhbiBpbml0aWFsaXphdGlvbi4gICovCitpbnQKK19nY3J5X2dsb2JhbF9pc19vcGVyYXRpb25hbCAodm9pZCkKK3sKKyAgaWYgKCFhbnlfaW5pdF9kb25lKQorICAgIHsKKyNpZmRlZiBIQVZFX1NZU0xPRworICAgICAgc3lzbG9nIChMT0dfVVNFUnxMT0dfV0FSTklORywgIkxpYmdjcnlwdCB3YXJuaW5nOiAiCisgICAgICAgICAgICAgICJtaXNzaW5nIGluaXRpYWxpemF0aW9uIC0gcGxlYXNlIGZpeCB0aGUgYXBwbGljYXRpb24iKTsKKyNlbmRpZiAvKkhBVkVfU1lTTE9HKi8KKyAgICAgIGdsb2JhbF9pbml0ICgpOworICAgIH0KKyAgcmV0dXJuIF9nY3J5X2ZpcHNfaXNfb3BlcmF0aW9uYWwgKCk7Cit9CisKKworCisMCisvKiBWZXJzaW9uIG51bWJlciBwYXJzaW5nLiAgKi8KKworLyogVGhpcyBmdW5jdGlvbiBwYXJzZXMgdGhlIGZpcnN0IHBvcnRpb24gb2YgdGhlIHZlcnNpb24gbnVtYmVyIFMgYW5kCisgICBzdG9yZXMgaXQgaW4gKk5VTUJFUi4gIE9uIHN1Y2VzcywgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlcgorICAgaW50byBTIHN0YXJ0aW5nIHdpdGggdGhlIGZpcnN0IGNoYXJhY3Rlciwgd2hpY2ggaXMgbm90IHBhcnQgb2YgdGhlCisgICBpbml0aWFsIG51bWJlciBwb3J0aW9uOyBvbiBmYWlsdXJlLCBOVUxMIGlzIHJldHVybmVkLiAgKi8KK3N0YXRpYyBjb25zdCBjaGFyKgorcGFyc2VfdmVyc2lvbl9udW1iZXIoIGNvbnN0IGNoYXIgKnMsIGludCAqbnVtYmVyICkKK3sKKyAgICBpbnQgdmFsID0gMDsKKworICAgIGlmKCAqcyA9PSAnMCcgJiYgaXNkaWdpdChzWzFdKSApCisJcmV0dXJuIE5VTEw7IC8qIGxlYWRpbmcgemVyb3MgYXJlIG5vdCBhbGxvd2VkICovCisgICAgZm9yICggOyBpc2RpZ2l0KCpzKTsgcysrICkgeworCXZhbCAqPSAxMDsKKwl2YWwgKz0gKnMgLSAnMCc7CisgICAgfQorICAgICpudW1iZXIgPSB2YWw7CisgICAgcmV0dXJuIHZhbCA8IDA/IE5VTEwgOiBzOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGJyZWFrcyB1cCB0aGUgY29tcGxldGUgc3RyaW5nLXJlcHJlc2VudGF0aW9uIG9mIHRoZQorICAgdmVyc2lvbiBudW1iZXIgUywgd2hpY2ggaXMgb2YgdGhlIGZvbGxvd2luZyBzdHJ1dHVyZTogPG1ham9yCisgICBudW1iZXI+LjxtaW5vciBudW1iZXI+LjxtaWNybyBudW1iZXI+PHBhdGNoIGxldmVsPi4gIFRoZSBtYWpvciwKKyAgIG1pbm9yIGFuZCBtaWNybyBudW1iZXIgY29tcG9uZW50cyB3aWxsIGJlIHN0b3JlZCBpbiAqTUFKT1IsICpNSU5PUgorICAgYW5kICpNSUNSTy4KKworICAgT24gc3VjY2VzcywgdGhlIGxhc3QgY29tcG9uZW50LCB0aGUgcGF0Y2ggbGV2ZWwsIHdpbGwgYmUgcmV0dXJuZWQ7CisgICBpbiBmYWlsdXJlLCBOVUxMIHdpbGwgYmUgcmV0dXJuZWQuICAqLworCitzdGF0aWMgY29uc3QgY2hhciAqCitwYXJzZV92ZXJzaW9uX3N0cmluZyggY29uc3QgY2hhciAqcywgaW50ICptYWpvciwgaW50ICptaW5vciwgaW50ICptaWNybyApCit7CisgICAgcyA9IHBhcnNlX3ZlcnNpb25fbnVtYmVyKCBzLCBtYWpvciApOworICAgIGlmKCAhcyB8fCAqcyAhPSAnLicgKQorCXJldHVybiBOVUxMOworICAgIHMrKzsKKyAgICBzID0gcGFyc2VfdmVyc2lvbl9udW1iZXIoIHMsIG1pbm9yICk7CisgICAgaWYoICFzIHx8ICpzICE9ICcuJyApCisJcmV0dXJuIE5VTEw7CisgICAgcysrOworICAgIHMgPSBwYXJzZV92ZXJzaW9uX251bWJlciggcywgbWljcm8gKTsKKyAgICBpZiggIXMgKQorCXJldHVybiBOVUxMOworICAgIHJldHVybiBzOyAvKiBwYXRjaGxldmVsICovCit9CisKKy8qIElmIFJFUV9WRVJTSU9OIGlzIG5vbi1OVUxMLCBjaGVjayB0aGF0IHRoZSB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5CisgICBpcyBhdCBtaW5pbXVtIHRoZSByZXF1ZXN0ZWQgb25lLiAgUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uCisgICBvZiB0aGUgbGlicmFyeSB2ZXJzaW9uIGlmIHRoZSBjb25kaXRpb24gaXMgc2F0aXNmaWVkOyByZXR1cm4gTlVMTAorICAgaWYgdGhlIHJlcXVlc3RlZCB2ZXJzaW9uIGlzIG5ld2VyIHRoYW4gdGhhdCBvZiB0aGUgbGlicmFyeS4KKworICAgSWYgYSBOVUxMIGlzIHBhc3NlZCB0byB0aGlzIGZ1bmN0aW9uLCBubyBjaGVjayBpcyBkb25lLCBidXQgdGhlCisgICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpYnJhcnkgaXMgc2ltcGx5IHJldHVybmVkLiAgKi8KK2NvbnN0IGNoYXIgKgorZ2NyeV9jaGVja192ZXJzaW9uKCBjb25zdCBjaGFyICpyZXFfdmVyc2lvbiApCit7CisgICAgY29uc3QgY2hhciAqdmVyID0gVkVSU0lPTjsKKyAgICBpbnQgbXlfbWFqb3IsIG15X21pbm9yLCBteV9taWNybzsKKyAgICBpbnQgcnFfbWFqb3IsIHJxX21pbm9yLCBycV9taWNybzsKKyAgICBjb25zdCBjaGFyICpteV9wbHZsLCAqcnFfcGx2bDsKKworICAgIC8qIEluaXRpYWxpemUgbGlicmFyeS4gICovCisgICAgZ2xvYmFsX2luaXQgKCk7CisKKyAgICBpZiAoICFyZXFfdmVyc2lvbiApCisgICAgICAgIC8qIENhbGxlciB3YW50cyBvdXIgdmVyc2lvbiBudW1iZXIuICAqLworCXJldHVybiB2ZXI7CisKKyAgICAvKiBQYXJzZSBvd24gdmVyc2lvbiBudW1iZXIuICAqLworICAgIG15X3BsdmwgPSBwYXJzZV92ZXJzaW9uX3N0cmluZyggdmVyLCAmbXlfbWFqb3IsICZteV9taW5vciwgJm15X21pY3JvICk7CisgICAgaWYgKCAhbXlfcGx2bCApCisgICAgICAgIC8qIHZlcnkgc3RyYW5nZSBvdXIgb3duIHZlcnNpb24gaXMgYm9ndXMuICBTaG91bGRuJ3Qgd2UgdXNlCisJICAgYXNzZXJ0KCkgaGVyZSBhbmQgYmFpbCBvdXQgaW4gY2FzZSB0aGlzIGhhcHBlbnM/ICAtbW8uICAqLworCXJldHVybiBOVUxMOworCisgIC8qIFBhcnNlIHJlcXVlc3RlZCB2ZXJzaW9uIG51bWJlci4gICovCisgICAgcnFfcGx2bCA9IHBhcnNlX3ZlcnNpb25fc3RyaW5nKCByZXFfdmVyc2lvbiwgJnJxX21ham9yLCAmcnFfbWlub3IsCisJCQkJCQkJCSZycV9taWNybyApOworICAgIGlmICggIXJxX3BsdmwgKQorICAgICAgICAvKiByZXEgdmVyc2lvbiBzdHJpbmcgaXMgaW52YWxpZCwgdGhpcyBjYW4gaGFwcGVuLiAgKi8KKwlyZXR1cm4gTlVMTDsKKworICAgIC8qIENvbXBhcmUgdmVyc2lvbiBudW1iZXJzLiAgKi8KKyAgICBpZiAoIG15X21ham9yID4gcnFfbWFqb3IKKwl8fCAobXlfbWFqb3IgPT0gcnFfbWFqb3IgJiYgbXlfbWlub3IgPiBycV9taW5vcikKKwl8fCAobXlfbWFqb3IgPT0gcnFfbWFqb3IgJiYgbXlfbWlub3IgPT0gcnFfbWlub3IKKwkJCQkgJiYgbXlfbWljcm8gPiBycV9taWNybykKKwl8fCAobXlfbWFqb3IgPT0gcnFfbWFqb3IgJiYgbXlfbWlub3IgPT0gcnFfbWlub3IKKwkJCQkgJiYgbXlfbWljcm8gPT0gcnFfbWljcm8KKwkJCQkgJiYgc3RyY21wKCBteV9wbHZsLCBycV9wbHZsICkgPj0gMCkgKSB7CisJcmV0dXJuIHZlcjsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworCitzdGF0aWMgdm9pZAorcHJpbnRfY29uZmlnICggaW50ICgqZm5jKShGSUxFICpmcCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pLCBGSUxFICpmcCkKK3sKKyAgdW5zaWduZWQgaW50IGh3ZjsKKyAgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBpbnQgZmxhZzsKKyAgICBjb25zdCBjaGFyICpkZXNjOworICB9IGh3Zmxpc3RbXSA9IHsKKyAgICB7IEhXRl9QQURMT0NLX1JORywgInBhZGxvY2stcm5nIiB9LAorICAgIHsgSFdGX1BBRExPQ0tfQUVTLCAicGFkbG9jay1hZXMiIH0sCisgICAgeyBIV0ZfUEFETE9DS19TSEEsICJwYWRsb2NrLXNoYSIgfSwKKyAgICB7IDAsIE5VTEx9IAorICB9OworICBpbnQgaTsKKworICBmbmMgKGZwLCAidmVyc2lvbjolczpcbiIsIFZFUlNJT04pOworICBmbmMgKGZwLCAiY2lwaGVyczolczpcbiIsIExJQkdDUllQVF9DSVBIRVJTKTsKKyAgZm5jIChmcCwgInB1YmtleXM6JXM6XG4iLCBMSUJHQ1JZUFRfUFVCS0VZX0NJUEhFUlMpOworICBmbmMgKGZwLCAiZGlnZXN0czolczpcbiIsIExJQkdDUllQVF9ESUdFU1RTKTsKKyAgZm5jIChmcCwgInJuZC1tb2Q6IgorI2lmIFVTRV9STkRFR0QKKyAgICAgICAgICAgICAgICAiZWdkOiIKKyNlbmRpZgorI2lmIFVTRV9STkRMSU5VWAorICAgICAgICAgICAgICAgICJsaW51eDoiCisjZW5kaWYKKyNpZiBVU0VfUk5EVU5JWAorICAgICAgICAgICAgICAgICJ1bml4OiIKKyNlbmRpZgorI2lmIFVTRV9STkRXMzIKKyAgICAgICAgICAgICAgICAidzMyOiIKKyNlbmRpZgorICAgICAgICJcbiIpOworICBmbmMgKGZwLCAibXBpLWFzbTolczpcbiIsIF9nY3J5X21waV9nZXRfaHdfY29uZmlnICgpKTsKKyAgaHdmID0gX2djcnlfZ2V0X2h3X2ZlYXR1cmVzICgpOworICBmbmMgKGZwLCAiaHdmbGlzdDoiKTsKKyAgZm9yIChpPTA7IGh3Zmxpc3RbaV0uZGVzYzsgaSsrKQorICBpZiAoIChod2YgJiBod2ZsaXN0W2ldLmZsYWcpICkKKyAgICBmbmMgKGZwLCAiJXM6IiwgaHdmbGlzdFtpXS5kZXNjKTsKKyAgZm5jIChmcCwgIlxuIik7CisgIC8qIFdlIHVzZSB5L24gaW5zdGVhZCBvZiAxLzAgZm9yIHRoZSBzaW1wbGUgcmVhc29uIHRoYXQgRW1hY3NlbidzCisgICAgIGNvbXBpbGUgZXJyb3IgcGFyc2VyIHdvdWxkIGFjY2lkZW50bHkgZmxhZyB0aGF0IGxpbmUgd2hlbiBwcmludGVkCisgICAgIGR1cmluZyAibWFrZSBjaGVjayIgYXMgYW4gZXJyb3IuICAqLworICBmbmMgKGZwLCAiZmlwcy1tb2RlOiVjOiVjOlxuIiwgCisgICAgICAgZmlwc19tb2RlICgpPyAneSc6J24nLAorICAgICAgIF9nY3J5X2VuZm9yY2VkX2ZpcHNfbW9kZSAoKT8gJ3knOiduJyApOworfQorCisKKwwKKworLyogQ29tbWFuZCBkaXNwYXRjaGVyIGZ1bmN0aW9uLCBhY3RpbmcgYXMgZ2VuZXJhbCBjb250cm9sCisgICBmdW5jdGlvbi4gICovCitnY3J5X2Vycm9yX3QKK19nY3J5X3Zjb250cm9sIChlbnVtIGdjcnlfY3RsX2NtZHMgY21kLCB2YV9saXN0IGFyZ19wdHIpCit7CisgIHN0YXRpYyBpbnQgaW5pdF9maW5pc2hlZCA9IDA7CisgIGdjcnlfZXJyX2NvZGVfdCBlcnIgPSAwOworICAKKyAgc3dpdGNoIChjbWQpCisgICAgeworICAgIGNhc2UgR0NSWUNUTF9FTkFCTEVfTV9HVUFSRDoKKyAgICAgIF9nY3J5X3ByaXZhdGVfZW5hYmxlX21fZ3VhcmQgKCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgR0NSWUNUTF9FTkFCTEVfUVVJQ0tfUkFORE9NOgorICAgICAgX2djcnlfZW5hYmxlX3F1aWNrX3JhbmRvbV9nZW4gKCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgR0NSWUNUTF9GQUtFRF9SQU5ET01fUDoKKyAgICAgIC8qIFJldHVybiBhbiBlcnJvciBpZiB0aGUgUk5HIGlzIGZha2VkIG9uZSAoZS5nLiBlbmFibGVkIGJ5CisgICAgICAgICBFTkFCTEVfUVVJQ0tfUkFORE9NLiAqLworICAgICAgaWYgKF9nY3J5X3JhbmRvbV9pc19mYWtlZCAoKSkKKyAgICAgICAgZXJyID0gR1BHX0VSUl9HRU5FUkFMOyAgLyogVXNlIGFzIFRSVUUgdmFsdWUuICAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdDUllDVExfRFVNUF9SQU5ET01fU1RBVFM6CisgICAgICBfZ2NyeV9yYW5kb21fZHVtcF9zdGF0cyAoKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBHQ1JZQ1RMX0RVTVBfTUVNT1JZX1NUQVRTOgorICAgICAgLyptX3ByaW50X3N0YXRzKCJbZml4bWU6IHByZWZpeF0iKTsqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdDUllDVExfRFVNUF9TRUNNRU1fU1RBVFM6CisgICAgICBfZ2NyeV9zZWNtZW1fZHVtcF9zdGF0cyAoKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBHQ1JZQ1RMX0RST1BfUFJJVlM6CisgICAgICBnbG9iYWxfaW5pdCAoKTsKKyAgICAgIF9nY3J5X3NlY21lbV9pbml0ICgwKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBHQ1JZQ1RMX0RJU0FCTEVfU0VDTUVNOgorICAgICAgZ2xvYmFsX2luaXQgKCk7CisgICAgICBub19zZWN1cmVfbWVtb3J5ID0gMTsKKyAgICAgIGJyZWFrOyAgICAKKworICAgIGNhc2UgR0NSWUNUTF9JTklUX1NFQ01FTToKKyAgICAgIGdsb2JhbF9pbml0ICgpOworICAgICAgX2djcnlfc2VjbWVtX2luaXQgKHZhX2FyZyAoYXJnX3B0ciwgdW5zaWduZWQgaW50KSk7CisgICAgICBpZiAoKF9nY3J5X3NlY21lbV9nZXRfZmxhZ3MgKCkgJiBHQ1JZX1NFQ01FTV9GTEFHX05PVF9MT0NLRUQpKQorICAgICAgICBlcnIgPSBHUEdfRVJSX0dFTkVSQUw7CisgICAgICBicmVhazsKKworICAgIGNhc2UgR0NSWUNUTF9URVJNX1NFQ01FTToKKyAgICAgIGdsb2JhbF9pbml0ICgpOworICAgICAgX2djcnlfc2VjbWVtX3Rlcm0gKCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgR0NSWUNUTF9ESVNBQkxFX1NFQ01FTV9XQVJOOgorICAgICAgX2djcnlfc2VjbWVtX3NldF9mbGFncyAoKF9nY3J5X3NlY21lbV9nZXRfZmxhZ3MgKCkKKwkJCSAgICAgICB8IEdDUllfU0VDTUVNX0ZMQUdfTk9fV0FSTklORykpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdDUllDVExfU1VTUEVORF9TRUNNRU1fV0FSTjoKKyAgICAgIF9nY3J5X3NlY21lbV9zZXRfZmxhZ3MgKChfZ2NyeV9zZWNtZW1fZ2V0X2ZsYWdzICgpCisJCQkgICAgICAgfCBHQ1JZX1NFQ01FTV9GTEFHX1NVU1BFTkRfV0FSTklORykpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdDUllDVExfUkVTVU1FX1NFQ01FTV9XQVJOOgorICAgICAgX2djcnlfc2VjbWVtX3NldF9mbGFncyAoKF9nY3J5X3NlY21lbV9nZXRfZmxhZ3MgKCkKKwkJCSAgICAgICAmIH5HQ1JZX1NFQ01FTV9GTEFHX1NVU1BFTkRfV0FSTklORykpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdDUllDVExfVVNFX1NFQ1VSRV9STkRQT09MOgorICAgICAgZ2xvYmFsX2luaXQgKCk7CisgICAgICBfZ2NyeV9zZWN1cmVfcmFuZG9tX2FsbG9jICgpOyAvKiBQdXQgcmFuZG9tIG51bWJlciBpbnRvIHNlY3VyZSBtZW1vcnkuICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgR0NSWUNUTF9TRVRfUkFORE9NX1NFRURfRklMRToKKyAgICAgIF9nY3J5X3NldF9yYW5kb21fc2VlZF9maWxlICh2YV9hcmcgKGFyZ19wdHIsIGNvbnN0IGNoYXIgKikpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdDUllDVExfVVBEQVRFX1JBTkRPTV9TRUVEX0ZJTEU6CisgICAgICBpZiAoIGZpcHNfaXNfb3BlcmF0aW9uYWwgKCkgKQorICAgICAgICBfZ2NyeV91cGRhdGVfcmFuZG9tX3NlZWRfZmlsZSAoKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBHQ1JZQ1RMX1NFVF9WRVJCT1NJVFk6CisgICAgICBfZ2NyeV9zZXRfbG9nX3ZlcmJvc2l0eSAodmFfYXJnIChhcmdfcHRyLCBpbnQpKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBHQ1JZQ1RMX1NFVF9ERUJVR19GTEFHUzoKKyAgICAgIGRlYnVnX2ZsYWdzIHw9IHZhX2FyZyAoYXJnX3B0ciwgdW5zaWduZWQgaW50KTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBHQ1JZQ1RMX0NMRUFSX0RFQlVHX0ZMQUdTOgorICAgICAgZGVidWdfZmxhZ3MgJj0gfnZhX2FyZyAoYXJnX3B0ciwgdW5zaWduZWQgaW50KTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBHQ1JZQ1RMX0RJU0FCTEVfSU5URVJOQUxfTE9DS0lORzoKKyAgICAgIC8qIE5vdCB1c2VkIGFueW1vcmUuICAqLworICAgICAgZ2xvYmFsX2luaXQgKCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgR0NSWUNUTF9BTllfSU5JVElBTElaQVRJT05fUDoKKyAgICAgIGlmIChhbnlfaW5pdF9kb25lKQorCWVyciA9IEdQR19FUlJfR0VORVJBTDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBHQ1JZQ1RMX0lOSVRJQUxJWkFUSU9OX0ZJTklTSEVEX1A6CisgICAgICBpZiAoaW5pdF9maW5pc2hlZCkKKwllcnIgPSBHUEdfRVJSX0dFTkVSQUw7IC8qIFllcy4gICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgR0NSWUNUTF9JTklUSUFMSVpBVElPTl9GSU5JU0hFRDoKKyAgICAgIC8qIFRoaXMgaXMgYSBob29rIHdoaWNoIHNob3VsZCBiZSB1c2VkIGJ5IGFuIGFwcGxpY2F0aW9uIGFmdGVyCisJIGFsbCBpbml0aWFsaXphdGlvbiBoYXMgYmVlbiBkb25lIGFuZCByaWdodCBiZWZvcmUgYW55IHRocmVhZHMKKwkgYXJlIHN0YXJ0ZWQuICBJdCBpcyBub3QgcmVhbGx5IG5lZWRlZCBidXQgdGhlIG9ubHkgd2F5IHRvIGJlCisJIHJlYWxseSBzdXJlIHRoYXQgYWxsIGluaXRpYWxpemF0aW9uIGZvciB0aHJlYWQtc2FmZXR5IGhhcworCSBiZWVuIGRvbmUuICovCisgICAgICBpZiAoISBpbml0X2ZpbmlzaGVkKQorICAgICAgICB7CisgICAgICAgICAgZ2xvYmFsX2luaXQgKCk7CisgICAgICAgICAgLyogRG8gb25seSBhIGJhc2ljIHJhbmRvbSBpbml0aWFsaXphdGlvbiwgaS5lLiBpbml0IHRoZQorICAgICAgICAgICAgIG11dGV4ZXMuICovCisgICAgICAgICAgX2djcnlfcmFuZG9tX2luaXRpYWxpemUgKDApOworICAgICAgICAgIGluaXRfZmluaXNoZWQgPSAxOworICAgICAgICAgIC8qIEZvcmNlIHVzIGludG8gb3BlcmF0aW9uYWwgc3RhdGUgaWYgaW4gRklQUyBtb2RlLiAgKi8KKyAgICAgICAgICAodm9pZClmaXBzX2lzX29wZXJhdGlvbmFsICgpOworICAgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgR0NSWUNUTF9TRVRfVEhSRUFEX0NCUzoKKyAgICAgIGVyciA9IGF0aF9pbnN0YWxsICh2YV9hcmcgKGFyZ19wdHIsIHZvaWQgKiksIGFueV9pbml0X2RvbmUpOworICAgICAgaWYgKCEgZXJyKQorCWdsb2JhbF9pbml0ICgpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdDUllDVExfRkFTVF9QT0xMOgorICAgICAgLyogV2UgbmVlZCB0byBkbyBtYWtlIHN1cmUgdGhhdCB0aGUgcmFuZG9tIHBvb2wgaXMgcmVhbGx5CisgICAgICAgICBpbml0aWFsaXplZCBzbyB0aGF0IHRoZSBwb2xsIGZ1bmN0aW9uIGlzIG5vdCBhIE5PUC4gKi8KKyAgICAgIF9nY3J5X3JhbmRvbV9pbml0aWFsaXplICgxKTsKKworICAgICAgaWYgKCBmaXBzX2lzX29wZXJhdGlvbmFsICgpICkKKyAgICAgICAgX2djcnlfZmFzdF9yYW5kb21fcG9sbCAoKTsgCisgICAgICBicmVhazsKKworICAgIGNhc2UgR0NSWUNUTF9TRVRfUk5ERUdEX1NPQ0tFVDoKKyNpZiBVU0VfUk5ERUdECisgICAgICBlcnIgPSBfZ2NyeV9ybmRlZ2Rfc2V0X3NvY2tldF9uYW1lICh2YV9hcmcgKGFyZ19wdHIsIGNvbnN0IGNoYXIgKikpOworI2Vsc2UKKyAgICAgIGVyciA9IGdwZ19lcnJvciAoR1BHX0VSUl9OT1RfU1VQUE9SVEVEKTsKKyNlbmRpZgorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdDUllDVExfU0VUX1JBTkRPTV9EQUVNT05fU09DS0VUOgorICAgICAgX2djcnlfc2V0X3JhbmRvbV9kYWVtb25fc29ja2V0ICh2YV9hcmcgKGFyZ19wdHIsIGNvbnN0IGNoYXIgKikpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdDUllDVExfVVNFX1JBTkRPTV9EQUVNT046CisgICAgICAvKiBXZSBuZWVkIHRvIGRvIG1ha2Ugc3VyZSB0aGF0IHRoZSByYW5kb20gcG9vbCBpcyByZWFsbHkKKyAgICAgICAgIGluaXRpYWxpemVkIHNvIHRoYXQgdGhlIHBvbGwgZnVuY3Rpb24gaXMgbm90IGEgTk9QLiAqLworICAgICAgX2djcnlfcmFuZG9tX2luaXRpYWxpemUgKDEpOworICAgICAgX2djcnlfdXNlX3JhbmRvbV9kYWVtb24gKCEhIHZhX2FyZyAoYXJnX3B0ciwgaW50KSk7CisgICAgICBicmVhazsKKyAgICAgIAorICAgICAgLyogVGhpcyBjb21tYW5kIGR1bXBzIGluZm9ybWF0aW9uIHBlcnRhaW5pbmcgdG8gdGhlCisgICAgICAgICBjb25maWd1cmF0aW9uIG9mIGxpYmdjcnlwdCB0byB0aGUgZ2l2ZW4gc3RyZWFtLiAgSXQgbWF5IGJlCisgICAgICAgICB1c2VkIGJlZm9yZSB0aGUgaW50aWFsaXphdGlvbiBoYXMgYmVlbiBmaW5pc2hlZCBidXQgbm90CisgICAgICAgICBiZWZvcmUgYSBnY3J5X3ZlcnNpb25fY2hlY2suICovCisgICAgY2FzZSBHQ1JZQ1RMX1BSSU5UX0NPTkZJRzoKKyAgICAgIHsKKyAgICAgICAgRklMRSAqZnAgPSB2YV9hcmcgKGFyZ19wdHIsIEZJTEUgKik7CisgICAgICAgIHByaW50X2NvbmZpZyAoZnA/ZnByaW50ZjpfZ2NyeV9sb2dfaW5mb193aXRoX2R1bW15X2ZwLCBmcCk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgR0NSWUNUTF9PUEVSQVRJT05BTF9QOgorICAgICAgLyogUmV0dXJucyB0cnVlIGlmIHRoZSBsaWJyYXJ5IGlzIGluIGFuIG9wZXJhdGlvbmFsIHN0YXRlLiAgVGhpcworICAgICAgICAgaXMgYWx3YXlzIHRydWUgZm9yIG5vbi1maXBzIG1vZGUuICAqLworICAgICAgaWYgKF9nY3J5X2ZpcHNfdGVzdF9vcGVyYXRpb25hbCAoKSkKKyAgICAgICAgZXJyID0gR1BHX0VSUl9HRU5FUkFMOyAvKiBVc2VkIGFzIFRSVUUgdmFsdWUgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBHQ1JZQ1RMX0ZJUFNfTU9ERV9QOgorICAgICAgaWYgKGZpcHNfbW9kZSAoKSAKKyAgICAgICAgICAmJiAhX2djcnlfaXNfZmlwc19tb2RlX2luYWN0aXZlICgpIAorICAgICAgICAgICYmICFub19zZWN1cmVfbWVtb3J5KQorCWVyciA9IEdQR19FUlJfR0VORVJBTDsgLyogVXNlZCBhcyBUUlVFIHZhbHVlICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgR0NSWUNUTF9GT1JDRV9GSVBTX01PREU6CisgICAgICAvKiBQZXJmb3JtaW5nIHRoaXMgY29tbWFuZCBwdXRzIHRoZSBsaWJyYXJ5IGludG8gZmlwcyBtb2RlLiAgSWYKKyAgICAgICAgIHRoZSBsaWJyYXJ5IGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgaW50byBmaXBzIG1vZGUsIGEKKyAgICAgICAgIHNlbGZ0ZXN0IGlzIHRyaWdnZXJlZC4gIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBwdXQgdGhlIGxpYnJhdHkKKyAgICAgICAgIGludG8gZmlwcyBtb2RlIGFmdGVyIGhhdmluZyBwYXNzZWQgdGhlIGluaXRpYWxpemF0aW9uLiAqLworICAgICAgaWYgKCFhbnlfaW5pdF9kb25lKQorICAgICAgICB7CisgICAgICAgICAgLyogTm90IHlldCBpbnRpYWxpemVkIGF0IGFsbC4gIFNldCBhIGZsYWcgc28gdGhhdCB3ZSBhcmUgcHV0CisgICAgICAgICAgICAgaW50byBmaXBzIG1vZGUgZHVyaW5nIGluaXRpYWxpemF0aW9uLiAgKi8KKyAgICAgICAgICBmb3JjZV9maXBzX21vZGUgPSAxOworICAgICAgICB9CisgICAgICBlbHNlIAorICAgICAgICB7CisgICAgICAgICAgLyogQWxyZWFkeSBpbml0aWFsaXplZC4gIElmIHdlIGFyZSBhbHJlYWR5IG9wZXJhdGlvbmFsIHdlCisgICAgICAgICAgICAgcnVuIGEgc2VsZnRlc3QuICBJZiBub3Qgd2UgdXNlIHRoZSBpc19vcGVyYXRpb25hbCBjYWxsIHRvCisgICAgICAgICAgICAgZm9yY2UgdXMgaW50byBvcGVyYXRpb25hbCBzdGF0ZSBpZiBwb3NzaWJsZS4gICovCisgICAgICAgICAgaWYgKF9nY3J5X2ZpcHNfdGVzdF9lcnJvcl9vcl9vcGVyYXRpb25hbCAoKSkKKyAgICAgICAgICAgIF9nY3J5X2ZpcHNfcnVuX3NlbGZ0ZXN0cyAoMSk7CisgICAgICAgICAgaWYgKF9nY3J5X2ZpcHNfaXNfb3BlcmF0aW9uYWwgKCkpCisgICAgICAgICAgICBlcnIgPSBHUEdfRVJSX0dFTkVSQUw7IC8qIFVzZWQgYXMgVFJVRSB2YWx1ZSAqLworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdDUllDVExfU0VMRlRFU1Q6CisgICAgICAvKiBSdW4gYSBzZWxmdGVzdC4gIFRoaXMgd29ya3MgaW4gZmlwcyBtb2RlIGFzIHdlbGwgYXMgaW4KKyAgICAgICAgIHN0YW5kYXJkIG1vZGUuICBJbiBjb250cmFzdCB0byB0aGUgcG93ZXItdXAgdGVzdHMsIHdlIHVzZSBhbgorICAgICAgICAgZXh0ZW5kZWQgdmVyc2lvbiBvZiB0aGUgc2VsZnRlc3RzLiBSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBhbgorICAgICAgICAgZXJyb3IgY29kZS4gKi8KKyAgICAgIGdsb2JhbF9pbml0ICgpOworICAgICAgZXJyID0gX2djcnlfZmlwc19ydW5fc2VsZnRlc3RzICgxKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSA1ODogIC8qIEluaXQgZXh0ZXJuYWwgcmFuZG9tIHRlc3QuICAqLworICAgICAgeworICAgICAgICB2b2lkICoqcmN0eCAgICAgICAgPSB2YV9hcmcgKGFyZ19wdHIsIHZvaWQgKiopOworICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MgPSB2YV9hcmcgKGFyZ19wdHIsIHVuc2lnbmVkIGludCk7CisgICAgICAgIGNvbnN0IHZvaWQgKmtleSAgICA9IHZhX2FyZyAoYXJnX3B0ciwgY29uc3Qgdm9pZCAqKTsKKyAgICAgICAgc2l6ZV90IGtleWxlbiAgICAgID0gdmFfYXJnIChhcmdfcHRyLCBzaXplX3QpOworICAgICAgICBjb25zdCB2b2lkICpzZWVkICAgPSB2YV9hcmcgKGFyZ19wdHIsIGNvbnN0IHZvaWQgKik7CisgICAgICAgIHNpemVfdCBzZWVkbGVuICAgICA9IHZhX2FyZyAoYXJnX3B0ciwgc2l6ZV90KTsKKyAgICAgICAgY29uc3Qgdm9pZCAqZHQgICAgID0gdmFfYXJnIChhcmdfcHRyLCBjb25zdCB2b2lkICopOworICAgICAgICBzaXplX3QgZHRsZW4gICAgICAgPSB2YV9hcmcgKGFyZ19wdHIsIHNpemVfdCk7CisgICAgICAgIGlmICghZmlwc19pc19vcGVyYXRpb25hbCAoKSkKKyAgICAgICAgICBlcnIgPSBmaXBzX25vdF9vcGVyYXRpb25hbCAoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGVyciA9IF9nY3J5X3JhbmRvbV9pbml0X2V4dGVybmFsX3Rlc3QgKHJjdHgsIGZsYWdzLCBrZXksIGtleWxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWVkLCBzZWVkbGVuLCBkdCwgZHRsZW4pOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSA1OTogIC8qIFJ1biBleHRlcm5hbCByYW5kb20gdGVzdC4gICovCisgICAgICB7CisgICAgICAgIHZvaWQgKmN0eCAgICAgPSB2YV9hcmcgKGFyZ19wdHIsIHZvaWQgKik7CisgICAgICAgIHZvaWQgKmJ1ZmZlciAgPSB2YV9hcmcgKGFyZ19wdHIsIHZvaWQgKik7CisgICAgICAgIHNpemVfdCBidWZsZW4gPSB2YV9hcmcgKGFyZ19wdHIsIHNpemVfdCk7CisgICAgICAgIGlmICghZmlwc19pc19vcGVyYXRpb25hbCAoKSkKKyAgICAgICAgICBlcnIgPSBmaXBzX25vdF9vcGVyYXRpb25hbCAoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGVyciA9IF9nY3J5X3JhbmRvbV9ydW5fZXh0ZXJuYWxfdGVzdCAoY3R4LCBidWZmZXIsIGJ1Zmxlbik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDYwOiAgLyogRGVpbml0IGV4dGVybmFsIHJhbmRvbSB0ZXN0LiAgKi8KKyAgICAgIHsKKyAgICAgICAgdm9pZCAqY3R4ID0gdmFfYXJnIChhcmdfcHRyLCB2b2lkICopOworICAgICAgICBfZ2NyeV9yYW5kb21fZGVpbml0X2V4dGVybmFsX3Rlc3QgKGN0eCk7CisgICAgICB9CisgICAgICBicmVhazsKKworCisgICAgZGVmYXVsdDoKKyAgICAgIGVyciA9IEdQR19FUlJfSU5WX09QOworICAgIH0KKworICByZXR1cm4gZ2NyeV9lcnJvciAoZXJyKTsKK30KKworCisvKiBDb21tYW5kIGRpc3BhdGNoZXIgZnVuY3Rpb24sIGFjdGluZyBhcyBnZW5lcmFsIGNvbnRyb2wKKyAgIGZ1bmN0aW9uLiAgKi8KK2djcnlfZXJyb3JfdAorZ2NyeV9jb250cm9sIChlbnVtIGdjcnlfY3RsX2NtZHMgY21kLCAuLi4pCit7CisgIGdjcnlfZXJyb3JfdCBlcnI7CisgIHZhX2xpc3QgYXJnX3B0cjsKKyAgCisgIHZhX3N0YXJ0IChhcmdfcHRyLCBjbWQpOworICBlcnIgPSBfZ2NyeV92Y29udHJvbCAoY21kLCBhcmdfcHRyKTsKKyAgdmFfZW5kKGFyZ19wdHIpOworICByZXR1cm4gZXJyOworfQorCisKKworLyogUmV0dXJuIGEgcG9pbnRlciB0byBhIHN0cmluZyBjb250YWluaW5nIGEgZGVzY3JpcHRpb24gb2YgdGhlIGVycm9yCisgICBjb2RlIGluIHRoZSBlcnJvciB2YWx1ZSBFUlIuICAqLworY29uc3QgY2hhciAqCitnY3J5X3N0cmVycm9yIChnY3J5X2Vycm9yX3QgZXJyKQoreworICByZXR1cm4gZ3BnX3N0cmVycm9yIChlcnIpOworfQorCisvKiBSZXR1cm4gYSBwb2ludGVyIHRvIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZXJyb3IKKyAgIHNvdXJjZSBpbiB0aGUgZXJyb3IgdmFsdWUgRVJSLiAgKi8KK2NvbnN0IGNoYXIgKgorZ2NyeV9zdHJzb3VyY2UgKGdjcnlfZXJyb3JfdCBlcnIpCit7CisgIHJldHVybiBncGdfc3Ryc291cmNlIChlcnIpOworfQorCisvKiBSZXRyaWV2ZSB0aGUgZXJyb3IgY29kZSBmb3IgdGhlIHN5c3RlbSBlcnJvciBFUlIuICBUaGlzIHJldHVybnMKKyAgIEdQR19FUlJfVU5LTk9XTl9FUlJOTyBpZiB0aGUgc3lzdGVtIGVycm9yIGlzIG5vdCBtYXBwZWQgKHJlcG9ydAorICAgdGhpcykuICAqLworZ2NyeV9lcnJfY29kZV90CitnY3J5X2Vycl9jb2RlX2Zyb21fZXJybm8gKGludCBlcnIpCit7CisgIHJldHVybiBncGdfZXJyX2NvZGVfZnJvbV9lcnJubyAoZXJyKTsKK30KKworCisvKiBSZXRyaWV2ZSB0aGUgc3lzdGVtIGVycm9yIGZvciB0aGUgZXJyb3IgY29kZSBDT0RFLiAgVGhpcyByZXR1cm5zIDAKKyAgIGlmIENPREUgaXMgbm90IGEgc3lzdGVtIGVycm9yIGNvZGUuICAqLworaW50CitnY3J5X2Vycl9jb2RlX3RvX2Vycm5vIChnY3J5X2Vycl9jb2RlX3QgY29kZSkKK3sKKyAgcmV0dXJuIGdwZ19lcnJfY29kZV9mcm9tX2Vycm5vIChjb2RlKTsKK30KKworICAKKy8qIFJldHVybiBhbiBlcnJvciB2YWx1ZSB3aXRoIHRoZSBlcnJvciBzb3VyY2UgU09VUkNFIGFuZCB0aGUgc3lzdGVtCisgICBlcnJvciBFUlIuICAqLworZ2NyeV9lcnJvcl90CitnY3J5X2Vycl9tYWtlX2Zyb21fZXJybm8gKGdwZ19lcnJfc291cmNlX3Qgc291cmNlLCBpbnQgZXJyKQoreworICByZXR1cm4gZ3BnX2Vycl9tYWtlX2Zyb21fZXJybm8gKHNvdXJjZSwgZXJyKTsKK30KKworCisvKiBSZXR1cm4gYW4gZXJyb3IgdmFsdWUgd2l0aCB0aGUgc3lzdGVtIGVycm9yIEVSUi4gICovCitnY3J5X2Vycl9jb2RlX3QKK2djcnlfZXJyb3JfZnJvbV9lcnJubyAoaW50IGVycikKK3sKKyAgcmV0dXJuIGdjcnlfZXJyb3IgKGdwZ19lcnJfY29kZV9mcm9tX2Vycm5vIChlcnIpKTsKK30KKworCisvKiBTZXQgY3VzdG9tIGFsbG9jYXRpb24gaGFuZGxlcnMuICBUaGlzIGlzIGluIGdlbmVyYWwgbm90IHVzZWZ1bAorICogYmVjYXVzZSB0aGUgbGliZ2NyeXB0IGFsbG9jYXRpb24gZnVuY3Rpb25zIGFyZSBndWFyYW50ZWVkIHRvCisgKiBwcm92aWRlIHByb3BlciBhbGxvY2F0aW9uIGhhbmRsZXJzIHdoaWNoIHplcm9pemUgbWVtb3J5IGlmIG5lZWRlZC4KKyAqIE5PVEU6IEFsbCA1IGZ1bmN0aW9ucyBzaG91bGQgYmUgc2V0LiAgKi8KK3ZvaWQKK2djcnlfc2V0X2FsbG9jYXRpb25faGFuZGxlciAoZ2NyeV9oYW5kbGVyX2FsbG9jX3QgbmV3X2FsbG9jX2Z1bmMsCisJCQkgICAgIGdjcnlfaGFuZGxlcl9hbGxvY190IG5ld19hbGxvY19zZWN1cmVfZnVuYywKKwkJCSAgICAgZ2NyeV9oYW5kbGVyX3NlY3VyZV9jaGVja190IG5ld19pc19zZWN1cmVfZnVuYywKKwkJCSAgICAgZ2NyeV9oYW5kbGVyX3JlYWxsb2NfdCBuZXdfcmVhbGxvY19mdW5jLAorCQkJICAgICBnY3J5X2hhbmRsZXJfZnJlZV90IG5ld19mcmVlX2Z1bmMpCit7CisgIGdsb2JhbF9pbml0ICgpOworCisgIGlmIChmaXBzX21vZGUgKCkpCisgICAgeworICAgICAgLyogV2UgZG8gbm90IHdhbnQgdG8gZW5mb3JjZSB0aGUgZmlwcyBtb2RlLCBidXQgbWVyZWx5IHNldCBhCisgICAgICAgICBmbGFnIHNvIHRoYXQgdGhlIGFwcGxpY2F0aW9uIG1heSBjaGVjayB3aGV0aGVyIGl0IGlzIHN0aWxsIGluCisgICAgICAgICBmaXBzIG1vZGUuICAqLworICAgICAgX2djcnlfaW5hY3RpdmF0ZV9maXBzX21vZGUgKCJjdXN0b20gYWxsb2NhdGlvbiBoYW5kbGVyIik7CisgICAgfQorCisgIGFsbG9jX2Z1bmMgPSBuZXdfYWxsb2NfZnVuYzsKKyAgYWxsb2Nfc2VjdXJlX2Z1bmMgPSBuZXdfYWxsb2Nfc2VjdXJlX2Z1bmM7CisgIGlzX3NlY3VyZV9mdW5jID0gbmV3X2lzX3NlY3VyZV9mdW5jOworICByZWFsbG9jX2Z1bmMgPSBuZXdfcmVhbGxvY19mdW5jOworICBmcmVlX2Z1bmMgPSBuZXdfZnJlZV9mdW5jOworfQorCisKKworLyoqKioqKioqKioqKioqKioKKyAqIFNldCBhbiBvcHRpb25hbCBoYW5kbGVyIHdoaWNoIGlzIGNhbGxlZCBpbiBjYXNlIHRoZSB4bWFsbG9jIGZ1bmN0aW9ucworICogcmFuIG91dCBvZiBtZW1vcnkuICBUaGlzIGhhbmRsZXIgbWF5IGRvIG9uZSBvZiB0aGVzZSB0aGluZ3M6CisgKiAgIG8gZnJlZSBzb21lIG1lbW9yeSBhbmQgcmV0dXJuIHRydWUsIHNvIHRoYXQgdGhlIHhtYWxsb2MgZnVuY3Rpb24KKyAqICAgICB0cmllcyBhZ2Fpbi4KKyAqICAgbyBEbyB3aGF0ZXZlciBpdCBsaWtlIGFuZCByZXR1cm4gZmFsc2UsIHNvIHRoYXQgdGhlIHhtYWxsb2MgZnVuY3Rpb25zCisgKiAgICAgdXNlIHRoZSBkZWZhdWx0IGZhdGFsIGVycm9yIGhhbmRsZXIuCisgKiAgIG8gVGVybWluYXRlIHRoZSBwcm9ncmFtIGFuZCBkb24ndCByZXR1cm4uCisgKgorICogVGhlIGhhbmRsZXIgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggMyBhcmd1bWVudHM6ICBUaGUgb3BhcXVlIHZhbHVlIHNldCB3aXRoCisgKiB0aGlzIGZ1bmN0aW9uLCB0aGUgcmVxdWVzdGVkIG1lbW9yeSBzaXplLCBhbmQgYSBmbGFnIHdpdGggdGhlc2UgYml0cworICogY3VycmVudGx5IGRlZmluZWQ6CisgKgliaXQgMCBzZXQgPSBzZWN1cmUgbWVtb3J5IGhhcyBiZWVuIHJlcXVlc3RlZC4KKyAqLwordm9pZAorZ2NyeV9zZXRfb3V0b2Zjb3JlX2hhbmRsZXIoIGludCAoKmYpKCB2b2lkKiwgc2l6ZV90LCB1bnNpZ25lZCBpbnQgKSwKKwkJCQkJCQl2b2lkICp2YWx1ZSApCit7CisgIGdsb2JhbF9pbml0ICgpOworCisgIGlmIChmaXBzX21vZGUgKCkgKQorICAgIHsKKyAgICAgIGxvZ19pbmZvICgib3V0IG9mIGNvcmUgaGFuZGxlciBpZ25vcmVkIGluIEZJUFMgbW9kZVxuIik7CisgICAgICByZXR1cm47CisgICAgfQorICAKKyAgb3V0b2Zjb3JlX2hhbmRsZXIgPSBmOworICBvdXRvZmNvcmVfaGFuZGxlcl92YWx1ZSA9IHZhbHVlOworfQorCisvKiBSZXR1cm4gdGhlIG5vX3NlY3VyZV9tZW1vcnkgZmxhZy4gICovCitzdGF0aWMgaW50CitnZXRfbm9fc2VjdXJlX21lbW9yeSAodm9pZCkKK3sKKyAgaWYgKCFub19zZWN1cmVfbWVtb3J5KQorICAgIHJldHVybiAwOworICBpZiAoX2djcnlfZW5mb3JjZWRfZmlwc19tb2RlICgpKQorICAgIHsKKyAgICAgIG5vX3NlY3VyZV9tZW1vcnkgPSAwOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICByZXR1cm4gbm9fc2VjdXJlX21lbW9yeTsKK30KKworCitzdGF0aWMgZ2NyeV9lcnJfY29kZV90Citkb19tYWxsb2MgKHNpemVfdCBuLCB1bnNpZ25lZCBpbnQgZmxhZ3MsIHZvaWQgKiptZW0pCit7CisgIGdjcnlfZXJyX2NvZGVfdCBlcnIgPSAwOworICB2b2lkICptOworCisgIGlmICgoZmxhZ3MgJiBHQ1JZX0FMTE9DX0ZMQUdfU0VDVVJFKSAmJiAhZ2V0X25vX3NlY3VyZV9tZW1vcnkgKCkpCisgICAgeworICAgICAgaWYgKGFsbG9jX3NlY3VyZV9mdW5jKQorCW0gPSAoKmFsbG9jX3NlY3VyZV9mdW5jKSAobik7CisgICAgICBlbHNlCisJbSA9IF9nY3J5X3ByaXZhdGVfbWFsbG9jX3NlY3VyZSAobik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKGFsbG9jX2Z1bmMpCisJbSA9ICgqYWxsb2NfZnVuYykgKG4pOworICAgICAgZWxzZQorCW0gPSBfZ2NyeV9wcml2YXRlX21hbGxvYyAobik7CisgICAgfQorCisgIGlmICghbSkKKyAgICB7CisgICAgICAvKiBNYWtlIHN1cmUgdGhhdCBFUlJOTyBoYXMgYmVlbiBzZXQgaW4gY2FzZSBhIHVzZXIgc3VwcGxpZWQKKyAgICAgICAgIG1lbW9yeSBoYW5kbGVyIGRpZG4ndCBpdCBjb3JyZWN0bHkuICovCisgICAgICBpZiAoIWVycm5vKQorICAgICAgICBlcnJubyA9IEVOT01FTTsKKyAgICAgIGVyciA9IGdwZ19lcnJfY29kZV9mcm9tX2Vycm5vIChlcnJubyk7CisgICAgfQorICBlbHNlCisgICAgKm1lbSA9IG07CisKKyAgcmV0dXJuIGVycjsKK30KKyAgCit2b2lkICoKK2djcnlfbWFsbG9jIChzaXplX3QgbikKK3sKKyAgdm9pZCAqbWVtID0gTlVMTDsKKworICBkb19tYWxsb2MgKG4sIDAsICZtZW0pOworCisgIHJldHVybiBtZW07Cit9CisKK3ZvaWQgKgorZ2NyeV9tYWxsb2Nfc2VjdXJlIChzaXplX3QgbikKK3sKKyAgdm9pZCAqbWVtID0gTlVMTDsKKworICBkb19tYWxsb2MgKG4sIEdDUllfQUxMT0NfRkxBR19TRUNVUkUsICZtZW0pOworCisgIHJldHVybiBtZW07Cit9CisKK2ludAorZ2NyeV9pc19zZWN1cmUgKGNvbnN0IHZvaWQgKmEpCit7CisgIGlmIChnZXRfbm9fc2VjdXJlX21lbW9yeSAoKSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKGlzX3NlY3VyZV9mdW5jKQorICAgIHJldHVybiBpc19zZWN1cmVfZnVuYyAoYSkgOworICByZXR1cm4gX2djcnlfcHJpdmF0ZV9pc19zZWN1cmUgKGEpOworfQorCit2b2lkCitfZ2NyeV9jaGVja19oZWFwKCBjb25zdCB2b2lkICphICkKK3sKKyAgKHZvaWQpYTsKKyAgCisgICAgLyogRklYTUU6IGltcGxlbWVudCB0aGlzKi8KKyNpZiAwCisgICAgaWYoIHNvbWVfaGFuZGxlciApCisJc29tZV9oYW5kbGVyKGEpCisgICAgZWxzZQorCV9nY3J5X3ByaXZhdGVfY2hlY2tfaGVhcChhKQorI2VuZGlmCit9CisKK3ZvaWQgKgorZ2NyeV9yZWFsbG9jICh2b2lkICphLCBzaXplX3QgbikKK3sKKyAgdm9pZCAqcDsKKworICBpZiAocmVhbGxvY19mdW5jKQorICAgIHAgPSByZWFsbG9jX2Z1bmMgKGEsIG4pOworICBlbHNlCisgICAgcCA9ICBfZ2NyeV9wcml2YXRlX3JlYWxsb2MgKGEsIG4pOworICBpZiAoIXAgJiYgIWVycm5vKQorICAgIGVycm5vID0gRU5PTUVNOworICByZXR1cm4gcDsKK30KKwordm9pZAorZ2NyeV9mcmVlICh2b2lkICpwKQoreworICBpbnQgc2F2ZV9lcnJubzsKKworICBpZiAoIXApCisgICAgcmV0dXJuOworCisgIC8qIEluIGNhc2UgRVJSTk8gaXMgc2V0IHdlIGJldHRlciBzYXZlIGl0IHNvIHRoYXQgdGhlIGZyZWUgbWFjaGluZXJ5CisgICAgIG1heSBub3QgYWNjaWRlbnRseSBjaGFuZ2UgRVJSTk8uICBXZSByZXN0b3JlIGl0IG9ubHkgaWYgaXQgd2FzCisgICAgIGFscmVhZHkgc2V0IHRvIGNvbXBseSB3aXRoIHRoZSB1c3VhbCBDIHNlbWFudGljIGZvciBFUlJOTy4gICovCisgIHNhdmVfZXJybm8gPSBlcnJubzsKKyAgaWYgKGZyZWVfZnVuYykKKyAgICBmcmVlX2Z1bmMgKHApOworICBlbHNlCisgICAgX2djcnlfcHJpdmF0ZV9mcmVlIChwKTsKKworICBpZiAoc2F2ZV9lcnJubykKKyAgICBlcnJubyA9IHNhdmVfZXJybm87Cit9CisKK3ZvaWQgKgorZ2NyeV9jYWxsb2MgKHNpemVfdCBuLCBzaXplX3QgbSkKK3sKKyAgc2l6ZV90IGJ5dGVzOworICB2b2lkICpwOworCisgIGJ5dGVzID0gbiAqIG07IC8qIHNpemVfdCBpcyB1bnNpZ25lZCBzbyB0aGUgYmVoYXZpb3Igb24gb3ZlcmZsb3cgaXMKKyAgICAgICAgICAgICAgICAgICAgZGVmaW5lZC4gKi8KKyAgaWYgKG0gJiYgYnl0ZXMgLyBtICE9IG4pIAorICAgIHsKKyAgICAgIGVycm5vID0gRU5PTUVNOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHAgPSBnY3J5X21hbGxvYyAoYnl0ZXMpOworICBpZiAocCkKKyAgICBtZW1zZXQgKHAsIDAsIGJ5dGVzKTsKKyAgcmV0dXJuIHA7Cit9CisKK3ZvaWQgKgorZ2NyeV9jYWxsb2Nfc2VjdXJlIChzaXplX3Qgbiwgc2l6ZV90IG0pCit7CisgIHNpemVfdCBieXRlczsKKyAgdm9pZCAqcDsKKworICBieXRlcyA9IG4gKiBtOyAvKiBzaXplX3QgaXMgdW5zaWduZWQgc28gdGhlIGJlaGF2aW9yIG9uIG92ZXJmbG93IGlzCisgICAgICAgICAgICAgICAgICAgIGRlZmluZWQuICovCisgIGlmIChtICYmIGJ5dGVzIC8gbSAhPSBuKSAKKyAgICB7CisgICAgICBlcnJubyA9IEVOT01FTTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgCisgIHAgPSBnY3J5X21hbGxvY19zZWN1cmUgKGJ5dGVzKTsKKyAgaWYgKHApCisgICAgbWVtc2V0IChwLCAwLCBieXRlcyk7CisgIHJldHVybiBwOworfQorCisKKy8qIENyZWF0ZSBhbmQgcmV0dXJuIGEgY29weSBvZiB0aGUgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyBTVFJJTkcuICBJZgorICAgaXQgaXMgY29udGFpbmVkIGluIHNlY3VyZSBtZW1vcnksIHRoZSBjb3B5IHdpbGwgYmUgY29udGFpbmVkIGluCisgICBzZWN1cmUgbWVtb3J5IGFzIHdlbGwuICBJbiBhbiBvdXQtb2YtbWVtb3J5IGNvbmRpdGlvbiwgTlVMTCBpcworICAgcmV0dXJuZWQuICAqLworY2hhciAqCitnY3J5X3N0cmR1cCAoY29uc3QgY2hhciAqc3RyaW5nKQoreworICBjaGFyICpzdHJpbmdfY3AgPSBOVUxMOworICBzaXplX3Qgc3RyaW5nX24gPSAwOworCisgIHN0cmluZ19uID0gc3RybGVuIChzdHJpbmcpOworCisgIGlmIChnY3J5X2lzX3NlY3VyZSAoc3RyaW5nKSkKKyAgICBzdHJpbmdfY3AgPSBnY3J5X21hbGxvY19zZWN1cmUgKHN0cmluZ19uICsgMSk7CisgIGVsc2UKKyAgICBzdHJpbmdfY3AgPSBnY3J5X21hbGxvYyAoc3RyaW5nX24gKyAxKTsKKyAgCisgIGlmIChzdHJpbmdfY3ApCisgICAgc3RyY3B5IChzdHJpbmdfY3AsIHN0cmluZyk7CisKKyAgcmV0dXJuIHN0cmluZ19jcDsKK30KKworCit2b2lkICoKK2djcnlfeG1hbGxvYyggc2l6ZV90IG4gKQoreworICB2b2lkICpwOworICAKKyAgd2hpbGUgKCAhKHAgPSBnY3J5X21hbGxvYyggbiApKSApIAorICAgIHsKKyAgICAgIGlmICggZmlwc19tb2RlICgpIAorICAgICAgICAgICB8fCAhb3V0b2Zjb3JlX2hhbmRsZXIKKyAgICAgICAgICAgfHwgIW91dG9mY29yZV9oYW5kbGVyIChvdXRvZmNvcmVfaGFuZGxlcl92YWx1ZSwgbiwgMCkgKQorICAgICAgICB7CisgICAgICAgICAgX2djcnlfZmF0YWxfZXJyb3IgKGdwZ19lcnJfY29kZV9mcm9tX2Vycm5vIChlcnJubyksIE5VTEwpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBwOworfQorCit2b2lkICoKK2djcnlfeHJlYWxsb2MoIHZvaWQgKmEsIHNpemVfdCBuICkKK3sKKyAgdm9pZCAqcDsKKyAgCisgIHdoaWxlICggIShwID0gZ2NyeV9yZWFsbG9jKCBhLCBuICkpICkKKyAgICB7CisgICAgICBpZiAoIGZpcHNfbW9kZSAoKQorICAgICAgICAgICB8fCAhb3V0b2Zjb3JlX2hhbmRsZXIKKyAgICAgICAgICAgfHwgIW91dG9mY29yZV9oYW5kbGVyIChvdXRvZmNvcmVfaGFuZGxlcl92YWx1ZSwgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NyeV9pc19zZWN1cmUoYSk/IDM6MiApICkKKyAgICAgICAgeworICAgICAgICAgIF9nY3J5X2ZhdGFsX2Vycm9yIChncGdfZXJyX2NvZGVfZnJvbV9lcnJubyAoZXJybm8pLCBOVUxMICk7CisJfQorICAgIH0KKyAgICByZXR1cm4gcDsKK30KKwordm9pZCAqCitnY3J5X3htYWxsb2Nfc2VjdXJlKCBzaXplX3QgbiApCit7CisgIHZvaWQgKnA7CisgIAorICB3aGlsZSAoICEocCA9IGdjcnlfbWFsbG9jX3NlY3VyZSggbiApKSApIAorICAgIHsKKyAgICAgIGlmICggZmlwc19tb2RlICgpCisgICAgICAgICAgIHx8ICFvdXRvZmNvcmVfaGFuZGxlcgorICAgICAgICAgICB8fCAhb3V0b2Zjb3JlX2hhbmRsZXIgKG91dG9mY29yZV9oYW5kbGVyX3ZhbHVlLCBuLCAxKSApCisgICAgICAgIHsKKyAgICAgICAgICBfZ2NyeV9mYXRhbF9lcnJvciAoZ3BnX2Vycl9jb2RlX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXygib3V0IG9mIGNvcmUgaW4gc2VjdXJlIG1lbW9yeSIpKTsKKwl9CisgICAgfQorICByZXR1cm4gcDsKK30KKworCit2b2lkICoKK2djcnlfeGNhbGxvYyggc2l6ZV90IG4sIHNpemVfdCBtICkKK3sKKyAgc2l6ZV90IG5ieXRlczsKKyAgdm9pZCAqcDsKKworICBuYnl0ZXMgPSBuICogbTsgCisgIGlmIChtICYmIG5ieXRlcyAvIG0gIT0gbikgCisgICAgeworICAgICAgZXJybm8gPSBFTk9NRU07CisgICAgICBfZ2NyeV9mYXRhbF9lcnJvcihncGdfZXJyX2NvZGVfZnJvbV9lcnJubyAoZXJybm8pLCBOVUxMICk7CisgICAgfQorCisgIHAgPSBnY3J5X3htYWxsb2MgKCBuYnl0ZXMgKTsKKyAgbWVtc2V0ICggcCwgMCwgbmJ5dGVzICk7CisgIHJldHVybiBwOworfQorCit2b2lkICoKK2djcnlfeGNhbGxvY19zZWN1cmUoIHNpemVfdCBuLCBzaXplX3QgbSApCit7CisgIHNpemVfdCBuYnl0ZXM7CisgIHZvaWQgKnA7CisKKyAgbmJ5dGVzID0gbiAqIG07IAorICBpZiAobSAmJiBuYnl0ZXMgLyBtICE9IG4pIAorICAgIHsKKyAgICAgIGVycm5vID0gRU5PTUVNOworICAgICAgX2djcnlfZmF0YWxfZXJyb3IoZ3BnX2Vycl9jb2RlX2Zyb21fZXJybm8gKGVycm5vKSwgTlVMTCApOworICAgIH0KKworICBwID0gZ2NyeV94bWFsbG9jX3NlY3VyZSAoIG5ieXRlcyApOworICBtZW1zZXQgKCBwLCAwLCBuYnl0ZXMgKTsKKyAgcmV0dXJuIHA7Cit9CisKK2NoYXIgKgorZ2NyeV94c3RyZHVwIChjb25zdCBjaGFyICpzdHJpbmcpCit7CisgIGNoYXIgKnA7CisgIAorICB3aGlsZSAoICEocCA9IGdjcnlfc3RyZHVwIChzdHJpbmcpKSApIAorICAgIHsKKyAgICAgIHNpemVfdCBuID0gc3RybGVuIChzdHJpbmcpOworICAgICAgaW50IGlzX3NlYyA9ICEhZ2NyeV9pc19zZWN1cmUgKHN0cmluZyk7CisgICAgICAKKyAgICAgIGlmIChmaXBzX21vZGUgKCkKKyAgICAgICAgICB8fCAhb3V0b2Zjb3JlX2hhbmRsZXIKKyAgICAgICAgICB8fCAhb3V0b2Zjb3JlX2hhbmRsZXIgKG91dG9mY29yZV9oYW5kbGVyX3ZhbHVlLCBuLCBpc19zZWMpICkgCisgICAgICAgIHsKKyAgICAgICAgICBfZ2NyeV9mYXRhbF9lcnJvciAoZ3BnX2Vycl9jb2RlX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfc2VjPyBfKCJvdXQgb2YgY29yZSBpbiBzZWN1cmUgbWVtb3J5Iik6TlVMTCk7CisJfQorICAgIH0KKworICByZXR1cm4gcDsKK30KKworCitpbnQKK19nY3J5X2dldF9kZWJ1Z19mbGFnICh1bnNpZ25lZCBpbnQgbWFzaykKK3sKKyAgaWYgKCBmaXBzX21vZGUgKCkgKQorICAgIHJldHVybiAwOworICByZXR1cm4gKGRlYnVnX2ZsYWdzICYgbWFzayk7Cit9CisKKworDAorLyogSXQgaXMgb2Z0ZW4gdXNlZnVsIHRvIGdldCBzb21lIGZlZWRiYWNrIG9mIGxvbmcgcnVubmluZyBvcGVyYXRpb25zLgorICAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgdXNlZCB0byByZWdpc3RlciBhIGhhbmRsZXIgZm9yIHRoaXMuIAorICAgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIENCIGlzIHVzZWQgYXM6CisKKyAgIHZvaWQgY2IgKHZvaWQgKm9wYXF1ZSwgY29uc3QgY2hhciAqd2hhdCwgaW50IHByaW50Y2hhciwKKyAgICAgICAgICAgaW50IGN1cnJlbnQsIGludCB0b3RhbCk7CisKKyAgIFdoZXJlIFdIQVQgaXMgYSBzdHJpbmcgaWRlbnRpZnlpbmcgdGhlIHRoZSB0eXBlIG9mIHRoZSBwcm9ncmVzcworICAgb3V0cHV0LCBQUklOVENIQVIgdGhlIGNoYXJhY3RlciB1c3VhbGx5IHByaW50ZWQsIENVUlJFTlQgdGhlIGFtb3VudAorICAgb2YgcHJvZ3Jlc3MgY3VycmVudGx5IGRvbmUgYW5kIFRPVEFMIHRoZSBleHBlY3RlZCBhbW91bnQgb2YKKyAgIHByb2dyZXNzLiAgQSB2YWx1ZSBvZiAwIGZvciBUT1RBTCBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBpcyBubworICAgZXN0aW1hdGlvbiBhdmFpbGFibGUuCisKKyAgIERlZmluZWQgdmFsdWVzIGZvciBXSEFUOgorCisgICAibmVlZF9lbnRyb3B5IiAgWCAgICAwICBudW1iZXItb2YtYnl0ZXMtcmVxdWlyZWQKKyAgICAgICAgICAgIFdoZW4gcnVubmluZyBsb3cgb24gZW50cm9weQorICAgInByaW1lZ2VuIiAgICAgICdcbicgIDAgMAorICAgICAgICAgICBQcmltZSBnZW5lcmF0ZWQKKyAgICAgICAgICAgICAgICAgICAnIScKKyAgICAgICAgICAgTmVlZCB0byByZWZyZXNoIHRoZSBwcmltZSBwb29sCisgICAgICAgICAgICAgICAgICAgJzwnLCc+JworICAgICAgICAgICBOdW1iZXIgb2YgYml0cyBhZGp1c3RlZAorICAgICAgICAgICAgICAgICAgICdeJworICAgICAgICAgICBMb29raW5nIGZvciBhIGdlbmVyYXRvcgorICAgICAgICAgICAgICAgICAgICcuJworICAgICAgICAgICBGZXJtYXQgdGVzdHMgb24gMTAgY2FuZGlkYXRlcyBmYWlsZWQKKyAgICAgICAgICAgICAgICAgICc6JworICAgICAgICAgICBSZXN0YXJ0IHdpdGggYSBuZXcgcmFuZG9tIHZhbHVlCisgICAgICAgICAgICAgICAgICAnKycKKyAgICAgICAgICAgUmFiaW4gTWlsbGVyIHRlc3QgcGFzc2VkICAgICAgICAgIAorICAgInBrX2VsZyIgICAgICAgICcrJywnLScsJy4nLCdcbicgICAwICAwCisgICAgICAgICAgICBPbmx5IHVzZWQgaW4gZGVidWdnaW5nIG1vZGUuCisgICAicGtfZHNhIiAgICAgICAKKyAgICAgICAgICAgIE9ubHkgdXNlZCBpbiBkZWJ1Z2dpbmcgbW9kZS4KKyovCit2b2lkCitnY3J5X3NldF9wcm9ncmVzc19oYW5kbGVyICh2b2lkICgqY2IpKHZvaWQgKixjb25zdCBjaGFyKixpbnQsIGludCwgaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNiX2RhdGEpCit7CisjaWYgVVNFX0RTQQorICBfZ2NyeV9yZWdpc3Rlcl9wa19kc2FfcHJvZ3Jlc3MgKGNiLCBjYl9kYXRhKTsKKyNlbmRpZgorI2lmIFVTRV9FTEdBTUFMCisgIF9nY3J5X3JlZ2lzdGVyX3BrX2VsZ19wcm9ncmVzcyAoY2IsIGNiX2RhdGEpOworI2VuZGlmCisgIF9nY3J5X3JlZ2lzdGVyX3ByaW1lZ2VuX3Byb2dyZXNzIChjYiwgY2JfZGF0YSk7CisgIF9nY3J5X3JlZ2lzdGVyX3JhbmRvbV9wcm9ncmVzcyAoY2IsIGNiX2RhdGEpOworfQpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L3NyYy9obWFjMjU2LmMgYi9saWJnY3J5cHQtMS40LjYvc3JjL2htYWMyNTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmY4M2RkCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L3NyYy9obWFjMjU2LmMKQEAgLTAsMCArMSw3ODQgQEAKKy8qIGhtYWMyNTYuYyAtIFN0YW5kYWxvbmUgSE1BQyBpbXBsZW1lbnRhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA2LCAyMDA4ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworLyogCisgICAgVGhpcyBpcyBhIHN0YW5kYWxvbmUgSE1BQy1TSEEtMjU2IGltcGxlbWVudGF0aW9uIGJhc2VkIG9uIHRoZSBjb2RlCisgICAgZnJvbSAuLi9jaXBoZXIvc2hhMjU2LmMuICBJdCBpcyBhIHNlY29uZCBpbXBsZW1lbnRhdGlvbiB0byBhbGxvdworICAgIGNvbXBhcmluZyBhZ2FpbnN0IHRoZSBzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbnMgYW5kIHRvIGJlIHVzZWQgZm9yCisgICAgaW50ZXJuYWwgY29uc2lzdGVuY3kgY2hlY2tzLiAgSXQgc2hvdWxkIG5vdCBiZSB1c2VkIGZvciBzZW5zaXRpdmUKKyAgICBkYXRhIGJlY2F1c2Ugbm8gbWVjaGFuaXNtcyB0byBjbGVhciB0aGUgc3RhY2sgZXRjIGFyZSB1c2VkLgorCisgICAgVGhpcyBtb2R1bGUgbWF5IGJlIHVzZWQgc3RhbmRhbG9uZSBhbmQgcmVxdWlyZXMgb25seSBhIGZldworICAgIHN0YW5kYXJkIGRlZmluaXRpb25zIHRvIGJlIHByb3ZpZGVkIGluIGEgY29uZmlnLmggZmlsZS4KKworICAgIFR5cGVzOgorCisgICAgIHUzMiAtIHVuc2lnbmVkIDMyIGJpdCB0eXBlLgorCisgICAgQ29uc3RhbnRzOgorCisgICAgIFdPUkRTX0JJR0VORElBTiAgICAgICBEZWZpbmVkIHRvIDEgb24gYmlnIGVuZGlhbiBzeXN0ZW1zLiAgICAgIAorICAgICBpbmxpbmUgICAgICAgICAgICAgICAgSWYgZGVmaW5lZCwgaXQgc2hvdWxkIHlpZWxkIHRoZSBrZXl3b3JkIHVzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGlubGluZSBhIGZ1bmN0aW9uLgorICAgICBIQVZFX1UzMl9UWVBFREVGICAgICAgRGVmaW5lZCBpZiB0aGUgdTMyIHR5cGUgaXMgYXZhaWxhYmxlLgorICAgICBTSVpFT0ZfVU5TSUdORURfSU5UICAgRGVmaW5lZCB0byB0aGUgc2l6ZSBpbiBieXRlcyBvZiBhbiB1bnNpZ25lZCBpbnQuCisgICAgIFNJWkVPRl9VTlNJR05FRF9MT05HICBEZWZpbmVkIHRvIHRoZSBzaXplIGluIGJ5dGVzIG9mIGFuIHVuc2lnbmVkIGxvbmcuCisKKyAgICAgU1RBTkRBTE9ORSAgICAgICAgICAgIENvbXBpbGUgYSB0ZXN0IGRyaXZlciBzaW1pbGFyIHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhMXN1bSB0b29sLiAgVGhpcyBkcml2ZXIgdXNlcyBhIHNlbGYtdGVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpY2FsbHkgdG8gdGhlIG9uZSB1c2VkIGJ5IExpYmNncnlwdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRlc3RpbmcgdGhpcyBpbmNsdWRlZCBtb2R1bGUuCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpZiBkZWZpbmVkKF9fV0lOMzIpICYmIGRlZmluZWQoU1RBTkRBTE9ORSkKKyMgaW5jbHVkZSA8ZmNudGwuaD4gLyogV2UgbmVlZCBzZXRtb2RlKCkuICAqLworI2VuZGlmCisKKyNpbmNsdWRlICJobWFjMjU2LmgiCisKKworCisjaWZuZGVmIEhBVkVfVTMyX1RZUEVERUYKKyMgdW5kZWYgdTMyIC8qIFVuZGVmIGEgcG9zc2libGUgbWFjcm8gd2l0aCB0aGF0IG5hbWUuICAqLworIyBpZiBTSVpFT0ZfVU5TSUdORURfSU5UID09IDQKKyAgIHR5cGVkZWYgdW5zaWduZWQgaW50IHUzMjsKKyMgZWxpZiBTSVpFT0ZfVU5TSUdORURfTE9ORyA9PSA0CisgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgdTMyOworIyBlbHNlCisjICBlcnJvciBubyB0eXBlZGVmIGZvciB1MzIKKyMgZW5kaWYKKyMgZGVmaW5lIEhBVkVfVTMyX1RZUEVERUYKKyNlbmRpZgorCisKKworCisvKiBUaGUgY29udGV4dCB1c2VkIGJ5IHRoaXMgbW9kdWxlLiAgKi8KK3N0cnVjdCBobWFjMjU2X2NvbnRleHQKK3sKKyAgdTMyICBoMCwgaDEsIGgyLCBoMywgaDQsIGg1LCBoNiwgaDc7CisgIHUzMiAgbmJsb2NrczsKKyAgaW50ICBjb3VudDsKKyAgaW50ICBmaW5hbGl6ZWQ6MTsKKyAgaW50ICB1c2VfaG1hYzoxOyAKKyAgdW5zaWduZWQgY2hhciBidWZbNjRdOworICB1bnNpZ25lZCBjaGFyIG9wYWRbNjRdOworfTsKKworCisvKiBSb3RhdGUgYSAzMiBiaXQgd29yZC4gICovCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX2kzODZfXykKK3N0YXRpYyBpbmxpbmUgdTMyCityb3IodTMyIHgsIGludCBuKQoreworCV9fYXNtX18oInJvcmwgJSVjbCwlMCIKKwkJOiI9ciIgKHgpCisJCToiMCIgKHgpLCJjIiAobikpOworCXJldHVybiB4OworfQorI2Vsc2UKKyNkZWZpbmUgcm9yKHgsbikgKCAoKHgpID4+IChuKSkgfCAoKHgpIDw8ICgzMi0obikpKSApCisjZW5kaWYKKworI2RlZmluZSBteV93aXBlbWVtb3J5MihfcHRyLF9zZXQsX2xlbikgZG8geyBcCisgICAgICAgICAgICAgIHZvbGF0aWxlIGNoYXIgKl92cHRyPSh2b2xhdGlsZSBjaGFyICopKF9wdHIpOyBcCisgICAgICAgICAgICAgIHNpemVfdCBfdmxlbj0oX2xlbik7IFwKKyAgICAgICAgICAgICAgd2hpbGUoX3ZsZW4pIHsgKl92cHRyPShfc2V0KTsgX3ZwdHIrKzsgX3ZsZW4tLTsgfSBcCisgICAgICAgICAgICAgICAgICB9IHdoaWxlKDApCisjZGVmaW5lIG15X3dpcGVtZW1vcnkoX3B0cixfbGVuKSBteV93aXBlbWVtb3J5MihfcHRyLDAsX2xlbikKKworCisKKwwKKy8qIAorICAgIFRoZSBTSEEtMjU2IGNvcmU6IFRyYW5zZm9ybSB0aGUgbWVzc2FnZSBYIHdoaWNoIGNvbnNpc3RzIG9mIDE2CisgICAgMzItYml0LXdvcmRzLiBTZWUgRklQUyAxODAtMiBmb3IgZGV0YWlscy4KKyAqLworc3RhdGljIHZvaWQKK3RyYW5zZm9ybSAoaG1hYzI1Nl9jb250ZXh0X3QgaGQsIGNvbnN0IHZvaWQgKmRhdGFfYXJnKQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhID0gZGF0YV9hcmc7CisKKyNkZWZpbmUgQ2hvKHgseSx6KSAoeiBeICh4ICYgKHkgXiB6KSkpICAgICAgLyogKDQuMikgc2FtZSBhcyBTSEEtMSdzIEYxICovCisjZGVmaW5lIE1haih4LHkseikgKCh4ICYgeSkgfCAoeiAmICh4fHkpKSkgIC8qICg0LjMpIHNhbWUgYXMgU0hBLTEncyBGMyAqLworI2RlZmluZSBTdW0wKHgpIChyb3IgKCh4KSwgMikgXiByb3IgKCh4KSwgMTMpIF4gcm9yICgoeCksIDIyKSkgIC8qICg0LjQpICovCisjZGVmaW5lIFN1bTEoeCkgKHJvciAoKHgpLCA2KSBeIHJvciAoKHgpLCAxMSkgXiByb3IgKCh4KSwgMjUpKSAgLyogKDQuNSkgKi8KKyNkZWZpbmUgUzAoeCkgKHJvciAoKHgpLCA3KSBeIHJvciAoKHgpLCAxOCkgXiAoKHgpID4+IDMpKSAgICAgICAvKiAoNC42KSAqLworI2RlZmluZSBTMSh4KSAocm9yICgoeCksIDE3KSBeIHJvciAoKHgpLCAxOSkgXiAoKHgpID4+IDEwKSkgICAgIC8qICg0LjcpICovCisjZGVmaW5lIFIoYSxiLGMsZCxlLGYsZyxoLGssdykgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0MSA9IChoKSArIFN1bTEoKGUpKSArIENobygoZSksKGYpLChnKSkgKyAoaykgKyAodyk7ICBcCisgICAgICAgICAgICB0MiA9IFN1bTAoKGEpKSArIE1haigoYSksKGIpLChjKSk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBoID0gZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBnID0gZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmID0gZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBlID0gZCArIHQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkID0gYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjID0gYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBiID0gYTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhID0gdDEgKyB0MjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgfSB3aGlsZSAoMCkKKyAKKyAgc3RhdGljIGNvbnN0IHUzMiBLWzY0XSA9IAorICAgIHsKKyAgICAgIDB4NDI4YTJmOTgsIDB4NzEzNzQ0OTEsIDB4YjVjMGZiY2YsIDB4ZTliNWRiYTUsCisgICAgICAweDM5NTZjMjViLCAweDU5ZjExMWYxLCAweDkyM2Y4MmE0LCAweGFiMWM1ZWQ1LAorICAgICAgMHhkODA3YWE5OCwgMHgxMjgzNWIwMSwgMHgyNDMxODViZSwgMHg1NTBjN2RjMywKKyAgICAgIDB4NzJiZTVkNzQsIDB4ODBkZWIxZmUsIDB4OWJkYzA2YTcsIDB4YzE5YmYxNzQsIAorICAgICAgMHhlNDliNjljMSwgMHhlZmJlNDc4NiwgMHgwZmMxOWRjNiwgMHgyNDBjYTFjYywKKyAgICAgIDB4MmRlOTJjNmYsIDB4NGE3NDg0YWEsIDB4NWNiMGE5ZGMsIDB4NzZmOTg4ZGEsCisgICAgICAweDk4M2U1MTUyLCAweGE4MzFjNjZkLCAweGIwMDMyN2M4LCAweGJmNTk3ZmM3LAorICAgICAgMHhjNmUwMGJmMywgMHhkNWE3OTE0NywgMHgwNmNhNjM1MSwgMHgxNDI5Mjk2NywKKyAgICAgIDB4MjdiNzBhODUsIDB4MmUxYjIxMzgsIDB4NGQyYzZkZmMsIDB4NTMzODBkMTMsCisgICAgICAweDY1MGE3MzU0LCAweDc2NmEwYWJiLCAweDgxYzJjOTJlLCAweDkyNzIyYzg1LAorICAgICAgMHhhMmJmZThhMSwgMHhhODFhNjY0YiwgMHhjMjRiOGI3MCwgMHhjNzZjNTFhMywKKyAgICAgIDB4ZDE5MmU4MTksIDB4ZDY5OTA2MjQsIDB4ZjQwZTM1ODUsIDB4MTA2YWEwNzAsCisgICAgICAweDE5YTRjMTE2LCAweDFlMzc2YzA4LCAweDI3NDg3NzRjLCAweDM0YjBiY2I1LAorICAgICAgMHgzOTFjMGNiMywgMHg0ZWQ4YWE0YSwgMHg1YjljY2E0ZiwgMHg2ODJlNmZmMywKKyAgICAgIDB4NzQ4ZjgyZWUsIDB4NzhhNTYzNmYsIDB4ODRjODc4MTQsIDB4OGNjNzAyMDgsCisgICAgICAweDkwYmVmZmZhLCAweGE0NTA2Y2ViLCAweGJlZjlhM2Y3LCAweGM2NzE3OGYyCisgICAgfTsKKworICB1MzIgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgdDEsIHQyOworICB1MzIgeFsxNl07CisgIHUzMiB3WzY0XTsKKyAgaW50IGk7CisgIAorICBhID0gaGQtPmgwOworICBiID0gaGQtPmgxOworICBjID0gaGQtPmgyOworICBkID0gaGQtPmgzOworICBlID0gaGQtPmg0OworICBmID0gaGQtPmg1OworICBnID0gaGQtPmg2OworICBoID0gaGQtPmg3OworICAKKyNpZmRlZiBXT1JEU19CSUdFTkRJQU4KKyAgbWVtY3B5ICh4LCBkYXRhLCA2NCk7CisjZWxzZSAvKiFXT1JEU19CSUdFTkRJQU4qLworICB7IAorICAgIHVuc2lnbmVkIGNoYXIgKnAyOworICAKKyAgICBmb3IgKGk9MCwgcDI9KHVuc2lnbmVkIGNoYXIqKXg7IGkgPCAxNjsgaSsrLCBwMiArPSA0ICkgCisgICAgICB7CisgICAgICAgIHAyWzNdID0gKmRhdGErKzsKKyAgICAgICAgcDJbMl0gPSAqZGF0YSsrOworICAgICAgICBwMlsxXSA9ICpkYXRhKys7CisgICAgICAgIHAyWzBdID0gKmRhdGErKzsKKyAgICAgIH0KKyAgfQorI2VuZGlmIC8qIVdPUkRTX0JJR0VORElBTiovCisKKyAgZm9yIChpPTA7IGkgPCAxNjsgaSsrKQorICAgIHdbaV0gPSB4W2ldOworICBmb3IgKDsgaSA8IDY0OyBpKyspCisgICAgd1tpXSA9IFMxKHdbaS0yXSkgKyB3W2ktN10gKyBTMCh3W2ktMTVdKSArIHdbaS0xNl07CisKKyAgZm9yIChpPTA7IGkgPCA2NDsgaSsrKQorICAgIFIoYSxiLGMsZCxlLGYsZyxoLEtbaV0sd1tpXSk7CisKKyAgaGQtPmgwICs9IGE7CisgIGhkLT5oMSArPSBiOworICBoZC0+aDIgKz0gYzsKKyAgaGQtPmgzICs9IGQ7CisgIGhkLT5oNCArPSBlOworICBoZC0+aDUgKz0gZjsKKyAgaGQtPmg2ICs9IGc7CisgIGhkLT5oNyArPSBoOworfQorI3VuZGVmIENobworI3VuZGVmIE1hagorI3VuZGVmIFN1bTAKKyN1bmRlZiBTdW0xCisjdW5kZWYgUzAKKyN1bmRlZiBTMQorI3VuZGVmIFIKKworCisvKiAgRmluYWxpemUgdGhlIGN1cnJlbnQgU0hBMjU2IGNhbGN1bGF0aW9uLiAgKi8KK3N0YXRpYyB2b2lkCitmaW5hbGl6ZSAoaG1hYzI1Nl9jb250ZXh0X3QgaGQpCit7CisgIHUzMiB0LCBtc2IsIGxzYjsKKyAgdW5zaWduZWQgY2hhciAqcDsKKyAgCisgIGlmIChoZC0+ZmluYWxpemVkKQorICAgIHJldHVybjsgLyogU2lsZW50bHkgaWdub3JlIGEgZmluYWxpemVkIGNvbnRleHQuICAqLworCisgIF9nY3J5X2htYWMyNTZfdXBkYXRlIChoZCwgTlVMTCwgMCk7IC8qIEZsdXNoLiAgKi8KKworICB0ID0gaGQtPm5ibG9ja3M7CisgIC8qIE11bHRpcGx5IGJ5IDY0IHRvIG1ha2UgYSBieXRlIGNvdW50LiAqLworICBsc2IgPSB0IDw8IDY7CisgIG1zYiA9IHQgPj4gMjY7CisgIC8qIEFkZCB0aGUgY291bnQuICovCisgIHQgPSBsc2I7CisgIGlmICgobHNiICs9IGhkLT5jb3VudCkgPCB0KQorICAgIG1zYisrOworICAvKiBNdWx0aXBseSBieSA4IHRvIG1ha2UgYSBiaXQgY291bnQuICovCisgIHQgPSBsc2I7CisgIGxzYiA8PD0gMzsKKyAgbXNiIDw8PSAzOworICBtc2IgfD0gdCA+PiAyOTsKKworICBpZiAoaGQtPmNvdW50IDwgNTYpCisgICAgeyAvKiBFbm91Z2ggcm9vbS4gICovCisgICAgICBoZC0+YnVmW2hkLT5jb3VudCsrXSA9IDB4ODA7IC8qIHBhZCAqLworICAgICAgd2hpbGUgKGhkLT5jb3VudCA8IDU2KQorICAgICAgICBoZC0+YnVmW2hkLT5jb3VudCsrXSA9IDA7ICAvKiBwYWQgKi8KKyAgICB9CisgIGVsc2UKKyAgICB7IC8qIE5lZWQgb25lIGV4dHJhIGJsb2NrLiAqLworICAgICAgaGQtPmJ1ZltoZC0+Y291bnQrK10gPSAweDgwOyAvKiBwYWQgY2hhcmFjdGVyICovCisgICAgICB3aGlsZSAoaGQtPmNvdW50IDwgNjQpCisgICAgICAgIGhkLT5idWZbaGQtPmNvdW50KytdID0gMDsKKyAgICAgIF9nY3J5X2htYWMyNTZfdXBkYXRlIChoZCwgTlVMTCwgMCk7ICAvKiBGbHVzaC4gICovOworICAgICAgbWVtc2V0IChoZC0+YnVmLCAwLCA1NiApOyAvKiBaZXJvIG91dCBuZXh0IG5leHQgYmxvY2suICAqLworICAgIH0KKyAgLyogQXBwZW5kIHRoZSA2NCBiaXQgY291bnQuICovCisgIGhkLT5idWZbNTZdID0gbXNiID4+IDI0OworICBoZC0+YnVmWzU3XSA9IG1zYiA+PiAxNjsKKyAgaGQtPmJ1Zls1OF0gPSBtc2IgPj4gIDg7CisgIGhkLT5idWZbNTldID0gbXNiOworICBoZC0+YnVmWzYwXSA9IGxzYiA+PiAyNDsKKyAgaGQtPmJ1Zls2MV0gPSBsc2IgPj4gMTY7CisgIGhkLT5idWZbNjJdID0gbHNiID4+ICA4OworICBoZC0+YnVmWzYzXSA9IGxzYjsKKyAgdHJhbnNmb3JtIChoZCwgaGQtPmJ1Zik7CisKKyAgLyogU3RvcmUgdGhlIGRpZ2VzdCBpbnRvIGhkLT5idWYuICAqLworICBwID0gaGQtPmJ1ZjsKKyNkZWZpbmUgWChhKSBkbyB7ICpwKysgPSBoZC0+aCMjYSA+PiAyNDsgKnArKyA9IGhkLT5oIyNhID4+IDE2OwkgXAorCQkgICpwKysgPSBoZC0+aCMjYSA+PiA4OyAqcCsrID0gaGQtPmgjI2E7IH0gd2hpbGUoMCkKKyAgWCgwKTsKKyAgWCgxKTsKKyAgWCgyKTsKKyAgWCgzKTsKKyAgWCg0KTsKKyAgWCg1KTsKKyAgWCg2KTsKKyAgWCg3KTsKKyN1bmRlZiBYCisgIGhkLT5maW5hbGl6ZWQgPSAxOworfQorCisKKworLyogQ3JlYXRlIGEgbmV3IGNvbnRleHQuICBPbiBlcnJvciBOVUxMIGlzIHJldHVybmVkIGFuZCBlcnJubyBpcyBzZXQKKyAgIGFwcHJvcHJpYXRlbHkuICBJZiBLRVkgaXMgZ2l2ZW4gdGhlIGZ1Y250aW9uIGNvbXB1dGVzIEhNQUMgdXNpbmcKKyAgIHRoaXMga2V5OyB3aXRoIEtFWSBnaXZlbiBhcyBOVUxMLCBhIHBsYWluIFNIQS0yNTYgZGlnZXN0IGlzCisgICBjb21wdXRlZC4gICovCitobWFjMjU2X2NvbnRleHRfdAorX2djcnlfaG1hYzI1Nl9uZXcgKGNvbnN0IHZvaWQgKmtleSwgc2l6ZV90IGtleWxlbikKK3sKKyAgaG1hYzI1Nl9jb250ZXh0X3QgaGQ7CisKKyAgaGQgPSBtYWxsb2MgKHNpemVvZiAqaGQpOworICBpZiAoIWhkKQorICAgIHJldHVybiBOVUxMOworCisgIGhkLT5oMCA9IDB4NmEwOWU2Njc7CisgIGhkLT5oMSA9IDB4YmI2N2FlODU7CisgIGhkLT5oMiA9IDB4M2M2ZWYzNzI7CisgIGhkLT5oMyA9IDB4YTU0ZmY1M2E7CisgIGhkLT5oNCA9IDB4NTEwZTUyN2Y7CisgIGhkLT5oNSA9IDB4OWIwNTY4OGM7CisgIGhkLT5oNiA9IDB4MWY4M2Q5YWI7CisgIGhkLT5oNyA9IDB4NWJlMGNkMTk7CisgIGhkLT5uYmxvY2tzID0gMDsKKyAgaGQtPmNvdW50ID0gMDsKKyAgaGQtPmZpbmFsaXplZCA9IDA7CisgIGhkLT51c2VfaG1hYyA9IDA7CisKKyAgaWYgKGtleSkKKyAgICB7CisgICAgICBpbnQgaTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaXBhZFs2NF07CisKKyAgICAgIG1lbXNldCAoaXBhZCwgMCwgNjQpOworICAgICAgbWVtc2V0IChoZC0+b3BhZCwgMCwgNjQpOworICAgICAgaWYgKGtleWxlbiA8PSA2NCkKKyAgICAgICAgeworICAgICAgICAgIG1lbWNweSAoaXBhZCwga2V5LCBrZXlsZW4pOworICAgICAgICAgIG1lbWNweSAoaGQtPm9wYWQsIGtleSwga2V5bGVuKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaG1hYzI1Nl9jb250ZXh0X3QgdG1waGQ7CisgICAgICAgICAgCisgICAgICAgICAgdG1waGQgPSBfZ2NyeV9obWFjMjU2X25ldyAoTlVMTCwgMCk7CisgICAgICAgICAgaWYgKCF0bXBoZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZnJlZSAoaGQpOworICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBfZ2NyeV9obWFjMjU2X3VwZGF0ZSAodG1waGQsIGtleSwga2V5bGVuKTsKKyAgICAgICAgICBmaW5hbGl6ZSAodG1waGQpOworICAgICAgICAgIG1lbWNweSAoaXBhZCwgdG1waGQtPmJ1ZiwgMzIpOworICAgICAgICAgIG1lbWNweSAoaGQtPm9wYWQsIHRtcGhkLT5idWYsIDMyKTsKKyAgICAgICAgICBfZ2NyeV9obWFjMjU2X3JlbGVhc2UgKHRtcGhkKTsKKyAgICAgICAgfQorICAgICAgZm9yIChpPTA7IGkgPCA2NDsgaSsrKSAKKyAgICAgICAgeworICAgICAgICAgIGlwYWRbaV0gXj0gMHgzNjsKKyAgICAgICAgICBoZC0+b3BhZFtpXSBePSAweDVjOworICAgICAgICB9CisgICAgICBoZC0+dXNlX2htYWMgPSAxOworICAgICAgX2djcnlfaG1hYzI1Nl91cGRhdGUgKGhkLCBpcGFkLCA2NCk7CisgICAgICBteV93aXBlbWVtb3J5IChpcGFkLCA2NCk7CisgICAgfQorIAorICByZXR1cm4gaGQ7Cit9CisKKy8qIFJlbGVhc2UgYSBjb250ZXh0IGNyZWF0ZWQgYnkgX2djcnlfaG1hYzI1Nl9uZXcuICBDVFggbWF5IGJlIE5VTEwKKyAgIGluIHdoaWNoIGNhc2UgdGhlIGZ1bmN0aW9uIGRvZXMgbm90aGluZy4gICovCit2b2lkCitfZ2NyeV9obWFjMjU2X3JlbGVhc2UgKGhtYWMyNTZfY29udGV4dF90IGN0eCkKK3sKKyAgaWYgKGN0eCkKKyAgICB7CisgICAgICAvKiBOb3RlOiBXZSBuZWVkIHRvIHRha2UgY2FyZSBub3QgdG8gbW9kaWZ5IGVycm5vLiAgKi8KKyAgICAgIGlmIChjdHgtPnVzZV9obWFjKQorICAgICAgICBteV93aXBlbWVtb3J5IChjdHgtPm9wYWQsIDY0KTsKKyAgICAgIGZyZWUgKGN0eCk7CisgICAgfQorfQorCisKKy8qIFVwZGF0ZSB0aGUgbWVzc2FnZSBkaWdlc3Qgd2l0aCB0aGUgY29udGVudHMgb2YgQlVGRkVSIGNvbnRhaW5pbmcKKyAgIExFTkdUSCBieXRlcy4gICovCit2b2lkCitfZ2NyeV9obWFjMjU2X3VwZGF0ZSAoaG1hYzI1Nl9jb250ZXh0X3QgaGQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBsZW5ndGgpCit7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluYnVmID0gYnVmZmVyOworCisgIGlmIChoZC0+ZmluYWxpemVkKQorICAgIHJldHVybjsgLyogU2lsZW50bHkgaWdub3JlIGEgZmluYWxpemVkIGNvbnRleHQuICAqLworCisgIGlmIChoZC0+Y291bnQgPT0gNjQpCisgICAgeyAKKyAgICAgIC8qIEZsdXNoIHRoZSBidWZmZXIuICovCisgICAgICB0cmFuc2Zvcm0gKGhkLCBoZC0+YnVmKTsKKyAgICAgIGhkLT5jb3VudCA9IDA7CisgICAgICBoZC0+bmJsb2NrcysrOworICAgIH0KKyAgaWYgKCFpbmJ1ZikKKyAgICByZXR1cm47ICAvKiBPbmx5IGZsdXNoaW5nIHdhcyByZXF1ZXN0ZWQuICovCisgIGlmIChoZC0+Y291bnQpCisgICAgeworICAgICAgZm9yICg7IGxlbmd0aCAmJiBoZC0+Y291bnQgPCA2NDsgbGVuZ3RoLS0pCisgICAgICAgIGhkLT5idWZbaGQtPmNvdW50KytdID0gKmluYnVmKys7CisgICAgICBfZ2NyeV9obWFjMjU2X3VwZGF0ZSAoaGQsIE5VTEwsIDApOyAvKiBGbHVzaC4gICovCisgICAgICBpZiAoIWxlbmd0aCkKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworCisgIHdoaWxlIChsZW5ndGggPj0gNjQpCisgICAgeworICAgICAgdHJhbnNmb3JtIChoZCwgaW5idWYpOworICAgICAgaGQtPmNvdW50ID0gMDsKKyAgICAgIGhkLT5uYmxvY2tzKys7CisgICAgICBsZW5ndGggLT0gNjQ7CisgICAgICBpbmJ1ZiArPSA2NDsKKyAgICB9CisgIGZvciAoOyBsZW5ndGggJiYgaGQtPmNvdW50IDwgNjQ7IGxlbmd0aC0tKQorICAgIGhkLT5idWZbaGQtPmNvdW50KytdID0gKmluYnVmKys7Cit9CisKKworLyogRmluYWxpemUgYW4gb3BlcmF0aW9uIGFuZCByZXR1cm4gdGhlIGRpZ2VzdC4gIElmIFJfRExFTiBpcyBub3QgTlVMTAorICAgdGhlIGxlbmd0aCBvZiB0aGUgZGlnZXN0IHdpbGwgYmUgc3RvcmVkIGF0IHRoYXQgYWRkcmVzcy4gIFRoZQorICAgcmV0dXJuZWQgdmFsdWUgaXMgdmFsaWQgYXMgbG9uZyBhcyB0aGUgY29udGV4dCBleGlzdHMuICBPbiBlcnJvcgorICAgTlVMTCBpcyByZXR1cm5lZC4gKi8KK2NvbnN0IHZvaWQgKgorX2djcnlfaG1hYzI1Nl9maW5hbGl6ZSAoaG1hYzI1Nl9jb250ZXh0X3QgaGQsIHNpemVfdCAqcl9kbGVuKQoreworICBmaW5hbGl6ZSAoaGQpOworICBpZiAoaGQtPnVzZV9obWFjKQorICAgIHsKKyAgICAgIGhtYWMyNTZfY29udGV4dF90IHRtcGhkOworICAgICAgCisgICAgICB0bXBoZCA9IF9nY3J5X2htYWMyNTZfbmV3IChOVUxMLCAwKTsKKyAgICAgIGlmICghdG1waGQpCisgICAgICAgIHsKKyAgICAgICAgICBmcmVlIChoZCk7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgIF9nY3J5X2htYWMyNTZfdXBkYXRlICh0bXBoZCwgaGQtPm9wYWQsIDY0KTsKKyAgICAgIF9nY3J5X2htYWMyNTZfdXBkYXRlICh0bXBoZCwgaGQtPmJ1ZiwgMzIpOworICAgICAgZmluYWxpemUgKHRtcGhkKTsKKyAgICAgIG1lbWNweSAoaGQtPmJ1ZiwgdG1waGQtPmJ1ZiwgMzIpOworICAgICAgX2djcnlfaG1hYzI1Nl9yZWxlYXNlICh0bXBoZCk7CisgICAgfQorICBpZiAocl9kbGVuKQorICAgICpyX2RsZW4gPSAzMjsKKyAgcmV0dXJuICh2b2lkKiloZC0+YnVmOworfQorCisKKy8qIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGNvbXB1dGUgdGhlIEhNQUMtU0hBMjU2IG9mIG9uZSBmaWxlLiAgVGhlCisgICB1c2VyIG5lZWRzIHRvIHByb3ZpZGUgYSBidWZmZXIgUkVTVUxUIG9mIGF0IGxlYXN0IDMyIGJ5dGVzLCBoZQorICAgbmVlZHMgdG8gcHV0IHRoZSBzaXplIG9mIHRoZSBidWZmZXIgaW50byBSRVNVTFRTSVpFIGFuZCB0aGUKKyAgIEZJTEVOQU1FLiAgS0VZIGFuZCBLRVlMRU4gYXJlIGFzIGRlc2NyaWJlZCBmb3IgX2djcnlfaG1hYzI1Nl9uZXcuCisgICBPbiBzdWNjZXNzIHRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSB2YWxpZCBsZW5ndGggb2YgdGhlIHJlc3VsdAorICAgYnVmZmVyICh3aGljaCB3aWxsIGJlIDMyKSBvciAtMSBvbiBlcnJvci4gIE9uIGVycm9yIEVSUk5PIGlzIHNldAorICAgYXBwcm9wcmlhdGUuICAqLyAKK2ludAorX2djcnlfaG1hYzI1Nl9maWxlICh2b2lkICpyZXN1bHQsIHNpemVfdCByZXN1bHRzaXplLCBjb25zdCBjaGFyICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqa2V5LCBzaXplX3Qga2V5bGVuKQoreworICBGSUxFICpmcDsKKyAgaG1hYzI1Nl9jb250ZXh0X3QgaGQ7CisgIHNpemVfdCBidWZmZXJfc2l6ZSwgbnJlYWQsIGRpZ2VzdGxlbjsKKyAgY2hhciAqYnVmZmVyOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpkaWdlc3Q7CisgIAorICBmcCA9IGZvcGVuIChmaWxlbmFtZSwgInJiIik7CisgIGlmICghZnApCisgICAgcmV0dXJuIC0xOworCisgIGhkID0gX2djcnlfaG1hYzI1Nl9uZXcgKGtleSwga2V5bGVuKTsKKyAgaWYgKCFoZCkKKyAgICB7CisgICAgICBmY2xvc2UgKGZwKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgYnVmZmVyX3NpemUgPSAzMjc2ODsKKyAgYnVmZmVyID0gbWFsbG9jIChidWZmZXJfc2l6ZSk7CisgIGlmICghYnVmZmVyKQorICAgIHsKKyAgICAgIGZjbG9zZSAoZnApOworICAgICAgX2djcnlfaG1hYzI1Nl9yZWxlYXNlIChoZCk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIHdoaWxlICggKG5yZWFkID0gZnJlYWQgKGJ1ZmZlciwgMSwgYnVmZmVyX3NpemUsIGZwKSkpCisgICAgX2djcnlfaG1hYzI1Nl91cGRhdGUgKGhkLCBidWZmZXIsIG5yZWFkKTsKKworICBmcmVlIChidWZmZXIpOworCisgIGlmIChmZXJyb3IgKGZwKSkKKyAgICB7CisgICAgICBmY2xvc2UgKGZwKTsKKyAgICAgIF9nY3J5X2htYWMyNTZfcmVsZWFzZSAoaGQpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBmY2xvc2UgKGZwKTsKKworICBkaWdlc3QgPSBfZ2NyeV9obWFjMjU2X2ZpbmFsaXplIChoZCwgJmRpZ2VzdGxlbik7CisgIGlmICghZGlnZXN0KQorICAgIHsKKyAgICAgIF9nY3J5X2htYWMyNTZfcmVsZWFzZSAoaGQpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgCisgIGlmIChkaWdlc3RsZW4gPiByZXN1bHRzaXplKQorICAgIHsKKyAgICAgIF9nY3J5X2htYWMyNTZfcmVsZWFzZSAoaGQpOworICAgICAgZXJybm8gPSBFSU5WQUw7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICBtZW1jcHkgKHJlc3VsdCwgZGlnZXN0LCBkaWdlc3RsZW4pOworICBfZ2NyeV9obWFjMjU2X3JlbGVhc2UgKGhkKTsKKworICByZXR1cm4gZGlnZXN0bGVuOworfQorCisKKworI2lmZGVmIFNUQU5EQUxPTkUKK3N0YXRpYyBpbnQKK3NlbGZ0ZXN0ICh2b2lkKQoreworICBzdGF0aWMgc3RydWN0IAorICB7CisgICAgY29uc3QgY2hhciAqIGNvbnN0IGRlc2M7CisgICAgY29uc3QgY2hhciAqIGNvbnN0IGRhdGE7CisgICAgY29uc3QgY2hhciAqIGNvbnN0IGtleTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGV4cGVjdFszMl07CisgIH0gdHZbXSA9CisgICAgeworICAgICAgeyAiZGF0YS0yOCBrZXktNCIsCisgICAgICAgICJ3aGF0IGRvIHlhIHdhbnQgZm9yIG5vdGhpbmc/IiwgCisgICAgICAgICJKZWZlIiwKKwl7IDB4NWIsIDB4ZGMsIDB4YzEsIDB4NDYsIDB4YmYsIDB4NjAsIDB4NzUsIDB4NGUsCisgICAgICAgICAgMHg2YSwgMHgwNCwgMHgyNCwgMHgyNiwgMHgwOCwgMHg5NSwgMHg3NSwgMHhjNywKKyAgICAgICAgICAweDVhLCAweDAwLCAweDNmLCAweDA4LCAweDlkLCAweDI3LCAweDM5LCAweDgzLAorICAgICAgICAgIDB4OWQsIDB4ZWMsIDB4NTgsIDB4YjksIDB4NjQsIDB4ZWMsIDB4MzgsIDB4NDMgfSB9LAorCisgICAgICB7ICJkYXRhLTkga2V5LTIwIiwKKyAgICAgICAgIkhpIFRoZXJlIiwKKwkiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYiIKKyAgICAgICAgIlx4MGJceDBiXHgwYlx4MGIiLAorICAgICAgICB7IDB4YjAsIDB4MzQsIDB4NGMsIDB4NjEsIDB4ZDgsIDB4ZGIsIDB4MzgsIDB4NTMsCisgICAgICAgICAgMHg1YywgMHhhOCwgMHhhZiwgMHhjZSwgMHhhZiwgMHgwYiwgMHhmMSwgMHgyYiwKKyAgICAgICAgICAweDg4LCAweDFkLCAweGMyLCAweDAwLCAweGM5LCAweDgzLCAweDNkLCAweGE3LAorICAgICAgICAgIDB4MjYsIDB4ZTksIDB4MzcsIDB4NmMsIDB4MmUsIDB4MzIsIDB4Y2YsIDB4ZjcgfSB9LAorCisgICAgICB7ICJkYXRhLTUwIGtleS0yMCIsCisgICAgICAgICJceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkIgorICAgICAgICAiXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZCIKKyAgICAgICAgIlx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGQiCisgICAgICAgICJceGRkXHhkZCIsCisJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisgICAgICAgICJceGFhXHhhYVx4YWFceGFhIiwKKyAgICAgICAgeyAweDc3LCAweDNlLCAweGE5LCAweDFlLCAweDM2LCAweDgwLCAweDBlLCAweDQ2LAorICAgICAgICAgIDB4ODUsIDB4NGQsIDB4YjgsIDB4ZWIsIDB4ZDAsIDB4OTEsIDB4ODEsIDB4YTcsCisgICAgICAgICAgMHgyOSwgMHg1OSwgMHgwOSwgMHg4YiwgMHgzZSwgMHhmOCwgMHhjMSwgMHgyMiwKKyAgICAgICAgICAweGQ5LCAweDYzLCAweDU1LCAweDE0LCAweGNlLCAweGQ1LCAweDY1LCAweGZlIH0gfSwKKworICAgICAgeyAiZGF0YS01MCBrZXktMjYiLAorICAgICAgICAiXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZCIKKyAgICAgICAgIlx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2QiCisgICAgICAgICJceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkIgorICAgICAgICAiXHhjZFx4Y2QiLAorCSJceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3XHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGZceDEwIgorICAgICAgICAiXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxN1x4MThceDE5IiwKKwl7IDB4ODIsIDB4NTUsIDB4OGEsIDB4MzgsIDB4OWEsIDB4NDQsIDB4M2MsIDB4MGUsCisgICAgICAgICAgMHhhNCwgMHhjYywgMHg4MSwgMHg5OCwgMHg5OSwgMHhmMiwgMHgwOCwgMHgzYSwKKyAgICAgICAgICAweDg1LCAweGYwLCAweGZhLCAweGEzLCAweGU1LCAweDc4LCAweGY4LCAweDA3LAorICAgICAgICAgIDB4N2EsIDB4MmUsIDB4M2YsIDB4ZjQsIDB4NjcsIDB4MjksIDB4NjYsIDB4NWIgfSB9LAorCisgICAgICB7ICJkYXRhLTU0IGtleS0xMzEiLAorICAgICAgICAiVGVzdCBVc2luZyBMYXJnZXIgVGhhbiBCbG9jay1TaXplIEtleSAtIEhhc2ggS2V5IEZpcnN0IiwKKwkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKyAgICAgICAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisgICAgICAgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorICAgICAgICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKyAgICAgICAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisgICAgICAgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorICAgICAgICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKyAgICAgICAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisgICAgICAgICJceGFhXHhhYVx4YWEiLAorCXsgMHg2MCwgMHhlNCwgMHgzMSwgMHg1OSwgMHgxZSwgMHhlMCwgMHhiNiwgMHg3ZiwKKyAgICAgICAgICAweDBkLCAweDhhLCAweDI2LCAweGFhLCAweGNiLCAweGY1LCAweGI3LCAweDdmLAorICAgICAgICAgIDB4OGUsIDB4MGIsIDB4YzYsIDB4MjEsIDB4MzcsIDB4MjgsIDB4YzUsIDB4MTQsCisgICAgICAgICAgMHgwNSwgMHg0NiwgMHgwNCwgMHgwZiwgMHgwZSwgMHhlMywgMHg3ZiwgMHg1NCB9IH0sCisKKyAgICAgIHsgImRhdGEtMTUyIGtleS0xMzEiLAorICAgICAgICAiVGhpcyBpcyBhIHRlc3QgdXNpbmcgYSBsYXJnZXIgdGhhbiBibG9jay1zaXplIGtleSBhbmQgYSBsYXJnZXIgIgorICAgICAgICAidGhhbiBibG9jay1zaXplIGRhdGEuIFRoZSBrZXkgbmVlZHMgdG8gYmUgaGFzaGVkIGJlZm9yZSBiZWluZyAiCisgICAgICAgICJ1c2VkIGJ5IHRoZSBITUFDIGFsZ29yaXRobS4iLAorCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorICAgICAgICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKyAgICAgICAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisgICAgICAgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorICAgICAgICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKyAgICAgICAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisgICAgICAgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorICAgICAgICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKyAgICAgICAgIlx4YWFceGFhXHhhYSIsCisJeyAweDliLCAweDA5LCAweGZmLCAweGE3LCAweDFiLCAweDk0LCAweDJmLCAweGNiLAorICAgICAgICAgIDB4MjcsIDB4NjMsIDB4NWYsIDB4YmMsIDB4ZDUsIDB4YjAsIDB4ZTksIDB4NDQsCisgICAgICAgICAgMHhiZiwgMHhkYywgMHg2MywgMHg2NCwgMHg0ZiwgMHgwNywgMHgxMywgMHg5MywKKyAgICAgICAgICAweDhhLCAweDdmLCAweDUxLCAweDUzLCAweDVjLCAweDNhLCAweDM1LCAweGUyIH0gfSwKKworICAgICAgeyBOVUxMIH0KKyAgICB9OworICBpbnQgdHZpZHg7CisgIAorICBmb3IgKHR2aWR4PTA7IHR2W3R2aWR4XS5kZXNjOyB0dmlkeCsrKQorICAgIHsKKyAgICAgIGhtYWMyNTZfY29udGV4dF90IGhtYWNoZDsKKyAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRpZ2VzdDsKKyAgICAgIHNpemVfdCBkbGVuOworCisgICAgICBobWFjaGQgPSBfZ2NyeV9obWFjMjU2X25ldyAodHZbdHZpZHhdLmtleSwgc3RybGVuICh0dlt0dmlkeF0ua2V5KSk7CisgICAgICBpZiAoIWhtYWNoZCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgX2djcnlfaG1hYzI1Nl91cGRhdGUgKGhtYWNoZCwgdHZbdHZpZHhdLmRhdGEsIHN0cmxlbiAodHZbdHZpZHhdLmRhdGEpKTsKKyAgICAgIGRpZ2VzdCA9IF9nY3J5X2htYWMyNTZfZmluYWxpemUgKGhtYWNoZCwgJmRsZW4pOworICAgICAgaWYgKCFkaWdlc3QpCisgICAgICAgIHsKKyAgICAgICAgICBfZ2NyeV9obWFjMjU2X3JlbGVhc2UgKGhtYWNoZCk7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICBpZiAoZGxlbiAhPSBzaXplb2YgKHR2W3R2aWR4XS5leHBlY3QpCisgICAgICAgICAgfHwgbWVtY21wIChkaWdlc3QsIHR2W3R2aWR4XS5leHBlY3QsIHNpemVvZiAodHZbdHZpZHhdLmV4cGVjdCkpKQorICAgICAgICB7CisgICAgICAgICAgX2djcnlfaG1hYzI1Nl9yZWxlYXNlIChobWFjaGQpOworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgX2djcnlfaG1hYzI1Nl9yZWxlYXNlIChobWFjaGQpOworICAgIH0KKyAgCisgIHJldHVybiAwOyAvKiBTdWNjZWVkZWQuICovCit9CisKKworaW50IAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBjb25zdCBjaGFyICpwZ207CisgIGludCBsYXN0X2FyZ2MgPSAtMTsKKyAgY29uc3QgY2hhciAqa2V5OworICBzaXplX3Qga2V5bGVuOworICBGSUxFICpmcDsKKyAgaG1hYzI1Nl9jb250ZXh0X3QgaGQ7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRpZ2VzdDsKKyAgY2hhciBidWZmZXJbNDA5Nl07CisgIHNpemVfdCBuLCBkbGVuLCBpZHg7CisgIGludCB1c2Vfc3RkaW4gPSAwOworICBpbnQgdXNlX2JpbmFyeSA9IDA7CisKKyAgYXNzZXJ0IChzaXplb2YgKHUzMikgPT0gNCk7CisjaWZkZWYgX19XSU4zMgorICBzZXRtb2RlIChmaWxlbm8gKHN0ZGluKSwgT19CSU5BUlkpOworI2VuZGlmCisKKyAgaWYgKGFyZ2MpCisgICAgeworICAgICAgcGdtID0gc3RycmNociAoKmFyZ3YsICcvJyk7CisgICAgICBpZiAocGdtKQorICAgICAgICBwZ20rKzsKKyAgICAgIGVsc2UKKyAgICAgICAgcGdtID0gKmFyZ3Y7CisgICAgICBhcmdjLS07IGFyZ3YrKzsKKyAgICB9CisgIGVsc2UKKyAgICBwZ20gPSAiPyI7CisKKyAgd2hpbGUgKGFyZ2MgJiYgbGFzdF9hcmdjICE9IGFyZ2MgKQorICAgIHsKKyAgICAgIGxhc3RfYXJnYyA9IGFyZ2M7CisgICAgICBpZiAoIXN0cmNtcCAoKmFyZ3YsICItLSIpKQorICAgICAgICB7CisgICAgICAgICAgYXJnYy0tOyBhcmd2Kys7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKCphcmd2LCAiLS12ZXJzaW9uIikpCisgICAgICAgIHsKKyAgICAgICAgICBmcHV0cyAoImhtYWMyNTYgKExpYmdjcnlwdCkgIiBWRVJTSU9OICJcbiIKKyAgICAgICAgICAgICAgICAgIkNvcHlyaWdodCAoQykgMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy5cbiIKKyAgICAgICAgICAgICAgICAgIkxpY2Vuc2UgTEdQTHYyLjErOiBHTlUgTEdQTCB2ZXJzaW9uIDIuMSBvciBsYXRlciAiCisgICAgICAgICAgICAgICAgICI8aHR0cDovL2dudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLmh0bWw+XG4iCisgICAgICAgICAgICAgICAgICJUaGlzIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBhcmUgZnJlZSB0byBjaGFuZ2UgYW5kICIKKyAgICAgICAgICAgICAgICAgInJlZGlzdHJpYnV0ZSBpdC5cbiIKKyAgICAgICAgICAgICAgICAgIlRoZXJlIGlzIE5PIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXcuXG4iLAorICAgICAgICAgICAgICAgICBzdGRvdXQpOworICAgICAgICAgIGV4aXQgKDApOworICAgICAgICB9CisgICAgICBlbHNlIGlmICghc3RyY21wICgqYXJndiwgIi0tYmluYXJ5IikpCisgICAgICAgIHsKKyAgICAgICAgICBhcmdjLS07IGFyZ3YrKzsKKyAgICAgICAgICB1c2VfYmluYXJ5ID0gMTsKKyAgICAgICAgfQorICAgIH0gICAgICAgICAgCisKKyAgaWYgKGFyZ2MgPCAxKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgInVzYWdlOiAlcyBbLS1iaW5hcnldIGtleSBbZmlsZW5hbWVdXG4iLCBwZ20pOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisjaWZkZWYgX19XSU4zMgorICBpZiAodXNlX2JpbmFyeSkKKyAgICBzZXRtb2RlIChmaWxlbm8gKHN0ZG91dCksIE9fQklOQVJZKTsKKyNlbmRpZgorCisgIGtleSA9ICphcmd2OworICBhcmdjLS0sIGFyZ3YrKzsKKyAga2V5bGVuID0gc3RybGVuIChrZXkpOworICB1c2Vfc3RkaW4gPSAhYXJnYzsKKworICBpZiAoc2VsZnRlc3QgKCkpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IGZhdGFsIGVycm9yOiBzZWxmLXRlc3QgZmFpbGVkXG4iLCBwZ20pOworICAgICAgZXhpdCAoMik7CisgICAgfQorCisgIGZvciAoOyBhcmdjIHx8IHVzZV9zdGRpbjsgYXJndisrLCBhcmdjLS0pCisgICAgeworICAgICAgY29uc3QgY2hhciAqZm5hbWUgPSB1c2Vfc3RkaW4/ICItIiA6ICphcmd2OworICAgICAgZnAgPSB1c2Vfc3RkaW4/IHN0ZGluIDogZm9wZW4gKGZuYW1lLCAicmIiKTsKKyAgICAgIGlmICghZnApCisgICAgICAgIHsKKyAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogY2FuJ3Qgb3BlbiBgJXMnOiAlc1xuIiwgCisgICAgICAgICAgICAgICAgICAgcGdtLCBmbmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgIH0KKyAgICAgIGhkID0gX2djcnlfaG1hYzI1Nl9uZXcgKGtleSwga2V5bGVuKTsKKyAgICAgIGlmICghaGQpCisgICAgICAgIHsKKyAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogY2FuJ3QgYWxsb2NhdGUgY29udGV4dDogJXNcbiIsIAorICAgICAgICAgICAgICAgICAgIHBnbSwgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgIH0KKyAgICAgIHdoaWxlICggKG4gPSBmcmVhZCAoYnVmZmVyLCAxLCBzaXplb2YgYnVmZmVyLCBmcCkpKQorICAgICAgICBfZ2NyeV9obWFjMjU2X3VwZGF0ZSAoaGQsIGJ1ZmZlciwgbik7CisgICAgICBpZiAoZmVycm9yIChmcCkpCisgICAgICAgIHsKKyAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogZXJyb3IgcmVhZGluZyBgJXMnOiAlc1xuIiwgCisgICAgICAgICAgICAgICAgICAgcGdtLCBmbmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgIH0KKyAgICAgIGlmICghdXNlX3N0ZGluKQorICAgICAgICBmY2xvc2UgKGZwKTsKKworICAgICAgZGlnZXN0ID0gX2djcnlfaG1hYzI1Nl9maW5hbGl6ZSAoaGQsICZkbGVuKTsKKyAgICAgIGlmICghZGlnZXN0KQorICAgICAgICB7CisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IGVycm9yIGNvbXB1dGluZyBITUFDOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICBwZ20sIHN0cmVycm9yIChlcnJubykpOworICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICB9CisgICAgICBpZiAodXNlX2JpbmFyeSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChmd3JpdGUgKGRpZ2VzdCwgZGxlbiwgMSwgc3Rkb3V0KSAhPSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogZXJyb3Igd3JpdGluZyBvdXRwdXQ6ICVzXG4iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgcGdtLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGZvciAoaWR4PTA7IGlkeCA8IGRsZW47IGlkeCsrKQorICAgICAgICAgICAgcHJpbnRmICgiJTAyeCIsIGRpZ2VzdFtpZHhdKTsKKyAgICAgICAgICBfZ2NyeV9obWFjMjU2X3JlbGVhc2UgKGhkKTsKKyAgICAgICAgICBpZiAodXNlX3N0ZGluKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBwdXRjaGFyICgnXG4nKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgcHJpbnRmICgiICAlc1xuIiwgZm5hbWUpOworICAgICAgICB9CisgICAgfQorCisgIHJldHVybiAwOworfQorI2VuZGlmIC8qU1RBTkRBTE9ORSovCisKKworLyoKK0xvY2FsIFZhcmlhYmxlczoKK2NvbXBpbGUtY29tbWFuZDogImNjIC1XYWxsIC1nIC1JLi4gLURTVEFOREFMT05FIC1vIGhtYWMyNTYgaG1hYzI1Ni5jIgorRW5kOgorKi8KZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9zcmMvaG1hYzI1Ni5oIGIvbGliZ2NyeXB0LTEuNC42L3NyYy9obWFjMjU2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYyOGU3MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9zcmMvaG1hYzI1Ni5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qIGhtYWMyNTYuaCAtIERlY2xhcmF0aW9ucyBmb3IgX2djcnlfaG1hYzI1NgorICoJQ29weXJpZ2h0IChDKSAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIGdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIEhNQUMyNTZfSAorI2RlZmluZSBITUFDMjU2X0gKKworCitzdHJ1Y3QgaG1hYzI1Nl9jb250ZXh0OwordHlwZWRlZiBzdHJ1Y3QgaG1hYzI1Nl9jb250ZXh0ICpobWFjMjU2X2NvbnRleHRfdDsKKworaG1hYzI1Nl9jb250ZXh0X3QgX2djcnlfaG1hYzI1Nl9uZXcgKGNvbnN0IHZvaWQgKmtleSwgc2l6ZV90IGtleWxlbik7Cit2b2lkIF9nY3J5X2htYWMyNTZfdXBkYXRlIChobWFjMjU2X2NvbnRleHRfdCBoZCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgbGVuKTsKK2NvbnN0IHZvaWQgKl9nY3J5X2htYWMyNTZfZmluYWxpemUgKGhtYWMyNTZfY29udGV4dF90IGhkLCBzaXplX3QgKnJfZGxlbik7Cit2b2lkIF9nY3J5X2htYWMyNTZfcmVsZWFzZSAoaG1hYzI1Nl9jb250ZXh0X3QgaGQpOworCitpbnQgX2djcnlfaG1hYzI1Nl9maWxlICh2b2lkICpyZXN1bHQsIHNpemVfdCByZXN1bHRzaXplLCBjb25zdCBjaGFyICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmtleSwgc2l6ZV90IGtleWxlbik7CisKKworI2VuZGlmIC8qSE1BQzI1Nl9IKi8KZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9zcmMvaHdmZWF0dXJlcy5jIGIvbGliZ2NyeXB0LTEuNC42L3NyYy9od2ZlYXR1cmVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc0NDJkYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9zcmMvaHdmZWF0dXJlcy5jCkBAIC0wLDAgKzEsMTY3IEBACisvKiBod2ZlYXR1cmVzLmMgLSBEZXRlY3QgaGFyZHdhcmUgZmVhdHVyZXMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgImcxMGxpYi5oIgorCisvKiBBIGJpdCB2ZWN0b3IgZGVzY3JpYmluZyB0aGUgaGFyZHdhcmUgZmVhdHVyZXMgY3VycmVudGx5CisgICBhdmFpbGFibGUuICovCitzdGF0aWMgdW5zaWduZWQgaW50IGh3X2ZlYXR1cmVzOworCisKKy8qIFJldHVybiBhIGJpdCB2ZWN0b3IgZGVzY3JpYmluZyB0aGUgYXZhaWxhYmxlIGhhcmR3YXJlIGZlYXR1cmVzLgorICAgVGhlIEhXRl8gY29uc3RhbnRzIGFyZSB1c2VkIHRvIHRlc3QgZm9yIHRoZW0uICovCit1bnNpZ25lZCBpbnQKK19nY3J5X2dldF9od19mZWF0dXJlcyAodm9pZCkKK3sKKyAgcmV0dXJuIGh3X2ZlYXR1cmVzOworfQorCisKKyNpZiBkZWZpbmVkIChfX2kzODZfXykgJiYgU0laRU9GX1VOU0lHTkVEX0xPTkcgPT0gNCAmJiBkZWZpbmVkIChfX0dOVUNfXykKK3N0YXRpYyB2b2lkCitkZXRlY3RfaWEzMl9nbnVjICh2b2lkKQoreworI2lmZGVmIEVOQUJMRV9QQURMT0NLX1NVUFBPUlQgIAorICAvKiBUaGUgY29kZSBoZXJlIGlzIG9ubHkgdXNlZnVsIGZvciB0aGUgUGFkTG9jayBlbmdpbmUgdGh1cyB3ZSBkb24ndAorICAgICBidWlsZCBpdCBpZiB0aGF0IHN1cHBvcnQgaGFzIGJlZW4gZGlzYWJsZWQuICAqLworICBpbnQgaGFzX2NwdWlkID0gMDsKKyAgY2hhciB2ZW5kb3JfaWRbMTIrMV07CisgIAorICAvKiBEZXRlY3QgdGhlIENQVUlEIGZlYXR1cmUgYnkgdGVzdGluZyBzb21lIHVuZGVmaW5lZCBiZWhhdmlvdXIgKDE2CisgICAgIHZzIDMyIGJpdCBwdXNoZi9wb3BmKS4gKi8KKyAgYXNtIHZvbGF0aWxlCisgICAgKCJwdXNoZlxuXHQiICAgICAgICAgICAgICAgICAvKiBDb3B5IGZsYWdzIHRvIEVBWC4gICovCisgICAgICJwb3BsICUlZWF4XG5cdCIKKyAgICAgIm1vdmwgJSVlYXgsICUlZWN4XG5cdCIgICAgIC8qIFNhdmUgZmxhZ3MgaW50byBFQ1guICAqLworICAgICAieG9ybCAkMHgyMDAwMDAsICUlZWF4XG5cdCIgLyogVG9nZ2xlIElEIGJpdCBhbmQgY29weSBpdCB0byB0aGUgZmxhZ3MuICAqLworICAgICAicHVzaGwgJSVlYXhcblx0IiAgICAgICAgICAgIAorICAgICAicG9wZlxuXHQiICAgICAgICAgICAgICAgIAorICAgICAicHVzaGZcblx0IiAgICAgICAgICAgICAgICAgLyogQ29weSBjaGFuZ2VkIGZsYWdzIGFnYWluIHRvIEVBWC4gICovICAgIAorICAgICAicG9wbCAlJWVheFxuXHQiCisgICAgICJwdXNobCAlJWVjeFxuXHQiICAgICAgICAgICAvKiBSZXN0b3JlIGZsYWdzIGZyb20gRUNYLiAgKi8KKyAgICAgInBvcGZcblx0IgorICAgICAieG9ybCAlJWVheCwgJSVlY3hcblx0IiAgICAgLyogQ29tcGFyZSBmbGFncyBhZ2FpbnN0IHNhdmVkIGZsYWdzLiAgKi8KKyAgICAgImp6IC5Mbm9fY3B1aWQlPVxuXHQiICAgICAgIC8qIFRvZ2dsaW5nIGRpZCBub3Qgd29yaywgdGh1cyBubyBDUFVJRC4gICovCisgICAgICJtb3ZsICQxLCAlMFxuIiAgICAgICAgICAgICAvKiBXb3JrZWQuIHRydWUgLT4gSEFTX0NQVUlELiAgKi8KKyAgICAgIi5Mbm9fY3B1aWQlPTpcblx0IgorICAgICA6ICIrciIgKGhhc19jcHVpZCkKKyAgICAgOgorICAgICA6ICIlZWF4IiwgIiVlY3giLCAiY2MiCisgICAgICk7CisgIAorICBpZiAoIWhhc19jcHVpZCkKKyAgICByZXR1cm47ICAvKiBObyB3YXkuICAqLworICAgICAgICAgICAKKyAgYXNtIHZvbGF0aWxlCisgICAgKCJwdXNobCAlJWVieFxuXHQiICAgICAgICAgICAvKiBTYXZlIEdPVCByZWdpc3Rlci4gICovCisgICAgICJ4b3JsICAlJWVheCwgJSVlYXhcblx0IiAgICAvKiAwIC0+IEVBWC4gICovCisgICAgICJjcHVpZFxuXHQiICAgICAgICAgICAgICAgICAvKiBHZXQgdmVuZG9yIElELiAgKi8KKyAgICAgIm1vdmwgICUlZWJ4LCAoJTApXG5cdCIgICAgIC8qIEVCWCxFRFgsRUNYIC0+IFZFTkRPUl9JRC4gICovCisgICAgICJtb3ZsICAlJWVkeCwgNCglMClcblx0IgorICAgICAibW92bCAgJSVlY3gsIDgoJTApXG5cdCIKKyAgICAgInBvcGwgICUlZWJ4XG4iCisgICAgIDoKKyAgICAgOiAiUyIgKCZ2ZW5kb3JfaWRbMF0pCisgICAgIDogIiVlYXgiLCAiJWVjeCIsICIlZWR4IiwgImNjIgorICAgICApOworICB2ZW5kb3JfaWRbMTJdID0gMDsKKworICAvKiBDaGVjayB3aGV0aGVyIHRoaXMgaXMgYSBWSUEgQ1BVIGFuZCB3aGF0IFBhZExvY2sgZmVhdHVyZXMgd2UKKyAgICAgaGF2ZS4gICovCisgIGlmICghc3RyY21wICh2ZW5kb3JfaWQsICJDZW50YXVySGF1bHMiKSkKKyAgICB7CisgICAgICBhc20gdm9sYXRpbGUgCisgICAgICAgICgicHVzaGwgJSVlYnhcblx0IgkgICAgICAgIC8qIFNhdmUgR09UIHJlZ2lzdGVyLiAgKi8KKyAgICAgICAgICJtb3ZsICQweEMwMDAwMDAwLCAlJWVheFxuXHQiICAvKiBDaGVjayBmb3IgZXh0ZW5kZWQgY2VudGF1ciAgKi8KKyAgICAgICAgICJjcHVpZFxuXHQiICAgICAgICAgICAgICAgICAgICAvKiBmZWF0dXJlIGZsYWdzLiAgICAgICAgICAgICAgKi8KKyAgICAgICAgICJwb3BsICUlZWJ4XG5cdCIJICAgICAgICAvKiBSZXN0b3JlIEdPVCByZWdpc3Rlci4gKi8KKyAgICAgICAgICJjbXBsICQweEMwMDAwMDAxLCAlJWVheFxuXHQiCisgICAgICAgICAiamIgLkxyZWFkeSU9XG5cdCIgICAgICAgICAgICAgLyogRUFYIDwgMHhDMDAwMDAwMCA9PiBubyBwYWRsb2NrLiAgKi8KKworICAgICAgICAgInB1c2hsICUlZWJ4XG5cdCIJICAgICAgICAvKiBTYXZlIEdPVCByZWdpc3Rlci4gKi8KKyAgICAgICAgICJtb3ZsICQweEMwMDAwMDAxLCAlJWVheFxuXHQiICAvKiBBc2sgZm9yIHRoZSBleHRlbmRlZCAqLworICAgICAgICAgImNwdWlkXG5cdCIgICAgICAgICAgICAgICAgICAgIC8qIGZlYXR1cmUgZmxhZ3MuICAgICAgICovCisgICAgICAgICAicG9wbCAlJWVieFxuXHQiCSAgICAgICAgLyogUmVzdG9yZSBHT1QgcmVnaXN0ZXIuICovCisKKyAgICAgICAgICJtb3ZsICUlZWR4LCAlJWVheFxuXHQiICAgICAgICAvKiBUYWtlIGNvcHkgb2YgZmVhdHVyZSBmbGFncy4gICovCisgICAgICAgICAiYW5kbCAkMHgwQywgJSVlYXhcblx0IiAgICAgICAgLyogVGVzdCBiaXRzIDIgYW5kIDMgdG8gc2VlIHdoZXRoZXIgKi8KKyAgICAgICAgICJjbXBsICQweDBDLCAlJWVheFxuXHQiICAgICAgICAvKiB0aGUgUk5HIGV4aXN0cyBhbmQgaXMgZW5hYmxlZC4gICAqLworICAgICAgICAgImpueiAuTG5vX3JuZyU9XG5cdCIKKyAgICAgICAgICJvcmwgJDEsICUwXG4iICAgICAgICAgICAgICAgICAvKiBTZXQgb3VyIEhXRl9QQURMT0NLX1JORyBiaXQuICAqLworCisgICAgICAgICAiLkxub19ybmclPTpcblx0IgorICAgICAgICAgIm1vdmwgJSVlZHgsICUlZWF4XG5cdCIgICAgICAgIC8qIFRha2UgY29weSBvZiBmZWF0dXJlIGZsYWdzLiAgKi8KKyAgICAgICAgICJhbmRsICQweEMwLCAlJWVheFxuXHQiICAgICAgICAvKiBUZXN0IGJpdHMgNiBhbmQgNyB0byBzZWUgd2hldGhlciAqLworICAgICAgICAgImNtcGwgJDB4QzAsICUlZWF4XG5cdCIgICAgICAgIC8qIHRoZSBBQ0UgZXhpc3RzIGFuZCBpcyBlbmFibGVkLiAgICovCisgICAgICAgICAiam56IC5Mbm9fYWNlJT1cblx0IgorICAgICAgICAgIm9ybCAkMiwgJTBcbiIgICAgICAgICAgICAgICAgIC8qIFNldCBvdXIgSFdGX1BBRExPQ0tfQUVTIGJpdC4gICovCisKKyAgICAgICAgICIuTG5vX2FjZSU9OlxuXHQiCisgICAgICAgICAibW92bCAlJWVkeCwgJSVlYXhcblx0IiAgICAgICAgLyogVGFrZSBjb3B5IG9mIGZlYXR1cmUgZmxhZ3MuICAqLworICAgICAgICAgImFuZGwgJDB4QzAwLCAlJWVheFxuXHQiICAgICAgIC8qIFRlc3QgYml0cyAxMCwgMTEgdG8gc2VlIHdoZXRoZXIgICovCisgICAgICAgICAiY21wbCAkMHhDMDAsICUlZWF4XG5cdCIgICAgICAgLyogdGhlIFBIRSBleGlzdHMgYW5kIGlzIGVuYWJsZWQuICAgKi8KKyAgICAgICAgICJqbnogLkxub19waGUlPVxuXHQiCisgICAgICAgICAib3JsICQ0LCAlMFxuIiAgICAgICAgICAgICAgICAgLyogU2V0IG91ciBIV0ZfUEFETE9DS19TSEEgYml0LiAgKi8KKworICAgICAgICAgIi5Mbm9fcGhlJT06XG5cdCIKKyAgICAgICAgICJtb3ZsICUlZWR4LCAlJWVheFxuXHQiICAgICAgICAvKiBUYWtlIGNvcHkgb2YgZmVhdHVyZSBmbGFncy4gICovCisgICAgICAgICAiYW5kbCAkMHgzMDAwLCAlJWVheFxuXHQiICAgICAgLyogVGVzdCBiaXRzIDEyLCAxMyB0byBzZWUgd2hldGhlciAgKi8KKyAgICAgICAgICJjbXBsICQweDMwMDAsICUlZWF4XG5cdCIgICAgICAvKiBNT05UTVVMIGV4aXN0cyBhbmQgaXMgZW5hYmxlZC4gICAqLworICAgICAgICAgImpueiAuTHJlYWR5JT1cblx0IgorICAgICAgICAgIm9ybCAkOCwgJTBcbiIgICAgICAgICAgICAgICAgIC8qIFNldCBvdXIgSFdGX1BBRExPQ0tfTU1VTCBiaXQuICAqLworCisgICAgICAgICAiLkxyZWFkeSU9OlxuIgorICAgICAgICAgOiAiK3IiIChod19mZWF0dXJlcykKKyAgICAgICAgIDoKKyAgICAgICAgIDogIiVlYXgiLCAiJWVkeCIsICJjYyIKKyAgICAgICAgICk7CisgICAgfQorI2VuZGlmIC8qRU5BQkxFX1BBRExPQ0tfU1VQUE9SVCovCit9CisjZW5kaWYgLyogX19pMzg2X18gJiYgU0laRU9GX1VOU0lHTkVEX0xPTkcgPT0gNCAmJiBfX0dOVUNfXyAqLworCisKKworLyogRGV0ZWN0IHRoZSBhdmFpbGFibGUgaGFyZHdhcmUgZmVhdHVyZXMuICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZAorICAgb25jZSByaWdodCBhdCBzdGFydHVwIGFuZCB3ZSBhc3N1bWUgdGhhdCBubyBvdGhlciB0aHJlYWRzIGFyZQorICAgcnVubmluZy4gICovCit2b2lkCitfZ2NyeV9kZXRlY3RfaHdfZmVhdHVyZXMgKHZvaWQpCit7CisgIGh3X2ZlYXR1cmVzID0gMDsKKworICBpZiAoZmlwc19tb2RlICgpKQorICAgIHJldHVybjsgLyogSGFyZHdhcmUgc3VwcG9ydCBpcyBub3QgdG8gYmUgZXZhbHVhdGVkLiAgKi8gCisKKyNpZiBkZWZpbmVkIChfX2kzODZfXykgJiYgU0laRU9GX1VOU0lHTkVEX0xPTkcgPT0gNAorI2lmZGVmIF9fR05VQ19fICAKKyAgZGV0ZWN0X2lhMzJfZ251YyAoKTsKKyNlbmRpZgorI2VsaWYgZGVmaW5lZCAoX19pMzg2X18pICYmIFNJWkVPRl9VTlNJR05FRF9MT05HID09IDgKKyNpZmRlZiBfX0dOVUNfXyAgCisjZW5kaWYKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L3NyYy9saWJnY3J5cHQtY29uZmlnLmluIGIvbGliZ2NyeXB0LTEuNC42L3NyYy9saWJnY3J5cHQtY29uZmlnLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNmRmOGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvc3JjL2xpYmdjcnlwdC1jb25maWcuaW4KQEAgLTAsMCArMSwxNzcgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDIsIDIwMDMsIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRoZSBhdXRob3IgZ2l2ZXMKKyMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorIworIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjIFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQgZXZlbiB0aGUKKyMgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisjCisjIEZpbGU6IEBjb25maWd1cmVfaW5wdXRACisKKyMgR2VuZXJhbC4KK3ByZWZpeD0iQHByZWZpeEAiCitleGVjX3ByZWZpeD0iQGV4ZWNfcHJlZml4QCIKK3ZlcnNpb249IkBWRVJTSU9OQCIKK2luY2x1ZGVkaXI9IkBpbmNsdWRlZGlyQCIKK2xpYmRpcj0iQGxpYmRpckAiCitncGdfZXJyb3JfbGlicz0iQEdQR19FUlJPUl9MSUJTQCIKK2dwZ19lcnJvcl9jZmxhZ3M9IkBHUEdfRVJST1JfQ0ZMQUdTQCIKKworIyBsaWJnY3J5cHQgdmFsdWVzLgorbGlicz0iQExJQkdDUllQVF9DT05GSUdfTElCU0AiCitjZmxhZ3M9IkBMSUJHQ1JZUFRfQ09ORklHX0NGTEFHU0AiCisKKyMgQVBJIGluZm8KK2FwaV92ZXJzaW9uPSJATElCR0NSWVBUX0NPTkZJR19BUElfVkVSU0lPTkAiCisKKyMgTWlzYyBpbmZvcm1hdGlvbi4KK3N5bW1ldHJpY19jaXBoZXJzPSJATElCR0NSWVBUX0NJUEhFUlNAIgorYXN5bW1ldHJpY19jaXBoZXJzPSJATElCR0NSWVBUX1BVQktFWV9DSVBIRVJTQCIKK2RpZ2VzdHM9IkBMSUJHQ1JZUFRfRElHRVNUU0AiCisKKyMgU3RhdGUgdmFyaWFibGVzLgorZWNob19saWJzPW5vCitlY2hvX2NmbGFncz1ubworZWNob19wcmVmaXg9bm8KK2VjaG9fYWxnb3JpdGhtcz1ubworZWNob19leGVjX3ByZWZpeD1ubworZWNob192ZXJzaW9uPW5vCitlY2hvX2FwaV92ZXJzaW9uPW5vCisKKyMgUHJpbnRzIHVzYWdlIGluZm9ybWF0aW9uLgordXNhZ2UoKQoreworICAgIGNhdCA8PEVPRgorVXNhZ2U6ICQwIFtPUFRJT05TXQorT3B0aW9uczoKKwlbLS1wcmVmaXhdCisJWy0tZXhlYy1wcmVmaXhdCisJWy0tdmVyc2lvbl0KKyAgICAgICAgWy0tYXBpLXZlcnNpb25dCisJWy0tbGlic10KKwlbLS1jZmxhZ3NdCisJWy0tYWxnb3JpdGhtc10KK0VPRgorICAgIGV4aXQgJDEKK30KKworaWYgdGVzdCAkIyAtZXEgMDsgdGhlbgorICAgICMgTm90aGluZyB0byBkby4KKyAgICB1c2FnZSAxIDE+JjIKK2ZpCisKK3doaWxlIHRlc3QgJCMgLWd0IDA7IGRvCisgICAgY2FzZSAiJDEiIGluCisJIyBTZXQgdXAgYG9wdGFyZycuCisJLS0qPSopCisJICAgIG9wdGFyZz1gZWNobyAiJDEiIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AKKwkgICAgOzsKKwkqKQorCSAgICBvcHRhcmc9IiIKKwkgICAgOzsKKyAgICBlc2FjCisKKyAgICBjYXNlICQxIGluCisJLS10aHJlYWQ9KikKKwkgICAgZWNobyAiJDA6IC0tdGhyZWFkIG9wdGlvbiBvYnNvbGV0ZTogdXNlIHRoZSB0aHJlYWQgY2FsbGJhY2sgaW50ZXJmYWNlIiAxPiYyCisJICAgIGV4aXQgMQorCSAgICA7OworICAgICAgICAtLXByZWZpeD0qKQorICAgICAgICAgICAgIyBGb3IgY29tcGF0aWJpbGl0eSByZWFzb25zIHdpdGggb2xkIE00IG1hY3Jvcywgd2UgaWdub3JlCisgICAgICAgICAgICAjIHNldHRpbmcgb2YgcHJlZml4LgorICAgICAgICAgICAgOzsKKwktLXByZWZpeCkKKwkgICAgZWNob19wcmVmaXg9eWVzCisJICAgIDs7CisgICAgICAgIC0tZXhlYy1wcmVmaXg9KikKKyAgICAgICAgICAgIDs7CisJLS1leGVjLXByZWZpeCkKKwkgICAgZWNob19leGVjX3ByZWZpeD15ZXMKKwkgICAgOzsKKwktLXZlcnNpb24pCisJICAgIGVjaG9fdmVyc2lvbj15ZXMKKwkgICAgOzsKKyAgICAgICAgLS1hcGktdmVyc2lvbikKKyAgICAgICAgICAgIGVjaG9fYXBpX3ZlcnNpb249eWVzCisgICAgICAgICAgICA7OworCS0tY2ZsYWdzKQorCSAgICBlY2hvX2NmbGFncz15ZXMKKwkgICAgOzsKKwktLWxpYnMpCisJICAgIGVjaG9fbGlicz15ZXMKKwkgICAgOzsKKwktLWFsZ29yaXRobXMpCisJICAgIGVjaG9fYWxnb3JpdGhtcz15ZXMKKwkgICAgOzsKKwkqKQorCSAgICB1c2FnZSAxIDE+JjIKKwkgICAgOzsKKyAgICBlc2FjCisgICAgc2hpZnQKK2RvbmUKKworaWYgdGVzdCAiJGVjaG9fcHJlZml4IiA9ICJ5ZXMiOyB0aGVuCisgICAgZWNobyAiJHByZWZpeCIKK2ZpCisKK2lmIHRlc3QgIiRlY2hvX2V4ZWNfcHJlZml4IiA9ICJ5ZXMiOyB0aGVuCisgICAgZWNobyAiJGV4ZWNfcHJlZml4IgorZmkKKworaWYgdGVzdCAiJGVjaG9fY2ZsYWdzIiA9ICJ5ZXMiOyB0aGVuCisgICAgaW5jbHVkZXM9IiIKKyAgICBjZmxhZ3NfZmluYWw9IiRjZmxhZ3MiCisKKyAgICAjIFNldCB1cCBgaW5jbHVkZXMnLgorICAgIGlmIHRlc3QgIngkaW5jbHVkZWRpciIgIT0gIngvdXNyL2luY2x1ZGUiIC1hICJ4JGluY2x1ZGVkaXIiICE9ICJ4L2luY2x1ZGUiOyB0aGVuCisJaW5jbHVkZXM9Ii1JJGluY2x1ZGVkaXIiCisgICAgZmkKKyAgICAjIFNldCB1cCBgY2ZsYWdzX2ZpbmFsJy4KKyAgICBjZmxhZ3NfZmluYWw9IiRjZmxhZ3NfZmluYWwgJGdwZ19lcnJvcl9jZmxhZ3MiCisKKyAgICB0bXA9IiIKKyAgICBmb3IgaSBpbiAkaW5jbHVkZXMgJGNmbGFnc19maW5hbDsgZG8KKyAgICAgICBpZiBlY2hvICIkdG1wIiB8IGZncmVwIC12IC0tICIkaSIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICAgICB0bXA9IiR0bXAgJGkiCisgICAgICAgZmkKKyAgICBkb25lCisgICAgZWNobyAkdG1wCitmaQorCitpZiB0ZXN0ICIkZWNob19saWJzIiA9ICJ5ZXMiOyB0aGVuCisgICAgbGliZGlycz0iIgorICAgIGxpYnNfZmluYWw9IiRsaWJzIgorCisgICAgIyBTZXQgdXAgYGxpYmRpcnMnLgorICAgIGlmIHRlc3QgIngkbGliZGlyIiAhPSAieC91c3IvbGliIiAtYSAieCRsaWJkaXIiICE9ICJ4L2xpYiI7IHRoZW4KKwlsaWJkaXJzPSItTCRsaWJkaXIiCisgICAgZmkKKworICAgICMgU2V0IHVwIGBsaWJzX2ZpbmFsJy4KKyAgICBsaWJzX2ZpbmFsPSIkbGlic19maW5hbCAkZ3BnX2Vycm9yX2xpYnMiCisKKyAgICB0bXA9IiIKKyAgICBmb3IgaSBpbiAkbGliZGlycyAkbGlic19maW5hbDsgZG8KKyAgICAgICBpZiBlY2hvICIkdG1wIiB8IGZncmVwIC12IC0tICIkaSIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICAgICB0bXA9IiR0bXAgJGkiCisgICAgICAgZmkKKyAgICBkb25lCisgICAgZWNobyAkdG1wCitmaQorCitpZiB0ZXN0ICIkZWNob192ZXJzaW9uIiA9ICJ5ZXMiOyB0aGVuCisgICAgZWNobyAiJHZlcnNpb24iCitmaQorCitpZiB0ZXN0ICIkZWNob19hcGlfdmVyc2lvbiIgPSAieWVzIjsgdGhlbgorICAgIGVjaG8gIiRhcGlfdmVyc2lvbiIKK2ZpCisKK2lmIHRlc3QgIiRlY2hvX2FsZ29yaXRobXMiID0gInllcyI7IHRoZW4KKyAgICBlY2hvICJTeW1tZXRyaWMgY2lwaGVyIGFsZ29yaXRobXM6ICRzeW1tZXRyaWNfY2lwaGVycyIKKyAgICBlY2hvICJQdWJsaWMta2V5IGNpcGhlciBhbGdvcml0aG1zOiAkYXN5bW1ldHJpY19jaXBoZXJzIgorICAgIGVjaG8gIk1lc3NhZ2UgZGlnZXN0IGFsZ29yaXRobXM6ICRkaWdlc3RzIgorZmkKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9zcmMvbGliZ2NyeXB0LmRlZiBiL2xpYmdjcnlwdC0xLjQuNi9zcmMvbGliZ2NyeXB0LmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmM0ZDMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L3NyYy9saWJnY3J5cHQuZGVmCkBAIC0wLDAgKzEsMjM3IEBACis7OyBsaWJnY3J5cHQuZGVmcyAtICBFeHBvcnRlZCBzeW1ib2xzIGZvciBXMzIKKzs7IENvcHlyaWdodCAoQykgMjAwMywgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKzs7IAorOzsgVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorOzsKKzs7IExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cis7OyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworOzsgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorOzsgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7OworOzsgTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7OyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOzsgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorOzsgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7OworOzsgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOzsgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOzsgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorOzsKKworOzsgTm90ZTogVGhpcyBmaWxlIHNob3VsZCBiZSB1cGRhdGVkIG1hbnVhbGx5IGFuZCB0aGUgb3JkaW5hbHMgc2hhbGwKKzs7IG5ldmVyIGJlIGNoYW5nZWQuICBBbHNvIGNoZWNrIGxpYmdjcnlwdC52ZXJzIGFuZCB2aXNpYmlsaXR5LmguCisKKworRVhQT1JUUworICAgICAgZ2NyeV9jaGVja192ZXJzaW9uICBAMQorICAgICAgZ2NyeV9jb250cm9sICBAMgorICAgICAgCisgICAgICBnY3J5X21hbGxvYyAgQDMKKyAgICAgIGdjcnlfY2FsbG9jICBANAorICAgICAgZ2NyeV9tYWxsb2Nfc2VjdXJlICBANQorICAgICAgZ2NyeV9jYWxsb2Nfc2VjdXJlICBANgorICAgICAgZ2NyeV9yZWFsbG9jICBANworICAgICAgZ2NyeV9zdHJkdXAgIEA4CisgICAgICBnY3J5X3htYWxsb2MgIEA5CisgICAgICBnY3J5X3hjYWxsb2MgIEAxMAorICAgICAgZ2NyeV94bWFsbG9jX3NlY3VyZSAgQDExCisgICAgICBnY3J5X3hjYWxsb2Nfc2VjdXJlICBAMTIKKyAgICAgIGdjcnlfeHJlYWxsb2MgIEAxMworICAgICAgZ2NyeV94c3RyZHVwICBAMTQKKyAgICAgIGdjcnlfaXNfc2VjdXJlICBAMTUKKyAgICAgIGdjcnlfZnJlZSAgQDE2CisgICAgICAKKyAgICAgIGdjcnlfc2V0X3Byb2dyZXNzX2hhbmRsZXIgIEAxNworICAgICAgZ2NyeV9zZXRfYWxsb2NhdGlvbl9oYW5kbGVyICBAMTgKKyAgICAgIGdjcnlfc2V0X291dG9mY29yZV9oYW5kbGVyICBAMTkKKyAgICAgIGdjcnlfc2V0X2ZhdGFsZXJyb3JfaGFuZGxlciAgQDIwCisgICAgICBnY3J5X3NldF9sb2dfaGFuZGxlciAgQDIxCisgICAgICBnY3J5X3NldF9nZXR0ZXh0X2hhbmRsZXIgIEAyMgorICAgICAgCisgICAgICBnY3J5X3N0cmVycm9yICBAMjMKKyAgICAgIGdjcnlfc3Ryc291cmNlICBAMjQKKyAgICAgIGdjcnlfZXJyX2NvZGVfZnJvbV9lcnJubyAgQDI1CisgICAgICBnY3J5X2Vycl9jb2RlX3RvX2Vycm5vICBAMjYKKyAgICAgIGdjcnlfZXJyX21ha2VfZnJvbV9lcnJubyAgQDI3CisgICAgICBnY3J5X2Vycm9yX2Zyb21fZXJybm8gIEAyOAorICAgICAgCisgICAgICBnY3J5X3NleHBfbmV3ICBAMjkKKyAgICAgIGdjcnlfc2V4cF9jcmVhdGUgIEAzMAorICAgICAgZ2NyeV9zZXhwX3NzY2FuICBAMzEKKyAgICAgIGdjcnlfc2V4cF9idWlsZCAgQDMyCisgICAgICBnY3J5X3NleHBfYnVpbGRfYXJyYXkgIEAzMworICAgICAgZ2NyeV9zZXhwX3JlbGVhc2UgIEAzNAorICAgICAgZ2NyeV9zZXhwX2Nhbm9uX2xlbiAgQDM1CisgICAgICBnY3J5X3NleHBfc3ByaW50ICBAMzYKKyAgICAgIGdjcnlfc2V4cF9kdW1wICBAMzcKKyAgICAgIGdjcnlfc2V4cF9jb25zICBAMzgKKyAgICAgIGdjcnlfc2V4cF9hbGlzdCAgQDM5CisgICAgICBnY3J5X3NleHBfdmxpc3QgIEA0MAorICAgICAgZ2NyeV9zZXhwX2FwcGVuZCAgQDQxCisgICAgICBnY3J5X3NleHBfcHJlcGVuZCAgQDQyCisgICAgICBnY3J5X3NleHBfZmluZF90b2tlbiAgQDQzCisgICAgICBnY3J5X3NleHBfbGVuZ3RoICBANDQKKyAgICAgIGdjcnlfc2V4cF9udGggIEA0NQorICAgICAgZ2NyeV9zZXhwX2NhciAgQDQ2CisgICAgICBnY3J5X3NleHBfY2RyICBANDcKKyAgICAgIGdjcnlfc2V4cF9jYWRyICBANDgKKyAgICAgIGdjcnlfc2V4cF9udGhfZGF0YSAgQDQ5CisgICAgICBnY3J5X3NleHBfbnRoX21waSAgQDUwCisgICAgICAKKyAgICAgIGdjcnlfbXBpX25ldyAgQDUxCisgICAgICBnY3J5X21waV9zbmV3ICBANTIKKyAgICAgIGdjcnlfbXBpX3JlbGVhc2UgIEA1MworICAgICAgZ2NyeV9tcGlfY29weSAgQDU0CisgICAgICBnY3J5X21waV9zZXQgIEA1NQorICAgICAgZ2NyeV9tcGlfc2V0X3VpICBANTYKKyAgICAgIGdjcnlfbXBpX3N3YXAgIEA1NworICAgICAgZ2NyeV9tcGlfY21wICBANTgKKyAgICAgIGdjcnlfbXBpX2NtcF91aSAgQDU5CisgICAgICBnY3J5X21waV9zY2FuICBANjAKKyAgICAgIGdjcnlfbXBpX3ByaW50ICBANjEKKyAgICAgIGdjcnlfbXBpX2FwcmludCAgQDYyCisgICAgICBnY3J5X21waV9kdW1wICBANjMKKyAgICAgIGdjcnlfbXBpX2FkZCAgQDY0CisgICAgICBnY3J5X21waV9hZGRfdWkgIEA2NQorICAgICAgZ2NyeV9tcGlfYWRkbSAgQDY2CisgICAgICBnY3J5X21waV9zdWIgIEA2NworICAgICAgZ2NyeV9tcGlfc3ViX3VpICBANjgKKyAgICAgIGdjcnlfbXBpX3N1Ym0gIEA2OQorICAgICAgZ2NyeV9tcGlfbXVsICBANzAKKyAgICAgIGdjcnlfbXBpX211bF91aSAgQDcxCisgICAgICBnY3J5X21waV9tdWxtICBANzIKKyAgICAgIGdjcnlfbXBpX211bF8yZXhwICBANzMKKyAgICAgIGdjcnlfbXBpX2RpdiAgQDc0CisgICAgICBnY3J5X21waV9tb2QgIEA3NQorICAgICAgZ2NyeV9tcGlfcG93bSAgQDc2CisgICAgICBnY3J5X21waV9nY2QgIEA3NworICAgICAgZ2NyeV9tcGlfaW52bSAgQDc4CisgICAgICBnY3J5X21waV9nZXRfbmJpdHMgIEA3OQorICAgICAgZ2NyeV9tcGlfdGVzdF9iaXQgIEA4MAorICAgICAgZ2NyeV9tcGlfc2V0X2JpdCAgQDgxCisgICAgICBnY3J5X21waV9jbGVhcl9iaXQgIEA4MgorICAgICAgZ2NyeV9tcGlfc2V0X2hpZ2hiaXQgIEA4MworICAgICAgZ2NyeV9tcGlfY2xlYXJfaGlnaGJpdCAgQDg0CisgICAgICBnY3J5X21waV9yc2hpZnQgIEA4NQorICAgICAgZ2NyeV9tcGlfc2V0X29wYXF1ZSAgQDg2CisgICAgICBnY3J5X21waV9nZXRfb3BhcXVlICBAODcKKyAgICAgIGdjcnlfbXBpX3NldF9mbGFnICBAODgKKyAgICAgIGdjcnlfbXBpX2NsZWFyX2ZsYWcgIEA4OQorICAgICAgZ2NyeV9tcGlfZ2V0X2ZsYWcgIEA5MAorCisgICAgICAKKyAgICAgIGdjcnlfY2lwaGVyX29wZW4gIEA5MgorICAgICAgZ2NyeV9jaXBoZXJfY2xvc2UgIEA5MworICAgICAgZ2NyeV9jaXBoZXJfY3RsICBAOTQKKyAgICAgIGdjcnlfY2lwaGVyX2luZm8gIEA5NQorICAgICAgZ2NyeV9jaXBoZXJfYWxnb19pbmZvICBAOTYKKyAgICAgIGdjcnlfY2lwaGVyX2FsZ29fbmFtZSAgQDk3CisgICAgICBnY3J5X2NpcGhlcl9tYXBfbmFtZSAgQDk4CisgICAgICBnY3J5X2NpcGhlcl9tb2RlX2Zyb21fb2lkICBAOTkKKyAgICAgIGdjcnlfY2lwaGVyX2VuY3J5cHQgIEAxMDAKKyAgICAgIGdjcnlfY2lwaGVyX2RlY3J5cHQgIEAxMDEKKyAgICAgIGdjcnlfY2lwaGVyX2dldF9hbGdvX2tleWxlbiAgQDEwMgorICAgICAgZ2NyeV9jaXBoZXJfZ2V0X2FsZ29fYmxrbGVuICBAMTAzCisgICAgICBnY3J5X2NpcGhlcl9saXN0ICBAMTA0CisgICAgICAKKyAgICAgIGdjcnlfcGtfZW5jcnlwdCAgQDEwNQorICAgICAgZ2NyeV9wa19kZWNyeXB0ICBAMTA2CisgICAgICBnY3J5X3BrX3NpZ24gIEAxMDcKKyAgICAgIGdjcnlfcGtfdmVyaWZ5ICBAMTA4CisgICAgICBnY3J5X3BrX3Rlc3RrZXkgIEAxMDkKKyAgICAgIGdjcnlfcGtfZ2Vua2V5ICBAMTEwCisgICAgICBnY3J5X3BrX2N0bCAgQDExMQorICAgICAgZ2NyeV9wa19hbGdvX2luZm8gIEAxMTIKKyAgICAgIGdjcnlfcGtfYWxnb19uYW1lICBAMTEzCisgICAgICBnY3J5X3BrX21hcF9uYW1lICBAMTE0CisgICAgICBnY3J5X3BrX2dldF9uYml0cyAgQDExNQorICAgICAgZ2NyeV9wa19nZXRfa2V5Z3JpcCAgQDExNgorICAgICAgZ2NyeV9wa19saXN0ICBAMTE3CisgICAgICAKKyAgICAgIGdjcnlfYWNfZGF0YV9uZXcgIEAxMTgKKyAgICAgIGdjcnlfYWNfZGF0YV9kZXN0cm95ICBAMTE5CisgICAgICBnY3J5X2FjX2RhdGFfc2V0ICBAMTIwCisgICAgICBnY3J5X2FjX2RhdGFfY29weSAgQDEyMQorICAgICAgZ2NyeV9hY19kYXRhX2xlbmd0aCAgQDEyMgorICAgICAgZ2NyeV9hY19kYXRhX2dldF9uYW1lICBAMTIzCisgICAgICBnY3J5X2FjX2RhdGFfZ2V0X2luZGV4ICBAMTI0CisgICAgICBnY3J5X2FjX2RhdGFfY2xlYXIgIEAxMjUKKyAgICAgIGdjcnlfYWNfb3BlbiAgQDEyNgorICAgICAgZ2NyeV9hY19jbG9zZSAgQDEyNworICAgICAgZ2NyeV9hY19rZXlfaW5pdCAgQDEyOAorICAgICAgZ2NyeV9hY19rZXlfcGFpcl9nZW5lcmF0ZSAgQDEyOQorICAgICAgZ2NyeV9hY19rZXlfcGFpcl9leHRyYWN0ICBAMTMwCisgICAgICBnY3J5X2FjX2tleV9kYXRhX2dldCAgQDEzMQorICAgICAgZ2NyeV9hY19rZXlfdGVzdCAgQDEzMgorICAgICAgZ2NyeV9hY19rZXlfZ2V0X25iaXRzICBAMTMzCisgICAgICBnY3J5X2FjX2tleV9nZXRfZ3JpcCAgQDEzNAorICAgICAgZ2NyeV9hY19rZXlfZGVzdHJveSAgQDEzNQorICAgICAgZ2NyeV9hY19rZXlfcGFpcl9kZXN0cm95ICBAMTM2CisgICAgICBnY3J5X2FjX2RhdGFfZW5jcnlwdCAgQDEzNworICAgICAgZ2NyeV9hY19kYXRhX2RlY3J5cHQgIEAxMzgKKyAgICAgIGdjcnlfYWNfZGF0YV9zaWduICBAMTM5CisgICAgICBnY3J5X2FjX2RhdGFfdmVyaWZ5ICBAMTQwCisgICAgICBnY3J5X2FjX2lkX3RvX25hbWUgIEAxNDEKKyAgICAgIGdjcnlfYWNfbmFtZV90b19pZCAgQDE0MgorICAgICAgCisgICAgICBnY3J5X21kX29wZW4gIEAxNDMKKyAgICAgIGdjcnlfbWRfY2xvc2UgIEAxNDQKKyAgICAgIGdjcnlfbWRfZW5hYmxlICBAMTQ1CisgICAgICBnY3J5X21kX2NvcHkgIEAxNDYKKyAgICAgIGdjcnlfbWRfcmVzZXQgIEAxNDcKKyAgICAgIGdjcnlfbWRfY3RsICBAMTQ4CisgICAgICBnY3J5X21kX3dyaXRlICBAMTQ5CisgICAgICBnY3J5X21kX3JlYWQgIEAxNTAKKyAgICAgIGdjcnlfbWRfaGFzaF9idWZmZXIgIEAxNTEKKyAgICAgIGdjcnlfbWRfZ2V0X2FsZ28gIEAxNTIKKyAgICAgIGdjcnlfbWRfZ2V0X2FsZ29fZGxlbiAgQDE1MworICAgICAgZ2NyeV9tZF9pc19lbmFibGVkICBAMTU0CisgICAgICBnY3J5X21kX2lzX3NlY3VyZSAgQDE1NQorICAgICAgZ2NyeV9tZF9pbmZvICBAMTU2CisgICAgICBnY3J5X21kX2FsZ29faW5mbyAgQDE1NworICAgICAgZ2NyeV9tZF9hbGdvX25hbWUgIEAxNTgKKyAgICAgIGdjcnlfbWRfbWFwX25hbWUgIEAxNTkKKyAgICAgIGdjcnlfbWRfc2V0a2V5ICBAMTYwCisgICAgICBnY3J5X21kX2xpc3QgIEAxNjEKKyAgICAgIAorICAgICAgZ2NyeV9yYW5kb21pemUgIEAxNjIKKyAgICAgIGdjcnlfcmFuZG9tX2FkZF9ieXRlcyAgQDE2MworICAgICAgZ2NyeV9yYW5kb21fYnl0ZXMgIEAxNjQKKyAgICAgIGdjcnlfcmFuZG9tX2J5dGVzX3NlY3VyZSAgQDE2NQorICAgICAgZ2NyeV9tcGlfcmFuZG9taXplICBAMTY2CisgICAgICAKKyAgICAgIGdjcnlfcHJpbWVfZ2VuZXJhdGUgIEAxNjcKKyAgICAgIGdjcnlfcHJpbWVfZ3JvdXBfZ2VuZXJhdG9yICBAMTY4CisgICAgICBnY3J5X3ByaW1lX3JlbGVhc2VfZmFjdG9ycyAgQDE2OQorICAgICAgZ2NyeV9wcmltZV9jaGVjayAgQDE3MAorCisgICAgICBnY3J5X2NyZWF0ZV9ub25jZSAgQDE3MQorCisgICAgICBnY3J5X21kX2RlYnVnICBAMTcyCisKKyAgICAgIGdjcnlfY2lwaGVyX3JlZ2lzdGVyICBAMTczCisgICAgICBnY3J5X2NpcGhlcl91bnJlZ2lzdGVyIEAxNzQKKyAgICAgIGdjcnlfbWRfcmVnaXN0ZXIgIEAxNzUKKyAgICAgIGdjcnlfbWRfdW5yZWdpc3RlciBAMTc2CisgICAgICBnY3J5X3BrX3JlZ2lzdGVyICBAMTc3CisgICAgICBnY3J5X3BrX3VucmVnaXN0ZXIgQDE3OAorICAgICAgIAorICAgICAgZ2NyeV9hY19kYXRhX2Zyb21fc2V4cCAgQDE3OQorICAgICAgZ2NyeV9hY19kYXRhX3RvX3NleHAgIEAxODAKKyAgICAgIGdjcnlfYWNfaW9faW5pdCAgQDE4MQorICAgICAgZ2NyeV9hY19pb19pbml0X3ZhICBAMTgyCisgICAgICBnY3J5X2FjX2RhdGFfZW5jcnlwdF9zY2hlbWUgIEAxODMKKyAgICAgIGdjcnlfYWNfZGF0YV9kZWNyeXB0X3NjaGVtZSAgQDE4NAorICAgICAgZ2NyeV9hY19kYXRhX3NpZ25fc2NoZW1lICBAMTg1CisgICAgICBnY3J5X2FjX2RhdGFfdmVyaWZ5X3NjaGVtZSAgQDE4NgorCisgICAgICBnY3J5X3NleHBfbnRoX3N0cmluZyAgQDE4NworCisgICAgICBnY3J5X2NpcGhlcl9zZXRrZXkgICAgQDE4OAorICAgICAgZ2NyeV9jaXBoZXJfc2V0aXYgICAgIEAxODkKKyAgICAgIGdjcnlfY2lwaGVyX3NldGN0ciAgICBAMTkwCisgICAgICAKKyAgICAgIGdjcnlfbXBpX2xzaGlmdCAgICAgICBAMTkxCisgIAorCisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9zcmMvbGliZ2NyeXB0Lm00IGIvbGliZ2NyeXB0LTEuNC42L3NyYy9saWJnY3J5cHQubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU0ZWFhYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9zcmMvbGliZ2NyeXB0Lm00CkBAIC0wLDAgKzEsMTA4IEBACitkbmwgQXV0b2NvbmYgbWFjcm9zIGZvciBsaWJnY3J5cHQKK2RubCAgICAgICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitkbmwKK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0aGUgYXV0aG9yIGdpdmVzCitkbmwgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwgd2l0aCBvciB3aXRob3V0CitkbmwgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCitkbmwKK2RubCBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitkbmwgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dCBldmVuIHRoZQorZG5sIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorCisKK2RubCBBTV9QQVRIX0xJQkdDUllQVChbTUlOSU1VTS1WRVJTSU9OLAorZG5sICAgICAgICAgICAgICAgICAgIFtBQ1RJT04tSUYtRk9VTkQgWywgQUNUSU9OLUlGLU5PVC1GT1VORCBdXV0pCitkbmwgVGVzdCBmb3IgbGliZ2NyeXB0IGFuZCBkZWZpbmUgTElCR0NSWVBUX0NGTEFHUyBhbmQgTElCR0NSWVBUX0xJQlMuCitkbmwgTUlOSU1VTi1WRVJTSU9OIGlzIGEgc3RyaW5nIHdpdGggdGhlIHZlcnNpb24gbnVtYmVyIG9wdGlvbmFsbGl5IHByZWZpeGVkCitkbmwgd2l0aCB0aGUgQVBJIHZlcnNpb24gdG8gYWxzbyBjaGVjayB0aGUgQVBJIGNvbXBhdGliaWxpdHkuIEV4YW1wbGU6CitkbmwgYSBNSU5JTVVOLVZFUlNJT04gb2YgMToxLjIuNSB3b24ndCBwYXNzIHRoZSB0ZXN0IHVubGVzcyB0aGUgaW5zdGFsbGVkIAorZG5sIHZlcnNpb24gb2YgbGliZ2NyeXB0IGlzIGF0IGxlYXN0IDEuMi41ICphbmQqIHRoZSBBUEkgbnVtYmVyIGlzIDEuICBVc2luZworZG5sIHRoaXMgZmVhdHVyZXMgYWxsb3dzIHRvIHByZXZlbnQgYnVpbGQgYWdhaW5zdCBuZXdlciB2ZXJzaW9ucyBvZiBsaWJnY3J5cHQKK2RubCB3aXRoIGEgY2hhbmdlZCBBUEkuCitkbmwKK0FDX0RFRlVOKFtBTV9QQVRIX0xJQkdDUllQVF0sCitbIEFDX0FSR19XSVRIKGxpYmdjcnlwdC1wcmVmaXgsCisgICAgICAgICAgICBBQ19IRUxQX1NUUklORyhbLS13aXRoLWxpYmdjcnlwdC1wcmVmaXg9UEZYXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcmVmaXggd2hlcmUgTElCR0NSWVBUIGlzIGluc3RhbGxlZCAob3B0aW9uYWwpXSksCisgICAgIGxpYmdjcnlwdF9jb25maWdfcHJlZml4PSIkd2l0aHZhbCIsIGxpYmdjcnlwdF9jb25maWdfcHJlZml4PSIiKQorICBpZiB0ZXN0IHgkbGliZ2NyeXB0X2NvbmZpZ19wcmVmaXggIT0geCA7IHRoZW4KKyAgICAgaWYgdGVzdCB4JHtMSUJHQ1JZUFRfQ09ORklHK3NldH0gIT0geHNldCA7IHRoZW4KKyAgICAgICAgTElCR0NSWVBUX0NPTkZJRz0kbGliZ2NyeXB0X2NvbmZpZ19wcmVmaXgvYmluL2xpYmdjcnlwdC1jb25maWcKKyAgICAgZmkKKyAgZmkKKworICBBQ19QQVRIX1BST0coTElCR0NSWVBUX0NPTkZJRywgbGliZ2NyeXB0LWNvbmZpZywgbm8pCisgIHRtcD1pZmVsc2UoWyQxXSwgLDE6MS4yLjAsJDEpCisgIGlmIGVjaG8gIiR0bXAiIHwgZ3JlcCAnOicgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCA7IHRoZW4KKyAgICAgcmVxX2xpYmdjcnlwdF9hcGk9YGVjaG8gIiR0bXAiICAgICB8IHNlZCAncy9cKC4qXCk6XCguKlwpL1wxLydgCisgICAgIG1pbl9saWJnY3J5cHRfdmVyc2lvbj1gZWNobyAiJHRtcCIgfCBzZWQgJ3MvXCguKlwpOlwoLipcKS9cMi8nYAorICBlbHNlCisgICAgIHJlcV9saWJnY3J5cHRfYXBpPTAKKyAgICAgbWluX2xpYmdjcnlwdF92ZXJzaW9uPSIkdG1wIgorICBmaQorCisgIEFDX01TR19DSEVDS0lORyhmb3IgTElCR0NSWVBUIC0gdmVyc2lvbiA+PSAkbWluX2xpYmdjcnlwdF92ZXJzaW9uKQorICBvaz1ubworICBpZiB0ZXN0ICIkTElCR0NSWVBUX0NPTkZJRyIgIT0gIm5vIiA7IHRoZW4KKyAgICByZXFfbWFqb3I9YGVjaG8gJG1pbl9saWJnY3J5cHRfdmVyc2lvbiB8IFwKKyAgICAgICAgICAgICAgIHNlZCAncy9cKFtbMC05XV0qXClcLlwoW1swLTldXSpcKVwuXChbWzAtOV1dKlwpL1wxLydgCisgICAgcmVxX21pbm9yPWBlY2hvICRtaW5fbGliZ2NyeXB0X3ZlcnNpb24gfCBcCisgICAgICAgICAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpXC5cKFtbMC05XV0qXClcLlwoW1swLTldXSpcKS9cMi8nYAorICAgIHJlcV9taWNybz1gZWNobyAkbWluX2xpYmdjcnlwdF92ZXJzaW9uIHwgXAorICAgICAgICAgICAgICAgc2VkICdzL1woW1swLTldXSpcKVwuXChbWzAtOV1dKlwpXC5cKFtbMC05XV0qXCkvXDMvJ2AKKyAgICBsaWJnY3J5cHRfY29uZmlnX3ZlcnNpb249YCRMSUJHQ1JZUFRfQ09ORklHIC0tdmVyc2lvbmAKKyAgICBtYWpvcj1gZWNobyAkbGliZ2NyeXB0X2NvbmZpZ192ZXJzaW9uIHwgXAorICAgICAgICAgICAgICAgc2VkICdzL1woW1swLTldXSpcKVwuXChbWzAtOV1dKlwpXC5cKFtbMC05XV0qXCkuKi9cMS8nYAorICAgIG1pbm9yPWBlY2hvICRsaWJnY3J5cHRfY29uZmlnX3ZlcnNpb24gfCBcCisgICAgICAgICAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpXC5cKFtbMC05XV0qXClcLlwoW1swLTldXSpcKS4qL1wyLydgCisgICAgbWljcm89YGVjaG8gJGxpYmdjcnlwdF9jb25maWdfdmVyc2lvbiB8IFwKKyAgICAgICAgICAgICAgIHNlZCAncy9cKFtbMC05XV0qXClcLlwoW1swLTldXSpcKVwuXChbWzAtOV1dKlwpLiovXDMvJ2AKKyAgICBpZiB0ZXN0ICIkbWFqb3IiIC1ndCAiJHJlcV9tYWpvciI7IHRoZW4KKyAgICAgICAgb2s9eWVzCisgICAgZWxzZSAKKyAgICAgICAgaWYgdGVzdCAiJG1ham9yIiAtZXEgIiRyZXFfbWFqb3IiOyB0aGVuCisgICAgICAgICAgICBpZiB0ZXN0ICIkbWlub3IiIC1ndCAiJHJlcV9taW5vciI7IHRoZW4KKyAgICAgICAgICAgICAgIG9rPXllcworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgaWYgdGVzdCAiJG1pbm9yIiAtZXEgIiRyZXFfbWlub3IiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiJG1pY3JvIiAtZ2UgIiRyZXFfbWljcm8iOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICBvaz15ZXMKKyAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGZpCisgICAgICAgIGZpCisgICAgZmkKKyAgZmkKKyAgaWYgdGVzdCAkb2sgPSB5ZXM7IHRoZW4KKyAgICBBQ19NU0dfUkVTVUxUKFt5ZXMgKCRsaWJnY3J5cHRfY29uZmlnX3ZlcnNpb24pXSkKKyAgZWxzZQorICAgIEFDX01TR19SRVNVTFQobm8pCisgIGZpCisgIGlmIHRlc3QgJG9rID0geWVzOyB0aGVuCisgICAgICMgSWYgd2UgaGF2ZSBhIHJlY2VudCBsaWJnY3J5cHQsIHdlIHNob3VsZCBhbHNvIGNoZWNrIHRoYXQgdGhlCisgICAgICMgQVBJIGlzIGNvbXBhdGlibGUKKyAgICAgaWYgdGVzdCAiJHJlcV9saWJnY3J5cHRfYXBpIiAtZ3QgMCA7IHRoZW4KKyAgICAgICAgdG1wPWAkTElCR0NSWVBUX0NPTkZJRyAtLWFwaS12ZXJzaW9uIDI+L2Rldi9udWxsIHx8IGVjaG8gMGAKKyAgICAgICAgaWYgdGVzdCAiJHRtcCIgLWd0IDAgOyB0aGVuCisgICAgICAgICAgIEFDX01TR19DSEVDS0lORyhbTElCR0NSWVBUIEFQSSB2ZXJzaW9uXSkKKyAgICAgICAgICAgaWYgdGVzdCAiJHJlcV9saWJnY3J5cHRfYXBpIiAtZXEgIiR0bXAiIDsgdGhlbgorICAgICAgICAgICAgIEFDX01TR19SRVNVTFQoW29rYXldKQorICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgb2s9bm8KKyAgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKFtkb2VzIG5vdCBtYXRjaC4gd2FudD0kcmVxX2xpYmdjcnlwdF9hcGkgZ290PSR0bXBdKQorICAgICAgICAgICBmaQorICAgICAgICBmaQorICAgICBmaQorICBmaQorICBpZiB0ZXN0ICRvayA9IHllczsgdGhlbgorICAgIExJQkdDUllQVF9DRkxBR1M9YCRMSUJHQ1JZUFRfQ09ORklHIC0tY2ZsYWdzYAorICAgIExJQkdDUllQVF9MSUJTPWAkTElCR0NSWVBUX0NPTkZJRyAtLWxpYnNgCisgICAgaWZlbHNlKFskMl0sICwgOiwgWyQyXSkKKyAgZWxzZQorICAgIExJQkdDUllQVF9DRkxBR1M9IiIKKyAgICBMSUJHQ1JZUFRfTElCUz0iIgorICAgIGlmZWxzZShbJDNdLCAsIDosIFskM10pCisgIGZpCisgIEFDX1NVQlNUKExJQkdDUllQVF9DRkxBR1MpCisgIEFDX1NVQlNUKExJQkdDUllQVF9MSUJTKQorXSkKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9zcmMvbGliZ2NyeXB0LnZlcnMgYi9saWJnY3J5cHQtMS40LjYvc3JjL2xpYmdjcnlwdC52ZXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmOWZjZWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvc3JjL2xpYmdjcnlwdC52ZXJzCkBAIC0wLDAgKzEsMTA5IEBACisjIGxpYmdjcnlwdC52ZXJzICAtIFdoYXQgc3ltYm9scyB0byBleHBvcnQgICAgICAgICAgICAgICAgICAtKi0gc3RkIC0qLQorIyBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDQsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyMKKyMgTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIGdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisKKyMgTk9URTogV2hlbiBhZGRpbmcgbmV3IGZ1bmN0aW9ucywgcGxlYXNlIG1ha2Ugc3VyZSB0byBhZGQgdGhlbSB0bworIyB2aXNpYmlsaXR5LmggYW5kIGxpYmdjcnlwdC5kZWYgYXMgd2VsbC4KKworR0NSWVBUXzEuMiB7CisgIGdsb2JhbDoKKyAgICBnY3J5X2NoZWNrX3ZlcnNpb247IGdjcnlfY29udHJvbDsKKyAgICBnY3J5X3NldF9hbGxvY2F0aW9uX2hhbmRsZXI7IGdjcnlfc2V0X2ZhdGFsZXJyb3JfaGFuZGxlcjsKKyAgICBnY3J5X3NldF9nZXR0ZXh0X2hhbmRsZXI7IGdjcnlfc2V0X2xvZ19oYW5kbGVyOworICAgIGdjcnlfc2V0X291dG9mY29yZV9oYW5kbGVyOyBnY3J5X3NldF9wcm9ncmVzc19oYW5kbGVyOworICAgIAorICAgIGdjcnlfZXJyX2NvZGVfZnJvbV9lcnJubzsgZ2NyeV9lcnJfY29kZV90b19lcnJubzsKKyAgICBnY3J5X2Vycl9tYWtlX2Zyb21fZXJybm87IGdjcnlfZXJyb3JfZnJvbV9lcnJubzsKKyAgICBnY3J5X3N0cmVycm9yOyBnY3J5X3N0cnNvdXJjZTsKKyAgICAKKyAgICBnY3J5X2ZyZWU7IGdjcnlfbWFsbG9jOyBnY3J5X21hbGxvY19zZWN1cmU7IGdjcnlfY2FsbG9jOworICAgIGdjcnlfY2FsbG9jX3NlY3VyZTsgZ2NyeV9yZWFsbG9jOyBnY3J5X3N0cmR1cDsgZ2NyeV9pc19zZWN1cmU7CisgICAgZ2NyeV94Y2FsbG9jOyBnY3J5X3hjYWxsb2Nfc2VjdXJlOyBnY3J5X3htYWxsb2M7CisgICAgZ2NyeV94bWFsbG9jX3NlY3VyZTsgZ2NyeV94cmVhbGxvYzsgZ2NyeV94c3RyZHVwOworICAgIAorICAgIGdjcnlfbWRfYWxnb19pbmZvOyBnY3J5X21kX2FsZ29fbmFtZTsgZ2NyeV9tZF9jbG9zZTsKKyAgICBnY3J5X21kX2NvcHk7IGdjcnlfbWRfY3RsOyBnY3J5X21kX2VuYWJsZTsgZ2NyeV9tZF9nZXQ7CisgICAgZ2NyeV9tZF9nZXRfYWxnbzsgZ2NyeV9tZF9nZXRfYWxnb19kbGVuOyBnY3J5X21kX2hhc2hfYnVmZmVyOworICAgIGdjcnlfbWRfaW5mbzsgZ2NyeV9tZF9pc19lbmFibGVkOyBnY3J5X21kX2lzX3NlY3VyZTsKKyAgICBnY3J5X21kX2xpc3Q7IGdjcnlfbWRfbWFwX25hbWU7IGdjcnlfbWRfb3BlbjsgZ2NyeV9tZF9yZWFkOworICAgIGdjcnlfbWRfcmVnaXN0ZXI7IGdjcnlfbWRfcmVzZXQ7IGdjcnlfbWRfc2V0a2V5OyAKKyAgICBnY3J5X21kX3VucmVnaXN0ZXI7IGdjcnlfbWRfd3JpdGU7IGdjcnlfbWRfZGVidWc7CisgICAgCisgICAgZ2NyeV9jaXBoZXJfYWxnb19pbmZvOyBnY3J5X2NpcGhlcl9hbGdvX25hbWU7IGdjcnlfY2lwaGVyX2Nsb3NlOworICAgIGdjcnlfY2lwaGVyX2N0bDsgZ2NyeV9jaXBoZXJfZGVjcnlwdDsgZ2NyeV9jaXBoZXJfZW5jcnlwdDsKKyAgICBnY3J5X2NpcGhlcl9nZXRfYWxnb19ibGtsZW47IGdjcnlfY2lwaGVyX2dldF9hbGdvX2tleWxlbjsKKyAgICBnY3J5X2NpcGhlcl9pbmZvOyBnY3J5X2NpcGhlcl9saXN0OyBnY3J5X2NpcGhlcl9tYXBfbmFtZTsKKyAgICBnY3J5X2NpcGhlcl9tb2RlX2Zyb21fb2lkOyBnY3J5X2NpcGhlcl9vcGVuOworICAgIGdjcnlfY2lwaGVyX3JlZ2lzdGVyOyBnY3J5X2NpcGhlcl91bnJlZ2lzdGVyOworICAgIGdjcnlfY2lwaGVyX3NldGtleTsgZ2NyeV9jaXBoZXJfc2V0aXY7IGdjcnlfY2lwaGVyX3NldGN0cjsKKyAgICAKKyAgICBnY3J5X3BrX2FsZ29faW5mbzsgZ2NyeV9wa19hbGdvX25hbWU7IGdjcnlfcGtfY3RsOworICAgIGdjcnlfcGtfZGVjcnlwdDsgZ2NyeV9wa19lbmNyeXB0OyBnY3J5X3BrX2dlbmtleTsKKyAgICBnY3J5X3BrX2dldF9rZXlncmlwOyBnY3J5X3BrX2dldF9uYml0czsgZ2NyeV9wa19saXN0OworICAgIGdjcnlfcGtfbWFwX25hbWU7IGdjcnlfcGtfcmVnaXN0ZXI7IGdjcnlfcGtfc2lnbjsKKyAgICBnY3J5X3BrX3Rlc3RrZXk7IGdjcnlfcGtfdW5yZWdpc3RlcjsgZ2NyeV9wa192ZXJpZnk7CisKKyAgICBnY3J5X2FjX2RhdGFfbmV3OyBnY3J5X2FjX2RhdGFfZGVzdHJveTsgZ2NyeV9hY19kYXRhX2NvcHk7CisgICAgZ2NyeV9hY19kYXRhX2xlbmd0aDsgZ2NyeV9hY19kYXRhX2NsZWFyOyBnY3J5X2FjX2RhdGFfc2V0OworICAgIGdjcnlfYWNfZGF0YV9nZXRfbmFtZTsgZ2NyeV9hY19kYXRhX2dldF9pbmRleDsgZ2NyeV9hY19vcGVuOworICAgIGdjcnlfYWNfY2xvc2U7IGdjcnlfYWNfa2V5X2luaXQ7IGdjcnlfYWNfa2V5X3BhaXJfZ2VuZXJhdGU7CisgICAgZ2NyeV9hY19rZXlfcGFpcl9leHRyYWN0OyBnY3J5X2FjX2tleV9kYXRhX2dldDsgZ2NyeV9hY19rZXlfdGVzdDsKKyAgICBnY3J5X2FjX2tleV9nZXRfbmJpdHM7IGdjcnlfYWNfa2V5X2dldF9ncmlwOyBnY3J5X2FjX2tleV9kZXN0cm95OworICAgIGdjcnlfYWNfa2V5X3BhaXJfZGVzdHJveTsgZ2NyeV9hY19kYXRhX2VuY3J5cHQ7IGdjcnlfYWNfZGF0YV9kZWNyeXB0OworICAgIGdjcnlfYWNfZGF0YV9zaWduOyBnY3J5X2FjX2RhdGFfdmVyaWZ5OyBnY3J5X2FjX2lkX3RvX25hbWU7CisgICAgZ2NyeV9hY19uYW1lX3RvX2lkOyBnY3J5X2FjX2xpc3Q7IGdjcnlfYWNfZGF0YV9lbmNvZGU7CisgICAgZ2NyeV9hY19kYXRhX2RlY29kZTsgZ2NyeV9hY19tcGlfdG9fb3M7IGdjcnlfYWNfbXBpX3RvX29zX2FsbG9jOworICAgIGdjcnlfYWNfb3NfdG9fbXBpOyBnY3J5X2FjX2RhdGFfZW5jcnlwdF9zY2hlbWU7IAorICAgIGdjcnlfYWNfZGF0YV9kZWNyeXB0X3NjaGVtZTsKKyAgICBnY3J5X2FjX2RhdGFfc2lnbl9zY2hlbWU7IGdjcnlfYWNfZGF0YV92ZXJpZnlfc2NoZW1lOworICAgIGdjcnlfYWNfZGF0YV90b19zZXhwOyBnY3J5X2FjX2RhdGFfZnJvbV9zZXhwOworICAgIGdjcnlfYWNfaW9faW5pdDsgZ2NyeV9hY19pb19pbml0X3ZhOworCisgICAgZ2NyeV9wcmltZV9jaGVjazsgZ2NyeV9wcmltZV9nZW5lcmF0ZTsgCisgICAgZ2NyeV9wcmltZV9ncm91cF9nZW5lcmF0b3I7IGdjcnlfcHJpbWVfcmVsZWFzZV9mYWN0b3JzOworICAgIAorICAgIGdjcnlfcmFuZG9tX2FkZF9ieXRlczsgZ2NyeV9yYW5kb21fYnl0ZXM7IGdjcnlfcmFuZG9tX2J5dGVzX3NlY3VyZTsKKyAgICBnY3J5X3JhbmRvbWl6ZTsgZ2NyeV9jcmVhdGVfbm9uY2U7CisgICAgCisgICAgZ2NyeV9zZXhwX2FsaXN0OyBnY3J5X3NleHBfYXBwZW5kOyBnY3J5X3NleHBfYnVpbGQ7CisgICAgZ2NyeV9zZXhwX2J1aWxkX2FycmF5OyBnY3J5X3NleHBfY2FkcjsgZ2NyeV9zZXhwX2Nhbm9uX2xlbjsKKyAgICBnY3J5X3NleHBfY2FyOyBnY3J5X3NleHBfY2RyOyBnY3J5X3NleHBfY29uczsgZ2NyeV9zZXhwX2NyZWF0ZTsKKyAgICBnY3J5X3NleHBfZHVtcDsgZ2NyeV9zZXhwX2ZpbmRfdG9rZW47IGdjcnlfc2V4cF9sZW5ndGg7CisgICAgZ2NyeV9zZXhwX25ldzsgZ2NyeV9zZXhwX250aDsgZ2NyeV9zZXhwX250aF9kYXRhOworICAgIGdjcnlfc2V4cF9udGhfbXBpOyBnY3J5X3NleHBfcHJlcGVuZDsgZ2NyeV9zZXhwX3JlbGVhc2U7CisgICAgZ2NyeV9zZXhwX3NwcmludDsgZ2NyeV9zZXhwX3NzY2FuOyBnY3J5X3NleHBfdmxpc3Q7CisgICAgZ2NyeV9zZXhwX250aF9zdHJpbmc7CisgICAgCisgICAgZ2NyeV9tcGlfYWRkOyBnY3J5X21waV9hZGRfdWk7IGdjcnlfbXBpX2FkZG07IGdjcnlfbXBpX2FwcmludDsKKyAgICBnY3J5X21waV9jbGVhcl9iaXQ7IGdjcnlfbXBpX2NsZWFyX2ZsYWc7IGdjcnlfbXBpX2NsZWFyX2hpZ2hiaXQ7CisgICAgZ2NyeV9tcGlfY21wOyBnY3J5X21waV9jbXBfdWk7IGdjcnlfbXBpX2NvcHk7IGdjcnlfbXBpX2RpdjsKKyAgICBnY3J5X21waV9kdW1wOyBnY3J5X21waV9nY2Q7IGdjcnlfbXBpX2dldF9mbGFnOyBnY3J5X21waV9nZXRfbmJpdHM7CisgICAgZ2NyeV9tcGlfZ2V0X29wYXF1ZTsgZ2NyeV9tcGlfaW52bTsgZ2NyeV9tcGlfbW9kOyBnY3J5X21waV9tdWw7CisgICAgZ2NyeV9tcGlfbXVsXzJleHA7IGdjcnlfbXBpX211bF91aTsgZ2NyeV9tcGlfbXVsbTsgZ2NyeV9tcGlfbmV3OworICAgIGdjcnlfbXBpX3Bvd207IGdjcnlfbXBpX3ByaW50OyBnY3J5X21waV9yYW5kb21pemU7IGdjcnlfbXBpX3JlbGVhc2U7CisgICAgZ2NyeV9tcGlfcnNoaWZ0OyBnY3J5X21waV9zY2FuOyBnY3J5X21waV9zZXQ7IGdjcnlfbXBpX3NldF9iaXQ7CisgICAgZ2NyeV9tcGlfc2V0X2ZsYWc7IGdjcnlfbXBpX3NldF9oaWdoYml0OyBnY3J5X21waV9zZXRfb3BhcXVlOworICAgIGdjcnlfbXBpX3NldF91aTsgZ2NyeV9tcGlfc25ldzsgZ2NyeV9tcGlfc3ViOyBnY3J5X21waV9zdWJfdWk7CisgICAgZ2NyeV9tcGlfc3VibTsgZ2NyeV9tcGlfc3dhcDsgZ2NyeV9tcGlfdGVzdF9iaXQ7CisgICAgZ2NyeV9tcGlfbHNoaWZ0OworCisgIGxvY2FsOgorICAgICo7CisKK307CisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9zcmMvbWlzYy5jIGIvbGliZ2NyeXB0LTEuNC42L3NyYy9taXNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ1NDYzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9zcmMvbWlzYy5jCkBAIC0wLDAgKzEsMjk2IEBACisvKiBtaXNjLmMKKyAqIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNywgCisgKiAgICAgICAgICAgICAgIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAiZzEwbGliLmgiCisjaW5jbHVkZSAic2VjbWVtLmgiCisKK3N0YXRpYyBpbnQgdmVyYm9zaXR5X2xldmVsID0gMDsKKworc3RhdGljIHZvaWQgKCpmYXRhbF9lcnJvcl9oYW5kbGVyKSh2b2lkKixpbnQsIGNvbnN0IGNoYXIqKSA9IE5VTEw7CitzdGF0aWMgdm9pZCAqZmF0YWxfZXJyb3JfaGFuZGxlcl92YWx1ZSA9IDA7CitzdGF0aWMgdm9pZCAoKmxvZ19oYW5kbGVyKSh2b2lkKixpbnQsIGNvbnN0IGNoYXIqLCB2YV9saXN0KSA9IE5VTEw7CitzdGF0aWMgdm9pZCAqbG9nX2hhbmRsZXJfdmFsdWUgPSAwOworCitzdGF0aWMgY29uc3QgY2hhciAqKCp1c2VyX2dldHRleHRfaGFuZGxlcikoIGNvbnN0IGNoYXIgKiApID0gTlVMTDsKKwordm9pZAorZ2NyeV9zZXRfZ2V0dGV4dF9oYW5kbGVyKCBjb25zdCBjaGFyICooKmYpKGNvbnN0IGNoYXIqKSApCit7CisgICAgdXNlcl9nZXR0ZXh0X2hhbmRsZXIgPSBmOworfQorCisKK2NvbnN0IGNoYXIgKgorX2djcnlfZ2V0dGV4dCggY29uc3QgY2hhciAqa2V5ICkKK3sKKyAgICBpZiggdXNlcl9nZXR0ZXh0X2hhbmRsZXIgKQorCXJldHVybiB1c2VyX2dldHRleHRfaGFuZGxlcigga2V5ICk7CisgICAgLyogRklYTUU6IHN3aXRjaCB0aGUgZG9tYWluIHRvIGdudXBnIGFuZCByZXN0b3JlIGxhdGVyICovCisgICAgcmV0dXJuIGtleTsKK30KKwordm9pZAorZ2NyeV9zZXRfZmF0YWxlcnJvcl9oYW5kbGVyKCB2b2lkICgqZm5jKSh2b2lkKixpbnQsIGNvbnN0IGNoYXIqKSwgdm9pZCAqdmFsdWUpCit7CisgICAgZmF0YWxfZXJyb3JfaGFuZGxlcl92YWx1ZSA9IHZhbHVlOworICAgIGZhdGFsX2Vycm9yX2hhbmRsZXIgPSBmbmM7Cit9CisKK3N0YXRpYyB2b2lkCit3cml0ZTJzdGRlcnIoIGNvbnN0IGNoYXIgKnMgKQoreworICAgIHdyaXRlKCAyLCBzLCBzdHJsZW4ocykgKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBmYXRhbCBlcnJvcnMuICBBIGNhbGxlciBtaWdodCB3YW50IHRvCisgKiBzZXQgaGlzIG93biBoYW5kbGVyIGJlY2F1c2UgdGhpcyBmdW5jdGlvbiBzaW1wbHkgY2FsbHMgYWJvcnQoKS4KKyAqLwordm9pZAorX2djcnlfZmF0YWxfZXJyb3IgKGludCByYywgY29uc3QgY2hhciAqdGV4dCkKK3sKKyAgaWYgKCAhdGV4dCApIC8qIGdldCBhIGRlZmF1bHQgdGV4dCAqLworICAgIHRleHQgPSBncGdfc3RyZXJyb3IgKHJjKTsKKworICBpZiAoZmF0YWxfZXJyb3JfaGFuZGxlciAmJiAhZmlwc19tb2RlICgpICkKKyAgICBmYXRhbF9lcnJvcl9oYW5kbGVyIChmYXRhbF9lcnJvcl9oYW5kbGVyX3ZhbHVlLCByYywgdGV4dCk7CisKKyAgZmlwc19zaWduYWxfZmF0YWxfZXJyb3IgKHRleHQpOworICB3cml0ZTJzdGRlcnIoIlxuRmF0YWwgZXJyb3I6ICIpOworICB3cml0ZTJzdGRlcnIodGV4dCk7CisgIHdyaXRlMnN0ZGVycigiXG4iKTsKKyAgX2djcnlfc2VjbWVtX3Rlcm0gKCk7CisgIGFib3J0ICgpOworfQorCit2b2lkCitnY3J5X3NldF9sb2dfaGFuZGxlciggdm9pZCAoKmYpKHZvaWQqLGludCwgY29uc3QgY2hhciosIHZhX2xpc3QgKSwKKwkJCQkJCQkgICAgdm9pZCAqb3BhcXVlICkKK3sKKyAgICBsb2dfaGFuZGxlciA9IGY7CisgICAgbG9nX2hhbmRsZXJfdmFsdWUgPSBvcGFxdWU7Cit9CisKK3ZvaWQKK19nY3J5X3NldF9sb2dfdmVyYm9zaXR5KCBpbnQgbGV2ZWwgKQoreworICAgIHZlcmJvc2l0eV9sZXZlbCA9IGxldmVsOworfQorCitpbnQKK19nY3J5X2xvZ192ZXJib3NpdHkoIGludCBsZXZlbCApCit7CisgICAgcmV0dXJuIHZlcmJvc2l0eV9sZXZlbCA+PSBsZXZlbDsKK30KKworLyoqKioqKioqKioqKioqKioKKyAqIFRoaXMgaXMgb3VyIGxvZyBmdW5jdGlvbiB3aGljaCBwcmludHMgYWxsIGxvZyBtZXNzYWdlcyB0byBzdGRlcnIgb3IKKyAqIHVzaW5nIHRoZSBmdW5jdGlvbiBkZWZpbmVkIHdpdGggZ2NyeV9zZXRfbG9nX2hhbmRsZXIoKS4KKyAqLworc3RhdGljIHZvaWQKK19nY3J5X2xvZ3YoIGludCBsZXZlbCwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ19wdHIgKQoreworICBpZiAobG9nX2hhbmRsZXIpCisgICAgbG9nX2hhbmRsZXIgKGxvZ19oYW5kbGVyX3ZhbHVlLCBsZXZlbCwgZm10LCBhcmdfcHRyKTsKKyAgZWxzZSAKKyAgICB7CisgICAgICBzd2l0Y2ggKGxldmVsKSAKKyAgICAgICAgeworICAgICAgICBjYXNlIEdDUllfTE9HX0NPTlQ6ICBicmVhazsKKyAgICAgICAgY2FzZSBHQ1JZX0xPR19JTkZPOiAgYnJlYWs7CisgICAgICAgIGNhc2UgR0NSWV9MT0dfV0FSTjogIGJyZWFrOworICAgICAgICBjYXNlIEdDUllfTE9HX0VSUk9SOiBicmVhazsKKyAgICAgICAgY2FzZSBHQ1JZX0xPR19GQVRBTDogZnB1dHMoIkZhdGFsOiAiLHN0ZGVyciApOyBicmVhazsKKyAgICAgICAgY2FzZSBHQ1JZX0xPR19CVUc6ICAgZnB1dHMoIk9oaGhoIGplZWVlOiAiLCBzdGRlcnIpOyBicmVhazsKKyAgICAgICAgY2FzZSBHQ1JZX0xPR19ERUJVRzogZnB1dHMoIkRCRzogIiwgc3RkZXJyICk7IGJyZWFrOworICAgICAgICBkZWZhdWx0OiBmcHJpbnRmKHN0ZGVyciwiW1Vua25vd24gbG9nIGxldmVsICVkXTogIiwgbGV2ZWwgKTsgYnJlYWs7CisJfQorICAgICAgdmZwcmludGYoc3RkZXJyLGZtdCxhcmdfcHRyKSA7CisgICAgfQorICAKKyAgaWYgKCBsZXZlbCA9PSBHQ1JZX0xPR19GQVRBTCB8fCBsZXZlbCA9PSBHQ1JZX0xPR19CVUcgKQorICAgIHsKKyAgICAgIGZpcHNfc2lnbmFsX2ZhdGFsX2Vycm9yICgiaW50ZXJuYWwgZXJyb3IgKGZhdGFsIG9yIGJ1ZykiKTsKKyAgICAgIF9nY3J5X3NlY21lbV90ZXJtICgpOworICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCisKK3ZvaWQKK19nY3J5X2xvZyggaW50IGxldmVsLCBjb25zdCBjaGFyICpmbXQsIC4uLiApCit7CisgICAgdmFfbGlzdCBhcmdfcHRyIDsKKworICAgIHZhX3N0YXJ0KCBhcmdfcHRyLCBmbXQgKSA7CisgICAgX2djcnlfbG9ndiggbGV2ZWwsIGZtdCwgYXJnX3B0ciApOworICAgIHZhX2VuZChhcmdfcHRyKTsKK30KKworCisjaWYgZGVmaW5lZChKTkxJQl9HQ0NfTV9GVU5DVElPTikgfHwgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCit2b2lkCitfZ2NyeV9idWcoIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyICpmdW5jICkKK3sKKyAgICBfZ2NyeV9sb2coIEdDUllfTE9HX0JVRywKKwkgICAgICgiLi4uIHRoaXMgaXMgYSBidWcgKCVzOiVkOiVzKVxuIiksIGZpbGUsIGxpbmUsIGZ1bmMgKTsKKyAgICBhYm9ydCgpOyAvKiBuZXZlciBjYWxsZWQsIGJ1dCBpdCBtYWtlcyB0aGUgY29tcGlsZXIgaGFwcHkgKi8KK30KK3ZvaWQKK19nY3J5X2Fzc2VydF9mYWlsZWQgKGNvbnN0IGNoYXIgKmV4cHIsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnVuYykKK3sKKyAgX2djcnlfbG9nIChHQ1JZX0xPR19CVUcsCisgICAgICAgICAgICAgKCJBc3NlcnRpb24gYCVzJyBmYWlsZWQgKCVzOiVkOiVzKVxuIiksIGV4cHIsIGZpbGUsIGxpbmUsIGZ1bmMgKTsKKyAgYWJvcnQoKTsgLyogTmV2ZXIgY2FsbGVkLCBidXQgaXQgbWFrZXMgdGhlIGNvbXBpbGVyIGhhcHB5LiAqLworfQorI2Vsc2UKK3ZvaWQKK19nY3J5X2J1ZyggY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUgKQoreworICAgIF9nY3J5X2xvZyggR0NSWV9MT0dfQlVHLAorCSAgICAgXygieW91IGZvdW5kIGEgYnVnIC4uLiAoJXM6JWQpXG4iKSwgZmlsZSwgbGluZSk7CisgICAgYWJvcnQoKTsgLyogbmV2ZXIgY2FsbGVkLCBidXQgaXQgbWFrZXMgdGhlIGNvbXBpbGVyIGhhcHB5ICovCit9Cit2b2lkCitfZ2NyeV9hc3NlcnRfZmFpbGVkIChjb25zdCBjaGFyICpleHByLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkKK3sKKyAgX2djcnlfbG9nIChHQ1JZX0xPR19CVUcsCisgICAgICAgICAgICAgKCJBc3NlcnRpb24gYCVzJyBmYWlsZWQgKCVzOiVkKVxuIiksIGV4cHIsIGZpbGUsIGxpbmUpOworICBhYm9ydCgpOyAvKiBOZXZlciBjYWxsZWQsIGJ1dCBpdCBtYWtlcyB0aGUgY29tcGlsZXIgaGFwcHkuICovCit9CisjZW5kaWYKKwordm9pZAorX2djcnlfbG9nX2luZm8oIGNvbnN0IGNoYXIgKmZtdCwgLi4uICkKK3sKKyAgICB2YV9saXN0IGFyZ19wdHIgOworCisgICAgdmFfc3RhcnQoIGFyZ19wdHIsIGZtdCApIDsKKyAgICBfZ2NyeV9sb2d2KCBHQ1JZX0xPR19JTkZPLCBmbXQsIGFyZ19wdHIgKTsKKyAgICB2YV9lbmQoYXJnX3B0cik7Cit9CisKK2ludAorX2djcnlfbG9nX2luZm9fd2l0aF9kdW1teV9mcCAoRklMRSAqZnAsIGNvbnN0IGNoYXIgKmZtdCwgLi4uICkKK3sKKyAgICB2YV9saXN0IGFyZ19wdHI7CisKKyAgICAodm9pZClmcDsKKyAgICB2YV9zdGFydCggYXJnX3B0ciwgZm10ICkgOworICAgIF9nY3J5X2xvZ3YoIEdDUllfTE9HX0lORk8sIGZtdCwgYXJnX3B0ciApOworICAgIHZhX2VuZChhcmdfcHRyKTsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZAorX2djcnlfbG9nX2Vycm9yKCBjb25zdCBjaGFyICpmbXQsIC4uLiApCit7CisgICAgdmFfbGlzdCBhcmdfcHRyIDsKKworICAgIHZhX3N0YXJ0KCBhcmdfcHRyLCBmbXQgKSA7CisgICAgX2djcnlfbG9ndiggR0NSWV9MT0dfRVJST1IsIGZtdCwgYXJnX3B0ciApOworICAgIHZhX2VuZChhcmdfcHRyKTsKK30KKworCit2b2lkCitfZ2NyeV9sb2dfZmF0YWwoIGNvbnN0IGNoYXIgKmZtdCwgLi4uICkKK3sKKyAgICB2YV9saXN0IGFyZ19wdHIgOworCisgICAgdmFfc3RhcnQoIGFyZ19wdHIsIGZtdCApIDsKKyAgICBfZ2NyeV9sb2d2KCBHQ1JZX0xPR19GQVRBTCwgZm10LCBhcmdfcHRyICk7CisgICAgdmFfZW5kKGFyZ19wdHIpOworICAgIGFib3J0KCk7IC8qIG5ldmVyIGNhbGxlZCwgYnV0IGl0IG1ha2VzIHRoZSBjb21waWxlciBoYXBweSAqLworfQorCit2b2lkCitfZ2NyeV9sb2dfYnVnKCBjb25zdCBjaGFyICpmbXQsIC4uLiApCit7CisgICAgdmFfbGlzdCBhcmdfcHRyIDsKKworICAgIHZhX3N0YXJ0KCBhcmdfcHRyLCBmbXQgKSA7CisgICAgX2djcnlfbG9ndiggR0NSWV9MT0dfQlVHLCBmbXQsIGFyZ19wdHIgKTsKKyAgICB2YV9lbmQoYXJnX3B0cik7CisgICAgYWJvcnQoKTsgLyogbmV2ZXIgY2FsbGVkLCBidXQgaXQgbWFrZXMgdGhlIGNvbXBpbGVyIGhhcHB5ICovCit9CisKK3ZvaWQKK19nY3J5X2xvZ19kZWJ1ZyggY29uc3QgY2hhciAqZm10LCAuLi4gKQoreworICAgIHZhX2xpc3QgYXJnX3B0ciA7CisKKyAgICB2YV9zdGFydCggYXJnX3B0ciwgZm10ICkgOworICAgIF9nY3J5X2xvZ3YoIEdDUllfTE9HX0RFQlVHLCBmbXQsIGFyZ19wdHIgKTsKKyAgICB2YV9lbmQoYXJnX3B0cik7Cit9CisKKwordm9pZAorX2djcnlfbG9nX3ByaW50ZiAoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgIHZhX2xpc3QgYXJnX3B0cjsKKyAgCisgIGlmIChmbXQpIAorICAgIHsKKyAgICAgIHZhX3N0YXJ0KCBhcmdfcHRyLCBmbXQgKSA7CisgICAgICBfZ2NyeV9sb2d2IChHQ1JZX0xPR19DT05ULCBmbXQsIGFyZ19wdHIpOworICAgICAgdmFfZW5kKGFyZ19wdHIpOworICAgIH0KK30KKworLyogUHJpbnQgYSBoZXhkdW1wIG9mIEJVRkZFUi4gIFdpdGggVEVYVCBvZiBOVUxMIHByaW50IGp1c3QgdGhlIHJhdworICAgZHVtcCwgd2l0aCBURVhUIGFuIGVtcHR5IHN0cmluZywgcHJpbnQgYSB0cmFpbGluZyBsaW5lZmVlZCwKKyAgIG90aGVyd2lzZSBwcmludCBhbiBlbnRpcmUgZGVidWcgbGluZS4gKi8KK3ZvaWQKK19nY3J5X2xvZ19wcmludGhleCAoY29uc3QgY2hhciAqdGV4dCwgY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoKQoreworICBpZiAodGV4dCAmJiAqdGV4dCkKKyAgICBsb2dfZGVidWcgKCIlcyAiLCB0ZXh0KTsKKyAgaWYgKGxlbmd0aCkKKyAgICB7CisgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpwID0gYnVmZmVyOworICAgICAgbG9nX3ByaW50ZiAoIiUwMlgiLCAqcCk7CisgICAgICBmb3IgKGxlbmd0aC0tLCBwKys7IGxlbmd0aC0tOyBwKyspCisgICAgICAgIGxvZ19wcmludGYgKCIgJTAyWCIsICpwKTsKKyAgICB9CisgIGlmICh0ZXh0KQorICAgIGxvZ19wcmludGYgKCJcbiIpOworfQorCisKK3ZvaWQKK19nY3J5X2J1cm5fc3RhY2sgKGludCBieXRlcykKK3sKKyAgICBjaGFyIGJ1Zls2NF07CisgICAgCisgICAgd2lwZW1lbW9yeSAoYnVmLCBzaXplb2YgYnVmKTsKKyAgICBieXRlcyAtPSBzaXplb2YgYnVmOworICAgIGlmIChieXRlcyA+IDApCisgICAgICAgIF9nY3J5X2J1cm5fc3RhY2sgKGJ5dGVzKTsKK30KZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9zcmMvbWlzc2luZy1zdHJpbmcuYyBiL2xpYmdjcnlwdC0xLjQuNi9zcmMvbWlzc2luZy1zdHJpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWU1NmMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L3NyYy9taXNzaW5nLXN0cmluZy5jCkBAIC0wLDAgKzEsNTUgQEAKKy8qIG1pc3Npbmctc3RyaW5nLmMgLSBtaXNzaW5nIHN0cmluZyB1dGlsaXRpZXMKKyAqIENvcHlyaWdodCAoQykgMTk5NCwgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgCisgKiAgICAgICAgICAgICAgIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpbmNsdWRlICJnMTBsaWIuaCIKKworCisjaWZuZGVmIEhBVkVfU1RQQ1BZCitjaGFyICoKK3N0cGNweShjaGFyICphLGNvbnN0IGNoYXIgKmIpCit7CisgICAgd2hpbGUoICpiICkKKwkqYSsrID0gKmIrKzsKKyAgICAqYSA9IDA7CisKKyAgICByZXR1cm4gKGNoYXIqKWE7Cit9CisjZW5kaWYKKworCisjaWZuZGVmIEhBVkVfU1RSQ0FTRUNNUAoraW50CitzdHJjYXNlY21wKCBjb25zdCBjaGFyICphLCBjb25zdCBjaGFyICpiICkKK3sKKyAgICBmb3IoIDsgKmEgJiYgKmI7IGErKywgYisrICkgeworCWlmKCAqYSAhPSAqYiAmJiB0b3VwcGVyKCphKSAhPSB0b3VwcGVyKCpiKSApCisJICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gKihjb25zdCBieXRlKilhIC0gKihjb25zdCBieXRlKiliOworfQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9zcmMvbW9kdWxlLmMgYi9saWJnY3J5cHQtMS40LjYvc3JjL21vZHVsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MGE0NGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvc3JjL21vZHVsZS5jCkBAIC0wLDAgKzEsMjEyIEBACisvKiBtb2R1bGUuYyAtIE1vZHVsZSBtYW5hZ2VtZW50IGZvciBsaWJnY3J5cHQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgZ2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgImcxMGxpYi5oIgorCisvKiBQbGVhc2UgbWF0Y2ggdGhlc2UgbnVtYmVycyB3aXRoIHRoZSBhbGxvY2F0ZWQgYWxnb3JpdGhtCisgICBudW1iZXJzLiAgKi8KKyNkZWZpbmUgTU9EVUxFX0lEX01JTiA2MDAKKyNkZWZpbmUgTU9EVUxFX0lEX0xBU1QgNjU1MDAKKyNkZWZpbmUgTU9EVUxFX0lEX1VTRVIgR0NSWV9NT0RVTEVfSURfVVNFUgorI2RlZmluZSBNT0RVTEVfSURfVVNFUl9MQVNUIEdDUllfTU9EVUxFX0lEX1VTRVJfTEFTVAorCisjaWYgTU9EVUxFX0lEX01JTiA+PSBNT0RVTEVfSURfVVNFUgorI2Vycm9yIE5lZWQgdG8gaW1wbGVtZW50IGEgZGlmZmVyZW50IHNlYXJjaCBzdHJhdGVneQorI2VuZGlmCisKKy8qIEludGVybmFsIGZ1bmN0aW9uLiAgR2VuZXJhdGUgYSBuZXcsIHVuaXF1ZSBtb2R1bGUgSUQgZm9yIGEgbW9kdWxlCisgICB0aGF0IHNob3VsZCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBtb2R1bGUgY2hhaW4gc3RhcnRpbmcgYXQKKyAgIE1PRFVMRVMuICAqLworc3RhdGljIGdjcnlfZXJyX2NvZGVfdAorX2djcnlfbW9kdWxlX2lkX25ldyAoZ2NyeV9tb2R1bGVfdCBtb2R1bGVzLCB1bnNpZ25lZCBpbnQgKmlkX25ldykKK3sKKyAgdW5zaWduZWQgaW50IG1vZF9pZDsKKyAgZ2NyeV9lcnJfY29kZV90IGVyciA9IEdQR19FUlJfTk9fRVJST1I7CisgIGdjcnlfbW9kdWxlX3QgbW9kdWxlOworCisgIC8qIFNlYXJjaCBmb3IgdW51c2VkIElELiAgKi8KKyAgZm9yIChtb2RfaWQgPSBNT0RVTEVfSURfTUlOOyBtb2RfaWQgPCBNT0RVTEVfSURfTEFTVDsgbW9kX2lkKyspCisgICAgeworICAgICAgaWYgKG1vZF9pZCA9PSBNT0RVTEVfSURfVVNFUikKKyAgICAgICAgeworICAgICAgICAgIG1vZF9pZCA9IE1PRFVMRV9JRF9VU0VSX0xBU1Q7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgLyogU2VhcmNoIGZvciBhIG1vZHVsZSB3aXRoIHRoZSBjdXJyZW50IElELiAgKi8KKyAgICAgIGZvciAobW9kdWxlID0gbW9kdWxlczsgbW9kdWxlOyBtb2R1bGUgPSBtb2R1bGUtPm5leHQpCisJaWYgKG1vZF9pZCA9PSBtb2R1bGUtPm1vZF9pZCkKKwkgIGJyZWFrOworCisgICAgICBpZiAoISBtb2R1bGUpCisJLyogTm9uZSBmb3VuZCAtPiB0aGUgSUQgaXMgYXZhaWxhYmxlIGZvciB1c2UuICAqLworCWJyZWFrOworICAgIH0KKworICBpZiAobW9kX2lkIDwgTU9EVUxFX0lEX0xBU1QpCisgICAgLyogRG9uZS4gICovCisgICAgKmlkX25ldyA9IG1vZF9pZDsKKyAgZWxzZQorICAgIC8qIE5vIGZyZWUgSUQgZm91bmQuICAqLworICAgIGVyciA9IEdQR19FUlJfSU5URVJOQUw7CisKKyAgcmV0dXJuIGVycjsKK30KKworLyogQWRkIGEgbW9kdWxlIHNwZWNpZmljYXRpb24gdG8gdGhlIGxpc3QgRU5UUklFUy4gIFRoZSBuZXcgbW9kdWxlIGhhcworICAgaXQncyB1c2UtY291bnRlciBzZXQgdG8gb25lLiAgKi8KK2djcnlfZXJyX2NvZGVfdAorX2djcnlfbW9kdWxlX2FkZCAoZ2NyeV9tb2R1bGVfdCAqZW50cmllcywgdW5zaWduZWQgaW50IG1vZF9pZCwKKwkJICB2b2lkICpzcGVjLCB2b2lkICpleHRyYXNwZWMsIGdjcnlfbW9kdWxlX3QgKm1vZHVsZSkKK3sKKyAgZ2NyeV9lcnJfY29kZV90IGVyciA9IDA7CisgIGdjcnlfbW9kdWxlX3QgZW50cnk7CisKKyAgaWYgKCEgbW9kX2lkKQorICAgIGVyciA9IF9nY3J5X21vZHVsZV9pZF9uZXcgKCplbnRyaWVzLCAmbW9kX2lkKTsKKworICBpZiAoISBlcnIpCisgICAgeworICAgICAgZW50cnkgPSBnY3J5X21hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZ2NyeV9tb2R1bGUpKTsKKyAgICAgIGlmICghIGVudHJ5KQorCWVyciA9IGdwZ19lcnJfY29kZV9mcm9tX2Vycm5vIChlcnJubyk7CisgICAgfQorCisgIGlmICghIGVycikKKyAgICB7CisgICAgICAvKiBGaWxsIG5ldyBtb2R1bGUgZW50cnkuICAqLworICAgICAgZW50cnktPmZsYWdzID0gMDsKKyAgICAgIGVudHJ5LT5jb3VudGVyID0gMTsKKyAgICAgIGVudHJ5LT5zcGVjID0gc3BlYzsKKyAgICAgIGVudHJ5LT5leHRyYXNwZWMgPSBleHRyYXNwZWM7CisgICAgICBlbnRyeS0+bW9kX2lkID0gbW9kX2lkOworCisgICAgICAvKiBMaW5rIGl0IGludG8gdGhlIGxpc3QuICAqLworICAgICAgZW50cnktPm5leHQgPSAqZW50cmllczsKKyAgICAgIGVudHJ5LT5wcmV2cCA9IGVudHJpZXM7CisgICAgICBpZiAoKmVudHJpZXMpCisJKCplbnRyaWVzKS0+cHJldnAgPSAmZW50cnktPm5leHQ7CisgICAgICAqZW50cmllcyA9IGVudHJ5OworCisgICAgICAvKiBBbmQgZ2l2ZSBpdCB0byB0aGUgY2FsbGVyLiAgKi8KKyAgICAgIGlmIChtb2R1bGUpCisJKm1vZHVsZSA9IGVudHJ5OworICAgIH0KKyAgcmV0dXJuIGVycjsKK30KKworLyogSW50ZXJuYWwgZnVuY3Rpb24uICBVbmxpbmsgQ0lQSEVSX0VOVFJZIGZyb20gdGhlIGxpc3Qgb2YgcmVnaXN0ZXJlZAorICAgY2lwaGVycyBhbmQgZGVzdHJveSBpdC4gICovCitzdGF0aWMgdm9pZAorX2djcnlfbW9kdWxlX2Ryb3AgKGdjcnlfbW9kdWxlX3QgZW50cnkpCit7CisgICplbnRyeS0+cHJldnAgPSBlbnRyeS0+bmV4dDsKKyAgaWYgKGVudHJ5LT5uZXh0KQorICAgIGVudHJ5LT5uZXh0LT5wcmV2cCA9IGVudHJ5LT5wcmV2cDsKKworICBnY3J5X2ZyZWUgKGVudHJ5KTsKK30KKworLyogTG9va3VwIGEgbW9kdWxlIHNwZWNpZmljYXRpb24gYnkgaXQncyBJRC4gIEFmdGVyIGEgc3VjY2Vzc2Z1bGwKKyAgIGxvb2t1cCwgdGhlIG1vZHVsZSBoYXMgaXQncyByZXNvdXJjZSBjb3VudGVyIGluY3JlbWVudGVkLiAgKi8KK2djcnlfbW9kdWxlX3QgCitfZ2NyeV9tb2R1bGVfbG9va3VwX2lkIChnY3J5X21vZHVsZV90IGVudHJpZXMsIHVuc2lnbmVkIGludCBtb2RfaWQpCit7CisgIGdjcnlfbW9kdWxlX3QgZW50cnk7CisKKyAgZm9yIChlbnRyeSA9IGVudHJpZXM7IGVudHJ5OyBlbnRyeSA9IGVudHJ5LT5uZXh0KQorICAgIGlmIChlbnRyeS0+bW9kX2lkID09IG1vZF9pZCkKKyAgICAgIHsKKwllbnRyeS0+Y291bnRlcisrOworCWJyZWFrOworICAgICAgfQorCisgIHJldHVybiBlbnRyeTsKK30KKworLyogTG9va3VwIGEgbW9kdWxlIHNwZWNpZmljYXRpb24uICBBZnRlciBhIHN1Y2Nlc3NmdWxsIGxvb2t1cCwgdGhlCisgICBtb2R1bGUgaGFzIGl0J3MgcmVzb3VyY2UgY291bnRlciBpbmNyZW1lbnRlZC4gIEZVTkMgaXMgYSBmdW5jdGlvbgorICAgcHJvdmlkZWQgYnkgdGhlIGNhbGxlciwgd2hpY2ggaXMgcmVzcG9uc2libGUgZm9yIGlkZW50aWZ5aW5nIHRoZQorICAgd2FudGVkIG1vZHVsZS4gICovCitnY3J5X21vZHVsZV90IAorX2djcnlfbW9kdWxlX2xvb2t1cCAoZ2NyeV9tb2R1bGVfdCBlbnRyaWVzLCB2b2lkICpkYXRhLAorCQkgICAgIGdjcnlfbW9kdWxlX2xvb2t1cF90IGZ1bmMpCit7CisgIGdjcnlfbW9kdWxlX3QgZW50cnk7CisKKyAgZm9yIChlbnRyeSA9IGVudHJpZXM7IGVudHJ5OyBlbnRyeSA9IGVudHJ5LT5uZXh0KQorICAgIGlmICgoKmZ1bmMpIChlbnRyeS0+c3BlYywgZGF0YSkpCisgICAgICB7CisJZW50cnktPmNvdW50ZXIrKzsKKwlicmVhazsKKyAgICAgIH0KKworICByZXR1cm4gZW50cnk7Cit9CisKKy8qIFJlbGVhc2UgYSBtb2R1bGUuICBJbiBjYXNlIHRoZSB1c2UtY291bnRlciByZWFjaGVzIHplcm8sIGRlc3Ryb3kKKyAgIHRoZSBtb2R1bGUuICBQYXNzaW5nIE1PRFVMRSBhcyBOVUxMIGlzIGEgZHVtbXkgb3BlcmF0aW9uIChzaW1pbGFyCisgICB0byBmcmVlKCkpLiAqLwordm9pZAorX2djcnlfbW9kdWxlX3JlbGVhc2UgKGdjcnlfbW9kdWxlX3QgbW9kdWxlKQoreworICBpZiAobW9kdWxlICYmICEgLS1tb2R1bGUtPmNvdW50ZXIpCisgICAgX2djcnlfbW9kdWxlX2Ryb3AgKG1vZHVsZSk7Cit9CisKKy8qIEFkZCBhIHJlZmVyZW5jZSB0byBhIG1vZHVsZS4gICovCit2b2lkCitfZ2NyeV9tb2R1bGVfdXNlIChnY3J5X21vZHVsZV90IG1vZHVsZSkKK3sKKyAgKyttb2R1bGUtPmNvdW50ZXI7Cit9CisKKy8qIElmIExJU1QgaXMgemVybywgd3JpdGUgdGhlIG51bWJlciBvZiBtb2R1bGVzIGlkZW50aWZpZWQgYnkgTU9EVUxFUworICAgdG8gTElTVF9MRU5HVEggYW5kIHJldHVybi4gIElmIExJU1QgaXMgbm9uLXplcm8sIHRoZSBmaXJzdAorICAgKkxJU1RfTEVOR1RIIGFsZ29yaXRobSBJRHMgYXJlIHN0b3JlZCBpbiBMSVNULCB3aGljaCBtdXN0IGJlIG9mCisgICBhY2NvcmRpbmcgc2l6ZS4gIEluIGNhc2UgdGhlcmUgYXJlIGxlc3MgY2lwaGVyIG1vZHVsZXMgdGhhbgorICAgKkxJU1RfTEVOR1RILCAqTElTVF9MRU5HVEggaXMgdXBkYXRlZCB0byB0aGUgY29ycmVjdCBudW1iZXIuICAqLworZ2NyeV9lcnJfY29kZV90CitfZ2NyeV9tb2R1bGVfbGlzdCAoZ2NyeV9tb2R1bGVfdCBtb2R1bGVzLAorCQkgICBpbnQgKmxpc3QsIGludCAqbGlzdF9sZW5ndGgpCit7CisgIGdjcnlfZXJyX2NvZGVfdCBlcnIgPSBHUEdfRVJSX05PX0VSUk9SOworICBnY3J5X21vZHVsZV90IG1vZHVsZTsKKyAgaW50IGxlbmd0aCwgaTsKKworICBmb3IgKG1vZHVsZSA9IG1vZHVsZXMsIGxlbmd0aCA9IDA7IG1vZHVsZTsgbW9kdWxlID0gbW9kdWxlLT5uZXh0LCBsZW5ndGgrKyk7CisKKyAgaWYgKGxpc3QpCisgICAgeworICAgICAgaWYgKGxlbmd0aCA+ICpsaXN0X2xlbmd0aCkKKwlsZW5ndGggPSAqbGlzdF9sZW5ndGg7CisKKyAgICAgIGZvciAobW9kdWxlID0gbW9kdWxlcywgaSA9IDA7IGkgPCBsZW5ndGg7IG1vZHVsZSA9IG1vZHVsZS0+bmV4dCwgaSsrKQorCWxpc3RbaV0gPSBtb2R1bGUtPm1vZF9pZDsKKworICAgICAgaWYgKGxlbmd0aCA8ICpsaXN0X2xlbmd0aCkKKwkqbGlzdF9sZW5ndGggPSBsZW5ndGg7CisgICAgfQorICBlbHNlCisgICAgKmxpc3RfbGVuZ3RoID0gbGVuZ3RoOworCisgIHJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvc3JjL21waS5oIGIvbGliZ2NyeXB0LTEuNC42L3NyYy9tcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjMwYzNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L3NyYy9tcGkuaApAQCAtMCwwICsxLDI2MiBAQAorLyogbXBpLmggIC0gIE11bHRpIFByZWNpc2lvbiBJbnRlZ2VycworICogQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk2LCAxOTk4LAorICogICAgICAgICAgICAgICAyMDAxLCAyMDAyLCAyMDAzLCAyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIGdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqCisgKiBOb3RlOiBUaGlzIGNvZGUgaXMgaGVhdmlseSBiYXNlZCBvbiB0aGUgR05VIE1QIExpYnJhcnkuCisgKgkgQWN0dWFsbHkgaXQncyB0aGUgc2FtZSBjb2RlIHdpdGggb25seSBtaW5vciBjaGFuZ2VzIGluIHRoZQorICoJIHdheSB0aGUgZGF0YSBpcyBzdG9yZWQ7IHRoaXMgaXMgdG8gc3VwcG9ydCB0aGUgYWJzdHJhY3Rpb24KKyAqCSBvZiBhbiBvcHRpb25hbCBzZWN1cmUgbWVtb3J5IGFsbG9jYXRpb24gd2hpY2ggbWF5IGJlIHVzZWQKKyAqCSB0byBhdm9pZCByZXZlYWxpbmcgb2Ygc2Vuc2l0aXZlIGRhdGEgZHVlIHRvIHBhZ2luZyBldGMuCisgKi8KKworI2lmbmRlZiBHMTBfTVBJX0gKKyNkZWZpbmUgRzEwX01QSV9ICisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAibWVtb3J5LmgiCisjaW5jbHVkZSAiLi4vbXBpL21waS1hc20tZGVmcy5oIgorCisjaW5jbHVkZSAiZzEwbGliLmgiCisKKyNpZm5kZWYgX0dDUllQVF9JTl9MSUJHQ1JZUFQKKyNlcnJvciB0aGlzIGZpbGUgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbnNpZGUgbGliZ2NyeXB0CisjZW5kaWYKKworI2lmbmRlZiBCSVRTX1BFUl9NUElfTElNQgorI2lmIEJZVEVTX1BFUl9NUElfTElNQiA9PSBTSVpFT0ZfVU5TSUdORURfSU5UCisgIHR5cGVkZWYgdW5zaWduZWQgaW50IG1waV9saW1iX3Q7CisgIHR5cGVkZWYgICBzaWduZWQgaW50IG1waV9saW1iX3NpZ25lZF90OworI2VsaWYgQllURVNfUEVSX01QSV9MSU1CID09IFNJWkVPRl9VTlNJR05FRF9MT05HCisgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgbXBpX2xpbWJfdDsKKyAgdHlwZWRlZiAgIHNpZ25lZCBsb25nIGludCBtcGlfbGltYl9zaWduZWRfdDsKKyNlbGlmIEJZVEVTX1BFUl9NUElfTElNQiA9PSBTSVpFT0ZfVU5TSUdORURfTE9OR19MT05HCisgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGludCBtcGlfbGltYl90OworICB0eXBlZGVmICAgc2lnbmVkIGxvbmcgbG9uZyBpbnQgbXBpX2xpbWJfc2lnbmVkX3Q7CisjZWxpZiBCWVRFU19QRVJfTVBJX0xJTUIgPT0gU0laRU9GX1VOU0lHTkVEX1NIT1JUCisgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IG1waV9saW1iX3Q7CisgIHR5cGVkZWYgICBzaWduZWQgc2hvcnQgaW50IG1waV9saW1iX3NpZ25lZF90OworI2Vsc2UKKyNlcnJvciBCWVRFU19QRVJfTVBJX0xJTUIgZG9lcyBub3QgbWF0Y2ggYW55IEMgdHlwZQorI2VuZGlmCisjZGVmaW5lIEJJVFNfUEVSX01QSV9MSU1CICAgICg4KkJZVEVTX1BFUl9NUElfTElNQikKKyNlbmRpZiAvKkJJVFNfUEVSX01QSV9MSU1CKi8KKworI2RlZmluZSBEQkdfTVBJICAgICBfZ2NyeV9nZXRfZGVidWdfZmxhZyggMiApOworCitzdHJ1Y3QgZ2NyeV9tcGkgCit7CisgIGludCBhbGxvY2VkOyAgICAgICAgIC8qIEFycmF5IHNpemUgKCMgb2YgYWxsb2NhdGVkIGxpbWJzKS4gKi8KKyAgaW50IG5saW1iczsgICAgICAgICAgLyogTnVtYmVyIG9mIHZhbGlkIGxpbWJzLiAqLworICBpbnQgc2lnbjsJICAgICAgIC8qIEluZGljYXRlcyBhIG5lZ2F0aXZlIG51bWJlciBhbmQgaXMgYWxzbyB1c2VkCisJCSAgICAgICAgICBmb3Igb3BhcXVlIE1QSXMgdG8gc3RvcmUgdGhlIGxlbmd0aC4gICovCisgIHVuc2lnbmVkIGludCBmbGFnczsgLyogQml0IDA6IEFycmF5IHRvIGJlIGFsbG9jYXRlZCBpbiBzZWN1cmUgbWVtb3J5IHNwYWNlLiovCisgICAgICAgICAgICAgICAgICAgICAgLyogQml0IDI6IHRoZSBsaW1iIGlzIGEgcG9pbnRlciB0byBzb21lIG1fYWxsb2NlZCBkYXRhLiovCisgIG1waV9saW1iX3QgKmQ7ICAgICAgLyogQXJyYXkgd2l0aCB0aGUgbGltYnMgKi8KK307CisKKyNkZWZpbmUgTVBJX05VTEwgTlVMTAorCisjZGVmaW5lIG1waV9nZXRfbmxpbWJzKGEpICAgICAoKGEpLT5ubGltYnMpCisjZGVmaW5lIG1waV9pc19uZWcoYSkJICAgICAgKChhKS0+c2lnbikKKworLyotLSBtcGl1dGlsLmMgLS0qLworCisjaWZkZWYgTV9ERUJVRworIyBkZWZpbmUgbXBpX2FsbG9jKG4pCV9nY3J5X21waV9kZWJ1Z19hbGxvYygobiksIE1fREJHSU5GTyggX19MSU5FX18gKSApCisjIGRlZmluZSBtcGlfYWxsb2Nfc2VjdXJlKG4pICBfZ2NyeV9tcGlfZGVidWdfYWxsb2Nfc2VjdXJlKChuKSwgTV9EQkdJTkZPKCBfX0xJTkVfXyApICkKKyMgZGVmaW5lIG1waV9mcmVlKGEpCV9nY3J5X21waV9kZWJ1Z19mcmVlKChhKSwgTV9EQkdJTkZPKF9fTElORV9fKSApCisjIGRlZmluZSBtcGlfcmVzaXplKGEsYikgX2djcnlfbXBpX2RlYnVnX3Jlc2l6ZSgoYSksKGIpLCBNX0RCR0lORk8oX19MSU5FX18pICkKKyMgZGVmaW5lIG1waV9jb3B5KGEpCSAgX2djcnlfbXBpX2RlYnVnX2NvcHkoKGEpLCBNX0RCR0lORk8oX19MSU5FX18pICkKKyAgZ2NyeV9tcGlfdCBfZ2NyeV9tcGlfZGVidWdfYWxsb2MoIHVuc2lnbmVkIG5saW1icywgY29uc3QgY2hhciAqaW5mbyApOworICBnY3J5X21waV90IF9nY3J5X21waV9kZWJ1Z19hbGxvY19zZWN1cmUoIHVuc2lnbmVkIG5saW1icywgY29uc3QgY2hhciAqaW5mbyApOworICB2b2lkIF9nY3J5X21waV9kZWJ1Z19mcmVlKCBnY3J5X21waV90IGEsIGNvbnN0IGNoYXIgKmluZm8gKTsKKyAgdm9pZCBfZ2NyeV9tcGlfZGVidWdfcmVzaXplKCBnY3J5X21waV90IGEsIHVuc2lnbmVkIG5saW1icywgY29uc3QgY2hhciAqaW5mbyApOworICBnY3J5X21waV90ICBfZ2NyeV9tcGlfZGVidWdfY29weSggZ2NyeV9tcGlfdCBhLCBjb25zdCBjaGFyICppbmZvCSk7CisjZWxzZQorIyBkZWZpbmUgbXBpX2FsbG9jKG4pCSAgICAgICBfZ2NyeV9tcGlfYWxsb2MoKG4pICkKKyMgZGVmaW5lIG1waV9hbGxvY19zZWN1cmUobikgIF9nY3J5X21waV9hbGxvY19zZWN1cmUoKG4pICkKKyMgZGVmaW5lIG1waV9mcmVlKGEpCSAgICAgICBfZ2NyeV9tcGlfZnJlZSgoYSkgKQorIyBkZWZpbmUgbXBpX3Jlc2l6ZShhLGIpICAgICAgX2djcnlfbXBpX3Jlc2l6ZSgoYSksKGIpKQorIyBkZWZpbmUgbXBpX2NvcHkoYSkJICAgICAgIF9nY3J5X21waV9jb3B5KChhKSkKKyAgZ2NyeV9tcGlfdCAgX2djcnlfbXBpX2FsbG9jKCB1bnNpZ25lZCBubGltYnMgKTsKKyAgZ2NyeV9tcGlfdCAgX2djcnlfbXBpX2FsbG9jX3NlY3VyZSggdW5zaWduZWQgbmxpbWJzICk7CisgIHZvaWQgX2djcnlfbXBpX2ZyZWUoIGdjcnlfbXBpX3QgYSApOworICB2b2lkIF9nY3J5X21waV9yZXNpemUoIGdjcnlfbXBpX3QgYSwgdW5zaWduZWQgbmxpbWJzICk7CisgIGdjcnlfbXBpX3QgIF9nY3J5X21waV9jb3B5KCBnY3J5X21waV90IGEgKTsKKyNlbmRpZgorCisjZGVmaW5lIG1waV9pc19vcGFxdWUoYSkgKChhKSAmJiAoKGEpLT5mbGFncyY0KSkKKyNkZWZpbmUgbXBpX2lzX3NlY3VyZShhKSAoKGEpICYmICgoYSktPmZsYWdzJjEpKQorI2RlZmluZSBtcGlfY2xlYXIoYSkgICAgICAgICAgX2djcnlfbXBpX2NsZWFyICgoYSkpCisjZGVmaW5lIG1waV9hbGxvY19saWtlKGEpICAgICBfZ2NyeV9tcGlfYWxsb2NfbGlrZSgoYSkpICAKKyNkZWZpbmUgbXBpX3NldChhLGIpICAgICAgICAgIF9nY3J5X21waV9zZXQgKChhKSwoYikpICAgICAgICAKKyNkZWZpbmUgbXBpX3NldF91aShhLGIpICAgICAgIF9nY3J5X21waV9zZXRfdWkgKChhKSwoYikpICAgICAgCisjZGVmaW5lIG1waV9nZXRfdWkoYSxiKSAgICAgICBfZ2NyeV9tcGlfZ2V0X3VpICgoYSksKGIpKQorI2RlZmluZSBtcGlfYWxsb2Nfc2V0X3VpKGEpICAgX2djcnlfbXBpX2FsbG9jX3NldF91aSAoKGEpKQorI2RlZmluZSBtcGlfbV9jaGVjayhhKSAgICAgICAgX2djcnlfbXBpX21fY2hlY2sgKChhKSkgICAgIAorI2RlZmluZSBtcGlfc3dhcChhLGIpICAgICAgICAgX2djcnlfbXBpX3N3YXAgKChhKSwoYikpICAgICAgIAorI2RlZmluZSBtcGlfbmV3KG4pICAgICAgICAgICAgX2djcnlfbXBpX25ldyAoKG4pKQorI2RlZmluZSBtcGlfc25ldyhuKSAgICAgICAgICAgX2djcnlfbXBpX3NuZXcgKChuKSkKKwordm9pZCBfZ2NyeV9tcGlfY2xlYXIoIGdjcnlfbXBpX3QgYSApOworZ2NyeV9tcGlfdCAgX2djcnlfbXBpX2FsbG9jX2xpa2UoIGdjcnlfbXBpX3QgYSApOworZ2NyeV9tcGlfdCAgX2djcnlfbXBpX2FsbG9jX3NldF91aSggdW5zaWduZWQgbG9uZyB1KTsKK2djcnlfZXJyX2NvZGVfdCBfZ2NyeV9tcGlfZ2V0X3VpIChnY3J5X21waV90IHcsIHVsb25nICp1KTsKK3ZvaWQgX2djcnlfbXBpX21fY2hlY2soIGdjcnlfbXBpX3QgYSApOwordm9pZCBfZ2NyeV9tcGlfc3dhcCggZ2NyeV9tcGlfdCBhLCBnY3J5X21waV90IGIpOworZ2NyeV9tcGlfdCBfZ2NyeV9tcGlfbmV3ICh1bnNpZ25lZCBpbnQgbmJpdHMpOworZ2NyeV9tcGlfdCBfZ2NyeV9tcGlfc25ldyAodW5zaWduZWQgaW50IG5iaXRzKTsKKworLyotLSBtcGljb2Rlci5jIC0tKi8KK3ZvaWQgIF9nY3J5X2xvZ19tcGlkdW1wKCBjb25zdCBjaGFyICp0ZXh0LCBnY3J5X21waV90IGEgKTsKK3UzMiAgIF9nY3J5X21waV9nZXRfa2V5aWQoIGdjcnlfbXBpX3QgYSwgdTMyICprZXlpZCApOworYnl0ZSAqX2djcnlfbXBpX2dldF9idWZmZXIoIGdjcnlfbXBpX3QgYSwgdW5zaWduZWQgKm5ieXRlcywgaW50ICpzaWduICk7CitieXRlICpfZ2NyeV9tcGlfZ2V0X3NlY3VyZV9idWZmZXIoIGdjcnlfbXBpX3QgYSwgdW5zaWduZWQgKm5ieXRlcywgaW50ICpzaWduICk7Cit2b2lkICBfZ2NyeV9tcGlfc2V0X2J1ZmZlciAoIGdjcnlfbXBpX3QgYSwgY29uc3Qgdm9pZCAqYnVmZmVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcywgaW50IHNpZ24gKTsKKworI2RlZmluZSBsb2dfbXBpZHVtcCBfZ2NyeV9sb2dfbXBpZHVtcAorCisvKi0tIG1waS1hZGQuYyAtLSovCisjZGVmaW5lIG1waV9hZGRfdWkodyx1LHYpIGdjcnlfbXBpX2FkZF91aSgodyksKHUpLCh2KSkKKyNkZWZpbmUgbXBpX2FkZCh3LHUsdikgICAgZ2NyeV9tcGlfYWRkICgodyksKHUpLCh2KSkKKyNkZWZpbmUgbXBpX2FkZG0odyx1LHYsbSkgZ2NyeV9tcGlfYWRkbSAoKHcpLCh1KSwodiksKG0pKQorI2RlZmluZSBtcGlfc3ViX3VpKHcsdSx2KSBnY3J5X21waV9zdWJfdWkgKCh3KSwodSksKHYpKQorI2RlZmluZSBtcGlfc3ViKHcsdSx2KSAgICBnY3J5X21waV9zdWIgKCh3KSwodSksKHYpKQorI2RlZmluZSBtcGlfc3VibSh3LHUsdixtKSBnY3J5X21waV9zdWJtICgodyksKHUpLCh2KSwobSkpCisKKworLyotLSBtcGktbXVsLmMgLS0qLworI2RlZmluZSBtcGlfbXVsX3VpKHcsdSx2KSAgIGdjcnlfbXBpX211bF91aSAoKHcpLCh1KSwodikpCisjZGVmaW5lIG1waV9tdWxfMmV4cCh3LHUsdikgZ2NyeV9tcGlfbXVsXzJleHAgKCh3KSwodSksKHYpKQorI2RlZmluZSBtcGlfbXVsKHcsdSx2KSAgICAgIGdjcnlfbXBpX211bCAoKHcpLCh1KSwodikpCisjZGVmaW5lIG1waV9tdWxtKHcsdSx2LG0pICAgZ2NyeV9tcGlfbXVsbSAoKHcpLCh1KSwodiksKG0pKQorCisKKy8qLS0gbXBpLWRpdi5jIC0tKi8KKyNkZWZpbmUgbXBpX2ZkaXZfcl91aShhLGIsYykgICBfZ2NyeV9tcGlfZmRpdl9yX3VpKChhKSwoYiksKGMpKQorI2RlZmluZSBtcGlfZmRpdl9yKGEsYixjKSAgICAgIF9nY3J5X21waV9mZGl2X3IoKGEpLChiKSwoYykpCisjZGVmaW5lIG1waV9mZGl2X3EoYSxiLGMpICAgICAgX2djcnlfbXBpX2ZkaXZfcSgoYSksKGIpLChjKSkKKyNkZWZpbmUgbXBpX2ZkaXZfcXIoYSxiLGMsZCkgICBfZ2NyeV9tcGlfZmRpdl9xcigoYSksKGIpLChjKSwoZCkpCisjZGVmaW5lIG1waV90ZGl2X3IoYSxiLGMpICAgICAgX2djcnlfbXBpX3RkaXZfcigoYSksKGIpLChjKSkKKyNkZWZpbmUgbXBpX3RkaXZfcXIoYSxiLGMsZCkgICBfZ2NyeV9tcGlfdGRpdl9xcigoYSksKGIpLChjKSwoZCkpCisjZGVmaW5lIG1waV90ZGl2X3FfMmV4cChhLGIsYykgX2djcnlfbXBpX3RkaXZfcV8yZXhwKChhKSwoYiksKGMpKQorI2RlZmluZSBtcGlfZGl2aXNpYmxlX3VpKGEsYikgIF9nY3J5X21waV9kaXZpc2libGVfdWkoKGEpLChiKSkKKwordWxvbmcgX2djcnlfbXBpX2ZkaXZfcl91aSggZ2NyeV9tcGlfdCByZW0sIGdjcnlfbXBpX3QgZGl2aWRlbmQsIHVsb25nIGRpdmlzb3IgKTsKK3ZvaWQgIF9nY3J5X21waV9mZGl2X3IoIGdjcnlfbXBpX3QgcmVtLCBnY3J5X21waV90IGRpdmlkZW5kLCBnY3J5X21waV90IGRpdmlzb3IgKTsKK3ZvaWQgIF9nY3J5X21waV9mZGl2X3EoIGdjcnlfbXBpX3QgcXVvdCwgZ2NyeV9tcGlfdCBkaXZpZGVuZCwgZ2NyeV9tcGlfdCBkaXZpc29yICk7Cit2b2lkICBfZ2NyeV9tcGlfZmRpdl9xciggZ2NyeV9tcGlfdCBxdW90LCBnY3J5X21waV90IHJlbSwgZ2NyeV9tcGlfdCBkaXZpZGVuZCwgZ2NyeV9tcGlfdCBkaXZpc29yICk7Cit2b2lkICBfZ2NyeV9tcGlfdGRpdl9yKCBnY3J5X21waV90IHJlbSwgZ2NyeV9tcGlfdCBudW0sIGdjcnlfbXBpX3QgZGVuKTsKK3ZvaWQgIF9nY3J5X21waV90ZGl2X3FyKCBnY3J5X21waV90IHF1b3QsIGdjcnlfbXBpX3QgcmVtLCBnY3J5X21waV90IG51bSwgZ2NyeV9tcGlfdCBkZW4pOwordm9pZCAgX2djcnlfbXBpX3RkaXZfcV8yZXhwKCBnY3J5X21waV90IHcsIGdjcnlfbXBpX3QgdSwgdW5zaWduZWQgY291bnQgKTsKK2ludCAgIF9nY3J5X21waV9kaXZpc2libGVfdWkoZ2NyeV9tcGlfdCBkaXZpZGVuZCwgdWxvbmcgZGl2aXNvciApOworCisKKy8qLS0gbXBpLW1vZC5jIC0tKi8KKyNkZWZpbmUgbXBpX21vZChyLGEsbSkgICAgICAgICAgICBfZ2NyeV9tcGlfbW9kICgociksIChhKSwgKG0pKQorI2RlZmluZSBtcGlfYmFycmV0dF9pbml0KG0sZikgICAgIF9nY3J5X21waV9iYXJyZXR0X2luaXQgKChtKSwoZikpCisjZGVmaW5lIG1waV9iYXJyZXR0X2ZyZWUoYykgICAgICAgX2djcnlfbXBpX2JhcnJldHRfZnJlZSAoKGMpKQorI2RlZmluZSBtcGlfbW9kX2JhcnJldHQocixhLGMpICAgIF9nY3J5X21waV9tb2RfYmFycmV0dCAoKHIpLCAoYSksIChjKSkKKyNkZWZpbmUgbXBpX211bF9iYXJyZXR0KHIsdSx2LGMpICBfZ2NyeV9tcGlfbXVsX2JhcnJldHQgKChyKSwgKHUpLCAodiksIChjKSkKKwordm9pZCBfZ2NyeV9tcGlfbW9kIChnY3J5X21waV90IHIsIGdjcnlfbXBpX3QgZGl2aWRlbmQsIGdjcnlfbXBpX3QgZGl2aXNvcik7CisKKy8qIENvbnRleHQgdXNlZCB3aXRoIEJhcnJldHQgcmVkdWN0aW9uLiAgKi8KK3N0cnVjdCBiYXJyZXR0X2N0eF9zOwordHlwZWRlZiBzdHJ1Y3QgYmFycmV0dF9jdHhfcyAqbXBpX2JhcnJldHRfdDsKKworbXBpX2JhcnJldHRfdCBfZ2NyeV9tcGlfYmFycmV0dF9pbml0IChnY3J5X21waV90IG0sIGludCBjb3B5KTsKK3ZvaWQgX2djcnlfbXBpX2JhcnJldHRfZnJlZSAobXBpX2JhcnJldHRfdCBjdHgpOwordm9pZCBfZ2NyeV9tcGlfbW9kX2JhcnJldHQgKGdjcnlfbXBpX3QgciwgZ2NyeV9tcGlfdCB4LCBtcGlfYmFycmV0dF90IGN0eCk7Cit2b2lkIF9nY3J5X21waV9tdWxfYmFycmV0dCAoZ2NyeV9tcGlfdCB3LCBnY3J5X21waV90IHUsIGdjcnlfbXBpX3QgdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGlfYmFycmV0dF90IGN0eCk7CisKKworCisvKi0tIG1waS1nY2QuYyAtLSovCisKKy8qLS0gbXBpLW1wb3cuYyAtLSovCisjZGVmaW5lIG1waV9tdWxwb3dtKGEsYixjLGQpIF9nY3J5X21waV9tdWxwb3dtICgoYSksKGIpLChjKSwoZCkpCit2b2lkIF9nY3J5X21waV9tdWxwb3dtKCBnY3J5X21waV90IHJlcywgZ2NyeV9tcGlfdCAqYmFzZWFycmF5LCBnY3J5X21waV90ICpleHBhcnJheSwgZ2NyeV9tcGlfdCBtb2QpOworCisvKi0tIG1waS1jbXAuYyAtLSovCisjZGVmaW5lIG1waV9jbXBfdWkoYSxiKSBnY3J5X21waV9jbXBfdWkgKChhKSwoYikpCisjZGVmaW5lIG1waV9jbXAoYSxiKSAgICBnY3J5X21waV9jbXAgKChhKSwoYikpCitpbnQgZ2NyeV9tcGlfY21wX3VpKCBnY3J5X21waV90IHUsIHVsb25nIHYgKTsKK2ludCBnY3J5X21waV9jbXAoIGdjcnlfbXBpX3QgdSwgZ2NyeV9tcGlfdCB2ICk7CisKKy8qLS0gbXBpLXNjYW4uYyAtLSovCisjZGVmaW5lIG1waV90cmFpbGluZ196ZXJvcyhhKSBfZ2NyeV9tcGlfdHJhaWxpbmdfemVyb3MgKChhKSkKK2ludCAgICAgIF9nY3J5X21waV9nZXRieXRlKCBnY3J5X21waV90IGEsIHVuc2lnbmVkIGlkeCApOwordm9pZCAgICAgX2djcnlfbXBpX3B1dGJ5dGUoIGdjcnlfbXBpX3QgYSwgdW5zaWduZWQgaWR4LCBpbnQgdmFsdWUgKTsKK3Vuc2lnbmVkIF9nY3J5X21waV90cmFpbGluZ196ZXJvcyggZ2NyeV9tcGlfdCBhICk7CisKKy8qLS0gbXBpLWJpdC5jIC0tKi8KKyNkZWZpbmUgbXBpX25vcm1hbGl6ZShhKSAgICAgICBfZ2NyeV9tcGlfbm9ybWFsaXplICgoYSkpCisjZGVmaW5lIG1waV9nZXRfbmJpdHMoYSkgICAgICAgZ2NyeV9tcGlfZ2V0X25iaXRzICgoYSkpCisjZGVmaW5lIG1waV90ZXN0X2JpdChhLGIpICAgICAgZ2NyeV9tcGlfdGVzdF9iaXQgKChhKSwoYikpCisjZGVmaW5lIG1waV9zZXRfYml0KGEsYikgICAgICAgZ2NyeV9tcGlfc2V0X2JpdCAoKGEpLChiKSkKKyNkZWZpbmUgbXBpX3NldF9oaWdoYml0KGEsYikgICBnY3J5X21waV9zZXRfaGlnaGJpdCAoKGEpLChiKSkKKyNkZWZpbmUgbXBpX2NsZWFyX2JpdChhLGIpICAgICBnY3J5X21waV9jbGVhcl9iaXQgKChhKSwoYikpCisjZGVmaW5lIG1waV9jbGVhcl9oaWdoYml0KGEsYikgZ2NyeV9tcGlfY2xlYXJfaGlnaGJpdCAoKGEpLChiKSkKKyNkZWZpbmUgbXBpX3JzaGlmdChhLGIsYykgICAgICBnY3J5X21waV9yc2hpZnQgKChhKSwoYiksKGMpKQorI2RlZmluZSBtcGlfbHNoaWZ0KGEsYixjKSAgICAgIGdjcnlfbXBpX2xzaGlmdCAoKGEpLChiKSwoYykpCisKK3ZvaWQgX2djcnlfbXBpX25vcm1hbGl6ZSggZ2NyeV9tcGlfdCBhICk7CisKKy8qLS0gbXBpLWludi5jIC0tKi8KKyNkZWZpbmUgbXBpX2ludm0oYSxiLGMpIF9nY3J5X21waV9pbnZtICgoYSksKGIpLChjKSkKKworLyotLSBlYy5jIC0tKi8KKworLyogT2JqZWN0IHRvIHJlcHJlc2VudCBhIHBvaW50IGluIHByb2plY3RpdmUgY29vcmRpbmF0ZXMuICovCitzdHJ1Y3QgbXBpX3BvaW50X3M7Cit0eXBlZGVmIHN0cnVjdCBtcGlfcG9pbnRfcyBtcGlfcG9pbnRfdDsKK3N0cnVjdCBtcGlfcG9pbnRfcworeworICBnY3J5X21waV90IHg7CisgIGdjcnlfbXBpX3QgeTsKKyAgZ2NyeV9tcGlfdCB6OworfTsKKworLyogQ29udGV4dCB1c2VkIHdpdGggZWxsaXB0aWMgY3VydmUgZnVjbnRpb25zLiAgKi8KK3N0cnVjdCBtcGlfZWNfY3R4X3M7Cit0eXBlZGVmIHN0cnVjdCBtcGlfZWNfY3R4X3MgKm1waV9lY190OworCit2b2lkIF9nY3J5X21waV9lY19wb2ludF9pbml0IChtcGlfcG9pbnRfdCAqcCk7Cit2b2lkIF9nY3J5X21waV9lY19wb2ludF9mcmVlIChtcGlfcG9pbnRfdCAqcCk7CittcGlfZWNfdCBfZ2NyeV9tcGlfZWNfaW5pdCAoZ2NyeV9tcGlfdCBwLCBnY3J5X21waV90IGEpOwordm9pZCBfZ2NyeV9tcGlfZWNfZnJlZSAobXBpX2VjX3QgY3R4KTsKK2ludCBfZ2NyeV9tcGlfZWNfZ2V0X2FmZmluZSAoZ2NyeV9tcGlfdCB4LCBnY3J5X21waV90IHksIG1waV9wb2ludF90ICpwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBpX2VjX3QgY3R4KTsKK3ZvaWQgX2djcnlfbXBpX2VjX2R1cF9wb2ludCAobXBpX3BvaW50X3QgKnJlc3VsdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1waV9wb2ludF90ICpwb2ludCwgbXBpX2VjX3QgY3R4KTsKK3ZvaWQgX2djcnlfbXBpX2VjX2FkZF9wb2ludHMgKG1waV9wb2ludF90ICpyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGlfcG9pbnRfdCAqcDEsIG1waV9wb2ludF90ICpwMiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGlfZWNfdCBjdHgpOwordm9pZCBfZ2NyeV9tcGlfZWNfbXVsX3BvaW50IChtcGlfcG9pbnRfdCAqcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X21waV90IHNjYWxhciwgbXBpX3BvaW50X3QgKnBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGlfZWNfdCBjdHgpOworCisKKworI2VuZGlmIC8qRzEwX01QSV9IKi8KZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9zcmMvc2VjbWVtLmMgYi9saWJnY3J5cHQtMS40LjYvc3JjL3NlY21lbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMmFmNTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvc3JjL3NlY21lbS5jCkBAIC0wLDAgKzEsNjg2IEBACisvKiBzZWNtZW0uYyAgLQltZW1vcnkgYWxsb2NhdGlvbiBmcm9tIGEgc2VjdXJlIGhlYXAKKyAqIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKKyAqICAgICAgICAgICAgICAgMjAwMywgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBnZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2lmIGRlZmluZWQoSEFWRV9NTE9DSykgfHwgZGVmaW5lZChIQVZFX01NQVApCisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2lmZGVmIFVTRV9DQVBBQklMSVRJRVMKKyNpbmNsdWRlIDxzeXMvY2FwYWJpbGl0eS5oPgorI2VuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgImF0aC5oIgorI2luY2x1ZGUgImcxMGxpYi5oIgorI2luY2x1ZGUgInNlY21lbS5oIgorCisjaWYgZGVmaW5lZCAoTUFQX0FOT04pICYmICEgZGVmaW5lZCAoTUFQX0FOT05ZTU9VUykKKyNkZWZpbmUgTUFQX0FOT05ZTU9VUyBNQVBfQU5PTgorI2VuZGlmCisKKyNkZWZpbmUgTUlOSU1VTV9QT09MX1NJWkUgMTYzODQKKyNkZWZpbmUgU1RBTkRBUkRfUE9PTF9TSVpFIDMyNzY4CisjZGVmaW5lIERFRkFVTFRfUEFHRV9TSVpFIDQwOTYKKwordHlwZWRlZiBzdHJ1Y3QgbWVtYmxvY2sKK3sKKyAgdW5zaWduZWQgc2l6ZTsJCS8qIFNpemUgb2YgdGhlIG1lbW9yeSBhdmFpbGFibGUgdG8gdGhlCisJCQkJICAgdXNlci4gICovCisgIGludCBmbGFnczsJCQkvKiBTZWUgYmVsb3cuICAqLworICBQUk9QRVJMWV9BTElHTkVEX1RZUEUgYWxpZ25lZDsKK30gbWVtYmxvY2tfdDsKKworLyogVGhpcyBmbGFnIHNwZWNpZmllcyB0aGF0IHRoZSBtZW1vcnkgYmxvY2sgaXMgaW4gdXNlLiAgKi8KKyNkZWZpbmUgTUJfRkxBR19BQ1RJVkUgKDEgPDwgMCkKKworLyogVGhlIHBvb2wgb2Ygc2VjdXJlIG1lbW9yeS4gICovCitzdGF0aWMgdm9pZCAqcG9vbDsKKworLyogU2l6ZSBvZiBQT09MIGluIGJ5dGVzLiAgKi8KK3N0YXRpYyBzaXplX3QgcG9vbF9zaXplOworCisvKiBUcnVlLCBpZiB0aGUgbWVtb3J5IHBvb2wgaXMgcmVhZHkgZm9yIHVzZS4gIE1heSBiZSBjaGVja2VkIGluIGFuCisgICBhdGV4aXQgZnVuY3Rpb24uICAqLworc3RhdGljIHZvbGF0aWxlIGludCBwb29sX29rYXk7CisKKy8qIFRydWUsIGlmIHRoZSBtZW1vcnkgcG9vbCBpcyBtbWFwcGVkLiAgKi8KK3N0YXRpYyB2b2xhdGlsZSBpbnQgcG9vbF9pc19tbWFwcGVkOworCisvKiBGSVhNRT8gICovCitzdGF0aWMgaW50IGRpc2FibGVfc2VjbWVtOworc3RhdGljIGludCBzaG93X3dhcm5pbmc7CitzdGF0aWMgaW50IG5vdF9sb2NrZWQ7CitzdGF0aWMgaW50IG5vX3dhcm5pbmc7CitzdGF0aWMgaW50IHN1c3BlbmRfd2FybmluZzsKKworLyogU3RhdHMuICAqLworc3RhdGljIHVuc2lnbmVkIGludCBjdXJfYWxsb2NlZCwgY3VyX2Jsb2NrczsKKworLyogTG9jayBwcm90ZWN0aW5nIGFjY2Vzc2VzIHRvIHRoZSBtZW1vcnkgcG9vbC4gICovCitzdGF0aWMgYXRoX211dGV4X3Qgc2VjbWVtX2xvY2s7CisKKy8qIENvbnZlbmllbnQgbWFjcm9zLiAgKi8KKyNkZWZpbmUgU0VDTUVNX0xPQ0sgICBhdGhfbXV0ZXhfbG9jayAgICgmc2VjbWVtX2xvY2spCisjZGVmaW5lIFNFQ01FTV9VTkxPQ0sgYXRoX211dGV4X3VubG9jayAoJnNlY21lbV9sb2NrKQorCisvKiBUaGUgc2l6ZSBvZiB0aGUgbWVtYmxvY2sgc3RydWN0dXJlOyB0aGlzIGRvZXMgbm90IGluY2x1ZGUgdGhlCisgICBtZW1vcnkgdGhhdCBpcyBhdmFpbGFibGUgdG8gdGhlIHVzZXIuICAqLworI2RlZmluZSBCTE9DS19IRUFEX1NJWkUgXAorICBvZmZzZXRvZiAobWVtYmxvY2tfdCwgYWxpZ25lZCkKKworLyogQ29udmVydCBhbiBhZGRyZXNzIGludG8gdGhlIGFjY29yZGluZyBtZW1vcnkgYmxvY2sgc3RydWN0dXJlLiAgKi8KKyNkZWZpbmUgQUREUl9UT19CTE9DSyhhZGRyKSBcCisgIChtZW1ibG9ja190ICopICgoY2hhciAqKSBhZGRyIC0gQkxPQ0tfSEVBRF9TSVpFKQorCisvKiBDaGVjayB3aGV0aGVyIFAgcG9pbnRzIGludG8gdGhlIHBvb2wuICAqLworc3RhdGljIGludAorcHRyX2ludG9fcG9vbF9wIChjb25zdCB2b2lkICpwKQoreworICAvKiBXZSBuZWVkIHRvIGNvbnZlcnQgcG9pbnRlcnMgdG8gYWRkcmVzc2VzLiAgVGhpcyBpcyByZXF1aXJlZCBieQorICAgICBDLTk5IDYuNS44IHRvIGF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvdXIuICBVc2luZyBzaXplX3QgaXMgYXQKKyAgICAgbGVhc3Qgb25seSBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkLiAgU2VlIGFsc28KKyAgICAgaHR0cDovL2xpc3RzLmdudXBnLm9yZy9waXBlcm1haWwvZ2NyeXB0LWRldmVsLzIwMDctRmVicnVhcnkvMDAxMTAyLmh0bWwKKyAgKi8KKyAgc2l6ZV90IHBfYWRkciA9IChzaXplX3QpcDsKKyAgc2l6ZV90IHBvb2xfYWRkciA9IChzaXplX3QpcG9vbDsKKworICByZXR1cm4gcF9hZGRyID49IHBvb2xfYWRkciAmJiBwX2FkZHIgPCAgcG9vbF9hZGRyK3Bvb2xfc2l6ZTsKK30KKworLyogVXBkYXRlIHRoZSBzdGF0cy4gICovCitzdGF0aWMgdm9pZAorc3RhdHNfdXBkYXRlIChzaXplX3QgYWRkLCBzaXplX3Qgc3ViKQoreworICBpZiAoYWRkKQorICAgIHsKKyAgICAgIGN1cl9hbGxvY2VkICs9IGFkZDsKKyAgICAgIGN1cl9ibG9ja3MrKzsKKyAgICB9CisgIGlmIChzdWIpCisgICAgeworICAgICAgY3VyX2FsbG9jZWQgLT0gc3ViOworICAgICAgY3VyX2Jsb2Nrcy0tOworICAgIH0KK30KKworLyogUmV0dXJuIHRoZSBibG9jayBmb2xsb3dpbmcgTUIgb3IgTlVMTCwgaWYgTUIgaXMgdGhlIGxhc3QgYmxvY2suICAqLworc3RhdGljIG1lbWJsb2NrX3QgKgorbWJfZ2V0X25leHQgKG1lbWJsb2NrX3QgKm1iKQoreworICBtZW1ibG9ja190ICptYl9uZXh0OworCisgIG1iX25leHQgPSAobWVtYmxvY2tfdCAqKSAoKGNoYXIgKikgbWIgKyBCTE9DS19IRUFEX1NJWkUgKyBtYi0+c2l6ZSk7CisgIAorICBpZiAoISBwdHJfaW50b19wb29sX3AgKG1iX25leHQpKQorICAgIG1iX25leHQgPSBOVUxMOworCisgIHJldHVybiBtYl9uZXh0OworfQorCisvKiBSZXR1cm4gdGhlIGJsb2NrIHByZWNlZWRpbmcgTUIgb3IgTlVMTCwgaWYgTUIgaXMgdGhlIGZpcnN0CisgICBibG9jay4gICovCitzdGF0aWMgbWVtYmxvY2tfdCAqCittYl9nZXRfcHJldiAobWVtYmxvY2tfdCAqbWIpCit7CisgIG1lbWJsb2NrX3QgKm1iX3ByZXYsICptYl9uZXh0OworCisgIGlmIChtYiA9PSBwb29sKQorICAgIG1iX3ByZXYgPSBOVUxMOworICBlbHNlCisgICAgeworICAgICAgbWJfcHJldiA9IChtZW1ibG9ja190ICopIHBvb2w7CisgICAgICB3aGlsZSAoMSkKKwl7CisJICBtYl9uZXh0ID0gbWJfZ2V0X25leHQgKG1iX3ByZXYpOworCSAgaWYgKG1iX25leHQgPT0gbWIpCisJICAgIGJyZWFrOworCSAgZWxzZQorCSAgICBtYl9wcmV2ID0gbWJfbmV4dDsKKwl9CisgICAgfQorCisgIHJldHVybiBtYl9wcmV2OworfQorCisvKiBJZiB0aGUgcHJlY2VlZGluZyBibG9jayBvZiBNQiBhbmQvb3IgdGhlIGZvbGxvd2luZyBibG9jayBvZiBNQgorICAgZXhpc3QgYW5kIGFyZSBub3QgYWN0aXZlLCBtZXJnZSB0aGVtIHRvIGZvcm0gYSBiaWdnZXIgYmxvY2suICAqLworc3RhdGljIHZvaWQKK21iX21lcmdlIChtZW1ibG9ja190ICptYikKK3sKKyAgbWVtYmxvY2tfdCAqbWJfcHJldiwgKm1iX25leHQ7CisKKyAgbWJfcHJldiA9IG1iX2dldF9wcmV2IChtYik7CisgIG1iX25leHQgPSBtYl9nZXRfbmV4dCAobWIpOworCisgIGlmIChtYl9wcmV2ICYmICghIChtYl9wcmV2LT5mbGFncyAmIE1CX0ZMQUdfQUNUSVZFKSkpCisgICAgeworICAgICAgbWJfcHJldi0+c2l6ZSArPSBCTE9DS19IRUFEX1NJWkUgKyBtYi0+c2l6ZTsKKyAgICAgIG1iID0gbWJfcHJldjsKKyAgICB9CisgIGlmIChtYl9uZXh0ICYmICghIChtYl9uZXh0LT5mbGFncyAmIE1CX0ZMQUdfQUNUSVZFKSkpCisgICAgbWItPnNpemUgKz0gQkxPQ0tfSEVBRF9TSVpFICsgbWJfbmV4dC0+c2l6ZTsKK30KKworLyogUmV0dXJuIGEgbmV3IGJsb2NrLCB3aGljaCBjYW4gaG9sZCBTSVpFIGJ5dGVzLiAgKi8KK3N0YXRpYyBtZW1ibG9ja190ICoKK21iX2dldF9uZXcgKG1lbWJsb2NrX3QgKmJsb2NrLCBzaXplX3Qgc2l6ZSkKK3sKKyAgbWVtYmxvY2tfdCAqbWIsICptYl9zcGxpdDsKKyAgCisgIGZvciAobWIgPSBibG9jazsgcHRyX2ludG9fcG9vbF9wIChtYik7IG1iID0gbWJfZ2V0X25leHQgKG1iKSkKKyAgICBpZiAoISAobWItPmZsYWdzICYgTUJfRkxBR19BQ1RJVkUpICYmIG1iLT5zaXplID49IHNpemUpCisgICAgICB7CisJLyogRm91bmQgYSBmcmVlIGJsb2NrLiAgKi8KKwltYi0+ZmxhZ3MgfD0gTUJfRkxBR19BQ1RJVkU7CisKKwlpZiAobWItPnNpemUgLSBzaXplID4gQkxPQ0tfSEVBRF9TSVpFKQorCSAgeworCSAgICAvKiBTcGxpdCBibG9jay4gICovCisJICAKKwkgICAgbWJfc3BsaXQgPSAobWVtYmxvY2tfdCAqKSAoKChjaGFyICopIG1iKSArIEJMT0NLX0hFQURfU0laRSArIHNpemUpOworCSAgICBtYl9zcGxpdC0+c2l6ZSA9IG1iLT5zaXplIC0gc2l6ZSAtIEJMT0NLX0hFQURfU0laRTsKKwkgICAgbWJfc3BsaXQtPmZsYWdzID0gMDsKKworCSAgICBtYi0+c2l6ZSA9IHNpemU7CisKKwkgICAgbWJfbWVyZ2UgKG1iX3NwbGl0KTsKKworCSAgfQorCisJYnJlYWs7CisgICAgICB9CisKKyAgaWYgKCEgcHRyX2ludG9fcG9vbF9wIChtYikpCisgICAgbWIgPSBOVUxMOworCisgIHJldHVybiBtYjsKK30KKworLyogUHJpbnQgYSB3YXJuaW5nIG1lc3NhZ2UuICAqLworc3RhdGljIHZvaWQKK3ByaW50X3dhcm4gKHZvaWQpCit7CisgIGlmICghbm9fd2FybmluZykKKyAgICBsb2dfaW5mbyAoXygiV2FybmluZzogdXNpbmcgaW5zZWN1cmUgbWVtb3J5IVxuIikpOworfQorCisvKiBMb2NrIHRoZSBtZW1vcnkgcGFnZXMgaW50byBjb3JlIGFuZCBkcm9wIHByaXZpbGVnZXMuICAqLworc3RhdGljIHZvaWQKK2xvY2tfcG9vbCAodm9pZCAqcCwgc2l6ZV90IG4pCit7CisjaWYgZGVmaW5lZChVU0VfQ0FQQUJJTElUSUVTKSAmJiBkZWZpbmVkKEhBVkVfTUxPQ0spCisgIGludCBlcnI7CisKKyAgY2FwX3NldF9wcm9jIChjYXBfZnJvbV90ZXh0ICgiY2FwX2lwY19sb2NrK2VwIikpOworICBlcnIgPSBtbG9jayAocCwgbik7CisgIGlmIChlcnIgJiYgZXJybm8pCisgICAgZXJyID0gZXJybm87CisgIGNhcF9zZXRfcHJvYyAoY2FwX2Zyb21fdGV4dCAoImNhcF9pcGNfbG9jaytwIikpOworCisgIGlmIChlcnIpCisgICAgeworICAgICAgaWYgKGVycm5vICE9IEVQRVJNCisjaWZkZWYgRUFHQUlOCS8qIE9wZW5CU0QgcmV0dXJucyB0aGlzICovCisJICAmJiBlcnJubyAhPSBFQUdBSU4KKyNlbmRpZgorI2lmZGVmIEVOT1NZUwkvKiBTb21lIFNDT3MgcmV0dXJuIHRoaXMgKGZ1bmN0aW9uIG5vdCBpbXBsZW1lbnRlZCkgKi8KKwkgICYmIGVycm5vICE9IEVOT1NZUworI2VuZGlmCisjaWZkZWYgRU5PTUVNICAvKiBMaW51eCBtaWdodCByZXR1cm4gdGhpcy4gKi8KKyAgICAgICAgICAgICYmIGVycm5vICE9IEVOT01FTQorI2VuZGlmCisJICApCisJbG9nX2Vycm9yICgiY2FuJ3QgbG9jayBtZW1vcnk6ICVzXG4iLCBzdHJlcnJvciAoZXJyKSk7CisgICAgICBzaG93X3dhcm5pbmcgPSAxOworICAgICAgbm90X2xvY2tlZCA9IDE7CisgICAgfQorCisjZWxpZiBkZWZpbmVkKEhBVkVfTUxPQ0spCisgIHVpZF90IHVpZDsKKyAgaW50IGVycjsKKworICB1aWQgPSBnZXR1aWQgKCk7CisKKyNpZmRlZiBIQVZFX0JST0tFTl9NTE9DSworICAvKiBVbmRlciBIUC9VWCBtbG9jayBzZWdmYXVsdHMgaWYgY2FsbGVkIGJ5IG5vbi1yb290LiAgTm90ZSwgd2UgaGF2ZQorICAgICBub2NoIGNoZWNrZWQgd2hldGhlciBtbG9jayBkb2VzIHJlYWxseSB3b3JrIHVuZGVyIEFJWCB3aGVyZSB3ZQorICAgICBhbHNvIGRldGVjdGVkIGEgYnJva2VuIG5sb2NrLiAgTm90ZSBmdXJ0aGVyLCB0aGF0IHVzaW5nIHBsb2NrICgpCisgICAgIGlzIG5vdCBhIGdvb2QgaWRlYSB1bmRlciBBSVguICovIAorICBpZiAodWlkKQorICAgIHsKKyAgICAgIGVycm5vID0gRVBFUk07CisgICAgICBlcnIgPSBlcnJubzsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBlcnIgPSBtbG9jayAocCwgbik7CisgICAgICBpZiAoZXJyICYmIGVycm5vKQorCWVyciA9IGVycm5vOworICAgIH0KKyNlbHNlIC8qICFIQVZFX0JST0tFTl9NTE9DSyAqLworICBlcnIgPSBtbG9jayAocCwgbik7CisgIGlmIChlcnIgJiYgZXJybm8pCisgICAgZXJyID0gZXJybm87CisjZW5kaWYgLyogIUhBVkVfQlJPS0VOX01MT0NLICovCisKKyAgaWYgKHVpZCAmJiAhIGdldGV1aWQgKCkpCisgICAgeworICAgICAgLyogY2hlY2sgdGhhdCB3ZSByZWFsbHkgZHJvcHBlZCB0aGUgcHJpdnMuCisgICAgICAgKiBOb3RlOiBzZXR1aWQoMCkgc2hvdWxkIGFsd2F5cyBmYWlsICovCisgICAgICBpZiAoc2V0dWlkICh1aWQpIHx8IGdldHVpZCAoKSAhPSBnZXRldWlkICgpIHx8ICFzZXR1aWQgKDApKQorCWxvZ19mYXRhbCAoImZhaWxlZCB0byByZXNldCB1aWQ6ICVzXG4iLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgICB9CisKKyAgaWYgKGVycikKKyAgICB7CisgICAgICBpZiAoZXJybm8gIT0gRVBFUk0KKyNpZmRlZiBFQUdBSU4JLyogT3BlbkJTRCByZXR1cm5zIHRoaXMuICovCisJICAmJiBlcnJubyAhPSBFQUdBSU4KKyNlbmRpZgorI2lmZGVmIEVOT1NZUwkvKiBTb21lIFNDT3MgcmV0dXJuIHRoaXMgKGZ1bmN0aW9uIG5vdCBpbXBsZW1lbnRlZCkuICovCisJICAmJiBlcnJubyAhPSBFTk9TWVMKKyNlbmRpZgorI2lmZGVmIEVOT01FTSAgLyogTGludXggbWlnaHQgcmV0dXJuIHRoaXMuICovCisgICAgICAgICAgICAmJiBlcnJubyAhPSBFTk9NRU0KKyNlbmRpZgorCSAgKQorCWxvZ19lcnJvciAoImNhbid0IGxvY2sgbWVtb3J5OiAlc1xuIiwgc3RyZXJyb3IgKGVycikpOworICAgICAgc2hvd193YXJuaW5nID0gMTsKKyAgICAgIG5vdF9sb2NrZWQgPSAxOworICAgIH0KKworI2VsaWYgZGVmaW5lZCAoIF9fUU5YX18gKQorICAvKiBRTlggZG9lcyBub3QgcGFnZSBhdCBhbGwsIHNvIHRoZSB3aG9sZSBzZWN1cmUgbWVtb3J5IHN0dWZmIGRvZXMKKyAgICogbm90IG1ha2UgbXVjaCBzZW5zZS4gIEhvd2V2ZXIgaXQgaXMgc3RpbGwgb2YgdXNlIGJlY2F1c2UgaXQKKyAgICogd2lwZXMgb3V0IHRoZSBtZW1vcnkgb24gYSBmcmVlKCkuCisgICAqIFRoZXJlZm9yZSBpdCBpcyBzdWZmaWNpZW50IHRvIHN1cHByZXNzIHRoZSB3YXJuaW5nCisgICAqLworI2VsaWYgZGVmaW5lZCAoSEFWRV9ET1NJU0hfU1lTVEVNKSB8fCBkZWZpbmVkIChfX0NZR1dJTl9fKQorICAgIC8qIEl0IGRvZXMgbm90IG1ha2Ugc2Vuc2UgdG8gcHJpbnQgc3VjaCBhIHdhcm5pbmcsIGdpdmVuIHRoZSBmYWN0IHRoYXQgCisgICAgICogdGhpcyB3aG9sZSBXaW5kb3dzICFAIyQlIGFuZCB0aGVpciB1c2VyIGJhc2UgYXJlIGluaGVyZW50bHkgaW5zZWN1cmUKKyAgICAgKi8KKyNlbGlmIGRlZmluZWQgKF9fcmlzY29zX18pCisgICAgLyogbm8gdmlydHVhbCBtZW1vcnkgb24gUklTQyBPUywgc28gbm8gcGFnZXMgYXJlIHN3YXBwZWQgdG8gZGlzYywKKyAgICAgKiBiZXNpZGVzIHdlIGRvbid0IGhhdmUgbW1hcCwgc28gd2UgZG9uJ3QgdXNlIGl0ISA7LSkKKyAgICAgKiBCdXQgZG9uJ3QgY29tcGxhaW4sIGFzIGV4cGxhaW5lZCBhYm92ZS4KKyAgICAgKi8KKyNlbHNlCisgIGxvZ19pbmZvICgiUGxlYXNlIG5vdGUgdGhhdCB5b3UgZG9uJ3QgaGF2ZSBzZWN1cmUgbWVtb3J5IG9uIHRoaXMgc3lzdGVtXG4iKTsKKyNlbmRpZgorfQorCisvKiBJbml0aWFsaXplIFBPT0wuICAqLworc3RhdGljIHZvaWQKK2luaXRfcG9vbCAoc2l6ZV90IG4pCit7CisgIHNpemVfdCBwZ3NpemU7CisgIGxvbmcgaW50IHBnc2l6ZV92YWw7CisgIG1lbWJsb2NrX3QgKm1iOworCisgIHBvb2xfc2l6ZSA9IG47CisKKyAgaWYgKGRpc2FibGVfc2VjbWVtKQorICAgIGxvZ19idWcgKCJzZWN1cmUgbWVtb3J5IGlzIGRpc2FibGVkIik7CisKKyNpZiBkZWZpbmVkKEhBVkVfU1lTQ09ORikgJiYgZGVmaW5lZChfU0NfUEFHRVNJWkUpCisgIHBnc2l6ZV92YWwgPSBzeXNjb25mIChfU0NfUEFHRVNJWkUpOworI2VsaWYgZGVmaW5lZChIQVZFX0dFVFBBR0VTSVpFKQorICBwZ3NpemVfdmFsID0gZ2V0cGFnZXNpemUgKCk7CisjZWxzZQorICBwZ3NpemVfdmFsID0gLTE7CisjZW5kaWYKKyAgcGdzaXplID0gKHBnc2l6ZV92YWwgIT0gLTEgJiYgcGdzaXplX3ZhbCA+IDApPyBwZ3NpemVfdmFsOkRFRkFVTFRfUEFHRV9TSVpFOworCisKKyNpZiBIQVZFX01NQVAKKyAgcG9vbF9zaXplID0gKHBvb2xfc2l6ZSArIHBnc2l6ZSAtIDEpICYgfihwZ3NpemUgLSAxKTsKKyNpZmRlZiBNQVBfQU5PTllNT1VTCisgIHBvb2wgPSBtbWFwICgwLCBwb29sX3NpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisJICAgICAgIE1BUF9QUklWQVRFIHwgTUFQX0FOT05ZTU9VUywgLTEsIDApOworI2Vsc2UgLyogbWFwIC9kZXYvemVybyBpbnN0ZWFkICovCisgIHsKKyAgICBpbnQgZmQ7CisKKyAgICBmZCA9IG9wZW4gKCIvZGV2L3plcm8iLCBPX1JEV1IpOworICAgIGlmIChmZCA9PSAtMSkKKyAgICAgIHsKKwlsb2dfZXJyb3IgKCJjYW4ndCBvcGVuIC9kZXYvemVybzogJXNcbiIsIHN0cmVycm9yIChlcnJubykpOworCXBvb2wgPSAodm9pZCAqKSAtMTsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisJcG9vbCA9IG1tYXAgKDAsIHBvb2xfc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1BSSVZBVEUsIGZkLCAwKTsKKyAgICAgICAgY2xvc2UgKGZkKTsKKyAgICAgIH0KKyAgfQorI2VuZGlmCisgIGlmIChwb29sID09ICh2b2lkICopIC0xKQorICAgIGxvZ19pbmZvICgiY2FuJ3QgbW1hcCBwb29sIG9mICV1IGJ5dGVzOiAlcyAtIHVzaW5nIG1hbGxvY1xuIiwKKwkgICAgICAodW5zaWduZWQpIHBvb2xfc2l6ZSwgc3RyZXJyb3IgKGVycm5vKSk7CisgIGVsc2UKKyAgICB7CisgICAgICBwb29sX2lzX21tYXBwZWQgPSAxOworICAgICAgcG9vbF9va2F5ID0gMTsKKyAgICB9CisKKyNlbmRpZgorICBpZiAoIXBvb2xfb2theSkKKyAgICB7CisgICAgICBwb29sID0gbWFsbG9jIChwb29sX3NpemUpOworICAgICAgaWYgKCFwb29sKQorCWxvZ19mYXRhbCAoImNhbid0IGFsbG9jYXRlIG1lbW9yeSBwb29sIG9mICV1IGJ5dGVzXG4iLAorCQkgICAodW5zaWduZWQpIHBvb2xfc2l6ZSk7CisgICAgICBlbHNlCisJcG9vbF9va2F5ID0gMTsKKyAgICB9CisKKyAgLyogSW5pdGlhbGl6ZSBmaXJzdCBtZW1vcnkgYmxvY2suICAqLworICBtYiA9IChtZW1ibG9ja190ICopIHBvb2w7CisgIG1iLT5zaXplID0gcG9vbF9zaXplOworICBtYi0+ZmxhZ3MgPSAwOworfQorCit2b2lkCitfZ2NyeV9zZWNtZW1fc2V0X2ZsYWdzICh1bnNpZ25lZCBmbGFncykKK3sKKyAgaW50IHdhc19zdXNwOworCisgIFNFQ01FTV9MT0NLOworCisgIHdhc19zdXNwID0gc3VzcGVuZF93YXJuaW5nOworICBub193YXJuaW5nID0gZmxhZ3MgJiBHQ1JZX1NFQ01FTV9GTEFHX05PX1dBUk5JTkc7CisgIHN1c3BlbmRfd2FybmluZyA9IGZsYWdzICYgR0NSWV9TRUNNRU1fRkxBR19TVVNQRU5EX1dBUk5JTkc7CisKKyAgLyogYW5kIG5vdyBpc3N1ZSB0aGUgd2FybmluZyBpZiBpdCBpcyBub3QgbG9uZ2VyIHN1c3BlbmRlZCAqLworICBpZiAod2FzX3N1c3AgJiYgIXN1c3BlbmRfd2FybmluZyAmJiBzaG93X3dhcm5pbmcpCisgICAgeworICAgICAgc2hvd193YXJuaW5nID0gMDsKKyAgICAgIHByaW50X3dhcm4gKCk7CisgICAgfQorCisgIFNFQ01FTV9VTkxPQ0s7Cit9CisKK3Vuc2lnbmVkIGludAorX2djcnlfc2VjbWVtX2dldF9mbGFncyAodm9pZCkKK3sKKyAgdW5zaWduZWQgZmxhZ3M7CisKKyAgU0VDTUVNX0xPQ0s7CisKKyAgZmxhZ3MgPSBub193YXJuaW5nID8gR0NSWV9TRUNNRU1fRkxBR19OT19XQVJOSU5HIDogMDsKKyAgZmxhZ3MgfD0gc3VzcGVuZF93YXJuaW5nID8gR0NSWV9TRUNNRU1fRkxBR19TVVNQRU5EX1dBUk5JTkcgOiAwOworICBmbGFncyB8PSBub3RfbG9ja2VkID8gR0NSWV9TRUNNRU1fRkxBR19OT1RfTE9DS0VEIDogMDsKKworICBTRUNNRU1fVU5MT0NLOworCisgIHJldHVybiBmbGFnczsKK30KKworCisvKiBTZWUgX2djcnlfc2VjbWVtX2luaXQuICBUaGlzIGZ1bmN0aW9uIGlzIGV4cGVjdGVkIHRvIGJlIGNhbGxlZCB3aXRoCisgICB0aGUgc2VjbWVtIGxvY2sgaGVsZC4gKi8KK3N0YXRpYyB2b2lkCitzZWNtZW1faW5pdCAoc2l6ZV90IG4pCit7CisgIGlmICghbikKKyAgICB7CisjaWZkZWYgVVNFX0NBUEFCSUxJVElFUworICAgICAgLyogZHJvcCBhbGwgY2FwYWJpbGl0aWVzICovCisgICAgICBjYXBfc2V0X3Byb2MgKGNhcF9mcm9tX3RleHQgKCJhbGwtZWlwIikpOworCisjZWxpZiAhZGVmaW5lZChIQVZFX0RPU0lTSF9TWVNURU0pCisgICAgICB1aWRfdCB1aWQ7CisKKyAgICAgIGRpc2FibGVfc2VjbWVtID0gMTsKKyAgICAgIHVpZCA9IGdldHVpZCAoKTsKKyAgICAgIGlmICh1aWQgIT0gZ2V0ZXVpZCAoKSkKKwl7CisJICBpZiAoc2V0dWlkICh1aWQpIHx8IGdldHVpZCAoKSAhPSBnZXRldWlkICgpIHx8ICFzZXR1aWQgKDApKQorCSAgICBsb2dfZmF0YWwgKCJmYWlsZWQgdG8gZHJvcCBzZXR1aWRcbiIpOworCX0KKyNlbmRpZgorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChuIDwgTUlOSU1VTV9QT09MX1NJWkUpCisJbiA9IE1JTklNVU1fUE9PTF9TSVpFOworICAgICAgaWYgKCEgcG9vbF9va2F5KQorCXsKKwkgIGluaXRfcG9vbCAobik7CisJICBsb2NrX3Bvb2wgKHBvb2wsIG4pOworCX0KKyAgICAgIGVsc2UKKwlsb2dfZXJyb3IgKCJPb3BzLCBzZWN1cmUgbWVtb3J5IHBvb2wgYWxyZWFkeSBpbml0aWFsaXplZFxuIik7CisgICAgfQorfQorCisKKworLyogSW5pdGlhbGl6ZSB0aGUgc2VjdXJlIG1lbW9yeSBzeXN0ZW0uICBJZiBydW5uaW5nIHdpdGggdGhlIG5lY2Vzc2FyeQorICAgcHJpdmlsZWdlcywgdGhlIHNlY3VyZSBtZW1vcnkgcG9vbCB3aWxsIGJlIGxvY2tlZCBpbnRvIHRoZSBjb3JlIGluCisgICBvcmRlciB0byBwcmV2ZW50IHBhZ2Utb3V0cyBvZiB0aGUgZGF0YS4gIEZ1cnRoZXJtb3JlIGFsbG9jYXRlZAorICAgc2VjdXJlIG1lbW9yeSB3aWxsIGJlIHdpcGVkIG91dCB3aGVuIHJlbGVhc2VkLiAgKi8KK3ZvaWQKK19nY3J5X3NlY21lbV9pbml0IChzaXplX3QgbikKK3sKKyAgU0VDTUVNX0xPQ0s7CisKKyAgc2VjbWVtX2luaXQgKG4pOworCisgIFNFQ01FTV9VTkxPQ0s7Cit9CisKKworc3RhdGljIHZvaWQgKgorX2djcnlfc2VjbWVtX21hbGxvY19pbnRlcm5hbCAoc2l6ZV90IHNpemUpCit7CisgIG1lbWJsb2NrX3QgKm1iOworCisgIGlmICghcG9vbF9va2F5KQorICAgIHsKKyAgICAgIC8qIFRyeSB0byBpbml0aWFsaXplIHRoZSBwb29sIGlmIHRoZSB1c2VyIGZvcmdvdCBhYm91dCBpdC4gICovCisgICAgICBzZWNtZW1faW5pdCAoU1RBTkRBUkRfUE9PTF9TSVpFKTsKKyAgICAgIGlmICghcG9vbF9va2F5KQorICAgICAgICB7CisgICAgICAgICAgbG9nX2luZm8gKF8oIm9wZXJhdGlvbiBpcyBub3QgcG9zc2libGUgd2l0aG91dCAiCisgICAgICAgICAgICAgICAgICAgICAgImluaXRpYWxpemVkIHNlY3VyZSBtZW1vcnlcbiIpKTsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgaWYgKG5vdF9sb2NrZWQgJiYgZmlwc19tb2RlICgpKQorICAgIHsKKyAgICAgIGxvZ19pbmZvIChfKCJzZWN1cmUgbWVtb3J5IHBvb2wgaXMgbm90IGxvY2tlZCB3aGlsZSBpbiBGSVBTIG1vZGVcbiIpKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgaWYgKHNob3dfd2FybmluZyAmJiAhc3VzcGVuZF93YXJuaW5nKQorICAgIHsKKyAgICAgIHNob3dfd2FybmluZyA9IDA7CisgICAgICBwcmludF93YXJuICgpOworICAgIH0KKworICAvKiBCbG9ja3MgYXJlIGFsd2F5cyBhIG11bHRpcGxlIG9mIDMyLiAqLworICBzaXplID0gKChzaXplICsgMzEpIC8gMzIpICogMzI7CisKKyAgbWIgPSBtYl9nZXRfbmV3ICgobWVtYmxvY2tfdCAqKSBwb29sLCBzaXplKTsKKyAgaWYgKG1iKQorICAgIHN0YXRzX3VwZGF0ZSAoc2l6ZSwgMCk7CisKKyAgcmV0dXJuIG1iID8gJm1iLT5hbGlnbmVkLmMgOiBOVUxMOworfQorCit2b2lkICoKK19nY3J5X3NlY21lbV9tYWxsb2MgKHNpemVfdCBzaXplKQoreworICB2b2lkICpwOworCisgIFNFQ01FTV9MT0NLOworICBwID0gX2djcnlfc2VjbWVtX21hbGxvY19pbnRlcm5hbCAoc2l6ZSk7CisgIFNFQ01FTV9VTkxPQ0s7CisgIAorICByZXR1cm4gcDsKK30KKworc3RhdGljIHZvaWQKK19nY3J5X3NlY21lbV9mcmVlX2ludGVybmFsICh2b2lkICphKQoreworICBtZW1ibG9ja190ICptYjsKKyAgaW50IHNpemU7CisKKyAgaWYgKCFhKQorICAgIHJldHVybjsKKworICBtYiA9IEFERFJfVE9fQkxPQ0sgKGEpOworICBzaXplID0gbWItPnNpemU7CisKKyAgLyogVGhpcyBkb2VzIG5vdCBtYWtlIG11Y2ggc2Vuc2U6IHByb2JhYmx5IHRoaXMgbWVtb3J5IGlzIGhlbGQgaW4gdGhlCisgICAqIGNhY2hlLiBXZSBkbyBpdCBhbnl3YXk6ICovCisjZGVmaW5lIE1CX1dJUEVfT1VUKGJ5dGUpIFwKKyAgd2lwZW1lbW9yeTIgKChtZW1ibG9ja190ICopICgoY2hhciAqKSBtYiArIEJMT0NLX0hFQURfU0laRSksIChieXRlKSwgc2l6ZSk7CisKKyAgTUJfV0lQRV9PVVQgKDB4ZmYpOworICBNQl9XSVBFX09VVCAoMHhhYSk7CisgIE1CX1dJUEVfT1VUICgweDU1KTsKKyAgTUJfV0lQRV9PVVQgKDB4MDApOworCisgIHN0YXRzX3VwZGF0ZSAoMCwgc2l6ZSk7CisKKyAgbWItPmZsYWdzICY9IH5NQl9GTEFHX0FDVElWRTsKKworICAvKiBVcGRhdGUgc3RhdHMuICAqLworCisgIG1iX21lcmdlIChtYik7Cit9CisKKy8qIFdpcGUgb3V0IGFuZCByZWxlYXNlIG1lbW9yeS4gICovCit2b2lkCitfZ2NyeV9zZWNtZW1fZnJlZSAodm9pZCAqYSkKK3sKKyAgU0VDTUVNX0xPQ0s7CisgIF9nY3J5X3NlY21lbV9mcmVlX2ludGVybmFsIChhKTsKKyAgU0VDTUVNX1VOTE9DSzsKK30KKworLyogUmVhbGxvYyBtZW1vcnkuICAqLwordm9pZCAqCitfZ2NyeV9zZWNtZW1fcmVhbGxvYyAodm9pZCAqcCwgc2l6ZV90IG5ld3NpemUpCit7CisgIG1lbWJsb2NrX3QgKm1iOworICBzaXplX3Qgc2l6ZTsKKyAgdm9pZCAqYTsKKworICBTRUNNRU1fTE9DSzsKKworICBtYiA9IChtZW1ibG9ja190ICopICgoY2hhciAqKSBwIC0gKChzaXplX3QpICYoKG1lbWJsb2NrX3QgKikgMCktPmFsaWduZWQuYykpOworICBzaXplID0gbWItPnNpemU7CisgIGlmIChuZXdzaXplIDwgc2l6ZSkKKyAgICB7CisgICAgICAvKiBJdCBpcyBlYXNpZXIgdG8gbm90IHNocmluayB0aGUgbWVtb3J5LiAgKi8KKyAgICAgIGEgPSBwOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGEgPSBfZ2NyeV9zZWNtZW1fbWFsbG9jX2ludGVybmFsIChuZXdzaXplKTsKKyAgICAgIGlmIChhKQorCXsKKwkgIG1lbWNweSAoYSwgcCwgc2l6ZSk7CisJICBtZW1zZXQgKChjaGFyICopIGEgKyBzaXplLCAwLCBuZXdzaXplIC0gc2l6ZSk7CisJICBfZ2NyeV9zZWNtZW1fZnJlZV9pbnRlcm5hbCAocCk7CisJfQorICAgIH0KKworICBTRUNNRU1fVU5MT0NLOworCisgIHJldHVybiBhOworfQorCisKKy8qIFJldHVybiB0cnVlIGlmIFAgcG9pbnRzIGludG8gdGhlIHNlY3VyZSBtZW1vcnkgYXJlYS4gICovCitpbnQKK19nY3J5X3ByaXZhdGVfaXNfc2VjdXJlIChjb25zdCB2b2lkICpwKQoreworICByZXR1cm4gcG9vbF9va2F5ICYmIHB0cl9pbnRvX3Bvb2xfcCAocCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioKKyAqIFdhcm5pbmc6ICBUaGlzIGNvZGUgbWlnaHQgYmUgY2FsbGVkIGJ5IGFuIGludGVycnVwdCBoYW5kbGVyCisgKgkgICAgIGFuZCBmcmFua2x5LCB0aGVyZSBzaG91bGQgcmVhbGx5IGJlIHN1Y2ggYSBoYW5kbGVyLAorICoJICAgICB0byBtYWtlIHN1cmUgdGhhdCB0aGUgbWVtb3J5IGlzIHdpcGVkIG91dC4KKyAqCSAgICAgV2UgaG9wZSB0aGF0IHRoZSBPUyB3aXBlcyBvdXQgbWxvY2tlZCBtZW1vcnkgYWZ0ZXIKKyAqCSAgICAgcmVjZWl2aW5nIGEgU0lHS0lMTCAtIGl0IHJlYWxseSBzaG91bGQgZG8gc28sIG90aGVyd2lzZQorICoJICAgICB0aGVyZSBpcyBubyBjaGFuY2UgdG8gZ2V0IHRoZSBzZWN1cmUgbWVtb3J5IGNsZWFuZWQuCisgKi8KK3ZvaWQKK19nY3J5X3NlY21lbV90ZXJtICgpCit7CisgIGlmICghcG9vbF9va2F5KQorICAgIHJldHVybjsKKworICB3aXBlbWVtb3J5MiAocG9vbCwgMHhmZiwgcG9vbF9zaXplKTsKKyAgd2lwZW1lbW9yeTIgKHBvb2wsIDB4YWEsIHBvb2xfc2l6ZSk7CisgIHdpcGVtZW1vcnkyIChwb29sLCAweDU1LCBwb29sX3NpemUpOworICB3aXBlbWVtb3J5MiAocG9vbCwgMHgwMCwgcG9vbF9zaXplKTsKKyNpZiBIQVZFX01NQVAKKyAgaWYgKHBvb2xfaXNfbW1hcHBlZCkKKyAgICBtdW5tYXAgKHBvb2wsIHBvb2xfc2l6ZSk7CisjZW5kaWYKKyAgcG9vbCA9IE5VTEw7CisgIHBvb2xfb2theSA9IDA7CisgIHBvb2xfc2l6ZSA9IDA7CisgIG5vdF9sb2NrZWQgPSAwOworfQorCisKK3ZvaWQKK19nY3J5X3NlY21lbV9kdW1wX3N0YXRzICgpCit7CisjaWYgMSAKKyAgU0VDTUVNX0xPQ0s7CisKKyBpZiAocG9vbF9va2F5KQorICAgIGxvZ19pbmZvICgic2VjbWVtIHVzYWdlOiAldS8lbHUgYnl0ZXMgaW4gJXUgYmxvY2tzXG4iLAorCSAgICAgIGN1cl9hbGxvY2VkLCAodW5zaWduZWQgbG9uZylwb29sX3NpemUsIGN1cl9ibG9ja3MpOworICBTRUNNRU1fVU5MT0NLOworI2Vsc2UKKyAgbWVtYmxvY2tfdCAqbWI7CisgIGludCBpOworCisgIFNFQ01FTV9MT0NLOworCisgIGZvciAoaSA9IDAsIG1iID0gKG1lbWJsb2NrX3QgKikgcG9vbDsKKyAgICAgICBwdHJfaW50b19wb29sX3AgKG1iKTsKKyAgICAgICBtYiA9IG1iX2dldF9uZXh0IChtYiksIGkrKykKKyAgICBsb2dfaW5mbyAoIlNFQ01FTTogWyVzXSBibG9jazogJWk7IHNpemU6ICVpXG4iLAorCSAgICAgIChtYi0+ZmxhZ3MgJiBNQl9GTEFHX0FDVElWRSkgPyAidXNlZCIgOiAiZnJlZSIsCisJICAgICAgaSwKKwkgICAgICBtYi0+c2l6ZSk7CisgIFNFQ01FTV9VTkxPQ0s7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9zcmMvc2VjbWVtLmggYi9saWJnY3J5cHQtMS40LjYvc3JjL3NlY21lbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZTE1MWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvc3JjL3NlY21lbS5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qIHNlY21lbS5oIC0gIGludGVybmFsIGRlZmluaXRpb25zIGZvciBzZWNtZW0KKyAqCUNvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBnZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKi8KKworI2lmbmRlZiBHMTBfU0VDTUVNX0gKKyNkZWZpbmUgRzEwX1NFQ01FTV9IIDEKKwordm9pZCBfZ2NyeV9zZWNtZW1faW5pdCAoc2l6ZV90IG5wb29sKTsKK3ZvaWQgX2djcnlfc2VjbWVtX3Rlcm0gKHZvaWQpOwordm9pZCAqX2djcnlfc2VjbWVtX21hbGxvYyAoc2l6ZV90IHNpemUpIF9HQ1JZX0dDQ19BVFRSX01BTExPQzsKK3ZvaWQgKl9nY3J5X3NlY21lbV9yZWFsbG9jICh2b2lkICphLCBzaXplX3QgbmV3c2l6ZSk7Cit2b2lkIF9nY3J5X3NlY21lbV9mcmVlICh2b2lkICphKTsKK3ZvaWQgX2djcnlfc2VjbWVtX2R1bXBfc3RhdHMgKHZvaWQpOwordm9pZCBfZ2NyeV9zZWNtZW1fc2V0X2ZsYWdzICh1bnNpZ25lZCBmbGFncyk7Cit1bnNpZ25lZCBfZ2NyeV9zZWNtZW1fZ2V0X2ZsYWdzKHZvaWQpOworaW50IF9nY3J5X3ByaXZhdGVfaXNfc2VjdXJlIChjb25zdCB2b2lkICpwKTsKKworLyogRmxhZ3MgZm9yIF9nY3J5X3NlY21lbV97c2V0LGdldH1fZmxhZ3MuICAqLworI2RlZmluZSBHQ1JZX1NFQ01FTV9GTEFHX05PX1dBUk5JTkcgICAgICAoMSA8PCAwKQorI2RlZmluZSBHQ1JZX1NFQ01FTV9GTEFHX1NVU1BFTkRfV0FSTklORyAoMSA8PCAxKQorI2RlZmluZSBHQ1JZX1NFQ01FTV9GTEFHX05PVF9MT0NLRUQgICAgICAoMSA8PCAyKQorCisjZW5kaWYgLyogRzEwX1NFQ01FTV9IICovCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvc3JjL3NleHAuYyBiL2xpYmdjcnlwdC0xLjQuNi9zcmMvc2V4cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YTRlN2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvc3JjL3NleHAuYwpAQCAtMCwwICsxLDE5NzIgQEAKKy8qIHNleHAuYyAgLSAgUy1FeHByZXNzaW9uIGhhbmRsaW5nCisgKiBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsCisgKiAgICAgICAgICAgICAgIDIwMDQsIDIwMDYsIDIwMDcsIDIwMDggIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIGdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqLworCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2RlZmluZSBHQ1JZUFRfTk9fTVBJX01BQ1JPUyAxCisjaW5jbHVkZSAiZzEwbGliLmgiCisjaW5jbHVkZSAibWVtb3J5LmgiCisKK3R5cGVkZWYgc3RydWN0IGdjcnlfc2V4cCAqTk9ERTsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgREFUQUxFTjsKKworc3RydWN0IGdjcnlfc2V4cAoreworICBieXRlIGRbMV07Cit9OworCisjZGVmaW5lIFNUX1NUT1AgIDAKKyNkZWZpbmUgU1RfREFUQSAgMSAgLyogZGF0YWxlbiBmb2xsb3dzICovCisjZGVmaW5lIFNUX0hJTlQgIDIgIC8qIGRhdGFsZW4gZm9sbG93cyAqLworI2RlZmluZSBTVF9PUEVOICAzCisjZGVmaW5lIFNUX0NMT1NFIDQKKworLyogdGhlIGF0b2kgbWFjcm9zIGFzc3VtZSB0aGF0IHRoZSBidWZmZXIgaGFzIG9ubHkgdmFsaWQgZGlnaXRzICovCisjZGVmaW5lIGF0b2lfMShwKSAgICgqKHApIC0gJzAnICkKKyNkZWZpbmUgeHRvaV8xKHApICAgKCoocCkgPD0gJzknPyAoKihwKS0gJzAnKTogXAorICAgICAgICAgICAgICAgICAgICAgKihwKSA8PSAnRic/ICgqKHApLSdBJysxMCk6KCoocCktJ2EnKzEwKSkKKyNkZWZpbmUgeHRvaV8yKHApICAgKCh4dG9pXzEocCkgKiAxNikgKyB4dG9pXzEoKHApKzEpKQorCisjZGVmaW5lIFRPS0VOX1NQRUNJQUxTICAiLS4vXzoqKz0iCisKK3N0YXRpYyBnY3J5X2Vycm9yX3QKK3NleHBfc3NjYW4gKGdjcnlfc2V4cF90ICpyZXRzZXhwLCBzaXplX3QgKmVycm9mZiwKKwkgICAgY29uc3QgY2hhciAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoLCBpbnQgYXJnZmxhZywKKwkgICAgdmFfbGlzdCBhcmdfcHRyLCB2b2lkICoqYXJnX2xpc3QpOworCisvKiBSZXR1cm4gdHJ1ZSBpZiBQIHBvaW50cyB0byBhIGJ5dGUgY29udGFpbmluZyBhIHdoaXRlc3BhY2UgYWNjb3JkaW5nCisgICB0byB0aGUgUy1leHByZXNzaW9ucyBkZWZpbml0aW9uLiAqLworI3VuZGVmIHdoaXRlc3BhY2VwCitzdGF0aWMgR1BHX0VSUl9JTkxJTkUgaW50Cit3aGl0ZXNwYWNlcCAoY29uc3QgY2hhciAqcCkKK3sgCisgIHN3aXRjaCAoKnApCisgICAgeworICAgIGNhc2UgJyAnOiBjYXNlICdcdCc6IGNhc2UgJ1x2JzogY2FzZSAnXGYnOiBjYXNlICdccic6IGNhc2UgJ1xuJzogcmV0dXJuIDE7CisgICAgZGVmYXVsdDogcmV0dXJuIDA7CisgICAgfQorfQorCisKKyNpZiAwCitzdGF0aWMgdm9pZAorZHVtcF9tcGkoIGdjcnlfbXBpX3QgYSApCit7CisgICAgY2hhciBidWZmZXJbMTAwMF07CisgICAgc2l6ZV90IG4gPSAxMDAwOworCisgICAgaWYoICFhICkKKwlmcHV0cygiW25vIE1QSV0iLCBzdGRlcnIgKTsKKyAgICBlbHNlIGlmKCBnY3J5X21waV9wcmludCggR0NSWU1QSV9GTVRfSEVYLCBidWZmZXIsICZuLCBhICkgKQorCWZwdXRzKCJbTVBJIHRvbyBsYXJnZSB0byBwcmludF0iLCBzdGRlcnIgKTsKKyAgICBlbHNlCisJZnB1dHMoIGJ1ZmZlciwgc3RkZXJyICk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQKK2R1bXBfc3RyaW5nIChjb25zdCBieXRlICpwLCBzaXplX3QgbiwgaW50IGRlbGltICkKK3sKKyAgZm9yICg7IG47IG4tLSwgcCsrICkKKyAgICB7CisgICAgICBpZiAoKCpwICYgMHg4MCkgfHwgaXNjbnRybCggKnAgKSB8fCAqcCA9PSBkZWxpbSApIAorICAgICAgICB7CisgICAgICAgICAgaWYoICpwID09ICdcbicgKQorICAgICAgICAgICAgbG9nX3ByaW50ZiAoIlxcbiIpOworICAgICAgICAgIGVsc2UgaWYoICpwID09ICdccicgKQorICAgICAgICAgICAgbG9nX3ByaW50ZiAoIlxcciIpOworICAgICAgICAgIGVsc2UgaWYoICpwID09ICdcZicgKQorICAgICAgICAgICAgbG9nX3ByaW50ZiAoIlxcZiIpOworICAgICAgICAgIGVsc2UgaWYoICpwID09ICdcdicgKQorICAgICAgICAgICAgbG9nX3ByaW50ZiAoIlxcdiIpOworCSAgICBlbHNlIGlmKCAqcCA9PSAnXGInICkKKyAgICAgICAgICAgICAgbG9nX3ByaW50ZiAoIlxcYiIpOworICAgICAgICAgIGVsc2UgaWYoICEqcCApICAgICAgIAorICAgICAgICAgICAgbG9nX3ByaW50ZiAoIlxcMCIpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxvZ19wcmludGYgKCJcXHglMDJ4IiwgKnAgKTsKKwl9CisgICAgICBlbHNlCisgICAgICAgIGxvZ19wcmludGYgKCIlYyIsICpwKTsKKyAgICB9Cit9CisKKwordm9pZAorZ2NyeV9zZXhwX2R1bXAgKGNvbnN0IGdjcnlfc2V4cF90IGEpCit7CisgIGNvbnN0IGJ5dGUgKnA7CisgIGludCBpbmRlbnQgPSAwOworICBpbnQgdHlwZTsKKworICBpZiAoIWEpCisgICAgeworICAgICAgbG9nX3ByaW50ZiAoICJbbmlsXVxuIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHAgPSBhLT5kOworICB3aGlsZSAoICh0eXBlID0gKnApICE9IFNUX1NUT1AgKQorICAgIHsKKyAgICAgIHArKzsKKyAgICAgIHN3aXRjaCAoIHR5cGUgKQorICAgICAgICB7CisgICAgICAgIGNhc2UgU1RfT1BFTjoKKyAgICAgICAgICBsb2dfcHJpbnRmICgiJSpzW29wZW5dXG4iLCAyKmluZGVudCwgIiIpOworICAgICAgICAgIGluZGVudCsrOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNUX0NMT1NFOgorICAgICAgICAgIGlmKCBpbmRlbnQgKQorICAgICAgICAgICAgaW5kZW50LS07CisgICAgICAgICAgbG9nX3ByaW50ZiAoIiUqc1tjbG9zZV1cbiIsIDIqaW5kZW50LCAiIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1RfREFUQTogeworICAgICAgICAgIERBVEFMRU4gbjsKKyAgICAgICAgICBtZW1jcHkgKCAmbiwgcCwgc2l6ZW9mIG4gKTsKKyAgICAgICAgICBwICs9IHNpemVvZiBuOworICAgICAgICAgIGxvZ19wcmludGYgKCIlKnNbZGF0YT1cIiIsIDIqaW5kZW50LCAiIiApOworICAgICAgICAgIGR1bXBfc3RyaW5nIChwLCBuLCAnXCInICk7CisgICAgICAgICAgbG9nX3ByaW50ZiAoIlwiXVxuIik7CisgICAgICAgICAgcCArPSBuOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGxvZ19wcmludGYgKCIlKnNbdW5rbm93biB0YWcgJWRdXG4iLCAyKmluZGVudCwgIiIsIHR5cGUpOworICAgICAgICAgIGJyZWFrOworCX0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqCisgKiBQYXNzIGxpc3QgdGhyb3VnaCBleGNlcHQgd2hlbiBpdCBpcyBhbiBlbXB0eSBsaXN0IC0gaW4gdGhhdCBjYXNlCisgKiByZXR1cm4gTlVMTCBhbmQgcmVsZWFzZSB0aGUgcGFzc2VkIGxpc3QuCisgKi8KK3N0YXRpYyBnY3J5X3NleHBfdAorbm9ybWFsaXplICggZ2NyeV9zZXhwX3QgbGlzdCApCit7CisgIHVuc2lnbmVkIGNoYXIgKnA7CisKKyAgaWYgKCAhbGlzdCApCisgICAgcmV0dXJuIE5VTEw7CisgIHAgPSBsaXN0LT5kOworICBpZiAoICpwID09IFNUX1NUT1AgKSAKKyAgICB7CisgICAgICAvKiB0aGlzIGlzICIiICovCisgICAgICBnY3J5X3NleHBfcmVsZWFzZSAoIGxpc3QgKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgaWYgKCAqcCA9PSBTVF9PUEVOICYmIHBbMV0gPT0gU1RfQ0xPU0UgKQorICAgIHsKKyAgICAgIC8qIHRoaXMgaXMgIigpIiAqLworICAgICAgZ2NyeV9zZXhwX3JlbGVhc2UgKCBsaXN0ICk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIAorICByZXR1cm4gbGlzdDsKK30KKworLyogQ3JlYXRlIGEgbmV3IFMtZXhwcmVzc2lvbiBvYmplY3QgYnkgcmVhZGluZyBMRU5HVEggYnl0ZXMgZnJvbQorICAgQlVGRkVSLCBhc3N1bWluZyBpdCBpcyBjYW5vbmljYWwgZW5jb2RlZCBvciBhdXRvZGV0ZWN0ZWQgZW5jb2RpbmcKKyAgIHdoZW4gQVVUT0RFVEVDVCBpcyBzZXQgdG8gMS4gIFdpdGggRlJFRUZOQyBub3QgTlVMTCwgb3duZXJzaGlwIG9mCisgICB0aGUgYnVmZmVyIGlzIHRyYW5zZmVycmVkIHRvIHRoZSBuZXdseSBjcmVhdGVkIG9iamVjdC4gIEZSRUVGTkMKKyAgIHNob3VsZCBiZSB0aGUgZnJlZWZuYyB1c2VkIHRvIHJlbGVhc2UgQlVGRkVSOyB0aGVyZSBpcyBubyBndWFyYW50ZWUKKyAgIGF0IHdoaWNoIHBvaW50IHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkOyBtb3N0IGxpa2V5IHlvdSB3YW50IHRvIHVzZQorICAgZnJlZSgpIG9yIGdjcnlfZnJlZSgpLiAKKyAKKyAgIFBhc3NpbmcgTEVOR1RIIGFuZCBBVVRPREVURUNUIGFzIDAgaXMgYWxsb3dlZCB0byBpbmRpY2F0ZSB0aGF0CisgICBCVUZGRVIgcG9pbnRzIHRvIGEgdmFsaWQgY2Fub25pY2FsIGVuY29kZWQgUy1leHByZXNzaW9uLiAgQSBMRU5HVEgKKyAgIG9mIDAgYW5kIEFVVE9ERVRFQ1QgMSBpbmRpY2F0ZXMgdGhhdCBidWZmZXIgcG9pbnRzIHRvIGEKKyAgIG51bGwtdGVybWluYXRlZCBzdHJpbmcuCisgIAorICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIDAgYW5kIGFuZCB0aGUgcG9pbnRlciB0byB0aGUgbmV3IG9iamVjdCBpbgorICAgUkVUU0VYUCBvciBhbiBlcnJvciBjb2RlIGluIHdoaWNoIGNhc2UgUkVUU0VYUCBpcyBzZXQgdG8gTlVMTC4gICovCitnY3J5X2Vycm9yX3QKK2djcnlfc2V4cF9jcmVhdGUgKGdjcnlfc2V4cF90ICpyZXRzZXhwLCB2b2lkICpidWZmZXIsIHNpemVfdCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICBpbnQgYXV0b2RldGVjdCwgdm9pZCAoKmZyZWVmbmMpKHZvaWQqKSApCit7CisgIGdjcnlfZXJyb3JfdCBlcnJjb2RlOworICBnY3J5X3NleHBfdCBzZTsKKyAgdm9sYXRpbGUgdmFfbGlzdCBkdW1teV9hcmdfcHRyOworCisgIGlmICghcmV0c2V4cCkKKyAgICByZXR1cm4gZ2NyeV9lcnJvciAoR1BHX0VSUl9JTlZfQVJHKTsKKyAgKnJldHNleHAgPSBOVUxMOworICBpZiAoYXV0b2RldGVjdCA8IDAgfHwgYXV0b2RldGVjdCA+IDEgfHwgIWJ1ZmZlcikKKyAgICByZXR1cm4gZ2NyeV9lcnJvciAoR1BHX0VSUl9JTlZfQVJHKTsKKworICBpZiAoIWxlbmd0aCAmJiAhYXV0b2RldGVjdCkKKyAgICB7IC8qIFdoYXQgYSBicmF2ZSBjYWxsZXIgdG8gYXNzdW1lIHRoYXQgdGhlcmUgaXMgcmVhbGx5IGEgY2Fub25pY2FsCisgICAgICAgICBlbmNvZGVkIFMtZXhwcmVzc2lvbiBpbiBidWZmZXIgKi8KKyAgICAgIGxlbmd0aCA9IGdjcnlfc2V4cF9jYW5vbl9sZW4gKGJ1ZmZlciwgMCwgTlVMTCwgJmVycmNvZGUpOworICAgICAgaWYgKCFsZW5ndGgpCisgICAgICAgIHJldHVybiBlcnJjb2RlOworICAgIH0KKyAgZWxzZSBpZiAoIWxlbmd0aCAmJiBhdXRvZGV0ZWN0KQorICAgIHsgLyogYnVmZmVyIGlzIGEgc3RyaW5nICovCisgICAgICBsZW5ndGggPSBzdHJsZW4gKChjaGFyICopYnVmZmVyKTsKKyAgICB9CisKKyAgZXJyY29kZSA9IHNleHBfc3NjYW4gKCZzZSwgTlVMTCwgYnVmZmVyLCBsZW5ndGgsIDAsIGR1bW15X2FyZ19wdHIsIE5VTEwpOworICBpZiAoZXJyY29kZSkKKyAgICByZXR1cm4gZXJyY29kZTsKKworICAqcmV0c2V4cCA9IHNlOworICBpZiAoZnJlZWZuYykKKyAgICB7CisgICAgICAvKiBGb3Igbm93IHdlIHJlbGVhc2UgdGhlIGJ1ZmZlciBpbW1lZGlhdGVseS4gIEFzIHNvb24gYXMgd2UKKyAgICAgICAgIGhhdmUgY2hhbmdlZCB0aGUgaW50ZXJuYWwgcmVwcmVzZW5hdGlvbiBvZiBTLWV4cHJlc3Npb24gdG8KKyAgICAgICAgIHRoZSBjYW5vbmNpYWwgZm9ybWF0IC0gd2hpY2ggaGFzIHRoZSBhZHZhbnRhZ2Ugb2YgZmFzdGVyCisgICAgICAgICBwYXJzaW5nIC0gd2Ugd2lsbCB1c2UgdGhpcyBmdW5jdGlvbiBhcyBhIGNsb3N1cmUgaW4gb3VyCisgICAgICAgICBHQ1JZU0VYUCBvYmplY3QgYW5kIHVzZSB0aGUgQlVGRkVSIGRpcmVjdGx5LiAgKi8KKyAgICAgIGZyZWVmbmMgKGJ1ZmZlcik7CisgICAgfQorICByZXR1cm4gZ2NyeV9lcnJvciAoR1BHX0VSUl9OT19FUlJPUik7Cit9CisKKy8qIFNhbWUgYXMgZ2NyeV9zZXhwX2NyZWF0ZSBidXQgZG9uJ3QgdHJhbnNmZXIgb3duZXJzaGlwICovCitnY3J5X2Vycm9yX3QKK2djcnlfc2V4cF9uZXcgKGdjcnlfc2V4cF90ICpyZXRzZXhwLCBjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBsZW5ndGgsCisgICAgICAgICAgICAgICBpbnQgYXV0b2RldGVjdCkKK3sKKyAgcmV0dXJuIGdjcnlfc2V4cF9jcmVhdGUgKHJldHNleHAsICh2b2lkICopYnVmZmVyLCBsZW5ndGgsIGF1dG9kZXRlY3QsIE5VTEwpOworfQorCisKKy8qKioqKioqKioqKioqKioqCisgKiBSZWxlYXNlIHJlc291cmNlIG9mIHRoZSBnaXZlbiBTRVhQIG9iamVjdC4KKyAqLwordm9pZAorZ2NyeV9zZXhwX3JlbGVhc2UoIGdjcnlfc2V4cF90IHNleHAgKQoreworICBpZiAoc2V4cCkKKyAgICB7CisgICAgICBpZiAoZ2NyeV9pc19zZWN1cmUgKHNleHApKQorICAgICAgICB7CisgICAgICAgICAgLyogRXh0cmEgcGFyYW5vaWQgd2lwaW5nLiAqLworICAgICAgICAgIGNvbnN0IGJ5dGUgKnAgPSBzZXhwLT5kOworICAgICAgICAgIGludCB0eXBlOworCisgICAgICAgICAgd2hpbGUgKCAodHlwZSA9ICpwKSAhPSBTVF9TVE9QICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgICBzd2l0Y2ggKCB0eXBlICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBTVF9PUEVOOgorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTVF9DTE9TRToKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU1RfREFUQTogCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIERBVEFMRU4gbjsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5ICggJm4sIHAsIHNpemVvZiBuICk7CisgICAgICAgICAgICAgICAgICAgIHAgKz0gc2l6ZW9mIG47CisgICAgICAgICAgICAgICAgICAgIHAgKz0gbjsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgd2lwZW1lbW9yeSAoc2V4cC0+ZCwgcCAtIHNleHAtPmQpOworICAgICAgICB9CisgICAgICBnY3J5X2ZyZWUgKCBzZXhwICk7CisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqCisgKiBNYWtlIGEgcGFpciBmcm9tIGxpc3RzIGEgYW5kIGIsIGRvbid0IHVzZSBhIG9yIGIgbGF0ZXIgb24uCisgKiBTcGVjaWFsIGJlaGF2aW91cjogIElmIG9uZSBpcyBhIHNpbmdsZSBlbGVtZW50IGxpc3Qgd2UgcHV0IHRoZQorICogZWxlbWVudCBzdHJhaWdodCBpbnRvIHRoZSBuZXcgcGFpci4KKyAqLworZ2NyeV9zZXhwX3QKK2djcnlfc2V4cF9jb25zKCBjb25zdCBnY3J5X3NleHBfdCBhLCBjb25zdCBnY3J5X3NleHBfdCBiICkKK3sKKyAgKHZvaWQpYTsKKyAgKHZvaWQpYjsKKworICAvKiBOWUk6IEltcGxlbWVudGF0aW9uIHNob3VsZCBiZSBxdWl0ZSBlYXN5IHdpdGggb3VyIG5ldyBkYXRhCisgICAgIHJlcHJlc2VudGF0aW9uICovCisgIEJVRyAoKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKworLyoqKioqKioqKioqKioqKioKKyAqIE1ha2UgYSBsaXN0IGZyb20gYWxsIGl0ZW1zIGluIHRoZSBhcnJheSB0aGUgZW5kIG9mIHRoZSBhcnJheSBpcyBtYXJrZWQKKyAqIHdpdGggYSBOVUxMLgorICovCitnY3J5X3NleHBfdAorZ2NyeV9zZXhwX2FsaXN0KCBjb25zdCBnY3J5X3NleHBfdCAqYXJyYXkgKQoreworICAodm9pZClhcnJheTsKKworICAvKiBOWUk6IEltcGxlbWVudGF0aW9uIHNob3VsZCBiZSBxdWl0ZSBlYXN5IHdpdGggb3VyIG5ldyBkYXRhCisgICAgIHJlcHJlc2VudGF0aW9uLiAqLworICBCVUcgKCk7CisgIHJldHVybiBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKgorICogTWFrZSBhIGxpc3QgZnJvbSBhbGwgaXRlbXMsIHRoZSBlbmQgb2YgbGlzdCBpcyBpbmRpY2F0ZWQgYnkgYSBOVUxMCisgKi8KK2djcnlfc2V4cF90CitnY3J5X3NleHBfdmxpc3QoIGNvbnN0IGdjcnlfc2V4cF90IGEsIC4uLiApCit7CisgICh2b2lkKWE7CisgIC8qIE5ZSTogSW1wbGVtZW50YXRpb24gc2hvdWxkIGJlIHF1aXRlIGVhc3kgd2l0aCBvdXIgbmV3IGRhdGEKKyAgICAgcmVwcmVzZW50YXRpb24uICovCisgIEJVRyAoKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKworLyoqKioqKioqKioqKioqKioKKyAqIEFwcGVuZCBuIHRvIHRoZSBsaXN0IGEKKyAqIFJldHVybnM6IGEgbmV3IGlzdCAod2hpY2ggbWF5YmUgYSkKKyAqLworZ2NyeV9zZXhwX3QKK2djcnlfc2V4cF9hcHBlbmQoIGNvbnN0IGdjcnlfc2V4cF90IGEsIGNvbnN0IGdjcnlfc2V4cF90IG4gKQoreworICAodm9pZClhOworICAodm9pZCluOworICAvKiBOWUk6IEltcGxlbWVudGF0aW9uIHNob3VsZCBiZSBxdWl0ZSBlYXN5IHdpdGggb3VyIG5ldyBkYXRhCisgICAgIHJlcHJlc2VudGF0aW9uLiAqLworICBCVUcgKCk7CisgIHJldHVybiBOVUxMOworfQorCitnY3J5X3NleHBfdAorZ2NyeV9zZXhwX3ByZXBlbmQoIGNvbnN0IGdjcnlfc2V4cF90IGEsIGNvbnN0IGdjcnlfc2V4cF90IG4gKQoreworICAodm9pZClhOworICAodm9pZCluOworICAvKiBOWUk6IEltcGxlbWVudGF0aW9uIHNob3VsZCBiZSBxdWl0ZSBlYXN5IHdpdGggb3VyIG5ldyBkYXRhCisgICAgIHJlcHJlc2VudGF0aW9uLiAqLworICBCVUcgKCk7CisgIHJldHVybiBOVUxMOworfQorCisKKworLyoqKioqKioqKioqKioqKioKKyAqIExvY2F0ZSB0b2tlbiBpbiBhIGxpc3QuIFRoZSB0b2tlbiBtdXN0IGJlIHRoZSBjYXIgb2YgYSBzdWJsaXN0LgorICogUmV0dXJuczogQSBuZXcgbGlzdCB3aXRoIHRoaXMgc3VibGlzdCBvciBOVUxMIGlmIG5vdCBmb3VuZC4KKyAqLworZ2NyeV9zZXhwX3QKK2djcnlfc2V4cF9maW5kX3Rva2VuKCBjb25zdCBnY3J5X3NleHBfdCBsaXN0LCBjb25zdCBjaGFyICp0b2ssIHNpemVfdCB0b2tsZW4gKQoreworICBjb25zdCBieXRlICpwOworICBEQVRBTEVOIG47CisgIAorICBpZiAoICFsaXN0ICkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoICF0b2tsZW4gKQorICAgIHRva2xlbiA9IHN0cmxlbih0b2spOworCisgIHAgPSBsaXN0LT5kOworICB3aGlsZSAoICpwICE9IFNUX1NUT1AgKQorICAgIHsKKyAgICAgIGlmICggKnAgPT0gU1RfT1BFTiAmJiBwWzFdID09IFNUX0RBVEEgKSAKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IGJ5dGUgKmhlYWQgPSBwOworCisgICAgICAgICAgcCArPSAyOworICAgICAgICAgIG1lbWNweSAoICZuLCBwLCBzaXplb2YgbiApOworICAgICAgICAgIHAgKz0gc2l6ZW9mIG47CisgICAgICAgICAgaWYgKCBuID09IHRva2xlbiAmJiAhbWVtY21wKCBwLCB0b2ssIHRva2xlbiApICkKKyAgICAgICAgICAgIHsgLyogZm91bmQgaXQgKi8KKyAgICAgICAgICAgICAgZ2NyeV9zZXhwX3QgbmV3bGlzdDsKKyAgICAgICAgICAgICAgYnl0ZSAqZDsKKyAgICAgICAgICAgICAgaW50IGxldmVsID0gMTsKKworICAgICAgICAgICAgICAvKiBMb29rIGZvciB0aGUgZW5kIG9mIHRoZSBsaXN0LiAgKi8KKyAgICAgICAgICAgICAgZm9yICggcCArPSBuOyBsZXZlbDsgcCsrICkgCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaWYgKCAqcCA9PSBTVF9EQVRBICkKKyAgICAgICAgICAgICAgICAgICAgeworCQkJbWVtY3B5ICggJm4sICsrcCwgc2l6ZW9mIG4gKTsKKwkJCXAgKz0gc2l6ZW9mIG4gKyBuOworCQkJcC0tOyAvKiBDb21wZW5zYXRlIGZvciBsYXRlciBpbmNyZW1lbnQuICovCisJCSAgICB9CisgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKnAgPT0gU1RfT1BFTiApIAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwrKzsKKwkJICAgIH0KKyAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAqcCA9PSBTVF9DTE9TRSApIAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwtLTsKKwkJICAgIH0KKyAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAqcCA9PSBTVF9TVE9QICkgCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBCVUcgKCk7CisJCSAgICB9CisJCX0KKyAgICAgICAgICAgICAgbiA9IHAgLSBoZWFkOworCisgICAgICAgICAgICAgIG5ld2xpc3QgPSBnY3J5X21hbGxvYyAoIHNpemVvZiAqbmV3bGlzdCArIG4gKTsKKyAgICAgICAgICAgICAgaWYgKCFuZXdsaXN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qIE5vIHdheSB0byByZXR1cm4gYW4gZXJyb3IgY29kZSwgc28gd2UgY2FuIG9ubHkKKyAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb3QgRm91bmQuICovCisgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGQgPSBuZXdsaXN0LT5kOworICAgICAgICAgICAgICBtZW1jcHkgKCBkLCBoZWFkLCBuICk7IGQgKz0gbjsKKyAgICAgICAgICAgICAgKmQrKyA9IFNUX1NUT1A7CisgICAgICAgICAgICAgIHJldHVybiBub3JtYWxpemUgKCBuZXdsaXN0ICk7CisJICAgIH0KKyAgICAgICAgICBwICs9IG47CisJfQorICAgICAgZWxzZSBpZiAoICpwID09IFNUX0RBVEEgKQorICAgICAgICB7CisgICAgICAgICAgbWVtY3B5ICggJm4sICsrcCwgc2l6ZW9mIG4gKTsgcCArPSBzaXplb2YgbjsKKyAgICAgICAgICBwICs9IG47CisJfQorICAgICAgZWxzZQorICAgICAgICBwKys7CisgICAgfQorICByZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioKKyAqIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBnaXZlbiBsaXN0CisgKi8KK2ludAorZ2NyeV9zZXhwX2xlbmd0aCggY29uc3QgZ2NyeV9zZXhwX3QgbGlzdCApCit7CisgICAgY29uc3QgYnl0ZSAqcDsKKyAgICBEQVRBTEVOIG47CisgICAgaW50IHR5cGU7CisgICAgaW50IGxlbmd0aCA9IDA7CisgICAgaW50IGxldmVsID0gMDsKKworICAgIGlmICggIWxpc3QgKQorCXJldHVybiAwOworCisgICAgcCA9IGxpc3QtPmQ7CisgICAgd2hpbGUgKCAodHlwZT0qcCkgIT0gU1RfU1RPUCApIHsKKwlwKys7CisJaWYgKCB0eXBlID09IFNUX0RBVEEgKSB7CisJICAgIG1lbWNweSAoICZuLCBwLCBzaXplb2YgbiApOworCSAgICBwICs9IHNpemVvZiBuICsgbjsKKwkgICAgaWYgKCBsZXZlbCA9PSAxICkKKwkJbGVuZ3RoKys7CisJfQorCWVsc2UgaWYgKCB0eXBlID09IFNUX09QRU4gKSB7CisJICAgIGlmICggbGV2ZWwgPT0gMSApCisJCWxlbmd0aCsrOworCSAgICBsZXZlbCsrOworCX0KKwllbHNlIGlmICggdHlwZSA9PSBTVF9DTE9TRSApIHsKKwkgICAgbGV2ZWwtLTsKKwl9CisgICAgfQorICAgIHJldHVybiBsZW5ndGg7Cit9CisKKworLyogUmV0dXJuIHRoZSBpbnRlcm5hbCBsZW5ndGhzIG9mZnNldCBvZiBMSVNULiAgVGhhdCBpcyB0aGUgc2l6ZSBvZgorICAgdGhlIGJ1ZmZlciBmcm9tIHRoZSBmaXJzdCBTVF9PUEVOLCB3aGljaCBpcyByZXRydW5lZCBhdCBSX09GRiwgdG8KKyAgIHRoZSBjb3JyZXNwb25kaW5nIFNUX0NMT1NFIGluY2x1c2l2ZS4gICovCitzdGF0aWMgc2l6ZV90CitnZXRfaW50ZXJuYWxfYnVmZmVyIChjb25zdCBnY3J5X3NleHBfdCBsaXN0LCBzaXplX3QgKnJfb2ZmKQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICpwOworICBEQVRBTEVOIG47CisgIGludCB0eXBlOworICBpbnQgbGV2ZWwgPSAwOworICAKKyAgKnJfb2ZmID0gMDsKKyAgaWYgKGxpc3QpCisgICAgeworICAgICAgcCA9IGxpc3QtPmQ7CisgICAgICB3aGlsZSAoICh0eXBlPSpwKSAhPSBTVF9TVE9QICkgCisgICAgICAgIHsKKyAgICAgICAgICBwKys7CisgICAgICAgICAgaWYgKHR5cGUgPT0gU1RfREFUQSkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIG1lbWNweSAoJm4sIHAsIHNpemVvZiBuKTsKKyAgICAgICAgICAgICAgcCArPSBzaXplb2YgbiArIG47CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBTVF9PUEVOKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoIWxldmVsKQorICAgICAgICAgICAgICAgICpyX29mZiA9IChwLTEpIC0gbGlzdC0+ZDsKKyAgICAgICAgICAgICAgbGV2ZWwrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmICggdHlwZSA9PSBTVF9DTE9TRSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGxldmVsLS07CisgICAgICAgICAgICAgIGlmICghbGV2ZWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHAgLSBsaXN0LT5kOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICByZXR1cm4gMDsgLyogTm90IGEgcHJvcGVyIGxpc3QuICAqLworfQorCisKKworLyogRXh0cmFjdCB0aGUgQ0FSIG9mIHRoZSBnaXZlbiBsaXN0LiAgTWF5IHJldHVybiBOVUxMIGZvciBiYWQgbGlzdHMKKyAgIG9yIG1lbW9yeSBmYWlsdXJlLiAgKi8KK2djcnlfc2V4cF90CitnY3J5X3NleHBfbnRoKCBjb25zdCBnY3J5X3NleHBfdCBsaXN0LCBpbnQgbnVtYmVyICkKK3sKKyAgICBjb25zdCBieXRlICpwOworICAgIERBVEFMRU4gbjsKKyAgICBnY3J5X3NleHBfdCBuZXdsaXN0OworICAgIGJ5dGUgKmQ7CisgICAgaW50IGxldmVsID0gMDsKKworICAgIGlmICggIWxpc3QgfHwgbGlzdC0+ZFswXSAhPSBTVF9PUEVOICkKKwlyZXR1cm4gTlVMTDsKKyAgICBwID0gbGlzdC0+ZDsKKworICAgIHdoaWxlICggbnVtYmVyID4gMCApIHsKKwlwKys7CisJaWYgKCAqcCA9PSBTVF9EQVRBICkgeworCSAgICBtZW1jcHkgKCAmbiwgKytwLCBzaXplb2YgbiApOworCSAgICBwICs9IHNpemVvZiBuICsgbjsKKwkgICAgcC0tOworCSAgICBpZiAoICFsZXZlbCApCisJCW51bWJlci0tOworCX0KKwllbHNlIGlmICggKnAgPT0gU1RfT1BFTiApIHsKKwkgICAgbGV2ZWwrKzsKKwl9CisJZWxzZSBpZiAoICpwID09IFNUX0NMT1NFICkgeworCSAgICBsZXZlbC0tOworCSAgICBpZiAoICFsZXZlbCApCisJCW51bWJlci0tOworCX0KKwllbHNlIGlmICggKnAgPT0gU1RfU1RPUCApIHsKKwkgICAgcmV0dXJuIE5VTEw7CisJfQorICAgIH0KKyAgICBwKys7CisKKyAgICBpZiAoICpwID09IFNUX0RBVEEgKSB7CisJbWVtY3B5ICggJm4sIHAsIHNpemVvZiBuICk7IHAgKz0gc2l6ZW9mIG47CisJbmV3bGlzdCA9IGdjcnlfbWFsbG9jICggc2l6ZW9mICpuZXdsaXN0ICsgbiArIDEgKTsKKyAgICAgICAgaWYgKCFuZXdsaXN0KQorICAgICAgICAgIHJldHVybiBOVUxMOworCWQgPSBuZXdsaXN0LT5kOworCW1lbWNweSAoIGQsIHAsIG4gKTsgZCArPSBuOworCSpkKysgPSBTVF9TVE9QOworICAgIH0KKyAgICBlbHNlIGlmICggKnAgPT0gU1RfT1BFTiApIHsKKwljb25zdCBieXRlICpoZWFkID0gcDsKKworCWxldmVsID0gMTsKKwlkbyB7CisJICAgIHArKzsKKwkgICAgaWYgKCAqcCA9PSBTVF9EQVRBICkgeworCQltZW1jcHkgKCAmbiwgKytwLCBzaXplb2YgbiApOworCQlwICs9IHNpemVvZiBuICsgbjsKKwkJcC0tOworCSAgICB9CisJICAgIGVsc2UgaWYgKCAqcCA9PSBTVF9PUEVOICkgeworCQlsZXZlbCsrOworCSAgICB9CisJICAgIGVsc2UgaWYgKCAqcCA9PSBTVF9DTE9TRSApIHsKKwkJbGV2ZWwtLTsKKwkgICAgfQorCSAgICBlbHNlIGlmICggKnAgPT0gU1RfU1RPUCApIHsKKwkJQlVHICgpOworCSAgICB9CisJfSB3aGlsZSAoIGxldmVsICk7CisJbiA9IHAgKyAxIC0gaGVhZDsKKworCW5ld2xpc3QgPSBnY3J5X21hbGxvYyAoIHNpemVvZiAqbmV3bGlzdCArIG4gKTsKKyAgICAgICAgaWYgKCFuZXdsaXN0KQorICAgICAgICAgIHJldHVybiBOVUxMOworCWQgPSBuZXdsaXN0LT5kOworCW1lbWNweSAoIGQsIGhlYWQsIG4gKTsgZCArPSBuOworCSpkKysgPSBTVF9TVE9QOworICAgIH0KKyAgICBlbHNlCisJbmV3bGlzdCA9IE5VTEw7CisKKyAgICByZXR1cm4gbm9ybWFsaXplIChuZXdsaXN0KTsKK30KKworZ2NyeV9zZXhwX3QKK2djcnlfc2V4cF9jYXIoIGNvbnN0IGdjcnlfc2V4cF90IGxpc3QgKQoreworICAgIHJldHVybiBnY3J5X3NleHBfbnRoICggbGlzdCwgMCApOworfQorCisKKy8qIEhlbHBlciB0byBnZXQgZGF0YSBmcm9tIHRoZSBjYXIuICBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgdmFsaWQgYXMKKyAgIGxvbmcgYXMgdGhlIGxpc3QgaXMgbm90IG1vZGlmaWVkLiAqLworc3RhdGljIGNvbnN0IGNoYXIgKgorc2V4cF9udGhfZGF0YSAoY29uc3QgZ2NyeV9zZXhwX3QgbGlzdCwgaW50IG51bWJlciwgc2l6ZV90ICpkYXRhbGVuKQoreworICBjb25zdCBieXRlICpwOworICBEQVRBTEVOIG47CisgIGludCBsZXZlbCA9IDA7CisgIAorICAqZGF0YWxlbiA9IDA7CisgIGlmICggIWxpc3QgKSAKKyAgICByZXR1cm4gTlVMTDsKKworICBwID0gbGlzdC0+ZDsKKyAgaWYgKCAqcCA9PSBTVF9PUEVOICkKKyAgICBwKys7CSAgICAgLyogWWVwLCBhIGxpc3QuICovCisgIGVsc2UgaWYgKG51bWJlcikKKyAgICByZXR1cm4gTlVMTDsgICAgIC8qIE5vdCBhIGxpc3QgYnV0IE4gPiAwIHJlcXVlc3RlZC4gKi8KKworICAvKiBTa2lwIG92ZXIgTiBlbGVtZW50cy4gKi8KKyAgd2hpbGUgKCBudW1iZXIgPiAwICkgCisgICAgeworICAgICAgaWYgKCAqcCA9PSBTVF9EQVRBICkgCisgICAgICAgIHsKKyAgICAgICAgICBtZW1jcHkgKCAmbiwgKytwLCBzaXplb2YgbiApOworICAgICAgICAgIHAgKz0gc2l6ZW9mIG4gKyBuOworICAgICAgICAgIHAtLTsKKyAgICAgICAgICBpZiAoICFsZXZlbCApCisgICAgICAgICAgICBudW1iZXItLTsKKwl9CisgICAgICBlbHNlIGlmICggKnAgPT0gU1RfT1BFTiApIAorICAgICAgICB7CisgICAgICAgICAgbGV2ZWwrKzsKKwl9CisgICAgICBlbHNlIGlmICggKnAgPT0gU1RfQ0xPU0UgKSAKKyAgICAgICAgeworICAgICAgICAgIGxldmVsLS07CisgICAgICAgICAgaWYgKCAhbGV2ZWwgKQorICAgICAgICAgICAgbnVtYmVyLS07CisJfQorICAgICAgZWxzZSBpZiAoICpwID09IFNUX1NUT1AgKSAKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBOVUxMOworCX0KKyAgICAgIHArKzsKKyAgICB9CisKKyAgLyogSWYgdGhpcyBpcyBkYXRhLCByZXR1cm4gaXQuICAqLworICBpZiAoICpwID09IFNUX0RBVEEgKQorICAgIHsKKyAgICAgIG1lbWNweSAoICZuLCArK3AsIHNpemVvZiBuICk7CisgICAgICAqZGF0YWxlbiA9IG47CisgICAgICByZXR1cm4gKGNvbnN0IGNoYXIqKXAgKyBzaXplb2YgbjsKKyAgICB9CisgIAorICByZXR1cm4gTlVMTDsKK30KKworCisvKiBHZXQgZGF0YSBmcm9tIHRoZSBjYXIuICBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgdmFsaWQgYXMgbG9uZyBhcyB0aGUKKyAgIGxpc3QgaXMgbm90IG1vZGlmaWVkLiAgKi8KK2NvbnN0IGNoYXIgKgorZ2NyeV9zZXhwX250aF9kYXRhIChjb25zdCBnY3J5X3NleHBfdCBsaXN0LCBpbnQgbnVtYmVyLCBzaXplX3QgKmRhdGFsZW4gKQoreworICByZXR1cm4gc2V4cF9udGhfZGF0YSAobGlzdCwgbnVtYmVyLCBkYXRhbGVuKTsKK30KKworCisvKiBHZXQgYSBzdHJpbmcgZnJvbSB0aGUgY2FyLiAgVGhlIHJldHVybmVkIHZhbHVlIGlzIGEgbWFsbG9jZWQgc3RyaW5nCisgICBhbmQgbmVlZHMgdG8gYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4gICovCitjaGFyICoKK2djcnlfc2V4cF9udGhfc3RyaW5nIChjb25zdCBnY3J5X3NleHBfdCBsaXN0LCBpbnQgbnVtYmVyKQoreworICBjb25zdCBjaGFyICpzOworICBzaXplX3QgbjsKKyAgY2hhciAqYnVmOworCisgIHMgPSBzZXhwX250aF9kYXRhIChsaXN0LCBudW1iZXIsICZuKTsKKyAgaWYgKCFzIHx8IG4gPCAxIHx8IChuKzEpIDwgMSkKKyAgICByZXR1cm4gTlVMTDsKKyAgYnVmID0gZ2NyeV9tYWxsb2MgKG4rMSk7CisgIGlmICghYnVmKQorICAgIHJldHVybiBOVUxMOworICBtZW1jcHkgKGJ1Ziwgcywgbik7CisgIGJ1ZltuXSA9IDA7CisgIHJldHVybiBidWY7Cit9CisKKy8qCisgKiBHZXQgYSBNUEkgZnJvbSB0aGUgY2FyCisgKi8KK2djcnlfbXBpX3QKK2djcnlfc2V4cF9udGhfbXBpKCBnY3J5X3NleHBfdCBsaXN0LCBpbnQgbnVtYmVyLCBpbnQgbXBpZm10ICkKK3sKKyAgY29uc3QgY2hhciAqczsKKyAgc2l6ZV90IG47CisgIGdjcnlfbXBpX3QgYTsKKworICBpZiAoICFtcGlmbXQgKQorICAgIG1waWZtdCA9IEdDUllNUElfRk1UX1NURDsKKworICBzID0gc2V4cF9udGhfZGF0YSAobGlzdCwgbnVtYmVyLCAmbik7CisgIGlmICghcykKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoIGdjcnlfbXBpX3NjYW4gKCAmYSwgbXBpZm10LCBzLCBuLCBOVUxMICkgKQorICAgIHJldHVybiBOVUxMOworCisgIHJldHVybiBhOworfQorCisKKy8qKioqKioqKioqKioqKioqCisgKiBHZXQgdGhlIENEUgorICovCitnY3J5X3NleHBfdAorZ2NyeV9zZXhwX2NkciggY29uc3QgZ2NyeV9zZXhwX3QgbGlzdCApCit7CisgICAgY29uc3QgYnl0ZSAqcDsKKyAgICBjb25zdCBieXRlICpoZWFkOworICAgIERBVEFMRU4gbjsKKyAgICBnY3J5X3NleHBfdCBuZXdsaXN0OworICAgIGJ5dGUgKmQ7CisgICAgaW50IGxldmVsID0gMDsKKyAgICBpbnQgc2tpcCA9IDE7CisKKyAgICBpZiAoICFsaXN0IHx8IGxpc3QtPmRbMF0gIT0gU1RfT1BFTiApCisJcmV0dXJuIE5VTEw7CisgICAgcCA9IGxpc3QtPmQ7CisKKyAgICB3aGlsZSAoIHNraXAgPiAwICkgeworCXArKzsKKwlpZiAoICpwID09IFNUX0RBVEEgKSB7CisJICAgIG1lbWNweSAoICZuLCArK3AsIHNpemVvZiBuICk7CisJICAgIHAgKz0gc2l6ZW9mIG4gKyBuOworCSAgICBwLS07CisJICAgIGlmICggIWxldmVsICkKKwkJc2tpcC0tOworCX0KKwllbHNlIGlmICggKnAgPT0gU1RfT1BFTiApIHsKKwkgICAgbGV2ZWwrKzsKKwl9CisJZWxzZSBpZiAoICpwID09IFNUX0NMT1NFICkgeworCSAgICBsZXZlbC0tOworCSAgICBpZiAoICFsZXZlbCApCisJCXNraXAtLTsKKwl9CisJZWxzZSBpZiAoICpwID09IFNUX1NUT1AgKSB7CisJICAgIHJldHVybiBOVUxMOworCX0KKyAgICB9CisgICAgcCsrOworCisgICAgaGVhZCA9IHA7CisgICAgbGV2ZWwgPSAwOworICAgIGRvIHsKKwlpZiAoICpwID09IFNUX0RBVEEgKSB7CisJICAgIG1lbWNweSAoICZuLCArK3AsIHNpemVvZiBuICk7CisJICAgIHAgKz0gc2l6ZW9mIG4gKyBuOworCSAgICBwLS07CisJfQorCWVsc2UgaWYgKCAqcCA9PSBTVF9PUEVOICkgeworCSAgICBsZXZlbCsrOworCX0KKwllbHNlIGlmICggKnAgPT0gU1RfQ0xPU0UgKSB7CisJICAgIGxldmVsLS07CisJfQorCWVsc2UgaWYgKCAqcCA9PSBTVF9TVE9QICkgeworCSAgICByZXR1cm4gTlVMTDsKKwl9CisJcCsrOworICAgIH0gd2hpbGUgKCBsZXZlbCApOworICAgIG4gPSBwIC0gaGVhZDsKKworICAgIG5ld2xpc3QgPSBnY3J5X21hbGxvYyAoIHNpemVvZiAqbmV3bGlzdCArIG4gKyAyICk7CisgICAgaWYgKCFuZXdsaXN0KQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgZCA9IG5ld2xpc3QtPmQ7CisgICAgKmQrKyA9IFNUX09QRU47CisgICAgbWVtY3B5ICggZCwgaGVhZCwgbiApOyBkICs9IG47CisgICAgKmQrKyA9IFNUX0NMT1NFOworICAgICpkKysgPSBTVF9TVE9QOworCisgICAgcmV0dXJuIG5vcm1hbGl6ZSAobmV3bGlzdCk7Cit9CisKK2djcnlfc2V4cF90CitnY3J5X3NleHBfY2FkciAoIGNvbnN0IGdjcnlfc2V4cF90IGxpc3QgKQoreworICAgIGdjcnlfc2V4cF90IGEsIGI7CisKKyAgICBhID0gZ2NyeV9zZXhwX2NkciAoIGxpc3QgKTsKKyAgICBiID0gZ2NyeV9zZXhwX2NhciAoIGEgKTsKKyAgICBnY3J5X3NleHBfcmVsZWFzZSAoIGEgKTsKKyAgICByZXR1cm4gYjsKK30KKworCisKK3N0YXRpYyBpbnQKK2hleHRvYnl0ZSggY29uc3QgYnl0ZSAqcyApCit7CisgICAgaW50IGM9MDsKKworICAgIGlmKCAqcyA+PSAnMCcgJiYgKnMgPD0gJzknICkKKwljID0gMTYgKiAoKnMgLSAnMCcpOworICAgIGVsc2UgaWYoICpzID49ICdBJyAmJiAqcyA8PSAnRicgKQorCWMgPSAxNiAqICgxMCArICpzIC0gJ0EnKTsKKyAgICBlbHNlIGlmKCAqcyA+PSAnYScgJiYgKnMgPD0gJ2YnICkgeworCWMgPSAxNiAqICgxMCArICpzIC0gJ2EnKTsKKyAgICB9CisgICAgcysrOworICAgIGlmKCAqcyA+PSAnMCcgJiYgKnMgPD0gJzknICkKKwljICs9ICpzIC0gJzAnOworICAgIGVsc2UgaWYoICpzID49ICdBJyAmJiAqcyA8PSAnRicgKQorCWMgKz0gMTAgKyAqcyAtICdBJzsKKyAgICBlbHNlIGlmKCAqcyA+PSAnYScgJiYgKnMgPD0gJ2YnICkgeworCWMgKz0gMTAgKyAqcyAtICdhJzsKKyAgICB9CisgICAgcmV0dXJuIGM7Cit9CisKK3N0cnVjdCBtYWtlX3NwYWNlX2N0eCB7CisgICAgZ2NyeV9zZXhwX3Qgc2V4cDsKKyAgICBzaXplX3QgYWxsb2NhdGVkOworICAgIGJ5dGUgKnBvczsKK307CisKK3N0YXRpYyBncGdfZXJyX2NvZGVfdAorbWFrZV9zcGFjZSAoIHN0cnVjdCBtYWtlX3NwYWNlX2N0eCAqYywgc2l6ZV90IG4gKQoreworICBzaXplX3QgdXNlZCA9IGMtPnBvcyAtIGMtPnNleHAtPmQ7CisgIAorICBpZiAoIHVzZWQgKyBuICsgc2l6ZW9mKERBVEFMRU4pICsgMSA+PSBjLT5hbGxvY2F0ZWQgKQorICAgIHsKKyAgICAgIGdjcnlfc2V4cF90IG5ld3NleHA7CisgICAgICBieXRlICpuZXdoZWFkOworICAgICAgc2l6ZV90IG5ld3NpemU7CisgICAgICAKKyAgICAgIG5ld3NpemUgPSBjLT5hbGxvY2F0ZWQgKyAyKihuK3NpemVvZihEQVRBTEVOKSsxKTsKKyAgICAgIGlmIChuZXdzaXplIDw9IGMtPmFsbG9jYXRlZCkKKyAgICAgICAgcmV0dXJuIEdQR19FUlJfVE9PX0xBUkdFOworICAgICAgbmV3c2V4cCA9IGdjcnlfcmVhbGxvYyAoIGMtPnNleHAsIHNpemVvZiAqbmV3c2V4cCArIG5ld3NpemUgLSAxKTsKKyAgICAgIGlmICghbmV3c2V4cCkKKyAgICAgICAgcmV0dXJuIGdwZ19lcnJfY29kZV9mcm9tX2Vycm5vIChlcnJubyk7CisgICAgICBjLT5hbGxvY2F0ZWQgPSBuZXdzaXplOworICAgICAgbmV3aGVhZCA9IG5ld3NleHAtPmQ7CisgICAgICBjLT5wb3MgPSBuZXdoZWFkICsgdXNlZDsKKyAgICAgIGMtPnNleHAgPSBuZXdzZXhwOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKKworLyogVW5xdW90ZSBTVFJJTkcgb2YgTEVOR1RIIGFuZCBzdG9yZSBpdCBpbnRvIEJVRi4gIFRoZSBzdXJyb3VuZGluZworICAgcXVvdGVzIGFyZSBtdXN0IGFscmVhZHkgYmUgcmVtb3ZlZCBmcm9tIFNUUklORy4gIFdlIGFzc3VtZSB0aGF0IHRoZQorICAgcXVvdGVkIHN0cmluZyBpcyBzeW50YWNpbGxheSBjb3JyZWN0LiAgKi8KK3N0YXRpYyBzaXplX3QKK3VucXVvdGVfc3RyaW5nIChjb25zdCBjaGFyICpzdHJpbmcsIHNpemVfdCBsZW5ndGgsIHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3sKKyAgaW50IGVzYyA9IDA7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnMgPSAoY29uc3QgdW5zaWduZWQgY2hhciopc3RyaW5nOworICB1bnNpZ25lZCBjaGFyICpkID0gYnVmOworICBzaXplX3QgbiA9IGxlbmd0aDsKKworICBmb3IgKDsgbjsgbi0tLCBzKyspCisgICAgeworICAgICAgaWYgKGVzYykKKyAgICAgICAgeworICAgICAgICAgIHN3aXRjaCAoKnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlICdiJzogICpkKysgPSAnXGInOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ3QnOiAgKmQrKyA9ICdcdCc7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAndic6ICAqZCsrID0gJ1x2JzsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICduJzogICpkKysgPSAnXG4nOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2YnOiAgKmQrKyA9ICdcZic7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAncic6ICAqZCsrID0gJ1xyJzsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICciJzogICpkKysgPSAnXCInOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ1wnJzogKmQrKyA9ICdcJyc7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAnXFwnOiAqZCsrID0gJ1xcJzsgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgJ1xyJzogIC8qIGlnbm9yZSBDUlssTEZdICovCisgICAgICAgICAgICAgIGlmIChuPjEgJiYgc1sxXSA9PSAnXG4nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHMrKzsgbi0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZXNjID0gMDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgY2FzZSAnXG4nOiAgLyogaWdub3JlIExGWyxDUl0gKi8KKyAgICAgICAgICAgICAgaWYgKG4+MSAmJiBzWzFdID09ICdccicpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcysrOyBuLS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAneCc6IC8qIGhleCB2YWx1ZSAqLworICAgICAgICAgICAgICBpZiAobj4yICYmIGhleGRpZ2l0cCAocysxKSAmJiBoZXhkaWdpdHAgKHMrMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcysrOyBuLS07CisgICAgICAgICAgICAgICAgICAqZCsrID0geHRvaV8yIChzKTsKKyAgICAgICAgICAgICAgICAgIHMrKzsgbi0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIGlmIChuPjIgJiYgb2N0ZGlnaXRwIChzKSAmJiBvY3RkaWdpdHAgKHMrMSkgJiYgb2N0ZGlnaXRwIChzKzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICpkKysgPSAoYXRvaV8xIChzKSo2NCkgKyAoYXRvaV8xIChzKzEpKjgpICsgYXRvaV8xIChzKzIpOworICAgICAgICAgICAgICAgICAgcyArPSAyOworICAgICAgICAgICAgICAgICAgbiAtPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisJICAgIH0KKyAgICAgICAgICBlc2MgPSAwOworICAgICAgICB9CisgICAgICBlbHNlIGlmKCAqcyA9PSAnXFwnICkKKyAgICAgICAgZXNjID0gMTsKKyAgICAgIGVsc2UKKyAgICAgICAgKmQrKyA9ICpzOworICAgIH0gCisKKyAgcmV0dXJuIGQgLSBidWY7Cit9CisKKy8qKioqKioqKioqKioqKioqCisgKiBTY2FuIHRoZSBwcm92aWRlZCBidWZmZXIgYW5kIHJldHVybiB0aGUgUyBleHByZXNzaW9uIGluIG91ciBpbnRlcm5hbAorICogZm9ybWF0LiAgUmV0dXJucyBhIG5ld2x5IGFsbG9jYXRlZCBleHByZXNzaW9uLiAgSWYgZXJyb2ZmIGlzIG5vdCBOVUxMIGFuZAorICogYSBwYXJzaW5nIGVycm9yIGhhcyBvY2N1cmVkLCB0aGUgb2Zmc2V0IGludG8gYnVmZmVyIHdpbGwgYmUgcmV0dXJuZWQuCisgKiBJZiBBUkdGTEFHIGlzIHRydWUsIHRoZSBmdW5jdGlvbiBzdXBwb3J0cyBzb21lIHByaW50ZiBsaWtlCisgKiBleHByZXNzaW9ucy4KKyAqICBUaGVzZSBhcmU6CisgKgklbSAtIE1QSQorICoJJXMgLSBzdHJpbmcgKG5vIGF1dG9zd2l0Y2ggdG8gc2VjdXJlIGFsbG9jYXRpb24pCisgKgklZCAtIGludGVnZXIgc3RvcmVkIGFzIHN0cmluZyAobm8gYXV0b3N3aXRjaCB0byBzZWN1cmUgYWxsb2NhdGlvbikKKyAqICAgICAgJWIgLSBtZW1vcnkgYnVmZmVyOyB0aGlzIHRha2VzIF90d29fIGFyZ3VtZW50czogYW4gaW50ZWdlciB3aXRoIHRoZSAKKyAqICAgICAgICAgICBsZW5ndGggb2YgdGhlIGJ1ZmZlciBhbmQgYSBwb2ludGVyIHRvIHRoZSBidWZmZXIuCisgKiAgICAgICVTIC0gQ29weSBhbiBnY3J5X3NleHBfdCBoZXJlLiAgVGhlIFMtZXhwcmVzc2lvbiBuZWVkcyB0byBiZSBhCisgKiAgICAgICAgICAgcmVndWxhciBvbmUsIHN0YXJ0aW5nIHdpdGggYSBwYXJlbnRoZXNpcy4gCisgKiAgICAgICAgICAgKG5vIGF1dG9zd2l0Y2ggdG8gc2VjdXJlIGFsbG9jYXRpb24pCisgKiAgYWxsIG90aGVyIGZvcm1hdCBlbGVtZW50cyBhcmUgY3VycmVudGx5IG5vdCBkZWZpbmVkIGFuZCByZXR1cm4gYW4gZXJyb3IuCisgKiAgdGhpcyBpbmNsdWRlcyB0aGUgIiUlIiBzZXF1ZW5jZSBiZWNhdWNlIHRoZSBwZXJjZW50IHNpZ24gaXMgbm90IGFuCisgKiAgYWxsb3dlZCBjaGFyYWN0ZXIuCisgKiBGSVhNRTogV2Ugc2hvdWxkIGZpbmQgYSB3YXkgdG8gc3RvcmUgdGhlIHNlY3VyZS1NUElzIG5vdCBpbiB0aGUgc3RyaW5nCisgKiBidXQgYXMgcmVmZXJlbmNlIHRvIHNvbWV3aGVyZSAtIHRoaXMgY2FuIGhlbHAgdXMgdG8gc2F2ZSBodWdlIGFtb3VudHMKKyAqIG9mIHNlY3VyZSBtZW1vcnkuICBUaGUgcHJvYmxlbSBpcywgdGhhdCBpZiBvbmx5IG9uZSBlbGVtZW50IGlzIHNlY3VyZSwgYWxsCisgKiBvdGhlciBlbGVtZW50cyBhcmUgYXV0b21hZ2ljYWx5IGNvcGllZCB0byBzZWN1cmUgbWVtb3J5IHRvbywgc28gdGhlIG1vc3QKKyAqIGNvbW1vbiBvcGVyYXRpb24gZ2NyeV9zZXhwX2Nkcl9tcGkoKSB3aWxsIGFsd2F5cyByZXR1cm4gYSBzZWN1cmUgTVBJCisgKiByZWdhcmRsZXNzIHdoZXRoZXIgaXQgaXMgbmVlZGVkIG9yIG5vdC4KKyAqLworc3RhdGljIGdjcnlfZXJyb3JfdAorc2V4cF9zc2NhbiAoZ2NyeV9zZXhwX3QgKnJldHNleHAsIHNpemVfdCAqZXJyb2ZmLAorCSAgICBjb25zdCBjaGFyICpidWZmZXIsIHNpemVfdCBsZW5ndGgsIGludCBhcmdmbGFnLAorCSAgICB2YV9saXN0IGFyZ19wdHIsIHZvaWQgKiphcmdfbGlzdCkKK3sKKyAgZ2NyeV9lcnJfY29kZV90IGVyciA9IDA7CisgIHN0YXRpYyBjb25zdCBjaGFyIHRva2VuY2hhcnNbXSA9CisgICAgImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IgorICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiIKKyAgICAiMDEyMzQ1Njc4OS0uL186Kis9IjsKKyAgY29uc3QgY2hhciAqcDsKKyAgc2l6ZV90IG47CisgIGNvbnN0IGNoYXIgKmRpZ3B0ciA9IE5VTEw7CisgIGNvbnN0IGNoYXIgKnF1b3RlZCA9IE5VTEw7CisgIGNvbnN0IGNoYXIgKnRva2VucCA9IE5VTEw7CisgIGNvbnN0IGNoYXIgKmhleGZtdCA9IE5VTEw7CisgIGNvbnN0IGNoYXIgKmJhc2U2NCA9IE5VTEw7CisgIGNvbnN0IGNoYXIgKmRpc3BoaW50ID0gTlVMTDsKKyAgY29uc3QgY2hhciAqcGVyY2VudCA9IE5VTEw7CisgIGludCBoZXhjb3VudCA9IDA7CisgIGludCBxdW90ZWRfZXNjID0gMDsKKyAgaW50IGRhdGFsZW4gPSAwOworICBzaXplX3QgZHVtbXlfZXJyb2ZmOworICBzdHJ1Y3QgbWFrZV9zcGFjZV9jdHggYzsKKyAgaW50IGFyZ19jb3VudGVyID0gMDsKKyAgaW50IGxldmVsID0gMDsKKworICBpZiAoIWVycm9mZikKKyAgICBlcnJvZmYgPSAmZHVtbXlfZXJyb2ZmOworCisgIC8qIERlcGVuZGluZyBvbiB3ZXRoZXIgQVJHX0xJU1QgaXMgbm9uLXplcm8gb3Igbm90LCB0aGlzIG1hY3JvIGdpdmVzCisgICAgIHVzIHRoZSBuZXh0IGFyZ3VtZW50LCBlaXRoZXIgZnJvbSB0aGUgdmFyaWFibGUgYXJndW1lbnQgbGlzdCBhcworICAgICBzcGVjaWZpZWQgYnkgQVJHX1BUUiBvciBmcm9tIHRoZSBhcmd1bWVudCBhcnJheSBBUkdfTElTVC4gICovCisjZGVmaW5lIEFSR19ORVhUKHN0b3JhZ2UsIHR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAoIWFyZ19saXN0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJc3RvcmFnZSA9IHZhX2FyZyAoYXJnX3B0ciwgdHlwZSk7ICAgICAgICAgICAgICAgIFwKKyAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlzdG9yYWdlID0gKigodHlwZSAqKSAoYXJnX2xpc3RbYXJnX2NvdW50ZXIrK10pKTsgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB3aGlsZSAoMCkKKworICAvKiBUaGUgTUFLRV9TUEFDRSBtYWNybyBpcyB1c2VkIGJlZm9yZSBlYWNoIHN0b3JlIG9wZXJhdGlvbiB0bworICAgICBlbnN1cmUgdGhhdCB0aGUgYnVmZmVyIGlzIGxhcmdlIGVub3VnaC4gIEl0IHJlcXVpcmVzIGEgZ2xvYmFsCisgICAgIGNvbnRleHQgbmFtZWQgQyBhbmQganVtcHMgb3V0IHRvIHRoZSBsYWJlbCBMRUFWRSBvbiBlcnJvciEgSXQKKyAgICAgYWxzbyBzZXRzIEVSUk9GRiB1c2luZyB0aGUgdmFyaWFibGVzIEJVRkZFUiBhbmQgUC4gICovCisjZGVmaW5lIE1BS0VfU1BBQ0UobikgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BnX2Vycl9jb2RlX3QgX21zX2VyciA9IG1ha2Vfc3BhY2UgKCZjLCAobikpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9tc19lcnIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IF9tc19lcnI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICplcnJvZmYgPSBwIC0gYnVmZmVyOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbGVhdmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKDApCisKKyAgLyogVGhlIFNUT1JFX0xFTiBtYWNybyBpcyB1c2VkIHRvIHN0b3JlIHRoZSBsZW5ndGggTiBhdCBidWZmZXIgUC4gKi8KKyNkZWZpbmUgU1RPUkVfTEVOKHAsbikgZG8gewkJCQkJCSAgIFwKKwkJCSAgICBEQVRBTEVOIGFzaG9ydCA9IChuKTsJCQkgICBcCisJCQkgICAgbWVtY3B5ICggKHApLCAmYXNob3J0LCBzaXplb2YoYXNob3J0KSApOwkgICBcCisJCQkgICAgKHApICs9IHNpemVvZiAoYXNob3J0KTsJCQkgICBcCisJCQl9IHdoaWxlICgwKQorCisgIC8qIFdlIGFzc3VtZSB0aGF0IHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiB0YWtlcyBsZXNzIG1lbW9yeSB0aGFuCisgICAgIHRoZSBwcm92aWRlZCBvbmUuICBIb3dldmVyLCB3ZSBhZGQgc3BhY2UgZm9yIG9uZSBleHRyYSBkYXRhbGVuIHNvCisgICAgIHRoYXQgdGhlIGNvZGUgd2hpY2ggZG9lcyB0aGUgU1RfQ0xPU0UgY2FuIHVzZSBNQUtFX1NQQUNFICovCisgIGMuYWxsb2NhdGVkID0gbGVuZ3RoICsgc2l6ZW9mKERBVEFMRU4pOworICBpZiAoYnVmZmVyICYmIGxlbmd0aCAmJiBnY3J5X2lzX3NlY3VyZSAoYnVmZmVyKSkKKyAgICBjLnNleHAgPSBnY3J5X21hbGxvY19zZWN1cmUgKHNpemVvZiAqYy5zZXhwICsgYy5hbGxvY2F0ZWQgLSAxKTsKKyAgZWxzZQorICAgIGMuc2V4cCA9IGdjcnlfbWFsbG9jIChzaXplb2YgKmMuc2V4cCArIGMuYWxsb2NhdGVkIC0gMSk7CisgIGlmICghYy5zZXhwKQorICAgIHsKKyAgICAgIGVyciA9IGdwZ19lcnJfY29kZV9mcm9tX2Vycm5vIChlcnJubyk7CisgICAgICAqZXJyb2ZmID0gMDsKKyAgICAgIGdvdG8gbGVhdmU7CisgICAgfQorICBjLnBvcyA9IGMuc2V4cC0+ZDsKKworICBmb3IgKHAgPSBidWZmZXIsIG4gPSBsZW5ndGg7IG47IHArKywgbi0tKQorICAgIHsKKyAgICAgIGlmICh0b2tlbnAgJiYgIWhleGZtdCkKKwl7CisJICBpZiAoc3RyY2hyICh0b2tlbmNoYXJzLCAqcCkpCisJICAgIGNvbnRpbnVlOworCSAgZWxzZQorCSAgICB7CisJICAgICAgZGF0YWxlbiA9IHAgLSB0b2tlbnA7CisJICAgICAgTUFLRV9TUEFDRSAoZGF0YWxlbik7CisJICAgICAgKmMucG9zKysgPSBTVF9EQVRBOworCSAgICAgIFNUT1JFX0xFTiAoYy5wb3MsIGRhdGFsZW4pOworCSAgICAgIG1lbWNweSAoYy5wb3MsIHRva2VucCwgZGF0YWxlbik7CisJICAgICAgYy5wb3MgKz0gZGF0YWxlbjsKKwkgICAgICB0b2tlbnAgPSBOVUxMOworCSAgICB9CisJfQorCisgICAgICBpZiAocXVvdGVkKQorCXsKKwkgIGlmIChxdW90ZWRfZXNjKQorCSAgICB7CisJICAgICAgc3dpdGNoICgqcCkKKwkJeworCQljYXNlICdiJzogY2FzZSAndCc6IGNhc2UgJ3YnOiBjYXNlICduJzogY2FzZSAnZic6CisJCWNhc2UgJ3InOiBjYXNlICciJzogY2FzZSAnXCcnOiBjYXNlICdcXCc6CisJCSAgcXVvdGVkX2VzYyA9IDA7CisJCSAgYnJlYWs7CisKKwkJY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOgorCQljYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOgorCQkgIGlmICghKChuID4gMikKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIChwWzFdID49ICcwJykgJiYgKHBbMV0gPD0gJzcnKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBbMl0gPj0gJzAnKSAmJiAocFsyXSA8PSAnNycpKSkKKwkJICAgIHsKKwkJICAgICAgKmVycm9mZiA9IHAgLSBidWZmZXI7CisJCSAgICAgIC8qIEludmFsaWQgb2N0YWwgdmFsdWUuICAqLworCQkgICAgICBlcnIgPSBHUEdfRVJSX1NFWFBfQkFEX1FVT1RBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgICBnb3RvIGxlYXZlOworCQkgICAgfQorCQkgIHAgKz0gMjsKKwkJICBuIC09IDI7CisJCSAgcXVvdGVkX2VzYyA9IDA7CisJCSAgYnJlYWs7CisJCSAgCisJCWNhc2UgJ3gnOgorCQkgIGlmICghKChuID4gMikgJiYgaGV4ZGlnaXRwIChwKzEpICYmIGhleGRpZ2l0cCAocCsyKSkpCisJCSAgICB7CisJCSAgICAgICplcnJvZmYgPSBwIC0gYnVmZmVyOworCQkgICAgICAvKiBJbnZhbGlkIGhleCB2YWx1ZS4gICovCisJCSAgICAgIGVyciA9IEdQR19FUlJfU0VYUF9CQURfUVVPVEFUSU9OOworICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbGVhdmU7CisJCSAgICB9CisJCSAgcCArPSAyOworCQkgIG4gLT0gMjsKKwkJICBxdW90ZWRfZXNjID0gMDsKKwkJICBicmVhazsKKworCQljYXNlICdccic6CisJCSAgLyogaWdub3JlIENSWyxMRl0gKi8KKwkJICBpZiAobiAmJiAocFsxXSA9PSAnXG4nKSkKKwkJICAgIHsKKwkJICAgICAgcCsrOworCQkgICAgICBuLS07CisJCSAgICB9CisJCSAgcXVvdGVkX2VzYyA9IDA7CisJCSAgYnJlYWs7CisKKwkJY2FzZSAnXG4nOgorCQkgIC8qIGlnbm9yZSBMRlssQ1JdICovCisJCSAgaWYgKG4gJiYgKHBbMV0gPT0gJ1xyJykpCisJCSAgICB7CisJCSAgICAgIHArKzsKKwkJICAgICAgbi0tOworCQkgICAgfQorCQkgIHF1b3RlZF9lc2MgPSAwOworCQkgIGJyZWFrOworCisJCWRlZmF1bHQ6CisJCSAgKmVycm9mZiA9IHAgLSBidWZmZXI7CisJCSAgLyogSW52YWxpZCBxdW90ZWQgc3RyaW5nIGVzY2FwZS4gICovCisJCSAgZXJyID0gR1BHX0VSUl9TRVhQX0JBRF9RVU9UQVRJT047CisgICAgICAgICAgICAgICAgICBnb3RvIGxlYXZlOworCQl9CisJICAgIH0KKwkgIGVsc2UgaWYgKCpwID09ICdcXCcpCisJICAgIHF1b3RlZF9lc2MgPSAxOworCSAgZWxzZSBpZiAoKnAgPT0gJ1wiJykKKwkgICAgeworCSAgICAgIC8qIEtlZXAgaXQgZWFzeSAtIHdlIGtub3cgdGhhdCB0aGUgdW5xdW90ZWQgc3RyaW5nIHdpbGwKKwkJIG5ldmVyIGJlIGxhcmdlci4gKi8KKwkgICAgICB1bnNpZ25lZCBjaGFyICpzYXZlOworCSAgICAgIHNpemVfdCBsZW47CisJICAgICAgCisJICAgICAgcXVvdGVkKys7IC8qIFNraXAgbGVhZGluZyBxdW90ZS4gICovCisJICAgICAgTUFLRV9TUEFDRSAocCAtIHF1b3RlZCk7CisJICAgICAgKmMucG9zKysgPSBTVF9EQVRBOworCSAgICAgIHNhdmUgPSBjLnBvczsKKwkgICAgICBTVE9SRV9MRU4gKGMucG9zLCAwKTsgLyogV2lsbCBiZSBmaXhlZCB1cCBsYXRlci4gICovCisJICAgICAgbGVuID0gdW5xdW90ZV9zdHJpbmcgKHF1b3RlZCwgcCAtIHF1b3RlZCwgYy5wb3MpOworCSAgICAgIGMucG9zICs9IGxlbjsKKwkgICAgICBTVE9SRV9MRU4gKHNhdmUsIGxlbik7CisJICAgICAgcXVvdGVkID0gTlVMTDsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKGhleGZtdCkKKwl7CisJICBpZiAoaXN4ZGlnaXQgKCpwKSkKKwkgICAgaGV4Y291bnQrKzsKKwkgIGVsc2UgaWYgKCpwID09ICcjJykKKwkgICAgeworCSAgICAgIGlmICgoaGV4Y291bnQgJiAxKSkKKwkJeworCQkgICplcnJvZmYgPSBwIC0gYnVmZmVyOworCQkgIGVyciA9IEdQR19FUlJfU0VYUF9PRERfSEVYX05VTUJFUlM7CisgICAgICAgICAgICAgICAgICBnb3RvIGxlYXZlOworCQl9CisKKwkgICAgICBkYXRhbGVuID0gaGV4Y291bnQgLyAyOworCSAgICAgIE1BS0VfU1BBQ0UgKGRhdGFsZW4pOworCSAgICAgICpjLnBvcysrID0gU1RfREFUQTsKKwkgICAgICBTVE9SRV9MRU4gKGMucG9zLCBkYXRhbGVuKTsKKwkgICAgICBmb3IgKGhleGZtdCsrOyBoZXhmbXQgPCBwOyBoZXhmbXQrKykKKwkJeworCQkgIGlmICh3aGl0ZXNwYWNlcCAoaGV4Zm10KSkKKwkJICAgIGNvbnRpbnVlOworCQkgICpjLnBvcysrID0gaGV4dG9ieXRlICgoY29uc3QgdW5zaWduZWQgY2hhciopaGV4Zm10KTsKKwkJICBoZXhmbXQrKzsKKwkJfQorCSAgICAgIGhleGZtdCA9IE5VTEw7CisJICAgIH0KKwkgIGVsc2UgaWYgKCF3aGl0ZXNwYWNlcCAocCkpCisJICAgIHsKKwkgICAgICAqZXJyb2ZmID0gcCAtIGJ1ZmZlcjsKKwkgICAgICBlcnIgPSBHUEdfRVJSX1NFWFBfQkFEX0hFWF9DSEFSOworICAgICAgICAgICAgICBnb3RvIGxlYXZlOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoYmFzZTY0KQorCXsKKwkgIGlmICgqcCA9PSAnfCcpCisJICAgIGJhc2U2NCA9IE5VTEw7CisJfQorICAgICAgZWxzZSBpZiAoZGlncHRyKQorCXsKKwkgIGlmIChkaWdpdHAgKHApKQorCSAgICA7CisJICBlbHNlIGlmICgqcCA9PSAnOicpCisJICAgIHsKKwkgICAgICBkYXRhbGVuID0gYXRvaSAoZGlncHRyKTsgLyogRklYTUU6IGNoZWNrIGZvciBvdmVyZmxvdy4gICovCisJICAgICAgZGlncHRyID0gTlVMTDsKKwkgICAgICBpZiAoZGF0YWxlbiA+IG4gLSAxKQorCQl7CisJCSAgKmVycm9mZiA9IHAgLSBidWZmZXI7CisJCSAgLyogQnVmZmVyIHRvbyBzaG9ydC4gICovCisJCSAgZXJyID0gR1BHX0VSUl9TRVhQX1NUUklOR19UT09fTE9ORzsKKyAgICAgICAgICAgICAgICAgIGdvdG8gbGVhdmU7CisJCX0KKwkgICAgICAvKiBNYWtlIGEgbmV3IGxpc3QgZW50cnkuICAqLworCSAgICAgIE1BS0VfU1BBQ0UgKGRhdGFsZW4pOworCSAgICAgICpjLnBvcysrID0gU1RfREFUQTsKKwkgICAgICBTVE9SRV9MRU4gKGMucG9zLCBkYXRhbGVuKTsKKwkgICAgICBtZW1jcHkgKGMucG9zLCBwICsgMSwgZGF0YWxlbik7CisJICAgICAgYy5wb3MgKz0gZGF0YWxlbjsKKwkgICAgICBuIC09IGRhdGFsZW47CisJICAgICAgcCArPSBkYXRhbGVuOworCSAgICB9CisJICBlbHNlIGlmICgqcCA9PSAnXCInKQorCSAgICB7CisJICAgICAgZGlncHRyID0gTlVMTDsgLyogV2UgaWdub3JlIHRoZSBvcHRpb25hbCBsZW5ndGguICAqLworCSAgICAgIHF1b3RlZCA9IHA7CisJICAgICAgcXVvdGVkX2VzYyA9IDA7CisJICAgIH0KKwkgIGVsc2UgaWYgKCpwID09ICcjJykKKwkgICAgeworCSAgICAgIGRpZ3B0ciA9IE5VTEw7IC8qIFdlIGlnbm9yZSB0aGUgb3B0aW9uYWwgbGVuZ3RoLiAgKi8KKwkgICAgICBoZXhmbXQgPSBwOworCSAgICAgIGhleGNvdW50ID0gMDsKKwkgICAgfQorCSAgZWxzZSBpZiAoKnAgPT0gJ3wnKQorCSAgICB7CisJICAgICAgZGlncHRyID0gTlVMTDsgLyogV2UgaWdub3JlIHRoZSBvcHRpb25hbCBsZW5ndGguICAqLworCSAgICAgIGJhc2U2NCA9IHA7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgICplcnJvZmYgPSBwIC0gYnVmZmVyOworCSAgICAgIGVyciA9IEdQR19FUlJfU0VYUF9JTlZfTEVOX1NQRUM7CisgICAgICAgICAgICAgIGdvdG8gbGVhdmU7CisJICAgIH0KKwl9CisgICAgICBlbHNlIGlmIChwZXJjZW50KQorCXsKKwkgIGlmICgqcCA9PSAnbScpCisJICAgIHsKKwkgICAgICAvKiBJbnNlcnQgYW4gTVBJLiAgKi8KKwkgICAgICBnY3J5X21waV90IG07CisJICAgICAgc2l6ZV90IG5tID0gMDsKKworCSAgICAgIEFSR19ORVhUIChtLCBnY3J5X21waV90KTsKKwkgICAgICAKKwkgICAgICBpZiAoZ2NyeV9tcGlfcHJpbnQgKEdDUllNUElfRk1UX1NURCwgTlVMTCwgMCwgJm5tLCBtKSkKKwkJQlVHICgpOworCisJICAgICAgTUFLRV9TUEFDRSAobm0pOworCSAgICAgIGlmICghZ2NyeV9pc19zZWN1cmUgKGMuc2V4cC0+ZCkKKwkJICAmJiBnY3J5X21waV9nZXRfZmxhZyAoIG0sIEdDUllNUElfRkxBR19TRUNVUkUpKQorCQl7CisJCSAgLyogV2UgaGF2ZSB0byBzd2l0Y2ggdG8gc2VjdXJlIGFsbG9jYXRpb24uICAqLworCQkgIGdjcnlfc2V4cF90IG5ld3NleHA7CisJCSAgYnl0ZSAqbmV3aGVhZDsKKworCQkgIG5ld3NleHAgPSBnY3J5X21hbGxvY19zZWN1cmUgKHNpemVvZiAqbmV3c2V4cAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjLmFsbG9jYXRlZCAtIDEpOworICAgICAgICAgICAgICAgICAgaWYgKCFuZXdzZXhwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgZXJyID0gZ3BnX2Vycl9jb2RlX2Zyb21fZXJybm8gKGVycm5vKTsKKyAgICAgICAgICAgICAgICAgICAgICBnb3RvIGxlYXZlOworICAgICAgICAgICAgICAgICAgICB9CisJCSAgbmV3aGVhZCA9IG5ld3NleHAtPmQ7CisJCSAgbWVtY3B5IChuZXdoZWFkLCBjLnNleHAtPmQsIChjLnBvcyAtIGMuc2V4cC0+ZCkpOworCQkgIGMucG9zID0gbmV3aGVhZCArIChjLnBvcyAtIGMuc2V4cC0+ZCk7CisJCSAgZ2NyeV9mcmVlIChjLnNleHApOworCQkgIGMuc2V4cCA9IG5ld3NleHA7CisJCX0KKworCSAgICAgICpjLnBvcysrID0gU1RfREFUQTsKKwkgICAgICBTVE9SRV9MRU4gKGMucG9zLCBubSk7CisJICAgICAgaWYgKGdjcnlfbXBpX3ByaW50IChHQ1JZTVBJX0ZNVF9TVEQsIGMucG9zLCBubSwgJm5tLCBtKSkKKwkJQlVHICgpOworCSAgICAgIGMucG9zICs9IG5tOworCSAgICB9CisJICBlbHNlIGlmICgqcCA9PSAncycpCisJICAgIHsKKwkgICAgICAvKiBJbnNlcnQgYW4gc3RyaW5nLiAgKi8KKwkgICAgICBjb25zdCBjaGFyICphc3RyOworCSAgICAgIHNpemVfdCBhbGVuOworCisJICAgICAgQVJHX05FWFQgKGFzdHIsIGNvbnN0IGNoYXIgKik7CisJICAgICAgYWxlbiA9IHN0cmxlbiAoYXN0cik7CisJICAgICAgCisJICAgICAgTUFLRV9TUEFDRSAoYWxlbik7CisJICAgICAgKmMucG9zKysgPSBTVF9EQVRBOworCSAgICAgIFNUT1JFX0xFTiAoYy5wb3MsIGFsZW4pOworCSAgICAgIG1lbWNweSAoYy5wb3MsIGFzdHIsIGFsZW4pOworCSAgICAgIGMucG9zICs9IGFsZW47CisJICAgIH0KKwkgIGVsc2UgaWYgKCpwID09ICdiJykKKwkgICAgeworCSAgICAgIC8qIEluc2VydCBhIG1lbW9yeSBidWZmZXIuICAqLworCSAgICAgIGNvbnN0IGNoYXIgKmFzdHI7CisJICAgICAgaW50IGFsZW47CisKKwkgICAgICBBUkdfTkVYVCAoYWxlbiwgaW50KTsKKwkgICAgICBBUkdfTkVYVCAoYXN0ciwgY29uc3QgY2hhciAqKTsKKwkgICAgICAKKwkgICAgICBNQUtFX1NQQUNFIChhbGVuKTsKKwkgICAgICBpZiAoYWxlbgorICAgICAgICAgICAgICAgICAgJiYgIWdjcnlfaXNfc2VjdXJlIChjLnNleHAtPmQpCisJCSAgJiYgZ2NyeV9pc19zZWN1cmUgKGFzdHIpKQorICAgICAgICAgICAgICB7CisJCSAgLyogV2UgaGF2ZSB0byBzd2l0Y2ggdG8gc2VjdXJlIGFsbG9jYXRpb24uICAqLworCQkgIGdjcnlfc2V4cF90IG5ld3NleHA7CisJCSAgYnl0ZSAqbmV3aGVhZDsKKworCQkgIG5ld3NleHAgPSBnY3J5X21hbGxvY19zZWN1cmUgKHNpemVvZiAqbmV3c2V4cAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjLmFsbG9jYXRlZCAtIDEpOworICAgICAgICAgICAgICAgICAgaWYgKCFuZXdzZXhwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgZXJyID0gZ3BnX2Vycl9jb2RlX2Zyb21fZXJybm8gKGVycm5vKTsKKyAgICAgICAgICAgICAgICAgICAgICBnb3RvIGxlYXZlOworICAgICAgICAgICAgICAgICAgICB9CisJCSAgbmV3aGVhZCA9IG5ld3NleHAtPmQ7CisJCSAgbWVtY3B5IChuZXdoZWFkLCBjLnNleHAtPmQsIChjLnBvcyAtIGMuc2V4cC0+ZCkpOworCQkgIGMucG9zID0gbmV3aGVhZCArIChjLnBvcyAtIGMuc2V4cC0+ZCk7CisJCSAgZ2NyeV9mcmVlIChjLnNleHApOworCQkgIGMuc2V4cCA9IG5ld3NleHA7CisJCX0KKworCSAgICAgICpjLnBvcysrID0gU1RfREFUQTsKKwkgICAgICBTVE9SRV9MRU4gKGMucG9zLCBhbGVuKTsKKwkgICAgICBtZW1jcHkgKGMucG9zLCBhc3RyLCBhbGVuKTsKKwkgICAgICBjLnBvcyArPSBhbGVuOworCSAgICB9CisJICBlbHNlIGlmICgqcCA9PSAnZCcpCisJICAgIHsKKwkgICAgICAvKiBJbnNlcnQgYW4gaW50ZWdlciBhcyBzdHJpbmcuICAqLworCSAgICAgIGludCBhaW50OworCSAgICAgIHNpemVfdCBhbGVuOworCSAgICAgIGNoYXIgYnVmWzIwXTsKKwkgICAgICAKKwkgICAgICBBUkdfTkVYVCAoYWludCwgaW50KTsKKwkgICAgICBzcHJpbnRmIChidWYsICIlZCIsIGFpbnQpOworCSAgICAgIGFsZW4gPSBzdHJsZW4gKGJ1Zik7CisJICAgICAgTUFLRV9TUEFDRSAoYWxlbik7CisJICAgICAgKmMucG9zKysgPSBTVF9EQVRBOworCSAgICAgIFNUT1JFX0xFTiAoYy5wb3MsIGFsZW4pOworCSAgICAgIG1lbWNweSAoYy5wb3MsIGJ1ZiwgYWxlbik7CisJICAgICAgYy5wb3MgKz0gYWxlbjsKKwkgICAgfQorCSAgZWxzZSBpZiAoKnAgPT0gJ1MnKQorCSAgICB7CisJICAgICAgLyogSW5zZXJ0IGEgZ2NyeV9zZXhwX3QuICAqLworCSAgICAgIGdjcnlfc2V4cF90IGFzZXhwOworCSAgICAgIHNpemVfdCBhbGVuLCBhb2ZmOworCisJICAgICAgQVJHX05FWFQgKGFzZXhwLCBnY3J5X3NleHBfdCk7CisgICAgICAgICAgICAgIGFsZW4gPSBnZXRfaW50ZXJuYWxfYnVmZmVyIChhc2V4cCwgJmFvZmYpOworICAgICAgICAgICAgICBpZiAoYWxlbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBNQUtFX1NQQUNFIChhbGVuKTsKKyAgICAgICAgICAgICAgICAgIG1lbWNweSAoYy5wb3MsIGFzZXhwLT5kICsgYW9mZiwgYWxlbik7CisgICAgICAgICAgICAgICAgICBjLnBvcyArPSBhbGVuOworICAgICAgICAgICAgICAgIH0KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgKmVycm9mZiA9IHAgLSBidWZmZXI7CisJICAgICAgLyogSW52YWxpZCBmb3JtYXQgc3BlY2lmaWVyLiAgKi8KKwkgICAgICBlcnIgPSBHUEdfRVJSX1NFWFBfSU5WX0xFTl9TUEVDOworICAgICAgICAgICAgICBnb3RvIGxlYXZlOworCSAgICB9CisJICBwZXJjZW50ID0gTlVMTDsKKwl9CisgICAgICBlbHNlIGlmICgqcCA9PSAnKCcpCisJeworCSAgaWYgKGRpc3BoaW50KQorCSAgICB7CisJICAgICAgKmVycm9mZiA9IHAgLSBidWZmZXI7CisJICAgICAgLyogT3BlbiBkaXNwbGF5IGhpbnQuICAqLworCSAgICAgIGVyciA9IEdQR19FUlJfU0VYUF9VTk1BVENIRURfREg7CisgICAgICAgICAgICAgIGdvdG8gbGVhdmU7CisJICAgIH0KKwkgIE1BS0VfU1BBQ0UgKDApOworCSAgKmMucG9zKysgPSBTVF9PUEVOOworCSAgbGV2ZWwrKzsKKwl9CisgICAgICBlbHNlIGlmICgqcCA9PSAnKScpCisJeworCSAgLyogV2FsayB1cC4gICovCisJICBpZiAoZGlzcGhpbnQpCisJICAgIHsKKwkgICAgICAqZXJyb2ZmID0gcCAtIGJ1ZmZlcjsKKwkgICAgICAvKiBPcGVuIGRpc3BsYXkgaGludC4gICovCisJICAgICAgZXJyID0gR1BHX0VSUl9TRVhQX1VOTUFUQ0hFRF9ESDsKKyAgICAgICAgICAgICAgZ290byBsZWF2ZTsKKwkgICAgfQorCSAgTUFLRV9TUEFDRSAoMCk7CisJICAqYy5wb3MrKyA9IFNUX0NMT1NFOworCSAgbGV2ZWwtLTsKKwl9CisgICAgICBlbHNlIGlmICgqcCA9PSAnXCInKQorCXsKKwkgIHF1b3RlZCA9IHA7CisJICBxdW90ZWRfZXNjID0gMDsKKwl9CisgICAgICBlbHNlIGlmICgqcCA9PSAnIycpCisJeworCSAgaGV4Zm10ID0gcDsKKwkgIGhleGNvdW50ID0gMDsKKwl9CisgICAgICBlbHNlIGlmICgqcCA9PSAnfCcpCisJYmFzZTY0ID0gcDsKKyAgICAgIGVsc2UgaWYgKCpwID09ICdbJykKKwl7CisJICBpZiAoZGlzcGhpbnQpCisJICAgIHsKKwkgICAgICAqZXJyb2ZmID0gcCAtIGJ1ZmZlcjsKKwkgICAgICAvKiBPcGVuIGRpc3BsYXkgaGludC4gICovCisJICAgICAgZXJyID0gR1BHX0VSUl9TRVhQX05FU1RFRF9ESDsKKyAgICAgICAgICAgICAgZ290byBsZWF2ZTsKKwkgICAgfQorCSAgZGlzcGhpbnQgPSBwOworCX0KKyAgICAgIGVsc2UgaWYgKCpwID09ICddJykKKwl7CisJICBpZiAoIWRpc3BoaW50KQorCSAgICB7CisJICAgICAgKmVycm9mZiA9IHAgLSBidWZmZXI7CisJICAgICAgLyogT3BlbiBkaXNwbGF5IGhpbnQuICAqLworCSAgICAgIGVyciA9IEdQR19FUlJfU0VYUF9VTk1BVENIRURfREg7CisgICAgICAgICAgICAgIGdvdG8gbGVhdmU7CisJICAgIH0KKwkgIGRpc3BoaW50ID0gTlVMTDsKKwl9CisgICAgICBlbHNlIGlmIChkaWdpdHAgKHApKQorCXsKKwkgIGlmICgqcCA9PSAnMCcpCisJICAgIHsKKwkgICAgICAvKiBBIGxlbmd0aCBtYXkgbm90IGJlZ2luIHdpdGggemVyby4gICovCisJICAgICAgKmVycm9mZiA9IHAgLSBidWZmZXI7CisJICAgICAgZXJyID0gR1BHX0VSUl9TRVhQX1pFUk9fUFJFRklYOworICAgICAgICAgICAgICBnb3RvIGxlYXZlOworCSAgICB9CisJICBkaWdwdHIgPSBwOworCX0KKyAgICAgIGVsc2UgaWYgKHN0cmNociAodG9rZW5jaGFycywgKnApKQorCXRva2VucCA9IHA7CisgICAgICBlbHNlIGlmICh3aGl0ZXNwYWNlcCAocCkpCisJOworICAgICAgZWxzZSBpZiAoKnAgPT0gJ3snKQorCXsKKwkgIC8qIGZpeG1lOiBoYW5kbGUgcmVzY2FubmluZzogd2UgY2FuIGRvIHRoaXMgYnkgc2F2aW5nIG91cgorCSAgICAgY3VycmVudCBzdGF0ZSBhbmQgc3RhcnQgb3ZlciBhdCBwKzEgLS0gSG1tbS4gQXQgdGhpcworCSAgICAgcG9pbnQgaGVyZSB3ZSBhcmUgaW4gYSB3ZWxsIGRlZmluZWQgc3RhdGUsIHNvIHdlIGRvbid0CisJICAgICBuZWVkIHRvIHNhdmUgaXQuICBHcmVhdC4gICovCisJICAqZXJyb2ZmID0gcCAtIGJ1ZmZlcjsKKwkgIGVyciA9IEdQR19FUlJfU0VYUF9VTkVYUEVDVEVEX1BVTkM7CisgICAgICAgICAgZ290byBsZWF2ZTsKKwl9CisgICAgICBlbHNlIGlmIChzdHJjaHIgKCImXFwiLCAqcCkpCisJeworCSAgLyogUmVzZXJ2ZWQgcHVuY3R1YXRpb24uICAqLworCSAgKmVycm9mZiA9IHAgLSBidWZmZXI7CisJICBlcnIgPSBHUEdfRVJSX1NFWFBfVU5FWFBFQ1RFRF9QVU5DOworICAgICAgICAgIGdvdG8gbGVhdmU7CisJfQorICAgICAgZWxzZSBpZiAoYXJnZmxhZyAmJiAoKnAgPT0gJyUnKSkKKwlwZXJjZW50ID0gcDsKKyAgICAgIGVsc2UKKwl7CisJICAvKiBCYWQgb3IgdW5hdmFpbGFibGUuICAqLworCSAgKmVycm9mZiA9IHAgLSBidWZmZXI7CisJICBlcnIgPSBHUEdfRVJSX1NFWFBfQkFEX0NIQVJBQ1RFUjsKKyAgICAgICAgICBnb3RvIGxlYXZlOworCX0KKyAgICB9CisgIE1BS0VfU1BBQ0UgKDApOworICAqYy5wb3MrKyA9IFNUX1NUT1A7CisKKyAgaWYgKGxldmVsICYmICFlcnIpCisgICAgZXJyID0gR1BHX0VSUl9TRVhQX1VOTUFUQ0hFRF9QQVJFTjsKKworIGxlYXZlOgorICBpZiAoZXJyKQorICAgIHsKKyAgICAgIC8qIEVycm9yIC0+IGRlYWxsb2NhdGUuICAqLworICAgICAgaWYgKGMuc2V4cCkKKyAgICAgICAgeworICAgICAgICAgIC8qIEV4dHJhIHBhcmFub2lkIHdpcGUgb24gZXJyb3IuICovCisgICAgICAgICAgaWYgKGdjcnlfaXNfc2VjdXJlIChjLnNleHApKQorICAgICAgICAgICAgd2lwZW1lbW9yeSAoYy5zZXhwLCBzaXplb2YgKHN0cnVjdCBnY3J5X3NleHApICsgYy5hbGxvY2F0ZWQgLSAxKTsKKyAgICAgICAgICBnY3J5X2ZyZWUgKGMuc2V4cCk7CisgICAgICAgIH0KKyAgICAgIC8qIFRoaXMgbWlnaHQgYmUgZXhwZWN0ZWQgYnkgZXhpc3RpbmcgY29kZS4uLiAgKi8KKyAgICAgICpyZXRzZXhwID0gTlVMTDsKKyAgICB9CisgIGVsc2UKKyAgICAqcmV0c2V4cCA9IG5vcm1hbGl6ZSAoYy5zZXhwKTsKKworICByZXR1cm4gZ2NyeV9lcnJvciAoZXJyKTsKKyN1bmRlZiBNQUtFX1NQQUNFCisjdW5kZWYgU1RPUkVfTEVOCit9CisKK2djcnlfZXJyb3JfdAorZ2NyeV9zZXhwX2J1aWxkIChnY3J5X3NleHBfdCAqcmV0c2V4cCwgc2l6ZV90ICplcnJvZmYsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICBnY3J5X2Vycm9yX3QgcmM7CisgIHZhX2xpc3QgYXJnX3B0cjsKKyAgCisgIHZhX3N0YXJ0IChhcmdfcHRyLCBmb3JtYXQpOworICByYyA9IHNleHBfc3NjYW4gKHJldHNleHAsIGVycm9mZiwgZm9ybWF0LCBzdHJsZW4oZm9ybWF0KSwgMSwKKwkJICAgYXJnX3B0ciwgTlVMTCk7CisgIHZhX2VuZCAoYXJnX3B0cik7CisgIAorICByZXR1cm4gcmM7Cit9CisKKworZ2NyeV9lcnJvcl90CitfZ2NyeV9zZXhwX3ZidWlsZCAoZ2NyeV9zZXhwX3QgKnJldHNleHAsIHNpemVfdCAqZXJyb2ZmLCAKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJnX3B0cikKK3sKKyAgcmV0dXJuIHNleHBfc3NjYW4gKHJldHNleHAsIGVycm9mZiwgZm9ybWF0LCBzdHJsZW4oZm9ybWF0KSwgMSwKKyAgICAgICAgICAgICAgICAgICAgIGFyZ19wdHIsIE5VTEwpOworfQorCisvKiBMaWtlIGdjcnlfc2V4cF9idWlsZCwgYnV0IHVzZXMgYW4gYXJyYXkgaW5zdGVhZCBvZiB2YXJpYWJsZQorICAgZnVuY3Rpb24gYXJndW1lbnRzLiAgKi8KK2djcnlfZXJyb3JfdAorZ2NyeV9zZXhwX2J1aWxkX2FycmF5IChnY3J5X3NleHBfdCAqcmV0c2V4cCwgc2l6ZV90ICplcnJvZmYsCisJCSAgICAgICBjb25zdCBjaGFyICpmb3JtYXQsIHZvaWQgKiphcmdfbGlzdCkKK3sKKyAgLyogV2UgZG9uJ3QgbmVlZCB0aGUgdmFfbGlzdCBiZWNhdXNlIGl0IGlzIGNvbnRyb2xsZWQgYnkgdGhlCisgICAgIGZvbGxvd2luZyBmbGFnLCBob3dldmVyIHdlIGhhdmUgdG8gcGFzcyBpdCBidXQgY2FuJ3QgaW5pdGlhbGl6ZQorICAgICBpdCBhcyB0aGVyZSBpcyBubyBwb3J0YWJsZSB3YXkgdG8gZG8gc28uICB2b2xhdGlsZSBpcyBuZWVkZWQgdG8KKyAgICAgc3VwcHJlc3MgdGhlIGNvbXBpbGVyIHdhcm5pbmcgKi8KKyAgdm9sYXRpbGUgdmFfbGlzdCBkdW1teV9hcmdfcHRyOworICAKKyAgZ2NyeV9lcnJvcl90IHJjOworCisgIHJjID0gc2V4cF9zc2NhbiAocmV0c2V4cCwgZXJyb2ZmLCBmb3JtYXQsIHN0cmxlbihmb3JtYXQpLCAxLAorCQkgICBkdW1teV9hcmdfcHRyLCBhcmdfbGlzdCk7CisKKyAgcmV0dXJuIHJjOworfQorCitnY3J5X2Vycm9yX3QKK2djcnlfc2V4cF9zc2NhbiAoZ2NyeV9zZXhwX3QgKnJldHNleHAsIHNpemVfdCAqZXJyb2ZmLAorCQkgY29uc3QgY2hhciAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoKQoreworICAvKiBXZSBkb24ndCBuZWVkIHRoZSB2YV9saXN0IGJlY2F1c2UgaXQgaXMgY29udHJvbGxlZCBieSB0aGUKKyAgICAgZm9sbG93aW5nIGZsYWcsIGhvd2V2ZXIgd2UgaGF2ZSB0byBwYXNzIGl0IGJ1dCBjYW4ndCBpbml0aWFsaXplCisgICAgIGl0IGFzIHRoZXJlIGlzIG5vIHBvcnRhYmxlIHdheSB0byBkbyBzby4gIHZvbGF0aWxlIGlzIG5lZWRlZCB0bworICAgICBzdXBwcmVzcyB0aGUgY29tcGlsZXIgd2FybmluZyAqLworICB2b2xhdGlsZSB2YV9saXN0IGR1bW15X2FyZ19wdHI7CisKKyAgcmV0dXJuIHNleHBfc3NjYW4gKHJldHNleHAsIGVycm9mZiwgYnVmZmVyLCBsZW5ndGgsIDAsCisJCSAgICAgZHVtbXlfYXJnX3B0ciwgTlVMTCk7Cit9CisKKwwKKy8qIEZpZ3VyZSBvdXQgYSBzdWl0YWJsZSBlbmNvZGluZyBmb3IgQlVGRkVSIG9mIExFTkdUSC4KKyAgIFJldHVybnM6IDAgPSBCaW5hcnkKKyAgICAgICAgICAgIDEgPSBTdHJpbmcgcG9zc2libGUKKyAgICAgICAgICAgIDIgPSBUb2tlbiBwb3NzaWJsZQorKi8KK3N0YXRpYyBpbnQKK3N1aXRhYmxlX2VuY29kaW5nIChjb25zdCB1bnNpZ25lZCBjaGFyICpidWZmZXIsIHNpemVfdCBsZW5ndGgpCit7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnM7CisgIGludCBtYXliZV90b2tlbiA9IDE7CisKKyAgaWYgKCFsZW5ndGgpCisgICAgcmV0dXJuIDE7CisgIAorICBmb3IgKHM9YnVmZmVyOyBsZW5ndGg7IHMrKywgbGVuZ3RoLS0pCisgICAgeworICAgICAgaWYgKCAoKnMgPCAweDIwIHx8ICgqcyA+PSAweDdmICYmICpzIDw9IDB4YTApKQorICAgICAgICAgICAmJiAhc3RyY2hyICgiXGJcdFx2XG5cZlxyXCJcJ1xcIiwgKnMpKQorICAgICAgICByZXR1cm4gMDsgLypiaW5hcnkqLworICAgICAgaWYgKCBtYXliZV90b2tlbgorICAgICAgICAgICAmJiAhYWxwaGFwIChzKSAmJiAhZGlnaXRwIChzKSAgJiYgIXN0cmNociAoVE9LRU5fU1BFQ0lBTFMsICpzKSkKKyAgICAgICAgbWF5YmVfdG9rZW4gPSAwOworICAgIH0KKyAgcyA9IGJ1ZmZlcjsKKyAgaWYgKCBtYXliZV90b2tlbiAmJiAhZGlnaXRwIChzKSApCisgICAgcmV0dXJuIDI7CisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQKK2NvbnZlcnRfdG9faGV4IChjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsIHNpemVfdCBsZW4sIGNoYXIgKmRlc3QpCit7CisgIGludCBpOworCisgIGlmIChkZXN0KQorICAgIHsKKyAgICAgICpkZXN0KysgPSAnIyc7CisgICAgICBmb3IgKGk9MDsgaSA8IGxlbjsgaSsrLCBkZXN0ICs9IDIgKQorICAgICAgICBzcHJpbnRmIChkZXN0LCAiJTAyWCIsIHNyY1tpXSk7CisgICAgICAqZGVzdCsrID0gJyMnOworICAgIH0KKyAgcmV0dXJuIGxlbioyKzI7Cit9CisKK3N0YXRpYyBpbnQKK2NvbnZlcnRfdG9fc3RyaW5nIChjb25zdCB1bnNpZ25lZCBjaGFyICpzLCBzaXplX3QgbGVuLCBjaGFyICpkZXN0KQoreworICBpZiAoZGVzdCkKKyAgICB7CisgICAgICBjaGFyICpwID0gZGVzdDsKKyAgICAgICpwKysgPSAnXCInOworICAgICAgZm9yICg7IGxlbjsgbGVuLS0sIHMrKyApCisgICAgICAgIHsKKyAgICAgICAgICBzd2l0Y2ggKCpzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSAnXGInOiAqcCsrID0gJ1xcJzsgKnArKyA9ICdiJzsgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnXHQnOiAqcCsrID0gJ1xcJzsgKnArKyA9ICd0JzsgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnXHYnOiAqcCsrID0gJ1xcJzsgKnArKyA9ICd2JzsgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnXG4nOiAqcCsrID0gJ1xcJzsgKnArKyA9ICduJzsgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnXGYnOiAqcCsrID0gJ1xcJzsgKnArKyA9ICdmJzsgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnXHInOiAqcCsrID0gJ1xcJzsgKnArKyA9ICdyJzsgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnXCInOiAqcCsrID0gJ1xcJzsgKnArKyA9ICdcIic7ICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ1wnJzogKnArKyA9ICdcXCc7ICpwKysgPSAnXCcnOyAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdcXCc6ICpwKysgPSAnXFwnOyAqcCsrID0gJ1xcJzsgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogCisgICAgICAgICAgICAgIGlmICggKCpzIDwgMHgyMCB8fCAoKnMgPj0gMHg3ZiAmJiAqcyA8PSAweGEwKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc3ByaW50ZiAocCwgIlxceCUwMngiLCAqcyk7IAorICAgICAgICAgICAgICAgICAgcCArPSA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICpwKysgPSAqczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgKnArKyA9ICdcIic7CisgICAgICByZXR1cm4gcCAtIGRlc3Q7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaW50IGNvdW50ID0gMjsKKyAgICAgIGZvciAoOyBsZW47IGxlbi0tLCBzKysgKQorICAgICAgICB7CisgICAgICAgICAgc3dpdGNoICgqcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgJ1xiJzogCisgICAgICAgICAgICBjYXNlICdcdCc6IAorICAgICAgICAgICAgY2FzZSAnXHYnOiAKKyAgICAgICAgICAgIGNhc2UgJ1xuJzogCisgICAgICAgICAgICBjYXNlICdcZic6IAorICAgICAgICAgICAgY2FzZSAnXHInOiAKKyAgICAgICAgICAgIGNhc2UgJ1wiJzoKKyAgICAgICAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgICAgIGNhc2UgJ1xcJzogY291bnQgKz0gMjsgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OiAKKyAgICAgICAgICAgICAgaWYgKCAoKnMgPCAweDIwIHx8ICgqcyA+PSAweDdmICYmICpzIDw9IDB4YTApKSkKKyAgICAgICAgICAgICAgICBjb3VudCArPSA0OworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KK30KKworCisKK3N0YXRpYyBpbnQKK2NvbnZlcnRfdG9fdG9rZW4gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgc2l6ZV90IGxlbiwgY2hhciAqZGVzdCkKK3sKKyAgaWYgKGRlc3QpCisgICAgbWVtY3B5IChkZXN0LCBzcmMsIGxlbik7CisgIHJldHVybiBsZW47Cit9CisKKworLyoqKioqKioqKioqKioqKioKKyAqIFByaW50IFNFWFAgdG8gYnVmZmVyIHVzaW5nIHRoZSBNT0RFLiAgUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZQorICogU0VYUCBpbiBidWZmZXIgb3IgMCBpZiB0aGUgYnVmZmVyIGlzIHRvbyBzaG9ydCAoV2UgaGF2ZSBhdCBsZWFzdCBhbgorICogZW1wdHkgbGlzdCBjb25zaXN0aW5nIG9mIDIgYnl0ZXMpLiAgSWYgYSBidWZmZXIgb2YgTlVMTCBpcyBwcm92aWRlZCwKKyAqIHRoZSByZXF1aXJlZCBsZW5ndGggaXMgcmV0dXJuZWQuCisgKi8KK3NpemVfdAorZ2NyeV9zZXhwX3NwcmludCAoY29uc3QgZ2NyeV9zZXhwX3QgbGlzdCwgaW50IG1vZGUsCisgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsIHNpemVfdCBtYXhsZW5ndGggKQoreworICBzdGF0aWMgdW5zaWduZWQgY2hhciBlbXB0eVszXSA9IHsgU1RfT1BFTiwgU1RfQ0xPU0UsIFNUX1NUT1AgfTsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqczsKKyAgY2hhciAqZDsKKyAgREFUQUxFTiBuOworICBjaGFyIG51bWJ1ZlsyMF07CisgIHNpemVfdCBsZW4gPSAwOworICBpbnQgaSwgaW5kZW50ID0gMDsKKyAgCisgIHMgPSBsaXN0PyBsaXN0LT5kIDogZW1wdHk7CisgIGQgPSBidWZmZXI7CisgIHdoaWxlICggKnMgIT0gU1RfU1RPUCApCisgICAgeworICAgICAgc3dpdGNoICggKnMgKQorICAgICAgICB7CisgICAgICAgIGNhc2UgU1RfT1BFTjoKKyAgICAgICAgICBzKys7CisgICAgICAgICAgaWYgKCBtb2RlICE9IEdDUllTRVhQX0ZNVF9DQU5PTiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChpbmRlbnQpCisgICAgICAgICAgICAgICAgbGVuKys7IAorICAgICAgICAgICAgICBsZW4gKz0gaW5kZW50OworICAgICAgICAgICAgfQorICAgICAgICAgIGxlbisrOworICAgICAgICAgIGlmICggYnVmZmVyICkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICggbGVuID49IG1heGxlbmd0aCApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgIGlmICggbW9kZSAhPSBHQ1JZU0VYUF9GTVRfQ0FOT04gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmIChpbmRlbnQpCisgICAgICAgICAgICAgICAgICAgICpkKysgPSAnXG4nOyAKKyAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgaW5kZW50OyBpKyspCisgICAgICAgICAgICAgICAgICAgICpkKysgPSAnICc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAqZCsrID0gJygnOworCSAgICB9CisgICAgICAgICAgaW5kZW50Kys7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1RfQ0xPU0U6CisgICAgICAgICAgcysrOworICAgICAgICAgIGxlbisrOworICAgICAgICAgIGlmICggYnVmZmVyICkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICggbGVuID49IG1heGxlbmd0aCApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICpkKysgPSAnKSc7CisJICAgIH0KKyAgICAgICAgICBpbmRlbnQtLTsKKyAgICAgICAgICBpZiAoKnMgIT0gU1RfT1BFTiAmJiAqcyAhPSBTVF9TVE9QICYmIG1vZGUgIT0gR0NSWVNFWFBfRk1UX0NBTk9OKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBsZW4rKzsKKyAgICAgICAgICAgICAgbGVuICs9IGluZGVudDsKKyAgICAgICAgICAgICAgaWYgKGJ1ZmZlcikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAobGVuID49IG1heGxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAqZCsrID0gJ1xuJzsKKyAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgaW5kZW50OyBpKyspCisgICAgICAgICAgICAgICAgICAgICpkKysgPSAnICc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNUX0RBVEE6CisgICAgICAgICAgcysrOworICAgICAgICAgIG1lbWNweSAoICZuLCBzLCBzaXplb2YgbiApOyBzICs9IHNpemVvZiBuOworICAgICAgICAgIGlmIChtb2RlID09IEdDUllTRVhQX0ZNVF9BRFZBTkNFRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaW50IHR5cGU7CisgICAgICAgICAgICAgIHNpemVfdCBubjsKKworICAgICAgICAgICAgICBzd2l0Y2ggKCAodHlwZT1zdWl0YWJsZV9lbmNvZGluZyAocywgbikpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDE6IG5uID0gY29udmVydF90b19zdHJpbmcgKHMsIG4sIE5VTEwpOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6IG5uID0gY29udmVydF90b190b2tlbiAocywgbiwgTlVMTCk7IGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IG5uID0gY29udmVydF90b19oZXggKHMsIG4sIE5VTEwpOyBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGxlbiArPSBubjsKKyAgICAgICAgICAgICAgaWYgKGJ1ZmZlcikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAobGVuID49IG1heGxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiBjb252ZXJ0X3RvX3N0cmluZyAocywgbiwgZCk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IGNvbnZlcnRfdG9fdG9rZW4gKHMsIG4sIGQpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogY29udmVydF90b19oZXggKHMsIG4sIGQpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZCArPSBubjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmIChzW25dICE9IFNUX0NMT1NFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGxlbisrOworICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlcikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPj0gbWF4bGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgICAgKmQrKyA9ICcgJzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHNwcmludGYgKG51bWJ1ZiwgIiV1OiIsICh1bnNpZ25lZCBpbnQpbiApOworICAgICAgICAgICAgICBsZW4gKz0gc3RybGVuIChudW1idWYpICsgbjsKKyAgICAgICAgICAgICAgaWYgKCBidWZmZXIgKSAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAoIGxlbiA+PSBtYXhsZW5ndGggKQorCQkgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICBkID0gc3RwY3B5ICggZCwgbnVtYnVmICk7CisgICAgICAgICAgICAgICAgICBtZW1jcHkgKCBkLCBzLCBuICk7IGQgKz0gbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgcyArPSBuOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIEJVRyAoKTsKKwl9CisgICAgfQorICBpZiAoIG1vZGUgIT0gR0NSWVNFWFBfRk1UX0NBTk9OICkKKyAgICB7CisgICAgICBsZW4rKzsKKyAgICAgIGlmIChidWZmZXIpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIGxlbiA+PSBtYXhsZW5ndGggKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgKmQrKyA9ICdcbic7IAorICAgICAgICB9CisgICAgfQorICBpZiAoYnVmZmVyKSAKKyAgICB7CisgICAgICBpZiAoIGxlbiA+PSBtYXhsZW5ndGggKQorICAgICAgICByZXR1cm4gMDsKKyAgICAgICpkKysgPSAwOyAvKiBmb3IgY29udmVuaWVuY2Ugd2UgbWFrZSBhIEMgc3RyaW5nICovCisgICAgfQorICBlbHNlCisgICAgbGVuKys7IC8qIHdlIG5lZWQgb25lIGJ5dGUgbW9yZSBmb3IgdGhpcyAqLworCisgIHJldHVybiBsZW47Cit9CisKKworLyogU2NhbiBhIGNhbm5vY2lhbCBlbmNvZGVkIGJ1ZmZlciB3aXRoIGltcGxpY2l0IGxlbmd0aCB2YWx1ZXMgYW5kCisgICByZXR1cm4gdGhlIGFjdHVhbCBsZW5ndGggdGhpcyBTLWV4cHJlc3Npb24gdXNlcy4gIEZvciBhIHZhbGlkIFMtRXhwCisgICBpdCBzaG91bGQgbmV2ZXIgcmV0dXJuIDAuICBJZiBMRU5HVEggaXMgbm90IHplcm8sIHRoZSBtYXhpbXVtCisgICBsZW5ndGggdG8gc2NhbiBpcyBnaXZlbiAtIHRoaXMgY2FuIGJlIHVzZWQgZm9yIHN5bnRheCBjaGVja3Mgb2YKKyAgIGRhdGEgcGFzc2VkIGZyb20gb3V0c2lkZS4gZXJyb3Jjb2RlIGFuZCBlcnJvZmYgbWF5IGJvdGggYmUgcGFzc2VkIGFzCisgICBOVUxMLiAgKi8KK3NpemVfdAorZ2NyeV9zZXhwX2Nhbm9uX2xlbiAoY29uc3QgdW5zaWduZWQgY2hhciAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoLCAKKyAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqZXJyb2ZmLCBnY3J5X2Vycm9yX3QgKmVycmNvZGUpCit7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnA7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRpc3BoaW50ID0gTlVMTDsKKyAgdW5zaWduZWQgaW50IGRhdGFsZW4gPSAwOworICBzaXplX3QgZHVtbXlfZXJyb2ZmOworICBnY3J5X2Vycm9yX3QgZHVtbXlfZXJyY29kZTsKKyAgc2l6ZV90IGNvdW50ID0gMDsKKyAgaW50IGxldmVsID0gMDsKKworICBpZiAoIWVycm9mZikKKyAgICBlcnJvZmYgPSAmZHVtbXlfZXJyb2ZmOworICBpZiAoIWVycmNvZGUpCisgICAgZXJyY29kZSA9ICZkdW1teV9lcnJjb2RlOworCisgICplcnJjb2RlID0gZ2NyeV9lcnJvciAoR1BHX0VSUl9OT19FUlJPUik7CisgICplcnJvZmYgPSAwOworICBpZiAoIWJ1ZmZlcikKKyAgICByZXR1cm4gMDsKKyAgaWYgKCpidWZmZXIgIT0gJygnKQorICAgIHsKKyAgICAgICplcnJjb2RlID0gZ2NyeV9lcnJvciAoR1BHX0VSUl9TRVhQX05PVF9DQU5PTklDQUwpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGZvciAocD1idWZmZXI7IDsgcCsrLCBjb3VudCsrICkKKyAgICB7CisgICAgICBpZiAobGVuZ3RoICYmIGNvdW50ID49IGxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICplcnJvZmYgPSBjb3VudDsKKyAgICAgICAgICAqZXJyY29kZSA9IGdjcnlfZXJyb3IgKEdQR19FUlJfU0VYUF9TVFJJTkdfVE9PX0xPTkcpOworICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAKKyAgICAgIGlmIChkYXRhbGVuKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCpwID09ICc6JykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKGxlbmd0aCAmJiAoY291bnQrZGF0YWxlbikgPj0gbGVuZ3RoKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICplcnJvZmYgPSBjb3VudDsKKyAgICAgICAgICAgICAgICAgICplcnJjb2RlID0gZ2NyeV9lcnJvciAoR1BHX0VSUl9TRVhQX1NUUklOR19UT09fTE9ORyk7CisgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGNvdW50ICs9IGRhdGFsZW47CisgICAgICAgICAgICAgIHAgKz0gZGF0YWxlbjsKKyAgICAgICAgICAgICAgZGF0YWxlbiA9IDA7CisJICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChkaWdpdHAocCkpCisgICAgICAgICAgICBkYXRhbGVuID0gZGF0YWxlbioxMCArIGF0b2lfMShwKTsKKyAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAqZXJyb2ZmID0gY291bnQ7CisgICAgICAgICAgICAgICplcnJjb2RlID0gZ2NyeV9lcnJvciAoR1BHX0VSUl9TRVhQX0lOVl9MRU5fU1BFQyk7CisgICAgICAgICAgICAgIHJldHVybiAwOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoKnAgPT0gJygnKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRpc3BoaW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAqZXJyb2ZmID0gY291bnQ7CisgICAgICAgICAgICAgICplcnJjb2RlID0gZ2NyeV9lcnJvciAoR1BHX0VSUl9TRVhQX1VOTUFUQ0hFRF9ESCk7CisgICAgICAgICAgICAgIHJldHVybiAwOworCSAgICB9CisgICAgICAgICAgbGV2ZWwrKzsKKwl9CisgICAgICBlbHNlIGlmICgqcCA9PSAnKScpCisgICAgICAgIHsgLyogd2FsayB1cCAqLworICAgICAgICAgIGlmICghbGV2ZWwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICplcnJvZmYgPSBjb3VudDsKKyAgICAgICAgICAgICAgKmVycmNvZGUgPSBnY3J5X2Vycm9yIChHUEdfRVJSX1NFWFBfVU5NQVRDSEVEX1BBUkVOKTsKKyAgICAgICAgICAgICAgcmV0dXJuIDA7CisJICAgIH0KKyAgICAgICAgICBpZiAoZGlzcGhpbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICplcnJvZmYgPSBjb3VudDsKKyAgICAgICAgICAgICAgKmVycmNvZGUgPSBnY3J5X2Vycm9yIChHUEdfRVJSX1NFWFBfVU5NQVRDSEVEX0RIKTsKKyAgICAgICAgICAgICAgcmV0dXJuIDA7CisJICAgIH0KKyAgICAgICAgICBpZiAoIS0tbGV2ZWwpCisgICAgICAgICAgICByZXR1cm4gKytjb3VudDsgLyogcmVhZHkgKi8KKwl9CisgICAgICBlbHNlIGlmICgqcCA9PSAnWycpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZGlzcGhpbnQpIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAqZXJyb2ZmID0gY291bnQ7CisgICAgICAgICAgICAgICplcnJjb2RlID0gZ2NyeV9lcnJvciAoR1BHX0VSUl9TRVhQX05FU1RFRF9ESCk7CisgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgIGRpc3BoaW50ID0gcDsKKwl9CisgICAgICBlbHNlIGlmICgqcCA9PSAnXScpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoICFkaXNwaGludCApIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAqZXJyb2ZmID0gY291bnQ7CisgICAgICAgICAgICAgICplcnJjb2RlID0gZ2NyeV9lcnJvciAoR1BHX0VSUl9TRVhQX1VOTUFUQ0hFRF9ESCk7CisgICAgICAgICAgICAgIHJldHVybiAwOworCSAgICB9CisgICAgICAgICAgZGlzcGhpbnQgPSBOVUxMOworCX0KKyAgICAgIGVsc2UgaWYgKGRpZ2l0cCAocCkgKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCpwID09ICcwJykKKyAgICAgICAgICAgIHsgCisgICAgICAgICAgICAgICplcnJvZmYgPSBjb3VudDsKKyAgICAgICAgICAgICAgKmVycmNvZGUgPSBnY3J5X2Vycm9yIChHUEdfRVJSX1NFWFBfWkVST19QUkVGSVgpOworICAgICAgICAgICAgICByZXR1cm4gMDsKKwkgICAgfQorICAgICAgICAgIGRhdGFsZW4gPSBhdG9pXzEgKHApOworCX0KKyAgICAgIGVsc2UgaWYgKCpwID09ICcmJyB8fCAqcCA9PSAnXFwnKQorICAgICAgICB7CisgICAgICAgICAgKmVycm9mZiA9IGNvdW50OworICAgICAgICAgICplcnJjb2RlID0gZ2NyeV9lcnJvciAoR1BHX0VSUl9TRVhQX1VORVhQRUNURURfUFVOQyk7CisgICAgICAgICAgcmV0dXJuIDA7CisJfQorICAgICAgZWxzZQorICAgICAgICB7IAorICAgICAgICAgICplcnJvZmYgPSBjb3VudDsKKyAgICAgICAgICAqZXJyY29kZSA9IGdjcnlfZXJyb3IgKEdQR19FUlJfU0VYUF9CQURfQ0hBUkFDVEVSKTsKKyAgICAgICAgICByZXR1cm4gMDsKKwl9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L3NyYy9zdGRtZW0uYyBiL2xpYmdjcnlwdC0xLjQuNi9zcmMvc3RkbWVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI4YWRlYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9zcmMvc3RkbWVtLmMKQEAgLTAsMCArMSwyMzUgQEAKKy8qIHN0ZG1lbS5jICAtCXByaXZhdGUgbWVtb3J5IGFsbG9jYXRvcgorICogQ29weXJpZ2h0IChDKSAxOTk4LCAyMDAwLCAyMDAyLCAyMDA1LCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIGdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisvKgorICogRGVzY3JpcHRpb24gb2YgdGhlIGxheWVyZWQgbWVtb3J5IG1hbmFnZW1lbnQgaW4gTGliZ2NyeXB0OgorICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtVc2VyXQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIC8KKyAqICAgICAgICAgICAgICAgICAgIGdsb2JhbC5jOiBbTU0gZW50cmFuY2UgcG9pbnRzXSAgIC0tLS0tPiBbdXNlciBjYWxsYmFja3NdCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwgLyAgICAgICAgXCAvCisgKgorICogICAgICBzdGRtZW0uYzogW25vbi1zZWN1cmUgaGFuZGxlcnNdIFtzZWN1cmUgaGFuZGxlcnNdCisgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwgLyAgICAgICBcIC8KKyAqCisgKiAgICAgICAgICAgICAgICAgIHN0ZG1lbS5jOiBbIG1lbW9yeSBndWFyZCBdCisgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwgLyAgICAgICBcIC8KKyAqCisgKiAgICAgICAgICAgbGliYzogWyBNTSBmdW5jdGlvbnMgXSAgICAgc2VjbWVtLmM6IFsgc2VjdXJlIE1NIGZ1bmN0aW9uc10KKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2luY2x1ZGUgImcxMGxpYi5oIgorI2luY2x1ZGUgInN0ZG1lbS5oIgorI2luY2x1ZGUgInNlY21lbS5oIgorCisMCisKKyNkZWZpbmUgTUFHSUNfTk9SX0JZVEUgMHg1NQorI2RlZmluZSBNQUdJQ19TRUNfQllURSAweGNjCisjZGVmaW5lIE1BR0lDX0VORF9CWVRFIDB4YWEKKworI2lmIFNJWkVPRl9VTlNJR05FRF9MT05HID09IDgKKyNkZWZpbmUgRVhUUkFfQUxJR04gNAorI2Vsc2UKKyNkZWZpbmUgRVhUUkFfQUxJR04gMAorI2VuZGlmCisKKworc3RhdGljIGludCB1c2VfbV9ndWFyZCA9IDA7CisKKy8qKioqKioqKioqKioqKioqCisgKiBXYXJuaW5nOiBOZXZlciB1c2UgdGhpcyBmdW5jdGlvbiBhZnRlciBhbnkgb2YgdGhlIGZ1bmN0aW9ucworICogaGVyZSBoYXZlIGJlZW4gdXNlZC4KKyAqLwordm9pZAorX2djcnlfcHJpdmF0ZV9lbmFibGVfbV9ndWFyZCAodm9pZCkKK3sKKyAgdXNlX21fZ3VhcmQgPSAxOworfQorCisKKy8qCisgKiBBbGxvY2F0ZSBtZW1vcnkgb2Ygc2l6ZSBuLgorICogUmV0dXJuIE5VTEwgaWYgd2UgYXJlIG91dCBvZiBtZW1vcnkuCisgKi8KK3ZvaWQgKgorX2djcnlfcHJpdmF0ZV9tYWxsb2MgKHNpemVfdCBuKQoreworICBpZiAoIW4pIAorICAgIHJldHVybiBOVUxMOyAvKiBBbGxvY2F0aW5nIDAgYnl0ZXMgaXMgdW5kZWZpbmVkIC0gd2UgYmV0dGVyIHJldHVybgorICAgICAgICAgICAgICAgICAgICBhbiBlcnJvciB0byBkZXRlY3Qgc3VjaCBjb2RpbmcgZXJyb3JzLiAgKi8KKyAgaWYgKHVzZV9tX2d1YXJkKSAKKyAgICB7CisgICAgICBjaGFyICpwOworICAgICAgCisgICAgICBpZiAoICEocCA9IG1hbGxvYyAobiArIEVYVFJBX0FMSUdOKzUpKSApCisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgKChieXRlKilwKVtFWFRSQV9BTElHTiswXSA9IG47CisgICAgICAoKGJ5dGUqKXApW0VYVFJBX0FMSUdOKzFdID0gbiA+PiA4IDsKKyAgICAgICgoYnl0ZSopcClbRVhUUkFfQUxJR04rMl0gPSBuID4+IDE2IDsKKyAgICAgICgoYnl0ZSopcClbRVhUUkFfQUxJR04rM10gPSBNQUdJQ19OT1JfQllURTsKKyAgICAgIHBbNCtFWFRSQV9BTElHTituXSA9IE1BR0lDX0VORF9CWVRFOworICAgICAgcmV0dXJuIHArRVhUUkFfQUxJR04rNDsKKyAgICB9CisgIGVsc2UgCisgICAgeworICAgICAgcmV0dXJuIG1hbGxvYyggbiApOworICAgIH0KK30KKworCisvKgorICogQWxsb2NhdGUgbWVtb3J5IG9mIHNpemUgTiBmcm9tIHRoZSBzZWN1cmUgbWVtb3J5IHBvb2wuICBSZXR1cm4gTlVMTAorICogaWYgd2UgYXJlIG91dCBvZiBtZW1vcnkuCisgKi8KK3ZvaWQgKgorX2djcnlfcHJpdmF0ZV9tYWxsb2Nfc2VjdXJlIChzaXplX3QgbikKK3sKKyAgaWYgKCFuKSAKKyAgICByZXR1cm4gTlVMTDsgLyogQWxsb2NhdGluZyAwIGJ5dGVzIGlzIHVuZGVmaW5lZCAtIGJldHRlciByZXR1cm4gYW4KKyAgICAgICAgICAgICAgICAgICAgZXJyb3IgdG8gZGV0ZWN0IHN1Y2ggY29kaW5nIGVycm9ycy4gICovCisgIGlmICh1c2VfbV9ndWFyZCkgCisgICAgeworICAgICAgY2hhciAqcDsKKyAgICAgIAorICAgICAgaWYgKCAhKHAgPSBfZ2NyeV9zZWNtZW1fbWFsbG9jIChuICtFWFRSQV9BTElHTisgNSkpICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAoKGJ5dGUqKXApW0VYVFJBX0FMSUdOKzBdID0gbjsKKyAgICAgICgoYnl0ZSopcClbRVhUUkFfQUxJR04rMV0gPSBuID4+IDggOworICAgICAgKChieXRlKilwKVtFWFRSQV9BTElHTisyXSA9IG4gPj4gMTYgOworICAgICAgKChieXRlKilwKVtFWFRSQV9BTElHTiszXSA9IE1BR0lDX1NFQ19CWVRFOworICAgICAgcFs0K0VYVFJBX0FMSUdOK25dID0gTUFHSUNfRU5EX0JZVEU7CisgICAgICByZXR1cm4gcCtFWFRSQV9BTElHTis0OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJldHVybiBfZ2NyeV9zZWNtZW1fbWFsbG9jKCBuICk7CisgICAgfQorfQorCisKKy8qCisgKiBSZWFsbG9jIGFuZCBjbGVhciB0aGUgb2xkIHNwYWNlCisgKiBSZXR1cm4gTlVMTCBpZiB0aGVyZSBpcyBub3QgZW5vdWdoIG1lbW9yeS4KKyAqLwordm9pZCAqCitfZ2NyeV9wcml2YXRlX3JlYWxsb2MgKCB2b2lkICphLCBzaXplX3QgbiApCit7CisgIGlmICh1c2VfbV9ndWFyZCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBjaGFyICpwID0gYTsKKyAgICAgIGNoYXIgKmI7CisgICAgICBzaXplX3QgbGVuOworICAgICAgCisgICAgICBpZiAoIWEpCisgICAgICAgIHJldHVybiBfZ2NyeV9wcml2YXRlX21hbGxvYyhuKTsKKyAgICAgICAgCisgICAgICBfZ2NyeV9wcml2YXRlX2NoZWNrX2hlYXAocCk7CisgICAgICBsZW4gID0gcFstNF07CisgICAgICBsZW4gfD0gcFstM10gPDwgODsKKyAgICAgIGxlbiB8PSBwWy0yXSA8PCAxNjsKKyAgICAgIGlmKCBsZW4gPj0gbiApIC8qIFdlIGRvbid0IHNocmluayBmb3Igbm93LiAqLworICAgICAgICByZXR1cm4gYTsKKyAgICAgIGlmIChwWy0xXSA9PSBNQUdJQ19TRUNfQllURSkKKyAgICAgICAgYiA9IF9nY3J5X3ByaXZhdGVfbWFsbG9jX3NlY3VyZShuKTsKKyAgICAgIGVsc2UKKyAgICAgICAgYiA9IF9nY3J5X3ByaXZhdGVfbWFsbG9jKG4pOworICAgICAgaWYgKCFiKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIG1lbWNweSAoYiwgYSwgbGVuKTsKKyAgICAgIG1lbXNldCAoYitsZW4sIDAsIG4tbGVuKTsKKyAgICAgIF9nY3J5X3ByaXZhdGVfZnJlZSAocCk7CisgICAgICByZXR1cm4gYjsKKyAgICB9CisgIGVsc2UgaWYgKCBfZ2NyeV9wcml2YXRlX2lzX3NlY3VyZShhKSApCisgICAgeworICAgICAgcmV0dXJuIF9nY3J5X3NlY21lbV9yZWFsbG9jKCBhLCBuICk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcmV0dXJuIHJlYWxsb2MoIGEsIG4gKTsKKyAgICB9Cit9CisKKwordm9pZAorX2djcnlfcHJpdmF0ZV9jaGVja19oZWFwIChjb25zdCB2b2lkICphKQoreworICBpZiAodXNlX21fZ3VhcmQpCisgICAgeworICAgICAgY29uc3QgYnl0ZSAqcCA9IGE7CisgICAgICBzaXplX3QgbGVuOworICAgICAgCisgICAgICBpZiAoIXApCisgICAgICAgIHJldHVybjsKKyAgICAgIAorICAgICAgaWYgKCAhKHBbLTFdID09IE1BR0lDX05PUl9CWVRFIHx8IHBbLTFdID09IE1BR0lDX1NFQ19CWVRFKSApCisgICAgICAgIF9nY3J5X2xvZ19mYXRhbCAoIm1lbW9yeSBhdCAlcCBjb3JydXB0ZWQgKHVuZGVyZmxvdz0lMDJ4KVxuIiwgcCwgcFstMV0pOworICAgICAgbGVuICA9IHBbLTRdOworICAgICAgbGVuIHw9IHBbLTNdIDw8IDg7CisgICAgICBsZW4gfD0gcFstMl0gPDwgMTY7CisgICAgICBpZiAoIHBbbGVuXSAhPSBNQUdJQ19FTkRfQllURSApCisgICAgICAgIF9nY3J5X2xvZ19mYXRhbCAoIm1lbW9yeSBhdCAlcCBjb3JydXB0ZWQgKG92ZXJmbG93PSUwMngpXG4iLCBwLCBwWy0xXSk7CisgICAgfQorfQorCisKKy8qCisgKiBGcmVlIGEgbWVtb3J5IGJsb2NrIGFsbG9jYXRlZCBieSB0aGlzIG9yIHRoZSBzZWNtZW0gbW9kdWxlCisgKi8KK3ZvaWQKK19nY3J5X3ByaXZhdGVfZnJlZSAodm9pZCAqYSkKK3sKKyAgdW5zaWduZWQgY2hhciAqcCA9IGE7CisKKyAgaWYgKCFwKQorICAgIHJldHVybjsKKyAgaWYgKHVzZV9tX2d1YXJkICkKKyAgICB7CisgICAgICBfZ2NyeV9wcml2YXRlX2NoZWNrX2hlYXAocCk7CisgICAgICBpZiAoIF9nY3J5X3ByaXZhdGVfaXNfc2VjdXJlKGEpICkKKyAgICAgICAgX2djcnlfc2VjbWVtX2ZyZWUocC1FWFRSQV9BTElHTi00KTsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGZyZWUocC1FWFRSQV9BTElHTi00KTsKKwl9CisgICAgfQorICBlbHNlIGlmICggX2djcnlfcHJpdmF0ZV9pc19zZWN1cmUoYSkgKQorICAgIF9nY3J5X3NlY21lbV9mcmVlKHApOworICBlbHNlCisgICAgZnJlZShwKTsKK30KKworCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvc3JjL3N0ZG1lbS5oIGIvbGliZ2NyeXB0LTEuNC42L3NyYy9zdGRtZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDc2ZTdlCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L3NyYy9zdGRtZW0uaApAQCAtMCwwICsxLDMyIEBACisvKiBzdGRtZW0uaCAtICBpbnRlcm5hbCBkZWZpbml0aW9ucyBmb3Igc3RkbWVtCisgKglDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDIsIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgZ2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICovCisKKyNpZm5kZWYgRzEwX1NURE1FTV9ICisjZGVmaW5lIEcxMF9TVERNRU1fSCAxCisKK3ZvaWQgX2djcnlfcHJpdmF0ZV9lbmFibGVfbV9ndWFyZCh2b2lkKTsKKwordm9pZCAqX2djcnlfcHJpdmF0ZV9tYWxsb2MgKHNpemVfdCBuKSBfR0NSWV9HQ0NfQVRUUl9NQUxMT0M7Cit2b2lkICpfZ2NyeV9wcml2YXRlX21hbGxvY19zZWN1cmUgKHNpemVfdCBuKSBfR0NSWV9HQ0NfQVRUUl9NQUxMT0M7Cit2b2lkICpfZ2NyeV9wcml2YXRlX3JlYWxsb2MgKHZvaWQgKmEsIHNpemVfdCBuKTsKK3ZvaWQgX2djcnlfcHJpdmF0ZV9jaGVja19oZWFwIChjb25zdCB2b2lkICphKTsKK3ZvaWQgX2djcnlfcHJpdmF0ZV9mcmVlICh2b2lkICphKTsKKworI2VuZGlmIC8qIEcxMF9TVERNRU1fSCAqLwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L3NyYy90eXBlcy5oIGIvbGliZ2NyeXB0LTEuNC42L3NyYy90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMGE2MmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvc3JjL3R5cGVzLmgKQEAgLTAsMCArMSwxMjggQEAKKy8qIHR5cGVzLmggLSBzb21lIGNvbW1vbiB0eXBlZGVmcworICoJQ29weXJpZ2h0IChDKSAxOTk4LCAyMDAwLCAyMDAyLCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIGdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqLworCisjaWZuZGVmIEdDUllQVF9UWVBFU19ICisjZGVmaW5lIEdDUllQVF9UWVBFU19ICisKKworLyogVGhlIEFDX0NIRUNLX1NJWkVPRigpIGluIGNvbmZpZ3VyZSBmYWlscyBmb3Igc29tZSBtYWNoaW5lcy4KKyAqIHdlIHByb3ZpZGUgc29tZSBmYWxsYmFjayB2YWx1ZXMgaGVyZSAqLworI2lmICFTSVpFT0ZfVU5TSUdORURfU0hPUlQKKyN1bmRlZiBTSVpFT0ZfVU5TSUdORURfU0hPUlQKKyNkZWZpbmUgU0laRU9GX1VOU0lHTkVEX1NIT1JUIDIKKyNlbmRpZgorI2lmICFTSVpFT0ZfVU5TSUdORURfSU5UCisjdW5kZWYgU0laRU9GX1VOU0lHTkVEX0lOVAorI2RlZmluZSBTSVpFT0ZfVU5TSUdORURfSU5UIDQKKyNlbmRpZgorI2lmICFTSVpFT0ZfVU5TSUdORURfTE9ORworI3VuZGVmIFNJWkVPRl9VTlNJR05FRF9MT05HCisjZGVmaW5lIFNJWkVPRl9VTlNJR05FRF9MT05HIDQKKyNlbmRpZgorCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworCisjaWZuZGVmIEhBVkVfQllURV9UWVBFREVGCisjdW5kZWYgYnl0ZQkgICAgLyogbWF5YmUgdGhlcmUgaXMgYSBtYWNybyB3aXRoIHRoaXMgbmFtZSAqLworLyogV2luZG93cyB0eXBlZGVmcyBieXRlIGluIHRoZSBycGMgaGVhZGVycy4gIEF2b2lkIHdhcm5pbmcgYWJvdXQKKyAgIGRvdWJsZSBkZWZpbml0aW9uLiAgKi8KKyNpZiAhKGRlZmluZWQoX1dJTjMyKSAmJiBkZWZpbmVkKGNiTkRSQ29udGV4dCkpCisgIHR5cGVkZWYgdW5zaWduZWQgY2hhciBieXRlOworI2VuZGlmCisjZGVmaW5lIEhBVkVfQllURV9UWVBFREVGCisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1VTSE9SVF9UWVBFREVGCisjdW5kZWYgdXNob3J0ICAgICAvKiBtYXliZSB0aGVyZSBpcyBhIG1hY3JvIHdpdGggdGhpcyBuYW1lICovCisgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgdXNob3J0OworI2RlZmluZSBIQVZFX1VTSE9SVF9UWVBFREVGCisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1VMT05HX1RZUEVERUYKKyN1bmRlZiB1bG9uZwkgICAgLyogbWF5YmUgdGhlcmUgaXMgYSBtYWNybyB3aXRoIHRoaXMgbmFtZSAqLworICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgdWxvbmc7CisjZGVmaW5lIEhBVkVfVUxPTkdfVFlQRURFRgorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9VMTZfVFlQRURFRgorI3VuZGVmIHUxNgkgICAgLyogbWF5YmUgdGhlcmUgaXMgYSBtYWNybyB3aXRoIHRoaXMgbmFtZSAqLworI2lmIFNJWkVPRl9VTlNJR05FRF9JTlQgPT0gMgorICAgIHR5cGVkZWYgdW5zaWduZWQgaW50ICAgdTE2OworI2VsaWYgU0laRU9GX1VOU0lHTkVEX1NIT1JUID09IDIKKyAgICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHUxNjsKKyNlbHNlCisjZXJyb3Igbm8gdHlwZWRlZiBmb3IgdTE2CisjZW5kaWYKKyNkZWZpbmUgSEFWRV9VMTZfVFlQRURFRgorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9VMzJfVFlQRURFRgorI3VuZGVmIHUzMgkgICAgLyogbWF5YmUgdGhlcmUgaXMgYSBtYWNybyB3aXRoIHRoaXMgbmFtZSAqLworI2lmIFNJWkVPRl9VTlNJR05FRF9JTlQgPT0gNAorICAgIHR5cGVkZWYgdW5zaWduZWQgaW50IHUzMjsKKyNlbGlmIFNJWkVPRl9VTlNJR05FRF9MT05HID09IDQKKyAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgdTMyOworI2Vsc2UKKyNlcnJvciBubyB0eXBlZGVmIGZvciB1MzIKKyNlbmRpZgorI2RlZmluZSBIQVZFX1UzMl9UWVBFREVGCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioKKyAqIFdhcm5pbmc6IFNvbWUgc3lzdGVtcyBzZWdmYXVsdCB3aGVuIHRoaXMgdTY0IHR5cGVkZWYgYW5kCisgKiB0aGUgZHVtbXkgY29kZSBpbiBjaXBoZXIvbWQuYyBpcyBub3QgYXZhaWxhYmxlLiAgRXhhbXBsZXMgYXJlCisgKiBTb2xhcmlzIGFuZCBJUklYLgorICovCisjaWZuZGVmIEhBVkVfVTY0X1RZUEVERUYKKyN1bmRlZiB1NjQJICAgIC8qIG1heWJlIHRoZXJlIGlzIGEgbWFjcm8gd2l0aCB0aGlzIG5hbWUgKi8KKyNpZiBTSVpFT0ZfVU5TSUdORURfSU5UID09IDgKKyAgICB0eXBlZGVmIHVuc2lnbmVkIGludCB1NjQ7CisjZGVmaW5lIFU2NF9DKGMpIChjICMjIFUpCisjZGVmaW5lIEhBVkVfVTY0X1RZUEVERUYKKyNlbGlmIFNJWkVPRl9VTlNJR05FRF9MT05HID09IDgKKyAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgdTY0OworI2RlZmluZSBVNjRfQyhjKSAoYyAjIyBVTCkKKyNkZWZpbmUgSEFWRV9VNjRfVFlQRURFRgorI2VsaWYgU0laRU9GX1VOU0lHTkVEX0xPTkdfTE9ORyA9PSA4CisgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdTY0OworI2RlZmluZSBVNjRfQyhjKSAoYyAjIyBVTEwpCisjZGVmaW5lIEhBVkVfVTY0X1RZUEVERUYKKyNlbGlmIFNJWkVPRl9VSU5UNjRfVCA9PSA4CisgICAgdHlwZWRlZiB1aW50NjRfdCB1NjQ7CisjZGVmaW5lIFU2NF9DKGMpIChVSU5UNjRfQyhjKSkKKyNkZWZpbmUgSEFWRV9VNjRfVFlQRURFRgorI2VuZGlmCisjZW5kaWYKKwordHlwZWRlZiB1bmlvbiB7CisgICAgaW50IGE7CisgICAgc2hvcnQgYjsKKyAgICBjaGFyIGNbMV07CisgICAgbG9uZyBkOworI2lmZGVmIEhBVkVfVTY0X1RZUEVERUYKKyAgICB1NjQgZTsKKyNlbmRpZgorICAgIGZsb2F0IGY7CisgICAgZG91YmxlIGc7Cit9IFBST1BFUkxZX0FMSUdORURfVFlQRTsKKworI2VuZGlmIC8qR0NSWVBUX1RZUEVTX0gqLwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L3NyYy92ZXJzaW9uaW5mby5yYy5pbiBiL2xpYmdjcnlwdC0xLjQuNi9zcmMvdmVyc2lvbmluZm8ucmMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVlODdlMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9zcmMvdmVyc2lvbmluZm8ucmMuaW4KQEAgLTAsMCArMSw1MiBAQAorLyogdmVyc2lvbmluZm8ucmMuaW4gLSBmb3IgbGliZ2NyeXB0CisgKiAgICBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYgZzEwIENvZGUgR21iSAorICogCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0aGUgYXV0aG9yIGdpdmVzCisgKiB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQgZXZlbiB0aGUKKyAqIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisgCisvKiBUaGlzIGZpbGUgaXMgcHJvY2Vzc2VkIGJ5IGNvbmZpZ3VyZSB0byBjcmVhdGUgdmVyc2lvbmluZm8ucmMgKi8KKworI2xpbmUgX19MSU5FX18gInZlcnNpb25pbmZvLnJjLmluIgorCisjaW5jbHVkZSA8YWZ4cmVzLmg+CisKKworVlNfVkVSU0lPTl9JTkZPIFZFUlNJT05JTkZPCisgRklMRVZFUlNJT04gQExJQkdDUllQVF9MVF9DVVJSRU5UQCxATElCR0NSWVBUX0xUX0FHRUAsQExJQkdDUllQVF9MVF9SRVZJU0lPTkAsQEJVSUxEX1JFVklTSU9OQAorIFBST0RVQ1RWRVJTSU9OIEBCVUlMRF9GSUxFVkVSU0lPTkAKKyBGSUxFRkxBR1NNQVNLIDB4M2ZMCisjaWZkZWYgX0RFQlVHCisgRklMRUZMQUdTIDB4MjFMCisjZWxzZQorIEZJTEVGTEFHUyAweDIwTAorI2VuZGlmCisgRklMRU9TIDB4NDAwMDRMCisgRklMRVRZUEUgMHgxTAorIEZJTEVTVUJUWVBFIDB4MEwKK0JFR0lOCisgICAgQkxPQ0sgIlN0cmluZ0ZpbGVJbmZvIgorICAgIEJFR0lOCisgICAgICAgIEJMT0NLICIwNDA5MDRiMCIKKyAgICAgICAgQkVHSU4KKyAgICAgICAgICAgIFZBTFVFICJDb21tZW50cyIsICJQcm92aWRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoTEdQTHYyLjErKS5cMCIKKyAgICAgICAgICAgIFZBTFVFICJDb21wYW55TmFtZSIsICJnMTAgQ29kZSBHbWJIXDAiCisgICAgICAgICAgICBWQUxVRSAiRmlsZURlc2NyaXB0aW9uIiwgIkxpYmdjcnlwdCAtIFRoZSBHTlUgQ3J5cHRvIExpYnJhcnlcMCIKKyAgICAgICAgICAgIFZBTFVFICJGaWxlVmVyc2lvbiIsICJATElCR0NSWVBUX0xUX0NVUlJFTlRALkBMSUJHQ1JZUFRfTFRfQUdFQC5ATElCR0NSWVBUX0xUX1JFVklTSU9OQC5AQlVJTERfUkVWSVNJT05AXDAiCisgICAgICAgICAgICBWQUxVRSAiSW50ZXJuYWxOYW1lIiwgImxpYmdjcnlwdFwwIgorICAgICAgICAgICAgVkFMVUUgIkxlZ2FsQ29weXJpZ2h0IiwgIkNvcHlyaWdodCCpIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuXDAiCisgICAgICAgICAgICBWQUxVRSAiTGVnYWxUcmFkZW1hcmtzIiwgIlwwIgorICAgICAgICAgICAgVkFMVUUgIk9yaWdpbmFsRmlsZW5hbWUiLCAibGliZ2NyeXB0LmRsbFwwIgorICAgICAgICAgICAgVkFMVUUgIlByaXZhdGVCdWlsZCIsICJcMCIKKyAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0TmFtZSIsICJsaWJnY3J5cHRcMCIKKyAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0VmVyc2lvbiIsICJAVkVSU0lPTkBcMCIKKyAgICAgICAgICAgIFZBTFVFICJTcGVjaWFsQnVpbGQiLCAiQEJVSUxEX1RJTUVTVEFNUEBcMCIKKyAgICAgICAgRU5ECisgICAgRU5ECitFTkQKKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L3NyYy92aXNpYmlsaXR5LmMgYi9saWJnY3J5cHQtMS40LjYvc3JjL3Zpc2liaWxpdHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTg3YTY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L3NyYy92aXNpYmlsaXR5LmMKQEAgLTAsMCArMSwxNDUzIEBACisvKiB2aXNpYmlsaXR5LmMgLSBXcmFwcGVyIGZvciBhbGwgcHVibGljIGZ1bmN0aW9ucy4KKyAqIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2RlZmluZSBfR0NSWV9JTkNMVURFRF9CWV9WSVNJQklMSVRZX0MgCisjaW5jbHVkZSAiZzEwbGliLmgiCisjaW5jbHVkZSAiY2lwaGVyLXByb3RvLmgiCisKKworCitjb25zdCBjaGFyICoKK2djcnlfc3RyZXJyb3IgKGdjcnlfZXJyb3JfdCBlcnIpCit7CisgIHJldHVybiBfZ2NyeV9zdHJlcnJvciAoZXJyKTsKK30KKworY29uc3QgY2hhciAqCitnY3J5X3N0cnNvdXJjZSAoZ2NyeV9lcnJvcl90IGVycikKK3sKKyAgcmV0dXJuIF9nY3J5X3N0cnNvdXJjZSAoZXJyKTsKK30KKworZ2NyeV9lcnJfY29kZV90IAorZ2NyeV9lcnJfY29kZV9mcm9tX2Vycm5vIChpbnQgZXJyKQoreworICByZXR1cm4gX2djcnlfZXJyX2NvZGVfZnJvbV9lcnJubyAoZXJyKTsKK30KKworaW50CitnY3J5X2Vycl9jb2RlX3RvX2Vycm5vIChnY3J5X2Vycl9jb2RlX3QgY29kZSkKK3sKKyAgcmV0dXJuIF9nY3J5X2Vycl9jb2RlX3RvX2Vycm5vIChjb2RlKTsKK30KKworZ2NyeV9lcnJvcl90IAorZ2NyeV9lcnJfbWFrZV9mcm9tX2Vycm5vIChnY3J5X2Vycl9zb3VyY2VfdCBzb3VyY2UsIGludCBlcnIpCit7CisgIHJldHVybiBfZ2NyeV9lcnJfbWFrZV9mcm9tX2Vycm5vIChzb3VyY2UsIGVycik7Cit9CisKK2djcnlfZXJyX2NvZGVfdCAKK2djcnlfZXJyb3JfZnJvbV9lcnJubyAoaW50IGVycikKK3sKKyAgcmV0dXJuIF9nY3J5X2Vycm9yX2Zyb21fZXJybm8gKGVycik7Cit9CisKK2NvbnN0IGNoYXIgKgorZ2NyeV9jaGVja192ZXJzaW9uIChjb25zdCBjaGFyICpyZXFfdmVyc2lvbikKK3sKKyAgcmV0dXJuIF9nY3J5X2NoZWNrX3ZlcnNpb24gKHJlcV92ZXJzaW9uKTsKK30KKworZ2NyeV9lcnJvcl90IAorZ2NyeV9jb250cm9sIChlbnVtIGdjcnlfY3RsX2NtZHMgY21kLCAuLi4pCit7CisgIGdjcnlfZXJyb3JfdCBlcnI7CisgIHZhX2xpc3QgYXJnX3B0cjsKKyAgCisgIHZhX3N0YXJ0IChhcmdfcHRyLCBjbWQpOworICBlcnIgPSBfZ2NyeV92Y29udHJvbCAoY21kLCBhcmdfcHRyKTsKKyAgdmFfZW5kKGFyZ19wdHIpOworICByZXR1cm4gZXJyOworfQorCitnY3J5X2Vycm9yX3QgCitnY3J5X3NleHBfbmV3IChnY3J5X3NleHBfdCAqcmV0c2V4cCwKKyAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCwKKyAgICAgICAgICAgICAgIGludCBhdXRvZGV0ZWN0KQoreworICByZXR1cm4gX2djcnlfc2V4cF9uZXcgKHJldHNleHAsIGJ1ZmZlciwgbGVuZ3RoLCBhdXRvZGV0ZWN0KTsKK30KKworZ2NyeV9lcnJvcl90IAorZ2NyeV9zZXhwX2NyZWF0ZSAoZ2NyeV9zZXhwX3QgKnJldHNleHAsCisgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsIHNpemVfdCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICBpbnQgYXV0b2RldGVjdCwgdm9pZCAoKmZyZWVmbmMpICh2b2lkICopKQoreworICByZXR1cm4gX2djcnlfc2V4cF9jcmVhdGUgKHJldHNleHAsIGJ1ZmZlciwgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9kZXRlY3QsIGZyZWVmbmMpOworfQorCitnY3J5X2Vycm9yX3QgCitnY3J5X3NleHBfc3NjYW4gKGdjcnlfc2V4cF90ICpyZXRzZXhwLCBzaXplX3QgKmVycm9mZiwKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoKQoreworICByZXR1cm4gX2djcnlfc2V4cF9zc2NhbiAocmV0c2V4cCwgZXJyb2ZmLCBidWZmZXIsIGxlbmd0aCk7Cit9CisKK2djcnlfZXJyb3JfdCAKK2djcnlfc2V4cF9idWlsZCAoZ2NyeV9zZXhwX3QgKnJldHNleHAsIHNpemVfdCAqZXJyb2ZmLAorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKyAgZ2NyeV9lcnJvcl90IGVycjsKKyAgdmFfbGlzdCBhcmdfcHRyOworICAKKyAgdmFfc3RhcnQgKGFyZ19wdHIsIGZvcm1hdCk7CisgIGVyciA9IF9nY3J5X3NleHBfdmJ1aWxkIChyZXRzZXhwLCBlcnJvZmYsIGZvcm1hdCwgYXJnX3B0cik7CisgIHZhX2VuZCAoYXJnX3B0cik7CisgIHJldHVybiBlcnI7Cit9CisKK2djcnlfZXJyb3JfdCAKK2djcnlfc2V4cF9idWlsZF9hcnJheSAoZ2NyeV9zZXhwX3QgKnJldHNleHAsIHNpemVfdCAqZXJyb2ZmLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmb3JtYXQsIHZvaWQgKiphcmdfbGlzdCkKK3sKKyAgcmV0dXJuIF9nY3J5X3NleHBfYnVpbGRfYXJyYXkgKHJldHNleHAsIGVycm9mZiwgZm9ybWF0LCBhcmdfbGlzdCk7Cit9CisKK3ZvaWQgCitnY3J5X3NleHBfcmVsZWFzZSAoZ2NyeV9zZXhwX3Qgc2V4cCkKK3sKKyAgX2djcnlfc2V4cF9yZWxlYXNlIChzZXhwKTsKK30KKworc2l6ZV90IAorZ2NyeV9zZXhwX2Nhbm9uX2xlbiAoY29uc3QgdW5zaWduZWQgY2hhciAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoLCAKKyAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqZXJyb2ZmLCBnY3J5X2Vycm9yX3QgKmVycmNvZGUpCit7CisgIHJldHVybiBfZ2NyeV9zZXhwX2Nhbm9uX2xlbiAoYnVmZmVyLCBsZW5ndGgsIGVycm9mZiwgZXJyY29kZSk7Cit9CisKK3NpemVfdCAKK2djcnlfc2V4cF9zcHJpbnQgKGdjcnlfc2V4cF90IHNleHAsIGludCBtb2RlLCB2b2lkICpidWZmZXIsIHNpemVfdCBtYXhsZW5ndGgpCit7CisgIHJldHVybiBfZ2NyeV9zZXhwX3NwcmludCAoc2V4cCwgbW9kZSwgYnVmZmVyLCBtYXhsZW5ndGgpOworfQorCit2b2lkIAorZ2NyeV9zZXhwX2R1bXAgKGNvbnN0IGdjcnlfc2V4cF90IGEpCit7CisgIF9nY3J5X3NleHBfZHVtcCAoYSk7Cit9CisKK2djcnlfc2V4cF90CitnY3J5X3NleHBfY29ucyAoY29uc3QgZ2NyeV9zZXhwX3QgYSwgY29uc3QgZ2NyeV9zZXhwX3QgYikKK3sKKyAgcmV0dXJuIF9nY3J5X3NleHBfY29ucyAoYSwgYik7Cit9CisKK2djcnlfc2V4cF90CitnY3J5X3NleHBfYWxpc3QgKGNvbnN0IGdjcnlfc2V4cF90ICphcnJheSkKK3sKKyAgcmV0dXJuIF9nY3J5X3NleHBfYWxpc3QgKGFycmF5KTsKK30KKworZ2NyeV9zZXhwX3QKK2djcnlfc2V4cF92bGlzdCAoY29uc3QgZ2NyeV9zZXhwX3QgYSwgLi4uKQoreworICAvKiBUaGlzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gc2V4cC5jLiAgKi8KKyAgKHZvaWQpYTsKKyAgQlVHICgpOworICByZXR1cm4gTlVMTDsKK30KKworZ2NyeV9zZXhwX3QKK2djcnlfc2V4cF9hcHBlbmQgKGNvbnN0IGdjcnlfc2V4cF90IGEsIGNvbnN0IGdjcnlfc2V4cF90IG4pCit7CisgIHJldHVybiBfZ2NyeV9zZXhwX2FwcGVuZCAoYSwgbik7Cit9CisKK2djcnlfc2V4cF90CitnY3J5X3NleHBfcHJlcGVuZCAoY29uc3QgZ2NyeV9zZXhwX3QgYSwgY29uc3QgZ2NyeV9zZXhwX3QgbikKK3sKKyAgcmV0dXJuIF9nY3J5X3NleHBfcHJlcGVuZCAoYSwgbik7Cit9CisKKworZ2NyeV9zZXhwX3QKK2djcnlfc2V4cF9maW5kX3Rva2VuIChnY3J5X3NleHBfdCBsaXN0LCBjb25zdCBjaGFyICp0b2ssIHNpemVfdCB0b2tsZW4pCit7CisgIHJldHVybiBfZ2NyeV9zZXhwX2ZpbmRfdG9rZW4gKGxpc3QsIHRvaywgdG9rbGVuKTsKK30KKworaW50CitnY3J5X3NleHBfbGVuZ3RoIChjb25zdCBnY3J5X3NleHBfdCBsaXN0KQoreworICByZXR1cm4gX2djcnlfc2V4cF9sZW5ndGggKGxpc3QpOworfQorCitnY3J5X3NleHBfdAorZ2NyeV9zZXhwX250aCAoY29uc3QgZ2NyeV9zZXhwX3QgbGlzdCwgaW50IG51bWJlcikKK3sKKyAgcmV0dXJuIF9nY3J5X3NleHBfbnRoIChsaXN0LCBudW1iZXIpOworfQorCitnY3J5X3NleHBfdAorZ2NyeV9zZXhwX2NhciAoY29uc3QgZ2NyeV9zZXhwX3QgbGlzdCkKK3sKKyAgcmV0dXJuIF9nY3J5X3NleHBfY2FyIChsaXN0KTsKK30KKworZ2NyeV9zZXhwX3QKK2djcnlfc2V4cF9jZHIgKGNvbnN0IGdjcnlfc2V4cF90IGxpc3QpCit7CisgIHJldHVybiBfZ2NyeV9zZXhwX2NkciAobGlzdCk7Cit9CisKK2djcnlfc2V4cF90CitnY3J5X3NleHBfY2FkciAoY29uc3QgZ2NyeV9zZXhwX3QgbGlzdCkKK3sKKyAgcmV0dXJuIF9nY3J5X3NleHBfY2FkciAobGlzdCk7Cit9CisKK2NvbnN0IGNoYXIgKgorZ2NyeV9zZXhwX250aF9kYXRhIChjb25zdCBnY3J5X3NleHBfdCBsaXN0LCBpbnQgbnVtYmVyLCBzaXplX3QgKmRhdGFsZW4pCit7CisgIHJldHVybiBfZ2NyeV9zZXhwX250aF9kYXRhIChsaXN0LCBudW1iZXIsIGRhdGFsZW4pOworfQorCitjaGFyICoKK2djcnlfc2V4cF9udGhfc3RyaW5nIChnY3J5X3NleHBfdCBsaXN0LCBpbnQgbnVtYmVyKQoreworICByZXR1cm4gX2djcnlfc2V4cF9udGhfc3RyaW5nIChsaXN0LCBudW1iZXIpOworfQorCitnY3J5X21waV90CitnY3J5X3NleHBfbnRoX21waSAoZ2NyeV9zZXhwX3QgbGlzdCwgaW50IG51bWJlciwgaW50IG1waWZtdCkKK3sKKyAgcmV0dXJuIF9nY3J5X3NleHBfbnRoX21waSAobGlzdCwgbnVtYmVyLCBtcGlmbXQpOworfQorCitnY3J5X21waV90CitnY3J5X21waV9uZXcgKHVuc2lnbmVkIGludCBuYml0cykKK3sKKyAgcmV0dXJuIF9nY3J5X21waV9uZXcgKG5iaXRzKTsKK30KKworZ2NyeV9tcGlfdAorZ2NyeV9tcGlfc25ldyAodW5zaWduZWQgaW50IG5iaXRzKQoreworICByZXR1cm4gX2djcnlfbXBpX3NuZXcgKG5iaXRzKTsKK30KKwordm9pZCAKK2djcnlfbXBpX3JlbGVhc2UgKGdjcnlfbXBpX3QgYSkKK3sKKyAgX2djcnlfbXBpX3JlbGVhc2UgKGEpOworfQorCitnY3J5X21waV90CitnY3J5X21waV9jb3B5IChjb25zdCBnY3J5X21waV90IGEpCit7CisgIHJldHVybiBfZ2NyeV9tcGlfY29weSAoYSk7Cit9CisKK2djcnlfbXBpX3QKK2djcnlfbXBpX3NldCAoZ2NyeV9tcGlfdCB3LCBjb25zdCBnY3J5X21waV90IHUpCit7CisgIHJldHVybiBfZ2NyeV9tcGlfc2V0ICh3LCB1KTsKK30KKworZ2NyeV9tcGlfdAorZ2NyeV9tcGlfc2V0X3VpIChnY3J5X21waV90IHcsIHVuc2lnbmVkIGxvbmcgdSkKK3sKKyAgcmV0dXJuIF9nY3J5X21waV9zZXRfdWkgKHcsIHUpOworfQorCit2b2lkCitnY3J5X21waV9zd2FwIChnY3J5X21waV90IGEsIGdjcnlfbXBpX3QgYikKK3sKKyAgX2djcnlfbXBpX3N3YXAgKGEsIGIpOworfQorCitpbnQKK2djcnlfbXBpX2NtcCAoY29uc3QgZ2NyeV9tcGlfdCB1LCBjb25zdCBnY3J5X21waV90IHYpCit7CisgIHJldHVybiBfZ2NyeV9tcGlfY21wICh1LCB2KTsKK30KKworaW50CitnY3J5X21waV9jbXBfdWkgKGNvbnN0IGdjcnlfbXBpX3QgdSwgdW5zaWduZWQgbG9uZyB2KQoreworICByZXR1cm4gX2djcnlfbXBpX2NtcF91aSAodSwgdik7Cit9CisKK2djcnlfZXJyb3JfdAorZ2NyeV9tcGlfc2NhbiAoZ2NyeV9tcGlfdCAqcmV0X21waSwgZW51bSBnY3J5X21waV9mb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnVmbGVuLCAKKyAgICAgICAgICAgICAgIHNpemVfdCAqbnNjYW5uZWQpCit7CisgIHJldHVybiBfZ2NyeV9tcGlfc2NhbiAocmV0X21waSwgZm9ybWF0LCBidWZmZXIsIGJ1ZmxlbiwgbnNjYW5uZWQpOworfQorCitnY3J5X2Vycm9yX3QKK2djcnlfbXBpX3ByaW50IChlbnVtIGdjcnlfbXBpX2Zvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmbGVuLAorICAgICAgICAgICAgICAgIHNpemVfdCAqbndyaXR0ZW4sCisgICAgICAgICAgICAgICAgY29uc3QgZ2NyeV9tcGlfdCBhKQoreworICByZXR1cm4gX2djcnlfbXBpX3ByaW50IChmb3JtYXQsIGJ1ZmZlciwgYnVmbGVuLCBud3JpdHRlbiwgYSk7Cit9CisKK2djcnlfZXJyb3JfdAorZ2NyeV9tcGlfYXByaW50IChlbnVtIGdjcnlfbXBpX2Zvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKipidWZmZXIsIHNpemVfdCAqbndyaXR0ZW4sCisgICAgICAgICAgICAgICAgIGNvbnN0IGdjcnlfbXBpX3QgYSkKK3sKKyAgcmV0dXJuIF9nY3J5X21waV9hcHJpbnQgKGZvcm1hdCwgYnVmZmVyLCBud3JpdHRlbiwgYSk7Cit9CisKK3ZvaWQKK2djcnlfbXBpX2R1bXAgKGNvbnN0IGdjcnlfbXBpX3QgYSkKK3sKKyAgX2djcnlfbXBpX2R1bXAgKGEpOworfQorCit2b2lkCitnY3J5X21waV9hZGQgKGdjcnlfbXBpX3QgdywgZ2NyeV9tcGlfdCB1LCBnY3J5X21waV90IHYpCit7CisgIF9nY3J5X21waV9hZGQgKHcsIHUsIHYpOworfQorCit2b2lkCitnY3J5X21waV9hZGRfdWkgKGdjcnlfbXBpX3QgdywgZ2NyeV9tcGlfdCB1LCB1bnNpZ25lZCBsb25nIHYpCit7CisgIF9nY3J5X21waV9hZGRfdWkgKHcsIHUsIHYpOworfQorCit2b2lkCitnY3J5X21waV9hZGRtIChnY3J5X21waV90IHcsIGdjcnlfbXBpX3QgdSwgZ2NyeV9tcGlfdCB2LCBnY3J5X21waV90IG0pCit7CisgIF9nY3J5X21waV9hZGRtICh3LCB1LCB2LCBtKTsKK30KKwordm9pZAorZ2NyeV9tcGlfc3ViIChnY3J5X21waV90IHcsIGdjcnlfbXBpX3QgdSwgZ2NyeV9tcGlfdCB2KQoreworICBfZ2NyeV9tcGlfc3ViICh3LCB1LCB2KTsKK30KKwordm9pZAorZ2NyeV9tcGlfc3ViX3VpIChnY3J5X21waV90IHcsIGdjcnlfbXBpX3QgdSwgdW5zaWduZWQgbG9uZyB2ICkKK3sKKyAgX2djcnlfbXBpX3N1Yl91aSAodywgdSwgdik7Cit9CisKK3ZvaWQKK2djcnlfbXBpX3N1Ym0gKGdjcnlfbXBpX3QgdywgZ2NyeV9tcGlfdCB1LCBnY3J5X21waV90IHYsIGdjcnlfbXBpX3QgbSkKK3sKKyAgX2djcnlfbXBpX3N1Ym0gKHcsIHUsIHYsIG0pOworfQorCit2b2lkCitnY3J5X21waV9tdWwgKGdjcnlfbXBpX3QgdywgZ2NyeV9tcGlfdCB1LCBnY3J5X21waV90IHYpCit7CisgIF9nY3J5X21waV9tdWwgKHcsIHUsIHYpOworfQorCit2b2lkCitnY3J5X21waV9tdWxfdWkgKGdjcnlfbXBpX3QgdywgZ2NyeV9tcGlfdCB1LCB1bnNpZ25lZCBsb25nIHYgKQoreworICBfZ2NyeV9tcGlfbXVsX3VpICh3LCB1LCB2KTsKK30KKwordm9pZAorZ2NyeV9tcGlfbXVsbSAoZ2NyeV9tcGlfdCB3LCBnY3J5X21waV90IHUsIGdjcnlfbXBpX3QgdiwgZ2NyeV9tcGlfdCBtKQoreworICBfZ2NyeV9tcGlfbXVsbSAodywgdSwgdiwgbSk7Cit9CisKK3ZvaWQKK2djcnlfbXBpX211bF8yZXhwIChnY3J5X21waV90IHcsIGdjcnlfbXBpX3QgdSwgdW5zaWduZWQgbG9uZyBjbnQpCit7CisgIF9nY3J5X21waV9tdWxfMmV4cCAodywgdSwgY250KTsKK30KKwordm9pZAorZ2NyeV9tcGlfZGl2IChnY3J5X21waV90IHEsIGdjcnlfbXBpX3QgciwKKyAgICAgICAgICAgICAgZ2NyeV9tcGlfdCBkaXZpZGVuZCwgZ2NyeV9tcGlfdCBkaXZpc29yLCBpbnQgcm91bmQpCit7CisgIF9nY3J5X21waV9kaXYgKHEsIHIsIGRpdmlkZW5kLCBkaXZpc29yLCByb3VuZCk7Cit9CisKK3ZvaWQKK2djcnlfbXBpX21vZCAoZ2NyeV9tcGlfdCByLCBnY3J5X21waV90IGRpdmlkZW5kLCBnY3J5X21waV90IGRpdmlzb3IpCit7CisgIF9nY3J5X21waV9tb2QgKHIsIGRpdmlkZW5kLCBkaXZpc29yKTsKK30KKwordm9pZAorZ2NyeV9tcGlfcG93bSAoZ2NyeV9tcGlfdCB3LCBjb25zdCBnY3J5X21waV90IGIsIGNvbnN0IGdjcnlfbXBpX3QgZSwKKyAgICAgICAgICAgICAgIGNvbnN0IGdjcnlfbXBpX3QgbSkKK3sKKyAgX2djcnlfbXBpX3Bvd20gKHcsIGIsIGUsIG0pOworfQorCitpbnQKK2djcnlfbXBpX2djZCAoZ2NyeV9tcGlfdCBnLCBnY3J5X21waV90IGEsIGdjcnlfbXBpX3QgYikKK3sKKyAgcmV0dXJuIF9nY3J5X21waV9nY2QgKGcsIGEsIGIpOworfQorCitpbnQKK2djcnlfbXBpX2ludm0gKGdjcnlfbXBpX3QgeCwgZ2NyeV9tcGlfdCBhLCBnY3J5X21waV90IG0pCit7CisgIHJldHVybiBfZ2NyeV9tcGlfaW52bSAoeCwgYSwgbSk7Cit9CisKKwordW5zaWduZWQgaW50CitnY3J5X21waV9nZXRfbmJpdHMgKGdjcnlfbXBpX3QgYSkKK3sKKyAgcmV0dXJuIF9nY3J5X21waV9nZXRfbmJpdHMgKGEpOworfQorCitpbnQKK2djcnlfbXBpX3Rlc3RfYml0IChnY3J5X21waV90IGEsIHVuc2lnbmVkIGludCBuKQoreworICByZXR1cm4gX2djcnlfbXBpX3Rlc3RfYml0IChhLCBuKTsKK30KKwordm9pZAorZ2NyeV9tcGlfc2V0X2JpdCAoZ2NyeV9tcGlfdCBhLCB1bnNpZ25lZCBpbnQgbikKK3sKKyAgX2djcnlfbXBpX3NldF9iaXQgKGEsIG4pOworfQorCit2b2lkCitnY3J5X21waV9jbGVhcl9iaXQgKGdjcnlfbXBpX3QgYSwgdW5zaWduZWQgaW50IG4pCit7CisgIF9nY3J5X21waV9jbGVhcl9iaXQgKGEsIG4pOworfQorCit2b2lkCitnY3J5X21waV9zZXRfaGlnaGJpdCAoZ2NyeV9tcGlfdCBhLCB1bnNpZ25lZCBpbnQgbikKK3sKKyAgX2djcnlfbXBpX3NldF9oaWdoYml0IChhLCBuKTsKK30KKwordm9pZAorZ2NyeV9tcGlfY2xlYXJfaGlnaGJpdCAoZ2NyeV9tcGlfdCBhLCB1bnNpZ25lZCBpbnQgbikKK3sKKyAgX2djcnlfbXBpX2NsZWFyX2hpZ2hiaXQgKGEsIG4pOworfQorCit2b2lkCitnY3J5X21waV9yc2hpZnQgKGdjcnlfbXBpX3QgeCwgZ2NyeV9tcGlfdCBhLCB1bnNpZ25lZCBpbnQgbikKK3sKKyAgX2djcnlfbXBpX3JzaGlmdCAoeCwgYSwgbik7Cit9CisKK3ZvaWQKK2djcnlfbXBpX2xzaGlmdCAoZ2NyeV9tcGlfdCB4LCBnY3J5X21waV90IGEsIHVuc2lnbmVkIGludCBuKQoreworICBfZ2NyeV9tcGlfbHNoaWZ0ICh4LCBhLCBuKTsKK30KKworZ2NyeV9tcGlfdAorZ2NyeV9tcGlfc2V0X29wYXF1ZSAoZ2NyeV9tcGlfdCBhLCB2b2lkICpwLCB1bnNpZ25lZCBpbnQgbmJpdHMpCit7CisgIHJldHVybiBfZ2NyeV9tcGlfc2V0X29wYXF1ZSAoYSwgcCwgbmJpdHMpOworfQorCit2b2lkICoKK2djcnlfbXBpX2dldF9vcGFxdWUgKGdjcnlfbXBpX3QgYSwgdW5zaWduZWQgaW50ICpuYml0cykKK3sKKyAgcmV0dXJuIF9nY3J5X21waV9nZXRfb3BhcXVlIChhLCBuYml0cyk7Cit9CisKK3ZvaWQKK2djcnlfbXBpX3NldF9mbGFnIChnY3J5X21waV90IGEsIGVudW0gZ2NyeV9tcGlfZmxhZyBmbGFnKQoreworICBfZ2NyeV9tcGlfc2V0X2ZsYWcgKGEsIGZsYWcpOworfQorCit2b2lkCitnY3J5X21waV9jbGVhcl9mbGFnIChnY3J5X21waV90IGEsIGVudW0gZ2NyeV9tcGlfZmxhZyBmbGFnKQoreworICBfZ2NyeV9tcGlfY2xlYXJfZmxhZyAoYSwgZmxhZyk7Cit9CisKK2ludAorZ2NyeV9tcGlfZ2V0X2ZsYWcgKGdjcnlfbXBpX3QgYSwgZW51bSBnY3J5X21waV9mbGFnIGZsYWcpCit7CisgIHJldHVybiBfZ2NyeV9tcGlfZ2V0X2ZsYWcgKGEsIGZsYWcpOworfQorCitnY3J5X2Vycm9yX3QKK2djcnlfY2lwaGVyX29wZW4gKGdjcnlfY2lwaGVyX2hkX3QgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgIGludCBhbGdvLCBpbnQgbW9kZSwgdW5zaWduZWQgaW50IGZsYWdzKQoreworICBpZiAoIWZpcHNfaXNfb3BlcmF0aW9uYWwgKCkpCisgICAgeworICAgICAgKmhhbmRsZSA9IE5VTEw7CisgICAgICByZXR1cm4gZ3BnX2Vycm9yIChmaXBzX25vdF9vcGVyYXRpb25hbCAoKSk7CisgICAgfQorCisgIHJldHVybiBfZ2NyeV9jaXBoZXJfb3BlbiAoaGFuZGxlLCBhbGdvLCBtb2RlLCBmbGFncyk7Cit9CisKK3ZvaWQKK2djcnlfY2lwaGVyX2Nsb3NlIChnY3J5X2NpcGhlcl9oZF90IGgpCit7CisgIF9nY3J5X2NpcGhlcl9jbG9zZSAoaCk7Cit9CisKK2djcnlfZXJyb3JfdAorZ2NyeV9jaXBoZXJfc2V0a2V5IChnY3J5X2NpcGhlcl9oZF90IGhkLCBjb25zdCB2b2lkICprZXksIHNpemVfdCBrZXlsZW4pCit7CisgIGlmICghZmlwc19pc19vcGVyYXRpb25hbCAoKSkKKyAgICByZXR1cm4gZ3BnX2Vycm9yIChmaXBzX25vdF9vcGVyYXRpb25hbCAoKSk7CisKKyAgcmV0dXJuIF9nY3J5X2NpcGhlcl9zZXRrZXkgKGhkLCBrZXksIGtleWxlbik7Cit9CisKK2djcnlfZXJyb3JfdAorZ2NyeV9jaXBoZXJfc2V0aXYgKGdjcnlfY2lwaGVyX2hkX3QgaGQsIGNvbnN0IHZvaWQgKml2LCBzaXplX3QgaXZsZW4pCit7CisgIGlmICghZmlwc19pc19vcGVyYXRpb25hbCAoKSkKKyAgICByZXR1cm4gZ3BnX2Vycm9yIChmaXBzX25vdF9vcGVyYXRpb25hbCAoKSk7CisKKyAgcmV0dXJuIF9nY3J5X2NpcGhlcl9zZXRpdiAoaGQsIGl2LCBpdmxlbik7Cit9CisKK2dwZ19lcnJvcl90CitnY3J5X2NpcGhlcl9zZXRjdHIgKGdjcnlfY2lwaGVyX2hkX3QgaGQsIGNvbnN0IHZvaWQgKmN0ciwgc2l6ZV90IGN0cmxlbikKK3sKKyAgaWYgKCFmaXBzX2lzX29wZXJhdGlvbmFsICgpKQorICAgIHJldHVybiBncGdfZXJyb3IgKGZpcHNfbm90X29wZXJhdGlvbmFsICgpKTsKKworICByZXR1cm4gX2djcnlfY2lwaGVyX3NldGN0ciAoaGQsIGN0ciwgY3RybGVuKTsKK30KKworCitnY3J5X2Vycm9yX3QKK2djcnlfY2lwaGVyX2N0bCAoZ2NyeV9jaXBoZXJfaGRfdCBoLCBpbnQgY21kLCB2b2lkICpidWZmZXIsIHNpemVfdCBidWZsZW4pCit7CisgIGlmICghZmlwc19pc19vcGVyYXRpb25hbCAoKSkKKyAgICByZXR1cm4gZ3BnX2Vycm9yIChmaXBzX25vdF9vcGVyYXRpb25hbCAoKSk7CisKKyAgcmV0dXJuIF9nY3J5X2NpcGhlcl9jdGwgKGgsIGNtZCwgYnVmZmVyLCBidWZsZW4pOworfQorCitnY3J5X2Vycm9yX3QKK2djcnlfY2lwaGVyX2luZm8gKGdjcnlfY2lwaGVyX2hkX3QgaCwgaW50IHdoYXQsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90ICpuYnl0ZXMpCit7CisgIHJldHVybiBfZ2NyeV9jaXBoZXJfaW5mbyAoaCwgd2hhdCwgYnVmZmVyLCBuYnl0ZXMpOworfQorCitnY3J5X2Vycm9yX3QKK2djcnlfY2lwaGVyX2FsZ29faW5mbyAoaW50IGFsZ28sIGludCB3aGF0LCB2b2lkICpidWZmZXIsIHNpemVfdCAqbmJ5dGVzKQoreworICBpZiAoIWZpcHNfaXNfb3BlcmF0aW9uYWwgKCkpCisgICAgcmV0dXJuIGdwZ19lcnJvciAoZmlwc19ub3Rfb3BlcmF0aW9uYWwgKCkpOworCisgIHJldHVybiBfZ2NyeV9jaXBoZXJfYWxnb19pbmZvIChhbGdvLCB3aGF0LCBidWZmZXIsIG5ieXRlcyk7Cit9CisKK2NvbnN0IGNoYXIgKgorZ2NyeV9jaXBoZXJfYWxnb19uYW1lIChpbnQgYWxnb3JpdGhtKQoreworICByZXR1cm4gX2djcnlfY2lwaGVyX2FsZ29fbmFtZSAoYWxnb3JpdGhtKTsKK30KKworaW50CitnY3J5X2NpcGhlcl9tYXBfbmFtZSAoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgcmV0dXJuIF9nY3J5X2NpcGhlcl9tYXBfbmFtZSAobmFtZSk7Cit9CisKK2ludAorZ2NyeV9jaXBoZXJfbW9kZV9mcm9tX29pZCAoY29uc3QgY2hhciAqc3RyaW5nKQoreworICByZXR1cm4gX2djcnlfY2lwaGVyX21vZGVfZnJvbV9vaWQgKHN0cmluZyk7Cit9CisKK2djcnlfZXJyb3JfdAorZ2NyeV9jaXBoZXJfZW5jcnlwdCAoZ2NyeV9jaXBoZXJfaGRfdCBoLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCAqb3V0LCBzaXplX3Qgb3V0c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmluLCBzaXplX3QgaW5sZW4pCit7CisgIGlmICghZmlwc19pc19vcGVyYXRpb25hbCAoKSkKKyAgICB7CisgICAgICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgcGxhaW50ZXh0IHdpbGwgbmV2ZXIgbWFrZSBpdCB0byBPVVQuICovCisgICAgICBpZiAob3V0KQorICAgICAgICBtZW1zZXQgKG91dCwgMHg0Miwgb3V0c2l6ZSk7IAorICAgICAgcmV0dXJuIGdwZ19lcnJvciAoZmlwc19ub3Rfb3BlcmF0aW9uYWwgKCkpOworICAgIH0KKworICByZXR1cm4gX2djcnlfY2lwaGVyX2VuY3J5cHQgKGgsIG91dCwgb3V0c2l6ZSwgaW4sIGlubGVuKTsKK30KKworZ2NyeV9lcnJvcl90CitnY3J5X2NpcGhlcl9kZWNyeXB0IChnY3J5X2NpcGhlcl9oZF90IGgsCisgICAgICAgICAgICAgICAgICAgICB2b2lkICpvdXQsIHNpemVfdCBvdXRzaXplLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqaW4sIHNpemVfdCBpbmxlbikKK3sKKyAgaWYgKCFmaXBzX2lzX29wZXJhdGlvbmFsICgpKQorICAgIHJldHVybiBncGdfZXJyb3IgKGZpcHNfbm90X29wZXJhdGlvbmFsICgpKTsKKworICByZXR1cm4gX2djcnlfY2lwaGVyX2RlY3J5cHQgKGgsIG91dCwgb3V0c2l6ZSwgaW4sIGlubGVuKTsKK30KKworc2l6ZV90CitnY3J5X2NpcGhlcl9nZXRfYWxnb19rZXlsZW4gKGludCBhbGdvKQoreworICByZXR1cm4gX2djcnlfY2lwaGVyX2dldF9hbGdvX2tleWxlbiAoYWxnbyk7Cit9CisKK3NpemVfdAorZ2NyeV9jaXBoZXJfZ2V0X2FsZ29fYmxrbGVuIChpbnQgYWxnbykKK3sKKyAgcmV0dXJuIF9nY3J5X2NpcGhlcl9nZXRfYWxnb19ibGtsZW4gKGFsZ28pOworfQorCitnY3J5X2Vycm9yX3QKK2djcnlfY2lwaGVyX2xpc3QgKGludCAqbGlzdCwgaW50ICpsaXN0X2xlbmd0aCkKK3sKKyAgcmV0dXJuIF9nY3J5X2NpcGhlcl9saXN0IChsaXN0LCBsaXN0X2xlbmd0aCk7Cit9CisKK2djcnlfZXJyb3JfdAorZ2NyeV9wa19lbmNyeXB0IChnY3J5X3NleHBfdCAqcmVzdWx0LCBnY3J5X3NleHBfdCBkYXRhLCBnY3J5X3NleHBfdCBwa2V5KQoreworICBpZiAoIWZpcHNfaXNfb3BlcmF0aW9uYWwgKCkpCisgICAgeworICAgICAgKnJlc3VsdCA9IE5VTEw7CisgICAgICByZXR1cm4gZ3BnX2Vycm9yIChmaXBzX25vdF9vcGVyYXRpb25hbCAoKSk7CisgICAgfQorICByZXR1cm4gX2djcnlfcGtfZW5jcnlwdCAocmVzdWx0LCBkYXRhLCBwa2V5KTsKK30KKworZ2NyeV9lcnJvcl90CitnY3J5X3BrX2RlY3J5cHQgKGdjcnlfc2V4cF90ICpyZXN1bHQsIGdjcnlfc2V4cF90IGRhdGEsIGdjcnlfc2V4cF90IHNrZXkpCit7CisgIGlmICghZmlwc19pc19vcGVyYXRpb25hbCAoKSkKKyAgICB7CisgICAgICAqcmVzdWx0ID0gTlVMTDsKKyAgICAgIHJldHVybiBncGdfZXJyb3IgKGZpcHNfbm90X29wZXJhdGlvbmFsICgpKTsKKyAgICB9CisgIHJldHVybiBfZ2NyeV9wa19kZWNyeXB0IChyZXN1bHQsIGRhdGEsIHNrZXkpOworfQorCitnY3J5X2Vycm9yX3QKK2djcnlfcGtfc2lnbiAoZ2NyeV9zZXhwX3QgKnJlc3VsdCwgZ2NyeV9zZXhwX3QgZGF0YSwgZ2NyeV9zZXhwX3Qgc2tleSkKK3sKKyAgaWYgKCFmaXBzX2lzX29wZXJhdGlvbmFsICgpKQorICAgIHsKKyAgICAgICpyZXN1bHQgPSBOVUxMOworICAgICAgcmV0dXJuIGdwZ19lcnJvciAoZmlwc19ub3Rfb3BlcmF0aW9uYWwgKCkpOworICAgIH0KKyAgcmV0dXJuIF9nY3J5X3BrX3NpZ24gKHJlc3VsdCwgZGF0YSwgc2tleSk7Cit9CisKK2djcnlfZXJyb3JfdAorZ2NyeV9wa192ZXJpZnkgKGdjcnlfc2V4cF90IHNpZ3ZhbCwgZ2NyeV9zZXhwX3QgZGF0YSwgZ2NyeV9zZXhwX3QgcGtleSkKK3sKKyAgaWYgKCFmaXBzX2lzX29wZXJhdGlvbmFsICgpKQorICAgIHJldHVybiBncGdfZXJyb3IgKGZpcHNfbm90X29wZXJhdGlvbmFsICgpKTsKKyAgcmV0dXJuIF9nY3J5X3BrX3ZlcmlmeSAoc2lndmFsLCBkYXRhLCBwa2V5KTsKK30KKworZ2NyeV9lcnJvcl90CitnY3J5X3BrX3Rlc3RrZXkgKGdjcnlfc2V4cF90IGtleSkKK3sKKyAgaWYgKCFmaXBzX2lzX29wZXJhdGlvbmFsICgpKQorICAgIHJldHVybiBncGdfZXJyb3IgKGZpcHNfbm90X29wZXJhdGlvbmFsICgpKTsKKyAgcmV0dXJuIF9nY3J5X3BrX3Rlc3RrZXkgKGtleSk7Cit9CisKK2djcnlfZXJyb3JfdAorZ2NyeV9wa19nZW5rZXkgKGdjcnlfc2V4cF90ICpyX2tleSwgZ2NyeV9zZXhwX3Qgc19wYXJtcykKK3sKKyAgaWYgKCFmaXBzX2lzX29wZXJhdGlvbmFsICgpKQorICAgIHsKKyAgICAgICpyX2tleSA9IE5VTEw7CisgICAgICByZXR1cm4gZ3BnX2Vycm9yIChmaXBzX25vdF9vcGVyYXRpb25hbCAoKSk7CisgICAgfQorICByZXR1cm4gX2djcnlfcGtfZ2Vua2V5IChyX2tleSwgc19wYXJtcyk7Cit9CisKK2djcnlfZXJyb3JfdAorZ2NyeV9wa19jdGwgKGludCBjbWQsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ1ZmxlbikKK3sKKyAgcmV0dXJuIF9nY3J5X3BrX2N0bCAoY21kLCBidWZmZXIsIGJ1Zmxlbik7Cit9CisKK2djcnlfZXJyb3JfdAorZ2NyeV9wa19hbGdvX2luZm8gKGludCBhbGdvLCBpbnQgd2hhdCwgdm9pZCAqYnVmZmVyLCBzaXplX3QgKm5ieXRlcykKK3sKKyAgaWYgKCFmaXBzX2lzX29wZXJhdGlvbmFsICgpKQorICAgIHJldHVybiBncGdfZXJyb3IgKGZpcHNfbm90X29wZXJhdGlvbmFsICgpKTsKKworICByZXR1cm4gX2djcnlfcGtfYWxnb19pbmZvIChhbGdvLCB3aGF0LCBidWZmZXIsIG5ieXRlcyk7Cit9CisKK2NvbnN0IGNoYXIgKgorZ2NyeV9wa19hbGdvX25hbWUgKGludCBhbGdvcml0aG0pCit7CisgIHJldHVybiBfZ2NyeV9wa19hbGdvX25hbWUgKGFsZ29yaXRobSk7Cit9CisKK2ludAorZ2NyeV9wa19tYXBfbmFtZSAoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgcmV0dXJuIF9nY3J5X3BrX21hcF9uYW1lIChuYW1lKTsKK30KKwordW5zaWduZWQgaW50CitnY3J5X3BrX2dldF9uYml0cyAoZ2NyeV9zZXhwX3Qga2V5KQoreworICBpZiAoIWZpcHNfaXNfb3BlcmF0aW9uYWwgKCkpCisgICAgeworICAgICAgKHZvaWQpZmlwc19ub3Rfb3BlcmF0aW9uYWwgKCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgcmV0dXJuIF9nY3J5X3BrX2dldF9uYml0cyAoa2V5KTsKK30KKwordW5zaWduZWQgY2hhciAqCitnY3J5X3BrX2dldF9rZXlncmlwIChnY3J5X3NleHBfdCBrZXksIHVuc2lnbmVkIGNoYXIgKmFycmF5KQoreworICBpZiAoIWZpcHNfaXNfb3BlcmF0aW9uYWwgKCkpCisgICAgeworICAgICAgKHZvaWQpZmlwc19ub3Rfb3BlcmF0aW9uYWwgKCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIHJldHVybiBfZ2NyeV9wa19nZXRfa2V5Z3JpcCAoa2V5LCBhcnJheSk7Cit9CisKK2djcnlfZXJyb3JfdAorZ2NyeV9wa19saXN0IChpbnQgKmxpc3QsIGludCAqbGlzdF9sZW5ndGgpCit7CisgIHJldHVybiBfZ2NyeV9wa19saXN0IChsaXN0LCBsaXN0X2xlbmd0aCk7Cit9CisKK2djcnlfZXJyb3JfdAorZ2NyeV9tZF9vcGVuIChnY3J5X21kX2hkX3QgKmgsIGludCBhbGdvLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisgIGlmICghZmlwc19pc19vcGVyYXRpb25hbCAoKSkKKyAgICB7CisgICAgICAqaCA9IE5VTEw7CisgICAgICByZXR1cm4gZ3BnX2Vycm9yIChmaXBzX25vdF9vcGVyYXRpb25hbCAoKSk7CisgICAgfQorCisgIHJldHVybiBfZ2NyeV9tZF9vcGVuIChoLCBhbGdvLCBmbGFncyk7Cit9CisKK3ZvaWQgCitnY3J5X21kX2Nsb3NlIChnY3J5X21kX2hkX3QgaGQpCit7CisgIF9nY3J5X21kX2Nsb3NlIChoZCk7Cit9CisKK2djcnlfZXJyb3JfdAorZ2NyeV9tZF9lbmFibGUgKGdjcnlfbWRfaGRfdCBoZCwgaW50IGFsZ28pCit7CisgIGlmICghZmlwc19pc19vcGVyYXRpb25hbCAoKSkKKyAgICByZXR1cm4gZ3BnX2Vycm9yIChmaXBzX25vdF9vcGVyYXRpb25hbCAoKSk7CisgIHJldHVybiBfZ2NyeV9tZF9lbmFibGUgKGhkLCBhbGdvKTsKK30KKworZ2NyeV9lcnJvcl90CitnY3J5X21kX2NvcHkgKGdjcnlfbWRfaGRfdCAqYmhkLCBnY3J5X21kX2hkX3QgYWhkKQoreworICBpZiAoIWZpcHNfaXNfb3BlcmF0aW9uYWwgKCkpCisgICAgeworICAgICAgKmJoZCA9IE5VTEw7CisgICAgICByZXR1cm4gZ3BnX2Vycm9yIChmaXBzX25vdF9vcGVyYXRpb25hbCAoKSk7CisgICAgfQorICByZXR1cm4gX2djcnlfbWRfY29weSAoYmhkLCBhaGQpOworfQorCit2b2lkCitnY3J5X21kX3Jlc2V0IChnY3J5X21kX2hkX3QgaGQpCit7CisgIF9nY3J5X21kX3Jlc2V0IChoZCk7Cit9CisKK2djcnlfZXJyb3JfdAorZ2NyeV9tZF9jdGwgKGdjcnlfbWRfaGRfdCBoZCwgaW50IGNtZCwgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnVmbGVuKQoreworICBpZiAoIWZpcHNfaXNfb3BlcmF0aW9uYWwgKCkpCisgICAgcmV0dXJuIGdwZ19lcnJvciAoZmlwc19ub3Rfb3BlcmF0aW9uYWwgKCkpOworICByZXR1cm4gX2djcnlfbWRfY3RsIChoZCwgY21kLCBidWZmZXIsIGJ1Zmxlbik7Cit9CisKK3ZvaWQKK2djcnlfbWRfd3JpdGUgKGdjcnlfbWRfaGRfdCBoZCwgY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoKQoreworICBpZiAoIWZpcHNfaXNfb3BlcmF0aW9uYWwgKCkpCisgICAgeworICAgICAgKHZvaWQpZmlwc19ub3Rfb3BlcmF0aW9uYWwgKCk7CisgICAgICByZXR1cm47CisgICAgfQorICBfZ2NyeV9tZF93cml0ZSAoaGQsIGJ1ZmZlciwgbGVuZ3RoKTsKK30KKwordW5zaWduZWQgY2hhciAqCitnY3J5X21kX3JlYWQgKGdjcnlfbWRfaGRfdCBoZCwgaW50IGFsZ28pCit7CisgIHJldHVybiBfZ2NyeV9tZF9yZWFkIChoZCwgYWxnbyk7Cit9CisKK3ZvaWQgCitnY3J5X21kX2hhc2hfYnVmZmVyIChpbnQgYWxnbywgdm9pZCAqZGlnZXN0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoKQoreworICBpZiAoIWZpcHNfaXNfb3BlcmF0aW9uYWwgKCkpCisgICAgeworICAgICAgKHZvaWQpZmlwc19ub3Rfb3BlcmF0aW9uYWwgKCk7CisgICAgICBmaXBzX3NpZ25hbF9lcnJvciAoImNhbGxlZCBpbiBub24tb3BlcmF0aW9uYWwgc3RhdGUiKTsKKyAgICB9CisgIF9nY3J5X21kX2hhc2hfYnVmZmVyIChhbGdvLCBkaWdlc3QsIGJ1ZmZlciwgbGVuZ3RoKTsKK30KKworaW50CitnY3J5X21kX2dldF9hbGdvIChnY3J5X21kX2hkX3QgaGQpCit7CisgIGlmICghZmlwc19pc19vcGVyYXRpb25hbCAoKSkKKyAgICB7CisgICAgICAodm9pZClmaXBzX25vdF9vcGVyYXRpb25hbCAoKTsKKyAgICAgIGZpcHNfc2lnbmFsX2Vycm9yICgidXNlZCBpbiBub24tb3BlcmF0aW9uYWwgc3RhdGUiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgcmV0dXJuIF9nY3J5X21kX2dldF9hbGdvIChoZCk7Cit9CisKK3Vuc2lnbmVkIGludAorZ2NyeV9tZF9nZXRfYWxnb19kbGVuIChpbnQgYWxnbykKK3sKKyAgcmV0dXJuIF9nY3J5X21kX2dldF9hbGdvX2RsZW4gKGFsZ28pOworfQorCitpbnQKK2djcnlfbWRfaXNfZW5hYmxlZCAoZ2NyeV9tZF9oZF90IGEsIGludCBhbGdvKQoreworICBpZiAoIWZpcHNfaXNfb3BlcmF0aW9uYWwgKCkpCisgICAgeworICAgICAgKHZvaWQpZmlwc19ub3Rfb3BlcmF0aW9uYWwgKCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgcmV0dXJuIF9nY3J5X21kX2lzX2VuYWJsZWQgKGEsIGFsZ28pOworfQorCitpbnQKK2djcnlfbWRfaXNfc2VjdXJlIChnY3J5X21kX2hkX3QgYSkKK3sKKyAgcmV0dXJuIF9nY3J5X21kX2lzX3NlY3VyZSAoYSk7Cit9CisKK2djcnlfZXJyb3JfdAorZ2NyeV9tZF9pbmZvIChnY3J5X21kX2hkX3QgaCwgaW50IHdoYXQsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90ICpuYnl0ZXMpCit7CisgIGlmICghZmlwc19pc19vcGVyYXRpb25hbCAoKSkKKyAgICByZXR1cm4gZ3BnX2Vycm9yIChmaXBzX25vdF9vcGVyYXRpb25hbCAoKSk7CisKKyAgcmV0dXJuIF9nY3J5X21kX2luZm8gKGgsIHdoYXQsIGJ1ZmZlciwgbmJ5dGVzKTsKK30KKworZ2NyeV9lcnJvcl90CitnY3J5X21kX2FsZ29faW5mbyAoaW50IGFsZ28sIGludCB3aGF0LCB2b2lkICpidWZmZXIsIHNpemVfdCAqbmJ5dGVzKQoreworICByZXR1cm4gX2djcnlfbWRfYWxnb19pbmZvIChhbGdvLCB3aGF0LCBidWZmZXIsIG5ieXRlcyk7Cit9CisKK2NvbnN0IGNoYXIgKgorZ2NyeV9tZF9hbGdvX25hbWUgKGludCBhbGdvKQoreworICByZXR1cm4gX2djcnlfbWRfYWxnb19uYW1lIChhbGdvKTsKK30KKworaW50CitnY3J5X21kX21hcF9uYW1lIChjb25zdCBjaGFyKiBuYW1lKQoreworICByZXR1cm4gX2djcnlfbWRfbWFwX25hbWUgKG5hbWUpOworfQorCitnY3J5X2Vycm9yX3QKK2djcnlfbWRfc2V0a2V5IChnY3J5X21kX2hkX3QgaGQsIGNvbnN0IHZvaWQgKmtleSwgc2l6ZV90IGtleWxlbikKK3sKKyAgaWYgKCFmaXBzX2lzX29wZXJhdGlvbmFsICgpKQorICAgIHJldHVybiBncGdfZXJyb3IgKGZpcHNfbm90X29wZXJhdGlvbmFsICgpKTsKKyAgcmV0dXJuIF9nY3J5X21kX3NldGtleSAoaGQsIGtleSwga2V5bGVuKTsKK30KKwordm9pZAorZ2NyeV9tZF9kZWJ1ZyAoZ2NyeV9tZF9oZF90IGhkLCBjb25zdCBjaGFyICpzdWZmaXgpCit7CisgIF9nY3J5X21kX2RlYnVnIChoZCwgc3VmZml4KTsKK30KKworZ2NyeV9lcnJvcl90CitnY3J5X21kX2xpc3QgKGludCAqbGlzdCwgaW50ICpsaXN0X2xlbmd0aCkKK3sKKyAgcmV0dXJuIF9nY3J5X21kX2xpc3QgKGxpc3QsIGxpc3RfbGVuZ3RoKTsKK30KKworZ2NyeV9lcnJvcl90CitnY3J5X2FjX2RhdGFfbmV3IChnY3J5X2FjX2RhdGFfdCAqZGF0YSkKK3sKKyAgcmV0dXJuIF9nY3J5X2FjX2RhdGFfbmV3IChkYXRhKTsKK30KKwordm9pZAorZ2NyeV9hY19kYXRhX2Rlc3Ryb3kgKGdjcnlfYWNfZGF0YV90IGRhdGEpCit7CisgIF9nY3J5X2FjX2RhdGFfZGVzdHJveSAoZGF0YSk7Cit9CisKK2djcnlfZXJyb3JfdAorZ2NyeV9hY19kYXRhX2NvcHkgKGdjcnlfYWNfZGF0YV90ICpkYXRhX2NwLCBnY3J5X2FjX2RhdGFfdCBkYXRhKQoreworICByZXR1cm4gX2djcnlfYWNfZGF0YV9jb3B5IChkYXRhX2NwLCBkYXRhKTsKK30KKwordW5zaWduZWQgaW50CitnY3J5X2FjX2RhdGFfbGVuZ3RoIChnY3J5X2FjX2RhdGFfdCBkYXRhKQoreworICByZXR1cm4gX2djcnlfYWNfZGF0YV9sZW5ndGggKGRhdGEpOworfQorCit2b2lkCitnY3J5X2FjX2RhdGFfY2xlYXIgKGdjcnlfYWNfZGF0YV90IGRhdGEpCit7CisgIF9nY3J5X2FjX2RhdGFfY2xlYXIgKGRhdGEpOworfQorCitnY3J5X2Vycm9yX3QKK2djcnlfYWNfZGF0YV9zZXQgKGdjcnlfYWNfZGF0YV90IGRhdGEsIHVuc2lnbmVkIGludCBmbGFncywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGdjcnlfbXBpX3QgbXBpKQoreworICByZXR1cm4gX2djcnlfYWNfZGF0YV9zZXQgKGRhdGEsIGZsYWdzLCBuYW1lLCBtcGkpOworfQorCitnY3J5X2Vycm9yX3QKK2djcnlfYWNfZGF0YV9nZXRfbmFtZSAoZ2NyeV9hY19kYXRhX3QgZGF0YSwgdW5zaWduZWQgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBnY3J5X21waV90ICptcGkpCit7CisgIHJldHVybiBfZ2NyeV9hY19kYXRhX2dldF9uYW1lIChkYXRhLCBmbGFncywgbmFtZSwgbXBpKTsKK30KKworZ2NyeV9lcnJvcl90CitnY3J5X2FjX2RhdGFfZ2V0X2luZGV4IChnY3J5X2FjX2RhdGFfdCBkYXRhLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaWR4LCBjb25zdCBjaGFyICoqbmFtZSwgZ2NyeV9tcGlfdCAqbXBpKQoreworICByZXR1cm4gX2djcnlfYWNfZGF0YV9nZXRfaW5kZXggKGRhdGEsIGZsYWdzLCBpZHgsIG5hbWUsIG1waSk7Cit9CisKK2djcnlfZXJyb3JfdAorZ2NyeV9hY19kYXRhX3RvX3NleHAgKGdjcnlfYWNfZGF0YV90IGRhdGEsIGdjcnlfc2V4cF90ICpzZXhwLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKippZGVudGlmaWVycykKK3sKKyAgcmV0dXJuIF9nY3J5X2FjX2RhdGFfdG9fc2V4cCAoZGF0YSwgc2V4cCwgaWRlbnRpZmllcnMpOworfQorCitnY3J5X2Vycm9yX3QKK2djcnlfYWNfZGF0YV9mcm9tX3NleHAgKGdjcnlfYWNfZGF0YV90ICpkYXRhLCBnY3J5X3NleHBfdCBzZXhwLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKmlkZW50aWZpZXJzKQoreworICByZXR1cm4gX2djcnlfYWNfZGF0YV9mcm9tX3NleHAgKGRhdGEsIHNleHAsIGlkZW50aWZpZXJzKTsKK30KKwordm9pZAorZ2NyeV9hY19pb19pbml0IChnY3J5X2FjX2lvX3QgKmFjX2lvLCBnY3J5X2FjX2lvX21vZGVfdCBtb2RlLAorICAgICAgICAgICAgICAgICBnY3J5X2FjX2lvX3R5cGVfdCB0eXBlLCAuLi4pCit7CisgIHZhX2xpc3QgYXJnX3B0cjsKKworICB2YV9zdGFydCAoYXJnX3B0ciwgdHlwZSk7CisgIF9nY3J5X2FjX2lvX2luaXRfdmEgKGFjX2lvLCBtb2RlLCB0eXBlLCBhcmdfcHRyKTsKKyAgdmFfZW5kIChhcmdfcHRyKTsKK30KKwordm9pZAorZ2NyeV9hY19pb19pbml0X3ZhIChnY3J5X2FjX2lvX3QgKmFjX2lvLCBnY3J5X2FjX2lvX21vZGVfdCBtb2RlLAorICAgICAgICAgICAgICAgICAgICBnY3J5X2FjX2lvX3R5cGVfdCB0eXBlLCB2YV9saXN0IGFwKQoreworICBfZ2NyeV9hY19pb19pbml0X3ZhIChhY19pbywgbW9kZSwgdHlwZSwgYXApOworfQorCitnY3J5X2Vycm9yX3QKK2djcnlfYWNfb3BlbiAoZ2NyeV9hY19oYW5kbGVfdCAqaGFuZGxlLAorICAgICAgICAgICAgICBnY3J5X2FjX2lkX3QgYWxnb3JpdGhtLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisgIHJldHVybiBfZ2NyeV9hY19vcGVuIChoYW5kbGUsIGFsZ29yaXRobSwgZmxhZ3MpOworfQorCit2b2lkCitnY3J5X2FjX2Nsb3NlIChnY3J5X2FjX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgX2djcnlfYWNfY2xvc2UgKGhhbmRsZSk7Cit9CisKK2djcnlfZXJyb3JfdAorZ2NyeV9hY19rZXlfaW5pdCAoZ2NyeV9hY19rZXlfdCAqa2V5LCBnY3J5X2FjX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgIGdjcnlfYWNfa2V5X3R5cGVfdCB0eXBlLCBnY3J5X2FjX2RhdGFfdCBkYXRhKQoreworICByZXR1cm4gX2djcnlfYWNfa2V5X2luaXQgKGtleSwgaGFuZGxlLCB0eXBlLCBkYXRhKTsKK30KKworZ2NyeV9lcnJvcl90CitnY3J5X2FjX2tleV9wYWlyX2dlbmVyYXRlIChnY3J5X2FjX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuYml0cywgdm9pZCAqc3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfYWNfa2V5X3BhaXJfdCAqa2V5X3BhaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X21waV90ICoqbWlzY2RhdGEpCit7CisgIHJldHVybiBfZ2NyeV9hY19rZXlfcGFpcl9nZW5lcmF0ZSAoIGhhbmRsZSwgbmJpdHMsIHNwZWMsIGtleV9wYWlyLCBtaXNjZGF0YSk7Cit9CisKK2djcnlfYWNfa2V5X3QKK2djcnlfYWNfa2V5X3BhaXJfZXh0cmFjdCAoZ2NyeV9hY19rZXlfcGFpcl90IGtleXBhaXIsIGdjcnlfYWNfa2V5X3R5cGVfdCB3aGljaCkKK3sKKyAgcmV0dXJuIF9nY3J5X2FjX2tleV9wYWlyX2V4dHJhY3QgKGtleXBhaXIsIHdoaWNoKTsKK30KKworZ2NyeV9hY19kYXRhX3QKK2djcnlfYWNfa2V5X2RhdGFfZ2V0IChnY3J5X2FjX2tleV90IGtleSkKK3sKKyAgcmV0dXJuIF9nY3J5X2FjX2tleV9kYXRhX2dldCAoa2V5KTsKK30KKworZ2NyeV9lcnJvcl90CitnY3J5X2FjX2tleV90ZXN0IChnY3J5X2FjX2hhbmRsZV90IGhhbmRsZSwgZ2NyeV9hY19rZXlfdCBrZXkpCit7CisgIHJldHVybiBfZ2NyeV9hY19rZXlfdGVzdCAoaGFuZGxlLCBrZXkpOworfQorCitnY3J5X2Vycm9yX3QKK2djcnlfYWNfa2V5X2dldF9uYml0cyAoZ2NyeV9hY19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfYWNfa2V5X3Qga2V5LCB1bnNpZ25lZCBpbnQgKm5iaXRzKQoreworICByZXR1cm4gX2djcnlfYWNfa2V5X2dldF9uYml0cyAoaGFuZGxlLCBrZXksIG5iaXRzKTsKK30KKworZ2NyeV9lcnJvcl90CitnY3J5X2FjX2tleV9nZXRfZ3JpcCAoZ2NyeV9hY19oYW5kbGVfdCBoYW5kbGUsIGdjcnlfYWNfa2V5X3Qga2V5LAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmtleV9ncmlwKQoreworICByZXR1cm4gX2djcnlfYWNfa2V5X2dldF9ncmlwIChoYW5kbGUsIGtleSwga2V5X2dyaXApOworfQorCit2b2lkCitnY3J5X2FjX2tleV9kZXN0cm95IChnY3J5X2FjX2tleV90IGtleSkKK3sKKyAgX2djcnlfYWNfa2V5X2Rlc3Ryb3kgKGtleSk7Cit9CisKK3ZvaWQKK2djcnlfYWNfa2V5X3BhaXJfZGVzdHJveSAoZ2NyeV9hY19rZXlfcGFpcl90IGtleV9wYWlyKQoreworICBfZ2NyeV9hY19rZXlfcGFpcl9kZXN0cm95IChrZXlfcGFpcik7Cit9CisKK2djcnlfZXJyb3JfdAorZ2NyeV9hY19kYXRhX2VuY29kZSAoZ2NyeV9hY19lbV90IG1ldGhvZCwgdW5zaWduZWQgaW50IGZsYWdzLCB2b2lkICpvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgZ2NyeV9hY19pb190ICppb19yZWFkLCBnY3J5X2FjX2lvX3QgKmlvX3dyaXRlKQoreworICByZXR1cm4gX2djcnlfYWNfZGF0YV9lbmNvZGUgKG1ldGhvZCwgZmxhZ3MsIG9wdGlvbnMsIGlvX3JlYWQsIGlvX3dyaXRlKTsKK30KKworZ2NyeV9lcnJvcl90CitnY3J5X2FjX2RhdGFfZGVjb2RlIChnY3J5X2FjX2VtX3QgbWV0aG9kLCB1bnNpZ25lZCBpbnQgZmxhZ3MsIHZvaWQgKm9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICBnY3J5X2FjX2lvX3QgKmlvX3JlYWQsIGdjcnlfYWNfaW9fdCAqaW9fd3JpdGUpCit7CisgIHJldHVybiBfZ2NyeV9hY19kYXRhX2RlY29kZSAobWV0aG9kLCBmbGFncywgb3B0aW9ucywgaW9fcmVhZCwgIGlvX3dyaXRlKTsKK30KKworZ2NyeV9lcnJvcl90CitnY3J5X2FjX2RhdGFfZW5jcnlwdCAoZ2NyeV9hY19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgIGdjcnlfYWNfa2V5X3Qga2V5LAorICAgICAgICAgICAgICAgICAgICAgIGdjcnlfbXBpX3QgZGF0YV9wbGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICBnY3J5X2FjX2RhdGFfdCAqZGF0YV9lbmNyeXB0ZWQpCit7CisgIHJldHVybiBfZ2NyeV9hY19kYXRhX2VuY3J5cHQgKGhhbmRsZSwgZmxhZ3MsIGtleSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfcGxhaW4sIGRhdGFfZW5jcnlwdGVkKTsKK30KKworZ2NyeV9lcnJvcl90CitnY3J5X2FjX2RhdGFfZGVjcnlwdCAoZ2NyeV9hY19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgIGdjcnlfYWNfa2V5X3Qga2V5LAorICAgICAgICAgICAgICAgICAgICAgIGdjcnlfbXBpX3QgKmRhdGFfcGxhaW4sCisgICAgICAgICAgICAgICAgICAgICAgZ2NyeV9hY19kYXRhX3QgZGF0YV9lbmNyeXB0ZWQpCit7CisgIHJldHVybiBfZ2NyeV9hY19kYXRhX2RlY3J5cHQgKGhhbmRsZSwgZmxhZ3MsIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9wbGFpbiwgZGF0YV9lbmNyeXB0ZWQpOworfQorCitnY3J5X2Vycm9yX3QKK2djcnlfYWNfZGF0YV9zaWduIChnY3J5X2FjX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICBnY3J5X2FjX2tleV90IGtleSwKKyAgICAgICAgICAgICAgICAgICBnY3J5X21waV90IGRhdGEsCisgICAgICAgICAgICAgICAgICAgZ2NyeV9hY19kYXRhX3QgKmRhdGFfc2lnbmF0dXJlKQoreworICByZXR1cm4gX2djcnlfYWNfZGF0YV9zaWduIChoYW5kbGUsIGtleSwgZGF0YSwgZGF0YV9zaWduYXR1cmUpOworfQorCitnY3J5X2Vycm9yX3QKK2djcnlfYWNfZGF0YV92ZXJpZnkgKGdjcnlfYWNfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgZ2NyeV9hY19rZXlfdCBrZXksCisgICAgICAgICAgICAgICAgICAgICBnY3J5X21waV90IGRhdGEsCisgICAgICAgICAgICAgICAgICAgICBnY3J5X2FjX2RhdGFfdCBkYXRhX3NpZ25hdHVyZSkKK3sKKyAgcmV0dXJuIF9nY3J5X2FjX2RhdGFfdmVyaWZ5IChoYW5kbGUsIGtleSwgZGF0YSwgZGF0YV9zaWduYXR1cmUpOworfQorCitnY3J5X2Vycm9yX3QKK2djcnlfYWNfZGF0YV9lbmNyeXB0X3NjaGVtZSAoZ2NyeV9hY19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfYWNfc2NoZW1lX3Qgc2NoZW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsIHZvaWQgKm9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfYWNfa2V5X3Qga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X2FjX2lvX3QgKmlvX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfYWNfaW9fdCAqaW9fY2lwaGVyKQoreworICByZXR1cm4gX2djcnlfYWNfZGF0YV9lbmNyeXB0X3NjaGVtZSAoaGFuZGxlLCBzY2hlbWUsIGZsYWdzLCBvcHRzLCBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb19tZXNzYWdlLCBpb19jaXBoZXIpOworfQorCitnY3J5X2Vycm9yX3QKK2djcnlfYWNfZGF0YV9kZWNyeXB0X3NjaGVtZSAoZ2NyeV9hY19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfYWNfc2NoZW1lX3Qgc2NoZW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsIHZvaWQgKm9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfYWNfa2V5X3Qga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X2FjX2lvX3QgKmlvX2NpcGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NyeV9hY19pb190ICppb19tZXNzYWdlKQoreworICByZXR1cm4gX2djcnlfYWNfZGF0YV9kZWNyeXB0X3NjaGVtZSAoaGFuZGxlLCBzY2hlbWUsIGZsYWdzLCBvcHRzLCBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb19jaXBoZXIsIGlvX21lc3NhZ2UpOworfQorCitnY3J5X2Vycm9yX3QKK2djcnlfYWNfZGF0YV9zaWduX3NjaGVtZSAoZ2NyeV9hY19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfYWNfc2NoZW1lX3Qgc2NoZW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsIHZvaWQgKm9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfYWNfa2V5X3Qga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X2FjX2lvX3QgKmlvX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfYWNfaW9fdCAqaW9fc2lnbmF0dXJlKQoreworICByZXR1cm4gX2djcnlfYWNfZGF0YV9zaWduX3NjaGVtZSAoaGFuZGxlLCBzY2hlbWUsIGZsYWdzLCBvcHRzLCBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb19tZXNzYWdlLCBpb19zaWduYXR1cmUpOworfQorCitnY3J5X2Vycm9yX3QKK2djcnlfYWNfZGF0YV92ZXJpZnlfc2NoZW1lIChnY3J5X2FjX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X2FjX3NjaGVtZV90IHNjaGVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsIHZvaWQgKm9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NyeV9hY19rZXlfdCBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NyeV9hY19pb190ICppb19tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfYWNfaW9fdCAqaW9fc2lnbmF0dXJlKQoreworICByZXR1cm4gX2djcnlfYWNfZGF0YV92ZXJpZnlfc2NoZW1lIChoYW5kbGUsIHNjaGVtZSwgZmxhZ3MsIG9wdHMsIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9fbWVzc2FnZSwgaW9fc2lnbmF0dXJlKTsKK30KKworZ2NyeV9lcnJvcl90CitnY3J5X2FjX2lkX3RvX25hbWUgKGdjcnlfYWNfaWRfdCBhbGdvcml0aG0sIGNvbnN0IGNoYXIgKipuYW1lKSAKK3sKKyAgLyogVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkLiAgV2UgaW1wbGVtZW50IGl0IGluIHRlcm1zIG9mIHRoZQorICAgICBzdWdnZXN0ZWQgcmVwbGFjZW1lbnQuICAqLworICBjb25zdCBjaGFyICp0bXAgPSBfZ2NyeV9wa19hbGdvX25hbWUgKGFsZ29yaXRobSk7CisgIGlmICghKnRtcCkKKyAgICByZXR1cm4gZ2NyeV9lcnJvciAoR1BHX0VSUl9QVUJLRVlfQUxHTyk7CisgICpuYW1lID0gdG1wOworICByZXR1cm4gMDsKK30KKworZ2NyeV9lcnJvcl90CitnY3J5X2FjX25hbWVfdG9faWQgKGNvbnN0IGNoYXIgKm5hbWUsIGdjcnlfYWNfaWRfdCAqYWxnb3JpdGhtKQoreworICAvKiBUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQuICBXZSBpbXBsZW1lbnQgaXQgaW4gdGVybXMgb2YgdGhlCisgICAgIHN1Z2dlc3RlZCByZXBsYWNlbWVudC4gICovCisgIGludCBhbGdvID0gX2djcnlfcGtfbWFwX25hbWUgKG5hbWUpOworICBpZiAoIWFsZ28pCisgICAgcmV0dXJuIGdjcnlfZXJyb3IgKEdQR19FUlJfUFVCS0VZX0FMR08pOworICAqYWxnb3JpdGhtID0gYWxnbzsKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQKK2djcnlfcmFuZG9taXplICh2b2lkICpidWZmZXIsIHNpemVfdCBsZW5ndGgsIGVudW0gZ2NyeV9yYW5kb21fbGV2ZWwgbGV2ZWwpCit7CisgIGlmICghZmlwc19pc19vcGVyYXRpb25hbCAoKSkKKyAgICB7CisgICAgICAodm9pZClmaXBzX25vdF9vcGVyYXRpb25hbCAoKTsKKyAgICAgIGZpcHNfc2lnbmFsX2ZhdGFsX2Vycm9yICgiY2FsbGVkIGluIG5vbi1vcGVyYXRpb25hbCBzdGF0ZSIpOworICAgICAgZmlwc19ub3JldHVybiAoKTsgCisgICAgfQorICBfZ2NyeV9yYW5kb21pemUgKGJ1ZmZlciwgbGVuZ3RoLCBsZXZlbCk7Cit9CisKK2djcnlfZXJyb3JfdAorZ2NyeV9yYW5kb21fYWRkX2J5dGVzIChjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBsZW5ndGgsIGludCBxdWFsaXR5KQoreworICBpZiAoIWZpcHNfaXNfb3BlcmF0aW9uYWwgKCkpCisgICAgcmV0dXJuIGdwZ19lcnJvciAoZmlwc19ub3Rfb3BlcmF0aW9uYWwgKCkpOworICByZXR1cm4gX2djcnlfcmFuZG9tX2FkZF9ieXRlcyAoYnVmZmVyLCBsZW5ndGgsIHF1YWxpdHkpOworfQorCit2b2lkICoKK2djcnlfcmFuZG9tX2J5dGVzIChzaXplX3QgbmJ5dGVzLCBlbnVtIGdjcnlfcmFuZG9tX2xldmVsIGxldmVsKQoreworICBpZiAoIWZpcHNfaXNfb3BlcmF0aW9uYWwgKCkpCisgICAgeworICAgICAgKHZvaWQpZmlwc19ub3Rfb3BlcmF0aW9uYWwgKCk7CisgICAgICBmaXBzX3NpZ25hbF9mYXRhbF9lcnJvciAoImNhbGxlZCBpbiBub24tb3BlcmF0aW9uYWwgc3RhdGUiKTsKKyAgICAgIGZpcHNfbm9yZXR1cm4gKCk7IAorICAgIH0KKworICByZXR1cm4gX2djcnlfcmFuZG9tX2J5dGVzIChuYnl0ZXMsbGV2ZWwpOworfQorCit2b2lkICoKK2djcnlfcmFuZG9tX2J5dGVzX3NlY3VyZSAoc2l6ZV90IG5ieXRlcywgZW51bSBnY3J5X3JhbmRvbV9sZXZlbCBsZXZlbCkKK3sKKyAgaWYgKCFmaXBzX2lzX29wZXJhdGlvbmFsICgpKQorICAgIHsKKyAgICAgICh2b2lkKWZpcHNfbm90X29wZXJhdGlvbmFsICgpOworICAgICAgZmlwc19zaWduYWxfZmF0YWxfZXJyb3IgKCJjYWxsZWQgaW4gbm9uLW9wZXJhdGlvbmFsIHN0YXRlIik7CisgICAgICBmaXBzX25vcmV0dXJuICgpOyAKKyAgICB9CisKKyAgcmV0dXJuIF9nY3J5X3JhbmRvbV9ieXRlc19zZWN1cmUgKG5ieXRlcywgbGV2ZWwpOworfQorCit2b2lkCitnY3J5X21waV9yYW5kb21pemUgKGdjcnlfbXBpX3QgdywKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5iaXRzLCBlbnVtIGdjcnlfcmFuZG9tX2xldmVsIGxldmVsKQoreworICBfZ2NyeV9tcGlfcmFuZG9taXplICh3LCBuYml0cywgbGV2ZWwpOworfQorCit2b2lkCitnY3J5X2NyZWF0ZV9ub25jZSAodm9pZCAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoKQoreworICBpZiAoIWZpcHNfaXNfb3BlcmF0aW9uYWwgKCkpCisgICAgeworICAgICAgKHZvaWQpZmlwc19ub3Rfb3BlcmF0aW9uYWwgKCk7CisgICAgICBmaXBzX3NpZ25hbF9mYXRhbF9lcnJvciAoImNhbGxlZCBpbiBub24tb3BlcmF0aW9uYWwgc3RhdGUiKTsKKyAgICAgIGZpcHNfbm9yZXR1cm4gKCk7IAorICAgIH0KKyAgX2djcnlfY3JlYXRlX25vbmNlIChidWZmZXIsIGxlbmd0aCk7Cit9CisKK2djcnlfZXJyb3JfdAorZ2NyeV9wcmltZV9nZW5lcmF0ZSAoZ2NyeV9tcGlfdCAqcHJpbWUsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcHJpbWVfYml0cywKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmYWN0b3JfYml0cywKKyAgICAgICAgICAgICAgICAgICAgIGdjcnlfbXBpX3QgKipmYWN0b3JzLAorICAgICAgICAgICAgICAgICAgICAgZ2NyeV9wcmltZV9jaGVja19mdW5jX3QgY2JfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNiX2FyZywKKyAgICAgICAgICAgICAgICAgICAgIGdjcnlfcmFuZG9tX2xldmVsX3QgcmFuZG9tX2xldmVsLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzKQoreworICByZXR1cm4gX2djcnlfcHJpbWVfZ2VuZXJhdGUgKHByaW1lLCBwcmltZV9iaXRzLCBmYWN0b3JfYml0cywgZmFjdG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYl9mdW5jLCBjYl9hcmcsIHJhbmRvbV9sZXZlbCwgZmxhZ3MpOworfQorCitnY3J5X2Vycm9yX3QKK2djcnlfcHJpbWVfZ3JvdXBfZ2VuZXJhdG9yIChnY3J5X21waV90ICpyX2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NyeV9tcGlfdCBwcmltZSwgZ2NyeV9tcGlfdCAqZmFjdG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X21waV90IHN0YXJ0X2cpCit7CisgIHJldHVybiBfZ2NyeV9wcmltZV9ncm91cF9nZW5lcmF0b3IgKHJfZywgcHJpbWUsIGZhY3RvcnMsIHN0YXJ0X2cpOworfQorCit2b2lkCitnY3J5X3ByaW1lX3JlbGVhc2VfZmFjdG9ycyAoZ2NyeV9tcGlfdCAqZmFjdG9ycykKK3sKKyAgX2djcnlfcHJpbWVfcmVsZWFzZV9mYWN0b3JzIChmYWN0b3JzKTsKK30KKworZ2NyeV9lcnJvcl90CitnY3J5X3ByaW1lX2NoZWNrIChnY3J5X21waV90IHgsIHVuc2lnbmVkIGludCBmbGFncykKK3sKKyAgcmV0dXJuIF9nY3J5X3ByaW1lX2NoZWNrICh4LCBmbGFncyk7Cit9CisKK3ZvaWQKK2djcnlfc2V0X3Byb2dyZXNzX2hhbmRsZXIgKGdjcnlfaGFuZGxlcl9wcm9ncmVzc190IGNiLCB2b2lkICpjYl9kYXRhKQoreworICBfZ2NyeV9zZXRfcHJvZ3Jlc3NfaGFuZGxlciAoY2IsIGNiX2RhdGEpOworfQorCit2b2lkCitnY3J5X3NldF9hbGxvY2F0aW9uX2hhbmRsZXIgKGdjcnlfaGFuZGxlcl9hbGxvY190IGZ1bmNfYWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfaGFuZGxlcl9hbGxvY190IGZ1bmNfYWxsb2Nfc2VjdXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X2hhbmRsZXJfc2VjdXJlX2NoZWNrX3QgZnVuY19zZWN1cmVfY2hlY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfaGFuZGxlcl9yZWFsbG9jX3QgZnVuY19yZWFsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X2hhbmRsZXJfZnJlZV90IGZ1bmNfZnJlZSkKK3sKKyAgX2djcnlfc2V0X2FsbG9jYXRpb25faGFuZGxlciAoZnVuY19hbGxvYywgZnVuY19hbGxvY19zZWN1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfc2VjdXJlX2NoZWNrLCBmdW5jX3JlYWxsb2MsIGZ1bmNfZnJlZSk7Cit9CisKK3ZvaWQKK2djcnlfc2V0X291dG9mY29yZV9oYW5kbGVyIChnY3J5X2hhbmRsZXJfbm9fbWVtX3QgaCwgdm9pZCAqb3BhcXVlKQoreworICBfZ2NyeV9zZXRfb3V0b2Zjb3JlX2hhbmRsZXIgKGgsIG9wYXF1ZSk7Cit9CisKK3ZvaWQKK2djcnlfc2V0X2ZhdGFsZXJyb3JfaGFuZGxlciAoZ2NyeV9oYW5kbGVyX2Vycm9yX3QgZm5jLCB2b2lkICpvcGFxdWUpCit7CisgIF9nY3J5X3NldF9mYXRhbGVycm9yX2hhbmRsZXIgKGZuYywgb3BhcXVlKTsKK30KKwordm9pZAorZ2NyeV9zZXRfbG9nX2hhbmRsZXIgKGdjcnlfaGFuZGxlcl9sb2dfdCBmLCB2b2lkICpvcGFxdWUpCit7CisgIF9nY3J5X3NldF9sb2dfaGFuZGxlciAoZiwgb3BhcXVlKTsKK30KKwordm9pZAorZ2NyeV9zZXRfZ2V0dGV4dF9oYW5kbGVyIChjb25zdCBjaGFyICooKmYpKGNvbnN0IGNoYXIqKSkKK3sKKyAgX2djcnlfc2V0X2dldHRleHRfaGFuZGxlciAoZik7Cit9CisKK3ZvaWQgKgorZ2NyeV9tYWxsb2MgKHNpemVfdCBuKQoreworICByZXR1cm4gX2djcnlfbWFsbG9jIChuKTsKK30KKwordm9pZCAqCitnY3J5X2NhbGxvYyAoc2l6ZV90IG4sIHNpemVfdCBtKQoreworICByZXR1cm4gX2djcnlfY2FsbG9jIChuLCBtKTsKK30KKwordm9pZCAqCitnY3J5X21hbGxvY19zZWN1cmUgKHNpemVfdCBuKQoreworICByZXR1cm4gX2djcnlfbWFsbG9jX3NlY3VyZSAobik7Cit9CisKK3ZvaWQgKgorZ2NyeV9jYWxsb2Nfc2VjdXJlIChzaXplX3Qgbiwgc2l6ZV90IG0pCit7CisgIHJldHVybiBfZ2NyeV9jYWxsb2Nfc2VjdXJlIChuLG0pOworfQorCit2b2lkICoKK2djcnlfcmVhbGxvYyAodm9pZCAqYSwgc2l6ZV90IG4pCit7CisgIHJldHVybiBfZ2NyeV9yZWFsbG9jIChhLCBuKTsKK30KKworY2hhciAqCitnY3J5X3N0cmR1cCAoY29uc3QgY2hhciAqc3RyaW5nKQoreworICByZXR1cm4gX2djcnlfc3RyZHVwIChzdHJpbmcpOworfQorCit2b2lkICoKK2djcnlfeG1hbGxvYyAoc2l6ZV90IG4pCit7CisgIHJldHVybiBfZ2NyeV94bWFsbG9jIChuKTsKK30KKwordm9pZCAqCitnY3J5X3hjYWxsb2MgKHNpemVfdCBuLCBzaXplX3QgbSkKK3sKKyAgcmV0dXJuIF9nY3J5X3hjYWxsb2MgKG4sIG0pOworfQorCit2b2lkICoKK2djcnlfeG1hbGxvY19zZWN1cmUgKHNpemVfdCBuKQoreworICByZXR1cm4gX2djcnlfeG1hbGxvY19zZWN1cmUgKG4pOworfQorCit2b2lkICoKK2djcnlfeGNhbGxvY19zZWN1cmUgKHNpemVfdCBuLCBzaXplX3QgbSkKK3sKKyAgcmV0dXJuIF9nY3J5X3hjYWxsb2Nfc2VjdXJlIChuLCBtKTsKK30KKwordm9pZCAqCitnY3J5X3hyZWFsbG9jICh2b2lkICphLCBzaXplX3QgbikKK3sKKyAgcmV0dXJuIF9nY3J5X3hyZWFsbG9jIChhLCBuKTsKK30KKworY2hhciAqCitnY3J5X3hzdHJkdXAgKGNvbnN0IGNoYXIgKmEpCit7CisgIHJldHVybiBfZ2NyeV94c3RyZHVwIChhKTsKK30KKwordm9pZAorZ2NyeV9mcmVlICh2b2lkICphKQoreworICBfZ2NyeV9mcmVlIChhKTsKK30KKworaW50CitnY3J5X2lzX3NlY3VyZSAoY29uc3Qgdm9pZCAqYSkKK3sKKyAgcmV0dXJuIF9nY3J5X2lzX3NlY3VyZSAoYSk7Cit9CisKKworZ2NyeV9lcnJvcl90CitnY3J5X2NpcGhlcl9yZWdpc3RlciAoZ2NyeV9jaXBoZXJfc3BlY190ICpjaXBoZXIsIGludCAqYWxnb3JpdGhtX2lkLAorICAgICAgICAgICAgICAgICAgICAgIGdjcnlfbW9kdWxlX3QgKm1vZHVsZSkKK3sKKyAgcmV0dXJuIF9nY3J5X2NpcGhlcl9yZWdpc3RlciAoY2lwaGVyLCBOVUxMLCBhbGdvcml0aG1faWQsIG1vZHVsZSk7Cit9CisKK3ZvaWQKK2djcnlfY2lwaGVyX3VucmVnaXN0ZXIgKGdjcnlfbW9kdWxlX3QgbW9kdWxlKQoreworICBfZ2NyeV9jaXBoZXJfdW5yZWdpc3RlciAobW9kdWxlKTsKK30KKworZ2NyeV9lcnJvcl90CitnY3J5X3BrX3JlZ2lzdGVyIChnY3J5X3BrX3NwZWNfdCAqcHVia2V5LCB1bnNpZ25lZCBpbnQgKmFsZ29yaXRobV9pZCwKKyAgICAgICAgICAgICAgICAgIGdjcnlfbW9kdWxlX3QgKm1vZHVsZSkKK3sKKyAgcmV0dXJuIF9nY3J5X3BrX3JlZ2lzdGVyIChwdWJrZXksIE5VTEwsIGFsZ29yaXRobV9pZCwgbW9kdWxlKTsKK30KKwordm9pZAorZ2NyeV9wa191bnJlZ2lzdGVyIChnY3J5X21vZHVsZV90IG1vZHVsZSkKK3sKKyAgX2djcnlfcGtfdW5yZWdpc3RlciAobW9kdWxlKTsKK30KKworZ2NyeV9lcnJvcl90CitnY3J5X21kX3JlZ2lzdGVyIChnY3J5X21kX3NwZWNfdCAqZGlnZXN0LCB1bnNpZ25lZCBpbnQgKmFsZ29yaXRobV9pZCwKKyAgICAgICAgICAgICAgICAgIGdjcnlfbW9kdWxlX3QgKm1vZHVsZSkKK3sKKyAgcmV0dXJuIF9nY3J5X21kX3JlZ2lzdGVyIChkaWdlc3QsIE5VTEwsIGFsZ29yaXRobV9pZCwgbW9kdWxlKTsKK30KKwordm9pZAorZ2NyeV9tZF91bnJlZ2lzdGVyIChnY3J5X21vZHVsZV90IG1vZHVsZSkKK3sKKyAgX2djcnlfbWRfdW5yZWdpc3RlciAobW9kdWxlKTsKK30KZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi9zcmMvdmlzaWJpbGl0eS5oIGIvbGliZ2NyeXB0LTEuNC42L3NyYy92aXNpYmlsaXR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTExZTU0NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi9zcmMvdmlzaWJpbGl0eS5oCkBAIC0wLDAgKzEsNzA0IEBACisvKiB2aXNpYmlsaXR5LmggLSBTZXQgdmlzaWJpbGl0eSBhdHRyaWJ1dGUKKyAqIENvcHlyaWdodCAoQykgMjAwNyAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgR0NSWV9WSVNJQklMSVRZX0gKKyNkZWZpbmUgR0NSWV9WSVNJQklMSVRZX0gKKworLyogUmVkZWZpbmUgYWxsIHB1YmxpYyBzeW1ib2xzIHdpdGggYW4gdW5kZXJzY29yZSB1bmxlc3Mgd2UgYWxyZWFkeQorICAgdXNlIHRoZSB1bmRlcnNjb3JlIHByZWZpeGVkIHZlcnNpb24gaW50ZXJuYWxseS4gICovCisjZGVmaW5lIGdjcnlfY2hlY2tfdmVyc2lvbiAgICAgICAgICBfZ2NyeV9jaGVja192ZXJzaW9uCisjZGVmaW5lIGdjcnlfY29udHJvbCAgICAgICAgICAgICAgICBfZ2NyeV9jb250cm9sCisKKyNkZWZpbmUgZ2NyeV9zZXRfYWxsb2NhdGlvbl9oYW5kbGVyIF9nY3J5X3NldF9hbGxvY2F0aW9uX2hhbmRsZXIKKyNkZWZpbmUgZ2NyeV9zZXRfZmF0YWxlcnJvcl9oYW5kbGVyIF9nY3J5X3NldF9mYXRhbGVycm9yX2hhbmRsZXIKKyNkZWZpbmUgZ2NyeV9zZXRfZ2V0dGV4dF9oYW5kbGVyICAgIF9nY3J5X3NldF9nZXR0ZXh0X2hhbmRsZXIKKyNkZWZpbmUgZ2NyeV9zZXRfbG9nX2hhbmRsZXIgICAgICAgIF9nY3J5X3NldF9sb2dfaGFuZGxlcgorI2RlZmluZSBnY3J5X3NldF9vdXRvZmNvcmVfaGFuZGxlciAgX2djcnlfc2V0X291dG9mY29yZV9oYW5kbGVyCisjZGVmaW5lIGdjcnlfc2V0X3Byb2dyZXNzX2hhbmRsZXIgICBfZ2NyeV9zZXRfcHJvZ3Jlc3NfaGFuZGxlcgorI2RlZmluZSBnY3J5X2Vycl9jb2RlX2Zyb21fZXJybm8gICAgX2djcnlfZXJyX2NvZGVfZnJvbV9lcnJubworI2RlZmluZSBnY3J5X2Vycl9jb2RlX3RvX2Vycm5vICAgICAgX2djcnlfZXJyX2NvZGVfdG9fZXJybm8KKyNkZWZpbmUgZ2NyeV9lcnJfbWFrZV9mcm9tX2Vycm5vICAgIF9nY3J5X2Vycl9tYWtlX2Zyb21fZXJybm8KKyNkZWZpbmUgZ2NyeV9lcnJvcl9mcm9tX2Vycm5vICAgICAgIF9nY3J5X2Vycm9yX2Zyb21fZXJybm8KKyNkZWZpbmUgZ2NyeV9zdHJlcnJvciAgICAgICAgICAgICAgIF9nY3J5X3N0cmVycm9yCisjZGVmaW5lIGdjcnlfc3Ryc291cmNlICAgICAgICAgICAgICBfZ2NyeV9zdHJzb3VyY2UKKworI2RlZmluZSBnY3J5X2ZyZWUgICAgICAgICAgICAgICAgICAgX2djcnlfZnJlZQorI2RlZmluZSBnY3J5X21hbGxvYyAgICAgICAgICAgICAgICAgX2djcnlfbWFsbG9jCisjZGVmaW5lIGdjcnlfbWFsbG9jX3NlY3VyZSAgICAgICAgICBfZ2NyeV9tYWxsb2Nfc2VjdXJlCisjZGVmaW5lIGdjcnlfY2FsbG9jICAgICAgICAgICAgICAgICBfZ2NyeV9jYWxsb2MKKyNkZWZpbmUgZ2NyeV9jYWxsb2Nfc2VjdXJlICAgICAgICAgIF9nY3J5X2NhbGxvY19zZWN1cmUKKyNkZWZpbmUgZ2NyeV9yZWFsbG9jICAgICAgICAgICAgICAgIF9nY3J5X3JlYWxsb2MKKyNkZWZpbmUgZ2NyeV9zdHJkdXAgICAgICAgICAgICAgICAgIF9nY3J5X3N0cmR1cAorI2RlZmluZSBnY3J5X2lzX3NlY3VyZSAgICAgICAgICAgICAgX2djcnlfaXNfc2VjdXJlCisjZGVmaW5lIGdjcnlfeGNhbGxvYyAgICAgICAgICAgICAgICBfZ2NyeV94Y2FsbG9jCisjZGVmaW5lIGdjcnlfeGNhbGxvY19zZWN1cmUgICAgICAgICBfZ2NyeV94Y2FsbG9jX3NlY3VyZQorI2RlZmluZSBnY3J5X3htYWxsb2MgICAgICAgICAgICAgICAgX2djcnlfeG1hbGxvYworI2RlZmluZSBnY3J5X3htYWxsb2Nfc2VjdXJlICAgICAgICAgX2djcnlfeG1hbGxvY19zZWN1cmUKKyNkZWZpbmUgZ2NyeV94cmVhbGxvYyAgICAgICAgICAgICAgIF9nY3J5X3hyZWFsbG9jCisjZGVmaW5lIGdjcnlfeHN0cmR1cCAgICAgICAgICAgICAgICBfZ2NyeV94c3RyZHVwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgZ2NyeV9tZF9hbGdvX2luZm8gICAgICAgICAgIF9nY3J5X21kX2FsZ29faW5mbworI2RlZmluZSBnY3J5X21kX2FsZ29fbmFtZSAgICAgICAgICAgX2djcnlfbWRfYWxnb19uYW1lCisjZGVmaW5lIGdjcnlfbWRfY2xvc2UgICAgICAgICAgICAgICBfZ2NyeV9tZF9jbG9zZQorI2RlZmluZSBnY3J5X21kX2NvcHkgICAgICAgICAgICAgICAgX2djcnlfbWRfY29weQorI2RlZmluZSBnY3J5X21kX2N0bCAgICAgICAgICAgICAgICAgX2djcnlfbWRfY3RsCisjZGVmaW5lIGdjcnlfbWRfZW5hYmxlICAgICAgICAgICAgICBfZ2NyeV9tZF9lbmFibGUKKyNkZWZpbmUgZ2NyeV9tZF9nZXQgICAgICAgICAgICAgICAgIF9nY3J5X21kX2dldAorI2RlZmluZSBnY3J5X21kX2dldF9hbGdvICAgICAgICAgICAgX2djcnlfbWRfZ2V0X2FsZ28KKyNkZWZpbmUgZ2NyeV9tZF9nZXRfYWxnb19kbGVuICAgICAgIF9nY3J5X21kX2dldF9hbGdvX2RsZW4KKyNkZWZpbmUgZ2NyeV9tZF9oYXNoX2J1ZmZlciAgICAgICAgIF9nY3J5X21kX2hhc2hfYnVmZmVyCisjZGVmaW5lIGdjcnlfbWRfaW5mbyAgICAgICAgICAgICAgICBfZ2NyeV9tZF9pbmZvCisjZGVmaW5lIGdjcnlfbWRfaXNfZW5hYmxlZCAgICAgICAgICBfZ2NyeV9tZF9pc19lbmFibGVkCisjZGVmaW5lIGdjcnlfbWRfaXNfc2VjdXJlICAgICAgICAgICBfZ2NyeV9tZF9pc19zZWN1cmUKKyNkZWZpbmUgZ2NyeV9tZF9saXN0ICAgICAgICAgICAgICAgIF9nY3J5X21kX2xpc3QKKyNkZWZpbmUgZ2NyeV9tZF9tYXBfbmFtZSAgICAgICAgICAgIF9nY3J5X21kX21hcF9uYW1lCisjZGVmaW5lIGdjcnlfbWRfb3BlbiAgICAgICAgICAgICAgICBfZ2NyeV9tZF9vcGVuCisjZGVmaW5lIGdjcnlfbWRfcmVhZCAgICAgICAgICAgICAgICBfZ2NyeV9tZF9yZWFkCisvKiBnY3J5X21kX3JlZ2lzdGVyIGFuZCBfZ2NyeV9tZF9yZWdpc3RlciBkaWZmZXIuICAqLworI2RlZmluZSBnY3J5X21kX3VucmVnaXN0ZXIgICAgICAgICAgX2djcnlfbWRfdW5yZWdpc3RlcgorI2RlZmluZSBnY3J5X21kX3Jlc2V0ICAgICAgICAgICAgICAgX2djcnlfbWRfcmVzZXQKKyNkZWZpbmUgZ2NyeV9tZF9zZXRrZXkgICAgICAgICAgICAgIF9nY3J5X21kX3NldGtleQorI2RlZmluZSBnY3J5X21kX3dyaXRlICAgICAgICAgICAgICAgX2djcnlfbWRfd3JpdGUKKyNkZWZpbmUgZ2NyeV9tZF9kZWJ1ZyAgICAgICAgICAgICAgIF9nY3J5X21kX2RlYnVnCisKKyNkZWZpbmUgZ2NyeV9jaXBoZXJfYWxnb19pbmZvICAgICAgIF9nY3J5X2NpcGhlcl9hbGdvX2luZm8KKyNkZWZpbmUgZ2NyeV9jaXBoZXJfYWxnb19uYW1lICAgICAgIF9nY3J5X2NpcGhlcl9hbGdvX25hbWUKKyNkZWZpbmUgZ2NyeV9jaXBoZXJfY2xvc2UgICAgICAgICAgIF9nY3J5X2NpcGhlcl9jbG9zZQorI2RlZmluZSBnY3J5X2NpcGhlcl9zZXRrZXkgICAgICAgICAgX2djcnlfY2lwaGVyX3NldGtleQorI2RlZmluZSBnY3J5X2NpcGhlcl9zZXRpdiAgICAgICAgICAgX2djcnlfY2lwaGVyX3NldGl2CisjZGVmaW5lIGdjcnlfY2lwaGVyX3NldGN0ciAgICAgICAgICBfZ2NyeV9jaXBoZXJfc2V0Y3RyCisjZGVmaW5lIGdjcnlfY2lwaGVyX2N0bCAgICAgICAgICAgICBfZ2NyeV9jaXBoZXJfY3RsCisjZGVmaW5lIGdjcnlfY2lwaGVyX2RlY3J5cHQgICAgICAgICBfZ2NyeV9jaXBoZXJfZGVjcnlwdAorI2RlZmluZSBnY3J5X2NpcGhlcl9lbmNyeXB0ICAgICAgICAgX2djcnlfY2lwaGVyX2VuY3J5cHQKKyNkZWZpbmUgZ2NyeV9jaXBoZXJfZ2V0X2FsZ29fYmxrbGVuIF9nY3J5X2NpcGhlcl9nZXRfYWxnb19ibGtsZW4KKyNkZWZpbmUgZ2NyeV9jaXBoZXJfZ2V0X2FsZ29fa2V5bGVuIF9nY3J5X2NpcGhlcl9nZXRfYWxnb19rZXlsZW4KKyNkZWZpbmUgZ2NyeV9jaXBoZXJfaW5mbyAgICAgICAgICAgIF9nY3J5X2NpcGhlcl9pbmZvCisjZGVmaW5lIGdjcnlfY2lwaGVyX2xpc3QgICAgICAgICAgICBfZ2NyeV9jaXBoZXJfbGlzdAorI2RlZmluZSBnY3J5X2NpcGhlcl9tYXBfbmFtZSAgICAgICAgX2djcnlfY2lwaGVyX21hcF9uYW1lCisjZGVmaW5lIGdjcnlfY2lwaGVyX21vZGVfZnJvbV9vaWQgICBfZ2NyeV9jaXBoZXJfbW9kZV9mcm9tX29pZAorI2RlZmluZSBnY3J5X2NpcGhlcl9vcGVuICAgICAgICAgICAgX2djcnlfY2lwaGVyX29wZW4KKy8qIGdjcnlfY2lwaGVyX3JlZ2lzdGVyIGFuZCAgX2djcnlfY2lwaGVyX3JlZ2lzdGVyIGRpZmZlci4gICovCisjZGVmaW5lIGdjcnlfY2lwaGVyX3VucmVnaXN0ZXIgICAgICBfZ2NyeV9jaXBoZXJfdW5yZWdpc3RlcgorCisjZGVmaW5lIGdjcnlfcGtfYWxnb19pbmZvICAgICAgICAgICBfZ2NyeV9wa19hbGdvX2luZm8KKyNkZWZpbmUgZ2NyeV9wa19hbGdvX25hbWUgICAgICAgICAgIF9nY3J5X3BrX2FsZ29fbmFtZQorI2RlZmluZSBnY3J5X3BrX2N0bCAgICAgICAgICAgICAgICAgX2djcnlfcGtfY3RsCisjZGVmaW5lIGdjcnlfcGtfZGVjcnlwdCAgICAgICAgICAgICBfZ2NyeV9wa19kZWNyeXB0CisjZGVmaW5lIGdjcnlfcGtfZW5jcnlwdCAgICAgICAgICAgICBfZ2NyeV9wa19lbmNyeXB0CisjZGVmaW5lIGdjcnlfcGtfZ2Vua2V5ICAgICAgICAgICAgICBfZ2NyeV9wa19nZW5rZXkKKyNkZWZpbmUgZ2NyeV9wa19nZXRfa2V5Z3JpcCAgICAgICAgIF9nY3J5X3BrX2dldF9rZXlncmlwCisjZGVmaW5lIGdjcnlfcGtfZ2V0X25iaXRzICAgICAgICAgICBfZ2NyeV9wa19nZXRfbmJpdHMKKyNkZWZpbmUgZ2NyeV9wa19saXN0ICAgICAgICAgICAgICAgIF9nY3J5X3BrX2xpc3QKKyNkZWZpbmUgZ2NyeV9wa19tYXBfbmFtZSAgICAgICAgICAgIF9nY3J5X3BrX21hcF9uYW1lCisvKiBnY3J5X3BrX3JlZ2lzdGVyIGFuZCBfZ2NyeV9wa19yZWdpc3RlciBkaWZmZXIuICAqLworI2RlZmluZSBnY3J5X3BrX3VucmVnaXN0ZXIgICAgICAgICAgX2djcnlfcGtfdW5yZWdpc3RlcgorI2RlZmluZSBnY3J5X3BrX3NpZ24gICAgICAgICAgICAgICAgX2djcnlfcGtfc2lnbgorI2RlZmluZSBnY3J5X3BrX3Rlc3RrZXkgICAgICAgICAgICAgX2djcnlfcGtfdGVzdGtleQorI2RlZmluZSBnY3J5X3BrX3ZlcmlmeSAgICAgICAgICAgICAgX2djcnlfcGtfdmVyaWZ5CisKKyNkZWZpbmUgZ2NyeV9hY19kYXRhX25ldyAgICAgICAgICAgIF9nY3J5X2FjX2RhdGFfbmV3CisjZGVmaW5lIGdjcnlfYWNfZGF0YV9kZXN0cm95ICAgICAgICBfZ2NyeV9hY19kYXRhX2Rlc3Ryb3kKKyNkZWZpbmUgZ2NyeV9hY19kYXRhX2NvcHkgICAgICAgICAgIF9nY3J5X2FjX2RhdGFfY29weQorI2RlZmluZSBnY3J5X2FjX2RhdGFfbGVuZ3RoICAgICAgICAgX2djcnlfYWNfZGF0YV9sZW5ndGgKKyNkZWZpbmUgZ2NyeV9hY19kYXRhX2NsZWFyICAgICAgICAgIF9nY3J5X2FjX2RhdGFfY2xlYXIKKyNkZWZpbmUgZ2NyeV9hY19kYXRhX3NldCAgICAgICAgICAgIF9nY3J5X2FjX2RhdGFfc2V0CisjZGVmaW5lIGdjcnlfYWNfZGF0YV9nZXRfbmFtZSAgICAgICBfZ2NyeV9hY19kYXRhX2dldF9uYW1lCisjZGVmaW5lIGdjcnlfYWNfZGF0YV9nZXRfaW5kZXggICAgICBfZ2NyeV9hY19kYXRhX2dldF9pbmRleAorI2RlZmluZSBnY3J5X2FjX29wZW4gICAgICAgICAgICAgICAgX2djcnlfYWNfb3BlbgorI2RlZmluZSBnY3J5X2FjX2Nsb3NlICAgICAgICAgICAgICAgX2djcnlfYWNfY2xvc2UKKyNkZWZpbmUgZ2NyeV9hY19rZXlfaW5pdCAgICAgICAgICAgIF9nY3J5X2FjX2tleV9pbml0CisjZGVmaW5lIGdjcnlfYWNfa2V5X3BhaXJfZ2VuZXJhdGUgICBfZ2NyeV9hY19rZXlfcGFpcl9nZW5lcmF0ZQorI2RlZmluZSBnY3J5X2FjX2tleV9wYWlyX2V4dHJhY3QgICAgX2djcnlfYWNfa2V5X3BhaXJfZXh0cmFjdAorI2RlZmluZSBnY3J5X2FjX2tleV9kYXRhX2dldCAgICAgICAgX2djcnlfYWNfa2V5X2RhdGFfZ2V0CisjZGVmaW5lIGdjcnlfYWNfa2V5X3Rlc3QgICAgICAgICAgICBfZ2NyeV9hY19rZXlfdGVzdAorI2RlZmluZSBnY3J5X2FjX2tleV9nZXRfbmJpdHMgICAgICAgX2djcnlfYWNfa2V5X2dldF9uYml0cworI2RlZmluZSBnY3J5X2FjX2tleV9nZXRfZ3JpcCAgICAgICAgX2djcnlfYWNfa2V5X2dldF9ncmlwCisjZGVmaW5lIGdjcnlfYWNfa2V5X2Rlc3Ryb3kgICAgICAgICBfZ2NyeV9hY19rZXlfZGVzdHJveQorI2RlZmluZSBnY3J5X2FjX2tleV9wYWlyX2Rlc3Ryb3kgICAgX2djcnlfYWNfa2V5X3BhaXJfZGVzdHJveQorI2RlZmluZSBnY3J5X2FjX2RhdGFfZW5jcnlwdCAgICAgICAgX2djcnlfYWNfZGF0YV9lbmNyeXB0CisjZGVmaW5lIGdjcnlfYWNfZGF0YV9kZWNyeXB0ICAgICAgICBfZ2NyeV9hY19kYXRhX2RlY3J5cHQKKyNkZWZpbmUgZ2NyeV9hY19kYXRhX3NpZ24gICAgICAgICAgIF9nY3J5X2FjX2RhdGFfc2lnbgorI2RlZmluZSBnY3J5X2FjX2RhdGFfdmVyaWZ5ICAgICAgICAgX2djcnlfYWNfZGF0YV92ZXJpZnkKKyNkZWZpbmUgZ2NyeV9hY19pZF90b19uYW1lICAgICAgICAgIF9nY3J5X2FjX2lkX3RvX25hbWUKKyNkZWZpbmUgZ2NyeV9hY19uYW1lX3RvX2lkICAgICAgICAgIF9nY3J5X2FjX25hbWVfdG9faWQKKyNkZWZpbmUgZ2NyeV9hY19kYXRhX2VuY29kZSAgICAgICAgIF9nY3J5X2FjX2RhdGFfZW5jb2RlCisjZGVmaW5lIGdjcnlfYWNfZGF0YV9kZWNvZGUgICAgICAgICBfZ2NyeV9hY19kYXRhX2RlY29kZQorI2RlZmluZSBnY3J5X2FjX21waV90b19vcyAgICAgICAgICAgX2djcnlfYWNfbXBpX3RvX29zCisjZGVmaW5lIGdjcnlfYWNfbXBpX3RvX29zX2FsbG9jICAgICBfZ2NyeV9hY19tcGlfdG9fb3NfYWxsb2MKKyNkZWZpbmUgZ2NyeV9hY19vc190b19tcGkgICAgICAgICAgIF9nY3J5X2FjX29zX3RvX21waQorI2RlZmluZSBnY3J5X2FjX2RhdGFfZW5jcnlwdF9zY2hlbWUgX2djcnlfYWNfZGF0YV9lbmNyeXB0X3NjaGVtZQorI2RlZmluZSBnY3J5X2FjX2RhdGFfZGVjcnlwdF9zY2hlbWUgX2djcnlfYWNfZGF0YV9kZWNyeXB0X3NjaGVtZQorI2RlZmluZSBnY3J5X2FjX2RhdGFfc2lnbl9zY2hlbWUgICAgX2djcnlfYWNfZGF0YV9zaWduX3NjaGVtZQorI2RlZmluZSBnY3J5X2FjX2RhdGFfdmVyaWZ5X3NjaGVtZSAgX2djcnlfYWNfZGF0YV92ZXJpZnlfc2NoZW1lCisjZGVmaW5lIGdjcnlfYWNfZGF0YV90b19zZXhwICAgICAgICBfZ2NyeV9hY19kYXRhX3RvX3NleHAKKyNkZWZpbmUgZ2NyeV9hY19kYXRhX2Zyb21fc2V4cCAgICAgIF9nY3J5X2FjX2RhdGFfZnJvbV9zZXhwCisjZGVmaW5lIGdjcnlfYWNfaW9faW5pdCAgICAgICAgICAgICBfZ2NyeV9hY19pb19pbml0CisjZGVmaW5lIGdjcnlfYWNfaW9faW5pdF92YSAgICAgICAgICBfZ2NyeV9hY19pb19pbml0X3ZhCisKKyNkZWZpbmUgZ2NyeV9wcmltZV9jaGVjayAgICAgICAgICAgIF9nY3J5X3ByaW1lX2NoZWNrCisjZGVmaW5lIGdjcnlfcHJpbWVfZ2VuZXJhdGUgICAgICAgICBfZ2NyeV9wcmltZV9nZW5lcmF0ZQorI2RlZmluZSBnY3J5X3ByaW1lX2dyb3VwX2dlbmVyYXRvciAgX2djcnlfcHJpbWVfZ3JvdXBfZ2VuZXJhdG9yCisjZGVmaW5lIGdjcnlfcHJpbWVfcmVsZWFzZV9mYWN0b3JzICBfZ2NyeV9wcmltZV9yZWxlYXNlX2ZhY3RvcnMKKworI2RlZmluZSBnY3J5X3JhbmRvbV9hZGRfYnl0ZXMgICAgICAgX2djcnlfcmFuZG9tX2FkZF9ieXRlcworI2RlZmluZSBnY3J5X3JhbmRvbV9ieXRlcyAgICAgICAgICAgX2djcnlfcmFuZG9tX2J5dGVzCisjZGVmaW5lIGdjcnlfcmFuZG9tX2J5dGVzX3NlY3VyZSAgICBfZ2NyeV9yYW5kb21fYnl0ZXNfc2VjdXJlCisjZGVmaW5lIGdjcnlfcmFuZG9taXplICAgICAgICAgICAgICBfZ2NyeV9yYW5kb21pemUKKyNkZWZpbmUgZ2NyeV9jcmVhdGVfbm9uY2UgICAgICAgICAgIF9nY3J5X2NyZWF0ZV9ub25jZQorCisjZGVmaW5lIGdjcnlfc2V4cF9hbGlzdCAgICAgICAgICAgICBfZ2NyeV9zZXhwX2FsaXN0CisjZGVmaW5lIGdjcnlfc2V4cF9hcHBlbmQgICAgICAgICAgICBfZ2NyeV9zZXhwX2FwcGVuZAorI2RlZmluZSBnY3J5X3NleHBfYnVpbGQgICAgICAgICAgICAgX2djcnlfc2V4cF9idWlsZAorI2RlZmluZSBnY3J5X3NleHBfYnVpbGRfYXJyYXkgICAgICAgX2djcnlfc2V4cF9idWlsZF9hcnJheQorI2RlZmluZSBnY3J5X3NleHBfY2FkciAgICAgICAgICAgICAgX2djcnlfc2V4cF9jYWRyCisjZGVmaW5lIGdjcnlfc2V4cF9jYW5vbl9sZW4gICAgICAgICBfZ2NyeV9zZXhwX2Nhbm9uX2xlbgorI2RlZmluZSBnY3J5X3NleHBfY2FyICAgICAgICAgICAgICAgX2djcnlfc2V4cF9jYXIKKyNkZWZpbmUgZ2NyeV9zZXhwX2NkciAgICAgICAgICAgICAgIF9nY3J5X3NleHBfY2RyCisjZGVmaW5lIGdjcnlfc2V4cF9jb25zICAgICAgICAgICAgICBfZ2NyeV9zZXhwX2NvbnMKKyNkZWZpbmUgZ2NyeV9zZXhwX2NyZWF0ZSAgICAgICAgICAgIF9nY3J5X3NleHBfY3JlYXRlCisjZGVmaW5lIGdjcnlfc2V4cF9kdW1wICAgICAgICAgICAgICBfZ2NyeV9zZXhwX2R1bXAKKyNkZWZpbmUgZ2NyeV9zZXhwX2ZpbmRfdG9rZW4gICAgICAgIF9nY3J5X3NleHBfZmluZF90b2tlbgorI2RlZmluZSBnY3J5X3NleHBfbGVuZ3RoICAgICAgICAgICAgX2djcnlfc2V4cF9sZW5ndGgKKyNkZWZpbmUgZ2NyeV9zZXhwX25ldyAgICAgICAgICAgICAgIF9nY3J5X3NleHBfbmV3CisjZGVmaW5lIGdjcnlfc2V4cF9udGggICAgICAgICAgICAgICBfZ2NyeV9zZXhwX250aAorI2RlZmluZSBnY3J5X3NleHBfbnRoX2RhdGEgICAgICAgICAgX2djcnlfc2V4cF9udGhfZGF0YQorI2RlZmluZSBnY3J5X3NleHBfbnRoX21waSAgICAgICAgICAgX2djcnlfc2V4cF9udGhfbXBpCisjZGVmaW5lIGdjcnlfc2V4cF9wcmVwZW5kICAgICAgICAgICBfZ2NyeV9zZXhwX3ByZXBlbmQKKyNkZWZpbmUgZ2NyeV9zZXhwX3JlbGVhc2UgICAgICAgICAgIF9nY3J5X3NleHBfcmVsZWFzZQorI2RlZmluZSBnY3J5X3NleHBfc3ByaW50ICAgICAgICAgICAgX2djcnlfc2V4cF9zcHJpbnQKKyNkZWZpbmUgZ2NyeV9zZXhwX3NzY2FuICAgICAgICAgICAgIF9nY3J5X3NleHBfc3NjYW4KKyNkZWZpbmUgZ2NyeV9zZXhwX3ZsaXN0ICAgICAgICAgICAgIF9nY3J5X3NleHBfdmxpc3QKKyNkZWZpbmUgZ2NyeV9zZXhwX250aF9zdHJpbmcgICAgICAgIF9nY3J5X3NleHBfbnRoX3N0cmluZworCisjZGVmaW5lIGdjcnlfbXBpX2FkZCAgICAgICAgICAgICAgICBfZ2NyeV9tcGlfYWRkCisjZGVmaW5lIGdjcnlfbXBpX2FkZF91aSAgICAgICAgICAgICBfZ2NyeV9tcGlfYWRkX3VpCisjZGVmaW5lIGdjcnlfbXBpX2FkZG0gICAgICAgICAgICAgICBfZ2NyeV9tcGlfYWRkbQorI2RlZmluZSBnY3J5X21waV9hcHJpbnQgICAgICAgICAgICAgX2djcnlfbXBpX2FwcmludAorI2RlZmluZSBnY3J5X21waV9jbGVhcl9iaXQgICAgICAgICAgX2djcnlfbXBpX2NsZWFyX2JpdAorI2RlZmluZSBnY3J5X21waV9jbGVhcl9mbGFnICAgICAgICAgX2djcnlfbXBpX2NsZWFyX2ZsYWcKKyNkZWZpbmUgZ2NyeV9tcGlfY2xlYXJfaGlnaGJpdCAgICAgIF9nY3J5X21waV9jbGVhcl9oaWdoYml0CisjZGVmaW5lIGdjcnlfbXBpX2NtcCAgICAgICAgICAgICAgICBfZ2NyeV9tcGlfY21wCisjZGVmaW5lIGdjcnlfbXBpX2NtcF91aSAgICAgICAgICAgICBfZ2NyeV9tcGlfY21wX3VpCisjZGVmaW5lIGdjcnlfbXBpX2NvcHkgICAgICAgICAgICAgICBfZ2NyeV9tcGlfY29weQorI2RlZmluZSBnY3J5X21waV9kaXYgICAgICAgICAgICAgICAgX2djcnlfbXBpX2RpdgorI2RlZmluZSBnY3J5X21waV9kdW1wICAgICAgICAgICAgICAgX2djcnlfbXBpX2R1bXAKKyNkZWZpbmUgZ2NyeV9tcGlfZ2NkICAgICAgICAgICAgICAgIF9nY3J5X21waV9nY2QKKyNkZWZpbmUgZ2NyeV9tcGlfZ2V0X2ZsYWcgICAgICAgICAgIF9nY3J5X21waV9nZXRfZmxhZworI2RlZmluZSBnY3J5X21waV9nZXRfbmJpdHMgICAgICAgICAgX2djcnlfbXBpX2dldF9uYml0cworI2RlZmluZSBnY3J5X21waV9nZXRfb3BhcXVlICAgICAgICAgX2djcnlfbXBpX2dldF9vcGFxdWUKKyNkZWZpbmUgZ2NyeV9tcGlfaW52bSAgICAgICAgICAgICAgIF9nY3J5X21waV9pbnZtCisjZGVmaW5lIGdjcnlfbXBpX21vZCAgICAgICAgICAgICAgICBfZ2NyeV9tcGlfbW9kCisjZGVmaW5lIGdjcnlfbXBpX211bCAgICAgICAgICAgICAgICBfZ2NyeV9tcGlfbXVsCisjZGVmaW5lIGdjcnlfbXBpX211bF8yZXhwICAgICAgICAgICBfZ2NyeV9tcGlfbXVsXzJleHAKKyNkZWZpbmUgZ2NyeV9tcGlfbXVsX3VpICAgICAgICAgICAgIF9nY3J5X21waV9tdWxfdWkKKyNkZWZpbmUgZ2NyeV9tcGlfbXVsbSAgICAgICAgICAgICAgIF9nY3J5X21waV9tdWxtCisjZGVmaW5lIGdjcnlfbXBpX25ldyAgICAgICAgICAgICAgICBfZ2NyeV9tcGlfbmV3CisjZGVmaW5lIGdjcnlfbXBpX3Bvd20gICAgICAgICAgICAgICBfZ2NyeV9tcGlfcG93bQorI2RlZmluZSBnY3J5X21waV9wcmludCAgICAgICAgICAgICAgX2djcnlfbXBpX3ByaW50CisjZGVmaW5lIGdjcnlfbXBpX3JhbmRvbWl6ZSAgICAgICAgICBfZ2NyeV9tcGlfcmFuZG9taXplCisjZGVmaW5lIGdjcnlfbXBpX3JlbGVhc2UgICAgICAgICAgICBfZ2NyeV9tcGlfcmVsZWFzZQorI2RlZmluZSBnY3J5X21waV9yc2hpZnQgICAgICAgICAgICAgX2djcnlfbXBpX3JzaGlmdAorI2RlZmluZSBnY3J5X21waV9sc2hpZnQgICAgICAgICAgICAgX2djcnlfbXBpX2xzaGlmdAorI2RlZmluZSBnY3J5X21waV9zY2FuICAgICAgICAgICAgICAgX2djcnlfbXBpX3NjYW4KKyNkZWZpbmUgZ2NyeV9tcGlfc2V0ICAgICAgICAgICAgICAgIF9nY3J5X21waV9zZXQKKyNkZWZpbmUgZ2NyeV9tcGlfc2V0X2JpdCAgICAgICAgICAgIF9nY3J5X21waV9zZXRfYml0CisjZGVmaW5lIGdjcnlfbXBpX3NldF9mbGFnICAgICAgICAgICBfZ2NyeV9tcGlfc2V0X2ZsYWcKKyNkZWZpbmUgZ2NyeV9tcGlfc2V0X2hpZ2hiaXQgICAgICAgIF9nY3J5X21waV9zZXRfaGlnaGJpdAorI2RlZmluZSBnY3J5X21waV9zZXRfb3BhcXVlICAgICAgICAgX2djcnlfbXBpX3NldF9vcGFxdWUKKyNkZWZpbmUgZ2NyeV9tcGlfc2V0X3VpICAgICAgICAgICAgIF9nY3J5X21waV9zZXRfdWkKKyNkZWZpbmUgZ2NyeV9tcGlfc25ldyAgICAgICAgICAgICAgIF9nY3J5X21waV9zbmV3CisjZGVmaW5lIGdjcnlfbXBpX3N1YiAgICAgICAgICAgICAgICBfZ2NyeV9tcGlfc3ViCisjZGVmaW5lIGdjcnlfbXBpX3N1Yl91aSAgICAgICAgICAgICBfZ2NyeV9tcGlfc3ViX3VpCisjZGVmaW5lIGdjcnlfbXBpX3N1Ym0gICAgICAgICAgICAgICBfZ2NyeV9tcGlfc3VibQorI2RlZmluZSBnY3J5X21waV9zd2FwICAgICAgICAgICAgICAgX2djcnlfbXBpX3N3YXAKKyNkZWZpbmUgZ2NyeV9tcGlfdGVzdF9iaXQgICAgICAgICAgIF9nY3J5X21waV90ZXN0X2JpdAorCisKKy8qIEluY2x1ZGUgdGhlIG1haW4gaGVhZGVyIGhlcmUgc28gdGhhdCBwdWJsaWMgc3ltYm9scyBhcmUgbWFwcGVkIHRvCisgICB0aGUgaW50ZXJuYWwgdW5kZXJzY29yZWQgb25lcy4gICovCisjaWZkZWYgX0dDUllfSU5DTFVERURfQllfVklTSUJJTElUWV9DCisgIC8qIFdlIG5lZWQgdG8gcmVkZWNsYXJlIHRoZSBkZXByZWNhdGVkIGZ1bmN0aW9ucyB3aXRob3V0IHRoZQorICAgICBkZXByZWNhdGVkIGF0dHJpYnV0ZS4gICovCisjIGRlZmluZSBHQ1JZUFRfTk9fREVQUkVDQVRFRAorIyBpbmNsdWRlICJnY3J5cHQuaCIKKyAgZ2NyeV9lcnJvcl90IGdjcnlfYWNfaWRfdG9fbmFtZSAoZ2NyeV9hY19pZF90IGFsZ29yaXRobSwgY29uc3QgY2hhciAqKm5hbWUpOworICBnY3J5X2Vycm9yX3QgZ2NyeV9hY19uYW1lX3RvX2lkIChjb25zdCBjaGFyICpuYW1lLCBnY3J5X2FjX2lkX3QgKmFsZ29yaXRobSk7CisjZWxzZQorIyBpbmNsdWRlICJnY3J5cHQuaCIKKyNlbmRpZgorCisvKiBQcm90b3R5cGVzIG9mIGZ1bmN0aW9ucyBleHBvcnRlZCBidXQgbm90IHJlYWR5IGZvciB1c2UuICAqLworZ2NyeV9lcnJfY29kZV90IGdjcnlfbWRfZ2V0IChnY3J5X21kX2hkX3QgaGQsIGludCBhbGdvLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyLCBpbnQgYnVmbGVuKTsKK3ZvaWQgZ2NyeV9hY19tcGlfdG9fb3MgKGdjcnlfbXBpX3QgbXBpLCB1bnNpZ25lZCBjaGFyICpvcywgc2l6ZV90IG9zX24pOworZ2NyeV9lcnJvcl90IGdjcnlfYWNfbXBpX3RvX29zX2FsbG9jIChnY3J5X21waV90IG1waSwgdW5zaWduZWQgY2hhciAqKm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpvc19uKTsKK3ZvaWQgZ2NyeV9hY19vc190b19tcGkgKGdjcnlfbXBpX3QgbXBpLCB1bnNpZ25lZCBjaGFyICpvcywgc2l6ZV90IG9zX24pOworCisKKworLyogT3VyIHVzZSBvZiB0aGUgRUxGIHZpc2liaWxpdHkgZmVhdHVyZSB3b3JrcyBieSBwYXNzaW5nCisgICAtZnZpc2liaWxpeT1oaWRkZW4gb24gdGhlIGNvbW1hbmQgbGluZSBhbmQgYnkgZXhwbGljaXRseSBtYXJraW5nCisgICBhbGwgZXhwb3J0ZWQgZnVuY3Rpb25zIGFzIHZpc2libGUuICAKKworICAgTk9URTogV2hlbiBhZGRpbmcgbmV3IGZ1bmN0aW9ucywgcGxlYXNlIG1ha2Ugc3VyZSB0byBhZGQgdGhlbSB0bworICAgICAgICAgbGliZ2NyeXB0LnZlcnMgYW5kIGxpYmdjcnlwdC5kZWYgYXMgd2VsbC4gICovCisKKyNpZmRlZiBfR0NSWV9JTkNMVURFRF9CWV9WSVNJQklMSVRZX0MKKworLyogQSBtYWNybyB0byBmbGFnIGEgZnVuY3Rpb24gYXMgdmlzaWJsZS4gIE5vdGUgdGhhdCB3ZSB0YWtlIHRoZQorICAgZGVmaW5pdGlvbiBmcm9tIHRoZSBtYXBwZWQgbmFtZS4gICovCisjaWZkZWYgR0NSWV9VU0VfVklTSUJJTElUWQorIyBkZWZpbmUgTUFSS19WSVNJQkxFKG5hbWUpIFwKKyAgICBleHRlcm4gX190eXBlb2ZfXyAoXyMjbmFtZSkgbmFtZSBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSk7CisjIGRlZmluZSBNQVJLX1ZJU0lCTEVYKG5hbWUpIFwKKyAgICBleHRlcm4gX190eXBlb2ZfXyAobmFtZSkgbmFtZSBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSk7CisjZWxzZQorIyBkZWZpbmUgTUFSS19WSVNJQkxFKG5hbWUpIC8qICovCisjIGRlZmluZSBNQVJLX1ZJU0lCTEVYKG5hbWUpIC8qICovCisjZW5kaWYKKworCisvKiBGaXJzdCB1bmRlZiBhbGwgcmVkZWZpbmVkIHN5bWJvbHMgc28gdGhhdCB3ZSBzZXQgdGhlIGF0dHJpYnV0ZSBvbgorICAgdGhlIGNvcnJlY3QgdmVyc2lvbiBuYW1lLiAgKi8KKyN1bmRlZiBnY3J5X2NoZWNrX3ZlcnNpb24gICAgICAgICAKKyN1bmRlZiBnY3J5X2NvbnRyb2wgICAgICAgICAgICAgICAKKworI3VuZGVmIGdjcnlfc2V0X2FsbG9jYXRpb25faGFuZGxlcgorI3VuZGVmIGdjcnlfc2V0X2ZhdGFsZXJyb3JfaGFuZGxlcgorI3VuZGVmIGdjcnlfc2V0X2dldHRleHRfaGFuZGxlciAgIAorI3VuZGVmIGdjcnlfc2V0X2xvZ19oYW5kbGVyICAgICAgIAorI3VuZGVmIGdjcnlfc2V0X291dG9mY29yZV9oYW5kbGVyIAorI3VuZGVmIGdjcnlfc2V0X3Byb2dyZXNzX2hhbmRsZXIgIAorI3VuZGVmIGdjcnlfZXJyX2NvZGVfZnJvbV9lcnJubyAgIAorI3VuZGVmIGdjcnlfZXJyX2NvZGVfdG9fZXJybm8gICAgIAorI3VuZGVmIGdjcnlfZXJyX21ha2VfZnJvbV9lcnJubyAgIAorI3VuZGVmIGdjcnlfZXJyb3JfZnJvbV9lcnJubyAgICAgIAorI3VuZGVmIGdjcnlfc3RyZXJyb3IgICAgICAgICAgICAgIAorI3VuZGVmIGdjcnlfc3Ryc291cmNlICAgICAgICAgICAgIAorCisjdW5kZWYgZ2NyeV9mcmVlICAgICAgICAgICAgICAgICAgCisjdW5kZWYgZ2NyeV9tYWxsb2MgICAgICAgICAgICAgICAgCisjdW5kZWYgZ2NyeV9tYWxsb2Nfc2VjdXJlICAgICAgICAgCisjdW5kZWYgZ2NyeV9jYWxsb2MgICAgICAgICAgICAgICAgCisjdW5kZWYgZ2NyeV9jYWxsb2Nfc2VjdXJlICAgICAgICAgCisjdW5kZWYgZ2NyeV9yZWFsbG9jICAgICAgICAgICAgICAgCisjdW5kZWYgZ2NyeV9zdHJkdXAgICAgICAgICAgICAgICAgCisjdW5kZWYgZ2NyeV9pc19zZWN1cmUgICAgICAgICAgICAgCisjdW5kZWYgZ2NyeV94Y2FsbG9jICAgICAgICAgICAgICAgCisjdW5kZWYgZ2NyeV94Y2FsbG9jX3NlY3VyZSAgICAgICAgCisjdW5kZWYgZ2NyeV94bWFsbG9jICAgICAgICAgICAgICAgCisjdW5kZWYgZ2NyeV94bWFsbG9jX3NlY3VyZSAgICAgICAgCisjdW5kZWYgZ2NyeV94cmVhbGxvYyAgICAgICAgICAgICAgCisjdW5kZWYgZ2NyeV94c3RyZHVwICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI3VuZGVmIGdjcnlfbWRfYWxnb19pbmZvICAgICAgICAgIAorI3VuZGVmIGdjcnlfbWRfYWxnb19uYW1lICAgICAgICAgIAorI3VuZGVmIGdjcnlfbWRfY2xvc2UgICAgICAgICAgICAgIAorI3VuZGVmIGdjcnlfbWRfY29weSAgICAgICAgICAgICAgIAorI3VuZGVmIGdjcnlfbWRfY3RsICAgICAgICAgICAgICAgIAorI3VuZGVmIGdjcnlfbWRfZW5hYmxlICAgICAgICAgICAgIAorI3VuZGVmIGdjcnlfbWRfZ2V0ICAgICAgICAgICAgICAgIAorI3VuZGVmIGdjcnlfbWRfZ2V0X2FsZ28gICAgICAgICAgIAorI3VuZGVmIGdjcnlfbWRfZ2V0X2FsZ29fZGxlbiAgICAgIAorI3VuZGVmIGdjcnlfbWRfaGFzaF9idWZmZXIgICAgICAgIAorI3VuZGVmIGdjcnlfbWRfaW5mbyAgICAgICAgICAgICAgIAorI3VuZGVmIGdjcnlfbWRfaXNfZW5hYmxlZCAgICAgICAgIAorI3VuZGVmIGdjcnlfbWRfaXNfc2VjdXJlICAgICAgICAgIAorI3VuZGVmIGdjcnlfbWRfbGlzdCAgICAgICAgICAgICAgIAorI3VuZGVmIGdjcnlfbWRfbWFwX25hbWUgICAgICAgICAgIAorI3VuZGVmIGdjcnlfbWRfb3BlbiAgICAgICAgICAgICAgIAorI3VuZGVmIGdjcnlfbWRfcmVhZCAgICAgICAgICAgICAgIAorLyogZ2NyeV9tZF9yZWdpc3RlciBpcyBub3QgYW55bW9yZSBhIG1hY3JvLiAgKi8KKyN1bmRlZiBnY3J5X21kX3VucmVnaXN0ZXIgICAgICAgICAKKyN1bmRlZiBnY3J5X21kX3Jlc2V0ICAgICAgICAgICAgICAKKyN1bmRlZiBnY3J5X21kX3NldGtleSAgICAgICAgICAgICAKKyN1bmRlZiBnY3J5X21kX3dyaXRlICAgICAgICAgICAgICAKKyN1bmRlZiBnY3J5X21kX2RlYnVnICAgICAgICAgICAgICAKKworI3VuZGVmIGdjcnlfY2lwaGVyX2FsZ29faW5mbyAgICAgIAorI3VuZGVmIGdjcnlfY2lwaGVyX2FsZ29fbmFtZSAgICAgIAorI3VuZGVmIGdjcnlfY2lwaGVyX2Nsb3NlICAgICAgICAgIAorI3VuZGVmIGdjcnlfY2lwaGVyX3NldGtleQorI3VuZGVmIGdjcnlfY2lwaGVyX3NldGl2CisjdW5kZWYgZ2NyeV9jaXBoZXJfc2V0Y3RyCisjdW5kZWYgZ2NyeV9jaXBoZXJfY3RsICAgICAgICAgICAgCisjdW5kZWYgZ2NyeV9jaXBoZXJfZGVjcnlwdCAgICAgICAgCisjdW5kZWYgZ2NyeV9jaXBoZXJfZW5jcnlwdCAgICAgICAgCisjdW5kZWYgZ2NyeV9jaXBoZXJfZ2V0X2FsZ29fYmxrbGVuCisjdW5kZWYgZ2NyeV9jaXBoZXJfZ2V0X2FsZ29fa2V5bGVuCisjdW5kZWYgZ2NyeV9jaXBoZXJfaW5mbyAgICAgICAgICAgCisjdW5kZWYgZ2NyeV9jaXBoZXJfbGlzdCAgICAgICAgICAgCisjdW5kZWYgZ2NyeV9jaXBoZXJfbWFwX25hbWUgICAgICAgCisjdW5kZWYgZ2NyeV9jaXBoZXJfbW9kZV9mcm9tX29pZCAgCisjdW5kZWYgZ2NyeV9jaXBoZXJfb3BlbiAgICAgICAgICAgCisvKiBnY3J5X2NpcGhlcl9yZWdpc3RlciBpcyBub3QgYW55bW9yZSBhIG1hY3JvLiAgKi8KKyN1bmRlZiBnY3J5X2NpcGhlcl91bnJlZ2lzdGVyICAgICAKKworI3VuZGVmIGdjcnlfcGtfYWxnb19pbmZvICAgICAgICAgIAorI3VuZGVmIGdjcnlfcGtfYWxnb19uYW1lICAgICAgICAgIAorI3VuZGVmIGdjcnlfcGtfY3RsICAgICAgICAgICAgICAgIAorI3VuZGVmIGdjcnlfcGtfZGVjcnlwdCAgICAgICAgICAgIAorI3VuZGVmIGdjcnlfcGtfZW5jcnlwdCAgICAgICAgICAgIAorI3VuZGVmIGdjcnlfcGtfZ2Vua2V5ICAgICAgICAgICAgIAorI3VuZGVmIGdjcnlfcGtfZ2V0X2tleWdyaXAgICAgICAgIAorI3VuZGVmIGdjcnlfcGtfZ2V0X25iaXRzICAgICAgICAgIAorI3VuZGVmIGdjcnlfcGtfbGlzdCAgICAgICAgICAgICAgIAorI3VuZGVmIGdjcnlfcGtfbWFwX25hbWUgICAgICAgICAgIAorLyogZ2NyeV9wa19yZWdpc3RlciBpcyBub3QgYW55bW9yZSBhIG1hY3JvLiAgKi8KKyN1bmRlZiBnY3J5X3BrX3VucmVnaXN0ZXIgICAgICAgICAKKyN1bmRlZiBnY3J5X3BrX3NpZ24gICAgICAgICAgICAgICAKKyN1bmRlZiBnY3J5X3BrX3Rlc3RrZXkgICAgICAgICAgICAKKyN1bmRlZiBnY3J5X3BrX3ZlcmlmeSAgICAgICAgICAgICAKKworI3VuZGVmIGdjcnlfYWNfZGF0YV9uZXcgICAgICAgICAgIAorI3VuZGVmIGdjcnlfYWNfZGF0YV9kZXN0cm95ICAgICAgIAorI3VuZGVmIGdjcnlfYWNfZGF0YV9jb3B5ICAgICAgICAgIAorI3VuZGVmIGdjcnlfYWNfZGF0YV9sZW5ndGggICAgICAgIAorI3VuZGVmIGdjcnlfYWNfZGF0YV9jbGVhciAgICAgICAgIAorI3VuZGVmIGdjcnlfYWNfZGF0YV9zZXQgICAgICAgICAgIAorI3VuZGVmIGdjcnlfYWNfZGF0YV9nZXRfbmFtZSAgICAgIAorI3VuZGVmIGdjcnlfYWNfZGF0YV9nZXRfaW5kZXggICAgIAorI3VuZGVmIGdjcnlfYWNfb3BlbiAgICAgICAgICAgICAgIAorI3VuZGVmIGdjcnlfYWNfY2xvc2UgICAgICAgICAgICAgIAorI3VuZGVmIGdjcnlfYWNfa2V5X2luaXQgICAgICAgICAgIAorI3VuZGVmIGdjcnlfYWNfa2V5X3BhaXJfZ2VuZXJhdGUgIAorI3VuZGVmIGdjcnlfYWNfa2V5X3BhaXJfZXh0cmFjdCAgIAorI3VuZGVmIGdjcnlfYWNfa2V5X2RhdGFfZ2V0ICAgICAgIAorI3VuZGVmIGdjcnlfYWNfa2V5X3Rlc3QgICAgICAgICAgIAorI3VuZGVmIGdjcnlfYWNfa2V5X2dldF9uYml0cyAgICAgIAorI3VuZGVmIGdjcnlfYWNfa2V5X2dldF9ncmlwICAgICAgIAorI3VuZGVmIGdjcnlfYWNfa2V5X2Rlc3Ryb3kgICAgICAgIAorI3VuZGVmIGdjcnlfYWNfa2V5X3BhaXJfZGVzdHJveSAgIAorI3VuZGVmIGdjcnlfYWNfZGF0YV9lbmNyeXB0ICAgICAgIAorI3VuZGVmIGdjcnlfYWNfZGF0YV9kZWNyeXB0ICAgICAgIAorI3VuZGVmIGdjcnlfYWNfZGF0YV9zaWduICAgICAgICAgIAorI3VuZGVmIGdjcnlfYWNfZGF0YV92ZXJpZnkgICAgICAgIAorI3VuZGVmIGdjcnlfYWNfaWRfdG9fbmFtZSAgICAgICAgIAorI3VuZGVmIGdjcnlfYWNfbmFtZV90b19pZCAgICAgICAgIAorI3VuZGVmIGdjcnlfYWNfZGF0YV9lbmNvZGUgICAgICAgIAorI3VuZGVmIGdjcnlfYWNfZGF0YV9kZWNvZGUgICAgICAgIAorI3VuZGVmIGdjcnlfYWNfbXBpX3RvX29zICAgICAgICAgIAorI3VuZGVmIGdjcnlfYWNfbXBpX3RvX29zX2FsbG9jICAgIAorI3VuZGVmIGdjcnlfYWNfb3NfdG9fbXBpICAgICAgICAgIAorI3VuZGVmIGdjcnlfYWNfZGF0YV9lbmNyeXB0X3NjaGVtZQorI3VuZGVmIGdjcnlfYWNfZGF0YV9kZWNyeXB0X3NjaGVtZQorI3VuZGVmIGdjcnlfYWNfZGF0YV9zaWduX3NjaGVtZSAgIAorI3VuZGVmIGdjcnlfYWNfZGF0YV92ZXJpZnlfc2NoZW1lIAorI3VuZGVmIGdjcnlfYWNfZGF0YV90b19zZXhwICAgICAgIAorI3VuZGVmIGdjcnlfYWNfZGF0YV9mcm9tX3NleHAgICAgIAorI3VuZGVmIGdjcnlfYWNfaW9faW5pdCAgICAgICAgICAgIAorI3VuZGVmIGdjcnlfYWNfaW9faW5pdF92YSAgICAgICAgIAorCisjdW5kZWYgZ2NyeV9wcmltZV9jaGVjayAgICAgICAgICAgCisjdW5kZWYgZ2NyeV9wcmltZV9nZW5lcmF0ZSAgICAgICAgCisjdW5kZWYgZ2NyeV9wcmltZV9ncm91cF9nZW5lcmF0b3IgCisjdW5kZWYgZ2NyeV9wcmltZV9yZWxlYXNlX2ZhY3RvcnMgCisKKyN1bmRlZiBnY3J5X3JhbmRvbV9hZGRfYnl0ZXMgICAgICAKKyN1bmRlZiBnY3J5X3JhbmRvbV9ieXRlcyAgICAgICAgICAKKyN1bmRlZiBnY3J5X3JhbmRvbV9ieXRlc19zZWN1cmUgICAKKyN1bmRlZiBnY3J5X3JhbmRvbWl6ZSAgICAgICAgICAgICAKKyN1bmRlZiBnY3J5X2NyZWF0ZV9ub25jZSAgICAgICAgICAKKworI3VuZGVmIGdjcnlfc2V4cF9hbGlzdCAgICAgICAgICAgIAorI3VuZGVmIGdjcnlfc2V4cF9hcHBlbmQgICAgICAgICAgIAorI3VuZGVmIGdjcnlfc2V4cF9idWlsZCAgICAgICAgICAgIAorI3VuZGVmIGdjcnlfc2V4cF9idWlsZF9hcnJheSAgICAgIAorI3VuZGVmIGdjcnlfc2V4cF9jYWRyICAgICAgICAgICAgIAorI3VuZGVmIGdjcnlfc2V4cF9jYW5vbl9sZW4gICAgICAgIAorI3VuZGVmIGdjcnlfc2V4cF9jYXIgICAgICAgICAgICAgIAorI3VuZGVmIGdjcnlfc2V4cF9jZHIgICAgICAgICAgICAgIAorI3VuZGVmIGdjcnlfc2V4cF9jb25zICAgICAgICAgICAgIAorI3VuZGVmIGdjcnlfc2V4cF9jcmVhdGUgICAgICAgICAgIAorI3VuZGVmIGdjcnlfc2V4cF9kdW1wICAgICAgICAgICAgIAorI3VuZGVmIGdjcnlfc2V4cF9maW5kX3Rva2VuICAgICAgIAorI3VuZGVmIGdjcnlfc2V4cF9sZW5ndGggICAgICAgICAgIAorI3VuZGVmIGdjcnlfc2V4cF9uZXcgICAgICAgICAgICAgIAorI3VuZGVmIGdjcnlfc2V4cF9udGggICAgICAgICAgICAgIAorI3VuZGVmIGdjcnlfc2V4cF9udGhfZGF0YSAgICAgICAgIAorI3VuZGVmIGdjcnlfc2V4cF9udGhfbXBpICAgICAgICAgIAorI3VuZGVmIGdjcnlfc2V4cF9wcmVwZW5kICAgICAgICAgIAorI3VuZGVmIGdjcnlfc2V4cF9yZWxlYXNlICAgICAgICAgIAorI3VuZGVmIGdjcnlfc2V4cF9zcHJpbnQgICAgICAgICAgIAorI3VuZGVmIGdjcnlfc2V4cF9zc2NhbiAgICAgICAgICAgIAorI3VuZGVmIGdjcnlfc2V4cF92bGlzdCAgICAgICAgICAgIAorI3VuZGVmIGdjcnlfc2V4cF9udGhfc3RyaW5nICAgICAgIAorCisjdW5kZWYgZ2NyeV9tcGlfYWRkICAgICAgICAgICAgICAgCisjdW5kZWYgZ2NyeV9tcGlfYWRkX3VpICAgICAgICAgICAgCisjdW5kZWYgZ2NyeV9tcGlfYWRkbSAgICAgICAgICAgICAgCisjdW5kZWYgZ2NyeV9tcGlfYXByaW50ICAgICAgICAgICAgCisjdW5kZWYgZ2NyeV9tcGlfY2xlYXJfYml0ICAgICAgICAgCisjdW5kZWYgZ2NyeV9tcGlfY2xlYXJfZmxhZyAgICAgICAgCisjdW5kZWYgZ2NyeV9tcGlfY2xlYXJfaGlnaGJpdCAgICAgCisjdW5kZWYgZ2NyeV9tcGlfY21wICAgICAgICAgICAgICAgCisjdW5kZWYgZ2NyeV9tcGlfY21wX3VpICAgICAgICAgICAgCisjdW5kZWYgZ2NyeV9tcGlfY29weSAgICAgICAgICAgICAgCisjdW5kZWYgZ2NyeV9tcGlfZGl2ICAgICAgICAgICAgICAgCisjdW5kZWYgZ2NyeV9tcGlfZHVtcCAgICAgICAgICAgICAgCisjdW5kZWYgZ2NyeV9tcGlfZ2NkICAgICAgICAgICAgICAgCisjdW5kZWYgZ2NyeV9tcGlfZ2V0X2ZsYWcgICAgICAgICAgCisjdW5kZWYgZ2NyeV9tcGlfZ2V0X25iaXRzICAgICAgICAgCisjdW5kZWYgZ2NyeV9tcGlfZ2V0X29wYXF1ZSAgICAgICAgCisjdW5kZWYgZ2NyeV9tcGlfaW52bSAgICAgICAgICAgICAgCisjdW5kZWYgZ2NyeV9tcGlfbW9kICAgICAgICAgICAgICAgCisjdW5kZWYgZ2NyeV9tcGlfbXVsICAgICAgICAgICAgICAgCisjdW5kZWYgZ2NyeV9tcGlfbXVsXzJleHAgICAgICAgICAgCisjdW5kZWYgZ2NyeV9tcGlfbXVsX3VpICAgICAgICAgICAgCisjdW5kZWYgZ2NyeV9tcGlfbXVsbSAgICAgICAgICAgICAgCisjdW5kZWYgZ2NyeV9tcGlfbmV3ICAgICAgICAgICAgICAgCisjdW5kZWYgZ2NyeV9tcGlfcG93bSAgICAgICAgICAgICAgCisjdW5kZWYgZ2NyeV9tcGlfcHJpbnQgICAgICAgICAgICAgCisjdW5kZWYgZ2NyeV9tcGlfcmFuZG9taXplICAgICAgICAgCisjdW5kZWYgZ2NyeV9tcGlfcmVsZWFzZSAgICAgICAgICAgCisjdW5kZWYgZ2NyeV9tcGlfcnNoaWZ0ICAgICAgICAgICAgCisjdW5kZWYgZ2NyeV9tcGlfbHNoaWZ0ICAgICAgICAgICAgCisjdW5kZWYgZ2NyeV9tcGlfc2NhbiAgICAgICAgICAgICAgCisjdW5kZWYgZ2NyeV9tcGlfc2V0ICAgICAgICAgICAgICAgCisjdW5kZWYgZ2NyeV9tcGlfc2V0X2JpdCAgICAgICAgICAgCisjdW5kZWYgZ2NyeV9tcGlfc2V0X2ZsYWcgICAgICAgICAgCisjdW5kZWYgZ2NyeV9tcGlfc2V0X2hpZ2hiaXQgICAgICAgCisjdW5kZWYgZ2NyeV9tcGlfc2V0X29wYXF1ZSAgICAgICAgCisjdW5kZWYgZ2NyeV9tcGlfc2V0X3VpICAgICAgICAgICAgCisjdW5kZWYgZ2NyeV9tcGlfc25ldyAgICAgICAgICAgICAgCisjdW5kZWYgZ2NyeV9tcGlfc3ViICAgICAgICAgICAgICAgCisjdW5kZWYgZ2NyeV9tcGlfc3ViX3VpICAgICAgICAgICAgCisjdW5kZWYgZ2NyeV9tcGlfc3VibSAgICAgICAgICAgICAgCisjdW5kZWYgZ2NyeV9tcGlfc3dhcCAgICAgICAgICAgICAgCisjdW5kZWYgZ2NyeV9tcGlfdGVzdF9iaXQgICAgICAgICAgCisKKworLyogTm93IG1hcmsgYWxsIHN5bWJvbHMuICAqLworCitNQVJLX1ZJU0lCTEUgKGdjcnlfY2hlY2tfdmVyc2lvbikKK01BUktfVklTSUJMRSAoZ2NyeV9jb250cm9sKQorCitNQVJLX1ZJU0lCTEUgKGdjcnlfc2V0X2FsbG9jYXRpb25faGFuZGxlcikKK01BUktfVklTSUJMRSAoZ2NyeV9zZXRfZmF0YWxlcnJvcl9oYW5kbGVyKQorTUFSS19WSVNJQkxFIChnY3J5X3NldF9nZXR0ZXh0X2hhbmRsZXIpCitNQVJLX1ZJU0lCTEUgKGdjcnlfc2V0X2xvZ19oYW5kbGVyKQorTUFSS19WSVNJQkxFIChnY3J5X3NldF9vdXRvZmNvcmVfaGFuZGxlcikKK01BUktfVklTSUJMRSAoZ2NyeV9zZXRfcHJvZ3Jlc3NfaGFuZGxlcikKK01BUktfVklTSUJMRSAoZ2NyeV9lcnJfY29kZV9mcm9tX2Vycm5vKQorTUFSS19WSVNJQkxFIChnY3J5X2Vycl9jb2RlX3RvX2Vycm5vKQorTUFSS19WSVNJQkxFIChnY3J5X2Vycl9tYWtlX2Zyb21fZXJybm8pCitNQVJLX1ZJU0lCTEUgKGdjcnlfZXJyb3JfZnJvbV9lcnJubykKK01BUktfVklTSUJMRSAoZ2NyeV9zdHJlcnJvcikKK01BUktfVklTSUJMRSAoZ2NyeV9zdHJzb3VyY2UpCisKK01BUktfVklTSUJMRSAoZ2NyeV9mcmVlKQorTUFSS19WSVNJQkxFIChnY3J5X21hbGxvYykKK01BUktfVklTSUJMRSAoZ2NyeV9tYWxsb2Nfc2VjdXJlKQorTUFSS19WSVNJQkxFIChnY3J5X2NhbGxvYykKK01BUktfVklTSUJMRSAoZ2NyeV9jYWxsb2Nfc2VjdXJlKQorTUFSS19WSVNJQkxFIChnY3J5X3JlYWxsb2MpCitNQVJLX1ZJU0lCTEUgKGdjcnlfc3RyZHVwKQorTUFSS19WSVNJQkxFIChnY3J5X2lzX3NlY3VyZSkKK01BUktfVklTSUJMRSAoZ2NyeV94Y2FsbG9jKQorTUFSS19WSVNJQkxFIChnY3J5X3hjYWxsb2Nfc2VjdXJlKQorTUFSS19WSVNJQkxFIChnY3J5X3htYWxsb2MpCitNQVJLX1ZJU0lCTEUgKGdjcnlfeG1hbGxvY19zZWN1cmUpCitNQVJLX1ZJU0lCTEUgKGdjcnlfeHJlYWxsb2MpCitNQVJLX1ZJU0lCTEUgKGdjcnlfeHN0cmR1cCkKKworTUFSS19WSVNJQkxFIChnY3J5X21kX2FsZ29faW5mbykKK01BUktfVklTSUJMRSAoZ2NyeV9tZF9hbGdvX25hbWUpCitNQVJLX1ZJU0lCTEUgKGdjcnlfbWRfY2xvc2UpCitNQVJLX1ZJU0lCTEUgKGdjcnlfbWRfY29weSkKK01BUktfVklTSUJMRSAoZ2NyeV9tZF9jdGwpCitNQVJLX1ZJU0lCTEUgKGdjcnlfbWRfZW5hYmxlKQorTUFSS19WSVNJQkxFIChnY3J5X21kX2dldCkKK01BUktfVklTSUJMRSAoZ2NyeV9tZF9nZXRfYWxnbykKK01BUktfVklTSUJMRSAoZ2NyeV9tZF9nZXRfYWxnb19kbGVuKQorTUFSS19WSVNJQkxFIChnY3J5X21kX2hhc2hfYnVmZmVyKQorTUFSS19WSVNJQkxFIChnY3J5X21kX2luZm8pCitNQVJLX1ZJU0lCTEUgKGdjcnlfbWRfaXNfZW5hYmxlZCkKK01BUktfVklTSUJMRSAoZ2NyeV9tZF9pc19zZWN1cmUpCitNQVJLX1ZJU0lCTEUgKGdjcnlfbWRfbGlzdCkKK01BUktfVklTSUJMRSAoZ2NyeV9tZF9tYXBfbmFtZSkKK01BUktfVklTSUJMRSAoZ2NyeV9tZF9vcGVuKQorTUFSS19WSVNJQkxFIChnY3J5X21kX3JlYWQpCitNQVJLX1ZJU0lCTEVYKGdjcnlfbWRfcmVnaXN0ZXIpCitNQVJLX1ZJU0lCTEUgKGdjcnlfbWRfcmVzZXQpCitNQVJLX1ZJU0lCTEUgKGdjcnlfbWRfc2V0a2V5KQorTUFSS19WSVNJQkxFIChnY3J5X21kX3VucmVnaXN0ZXIpCitNQVJLX1ZJU0lCTEUgKGdjcnlfbWRfd3JpdGUpCitNQVJLX1ZJU0lCTEUgKGdjcnlfbWRfZGVidWcpCisKK01BUktfVklTSUJMRSAoZ2NyeV9jaXBoZXJfYWxnb19pbmZvKQorTUFSS19WSVNJQkxFIChnY3J5X2NpcGhlcl9hbGdvX25hbWUpCitNQVJLX1ZJU0lCTEUgKGdjcnlfY2lwaGVyX2Nsb3NlKQorTUFSS19WSVNJQkxFIChnY3J5X2NpcGhlcl9zZXRrZXkpCitNQVJLX1ZJU0lCTEUgKGdjcnlfY2lwaGVyX3NldGl2KQorTUFSS19WSVNJQkxFIChnY3J5X2NpcGhlcl9zZXRjdHIpCitNQVJLX1ZJU0lCTEUgKGdjcnlfY2lwaGVyX2N0bCkKK01BUktfVklTSUJMRSAoZ2NyeV9jaXBoZXJfZGVjcnlwdCkKK01BUktfVklTSUJMRSAoZ2NyeV9jaXBoZXJfZW5jcnlwdCkKK01BUktfVklTSUJMRSAoZ2NyeV9jaXBoZXJfZ2V0X2FsZ29fYmxrbGVuKQorTUFSS19WSVNJQkxFIChnY3J5X2NpcGhlcl9nZXRfYWxnb19rZXlsZW4pCitNQVJLX1ZJU0lCTEUgKGdjcnlfY2lwaGVyX2luZm8pCitNQVJLX1ZJU0lCTEUgKGdjcnlfY2lwaGVyX2xpc3QpCitNQVJLX1ZJU0lCTEUgKGdjcnlfY2lwaGVyX21hcF9uYW1lKQorTUFSS19WSVNJQkxFIChnY3J5X2NpcGhlcl9tb2RlX2Zyb21fb2lkKQorTUFSS19WSVNJQkxFIChnY3J5X2NpcGhlcl9vcGVuKQorTUFSS19WSVNJQkxFWChnY3J5X2NpcGhlcl9yZWdpc3RlcikKK01BUktfVklTSUJMRSAoZ2NyeV9jaXBoZXJfdW5yZWdpc3RlcikKKworTUFSS19WSVNJQkxFIChnY3J5X3BrX2FsZ29faW5mbykKK01BUktfVklTSUJMRSAoZ2NyeV9wa19hbGdvX25hbWUpCitNQVJLX1ZJU0lCTEUgKGdjcnlfcGtfY3RsKQorTUFSS19WSVNJQkxFIChnY3J5X3BrX2RlY3J5cHQpCitNQVJLX1ZJU0lCTEUgKGdjcnlfcGtfZW5jcnlwdCkKK01BUktfVklTSUJMRSAoZ2NyeV9wa19nZW5rZXkpCitNQVJLX1ZJU0lCTEUgKGdjcnlfcGtfZ2V0X2tleWdyaXApCitNQVJLX1ZJU0lCTEUgKGdjcnlfcGtfZ2V0X25iaXRzKQorTUFSS19WSVNJQkxFIChnY3J5X3BrX2xpc3QpCitNQVJLX1ZJU0lCTEUgKGdjcnlfcGtfbWFwX25hbWUpCitNQVJLX1ZJU0lCTEVYKGdjcnlfcGtfcmVnaXN0ZXIpCitNQVJLX1ZJU0lCTEUgKGdjcnlfcGtfc2lnbikKK01BUktfVklTSUJMRSAoZ2NyeV9wa190ZXN0a2V5KQorTUFSS19WSVNJQkxFIChnY3J5X3BrX3VucmVnaXN0ZXIpCitNQVJLX1ZJU0lCTEUgKGdjcnlfcGtfdmVyaWZ5KQorCitNQVJLX1ZJU0lCTEUgKGdjcnlfYWNfZGF0YV9uZXcpCitNQVJLX1ZJU0lCTEUgKGdjcnlfYWNfZGF0YV9kZXN0cm95KQorTUFSS19WSVNJQkxFIChnY3J5X2FjX2RhdGFfY29weSkKK01BUktfVklTSUJMRSAoZ2NyeV9hY19kYXRhX2xlbmd0aCkKK01BUktfVklTSUJMRSAoZ2NyeV9hY19kYXRhX2NsZWFyKQorTUFSS19WSVNJQkxFIChnY3J5X2FjX2RhdGFfc2V0KQorTUFSS19WSVNJQkxFIChnY3J5X2FjX2RhdGFfZ2V0X25hbWUpCitNQVJLX1ZJU0lCTEUgKGdjcnlfYWNfZGF0YV9nZXRfaW5kZXgpCitNQVJLX1ZJU0lCTEUgKGdjcnlfYWNfb3BlbikKK01BUktfVklTSUJMRSAoZ2NyeV9hY19jbG9zZSkKK01BUktfVklTSUJMRSAoZ2NyeV9hY19rZXlfaW5pdCkKK01BUktfVklTSUJMRSAoZ2NyeV9hY19rZXlfcGFpcl9nZW5lcmF0ZSkKK01BUktfVklTSUJMRSAoZ2NyeV9hY19rZXlfcGFpcl9leHRyYWN0KQorTUFSS19WSVNJQkxFIChnY3J5X2FjX2tleV9kYXRhX2dldCkKK01BUktfVklTSUJMRSAoZ2NyeV9hY19rZXlfdGVzdCkKK01BUktfVklTSUJMRSAoZ2NyeV9hY19rZXlfZ2V0X25iaXRzKQorTUFSS19WSVNJQkxFIChnY3J5X2FjX2tleV9nZXRfZ3JpcCkKK01BUktfVklTSUJMRSAoZ2NyeV9hY19rZXlfZGVzdHJveSkKK01BUktfVklTSUJMRSAoZ2NyeV9hY19rZXlfcGFpcl9kZXN0cm95KQorTUFSS19WSVNJQkxFIChnY3J5X2FjX2RhdGFfZW5jcnlwdCkKK01BUktfVklTSUJMRSAoZ2NyeV9hY19kYXRhX2RlY3J5cHQpCitNQVJLX1ZJU0lCTEUgKGdjcnlfYWNfZGF0YV9zaWduKQorTUFSS19WSVNJQkxFIChnY3J5X2FjX2RhdGFfdmVyaWZ5KQorTUFSS19WSVNJQkxFIChnY3J5X2FjX2lkX3RvX25hbWUpCitNQVJLX1ZJU0lCTEUgKGdjcnlfYWNfbmFtZV90b19pZCkKKy8qIE1BUktfVklTSUJMRSAoZ2NyeV9hY19saXN0KSBOb3QgZGVmaW5lZCBhbHRob3VnaCBpdCBpcyBpbgorICAgICAgICBsaWJnY3J5cHQudmVycy4gKi8KK01BUktfVklTSUJMRSAoZ2NyeV9hY19kYXRhX2VuY29kZSkKK01BUktfVklTSUJMRSAoZ2NyeV9hY19kYXRhX2RlY29kZSkKK01BUktfVklTSUJMRSAoZ2NyeV9hY19tcGlfdG9fb3MpCitNQVJLX1ZJU0lCTEUgKGdjcnlfYWNfbXBpX3RvX29zX2FsbG9jKQorTUFSS19WSVNJQkxFIChnY3J5X2FjX29zX3RvX21waSkKK01BUktfVklTSUJMRSAoZ2NyeV9hY19kYXRhX2VuY3J5cHRfc2NoZW1lKQorTUFSS19WSVNJQkxFIChnY3J5X2FjX2RhdGFfZGVjcnlwdF9zY2hlbWUpCitNQVJLX1ZJU0lCTEUgKGdjcnlfYWNfZGF0YV9zaWduX3NjaGVtZSkKK01BUktfVklTSUJMRSAoZ2NyeV9hY19kYXRhX3ZlcmlmeV9zY2hlbWUpCitNQVJLX1ZJU0lCTEUgKGdjcnlfYWNfZGF0YV90b19zZXhwKQorTUFSS19WSVNJQkxFIChnY3J5X2FjX2RhdGFfZnJvbV9zZXhwKQorTUFSS19WSVNJQkxFIChnY3J5X2FjX2lvX2luaXQpCitNQVJLX1ZJU0lCTEUgKGdjcnlfYWNfaW9faW5pdF92YSkKKworTUFSS19WSVNJQkxFIChnY3J5X3ByaW1lX2NoZWNrKQorTUFSS19WSVNJQkxFIChnY3J5X3ByaW1lX2dlbmVyYXRlKQorTUFSS19WSVNJQkxFIChnY3J5X3ByaW1lX2dyb3VwX2dlbmVyYXRvcikKK01BUktfVklTSUJMRSAoZ2NyeV9wcmltZV9yZWxlYXNlX2ZhY3RvcnMpCisKK01BUktfVklTSUJMRSAoZ2NyeV9yYW5kb21fYWRkX2J5dGVzKQorTUFSS19WSVNJQkxFIChnY3J5X3JhbmRvbV9ieXRlcykKK01BUktfVklTSUJMRSAoZ2NyeV9yYW5kb21fYnl0ZXNfc2VjdXJlKQorTUFSS19WSVNJQkxFIChnY3J5X3JhbmRvbWl6ZSkKK01BUktfVklTSUJMRSAoZ2NyeV9jcmVhdGVfbm9uY2UpCisKK01BUktfVklTSUJMRSAoZ2NyeV9zZXhwX2FsaXN0KQorTUFSS19WSVNJQkxFIChnY3J5X3NleHBfYXBwZW5kKQorTUFSS19WSVNJQkxFIChnY3J5X3NleHBfYnVpbGQpCitNQVJLX1ZJU0lCTEUgKGdjcnlfc2V4cF9idWlsZF9hcnJheSkKK01BUktfVklTSUJMRSAoZ2NyeV9zZXhwX2NhZHIpCitNQVJLX1ZJU0lCTEUgKGdjcnlfc2V4cF9jYW5vbl9sZW4pCitNQVJLX1ZJU0lCTEUgKGdjcnlfc2V4cF9jYXIpCitNQVJLX1ZJU0lCTEUgKGdjcnlfc2V4cF9jZHIpCitNQVJLX1ZJU0lCTEUgKGdjcnlfc2V4cF9jb25zKQorTUFSS19WSVNJQkxFIChnY3J5X3NleHBfY3JlYXRlKQorTUFSS19WSVNJQkxFIChnY3J5X3NleHBfZHVtcCkKK01BUktfVklTSUJMRSAoZ2NyeV9zZXhwX2ZpbmRfdG9rZW4pCitNQVJLX1ZJU0lCTEUgKGdjcnlfc2V4cF9sZW5ndGgpCitNQVJLX1ZJU0lCTEUgKGdjcnlfc2V4cF9uZXcpCitNQVJLX1ZJU0lCTEUgKGdjcnlfc2V4cF9udGgpCitNQVJLX1ZJU0lCTEUgKGdjcnlfc2V4cF9udGhfZGF0YSkKK01BUktfVklTSUJMRSAoZ2NyeV9zZXhwX250aF9tcGkpCitNQVJLX1ZJU0lCTEUgKGdjcnlfc2V4cF9wcmVwZW5kKQorTUFSS19WSVNJQkxFIChnY3J5X3NleHBfcmVsZWFzZSkKK01BUktfVklTSUJMRSAoZ2NyeV9zZXhwX3NwcmludCkKK01BUktfVklTSUJMRSAoZ2NyeV9zZXhwX3NzY2FuKQorTUFSS19WSVNJQkxFIChnY3J5X3NleHBfdmxpc3QpCitNQVJLX1ZJU0lCTEUgKGdjcnlfc2V4cF9udGhfc3RyaW5nKQorCitNQVJLX1ZJU0lCTEUgKGdjcnlfbXBpX2FkZCkKK01BUktfVklTSUJMRSAoZ2NyeV9tcGlfYWRkX3VpKQorTUFSS19WSVNJQkxFIChnY3J5X21waV9hZGRtKQorTUFSS19WSVNJQkxFIChnY3J5X21waV9hcHJpbnQpCitNQVJLX1ZJU0lCTEUgKGdjcnlfbXBpX2NsZWFyX2JpdCkKK01BUktfVklTSUJMRSAoZ2NyeV9tcGlfY2xlYXJfZmxhZykKK01BUktfVklTSUJMRSAoZ2NyeV9tcGlfY2xlYXJfaGlnaGJpdCkKK01BUktfVklTSUJMRSAoZ2NyeV9tcGlfY21wKQorTUFSS19WSVNJQkxFIChnY3J5X21waV9jbXBfdWkpCitNQVJLX1ZJU0lCTEUgKGdjcnlfbXBpX2NvcHkpCitNQVJLX1ZJU0lCTEUgKGdjcnlfbXBpX2RpdikKK01BUktfVklTSUJMRSAoZ2NyeV9tcGlfZHVtcCkKK01BUktfVklTSUJMRSAoZ2NyeV9tcGlfZ2NkKQorTUFSS19WSVNJQkxFIChnY3J5X21waV9nZXRfZmxhZykKK01BUktfVklTSUJMRSAoZ2NyeV9tcGlfZ2V0X25iaXRzKQorTUFSS19WSVNJQkxFIChnY3J5X21waV9nZXRfb3BhcXVlKQorTUFSS19WSVNJQkxFIChnY3J5X21waV9pbnZtKQorTUFSS19WSVNJQkxFIChnY3J5X21waV9tb2QpCitNQVJLX1ZJU0lCTEUgKGdjcnlfbXBpX211bCkKK01BUktfVklTSUJMRSAoZ2NyeV9tcGlfbXVsXzJleHApCitNQVJLX1ZJU0lCTEUgKGdjcnlfbXBpX211bF91aSkKK01BUktfVklTSUJMRSAoZ2NyeV9tcGlfbXVsbSkKK01BUktfVklTSUJMRSAoZ2NyeV9tcGlfbmV3KQorTUFSS19WSVNJQkxFIChnY3J5X21waV9wb3dtKQorTUFSS19WSVNJQkxFIChnY3J5X21waV9wcmludCkKK01BUktfVklTSUJMRSAoZ2NyeV9tcGlfcmFuZG9taXplKQorTUFSS19WSVNJQkxFIChnY3J5X21waV9yZWxlYXNlKQorTUFSS19WSVNJQkxFIChnY3J5X21waV9yc2hpZnQpCitNQVJLX1ZJU0lCTEUgKGdjcnlfbXBpX2xzaGlmdCkKK01BUktfVklTSUJMRSAoZ2NyeV9tcGlfc2NhbikKK01BUktfVklTSUJMRSAoZ2NyeV9tcGlfc2V0KQorTUFSS19WSVNJQkxFIChnY3J5X21waV9zZXRfYml0KQorTUFSS19WSVNJQkxFIChnY3J5X21waV9zZXRfZmxhZykKK01BUktfVklTSUJMRSAoZ2NyeV9tcGlfc2V0X2hpZ2hiaXQpCitNQVJLX1ZJU0lCTEUgKGdjcnlfbXBpX3NldF9vcGFxdWUpCitNQVJLX1ZJU0lCTEUgKGdjcnlfbXBpX3NldF91aSkKK01BUktfVklTSUJMRSAoZ2NyeV9tcGlfc25ldykKK01BUktfVklTSUJMRSAoZ2NyeV9tcGlfc3ViKQorTUFSS19WSVNJQkxFIChnY3J5X21waV9zdWJfdWkpCitNQVJLX1ZJU0lCTEUgKGdjcnlfbXBpX3N1Ym0pCitNQVJLX1ZJU0lCTEUgKGdjcnlfbXBpX3N3YXApCitNQVJLX1ZJU0lCTEUgKGdjcnlfbXBpX3Rlc3RfYml0KQorCisKKworI3VuZGVmIE1BUktfVklTSUJMRQorI2VuZGlmIC8qX0dDUllfSU5DTFVERURfQllfVklTSUJJTElUWV9DKi8KKworI2VuZGlmIC8qR0NSWV9WSVNJQklMSVRZX0gqLwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L3Rlc3RzL0NoYW5nZUxvZyBiL2xpYmdjcnlwdC0xLjQuNi90ZXN0cy9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkwNmFhYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi90ZXN0cy9DaGFuZ2VMb2cKQEAgLTAsMCArMSw3NzAgQEAKKzIwMTAtMDctMTMgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGFlc3dyYXAuYzogTmV3LiAgVGFrZSBmcm9tIHRydW5rLgorCisyMDEwLTA3LTA5ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBiYXNpYy5jIChjaGVja19kaWdlc3RzKTogQWRkIHRlc3RzIGZvciBUSUdFUjEgYW5kIFRJR0VSMiBmcm9tCisJdGhlIE5FU1NJRSBwcm9qZWN0LgorCisyMDEwLTA2LTEwICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiB0LW1waS1iaXQuYyAobXBpMmJpdHN0cl9ubHopOiBIYW5kbGUgY2FzZSBmb3IgTEVOR1RIPT0wLgorCisyMDA5LTAxLTIyICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBjYXZzX3Rlc3RzLnNoOiBQYXNzIG9wdGlvbiAtRCB0byBkcml2ZXIgaWYgcmVxdWlyZWQuCisKKwkqIGZpcHNkcnYuYyAocnVuX2RzYV9zaWduKTogVXNlIGhhc2ggb2YgdGhlIGRhdGEuCisJKGRzYV9nZW5fd2l0aF9zZWVkKTogTmV3LgorCShydW5fZHNhX3BxZ19nZW4pOiBBZGQgYXJncyBTRUVEIGFuZCBTRUVETEVOIGFuZCB1c2UgdGhlbS4KKwkobWFpbik6IE9wdGljYWxseSB0YWtlIGEgc2VlZCBmb3IgZHNhLXBncS1nZW4uCisJKHN0YW5kYWxvbmVfbW9kZSk6IE5ldy4KKwkobWFpbik6IEFkZCBvcHRpb24gLS1zdGFuZGFsb25lLgorCShwcmludF9kc2FfZG9tYWluX3BhcmFtZXRlcnMpOiBJbXBsZW1lbnQgc3RhbmRhbG9uZSBtb2RlLgorCisyMDA5LTAxLTIxICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBmaXBzZHJ2LmMgKHJ1bl9kc2FfdmVyaWZ5KTogVXNlIGdjcnlfbXBpX3NjYW4gYWdhaW4uCisJKHJ1bl9yc2FfZGVyaXZlKTogQWxzbyBwcmludCBOLgorCisJKiBmaXBzZHJ2LmMgKHJ1bl9kc2FfdmVyaWZ5KTogVXNlIGhhc2ggb2YgdGhlIGRhdGEuCisKKwkqIHB1YmtleS5jIChnZXRfZHNhX2tleV9maXBzMTg2X3dpdGhfc2VlZF9uZXcpOiBOZXcuCisJKGNoZWNrX3J1bik6IENhbGwgaXQuCisKKzIwMDgtMTItMTEgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGZpcHNkcnYuYyAocnVuX3JzYV9kZXJpdmUpOiBOZXcuCisJKG1haW4pOiBBZGQgbW9kZSByc2EtZGVyaXZlLgorCisyMDA4LTEyLTEwICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBiYXNpYy5jIChtYWluKTogQ2hlY2sgZm9yIGVycm9yIGFmdGVyIHJ1bm5pbmcgc2VsZi10ZXN0IGluCisJbm9uLWZpcHMgbW9kZS4KKworCSogcHVia2V5LmMgKGdldF9kc2Ffa2V5X3dpdGhfZG9tYWluX25ldyk6IE5ldy4KKwkoZ2V0X2RzYV9rZXlfZmlwczE4Nl93aXRoX2RvbWFpbl9uZXcpOiBOZXcuCisJKGNoZWNrX3J1bik6IENhbGwgdGhlbS4KKworMjAwOC0xMi0wOCAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogZmlwc2Rydi5jIFtXMzJdOiBJbmNsdWRlIGZjbnRsLmguCisKKzIwMDgtMTItMDUgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIHB1YmtleS5jIChnZXRfZHNhX2tleV9uZXcpOiBBZGQgYXJnIHRyYW5zaWVudF9rZXkuCisJKGNoZWNrX3J1bik6IFVzZSBpdC4KKworMjAwOC0xMi0wMyAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogZmlwc2Rydi5jIChydW5fZHNhX3BxZ19nZW4pOiBGYWNvciBjb2RlIG91dCBpbnRvIC4uCisJKHByaW50X2RzYV9kb21haW5fcGFyYW1ldGVycywgZHNhX2dlbik6IC4uIHRoZXNlIHR3byBuZXcgZnVuY3Rpb25zLgorCShwcmludF9zZXhwLCByZWFkX3NleHBfZnJvbV9maWxlKTogTmV3LgorCShydW5fZHNhX3NpZ24pOiBOZXcuCisJKHJ1bl9kc2FfdmVyaWZ5KTogTmV3LgorCisyMDA4LTEyLTAyICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBmaXBzZHJ2LmM6IEFsbCBzdGFuZGFsb25lIGJ1aWxkLgorCisJKiBtcGl0ZXN0cy5jIChtcGlfcG93bSk6IE5ldy4KKworMjAwOC0xMS0yOCAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogZmlwczE4Ni1kc2EuYzogTmV3LgorCisJKiBmaXBzZHJ2LmMgKHByaW50X21waV9saW5lLCBwcmludF9kYXRhX2xpbmUpOiBOZXcuCisJKHJ1bl9kc2FfcHFnX2dlbik6IE5ldy4KKwkodXNhZ2UpOiBBZGQgbW9kZSBkc2EtcHFnLWdlbi4KKworMjAwOC0xMS0yNSAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogcHVia2V5LmMgKGdldF9kc2Ffa2V5X25ldyk6IE5ldy4KKworMjAwOC0xMS0yNCAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogdHNleHAuYyAoYmFzaWMpOiBBZGQgdGVzdCBmb3IgZm9ybWF0IGNoYXJhY3RlciBTLgorCisJKiBwdWJrZXkuYyAoY2hlY2tfeDkzMV9kZXJpdmVkX2tleSk6IE5ldy4KKwkoZ2V0X2tleXNfeDkzMV9uZXcpOiBOZXcuCisJKGNoZWNrX3J1bik6IENoZWNrIFg5LjMxIGdlbmVyYXRlZCBSU0Ega2V5LgorCisyMDA4LTExLTA3ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBmaXBzZHJ2LmMgKHJ1bl9jaXBoZXJfbWN0X2xvb3AsIGdldF9jdXJyZW50X2l2KTogTmV3LgorCShyZWFkX3RleHRsaW5lLCByZWFkX2hleGxpbmUsIHNraXBfdG9fZW1wdHlfbGluZSk6IE5ldy4KKwkobWFpbik6IE5ldyBvcHRpb24gLS1tY3Qtc2VydmVyLgorCSogY2F2c19kcml2ZXIucGw6IFVwZGF0ZSBmcm9tIHVwc3RyZWFtIGFuZCBhZGp1c3QgdG8gbmV3IGZpcHNkcnYuCisKKzIwMDgtMTEtMDUgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGZpcHNkcnYuYyAocnVuX2VuY3J5cHRfZGVjcnlwdCk6IERpc2FibGUgd2VhayBrZXkgZGV0ZWN0aW9uLgorCisyMDA4LTEwLTMxICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBmaXBzZHJ2LmMgKHJ1bl9yc2Ffc2lnbik6IEJ1ZmZlciBuZWVkcyB0byBiZSBsYXJnZXIgZm9yIFNIQTUxMi4KKworMjAwOC0xMC0yNyAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogZmlwc2Rydi5jIChydW5fZW5jcnlwdF9kZWNyeXB0KTogTWFrZSBJVl9CVUZGRVIgb3B0aW9uYWwuCisJKG1haW4pOiBEaXR0by4KKwkqIGNhdnNfZHJpdmVyLnBsOiBSZW1vdmUgdGhlIC0tbm8tZmlwcyBmbGFncy4KKwkobGliZ2NyeXB0X2VuY2RlYygkJCQkJCkpOiBNYWtlIElWIG9wdGlvbmFsLgorCShsaWJnY3J5cHRfc3RhdGVfY2lwaGVyKCQkJCQkKSk6IERpdHRvLgorCisyMDA4LTEwLTI0ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBiZW5jaG1hcmsuYyAobWRfYmVuY2gpOiBEbyBub3QgdGVzdCBNRDUgaW4gZmlwcyBtb2RlLgorCSogYmFzaWMuYyAoY2hlY2tfZGlnZXN0cywgY2hlY2tfaG1hYyk6IERpdHRvLgorCisyMDA4LTEwLTA2ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBjYXZzX2RyaXZlci5wbDogTmV3IHZlcnNpb24gZnJvbSB1cHN0cmVhbS4KKwkobGliZ2NyeXB0X3JzYV92ZXJpZnkoJCQkJCkpOiBQYXNzIHBrY3MxLgorCShsaWJnY3J5cHRfcnNhX3NpZ24oJCQkKSk6IFBhc3MgcGtjczEgYW5kIGhhc2ggYWxnby4KKworCSogZmlwc2Rydi5jIChydW5fcnNhX3NpZ24pOiBIYXNoIGRhdGEgaW4gcGtjczEgbW9kZS4KKwkocnVuX3JzYV92ZXJpZnkpOiBEaXR0by4KKwkocmVhZF9rZXlfZmlsZSk6IFJlbmFtZSB0byByZWFkX3ByaXZhdGVfa2V5X2ZpbGUuICBGYWN0b3IgcHVibGljCisJa2V5IGNvZGUgb3V0IHRvLi4KKwkocmVhZF9wdWJsaWNfa2V5X2ZpbGUpOiAuLiBuZXcuCisKKzIwMDgtMTAtMDIgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGZpcHNkcnYuYyAocHJpbnRfYnVmZmVyKTogQWRkIGJhc2U2NCBwcmludGluZyBjb2RlLgorCShiYXNlNjRfZGVjb2RlLCByZWFkX2tleV9maWxlLCBwYXJzZV90YWcsIHJlYWRfc2lnX2ZpbGUpOiBOZXcuCisJKHJ1bl9yc2FfZ2VuLCBydW5fcnNhX3NpZ24pOiBOZXcuCisJKG1haW4pOiBBZGQgbW9kZXMgcnNhLWdlbiwgcnNhLXNpZ24gYW5kIHJzYS12ZXJpZnkuCisKKwkKKzIwMDgtMDktMjkgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGZpcHNkcnYuYzogTWVyZ2UgY29kZSBmcm9tIGZpcHNybmdkcnYuYworCSogZmlwc3JuZ2Rydi5jOiBSZW1vdmUuCisKKzIwMDgtMDktMjYgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIE1ha2VmaWxlLmFtOiBEaXN0cmlidXRlIGNhdnNfZHJpdmVyLnBsLgorCSogY2F2c190ZXN0cy5zaDogTmV3LiAKKwkqIGZpcHNkcnYuYzogTmV3LgorCisyMDA4LTA5LTE4ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBiZW5jaG1hcmsuYyAobWFpbik6IERvIG5vdCBkaXNhYmxlIHNlY3VyZSBtZW1vcnkgaW4gRklQUyBtb2RlLgorCisyMDA4LTA5LTE4ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBiYXNpYy5jIChtYWluKTogRG8gbm90IGRpc2FibGUgc2VjdXJlIG1lbW9yeSBpbiBGSVBTIG1vZGUuCisKKzIwMDgtMDktMTYgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGZpcHNybmdkcnYuYyAobWFpbik6IEJhaWwgb3V0IG9uIHdyaXRlIGVycm9yLiAgSW1wbGVtZW50IHZlcmJvc2UKKwlvcHRpb24uCisJKG1haW4pOiBVc2UgZmxhZyB0byBkaXNhYmxlIGR1cCBibG9jayBjaGVja3MuCisKKzIwMDgtMDktMTUgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGZpcHNybmdkcnYuYzogTmV3LgorCisyMDA4LTA5LTA5ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBiYXNpYy5jIChtYWluKTogTmV3IG9wdGlvbiAtLXNlbGZ0ZXN0LgorCisyMDA4LTA4LTI5ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBrZXlncmlwLmM6IFVwZGF0ZSB0byBhbHNvIGNoZWNrIEVDRFNBLgorCisyMDA4LTA4LTI4ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiByc2EtMTZrLmtleTogTmV3IHNhbXBsZSBrZXkuCisKKzIwMDgtMDgtMjcgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIHBrYmVuY2guYyAocmVhZF9maWxlKTogTmV3LgorCShwcm9jZXNzX2tleV9wYWlyX2ZpbGUpOiBSZXBsYWNlIG1tYXAgYnkgcmVhZF9maWxlLgorCShtYWluKTogQWRkIGEgLS1maXBzIG9wdGlvbi4KKwkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogUmVtb3ZlLgorCShFWFRSQV9QUk9HUkFNUyk6IEFkZCBwa2JlbmNoLgorCisJKiBiYXNpYy5jIChtYWluKTogRXh0ZW5kZWQgRklQUyBzZWxmLXRlc3QgdGVzdC4KKworMjAwOC0wOC0yNiAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogYmFzaWMuYyAoZ2V0X2tleXNfbmV3KTogVXNlIHRyYW5zaWVudC1rZXkgZmxhZy4gCisJKiBiZW5jaG1hcmsuYyAobWFpbik6IEZpcnN0IGNoZWNrIG9wdGlvbnMgdGhlbiBkbyB0aGUgbGliZ2NyeXB0CisJaW5pdGlhbGl6YXRpb24uCisJKHJzYV9iZW5jaCk6IFVzZSB0cmFuc2llbnQta2V5IGZsYWcgaWYgbm90IGluIGZpcHMgbW9kZS4KKworMjAwOC0wOC0yMCAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogdC1tcGktYml0LmMgKHRlc3RfbHNoaWZ0KTogTmV3LgorCShtcGkyYml0c3RyX25seiwgbHNoaWZ0Yml0c3RyaW5nKTogTmV3LgorCShtYWluKTogUnVuIHRlc3QuCisKKzIwMDgtMDgtMTggIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGJhc2ljLmMgKG1haW4pOiBBZGQgb3B0aW9uIC0tZmlwcy4KKworMjAwOC0wOC0xNSAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogcmVnaXN0ZXIuYyAobWFpbik6IENoZWNrIGZvciBmaXBzIG1vZGUuCisJKGNoZWNrX3J1bik6IFRha2UgY2FyZSBvZiBmaXBzIG1vZGUuCisKKwkqIGJhc2ljLmMgKGNoZWNrX2NiY19tYWNfY2lwaGVyLCBjaGVja19jaXBoZXJzLCBjaGVja19kaWdlc3RzKQorCShjaGVja19obWFjLCBjaGVja19wdWJrZXkpOiBEbyBub3QgdGVzdCB1bmF2YWxhaWJsZSBhbGdvcml0aG1zIGluCisJZmlwcyBtb2RlLgorCShtYWluKTogQ2hlY2sgZm9yIGZpcHMgbW9kZS4KKworMjAwOC0wNC0yMiAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogYmFzaWMuYyAoY2hlY2tfb25lX2NpcGhlcik6IEFsc28gY2hlY2sgaW4tcGxhY2UgZW5jcnlwdGlvbi4KKworMjAwOC0wMy0xNyAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogYmVuY2htYXJrLmMgKG1haW4pOiBBZGQgb3B0aW9uIC0tY2lwaGVyLXJlcGV0aXRpb24uCisJKGNpcGhlcl9iZW5jaCk6IFVzZSBpdC4KKworMjAwOC0wMy0xMiAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogYmVuY2htYXJrLmMgKHJzYV9iZW5jaCk6IEFkZCBhcmcgTk9fQkxJTkRJTkcuCisJKG1haW4pOiBBZGQgb3B0aW9uIC0tbm8tYmxpbmRpbmcuCisKKzIwMDctMTItMDUgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIHB1YmtleS5jIChzYW1wbGVfcHJpdmF0ZV9rZXlfMV8xLHNhbXBsZV9wcml2YXRlX2tleV8xXzIpOiBOZXcuCisJKGdldF9rZXlzX3NhbXBsZSk6IEFkZCBhcmcgU0VDUkVUX1ZBUklBTlQuCisJKGNoZWNrX3J1bik6IENoZWNrIGFsbCB2YXJpYW50cy4gIEFsc28gY2hlY2sgZ2NyeV9wa190ZXN0a2V5LgorCShjaGVja19rZXlzX2NyeXB0KTogQWRkIERFQ1JZUFRfRkFJTF9DT0RFLgorCShjaGVja19rZXlzKTogRGl0dG8uCisKKzIwMDctMTEtMzAgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGJlbmNobWFyay5jIChtYWluKTogQWRkIG9wdGlvbmUgLS12ZXJib3NlIGFuZCByZXdvcmtlZCB0aGUKKwlvcHRpb24gcGFyc2luZy4KKwkocmFuZG9tX2JlbmNoKTogRHVtcCByYW5kb20gc3RhdHMuCisKKzIwMDctMTAtMzEgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGJlbmNobWFyay5jIChzdGFydF90aW1lciwgc3RvcF90aW1lciwgZWxhcHNlZF90aW1lKSBbVzMyXTogRml4ZWQuCisKKzIwMDctMDYtMjAgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGJlbmNobWFyay5jIChyc2FfYmVuY2gpOiBOZXcuCisJKG1haW4pOiBOZXcgY29tbWFuZCAicnNhIi4KKworMjAwNy0wNS0wMyAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBEbyBub3QgYnVpbGQgcGtiZW5jaC5jCisKKzIwMDctMDUtMDIgIERhdmlkIFNoYXcgIDxkc2hhd0BqYWJiZXJ3b2NreS5jb20+CisKKwkqIGJhc2ljLmMgKGNoZWNrX2NpcGhlcnMpOiBBZGQgQ2FtZWxsaWEuCisKKzIwMDctMDQtMzAgIERhdmlkIFNoYXcgIDxkc2hhd0BqYWJiZXJ3b2NreS5jb20+CisKKwkqIGJhc2ljLmMgKGNoZWNrX2NpcGhlcnMpOiAjaWYgb3V0IGNpcGhlcnMgd2UgZG9uJ3QgaGF2ZS4gIEFkZAorCXRlc3QgZm9yIEdDUllfQ0lQSEVSX1JGQzIyNjhfNDAuCisKKzIwMDctMDQtMzAgIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIHZlcnNpb24uYzogTmV3LgorCSogTWFrZWZpbGUuYW0gKFRFU1RTKTogQWRkIHZlcnNpb24uCisKKzIwMDctMDQtMzAgIE1hcmN1cyBCcmlua21hbm4gIDxtYXJjdXNAZzEwY29kZS5kZT4KKworCSogYmVuY2htYXJrLmMgKGVjY19iZW5jaCk6IFJlbGVhc2UgS0VZX1NQRUMuCisKKzIwMDctMDQtMjggIE1hcmN1cyBCcmlua21hbm4gIDxtYXJjdXNAZzEwY29kZS5kZT4KKworCSogYWMtZGF0YS5jIChjaGVja19ydW4pOiBEb24ndCBnaXZlIHJlZHVuZGFudCBHQ1JZX0FDX0ZMQUdfREVBTExPQworCWluIGFkZGl0aW9uIHRvIEdDUllfQUNfRkxBR19DT1BZLiAgRG9uJ3QgcmVsZWFzZSBMQUJFTDEgb3IgTVBJMCwKKwlhcyB0aG9zZSBhcmUgZG9uYXRlZCB0byBsaWJnY3J5cHQsIGJ1dCBkbyByZWxlYXNlIE1QSTAgYW5kIE1QSTIuCisKKzIwMDctMDQtMTIgIE1hcmN1cyBCcmlua21hbm4gIDxtYXJjdXNAZzEwY29kZS5kZT4KKworCSogYWMtc2NoZW1lcy5jIChzY2hlbWVfc3BlYyk6IFJldmVydCBsYXN0IGNoYW5nZS4KKwkKKwkqIGFjLXNjaGVtZXMuYyAoc2NoZW1lX3NwZWMpOiBSZW1vdmUgY29uc3QgcXVhbGlmaWVyIGZyb20gbWVtYmVyIE0uCisJKGVzX2NoZWNrKTogUmVtb3ZlIGNvbnN0IHF1YWxpZmllciBmcm9tIEMgYW5kIE0yLgorCisyMDA3LTAzLTI4ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBwa2JlbmNoLmMgKGdlbmVyYXRlX2tleSk6IFN1cHBvcnQgbmFtZWQgY3VydmVzLgorCisJKiBiZW5jaG1hcmsuYyAoZHNhX2JlbmNoKTogTmV3IGFyZ3MgSVRFUkFUSU9OUyBhbmQgUFJJTlRfSEVBREVSLgorCShtYWluKTogQ2FsbCBkc2EgYW5kIGVjYyBiZW5jaHMuCisJKHNob3dfc2V4cCk6IE5ldy4KKworCSogTWFrZWZpbGUuYW0gKFRFU1RTKTogTW92ZSBwa2JlbmNoIHRvIEVYVFJBX1BST0dSQU1TLgorCisyMDA3LTAzLTIyICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBiZW5jaG1hcmsuYyAoZGllKTogTmV3LgorCShlY2NfYmVuY2gpOiBOZXcuCisKKwkqIHBrYmVuY2guYyAobWFpbik6IFJld29ya2VkIHRvIHByb3ZpZGUgcHJvcGVyIG9wdGlvbiBoYW5kbGluZy4KKworMjAwNy0wMy0xMyAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogbXBpdGVzdHMuYzogUmVmb3JtYXR0ZWQgdG8gR05VIHN0YW5kYXJkcy4KKwkobWFpbik6IEFkZCBvcHRpb25zIC0tdmVyYm9zZSBhbmQgLS1kZWJ1ZyBmb3IgZnV0dXJlIHVzZS4KKworMjAwNy0wMy0xMyAgV2VybmVyIERpdHRtYW5uIDxXZXJuZXIuRGl0dG1hbm5AdC1vbmxpbmUuZGU+ICAod2spCisKKwkqIG1waXRlc3RzLmM6IE5ldy4KKworMjAwNy0wMi0yMyAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKFRFU1QpOiBSdW4gYmVuY2htYXJrIGFzIGxhc3QuIAorCisJKiBhYy1kYXRhLmMgKGNoZWNrX3NleHBfY29udmVyc2lvbik6IFByaW50IGxhYmVsIG9ubHkgaW4gdmVyYm9zZQorCW1vZGUuCisKKwkqIHB1YmtleS5jIChtYWluKTogUnVuIHRlc3QganVzdCAyIHRpbWVzIGluc3RlYWQgb2YgMTAuCisJKGdldF9lbGdfa2V5X25ldyk6IE5ldy4KKwkoY2hlY2tfcnVuKTogQWxzbyBydW4gdGVzdHMgd2l0aCBFbGdhbWFsIGtleXMuCisJKGNoZWNrX2tleXMpOiBOZXcgYXJnIE5CSVRTX0RBVEEuCisJKGdldF9lbGdfa2V5X25ldyk6IFVzZSBvbmx5IDQwMCBmb3IgdGhlIDUxMiBiaXQgRWxnYW1hbCB0ZXN0LgorCisJKiByYW5kb20uYzogTmV3LgorCisyMDA3LTAyLTIyICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBiYXNpYy5jIChjaGVja19wdWJrZXlfc2lnbik6IEFsc28gdHJ5IHNpZ25pbmcgdXNpbmcgYW4gT0lELgorCisJKiBNYWtlZmlsZS5hbSAoVEVTVFMpIFtXMzJdOiBSZW1vdmVkIHBrYmVuY2ggZm9yIG5vdy4KKwkqIHBrYmVuY2guYyAoYmVuY2htYXJrKTogRml4ZWQgZm9yIFczMi4KKworMjAwNy0wMi0yMSAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogaG1hYy5jIChjaGVja19vbmVfbWFjKTogTWFrZSBwb2ludGVyIGFyZ3MgY29uc3QuCisJKiBiYXNpYy5jIChjaGVja19vbmVfbWQpOiBEaXR0by4KKwkoY2hlY2tfb25lX2htYWMpOiBEaXR0by4KKworCSoga2V5Z2VuLmMgKHByb2dyZXNzX2NiKTogRmlsdGVyIG91dCBsaW5lIGZlZWRzLgorCSogYmFzaWMuYyAocHJvZ3Jlc3NfaGFuZGxlcik6IERpdHRvLgorCisyMDA2LTEyLTE4ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBNYWtlZmlsZS5hbSAoQU1fQ0ZMQUdTLCBBTV9DUFBGTEFHUyk6IFNwbGl0dGVkIGFuZCBtZXJnZWQgd2l0aAorCU1vcml0eicgY2hhbmdlcy4KKwkoSU5DTFVERVMpOiBSZW1vdmVkLgorCisJKiBrZXlnZW4uYyAocHJvZ3Jlc3NfaGFuZGxlcik6IE5ldy4KKwkobWFpbik6IFVzZSBpdCBpbiB2ZXJib3NlIG1vZGUuCisKKzIwMDYtMTEtMDUgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBNYWtlZmlsZS5hbSAoQU1fQ0ZMQUdTKTogQWRkZWQgLUkkKHRvcF9idWlsZGRpcikvc3JjIHNvIHRoYXQgdGhlCisJbmV3IGdjcnlwdC5oIGlzIHVzZWQsIG5vdCB0aGUgb25lIGluc3RhbGxlZCBpbiB0aGUgc3lzdGVtLgorCisyMDA2LTEwLTE3ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBrZXlnZW4uYyAoY2hlY2tfcnNhX2tleXMpOiBBbHNvIGNyZWF0ZSBhbiAxNTM2IGJpdCBEU0Ega2V5LgorCisyMDA2LTA4LTAzICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiB0LW1waS1iaXQuYzogTmV3LgorCisyMDA2LTA3LTA2ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBiZW5jaG1hcmsuYyAobWFpbik6IE5ldyBvcHRpb24gLS11c2UtcmFuZG9tLWRhZW1vbi4gIE5ldyBjb21tYW5kCisJc3Ryb25ncmFuZG9tLgorCShyYW5kb21fYmVuY2gpOiBOZXcgYXJnIFZFUllfU1RST05HLgorCisyMDA2LTAzLTE0ICBXZXJuZXIgS29jaCAgPHdrQGcxMGNvZGUuY29tPgorCisJKiBiZW5jaG1hcmsuYyAobWFpbik6IEFsbG93IGZvciBzZWVkIGZpbGUgYXJndW1lbnQgdG8gcmFuZG9tIGJlbmNoLgorCisJKiBiYXNpYy5jIChtYWluKTogVXNlIHByb2dyZXNzIGhhbmRsZXIgb25seSBpbiB2ZXJib3NlIG1vZGUuCisJKG1haW4pOiBTcGVlZCB1cCB0ZXN0IGtleSBnZW5lcmF0aW9uLgorCSogYWMtZGF0YS5jIChjaGVja19zZXhwX2NvbnZlcnNpb24sIGNoZWNrX3J1bik6IFRha2UgY2FyZSBvZiBWRVJCT1NFLgorCSogYWMuYyAobWFpbik6IERpdHRvLgorCSogcHVia2V5LmMgKG1haW4pOiBEaXR0by4KKwkqIHBrYmVuY2guYyAobWFpbik6IERpdHRvLgorCSoga2V5Z2VuLmMgKG1haW4pOiBEaXR0by4KKwkoY2hlY2tfcnNhX2tleXMpOiBQcmludCBrZXkgb25seSBpbiB2ZXJib3NlIG1vZGUuCisKKzIwMDYtMDMtMTAgIEJyYWQgSGFyZHMgIDxicmFkaEBmcm9nbW91dGgubmV0PiAgKHdrLCBwYXRjaCAyMDA2LTAyLTE4KQorCisJKiBiYXNpYy5jIChjaGVja19vbmVfaG1hYywgY2hlY2tfaG1hYyk6IE5ldy4KKworMjAwNi0wMy0wNyAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogYmVuY2htYXJrLmMgKGNpcGhlcl9iZW5jaCk6IEFkZCBPRkIgbW9kZS4KKworMjAwNi0wMS0xOCAgQnJhZCBIYXJkcyAgPGJyYWRoQGZyb2dtb3V0aC5uZXQ+ICh3ayAyMDA2LTAzLTA3KQorCisJKiBiYXNpYy5jOiBBZGRlZCB0ZXN0IGNhc2VzIGZvciBPRkIgYW5kIENGQiBtb2Rlcy4gRml4ZWQgc29tZQorCWNvbXBpbGVyIHdhcm5pbmdzIGZvciBzaWduZWRuZXNzLiAKKworMjAwNS0xMS0xMiAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGFjLWRhdGEuYzogQWRkZWQgd2F5IG1vcmUgdGVzdCBjYXNlcy4KKworMjAwNS0wOS0xNSAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChURVNUUyk6IEFkZGVkIGtleWdyaXAuCisJKiBrZXlncmlwLmM6IE5ldy4KKworMjAwNS0wOS0xOSAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogYmVuY2htYXJrLmMgKGRzYV9iZW5jaCk6IE5ldy4KKworMjAwNS0wOC0xOSAgV2VybmVyIEtvY2ggIDx3a0BnMTBjb2RlLmNvbT4KKworCSogaG1hYy5jIChtYWluKTogQWRkZWQgYWxsIEZJUFMgdGVzdHMuCisKKzIwMDUtMDgtMTggIFdlcm5lciBLb2NoICA8d2tAZzEwY29kZS5jb20+CisKKwkqIGhtYWMuYzogTmV3LgorCisyMDA1LTA0LTIyICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogdHNleHAuYzogSW5jbHVkZSA8Y29uZmlnLmg+IGluIGNhc2UgSEFWRV9DT05GSUdfSCBpcyBkZWZpbmVkOworCXRoYW5rcyB0byBBbGJlcnQgQ2hpbi4KKwkqIHRlc3RhcGkuYzogTGlrZXdpc2UuCisJKiByZWdpc3Rlci5jOiBMaWtld2lzZS4KKwkqIHB1YmtleS5jOiBMaWtld2lzZS4KKwkqIHByaW1lLmM6IExpa2V3aXNlLgorCSogcGtiZW5jaC5jOiBMaWtld2lzZS4KKwkqIGtleWdlbi5jOiBMaWtld2lzZS4KKwkqIGJlbmNobWFyay5jOiBMaWtld2lzZS4KKwkqIGJhc2ljLmM6IExpa2V3aXNlLgorCSogYWMtc2NoZW1lcy5jOiBMaWtld2lzZS4KKwkqIGFjLWRhdGEuYzogTGlrZXdpc2UuCisJKiBhYy5jOiBMaWtld2lzZS4KKworMjAwNS0wNC0xNiAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGFjLWRhdGEuYyAoY2hlY2tfcnVuKTogSW5jbHVkZSBuZXcgdGVzdC4KKworMjAwNS0wNC0xMSAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGJhc2ljLmMgKGNoZWNrX2RpZ2VzdHMpOiBBZGQgdGVzdHMgZm9yIFdoaXJscG9vbC4KKworMjAwNS0wMy0zMCAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGFjLXNjaGVtZXMuYzogTmV3IGZpbGUuCisJKiBhYy1kYXRhLmM6IE5ldyBmaWxlLgorCSogTWFrZWZpbGUuYW0gKFRFU1RTKTogQWRkZWQgYWMtc2NoZW1lcyBhbmQgYWMtZGF0YS4KKworMjAwNC0wOS0xNSAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIHBrYmVuY2guYzogSW5jbHVkZSA8dGltZS5oPi4KKworMjAwNC0wOC0yNCAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIHBrYmVuY2guYyAoY29udGV4dF9pbml0KTogSW1wcm92ZSBnZW5lcmF0aW9uIG9mIHRlc3QgZGF0YS4KKworMjAwNC0wOC0yMyAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChURVNUUyk6IEFkZGVkOiBwa2JlbmNoLgorCSogcGtiZW5jaC5jOiBOZXcgZmlsZS4KKworMjAwNC0wMi0yNSAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIE1ha2VmaWxlLmFtIChURVNUKTogQWRkIGJlbmNobWFyay4KKworCSogYmVuY2htYXJrLmMgKG1kX2JlbmNoLCBjaXBoZXJfYmVuY2gpOiBBbGxvdyBOVUxMIGFyZyB0byB0byBydW4KKwl0ZXN0cyBmb3IgYWxsIGFsZ29yaXRobXMuCisJKG1haW4pOiBSdW4gYWxsIHRlc3RzIGJ5IGRlZmF1bHQuCisKKzIwMDQtMDItMDMgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiB0c2V4cC5jIChiYXNpYyk6IE5ldyBwYXNzIHRvIGNoZWNrIHNlY3VyZSBtZW1vcnkgc3dpdGNoaW5nLgorCisyMDA0LTAxLTEyICBNb3JpdHogU2NodWx0ZSAgPG1vQGcxMGNvZGUuY29tPgorCisJKiBhYy5jIChjaGVja19vbmUpOiBBZGp1c3QgdG8gbmV3IGFjIEFQSS4KKworMjAwMy0xMS0yMiAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIHB1YmtleS5jIChjaGVja19rZXlzX2NyeXB0KTogRml4ZWQgbXkgbGFzdCBwYXRjaC4KKworMjAwMy0xMS0xMSAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIHRzZXhwLmMgKGJhc2ljKTogQWRkIHBhc3Mgc3RydWN0dXJlIGFuZCBhIHRlc3QgZm9yIHRoZSAlYgorCWZvcm1hdC4gCisKKzIwMDMtMTEtMDQgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBNYWtlZmlsZS5hbSAobm9pbnN0X1BST0dSQU1TKTogVXNlIHRoaXMgc28gdGhhdCB0ZXN0IHByb2dyYW1zCisJZ2V0IGFsd2F5cyBidWlsZC4KKworCSoga2V5Z2VuLmMgKGNoZWNrX25vbmNlKTogTmV3LgorCShtYWluKTogQWRkIGEgYmFzaWMgY2hlY2sgZm9yIHRoZSBub2NlbiBmdW5jdGlvbi4KKworMjAwMy0xMC0zMSAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIGJhc2ljLmMgKGNoZWNrX2FlczEyOF9jYmNfY3RzX2NpcGhlcik6IE1ha2UgaXQgYSBwcm90b3R5cGUKKworCSogYWMuYyAoY2hlY2tfcnVuKTogQ29tbWVudCB1bnVzZWQgdmFyaWFibGUuCisKKzIwMDMtMTAtMTAgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBwcmltZS5jIChjaGVja19wcmltZXMpOiBHZW5lcmF0ZSBhIGdlbmVyYXRvciBhbmQgYXZvaWQgcHJpbnRpbmcKKwl1bmxlc3MgaW4gdmVyYm9zZSBtb2RlLgorCisyMDAzLTEwLTA3ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogdHNleHAuYyAoY2hlY2tfc3NjYW4pOiBOZXcuCisKKzIwMDMtMDktMDQgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBwdWJrZXkuYyAoY2hlY2tfa2V5c19jcnlwdCk6IEZpeCBmb3IgY29tcGF0aWJpbGl0eSBtb2RlLgorCisyMDAzLTA5LTAyICBNb3JpdHogU2NodWx0ZSAgPG1vQGcxMGNvZGUuY29tPgorCisJKiBNYWtlZmlsZS5hbSAoVEVTVFMpOiBBZGRlZDogcHJpbWUuCisKKwkqIHByaW1lLmM6IE5ldyBmaWxlLgorCisyMDAzLTA4LTI3ICBNb3JpdHogU2NodWx0ZSAgPG1vQGcxMGNvZGUuY29tPgorCisJKiBiYXNpYy5jIChjaGVja19jaXBoZXJzKTogQWRkZWQ6IFNlcnBlbnQuCisJV3JpdGUgYnJhY2VzIGFyb3VuZCBmbGFncy4KKworMjAwMy0wOC0wNCAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGJlbmNobWFyay5jIChkb19wb3dtKTogQWRqdXN0IGZvciBuZXcgZ2NyeV9tcGlfc2NhbiBpbnRlcmZhY2UuCisKKzIwMDMtMDctMjMgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBhYy5jIChrZXlfY29weSk6IE5ldyBmdW5jdGlvbi4uLgorCShjaGVja19vbmUpOiAuLi4gdXNlIGl0LgorCisyMDAzLTA3LTIyICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogYmFzaWMuYyAoY2hlY2tfY2lwaGVycyk6IFVzZSBnY3J5X2NpcGhlcl9tYXBfbmFtZS4KKworMjAwMy0wNy0xOCAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIGFjLmMgKGNoZWNrX3J1bik6IFJlbmFtZWQgdG8gLi4uCisJKGNoZWNrX29uZSk6IC4uLiB0aGlzLCBjaGFuZ2VkIGNhbGxpbmcgaW50ZXJmYWNlLgorCShjaGVja19ydW4pOiBOZXcgZnVuY3Rpb24uCisKKwkqIHJlZ2lzdGVyLmM6IEFkanVzdCBnY3J5X2NpcGhlcl9zcGVjX3Qgc3RydWN0dXJlLgorCisyMDAzLTA3LTE0ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogcmVnaXN0ZXIuYzogQWRqdXN0IGNpcGhlciBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZS4KKworCSogYmVuY2htYXJrLmM6IE5ldyBmaWxlLgorCSogdGVzdGFwaS5jOiBOZXcgZmlsZS4KKworCSogTWFrZWZpbGUuYW0gKEVYVFJBX1BST0dSQU1TKTogU2V0IHRvOiBiZW5jaG1hcmsgdGVzdGFwaS4KKwkoY2hlY2tfUFJPR1JBTVMpOiBTZXQgdG86ICQoVEVTVFMpLgorCisyMDAzLTA3LTEyICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogYWMuYywgYmFzaWMuYywga2V5Z2VuLmMsIHJlZ2lzdGVyLmMsIHNleHAuYywgdHNleHAuYzogVXNlZAorCWdjcnlfZXJyKiB3cmFwcGVycyBmb3IgbGliZ3BnIHN5bWJvbHMuCisKKwkqIGJhc2ljLmMgKGNoZWNrX2NpcGhlcnMpOiBBZGRlZDogR0NSWV9DSVBIRVJfVFdPRklTSDEyOC4KKworMjAwMy0wNy0wOCAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChMSUJTKTogUmVtb3ZlOiAtbHB0aHJlYWQuCisKKwkqIGJhc2ljLmMgKGNoZWNrX29uZV9jaXBoZXIpOiBGaXggdmFyaWFibGUgaW5pdGlhbGl6YXRpb24uICBUaGFua3MKKwl0byBTaW1vbiBKb3NlZmZzb24gPGphc0BleHR1bmRvLmNvbT4uCisKKzIwMDMtMDctMDcgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBNYWtlZmlsZS5hbSAoVEVTVFMpOiBBZGRlZDogcmVnaXN0ZXIuCisKKzIwMDMtMDctMDUgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiByZWdpc3Rlci5jIChjaGVja19ydW4pOiBBZGp1c3RlZCBmb3IgbmV3IGdjcnlfY2lwaGVyX3JlZ2lzdGVyIEFQSS4KKworMjAwMy0wNy0wMiAgTW9yaXR6IFNjaHVsdGUgIDxtb3JpdHpAZzEwY29kZS5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChURVNUUyk6IEFkZGVkOiBhYy4KKwkqIGFjLmM6IE5ldyBmaWxlLgorCisyMDAzLTA2LTE4ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogYmFzaWMuYyAoY2hlY2tfY2JjX21hY19jaXBoZXIpOiBBZGp1c3RlZCBmb3IgbmV3IEFQSSBvZiBnZXRfYmxrbGVuCisJYW5kIGdldF9rZXlsZW4uCisJKGNoZWNrX2N0cl9jaXBoZXIpOiBEaXR0by4KKwkoY2hlY2tfb25lX2NpcGhlcik6IERpdHRvLgorCShjaGVja19vbmVfbWQpOiBBZGp1c3RlZCBmb3IgbmV3IEFQSSBvZiBnY3J5X21kX2NvcHkuCisKKzIwMDMtMDYtMTggIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiByZWdpc3Rlci5jOiBSZXBsYWNlIG9sZCB0eXBlIEdjcnlNb2R1bGUgd2l0aCBuZXdlciBvbmU6CisJZ2NyeV9tb2R1bGVfdC4KKwlBZGp1c3RlZCBmb3IgbmV3IEFQSS4KKworCSogTWFrZWZpbGUuYW0gKEFNX0NGTEFHUyk6IEFkZGVkOiBAR1BHX0VSUk9SX0NGTEFHU0AuCisKKzIwMDMtMDYtMTUgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBiYXNpYy5jIChnZXRfa2V5c19uZXcpOiBOZXcgZnVuY3Rpb24uCisJKGRvX2NoZWNrX29uZV9wdWJrZXkpOiBOZXcgZnVuY3Rpb24gLi4uCisJKGNoZWNrX29uZV9wdWJrZXkpOiAuLi4gdXNlIGl0LgorCShwcm9ncmVzc19oYW5kbGVyKTogTmV3IGZ1bmN0aW9uLgorCShtYWluKTogVXNlIGdjcnlfc2V0X3Byb2dyZXNzX2hhbmRsZXIuCisKKzIwMDMtMDYtMTQgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBiYXNpYy5jOiBSZXBsYWNlZCBjYWxscyB0byBnY3J5X3N0cmVycm9yIHdpdGggY2FsbHMgdG8KKwlncGdfc3RyZXJyb3IuCisJKGNoZWNrX29uZV9tZCk6IEFkanVzdCBmb3IgbmV3IGdjcnlfbWRfY29weSBBUEkuCisKKwkqIHRzZXhwLmM6IExpa2V3aXNlLgorCSoga2V5Z2VuLmM6IExpa2V3aXNlLgorCisyMDAzLTA2LTEyICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogYmFzaWMuYzogQ2hhbmdlZCBoZXJlIGFuZCB0aGVyZSwgcmVvcmdhbml6ZWQgcHVia2V5IGNoZWNrcywKKwlhZGRlZCBEU0EgYW5kIEVMRyBrZXlzLgorCisyMDAzLTA2LTA5ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogYmFzaWMuYywga2V5Z2VuLmMsIHB1YmtleS5jLCByZWdpc3Rlci5jLCB0c2V4cC5jOiBDaGFuZ2VkIHRvIHVzZQorCW5ldyBBUEkuCisJCisyMDAzLTA2LTAxICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogdHNleHAuYyAoY2Fub25fbGVuKTogQWRqdXN0IGZvciBuZXcgZ2NyeV9zZXhwX2Nhbm9uX2xlbiBBUEkuCisKKzIwMDMtMDUtMjYgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBiYXNpYy5jICh2ZXJpZnlfb25lX3NpZ25hdHVyZSk6IEFkanVzdCBmb3IgbGliZ3BnLWVycm9yLgorCShjaGVja19wdWJrZXlfc2lnbik6IExpa2V3aXNlLgorCShjaGVja19wdWJrZXkpOiBMaWtld2lzZS4KKwkqIGJhc2ljLmMgKGNoZWNrX3B1YmtleV9zaWduKTogTGlrZXdpc2UuCisJKiB0c2V4cC5jIChjYW5vbl9sZW4pOiBMaWtld2lzZS4KKwkoYmFja19hbmRfZm9ydGhfb25lKTogTGlrZXdpc2UuCisKKzIwMDMtMDQtMjcgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBwdWJrZXkuYzogQ2hhbmdlZCB0aGUgc2FtcGxlIHByaXZhdGUga2V5IHRvIGNvbnRhaW4gdGhlCisJaWRlbnRpZmllciBgb3BlbnBncC1yc2EnIGluc3RlYWQgb2YgYHJzYScuCisKKwkqIGJhc2ljLmMgKGNoZWNrX2RpZ2VzdHMpOiBFbmFibGVkL2ZpeGVkIHNvbWUgdGVzdHMgZm9yIFRJR0VSLgorCisyMDAzLTA0LTE3ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKFRFU1RTKTogUmVtb3ZlZCBgcmVnaXN0ZXInIGZvciBub3cuCisKKzIwMDMtMDQtMTcgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBiYXNpYy5jIChjaGVja19kaWdlc3RzKTogSW5jbHVkZSBjaGVja3MgZm9yIFNIQTUxMiBhbmQgU0hBMzg0LgorCisyMDAzLTA0LTE2ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogYmFzaWMuYyAoY2hlY2tfb25lX21kKTogQWxzbyB0ZXN0IG1kX2NvcHkuCisKKzIwMDMtMDQtMDcgIE1vcml0eiBTY2h1bHRlICA8bW9yaXR6QGcxMGNvZGUuY29tPgorCisJKiBNYWtlZmlsZS5hbSAoVEVTVFMpOiBBZGRlZCByZWdpc3Rlci4KKworCSogcmVnaXN0ZXIuYzogTmV3IGZpbGUuCisKKzIwMDMtMDMtMzAgIFNpbW9uIEpvc2Vmc3NvbiAgPGphc0BleHR1bmRvLmNvbT4KKworCSogYmFzaWMuYyAoY2hlY2tfb25lX2NpcGhlcik6IE5ldy4gIFRlc3QgQ1RSLgorCShtYWluKTogQ2FsbCBpdC4KKwkoY2hlY2tfY2lwaGVycyk6IENoZWNrIENUUiBtb2RlLgorCisyMDAzLTAzLTI2ICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKFRFU1RTKTogQWRkZWQgcHVia2V5LgorCisJKiBwdWJrZXkuYzogTmV3IGZpbGUuCisKKzIwMDMtMDMtMjIgIFNpbW9uIEpvc2Vmc3NvbiAgPGphc0BleHR1bmRvLmNvbT4KKworCSogYmFzaWMuYyAoY2hlY2tfY2JjX21hY19jaXBoZXIpOiBOZXcuCisJKG1haW4pOiBVc2UgaXQuCisKKzIwMDMtMDMtMTkgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBrZXlnZW4uYyAoY2hlY2tfcnNhX2tleXMpOiBEb24ndCBleHBlY3QgYW4gZXhwb25lbnQgd2hlbiBhc2tpbmcKKwlmb3IgZT0wLgorCShjaGVja19nZW5lcmF0ZWRfcnNhX2tleSk6IEp1c3QgcHJpbnQgZXhwb25lbnQgaWYgRVhQRUNURURfRSBpcyAwLgorCisyMDAzLTAzLTAyICBNb3JpdHogU2NodWx0ZSAgPG1vcml0ekBnMTBjb2RlLmNvbT4KKworCSogYmFzaWMuYyAoY2hlY2tfb25lX2NpcGhlcik6IFVzZSBnY3J5X2NpcGhlcl9yZXNldCgpIGluc3RlYWQgb2YKKwlnY3J5X2NpcGhlcl9jbG9zZSgpLCBnY3J5X2NpcGhlcl9vcGVuIGFuZCBnY3J5X2NpcGhlcl9zZXRrZXkoKS4KKworMjAwMy0wMS0yMyAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIGtleWdlbi5jOiBOZXcuIAorCisyMDAzLTAxLTIwICBTaW1vbiBKb3NlZnNzb24gIDxqYXNAZXh0dW5kby5jb20+CisKKwkqIGJhc2ljLmMgKGNoZWNrX2RpZ2VzdHMpOiBBZGQgQ1JDLgorCShjaGVja19vbmVfbWQpOiBQcmludCBjb21wdXRlZCBhbmQgZXhwZWN0ZWQgdmFsdWVzIG9uIGVycm9yLgorCisyMDAzLTAxLTIwICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogYmFzaWMuYyAoY2hlY2tfb25lX21kKTogS2x1ZGdlIHRvIGNoZWNrIGEgb25lIG1pbGxpb24gImEiLgorCShjaGVja19kaWdlc3RzKTogQWRkIGNoZWNrcyBmb3IgU0hBLTI1Ni4KKworMjAwMy0wMS0yMCAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIGJhc2ljLmMgKGNoZWNrX3B1YmtleSk6IENoZWNrIHRoZSBrZXlncmlwIGZvciB0aGUgc2FtcGxlIGtleS4KKworMjAwMy0wMS0xNSAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIGJhc2ljLmMgKHZlcmlmeV9vbmVfc2lnbmF0dXJlLGNoZWNrX3B1YmtleV9zaWduKQorCShjaGVja19wdWJrZXkpOiBOZXcuCisJKG1haW4pOiBDaGVjayBwdWJsaWMga2V5IGZ1bmN0aW9ucy4gQWRkIGEgLS1kZWJ1ZyBvcHRpb24uCisKKzIwMDItMTEtMjMgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiBiYXNpYy5jIChjaGVja19kaWdlc3RzKTogQWRkIGFub3RoZXIgdGVzdCBmb3IgTUQ0LiAgQnkgU2ltb24KKwlKb3NlZnNzb24uCisKKzIwMDItMTEtMTAgIFNpbW9uIEpvc2Vmc3NvbiAgPGphc0BleHR1bmRvLmNvbT4KKworCSogYmFzaWMuYyAoY2hlY2tfYWVzMTI4X2NiY19jdHNfY2lwaGVyKTogTmV3IGZ1bmN0aW9uLgorCShjaGVja19vbmVfY2lwaGVyKTogQWRkIGZsYWdzIHBhcmFtZXRlci4KKwkoY2hlY2tfY2lwaGVycyk6IFN1cHBvcnQgZmxhZ3MgcGFyYW1ldGVyLgorCShtYWluKTogQ2hlY2sgQ1RTLgorCisyMDAyLTExLTEwICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogYmFzaWMuYyAoY2hlY2tfb25lX21kKTogTmV3LiAgQnkgU2ltb24gSm9zZWZzc29uLgorCShjaGVja19kaWdlc3RzKTogTmV3IHRlc3RzIGZvciBNRDQuICBCeSBTaW1vbi4KKworMjAwMi0wOC0yNiAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIGJhc2ljLmMgKGNoZWNrX2NpcGhlcnMpOiBDaGVjayBzaW1wbGUgREVTLgorCisyMDAyLTA1LTE2ICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogdHNleHAuYyAoYmFja19hbmRfZm9ydGgpOiBWZXJ5IG1pbmltYWwgdGVzdCBvZiB0aGUgbmV3IGZ1bmN0aW9ucy4KKworMjAwMi0wNS0xNCAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwlDaGFuZ2VkIGxpY2Vuc2Ugb2YgYWxsIGZpbGVzIHRvIHRoZSBMR1BMLgorCisyMDAyLTA1LTAyICBXZXJuZXIgS29jaCAgPHdrQGdudXBnLm9yZz4KKworCSogYmFzaWMuYzogQWRkIG9wdGlvbiAtLXZlcmJvc2UuCisKKzIwMDItMDEtMTEgIFdlcm5lciBLb2NoICA8d2tAZ251cGcub3JnPgorCisJKiB0c2V4cC5jIChjYW5vbl9sZW4pOiBGaXhlZCB0ZXN0cy4KKworMjAwMS0xMi0xOCAgV2VybmVyIEtvY2ggIDx3a0BnbnVwZy5vcmc+CisKKwkqIHRzZXhwLmM6IE5ldy4KKworCQorIENvcHlyaWdodCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IGFzIGEgc3BlY2lhbCBleGNlcHRpb24gdGhlIGF1dGhvciBnaXZlcworIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQgZXZlbiB0aGUKKyBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi90ZXN0cy9NYWtlZmlsZS5hbSBiL2xpYmdjcnlwdC0xLjQuNi90ZXN0cy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmEyZDcxCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L3Rlc3RzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDQgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisjCisjIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorCisjIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIHByb2R1Y2UgTWFrZWZpbGUuaW4KKworVEVTVFMgPSB2ZXJzaW9uIHQtbXBpLWJpdCBwcmltZSByZWdpc3RlciBhYyBhYy1zY2hlbWVzIGFjLWRhdGEgYmFzaWMgXAorICAgICAgICBtcGl0ZXN0cyB0c2V4cCBrZXlnZW4gcHVia2V5IGhtYWMga2V5Z3JpcCBmaXBzMTg2LWRzYSBhZXN3cmFwCisKKworIyByYW5kb20uYyB1c2VzIGZvcmsoKSB0aHVzIGEgdGVzdCBmb3IgVzMyIGRvZXMgbm90IG1ha2UgYW55IHNlbnNlLgoraWYgIUhBVkVfVzMyX1NZU1RFTQorVEVTVFMgKz0gcmFuZG9tCitlbmRpZgorCisjIFRoZSBsYXN0IHRlc3QgdG8gcnVuLgorVEVTVFMgKz0gYmVuY2htYXJrCisKKworIyBOZWVkIHRvIGluY2x1ZGUgLi4vc3JjIGluIGFkZGl0aW9uIHRvIHRvcF9zcmNkaXIgYmVjYXVzZSBnY3J5cHQuaCBpcworIyBhIGJ1aWx0IGhlYWRlci4KK0FNX0NQUEZMQUdTID0gLUkuLi9zcmMgLUkkKHRvcF9zcmNkaXIpL3NyYworQU1fQ0ZMQUdTID0gJChHUEdfRVJST1JfQ0ZMQUdTKQorCitMREFERCA9IC4uL3NyYy9saWJnY3J5cHQubGEgJChETF9MSUJTKQorCitFWFRSQV9QUk9HUkFNUyA9IHRlc3RhcGkgcGtiZW5jaAorbm9pbnN0X1BST0dSQU1TID0gJChURVNUUykgZmlwc2RydgorCitFWFRSQV9ESVNUID0gUkVBRE1FIHJzYS0xNmsua2V5IGNhdnNfdGVzdHMuc2ggY2F2c19kcml2ZXIucGwKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi90ZXN0cy9NYWtlZmlsZS5pbiBiL2xpYmdjcnlwdC0xLjQuNi90ZXN0cy9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWViNTRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L3Rlc3RzL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsNzY3IEBACisjIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjEwLjIgZnJvbSBNYWtlZmlsZS5hbS4KKyMgQGNvbmZpZ3VyZV9pbnB1dEAKKworIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCisjIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDggIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworQFNFVF9NQUtFQAorCisjIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorIworIyBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKworVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK2FtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKK2luc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0CitpbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCitpbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX3RyaXBsZXQgPSBAYnVpbGRACitob3N0X3RyaXBsZXQgPSBAaG9zdEAKK1RFU1RTID0gdmVyc2lvbiQoRVhFRVhUKSB0LW1waS1iaXQkKEVYRUVYVCkgcHJpbWUkKEVYRUVYVCkgXAorCXJlZ2lzdGVyJChFWEVFWFQpIGFjJChFWEVFWFQpIGFjLXNjaGVtZXMkKEVYRUVYVCkgXAorCWFjLWRhdGEkKEVYRUVYVCkgYmFzaWMkKEVYRUVYVCkgbXBpdGVzdHMkKEVYRUVYVCkgXAorCXRzZXhwJChFWEVFWFQpIGtleWdlbiQoRVhFRVhUKSBwdWJrZXkkKEVYRUVYVCkgaG1hYyQoRVhFRVhUKSBcCisJa2V5Z3JpcCQoRVhFRVhUKSBmaXBzMTg2LWRzYSQoRVhFRVhUKSBhZXN3cmFwJChFWEVFWFQpIFwKKwkkKGFtX19FWEVFWFRfMSkgYmVuY2htYXJrJChFWEVFWFQpCisKKyMgcmFuZG9tLmMgdXNlcyBmb3JrKCkgdGh1cyBhIHRlc3QgZm9yIFczMiBkb2VzIG5vdCBtYWtlIGFueSBzZW5zZS4KK0BIQVZFX1czMl9TWVNURU1fRkFMU0VAYW1fX2FwcGVuZF8xID0gcmFuZG9tCitFWFRSQV9QUk9HUkFNUyA9IHRlc3RhcGkkKEVYRUVYVCkgcGtiZW5jaCQoRVhFRVhUKQorbm9pbnN0X1BST0dSQU1TID0gJChhbV9fRVhFRVhUXzIpIGZpcHNkcnYkKEVYRUVYVCkKK3N1YmRpciA9IHRlc3RzCitESVNUX0NPTU1PTiA9IFJFQURNRSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmluIFwKKwlDaGFuZ2VMb2cKK0FDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKK2FtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL200L2xpYnRvb2wubTQgXAorCSQodG9wX3NyY2RpcikvbTQvbm9leGVjc3RhY2subTQgJCh0b3Bfc3JjZGlyKS9tNC9vbmNlb25seS5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9zb2NrbGVuLm00ICQodG9wX3NyY2RpcikvbTQvc3lzX3NvY2tldF9oLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjaW5jbHVkZS5tNCAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5hYworYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKKwkkKEFDTE9DQUxfTTQpCitta2luc3RhbGxkaXJzID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzCitDT05GSUdfSEVBREVSID0gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5oCitDT05GSUdfQ0xFQU5fRklMRVMgPQorQEhBVkVfVzMyX1NZU1RFTV9GQUxTRUBhbV9fRVhFRVhUXzEgPSByYW5kb20kKEVYRUVYVCkKK2FtX19FWEVFWFRfMiA9IHZlcnNpb24kKEVYRUVYVCkgdC1tcGktYml0JChFWEVFWFQpIHByaW1lJChFWEVFWFQpIFwKKwlyZWdpc3RlciQoRVhFRVhUKSBhYyQoRVhFRVhUKSBhYy1zY2hlbWVzJChFWEVFWFQpIFwKKwlhYy1kYXRhJChFWEVFWFQpIGJhc2ljJChFWEVFWFQpIG1waXRlc3RzJChFWEVFWFQpIFwKKwl0c2V4cCQoRVhFRVhUKSBrZXlnZW4kKEVYRUVYVCkgcHVia2V5JChFWEVFWFQpIGhtYWMkKEVYRUVYVCkgXAorCWtleWdyaXAkKEVYRUVYVCkgZmlwczE4Ni1kc2EkKEVYRUVYVCkgYWVzd3JhcCQoRVhFRVhUKSBcCisJJChhbV9fRVhFRVhUXzEpIGJlbmNobWFyayQoRVhFRVhUKQorUFJPR1JBTVMgPSAkKG5vaW5zdF9QUk9HUkFNUykKK2FjX1NPVVJDRVMgPSBhYy5jCithY19PQkpFQ1RTID0gYWMuJChPQkpFWFQpCithY19MREFERCA9ICQoTERBREQpCithbV9fREVQRU5ERU5DSUVTXzEgPQorYWNfREVQRU5ERU5DSUVTID0gLi4vc3JjL2xpYmdjcnlwdC5sYSAkKGFtX19ERVBFTkRFTkNJRVNfMSkKK2FjX2RhdGFfU09VUkNFUyA9IGFjLWRhdGEuYworYWNfZGF0YV9PQkpFQ1RTID0gYWMtZGF0YS4kKE9CSkVYVCkKK2FjX2RhdGFfTERBREQgPSAkKExEQUREKQorYWNfZGF0YV9ERVBFTkRFTkNJRVMgPSAuLi9zcmMvbGliZ2NyeXB0LmxhICQoYW1fX0RFUEVOREVOQ0lFU18xKQorYWNfc2NoZW1lc19TT1VSQ0VTID0gYWMtc2NoZW1lcy5jCithY19zY2hlbWVzX09CSkVDVFMgPSBhYy1zY2hlbWVzLiQoT0JKRVhUKQorYWNfc2NoZW1lc19MREFERCA9ICQoTERBREQpCithY19zY2hlbWVzX0RFUEVOREVOQ0lFUyA9IC4uL3NyYy9saWJnY3J5cHQubGEgJChhbV9fREVQRU5ERU5DSUVTXzEpCithZXN3cmFwX1NPVVJDRVMgPSBhZXN3cmFwLmMKK2Flc3dyYXBfT0JKRUNUUyA9IGFlc3dyYXAuJChPQkpFWFQpCithZXN3cmFwX0xEQUREID0gJChMREFERCkKK2Flc3dyYXBfREVQRU5ERU5DSUVTID0gLi4vc3JjL2xpYmdjcnlwdC5sYSAkKGFtX19ERVBFTkRFTkNJRVNfMSkKK2Jhc2ljX1NPVVJDRVMgPSBiYXNpYy5jCitiYXNpY19PQkpFQ1RTID0gYmFzaWMuJChPQkpFWFQpCitiYXNpY19MREFERCA9ICQoTERBREQpCitiYXNpY19ERVBFTkRFTkNJRVMgPSAuLi9zcmMvbGliZ2NyeXB0LmxhICQoYW1fX0RFUEVOREVOQ0lFU18xKQorYmVuY2htYXJrX1NPVVJDRVMgPSBiZW5jaG1hcmsuYworYmVuY2htYXJrX09CSkVDVFMgPSBiZW5jaG1hcmsuJChPQkpFWFQpCitiZW5jaG1hcmtfTERBREQgPSAkKExEQUREKQorYmVuY2htYXJrX0RFUEVOREVOQ0lFUyA9IC4uL3NyYy9saWJnY3J5cHQubGEgJChhbV9fREVQRU5ERU5DSUVTXzEpCitmaXBzMTg2X2RzYV9TT1VSQ0VTID0gZmlwczE4Ni1kc2EuYworZmlwczE4Nl9kc2FfT0JKRUNUUyA9IGZpcHMxODYtZHNhLiQoT0JKRVhUKQorZmlwczE4Nl9kc2FfTERBREQgPSAkKExEQUREKQorZmlwczE4Nl9kc2FfREVQRU5ERU5DSUVTID0gLi4vc3JjL2xpYmdjcnlwdC5sYSAkKGFtX19ERVBFTkRFTkNJRVNfMSkKK2ZpcHNkcnZfU09VUkNFUyA9IGZpcHNkcnYuYworZmlwc2Rydl9PQkpFQ1RTID0gZmlwc2Rydi4kKE9CSkVYVCkKK2ZpcHNkcnZfTERBREQgPSAkKExEQUREKQorZmlwc2Rydl9ERVBFTkRFTkNJRVMgPSAuLi9zcmMvbGliZ2NyeXB0LmxhICQoYW1fX0RFUEVOREVOQ0lFU18xKQoraG1hY19TT1VSQ0VTID0gaG1hYy5jCitobWFjX09CSkVDVFMgPSBobWFjLiQoT0JKRVhUKQoraG1hY19MREFERCA9ICQoTERBREQpCitobWFjX0RFUEVOREVOQ0lFUyA9IC4uL3NyYy9saWJnY3J5cHQubGEgJChhbV9fREVQRU5ERU5DSUVTXzEpCitrZXlnZW5fU09VUkNFUyA9IGtleWdlbi5jCitrZXlnZW5fT0JKRUNUUyA9IGtleWdlbi4kKE9CSkVYVCkKK2tleWdlbl9MREFERCA9ICQoTERBREQpCitrZXlnZW5fREVQRU5ERU5DSUVTID0gLi4vc3JjL2xpYmdjcnlwdC5sYSAkKGFtX19ERVBFTkRFTkNJRVNfMSkKK2tleWdyaXBfU09VUkNFUyA9IGtleWdyaXAuYwora2V5Z3JpcF9PQkpFQ1RTID0ga2V5Z3JpcC4kKE9CSkVYVCkKK2tleWdyaXBfTERBREQgPSAkKExEQUREKQora2V5Z3JpcF9ERVBFTkRFTkNJRVMgPSAuLi9zcmMvbGliZ2NyeXB0LmxhICQoYW1fX0RFUEVOREVOQ0lFU18xKQorbXBpdGVzdHNfU09VUkNFUyA9IG1waXRlc3RzLmMKK21waXRlc3RzX09CSkVDVFMgPSBtcGl0ZXN0cy4kKE9CSkVYVCkKK21waXRlc3RzX0xEQUREID0gJChMREFERCkKK21waXRlc3RzX0RFUEVOREVOQ0lFUyA9IC4uL3NyYy9saWJnY3J5cHQubGEgJChhbV9fREVQRU5ERU5DSUVTXzEpCitwa2JlbmNoX1NPVVJDRVMgPSBwa2JlbmNoLmMKK3BrYmVuY2hfT0JKRUNUUyA9IHBrYmVuY2guJChPQkpFWFQpCitwa2JlbmNoX0xEQUREID0gJChMREFERCkKK3BrYmVuY2hfREVQRU5ERU5DSUVTID0gLi4vc3JjL2xpYmdjcnlwdC5sYSAkKGFtX19ERVBFTkRFTkNJRVNfMSkKK3ByaW1lX1NPVVJDRVMgPSBwcmltZS5jCitwcmltZV9PQkpFQ1RTID0gcHJpbWUuJChPQkpFWFQpCitwcmltZV9MREFERCA9ICQoTERBREQpCitwcmltZV9ERVBFTkRFTkNJRVMgPSAuLi9zcmMvbGliZ2NyeXB0LmxhICQoYW1fX0RFUEVOREVOQ0lFU18xKQorcHVia2V5X1NPVVJDRVMgPSBwdWJrZXkuYworcHVia2V5X09CSkVDVFMgPSBwdWJrZXkuJChPQkpFWFQpCitwdWJrZXlfTERBREQgPSAkKExEQUREKQorcHVia2V5X0RFUEVOREVOQ0lFUyA9IC4uL3NyYy9saWJnY3J5cHQubGEgJChhbV9fREVQRU5ERU5DSUVTXzEpCityYW5kb21fU09VUkNFUyA9IHJhbmRvbS5jCityYW5kb21fT0JKRUNUUyA9IHJhbmRvbS4kKE9CSkVYVCkKK3JhbmRvbV9MREFERCA9ICQoTERBREQpCityYW5kb21fREVQRU5ERU5DSUVTID0gLi4vc3JjL2xpYmdjcnlwdC5sYSAkKGFtX19ERVBFTkRFTkNJRVNfMSkKK3JlZ2lzdGVyX1NPVVJDRVMgPSByZWdpc3Rlci5jCityZWdpc3Rlcl9PQkpFQ1RTID0gcmVnaXN0ZXIuJChPQkpFWFQpCityZWdpc3Rlcl9MREFERCA9ICQoTERBREQpCityZWdpc3Rlcl9ERVBFTkRFTkNJRVMgPSAuLi9zcmMvbGliZ2NyeXB0LmxhICQoYW1fX0RFUEVOREVOQ0lFU18xKQordF9tcGlfYml0X1NPVVJDRVMgPSB0LW1waS1iaXQuYwordF9tcGlfYml0X09CSkVDVFMgPSB0LW1waS1iaXQuJChPQkpFWFQpCit0X21waV9iaXRfTERBREQgPSAkKExEQUREKQordF9tcGlfYml0X0RFUEVOREVOQ0lFUyA9IC4uL3NyYy9saWJnY3J5cHQubGEgJChhbV9fREVQRU5ERU5DSUVTXzEpCit0ZXN0YXBpX1NPVVJDRVMgPSB0ZXN0YXBpLmMKK3Rlc3RhcGlfT0JKRUNUUyA9IHRlc3RhcGkuJChPQkpFWFQpCit0ZXN0YXBpX0xEQUREID0gJChMREFERCkKK3Rlc3RhcGlfREVQRU5ERU5DSUVTID0gLi4vc3JjL2xpYmdjcnlwdC5sYSAkKGFtX19ERVBFTkRFTkNJRVNfMSkKK3RzZXhwX1NPVVJDRVMgPSB0c2V4cC5jCit0c2V4cF9PQkpFQ1RTID0gdHNleHAuJChPQkpFWFQpCit0c2V4cF9MREFERCA9ICQoTERBREQpCit0c2V4cF9ERVBFTkRFTkNJRVMgPSAuLi9zcmMvbGliZ2NyeXB0LmxhICQoYW1fX0RFUEVOREVOQ0lFU18xKQordmVyc2lvbl9TT1VSQ0VTID0gdmVyc2lvbi5jCit2ZXJzaW9uX09CSkVDVFMgPSB2ZXJzaW9uLiQoT0JKRVhUKQordmVyc2lvbl9MREFERCA9ICQoTERBREQpCit2ZXJzaW9uX0RFUEVOREVOQ0lFUyA9IC4uL3NyYy9saWJnY3J5cHQubGEgJChhbV9fREVQRU5ERU5DSUVTXzEpCitERUZBVUxUX0lOQ0xVREVTID0gLUkuQGFtX19pc3JjQCAtSSQodG9wX2J1aWxkZGlyKQorZGVwY29tcCA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvZGVwY29tcAorYW1fX2RlcGZpbGVzX21heWJlID0gZGVwZmlsZXMKK0NPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgXAorCSQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKK0xUQ09NUElMRSA9ICQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSBcCisJLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpIFwKKwkkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCitDQ0xEID0gJChDQykKK0xJTksgPSAkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgXAorCS0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0xERkxBR1MpIFwKKwkkKExERkxBR1MpIC1vICRACitTT1VSQ0VTID0gYWMuYyBhYy1kYXRhLmMgYWMtc2NoZW1lcy5jIGFlc3dyYXAuYyBiYXNpYy5jIGJlbmNobWFyay5jIFwKKwlmaXBzMTg2LWRzYS5jIGZpcHNkcnYuYyBobWFjLmMga2V5Z2VuLmMga2V5Z3JpcC5jIG1waXRlc3RzLmMgXAorCXBrYmVuY2guYyBwcmltZS5jIHB1YmtleS5jIHJhbmRvbS5jIHJlZ2lzdGVyLmMgdC1tcGktYml0LmMgXAorCXRlc3RhcGkuYyB0c2V4cC5jIHZlcnNpb24uYworRElTVF9TT1VSQ0VTID0gYWMuYyBhYy1kYXRhLmMgYWMtc2NoZW1lcy5jIGFlc3dyYXAuYyBiYXNpYy5jIFwKKwliZW5jaG1hcmsuYyBmaXBzMTg2LWRzYS5jIGZpcHNkcnYuYyBobWFjLmMga2V5Z2VuLmMga2V5Z3JpcC5jIFwKKwltcGl0ZXN0cy5jIHBrYmVuY2guYyBwcmltZS5jIHB1YmtleS5jIHJhbmRvbS5jIHJlZ2lzdGVyLmMgXAorCXQtbXBpLWJpdC5jIHRlc3RhcGkuYyB0c2V4cC5jIHZlcnNpb24uYworRVRBR1MgPSBldGFncworQ1RBR1MgPSBjdGFncworRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FNVEFSID0gQEFNVEFSQAorQVIgPSBAQVJACitBUyA9IEBBU0AKK0FVVE9DT05GID0gQEFVVE9DT05GQAorQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAorQVVUT01BS0UgPSBAQVVUT01BS0VACitBV0sgPSBAQVdLQAorQlVJTERfRklMRVZFUlNJT04gPSBAQlVJTERfRklMRVZFUlNJT05ACitCVUlMRF9SRVZJU0lPTiA9IEBCVUlMRF9SRVZJU0lPTkAKK0JVSUxEX1RJTUVTVEFNUCA9IEBCVUlMRF9USU1FU1RBTVBACitDQyA9IEBDQ0AKK0NDQVMgPSBAQ0NBU0AKK0NDQVNERVBNT0RFID0gQENDQVNERVBNT0RFQAorQ0NBU0ZMQUdTID0gQENDQVNGTEFHU0AKK0NDREVQTU9ERSA9IEBDQ0RFUE1PREVACitDRkxBR1MgPSBAQ0ZMQUdTQAorQ1BQID0gQENQUEAKK0NQUEZMQUdTID0gQENQUEZMQUdTQAorQ1hYID0gQENYWEAKK0NYWENQUCA9IEBDWFhDUFBACitDWFhERVBNT0RFID0gQENYWERFUE1PREVACitDWFhGTEFHUyA9IEBDWFhGTEFHU0AKK0NZR1BBVEhfVyA9IEBDWUdQQVRIX1dACitERUZTID0gQERFRlNACitERVBESVIgPSBAREVQRElSQAorRExMVE9PTCA9IEBETExUT09MQAorRExfTElCUyA9IEBETF9MSUJTQAorRUNITyA9IEBFQ0hPQAorRUNIT19DID0gQEVDSE9fQ0AKK0VDSE9fTiA9IEBFQ0hPX05ACitFQ0hPX1QgPSBARUNIT19UQAorRUdSRVAgPSBARUdSRVBACitFWEVFWFQgPSBARVhFRVhUQAorRjc3ID0gQEY3N0AKK0ZBTExCQUNLX1NPQ0tMRU5fVCA9IEBGQUxMQkFDS19TT0NLTEVOX1RACitGRkxBR1MgPSBARkZMQUdTQAorR0NSWVBUX0NJUEhFUlMgPSBAR0NSWVBUX0NJUEhFUlNACitHQ1JZUFRfRElHRVNUUyA9IEBHQ1JZUFRfRElHRVNUU0AKK0dDUllQVF9QVUJLRVlfQ0lQSEVSUyA9IEBHQ1JZUFRfUFVCS0VZX0NJUEhFUlNACitHQ1JZUFRfUkFORE9NID0gQEdDUllQVF9SQU5ET01ACitHUEdfRVJST1JfQ0ZMQUdTID0gQEdQR19FUlJPUl9DRkxBR1NACitHUEdfRVJST1JfQ09ORklHID0gQEdQR19FUlJPUl9DT05GSUdACitHUEdfRVJST1JfTElCUyA9IEBHUEdfRVJST1JfTElCU0AKK0dSRVAgPSBAR1JFUEAKK0lOU1RBTEwgPSBASU5TVEFMTEAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitJTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAorSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACitJTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAorTERGTEFHUyA9IEBMREZMQUdTQAorTElCR0NSWVBUX0NJUEhFUlMgPSBATElCR0NSWVBUX0NJUEhFUlNACitMSUJHQ1JZUFRfQ09ORklHX0FQSV9WRVJTSU9OID0gQExJQkdDUllQVF9DT05GSUdfQVBJX1ZFUlNJT05ACitMSUJHQ1JZUFRfQ09ORklHX0NGTEFHUyA9IEBMSUJHQ1JZUFRfQ09ORklHX0NGTEFHU0AKK0xJQkdDUllQVF9DT05GSUdfTElCUyA9IEBMSUJHQ1JZUFRfQ09ORklHX0xJQlNACitMSUJHQ1JZUFRfRElHRVNUUyA9IEBMSUJHQ1JZUFRfRElHRVNUU0AKK0xJQkdDUllQVF9MVF9BR0UgPSBATElCR0NSWVBUX0xUX0FHRUAKK0xJQkdDUllQVF9MVF9DVVJSRU5UID0gQExJQkdDUllQVF9MVF9DVVJSRU5UQAorTElCR0NSWVBUX0xUX1JFVklTSU9OID0gQExJQkdDUllQVF9MVF9SRVZJU0lPTkAKK0xJQkdDUllQVF9QVUJLRVlfQ0lQSEVSUyA9IEBMSUJHQ1JZUFRfUFVCS0VZX0NJUEhFUlNACitMSUJHQ1JZUFRfVEhSRUFEX01PRFVMRVMgPSBATElCR0NSWVBUX1RIUkVBRF9NT0RVTEVTQAorTElCT0JKUyA9IEBMSUJPQkpTQAorTElCUyA9IEBMSUJTQAorTElCVE9PTCA9IEBMSUJUT09MQAorTE5fUyA9IEBMTl9TQAorTFRMSUJPQkpTID0gQExUTElCT0JKU0AKK01BSU5UID0gQE1BSU5UQAorTUFLRUlORk8gPSBATUFLRUlORk9ACitNS0RJUl9QID0gQE1LRElSX1BACitNUElfU0ZMQUdTID0gQE1QSV9TRkxBR1NACitOT0VYRUNTVEFDS19GTEFHUyA9IEBOT0VYRUNTVEFDS19GTEFHU0AKK09CSkRVTVAgPSBAT0JKRFVNUEAKK09CSkVYVCA9IEBPQkpFWFRACitQQUNLQUdFID0gQFBBQ0tBR0VACitQQUNLQUdFX0JVR1JFUE9SVCA9IEBQQUNLQUdFX0JVR1JFUE9SVEAKK1BBQ0tBR0VfTkFNRSA9IEBQQUNLQUdFX05BTUVACitQQUNLQUdFX1NUUklORyA9IEBQQUNLQUdFX1NUUklOR0AKK1BBQ0tBR0VfVEFSTkFNRSA9IEBQQUNLQUdFX1RBUk5BTUVACitQQUNLQUdFX1VSTCA9IEBQQUNLQUdFX1VSTEAKK1BBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACitQQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKK1BUSF9DRkxBR1MgPSBAUFRIX0NGTEFHU0AKK1BUSF9DT05GSUcgPSBAUFRIX0NPTkZJR0AKK1BUSF9MSUJTID0gQFBUSF9MSUJTQAorUkFOTElCID0gQFJBTkxJQkAKK1JDID0gQFJDQAorU0VUX01BS0UgPSBAU0VUX01BS0VACitTSEVMTCA9IEBTSEVMTEAKK1NUUklQID0gQFNUUklQQAorU1lTX1NPQ0tFVF9IID0gQFNZU19TT0NLRVRfSEAKK1ZFUlNJT04gPSBAVkVSU0lPTkAKK2Fic19idWlsZGRpciA9IEBhYnNfYnVpbGRkaXJACithYnNfc3JjZGlyID0gQGFic19zcmNkaXJACithYnNfdG9wX2J1aWxkZGlyID0gQGFic190b3BfYnVpbGRkaXJACithYnNfdG9wX3NyY2RpciA9IEBhYnNfdG9wX3NyY2RpckAKK2FjX2N0X0NDID0gQGFjX2N0X0NDQAorYWNfY3RfQ1hYID0gQGFjX2N0X0NYWEAKK2FjX2N0X0Y3NyA9IEBhY19jdF9GNzdACithbV9faW5jbHVkZSA9IEBhbV9faW5jbHVkZUAKK2FtX19sZWFkaW5nX2RvdCA9IEBhbV9fbGVhZGluZ19kb3RACithbV9fcXVvdGUgPSBAYW1fX3F1b3RlQAorYW1fX3RhciA9IEBhbV9fdGFyQAorYW1fX3VudGFyID0gQGFtX191bnRhckAKK2JpbmRpciA9IEBiaW5kaXJACitidWlsZCA9IEBidWlsZEAKK2J1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAorYnVpbGRfY3B1ID0gQGJ1aWxkX2NwdUAKK2J1aWxkX29zID0gQGJ1aWxkX29zQAorYnVpbGRfdmVuZG9yID0gQGJ1aWxkX3ZlbmRvckAKK2J1aWxkZGlyID0gQGJ1aWxkZGlyQAorZGF0YWRpciA9IEBkYXRhZGlyQAorZGF0YXJvb3RkaXIgPSBAZGF0YXJvb3RkaXJACitkb2NkaXIgPSBAZG9jZGlyQAorZHZpZGlyID0gQGR2aWRpckAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAoraG9zdCA9IEBob3N0QAoraG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAoraG9zdF9jcHUgPSBAaG9zdF9jcHVACitob3N0X29zID0gQGhvc3Rfb3NACitob3N0X3ZlbmRvciA9IEBob3N0X3ZlbmRvckAKK2h0bWxkaXIgPSBAaHRtbGRpckAKK2luY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKK2luZm9kaXIgPSBAaW5mb2RpckAKK2luc3RhbGxfc2ggPSBAaW5zdGFsbF9zaEAKK2xpYmRpciA9IEBsaWJkaXJACitsaWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACitsb2NhbGVkaXIgPSBAbG9jYWxlZGlyQAorbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAorbWFuZGlyID0gQG1hbmRpckAKK21rZGlyX3AgPSBAbWtkaXJfcEAKK29sZGluY2x1ZGVkaXIgPSBAb2xkaW5jbHVkZWRpckAKK3BkZmRpciA9IEBwZGZkaXJACitwcmVmaXggPSBAcHJlZml4QAorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAorcHNkaXIgPSBAcHNkaXJACitzYmluZGlyID0gQHNiaW5kaXJACitzaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKK3NyY2RpciA9IEBzcmNkaXJACitzeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAordG9wX2J1aWxkX3ByZWZpeCA9IEB0b3BfYnVpbGRfcHJlZml4QAordG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKKworIyBOZWVkIHRvIGluY2x1ZGUgLi4vc3JjIGluIGFkZGl0aW9uIHRvIHRvcF9zcmNkaXIgYmVjYXVzZSBnY3J5cHQuaCBpcworIyBhIGJ1aWx0IGhlYWRlci4KK0FNX0NQUEZMQUdTID0gLUkuLi9zcmMgLUkkKHRvcF9zcmNkaXIpL3NyYworQU1fQ0ZMQUdTID0gJChHUEdfRVJST1JfQ0ZMQUdTKQorTERBREQgPSAuLi9zcmMvbGliZ2NyeXB0LmxhICQoRExfTElCUykKK0VYVFJBX0RJU1QgPSBSRUFETUUgcnNhLTE2ay5rZXkgY2F2c190ZXN0cy5zaCBjYXZzX2RyaXZlci5wbAorYWxsOiBhbGwtYW0KKworLlNVRkZJWEVTOgorLlNVRkZJWEVTOiAuYyAubG8gLm8gLm9iagorJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJQGZvciBkZXAgaW4gJD87IGRvIFwKKwkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAorCSAgICAqJCRkZXAqKSBcCisJICAgICAgKCBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2ggKSBcCisJICAgICAgICAmJiB7IGlmIHRlc3QgLWYgJEA7IHRoZW4gZXhpdCAwOyBlbHNlIGJyZWFrOyBmaTsgfTsgXAorCSAgICAgIGV4aXQgMTs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUgIHRlc3RzL01ha2VmaWxlJzsgXAorCWNkICQodG9wX3NyY2RpcikgJiYgXAorCSAgJChBVVRPTUFLRSkgLS1nbnUgIHRlc3RzL01ha2VmaWxlCisuUFJFQ0lPVVM6IE1ha2VmaWxlCitNYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJQGNhc2UgJyQ/JyBpbiBcCisJICAqY29uZmlnLnN0YXR1cyopIFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoOzsgXAorCSAgKikgXAorCSAgICBlY2hvICcgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpJzsgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSk7OyBcCisJZXNhYzsKKworJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXM6ICQodG9wX3NyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCisKKyQodG9wX3NyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorJChBQ0xPQ0FMX000KTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19hY2xvY2FsX200X2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCisKK2NsZWFuLW5vaW5zdFBST0dSQU1TOgorCUBsaXN0PSckKG5vaW5zdF9QUk9HUkFNUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGY9YGVjaG8gJCRwfHNlZCAncy8kKEVYRUVYVCkkJC8vJ2A7IFwKKwkgIGVjaG8gIiBybSAtZiAkJHAgJCRmIjsgXAorCSAgcm0gLWYgJCRwICQkZiA7IFwKKwlkb25lCithYyQoRVhFRVhUKTogJChhY19PQkpFQ1RTKSAkKGFjX0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIGFjJChFWEVFWFQpCisJJChMSU5LKSAkKGFjX09CSkVDVFMpICQoYWNfTERBREQpICQoTElCUykKK2FjLWRhdGEkKEVYRUVYVCk6ICQoYWNfZGF0YV9PQkpFQ1RTKSAkKGFjX2RhdGFfREVQRU5ERU5DSUVTKSAKKwlAcm0gLWYgYWMtZGF0YSQoRVhFRVhUKQorCSQoTElOSykgJChhY19kYXRhX09CSkVDVFMpICQoYWNfZGF0YV9MREFERCkgJChMSUJTKQorYWMtc2NoZW1lcyQoRVhFRVhUKTogJChhY19zY2hlbWVzX09CSkVDVFMpICQoYWNfc2NoZW1lc19ERVBFTkRFTkNJRVMpIAorCUBybSAtZiBhYy1zY2hlbWVzJChFWEVFWFQpCisJJChMSU5LKSAkKGFjX3NjaGVtZXNfT0JKRUNUUykgJChhY19zY2hlbWVzX0xEQUREKSAkKExJQlMpCithZXN3cmFwJChFWEVFWFQpOiAkKGFlc3dyYXBfT0JKRUNUUykgJChhZXN3cmFwX0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIGFlc3dyYXAkKEVYRUVYVCkKKwkkKExJTkspICQoYWVzd3JhcF9PQkpFQ1RTKSAkKGFlc3dyYXBfTERBREQpICQoTElCUykKK2Jhc2ljJChFWEVFWFQpOiAkKGJhc2ljX09CSkVDVFMpICQoYmFzaWNfREVQRU5ERU5DSUVTKSAKKwlAcm0gLWYgYmFzaWMkKEVYRUVYVCkKKwkkKExJTkspICQoYmFzaWNfT0JKRUNUUykgJChiYXNpY19MREFERCkgJChMSUJTKQorYmVuY2htYXJrJChFWEVFWFQpOiAkKGJlbmNobWFya19PQkpFQ1RTKSAkKGJlbmNobWFya19ERVBFTkRFTkNJRVMpIAorCUBybSAtZiBiZW5jaG1hcmskKEVYRUVYVCkKKwkkKExJTkspICQoYmVuY2htYXJrX09CSkVDVFMpICQoYmVuY2htYXJrX0xEQUREKSAkKExJQlMpCitmaXBzMTg2LWRzYSQoRVhFRVhUKTogJChmaXBzMTg2X2RzYV9PQkpFQ1RTKSAkKGZpcHMxODZfZHNhX0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIGZpcHMxODYtZHNhJChFWEVFWFQpCisJJChMSU5LKSAkKGZpcHMxODZfZHNhX09CSkVDVFMpICQoZmlwczE4Nl9kc2FfTERBREQpICQoTElCUykKK2ZpcHNkcnYkKEVYRUVYVCk6ICQoZmlwc2Rydl9PQkpFQ1RTKSAkKGZpcHNkcnZfREVQRU5ERU5DSUVTKSAKKwlAcm0gLWYgZmlwc2RydiQoRVhFRVhUKQorCSQoTElOSykgJChmaXBzZHJ2X09CSkVDVFMpICQoZmlwc2Rydl9MREFERCkgJChMSUJTKQoraG1hYyQoRVhFRVhUKTogJChobWFjX09CSkVDVFMpICQoaG1hY19ERVBFTkRFTkNJRVMpIAorCUBybSAtZiBobWFjJChFWEVFWFQpCisJJChMSU5LKSAkKGhtYWNfT0JKRUNUUykgJChobWFjX0xEQUREKSAkKExJQlMpCitrZXlnZW4kKEVYRUVYVCk6ICQoa2V5Z2VuX09CSkVDVFMpICQoa2V5Z2VuX0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIGtleWdlbiQoRVhFRVhUKQorCSQoTElOSykgJChrZXlnZW5fT0JKRUNUUykgJChrZXlnZW5fTERBREQpICQoTElCUykKK2tleWdyaXAkKEVYRUVYVCk6ICQoa2V5Z3JpcF9PQkpFQ1RTKSAkKGtleWdyaXBfREVQRU5ERU5DSUVTKSAKKwlAcm0gLWYga2V5Z3JpcCQoRVhFRVhUKQorCSQoTElOSykgJChrZXlncmlwX09CSkVDVFMpICQoa2V5Z3JpcF9MREFERCkgJChMSUJTKQorbXBpdGVzdHMkKEVYRUVYVCk6ICQobXBpdGVzdHNfT0JKRUNUUykgJChtcGl0ZXN0c19ERVBFTkRFTkNJRVMpIAorCUBybSAtZiBtcGl0ZXN0cyQoRVhFRVhUKQorCSQoTElOSykgJChtcGl0ZXN0c19PQkpFQ1RTKSAkKG1waXRlc3RzX0xEQUREKSAkKExJQlMpCitwa2JlbmNoJChFWEVFWFQpOiAkKHBrYmVuY2hfT0JKRUNUUykgJChwa2JlbmNoX0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIHBrYmVuY2gkKEVYRUVYVCkKKwkkKExJTkspICQocGtiZW5jaF9PQkpFQ1RTKSAkKHBrYmVuY2hfTERBREQpICQoTElCUykKK3ByaW1lJChFWEVFWFQpOiAkKHByaW1lX09CSkVDVFMpICQocHJpbWVfREVQRU5ERU5DSUVTKSAKKwlAcm0gLWYgcHJpbWUkKEVYRUVYVCkKKwkkKExJTkspICQocHJpbWVfT0JKRUNUUykgJChwcmltZV9MREFERCkgJChMSUJTKQorcHVia2V5JChFWEVFWFQpOiAkKHB1YmtleV9PQkpFQ1RTKSAkKHB1YmtleV9ERVBFTkRFTkNJRVMpIAorCUBybSAtZiBwdWJrZXkkKEVYRUVYVCkKKwkkKExJTkspICQocHVia2V5X09CSkVDVFMpICQocHVia2V5X0xEQUREKSAkKExJQlMpCityYW5kb20kKEVYRUVYVCk6ICQocmFuZG9tX09CSkVDVFMpICQocmFuZG9tX0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIHJhbmRvbSQoRVhFRVhUKQorCSQoTElOSykgJChyYW5kb21fT0JKRUNUUykgJChyYW5kb21fTERBREQpICQoTElCUykKK3JlZ2lzdGVyJChFWEVFWFQpOiAkKHJlZ2lzdGVyX09CSkVDVFMpICQocmVnaXN0ZXJfREVQRU5ERU5DSUVTKSAKKwlAcm0gLWYgcmVnaXN0ZXIkKEVYRUVYVCkKKwkkKExJTkspICQocmVnaXN0ZXJfT0JKRUNUUykgJChyZWdpc3Rlcl9MREFERCkgJChMSUJTKQordC1tcGktYml0JChFWEVFWFQpOiAkKHRfbXBpX2JpdF9PQkpFQ1RTKSAkKHRfbXBpX2JpdF9ERVBFTkRFTkNJRVMpIAorCUBybSAtZiB0LW1waS1iaXQkKEVYRUVYVCkKKwkkKExJTkspICQodF9tcGlfYml0X09CSkVDVFMpICQodF9tcGlfYml0X0xEQUREKSAkKExJQlMpCit0ZXN0YXBpJChFWEVFWFQpOiAkKHRlc3RhcGlfT0JKRUNUUykgJCh0ZXN0YXBpX0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIHRlc3RhcGkkKEVYRUVYVCkKKwkkKExJTkspICQodGVzdGFwaV9PQkpFQ1RTKSAkKHRlc3RhcGlfTERBREQpICQoTElCUykKK3RzZXhwJChFWEVFWFQpOiAkKHRzZXhwX09CSkVDVFMpICQodHNleHBfREVQRU5ERU5DSUVTKSAKKwlAcm0gLWYgdHNleHAkKEVYRUVYVCkKKwkkKExJTkspICQodHNleHBfT0JKRUNUUykgJCh0c2V4cF9MREFERCkgJChMSUJTKQordmVyc2lvbiQoRVhFRVhUKTogJCh2ZXJzaW9uX09CSkVDVFMpICQodmVyc2lvbl9ERVBFTkRFTkNJRVMpIAorCUBybSAtZiB2ZXJzaW9uJChFWEVFWFQpCisJJChMSU5LKSAkKHZlcnNpb25fT0JKRUNUUykgJCh2ZXJzaW9uX0xEQUREKSAkKExJQlMpCisKK21vc3RseWNsZWFuLWNvbXBpbGU6CisJLXJtIC1mICouJChPQkpFWFQpCisKK2Rpc3RjbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLnRhYi5jCisKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9hYy1kYXRhLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9hYy1zY2hlbWVzLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9hYy5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvYWVzd3JhcC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvYmFzaWMuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2JlbmNobWFyay5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZmlwczE4Ni1kc2EuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2ZpcHNkcnYuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2htYWMuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2tleWdlbi5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikva2V5Z3JpcC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbXBpdGVzdHMuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3BrYmVuY2guUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3ByaW1lLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9wdWJrZXkuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3JhbmRvbS5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcmVnaXN0ZXIuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3QtbXBpLWJpdC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvdGVzdGFwaS5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvdHNleHAuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3ZlcnNpb24uUG9AYW1fX3F1b3RlQAorCisuYy5vOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCAkPAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENPTVBJTEUpIC1jICQ8CisKKy5jLm9iajoKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgYCQoQ1lHUEFUSF9XKSAnJDwnYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENPTVBJTEUpIC1jIGAkKENZR1BBVEhfVykgJyQ8J2AKKworLmMubG86CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKExUQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgJDwKK0BhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBsbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExUQ09NUElMRSkgLWMgLW8gJEAgJDwKKworbW9zdGx5Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgKi5sbworCitjbGVhbi1saWJ0b29sOgorCS1ybSAtcmYgLmxpYnMgX2xpYnMKKworSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApICQoVEFHU19GSUxFUykKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwlta2lkIC1mSUQgJCR1bmlxdWUKK3RhZ3M6IFRBR1MKKworVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwl0YWdzPTsgXAorCWhlcmU9YHB3ZGA7IFwKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCisJICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCisJaWYgdGVzdCAteiAiJChFVEFHU19BUkdTKSQkdGFncyQkdW5pcXVlIjsgdGhlbiA6OyBlbHNlIFwKKwkgIHRlc3QgLW4gIiQkdW5pcXVlIiB8fCB1bmlxdWU9JCRlbXB0eV9maXg7IFwKKwkgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKKwkgICAgJCR0YWdzICQkdW5pcXVlOyBcCisJZmkKK2N0YWdzOiBDVEFHUworQ1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJdGFncz07IFwKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCisJICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCisJdGVzdCAteiAiJChDVEFHU19BUkdTKSQkdGFncyQkdW5pcXVlIiBcCisJICB8fCAkKENUQUdTKSAkKENUQUdTRkxBR1MpICQoQU1fQ1RBR1NGTEFHUykgJChDVEFHU19BUkdTKSBcCisJICAgICAkJHRhZ3MgJCR1bmlxdWUKKworR1RBR1M6CisJaGVyZT1gJChhbV9fY2QpICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKKwkgICYmIGNkICQodG9wX3NyY2RpcikgXAorCSAgJiYgZ3RhZ3MgLWkgJChHVEFHU19BUkdTKSAkJGhlcmUKKworZGlzdGNsZWFuLXRhZ3M6CisJLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRIIHRhZ3MKKworY2hlY2stVEVTVFM6ICQoVEVTVFMpCisJQGZhaWxlZD0wOyBhbGw9MDsgeGZhaWw9MDsgeHBhc3M9MDsgc2tpcD0wOyBcCisJc3JjZGlyPSQoc3JjZGlyKTsgZXhwb3J0IHNyY2RpcjsgXAorCWxpc3Q9JyAkKFRFU1RTKSAnOyBcCisJaWYgdGVzdCAtbiAiJCRsaXN0IjsgdGhlbiBcCisJICBmb3IgdHN0IGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mIC4vJCR0c3Q7IHRoZW4gZGlyPS4vOyBcCisJICAgIGVsaWYgdGVzdCAtZiAkJHRzdDsgdGhlbiBkaXI9OyBcCisJICAgIGVsc2UgZGlyPSIkKHNyY2RpcikvIjsgZmk7IFwKKwkgICAgaWYgJChURVNUU19FTlZJUk9OTUVOVCkgJCR7ZGlyfSQkdHN0OyB0aGVuIFwKKwkgICAgICBhbGw9YGV4cHIgJCRhbGwgKyAxYDsgXAorCSAgICAgIGNhc2UgIiAkKFhGQUlMX1RFU1RTKSAiIGluIFwKKwkgICAgICAqW1wgXAldJCR0c3RbXCBcCV0qKSBcCisJCXhwYXNzPWBleHByICQkeHBhc3MgKyAxYDsgXAorCQlmYWlsZWQ9YGV4cHIgJCRmYWlsZWQgKyAxYDsgXAorCQllY2hvICJYUEFTUzogJCR0c3QiOyBcCisJICAgICAgOzsgXAorCSAgICAgICopIFwKKwkJZWNobyAiUEFTUzogJCR0c3QiOyBcCisJICAgICAgOzsgXAorCSAgICAgIGVzYWM7IFwKKwkgICAgZWxpZiB0ZXN0ICQkPyAtbmUgNzc7IHRoZW4gXAorCSAgICAgIGFsbD1gZXhwciAkJGFsbCArIDFgOyBcCisJICAgICAgY2FzZSAiICQoWEZBSUxfVEVTVFMpICIgaW4gXAorCSAgICAgICpbXCBcCV0kJHRzdFtcIFwJXSopIFwKKwkJeGZhaWw9YGV4cHIgJCR4ZmFpbCArIDFgOyBcCisJCWVjaG8gIlhGQUlMOiAkJHRzdCI7IFwKKwkgICAgICA7OyBcCisJICAgICAgKikgXAorCQlmYWlsZWQ9YGV4cHIgJCRmYWlsZWQgKyAxYDsgXAorCQllY2hvICJGQUlMOiAkJHRzdCI7IFwKKwkgICAgICA7OyBcCisJICAgICAgZXNhYzsgXAorCSAgICBlbHNlIFwKKwkgICAgICBza2lwPWBleHByICQkc2tpcCArIDFgOyBcCisJICAgICAgZWNobyAiU0tJUDogJCR0c3QiOyBcCisJICAgIGZpOyBcCisJICBkb25lOyBcCisJICBpZiB0ZXN0ICIkJGFsbCIgLWVxIDE7IHRoZW4gXAorCSAgICB0ZXN0cz0idGVzdCI7IFwKKwkgICAgQWxsPSIiOyBcCisJICBlbHNlIFwKKwkgICAgdGVzdHM9InRlc3RzIjsgXAorCSAgICBBbGw9IkFsbCAiOyBcCisJICBmaTsgXAorCSAgaWYgdGVzdCAiJCRmYWlsZWQiIC1lcSAwOyB0aGVuIFwKKwkgICAgaWYgdGVzdCAiJCR4ZmFpbCIgLWVxIDA7IHRoZW4gXAorCSAgICAgIGJhbm5lcj0iJCRBbGwkJGFsbCAkJHRlc3RzIHBhc3NlZCI7IFwKKwkgICAgZWxzZSBcCisJICAgICAgaWYgdGVzdCAiJCR4ZmFpbCIgLWVxIDE7IHRoZW4gZmFpbHVyZXM9ZmFpbHVyZTsgZWxzZSBmYWlsdXJlcz1mYWlsdXJlczsgZmk7IFwKKwkgICAgICBiYW5uZXI9IiQkQWxsJCRhbGwgJCR0ZXN0cyBiZWhhdmVkIGFzIGV4cGVjdGVkICgkJHhmYWlsIGV4cGVjdGVkICQkZmFpbHVyZXMpIjsgXAorCSAgICBmaTsgXAorCSAgZWxzZSBcCisJICAgIGlmIHRlc3QgIiQkeHBhc3MiIC1lcSAwOyB0aGVuIFwKKwkgICAgICBiYW5uZXI9IiQkZmFpbGVkIG9mICQkYWxsICQkdGVzdHMgZmFpbGVkIjsgXAorCSAgICBlbHNlIFwKKwkgICAgICBpZiB0ZXN0ICIkJHhwYXNzIiAtZXEgMTsgdGhlbiBwYXNzZXM9cGFzczsgZWxzZSBwYXNzZXM9cGFzc2VzOyBmaTsgXAorCSAgICAgIGJhbm5lcj0iJCRmYWlsZWQgb2YgJCRhbGwgJCR0ZXN0cyBkaWQgbm90IGJlaGF2ZSBhcyBleHBlY3RlZCAoJCR4cGFzcyB1bmV4cGVjdGVkICQkcGFzc2VzKSI7IFwKKwkgICAgZmk7IFwKKwkgIGZpOyBcCisJICBkYXNoZXM9IiQkYmFubmVyIjsgXAorCSAgc2tpcHBlZD0iIjsgXAorCSAgaWYgdGVzdCAiJCRza2lwIiAtbmUgMDsgdGhlbiBcCisJICAgIGlmIHRlc3QgIiQkc2tpcCIgLWVxIDE7IHRoZW4gXAorCSAgICAgIHNraXBwZWQ9IigkJHNraXAgdGVzdCB3YXMgbm90IHJ1bikiOyBcCisJICAgIGVsc2UgXAorCSAgICAgIHNraXBwZWQ9IigkJHNraXAgdGVzdHMgd2VyZSBub3QgcnVuKSI7IFwKKwkgICAgZmk7IFwKKwkgICAgdGVzdCBgZWNobyAiJCRza2lwcGVkIiB8IHdjIC1jYCAtbGUgYGVjaG8gIiQkYmFubmVyIiB8IHdjIC1jYCB8fCBcCisJICAgICAgZGFzaGVzPSIkJHNraXBwZWQiOyBcCisJICBmaTsgXAorCSAgcmVwb3J0PSIiOyBcCisJICBpZiB0ZXN0ICIkJGZhaWxlZCIgLW5lIDAgJiYgdGVzdCAtbiAiJChQQUNLQUdFX0JVR1JFUE9SVCkiOyB0aGVuIFwKKwkgICAgcmVwb3J0PSJQbGVhc2UgcmVwb3J0IHRvICQoUEFDS0FHRV9CVUdSRVBPUlQpIjsgXAorCSAgICB0ZXN0IGBlY2hvICIkJHJlcG9ydCIgfCB3YyAtY2AgLWxlIGBlY2hvICIkJGJhbm5lciIgfCB3YyAtY2AgfHwgXAorCSAgICAgIGRhc2hlcz0iJCRyZXBvcnQiOyBcCisJICBmaTsgXAorCSAgZGFzaGVzPWBlY2hvICIkJGRhc2hlcyIgfCBzZWQgcy8uLz0vZ2A7IFwKKwkgIGVjaG8gIiQkZGFzaGVzIjsgXAorCSAgZWNobyAiJCRiYW5uZXIiOyBcCisJICB0ZXN0IC16ICIkJHNraXBwZWQiIHx8IGVjaG8gIiQkc2tpcHBlZCI7IFwKKwkgIHRlc3QgLXogIiQkcmVwb3J0IiB8fCBlY2hvICIkJHJlcG9ydCI7IFwKKwkgIGVjaG8gIiQkZGFzaGVzIjsgXAorCSAgdGVzdCAiJCRmYWlsZWQiIC1lcSAwOyBcCisJZWxzZSA6OyBmaQorCitkaXN0ZGlyOiAkKERJU1RGSUxFUykKKwlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJdG9wc3JjZGlyc3RyaXA9YGVjaG8gIiQodG9wX3NyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCWxpc3Q9JyQoRElTVEZJTEVTKSc7IFwKKwkgIGRpc3RfZmlsZXM9YGZvciBmaWxlIGluICQkbGlzdDsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBcCisJICBzZWQgLWUgInN8XiQkc3JjZGlyc3RyaXAvfHw7dCIgXAorCSAgICAgIC1lICJzfF4kJHRvcHNyY2RpcnN0cmlwL3wkKHRvcF9idWlsZGRpcikvfDt0ImA7IFwKKwljYXNlICQkZGlzdF9maWxlcyBpbiBcCisJICAqLyopICQoTUtESVJfUCkgYGVjaG8gIiQkZGlzdF9maWxlcyIgfCBcCisJCQkgICBzZWQgJy9cLy8hZDtzfF58JChkaXN0ZGlyKS98O3MsL1teL10qJCQsLCcgfCBcCisJCQkgICBzb3J0IC11YCA7OyBcCisJZXNhYzsgXAorCWZvciBmaWxlIGluICQkZGlzdF9maWxlczsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJGZpbGUgfHwgdGVzdCAtZCAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAorCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKKwkgICAgZGlyPWBlY2hvICIvJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKKwkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCisJICAgICAgY3AgLXBSICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKSQkZGlyIHx8IGV4aXQgMTsgXAorCSAgICBmaTsgXAorCSAgICBjcCAtcFIgJCRkLyQkZmlsZSAkKGRpc3RkaXIpJCRkaXIgfHwgZXhpdCAxOyBcCisJICBlbHNlIFwKKwkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorY2hlY2stYW06IGFsbC1hbQorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGNoZWNrLVRFU1RTCitjaGVjazogY2hlY2stYW0KK2FsbC1hbTogTWFrZWZpbGUgJChQUk9HUkFNUykKK2luc3RhbGxkaXJzOgoraW5zdGFsbDogaW5zdGFsbC1hbQoraW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtYW0KK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLWFtCit1bmluc3RhbGw6IHVuaW5zdGFsbC1hbQorCitpbnN0YWxsLWFtOiBhbGwtYW0KKwlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQorCitpbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1hbQoraW5zdGFsbC1zdHJpcDoKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCisJICBgdGVzdCAteiAnJChTVFJJUCknIHx8IFwKKwkgICAgZWNobyAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyJgIGluc3RhbGwKK21vc3RseWNsZWFuLWdlbmVyaWM6CisKK2NsZWFuLWdlbmVyaWM6CisKK2Rpc3RjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQorCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6CisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKK2NsZWFuOiBjbGVhbi1hbQorCitjbGVhbi1hbTogY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIGNsZWFuLW5vaW5zdFBST0dSQU1TIFwKKwltb3N0bHljbGVhbi1hbQorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQorCS1ybSAtcmYgLi8kKERFUERJUikKKwktcm0gLWYgTWFrZWZpbGUKK2Rpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWdlbmVyaWMgXAorCWRpc3RjbGVhbi10YWdzCisKK2R2aTogZHZpLWFtCisKK2R2aS1hbToKKworaHRtbDogaHRtbC1hbQorCitpbmZvOiBpbmZvLWFtCisKK2luZm8tYW06CisKK2luc3RhbGwtZGF0YS1hbToKKworaW5zdGFsbC1kdmk6IGluc3RhbGwtZHZpLWFtCisKK2luc3RhbGwtZXhlYy1hbToKKworaW5zdGFsbC1odG1sOiBpbnN0YWxsLWh0bWwtYW0KKworaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KKworaW5zdGFsbC1tYW46CisKK2luc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1hbQorCitpbnN0YWxsLXBzOiBpbnN0YWxsLXBzLWFtCisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQorCS1ybSAtcmYgLi8kKERFUERJUikKKwktcm0gLWYgTWFrZWZpbGUKK21haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCisKK21vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWdlbmVyaWMgXAorCW1vc3RseWNsZWFuLWxpYnRvb2wKKworcGRmOiBwZGYtYW0KKworcGRmLWFtOgorCitwczogcHMtYW0KKworcHMtYW06CisKK3VuaW5zdGFsbC1hbToKKworLk1BS0U6IGluc3RhbGwtYW0gaW5zdGFsbC1zdHJpcAorCisuUEhPTlk6IENUQUdTIEdUQUdTIGFsbCBhbGwtYW0gY2hlY2sgY2hlY2stVEVTVFMgY2hlY2stYW0gY2xlYW4gXAorCWNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBjbGVhbi1ub2luc3RQUk9HUkFNUyBjdGFncyBcCisJZGlzdGNsZWFuIGRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIFwKKwlkaXN0Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tdGFncyBkaXN0ZGlyIGR2aSBkdmktYW0gaHRtbCBcCisJaHRtbC1hbSBpbmZvIGluZm8tYW0gaW5zdGFsbCBpbnN0YWxsLWFtIGluc3RhbGwtZGF0YSBcCisJaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZHZpIGluc3RhbGwtZHZpLWFtIGluc3RhbGwtZXhlYyBcCisJaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtaHRtbCBpbnN0YWxsLWh0bWwtYW0gaW5zdGFsbC1pbmZvIFwKKwlpbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1tYW4gaW5zdGFsbC1wZGYgaW5zdGFsbC1wZGYtYW0gXAorCWluc3RhbGwtcHMgaW5zdGFsbC1wcy1hbSBpbnN0YWxsLXN0cmlwIGluc3RhbGxjaGVjayBcCisJaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIG1haW50YWluZXItY2xlYW4gXAorCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBtb3N0bHljbGVhbi1jb21waWxlIFwKKwltb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wgcGRmIHBkZi1hbSBwcyBwcy1hbSBcCisJdGFncyB1bmluc3RhbGwgdW5pbnN0YWxsLWFtCisKKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi90ZXN0cy9SRUFETUUgYi9saWJnY3J5cHQtMS40LjYvdGVzdHMvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMjY4OTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvdGVzdHMvUkVBRE1FCkBAIC0wLDAgKzEsOSBAQAorU29tZSBub3RlcyBhYm91dCB0aGUgdGVzdHMuCisKK3JzYS0xNmsua2V5IC0gQSAxNjM4NCBiaXQgUlNBIGtleSAocHVibGljIGFuZCBwcml2YXQpLCBjcmVhdGVkIDIwMDgtMDgtMjguCisgICAgICAgICAgICAgIEl0IHRvb2sgOTEgbWludXRlcyB0byBjcmVhdGUgaXQgb24gYSAxNTAwTWh6IFBlbnRpdW0gTS4KKyAgICAgICAgICAgICAgcGtwZW5jaCBzaG93ZWQgdGhlc2UgcmVzdWx0czoKKyAgICAgICAgICAgICAgICBlbmNyeXB0OiAgICA4MCBtcworICAgICAgICAgICAgICAgIGRlY3J5cHQ6IDE0MzcwIG1zCisgICAgICAgICAgICAgICAgICAgc2lnbjogMTQxMTAgbXMKKyAgICAgICAgICAgICAgICAgdmVyaWZ5OiAgICAzMCBtcwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L3Rlc3RzL2FjLWRhdGEuYyBiL2xpYmdjcnlwdC0xLjQuNi90ZXN0cy9hYy1kYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk3YjRmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi90ZXN0cy9hYy1kYXRhLmMKQEAgLTAsMCArMSwyMDggQEAKKy8qIGFjLWRhdGEuYyAtIFB1YmxpYyBrZXkgZW5jcnlwdGlvbi9kZWNyeXB0aW9uIHRlc3RzCisgKglDb3B5cmlnaHQgKEMpIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisjZGVmaW5lIGFzc2VydF9lcnIoZXJyKSBcCisgIGRvIFwKKyAgICBpZiAoZXJyKSBcCisgICAgICB7IFwKKyAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3Igb2NjdXJlZCBhdCBsaW5lICVpOiAlc1xuIiwgXAorICAgICAgICAgICAgICAgICBfX0xJTkVfXywgZ2NyeV9zdHJlcnJvciAoZXJyKSk7IFwKKyAgICAgICAgZXhpdCAoMSk7IFwKKyAgICAgIH0gXAorICB3aGlsZSAoMCkKKworI2luY2x1ZGUgIi4uL3NyYy9nY3J5cHQuaCIKKworc3RhdGljIGludCB2ZXJib3NlOworCitzdGF0aWMgdm9pZAorZGllIChjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKyAgdmFfbGlzdCBhcmdfcHRyIDsKKworICB2YV9zdGFydCggYXJnX3B0ciwgZm9ybWF0ICkgOworICB2ZnByaW50ZiAoc3RkZXJyLCBmb3JtYXQsIGFyZ19wdHIgKTsKKyAgdmFfZW5kKGFyZ19wdHIpOworICBleGl0ICgxKTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX3NleHBfY29udmVyc2lvbiAoZ2NyeV9hY19kYXRhX3QgZGF0YSwgY29uc3QgY2hhciAqKmlkZW50aWZpZXJzKQoreworICBnY3J5X2FjX2RhdGFfdCBkYXRhMjsKKyAgZ2NyeV9lcnJvcl90IGVycjsKKyAgZ2NyeV9zZXhwX3Qgc2V4cDsKKyAgdW5zaWduZWQgaW50IGk7CisgIGNvbnN0IGNoYXIgKmxhYmVsMSwgKmxhYmVsMjsKKyAgZ2NyeV9tcGlfdCBtcGkxLCBtcGkyOworICBzaXplX3QgbGVuZ3RoMSwgbGVuZ3RoMjsKKworICBlcnIgPSBnY3J5X2FjX2RhdGFfdG9fc2V4cCAoZGF0YSwgJnNleHAsIGlkZW50aWZpZXJzKTsKKyAgYXNzZXJ0X2VyciAoZXJyKTsKKyAgaWYgKHZlcmJvc2UpCisgICAgZ2NyeV9zZXhwX2R1bXAgKHNleHApOworICBlcnIgPSBnY3J5X2FjX2RhdGFfZnJvbV9zZXhwICgmZGF0YTIsIHNleHAsIGlkZW50aWZpZXJzKTsKKyAgYXNzZXJ0X2VyciAoZXJyKTsKKworICBsZW5ndGgxID0gZ2NyeV9hY19kYXRhX2xlbmd0aCAoZGF0YSk7CisgIGxlbmd0aDIgPSBnY3J5X2FjX2RhdGFfbGVuZ3RoIChkYXRhMik7CisgIGFzc2VydCAobGVuZ3RoMSA9PSBsZW5ndGgyKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoMTsgaSsrKQorICAgIHsKKyAgICAgIGVyciA9IGdjcnlfYWNfZGF0YV9nZXRfaW5kZXggKGRhdGEsIDAsIGksICZsYWJlbDEsICZtcGkxKTsKKyAgICAgIGFzc2VydF9lcnIgKGVycik7CisgICAgICBlcnIgPSBnY3J5X2FjX2RhdGFfZ2V0X2luZGV4IChkYXRhMiwgMCwgaSwgJmxhYmVsMiwgJm1waTIpOworICAgICAgYXNzZXJ0X2VyciAoZXJyKTsKKyAgICAgIGlmICh2ZXJib3NlKQorICAgICAgICB7CisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiTGFiZWwxPWAlcydcbiIsIGxhYmVsMSk7CisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiTGFiZWwyPWAlcydcbiIsIGxhYmVsMik7CisgICAgICAgIH0KKyAgICAgIGFzc2VydCAoISBzdHJjbXAgKGxhYmVsMSwgbGFiZWwyKSk7CisgICAgICBhc3NlcnQgKCEgZ2NyeV9tcGlfY21wIChtcGkxLCBtcGkyKSk7CisgICAgfQorCisgIGdjcnlfYWNfZGF0YV9kZXN0cm95IChkYXRhMik7CisgIGdjcnlfc2V4cF9yZWxlYXNlIChzZXhwKTsKK30KKwordm9pZAorY2hlY2tfcnVuICh2b2lkKQoreworICBjb25zdCBjaGFyICppZGVudGlmaWVyc1tdID0geyAiZm9vIiwKKwkJCQkiYmFyIiwKKwkJCQkiYmF6IiwKKwkJCQkiaGVsbG8iLAorCQkJCSJzb21lbW9yZXRleHRoZXJlIiwKKwkJCQkiYmxhaGJsYWhibGFoIiwKKwkJCQlOVUxMIH07CisgIGNvbnN0IGNoYXIgKmlkZW50aWZpZXJzX251bGxbXSA9IHsgTlVMTCB9OworICBnY3J5X2FjX2RhdGFfdCBkYXRhOworICBnY3J5X2Vycm9yX3QgZXJyOworICBjb25zdCBjaGFyICpsYWJlbDA7CisgIGNvbnN0IGNoYXIgKmxhYmVsMTsKKyAgZ2NyeV9tcGlfdCBtcGkwOworICBnY3J5X21waV90IG1waTE7CisgIGdjcnlfbXBpX3QgbXBpMjsKKworICAvKiBJbml0aWFsaXplIHZhbHVlcy4gICovCisKKyAgbGFiZWwwID0gInRoaXNpc3JlYWxseWxvbmdsYWJlbGJ1dHNpbmNldGhlcmVpc25vbGltaXRhdGlvbm9udGhlbGVuZ3Rob2ZsYWJlbHNpdHNob3VsZHdvcmtqdXN0ZmluZSI7CisgIG1waTAgPSBnY3J5X21waV9uZXcgKDApOworICBhc3NlcnQgKG1waTApOworICBnY3J5X21waV9zZXRfdWkgKG1waTAsIDEyMzQ1Nik7CisKKyAgZXJyID0gZ2NyeV9hY19kYXRhX25ldyAoJmRhdGEpOworICBhc3NlcnRfZXJyIChlcnIpOworCisgIGNoZWNrX3NleHBfY29udmVyc2lvbiAoZGF0YSwgaWRlbnRpZmllcnMpOworICBjaGVja19zZXhwX2NvbnZlcnNpb24gKGRhdGEsIGlkZW50aWZpZXJzX251bGwpOworICBjaGVja19zZXhwX2NvbnZlcnNpb24gKGRhdGEsIE5VTEwpOworCisgIGVyciA9IGdjcnlfYWNfZGF0YV9zZXQgKGRhdGEsIDAsIGxhYmVsMCwgbXBpMCk7CisgIGFzc2VydF9lcnIgKGVycik7CisgIGVyciA9IGdjcnlfYWNfZGF0YV9nZXRfaW5kZXggKGRhdGEsIDAsIDAsICZsYWJlbDEsICZtcGkxKTsKKyAgYXNzZXJ0X2VyciAoZXJyKTsKKyAgYXNzZXJ0IChsYWJlbDAgPT0gbGFiZWwxKTsKKyAgYXNzZXJ0IChtcGkwID09IG1waTEpOworICBjaGVja19zZXhwX2NvbnZlcnNpb24gKGRhdGEsIGlkZW50aWZpZXJzKTsKKyAgY2hlY2tfc2V4cF9jb252ZXJzaW9uIChkYXRhLCBpZGVudGlmaWVyc19udWxsKTsKKyAgY2hlY2tfc2V4cF9jb252ZXJzaW9uIChkYXRhLCBOVUxMKTsKKworICBpZiAodmVyYm9zZSkKKyAgICBwcmludGYgKCJkYXRhLXNldC10ZXN0LTAgc3VjY2VlZGVkXG4iKTsKKworICBnY3J5X2FjX2RhdGFfY2xlYXIgKGRhdGEpOworCisgIGVyciA9IGdjcnlfYWNfZGF0YV9zZXQgKGRhdGEsIEdDUllfQUNfRkxBR19DT1BZLCBsYWJlbDAsIG1waTApOworICBhc3NlcnRfZXJyIChlcnIpOworCisgIGVyciA9IGdjcnlfYWNfZGF0YV9zZXQgKGRhdGEsIEdDUllfQUNfRkxBR19DT1BZLCAiZm9vIiwgbXBpMCk7CisgIGFzc2VydF9lcnIgKGVycik7CisgIGVyciA9IGdjcnlfYWNfZGF0YV9zZXQgKGRhdGEsIEdDUllfQUNfRkxBR19DT1BZLCAiZm9vIiwgbXBpMCk7CisgIGFzc2VydF9lcnIgKGVycik7CisgIGVyciA9IGdjcnlfYWNfZGF0YV9zZXQgKGRhdGEsIEdDUllfQUNfRkxBR19DT1BZLCAiYmFyIiwgbXBpMCk7CisgIGFzc2VydF9lcnIgKGVycik7CisgIGVyciA9IGdjcnlfYWNfZGF0YV9zZXQgKGRhdGEsIEdDUllfQUNfRkxBR19DT1BZLCAiYmxhaDEiLCBtcGkwKTsKKyAgYXNzZXJ0X2VyciAoZXJyKTsKKyAgY2hlY2tfc2V4cF9jb252ZXJzaW9uIChkYXRhLCBpZGVudGlmaWVycyk7CisgIGNoZWNrX3NleHBfY29udmVyc2lvbiAoZGF0YSwgaWRlbnRpZmllcnNfbnVsbCk7CisgIGNoZWNrX3NleHBfY29udmVyc2lvbiAoZGF0YSwgTlVMTCk7CisKKyAgZXJyID0gZ2NyeV9hY19kYXRhX2dldF9uYW1lIChkYXRhLCAwLCBsYWJlbDAsICZtcGkxKTsKKyAgYXNzZXJ0X2VyciAoZXJyKTsKKyAgYXNzZXJ0IChtcGkwICE9IG1waTEpOworICBlcnIgPSBnY3J5X2FjX2RhdGFfZ2V0X25hbWUgKGRhdGEsIEdDUllfQUNfRkxBR19DT1BZLCBsYWJlbDAsICZtcGkyKTsKKyAgYXNzZXJ0X2VyciAoZXJyKTsKKyAgYXNzZXJ0IChtcGkwICE9IG1waTEpOworICBhc3NlcnQgKG1waTEgIT0gbXBpMik7CisgIGVyciA9IGdjcnlfYWNfZGF0YV9nZXRfaW5kZXggKGRhdGEsIDAsIDAsICZsYWJlbDEsICZtcGkxKTsKKyAgYXNzZXJ0X2VyciAoZXJyKTsKKyAgZ2NyeV9tcGlfcmVsZWFzZSAobXBpMCk7CisgIGdjcnlfbXBpX3JlbGVhc2UgKG1waTIpOworCisgIGlmICh2ZXJib3NlKQorICAgIHByaW50ZiAoImRhdGEtc2V0LXRlc3QtMSBzdWNjZWVkZWRcbiIpOworCisgIGdjcnlfYWNfZGF0YV9jbGVhciAoZGF0YSk7CisgIGFzc2VydCAoISBnY3J5X2FjX2RhdGFfbGVuZ3RoIChkYXRhKSk7CisgIGNoZWNrX3NleHBfY29udmVyc2lvbiAoZGF0YSwgaWRlbnRpZmllcnMpOworICBjaGVja19zZXhwX2NvbnZlcnNpb24gKGRhdGEsIGlkZW50aWZpZXJzX251bGwpOworICBjaGVja19zZXhwX2NvbnZlcnNpb24gKGRhdGEsIE5VTEwpOworCisgIGlmICh2ZXJib3NlKQorICAgIHByaW50ZiAoImRhdGEtc2V0LXRlc3QtMiBzdWNjZWVkZWRcbiIpOworIAorICBnY3J5X2FjX2RhdGFfZGVzdHJveSAoZGF0YSk7CisgCisKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIGludCBkZWJ1ZyA9IDA7CisgIGludCBpID0gMTsKKworICBpZiAoYXJnYyA+IDEgJiYgIXN0cmNtcCAoYXJndlsxXSwgIi0tdmVyYm9zZSIpKQorICAgIHZlcmJvc2UgPSAxOworICBlbHNlIGlmIChhcmdjID4gMSAmJiAhc3RyY21wIChhcmd2WzFdLCAiLS1kZWJ1ZyIpKQorICAgIHZlcmJvc2UgPSBkZWJ1ZyA9IDE7CisKKyAgZ2NyeV9jb250cm9sIChHQ1JZQ1RMX0RJU0FCTEVfU0VDTUVNLCAwKTsKKyAgaWYgKCFnY3J5X2NoZWNrX3ZlcnNpb24gKEdDUllQVF9WRVJTSU9OKSkKKyAgICBkaWUgKCJ2ZXJzaW9uIG1pc21hdGNoXG4iKTsKKyAgZ2NyeV9jb250cm9sIChHQ1JZQ1RMX0lOSVRJQUxJWkFUSU9OX0ZJTklTSEVELCAwKTsKKyAgaWYgKGRlYnVnKQorICAgIGdjcnlfY29udHJvbCAoR0NSWUNUTF9TRVRfREVCVUdfRkxBR1MsIDF1ICwgMCk7CisKKyAgZm9yICg7IGkgPiAwOyBpLS0pCisgICAgY2hlY2tfcnVuICgpOworICAKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvdGVzdHMvYWMtc2NoZW1lcy5jIGIvbGliZ2NyeXB0LTEuNC42L3Rlc3RzL2FjLXNjaGVtZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2VmMGJmCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L3Rlc3RzL2FjLXNjaGVtZXMuYwpAQCAtMCwwICsxLDM0NyBAQAorLyogYWMtc2NoZW1lcy5jIC0gVGVzdHMgZm9yIEVTL1NTQQorICAgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAgIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICAgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgIi4uL3NyYy9nY3J5cHQuaCIKKworc3RhdGljIHVuc2lnbmVkIGludCB2ZXJib3NlOworCitzdGF0aWMgdm9pZAorZGllIChjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKyAgdmFfbGlzdCBhcmdfcHRyIDsKKworICB2YV9zdGFydCggYXJnX3B0ciwgZm9ybWF0ICkgOworICB2ZnByaW50ZiAoc3RkZXJyLCBmb3JtYXQsIGFyZ19wdHIgKTsKKyAgdmFfZW5kKGFyZ19wdHIpOworICBleGl0ICgxKTsKK30KKwordHlwZWRlZiBzdHJ1Y3Qgc2NoZW1lX3NwZWMKK3sKKyAgdW5zaWduZWQgaW50IGlkeDsKKyAgZ2NyeV9hY19zY2hlbWVfdCBzY2hlbWU7CisgIHVuc2lnbmVkIGludCBmbGFnczsKKyAgY29uc3QgY2hhciAqbTsKKyAgc2l6ZV90IG1fbjsKK30gc2NoZW1lX3NwZWNfdDsKKworI2RlZmluZSBTQ0hFTUVfU1BFQ19GTEFHX0dFVF9PUFRTICgxIDw8IDApCisKKyNkZWZpbmUgRklMTChpZHgsIHNjaGVtZSwgZmxhZ3MsIG0pIFwKKyAgICB7IGlkeCwgR0NSWV9BQ18jI3NjaGVtZSwgZmxhZ3MsIG0sIHNpemVvZiAobSkgfQorCitzY2hlbWVfc3BlY190IGVzX3NwZWNzW10gPQorICB7CisgICAgRklMTCAoMCwgRVNfUEtDU19WMV81LCAwLCAiZm9vYmFyIiksCisgICAgRklMTCAoMSwgRVNfUEtDU19WMV81LCAwLCAiIikKKyAgfTsKKworc2NoZW1lX3NwZWNfdCBzc2Ffc3BlY3NbXSA9CisgIHsKKyAgICBGSUxMICgwLCBTU0FfUEtDU19WMV81LCBTQ0hFTUVfU1BFQ19GTEFHX0dFVF9PUFRTLCAiZm9vYmFyIikKKyAgfTsKKworI3VuZGVmIEZJTEwKKworZ2NyeV9lcnJfY29kZV90CitzY2hlbWVfZ2V0X29wdHMgKHNjaGVtZV9zcGVjX3Qgc3BlY3MsIHZvaWQgKipvcHRzKQoreworICBnY3J5X2Vycl9jb2RlX3QgZXJyID0gR1BHX0VSUl9OT19FUlJPUjsKKyAgdm9pZCAqb3B0c19uZXcgPSBOVUxMOworCisgIHN3aXRjaCAoc3BlY3Muc2NoZW1lKQorICAgIHsKKyAgICBjYXNlIEdDUllfQUNfU1NBX1BLQ1NfVjFfNToKKyAgICAgIHsKKwlnY3J5X2FjX3NzYV9wa2NzX3YxXzVfdCAqb3B0c19wa2NzX3YxXzUgPSBOVUxMOworCQorCW9wdHNfbmV3ID0gZ2NyeV9tYWxsb2MgKHNpemVvZiAoZ2NyeV9hY19zc2FfcGtjc192MV81X3QpKTsKKwlpZiAoISBvcHRzX25ldykKKwkgIGVyciA9IGdwZ19lcnJfY29kZV9mcm9tX2Vycm5vIChFTk9NRU0pOworCWVsc2UKKwkgIHsKKwkgICAgb3B0c19wa2NzX3YxXzUgPSAoZ2NyeV9hY19zc2FfcGtjc192MV81X3QgKikgb3B0c19uZXc7CisKKwkgICAgc3dpdGNoIChzcGVjcy5pZHgpCisJICAgICAgeworCSAgICAgIGNhc2UgMDoKKwkJb3B0c19wa2NzX3YxXzUtPm1kID0gR0NSWV9NRF9TSEExOworCQlicmVhazsKKwkgICAgICBjYXNlIDE6CisJCW9wdHNfcGtjc192MV81LT5tZCA9IEdDUllfTURfTUQ1OworCQlicmVhazsKKwkgICAgICB9CisJICB9CisgICAgICB9CisgICAgY2FzZSBHQ1JZX0FDX0VTX1BLQ1NfVjFfNToKKyAgICAgIGJyZWFrOworICAgIH0KKworICBpZiAoISBlcnIpCisgICAgKm9wdHMgPSBvcHRzX25ldzsKKworICByZXR1cm4gZXJyOworfQorCitnY3J5X2Vycm9yX3QKK2VzX2NoZWNrIChnY3J5X2FjX2hhbmRsZV90IGhhbmRsZSwgc2NoZW1lX3NwZWNfdCBzcGVjLAorCSAgZ2NyeV9hY19rZXlfdCBrZXlfcHVibGljLCBnY3J5X2FjX2tleV90IGtleV9zZWNyZXQpCit7CisgIGdjcnlfZXJyb3JfdCBlcnIgPSBHUEdfRVJSX05PX0VSUk9SOworICBjaGFyICpjID0gTlVMTDsKKyAgY2hhciAqbTIgPSBOVUxMOworICBzaXplX3QgY19uID0gMDsKKyAgc2l6ZV90IG0yX24gPSAwOworICB2b2lkICpvcHRzID0gTlVMTDsKKyAgZ2NyeV9hY19pb190IGlvX207CisgIGdjcnlfYWNfaW9fdCBpb19jOworICBnY3J5X2FjX2lvX3QgaW9fbTI7CisgIAorICBpZiAoc3BlYy5mbGFncyAmIFNDSEVNRV9TUEVDX0ZMQUdfR0VUX09QVFMpCisgICAgZXJyID0gc2NoZW1lX2dldF9vcHRzIChzcGVjLCAmb3B0cyk7CisgIGlmICghIGVycikKKyAgICB7CisgICAgICBjID0gTlVMTDsKKyAgICAgIG0yID0gTlVMTDsKKworICAgICAgZ2NyeV9hY19pb19pbml0ICgmaW9fbSwgR0NSWV9BQ19JT19SRUFEQUJMRSwKKwkJICAgICAgIEdDUllfQUNfSU9fU1RSSU5HLCBzcGVjLm0sIHNwZWMubV9uKTsKKyAgICAgIGdjcnlfYWNfaW9faW5pdCAoJmlvX2MsIEdDUllfQUNfSU9fV1JJVEFCTEUsCisJCSAgICAgICBHQ1JZX0FDX0lPX1NUUklORywgJmMsICZjX24pOworCisgICAgICBlcnIgPSBnY3J5X2FjX2RhdGFfZW5jcnlwdF9zY2hlbWUgKGhhbmRsZSwgR0NSWV9BQ19FU19QS0NTX1YxXzUsIDAsIG9wdHMsIGtleV9wdWJsaWMsCisJCQkJCSAmaW9fbSwgJmlvX2MpOworICAgICAgaWYgKCEgZXJyKQorCXsKKwkgIGdjcnlfYWNfaW9faW5pdCAoJmlvX2MsIEdDUllfQUNfSU9fUkVBREFCTEUsCisJCQkgICBHQ1JZX0FDX0lPX1NUUklORywgYywgY19uKTsKKwkgIGdjcnlfYWNfaW9faW5pdCAoJmlvX20yLCBHQ1JZX0FDX0lPX1dSSVRBQkxFLAorCQkJICAgR0NSWV9BQ19JT19TVFJJTkcsICZtMiwgJm0yX24pOworCisJICBlcnIgPSBnY3J5X2FjX2RhdGFfZGVjcnlwdF9zY2hlbWUgKGhhbmRsZSwgR0NSWV9BQ19FU19QS0NTX1YxXzUsIDAsCisJCQkJCSAgICAgb3B0cywga2V5X3NlY3JldCwgJmlvX2MsICZpb19tMik7CisJfQorICAgICAgaWYgKCEgZXJyKQorCWFzc2VydCAoKHNwZWMubV9uID09IG0yX24pICYmICghIHN0cm5jbXAgKHNwZWMubSwgbTIsIHNwZWMubV9uKSkpOworCisgICAgICBpZiAoYykKKwlnY3J5X2ZyZWUgKGMpOworICAgICAgaWYgKG0yKQorCWdjcnlfZnJlZSAobTIpOworICAgIH0KKworICBpZiAob3B0cykKKyAgICBnY3J5X2ZyZWUgKG9wdHMpOworCisgIHJldHVybiBlcnI7Cit9CisKK2djcnlfZXJyb3JfdAorc3NhX2NoZWNrIChnY3J5X2FjX2hhbmRsZV90IGhhbmRsZSwgc2NoZW1lX3NwZWNfdCBzcGVjLAorCSAgIGdjcnlfYWNfa2V5X3Qga2V5X3B1YmxpYywgZ2NyeV9hY19rZXlfdCBrZXlfc2VjcmV0KQoreworICBnY3J5X2Vycm9yX3QgZXJyID0gR1BHX0VSUl9OT19FUlJPUjsKKyAgdW5zaWduZWQgY2hhciAqcyA9IE5VTEw7CisgIHNpemVfdCBzX24gPSAwOworICB2b2lkICpvcHRzID0gTlVMTDsKKyAgZ2NyeV9hY19pb190IGlvX207CisgIGdjcnlfYWNfaW9fdCBpb19zOworICAKKyAgaWYgKHNwZWMuZmxhZ3MgJiBTQ0hFTUVfU1BFQ19GTEFHX0dFVF9PUFRTKQorICAgIGVyciA9IHNjaGVtZV9nZXRfb3B0cyAoc3BlYywgJm9wdHMpOworICBpZiAoISBlcnIpCisgICAgeworICAgICAgZ2NyeV9hY19pb19pbml0ICgmaW9fbSwgR0NSWV9BQ19JT19SRUFEQUJMRSwKKwkJICAgICAgIEdDUllfQUNfSU9fU1RSSU5HLCBzcGVjLm0sIHNwZWMubV9uKTsKKyAgICAgIGdjcnlfYWNfaW9faW5pdCAoJmlvX3MsIEdDUllfQUNfSU9fV1JJVEFCTEUsCisJCSAgICAgICBHQ1JZX0FDX0lPX1NUUklORywgJnMsICZzX24pOworCisgICAgICBlcnIgPSBnY3J5X2FjX2RhdGFfc2lnbl9zY2hlbWUgKGhhbmRsZSwgR0NSWV9BQ19TU0FfUEtDU19WMV81LCAwLCBvcHRzLCBrZXlfc2VjcmV0LAorCQkJCSAgICAgICZpb19tLCAmaW9fcyk7CisgICAgICBpZiAoISBlcnIpCisJeworCSAgZ2NyeV9hY19pb19pbml0ICgmaW9fbSwgR0NSWV9BQ19JT19SRUFEQUJMRSwKKwkJCSAgIEdDUllfQUNfSU9fU1RSSU5HLCBzcGVjLm0sIHNwZWMubV9uKTsKKwkgIGdjcnlfYWNfaW9faW5pdCAoJmlvX3MsIEdDUllfQUNfSU9fUkVBREFCTEUsCisJCQkgICBHQ1JZX0FDX0lPX1NUUklORywgcywgc19uKTsKKwkgIGVyciA9IGdjcnlfYWNfZGF0YV92ZXJpZnlfc2NoZW1lIChoYW5kbGUsIEdDUllfQUNfU1NBX1BLQ1NfVjFfNSwgMCwgb3B0cywga2V5X3B1YmxpYywKKwkJCQkJICAgICZpb19tLCAmaW9fcyk7CisJfQorICAgICAgYXNzZXJ0ICghIGVycik7CisKKyAgICAgIGlmIChzKQorCWdjcnlfZnJlZSAocyk7CisgICAgfQorCisgIGlmIChvcHRzKQorICAgIGdjcnlfZnJlZSAob3B0cyk7CisKKyAgcmV0dXJuIGVycjsKK30KKwordm9pZAorZXNfY2hlY2tzIChnY3J5X2FjX2hhbmRsZV90IGhhbmRsZSwgZ2NyeV9hY19rZXlfdCBrZXlfcHVibGljLCBnY3J5X2FjX2tleV90IGtleV9zZWNyZXQpCit7CisgIGdjcnlfZXJyb3JfdCBlcnIgPSBHUEdfRVJSX05PX0VSUk9SOworICB1bnNpZ25lZCBpbnQgaSA9IDA7CisKKyAgZm9yIChpID0gMDsgKGkgPCAoc2l6ZW9mIChlc19zcGVjcykgLyBzaXplb2YgKCplc19zcGVjcykpKSAmJiAoISBlcnIpOyBpKyspCisgICAgZXJyID0gZXNfY2hlY2sgKGhhbmRsZSwgZXNfc3BlY3NbaV0sIGtleV9wdWJsaWMsIGtleV9zZWNyZXQpOworCisgIGFzc2VydCAoISBlcnIpOworfQorCit2b2lkCitzc2FfY2hlY2tzIChnY3J5X2FjX2hhbmRsZV90IGhhbmRsZSwgZ2NyeV9hY19rZXlfdCBrZXlfcHVibGljLCBnY3J5X2FjX2tleV90IGtleV9zZWNyZXQpCit7CisgIGdjcnlfZXJyb3JfdCBlcnIgPSBHUEdfRVJSX05PX0VSUk9SOworICB1bnNpZ25lZCBpbnQgaSA9IDA7CisKKyAgZm9yIChpID0gMDsgKGkgPCAoc2l6ZW9mIChzc2Ffc3BlY3MpIC8gc2l6ZW9mICgqc3NhX3NwZWNzKSkpICYmICghIGVycik7IGkrKykKKyAgICBlcnIgPSBzc2FfY2hlY2sgKGhhbmRsZSwgc3NhX3NwZWNzW2ldLCBrZXlfcHVibGljLCBrZXlfc2VjcmV0KTsKKworICBhc3NlcnQgKCEgZXJyKTsKK30KKworI2RlZmluZSBLRVlfVFlQRV9QVUJMSUMgKDEgPDwgMCkKKyNkZWZpbmUgS0VZX1RZUEVfU0VDUkVUICgxIDw8IDEpCisKK3R5cGVkZWYgc3RydWN0IGtleV9zcGVjCit7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIHVuc2lnbmVkIGludCBmbGFnczsKKyAgY29uc3QgY2hhciAqbXBpX3N0cmluZzsKK30ga2V5X3NwZWNfdDsKKwora2V5X3NwZWNfdCBrZXlfc3BlY3NbXSA9CisgIHsKKyAgICB7ICJuIiwgS0VZX1RZUEVfUFVCTElDIHwgS0VZX1RZUEVfU0VDUkVULAorICAgICAgImUwY2U5NmY5MGI2YzllMDJmMzkyMmJlYWRhOTNmZTUwYTg3NWVhYzZiY2MxOGJiOWE5Y2YyZTg0OTY1Y2FhIgorICAgICAgIjJkMWZmOTVhN2Y1NDI0NjVjNmMwYzE5ZDI3NmU0NTI2Y2UwNDg4NjhhN2E5MTRmZDM0M2NjM2E4N2RkNzQyOTEiCisgICAgICAiZmZjNTY1NTA2ZDViYmIyNWNiYWM2YTBlMmRkMWY4YmNhYWIwZDRhMjljMmYzN2M5NTBmMzYzNDg0YmYyNjlmNyIKKyAgICAgICI4OTE0NDA0NjRiYWY3OTgyN2UwM2EzNmU3MGI4MTQ5MzhlZWJkYzYzZTk2NDI0N2JlNzVkYzU4YjAxNGI3ZWEyNTEiIH0sCisgICAgeyAiZSIsIEtFWV9UWVBFX1BVQkxJQyB8IEtFWV9UWVBFX1NFQ1JFVCwKKyAgICAgICIwMTAwMDEiIH0sCisgICAgeyAiZCIsIEtFWV9UWVBFX1NFQ1JFVCwKKyAgICAgICIwNDYxMjlGMjQ4OUQ3MTU3OUJFMEE3NUZFMDI5QkQ2Q0RCNTc0RUJGNTdFQThBNUIwRkRBOTQyQ0FCOTQzQjExIgorICAgICAgIjdEN0JCOTVFNUQyODg3NUUwRjlGQzVGQ0MwNkE3MkY2RDUwMjQ2NERBQkRFRDc4RUY2QjcxNjE3N0I4M0Q1QkQiCisgICAgICAiQzU0M0RDNUQzRkVEOTMyRTU5RjU4OTdFOTJFNkY1OEEwRjMzNDI0MTA2QTNCNkZBMkNCRjg3NzUxMEU0QUMyMSIKKyAgICAgICJDM0VFNDc4NTFFOTdEMTI5OTYyMjJBQzM1NjZENENDQjBCODNEMTY0MDc0QUJGN0RFNjU1RkMyNDQ2REExNzgxIiB9LAorICAgIHsgInAiLCBLRVlfVFlQRV9TRUNSRVQsCisgICAgICAiMDBlODYxYjcwMGUxN2U4YWZlNjgzN2U3NTEyZTM1YjZjYTExZDBhZTQ3ZDhiODUxNjFjNjdiYWY2NDM3NzIxMyIKKyAgICAgICJmZTUyZDc3MmYyMDM1YjNjYTgzMGFmNDFkOGE0MTIwZTFjMWM3MGQxMmNjMjJmMDBkMjhkMzFkZDQ4YThkNDI0ZjEiIH0sCisgICAgeyAicSIsIEtFWV9UWVBFX1NFQ1JFVCwKKyAgICAgICIwMGY3YTdjYTUzNjdjNjYxZjhlNjJkZjM0ZjBkMDVjMTBjODhlNTQ5MjM0OGRkN2JkZGM5NDJjOWE4ZjM2OWY5IgorICAgICAgIjM1YTA3Nzg1ZDJkYjgwNTIxNWVkNzg2ZTQyODVkZjE2NThlZWQzY2U4NGY0NjliODFiNTBkMzU4NDA3YjRhZDM2MSIgfSwKKyAgICB7ICJ1IiwgS0VZX1RZUEVfU0VDUkVULAorICAgICAgIjMwNDU1OWE5ZWFkNTZkMjMwOWQyMDM4MTFhNjQxYmIxYTA5NjI2YmM4ZWIzNmZmZmEyM2M5NjhlYzViZDg5MWUiCisgICAgICAiZWJiYWZjNzNhZTY2NmUwMWJhN2M4OTkwYmFlMDZjYzJiYmUxMGI3NWU2OWZjYWNiMzUzYTY0NzMwNzlkOGU5YiIgfSwKKyAgICB7IE5VTEwgfSwKKyAgfTsKKworZ2NyeV9lcnJvcl90CitrZXlfaW5pdCAoZ2NyeV9hY19rZXlfdHlwZV90IHR5cGUsIGdjcnlfYWNfa2V5X3QgKmtleSkKK3sKKyAgZ2NyeV9lcnJvcl90IGVyciA9IEdQR19FUlJfTk9fRVJST1I7CisgIGdjcnlfYWNfZGF0YV90IGtleV9kYXRhID0gTlVMTDsKKyAgZ2NyeV9hY19rZXlfdCBrZXlfbmV3ID0gTlVMTDsKKyAgZ2NyeV9tcGlfdCBtcGkgPSBOVUxMOworICB1bnNpZ25lZCBpbnQgaSA9IDA7CisKKyAgZXJyID0gZ2NyeV9hY19kYXRhX25ldyAoJmtleV9kYXRhKTsKKyAgZm9yIChpID0gMDsga2V5X3NwZWNzW2ldLm5hbWUgJiYgKCEgZXJyKTsgaSsrKQorICAgIHsKKyAgICAgIGlmICgoKHR5cGUgPT0gR0NSWV9BQ19LRVlfUFVCTElDKSAmJiAoa2V5X3NwZWNzW2ldLmZsYWdzICYgS0VZX1RZUEVfUFVCTElDKSkKKwkgIHx8ICgodHlwZSA9PSBHQ1JZX0FDX0tFWV9TRUNSRVQpICYmIChrZXlfc3BlY3NbaV0uZmxhZ3MgJiBLRVlfVFlQRV9TRUNSRVQpKSkKKwl7CisJICBlcnIgPSBnY3J5X21waV9zY2FuICgmbXBpLCBHQ1JZTVBJX0ZNVF9IRVgsIGtleV9zcGVjc1tpXS5tcGlfc3RyaW5nLCAwLCBOVUxMKTsKKwkgIGlmICghIGVycikKKwkgICAgeworCSAgICAgIGdjcnlfYWNfZGF0YV9zZXQgKGtleV9kYXRhLCBHQ1JZX0FDX0ZMQUdfQ09QWSB8IEdDUllfQUNfRkxBR19ERUFMTE9DLAorCQkJCWtleV9zcGVjc1tpXS5uYW1lLCBtcGkpOworCSAgICAgIGdjcnlfbXBpX3JlbGVhc2UgKG1waSk7CisJICAgIH0KKwl9CisgICAgfQorICBpZiAoISBlcnIpCisgICAgZXJyID0gZ2NyeV9hY19rZXlfaW5pdCAoJmtleV9uZXcsIE5VTEwsIHR5cGUsIGtleV9kYXRhKTsKKworICBpZiAoa2V5X2RhdGEpCisgICAgZ2NyeV9hY19kYXRhX2Rlc3Ryb3kgKGtleV9kYXRhKTsKKyAgCisgIGlmICghIGVycikKKyAgICAqa2V5ID0ga2V5X25ldzsKKworICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfcnVuICh2b2lkKQoreworICBnY3J5X2FjX2hhbmRsZV90IGhhbmRsZSA9IE5VTEw7CisgIGdjcnlfZXJyb3JfdCBlcnIgPSBHUEdfRVJSX05PX0VSUk9SOworICBnY3J5X2FjX2tleV90IGtleV9wdWJsaWMgPSBOVUxMLCBrZXlfc2VjcmV0ID0gTlVMTDsKKworICBlcnIgPSBrZXlfaW5pdCAoR0NSWV9BQ19LRVlfUFVCTElDLCAma2V5X3B1YmxpYyk7CisgIGlmICghIGVycikKKyAgICBlcnIgPSBrZXlfaW5pdCAoR0NSWV9BQ19LRVlfU0VDUkVULCAma2V5X3NlY3JldCk7CisgIAorICBpZiAoISBlcnIpCisgICAgZXJyID0gZ2NyeV9hY19vcGVuICgmaGFuZGxlLCBHQ1JZX0FDX1JTQSwgMCk7CisgIGlmICghIGVycikKKyAgICB7CisgICAgICBlc19jaGVja3MgKGhhbmRsZSwga2V5X3B1YmxpYywga2V5X3NlY3JldCk7CisgICAgICBzc2FfY2hlY2tzIChoYW5kbGUsIGtleV9wdWJsaWMsIGtleV9zZWNyZXQpOworICAgIH0KKyAgCisgIGFzc2VydCAoISBlcnIpOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgdW5zaWduZWQgaW50IGRlYnVnID0gMDsKKworICBpZiAoKGFyZ2MgPiAxKSAmJiAoISBzdHJjbXAgKGFyZ3ZbMV0sICItLXZlcmJvc2UiKSkpCisgICAgdmVyYm9zZSA9IDE7CisgIGVsc2UgaWYgKChhcmdjID4gMSkgJiYgKCEgc3RyY21wIChhcmd2WzFdLCAiLS1kZWJ1ZyIpKSkKKyAgICB2ZXJib3NlID0gZGVidWcgPSAxOworCisgIGdjcnlfY29udHJvbCAoR0NSWUNUTF9ESVNBQkxFX1NFQ01FTSwgMCk7CisgIGlmICghIGdjcnlfY2hlY2tfdmVyc2lvbiAoR0NSWVBUX1ZFUlNJT04pKQorICAgIGRpZSAoInZlcnNpb24gbWlzbWF0Y2hcbiIpOworICBnY3J5X2NvbnRyb2wgKEdDUllDVExfSU5JVElBTElaQVRJT05fRklOSVNIRUQsIDApOworICBpZiAoZGVidWcpCisgICAgZ2NyeV9jb250cm9sIChHQ1JZQ1RMX1NFVF9ERUJVR19GTEFHUywgMXUsIDApOworCisgIGNoZWNrX3J1biAoKTsKKyAgCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L3Rlc3RzL2FjLmMgYi9saWJnY3J5cHQtMS40LjYvdGVzdHMvYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzM0MzYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L3Rlc3RzL2FjLmMKQEAgLTAsMCArMSwxNjIgQEAKKy8qIHB1YmtleS5jIC0gUHVibGljIGtleSBlbmNyeXB0aW9uL2RlY3J5cHRpb24gdGVzdHMKKyAqCUNvcHlyaWdodCAoQykgMjAwMywgMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlICIuLi9zcmMvZ2NyeXB0LmgiCisKK3N0YXRpYyBpbnQgdmVyYm9zZTsKKworc3RhdGljIHZvaWQKK2RpZSAoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgIHZhX2xpc3QgYXJnX3B0ciA7CisKKyAgdmFfc3RhcnQoIGFyZ19wdHIsIGZvcm1hdCApIDsKKyAgdmZwcmludGYgKHN0ZGVyciwgZm9ybWF0LCBhcmdfcHRyICk7CisgIHZhX2VuZChhcmdfcHRyKTsKKyAgZXhpdCAoMSk7Cit9CisKK3ZvaWQKK2tleV9jb3B5IChnY3J5X2FjX2hhbmRsZV90IGhhbmRsZSwKKwkgIGdjcnlfYWNfa2V5X3R5cGVfdCB0eXBlLAorCSAgZ2NyeV9hY19rZXlfdCAqa2V5X2NwLCBnY3J5X2FjX2tleV90IGtleSkKK3sKKyAgZ2NyeV9lcnJvcl90IGVyciA9IDA7CisKKyAgZXJyID0gZ2NyeV9hY19rZXlfaW5pdCAoa2V5X2NwLCBoYW5kbGUsIHR5cGUsCisJCQkgIGdjcnlfYWNfa2V5X2RhdGFfZ2V0IChrZXkpKTsKKworICBhc3NlcnQgKCEgZXJyKTsKK30KKwordm9pZAorY2hlY2tfb25lIChnY3J5X21waV90IHgpCit7CisgIGdjcnlfYWNfaGFuZGxlX3QgaGFuZGxlOworICBnY3J5X2FjX2tleV9wYWlyX3Qga2V5X3BhaXI7CisgIGdjcnlfYWNfa2V5X3Qga2V5X3NlYywga2V5X3NlY19jcCwga2V5X3B1Yiwga2V5X3B1Yl9jcDsKKyAgZ2NyeV9lcnJvcl90IGVyciA9IDA7CisgIGdjcnlfbXBpX3QgeDI7CisgIGdjcnlfYWNfZGF0YV90IGRhdGEsIGRhdGEyOworICBnY3J5X2FjX2tleV9zcGVjX3JzYV90IHJzYV9zcGVjOworCisgIHJzYV9zcGVjLmUgPSBnY3J5X21waV9uZXcgKDApOworICBnY3J5X21waV9zZXRfdWkgKHJzYV9zcGVjLmUsIDEpOworCisgIGVyciA9IGdjcnlfYWNfb3BlbiAoJmhhbmRsZSwgR0NSWV9BQ19SU0EsIDApOworICBhc3NlcnQgKCEgZXJyKTsKKworICBlcnIgPSBnY3J5X2FjX2tleV9wYWlyX2dlbmVyYXRlIChoYW5kbGUsIDEwMjQsICZyc2Ffc3BlYywgJmtleV9wYWlyLCBOVUxMKTsKKyAgYXNzZXJ0ICghIGVycik7CisKKyAga2V5X3NlYyA9IGdjcnlfYWNfa2V5X3BhaXJfZXh0cmFjdCAoa2V5X3BhaXIsIEdDUllfQUNfS0VZX1NFQ1JFVCk7CisgIGtleV9jb3B5IChoYW5kbGUsIEdDUllfQUNfS0VZX1NFQ1JFVCwgJmtleV9zZWNfY3AsIGtleV9zZWMpOworCisgIGtleV9wdWIgPSBnY3J5X2FjX2tleV9wYWlyX2V4dHJhY3QgKGtleV9wYWlyLCBHQ1JZX0FDX0tFWV9QVUJMSUMpOworICBrZXlfY29weSAoaGFuZGxlLCBHQ1JZX0FDX0tFWV9QVUJMSUMsICZrZXlfcHViX2NwLCBrZXlfcHViKTsKKworICBlcnIgPSBnY3J5X2FjX2RhdGFfZW5jcnlwdCAoaGFuZGxlLCBHQ1JZX0FDX0ZMQUdfTk9fQkxJTkRJTkcsIGtleV9wdWJfY3AsIHgsICZkYXRhKTsKKyAgYXNzZXJ0ICghIGVycik7CisKKyAgZXJyID0gZ2NyeV9hY19kYXRhX2RlY3J5cHQgKGhhbmRsZSwgR0NSWV9BQ19GTEFHX05PX0JMSU5ESU5HLCBrZXlfc2VjX2NwLCAmeDIsIGRhdGEpOworICBhc3NlcnQgKCEgZXJyKTsKKworICBhc3NlcnQgKCEgZ2NyeV9tcGlfY21wICh4LCB4MikpOworCisgIGdjcnlfYWNfZGF0YV9kZXN0cm95IChkYXRhKTsKKworICBlcnIgPSBnY3J5X2FjX2RhdGFfc2lnbiAoaGFuZGxlLCBrZXlfc2VjLCB4LCAmZGF0YSk7CisgIGFzc2VydCAoISBlcnIpOworICBlcnIgPSBnY3J5X2FjX2RhdGFfY29weSAoJmRhdGEyLCBkYXRhKTsKKyAgYXNzZXJ0ICghIGVycik7CisgIGdjcnlfYWNfZGF0YV9kZXN0cm95IChkYXRhKTsKKyAgZXJyID0gZ2NyeV9hY19kYXRhX2NvcHkgKCZkYXRhLCBkYXRhMik7CisgIGFzc2VydCAoISBlcnIpOworICBnY3J5X2FjX2RhdGFfZGVzdHJveSAoZGF0YTIpOworCisgIGVyciA9IGdjcnlfYWNfZGF0YV92ZXJpZnkgKGhhbmRsZSwga2V5X3B1YiwgeCwgZGF0YSk7CisgIGFzc2VydCAoISBlcnIpOworCisgIGdjcnlfYWNfZGF0YV9kZXN0cm95IChkYXRhKTsKKworICBlcnIgPSBnY3J5X2FjX2RhdGFfc2lnbiAoaGFuZGxlLCBrZXlfc2VjLCB4LCAmZGF0YSk7CisgIGFzc2VydCAoISBlcnIpOworICB7CisgICAgY29uc3QgY2hhciAqbGFiZWw7CisgICAgZ2NyeV9tcGlfdCB5OworCisgICAgZXJyID0gZ2NyeV9hY19kYXRhX2dldF9pbmRleCAoZGF0YSwgMCwgMCwgJmxhYmVsLCAmeSk7CisgICAgYXNzZXJ0ICghIGVycik7CisgICAgZ2NyeV9tcGlfYWRkX3VpICh5LCB5LCAxKTsKKyAgICAKKyAgICBlcnIgPSBnY3J5X2FjX2RhdGFfdmVyaWZ5IChoYW5kbGUsIGtleV9wdWIsIHgsIGRhdGEpOworICAgIGFzc2VydCAoZ2NyeV9lcnJfY29kZSAoZXJyKSA9PSBHUEdfRVJSX0JBRF9TSUdOQVRVUkUpOworICB9CisKKyAgZ2NyeV9hY19jbG9zZSAoaGFuZGxlKTsKK30KKwordm9pZAorY2hlY2tfcnVuICh2b2lkKQoreworICAvKmNvbnN0IGNoYXIgKnMgPSAiQWxsIEhhaWwgRGlzY29yZGlhLiI7IC0tIG5vdCB1c2VkICovCisgIHVuc2lnbmVkIGludCBhID0gMHg0MjIzOworICBnY3J5X21waV90IHg7CisKKyAgeCA9IGdjcnlfbXBpX25ldyAoMCk7CisgIGdjcnlfbXBpX3NldF91aSAoeCwgYSk7CisgIGNoZWNrX29uZSAoeCk7CisgIGdjcnlfbXBpX3JlbGVhc2UgKHgpOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgaW50IGRlYnVnID0gMDsKKyAgaW50IGkgPSAxOworCisgIGlmIChhcmdjID4gMSAmJiAhc3RyY21wIChhcmd2WzFdLCAiLS12ZXJib3NlIikpCisgICAgdmVyYm9zZSA9IDE7CisgIGVsc2UgaWYgKGFyZ2MgPiAxICYmICFzdHJjbXAgKGFyZ3ZbMV0sICItLWRlYnVnIikpCisgICAgdmVyYm9zZSA9IGRlYnVnID0gMTsKKworICBnY3J5X2NvbnRyb2wgKEdDUllDVExfRElTQUJMRV9TRUNNRU0sIDApOworICBpZiAoIWdjcnlfY2hlY2tfdmVyc2lvbiAoR0NSWVBUX1ZFUlNJT04pKQorICAgIGRpZSAoInZlcnNpb24gbWlzbWF0Y2hcbiIpOworICBnY3J5X2NvbnRyb2wgKEdDUllDVExfSU5JVElBTElaQVRJT05fRklOSVNIRUQsIDApOworICBpZiAoZGVidWcpCisgICAgZ2NyeV9jb250cm9sIChHQ1JZQ1RMX1NFVF9ERUJVR19GTEFHUywgMXUgLCAwKTsKKyAgLyogTm8gdmFsdWFibGUga2V5cyBhcmUgY3JlYXRlLCBzbyB3ZSBjYW4gc3BlZWQgdXAgb3VyIFJORy4gKi8KKyAgZ2NyeV9jb250cm9sIChHQ1JZQ1RMX0VOQUJMRV9RVUlDS19SQU5ET00sIDApOworCisgIGZvciAoOyBpID4gMDsgaS0tKQorICAgIGNoZWNrX3J1biAoKTsKKyAgCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L3Rlc3RzL2Flc3dyYXAuYyBiL2xpYmdjcnlwdC0xLjQuNi90ZXN0cy9hZXN3cmFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzllZjFlNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi90ZXN0cy9hZXN3cmFwLmMKQEAgLTAsMCArMSwyNTkgQEAKKy8qIGFlc3dyYXAuYyAtICBBRVNXUkFQIG1vZGUgcmVncmVzc2lvbiB0ZXN0cworICoJQ29weXJpZ2h0IChDKSAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2luY2x1ZGUgIi4uL3NyYy9nY3J5cHQuaCIKKworc3RhdGljIGludCB2ZXJib3NlOworc3RhdGljIGludCBlcnJvcl9jb3VudDsKKworc3RhdGljIHZvaWQKK2ZhaWwgKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICB2YV9saXN0IGFyZ19wdHI7CisKKyAgdmFfc3RhcnQgKGFyZ19wdHIsIGZvcm1hdCk7CisgIHZmcHJpbnRmIChzdGRlcnIsIGZvcm1hdCwgYXJnX3B0cik7CisgIHZhX2VuZCAoYXJnX3B0cik7CisgIGVycm9yX2NvdW50Kys7Cit9CisKK3N0YXRpYyB2b2lkCitkaWUgKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICB2YV9saXN0IGFyZ19wdHI7CisKKyAgdmFfc3RhcnQgKGFyZ19wdHIsIGZvcm1hdCk7CisgIHZmcHJpbnRmIChzdGRlcnIsIGZvcm1hdCwgYXJnX3B0cik7CisgIHZhX2VuZCAoYXJnX3B0cik7CisgIGV4aXQgKDEpOworfQorCisKKworc3RhdGljIHZvaWQKK2NoZWNrIChpbnQgYWxnbywKKyAgICAgICBjb25zdCB2b2lkICprZWssIHNpemVfdCBrZWtsZW4sCisgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFsZW4sCisgICAgICAgY29uc3Qgdm9pZCAqZXhwZWN0ZWQsIHNpemVfdCBleHBlY3RlZGxlbikKK3sKKyAgZ2NyeV9lcnJvcl90IGVycjsKKyAgZ2NyeV9jaXBoZXJfaGRfdCBoZDsKKyAgdW5zaWduZWQgY2hhciBvdXRidWZbMzIrOF07CisgIHNpemVfdCBvdXRidWZsZW47CisKKyAgZXJyID0gZ2NyeV9jaXBoZXJfb3BlbiAoJmhkLCBhbGdvLCBHQ1JZX0NJUEhFUl9NT0RFX0FFU1dSQVAsIDApOworICBpZiAoZXJyKQorICAgIHsKKyAgICAgIGZhaWwgKCJnY3J5X2NpcGhlcl9vcGVuIGZhaWxlZDogJXNcbiIsIGdwZ19zdHJlcnJvciAoZXJyKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGVyciA9IGdjcnlfY2lwaGVyX3NldGtleSAoaGQsIGtlaywga2VrbGVuKTsKKyAgaWYgKGVycikKKyAgICB7CisgICAgICBmYWlsICgiZ2NyeV9jaXBoZXJfc2V0a2V5IGZhaWxlZDogJXNcbiIsIGdwZ19zdHJlcnJvciAoZXJyKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIG91dGJ1ZmxlbiA9IGRhdGFsZW4gKyA4OworICBpZiAob3V0YnVmbGVuID4gc2l6ZW9mIG91dGJ1ZikKKyAgICBlcnIgPSBncGdfZXJyb3IgKEdQR19FUlJfSU5URVJOQUwpOworICBlbHNlCisgICAgZXJyID0gZ2NyeV9jaXBoZXJfZW5jcnlwdCAoaGQsIG91dGJ1Ziwgb3V0YnVmbGVuLCBkYXRhLCBkYXRhbGVuKTsKKyAgaWYgKGVycikKKyAgICB7CisgICAgICBmYWlsICgiZ2NyeV9jaXBoZXJfZW5jcnlwdCBmYWlsZWQ6ICVzXG4iLCBncGdfc3RyZXJyb3IgKGVycikpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAob3V0YnVmbGVuICE9IGV4cGVjdGVkbGVuIHx8IG1lbWNtcCAob3V0YnVmLCBleHBlY3RlZCwgZXhwZWN0ZWRsZW4pKQorICAgIHsKKyAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnM7CisgICAgICBpbnQgaTsKKworICAgICAgZmFpbCAoIm1pc21hdGNoIGF0IGVuY3J5cHRpb24hXG4iKTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgImNvbXB1dGVkOiAiKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBvdXRidWZsZW47IGkrKykKKwlmcHJpbnRmIChzdGRlcnIsICIlMDJ4ICIsIG91dGJ1ZltpXSk7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJcbmV4cGVjdGVkOiAiKTsKKyAgICAgIGZvciAocyA9IGV4cGVjdGVkLCBpID0gMDsgaSA8IGV4cGVjdGVkbGVuOyBzKyssIGkrKykKKyAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJTAyeCAiLCAqcyk7CisgICAgICBwdXRjICgnXG4nLCBzdGRlcnIpOworICAgIH0KKworCisgIG91dGJ1ZmxlbiA9IGV4cGVjdGVkbGVuIC0gODsKKyAgaWYgKG91dGJ1ZmxlbiA+IHNpemVvZiBvdXRidWYpCisgICAgZXJyID0gZ3BnX2Vycm9yIChHUEdfRVJSX0lOVEVSTkFMKTsKKyAgZWxzZQorICAgIGVyciA9IGdjcnlfY2lwaGVyX2RlY3J5cHQgKGhkLCBvdXRidWYsIG91dGJ1ZmxlbiwgZXhwZWN0ZWQsIGV4cGVjdGVkbGVuKTsKKyAgaWYgKGVycikKKyAgICB7CisgICAgICBmYWlsICgiZ2NyeV9jaXBoZXJfZGVjcnlwdCBmYWlsZWQ6ICVzXG4iLCBncGdfc3RyZXJyb3IgKGVycikpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAob3V0YnVmbGVuICE9IGRhdGFsZW4gfHwgbWVtY21wIChvdXRidWYsIGRhdGEsIGRhdGFsZW4pKQorICAgIHsKKyAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnM7CisgICAgICBpbnQgaTsKKworICAgICAgZmFpbCAoIm1pc21hdGNoIGF0IGRlY3J5cHRpb24hXG4iKTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgImNvbXB1dGVkOiAiKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBvdXRidWZsZW47IGkrKykKKwlmcHJpbnRmIChzdGRlcnIsICIlMDJ4ICIsIG91dGJ1ZltpXSk7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJcbmV4cGVjdGVkOiAiKTsKKyAgICAgIGZvciAocyA9IGRhdGEsIGkgPSAwOyBpIDwgZGF0YWxlbjsgcysrLCBpKyspCisgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIiUwMnggIiwgKnMpOworICAgICAgcHV0YyAoJ1xuJywgc3RkZXJyKTsKKyAgICB9CisKKyAgLyogTm93IHRoZSBsYXN0IHN0ZXAgYWdhaW4gd2l0aCBhIGtleSByZXNldC4gKi8KKyAgZ2NyeV9jaXBoZXJfcmVzZXQgKGhkKTsKKworICBvdXRidWZsZW4gPSBleHBlY3RlZGxlbiAtIDg7CisgIGlmIChvdXRidWZsZW4gPiBzaXplb2Ygb3V0YnVmKQorICAgIGVyciA9IGdwZ19lcnJvciAoR1BHX0VSUl9JTlRFUk5BTCk7CisgIGVsc2UKKyAgICBlcnIgPSBnY3J5X2NpcGhlcl9kZWNyeXB0IChoZCwgb3V0YnVmLCBvdXRidWZsZW4sIGV4cGVjdGVkLCBleHBlY3RlZGxlbik7CisgIGlmIChlcnIpCisgICAgeworICAgICAgZmFpbCAoImdjcnlfY2lwaGVyX2RlY3J5cHQoMikgZmFpbGVkOiAlc1xuIiwgZ3BnX3N0cmVycm9yIChlcnIpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKG91dGJ1ZmxlbiAhPSBkYXRhbGVuIHx8IG1lbWNtcCAob3V0YnVmLCBkYXRhLCBkYXRhbGVuKSkKKyAgICBmYWlsICgibWlzbWF0Y2ggYXQgZGVjcnlwdGlvbigyKSFcbiIpOworCisgIC8qIEFuZCBvbmNlIG9yZSB3aXRob3V0IGEga2V5IHJlc2V0LiAqLworICBvdXRidWZsZW4gPSBleHBlY3RlZGxlbiAtIDg7CisgIGlmIChvdXRidWZsZW4gPiBzaXplb2Ygb3V0YnVmKQorICAgIGVyciA9IGdwZ19lcnJvciAoR1BHX0VSUl9JTlRFUk5BTCk7CisgIGVsc2UKKyAgICBlcnIgPSBnY3J5X2NpcGhlcl9kZWNyeXB0IChoZCwgb3V0YnVmLCBvdXRidWZsZW4sIGV4cGVjdGVkLCBleHBlY3RlZGxlbik7CisgIGlmIChlcnIpCisgICAgeworICAgICAgZmFpbCAoImdjcnlfY2lwaGVyX2RlY3J5cHQoMykgZmFpbGVkOiAlc1xuIiwgZ3BnX3N0cmVycm9yIChlcnIpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKG91dGJ1ZmxlbiAhPSBkYXRhbGVuIHx8IG1lbWNtcCAob3V0YnVmLCBkYXRhLCBkYXRhbGVuKSkKKyAgICBmYWlsICgibWlzbWF0Y2ggYXQgZGVjcnlwdGlvbigzKSFcbiIpOworCisgIGdjcnlfY2lwaGVyX2Nsb3NlIChoZCk7Cit9CisKKworc3RhdGljIHZvaWQKK2NoZWNrX2FsbCAodm9pZCkKK3sKKyAgaWYgKHZlcmJvc2UpCisgICAgZnByaW50ZiAoc3RkZXJyLCAiNC4xIFdyYXAgMTI4IGJpdHMgb2YgS2V5IERhdGEgd2l0aCBhIDEyOC1iaXQgS0VLXG4iKTsKKyAgY2hlY2sgCisgICAgKEdDUllfQ0lQSEVSX0FFUzEyOCwKKyAgICAgIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3XHgwOFx4MDlceDBBXHgwQlx4MENceDBEXHgwRVx4MEYiLCAxNiwKKyAgICAgIlx4MDBceDExXHgyMlx4MzNceDQ0XHg1NVx4NjZceDc3XHg4OFx4OTlceEFBXHhCQlx4Q0NceEREXHhFRVx4RkYiLCAxNiwKKyAgICAgIlx4MUZceEE2XHg4Qlx4MEFceDgxXHgxMlx4QjRceDQ3XHhBRVx4RjNceDRCXHhEOFx4RkJceDVBXHg3Qlx4ODIiCisgICAgICJceDlEXHgzRVx4ODZceDIzXHg3MVx4RDJceENGXHhFNSIsIDI0KTsKKworICBpZiAodmVyYm9zZSkKKyAgICBmcHJpbnRmIChzdGRlcnIsICI0LjIgV3JhcCAxMjggYml0cyBvZiBLZXkgRGF0YSB3aXRoIGEgMTkyLWJpdCBLRUtcbiIpOworICBjaGVjayAKKyAgICAoR0NSWV9DSVBIRVJfQUVTMTkyLAorICAgICAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDdceDA4XHgwOVx4MEFceDBCXHgwQ1x4MERceDBFXHgwRiIKKyAgICAgIlx4MTBceDExXHgxMlx4MTNceDE0XHgxNVx4MTZceDE3IiwgMjQsCisgICAgICJceDAwXHgxMVx4MjJceDMzXHg0NFx4NTVceDY2XHg3N1x4ODhceDk5XHhBQVx4QkJceENDXHhERFx4RUVceEZGIiwgMTYsCisgICAgICJceDk2XHg3N1x4OEJceDI1XHhBRVx4NkNceEE0XHgzNVx4RjlceDJCXHg1Qlx4OTdceEMwXHg1MFx4QUVceEQyIgorICAgICAiXHg0Nlx4OEFceEI4XHhBMVx4N0FceEQ4XHg0RVx4NUQiLCAyNCk7CisKKyAgaWYgKHZlcmJvc2UpCisgICAgZnByaW50ZiAoc3RkZXJyLCAiNC4zIFdyYXAgMTI4IGJpdHMgb2YgS2V5IERhdGEgd2l0aCBhIDI1Ni1iaXQgS0VLXG4iKTsKKyAgY2hlY2sgCisgICAgKEdDUllfQ0lQSEVSX0FFUzI1NiwKKyAgICAgIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3XHgwOFx4MDlceDBBXHgwQlx4MENceDBEXHgwRVx4MEYiCisgICAgICJceDEwXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxN1x4MThceDE5XHgxQVx4MUJceDFDXHgxRFx4MUVceDFGIiwgMzIsCisgICAgICJceDAwXHgxMVx4MjJceDMzXHg0NFx4NTVceDY2XHg3N1x4ODhceDk5XHhBQVx4QkJceENDXHhERFx4RUVceEZGIiwgMTYsCisgICAgICJceDY0XHhFOFx4QzNceEY5XHhDRVx4MEZceDVCXHhBMlx4NjNceEU5XHg3N1x4NzlceDA1XHg4MVx4OEFceDJBIgorICAgICAiXHg5M1x4QzhceDE5XHgxRVx4N0RceDZFXHg4QVx4RTciLCAyNCk7CisKKyAgaWYgKHZlcmJvc2UpCisgICAgZnByaW50ZiAoc3RkZXJyLCAiNC40IFdyYXAgMTkyIGJpdHMgb2YgS2V5IERhdGEgd2l0aCBhIDE5Mi1iaXQgS0VLXG4iKTsKKyAgY2hlY2sgCisgICAgKEdDUllfQ0lQSEVSX0FFUzE5MiwKKyAgICAgIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3XHgwOFx4MDlceDBBXHgwQlx4MENceDBEXHgwRVx4MEYiCisgICAgICJceDEwXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxNyIsIDI0LAorICAgICAiXHgwMFx4MTFceDIyXHgzM1x4NDRceDU1XHg2Nlx4NzdceDg4XHg5OVx4QUFceEJCXHhDQ1x4RERceEVFXHhGRiIKKyAgICAgIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IiwgMjQsCisgICAgICJceDAzXHgxRFx4MzNceDI2XHg0RVx4MTVceEQzXHgzMlx4NjhceEYyXHg0RVx4QzJceDYwXHg3NFx4M0VceERDIgorICAgICAiXHhFMVx4QzZceEM3XHhERFx4RUVceDcyXHg1QVx4OTNceDZCXHhBOFx4MTRceDkxXHg1Q1x4NjdceDYyXHhEMiIsIDMyKTsKKyAgICAgCisgIGlmICh2ZXJib3NlKQorICAgIGZwcmludGYgKHN0ZGVyciwgIjQuNSBXcmFwIDE5MiBiaXRzIG9mIEtleSBEYXRhIHdpdGggYSAyNTYtYml0IEtFS1xuIik7CisgIGNoZWNrIAorICAgIChHQ1JZX0NJUEhFUl9BRVMyNTYsCisgICAgICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwN1x4MDhceDA5XHgwQVx4MEJceDBDXHgwRFx4MEVceDBGIgorICAgICAiXHgxMFx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTdceDE4XHgxOVx4MUFceDFCXHgxQ1x4MURceDFFXHgxRiIsIDMyLAorICAgICAiXHgwMFx4MTFceDIyXHgzM1x4NDRceDU1XHg2Nlx4NzdceDg4XHg5OVx4QUFceEJCXHhDQ1x4RERceEVFXHhGRiIKKyAgICAgIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IiwgMjQsCisgICAgICJceEE4XHhGOVx4QkNceDE2XHgxMlx4QzZceDhCXHgzRlx4RjZceEU2XHhGNFx4RkJceEUzXHgwRVx4NzFceEU0IgorICAgICAiXHg3Nlx4OUNceDhCXHg4MFx4QTNceDJDXHhCOFx4OTVceDhDXHhENVx4RDFceDdEXHg2Qlx4MjVceDREXHhBMSIsIDMyKTsKKworICBpZiAodmVyYm9zZSkKKyAgICBmcHJpbnRmIChzdGRlcnIsICI0LjYgV3JhcCAyNTYgYml0cyBvZiBLZXkgRGF0YSB3aXRoIGEgMjU2LWJpdCBLRUtcbiIpOworICBjaGVjayAKKyAgICAoR0NSWV9DSVBIRVJfQUVTLAorICAgICAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDdceDA4XHgwOVx4MEFceDBCXHgwQ1x4MERceDBFXHgwRiIKKyAgICAgIlx4MTBceDExXHgxMlx4MTNceDE0XHgxNVx4MTZceDE3XHgxOFx4MTlceDFBXHgxQlx4MUNceDFEXHgxRVx4MUYiLCAzMiwKKyAgICAgIlx4MDBceDExXHgyMlx4MzNceDQ0XHg1NVx4NjZceDc3XHg4OFx4OTlceEFBXHhCQlx4Q0NceEREXHhFRVx4RkYiCisgICAgICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwN1x4MDhceDA5XHgwQVx4MEJceDBDXHgwRFx4MEVceDBGIiwgMzIsCisgICAgICJceDI4XHhDOVx4RjRceDA0XHhDNFx4QjhceDEwXHhGNFx4Q0JceENDXHhCM1x4NUNceEZCXHg4N1x4RjhceDI2IgorICAgICAiXHgzRlx4NTdceDg2XHhFMlx4RDhceDBFXHhEM1x4MjZceENCXHhDN1x4RjBceEU3XHgxQVx4OTlceEY0XHgzQiIKKyAgICAgIlx4RkJceDk4XHg4Qlx4OUJceDdBXHgwMlx4RERceDIxIiwgNDApOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgaW50IGRlYnVnID0gMDsKKworICBpZiAoYXJnYyA+IDEgJiYgIXN0cmNtcCAoYXJndlsxXSwgIi0tdmVyYm9zZSIpKQorICAgIHZlcmJvc2UgPSAxOworICBlbHNlIGlmIChhcmdjID4gMSAmJiAhc3RyY21wIChhcmd2WzFdLCAiLS1kZWJ1ZyIpKQorICAgIHZlcmJvc2UgPSBkZWJ1ZyA9IDE7CisKKyAgaWYgKCFnY3J5X2NoZWNrX3ZlcnNpb24gKEdDUllQVF9WRVJTSU9OKSkKKyAgICBkaWUgKCJ2ZXJzaW9uIG1pc21hdGNoXG4iKTsKKworICBnY3J5X2NvbnRyb2wgKEdDUllDVExfRElTQUJMRV9TRUNNRU0sIDApOworICBnY3J5X2NvbnRyb2wgKEdDUllDVExfSU5JVElBTElaQVRJT05fRklOSVNIRUQsIDApOworICBpZiAoZGVidWcpCisgICAgZ2NyeV9jb250cm9sIChHQ1JZQ1RMX1NFVF9ERUJVR19GTEFHUywgMXUsIDApOworICBjaGVja19hbGwgKCk7CisKKyAgcmV0dXJuIGVycm9yX2NvdW50ID8gMSA6IDA7Cit9CmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvdGVzdHMvYmFzaWMuYyBiL2xpYmdjcnlwdC0xLjQuNi90ZXN0cy9iYXNpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4Y2RlYTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvdGVzdHMvYmFzaWMuYwpAQCAtMCwwICsxLDIyNTAgQEAKKy8qIGJhc2ljLmMgIC0gIGJhc2ljIHJlZ3Jlc3Npb24gdGVzdHMKKyAqIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNSwgMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpbmNsdWRlICIuLi9zcmMvZ2NyeXB0LmgiCisKK3R5cGVkZWYgc3RydWN0IHRlc3Rfc3BlY19wdWJrZXlfa2V5Cit7CisgIGNvbnN0IGNoYXIgKnNlY3JldDsKKyAgY29uc3QgY2hhciAqcHVibGljOworICBjb25zdCBjaGFyICpncmlwOworfQordGVzdF9zcGVjX3B1YmtleV9rZXlfdDsKKwordHlwZWRlZiBzdHJ1Y3QgdGVzdF9zcGVjX3B1YmtleQoreworICBpbnQgaWQ7CisgIGludCBmbGFnczsKKyAgdGVzdF9zcGVjX3B1YmtleV9rZXlfdCBrZXk7Cit9Cit0ZXN0X3NwZWNfcHVia2V5X3Q7CisKKyNkZWZpbmUgRkxBR19DUllQVCAoMSA8PCAwKQorI2RlZmluZSBGTEFHX1NJR04gICgxIDw8IDEpCisjZGVmaW5lIEZMQUdfR1JJUCAgKDEgPDwgMikKKworc3RhdGljIGludCB2ZXJib3NlOworc3RhdGljIGludCBlcnJvcl9jb3VudDsKK3N0YXRpYyBpbnQgaW5fZmlwc19tb2RlOworCitzdGF0aWMgdm9pZAorZmFpbCAoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgIHZhX2xpc3QgYXJnX3B0cjsKKworICB2YV9zdGFydCAoYXJnX3B0ciwgZm9ybWF0KTsKKyAgdmZwcmludGYgKHN0ZGVyciwgZm9ybWF0LCBhcmdfcHRyKTsKKyAgdmFfZW5kIChhcmdfcHRyKTsKKyAgZXJyb3JfY291bnQrKzsKK30KKworc3RhdGljIHZvaWQKK2RpZSAoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgIHZhX2xpc3QgYXJnX3B0cjsKKworICB2YV9zdGFydCAoYXJnX3B0ciwgZm9ybWF0KTsKKyAgdmZwcmludGYgKHN0ZGVyciwgZm9ybWF0LCBhcmdfcHRyKTsKKyAgdmFfZW5kIChhcmdfcHRyKTsKKyAgZXhpdCAoMSk7Cit9CisKKyNkZWZpbmUgTUFYX0RBVEFfTEVOIDEwMAorCit2b2lkCitwcm9ncmVzc19oYW5kbGVyICh2b2lkICpjYl9kYXRhLCBjb25zdCBjaGFyICp3aGF0LCBpbnQgcHJpbnRjaGFyLAorCQkgIGludCBjdXJyZW50LCBpbnQgdG90YWwpCit7CisgICh2b2lkKWNiX2RhdGE7CisgICh2b2lkKXdoYXQ7CisgICh2b2lkKWN1cnJlbnQ7CisgICh2b2lkKXRvdGFsOworICAKKyAgaWYgKHByaW50Y2hhciA9PSAnXG4nKQorICAgIGZwdXRzICggIjxMRj4iLCBzdGRvdXQpOworICBlbHNlCisgICAgcHV0Y2hhciAocHJpbnRjaGFyKTsKKyAgZmZsdXNoIChzdGRvdXQpOworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfY2JjX21hY19jaXBoZXIgKHZvaWQpCit7CisgIHN0cnVjdCB0dgorICB7CisgICAgaW50IGFsZ287CisgICAgY2hhciBrZXlbTUFYX0RBVEFfTEVOXTsKKyAgICB1bnNpZ25lZCBjaGFyIHBsYWludGV4dFtNQVhfREFUQV9MRU5dOworICAgIHNpemVfdCBwbGFpbnRleHRsZW47CisgICAgY2hhciBtYWNbTUFYX0RBVEFfTEVOXTsKKyAgfQorICB0dltdID0KKyAgICB7CisgICAgICB7IEdDUllfQ0lQSEVSX0FFUywKKwkiY2hpY2tlbiB0ZXJpeWFraSIsCisJIlRoaXMgaXMgYSBzYW1wbGUgcGxhaW50ZXh0IGZvciBDQkMgTUFDIG9mIHNpeHR5Zm91ciBieXRlcy4uLi4uLi4iLAorCTAsICJceDIzXHg4Zlx4NmRceGM3XHg1M1x4NmFceDYyXHg5N1x4MTFceGM0XHhhNVx4MTZceDQzXHhlYVx4YjBceGI2IiB9LAorICAgICAgeyBHQ1JZX0NJUEhFUl8zREVTLAorCSJhYmNkZWZnaEFCQ0RFRkdIMDEyMzQ1NjciLAorCSJUaGlzIGlzIGEgc2FtcGxlIHBsYWludGV4dCBmb3IgQ0JDIE1BQyBvZiBzaXh0eWZvdXIgYnl0ZXMuLi4uLi4uIiwKKwkwLCAiXHg1Y1x4MTFceGYwXHgwMVx4NDdceGJkXHgzZFx4M2EiIH0sCisgICAgICB7IEdDUllfQ0lQSEVSX0RFUywKKwkiYWJjZGVmZ2giLAorCSJUaGlzIGlzIGEgc2FtcGxlIHBsYWludGV4dCBmb3IgQ0JDIE1BQyBvZiBzaXh0eWZvdXIgYnl0ZXMuLi4uLi4uIiwKKwkwLCAiXHhmYVx4NGJceGRmXHg5ZFx4ZmFceGFiXHgwMVx4NzAiIH0KKyAgICB9OworICBnY3J5X2NpcGhlcl9oZF90IGhkOworICB1bnNpZ25lZCBjaGFyIG91dFtNQVhfREFUQV9MRU5dOworICBpbnQgaSwgYmxrbGVuLCBrZXlsZW47CisgIGdjcnlfZXJyb3JfdCBlcnIgPSAwOworCisgIGlmICh2ZXJib3NlKQorICAgIGZwcmludGYgKHN0ZGVyciwgIlN0YXJ0aW5nIENCQyBNQUMgY2hlY2tzLlxuIik7CisKKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAodHYpIC8gc2l6ZW9mICh0dlswXSk7IGkrKykKKyAgICB7CisgICAgICBpZiAoZ2NyeV9jaXBoZXJfdGVzdF9hbGdvICh0dltpXS5hbGdvKSAmJiBpbl9maXBzX21vZGUpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAodmVyYm9zZSkKKyAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAgYWxnb3JpdGhtICVkIG5vdCBhdmFpbGFibGUgaW4gZmlwcyBtb2RlXG4iLAorICAgICAgICAgICAgICAgICAgICAgdHZbaV0uYWxnbyk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgZXJyID0gZ2NyeV9jaXBoZXJfb3BlbiAoJmhkLAorCQkJICAgICAgdHZbaV0uYWxnbywKKwkJCSAgICAgIEdDUllfQ0lQSEVSX01PREVfQ0JDLCBHQ1JZX0NJUEhFUl9DQkNfTUFDKTsKKyAgICAgIGlmICghaGQpCisJeworCSAgZmFpbCAoImNiYy1tYWMgYWxnbyAlZCwgZ3JjeV9vcGVuX2NpcGhlciBmYWlsZWQ6ICVzXG4iLAorCQl0dltpXS5hbGdvLCBncGdfc3RyZXJyb3IgKGVycikpOworCSAgcmV0dXJuOworCX0KKworICAgICAgYmxrbGVuID0gZ2NyeV9jaXBoZXJfZ2V0X2FsZ29fYmxrbGVuKHR2W2ldLmFsZ28pOworICAgICAgaWYgKCFibGtsZW4pCisJeworCSAgZmFpbCAoImNiYy1tYWMgYWxnbyAlZCwgZ2NyeV9jaXBoZXJfZ2V0X2FsZ29fYmxrbGVuIGZhaWxlZFxuIiwKKwkJIHR2W2ldLmFsZ28pOworCSAgZ2NyeV9jaXBoZXJfY2xvc2UgKGhkKTsKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIGtleWxlbiA9IGdjcnlfY2lwaGVyX2dldF9hbGdvX2tleWxlbiAodHZbaV0uYWxnbyk7CisgICAgICBpZiAoIWtleWxlbikKKwl7CisJICBmYWlsICgiY2JjLW1hYyBhbGdvICVkLCBnY3J5X2NpcGhlcl9nZXRfYWxnb19rZXlsZW4gZmFpbGVkXG4iLAorCQl0dltpXS5hbGdvKTsKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIGVyciA9IGdjcnlfY2lwaGVyX3NldGtleSAoaGQsIHR2W2ldLmtleSwga2V5bGVuKTsKKyAgICAgIGlmIChlcnIpCisJeworCSAgZmFpbCAoImNiYy1tYWMgYWxnbyAlZCwgZ2NyeV9jaXBoZXJfc2V0a2V5IGZhaWxlZDogJXNcbiIsCisJCXR2W2ldLmFsZ28sIGdwZ19zdHJlcnJvciAoZXJyKSk7CisJICBnY3J5X2NpcGhlcl9jbG9zZSAoaGQpOworCSAgcmV0dXJuOworCX0KKworICAgICAgZXJyID0gZ2NyeV9jaXBoZXJfc2V0aXYgKGhkLCBOVUxMLCAwKTsKKyAgICAgIGlmIChlcnIpCisJeworCSAgZmFpbCAoImNiYy1tYWMgYWxnbyAlZCwgZ2NyeV9jaXBoZXJfc2V0aXYgZmFpbGVkOiAlc1xuIiwKKwkJdHZbaV0uYWxnbywgZ3BnX3N0cmVycm9yIChlcnIpKTsKKwkgIGdjcnlfY2lwaGVyX2Nsb3NlIChoZCk7CisJICByZXR1cm47CisJfQorCisgICAgICBpZiAodmVyYm9zZSkKKwlmcHJpbnRmIChzdGRlcnIsICIgIGNoZWNraW5nIENCQyBNQUMgZm9yICVzIFslaV1cbiIsIAorCQkgZ2NyeV9jaXBoZXJfYWxnb19uYW1lICh0dltpXS5hbGdvKSwKKwkJIHR2W2ldLmFsZ28pOworICAgICAgZXJyID0gZ2NyeV9jaXBoZXJfZW5jcnlwdCAoaGQsCisJCQkJIG91dCwgYmxrbGVuLAorCQkJCSB0dltpXS5wbGFpbnRleHQsCisJCQkJIHR2W2ldLnBsYWludGV4dGxlbiA/CisJCQkJIHR2W2ldLnBsYWludGV4dGxlbiA6CisJCQkJIHN0cmxlbiAoKGNoYXIqKXR2W2ldLnBsYWludGV4dCkpOworICAgICAgaWYgKGVycikKKwl7CisJICBmYWlsICgiY2JjLW1hYyBhbGdvICVkLCBnY3J5X2NpcGhlcl9lbmNyeXB0IGZhaWxlZDogJXNcbiIsCisJCXR2W2ldLmFsZ28sIGdwZ19zdHJlcnJvciAoZXJyKSk7CisJICBnY3J5X2NpcGhlcl9jbG9zZSAoaGQpOworCSAgcmV0dXJuOworCX0KKworI2lmIDAKKyAgICAgIHsKKwlpbnQgajsKKwlmb3IgKGogPSAwOyBqIDwgZ2NyeV9jaXBoZXJfZ2V0X2FsZ29fYmxrbGVuICh0dltpXS5hbGdvKTsgaisrKQorCSAgcHJpbnRmICgiXFx4JTAyeCIsIG91dFtqXSAmIDB4RkYpOworCXByaW50ZiAoIlxuIik7CisgICAgICB9CisjZW5kaWYKKworICAgICAgaWYgKG1lbWNtcCAodHZbaV0ubWFjLCBvdXQsIGJsa2xlbikpCisJZmFpbCAoImNiYy1tYWMgYWxnbyAlZCwgZW5jcnlwdCBtaXNtYXRjaCBlbnRyeSAlZFxuIiwgdHZbaV0uYWxnbywgaSk7CisKKyAgICAgIGdjcnlfY2lwaGVyX2Nsb3NlIChoZCk7CisgICAgfQorICBpZiAodmVyYm9zZSkKKyAgICBmcHJpbnRmIChzdGRlcnIsICJDb21wbGV0ZWQgQ0JDIE1BQyBjaGVja3MuXG4iKTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX2FlczEyOF9jYmNfY3RzX2NpcGhlciAodm9pZCkKK3sKKyAgY2hhciBrZXlbMTI4IC8gOF0gPSAiY2hpY2tlbiB0ZXJpeWFraSI7CisgIHVuc2lnbmVkIGNoYXIgcGxhaW50ZXh0W10gPQorICAgICJJIHdvdWxkIGxpa2UgdGhlIEdlbmVyYWwgR2F1J3MgQ2hpY2tlbiwgcGxlYXNlLCBhbmQgd29udG9uIHNvdXAuIjsKKyAgc3RydWN0IHR2CisgIHsKKyAgICB1bnNpZ25lZCBjaGFyIG91dFtNQVhfREFUQV9MRU5dOworICAgIGludCBpbmxlbjsKKyAgfSB0dltdID0KKyAgICB7CisgICAgICB7ICJceGM2XHgzNVx4MzVceDY4XHhmMlx4YmZceDhjXHhiNFx4ZDhceGE1XHg4MFx4MzZceDJkXHhhN1x4ZmZceDdmIgorCSJceDk3IiwKKwkxNyB9LAorICAgICAgeyAiXHhmY1x4MDBceDc4XHgzZVx4MGVceGZkXHhiMlx4YzFceGQ0XHg0NVx4ZDRceGM4XHhlZlx4ZjdceGVkXHgyMiIKKwkiXHg5N1x4NjhceDcyXHg2OFx4ZDZceGVjXHhjY1x4YzBceGMwXHg3Ylx4MjVceGUyXHg1ZVx4Y2ZceGU1IiwKKwkzMSB9LAorICAgICAgeyAiXHgzOVx4MzFceDI1XHgyM1x4YTdceDg2XHg2Mlx4ZDVceGJlXHg3Zlx4Y2JceGNjXHg5OFx4ZWJceGY1XHhhOCIKKwkiXHg5N1x4NjhceDcyXHg2OFx4ZDZceGVjXHhjY1x4YzBceGMwXHg3Ylx4MjVceGUyXHg1ZVx4Y2ZceGU1XHg4NCIsCisJMzIgfSwKKyAgICAgIHsgIlx4OTdceDY4XHg3Mlx4NjhceGQ2XHhlY1x4Y2NceGMwXHhjMFx4N2JceDI1XHhlMlx4NWVceGNmXHhlNVx4ODQiCisJIlx4YjNceGZmXHhmZFx4OTRceDBjXHgxNlx4YTFceDhjXHgxYlx4NTVceDQ5XHhkMlx4ZjhceDM4XHgwMlx4OWUiCisJIlx4MzlceDMxXHgyNVx4MjNceGE3XHg4Nlx4NjJceGQ1XHhiZVx4N2ZceGNiXHhjY1x4OThceGViXHhmNSIsCisJNDcgfSwKKyAgICAgIHsgIlx4OTdceDY4XHg3Mlx4NjhceGQ2XHhlY1x4Y2NceGMwXHhjMFx4N2JceDI1XHhlMlx4NWVceGNmXHhlNVx4ODQiCisJIlx4OWRceGFkXHg4Ylx4YmJceDk2XHhjNFx4Y2RceGMwXHgzYlx4YzFceDAzXHhlMVx4YTFceDk0XHhiYlx4ZDgiCisJIlx4MzlceDMxXHgyNVx4MjNceGE3XHg4Nlx4NjJceGQ1XHhiZVx4N2ZceGNiXHhjY1x4OThceGViXHhmNVx4YTgiLAorCTQ4IH0sCisgICAgICB7ICJceDk3XHg2OFx4NzJceDY4XHhkNlx4ZWNceGNjXHhjMFx4YzBceDdiXHgyNVx4ZTJceDVlXHhjZlx4ZTVceDg0IgorCSJceDM5XHgzMVx4MjVceDIzXHhhN1x4ODZceDYyXHhkNVx4YmVceDdmXHhjYlx4Y2NceDk4XHhlYlx4ZjVceGE4IgorCSJceDQ4XHgwN1x4ZWZceGU4XHgzNlx4ZWVceDg5XHhhNVx4MjZceDczXHgwZFx4YmNceDJmXHg3Ylx4YzhceDQwIgorCSJceDlkXHhhZFx4OGJceGJiXHg5Nlx4YzRceGNkXHhjMFx4M2JceGMxXHgwM1x4ZTFceGExXHg5NFx4YmJceGQ4IiwKKwk2NCB9LAorICAgIH07CisgIGdjcnlfY2lwaGVyX2hkX3QgaGQ7CisgIHVuc2lnbmVkIGNoYXIgb3V0W01BWF9EQVRBX0xFTl07CisgIGludCBpOworICBnY3J5X2Vycm9yX3QgZXJyID0gMDsKKworICBpZiAodmVyYm9zZSkKKyAgICBmcHJpbnRmIChzdGRlcnIsICJTdGFydGluZyBBRVMxMjggQ0JDIENUUyBjaGVja3MuXG4iKTsKKyAgZXJyID0gZ2NyeV9jaXBoZXJfb3BlbiAoJmhkLAorCQkJICBHQ1JZX0NJUEhFUl9BRVMsCisJCQkgIEdDUllfQ0lQSEVSX01PREVfQ0JDLCBHQ1JZX0NJUEhFUl9DQkNfQ1RTKTsKKyAgaWYgKGVycikKKyAgICB7CisgICAgICBmYWlsICgiYWVzLWNiYy1jdHMsIGdyY3lfb3Blbl9jaXBoZXIgZmFpbGVkOiAlc1xuIiwgZ3BnX3N0cmVycm9yIChlcnIpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgZXJyID0gZ2NyeV9jaXBoZXJfc2V0a2V5IChoZCwga2V5LCAxMjggLyA4KTsKKyAgaWYgKGVycikKKyAgICB7CisgICAgICBmYWlsICgiYWVzLWNiYy1jdHMsIGdjcnlfY2lwaGVyX3NldGtleSBmYWlsZWQ6ICVzXG4iLAorCSAgICBncGdfc3RyZXJyb3IgKGVycikpOworICAgICAgZ2NyeV9jaXBoZXJfY2xvc2UgKGhkKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAodHYpIC8gc2l6ZW9mICh0dlswXSk7IGkrKykKKyAgICB7CisgICAgICBlcnIgPSBnY3J5X2NpcGhlcl9zZXRpdiAoaGQsIE5VTEwsIDApOworICAgICAgaWYgKGVycikKKwl7CisJICBmYWlsICgiYWVzLWNiYy1jdHMsIGdjcnlfY2lwaGVyX3NldGl2IGZhaWxlZDogJXNcbiIsCisJCWdwZ19zdHJlcnJvciAoZXJyKSk7CisJICBnY3J5X2NpcGhlcl9jbG9zZSAoaGQpOworCSAgcmV0dXJuOworCX0KKworICAgICAgaWYgKHZlcmJvc2UpCisJZnByaW50ZiAoc3RkZXJyLCAiICBjaGVja2luZyBlbmNyeXB0aW9uIGZvciBsZW5ndGggJWlcbiIsIHR2W2ldLmlubGVuKTsKKyAgICAgIGVyciA9IGdjcnlfY2lwaGVyX2VuY3J5cHQgKGhkLCBvdXQsIE1BWF9EQVRBX0xFTiwKKwkJCQkgcGxhaW50ZXh0LCB0dltpXS5pbmxlbik7CisgICAgICBpZiAoZXJyKQorCXsKKwkgIGZhaWwgKCJhZXMtY2JjLWN0cywgZ2NyeV9jaXBoZXJfZW5jcnlwdCBmYWlsZWQ6ICVzXG4iLAorCQlncGdfc3RyZXJyb3IgKGVycikpOworCSAgZ2NyeV9jaXBoZXJfY2xvc2UgKGhkKTsKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIGlmIChtZW1jbXAgKHR2W2ldLm91dCwgb3V0LCB0dltpXS5pbmxlbikpCisJZmFpbCAoImFlcy1jYmMtY3RzLCBlbmNyeXB0IG1pc21hdGNoIGVudHJ5ICVkXG4iLCBpKTsKKworICAgICAgZXJyID0gZ2NyeV9jaXBoZXJfc2V0aXYgKGhkLCBOVUxMLCAwKTsKKyAgICAgIGlmIChlcnIpCisJeworCSAgZmFpbCAoImFlcy1jYmMtY3RzLCBnY3J5X2NpcGhlcl9zZXRpdiBmYWlsZWQ6ICVzXG4iLAorCQlncGdfc3RyZXJyb3IgKGVycikpOworCSAgZ2NyeV9jaXBoZXJfY2xvc2UgKGhkKTsKKwkgIHJldHVybjsKKwl9CisgICAgICBpZiAodmVyYm9zZSkKKwlmcHJpbnRmIChzdGRlcnIsICIgIGNoZWNraW5nIGRlY3J5cHRpb24gZm9yIGxlbmd0aCAlaVxuIiwgdHZbaV0uaW5sZW4pOworICAgICAgZXJyID0gZ2NyeV9jaXBoZXJfZGVjcnlwdCAoaGQsIG91dCwgdHZbaV0uaW5sZW4sIE5VTEwsIDApOworICAgICAgaWYgKGVycikKKwl7CisJICBmYWlsICgiYWVzLWNiYy1jdHMsIGdjcnlfY2lwaGVyX2RlY3J5cHQgZmFpbGVkOiAlc1xuIiwKKwkJZ3BnX3N0cmVycm9yIChlcnIpKTsKKwkgIGdjcnlfY2lwaGVyX2Nsb3NlIChoZCk7CisJICByZXR1cm47CisJfQorCisgICAgICBpZiAobWVtY21wIChwbGFpbnRleHQsIG91dCwgdHZbaV0uaW5sZW4pKQorCWZhaWwgKCJhZXMtY2JjLWN0cywgZGVjcnlwdCBtaXNtYXRjaCBlbnRyeSAlZFxuIiwgaSk7CisgICAgfQorCisgIGdjcnlfY2lwaGVyX2Nsb3NlIChoZCk7CisgIGlmICh2ZXJib3NlKQorICAgIGZwcmludGYgKHN0ZGVyciwgIkNvbXBsZXRlZCBBRVMxMjggQ0JDIENUUyBjaGVja3MuXG4iKTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX2N0cl9jaXBoZXIgKHZvaWQpCit7CisgIHN0cnVjdCB0dgorICB7CisgICAgaW50IGFsZ287CisgICAgY2hhciBrZXlbTUFYX0RBVEFfTEVOXTsKKyAgICBjaGFyIGN0cltNQVhfREFUQV9MRU5dOworICAgIHN0cnVjdCBkYXRhCisgICAgeworICAgICAgdW5zaWduZWQgY2hhciBwbGFpbnRleHRbTUFYX0RBVEFfTEVOXTsKKyAgICAgIGludCBpbmxlbjsKKyAgICAgIGNoYXIgb3V0W01BWF9EQVRBX0xFTl07CisgICAgfQorICAgIGRhdGFbTUFYX0RBVEFfTEVOXTsKKyAgfSB0dltdID0KKyAgICB7CisgICAgICAvKiBodHRwOi8vY3NyYy5uaXN0Lmdvdi9wdWJsaWNhdGlvbnMvbmlzdHB1YnMvODAwLTM4YS9zcDgwMC0zOGEucGRmICovCisgICAgICB7CUdDUllfQ0lQSEVSX0FFUywKKwkiXHgyYlx4N2VceDE1XHgxNlx4MjhceGFlXHhkMlx4YTZceGFiXHhmN1x4MTVceDg4XHgwOVx4Y2ZceDRmXHgzYyIsCisJIlx4ZjBceGYxXHhmMlx4ZjNceGY0XHhmNVx4ZjZceGY3XHhmOFx4ZjlceGZhXHhmYlx4ZmNceGZkXHhmZVx4ZmYiLAorCXsgeyAiXHg2Ylx4YzFceGJlXHhlMlx4MmVceDQwXHg5Zlx4OTZceGU5XHgzZFx4N2VceDExXHg3M1x4OTNceDE3XHgyYSIsCisJICAgIDE2LAorCSAgICAiXHg4N1x4NGRceDYxXHg5MVx4YjZceDIwXHhlM1x4MjZceDFiXHhlZlx4NjhceDY0XHg5OVx4MGRceGI2XHhjZSIgfSwKKwkgIHsgIlx4YWVceDJkXHg4YVx4NTdceDFlXHgwM1x4YWNceDljXHg5ZVx4YjdceDZmXHhhY1x4NDVceGFmXHg4ZVx4NTEiLAorCSAgICAxNiwKKwkgICAgIlx4OThceDA2XHhmNlx4NmJceDc5XHg3MFx4ZmRceGZmXHg4Nlx4MTdceDE4XHg3Ylx4YjlceGZmXHhmZFx4ZmYiIH0sCisJICB7ICJceDMwXHhjOFx4MWNceDQ2XHhhM1x4NWNceGU0XHgxMVx4ZTVceGZiXHhjMVx4MTlceDFhXHgwYVx4NTJceGVmIiwKKwkgICAgMTYsCisJICAgICJceDVhXHhlNFx4ZGZceDNlXHhkYlx4ZDVceGQzXHg1ZVx4NWJceDRmXHgwOVx4MDJceDBkXHhiMFx4M2VceGFiIiB9LAorCSAgeyAiXHhmNlx4OWZceDI0XHg0NVx4ZGZceDRmXHg5Ylx4MTdceGFkXHgyYlx4NDFceDdiXHhlNlx4NmNceDM3XHgxMCIsCisJICAgIDE2LAorCSAgICAiXHgxZVx4MDNceDFkXHhkYVx4MmZceGJlXHgwM1x4ZDFceDc5XHgyMVx4NzBceGEwXHhmM1x4MDBceDljXHhlZSIgfSwKKwl9CisgICAgICB9LAorICAgICAgewlHQ1JZX0NJUEhFUl9BRVMxOTIsCisJIlx4OGVceDczXHhiMFx4ZjdceGRhXHgwZVx4NjRceDUyXHhjOFx4MTBceGYzXHgyYiIKKwkiXHg4MFx4OTBceDc5XHhlNVx4NjJceGY4XHhlYVx4ZDJceDUyXHgyY1x4NmJceDdiIiwKKwkiXHhmMFx4ZjFceGYyXHhmM1x4ZjRceGY1XHhmNlx4ZjdceGY4XHhmOVx4ZmFceGZiXHhmY1x4ZmRceGZlXHhmZiIsCisJeyB7ICJceDZiXHhjMVx4YmVceGUyXHgyZVx4NDBceDlmXHg5Nlx4ZTlceDNkXHg3ZVx4MTFceDczXHg5M1x4MTdceDJhIiwKKwkgICAgMTYsCisJICAgICJceDFhXHhiY1x4OTNceDI0XHgxN1x4NTJceDFjXHhhMlx4NGZceDJiXHgwNFx4NTlceGZlXHg3ZVx4NmVceDBiIiB9LAorCSAgeyAiXHhhZVx4MmRceDhhXHg1N1x4MWVceDAzXHhhY1x4OWNceDllXHhiN1x4NmZceGFjXHg0NVx4YWZceDhlXHg1MSIsCisJICAgIDE2LAorCSAgICAiXHgwOVx4MDNceDM5XHhlY1x4MGFceGE2XHhmYVx4ZWZceGQ1XHhjY1x4YzJceGM2XHhmNFx4Y2VceDhlXHg5NCIgfSwKKwkgIHsgIlx4MzBceGM4XHgxY1x4NDZceGEzXHg1Y1x4ZTRceDExXHhlNVx4ZmJceGMxXHgxOVx4MWFceDBhXHg1Mlx4ZWYiLAorCSAgICAxNiwKKwkgICAgIlx4MWVceDM2XHhiMlx4NmJceGQxXHhlYlx4YzZceDcwXHhkMVx4YmRceDFkXHg2Nlx4NTZceDIwXHhhYlx4ZjciIH0sCisJICB7ICJceGY2XHg5Zlx4MjRceDQ1XHhkZlx4NGZceDliXHgxN1x4YWRceDJiXHg0MVx4N2JceGU2XHg2Y1x4MzdceDEwIiwKKwkgICAgMTYsCisJICAgICJceDRmXHg3OFx4YTdceGY2XHhkMlx4OThceDA5XHg1OFx4NWFceDk3XHhkYVx4ZWNceDU4XHhjNlx4YjBceDUwIiB9LAorCX0KKyAgICAgIH0sCisgICAgICB7CUdDUllfQ0lQSEVSX0FFUzI1NiwKKwkiXHg2MFx4M2RceGViXHgxMFx4MTVceGNhXHg3MVx4YmVceDJiXHg3M1x4YWVceGYwXHg4NVx4N2RceDc3XHg4MSIKKwkiXHgxZlx4MzVceDJjXHgwN1x4M2JceDYxXHgwOFx4ZDdceDJkXHg5OFx4MTBceGEzXHgwOVx4MTRceGRmXHhmNCIsCisJIlx4ZjBceGYxXHhmMlx4ZjNceGY0XHhmNVx4ZjZceGY3XHhmOFx4ZjlceGZhXHhmYlx4ZmNceGZkXHhmZVx4ZmYiLAorCXsgeyAiXHg2Ylx4YzFceGJlXHhlMlx4MmVceDQwXHg5Zlx4OTZceGU5XHgzZFx4N2VceDExXHg3M1x4OTNceDE3XHgyYSIsCisJICAgIDE2LAorCSAgICAiXHg2MFx4MWVceGMzXHgxM1x4NzdceDU3XHg4OVx4YTVceGI3XHhhN1x4ZjVceDA0XHhiYlx4ZjNceGQyXHgyOCIgfSwKKwkgIHsgIlx4YWVceDJkXHg4YVx4NTdceDFlXHgwM1x4YWNceDljXHg5ZVx4YjdceDZmXHhhY1x4NDVceGFmXHg4ZVx4NTEiLAorCSAgICAxNiwKKwkgICAgIlx4ZjRceDQzXHhlM1x4Y2FceDRkXHg2Mlx4YjVceDlhXHhjYVx4ODRceGU5XHg5MFx4Y2FceGNhXHhmNVx4YzUiIH0sCisJICB7ICJceDMwXHhjOFx4MWNceDQ2XHhhM1x4NWNceGU0XHgxMVx4ZTVceGZiXHhjMVx4MTlceDFhXHgwYVx4NTJceGVmIiwKKwkgICAgMTYsCisJICAgICJceDJiXHgwOVx4MzBceGRhXHhhMlx4M2RceGU5XHg0Y1x4ZThceDcwXHgxN1x4YmFceDJkXHg4NFx4OThceDhkIiB9LAorCSAgeyAiXHhmNlx4OWZceDI0XHg0NVx4ZGZceDRmXHg5Ylx4MTdceGFkXHgyYlx4NDFceDdiXHhlNlx4NmNceDM3XHgxMCIsCisJICAgIDE2LAorCSAgICAiXHhkZlx4YzlceGM1XHg4ZFx4YjZceDdhXHhhZFx4YTZceDEzXHhjMlx4ZGRceDA4XHg0NVx4NzlceDQxXHhhNiIgfQorCX0KKyAgICAgIH0KKyAgICB9OworICBnY3J5X2NpcGhlcl9oZF90IGhkZSwgaGRkOworICB1bnNpZ25lZCBjaGFyIG91dFtNQVhfREFUQV9MRU5dOworICBpbnQgaSwgaiwga2V5bGVuLCBibGtsZW47CisgIGdjcnlfZXJyb3JfdCBlcnIgPSAwOworCisgIGlmICh2ZXJib3NlKQorICAgIGZwcmludGYgKHN0ZGVyciwgIlN0YXJ0aW5nIENUUiBjaXBoZXIgY2hlY2tzLlxuIik7CisgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHR2KSAvIHNpemVvZiAodHZbMF0pOyBpKyspCisgICAgeworICAgICAgZXJyID0gZ2NyeV9jaXBoZXJfb3BlbiAoJmhkZSwgdHZbaV0uYWxnbywgR0NSWV9DSVBIRVJfTU9ERV9DVFIsIDApOworICAgICAgaWYgKCFlcnIpCisJZXJyID0gZ2NyeV9jaXBoZXJfb3BlbiAoJmhkZCwgdHZbaV0uYWxnbywgR0NSWV9DSVBIRVJfTU9ERV9DVFIsIDApOworICAgICAgaWYgKGVycikKKwl7CisJICBmYWlsICgiYWVzLWN0ciwgZ3JjeV9vcGVuX2NpcGhlciBmYWlsZWQ6ICVzXG4iLCBncGdfc3RyZXJyb3IgKGVycikpOworCSAgcmV0dXJuOworCX0KKworICAgICAga2V5bGVuID0gZ2NyeV9jaXBoZXJfZ2V0X2FsZ29fa2V5bGVuKHR2W2ldLmFsZ28pOworICAgICAgaWYgKCFrZXlsZW4pCisJeworCSAgZmFpbCAoImFlcy1jdHIsIGdjcnlfY2lwaGVyX2dldF9hbGdvX2tleWxlbiBmYWlsZWRcbiIpOworCSAgcmV0dXJuOworCX0KKworICAgICAgZXJyID0gZ2NyeV9jaXBoZXJfc2V0a2V5IChoZGUsIHR2W2ldLmtleSwga2V5bGVuKTsKKyAgICAgIGlmICghZXJyKQorCWVyciA9IGdjcnlfY2lwaGVyX3NldGtleSAoaGRkLCB0dltpXS5rZXksIGtleWxlbik7CisgICAgICBpZiAoZXJyKQorCXsKKwkgIGZhaWwgKCJhZXMtY3RyLCBnY3J5X2NpcGhlcl9zZXRrZXkgZmFpbGVkOiAlc1xuIiwKKwkJZ3BnX3N0cmVycm9yIChlcnIpKTsKKwkgIGdjcnlfY2lwaGVyX2Nsb3NlIChoZGUpOworCSAgZ2NyeV9jaXBoZXJfY2xvc2UgKGhkZCk7CisJICByZXR1cm47CisJfQorCisgICAgICBibGtsZW4gPSBnY3J5X2NpcGhlcl9nZXRfYWxnb19ibGtsZW4odHZbaV0uYWxnbyk7CisgICAgICBpZiAoIWJsa2xlbikKKwl7CisJICBmYWlsICgiYWVzLWN0ciwgZ2NyeV9jaXBoZXJfZ2V0X2FsZ29fYmxrbGVuIGZhaWxlZFxuIik7CisJICByZXR1cm47CisJfQorCisgICAgICBlcnIgPSBnY3J5X2NpcGhlcl9zZXRjdHIgKGhkZSwgdHZbaV0uY3RyLCBibGtsZW4pOworICAgICAgaWYgKCFlcnIpCisJZXJyID0gZ2NyeV9jaXBoZXJfc2V0Y3RyIChoZGQsIHR2W2ldLmN0ciwgYmxrbGVuKTsKKyAgICAgIGlmIChlcnIpCisJeworCSAgZmFpbCAoImFlcy1jdHIsIGdjcnlfY2lwaGVyX3NldGN0ciBmYWlsZWQ6ICVzXG4iLAorCQlncGdfc3RyZXJyb3IgKGVycikpOworCSAgZ2NyeV9jaXBoZXJfY2xvc2UgKGhkZSk7CisJICBnY3J5X2NpcGhlcl9jbG9zZSAoaGRkKTsKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIGlmICh2ZXJib3NlKQorCWZwcmludGYgKHN0ZGVyciwgIiAgY2hlY2tpbmcgQ1RSIG1vZGUgZm9yIGZvciAlcyBbJWldXG4iLCAKKwkJIGdjcnlfY2lwaGVyX2FsZ29fbmFtZSAodHZbaV0uYWxnbyksCisJCSB0dltpXS5hbGdvKTsKKyAgICAgIGZvciAoaiA9IDA7IHR2W2ldLmRhdGFbal0uaW5sZW47IGorKykKKwl7CisJICBlcnIgPSBnY3J5X2NpcGhlcl9lbmNyeXB0IChoZGUsIG91dCwgTUFYX0RBVEFfTEVOLAorCQkJCSAgICAgdHZbaV0uZGF0YVtqXS5wbGFpbnRleHQsCisJCQkJICAgICB0dltpXS5kYXRhW2pdLmlubGVuID09IC0xID8KKwkJCQkgICAgIHN0cmxlbiAoKGNoYXIqKXR2W2ldLmRhdGFbal0ucGxhaW50ZXh0KSA6CisJCQkJICAgICB0dltpXS5kYXRhW2pdLmlubGVuKTsKKwkgIGlmIChlcnIpCisJICAgIHsKKwkgICAgICBmYWlsICgiYWVzLWN0ciwgZ2NyeV9jaXBoZXJfZW5jcnlwdCAoJWQsICVkKSBmYWlsZWQ6ICVzXG4iLAorCQkgICAgaSwgaiwgZ3BnX3N0cmVycm9yIChlcnIpKTsKKwkgICAgICBnY3J5X2NpcGhlcl9jbG9zZSAoaGRlKTsKKwkgICAgICBnY3J5X2NpcGhlcl9jbG9zZSAoaGRkKTsKKwkgICAgICByZXR1cm47CisJICAgIH0KKworCSAgaWYgKG1lbWNtcCAodHZbaV0uZGF0YVtqXS5vdXQsIG91dCwgdHZbaV0uZGF0YVtqXS5pbmxlbikpCisJICAgIGZhaWwgKCJhZXMtY3RyLCBlbmNyeXB0IG1pc21hdGNoIGVudHJ5ICVkOiVkXG4iLCBpLCBqKTsKKworCSAgZXJyID0gZ2NyeV9jaXBoZXJfZGVjcnlwdCAoaGRkLCBvdXQsIHR2W2ldLmRhdGFbal0uaW5sZW4sIE5VTEwsIDApOworCSAgaWYgKGVycikKKwkgICAgeworCSAgICAgIGZhaWwgKCJhZXMtY3RyLCBnY3J5X2NpcGhlcl9kZWNyeXB0ICglZCwgJWQpIGZhaWxlZDogJXNcbiIsCisJCSAgICBpLCBqLCBncGdfc3RyZXJyb3IgKGVycikpOworCSAgICAgIGdjcnlfY2lwaGVyX2Nsb3NlIChoZGUpOworCSAgICAgIGdjcnlfY2lwaGVyX2Nsb3NlIChoZGQpOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCisJICBpZiAobWVtY21wICh0dltpXS5kYXRhW2pdLnBsYWludGV4dCwgb3V0LCB0dltpXS5kYXRhW2pdLmlubGVuKSkKKwkgICAgZmFpbCAoImFlcy1jdHIsIGRlY3J5cHQgbWlzbWF0Y2ggZW50cnkgJWQ6JWRcbiIsIGksIGopOworCX0KKworICAgICAgZ2NyeV9jaXBoZXJfY2xvc2UgKGhkZSk7CisgICAgICBnY3J5X2NpcGhlcl9jbG9zZSAoaGRkKTsKKyAgICB9CisgIGlmICh2ZXJib3NlKQorICAgIGZwcmludGYgKHN0ZGVyciwgIkNvbXBsZXRlZCBDVFIgY2lwaGVyIGNoZWNrcy5cbiIpOworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfY2ZiX2NpcGhlciAodm9pZCkKK3sKKyAgc3RydWN0IHR2CisgIHsKKyAgICBpbnQgYWxnbzsKKyAgICBjaGFyIGtleVtNQVhfREFUQV9MRU5dOworICAgIGNoYXIgaXZbTUFYX0RBVEFfTEVOXTsKKyAgICBzdHJ1Y3QgZGF0YQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIgcGxhaW50ZXh0W01BWF9EQVRBX0xFTl07CisgICAgICBpbnQgaW5sZW47CisgICAgICBjaGFyIG91dFtNQVhfREFUQV9MRU5dOworICAgIH0KKyAgICBkYXRhW01BWF9EQVRBX0xFTl07CisgIH0gdHZbXSA9CisgICAgeworICAgICAgLyogaHR0cDovL2NzcmMubmlzdC5nb3YvcHVibGljYXRpb25zL25pc3RwdWJzLzgwMC0zOGEvc3A4MDAtMzhhLnBkZiAqLworICAgICAgeyBHQ1JZX0NJUEhFUl9BRVMsCisgICAgICAgICJceDJiXHg3ZVx4MTVceDE2XHgyOFx4YWVceGQyXHhhNlx4YWJceGY3XHgxNVx4ODhceDA5XHhjZlx4NGZceDNjIiwKKyAgICAgICAgIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3XHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiLAorICAgICAgICB7IHsgIlx4NmJceGMxXHhiZVx4ZTJceDJlXHg0MFx4OWZceDk2XHhlOVx4M2RceDdlXHgxMVx4NzNceDkzXHgxN1x4MmEiLAorICAgICAgICAgICAgMTYsCisgICAgICAgICAgICAiXHgzYlx4M2ZceGQ5XHgyZVx4YjdceDJkXHhhZFx4MjBceDMzXHgzNFx4NDlceGY4XHhlOFx4M2NceGZiXHg0YSIgfSwKKyAgICAgICAgICB7ICJceGFlXHgyZFx4OGFceDU3XHgxZVx4MDNceGFjXHg5Y1x4OWVceGI3XHg2Zlx4YWNceDQ1XHhhZlx4OGVceDUxIiwKKyAgICAgICAgICAgIDE2LAorICAgICAgICAgICAgIlx4YzhceGE2XHg0NVx4MzdceGEwXHhiM1x4YTlceDNmXHhjZFx4ZTNceGNkXHhhZFx4OWZceDFjXHhlNVx4OGIifSwKKyAgICAgICAgICB7ICJceDMwXHhjOFx4MWNceDQ2XHhhM1x4NWNceGU0XHgxMVx4ZTVceGZiXHhjMVx4MTlceDFhXHgwYVx4NTJceGVmIiwKKyAgICAgICAgICAgIDE2LAorICAgICAgICAgICAgIlx4MjZceDc1XHgxZlx4NjdceGEzXHhjYlx4YjFceDQwXHhiMVx4ODBceDhjXHhmMVx4ODdceGE0XHhmNFx4ZGYiIH0sCisgICAgICAgICAgeyAiXHhmNlx4OWZceDI0XHg0NVx4ZGZceDRmXHg5Ylx4MTdceGFkXHgyYlx4NDFceDdiXHhlNlx4NmNceDM3XHgxMCIsCisgICAgICAgICAgICAxNiwKKyAgICAgICAgICAgICJceGMwXHg0Ylx4MDVceDM1XHg3Y1x4NWRceDFjXHgwZVx4ZWFceGM0XHhjNlx4NmZceDlmXHhmN1x4ZjJceGU2IiB9LAorICAgICAgICB9CisgICAgICB9LAorICAgICAgeyBHQ1JZX0NJUEhFUl9BRVMxOTIsCisgICAgICAgICJceDhlXHg3M1x4YjBceGY3XHhkYVx4MGVceDY0XHg1Mlx4YzhceDEwXHhmM1x4MmIiCisgICAgICAgICJceDgwXHg5MFx4NzlceGU1XHg2Mlx4ZjhceGVhXHhkMlx4NTJceDJjXHg2Ylx4N2IiLAorICAgICAgICAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDdceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIsCisgICAgICAgIHsgeyAiXHg2Ylx4YzFceGJlXHhlMlx4MmVceDQwXHg5Zlx4OTZceGU5XHgzZFx4N2VceDExXHg3M1x4OTNceDE3XHgyYSIsCisgICAgICAgICAgICAxNiwKKyAgICAgICAgICAgICJceGNkXHhjOFx4MGRceDZmXHhkZFx4ZjFceDhjXHhhYlx4MzRceGMyXHg1OVx4MDlceGM5XHg5YVx4NDFceDc0IiB9LAorICAgICAgICAgIHsgIlx4YWVceDJkXHg4YVx4NTdceDFlXHgwM1x4YWNceDljXHg5ZVx4YjdceDZmXHhhY1x4NDVceGFmXHg4ZVx4NTEiLAorICAgICAgICAgICAgMTYsCisgICAgICAgICAgICAiXHg2N1x4Y2VceDdmXHg3Zlx4ODFceDE3XHgzNlx4MjFceDk2XHgxYVx4MmJceDcwXHgxN1x4MWRceDNkXHg3YSIgfSwKKyAgICAgICAgICB7ICJceDMwXHhjOFx4MWNceDQ2XHhhM1x4NWNceGU0XHgxMVx4ZTVceGZiXHhjMVx4MTlceDFhXHgwYVx4NTJceGVmIiwKKyAgICAgICAgICAgIDE2LAorICAgICAgICAgICAgIlx4MmVceDFlXHg4YVx4MWRceGQ1XHg5Ylx4ODhceGIxXHhjOFx4ZTZceDBmXHhlZFx4MWVceGZhXHhjNFx4YzkiIH0sCisgICAgICAgICAgeyAiXHhmNlx4OWZceDI0XHg0NVx4ZGZceDRmXHg5Ylx4MTdceGFkXHgyYlx4NDFceDdiXHhlNlx4NmNceDM3XHgxMCIsCisgICAgICAgICAgICAxNiwKKyAgICAgICAgICAgICJceGMwXHg1Zlx4OWZceDljXHhhOVx4ODNceDRmXHhhMFx4NDJceGFlXHg4Zlx4YmFceDU4XHg0Ylx4MDlceGZmIiB9LAorICAgICAgICB9CisgICAgICB9LAorICAgICAgeyBHQ1JZX0NJUEhFUl9BRVMyNTYsCisgICAgICAgICJceDYwXHgzZFx4ZWJceDEwXHgxNVx4Y2FceDcxXHhiZVx4MmJceDczXHhhZVx4ZjBceDg1XHg3ZFx4NzdceDgxIgorICAgICAgICAiXHgxZlx4MzVceDJjXHgwN1x4M2JceDYxXHgwOFx4ZDdceDJkXHg5OFx4MTBceGEzXHgwOVx4MTRceGRmXHhmNCIsCisgICAgICAgICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwN1x4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIiwKKyAgICAgICAgeyB7ICJceDZiXHhjMVx4YmVceGUyXHgyZVx4NDBceDlmXHg5Nlx4ZTlceDNkXHg3ZVx4MTFceDczXHg5M1x4MTdceDJhIiwKKyAgICAgICAgICAgIDE2LAorICAgICAgICAgICAgIlx4ZGNceDdlXHg4NFx4YmZceGRhXHg3OVx4MTZceDRiXHg3ZVx4Y2RceDg0XHg4Nlx4OThceDVkXHgzOFx4NjAiIH0sCisgICAgICAgICAgeyAiXHhhZVx4MmRceDhhXHg1N1x4MWVceDAzXHhhY1x4OWNceDllXHhiN1x4NmZceGFjXHg0NVx4YWZceDhlXHg1MSIsCisgICAgICAgICAgICAxNiwKKyAgICAgICAgICAgICJceDM5XHhmZlx4ZWRceDE0XHgzYlx4MjhceGIxXHhjOFx4MzJceDExXHgzY1x4NjNceDMxXHhlNVx4NDBceDdiIiB9LAorICAgICAgICAgIHsgIlx4MzBceGM4XHgxY1x4NDZceGEzXHg1Y1x4ZTRceDExXHhlNVx4ZmJceGMxXHgxOVx4MWFceDBhXHg1Mlx4ZWYiLAorICAgICAgICAgICAgMTYsCisgICAgICAgICAgICAiXHhkZlx4MTBceDEzXHgyNFx4MTVceGU1XHg0Ylx4OTJceGExXHgzZVx4ZDBceGE4XHgyNlx4N2FceGUyXHhmOSIgfSwKKyAgICAgICAgICB7ICJceGY2XHg5Zlx4MjRceDQ1XHhkZlx4NGZceDliXHgxN1x4YWRceDJiXHg0MVx4N2JceGU2XHg2Y1x4MzdceDEwIiwKKyAgICAgICAgICAgIDE2LAorICAgICAgICAgICAgIlx4NzVceGEzXHg4NVx4NzRceDFhXHhiOVx4Y2VceGY4XHgyMFx4MzFceDYyXHgzZFx4NTVceGIxXHhlNFx4NzEiIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH07CisgIGdjcnlfY2lwaGVyX2hkX3QgaGRlLCBoZGQ7CisgIHVuc2lnbmVkIGNoYXIgb3V0W01BWF9EQVRBX0xFTl07CisgIGludCBpLCBqLCBrZXlsZW4sIGJsa2xlbjsKKyAgZ2NyeV9lcnJvcl90IGVyciA9IDA7CisKKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAodHYpIC8gc2l6ZW9mICh0dlswXSk7IGkrKykKKyAgICB7CisgICAgICBlcnIgPSBnY3J5X2NpcGhlcl9vcGVuICgmaGRlLCB0dltpXS5hbGdvLCBHQ1JZX0NJUEhFUl9NT0RFX0NGQiwgMCk7CisgICAgICBpZiAoIWVycikKKyAgICAgICAgZXJyID0gZ2NyeV9jaXBoZXJfb3BlbiAoJmhkZCwgdHZbaV0uYWxnbywgR0NSWV9DSVBIRVJfTU9ERV9DRkIsIDApOworICAgICAgaWYgKGVycikKKyAgICAgICAgeworICAgICAgICAgIGZhaWwgKCJhZXMtY2ZiLCBncmN5X29wZW5fY2lwaGVyIGZhaWxlZDogJXNcbiIsIGdwZ19zdHJlcnJvciAoZXJyKSk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgIGtleWxlbiA9IGdjcnlfY2lwaGVyX2dldF9hbGdvX2tleWxlbih0dltpXS5hbGdvKTsKKyAgICAgIGlmICgha2V5bGVuKQorICAgICAgICB7CisgICAgICAgICAgZmFpbCAoImFlcy1jZmIsIGdjcnlfY2lwaGVyX2dldF9hbGdvX2tleWxlbiBmYWlsZWRcbiIpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICBlcnIgPSBnY3J5X2NpcGhlcl9zZXRrZXkgKGhkZSwgdHZbaV0ua2V5LCBrZXlsZW4pOworICAgICAgaWYgKCFlcnIpCisgICAgICAgIGVyciA9IGdjcnlfY2lwaGVyX3NldGtleSAoaGRkLCB0dltpXS5rZXksIGtleWxlbik7CisgICAgICBpZiAoZXJyKQorICAgICAgICB7CisgICAgICAgICAgZmFpbCAoImFlcy1jZmIsIGdjcnlfY2lwaGVyX3NldGtleSBmYWlsZWQ6ICVzXG4iLAorICAgICAgICAgICAgICAgIGdwZ19zdHJlcnJvciAoZXJyKSk7CisgICAgICAgICAgZ2NyeV9jaXBoZXJfY2xvc2UgKGhkZSk7CisgICAgICAgICAgZ2NyeV9jaXBoZXJfY2xvc2UgKGhkZCk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgIGJsa2xlbiA9IGdjcnlfY2lwaGVyX2dldF9hbGdvX2Jsa2xlbih0dltpXS5hbGdvKTsKKyAgICAgIGlmICghYmxrbGVuKQorICAgICAgICB7CisgICAgICAgICAgZmFpbCAoImFlcy1jZmIsIGdjcnlfY2lwaGVyX2dldF9hbGdvX2Jsa2xlbiBmYWlsZWRcbiIpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICBlcnIgPSBnY3J5X2NpcGhlcl9zZXRpdiAoaGRlLCB0dltpXS5pdiwgYmxrbGVuKTsKKyAgICAgIGlmICghZXJyKQorICAgICAgICBlcnIgPSBnY3J5X2NpcGhlcl9zZXRpdiAoaGRkLCB0dltpXS5pdiwgYmxrbGVuKTsKKyAgICAgIGlmIChlcnIpCisgICAgICAgIHsKKyAgICAgICAgICBmYWlsICgiYWVzLWNmYiwgZ2NyeV9jaXBoZXJfc2V0aXYgZmFpbGVkOiAlc1xuIiwKKyAgICAgICAgICAgICAgICBncGdfc3RyZXJyb3IgKGVycikpOworICAgICAgICAgIGdjcnlfY2lwaGVyX2Nsb3NlIChoZGUpOworICAgICAgICAgIGdjcnlfY2lwaGVyX2Nsb3NlIChoZGQpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICBmb3IgKGogPSAwOyB0dltpXS5kYXRhW2pdLmlubGVuOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICBlcnIgPSBnY3J5X2NpcGhlcl9lbmNyeXB0IChoZGUsIG91dCwgTUFYX0RBVEFfTEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR2W2ldLmRhdGFbal0ucGxhaW50ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR2W2ldLmRhdGFbal0uaW5sZW4pOworICAgICAgICAgIGlmIChlcnIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZhaWwgKCJhZXMtY2ZiLCBnY3J5X2NpcGhlcl9lbmNyeXB0ICglZCwgJWQpIGZhaWxlZDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIGksIGosIGdwZ19zdHJlcnJvciAoZXJyKSk7CisgICAgICAgICAgICAgIGdjcnlfY2lwaGVyX2Nsb3NlIChoZGUpOworICAgICAgICAgICAgICBnY3J5X2NpcGhlcl9jbG9zZSAoaGRkKTsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKG1lbWNtcCAodHZbaV0uZGF0YVtqXS5vdXQsIG91dCwgdHZbaV0uZGF0YVtqXS5pbmxlbikpIHsKKyAgICAgICAgICAgIGZhaWwgKCJhZXMtY2ZiLCBlbmNyeXB0IG1pc21hdGNoIGVudHJ5ICVkOiVkXG4iLCBpLCBqKTsKKwkgIH0KKyAgICAgICAgICBlcnIgPSBnY3J5X2NpcGhlcl9kZWNyeXB0IChoZGQsIG91dCwgdHZbaV0uZGF0YVtqXS5pbmxlbiwgTlVMTCwgMCk7CisgICAgICAgICAgaWYgKGVycikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZmFpbCAoImFlcy1jZmIsIGdjcnlfY2lwaGVyX2RlY3J5cHQgKCVkLCAlZCkgZmFpbGVkOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgaSwgaiwgZ3BnX3N0cmVycm9yIChlcnIpKTsKKyAgICAgICAgICAgICAgZ2NyeV9jaXBoZXJfY2xvc2UgKGhkZSk7CisgICAgICAgICAgICAgIGdjcnlfY2lwaGVyX2Nsb3NlIChoZGQpOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAobWVtY21wICh0dltpXS5kYXRhW2pdLnBsYWludGV4dCwgb3V0LCB0dltpXS5kYXRhW2pdLmlubGVuKSkKKyAgICAgICAgICAgIGZhaWwgKCJhZXMtY2ZiLCBkZWNyeXB0IG1pc21hdGNoIGVudHJ5ICVkOiVkXG4iLCBpLCBqKTsKKyAgICAgICAgfQorCisgICAgICBnY3J5X2NpcGhlcl9jbG9zZSAoaGRlKTsKKyAgICAgIGdjcnlfY2lwaGVyX2Nsb3NlIChoZGQpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2NoZWNrX29mYl9jaXBoZXIgKHZvaWQpCit7CisgIHN0cnVjdCB0dgorICB7CisgICAgaW50IGFsZ287CisgICAgY2hhciBrZXlbTUFYX0RBVEFfTEVOXTsKKyAgICBjaGFyIGl2W01BWF9EQVRBX0xFTl07CisgICAgc3RydWN0IGRhdGEKKyAgICB7CisgICAgICB1bnNpZ25lZCBjaGFyIHBsYWludGV4dFtNQVhfREFUQV9MRU5dOworICAgICAgaW50IGlubGVuOworICAgICAgY2hhciBvdXRbTUFYX0RBVEFfTEVOXTsKKyAgICB9CisgICAgZGF0YVtNQVhfREFUQV9MRU5dOworICB9IHR2W10gPQorICAgIHsKKyAgICAgIC8qIGh0dHA6Ly9jc3JjLm5pc3QuZ292L3B1YmxpY2F0aW9ucy9uaXN0cHVicy84MDAtMzhhL3NwODAwLTM4YS5wZGYgKi8KKyAgICAgIHsgR0NSWV9DSVBIRVJfQUVTLAorICAgICAgICAiXHgyYlx4N2VceDE1XHgxNlx4MjhceGFlXHhkMlx4YTZceGFiXHhmN1x4MTVceDg4XHgwOVx4Y2ZceDRmXHgzYyIsCisgICAgICAgICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwN1x4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIiwKKyAgICAgICAgeyB7ICJceDZiXHhjMVx4YmVceGUyXHgyZVx4NDBceDlmXHg5Nlx4ZTlceDNkXHg3ZVx4MTFceDczXHg5M1x4MTdceDJhIiwKKyAgICAgICAgICAgIDE2LAorICAgICAgICAgICAgIlx4M2JceDNmXHhkOVx4MmVceGI3XHgyZFx4YWRceDIwXHgzM1x4MzRceDQ5XHhmOFx4ZThceDNjXHhmYlx4NGEiIH0sCisgICAgICAgICAgeyAiXHhhZVx4MmRceDhhXHg1N1x4MWVceDAzXHhhY1x4OWNceDllXHhiN1x4NmZceGFjXHg0NVx4YWZceDhlXHg1MSIsCisgICAgICAgICAgICAxNiwKKyAgICAgICAgICAgICJceDc3XHg4OVx4NTBceDhkXHgxNlx4OTFceDhmXHgwM1x4ZjVceDNjXHg1Mlx4ZGFceGM1XHg0ZVx4ZDhceDI1In0sCisgICAgICAgICAgeyAiXHgzMFx4YzhceDFjXHg0Nlx4YTNceDVjXHhlNFx4MTFceGU1XHhmYlx4YzFceDE5XHgxYVx4MGFceDUyXHhlZiIsCisgICAgICAgICAgICAxNiwKKyAgICAgICAgICAgICJceDk3XHg0MFx4MDVceDFlXHg5Y1x4NWZceGVjXHhmNlx4NDNceDQ0XHhmN1x4YThceDIyXHg2MFx4ZWRceGNjIiB9LAorICAgICAgICAgIHsgIlx4ZjZceDlmXHgyNFx4NDVceGRmXHg0Zlx4OWJceDE3XHhhZFx4MmJceDQxXHg3Ylx4ZTZceDZjXHgzN1x4MTAiLAorICAgICAgICAgICAgMTYsCisgICAgICAgICAgICAiXHgzMFx4NGNceDY1XHgyOFx4ZjZceDU5XHhjN1x4NzhceDY2XHhhNVx4MTBceGQ5XHhjMVx4ZDZceGFlXHg1ZSIgfSwKKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgIHsgR0NSWV9DSVBIRVJfQUVTMTkyLAorICAgICAgICAiXHg4ZVx4NzNceGIwXHhmN1x4ZGFceDBlXHg2NFx4NTJceGM4XHgxMFx4ZjNceDJiIgorICAgICAgICAiXHg4MFx4OTBceDc5XHhlNVx4NjJceGY4XHhlYVx4ZDJceDUyXHgyY1x4NmJceDdiIiwKKyAgICAgICAgIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3XHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiLAorICAgICAgICB7IHsgIlx4NmJceGMxXHhiZVx4ZTJceDJlXHg0MFx4OWZceDk2XHhlOVx4M2RceDdlXHgxMVx4NzNceDkzXHgxN1x4MmEiLAorICAgICAgICAgICAgMTYsCisgICAgICAgICAgICAiXHhjZFx4YzhceDBkXHg2Zlx4ZGRceGYxXHg4Y1x4YWJceDM0XHhjMlx4NTlceDA5XHhjOVx4OWFceDQxXHg3NCIgfSwKKyAgICAgICAgICB7ICJceGFlXHgyZFx4OGFceDU3XHgxZVx4MDNceGFjXHg5Y1x4OWVceGI3XHg2Zlx4YWNceDQ1XHhhZlx4OGVceDUxIiwKKyAgICAgICAgICAgIDE2LAorICAgICAgICAgICAgIlx4ZmNceGMyXHg4Ylx4OGRceDRjXHg2M1x4ODNceDdjXHgwOVx4ZThceDE3XHgwMFx4YzFceDEwXHgwNFx4MDEiIH0sCisgICAgICAgICAgeyAiXHgzMFx4YzhceDFjXHg0Nlx4YTNceDVjXHhlNFx4MTFceGU1XHhmYlx4YzFceDE5XHgxYVx4MGFceDUyXHhlZiIsCisgICAgICAgICAgICAxNiwKKyAgICAgICAgICAgICJceDhkXHg5YVx4OWFceGVhXHhjMFx4ZjZceDU5XHg2Zlx4NTVceDljXHg2ZFx4NGRceGFmXHg1OVx4YTVceGYyIiB9LAorICAgICAgICAgIHsgIlx4ZjZceDlmXHgyNFx4NDVceGRmXHg0Zlx4OWJceDE3XHhhZFx4MmJceDQxXHg3Ylx4ZTZceDZjXHgzN1x4MTAiLAorICAgICAgICAgICAgMTYsCisgICAgICAgICAgICAiXHg2ZFx4OWZceDIwXHgwOFx4NTdceGNhXHg2Y1x4M2VceDljXHhhY1x4NTJceDRiXHhkOVx4YWNceGM5XHgyYSIgfSwKKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgIHsgR0NSWV9DSVBIRVJfQUVTMjU2LAorICAgICAgICAiXHg2MFx4M2RceGViXHgxMFx4MTVceGNhXHg3MVx4YmVceDJiXHg3M1x4YWVceGYwXHg4NVx4N2RceDc3XHg4MSIKKyAgICAgICAgIlx4MWZceDM1XHgyY1x4MDdceDNiXHg2MVx4MDhceGQ3XHgyZFx4OThceDEwXHhhM1x4MDlceDE0XHhkZlx4ZjQiLAorICAgICAgICAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDdceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIsCisgICAgICAgIHsgeyAiXHg2Ylx4YzFceGJlXHhlMlx4MmVceDQwXHg5Zlx4OTZceGU5XHgzZFx4N2VceDExXHg3M1x4OTNceDE3XHgyYSIsCisgICAgICAgICAgICAxNiwKKyAgICAgICAgICAgICJceGRjXHg3ZVx4ODRceGJmXHhkYVx4NzlceDE2XHg0Ylx4N2VceGNkXHg4NFx4ODZceDk4XHg1ZFx4MzhceDYwIiB9LAorICAgICAgICAgIHsgIlx4YWVceDJkXHg4YVx4NTdceDFlXHgwM1x4YWNceDljXHg5ZVx4YjdceDZmXHhhY1x4NDVceGFmXHg4ZVx4NTEiLAorICAgICAgICAgICAgMTYsCisgICAgICAgICAgICAiXHg0Zlx4ZWJceGRjXHg2N1x4NDBceGQyXHgwYlx4M2FceGM4XHg4Zlx4NmFceGQ4XHgyYVx4NGZceGIwXHg4ZCIgfSwKKyAgICAgICAgICB7ICJceDMwXHhjOFx4MWNceDQ2XHhhM1x4NWNceGU0XHgxMVx4ZTVceGZiXHhjMVx4MTlceDFhXHgwYVx4NTJceGVmIiwKKyAgICAgICAgICAgIDE2LAorICAgICAgICAgICAgIlx4NzFceGFiXHg0N1x4YTBceDg2XHhlOFx4NmVceGVkXHhmM1x4OWRceDFjXHg1Ylx4YmFceDk3XHhjNFx4MDgiIH0sCisgICAgICAgICAgeyAiXHhmNlx4OWZceDI0XHg0NVx4ZGZceDRmXHg5Ylx4MTdceGFkXHgyYlx4NDFceDdiXHhlNlx4NmNceDM3XHgxMCIsCisgICAgICAgICAgICAxNiwKKyAgICAgICAgICAgICJceDAxXHgyNlx4MTRceDFkXHg2N1x4ZjNceDdiXHhlOFx4NTNceDhmXHg1YVx4OGJceGU3XHg0MFx4ZTRceDg0IiB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9OworICBnY3J5X2NpcGhlcl9oZF90IGhkZSwgaGRkOworICB1bnNpZ25lZCBjaGFyIG91dFtNQVhfREFUQV9MRU5dOworICBpbnQgaSwgaiwga2V5bGVuLCBibGtsZW47CisgIGdjcnlfZXJyb3JfdCBlcnIgPSAwOworCisgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHR2KSAvIHNpemVvZiAodHZbMF0pOyBpKyspCisgICAgeworICAgICAgZXJyID0gZ2NyeV9jaXBoZXJfb3BlbiAoJmhkZSwgdHZbaV0uYWxnbywgR0NSWV9DSVBIRVJfTU9ERV9PRkIsIDApOworICAgICAgaWYgKCFlcnIpCisgICAgICAgIGVyciA9IGdjcnlfY2lwaGVyX29wZW4gKCZoZGQsIHR2W2ldLmFsZ28sIEdDUllfQ0lQSEVSX01PREVfT0ZCLCAwKTsKKyAgICAgIGlmIChlcnIpCisgICAgICAgIHsKKyAgICAgICAgICBmYWlsICgiYWVzLW9mYiwgZ3JjeV9vcGVuX2NpcGhlciBmYWlsZWQ6ICVzXG4iLCBncGdfc3RyZXJyb3IgKGVycikpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICBrZXlsZW4gPSBnY3J5X2NpcGhlcl9nZXRfYWxnb19rZXlsZW4odHZbaV0uYWxnbyk7CisgICAgICBpZiAoIWtleWxlbikKKyAgICAgICAgeworICAgICAgICAgIGZhaWwgKCJhZXMtb2ZiLCBnY3J5X2NpcGhlcl9nZXRfYWxnb19rZXlsZW4gZmFpbGVkXG4iKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgZXJyID0gZ2NyeV9jaXBoZXJfc2V0a2V5IChoZGUsIHR2W2ldLmtleSwga2V5bGVuKTsKKyAgICAgIGlmICghZXJyKQorICAgICAgICBlcnIgPSBnY3J5X2NpcGhlcl9zZXRrZXkgKGhkZCwgdHZbaV0ua2V5LCBrZXlsZW4pOworICAgICAgaWYgKGVycikKKyAgICAgICAgeworICAgICAgICAgIGZhaWwgKCJhZXMtb2ZiLCBnY3J5X2NpcGhlcl9zZXRrZXkgZmFpbGVkOiAlc1xuIiwKKyAgICAgICAgICAgICAgICBncGdfc3RyZXJyb3IgKGVycikpOworICAgICAgICAgIGdjcnlfY2lwaGVyX2Nsb3NlIChoZGUpOworICAgICAgICAgIGdjcnlfY2lwaGVyX2Nsb3NlIChoZGQpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICBibGtsZW4gPSBnY3J5X2NpcGhlcl9nZXRfYWxnb19ibGtsZW4odHZbaV0uYWxnbyk7CisgICAgICBpZiAoIWJsa2xlbikKKyAgICAgICAgeworICAgICAgICAgIGZhaWwgKCJhZXMtb2ZiLCBnY3J5X2NpcGhlcl9nZXRfYWxnb19ibGtsZW4gZmFpbGVkXG4iKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgZXJyID0gZ2NyeV9jaXBoZXJfc2V0aXYgKGhkZSwgdHZbaV0uaXYsIGJsa2xlbik7CisgICAgICBpZiAoIWVycikKKyAgICAgICAgZXJyID0gZ2NyeV9jaXBoZXJfc2V0aXYgKGhkZCwgdHZbaV0uaXYsIGJsa2xlbik7CisgICAgICBpZiAoZXJyKQorICAgICAgICB7CisgICAgICAgICAgZmFpbCAoImFlcy1vZmIsIGdjcnlfY2lwaGVyX3NldGl2IGZhaWxlZDogJXNcbiIsCisgICAgICAgICAgICAgICAgZ3BnX3N0cmVycm9yIChlcnIpKTsKKyAgICAgICAgICBnY3J5X2NpcGhlcl9jbG9zZSAoaGRlKTsKKyAgICAgICAgICBnY3J5X2NpcGhlcl9jbG9zZSAoaGRkKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgZm9yIChqID0gMDsgdHZbaV0uZGF0YVtqXS5pbmxlbjsgaisrKQorICAgICAgICB7CisgICAgICAgICAgZXJyID0gZ2NyeV9jaXBoZXJfZW5jcnlwdCAoaGRlLCBvdXQsIE1BWF9EQVRBX0xFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dltpXS5kYXRhW2pdLnBsYWludGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dltpXS5kYXRhW2pdLmlubGVuKTsKKyAgICAgICAgICBpZiAoZXJyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmYWlsICgiYWVzLW9mYiwgZ2NyeV9jaXBoZXJfZW5jcnlwdCAoJWQsICVkKSBmYWlsZWQ6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICBpLCBqLCBncGdfc3RyZXJyb3IgKGVycikpOworICAgICAgICAgICAgICBnY3J5X2NpcGhlcl9jbG9zZSAoaGRlKTsKKyAgICAgICAgICAgICAgZ2NyeV9jaXBoZXJfY2xvc2UgKGhkZCk7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChtZW1jbXAgKHR2W2ldLmRhdGFbal0ub3V0LCBvdXQsIHR2W2ldLmRhdGFbal0uaW5sZW4pKQorICAgICAgICAgICAgZmFpbCAoImFlcy1vZmIsIGVuY3J5cHQgbWlzbWF0Y2ggZW50cnkgJWQ6JWRcbiIsIGksIGopOworCisgICAgICAgICAgZXJyID0gZ2NyeV9jaXBoZXJfZGVjcnlwdCAoaGRkLCBvdXQsIHR2W2ldLmRhdGFbal0uaW5sZW4sIE5VTEwsIDApOworICAgICAgICAgIGlmIChlcnIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZhaWwgKCJhZXMtb2ZiLCBnY3J5X2NpcGhlcl9kZWNyeXB0ICglZCwgJWQpIGZhaWxlZDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIGksIGosIGdwZ19zdHJlcnJvciAoZXJyKSk7CisgICAgICAgICAgICAgIGdjcnlfY2lwaGVyX2Nsb3NlIChoZGUpOworICAgICAgICAgICAgICBnY3J5X2NpcGhlcl9jbG9zZSAoaGRkKTsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKG1lbWNtcCAodHZbaV0uZGF0YVtqXS5wbGFpbnRleHQsIG91dCwgdHZbaV0uZGF0YVtqXS5pbmxlbikpCisgICAgICAgICAgICBmYWlsICgiYWVzLW9mYiwgZGVjcnlwdCBtaXNtYXRjaCBlbnRyeSAlZDolZFxuIiwgaSwgaik7CisgICAgICAgIH0KKworICAgICAgZXJyID0gZ2NyeV9jaXBoZXJfcmVzZXQoaGRlKTsKKyAgICAgIGlmICghZXJyKQorCWVyciA9IGdjcnlfY2lwaGVyX3Jlc2V0KGhkZCk7CisgICAgICBpZiAoZXJyKQorCXsKKwkgIGZhaWwgKCJhZXMtb2ZiLCBnY3J5X2NpcGhlcl9yZXNldCAoJWQsICVkKSBmYWlsZWQ6ICVzXG4iLAorCQlpLCBqLCBncGdfc3RyZXJyb3IgKGVycikpOworCSAgZ2NyeV9jaXBoZXJfY2xvc2UgKGhkZSk7CisJICBnY3J5X2NpcGhlcl9jbG9zZSAoaGRkKTsKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIC8qIGdjcnlfY2lwaGVyX3Jlc2V0IGNsZWFycyB0aGUgSVYgKi8KKyAgICAgIGVyciA9IGdjcnlfY2lwaGVyX3NldGl2IChoZGUsIHR2W2ldLml2LCBibGtsZW4pOworICAgICAgaWYgKCFlcnIpCisgICAgICAgIGVyciA9IGdjcnlfY2lwaGVyX3NldGl2IChoZGQsIHR2W2ldLml2LCBibGtsZW4pOworICAgICAgaWYgKGVycikKKyAgICAgICAgeworICAgICAgICAgIGZhaWwgKCJhZXMtb2ZiLCBnY3J5X2NpcGhlcl9zZXRpdiBmYWlsZWQ6ICVzXG4iLAorICAgICAgICAgICAgICAgIGdwZ19zdHJlcnJvciAoZXJyKSk7CisgICAgICAgICAgZ2NyeV9jaXBoZXJfY2xvc2UgKGhkZSk7CisgICAgICAgICAgZ2NyeV9jaXBoZXJfY2xvc2UgKGhkZCk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgIC8qIHRoaXMgdGltZSB3ZSBlbmNyeXB0IGFuZCBkZWNyeXB0IG9uZSBieXRlIGF0IGEgdGltZSAqLworICAgICAgZm9yIChqID0gMDsgdHZbaV0uZGF0YVtqXS5pbmxlbjsgaisrKQorICAgICAgICB7CisJICBpbnQgYnl0ZU51bTsKKwkgIGZvciAoYnl0ZU51bSA9IDA7IGJ5dGVOdW0gPCB0dltpXS5kYXRhW2pdLmlubGVuOyArK2J5dGVOdW0pIAorCSAgICB7CisJICAgICAgZXJyID0gZ2NyeV9jaXBoZXJfZW5jcnlwdCAoaGRlLCBvdXQrYnl0ZU51bSwgMSwKKwkJCQkJICh0dltpXS5kYXRhW2pdLnBsYWludGV4dCkgKyBieXRlTnVtLAorCQkJCQkgMSk7CisJICAgICAgaWYgKGVycikKKwkJeworCQkgIGZhaWwgKCJhZXMtb2ZiLCBnY3J5X2NpcGhlcl9lbmNyeXB0ICglZCwgJWQpIGZhaWxlZDogJXNcbiIsCisJCQlpLCBqLCBncGdfc3RyZXJyb3IgKGVycikpOworCQkgIGdjcnlfY2lwaGVyX2Nsb3NlIChoZGUpOworCQkgIGdjcnlfY2lwaGVyX2Nsb3NlIChoZGQpOworCQkgIHJldHVybjsKKwkJfQorCSAgICB9CisKKyAgICAgICAgICBpZiAobWVtY21wICh0dltpXS5kYXRhW2pdLm91dCwgb3V0LCB0dltpXS5kYXRhW2pdLmlubGVuKSkKKyAgICAgICAgICAgIGZhaWwgKCJhZXMtb2ZiLCBlbmNyeXB0IG1pc21hdGNoIGVudHJ5ICVkOiVkXG4iLCBpLCBqKTsKKworCSAgZm9yIChieXRlTnVtID0gMDsgYnl0ZU51bSA8IHR2W2ldLmRhdGFbal0uaW5sZW47ICsrYnl0ZU51bSkgCisJICAgIHsKKwkgICAgICBlcnIgPSBnY3J5X2NpcGhlcl9kZWNyeXB0IChoZGQsIG91dCtieXRlTnVtLCAxLCBOVUxMLCAwKTsKKwkgICAgICBpZiAoZXJyKQorCQl7CisJCSAgZmFpbCAoImFlcy1vZmIsIGdjcnlfY2lwaGVyX2RlY3J5cHQgKCVkLCAlZCkgZmFpbGVkOiAlc1xuIiwKKwkJCWksIGosIGdwZ19zdHJlcnJvciAoZXJyKSk7CisJCSAgZ2NyeV9jaXBoZXJfY2xvc2UgKGhkZSk7CisJCSAgZ2NyeV9jaXBoZXJfY2xvc2UgKGhkZCk7CisJCSAgcmV0dXJuOworCQl9CisJICAgIH0KKworICAgICAgICAgIGlmIChtZW1jbXAgKHR2W2ldLmRhdGFbal0ucGxhaW50ZXh0LCBvdXQsIHR2W2ldLmRhdGFbal0uaW5sZW4pKQorICAgICAgICAgICAgZmFpbCAoImFlcy1vZmIsIGRlY3J5cHQgbWlzbWF0Y2ggZW50cnkgJWQ6JWRcbiIsIGksIGopOworICAgICAgICB9CisKKyAgICAgIGdjcnlfY2lwaGVyX2Nsb3NlIChoZGUpOworICAgICAgZ2NyeV9jaXBoZXJfY2xvc2UgKGhkZCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorY2hlY2tfb25lX2NpcGhlciAoaW50IGFsZ28sIGludCBtb2RlLCBpbnQgZmxhZ3MpCit7CisgIGdjcnlfY2lwaGVyX2hkX3QgaGQ7CisgIGNoYXIga2V5WzMyXTsKKyAgdW5zaWduZWQgY2hhciBwbGFpblsxNl0sIGluWzE2XSwgb3V0WzE2XTsKKyAgaW50IGtleWxlbjsKKyAgZ2NyeV9lcnJvcl90IGVyciA9IDA7CisKKyAgbWVtY3B5IChrZXksICIwMTIzNDU2Nzg5YWJjZGVmLiw7L1tde30tPUFCQ0RFRiIsIDMyKTsKKyAgbWVtY3B5IChwbGFpbiwgImZvb2JhcjQyRk9PQkFSMTciLCAxNik7CisKKyAga2V5bGVuID0gZ2NyeV9jaXBoZXJfZ2V0X2FsZ29fa2V5bGVuIChhbGdvKTsKKyAgaWYgKCFrZXlsZW4pCisgICAgeworICAgICAgZmFpbCAoImFsZ28gJWQsIG1vZGUgJWQsIGdjcnlfY2lwaGVyX2dldF9hbGdvX2tleWxlbiBmYWlsZWRcbiIsCisJICAgIGFsZ28sIG1vZGUpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoa2V5bGVuIDwgNDAgLyA4IHx8IGtleWxlbiA+IDMyKQorICAgIHsKKyAgICAgIGZhaWwgKCJhbGdvICVkLCBtb2RlICVkLCBrZXlsZW5ndGggcHJvYmxlbSAoJWQpXG4iLCBhbGdvLCBtb2RlLCBrZXlsZW4pOworICAgICAgcmV0dXJuOworICAgIH0KKworICBlcnIgPSBnY3J5X2NpcGhlcl9vcGVuICgmaGQsIGFsZ28sIG1vZGUsIGZsYWdzKTsKKyAgaWYgKGVycikKKyAgICB7CisgICAgICBmYWlsICgiYWxnbyAlZCwgbW9kZSAlZCwgZ3JjeV9vcGVuX2NpcGhlciBmYWlsZWQ6ICVzXG4iLAorCSAgICBhbGdvLCBtb2RlLCBncGdfc3RyZXJyb3IgKGVycikpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBlcnIgPSBnY3J5X2NpcGhlcl9zZXRrZXkgKGhkLCBrZXksIGtleWxlbik7CisgIGlmIChlcnIpCisgICAgeworICAgICAgZmFpbCAoImFsZ28gJWQsIG1vZGUgJWQsIGdjcnlfY2lwaGVyX3NldGtleSBmYWlsZWQ6ICVzXG4iLAorCSAgICBhbGdvLCBtb2RlLCBncGdfc3RyZXJyb3IgKGVycikpOworICAgICAgZ2NyeV9jaXBoZXJfY2xvc2UgKGhkKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgZXJyID0gZ2NyeV9jaXBoZXJfZW5jcnlwdCAoaGQsIG91dCwgMTYsIHBsYWluLCAxNik7CisgIGlmIChlcnIpCisgICAgeworICAgICAgZmFpbCAoImFsZ28gJWQsIG1vZGUgJWQsIGdjcnlfY2lwaGVyX2VuY3J5cHQgZmFpbGVkOiAlc1xuIiwKKwkgICAgYWxnbywgbW9kZSwgZ3BnX3N0cmVycm9yIChlcnIpKTsKKyAgICAgIGdjcnlfY2lwaGVyX2Nsb3NlIChoZCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGdjcnlfY2lwaGVyX3Jlc2V0IChoZCk7CisKKyAgZXJyID0gZ2NyeV9jaXBoZXJfZGVjcnlwdCAoaGQsIGluLCAxNiwgb3V0LCAxNik7CisgIGlmIChlcnIpCisgICAgeworICAgICAgZmFpbCAoImFsZ28gJWQsIG1vZGUgJWQsIGdjcnlfY2lwaGVyX2RlY3J5cHQgZmFpbGVkOiAlc1xuIiwKKwkgICAgYWxnbywgbW9kZSwgZ3BnX3N0cmVycm9yIChlcnIpKTsKKyAgICAgIGdjcnlfY2lwaGVyX2Nsb3NlIChoZCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChtZW1jbXAgKHBsYWluLCBpbiwgMTYpKQorICAgIGZhaWwgKCJhbGdvICVkLCBtb2RlICVkLCBlbmNyeXB0LWRlY3J5cHQgbWlzbWF0Y2hcbiIsIGFsZ28sIG1vZGUpOworCisgIC8qIEFnYWluLCB1c2luZyBpbi1wbGFjZSBlbmNyeXB0aW9uLiAgKi8KKyAgZ2NyeV9jaXBoZXJfcmVzZXQgKGhkKTsKKworICBtZW1jcHkgKG91dCwgcGxhaW4sIDE2KTsKKyAgZXJyID0gZ2NyeV9jaXBoZXJfZW5jcnlwdCAoaGQsIG91dCwgMTYsIE5VTEwsIDApOworICBpZiAoZXJyKQorICAgIHsKKyAgICAgIGZhaWwgKCJhbGdvICVkLCBtb2RlICVkLCBpbi1wbGFjZSwgZ2NyeV9jaXBoZXJfZW5jcnlwdCBmYWlsZWQ6ICVzXG4iLAorCSAgICBhbGdvLCBtb2RlLCBncGdfc3RyZXJyb3IgKGVycikpOworICAgICAgZ2NyeV9jaXBoZXJfY2xvc2UgKGhkKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgZ2NyeV9jaXBoZXJfcmVzZXQgKGhkKTsKKworICBlcnIgPSBnY3J5X2NpcGhlcl9kZWNyeXB0IChoZCwgb3V0LCAxNiwgTlVMTCwgMCk7CisgIGlmIChlcnIpCisgICAgeworICAgICAgZmFpbCAoImFsZ28gJWQsIG1vZGUgJWQsIGluLXBsYWNlLCBnY3J5X2NpcGhlcl9kZWNyeXB0IGZhaWxlZDogJXNcbiIsCisJICAgIGFsZ28sIG1vZGUsIGdwZ19zdHJlcnJvciAoZXJyKSk7CisgICAgICBnY3J5X2NpcGhlcl9jbG9zZSAoaGQpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAobWVtY21wIChwbGFpbiwgb3V0LCAxNikpCisgICAgZmFpbCAoImFsZ28gJWQsIG1vZGUgJWQsIGluLXBsYWNlLCBlbmNyeXB0LWRlY3J5cHQgbWlzbWF0Y2hcbiIsYWxnbywgbW9kZSk7CisKKworICBnY3J5X2NpcGhlcl9jbG9zZSAoaGQpOworCit9CisKKworc3RhdGljIHZvaWQKK2NoZWNrX2NpcGhlcnMgKHZvaWQpCit7CisgIHN0YXRpYyBpbnQgYWxnb3NbXSA9IHsKKyNpZiBVU0VfQkxPV0ZJU0gKKyAgICBHQ1JZX0NJUEhFUl9CTE9XRklTSCwKKyNlbmRpZgorI2lmIFVTRV9ERVMKKyAgICBHQ1JZX0NJUEhFUl9ERVMsCisgICAgR0NSWV9DSVBIRVJfM0RFUywKKyNlbmRpZgorI2lmIFVTRV9DQVNUNQorICAgIEdDUllfQ0lQSEVSX0NBU1Q1LAorI2VuZGlmCisjaWYgVVNFX0FFUworICAgIEdDUllfQ0lQSEVSX0FFUywKKyAgICBHQ1JZX0NJUEhFUl9BRVMxOTIsCisgICAgR0NSWV9DSVBIRVJfQUVTMjU2LAorI2VuZGlmCisjaWYgVVNFX1RXT0ZJU0gKKyAgICBHQ1JZX0NJUEhFUl9UV09GSVNILAorICAgIEdDUllfQ0lQSEVSX1RXT0ZJU0gxMjgsCisjZW5kaWYKKyNpZiBVU0VfU0VSUEVOVAorICAgIEdDUllfQ0lQSEVSX1NFUlBFTlQxMjgsCisgICAgR0NSWV9DSVBIRVJfU0VSUEVOVDE5MiwKKyAgICBHQ1JZX0NJUEhFUl9TRVJQRU5UMjU2LAorI2VuZGlmCisjaWYgVVNFX1JGQzIyNjgKKyAgICBHQ1JZX0NJUEhFUl9SRkMyMjY4XzQwLAorI2VuZGlmCisjaWYgVVNFX1NFRUQKKyAgICBHQ1JZX0NJUEhFUl9TRUVELAorI2VuZGlmCisjaWYgVVNFX0NBTUVMTElBCisgICAgR0NSWV9DSVBIRVJfQ0FNRUxMSUExMjgsCisgICAgR0NSWV9DSVBIRVJfQ0FNRUxMSUExOTIsCisgICAgR0NSWV9DSVBIRVJfQ0FNRUxMSUEyNTYsCisjZW5kaWYKKyAgICAwCisgIH07CisgIHN0YXRpYyBpbnQgYWxnb3MyW10gPSB7CisjaWYgVVNFX0FSQ0ZPVVIKKyAgICBHQ1JZX0NJUEhFUl9BUkNGT1VSLAorI2VuZGlmCisgICAgMAorICB9OworICBpbnQgaTsKKworICBpZiAodmVyYm9zZSkKKyAgICBmcHJpbnRmIChzdGRlcnIsICJTdGFydGluZyBDaXBoZXIgY2hlY2tzLlxuIik7CisgIGZvciAoaSA9IDA7IGFsZ29zW2ldOyBpKyspCisgICAgeworICAgICAgaWYgKGdjcnlfY2lwaGVyX3Rlc3RfYWxnbyAoYWxnb3NbaV0pICYmIGluX2ZpcHNfbW9kZSkKKyAgICAgICAgeworICAgICAgICAgIGlmICh2ZXJib3NlKQorICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiICBhbGdvcml0aG0gJWQgbm90IGF2YWlsYWJsZSBpbiBmaXBzIG1vZGVcbiIsCisJCSAgICAgYWxnb3NbaV0pOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICBpZiAodmVyYm9zZSkKKwlmcHJpbnRmIChzdGRlcnIsICIgIGNoZWNraW5nICVzIFslaV1cbiIsCisJCSBnY3J5X2NpcGhlcl9hbGdvX25hbWUgKGFsZ29zW2ldKSwKKwkJIGdjcnlfY2lwaGVyX21hcF9uYW1lIChnY3J5X2NpcGhlcl9hbGdvX25hbWUgKGFsZ29zW2ldKSkpOworCisgICAgICBjaGVja19vbmVfY2lwaGVyIChhbGdvc1tpXSwgR0NSWV9DSVBIRVJfTU9ERV9FQ0IsIDApOworICAgICAgY2hlY2tfb25lX2NpcGhlciAoYWxnb3NbaV0sIEdDUllfQ0lQSEVSX01PREVfQ0ZCLCAwKTsKKyAgICAgIGNoZWNrX29uZV9jaXBoZXIgKGFsZ29zW2ldLCBHQ1JZX0NJUEhFUl9NT0RFX09GQiwgMCk7CisgICAgICBjaGVja19vbmVfY2lwaGVyIChhbGdvc1tpXSwgR0NSWV9DSVBIRVJfTU9ERV9DQkMsIDApOworICAgICAgY2hlY2tfb25lX2NpcGhlciAoYWxnb3NbaV0sIEdDUllfQ0lQSEVSX01PREVfQ0JDLCBHQ1JZX0NJUEhFUl9DQkNfQ1RTKTsKKyAgICAgIGNoZWNrX29uZV9jaXBoZXIgKGFsZ29zW2ldLCBHQ1JZX0NJUEhFUl9NT0RFX0NUUiwgMCk7CisgICAgfQorCisgIGZvciAoaSA9IDA7IGFsZ29zMltpXTsgaSsrKQorICAgIHsKKyAgICAgIGlmIChnY3J5X2NpcGhlcl90ZXN0X2FsZ28gKGFsZ29zW2ldKSAmJiBpbl9maXBzX21vZGUpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAodmVyYm9zZSkKKyAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAgYWxnb3JpdGhtICVkIG5vdCBhdmFpbGFibGUgaW4gZmlwcyBtb2RlXG4iLAorCQkgICAgIGFsZ29zW2ldKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgaWYgKHZlcmJvc2UpCisJZnByaW50ZiAoc3RkZXJyLCAiICBjaGVja2luZyBgJXMnXG4iLAorCQkgZ2NyeV9jaXBoZXJfYWxnb19uYW1lIChhbGdvczJbaV0pKTsKKworICAgICAgY2hlY2tfb25lX2NpcGhlciAoYWxnb3MyW2ldLCBHQ1JZX0NJUEhFUl9NT0RFX1NUUkVBTSwgMCk7CisgICAgfQorICAvKiB3ZSBoYXZlIG5vdyBydW4gYWxsIGNpcGhlcidzIHNlbGZ0ZXN0cyAqLworCisgIGlmICh2ZXJib3NlKQorICAgIGZwcmludGYgKHN0ZGVyciwgIkNvbXBsZXRlZCBDaXBoZXIgY2hlY2tzLlxuIik7CisKKyAgLyogVE9ETzogYWRkIHNvbWUgZXh0cmEgZW5jcnlwdGlvbiB0byB0ZXN0IHRoZSBoaWdoZXIgbGV2ZWwgZnVuY3Rpb25zICovCit9CisKKworCitzdGF0aWMgdm9pZAorY2hlY2tfb25lX21kIChpbnQgYWxnbywgY29uc3QgY2hhciAqZGF0YSwgaW50IGxlbiwgY29uc3QgY2hhciAqZXhwZWN0KQoreworICBnY3J5X21kX2hkX3QgaGQsIGhkMjsKKyAgdW5zaWduZWQgY2hhciAqcDsKKyAgaW50IG1kbGVuOworICBpbnQgaTsKKyAgZ2NyeV9lcnJvcl90IGVyciA9IDA7CisKKyAgZXJyID0gZ2NyeV9tZF9vcGVuICgmaGQsIGFsZ28sIDApOworICBpZiAoZXJyKQorICAgIHsKKyAgICAgIGZhaWwgKCJhbGdvICVkLCBncmN5X21kX29wZW4gZmFpbGVkOiAlc1xuIiwgYWxnbywgZ3BnX3N0cmVycm9yIChlcnIpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgbWRsZW4gPSBnY3J5X21kX2dldF9hbGdvX2RsZW4gKGFsZ28pOworICBpZiAobWRsZW4gPCAxIHx8IG1kbGVuID4gNTAwKQorICAgIHsKKyAgICAgIGZhaWwgKCJhbGdvICVkLCBncmN5X21kX2dldF9hbGdvX2RsZW4gZmFpbGVkOiAlZFxuIiwgYWxnbywgbWRsZW4pOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoKmRhdGEgPT0gJyEnICYmICFkYXRhWzFdKQorICAgIHsJCQkJLyogaGFzaCBvbmUgbWlsbGlvbiB0aW1lcyBhICJhIiAqLworICAgICAgY2hhciBhYWFbMTAwMF07CisKKyAgICAgIC8qIFdyaXRlIGluIG9kZCBzaXplIGNodW5rcyBzbyB0aGF0IHdlIHRlc3QgdGhlIGJ1ZmZlcmluZy4gICovCisgICAgICBtZW1zZXQgKGFhYSwgJ2EnLCAxMDAwKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCAxMDAwOyBpKyspCisgICAgICAgIGdjcnlfbWRfd3JpdGUgKGhkLCBhYWEsIDEwMDApOworICAgIH0KKyAgZWxzZQorICAgIGdjcnlfbWRfd3JpdGUgKGhkLCBkYXRhLCBsZW4pOworCisgIGVyciA9IGdjcnlfbWRfY29weSAoJmhkMiwgaGQpOworICBpZiAoZXJyKQorICAgIHsKKyAgICAgIGZhaWwgKCJhbGdvICVkLCBnY3J5X21kX2NvcHkgZmFpbGVkOiAlc1xuIiwgYWxnbywgZ3BnX3N0cmVycm9yIChlcnIpKTsKKyAgICB9CisKKyAgZ2NyeV9tZF9jbG9zZSAoaGQpOworCisgIHAgPSBnY3J5X21kX3JlYWQgKGhkMiwgYWxnbyk7CisKKyAgaWYgKG1lbWNtcCAocCwgZXhwZWN0LCBtZGxlbikpCisgICAgeworICAgICAgcHJpbnRmICgiY29tcHV0ZWQ6ICIpOworICAgICAgZm9yIChpID0gMDsgaSA8IG1kbGVuOyBpKyspCisJcHJpbnRmICgiJTAyeCAiLCBwW2ldICYgMHhGRik7CisgICAgICBwcmludGYgKCJcbmV4cGVjdGVkOiAiKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBtZGxlbjsgaSsrKQorCXByaW50ZiAoIiUwMnggIiwgZXhwZWN0W2ldICYgMHhGRik7CisgICAgICBwcmludGYgKCJcbiIpOworCisgICAgICBmYWlsICgiYWxnbyAlZCwgZGlnZXN0IG1pc21hdGNoXG4iLCBhbGdvKTsKKyAgICB9CisKKyAgZ2NyeV9tZF9jbG9zZSAoaGQyKTsKK30KKworCitzdGF0aWMgdm9pZAorY2hlY2tfZGlnZXN0cyAodm9pZCkKK3sKKyAgc3RhdGljIHN0cnVjdCBhbGdvcworICB7CisgICAgaW50IG1kOworICAgIGNvbnN0IGNoYXIgKmRhdGE7CisgICAgY29uc3QgY2hhciAqZXhwZWN0OworICB9IGFsZ29zW10gPQorICAgIHsKKyAgICAgIHsgR0NSWV9NRF9NRDQsICIiLAorCSJceDMxXHhENlx4Q0ZceEUwXHhEMVx4NkFceEU5XHgzMVx4QjdceDNDXHg1OVx4RDdceEUwXHhDMFx4ODlceEMwIiB9LAorICAgICAgeyBHQ1JZX01EX01ENCwgImEiLAorCSJceGJkXHhlNVx4MmNceGIzXHgxZFx4ZTNceDNlXHg0Nlx4MjRceDVlXHgwNVx4ZmJceGRiXHhkNlx4ZmJceDI0IiB9LAorICAgICAgewlHQ1JZX01EX01ENCwgIm1lc3NhZ2UgZGlnZXN0IiwKKwkiXHhkOVx4MTNceDBhXHg4MVx4NjRceDU0XHg5Zlx4ZThceDE4XHg4N1x4NDhceDA2XHhlMVx4YzdceDAxXHg0YiIgfSwKKyAgICAgIHsJR0NSWV9NRF9NRDUsICIiLAorCSJceEQ0XHgxRFx4OENceEQ5XHg4Rlx4MDBceEIyXHgwNFx4RTlceDgwXHgwOVx4OThceEVDXHhGOFx4NDJceDdFIiB9LAorICAgICAgewlHQ1JZX01EX01ENSwgImEiLAorCSJceDBDXHhDMVx4NzVceEI5XHhDMFx4RjFceEI2XHhBOFx4MzFceEMzXHg5OVx4RTJceDY5XHg3N1x4MjZceDYxIiB9LAorICAgICAgeyBHQ1JZX01EX01ENSwgImFiYyIsCisJIlx4OTBceDAxXHg1MFx4OThceDNDXHhEMlx4NEZceEIwXHhENlx4OTZceDNGXHg3RFx4MjhceEUxXHg3Rlx4NzIiIH0sCisgICAgICB7IEdDUllfTURfTUQ1LCAibWVzc2FnZSBkaWdlc3QiLAorCSJceEY5XHg2Qlx4NjlceDdEXHg3Q1x4QjdceDkzXHg4RFx4NTJceDVBXHgyRlx4MzFceEFBXHhGMVx4NjFceEQwIiB9LAorICAgICAgeyBHQ1JZX01EX1NIQTEsICJhYmMiLAorCSJceEE5XHg5OVx4M0VceDM2XHg0N1x4MDZceDgxXHg2QVx4QkFceDNFIgorCSJceDI1XHg3MVx4NzhceDUwXHhDMlx4NkNceDlDXHhEMFx4RDhceDlEIiB9LAorICAgICAgewlHQ1JZX01EX1NIQTEsCisJImFiY2RiY2RlY2RlZmRlZmdlZmdoZmdoaWdoaWpoaWpraWprbGprbG1rbG1ubG1ub21ub3Bub3BxIiwKKwkiXHg4NFx4OThceDNFXHg0NFx4MUNceDNCXHhEMlx4NkVceEJBXHhBRSIKKwkiXHg0QVx4QTFceEY5XHg1MVx4MjlceEU1XHhFNVx4NDZceDcwXHhGMSIgfSwKKyAgICAgIHsgR0NSWV9NRF9TSEExLCAiISIgLyoga2x1ZGdlIGZvciAiYSIqMTAwMDAwMCAqLyAsCisJIlx4MzRceEFBXHg5N1x4M0NceEQ0XHhDNFx4REFceEE0XHhGNlx4MUUiCisJIlx4RUJceDJCXHhEQlx4QURceDI3XHgzMVx4NjVceDM0XHgwMVx4NkYiIH0sCisgICAgICAvKiBGcm9tIFJGQzM4NzQgKi8KKyAgICAgIHsJR0NSWV9NRF9TSEEyMjQsICJhYmMiLAorCSJceDIzXHgwOVx4N2RceDIyXHgzNFx4MDVceGQ4XHgyMlx4ODZceDQyXHhhNFx4NzdceGJkXHhhMlx4NTVceGIzIgorCSJceDJhXHhhZFx4YmNceGU0XHhiZFx4YTBceGIzXHhmN1x4ZTNceDZjXHg5ZFx4YTciIH0sCisgICAgICB7CUdDUllfTURfU0hBMjI0LAorCSJhYmNkYmNkZWNkZWZkZWZnZWZnaGZnaGlnaGlqaGlqa2lqa2xqa2xta2xtbmxtbm9tbm9wbm9wcSIsCisJIlx4NzVceDM4XHg4Ylx4MTZceDUxXHgyN1x4NzZceGNjXHg1ZFx4YmFceDVkXHhhMVx4ZmRceDg5XHgwMVx4NTAiCisJIlx4YjBceGM2XHg0NVx4NWNceGI0XHhmNVx4OGJceDE5XHg1Mlx4NTJceDI1XHgyNSIgfSwKKyAgICAgIHsJR0NSWV9NRF9TSEEyMjQsICIhIiwKKwkiXHgyMFx4NzlceDQ2XHg1NVx4OThceDBjXHg5MVx4ZDhceGJiXHhiNFx4YzFceGVhXHg5N1x4NjFceDhhXHg0YiIKKwkiXHhmMFx4M2ZceDQyXHg1OFx4MTlceDQ4XHhiMlx4ZWVceDRlXHhlN1x4YWRceDY3IiB9LAorICAgICAgewlHQ1JZX01EX1NIQTI1NiwgImFiYyIsCisJIlx4YmFceDc4XHgxNlx4YmZceDhmXHgwMVx4Y2ZceGVhXHg0MVx4NDFceDQwXHhkZVx4NWRceGFlXHgyMlx4MjMiCisJIlx4YjBceDAzXHg2MVx4YTNceDk2XHgxN1x4N2FceDljXHhiNFx4MTBceGZmXHg2MVx4ZjJceDAwXHgxNVx4YWQiIH0sCisgICAgICB7CUdDUllfTURfU0hBMjU2LAorCSJhYmNkYmNkZWNkZWZkZWZnZWZnaGZnaGlnaGlqaGlqa2lqa2xqa2xta2xtbmxtbm9tbm9wbm9wcSIsCisJIlx4MjRceDhkXHg2YVx4NjFceGQyXHgwNlx4MzhceGI4XHhlNVx4YzBceDI2XHg5M1x4MGNceDNlXHg2MFx4MzkiCisJIlx4YTNceDNjXHhlNFx4NTlceDY0XHhmZlx4MjFceDY3XHhmNlx4ZWNceGVkXHhkNFx4MTlceGRiXHgwNlx4YzEiIH0sCisgICAgICB7CUdDUllfTURfU0hBMjU2LCAiISIsCisJIlx4Y2RceGM3XHg2ZVx4NWNceDk5XHgxNFx4ZmJceDkyXHg4MVx4YTFceGM3XHhlMlx4ODRceGQ3XHgzZVx4NjciCisJIlx4ZjFceDgwXHg5YVx4NDhceGE0XHg5N1x4MjBceDBlXHgwNFx4NmRceDM5XHhjY1x4YzdceDExXHgyY1x4ZDAiIH0sCisgICAgICB7CUdDUllfTURfU0hBMzg0LCAiYWJjIiwKKwkiXHhjYlx4MDBceDc1XHgzZlx4NDVceGEzXHg1ZVx4OGJceGI1XHhhMFx4M2RceDY5XHg5YVx4YzZceDUwXHgwNyIKKwkiXHgyN1x4MmNceDMyXHhhYlx4MGVceGRlXHhkMVx4NjNceDFhXHg4Ylx4NjBceDVhXHg0M1x4ZmZceDViXHhlZCIKKwkiXHg4MFx4ODZceDA3XHgyYlx4YTFceGU3XHhjY1x4MjNceDU4XHhiYVx4ZWNceGExXHgzNFx4YzhceDI1XHhhNyIgfSwKKyAgICAgIHsJR0NSWV9NRF9TSEE1MTIsICJhYmMiLAorCSJceEREXHhBRlx4MzVceEExXHg5M1x4NjFceDdBXHhCQVx4Q0NceDQxXHg3M1x4NDlceEFFXHgyMFx4NDFceDMxIgorCSJceDEyXHhFNlx4RkFceDRFXHg4OVx4QTlceDdFXHhBMlx4MEFceDlFXHhFRVx4RTZceDRCXHg1NVx4RDNceDlBIgorCSJceDIxXHg5Mlx4OTlceDJBXHgyN1x4NEZceEMxXHhBOFx4MzZceEJBXHgzQ1x4MjNceEEzXHhGRVx4RUJceEJEIgorCSJceDQ1XHg0RFx4NDRceDIzXHg2NFx4M0NceEU4XHgwRVx4MkFceDlBXHhDOVx4NEZceEE1XHg0Q1x4QTRceDlGIiB9LAorICAgICAgewlHQ1JZX01EX1JNRDE2MCwgIiIsCisJIlx4OWNceDExXHg4NVx4YTVceGM1XHhlOVx4ZmNceDU0XHg2MVx4MjgiCisJIlx4MDhceDk3XHg3ZVx4ZThceGY1XHg0OFx4YjJceDI1XHg4ZFx4MzEiIH0sCisgICAgICB7CUdDUllfTURfUk1EMTYwLCAiYSIsCisJIlx4MGJceGRjXHg5ZFx4MmRceDI1XHg2Ylx4M2VceGU5XHhkYVx4YWUiCisJIlx4MzRceDdiXHhlNlx4ZjRceGRjXHg4M1x4NWFceDQ2XHg3Zlx4ZmUiIH0sCisgICAgICB7CUdDUllfTURfUk1EMTYwLCAiYWJjIiwKKwkiXHg4ZVx4YjJceDA4XHhmN1x4ZTBceDVkXHg5OFx4N2FceDliXHgwNCIKKwkiXHg0YVx4OGVceDk4XHhjNlx4YjBceDg3XHhmMVx4NWFceDBiXHhmYyIgfSwKKyAgICAgIHsJR0NSWV9NRF9STUQxNjAsICJtZXNzYWdlIGRpZ2VzdCIsCisJIlx4NWRceDA2XHg4OVx4ZWZceDQ5XHhkMlx4ZmFceGU1XHg3Mlx4YjgiCisJIlx4ODFceGIxXHgyM1x4YThceDVmXHhmYVx4MjFceDU5XHg1Zlx4MzYiIH0sCisgICAgICB7CUdDUllfTURfQ1JDMzIsICIiLCAiXHgwMFx4MDBceDAwXHgwMCIgfSwKKyAgICAgIHsJR0NSWV9NRF9DUkMzMiwgImZvbyIsICJceDhjXHg3M1x4NjVceDIxIiB9LAorICAgICAgeyBHQ1JZX01EX0NSQzMyX1JGQzE1MTAsICIiLCAiXHgwMFx4MDBceDAwXHgwMCIgfSwKKyAgICAgIHsJR0NSWV9NRF9DUkMzMl9SRkMxNTEwLCAiZm9vIiwgIlx4NzNceDMyXHhiY1x4MzMiIH0sCisgICAgICB7CUdDUllfTURfQ1JDMzJfUkZDMTUxMCwgInRlc3QwMTIzNDU2Nzg5IiwgIlx4YjhceDNlXHg4OFx4ZDYiIH0sCisgICAgICB7CUdDUllfTURfQ1JDMzJfUkZDMTUxMCwgIk1BU1NBQ0hWU0VUVFMgSU5TVElUVlRFIE9GIFRFQ0hOT0xPR1kiLAorCSJceGUzXHg0MVx4ODBceGY3IiB9LAorI2lmIDAKKyAgICAgIHsJR0NSWV9NRF9DUkMzMl9SRkMxNTEwLCAiXHg4MFx4MDAiLCAiXHgzYlx4ODNceDk4XHg0YiIgfSwKKyAgICAgIHsJR0NSWV9NRF9DUkMzMl9SRkMxNTEwLCAiXHgwMFx4MDgiLCAiXHgwZVx4ZGJceDg4XHgzMiIgfSwKKyAgICAgIHsJR0NSWV9NRF9DUkMzMl9SRkMxNTEwLCAiXHgwMFx4ODAiLCAiXHhlZFx4YjhceDgzXHgyMCIgfSwKKyNlbmRpZgorICAgICAgewlHQ1JZX01EX0NSQzMyX1JGQzE1MTAsICJceDgwIiwgIlx4ZWRceGI4XHg4M1x4MjAiIH0sCisjaWYgMAorICAgICAgewlHQ1JZX01EX0NSQzMyX1JGQzE1MTAsICJceDgwXHgwMFx4MDBceDAwIiwgIlx4ZWRceDU5XHhiNlx4M2IiIH0sCisgICAgICB7CUdDUllfTURfQ1JDMzJfUkZDMTUxMCwgIlx4MDBceDAwXHgwMFx4MDEiLCAiXHg3N1x4MDdceDMwXHg5NiIgfSwKKyNlbmRpZgorICAgICAgewlHQ1JZX01EX0NSQzI0X1JGQzI0NDAsICIiLCAiXHhiN1x4MDRceGNlIiB9LAorICAgICAgewlHQ1JZX01EX0NSQzI0X1JGQzI0NDAsICJmb28iLCAiXHg0Zlx4YzJceDU1IiB9LAorICAgICAgewlHQ1JZX01EX1RJR0VSLCAiIiwKKwkiXHgyNFx4RjBceDEzXHgwQ1x4NjNceEFDXHg5M1x4MzJceDE2XHgxNlx4NkVceDc2IgorCSJceEIxXHhCQlx4OTJceDVGXHhGM1x4NzNceERFXHgyRFx4NDlceDU4XHg0RVx4N0EiIH0sCisgICAgICB7CUdDUllfTURfVElHRVIsICJhYmMiLAorCSJceEYyXHg1OFx4QzFceEU4XHg4NFx4MTRceEFCXHgyQVx4NTJceDdBXHhCNVx4NDEiCisJIlx4RkZceEM1XHhCOFx4QkZceDkzXHg1Rlx4N0JceDk1XHgxQ1x4MTNceDI5XHg1MSIgfSwKKyAgICAgIHsJR0NSWV9NRF9USUdFUiwgIlRpZ2VyIiwKKwkiXHg5Rlx4MDBceEY1XHg5OVx4MDdceDIzXHgwMFx4RERceDI3XHg2QVx4QkJceDM4IgorCSJceEM4XHhFQlx4NkRceEVDXHgzN1x4NzlceDBDXHgxMVx4NkZceDlEXHgyQlx4REYiIH0sCisgICAgICB7CUdDUllfTURfVElHRVIsICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmciCisJImhpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky0iLAorCSJceDg3XHhGQlx4MkFceDkwXHg4M1x4ODVceDFDXHhGN1x4NDdceDBEXHgyQ1x4RjgiCisJIlx4MTBceEU2XHhERlx4OUVceEI1XHg4Nlx4NDRceDUwXHgzNFx4QTVceEEzXHg4NiIgfSwKKyAgICAgIHsJR0NSWV9NRF9USUdFUiwgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaPWFiY2RlZiIKKwkiZ2hpamtsbW5vcHFyc3R1dnd4eXorMDEyMzQ1Njc4OSIsCisJIlx4NDZceDdEXHhCOFx4MDhceDYzXHhFQlx4Q0VceDQ4XHg4RFx4RjFceENEXHgxMiIKKwkiXHg2MVx4NjVceDVEXHhFOVx4NTdceDg5XHg2NVx4NjVceDk3XHg1Rlx4OTFceDk3IiB9LAorICAgICAgewlHQ1JZX01EX1RJR0VSLCAiVGlnZXIgLSBBIEZhc3QgTmV3IEhhc2ggRnVuY3Rpb24sICIKKwkiYnkgUm9zcyBBbmRlcnNvbiBhbmQgRWxpIEJpaGFtIiwKKwkiXHgwQ1x4NDFceDBBXHgwNFx4MjlceDY4XHg4Nlx4OEFceDE2XHg3MVx4REFceDVBIgorCSJceDNGXHhEMlx4OUFceDcyXHg1RVx4QzFceEU0XHg1N1x4RDNceENEXHhCM1x4MDMiIH0sCisgICAgICB7CUdDUllfTURfVElHRVIsICJUaWdlciAtIEEgRmFzdCBOZXcgSGFzaCBGdW5jdGlvbiwgIgorCSJieSBSb3NzIEFuZGVyc29uIGFuZCBFbGkgQmloYW0sIHByb2NlZWRpbmdzIG9mIEZhIgorCSJzdCBTb2Z0d2FyZSBFbmNyeXB0aW9uIDMsIENhbWJyaWRnZS4iLAorCSJceEVCXHhGNVx4OTFceEQ1XHhBRlx4QTZceDU1XHhDRVx4N0ZceDIyXHg4OVx4NEYiCisJIlx4RjhceDdGXHg1NFx4QUNceDg5XHhDOFx4MTFceEI2XHhCMFx4REFceDMxXHg5MyIgfSwKKyAgICAgIHsJR0NSWV9NRF9USUdFUiwgIlRpZ2VyIC0gQSBGYXN0IE5ldyBIYXNoIEZ1bmN0aW9uLCAiCisJImJ5IFJvc3MgQW5kZXJzb24gYW5kIEVsaSBCaWhhbSwgcHJvY2VlZGluZ3Mgb2YgRmEiCisJInN0IFNvZnR3YXJlIEVuY3J5cHRpb24gMywgQ2FtYnJpZGdlLCAxOTk2LiIsCisJIlx4M0RceDlBXHhFQlx4MDNceEQxXHhCRFx4MUFceDYzXHg1N1x4QjJceDc3XHg0RCIKKwkiXHhGRFx4NkRceDVCXHgyNFx4RERceDY4XHgxNVx4MURceDUwXHgzOVx4NzRceEZDIiB9LAorICAgICAgewlHQ1JZX01EX1RJR0VSLCAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaCIKKwkiaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSstQUJDREVGR0hJSktMTU5PUFFSUyIKKwkiVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSstIiwKKwkiXHgwMFx4QjhceDNFXHhCNFx4RTVceDM0XHg0MFx4QzVceDc2XHhBQ1x4NkFceEFFIgorCSJceEUwXHhBN1x4NDhceDU4XHgyNVx4RkRceDE1XHhFN1x4MEFceDU5XHhGRlx4RTQiIH0sCisKKyAgICAgIHsJR0NSWV9NRF9USUdFUjEsICIiLAorICAgICAgICAiXHgzMlx4OTNceEFDXHg2M1x4MENceDEzXHhGMFx4MjRceDVGXHg5Mlx4QkJceEIxIgorICAgICAgICAiXHg3Nlx4NkVceDE2XHgxNlx4N0FceDRFXHg1OFx4NDlceDJEXHhERVx4NzNceEYzIiB9LAorICAgICAgewlHQ1JZX01EX1RJR0VSMSwgImEiLAorCSJceDc3XHhCRVx4RkJceEVGXHgyRVx4N0VceEY4XHhBQlx4MkVceEM4XHhGOVx4M0IiCisgICAgICAgICJceEY1XHg4N1x4QTdceEZDXHg2MVx4M0VceDI0XHg3Rlx4NUZceDI0XHg3OFx4MDkiIH0sCisgICAgICB7CUdDUllfTURfVElHRVIxLCAiYWJjIiwKKyAgICAgICAgIlx4MkFceEFCXHgxNFx4ODRceEU4XHhDMVx4NThceEYyXHhCRlx4QjhceEM1XHhGRiIKKyAgICAgICAgIlx4NDFceEI1XHg3QVx4NTJceDUxXHgyOVx4MTNceDFDXHg5NVx4N0JceDVGXHg5MyIgfSwKKyAgICAgIHsJR0NSWV9NRF9USUdFUjEsICJtZXNzYWdlIGRpZ2VzdCIsCisJIlx4RDlceDgxXHhGOFx4Q0JceDc4XHgyMFx4MUFceDk1XHgwRFx4Q0ZceDMwXHg0OCIKKyAgICAgICAgIlx4NzVceDFFXHg0NFx4MUNceDUxXHg3Rlx4Q0FceDFBXHhBNVx4NUFceDI5XHhGNiIgfSwKKyAgICAgIHsJR0NSWV9NRF9USUdFUjEsICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIsCisJIlx4MTdceDE0XHhBNFx4NzJceEVFXHhFNVx4N0RceDMwXHgwNFx4MDRceDEyXHhCRiIKKyAgICAgICAgIlx4Q0NceDU1XHgwM1x4MkFceDBCXHgxMVx4NjBceDJGXHhGM1x4N0JceEVFXHhFOSIgfSwKKyAgICAgIHsJR0NSWV9NRF9USUdFUjEsIAorICAgICAgICAiYWJjZGJjZGVjZGVmZGVmZ2VmZ2hmZ2hpZ2hpamhpamtpamtsamtsbWtsbW5sbW5vbW5vcG5vcHEiLAorCSJceDBGXHg3Qlx4RjlceEExXHg5Qlx4OUNceDU4XHhGMlx4QjdceDYxXHgwRFx4RjciCisgICAgICAgICJceEU4XHg0Rlx4MEFceEMzXHhBN1x4MUNceDYzXHgxRVx4N0JceDUzXHhGN1x4OEUiIH0sCisgICAgICB7CUdDUllfTURfVElHRVIxLCAKKyAgICAgICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIgorICAgICAgICAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiICIwMTIzNDU2Nzg5IiwKKyAgICAgICAgIlx4OERceENFXHhBNlx4ODBceEExXHg3NVx4ODNceEVFXHg1MFx4MkJceEEzXHg4QSIKKyAgICAgICAgIlx4M0NceDM2XHg4Nlx4NTFceDg5XHgwRlx4RkJceENDXHhEQ1x4NDlceEE4XHhDQyIgfSwKKyAgICAgIHsJR0NSWV9NRF9USUdFUjEsIAorICAgICAgICAiMTIzNDU2Nzg5MCIgIjEyMzQ1Njc4OTAiICIxMjM0NTY3ODkwIiAiMTIzNDU2Nzg5MCIKKyAgICAgICAgIjEyMzQ1Njc4OTAiICIxMjM0NTY3ODkwIiAiMTIzNDU2Nzg5MCIgIjEyMzQ1Njc4OTAiLAorICAgICAgICAiXHgxQ1x4MTRceDc5XHg1NVx4MjlceEZEXHg5Rlx4MjBceDdBXHg5NVx4OEZceDg0IgorICAgICAgICAiXHhDNVx4MkZceDExXHhFOFx4ODdceEZBXHgwQ1x4QUJceERGXHhEOVx4MUJceEZEIiB9LAorICAgICAgewlHQ1JZX01EX1RJR0VSMSwgIiEiLAorCSJceDZEXHhCMFx4RTJceDcyXHg5Q1x4QkVceEFEXHg5M1x4RDdceDE1XHhDNlx4QTciCisgICAgICAgICJceEQzXHg2M1x4MDJceEU5XHhCM1x4Q0VceEUwXHhEMlx4QkNceDMxXHg0Qlx4NDEiIH0sCisKKyAgICAgIHsJR0NSWV9NRF9USUdFUjIsICIiLAorICAgICAgICAiXHg0NFx4NDFceEJFXHg3NVx4RjZceDAxXHg4N1x4NzNceEMyXHgwNlx4QzJceDI3IgorICAgICAgICAiXHg0NVx4MzdceDRCXHg5Mlx4NEFceEE4XHgzMVx4M0ZceEVGXHg5MVx4OUZceDQxIiB9LAorICAgICAgewlHQ1JZX01EX1RJR0VSMiwgImEiLAorICAgICAgICAiXHg2N1x4RTZceEFFXHg4RVx4OUVceDk2XHg4OVx4OTlceEY3XHgwQVx4MjNceEU3IgorICAgICAgICAiXHgyQVx4RUFceEE5XHgyNVx4MUNceEJDXHg3Q1x4NzhceEE3XHg5MVx4NjZceDM2IiB9LAorICAgICAgewlHQ1JZX01EX1RJR0VSMiwgImFiYyIsCisgICAgICAgICJceEY2XHg4RFx4N0JceEM1XHhBRlx4NEJceDQzXHhBMFx4NkVceDA0XHg4RFx4NzgiCisgICAgICAgICJceDI5XHg1Nlx4MERceDRBXHg5NFx4MTVceDY1XHg4Qlx4QjBceEIxXHhGM1x4QkYiIH0sCisgICAgICB7CUdDUllfTURfVElHRVIyLCAibWVzc2FnZSBkaWdlc3QiLAorICAgICAgICAiXHhFMlx4OTRceDE5XHhBMVx4QjVceEZBXHgyNVx4OURceEU4XHgwMFx4NUVceDdEIgorICAgICAgICAiXHhFN1x4NTBceDc4XHhFQVx4ODFceEE1XHg0Mlx4RUZceDI1XHg1Mlx4NDZceDJEIiB9LAorICAgICAgewlHQ1JZX01EX1RJR0VSMiwgImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IiwKKyAgICAgICAgIlx4RjVceEI2XHhCNlx4QTdceDhDXHg0MFx4NUNceDg1XHg0N1x4RTlceDFDXHhEOCIKKyAgICAgICAgIlx4NjJceDRDXHhCOFx4QkVceDgzXHhGQ1x4ODBceDRBXHg0N1x4NDRceDg4XHhGRCIgfSwKKyAgICAgIHsJR0NSWV9NRF9USUdFUjIsIAorICAgICAgICAiYWJjZGJjZGVjZGVmZGVmZ2VmZ2hmZ2hpZ2hpamhpamtpamtsamtsbWtsbW5sbW5vbW5vcG5vcHEiLAorICAgICAgICAiXHhBNlx4NzNceDdGXHgzOVx4OTdceEU4XHhGQlx4QjZceDNEXHgyMFx4RDJceERGIgorICAgICAgICAiXHg4OFx4RjhceDYzXHg3Nlx4QjVceEZFXHgyRFx4NUNceEUzXHg2Nlx4NDZceEE5IiB9LAorICAgICAgewlHQ1JZX01EX1RJR0VSMiwgCisgICAgICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiIKKyAgICAgICAgImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IiAiMDEyMzQ1Njc4OSIsCisgICAgICAgICJceEVBXHg5QVx4QjZceDIyXHg4Q1x4RUVceDdCXHg1MVx4QjdceDc1XHg0NFx4RkMiCisgICAgICAgICJceEE2XHgwNlx4NkNceDhDXHhCQlx4NUJceEJBXHhFNlx4MzFceDk1XHgwNVx4Q0QiIH0sCisgICAgICB7CUdDUllfTURfVElHRVIyLCAKKyAgICAgICAgIjEyMzQ1Njc4OTAiICIxMjM0NTY3ODkwIiAiMTIzNDU2Nzg5MCIgIjEyMzQ1Njc4OTAiCisgICAgICAgICIxMjM0NTY3ODkwIiAiMTIzNDU2Nzg5MCIgIjEyMzQ1Njc4OTAiICIxMjM0NTY3ODkwIiwKKyAgICAgICAgIlx4RDhceDUyXHg3OFx4MTFceDUzXHgyOVx4RUJceEFBXHgwRVx4RUNceDg1XHhFQyIKKyAgICAgICAgIlx4RENceDUzXHg5Nlx4RkRceEE4XHhBQVx4M0FceDU4XHgyMFx4OTRceDJGXHhGRiIgfSwKKyAgICAgIHsJR0NSWV9NRF9USUdFUjIsICIhIiwKKyAgICAgICAgIlx4RTBceDY4XHgyOFx4MUZceDA2XHgwRlx4NTVceDE2XHgyOFx4Q0NceDU3XHgxNSIKKyAgICAgICAgIlx4QjlceEQwXHgyMlx4NjdceDk2XHg5MVx4NERceDQ1XHhGN1x4NzFceDdDXHhGNCIgfSwKKworCisgICAgICB7IEdDUllfTURfV0hJUkxQT09MLCAiIiwKKwkiXHgxOVx4RkFceDYxXHhEN1x4NTVceDIyXHhBNFx4NjZceDlCXHg0NFx4RTNceDlDXHgxRFx4MkVceDE3XHgyNiIKKwkiXHhDNVx4MzBceDIzXHgyMVx4MzBceEQ0XHgwN1x4RjhceDlBXHhGRVx4RTBceDk2XHg0OVx4OTdceEY3XHhBNyIKKwkiXHgzRVx4ODNceEJFXHg2OVx4OEJceDI4XHg4Rlx4RUJceENGXHg4OFx4RTNceEUwXHgzQ1x4NEZceDA3XHg1NyIKKwkiXHhFQVx4ODlceDY0XHhFNVx4OUJceDYzXHhEOVx4MzdceDA4XHhCMVx4MzhceENDXHg0Mlx4QTZceDZFXHhCMyIgfSwKKyAgICAgIHsgR0NSWV9NRF9XSElSTFBPT0wsICJhIiwKKwkiXHg4QVx4Q0FceDI2XHgwMlx4NzlceDJBXHhFQ1x4NkZceDExXHhBNlx4NzJceDA2XHg1M1x4MUZceEI3XHhENyIKKwkiXHhGMFx4REZceEY1XHg5NFx4MTNceDE0XHg1RVx4NjlceDczXHhDNFx4NTBceDAxXHhEMFx4MDhceDdCXHg0MiIKKwkiXHhEMVx4MUJceEM2XHg0NVx4NDFceDNBXHhFRlx4RjZceDNBXHg0Mlx4MzlceDFBXHgzOVx4MTRceDVBXHg1OSIKKwkiXHgxQVx4OTJceDIwXHgwRFx4NTZceDAxXHg5NVx4RTVceDNCXHg0N1x4ODVceDg0XHhGRFx4QUVceDIzXHgxQSIgfSwKKyAgICAgIHsgR0NSWV9NRF9XSElSTFBPT0wsICJhIiwKKwkiXHg4QVx4Q0FceDI2XHgwMlx4NzlceDJBXHhFQ1x4NkZceDExXHhBNlx4NzJceDA2XHg1M1x4MUZceEI3XHhENyIKKwkiXHhGMFx4REZceEY1XHg5NFx4MTNceDE0XHg1RVx4NjlceDczXHhDNFx4NTBceDAxXHhEMFx4MDhceDdCXHg0MiIKKwkiXHhEMVx4MUJceEM2XHg0NVx4NDFceDNBXHhFRlx4RjZceDNBXHg0Mlx4MzlceDFBXHgzOVx4MTRceDVBXHg1OSIKKwkiXHgxQVx4OTJceDIwXHgwRFx4NTZceDAxXHg5NVx4RTVceDNCXHg0N1x4ODVceDg0XHhGRFx4QUVceDIzXHgxQSIgfSwKKyAgICAgIHsgR0NSWV9NRF9XSElSTFBPT0wsCisJIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5IiwKKwkiXHhEQ1x4MzdceEUwXHgwOFx4Q0ZceDlFXHhFNlx4OUJceEYxXHgxRlx4MDBceEVEXHg5QVx4QkFceDI2XHg5MCIKKwkiXHgxRFx4RDdceEMyXHg4Q1x4REVceEMwXHg2Nlx4Q0NceDZBXHhGNFx4MkVceDQwXHhGOFx4MkZceDNBXHgxRSIKKwkiXHgwOFx4RUJceEEyXHg2Nlx4MjlceDEyXHg5RFx4OEZceEI3XHhDQlx4NTdceDIxXHgxQlx4OTJceDgxXHhBNiIKKwkiXHg1NVx4MTdceENDXHg4N1x4OURceDdCXHg5Nlx4MjFceDQyXHhDNlx4NUZceDVBXHg3QVx4RjBceDE0XHg2NyIgfSwKKyAgICAgIHsgR0NSWV9NRF9XSElSTFBPT0wsCisJIiEiLAorCSJceDBDXHg5OVx4MDBceDVCXHhFQlx4NTdceEVGXHhGNVx4MEFceDdDXHhGMFx4MDVceDU2XHgwRFx4REZceDVEIgorCSJceDI5XHgwNVx4N0ZceEQ4XHg2Qlx4MjBceEJGXHhENlx4MkRceEVDXHhBMFx4RjFceENDXHhFQVx4NEFceEY1IgorCSJceDFGXHhDMVx4NTRceDkwXHhFRFx4RENceDQ3XHhBRlx4MzJceEJCXHgyQlx4NjZceEMzXHg0Rlx4RjlceEFEIgorCSJceDhDXHg2MFx4MDhceEFEXHg2N1x4N0ZceDc3XHgxMlx4NjlceDUzXHhCMlx4MjZceEU0XHhFRFx4OEJceDAxIiB9LAorICAgICAgewkwIH0sCisgICAgfTsKKyAgaW50IGk7CisKKyAgaWYgKHZlcmJvc2UpCisgICAgZnByaW50ZiAoc3RkZXJyLCAiU3RhcnRpbmcgaGFzaCBjaGVja3MuXG4iKTsKKworICBmb3IgKGkgPSAwOyBhbGdvc1tpXS5tZDsgaSsrKQorICAgIHsKKyAgICAgIGlmICgoZ2NyeV9tZF90ZXN0X2FsZ28gKGFsZ29zW2ldLm1kKSB8fCBhbGdvc1tpXS5tZCA9PSBHQ1JZX01EX01ENSkKKyAgICAgICAgICAmJiBpbl9maXBzX21vZGUpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAodmVyYm9zZSkKKyAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAgYWxnb3JpdGhtICVkIG5vdCBhdmFpbGFibGUgaW4gZmlwcyBtb2RlXG4iLAorCQkgICAgIGFsZ29zW2ldLm1kKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgaWYgKHZlcmJvc2UpCisJZnByaW50ZiAoc3RkZXJyLCAiICBjaGVja2luZyAlcyBbJWldIGZvciBsZW5ndGggJXppXG4iLCAKKwkJIGdjcnlfbWRfYWxnb19uYW1lIChhbGdvc1tpXS5tZCksCisJCSBhbGdvc1tpXS5tZCwKKyAgICAgICAgICAgICAgICAgIXN0cmNtcCAoYWxnb3NbaV0uZGF0YSwgIiEiKT8gCisgICAgICAgICAgICAgICAgIDEwMDAwMDAgOiBzdHJsZW4oYWxnb3NbaV0uZGF0YSkpOworCisgICAgICBjaGVja19vbmVfbWQgKGFsZ29zW2ldLm1kLCBhbGdvc1tpXS5kYXRhLCBzdHJsZW4gKGFsZ29zW2ldLmRhdGEpLAorCQkgICAgYWxnb3NbaV0uZXhwZWN0KTsKKyAgICB9CisKKyAgaWYgKHZlcmJvc2UpCisgICAgZnByaW50ZiAoc3RkZXJyLCAiQ29tcGxldGVkIGhhc2ggY2hlY2tzLlxuIik7Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19vbmVfaG1hYyAoaW50IGFsZ28sIGNvbnN0IGNoYXIgKmRhdGEsIGludCBkYXRhbGVuLCAKKwkJY29uc3QgY2hhciAqa2V5LCBpbnQga2V5bGVuLCBjb25zdCBjaGFyICpleHBlY3QpCit7CisgIGdjcnlfbWRfaGRfdCBoZCwgaGQyOworICB1bnNpZ25lZCBjaGFyICpwOworICBpbnQgbWRsZW47CisgIGludCBpOworICBnY3J5X2Vycm9yX3QgZXJyID0gMDsKKworICBlcnIgPSBnY3J5X21kX29wZW4gKCZoZCwgYWxnbywgR0NSWV9NRF9GTEFHX0hNQUMpOworICBpZiAoZXJyKQorICAgIHsKKyAgICAgIGZhaWwgKCJhbGdvICVkLCBncmN5X21kX29wZW4gZmFpbGVkOiAlc1xuIiwgYWxnbywgZ3BnX3N0cmVycm9yIChlcnIpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgbWRsZW4gPSBnY3J5X21kX2dldF9hbGdvX2RsZW4gKGFsZ28pOworICBpZiAobWRsZW4gPCAxIHx8IG1kbGVuID4gNTAwKQorICAgIHsKKyAgICAgIGZhaWwgKCJhbGdvICVkLCBncmN5X21kX2dldF9hbGdvX2RsZW4gZmFpbGVkOiAlZFxuIiwgYWxnbywgbWRsZW4pOworICAgICAgcmV0dXJuOworICAgIH0KKworICBnY3J5X21kX3NldGtleSggaGQsIGtleSwga2V5bGVuICk7CisKKyAgZ2NyeV9tZF93cml0ZSAoaGQsIGRhdGEsIGRhdGFsZW4pOworCisgIGVyciA9IGdjcnlfbWRfY29weSAoJmhkMiwgaGQpOworICBpZiAoZXJyKQorICAgIHsKKyAgICAgIGZhaWwgKCJhbGdvICVkLCBnY3J5X21kX2NvcHkgZmFpbGVkOiAlc1xuIiwgYWxnbywgZ3BnX3N0cmVycm9yIChlcnIpKTsKKyAgICB9CisKKyAgZ2NyeV9tZF9jbG9zZSAoaGQpOworCisgIHAgPSBnY3J5X21kX3JlYWQgKGhkMiwgYWxnbyk7CisgIGlmICghcCkKKyAgICBmYWlsKCJhbGdvICVkLCBobWFjIGdjcnlfbWRfcmVhZCBmYWlsZWRcbiIsIGFsZ28pOworCisgIGlmIChtZW1jbXAgKHAsIGV4cGVjdCwgbWRsZW4pKQorICAgIHsKKyAgICAgIHByaW50ZiAoImNvbXB1dGVkOiAiKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBtZGxlbjsgaSsrKQorCXByaW50ZiAoIiUwMnggIiwgcFtpXSAmIDB4RkYpOworICAgICAgcHJpbnRmICgiXG5leHBlY3RlZDogIik7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbWRsZW47IGkrKykKKwlwcmludGYgKCIlMDJ4ICIsIGV4cGVjdFtpXSAmIDB4RkYpOworICAgICAgcHJpbnRmICgiXG4iKTsKKworICAgICAgZmFpbCAoImFsZ28gJWQsIGRpZ2VzdCBtaXNtYXRjaFxuIiwgYWxnbyk7CisgICAgfQorCisgIGdjcnlfbWRfY2xvc2UgKGhkMik7Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19obWFjICh2b2lkKQoreworICBzdGF0aWMgc3RydWN0IGFsZ29zCisgIHsKKyAgICBpbnQgbWQ7CisgICAgY29uc3QgY2hhciAqZGF0YTsKKyAgICBjb25zdCBjaGFyICprZXk7CisgICAgY29uc3QgY2hhciAqZXhwZWN0OworICB9IGFsZ29zW10gPQorICAgIHsKKyAgICAgIHsgR0NSWV9NRF9NRDUsICJ3aGF0IGRvIHlhIHdhbnQgZm9yIG5vdGhpbmc/IiwgIkplZmUiLAorCSJceDc1XHgwY1x4NzhceDNlXHg2YVx4YjBceGI1XHgwM1x4ZWFceGE4XHg2ZVx4MzFceDBhXHg1ZFx4YjdceDM4IiB9LAorICAgICAgeyBHQ1JZX01EX01ENSwKKwkiSGkgVGhlcmUiLAorCSJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiIiwKKwkiXHg5Mlx4OTRceDcyXHg3YVx4MzZceDM4XHhiYlx4MWNceDEzXHhmNFx4OGVceGY4XHgxNVx4OGJceGZjXHg5ZCIgfSwKKyAgICAgIHsgR0NSWV9NRF9NRDUsCisJIlx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZCIKKwkiXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkIgorCSJceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGQiCisJIlx4ZGRceGRkXHhkZFx4ZGRceGRkIiwKKwkiXHhBQVx4QUFceEFBXHhBQVx4QUFceEFBXHhBQVx4QUFceEFBXHhBQVx4QUFceEFBXHhBQVx4QUFceEFBXHhBQSIsCisJIlx4NTZceGJlXHgzNFx4NTJceDFkXHgxNFx4NGNceDg4XHhkYlx4YjhceGM3XHgzM1x4ZjBceGU4XHhiM1x4ZjYiIH0sCisgICAgICB7IEdDUllfTURfTUQ1LAorCSJceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2QiCisJIlx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZCIKKwkiXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkIgorCSJceGNkXHhjZFx4Y2RceGNkXHhjZCIsCisJIlx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDdceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIKKwkiXHgxMFx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTdceDE4XHgxOSIsCisJIlx4NjlceDdlXHhhZlx4MGFceGNhXHgzYVx4M2FceGVhXHgzYVx4NzVceDE2XHg0N1x4NDZceGZmXHhhYVx4NzkiIH0sCisgICAgICB7IEdDUllfTURfTUQ1LCAiVGVzdCBXaXRoIFRydW5jYXRpb24iLAorCSJceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjIiwKKwkiXHg1Nlx4NDZceDFlXHhmMlx4MzRceDJlXHhkY1x4MDBceGY5XHhiYVx4YjlceDk1XHg2OVx4MGVceGZkXHg0YyIgfSwKKyAgICAgIHsgR0NSWV9NRF9NRDUsICJUZXN0IFVzaW5nIExhcmdlciBUaGFuIEJsb2NrLVNpemUgS2V5IC0gSGFzaCBLZXkgRmlyc3QiLAorCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkiXHhhYVx4YWFceGFhXHhhYVx4YWEiLAorCSJceDZiXHgxYVx4YjdceGZlXHg0Ylx4ZDdceGJmXHg4Zlx4MGJceDYyXHhlNlx4Y2VceDYxXHhiOVx4ZDBceGNkIiB9LAorICAgICAgeyBHQ1JZX01EX01ENSwKKwkiVGVzdCBVc2luZyBMYXJnZXIgVGhhbiBCbG9jay1TaXplIEtleSBhbmQgTGFyZ2VyIFRoYW4gT25lIEJsb2NrLVNpemUgRGF0YSIsCisJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCSJceGFhXHhhYVx4YWFceGFhXHhhYSIsCisJIlx4NmZceDYzXHgwZlx4YWRceDY3XHhjZFx4YTBceGVlXHgxZlx4YjFceGY1XHg2Mlx4ZGJceDNhXHhhNVx4M2UiLCB9LAorICAgICAgeyBHQ1JZX01EX1NIQTI1NiwgIndoYXQgZG8geWEgd2FudCBmb3Igbm90aGluZz8iLCAiSmVmZSIsCisJIlx4NWJceGRjXHhjMVx4NDZceGJmXHg2MFx4NzVceDRlXHg2YVx4MDRceDI0XHgyNlx4MDhceDk1XHg3NVx4YzdceDVhIgorCSJceDAwXHgzZlx4MDhceDlkXHgyN1x4MzlceDgzXHg5ZFx4ZWNceDU4XHhiOVx4NjRceGVjXHgzOFx4NDMiIH0sCisgICAgICB7IEdDUllfTURfU0hBMjU2LAorCSJIaSBUaGVyZSIsCisJIlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiIgorCSJceDBiXHgwYlx4MGIiLAorCSJceGIwXHgzNFx4NGNceDYxXHhkOFx4ZGJceDM4XHg1M1x4NWNceGE4XHhhZlx4Y2VceGFmXHgwYlx4ZjFceDJiXHg4OCIKKwkiXHgxZFx4YzJceDAwXHhjOVx4ODNceDNkXHhhN1x4MjZceGU5XHgzN1x4NmNceDJlXHgzMlx4Y2ZceGY3IiB9LAorICAgICAgeyBHQ1JZX01EX1NIQTI1NiwKKwkiXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkIgorCSJceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGQiCisJIlx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZCIKKwkiXHhkZFx4ZGRceGRkXHhkZFx4ZGQiLAorCSJceEFBXHhBQVx4QUFceEFBXHhBQVx4QUFceEFBXHhBQVx4QUFceEFBXHhBQVx4QUFceEFBXHhBQVx4QUFceEFBIgorCSJceEFBXHhBQVx4QUFceEFBIiwKKwkiXHg3N1x4M2VceGE5XHgxZVx4MzZceDgwXHgwZVx4NDZceDg1XHg0ZFx4YjhceGViXHhkMFx4OTFceDgxXHhhNyIKKwkiXHgyOVx4NTlceDA5XHg4Ylx4M2VceGY4XHhjMVx4MjJceGQ5XHg2M1x4NTVceDE0XHhjZVx4ZDVceDY1XHhmZSIgfSwKKyAgICAgIHsgR0NSWV9NRF9TSEEyNTYsCisJIlx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZCIKKwkiXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkIgorCSJceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2QiCisJIlx4Y2RceGNkXHhjZFx4Y2RceGNkIiwKKwkiXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwN1x4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIgorCSJceDEwXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxN1x4MThceDE5IiwKKwkiXHg4Mlx4NTVceDhhXHgzOFx4OWFceDQ0XHgzY1x4MGVceGE0XHhjY1x4ODFceDk4XHg5OVx4ZjJceDA4IgorCSJceDNhXHg4NVx4ZjBceGZhXHhhM1x4ZTVceDc4XHhmOFx4MDdceDdhXHgyZVx4M2ZceGY0XHg2N1x4MjlceDY2XHg1YiIgfSwKKyAgICAgIHsgR0NSWV9NRF9TSEEyNTYsIAorCSJUZXN0IFVzaW5nIExhcmdlciBUaGFuIEJsb2NrLVNpemUgS2V5IC0gSGFzaCBLZXkgRmlyc3QiLAorCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCSJceGFhXHhhYVx4YWEiLAorCSJceDYwXHhlNFx4MzFceDU5XHgxZVx4ZTBceGI2XHg3Zlx4MGRceDhhXHgyNlx4YWFceGNiXHhmNVx4YjdceDdmIgorCSJceDhlXHgwYlx4YzZceDIxXHgzN1x4MjhceGM1XHgxNFx4MDVceDQ2XHgwNFx4MGZceDBlXHhlM1x4N2ZceDU0IiB9LAorICAgICAgeyBHQ1JZX01EX1NIQTI1NiwgCisJIlRoaXMgaXMgYSB0ZXN0IHVzaW5nIGEgbGFyZ2VyIHRoYW4gYmxvY2stc2l6ZSBrZXkgYW5kIGEgbGFyZ2VyIHRoYW4gYmxvY2stc2l6ZSBkYXRhLiBUaGUga2V5IG5lZWRzIHRvIGJlIGhhc2hlZCBiZWZvcmUgYmVpbmcgdXNlZCBieSB0aGUgSE1BQyBhbGdvcml0aG0uIiwKKwkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkiXHhhYVx4YWFceGFhIiwKKwkiXHg5Ylx4MDlceGZmXHhhN1x4MWJceDk0XHgyZlx4Y2JceDI3XHg2M1x4NWZceGJjXHhkNVx4YjBceGU5XHg0NCIKKwkiXHhiZlx4ZGNceDYzXHg2NFx4NGZceDA3XHgxM1x4OTNceDhhXHg3Zlx4NTFceDUzXHg1Y1x4M2FceDM1XHhlMiIgfSwKKyAgICAgIHsgR0NSWV9NRF9TSEEyMjQsICJ3aGF0IGRvIHlhIHdhbnQgZm9yIG5vdGhpbmc/IiwgIkplZmUiLAorCSJceGEzXHgwZVx4MDFceDA5XHg4Ylx4YzZceGRiXHhiZlx4NDVceDY5XHgwZlx4M2FceDdlXHg5ZVx4NmRceDBmIgorCSJceDhiXHhiZVx4YTJceGEzXHg5ZVx4NjFceDQ4XHgwMFx4OGZceGQwXHg1ZVx4NDQiIH0sCisgICAgICB7IEdDUllfTURfU0hBMjI0LAorCSJIaSBUaGVyZSIsCisJIlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiIgorCSJceDBiXHgwYlx4MGIiLAorCSJceDg5XHg2Zlx4YjFceDEyXHg4YVx4YmJceGRmXHgxOVx4NjhceDMyXHgxMFx4N2NceGQ0XHg5ZFx4ZjNceDNmXHg0NyIKKwkiXHhiNFx4YjFceDE2XHg5OVx4MTJceGJhXHg0Zlx4NTNceDY4XHg0Ylx4MjIiIH0sCisgICAgICB7IEdDUllfTURfU0hBMjI0LAorCSJceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGQiCisJIlx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZCIKKwkiXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkIgorCSJceGRkXHhkZFx4ZGRceGRkXHhkZCIsCisJIlx4QUFceEFBXHhBQVx4QUFceEFBXHhBQVx4QUFceEFBXHhBQVx4QUFceEFBXHhBQVx4QUFceEFBXHhBQVx4QUEiCisJIlx4QUFceEFBXHhBQVx4QUEiLAorCSJceDdmXHhiM1x4Y2JceDM1XHg4OFx4YzZceGMxXHhmNlx4ZmZceGE5XHg2OVx4NGRceDdkXHg2YVx4ZDJceDY0IgorCSJceDkzXHg2NVx4YjBceGMxXHhmNlx4NWRceDY5XHhkMVx4ZWNceDgzXHgzM1x4ZWEiIH0sCisgICAgICB7IEdDUllfTURfU0hBMjI0LAorCSJceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2QiCisJIlx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZCIKKwkiXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkIgorCSJceGNkXHhjZFx4Y2RceGNkXHhjZCIsCisJIlx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDdceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIKKwkiXHgxMFx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTdceDE4XHgxOSIsCisJIlx4NmNceDExXHg1MFx4NjhceDc0XHgwMVx4M2NceGFjXHg2YVx4MmFceGJjXHgxYlx4YjNceDgyXHg2MiIKKwkiXHg3Y1x4ZWNceDZhXHg5MFx4ZDhceDZlXHhmY1x4MDFceDJkXHhlN1x4YWZceGVjXHg1YSIgfSwKKyAgICAgIHsgR0NSWV9NRF9TSEEyMjQsIAorCSJUZXN0IFVzaW5nIExhcmdlciBUaGFuIEJsb2NrLVNpemUgS2V5IC0gSGFzaCBLZXkgRmlyc3QiLAorCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCSJceGFhXHhhYVx4YWEiLAorCSJceDk1XHhlOVx4YTBceGRiXHg5Nlx4MjBceDk1XHhhZFx4YWVceGJlXHg5Ylx4MmRceDZmXHgwZFx4YmNceGUyIgorCSJceGQ0XHg5OVx4ZjFceDEyXHhmMlx4ZDJceGI3XHgyN1x4M2ZceGE2XHg4N1x4MGUiIH0sCisgICAgICB7IEdDUllfTURfU0hBMjI0LCAKKwkiVGhpcyBpcyBhIHRlc3QgdXNpbmcgYSBsYXJnZXIgdGhhbiBibG9jay1zaXplIGtleSBhbmQgYSBsYXJnZXIgdGhhbiBibG9jay1zaXplIGRhdGEuIFRoZSBrZXkgbmVlZHMgdG8gYmUgaGFzaGVkIGJlZm9yZSBiZWluZyB1c2VkIGJ5IHRoZSBITUFDIGFsZ29yaXRobS4iLAorCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCSJceGFhXHhhYVx4YWEiLAorCSJceDNhXHg4NVx4NDFceDY2XHhhY1x4NWRceDlmXHgwMlx4M2ZceDU0XHhkNVx4MTdceGQwXHhiM1x4OWRceGJkIgorCSJceDk0XHg2N1x4NzBceGRiXHg5Y1x4MmJceDk1XHhjOVx4ZjZceGY1XHg2NVx4ZDEiIH0sCisgICAgICB7IEdDUllfTURfU0hBMzg0LCAid2hhdCBkbyB5YSB3YW50IGZvciBub3RoaW5nPyIsICJKZWZlIiwKKwkiXHhhZlx4NDVceGQyXHhlM1x4NzZceDQ4XHg0MFx4MzFceDYxXHg3Zlx4NzhceGQyXHhiNVx4OGFceDZiXHgxYiIKKwkiXHg5Y1x4N2VceGY0XHg2NFx4ZjVceGEwXHgxYlx4NDdceGU0XHgyZVx4YzNceDczXHg2M1x4MjJceDQ0XHg1ZSIKKwkiXHg4ZVx4MjJceDQwXHhjYVx4NWVceDY5XHhlMlx4YzdceDhiXHgzMlx4MzlceGVjXHhmYVx4YjJceDE2XHg0OSIgfSwKKyAgICAgIHsgR0NSWV9NRF9TSEEzODQsCisJIkhpIFRoZXJlIiwKKwkiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGIiCisJIlx4MGJceDBiXHgwYiIsCisJIlx4YWZceGQwXHgzOVx4NDRceGQ4XHg0OFx4OTVceDYyXHg2Ylx4MDhceDI1XHhmNFx4YWJceDQ2XHg5MFx4N2ZceDE1IgorCSJceGY5XHhkYVx4ZGJceGU0XHgxMFx4MWVceGM2XHg4Mlx4YWFceDAzXHg0Y1x4N2NceGViXHhjNVx4OWNceGZhXHhlYSIKKwkiXHg5ZVx4YTlceDA3XHg2ZVx4ZGVceDdmXHg0YVx4ZjFceDUyXHhlOFx4YjJceGZhXHg5Y1x4YjYiIH0sCisgICAgICB7IEdDUllfTURfU0hBMzg0LAorCSJceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGQiCisJIlx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZCIKKwkiXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkIgorCSJceGRkXHhkZFx4ZGRceGRkXHhkZCIsCisJIlx4QUFceEFBXHhBQVx4QUFceEFBXHhBQVx4QUFceEFBXHhBQVx4QUFceEFBXHhBQVx4QUFceEFBXHhBQVx4QUEiCisJIlx4QUFceEFBXHhBQVx4QUEiLAorCSJceDg4XHgwNlx4MjZceDA4XHhkM1x4ZTZceGFkXHg4YVx4MGFceGEyXHhhY1x4ZTBceDE0XHhjOFx4YThceDZmIgorCSJceDBhXHhhNlx4MzVceGQ5XHg0N1x4YWNceDlmXHhlYlx4ZThceDNlXHhmNFx4ZTVceDU5XHg2Nlx4MTRceDRiIgorCSJceDJhXHg1YVx4YjNceDlkXHhjMVx4MzhceDE0XHhiOVx4NGVceDNhXHhiNlx4ZTFceDAxXHhhM1x4NGZceDI3IiB9LAorICAgICAgeyBHQ1JZX01EX1NIQTM4NCwKKwkiXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkIgorCSJceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2QiCisJIlx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZCIKKwkiXHhjZFx4Y2RceGNkXHhjZFx4Y2QiLAorCSJceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3XHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiCisJIlx4MTBceDExXHgxMlx4MTNceDE0XHgxNVx4MTZceDE3XHgxOFx4MTkiLAorCSJceDNlXHg4YVx4NjlceGI3XHg3OFx4M2NceDI1XHg4NVx4MTlceDMzXHhhYlx4NjJceDkwXHhhZlx4NmNceGE3IgorCSJceDdhXHg5OVx4ODFceDQ4XHgwOFx4NTBceDAwXHg5Y1x4YzVceDU3XHg3Y1x4NmVceDFmXHg1N1x4M2JceDRlIgorCSJceDY4XHgwMVx4ZGRceDIzXHhjNFx4YTdceGQ2XHg3OVx4Y2NceGY4XHhhM1x4ODZceGM2XHg3NFx4Y2ZceGZiIiB9LAorICAgICAgeyBHQ1JZX01EX1NIQTM4NCwgCisJIlRlc3QgVXNpbmcgTGFyZ2VyIFRoYW4gQmxvY2stU2l6ZSBLZXkgLSBIYXNoIEtleSBGaXJzdCIsCisJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJIlx4YWFceGFhXHhhYSIsCisJIlx4NGVceGNlXHgwOFx4NDRceDg1XHg4MVx4M2VceDkwXHg4OFx4ZDJceGM2XHgzYVx4MDRceDFiXHhjNVx4YjQiCisJIlx4NGZceDllXHhmMVx4MDFceDJhXHgyYlx4NThceDhmXHgzY1x4ZDFceDFmXHgwNVx4MDNceDNhXHhjNFx4YzYiCisJIlx4MGNceDJlXHhmNlx4YWJceDQwXHgzMFx4ZmVceDgyXHg5Nlx4MjRceDhkXHhmMVx4NjNceGY0XHg0OVx4NTIiIH0sCisgICAgICB7IEdDUllfTURfU0hBMzg0LCAKKwkiVGhpcyBpcyBhIHRlc3QgdXNpbmcgYSBsYXJnZXIgdGhhbiBibG9jay1zaXplIGtleSBhbmQgYSBsYXJnZXIgdGhhbiBibG9jay1zaXplIGRhdGEuIFRoZSBrZXkgbmVlZHMgdG8gYmUgaGFzaGVkIGJlZm9yZSBiZWluZyB1c2VkIGJ5IHRoZSBITUFDIGFsZ29yaXRobS4iLAorCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCSJceGFhXHhhYVx4YWEiLAorCSJceDY2XHgxN1x4MTdceDhlXHg5NFx4MWZceDAyXHgwZFx4MzVceDFlXHgyZlx4MjVceDRlXHg4Zlx4ZDNceDJjIgorCSJceDYwXHgyNFx4MjBceGZlXHhiMFx4YjhceGZiXHg5YVx4ZGNceGNlXHhiYlx4ODJceDQ2XHgxZVx4OTlceGM1IgorCSJceGE2XHg3OFx4Y2NceDMxXHhlN1x4OTlceDE3XHg2ZFx4MzhceDYwXHhlNlx4MTFceDBjXHg0Nlx4NTJceDNlIiB9LAorICAgICAgeyBHQ1JZX01EX1NIQTUxMiwgIndoYXQgZG8geWEgd2FudCBmb3Igbm90aGluZz8iLCAiSmVmZSIsCisJIlx4MTZceDRiXHg3YVx4N2JceGZjXHhmOFx4MTlceGUyXHhlM1x4OTVceGZiXHhlN1x4M2JceDU2XHhlMFx4YTMiCisJIlx4ODdceGJkXHg2NFx4MjJceDJlXHg4M1x4MWZceGQ2XHgxMFx4MjdceDBjXHhkN1x4ZWFceDI1XHgwNVx4NTQiCisJIlx4OTdceDU4XHhiZlx4NzVceGMwXHg1YVx4OTlceDRhXHg2ZFx4MDNceDRmXHg2NVx4ZjhceGYwXHhlNlx4ZmQiCisJIlx4Y2FceGVhXHhiMVx4YTNceDRkXHg0YVx4NmJceDRiXHg2M1x4NmVceDA3XHgwYVx4MzhceGJjXHhlN1x4MzciIH0sCisgICAgICB7IEdDUllfTURfU0hBNTEyLAorCSJIaSBUaGVyZSIsCisJIlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiIgorCSJceDBiXHgwYlx4MGIiLAorCSJceDg3XHhhYVx4N2NceGRlXHhhNVx4ZWZceDYxXHg5ZFx4NGZceGYwXHhiNFx4MjRceDFhXHgxZFx4NmNceGIwIgorCSJceDIzXHg3OVx4ZjRceGUyXHhjZVx4NGVceGMyXHg3OFx4N2FceGQwXHhiM1x4MDVceDQ1XHhlMVx4N2NceGRlIgorCSJceGRhXHhhOFx4MzNceGI3XHhkNlx4YjhceGE3XHgwMlx4MDNceDhiXHgyN1x4NGVceGFlXHhhM1x4ZjRceGU0IgorCSJceGJlXHg5ZFx4OTFceDRlXHhlYlx4NjFceGYxXHg3MFx4MmVceDY5XHg2Y1x4MjBceDNhXHgxMlx4NjhceDU0IiB9LAorICAgICAgeyBHQ1JZX01EX1NIQTUxMiwKKwkiXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkIgorCSJceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGQiCisJIlx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZCIKKwkiXHhkZFx4ZGRceGRkXHhkZFx4ZGQiLAorCSJceEFBXHhBQVx4QUFceEFBXHhBQVx4QUFceEFBXHhBQVx4QUFceEFBXHhBQVx4QUFceEFBXHhBQVx4QUFceEFBIgorCSJceEFBXHhBQVx4QUFceEFBIiwKKwkiXHhmYVx4NzNceGIwXHgwOFx4OWRceDU2XHhhMlx4ODRceGVmXHhiMFx4ZjBceDc1XHg2Y1x4ODlceDBiXHhlOSIKKwkiXHhiMVx4YjVceGRiXHhkZFx4OGVceGU4XHgxYVx4MzZceDU1XHhmOFx4M2VceDMzXHhiMlx4MjdceDlkXHgzOSIKKwkiXHhiZlx4M2VceDg0XHg4Mlx4NzlceGE3XHgyMlx4YzhceDA2XHhiNFx4ODVceGE0XHg3ZVx4NjdceGM4XHgwNyIKKwkiXHhiOVx4NDZceGEzXHgzN1x4YmVceGU4XHg5NFx4MjZceDc0XHgyN1x4ODhceDU5XHhlMVx4MzJceDkyXHhmYiIgIH0sCisgICAgICB7IEdDUllfTURfU0hBNTEyLAorCSJceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2QiCisJIlx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZCIKKwkiXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkIgorCSJceGNkXHhjZFx4Y2RceGNkXHhjZCIsCisJIlx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDdceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIKKwkiXHgxMFx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTdceDE4XHgxOSIsCisJIlx4YjBceGJhXHg0Nlx4NTZceDM3XHg0NVx4OGNceDY5XHg5MFx4ZTVceGE4XHhjNVx4ZjZceDFkXHg0YVx4ZjciCisJIlx4ZTVceDc2XHhkOVx4N2ZceGY5XHg0Ylx4ODdceDJkXHhlN1x4NmZceDgwXHg1MFx4MzZceDFlXHhlM1x4ZGIiCisJIlx4YTlceDFjXHhhNVx4YzFceDFhXHhhMlx4NWVceGI0XHhkNlx4NzlceDI3XHg1Y1x4YzVceDc4XHg4MFx4NjMiCisJIlx4YTVceGYxXHg5N1x4NDFceDEyXHgwY1x4NGZceDJkXHhlMlx4YWRceGViXHhlYlx4MTBceGEyXHg5OFx4ZGQiIH0sCisgICAgICB7IEdDUllfTURfU0hBNTEyLCAKKwkiVGVzdCBVc2luZyBMYXJnZXIgVGhhbiBCbG9jay1TaXplIEtleSAtIEhhc2ggS2V5IEZpcnN0IiwKKwkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkiXHhhYVx4YWFceGFhIiwKKwkiXHg4MFx4YjJceDQyXHg2M1x4YzdceGMxXHhhM1x4ZWJceGI3XHgxNFx4OTNceGMxXHhkZFx4N2JceGU4XHhiNCIKKwkiXHg5Ylx4NDZceGQxXHhmNFx4MWJceDRhXHhlZVx4YzFceDEyXHgxYlx4MDFceDM3XHg4M1x4ZjhceGYzXHg1MiIKKwkiXHg2Ylx4NTZceGQwXHgzN1x4ZTBceDVmXHgyNVx4OThceGJkXHgwZlx4ZDJceDIxXHg1ZFx4NmFceDFlXHg1MiIKKwkiXHg5NVx4ZTZceDRmXHg3M1x4ZjZceDNmXHgwYVx4ZWNceDhiXHg5MVx4NWFceDk4XHg1ZFx4NzhceDY1XHg5OCIgfSwKKyAgICAgIHsgR0NSWV9NRF9TSEE1MTIsIAorCSJUaGlzIGlzIGEgdGVzdCB1c2luZyBhIGxhcmdlciB0aGFuIGJsb2NrLXNpemUga2V5IGFuZCBhIGxhcmdlciB0aGFuIGJsb2NrLXNpemUgZGF0YS4gVGhlIGtleSBuZWVkcyB0byBiZSBoYXNoZWQgYmVmb3JlIGJlaW5nIHVzZWQgYnkgdGhlIEhNQUMgYWxnb3JpdGhtLiIsCisJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJIlx4YWFceGFhXHhhYSIsCisJIlx4ZTNceDdiXHg2YVx4NzdceDVkXHhjOFx4N2RceGJhXHhhNFx4ZGZceGE5XHhmOVx4NmVceDVlXHgzZlx4ZmQiCisJIlx4ZGVceGJkXHg3MVx4ZjhceDg2XHg3Mlx4ODlceDg2XHg1ZFx4ZjVceGEzXHgyZFx4MjBceGNkXHhjOVx4NDQiCisJIlx4YjZceDAyXHgyY1x4YWNceDNjXHg0OVx4ODJceGIxXHgwZFx4NWVceGViXHg1NVx4YzNceGU0XHhkZVx4MTUiCisJIlx4MTNceDQ2XHg3Nlx4ZmJceDZkXHhlMFx4NDRceDYwXHg2NVx4YzlceDc0XHg0MFx4ZmFceDhjXHg2YVx4NTgiIH0sCisgICAgICB7CTAgfSwKKyAgICB9OworICBpbnQgaTsKKworICBpZiAodmVyYm9zZSkKKyAgICBmcHJpbnRmIChzdGRlcnIsICJTdGFydGluZyBoYXNoZWQgTUFDIGNoZWNrcy5cbiIpOworCisgIGZvciAoaSA9IDA7IGFsZ29zW2ldLm1kOyBpKyspCisgICAgeworICAgICAgaWYgKChnY3J5X21kX3Rlc3RfYWxnbyAoYWxnb3NbaV0ubWQpIHx8IGFsZ29zW2ldLm1kID09IEdDUllfTURfTUQ1KQorICAgICAgICAgICYmIGluX2ZpcHNfbW9kZSkKKyAgICAgICAgeworICAgICAgICAgIGlmICh2ZXJib3NlKQorICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiICBhbGdvcml0aG0gJWQgbm90IGF2YWlsYWJsZSBpbiBmaXBzIG1vZGVcbiIsCisJCSAgICAgYWxnb3NbaV0ubWQpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICBpZiAodmVyYm9zZSkKKwlmcHJpbnRmIChzdGRlcnIsIAorICAgICAgICAgICAgICAgICAiICBjaGVja2luZyAlcyBbJWldIGZvciAlemkgYnl0ZSBrZXkgYW5kICV6aSBieXRlIGRhdGFcbiIsIAorCQkgZ2NyeV9tZF9hbGdvX25hbWUgKGFsZ29zW2ldLm1kKSwKKwkJIGFsZ29zW2ldLm1kLAorCQkgc3RybGVuKGFsZ29zW2ldLmtleSksIHN0cmxlbihhbGdvc1tpXS5kYXRhKSk7CisKKyAgICAgIGNoZWNrX29uZV9obWFjIChhbGdvc1tpXS5tZCwgYWxnb3NbaV0uZGF0YSwgc3RybGVuIChhbGdvc1tpXS5kYXRhKSwKKwkJICAgICAgYWxnb3NbaV0ua2V5LCBzdHJsZW4oYWxnb3NbaV0ua2V5KSwKKwkJICAgICAgYWxnb3NbaV0uZXhwZWN0KTsKKyAgICB9CisKKyAgaWYgKHZlcmJvc2UpCisgICAgZnByaW50ZiAoc3RkZXJyLCAiQ29tcGxldGVkIGhhc2hlZCBNQUMgY2hlY2tzLlxuIik7CisgfQorCisvKiBDaGVjayB0aGF0IHRoZSBzaWduYXR1cmUgU0lHIG1hdGNoZXMgdGhlIGhhc2ggSEFTSC4gUEtFWSBpcyB0aGUKKyAgIHB1YmxpYyBrZXkgdXNlZCBmb3IgdGhlIHZlcmlmaWNhdGlvbi4gQkFESEFTSCBpcyBhIGhhc3ZhbHVlIHdoaWNoCisgICBzaG91bGQ7IHJlc3VsdCBpbiBhIGJhZCBzaWduYXR1cmUgc3RhdHVzLiAqLworc3RhdGljIHZvaWQKK3ZlcmlmeV9vbmVfc2lnbmF0dXJlIChnY3J5X3NleHBfdCBwa2V5LCBnY3J5X3NleHBfdCBoYXNoLAorCQkgICAgICBnY3J5X3NleHBfdCBiYWRoYXNoLCBnY3J5X3NleHBfdCBzaWcpCit7CisgIGdjcnlfZXJyb3JfdCByYzsKKworICByYyA9IGdjcnlfcGtfdmVyaWZ5IChzaWcsIGhhc2gsIHBrZXkpOworICBpZiAocmMpCisgICAgZmFpbCAoImdjcnlfcGtfdmVyaWZ5IGZhaWxlZDogJXNcbiIsIGdwZ19zdHJlcnJvciAocmMpKTsKKyAgcmMgPSBnY3J5X3BrX3ZlcmlmeSAoc2lnLCBiYWRoYXNoLCBwa2V5KTsKKyAgaWYgKGdjcnlfZXJyX2NvZGUgKHJjKSAhPSBHUEdfRVJSX0JBRF9TSUdOQVRVUkUpCisgICAgZmFpbCAoImdjcnlfcGtfdmVyaWZ5IGZhaWxlZCB0byBkZXRlY3QgYSBiYWQgc2lnbmF0dXJlOiAlc1xuIiwKKwkgIGdwZ19zdHJlcnJvciAocmMpKTsKK30KKworCisvKiBUZXN0IHRoZSBwdWJsaWMga2V5IHNpZ24gZnVuY3Rpb24gdXNpbmcgdGhlIHByaXZhdGUga2V0IFNLRVkuIFBLRVkKKyAgIGlzIHVzZWQgZm9yIHZlcmlmaWNhdGlvbi4gKi8KK3N0YXRpYyB2b2lkCitjaGVja19wdWJrZXlfc2lnbiAoaW50IG4sIGdjcnlfc2V4cF90IHNrZXksIGdjcnlfc2V4cF90IHBrZXkpCit7CisgIGdjcnlfZXJyb3JfdCByYzsKKyAgZ2NyeV9zZXhwX3Qgc2lnLCBiYWRoYXNoLCBoYXNoOworICBpbnQgZGF0YWlkeDsKKyAgc3RhdGljIGNvbnN0IGNoYXIgYmFkZGF0YVtdID0KKyAgICAiKGRhdGFcbiAoZmxhZ3MgcGtjczEpXG4iCisgICAgIiAoaGFzaCBzaGExICMxMTIyMzM0NDU1NjY3Nzg4OTkwMEFBQkJDQ0RERUVGRjEwMjAzMDQxIykpXG4iOworICBzdGF0aWMgc3RydWN0CisgIHsKKyAgICBjb25zdCBjaGFyICpkYXRhOworICAgIGludCBleHBlY3RlZF9yYzsKKyAgfSBkYXRhc1tdID0KKyAgICB7CisgICAgICB7ICIoZGF0YVxuIChmbGFncyBwa2NzMSlcbiIKKwkiIChoYXNoIHNoYTEgIzExMjIzMzQ0NTU2Njc3ODg5OTAwQUFCQkNDRERFRUZGMTAyMDMwNDAjKSlcbiIsCisJMCB9LAorICAgICAgLyogVGhpcyB0ZXN0IGlzIHRvIHNlZSB3aGV0aGVyIGhhc2ggYWxnb3JpdGhtcyBub3QgaGFyZCB3aXJlZCBpbgorICAgICAgICAgcHVia2V5LmMgYXJlIGRldGVjdGVkOiAgKi8KKyAgICAgIHsgIihkYXRhXG4gKGZsYWdzIHBrY3MxKVxuIgorCSIgKGhhc2ggb2lkLjEuMy4xNC4zLjIuMjkgIgorICAgICAgICAiICAgICAgICMxMTIyMzM0NDU1NjY3Nzg4OTkwMEFBQkJDQ0RERUVGRjEwMjAzMDQwIykpXG4iLAorCTAgfSwKKyAgICAgIHsJIihkYXRhXG4gKGZsYWdzIClcbiIKKwkiIChoYXNoIHNoYTEgIzExMjIzMzQ0NTU2Njc3ODg5OTAwQUFCQkNDRERFRUZGMTAyMDMwNDAjKSlcbiIsCisJR1BHX0VSUl9DT05GTElDVCB9LAorICAgICAgewkiKGRhdGFcbiAoZmxhZ3MgcGtjczEpXG4iCisJIiAoaGFzaCBmb28gIzExMjIzMzQ0NTU2Njc3ODg5OTAwQUFCQkNDRERFRUZGMTAyMDMwNDAjKSlcbiIsCisJR1BHX0VSUl9ESUdFU1RfQUxHTyB9LAorICAgICAgewkiKGRhdGFcbiAoZmxhZ3MgKVxuIiAiICh2YWx1ZSAjMTEyMjMzNDQ1NTY2Nzc4ODk5MDBBQSMpKVxuIiwKKwkwIH0sCisgICAgICB7CSIoZGF0YVxuIChmbGFncyApXG4iICIgKHZhbHVlICMwMDkwMjIzMzQ0NTU2Njc3ODg5OTAwQUEjKSlcbiIsCisJMCB9LAorICAgICAgeyAiKGRhdGFcbiAoZmxhZ3MgcmF3KVxuIiAiICh2YWx1ZSAjMTEyMjMzNDQ1NTY2Nzc4ODk5MDBBQSMpKVxuIiwKKwkwIH0sCisgICAgICB7CSIoZGF0YVxuIChmbGFncyBwa2NzMSlcbiIKKwkiICh2YWx1ZSAjMTEyMjMzNDQ1NTY2Nzc4ODk5MDBBQSMpKVxuIiwKKwlHUEdfRVJSX0NPTkZMSUNUIH0sCisgICAgICB7ICIoZGF0YVxuIChmbGFncyByYXcgZm9vKVxuIgorCSIgKHZhbHVlICMxMTIyMzM0NDU1NjY3Nzg4OTkwMEFBIykpXG4iLAorCUdQR19FUlJfSU5WX0ZMQUcgfSwKKyAgICAgIHsgTlVMTCB9CisgICAgfTsKKworICAodm9pZCluOworCisgIHJjID0gZ2NyeV9zZXhwX3NzY2FuICgmYmFkaGFzaCwgTlVMTCwgYmFkZGF0YSwgc3RybGVuIChiYWRkYXRhKSk7CisgIGlmIChyYykKKyAgICBkaWUgKCJjb252ZXJ0aW5nIGRhdGEgZmFpbGVkOiAlc1xuIiwgZ3BnX3N0cmVycm9yIChyYykpOworCisgIGZvciAoZGF0YWlkeCA9IDA7IGRhdGFzW2RhdGFpZHhdLmRhdGE7IGRhdGFpZHgrKykKKyAgICB7CisgICAgICBpZiAodmVyYm9zZSkKKwlmcHJpbnRmIChzdGRlcnIsICIgIHNpZ25hdHVyZSB0ZXN0ICVkXG4iLCBkYXRhaWR4KTsKKworICAgICAgcmMgPSBnY3J5X3NleHBfc3NjYW4gKCZoYXNoLCBOVUxMLCBkYXRhc1tkYXRhaWR4XS5kYXRhLAorCQkJICAgIHN0cmxlbiAoZGF0YXNbZGF0YWlkeF0uZGF0YSkpOworICAgICAgaWYgKHJjKQorCWRpZSAoImNvbnZlcnRpbmcgZGF0YSBmYWlsZWQ6ICVzXG4iLCBncGdfc3RyZXJyb3IgKHJjKSk7CisKKyAgICAgIHJjID0gZ2NyeV9wa19zaWduICgmc2lnLCBoYXNoLCBza2V5KTsKKyAgICAgIGlmIChnY3J5X2Vycl9jb2RlIChyYykgIT0gZGF0YXNbZGF0YWlkeF0uZXhwZWN0ZWRfcmMpCisJZmFpbCAoImdjcnlfcGtfc2lnbiBmYWlsZWQ6ICVzXG4iLCBncGdfc3RyZXJyb3IgKHJjKSk7CisKKyAgICAgIGlmICghcmMpCisJdmVyaWZ5X29uZV9zaWduYXR1cmUgKHBrZXksIGhhc2gsIGJhZGhhc2gsIHNpZyk7CisKKyAgICAgIGdjcnlfc2V4cF9yZWxlYXNlIChzaWcpOworICAgICAgc2lnID0gTlVMTDsKKyAgICAgIGdjcnlfc2V4cF9yZWxlYXNlIChoYXNoKTsKKyAgICAgIGhhc2ggPSBOVUxMOworICAgIH0KKworICBnY3J5X3NleHBfcmVsZWFzZSAoYmFkaGFzaCk7Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19wdWJrZXlfZ3JpcCAoaW50IG4sIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmdyaXAsCisJCSAgIGdjcnlfc2V4cF90IHNrZXksIGdjcnlfc2V4cF90IHBrZXkpCit7CisgIHVuc2lnbmVkIGNoYXIgc2dyaXBbMjBdLCBwZ3JpcFsyMF07CisKKyAgaWYgKCFnY3J5X3BrX2dldF9rZXlncmlwIChza2V5LCBzZ3JpcCkpCisgICAgZGllICgiZ2V0IGtleWdyaXAgZm9yIHByaXZhdGUgUlNBIGtleSBmYWlsZWRcbiIpOworICBpZiAoIWdjcnlfcGtfZ2V0X2tleWdyaXAgKHBrZXksIHBncmlwKSkKKyAgICBkaWUgKCJbJWldIGdldCBrZXlncmlwIGZvciBwdWJsaWMgUlNBIGtleSBmYWlsZWRcbiIsIG4pOworICBpZiAobWVtY21wIChzZ3JpcCwgcGdyaXAsIDIwKSkKKyAgICBmYWlsICgiWyVpXSBrZXlncmlwcyBkb24ndCBtYXRjaFxuIiwgbik7CisgIGlmIChtZW1jbXAgKHNncmlwLCBncmlwLCAyMCkpCisgICAgZmFpbCAoIndyb25nIGtleWdyaXAgZm9yIFJTQSBrZXlcbiIpOworfQorCitzdGF0aWMgdm9pZAorZG9fY2hlY2tfb25lX3B1YmtleSAoaW50IG4sIGdjcnlfc2V4cF90IHNrZXksIGdjcnlfc2V4cF90IHBrZXksCisJCSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZ3JpcCwgaW50IGZsYWdzKQoreworIGlmIChmbGFncyAmIEZMQUdfU0lHTikKKyAgICBjaGVja19wdWJrZXlfc2lnbiAobiwgc2tleSwgcGtleSk7CisgaWYgKGdyaXAgJiYgKGZsYWdzICYgRkxBR19HUklQKSkKKyAgIGNoZWNrX3B1YmtleV9ncmlwIChuLCBncmlwLCBza2V5LCBwa2V5KTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX29uZV9wdWJrZXkgKGludCBuLCB0ZXN0X3NwZWNfcHVia2V5X3Qgc3BlYykKK3sKKyAgZ2NyeV9lcnJvcl90IGVyciA9IEdQR19FUlJfTk9fRVJST1I7CisgIGdjcnlfc2V4cF90IHNrZXksIHBrZXk7CisKKyAgZXJyID0gZ2NyeV9zZXhwX3NzY2FuICgmc2tleSwgTlVMTCwgc3BlYy5rZXkuc2VjcmV0LAorCQkJIHN0cmxlbiAoc3BlYy5rZXkuc2VjcmV0KSk7CisgIGlmICghZXJyKQorICAgIGVyciA9IGdjcnlfc2V4cF9zc2NhbiAoJnBrZXksIE5VTEwsIHNwZWMua2V5LnB1YmxpYywKKwkJCSAgIHN0cmxlbiAoc3BlYy5rZXkucHVibGljKSk7CisgIGlmIChlcnIpCisgICAgZGllICgiY29udmVydGluZyBzYW1wbGUga2V5IGZhaWxlZDogJXNcbiIsIGdwZ19zdHJlcnJvciAoZXJyKSk7CisKKyAgZG9fY2hlY2tfb25lX3B1YmtleSAobiwgc2tleSwgcGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKXNwZWMua2V5LmdyaXAsIHNwZWMuZmxhZ3MpOworIAorICBnY3J5X3NleHBfcmVsZWFzZSAoc2tleSk7CisgIGdjcnlfc2V4cF9yZWxlYXNlIChwa2V5KTsKK30KKworc3RhdGljIHZvaWQKK2dldF9rZXlzX25ldyAoZ2NyeV9zZXhwX3QgKnBrZXksIGdjcnlfc2V4cF90ICpza2V5KQoreworICBnY3J5X3NleHBfdCBrZXlfc3BlYywga2V5LCBwdWJfa2V5LCBzZWNfa2V5OworICBpbnQgcmM7CisgIGlmICh2ZXJib3NlKQorICAgIGZwcmludGYgKHN0ZGVyciwgIiAgZ2VuZXJhdGluZyBSU0Ega2V5OiIpOyAgCisgIHJjID0gZ2NyeV9zZXhwX25ldyAoJmtleV9zcGVjLAorCQkgICAgICBpbl9maXBzX21vZGUgPyAiKGdlbmtleSAocnNhIChuYml0cyA0OjEwMjQpKSkiCisgICAgICAgICAgICAgICAgICAgICAgOiAiKGdlbmtleSAocnNhIChuYml0cyA0OjEwMjQpKHRyYW5zaWVudC1rZXkpKSkiLCAKKyAgICAgICAgICAgICAgICAgICAgICAwLCAxKTsKKyAgaWYgKHJjKQorICAgIGRpZSAoImVycm9yIGNyZWF0aW5nIFMtZXhwcmVzc2lvbjogJXNcbiIsIGdwZ19zdHJlcnJvciAocmMpKTsKKyAgcmMgPSBnY3J5X3BrX2dlbmtleSAoJmtleSwga2V5X3NwZWMpOworICBnY3J5X3NleHBfcmVsZWFzZSAoa2V5X3NwZWMpOworICBpZiAocmMpCisgICAgZGllICgiZXJyb3IgZ2VuZXJhdGluZyBSU0Ega2V5OiAlc1xuIiwgZ3BnX3N0cmVycm9yIChyYykpOworICAgIAorICBwdWJfa2V5ID0gZ2NyeV9zZXhwX2ZpbmRfdG9rZW4gKGtleSwgInB1YmxpYy1rZXkiLCAwKTsKKyAgaWYgKCEgcHViX2tleSkKKyAgICBkaWUgKCJwdWJsaWMgcGFydCBtaXNzaW5nIGluIGtleVxuIik7CisKKyAgc2VjX2tleSA9IGdjcnlfc2V4cF9maW5kX3Rva2VuIChrZXksICJwcml2YXRlLWtleSIsIDApOworICBpZiAoISBzZWNfa2V5KQorICAgIGRpZSAoInByaXZhdGUgcGFydCBtaXNzaW5nIGluIGtleVxuIik7CisKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKGtleSk7CisgICpwa2V5ID0gcHViX2tleTsKKyAgKnNrZXkgPSBzZWNfa2V5OworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfb25lX3B1YmtleV9uZXcgKGludCBuKQoreworICBnY3J5X3NleHBfdCBza2V5LCBwa2V5OworCisgIGdldF9rZXlzX25ldyAoJnBrZXksICZza2V5KTsKKyAgZG9fY2hlY2tfb25lX3B1YmtleSAobiwgc2tleSwgcGtleSwgTlVMTCwgRkxBR19TSUdOIHwgRkxBR19DUllQVCk7Cit9CisKKy8qIFJ1biBhbGwgdGVzdHMgZm9yIHRoZSBwdWJsaWMga2V5IGZ1bmN0aW9ucy4gKi8KK3N0YXRpYyB2b2lkCitjaGVja19wdWJrZXkgKHZvaWQpCit7CisgIHRlc3Rfc3BlY19wdWJrZXlfdCBwdWJrZXlzW10gPQorICAgIHsKKyAgICAgIHsKKwlHQ1JZX1BLX1JTQSwgRkxBR19DUllQVCB8IEZMQUdfU0lHTiwKKworCXsgIihwcml2YXRlLWtleVxuIgorCSAgIiAocnNhXG4iCisJICAiICAobiAjMDBlMGNlOTZmOTBiNmM5ZTAyZjM5MjJiZWFkYTkzZmU1MGE4NzVlYWM2YmNjMThiYjlhOWNmMmU4NDk2NWNhYSIKKwkgICIgICAgICAyZDFmZjk1YTdmNTQyNDY1YzZjMGMxOWQyNzZlNDUyNmNlMDQ4ODY4YTdhOTE0ZmQzNDNjYzNhODdkZDc0MjkxIgorCSAgIiAgICAgIGZmYzU2NTUwNmQ1YmJiMjVjYmFjNmEwZTJkZDFmOGJjYWFiMGQ0YTI5YzJmMzdjOTUwZjM2MzQ4NGJmMjY5ZjciCisJICAiICAgICAgODkxNDQwNDY0YmFmNzk4MjdlMDNhMzZlNzBiODE0OTM4ZWViZGM2M2U5NjQyNDdiZTc1ZGM1OGIwMTRiN2VhMjUxIylcbiIKKwkgICIgIChlICMwMTAwMDEjKVxuIgorCSAgIiAgKGQgIzA0NjEyOUYyNDg5RDcxNTc5QkUwQTc1RkUwMjlCRDZDREI1NzRFQkY1N0VBOEE1QjBGREE5NDJDQUI5NDNCMTEiCisJICAiICAgICAgN0Q3QkI5NUU1RDI4ODc1RTBGOUZDNUZDQzA2QTcyRjZENTAyNDY0REFCREVENzhFRjZCNzE2MTc3QjgzRDVCRCIKKwkgICIgICAgICBDNTQzREM1RDNGRUQ5MzJFNTlGNTg5N0U5MkU2RjU4QTBGMzM0MjQxMDZBM0I2RkEyQ0JGODc3NTEwRTRBQzIxIgorCSAgIiAgICAgIEMzRUU0Nzg1MUU5N0QxMjk5NjIyMkFDMzU2NkQ0Q0NCMEI4M0QxNjQwNzRBQkY3REU2NTVGQzI0NDZEQTE3ODEjKVxuIgorCSAgIiAgKHAgIzAwZTg2MWI3MDBlMTdlOGFmZTY4MzdlNzUxMmUzNWI2Y2ExMWQwYWU0N2Q4Yjg1MTYxYzY3YmFmNjQzNzcyMTMiCisJICAiICAgICAgZmU1MmQ3NzJmMjAzNWIzY2E4MzBhZjQxZDhhNDEyMGUxYzFjNzBkMTJjYzIyZjAwZDI4ZDMxZGQ0OGE4ZDQyNGYxIylcbiIKKwkgICIgIChxICMwMGY3YTdjYTUzNjdjNjYxZjhlNjJkZjM0ZjBkMDVjMTBjODhlNTQ5MjM0OGRkN2JkZGM5NDJjOWE4ZjM2OWY5IgorCSAgIiAgICAgIDM1YTA3Nzg1ZDJkYjgwNTIxNWVkNzg2ZTQyODVkZjE2NThlZWQzY2U4NGY0NjliODFiNTBkMzU4NDA3YjRhZDM2MSMpXG4iCisJICAiICAodSAjMzA0NTU5YTllYWQ1NmQyMzA5ZDIwMzgxMWE2NDFiYjFhMDk2MjZiYzhlYjM2ZmZmYTIzYzk2OGVjNWJkODkxZSIKKwkgICIgICAgICBlYmJhZmM3M2FlNjY2ZTAxYmE3Yzg5OTBiYWUwNmNjMmJiZTEwYjc1ZTY5ZmNhY2IzNTNhNjQ3MzA3OWQ4ZTliIykpKVxuIiwKKworCSAgIihwdWJsaWMta2V5XG4iCisJICAiIChyc2FcbiIKKwkgICIgIChuICMwMGUwY2U5NmY5MGI2YzllMDJmMzkyMmJlYWRhOTNmZTUwYTg3NWVhYzZiY2MxOGJiOWE5Y2YyZTg0OTY1Y2FhIgorCSAgIiAgICAgIDJkMWZmOTVhN2Y1NDI0NjVjNmMwYzE5ZDI3NmU0NTI2Y2UwNDg4NjhhN2E5MTRmZDM0M2NjM2E4N2RkNzQyOTEiCisJICAiICAgICAgZmZjNTY1NTA2ZDViYmIyNWNiYWM2YTBlMmRkMWY4YmNhYWIwZDRhMjljMmYzN2M5NTBmMzYzNDg0YmYyNjlmNyIKKwkgICIgICAgICA4OTE0NDA0NjRiYWY3OTgyN2UwM2EzNmU3MGI4MTQ5MzhlZWJkYzYzZTk2NDI0N2JlNzVkYzU4YjAxNGI3ZWEyNTEjKVxuIgorCSAgIiAgKGUgIzAxMDAwMSMpKSlcbiIsCisKKwkgICJceDMyXHgxMFx4MGNceDI3XHgxN1x4M2VceGY2XHhlOVx4YzRceGU5IgorCSAgIlx4YTJceDVkXHgzZFx4NjlceGY4XHg2ZFx4MzdceGE0XHhmOVx4MzkifQorICAgICAgfSwKKyAgICAgIHsKKwlHQ1JZX1BLX0RTQSwgRkxBR19TSUdOLAorCisJeyAiKHByaXZhdGUta2V5XG4iCisJICAiIChEU0FcbiIKKwkgICIgIChwICMwMEFEN0MwMDI1QkExQTE1Rjc3NUYzRjJENjczNzE4MzkxRDAwNDU2OTc4RDM0N0IzM0Q3QjQ5RTdGMzJFREFCIgorCSAgIiAgICAgIDk2MjczODk5REQ4QjJCQjQ2Q0Q2RUNBMjYzRkFGMDRBMjg5MDM1MDNENTkwNjJBODg2NUQyQUU4QURGQjUxOTEiCisJICAiICAgICAgQ0YzNkZGQjU2MkQwRTJGNTgwOTgwMUExRjY3NURBRTU5Njk4QTlFMDFFRkU4RDdEQ0ZDQTA4NEY0QzZGNUE0NCIKKwkgICIgICAgICA0NEQ0OTlBMDZGRkFFQTVFOEVGNUUwMUYyRkQyMEE3QjdFRjNGNjk2OEFGQkExRkI4RDkxRjE1NTlENTJEODc3N0IjKVxuIgorCSAgIiAgKHEgIzAwRUI3QjU3NTFEMjVFQkJCN0JENTlEOTIwMzE1RkQ4NDBFMTlBRUJGOSMpXG4iCisJICAiICAoZyAjMTU3NDM2MzM4N0ZERkQxRERGMzhGNEZCRTEzNUJCMjBDN0VFNDc3MkZCOTRDMzM3QUY4NkVBOEU0OTY2NjUwMyIKKwkgICIgICAgICBBRTA0QjZCRTgxQTJGOEREMDk1MzExRTAyMTdBQ0E2OThBMTFFNkM1RDMzQ0NEQUU3MTQ5OEVEMzVEMTM5OTFFIgorCSAgIiAgICAgIEIwMkYwOUFCNDBCRDhGNEM1RUQ4Qzc1REE3NzlEMEFFMTA0QkMzNEM5NjBCMDAyMzc3MDY4QUI0QjVBMUY5ODQiCisJICAiICAgICAgM0ZCQTkxRjUzN0YxQjdDQUM0RDhERDZEODlCMEQ4NjNBRjcwMjVENTQ5RjlDNzY1RDJGQzA3RUUyMDhGOEQxNSMpXG4iCisJICAiICAoeSAjNjRCMTFFRjg4NzFCRTRBQjU3MkFBODEwRDVEM0NBMTFBNkNEQkM2MzdBODAxNDYwMkM3Mjk2MERCMTM1QkY0NiIKKwkgICIgICAgICBBMTgxNkE3MjRDMzRGODczMzBGQzlFMTg3QzVENjY4OTdBMDQ1MzVDQzJBQzkxNjRBNzE1MEFCRkE4MTc5ODI3IgorCSAgIiAgICAgIDZFNDU4MzFBQjgxMUVFRTg0OEVCQjI0RDlGNUYyODgzQjZFNUREQzRDNjU5REVGOTQ0RENGRDgwQkY0RDBBMjAiCisJICAiICAgICAgNDJDQUE3REMyODlGMEM1QTlEMTU1RjAyRDNENTUxREI3NDFBODE2OTVCNzRENEM4RjQ3N0Y5Qzc4MzhFQjBGQiMpXG4iCisJICAiICAoeCAjMTFENTRFNEFEQkQzMDM0MTYwRjJDRUQ0QjdDRDI5MkE0RUJGM0VDMCMpKSlcbiIsCisKKwkgICIocHVibGljLWtleVxuIgorCSAgIiAoRFNBXG4iCisJICAiICAocCAjMDBBRDdDMDAyNUJBMUExNUY3NzVGM0YyRDY3MzcxODM5MUQwMDQ1Njk3OEQzNDdCMzNEN0I0OUU3RjMyRURBQiIKKwkgICIgICAgICA5NjI3Mzg5OUREOEIyQkI0NkNENkVDQTI2M0ZBRjA0QTI4OTAzNTAzRDU5MDYyQTg4NjVEMkFFOEFERkI1MTkxIgorCSAgIiAgICAgIENGMzZGRkI1NjJEMEUyRjU4MDk4MDFBMUY2NzVEQUU1OTY5OEE5RTAxRUZFOEQ3RENGQ0EwODRGNEM2RjVBNDQiCisJICAiICAgICAgNDRENDk5QTA2RkZBRUE1RThFRjVFMDFGMkZEMjBBN0I3RUYzRjY5NjhBRkJBMUZCOEQ5MUYxNTU5RDUyRDg3NzdCIylcbiIKKwkgICIgIChxICMwMEVCN0I1NzUxRDI1RUJCQjdCRDU5RDkyMDMxNUZEODQwRTE5QUVCRjkjKVxuIgorCSAgIiAgKGcgIzE1NzQzNjMzODdGREZEMURERjM4RjRGQkUxMzVCQjIwQzdFRTQ3NzJGQjk0QzMzN0FGODZFQThFNDk2NjY1MDMiCisJICAiICAgICAgQUUwNEI2QkU4MUEyRjhERDA5NTMxMUUwMjE3QUNBNjk4QTExRTZDNUQzM0NDREFFNzE0OThFRDM1RDEzOTkxRSIKKwkgICIgICAgICBCMDJGMDlBQjQwQkQ4RjRDNUVEOEM3NURBNzc5RDBBRTEwNEJDMzRDOTYwQjAwMjM3NzA2OEFCNEI1QTFGOTg0IgorCSAgIiAgICAgIDNGQkE5MUY1MzdGMUI3Q0FDNEQ4REQ2RDg5QjBEODYzQUY3MDI1RDU0OUY5Qzc2NUQyRkMwN0VFMjA4RjhEMTUjKVxuIgorCSAgIiAgKHkgIzY0QjExRUY4ODcxQkU0QUI1NzJBQTgxMEQ1RDNDQTExQTZDREJDNjM3QTgwMTQ2MDJDNzI5NjBEQjEzNUJGNDYiCisJICAiICAgICAgQTE4MTZBNzI0QzM0Rjg3MzMwRkM5RTE4N0M1RDY2ODk3QTA0NTM1Q0MyQUM5MTY0QTcxNTBBQkZBODE3OTgyNyIKKwkgICIgICAgICA2RTQ1ODMxQUI4MTFFRUU4NDhFQkIyNEQ5RjVGMjg4M0I2RTVEREM0QzY1OURFRjk0NERDRkQ4MEJGNEQwQTIwIgorCSAgIiAgICAgIDQyQ0FBN0RDMjg5RjBDNUE5RDE1NUYwMkQzRDU1MURCNzQxQTgxNjk1Qjc0RDRDOEY0NzdGOUM3ODM4RUIwRkIjKSkpXG4iLAorCisJICAiXHhjNlx4MzlceDgzXHgxYVx4NDNceGU1XHgwNVx4NWRceGM2XHhkOCIKKwkgICJceDRhXHhhNlx4ZjlceGViXHgyM1x4YmZceGE5XHgxMlx4MmRceDViIiB9CisgICAgICB9LAorICAgICAgeworCUdDUllfUEtfRUxHLCBGTEFHX1NJR04gfCBGTEFHX0NSWVBULAorCisJeyAiKHByaXZhdGUta2V5XG4iCisJICAiIChFTEdcbiIKKwkgICIgIChwICMwMEI5M0I5MzM4NjM3NUYwNkMyRDM4NTYwRjNCOUM2RDZEN0I3NTA2QjIwQzE3NzNGNzNGOERFNTZFNkNENjVEIgorCSAgIiAgICAgIEY0OERGQUFBMUU5M0Y1N0EyNzg5QjE2ODM2MkEwRjc4NzMyMDQ5OUYwQjI0NjFEM0E0MjY4NzU3QTdCMjc1MTciCisJICAiICAgICAgQjdEMjAzNjU0QTBDRDQ4NERFQzZBRjYwQzg1RkVCODRBQUMzODJFQUYyMDQ3MDYxRkU1REFCODFBMjBBMDc5NyIKKwkgICIgICAgICA2RTg3MzU5ODg5QkFFM0IzNjAwRUQ3MThCRTYxRDRGQzk5M0NDODA5OEE3MDNERDBEQzk0MkU5NjVFOEYxOEQyQTcjKVxuIgorCSAgIiAgKGcgIzA1IylcbiIKKwkgICIgICh5ICM3MkRBQjNFODNDOUY3REQ5QTkzMUZERUNEQzY1MjJDMEQzNkE2RjBBMEZFQzk1NUM1QUMzQzA5MTc1QkJGRjJCIgorCSAgIiAgICAgIEU1ODhEQjU5M0RDMkU0MjAyMDFCRUIzQUMxNzUzNjkxODQxN0M0OTdBQzBGODY1Nzg1NTM4MEMxRkNGMTFDNUIiCisJICAiICAgICAgRDIwREI0QkVFOUJERjkxNjY0OERFNkQ2RTQxOUZBNDQ2QzUxM0FBQjgxQzMwQ0I3QjM0RDYwMDc2MzdCRTY3NSIKKwkgICIgICAgICA1NkNFNjQ3M0U5RjlFRTlCOUZBREQyNzVEMDAxNTYzMzM2RjIxODZGNDI0REVDNjE5OUEwRjc1OEY2QTAwRkY0IylcbiIKKwkgICIgICh4ICMwM0MyODkwMDA4N0IzOERBQkY0QTBBQjk4QUNFQTM5QkI2NzRENjU1NzA5NkMwMUQ3MkUzMUMxNkJERDMyMjE0IykpKVxuIiwKKworCSAgIihwdWJsaWMta2V5XG4iCisJICAiIChFTEdcbiIKKwkgICIgIChwICMwMEI5M0I5MzM4NjM3NUYwNkMyRDM4NTYwRjNCOUM2RDZEN0I3NTA2QjIwQzE3NzNGNzNGOERFNTZFNkNENjVEIgorCSAgIiAgICAgIEY0OERGQUFBMUU5M0Y1N0EyNzg5QjE2ODM2MkEwRjc4NzMyMDQ5OUYwQjI0NjFEM0E0MjY4NzU3QTdCMjc1MTciCisJICAiICAgICAgQjdEMjAzNjU0QTBDRDQ4NERFQzZBRjYwQzg1RkVCODRBQUMzODJFQUYyMDQ3MDYxRkU1REFCODFBMjBBMDc5NyIKKwkgICIgICAgICA2RTg3MzU5ODg5QkFFM0IzNjAwRUQ3MThCRTYxRDRGQzk5M0NDODA5OEE3MDNERDBEQzk0MkU5NjVFOEYxOEQyQTcjKVxuIgorCSAgIiAgKGcgIzA1IylcbiIKKwkgICIgICh5ICM3MkRBQjNFODNDOUY3REQ5QTkzMUZERUNEQzY1MjJDMEQzNkE2RjBBMEZFQzk1NUM1QUMzQzA5MTc1QkJGRjJCIgorCSAgIiAgICAgIEU1ODhEQjU5M0RDMkU0MjAyMDFCRUIzQUMxNzUzNjkxODQxN0M0OTdBQzBGODY1Nzg1NTM4MEMxRkNGMTFDNUIiCisJICAiICAgICAgRDIwREI0QkVFOUJERjkxNjY0OERFNkQ2RTQxOUZBNDQ2QzUxM0FBQjgxQzMwQ0I3QjM0RDYwMDc2MzdCRTY3NSIKKwkgICIgICAgICA1NkNFNjQ3M0U5RjlFRTlCOUZBREQyNzVEMDAxNTYzMzM2RjIxODZGNDI0REVDNjE5OUEwRjc1OEY2QTAwRkY0IykpKVxuIiwKKworCSAgIlx4YTdceDk5XHg2MVx4ZWJceDg4XHg4M1x4ZDJceGY0XHgwNVx4YzgiCisJICAiXHg0Zlx4YmFceDA2XHhmOFx4NzhceDA5XHhiY1x4MWVceDIwXHhlNSIgfQorICAgICAgfSwKKyAgICB9OworICBpbnQgaTsKKyAgaWYgKHZlcmJvc2UpCisgICAgZnByaW50ZiAoc3RkZXJyLCAiU3RhcnRpbmcgcHVibGljIGtleSBjaGVja3MuXG4iKTsKKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAocHVia2V5cykgLyBzaXplb2YgKCpwdWJrZXlzKTsgaSsrKQorICAgIGlmIChwdWJrZXlzW2ldLmlkKQorICAgICAgeworICAgICAgICBpZiAoZ2NyeV9wa190ZXN0X2FsZ28gKHB1YmtleXNbaV0uaWQpICYmIGluX2ZpcHNfbW9kZSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAodmVyYm9zZSkKKyAgICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiICBhbGdvcml0aG0gJWQgbm90IGF2YWlsYWJsZSBpbiBmaXBzIG1vZGVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHB1YmtleXNbaV0uaWQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICBjaGVja19vbmVfcHVia2V5IChpLCBwdWJrZXlzW2ldKTsKKyAgICAgIH0KKyAgaWYgKHZlcmJvc2UpCisgICAgZnByaW50ZiAoc3RkZXJyLCAiQ29tcGxldGVkIHB1YmxpYyBrZXkgY2hlY2tzLlxuIik7CisKKyAgaWYgKHZlcmJvc2UpCisgICAgZnByaW50ZiAoc3RkZXJyLCAiU3RhcnRpbmcgYWRkaXRpb25hbCBwdWJsaWMga2V5IGNoZWNrcy5cbiIpOworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChwdWJrZXlzKSAvIHNpemVvZiAoKnB1YmtleXMpOyBpKyspCisgICAgaWYgKHB1YmtleXNbaV0uaWQpCisgICAgICB7CisgICAgICAgIGlmIChnY3J5X3BrX3Rlc3RfYWxnbyAocHVia2V5c1tpXS5pZCkgJiYgaW5fZmlwc19tb2RlKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2ZXJib3NlKQorICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICIgIGFsZ29yaXRobSAlZCBub3QgYXZhaWxhYmxlIGluIGZpcHMgbW9kZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcHVia2V5c1tpXS5pZCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIGNoZWNrX29uZV9wdWJrZXlfbmV3IChpKTsKKyAgICAgIH0KKyAgaWYgKHZlcmJvc2UpCisgICAgZnByaW50ZiAoc3RkZXJyLCAiQ29tcGxldGVkIGFkZGl0aW9uYWwgcHVibGljIGtleSBjaGVja3MuXG4iKTsKKworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sgCisgIGdwZ19lcnJvcl90IGVycjsKKyAgaW50IGxhc3RfYXJnYyA9IC0xOworICBpbnQgZGVidWcgPSAwOworICBpbnQgdXNlX2ZpcHMgPSAwOworICBpbnQgc2VsZnRlc3Rfb25seSA9IDA7CisKKyAgaWYgKGFyZ2MpCisgICAgeyBhcmdjLS07IGFyZ3YrKzsgfQorCisgIHdoaWxlIChhcmdjICYmIGxhc3RfYXJnYyAhPSBhcmdjICkKKyAgICB7CisgICAgICBsYXN0X2FyZ2MgPSBhcmdjOworICAgICAgaWYgKCFzdHJjbXAgKCphcmd2LCAiLS0iKSkKKyAgICAgICAgeworICAgICAgICAgIGFyZ2MtLTsgYXJndisrOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBlbHNlIGlmICghc3RyY21wICgqYXJndiwgIi0tdmVyYm9zZSIpKQorICAgICAgICB7CisgICAgICAgICAgdmVyYm9zZSsrOworICAgICAgICAgIGFyZ2MtLTsgYXJndisrOworICAgICAgICB9CisgICAgICBlbHNlIGlmICghc3RyY21wICgqYXJndiwgIi0tZGVidWciKSkKKyAgICAgICAgeworICAgICAgICAgIHZlcmJvc2UgPSBkZWJ1ZyA9IDE7CisgICAgICAgICAgYXJnYy0tOyBhcmd2Kys7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKCphcmd2LCAiLS1maXBzIikpCisgICAgICAgIHsKKyAgICAgICAgICB1c2VfZmlwcyA9IDE7CisgICAgICAgICAgYXJnYy0tOyBhcmd2Kys7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKCphcmd2LCAiLS1zZWxmdGVzdCIpKQorICAgICAgICB7CisgICAgICAgICAgc2VsZnRlc3Rfb25seSA9IDE7CisgICAgICAgICAgdmVyYm9zZSArPSAyOworICAgICAgICAgIGFyZ2MtLTsgYXJndisrOworICAgICAgICB9CisgICAgfSAgICAgICAgICAKKworICBnY3J5X2NvbnRyb2wgKEdDUllDVExfU0VUX1ZFUkJPU0lUWSwgKGludCl2ZXJib3NlKTsKKworICBpZiAodXNlX2ZpcHMpCisgICAgZ2NyeV9jb250cm9sIChHQ1JZQ1RMX0ZPUkNFX0ZJUFNfTU9ERSwgMCk7CisKKyAgaWYgKCFnY3J5X2NoZWNrX3ZlcnNpb24gKEdDUllQVF9WRVJTSU9OKSkKKyAgICBkaWUgKCJ2ZXJzaW9uIG1pc21hdGNoXG4iKTsKKworICBpZiAoIGdjcnlfZmlwc19tb2RlX2FjdGl2ZSAoKSApCisgICAgaW5fZmlwc19tb2RlID0gMTsKKworICBpZiAoIWluX2ZpcHNfbW9kZSkKKyAgICBnY3J5X2NvbnRyb2wgKEdDUllDVExfRElTQUJMRV9TRUNNRU0sIDApOworCisgIGlmICh2ZXJib3NlKQorICAgIGdjcnlfc2V0X3Byb2dyZXNzX2hhbmRsZXIgKHByb2dyZXNzX2hhbmRsZXIsIE5VTEwpOworCisgIGdjcnlfY29udHJvbCAoR0NSWUNUTF9JTklUSUFMSVpBVElPTl9GSU5JU0hFRCwgMCk7CisgIGlmIChkZWJ1ZykKKyAgICBnY3J5X2NvbnRyb2wgKEdDUllDVExfU0VUX0RFQlVHX0ZMQUdTLCAxdSwgMCk7CisgIC8qIE5vIHZhbHVhYmxlIGtleXMgYXJlIGNyZWF0ZSwgc28gd2UgY2FuIHNwZWVkIHVwIG91ciBSTkcuICovCisgIGdjcnlfY29udHJvbCAoR0NSWUNUTF9FTkFCTEVfUVVJQ0tfUkFORE9NLCAwKTsKKworICBpZiAoIXNlbGZ0ZXN0X29ubHkpCisgICAgeworICAgICAgY2hlY2tfY2lwaGVycyAoKTsKKyAgICAgIGNoZWNrX2FlczEyOF9jYmNfY3RzX2NpcGhlciAoKTsKKyAgICAgIGNoZWNrX2NiY19tYWNfY2lwaGVyICgpOworICAgICAgY2hlY2tfY3RyX2NpcGhlciAoKTsKKyAgICAgIGNoZWNrX2NmYl9jaXBoZXIgKCk7CisgICAgICBjaGVja19vZmJfY2lwaGVyICgpOworICAgICAgY2hlY2tfZGlnZXN0cyAoKTsKKyAgICAgIGNoZWNrX2htYWMgKCk7CisgICAgICBjaGVja19wdWJrZXkgKCk7CisgICAgfQorCisKKyAgaWYgKGluX2ZpcHNfbW9kZSAmJiAhc2VsZnRlc3Rfb25seSkKKyAgICB7CisgICAgICAvKiBJZiB3ZSBhcmUgaW4gZmlwcyBtb2RlIGRvIHNvbWUgbW9yZSB0ZXN0cy4gKi8KKyAgICAgIGdjcnlfbWRfaGRfdCBtZDsKKworICAgICAgLyogRmlyc3QgdHJpZ2dlciBhIHNlbGYtdGVzdC4gICovCisgICAgICBnY3J5X2NvbnRyb2wgKEdDUllDVExfRk9SQ0VfRklQU19NT0RFLCAwKTsKKyAgICAgIGlmICghZ2NyeV9jb250cm9sIChHQ1JZQ1RMX09QRVJBVElPTkFMX1AsIDApKQorICAgICAgICBmYWlsICgibm90IGluIG9wZXJhdGlvbmFsIHN0YXRlIGFmdGVyIHNlbGYtdGVzdFxuIik7CisgICAgICAKKyAgICAgIC8qIEdldCB1cyBpbnRvIHRoZSBlcnJvciBzdGF0ZS4gICovCisgICAgICBlcnIgPSBnY3J5X21kX29wZW4gKCZtZCwgR0NSWV9NRF9TSEExLCAwKTsKKyAgICAgIGlmIChlcnIpCisgICAgICAgIGZhaWwgKCJmYWlsZWQgdG8gb3BlbiBTSEEtMSBoYXNoIGNvbnRleHQ6ICVzXG4iLCBncGdfc3RyZXJyb3IgKGVycikpOworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgZXJyID0gZ2NyeV9tZF9lbmFibGUgKG1kLCBHQ1JZX01EX1NIQTI1Nik7CisgICAgICAgICAgaWYgKGVycikKKyAgICAgICAgICAgIGZhaWwgKCJmYWlsZWQgdG8gYWRkIFNIQS0yNTYgaGFzaCBjb250ZXh0OiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIGdwZ19zdHJlcnJvciAoZXJyKSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBnY3J5X21kX2dldF9hbGdvIGlzIG9ubHkgZGVmaW5lZCBmb3IgYSBjb250ZXh0IHdpdGgKKyAgICAgICAgICAgICAgICAganVzdCBvbmUgZGlnZXN0IGFsZ29yaXRobS4gIFdpdGggb3VyIHNldHVwIGl0IHNob3VsZAorICAgICAgICAgICAgICAgICBwdXQgdGhlIG9pYnJhcnkgaW50b2Vycm9yIHN0YXRlLiAgKi8KKyAgICAgICAgICAgICAgZnB1dHMgKCJOb3RlOiBUd28gbGluZXMgd2l0aCBlcnJvciBtZXNzYWdlcyBmb2xsb3cgIgorICAgICAgICAgICAgICAgICAgICAgIi0gdGhpcyBpcyBleHBlY3RlZFxuIiwgc3RkZXJyKTsKKyAgICAgICAgICAgICAgZ2NyeV9tZF9nZXRfYWxnbyAobWQpOworICAgICAgICAgICAgICBnY3J5X21kX2Nsb3NlIChtZCk7CisgICAgICAgICAgICAgIGlmIChnY3J5X2NvbnRyb2wgKEdDUllDVExfT1BFUkFUSU9OQUxfUCwgMCkpCisgICAgICAgICAgICAgICAgZmFpbCAoImV4cGVjdGVkIGVycm9yIHN0YXRlIGJ1dCBzdGlsbCBpbiBvcGVyYXRpb25hbCBzdGF0ZVxuIik7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvKiBOb3cgcnVuIGEgc2VsZi10ZXN0IGFuZCB0byBnZXQgYmFjayBpbnRvCisgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25hbCBzdGF0ZS4gICovCisgICAgICAgICAgICAgICAgICBnY3J5X2NvbnRyb2wgKEdDUllDVExfRk9SQ0VfRklQU19NT0RFLCAwKTsKKyAgICAgICAgICAgICAgICAgIGlmICghZ2NyeV9jb250cm9sIChHQ1JZQ1RMX09QRVJBVElPTkFMX1AsIDApKQorICAgICAgICAgICAgICAgICAgICBmYWlsICgiZGlkIG5vdCByZWFjaCBvcGVyYXRpb25hbCBhZnRlciBlcnJvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmQgc2VsZi10ZXN0XG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIAorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIElmIGluIHN0YW5kYXJkIG1vZGUsIHJ1biBzZWxmdGVzdHMuICAqLworICAgICAgaWYgKGdjcnlfY29udHJvbCAoR0NSWUNUTF9TRUxGVEVTVCwgMCkpCisgICAgICAgIGZhaWwgKCJydW5uaW5nIHNlbGYtdGVzdCBmYWlsZWRcbiIpOworICAgIH0KKworICBpZiAodmVyYm9zZSkKKyAgICBmcHJpbnRmIChzdGRlcnIsICJcbkFsbCB0ZXN0cyBjb21wbGV0ZWQuIEVycm9yczogJWlcbiIsIGVycm9yX2NvdW50KTsKKworICBpZiAoaW5fZmlwc19tb2RlICYmICFnY3J5X2ZpcHNfbW9kZV9hY3RpdmUgKCkpCisgICAgZnByaW50ZiAoc3RkZXJyLCAiRklQUyBtb2RlIGlzIG5vdCBhbnltb3JlIGFjdGl2ZVxuIik7CisKKyAgcmV0dXJuIGVycm9yX2NvdW50ID8gMSA6IDA7Cit9CmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvdGVzdHMvYmVuY2htYXJrLmMgYi9saWJnY3J5cHQtMS40LjYvdGVzdHMvYmVuY2htYXJrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY4ZjA0YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi90ZXN0cy9iZW5jaG1hcmsuYwpAQCAtMCwwICsxLDExNTggQEAKKy8qIGJlbmNobWFyay5jIC0gZm9yIGxpYmdjcnlwdAorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIGdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzeXMvdGltZXMuaD4KKyNlbmRpZgorCisjaWZkZWYgX0dDUllQVF9JTl9MSUJHQ1JZUFQKKyMgaW5jbHVkZSAiLi4vc3JjL2djcnlwdC5oIgorI2Vsc2UKKyMgaW5jbHVkZSA8Z2NyeXB0Lmg+CisjZW5kaWYKKworCisjZGVmaW5lIFBHTSAiYmVuY2htYXJrIgorCitzdGF0aWMgaW50IHZlcmJvc2U7CisKKy8qIERvIGVuY3J5cHRpb24gdGVzdHMgd2l0aCBsYXJnZSBidWZmZXJzLiAgKi8KK3N0YXRpYyBpbnQgbGFyZ2VfYnVmZmVyczsKKworLyogTnVtYmVyIG9mIGNpcGhlciByZXBldGl0aW9ucy4gICovCitzdGF0aWMgaW50IGNpcGhlcl9yZXBldGl0aW9uczsKKworLyogV2hldGhlciBmaXBzIG1vZGUgd2FzIGFjdGl2ZSBhdCBzdGFydHVwLiAgKi8KK3N0YXRpYyBpbnQgaW5fZmlwc19tb2RlOworCisKK3N0YXRpYyBjb25zdCBjaGFyIHNhbXBsZV9wcml2YXRlX2RzYV9rZXlfMTAyNFtdID0KKyIocHJpdmF0ZS1rZXlcbiIKKyIgIChkc2FcbiIKKyIgICAocCAjMDBBMTI2MjAyRDU5MjIxNEM1QThGNjAxNkUyQzNGNDI1NjA1MkFDQjFDQjE3RDg4RTY0QjEyOTNGQUYwOEY1RTQ2ODUiCisgICAgICAgIjAzRTZGNjgzNjZCMzI2QTU2Mjg0MzcwRUIyMTAzRTkyRDgzNDZBMTYzRTQ0QTA4RkRDNDIyQUM4RTlFNDQyNjg1NTdBIgorICAgICAgICI4NTM1MzlBNkFGMzkzNTNBNTlDRTVFNzhGRDk4QjU3RDBGM0UzQTdFQkM4QTI1NkFDOUE3NzVCQTU5Njg5RjMwMDRCRiIKKyAgICAgICAiQzMwMzU3MzBDNEMwQzUxNjI2QzVEN0Y1ODUyNjM3RUM1ODlCQjI5REFCNDZDMTYxNTcyRTRCIylcbiIKKyIgICAocSAjMDBERUI1QTI5NjQyMTg4NzE3OUVDQTE3NjI4ODRERTJBRjgxODVBRkM1IylcbiIKKyIgICAoZyAjMzk1OEIzNEFFNzc0NzE5NEVDQkQzMTJGOEZFRThDQkUzOTE4RTk0REY5RkQxMUUyOTEyRTU2MzE4RjMzQkRDMzg2MjIiCisgICAgICAgIkIxOERERkYzOTMwNzRCQ0E4QkFBQ0Y1MERGMjdBRUU1MjlGM0U4QUVFQ0U1NUMzOThEQUIzQTVFMDRDMkVBMTQyMzEyIgorICAgICAgICJGQUNBMkZFN0YwQTg4ODg0RjhEQUMzOTc5RUU2NzU5OEY5QTM4M0IyQTIzMjVGMDM1Qzc5NkYzNTJBNUMzQ0RGMkNCMyIKKyAgICAgICAiODVBRDI0RUM1MkE2RTU1MjQ3RTFCQjM3RDI2MEY3OUU2MTdEMkE0NDQ2NDE1QjZBRDc5QSMpXG4iCisiICAgKHkgIzUxOUU5RkU5QUIwNTQ1QTY3MjRFNzQ2MDNCN0IwNEU0OERDMTQzN0UwMjg0QTExRUE2MDVBN0JBOEFCMUNGMzU0RkQ0IgorICAgICAgICJFQ0M5Mzg4MEFDMjkzMzkxQzY5QjU1OEFEODRFN0FBRkE4OEYxMUQwMjhDRjNBMzc4RjI0MUQ2QjA1NkE5MEM1ODhGNiIKKyAgICAgICAiNjZGNjhEMjcyNjJCNERBODQ2NTdEMTUwNTdEMzcxQkNFQzFGNjUwNDAzMjUwN0Q1Qjg4MUU0NUZDOTNBMUI5NzMxNTUiCisgICAgICAgIkQ5MUM1NzIxOUQwOTBDM0FDRDc1RTdDMkI5RjExNzZBMjA4QUMwM0Q2QzEyQUMyOEEyNzEjKVxuIgorIiAgICh4ICM0MTg2RjhBNThDNURGNDZDNUJDRkM3MDA2QkVFQkYwNUU5M0MwQ0E3IylcbiIKKyIpKVxuIjsKKworc3RhdGljIGNvbnN0IGNoYXIgc2FtcGxlX3B1YmxpY19kc2Ffa2V5XzEwMjRbXSA9CisiKHB1YmxpYy1rZXlcbiIKKyIgIChkc2FcbiIKKyIgICAocCAjMDBBMTI2MjAyRDU5MjIxNEM1QThGNjAxNkUyQzNGNDI1NjA1MkFDQjFDQjE3RDg4RTY0QjEyOTNGQUYwOEY1RTQ2ODUiCisgICAgICAgIjAzRTZGNjgzNjZCMzI2QTU2Mjg0MzcwRUIyMTAzRTkyRDgzNDZBMTYzRTQ0QTA4RkRDNDIyQUM4RTlFNDQyNjg1NTdBIgorICAgICAgICI4NTM1MzlBNkFGMzkzNTNBNTlDRTVFNzhGRDk4QjU3RDBGM0UzQTdFQkM4QTI1NkFDOUE3NzVCQTU5Njg5RjMwMDRCRiIKKyAgICAgICAiQzMwMzU3MzBDNEMwQzUxNjI2QzVEN0Y1ODUyNjM3RUM1ODlCQjI5REFCNDZDMTYxNTcyRTRCIylcbiIKKyIgICAocSAjMDBERUI1QTI5NjQyMTg4NzE3OUVDQTE3NjI4ODRERTJBRjgxODVBRkM1IylcbiIKKyIgICAoZyAjMzk1OEIzNEFFNzc0NzE5NEVDQkQzMTJGOEZFRThDQkUzOTE4RTk0REY5RkQxMUUyOTEyRTU2MzE4RjMzQkRDMzg2MjIiCisgICAgICAgIkIxOERERkYzOTMwNzRCQ0E4QkFBQ0Y1MERGMjdBRUU1MjlGM0U4QUVFQ0U1NUMzOThEQUIzQTVFMDRDMkVBMTQyMzEyIgorICAgICAgICJGQUNBMkZFN0YwQTg4ODg0RjhEQUMzOTc5RUU2NzU5OEY5QTM4M0IyQTIzMjVGMDM1Qzc5NkYzNTJBNUMzQ0RGMkNCMyIKKyAgICAgICAiODVBRDI0RUM1MkE2RTU1MjQ3RTFCQjM3RDI2MEY3OUU2MTdEMkE0NDQ2NDE1QjZBRDc5QSMpXG4iCisiICAgKHkgIzUxOUU5RkU5QUIwNTQ1QTY3MjRFNzQ2MDNCN0IwNEU0OERDMTQzN0UwMjg0QTExRUE2MDVBN0JBOEFCMUNGMzU0RkQ0IgorICAgICAgICJFQ0M5Mzg4MEFDMjkzMzkxQzY5QjU1OEFEODRFN0FBRkE4OEYxMUQwMjhDRjNBMzc4RjI0MUQ2QjA1NkE5MEM1ODhGNiIKKyAgICAgICAiNjZGNjhEMjcyNjJCNERBODQ2NTdEMTUwNTdEMzcxQkNFQzFGNjUwNDAzMjUwN0Q1Qjg4MUU0NUZDOTNBMUI5NzMxNTUiCisgICAgICAgIkQ5MUM1NzIxOUQwOTBDM0FDRDc1RTdDMkI5RjExNzZBMjA4QUMwM0Q2QzEyQUMyOEEyNzEjKVxuIgorIikpXG4iOworCisKK3N0YXRpYyBjb25zdCBjaGFyIHNhbXBsZV9wcml2YXRlX2RzYV9rZXlfMjA0OFtdID0KKyIocHJpdmF0ZS1rZXlcbiIKKyIgIChkc2FcbiIKKyIgICAocCAjMDBCNTQ2MzY2NzM5NjJCNjRGN0RDMjNDNzFBQ0VGNkU3MzMxNzk2RjYwNzU2MEIxOTRERkNDMENBMzcwRTg1OEEzNjUiCisgICAgICAgIkE0MTMxNTJGQjZFQjhDNjY0QkQxNzFBQzMxNkZFNUIzODFDRDA4NEQwNzM3NzU3MTU5OTg4MEEwNjhFRjEzODJEODVDIgorICAgICAgICIzMDhCNEU5REVBQzEyRDY2REU1QzRBODI2RUJFQjVFRDk0QTYyRTczMDFFMTg5MjdFODkwNTg5QTJGMjMwMjcyQTE1MCIKKyAgICAgICAiQzExOEJDM0RDMjk2NUFFMEQwNUJFNEY2NUM2MTM3QjJCQTdFREFCQjE5MkMzMDcwRDIwMkMxMEFBM0Y1MzQ1NzQ5NzAiCisgICAgICAgIjcxNDU0REI4QTczRERCNjUxMUE1QkE5OEVGMTQ1MEZEOTBERTVCQUFGQzlGRDNBQzIyRUJFQTYxMkREMDc1QkI3NDA1IgorICAgICAgICJENTY4NjZEMTI1RTMzOTgyQzA0NjgwOEY3Q0VCQThFNUMwQjlGMTlBNkZFNDUxNDYxNjYwQTFDQkE5RUY2ODg5MTE3OSIKKyAgICAgICAiMDI1NkE1NzNEM0I4RjM1QTVDN0EwQzZDMzFGMkRCOTBFMjVBMjY4NDUyNTJBRDlFNDg1RUYyRDMzOUU3QjU4OTBDRDQiCisgICAgICAgIjJGOUM5RjMxNUVENDA5MTcxRUMzNUNBMDRDQzA2QjI3NTU3N0IzIylcbiIKKyIgICAocSAjMDBEQTY3OTg5MTY3RkRBQzRBRTNERjkyNDdBNzE2ODU5QTMwQzBDRjlDNUE2REJBMDFFQUJBMzQ4MSMpXG4iCisiICAgKGcgIzQ4RTM1REE1ODRBMDg5RDA1MTQyQUE2MzYwM0ZEQjAwRDEzMUIwN0EwNzgxRTJENUE4Rjk2MTREMkIzM0QzRTQwQTc4IgorICAgICAgICI5OEE5RTEwQ0RCQjYxMkNGMDkzRjk1QTNFMTBEMDk1NjY3MjZGMkMxMjgyMzgzNkIyRDlDRDk3NEJCNjk1NjY1RjNCMyIKKyAgICAgICAiNUQyMTlBOTcyNEI4N0YzODBCRDUyMDdFREEwQUUzOEM3OUU4RjE4MTIyQzNGNzZFNENFQjBBQkVEMzI1MDkxNDk4N0YiCisgICAgICAgIkIzMEQ0QjlFMTlDMDRDMjhBNUQ0RjQ1NTYwQUY1ODZGNkExQjQxNzUxRUFEOTBBRTdGMDQ0RjRFMkE0QTUwQzFGNTA4IgorICAgICAgICI0RkMyMDI0NjNGNDc4RjY3OEI5QTE5MzkyRjBEMjk2MUM1MzkxQzU0NkVGMzY1MzY4QkI0NjQxMEM5QzFDRUU5NkU5RiIKKyAgICAgICAiMEM5NTM1NzBDMkVEMDYzMjhCMTFDOTBFODZFNTdDQUE3RkE1QUJBQTI3OEUyMkE0QzhDMDhFMTZFRTU5RjQ4NEVDNDQiCisgICAgICAgIjJDRjU1NTM1QkFBMkM2QkVBODgzM0E1NTUzNzJCRUZFMUU2NjVEM0M3REFFRjU4MDYxRDUxMzYzMzFFRjRFQjYxQkMzIgorICAgICAgICI2RUU0NDI1QTU1M0FGODg4NUZFQTE1QTg4MTM1QkUxMzM1MjAjKVxuIgorIiAgICh5ICM2NkUwRDFBNjlENjYzNDY2RjhGRUYyQjdDMDg3OERBQzkzQzM2QTJGQjJDMDVFMDMwNkE1M0I5MjYwMjFENEI5MkExQyIKKyAgICAgICAiMkZBNjg2MDA2MUU4OEU3OENCQkJBNDlCMEUxMjcwMEYwN0RCRjg2RjcyQ0VCMjkyN0VEQUMwQzdFMzk2OUMzQTQ3QkIiCisgICAgICAgIjRFMEFFOTNEOEJCMzMxM0U5M0NDN0E3MkRGRUVFNDQyRUZCQzgxQjNCMkFFQzlEOERDQkUyMTIyMEZCNzYwMjAxRDc5IgorICAgICAgICIzMjhDNDFDNzczODY2NTg3QTQ0QjY5NTQ3NjdEMDIyQTg4MDcyOTAwRTk2NDA4OUQ5QjE3MTMzNjAzMDU2Qzk4NUM0RiIKKyAgICAgICAiOEEwQjY0OEYyOTdGOEQyQzNDQjQzRTQzNzFEQzYwMDJCNUIxMkNDQzA4NUJEQjJDRkM1MDc0QTA1ODc1NjYxODdFRTMiCisgICAgICAgIkUxMUEyQTQ1OUJEOTQ3MjYyNDhCQjhENkNDNjI5MzhFMTFFMjg0QzJDMTgzNTc2RkJCNTE3NDlFQjIzOEM0MzYwOTIzIgorICAgICAgICI3OUMwOENFMUM4Q0Q3N0VCNTc0MDRDRTlCNDc0NDM5NUFDRjcyMTQ4NzQ1MEJBREUzMjIwNTc2RjJGODE2MjQ4QjBBNyIKKyAgICAgICAiMTRBMjY0MzMwQUVDQ0IyNERFMkExMTA3ODQ3QjIzNDkwODk3IylcbiIKKyIgICAoeCAjNDc3QkQxNDY3NkUyMjU2M0M1QUJBNjgwMjVDRUJBMkE0OEQ0ODVGNUIyRDRBRDRDMEVCQkQ2RDAjKVxuIgorIikpXG4iOworCisKK3N0YXRpYyBjb25zdCBjaGFyIHNhbXBsZV9wdWJsaWNfZHNhX2tleV8yMDQ4W10gPQorIihwdWJsaWMta2V5XG4iCisiICAoZHNhXG4iCisiICAgKHAgIzAwQjU0NjM2NjczOTYyQjY0RjdEQzIzQzcxQUNFRjZFNzMzMTc5NkY2MDc1NjBCMTk0REZDQzBDQTM3MEU4NThBMzY1IgorICAgICAgICJBNDEzMTUyRkI2RUI4QzY2NEJEMTcxQUMzMTZGRTVCMzgxQ0QwODREMDczNzc1NzE1OTk4ODBBMDY4RUYxMzgyRDg1QyIKKyAgICAgICAiMzA4QjRFOURFQUMxMkQ2NkRFNUM0QTgyNkVCRUI1RUQ5NEE2MkU3MzAxRTE4OTI3RTg5MDU4OUEyRjIzMDI3MkExNTAiCisgICAgICAgIkMxMThCQzNEQzI5NjVBRTBEMDVCRTRGNjVDNjEzN0IyQkE3RURBQkIxOTJDMzA3MEQyMDJDMTBBQTNGNTM0NTc0OTcwIgorICAgICAgICI3MTQ1NERCOEE3M0REQjY1MTFBNUJBOThFRjE0NTBGRDkwREU1QkFBRkM5RkQzQUMyMkVCRUE2MTJERDA3NUJCNzQwNSIKKyAgICAgICAiRDU2ODY2RDEyNUUzMzk4MkMwNDY4MDhGN0NFQkE4RTVDMEI5RjE5QTZGRTQ1MTQ2MTY2MEExQ0JBOUVGNjg4OTExNzkiCisgICAgICAgIjAyNTZBNTczRDNCOEYzNUE1QzdBMEM2QzMxRjJEQjkwRTI1QTI2ODQ1MjUyQUQ5RTQ4NUVGMkQzMzlFN0I1ODkwQ0Q0IgorICAgICAgICIyRjlDOUYzMTVFRDQwOTE3MUVDMzVDQTA0Q0MwNkIyNzU1NzdCMyMpXG4iCisiICAgKHEgIzAwREE2Nzk4OTE2N0ZEQUM0QUUzREY5MjQ3QTcxNjg1OUEzMEMwQ0Y5QzVBNkRCQTAxRUFCQTM0ODEjKVxuIgorIiAgIChnICM0OEUzNURBNTg0QTA4OUQwNTE0MkFBNjM2MDNGREIwMEQxMzFCMDdBMDc4MUUyRDVBOEY5NjE0RDJCMzNEM0U0MEE3OCIKKyAgICAgICAiOThBOUUxMENEQkI2MTJDRjA5M0Y5NUEzRTEwRDA5NTY2NzI2RjJDMTI4MjM4MzZCMkQ5Q0Q5NzRCQjY5NTY2NUYzQjMiCisgICAgICAgIjVEMjE5QTk3MjRCODdGMzgwQkQ1MjA3RURBMEFFMzhDNzlFOEYxODEyMkMzRjc2RTRDRUIwQUJFRDMyNTA5MTQ5ODdGIgorICAgICAgICJCMzBENEI5RTE5QzA0QzI4QTVENEY0NTU2MEFGNTg2RjZBMUI0MTc1MUVBRDkwQUU3RjA0NEY0RTJBNEE1MEMxRjUwOCIKKyAgICAgICAiNEZDMjAyNDYzRjQ3OEY2NzhCOUExOTM5MkYwRDI5NjFDNTM5MUM1NDZFRjM2NTM2OEJCNDY0MTBDOUMxQ0VFOTZFOUYiCisgICAgICAgIjBDOTUzNTcwQzJFRDA2MzI4QjExQzkwRTg2RTU3Q0FBN0ZBNUFCQUEyNzhFMjJBNEM4QzA4RTE2RUU1OUY0ODRFQzQ0IgorICAgICAgICIyQ0Y1NTUzNUJBQTJDNkJFQTg4MzNBNTU1MzcyQkVGRTFFNjY1RDNDN0RBRUY1ODA2MUQ1MTM2MzMxRUY0RUI2MUJDMyIKKyAgICAgICAiNkVFNDQyNUE1NTNBRjg4ODVGRUExNUE4ODEzNUJFMTMzNTIwIylcbiIKKyIgICAoeSAjNjZFMEQxQTY5RDY2MzQ2NkY4RkVGMkI3QzA4NzhEQUM5M0MzNkEyRkIyQzA1RTAzMDZBNTNCOTI2MDIxRDRCOTJBMUMiCisgICAgICAgIjJGQTY4NjAwNjFFODhFNzhDQkJCQTQ5QjBFMTI3MDBGMDdEQkY4NkY3MkNFQjI5MjdFREFDMEM3RTM5NjlDM0E0N0JCIgorICAgICAgICI0RTBBRTkzRDhCQjMzMTNFOTNDQzdBNzJERkVFRTQ0MkVGQkM4MUIzQjJBRUM5RDhEQ0JFMjEyMjBGQjc2MDIwMUQ3OSIKKyAgICAgICAiMzI4QzQxQzc3Mzg2NjU4N0E0NEI2OTU0NzY3RDAyMkE4ODA3MjkwMEU5NjQwODlEOUIxNzEzMzYwMzA1NkM5ODVDNEYiCisgICAgICAgIjhBMEI2NDhGMjk3RjhEMkMzQ0I0M0U0MzcxREM2MDAyQjVCMTJDQ0MwODVCREIyQ0ZDNTA3NEEwNTg3NTY2MTg3RUUzIgorICAgICAgICJFMTFBMkE0NTlCRDk0NzI2MjQ4QkI4RDZDQzYyOTM4RTExRTI4NEMyQzE4MzU3NkZCQjUxNzQ5RUIyMzhDNDM2MDkyMyIKKyAgICAgICAiNzlDMDhDRTFDOENENzdFQjU3NDA0Q0U5QjQ3NDQzOTVBQ0Y3MjE0ODc0NTBCQURFMzIyMDU3NkYyRjgxNjI0OEIwQTciCisgICAgICAgIjE0QTI2NDMzMEFFQ0NCMjRERTJBMTEwNzg0N0IyMzQ5MDg5NyMpXG4iCisiKSlcbiI7CisKKworc3RhdGljIGNvbnN0IGNoYXIgc2FtcGxlX3ByaXZhdGVfZHNhX2tleV8zMDcyW10gPQorIihwcml2YXRlLWtleVxuIgorIiAgKGRzYVxuIgorIiAgIChwICMwMEJBNzNFMTQ4QUVBNUU4QjY0ODc4QUY1QkU3MTJCODMwMkI5NjcxQzVGM0VFQjc3MjJBOUQwRDk4NjhEMDQ4QzkzOCIKKyAgICAgICAiODc3QzkxQzMzNUM3ODE5MjkyRTY5QzdEMzQyNjRGMTU3OEUzMkVDMkRBODQwOERGNzVEMEVCNzZFMEQzMDMwQjg0QjUiCisgICAgICAgIjYyRDhFRjkzQUI1M0JBQjZCOEE1REU0NjRGNUNBODdBRUE0M0JEQ0YwRkIwQjc4MTVBQTMxMTRDRkM4NEZEOTE2QTgzIgorICAgICAgICJCM0Q1RkQ3ODM5MDE4OTMzMjIzMkU5RDAzN0QyMTUzMTNGRDAwMkZGNDZDMDQ4QjY2NzAzRjg3RkFFMDkyQUFBMDk4OCIKKyAgICAgICAiQUM3NDUzMzZFQkU2NzJBMDFERURCRDUyMzk1NzgzNTc5QjY3Q0YzQUUxRDZGMTYwMkNDQ0IxMjE1NEZBMEUwMEFFNDYiCisgICAgICAgIjBEOUIyODlDRjcwOTE5NDYyNUJDQjkxOUIxMTAzOERFRkM1MEFEQkJBMjBDM0YzMjAwNzhFNEU5NTI5QjRGNjg0OEUyIgorICAgICAgICJBQjVFNjI3OERCOTYxRkUyMjZGMkVFQkQyMDFFMDcxQzQ4QzVCRUY5OEI0RDlCRUU0MkMxQzcxMDJEODkzRUJGODkwMiIKKyAgICAgICAiRDdBOTEyNjYzNDBBRkQ2Q0UxRDA5RTUyMjgyRkZGNUI5N0VBRkEzODg2QTNGQ0Y4NEZGNzZEMUUwNjUzOEQwRDhFNjAiCisgICAgICAgIkIzMzMyMTQ1Nzg1RTA3RDI5QTU5NjUzODJERTM0NzBEMUQ4ODg0NDdGQTlDMDBBMjM3MzM3OEZDM0ZBN0I5RjdEMTdFIgorICAgICAgICI5NUE2QTVBRTEzOTdCRTQ2RDk3NkVGMkM5NkU4OTkxM0FDNEEwOTM1MUNBNjYxQkY2RjY3RTMwNDA3REE4NDY5NDZDNyIKKyAgICAgICAiNjJEOUJBQTZCNzc4MjUwOTdEM0U3Qjg4NjQ1NkJCMzJFM0U3NDUxNkJGM0ZEOTNENzFCMjU3QUE4RjcyM0UwMUNFMzMiCisgICAgICAgIjgwMTUzNTNEMzc3OEIwMkI4OTJBRjcjKVxuIgorIiAgIChxICMwMEJGRjNGM0NDMThGQTAxOEE1QjgxNTVBODY5NUUxRTQ5Mzk2NjBENUU0NzU5MzIyQzM5RDUwRjNCOTNFNUY2OEIjKVxuIgorIiAgIChnICM2Q0NGRDgyMTlGNUZDRThFRjJCRUYzMjYyOTI5Nzg3MTQwODQ3RTM4Njc0QjFFRjhEQjIwMjU1RTIxMkNCNjMzMEVDNCIKKyAgICAgICAiREZFOEEyNkFCN0VDQzU3NjBERUI5QkJGNTlBMkIyODIxRDUxMEYxODY4MTcyMjIyODY3NTU4QjhEMjA0RTg4OUM0NzQiCisgICAgICAgIjdDQTMwRkJGOUQ4Q0Y0MUFFNUQ1QkQ4NDUxNzQ2NDExMDE1OTM4NDlGRjMzM0U2QzkzQTY1NTA5MzFCMkI5RDU2Qjk4IgorICAgICAgICI5Q0FCMDE3MjlEOUQ3MzZGQTZEMjRBNzREMkRERTFFOUU2NDhEMTQxNDczRTQ0M0RENkJCRjBCM0NBQjY0RjlGRTRGQyIKKyAgICAgICAiMTM0QjJFQjU3NDM3Nzg5Rjc1Qzc0NERGMUZBNjdGQThBNjQ2MDNFNTQ0MUJDN0VDRTI5RTAwQkRGMjYyQkRDODFFOEMiCisgICAgICAgIjczMzBBMThBNDEyREUzOEU3NTQ2RDM0MkI4OUEwQUY2NzVBODlFNkJFRjAwNTQwRUIxMDdBMkZFNzRFQTQwMkIwRDg5IgorICAgICAgICJGNUMwMjkxOERFRUVBRjhCODczN0FDODY2QjA5QjUwODEwQUI4RDg2Njg4MzRBMUI5RTFFNTM4NjZFMkIwQTkyNkZBQiIKKyAgICAgICAiMTIwQTBDREU1QjM3MTVGRkZFNkFDRDFBQjczNTg4RENDMUVDNENFOTM5MkZFNTdGOEQxRDM1ODExMjAwQ0IwN0EwRTYiCisgICAgICAgIjM3NEUyQzRCMEFFQjdFM0QwNzdCODU0NUMwRTQzOERDQzBGMUFFODFFMTg2OTMwRTk5RUJDNUI5MUI3N0U5MjgwM0UwIgorICAgICAgICIyMTYwMjg4Nzg1MUE0RkZEQjNBNzg5NkFDNjU1QTA5MDEyMThDMTIxQzVDQkIwOTMxRTdENUVBQzI0M0YzNzcxMUI1RiIKKyAgICAgICAiRDVBNjJCMUIzOEE4M0YwM0Q4RjY3MDNEOEI5OERGMzY3RkM4QTc2OTkwMzM1RjYyMTczQTUzOTE4MzZGMEYyNDEzRUMiCisgICAgICAgIjQ5OTdBRjlFQjU1QzY2NjBCMDFBIylcbiIKKyIgICAoeSAjMjMyMEIyMjQzNEM1REI4MzJCNEVDMjY3Q0M1MkU3OERENUNDRkE5MTFFOEYwODA0RTdFN0YzMkIxODZCMkQ0MTY3QUUiCisgICAgICAgIjRBQTY4Njk4MjJFNzY0MDA0OTJENkExOTNCMDUzNTMyMkM3MkIwQjdBQTRBODdFMzMwNDRGREM4NEJFMjRDNjRBMDUzIgorICAgICAgICJBMzc2NTVFRTlFQUJEQ0RDMUZERjYzRjNGMUM2NzdDRUI0MTU5NURGN0RFRkU5MTc4RDg1QTNENjIxQjRFNDc3NTQ5MiIKKyAgICAgICAiOEMwQTU4RDI0NThEMDZGOTU2MkU0REUyRkU2MTI5QTY0MDYzQTk5RTg4RTU0NDg1Qjk3NDg0QTI4MTg4QzREMzNGMTUiCisgICAgICAgIkREQzkwM0I2Q0VBMDEzNUUzRTNEMjdCNEVBMzkzMTk2OTYzMDVDRTkzRDdCQTdCRTAwMzY3REJFM0FBRjQzNDkxRTcxIgorICAgICAgICJDQkYyNTQ3NDRBNTU2N0Y1RDcwMDkwRDYxMzlFMEM5OTAyMzk2MjdCM0ExQzVCMjBCNkY5RjYzNzRCOEQ4RDhBODk5NyIKKyAgICAgICAiNDM3MjY1QkUxRTNCNDgxMEQ0QjA5MjU0NDAwREUyODdBMERGRkJBRUYzMzlFNDhENDIyQjFENDFBMzdFNjQyQkMwMjYiCisgICAgICAgIjczMzE0NzAxQzhGQTk3OTI4NDVDMTI5MzUxQTg3QTk0NUEwM0U2Qzg5NTg2MEU1MUQ2RkI4QjczNDBBOTREMUE4QTdCIgorICAgICAgICJGQTg1QUM4M0I0QjE0RTczQUI4NkNCOTZDMjM2QzhCRkIwOTc4QjYxQjIzNjdBN0ZFNEY3ODkxMDcwRjU2Qzc4RDVERCIKKyAgICAgICAiRjU1NzZCRkU1QkU0RjMzM0E0RTI2NjRFNzk1MjhCMzI5NDkwN0FBREQ2M0Y0RjJFN0FBODE0N0I5MjhEOENENjk3NjUiCisgICAgICAgIjNEQjk4QzQyOTdDQjY3ODA0NkVENTVDMERCRTYwQkY3MTQyQzU5NDYwM0U0RDcwNURDM0QxNzI3MEY5RjA4NkVDNTYxIgorICAgICAgICIyNzAzRDUxOEQ4RDQ5RkYwRUJFNiMpXG4iCisiICAgKHggIzAwQTlGRkZDODhFNjdENkY3QjgxMEUyOTFDMDUwQkFGRUE3RkM0QTc1RThEMkYxNkNGRUQzNDE2RkQ3NzYwNzIzMiMpXG4iCisiKSlcbiI7CisKK3N0YXRpYyBjb25zdCBjaGFyIHNhbXBsZV9wdWJsaWNfZHNhX2tleV8zMDcyW10gPQorIihwdWJsaWMta2V5XG4iCisiICAoZHNhXG4iCisiICAgKHAgIzAwQkE3M0UxNDhBRUE1RThCNjQ4NzhBRjVCRTcxMkI4MzAyQjk2NzFDNUYzRUVCNzcyMkE5RDBEOTg2OEQwNDhDOTM4IgorICAgICAgICI4NzdDOTFDMzM1Qzc4MTkyOTJFNjlDN0QzNDI2NEYxNTc4RTMyRUMyREE4NDA4REY3NUQwRUI3NkUwRDMwMzBCODRCNSIKKyAgICAgICAiNjJEOEVGOTNBQjUzQkFCNkI4QTVERTQ2NEY1Q0E4N0FFQTQzQkRDRjBGQjBCNzgxNUFBMzExNENGQzg0RkQ5MTZBODMiCisgICAgICAgIkIzRDVGRDc4MzkwMTg5MzMyMjMyRTlEMDM3RDIxNTMxM0ZEMDAyRkY0NkMwNDhCNjY3MDNGODdGQUUwOTJBQUEwOTg4IgorICAgICAgICJBQzc0NTMzNkVCRTY3MkEwMURFREJENTIzOTU3ODM1NzlCNjdDRjNBRTFENkYxNjAyQ0NDQjEyMTU0RkEwRTAwQUU0NiIKKyAgICAgICAiMEQ5QjI4OUNGNzA5MTk0NjI1QkNCOTE5QjExMDM4REVGQzUwQURCQkEyMEMzRjMyMDA3OEU0RTk1MjlCNEY2ODQ4RTIiCisgICAgICAgIkFCNUU2Mjc4REI5NjFGRTIyNkYyRUVCRDIwMUUwNzFDNDhDNUJFRjk4QjREOUJFRTQyQzFDNzEwMkQ4OTNFQkY4OTAyIgorICAgICAgICJEN0E5MTI2NjM0MEFGRDZDRTFEMDlFNTIyODJGRkY1Qjk3RUFGQTM4ODZBM0ZDRjg0RkY3NkQxRTA2NTM4RDBEOEU2MCIKKyAgICAgICAiQjMzMzIxNDU3ODVFMDdEMjlBNTk2NTM4MkRFMzQ3MEQxRDg4ODQ0N0ZBOUMwMEEyMzczMzc4RkMzRkE3QjlGN0QxN0UiCisgICAgICAgIjk1QTZBNUFFMTM5N0JFNDZEOTc2RUYyQzk2RTg5OTEzQUM0QTA5MzUxQ0E2NjFCRjZGNjdFMzA0MDdEQTg0Njk0NkM3IgorICAgICAgICI2MkQ5QkFBNkI3NzgyNTA5N0QzRTdCODg2NDU2QkIzMkUzRTc0NTE2QkYzRkQ5M0Q3MUIyNTdBQThGNzIzRTAxQ0UzMyIKKyAgICAgICAiODAxNTM1M0QzNzc4QjAyQjg5MkFGNyMpXG4iCisiICAgKHEgIzAwQkZGM0YzQ0MxOEZBMDE4QTVCODE1NUE4Njk1RTFFNDkzOTY2MEQ1RTQ3NTkzMjJDMzlENTBGM0I5M0U1RjY4QiMpXG4iCisiICAgKGcgIzZDQ0ZEODIxOUY1RkNFOEVGMkJFRjMyNjI5Mjk3ODcxNDA4NDdFMzg2NzRCMUVGOERCMjAyNTVFMjEyQ0I2MzMwRUM0IgorICAgICAgICJERkU4QTI2QUI3RUNDNTc2MERFQjlCQkY1OUEyQjI4MjFENTEwRjE4NjgxNzIyMjI4Njc1NThCOEQyMDRFODg5QzQ3NCIKKyAgICAgICAiN0NBMzBGQkY5RDhDRjQxQUU1RDVCRDg0NTE3NDY0MTEwMTU5Mzg0OUZGMzMzRTZDOTNBNjU1MDkzMUIyQjlENTZCOTgiCisgICAgICAgIjlDQUIwMTcyOUQ5RDczNkZBNkQyNEE3NEQyRERFMUU5RTY0OEQxNDE0NzNFNDQzREQ2QkJGMEIzQ0FCNjRGOUZFNEZDIgorICAgICAgICIxMzRCMkVCNTc0Mzc3ODlGNzVDNzQ0REYxRkE2N0ZBOEE2NDYwM0U1NDQxQkM3RUNFMjlFMDBCREYyNjJCREM4MUU4QyIKKyAgICAgICAiNzMzMEExOEE0MTJERTM4RTc1NDZEMzQyQjg5QTBBRjY3NUE4OUU2QkVGMDA1NDBFQjEwN0EyRkU3NEVBNDAyQjBEODkiCisgICAgICAgIkY1QzAyOTE4REVFRUFGOEI4NzM3QUM4NjZCMDlCNTA4MTBBQjhEODY2ODgzNEExQjlFMUU1Mzg2NkUyQjBBOTI2RkFCIgorICAgICAgICIxMjBBMENERTVCMzcxNUZGRkU2QUNEMUFCNzM1ODhEQ0MxRUM0Q0U5MzkyRkU1N0Y4RDFEMzU4MTEyMDBDQjA3QTBFNiIKKyAgICAgICAiMzc0RTJDNEIwQUVCN0UzRDA3N0I4NTQ1QzBFNDM4RENDMEYxQUU4MUUxODY5MzBFOTlFQkM1QjkxQjc3RTkyODAzRTAiCisgICAgICAgIjIxNjAyODg3ODUxQTRGRkRCM0E3ODk2QUM2NTVBMDkwMTIxOEMxMjFDNUNCQjA5MzFFN0Q1RUFDMjQzRjM3NzExQjVGIgorICAgICAgICJENUE2MkIxQjM4QTgzRjAzRDhGNjcwM0Q4Qjk4REYzNjdGQzhBNzY5OTAzMzVGNjIxNzNBNTM5MTgzNkYwRjI0MTNFQyIKKyAgICAgICAiNDk5N0FGOUVCNTVDNjY2MEIwMUEjKVxuIgorIiAgICh5ICMyMzIwQjIyNDM0QzVEQjgzMkI0RUMyNjdDQzUyRTc4REQ1Q0NGQTkxMUU4RjA4MDRFN0U3RjMyQjE4NkIyRDQxNjdBRSIKKyAgICAgICAiNEFBNjg2OTgyMkU3NjQwMDQ5MkQ2QTE5M0IwNTM1MzIyQzcyQjBCN0FBNEE4N0UzMzA0NEZEQzg0QkUyNEM2NEEwNTMiCisgICAgICAgIkEzNzY1NUVFOUVBQkRDREMxRkRGNjNGM0YxQzY3N0NFQjQxNTk1REY3REVGRTkxNzhEODVBM0Q2MjFCNEU0Nzc1NDkyIgorICAgICAgICI4QzBBNThEMjQ1OEQwNkY5NTYyRTRERTJGRTYxMjlBNjQwNjNBOTlFODhFNTQ0ODVCOTc0ODRBMjgxODhDNEQzM0YxNSIKKyAgICAgICAiRERDOTAzQjZDRUEwMTM1RTNFM0QyN0I0RUEzOTMxOTY5NjMwNUNFOTNEN0JBN0JFMDAzNjdEQkUzQUFGNDM0OTFFNzEiCisgICAgICAgIkNCRjI1NDc0NEE1NTY3RjVENzAwOTBENjEzOUUwQzk5MDIzOTYyN0IzQTFDNUIyMEI2RjlGNjM3NEI4RDhEOEE4OTk3IgorICAgICAgICI0MzcyNjVCRTFFM0I0ODEwRDRCMDkyNTQ0MDBERTI4N0EwREZGQkFFRjMzOUU0OEQ0MjJCMUQ0MUEzN0U2NDJCQzAyNiIKKyAgICAgICAiNzMzMTQ3MDFDOEZBOTc5Mjg0NUMxMjkzNTFBODdBOTQ1QTAzRTZDODk1ODYwRTUxRDZGQjhCNzM0MEE5NEQxQThBN0IiCisgICAgICAgIkZBODVBQzgzQjRCMTRFNzNBQjg2Q0I5NkMyMzZDOEJGQjA5NzhCNjFCMjM2N0E3RkU0Rjc4OTEwNzBGNTZDNzhENUREIgorICAgICAgICJGNTU3NkJGRTVCRTRGMzMzQTRFMjY2NEU3OTUyOEIzMjk0OTA3QUFERDYzRjRGMkU3QUE4MTQ3QjkyOEQ4Q0Q2OTc2NSIKKyAgICAgICAiM0RCOThDNDI5N0NCNjc4MDQ2RUQ1NUMwREJFNjBCRjcxNDJDNTk0NjAzRTRENzA1REMzRDE3MjcwRjlGMDg2RUM1NjEiCisgICAgICAgIjI3MDNENTE4RDhENDlGRjBFQkU2IylcbiIKKyIpKVxuIjsKKworCisjZGVmaW5lIERJTSh2KQkJICAgICAoc2l6ZW9mKHYpL3NpemVvZigodilbMF0pKQorI2RlZmluZSBESU1vZih0eXBlLG1lbWJlcikgICBESU0oKCh0eXBlICopMCktPm1lbWJlcikKKyNkZWZpbmUgQlVHKCkgZG8ge2ZwcmludGYgKCBzdGRlcnIsICJPb29wcyBhdCAlczolZFxuIiwgX19GSUxFX18gLCBfX0xJTkVfXyApO1wKKwkJICBleGl0KDIpO30gd2hpbGUoMCkKKworCisvKiBIZWxwZXIgZm9yIHRoZSBzdGFydCBhbmQgc3RvcCB0aW1lci4gKi8KKyNpZmRlZiBfV0lOMzIKK3N0cnVjdCB7CisgIEZJTEVUSU1FIGNyZWF0aW9uX3RpbWUsIGV4aXRfdGltZSwga2VybmVsX3RpbWUsIHVzZXJfdGltZTsKK30gc3RhcnRlZF9hdCwgc3RvcHBlZF9hdDsKKyNlbHNlCitzdGF0aWMgY2xvY2tfdCBzdGFydGVkX2F0LCBzdG9wcGVkX2F0OworI2VuZGlmCisKK3N0YXRpYyB2b2lkCitkaWUgKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICB2YV9saXN0IGFyZ19wdHIgOworCisgIHZhX3N0YXJ0KCBhcmdfcHRyLCBmb3JtYXQgKSA7CisgIHB1dGNoYXIgKCdcbicpOworICBmcHV0cyAoIFBHTSAiOiAiLCBzdGRlcnIpOworICB2ZnByaW50ZiAoc3RkZXJyLCBmb3JtYXQsIGFyZ19wdHIgKTsKKyAgdmFfZW5kKGFyZ19wdHIpOworICBleGl0ICgxKTsKK30KKworc3RhdGljIHZvaWQKK3Nob3dfc2V4cCAoY29uc3QgY2hhciAqcHJlZml4LCBnY3J5X3NleHBfdCBhKQoreworICBjaGFyICpidWY7CisgIHNpemVfdCBzaXplOworCisgIGZwdXRzIChwcmVmaXgsIHN0ZGVycik7CisgIHNpemUgPSBnY3J5X3NleHBfc3ByaW50IChhLCBHQ1JZU0VYUF9GTVRfQURWQU5DRUQsIE5VTEwsIDApOworICBidWYgPSBtYWxsb2MgKHNpemUpOworICBpZiAoIWJ1ZikKKyAgICBkaWUgKCJvdXQgb2YgY29yZVxuIik7CisKKyAgZ2NyeV9zZXhwX3NwcmludCAoYSwgR0NSWVNFWFBfRk1UX0FEVkFOQ0VELCBidWYsIHNpemUpOworICBmcHJpbnRmIChzdGRlcnIsICIlLipzIiwgKGludClzaXplLCBidWYpOworfQorCisKK3N0YXRpYyB2b2lkCitzdGFydF90aW1lciAodm9pZCkKK3sKKyNpZmRlZiBfV0lOMzIKKyAgR2V0UHJvY2Vzc1RpbWVzIChHZXRDdXJyZW50UHJvY2VzcyAoKSwKKyAgICAgICAgICAgICAgICAgICAmc3RhcnRlZF9hdC5jcmVhdGlvbl90aW1lLCAmc3RhcnRlZF9hdC5leGl0X3RpbWUsCisgICAgICAgICAgICAgICAgICAgJnN0YXJ0ZWRfYXQua2VybmVsX3RpbWUsICZzdGFydGVkX2F0LnVzZXJfdGltZSk7CisgIHN0b3BwZWRfYXQgPSBzdGFydGVkX2F0OworI2Vsc2UKKyAgc3RydWN0IHRtcyB0bXA7CisKKyAgdGltZXMgKCZ0bXApOworICBzdGFydGVkX2F0ID0gc3RvcHBlZF9hdCA9IHRtcC50bXNfdXRpbWU7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK3N0b3BfdGltZXIgKHZvaWQpCit7CisjaWZkZWYgX1dJTjMyCisgIEdldFByb2Nlc3NUaW1lcyAoR2V0Q3VycmVudFByb2Nlc3MgKCksCisgICAgICAgICAgICAgICAgICAgJnN0b3BwZWRfYXQuY3JlYXRpb25fdGltZSwgJnN0b3BwZWRfYXQuZXhpdF90aW1lLAorICAgICAgICAgICAgICAgICAgICZzdG9wcGVkX2F0Lmtlcm5lbF90aW1lLCAmc3RvcHBlZF9hdC51c2VyX3RpbWUpOworI2Vsc2UKKyAgc3RydWN0IHRtcyB0bXA7CisKKyAgdGltZXMgKCZ0bXApOworICBzdG9wcGVkX2F0ID0gdG1wLnRtc191dGltZTsKKyNlbmRpZgorfQorCitzdGF0aWMgY29uc3QgY2hhciAqCitlbGFwc2VkX3RpbWUgKHZvaWQpCit7CisgIHN0YXRpYyBjaGFyIGJ1Zls1MF07CisjaWYgX1dJTjMyCisgIHVuc2lnbmVkIGxvbmcgbG9uZyB0MSwgdDIsIHQ7CisKKyAgdDEgPSAoKCh1bnNpZ25lZCBsb25nIGxvbmcpc3RhcnRlZF9hdC5rZXJuZWxfdGltZS5kd0hpZ2hEYXRlVGltZSA8PCAzMikKKyAgICAgICAgKyBzdGFydGVkX2F0Lmtlcm5lbF90aW1lLmR3TG93RGF0ZVRpbWUpOworICB0MSArPSAoKCh1bnNpZ25lZCBsb25nIGxvbmcpc3RhcnRlZF9hdC51c2VyX3RpbWUuZHdIaWdoRGF0ZVRpbWUgPDwgMzIpCisgICAgICAgICsgc3RhcnRlZF9hdC51c2VyX3RpbWUuZHdMb3dEYXRlVGltZSk7CisgIHQyID0gKCgodW5zaWduZWQgbG9uZyBsb25nKXN0b3BwZWRfYXQua2VybmVsX3RpbWUuZHdIaWdoRGF0ZVRpbWUgPDwgMzIpCisgICAgICAgICsgc3RvcHBlZF9hdC5rZXJuZWxfdGltZS5kd0xvd0RhdGVUaW1lKTsKKyAgdDIgKz0gKCgodW5zaWduZWQgbG9uZyBsb25nKXN0b3BwZWRfYXQudXNlcl90aW1lLmR3SGlnaERhdGVUaW1lIDw8IDMyKQorICAgICAgICArIHN0b3BwZWRfYXQudXNlcl90aW1lLmR3TG93RGF0ZVRpbWUpOworICB0ID0gKHQyIC0gdDEpLzEwMDAwOworICBzbnByaW50ZiAoYnVmLCBzaXplb2YgYnVmLCAiJTUuMGZtcyIsIChkb3VibGUpdCApOworI2Vsc2UKKyAgc25wcmludGYgKGJ1Ziwgc2l6ZW9mIGJ1ZiwgIiU1LjBmbXMiLAorICAgICAgICAgICAgKCgoZG91YmxlKSAoc3RvcHBlZF9hdCAtIHN0YXJ0ZWRfYXQpKS9DTE9DS1NfUEVSX1NFQykqMTAwMDAwMDApOworI2VuZGlmCisgIHJldHVybiBidWY7Cit9CisKKworc3RhdGljIHZvaWQKK3JhbmRvbV9iZW5jaCAoaW50IHZlcnlfc3Ryb25nKQoreworICBjaGFyIGJ1ZlsxMjhdOworICBpbnQgaTsKKworICBwcmludGYgKCIlLTEwcyIsICJyYW5kb20iKTsKKworICBpZiAoIXZlcnlfc3Ryb25nKQorICAgIHsKKyAgICAgIHN0YXJ0X3RpbWVyICgpOworICAgICAgZm9yIChpPTA7IGkgPCAxMDA7IGkrKykKKyAgICAgICAgZ2NyeV9yYW5kb21pemUgKGJ1Ziwgc2l6ZW9mIGJ1ZiwgR0NSWV9TVFJPTkdfUkFORE9NKTsKKyAgICAgIHN0b3BfdGltZXIgKCk7CisgICAgICBwcmludGYgKCIgJXMiLCBlbGFwc2VkX3RpbWUgKCkpOworICAgIH0KKworICBzdGFydF90aW1lciAoKTsKKyAgZm9yIChpPTA7IGkgPCAxMDA7IGkrKykKKyAgICBnY3J5X3JhbmRvbWl6ZSAoYnVmLCA4LAorICAgICAgICAgICAgICAgICAgICB2ZXJ5X3N0cm9uZz8gR0NSWV9WRVJZX1NUUk9OR19SQU5ET006R0NSWV9TVFJPTkdfUkFORE9NKTsKKyAgc3RvcF90aW1lciAoKTsKKyAgcHJpbnRmICgiICVzIiwgZWxhcHNlZF90aW1lICgpKTsKKworICBwdXRjaGFyICgnXG4nKTsKKyAgaWYgKHZlcmJvc2UpCisgICAgZ2NyeV9jb250cm9sIChHQ1JZQ1RMX0RVTVBfUkFORE9NX1NUQVRTKTsKK30KKworCisKK3N0YXRpYyB2b2lkCittZF9iZW5jaCAoIGNvbnN0IGNoYXIgKmFsZ29uYW1lICkKK3sKKyAgaW50IGFsZ287CisgIGdjcnlfbWRfaGRfdCBoZDsKKyAgaW50IGk7CisgIGNoYXIgYnVmWzEwMDBdOworICBnY3J5X2Vycm9yX3QgZXJyID0gR1BHX0VSUl9OT19FUlJPUjsKKworICBpZiAoIWFsZ29uYW1lKQorICAgIHsKKyAgICAgIGZvciAoaT0xOyBpIDwgNDAwOyBpKyspCisgICAgICAgIGlmIChpbl9maXBzX21vZGUgJiYgaSA9PSBHQ1JZX01EX01ENSkKKyAgICAgICAgICA7IC8qIERvbid0IHVzZSBNRDUgaW4gZmlwcyBtb2RlLiAgKi8KKyAgICAgICAgZWxzZSBpZiAoICFnY3J5X21kX3Rlc3RfYWxnbyAoaSkgKQorICAgICAgICAgIG1kX2JlbmNoIChnY3J5X21kX2FsZ29fbmFtZSAoaSkpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBhbGdvID0gZ2NyeV9tZF9tYXBfbmFtZSAoYWxnb25hbWUpOworICBpZiAoIWFsZ28pCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCBQR00gIjogaW52YWxpZCBoYXNoIGFsZ29yaXRobSBgJXMnXG4iLCBhbGdvbmFtZSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgZXJyID0gZ2NyeV9tZF9vcGVuICgmaGQsIGFsZ28sIDApOworICBpZiAoZXJyKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgUEdNICI6IGVycm9yIG9wZW5pbmcgaGFzaCBhbGdvcml0aG0gYCVzJ1xuIiwgYWxnb25hbWUpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGZvciAoaT0wOyBpIDwgc2l6ZW9mIGJ1ZjsgaSsrKQorICAgIGJ1ZltpXSA9IGk7CisKKyAgcHJpbnRmICgiJS0xMnMiLCBnY3J5X21kX2FsZ29fbmFtZSAoYWxnbykpOworCisgIHN0YXJ0X3RpbWVyICgpOworICBmb3IgKGk9MDsgaSA8IDEwMDA7IGkrKykKKyAgICBnY3J5X21kX3dyaXRlIChoZCwgYnVmLCBzaXplb2YgYnVmKTsKKyAgZ2NyeV9tZF9maW5hbCAoaGQpOworICBzdG9wX3RpbWVyICgpOworICBwcmludGYgKCIgJXMiLCBlbGFwc2VkX3RpbWUgKCkpOworCisgIGdjcnlfbWRfcmVzZXQgKGhkKTsKKyAgc3RhcnRfdGltZXIgKCk7CisgIGZvciAoaT0wOyBpIDwgMTAwMDA7IGkrKykKKyAgICBnY3J5X21kX3dyaXRlIChoZCwgYnVmLCBzaXplb2YgYnVmLzEwKTsKKyAgZ2NyeV9tZF9maW5hbCAoaGQpOworICBzdG9wX3RpbWVyICgpOworICBwcmludGYgKCIgJXMiLCBlbGFwc2VkX3RpbWUgKCkpOworCisgIGdjcnlfbWRfcmVzZXQgKGhkKTsKKyAgc3RhcnRfdGltZXIgKCk7CisgIGZvciAoaT0wOyBpIDwgMTAwMDAwMDsgaSsrKQorICAgIGdjcnlfbWRfd3JpdGUgKGhkLCAiIiwgMSk7CisgIGdjcnlfbWRfZmluYWwgKGhkKTsKKyAgc3RvcF90aW1lciAoKTsKKyAgcHJpbnRmICgiICVzIiwgZWxhcHNlZF90aW1lICgpKTsKKworICBnY3J5X21kX2Nsb3NlIChoZCk7CisgIHB1dGNoYXIgKCdcbicpOworfQorCitzdGF0aWMgdm9pZAorY2lwaGVyX2JlbmNoICggY29uc3QgY2hhciAqYWxnb25hbWUgKQoreworICBzdGF0aWMgaW50IGhlYWRlcl9wcmludGVkOworICBpbnQgYWxnbzsKKyAgZ2NyeV9jaXBoZXJfaGRfdCBoZDsKKyAgaW50IGk7CisgIGludCBrZXlsZW4sIGJsa2xlbjsKKyAgY2hhciBrZXlbMTI4XTsKKyAgY2hhciAqb3V0YnVmLCAqYnVmOworICBzaXplX3QgYWxsb2NhdGVkX2J1ZmxlbiwgYnVmbGVuOworICBpbnQgcmVwZXRpdGlvbnM7CisgIHN0YXRpYyBzdHJ1Y3QgeyBpbnQgbW9kZTsgY29uc3QgY2hhciAqbmFtZTsgaW50IGJsb2NrZWQ7IH0gbW9kZXNbXSA9IHsKKyAgICB7IEdDUllfQ0lQSEVSX01PREVfRUNCLCAiRUNCIiwgMSB9LAorICAgIHsgR0NSWV9DSVBIRVJfTU9ERV9DQkMsICJDQkMiLCAxIH0sCisgICAgeyBHQ1JZX0NJUEhFUl9NT0RFX0NGQiwgIkNGQiIsIDAgfSwKKyAgICB7IEdDUllfQ0lQSEVSX01PREVfT0ZCLCAiT0ZCIiwgMCB9LAorICAgIHsgR0NSWV9DSVBIRVJfTU9ERV9DVFIsICJDVFIiLCAwIH0sCisgICAgeyBHQ1JZX0NJUEhFUl9NT0RFX1NUUkVBTSwgIlNUUkVBTSIsIDAgfSwKKyAgICB7MH0KKyAgfTsKKyAgaW50IG1vZGVpZHg7CisgIGdjcnlfZXJyb3JfdCBlcnIgPSBHUEdfRVJSX05PX0VSUk9SOworCisKKyAgaWYgKCFhbGdvbmFtZSkKKyAgICB7CisgICAgICBmb3IgKGk9MTsgaSA8IDQwMDsgaSsrKQorICAgICAgICBpZiAoICFnY3J5X2NpcGhlcl90ZXN0X2FsZ28gKGkpICkKKyAgICAgICAgICBjaXBoZXJfYmVuY2ggKGdjcnlfY2lwaGVyX2FsZ29fbmFtZSAoaSkpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAobGFyZ2VfYnVmZmVycykKKyAgICB7CisgICAgICBhbGxvY2F0ZWRfYnVmbGVuID0gMTAyNCAqIDEwMDsKKyAgICAgIHJlcGV0aXRpb25zID0gMTA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYWxsb2NhdGVkX2J1ZmxlbiA9IDEwMjQ7CisgICAgICByZXBldGl0aW9ucyA9IDEwMDA7CisgICAgfQorICByZXBldGl0aW9ucyAqPSBjaXBoZXJfcmVwZXRpdGlvbnM7CisKKyAgYnVmID0gZ2NyeV94bWFsbG9jIChhbGxvY2F0ZWRfYnVmbGVuKTsKKyAgb3V0YnVmID0gZ2NyeV94bWFsbG9jIChhbGxvY2F0ZWRfYnVmbGVuKTsKKworICBpZiAoIWhlYWRlcl9wcmludGVkKQorICAgIHsKKyAgICAgIGlmIChjaXBoZXJfcmVwZXRpdGlvbnMgIT0gMSkKKyAgICAgICAgcHJpbnRmICgiUnVubmluZyBlYWNoIHRlc3QgJWQgdGltZXMuXG4iLCBjaXBoZXJfcmVwZXRpdGlvbnMpOworICAgICAgcHJpbnRmICgiJS0xMnMiLCAiIik7CisgICAgICBmb3IgKG1vZGVpZHg9MDsgbW9kZXNbbW9kZWlkeF0ubW9kZTsgbW9kZWlkeCsrKQorICAgICAgICBwcmludGYgKCIgJS0xNXMiLCBtb2Rlc1ttb2RlaWR4XS5uYW1lICk7CisgICAgICBwdXRjaGFyICgnXG4nKTsKKyAgICAgIHByaW50ZiAoIiUtMTJzIiwgIiIpOworICAgICAgZm9yIChtb2RlaWR4PTA7IG1vZGVzW21vZGVpZHhdLm1vZGU7IG1vZGVpZHgrKykKKyAgICAgICAgcHJpbnRmICgiIC0tLS0tLS0tLS0tLS0tLSIgKTsKKyAgICAgIHB1dGNoYXIgKCdcbicpOworICAgICAgaGVhZGVyX3ByaW50ZWQgPSAxOworICAgIH0KKworICBhbGdvID0gZ2NyeV9jaXBoZXJfbWFwX25hbWUgKGFsZ29uYW1lKTsKKyAgaWYgKCFhbGdvKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgUEdNICI6IGludmFsaWQgY2lwaGVyIGFsZ29yaXRobSBgJXMnXG4iLCBhbGdvbmFtZSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAga2V5bGVuID0gZ2NyeV9jaXBoZXJfZ2V0X2FsZ29fa2V5bGVuIChhbGdvKTsKKyAgaWYgKCFrZXlsZW4pCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCBQR00gIjogZmFpbGVkIHRvIGdldCBrZXkgbGVuZ3RoIGZvciBhbGdvcml0aG0gYCVzJ1xuIiwKKwkgICAgICAgYWxnb25hbWUpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorICBpZiAoIGtleWxlbiA+IHNpemVvZiBrZXkgKQorICAgIHsKKyAgICAgICAgZnByaW50ZiAoc3RkZXJyLCBQR00gIjogYWxnbyAlZCwga2V5bGVuZ3RoIHByb2JsZW0gKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgYWxnbywga2V5bGVuICk7CisgICAgICAgIGV4aXQgKDEpOworICAgIH0KKyAgZm9yIChpPTA7IGkgPCBrZXlsZW47IGkrKykKKyAgICBrZXlbaV0gPSBpICsgKGNsb2NrICgpICYgMHhmZik7CisKKyAgYmxrbGVuID0gZ2NyeV9jaXBoZXJfZ2V0X2FsZ29fYmxrbGVuIChhbGdvKTsKKyAgaWYgKCFibGtsZW4pCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCBQR00gIjogZmFpbGVkIHRvIGdldCBibG9jayBsZW5ndGggZm9yIGFsZ29yaXRobSBgJXMnXG4iLAorCSAgICAgICBhbGdvbmFtZSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgcHJpbnRmICgiJS0xMnMiLCBnY3J5X2NpcGhlcl9hbGdvX25hbWUgKGFsZ28pKTsKKyAgZmZsdXNoIChzdGRvdXQpOworCisgIGZvciAobW9kZWlkeD0wOyBtb2Rlc1ttb2RlaWR4XS5tb2RlOyBtb2RlaWR4KyspCisgICAgeworICAgICAgaWYgKChibGtsZW4gPiAxICYmIG1vZGVzW21vZGVpZHhdLm1vZGUgPT0gR0NSWV9DSVBIRVJfTU9ERV9TVFJFQU0pCisgICAgICAgICAgfCAoYmxrbGVuID09IDEgJiYgbW9kZXNbbW9kZWlkeF0ubW9kZSAhPSBHQ1JZX0NJUEhFUl9NT0RFX1NUUkVBTSkpCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGYgKCIgICAgICAgICAgICAgICAgIiApOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgIGZvciAoaT0wOyBpIDwgc2l6ZW9mIGJ1ZjsgaSsrKQorICAgICAgICBidWZbaV0gPSBpOworCisgICAgICBlcnIgPSBnY3J5X2NpcGhlcl9vcGVuICgmaGQsIGFsZ28sIG1vZGVzW21vZGVpZHhdLm1vZGUsIDApOworICAgICAgaWYgKGVycikKKyAgICAgICAgeworICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgUEdNICI6IGVycm9yIG9wZW5pbmcgY2lwaGVyIGAlcydcbiIsIGFsZ29uYW1lKTsKKyAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBlcnIgPSBnY3J5X2NpcGhlcl9zZXRrZXkgKGhkLCBrZXksIGtleWxlbik7CisgICAgICBpZiAoZXJyKQorICAgICAgeyAKKyAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJnY3J5X2NpcGhlcl9zZXRrZXkgZmFpbGVkOiAlc1xuIiwKKwkJICAgZ3BnX3N0cmVycm9yIChlcnIpKTsKKyAgICAgICAgICBnY3J5X2NpcGhlcl9jbG9zZSAoaGQpOworICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICB9CisKKyAgICAgIGJ1ZmxlbiA9IGFsbG9jYXRlZF9idWZsZW47CisgICAgICBpZiAobW9kZXNbbW9kZWlkeF0uYmxvY2tlZCkKKyAgICAgICAgYnVmbGVuID0gKGJ1ZmxlbiAvIGJsa2xlbikgKiBibGtsZW47CisgICAgICAKKyAgICAgIHN0YXJ0X3RpbWVyICgpOworICAgICAgZm9yIChpPWVycj0wOyAhZXJyICYmIGkgPCByZXBldGl0aW9uczsgaSsrKQorICAgICAgICBlcnIgPSBnY3J5X2NpcGhlcl9lbmNyeXB0ICggaGQsIG91dGJ1ZiwgYnVmbGVuLCBidWYsIGJ1Zmxlbik7CisgICAgICBzdG9wX3RpbWVyICgpOworCisgICAgICBwcmludGYgKCIgJXMiLCBlbGFwc2VkX3RpbWUgKCkpOworICAgICAgZmZsdXNoIChzdGRvdXQpOworICAgICAgZ2NyeV9jaXBoZXJfY2xvc2UgKGhkKTsKKyAgICAgIGlmIChlcnIpCisgICAgICAgIHsgCisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiZ2NyeV9jaXBoZXJfZW5jcnlwdCBmYWlsZWQ6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgIGdwZ19zdHJlcnJvciAoZXJyKSApOworICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICB9CisKKyAgICAgIGVyciA9IGdjcnlfY2lwaGVyX29wZW4gKCZoZCwgYWxnbywgbW9kZXNbbW9kZWlkeF0ubW9kZSwgMCk7CisgICAgICBpZiAoZXJyKQorICAgICAgICB7CisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCBQR00gIjogZXJyb3Igb3BlbmluZyBjaXBoZXIgYCVzJy9uIiwgYWxnb25hbWUpOworICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICB9CisgICAgICAKKyAgICAgIGVyciA9IGdjcnlfY2lwaGVyX3NldGtleSAoaGQsIGtleSwga2V5bGVuKTsKKyAgICAgIGlmIChlcnIpCisgICAgICAgIHsgCisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiZ2NyeV9jaXBoZXJfc2V0a2V5IGZhaWxlZDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgZ3BnX3N0cmVycm9yIChlcnIpKTsKKyAgICAgICAgICBnY3J5X2NpcGhlcl9jbG9zZSAoaGQpOworICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICB9CisKKyAgICAgIHN0YXJ0X3RpbWVyICgpOworICAgICAgZm9yIChpPWVycj0wOyAhZXJyICYmIGkgPCByZXBldGl0aW9uczsgaSsrKQorICAgICAgICBlcnIgPSBnY3J5X2NpcGhlcl9kZWNyeXB0ICggaGQsIG91dGJ1ZiwgYnVmbGVuLCAgYnVmLCBidWZsZW4pOworICAgICAgc3RvcF90aW1lciAoKTsKKyAgICAgIHByaW50ZiAoIiAlcyIsIGVsYXBzZWRfdGltZSAoKSk7CisgICAgICBmZmx1c2ggKHN0ZG91dCk7CisgICAgICBnY3J5X2NpcGhlcl9jbG9zZSAoaGQpOworICAgICAgaWYgKGVycikKKyAgICAgICAgeyAKKyAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJnY3J5X2NpcGhlcl9kZWNyeXB0IGZhaWxlZDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgZ3BnX3N0cmVycm9yIChlcnIpICk7CisgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgcHV0Y2hhciAoJ1xuJyk7CisgIGdjcnlfZnJlZSAoYnVmKTsKKyAgZ2NyeV9mcmVlIChvdXRidWYpOworfQorCisKKworc3RhdGljIHZvaWQKK3JzYV9iZW5jaCAoaW50IGl0ZXJhdGlvbnMsIGludCBwcmludF9oZWFkZXIsIGludCBub19ibGluZGluZykKK3sKKyAgZ3BnX2Vycm9yX3QgZXJyOworICBpbnQgcF9zaXplc1tdID0geyAxMDI0LCAyMDQ4LCAzMDcyLCA0MDk2IH07CisgIGludCB0ZXN0bm87CisKKyAgaWYgKHByaW50X2hlYWRlcikKKyAgICBwcmludGYgKCJBbGdvcml0aG0gICAgICAgICBnZW5lcmF0ZSAlNGQqc2lnbiAlNGQqdmVyaWZ5XG4iCisgICAgICAgICAgICAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iLAorICAgICAgICAgICAgaXRlcmF0aW9ucywgaXRlcmF0aW9ucyApOworICBmb3IgKHRlc3Rubz0wOyB0ZXN0bm8gPCBESU0gKHBfc2l6ZXMpOyB0ZXN0bm8rKykKKyAgICB7CisgICAgICBnY3J5X3NleHBfdCBrZXlfc3BlYywga2V5X3BhaXIsIHB1Yl9rZXksIHNlY19rZXk7CisgICAgICBnY3J5X21waV90IHg7CisgICAgICBnY3J5X3NleHBfdCBkYXRhOworICAgICAgZ2NyeV9zZXhwX3Qgc2lnID0gTlVMTDsKKyAgICAgIGludCBjb3VudDsKKworICAgICAgcHJpbnRmICgiUlNBICUzZCBiaXQgICAgIiwgcF9zaXplc1t0ZXN0bm9dKTsKKyAgICAgIGZmbHVzaCAoc3Rkb3V0KTsKKworICAgICAgZXJyID0gZ2NyeV9zZXhwX2J1aWxkICgma2V5X3NwZWMsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfZmlwc19tb2RlX2FjdGl2ZSAoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICIoZ2Vua2V5IChSU0EgKG5iaXRzICVkKSkpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICIoZ2Vua2V5IChSU0EgKG5iaXRzICVkKSh0cmFuc2llbnQta2V5KSkpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9zaXplc1t0ZXN0bm9dKTsKKyAgICAgIGlmIChlcnIpCisgICAgICAgIGRpZSAoImNyZWF0aW5nIFMtZXhwcmVzc2lvbiBmYWlsZWQ6ICVzXG4iLCBnY3J5X3N0cmVycm9yIChlcnIpKTsKKworICAgICAgc3RhcnRfdGltZXIgKCk7CisgICAgICBlcnIgPSBnY3J5X3BrX2dlbmtleSAoJmtleV9wYWlyLCBrZXlfc3BlYyk7CisgICAgICBpZiAoZXJyKQorICAgICAgICBkaWUgKCJjcmVhdGluZyAlZCBiaXQgUlNBIGtleSBmYWlsZWQ6ICVzXG4iLAorICAgICAgICAgICAgIHBfc2l6ZXNbdGVzdG5vXSwgZ2NyeV9zdHJlcnJvciAoZXJyKSk7CisKKyAgICAgIHB1Yl9rZXkgPSBnY3J5X3NleHBfZmluZF90b2tlbiAoa2V5X3BhaXIsICJwdWJsaWMta2V5IiwgMCk7CisgICAgICBpZiAoISBwdWJfa2V5KQorICAgICAgICBkaWUgKCJwdWJsaWMgcGFydCBtaXNzaW5nIGluIGtleVxuIik7CisgICAgICBzZWNfa2V5ID0gZ2NyeV9zZXhwX2ZpbmRfdG9rZW4gKGtleV9wYWlyLCAicHJpdmF0ZS1rZXkiLCAwKTsKKyAgICAgIGlmICghIHNlY19rZXkpCisgICAgICAgIGRpZSAoInByaXZhdGUgcGFydCBtaXNzaW5nIGluIGtleVxuIik7CisgICAgICBnY3J5X3NleHBfcmVsZWFzZSAoa2V5X3BhaXIpOworICAgICAgZ2NyeV9zZXhwX3JlbGVhc2UgKGtleV9zcGVjKTsKKworICAgICAgc3RvcF90aW1lciAoKTsKKyAgICAgIHByaW50ZiAoIiAgICVzIiwgZWxhcHNlZF90aW1lICgpKTsKKyAgICAgIGZmbHVzaCAoc3Rkb3V0KTsKKworICAgICAgeCA9IGdjcnlfbXBpX25ldyAocF9zaXplc1t0ZXN0bm9dKTsKKyAgICAgIGdjcnlfbXBpX3JhbmRvbWl6ZSAoeCwgcF9zaXplc1t0ZXN0bm9dLTgsIEdDUllfV0VBS19SQU5ET00pOworICAgICAgZXJyID0gZ2NyeV9zZXhwX2J1aWxkICgmZGF0YSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihkYXRhIChmbGFncyByYXcpICh2YWx1ZSAlbSkpIiwgeCk7CisgICAgICBnY3J5X21waV9yZWxlYXNlICh4KTsKKyAgICAgIGlmIChlcnIpCisgICAgICAgIGRpZSAoImNvbnZlcnRpbmcgZGF0YSBmYWlsZWQ6ICVzXG4iLCBnY3J5X3N0cmVycm9yIChlcnIpKTsKKworICAgICAgc3RhcnRfdGltZXIgKCk7CisgICAgICBmb3IgKGNvdW50PTA7IGNvdW50IDwgaXRlcmF0aW9uczsgY291bnQrKykKKyAgICAgICAgeworICAgICAgICAgIGdjcnlfc2V4cF9yZWxlYXNlIChzaWcpOworICAgICAgICAgIGVyciA9IGdjcnlfcGtfc2lnbiAoJnNpZywgZGF0YSwgc2VjX2tleSk7CisgICAgICAgICAgaWYgKGVycikKKyAgICAgICAgICAgIGRpZSAoInNpZ25pbmcgZmFpbGVkICglZCk6ICVzXG4iLCBjb3VudCwgZ3BnX3N0cmVycm9yIChlcnIpKTsKKyAgICAgICAgfQorICAgICAgc3RvcF90aW1lciAoKTsKKyAgICAgIHByaW50ZiAoIiAgICVzIiwgZWxhcHNlZF90aW1lICgpKTsKKyAgICAgIGZmbHVzaCAoc3Rkb3V0KTsKKworICAgICAgc3RhcnRfdGltZXIgKCk7CisgICAgICBmb3IgKGNvdW50PTA7IGNvdW50IDwgaXRlcmF0aW9uczsgY291bnQrKykKKyAgICAgICAgeworICAgICAgICAgIGVyciA9IGdjcnlfcGtfdmVyaWZ5IChzaWcsIGRhdGEsIHB1Yl9rZXkpOworICAgICAgICAgIGlmIChlcnIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHB1dGNoYXIgKCdcbicpOworICAgICAgICAgICAgICBzaG93X3NleHAgKCJzZWNrZXk6XG4iLCBzZWNfa2V5KTsKKyAgICAgICAgICAgICAgc2hvd19zZXhwICgiZGF0YTpcbiIsIGRhdGEpOworICAgICAgICAgICAgICBzaG93X3NleHAgKCJzaWc6XG4iLCBzaWcpOworICAgICAgICAgICAgICBkaWUgKCJ2ZXJpZnkgZmFpbGVkICglZCk6ICVzXG4iLCBjb3VudCwgZ3BnX3N0cmVycm9yIChlcnIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgc3RvcF90aW1lciAoKTsKKyAgICAgIHByaW50ZiAoIiAgICAgJXMiLCBlbGFwc2VkX3RpbWUgKCkpOworCisgICAgICBpZiAobm9fYmxpbmRpbmcpCisgICAgICAgIHsKKyAgICAgICAgICBmZmx1c2ggKHN0ZG91dCk7CisgICAgICAgICAgeCA9IGdjcnlfbXBpX25ldyAocF9zaXplc1t0ZXN0bm9dKTsKKyAgICAgICAgICBnY3J5X21waV9yYW5kb21pemUgKHgsIHBfc2l6ZXNbdGVzdG5vXS04LCBHQ1JZX1dFQUtfUkFORE9NKTsKKyAgICAgICAgICBlcnIgPSBnY3J5X3NleHBfYnVpbGQgKCZkYXRhLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihkYXRhIChmbGFncyBuby1ibGluZGluZykgKHZhbHVlICVtKSkiLCB4KTsKKyAgICAgICAgICBnY3J5X21waV9yZWxlYXNlICh4KTsKKyAgICAgICAgICBpZiAoZXJyKQorICAgICAgICAgICAgZGllICgiY29udmVydGluZyBkYXRhIGZhaWxlZDogJXNcbiIsIGdjcnlfc3RyZXJyb3IgKGVycikpOworCisgICAgICAgICAgc3RhcnRfdGltZXIgKCk7CisgICAgICAgICAgZm9yIChjb3VudD0wOyBjb3VudCA8IGl0ZXJhdGlvbnM7IGNvdW50KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGdjcnlfc2V4cF9yZWxlYXNlIChzaWcpOworICAgICAgICAgICAgICBlcnIgPSBnY3J5X3BrX3NpZ24gKCZzaWcsIGRhdGEsIHNlY19rZXkpOworICAgICAgICAgICAgICBpZiAoZXJyKQorICAgICAgICAgICAgICAgIGRpZSAoInNpZ25pbmcgZmFpbGVkICglZCk6ICVzXG4iLCBjb3VudCwgZ3BnX3N0cmVycm9yIChlcnIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBzdG9wX3RpbWVyICgpOworICAgICAgICAgIHByaW50ZiAoIiAgICVzIiwgZWxhcHNlZF90aW1lICgpKTsKKyAgICAgICAgICBmZmx1c2ggKHN0ZG91dCk7CisgICAgICAgIH0KKworICAgICAgcHV0Y2hhciAoJ1xuJyk7CisgICAgICBmZmx1c2ggKHN0ZG91dCk7CisKKyAgICAgIGdjcnlfc2V4cF9yZWxlYXNlIChzaWcpOworICAgICAgZ2NyeV9zZXhwX3JlbGVhc2UgKGRhdGEpOworICAgICAgZ2NyeV9zZXhwX3JlbGVhc2UgKHNlY19rZXkpOworICAgICAgZ2NyeV9zZXhwX3JlbGVhc2UgKHB1Yl9rZXkpOworICAgIH0KK30KKworCisKK3N0YXRpYyB2b2lkCitkc2FfYmVuY2ggKGludCBpdGVyYXRpb25zLCBpbnQgcHJpbnRfaGVhZGVyKQoreworICBncGdfZXJyb3JfdCBlcnI7CisgIGdjcnlfc2V4cF90IHB1Yl9rZXlbM10sIHNlY19rZXlbM107CisgIGludCBwX3NpemVzWzNdID0geyAxMDI0LCAyMDQ4LCAzMDcyIH07CisgIGludCBxX3NpemVzWzNdID0geyAxNjAsIDIyNCwgMjU2IH07CisgIGdjcnlfc2V4cF90IGRhdGE7CisgIGdjcnlfc2V4cF90IHNpZzsKKyAgaW50IGksIGo7CisKKyAgZXJyID0gZ2NyeV9zZXhwX3NzY2FuIChwdWJfa2V5KzAsIE5VTEwsIHNhbXBsZV9wdWJsaWNfZHNhX2tleV8xMDI0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbiAoc2FtcGxlX3B1YmxpY19kc2Ffa2V5XzEwMjQpKTsKKyAgaWYgKCFlcnIpCisgICAgZXJyID0gZ2NyeV9zZXhwX3NzY2FuIChzZWNfa2V5KzAsIE5VTEwsIHNhbXBsZV9wcml2YXRlX2RzYV9rZXlfMTAyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbiAoc2FtcGxlX3ByaXZhdGVfZHNhX2tleV8xMDI0KSk7CisgIGlmICghZXJyKQorICAgIGVyciA9IGdjcnlfc2V4cF9zc2NhbiAocHViX2tleSsxLCBOVUxMLCBzYW1wbGVfcHVibGljX2RzYV9rZXlfMjA0OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbiAoc2FtcGxlX3B1YmxpY19kc2Ffa2V5XzIwNDgpKTsKKyAgaWYgKCFlcnIpCisgICAgZXJyID0gZ2NyeV9zZXhwX3NzY2FuIChzZWNfa2V5KzEsIE5VTEwsIHNhbXBsZV9wcml2YXRlX2RzYV9rZXlfMjA0OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbiAoc2FtcGxlX3ByaXZhdGVfZHNhX2tleV8yMDQ4KSk7CisgIGlmICghZXJyKQorICAgIGVyciA9IGdjcnlfc2V4cF9zc2NhbiAocHViX2tleSsyLCBOVUxMLCBzYW1wbGVfcHVibGljX2RzYV9rZXlfMzA3MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbiAoc2FtcGxlX3B1YmxpY19kc2Ffa2V5XzMwNzIpKTsKKyAgaWYgKCFlcnIpCisgICAgZXJyID0gZ2NyeV9zZXhwX3NzY2FuIChzZWNfa2V5KzIsIE5VTEwsIHNhbXBsZV9wcml2YXRlX2RzYV9rZXlfMzA3MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbiAoc2FtcGxlX3ByaXZhdGVfZHNhX2tleV8zMDcyKSk7CisgIGlmIChlcnIpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCBQR00gIjogY29udmVydGluZyBzYW1wbGUga2V5cyBmYWlsZWQ6ICVzXG4iLAorICAgICAgICAgICAgICAgZ2NyeV9zdHJlcnJvciAoZXJyKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgaWYgKHByaW50X2hlYWRlcikKKyAgICBwcmludGYgKCJBbGdvcml0aG0gICAgICAgICBnZW5lcmF0ZSAlNGQqc2lnbiAlNGQqdmVyaWZ5XG4iCisgICAgICAgICAgICAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iLAorICAgICAgICAgICAgaXRlcmF0aW9ucywgaXRlcmF0aW9ucyApOworICBmb3IgKGk9MDsgaSA8IERJTSAocV9zaXplcyk7IGkrKykKKyAgICB7CisgICAgICBnY3J5X21waV90IHg7CisKKyAgICAgIHggPSBnY3J5X21waV9uZXcgKHFfc2l6ZXNbaV0pOworICAgICAgZ2NyeV9tcGlfcmFuZG9taXplICh4LCBxX3NpemVzW2ldLCBHQ1JZX1dFQUtfUkFORE9NKTsKKyAgICAgIGVyciA9IGdjcnlfc2V4cF9idWlsZCAoJmRhdGEsIE5VTEwsICIoZGF0YSAoZmxhZ3MgcmF3KSAodmFsdWUgJW0pKSIsIHgpOworICAgICAgZ2NyeV9tcGlfcmVsZWFzZSAoeCk7CisgICAgICBpZiAoZXJyKQorICAgICAgICB7CisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCBQR00gIjogY29udmVydGluZyBkYXRhIGZhaWxlZDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgZ2NyeV9zdHJlcnJvciAoZXJyKSk7CisgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgIH0KKworICAgICAgcHJpbnRmICgiRFNBICVkLyVkICAgICAgICAgICAgIC0iLCBwX3NpemVzW2ldLCBxX3NpemVzW2ldKTsKKyAgICAgIGZmbHVzaCAoc3Rkb3V0KTsKKworICAgICAgc3RhcnRfdGltZXIgKCk7CisgICAgICBmb3IgKGo9MDsgaiA8IGl0ZXJhdGlvbnM7IGorKykKKyAgICAgICAgeworICAgICAgICAgIGVyciA9IGdjcnlfcGtfc2lnbiAoJnNpZywgZGF0YSwgc2VjX2tleVtpXSk7CisgICAgICAgICAgaWYgKGVycikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcHV0Y2hhciAoJ1xuJyk7CisgICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgUEdNICI6IHNpZ25pbmcgZmFpbGVkOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZ3BnX3N0cmVycm9yIChlcnIpKTsKKyAgICAgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIHN0b3BfdGltZXIgKCk7CisgICAgICBwcmludGYgKCIgICAlcyIsIGVsYXBzZWRfdGltZSAoKSk7CisgICAgICBmZmx1c2ggKHN0ZG91dCk7CisKKyAgICAgIHN0YXJ0X3RpbWVyICgpOworICAgICAgZm9yIChqPTA7IGogPCBpdGVyYXRpb25zOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICBlcnIgPSBnY3J5X3BrX3ZlcmlmeSAoc2lnLCBkYXRhLCBwdWJfa2V5W2ldKTsKKyAgICAgICAgICBpZiAoZXJyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBwdXRjaGFyICgnXG4nKTsKKyAgICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCBQR00gIjogdmVyaWZ5IGZhaWxlZDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGdwZ19zdHJlcnJvciAoZXJyKSk7CisgICAgICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBzdG9wX3RpbWVyICgpOworICAgICAgcHJpbnRmICgiICAgICAlc1xuIiwgZWxhcHNlZF90aW1lICgpKTsKKyAgICAgIGZmbHVzaCAoc3Rkb3V0KTsKKworICAgICAgZ2NyeV9zZXhwX3JlbGVhc2UgKHNpZyk7CisgICAgICBnY3J5X3NleHBfcmVsZWFzZSAoZGF0YSk7CisgICAgfQorCisKKyAgZm9yIChpPTA7IGkgPCBESU0gKHFfc2l6ZXMpOyBpKyspCisgICAgeworICAgICAgZ2NyeV9zZXhwX3JlbGVhc2UgKHNlY19rZXlbaV0pOworICAgICAgZ2NyeV9zZXhwX3JlbGVhc2UgKHB1Yl9rZXlbaV0pOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAorZWNjX2JlbmNoIChpbnQgaXRlcmF0aW9ucywgaW50IHByaW50X2hlYWRlcikKK3sKKyNpZiBVU0VfRUNDCisgIGdwZ19lcnJvcl90IGVycjsKKyAgaW50IHBfc2l6ZXNbXSA9IHsgMTkyLCAyMjQsIDI1NiwgMzg0LCA1MjEgfTsKKyAgaW50IHRlc3RubzsKKworICBpZiAocHJpbnRfaGVhZGVyKQorICAgIHByaW50ZiAoIkFsZ29yaXRobSAgICAgICAgIGdlbmVyYXRlICU0ZCpzaWduICU0ZCp2ZXJpZnlcbiIKKyAgICAgICAgICAgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIsCisgICAgICAgICAgICBpdGVyYXRpb25zLCBpdGVyYXRpb25zICk7CisgIGZvciAodGVzdG5vPTA7IHRlc3RubyA8IERJTSAocF9zaXplcyk7IHRlc3RubysrKQorICAgIHsKKyAgICAgIGdjcnlfc2V4cF90IGtleV9zcGVjLCBrZXlfcGFpciwgcHViX2tleSwgc2VjX2tleTsKKyAgICAgIGdjcnlfbXBpX3QgeDsKKyAgICAgIGdjcnlfc2V4cF90IGRhdGE7CisgICAgICBnY3J5X3NleHBfdCBzaWcgPSBOVUxMOworICAgICAgaW50IGNvdW50OworCisgICAgICBwcmludGYgKCJFQ0RTQSAlM2QgYml0ICIsIHBfc2l6ZXNbdGVzdG5vXSk7CisgICAgICBmZmx1c2ggKHN0ZG91dCk7CisKKyAgICAgIGVyciA9IGdjcnlfc2V4cF9idWlsZCAoJmtleV9zcGVjLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKGdlbmtleSAoRUNEU0EgKG5iaXRzICVkKSkpIiwgcF9zaXplc1t0ZXN0bm9dKTsKKyAgICAgIGlmIChlcnIpCisgICAgICAgIGRpZSAoImNyZWF0aW5nIFMtZXhwcmVzc2lvbiBmYWlsZWQ6ICVzXG4iLCBnY3J5X3N0cmVycm9yIChlcnIpKTsKKworICAgICAgc3RhcnRfdGltZXIgKCk7CisgICAgICBlcnIgPSBnY3J5X3BrX2dlbmtleSAoJmtleV9wYWlyLCBrZXlfc3BlYyk7CisgICAgICBpZiAoZXJyKQorICAgICAgICBkaWUgKCJjcmVhdGluZyAlZCBiaXQgRUNDIGtleSBmYWlsZWQ6ICVzXG4iLAorICAgICAgICAgICAgIHBfc2l6ZXNbdGVzdG5vXSwgZ2NyeV9zdHJlcnJvciAoZXJyKSk7CisKKyAgICAgIHB1Yl9rZXkgPSBnY3J5X3NleHBfZmluZF90b2tlbiAoa2V5X3BhaXIsICJwdWJsaWMta2V5IiwgMCk7CisgICAgICBpZiAoISBwdWJfa2V5KQorICAgICAgICBkaWUgKCJwdWJsaWMgcGFydCBtaXNzaW5nIGluIGtleVxuIik7CisgICAgICBzZWNfa2V5ID0gZ2NyeV9zZXhwX2ZpbmRfdG9rZW4gKGtleV9wYWlyLCAicHJpdmF0ZS1rZXkiLCAwKTsKKyAgICAgIGlmICghIHNlY19rZXkpCisgICAgICAgIGRpZSAoInByaXZhdGUgcGFydCBtaXNzaW5nIGluIGtleVxuIik7CisgICAgICBnY3J5X3NleHBfcmVsZWFzZSAoa2V5X3BhaXIpOworICAgICAgZ2NyeV9zZXhwX3JlbGVhc2UgKGtleV9zcGVjKTsKKworICAgICAgc3RvcF90aW1lciAoKTsKKyAgICAgIHByaW50ZiAoIiAgICAgJXMiLCBlbGFwc2VkX3RpbWUgKCkpOworICAgICAgZmZsdXNoIChzdGRvdXQpOworCisgICAgICB4ID0gZ2NyeV9tcGlfbmV3IChwX3NpemVzW3Rlc3Rub10pOworICAgICAgZ2NyeV9tcGlfcmFuZG9taXplICh4LCBwX3NpemVzW3Rlc3Rub10sIEdDUllfV0VBS19SQU5ET00pOworICAgICAgZXJyID0gZ2NyeV9zZXhwX2J1aWxkICgmZGF0YSwgTlVMTCwgIihkYXRhIChmbGFncyByYXcpICh2YWx1ZSAlbSkpIiwgeCk7CisgICAgICBnY3J5X21waV9yZWxlYXNlICh4KTsKKyAgICAgIGlmIChlcnIpCisgICAgICAgIGRpZSAoImNvbnZlcnRpbmcgZGF0YSBmYWlsZWQ6ICVzXG4iLCBnY3J5X3N0cmVycm9yIChlcnIpKTsKKworICAgICAgc3RhcnRfdGltZXIgKCk7CisgICAgICBmb3IgKGNvdW50PTA7IGNvdW50IDwgaXRlcmF0aW9uczsgY291bnQrKykKKyAgICAgICAgeworICAgICAgICAgIGdjcnlfc2V4cF9yZWxlYXNlIChzaWcpOworICAgICAgICAgIGVyciA9IGdjcnlfcGtfc2lnbiAoJnNpZywgZGF0YSwgc2VjX2tleSk7CisgICAgICAgICAgaWYgKGVycikKKyAgICAgICAgICAgIGRpZSAoInNpZ25pbmcgZmFpbGVkOiAlc1xuIiwgZ3BnX3N0cmVycm9yIChlcnIpKTsKKyAgICAgICAgfQorICAgICAgc3RvcF90aW1lciAoKTsKKyAgICAgIHByaW50ZiAoIiAgICVzIiwgZWxhcHNlZF90aW1lICgpKTsKKyAgICAgIGZmbHVzaCAoc3Rkb3V0KTsKKworICAgICAgc3RhcnRfdGltZXIgKCk7CisgICAgICBmb3IgKGNvdW50PTA7IGNvdW50IDwgaXRlcmF0aW9uczsgY291bnQrKykKKyAgICAgICAgeworICAgICAgICAgIGVyciA9IGdjcnlfcGtfdmVyaWZ5IChzaWcsIGRhdGEsIHB1Yl9rZXkpOworICAgICAgICAgIGlmIChlcnIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHB1dGNoYXIgKCdcbicpOworICAgICAgICAgICAgICBzaG93X3NleHAgKCJzZWNrZXk6XG4iLCBzZWNfa2V5KTsKKyAgICAgICAgICAgICAgc2hvd19zZXhwICgiZGF0YTpcbiIsIGRhdGEpOworICAgICAgICAgICAgICBzaG93X3NleHAgKCJzaWc6XG4iLCBzaWcpOworICAgICAgICAgICAgICBkaWUgKCJ2ZXJpZnkgZmFpbGVkOiAlc1xuIiwgZ3BnX3N0cmVycm9yIChlcnIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgc3RvcF90aW1lciAoKTsKKyAgICAgIHByaW50ZiAoIiAgICAgJXNcbiIsIGVsYXBzZWRfdGltZSAoKSk7CisgICAgICBmZmx1c2ggKHN0ZG91dCk7CisKKyAgICAgIGdjcnlfc2V4cF9yZWxlYXNlIChzaWcpOworICAgICAgZ2NyeV9zZXhwX3JlbGVhc2UgKGRhdGEpOworICAgICAgZ2NyeV9zZXhwX3JlbGVhc2UgKHNlY19rZXkpOworICAgICAgZ2NyeV9zZXhwX3JlbGVhc2UgKHB1Yl9rZXkpOworICAgIH0KKyNlbmRpZiAvKlVTRV9FQ0MqLworfQorCisKKworc3RhdGljIHZvaWQKK2RvX3Bvd20gKCBjb25zdCBjaGFyICpuX3N0ciwgY29uc3QgY2hhciAqZV9zdHIsIGNvbnN0IGNoYXIgKm1fc3RyKQoreworICBnY3J5X21waV90IGUsIG4sIG1zZywgY2lwOworICBnY3J5X2Vycm9yX3QgZXJyOworICBpbnQgaTsKKworICBlcnIgPSBnY3J5X21waV9zY2FuICgmbiwgR0NSWU1QSV9GTVRfSEVYLCBuX3N0ciwgMCwgMCk7CisgIGlmIChlcnIpIEJVRyAoKTsKKyAgZXJyID0gZ2NyeV9tcGlfc2NhbiAoJmUsIEdDUllNUElfRk1UX0hFWCwgZV9zdHIsIDAsIDApOworICBpZiAoZXJyKSBCVUcgKCk7CisgIGVyciA9IGdjcnlfbXBpX3NjYW4gKCZtc2csIEdDUllNUElfRk1UX0hFWCwgbV9zdHIsIDAsIDApOworICBpZiAoZXJyKSBCVUcgKCk7CisKKyAgY2lwID0gZ2NyeV9tcGlfbmV3ICgwKTsKKworICBzdGFydF90aW1lciAoKTsKKyAgZm9yIChpPTA7IGkgPCAxMDAwOyBpKyspCisgICAgZ2NyeV9tcGlfcG93bSAoY2lwLCBtc2csIGUsIG4pOworICBzdG9wX3RpbWVyICgpOworICBwcmludGYgKCIgJXMiLCBlbGFwc2VkX3RpbWUgKCkpOyBmZmx1c2ggKHN0ZG91dCk7CisvKiAgICB7ICovCisvKiAgICAgIGNoYXIgKmJ1ZjsgKi8KKworLyogICAgICBpZiAoZ2NyeV9tcGlfYXByaW50IChHQ1JZTVBJX0ZNVF9IRVgsICh2b2lkKiopJmJ1ZiwgTlVMTCwgY2lwKSkgKi8KKy8qICAgICAgICBCVUcgKCk7ICovCisvKiAgICAgIHByaW50ZiAoInJlc3VsdDogJXNcbiIsIGJ1Zik7ICovCisvKiAgICAgIGdjcnlfZnJlZSAoYnVmKTsgKi8KKy8qICAgIH0gKi8KKyAgZ2NyeV9tcGlfcmVsZWFzZSAoY2lwKTsKKyAgZ2NyeV9tcGlfcmVsZWFzZSAobXNnKTsKKyAgZ2NyeV9tcGlfcmVsZWFzZSAobik7CisgIGdjcnlfbXBpX3JlbGVhc2UgKGUpOworfQorCisKK3N0YXRpYyB2b2lkCittcGlfYmVuY2ggKHZvaWQpCit7CisgIHByaW50ZiAoIiUtMTBzIiwgInBvd20iKTsgZmZsdXNoIChzdGRvdXQpOworCisgIGRvX3Bvd20gKAorIjIwQTk0NDE3RDRENUVGMkIyREE5OTE2NUM3REM4N0RBREIzOTc5QjcyOTYxQUY5MEQwOUQ1OUJBMjRDQjlBMTAxNjZGRENDQzlDNjU5RjJCOTYyNkVDMjNGM0ZBNDI1RjU2NEEwNzJCQTk0MUIwM0ZBODE3NjdDQzI4OUU0IiwKKyAgICAgICAgICAgIjI5IiwgCisiQjg3MDE4N0EzMjNGMUVDRDVCOEEwQjQyNDk1MDczMzVBMUM0Q0U4Mzk0RjM4RkQ3NkIwOEM3OEE0MkM1OEY2RUExMzZBQ0Y5MERGRTg2MDM2OTdCMTY5NEEzRDgxMTE0RDYxMTdBQzE4MTE5NzlDNTFDNEREMDEzRDUyRjgiCisgICAgICAgICAgICk7CisgIGRvX3Bvd20gKAorICAgICAgICAgICAiMjBBOTQ0MTdENEQ1RUYyQjJEQTk5MTY1QzdEQzg3REFEQjM5NzlCNzI5NjFBRjkwRDA5RDU5QkEyNENCOUExMDE2NkZEQ0NDOUM2NTlGMkI5NjI2RUMyM0YzRkE0MjVGNTY0QTA3MkJBOTQxQjAzRkE4MTc2N0NDMjg5RTQxMDcxRjAyNDY4NzlBNDQyNjU4RkJEMThDMTc3MTU3MUU3MDczRUVFQjIxNjBCQTBDQkZCMzQwNEQ2MjcwNjlBNkNGQkQ1Mzg2N0FEMkQ5RDQwMjMxNjQ4MDAwNzg3QjVDODQxNzZCNDMzNjE0NDY0NEFFNzFBNDAzQ0E0MDcxNiIsCisgICAgICAgICAgICIyOSIsIAorICAgICAgICAgICAiQjg3MDE4N0EzMjNGMUVDRDVCOEEwQjQyNDk1MDczMzVBMUM0Q0U4Mzk0RjM4RkQ3NkIwOEM3OEE0MkM1OEY2RUExMzZBQ0Y5MERGRTg2MDM2OTdCMTY5NEEzRDgxMTE0RDYxMTdBQzE4MTE5NzlDNTFDNEREMDEzRDUyRjhGQzRFRTRCQjQ0NkI4M0U0OEFCRUQ3REI4MUNCRjVFODFERTQ3NTlFOEQ2OEFDOTg1ODQ2RDk5OUY5NkIwRDhBODBFNUM2OUQyNzJDNzY2QUI4QTIzQjQwRDUwQTRGQTg4OUZCQzJCRDI2MjQyMjJEOEVCMjk3RjRCQUVGODU5Mzg0NyIKKyAgICAgICAgICAgKTsKKyAgZG9fcG93bSAoCisgICAgICAgICAgICIyMEE5NDQxN0Q0RDVFRjJCMkRBOTkxNjVDN0RDODdEQURCMzk3OUI3Mjk2MUFGOTBEMDlENTlCQTI0Q0I5QTEwMTY2RkRDQ0M5QzY1OUYyQjk2MjZFQzIzRjNGQTQyNUY1NjRBMDcyQkE5NDFCMDNGQTgxNzY3Q0MyODlFNDEwNzFGMDI0Njg3OUE0NDI2NThGQkQxOEMxNzcxNTcxRTcwNzNFRUVCMjE2MEJBMENCRkIzNDA0RDYyNzA2OUE2Q0ZCRDUzODY3QUQyRDlENDAyMzE2NDgwMDA3ODdCNUM4NDE3NkI0MzM2MTQ0NjQ0QUU3MUE0MDNDQTQwNzE2MjBBOTQ0MTdENEQ1RUYyQjJEQTk5MTY1QzdEQzg3REFEQjM5NzlCNzI5NjFBRjkwRDA5RDU5QkEyNENCOUExMDE2NkZEQ0NDOUM2NTlGMkI5NjI2RUMyM0YzRkE0MjVGNTY0QTA3MkJBOTQxQjAzRkE4MTc2N0NDMjg5RTQxMDcxRjAyNDY4NzlBNDQyNjU4RkJEMThDMTc3MTU3MUU3MDczRUVFQjIxNjBCQTBDQkZCMzQwNEQ2MjcwNjlBNkNGQkQ1Mzg2N0FEMkQ5RDQwMjMxNjQ4MDAwNzg3QjVDODQxNzZCNDMzNjE0NDY0NEFFNzFBNDAzQ0E0MDcxNiIsCisgICAgICAgICAgICIyOSIsIAorICAgICAgICAgICAiQjg3MDE4N0EzMjNGMUVDRDVCOEEwQjQyNDk1MDczMzVBMUM0Q0U4Mzk0RjM4RkQ3NkIwOEM3OEE0MkM1OEY2RUExMzZBQ0Y5MERGRTg2MDM2OTdCMTY5NEEzRDgxMTE0RDYxMTdBQzE4MTE5NzlDNTFDNEREMDEzRDUyRjhGQzRFRTRCQjQ0NkI4M0U0OEFCRUQ3REI4MUNCRjVFODFERTQ3NTlFOEQ2OEFDOTg1ODQ2RDk5OUY5NkIwRDhBODBFNUM2OUQyNzJDNzY2QUI4QTIzQjQwRDUwQTRGQTg4OUZCQzJCRDI2MjQyMjJEOEVCMjk3RjRCQUVGODU5Mzg0N0I4NzAxODdBMzIzRjFFQ0Q1QjhBMEI0MjQ5NTA3MzM1QTFDNENFODM5NEYzOEZENzZCMDhDNzhBNDJDNThGNkVBMTM2QUNGOTBERkU4NjAzNjk3QjE2OTRBM0Q4MTExNEQ2MTE3QUMxODExOTc5QzUxQzRERDAxM0Q1MkY4RkM0RUU0QkI0NDZCODNFNDhBQkVEN0RCODFDQkY1RTgxREU0NzU5RThENjhBQzk4NTg0NkQ5OTlGOTZCMEQ4QTgwRTVDNjlEMjcyQzc2NkFCOEEyM0I0MEQ1MEE0RkE4ODlGQkMyQkQyNjI0MjIyRDhFQjI5N0Y0QkFFRjg1OTM4NDciCisgICAgICAgICAgICk7CisKKyAgcHV0Y2hhciAoJ1xuJyk7CisKKworfQorCisKK2ludAorbWFpbiggaW50IGFyZ2MsIGNoYXIgKiphcmd2ICkKK3sKKyAgaW50IGxhc3RfYXJnYyA9IC0xOworICBpbnQgbm9fYmxpbmRpbmcgPSAwOworICBpbnQgdXNlX3JhbmRvbV9kYWVtb24gPSAwOworCisgIGlmIChhcmdjKQorICAgIHsgYXJnYy0tOyBhcmd2Kys7IH0KKworICB3aGlsZSAoYXJnYyAmJiBsYXN0X2FyZ2MgIT0gYXJnYyApCisgICAgeworICAgICAgbGFzdF9hcmdjID0gYXJnYzsKKyAgICAgIGlmICghc3RyY21wICgqYXJndiwgIi0tIikpCisgICAgICAgIHsKKyAgICAgICAgICBhcmdjLS07IGFyZ3YrKzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3YsICItLWhlbHAiKSkKKyAgICAgICAgeworICAgICAgICAgIGZwdXRzICgidXNhZ2U6IGJlbmNobWFyayAiCisgICAgICAgICAgICAgICAgICJbbWR8Y2lwaGVyfHJhbmRvbXxtcGl8cnNhfGRzYXxlY2MgW2FsZ29uYW1lc11dXG4iLAorICAgICAgICAgICAgICAgICBzdGRvdXQpOworICAgICAgICAgIGV4aXQgKDApOworICAgICAgICB9CisgICAgICBlbHNlIGlmICghc3RyY21wICgqYXJndiwgIi0tdmVyYm9zZSIpKQorICAgICAgICB7CisgICAgICAgICAgdmVyYm9zZSsrOworICAgICAgICAgIGFyZ2MtLTsgYXJndisrOworICAgICAgICB9CisgICAgICBlbHNlIGlmICghc3RyY21wICgqYXJndiwgIi0tdXNlLXJhbmRvbS1kYWVtb24iKSkKKyAgICAgICAgeworICAgICAgICAgIHVzZV9yYW5kb21fZGFlbW9uID0gMTsKKyAgICAgICAgICBhcmdjLS07IGFyZ3YrKzsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3YsICItLW5vLWJsaW5kaW5nIikpCisgICAgICAgIHsKKyAgICAgICAgICBub19ibGluZGluZyA9IDE7CisgICAgICAgICAgYXJnYy0tOyBhcmd2Kys7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKCphcmd2LCAiLS1sYXJnZS1idWZmZXJzIikpCisgICAgICAgIHsKKyAgICAgICAgICBsYXJnZV9idWZmZXJzID0gMTsKKyAgICAgICAgICBhcmdjLS07IGFyZ3YrKzsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3YsICItLWNpcGhlci1yZXBldGl0aW9uIikpCisgICAgICAgIHsKKyAgICAgICAgICBhcmdjLS07IGFyZ3YrKzsKKyAgICAgICAgICBpZiAoYXJnYykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY2lwaGVyX3JlcGV0aXRpb25zID0gYXRvaSgqYXJndik7CisgICAgICAgICAgICAgIGFyZ2MtLTsgYXJndisrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlIGlmICghc3RyY21wICgqYXJndiwgIi0tZmlwcyIpKQorICAgICAgICB7CisgICAgICAgICAgYXJnYy0tOyBhcmd2Kys7CisgICAgICAgICAgLyogVGhpcyBjb21tYW5kIG5lZWRzIHRvIGJlIGNhbGxlZCBiZWZvcmUgZ2NyeV9jaGVja192ZXJzaW9uLiAgKi8KKyAgICAgICAgICBnY3J5X2NvbnRyb2wgKEdDUllDVExfRk9SQ0VfRklQU19NT0RFLCAwKTsKKyAgICAgICAgfQorICAgIH0gICAgICAgICAgCisKKyAgZ2NyeV9jb250cm9sIChHQ1JZQ1RMX1NFVF9WRVJCT1NJVFksIChpbnQpdmVyYm9zZSk7CisKKyAgaWYgKCFnY3J5X2NoZWNrX3ZlcnNpb24gKEdDUllQVF9WRVJTSU9OKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsIFBHTSAiOiB2ZXJzaW9uIG1pc21hdGNoXG4iKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBpZiAoZ2NyeV9maXBzX21vZGVfYWN0aXZlICgpKQorICAgIGluX2ZpcHNfbW9kZSA9IDE7CisgIGVsc2UKKyAgICBnY3J5X2NvbnRyb2wgKEdDUllDVExfRElTQUJMRV9TRUNNRU0sIDApOworCisgIGlmICh1c2VfcmFuZG9tX2RhZW1vbikKKyAgICBnY3J5X2NvbnRyb2wgKEdDUllDVExfVVNFX1JBTkRPTV9EQUVNT04sIDEpOworCisgIGdjcnlfY29udHJvbCAoR0NSWUNUTF9JTklUSUFMSVpBVElPTl9GSU5JU0hFRCwgMCk7CisKKworICBpZiAoY2lwaGVyX3JlcGV0aXRpb25zIDwgMSkKKyAgICBjaXBoZXJfcmVwZXRpdGlvbnMgPSAxOworICAKKyAgaWYgKCAhYXJnYyApCisgICAgeworICAgICAgZ2NyeV9jb250cm9sIChHQ1JZQ1RMX0VOQUJMRV9RVUlDS19SQU5ET00sIDApOworICAgICAgbWRfYmVuY2ggKE5VTEwpOworICAgICAgcHV0Y2hhciAoJ1xuJyk7CisgICAgICBjaXBoZXJfYmVuY2ggKE5VTEwpOworICAgICAgcHV0Y2hhciAoJ1xuJyk7CisgICAgICByc2FfYmVuY2ggKDEwMCwgMSwgbm9fYmxpbmRpbmcpOworICAgICAgZHNhX2JlbmNoICgxMDAsIDApOworICAgICAgZWNjX2JlbmNoICgxMDAsIDApOworICAgICAgcHV0Y2hhciAoJ1xuJyk7CisgICAgICBtcGlfYmVuY2ggKCk7CisgICAgICBwdXRjaGFyICgnXG4nKTsKKyAgICAgIHJhbmRvbV9iZW5jaCAoMCk7CisgICAgfQorICBlbHNlIGlmICggIXN0cmNtcCAoKmFyZ3YsICJyYW5kb20iKSB8fCAhc3RyY21wICgqYXJndiwgInN0cm9uZ3JhbmRvbSIpKQorICAgIHsKKyAgICAgIGlmIChhcmdjID09IDEpCisgICAgICAgIHJhbmRvbV9iZW5jaCAoKCoqYXJndiA9PSAncycpKTsKKyAgICAgIGVsc2UgaWYgKGFyZ2MgPT0gMikKKyAgICAgICAgeworICAgICAgICAgIGdjcnlfY29udHJvbCAoR0NSWUNUTF9TRVRfUkFORE9NX1NFRURfRklMRSwgYXJndlsxXSk7CisgICAgICAgICAgcmFuZG9tX2JlbmNoICgoKiphcmd2ID09ICdzJykpOworICAgICAgICAgIGdjcnlfY29udHJvbCAoR0NSWUNUTF9VUERBVEVfUkFORE9NX1NFRURfRklMRSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgZnB1dHMgKCJ1c2FnZTogYmVuY2htYXJrIFtzdHJvbmddcmFuZG9tIFtzZWVkZmlsZV1cbiIsIHN0ZG91dCk7CisgICAgfQorICBlbHNlIGlmICggIXN0cmNtcCAoKmFyZ3YsICJtZCIpKQorICAgIHsKKyAgICAgIGlmIChhcmdjID09IDEpCisgICAgICAgIG1kX2JlbmNoIChOVUxMKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZm9yIChhcmdjLS0sIGFyZ3YrKzsgYXJnYzsgYXJnYy0tLCBhcmd2KyspCisgICAgICAgICAgbWRfYmVuY2ggKCAqYXJndiApOworICAgIH0KKyAgZWxzZSBpZiAoICFzdHJjbXAgKCphcmd2LCAiY2lwaGVyIikpCisgICAgeworICAgICAgaWYgKGFyZ2MgPT0gMSkKKyAgICAgICAgY2lwaGVyX2JlbmNoIChOVUxMKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZm9yIChhcmdjLS0sIGFyZ3YrKzsgYXJnYzsgYXJnYy0tLCBhcmd2KyspCisgICAgICAgICAgY2lwaGVyX2JlbmNoICggKmFyZ3YgKTsKKyAgICB9CisgIGVsc2UgaWYgKCAhc3RyY21wICgqYXJndiwgIm1waSIpKQorICAgIHsKKyAgICAgICAgbXBpX2JlbmNoICgpOworICAgIH0KKyAgZWxzZSBpZiAoICFzdHJjbXAgKCphcmd2LCAicnNhIikpCisgICAgeworICAgICAgICBnY3J5X2NvbnRyb2wgKEdDUllDVExfRU5BQkxFX1FVSUNLX1JBTkRPTSwgMCk7CisgICAgICAgIHJzYV9iZW5jaCAoMTAwLCAxLCBub19ibGluZGluZyk7CisgICAgfQorICBlbHNlIGlmICggIXN0cmNtcCAoKmFyZ3YsICJkc2EiKSkKKyAgICB7CisgICAgICAgIGdjcnlfY29udHJvbCAoR0NSWUNUTF9FTkFCTEVfUVVJQ0tfUkFORE9NLCAwKTsKKyAgICAgICAgZHNhX2JlbmNoICgxMDAsIDEpOworICAgIH0KKyAgZWxzZSBpZiAoICFzdHJjbXAgKCphcmd2LCAiZWNjIikpCisgICAgeworICAgICAgICBnY3J5X2NvbnRyb2wgKEdDUllDVExfRU5BQkxFX1FVSUNLX1JBTkRPTSwgMCk7CisgICAgICAgIGVjY19iZW5jaCAoMTAwLCAxKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsIFBHTSAiOiBiYWQgYXJndW1lbnRzXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworCisgIGlmIChpbl9maXBzX21vZGUgJiYgIWdjcnlfZmlwc19tb2RlX2FjdGl2ZSAoKSkKKyAgICBmcHJpbnRmIChzdGRlcnIsIFBHTSAiOiBGSVBTIG1vZGUgaXMgbm90IGFueW1vcmUgYWN0aXZlXG4iKTsKKyAgCisgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvdGVzdHMvY2F2c19kcml2ZXIucGwgYi9saWJnY3J5cHQtMS40LjYvdGVzdHMvY2F2c19kcml2ZXIucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzExMWYwZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi90ZXN0cy9jYXZzX2RyaXZlci5wbApAQCAtMCwwICsxLDIyNDMgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKyMKKyMgJElkOiBjYXZzX2RyaXZlci5wbCAxNDk3IDIwMDktMDEtMjIgMTQ6MDE6MjlaIHNtdWVsbGVyICQKKyMKKyMgQ0FWUyB0ZXN0IGRyaXZlciAoYmFzZWQgb24gdGhlIE9wZW5TU0wgZHJpdmVyKQorIyBXcml0dGVuIGJ5OiBTdGVwaGFuIE3DvGxsZXIgPHNtQGF0c2VjLmNvbT4KKyMgQ29weXJpZ2h0IChjKSBhdHNlYyBpbmZvcm1hdGlvbiBzZWN1cml0eSBjb3Jwb3JhdGlvbgorIworIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisjIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisjIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorIyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCisjCisjIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisjIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorIworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOTyBXQVJSQU5UWQorIworIyAgICBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQorIyAgICBGT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4KKyMgICAgT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUworIyAgICBQUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAorIyAgICBPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorIyAgICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTCisjICAgIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKKyMgICAgUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsCisjICAgIFJFUEFJUiBPUiBDT1JSRUNUSU9OLgorIworIyAgICBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKKyMgICAgV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgorIyAgICBSRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLAorIyAgICBJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKKyMgICAgT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAorIyAgICBUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkKKyMgICAgWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKKyMgICAgUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCisjICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyMKKyMKKyMgdGVzdCBleGVjdXRpb24gaW5zdHJ1Y3Rpb246CisjIDEuIGdldCB0aGUgcmVxdWVzdCBmaWxlcyBmcm9tIHRoZSBsYWIKKyMgMi4gY2FsbCBlYWNoIHJlcXVlc3QgZmlsZSBmcm9tIDEuIHdpdGggdGhpcyBwcm9ncmFtOgorIwkkMCA8RklMRT4ucmVwCisjIDMuIHNlbmQgdGhlIHJlc3VsdGluZyBmaWxlIDxGSUxFPi5yc3AgdG8gdGhlIGxhYgorIworIworIyBUZXN0IHNob3VsZCBiZSBlYXNpbHkgYWRvcHRhYmxlIHRvIG90aGVyIGltcGxlbWVudGF0aW9ucworIyBTZWUgdGhlIGZpcnN0IGZ1bmN0aW9ucyBmb3IgdGhpcyB0YXNrCisjCisjIEZvbGxvd2luZyB0ZXN0cyBhcmUgY292ZXJlZCAob3RoZXJzIG1heSBhbHNvIGJlIGNvdmVyZWQKKyMgYnV0IGhhdmUgbm90IGJlZW4gdGVzdGVkKQorIworIyBBRVMKKyMJW0NCQ3xDRkIxMjh8RUNCfE9GQl1HRlNib3hbMTI4fDE5MnwyNTZdCisjCVtDQkN8Q0ZCMTI4fEVDQnxPRkJdTUNUWzEyOHwxOTJ8MjU2XQorIwlbQ0JDfENGQjEyOHxFQ0J8T0ZCXVZhcktleVsxMjh8MTkyfDI1Nl0KKyMJW0NCQ3xDRkIxMjh8RUNCfE9GQl1LZXlTYm94WzEyOHwxOTJ8MjU2XQorIwlbQ0JDfENGQjEyOHxFQ0J8T0ZCXU1NVFsxMjh8MTkyfDI1Nl0KKyMJW0NCQ3xDRkIxMjh8RUNCfE9GQl1WYXJUeHRbMTI4fDE5MnwyNTZdCisjCisjIFJTQQorIwlTaWdHZW5bMTV8UlNBXQorIwlTaWdWZXIxNQorIwkoU2lnVmVyUlNBIGlzIG5vdCBhcHBsaWNhYmxlIGZvciBPcGVuU1NMIGFzIFg5LjMxIHBhZGRpbmcKKyMJCWlzIG5vdCBkb25lIHRocm91Z2ggb3BlbnNzbCBkZ3N0KQorIwlLZXlHZW4gUlNBIFg5LjMxCisjCisjIFNIQQorIwlTSEFbMXwyMjR8MjU2fDM4NHw1MTJdU2hvcnRNc2cKKyMJU0hBWzF8MjI0fDI1NnwzODR8NTEyXUxvbmdNc2cKKyMJU0hBWzF8MjI0fDI1NnwzODR8NTEyXU1vbnRlCisjCisjIEhNQUMgKFNIQSAtIGNhdmVhdDogd2Ugb25seSBzdXBwb3J0IGhhc2ggb3V0cHV0IGVxdWFsIHRvIHRoZSBibG9jayBzaXplIG9mCisjIAlvZiB0aGUgaGFzaCAtIHdlIGRvIG5vdCBzdXBwb3J0IHRydW5jYXRpb24gb2YgdGhlIGhhc2g7IHRvIHN1cHBvcnQKKyMgCXRoYXQsIHdlIGZpcnN0IG5lZWQgdG8gZGVjaXBoZXIgdGhlIEhNQUMucmVxIGZpbGUgLSBzZWUgaG1hY19rYXQoKSApCisjIAlITUFDCisjCisjIFRERVMKKyMJVFtDQkN8Q0ZCPz98RUNCfE9GQl1Nb250ZVsxfDJ8M10KKyMJVFtDQkN8Q0ZCPz98RUNCfE9GQl1wZXJtb3AKKyMJVFtDQkN8Q0ZCPz98RUNCfE9GQl1NTVRbMXwyfDNdCisjCVRbQ0JDfENGQj8/fEVDQnxPRkJdc3VidGFiCisjCVRbQ0JDfENGQj8/fEVDQnxPRkJddmFya2V5CisjCVRbQ0JDfENGQj8/fEVDQnxPRkJdaW52cGVybQorIwlUW0NCQ3xDRkI/P3xFQ0J8T0ZCXXZhcnRleHQKKyMKKyMgQU5TSSBYOS4zMSBSTkcKKyMgCUFOU0k5MzFfQUVTMTI4TUNUCisjIAlBTlNJOTMxX0FFUzEyOFZTVAorIworIyBEU0EKKyMgCVBRR0dlbgorIyAJU2lnR2VuCisjIAlTaWdWZXIKKyMKKyMgUkM0IChhdHNlYyBkZXZlbG9wZWQgdGVzdHMpCisjIAlSQzRLZXlCRAorIyAJUkM0TUNUCisjIAlSQzRQbHRCRAorIyAJUkM0UkVHVAorIworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOwordXNlIElQQzo6T3BlbjI7Cit1c2UgR2V0b3B0OjpTdGQ7Cit1c2UgTUlNRTo6QmFzZTY0OworCisjIENvbnRhaW5zIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucworbXkgJW9wdDsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIENlbnRyYWwgaW50ZXJmYWNlIGZ1bmN0aW9ucyB0byB0aGUgZXh0ZXJuYWwgY2lwaGVycyAjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBPbmx5IHRoZXNlIGludGVyZmFjZSByb3V0aW5lcyBzaG91bGQgYmUgY2hhbmdlZCBpbiBjYXNlIG9mCisjIHBvcnRpbmcgdG8gYSBuZXcgY2lwaGVyIGxpYnJhcnkKKyMKKyMgRm9yIHBvcnRpbmcgdG8gYSBuZXcgbGlicmFyeSwgY3JlYXRlIGltcGxlbWVudGF0aW9uIG9mIHRoZXNlIGZ1bmN0aW9ucworIyBhbmQgdGhlbiBhZGQgcG9pbnRlcnMgdG8gdGhlIHJlc3BlY3RpdmUgaW1wbGVtZW50YXRpb24gb2YgZWFjaAorIyBmdW5jdGlvbiB0byB0aGUgZ2l2ZW4gdmFyaWFibGVzLgorCisjIGNvbW1vbiBlbmNyeXB0aW9uL2RlY3J5cHRpb24gcm91dGluZQorIyAkMSBrZXkgaW4gaGV4IGZvcm0gKHBsZWFzZSBub3RlIGZvciAzREVTOiBldmVuIHdoZW4gZWRlMyBmb3IgdGhyZWUKKyMgICAgaW5kZXBlbmRlbnQgY2lwaGVycyBpcyBnaXZlbiB3aXRoIHRoZSBjaXBoZXIgc3BlY2lmaWNhdGlvbiwgd2UgaGFuZCBpbgorIyAgICBlaXRoZXIgb25lIGtleSBmb3IgazEgPSBrMiA9IGszLCB0d28ga2V5cyB3aGljaCBhcmUgY29uY2F0aW5hdGVkIGZvcgorIyAgICBrMSA9IGszLCBrMiBpbmRlcGVuZGVudCwgb3IgdGhyZWUga2V5cyB3aGljaCBhcmUgY29uY2F0aW5hdGVkIGZvcgorIyAgICBrMSwgazIsIGszIGluZGVwZW5kZW50KQorIyAkMiBpdiBpbiBoZXggZm9ybQorIyAkMyBjaXBoZXIgLSB0aGUgY2lwaGVyIHN0cmluZyBpcyBkZWZpbmVkIGFzIHNwZWNpZmllZCBpbiB0aGUgb3BlbnNzbAorIyAgICBlbmMoMXNzbCkgc3BlY2lmaWNhdGlvbiBmb3IgdGhlIG9wdGlvbiAiLWNpcGhlcm5hbWUiCisjICAgIChlLmcuIGFlcy0xMjgtY2JjIG9yIGRlcy1lZGUzLWNiYykKKyMgJDQgZW5jcnlwdD0xL2RlY3J5cHQ9MAorIyAkNSBkZS9lbmNyeXB0ZWQgZGF0YSBpbiBoZXggZm9ybQorIyByZXR1cm4gZW4vZGVjcnlwdGVkIGRhdGEgaW4gaGV4IGZvcm0KK215ICRlbmNkZWM7CisKKyMKKyMgRGVyaXZlIGFuIFJTQSBrZXkgZnJvbSB0aGUgZ2l2ZW4gWDkuMzEgcGFyYW1ldGVycy4KKyMgJDE6IG1vZHVsdXMgc2l6ZQorIyAkMjogRSAgIGluIGhleCBmb3JtCisjICQzOiBYcDEgaW4gaGV4IGZvcm0KKyMgJDQ6IFhwMiBpbiBoZXggZm9ybQorIyAkNTogWHAgIGluIGhleCBmb3JtCisjICQ2OiBYcTEgaW4gaGV4IGZvcm0KKyMgJDc6IFhxMiBpbiBoZXggZm9ybQorIyAkODogWHEgIGluIGhleCBmb3JtCisjIHJldHVybjogc3RyaW5nIHdpdGggdGhlIGNhbGN1bGF0ZWQgdmFsdWVzIGluIGhleCBmb3JtYXQsIHdoZXJlIGVhY2ggdmFsdWUKKyMgICAgICAgIGlzIHNlcGFyYXRlZCBmcm9tIHRoZSBwcmV2aW91cyB3aXRoIGEgXG4gaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKKyMgICAgICAgICBQXG4KKyMgICAgICAgICBRXG4KKyMgICAgICAgICBOXG4KKyMgICAgICAgICBEXG4KK215ICRyc2FfZGVyaXZlOworCisjIFNpZ24gYSBtZXNzYWdlIHdpdGggUlNBCisjICQxOiBkYXRhIHRvIGJlIHNpZ25lZCBpbiBoZXggZm9ybQorIyAkMjogSGFzaCBhbGdvCisjICQzOiBLZXkgZmlsZSBpbiBQRU0gZm9ybWF0IHdpdGggdGhlIHByaXZhdGUga2V5CisjIHJldHVybjogZGlnZXN0IGluIGhleCBmb3JtYXQKK215ICRyc2Ffc2lnbjsKKworIyBWZXJpZnkgYSBtZXNzYWdlIHdpdGggUlNBCisjICQxOiBkYXRhIHRvIGJlIHZlcmlmaWVkIGluIGhleCBmb3JtCisjICQyOiBoYXNoIGFsZ28KKyMgJDM6IGZpbGUgaG9sZGluZyB0aGUgcHVibGljIFJTQSBrZXkgaW4gUEVNIGZvcm1hdAorIyAkNDogZmlsZSBob2xkaW5nIHRoZSBzaWduYXR1cmUgaW4gYmluYXJ5IGZvcm0KKyMgcmV0dXJuOiAxID09IHZlcmlmaWVkIC8gMCA9PSBub3QgdmVyaWZpZWQKK215ICRyc2FfdmVyaWZ5OworCisjIGdlbmVyYXRlIGEgbmV3IHByaXZhdGUgUlNBIGtleSB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKyMgCWV4cG9uZW50IGlzIDY1NTM3CisjCVBFTSBmb3JtYXQKKyMgJDEga2V5IHNpemUgaW4gYml0CisjICQyIGtleWZpbGUgbmFtZQorIyByZXR1cm46IG5vdGhpbmcsIGJ1dCBmaWxlIGNyZWF0ZWQKK215ICRnZW5fcnNha2V5OworCisjIENyZWF0aW5nIGEgaGFzaAorIyAkMTogUGxhaW50ZXh0IGluIGhleCBmb3JtCisjICQyOiBoYXNoIHR5cGUgaW4gdGhlIGZvcm0gZG9jdW1lbnRlZCBpbiBvcGVuc3NsJ3MgZGdzdCgxc3NsKSAtIGUuZy4KKyMgICAgIHNoYTEsIHNoYTIyNCwgc2hhMjU2LCBzaGEzODQsIHNoYTUxMgorIyByZXR1cm46IGhhc2ggaW4gaGV4IGZvcm0KK215ICRoYXNoOworCisjIHN1cHBseWluZyB0aGUgY2FsbCB0byB0aGUgZXh0ZXJuYWwgY2lwaGVyIGltcGxlbWVudGF0aW9uCisjIHRoYXQgaXMgYmVpbmcgdXNlZCB0byBrZWVwIFNURElOIGFuZCBTVERPVVQgb3BlbgorIyB0byBtYWludGFpbiB0aGUgc3RhdGUgb2YgdGhlIGJsb2NrIGNoYWluaW5nCisjICQxOiBjaXBoZXIKKyMgJDI6IDE9ZW5jcnlwdGlvbiwgMD1kZWNyeXB0aW9uCisjICQzOiBidWZmZXJzaXplIG5lZWRlZCBmb3Igb3BlbnNzbAorIyAkNDogZW5jcnlwdGlvbiBrZXkgaW4gYmluYXJ5IGZvcm0KKyMgJDU6IElWIGluIGJpbmFyeSBmb3JtCisjIHJldHVybjogY29tbWFuZCBsaW5lIHRvIGV4ZWN1dGUgdGhlIGFwcGxpY2F0aW9uCitteSAkc3RhdGVfY2lwaGVyOworIyB0aGUgb25seSBkaWZmZXJlbmNlIG9mIHRoZSBERVMgdmVyc2lvbiBpcyB0aGF0IGl0IGltcGxlbWVudHMgdGhlIGlubmVyIGxvb3AKKyMgb2YgdGhlIFRERVMgdGVzdHMKK215ICRzdGF0ZV9jaXBoZXJfZGVzOworCisjIHN1cHBseWluZyB0aGUgY2FsbCB0byB0aGUgZXh0ZXJuYWwgY2lwaGVyIGltcGxlbWVudGF0aW9uCisjIHRoYXQgaXMgYmVpbmcgdXNlZCB0byBrZWVwIFNURElOIGFuZCBTVERPVVQgb3BlbgorIyB0byBtYWludGFpbiB0aGUgc3RhdGUgb2YgdGhlIFJORyB3aXRoIGl0cyBzZWVkCisjCisjIGlucHV0IGhvbGRzIHNlZWQgdmFsdWVzCisjICQxOiBjaXBoZXIga2V5IGluIGhleCBmb3JtYXQKKyMgJDI6IERUIHZhbHVlIGluIGhleCBmb3JtYXQKKyMgJDM6IFYgdmFsdWUgaW4gaGV4IGZvcm1hdAorIworIyByZXR1cm46IGNvbW1hbmQgbGluZSB0byBleGVjdXRlIHRoZSBhcHBsaWNhdGlvbgorIworIyB0aGUgYXBwbGljYXRpb24gaXMgZXhwZWN0ZWQgdG8gZGVsaXZlciByYW5kb20gdmFsdWVzIG9uIFNURE9VVCAtIHRoZSBzY3JpcHQKKyMgcmVhZHMgMTI4IGJpdHMgcmVwZWF0ZWRseSB3aGVyZSB0aGUgc3RhdGUgb2YgdGhlIFJORyBtdXN0IGJlIHJldGFpbmVkCisjIGJldHdlZW4gdGhlIHJlYWRzLiBUaGUgb3V0cHV0IG9mIHRoZSBSTkcgb24gU1RET1VUIGlzIGFzc3VtZWQgdG8gYmUgYmluYXJ5LgorbXkgJHN0YXRlX3JuZzsKKworIyBHZW5lcmF0ZSBhbiBITUFDIGJhc2VkIG9uIFNIQXgKKyMgJDE6IEtleSB0byBiZSB1c2VkIGZvciB0aGUgSE1BQyBpbiBoZXggZm9ybWF0CisjICQyOiBsZW5ndGggb2YgdGhlIGhhc2ggdG8gYmUgY2FsY3VsYXRlZCBpbiBiaXRzCisjICQzOiBNZXNzYWdlIGZvciB3aGljaCB0aGUgSE1BQyBzaGFsbCBiZSBjYWxjdWxhdGVkIGluIGhleCBmb3JtYXQKKyMgJDQ6IGhhc2ggdHlwZSAoMSAtIFNIQTEsIDIyNCAtIFNIQTIyNCwgYW5kIHNvIG9uKQorIyByZXR1cm46IGNhbGN1bGF0ZWQgSE1BQyBpbiBoZXggZm9ybWF0CitteSAkaG1hYzsKKworIworIyBHZW5lcmF0ZSB0aGUgUCwgUSwgRywgU2VlZCwgY291bnRlciwgaCAodmFsdWUgdXNlZCB0byBnZW5lcmF0ZSBnKSB2YWx1ZXMKKyMgZm9yIERTQQorIyAkMTogbW9kdWx1cyBzaXplCisjIHJldHVybjogc3RyaW5nIHdpdGggdGhlIGNhbGN1bGF0ZWQgdmFsdWVzIGluIGhleCBmb3JtYXQsIHdoZXJlIGVhY2ggdmFsdWUKKyMgCSAgaXMgc2VwYXJhdGVkIGZyb20gdGhlIHByZXZpb3VzIHdpdGggYSBcbiBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgorIyAgICAgICAgIFBcbgorIyAgICAgICAgIFFcbgorIyAgICAgICAgIEdcbgorIyAgICAgICAgIFNlZWRcbgorIyAgICAgICAgIGNvdW50ZXJcbgorIyAgICAgICAgIGgKK215ICRkc2FfcHFnZ2VuOworCisjCisjIEdlbmVyYXRlIGFuIERTQSBwdWJsaWMga2V5IGZyb20gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnM6CisjICQxOiBOYW1lIG9mIGZpbGUgdG8gY3JlYXRlCisjICQyOiBQIGluIGhleCBmb3JtCisjICQzOiBRIGluIGhleCBmb3JtCisjICQ0OiBHIGluIGhleCBmb3JtCisjICQ1OiBZIGluIGhleCBmb3JtCitteSAkZHNhX2dlbnB1YmtleTsKKworIyBWZXJpZnkgYSBtZXNzYWdlIHdpdGggRFNBCisjICQxOiBkYXRhIHRvIGJlIHZlcmlmaWVkIGluIGhleCBmb3JtCisjICQyOiBmaWxlIGhvbGRpbmcgdGhlIHB1YmxpYyBEU0Ega2V5IGluIFBFTSBmb3JtYXQKKyMgJDM6IFIgdmFsdWUgb2YgdGhlIHNpZ25hdHVyZQorIyAkNDogUyB2YWx1ZSBvZiB0aGUgc2lnbmF0dXJlCisjIHJldHVybjogMSA9PSB2ZXJpZmllZCAvIDAgPT0gbm90IHZlcmlmaWVkCitteSAkZHNhX3ZlcmlmeTsKKworIyBnZW5lcmF0ZSBhIG5ldyBEU0Ega2V5IHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgorIwlQRU0gZm9ybWF0CisjICQxIGtleWZpbGUgbmFtZSAKKyMgcmV0dXJuOiBmaWxlIGNyZWF0ZWQsIGhhc2ggd2l0aCBrZXlzIG9mIFAsIFEsIEcgaW4gaGV4IGZvcm1hdAorbXkgJGdlbl9kc2FrZXk7CisKKyMgU2lnbiBhIG1lc3NhZ2Ugd2l0aCBEU0EKKyMgJDE6IGRhdGEgdG8gYmUgc2lnbmVkIGluIGhleCBmb3JtCisjICQyOiBLZXkgZmlsZSBpbiBQRU0gZm9ybWF0IHdpdGggdGhlIHByaXZhdGUga2V5CisjIHJldHVybjogaGFzaCBvZiBkaWdlc3QgaW5mb3JtYXRpb24gaW4gaGV4IGZvcm1hdCB3aXRoIFksIFIsIFMgYXMga2V5cworbXkgJGRzYV9zaWduOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyBPcGVuU1NMIGludGVyZmFjZSBmdW5jdGlvbnMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3N1YiBvcGVuc3NsX2VuY2RlYygkJCQkJCkgeworCW15ICRrZXk9c2hpZnQ7CisJbXkgJGl2PXNoaWZ0OworCW15ICRjaXBoZXI9c2hpZnQ7CisJbXkgJGVuYyA9IChzaGlmdCkgPyAiLWUiIDogIi1kIjsKKwlteSAkZGF0YT1zaGlmdDsKKworCSMgV2Ugb25seSBpbnZva2UgdGhlIGRyaXZlciB3aXRoIHRoZSBJViBwYXJhbWV0ZXIsIGlmIHdlIGhhdmUKKwkjIGFuIElWLCBvdGhlcndpc2UsIHdlIHNraXAgaXQKKwkkaXYgPSAiLWl2ICRpdiIgaWYgKCRpdik7CisKKwkkZGF0YT1oZXgyYmluKCRkYXRhKTsKKwlteSAkcHJvZ3JhbT0ib3BlbnNzbCBlbmMgLSRjaXBoZXIgLW5vcGFkIC1ub3NhbHQgLUsgJGtleSAkZW5jICRpdiI7CisJJHByb2dyYW0gPSAicmM0IC1rICRrZXkiIGlmICRvcHR7J1InfTsgI2ZvciBBUkNGT1VSLCBubyBJViBtdXN0IGJlIGdpdmVuCisJJGRhdGE9cGlwZV90aHJvdWdoX3Byb2dyYW0oJGRhdGEsJHByb2dyYW0pOworCXJldHVybiBiaW4yaGV4KCRkYXRhKTsKK30KKworc3ViIG9wZW5zc2xfcnNhX3NpZ24oJCQkKSB7CisJbXkgJGRhdGEgPSBzaGlmdDsKKwlteSAkY2lwaGVyID0gc2hpZnQ7CisJbXkgJGtleWZpbGUgPSBzaGlmdDsKKworCSRkYXRhPWhleDJiaW4oJGRhdGEpOworCWRpZSAiQVJDRk9VUiBub3QgYXZhaWxhYmxlIGZvciBSU0EiIGlmICRvcHR7J1InfTsKKwkkZGF0YT1waXBlX3Rocm91Z2hfcHJvZ3JhbSgkZGF0YSwKKwkJIm9wZW5zc2wgZGdzdCAtJGNpcGhlciAtYmluYXJ5IC1zaWduICRrZXlmaWxlIik7CisJcmV0dXJuIGJpbjJoZXgoJGRhdGEpOworfQorCitzdWIgb3BlbnNzbF9yc2FfdmVyaWZ5KCQkJCQpIHsKKwlteSAkZGF0YSA9IHNoaWZ0OworCW15ICRjaXBoZXIgPSBzaGlmdDsKKwlteSAka2V5ZmlsZSA9IHNoaWZ0OworCW15ICRzaWdmaWxlID0gc2hpZnQ7CisKKwkkZGF0YSA9IGhleDJiaW4oJGRhdGEpOworCWRpZSAiQVJDRk9VUiBub3QgYXZhaWxhYmxlIGZvciBSU0EiIGlmICRvcHR7J1InfTsKKwkkZGF0YSA9IHBpcGVfdGhyb3VnaF9wcm9ncmFtKCRkYXRhLAorCQkib3BlbnNzbCBkZ3N0IC0kY2lwaGVyIC1iaW5hcnkgLXZlcmlmeSAka2V5ZmlsZSAtc2lnbmF0dXJlICRzaWdmaWxlIik7CisKKwkjIFBhcnNlIHRocm91Z2ggdGhlIE9wZW5TU0wgb3V0cHV0IGluZm9ybWF0aW9uCisJcmV0dXJuICgkZGF0YSA9fiAvT0svKTsKK30KKworc3ViIG9wZW5zc2xfZ2VuX3JzYWtleSgkJCkgeworCW15ICRrZXlsZW4gPSBzaGlmdDsKKwlteSAkZmlsZSA9IHNoaWZ0OworCisJZGllICJBUkNGT1VSIG5vdCBhdmFpbGFibGUgZm9yIFJTQSIgaWYgJG9wdHsnUid9OworCSMgZ2VuZXJhdGluZyBvZiBhIGtleSB3aXRoIGV4cG9uZW50IDB4MTAwMDEKKwlteSBAYXJncyA9ICgib3BlbnNzbCIsICJnZW5yc2EiLCAiLUY0IiwgIi1vdXQiLCAiJGZpbGUiLCAiJGtleWxlbiIpOworICAgICAgICBzeXN0ZW0oQGFyZ3MpID09IDAKKwkJb3IgZGllICJzeXN0ZW0gQGFyZ3MgZmFpbGVkOiAkPyI7CisJZGllICJzeXN0ZW0gQGFyZ3MgZmFpbGVkOiBmaWxlICRmaWxlIG5vdCBjcmVhdGVkIiBpZiAoISAtZiAkZmlsZSk7Cit9CisKK3N1YiBvcGVuc3NsX2hhc2goJCQpIHsKKwlteSAkcHQgPSBzaGlmdDsKKwlteSAkY2lwaGVyID0gc2hpZnQ7CisKKwlkaWUgIkFSQ0ZPVVIgbm90IGF2YWlsYWJsZSBmb3IgaGFzaGVzIiBpZiAkb3B0eydSJ307CisJbXkgJGhhc2ggPSBoZXgyYmluKCRwdCk7CisJI2JpbjJoZXggbm90IG5lZWRlZCBhcyB0aGUgJy1oZXgnIGFscmVhZHkgY29udmVydHMgaXQKKwlyZXR1cm4gcGlwZV90aHJvdWdoX3Byb2dyYW0oJGhhc2gsICJvcGVuc3NsIGRnc3QgLSRjaXBoZXIgLWhleCIpOworfQorCitzdWIgb3BlbnNzbF9zdGF0ZV9jaXBoZXIoJCQkJCQpIHsKKwlteSAkY2lwaGVyID0gc2hpZnQ7CisJbXkgJGVuY2RlYyA9IHNoaWZ0OworCW15ICRidWZzaXplID0gc2hpZnQ7CisJbXkgJGtleSA9IHNoaWZ0OworCW15ICRpdiA9IHNoaWZ0OworCisJbXkgJGVuYyA9ICRlbmNkZWMgPyAiLWUiOiAiLWQiOworCisJIyBXZSBvbmx5IGludm9rZSB0aGUgZHJpdmVyIHdpdGggdGhlIElWIHBhcmFtZXRlciwgaWYgd2UgaGF2ZQorCSMgYW4gSVYsIG90aGVyd2lzZSwgd2Ugc2tpcCBpdAorCSRpdiA9ICItaXYgIi5iaW4yaGV4KCRpdikgaWYgKCRpdik7CisKKwlteSAkb3V0ID0gIm9wZW5zc2wgZW5jIC0nJGNpcGhlcicgJGVuYyAtbm9wYWQgLW5vc2FsdCAtYnVmc2l6ZSAkYnVmc2l6ZSAtSyAiLmJpbjJoZXgoJGtleSkuIiAkaXYiOworCSNmb3IgQVJDRk9VUiwgbm8gSVYgbXVzdCBiZSBnaXZlbgorCSRvdXQgPSAicmM0IC1rICIgLiBiaW4yaGV4KCRrZXkpIGlmICRvcHR7J1InfTsKKwlyZXR1cm4gJG91dDsKK30KKworIyMjIyMjIEVuZCBvZiBPcGVuU1NMIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiAjIyMjIyMjIyMjIyMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyBsaWJnY3J5cHQgaW1wbGVtZW50YXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzdWIgbGliZ2NyeXB0X2VuY2RlYygkJCQkJCkgeworCW15ICRrZXk9c2hpZnQ7CisJbXkgJGl2PXNoaWZ0OworCW15ICRjaXBoZXI9c2hpZnQ7CisJbXkgJGVuYyA9IChzaGlmdCkgPyAiZW5jcnlwdCIgOiAiZGVjcnlwdCI7CisJbXkgJGRhdGE9c2hpZnQ7CisKKwkjIFdlIG9ubHkgaW52b2tlIHRoZSBkcml2ZXIgd2l0aCB0aGUgSVYgcGFyYW1ldGVyLCBpZiB3ZSBoYXZlCisJIyBhbiBJViwgb3RoZXJ3aXNlLCB3ZSBza2lwIGl0CisJJGl2ID0gIi0taXYgJGl2IiBpZiAoJGl2KTsKKworCW15ICRwcm9ncmFtPSJmaXBzZHJ2IC0ta2V5ICRrZXkgJGl2IC0tYWxnbyAkY2lwaGVyICRlbmMiOworCisJcmV0dXJuIHBpcGVfdGhyb3VnaF9wcm9ncmFtKCRkYXRhLCRwcm9ncmFtKTsKKworfQorCitzdWIgbGliZ2NyeXB0X3JzYV9kZXJpdmUoJCQkJCQkJCQpIHsKKwlteSAkbiAgID0gc2hpZnQ7CisJbXkgJGUgICA9IHNoaWZ0OworCW15ICR4cDEgPSBzaGlmdDsKKwlteSAkeHAyID0gc2hpZnQ7CisJbXkgJHhwICA9IHNoaWZ0OworCW15ICR4cTEgPSBzaGlmdDsKKwlteSAkeHEyID0gc2hpZnQ7CisJbXkgJHhxICA9IHNoaWZ0OworCW15ICRzZXhwOworCW15IEB0bXA7CisKKwkkbiA9IHNwcmludGYgKCIldSIsICRuKTsKKwkkZSA9IHNwcmludGYgKCIldSIsIGhleCgkZSkpOworCSRzZXhwID0gIihnZW5rZXkocnNhKG5iaXRzICIgLiBzcHJpbnRmICgiJXU6JXMiLCBsZW5ndGgoJG4pLCAkbikgLiAiKSIKKwkJLiAiKHJzYS11c2UtZSAiIC4gc3ByaW50ZiAoIiV1OiVzIiwgbGVuZ3RoKCRlKSwgJGUpIC4gIikiCisJCS4gIihkZXJpdmUtcGFybXMiCisJCS4gIihYcDEgIyR4cDEjKSIKKwkJLiAiKFhwMiAjJHhwMiMpIgorCQkuICIoWHAgICMkeHAjKSIKKwkJLiAiKFhxMSAjJHhxMSMpIgorCQkuICIoWHEyICMkeHEyIykiCisJCS4gIihYcSAgIyR4cSMpKSkpXG4iOworCisJcmV0dXJuIHBpcGVfdGhyb3VnaF9wcm9ncmFtKCRzZXhwLCAiZmlwc2RydiByc2EtZGVyaXZlIik7Cit9CisKKworc3ViIGxpYmdjcnlwdF9yc2Ffc2lnbigkJCQpIHsKKwlteSAkZGF0YSA9IHNoaWZ0OworCW15ICRoYXNoYWxnbyA9IHNoaWZ0OworCW15ICRrZXlmaWxlID0gc2hpZnQ7CisKKwlkaWUgIkFSQ0ZPVVIgbm90IGF2YWlsYWJsZSBmb3IgUlNBIiBpZiAkb3B0eydSJ307CisKKwlyZXR1cm4gcGlwZV90aHJvdWdoX3Byb2dyYW0oJGRhdGEsCisJCSJmaXBzZHJ2IC0tcGtjczEgLS1hbGdvICRoYXNoYWxnbyAtLWtleSAka2V5ZmlsZSByc2Etc2lnbiIpOworfQorCitzdWIgbGliZ2NyeXB0X3JzYV92ZXJpZnkoJCQkJCkgeworCW15ICRkYXRhID0gc2hpZnQ7CisJbXkgJGhhc2hhbGdvID0gc2hpZnQ7CisJbXkgJGtleWZpbGUgPSBzaGlmdDsKKwlteSAkc2lnZmlsZSA9IHNoaWZ0OworCisJZGllICJBUkNGT1VSIG5vdCBhdmFpbGFibGUgZm9yIFJTQSIgaWYgJG9wdHsnUid9OworCSRkYXRhID0gcGlwZV90aHJvdWdoX3Byb2dyYW0oJGRhdGEsCisJCSJmaXBzZHJ2IC0tcGtjczEgLS1hbGdvICRoYXNoYWxnbyAtLWtleSAka2V5ZmlsZSAtLXNpZ25hdHVyZSAkc2lnZmlsZSByc2EtdmVyaWZ5Iik7CisKKwkjIFBhcnNlIHRocm91Z2ggdGhlIG91dHB1dCBpbmZvcm1hdGlvbgorCXJldHVybiAoJGRhdGEgPX4gL0dPT0Qgc2lnbmF0dXJlLyk7Cit9CisKK3N1YiBsaWJnY3J5cHRfZ2VuX3JzYWtleSgkJCkgeworCW15ICRrZXlsZW4gPSBzaGlmdDsKKwlteSAkZmlsZSA9IHNoaWZ0OworCisJZGllICJBUkNGT1VSIG5vdCBhdmFpbGFibGUgZm9yIFJTQSIgaWYgJG9wdHsnUid9OworCW15IEBhcmdzID0gKCJmaXBzZHJ2IC0ta2V5c2l6ZSAka2V5bGVuIHJzYS1nZW4gPiAkZmlsZSIpOworCXN5c3RlbShAYXJncykgPT0gMAorCQlvciBkaWUgInN5c3RlbSBAYXJncyBmYWlsZWQ6ICQ/IjsKKwlkaWUgInN5c3RlbSBAYXJncyBmYWlsZWQ6IGZpbGUgJGZpbGUgbm90IGNyZWF0ZWQiIGlmICghIC1mICRmaWxlKTsKK30KKworc3ViIGxpYmdjcnlwdF9oYXNoKCQkKSB7CisJbXkgJHB0ID0gc2hpZnQ7CisJbXkgJGhhc2hhbGdvID0gc2hpZnQ7CisKKwlteSAkcHJvZ3JhbSA9ICJmaXBzZHJ2IC0tYWxnbyAkaGFzaGFsZ28gZGlnZXN0IjsKKwlkaWUgIkFSQ0ZPVVIgbm90IGF2YWlsYWJsZSBmb3IgaGFzaGVzIiBpZiAkb3B0eydSJ307CisKKwlyZXR1cm4gcGlwZV90aHJvdWdoX3Byb2dyYW0oJHB0LCAkcHJvZ3JhbSk7Cit9CisKK3N1YiBsaWJnY3J5cHRfc3RhdGVfY2lwaGVyKCQkJCQkKSB7CisJbXkgJGNpcGhlciA9IHNoaWZ0OworCW15ICRlbmMgPSAoc2hpZnQpID8gImVuY3J5cHQiOiAiZGVjcnlwdCI7CisJbXkgJGJ1ZnNpemUgPSBzaGlmdDsKKwlteSAka2V5ID0gc2hpZnQ7CisJbXkgJGl2ID0gc2hpZnQ7CisKKwkjIFdlIG9ubHkgaW52b2tlIHRoZSBkcml2ZXIgd2l0aCB0aGUgSVYgcGFyYW1ldGVyLCBpZiB3ZSBoYXZlCisJIyBhbiBJViwgb3RoZXJ3aXNlLCB3ZSBza2lwIGl0CisJJGl2ID0gIi0taXYgIi5iaW4yaGV4KCRpdikgaWYgKCRpdik7CisKKwlteSAkcHJvZ3JhbT0iZmlwc2RydiAtLWJpbmFyeSAtLWtleSAiLmJpbjJoZXgoJGtleSkuIiAkaXYgLS1hbGdvICckY2lwaGVyJyAtLWNodW5rICckYnVmc2l6ZScgJGVuYyI7CisKKwlyZXR1cm4gJHByb2dyYW07Cit9CisKK3N1YiBsaWJnY3J5cHRfc3RhdGVfY2lwaGVyX2RlcygkJCQkJCkgeworCW15ICRjaXBoZXIgPSBzaGlmdDsKKwlteSAkZW5jID0gKHNoaWZ0KSA/ICJlbmNyeXB0IjogImRlY3J5cHQiOworCW15ICRidWZzaXplID0gc2hpZnQ7CisJbXkgJGtleSA9IHNoaWZ0OworCW15ICRpdiA9IHNoaWZ0OworCisJIyBXZSBvbmx5IGludm9rZSB0aGUgZHJpdmVyIHdpdGggdGhlIElWIHBhcmFtZXRlciwgaWYgd2UgaGF2ZQorCSMgYW4gSVYsIG90aGVyd2lzZSwgd2Ugc2tpcCBpdAorCSRpdiA9ICItLWl2ICIuYmluMmhleCgkaXYpIGlmICgkaXYpOworCisJbXkgJHByb2dyYW09ImZpcHNkcnYgLS1hbGdvICckY2lwaGVyJyAtLW1jdC1zZXJ2ZXIgJGVuYyI7CisKKwlyZXR1cm4gJHByb2dyYW07Cit9CisKK3N1YiBsaWJnY3J5cHRfc3RhdGVfcm5nKCQkJCkgeworCW15ICRrZXkgPSBzaGlmdDsKKwlteSAkZHQgPSBzaGlmdDsKKwlteSAkdiA9IHNoaWZ0OworCisJcmV0dXJuICJmaXBzZHJ2IC0tYmluYXJ5IC0tbG9vcCAtLWtleSAka2V5IC0taXYgJHYgLS1kdCAkZHQgcmFuZG9tIjsKK30KKworc3ViIGxpYmdjcnlwdF9obWFjKCQkJCQpIHsKKwlteSAka2V5ID0gc2hpZnQ7CisJbXkgJG1hY2xlbiA9IHNoaWZ0OworCW15ICRtc2cgPSBzaGlmdDsKKwlteSAkaGFzaHR5cGUgPSBzaGlmdDsKKworCW15ICRwcm9ncmFtID0gImZpcHNkcnYgLS1rZXkgJGtleSAtLWFsZ28gJGhhc2h0eXBlIGhtYWMtc2hhIjsKKwlyZXR1cm4gcGlwZV90aHJvdWdoX3Byb2dyYW0oJG1zZywgJHByb2dyYW0pOwkKK30KKworc3ViIGxpYmdjcnlwdF9kc2FfcHFnZ2VuKCQpIHsKKwlteSAkbW9kID0gc2hpZnQ7CisKKwlteSAkcHJvZ3JhbSA9ICJmaXBzZHJ2IC0ta2V5c2l6ZSAkbW9kIGRzYS1wcWctZ2VuIjsKKwlyZXR1cm4gcGlwZV90aHJvdWdoX3Byb2dyYW0oIiIsICRwcm9ncmFtKTsKK30KKworc3ViIGxpYmdjcnlwdF9nZW5fZHNha2V5KCQpIHsKKwlteSAkZmlsZSA9IHNoaWZ0OworCisJbXkgJHByb2dyYW0gPSAiZmlwc2RydiAtLWtleXNpemUgMTAyNCAtLWtleSAkZmlsZSBkc2EtZ2VuIjsKKwlteSAkdG1wOworCW15ICVyZXQ7CisKKwlkaWUgIkFSQ0ZPVVIgbm90IGF2YWlsYWJsZSBmb3IgRFNBIiBpZiAkb3B0eydSJ307CisKKwkkdG1wID0gcGlwZV90aHJvdWdoX3Byb2dyYW0oIiIsICRwcm9ncmFtKTsKKwlkaWUgImRzYSBrZXkgZ2VuIGZhaWxlZDogZmlsZSAkZmlsZSBub3QgY3JlYXRlZCIgaWYgKCEgLWYgJGZpbGUpOworCisJQHJldHsnUCcsICdRJywgJ0cnLCAnU2VlZCcsICdjJywgJ0gnfSA9IHNwbGl0KC9cbi8sICR0bXApOworCXJldHVybiAlcmV0OworfQorCitzdWIgbGliZ2NyeXB0X2RzYV9nZW5wdWJrZXkoJCQkJCQpIHsKKwlteSAkZmlsZW5hbWUgPSBzaGlmdDsKKwlteSAkcCA9IHNoaWZ0OworCW15ICRxID0gc2hpZnQ7CisJbXkgJGcgPSBzaGlmdDsKKwlteSAkeSA9IHNoaWZ0OworCisJbXkgJHNleHA7CisKKwkkc2V4cCA9ICIocHVibGljLWtleShkc2EocCAjJHAjKShxICMkcSMpKGcgIyRnIykoeSAjJHkjKSkpIjsKKworCW9wZW4oRkgsICI+IiwgJGZpbGVuYW1lKSBvciBkaWU7CisJcHJpbnQgRkggJHNleHA7CisJY2xvc2UgRkg7Cit9CisKK3N1YiBsaWJnY3J5cHRfZHNhX3NpZ24oJCQpIHsKKwlteSAkZGF0YSA9IHNoaWZ0OworCW15ICRrZXlmaWxlID0gc2hpZnQ7CisJbXkgJHRtcDsKKwlteSAlcmV0OworCisJZGllICJBUkNGT1VSIG5vdCBhdmFpbGFibGUgZm9yIERTQSIgaWYgJG9wdHsnUid9OworCisJJHRtcCA9IHBpcGVfdGhyb3VnaF9wcm9ncmFtKCRkYXRhLCAiZmlwc2RydiAtLWtleSAka2V5ZmlsZSBkc2Etc2lnbiIpOworCUByZXR7J1knLCAnUicsICdTJ30gPSBzcGxpdCgvXG4vLCAkdG1wKTsKKwlyZXR1cm4gJXJldDsKK30KKworc3ViIGxpYmdjcnlwdF9kc2FfdmVyaWZ5KCQkJCQpIHsKKwlteSAkZGF0YSA9IHNoaWZ0OworCW15ICRrZXlmaWxlID0gc2hpZnQ7CisJbXkgJHIgPSBzaGlmdDsKKwlteSAkcyA9IHNoaWZ0OworCisJbXkgJHJldDsKKworCWRpZSAiQVJDRk9VUiBub3QgYXZhaWxhYmxlIGZvciBEU0EiIGlmICRvcHR7J1InfTsKKworCW15ICRzaWdmaWxlID0gIiRrZXlmaWxlLnNpZyI7CisJb3BlbihGSCwgIj4kc2lnZmlsZSIpIG9yIGRpZSAiQ2Fubm90IGNyZWF0ZSBmaWxlICRzaWdmaWxlOiAkPyI7CisJcHJpbnQgRkggIihzaWctdmFsKGRzYShyICMkciMpKHMgIyRzIykpKSI7CisJY2xvc2UgRkg7CisKKwkkcmV0ID0gcGlwZV90aHJvdWdoX3Byb2dyYW0oJGRhdGEsCisJCSJmaXBzZHJ2IC0ta2V5ICRrZXlmaWxlIC0tc2lnbmF0dXJlICRzaWdmaWxlIGRzYS12ZXJpZnkiKTsKKwl1bmxpbmsgKCRzaWdmaWxlKTsKKwkjIFBhcnNlIHRocm91Z2ggdGhlIG91dHB1dCBpbmZvcm1hdGlvbgorCXJldHVybiAoJHJldCA9fiAvR09PRCBzaWduYXR1cmUvKTsKK30KKworIyMjIyMjIyMjIEVuZCBvZiBsaWJnY3J5cHQgaW1wbGVtZW50YXRpb24gIyMjIyMjIyMjIyMjIyMjIworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMgVmVuZG9yMSBpbnRlcmZhY2UgZnVuY3Rpb25zCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK3N1YiB2ZW5kb3IxX2VuY2RlYygkJCQkJCkgeworCW15ICRrZXk9c2hpZnQ7CisJbXkgJGl2PXNoaWZ0OworCW15ICRjaXBoZXI9c2hpZnQ7CisJbXkgJGVuYyA9IChzaGlmdCkgPyAiZW5jcnlwdCIgOiAiZGVjcnlwdCI7CisJbXkgJGRhdGE9c2hpZnQ7CisKKwkkZGF0YT1oZXgyYmluKCRkYXRhKTsKKwlteSAkcHJvZ3JhbSA9ICIuL2FlcyAkZW5jICRrZXkiOworCSRkYXRhPXBpcGVfdGhyb3VnaF9wcm9ncmFtKCRkYXRhLCRwcm9ncmFtKTsKKwlyZXR1cm4gYmluMmhleCgkZGF0YSk7Cit9CisKK3N1YiB2ZW5kb3IxX3N0YXRlX2NpcGhlcigkJCQkJCkgeworCW15ICRjaXBoZXIgPSBzaGlmdDsKKwlteSAkZW5jZGVjID0gc2hpZnQ7CisJbXkgJGJ1ZnNpemUgPSBzaGlmdDsKKwlteSAka2V5ID0gc2hpZnQ7CisJbXkgJGl2ID0gc2hpZnQ7CisKKwkka2V5ID0gYmluMmhleCgka2V5KTsKKwlteSAkZW5jID0gJGVuY2RlYyA/ICJlbmNyeXB0IjogImRlY3J5cHQiOworCW15ICRvdXQgPSAiLi9hZXMgJGVuYyAka2V5ICRidWZzaXplIjsKKwlyZXR1cm4gJG91dDsKK30KKworIyMjIyMgTm8gb3RoZXIgaW50ZXJmYWNlIGZ1bmN0aW9ucyBiZWxvdyB0aGlzIHBvaW50ICMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEdlbmVyYWwgaGVscGVyIHJvdXRpbmVzCisKKyMgRXhlY3V0aW5nIGEgcHJvZ3JhbSBieSBmZWVkaW5nIFNURElOIGFuZCByZXRyaWV2aW5nCisjIFNURE9VVAorIyAkMTogZGF0YSBzdHJpbmcgdG8gYmUgcGlwZWQgdG8gdGhlIGFwcCBvbiBTVERJTgorIyByZXN0OiBwcm9ncmFtIGFuZCBhcmdzCisjIHJldHVybnM6IFNURE9VVCBvZiBwcm9ncmFtIGFzIHN0cmluZworc3ViIHBpcGVfdGhyb3VnaF9wcm9ncmFtKCRAKSB7CisJbXkgJGluID0gc2hpZnQ7CisJbXkgQGFyZ3MgPSBAXzsKKworCW15ICgkQ08sICRDSSk7CisJbXkgJHBpZCA9IG9wZW4yKCRDTywgJENJLCBAYXJncyk7CisJCisJbXkgJG91dCA9ICIiOworCW15ICRsZW4gPSBsZW5ndGgoJGluKTsKKwlteSAkZmlyc3QgPSAxOworCXdoaWxlICgxKSB7CisJCW15ICRyaW4gPSAiIjsKKwkJbXkgJHdpbiA9ICIiOworCQkjIE91dHB1dCBvZiBwcm9nIGlzIEZEIHRoYXQgd2UgcmVhZAorCQl2ZWMoJHJpbixmaWxlbm8oJENPKSwxKSA9IDE7CisJCSMgSW5wdXQgb2YgcHJvZyBpcyBGRCB0aGF0IHdlIHdyaXRlCisJCSMgY2hlY2sgZm9yICRmaXJzdCBpcyBuZWVkZWQgYmVjYXVzZSB3ZSBjYW4gaGF2ZSBOVUxMIGlucHV0CisJCSMgdGhhdCBpcyB0byBiZSB3cml0dGVuIHRvIHRoZSBhcHAKKwkJaWYgKCAkbGVuID4gMCB8fCAkZmlyc3QpIHsKKwkJCSh2ZWMoJHdpbixmaWxlbm8oJENJKSwxKSA9IDEpOworCQkJJGZpcnN0PTA7CisJCX0KKwkJIyBMZXQgdXMgd2FpdCBmb3IgMTAwbXMKKwkJbXkgJG5mb3VuZCA9IHNlbGVjdChteSAkcm91dD0kcmluLCBteSAkd291dD0kd2luLCB1bmRlZiwgMC4xKTsKKwkJaWYgKCAkd291dCApIHsKKwkJCW15ICR3cml0dGVuID0gc3lzd3JpdGUoJENJLCAkaW4sICRsZW4pOworCQkJZGllICJicm9rZW4gcGlwZSIgaWYgIWRlZmluZWQgJHdyaXR0ZW47CisJCQkkbGVuIC09ICR3cml0dGVuOworCQkJc3Vic3RyKCRpbiwgMCwgJHdyaXR0ZW4pID0gIiI7CisJCQlpZiAoJGxlbiA8PSAwKSB7CisJCQkJY2xvc2UgJENJIG9yIGRpZSAiYnJva2VuIHBpcGU6ICQhIjsKKwkJCX0KKwkJfQorCQlpZiAoICRyb3V0ICkgeworCQkJbXkgJHRtcF9vdXQgPSAiIjsKKwkJCW15ICRieXRlc19yZWFkID0gc3lzcmVhZCgkQ08sICR0bXBfb3V0LCA0MDk2KTsKKwkJCSRvdXQgLj0gJHRtcF9vdXQ7CisJCQlsYXN0IGlmICgkYnl0ZXNfcmVhZCA9PSAwKTsKKwkJfQorCX0KKwljbG9zZSAkQ08gb3IgZGllICJicm9rZW4gcGlwZTogJCEiOworCXdhaXRwaWQgJHBpZCwgMDsKKwkKKwlyZXR1cm4gJG91dDsKK30KKworIworIyBjb252ZXJ0IEFTQ0lJIGhleCB0byBiaW5hcnkgaW5wdXQKKyMgJDEgQVNDSUkgaGV4CisjIHJldHVybiBiaW5hcnkgcmVwcmVzZW50YXRpb24KK3N1YiBoZXgyYmluKCQpIHsKKwlteSAkaW4gPSBzaGlmdDsKKwlteSAkbGVuID0gbGVuZ3RoKCRpbik7CisJJGxlbiA9IDAgaWYgKCRpbiBlcSAiMDAiKTsKKwlyZXR1cm4gcGFjaygiSCRsZW4iLCAiJGluIik7Cit9CisKKyMKKyMgY29udmVydCBiaW5hcnkgaW5wdXQgdG8gQVNDSUkgaGV4CisjICQxIGJpbmFyeSB2YWx1ZQorIyByZXR1cm4gQVNDSUkgaGV4IHJlcHJlc2VudGF0aW9uCitzdWIgYmluMmhleCgkKSB7CisJbXkgJGluID0gc2hpZnQ7CisJbXkgJGxlbiA9IGxlbmd0aCgkaW4pKjI7CisJcmV0dXJuIHVucGFjaygiSCRsZW4iLCAiJGluIik7Cit9CisKKyMgJDE6IGJpbmFyeSBieXRlIChjaGFyYWN0ZXIpCisjIHJldHVybnM6IGJpbmFyeSBieXRlIHdpdGggb2RkIHBhcml0eSB1c2luZyBsb3cgYml0IGFzIHBhcml0eSBiaXQKK3N1YiBvZGRfcGFyKCQpIHsKKwlteSAkaW4gPSBvcmQoc2hpZnQpOworCW15ICRvZGRfY291bnQ9MDsKKwlmb3IobXkgJGk9MTsgJGk8ODsgJGkrKykgeworCQkkb2RkX2NvdW50KysgaWYgKCRpbiAmICgxPDwkaSkpOworCX0KKworCW15ICRvdXQgPSAkaW47CisJaWYgKCRvZGRfY291bnQgJiAxKSB7ICMgY2hlY2sgaWYgcGFyaXR5IGlzIGFscmVhZHkgb2RkCisJCSRvdXQgJj0gfjE7ICMgY2xlYXIgdGhlIGxvdyBiaXQKKwl9IGVsc2UgeworCQkkb3V0IHw9IDE7ICMgc2V0IHRoZSBsb3cgYml0CisJfQorCisJcmV0dXJuIGNocigkb3V0KTsKK30KKworIyBERVMga2V5cyB1c2VzIG9ubHkgdGhlIDcgaGlnaCBiaXRzIG9mIGEgYnl0ZSwgdGhlIDh0aCBsb3cgYml0CisjIGlzIHRoZSBwYXJpdHkgYml0CisjIGFzIHRoZSBuZXcga2V5IGlzIGNhbGN1bGF0ZWQgZnJvbSBvbGRrZXkgWE9SIGNpcGhlciBpbiB0aGUgTUNUIHRlc3QsCisjIHRoZSBwYXJpdHkgaXMgbm90IHJlYWxseSBjaGVja2VkIGFuZCBuZWVkcyB0byBiZSBzZXQgdG8gbWF0Y2gKKyMgZXhwZWN0YXRpb24gKE9wZW5TU0wgZG9lcyBub3QgcmVhbGx5IGNhcmUsIGJ1dCB0aGUgRklQUworIyB0ZXN0IHJlc3VsdCBpcyBleHBlY3RlZCB0aGF0IHRoZSBrZXkgaGFzIHRoZSBhcHByb3ByaWF0ZSBwYXJpdHkpCisjICQxOiBhcmJpdHJhcnkgYmluYXJ5IHN0cmluZworIyByZXR1cm5zOiBzdHJpbmcgd2l0aCBvZGQgcGFyaXR5IHNldCBpbiBsb3cgYml0IG9mIGVhY2ggYnl0ZQorc3ViIGZpeF9rZXlfcGFyaXR5KCQpIHsKKwlteSAkaW4gPSBzaGlmdDsKKwlteSAkb3V0ID0gIiI7CisJZm9yIChteSAkaSA9IDA7ICRpIDwgbGVuZ3RoKCRpbik7ICRpKyspIHsKKwkJJG91dCAuPSBvZGRfcGFyKHN1YnN0cigkaW4sICRpLCAxKSk7CisJfQorCisJcmV0dXJuICRvdXQ7Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgREVSL1BFTSB1dGlsaXR5IGZ1bmN0aW9ucworIyBDZi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUvfmFyaWVsL3NzbGVheS9sYXltYW4uaHRtbAorCisjIENvbnZlcnQgdW5zaWduZWQgaW50ZWdlciB0byBiYXNlMjU2IGJpZ2ludCBieXRlcworIyAkMSBpbnRlZ2VyCisjIHJldHVybnMgYmFzZTI1NiBvY3RldCBzdHJpbmcKK3N1YiBpbnRfYmFzZTI1Nl91bnNpZ25lZCgkKSB7CisJbXkgJG4gPSBzaGlmdDsKKworCW15ICRvdXQgPSBjaHIoJG4gJiAyNTUpOworCXdoaWxlICgkbj4+PTgpIHsKKwkJJG91dCA9IGNocigkbiAmIDI1NSkgLiAkb3V0OworCX0KKworCXJldHVybiAkb3V0OworfQorCisjIENvbnZlcnQgc2lnbmVkIGludGVnZXIgdG8gYmFzZTI1NiBiaWdpbnQgYnl0ZXMKKyMgJDEgaW50ZWdlcgorIyByZXR1cm5zIGJhc2UyNTYgb2N0ZXQgc3RyaW5nCitzdWIgaW50X2Jhc2UyNTZfc2lnbmVkKCQpIHsKKwlteSAkbiA9IHNoaWZ0OworCW15ICRuZWdhdGl2ZSA9ICgkbiA8IDApOworCisJaWYgKCRuZWdhdGl2ZSkgeworCQkkbiA9IC0kbi0xOworCX0KKworCW15ICRvdXQgPSBpbnRfYmFzZTI1Nl91bnNpZ25lZCgkbik7CisKKwlpZiAob3JkKHN1YnN0cigkb3V0LCAwLCAxKSkgJiAxMjgpIHsKKwkJIyBpdCdzIHN1cHBvc2VkIHRvIGJlIHBvc2l0aXZlIGJ1dCBoYXMgc2lnbiBiaXQgc2V0LAorCQkjIGFkZCBhIGxlYWRpbmcgemVybworCQkkb3V0ID0gY2hyKDApIC4gJG91dDsKKwl9CisKKwlpZiAoJG5lZ2F0aXZlKSB7CisJCW15ICRuZWcgPSBjaHIoMjU1KSB4IGxlbmd0aCgkb3V0KTsKKwkJJG91dCBePSAkbmVnOworCX0KKworCXJldHVybiAkb3V0OworfQorCisjIExlbmd0aCBoZWFkZXIgZm9yIHNwZWNpZmllZCBERVIgb2JqZWN0IGxlbmd0aAorIyAkMSBsZW5ndGggYXMgaW50ZWdlcgorIyByZXR1cm4gb2N0ZXQgZW5jb2RpbmcgZm9yIGxlbmd0aAorc3ViIGRlcl9sZW4oJCkgeworCW15ICRsZW4gPSBzaGlmdDsKKworCWlmICgkbGVuIDw9IDEyNykgeworCQlyZXR1cm4gY2hyKCRsZW4pOworCX0gZWxzZSB7CisJCW15ICRibGVuID0gaW50X2Jhc2UyNTZfdW5zaWduZWQoJGxlbik7CisKKwkJcmV0dXJuIGNocigxMjggfCBsZW5ndGgoJGJsZW4pKSAuICRibGVuOworCX0KK30KKworIyBQcmVwZW5kIGxlbmd0aCBoZWFkZXIgdG8gb2JqZWN0CisjICQxIG9iamVjdCBhcyBvY3RldCBzZXF1ZW5jZQorIyByZXR1cm4gbGVuZ3RoIGhlYWRlciBmb3Igb2JqZWN0IGZvbGxvd2VkIGJ5IG9iamVjdCBhcyBvY3RldHMKK3N1YiBkZXJfbGVuX29iaigkKSB7CisJbXkgJHggPSBzaGlmdDsKKworCXJldHVybiBkZXJfbGVuKGxlbmd0aCgkeCkpIC4gJHg7Cit9CisKKyMgREVSIHNlcXVlbmNlCisjICQqIG9iamVjdHMKKyMgcmV0dXJucyBERVIgc2VxdWVuY2UgY29uc2lzdGluZyBvZiB0aGUgb2JqZWN0cyBwYXNzZWQgYXMgYXJndW1lbnRzCitzdWIgZGVyX3NlcSB7CisJbXkgJHNlcSA9IGpvaW4oIiIsIEBfKTsKKwlyZXR1cm4gY2hyKDB4MzApIC4gZGVyX2xlbl9vYmooJHNlcSk7Cit9CisKKyMgREVSIGJpdHN0cmluZworIyAkMSBpbnB1dCBvY3RldHMgKG11c3QgYmUgZnVsbCBvY3RldHMsIGZyYWN0aW9uYWwgb2N0ZXRzIG5vdCBzdXBwb3J0ZWQpCisjIHJldHVybnMgaW5wdXQgZW5jYXBzdWxhdGVkIGFzIGJpdHN0cmluZworc3ViIGRlcl9iaXRzdHJpbmcoJCkgeworCW15ICR4ID0gc2hpZnQ7CisKKwkkeCA9IGNocigwKSAuICR4OworCisJcmV0dXJuIGNocigweDAzKSAuIGRlcl9sZW5fb2JqKCR4KTsKK30KKworIyBiYXNlLTEyOC1lbmNvZGVkIGludGVnZXIsIHVzZWQgZm9yIG9iamVjdCBudW1iZXJzLgorIyAkMSBpbnRlZ2VyCisjIHJldHVybnMgb2N0ZXQgc2VxdWVuY2UKK3N1YiBkZXJfYmFzZTEyOCgkKSB7CisJbXkgJG4gPSBzaGlmdDsKKworCW15ICRvdXQgPSBjaHIoJG4gJiAxMjcpOworCisJd2hpbGUgKCRuPj49NykgeworCQkkb3V0ID0gY2hyKDEyOCB8ICgkbiAmIDEyNykpIC4gJG91dDsKKwl9CisKKwlyZXR1cm4gJG91dDsKK30KKworIyBHZW5lcmF0aW5nIHRoZSBQRU0gY2VydGlmaWNhdGUgc3RyaW5nCisjIChiYXNlLTY0LWVuY29kZWQgREVSIHN0cmluZykKKyMgJDEgREVSIHN0cmluZworIyByZXR1cm5zIG9jdGV0IHNlcXVlbmNlCitzdWIgcGVtX2NlcnQoJCkgeworCW15ICRuID0gc2hpZnQ7CisKKwlteSAkb3V0ID0gIi0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tXG4iOworCSRvdXQgLj0gZW5jb2RlX2Jhc2U2NCgkbik7CisJJG91dCAuPSAiLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tXG4iOworCisJcmV0dXJuICRvdXQ7Cit9CisKKyMgREVSIG9iamVjdCBpZGVudGlmaWVyCisjICQqIHNlcXVlbmNlIG9mIGlkIG51bWJlcnMKKyMgcmV0dXJucyBvY3RldHMKK3N1YiBkZXJfb2JqZWN0aWQgeworCW15ICR2MSA9IHNoaWZ0OworCW15ICR2MiA9IHNoaWZ0OworCisJbXkgJG91dCA9IGNocig0MCokdjEgKyAkdjIpIC4gam9pbigiIiwgbWFwIHsgZGVyX2Jhc2UxMjgoJF8pIH0gQF8pOworCisJcmV0dXJuIGNocigweDA2KSAuIGRlcl9sZW5fb2JqKCRvdXQpOworfQorCisjIERFUiBzaWduZWQgaW50ZWdlcgorIyAkMSBudW1iZXIgYXMgb2N0ZXQgc3RyaW5nIChiYXNlIDI1NiByZXByZXNlbnRhdGlvbiwgaGlnaCBieXRlIGZpcnN0KQorIyByZXR1cm5zIG51bWJlciBpbiBERVIgaW50ZWdlciBlbmNvZGluZworc3ViIGRlcl9iaWdpbnQoJCkgeworCW15ICR4ID0gc2hpZnQ7CisKKwlyZXR1cm4gY2hyKDB4MDIpIC4gZGVyX2xlbl9vYmooJHgpOworfQorCisjIERFUiBwb3NpdGl2ZSBpbnRlZ2VyIHdpdGggbGVhZGluZyB6ZXJvZXMgc3RyaXBwZWQKKyMgJDEgbnVtYmVyIGFzIG9jdGV0IHN0cmluZyAoYmFzZSAyNTYgcmVwcmVzZW50YXRpb24sIGhpZ2ggYnl0ZSBmaXJzdCkKKyMgcmV0dXJucyBudW1iZXIgaW4gREVSIGludGVnZXIgZW5jb2RpbmcKK3N1YiBkZXJfcG9zX2JpZ2ludCgkKSB7CisJbXkgJHggPSBzaGlmdDsKKworCSMgc3RyaXAgbGVhZGluZyB6ZXJvIGRpZ2l0cworCSR4ID1+IHMvXltcMF0rLy87CisKKwkjIG5lZWQgdG8gcHJlcGVuZCBhIHplcm8gaWYgaGlnaCBiaXQgc2V0LCBzaW5jZSBpdCB3b3VsZCBvdGhlcndpc2UgYmUKKwkjIGludGVycHJldGVkIGFzIGEgbmVnYXRpdmUgbnVtYmVyLiBBbHNvIG5lZWRlZCBmb3IgbnVtYmVyIDAuCisJaWYgKCFsZW5ndGgoJHgpIHx8IG9yZChzdWJzdHIoJHgsIDAsIDEpKSA+PSAxMjgpIHsKKwkJJHggPSBjaHIoMCkgLiAkeDsKKwl9CisKKwlyZXR1cm4gZGVyX2JpZ2ludCgkeCk7Cit9CisKKyMgJDEgbnVtYmVyIGFzIHNpZ25lZCBpbnRlZ2VyCisjIHJldHVybnMgbnVtYmVyIGFzIHNpZ25lZCBERVIgaW50ZWdlciBlbmNvZGluZworc3ViIGRlcl9pbnQoJCkgeworCW15ICRuID0gc2hpZnQ7CisJCisJcmV0dXJuIGRlcl9iaWdpbnQoaW50X2Jhc2UyNTZfc2lnbmVkKCRuKSk7Cit9CisKKyMgdGhlIE5VTEwgb2JqZWN0IGNvbnN0YW50CitzdWIgZGVyX251bGwoKSB7CisJcmV0dXJuIGNocigweDA1KSAuIGNocigweDAwKTsKK30KKworIyBVbml0IHRlc3QgaGVscGVyCisjICQxIGNhbGN1bGF0ZWQgcmVzdWx0CisjICQyIGV4cGVjdGVkIHJlc3VsdAorIyBubyByZXR1cm4gdmFsdWUsIGRpZXMgaWYgcmVzdWx0cyBkaWZmZXIsIHNob3dpbmcgY2FsbGVyJ3MgbGluZSBudW1iZXIKK3N1YiBkZXJfdGVzdCgkJCkgeworCW15ICRhY3R1YWwgPSBiaW4yaGV4KHNoaWZ0KTsKKwlteSAkZXhwZWN0ZWQgPSBzaGlmdDsKKworCW15IEBjYWxsZXIgPSBjYWxsZXI7CisJJGFjdHVhbCBlcSAkZXhwZWN0ZWQgb3IgZGllICJFcnJvcjpsaW5lICRjYWxsZXJbMl06YXNzZXJ0aW9uIGZhaWxlZDogIgorCQkuIiRhY3R1YWwgIT0gJGV4cGVjdGVkXG4iOworfQorCisjIFVuaXQgdGVzdGluZyBmb3IgdGhlIERFUiBlbmNvZGluZyBmdW5jdGlvbnMKKyMgRXhhbXBsZXMgZnJvbSBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9+YXJpZWwvc3NsZWF5L2xheW1hbi5odG1sCisjIE5vIGlucHV0LCBubyBvdXRwdXQuIERpZXMgaWYgdW5pdCB0ZXN0cyBmYWlsLgorc3ViIGRlcl91bml0X3Rlc3QgeworCSMjIHVuY29tbWVudCB0aGVzZSBpZiB5b3Ugd2FudCB0byB0ZXN0IHRoZSB0ZXN0IGZyYW1ld29yaworCSNwcmludCBTVERFUlIgIlVuaXQgdGVzdCBydW5uaW5nXG4iOworCSNkZXJfdGVzdCBjaHIoMCksICI0MiI7CisKKwlkZXJfdGVzdCBkZXJfbnVsbCwgIjA1MDAiOworCisJIyBsZW5ndGggYnl0ZXMKKwlkZXJfdGVzdCBkZXJfbGVuKDEpLCAiMDEiOworCWRlcl90ZXN0IGRlcl9sZW4oMTI3KSwgIjdmIjsKKwlkZXJfdGVzdCBkZXJfbGVuKDEyOCksICI4MTgwIjsKKwlkZXJfdGVzdCBkZXJfbGVuKDI1NiksICI4MjAxMDAiOworCWRlcl90ZXN0IGRlcl9sZW4oNjU1MzYpLCAiODMwMTAwMDAiOworCisJIyBiaWdpbnQKKwlkZXJfdGVzdCBkZXJfYmlnaW50KGNocigwKSksICIwMjAxMDAiOworCWRlcl90ZXN0IGRlcl9iaWdpbnQoY2hyKDEyOCkpLCAiMDIwMTgwIjsgIyAtMTI4CisJZGVyX3Rlc3QgZGVyX3Bvc19iaWdpbnQoY2hyKDEyOCkpLCAiMDIwMjAwODAiOyAjICsxMjgKKwlkZXJfdGVzdCBkZXJfcG9zX2JpZ2ludChjaHIoMCkuY2hyKDApLmNocigxKSksICIwMjAxMDEiOworCWRlcl90ZXN0IGRlcl9wb3NfYmlnaW50KGNocigwKSksICIwMjAxMDAiOworCisJIyBpbnRlZ2VycyAodGVzdHMgYmFzZTI1NiBjb252ZXJzaW9uKQorCWRlcl90ZXN0IGRlcl9pbnQoICAgICAwKSwgIjAyMDEwMCI7CisJZGVyX3Rlc3QgZGVyX2ludCggICAxMjcpLCAiMDIwMTdmIjsKKwlkZXJfdGVzdCBkZXJfaW50KCAgIDEyOCksICIwMjAyMDA4MCI7CisJZGVyX3Rlc3QgZGVyX2ludCggICAyNTYpLCAiMDIwMjAxMDAiOworCWRlcl90ZXN0IGRlcl9pbnQoICAgIC0xKSwgIjAyMDFmZiI7CisJZGVyX3Rlc3QgZGVyX2ludCggIC0xMjgpLCAiMDIwMTgwIjsKKwlkZXJfdGVzdCBkZXJfaW50KCAgLTEyOSksICIwMjAyZmY3ZiI7CisJZGVyX3Rlc3QgZGVyX2ludCgtNjU1MzYpLCAiMDIwM2ZmMDAwMCI7CisJZGVyX3Rlc3QgZGVyX2ludCgtNjU1MzcpLCAiMDIwM2ZlZmZmZiI7CisKKwkjIG9iamVjdCBlbmNvZGluZywgIlJTQSBTZWN1cml0eSIKKwlkZXJfdGVzdCBkZXJfYmFzZTEyOCg4NDApLCAiODY0OCI7CisJZGVyX3Rlc3QgZGVyX29iamVjdGlkKDEsIDIsIDg0MCwgMTEzNTQ5KSwgIjA2MDYyYTg2NDg4NmY3MGQiOworCisJIyBDb21iaW5hdGlvbnMKKwlkZXJfdGVzdCBkZXJfYml0c3RyaW5nKCJBQkNEIiksICIwMzA1MDA0MTQyNDM0NCI7CisJZGVyX3Rlc3QgZGVyX2JpdHN0cmluZyhkZXJfbnVsbCksICIwMzAzMDAwNTAwIjsKKwlkZXJfdGVzdCBkZXJfc2VxKGRlcl9pbnQoMCksIGRlcl9udWxsKSwgIjMwMDUwMjAxMDAwNTAwIjsKKworCSMgVGhlIGJpZyBwaWN0dXJlCisJZGVyX3Rlc3QgZGVyX3NlcShkZXJfc2VxKGRlcl9vYmplY3RpZCgxLCAyLCA4NDAsIDExMzU0OSksIGRlcl9udWxsKSwKKwkgICAgICAgICAgICAgICAgIGRlcl9iaXRzdHJpbmcoZGVyX3NlcShkZXJfcG9zX2JpZ2ludChjaHIoNSkpLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcl9wb3NfYmlnaW50KGNocigzKSkpKSksCisJICAgICAgICAgIjMwMTczMDBhMDYwNjJhODY0ODg2ZjcwZDA1MDAwMzA5MDAzMDA2MDIwMTA1MDIwMTAzIjsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBPcGVuU1NMIG1pc3NpbmcgZnVuY3Rpb25hbGl0eSB3b3JrYXJvdW5kcworCisjIyBGb3JtYXQgb2YgYW4gUlNBIHB1YmxpYyBrZXk6CisjICAgIDA6ZD0wICBobD0zIGw9IDE1OSBjb25zOiBTRVFVRU5DRSAgICAgICAgICAKKyMgICAgMzpkPTEgIGhsPTIgbD0gIDEzIGNvbnM6ICBTRVFVRU5DRSAgICAgICAgICAKKyMgICAgNTpkPTIgIGhsPTIgbD0gICA5IHByaW06ICAgT0JKRUNUICAgICAgICAgICAgOnJzYUVuY3J5cHRpb24KKyMgICAxNjpkPTIgIGhsPTIgbD0gICAwIHByaW06ICAgTlVMTCAgICAgICAgICAgICAgCisjICAgMTg6ZD0xICBobD0zIGw9IDE0MSBwcmltOiAgQklUIFNUUklORyAgICAgICAgCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyBzZXF1ZW5jZTogSU5URUdFUiAobiksIElOVEVHRVIgKGUpIF0KKworIyBnZW5lcmF0ZSBSU0EgcHViIGtleSBpbiBQRU0gZm9ybWF0CisjICQxOiBmaWxlbmFtZSB3aGVyZSBQRU0ga2V5IGlzIHRvIGJlIHN0b3JlZAorIyAkMjogbiBvZiB0aGUgUlNBIGtleSBpbiBoZXgKKyMgJDM6IGUgb2YgdGhlIFJTQSBrZXkgaW4gaGV4CisjIHJldHVybjogbm90aGluZywgYnV0IGZpbGUgY3JlYXRlZAorc3ViIGdlbl9wdWJyc2FrZXkoJCQkKSB7CisJbXkgJGZpbGVuYW1lPXNoaWZ0OworCW15ICRuID0gc2hpZnQ7CisJbXkgJGUgPSBzaGlmdDsKKworCSMgbWFrZSBzdXJlIHRoZSBERVIgZW5jb2RlciB3b3JrcyA7LSkKKwlkZXJfdW5pdF90ZXN0KCk7CisKKwkjIGdlbmVyYXRlIERFUiBlbmNvZGluZyBvZiB0aGUgcHVibGljIGtleQorCisJbXkgJHJzYUVuY3J5cHRpb24gPSBkZXJfb2JqZWN0aWQoMSwgMiwgODQwLCAxMTM1NDksIDEsIDEsIDEpOworCisJbXkgJGRlciA9IGRlcl9zZXEoZGVyX3NlcSgkcnNhRW5jcnlwdGlvbiwgZGVyX251bGwpLAorCSAgICAgICAgICAgICAgICAgIGRlcl9iaXRzdHJpbmcoZGVyX3NlcShkZXJfcG9zX2JpZ2ludChoZXgyYmluKCRuKSksCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcl9wb3NfYmlnaW50KGhleDJiaW4oJGUpKSkpKTsKKworCW9wZW4oRkgsICI+IiwgJGZpbGVuYW1lKSBvciBkaWU7CisJcHJpbnQgRkggcGVtX2NlcnQoJGRlcik7CisJY2xvc2UgRkg7CisKK30KKworIyBnZW5lcmF0ZSBSU0EgcHViIGtleSBpbiBQRU0gZm9ybWF0CisjCisjIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyAib3BlbnNzbCBhc24xcGFyc2UgLWdlbmNvbmYiIHdoaWNoIHdhcyBhZGRlZAorIyBpbiBvcGVuc3NsIDAuOS44LiBJdCBpcyBub3QgYXZhaWxhYmxlIGluIG9sZGVyIG9wZW5zc2wgdmVyc2lvbnMuCisjCisjICQxOiBmaWxlbmFtZSB3aGVyZSBQRU0ga2V5IGlzIHRvIGJlIHN0b3JlZAorIyAkMjogbiBvZiB0aGUgUlNBIGtleSBpbiBoZXgKKyMgJDM6IGUgb2YgdGhlIFJTQSBrZXkgaW4gaGV4CisjIHJldHVybjogbm90aGluZywgYnV0IGZpbGUgY3JlYXRlZAorc3ViIGdlbl9wdWJyc2FrZXlfdXNpbmdfb3BlbnNzbCgkJCQpIHsKKwlteSAkZmlsZW5hbWU9c2hpZnQ7CisJbXkgJG4gPSBzaGlmdDsKKwlteSAkZSA9IHNoaWZ0OworCisJbXkgJGFzbjEgPSAiYXNuMT1TRVFVRU5DRTpwdWJrZXlpbmZvCisKK1twdWJrZXlpbmZvXQorYWxnb3JpdGhtPVNFUVVFTkNFOnJzYV9hbGcKK3B1YmtleT1CSVRXUkFQLFNFUVVFTkNFOnJzYXB1YmtleQorCitbcnNhX2FsZ10KK2FsZ29yaXRobT1PSUQ6cnNhRW5jcnlwdGlvbgorcGFyYW1ldGVyPU5VTEwKKworW3JzYXB1YmtleV0KK249SU5URUdFUjoweCRuCisKK2U9SU5URUdFUjoweCRlIjsKKworCW9wZW4oRkgsICI+JGZpbGVuYW1lLmNuZiIpIG9yIGRpZSAiQ2Fubm90IGNyZWF0ZSBmaWxlICRmaWxlbmFtZS5jbmY6ICQ/IjsKKwlwcmludCBGSCAkYXNuMTsKKwljbG9zZSBGSDsKKwlteSBAYXJncyA9ICgib3BlbnNzbCIsICJhc24xcGFyc2UiLCAiLWdlbmNvbmYiLCAiJGZpbGVuYW1lLmNuZiIsICItbm9vdXQiLCAiLW91dCIsICIkZmlsZW5hbWUuZGVyIik7CisJc3lzdGVtKEBhcmdzKSA9PSAwIG9yIGRpZSAic3lzdGVtIEBhcmdzIGZhaWxlZDogJD8iOworCUBhcmdzID0gKCJvcGVuc3NsIiwgInJzYSIsICItaW5mb3JtIiwgIkRFUiIsICItaW4iLCAiJGZpbGVuYW1lLmRlciIsCisJCSAiLW91dGZvcm0iLCAiUEVNIiwgIi1wdWJpbiIsICItcHVib3V0IiwgIi1vdXQiLCAiJGZpbGVuYW1lIik7CisJc3lzdGVtKEBhcmdzKSA9PSAwIG9yIGRpZSAic3lzdGVtIEBhcmdzIGZhaWxlZDogJD8iOworCWRpZSAiUlNBIFBFTSBmb3JtYXR0ZWQga2V5IGZpbGUgJGZpbGVuYW1lIHdhcyBub3QgY3JlYXRlZCIKKwkJaWYgKCEgLWYgJGZpbGVuYW1lKTsKKworCXVubGluaygiJGZpbGVuYW1lLmNuZiIpOworCXVubGluaygiJGZpbGVuYW1lLmRlciIpOworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBUZXN0IGNhc2VzCisKKyMgVGhpcyBpcyB0aGUgS25vd24gQW5zd2VyIFRlc3QKKyMgJDE6IHRoZSBzdHJpbmcgdGhhdCB3ZSBoYXZlIHRvIHB1dCBpbiBmcm9udCBvZiB0aGUga2V5CisjICAgICB3aGVuIHByaW50aW5nIHRoZSBrZXkKKyMgJDI6IGNyeXB0byBrZXkxIGluIGhleCBmb3JtCisjICQzOiBjcnlwdG8ga2V5MiBpbiBoZXggZm9ybSAoVERFUywgdW5kZWYgb3RoZXJ3aXNlKQorIyAkNDogY3J5cHRvIGtleTMgaW4gaGV4IGZvcm0gKFRERVMsIHVuZGVmIG90aGVyd2lzZSkKKyMgJDU6IElWIGluIGhleCBmb3JtCisjICQ2OiBQbGFpbnRleHQgKGVuYz0xKSBvciBDaXBoZXJ0ZXh0IChlbmM9MCkgaW4gaGV4IGZvcm0KKyMgJDc6IGNpcGhlcgorIyAkODogZW5jcnlwdD0xL2RlY3J5cHQ9MAorIyByZXR1cm46IHN0cmluZyBmb3JtYXR0ZWQgYXMgZXhwZWN0ZWQgYnkgQ0FWUworc3ViIGthdCgkJCQkJCQkJCkgeworCW15ICRrZXl0eXBlID0gc2hpZnQ7CisJbXkgJGtleTEgPSBzaGlmdDsKKwlteSAka2V5MiA9IHNoaWZ0OworCW15ICRrZXkzID0gc2hpZnQ7CisJbXkgJGl2ID0gc2hpZnQ7CisJbXkgJHB0ID0gc2hpZnQ7CisJbXkgJGNpcGhlciA9IHNoaWZ0OworCW15ICRlbmMgPSBzaGlmdDsKKworCW15ICRvdXQgPSAiIjsKKworCSRvdXQgLj0gIiRrZXl0eXBlID0gJGtleTFcbiI7CisKKwkjIHRoaXMgaXMgdGhlIGNvbmNhcmRpbmF0aW9uIG9mIHRoZSBrZXlzIGZvciAzREVTCisJaWYgKGRlZmluZWQoJGtleTIpKSB7CisJCSRvdXQgLj0gIktFWTIgPSAka2V5MlxuIjsKKwkJJGtleTEgPSAka2V5MSAuICRrZXkyOworCX0KKwlpZiAoZGVmaW5lZCgka2V5MykpIHsKKwkJJG91dCAuPSAiS0VZMyA9ICRrZXkzXG4iOworCQkka2V5MT0gJGtleTEgLiAka2V5MzsKKwl9CisJCisJJG91dCAuPSAiSVYgPSAkaXZcbiIgaWYgKGRlZmluZWQoJGl2KSAmJiAkaXYgbmUgIiIpOworCWlmICgkZW5jKSB7CisJCSRvdXQgLj0gIlBMQUlOVEVYVCA9ICRwdFxuIjsKKwkJJG91dCAuPSAiQ0lQSEVSVEVYVCA9ICIgLiAmJGVuY2RlYygka2V5MSwgJGl2LCAkY2lwaGVyLCAxLCAkcHQpIC4gIlxuIjsKKwl9IGVsc2UgeworCQkkb3V0IC49ICJDSVBIRVJURVhUID0gJHB0XG4iOworCQkkb3V0IC49ICJQTEFJTlRFWFQgPSAiIC4gJiRlbmNkZWMoJGtleTEsICRpdiwgJGNpcGhlciwgMCwgJHB0KSAuICJcbiI7CisJfQorCisJcmV0dXJuICRvdXQ7Cit9CisKKyMgVGhpcyBpcyB0aGUgS25vd24gQW5zd2VyIFRlc3QgZm9yIEhhc2hlcworIyAkMTogUGxhaW50ZXh0IGluIGhleCBmb3JtCisjICQyOiBoYXNoCisjICQzOiBoYXNoIGxlbmd0aCAodW5kZWYgaWYgbm90IGFwcGxpY2FibGUpCisjIHJldHVybjogc3RyaW5nIGZvcm1hdHRlZCBhcyBleHBlY3RlZCBieSBDQVZTCitzdWIgaGFzaF9rYXQoJCQkKSB7CisJbXkgJHB0ID0gc2hpZnQ7CisJbXkgJGNpcGhlciA9IHNoaWZ0OworCW15ICRsZW4gPSBzaGlmdDsKKworCW15ICRvdXQgPSAiIjsKKwkkb3V0IC49ICJMZW4gPSAkbGVuXG4iIGlmIChkZWZpbmVkKCRsZW4pKTsKKwkkb3V0IC49ICJNc2cgPSAkcHRcbiI7CisKKwkkcHQgPSAiIiBpZighJGxlbik7CisJJG91dCAuPSAiTUQgPSAiIC4gJiRoYXNoKCRwdCwgJGNpcGhlcikgLiAiXG4iOworCXJldHVybiAkb3V0OworfQorCisjIEtub3duIEFuc3dlciBUZXN0IGZvciBITUFDIGhhc2gKKyMgJDE6IGtleSBsZW5ndGggaW4gYnl0ZXMKKyMgJDI6IE1BQyBsZW5ndGggaW4gYnl0ZXMKKyMgJDM6IGtleSBmb3IgSE1BQyBpbiBoZXggZm9ybQorIyAkNDogbWVzc2FnZSB0byBiZSBoYXNoZWQKKyMgcmV0dXJuOiBzdHJpbmcgZm9ybWF0dGVkIGFzIGV4cGVjdGVkIGJ5IENBVlMKK3N1YiBobWFjX2thdCgkJCQkKSB7CisJbXkgJGtsZW4gPSBzaGlmdDsKKwlteSAkdGxlbiA9IHNoaWZ0OworCW15ICRrZXkgID0gc2hpZnQ7CisJbXkgJG1zZyAgPSBzaGlmdDsKKworCSMgWFhYIHRoaXMgaXMgYSBoYWNrIC0gd2UgbmVlZCB0byBkZWNpcGhlciB0aGUgSE1BQyBSRVEgZmlsZXMgaW4gYSBtb3JlCisJIyBzYW5lIHdheQorCSMKKwkjIFRoaXMgaXMgYSBjb252ZXJzaW9uIHRhYmxlIGZyb20gdGhlIGV4cGVjdGVkIGhhc2ggb3V0cHV0IHNpemUKKwkjIHRvIHRoZSBhc3N1bWVkIGhhc2ggdHlwZSAtIHdlIG9ubHkgZGVmaW5lIGhlcmUgdGhlIGJsb2NrIHNpemUgb2YKKwkjIHRoZSB1bmRlcmx5aW5nIGhhc2hlcyBhbmQgZG8gbm90IGFsbG93IGFueSB0cnVuY2F0aW9uCisJbXkgJWhhc2h0eXBlID0gKAorCQkyMCA9PiAxLAorCQkyOCA9PiAyMjQsCisJCTMyID0+IDI1NiwKKwkJNDggPT4gMzg0LAorCQk2NCA9PiA1MTIKKwkpOworCisJZGllICJIYXNoIG91dHB1dCBzaXplICR0bGVuIGlzIG5vdCBzdXBwb3J0ZWQhIgorCQlpZighZGVmaW5lZCgkaGFzaHR5cGV7JHRsZW59KSk7CisKKwlteSAkb3V0ID0gIiI7CisJJG91dCAuPSAiS2xlbiA9ICRrbGVuXG4iOworCSRvdXQgLj0gIlRsZW4gPSAkdGxlblxuIjsKKwkkb3V0IC49ICJLZXkgPSAka2V5XG4iOworCSRvdXQgLj0gIk1zZyA9ICRtc2dcbiI7CisJJG91dCAuPSAiTWFjID0gIiAuICYkaG1hYygka2V5LCAkdGxlbiwgJG1zZywgJGhhc2h0eXBleyR0bGVufSkgLiAiXG4iOworCisJcmV0dXJuICRvdXQ7Cit9CisKKworIyBDaXBoZXIgTW9udGUgQ2FybG8gVGVzdGluZworIyAkMTogdGhlIHN0cmluZyB0aGF0IHdlIGhhdmUgdG8gcHV0IGluIGZyb250IG9mIHRoZSBrZXkKKyMgICAgIHdoZW4gcHJpbnRpbmcgdGhlIGtleQorIyAkMjogY3J5cHRvIGtleTEgaW4gaGV4IGZvcm0KKyMgJDM6IGNyeXB0byBrZXkyIGluIGhleCBmb3JtIChUREVTLCB1bmRlZiBvdGhlcndpc2UpCisjICQ0OiBjcnlwdG8ga2V5MyBpbiBoZXggZm9ybSAoVERFUywgdW5kZWYgb3RoZXJ3aXNlKQorIyAkNTogSVYgaW4gaGV4IGZvcm0KKyMgJDY6IFBsYWludGV4dCAoZW5jPTEpIG9yIENpcGhlcnRleHQgKGVuYz0wKSBpbiBoZXggZm9ybQorIyAkNzogY2lwaGVyCisjICQ4OiBlbmNyeXB0PTEvZGVjcnlwdD0wCisjIHJldHVybjogc3RyaW5nIGZvcm1hdHRlZCBhcyBleHBlY3RlZCBieSBDQVZTCitzdWIgY3J5cHRvX21jdCgkJCQkJCQkJCkgeworCW15ICRrZXl0eXBlID0gc2hpZnQ7CisgICAgICAgIG15ICRrZXkxID0gaGV4MmJpbihzaGlmdCk7CisgICAgICAgIG15ICRrZXkyID0gc2hpZnQ7CisgICAgICAgIG15ICRrZXkzID0gc2hpZnQ7CisgICAgICAgIG15ICRpdiA9IGhleDJiaW4oc2hpZnQpOworICAgICAgICBteSAkc291cmNlX2RhdGEgPSBoZXgyYmluKHNoaWZ0KTsKKwlteSAkY2lwaGVyID0gc2hpZnQ7CisgICAgICAgIG15ICRlbmMgPSBzaGlmdDsKKworCW15ICRvdXQgPSAiIjsKKworCSRrZXkyID0gaGV4MmJpbigka2V5MikgaWYgKGRlZmluZWQoJGtleTIpKTsKKwkka2V5MyA9IGhleDJiaW4oJGtleTMpIGlmIChkZWZpbmVkKCRrZXkzKSk7CisgICAgICAgIG15ICRidWZzaXplID0gbGVuZ3RoKCRzb3VyY2VfZGF0YSk7CisKKwkjIGZvciBBRVM6IG91dGVyIGxvb3AgMC05OSwgaW5uZXIgMC05OTkgYmFzZWQgb24gRklQUyBjb21wbGlhbmNlIHRlc3RzCisJIyBmb3IgUkM0OiBvdXRlciBsb29wIDAtOTksIGlubmVyIDAtOTk5IGJhc2VkIG9uIGF0c2VjIGNvbXBsaWFuY2UgdGVzdHMKKwkjIGZvciBERVM6IG91dGVyIGxvb3AgMC0zOTksIGlubmVyIDAtOTk5OSBiYXNlZCBvbiBGSVBTIGNvbXBsaWFuY2UgdGVzdHMKKwlteSAkY2lwaCA9IHN1YnN0cigkY2lwaGVyLDAsMyk7CisJbXkgJG9sb29wPTEwMDsKKwlteSAkaWxvb3A9MTAwMDsKKwlpZiAoJGNpcGggPX4gL2Rlcy8pIHskb2xvb3A9NDAwOyRpbG9vcD0xMDAwMDt9CisKKyAgICAgICAgZm9yIChteSAkaT0wOyAkaTwkb2xvb3A7ICsrJGkpIHsKKwkJJG91dCAuPSAiQ09VTlQgPSAkaVxuIjsKKwkJaWYgKGRlZmluZWQoJGtleTIpKSB7CisJCQkkb3V0IC49ICIka2V5dHlwZSA9ICIuIGJpbjJoZXgoJGtleTEpLiAiXG4iOworCQkJJG91dCAuPSAiS0VZMiA9ICIuIGJpbjJoZXgoJGtleTIpLiAiXG4iOworCQkJJGtleTEgPSAka2V5MSAuICRrZXkyOworCQl9IGVsc2UgeworCQkJJG91dCAuPSAiJGtleXR5cGUgPSAiLiBiaW4yaGV4KCRrZXkxKS4gIlxuIjsKKwkJfQorCQlpZihkZWZpbmVkKCRrZXkzKSkgeworCQkJJG91dCAuPSAiS0VZMyA9ICIuIGJpbjJoZXgoJGtleTMpLiAiXG4iOworCQkJJGtleTEgPSAka2V5MSAuICRrZXkzOworCQl9CisgICAgICAgIAlteSAka2V5bGVuID0gbGVuZ3RoKCRrZXkxKTsKKworICAgICAgICAgICAgICAgICRvdXQgLj0gIklWID0gIi4gYmluMmhleCgkaXYpIC4gIlxuIgorCQkJaWYgKGRlZmluZWQoJGl2KSAmJiAkaXYgbmUgIiIpOworCisgICAgICAgICAgICAgICAgaWYgKCRlbmMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRvdXQgLj0gIlBMQUlOVEVYVCA9ICIuIGJpbjJoZXgoJHNvdXJjZV9kYXRhKS4gIlxuIjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgJG91dCAuPSAiQ0lQSEVSVEVYVCA9ICIuIGJpbjJoZXgoJHNvdXJjZV9kYXRhKS4gIlxuIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbXkgKCRDTywgJENJKTsKKwkJbXkgJGNpcGhlcl9pbXAgPSAmJHN0YXRlX2NpcGhlcigkY2lwaGVyLCAkZW5jLCAkYnVmc2l6ZSwgJGtleTEsICRpdik7CisJCSRjaXBoZXJfaW1wID0gJiRzdGF0ZV9jaXBoZXJfZGVzKCRjaXBoZXIsICRlbmMsICRidWZzaXplLCAka2V5MSwgJGl2KSBpZigkY2lwaGVyID1+IC9kZXMvKTsKKyAgICAgICAgICAgICAgICBteSAkcGlkID0gb3BlbjIoJENPLCAkQ0ksICRjaXBoZXJfaW1wKTsKKworICAgICAgICAgICAgICAgIG15ICRjYWxjX2RhdGEgPSAkaXY7ICMgQ1Rbal0KKyAgICAgICAgICAgICAgICBteSAkb2xkX2NhbGNfZGF0YTsgIyBDVFtqLTFdCisgICAgICAgICAgICAgICAgbXkgJG9sZF9vbGRfY2FsY19kYXRhOyAjIENUW2otMl0KKwkJbXkgJG5leHRfc291cmNlOworCisJCSMgVERFUyBpbm5lciBsb29wIGltcGxlbWVudHMgbG9naWMgd2l0aGluIGRyaXZlcgorCQlpZiAoJGNpcGhlciA9fiAvZGVzLykgeworCQkJIyBOZWVkIHRvIHByb3ZpZGUgYSBkdW1teSBJViBpbiBjYXNlIG9mIEVDQiBtb2RlLgorCQkJbXkgJGl2X2FyZyA9IChkZWZpbmVkKCRpdikgJiYgJGl2IG5lICIiKQorCQkJCQk/IGJpbjJoZXgoJGl2KQorCQkJCQk6ICIwMCJ4KGxlbmd0aCgkc291cmNlX2RhdGEpKTsKKwkJCXByaW50ICRDSSAiMVxuIgorCQkJCSAgLiRpbG9vcC4iXG4iCisJCQkJICAuYmluMmhleCgka2V5MSkuIlxuIgorCQkJCSAgLiRpdl9hcmcuIlxuIgorCQkJCSAgLmJpbjJoZXgoJHNvdXJjZV9kYXRhKS4iXG5cbiIgb3IgZGllOworCQkJY2hvbXAobXkgJGxpbmUgPSA8JENPPik7CisJCQkkY2FsY19kYXRhID0gaGV4MmJpbigkbGluZSk7CisJCQljaG9tcCgkbGluZSA9IDwkQ08+KTsKKwkJCSRvbGRfY2FsY19kYXRhID0gaGV4MmJpbigkbGluZSk7CisJCQljaG9tcCgkbGluZSA9IDwkQ08+KTsKKwkJCSRvbGRfb2xkX2NhbGNfZGF0YSA9IGhleDJiaW4oJGxpbmUpOworCQkJY2hvbXAoJGxpbmUgPSA8JENPPik7CisJCQkkaXYgPSBoZXgyYmluKCRsaW5lKSBpZiAoZGVmaW5lZCgkaXYpICYmICRpdiBuZSAiIik7CisJCQljaG9tcCgkbGluZSA9IDwkQ08+KTsKKwkJCSRuZXh0X3NvdXJjZSA9IGhleDJiaW4oJGxpbmUpOworCQkJIyBTa2lwIG92ZXIgZW1wdHkgbGluZS4KKwkJCSRsaW5lID0gPCRDTz47CisJCX0gZWxzZSB7CisJICAgICAgICAgICAgICAgIGZvciAobXkgJGogPSAwOyAkaiA8ICRpbG9vcDsgKyskaikgeworCQkJCSRvbGRfb2xkX2NhbGNfZGF0YSA9ICRvbGRfY2FsY19kYXRhOworICAgICAgICAgICAgICAgIAkgICAgICAgICRvbGRfY2FsY19kYXRhID0gJGNhbGNfZGF0YTsKKworCQkJCSNwcmludCBTVERFUlIgInNvdXJjZV9kYXRhPSIsIGJpbjJoZXgoJHNvdXJjZV9kYXRhKSwgIlxuIjsKKwkJCQlzeXN3cml0ZSAkQ0ksICRzb3VyY2VfZGF0YSBvciBkaWUgJCE7CisJCQkJbXkgJGxlbiA9IHN5c3JlYWQgJENPLCAkY2FsY19kYXRhLCAkYnVmc2l6ZTsKKworCQkJCSNwcmludCBTVERFUlIgImxlbj0kbGVuLCBidWZzaXplPSRidWZzaXplXG4iOworCQkJCWRpZSBpZiAkbGVuIG5lICRidWZzaXplOworCQkJCSNwcmludCBTVERFUlIgImNhbGNfZGF0YT0iLCBiaW4yaGV4KCRjYWxjX2RhdGEpLCAiXG4iOworCisJCQkJaWYgKCAoISRlbmMgJiYgJGNpcGggPX4gL2Rlcy8pIHx8CisJCQkJICAgICAkY2lwaCA9fiAvcmM0LyB8fCAKKwkJCQkgICAgICRjaXBoZXIgPX4gL2VjYi8gKSB7CisJCQkJCSNUREVTIGluIGRlY3J5cHRpb24gbW9kZSwgUkM0IGFuZCBFQ0IgbW9kZQorCQkJCQkjaGF2ZSBhIHNwZWNpYWwgcnVsZQorCQkJCQkkc291cmNlX2RhdGEgPSAkY2FsY19kYXRhOworCQkJCX0gZWxzZSB7CisJCSAgICAgICAgICAgICAgICAgICAgICAgICRzb3VyY2VfZGF0YSA9ICRvbGRfY2FsY19kYXRhOworCQkJCX0KKwkgICAgICAgICAgICAgICAgfQorCQl9CisgICAgICAgICAgICAgICAgY2xvc2UgJENPOworICAgICAgICAgICAgICAgIGNsb3NlICRDSTsKKyAgICAgICAgICAgICAgICB3YWl0cGlkICRwaWQsIDA7CisKKyAgICAgICAgICAgICAgICBpZiAoJGVuYykgeworICAgICAgICAgICAgICAgICAgICAgICAgJG91dCAuPSAiQ0lQSEVSVEVYVCA9ICIuIGJpbjJoZXgoJGNhbGNfZGF0YSkuICJcblxuIjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgJG91dCAuPSAiUExBSU5URVhUID0gIi4gYmluMmhleCgkY2FsY19kYXRhKS4gIlxuXG4iOworICAgICAgICAgICAgICAgIH0KKwkJCisJCWlmICggJGNpcGggPX4gL2Flcy8gKSB7CisJICAgICAgICAgICAgICAgICRrZXkxIF49IHN1YnN0cigkb2xkX2NhbGNfZGF0YSAuICRjYWxjX2RhdGEsIC0ka2V5bGVuKTsKKwkJCSNwcmludCBTVERFUlIgYmluMmhleCgka2V5MSkuIlxuIjsKKwkJfSBlbHNpZiAoICRjaXBoID1+IC9kZXMvICkgeworCQkJZGllICJXcm9uZyBrZXlsZW4gJGtleWxlbiIgaWYgKCRrZXlsZW4gIT0gMjQpOworCisJCQkjICRua2V5IG5lZWRlZCBhcyAka2V5IGhvbGRzIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZQorCQkJIyBvbGQga2V5IGF0bQorCQkJbXkgJG5rZXkgPSBmaXhfa2V5X3Bhcml0eShzdWJzdHIoJGtleTEsMCw4KSBeICRjYWxjX2RhdGEpOworCQkJI3ByaW50IFNUREVSUiAiS0VZMSA9ICIuIGJpbjJoZXgoJG5rZXkpLiJcbiI7CisJCQlpZiAoc3Vic3RyKCRrZXkxLDAsOCkgbmUgc3Vic3RyKCRrZXkxLDgsOCkpIHsKKwkJCQkjcHJpbnQgU1RERVJSICJLRVkyIHJlY2FsYzogS0VZMT09S0VZMywgS0VZMiBpbmRlcC4gb3IgYWxsIEtFWXMgYXJlIGluZGVwLlxuIjsKKwkJCQkka2V5MiA9IGZpeF9rZXlfcGFyaXR5KChzdWJzdHIoJGtleTEsOCw4KSBeICRvbGRfY2FsY19kYXRhKSk7CisJCQl9IGVsc2UgeworCQkJCSNwcmludCBTVERFUlIgIktFWTIgcmVjYWxjOiBLRVkxPT1LRVkyPT1LRVkzXG4iOworCQkJCSRrZXkyID0gZml4X2tleV9wYXJpdHkoKHN1YnN0cigka2V5MSw4LDgpIF4gJGNhbGNfZGF0YSkpOworCQkJfQorCQkJI3ByaW50IFNUREVSUiAiS0VZMiA9ICIuIGJpbjJoZXgoJGtleTIpLiJcbiI7CisJCQlpZiAoIHN1YnN0cigka2V5MSwwLDgpIGVxIHN1YnN0cigka2V5MSwxNikpIHsKKwkJCQkjcHJpbnQgU1RERVJSICJLRVkzIHJlY2FsYzogS0VZMT09S0VZMj09S0VZMyBvciBLRVkxPT1LRVkzLCBLRVkyIGluZGVwLlxuIjsKKwkJCQkka2V5MyA9IGZpeF9rZXlfcGFyaXR5KChzdWJzdHIoJGtleTEsMTYpIF4gJGNhbGNfZGF0YSkpOworCQkJfSBlbHNlIHsKKwkJCQkjcHJpbnQgU1RERVJSICJLRVkzIHJlY2FsYzogYWxsIEtFWXMgYXJlIGluZGVwZW5kZW50XG4iOworCQkJCSRrZXkzID0gZml4X2tleV9wYXJpdHkoKHN1YnN0cigka2V5MSwxNikgXiAkb2xkX29sZF9jYWxjX2RhdGEpKTsKKwkJCX0KKwkJCSNwcmludCBTVERFUlIgIktFWTMgPSAiLiBiaW4yaGV4KCRrZXkzKS4iXG4iOworCisJCQkjIHJlc2V0IHRoZSBmaXJzdCBrZXkgLSBjb25jYXJkaW5hdGlvbiBoYXBwZW5zIGF0CisJCQkjIGJlZ2lubmluZyBvZiBsb29wCisJCQkka2V5MT0kbmtleTsKKwkJfSBlbHNpZiAoJGNpcGggPX4gL3JjNC8gKSB7CisJCQkka2V5MSBePSBzdWJzdHIoJGNhbGNfZGF0YSwgMCwgMTYpOworCQkJI3ByaW50IFNUREVSUiBiaW4yaGV4KCRrZXkxKS4iXG4iOworCQl9IGVsc2UgeworCQkJZGllICJUZXN0IGxpbWl0YXRpb246IGNpcGhlciAnJGNpcGhlcicgbm90IHN1cHBvcnRlZCBpbiBNb250ZSBDYXJsbyB0ZXN0aW5nIjsKKwkJfQorCisJCWlmICgkY2lwaGVyID1+IC9kZXMtZWRlMy1vZmIvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkc291cmNlX2RhdGEgPSAkc291cmNlX2RhdGEgXiAkbmV4dF9zb3VyY2U7CisJCX0gZWxzaWYgKCEkZW5jICYmICRjaXBoZXIgPX4gL2Rlcy1lZGUzLWNmYi8pIHsKKwkJCSNUREVTIGRlY3J5cHRpb24gQ0ZCIGhhcyBhIHNwZWNpYWwgcnVsZQorCQkJJHNvdXJjZV9kYXRhID0gJG5leHRfc291cmNlOworCQl9IGVsc2lmICggJGNpcGggPX4gL3JjNC8gfHwgJGNpcGhlciBlcSAiZGVzLWVkZTMiIHx8ICRjaXBoZXIgPX4gL2VjYi8pIHsKKwkJCSNObyByZXNldHRpbmcgb2YgSVYgYXMgdGhlIElWIGlzIGFsbCB6ZXJvIHNldCBpbml0aWFsbHkgKGkuZS4gbm8gSVYpCisJCQkkc291cmNlX2RhdGEgPSAkY2FsY19kYXRhOworCQl9IGVsc2lmICghICRlbmMgJiYgJGNpcGggPX4gL2Rlcy8gKSB7CisJCQkjVERFUyBpbiBkZWNyeXB0aW9uIG1vZGUgaGFzIGEgc3BlY2lhbCBydWxlCisJCQkkaXYgPSAkb2xkX2NhbGNfZGF0YTsKKwkJCSRzb3VyY2VfZGF0YSA9ICRjYWxjX2RhdGE7CisJCX0gZWxzZSB7CisJICAgICAgICAgICAgICAgICRpdiA9ICRjYWxjX2RhdGE7CisJCQkkc291cmNlX2RhdGEgPSAkb2xkX2NhbGNfZGF0YTsKKwkJfQorICAgICAgICB9CisKKwlyZXR1cm4gJG91dDsKK30KKworIyBIYXNoIE1vbnRlIENhcmxvIFRlc3RpbmcKKyMgJDE6IFBsYWludGV4dCBpbiBoZXggZm9ybQorIyAkMjogaGFzaAorIyByZXR1cm46IHN0cmluZyBmb3JtYXR0ZWQgYXMgZXhwZWN0ZWQgYnkgQ0FWUworc3ViIGhhc2hfbWN0KCQkKSB7CisJbXkgJHB0ID0gc2hpZnQ7CisJbXkgJGNpcGhlciA9IHNoaWZ0OworCisJbXkgJG91dCA9ICIiOworCisJJG91dCAuPSAiU2VlZCA9ICRwdFxuXG4iOworCisgICAgICAgIGZvciAobXkgJGo9MDsgJGo8MTAwOyArKyRqKSB7CisJCSRvdXQgLj0gIkNPVU5UID0gJGpcbiI7CisJCW15ICRtZDA9JHB0OworCQlteSAkbWQxPSRwdDsKKwkJbXkgJG1kMj0kcHQ7CisgICAgICAgIAlmb3IgKG15ICRpPTA7ICRpPDEwMDA7ICsrJGkpIHsKKwkJCSNwcmludCBTVERFUlIgIm91dGVyIGxvb3AgJGo7IGlubmVyIGxvb3AgJGlcbiI7CisJCQlteSAkbWk9ICRtZDAgLiAkbWQxIC4gJG1kMjsKKwkJCSRtZDA9JG1kMTsKKwkJCSRtZDE9JG1kMjsKKwkJCSRtZDIgPSAmJGhhc2goJG1pLCAkY2lwaGVyKTsKKwkJCSRtZDIgPX4gcy9cbi8vOworCQl9CisgICAgICAgICAgICAgICAgJG91dCAuPSAiTUQgPSAkbWQyXG5cbiI7CisJCSRwdD0kbWQyOworCX0KKworCXJldHVybiAkb3V0OworfQorCisjIFJTQSBTaWdHZW4gdGVzdAorIyAkMTogTWVzc2FnZSB0byBiZSBzaWduZWQgaW4gaGV4IGZvcm0KKyMgJDI6IEhhc2ggYWxnb3JpdGhtCisjICQzOiBmaWxlIG5hbWUgd2l0aCBSU0Ega2V5IGluIFBFTSBmb3JtCisjIHJldHVybjogc3RyaW5nIGZvcm1hdHRlZCBhcyBleHBlY3RlZCBieSBDQVZTCitzdWIgcnNhX3NpZ2dlbigkJCQpIHsKKwlteSAkZGF0YSA9IHNoaWZ0OworCW15ICRjaXBoZXIgPSBzaGlmdDsKKwlteSAka2V5ZmlsZSA9IHNoaWZ0OworCisJbXkgJG91dCA9ICIiOworCisJJG91dCAuPSAiU0hBQWxnID0gJGNpcGhlclxuIjsKKwkkb3V0IC49ICJNc2cgPSAkZGF0YVxuIjsKKwkkb3V0IC49ICJTID0gIiAuICYkcnNhX3NpZ24oJGRhdGEsIGxjKCRjaXBoZXIpLCAka2V5ZmlsZSkgLiAiXG4iOworCisJcmV0dXJuICRvdXQ7Cit9CisKKyMgUlNBIFNpZ1ZlciB0ZXN0CisjICQxOiBNZXNzYWdlIHRvIGJlIHZlcmlmaWVkIGluIGhleCBmb3JtCisjICQyOiBIYXNoIGFsZ29yaXRtCisjICQzOiBTaWduYXR1cmUgb2YgbWVzc2FnZSBpbiBoZXggZm9ybQorIyAkNDogbiBvZiB0aGUgUlNBIGtleSBpbiBoZXggaW4gaGV4IGZvcm0KKyMgJDU6IGUgb2YgdGhlIFJTQSBrZXkgaW4gaGV4IGluIGhleCBmb3JtCisjIHJldHVybjogc3RyaW5nIGZvcm1hdHRlZCBhcyBleHBlY3RlZCBieSBDQVZTCitzdWIgcnNhX3NpZ3ZlcigkJCQkJCkgeworCW15ICRkYXRhID0gc2hpZnQ7CisJbXkgJGNpcGhlciA9IHNoaWZ0OworCW15ICRzaWduYXR1cmUgPSBzaGlmdDsKKwlteSAkbiA9IHNoaWZ0OworCW15ICRlID0gc2hpZnQ7CisKKwlteSAkb3V0ID0gIiI7CisKKwkkb3V0IC49ICJTSEFBbGcgPSAkY2lwaGVyXG4iOworCSRvdXQgLj0gImUgPSAkZVxuIjsKKwkkb3V0IC49ICJNc2cgPSAkZGF0YVxuIjsKKwkkb3V0IC49ICJTID0gJHNpZ25hdHVyZVxuIjsKKworCSMgWFhYIG1heWJlIGEgc2VjdXJlIHRlbXAgZmlsZSBuYW1lIGlzIGJldHRlciBoZXJlCisJIyBidXQgc2luY2UgaXQgaXMgbm90IHJ1biBvbiBhIHNlY3VyaXR5IHNlbnNpdGl2ZQorCSMgc3lzdGVtLCBJIGhvcGUgdGhhdCB0aGlzIGlzIGZpbmUKKwlteSAka2V5ZmlsZSA9ICJyc2Ffc2lndmVyLnRtcC4kJCI7CisJZ2VuX3B1YnJzYWtleSgka2V5ZmlsZSwgJG4sICRlKTsKKworCW15ICRzaWdmaWxlID0gIiRrZXlmaWxlLnNpZyI7CisJb3BlbihGSCwgIj4kc2lnZmlsZSIpIG9yIGRpZSAiQ2Fubm90IGNyZWF0ZSBmaWxlICRzaWdmaWxlOiAkPyI7CisJcHJpbnQgRkggaGV4MmJpbigkc2lnbmF0dXJlKTsKKwljbG9zZSBGSDsKKworCSRvdXQgLj0gIlJlc3VsdCA9ICIgLiAoJiRyc2FfdmVyaWZ5KCRkYXRhLCBsYygkY2lwaGVyKSwgJGtleWZpbGUsICRzaWdmaWxlKSA/ICJQXG4iIDogIkZcbiIpOworCisJdW5saW5rKCRrZXlmaWxlKTsKKwl1bmxpbmsoJHNpZ2ZpbGUpOworCisJcmV0dXJuICRvdXQ7Cit9CisKKyMgUlNBIFg5LjMxIGtleSBnZW5lcmF0aW9uIHRlc3QKKyMgJDEgbW9kdWx1cyBzaXplCisjICQyIGUKKyMgJDMgeHAxCisjICQ0IHhwMgorIyAkNSBYcAorIyAkNiB4cTEKKyMgJDcgeHEyCisjICQ4IFhxCisjIHJldHVybjogc3RyaW5nIGZvcm1hdHRlZCBhcyBleHBlY3RlZCBieSBDQVZTCitzdWIgcnNhX2tleWdlbigkJCQkJCQkJCkgeworCW15ICRtb2R1bHVzID0gc2hpZnQ7CisJbXkgJGUgPSBzaGlmdDsKKwlteSAkeHAxID0gc2hpZnQ7CisJbXkgJHhwMiA9IHNoaWZ0OworCW15ICRYcCA9IHNoaWZ0OworCW15ICR4cTEgPSBzaGlmdDsKKwlteSAkeHEyID0gc2hpZnQ7CisJbXkgJFhxID0gc2hpZnQ7CisKKwlteSAkb3V0ID0gIiI7CisKKwlteSAkcmV0ID0gJiRyc2FfZGVyaXZlKCRtb2R1bHVzLCAkZSwgJHhwMSwgJHhwMiwgJFhwLCAkeHExLCAkeHEyLCAkWHEpOworCisJbXkgKCRQLCAkUSwgJE4sICREKSA9IHNwbGl0KC9cbi8sICRyZXQpOworCisJJG91dCAuPSAiZSA9ICRlXG4iOwkKKwkkb3V0IC49ICJ4cDEgPSAkeHAxXG4iOwkKKwkkb3V0IC49ICJ4cDIgPSAkeHAyXG4iOwkKKwkkb3V0IC49ICJYcCA9ICRYcFxuIjsJCisJJG91dCAuPSAicCA9ICRQXG4iOworCSRvdXQgLj0gInhxMSA9ICR4cTFcbiI7CQorCSRvdXQgLj0gInhxMiA9ICR4cTJcbiI7CQorCSRvdXQgLj0gIlhxID0gJFhxXG4iOwkKKwkkb3V0IC49ICJxID0gJFFcbiI7CisJJG91dCAuPSAibiA9ICROXG4iOworCSRvdXQgLj0gImQgPSAkRFxuXG4iOworCisJcmV0dXJuICRvdXQ7CisJCit9CisKKyMgWDkuMzEgUk5HIHRlc3QKKyMgJDEga2V5IGZvciB0aGUgQUVTIGNpcGhlcgorIyAkMiBEVCB2YWx1ZQorIyAkMyBWIHZhbHVlCisjICQ0IHR5cGUgKCJWU1QiLCAiTUNUIikKKyMgcmV0dXJuOiBzdHJpbmcgZm9ybWF0dGVkIGFzIGV4cGVjdGVkIGJ5IENBVlMKK3N1YiBybmd4OTMxKCQkJCQpIHsKKwlteSAka2V5PXNoaWZ0OworCW15ICRkdD1zaGlmdDsKKwlteSAkdj1zaGlmdDsKKwlteSAkdHlwZT1zaGlmdDsKKworCW15ICRvdXQgPSAiS2V5ID0gJGtleVxuIjsKKwkkb3V0ICAgLj0gIkRUID0gJGR0XG4iOworCSRvdXQgICAuPSAiViA9ICR2XG4iOworCisJbXkgJGNvdW50ID0gMTsKKwkkY291bnQgPSAxMDAwMCBpZiAoJHR5cGUgZXEgIk1DVCIpOworCisJbXkgJHJuZF92YWwgPSAiIjsKKworCSMgd2UgcmVhZCAxNiBieXRlcyBmcm9tIFJORworCW15ICRidWZzaXplID0gMTY7CisKKwlteSAoJENPLCAkQ0kpOworCW15ICRybmdfaW1wID0gJiRzdGF0ZV9ybmcoJGtleSwgJGR0LCAkdik7CisJbXkgJHBpZCA9IG9wZW4yKCRDTywgJENJLCAkcm5nX2ltcCk7CisJZm9yIChteSAkaSA9IDA7ICRpIDwgJGNvdW50OyArKyRpKSB7CisJCW15ICRsZW4gPSBzeXNyZWFkICRDTywgJHJuZF92YWwsICRidWZzaXplOworCQkjcHJpbnQgU1RERVJSICJsZW49JGxlbiwgYnVmc2l6ZT0kYnVmc2l6ZVxuIjsKKwkJZGllICJsZW49JGxlbiAhPSBidWZzaXplPSRidWZzaXplIiBpZiAkbGVuIG5lICRidWZzaXplOworCQkjcHJpbnQgU1RERVJSICJjYWxjX2RhdGE9IiwgYmluMmhleCgkcm5kX3ZhbCksICJcbiI7CisJfQorCWNsb3NlICRDTzsKKwljbG9zZSAkQ0k7CisJd2FpdHBpZCAkcGlkLCAwOworCisJJG91dCAuPSAiUiA9ICIgLiBiaW4yaGV4KCRybmRfdmFsKSAuICJcblxuIjsKKworCXJldHVybiAkb3V0OworfQorCisjIERTQSBQUUdHZW4gdGVzdAorIyAkMSBtb2R1bHVzIHNpemUKKyMgJDIgbnVtYmVyIG9mIHJvdW5kcyB0byBwZXJmb3JtIHRoZSB0ZXN0CisjIHJldHVybjogc3RyaW5nIGZvcm1hdHRlZCBhcyBleHBlY3RlZCBieSBDQVZTCitzdWIgZHNhX3BxZ2dlbl9kcml2ZXIoJCQpIHsKKwlteSAkbW9kID0gc2hpZnQ7CisJbXkgJHJvdW5kcyA9IHNoaWZ0OworCisJbXkgJG91dCA9ICIiOworCWZvcihteSAkaT0wOyAkaTwkcm91bmRzOyAkaSsrKSB7CisJCW15ICRyZXQgPSAmJGRzYV9wcWdnZW4oJG1vZCk7CisJCW15ICgkUCwgJFEsICRHLCAkU2VlZCwgJGMsICRIKSA9IHNwbGl0KC9cbi8sICRyZXQpOworCQlkaWUgIlJldHVybiB2YWx1ZSBkb2VzIG5vdCBjb250YWluIGFsbCBleHBlY3RlZCB2YWx1ZXMgb2YgUCwgUSwgRywgU2VlZCwgYywgSCBmb3IgZHNhX3BxZ2dlbiIKKwkJCWlmICghZGVmaW5lZCgkUCkgfHwgIWRlZmluZWQoJFEpIHx8ICFkZWZpbmVkKCRHKSB8fAorCQkJICAgICFkZWZpbmVkKCRTZWVkKSB8fCAhZGVmaW5lZCgkYykgfHwgIWRlZmluZWQoJEgpKTsKKworCQkjIG5vdyBjaGFuZ2UgdGhlIGNvdW50ZXIgdG8gZGVjaW1hbCBhcyBDQVZTIHdhbnRzIGRlY2ltYWwKKwkJIyBjb3VudGVyIHZhbHVlIGFsdGhvdWdoIGFsbCBvdGhlciBpcyBIRVgKKwkJJGMgPSBoZXgoJGMpOworCisJCSRvdXQgLj0gIlAgPSAkUFxuIjsKKwkJJG91dCAuPSAiUSA9ICRRXG4iOworCQkkb3V0IC49ICJHID0gJEdcbiI7CisJCSRvdXQgLj0gIlNlZWQgPSAkU2VlZFxuIjsKKwkJJG91dCAuPSAiYyA9ICRjXG4iOworCQkkb3V0IC49ICJIID0gJEhcblxuIjsKKwl9CisKKwlyZXR1cm4gJG91dDsKK30KKworCisjIERTQSBTaWdHZW4gdGVzdAorIyAkMTogTWVzc2FnZSB0byBiZSBzaWduZWQgaW4gaGV4IGZvcm0KKyMgJDI6IGZpbGUgbmFtZSB3aXRoIERTQSBrZXkgaW4gUEVNIGZvcm0KKyMgcmV0dXJuOiBzdHJpbmcgZm9ybWF0dGVkIGFzIGV4cGVjdGVkIGJ5IENBVlMKK3N1YiBkc2Ffc2lnZ2VuKCQkKSB7CisJbXkgJGRhdGEgPSBzaGlmdDsKKwlteSAka2V5ZmlsZSA9IHNoaWZ0OworCisJbXkgJG91dCA9ICIiOworCisJbXkgJXJldCA9ICYkZHNhX3NpZ24oJGRhdGEsICRrZXlmaWxlKTsKKworCSRvdXQgLj0gIk1zZyA9ICRkYXRhXG4iOworCSRvdXQgLj0gIlkgPSAiIC4gJHJldHsnWSd9IC4gIlxuIjsKKwkkb3V0IC49ICJSID0gIiAuICRyZXR7J1InfSAuICJcbiI7CisJJG91dCAuPSAiUyA9ICIgLiAkcmV0eydTJ30gLiAiXG4iOworCisJcmV0dXJuICRvdXQ7Cit9CisKKworIyBEU0Egc2lnbmF0dXJlIHZlcmlmaWNhdGlvbgorIyAkMSBtb2R1bHVzCisjICQyIFAKKyMgJDMgUQorIyAkNCBHCisjICQ1IFkgLSBwdWJsaWMga2V5CisjICQ2IHIKKyMgJDcgcworIyAkOCBtZXNzYWdlIHRvIGJlIHZlcmlmaWVkCisjIHJldHVybjogc3RyaW5nIGZvcm1hdHRlZCBhcyBleHBlY3RlZCBieSBDQVZTCitzdWIgZHNhX3NpZ3ZlcigkJCQkJCQkJCkgeworCW15ICRtb2R1bHVzID0gc2hpZnQ7CisJbXkgJHAgPSBzaGlmdDsKKwlteSAkcSA9IHNoaWZ0OworCW15ICRnID0gc2hpZnQ7CisJbXkgJHkgPSBzaGlmdDsKKwlteSAkciA9IHNoaWZ0OworCW15ICRzID0gc2hpZnQ7CisJbXkgJG1zZyA9IHNoaWZ0OworCisJbXkgJG91dCA9ICIiOworCisJI1BRRyBhcmUgYWxyZWFkeSBwcmludGVkIC0gZG8gbm90IHByaW50IHRoZW0gaGVyZQorCisJJG91dCAuPSAiTXNnID0gJG1zZ1xuIjsKKwkkb3V0IC49ICJZID0gJHlcbiI7CisJJG91dCAuPSAiUiA9ICRyXG4iOworCSRvdXQgLj0gIlMgPSAkc1xuIjsKKworCSMgWFhYIG1heWJlIGEgc2VjdXJlIHRlbXAgZmlsZSBuYW1lIGlzIGJldHRlciBoZXJlCisJIyBidXQgc2luY2UgaXQgaXMgbm90IHJ1biBvbiBhIHNlY3VyaXR5IHNlbnNpdGl2ZQorCSMgc3lzdGVtLCBJIGhvcGUgdGhhdCB0aGlzIGlzIGZpbmUKKwlteSAka2V5ZmlsZSA9ICJkc2Ffc2lndmVyLnRtcC4kJCI7CisJJiRkc2FfZ2VucHVia2V5KCRrZXlmaWxlLCAkcCwgJHEsICRnLCAkeSk7CisKKwkkb3V0IC49ICJSZXN1bHQgPSAiIC4gKCYkZHNhX3ZlcmlmeSgkbXNnLCAka2V5ZmlsZSwgJHIsICRzKSA/ICJQXG4iIDogIkZcbiIpOworCisJdW5saW5rKCRrZXlmaWxlKTsKKworCXJldHVybiAkb3V0OworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBQYXJzZXIgb2YgaW5wdXQgZmlsZSBhbmQgZ2VuZXJhdG9yIG9mIHJlc3VsdCBmaWxlCisjCisKK3N1YiB1c2FnZSgpIHsKKworCXByaW50IFNUREVSUiAiVXNhZ2U6CiskMCBbLVJdIFstRF0gWy1JIG5hbWVdIDxDQVZTLXRlc3QgdmVjdG9yIGZpbGU+CisKKy1SCWV4ZWN1dGlvbiBvZiBBUkNGT1VSIGluc3RlYWQgb2YgT3BlblNTTAorLUkgTkFNRQlVc2UgaW50ZXJmYWNlIHN0eWxlIE5BTUU6CisJCW9wZW5zc2wgICAgIE9wZW5TU0wgKGRlZmF1bHQpCisJCWxpYmdjcnlwdCAgIExpYmdjcnlwdAorLUQJU2lnR2VuIGFuZCBTaWdWZXIgYXJlIGV4ZWN1dGVkIHdpdGggRFNBCisJUGxlYXNlIG5vdGUgdGhhdCB0aGUgRFNBIENBVlMgdmVjdG9ycyBkbyBub3QgYWxsb3cgZGlzdGluZ3Vpc2hpbmcKKwl0aGVtIGZyb20gdGhlIFJTQSB2ZWN0b3JzLiBBcyB0aGUgUlNBIHRlc3QgaXMgdGhlIGRlZmF1bHQsIHlvdSBoYXZlCisJdG8gc3VwcGx5IHRoaXMgb3B0aW9uIHRvIGFwcGx5IHRoZSBEU0EgbG9naWMiOworfQorCisjIFBhcnNlciBvZiBDQVZTIHRlc3QgdmVjdG9yIGZpbGUKKyMgJDE6IFRlc3QgdmVjdG9yIGZpbGUKKyMgJDI6IE91dHB1dCBmaWxlIGZvciB0ZXN0IHJlc3VsdHMKKyMgcmV0dXJuOiBub3RoaW5nCitzdWIgcGFyc2UoJCQpIHsKKwlteSAkaW5maWxlID0gc2hpZnQ7CisJbXkgJG91dGZpbGUgPSBzaGlmdDsKKworCW15ICRvdXQgPSAiIjsKKworCSMgdGhpcyBpcyBteSBjaXBoZXIvaGFzaCB0eXBlCisJbXkgJGNpcGhlciA9ICIiOworCisJIyBUZXN0IHR5cGUKKwkjIDEgLSBjaXBoZXIga25vd24gYW5zd2VyIHRlc3QKKwkjIDIgLSBjaXBoZXIgTW9udGUgQ2FybG8gdGVzdAorCSMgMyAtIGhhc2gga25vd24gYW5zd2VyIHRlc3QKKwkjIDQgLSBoYXNoIE1vbnRlIENhcmxvIHRlc3QKKwkjIDUgLSBSU0Egc2lnbmF0dXJlIGdlbmVyYXRpb24KKwkjIDYgLSBSU0Egc2lnbmF0dXJlIHZlcmlmaWNhdGlvbgorCW15ICR0dCA9IDA7CisKKwkjIFZhcmlhYmxlcyBmb3IgdGVzdHMKKwlteSAka2V5dHlwZSA9ICIiOyAjIHdlIGNhbiBoYXZlICJLRVkiLCAiS0VZcyIsICJLRVkxIgorCW15ICRrZXkxID0gIiI7CisJbXkgJGtleTIgPSB1bmRlZjsgI3VuZGVmIG5lZWRlZCBmb3IgYWxsb3dpbmcKKwlteSAka2V5MyA9IHVuZGVmOyAjdGhlIHVzZSBvZiB0aGVtIGFzIGlucHV0IHZhcmlhYmxlcworCW15ICRwdCA9ICIiOworCW15ICRlbmMgPSAxOworCW15ICRpdiA9ICIiOworCW15ICRsZW4gPSB1bmRlZjsgI3NlZSBrZXkyfDMKKwlteSAkbiA9ICIiOworCW15ICRlID0gIiI7CisJbXkgJHNpZ25hdHVyZSA9ICIiOworCW15ICRyc2Ffa2V5ZmlsZSA9ICIiOworCW15ICRkc2Ffa2V5ZmlsZSA9ICIiOworCW15ICRkdCA9ICIiOworCW15ICR2ID0gIiI7CisJbXkgJGtsZW4gPSAiIjsKKwlteSAkdGxlbiA9ICIiOworCW15ICRtb2R1bHVzID0gIiI7CisJbXkgJGNhcGl0YWxfbiA9IDA7CisJbXkgJGNhcGl0YWxfcCA9ICIiOworCW15ICRjYXBpdGFsX3EgPSAiIjsKKwlteSAkY2FwaXRhbF9nID0gIiI7CisJbXkgJGNhcGl0YWxfeSA9ICIiOworCW15ICRjYXBpdGFsX3IgPSAiIjsKKwlteSAkeHAxID0gIiI7CisJbXkgJHhwMiA9ICIiOworCW15ICRYcCA9ICIiOworCW15ICR4cTEgPSAiIjsKKwlteSAkeHEyID0gIiI7CisJbXkgJFhxID0gIiI7CisKKwlteSAkbW9kZSA9ICIiOworCisJb3BlbihJTiwgIjwkaW5maWxlIik7CisJd2hpbGUoPElOPikgeworCisJCW15ICRsaW5lID0gJF87CisJCWNob21wKCRsaW5lKTsKKwkJJGxpbmUgPX4gcy9cci8vOworCisJCW15ICRrZXlsZW4gPSAiIjsKKworCQkjIE1vZGUgYW5kIHR5cGUgY2hlY2sKKwkJIyBjb25zaWRlciB0aGUgZm9sbG93aW5nIHBhcnNlZCBsaW5lCisJCSMgJyMgQUVTVlMgTUNUIHRlc3QgZGF0YSBmb3IgQ0JDJworCQkjICcjIFRERVMgTXVsdGkgYmxvY2sgTWVzc2FnZSBUZXN0IGZvciBDQkMnCisJCSMgJyMgSU5WRVJTRSBQRVJNVVRBVElPTiAtIEtBVCBmb3IgQ0JDJworCQkjICcjIFNVQlNUSVRVVElPTiBUQUJMRSAtIEtBVCBmb3IgQ0JDJworCQkjICcjIFRERVMgTW9udGUgQ2FybG8gKE1vZGVzKSBUZXN0IGZvciBDQkMnCisJCSMgJyMgICJTSEEtMSBNb250ZSIgaW5mb3JtYXRpb24gZm9yICJJQk1SSEVMNSInCisJCSMgJyMgIlNpZ1ZlciBQS0NTIzEgVmVyIDEuNSIgaW5mb3JtYXRpb24gZm9yICJJQk1SSEVMNSInCisJCSMgJyMgIlNpZ0dlbiBQS0NTIzEgVmVyIDEuNSIgaW5mb3JtYXRpb24gZm9yICJJQk1SSEVMNSInCisJCSMgJyNSQzRWUyBNQ1QgdGVzdCBkYXRhJworCQkKKwkJIyBhdm9pZCBmYWxzZSBwb3NpdGl2ZXMgZnJvbSB1c2VyIHNwZWNpZmllZCAnZm9yICJQUk9EVUNUIicgc3RyaW5ncworCQlteSAkdG1wbGluZSA9ICRsaW5lOworCQkkdG1wbGluZSA9fiBzLyBmb3IgIi4qIi8vOworCisJCSMjIyMjIEV4dHJhY3QgY2lwaGVyCisJCSMgWFhYIHRoZXJlIG1heSBiZSBtb3JlIC0gdG8gYmUgYWRkZWQKKwkJaWYgKCR0bXBsaW5lID1+IC9eIy4qKENCQ3xFQ0J8T0ZCfENGQnxTSEEtfFNpZ0dlbnxTaWdWZXJ8UkM0VlN8QU5TSSBYOVwuMzF8SGFzaCBzaXplcyB0ZXN0ZWR8UFFHR2VufEtleUdlbiBSU0EpLykgeworCQkJaWYgKCR0bXBsaW5lICAgID1+IC9DQkMvKSAgIHsgJG1vZGU9ImNiYyI7IH0KKwkJCWVsc2lmICgkdG1wbGluZSA9fiAvRUNCLykgICB7ICRtb2RlPSJlY2IiOyB9CisJCQllbHNpZiAoJHRtcGxpbmUgPX4gL09GQi8pICAgeyAkbW9kZT0ib2ZiIjsgfQorCQkJZWxzaWYgKCR0bXBsaW5lID1+IC9DRkIvKSAgIHsgJG1vZGU9ImNmYiI7IH0KKwkJCSN3ZSBkbyBub3QgbmVlZCBtb2RlIGFzIHRoZSBjaXBoZXIgaXMgYWxyZWFkeSBjbGVhcgorCQkJZWxzaWYgKCR0bXBsaW5lID1+IC9TSEEtMS8pIHsgJGNpcGhlcj0ic2hhMSI7IH0KKwkJCWVsc2lmICgkdG1wbGluZSA9fiAvU0hBLTIyNC8pIHsgJGNpcGhlcj0ic2hhMjI0IjsgfQorCQkJZWxzaWYgKCR0bXBsaW5lID1+IC9TSEEtMjU2LykgeyAkY2lwaGVyPSJzaGEyNTYiOyB9CisJCQllbHNpZiAoJHRtcGxpbmUgPX4gL1NIQS0zODQvKSB7ICRjaXBoZXI9InNoYTM4NCI7IH0KKwkJCWVsc2lmICgkdG1wbGluZSA9fiAvU0hBLTUxMi8pIHsgJGNpcGhlcj0ic2hhNTEyIjsgfQorCQkJI3dlIGRvIG5vdCBuZWVkIG1vZGUgYXMgdGhlIGNpcGhlciBpcyBhbHJlYWR5IGNsZWFyCisJCQllbHNpZiAoJHRtcGxpbmUgPX4gL1JDNFZTLykgeyAkY2lwaGVyPSJyYzQiOyB9CisJCQllbHNpZiAoJHRtcGxpbmUgPX4gL1NpZ0dlbnxTaWdWZXIvKSB7CisJCQkJZGllICJFcnJvcjogWDkuMzEgaXMgbm90IHN1cHBvcnRlZCIKKwkJCQkJaWYgKCR0bXBsaW5lID1+IC9YOS8pOworCQkJCSRjaXBoZXI9InNoYTEiOyAjcGxhY2UgaG9sZGVyIC0gbWlnaHQgYmUgb3ZlcndyaXR0ZW4gbGF0ZXIKKwkJCX0KKworCQkJaWYgKCR0bXBsaW5lID1+IC9eIy4qQUVTVlMvKSB7CisJCQkJIyBBRVMgY2lwaGVyIChwYXJ0IG9mIGl0KQorCQkJCSRjaXBoZXI9ImFlcyI7CisJCQl9CisJCQlpZiAoJHRtcGxpbmUgPX4gL14jLiooVERFU3xLQVQpLykgeworCQkJCSMgVERFUyBjaXBoZXIgKGZ1bGwgZGVmaW5pdGlvbikKKwkJCQkjIHRoZSBGSVBTLTE0MCB0ZXN0IGdlbmVyYXRvciB0b29sIGRvZXMgbm90IHByb2R1Y2UKKwkJCQkjIG1hY2hpbmUgcmVhZGFibGUgb3V0cHV0IQorCQkJCWlmICgkbW9kZSBlcSAiY2JjIikgeyAkY2lwaGVyPSJkZXMtZWRlMy1jYmMiOyB9CisJCQkJaWYgKCRtb2RlIGVxICJlY2IiKSB7ICRjaXBoZXI9ImRlcy1lZGUzIjsgfQorCQkJCWlmICgkbW9kZSBlcSAib2ZiIikgeyAkY2lwaGVyPSJkZXMtZWRlMy1vZmIiOyB9CisJCQkJaWYgKCRtb2RlIGVxICJjZmIiKSB7ICRjaXBoZXI9ImRlcy1lZGUzLWNmYiI7IH0KKwkJCX0KKworCQkJIyBjaGVjayBmb3IgUk5HCisJCQlpZiAoJHRtcGxpbmUgPX4gL0FOU0kgWDlcLjMxLykgeworCQkJCSMgY2hhbmdlIHRoZSB0bXBsaW5lIHRvIGFkZCB0aGUgdHlwZSBvZiB0aGUKKwkJCQkjIHRlc3Qgd2hpY2ggaXMgT05MWSB2aXNpYmxlIGZyb20gdGhlIGZpbGUKKwkJCQkjIG5hbWUgOi0oCisJCQkJaWYgKCRpbmZpbGUgPX4gL01DVFwucmVxLykgeworCQkJCQkkdG1wbGluZSAuPSAiIE1DVCI7CisJCQkJfSBlbHNpZiAoJGluZmlsZSA9fiAvVlNUXC5yZXEvKSB7CisJCQkJCSR0bXBsaW5lIC49ICIgVlNUIjsKKwkJCQl9IGVsc2UgeworCQkJCQlkaWUgIlVuZXhwZWN0ZWQgY2lwaGVyIHR5cGUgd2l0aCAkaW5maWxlIjsKKwkJCQl9CisJCQl9CisKKwkJCWlmICgkdHQgPT0gMCkgeworCQkJIyMjIyMgSWRlbnRpZnkgdGhlIHRlc3QgdHlwZQorCQkJCWlmICgkdG1wbGluZSA9fiAvS2V5R2VuIFJTQSBcKFg5XC4zMVwpLykgeworCQkJCQkkdHQgPSAxMzsKKwkJCQkJZGllICJJbnRlcmZhY2UgZnVuY3Rpb24gcnNhX2Rlcml2ZSBmb3IgUlNBIGtleSBnZW5lcmF0aW9uIG5vdCBkZWZpbmVkIGZvciB0ZXN0ZWQgbGlicmFyeSIKKwkJCQkJCWlmICghZGVmaW5lZCgkcnNhX2Rlcml2ZSkpOworCQkJCX0gZWxzaWYgKCR0bXBsaW5lID1+IC9TaWdWZXIvICYmICRvcHR7J0QnfSApIHsKKwkJCQkJJHR0ID0gMTI7CisJCQkJCWRpZSAiSW50ZXJmYWNlIGZ1bmN0aW9uIGRzYV92ZXJpZnkgb3IgZHNhX2dlbnB1YmtleSBmb3IgRFNBIHZlcmlmaWNhdGlvbiBub3QgZGVmaW5lZCBmb3IgdGVzdGVkIGxpYnJhcnkiCisJCQkJCQlpZiAoIWRlZmluZWQoJGRzYV92ZXJpZnkpIHx8ICFkZWZpbmVkKCRkc2FfZ2VucHVia2V5KSk7CisJCQkJfSBlbHNpZiAoJHRtcGxpbmUgPX4gL1NpZ0dlbi8gJiYgJG9wdHsnRCd9KSB7CisJCQkJCSR0dCA9IDExOworCQkJCQlkaWUgIkludGVyZmFjZSBmdW5jdGlvbiBkc2Ffc2lnbiBvciBnZW5fZHNha2V5IGZvciBEU0Egc2lnbiBub3QgZGVmaW5lZCBmb3IgdGVzdGVkIGxpYnJhcnkiCisJCQkJCQlpZiAoIWRlZmluZWQoJGRzYV9zaWduKSB8fCAhZGVmaW5lZCgkZ2VuX3JzYWtleSkpOworCQkJCX0gZWxzaWYgKCR0bXBsaW5lID1+IC9QUUdHZW4vKSB7CisJCQkJCSR0dCA9IDEwOworCQkJCQlkaWUgIkludGVyZmFjZSBmdW5jdGlvbiBmb3IgRFNBIFBRR0dlbiB0ZXN0aW5nIG5vdCBkZWZpbmVkIGZvciB0ZXN0ZWQgbGlicmFyeSIKKwkJCQkJCWlmICghZGVmaW5lZCgkZHNhX3BxZ2dlbikpOworCQkJCX0gZWxzaWYgKCR0bXBsaW5lID1+IC9IYXNoIHNpemVzIHRlc3RlZC8pIHsKKwkJCQkJJHR0ID0gOTsKKwkJCQkJZGllICJJbnRlcmZhY2UgZnVuY3Rpb24gaG1hYyBmb3IgSE1BQyB0ZXN0aW5nIG5vdCBkZWZpbmVkIGZvciB0ZXN0ZWQgbGlicmFyeSIKKwkJCQkJCWlmICghZGVmaW5lZCgkaG1hYykpOworCQkJCX0gZWxzaWYgKCR0bXBsaW5lID1+IC9BTlNJIFg5XC4zMS8gJiYgJHRtcGxpbmUgPX4gL01DVC8pIHsKKwkJCQkJJHR0ID0gODsKKwkJCQkJZGllICJJbnRlcmZhY2UgZnVuY3Rpb24gc3RhdGVfcm5nIGZvciBSTkcgTUNUIG5vdCBkZWZpbmVkIGZvciB0ZXN0ZWQgbGlicmFyeSIKKwkJCQkJCWlmICghZGVmaW5lZCgkc3RhdGVfcm5nKSk7CisJCQkJfSBlbHNpZiAoJHRtcGxpbmUgPX4gL0FOU0kgWDlcLjMxLyAmJiAkdG1wbGluZSA9fiAvVlNULykgeworCQkJCQkkdHQgPSA3OworCQkJCQlkaWUgIkludGVyZmFjZSBmdW5jdGlvbiBzdGF0ZV9ybmcgZm9yIFJORyBLQVQgbm90IGRlZmluZWQgZm9yIHRlc3RlZCBsaWJyYXJ5IgorCQkJCQkJaWYgKCFkZWZpbmVkKCRzdGF0ZV9ybmcpKTsKKwkJCQl9IGVsc2lmICgkdG1wbGluZSA9fiAvU2lnVmVyLyApIHsKKwkJCQkJJHR0ID0gNjsKKwkJCQkJZGllICJJbnRlcmZhY2UgZnVuY3Rpb24gcnNhX3ZlcmlmeSBvciBnZW5fcnNha2V5IGZvciBSU0EgdmVyaWZpY2F0aW9uIG5vdCBkZWZpbmVkIGZvciB0ZXN0ZWQgbGlicmFyeSIKKwkJCQkJCWlmICghZGVmaW5lZCgkcnNhX3ZlcmlmeSkgfHwgIWRlZmluZWQoJGdlbl9yc2FrZXkpKTsKKwkJCQl9IGVsc2lmICgkdG1wbGluZSA9fiAvU2lnR2VuLyApIHsKKwkJCQkJJHR0ID0gNTsKKwkJCQkJZGllICJJbnRlcmZhY2UgZnVuY3Rpb24gcnNhX3NpZ24gb3IgZ2VuX3JzYWtleSBmb3IgUlNBIHNpZ24gbm90IGRlZmluZWQgZm9yIHRlc3RlZCBsaWJyYXJ5IgorCQkJCQkJaWYgKCFkZWZpbmVkKCRyc2Ffc2lnbikgfHwgIWRlZmluZWQoJGdlbl9yc2FrZXkpKTsKKwkJCQl9IGVsc2lmICgkdG1wbGluZSA9fiAvTW9udGV8TUNUfENhcmxvLyAmJiAkY2lwaGVyID1+IC9ec2hhLykgeworCQkJCQkkdHQgPSA0OworCQkJCQlkaWUgIkludGVyZmFjZSBmdW5jdGlvbiBoYXNoIGZvciBIYXNoaW5nIG5vdCBkZWZpbmVkIGZvciB0ZXN0ZWQgbGlicmFyeSIKKwkJCQkJCWlmICghZGVmaW5lZCgkaGFzaCkpOworCQkJCX0gZWxzaWYgKCR0bXBsaW5lID1+IC9Nb250ZXxNQ1R8Q2FybG8vKSB7CisJCQkJCSR0dCA9IDI7CisJCQkJCWRpZSAiSW50ZXJmYWNlIGZ1bmN0aW9uIHN0YXRlX2NpcGhlciBmb3IgU3RhdGVmdWwgQ2lwaGVyIG9wZXJhdGlvbiBkZWZpbmVkIGZvciB0ZXN0ZWQgbGlicmFyeSIKKwkJCQkJCWlmICghZGVmaW5lZCgkc3RhdGVfY2lwaGVyKSB8fCAhZGVmaW5lZCgkc3RhdGVfY2lwaGVyX2RlcykpOworCQkJCX0gZWxzaWYgKCRjaXBoZXIgPX4gL15zaGEvKSB7CisJCQkJCSR0dCA9IDM7CisJCQkJCWRpZSAiSW50ZXJmYWNlIGZ1bmN0aW9uIGhhc2ggZm9yIEhhc2hpbmcgbm90IGRlZmluZWQgZm9yIHRlc3RlZCBsaWJyYXJ5IgorCQkJCQkJaWYgKCFkZWZpbmVkKCRoYXNoKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJJHR0ID0gMTsKKwkJCQkJZGllICJJbnRlcmZhY2UgZnVuY3Rpb24gZW5jZGVjIGZvciBFbmNyeXB0aW9uL0RlY3J5cHRpb24gbm90IGRlZmluZWQgZm9yIHRlc3RlZCBsaWJyYXJ5IgorCQkJCQkJaWYgKCFkZWZpbmVkKCRlbmNkZWMpKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkjIFRoaXMgaXMgbmVlZGVkIGFzIEFSQ0ZPVVIgZG9lcyBub3Qgb3BlcmF0ZSB3aXRoIGFuIElWCisJCSRpdiA9ICIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIgaWYgKCRjaXBoZXIgZXEgInJjNCIKKwkJCQkJCQkgICAgICYmICRpdiBlcSAiIiApOworCisJCSMgd2UgYXJlIG5vdyBsb29raW5nIGZvciB0aGUgc3RyaW5nCisJCSMgJyMgS2V5IExlbmd0aCA6IDI1NicKKwkJIyBmb3VuZCBpbiBBRVMKKwkJaWYgKCR0bXBsaW5lID1+IC9eIyBLZXkgTGVuZ3RoLio/KDEyOHwxOTJ8MjU2KS8pIHsKKwkJCWlmICgkY2lwaGVyIGVxICJhZXMiKSB7CisJCQkJJGNpcGhlcj0iJGNpcGhlci0kMS0kbW9kZSI7CisJCQl9IGVsc2UgeworCQkJCWRpZSAiRXJyb3I6IEtleSBsZW5ndGggJDEgZ2l2ZW4gZm9yIGNpcGhlciAkY2lwaGVyIHdoaWNoIGlzIHVuZXhwZWN0ZWQiOworCQkJfQorCQl9CisKKwkJIyBHZXQgdGhlIHRlc3QgZGF0YQorCQlpZiAoJGxpbmUgPX4gL14oS0VZfEtFWTF8S2V5KVxzKj1ccyooLiopLykgeyAjIGZvdW5kIGluIGNpcGhlcnMgYW5kIFJORworCQkJZGllICJLRVkgc2VlbiB0d2ljZSAtIGlucHV0IGZpbGUgY3JhcCIgaWYgKCRrZXkxIG5lICIiKTsKKwkJCSRrZXl0eXBlPSQxOworCQkJJGtleTE9JDI7CisJCQkka2V5MSA9fiBzL1xzLy9nOyAjcmVwbGFjZSBwb3RlbnRpYWwgd2hpdGUgc3BhY2VzCisJCX0KKwkJZWxzaWYgKCRsaW5lID1+IC9eKEtFWXMpXHMqPVxzKiguKikvKSB7ICMgZm91bmQgaW4gY2lwaGVycyBhbmQgUk5HCisJCQlkaWUgIktFWSBzZWVuIHR3aWNlIC0gaW5wdXQgZmlsZSBjcmFwIiBpZiAoJGtleTEgbmUgIiIpOworCQkJJGtleXR5cGU9JDE7CisJCQkka2V5MT0kMjsKKwkJCSRrZXkxID1+IHMvXHMvL2c7ICNyZXBsYWNlIHBvdGVudGlhbCB3aGl0ZSBzcGFjZXMKKwkJCSRrZXkyID0gJGtleTE7CisJCQkka2V5MyA9ICRrZXkxOworCQl9CisJCWVsc2lmICgkbGluZSA9fiAvXktFWTJccyo9XHMqKC4qKS8pIHsgIyBmb3VuZCBpbiBUREVTCisJCQlkaWUgIkZpcnN0IGtleSBub3Qgc2V0LCBidXQgZ290IGFscmVhZHkgc2Vjb25kIGtleSAtIGlucHV0IGZpbGUgY3JhcCIgaWYgKCRrZXkxIGVxICIiKTsKKwkJCWRpZSAiS0VZMiBzZWVuIHR3aWNlIC0gaW5wdXQgZmlsZSBjcmFwIiBpZiAoZGVmaW5lZCgka2V5MikpOworCQkJJGtleTI9JDE7CisJCQkka2V5MiA9fiBzL1xzLy9nOyAjcmVwbGFjZSBwb3RlbnRpYWwgd2hpdGUgc3BhY2VzCisJCX0KKwkJZWxzaWYgKCRsaW5lID1+IC9eS0VZM1xzKj1ccyooLiopLykgeyAjIGZvdW5kIGluIFRERVMKKwkJCWRpZSAiU2Vjb25kIGtleSBub3Qgc2V0LCBidXQgZ290IGFscmVhZHkgdGhpcmQga2V5IC0gaW5wdXQgZmlsZSBjcmFwIiBpZiAoJGtleTIgZXEgIiIpOworCQkJZGllICJLRVkzIHNlZW4gdHdpY2UgLSBpbnB1dCBmaWxlIGNyYXAiIGlmIChkZWZpbmVkKCRrZXkzKSk7CisJCQkka2V5Mz0kMTsKKwkJCSRrZXkzID1+IHMvXHMvL2c7ICNyZXBsYWNlIHBvdGVudGlhbCB3aGl0ZSBzcGFjZXMKKwkJfQorCQllbHNpZiAoJGxpbmUgPX4gL15JVlxzKj1ccyooLiopLykgeyAjIGZvdW5kIGluIGNpcGhlcnMKKwkJCWRpZSAiSVYgc2VlbiB0d2ljZSAtIGlucHV0IGZpbGUgY3JhcCIgaWYgKCRpdiBuZSAiIik7CisJCQkkaXY9JDE7CisJCQkkaXYgPX4gcy9ccy8vZzsgI3JlcGxhY2UgcG90ZW50aWFsIHdoaXRlIHNwYWNlcworCQl9CisJCWVsc2lmICgkbGluZSA9fiAvXlBMQUlOVEVYVFxzKj1ccyooLiopLykgeyAjIGZvdW5kIGluIGNpcGhlcnMKKwkJCWlmICggJDEgIX4gL1w/LyApIHsgI29ubHkgdXNlIGl0IGlmIHRoZXJlIGlzIHZhbGlkIGhleCBkYXRhCisJCQkJZGllICJQTEFJTlRFWFQvQ0lQSEVSVEVYVCBzZWVuIHR3aWNlIC0gaW5wdXQgZmlsZSBjcmFwIiBpZiAoJHB0IG5lICIiKTsKKwkJCQkkcHQ9JDE7CisJCQkJJHB0ID1+IHMvXHMvL2c7ICNyZXBsYWNlIHBvdGVudGlhbCB3aGl0ZSBzcGFjZXMKKwkJCQkkZW5jPTE7CisJCQl9CisJCX0KKwkJZWxzaWYgKCRsaW5lID1+IC9eQ0lQSEVSVEVYVFxzKj1ccyooLiopLykgeyAjIGZvdW5kIGluIGNpcGhlcnMKKwkJCWlmICggJDEgIX4gL1w/LyApIHsgI29ubHkgdXNlIGl0IGlmIHRoZXJlIGlzIHZhbGlkIGhleCBkYXRhCisJCQkJZGllICJQTEFJTlRFWFQvQ0lQSEVSVEVYVCBzZWVuIHR3aWNlIC0gaW5wdXQgZmlsZSBjcmFwIiBpZiAoJHB0IG5lICIiKTsKKwkJCQkkcHQ9JDE7CisJCQkJJHB0ID1+IHMvXHMvL2c7ICNyZXBsYWNlIHBvdGVudGlhbCB3aGl0ZSBzcGFjZXMKKwkJCQkkZW5jPTA7CisJCQl9CisJCX0KKwkJZWxzaWYgKCRsaW5lID1+IC9eTGVuXHMqPVxzKiguKikvKSB7ICMgZm91bmQgaW4gaGFzaHMKKwkJCSRsZW49JDE7CisJCX0KKwkJZWxzaWYgKCRsaW5lID1+IC9eKE1zZ3xTZWVkKVxzKj1ccyooLiopLykgeyAjIGZvdW5kIGluIGhhc2hzCisJCQlkaWUgIk1zZy9TZWVkIHNlZW4gdHdpY2UgLSBpbnB1dCBmaWxlIGNyYXAiIGlmICgkcHQgbmUgIiIpOworCQkJJHB0PSQyOworCQl9CisJCWVsc2lmICgkbGluZSA9fiAvXlxbbW9kXHMqPVxzKiguKilcXSQvKSB7ICMgZm91bmQgaW4gUlNBIHJlcXVlc3RzCisJCQkkbW9kdWx1cyA9ICQxOworCQkJJG91dCAuPSAkbGluZSAuICJcblxuIjsgIyBwcmludCBpdAorCQkJIyBnZW5lcmF0ZSB0aGUgcHJpdmF0ZSBrZXkgd2l0aCBnaXZlbiBiaXQgbGVuZ3RoIG5vdworCQkJIyBhcyB3ZSBoYXZlIHRoZSByZXF1aXJlZCBrZXkgbGVuZ3RoIGluIGJpdAorCQkJaWYgKCR0dCA9PSAxMSkgeworCQkJCSRkc2Ffa2V5ZmlsZSA9ICJkc2Ffc2lnZ2VuLnRtcC4kJCI7CisJCQkJbXkgJXBxZyA9ICYkZ2VuX2RzYWtleSgkZHNhX2tleWZpbGUpOworCQkJCSRvdXQgLj0gIlAgPSAiIC4gJHBxZ3snUCd9IC4gIlxuIjsKKwkJCQkkb3V0IC49ICJRID0gIiAuICRwcWd7J1EnfSAuICJcbiI7CisJCQkJJG91dCAuPSAiRyA9ICIgLiAkcHFneydHJ30gLiAiXG4iOworCQkJfSBlbHNpZiAoICR0dCA9PSA1ICkgeworCQkJCSMgWFhYIG1heWJlIGEgc2VjdXJlIHRlbXAgZmlsZSBuYW1lIGlzIGJldHRlciBoZXJlCisJCQkJIyBidXQgc2luY2UgaXQgaXMgbm90IHJ1biBvbiBhIHNlY3VyaXR5IHNlbnNpdGl2ZQorCQkJCSMgc3lzdGVtLCBJIGhvcGUgdGhhdCB0aGlzIGlzIGZpbmUKKwkJCQkkcnNhX2tleWZpbGUgPSAicnNhX3NpZ2dlbi50bXAuJCQiOworCQkJCSYkZ2VuX3JzYWtleSgkbW9kdWx1cywgJHJzYV9rZXlmaWxlKTsKKwkJCQlteSAkbW9kdWx1cyA9IHBpcGVfdGhyb3VnaF9wcm9ncmFtKCIiLCAib3BlbnNzbCByc2EgLXB1Ym91dCAtbW9kdWx1cyAtaW4gJHJzYV9rZXlmaWxlIik7CisJCQkJJG1vZHVsdXMgPX4gcy9Nb2R1bHVzPSguKj8pXHMoLnxccykqLyQxLzsKKwkJCQkkb3V0IC49ICJuID0gJG1vZHVsdXNcbiI7CisJICAgICAgICAJICAgICAgICAkb3V0IC49ICJcbmUgPSAxMDAwMVxuIgorCQkJfQorCQl9CisJCWVsc2lmICgkbGluZSA9fiAvXlNIQUFsZ1xzKj1ccyooLiopLykgeyAjZm91bmQgaW4gUlNBIHJlcXVlc3RzCisJCQkkY2lwaGVyPSQxOworCQl9CisJCWVsc2lmKCRsaW5lID1+IC9eblxzKj1ccyooLiopLykgeyAjIGZvdW5kIGluIFJTQSByZXF1ZXN0cworCQkJJG91dCAuPSAkbGluZSAuICJcbiI7CisJCQkkbj0kMTsKKwkJfQorCQllbHNpZiAoJGxpbmUgPX4gL15lXHMqPVxzKiguKikvKSB7ICMgZm91bmQgaW4gUlNBIHJlcXVlc3RzCisJCQkkZT0kMTsKKwkJfQorCQllbHNpZiAoJGxpbmUgPX4gL15TXHMqPVxzKiguKikvKSB7ICMgZm91bmQgaW4gUlNBIHJlcXVlc3RzCisJCQlkaWUgIlMgc2VlbiB0d2ljZSAtIGlucHV0IGZpbGUgY3JhcCIgaWYgKCRzaWduYXR1cmUgbmUgIiIpOworCQkJJHNpZ25hdHVyZT0kMTsKKwkJfQorCQllbHNpZiAoJGxpbmUgPX4gL15EVFxzKj1ccyooLiopLykgeyAjIFg5LjMxIFJORyByZXF1ZXN0cworCQkJZGllICJEVCBzZWVuIHR3aWNlIC0gY2hlY2sgaW5wdXQgZmlsZSIKKwkJCQlpZiAoJGR0IG5lICIiKTsKKwkJCSRkdD0kMTsKKwkJfQorCQllbHNpZiAoJGxpbmUgPX4gL15WXHMqPVxzKiguKikvKSB7ICMgWDkuMzEgUk5HIHJlcXVlc3RzCisJCQlkaWUgIlYgc2VlbiB0d2ljZSAtIGNoZWNrIGlucHV0IGZpbGUiCisJCQkJaWYgKCR2IG5lICIiKTsKKwkJCSR2PSQxOworCQl9CisJCWVsc2lmICgkbGluZSA9fiAvXktsZW5ccyo9XHMqKC4qKS8pIHsgIyBITUFDIHJlcXVlc3RzCisJCQlkaWUgIktsZW4gc2VlbiB0d2ljZSAtIGNoZWNrIGlucHV0IGZpbGUiCisJCQkJaWYgKCRrbGVuIG5lICIiKTsKKwkJCSRrbGVuPSQxOworCQl9CisJCWVsc2lmICgkbGluZSA9fiAvXlRsZW5ccyo9XHMqKC4qKS8pIHsgIyBITUFDIFJORyByZXF1ZXN0cworCQkJZGllICJUbGVuIHNlZW4gdHdpY2UgLSBjaGVjayBpbnB1dCBmaWxlIgorCQkJCWlmICgkdGxlbiBuZSAiIik7CisJCQkkdGxlbj0kMTsKKwkJfQorCQllbHNpZiAoJGxpbmUgPX4gL15OXHMqPVxzKiguKikvKSB7ICNEU0EgUFFHR2VuCisJCQlkaWUgIk4gc2VlbiB0d2ljZSAtIGNoZWNrIGlucHV0IGZpbGUiCisJCQkJaWYgKCRjYXBpdGFsX24pOworCQkJJGNhcGl0YWxfbiA9ICQxOworCQl9CisJCWVsc2lmICgkbGluZSA9fiAvXlBccyo9XHMqKC4qKS8pIHsgI0RTQSBTaWdWZXIKKwkJCWRpZSAiUCBzZWVuIHR3aWNlIC0gY2hlY2sgaW5wdXQgZmlsZSIKKwkJCQlpZiAoJGNhcGl0YWxfcCk7CisJCQkkY2FwaXRhbF9wID0gJDE7CisJCQkkb3V0IC49ICRsaW5lIC4gIlxuIjsgIyBwcmludCBpdAorCQl9CisJCWVsc2lmICgkbGluZSA9fiAvXlFccyo9XHMqKC4qKS8pIHsgI0RTQSBTaWdWZXIKKwkJCWRpZSAiUSBzZWVuIHR3aWNlIC0gY2hlY2sgaW5wdXQgZmlsZSIKKwkJCQlpZiAoJGNhcGl0YWxfcSk7CisJCQkkY2FwaXRhbF9xID0gJDE7CisJCQkkb3V0IC49ICRsaW5lIC4gIlxuIjsgIyBwcmludCBpdAorCQl9CisJCWVsc2lmICgkbGluZSA9fiAvXkdccyo9XHMqKC4qKS8pIHsgI0RTQSBTaWdWZXIKKwkJCWRpZSAiRyBzZWVuIHR3aWNlIC0gY2hlY2sgaW5wdXQgZmlsZSIKKwkJCQlpZiAoJGNhcGl0YWxfZyk7CisJCQkkY2FwaXRhbF9nID0gJDE7CisJCQkkb3V0IC49ICRsaW5lIC4gIlxuIjsgIyBwcmludCBpdAorCQl9CisJCWVsc2lmICgkbGluZSA9fiAvXllccyo9XHMqKC4qKS8pIHsgI0RTQSBTaWdWZXIKKwkJCWRpZSAiWSBzZWVuIHR3aWNlIC0gY2hlY2sgaW5wdXQgZmlsZSIKKwkJCQlpZiAoJGNhcGl0YWxfeSk7CisJCQkkY2FwaXRhbF95ID0gJDE7CisJCX0KKwkJZWxzaWYgKCRsaW5lID1+IC9eUlxzKj1ccyooLiopLykgeyAjRFNBIFNpZ1ZlcgorCQkJZGllICJSIHNlZW4gdHdpY2UgLSBjaGVjayBpbnB1dCBmaWxlIgorCQkJCWlmICgkY2FwaXRhbF9yKTsKKwkJCSRjYXBpdGFsX3IgPSAkMTsKKwkJfQorCQllbHNpZiAoJGxpbmUgPX4gL154cDFccyo9XHMqKC4qKS8pIHsgI1JTQSBrZXkgZ2VuCisJCQlkaWUgInhwMSBzZWVuIHR3aWNlIC0gY2hlY2sgaW5wdXQgZmlsZSIKKwkJCQlpZiAoJHhwMSk7CisJCQkkeHAxID0gJDE7CisJCX0KKwkJZWxzaWYgKCRsaW5lID1+IC9eeHAyXHMqPVxzKiguKikvKSB7ICNSU0Ega2V5IGdlbgorCQkJZGllICJ4cDIgc2VlbiB0d2ljZSAtIGNoZWNrIGlucHV0IGZpbGUiCisJCQkJaWYgKCR4cDIpOworCQkJJHhwMiA9ICQxOworCQl9CisJCWVsc2lmICgkbGluZSA9fiAvXlhwXHMqPVxzKiguKikvKSB7ICNSU0Ega2V5IGdlbgorCQkJZGllICJYcCBzZWVuIHR3aWNlIC0gY2hlY2sgaW5wdXQgZmlsZSIKKwkJCQlpZiAoJFhwKTsKKwkJCSRYcCA9ICQxOworCQl9CisJCWVsc2lmICgkbGluZSA9fiAvXnhxMVxzKj1ccyooLiopLykgeyAjUlNBIGtleSBnZW4KKwkJCWRpZSAieHExIHNlZW4gdHdpY2UgLSBjaGVjayBpbnB1dCBmaWxlIgorCQkJCWlmICgkeHExKTsKKwkJCSR4cTEgPSAkMTsKKwkJfQorCQllbHNpZiAoJGxpbmUgPX4gL154cTJccyo9XHMqKC4qKS8pIHsgI1JTQSBrZXkgZ2VuCisJCQlkaWUgInhxMiBzZWVuIHR3aWNlIC0gY2hlY2sgaW5wdXQgZmlsZSIKKwkJCQlpZiAoJHhxMik7CisJCQkkeHEyID0gJDE7CisJCX0KKwkJZWxzaWYgKCRsaW5lID1+IC9eWHFccyo9XHMqKC4qKS8pIHsgI1JTQSBrZXkgZ2VuCisJCQlkaWUgIlhxIHNlZW4gdHdpY2UgLSBjaGVjayBpbnB1dCBmaWxlIgorCQkJCWlmICgkWHEpOworCQkJJFhxID0gJDE7CisJCX0KKwkJZWxzZSB7CisJCQkkb3V0IC49ICRsaW5lIC4gIlxuIjsKKwkJfQorCisJCSMgY2FsbCB0ZXN0cyBpZiBhbGwgaW5wdXQgZGF0YSBpcyB0aGVyZQorCQlpZiAoJHR0ID09IDEpIHsKKyAJCQlpZiAoJGtleTEgbmUgIiIgJiYgJHB0IG5lICIiICYmICRjaXBoZXIgbmUgIiIpIHsKKwkJCQkkb3V0IC49IGthdCgka2V5dHlwZSwgJGtleTEsICRrZXkyLCAka2V5MywgJGl2LCAkcHQsICRjaXBoZXIsICRlbmMpOworCQkJCSRrZXl0eXBlID0gIiI7CisJCQkJJGtleTEgPSAiIjsKKwkJCQkka2V5MiA9IHVuZGVmOworCQkJCSRrZXkzID0gdW5kZWY7CisJCQkJJGl2ID0gIiI7CisJCQkJJHB0ID0gIiI7CisJCQl9CisJCX0KKwkJZWxzaWYgKCR0dCA9PSAyKSB7CisJCQlpZiAoJGtleTEgbmUgIiIgJiYgJHB0IG5lICIiICYmICRjaXBoZXIgbmUgIiIpIHsKKwkJCQkkb3V0IC49IGNyeXB0b19tY3QoJGtleXR5cGUsICRrZXkxLCAka2V5MiwgJGtleTMsICRpdiwgJHB0LCAkY2lwaGVyLCAkZW5jKTsKKwkJCQkka2V5dHlwZSA9ICIiOworCQkJCSRrZXkxID0gIiI7CisJCQkJJGtleTIgPSB1bmRlZjsKKwkJCQkka2V5MyA9IHVuZGVmOworCQkJCSRpdiA9ICIiOworCQkJCSRwdCA9ICIiOworCQkJfQorCQl9CisJCWVsc2lmICgkdHQgPT0gMykgeworCQkJaWYgKCRwdCBuZSAiIiAmJiAkY2lwaGVyIG5lICIiKSB7CisJCQkJJG91dCAuPSBoYXNoX2thdCgkcHQsICRjaXBoZXIsICRsZW4pOworCQkJCSRwdCA9ICIiOworCQkJCSRsZW4gPSB1bmRlZjsKKwkJCX0KKwkJfQorCQllbHNpZiAoJHR0ID09IDQpIHsKKwkJCWlmICgkcHQgbmUgIiIgJiYgJGNpcGhlciBuZSAiIikgeworCQkJCSRvdXQgLj0gaGFzaF9tY3QoJHB0LCAkY2lwaGVyKTsKKwkJCQkkcHQgPSAiIjsKKwkJCX0KKwkJfQorCQllbHNpZiAoJHR0ID09IDUpIHsKKwkJCWlmICgkcHQgbmUgIiIgJiYgJGNpcGhlciBuZSAiIiAmJiAkcnNhX2tleWZpbGUgbmUgIiIpIHsKKwkJCQkkb3V0IC49IHJzYV9zaWdnZW4oJHB0LCAkY2lwaGVyLCAkcnNhX2tleWZpbGUpOworCQkJCSRwdCA9ICIiOworCQkJfQorCQl9CisJCWVsc2lmICgkdHQgPT0gNikgeworCQkJaWYgKCRwdCBuZSAiIiAmJiAkY2lwaGVyIG5lICIiICYmICRzaWduYXR1cmUgbmUgIiIgJiYgJG4gbmUgIiIgJiYgJGUgbmUgIiIpIHsKKwkJCQkkb3V0IC49IHJzYV9zaWd2ZXIoJHB0LCAkY2lwaGVyLCAkc2lnbmF0dXJlLCAkbiwgJGUpOworCQkJCSRwdCA9ICIiOworCQkJCSRzaWduYXR1cmUgPSAiIjsKKwkJCX0KKwkJfQorCQllbHNpZiAoJHR0ID09IDcgKSB7CisJCQlpZiAoJGtleTEgbmUgIiIgJiYgJGR0IG5lICIiICYmICR2IG5lICIiKSB7CisJCQkJJG91dCAuPSBybmd4OTMxKCRrZXkxLCAkZHQsICR2LCAiVlNUIik7CisJCQkJJGtleTEgPSAiIjsKKwkJCQkkZHQgPSAiIjsKKwkJCQkkdiA9ICIiOworCQkJfQorCQl9CisJCWVsc2lmICgkdHQgPT0gOCApIHsKKwkJCWlmICgka2V5MSBuZSAiIiAmJiAkZHQgbmUgIiIgJiYgJHYgbmUgIiIpIHsKKwkJCQkkb3V0IC49IHJuZ3g5MzEoJGtleTEsICRkdCwgJHYsICJNQ1QiKTsKKwkJCQkka2V5MSA9ICIiOworCQkJCSRkdCA9ICIiOworCQkJCSR2ID0gIiI7CisJCQl9CisJCX0KKwkJZWxzaWYgKCR0dCA9PSA5KSB7CisJCQlpZiAoJGtsZW4gbmUgIiIgJiYgJHRsZW4gbmUgIiIgJiYgJGtleTEgbmUgIiIgJiYgJHB0IG5lICIiKSB7CisJCQkJJG91dCAuPSBobWFjX2thdCgka2xlbiwgJHRsZW4sICRrZXkxLCAkcHQpOworCQkJCSRrZXkxID0gIiI7CisJCQkJJHRsZW4gPSAiIjsKKwkJCQkka2xlbiA9ICIiOworCQkJCSRwdCA9ICIiOworCQkJfQorCQl9CisJCWVsc2lmICgkdHQgPT0gMTApIHsKKwkJCWlmICgkbW9kdWx1cyBuZSAiIiAmJiAkY2FwaXRhbF9uID4gMCkgeworCQkJCSRvdXQgLj0gZHNhX3BxZ2dlbl9kcml2ZXIoJG1vZHVsdXMsICRjYXBpdGFsX24pOworCQkJCSMkbW9kIGlzIG5vdCByZXNldHRlZAorCQkJCSRjYXBpdGFsX24gPSAwOworCQkJfQorCQl9CisJCWVsc2lmICgkdHQgPT0gMTEpIHsKKwkJCWlmICgkcHQgbmUgIiIgJiYgJGRzYV9rZXlmaWxlIG5lICIiKSB7CisJCQkJJG91dCAuPSBkc2Ffc2lnZ2VuKCRwdCwgJGRzYV9rZXlmaWxlKTsKKwkJCQkkcHQgPSAiIjsKKwkJCX0KKwkJfQorCQllbHNpZiAoJHR0ID09IDEyKSB7CisJCQlpZiAoJG1vZHVsdXMgbmUgIiIgJiYKKwkJCSAgICAkY2FwaXRhbF9wIG5lICIiICYmCisJCQkgICAgJGNhcGl0YWxfcSBuZSAiIiAmJgorCQkJICAgICRjYXBpdGFsX2cgbmUgIiIgJiYKKwkJCSAgICAkY2FwaXRhbF95IG5lICIiICYmCisJCQkgICAgJGNhcGl0YWxfciBuZSAiIiAmJgorCQkJICAgICRzaWduYXR1cmUgbmUgIiIgJiYKKwkJCSAgICAkcHQgbmUgIiIpIHsKKwkJCQkkb3V0IC49IGRzYV9zaWd2ZXIoJG1vZHVsdXMsCisJCQkJCSAJICAgJGNhcGl0YWxfcCwKKwkJCQkJCSAgICRjYXBpdGFsX3EsCisJCQkJCQkgICAkY2FwaXRhbF9nLAorCQkJCQkJICAgJGNhcGl0YWxfeSwKKwkJCQkJCSAgICRjYXBpdGFsX3IsCisJCQkJCQkgICAkc2lnbmF0dXJlLAorCQkJCQkJICAgJHB0KTsKKworCQkJCSMgV2UgZG8gbm90IGNsZWFyIHRoZSBkb21haW4gdmFsdWVzIFBRRyBhbmQKKwkJCQkjIHRoZSBtb2R1bHVzIHZhbHVlIGFzIHRoZXkKKwkJCQkjIGFyZSBzcGVjaWZpZWQgb25seSBvbmNlIGluIGEgZmlsZQorCQkJCSMgYW5kIHdlIGRvIG5vdCBuZWVkIHRvIHByaW50IHRoZW0gYXMgdGhleQorCQkJCSMgYXJlIGFscmVhZHkgcHJpbnRlZCBhYm92ZQorCQkJCSRjYXBpdGFsX3kgPSAiIjsKKwkJCQkkY2FwaXRhbF9yID0gIiI7CisJCQkJJHNpZ25hdHVyZSA9ICIiOworCQkJCSRwdCA9ICIiOworCQkJfQorCQl9CisJCWVsc2lmICgkdHQgPT0gMTMpIHsKKwkJCWlmKCRtb2R1bHVzIG5lICIiICYmCisJCQkgICAkZSBuZSAiIiAmJgorCQkJICAgJHhwMSBuZSAiIiAmJgorCQkJICAgJHhwMiBuZSAiIiAmJgorCQkJICAgJFhwIG5lICIiICYmCisJCQkgICAkeHExIG5lICIiICYmCisJCQkgICAkeHEyIG5lICIiICYmCisJCQkgICAkWHEgbmUgIiIpIHsKKwkJCQkkb3V0IC49IHJzYV9rZXlnZW4oJG1vZHVsdXMsCisJCQkJCQkgICAkZSwKKwkJCQkJCSAgICR4cDEsCisJCQkJCQkgICAkeHAyLAorCQkJCQkJICAgJFhwLAorCQkJCQkJICAgJHhxMSwKKwkJCQkJCSAgICR4cTIsCisJCQkJCQkgICAkWHEpOworCQkJCSRlID0gIiI7CisJCQkJJHhwMSA9ICIiOworCQkJCSR4cDIgPSAiIjsKKwkJCQkkWHAgPSAiIjsKKwkJCQkkeHExID0gIiI7CisJCQkJJHhxMiA9ICIiOworCQkJCSRYcSA9ICIiOworCQkJfQorCQl9CisJCWVsc2lmICgkdHQgPiAwKSB7CisJCQlkaWUgIlRlc3QgY2FzZSAkdHQgbm90IGRlZmluZWQiOworCQl9CisJfQorCisJY2xvc2UgSU47CisJJG91dCA9fiBzL1xuL1xyXG4vZzsgIyBtYWtlIGl0IGEgZG9zIGZpbGUKKwlvcGVuKE9VVCwgIj4kb3V0ZmlsZSIpIG9yIGRpZSAiQ2Fubm90IGNyZWF0ZSBvdXRwdXQgZmlsZSAkb3V0ZmlsZTogJD8iOworCXByaW50IE9VVCAkb3V0OworCWNsb3NlIE9VVDsKKworfQorCisjIFNpZ25hbGhhbmRsZXIKK3N1YiBjbGVhbnVwKCkgeworCXVubGluaygicnNhX3NpZ2dlbi50bXAuJCQiKTsKKwl1bmxpbmsoInJzYV9zaWd2ZXIudG1wLiQkIik7CisJdW5saW5rKCJyc2Ffc2lndmVyLnRtcC4kJC5zaWciKTsKKwl1bmxpbmsoInJzYV9zaWd2ZXIudG1wLiQkLmRlciIpOworCXVubGluaygicnNhX3NpZ3Zlci50bXAuJCQuY25mIik7CisJdW5saW5rKCJkc2Ffc2lnZ2VuLnRtcC4kJCIpOworCXVubGluaygiZHNhX3NpZ3Zlci50bXAuJCQiKTsKKwl1bmxpbmsoImRzYV9zaWd2ZXIudG1wLiQkLnNpZyIpOworCWV4aXQ7Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBsZXQgdXMgcHJldGVuZCB0byBiZSBDIDotKQorc3ViIG1haW4oKSB7CisKKwl1c2FnZSgpIHVubGVzcyBAQVJHVjsKKworCWdldG9wdHMoIkRSSToiLCBcJW9wdCkgb3IgZGllICJiYWQgb3B0aW9uIjsKKworCSMjIyMjIFNldCBsaWJyYXJ5CisKKwlpZiAoICEgZGVmaW5lZCAkb3B0eydJJ30gfHwgJG9wdHsnSSd9IGVxICdvcGVuc3NsJyApIHsKKwkJcHJpbnQgU1RERVJSICJVc2luZyBPcGVuU1NMIGludGVyZmFjZSBmdW5jdGlvbnNcbiI7CisJCSRlbmNkZWMgPQlcJm9wZW5zc2xfZW5jZGVjOworCQkkcnNhX3NpZ24gPQlcJm9wZW5zc2xfcnNhX3NpZ247CisJCSRyc2FfdmVyaWZ5ID0JXCZvcGVuc3NsX3JzYV92ZXJpZnk7CisJCSRnZW5fcnNha2V5ID0JXCZvcGVuc3NsX2dlbl9yc2FrZXk7CisJCSRoYXNoID0JCVwmb3BlbnNzbF9oYXNoOworCQkkc3RhdGVfY2lwaGVyID0JXCZvcGVuc3NsX3N0YXRlX2NpcGhlcjsKKwl9IGVsc2lmICggJG9wdHsnSSd9IGVxICdsaWJnY3J5cHQnICkgeworCQlwcmludCBTVERFUlIgIlVzaW5nIGxpYmdjcnlwdCBpbnRlcmZhY2UgZnVuY3Rpb25zXG4iOworCQkkZW5jZGVjID0JXCZsaWJnY3J5cHRfZW5jZGVjOworCQkkcnNhX3NpZ24gPQlcJmxpYmdjcnlwdF9yc2Ffc2lnbjsKKwkJJHJzYV92ZXJpZnkgPQlcJmxpYmdjcnlwdF9yc2FfdmVyaWZ5OworCQkkZ2VuX3JzYWtleSA9CVwmbGliZ2NyeXB0X2dlbl9yc2FrZXk7CisJCSRyc2FfZGVyaXZlID0gCVwmbGliZ2NyeXB0X3JzYV9kZXJpdmU7CisJCSRoYXNoID0JCVwmbGliZ2NyeXB0X2hhc2g7CisJCSRzdGF0ZV9jaXBoZXIgPQlcJmxpYmdjcnlwdF9zdGF0ZV9jaXBoZXI7CisJCSRzdGF0ZV9jaXBoZXJfZGVzID0JXCZsaWJnY3J5cHRfc3RhdGVfY2lwaGVyX2RlczsKKwkJJHN0YXRlX3JuZyA9CVwmbGliZ2NyeXB0X3N0YXRlX3JuZzsKKwkJJGhtYWMgPQkJXCZsaWJnY3J5cHRfaG1hYzsKKwkJJGRzYV9wcWdnZW4gPSAJXCZsaWJnY3J5cHRfZHNhX3BxZ2dlbjsKKwkJJGdlbl9kc2FrZXkgPSAgIFwmbGliZ2NyeXB0X2dlbl9kc2FrZXk7CisJCSRkc2Ffc2lnbiA9ICAgICBcJmxpYmdjcnlwdF9kc2Ffc2lnbjsKKwkJJGRzYV92ZXJpZnkgPSAgIFwmbGliZ2NyeXB0X2RzYV92ZXJpZnk7CisJCSRkc2FfZ2VucHVia2V5ID0gXCZsaWJnY3J5cHRfZHNhX2dlbnB1YmtleTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkaWUgIkludmFsaWQgaW50ZXJmYWNlIG9wdGlvbiBnaXZlbiI7CisgICAgICAgIH0KKworCW15ICRpbmZpbGU9JEFSR1ZbMF07CisJZGllICJFcnJvcjogVGVzdCB2ZWN0b3IgZmlsZSAkaW5maWxlIG5vdCBmb3VuZCIgaWYgKCEgLWYgJGluZmlsZSk7CisKKwlteSAkb3V0ZmlsZSA9ICRpbmZpbGU7CisJIyBsZXQgdXMgYWRkIC5yc3AgcmVnYXJkbGVzcyB3aGV0aGVyIHdlIGNvdWxkIHN0cmlwIC5yZXEKKwkkb3V0ZmlsZSA9fiBzL1wucmVxJC8vOworCWlmICgkb3B0eydSJ30pIHsKKwkJJG91dGZpbGUgLj0gIi5yYzQiOworCX0gZWxzZSB7CisJCSRvdXRmaWxlIC49ICIucnNwIjsKKwl9CisJaWYgKC1mICRvdXRmaWxlKSB7CisJCWRpZSAiT3V0cHV0IGZpbGUgJG91dGZpbGUgY291bGQgbm90IGJlIHJlbW92ZWQ6ICQ/IgorCQkJdW5sZXNzIHVubGluaygkb3V0ZmlsZSk7CisJfQorCXByaW50IFNUREVSUiAiUGVyZm9ybWluZyB0ZXN0cyBmcm9tIHNvdXJjZSBmaWxlICRpbmZpbGUgd2l0aCByZXN1bHRzIHN0b3JlZCBpbiBkZXN0aW5hdGlvbiBmaWxlICRvdXRmaWxlXG4iOworCisJI1NpZ25hbCBoYW5kbGVyCisJJFNJR3tIVVB9ID0gXCZjbGVhbnVwOworCSRTSUd7SU5UfSA9IFwmY2xlYW51cDsKKwkkU0lHe1FVSVR9ID0gXCZjbGVhbnVwOworCSRTSUd7VEVSTX0gPSBcJmNsZWFudXA7CisKKwkjIERvIHRoZSBqb2IKKwlwYXJzZSgkaW5maWxlLCAkb3V0ZmlsZSk7CisKKwljbGVhbnVwKCk7CisKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDYWxsIGl0CittYWluKCk7CisxOwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L3Rlc3RzL2NhdnNfdGVzdHMuc2ggYi9saWJnY3J5cHQtMS40LjYvdGVzdHMvY2F2c190ZXN0cy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iOWFhNjIxCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L3Rlc3RzL2NhdnNfdGVzdHMuc2gKQEAgLTAsMCArMSwxMzUgQEAKKyMhL2Jpbi9zaAorIyBSdW4gRklQUyBDQVZTIHRlc3RzCisjIENvcHlyaWdodCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0aGUgYXV0aG9yIGdpdmVzCisjIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKyMKKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIyBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0IGV2ZW4gdGhlCisjIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorIworIyBJbnN0cnVjdGlvbnM6CisjCisjIDEuIENkIHRvIHRoZSBsaWJnY3J5cHQvdGVzdHMgZGlyZWN0b3J5CisjCisjIDIuIFVucGFjayB0aGUgdGVzdCB2ZWN0b3IgdGFyYmFsbCBpbnRvIHN1YmRpcmVjdG9yeSBuYW1lZCAiY2F2cyIuIAorIyAgICBBbiBleGFtcGxlIGRpcmVjdG9yeSBsYXlvdXQgYWZ0ZXIgdW5wYWNraW5nIG1pZ2h0IGJlOgorIyAgICAgIGxpYmdjcnlwdC90ZXN0cy9jYXZzL0FFUy9yZXEvQ0JDR0ZTYm94MTI4LnJlcQorIyAgICAgIGxpYmdjcnlwdC90ZXN0cy9jYXZzL0FFUy9yZXEvQ0ZCMTI4TUNUMTI4LnJlcQorIworIyAgICBOb3RlIHRoYXQgYmVsb3cgdGhlICJjYXZzIiBkaXJlY3RvcnkgdGhlcmUgc2hvdWxkIG9ubHkgYmUgb25lCisjICAgIGRpcmVjdG9yeSBwYXJ0IG5hbWVkICJyZXEiLiAgRnVydGhlciBhdm9pZCBkaXJlY3RvcnkgcGFydAorIyAgICBuYW1lcyAicmVzcCIuCisjCisjIDMuIFJ1biB0aGlzIHNjcmlwdCBmcm9tIHRoZSBsaWJnY3J5cHQvdGVzdHMgZGlyZWN0b3J5OgorIyAgICAgIC4vY2F2c190ZXN0cy5zaAorIworIyA0LiBTZW5kIHRoZSByZXN1bHQgZmlsZSBjYXZzL0NBVlNfcmVzdWx0cy0qLnppcCB0byB0aGUgdGVzdGluZyBsYWIuCisjCisKKyMgU3RvcCBzY3JpcHQgaWYgc29tZXRoaW5nIHVuZXhwZWN0ZWQgaGFwcGVucy4KK3NldCAtZQorCisjIEEgZ2xvYmFsIGZsYWcgdG8ga2VlcCB0cmFjayBvZiBlcnJvcnMuCitlcnJvcnNfc2Vlbl9maWxlPSIkKHB3ZCkvLiNjYXZzX3Rlc3QuZXJyb3JzX3NlZW4udG1wIgorWyAtZiAiJGVycm9yc19zZWVuX2ZpbGUiIF0gJiYgcm0gIiRlcnJvcnNfc2Vlbl9maWxlIgorY29udGludWVfbW9kZT1ubworWyAiJDEiID0gIi0tY29udGludWUiIF0gJiYgY29udGludWVfbW9kZT15ZXMKKworCisjIEZ1bmN0aW9uIHRvIHJ1biBvbmUgdGVzdC4gIAorIyBUaGUgYXJndW1lbnQgaXMgdGhlIHJlcXVlc3QgZmlsZSBuYW1lLgorZnVuY3Rpb24gcnVuX29uZV90ZXN0ICgpIHsKKyAgICBsb2NhbCByZXFmaWxlPSIkMSIKKyAgICBsb2NhbCByc3BmaWxlCisgICAgbG9jYWwgdG1wcnNwZmlsZQorICAgIGxvY2FsIHJlc3BkaXIKKyAgICBsb2NhbCBkZmxhZz0iIgorCisgICAgdG1wcnNwZmlsZT0kKGVjaG8gIiRyZXFmaWxlIiB8IHNlZCAncywucmVxJCwucnNwLCcpCisgICAgcnNwZmlsZT0kKGVjaG8gIiR0bXByc3BmaWxlIiB8IHNlZCAncywvcmVxLywvcmVzcC8sJyApCisgICAgcmVzcGRpcj0kKGRpcm5hbWUgIiRyc3BmaWxlIikKKyAgICBbIC1mICIkdG1wcnNwZmlsZSIgXSAmJiBybSAiJHRtcHJzcGZpbGUiCisgICAgWyAtZCAiJHJlc3BkaXIiIF0gfHwgbWtkaXIgIiRyZXNwZGlyIgorICAgIFsgLWYgIiRyc3BmaWxlIiBdICYmICBybSAiJHJzcGZpbGUiCisKKyAgICBpZiBlY2hvICIkcmVxZmlsZSIgfCBncmVwICcvRFNBL3JlcS8nID4vZGV2L251bGwgMj4vZGV2L251bGw7IHRoZW4KKyAgICAgICAgZGZsYWc9Ii1EIgorICAgIGZpIAorICAgIAorICAgIGlmIC4vY2F2c19kcml2ZXIucGwgLUkgbGliZ2NyeXB0ICRkZmxhZyAiJHJlcWZpbGUiOyB0aGVuCisgICAgICBpZiBbIC1mICIkdG1wcnNwZmlsZSIgXTsgdGhlbgorICAgICAgICAgIG12ICIkdG1wcnNwZmlsZSIgIiRyc3BmaWxlIgorICAgICAgZWxzZSAKKyAgICAgICAgICBlY2hvICJmYWlsZWQgdGVzdDogJHJlcWZpbGUiID4mMgorICAgICAgICAgIDogPiIkZXJyb3JzX3NlZW5fZmlsZSIKKyAgICAgIGZpCisgICAgZWxzZQorICAgICAgICBlY2hvICJmYWlsZWQgdGVzdDogJHJlcWZpbGUgcmM9JD8iID4mMgorICAgICAgICA6ID4iJGVycm9yc19zZWVuX2ZpbGUiCisgICAgZmkKK30KKworCisKKyMgU2F2ZSBkYXRlIGFuZCBzeXN0ZW0gYXJjaGl0ZWN1cmUgdG8gY29uc3RydWN0IHRoZSBvdXRwdXQgYXJjaGl2ZSBuYW1lCitEQVRFPSQoZGF0ZSArJVklbSVkKQorQVJDSD0kKGFyY2ggfHwgZWNobyB1bmtub3duKQorcmVzdWx0X2ZpbGU9IkNBVlNfcmVzdWx0cy0kQVJDSC0kREFURS56aXAiCisKK2ZvciBmIGluIGZpcHNkcnYgY2F2c19kcml2ZXIucGw7IGRvCisgICAgaWYgWyAhIC1mICIuLyRmIiBdOyB0aGVuCisgICAgICBlY2hvICJyZXF1aXJlZCBwcm9ncmFtIFwiJGZcIiBtaXNzaW5nIGluIGN1cnJlbnQgZGlyZWN0b3J5IiA+JjIKKyAgICAgIGV4aXQgMgorICAgIGZpCitkb25lCitpZiBbICEgLWQgY2F2cyBdOyB0aGVuCisgICAgZWNobyAicmVxdWlyZWQgZGlyZWN0b3J5IFwiY2F2c1wiIG1pc3NpbmcgYmVsb3cgY3VycmVudCBkaXJlY3RvcnkiID4mMgorICAgIGV4aXQgMgorZmkKK2lmIFsgISB6aXAgLWggPi9kZXYvbnVsbCAyPiYxIF07IHRoZW4KKyAgICBlY2hvICJyZXF1aXJlZCBwcm9ncmFtIFwiemlwXCIgaXMgbm90IGluc3RhbGxlZCBvbiB0aGlzIHN5c3RlbSIgPiYyCisgICAgZXhpdCAyCitmaQorCisjIFNldCB0aGUgUEFUSCB0byB0aGlzIGRpcmVjdG9yeSBzbyB0aGF0IHRoZSBwZXJsIHNjcmlwdCBpcyBhYmxlIHRvCisjIGZpbmQgdGhlIHRlc3QgZHJpdmVycy4KK1BBVEg9LjokUEFUSAorCisjIENoZWNrIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBzdGFsZSByZXNwb25zZSBmaWxlcworZmluZCBjYXZzIC10eXBlIGYgLW5hbWUgIioucnNwIiB8ICggd2hpbGUgcmVhZCBmIDsgZG8KKyAgICBlY2hvICJTdGFsZSByZXNwb25zZSBmaWxlOiAkZiIgPiYyCisgICAgYW55PXllcworZG9uZQoraWYgWyAiJGFueSIgPSAieWVzIiBdOyB0aGVuCisgICAgZWNobyAiU3RhbGUgcmVzcG9uc2UgZmlsZXMgZm91bmQiID4mMgorICAgIGlmIFsgIiRjb250aW51ZV9tb2RlIiAhPSAieWVzIiBdOyB0aGVuCisgICAgICAgZWNobyAidXNlIG9wdGlvbiAtLWNvbnRpbnVlIGlmIHRoYXQgaXMgbm90IGEgcHJvYmxlbSIgPiYyCisgICAgICAgZXhpdCAxCisgICAgZmkKK2ZpCispIHx8IGV4aXQgMQorCisKKyMgRmluZCBhbGwgdGVzdCBmaWxlcyBhbmQgcnVuIHRoZSB0ZXN0cy4KK2ZpbmQgY2F2cyAtdHlwZSBmIC1uYW1lICIqLnJlcSIgfCB3aGlsZSByZWFkIGYgOyBkbworICAgIGVjaG8gIlJ1bm5pbmcgdGVzdCBmaWxlICRmIiA+JjIKKyAgICBydW5fb25lX3Rlc3QgIiRmIgorICAgIGlmIFsgLWYgIiRlcnJvcnNfc2Vlbl9maWxlIiBdOyB0aGVuCisgICAgICAgIGJyZWFrOworICAgIGZpCitkb25lCisKK2lmIFsgLWYgIiRlcnJvcnNfc2Vlbl9maWxlIiBdOyB0aGVuCisgICAgcm0gIiRlcnJvcnNfc2Vlbl9maWxlIgorICAgIGVjaG8gIkVycm9yIGVuY291bnRlcmVkIC0gbm90IHBhY2tpbmcgdXAgcmVzcG9uc2UgZmlsZSIgPiYyCisgICAgZXhpdCAxCitmaQorCitlY2hvICJQYWNraW5nIHVwIGFsbCByZXNwb25zZSBmaWxlcyIgPiYyCitjZCBjYXZzCitmaW5kIC4gLXR5cGUgZiAtbmFtZSAiKnJzcCIgLXByaW50IHwgemlwIC1AICIkcmVzdWx0X2ZpbGUiCisKK2VjaG8gIlJlc3VsdCBmaWxlIGlzOiBjYXZzLyRyZXN1bHRfZmlsZSIgPiYyCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvdGVzdHMvZmlwczE4Ni1kc2EuYyBiL2xpYmdjcnlwdC0xLjQuNi90ZXN0cy9maXBzMTg2LWRzYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkYjUwN2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvdGVzdHMvZmlwczE4Ni1kc2EuYwpAQCAtMCwwICsxLDQ2NSBAQAorLyogZmlwczE4Ni1kc2EuYyAtIEZJUFMgMTg2IERTQSB0ZXN0cworICoJQ29weXJpZ2h0IChDKSAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpZmRlZiBfR0NSWVBUX0lOX0xJQkdDUllQVAorIyBpbmNsdWRlICIuLi9zcmMvZ2NyeXB0LmgiCisjZWxzZQorIyBpbmNsdWRlIDxnY3J5cHQuaD4KKyNlbmRpZgorCisKKyNkZWZpbmUgbXlfaXNhc2NpaShjKSAoISgoYykgJiAweDgwKSkKKyNkZWZpbmUgZGlnaXRwKHApICAgKCoocCkgPj0gJzAnICYmICoocCkgPD0gJzknKQorI2RlZmluZSBoZXhkaWdpdHAoYSkgKGRpZ2l0cCAoYSkgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgfHwgKCooYSkgPj0gJ0EnICYmICooYSkgPD0gJ0YnKSAgXAorICAgICAgICAgICAgICAgICAgICAgIHx8ICgqKGEpID49ICdhJyAmJiAqKGEpIDw9ICdmJykpCisjZGVmaW5lIHh0b2lfMShwKSAgICgqKHApIDw9ICc5Jz8gKCoocCktICcwJyk6IFwKKyAgICAgICAgICAgICAgICAgICAgICoocCkgPD0gJ0YnPyAoKihwKS0nQScrMTApOigqKHApLSdhJysxMCkpCisjZGVmaW5lIHh0b2lfMihwKSAgICgoeHRvaV8xKHApICogMTYpICsgeHRvaV8xKChwKSsxKSkKKyNkZWZpbmUgRElNKHYpCQkgICAgIChzaXplb2Yodikvc2l6ZW9mKCh2KVswXSkpCisjZGVmaW5lIERJTW9mKHR5cGUsbWVtYmVyKSAgIERJTSgoKHR5cGUgKikwKS0+bWVtYmVyKQorCitzdGF0aWMgaW50IHZlcmJvc2U7CitzdGF0aWMgaW50IGVycm9yX2NvdW50OworCitzdGF0aWMgdm9pZAoraW5mbyAoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgIHZhX2xpc3QgYXJnX3B0cjsKKworICB2YV9zdGFydCAoYXJnX3B0ciwgZm9ybWF0KTsKKyAgdmZwcmludGYgKHN0ZGVyciwgZm9ybWF0LCBhcmdfcHRyKTsKKyAgdmFfZW5kIChhcmdfcHRyKTsKK30KKworc3RhdGljIHZvaWQKK2ZhaWwgKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICB2YV9saXN0IGFyZ19wdHI7CisKKyAgdmFfc3RhcnQgKGFyZ19wdHIsIGZvcm1hdCk7CisgIHZmcHJpbnRmIChzdGRlcnIsIGZvcm1hdCwgYXJnX3B0cik7CisgIHZhX2VuZCAoYXJnX3B0cik7CisgIGVycm9yX2NvdW50Kys7Cit9CisKK3N0YXRpYyB2b2lkCitkaWUgKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICB2YV9saXN0IGFyZ19wdHI7CisKKyAgdmFfc3RhcnQgKGFyZ19wdHIsIGZvcm1hdCk7CisgIHZmcHJpbnRmIChzdGRlcnIsIGZvcm1hdCwgYXJnX3B0cik7CisgIHZhX2VuZCAoYXJnX3B0cik7CisgIGV4aXQgKDEpOworfQorCitzdGF0aWMgdm9pZAorc2hvd19zZXhwIChjb25zdCBjaGFyICpwcmVmaXgsIGdjcnlfc2V4cF90IGEpCit7CisgIGNoYXIgKmJ1ZjsKKyAgc2l6ZV90IHNpemU7CisKKyAgaWYgKHByZWZpeCkKKyAgICBmcHV0cyAocHJlZml4LCBzdGRlcnIpOworICBzaXplID0gZ2NyeV9zZXhwX3NwcmludCAoYSwgR0NSWVNFWFBfRk1UX0FEVkFOQ0VELCBOVUxMLCAwKTsKKyAgYnVmID0gZ2NyeV94bWFsbG9jIChzaXplKTsKKworICBnY3J5X3NleHBfc3ByaW50IChhLCBHQ1JZU0VYUF9GTVRfQURWQU5DRUQsIGJ1Ziwgc2l6ZSk7CisgIGZwcmludGYgKHN0ZGVyciwgIiUuKnMiLCAoaW50KXNpemUsIGJ1Zik7CisgIGdjcnlfZnJlZSAoYnVmKTsKK30KKworc3RhdGljIGdjcnlfbXBpX3QKK21waV9mcm9tX3N0cmluZyAoY29uc3QgY2hhciAqc3RyaW5nKQoreworICBncGdfZXJyb3JfdCBlcnI7CisgIGdjcnlfbXBpX3QgYTsKKworICBlcnIgPSBnY3J5X21waV9zY2FuICgmYSwgR0NSWU1QSV9GTVRfSEVYLCBzdHJpbmcsIDAsIE5VTEwpOworICBpZiAoZXJyKQorICAgIGRpZSAoImVycm9yIGNvbnZlcnRpbmcgc3RyaW5nIHRvIG1waTogJXNcbiIsIGdwZ19zdHJlcnJvciAoZXJyKSk7CisgIHJldHVybiBhOworfQorCisvKiBDb252ZXJ0IFNUUklORyBjb25zaXN0aW5nIG9mIGhleCBjaGFyYWN0ZXJzIGludG8gaXRzIGJpbmFyeQorICAgcmVwcmVzZW50YXRpb24gYW5kIHJldHVybiBpdCBhcyBhbiBhbGxvY2F0ZWQgYnVmZmVyLiBUaGUgdmFsaWQKKyAgIGxlbmd0aCBvZiB0aGUgYnVmZmVyIGlzIHJldHVybmVkIGF0IFJfTEVOR1RILiAgVGhlIHN0cmluZyBpcworICAgZGVsaW1pdGVkIGJ5IGVuZCBvZiBzdHJpbmcuICBUaGUgZnVuY3Rpb24gcmV0dXJucyBOVUxMIG9uCisgICBlcnJvci4gICovCitzdGF0aWMgdm9pZCAqCitkYXRhX2Zyb21faGV4IChjb25zdCBjaGFyICpzdHJpbmcsIHNpemVfdCAqcl9sZW5ndGgpCit7CisgIGNvbnN0IGNoYXIgKnM7CisgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKKyAgc2l6ZV90IGxlbmd0aDsKKworICBidWZmZXIgPSBnY3J5X3htYWxsb2MgKHN0cmxlbihzdHJpbmcpLzIrMSk7CisgIGxlbmd0aCA9IDA7CisgIGZvciAocz1zdHJpbmc7ICpzOyBzICs9MiApCisgICAgeworICAgICAgaWYgKCFoZXhkaWdpdHAgKHMpIHx8ICFoZXhkaWdpdHAgKHMrMSkpCisgICAgICAgIGRpZSAoImVycm9yIHBhcnNpbmcgaGV4IHN0cmluZyBgJXMnXG4iLCBzdHJpbmcpOworICAgICAgKCh1bnNpZ25lZCBjaGFyKilidWZmZXIpW2xlbmd0aCsrXSA9IHh0b2lfMiAocyk7CisgICAgfQorICAqcl9sZW5ndGggPSBsZW5ndGg7CisgIHJldHVybiBidWZmZXI7Cit9CisKKworc3RhdGljIHZvaWQKK2V4dHJhY3RfY21wX21waSAoZ2NyeV9zZXhwX3Qgc2V4cCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZXhwZWN0ZWQpCit7CisgIGdjcnlfc2V4cF90IGwxOworICBnY3J5X21waV90IGEsIGI7CisKKyAgbDEgPSBnY3J5X3NleHBfZmluZF90b2tlbiAoc2V4cCwgbmFtZSwgMCk7CisgIGEgPSBnY3J5X3NleHBfbnRoX21waSAobDEsIDEsIEdDUllNUElfRk1UX1VTRyk7CisgIGIgPSBtcGlfZnJvbV9zdHJpbmcgKGV4cGVjdGVkKTsKKyAgaWYgKCFhKSAKKyAgICBmYWlsICgicGFyYW1ldGVyIFwiJXNcIiBtaXNzaW5nIGluIGtleVxuIiwgbmFtZSk7CisgIGVsc2UgaWYgKCBnY3J5X21waV9jbXAgKGEsIGIpICkKKyAgICBmYWlsICgicGFyYW1ldGVyIFwiJXNcIiBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCB2YWx1ZVxuIiwgbmFtZSk7CisgIGdjcnlfbXBpX3JlbGVhc2UgKGIpOworICBnY3J5X21waV9yZWxlYXNlIChhKTsKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKGwxKTsKK30KKworCitzdGF0aWMgdm9pZAorZXh0cmFjdF9jbXBfZGF0YSAoZ2NyeV9zZXhwX3Qgc2V4cCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZXhwZWN0ZWQpCit7CisgIGdjcnlfc2V4cF90IGwxOworICBjb25zdCB2b2lkICphOworICBzaXplX3QgYWxlbjsKKyAgdm9pZCAqYjsKKyAgc2l6ZV90IGJsZW47CisKKyAgbDEgPSBnY3J5X3NleHBfZmluZF90b2tlbiAoc2V4cCwgbmFtZSwgMCk7CisgIGEgPSBnY3J5X3NleHBfbnRoX2RhdGEgKGwxLCAxLCAmYWxlbik7CisgIGIgPSBkYXRhX2Zyb21faGV4IChleHBlY3RlZCwgJmJsZW4pOworICBpZiAoIWEpIAorICAgIGZhaWwgKCJwYXJhbWV0ZXIgXCIlc1wiIG1pc3NpbmcgaW4ga2V5XG4iLCBuYW1lKTsKKyAgZWxzZSBpZiAoIGFsZW4gIT0gYmxlbiB8fCBtZW1jbXAgKGEsIGIsIGFsZW4pICkKKyAgICBmYWlsICgicGFyYW1ldGVyIFwiJXNcIiBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCB2YWx1ZVxuIiwgbmFtZSk7CisgIGdjcnlfZnJlZSAoYik7CisgIGdjcnlfc2V4cF9yZWxlYXNlIChsMSk7Cit9CisKK3N0YXRpYyB2b2lkCitleHRyYWN0X2NtcF9pbnQgKGdjcnlfc2V4cF90IHNleHAsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBleHBlY3RlZCkKK3sKKyAgZ2NyeV9zZXhwX3QgbDE7CisgIGNoYXIgKmE7CisKKyAgbDEgPSBnY3J5X3NleHBfZmluZF90b2tlbiAoc2V4cCwgbmFtZSwgMCk7CisgIGEgPSBnY3J5X3NleHBfbnRoX3N0cmluZyAobDEsIDEpOworICBpZiAoIWEpIAorICAgIGZhaWwgKCJwYXJhbWV0ZXIgXCIlc1wiIG1pc3NpbmcgaW4ga2V5XG4iLCBuYW1lKTsKKyAgZWxzZSBpZiAoIHN0cnRvdWwgKGEsIE5VTEwsIDEwKSAhPSBleHBlY3RlZCApCisgICAgZmFpbCAoInBhcmFtZXRlciBcIiVzXCIgZG9lcyBub3QgbWF0Y2ggZXhwZWN0ZWQgdmFsdWVcbiIsIG5hbWUpOworICBnY3J5X2ZyZWUgKGEpOworICBnY3J5X3NleHBfcmVsZWFzZSAobDEpOworfQorCisKK3N0YXRpYyB2b2lkCitjaGVja19kc2FfZ2VuXzE4Nl8yICh2b2lkKQoreworICBzdGF0aWMgc3RydWN0IHsKKyAgICBpbnQgbmJpdHM7CisgICAgY29uc3QgY2hhciAqcCwgKnEsICpnOworICAgIGNvbnN0IGNoYXIgKnNlZWQ7CisgICAgaW50IGNvdW50ZXI7CisgICAgY29uc3QgY2hhciAqaDsKKyAgfSB0YmxbXSA9IHsKKyAgICAvKiBUaGVzZSB0ZXN0cyBhcmUgZnJvbSBGSVBTIDE4Ni0yLCBCLjMuMS4gICovCisgICAgeworICAgICAgMTAyNCwKKyAgICAgICJkM2FlZDE4NzYwNTRkYjgzMWQwYzEzNDhmYmIxYWRhNzI1MDdlNWZiZjlhNjJjYmQ0N2E2M2FlYjc4NTlkNjkyMSIKKyAgICAgICI0YWRlYjkxNDZhNmVjM2Y0MzUyMGYwZmQ4ZTMxMjVkZDhiYmM1ZDg3NDA1ZDFhYzVmODIwNzNjZDc2MmEzZjhkNyIKKyAgICAgICI3NDMyMjY1N2M5ZGE4OGE3ZDJmMGUxYTljZWI4NGEzOWNiNDA4NzYxNzllNmE3NmU0MDA0OThkZTRiYjkzNzliMCIKKyAgICAgICI1ZjVmZWI3YjkxZWI4ZmVhOTdlZTE3YTk1NWEwYThhMzc1ODdhMjcyYzQ3MTlkNmZlYjZiNTRiYTRhYjY5IiwKKyAgICAgICI5YzkxNmQxMjFkZTlhMDNmNzFmYjIxYmMyZTFjMGQxMTZmMDY1YTRmIiwKKyAgICAgICI4MTU3YzVmNjhjYTQwYjNkZWQxMWMzNTMzMjdhYjliOGFmM2UxODZkZDJlOGRhZGU5ODc2MWEwOTk2ZGRhOTlhYiIKKyAgICAgICIwMjUwZDM0MDkwNjNhZDk5ZWZhZTQ4YjEwYzZhYjJiYmEzZWE5YTY3YjEyYjkxMWEzNzJhMmJiYTI2MDE3NmZhZCIKKyAgICAgICJiNGI5MzI0N2Q5NzEyYWFkMTNhYTcwMjE2YzU1ZGE5ODU4ZjdhMjk4ZGViNjcwYTQwM2ViMWU3YzkxYjg0N2YxZSIKKyAgICAgICJjY2ZiZDE0YmQ4MDZmZDQyY2Y0NWRiYjY5Y2Q2ZDZiNDNhZGQyYTc4ZjdkMTY5MjhlYWEwNDQ1OGRlYTQ0IiwKKyAgICAgICIwY2IxOTkwYzFmZDM2MjYwNTVkN2EwMDk2ZjhmYTk5ODA3Mzk5ODcxIiwKKyAgICAgIDk4LAorICAgICAgIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIgorICAgICAgIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIgorICAgICAgIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIgorICAgICAgIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIiCisgICAgfSwKKyAgICB7CisgICAgICAxMDI0LAorICAgICAgImY1YzczMzA0MDgwMzUzMzU3ZGUxYjU5Njc1OTdjMjdkNjVmNzBhYTJmZTliNmFlZDFkMGFmYzJiNDk5YWRmMjJmIgorICAgICAgIjhlMzc5MzcwOTZkODg1NDhhYzM2YzRhMDY3ZjgzNTNjN2ZlZDczZjk2ZjBkNjg4YjE5YjA2MjRhZWRiYWU1ZGJiIgorICAgICAgIjBlZTg4MzVhNGMyNjkyODhjMGUxZDY5NDc5ZTcwMWVlMjY2YmI3NjdhZjM5ZDc0OGZlN2Q2YWZjNzNmZGY0NGJlIgorICAgICAgIjNlYjZlNjYxZTU5OTY3MDA2MTIwM2U3NWZjOGIzZGJkNTllNDBiNTRmMzU4ZDAwOTcwMTNhMGYzODY3ZjkiLAorICAgICAgImY4NzUxMTY2Y2Y0ZjZmM2IwN2MwODFmZDJhOTA3MWYyM2NhMTk4OGQiLAorICAgICAgIjFlMjg4YTQ0MmUwMjQ2MWM0MThlZDY3YTY2ZDI0Y2FjYmViODkzNmZiZGU2MmZmOTk1ZjVmZDU2OWRlZTZiZTYyIgorICAgICAgIjRlNGYwZjlmOGM4MDkzZjVkMTkyYWIzYjNmOWFlM2YyNjY1ZDk1ZDI3ZmIxMGUzODJmNDVjZDM1NmU3ZjRlYjdhIgorICAgICAgIjY2NWRiNDMyMTEzZWQwNjQ3OGY5M2I3Y2YxODhlYzdhMWVlOTdhZWM4ZjkxZWE3YmZjZWFmOGI2ZTdlNWEzNDljIgorICAgICAgIjRhZDMyMjUzNjJlZjQ0MGM1N2NiYzZlNjlkZjE1YjY2OTljYWFjODVmNzMzNTU1MDc1ZjA0NzgxYjJiMzMiLAorICAgICAgIjM0YjM1MjBkNDVkMjQwYTg4NjFiODJjOGI2MWZmYTE2ZTY3YjVjY2UiLAorICAgICAgNjIyLAorICAgICAgIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIgorICAgICAgIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIgorICAgICAgIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIgorICAgICAgIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIiLAorICAgIH0sCisgICAgeworICAgICAgMTAyNCwKKyAgICAgICJjNmM2ZjRmNGVlZDkyN2ZiMWMzYjBjODEwMTA5NjdlNTMwNjU4ZTZmOTY5OGViZTA1OGI0ZjQ3YjJkYzhmY2JjNyIKKyAgICAgICJiNjkyOTZiOWU4YjZjZjU1NjgxMTgxZmU3MjQ5MjY2ODA2MWIyNjJiMDA0NmEwZDQwOTkwMmUyNjliMGNiNjlhNCIKKyAgICAgICI1NWVkMWEwODZjYWY0MTkyN2Y1OTEyYmYwZTBjYmM0NWVlODFhNGY5OGJmNjE0NmY2MTY4YTIyOGFlYzgwZTljYyIKKyAgICAgICIxMTYyZDZmNmFhNDEyZWZlODJkNGYxOGI5NWUzNGFiNzkwZGFhYzViZDdhZWYwYjIyZmEwOGJhNWRiYWFkIiwKKyAgICAgICJkMzJiMjlmMDY1YzEzOTRhMzA0OTBiNmZjYmY4MTJhMzJhODYzNGFiIiwKKyAgICAgICIwNmY5NzNjODc5ZTJlODkzNDVkMGFjMDRmOWMzNGFkNjliOWVmZjE2ODBmMThkMWM4ZjNlMTU5NmMyZThmYThlMSIKKyAgICAgICJlY2VmNjgzMDQwOWU5MDEyZDQ3ODhiZWY2ZWM3NDE0ZDA5Yzk4MWI0N2M5NDFiNzdmMzlkZmM0OWNhZmY1ZTcxNCIKKyAgICAgICJjOTdhYmUyNWE3YThiNWQxZmU4ODcwMGJiOTZlZmY5MWNjYTY0ZDUzNzAwYTI4YjExNDZkODFiYWQxMjEyZDIzMSIKKyAgICAgICI4MDE1NGM5NWEwMWY1YWVlYmI1NTNhODM2NWMzOGE1ZWJlMDU1MzliNTE3MzQyMzM3NzZjZTlhZmY5OGIyIiwKKyAgICAgICJiNmVjNzUwZGEyZjgyNGNiNDJjNWY3ZTI4YzgxMzUwZDk3Zjc1MTI1IiwKKyAgICAgIDE4NSwKKyAgICAgICIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIKKyAgICAgICIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIKKyAgICAgICIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIKKyAgICAgICIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyIiwKKyAgICB9LAorICAgIHsKKyAgICAgIDEwMjQsCisgICAgICAiYjgyN2E5ZGM5MjIxYTZlZDFiZWM3YjY0ZDYxMjMyYWFjYjI4MTJmODg4YjBhMGIzYTk1MDMzZDdhMjJlNzdkMGIiCisgICAgICAiZmYyM2JmZWVkMGZiMTI4MWIyMWI4ZmY3NDIxZjBjNzI3ZDFmYjhhYTJiODQzZDY4ODVmMDY3ZTc2M2Y4M2Q0MWYiCisgICAgICAiZDgwMGFiMTVhN2UyYjEyZjcxZWMyMDU4ZWU3YmQ2MmNkNzJjMjY5ODliMjcyZTUxOTc4NWRhNTdiZmExZjk3NGIiCisgICAgICAiYzY1MmUxYTJkNmNmYjY4NDc3ZGU1NjM1ZmQwMTliMzdhZGQ2NTZjZmYwYjgwMjU1OGIzMWI2ZDI4NTFlNSIsCisgICAgICAiZGU4MjJjMDM0NDViNzdjZWM0YWQzYTZmYjBjYTM5ZmY5NzA1OWRkZiIsCisgICAgICAiNjVhOWUyZDQzYTM3OGQ3MDYzODEzMTA0NTg2ODY4Y2FjZjJmY2NkNTFhZWMxZTBiNmFmOGJhM2U2NmRlZTYzNzEiCisgICAgICAiNjgxMjU0YzNmYjVlMzkyOWQ2NWUzYzRiY2QyMGFiZDRkZGM3Y2Y4MTU2MjNlMTdiOWZjOTJmMDJiOGQ0NDI3OGIiCisgICAgICAiODQ4NDgwZmZkMTkzMTA0Y2Y1NjEyNjM5NTExZTQ1YmQyNDc3MDhmZjYwMjhiZDM4MjRmODg0NGMyNjNiNDZjNjkiCisgICAgICAiMWYyMDc2ZjhjZDEzYzVkMGJlOTVmMWYyYTFhMTdhYjFmN2U1YmM3MzUwMGJhYzI3ZDU3YjQ3M2JhOTc0OCIsCisgICAgICAiY2QyMjIxZGQ3MzgxNWE3NTIyNGU5ZmRlN2ZhZjUyODI5YjgxYWM3YSIsCisgICAgICA2MiwKKyAgICAgICIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIKKyAgICAgICIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIKKyAgICAgICIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIKKyAgICAgICIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyIiwKKyAgICB9LAorICAgIHsKKyAgICAgIDEwMjQsCisgICAgICAiODk4YThkOTNlMjk1YzhlZjJmZmQ0Njk3NjIyNWExNTQzNjQwNjQwZDE1NWE1NzZmYWZhMGJlMzIxMzYxNjU4MDMiCisgICAgICAiYmEyZWZmMjc4MmEyYmU3NWNjOWVjNjVkYjZiZDMyMzhjY2E2OTViM2E1YTE0NzI2YTJhMzE0Nzc1YzM3N2Q4OTEiCisgICAgICAiMzU0YjNkZTZjODllNzE0YTA1NTk5Y2EwNDEzMmM5ODdmODg5ZjcyYzRmZTI5OGNjYjMxZjcxMWMwM2IwN2UxZDkiCisgICAgICAiOGQ3MmFmNTkwNzU0Y2YzODQ3Mzk4YjYwY2VjZDU1YTQ2MTE2OTJiMzA4ODA5NTYwYTgzODgwNDA0YzIyNyIsCisgICAgICAiYzZkNzg2NjQzZDJhY2ZjNmI4ZDU3Njg2M2ZkYThjZmJmYmQ1ZTAzZiIsCisgICAgICAiMmZkMzhiOGQyMWM1OGU4ZmI1MzE1YTE3N2I4ZDVkYzRjNDUwZDU3NGU2OTM0OGI3YjlkYTM2N2MyNmU3MjQzOGQiCisgICAgICAiYWY4MzcyZTdmMGJlZTg0ZWY1ZGNiYmMzNzI3MTk0YTIyMjg0MzExOTJmMTc3OWJlMjQ4MzdmMjJhMGUxNGQxMGQiCisgICAgICAiNTM0NGRhMWI4YjQwM2RmOWY5YjI2NTUwOTViM2QwZjY3NDE4ZWQ2Y2Q5ODlmMzVhYTQyMzJlNGI3MDAxNzY0ZmIiCisgICAgICAiZTg1ZDZiMmM3MTY5ODBmMTMyNzJmYzQyNzFhYzFlMjM0ZjdlMjRjMDIzY2ZjMmQyZGMwYWExZTlhZjJmYiIsCisgICAgICAiNzM0ODNlNjk3NTk5ODcxYWY5ODNhMjgxZTNhZmEyMmUwZWQ4NmI2OCIsCisgICAgICAyNzIsCisgICAgICAiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiCisgICAgICAiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiCisgICAgICAiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiCisgICAgICAiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMiIsCisgICAgfSwKKworICAgIC8qIFRoZXNlIHRlc3RzIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIE9wZW5TU0wgRklQUyB2ZXJzaW9uLiAgKi8KKyAgICB7IAorICAgICAgMTAyNCwKKyAgICAgICJBNDA0MzYzOTAzRkRDRTg2ODM5QkNGRDk1M0FBRDJEQTJCMEU3MENBRUQzQjVGRjVENjhGMTVBMUM0QkIwQTc5M0MiCisgICAgICAiQTlENThGQzk1NjgwNEM1OTAxREUwQUY5OUYzNDVFRDFBODYxN0M2ODc4NjRCQUMwNDRCN0MzQzNFNzMyQTJCMjU1IgorICAgICAgIkVDOTg2QUE3NkVBOENCMEUwODE1QjNFMEU2MDU2NTBBRjdEODA1OEVFN0U4RUJDREVGRkRBQjgxMDBEM0ZDMTAzMyIKKyAgICAgICIxMUJBM0FCMjMyRUYwNkJCNzRCQTlBOTQ5RUMwQzdFRDMyNEMxOUIyMDJGNEFCNzI1QkJCNDA4MEM5IiwKKyAgICAgICJDNjQzOTQ2Q0VBODc0OEUxMkQ0MzBDNDhEQjAzOEY5MTY1ODE0Mzg5IiwKKyAgICAgICI1OUI3RTdCQTAwMzNDQ0U4RTY4MzcxNzM0MjBGQkIzODJBNzg0RDQxNTRBM0MxNjYwNDNGNUE2OENCOTI5NDVEMTYiCisgICAgICAiODkyRDRDQzU1ODVGMkQyOEM3ODBFNzVBNkMyMEEzNzlFMkI1ODMwNEMxRTVGQzBEOEMxNUU0RTg5QzQ0OThDOEJDIgorICAgICAgIkI5MEZCMzZFRDhEQzA0ODlCOUQwQkMwOUVDNDQxMUZCMEJGQURGMjU0ODVFRUFCNjcwMEJFMEFDRjVDNDRBNkVENyIKKyAgICAgICI0NEEwMTUzODJGRjlCOERBN0VBQTAwREVBMTM1RkFEQzU5MjEyREJCRkZDMTUzNzMzNkZBNEI3MjI1IiwKKyAgICAgICIwMjcwOGFiMzZlM2YwYmZkNjdlYzNiOGJkODgyOWQwM2I4NGY1NmJkIiwKKyAgICAgIDUwLAorICAgICAgIjAyIgorICAgIH0sCisgICAgeworICAgICAgMTAyNCwKKyAgICAgICI5QzY2NDAzM0RCOEIyMDNEODI2Rjg5NkQyMjkzQzYyRUY5MzUxRDVDRkQwRjRDMEFEN0VGREE0RERDN0YxNTk4NyIKKyAgICAgICI2QTNDNjhDQUIyNTg2QjQ0RkQxQkQ0REVGN0ExNzkwNUQ4OEQzMjFERDc3QzRFMTcyMEQ4NDhDQTIxRDc5RjlCMyIKKyAgICAgICJEOEY1MzczMzhFMDlCNDRFOUY0ODFFOERBM0M1NjU2OUY2MzE0NjU5NkEwNTBFRjhGQUVFOEFDQTMyQzY2NjQ1MCIKKyAgICAgICIwNEY2NzVDODgwNkVCNDAyNUIwQTVFQ0MzOUNFODk5ODNFQTQwQTE4M0E3Q0Y1MjA4QkE5NTgwNDVBQkQ1IiwKKyAgICAgICJBRDBEOENCQTM2OUFGNkNEMEQyQkFDMEI0Q0ZDQUYwQTFGOUJDREY3IiwKKyAgICAgICI3NEQ3MTdGNzA5MkEyQUY3MjVGREQ2QzI1NjFEMURCRTVBRUU0MDIwM0M2MzhCQThCOUY0OTAwMzg1Nzg3MzcwMSIKKyAgICAgICI5NUE0NEU1MTVDNEU4QjM0NEY1Q0RDN0Y0QTZEMzgwOTdDRDU3Njc1RTc2NDNBQjk3MDA2OTJDNjlGMEE5OUIwRSIKKyAgICAgICIwMzlGRERERkNBOENFQjYwN0JEQjRBREYyODM0REUxNjkwRjU4MjNGQzgxOTlGQjhGNkYyOUU1QTU4M0I2Nzg2QSIKKyAgICAgICJDMTRDN0U2NzEwNkMzQjMwNTY4Q0JCOTM4M0Y4OTI4N0Q1NzgxNTk3NzhFQjE4MjE2Nzk5RDE2RDQ2NDk4IiwKKyAgICAgICI2NDgxYTEyYTUwMzg0ODg4ZWU4NGI2MTAyNGY3YzljNjg1ZDZhYzk2IiwKKyAgICAgIDI4OSwKKyAgICAgICIwMiIKKyAgICB9LAorICAgIHsKKyAgICAgIDEwMjQsCisKKyAgICAgICJCMERGQjYwMkVCODQ2MkIxREM4QzIyMTRBNTJCNTg3RDNFNjg0MkNDRjFDMzhEMEY3QzdGOTY3RUQzMENGNjgyOCIKKyAgICAgICIxRTI2NzVCM0JBQjU5NDc1NUZCMTYzNEU2NkI0QzIzOTM2RjA3MjVBMzU4RjhERkYzQzMwN0UyNjAxRkQ2NkQ2MyIKKyAgICAgICI1QjE3MjcwNDUwQzUwQkQyQkVDMjlFMEU5QTQ3MURGMUMxNUIwMTkxNTE3OTUyMjY4QTI3NjNENEJEMjhCODUwMyIKKyAgICAgICJCMzM5OTY4NjI3MkI3NkIxMTIyN0Y2OTNENzgzMzEwNUVGNzBDMjI4OUMzMTk0Q0Y0NTI3MDI0QjI3MkRGIiwKKyAgICAgICJFQTY0OUMwNDkxMUZBQjVBNDE0NDAyODdBNTE3RUY3NTJBNDAzNTRCIiwKKyAgICAgICI4OEM1QTQ1NjNFQ0I5NDk3NjNFMEI2OTZDRDA0QjIxMzIxMzYwRjU0QzBFRTdCMjNFMkNFREMzMEU5RTQ4NjE2MiIKKyAgICAgICIwMUJGQjE2MTlFN0M1NEI2NTNEMUY4OTBDNTBFMDRCMjkyMDVGNUUzRTJGOTNBMTNCMDc1MUFGMjU0OTFDNTE5NCIKKyAgICAgICI5M0MwOURERjZCOUMxNzNCMzg0NkRGQjBFN0E1Qzg3MEJCRkM3ODQxOTI2MEM5MEUyMDMxNTQxMDY5MUM4MzI2QyIKKyAgICAgICI4NThENzA2M0U3OTIxRjNGNjAxMTU4RTkxMkM3RUU0ODdGRjI1OTIwMkJFRUIxMEY2RDlFOTkxOTBGNjk2IiwKKyAgICAgICI1YmY5ZDE3YmM2MmZiYmYzZDU2OWM5MmJkNDUwNTU4NmIyZTVlZjFhIiwKKyAgICAgIDYyNiwKKyAgICAgICIwMiIKKyAgICB9LAorICAgIHsKKyAgICAgIDEwMjQsCisgICAgICAiRjc4M0MwOEQ3Rjk0NjNFNDhCQTg3ODkzODA1QzRCMzRCNjNDODVERjdFQkREOUVCRUU5NERCNEFGNEU0QTQxNUMiCisgICAgICAiRjBGMzc5M0FFNTUwOTZCQTExOTk1OTg3OThGQTg0MDNCMjhERUQ3RjdDN0FGRDU0RkQ1MzU4NjFBMDE1MEVGNEQiCisgICAgICAiNTg3MTQ2NUIxMzgzN0NDRjQ2QkVCMEEyMkY4RDM4REM3RDZBRTBFMTRBMzg0NUZEMEMwMjdDRkE5Nzc5MUI5NzciCisgICAgICAiQ0UyODA4QkFEOUI0M0NFNjkzOTBDMEY0MDAxNjA1NjcyMkQ4MkMwRDdCMUIyNzQxM0QwMjZBMzlEN0RBRCIsCisgICAgICAiQTQwRDlFRTQ1NkFFRDRDOEE2NTNGREI0N0I2NjI5QzBCODQzRkU4RiIsCisgICAgICAiREY4NzYyNjNFMjFGMjYzQUU2REE1NzQwOUJENTE3RENFQURCOTIxNjA0OEYwNjZENkI1ODg2N0Y4RTU5QTVFRUUiCisgICAgICAiNzAwMjgzQTk0NkMxNDU1NTM0NjE4OTc5QkU2QzIyNzY3M0MxQjgwMzkxMDI2MkJEOTNCQzk0RDUwODk4NTA2MTQiCisgICAgICAiRjNFMjlBQjY0RThDOTg5QTdFM0UyOEZFNjcwRkZBM0VFMjFERUVFQzFBQjBCNjBFMUQ4RTJBQTM5NjYzQkFERDciCisgICAgICAiMkM5Rjk1N0Q3RjNENEYxN0Q5RkRBRDA1MEVCMzczQTZERUZEMDlGNURBNzUyRUFGRTA0NjgzNkUxNEI2NyIsCisgICAgICAiOGE5YTU3NzA2ZjY5ZjRmNTY2MjUyY2RmNmQ1Y2JmZGYyMDIwMTUwYiIsCisgICAgICAzOTcsCisgICAgICAiMDIiCisgICAgfSwKKyAgICB7IAorICAgICAgMTAyNCwKKyAgICAgICJENDBFNEY2NDYxRTE0NTg1OUNDRjYwRkQ1Nzk2Mjg0MEJENzVGRkYxMkMyMkY3NjYyNkY1NjY4NDIyNTJBRDA2OCIKKyAgICAgICIyOTc0NUYwMTQ3MDU2MzU0RjZDMDE2Q0YxMjc2MkIwRTMzMTc4NzkyNUI4MTI4Q0Y1QUY4MUY5QjE3NkE1MTkzNCIKKyAgICAgICI5NkQ3OTI0MzBGRjgzQzdCNzlCRDU5NUJEQTEwNzg3QjM0NjAwNzg3RkE1NTJFRkUzNjYyRjM3Qjk5QUFEM0YzQSIKKyAgICAgICIwOTM3MzI2ODBBMDEzNDUxOTJBMTlCRUNDRTZCRjVENDk4RTQ0RUQ2QkVENUIwQkE3MkFBRDQ5RTgyNzZCIiwKKyAgICAgICJEMTJGMUJEMEFBNzhCOTkyNDdGRDlGMThFQUZFRTVDMTM2Njg2RUE1IiwKKyAgICAgICI0NjhFQkQyMEM5OTQ0OUMxRTQ0MEU2RjhFNDUyQzZBNkJDNzU1MUM1NTVGRTVFOTQ5OTZFMjBDRkQ0REEzQjlDQyIKKyAgICAgICI1ODQ5OUQ2Q0MyMzc0Q0NGOUMzOTI3MTVBNTM3REUxMENGQ0E4QTZBMzdBRkJEMTg3Q0Y2Qjg4RDI2ODgxRTVGNSIKKyAgICAgICI3NTIxRDlEMkM5QkJBNTFFN0I4N0IwNzBCQkU3M0Y1QzVGRTMxRTc1MkNBRjg4MTgzNTE2RDg1MDNCQUFDMTE1OSIKKyAgICAgICI5MjhFRjUwREVFNTJEOTZGMzk2QjkzRkI0MTM4RDc4NjQ2NEMzMTU0MDFBODUzRTU3QzlBMEY5RDI1ODM5IiwKKyAgICAgICIzMGIzNTk5OTQ0YTkxNGEzMzBhM2Y0OWQxMWVjODhmNTU1NDIyYWVmIiwKKyAgICAgIDY3OCwKKyAgICAgICIwMiIKKyAgICB9CisgIH07CisgIGdwZ19lcnJvcl90IGVycjsKKyAgaW50IHRubzsKKyAgZ2NyeV9zZXhwX3Qga2V5X3NwZWMsIGtleSwgcHViX2tleSwgc2VjX2tleSwgc2VlZF92YWx1ZXM7CisgIGdjcnlfc2V4cF90IGwxOworCisgIGZvciAodG5vID0gMDsgdG5vIDwgRElNICh0YmwpOyB0bm8rKykKKyAgICB7CisgICAgICBpZiAodmVyYm9zZSkKKyAgICAgICAgaW5mbyAoImdlbmVyYXRpbmcgRklQUyAxODYtMiB0ZXN0IGtleSAlZFxuIiwgdG5vKTsKKworICAgICAgeworICAgICAgICB2b2lkICpkYXRhOworICAgICAgICBzaXplX3QgZGF0YWxlbjsKKworICAgICAgICBkYXRhID0gZGF0YV9mcm9tX2hleCAodGJsW3Rub10uc2VlZCwgJmRhdGFsZW4pOworICAgICAgICBlcnIgPSBnY3J5X3NleHBfYnVpbGQgKCZrZXlfc3BlYywgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKGdlbmtleSAoZHNhIChuYml0cyAlZCkodXNlLWZpcHMxODYtMikiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihkZXJpdmUtcGFybXMoc2VlZCAlYikpKSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRibFt0bm9dLm5iaXRzLCAoaW50KWRhdGFsZW4sIGRhdGEpOworICAgICAgICBnY3J5X2ZyZWUgKGRhdGEpOworICAgICAgfQorICAgICAgaWYgKGVycikKKyAgICAgICAgZGllICgiZXJyb3IgY3JlYXRpbmcgUy1leHByZXNzaW9uICVkOiAlc1xuIiwgdG5vLCBncGdfc3RyZXJyb3IgKGVycikpOworCisgICAgICBlcnIgPSBnY3J5X3BrX2dlbmtleSAoJmtleSwga2V5X3NwZWMpOworICAgICAgZ2NyeV9zZXhwX3JlbGVhc2UgKGtleV9zcGVjKTsKKyAgICAgIGlmIChlcnIpCisgICAgICAgIHsKKyAgICAgICAgICBmYWlsICgiZXJyb3IgZ2VuZXJhdGluZyBrZXkgJWQ6ICVzXG4iLCB0bm8sIGdwZ19zdHJlcnJvciAoZXJyKSk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKHZlcmJvc2UgPiAxKQorICAgICAgICBzaG93X3NleHAgKCJnZW5lcmF0ZWQga2V5OlxuIiwga2V5KTsKKworICAgICAgcHViX2tleSA9IGdjcnlfc2V4cF9maW5kX3Rva2VuIChrZXksICJwdWJsaWMta2V5IiwgMCk7CisgICAgICBpZiAoIXB1Yl9rZXkpCisgICAgICAgIGZhaWwgKCJwdWJsaWMgcGFydCBtaXNzaW5nIGluIGtleSAlZFxuIiwgdG5vKTsKKworICAgICAgc2VjX2tleSA9IGdjcnlfc2V4cF9maW5kX3Rva2VuIChrZXksICJwcml2YXRlLWtleSIsIDApOworICAgICAgaWYgKCFzZWNfa2V5KQorICAgICAgICBmYWlsICgicHJpdmF0ZSBwYXJ0IG1pc3NpbmcgaW4ga2V5ICVkXG4iLCB0bm8pOworCisgICAgICBsMSA9IGdjcnlfc2V4cF9maW5kX3Rva2VuIChrZXksICJtaXNjLWtleS1pbmZvIiwgMCk7CisgICAgICBpZiAoIWwxKQorICAgICAgICBmYWlsICgibWlzY19rZXlfaW5mbyBwYXJ0IG1pc3NpbmcgaW4ga2V5ICVkXG4iLCB0bm8pOworICAgICAgc2VlZF92YWx1ZXMgPSBnY3J5X3NleHBfZmluZF90b2tlbiAobDEsICJzZWVkLXZhbHVlcyIsIDApOworICAgICAgaWYgKCFzZWVkX3ZhbHVlcykKKyAgICAgICAgZmFpbCAoInNlZWQtdmFsdWVzIHBhcnQgbWlzc2luZyBpbiBrZXkgJWRcbiIsIHRubyk7CisgICAgICBnY3J5X3NleHBfcmVsZWFzZSAobDEpOworCisgICAgICBleHRyYWN0X2NtcF9tcGkgKHNlY19rZXksICJwIiwgdGJsW3Rub10ucCk7CisgICAgICBleHRyYWN0X2NtcF9tcGkgKHNlY19rZXksICJxIiwgdGJsW3Rub10ucSk7CisgICAgICBleHRyYWN0X2NtcF9tcGkgKHNlY19rZXksICJnIiwgdGJsW3Rub10uZyk7CisKKyAgICAgIGV4dHJhY3RfY21wX2RhdGEgKHNlZWRfdmFsdWVzLCAic2VlZCIsIHRibFt0bm9dLnNlZWQpOworICAgICAgZXh0cmFjdF9jbXBfaW50IChzZWVkX3ZhbHVlcywgImNvdW50ZXIiLCB0YmxbdG5vXS5jb3VudGVyKTsKKyAgICAgIGV4dHJhY3RfY21wX21waSAoc2VlZF92YWx1ZXMsICJoIiwgdGJsW3Rub10uaCk7CisKKyAgICAgIGdjcnlfc2V4cF9yZWxlYXNlIChzZWVkX3ZhbHVlcyk7CisgICAgICBnY3J5X3NleHBfcmVsZWFzZSAoc2VjX2tleSk7CisgICAgICBnY3J5X3NleHBfcmVsZWFzZSAocHViX2tleSk7CisgICAgICBnY3J5X3NleHBfcmVsZWFzZSAoa2V5KTsKKyAgICB9Cit9CisKKworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgaW50IGRlYnVnID0gMDsKKworICBpZiAoYXJnYyA+IDEgJiYgIXN0cmNtcCAoYXJndlsxXSwgIi0tdmVyYm9zZSIpKQorICAgIHZlcmJvc2UgPSAxOworICBlbHNlIGlmIChhcmdjID4gMSAmJiAhc3RyY21wIChhcmd2WzFdLCAiLS1kZWJ1ZyIpKQorICAgIHsKKyAgICAgIHZlcmJvc2UgPSAyOyAKKyAgICAgIGRlYnVnID0gMTsKKyAgICB9CisKKyAgZ2NyeV9jb250cm9sIChHQ1JZQ1RMX0RJU0FCTEVfU0VDTUVNLCAwKTsKKyAgaWYgKCFnY3J5X2NoZWNrX3ZlcnNpb24gKCIxLjQuNCIpKQorICAgIGRpZSAoInZlcnNpb24gbWlzbWF0Y2hcbiIpOworICBnY3J5X2NvbnRyb2wgKEdDUllDVExfSU5JVElBTElaQVRJT05fRklOSVNIRUQsIDApOworICBpZiAoZGVidWcpCisgICAgZ2NyeV9jb250cm9sIChHQ1JZQ1RMX1NFVF9ERUJVR19GTEFHUywgMXUsIDApOworICAvKiBObyB2YWx1YWJsZSBrZXlzIGFyZSBjcmVhdGUsIHNvIHdlIGNhbiBzcGVlZCB1cCBvdXIgUk5HLiAqLworICBnY3J5X2NvbnRyb2wgKEdDUllDVExfRU5BQkxFX1FVSUNLX1JBTkRPTSwgMCk7CisKKworICBjaGVja19kc2FfZ2VuXzE4Nl8yICgpOworCisKKyAgcmV0dXJuIGVycm9yX2NvdW50ID8gMSA6IDA7Cit9CmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvdGVzdHMvZmlwc2Rydi5jIGIvbGliZ2NyeXB0LTEuNC42L3Rlc3RzL2ZpcHNkcnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODBlMzBjCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L3Rlc3RzL2ZpcHNkcnYuYwpAQCAtMCwwICsxLDI1MjYgQEAKKy8qIGZpcHNkcnYuYyAgLSAgQSBkcml2ZXIgdG8gaGVscCB3aXRoIEZJUFMgQ0FWUyB0ZXN0cy4KKyAgIENvcHlyaWdodCAoQykgMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICAKKyAgIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgIAorICAgTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgIAorICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpZmRlZiBIQVZFX1czMl9TWVNURU0KKyMgaW5jbHVkZSA8ZmNudGwuaD4gLyogV2UgbmVlZCBzZXRtb2RlKCkuICAqLworI2Vsc2UKKyMgaW5jbHVkZSA8c2lnbmFsLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2lmZGVmIF9HQ1JZUFRfSU5fTElCR0NSWVBUCisjIGluY2x1ZGUgIi4uL3NyYy9nY3J5cHQuaCIKKyNlbHNlCisjIGluY2x1ZGUgPGdjcnlwdC5oPgorIyBkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgImRldm51bGxAZXhhbXBsZS5vcmciCisjIGRlZmluZSBQQUNLQUdFX1ZFUlNJT04gIltidWlsZCBvbiAiIF9fREFURV9fICIgIiBfX1RJTUVfXyAiXSIKKyNlbmRpZgorCisKKyNkZWZpbmUgUEdNICJmaXBzZHJ2IgorCisjZGVmaW5lIG15X2lzYXNjaWkoYykgKCEoKGMpICYgMHg4MCkpCisjZGVmaW5lIGRpZ2l0cChwKSAgICgqKHApID49ICcwJyAmJiAqKHApIDw9ICc5JykKKyNkZWZpbmUgaGV4ZGlnaXRwKGEpIChkaWdpdHAgKGEpICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIHx8ICgqKGEpID49ICdBJyAmJiAqKGEpIDw9ICdGJykgIFwKKyAgICAgICAgICAgICAgICAgICAgICB8fCAoKihhKSA+PSAnYScgJiYgKihhKSA8PSAnZicpKQorI2RlZmluZSB4dG9pXzEocCkgICAoKihwKSA8PSAnOSc/ICgqKHApLSAnMCcpOiBcCisgICAgICAgICAgICAgICAgICAgICAqKHApIDw9ICdGJz8gKCoocCktJ0EnKzEwKTooKihwKS0nYScrMTApKQorI2RlZmluZSB4dG9pXzIocCkgICAoKHh0b2lfMShwKSAqIDE2KSArIHh0b2lfMSgocCkrMSkpCisjZGVmaW5lIERJTSh2KSAgICAgICAgICAgICAgIChzaXplb2Yodikvc2l6ZW9mKCh2KVswXSkpCisjZGVmaW5lIERJTW9mKHR5cGUsbWVtYmVyKSAgIERJTSgoKHR5cGUgKikwKS0+bWVtYmVyKQorCisKKyNkZWZpbmUgUFJJVl9DVExfSU5JVF9FWFRSTkdfVEVTVCAgIDU4CisjZGVmaW5lIFBSSVZfQ1RMX1JVTl9FWFRSTkdfVEVTVCAgICA1OQorI2RlZmluZSBQUklWX0NUTF9ERUlOSVRfRVhUUk5HX1RFU1QgNjAKKyNkZWZpbmUgUFJJVl9DVExfRElTQUJMRV9XRUFLX0tFWSAgIDYxCisjZGVmaW5lIFBSSVZfQ1RMX0dFVF9JTlBVVF9WRUNUT1IgICA2MgorCisKKy8qIFZlcmJvc2UgbW9kZSBmbGFnLiAgKi8KK3N0YXRpYyBpbnQgdmVyYm9zZTsKKworLyogQmluYXJ5IGlucHV0IGZsYWcuICAqLworc3RhdGljIGludCBiaW5hcnlfaW5wdXQ7CisKKy8qIEJpbmFyeSBvdXRwdXQgZmxhZy4gICovCitzdGF0aWMgaW50IGJpbmFyeV9vdXRwdXQ7CisKKy8qIEJhc2U2NCBvdXRwdXQgZmxhZy4gICovCitzdGF0aWMgaW50IGJhc2U2NF9vdXRwdXQ7CisKKy8qIFdlIG5lZWQgdG8ga25vdyB3aGV0aGVyIHdlIGFyZSBpbiBsb29wX21vZGUuICAqLworc3RhdGljIGludCBsb29wX21vZGU7CisKKy8qIElmIHRydWUgc29tZSBmdW5jdGlvbnMgYXJlIG1vZGlmaWVkIHRvIHByaW50IHRoZSBvdXRwdXQgaW4gdGhlIENBVlMKKyAgIHJlc3BvbnNlIGZpbGUgZm9ybWF0LiAgKi8KK3N0YXRpYyBpbnQgc3RhbmRhbG9uZV9tb2RlOworCisKKy8qIEFTTi4xIGNsYXNzZXMuICAqLworZW51bQoreworICBVTklWRVJTQUwgPSAwLAorICBBUFBMSUNBVElPTiA9IDEsCisgIEFTTkNPTlRFWFQgPSAyLAorICBQUklWQVRFID0gMworfTsKKworCisvKiBBU04uMSB0YWdzLiAgKi8KK2VudW0KK3sKKyAgVEFHX05PTkUgPSAwLAorICBUQUdfQk9PTEVBTiA9IDEsCisgIFRBR19JTlRFR0VSID0gMiwKKyAgVEFHX0JJVF9TVFJJTkcgPSAzLAorICBUQUdfT0NURVRfU1RSSU5HID0gNCwKKyAgVEFHX05VTEwgPSA1LAorICBUQUdfT0JKRUNUX0lEID0gNiwKKyAgVEFHX09CSkVDVF9ERVNDUklQVE9SID0gNywKKyAgVEFHX0VYVEVSTkFMID0gOCwKKyAgVEFHX1JFQUwgPSA5LAorICBUQUdfRU5VTUVSQVRFRCA9IDEwLAorICBUQUdfRU1CRURERURfUERWID0gMTEsCisgIFRBR19VVEY4X1NUUklORyA9IDEyLAorICBUQUdfUkVBTFRJVkVfT0lEID0gMTMsCisgIFRBR19TRVFVRU5DRSA9IDE2LAorICBUQUdfU0VUID0gMTcsCisgIFRBR19OVU1FUklDX1NUUklORyA9IDE4LAorICBUQUdfUFJJTlRBQkxFX1NUUklORyA9IDE5LAorICBUQUdfVEVMRVRFWF9TVFJJTkcgPSAyMCwKKyAgVEFHX1ZJREVPVEVYX1NUUklORyA9IDIxLAorICBUQUdfSUE1X1NUUklORyA9IDIyLAorICBUQUdfVVRDX1RJTUUgPSAyMywKKyAgVEFHX0dFTkVSQUxJWkVEX1RJTUUgPSAyNCwKKyAgVEFHX0dSQVBISUNfU1RSSU5HID0gMjUsCisgIFRBR19WSVNJQkxFX1NUUklORyA9IDI2LAorICBUQUdfR0VORVJBTF9TVFJJTkcgPSAyNywKKyAgVEFHX1VOSVZFUlNBTF9TVFJJTkcgPSAyOCwKKyAgVEFHX0NIQVJBQ1RFUl9TVFJJTkcgPSAyOSwKKyAgVEFHX0JNUF9TVFJJTkcgPSAzMAorfTsKKworLyogQVNOLjEgUGFyc2VyIG9iamVjdC4gICovCitzdHJ1Y3QgdGFnX2luZm8gCit7CisgIGludCBjbGFzczsgICAgICAgICAgICAgLyogT2JqZWN0IGNsYXNzLiAgKi8KKyAgdW5zaWduZWQgbG9uZyB0YWc7ICAgICAvKiBUaGUgdGFnIG9mIHRoZSBvYmplY3QuICAqLworICB1bnNpZ25lZCBsb25nIGxlbmd0aDsgIC8qIExlbmd0aCBvZiB0aGUgdmFsdWVzLiAgKi8KKyAgaW50IG5oZHI7ICAgICAgICAgICAgICAvKiBMZW5ndGggb2YgdGhlIGhlYWRlciAoVEwpLiAgKi8KKyAgdW5zaWduZWQgaW50IG5kZWY6MTsgICAvKiBUaGUgb2JqZWN0IGhhcyBhbiBpbmRlZmluaXRlIGxlbmd0aC4gICovCisgIHVuc2lnbmVkIGludCBjb25zOjE7ICAgLyogVGhpcyBpcyBhIGNvbnN0cnVjdGVkIG9iamVjdC4gICovIAorfTsKKworCisKKy8qIFByaW50IGEgZXJyb3IgbWVzc2FnZSBhbmQgZXhpdCB0aGUgcHJvY2VzcyB3aXRoIGFuIGVycm9yIGNvZGUuICAqLworc3RhdGljIHZvaWQKK2RpZSAoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgIHZhX2xpc3QgYXJnX3B0cjsKKworICB2YV9zdGFydCAoYXJnX3B0ciwgZm9ybWF0KTsKKyAgZnB1dHMgKFBHTSAiOiAiLCBzdGRlcnIpOworICB2ZnByaW50ZiAoc3RkZXJyLCBmb3JtYXQsIGFyZ19wdHIpOworICB2YV9lbmQgKGFyZ19wdHIpOworICBleGl0ICgxKTsKK30KKworCitzdGF0aWMgdm9pZAorc2hvd2hleCAoY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBsZW5ndGgpCit7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAgPSBidWZmZXI7CisKKyAgaWYgKHByZWZpeCkKKyAgICBmcHJpbnRmIChzdGRlcnIsIFBHTSAiOiAlczogIiwgcHJlZml4KTsKKyAgd2hpbGUgKGxlbmd0aC0tICkKKyAgICBmcHJpbnRmIChzdGRlcnIsICIlMDJYIiwgKnArKyk7CisgIGlmIChwcmVmaXgpCisgICAgcHV0YyAoJ1xuJywgc3RkZXJyKTsKK30KKworLyogc3RhdGljIHZvaWQgKi8KKy8qIHNob3dfc2V4cCAoY29uc3QgY2hhciAqcHJlZml4LCBnY3J5X3NleHBfdCBhKSAqLworLyogeyAqLworLyogICBjaGFyICpidWY7ICovCisvKiAgIHNpemVfdCBzaXplOyAqLworCisvKiAgIGlmIChwcmVmaXgpICovCisvKiAgICAgZnB1dHMgKHByZWZpeCwgc3RkZXJyKTsgKi8KKy8qICAgc2l6ZSA9IGdjcnlfc2V4cF9zcHJpbnQgKGEsIEdDUllTRVhQX0ZNVF9BRFZBTkNFRCwgTlVMTCwgMCk7ICovCisvKiAgIGJ1ZiA9IGdjcnlfeG1hbGxvYyAoc2l6ZSk7ICovCisKKy8qICAgZ2NyeV9zZXhwX3NwcmludCAoYSwgR0NSWVNFWFBfRk1UX0FEVkFOQ0VELCBidWYsIHNpemUpOyAqLworLyogICBmcHJpbnRmIChzdGRlcnIsICIlLipzIiwgKGludClzaXplLCBidWYpOyAqLworLyogICBnY3J5X2ZyZWUgKGJ1Zik7ICovCisvKiB9ICovCisKKworLyogQ29udmVydCBTVFJJTkcgY29uc2lzdGluZyBvZiBoZXggY2hhcmFjdGVycyBpbnRvIGl0cyBiaW5hcnkKKyAgIHJlcHJlc2VudGF0aW9uIGFuZCBzdG9yZSB0aGF0IGF0IEJVRkZFUi4gIEJVRkZFUiBuZWVkcyB0byBiZSBvZgorICAgTEVOR1RIIGJ5dGVzLiAgVGhlIGZ1bmN0aW9uIGNoZWNrcyB0aGF0IHRoZSBTVFJJTkcgd2lsbCBjb252ZXJ0CisgICBleGFjdGx5IHRvIExFTkdUSCBieXRlcy4gVGhlIHN0cmluZyBpcyBkZWxpbWl0ZWQgYnkgZWl0aGVyIGVuZCBvZgorICAgc3RyaW5nIG9yIGEgd2hpdGUgc3BhY2UgY2hhcmFjdGVyLiAgVGhlIGZ1bmN0aW9uIHJldHVybnMgLTEgb24KKyAgIGVycm9yIG9yIHRoZSBsZW5ndGggb2YgdGhlIHBhcnNlZCBzdHJpbmcuICAqLworc3RhdGljIGludAoraGV4MmJpbiAoY29uc3QgY2hhciAqc3RyaW5nLCB2b2lkICpidWZmZXIsIHNpemVfdCBsZW5ndGgpCit7CisgIGludCBpOworICBjb25zdCBjaGFyICpzID0gc3RyaW5nOworCisgIGZvciAoaT0wOyBpIDwgbGVuZ3RoOyApCisgICAgeworICAgICAgaWYgKCFoZXhkaWdpdHAgKHMpIHx8ICFoZXhkaWdpdHAgKHMrMSkpCisgICAgICAgIHJldHVybiAtMTsgICAgICAgICAgIC8qIEludmFsaWQgaGV4IGRpZ2l0cy4gKi8KKyAgICAgICgodW5zaWduZWQgY2hhciopYnVmZmVyKVtpKytdID0geHRvaV8yIChzKTsKKyAgICAgIHMgKz0gMjsKKyAgICB9CisgIGlmICgqcyAmJiAoIW15X2lzYXNjaWkgKCpzKSB8fCAhaXNzcGFjZSAoKnMpKSApCisgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAvKiBOb3QgZm9sbG93ZWQgYnkgTnVsIG9yIHdoaXRlIHNwYWNlLiAgKi8KKyAgaWYgKGkgIT0gbGVuZ3RoKQorICAgIHJldHVybiAtMTsgICAgICAgICAgICAgLyogTm90IG9mIGV4cGVjdGVkIGxlbmd0aC4gICovCisgIGlmICgqcykKKyAgICBzKys7IC8qIFNraXAgdGhlIGRlbGltaXRlci4gKi8KKyAgcmV0dXJuIHMgLSBzdHJpbmc7Cit9CisKKworLyogQ29udmVydCBTVFJJTkcgY29uc2lzdGluZyBvZiBoZXggY2hhcmFjdGVycyBpbnRvIGl0cyBiaW5hcnkKKyAgIHJlcHJlc2VudGF0aW9uIGFuZCByZXR1cm4gaXQgYXMgYW4gYWxsb2NhdGVkIGJ1ZmZlci4gVGhlIHZhbGlkCisgICBsZW5ndGggb2YgdGhlIGJ1ZmZlciBpcyByZXR1cm5lZCBhdCBSX0xFTkdUSC4gIFRoZSBzdHJpbmcgaXMKKyAgIGRlbGltaXRlZCBieSBlbmQgb2Ygc3RyaW5nLiAgVGhlIGZ1bmN0aW9uIHJldHVybnMgTlVMTCBvbgorICAgZXJyb3IuICAqLworc3RhdGljIHZvaWQgKgoraGV4MmJ1ZmZlciAoY29uc3QgY2hhciAqc3RyaW5nLCBzaXplX3QgKnJfbGVuZ3RoKQoreworICBjb25zdCBjaGFyICpzOworICB1bnNpZ25lZCBjaGFyICpidWZmZXI7CisgIHNpemVfdCBsZW5ndGg7CisKKyAgYnVmZmVyID0gZ2NyeV94bWFsbG9jIChzdHJsZW4oc3RyaW5nKS8yKzEpOworICBsZW5ndGggPSAwOworICBmb3IgKHM9c3RyaW5nOyAqczsgcyArPTIgKQorICAgIHsKKyAgICAgIGlmICghaGV4ZGlnaXRwIChzKSB8fCAhaGV4ZGlnaXRwIChzKzEpKQorICAgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgIC8qIEludmFsaWQgaGV4IGRpZ2l0cy4gKi8KKyAgICAgICgodW5zaWduZWQgY2hhciopYnVmZmVyKVtsZW5ndGgrK10gPSB4dG9pXzIgKHMpOworICAgIH0KKyAgKnJfbGVuZ3RoID0gbGVuZ3RoOworICByZXR1cm4gYnVmZmVyOworfQorCisKK3N0YXRpYyBjaGFyICoKK3JlYWRfdGV4dGxpbmUgKEZJTEUgKmZwKQoreworICBjaGFyIGxpbmVbMjU2XTsKKyAgY2hhciAqcDsKKyAgaW50IGFueSA9IDA7CisKKyAgLyogUmVhZCBsaW5lIGJ1dCBza2lwIG92ZXIgaW5pdGlhbCBlbXB0eSBsaW5lcy4gICovCisgIGRvCisgICAgeworICAgICAgZG8gCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIWZnZXRzIChsaW5lLCBzaXplb2YgbGluZSwgZnApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoZmVvZiAoZnApKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICBkaWUgKCJlcnJvciByZWFkaW5nIGlucHV0IGxpbmU6ICVzXG4iLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBwID0gc3RyY2hyIChsaW5lLCAnXG4nKTsKKyAgICAgICAgICBpZiAocCkKKyAgICAgICAgICAgICpwID0gMDsKKyAgICAgICAgICBwID0gbGluZSArICgqbGluZT8gKHN0cmxlbiAobGluZSktMSk6MCk7CisgICAgICAgICAgZm9yICggO3AgPiBsaW5lOyBwLS0pCisgICAgICAgICAgICBpZiAobXlfaXNhc2NpaSAoKnApICYmIGlzc3BhY2UgKCpwKSkKKyAgICAgICAgICAgICAgKnAgPSAwOworICAgICAgICB9CisgICAgICB3aGlsZSAoIWFueSAmJiAhKmxpbmUpOworICAgICAgYW55ID0gMTsKKyAgICB9CisgIHdoaWxlICgqbGluZSA9PSAnIycpOyAgLyogQWx3YXlzIHNraXAgY29tbWVudCBsaW5lcy4gICovCisgIGlmICh2ZXJib3NlID4gMSkKKyAgICBmcHJpbnRmIChzdGRlcnIsIFBHTSAiOiByZWNlaXZlZCBsaW5lOiAlc1xuIiwgbGluZSk7CisgIHJldHVybiBnY3J5X3hzdHJkdXAgKGxpbmUpOworfQorCitzdGF0aWMgY2hhciAqCityZWFkX2hleGxpbmUgKEZJTEUgKmZwLCBzaXplX3QgKnJldGxlbikKK3sKKyAgY2hhciAqbGluZSwgKnA7CisKKyAgbGluZSA9IHJlYWRfdGV4dGxpbmUgKGZwKTsKKyAgaWYgKCFsaW5lKQorICAgIHJldHVybiBOVUxMOworICBwID0gaGV4MmJ1ZmZlciAobGluZSwgcmV0bGVuKTsKKyAgaWYgKCFwKQorICAgIGRpZSAoImVycm9yIGRlY29kaW5nIGhleCBzdHJpbmcgb24gaW5wdXRcbiIpOworICBnY3J5X2ZyZWUgKGxpbmUpOworICByZXR1cm4gcDsKK30KKworc3RhdGljIHZvaWQKK3NraXBfdG9fZW1wdHlfbGluZSAoRklMRSAqZnApCit7CisgIGNoYXIgbGluZVsyNTZdOworICBjaGFyICpwOworCisgIGRvCisgICAgeworICAgICAgaWYgKCFmZ2V0cyAobGluZSwgc2l6ZW9mIGxpbmUsIGZwKSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChmZW9mIChmcCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgZGllICgiZXJyb3IgcmVhZGluZyBpbnB1dCBsaW5lOiAlc1xuIiwgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgIH0KKyAgICAgIHAgPSBzdHJjaHIgKGxpbmUsICdcbicpOworICAgICAgaWYgKHApCisgICAgICAgICpwID0wOworICAgIH0KKyAgd2hpbGUgKCpsaW5lKTsKK30KKworCisKKy8qIFJlYWQgYSBmaWxlIGZyb20gc3RyZWFtIEZQIGludG8gYSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyIGFuZCByZXR1cm4KKyAgIHRoYXQgYnVmZmVyLiAgVGhlIHZhbGlkIGxlbmd0aCBvZiB0aGUgYnVmZmVyIGlzIHN0b3JlZCBhdCBSX0xFTkdUSC4KKyAgIFJldHVybnMgTlVMTCBvbiBmYWlsdXJlLiAgSWYgZGVjb2RlIGlzIHNldCwgdGhlIGZpbGUgaXMgYXNzdW1lZCB0bworICAgYmUgaGV4IGVuY29kZWQgYW5kIHRoZSBkZWNvZGVkIGNvbnRlbnQgaXMgcmV0dXJuZWQuICovCitzdGF0aWMgdm9pZCAqCityZWFkX2ZpbGUgKEZJTEUgKmZwLCBpbnQgZGVjb2RlLCBzaXplX3QgKnJfbGVuZ3RoKQoreworICBjaGFyICpidWZmZXI7CisgIHNpemVfdCBidWZsZW47CisgIHNpemVfdCBucmVhZCwgYnVmc2l6ZSA9IDA7CisKKyAgKnJfbGVuZ3RoID0gMDsKKyNkZWZpbmUgTkNIVU5LIDgxOTIKKyNpZmRlZiBIQVZFX0RPU0lTSF9TWVNURU0KKyAgc2V0bW9kZSAoZmlsZW5vKGZwKSwgT19CSU5BUlkpOworI2VuZGlmCisgIGJ1ZmZlciA9IE5VTEw7CisgIGJ1ZmxlbiA9IDA7CisgIGRvIAorICAgIHsKKyAgICAgIGJ1ZnNpemUgKz0gTkNIVU5LOworICAgICAgaWYgKCFidWZmZXIpCisgICAgICAgIGJ1ZmZlciA9IGdjcnlfeG1hbGxvYyAoYnVmc2l6ZSk7CisgICAgICBlbHNlCisgICAgICAgIGJ1ZmZlciA9IGdjcnlfeHJlYWxsb2MgKGJ1ZmZlciwgYnVmc2l6ZSk7CisgICAgICAKKyAgICAgIG5yZWFkID0gZnJlYWQgKGJ1ZmZlciArIGJ1ZmxlbiwgMSwgTkNIVU5LLCBmcCk7CisgICAgICBpZiAobnJlYWQgPCBOQ0hVTksgJiYgZmVycm9yIChmcCkpCisgICAgICAgIHsKKyAgICAgICAgICBnY3J5X2ZyZWUgKGJ1ZmZlcik7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgIGJ1ZmxlbiArPSBucmVhZDsKKyAgICB9CisgIHdoaWxlIChucmVhZCA9PSBOQ0hVTkspOworI3VuZGVmIE5DSFVOSworICBpZiAoZGVjb2RlKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKnM7CisgICAgICBjaGFyICpwOworCisgICAgICBmb3IgKHM9YnVmZmVyLHA9YnVmZmVyLG5yZWFkPTA7IG5yZWFkKzEgPCBidWZsZW47IHMgKz0gMiwgbnJlYWQgKz0yICkKKyAgICAgICAgeworICAgICAgICAgIGlmICghaGV4ZGlnaXRwIChzKSB8fCAhaGV4ZGlnaXRwIChzKzEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBnY3J5X2ZyZWUgKGJ1ZmZlcik7CisgICAgICAgICAgICAgIHJldHVybiBOVUxMOyAgLyogSW52YWxpZCBoZXggZGlnaXRzLiAqLworICAgICAgICAgICAgfQorICAgICAgICAgICoodW5zaWduZWQgY2hhciopcCsrID0geHRvaV8yIChzKTsKKyAgICAgICAgfQorICAgICAgaWYgKG5yZWFkICE9IGJ1ZmxlbikKKyAgICAgICAgeworICAgICAgICAgIGdjcnlfZnJlZSAoYnVmZmVyKTsKKyAgICAgICAgICByZXR1cm4gTlVMTDsgIC8qIE9kZCBudW1iZXIgb2YgaGV4IGRpZ2l0cy4gKi8KKyAgICAgICAgfQorICAgICAgYnVmbGVuID0gcCAtIGJ1ZmZlcjsKKyAgICB9CisKKyAgKnJfbGVuZ3RoID0gYnVmbGVuOworICByZXR1cm4gYnVmZmVyOworfQorCisvKiBEbyBpbi1wbGFjZSBkZWNvZGluZyBvZiBiYXNlLTY0IGRhdGEgb2YgTEVOR1RIIGluIEJVRkZFUi4gIFJldHVybnMKKyAgIHRoZSBuZXcgbGVuZ3RoIG9mIHRoZSBidWZmZXIuICBEaWVzIG9uIGVycm9yLiAgKi8KK3N0YXRpYyBzaXplX3QKK2Jhc2U2NF9kZWNvZGUgKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkKK3sKKyAgc3RhdGljIHVuc2lnbmVkIGNoYXIgY29uc3QgYXNjdG9iaW5bMTI4XSA9IAorICAgIHsKKyAgICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4M2UsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4M2YsCisgICAgICAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweGZmLCAweGZmLAorICAgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwKKyAgICAgIDB4MDcsIDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIDB4MTAsIDB4MTEsIDB4MTIsCisgICAgICAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAweDE4LCAweDE5LCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgMHhmZiwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwKKyAgICAgIDB4MjUsIDB4MjYsIDB4MjcsIDB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIDB4MzAsCisgICAgICAweDMxLCAweDMyLCAweDMzLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmIAorICAgIH07CisKKyAgaW50IGlkeCA9IDA7CisgIHVuc2lnbmVkIGNoYXIgdmFsID0gMDsKKyAgaW50IGMgPSAwOworICBjaGFyICpkLCAqczsKKyAgaW50IGxmc2VlbiA9IDE7CisKKyAgLyogRmluZCBCRUdJTiBsaW5lLiAgKi8KKyAgZm9yIChzPWJ1ZmZlcjsgbGVuZ3RoOyBsZW5ndGgtLSwgcysrKQorICAgIHsKKyAgICAgIGlmIChsZnNlZW4gJiYgKnMgPT0gJy0nICYmIGxlbmd0aCA+IDExICYmICFtZW1jbXAgKHMsICItLS0tLUJFR0lOICIsIDExKSkKKyAgICAgICAgeworICAgICAgICAgIGZvciAoOyBsZW5ndGggJiYgKnMgIT0gJ1xuJzsgbGVuZ3RoLS0sIHMrKykKKyAgICAgICAgICAgIDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSAKKyAgICAgIGxmc2VlbiA9ICgqcyA9PSAnXG4nKTsKKyAgICB9CisKKyAgLyogRGVjb2RlIHVudGlsIHBhZCBjaGFyYWN0ZXIgb3IgRU5EIGxpbmUuICAqLworICBmb3IgKGQ9YnVmZmVyOyBsZW5ndGg7IGxlbmd0aC0tLCBzKyspCisgICAgeworICAgICAgaWYgKGxmc2VlbiAmJiAqcyA9PSAnLScgJiYgbGVuZ3RoID4gOSAmJiAhbWVtY21wIChzLCAiLS0tLS1FTkQgIiwgOSkpCisgICAgICAgIGJyZWFrOworICAgICAgaWYgKChsZnNlZW4gPSAoKnMgPT0gJ1xuJykpIHx8ICpzID09ICcgJyB8fCAqcyA9PSAnXHInIHx8ICpzID09ICdcdCcpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgaWYgKCpzID09ICc9JykKKyAgICAgICAgeworICAgICAgICAgIC8qIFBhZCBjaGFyYWN0ZXI6IHN0b3AgKi8KKyAgICAgICAgICBpZiAoaWR4ID09IDEpCisgICAgICAgICAgICAqZCsrID0gdmFsOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgIGlmICggKCpzICYgMHg4MCkgfHwgKGMgPSBhc2N0b2JpblsqKHVuc2lnbmVkIGNoYXIgKilzXSkgPT0gMHhmZikKKyAgICAgICAgZGllICgiaW52YWxpZCBiYXNlNjQgY2hhcmFjdGVyICUwMlggYXQgcG9zICVkIGRldGVjdGVkXG4iLAorICAgICAgICAgICAgICoodW5zaWduZWQgY2hhciopcywgKGludCkocy1idWZmZXIpKTsKKworICAgICAgc3dpdGNoIChpZHgpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgIHZhbCA9IGMgPDwgMjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgIHZhbCB8PSAoYz4+NCkmMzsKKyAgICAgICAgICAqZCsrID0gdmFsOworICAgICAgICAgIHZhbCA9IChjPDw0KSYweGYwOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgdmFsIHw9IChjPj4yKSYxNTsKKyAgICAgICAgICAqZCsrID0gdmFsOworICAgICAgICAgIHZhbCA9IChjPDw2KSYweGMwOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgdmFsIHw9IGMmMHgzZjsKKyAgICAgICAgICAqZCsrID0gdmFsOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBpZHggPSAoaWR4KzEpICUgNDsKKyAgICB9CisKKyAgcmV0dXJuIGQgLSBidWZmZXI7Cit9CisKKworLyogUGFyc2UgdGhlIGJ1ZmZlciBhdCB0aGUgYWRkcmVzcyBCVUZGRVIgd2hpY2ggY29uc2lzdHMgb2YgdGhlIG51bWJlcgorICAgb2Ygb2N0ZXRzIGFzIHN0b3JlZCBhdCBCVUZMRU4uICBSZXR1cm4gdGhlIHRhZyBhbmQgdGhlIGxlbmd0aCBwYXJ0CisgICBmcm9tIHRoZSBUTFYgdHJpcGxldC4gIFVwZGF0ZSBCVUZGRVIgYW5kIEJVRkxFTiBvbiBzdWNjZXNzLiAgQ2hlY2tzCisgICB0aGF0IHRoZSBlbmNvZGVkIGxlbmd0aCBkb2VzIG5vdCBleGhhdXN0IHRoZSBsZW5ndGggb2YgdGhlIHByb3ZpZGVkCisgICBidWZmZXIuICovCitzdGF0aWMgaW50IAorcGFyc2VfdGFnICh1bnNpZ25lZCBjaGFyIGNvbnN0ICoqYnVmZmVyLCBzaXplX3QgKmJ1Zmxlbiwgc3RydWN0IHRhZ19pbmZvICp0aSkKK3sKKyAgaW50IGM7CisgIHVuc2lnbmVkIGxvbmcgdGFnOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYgPSAqYnVmZmVyOworICBzaXplX3QgbGVuZ3RoID0gKmJ1ZmxlbjsKKworICB0aS0+bGVuZ3RoID0gMDsKKyAgdGktPm5kZWYgPSAwOworICB0aS0+bmhkciA9IDA7CisKKyAgLyogR2V0IHRoZSB0YWcgKi8KKyAgaWYgKCFsZW5ndGgpCisgICAgcmV0dXJuIC0xOyAvKiBQcmVtYXR1cmUgRU9GLiAgKi8KKyAgYyA9ICpidWYrKzsgbGVuZ3RoLS07CisgIHRpLT5uaGRyKys7CisKKyAgdGktPmNsYXNzID0gKGMgJiAweGMwKSA+PiA2OworICB0aS0+Y29ucyAgPSAhIShjICYgMHgyMCk7CisgIHRhZyAgICAgICA9IChjICYgMHgxZik7CisKKyAgaWYgKHRhZyA9PSAweDFmKQorICAgIHsKKyAgICAgIHRhZyA9IDA7CisgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgdGFnIDw8PSA3OworICAgICAgICAgIGlmICghbGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIC0xOyAvKiBQcmVtYXR1cmUgRU9GLiAgKi8KKyAgICAgICAgICBjID0gKmJ1ZisrOyBsZW5ndGgtLTsKKyAgICAgICAgICB0aS0+bmhkcisrOworICAgICAgICAgIHRhZyB8PSAoYyAmIDB4N2YpOworICAgICAgICB9CisgICAgICB3aGlsZSAoIChjICYgMHg4MCkgKTsKKyAgICB9CisgIHRpLT50YWcgPSB0YWc7CisKKyAgLyogR2V0IHRoZSBsZW5ndGggKi8KKyAgaWYgKCFsZW5ndGgpCisgICAgcmV0dXJuIC0xOyAvKiBQcmVtYXR1cmUgRU9GLiAqLworICBjID0gKmJ1ZisrOyBsZW5ndGgtLTsKKyAgdGktPm5oZHIrKzsKKworICBpZiAoICEoYyAmIDB4ODApICkKKyAgICB0aS0+bGVuZ3RoID0gYzsKKyAgZWxzZSBpZiAoYyA9PSAweDgwKQorICAgIHRpLT5uZGVmID0gMTsKKyAgZWxzZSBpZiAoYyA9PSAweGZmKQorICAgIHJldHVybiAtMTsgLyogRm9yYmlkZGVuIGxlbmd0aCB2YWx1ZS4gICovCisgIGVsc2UKKyAgICB7CisgICAgICB1bnNpZ25lZCBsb25nIGxlbiA9IDA7CisgICAgICBpbnQgY291bnQgPSBjICYgMHg3ZjsKKworICAgICAgZm9yICg7IGNvdW50OyBjb3VudC0tKQorICAgICAgICB7CisgICAgICAgICAgbGVuIDw8PSA4OworICAgICAgICAgIGlmICghbGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIC0xOyAvKiBQcmVtYXR1cmUgRU9GLiAgKi8KKyAgICAgICAgICBjID0gKmJ1ZisrOyBsZW5ndGgtLTsKKyAgICAgICAgICB0aS0+bmhkcisrOworICAgICAgICAgIGxlbiB8PSAoYyAmIDB4ZmYpOworICAgICAgICB9CisgICAgICB0aS0+bGVuZ3RoID0gbGVuOworICAgIH0KKyAgCisgIGlmICh0aS0+Y2xhc3MgPT0gVU5JVkVSU0FMICYmICF0aS0+dGFnKQorICAgIHRpLT5sZW5ndGggPSAwOworCisgIGlmICh0aS0+bGVuZ3RoID4gbGVuZ3RoKQorICAgIHJldHVybiAtMTsgLyogRGF0YSBsYXJnZXIgdGhhbiBidWZmZXIuICAqLworICAKKyAgKmJ1ZmZlciA9IGJ1ZjsKKyAgKmJ1ZmxlbiA9IGxlbmd0aDsKKyAgcmV0dXJuIDA7Cit9CisKKworLyogUmVhZCB0aGUgZmlsZSBGTkFNRSBhc3N1bWluZyBpdCBpcyBhIFBFTSBlbmNvZGVkIHByaXZhdGUga2V5IGZpbGUKKyAgIGFuZCByZXR1cm4gYW4gUy1leHByZXNzaW9uLiAgV2l0aCBTSE9XIHNldCwgdGhlIGtleSBwYXJhbWV0ZXJzIGFyZQorICAgcHJpbnRlZC4gICovCitzdGF0aWMgZ2NyeV9zZXhwX3QKK3JlYWRfcHJpdmF0ZV9rZXlfZmlsZSAoY29uc3QgY2hhciAqZm5hbWUsIGludCBzaG93KQoreworICBnY3J5X2Vycm9yX3QgZXJyOworICBGSUxFICpmcDsKKyAgY2hhciAqYnVmZmVyOworICBzaXplX3QgYnVmbGVuOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpkZXI7CisgIHNpemVfdCBkZXJsZW47CisgIHN0cnVjdCB0YWdfaW5mbyB0aTsKKyAgZ2NyeV9tcGlfdCBrZXlwYXJtc1s4XTsKKyAgaW50IG5fa2V5cGFybXMgPSA4OworICBpbnQgaWR4OworICBnY3J5X3NleHBfdCBzX2tleTsKKworICBmcCA9IGZvcGVuIChmbmFtZSwgYmluYXJ5X2lucHV0PyJyYiI6InIiKTsKKyAgaWYgKCFmcCkKKyAgICBkaWUgKCJjYW4ndCBvcGVuIGAlcyc6ICVzXG4iLCBmbmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7CisgIGJ1ZmZlciA9IHJlYWRfZmlsZSAoZnAsIDAsICZidWZsZW4pOworICBpZiAoIWJ1ZmZlcikKKyAgICBkaWUgKCJlcnJvciByZWFkaW5nIGAlcydcbiIsIGZuYW1lKTsKKyAgZmNsb3NlIChmcCk7CisKKyAgYnVmbGVuID0gYmFzZTY0X2RlY29kZSAoYnVmZmVyLCBidWZsZW4pOworICAKKyAgLyogUGFyc2UgdGhlIEFTTi4xIHN0cnVjdHVyZS4gICovCisgIGRlciA9IChjb25zdCB1bnNpZ25lZCBjaGFyKilidWZmZXI7CisgIGRlcmxlbiA9IGJ1ZmxlbjsKKyAgaWYgKCBwYXJzZV90YWcgKCZkZXIsICZkZXJsZW4sICZ0aSkKKyAgICAgICB8fCB0aS50YWcgIT0gVEFHX1NFUVVFTkNFIHx8IHRpLmNsYXNzIHx8ICF0aS5jb25zIHx8IHRpLm5kZWYpCisgICAgZ290byBiYWRfYXNuMTsKKyAgaWYgKCBwYXJzZV90YWcgKCZkZXIsICZkZXJsZW4sICZ0aSkKKyAgICAgICB8fCB0aS50YWcgIT0gVEFHX0lOVEVHRVIgfHwgdGkuY2xhc3MgfHwgdGkuY29ucyB8fCB0aS5uZGVmKQorICAgIGdvdG8gYmFkX2FzbjE7CisgIGlmICh0aS5sZW5ndGggIT0gMSB8fCAqZGVyKQorICAgIGdvdG8gYmFkX2FzbjE7ICAvKiBUaGUgdmFsdWUgb2YgdGhlIGZpcnN0IGludGVnZXIgaXMgbm8gMC4gKi8KKyAgZGVyICs9IHRpLmxlbmd0aDsgZGVybGVuIC09IHRpLmxlbmd0aDsKKworICBmb3IgKGlkeD0wOyBpZHggPCBuX2tleXBhcm1zOyBpZHgrKykKKyAgICB7CisgICAgICBpZiAoIHBhcnNlX3RhZyAoJmRlciwgJmRlcmxlbiwgJnRpKQorICAgICAgICAgICB8fCB0aS50YWcgIT0gVEFHX0lOVEVHRVIgfHwgdGkuY2xhc3MgfHwgdGkuY29ucyB8fCB0aS5uZGVmKQorICAgICAgICBnb3RvIGJhZF9hc24xOworICAgICAgaWYgKHNob3cpCisgICAgICAgIHsKKyAgICAgICAgICBjaGFyIHByZWZpeFsyXTsKKworICAgICAgICAgIHByZWZpeFswXSA9IGlkeCA8IDg/ICJuZWRwcTEydSJbaWR4XSA6ICc/JzsKKyAgICAgICAgICBwcmVmaXhbMV0gPSAwOworICAgICAgICAgIHNob3doZXggKHByZWZpeCwgZGVyLCB0aS5sZW5ndGgpOworICAgICAgICB9CisgICAgICBlcnIgPSBnY3J5X21waV9zY2FuIChrZXlwYXJtcytpZHgsIEdDUllNUElfRk1UX1VTRywgZGVyLCB0aS5sZW5ndGgsTlVMTCk7CisgICAgICBpZiAoZXJyKQorICAgICAgICBkaWUgKCJlcnJvciBzY2FubmluZyBSU0EgcGFyYW1ldGVyICVkOiAlc1xuIiwgaWR4LCBncGdfc3RyZXJyb3IgKGVycikpOworICAgICAgZGVyICs9IHRpLmxlbmd0aDsgZGVybGVuIC09IHRpLmxlbmd0aDsKKyAgICB9CisgIGlmIChpZHggIT0gbl9rZXlwYXJtcykKKyAgICBkaWUgKCJub3QgZW5vdWdoIFJTQSBrZXkgcGFyYW1ldGVyc1xuIik7CisKKyAgZ2NyeV9mcmVlIChidWZmZXIpOworCisgIC8qIENvbnZlcnQgZnJvbSBPcGVuU1NMIHBhcmFtZXRlciBvcmRlcmluZyB0byB0aGUgT3BlblBHUCBvcmRlci4gKi8KKyAgLyogRmlyc3QgY2hlY2sgdGhhdCBwIDwgcTsgaWYgbm90IHN3YXAgcCBhbmQgcSBhbmQgcmVjb21wdXRlIHUuICAqLyAKKyAgaWYgKGdjcnlfbXBpX2NtcCAoa2V5cGFybXNbM10sIGtleXBhcm1zWzRdKSA+IDApCisgICAgeworICAgICAgZ2NyeV9tcGlfc3dhcCAoa2V5cGFybXNbM10sIGtleXBhcm1zWzRdKTsKKyAgICAgIGdjcnlfbXBpX2ludm0gKGtleXBhcm1zWzddLCBrZXlwYXJtc1szXSwga2V5cGFybXNbNF0pOworICAgIH0KKyAgCisgIC8qIEJ1aWxkIHRoZSBTLWV4cHJlc3Npb24uICAqLworICBlcnIgPSBnY3J5X3NleHBfYnVpbGQgKCZzX2tleSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiKHByaXZhdGUta2V5KHJzYShuJW0pKGUlbSkiCisgICAgICAgICAgICAgICAgICAgICAgICAgLyoqLyAgICAgICAgICAgICIoZCVtKShwJW0pKHElbSkodSVtKSkpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBrZXlwYXJtc1swXSwga2V5cGFybXNbMV0sIGtleXBhcm1zWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGtleXBhcm1zWzNdLCBrZXlwYXJtc1s0XSwga2V5cGFybXNbN10gKTsKKyAgaWYgKGVycikKKyAgICBkaWUgKCJlcnJvciBidWlsZGluZyBTLWV4cHJlc3Npb246ICVzXG4iLCBncGdfc3RyZXJyb3IgKGVycikpOworICAKKyAgZm9yIChpZHg9MDsgaWR4IDwgbl9rZXlwYXJtczsgaWR4KyspCisgICAgZ2NyeV9tcGlfcmVsZWFzZSAoa2V5cGFybXNbaWR4XSk7CisgIAorICByZXR1cm4gc19rZXk7CisgIAorIGJhZF9hc24xOgorICBkaWUgKCJpbnZhbGlkIEFTTi4xIHN0cnVjdHVyZSBpbiBgJXMnXG4iLCBmbmFtZSk7CisgIHJldHVybiBOVUxMOyAvKk5PVFJFQUNIRUQqLworfQorCisKKy8qIFJlYWQgdGhlIGZpbGUgRk5BTUUgYXNzdW1pbmcgaXQgaXMgYSBQRU0gZW5jb2RlZCBwdWJsaWMga2V5IGZpbGUKKyAgIGFuZCByZXR1cm4gYW4gUy1leHByZXNzaW9uLiAgV2l0aCBTSE9XIHNldCwgdGhlIGtleSBwYXJhbWV0ZXJzIGFyZQorICAgcHJpbnRlZC4gICovCitzdGF0aWMgZ2NyeV9zZXhwX3QKK3JlYWRfcHVibGljX2tleV9maWxlIChjb25zdCBjaGFyICpmbmFtZSwgaW50IHNob3cpCit7CisgIGdjcnlfZXJyb3JfdCBlcnI7CisgIEZJTEUgKmZwOworICBjaGFyICpidWZmZXI7CisgIHNpemVfdCBidWZsZW47CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRlcjsKKyAgc2l6ZV90IGRlcmxlbjsKKyAgc3RydWN0IHRhZ19pbmZvIHRpOworICBnY3J5X21waV90IGtleXBhcm1zWzJdOworICBpbnQgbl9rZXlwYXJtcyA9IDI7CisgIGludCBpZHg7CisgIGdjcnlfc2V4cF90IHNfa2V5OworCisgIGZwID0gZm9wZW4gKGZuYW1lLCBiaW5hcnlfaW5wdXQ/InJiIjoiciIpOworICBpZiAoIWZwKQorICAgIGRpZSAoImNhbid0IG9wZW4gYCVzJzogJXNcbiIsIGZuYW1lLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgYnVmZmVyID0gcmVhZF9maWxlIChmcCwgMCwgJmJ1Zmxlbik7CisgIGlmICghYnVmZmVyKQorICAgIGRpZSAoImVycm9yIHJlYWRpbmcgYCVzJ1xuIiwgZm5hbWUpOworICBmY2xvc2UgKGZwKTsKKworICBidWZsZW4gPSBiYXNlNjRfZGVjb2RlIChidWZmZXIsIGJ1Zmxlbik7CisgIAorICAvKiBQYXJzZSB0aGUgQVNOLjEgc3RydWN0dXJlLiAgKi8KKyAgZGVyID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIqKWJ1ZmZlcjsKKyAgZGVybGVuID0gYnVmbGVuOworICBpZiAoIHBhcnNlX3RhZyAoJmRlciwgJmRlcmxlbiwgJnRpKQorICAgICAgIHx8IHRpLnRhZyAhPSBUQUdfU0VRVUVOQ0UgfHwgdGkuY2xhc3MgfHwgIXRpLmNvbnMgfHwgdGkubmRlZikKKyAgICBnb3RvIGJhZF9hc24xOworICBpZiAoIHBhcnNlX3RhZyAoJmRlciwgJmRlcmxlbiwgJnRpKQorICAgICAgIHx8IHRpLnRhZyAhPSBUQUdfU0VRVUVOQ0UgfHwgdGkuY2xhc3MgfHwgIXRpLmNvbnMgfHwgdGkubmRlZikKKyAgICBnb3RvIGJhZF9hc24xOworICAvKiBXZSBza2lwIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUga2V5IHBhcmFtZXRlcnMgYW5kIGFzc3VtZSBpdCBpcyBSU0EuICAqLworICBkZXIgKz0gdGkubGVuZ3RoOyBkZXJsZW4gLT0gdGkubGVuZ3RoOworICAKKyAgaWYgKCBwYXJzZV90YWcgKCZkZXIsICZkZXJsZW4sICZ0aSkKKyAgICAgICB8fCB0aS50YWcgIT0gVEFHX0JJVF9TVFJJTkcgfHwgdGkuY2xhc3MgfHwgdGkuY29ucyB8fCB0aS5uZGVmKQorICAgIGdvdG8gYmFkX2FzbjE7CisgIGlmICh0aS5sZW5ndGggPCAxIHx8ICpkZXIpCisgICAgZ290byBiYWRfYXNuMTsgIC8qIFRoZSBudW1iZXIgb2YgdW51c2VkIGJpdHMgbmVlZHMgdG8gYmUgMC4gKi8KKyAgZGVyICs9IDE7IGRlcmxlbiAtPSAxOworCisgIC8qIFBhcnNlIHRoZSBCSVQgc3RyaW5nLiAgKi8KKyAgaWYgKCBwYXJzZV90YWcgKCZkZXIsICZkZXJsZW4sICZ0aSkKKyAgICAgICB8fCB0aS50YWcgIT0gVEFHX1NFUVVFTkNFIHx8IHRpLmNsYXNzIHx8ICF0aS5jb25zIHx8IHRpLm5kZWYpCisgICAgZ290byBiYWRfYXNuMTsKKworICBmb3IgKGlkeD0wOyBpZHggPCBuX2tleXBhcm1zOyBpZHgrKykKKyAgICB7CisgICAgICBpZiAoIHBhcnNlX3RhZyAoJmRlciwgJmRlcmxlbiwgJnRpKQorICAgICAgICAgICB8fCB0aS50YWcgIT0gVEFHX0lOVEVHRVIgfHwgdGkuY2xhc3MgfHwgdGkuY29ucyB8fCB0aS5uZGVmKQorICAgICAgICBnb3RvIGJhZF9hc24xOworICAgICAgaWYgKHNob3cpCisgICAgICAgIHsKKyAgICAgICAgICBjaGFyIHByZWZpeFsyXTsKKworICAgICAgICAgIHByZWZpeFswXSA9IGlkeCA8IDI/ICJuZSJbaWR4XSA6ICc/JzsKKyAgICAgICAgICBwcmVmaXhbMV0gPSAwOworICAgICAgICAgIHNob3doZXggKHByZWZpeCwgZGVyLCB0aS5sZW5ndGgpOworICAgICAgICB9CisgICAgICBlcnIgPSBnY3J5X21waV9zY2FuIChrZXlwYXJtcytpZHgsIEdDUllNUElfRk1UX1VTRywgZGVyLCB0aS5sZW5ndGgsTlVMTCk7CisgICAgICBpZiAoZXJyKQorICAgICAgICBkaWUgKCJlcnJvciBzY2FubmluZyBSU0EgcGFyYW1ldGVyICVkOiAlc1xuIiwgaWR4LCBncGdfc3RyZXJyb3IgKGVycikpOworICAgICAgZGVyICs9IHRpLmxlbmd0aDsgZGVybGVuIC09IHRpLmxlbmd0aDsKKyAgICB9CisgIGlmIChpZHggIT0gbl9rZXlwYXJtcykKKyAgICBkaWUgKCJub3QgZW5vdWdoIFJTQSBrZXkgcGFyYW1ldGVyc1xuIik7CisKKyAgZ2NyeV9mcmVlIChidWZmZXIpOworCisgIC8qIEJ1aWxkIHRoZSBTLWV4cHJlc3Npb24uICAqLworICBlcnIgPSBnY3J5X3NleHBfYnVpbGQgKCZzX2tleSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiKHB1YmxpYy1rZXkocnNhKG4lbSkoZSVtKSkpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBrZXlwYXJtc1swXSwga2V5cGFybXNbMV0gKTsKKyAgaWYgKGVycikKKyAgICBkaWUgKCJlcnJvciBidWlsZGluZyBTLWV4cHJlc3Npb246ICVzXG4iLCBncGdfc3RyZXJyb3IgKGVycikpOworICAKKyAgZm9yIChpZHg9MDsgaWR4IDwgbl9rZXlwYXJtczsgaWR4KyspCisgICAgZ2NyeV9tcGlfcmVsZWFzZSAoa2V5cGFybXNbaWR4XSk7CisgIAorICByZXR1cm4gc19rZXk7CisgIAorIGJhZF9hc24xOgorICBkaWUgKCJpbnZhbGlkIEFTTi4xIHN0cnVjdHVyZSBpbiBgJXMnXG4iLCBmbmFtZSk7CisgIHJldHVybiBOVUxMOyAvKk5PVFJFQUNIRUQqLworfQorCisKKworLyogUmVhZCB0aGUgZmlsZSBGTkFNRSBhc3N1bWluZyBpdCBpcyBhIGJpbmFyeSBzaWduYXR1cmUgcmVzdWx0IGFuZAorICAgcmV0dXJuIGFuIGFuIFMtZXhwcmVzc2lvbiBzdWl0YWJsZSBmb3IgZ2NyeV9wa192ZXJpZnkuICAqLworc3RhdGljIGdjcnlfc2V4cF90CityZWFkX3NpZ19maWxlIChjb25zdCBjaGFyICpmbmFtZSkKK3sKKyAgZ2NyeV9lcnJvcl90IGVycjsKKyAgRklMRSAqZnA7CisgIGNoYXIgKmJ1ZmZlcjsKKyAgc2l6ZV90IGJ1ZmxlbjsKKyAgZ2NyeV9tcGlfdCB0bXBtcGk7CisgIGdjcnlfc2V4cF90IHNfc2lnOworCisgIGZwID0gZm9wZW4gKGZuYW1lLCAicmIiKTsKKyAgaWYgKCFmcCkKKyAgICBkaWUgKCJjYW4ndCBvcGVuIGAlcyc6ICVzXG4iLCBmbmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7CisgIGJ1ZmZlciA9IHJlYWRfZmlsZSAoZnAsIDAsICZidWZsZW4pOworICBpZiAoIWJ1ZmZlcikKKyAgICBkaWUgKCJlcnJvciByZWFkaW5nIGAlcydcbiIsIGZuYW1lKTsKKyAgZmNsb3NlIChmcCk7CisKKyAgZXJyID0gZ2NyeV9tcGlfc2NhbiAoJnRtcG1waSwgR0NSWU1QSV9GTVRfVVNHLCBidWZmZXIsIGJ1ZmxlbiwgTlVMTCk7CisgIGlmICghZXJyKQorICAgIGVyciA9IGdjcnlfc2V4cF9idWlsZCAoJnNfc2lnLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIihzaWctdmFsKHJzYShzICVtKSkpIiwgdG1wbXBpKTsKKyAgaWYgKGVycikKKyAgICBkaWUgKCJlcnJvciBidWlsZGluZyBTLWV4cHJlc3Npb246ICVzXG4iLCBncGdfc3RyZXJyb3IgKGVycikpOworICBnY3J5X21waV9yZWxlYXNlICh0bXBtcGkpOworICBnY3J5X2ZyZWUgKGJ1ZmZlcik7CisKKyAgcmV0dXJuIHNfc2lnOworfQorCisKKy8qIFJlYWQgYW4gUy1leHByZXNzaW9uIGZyb20gRk5BTUUuICAqLworc3RhdGljIGdjcnlfc2V4cF90CityZWFkX3NleHBfZnJvbV9maWxlIChjb25zdCBjaGFyICpmbmFtZSkKK3sKKyAgZ2NyeV9lcnJvcl90IGVycjsKKyAgRklMRSAqZnA7CisgIGNoYXIgKmJ1ZmZlcjsKKyAgc2l6ZV90IGJ1ZmxlbjsKKyAgZ2NyeV9zZXhwX3Qgc2V4cDsKKworICBmcCA9IGZvcGVuIChmbmFtZSwgInJiIik7CisgIGlmICghZnApCisgICAgZGllICgiY2FuJ3Qgb3BlbiBgJXMnOiAlc1xuIiwgZm5hbWUsIHN0cmVycm9yIChlcnJubykpOworICBidWZmZXIgPSByZWFkX2ZpbGUgKGZwLCAwLCAmYnVmbGVuKTsKKyAgaWYgKCFidWZmZXIpCisgICAgZGllICgiZXJyb3IgcmVhZGluZyBgJXMnXG4iLCBmbmFtZSk7CisgIGZjbG9zZSAoZnApOworICBpZiAoIWJ1ZmxlbikKKyAgICBkaWUgKCJlcnJvcjogZmlsZSBgJXMnIGlzIGVtcHR5XG4iLCBmbmFtZSk7CisKKyAgZXJyID0gZ2NyeV9zZXhwX2NyZWF0ZSAoJnNleHAsIGJ1ZmZlciwgYnVmbGVuLCAxLCBnY3J5X2ZyZWUpOworICBpZiAoZXJyKQorICAgIGRpZSAoImVycm9yIHBhcnNpbmcgYCVzJzogJXNcbiIsIGZuYW1lLCBncGdfc3RyZXJyb3IgKGVycikpOworCisgIHJldHVybiBzZXhwOworfQorCisKK3N0YXRpYyB2b2lkCitwcmludF9idWZmZXIgKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkKK3sKKyAgaW50IHdyaXRlcnIgPSAwOworCisgIGlmIChiYXNlNjRfb3V0cHV0KQorICAgIHsKKyAgICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGJpbnRvYXNjWzY0KzFdID0gCisgICAgICAgICgiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiIAorICAgICAgICAgImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IiAKKyAgICAgICAgICIwMTIzNDU2Nzg5Ky8iKTsgCisgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpwOworICAgICAgdW5zaWduZWQgY2hhciBpbmJ1Zls0XTsKKyAgICAgIGNoYXIgb3V0YnVmWzRdOworICAgICAgaW50IGlkeCwgcXVhZHM7CisKKyAgICAgIGlkeCA9IHF1YWRzID0gMDsKKyAgICAgIGZvciAocCA9IGJ1ZmZlcjsgbGVuZ3RoOyBwKyssIGxlbmd0aC0tKQorICAgICAgICB7CisgICAgICAgICAgaW5idWZbaWR4KytdID0gKnA7CisgICAgICAgICAgaWYgKGlkeCA+IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIG91dGJ1ZlswXSA9IGJpbnRvYXNjWygqaW5idWY+PjIpJjA3N107CisgICAgICAgICAgICAgIG91dGJ1ZlsxXSA9IGJpbnRvYXNjWygoKCppbmJ1Zjw8NCkmMDYwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCgoaW5idWZbMV0gPj4gNCkmMDE3KSkmMDc3XTsKKyAgICAgICAgICAgICAgb3V0YnVmWzJdID0gYmludG9hc2NbKCgoaW5idWZbMV08PDIpJjA3NCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwoKGluYnVmWzJdPj42KSYwMykpJjA3N107CisgICAgICAgICAgICAgIG91dGJ1ZlszXSA9IGJpbnRvYXNjW2luYnVmWzJdJjA3N107CisgICAgICAgICAgICAgIGlmIChmd3JpdGUgKG91dGJ1ZiwgNCwgMSwgc3Rkb3V0KSAhPSAxKQorICAgICAgICAgICAgICAgIHdyaXRlcnIgPSAxOworICAgICAgICAgICAgICBpZHggPSAwOworICAgICAgICAgICAgICBpZiAoKytxdWFkcyA+PSAoNjQvNCkpIAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmIChmd3JpdGUgKCJcbiIsIDEsIDEsIHN0ZG91dCkgIT0gMSkKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyciA9IDE7CisgICAgICAgICAgICAgICAgICBxdWFkcyA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBpZiAoaWR4KQorICAgICAgICB7CisgICAgICAgICAgb3V0YnVmWzBdID0gYmludG9hc2NbKCppbmJ1Zj4+MikmMDc3XTsKKyAgICAgICAgICBpZiAoaWR4ID09IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIG91dGJ1ZlsxXSA9IGJpbnRvYXNjWygoKmluYnVmPDw0KSYwNjApJjA3N107CisgICAgICAgICAgICAgIG91dGJ1ZlsyXSA9IG91dGJ1ZlszXSA9ICc9JzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgeyAKKyAgICAgICAgICAgICAgb3V0YnVmWzFdID0gYmludG9hc2NbKCgoKmluYnVmPDw0KSYwNjApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8KChpbmJ1ZlsxXT4+NCkmMDE3KSkmMDc3XTsKKyAgICAgICAgICAgICAgb3V0YnVmWzJdID0gYmludG9hc2NbKChpbmJ1ZlsxXTw8MikmMDc0KSYwNzddOworICAgICAgICAgICAgICBvdXRidWZbM10gPSAnPSc7CisgICAgICAgICAgICB9CisgICAgICAgICAgaWYgKGZ3cml0ZSAob3V0YnVmLCA0LCAxLCBzdGRvdXQpICE9IDEpCisgICAgICAgICAgICB3cml0ZXJyID0gMTsKKyAgICAgICAgICBxdWFkcysrOworICAgICAgICB9CisgICAgICBpZiAocXVhZHMgJiYgZndyaXRlICgiXG4iLCAxLCAxLCBzdGRvdXQpICE9IDEpCisgICAgICAgIHdyaXRlcnIgPSAxOworICAgIH0KKyAgZWxzZSBpZiAoYmluYXJ5X291dHB1dCkKKyAgICB7CisgICAgICBpZiAoZndyaXRlIChidWZmZXIsIGxlbmd0aCwgMSwgc3Rkb3V0KSAhPSAxKQorICAgICAgICB3cml0ZXJyKys7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcCA9IGJ1ZmZlcjsKKyAgICAgIAorICAgICAgaWYgKHZlcmJvc2UgPiAxKQorICAgICAgICBzaG93aGV4ICgic2VudCBsaW5lIiwgYnVmZmVyLCBsZW5ndGgpOworICAgICAgd2hpbGUgKGxlbmd0aC0tICYmICFmZXJyb3IgKHN0ZG91dCkgKQorICAgICAgICBwcmludGYgKCIlMDJYIiwgKnArKyk7CisgICAgICBpZiAoZmVycm9yIChzdGRvdXQpKQorICAgICAgICB3cml0ZXJyKys7CisgICAgfQorICBpZiAoIXdyaXRlcnIgJiYgZmZsdXNoIChzdGRvdXQpID09IEVPRikKKyAgICB3cml0ZXJyKys7CisgIGlmICh3cml0ZXJyKQorICAgIHsKKyNpZm5kZWYgSEFWRV9XMzJfU1lTVEVNCisgICAgICBpZiAobG9vcF9tb2RlICYmIGVycm5vID09IEVQSVBFKQorICAgICAgICBsb29wX21vZGUgPSAwOworICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgIGRpZSAoIndyaXRpbmcgb3V0cHV0IGZhaWxlZDogJXNcbiIsIHN0cmVycm9yIChlcnJubykpOworICAgIH0KK30KKworCisvKiBQcmludCBhbiBNUEkgb24gYSBsaW5lLiAgKi8KK3N0YXRpYyB2b2lkCitwcmludF9tcGlfbGluZSAoZ2NyeV9tcGlfdCBhLCBpbnQgbm9fbHopCit7CisgIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgKnA7CisgIGdjcnlfZXJyb3JfdCBlcnI7CisgIGludCB3cml0ZXJyID0gMDsKKworICBlcnIgPSBnY3J5X21waV9hcHJpbnQgKEdDUllNUElfRk1UX0hFWCwgJmJ1ZiwgTlVMTCwgYSk7CisgIGlmIChlcnIpCisgICAgZGllICgiZ2NyeV9tcGlfYXByaW50IGZhaWxlZDogJXNcbiIsIGdwZ19zdHJlcnJvciAoZXJyKSk7CisKKyAgcCA9IGJ1ZjsKKyAgaWYgKG5vX2x6ICYmIHBbMF0gPT0gJzAnICYmIHBbMV0gPT0gJzAnICYmIHBbMl0pCisgICAgcCArPSAyOworICAgIAorICBwcmludGYgKCIlc1xuIiwgcCk7CisgIGlmIChmZXJyb3IgKHN0ZG91dCkpCisgICAgd3JpdGVycisrOworICBpZiAoIXdyaXRlcnIgJiYgZmZsdXNoIChzdGRvdXQpID09IEVPRikKKyAgICB3cml0ZXJyKys7CisgIGlmICh3cml0ZXJyKQorICAgIGRpZSAoIndyaXRpbmcgb3V0cHV0IGZhaWxlZDogJXNcbiIsIHN0cmVycm9yIChlcnJubykpOworICBnY3J5X2ZyZWUgKGJ1Zik7Cit9CisKKworLyogUHJpbnQgc29tZSBkYXRhIG9uIGhleCBmb3JtYXQgb24gYSBsaW5lLiAgKi8KK3N0YXRpYyB2b2lkCitwcmludF9kYXRhX2xpbmUgKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBkYXRhbGVuKQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICpwID0gZGF0YTsKKyAgaW50IHdyaXRlcnIgPSAwOworICAgICAgCisgIHdoaWxlIChkYXRhICYmIGRhdGFsZW4tLSAmJiAhZmVycm9yIChzdGRvdXQpICkKKyAgICBwcmludGYgKCIlMDJYIiwgKnArKyk7CisgIHB1dGNoYXIgKCdcbicpOworICBpZiAoZmVycm9yIChzdGRvdXQpKQorICAgIHdyaXRlcnIrKzsKKyAgaWYgKCF3cml0ZXJyICYmIGZmbHVzaCAoc3Rkb3V0KSA9PSBFT0YpCisgICAgd3JpdGVycisrOworICBpZiAod3JpdGVycikKKyAgICBkaWUgKCJ3cml0aW5nIG91dHB1dCBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvciAoZXJybm8pKTsKK30KKworLyogUHJpbnQgdGhlIFMtZXhwcmVzc2lvbiBBIHRvIHRoZSBzdHJlYW0gRlAuICAqLworc3RhdGljIHZvaWQKK3ByaW50X3NleHAgKGdjcnlfc2V4cF90IGEsIEZJTEUgKmZwKQoreworICBjaGFyICpidWY7CisgIHNpemVfdCBzaXplOworCisgIHNpemUgPSBnY3J5X3NleHBfc3ByaW50IChhLCBHQ1JZU0VYUF9GTVRfQURWQU5DRUQsIE5VTEwsIDApOworICBidWYgPSBnY3J5X3htYWxsb2MgKHNpemUpOworICBnY3J5X3NleHBfc3ByaW50IChhLCBHQ1JZU0VYUF9GTVRfQURWQU5DRUQsIGJ1Ziwgc2l6ZSk7CisgIGlmIChmd3JpdGUgKGJ1Ziwgc2l6ZSwgMSwgZnApICE9IDEpCisgICAgZGllICgiZXJyb3Igd3JpdGluZyB0byBzdHJlYW06ICVzXG4iLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgZ2NyeV9mcmVlIChidWYpOworfQorCisKKworCitzdGF0aWMgZ2NyeV9lcnJvcl90Citpbml0X2V4dGVybmFsX3JuZ190ZXN0ICh2b2lkICoqcl9jb250ZXh0LCAKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICprZXksIHNpemVfdCBrZXlsZW4sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnNlZWQsIHNpemVfdCBzZWVkbGVuLAorICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpkdCwgc2l6ZV90IGR0bGVuKQoreworICByZXR1cm4gZ2NyeV9jb250cm9sIChQUklWX0NUTF9JTklUX0VYVFJOR19URVNULCAKKyAgICAgICAgICAgICAgICAgICAgICAgcl9jb250ZXh0LCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAga2V5LCBrZXlsZW4sCisgICAgICAgICAgICAgICAgICAgICAgIHNlZWQsIHNlZWRsZW4sCisgICAgICAgICAgICAgICAgICAgICAgIGR0LCBkdGxlbik7Cit9CisKK3N0YXRpYyBnY3J5X2Vycm9yX3QKK3J1bl9leHRlcm5hbF9ybmdfdGVzdCAodm9pZCAqY29udGV4dCwgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnVmbGVuKQoreworICByZXR1cm4gZ2NyeV9jb250cm9sIChQUklWX0NUTF9SVU5fRVhUUk5HX1RFU1QsIGNvbnRleHQsIGJ1ZmZlciwgYnVmbGVuKTsKK30KKworc3RhdGljIHZvaWQKK2RlaW5pdF9leHRlcm5hbF9ybmdfdGVzdCAodm9pZCAqY29udGV4dCkKK3sKKyAgZ2NyeV9jb250cm9sIChQUklWX0NUTF9ERUlOSVRfRVhUUk5HX1RFU1QsIGNvbnRleHQpOworfQorCisKKy8qIEdpdmVuIGFuIE9wZW5TU0wgY2lwaGVyIG5hbWUgTkFNRSwgcmV0dXJuIHRoZSBMaWJnY3J5cHQgYWxnaXJpdGhtCisgICBpZGVudGlmaWVkIGFuZCBzdG9yZSB0aGUgbGliZ2NyeXB0IG1vZGUgYXQgUl9NT0RFLiAgUmV0dXJucyAwIG9uCisgICBlcnJvci4gICovCitzdGF0aWMgaW50IAorbWFwX29wZW5zc2xfY2lwaGVyX25hbWUgKGNvbnN0IGNoYXIgKm5hbWUsIGludCAqcl9tb2RlKQoreworICBzdGF0aWMgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIGludCBhbGdvOworICAgIGludCBtb2RlOworICB9IHRhYmxlW10gPSAKKyAgICB7CisgICAgICB7ICJiZi1jYmMiLCAgICAgICBHQ1JZX0NJUEhFUl9CTE9XRklTSCwgR0NSWV9DSVBIRVJfTU9ERV9DQkMgfSwKKyAgICAgIHsgImJmIiwgICAgICAgICAgIEdDUllfQ0lQSEVSX0JMT1dGSVNILCBHQ1JZX0NJUEhFUl9NT0RFX0NCQyB9LAorICAgICAgeyAiYmYtY2ZiIiwgICAgICAgR0NSWV9DSVBIRVJfQkxPV0ZJU0gsIEdDUllfQ0lQSEVSX01PREVfQ0ZCIH0sCisgICAgICB7ICJiZi1lY2IiLCAgICAgICBHQ1JZX0NJUEhFUl9CTE9XRklTSCwgR0NSWV9DSVBIRVJfTU9ERV9FQ0IgfSwKKyAgICAgIHsgImJmLW9mYiIsICAgICAgIEdDUllfQ0lQSEVSX0JMT1dGSVNILCBHQ1JZX0NJUEhFUl9NT0RFX09GQiB9LAorCisgICAgICB7ICJjYXN0LWNiYyIsICAgICBHQ1JZX0NJUEhFUl9DQVNUNSwgR0NSWV9DSVBIRVJfTU9ERV9DQkMgfSwKKyAgICAgIHsgImNhc3QiLCAgICAgICAgIEdDUllfQ0lQSEVSX0NBU1Q1LCBHQ1JZX0NJUEhFUl9NT0RFX0NCQyB9LAorICAgICAgeyAiY2FzdDUtY2JjIiwgICAgR0NSWV9DSVBIRVJfQ0FTVDUsIEdDUllfQ0lQSEVSX01PREVfQ0JDIH0sCisgICAgICB7ICJjYXN0NS1jZmIiLCAgICBHQ1JZX0NJUEhFUl9DQVNUNSwgR0NSWV9DSVBIRVJfTU9ERV9DRkIgfSwKKyAgICAgIHsgImNhc3Q1LWVjYiIsICAgIEdDUllfQ0lQSEVSX0NBU1Q1LCBHQ1JZX0NJUEhFUl9NT0RFX0VDQiB9LAorICAgICAgeyAiY2FzdDUtb2ZiIiwgICAgR0NSWV9DSVBIRVJfQ0FTVDUsIEdDUllfQ0lQSEVSX01PREVfT0ZCIH0sCisKKyAgICAgIHsgImRlcy1jYmMiLCAgICAgIEdDUllfQ0lQSEVSX0RFUywgR0NSWV9DSVBIRVJfTU9ERV9DQkMgfSwKKyAgICAgIHsgImRlcyIsICAgICAgICAgIEdDUllfQ0lQSEVSX0RFUywgR0NSWV9DSVBIRVJfTU9ERV9DQkMgfSwKKyAgICAgIHsgImRlcy1jZmIiLCAgICAgIEdDUllfQ0lQSEVSX0RFUywgR0NSWV9DSVBIRVJfTU9ERV9DRkIgfSwKKyAgICAgIHsgImRlcy1vZmIiLCAgICAgIEdDUllfQ0lQSEVSX0RFUywgR0NSWV9DSVBIRVJfTU9ERV9PRkIgfSwKKyAgICAgIHsgImRlcy1lY2IiLCAgICAgIEdDUllfQ0lQSEVSX0RFUywgR0NSWV9DSVBIRVJfTU9ERV9FQ0IgfSwKKworICAgICAgeyAiZGVzLWVkZTMtY2JjIiwgR0NSWV9DSVBIRVJfM0RFUywgR0NSWV9DSVBIRVJfTU9ERV9DQkMgfSwKKyAgICAgIHsgImRlcy1lZGUzIiwgICAgIEdDUllfQ0lQSEVSXzNERVMsIEdDUllfQ0lQSEVSX01PREVfRUNCIH0sCisgICAgICB7ICJkZXMzIiwgICAgICAgICBHQ1JZX0NJUEhFUl8zREVTLCBHQ1JZX0NJUEhFUl9NT0RFX0NCQyB9LAorICAgICAgeyAiZGVzLWVkZTMtY2ZiIiwgR0NSWV9DSVBIRVJfM0RFUywgR0NSWV9DSVBIRVJfTU9ERV9DRkIgfSwKKyAgICAgIHsgImRlcy1lZGUzLW9mYiIsIEdDUllfQ0lQSEVSXzNERVMsIEdDUllfQ0lQSEVSX01PREVfT0ZCIH0sCisKKyAgICAgIHsgInJjNCIsICAgICAgICAgIEdDUllfQ0lQSEVSX0FSQ0ZPVVIsIEdDUllfQ0lQSEVSX01PREVfU1RSRUFNIH0sCisKKyAgICAgIHsgImFlcy0xMjgtY2JjIiwgIEdDUllfQ0lQSEVSX0FFUzEyOCwgR0NSWV9DSVBIRVJfTU9ERV9DQkMgfSwKKyAgICAgIHsgImFlcy0xMjgiLCAgICAgIEdDUllfQ0lQSEVSX0FFUzEyOCwgR0NSWV9DSVBIRVJfTU9ERV9DQkMgfSwKKyAgICAgIHsgImFlcy0xMjgtY2ZiIiwgIEdDUllfQ0lQSEVSX0FFUzEyOCwgR0NSWV9DSVBIRVJfTU9ERV9DRkIgfSwKKyAgICAgIHsgImFlcy0xMjgtZWNiIiwgIEdDUllfQ0lQSEVSX0FFUzEyOCwgR0NSWV9DSVBIRVJfTU9ERV9FQ0IgfSwKKyAgICAgIHsgImFlcy0xMjgtb2ZiIiwgIEdDUllfQ0lQSEVSX0FFUzEyOCwgR0NSWV9DSVBIRVJfTU9ERV9PRkIgfSwKKworICAgICAgeyAiYWVzLTE5Mi1jYmMiLCAgR0NSWV9DSVBIRVJfQUVTMTkyLCBHQ1JZX0NJUEhFUl9NT0RFX0NCQyB9LAorICAgICAgeyAiYWVzLTE5MiIsICAgICAgR0NSWV9DSVBIRVJfQUVTMTkyLCBHQ1JZX0NJUEhFUl9NT0RFX0NCQyB9LAorICAgICAgeyAiYWVzLTE5Mi1jZmIiLCAgR0NSWV9DSVBIRVJfQUVTMTkyLCBHQ1JZX0NJUEhFUl9NT0RFX0NGQiB9LAorICAgICAgeyAiYWVzLTE5Mi1lY2IiLCAgR0NSWV9DSVBIRVJfQUVTMTkyLCBHQ1JZX0NJUEhFUl9NT0RFX0VDQiB9LAorICAgICAgeyAiYWVzLTE5Mi1vZmIiLCAgR0NSWV9DSVBIRVJfQUVTMTkyLCBHQ1JZX0NJUEhFUl9NT0RFX09GQiB9LAorICAgICAgCisgICAgICB7ICJhZXMtMjU2LWNiYyIsICBHQ1JZX0NJUEhFUl9BRVMyNTYsIEdDUllfQ0lQSEVSX01PREVfQ0JDIH0sCisgICAgICB7ICJhZXMtMjU2IiwgICAgICBHQ1JZX0NJUEhFUl9BRVMyNTYsIEdDUllfQ0lQSEVSX01PREVfQ0JDIH0sCisgICAgICB7ICJhZXMtMjU2LWNmYiIsICBHQ1JZX0NJUEhFUl9BRVMyNTYsIEdDUllfQ0lQSEVSX01PREVfQ0ZCIH0sCisgICAgICB7ICJhZXMtMjU2LWVjYiIsICBHQ1JZX0NJUEhFUl9BRVMyNTYsIEdDUllfQ0lQSEVSX01PREVfRUNCIH0sCisgICAgICB7ICJhZXMtMjU2LW9mYiIsICBHQ1JZX0NJUEhFUl9BRVMyNTYsIEdDUllfQ0lQSEVSX01PREVfT0ZCIH0sCisKKyAgICAgIHsgTlVMTCwgMCAsIDAgfQorICAgIH07CisgIGludCBpZHg7CisKKyAgZm9yIChpZHg9MDsgdGFibGVbaWR4XS5uYW1lOyBpZHgrKykKKyAgICBpZiAoIXN0cmNtcCAobmFtZSwgdGFibGVbaWR4XS5uYW1lKSkKKyAgICAgIHsKKyAgICAgICAgKnJfbW9kZSA9IHRhYmxlW2lkeF0ubW9kZTsKKyAgICAgICAgcmV0dXJuIHRhYmxlW2lkeF0uYWxnbzsKKyAgICAgIH0KKyAgKnJfbW9kZSA9IDA7CisgIHJldHVybiAwOworfQorCisKKwwKKy8qIFJ1biBhbiBlbmNyeXB0IG9yIGRlY3J5cHRpb24gb3BlcmF0aW9ucy4gIElmIERBVEEgaXMgTlVMTCB0aGUKKyAgIGZ1bmN0aW9uIHJlYWRzIGl0cyBpbnB1dCBpbiBjaHVua3Mgb2Ygc2l6ZSBEQVRBTEVOIGZyb20gZnAgYW5kCisgICBwcm9jZXNzZXMgaXQgYW5kIHdyaXRlcyBpdCBvdXQgdW50aWwgRU9GLiAgKi8KK3N0YXRpYyB2b2lkCitydW5fZW5jcnlwdF9kZWNyeXB0IChpbnQgZW5jcnlwdF9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgaW50IGNpcGhlcl9hbGdvLCBpbnQgY2lwaGVyX21vZGUsIAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqaXZfYnVmZmVyLCBzaXplX3QgaXZfYnVmbGVuLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqa2V5X2J1ZmZlciwgc2l6ZV90IGtleV9idWZsZW4sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgZGF0YWxlbiwgRklMRSAqZnApCit7CisgIGdwZ19lcnJvcl90IGVycjsKKyAgZ2NyeV9jaXBoZXJfaGRfdCBoZDsKKyAgdm9pZCAqb3V0YnVmOworICBzaXplX3Qgb3V0YnVmbGVuOworICB2b2lkICppbmJ1ZjsKKyAgc2l6ZV90IGluYnVmbGVuOworICBzaXplX3QgYmxvY2tsZW47CisKKyAgZXJyID0gZ2NyeV9jaXBoZXJfb3BlbiAoJmhkLCBjaXBoZXJfYWxnbywgY2lwaGVyX21vZGUsIDApOworICBpZiAoZXJyKQorICAgIGRpZSAoImdjcnlfY2lwaGVyX29wZW4gZmFpbGVkIGZvciBhbGdvICVkLCBtb2RlICVkOiAlc1xuIiwgCisgICAgICAgICBjaXBoZXJfYWxnbywgY2lwaGVyX21vZGUsIGdwZ19zdHJlcnJvciAoZXJyKSk7CisKKyAgYmxvY2tsZW4gPSBnY3J5X2NpcGhlcl9nZXRfYWxnb19ibGtsZW4gKGNpcGhlcl9hbGdvKTsKKyAgYXNzZXJ0IChibG9ja2xlbik7CisKKyAgZ2NyeV9jaXBoZXJfY3RsIChoZCwgUFJJVl9DVExfRElTQUJMRV9XRUFLX0tFWSwgTlVMTCwgMCk7CisKKyAgZXJyID0gZ2NyeV9jaXBoZXJfc2V0a2V5IChoZCwga2V5X2J1ZmZlciwga2V5X2J1Zmxlbik7CisgIGlmIChlcnIpCisgICAgZGllICgiZ2NyeV9jaXBoZXJfc2V0a2V5IGZhaWxlZCB3aXRoIGtleWxlbiAldTogJXNcbiIsCisgICAgICAgICAodW5zaWduZWQgaW50KWtleV9idWZsZW4sIGdwZ19zdHJlcnJvciAoZXJyKSk7CisKKyAgaWYgKGl2X2J1ZmZlcikKKyAgICB7CisgICAgICBlcnIgPSBnY3J5X2NpcGhlcl9zZXRpdiAoaGQsIGl2X2J1ZmZlciwgaXZfYnVmbGVuKTsKKyAgICAgIGlmIChlcnIpCisgICAgICAgIGRpZSAoImdjcnlfY2lwaGVyX3NldGl2IGZhaWxlZCB3aXRoIGl2bGVuICV1OiAlc1xuIiwKKyAgICAgICAgICAgICAodW5zaWduZWQgaW50KWl2X2J1ZmxlbiwgZ3BnX3N0cmVycm9yIChlcnIpKTsKKyAgICB9CisKKyAgaW5idWYgPSBkYXRhPyBOVUxMIDogZ2NyeV94bWFsbG9jIChkYXRhbGVuKTsKKyAgb3V0YnVmbGVuID0gZGF0YWxlbjsKKyAgb3V0YnVmID0gZ2NyeV94bWFsbG9jIChvdXRidWZsZW4gPCBibG9ja2xlbj8gYmxvY2tsZW46b3V0YnVmbGVuKTsKKworICBkbworICAgIHsKKyAgICAgIGlmIChpbmJ1ZikKKyAgICAgICAgeworICAgICAgICAgIGludCBucmVhZCA9IGZyZWFkIChpbmJ1ZiwgMSwgZGF0YWxlbiwgZnApOworICAgICAgICAgIGlmIChucmVhZCA8IChpbnQpZGF0YWxlbiAmJiBmZXJyb3IgKGZwKSkKKyAgICAgICAgICAgIGRpZSAoImVycm9yIHJlYWRpbmcgaW5wdXRcbiIpOworICAgICAgICAgIGRhdGEgPSBpbmJ1ZjsKKyAgICAgICAgICBpbmJ1ZmxlbiA9IG5yZWFkOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIGluYnVmbGVuID0gZGF0YWxlbjsKKworICAgICAgaWYgKGVuY3J5cHRfbW9kZSkKKyAgICAgICAgZXJyID0gZ2NyeV9jaXBoZXJfZW5jcnlwdCAoaGQsIG91dGJ1Ziwgb3V0YnVmbGVuLCBkYXRhLCBpbmJ1Zmxlbik7CisgICAgICBlbHNlCisgICAgICAgIGVyciA9IGdjcnlfY2lwaGVyX2RlY3J5cHQgKGhkLCBvdXRidWYsIG91dGJ1ZmxlbiwgZGF0YSwgaW5idWZsZW4pOworICAgICAgaWYgKGVycikKKyAgICAgICAgZGllICgiZ2NyeV9jaXBoZXJfJXNjcnlwdCBmYWlsZWQ6ICVzXG4iLAorICAgICAgICAgICAgIGVuY3J5cHRfbW9kZT8gImVuIjoiZGUiLCBncGdfc3RyZXJyb3IgKGVycikpOworICAgICAgCisgICAgICBwcmludF9idWZmZXIgKG91dGJ1Ziwgb3V0YnVmbGVuKTsKKyAgICB9CisgIHdoaWxlIChpbmJ1Zik7CisKKyAgZ2NyeV9jaXBoZXJfY2xvc2UgKGhkKTsKKyAgZ2NyeV9mcmVlIChvdXRidWYpOworICBnY3J5X2ZyZWUgKGluYnVmKTsKK30KKworCitzdGF0aWMgdm9pZAorZ2V0X2N1cnJlbnRfaXYgKGdjcnlfY2lwaGVyX2hkX3QgaGQsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ1ZmxlbikKK3sKKyAgdW5zaWduZWQgY2hhciB0bXBbMTddOworCisgIGlmIChnY3J5X2NpcGhlcl9jdGwgKGhkLCBQUklWX0NUTF9HRVRfSU5QVVRfVkVDVE9SLCB0bXAsIHNpemVvZiB0bXApKQorICAgIGRpZSAoImVycm9yIGdldHRpbmcgY3VycmVudCBpbnB1dCB2ZWN0b3JcbiIpOworICBpZiAoYnVmbGVuID4gKnRtcCkKKyAgICBkaWUgKCJidWZmZXIgdG9vIHNob3J0IHRvIHN0b3JlIHRoZSBjdXJyZW50IGlucHV0IHZlY3RvclxuIik7CisgIG1lbWNweSAoYnVmZmVyLCB0bXArMSwgKnRtcCk7Cit9CisKKy8qIFJ1biB0aGUgaW5uZXIgbG9vcCBvZiB0aGUgQ0FWUyBtb250ZSBjYXJsbyB0ZXN0LiAgKi8KK3N0YXRpYyB2b2lkCitydW5fY2lwaGVyX21jdF9sb29wIChpbnQgZW5jcnlwdF9tb2RlLCBpbnQgY2lwaGVyX2FsZ28sIGludCBjaXBoZXJfbW9kZSwgCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICppdl9idWZmZXIsIHNpemVfdCBpdl9idWZsZW4sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICprZXlfYnVmZmVyLCBzaXplX3Qga2V5X2J1ZmxlbiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBkYXRhbGVuLCBpbnQgaXRlcmF0aW9ucykKK3sKKyAgZ3BnX2Vycm9yX3QgZXJyOworICBnY3J5X2NpcGhlcl9oZF90IGhkOworICBzaXplX3QgYmxvY2tsZW47CisgIGludCBjb3VudDsKKyAgY2hhciBpbnB1dFsxNl07CisgIGNoYXIgb3V0cHV0WzE2XTsKKyAgY2hhciBsYXN0X291dHB1dFsxNl07CisgIGNoYXIgbGFzdF9sYXN0X291dHB1dFsxNl07CisgIGNoYXIgbGFzdF9pdlsxNl07IAorCisKKyAgZXJyID0gZ2NyeV9jaXBoZXJfb3BlbiAoJmhkLCBjaXBoZXJfYWxnbywgY2lwaGVyX21vZGUsIDApOworICBpZiAoZXJyKQorICAgIGRpZSAoImdjcnlfY2lwaGVyX29wZW4gZmFpbGVkIGZvciBhbGdvICVkLCBtb2RlICVkOiAlc1xuIiwgCisgICAgICAgICBjaXBoZXJfYWxnbywgY2lwaGVyX21vZGUsIGdwZ19zdHJlcnJvciAoZXJyKSk7CisKKyAgYmxvY2tsZW4gPSBnY3J5X2NpcGhlcl9nZXRfYWxnb19ibGtsZW4gKGNpcGhlcl9hbGdvKTsKKyAgaWYgKCFibG9ja2xlbiB8fCBibG9ja2xlbiA+IHNpemVvZiBvdXRwdXQpCisgICAgZGllICgiaW52YWxpZCBibG9jayBsZW5ndGggJWRcbiIsIGJsb2NrbGVuKTsKKworCisgIGdjcnlfY2lwaGVyX2N0bCAoaGQsIFBSSVZfQ1RMX0RJU0FCTEVfV0VBS19LRVksIE5VTEwsIDApOworCisgIGVyciA9IGdjcnlfY2lwaGVyX3NldGtleSAoaGQsIGtleV9idWZmZXIsIGtleV9idWZsZW4pOworICBpZiAoZXJyKQorICAgIGRpZSAoImdjcnlfY2lwaGVyX3NldGtleSBmYWlsZWQgd2l0aCBrZXlsZW4gJXU6ICVzXG4iLAorICAgICAgICAgKHVuc2lnbmVkIGludClrZXlfYnVmbGVuLCBncGdfc3RyZXJyb3IgKGVycikpOworCisgIGlmIChpdl9idWZmZXIpCisgICAgeworICAgICAgZXJyID0gZ2NyeV9jaXBoZXJfc2V0aXYgKGhkLCBpdl9idWZmZXIsIGl2X2J1Zmxlbik7CisgICAgICBpZiAoZXJyKQorICAgICAgICBkaWUgKCJnY3J5X2NpcGhlcl9zZXRpdiBmYWlsZWQgd2l0aCBpdmxlbiAldTogJXNcbiIsCisgICAgICAgICAgICAgKHVuc2lnbmVkIGludClpdl9idWZsZW4sIGdwZ19zdHJlcnJvciAoZXJyKSk7CisgICAgfQorCisgIGlmIChkYXRhbGVuICE9IGJsb2NrbGVuKQorICAgIGRpZSAoImxlbmd0aCBvZiBpbnB1dCAoJXUpIGRvZXMgbm90IG1hdGNoIGJsb2NrIGxlbmd0aCAoJXUpXG4iLCAKKyAgICAgICAgICh1bnNpZ25lZCBpbnQpZGF0YWxlbiwgKHVuc2lnbmVkIGludClibG9ja2xlbik7CisgIG1lbWNweSAoaW5wdXQsIGRhdGEsIGRhdGFsZW4pOworICBtZW1zZXQgKG91dHB1dCwgMCwgc2l6ZW9mIG91dHB1dCk7CisgIGZvciAoY291bnQ9MDsgY291bnQgPCBpdGVyYXRpb25zOyBjb3VudCsrKQorICAgIHsKKyAgICAgIG1lbWNweSAobGFzdF9sYXN0X291dHB1dCwgbGFzdF9vdXRwdXQsIHNpemVvZiBsYXN0X291dHB1dCk7CisgICAgICBtZW1jcHkgKGxhc3Rfb3V0cHV0LCBvdXRwdXQsIHNpemVvZiBvdXRwdXQpOworCisgICAgICBnZXRfY3VycmVudF9pdiAoaGQsIGxhc3RfaXYsIGJsb2NrbGVuKTsKKworICAgICAgaWYgKGVuY3J5cHRfbW9kZSkKKyAgICAgICAgZXJyID0gZ2NyeV9jaXBoZXJfZW5jcnlwdCAoaGQsIG91dHB1dCwgYmxvY2tsZW4sIGlucHV0LCBibG9ja2xlbik7CisgICAgICBlbHNlCisgICAgICAgIGVyciA9IGdjcnlfY2lwaGVyX2RlY3J5cHQgKGhkLCBvdXRwdXQsIGJsb2NrbGVuLCBpbnB1dCwgYmxvY2tsZW4pOworICAgICAgaWYgKGVycikKKyAgICAgICAgZGllICgiZ2NyeV9jaXBoZXJfJXNjcnlwdCBmYWlsZWQ6ICVzXG4iLAorICAgICAgICAgICAgIGVuY3J5cHRfbW9kZT8gImVuIjoiZGUiLCBncGdfc3RyZXJyb3IgKGVycikpOworCisgIAorICAgICAgaWYgKGVuY3J5cHRfbW9kZSAmJiAoY2lwaGVyX21vZGUgPT0gR0NSWV9DSVBIRVJfTU9ERV9DRkIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNpcGhlcl9tb2RlID09IEdDUllfQ0lQSEVSX01PREVfQ0JDKSkKKyAgICAgICAgbWVtY3B5IChpbnB1dCwgbGFzdF9pdiwgYmxvY2tsZW4pOworICAgICAgZWxzZSBpZiAoY2lwaGVyX21vZGUgPT0gR0NSWV9DSVBIRVJfTU9ERV9PRkIpCisgICAgICAgIG1lbWNweSAoaW5wdXQsIGxhc3RfaXYsIGJsb2NrbGVuKTsKKyAgICAgIGVsc2UgaWYgKCFlbmNyeXB0X21vZGUgJiYgY2lwaGVyX21vZGUgPT0gR0NSWV9DSVBIRVJfTU9ERV9DRkIpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBSZWNvbnN0cnVjdCB0aGUgb3V0cHV0IHZlY3Rvci4gICovCisgICAgICAgICAgaW50IGk7CisgICAgICAgICAgZm9yIChpPTA7IGkgPCBibG9ja2xlbjsgaSsrKQorICAgICAgICAgICAgaW5wdXRbaV0gXj0gb3V0cHV0W2ldOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIG1lbWNweSAoaW5wdXQsIG91dHB1dCwgYmxvY2tsZW4pOworICAgIH0KKworICBwcmludF9idWZmZXIgKG91dHB1dCwgYmxvY2tsZW4pOworICBwdXRjaGFyICgnXG4nKTsKKyAgcHJpbnRfYnVmZmVyIChsYXN0X291dHB1dCwgYmxvY2tsZW4pOworICBwdXRjaGFyICgnXG4nKTsKKyAgcHJpbnRfYnVmZmVyIChsYXN0X2xhc3Rfb3V0cHV0LCBibG9ja2xlbik7CisgIHB1dGNoYXIgKCdcbicpOworICBnZXRfY3VycmVudF9pdiAoaGQsIGxhc3RfaXYsIGJsb2NrbGVuKTsKKyAgcHJpbnRfYnVmZmVyIChsYXN0X2l2LCBibG9ja2xlbik7IC8qIExhc3Qgb3V0cHV0IHZlY3Rvci4gICovCisgIHB1dGNoYXIgKCdcbicpOworICBwcmludF9idWZmZXIgKGlucHV0LCBibG9ja2xlbik7ICAgLyogTmV4dCBpbnB1dCB0ZXh0LiAqLworICBwdXRjaGFyICgnXG4nKTsKKyAgaWYgKHZlcmJvc2UgPiAxKQorICAgIHNob3doZXggKCJzZW50IGxpbmUiLCAiIiwgMCk7CisgIHB1dGNoYXIgKCdcbicpOworICBmZmx1c2ggKHN0ZG91dCk7CisKKyAgZ2NyeV9jaXBoZXJfY2xvc2UgKGhkKTsKK30KKworCisMCisvKiBSdW4gYSBkaWdlc3Qgb3BlcmF0aW9uLiAgKi8KK3N0YXRpYyB2b2lkCitydW5fZGlnZXN0IChpbnQgZGlnZXN0X2FsZ28sICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgZGF0YWxlbikKK3sKKyAgZ3BnX2Vycm9yX3QgZXJyOworICBnY3J5X21kX2hkX3QgaGQ7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRpZ2VzdDsKKyAgdW5zaWduZWQgaW50IGRpZ2VzdGxlbjsKKworICBlcnIgPSBnY3J5X21kX29wZW4gKCZoZCwgZGlnZXN0X2FsZ28sIDApOworICBpZiAoZXJyKQorICAgIGRpZSAoImdjcnlfbWRfb3BlbiBmYWlsZWQgZm9yIGFsZ28gJWQ6ICVzXG4iLCAKKyAgICAgICAgIGRpZ2VzdF9hbGdvLCAgZ3BnX3N0cmVycm9yIChlcnIpKTsKKworICBnY3J5X21kX3dyaXRlIChoZCwgZGF0YSwgZGF0YWxlbik7CisgIGRpZ2VzdCA9IGdjcnlfbWRfcmVhZCAoaGQsIGRpZ2VzdF9hbGdvKTsKKyAgZGlnZXN0bGVuID0gZ2NyeV9tZF9nZXRfYWxnb19kbGVuIChkaWdlc3RfYWxnbyk7CisgIHByaW50X2J1ZmZlciAoZGlnZXN0LCBkaWdlc3RsZW4pOworICBnY3J5X21kX2Nsb3NlIChoZCk7Cit9CisKKwwKKy8qIFJ1biBhIEhNQUMgb3BlcmF0aW9uLiAgKi8KK3N0YXRpYyB2b2lkCitydW5faG1hYyAoaW50IGRpZ2VzdF9hbGdvLCBjb25zdCB2b2lkICprZXksIHNpemVfdCBrZXlsZW4sIAorICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBkYXRhbGVuKQoreworICBncGdfZXJyb3JfdCBlcnI7CisgIGdjcnlfbWRfaGRfdCBoZDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqZGlnZXN0OworICB1bnNpZ25lZCBpbnQgZGlnZXN0bGVuOworCisgIGVyciA9IGdjcnlfbWRfb3BlbiAoJmhkLCBkaWdlc3RfYWxnbywgR0NSWV9NRF9GTEFHX0hNQUMpOworICBpZiAoZXJyKQorICAgIGRpZSAoImdjcnlfbWRfb3BlbiBmYWlsZWQgZm9yIEhNQUMgYWxnbyAlZDogJXNcbiIsIAorICAgICAgICAgZGlnZXN0X2FsZ28sICBncGdfc3RyZXJyb3IgKGVycikpOworCisgIGdjcnlfbWRfc2V0a2V5IChoZCwga2V5LCBrZXlsZW4pOworICBpZiAoZXJyKQorICAgIGRpZSAoImdjcnlfbWRfc2V0a2V5IGZhaWxlZCBmb3IgSE1BQyBhbGdvICVkOiAlc1xuIiwgCisgICAgICAgICBkaWdlc3RfYWxnbywgIGdwZ19zdHJlcnJvciAoZXJyKSk7CisKKyAgZ2NyeV9tZF93cml0ZSAoaGQsIGRhdGEsIGRhdGFsZW4pOworICBkaWdlc3QgPSBnY3J5X21kX3JlYWQgKGhkLCBkaWdlc3RfYWxnbyk7CisgIGRpZ2VzdGxlbiA9IGdjcnlfbWRfZ2V0X2FsZ29fZGxlbiAoZGlnZXN0X2FsZ28pOworICBwcmludF9idWZmZXIgKGRpZ2VzdCwgZGlnZXN0bGVuKTsKKyAgZ2NyeV9tZF9jbG9zZSAoaGQpOworfQorCisKKwwKKy8qIERlcml2ZSBhbiBSU0Ega2V5IHVzaW5nIHRoZSBTLWV4cHJlc3Npb24gaW4gKERBVEEsREFUQUxFTikuICBUaGlzCisgICBTLWV4cHJlc3Npb24gaXMgdXNlZCBkaXJlY3RseSBhcyBpbnB1dCB0byBnY3J5X3BrX2dlbmtleS4gIFRoZQorICAgcmVzdWx0IGlzIHByaW50ZWQgdG8gc3Rkb3V0IHdpdGggb25lIHBhcmFtZXRlciBwZXIgbGluZSBpbiBoZXgKKyAgIGZvcm1hdCBhbmQgaW4gdGhpcyBvcmRlcjogcCwgcSwgbiwgZC4gICovCitzdGF0aWMgdm9pZAorcnVuX3JzYV9kZXJpdmUgKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBkYXRhbGVuKQoreworICBncGdfZXJyb3JfdCBlcnI7CisgIGdjcnlfc2V4cF90IHNfa2V5c3BlYywgc19rZXksIHNfdG9wLCBsMTsKKyAgZ2NyeV9tcGlfdCBtcGk7CisgIGNvbnN0IGNoYXIgKnBhcm1saXN0OworICBpbnQgaWR4OworCisgIGlmICghZGF0YWxlbikKKyAgICBlcnIgPSBncGdfZXJyb3IgKEdQR19FUlJfTk9fREFUQSk7CisgIGVsc2UKKyAgICBlcnIgPSBnY3J5X3NleHBfbmV3ICgmc19rZXlzcGVjLCBkYXRhLCBkYXRhbGVuLCAxKTsKKyAgaWYgKGVycikKKyAgICBkaWUgKCJnY3J5X3NleHBfbmV3IGZhaWxlZCBmb3IgUlNBIGtleSBkZXJpdmU6ICVzXG4iLAorICAgICAgICAgZ3BnX3N0cmVycm9yIChlcnIpKTsKKworICBlcnIgPSBnY3J5X3BrX2dlbmtleSAoJnNfa2V5LCBzX2tleXNwZWMpOworICBpZiAoZXJyKQorICAgIGRpZSAoImdjcnlfcGtfZ2Vua2V5IGZhaWxlZCBmb3IgUlNBOiAlc1xuIiwgZ3BnX3N0cmVycm9yIChlcnIpKTsKKworICBnY3J5X3NleHBfcmVsZWFzZSAoc19rZXlzcGVjKTsKKworICAvKiBQIGFuZCBRIG1pZ2h0IGhhdmUgYmVlbiBzd2FwcGVkIGJ1dCB3ZSBuZWVkIHRvIHRvIHJldHVybiB0aGVtIGluCisgICAgIHRoZSBwcm9wZXIgb3JkZXIuICBCdWlsZCB0aGUgcGFyYW1ldGVyIGxpc3QgYWNjb3JkaW5nbHkuICAqLworICBwYXJtbGlzdCA9ICJwcW5kIjsKKyAgc190b3AgPSBnY3J5X3NleHBfZmluZF90b2tlbiAoc19rZXksICJtaXNjLWtleS1pbmZvIiwgMCk7CisgIGlmIChzX3RvcCkKKyAgICB7CisgICAgICBsMSA9IGdjcnlfc2V4cF9maW5kX3Rva2VuIChzX3RvcCwgInAtcS1zd2FwcGVkIiwgMCk7CisgICAgICBpZiAobDEpCisgICAgICAgIHBhcm1saXN0ID0gInFwbmQiOworICAgICAgZ2NyeV9zZXhwX3JlbGVhc2UgKGwxKTsKKyAgICAgIGdjcnlfc2V4cF9yZWxlYXNlIChzX3RvcCk7CisgICAgfQorCisgIC8qIFBhcnNlIGFuZCBwcmludCB0aGUgcGFyYW1ldGVycy4gICovCisgIGwxID0gZ2NyeV9zZXhwX2ZpbmRfdG9rZW4gKHNfa2V5LCAicHJpdmF0ZS1rZXkiLCAwKTsKKyAgc190b3AgPSBnY3J5X3NleHBfZmluZF90b2tlbiAobDEsICJyc2EiLCAwKTsKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKGwxKTsKKyAgaWYgKCFzX3RvcCkKKyAgICBkaWUgKCJwcml2YXRlLWtleSBwYXJ0IG5vdCBmb3VuZCBpbiByZXN1bHRcbiIpOworCisgIGZvciAoaWR4PTA7IHBhcm1saXN0W2lkeF07IGlkeCsrKQorICAgIHsKKyAgICAgIGwxID0gZ2NyeV9zZXhwX2ZpbmRfdG9rZW4gKHNfdG9wLCBwYXJtbGlzdCtpZHgsIDEpOworICAgICAgbXBpID0gZ2NyeV9zZXhwX250aF9tcGkgKGwxLCAxLCBHQ1JZTVBJX0ZNVF9VU0cpOworICAgICAgZ2NyeV9zZXhwX3JlbGVhc2UgKGwxKTsKKyAgICAgIGlmICghbXBpKQorICAgICAgICBkaWUgKCJwYXJhbWV0ZXIgJWMgbWlzc2luZyBpbiBwcml2YXRlLWtleVxuIiwgcGFybWxpc3RbaWR4XSk7CisgICAgICBwcmludF9tcGlfbGluZSAobXBpLCAxKTsKKyAgICAgIGdjcnlfbXBpX3JlbGVhc2UgKG1waSk7CisgICAgfQorCisgIGdjcnlfc2V4cF9yZWxlYXNlIChzX3RvcCk7CisgIGdjcnlfc2V4cF9yZWxlYXNlIChzX2tleSk7Cit9CisKKworDAorc3RhdGljIHNpemVfdAorY29tcHV0ZV90YWdfbGVuZ3RoIChzaXplX3QgbikKK3sgICAgIAorICBpbnQgbmVlZGVkID0gMDsKKworICBpZiAobiA8IDEyOCkKKyAgICBuZWVkZWQgKz0gMjsgLyogVGFnIGFuZCBvbmUgbGVuZ3RoIGJ5dGUuICAqLworICBlbHNlIGlmIChuIDwgMjU2KQorICAgIG5lZWRlZCArPSAzOyAvKiBUYWcsIG51bWJlciBvZiBsZW5ndGggYnl0ZXMsIDEgbGVuZ3RoIGJ5dGUuICAqLworICBlbHNlIGlmIChuIDwgNjU1MzYpCisgICAgbmVlZGVkICs9IDQ7IC8qIFRhZywgbnVtYmVyIG9mIGxlbmd0aCBieXRlcywgMiBsZW5ndGggYnl0ZXMuICAqLworICBlbHNlCisgICAgZGllICgiREVSIG9iamVjdCB0b28gbG9uZyB0byBlbmNvZGVcbiIpOworCisgIHJldHVybiBuZWVkZWQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICoKK3N0b3JlX3RhZ19sZW5ndGggKHVuc2lnbmVkIGNoYXIgKnAsIGludCB0YWcsIHNpemVfdCBuKQoreyAgICAgCisgIGlmICh0YWcgPT0gVEFHX1NFUVVFTkNFKQorICAgIHRhZyB8PSAweDIwOyAvKiBjb25zdHJ1Y3RlZCAqLworCisgICpwKysgPSB0YWc7CisgIGlmIChuIDwgMTI4KQorICAgICpwKysgPSBuOworICBlbHNlIGlmIChuIDwgMjU2KQorICAgIHsKKyAgICAgICpwKysgPSAweDgxOworICAgICAgKnArKyA9IG47CisgICAgfQorICBlbHNlIGlmIChuIDwgNjU1MzYpCisgICAgeworICAgICAgKnArKyA9IDB4ODI7CisgICAgICAqcCsrID0gbiA+PiA4OworICAgICAgKnArKyA9IG47CisgICAgfQorCisgIHJldHVybiBwOworfQorCisKKy8qIEdlbmVyYXRlIGFuIFJTQSBrZXkgb2Ygc2l6ZSBLRVlTSVpFIHVzaW5nIHRoZSBwdWJsaWMgZXhwb25lbnQKKyAgIFBVQkVYUCBhbmQgcHJpbnQgaXQgdG8gc3Rkb3V0IGluIHRoZSBPcGVuU1NMIGZvcm1hdC4gIFRoZSBmb3JtYXQKKyAgIGlzOgorCisgICAgICAgU0VRVUVOQ0UgeworICAgICAgICAgSU5URUdFUiAoMCkgIC0tIFVua25vd24gY29uc3RhbnQuIAorICAgICAgICAgSU5URUdFUiAgICAgIC0tIG4KKyAgICAgICAgIElOVEVHRVIgICAgICAtLSBlCisgICAgICAgICBJTlRFR0VSICAgICAgLS0gZAorICAgICAgICAgSU5URUdFUiAgICAgIC0tIHAgICAgIAorICAgICAgICAgSU5URUdFUiAgICAgIC0tIHEgICAgICAod2l0aCBwIDwgcSkKKyAgICAgICAgIElOVEVHRVIgICAgICAtLSBkbXAxID0gZCBtb2QgKHAtMSkKKyAgICAgICAgIElOVEVHRVIgICAgICAtLSBkbXExID0gZCBtb2QgKHEtMSkKKyAgICAgICAgIElOVEVHRVIgICAgICAtLSB1ICAgID0gcF57LTF9IG1vZCBxCisgICAgICAgfQorCisqLworc3RhdGljIHZvaWQKK3J1bl9yc2FfZ2VuIChpbnQga2V5c2l6ZSwgaW50IHB1YmV4cCkKK3sKKyAgZ3BnX2Vycm9yX3QgZXJyOworICBnY3J5X3NleHBfdCBrZXlzcGVjLCBrZXksIGwxOworICBjb25zdCBjaGFyIGtleWVsZW1zW10gPSAibmVkcHEuLnUiOworICBnY3J5X21waV90IGtleXBhcm1zWzhdOworICBzaXplX3QgICAgIGtleXBhcm1zbGVuWzhdOworICBpbnQgaWR4OworICBzaXplX3QgZGVybGVuLCBuZWVkZWQsIG47CisgIHVuc2lnbmVkIGNoYXIgKmRlcmJ1ZiwgKmRlcjsKKworICBlcnIgPSBnY3J5X3NleHBfYnVpbGQgKCZrZXlzcGVjLCBOVUxMLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAiKGdlbmtleSAocnNhIChuYml0cyAlZCkocnNhLXVzZS1lICVkKSkpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzaXplLCBwdWJleHApOworICBpZiAoZXJyKQorICAgIGRpZSAoImdjcnlfc2V4cF9idWlsZCBmYWlsZWQgZm9yIFJTQSBrZXkgZ2VuZXJhdGlvbjogJXNcbiIsCisgICAgICAgICBncGdfc3RyZXJyb3IgKGVycikpOworCisgIGVyciA9IGdjcnlfcGtfZ2Vua2V5ICgma2V5LCBrZXlzcGVjKTsKKyAgaWYgKGVycikKKyAgICBkaWUgKCJnY3J5X3BrX2dlbmtleSBmYWlsZWQgZm9yIFJTQTogJXNcbiIsIGdwZ19zdHJlcnJvciAoZXJyKSk7CisgIAorICBnY3J5X3NleHBfcmVsZWFzZSAoa2V5c3BlYyk7CisKKyAgbDEgPSBnY3J5X3NleHBfZmluZF90b2tlbiAoa2V5LCAicHJpdmF0ZS1rZXkiLCAwKTsKKyAgaWYgKCFsMSkKKyAgICBkaWUgKCJwcml2YXRlIGtleSBub3QgZm91bmQgaW4gZ2Vua2V5IHJlc3VsdFxuIik7CisgIGdjcnlfc2V4cF9yZWxlYXNlIChrZXkpOworICBrZXkgPSBsMTsKKworICBsMSA9IGdjcnlfc2V4cF9maW5kX3Rva2VuIChrZXksICJyc2EiLCAwKTsKKyAgaWYgKCFsMSkKKyAgICBkaWUgKCJyZXR1cm5lZCBwcml2YXRlIGtleSBub3QgZm9ybWVkIGFzIGV4cGVjdGVkXG4iKTsKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKGtleSk7CisgIGtleSA9IGwxOworCisgIC8qIEV4dHJhY3QgdGhlIHBhcmFtZXRlcnMgZnJvbSB0aGUgUy1leHByZXNzaW9uIGFuZCBzdG9yZSB0aGVtIGluIGEKKyAgICAgd2VsbCBkZWZpbmVkIG9yZGVyIGluIEtFWVBBUk1TLiAgKi8KKyAgZm9yIChpZHg9MDsgaWR4IDwgRElNKGtleXBhcm1zKTsgaWR4KyspIAorICAgIHsKKyAgICAgIGlmIChrZXllbGVtc1tpZHhdID09ICcuJykKKyAgICAgICAgeworICAgICAgICAgIGtleXBhcm1zW2lkeF0gPSBnY3J5X21waV9uZXcgKDApOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICBsMSA9IGdjcnlfc2V4cF9maW5kX3Rva2VuIChrZXksIGtleWVsZW1zK2lkeCwgMSk7CisgICAgICBpZiAoIWwxKQorICAgICAgICBkaWUgKCJubyAlYyBwYXJhbWV0ZXIgaW4gcmV0dXJuZWQgcHJpdmF0ZSBrZXlcbiIsIGtleWVsZW1zW2lkeF0pOworICAgICAga2V5cGFybXNbaWR4XSA9IGdjcnlfc2V4cF9udGhfbXBpIChsMSwgMSwgR0NSWU1QSV9GTVRfVVNHKTsKKyAgICAgIGlmICgha2V5cGFybXNbaWR4XSkKKyAgICAgICAgZGllICgibm8gdmFsdWUgZm9yICVjIHBhcmFtZXRlciBpbiByZXR1cm5lZCBwcml2YXRlIGtleVxuIiwKKyAgICAgICAgICAgICBrZXllbGVtc1tpZHhdKTsKKyAgICAgIGdjcnlfc2V4cF9yZWxlYXNlIChsMSk7CisgICAgfQorCisgIGdjcnlfc2V4cF9yZWxlYXNlIChrZXkpOworCisgIC8qIENoZWNrIHRoYXQgcCA8IHE7IGlmIG5vdCBzd2FwIHAgYW5kIHEgYW5kIHJlY29tcHV0ZSB1LiAgKi8gCisgIGlmIChnY3J5X21waV9jbXAgKGtleXBhcm1zWzNdLCBrZXlwYXJtc1s0XSkgPiAwKQorICAgIHsKKyAgICAgIGdjcnlfbXBpX3N3YXAgKGtleXBhcm1zWzNdLCBrZXlwYXJtc1s0XSk7CisgICAgICBnY3J5X21waV9pbnZtIChrZXlwYXJtc1s3XSwga2V5cGFybXNbM10sIGtleXBhcm1zWzRdKTsKKyAgICB9CisKKyAgLyogQ29tcHV0ZSB0aGUgYWRkaXRpb25hbCBwYXJhbWV0ZXJzLiAgKi8KKyAgZ2NyeV9tcGlfc3ViX3VpIChrZXlwYXJtc1s1XSwga2V5cGFybXNbM10sIDEpOworICBnY3J5X21waV9tb2QgKGtleXBhcm1zWzVdLCBrZXlwYXJtc1syXSwga2V5cGFybXNbNV0pOworICBnY3J5X21waV9zdWJfdWkgKGtleXBhcm1zWzZdLCBrZXlwYXJtc1s0XSwgMSk7CisgIGdjcnlfbXBpX21vZCAoa2V5cGFybXNbNl0sIGtleXBhcm1zWzJdLCBrZXlwYXJtc1s2XSk7CisKKyAgLyogQ29tcHV0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBERVIgZW5jb2RpbmcuICAqLworICBuZWVkZWQgPSBjb21wdXRlX3RhZ19sZW5ndGggKDEpICsgMTsgIAorICBmb3IgKGlkeD0wOyBpZHggPCBESU0oa2V5cGFybXMpOyBpZHgrKykgCisgICAgeworICAgICAgZXJyID0gZ2NyeV9tcGlfcHJpbnQgKEdDUllNUElfRk1UX1NURCwgTlVMTCwgMCwgJm4sIGtleXBhcm1zW2lkeF0pOworICAgICAgaWYgKGVycikKKyAgICAgICAgZGllICgiZXJyb3IgZm9ybWF0dGluZyBwYXJhbWV0ZXI6ICVzXG4iLCBncGdfc3RyZXJyb3IgKGVycikpOworICAgICAga2V5cGFybXNsZW5baWR4XSA9IG47CisgICAgICBuZWVkZWQgKz0gY29tcHV0ZV90YWdfbGVuZ3RoIChuKSArIG47CisgICAgfQorICAKKyAgLyogU3RvcmUgdGhlIGtleSBwYXJhbWV0ZXJzLiAqLworICBkZXJsZW4gPSBjb21wdXRlX3RhZ19sZW5ndGggKG5lZWRlZCkgKyBuZWVkZWQ7CisgIGRlciA9IGRlcmJ1ZiA9IGdjcnlfeG1hbGxvYyAoZGVybGVuKTsKKworICBkZXIgPSBzdG9yZV90YWdfbGVuZ3RoIChkZXIsIFRBR19TRVFVRU5DRSwgbmVlZGVkKTsKKyAgZGVyID0gc3RvcmVfdGFnX2xlbmd0aCAoZGVyLCBUQUdfSU5URUdFUiwgMSk7CisgICpkZXIrKyA9IDA7CisgIGZvciAoaWR4PTA7IGlkeCA8IERJTShrZXlwYXJtcyk7IGlkeCsrKSAKKyAgICB7CisgICAgICBkZXIgPSBzdG9yZV90YWdfbGVuZ3RoIChkZXIsIFRBR19JTlRFR0VSLCBrZXlwYXJtc2xlbltpZHhdKTsKKyAgICAgIGVyciA9IGdjcnlfbXBpX3ByaW50IChHQ1JZTVBJX0ZNVF9TVEQsIGRlciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlwYXJtc2xlbltpZHhdLCBOVUxMLCBrZXlwYXJtc1tpZHhdKTsKKyAgICAgIGlmIChlcnIpCisgICAgICAgIGRpZSAoImVycm9yIGZvcm1hdHRpbmcgcGFyYW1ldGVyOiAlc1xuIiwgZ3BnX3N0cmVycm9yIChlcnIpKTsKKyAgICAgIGRlciArPSBrZXlwYXJtc2xlbltpZHhdOworICAgIH0KKworICAvKiBQcmludCB0aGUgc3R1ZmYuICAqLworICBmb3IgKGlkeD0wOyBpZHggPCBESU0oa2V5cGFybXMpOyBpZHgrKykgCisgICAgZ2NyeV9tcGlfcmVsZWFzZSAoa2V5cGFybXNbaWR4XSk7CisKKyAgYXNzZXJ0IChkZXIgLSBkZXJidWYgPT0gZGVybGVuKTsKKworICBpZiAoYmFzZTY0X291dHB1dCkKKyAgICBwdXRzICgiLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLSIpOworICBwcmludF9idWZmZXIgKGRlcmJ1ZiwgZGVybGVuKTsKKyAgaWYgKGJhc2U2NF9vdXRwdXQpCisgICAgcHV0cyAoIi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tIik7CisKKyAgZ2NyeV9mcmVlIChkZXJidWYpOworfQorCisKKwwKKy8qIFNpZ24gREFUQSBvZiBsZW5ndGggREFUQUxFTiB1c2luZyB0aGUga2V5IHRha2VuIGZyb20gdGhlIFBFTQorICAgZW5jb2RlZCBLRVlGSUxFIGFuZCB0aGUgaGFzaCBhbGdvcml0aG0gSEFTSEFMR08uICAqLworc3RhdGljIHZvaWQKK3J1bl9yc2Ffc2lnbiAoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFsZW4sCisgICAgICAgICAgICAgIGludCBoYXNoYWxnbywgaW50IHBrY3MxLCBjb25zdCBjaGFyICprZXlmaWxlKQorCit7CisgIGdwZ19lcnJvcl90IGVycjsKKyAgZ2NyeV9zZXhwX3Qgc19kYXRhLCBzX2tleSwgc19zaWcsIHNfdG1wOworICBnY3J5X21waV90IHNpZ19tcGkgPSBOVUxMOworICB1bnNpZ25lZCBjaGFyICpvdXRidWY7CisgIHNpemVfdCBvdXRsZW47CisgIAorLyogICBzaG93aGV4ICgiRCIsIGRhdGEsIGRhdGFsZW4pOyAqLworICBpZiAocGtjczEpCisgICAgeworICAgICAgdW5zaWduZWQgY2hhciBoYXNoWzY0XTsKKyAgICAgIHVuc2lnbmVkIGludCBoYXNoc2l6ZTsKKworICAgICAgaGFzaHNpemUgPSBnY3J5X21kX2dldF9hbGdvX2RsZW4gKGhhc2hhbGdvKTsKKyAgICAgIGlmICghaGFzaHNpemUgfHwgaGFzaHNpemUgPiBzaXplb2YgaGFzaCkKKyAgICAgICAgZGllICgiZGlnZXN0IHRvbyBsb25nIGZvciBidWZmZXIgb3IgdW5rbm93biBoYXNoIGFsZ29yaXRobVxuIik7CisgICAgICBnY3J5X21kX2hhc2hfYnVmZmVyIChoYXNoYWxnbywgaGFzaCwgZGF0YSwgZGF0YWxlbik7CisgICAgICBlcnIgPSBnY3J5X3NleHBfYnVpbGQgKCZzX2RhdGEsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoZGF0YSAoZmxhZ3MgcGtjczEpKGhhc2ggJXMgJWIpKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfbWRfYWxnb19uYW1lIChoYXNoYWxnbyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpaGFzaHNpemUsIGhhc2gpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGdjcnlfbXBpX3QgdG1wOworCisgICAgICBlcnIgPSBnY3J5X21waV9zY2FuICgmdG1wLCBHQ1JZTVBJX0ZNVF9VU0csIGRhdGEsIGRhdGFsZW4sTlVMTCk7CisgICAgICBpZiAoIWVycikKKyAgICAgICAgeworICAgICAgICAgIGVyciA9IGdjcnlfc2V4cF9idWlsZCAoJnNfZGF0YSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoZGF0YSAoZmxhZ3MgcmF3KSh2YWx1ZSAlbSkpIiwgdG1wKTsKKyAgICAgICAgICBnY3J5X21waV9yZWxlYXNlICh0bXApOworICAgICAgICB9CisgICAgfQorICBpZiAoZXJyKQorICAgIGRpZSAoImdjcnlfc2V4cF9idWlsZCBmYWlsZWQgZm9yIFJTQSBkYXRhIGlucHV0OiAlc1xuIiwKKyAgICAgICAgIGdwZ19zdHJlcnJvciAoZXJyKSk7CisKKyAgc19rZXkgPSByZWFkX3ByaXZhdGVfa2V5X2ZpbGUgKGtleWZpbGUsIDApOworCisgIGVyciA9IGdjcnlfcGtfc2lnbiAoJnNfc2lnLCBzX2RhdGEsIHNfa2V5KTsKKyAgaWYgKGVycikKKyAgICB7CisgICAgICBnY3J5X3NleHBfcmVsZWFzZSAocmVhZF9wcml2YXRlX2tleV9maWxlIChrZXlmaWxlLCAxKSk7CisgICAgICBkaWUgKCJnY3J5X3BrX3NpZ25lZCBmYWlsZWQgKGRhdGFsZW49JWQsa2V5ZmlsZT0lcyk6ICVzXG4iLAorICAgICAgICAgICAoaW50KWRhdGFsZW4sIGtleWZpbGUsIGdwZ19zdHJlcnJvciAoZXJyKSk7CisgICAgfQorICBnY3J5X3NleHBfcmVsZWFzZSAoc19rZXkpOworICBnY3J5X3NleHBfcmVsZWFzZSAoc19kYXRhKTsKKworICBzX3RtcCA9IGdjcnlfc2V4cF9maW5kX3Rva2VuIChzX3NpZywgInNpZy12YWwiLCAwKTsKKyAgaWYgKHNfdG1wKQorICAgIHsKKyAgICAgIGdjcnlfc2V4cF9yZWxlYXNlIChzX3NpZyk7CisgICAgICBzX3NpZyA9IHNfdG1wOworICAgICAgc190bXAgPSBnY3J5X3NleHBfZmluZF90b2tlbiAoc19zaWcsICJyc2EiLCAwKTsKKyAgICAgIGlmIChzX3RtcCkKKyAgICAgICAgeworICAgICAgICAgIGdjcnlfc2V4cF9yZWxlYXNlIChzX3NpZyk7CisgICAgICAgICAgc19zaWcgPSBzX3RtcDsKKyAgICAgICAgICBzX3RtcCA9IGdjcnlfc2V4cF9maW5kX3Rva2VuIChzX3NpZywgInMiLCAwKTsKKyAgICAgICAgICBpZiAoc190bXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGdjcnlfc2V4cF9yZWxlYXNlIChzX3NpZyk7CisgICAgICAgICAgICAgIHNfc2lnID0gc190bXA7CisgICAgICAgICAgICAgIHNpZ19tcGkgPSBnY3J5X3NleHBfbnRoX21waSAoc19zaWcsIDEsIEdDUllNUElfRk1UX1VTRyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgIGdjcnlfc2V4cF9yZWxlYXNlIChzX3NpZyk7CisgICAgICAgICAgICAgIAorICBpZiAoIXNpZ19tcGkpCisgICAgZGllICgibm8gdmFsdWUgaW4gcmV0dXJuZWQgUy1leHByZXNzaW9uXG4iKTsKKyAgZXJyID0gZ2NyeV9tcGlfYXByaW50IChHQ1JZTVBJX0ZNVF9TVEQsICZvdXRidWYsICZvdXRsZW4sIHNpZ19tcGkpOworICBpZiAoZXJyKQorICAgIGRpZSAoImdjcnlfbXBpX2FwcmludCBmYWlsZWQ6ICVzXG4iLCBncGdfc3RyZXJyb3IgKGVycikpOworICBnY3J5X21waV9yZWxlYXNlIChzaWdfbXBpKTsKKworICBwcmludF9idWZmZXIgKG91dGJ1Ziwgb3V0bGVuKTsKKyAgZ2NyeV9mcmVlIChvdXRidWYpOworfQorCisKKwwKKy8qIFZlcmlmeSBEQVRBIG9mIGxlbmd0aCBEQVRBTEVOIHVzaW5nIHRoZSBwdWJsaWMga2V5IHRha2VuIGZyb20gdGhlCisgICBQRU0gZW5jb2RlZCBLRVlGSUxFIGFuZCB0aGUgaGFzaCBhbGdvcml0aG0gSEFTSEFMR08gYWdhaW5zdCB0aGUKKyAgIGJpbmFyeSBzaWduYXR1cmUgaW4gU0lHRklMRS4gICovCitzdGF0aWMgdm9pZAorcnVuX3JzYV92ZXJpZnkgKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBkYXRhbGVuLCBpbnQgaGFzaGFsZ28sIGludCBwa2NzMSwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXlmaWxlLCBjb25zdCBjaGFyICpzaWdmaWxlKQorCit7CisgIGdwZ19lcnJvcl90IGVycjsKKyAgZ2NyeV9zZXhwX3Qgc19kYXRhLCBzX2tleSwgc19zaWc7CisgIAorICBpZiAocGtjczEpCisgICAgeworICAgICAgdW5zaWduZWQgY2hhciBoYXNoWzY0XTsKKyAgICAgIHVuc2lnbmVkIGludCBoYXNoc2l6ZTsKKworICAgICAgaGFzaHNpemUgPSBnY3J5X21kX2dldF9hbGdvX2RsZW4gKGhhc2hhbGdvKTsKKyAgICAgIGlmICghaGFzaHNpemUgfHwgaGFzaHNpemUgPiBzaXplb2YgaGFzaCkKKyAgICAgICAgZGllICgiZGlnZXN0IHRvbyBsb25nIGZvciBidWZmZXIgb3IgdW5rbm93biBoYXNoIGFsZ29yaXRobVxuIik7CisgICAgICBnY3J5X21kX2hhc2hfYnVmZmVyIChoYXNoYWxnbywgaGFzaCwgZGF0YSwgZGF0YWxlbik7CisgICAgICBlcnIgPSBnY3J5X3NleHBfYnVpbGQgKCZzX2RhdGEsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoZGF0YSAoZmxhZ3MgcGtjczEpKGhhc2ggJXMgJWIpKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfbWRfYWxnb19uYW1lIChoYXNoYWxnbyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpaGFzaHNpemUsIGhhc2gpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGdjcnlfbXBpX3QgdG1wOworCisgICAgICBlcnIgPSBnY3J5X21waV9zY2FuICgmdG1wLCBHQ1JZTVBJX0ZNVF9VU0csIGRhdGEsIGRhdGFsZW4sTlVMTCk7CisgICAgICBpZiAoIWVycikKKyAgICAgICAgeworICAgICAgICAgIGVyciA9IGdjcnlfc2V4cF9idWlsZCAoJnNfZGF0YSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoZGF0YSAoZmxhZ3MgcmF3KSh2YWx1ZSAlbSkpIiwgdG1wKTsKKyAgICAgICAgICBnY3J5X21waV9yZWxlYXNlICh0bXApOworICAgICAgICB9CisgICAgfQorICBpZiAoZXJyKQorICAgIGRpZSAoImdjcnlfc2V4cF9idWlsZCBmYWlsZWQgZm9yIFJTQSBkYXRhIGlucHV0OiAlc1xuIiwKKyAgICAgICAgIGdwZ19zdHJlcnJvciAoZXJyKSk7CisKKyAgc19rZXkgPSByZWFkX3B1YmxpY19rZXlfZmlsZSAoa2V5ZmlsZSwgMCk7CisKKyAgc19zaWcgPSByZWFkX3NpZ19maWxlIChzaWdmaWxlKTsKKworICBlcnIgPSBnY3J5X3BrX3ZlcmlmeSAoc19zaWcsIHNfZGF0YSwgc19rZXkpOworICBpZiAoIWVycikKKyAgICBwdXRzICgiR09PRCBzaWduYXR1cmUiKTsKKyAgZWxzZSBpZiAoZ3BnX2Vycl9jb2RlIChlcnIpID09IEdQR19FUlJfQkFEX1NJR05BVFVSRSkKKyAgICBwdXRzICgiQkFEIHNpZ25hdHVyZSIpOworICBlbHNlCisgICAgcHJpbnRmICgiRVJST1IgKCVzKVxuIiwgZ3BnX3N0cmVycm9yIChlcnIpKTsKKworICBnY3J5X3NleHBfcmVsZWFzZSAoc19zaWcpOworICBnY3J5X3NleHBfcmVsZWFzZSAoc19rZXkpOworICBnY3J5X3NleHBfcmVsZWFzZSAoc19kYXRhKTsKK30KKworCisMCisvKiBHZW5lcmF0ZSBhIERTQSBrZXkgb2Ygc2l6ZSBLRVlTSVpFIGFuZCByZXR1cm4gdGhlIGNvbXBsZXRlCisgICBTLWV4cHJlc3Npb24uICAqLworc3RhdGljIGdjcnlfc2V4cF90Citkc2FfZ2VuIChpbnQga2V5c2l6ZSkKK3sKKyAgZ3BnX2Vycm9yX3QgZXJyOworICBnY3J5X3NleHBfdCBrZXlzcGVjLCBrZXk7CisKKyAgZXJyID0gZ2NyeV9zZXhwX2J1aWxkICgma2V5c3BlYywgTlVMTCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIihnZW5rZXkgKGRzYSAobmJpdHMgJWQpKHVzZS1maXBzMTg2LTIpKSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGtleXNpemUpOworICBpZiAoZXJyKQorICAgIGRpZSAoImdjcnlfc2V4cF9idWlsZCBmYWlsZWQgZm9yIERTQSBrZXkgZ2VuZXJhdGlvbjogJXNcbiIsCisgICAgICAgICBncGdfc3RyZXJyb3IgKGVycikpOworCisgIGVyciA9IGdjcnlfcGtfZ2Vua2V5ICgma2V5LCBrZXlzcGVjKTsKKyAgaWYgKGVycikKKyAgICBkaWUgKCJnY3J5X3BrX2dlbmtleSBmYWlsZWQgZm9yIERTQTogJXNcbiIsIGdwZ19zdHJlcnJvciAoZXJyKSk7CisgIAorICBnY3J5X3NleHBfcmVsZWFzZSAoa2V5c3BlYyk7CisKKyAgcmV0dXJuIGtleTsKK30KKworCisvKiBHZW5lcmF0ZSBhIERTQSBrZXkgb2Ygc2l6ZSBLRVlTSVpFIGFuZCByZXR1cm4gdGhlIGNvbXBsZXRlCisgICBTLWV4cHJlc3Npb24uICAqLworc3RhdGljIGdjcnlfc2V4cF90Citkc2FfZ2VuX3dpdGhfc2VlZCAoaW50IGtleXNpemUsIGNvbnN0IHZvaWQgKnNlZWQsIHNpemVfdCBzZWVkbGVuKQoreworICBncGdfZXJyb3JfdCBlcnI7CisgIGdjcnlfc2V4cF90IGtleXNwZWMsIGtleTsKKworICBlcnIgPSBnY3J5X3NleHBfYnVpbGQgKCZrZXlzcGVjLCBOVUxMLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAiKGdlbmtleSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiICAoZHNhIgorICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgKG5iaXRzICVkKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICh1c2UtZmlwczE4Ni0yKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIChkZXJpdmUtcGFybXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgIChzZWVkICViKSkpKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAga2V5c2l6ZSwgKGludClzZWVkbGVuLCBzZWVkKTsKKyAgaWYgKGVycikKKyAgICBkaWUgKCJnY3J5X3NleHBfYnVpbGQgZmFpbGVkIGZvciBEU0Ega2V5IGdlbmVyYXRpb246ICVzXG4iLAorICAgICAgICAgZ3BnX3N0cmVycm9yIChlcnIpKTsKKworICBlcnIgPSBnY3J5X3BrX2dlbmtleSAoJmtleSwga2V5c3BlYyk7CisgIGlmIChlcnIpCisgICAgZGllICgiZ2NyeV9wa19nZW5rZXkgZmFpbGVkIGZvciBEU0E6ICVzXG4iLCBncGdfc3RyZXJyb3IgKGVycikpOworICAKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKGtleXNwZWMpOworCisgIHJldHVybiBrZXk7Cit9CisKKworLyogUHJpbnQgdGhlIGRvbWFpbiBwYXJhbWV0ZXIgYXMgd2VsbCBhcyB0aGUgZGVyaXZlIGluZm9ybWF0aW9uLiAgS0VZCisgICBpcyB0aGUgY29tcGxldGUga2V5IGFzIHJldHVybmVkIGJ5IGRzYV9nZW4uICBXZSBwcmludCB0byBzdGRvdXQKKyAgIHdpdGggb25lIHBhcmFtZXRlciBwZXIgbGluZSBpbiBoZXggZm9ybWF0IHVzaW5nIHRoaXMgb3JkZXI6IHAsIHEsCisgICBnLCBzZWVkLCBjb3VudGVyLCBoLiAqLworc3RhdGljIHZvaWQgCitwcmludF9kc2FfZG9tYWluX3BhcmFtZXRlcnMgKGdjcnlfc2V4cF90IGtleSkKK3sKKyAgZ2NyeV9zZXhwX3QgbDEsIGwyOworICBnY3J5X21waV90IG1waTsKKyAgaW50IGlkeDsKKyAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgc2l6ZV90IGRhdGFsZW47CisgIGNoYXIgKnN0cmluZzsKKworICBsMSA9IGdjcnlfc2V4cF9maW5kX3Rva2VuIChrZXksICJwdWJsaWMta2V5IiwgMCk7CisgIGlmICghbDEpCisgICAgZGllICgicHVibGljIGtleSBub3QgZm91bmQgaW4gZ2Vua2V5IHJlc3VsdFxuIik7CisKKyAgbDIgPSBnY3J5X3NleHBfZmluZF90b2tlbiAobDEsICJkc2EiLCAwKTsKKyAgaWYgKCFsMikKKyAgICBkaWUgKCJyZXR1cm5lZCBwdWJsaWMga2V5IG5vdCBmb3JtZWQgYXMgZXhwZWN0ZWRcbiIpOworICBnY3J5X3NleHBfcmVsZWFzZSAobDEpOworICBsMSA9IGwyOworCisgIC8qIEV4dHJhY3QgdGhlIHBhcmFtZXRlcnMgZnJvbSB0aGUgUy1leHByZXNzaW9uIGFuZCBwcmludCB0aGVtIHRvIHN0ZG91dC4gICovCisgIGZvciAoaWR4PTA7ICJwcWciW2lkeF07IGlkeCsrKSAKKyAgICB7CisgICAgICBsMiA9IGdjcnlfc2V4cF9maW5kX3Rva2VuIChsMSwgInBxZyIraWR4LCAxKTsKKyAgICAgIGlmICghbDIpCisgICAgICAgIGRpZSAoIm5vICVjIHBhcmFtZXRlciBpbiByZXR1cm5lZCBwdWJsaWMga2V5XG4iLCAicHFnIltpZHhdKTsKKyAgICAgIG1waSA9IGdjcnlfc2V4cF9udGhfbXBpIChsMiwgMSwgR0NSWU1QSV9GTVRfVVNHKTsKKyAgICAgIGlmICghbXBpKQorICAgICAgICBkaWUgKCJubyB2YWx1ZSBmb3IgJWMgcGFyYW1ldGVyIGluIHJldHVybmVkIHB1YmxpYyBrZXlcbiIsInBxZyJbaWR4XSk7CisgICAgICBnY3J5X3NleHBfcmVsZWFzZSAobDIpOworICAgICAgaWYgKHN0YW5kYWxvbmVfbW9kZSkKKyAgICAgICAgcHJpbnRmICgiJWMgPSAiLCAiUFFHIltpZHhdKTsKKyAgICAgIHByaW50X21waV9saW5lIChtcGksIDEpOworICAgICAgZ2NyeV9tcGlfcmVsZWFzZSAobXBpKTsKKyAgICB9CisgIGdjcnlfc2V4cF9yZWxlYXNlIChsMSk7CisKKyAgLyogRXh0cmFjdCB0aGUgc2VlZCB2YWx1ZXMuICAqLworICBsMSA9IGdjcnlfc2V4cF9maW5kX3Rva2VuIChrZXksICJtaXNjLWtleS1pbmZvIiwgMCk7CisgIGlmICghbDEpCisgICAgZGllICgibWlzYy1rZXktaW5mbyBub3QgZm91bmQgaW4gZ2Vua2V5IHJlc3VsdFxuIik7CisKKyAgbDIgPSBnY3J5X3NleHBfZmluZF90b2tlbiAobDEsICJzZWVkLXZhbHVlcyIsIDApOworICBpZiAoIWwyKQorICAgIGRpZSAoIm5vIHNlZWQtdmFsdWVzIGluIHJldHVybmVkIGtleVxuIik7CisgIGdjcnlfc2V4cF9yZWxlYXNlIChsMSk7CisgIGwxID0gbDI7CisKKyAgbDIgPSBnY3J5X3NleHBfZmluZF90b2tlbiAobDEsICJzZWVkIiwgMCk7CisgIGlmICghbDIpCisgICAgZGllICgibm8gc2VlZCB2YWx1ZSBpbiByZXR1cm5lZCBrZXlcbiIpOworICBkYXRhID0gZ2NyeV9zZXhwX250aF9kYXRhIChsMiwgMSwgJmRhdGFsZW4pOworICBpZiAoIWRhdGEpCisgICAgZGllICgibm8gc2VlZCB2YWx1ZSBpbiByZXR1cm5lZCBrZXlcbiIpOworICBpZiAoc3RhbmRhbG9uZV9tb2RlKQorICAgIHByaW50ZiAoIlNlZWQgPSAiKTsKKyAgcHJpbnRfZGF0YV9saW5lIChkYXRhLCBkYXRhbGVuKTsKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKGwyKTsKKworICBsMiA9IGdjcnlfc2V4cF9maW5kX3Rva2VuIChsMSwgImNvdW50ZXIiLCAwKTsKKyAgaWYgKCFsMikKKyAgICBkaWUgKCJubyBjb3VudGVyIHZhbHVlIGluIHJldHVybmVkIGtleVxuIik7CisgIHN0cmluZyA9IGdjcnlfc2V4cF9udGhfc3RyaW5nIChsMiwgMSk7CisgIGlmICghc3RyaW5nKQorICAgIGRpZSAoIm5vIGNvdW50ZXIgdmFsdWUgaW4gcmV0dXJuZWQga2V5XG4iKTsKKyAgaWYgKHN0YW5kYWxvbmVfbW9kZSkKKyAgICBwcmludGYgKCJjID0gJWxkXG4iLCBzdHJ0b3VsIChzdHJpbmcsIE5VTEwsIDEwKSk7CisgIGVsc2UKKyAgICBwcmludGYgKCIlbFhcbiIsIHN0cnRvdWwgKHN0cmluZywgTlVMTCwgMTApKTsKKyAgZ2NyeV9mcmVlIChzdHJpbmcpOworICBnY3J5X3NleHBfcmVsZWFzZSAobDIpOworCisgIGwyID0gZ2NyeV9zZXhwX2ZpbmRfdG9rZW4gKGwxLCAiaCIsIDApOworICBpZiAoIWwyKQorICAgIGRpZSAoIm5vIG4gdmFsdWUgaW4gcmV0dXJuZWQga2V5XG4iKTsKKyAgbXBpID0gZ2NyeV9zZXhwX250aF9tcGkgKGwyLCAxLCBHQ1JZTVBJX0ZNVF9VU0cpOworICBpZiAoIW1waSkKKyAgICBkaWUgKCJubyBoIHZhbHVlIGluIHJldHVybmVkIGtleVxuIik7CisgIGlmIChzdGFuZGFsb25lX21vZGUpCisgICAgcHJpbnRmICgiSCA9ICIpOworICBwcmludF9tcGlfbGluZSAobXBpLCAxKTsKKyAgZ2NyeV9tcGlfcmVsZWFzZSAobXBpKTsKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKGwyKTsKKworICBnY3J5X3NleHBfcmVsZWFzZSAobDEpOworfQorCisKKy8qIEdlbmVyYXRlIERTQSBkb21haW4gcGFyYW1ldGVycyBmb3IgYSBtb2R1bHVzIHNpemUgb2YgS0VZU0laRS4gIFRoZQorICAgcmVzdWx0IGlzIHByaW50ZWQgdG8gc3Rkb3V0IHdpdGggb25lIHBhcmFtZXRlciBwZXIgbGluZSBpbiBoZXgKKyAgIGZvcm1hdCBhbmQgaW4gdGhpcyBvcmRlcjogcCwgcSwgZywgc2VlZCwgY291bnRlciwgaC4gIElmIFNFRUQgaXMKKyAgIG5vdCBOVUxMIHRoaXMgc2VlZCB2YWx1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBnZW5lcmF0aW9uLiAgKi8KK3N0YXRpYyB2b2lkCitydW5fZHNhX3BxZ19nZW4gKGludCBrZXlzaXplLCBjb25zdCB2b2lkICpzZWVkLCBzaXplX3Qgc2VlZGxlbikKK3sKKyAgZ2NyeV9zZXhwX3Qga2V5OworCisgIGlmIChzZWVkKQorICAgIGtleSA9IGRzYV9nZW5fd2l0aF9zZWVkIChrZXlzaXplLCBzZWVkLCBzZWVkbGVuKTsKKyAgZWxzZQorICAgIGtleSA9IGRzYV9nZW4gKGtleXNpemUpOworICBwcmludF9kc2FfZG9tYWluX3BhcmFtZXRlcnMgKGtleSk7CisgIGdjcnlfc2V4cF9yZWxlYXNlIChrZXkpOworfQorCisKKy8qIEdlbmVyYXRlIGEgRFNBIGtleSBvZiBzaXplIG9mIEtFWVNJWkUgYW5kIHdyaXRlIHRoZSBwcml2YXRlIGtleSB0bworICAgRklMRU5BTUUuICBBbHNvIHdyaXRlIHRoZSBwYXJhbWV0ZXJzIHRvIHN0ZG91dCBpbiB0aGUgc2FtZSB3YXkgYXMKKyAgIHJ1bl9kc2FfcHFnX2dlbi4gICovCitzdGF0aWMgdm9pZAorcnVuX2RzYV9nZW4gKGludCBrZXlzaXplLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgZ2NyeV9zZXhwX3Qga2V5LCBwcml2YXRlX2tleTsKKyAgRklMRSAqZnA7CisKKyAga2V5ID0gZHNhX2dlbiAoa2V5c2l6ZSk7CisgIHByaXZhdGVfa2V5ID0gZ2NyeV9zZXhwX2ZpbmRfdG9rZW4gKGtleSwgInByaXZhdGUta2V5IiwgMCk7CisgIGlmICghcHJpdmF0ZV9rZXkpCisgICAgZGllICgicHJpdmF0ZSBrZXkgbm90IGZvdW5kIGluIGdlbmtleSByZXN1bHRcbiIpOworICBwcmludF9kc2FfZG9tYWluX3BhcmFtZXRlcnMgKGtleSk7CisKKyAgZnAgPSBmb3BlbiAoZmlsZW5hbWUsICJ3YiIpOworICBpZiAoIWZwKQorICAgIGRpZSAoImNhbid0IGNyZWF0ZSBgJXMnOiAlc1xuIiwgZmlsZW5hbWUsIHN0cmVycm9yIChlcnJubykpOworICBwcmludF9zZXhwIChwcml2YXRlX2tleSwgZnApOworICBmY2xvc2UgKGZwKTsKKworICBnY3J5X3NleHBfcmVsZWFzZSAocHJpdmF0ZV9rZXkpOworICBnY3J5X3NleHBfcmVsZWFzZSAoa2V5KTsKK30KKworCisMCisvKiBTaWduIERBVEEgb2YgbGVuZ3RoIERBVEFMRU4gdXNpbmcgdGhlIGtleSB0YWtlbiBmcm9tIHRoZSBTLWV4cHJlc3Npb24KKyAgIGVuY29kZWQgS0VZRklMRS4gKi8KK3N0YXRpYyB2b2lkCitydW5fZHNhX3NpZ24gKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBkYXRhbGVuLCBjb25zdCBjaGFyICprZXlmaWxlKQorCit7CisgIGdwZ19lcnJvcl90IGVycjsKKyAgZ2NyeV9zZXhwX3Qgc19kYXRhLCBzX2tleSwgc19zaWcsIHNfdG1wLCBzX3RtcDI7CisgIGNoYXIgaGFzaFsyMF07CisgIGdjcnlfbXBpX3QgdG1wbXBpOworCisgIGdjcnlfbWRfaGFzaF9idWZmZXIgKEdDUllfTURfU0hBMSwgaGFzaCwgZGF0YSwgZGF0YWxlbik7CisgIGVyciA9IGdjcnlfbXBpX3NjYW4gKCZ0bXBtcGksIEdDUllNUElfRk1UX1VTRywgaGFzaCwgMjAsIE5VTEwpOworICBpZiAoIWVycikKKyAgICB7CisgICAgICBlcnIgPSBnY3J5X3NleHBfYnVpbGQgKCZzX2RhdGEsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoZGF0YSAoZmxhZ3MgcmF3KSh2YWx1ZSAlbSkpIiwgdG1wbXBpKTsKKyAgICAgIGdjcnlfbXBpX3JlbGVhc2UgKHRtcG1waSk7CisgICAgfQorICBpZiAoZXJyKQorICAgIGRpZSAoImdjcnlfc2V4cF9idWlsZCBmYWlsZWQgZm9yIERTQSBkYXRhIGlucHV0OiAlc1xuIiwKKyAgICAgICAgIGdwZ19zdHJlcnJvciAoZXJyKSk7CisKKyAgc19rZXkgPSByZWFkX3NleHBfZnJvbV9maWxlIChrZXlmaWxlKTsKKworICBlcnIgPSBnY3J5X3BrX3NpZ24gKCZzX3NpZywgc19kYXRhLCBzX2tleSk7CisgIGlmIChlcnIpCisgICAgeworICAgICAgZ2NyeV9zZXhwX3JlbGVhc2UgKHJlYWRfcHJpdmF0ZV9rZXlfZmlsZSAoa2V5ZmlsZSwgMSkpOworICAgICAgZGllICgiZ2NyeV9wa19zaWduZWQgZmFpbGVkIChkYXRhbGVuPSVkLGtleWZpbGU9JXMpOiAlc1xuIiwKKyAgICAgICAgICAgKGludClkYXRhbGVuLCBrZXlmaWxlLCBncGdfc3RyZXJyb3IgKGVycikpOworICAgIH0KKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKHNfZGF0YSk7CisKKyAgLyogV2UgbmVlZCB0byByZXR1cm4gdGhlIFkgcGFyYW1ldGVyIGZpcnN0LiAgKi8KKyAgc190bXAgPSBnY3J5X3NleHBfZmluZF90b2tlbiAoc19rZXksICJwcml2YXRlLWtleSIsIDApOworICBpZiAoIXNfdG1wKQorICAgIGRpZSAoInByaXZhdGUga2V5IHBhcnQgbm90IGZvdW5kIGluIHByb3ZpZGVkIGtleVxuIik7CisKKyAgc190bXAyID0gZ2NyeV9zZXhwX2ZpbmRfdG9rZW4gKHNfdG1wLCAiZHNhIiwgMCk7CisgIGlmICghc190bXAyKQorICAgIGRpZSAoInByaXZhdGUga2V5IHBhcnQgaXMgbm90IGEgRFNBIGtleVxuIik7CisgIGdjcnlfc2V4cF9yZWxlYXNlIChzX3RtcCk7CisKKyAgc190bXAgPSBnY3J5X3NleHBfZmluZF90b2tlbiAoc190bXAyLCAieSIsIDApOworICB0bXBtcGkgPSBnY3J5X3NleHBfbnRoX21waSAoc190bXAsIDEsIEdDUllNUElfRk1UX1VTRyk7CisgIGlmICghdG1wbXBpKQorICAgIGRpZSAoIm5vIHkgcGFyYW1ldGVyIGluIERTQSBrZXlcbiIpOworICBwcmludF9tcGlfbGluZSAodG1wbXBpLCAxKTsKKyAgZ2NyeV9tcGlfcmVsZWFzZSAodG1wbXBpKTsKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKHNfdG1wKTsKKworICBnY3J5X3NleHBfcmVsZWFzZSAoc19rZXkpOworCisKKyAgLyogTm93IHJldHVybiB0aGUgYWN0dWFsIHNpZ25hdHVyZS4gICovCisgIHNfdG1wID0gZ2NyeV9zZXhwX2ZpbmRfdG9rZW4gKHNfc2lnLCAic2lnLXZhbCIsIDApOworICBpZiAoIXNfdG1wKQorICAgIGRpZSAoIm5vIHNpZy12YWwgZWxlbWVudCBpbiByZXR1cm5lZCBTLWV4cHJlc3Npb25cbiIpOworCisgIGdjcnlfc2V4cF9yZWxlYXNlIChzX3NpZyk7CisgIHNfc2lnID0gc190bXA7CisgIHNfdG1wID0gZ2NyeV9zZXhwX2ZpbmRfdG9rZW4gKHNfc2lnLCAiZHNhIiwgMCk7CisgIGlmICghc190bXApCisgICAgZGllICgibm8gZHNhIGVsZW1lbnQgaW4gcmV0dXJuZWQgUy1leHByZXNzaW9uXG4iKTsKKworICBnY3J5X3NleHBfcmVsZWFzZSAoc19zaWcpOworICBzX3NpZyA9IHNfdG1wOworCisgIHNfdG1wID0gZ2NyeV9zZXhwX2ZpbmRfdG9rZW4gKHNfc2lnLCAiciIsIDApOworICB0bXBtcGkgPSBnY3J5X3NleHBfbnRoX21waSAoc190bXAsIDEsIEdDUllNUElfRk1UX1VTRyk7CisgIGlmICghdG1wbXBpKQorICAgIGRpZSAoIm5vIHIgcGFyYW1ldGVyIGluIHJldHVybmVkIFMtZXhwcmVzc2lvblxuIik7CisgIHByaW50X21waV9saW5lICh0bXBtcGksIDEpOworICBnY3J5X21waV9yZWxlYXNlICh0bXBtcGkpOworICBnY3J5X3NleHBfcmVsZWFzZSAoc190bXApOworICAgIAorICBzX3RtcCA9IGdjcnlfc2V4cF9maW5kX3Rva2VuIChzX3NpZywgInMiLCAwKTsKKyAgdG1wbXBpID0gZ2NyeV9zZXhwX250aF9tcGkgKHNfdG1wLCAxLCBHQ1JZTVBJX0ZNVF9VU0cpOworICBpZiAoIXRtcG1waSkKKyAgICBkaWUgKCJubyBzIHBhcmFtZXRlciBpbiByZXR1cm5lZCBTLWV4cHJlc3Npb25cbiIpOworICBwcmludF9tcGlfbGluZSAodG1wbXBpLCAxKTsKKyAgZ2NyeV9tcGlfcmVsZWFzZSAodG1wbXBpKTsKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKHNfdG1wKTsKKworICBnY3J5X3NleHBfcmVsZWFzZSAoc19zaWcpOworfQorCisKKwwKKy8qIFZlcmlmeSBEQVRBIG9mIGxlbmd0aCBEQVRBTEVOIHVzaW5nIHRoZSBwdWJsaWMga2V5IHRha2VuIGZyb20gdGhlCisgICBTLWV4cHJlc3Npb24gaW4gS0VZRklMRSBhZ2FpbnN0IHRoZSBTLWV4cHJlc3Npb24gZm9ybWF0dGVkCisgICBzaWduYXR1cmUgaW4gU0lHRklMRS4gICovCitzdGF0aWMgdm9pZAorcnVuX2RzYV92ZXJpZnkgKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBkYXRhbGVuLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtleWZpbGUsIGNvbnN0IGNoYXIgKnNpZ2ZpbGUpCisKK3sKKyAgZ3BnX2Vycm9yX3QgZXJyOworICBnY3J5X3NleHBfdCBzX2RhdGEsIHNfa2V5LCBzX3NpZzsKKyAgY2hhciBoYXNoWzIwXTsKKyAgZ2NyeV9tcGlfdCB0bXBtcGk7CisKKyAgZ2NyeV9tZF9oYXNoX2J1ZmZlciAoR0NSWV9NRF9TSEExLCBoYXNoLCBkYXRhLCBkYXRhbGVuKTsKKyAgLyogTm90ZSB0aGF0IHdlIGNhbid0IHNpbXBseSB1c2UgJWIgd2l0aCBIQVNIIHRvIGJ1aWxkIHRoZQorICAgICBTLWV4cHJlc3Npb24sIGJlY2F1c2UgdGhhdCBtaWdodCB5aWVsZCBhIG5lZ2F0aXZlIHZhbHVlLiAgKi8KKyAgZXJyID0gZ2NyeV9tcGlfc2NhbiAoJnRtcG1waSwgR0NSWU1QSV9GTVRfVVNHLCBoYXNoLCAyMCwgTlVMTCk7CisgIGlmICghZXJyKQorICAgIHsKKyAgICAgIGVyciA9IGdjcnlfc2V4cF9idWlsZCAoJnNfZGF0YSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihkYXRhIChmbGFncyByYXcpKHZhbHVlICVtKSkiLCB0bXBtcGkpOworICAgICAgZ2NyeV9tcGlfcmVsZWFzZSAodG1wbXBpKTsKKyAgICB9CisgIGlmIChlcnIpCisgICAgZGllICgiZ2NyeV9zZXhwX2J1aWxkIGZhaWxlZCBmb3IgRFNBIGRhdGEgaW5wdXQ6ICVzXG4iLAorICAgICAgICAgZ3BnX3N0cmVycm9yIChlcnIpKTsKKworICBzX2tleSA9IHJlYWRfc2V4cF9mcm9tX2ZpbGUgKGtleWZpbGUpOworICBzX3NpZyA9IHJlYWRfc2V4cF9mcm9tX2ZpbGUgKHNpZ2ZpbGUpOworCisgIGVyciA9IGdjcnlfcGtfdmVyaWZ5IChzX3NpZywgc19kYXRhLCBzX2tleSk7CisgIGlmICghZXJyKQorICAgIHB1dHMgKCJHT09EIHNpZ25hdHVyZSIpOworICBlbHNlIGlmIChncGdfZXJyX2NvZGUgKGVycikgPT0gR1BHX0VSUl9CQURfU0lHTkFUVVJFKQorICAgIHB1dHMgKCJCQUQgc2lnbmF0dXJlIik7CisgIGVsc2UKKyAgICBwcmludGYgKCJFUlJPUiAoJXMpXG4iLCBncGdfc3RyZXJyb3IgKGVycikpOworCisgIGdjcnlfc2V4cF9yZWxlYXNlIChzX3NpZyk7CisgIGdjcnlfc2V4cF9yZWxlYXNlIChzX2tleSk7CisgIGdjcnlfc2V4cF9yZWxlYXNlIChzX2RhdGEpOworfQorCisKKworDAorc3RhdGljIHZvaWQKK3VzYWdlIChpbnQgc2hvd19oZWxwKQoreworICBpZiAoIXNob3dfaGVscCkKKyAgICB7CisgICAgICBmcHV0cyAoInVzYWdlOiAiIFBHTSAKKyAgICAgICAgICAgICAiIFtPUFRJT05dIFtGSUxFXSAodHJ5IC0taGVscCBmb3IgbW9yZSBpbmZvcm1hdGlvbilcbiIsIHN0ZGVycik7CisgICAgICBleGl0ICgyKTsKKyAgICB9CisgIGZwdXRzCisgICAgKCJVc2FnZTogIiBQR00gIiBbT1BUSU9OU10gTU9ERSBbRklMRV1cbiIKKyAgICAgIlJ1biBhIGNyeXB0byBvcGVyYXRpb24gdXNpbmcgaGV4IGVuY29kZWQgaW5wdXQgYW5kIG91dHB1dC5cbiIKKyAgICAgIk1PREU6XG4iCisgICAgICIgIGVuY3J5cHQsIGRlY3J5cHQsIGRpZ2VzdCwgcmFuZG9tLCBobWFjLXNoYSxcbiIKKyAgICAgIiAgcnNhLXtkZXJpdmUsZ2VuLHNpZ24sdmVyaWZ5fSwgZHNhLXtwcWctZ2VuLGdlbixzaWduLHZlcmlmeX1cbiIKKyAgICAgIk9QVElPTlM6XG4iCisgICAgICIgIC0tdmVyYm9zZSAgICAgICAgUHJpbnQgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuIgorICAgICAiICAtLWJpbmFyeSAgICAgICAgIElucHV0IGFuZCBvdXRwdXQgaXMgaW4gYmluYXJ5IGZvcm1cbiIKKyAgICAgIiAgLS1uby1maXBzICAgICAgICBEbyBub3QgZm9yY2UgRklQUyBtb2RlXG4iCisgICAgICIgIC0ta2V5IEtFWSAgICAgICAgVXNlIHRoZSBoZXggZW5jb2RlZCBLRVlcbiIKKyAgICAgIiAgLS1pdiBJViAgICAgICAgICBVc2UgdGhlIGhleCBlbmNvZGVkIElWXG4iCisgICAgICIgIC0tZHQgRFQgICAgICAgICAgVXNlIHRoZSBoZXggZW5jb2RlZCBEVCBmb3IgdGhlIFJOR1xuIgorICAgICAiICAtLWFsZ28gTkFNRSAgICAgIFVzZSBhbGdvcml0aG0gTkFNRVxuIgorICAgICAiICAtLWtleXNpemUgTiAgICAgIFVzZSBhIGtleXNpemUgb2YgTiBiaXRzXG4iCisgICAgICIgIC0tc2lnbmF0dXJlIE5BTUUgVGFrZSBzaWduYXR1cmUgZnJvbSBmaWxlIE5BTUVcbiIKKyAgICAgIiAgLS1jaHVuayBOICAgICAgICBSZWFkIGluIGNodW5rcyBvZiBOIGJ5dGVzIChpbXBsaWVzIC0tYmluYXJ5KVxuIgorICAgICAiICAtLXBrY3MxICAgICAgICAgIFVzZSBQS0NTIzEgZW5jb2RpbmdcbiIKKyAgICAgIiAgLS1tY3Qtc2VydmVyICAgICBSdW4gYSBtb250ZSBjYXJsbyB0ZXN0IHNlcnZlclxuIgorICAgICAiICAtLWxvb3AgICAgICAgICAgIEVuYWJsZSByYW5kb20gbG9vcCBtb2RlXG4iCisgICAgICIgIC0tcHJvZ3Jlc3MgICAgICAgUHJpbnQgcG9ncmVzcyBpbmRpY2F0b3JzXG4iCisgICAgICIgIC0taGVscCAgICAgICAgICAgUHJpbnQgdGhpcyB0ZXh0XG4iCisgICAgICJXaXRoIG5vIEZJTEUsIG9yIHdoZW4gRklMRSBpcyAtLCByZWFkIHN0YW5kYXJkIGlucHV0LlxuIgorICAgICAiUmVwb3J0IGJ1Z3MgdG8gIiBQQUNLQUdFX0JVR1JFUE9SVCAiLlxuIiAsIHN0ZG91dCk7CisgIGV4aXQgKDApOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgaW50IGxhc3RfYXJnYyA9IC0xOworICBncGdfZXJyb3JfdCBlcnI7CisgIGludCBub19maXBzID0gMDsKKyAgaW50IHByb2dyZXNzID0gMDsKKyAgaW50IHVzZV9wa2NzMSA9IDA7CisgIGNvbnN0IGNoYXIgKm1vZGVfc3RyaW5nOworICBjb25zdCBjaGFyICprZXlfc3RyaW5nID0gTlVMTDsKKyAgY29uc3QgY2hhciAqaXZfc3RyaW5nID0gTlVMTDsKKyAgY29uc3QgY2hhciAqZHRfc3RyaW5nID0gTlVMTDsKKyAgY29uc3QgY2hhciAqYWxnb19zdHJpbmcgPSBOVUxMOworICBjb25zdCBjaGFyICprZXlzaXplX3N0cmluZyA9IE5VTEw7CisgIGNvbnN0IGNoYXIgKnNpZ25hdHVyZV9zdHJpbmcgPSBOVUxMOworICBGSUxFICppbnB1dDsKKyAgdm9pZCAqZGF0YTsKKyAgc2l6ZV90IGRhdGFsZW47CisgIHNpemVfdCBjaHVua3NpemUgPSAwOworICBpbnQgbWN0X3NlcnZlciA9IDA7CisKKworICBpZiAoYXJnYykKKyAgICB7IGFyZ2MtLTsgYXJndisrOyB9CisKKyAgd2hpbGUgKGFyZ2MgJiYgbGFzdF9hcmdjICE9IGFyZ2MgKQorICAgIHsKKyAgICAgIGxhc3RfYXJnYyA9IGFyZ2M7CisgICAgICBpZiAoIXN0cmNtcCAoKmFyZ3YsICItLSIpKQorICAgICAgICB7CisgICAgICAgICAgYXJnYy0tOyBhcmd2Kys7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKCphcmd2LCAiLS1oZWxwIikpCisgICAgICAgIHsKKyAgICAgICAgICB1c2FnZSAoMSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKCphcmd2LCAiLS12ZXJzaW9uIikpCisgICAgICAgIHsKKyAgICAgICAgICBmcHV0cyAoUEdNICIgKExpYmdjcnlwdCkgIiBQQUNLQUdFX1ZFUlNJT04gIlxuIiwgc3Rkb3V0KTsKKyAgICAgICAgICBleGl0ICgwKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3YsICItLXZlcmJvc2UiKSkKKyAgICAgICAgeworICAgICAgICAgIHZlcmJvc2UrKzsKKyAgICAgICAgICBhcmdjLS07IGFyZ3YrKzsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3YsICItLWJpbmFyeSIpKQorICAgICAgICB7CisgICAgICAgICAgYmluYXJ5X2lucHV0ID0gYmluYXJ5X291dHB1dCA9IDE7CisgICAgICAgICAgYXJnYy0tOyBhcmd2Kys7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKCphcmd2LCAiLS1uby1maXBzIikpCisgICAgICAgIHsKKyAgICAgICAgICBub19maXBzKys7CisgICAgICAgICAgYXJnYy0tOyBhcmd2Kys7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKCphcmd2LCAiLS1sb29wIikpCisgICAgICAgIHsKKyAgICAgICAgICBsb29wX21vZGUgPSAxOworICAgICAgICAgIGFyZ2MtLTsgYXJndisrOworICAgICAgICB9CisgICAgICBlbHNlIGlmICghc3RyY21wICgqYXJndiwgIi0tcHJvZ3Jlc3MiKSkKKyAgICAgICAgeworICAgICAgICAgIHByb2dyZXNzID0gMTsKKyAgICAgICAgICBhcmdjLS07IGFyZ3YrKzsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3YsICItLWtleSIpKQorICAgICAgICB7CisgICAgICAgICAgYXJnYy0tOyBhcmd2Kys7CisgICAgICAgICAgaWYgKCFhcmdjKQorICAgICAgICAgICAgdXNhZ2UgKDApOworICAgICAgICAgIGtleV9zdHJpbmcgPSAqYXJndjsKKyAgICAgICAgICBhcmdjLS07IGFyZ3YrKzsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3YsICItLWl2IikpCisgICAgICAgIHsKKyAgICAgICAgICBhcmdjLS07IGFyZ3YrKzsKKyAgICAgICAgICBpZiAoIWFyZ2MpCisgICAgICAgICAgICB1c2FnZSAoMCk7CisgICAgICAgICAgaXZfc3RyaW5nID0gKmFyZ3Y7CisgICAgICAgICAgYXJnYy0tOyBhcmd2Kys7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKCphcmd2LCAiLS1kdCIpKQorICAgICAgICB7CisgICAgICAgICAgYXJnYy0tOyBhcmd2Kys7CisgICAgICAgICAgaWYgKCFhcmdjKQorICAgICAgICAgICAgdXNhZ2UgKDApOworICAgICAgICAgIGR0X3N0cmluZyA9ICphcmd2OworICAgICAgICAgIGFyZ2MtLTsgYXJndisrOworICAgICAgICB9CisgICAgICBlbHNlIGlmICghc3RyY21wICgqYXJndiwgIi0tYWxnbyIpKQorICAgICAgICB7CisgICAgICAgICAgYXJnYy0tOyBhcmd2Kys7CisgICAgICAgICAgaWYgKCFhcmdjKQorICAgICAgICAgICAgdXNhZ2UgKDApOworICAgICAgICAgIGFsZ29fc3RyaW5nID0gKmFyZ3Y7CisgICAgICAgICAgYXJnYy0tOyBhcmd2Kys7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKCphcmd2LCAiLS1rZXlzaXplIikpCisgICAgICAgIHsKKyAgICAgICAgICBhcmdjLS07IGFyZ3YrKzsKKyAgICAgICAgICBpZiAoIWFyZ2MpCisgICAgICAgICAgICB1c2FnZSAoMCk7CisgICAgICAgICAga2V5c2l6ZV9zdHJpbmcgPSAqYXJndjsKKyAgICAgICAgICBhcmdjLS07IGFyZ3YrKzsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3YsICItLXNpZ25hdHVyZSIpKQorICAgICAgICB7CisgICAgICAgICAgYXJnYy0tOyBhcmd2Kys7CisgICAgICAgICAgaWYgKCFhcmdjKQorICAgICAgICAgICAgdXNhZ2UgKDApOworICAgICAgICAgIHNpZ25hdHVyZV9zdHJpbmcgPSAqYXJndjsKKyAgICAgICAgICBhcmdjLS07IGFyZ3YrKzsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3YsICItLWNodW5rIikpCisgICAgICAgIHsKKyAgICAgICAgICBhcmdjLS07IGFyZ3YrKzsKKyAgICAgICAgICBpZiAoIWFyZ2MpCisgICAgICAgICAgICB1c2FnZSAoMCk7CisgICAgICAgICAgY2h1bmtzaXplID0gYXRvaSAoKmFyZ3YpOworICAgICAgICAgIGJpbmFyeV9pbnB1dCA9IGJpbmFyeV9vdXRwdXQgPSAxOworICAgICAgICAgIGFyZ2MtLTsgYXJndisrOworICAgICAgICB9CisgICAgICBlbHNlIGlmICghc3RyY21wICgqYXJndiwgIi0tcGtjczEiKSkKKyAgICAgICAgeworICAgICAgICAgIHVzZV9wa2NzMSA9IDE7CisgICAgICAgICAgYXJnYy0tOyBhcmd2Kys7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKCphcmd2LCAiLS1tY3Qtc2VydmVyIikpCisgICAgICAgIHsKKyAgICAgICAgICBtY3Rfc2VydmVyID0gMTsKKyAgICAgICAgICBhcmdjLS07IGFyZ3YrKzsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3YsICItLXN0YW5kYWxvbmUiKSkKKyAgICAgICAgeworICAgICAgICAgIHN0YW5kYWxvbmVfbW9kZSA9IDE7CisgICAgICAgICAgYXJnYy0tOyBhcmd2Kys7CisgICAgICAgIH0KKyAgICB9ICAgICAgICAgIAorCisgIGlmICghYXJnYyB8fCBhcmdjID4gMikKKyAgICB1c2FnZSAoMCk7CisgIG1vZGVfc3RyaW5nID0gKmFyZ3Y7CisKKyAgaWYgKCFzdHJjbXAgKG1vZGVfc3RyaW5nLCAicnNhLWRlcml2ZSIpKQorICAgIGJpbmFyeV9pbnB1dCA9IDE7CisKKyAgaWYgKGFyZ2MgPT0gMiAmJiBzdHJjbXAgKGFyZ3ZbMV0sICItIikpCisgICAgeworICAgICAgaW5wdXQgPSBmb3BlbiAoYXJndlsxXSwgYmluYXJ5X2lucHV0PyAicmIiOiJyIik7CisgICAgICBpZiAoIWlucHV0KQorICAgICAgICBkaWUgKCJjYW4ndCBvcGVuIGAlcyc6ICVzXG4iLCBhcmd2WzFdLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgICB9CisgIGVsc2UKKyAgICBpbnB1dCA9IHN0ZGluOworCisjaWZuZGVmIEhBVkVfVzMyX1NZU1RFTQorICBpZiAobG9vcF9tb2RlKQorICAgIHNpZ25hbCAoU0lHUElQRSwgU0lHX0lHTik7CisjZW5kaWYKKworICBpZiAodmVyYm9zZSkKKyAgICBmcHJpbnRmIChzdGRlcnIsIFBHTSAiOiBzdGFydGVkIChtb2RlPSVzKVxuIiwgbW9kZV9zdHJpbmcpOworCisgIGdjcnlfY29udHJvbCAoR0NSWUNUTF9TRVRfVkVSQk9TSVRZLCAoaW50KXZlcmJvc2UpOworICBpZiAoIW5vX2ZpcHMpCisgICAgZ2NyeV9jb250cm9sIChHQ1JZQ1RMX0ZPUkNFX0ZJUFNfTU9ERSwgMCk7CisgIGlmICghZ2NyeV9jaGVja192ZXJzaW9uICgiMS40LjMiKSkKKyAgICBkaWUgKCJMaWJnY3J5cHQgaXMgbm90IHN1ZmZpY2llbnQgZW5vdWdoXG4iKTsKKyAgaWYgKHZlcmJvc2UpCisgICAgZnByaW50ZiAoc3RkZXJyLCBQR00gIjogdXNpbmcgTGliZ2NyeXB0ICVzXG4iLCBnY3J5X2NoZWNrX3ZlcnNpb24gKE5VTEwpKTsKKyAgaWYgKG5vX2ZpcHMpCisgICAgZ2NyeV9jb250cm9sIChHQ1JZQ1RMX0RJU0FCTEVfU0VDTUVNLCAwKTsKKyAgZ2NyeV9jb250cm9sIChHQ1JZQ1RMX0lOSVRJQUxJWkFUSU9OX0ZJTklTSEVELCAwKTsKKworICAvKiBNb3N0IG9wZXJhdGlvbnMgbmVlZCBzb21lIGlucHV0IGRhdGEuICAqLworICBpZiAoIWNodW5rc2l6ZQorICAgICAgJiYgIW1jdF9zZXJ2ZXIKKyAgICAgICYmIHN0cmNtcCAobW9kZV9zdHJpbmcsICJyYW5kb20iKQorICAgICAgJiYgc3RyY21wIChtb2RlX3N0cmluZywgInJzYS1nZW4iKQorICAgICAgJiYgc3RyY21wIChtb2RlX3N0cmluZywgImRzYS1nZW4iKSApCisgICAgeworICAgICAgZGF0YSA9IHJlYWRfZmlsZSAoaW5wdXQsICFiaW5hcnlfaW5wdXQsICZkYXRhbGVuKTsKKyAgICAgIGlmICghZGF0YSkKKyAgICAgICAgZGllICgiZXJyb3IgcmVhZGluZyVzIGlucHV0XG4iLCBiaW5hcnlfaW5wdXQ/IiI6IiBhbmQgZGVjb2RpbmciKTsKKyAgICAgIGlmICh2ZXJib3NlKQorICAgICAgICBmcHJpbnRmIChzdGRlcnIsIFBHTSAiOiAldSBieXRlcyBvZiBpbnB1dCBkYXRhXG4iLCAKKyAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludClkYXRhbGVuKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBkYXRhID0gTlVMTDsKKyAgICAgIGRhdGFsZW4gPSAwOworICAgIH0KKworCisgIGlmICghc3RyY21wIChtb2RlX3N0cmluZywgImVuY3J5cHQiKSB8fCAhc3RyY21wIChtb2RlX3N0cmluZywgImRlY3J5cHQiKSkKKyAgICB7CisgICAgICBpbnQgY2lwaGVyX2FsZ28sIGNpcGhlcl9tb2RlOworICAgICAgdm9pZCAgKml2X2J1ZmZlciA9IE5VTEw7CisgICAgICB2b2lkICprZXlfYnVmZmVyID0gTlVMTDsKKyAgICAgIHNpemVfdCBpdl9idWZsZW4sICBrZXlfYnVmbGVuOworCisgICAgICBpZiAoIWFsZ29fc3RyaW5nKQorICAgICAgICBkaWUgKCJvcHRpb24gLS1hbGdvIGlzIHJlcXVpcmVkIGluIHRoaXMgbW9kZVxuIik7CisgICAgICBjaXBoZXJfYWxnbyA9IG1hcF9vcGVuc3NsX2NpcGhlcl9uYW1lIChhbGdvX3N0cmluZywgJmNpcGhlcl9tb2RlKTsKKyAgICAgIGlmICghY2lwaGVyX2FsZ28pCisgICAgICAgIGRpZSAoImNpcGhlciBhbGdvcml0aG0gYCVzJyBpcyBub3Qgc3VwcG9ydGVkXG4iLCBhbGdvX3N0cmluZyk7CisgICAgICBpZiAobWN0X3NlcnZlcikKKyAgICAgICAgeworICAgICAgICAgIGludCBpdGVyYXRpb25zOworCisgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZ2NyeV9mcmVlIChrZXlfYnVmZmVyKTsga2V5X2J1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICAgIGdjcnlfZnJlZSAoaXZfYnVmZmVyKTsgaXZfYnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgICAgZ2NyeV9mcmVlIChkYXRhKTsgZGF0YSA9IE5VTEw7CisgICAgICAgICAgICAgIGlmICghKGtleV9idWZmZXIgPSByZWFkX3RleHRsaW5lIChpbnB1dCkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmIChmZW9mIChpbnB1dCkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgZGllICgibm8gdmVyc2lvbiBpbmZvIGluIGlucHV0XG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmIChhdG9pIChrZXlfYnVmZmVyKSAhPSAxKQorICAgICAgICAgICAgICAgIGRpZSAoInVuc3VwcG9ydGVkIGlucHV0IHZlcnNpb24gJXNcbiIsIGtleV9idWZmZXIpOworICAgICAgICAgICAgICBnY3J5X2ZyZWUgKGtleV9idWZmZXIpOworICAgICAgICAgICAgICBpZiAoIShrZXlfYnVmZmVyID0gcmVhZF90ZXh0bGluZSAoaW5wdXQpKSkKKyAgICAgICAgICAgICAgICBkaWUgKCJubyBpdGVyYXRpb24gY291bnQgaW4gaW5wdXRcbiIpOworICAgICAgICAgICAgICBpdGVyYXRpb25zID0gYXRvaSAoa2V5X2J1ZmZlcik7CisgICAgICAgICAgICAgIGdjcnlfZnJlZSAoa2V5X2J1ZmZlcik7CisgICAgICAgICAgICAgIGlmICghKGtleV9idWZmZXIgPSByZWFkX2hleGxpbmUgKGlucHV0LCAma2V5X2J1ZmxlbikpKQorICAgICAgICAgICAgICAgIGRpZSAoIm5vIGtleSBpbiBpbnB1dFxuIik7CisgICAgICAgICAgICAgIGlmICghKGl2X2J1ZmZlciA9IHJlYWRfaGV4bGluZSAoaW5wdXQsICZpdl9idWZsZW4pKSkKKyAgICAgICAgICAgICAgICBkaWUgKCJubyBJViBpbiBpbnB1dFxuIik7CisgICAgICAgICAgICAgIGlmICghKGRhdGEgPSByZWFkX2hleGxpbmUgKGlucHV0LCAmZGF0YWxlbikpKQorICAgICAgICAgICAgICAgIGRpZSAoIm5vIGRhdGEgaW4gaW5wdXRcbiIpOworICAgICAgICAgICAgICBza2lwX3RvX2VtcHR5X2xpbmUgKGlucHV0KTsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIHJ1bl9jaXBoZXJfbWN0X2xvb3AgKCgqbW9kZV9zdHJpbmcgPT0gJ2UnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lwaGVyX2FsZ28sIGNpcGhlcl9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdl9idWZmZXIsIGl2X2J1ZmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X2J1ZmZlciwga2V5X2J1ZmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgZGF0YWxlbiwgaXRlcmF0aW9ucyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmIChjaXBoZXJfbW9kZSAhPSBHQ1JZX0NJUEhFUl9NT0RFX0VDQikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKCFpdl9zdHJpbmcpCisgICAgICAgICAgICAgICAgZGllICgib3B0aW9uIC0taXYgaXMgcmVxdWlyZWQgaW4gdGhpcyBtb2RlXG4iKTsKKyAgICAgICAgICAgICAgaXZfYnVmZmVyID0gaGV4MmJ1ZmZlciAoaXZfc3RyaW5nLCAmaXZfYnVmbGVuKTsKKyAgICAgICAgICAgICAgaWYgKCFpdl9idWZmZXIpCisgICAgICAgICAgICAgICAgZGllICgiaW52YWxpZCB2YWx1ZSBmb3IgSVZcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaXZfYnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgICAgaXZfYnVmbGVuID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoIWtleV9zdHJpbmcpCisgICAgICAgICAgICBkaWUgKCJvcHRpb24gLS1rZXkgaXMgcmVxdWlyZWQgaW4gdGhpcyBtb2RlXG4iKTsKKyAgICAgICAgICBrZXlfYnVmZmVyID0gaGV4MmJ1ZmZlciAoa2V5X3N0cmluZywgJmtleV9idWZsZW4pOworICAgICAgICAgIGlmICgha2V5X2J1ZmZlcikKKyAgICAgICAgICAgIGRpZSAoImludmFsaWQgdmFsdWUgZm9yIEtFWVxuIik7CisKKyAgICAgICAgICBydW5fZW5jcnlwdF9kZWNyeXB0ICgoKm1vZGVfc3RyaW5nID09ICdlJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lwaGVyX2FsZ28sIGNpcGhlcl9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl2X2J1ZmZlciwgaXZfYnVmbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9idWZmZXIsIGtleV9idWZsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgZGF0YT8gZGF0YWxlbjpjaHVua3NpemUsIGlucHV0KTsKKyAgICAgICAgfQorICAgICAgZ2NyeV9mcmVlIChrZXlfYnVmZmVyKTsKKyAgICAgIGdjcnlfZnJlZSAoaXZfYnVmZmVyKTsKKyAgICB9CisgIGVsc2UgaWYgKCFzdHJjbXAgKG1vZGVfc3RyaW5nLCAiZGlnZXN0IikpCisgICAgeworICAgICAgaW50IGFsZ287CisKKyAgICAgIGlmICghYWxnb19zdHJpbmcpCisgICAgICAgIGRpZSAoIm9wdGlvbiAtLWFsZ28gaXMgcmVxdWlyZWQgaW4gdGhpcyBtb2RlXG4iKTsKKyAgICAgIGFsZ28gPSBnY3J5X21kX21hcF9uYW1lIChhbGdvX3N0cmluZyk7CisgICAgICBpZiAoIWFsZ28pCisgICAgICAgIGRpZSAoImRpZ2VzdCBhbGdvcml0aG0gYCVzJyBpcyBub3Qgc3VwcG9ydGVkXG4iLCBhbGdvX3N0cmluZyk7CisgICAgICBpZiAoIWRhdGEpCisgICAgICAgIGRpZSAoIm5vIGRhdGEgYXZhaWxhYmxlIChkbyBub3QgdXNlIC0tY2h1bmspXG4iKTsKKworICAgICAgcnVuX2RpZ2VzdCAoYWxnbywgZGF0YSwgZGF0YWxlbik7CisgICAgfQorICBlbHNlIGlmICghc3RyY21wIChtb2RlX3N0cmluZywgInJhbmRvbSIpKQorICAgIHsKKyAgICAgIHZvaWQgKmNvbnRleHQ7CisgICAgICB1bnNpZ25lZCBjaGFyIGtleVsxNl07CisgICAgICB1bnNpZ25lZCBjaGFyIHNlZWRbMTZdOworICAgICAgdW5zaWduZWQgY2hhciBkdFsxNl07CisgICAgICB1bnNpZ25lZCBjaGFyIGJ1ZmZlclsxNl07CisgICAgICBzaXplX3QgY291bnQgPSAwOworCisgICAgICBpZiAoaGV4MmJpbiAoa2V5X3N0cmluZywga2V5LCAxNikgPCAwICkKKyAgICAgICAgZGllICgidmFsdWUgZm9yIC0ta2V5IGFyZSBub3QgMzIgaGV4IGRpZ2l0c1xuIik7CisgICAgICBpZiAoaGV4MmJpbiAoaXZfc3RyaW5nLCBzZWVkLCAxNikgPCAwICkKKyAgICAgICAgZGllICgidmFsdWUgZm9yIC0taXYgYXJlIG5vdCAzMiBoZXggZGlnaXRzXG4iKTsKKyAgICAgIGlmIChoZXgyYmluIChkdF9zdHJpbmcsIGR0LCAxNikgPCAwICkKKyAgICAgICAgZGllICgidmFsdWUgZm9yIC0tZHQgYXJlIG5vdCAzMiBoZXggZGlnaXRzXG4iKTsKKworICAgICAgLyogVGhlIGZsYWcgdmFsdWUgMSBkaXNhYmxlcyB0aGUgZHVwIGNoZWNrLCBzbyB0aGF0IHRoZSBSTkcKKyAgICAgICAgIHJldHVybnMgYWxsIGdlbmVyYXRlZCBkYXRhLiAgKi8KKyAgICAgIGVyciA9IGluaXRfZXh0ZXJuYWxfcm5nX3Rlc3QgKCZjb250ZXh0LCAxLCBrZXksIDE2LCBzZWVkLCAxNiwgZHQsIDE2KTsKKyAgICAgIGlmIChlcnIpCisgICAgICAgIGRpZSAoImluaXQgZXh0ZXJuYWwgUk5HIHRlc3QgZmFpbGVkOiAlc1xuIiwgZ3BnX3N0cmVycm9yIChlcnIpKTsKKworICAgICAgZG8gCisgICAgICAgIHsKKyAgICAgICAgICBlcnIgPSBydW5fZXh0ZXJuYWxfcm5nX3Rlc3QgKGNvbnRleHQsIGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlcik7CisgICAgICAgICAgaWYgKGVycikKKyAgICAgICAgICAgIGRpZSAoInJ1bm5pbmcgZXh0ZXJuYWwgUk5HIHRlc3QgZmFpbGVkOiAlc1xuIiwgZ3BnX3N0cmVycm9yIChlcnIpKTsKKyAgICAgICAgICBwcmludF9idWZmZXIgKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlcik7CisgICAgICAgICAgaWYgKHByb2dyZXNzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoISgrK2NvdW50ICUgMTAwMCkpCisgICAgICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCBQR00gIjogJWx1IHJhbmRvbSBieXRlcyBzbyBmYXJcbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGludCljb3VudCAqIHNpemVvZiBidWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB3aGlsZSAobG9vcF9tb2RlKTsKKyAgICAgIAorICAgICAgaWYgKHByb2dyZXNzKQorICAgICAgICBmcHJpbnRmIChzdGRlcnIsIFBHTSAiOiAlbHUgcmFuZG9tIGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGludCljb3VudCAqIHNpemVvZiBidWZmZXIpOworCisgICAgICBkZWluaXRfZXh0ZXJuYWxfcm5nX3Rlc3QgKGNvbnRleHQpOworICAgIH0KKyAgZWxzZSBpZiAoIXN0cmNtcCAobW9kZV9zdHJpbmcsICJobWFjLXNoYSIpKQorICAgIHsKKyAgICAgIGludCBhbGdvOworICAgICAgdm9pZCAgKmtleV9idWZmZXI7CisgICAgICBzaXplX3Qga2V5X2J1ZmxlbjsKKworICAgICAgaWYgKCFkYXRhKQorICAgICAgICBkaWUgKCJubyBkYXRhIGF2YWlsYWJsZSAoZG8gbm90IHVzZSAtLWNodW5rKVxuIik7CisgICAgICBpZiAoIWFsZ29fc3RyaW5nKQorICAgICAgICBkaWUgKCJvcHRpb24gLS1hbGdvIGlzIHJlcXVpcmVkIGluIHRoaXMgbW9kZVxuIik7CisgICAgICBzd2l0Y2ggKGF0b2kgKGFsZ29fc3RyaW5nKSkKKyAgICAgICAgeworICAgICAgICBjYXNlIDE6ICAgYWxnbyA9IEdDUllfTURfU0hBMTsgYnJlYWs7CisgICAgICAgIGNhc2UgMjI0OiBhbGdvID0gR0NSWV9NRF9TSEEyMjQ7IGJyZWFrOworICAgICAgICBjYXNlIDI1NjogYWxnbyA9IEdDUllfTURfU0hBMjU2OyBicmVhazsKKyAgICAgICAgY2FzZSAzODQ6IGFsZ28gPSBHQ1JZX01EX1NIQTM4NDsgYnJlYWs7CisgICAgICAgIGNhc2UgNTEyOiBhbGdvID0gR0NSWV9NRF9TSEE1MTI7IGJyZWFrOworICAgICAgICBkZWZhdWx0OiAgYWxnbyA9IDA7IGJyZWFrOworICAgICAgICB9CisgICAgICBpZiAoIWFsZ28pCisgICAgICAgIGRpZSAoIm5vIGRpZ2VzdCBhbGdvcml0aG0gZm91bmQgZm9yIGhtYWMgdHlwZSBgJXMnXG4iLCBhbGdvX3N0cmluZyk7CisgICAgICBpZiAoIWtleV9zdHJpbmcpCisgICAgICAgIGRpZSAoIm9wdGlvbiAtLWtleSBpcyByZXF1aXJlZCBpbiB0aGlzIG1vZGVcbiIpOworICAgICAga2V5X2J1ZmZlciA9IGhleDJidWZmZXIgKGtleV9zdHJpbmcsICZrZXlfYnVmbGVuKTsKKyAgICAgIGlmICgha2V5X2J1ZmZlcikKKyAgICAgICAgZGllICgiaW52YWxpZCB2YWx1ZSBmb3IgS0VZXG4iKTsKKworICAgICAgcnVuX2htYWMgKGFsZ28sIGtleV9idWZmZXIsIGtleV9idWZsZW4sIGRhdGEsIGRhdGFsZW4pOworCisgICAgICBnY3J5X2ZyZWUgKGtleV9idWZmZXIpOworICAgIH0KKyAgZWxzZSBpZiAoIXN0cmNtcCAobW9kZV9zdHJpbmcsICJyc2EtZGVyaXZlIikpCisgICAgeworICAgICAgaWYgKCFkYXRhKQorICAgICAgICBkaWUgKCJubyBkYXRhIGF2YWlsYWJsZSAoZG8gbm90IHVzZSAtLWNodW5rKVxuIik7CisgICAgICBydW5fcnNhX2Rlcml2ZSAoZGF0YSwgZGF0YWxlbik7CisgICAgfQorICBlbHNlIGlmICghc3RyY21wIChtb2RlX3N0cmluZywgInJzYS1nZW4iKSkKKyAgICB7CisgICAgICBpbnQga2V5c2l6ZTsKKyAgICAgIAorICAgICAgaWYgKCFiaW5hcnlfb3V0cHV0KQorICAgICAgICBiYXNlNjRfb3V0cHV0ID0gMTsKKworICAgICAga2V5c2l6ZSA9IGtleXNpemVfc3RyaW5nPyBhdG9pIChrZXlzaXplX3N0cmluZykgOiAwOworICAgICAgaWYgKGtleXNpemUgPCAxMjggfHwga2V5c2l6ZSA+IDE2Mzg0KQorICAgICAgICBkaWUgKCJpbnZhbGlkIGtleXNpemUgc3BlY2lmaWVkOyBuZWVkcyB0byBiZSAxMjggLi4gMTYzODRcbiIpOworICAgICAgcnVuX3JzYV9nZW4gKGtleXNpemUsIDY1NTM3KTsKKyAgICB9CisgIGVsc2UgaWYgKCFzdHJjbXAgKG1vZGVfc3RyaW5nLCAicnNhLXNpZ24iKSkKKyAgICB7CisgICAgICBpbnQgYWxnbzsKKworICAgICAgaWYgKCFrZXlfc3RyaW5nKQorICAgICAgICBkaWUgKCJvcHRpb24gLS1rZXkgaXMgcmVxdWlyZWQgaW4gdGhpcyBtb2RlXG4iKTsKKyAgICAgIGlmIChhY2Nlc3MgKGtleV9zdHJpbmcsIFJfT0spKQorICAgICAgICBkaWUgKCJvcHRpb24gLS1rZXkgbmVlZHMgdG8gc3BlY2lmeSBhbiBleGlzdGluZyBrZXlmaWxlXG4iKTsKKyAgICAgIGlmICghYWxnb19zdHJpbmcpCisgICAgICAgIGRpZSAoIm9wdGlvbiAtLWFsZ28gaXMgcmVxdWlyZWQgaW4gdGhpcyBtb2RlXG4iKTsKKyAgICAgIGFsZ28gPSBnY3J5X21kX21hcF9uYW1lIChhbGdvX3N0cmluZyk7CisgICAgICBpZiAoIWFsZ28pCisgICAgICAgIGRpZSAoImRpZ2VzdCBhbGdvcml0aG0gYCVzJyBpcyBub3Qgc3VwcG9ydGVkXG4iLCBhbGdvX3N0cmluZyk7CisgICAgICBpZiAoIWRhdGEpCisgICAgICAgIGRpZSAoIm5vIGRhdGEgYXZhaWxhYmxlIChkbyBub3QgdXNlIC0tY2h1bmspXG4iKTsKKworICAgICAgcnVuX3JzYV9zaWduIChkYXRhLCBkYXRhbGVuLCBhbGdvLCB1c2VfcGtjczEsIGtleV9zdHJpbmcpOworCisgICAgfQorICBlbHNlIGlmICghc3RyY21wIChtb2RlX3N0cmluZywgInJzYS12ZXJpZnkiKSkKKyAgICB7CisgICAgICBpbnQgYWxnbzsKKworICAgICAgaWYgKCFrZXlfc3RyaW5nKQorICAgICAgICBkaWUgKCJvcHRpb24gLS1rZXkgaXMgcmVxdWlyZWQgaW4gdGhpcyBtb2RlXG4iKTsKKyAgICAgIGlmIChhY2Nlc3MgKGtleV9zdHJpbmcsIFJfT0spKQorICAgICAgICBkaWUgKCJvcHRpb24gLS1rZXkgbmVlZHMgdG8gc3BlY2lmeSBhbiBleGlzdGluZyBrZXlmaWxlXG4iKTsKKyAgICAgIGlmICghYWxnb19zdHJpbmcpCisgICAgICAgIGRpZSAoIm9wdGlvbiAtLWFsZ28gaXMgcmVxdWlyZWQgaW4gdGhpcyBtb2RlXG4iKTsKKyAgICAgIGFsZ28gPSBnY3J5X21kX21hcF9uYW1lIChhbGdvX3N0cmluZyk7CisgICAgICBpZiAoIWFsZ28pCisgICAgICAgIGRpZSAoImRpZ2VzdCBhbGdvcml0aG0gYCVzJyBpcyBub3Qgc3VwcG9ydGVkXG4iLCBhbGdvX3N0cmluZyk7CisgICAgICBpZiAoIWRhdGEpCisgICAgICAgIGRpZSAoIm5vIGRhdGEgYXZhaWxhYmxlIChkbyBub3QgdXNlIC0tY2h1bmspXG4iKTsKKyAgICAgIGlmICghc2lnbmF0dXJlX3N0cmluZykKKyAgICAgICAgZGllICgib3B0aW9uIC0tc2lnbmF0dXJlIGlzIHJlcXVpcmVkIGluIHRoaXMgbW9kZVxuIik7CisgICAgICBpZiAoYWNjZXNzIChzaWduYXR1cmVfc3RyaW5nLCBSX09LKSkKKyAgICAgICAgZGllICgib3B0aW9uIC0tc2lnbmF0dXJlIG5lZWRzIHRvIHNwZWNpZnkgYW4gZXhpc3RpbmcgZmlsZVxuIik7CisKKyAgICAgIHJ1bl9yc2FfdmVyaWZ5IChkYXRhLCBkYXRhbGVuLCBhbGdvLCB1c2VfcGtjczEsIGtleV9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlX3N0cmluZyk7CisKKyAgICB9CisgIGVsc2UgaWYgKCFzdHJjbXAgKG1vZGVfc3RyaW5nLCAiZHNhLXBxZy1nZW4iKSkKKyAgICB7CisgICAgICBpbnQga2V5c2l6ZTsKKyAgICAgIAorICAgICAga2V5c2l6ZSA9IGtleXNpemVfc3RyaW5nPyBhdG9pIChrZXlzaXplX3N0cmluZykgOiAwOworICAgICAgaWYgKGtleXNpemUgPCAxMDI0IHx8IGtleXNpemUgPiAzMDcyKQorICAgICAgICBkaWUgKCJpbnZhbGlkIGtleXNpemUgc3BlY2lmaWVkOyBuZWVkcyB0byBiZSAxMDI0IC4uIDMwNzJcbiIpOworICAgICAgcnVuX2RzYV9wcWdfZ2VuIChrZXlzaXplLCBkYXRhbGVuPyBkYXRhOk5VTEwsIGRhdGFsZW4pOworICAgIH0KKyAgZWxzZSBpZiAoIXN0cmNtcCAobW9kZV9zdHJpbmcsICJkc2EtZ2VuIikpCisgICAgeworICAgICAgaW50IGtleXNpemU7CisgICAgICAKKyAgICAgIGtleXNpemUgPSBrZXlzaXplX3N0cmluZz8gYXRvaSAoa2V5c2l6ZV9zdHJpbmcpIDogMDsKKyAgICAgIGlmIChrZXlzaXplIDwgMTAyNCB8fCBrZXlzaXplID4gMzA3MikKKyAgICAgICAgZGllICgiaW52YWxpZCBrZXlzaXplIHNwZWNpZmllZDsgbmVlZHMgdG8gYmUgMTAyNCAuLiAzMDcyXG4iKTsKKyAgICAgIGlmICgha2V5X3N0cmluZykKKyAgICAgICAgZGllICgib3B0aW9uIC0ta2V5IGlzIHJlcXVpcmVkIGluIHRoaXMgbW9kZVxuIik7CisgICAgICBydW5fZHNhX2dlbiAoa2V5c2l6ZSwga2V5X3N0cmluZyk7CisgICAgfQorICBlbHNlIGlmICghc3RyY21wIChtb2RlX3N0cmluZywgImRzYS1zaWduIikpCisgICAgeworICAgICAgaWYgKCFrZXlfc3RyaW5nKQorICAgICAgICBkaWUgKCJvcHRpb24gLS1rZXkgaXMgcmVxdWlyZWQgaW4gdGhpcyBtb2RlXG4iKTsKKyAgICAgIGlmIChhY2Nlc3MgKGtleV9zdHJpbmcsIFJfT0spKQorICAgICAgICBkaWUgKCJvcHRpb24gLS1rZXkgbmVlZHMgdG8gc3BlY2lmeSBhbiBleGlzdGluZyBrZXlmaWxlXG4iKTsKKyAgICAgIGlmICghZGF0YSkKKyAgICAgICAgZGllICgibm8gZGF0YSBhdmFpbGFibGUgKGRvIG5vdCB1c2UgLS1jaHVuaylcbiIpOworCisgICAgICBydW5fZHNhX3NpZ24gKGRhdGEsIGRhdGFsZW4sIGtleV9zdHJpbmcpOworICAgIH0KKyAgZWxzZSBpZiAoIXN0cmNtcCAobW9kZV9zdHJpbmcsICJkc2EtdmVyaWZ5IikpCisgICAgeworICAgICAgaWYgKCFrZXlfc3RyaW5nKQorICAgICAgICBkaWUgKCJvcHRpb24gLS1rZXkgaXMgcmVxdWlyZWQgaW4gdGhpcyBtb2RlXG4iKTsKKyAgICAgIGlmIChhY2Nlc3MgKGtleV9zdHJpbmcsIFJfT0spKQorICAgICAgICBkaWUgKCJvcHRpb24gLS1rZXkgbmVlZHMgdG8gc3BlY2lmeSBhbiBleGlzdGluZyBrZXlmaWxlXG4iKTsKKyAgICAgIGlmICghZGF0YSkKKyAgICAgICAgZGllICgibm8gZGF0YSBhdmFpbGFibGUgKGRvIG5vdCB1c2UgLS1jaHVuaylcbiIpOworICAgICAgaWYgKCFzaWduYXR1cmVfc3RyaW5nKQorICAgICAgICBkaWUgKCJvcHRpb24gLS1zaWduYXR1cmUgaXMgcmVxdWlyZWQgaW4gdGhpcyBtb2RlXG4iKTsKKyAgICAgIGlmIChhY2Nlc3MgKHNpZ25hdHVyZV9zdHJpbmcsIFJfT0spKQorICAgICAgICBkaWUgKCJvcHRpb24gLS1zaWduYXR1cmUgbmVlZHMgdG8gc3BlY2lmeSBhbiBleGlzdGluZyBmaWxlXG4iKTsKKworICAgICAgcnVuX2RzYV92ZXJpZnkgKGRhdGEsIGRhdGFsZW4sIGtleV9zdHJpbmcsIHNpZ25hdHVyZV9zdHJpbmcpOworICAgIH0KKyAgZWxzZQorICAgIHVzYWdlICgwKTsKKworICBnY3J5X2ZyZWUgKGRhdGEpOworCisgIC8qIEJlY2F1c2UgTGliZ2NyeXB0IGRvZXMgbm90IGVuZm9yY2UgRklQUyBtb2RlIGluIGFsbCBjYXNlcyB3ZSBsZXQKKyAgICAgdGhlIHByb2Nlc3MgZGllIGlmIExpYmdjcnlwdCBpcyBub3QgYW55bW9yZSBpbiBGSVBTIG1vZGUgYWZ0ZXIKKyAgICAgdGhlIGFjdHVhbCBvcGVyYXRpb24uICAqLworICBpZiAoIW5vX2ZpcHMgJiYgIWdjcnlfZmlwc19tb2RlX2FjdGl2ZSAoKSkKKyAgICBkaWUgKCJGSVBTIG1vZGUgaXMgbm90IGFueW1vcmUgYWN0aXZlXG4iKTsKKworICBpZiAodmVyYm9zZSkKKyAgICBmcHV0cyAoUEdNICI6IHJlYWR5XG4iLCBzdGRlcnIpOworCisgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvdGVzdHMvaG1hYy5jIGIvbGliZ2NyeXB0LTEuNC42L3Rlc3RzL2htYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDg3ZGJiCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L3Rlc3RzL2htYWMuYwpAQCAtMCwwICsxLDE3MSBAQAorLyogaG1hYy5jIC0gIEhNQUMgcmVncmVzc2lvbiB0ZXN0cworICoJQ29weXJpZ2h0IChDKSAyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2luY2x1ZGUgIi4uL3NyYy9nY3J5cHQuaCIKKworc3RhdGljIGludCB2ZXJib3NlOworc3RhdGljIGludCBlcnJvcl9jb3VudDsKKworc3RhdGljIHZvaWQKK2ZhaWwgKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICB2YV9saXN0IGFyZ19wdHI7CisKKyAgdmFfc3RhcnQgKGFyZ19wdHIsIGZvcm1hdCk7CisgIHZmcHJpbnRmIChzdGRlcnIsIGZvcm1hdCwgYXJnX3B0cik7CisgIHZhX2VuZCAoYXJnX3B0cik7CisgIGVycm9yX2NvdW50Kys7Cit9CisKK3N0YXRpYyB2b2lkCitkaWUgKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICB2YV9saXN0IGFyZ19wdHI7CisKKyAgdmFfc3RhcnQgKGFyZ19wdHIsIGZvcm1hdCk7CisgIHZmcHJpbnRmIChzdGRlcnIsIGZvcm1hdCwgYXJnX3B0cik7CisgIHZhX2VuZCAoYXJnX3B0cik7CisgIGV4aXQgKDEpOworfQorCisKKworc3RhdGljIHZvaWQKK2NoZWNrX29uZV9tYWMgKGludCBhbGdvLAorICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqa2V5LCBzaXplX3Qga2V5bGVuLAorICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFsZW4sCisgICAgICAgICAgICAgICBjb25zdCBjaGFyICpleHBlY3QpCit7CisgIGdjcnlfbWRfaGRfdCBoZDsKKyAgdW5zaWduZWQgY2hhciAqcDsKKyAgaW50IG1kbGVuOworICBpbnQgaTsKKyAgZ2NyeV9lcnJvcl90IGVyciA9IDA7CisKKyAgZXJyID0gZ2NyeV9tZF9vcGVuICgmaGQsIGFsZ28sIEdDUllfTURfRkxBR19ITUFDKTsKKyAgaWYgKGVycikKKyAgICB7CisgICAgICBmYWlsICgiYWxnbyAlZCwgZ3JjeV9tZF9vcGVuIGZhaWxlZDogJXNcbiIsIGFsZ28sIGdwZ19zdHJlcnJvciAoZXJyKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIG1kbGVuID0gZ2NyeV9tZF9nZXRfYWxnb19kbGVuIChhbGdvKTsKKyAgaWYgKG1kbGVuIDwgMSB8fCBtZGxlbiA+IDUwMCkKKyAgICB7CisgICAgICBmYWlsICgiYWxnbyAlZCwgZ3JjeV9tZF9nZXRfYWxnb19kbGVuIGZhaWxlZDogJWRcbiIsIGFsZ28sIG1kbGVuKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgZXJyID0gZ2NyeV9tZF9zZXRrZXkgKGhkLCBrZXksIGtleWxlbik7CisgIGlmIChlcnIpCisgICAgeworICAgICAgZmFpbCAoImFsZ28gJWQsIGdyY3lfbWRfc2V0a2V5IGZhaWxlZDogJXNcbiIsIGFsZ28sIGdwZ19zdHJlcnJvciAoZXJyKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGdjcnlfbWRfd3JpdGUgKGhkLCBkYXRhLCBkYXRhbGVuKTsKKworICBwID0gZ2NyeV9tZF9yZWFkIChoZCwgMCk7CisKKyAgaWYgKG1lbWNtcCAocCwgZXhwZWN0LCBtZGxlbikpCisgICAgeworICAgICAgcHJpbnRmICgiY29tcHV0ZWQ6ICIpOworICAgICAgZm9yIChpID0gMDsgaSA8IG1kbGVuOyBpKyspCisJcHJpbnRmICgiJTAyeCAiLCBwW2ldICYgMHhGRik7CisgICAgICBwcmludGYgKCJcbmV4cGVjdGVkOiAiKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBtZGxlbjsgaSsrKQorCXByaW50ZiAoIiUwMnggIiwgZXhwZWN0W2ldICYgMHhGRik7CisgICAgICBwcmludGYgKCJcbiIpOworCisgICAgICBmYWlsICgiYWxnbyAlZCwgTUFDIGRvZXMgbm90IG1hdGNoXG4iLCBhbGdvKTsKKyAgICB9CisKKyAgZ2NyeV9tZF9jbG9zZSAoaGQpOworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfaG1hYyAodm9pZCkKK3sKKyAgdW5zaWduZWQgY2hhciBrZXlbMTI4XTsKKyAgaW50IGksIGo7CisKKyAgaWYgKHZlcmJvc2UpCisgICAgZnByaW50ZiAoc3RkZXJyLCAiY2hlY2tpbmcgRklQUy0xOThhLCBBLjFcbiIpOworICBmb3IgKGk9MDsgaSA8IDY0OyBpKyspCisgICAga2V5W2ldID0gaTsKKyAgY2hlY2tfb25lX21hYyAoR0NSWV9NRF9TSEExLCBrZXksIDY0LCAiU2FtcGxlICMxIiwgOSwKKyAgICAgICAgICAgICAgICAgIlx4NGZceDRjXHhhM1x4ZDVceGQ2XHg4Ylx4YTdceGNjXHgwYVx4MTIiCisgICAgICAgICAgICAgICAgICJceDA4XHhjOVx4YzZceDFlXHg5Y1x4NWRceGEwXHg0MFx4M2NceDBhIik7CisKKyAgaWYgKHZlcmJvc2UpCisgICAgZnByaW50ZiAoc3RkZXJyLCAiY2hlY2tpbmcgRklQUy0xOThhLCBBLjJcbiIpOworICBmb3IgKGk9MCwgaj0weDMwOyBpIDwgMjA7IGkrKykKKyAgICBrZXlbaV0gPSBqKys7CisgIGNoZWNrX29uZV9tYWMgKEdDUllfTURfU0hBMSwga2V5LCAyMCwgIlNhbXBsZSAjMiIsIDksCisgICAgICAgICAgICAgICAgICJceDA5XHgyMlx4ZDNceDQwXHg1Zlx4YWFceDNkXHgxOVx4NGZceDgyIgorICAgICAgICAgICAgICAgICAiXHhhNFx4NThceDMwXHg3M1x4N2RceDVjXHhjNlx4YzdceDVkXHgyNCIpOworCisgIGlmICh2ZXJib3NlKQorICAgIGZwcmludGYgKHN0ZGVyciwgImNoZWNraW5nIEZJUFMtMTk4YSwgQS4zXG4iKTsKKyAgZm9yIChpPTAsIGo9MHg1MDsgaSA8IDEwMDsgaSsrKQorICAgIGtleVtpXSA9IGorKzsKKyAgY2hlY2tfb25lX21hYyAoR0NSWV9NRF9TSEExLCBrZXksIDEwMCwgIlNhbXBsZSAjMyIsIDksCisgICAgICAgICAgICAgICAgICJceGJjXHhmNFx4MWVceGFiXHg4Ylx4YjJceGQ4XHgwMlx4ZjNceGQwIgorICAgICAgICAgICAgICAgICAiXHg1Y1x4YWZceDdjXHhiMFx4OTJceGVjXHhmOFx4ZDFceGEzXHhhYSIpOworCisgIGlmICh2ZXJib3NlKQorICAgIGZwcmludGYgKHN0ZGVyciwgImNoZWNraW5nIEZJUFMtMTk4YSwgQS40XG4iKTsKKyAgZm9yIChpPTAsIGo9MHg3MDsgaSA8IDQ5OyBpKyspCisgICAga2V5W2ldID0gaisrOworICBjaGVja19vbmVfbWFjIChHQ1JZX01EX1NIQTEsIGtleSwgNDksICJTYW1wbGUgIzQiLCA5LAorICAgICAgICAgICAgICAgICAiXHg5ZVx4YThceDg2XHhlZlx4ZTJceDY4XHhkYlx4ZWNceGNlXHg0MiIKKyAgICAgICAgICAgICAgICAgIlx4MGNceDc1XHgyNFx4ZGZceDMyXHhlMFx4NzVceDFhXHgyYVx4MjYiKTsKKworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgaW50IGRlYnVnID0gMDsKKworICBpZiAoYXJnYyA+IDEgJiYgIXN0cmNtcCAoYXJndlsxXSwgIi0tdmVyYm9zZSIpKQorICAgIHZlcmJvc2UgPSAxOworICBlbHNlIGlmIChhcmdjID4gMSAmJiAhc3RyY21wIChhcmd2WzFdLCAiLS1kZWJ1ZyIpKQorICAgIHZlcmJvc2UgPSBkZWJ1ZyA9IDE7CisKKyAgaWYgKCFnY3J5X2NoZWNrX3ZlcnNpb24gKEdDUllQVF9WRVJTSU9OKSkKKyAgICBkaWUgKCJ2ZXJzaW9uIG1pc21hdGNoXG4iKTsKKworICBnY3J5X2NvbnRyb2wgKEdDUllDVExfRElTQUJMRV9TRUNNRU0sIDApOworICBnY3J5X2NvbnRyb2wgKEdDUllDVExfSU5JVElBTElaQVRJT05fRklOSVNIRUQsIDApOworICBpZiAoZGVidWcpCisgICAgZ2NyeV9jb250cm9sIChHQ1JZQ1RMX1NFVF9ERUJVR19GTEFHUywgMXUsIDApOworICBjaGVja19obWFjICgpOworCisgIHJldHVybiBlcnJvcl9jb3VudCA/IDEgOiAwOworfQpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L3Rlc3RzL2tleWdlbi5jIGIvbGliZ2NyeXB0LTEuNC42L3Rlc3RzL2tleWdlbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZDU2MTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvdGVzdHMva2V5Z2VuLmMKQEAgLTAsMCArMSwzMTEgQEAKKy8qIGtleWdlbi5jICAtICBrZXkgZ2VuZXJhdGlvbiByZWdyZXNzaW9uIHRlc3RzCisgKglDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgIi4uL3NyYy9nY3J5cHQuaCIKKworCisKK3N0YXRpYyBpbnQgdmVyYm9zZTsKK3N0YXRpYyBpbnQgZGVidWc7CitzdGF0aWMgaW50IGVycm9yX2NvdW50OworCitzdGF0aWMgdm9pZAorZmFpbCAoIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uICkKK3sKKyAgICB2YV9saXN0IGFyZ19wdHIgOworCisgICAgdmFfc3RhcnQoIGFyZ19wdHIsIGZvcm1hdCApIDsKKyAgICB2ZnByaW50ZiAoc3RkZXJyLCBmb3JtYXQsIGFyZ19wdHIgKTsKKyAgICB2YV9lbmQoYXJnX3B0cik7CisgICAgZXJyb3JfY291bnQrKzsKK30KKworc3RhdGljIHZvaWQKK2RpZSAoIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uICkKK3sKKyAgICB2YV9saXN0IGFyZ19wdHIgOworCisgICAgdmFfc3RhcnQoIGFyZ19wdHIsIGZvcm1hdCApIDsKKyAgICB2ZnByaW50ZiAoc3RkZXJyLCBmb3JtYXQsIGFyZ19wdHIgKTsKKyAgICB2YV9lbmQoYXJnX3B0cik7CisgICAgZXhpdCAoMSk7Cit9CisKKworc3RhdGljIHZvaWQKK3ByaW50X21waSAoY29uc3QgY2hhciAqdGV4dCwgZ2NyeV9tcGlfdCBhKQoreworICBjaGFyICpidWY7CisgIHZvaWQgKmJ1ZmFkZHIgPSAmYnVmOworICBnY3J5X2Vycm9yX3QgcmM7CisKKyAgcmMgPSBnY3J5X21waV9hcHJpbnQgKEdDUllNUElfRk1UX0hFWCwgYnVmYWRkciwgTlVMTCwgYSk7CisgIGlmIChyYykKKyAgICBmcHJpbnRmIChzdGRlcnIsICIlcz1bZXJyb3IgcHJpbnRpbmcgbnVtYmVyOiAlc11cbiIsCisgICAgICAgICAgICAgdGV4dCwgZ3BnX3N0cmVycm9yIChyYykpOworICBlbHNlCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM9MHglc1xuIiwgdGV4dCwgYnVmKTsKKyAgICAgIGdjcnlfZnJlZSAoYnVmKTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK2NoZWNrX2dlbmVyYXRlZF9yc2Ffa2V5IChnY3J5X3NleHBfdCBrZXksIHVuc2lnbmVkIGxvbmcgZXhwZWN0ZWRfZSkKK3sKKyAgZ2NyeV9zZXhwX3Qgc2tleSwgcGtleSwgbGlzdDsKKworICBwa2V5ID0gZ2NyeV9zZXhwX2ZpbmRfdG9rZW4gKGtleSwgInB1YmxpYy1rZXkiLCAwKTsKKyAgaWYgKCFwa2V5KQorICAgIGZhaWwgKCJwdWJsaWMgcGFydCBtaXNzaW5nIGluIHJldHVybiB2YWx1ZVxuIik7CisgIGVsc2UKKyAgICB7CisgICAgICBnY3J5X21waV90IGUgPSBOVUxMOworCisgICAgICBsaXN0ID0gZ2NyeV9zZXhwX2ZpbmRfdG9rZW4gKHBrZXksICJlIiwgMCk7CisgICAgICBpZiAoIWxpc3QgfHwgIShlPWdjcnlfc2V4cF9udGhfbXBpIChsaXN0LCAxLCAwKSkgKQorICAgICAgICBmYWlsICgicHVibGljIGV4cG9uZW50IG5vdCBmb3VuZFxuIik7CisgICAgICBlbHNlIGlmICghZXhwZWN0ZWRfZSkKKyAgICAgICAgeworICAgICAgICAgIGlmICh2ZXJib3NlKQorICAgICAgICAgICAgcHJpbnRfbXBpICgiZSIsIGUpOworICAgICAgICB9CisgICAgICBlbHNlIGlmICggZ2NyeV9tcGlfY21wX3VpIChlLCBleHBlY3RlZF9lKSkgCisgICAgICAgIHsKKyAgICAgICAgICBwcmludF9tcGkgKCJlIiwgZSk7CisgICAgICAgICAgZmFpbCAoInB1YmxpYyBleHBvbmVudCBpcyBub3QgJWx1XG4iLCBleHBlY3RlZF9lKTsKKyAgICAgICAgfQorICAgICAgZ2NyeV9zZXhwX3JlbGVhc2UgKGxpc3QpOworICAgICAgZ2NyeV9tcGlfcmVsZWFzZSAoZSk7CisgICAgICBnY3J5X3NleHBfcmVsZWFzZSAocGtleSk7CisgICAgfQorIAorICBza2V5ID0gZ2NyeV9zZXhwX2ZpbmRfdG9rZW4gKGtleSwgInByaXZhdGUta2V5IiwgMCk7CisgIGlmICghc2tleSkKKyAgICBmYWlsICgicHJpdmF0ZSBwYXJ0IG1pc3NpbmcgaW4gcmV0dXJuIHZhbHVlXG4iKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGludCByYyA9IGdjcnlfcGtfdGVzdGtleSAoc2tleSk7CisgICAgICBpZiAocmMpCisgICAgICAgIGZhaWwgKCJnY3J5X3BrX3Rlc3RrZXkgZmFpbGVkOiAlc1xuIiwgZ3BnX3N0cmVycm9yIChyYykpOworICAgICAgZ2NyeV9zZXhwX3JlbGVhc2UgKHNrZXkpOworICAgIH0KKworIH0KKworc3RhdGljIHZvaWQKK2NoZWNrX3JzYV9rZXlzICh2b2lkKQoreworICBnY3J5X3NleHBfdCBrZXlwYXJtLCBrZXk7CisgIGludCByYzsKKyAgaW50IGk7CisKKyAgLyogQ2hlY2sgdGhhdCBEU0EgZ2VuZXJhdGlvbiB3b3JrcyBhbmQgdGhhdCBpdCBjYW4gZ3JvayB0aGUgcWJpdHMKKyAgICAgYXJndW1lbnQuICovCisgIGlmICh2ZXJib3NlKQorICAgIGZwcmludGYgKHN0ZGVyciwgImNyZWF0aW5nIDUgMTAyNCBiaXQgRFNBIGtleXNcbiIpOworICBmb3IgKGk9MDsgaSA8IDU7IGkrKykKKyAgICB7CisgICAgICByYyA9IGdjcnlfc2V4cF9uZXcgKCZrZXlwYXJtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIihnZW5rZXlcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAoZHNhXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgIChuYml0cyA0OjEwMjQpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgKSkiLCAwLCAxKTsKKyAgICAgIGlmIChyYykKKyAgICAgICAgZGllICgiZXJyb3IgY3JlYXRpbmcgUy1leHByZXNzaW9uOiAlc1xuIiwgZ3BnX3N0cmVycm9yIChyYykpOworICAgICAgcmMgPSBnY3J5X3BrX2dlbmtleSAoJmtleSwga2V5cGFybSk7CisgICAgICBnY3J5X3NleHBfcmVsZWFzZSAoa2V5cGFybSk7CisgICAgICBpZiAocmMpCisgICAgICAgIGRpZSAoImVycm9yIGdlbmVyYXRpbmcgRFNBIGtleTogJXNcbiIsIGdwZ19zdHJlcnJvciAocmMpKTsKKyAgICAgIGdjcnlfc2V4cF9yZWxlYXNlIChrZXkpOworICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAgZG9uZVxuIik7CisgICAgfQorCisgIGlmICh2ZXJib3NlKQorICAgIGZwcmludGYgKHN0ZGVyciwgImNyZWF0aW5nIDE1MzYgYml0IERTQSBrZXlcbiIpOworICByYyA9IGdjcnlfc2V4cF9uZXcgKCZrZXlwYXJtLCAKKyAgICAgICAgICAgICAgICAgICAgICAiKGdlbmtleVxuIgorICAgICAgICAgICAgICAgICAgICAgICIgKGRzYVxuIgorICAgICAgICAgICAgICAgICAgICAgICIgIChuYml0cyA0OjE1MzYpXG4iCisgICAgICAgICAgICAgICAgICAgICAgIiAgKHFiaXRzIDM6MjI0KVxuIgorICAgICAgICAgICAgICAgICAgICAgICIgKSkiLCAwLCAxKTsKKyAgaWYgKHJjKQorICAgIGRpZSAoImVycm9yIGNyZWF0aW5nIFMtZXhwcmVzc2lvbjogJXNcbiIsIGdwZ19zdHJlcnJvciAocmMpKTsKKyAgcmMgPSBnY3J5X3BrX2dlbmtleSAoJmtleSwga2V5cGFybSk7CisgIGdjcnlfc2V4cF9yZWxlYXNlIChrZXlwYXJtKTsKKyAgaWYgKHJjKQorICAgIGRpZSAoImVycm9yIGdlbmVyYXRpbmcgRFNBIGtleTogJXNcbiIsIGdwZ19zdHJlcnJvciAocmMpKTsKKyAgaWYgKGRlYnVnKQorICAgIHsKKyAgICAgIGNoYXIgYnVmZmVyWzIwMDAwXTsKKyAgICAgIGdjcnlfc2V4cF9zcHJpbnQgKGtleSwgR0NSWVNFWFBfRk1UX0FEVkFOQ0VELCBidWZmZXIsIHNpemVvZiBidWZmZXIpOworICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAgIHByaW50ZiAoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4lc1xuIgorICAgICAgICAgICAgICAgICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIiwgYnVmZmVyKTsKKyAgICB9CisgIGdjcnlfc2V4cF9yZWxlYXNlIChrZXkpOworCisgIGlmICh2ZXJib3NlKQorICAgIGZwcmludGYgKHN0ZGVyciwgImNyZWF0aW5nIDEwMjQgYml0IFJTQSBrZXlcbiIpOworICByYyA9IGdjcnlfc2V4cF9uZXcgKCZrZXlwYXJtLCAKKyAgICAgICAgICAgICAgICAgICAgICAiKGdlbmtleVxuIgorICAgICAgICAgICAgICAgICAgICAgICIgKHJzYVxuIgorICAgICAgICAgICAgICAgICAgICAgICIgIChuYml0cyA0OjEwMjQpXG4iCisgICAgICAgICAgICAgICAgICAgICAgIiApKSIsIDAsIDEpOworICBpZiAocmMpCisgICAgZGllICgiZXJyb3IgY3JlYXRpbmcgUy1leHByZXNzaW9uOiAlc1xuIiwgZ3BnX3N0cmVycm9yIChyYykpOworICByYyA9IGdjcnlfcGtfZ2Vua2V5ICgma2V5LCBrZXlwYXJtKTsKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKGtleXBhcm0pOworICBpZiAocmMpCisgICAgZGllICgiZXJyb3IgZ2VuZXJhdGluZyBSU0Ega2V5OiAlc1xuIiwgZ3BnX3N0cmVycm9yIChyYykpOworCisgIGNoZWNrX2dlbmVyYXRlZF9yc2Ffa2V5IChrZXksIDY1NTM3KTsKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKGtleSk7CisKKworICBpZiAodmVyYm9zZSkKKyAgICBmcHJpbnRmIChzdGRlcnIsICJjcmVhdGluZyA1MTIgYml0IFJTQSBrZXkgd2l0aCBlPTI1N1xuIik7CisgIHJjID0gZ2NyeV9zZXhwX25ldyAoJmtleXBhcm0sIAorICAgICAgICAgICAgICAgICAgICAgICIoZ2Vua2V5XG4iCisgICAgICAgICAgICAgICAgICAgICAgIiAocnNhXG4iCisgICAgICAgICAgICAgICAgICAgICAgIiAgKG5iaXRzIDM6NTEyKVxuIgorICAgICAgICAgICAgICAgICAgICAgICIgIChyc2EtdXNlLWUgMzoyNTcpXG4iCisgICAgICAgICAgICAgICAgICAgICAgIiApKSIsIDAsIDEpOworICBpZiAocmMpCisgICAgZGllICgiZXJyb3IgY3JlYXRpbmcgUy1leHByZXNzaW9uOiAlc1xuIiwgZ3BnX3N0cmVycm9yIChyYykpOworICByYyA9IGdjcnlfcGtfZ2Vua2V5ICgma2V5LCBrZXlwYXJtKTsKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKGtleXBhcm0pOworICBpZiAocmMpCisgICAgZGllICgiZXJyb3IgZ2VuZXJhdGluZyBSU0Ega2V5OiAlc1xuIiwgZ3BnX3N0cmVycm9yIChyYykpOworCisgIGNoZWNrX2dlbmVyYXRlZF9yc2Ffa2V5IChrZXksIDI1Nyk7CisgIGdjcnlfc2V4cF9yZWxlYXNlIChrZXkpOworCisgIGlmICh2ZXJib3NlKQorICAgIGZwcmludGYgKHN0ZGVyciwgImNyZWF0aW5nIDUxMiBiaXQgUlNBIGtleSB3aXRoIGRlZmF1bHQgZVxuIik7CisgIHJjID0gZ2NyeV9zZXhwX25ldyAoJmtleXBhcm0sIAorICAgICAgICAgICAgICAgICAgICAgICIoZ2Vua2V5XG4iCisgICAgICAgICAgICAgICAgICAgICAgIiAocnNhXG4iCisgICAgICAgICAgICAgICAgICAgICAgIiAgKG5iaXRzIDM6NTEyKVxuIgorICAgICAgICAgICAgICAgICAgICAgICIgIChyc2EtdXNlLWUgMTowKVxuIgorICAgICAgICAgICAgICAgICAgICAgICIgKSkiLCAwLCAxKTsKKyAgaWYgKHJjKQorICAgIGRpZSAoImVycm9yIGNyZWF0aW5nIFMtZXhwcmVzc2lvbjogJXNcbiIsIGdwZ19zdHJlcnJvciAocmMpKTsKKyAgcmMgPSBnY3J5X3BrX2dlbmtleSAoJmtleSwga2V5cGFybSk7CisgIGdjcnlfc2V4cF9yZWxlYXNlIChrZXlwYXJtKTsKKyAgaWYgKHJjKQorICAgIGRpZSAoImVycm9yIGdlbmVyYXRpbmcgUlNBIGtleTogJXNcbiIsIGdwZ19zdHJlcnJvciAocmMpKTsKKworICBjaGVja19nZW5lcmF0ZWRfcnNhX2tleSAoa2V5LCAwKTsgLyogV2UgZG9uJ3QgZXhwZWN0IGEgY29uc3RhbnQgZXhwb25lbnQuICovCisgIGdjcnlfc2V4cF9yZWxlYXNlIChrZXkpOworCit9CisKKworc3RhdGljIHZvaWQKK2NoZWNrX25vbmNlICh2b2lkKQoreworICBjaGFyIGFbMzJdLCBiWzMyXTsKKyAgaW50IGksajsKKyAgaW50IG9vcHM9MDsKKworICBpZiAodmVyYm9zZSkKKyAgICBmcHJpbnRmIChzdGRlcnIsICJjaGVja2luZyBnY3J5X2NyZWF0ZV9ub25jZVxuIik7CisKKyAgZ2NyeV9jcmVhdGVfbm9uY2UgKGEsIHNpemVvZiBhKTsKKyAgZm9yIChpPTA7IGkgPCAxMDsgaSsrKQorICAgIHsKKyAgICAgIGdjcnlfY3JlYXRlX25vbmNlIChiLCBzaXplb2YgYik7CisgICAgICBpZiAoIW1lbWNtcCAoYSwgYiwgc2l6ZW9mIGEpKQorICAgICAgICBkaWUgKCJpZGVudGljYWwgbm91bmNlIGZvdW5kXG4iKTsKKyAgICB9CisgIGZvciAoaT0wOyBpIDwgMTA7IGkrKykKKyAgICB7CisgICAgICBnY3J5X2NyZWF0ZV9ub25jZSAoYSwgc2l6ZW9mIGEpOworICAgICAgaWYgKCFtZW1jbXAgKGEsIGIsIHNpemVvZiBhKSkKKyAgICAgICAgZGllICgiaWRlbnRpY2FsIG5vdW5jZSBmb3VuZFxuIik7CisgICAgfQorCisgYWdhaW46CisgIGZvciAoaT0xLGo9MDsgaSA8IHNpemVvZiBhOyBpKyspCisgICAgaWYgKGFbMF0gPT0gYVtpXSkKKyAgICAgIGorKzsKKyAgaWYgKGorMSA9PSBzaXplb2YgKGEpKQorICAgIHsKKyAgICAgIGlmIChvb3BzKQorICAgICAgICBkaWUgKCJpbXBvc3NpYmxlIG5vbmNlIGZvdW5kXG4iKTsKKyAgICAgIG9vcHMrKzsKKyAgICAgIGdjcnlfY3JlYXRlX25vbmNlIChhLCBzaXplb2YgYSk7CisgICAgICBnb3RvIGFnYWluOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAorcHJvZ3Jlc3NfY2IgKHZvaWQgKmNiX2RhdGEsIGNvbnN0IGNoYXIgKndoYXQsIGludCBwcmludGNoYXIsCisJCSAgaW50IGN1cnJlbnQsIGludCB0b3RhbCkKK3sKKyAgKHZvaWQpY2JfZGF0YTsKKyAgKHZvaWQpd2hhdDsKKyAgKHZvaWQpY3VycmVudDsKKyAgKHZvaWQpdG90YWw7CisgIAorICBpZiAocHJpbnRjaGFyID09ICdcbicpCisgICAgZnB1dHMgKCAiPExGPiIsIHN0ZG91dCk7CisgIGVsc2UKKyAgICBwdXRjaGFyIChwcmludGNoYXIpOworICBmZmx1c2ggKHN0ZG91dCk7Cit9CisKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIGlmIChhcmdjID4gMSAmJiAhc3RyY21wIChhcmd2WzFdLCAiLS12ZXJib3NlIikpCisgICAgdmVyYm9zZSA9IDE7CisgIGVsc2UgaWYgKGFyZ2MgPiAxICYmICFzdHJjbXAgKGFyZ3ZbMV0sICItLWRlYnVnIikpCisgICAgdmVyYm9zZSA9IGRlYnVnID0gMTsKKworICBpZiAoIWdjcnlfY2hlY2tfdmVyc2lvbiAoR0NSWVBUX1ZFUlNJT04pKQorICAgIGRpZSAoInZlcnNpb24gbWlzbWF0Y2hcbiIpOworICBnY3J5X2NvbnRyb2wgKEdDUllDVExfRElTQUJMRV9TRUNNRU0sIDApOworICBnY3J5X2NvbnRyb2wgKEdDUllDVExfSU5JVElBTElaQVRJT05fRklOSVNIRUQsIDApOworICBpZiAoZGVidWcpCisgICAgZ2NyeV9jb250cm9sIChHQ1JZQ1RMX1NFVF9ERUJVR19GTEFHUywgMXUgLCAwKTsKKyAgLyogTm8gdmFsdWFibGUga2V5cyBhcmUgY3JlYXRlLCBzbyB3ZSBjYW4gc3BlZWQgdXAgb3VyIFJORy4gKi8KKyAgZ2NyeV9jb250cm9sIChHQ1JZQ1RMX0VOQUJMRV9RVUlDS19SQU5ET00sIDApOworICBpZiAodmVyYm9zZSkKKyAgICBnY3J5X3NldF9wcm9ncmVzc19oYW5kbGVyICggcHJvZ3Jlc3NfY2IsIE5VTEwgKTsKKworICBjaGVja19yc2Ffa2V5cyAoKTsKKyAgY2hlY2tfbm9uY2UgKCk7CisgIAorICByZXR1cm4gZXJyb3JfY291bnQ/IDE6MDsKK30KKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L3Rlc3RzL2tleWdyaXAuYyBiL2xpYmdjcnlwdC0xLjQuNi90ZXN0cy9rZXlncmlwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE5MDhiYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi90ZXN0cy9rZXlncmlwLmMKQEAgLTAsMCArMSwyMDggQEAKKy8qIGtleWdyaXAuYyAtIHZlcmlmaWVzIHRoYXQga2V5Z3JpcHMgYXJlIGNhbGN1bGF0ZWQgYXMgZXhwZWN0ZWQKKyAqCUNvcHlyaWdodCAoQykgMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgIi4uL3NyYy9nY3J5cHQuaCIKKworc3RhdGljIGludCB2ZXJib3NlOworCisMCisKK3N0YXRpYyB2b2lkCitkaWUgKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICB2YV9saXN0IGFyZ19wdHI7CisKKyAgdmFfc3RhcnQgKGFyZ19wdHIsIGZvcm1hdCk7CisgIHZmcHJpbnRmIChzdGRlcnIsIGZvcm1hdCwgYXJnX3B0cik7CisgIHZhX2VuZCAoYXJnX3B0cik7CisgIGV4aXQgKDEpOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfaGV4IChjb25zdCBjaGFyICp0ZXh0LCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBuKQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICpwID0gYnVmOworCisgIGZwdXRzICh0ZXh0LCBzdGRvdXQpOworICBmb3IgKDsgbjsgbi0tLCBwKyspCisgICAgcHJpbnRmICgiJTAyWCIsICpwKTsKKyAgcHV0Y2hhciAoJ1xuJyk7Cit9CisKKworDAorCitzdGF0aWMgc3RydWN0Cit7CisgIGludCBhbGdvOworICBjb25zdCBjaGFyICprZXk7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgZ3JpcFsyMF07Cit9IGtleV9ncmlwc1tdID0KKyAgeworICAgIHsKKyAgICAgIEdDUllfUEtfUlNBLAorICAgICAgIihwcml2YXRlLWtleSIKKyAgICAgICIgKHJzYSIKKyAgICAgICIgIChuICMwMEI2QjUwOTU5NkE5RUNBQkM5MzkyMTJGODkxRTY1NkE2MjZCQTA3REE4NTIxQTlDQUQ0QzA4RTY0MEMwNDA1MkZCQjg3RjQyNEVGMUEwMjc1QTQ4QTkyOTlBQzlEQjY5QUJFM0QwMTI0RTZDNzU2QjFGN0RGQjlCODQyRDYyNTFBRUE2RUU4NTM5MDQ5NUNBREE3M0Q2NzE1MzdGQ0U1ODUwQTkzMkYzMkJBQjYwQUIxQUMxRjg1MkMxRjgzQzYyNUU3QTdENzBDREE5RUYxNkQ1QzhFNDc3MzlENzdERjU5MjYxQUJFODQ1NDgwN0ZGNDQxRTE0M0ZCRDM3Rjg1NDUjKSIKKyAgICAgICIgIChlICMwMTAwMDEjKSIKKyAgICAgICIgIChkICMwNzdBRDNERTI4NDI0NUY0ODA2QTFCODJCNzlFNjE2RkJERTgyMUM4MkQ2OTFBNjU2NjVFNTdCNUZBRDNGMzRFNjdGNDAxRTdCRDJFMjg2OTlFODlEOUM0OTZDRjgyMTk0NUFFODNBQzdBMTIzMTE3NkExOTZCQTYwMjdFNzdEODU3ODkwNTVENTA0MDRBN0EyQTk1QjE1MTJGOTFGMTkwQkJBRUY3MzBFRDU1MEQyMjdENTEyRjg5QzBDREIzMUFDMDZGQTlBMTk1MDNEREY2QjY2RDBCNDJCOTY5MUJGRDYxNDBFQzE3MjBGRkM0OEFFMDBDMzQ3OTZEQzg5OUU1IykiCisgICAgICAiICAocCAjMDBENTg2Qzc4RTVGMUI0QkYyRTdDRDdBMDRDQTA5MTkxMTcwNkYxOTc4OEI5M0U0NEVFMjBBQUY0NjJFODM2M0U5OEE3MjI1M0VEODQ1Q0NCRjI0ODFCQjM1MUU4NTU3Qzg1QkNGRkYwREFCREJGRjhFMjZBNzlBMDkzODA5NkYyNyMpIgorICAgICAgIiAgKHEgIzAwREIwQ0RGNjBGMjZGMkEyOTZDODhENkJGOUY4RTVCRTQ1QzBEREQ3MTNDOTZDQzczRUJDQjQ4QjA2MTc0MDk0M0YyMUQyQTkzRDZFNDJBNzIxMUU3RjAyQTk1RENFRDZDMzkwQTY3QUQyMUVDRjczOUFFOEEwQ0E0NkZGMkVCQjMjKSIKKyAgICAgICIgICh1ICMzMzE0OTE5NUYxNjkxMkRCMjBBNDhEMDIwREJDM0I5RTM4ODFCMzlENzIyQkY3OTM3OEY2MzQwRjQzMTQ4QTZFOUZDNUY1M0UyODUzQjczODdCQTQ0NDNCQTUzQTUyRkNBODE3M0RFNkU4NUI0MkY5NzgzRDRBNzgxN0QwNjgwQiMpKSkiLAorICAgICAgIlx4MzJceENGXHhGQVx4ODVceEIxXHg3OVx4MUZceEJCXHgyNlx4MTRceEU5XHgxQVx4RkRceEYzXHhBRlx4RTNceDMyXHgwOFx4MkVceDI1IgorICAgIH0sCisgICAgeworICAgICAgR0NSWV9QS19EU0EsCisgICAgICAiIChwdWJsaWMta2V5IgorICAgICAgIiAoZHNhIgorICAgICAgIiAgKHAgIzAwODRFNEM2MjZFMTYwMDU3NzBCRDk1MDlBQkY3MzU0NDkyRTg1QjhDMDA2MEVGQUFBRUM2MTdGNzI1QjU5MkZBQTU5REY1NDYwNTc1RjQxMDIyNzc2QTk3MThDRTYyRURENTQyQUI3M0M3NzIwODY5RUJEQkM4MzREMTc0QURDRDcxMzY4MjdERjUxRTI2MTM1NDVBMjVDQTU3M0JDNTAyQTYxQjgwOTAwMEI2RTM1RjVFQjdGRDZGMThDMzU2NzhDMjNFQTFDMzYzOEZCOUNGREJBMjgwMEVFMUI2MkY0MUE0NDc5REU4MjRGMjgzNDY2NkZCRjhEQzVCNTNDMjYxNyMpIgorICAgICAgIiAgKHEgIzAwQjBFNkY3MTAwNTEwMDJBOUY0MjVEOThBNjc3QjE4RTBFNUIwMzhBQiMpIgorICAgICAgIiAgKGcgIzQ0MzcwQ0VFMEZFODYwOTk5NDE4M0RCRkVCQTdFRUE5N0Q0NjY4MzhCQ0Y2NUVGRjUwNkUzNTYxNkRBOTNGQTRFNTcyQTJGMDg4ODZCNzQ5NzdCQzAwQ0E4Q0QzREJFQTdBRUI3REI4Q0JCMTgwRTY5NzVFMEQyQ0E3NkUwMjNFNkRFOUY4Q0NEODgyNkVCQTJGNzJCODUxNjUzMkY2MDAxREVGRkFFNzZBQTVFNTlFMEZBMzNEQkEzOTk5QjRFOTJEMTcwMzA5OENERURDQzQxNkNGMDA4ODAxOTY0MDg0Q0RFMTk4MDEzMkIyQjc4Q0I0Q0U5QzE1QTU1OTUyOEIjKSIKKyAgICAgICIgICh5ICMzRDVERDE0QUZBMkJGMjRBNzkxRTI4NUI5MDIzMjIxM0QwRTNCQTc0QUIxMTA5RTc2OEFFRDE5NjM5QTMyMkY4NEJCN0Q5NTlFMkJBOTJFRjczREU0QzdGMzgxQUE5RjQwNTNDRkEzQ0Q0NTI3RUY5MDQzRTMwNEU1Qjk1RUQwQTNBNUE5RDU5MEFBNjQxQzEzREIyQjZFMzJCOUI5NjRBNkEyQzczMEREM0VBN0M4RTEzRjdBMTQwQUZGMUE5MUNFMzc1RTlCOUI5NjAzODQ3NzlEQzRFQTE4MEZBMUY4MjdDNTIyODhGMzY2QzA3NzBBMjIwRjUwRDZEOEZENkY2IykpKSIsCisgICAgICAiXHgwNFx4QTNceDRGXHhBMFx4MkJceDAzXHg5NFx4RDdceDMyXHhBRFx4RDVceDlCXHg1MFx4QUZceERCXHg1RFx4NTdceDIyXHhBNlx4MTAiCisgICAgICAKKyAgICB9LAorICAgIHsKKyAgICAgIEdDUllfUEtfRFNBLAorICAgICAgIihwcml2YXRlLWtleSIKKyAgICAgICIgKGRzYSIKKyAgICAgICIgIChwICMwMDg0RTRDNjI2RTE2MDA1NzcwQkQ5NTA5QUJGNzM1NDQ5MkU4NUI4QzAwNjBFRkFBQUVDNjE3RjcyNUI1OTJGQUE1OURGNTQ2MDU3NUY0MTAyMjc3NkE5NzE4Q0U2MkVERDU0MkFCNzNDNzcyMDg2OUVCREJDODM0RDE3NEFEQ0Q3MTM2ODI3REY1MUUyNjEzNTQ1QTI1Q0E1NzNCQzUwMkE2MUI4MDkwMDBCNkUzNUY1RUI3RkQ2RjE4QzM1Njc4QzIzRUExQzM2MzhGQjlDRkRCQTI4MDBFRTFCNjJGNDFBNDQ3OURFODI0RjI4MzQ2NjZGQkY4REM1QjUzQzI2MTcjKSIKKyAgICAgICIgIChxICMwMEIwRTZGNzEwMDUxMDAyQTlGNDI1RDk4QTY3N0IxOEUwRTVCMDM4QUIjKSIKKyAgICAgICIgIChnICM0NDM3MENFRTBGRTg2MDk5OTQxODNEQkZFQkE3RUVBOTdENDY2ODM4QkNGNjVFRkY1MDZFMzU2MTZEQTkzRkE0RTU3MkEyRjA4ODg2Qjc0OTc3QkMwMENBOENEM0RCRUE3QUVCN0RCOENCQjE4MEU2OTc1RTBEMkNBNzZFMDIzRTZERTlGOENDRDg4MjZFQkEyRjcyQjg1MTY1MzJGNjAwMURFRkZBRTc2QUE1RTU5RTBGQTMzREJBMzk5OUI0RTkyRDE3MDMwOThDREVEQ0M0MTZDRjAwODgwMTk2NDA4NENERTE5ODAxMzJCMkI3OENCNENFOUMxNUE1NTk1MjhCIykiCisgICAgICAiICAoeSAjM0Q1REQxNEFGQTJCRjI0QTc5MUUyODVCOTAyMzIyMTNEMEUzQkE3NEFCMTEwOUU3NjhBRUQxOTYzOUEzMjJGODRCQjdEOTU5RTJCQTkyRUY3M0RFNEM3RjM4MUFBOUY0MDUzQ0ZBM0NENDUyN0VGOTA0M0UzMDRFNUI5NUVEMEEzQTVBOUQ1OTBBQTY0MUMxM0RCMkI2RTMyQjlCOTY0QTZBMkM3MzBERDNFQTdDOEUxM0Y3QTE0MEFGRjFBOTFDRTM3NUU5QjlCOTYwMzg0Nzc5REM0RUExODBGQTFGODI3QzUyMjg4RjM2NkMwNzcwQTIyMEY1MEQ2RDhGRDZGNiMpIgorICAgICAgIiAgKHggIzAwODdGOUU5MUJGQkNDMTE2M0RFNzFFRDg2RDU1NzcwOEUzMkY4QURERSMpKSkiLAorICAgICAgIlx4MDRceEEzXHg0Rlx4QTBceDJCXHgwM1x4OTRceEQ3XHgzMlx4QURceEQ1XHg5Qlx4NTBceEFGXHhEQlx4NURceDU3XHgyMlx4QTZceDEwIgorICAgIH0sCisgICAgeyAgIAorICAgICAgR0NSWV9QS19FQ0RTQSwKKyAgICAgICIocHVibGljLWtleSIKKyAgICAgICIgKGVjZHNhIgorICAgICAgIiAocCAjMDBGRkZGRkZGRjAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGIykiCisgICAgICAiIChhICMwMEZGRkZGRkZGMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkMjKSIKKyAgICAgICIgKGIgIzVBQzYzNUQ4QUEzQTkzRTdCM0VCQkQ1NTc2OTg4NkJDNjUxRDA2QjBDQzUzQjBGNjNCQ0UzQzNFMjdEMjYwNEIjKSIKKyAgICAgICIgKGcgIzA0NkIxN0QxRjJFMTJDNDI0N0Y4QkNFNkU1NjNBNDQwRjI3NzAzN0Q4MTJERUIzM0EwRjRBMTM5NDVEODk4QzI5NjRGRTM0MkUyRkUxQTdGOUI4RUU3RUI0QTdDMEY5RTE2MkJDRTMzNTc2QjMxNUVDRUNCQjY0MDY4MzdCRjUxRjUjKSIKKyAgICAgICIgKG4gIzAwRkZGRkZGRkYwMDAwMDAwMEZGRkZGRkZGRkZGRkZGRkZCQ0U2RkFBREE3MTc5RTg0RjNCOUNBQzJGQzYzMjU1MSMpIgorICAgICAgIiAocSAjMDRDOEE0Q0VDMkU5QTlCQzhFMTczNTMxQTY3QjA4NDBERjM0NUMzMkUyNjFBREQ3ODBFNkQ4M0Q1NkVGQURGRDVERTg3MkY4Qjg1NDgxOUI1OTU0M0NFMEI3RjgyMjMzMDQ2NEZCQzRFNjMyNERBRERDRDlEMDU5NTU0RjYzQjM0NCMpKSkiLAorICAgICAgIlx4RTZceERGXHg5NFx4MkRceEJEXHg4Q1x4NzdceDA1XHhBM1x4RERceDQxXHg2RVx4RkNceDA0XHgwMVx4REJceDMxXHgwRVx4OTlceEI2IgorICAgIH0sCisgICAgeyAgIAorICAgICAgR0NSWV9QS19FQ0RTQSwKKyAgICAgICIocHVibGljLWtleSIKKyAgICAgICIgKGVjZHNhIgorICAgICAgIiAocCAjMDBGRkZGRkZGRjAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGIykiCisgICAgICAiIChjdXJ2ZSBcIk5JU1QgUC0yNTZcIikiCisgICAgICAiIChiICM1QUM2MzVEOEFBM0E5M0U3QjNFQkJENTU3Njk4ODZCQzY1MUQwNkIwQ0M1M0IwRjYzQkNFM0MzRTI3RDI2MDRCIykiCisgICAgICAiIChnICMwNDZCMTdEMUYyRTEyQzQyNDdGOEJDRTZFNTYzQTQ0MEYyNzcwMzdEODEyREVCMzNBMEY0QTEzOTQ1RDg5OEMyOTY0RkUzNDJFMkZFMUE3RjlCOEVFN0VCNEE3QzBGOUUxNjJCQ0UzMzU3NkIzMTVFQ0VDQkI2NDA2ODM3QkY1MUY1IykiCisgICAgICAiIChuICMwMEZGRkZGRkZGMDAwMDAwMDBGRkZGRkZGRkZGRkZGRkZGQkNFNkZBQURBNzE3OUU4NEYzQjlDQUMyRkM2MzI1NTEjKSIKKyAgICAgICIgKHEgIzA0QzhBNENFQzJFOUE5QkM4RTE3MzUzMUE2N0IwODQwREYzNDVDMzJFMjYxQURENzgwRTZEODNENTZFRkFERkQ1REU4NzJGOEI4NTQ4MTlCNTk1NDNDRTBCN0Y4MjIzMzA0NjRGQkM0RTYzMjREQUREQ0Q5RDA1OTU1NEY2M0IzNDQjKSkpIiwKKyAgICAgICJceEU2XHhERlx4OTRceDJEXHhCRFx4OENceDc3XHgwNVx4QTNceEREXHg0MVx4NkVceEZDXHgwNFx4MDFceERCXHgzMVx4MEVceDk5XHhCNiIKKyAgICB9LAorICAgIHsgICAKKyAgICAgIEdDUllfUEtfRUNEU0EsCisgICAgICAiKHB1YmxpYy1rZXkiCisgICAgICAiIChlY2RzYSIKKyAgICAgICIgKGN1cnZlIHNlY3AyNTZyMSkiCisgICAgICAiIChxICMwNEM4QTRDRUMyRTlBOUJDOEUxNzM1MzFBNjdCMDg0MERGMzQ1QzMyRTI2MUFERDc4MEU2RDgzRDU2RUZBREZENURFODcyRjhCODU0ODE5QjU5NTQzQ0UwQjdGODIyMzMwNDY0RkJDNEU2MzI0REFERENEOUQwNTk1NTRGNjNCMzQ0IykpKSIsCisgICAgICAiXHhFNlx4REZceDk0XHgyRFx4QkRceDhDXHg3N1x4MDVceEEzXHhERFx4NDFceDZFXHhGQ1x4MDRceDAxXHhEQlx4MzFceDBFXHg5OVx4QjYiCisgICAgfQorCisgIH07CisKK3N0YXRpYyB2b2lkCitjaGVjayAodm9pZCkKK3sKKyAgdW5zaWduZWQgY2hhciBidWZbMjBdOworICB1bnNpZ25lZCBjaGFyICpyZXQ7CisgIGdjcnlfZXJyb3JfdCBlcnI7CisgIGdjcnlfc2V4cF90IHNleHA7CisgIHVuc2lnbmVkIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCAoc2l6ZW9mIChrZXlfZ3JpcHMpIC8gc2l6ZW9mICgqa2V5X2dyaXBzKSk7IGkrKykKKyAgICB7CisgICAgICBpZiAoZ2NyeV9wa190ZXN0X2FsZ28gKGtleV9ncmlwc1tpXS5hbGdvKSkKKyAgICAgICAgeworICAgICAgICAgIGlmICh2ZXJib3NlKQorICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiYWxnbyAlZCBub3QgYXZhaWxhYmxlOyB0ZXN0IHNraXBwZWRcbiIsIAorICAgICAgICAgICAgICAgICAgICAga2V5X2dyaXBzW2ldLmFsZ28pOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICBlcnIgPSBnY3J5X3NleHBfc3NjYW4gKCZzZXhwLCBOVUxMLCBrZXlfZ3JpcHNbaV0ua2V5LAorCQkJICAgICBzdHJsZW4gKGtleV9ncmlwc1tpXS5rZXkpKTsKKyAgICAgIGlmIChlcnIpCisgICAgICAgIGRpZSAoInNjYW5uaW5nIGRhdGEgJWQgZmFpbGVkOiAlc1xuIiwgaSwgZ3BnX3N0cmVycm9yIChlcnIpKTsKKyAgICAgIHJldCA9IGdjcnlfcGtfZ2V0X2tleWdyaXAgKHNleHAsIGJ1Zik7CisgICAgICBpZiAoIXJldCkKKyAgICAgICAgZGllICgiZ2NyeV9wa19nZXRfa2V5Z3JpcCBmYWlsZWQgZm9yICVkXG4iLCBpKTsKKyAgICAgICAgCisgICAgICBpZiAoIG1lbWNtcCAoa2V5X2dyaXBzW2ldLmdyaXAsIGJ1Ziwgc2l6ZW9mIChidWYpKSApCisgICAgICAgIHsKKyAgICAgICAgICBwcmludF9oZXggKCJrZXlncmlwOiAiLCBidWYsIHNpemVvZiBidWYpOworICAgICAgICAgIGRpZSAoImtleWdyaXAgZm9yICVkIGRvZXMgbm90IG1hdGNoXG4iLCBpKTsgCisgICAgICAgIH0KKworICAgICAgZ2NyeV9zZXhwX3JlbGVhc2UgKHNleHApOworICAgIH0KK30KKworDAorCitzdGF0aWMgdm9pZAorcHJvZ3Jlc3NfaGFuZGxlciAodm9pZCAqY2JfZGF0YSwgY29uc3QgY2hhciAqd2hhdCwgaW50IHByaW50Y2hhciwKKwkJICBpbnQgY3VycmVudCwgaW50IHRvdGFsKQoreworICAodm9pZCljYl9kYXRhOworICAodm9pZCl3aGF0OworICAodm9pZCljdXJyZW50OworICAodm9pZCl0b3RhbDsKKworICBwdXRjaGFyIChwcmludGNoYXIpOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgaW50IGRlYnVnID0gMDsKKworICBpZiAoYXJnYyA+IDEgJiYgIXN0cmNtcCAoYXJndlsxXSwgIi0tdmVyYm9zZSIpKQorICAgIHZlcmJvc2UgPSAxOworICBlbHNlIGlmIChhcmdjID4gMSAmJiAhc3RyY21wIChhcmd2WzFdLCAiLS1kZWJ1ZyIpKQorICAgIHZlcmJvc2UgPSBkZWJ1ZyA9IDE7CisKKyAgaWYgKCFnY3J5X2NoZWNrX3ZlcnNpb24gKEdDUllQVF9WRVJTSU9OKSkKKyAgICBkaWUgKCJ2ZXJzaW9uIG1pc21hdGNoXG4iKTsKKworICBnY3J5X3NldF9wcm9ncmVzc19oYW5kbGVyIChwcm9ncmVzc19oYW5kbGVyLCBOVUxMKTsKKyAgCisgIGdjcnlfY29udHJvbCAoR0NSWUNUTF9ESVNBQkxFX1NFQ01FTSwgMCk7CisKKyAgY2hlY2sgKCk7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvdGVzdHMvbXBpdGVzdHMuYyBiL2xpYmdjcnlwdC0xLjQuNi90ZXN0cy9tcGl0ZXN0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjY2ZhZTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvdGVzdHMvbXBpdGVzdHMuYwpAQCAtMCwwICsxLDMwMiBAQAorLyogbXBpdGVzdHMuYyAgLSAgYmFzaWMgbXBpIHRlc3RzCisgKglDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAorICogVVNBLiAKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2lmZGVmIF9HQ1JZUFRfSU5fTElCR0NSWVBUCisjIGluY2x1ZGUgIi4uL3NyYy9nY3J5cHQuaCIKKyNlbHNlCisjIGluY2x1ZGUgPGdjcnlwdC5oPgorI2VuZGlmCisKK3N0YXRpYyBpbnQgdmVyYm9zZTsKK3N0YXRpYyBpbnQgZGVidWc7CisKKworc3RhdGljIHZvaWQKK2RpZSAoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgIHZhX2xpc3QgYXJnX3B0cjsKKworICB2YV9zdGFydCAoYXJnX3B0ciwgZm9ybWF0KTsKKyAgdmZwcmludGYgKHN0ZGVyciwgZm9ybWF0LCBhcmdfcHRyKTsKKyAgdmFfZW5kIChhcmdfcHRyKTsKKyAgZXhpdCAoMSk7Cit9CisKKworCisvKiBTZXQgdXAgc29tZSB0ZXN0IHBhdHRlcm5zICovCisKKy8qIDQ4IGJ5dGVzIHdpdGggdmFsdWUgMTogdGhpcyByZXN1bHRzIGluIDggbGltYnMgZm9yIDY0Yml0IGxpbWJzLCAxNmxpbWIgZm9yIDMyIGJpdCBsaW1icyAqLwordW5zaWduZWQgY2hhciBvbmVzW10gPSB7CisgIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCisgIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCisgIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEKK307CisKKy8qIDQ4IGJ5dGVzIHdpdGggdmFsdWUgMjogdGhpcyByZXN1bHRzIGluIDggbGltYnMgZm9yIDY0Yml0IGxpbWJzLCAxNmxpbWIgZm9yIDMyIGJpdCBsaW1icyAqLwordW5zaWduZWQgY2hhciB0d29zW10gPSB7CisgIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsCisgIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsCisgIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIKK307CisKKy8qIDQ4IGJ5dGVzIHdpdGggdmFsdWUgMzogdGhpcyByZXN1bHRzIGluIDggbGltYnMgZm9yIDY0Yml0IGxpbWJzLCAxNmxpbWIgZm9yIDMyIGJpdCBsaW1icyAqLwordW5zaWduZWQgY2hhciB0aHJlZXNbXSA9IHsKKyAgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywKKyAgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywKKyAgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMworfTsKKworLyogNDggYnl0ZXMgd2l0aCB2YWx1ZSAweDgwOiB0aGlzIHJlc3VsdHMgaW4gOCBsaW1icyBmb3IgNjRiaXQgbGltYnMsIDE2bGltYiBmb3IgMzIgYml0IGxpbWJzICovCit1bnNpZ25lZCBjaGFyIGVpZ2h0aWVzW10gPSB7CisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAKK307CisKKy8qIDQ4IGJ5dGVzIHdpdGggdmFsdWUgMHhmZjogdGhpcyByZXN1bHRzIGluIDggbGltYnMgZm9yIDY0Yml0IGxpbWJzLCAxNmxpbWIgZm9yIDMyIGJpdCBsaW1icyAqLwordW5zaWduZWQgY2hhciBtYW55ZmZbXSA9IHsKKyAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZgorfTsKKworCisKK3N0YXRpYyBpbnQgCit0ZXN0X2FkZCAodm9pZCkKK3sKKyAgZ2NyeV9tcGlfdCBvbmU7CisgIGdjcnlfbXBpX3QgdHdvOworICBnY3J5X21waV90IGZmOworICBnY3J5X21waV90IHJlc3VsdDsKKyAgdW5zaWduZWQgY2hhciogcGM7CisgIAorICBnY3J5X21waV9zY2FuKCZvbmUsIEdDUllNUElfRk1UX1VTRywgb25lcywgc2l6ZW9mKG9uZXMpLCBOVUxMKTsKKyAgZ2NyeV9tcGlfc2NhbigmdHdvLCBHQ1JZTVBJX0ZNVF9VU0csIHR3b3MsIHNpemVvZih0d29zKSwgTlVMTCk7CisgIGdjcnlfbXBpX3NjYW4oJmZmLCBHQ1JZTVBJX0ZNVF9VU0csIG1hbnlmZiwgc2l6ZW9mKG1hbnlmZiksIE5VTEwpOworICByZXN1bHQgPSBnY3J5X21waV9uZXcoMCk7CisgIAorICBnY3J5X21waV9hZGQocmVzdWx0LCBvbmUsIHR3byk7CisgIGdjcnlfbXBpX2FwcmludChHQ1JZTVBJX0ZNVF9IRVgsICZwYywgTlVMTCwgcmVzdWx0KTsKKyAgaWYgKHZlcmJvc2UpCisgICAgcHJpbnRmKCJSZXN1bHQgb2Ygb25lIHBsdXMgdHdvOlxuJXNcbiIsIHBjKTsKKyAgZ2NyeV9mcmVlKHBjKTsKKworICBnY3J5X21waV9hZGQocmVzdWx0LCBmZiwgb25lKTsKKyAgZ2NyeV9tcGlfYXByaW50KEdDUllNUElfRk1UX0hFWCwgJnBjLCBOVUxMLCByZXN1bHQpOworICBpZiAodmVyYm9zZSkKKyAgICBwcmludGYoIlJlc3VsdCBvZiBmZiBwbHVzIG9uZTpcbiVzXG4iLCBwYyk7CisgIGdjcnlfZnJlZShwYyk7CisgIAorICBnY3J5X21waV9yZWxlYXNlKG9uZSk7CisgIGdjcnlfbXBpX3JlbGVhc2UodHdvKTsKKyAgZ2NyeV9tcGlfcmVsZWFzZShmZik7CisgIGdjcnlfbXBpX3JlbGVhc2UocmVzdWx0KTsKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCAKK3Rlc3Rfc3ViICh2b2lkKQoreworICBnY3J5X21waV90IG9uZTsKKyAgZ2NyeV9tcGlfdCB0d287CisgIGdjcnlfbXBpX3QgcmVzdWx0OworICB1bnNpZ25lZCBjaGFyKiBwYzsKKyAgCisgIGdjcnlfbXBpX3NjYW4oJm9uZSwgR0NSWU1QSV9GTVRfVVNHLCBvbmVzLCBzaXplb2Yob25lcyksIE5VTEwpOworICBnY3J5X21waV9zY2FuKCZ0d28sIEdDUllNUElfRk1UX1VTRywgdHdvcywgc2l6ZW9mKHR3b3MpLCBOVUxMKTsKKyAgcmVzdWx0ID0gZ2NyeV9tcGlfbmV3KDApOworICBnY3J5X21waV9zdWIocmVzdWx0LCB0d28sIG9uZSk7CisgIAorICBnY3J5X21waV9hcHJpbnQoR0NSWU1QSV9GTVRfSEVYLCAmcGMsIE5VTEwsIHJlc3VsdCk7CisgIGlmICh2ZXJib3NlKQorICAgIHByaW50ZigiUmVzdWx0IG9mIHR3byBtaW51cyBvbmU6XG4lc1xuIiwgcGMpOworICBnY3J5X2ZyZWUocGMpOworICAKKyAgZ2NyeV9tcGlfcmVsZWFzZShvbmUpOworICBnY3J5X21waV9yZWxlYXNlKHR3byk7CisgIGdjcnlfbXBpX3JlbGVhc2UocmVzdWx0KTsKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCAKK3Rlc3RfbXVsICh2b2lkKQoreworICBnY3J5X21waV90IHR3bzsKKyAgZ2NyeV9tcGlfdCB0aHJlZTsKKyAgZ2NyeV9tcGlfdCByZXN1bHQ7CisgIHVuc2lnbmVkIGNoYXIqIHBjOworICAKKyAgZ2NyeV9tcGlfc2NhbigmdHdvLCBHQ1JZTVBJX0ZNVF9VU0csIHR3b3MsIHNpemVvZih0d29zKSwgTlVMTCk7CisgIGdjcnlfbXBpX3NjYW4oJnRocmVlLCBHQ1JZTVBJX0ZNVF9VU0csIHRocmVlcywgc2l6ZW9mKHRocmVlcyksIE5VTEwpOworICByZXN1bHQgPSBnY3J5X21waV9uZXcoMCk7CisgIGdjcnlfbXBpX211bChyZXN1bHQsIHR3bywgdGhyZWUpOworICAKKyAgZ2NyeV9tcGlfYXByaW50KEdDUllNUElfRk1UX0hFWCwgJnBjLCBOVUxMLCByZXN1bHQpOworICBpZiAodmVyYm9zZSkKKyAgICBwcmludGYoIlJlc3VsdCBvZiB0d28gbXVsIHRocmVlOlxuJXNcbiIsIHBjKTsKKyAgZ2NyeV9mcmVlKHBjKTsKKyAgCisgIGdjcnlfbXBpX3JlbGVhc2UodHdvKTsKKyAgZ2NyeV9tcGlfcmVsZWFzZSh0aHJlZSk7CisgIGdjcnlfbXBpX3JlbGVhc2UocmVzdWx0KTsKKyAgcmV0dXJuIDE7Cit9CisKKworLyogV2hhdCB3ZSB0ZXN0IGhlcmUgaXMgdGhhdCB3ZSBkb24ndCBvdmVyd3JpdGUgb3VyIGFyZ3MgYW5kIHRoYXQKKyAgIHVzaW5nIHRobmUgc2FtZSBtcGkgZm9yIHNldmVyYWwgYXJncyB3b3Jrcy4gICovCitzdGF0aWMgaW50Cit0ZXN0X3Bvd20gKHZvaWQpCit7CisgIGludCBiX2ludCA9IDE3OworICBpbnQgZV9pbnQgPSAzOworICBpbnQgbV9pbnQgPSAxOTsgIAorICBnY3J5X21waV90IGJhc2UgPSBnY3J5X21waV9zZXRfdWkgKE5VTEwsIGJfaW50KTsKKyAgZ2NyeV9tcGlfdCBleHAgPSBnY3J5X21waV9zZXRfdWkgKE5VTEwsIGVfaW50KTsKKyAgZ2NyeV9tcGlfdCBtb2QgPSBnY3J5X21waV9zZXRfdWkgKE5VTEwsIG1faW50KTsKKyAgZ2NyeV9tcGlfdCByZXMgPSBnY3J5X21waV9uZXcgKDApOworCisgIGdjcnlfbXBpX3Bvd20gKHJlcywgYmFzZSwgZXhwLCBtb2QpOworICBpZiAoZ2NyeV9tcGlfY21wX3VpIChiYXNlLCBiX2ludCkpCisgICAgZGllICgidGVzdF9wb3dtIGZhaWxlZCBmb3IgYmFzZSBhdCAlZFxuIiwgX19MSU5FX18pOworICBpZiAoZ2NyeV9tcGlfY21wX3VpIChleHAsIGVfaW50KSkKKyAgICBkaWUgKCJ0ZXN0X3Bvd21fdWkgZmFpbGVkIGZvciBleHAgYXQgJWRcbiIsIF9fTElORV9fKTsKKyAgaWYgKGdjcnlfbXBpX2NtcF91aSAobW9kLCBtX2ludCkpCisgICAgZGllICgidGVzdF9wb3dtIGZhaWxlZCBmb3IgbW9kIGF0ICVkXG4iLCBfX0xJTkVfXyk7CisKKyAgLyogQ2hlY2sgdXNpbmcgYmFzZSBmb3IgdGhlIHJlc3VsdC4gICovCisgIGdjcnlfbXBpX3NldF91aSAoYmFzZSwgYl9pbnQpOworICBnY3J5X21waV9zZXRfdWkgKGV4cCwgZV9pbnQpOworICBnY3J5X21waV9zZXRfdWkobW9kLCBtX2ludCk7CisgIGdjcnlfbXBpX3Bvd20gKGJhc2UsIGJhc2UsIGV4cCwgbW9kKTsKKyAgaWYgKGdjcnlfbXBpX2NtcCAocmVzLCBiYXNlKSkKKyAgICBkaWUgKCJ0ZXN0X3Bvd20gZmFpbGVkIGF0ICVkXG4iLCBfX0xJTkVfXyk7CisgIGlmIChnY3J5X21waV9jbXBfdWkgKGV4cCwgZV9pbnQpKQorICAgIGRpZSAoInRlc3RfcG93bV91aSBmYWlsZWQgZm9yIGV4cCBhdCAlZFxuIiwgX19MSU5FX18pOworICBpZiAoZ2NyeV9tcGlfY21wX3VpIChtb2QsIG1faW50KSkKKyAgICBkaWUgKCJ0ZXN0X3Bvd20gZmFpbGVkIGZvciBtb2QgYXQgJWRcbiIsIF9fTElORV9fKTsKKworICAvKiBDaGVjayB1c2luZyBleHAgZm9yIHRoZSByZXN1bHQuICAqLworICBnY3J5X21waV9zZXRfdWkgKGJhc2UsIGJfaW50KTsKKyAgZ2NyeV9tcGlfc2V0X3VpIChleHAsIGVfaW50KTsKKyAgZ2NyeV9tcGlfc2V0X3VpKG1vZCwgbV9pbnQpOworICBnY3J5X21waV9wb3dtIChleHAsIGJhc2UsIGV4cCwgbW9kKTsKKyAgaWYgKGdjcnlfbXBpX2NtcCAocmVzLCBleHApKQorICAgIGRpZSAoInRlc3RfcG93bSBmYWlsZWQgYXQgJWRcbiIsIF9fTElORV9fKTsKKyAgaWYgKGdjcnlfbXBpX2NtcF91aSAoYmFzZSwgYl9pbnQpKQorICAgIGRpZSAoInRlc3RfcG93bSBmYWlsZWQgZm9yIGJhc2UgYXQgJWRcbiIsIF9fTElORV9fKTsKKyAgaWYgKGdjcnlfbXBpX2NtcF91aSAobW9kLCBtX2ludCkpCisgICAgZGllICgidGVzdF9wb3dtIGZhaWxlZCBmb3IgbW9kIGF0ICVkXG4iLCBfX0xJTkVfXyk7CisKKyAgLyogQ2hlY2sgdXNpbmcgbW9kIGZvciB0aGUgcmVzdWx0LiAgKi8KKyAgZ2NyeV9tcGlfc2V0X3VpIChiYXNlLCBiX2ludCk7CisgIGdjcnlfbXBpX3NldF91aSAoZXhwLCBlX2ludCk7CisgIGdjcnlfbXBpX3NldF91aShtb2QsIG1faW50KTsKKyAgZ2NyeV9tcGlfcG93bSAobW9kLCBiYXNlLCBleHAsIG1vZCk7CisgIGlmIChnY3J5X21waV9jbXAgKHJlcywgbW9kKSkKKyAgICBkaWUgKCJ0ZXN0X3Bvd20gZmFpbGVkIGF0ICVkXG4iLCBfX0xJTkVfXyk7CisgIGlmIChnY3J5X21waV9jbXBfdWkgKGJhc2UsIGJfaW50KSkKKyAgICBkaWUgKCJ0ZXN0X3Bvd20gZmFpbGVkIGZvciBiYXNlIGF0ICVkXG4iLCBfX0xJTkVfXyk7CisgIGlmIChnY3J5X21waV9jbXBfdWkgKGV4cCwgZV9pbnQpKQorICAgIGRpZSAoInRlc3RfcG93bV91aSBmYWlsZWQgZm9yIGV4cCBhdCAlZFxuIiwgX19MSU5FX18pOworCisgIC8qIE5vdyBjaGVjayBiYXNlIF4gYmFzZSBtb2QgbW9kLiAgKi8KKyAgZ2NyeV9tcGlfc2V0X3VpIChiYXNlLCBiX2ludCk7CisgIGdjcnlfbXBpX3NldF91aShtb2QsIG1faW50KTsKKyAgZ2NyeV9tcGlfcG93bSAocmVzLCBiYXNlLCBiYXNlLCBtb2QpOworICBpZiAoZ2NyeV9tcGlfY21wX3VpIChiYXNlLCBiX2ludCkpCisgICAgZGllICgidGVzdF9wb3dtIGZhaWxlZCBmb3IgYmFzZSBhdCAlZFxuIiwgX19MSU5FX18pOworICBpZiAoZ2NyeV9tcGlfY21wX3VpIChtb2QsIG1faW50KSkKKyAgICBkaWUgKCJ0ZXN0X3Bvd20gZmFpbGVkIGZvciBtb2QgYXQgJWRcbiIsIF9fTElORV9fKTsKKworICAvKiBDaGVjayBiYXNlIF4gYmFzZSBtb2QgbW9kIHdpdGggYmFzZSBhcyByZXN1bHQuICAqLworICBnY3J5X21waV9zZXRfdWkgKGJhc2UsIGJfaW50KTsKKyAgZ2NyeV9tcGlfc2V0X3VpKG1vZCwgbV9pbnQpOworICBnY3J5X21waV9wb3dtIChiYXNlLCBiYXNlLCBiYXNlLCBtb2QpOworICBpZiAoZ2NyeV9tcGlfY21wIChyZXMsIGJhc2UpKQorICAgIGRpZSAoInRlc3RfcG93bSBmYWlsZWQgYXQgJWRcbiIsIF9fTElORV9fKTsKKyAgaWYgKGdjcnlfbXBpX2NtcF91aSAobW9kLCBtX2ludCkpCisgICAgZGllICgidGVzdF9wb3dtIGZhaWxlZCBmb3IgbW9kIGF0ICVkXG4iLCBfX0xJTkVfXyk7CisKKyAgLyogQ2hlY2sgYmFzZSBeIGJhc2UgbW9kIG1vZCB3aXRoIG1vZCBhcyByZXN1bHQuICAqLworICBnY3J5X21waV9zZXRfdWkgKGJhc2UsIGJfaW50KTsKKyAgZ2NyeV9tcGlfc2V0X3VpKG1vZCwgbV9pbnQpOworICBnY3J5X21waV9wb3dtIChtb2QsIGJhc2UsIGJhc2UsIG1vZCk7CisgIGlmIChnY3J5X21waV9jbXAgKHJlcywgbW9kKSkKKyAgICBkaWUgKCJ0ZXN0X3Bvd20gZmFpbGVkIGF0ICVkXG4iLCBfX0xJTkVfXyk7CisgIGlmIChnY3J5X21waV9jbXBfdWkgKGJhc2UsIGJfaW50KSkKKyAgICBkaWUgKCJ0ZXN0X3Bvd20gZmFpbGVkIGZvciBiYXNlIGF0ICVkXG4iLCBfX0xJTkVfXyk7CisKKyAgLyogTm93IGNoZWNrIGJhc2UgXiBiYXNlIG1vZCBiYXNlLiAgKi8KKyAgZ2NyeV9tcGlfc2V0X3VpIChiYXNlLCBiX2ludCk7CisgIGdjcnlfbXBpX3Bvd20gKHJlcywgYmFzZSwgYmFzZSwgYmFzZSk7CisgIGlmIChnY3J5X21waV9jbXBfdWkgKGJhc2UsIGJfaW50KSkKKyAgICBkaWUgKCJ0ZXN0X3Bvd20gZmFpbGVkIGZvciBiYXNlIGF0ICVkXG4iLCBfX0xJTkVfXyk7CisKKyAgLyogQ2hlY2sgYmFzZSBeIGJhc2UgbW9kIGJhc2Ugd2l0aCBiYXNlIGFzIHJlc3VsdC4gICovCisgIGdjcnlfbXBpX3NldF91aSAoYmFzZSwgYl9pbnQpOworICBnY3J5X21waV9wb3dtIChiYXNlLCBiYXNlLCBiYXNlLCBiYXNlKTsKKyAgaWYgKGdjcnlfbXBpX2NtcCAocmVzLCBiYXNlKSkKKyAgICBkaWUgKCJ0ZXN0X3Bvd20gZmFpbGVkIGF0ICVkXG4iLCBfX0xJTkVfXyk7CisKKyAgLyogRml4bWU6IFdlIHNob3VsZCBhZGQgdGhlIHJlc3Qgb2YgdGhlIGNhc2VzIG9mIGNvdXJzZS4gICovCisKKworCisgIHJldHVybiAxOworfQorCisKK2ludCAKK21haW4gKGludCBhcmdjLCBjaGFyKiBhcmd2W10pCit7CisgIGlmIChhcmdjID4gMSAmJiAhc3RyY21wIChhcmd2WzFdLCAiLS12ZXJib3NlIikpCisgICAgdmVyYm9zZSA9IDE7CisgIGVsc2UgaWYgKGFyZ2MgPiAxICYmICFzdHJjbXAgKGFyZ3ZbMV0sICItLWRlYnVnIikpCisgICAgdmVyYm9zZSA9IGRlYnVnID0gMTsKKworICBpZiAoIWdjcnlfY2hlY2tfdmVyc2lvbiAoR0NSWVBUX1ZFUlNJT04pKQorICAgIHsKKyAgICAgIGZwdXRzICgidmVyc2lvbiBtaXNtYXRjaFxuIiwgc3RkZXJyKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKyAgZ2NyeV9jb250cm9sKEdDUllDVExfRElTQUJMRV9TRUNNRU0pOworCisgIHRlc3RfYWRkICgpOworICB0ZXN0X3N1YiAoKTsKKyAgdGVzdF9tdWwgKCk7CisgIHRlc3RfcG93bSAoKTsKKworICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L3Rlc3RzL3BrYmVuY2guYyBiL2xpYmdjcnlwdC0xLjQuNi90ZXN0cy9wa2JlbmNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdiOTRkYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi90ZXN0cy9wa2JlbmNoLmMKQEAgLTAsMCArMSw1MTQgQEAKKy8qIHBrYmVuY2guYyAtIFB1YmtleSBtZW5jaG1hcmtpbmcKKyAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Z2NyeXB0Lmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2lmbmRlZiBIQVZFX1czMl9TWVNURU0KKyMgaW5jbHVkZSA8c3lzL3RpbWVzLmg+CisjZW5kaWYgLypIQVZFX1czMl9TWVNURU0qLworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNkZWZpbmUgUEdNICJwa2JlbmNoIgorCisKK3N0YXRpYyBpbnQgdmVyYm9zZTsKK3N0YXRpYyBpbnQgZGVidWc7CitzdGF0aWMgaW50IGVycm9yX2NvdW50OworCisKK3R5cGVkZWYgc3RydWN0IGNvbnRleHQKK3sKKyAgZ2NyeV9zZXhwX3Qga2V5X3NlY3JldDsKKyAgZ2NyeV9zZXhwX3Qga2V5X3B1YmxpYzsKKyAgZ2NyeV9zZXhwX3QgZGF0YTsKKyAgZ2NyeV9zZXhwX3QgZGF0YV9lbmNyeXB0ZWQ7CisgIGdjcnlfc2V4cF90IGRhdGFfc2lnbmVkOworfSAqY29udGV4dF90OworCit0eXBlZGVmIGludCAoKndvcmtfdCkgKGNvbnRleHRfdCBjb250ZXh0LCB1bnNpZ25lZCBpbnQgZmluYWwpOworCisKK3N0YXRpYyB2b2lkCitmYWlsIChjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKyAgdmFfbGlzdCBhcmdfcHRyOworCisgIGZwdXRzICggUEdNICI6ICIsIHN0ZGVycik7CisgIHZhX3N0YXJ0IChhcmdfcHRyLCBmb3JtYXQpOworICB2ZnByaW50ZiAoc3RkZXJyLCBmb3JtYXQsIGFyZ19wdHIpOworICB2YV9lbmQgKGFyZ19wdHIpOworICBlcnJvcl9jb3VudCsrOworfQorCitzdGF0aWMgdm9pZAorZGllIChjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKyAgdmFfbGlzdCBhcmdfcHRyOworCisgIHB1dGNoYXIgKCdcbicpOworICBmcHV0cyAoIFBHTSAiOiAiLCBzdGRlcnIpOworICB2YV9zdGFydCAoYXJnX3B0ciwgZm9ybWF0KTsKKyAgdmZwcmludGYgKHN0ZGVyciwgZm9ybWF0LCBhcmdfcHRyKTsKKyAgdmFfZW5kIChhcmdfcHRyKTsKKyAgZXhpdCAoMSk7Cit9CisKK3N0YXRpYyB2b2lkCitzaG93X3NleHAgKGNvbnN0IGNoYXIgKnByZWZpeCwgZ2NyeV9zZXhwX3QgYSkKK3sKKyAgY2hhciAqYnVmOworICBzaXplX3Qgc2l6ZTsKKworICBmcHV0cyAocHJlZml4LCBzdGRlcnIpOworICBzaXplID0gZ2NyeV9zZXhwX3NwcmludCAoYSwgR0NSWVNFWFBfRk1UX0FEVkFOQ0VELCBOVUxMLCAwKTsKKyAgYnVmID0gZ2NyeV94bWFsbG9jIChzaXplKTsKKworICBnY3J5X3NleHBfc3ByaW50IChhLCBHQ1JZU0VYUF9GTVRfQURWQU5DRUQsIGJ1Ziwgc2l6ZSk7CisgIGZwcmludGYgKHN0ZGVyciwgIiUuKnMiLCAoaW50KXNpemUsIGJ1Zik7CisgIGdjcnlfZnJlZSAoYnVmKTsKK30KKworCitzdGF0aWMgdm9pZCAqCityZWFkX2ZpbGUgKGNvbnN0IGNoYXIgKmZuYW1lLCBzaXplX3QgKnJfbGVuZ3RoKQoreworICBGSUxFICpmcDsKKyAgc3RydWN0IHN0YXQgc3Q7CisgIGNoYXIgKmJ1ZjsKKyAgc2l6ZV90IGJ1ZmxlbjsKKyAgCisgIGZwID0gZm9wZW4gKGZuYW1lLCAicmIiKTsKKyAgaWYgKCFmcCkKKyAgICB7CisgICAgICBmYWlsICgiY2FuJ3Qgb3BlbiBgJXMnOiAlc1xuIiwgZm5hbWUsIHN0cmVycm9yIChlcnJubykpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAKKyAgaWYgKGZzdGF0IChmaWxlbm8oZnApLCAmc3QpKQorICAgIHsKKyAgICAgIGZhaWwgKCJjYW4ndCBzdGF0IGAlcyc6ICVzXG4iLCBmbmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBmY2xvc2UgKGZwKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBidWZsZW4gPSBzdC5zdF9zaXplOworICBidWYgPSBnY3J5X3htYWxsb2MgKGJ1ZmxlbisxKTsKKyAgaWYgKGZyZWFkIChidWYsIGJ1ZmxlbiwgMSwgZnApICE9IDEpCisgICAgeworICAgICAgZmFpbCAoImVycm9yIHJlYWRpbmcgYCVzJzogJXNcbiIsIGZuYW1lLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGZjbG9zZSAoZnApOworICAgICAgZ2NyeV9mcmVlIChidWYpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICBmY2xvc2UgKGZwKTsKKworICBpZiAocl9sZW5ndGgpCisgICAgKnJfbGVuZ3RoID0gYnVmbGVuOworICByZXR1cm4gYnVmOworfQorCisKKworc3RhdGljIHZvaWQKK2JlbmNobWFyayAod29ya190IHdvcmtlciwgY29udGV4dF90IGNvbnRleHQpCit7CisgIGNsb2NrX3QgdGltZXJfc3RhcnQsIHRpbWVyX3N0b3A7CisgIHVuc2lnbmVkIGludCBsb29wID0gMTA7CisgIHVuc2lnbmVkIGludCBpID0gMDsKKyAgc3RydWN0IHRtcyB0aW1lcjsKKyAgaW50IHJldCA9IDA7CisKKyNpZmRlZiBIQVZFX1czMl9TWVNURU0KKyAgdGltZXJfc3RhcnQgPSBjbG9jayAoKTsKKyNlbHNlCisgIHRpbWVzICgmdGltZXIpOworICB0aW1lcl9zdGFydCA9IHRpbWVyLnRtc191dGltZTsKKyNlbmRpZgorICBmb3IgKGkgPSAwOyBpIDwgbG9vcDsgaSsrKQorICAgIHsKKyAgICAgIHJldCA9ICgqd29ya2VyKSAoY29udGV4dCwgKGkgKyAxKSA9PSBsb29wKTsKKyAgICAgIGlmICghIHJldCkKKwlicmVhazsKKyAgICB9CisjaWZkZWYgSEFWRV9XMzJfU1lTVEVNCisgIHRpbWVyX3N0b3AgPSBjbG9jayAoKTsKKyNlbHNlCisgIHRpbWVzICgmdGltZXIpOworICB0aW1lcl9zdG9wID0gdGltZXIudG1zX3V0aW1lOworI2VuZGlmCisKKyAgaWYgKHJldCkKKyAgICBwcmludGYgKCIlLjBmIG1zXG4iLAorCSAgICAoKChkb3VibGUpICgodGltZXJfc3RvcCAtIHRpbWVyX3N0YXJ0KSAvIGxvb3ApKSAvIENMT0NLU19QRVJfU0VDKQorCSAgICAqIDEwMDAwMDAwKTsKKyAgZWxzZQorICAgIHByaW50ZiAoIltza2lwcGVkXVxuIik7Cit9CisKK3N0YXRpYyBpbnQKK3dvcmtfZW5jcnlwdCAoY29udGV4dF90IGNvbnRleHQsIHVuc2lnbmVkIGludCBmaW5hbCkKK3sKKyAgZ2NyeV9lcnJvcl90IGVyciA9IEdQR19FUlJfTk9fRVJST1I7CisgIGdjcnlfc2V4cF90IGRhdGFfZW5jcnlwdGVkID0gTlVMTDsKKyAgaW50IHJldCA9IDE7CisKKyAgZXJyID0gZ2NyeV9wa19lbmNyeXB0ICgmZGF0YV9lbmNyeXB0ZWQsCisJCQkgY29udGV4dC0+ZGF0YSwgY29udGV4dC0+a2V5X3B1YmxpYyk7CisgIGlmIChncGdfZXJyX2NvZGUgKGVycikgPT0gR1BHX0VSUl9OT1RfSU1QTEVNRU5URUQpCisgICAgeworICAgICAgZXJyID0gR1BHX0VSUl9OT19FUlJPUjsKKyAgICAgIHJldCA9IDA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYXNzZXJ0ICghIGVycik7CisKKyAgICAgIGlmIChmaW5hbCkKKwljb250ZXh0LT5kYXRhX2VuY3J5cHRlZCA9IGRhdGFfZW5jcnlwdGVkOworICAgICAgZWxzZQorCWdjcnlfc2V4cF9yZWxlYXNlIChkYXRhX2VuY3J5cHRlZCk7CisgICAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK3dvcmtfZGVjcnlwdCAoY29udGV4dF90IGNvbnRleHQsIHVuc2lnbmVkIGludCBmaW5hbCkKK3sKKyAgZ2NyeV9lcnJvcl90IGVyciA9IEdQR19FUlJfTk9fRVJST1I7CisgIGludCByZXQgPSAxOworCisgIGlmICghIGNvbnRleHQtPmRhdGFfZW5jcnlwdGVkKQorICAgIHJldCA9IDA7CisgIGVsc2UKKyAgICB7CisgICAgICBnY3J5X3NleHBfdCBkYXRhX2RlY3J5cHRlZCA9IE5VTEw7CisgICAgICAKKyAgICAgIGVyciA9IGdjcnlfcGtfZGVjcnlwdCAoJmRhdGFfZGVjcnlwdGVkLAorCQkJICAgICBjb250ZXh0LT5kYXRhX2VuY3J5cHRlZCwKKwkJCSAgICAgY29udGV4dC0+a2V5X3NlY3JldCk7CisgICAgICBhc3NlcnQgKCEgZXJyKTsKKyAgICAgIGlmIChmaW5hbCkKKwl7CisJICBnY3J5X3NleHBfcmVsZWFzZSAoY29udGV4dC0+ZGF0YV9lbmNyeXB0ZWQpOworCSAgY29udGV4dC0+ZGF0YV9lbmNyeXB0ZWQgPSBOVUxMOworCX0KKyAgICAgIGdjcnlfc2V4cF9yZWxlYXNlIChkYXRhX2RlY3J5cHRlZCk7CisgICAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK3dvcmtfc2lnbiAoY29udGV4dF90IGNvbnRleHQsIHVuc2lnbmVkIGludCBmaW5hbCkKK3sKKyAgZ2NyeV9lcnJvcl90IGVyciA9IEdQR19FUlJfTk9fRVJST1I7CisgIGdjcnlfc2V4cF90IGRhdGFfc2lnbmVkID0gTlVMTDsKKyAgaW50IHJldCA9IDE7CisKKyAgZXJyID0gZ2NyeV9wa19zaWduICgmZGF0YV9zaWduZWQsCisJCSAgICAgIGNvbnRleHQtPmRhdGEsIGNvbnRleHQtPmtleV9zZWNyZXQpOworICBpZiAoZ3BnX2Vycl9jb2RlIChlcnIpID09IEdQR19FUlJfTk9UX0lNUExFTUVOVEVEKQorICAgIHsKKyAgICAgIGVyciA9IEdQR19FUlJfTk9fRVJST1I7CisgICAgICByZXQgPSAwOworICAgIH0KKyAgZWxzZSBpZiAoZXJyKQorICAgIHsKKyAgICAgIGZhaWwgKCJwa19zaWduIGZhaWxlZDogJXNcbiIsIGdwZ19zdHJlcnJvciAoZXJyKSk7CisgICAgICByZXQgPSAwOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChmaW5hbCkKKwljb250ZXh0LT5kYXRhX3NpZ25lZCA9IGRhdGFfc2lnbmVkOworICAgICAgZWxzZQorCWdjcnlfc2V4cF9yZWxlYXNlIChkYXRhX3NpZ25lZCk7CisgICAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK3dvcmtfdmVyaWZ5IChjb250ZXh0X3QgY29udGV4dCwgdW5zaWduZWQgaW50IGZpbmFsKQoreworICBnY3J5X2Vycm9yX3QgZXJyID0gR1BHX0VSUl9OT19FUlJPUjsKKyAgaW50IHJldCA9IDE7CisKKyAgaWYgKCFjb250ZXh0LT5kYXRhX3NpZ25lZCkKKyAgICByZXR1cm4gMDsKKworICBlcnIgPSBnY3J5X3BrX3ZlcmlmeSAoY29udGV4dC0+ZGF0YV9zaWduZWQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+a2V5X3B1YmxpYyk7CisgIGlmIChlcnIpCisgICAgeworICAgICAgc2hvd19zZXhwICgiZGF0YV9zaWduZWQ6XG4iLCBjb250ZXh0LT5kYXRhX3NpZ25lZCk7CisgICAgICBzaG93X3NleHAgKCJkYXRhOlxuIiwgY29udGV4dC0+ZGF0YSk7CisgICAgICBmYWlsICgicGtfdmVyaWZ5IGZhaWxlZDogJXNcbiIsIGdwZ19zdHJlcnJvciAoZXJyKSk7CisgICAgICByZXQgPSAwOworICAgIH0KKyAgZWxzZSBpZiAoZmluYWwpCisgICAgeworICAgICAgZ2NyeV9zZXhwX3JlbGVhc2UgKGNvbnRleHQtPmRhdGFfc2lnbmVkKTsKKyAgICAgIGNvbnRleHQtPmRhdGFfc2lnbmVkID0gTlVMTDsKKyAgICB9CisgICAgCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitwcm9jZXNzX2tleV9wYWlyIChjb250ZXh0X3QgY29udGV4dCkKK3sKKyAgc3RydWN0CisgIHsKKyAgICB3b3JrX3Qgd29ya2VyOworICAgIGNvbnN0IGNoYXIgKmlkZW50aWZpZXI7CisgIH0gd29ya2VyX2Z1bmN0aW9uc1tdID0geyB7IHdvcmtfZW5jcnlwdCwgImVuY3J5cHQiIH0sCisJCQkgICB7IHdvcmtfZGVjcnlwdCwgImRlY3J5cHQiIH0sCisJCQkgICB7IHdvcmtfc2lnbiwgICAgInNpZ24iICAgIH0sCisJCQkgICB7IHdvcmtfdmVyaWZ5LCAgInZlcmlmeSIgIH0gfTsKKyAgdW5zaWduZWQgaW50IGkgPSAwOworCisgIGZvciAoaSA9IDA7IGkgPCAoc2l6ZW9mICh3b3JrZXJfZnVuY3Rpb25zKSAvIHNpemVvZiAoKndvcmtlcl9mdW5jdGlvbnMpKTsgaSsrKQorICAgIHsKKyAgICAgIHByaW50ZiAoIiVzOiAiLCB3b3JrZXJfZnVuY3Rpb25zW2ldLmlkZW50aWZpZXIpOworICAgICAgYmVuY2htYXJrICh3b3JrZXJfZnVuY3Rpb25zW2ldLndvcmtlciwgY29udGV4dCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorY29udGV4dF9pbml0IChjb250ZXh0X3QgY29udGV4dCwgZ2NyeV9zZXhwX3Qga2V5X3NlY3JldCwgZ2NyeV9zZXhwX3Qga2V5X3B1YmxpYykKK3sKKyAgZ2NyeV9lcnJvcl90IGVyciA9IEdQR19FUlJfTk9fRVJST1I7CisgIHVuc2lnbmVkIGludCBrZXlfc2l6ZSA9IDA7CisgIGdjcnlfbXBpX3QgZGF0YSA9IE5VTEw7CisgIGdjcnlfc2V4cF90IGRhdGFfc2V4cCA9IE5VTEw7CisKKyAga2V5X3NpemUgPSBnY3J5X3BrX2dldF9uYml0cyAoa2V5X3NlY3JldCk7CisgIGFzc2VydCAoa2V5X3NpemUpOworCisgIGRhdGEgPSBnY3J5X21waV9uZXcgKGtleV9zaXplKTsKKyAgYXNzZXJ0IChkYXRhKTsKKworICBnY3J5X21waV9yYW5kb21pemUgKGRhdGEsIGtleV9zaXplLCBHQ1JZX1NUUk9OR19SQU5ET00pOworICBnY3J5X21waV9jbGVhcl9iaXQgKGRhdGEsIGtleV9zaXplIC0gMSk7CisgIGVyciA9IGdjcnlfc2V4cF9idWlsZCAoJmRhdGFfc2V4cCwgTlVMTCwKKwkJCSAiKGRhdGEgKGZsYWdzIHJhdykgKHZhbHVlICVtKSkiLAorCQkJIGRhdGEpOworICBhc3NlcnQgKCEgZXJyKTsKKyAgZ2NyeV9tcGlfcmVsZWFzZSAoZGF0YSk7CisKKyAgY29udGV4dC0+a2V5X3NlY3JldCA9IGtleV9zZWNyZXQ7CisgIGNvbnRleHQtPmtleV9wdWJsaWMgPSBrZXlfcHVibGljOworICBjb250ZXh0LT5kYXRhID0gZGF0YV9zZXhwOworICBjb250ZXh0LT5kYXRhX2VuY3J5cHRlZCA9IE5VTEw7CisgIGNvbnRleHQtPmRhdGFfc2lnbmVkID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2NvbnRleHRfZGVzdHJveSAoY29udGV4dF90IGNvbnRleHQpCit7CisgIGdjcnlfc2V4cF9yZWxlYXNlIChjb250ZXh0LT5rZXlfc2VjcmV0KTsKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKGNvbnRleHQtPmtleV9wdWJsaWMpOworICBnY3J5X3NleHBfcmVsZWFzZSAoY29udGV4dC0+ZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkCitwcm9jZXNzX2tleV9wYWlyX2ZpbGUgKGNvbnN0IGNoYXIgKmtleV9wYWlyX2ZpbGUpCit7CisgIGdjcnlfZXJyb3JfdCBlcnIgPSBHUEdfRVJSX05PX0VSUk9SOworICB2b2lkICprZXlfcGFpcl9idWZmZXIgPSBOVUxMOworICBnY3J5X3NleHBfdCBrZXlfcGFpcl9zZXhwID0gTlVMTDsKKyAgZ2NyeV9zZXhwX3Qga2V5X3NlY3JldF9zZXhwID0gTlVMTDsKKyAgZ2NyeV9zZXhwX3Qga2V5X3B1YmxpY19zZXhwID0gTlVMTDsKKyAgc3RydWN0IGNvbnRleHQgY29udGV4dCA9IHsgTlVMTCB9OworICBzaXplX3QgZmlsZV9sZW5ndGg7CisKKyAga2V5X3BhaXJfYnVmZmVyID0gcmVhZF9maWxlIChrZXlfcGFpcl9maWxlLCAmZmlsZV9sZW5ndGgpOworICBpZiAoIWtleV9wYWlyX2J1ZmZlcikKKyAgICBkaWUgKCJmYWlsZWQgdG8gb3BlbiBgJXMnXG4iLCBrZXlfcGFpcl9maWxlKTsKKworICBlcnIgPSBnY3J5X3NleHBfc3NjYW4gKCZrZXlfcGFpcl9zZXhwLCBOVUxMLAorCQkJIGtleV9wYWlyX2J1ZmZlciwgZmlsZV9sZW5ndGgpOworICBpZiAoZXJyKQorICAgIGRpZSAoImdjcnlfc2V4cF9zc2NhbiBmYWlsZWRcbiIpOworCisgIGtleV9zZWNyZXRfc2V4cCA9IGdjcnlfc2V4cF9maW5kX3Rva2VuIChrZXlfcGFpcl9zZXhwLCAicHJpdmF0ZS1rZXkiLCAwKTsKKyAgYXNzZXJ0IChrZXlfc2VjcmV0X3NleHApOworICBrZXlfcHVibGljX3NleHAgPSBnY3J5X3NleHBfZmluZF90b2tlbiAoa2V5X3BhaXJfc2V4cCwgInB1YmxpYy1rZXkiLCAwKTsKKyAgYXNzZXJ0IChrZXlfcHVibGljX3NleHApOworCisgIGdjcnlfc2V4cF9yZWxlYXNlIChrZXlfcGFpcl9zZXhwKTsKKworICBjb250ZXh0X2luaXQgKCZjb250ZXh0LCBrZXlfc2VjcmV0X3NleHAsIGtleV9wdWJsaWNfc2V4cCk7CisKKyAgcHJpbnRmICgiS2V5IGZpbGU6ICVzXG4iLCBrZXlfcGFpcl9maWxlKTsKKyAgcHJvY2Vzc19rZXlfcGFpciAoJmNvbnRleHQpOworICBwcmludGYgKCJcbiIpOworCisgIGNvbnRleHRfZGVzdHJveSAoJmNvbnRleHQpOworICBnY3J5X2ZyZWUgKGtleV9wYWlyX2J1ZmZlcik7Cit9CisKKworc3RhdGljIHZvaWQKK2dlbmVyYXRlX2tleSAoY29uc3QgY2hhciAqYWxnb3JpdGhtLCBjb25zdCBjaGFyICprZXlfc2l6ZSkKK3sKKyAgZ2NyeV9lcnJvcl90IGVyciA9IEdQR19FUlJfTk9fRVJST1I7CisgIHNpemVfdCBrZXlfcGFpcl9idWZmZXJfc2l6ZSA9IDA7CisgIGNoYXIgKmtleV9wYWlyX2J1ZmZlciA9IE5VTEw7CisgIGdjcnlfc2V4cF90IGtleV9zcGVjID0gTlVMTDsKKyAgZ2NyeV9zZXhwX3Qga2V5X3BhaXIgPSBOVUxMOworCisgIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgaW50KSprZXlfc2l6ZSkpCisgICAgZXJyID0gZ2NyeV9zZXhwX2J1aWxkICgma2V5X3NwZWMsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiKGdlbmtleSAoJXMgKG5iaXRzICVzKSkpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZ29yaXRobSwga2V5X3NpemUpOworICBlbHNlCisgICAgZXJyID0gZ2NyeV9zZXhwX2J1aWxkICgma2V5X3NwZWMsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiKGdlbmtleSAoJXMgKGN1cnZlICVzKSkpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZ29yaXRobSwga2V5X3NpemUpOworICBpZiAoZXJyKQorICAgIGRpZSAoInNleHBfYnVpbGQgZmFpbGVkOiAlc1xuIiwgZ3BnX3N0cmVycm9yIChlcnIpKTsKKworICBlcnIgPSBnY3J5X3BrX2dlbmtleSAoJmtleV9wYWlyLCBrZXlfc3BlYyk7CisgIGlmIChlcnIpCisgICAgeworICAgICAgc2hvd19zZXhwICgicmVxdWVzdDpcbiIsIGtleV9zcGVjKTsKKyAgICAgIGRpZSAoInBrX2dlbmtleSBmYWlsZWQ6ICVzXG4iLCBncGdfc3RyZXJyb3IgKGVycikpOworICAgIH0KKworICBrZXlfcGFpcl9idWZmZXJfc2l6ZSA9IGdjcnlfc2V4cF9zcHJpbnQgKGtleV9wYWlyLCBHQ1JZU0VYUF9GTVRfQURWQU5DRUQsCisJCQkJCSAgIE5VTEwsIDApOworICBrZXlfcGFpcl9idWZmZXIgPSBnY3J5X3htYWxsb2MgKGtleV9wYWlyX2J1ZmZlcl9zaXplKTsKKworICBnY3J5X3NleHBfc3ByaW50IChrZXlfcGFpciwgR0NSWVNFWFBfRk1UX0FEVkFOQ0VELAorCQkgICAga2V5X3BhaXJfYnVmZmVyLCBrZXlfcGFpcl9idWZmZXJfc2l6ZSk7CisKKyAgcHJpbnRmICgiJS4qcyIsIChpbnQpa2V5X3BhaXJfYnVmZmVyX3NpemUsIGtleV9wYWlyX2J1ZmZlcik7CisgIGdjcnlfZnJlZSAoa2V5X3BhaXJfYnVmZmVyKTsKK30KKworCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBpbnQgbGFzdF9hcmdjID0gLTE7CisgIGludCBnZW5rZXlfbW9kZSA9IDA7CisgIGludCBmaXBzX21vZGUgPSAwOworCisgIGlmIChhcmdjKQorICAgIHsgYXJnYy0tOyBhcmd2Kys7IH0KKworICB3aGlsZSAoYXJnYyAmJiBsYXN0X2FyZ2MgIT0gYXJnYyApCisgICAgeworICAgICAgbGFzdF9hcmdjID0gYXJnYzsKKyAgICAgIGlmICghc3RyY21wICgqYXJndiwgIi0tIikpCisgICAgICAgIHsKKyAgICAgICAgICBhcmdjLS07IGFyZ3YrKzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3YsICItLWhlbHAiKSkKKyAgICAgICAgeworICAgICAgICAgIHB1dHMgKCJVc2FnZTogIiBQR00gIiBbT1BUSU9OU10gW0ZJTEVTXVxuIgorICAgICAgICAgICAgICAgICJWYXJpb3VzIHB1YmxpYyBrZXkgdGVzdHM6XG5cbiIKKyAgICAgICAgICAgICAgICAiICBEZWZhdWx0IGlzIHRvIHByb2Nlc3MgYWxsIGdpdmVuIGtleSBmaWxlc1xuXG4iCisgICAgICAgICAgICAgICAgIiAgLS1nZW5rZXkgQUxHT05BTUUgU0laRSAgR2VuZXJhdGUgYSBwdWJsaWMga2V5XG4iCisgICAgICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgICAgICIgIC0tdmVyYm9zZSAgICBlbmFibGUgZXh0cmEgaW5mb3JtYXRpb25hbCBvdXRwdXRcbiIKKyAgICAgICAgICAgICAgICAiICAtLWRlYnVnICAgICAgZW5hYmxlIGFkZGl0aW9uYWwgZGVidWcgb3V0cHV0XG4iCisgICAgICAgICAgICAgICAgIiAgLS1oZWxwICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0XG5cbiIpOworICAgICAgICAgIGV4aXQgKDApOworICAgICAgICB9CisgICAgICBlbHNlIGlmICghc3RyY21wICgqYXJndiwgIi0tdmVyYm9zZSIpKQorICAgICAgICB7CisgICAgICAgICAgdmVyYm9zZSsrOworICAgICAgICAgIGFyZ2MtLTsgYXJndisrOworICAgICAgICB9CisgICAgICBlbHNlIGlmICghc3RyY21wICgqYXJndiwgIi0tZGVidWciKSkKKyAgICAgICAgeworICAgICAgICAgIHZlcmJvc2UgPSBkZWJ1ZyA9IDE7CisgICAgICAgICAgYXJnYy0tOyBhcmd2Kys7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKCphcmd2LCAiLS1nZW5rZXkiKSkKKyAgICAgICAgeworICAgICAgICAgIGdlbmtleV9tb2RlID0gMTsKKyAgICAgICAgICBhcmdjLS07IGFyZ3YrKzsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3YsICItLWZpcHMiKSkKKyAgICAgICAgeworICAgICAgICAgIGZpcHNfbW9kZSA9IDE7CisgICAgICAgICAgYXJnYy0tOyBhcmd2Kys7CisgICAgICAgIH0KKyAgICB9ICAgICAgICAgIAorCisgIGdjcnlfY29udHJvbCAoR0NSWUNUTF9TRVRfVkVSQk9TSVRZLCAoaW50KXZlcmJvc2UpOworCisgIGlmIChmaXBzX21vZGUpCisgICAgZ2NyeV9jb250cm9sIChHQ1JZQ1RMX0ZPUkNFX0ZJUFNfTU9ERSwgMCk7CisKKyAgZ2NyeV9jb250cm9sIChHQ1JZQ1RMX0RJU0FCTEVfU0VDTUVNKTsKKyAgaWYgKCFnY3J5X2NoZWNrX3ZlcnNpb24gKEdDUllQVF9WRVJTSU9OKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsIFBHTSAiOiB2ZXJzaW9uIG1pc21hdGNoXG4iKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBpZiAoZ2Vua2V5X21vZGUpCisgICAgeworICAgICAgLyogTm8gdmFsdWFibGUga2V5cyBhcmUgY3JlYXRlLCBzbyB3ZSBjYW4gc3BlZWQgdXAgb3VyIFJORy4gKi8KKyAgICAgIGdjcnlfY29udHJvbCAoR0NSWUNUTF9FTkFCTEVfUVVJQ0tfUkFORE9NLCAwKTsKKyAgICB9IAorICBpZiAoZGVidWcpCisgICAgZ2NyeV9jb250cm9sIChHQ1JZQ1RMX1NFVF9ERUJVR19GTEFHUywgMXUsIDApOworICBnY3J5X2NvbnRyb2wgKEdDUllDVExfSU5JVElBTElaQVRJT05fRklOSVNIRUQsIDApOworCisgIAorICBpZiAoZ2Vua2V5X21vZGUgJiYgYXJnYyA9PSAyKQorICAgIHsKKyAgICAgIGdlbmVyYXRlX2tleSAoYXJndlswXSwgYXJndlsxXSk7CisgICAgfQorICBlbHNlIGlmICghZ2Vua2V5X21vZGUgJiYgYXJnYykKKyAgICB7CisgICAgICBpbnQgaTsKKyAgICAgIAorICAgICAgZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykKKwlwcm9jZXNzX2tleV9wYWlyX2ZpbGUgKGFyZ3ZbaV0pOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgInVzYWdlOiAiIFBHTQorICAgICAgICAgICAgICAgIiBbT1BUSU9OU10gW0ZJTEVTXSAodHJ5IC0taGVscCBmb3IgbW9yZSBpbmZvcm1hdGlvbilcbiIpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorICAKKyAgcmV0dXJuIGVycm9yX2NvdW50ID8gMSA6IDA7Cit9CmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvdGVzdHMvcHJpbWUuYyBiL2xpYmdjcnlwdC0xLjQuNi90ZXN0cy9wcmltZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYmNjODkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvdGVzdHMvcHJpbWUuYwpAQCAtMCwwICsxLDEyMiBAQAorLyogcHJpbWUuYyAtIHBhcnQgb2YgdGhlIExpYmdjcnlwdCB0ZXN0IHN1aXRlLgorICAgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgICBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAgIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiLi4vc3JjL2djcnlwdC5oIgorCitzdGF0aWMgaW50IHZlcmJvc2U7CisKK3N0YXRpYyB2b2lkCitkaWUgKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICB2YV9saXN0IGFyZ19wdHI7CisKKyAgdmFfc3RhcnQgKGFyZ19wdHIsIGZvcm1hdCk7CisgIHZmcHJpbnRmIChzdGRlcnIsIGZvcm1hdCwgYXJnX3B0cik7CisgIHZhX2VuZCAoYXJnX3B0cik7CisgIGV4aXQgKDEpOworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfcHJpbWVzICh2b2lkKQoreworICBnY3J5X2Vycm9yX3QgZXJyID0gR1BHX0VSUl9OT19FUlJPUjsKKyAgZ2NyeV9tcGlfdCAqZmFjdG9ycyA9IE5VTEw7CisgIGdjcnlfbXBpX3QgcHJpbWUgPSBOVUxMOworICBnY3J5X21waV90IGc7CisgIHVuc2lnbmVkIGludCBpID0gMDsKKyAgc3RydWN0IHByaW1lX3NwZWMKKyAgeworICAgIHVuc2lnbmVkIGludCBwcmltZV9iaXRzOworICAgIHVuc2lnbmVkIGludCBmYWN0b3JfYml0czsKKyAgICB1bnNpZ25lZCBpbnQgZmxhZ3M7CisgIH0gcHJpbWVfc3BlY3NbXSA9CisgICAgeworICAgICAgeyAxMDI0LCAxMDAsIEdDUllfUFJJTUVfRkxBR19TUEVDSUFMX0ZBQ1RPUiB9LAorICAgICAgeyAxMjgsIDAsIDAgfSwKKyAgICAgIHsgMCB9LAorICAgIH07CisKKyAgZm9yIChpID0gMDsgcHJpbWVfc3BlY3NbaV0ucHJpbWVfYml0czsgaSsrKQorICAgIHsKKyAgICAgIGVyciA9IGdjcnlfcHJpbWVfZ2VuZXJhdGUgKCZwcmltZSwKKwkJCQkgcHJpbWVfc3BlY3NbaV0ucHJpbWVfYml0cywKKwkJCQkgcHJpbWVfc3BlY3NbaV0uZmFjdG9yX2JpdHMsCisJCQkJICZmYWN0b3JzLAorCQkJCSBOVUxMLCBOVUxMLAorCQkJCSBHQ1JZX1dFQUtfUkFORE9NLAorCQkJCSBwcmltZV9zcGVjc1tpXS5mbGFncyk7CisgICAgICBhc3NlcnQgKCEgZXJyKTsKKyAgICAgIGlmICh2ZXJib3NlKQorICAgICAgICB7CisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAidGVzdCAlZDogcCA9ICIsIGkpOworICAgICAgICAgIGdjcnlfbXBpX2R1bXAgKHByaW1lKTsKKyAgICAgICAgICBwdXRjICgnXG4nLCBzdGRlcnIpOworICAgICAgICB9CisKKyAgICAgIGVyciA9IGdjcnlfcHJpbWVfY2hlY2sgKHByaW1lLCAwKTsKKyAgICAgIGFzc2VydCAoISBlcnIpOworCisgICAgICBlcnIgPSBnY3J5X3ByaW1lX2dyb3VwX2dlbmVyYXRvciAoJmcsIHByaW1lLCBmYWN0b3JzLCBOVUxMKTsKKyAgICAgIGFzc2VydCAoIWVycik7CisgICAgICBnY3J5X3ByaW1lX3JlbGVhc2VfZmFjdG9ycyAoZmFjdG9ycyk7IGZhY3RvcnMgPSBOVUxMOworICAgICAgCisgICAgICBpZiAodmVyYm9zZSkKKyAgICAgICAgeworICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAgICAgJWQ6IGcgPSAiLCBpKTsKKyAgICAgICAgICBnY3J5X21waV9kdW1wIChnKTsKKyAgICAgICAgICBwdXRjICgnXG4nLCBzdGRlcnIpOworICAgICAgICB9CisgICAgICBnY3J5X21waV9yZWxlYXNlIChnKTsKKworCisgICAgICBnY3J5X21waV9hZGRfdWkgKHByaW1lLCBwcmltZSwgMSk7CisgICAgICBlcnIgPSBnY3J5X3ByaW1lX2NoZWNrIChwcmltZSwgMCk7CisgICAgICBhc3NlcnQgKGVycik7CisgICAgfQorfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgaW50IGRlYnVnID0gMDsKKworICBpZiAoKGFyZ2MgPiAxKSAmJiAoISBzdHJjbXAgKGFyZ3ZbMV0sICItLXZlcmJvc2UiKSkpCisgICAgdmVyYm9zZSA9IDE7CisgIGVsc2UgaWYgKChhcmdjID4gMSkgJiYgKCEgc3RyY21wIChhcmd2WzFdLCAiLS1kZWJ1ZyIpKSkKKyAgICB2ZXJib3NlID0gZGVidWcgPSAxOworCisgIGdjcnlfY29udHJvbCAoR0NSWUNUTF9ESVNBQkxFX1NFQ01FTSwgMCk7CisgIGlmICghIGdjcnlfY2hlY2tfdmVyc2lvbiAoR0NSWVBUX1ZFUlNJT04pKQorICAgIGRpZSAoInZlcnNpb24gbWlzbWF0Y2hcbiIpOworCisgIGdjcnlfY29udHJvbCAoR0NSWUNUTF9JTklUSUFMSVpBVElPTl9GSU5JU0hFRCwgMCk7CisgIGlmIChkZWJ1ZykKKyAgICBnY3J5X2NvbnRyb2wgKEdDUllDVExfU0VUX0RFQlVHX0ZMQUdTLCAxdSwgMCk7CisKKyAgY2hlY2tfcHJpbWVzICgpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L3Rlc3RzL3B1YmtleS5jIGIvbGliZ2NyeXB0LTEuNC42L3Rlc3RzL3B1YmtleS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZWM0NjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvdGVzdHMvcHVia2V5LmMKQEAgLTAsMCArMSw4OTAgQEAKKy8qIHB1YmtleS5jIC0gUHVibGljIGtleSBlbmNyeXB0aW9uL2RlY3J5cHRpb24gdGVzdHMKKyAqCUNvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMaWJnY3J5cHQuCisgKgorICogTGliZ2NyeXB0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKworI2luY2x1ZGUgIi4uL3NyYy9nY3J5cHQuaCIKKworLyogU2FtcGxlIFJTQSBrZXlzLCB0YWtlbiBmcm9tIGJhc2ljLmMuICAqLworCitzdGF0aWMgY29uc3QgY2hhciBzYW1wbGVfcHJpdmF0ZV9rZXlfMVtdID0KKyIocHJpdmF0ZS1rZXlcbiIKKyIgKG9wZW5wZ3AtcnNhXG4iCisiICAobiAjMDBlMGNlOTZmOTBiNmM5ZTAyZjM5MjJiZWFkYTkzZmU1MGE4NzVlYWM2YmNjMThiYjlhOWNmMmU4NDk2NWNhYSIKKyAgICAgICIyZDFmZjk1YTdmNTQyNDY1YzZjMGMxOWQyNzZlNDUyNmNlMDQ4ODY4YTdhOTE0ZmQzNDNjYzNhODdkZDc0MjkxIgorICAgICAgImZmYzU2NTUwNmQ1YmJiMjVjYmFjNmEwZTJkZDFmOGJjYWFiMGQ0YTI5YzJmMzdjOTUwZjM2MzQ4NGJmMjY5ZjciCisgICAgICAiODkxNDQwNDY0YmFmNzk4MjdlMDNhMzZlNzBiODE0OTM4ZWViZGM2M2U5NjQyNDdiZTc1ZGM1OGIwMTRiN2VhMjUxIylcbiIKKyIgIChlICMwMTAwMDEjKVxuIgorIiAgKGQgIzA0NjEyOUYyNDg5RDcxNTc5QkUwQTc1RkUwMjlCRDZDREI1NzRFQkY1N0VBOEE1QjBGREE5NDJDQUI5NDNCMTEiCisgICAgICAiN0Q3QkI5NUU1RDI4ODc1RTBGOUZDNUZDQzA2QTcyRjZENTAyNDY0REFCREVENzhFRjZCNzE2MTc3QjgzRDVCRCIKKyAgICAgICJDNTQzREM1RDNGRUQ5MzJFNTlGNTg5N0U5MkU2RjU4QTBGMzM0MjQxMDZBM0I2RkEyQ0JGODc3NTEwRTRBQzIxIgorICAgICAgIkMzRUU0Nzg1MUU5N0QxMjk5NjIyMkFDMzU2NkQ0Q0NCMEI4M0QxNjQwNzRBQkY3REU2NTVGQzI0NDZEQTE3ODEjKVxuIgorIiAgKHAgIzAwZTg2MWI3MDBlMTdlOGFmZTY4MzdlNzUxMmUzNWI2Y2ExMWQwYWU0N2Q4Yjg1MTYxYzY3YmFmNjQzNzcyMTMiCisgICAgICAiZmU1MmQ3NzJmMjAzNWIzY2E4MzBhZjQxZDhhNDEyMGUxYzFjNzBkMTJjYzIyZjAwZDI4ZDMxZGQ0OGE4ZDQyNGYxIylcbiIKKyIgIChxICMwMGY3YTdjYTUzNjdjNjYxZjhlNjJkZjM0ZjBkMDVjMTBjODhlNTQ5MjM0OGRkN2JkZGM5NDJjOWE4ZjM2OWY5IgorICAgICAgIjM1YTA3Nzg1ZDJkYjgwNTIxNWVkNzg2ZTQyODVkZjE2NThlZWQzY2U4NGY0NjliODFiNTBkMzU4NDA3YjRhZDM2MSMpXG4iCisiICAodSAjMzA0NTU5YTllYWQ1NmQyMzA5ZDIwMzgxMWE2NDFiYjFhMDk2MjZiYzhlYjM2ZmZmYTIzYzk2OGVjNWJkODkxZSIKKyAgICAgICJlYmJhZmM3M2FlNjY2ZTAxYmE3Yzg5OTBiYWUwNmNjMmJiZTEwYjc1ZTY5ZmNhY2IzNTNhNjQ3MzA3OWQ4ZTliIylcbiIKKyIgKVxuIgorIilcbiI7CisKKy8qIFRoZSBzYW1lIGtleSBhcyBhYm92ZSBidXQgd2l0aG91dCBwLCBxIGFuZCB1IHRvIHRlc3QgdGhlIG5vbiBDUlQgY2FzZS4gKi8KK3N0YXRpYyBjb25zdCBjaGFyIHNhbXBsZV9wcml2YXRlX2tleV8xXzFbXSA9CisiKHByaXZhdGUta2V5XG4iCisiIChvcGVucGdwLXJzYVxuIgorIiAgKG4gIzAwZTBjZTk2ZjkwYjZjOWUwMmYzOTIyYmVhZGE5M2ZlNTBhODc1ZWFjNmJjYzE4YmI5YTljZjJlODQ5NjVjYWEiCisgICAgICAiMmQxZmY5NWE3ZjU0MjQ2NWM2YzBjMTlkMjc2ZTQ1MjZjZTA0ODg2OGE3YTkxNGZkMzQzY2MzYTg3ZGQ3NDI5MSIKKyAgICAgICJmZmM1NjU1MDZkNWJiYjI1Y2JhYzZhMGUyZGQxZjhiY2FhYjBkNGEyOWMyZjM3Yzk1MGYzNjM0ODRiZjI2OWY3IgorICAgICAgIjg5MTQ0MDQ2NGJhZjc5ODI3ZTAzYTM2ZTcwYjgxNDkzOGVlYmRjNjNlOTY0MjQ3YmU3NWRjNThiMDE0YjdlYTI1MSMpXG4iCisiICAoZSAjMDEwMDAxIylcbiIKKyIgIChkICMwNDYxMjlGMjQ4OUQ3MTU3OUJFMEE3NUZFMDI5QkQ2Q0RCNTc0RUJGNTdFQThBNUIwRkRBOTQyQ0FCOTQzQjExIgorICAgICAgIjdEN0JCOTVFNUQyODg3NUUwRjlGQzVGQ0MwNkE3MkY2RDUwMjQ2NERBQkRFRDc4RUY2QjcxNjE3N0I4M0Q1QkQiCisgICAgICAiQzU0M0RDNUQzRkVEOTMyRTU5RjU4OTdFOTJFNkY1OEEwRjMzNDI0MTA2QTNCNkZBMkNCRjg3NzUxMEU0QUMyMSIKKyAgICAgICJDM0VFNDc4NTFFOTdEMTI5OTYyMjJBQzM1NjZENENDQjBCODNEMTY0MDc0QUJGN0RFNjU1RkMyNDQ2REExNzgxIylcbiIKKyIgKVxuIgorIilcbiI7CisKKy8qIFRoZSBzYW1lIGtleSBhcyBhYm92ZSBidXQganVzdCB3aXRob3V0IHEgdG8gdGVzdCB0aGUgbm9uIENSVCBjYXNlLiAgVGhpcworICAgc2hvdWxkIGZhaWwuICovCitzdGF0aWMgY29uc3QgY2hhciBzYW1wbGVfcHJpdmF0ZV9rZXlfMV8yW10gPQorIihwcml2YXRlLWtleVxuIgorIiAob3BlbnBncC1yc2FcbiIKKyIgIChuICMwMGUwY2U5NmY5MGI2YzllMDJmMzkyMmJlYWRhOTNmZTUwYTg3NWVhYzZiY2MxOGJiOWE5Y2YyZTg0OTY1Y2FhIgorICAgICAgIjJkMWZmOTVhN2Y1NDI0NjVjNmMwYzE5ZDI3NmU0NTI2Y2UwNDg4NjhhN2E5MTRmZDM0M2NjM2E4N2RkNzQyOTEiCisgICAgICAiZmZjNTY1NTA2ZDViYmIyNWNiYWM2YTBlMmRkMWY4YmNhYWIwZDRhMjljMmYzN2M5NTBmMzYzNDg0YmYyNjlmNyIKKyAgICAgICI4OTE0NDA0NjRiYWY3OTgyN2UwM2EzNmU3MGI4MTQ5MzhlZWJkYzYzZTk2NDI0N2JlNzVkYzU4YjAxNGI3ZWEyNTEjKVxuIgorIiAgKGUgIzAxMDAwMSMpXG4iCisiICAoZCAjMDQ2MTI5RjI0ODlENzE1NzlCRTBBNzVGRTAyOUJENkNEQjU3NEVCRjU3RUE4QTVCMEZEQTk0MkNBQjk0M0IxMSIKKyAgICAgICI3RDdCQjk1RTVEMjg4NzVFMEY5RkM1RkNDMDZBNzJGNkQ1MDI0NjREQUJERUQ3OEVGNkI3MTYxNzdCODNENUJEIgorICAgICAgIkM1NDNEQzVEM0ZFRDkzMkU1OUY1ODk3RTkyRTZGNThBMEYzMzQyNDEwNkEzQjZGQTJDQkY4Nzc1MTBFNEFDMjEiCisgICAgICAiQzNFRTQ3ODUxRTk3RDEyOTk2MjIyQUMzNTY2RDRDQ0IwQjgzRDE2NDA3NEFCRjdERTY1NUZDMjQ0NkRBMTc4MSMpXG4iCisiICAocCAjMDBlODYxYjcwMGUxN2U4YWZlNjgzN2U3NTEyZTM1YjZjYTExZDBhZTQ3ZDhiODUxNjFjNjdiYWY2NDM3NzIxMyIKKyAgICAgICJmZTUyZDc3MmYyMDM1YjNjYTgzMGFmNDFkOGE0MTIwZTFjMWM3MGQxMmNjMjJmMDBkMjhkMzFkZDQ4YThkNDI0ZjEjKVxuIgorIiAgKHUgIzMwNDU1OWE5ZWFkNTZkMjMwOWQyMDM4MTFhNjQxYmIxYTA5NjI2YmM4ZWIzNmZmZmEyM2M5NjhlYzViZDg5MWUiCisgICAgICAiZWJiYWZjNzNhZTY2NmUwMWJhN2M4OTkwYmFlMDZjYzJiYmUxMGI3NWU2OWZjYWNiMzUzYTY0NzMwNzlkOGU5YiMpXG4iCisiIClcbiIKKyIpXG4iOworCitzdGF0aWMgY29uc3QgY2hhciBzYW1wbGVfcHVibGljX2tleV8xW10gPQorIihwdWJsaWMta2V5XG4iCisiIChyc2FcbiIKKyIgIChuICMwMGUwY2U5NmY5MGI2YzllMDJmMzkyMmJlYWRhOTNmZTUwYTg3NWVhYzZiY2MxOGJiOWE5Y2YyZTg0OTY1Y2FhIgorICAgICAgIjJkMWZmOTVhN2Y1NDI0NjVjNmMwYzE5ZDI3NmU0NTI2Y2UwNDg4NjhhN2E5MTRmZDM0M2NjM2E4N2RkNzQyOTEiCisgICAgICAiZmZjNTY1NTA2ZDViYmIyNWNiYWM2YTBlMmRkMWY4YmNhYWIwZDRhMjljMmYzN2M5NTBmMzYzNDg0YmYyNjlmNyIKKyAgICAgICI4OTE0NDA0NjRiYWY3OTgyN2UwM2EzNmU3MGI4MTQ5MzhlZWJkYzYzZTk2NDI0N2JlNzVkYzU4YjAxNGI3ZWEyNTEjKVxuIgorIiAgKGUgIzAxMDAwMSMpXG4iCisiIClcbiIKKyIpXG4iOworCisKK3N0YXRpYyBpbnQgdmVyYm9zZTsKKworc3RhdGljIHZvaWQKK2RpZSAoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgIHZhX2xpc3QgYXJnX3B0ciA7CisKKyAgdmFfc3RhcnQoIGFyZ19wdHIsIGZvcm1hdCApIDsKKyAgdmZwcmludGYgKHN0ZGVyciwgZm9ybWF0LCBhcmdfcHRyICk7CisgIHZhX2VuZChhcmdfcHRyKTsKKyAgZXhpdCAoMSk7Cit9CisKK3N0YXRpYyB2b2lkCitzaG93X3NleHAgKGNvbnN0IGNoYXIgKnByZWZpeCwgZ2NyeV9zZXhwX3QgYSkKK3sKKyAgY2hhciAqYnVmOworICBzaXplX3Qgc2l6ZTsKKworICBpZiAocHJlZml4KQorICAgIGZwdXRzIChwcmVmaXgsIHN0ZGVycik7CisgIHNpemUgPSBnY3J5X3NleHBfc3ByaW50IChhLCBHQ1JZU0VYUF9GTVRfQURWQU5DRUQsIE5VTEwsIDApOworICBidWYgPSBnY3J5X3htYWxsb2MgKHNpemUpOworCisgIGdjcnlfc2V4cF9zcHJpbnQgKGEsIEdDUllTRVhQX0ZNVF9BRFZBTkNFRCwgYnVmLCBzaXplKTsKKyAgZnByaW50ZiAoc3RkZXJyLCAiJS4qcyIsIChpbnQpc2l6ZSwgYnVmKTsKKyAgZ2NyeV9mcmVlIChidWYpOworfQorCisKK3N0YXRpYyB2b2lkCitjaGVja19rZXlzX2NyeXB0IChnY3J5X3NleHBfdCBwa2V5LCBnY3J5X3NleHBfdCBza2V5LAorCQkgIGdjcnlfc2V4cF90IHBsYWluMCwgZ3BnX2Vycl9jb2RlX3QgZGVjcnlwdF9mYWlsX2NvZGUpCit7CisgIGdjcnlfc2V4cF90IHBsYWluMSwgY2lwaGVyLCBsOworICBnY3J5X21waV90IHgwLCB4MTsKKyAgaW50IHJjOworICBpbnQgaGF2ZV9mbGFnczsKKworICAvKiBFeHRyYWN0IGRhdGEgZnJvbSBwbGFpbnRleHQuICAqLworICBsID0gZ2NyeV9zZXhwX2ZpbmRfdG9rZW4gKHBsYWluMCwgInZhbHVlIiwgMCk7CisgIHgwID0gZ2NyeV9zZXhwX250aF9tcGkgKGwsIDEsIEdDUllNUElfRk1UX1VTRyk7CisKKyAgLyogRW5jcnlwdCBkYXRhLiAgKi8KKyAgcmMgPSBnY3J5X3BrX2VuY3J5cHQgKCZjaXBoZXIsIHBsYWluMCwgcGtleSk7CisgIGlmIChyYykKKyAgICBkaWUgKCJlbmNyeXB0aW9uIGZhaWxlZDogJXNcbiIsIGdjcnlfc3RyZXJyb3IgKHJjKSk7CisKKyAgbCA9IGdjcnlfc2V4cF9maW5kX3Rva2VuIChjaXBoZXIsICJmbGFncyIsIDApOworICBoYXZlX2ZsYWdzID0gISFsOworICBnY3J5X3NleHBfcmVsZWFzZSAobCk7CisKKyAgLyogRGVjcnlwdCBkYXRhLiAgKi8KKyAgcmMgPSBnY3J5X3BrX2RlY3J5cHQgKCZwbGFpbjEsIGNpcGhlciwgc2tleSk7CisgIGdjcnlfc2V4cF9yZWxlYXNlIChjaXBoZXIpOworICBpZiAocmMpCisgICAgeworICAgICAgaWYgKGRlY3J5cHRfZmFpbF9jb2RlICYmIGdwZ19lcnJfY29kZSAocmMpID09IGRlY3J5cHRfZmFpbF9jb2RlKQorICAgICAgICByZXR1cm47IC8qIFRoaXMgaXMgdGhlIGV4cGVjdGVkIGZhaWx1cmUgY29kZS4gICovCisgICAgICBkaWUgKCJkZWNyeXB0aW9uIGZhaWxlZDogJXNcbiIsIGdjcnlfc3RyZXJyb3IgKHJjKSk7CisgICAgfQorCisgIC8qIEV4dHJhY3QgZGVjcnlwdGVkIGRhdGEuICBOb3RlIHRoYXQgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucywgdGhlCisgICAgIG91dHB1dCBvZiBnY3J5X3BrX2RlY3J5cHQgZGVwZW5kcyBvbiB3aGV0aGVyIGEgZmxhZ3MgbGlzdHMgKGV2ZW4KKyAgICAgaWYgZW1wdHkpIG9jY3VycyBpbiBpdHMgaW5wdXQgZGF0YS4gIEJlY2F1c2Ugd2UgcGFzc2VkIHRoZSBvdXRwdXQKKyAgICAgb2YgZW5jcnlwdCBkaXJlY3RseSB0byBkZWNyeXB0LCBzdWNoIGEgZmxhZyB2YWx1ZSB3b24ndCBiZSB0aGVyZQorICAgICBhcyBvZiB0b2RheS4gIFdlIGNoZWNrIGl0IGFueXdheS4gKi8KKyAgbCA9IGdjcnlfc2V4cF9maW5kX3Rva2VuIChwbGFpbjEsICJ2YWx1ZSIsIDApOworICBpZiAobCkKKyAgICB7CisgICAgICBpZiAoIWhhdmVfZmxhZ3MpCisgICAgICAgIGRpZSAoImNvbXBhdGliaWxpdHkgbW9kZSBvZiBwa19kZWNyeXB0IGJyb2tlblxuIik7CisgICAgICBnY3J5X3NleHBfcmVsZWFzZSAocGxhaW4xKTsKKyAgICAgIHgxID0gZ2NyeV9zZXhwX250aF9tcGkgKGwsIDEsIEdDUllNUElfRk1UX1VTRyk7CisgICAgICBnY3J5X3NleHBfcmVsZWFzZSAobCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKGhhdmVfZmxhZ3MpCisgICAgICAgIGRpZSAoImNvbXBhdGliaWxpdHkgbW9kZSBvZiBwa19kZWNyeXB0IGJyb2tlblxuIik7CisgICAgICB4MSA9IGdjcnlfc2V4cF9udGhfbXBpIChwbGFpbjEsIDAsIEdDUllNUElfRk1UX1VTRyk7CisgICAgICBnY3J5X3NleHBfcmVsZWFzZSAocGxhaW4xKTsKKyAgICB9CisKKyAgLyogQ29tcGFyZS4gICovCisgIGlmIChnY3J5X21waV9jbXAgKHgwLCB4MSkpCisgICAgZGllICgiZGF0YSBjb3JydXB0ZWRcbiIpOworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfa2V5cyAoZ2NyeV9zZXhwX3QgcGtleSwgZ2NyeV9zZXhwX3Qgc2tleSwgdW5zaWduZWQgaW50IG5iaXRzX2RhdGEsCisgICAgICAgICAgICBncGdfZXJyX2NvZGVfdCBkZWNyeXB0X2ZhaWxfY29kZSkKK3sKKyAgZ2NyeV9zZXhwX3QgcGxhaW47CisgIGdjcnlfbXBpX3QgeDsKKyAgaW50IHJjOworICAKKyAgLyogQ3JlYXRlIHBsYWluIHRleHQuICAqLworICB4ID0gZ2NyeV9tcGlfbmV3IChuYml0c19kYXRhKTsKKyAgZ2NyeV9tcGlfcmFuZG9taXplICh4LCBuYml0c19kYXRhLCBHQ1JZX1dFQUtfUkFORE9NKTsKKyAgCisgIHJjID0gZ2NyeV9zZXhwX2J1aWxkICgmcGxhaW4sIE5VTEwsICIoZGF0YSAoZmxhZ3MgcmF3KSAodmFsdWUgJW0pKSIsIHgpOworICBpZiAocmMpCisgICAgZGllICgiY29udmVydGluZyBkYXRhIGZvciBlbmNyeXB0aW9uIGZhaWxlZDogJXNcbiIsCisJIGdjcnlfc3RyZXJyb3IgKHJjKSk7CisKKyAgY2hlY2tfa2V5c19jcnlwdCAocGtleSwgc2tleSwgcGxhaW4sIGRlY3J5cHRfZmFpbF9jb2RlKTsKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKHBsYWluKTsKKyAgZ2NyeV9tcGlfcmVsZWFzZSAoeCk7CisKKyAgLyogQ3JlYXRlIHBsYWluIHRleHQuICAqLworICB4ID0gZ2NyeV9tcGlfbmV3IChuYml0c19kYXRhKTsKKyAgZ2NyeV9tcGlfcmFuZG9taXplICh4LCBuYml0c19kYXRhLCBHQ1JZX1dFQUtfUkFORE9NKTsKKyAgCisgIHJjID0gZ2NyeV9zZXhwX2J1aWxkICgmcGxhaW4sIE5VTEwsIAorICAgICAgICAgICAgICAgICAgICAgICAgIihkYXRhIChmbGFncyByYXcgbm8tYmxpbmRpbmcpICh2YWx1ZSAlbSkpIiwgeCk7CisgIGlmIChyYykKKyAgICBkaWUgKCJjb252ZXJ0aW5nIGRhdGEgZm9yIGVuY3J5cHRpb24gZmFpbGVkOiAlc1xuIiwKKwkgZ2NyeV9zdHJlcnJvciAocmMpKTsKKworICBjaGVja19rZXlzX2NyeXB0IChwa2V5LCBza2V5LCBwbGFpbiwgZGVjcnlwdF9mYWlsX2NvZGUpOworICBnY3J5X3NleHBfcmVsZWFzZSAocGxhaW4pOworfQorCitzdGF0aWMgdm9pZAorZ2V0X2tleXNfc2FtcGxlIChnY3J5X3NleHBfdCAqcGtleSwgZ2NyeV9zZXhwX3QgKnNrZXksIGludCBzZWNyZXRfdmFyaWFudCkKK3sKKyAgZ2NyeV9zZXhwX3QgcHViX2tleSwgc2VjX2tleTsKKyAgaW50IHJjOworICBzdGF0aWMgY29uc3QgY2hhciAqc2VjcmV0OworCisKKyAgc3dpdGNoIChzZWNyZXRfdmFyaWFudCkKKyAgICB7CisgICAgY2FzZSAwOiBzZWNyZXQgPSBzYW1wbGVfcHJpdmF0ZV9rZXlfMTsgYnJlYWs7CisgICAgY2FzZSAxOiBzZWNyZXQgPSBzYW1wbGVfcHJpdmF0ZV9rZXlfMV8xOyBicmVhazsKKyAgICBjYXNlIDI6IHNlY3JldCA9IHNhbXBsZV9wcml2YXRlX2tleV8xXzI7IGJyZWFrOworICAgIGRlZmF1bHQ6IGRpZSAoIkJVR1xuIik7CisgICAgfQorCisgIHJjID0gZ2NyeV9zZXhwX3NzY2FuICgmcHViX2tleSwgTlVMTCwgc2FtcGxlX3B1YmxpY19rZXlfMSwKKwkJCXN0cmxlbiAoc2FtcGxlX3B1YmxpY19rZXlfMSkpOworICBpZiAoIXJjKQorICAgIHJjID0gZ2NyeV9zZXhwX3NzY2FuICgmc2VjX2tleSwgTlVMTCwgc2VjcmV0LCBzdHJsZW4gKHNlY3JldCkpOworICBpZiAocmMpCisgICAgZGllICgiY29udmVydGluZyBzYW1wbGUga2V5cyBmYWlsZWQ6ICVzXG4iLCBnY3J5X3N0cmVycm9yIChyYykpOworCisgICpwa2V5ID0gcHViX2tleTsKKyAgKnNrZXkgPSBzZWNfa2V5OworfQorCitzdGF0aWMgdm9pZAorZ2V0X2tleXNfbmV3IChnY3J5X3NleHBfdCAqcGtleSwgZ2NyeV9zZXhwX3QgKnNrZXkpCit7CisgIGdjcnlfc2V4cF90IGtleV9zcGVjLCBrZXksIHB1Yl9rZXksIHNlY19rZXk7CisgIGludCByYzsKKyAgCisgIHJjID0gZ2NyeV9zZXhwX25ldyAoJmtleV9zcGVjLAorCQkgICAgICAiKGdlbmtleSAocnNhIChuYml0cyA0OjEwMjQpKSkiLCAwLCAxKTsKKyAgaWYgKHJjKQorICAgIGRpZSAoImVycm9yIGNyZWF0aW5nIFMtZXhwcmVzc2lvbjogJXNcbiIsIGdjcnlfc3RyZXJyb3IgKHJjKSk7CisgIHJjID0gZ2NyeV9wa19nZW5rZXkgKCZrZXksIGtleV9zcGVjKTsKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKGtleV9zcGVjKTsKKyAgaWYgKHJjKQorICAgIGRpZSAoImVycm9yIGdlbmVyYXRpbmcgUlNBIGtleTogJXNcbiIsIGdjcnlfc3RyZXJyb3IgKHJjKSk7CisgICAgCisgIGlmICh2ZXJib3NlID4gMSkKKyAgICBzaG93X3NleHAgKCJnZW5lcmF0ZWQgUlNBIGtleTpcbiIsIGtleSk7CisKKyAgcHViX2tleSA9IGdjcnlfc2V4cF9maW5kX3Rva2VuIChrZXksICJwdWJsaWMta2V5IiwgMCk7CisgIGlmICghIHB1Yl9rZXkpCisgICAgZGllICgicHVibGljIHBhcnQgbWlzc2luZyBpbiBrZXlcbiIpOworCisgIHNlY19rZXkgPSBnY3J5X3NleHBfZmluZF90b2tlbiAoa2V5LCAicHJpdmF0ZS1rZXkiLCAwKTsKKyAgaWYgKCEgc2VjX2tleSkKKyAgICBkaWUgKCJwcml2YXRlIHBhcnQgbWlzc2luZyBpbiBrZXlcbiIpOworCisgIGdjcnlfc2V4cF9yZWxlYXNlIChrZXkpOworICAqcGtleSA9IHB1Yl9rZXk7CisgICpza2V5ID0gc2VjX2tleTsKK30KKworCitzdGF0aWMgdm9pZAorZ2V0X2tleXNfeDkzMV9uZXcgKGdjcnlfc2V4cF90ICpwa2V5LCBnY3J5X3NleHBfdCAqc2tleSkKK3sKKyAgZ2NyeV9zZXhwX3Qga2V5X3NwZWMsIGtleSwgcHViX2tleSwgc2VjX2tleTsKKyAgaW50IHJjOworICAKKyAgcmMgPSBnY3J5X3NleHBfbmV3ICgma2V5X3NwZWMsCisJCSAgICAgICIoZ2Vua2V5IChyc2EgKG5iaXRzIDQ6MTAyNCkodXNlLXg5MzEpKSkiLCAwLCAxKTsKKyAgaWYgKHJjKQorICAgIGRpZSAoImVycm9yIGNyZWF0aW5nIFMtZXhwcmVzc2lvbjogJXNcbiIsIGdjcnlfc3RyZXJyb3IgKHJjKSk7CisgIHJjID0gZ2NyeV9wa19nZW5rZXkgKCZrZXksIGtleV9zcGVjKTsKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKGtleV9zcGVjKTsKKyAgaWYgKHJjKQorICAgIGRpZSAoImVycm9yIGdlbmVyYXRpbmcgUlNBIGtleTogJXNcbiIsIGdjcnlfc3RyZXJyb3IgKHJjKSk7CisgICAgCisgIGlmICh2ZXJib3NlID4gMSkKKyAgICBzaG93X3NleHAgKCJnZW5lcmF0ZWQgUlNBIChYOS4zMSkga2V5OlxuIiwga2V5KTsKKworICBwdWJfa2V5ID0gZ2NyeV9zZXhwX2ZpbmRfdG9rZW4gKGtleSwgInB1YmxpYy1rZXkiLCAwKTsKKyAgaWYgKCFwdWJfa2V5KQorICAgIGRpZSAoInB1YmxpYyBwYXJ0IG1pc3NpbmcgaW4ga2V5XG4iKTsKKworICBzZWNfa2V5ID0gZ2NyeV9zZXhwX2ZpbmRfdG9rZW4gKGtleSwgInByaXZhdGUta2V5IiwgMCk7CisgIGlmICghc2VjX2tleSkKKyAgICBkaWUgKCJwcml2YXRlIHBhcnQgbWlzc2luZyBpbiBrZXlcbiIpOworCisgIGdjcnlfc2V4cF9yZWxlYXNlIChrZXkpOworICAqcGtleSA9IHB1Yl9rZXk7CisgICpza2V5ID0gc2VjX2tleTsKK30KKworCitzdGF0aWMgdm9pZAorZ2V0X2VsZ19rZXlfbmV3IChnY3J5X3NleHBfdCAqcGtleSwgZ2NyeV9zZXhwX3QgKnNrZXksIGludCBmaXhlZF94KQoreworICBnY3J5X3NleHBfdCBrZXlfc3BlYywga2V5LCBwdWJfa2V5LCBzZWNfa2V5OworICBpbnQgcmM7CisKKyAgcmMgPSBnY3J5X3NleHBfbmV3IAorICAgICgma2V5X3NwZWMsIAorICAgICAoZml4ZWRfeAorICAgICAgPyAiKGdlbmtleSAoZWxnIChuYml0cyA0OjEwMjQpKHh2YWx1ZSBteS5ub3Qtc28tc2VjcmV0LmtleSkpKSIKKyAgICAgIDogIihnZW5rZXkgKGVsZyAobmJpdHMgMzo1MTIpKSkiKSwKKyAgICAgMCwgMSk7CisKKyAgaWYgKHJjKQorICAgIGRpZSAoImVycm9yIGNyZWF0aW5nIFMtZXhwcmVzc2lvbjogJXNcbiIsIGdjcnlfc3RyZXJyb3IgKHJjKSk7CisgIHJjID0gZ2NyeV9wa19nZW5rZXkgKCZrZXksIGtleV9zcGVjKTsKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKGtleV9zcGVjKTsKKyAgaWYgKHJjKQorICAgIGRpZSAoImVycm9yIGdlbmVyYXRpbmcgRWxnYW1hbCBrZXk6ICVzXG4iLCBnY3J5X3N0cmVycm9yIChyYykpOworICAgIAorICBpZiAodmVyYm9zZSA+IDEpCisgICAgc2hvd19zZXhwICgiZ2VuZXJhdGVkIEVMRyBrZXk6XG4iLCBrZXkpOworCisgIHB1Yl9rZXkgPSBnY3J5X3NleHBfZmluZF90b2tlbiAoa2V5LCAicHVibGljLWtleSIsIDApOworICBpZiAoIXB1Yl9rZXkpCisgICAgZGllICgicHVibGljIHBhcnQgbWlzc2luZyBpbiBrZXlcbiIpOworCisgIHNlY19rZXkgPSBnY3J5X3NleHBfZmluZF90b2tlbiAoa2V5LCAicHJpdmF0ZS1rZXkiLCAwKTsKKyAgaWYgKCFzZWNfa2V5KQorICAgIGRpZSAoInByaXZhdGUgcGFydCBtaXNzaW5nIGluIGtleVxuIik7CisKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKGtleSk7CisgICpwa2V5ID0gcHViX2tleTsKKyAgKnNrZXkgPSBzZWNfa2V5OworfQorCisKK3N0YXRpYyB2b2lkCitnZXRfZHNhX2tleV9uZXcgKGdjcnlfc2V4cF90ICpwa2V5LCBnY3J5X3NleHBfdCAqc2tleSwgaW50IHRyYW5zaWVudF9rZXkpCit7CisgIGdjcnlfc2V4cF90IGtleV9zcGVjLCBrZXksIHB1Yl9rZXksIHNlY19rZXk7CisgIGludCByYzsKKworICByYyA9IGdjcnlfc2V4cF9uZXcgKCZrZXlfc3BlYywgCisgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpZW50X2tleQorICAgICAgICAgICAgICAgICAgICAgID8gIihnZW5rZXkgKGRzYSAobmJpdHMgNDoxMDI0KSh0cmFuc2llbnQta2V5KSkpIgorICAgICAgICAgICAgICAgICAgICAgIDogIihnZW5rZXkgKGRzYSAobmJpdHMgNDoxMDI0KSkpIiwKKyAgICAgICAgICAgICAgICAgICAgICAwLCAxKTsKKyAgaWYgKHJjKQorICAgIGRpZSAoImVycm9yIGNyZWF0aW5nIFMtZXhwcmVzc2lvbjogJXNcbiIsIGdjcnlfc3RyZXJyb3IgKHJjKSk7CisgIHJjID0gZ2NyeV9wa19nZW5rZXkgKCZrZXksIGtleV9zcGVjKTsKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKGtleV9zcGVjKTsKKyAgaWYgKHJjKQorICAgIGRpZSAoImVycm9yIGdlbmVyYXRpbmcgRFNBIGtleTogJXNcbiIsIGdjcnlfc3RyZXJyb3IgKHJjKSk7CisgICAgCisgIGlmICh2ZXJib3NlID4gMSkKKyAgICBzaG93X3NleHAgKCJnZW5lcmF0ZWQgRFNBIGtleTpcbiIsIGtleSk7CisKKyAgcHViX2tleSA9IGdjcnlfc2V4cF9maW5kX3Rva2VuIChrZXksICJwdWJsaWMta2V5IiwgMCk7CisgIGlmICghcHViX2tleSkKKyAgICBkaWUgKCJwdWJsaWMgcGFydCBtaXNzaW5nIGluIGtleVxuIik7CisKKyAgc2VjX2tleSA9IGdjcnlfc2V4cF9maW5kX3Rva2VuIChrZXksICJwcml2YXRlLWtleSIsIDApOworICBpZiAoIXNlY19rZXkpCisgICAgZGllICgicHJpdmF0ZSBwYXJ0IG1pc3NpbmcgaW4ga2V5XG4iKTsKKworICBnY3J5X3NleHBfcmVsZWFzZSAoa2V5KTsKKyAgKnBrZXkgPSBwdWJfa2V5OworICAqc2tleSA9IHNlY19rZXk7Cit9CisKKworc3RhdGljIHZvaWQKK2dldF9kc2Ffa2V5X2ZpcHMxODZfbmV3IChnY3J5X3NleHBfdCAqcGtleSwgZ2NyeV9zZXhwX3QgKnNrZXkpCit7CisgIGdjcnlfc2V4cF90IGtleV9zcGVjLCBrZXksIHB1Yl9rZXksIHNlY19rZXk7CisgIGludCByYzsKKworICByYyA9IGdjcnlfc2V4cF9uZXcgCisgICAgKCZrZXlfc3BlYywgIihnZW5rZXkgKGRzYSAobmJpdHMgNDoxMDI0KSh1c2UtZmlwczE4NikpKSIsICAwLCAxKTsKKyAgaWYgKHJjKQorICAgIGRpZSAoImVycm9yIGNyZWF0aW5nIFMtZXhwcmVzc2lvbjogJXNcbiIsIGdjcnlfc3RyZXJyb3IgKHJjKSk7CisgIHJjID0gZ2NyeV9wa19nZW5rZXkgKCZrZXksIGtleV9zcGVjKTsKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKGtleV9zcGVjKTsKKyAgaWYgKHJjKQorICAgIGRpZSAoImVycm9yIGdlbmVyYXRpbmcgRFNBIGtleTogJXNcbiIsIGdjcnlfc3RyZXJyb3IgKHJjKSk7CisgICAgCisgIGlmICh2ZXJib3NlID4gMSkKKyAgICBzaG93X3NleHAgKCJnZW5lcmF0ZWQgRFNBIGtleSAoZmlwcyAxODYpOlxuIiwga2V5KTsKKworICBwdWJfa2V5ID0gZ2NyeV9zZXhwX2ZpbmRfdG9rZW4gKGtleSwgInB1YmxpYy1rZXkiLCAwKTsKKyAgaWYgKCFwdWJfa2V5KQorICAgIGRpZSAoInB1YmxpYyBwYXJ0IG1pc3NpbmcgaW4ga2V5XG4iKTsKKworICBzZWNfa2V5ID0gZ2NyeV9zZXhwX2ZpbmRfdG9rZW4gKGtleSwgInByaXZhdGUta2V5IiwgMCk7CisgIGlmICghc2VjX2tleSkKKyAgICBkaWUgKCJwcml2YXRlIHBhcnQgbWlzc2luZyBpbiBrZXlcbiIpOworCisgIGdjcnlfc2V4cF9yZWxlYXNlIChrZXkpOworICAqcGtleSA9IHB1Yl9rZXk7CisgICpza2V5ID0gc2VjX2tleTsKK30KKworCitzdGF0aWMgdm9pZAorZ2V0X2RzYV9rZXlfd2l0aF9kb21haW5fbmV3IChnY3J5X3NleHBfdCAqcGtleSwgZ2NyeV9zZXhwX3QgKnNrZXkpCit7CisgIGdjcnlfc2V4cF90IGtleV9zcGVjLCBrZXksIHB1Yl9rZXksIHNlY19rZXk7CisgIGludCByYzsKKworICByYyA9IGdjcnlfc2V4cF9uZXcgCisgICAgKCZrZXlfc3BlYywgCisgICAgICIoZ2Vua2V5IChkc2EgKHRyYW5zaWVudC1rZXkpKGRvbWFpbiIKKyAgICAgIihwICNkM2FlZDE4NzYwNTRkYjgzMWQwYzEzNDhmYmIxYWRhNzI1MDdlNWZiZjlhNjJjYmQ0N2E2M2FlYjc4NTlkNjkyMSIKKyAgICAgIjRhZGViOTE0NmE2ZWMzZjQzNTIwZjBmZDhlMzEyNWRkOGJiYzVkODc0MDVkMWFjNWY4MjA3M2NkNzYyYTNmOGQ3IgorICAgICAiNzQzMjI2NTdjOWRhODhhN2QyZjBlMWE5Y2ViODRhMzljYjQwODc2MTc5ZTZhNzZlNDAwNDk4ZGU0YmI5Mzc5YjAiCisgICAgICI1ZjVmZWI3YjkxZWI4ZmVhOTdlZTE3YTk1NWEwYThhMzc1ODdhMjcyYzQ3MTlkNmZlYjZiNTRiYTRhYjY5IykiCisgICAgICIocSAjOWM5MTZkMTIxZGU5YTAzZjcxZmIyMWJjMmUxYzBkMTE2ZjA2NWE0ZiMpIgorICAgICAiKGcgIzgxNTdjNWY2OGNhNDBiM2RlZDExYzM1MzMyN2FiOWI4YWYzZTE4NmRkMmU4ZGFkZTk4NzYxYTA5OTZkZGE5OWFiIgorICAgICAiMDI1MGQzNDA5MDYzYWQ5OWVmYWU0OGIxMGM2YWIyYmJhM2VhOWE2N2IxMmI5MTFhMzcyYTJiYmEyNjAxNzZmYWQiCisgICAgICJiNGI5MzI0N2Q5NzEyYWFkMTNhYTcwMjE2YzU1ZGE5ODU4ZjdhMjk4ZGViNjcwYTQwM2ViMWU3YzkxYjg0N2YxZSIKKyAgICAgImNjZmJkMTRiZDgwNmZkNDJjZjQ1ZGJiNjljZDZkNmI0M2FkZDJhNzhmN2QxNjkyOGVhYTA0NDU4ZGVhNDQjKSIKKyAgICAgIikpKSIsIDAsIDEpOworICBpZiAocmMpCisgICAgZGllICgiZXJyb3IgY3JlYXRpbmcgUy1leHByZXNzaW9uOiAlc1xuIiwgZ2NyeV9zdHJlcnJvciAocmMpKTsKKyAgcmMgPSBnY3J5X3BrX2dlbmtleSAoJmtleSwga2V5X3NwZWMpOworICBnY3J5X3NleHBfcmVsZWFzZSAoa2V5X3NwZWMpOworICBpZiAocmMpCisgICAgZGllICgiZXJyb3IgZ2VuZXJhdGluZyBEU0Ega2V5OiAlc1xuIiwgZ2NyeV9zdHJlcnJvciAocmMpKTsKKyAgICAKKyAgaWYgKHZlcmJvc2UgPiAxKQorICAgIHNob3dfc2V4cCAoImdlbmVyYXRlZCBEU0Ega2V5OlxuIiwga2V5KTsKKworICBwdWJfa2V5ID0gZ2NyeV9zZXhwX2ZpbmRfdG9rZW4gKGtleSwgInB1YmxpYy1rZXkiLCAwKTsKKyAgaWYgKCFwdWJfa2V5KQorICAgIGRpZSAoInB1YmxpYyBwYXJ0IG1pc3NpbmcgaW4ga2V5XG4iKTsKKworICBzZWNfa2V5ID0gZ2NyeV9zZXhwX2ZpbmRfdG9rZW4gKGtleSwgInByaXZhdGUta2V5IiwgMCk7CisgIGlmICghc2VjX2tleSkKKyAgICBkaWUgKCJwcml2YXRlIHBhcnQgbWlzc2luZyBpbiBrZXlcbiIpOworCisgIGdjcnlfc2V4cF9yZWxlYXNlIChrZXkpOworICAqcGtleSA9IHB1Yl9rZXk7CisgICpza2V5ID0gc2VjX2tleTsKK30KKworc3RhdGljIHZvaWQKK2dldF9kc2Ffa2V5X2ZpcHMxODZfd2l0aF9kb21haW5fbmV3IChnY3J5X3NleHBfdCAqcGtleSwgZ2NyeV9zZXhwX3QgKnNrZXkpCit7CisgIGdjcnlfc2V4cF90IGtleV9zcGVjLCBrZXksIHB1Yl9rZXksIHNlY19rZXk7CisgIGludCByYzsKKworICByYyA9IGdjcnlfc2V4cF9uZXcgCisgICAgKCZrZXlfc3BlYywgCisgICAgICIoZ2Vua2V5IChkc2EgKHRyYW5zaWVudC1rZXkpKHVzZS1maXBzMTg2KShkb21haW4iCisgICAgICIocCAjZDNhZWQxODc2MDU0ZGI4MzFkMGMxMzQ4ZmJiMWFkYTcyNTA3ZTVmYmY5YTYyY2JkNDdhNjNhZWI3ODU5ZDY5MjEiCisgICAgICI0YWRlYjkxNDZhNmVjM2Y0MzUyMGYwZmQ4ZTMxMjVkZDhiYmM1ZDg3NDA1ZDFhYzVmODIwNzNjZDc2MmEzZjhkNyIKKyAgICAgIjc0MzIyNjU3YzlkYTg4YTdkMmYwZTFhOWNlYjg0YTM5Y2I0MDg3NjE3OWU2YTc2ZTQwMDQ5OGRlNGJiOTM3OWIwIgorICAgICAiNWY1ZmViN2I5MWViOGZlYTk3ZWUxN2E5NTVhMGE4YTM3NTg3YTI3MmM0NzE5ZDZmZWI2YjU0YmE0YWI2OSMpIgorICAgICAiKHEgIzljOTE2ZDEyMWRlOWEwM2Y3MWZiMjFiYzJlMWMwZDExNmYwNjVhNGYjKSIKKyAgICAgIihnICM4MTU3YzVmNjhjYTQwYjNkZWQxMWMzNTMzMjdhYjliOGFmM2UxODZkZDJlOGRhZGU5ODc2MWEwOTk2ZGRhOTlhYiIKKyAgICAgIjAyNTBkMzQwOTA2M2FkOTllZmFlNDhiMTBjNmFiMmJiYTNlYTlhNjdiMTJiOTExYTM3MmEyYmJhMjYwMTc2ZmFkIgorICAgICAiYjRiOTMyNDdkOTcxMmFhZDEzYWE3MDIxNmM1NWRhOTg1OGY3YTI5OGRlYjY3MGE0MDNlYjFlN2M5MWI4NDdmMWUiCisgICAgICJjY2ZiZDE0YmQ4MDZmZDQyY2Y0NWRiYjY5Y2Q2ZDZiNDNhZGQyYTc4ZjdkMTY5MjhlYWEwNDQ1OGRlYTQ0IykiCisgICAgICIpKSkiLCAwLCAxKTsKKyAgaWYgKHJjKQorICAgIGRpZSAoImVycm9yIGNyZWF0aW5nIFMtZXhwcmVzc2lvbjogJXNcbiIsIGdjcnlfc3RyZXJyb3IgKHJjKSk7CisgIHJjID0gZ2NyeV9wa19nZW5rZXkgKCZrZXksIGtleV9zcGVjKTsKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKGtleV9zcGVjKTsKKyAgaWYgKHJjKQorICAgIGRpZSAoImVycm9yIGdlbmVyYXRpbmcgRFNBIGtleTogJXNcbiIsIGdjcnlfc3RyZXJyb3IgKHJjKSk7CisgICAgCisgIGlmICh2ZXJib3NlID4gMSkKKyAgICBzaG93X3NleHAgKCJnZW5lcmF0ZWQgRFNBIGtleTpcbiIsIGtleSk7CisKKyAgcHViX2tleSA9IGdjcnlfc2V4cF9maW5kX3Rva2VuIChrZXksICJwdWJsaWMta2V5IiwgMCk7CisgIGlmICghcHViX2tleSkKKyAgICBkaWUgKCJwdWJsaWMgcGFydCBtaXNzaW5nIGluIGtleVxuIik7CisKKyAgc2VjX2tleSA9IGdjcnlfc2V4cF9maW5kX3Rva2VuIChrZXksICJwcml2YXRlLWtleSIsIDApOworICBpZiAoIXNlY19rZXkpCisgICAgZGllICgicHJpdmF0ZSBwYXJ0IG1pc3NpbmcgaW4ga2V5XG4iKTsKKworICBnY3J5X3NleHBfcmVsZWFzZSAoa2V5KTsKKyAgKnBrZXkgPSBwdWJfa2V5OworICAqc2tleSA9IHNlY19rZXk7Cit9CisKKworc3RhdGljIHZvaWQKK2dldF9kc2Ffa2V5X2ZpcHMxODZfd2l0aF9zZWVkX25ldyAoZ2NyeV9zZXhwX3QgKnBrZXksIGdjcnlfc2V4cF90ICpza2V5KQoreworICBnY3J5X3NleHBfdCBrZXlfc3BlYywga2V5LCBwdWJfa2V5LCBzZWNfa2V5OworICBpbnQgcmM7CisKKyAgcmMgPSBnY3J5X3NleHBfbmV3IAorICAgICgma2V5X3NwZWMsCisgICAgICIoZ2Vua2V5IgorICAgICAiICAoZHNhIiAKKyAgICAgIiAgICAobmJpdHMgNDoxMDI0KSIKKyAgICAgIiAgICAodXNlLWZpcHMxODYpIgorICAgICAiICAgICh0cmFuc2llbnQta2V5KSIKKyAgICAgIiAgICAoZGVyaXZlLXBhcm1zIgorICAgICAiICAgICAgKHNlZWQgIzBjYjE5OTBjMWZkMzYyNjA1NWQ3YTAwOTZmOGZhOTk4MDczOTk4NzEjKSkpKSIsCisgICAgIDAsIDEpOworICBpZiAocmMpCisgICAgZGllICgiZXJyb3IgY3JlYXRpbmcgUy1leHByZXNzaW9uOiAlc1xuIiwgZ2NyeV9zdHJlcnJvciAocmMpKTsKKyAgcmMgPSBnY3J5X3BrX2dlbmtleSAoJmtleSwga2V5X3NwZWMpOworICBnY3J5X3NleHBfcmVsZWFzZSAoa2V5X3NwZWMpOworICBpZiAocmMpCisgICAgZGllICgiZXJyb3IgZ2VuZXJhdGluZyBEU0Ega2V5OiAlc1xuIiwgZ2NyeV9zdHJlcnJvciAocmMpKTsKKyAgICAKKyAgaWYgKHZlcmJvc2UgPiAxKQorICAgIHNob3dfc2V4cCAoImdlbmVyYXRlZCBEU0Ega2V5IChmaXBzIDE4NiB3aXRoIHNlZWQpOlxuIiwga2V5KTsKKworICBwdWJfa2V5ID0gZ2NyeV9zZXhwX2ZpbmRfdG9rZW4gKGtleSwgInB1YmxpYy1rZXkiLCAwKTsKKyAgaWYgKCFwdWJfa2V5KQorICAgIGRpZSAoInB1YmxpYyBwYXJ0IG1pc3NpbmcgaW4ga2V5XG4iKTsKKworICBzZWNfa2V5ID0gZ2NyeV9zZXhwX2ZpbmRfdG9rZW4gKGtleSwgInByaXZhdGUta2V5IiwgMCk7CisgIGlmICghc2VjX2tleSkKKyAgICBkaWUgKCJwcml2YXRlIHBhcnQgbWlzc2luZyBpbiBrZXlcbiIpOworCisgIGdjcnlfc2V4cF9yZWxlYXNlIChrZXkpOworICAqcGtleSA9IHB1Yl9rZXk7CisgICpza2V5ID0gc2VjX2tleTsKK30KKworCitzdGF0aWMgdm9pZAorY2hlY2tfcnVuICh2b2lkKQoreworICBncGdfZXJyb3JfdCBlcnI7CisgIGdjcnlfc2V4cF90IHBrZXksIHNrZXk7CisgIGludCB2YXJpYW50OworCisgIGZvciAodmFyaWFudD0wOyB2YXJpYW50IDwgMzsgdmFyaWFudCsrKQorICAgIHsKKyAgICAgIGlmICh2ZXJib3NlKQorICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJDaGVja2luZyBzYW1wbGUga2V5ICglZCkuXG4iLCB2YXJpYW50KTsKKyAgICAgIGdldF9rZXlzX3NhbXBsZSAoJnBrZXksICZza2V5LCB2YXJpYW50KTsKKyAgICAgIC8qIENoZWNrIGdjcnlfcGtfdGVzdGtleSB3aGljaCByZXF1aXJlcyBhbGwgZWxlbWVudHMuICAqLworICAgICAgZXJyID0gZ2NyeV9wa190ZXN0a2V5IChza2V5KTsKKyAgICAgIGlmICgodmFyaWFudCA9PSAwICYmIGVycikKKyAgICAgICAgICB8fCAodmFyaWFudCA+IDAgJiYgZ3BnX2Vycl9jb2RlIChlcnIpICE9IEdQR19FUlJfTk9fT0JKKSkKKyAgICAgICAgICBkaWUgKCJnY3J5X3BrX3Rlc3RrZXkgZmFpbGVkOiAlc1xuIiwgZ3BnX3N0cmVycm9yIChlcnIpKTsKKyAgICAgIC8qIFJ1biB0aGUgdXN1YWwgY2hlY2sgYnV0IGV4cGVjdCBhbiBlcnJvciBmcm9tIHZhcmlhbnQgMi4gICovCisgICAgICBjaGVja19rZXlzIChwa2V5LCBza2V5LCA4MDAsIHZhcmlhbnQgPT0gMj8gR1BHX0VSUl9OT19PQkogOiAwKTsKKyAgICAgIGdjcnlfc2V4cF9yZWxlYXNlIChwa2V5KTsKKyAgICAgIGdjcnlfc2V4cF9yZWxlYXNlIChza2V5KTsKKyAgICB9CisKKyAgaWYgKHZlcmJvc2UpCisgICAgZnByaW50ZiAoc3RkZXJyLCAiQ2hlY2tpbmcgZ2VuZXJhdGVkIFJTQSBrZXkuXG4iKTsKKyAgZ2V0X2tleXNfbmV3ICgmcGtleSwgJnNrZXkpOworICBjaGVja19rZXlzIChwa2V5LCBza2V5LCA4MDAsIDApOworICBnY3J5X3NleHBfcmVsZWFzZSAocGtleSk7CisgIGdjcnlfc2V4cF9yZWxlYXNlIChza2V5KTsKKworICBpZiAodmVyYm9zZSkKKyAgICBmcHJpbnRmIChzdGRlcnIsICJDaGVja2luZyBnZW5lcmF0ZWQgUlNBIGtleSAoWDkuMzEpLlxuIik7CisgIGdldF9rZXlzX3g5MzFfbmV3ICgmcGtleSwgJnNrZXkpOworICBjaGVja19rZXlzIChwa2V5LCBza2V5LCA4MDAsIDApOworICBnY3J5X3NleHBfcmVsZWFzZSAocGtleSk7CisgIGdjcnlfc2V4cF9yZWxlYXNlIChza2V5KTsKKworICBpZiAodmVyYm9zZSkKKyAgICBmcHJpbnRmIChzdGRlcnIsICJDaGVja2luZyBnZW5lcmF0ZWQgRWxnYW1hbCBrZXkuXG4iKTsKKyAgZ2V0X2VsZ19rZXlfbmV3ICgmcGtleSwgJnNrZXksIDApOworICBjaGVja19rZXlzIChwa2V5LCBza2V5LCA0MDAsIDApOworICBnY3J5X3NleHBfcmVsZWFzZSAocGtleSk7CisgIGdjcnlfc2V4cF9yZWxlYXNlIChza2V5KTsKKworICBpZiAodmVyYm9zZSkKKyAgICBmcHJpbnRmIChzdGRlcnIsICJDaGVja2luZyBwYXNzcGhyYXNlIGdlbmVyYXRlZCBFbGdhbWFsIGtleS5cbiIpOworICBnZXRfZWxnX2tleV9uZXcgKCZwa2V5LCAmc2tleSwgMSk7CisgIGNoZWNrX2tleXMgKHBrZXksIHNrZXksIDgwMCwgMCk7CisgIGdjcnlfc2V4cF9yZWxlYXNlIChwa2V5KTsKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKHNrZXkpOworCisgIGlmICh2ZXJib3NlKQorICAgIGZwcmludGYgKHN0ZGVyciwgIkdlbmVyYXRpbmcgRFNBIGtleS5cbiIpOworICBnZXRfZHNhX2tleV9uZXcgKCZwa2V5LCAmc2tleSwgMCk7CisgIC8qIEZpeG1lOiAgQWRkIGEgY2hlY2sgZnVuY3Rpb24gZm9yIERTQSBrZXlzLiAgKi8KKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKHBrZXkpOworICBnY3J5X3NleHBfcmVsZWFzZSAoc2tleSk7CisKKyAgaWYgKCFnY3J5X2ZpcHNfbW9kZV9hY3RpdmUgKCkpCisgICAgeworICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkdlbmVyYXRpbmcgdHJhbnNpZW50IERTQSBrZXkuXG4iKTsKKyAgICAgIGdldF9kc2Ffa2V5X25ldyAoJnBrZXksICZza2V5LCAxKTsKKyAgICAgIC8qIEZpeG1lOiAgQWRkIGEgY2hlY2sgZnVuY3Rpb24gZm9yIERTQSBrZXlzLiAgKi8KKyAgICAgIGdjcnlfc2V4cF9yZWxlYXNlIChwa2V5KTsKKyAgICAgIGdjcnlfc2V4cF9yZWxlYXNlIChza2V5KTsKKyAgICB9CisKKyAgaWYgKHZlcmJvc2UpCisgICAgZnByaW50ZiAoc3RkZXJyLCAiR2VuZXJhdGluZyBEU0Ega2V5IChGSVBTIDE4NikuXG4iKTsKKyAgZ2V0X2RzYV9rZXlfZmlwczE4Nl9uZXcgKCZwa2V5LCAmc2tleSk7CisgIC8qIEZpeG1lOiAgQWRkIGEgY2hlY2sgZnVuY3Rpb24gZm9yIERTQSBrZXlzLiAgKi8KKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKHBrZXkpOworICBnY3J5X3NleHBfcmVsZWFzZSAoc2tleSk7CisKKyAgaWYgKHZlcmJvc2UpCisgICAgZnByaW50ZiAoc3RkZXJyLCAiR2VuZXJhdGluZyBEU0Ega2V5IHdpdGggZ2l2ZW4gZG9tYWluLlxuIik7CisgIGdldF9kc2Ffa2V5X3dpdGhfZG9tYWluX25ldyAoJnBrZXksICZza2V5KTsKKyAgLyogRml4bWU6ICBBZGQgYSBjaGVjayBmdW5jdGlvbiBmb3IgRFNBIGtleXMuICAqLworICBnY3J5X3NleHBfcmVsZWFzZSAocGtleSk7CisgIGdjcnlfc2V4cF9yZWxlYXNlIChza2V5KTsKKworICBpZiAodmVyYm9zZSkKKyAgICBmcHJpbnRmIChzdGRlcnIsICJHZW5lcmF0aW5nIERTQSBrZXkgd2l0aCBnaXZlbiBkb21haW4gKEZJUFMgMTg2KS5cbiIpOworICBnZXRfZHNhX2tleV9maXBzMTg2X3dpdGhfZG9tYWluX25ldyAoJnBrZXksICZza2V5KTsKKyAgLyogRml4bWU6ICBBZGQgYSBjaGVjayBmdW5jdGlvbiBmb3IgRFNBIGtleXMuICAqLworICBnY3J5X3NleHBfcmVsZWFzZSAocGtleSk7CisgIGdjcnlfc2V4cF9yZWxlYXNlIChza2V5KTsKKworICBpZiAodmVyYm9zZSkKKyAgICBmcHJpbnRmIChzdGRlcnIsICJHZW5lcmF0aW5nIERTQSBrZXkgd2l0aCBnaXZlbiBzZWVkIChGSVBTIDE4NikuXG4iKTsKKyAgZ2V0X2RzYV9rZXlfZmlwczE4Nl93aXRoX3NlZWRfbmV3ICgmcGtleSwgJnNrZXkpOworICAvKiBGaXhtZTogIEFkZCBhIGNoZWNrIGZ1bmN0aW9uIGZvciBEU0Ega2V5cy4gICovCisgIGdjcnlfc2V4cF9yZWxlYXNlIChwa2V5KTsKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKHNrZXkpOworfQorCisKKworc3RhdGljIGdjcnlfbXBpX3QKK2tleV9wYXJhbV9mcm9tX3NleHAgKGdjcnlfc2V4cF90IHNleHAsIGNvbnN0IGNoYXIgKnRvcG5hbWUsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIGdjcnlfc2V4cF90IGwxLCBsMjsKKyAgZ2NyeV9tcGlfdCByZXN1bHQ7CisKKyAgbDEgPSBnY3J5X3NleHBfZmluZF90b2tlbiAoc2V4cCwgdG9wbmFtZSwgMCk7CisgIGlmICghbDEpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgbDIgPSBnY3J5X3NleHBfZmluZF90b2tlbiAobDEsIG5hbWUsIDApOworICBpZiAoIWwyKQorICAgIHsKKyAgICAgIGdjcnlfc2V4cF9yZWxlYXNlIChsMSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgcmVzdWx0ID0gZ2NyeV9zZXhwX250aF9tcGkgKGwyLCAxLCBHQ1JZTVBJX0ZNVF9VU0cpOworICBnY3J5X3NleHBfcmVsZWFzZSAobDIpOworICBnY3J5X3NleHBfcmVsZWFzZSAobDEpOworICByZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyB2b2lkCitjaGVja194OTMxX2Rlcml2ZWRfa2V5IChpbnQgd2hhdCkKK3sKKyAgc3RhdGljIHN0cnVjdCB7CisgICAgY29uc3QgY2hhciAqcGFyYW07CisgICAgY29uc3QgY2hhciAqZXhwZWN0ZWRfZDsKKyAgfSB0ZXN0dGFibGVbXSA9IHsKKyAgICB7IC8qIEZpcnN0IGV4YW1wbGUgZnJvbSBYOS4zMSAoRC4xLjEpLiAgKi8KKyAgICAgICIoZ2Vua2V5XG4iCisgICAgICAiICAocnNhXG4iCisgICAgICAiICAgIChuYml0cyA0OjEwMjQpXG4iCisgICAgICAiICAgIChyc2EtdXNlLWUgMTozKVxuIgorICAgICAgIiAgICAoZGVyaXZlLXBhcm1zXG4iCisgICAgICAiICAgICAgKFhwMSAjMUExOTE2RERCMjlCNEVCN0VCNjczMkUxMjgjKVxuIgorICAgICAgIiAgICAgIChYcDIgIzE5MkU4QUFDNDFDNTc2QzgyMkQ5M0VBNDMzIylcbiIKKyAgICAgICIgICAgICAoWHAgICNEOENEODFGMDM1RUM1N0VGRTgyMjk1NTE0OUQzQkZGNzBDNTM1MjBEXG4iCisgICAgICAiICAgICAgICAgICAgNzY5RDZENzY2NDZDN0E3OTJFMTZFQkQ4OUZFNkZDNUI2MDVBNjQ5M1xuIgorICAgICAgIiAgICAgICAgICAgIDM5REZDOTI1QTg2QTRDNkQxNTBCNzFCOUVFQTAyRDY4ODg1RjUwMDlcbiIKKyAgICAgICIgICAgICAgICAgICBCOThCRDk4NCMpXG4iCisgICAgICAiICAgICAgKFhxMSAjMUE1Q0Y3MkVFNzcwREU1MENCMDlBQ0NFQTkjKVxuIgorICAgICAgIiAgICAgIChYcTIgIzEzNEU0Q0FBMTZEMjM1MEEyMUQ3NzVDNDA0IylcbiIKKyAgICAgICIgICAgICAoWHEgICNDQzEwOTI0OTVEODY3RTY0MDY1REVFM0U3OTU1RjJFQkM3RDQ3QTJEXG4iCisgICAgICAiICAgICAgICAgICAgN0M5OTUzMzg4Rjk3REREQzNFMUNBMTlDMzVDQTY1OUVEQzJGQzMyNVxuIgorICAgICAgIiAgICAgICAgICAgIDZEMjlDMjYyNzQ3OUMwODZBNjk5QTQ5QzRDOUNFRTdFRjdCRDFCMzRcbiIKKyAgICAgICIgICAgICAgICAgICAzMjFERTM0QSMpKSkpXG4iLAorICAgICAgIjFDQ0RBMjBCQ0ZGQjhENTE3RUU5NjY2ODY2NjIxQjExODIyQzc5NTBENTVGNEJCNUJFRTM3OTg5QTdEMTczIgorICAgICAgIjEyRTMyNjcxOEJFMEQ3OTU0NkVBQUU4N0E1NjYyM0I5MTlCMTcxNUZGQkQ3RjE2MDI4RkM0MDA3NzQxOTYxIgorICAgICAgIkM4OEM1RDdCNERBQUFDOEQzNkE5OEM5RUZCQjI2QzhBNEEwRTZCQzE1QjM1OEU1MjhBMUFDOUQwRjA0MkJFIgorICAgICAgIkI5M0JDQTE2QjU0MUIzM0Y4MEM5MzNBM0I3NjkyODVDNDYyRUQ1Njc3QkZFODlERjA3QkVENUMxMjdGRDEzIgorICAgICAgIjI0MUQzQzRCIgorICAgIH0sCisgICAgCisgICAgeyAvKiBTZWNvbmQgZXhhbXBsZSBmcm9tIFg5LjMxIChELjIuMSkuICAqLworICAgICAgIihnZW5rZXlcbiIKKyAgICAgICIgIChyc2FcbiIKKyAgICAgICIgICAgKG5iaXRzIDQ6MTUzNilcbiIKKyAgICAgICIgICAgKHJzYS11c2UtZSAxOjMpXG4iCisgICAgICAiICAgIChkZXJpdmUtcGFybXNcbiIKKyAgICAgICIgICAgICAoWHAxICMxODI3MjU1OEI2MTMxNjM0ODI5N0VBQ0E3NCMpXG4iCisgICAgICAiICAgICAgKFhwMiAjMUU5NzBFOEM2Qzk3Q0VGOTFGMDVCMEZBODAjKVxuIgorICAgICAgIiAgICAgIChYcCAgI0Y3RTk0M0M3RUYyMTY5RTkzMERDRjIzRkUzODlFRjc1MDdFRTgyNjVcbiIKKyAgICAgICIgICAgICAgICAgICAwRDQyRjRBMEQzQTNDRUZBQkUzNjc5OTlCQjMwRUU2ODBCMkZFMDY0XG4iCisgICAgICAiICAgICAgICAgICAgNjBGNzA3RjQ2MDA1RjhBQTdDQkZDRERDNDgxNEJCRTdGMEY4QkMwOVxuIgorICAgICAgIiAgICAgICAgICAgIDMxOEM4RTUxQTQ4RDEzNDI5NkU0MEQwQkJERDI4MkRDQ0JEREVFMURcbiIKKyAgICAgICIgICAgICAgICAgICBFQzg2RjBCMUM5NkVBRkY1Q0RBNzBGOUFFQjZFRTMxRSMpXG4iCisgICAgICAiICAgICAgKFhxMSAjMTFGRERBNkU4MTI4REMxNjI5Rjc1MTkyQkEjKVxuIgorICAgICAgIiAgICAgIChYcTIgIzE4QUIxNzhFQ0E5MDdENzI0NzJGNjVFNDgwIylcbiIKKyAgICAgICIgICAgICAoWHEgICNDNDc1NjAwMTE0MTJENkUxM0UzRTdEMDA3QjVDMDVEQkY1RkYwRDBGXG4iCisgICAgICAiICAgICAgICAgICAgQ0ZGMUZBMjA3MEQxNkM3QUJBOTNFREZCMzVEODcwMDU2N0U1OTEzRFxuIgorICAgICAgIiAgICAgICAgICAgIEI3MzRFM0ZCRDE1ODYyRUJDNTlGQTA0MjVERkExMzFFNTQ5MTM2RThcbiIKKyAgICAgICIgICAgICAgICAgICBFNTIzOTdBOEFCRTQ3MDVFQzQ4NzdENEY4MkM0QUFDNjUxQjMzREE2XG4iCisgICAgICAiICAgICAgICAgICAgRUExNEI5RDVGMkEyNjNEQzY1NjI2RTRENkNFQUM3NjcjKSkpKVxuIiwKKyAgICAgICIxRkI1NjA2OTk4NUYxOEM0NTE5Njk0RkI3MTA1NTcyMUEwMUYxNDQyMkRDOTAxQzM1QjAzQTY0RDRBNUJEMSIKKyAgICAgICIyNTlENTczMzA1RjVCMDU2QUM5MzFCODJFREIwODRFMzlBMEZEMUQxQTg2Q0M1QjE0N0EyNjRGN0VGNEVCMiIKKyAgICAgICIwRUQxRTdGQUFFNUNBRTRDMzBENTMyOEI3Rjc0QzNDQUE3MkM4OEI3MERFRDhFREUyMDdCODYyOURBMjM4MyIKKyAgICAgICJCNzhDM0NFMUNBM0Y5RjIxOEQ3OEM5MzhCMzU3NjNBRjJBODcxNDY2NENDNTdGNUNFQ0UyNDEzODQxRjVFOSIKKyAgICAgICJFREVDNDNCNzI4RTI1QTQxQkYzRTFFRjhEOUVFRTE2MzI4NkM5RjhCRjBGMjE5RDNCMzIyQzNFNEIwMzg5QyIKKyAgICAgICIyRThCQjI4REMwNEM0N0RBMkJGMzg4MjM3MzEyNjZEMkNGNkNDM0ZDMTgxNzM4MTU3NjI0RUYwNTE4NzREMCIKKyAgICAgICJCQkNDQjlGNjVDODMiCisgICAgICAvKiBOb3RlIHRoYXQgdGhpcyBleGFtcGxlIGluIFg5LjMxIGdpdmVzIHRoaXMgdmFsdWUgZm9yIEQ6CisKKyAgICAgICAgIjdFRDU4MUE2NjE3QzYzMTE0NjVBNTNFREM0MTU1Qzg2ODA3QzUxMDhCNzI0MDcwRDZDMEU5OTM1Mjk2RjQ0IgorICAgICAgICAiOTY3NTVDQ0MxN0Q2QzE1QUIyNEM2RTBCQjZDMjEzOEU2ODNGNDc0NkExQjMxNkM1MUU4OTkzREZCRDNBQzgiCisgICAgICAgICIzQjQ3OUZFQUI5NzJCOTMwQzM1NENBMkRGREQzMEYyQTlDQjIyMkRDMzdCNjNCNzg4MUVFMThBNzY4OEUwRSIKKyAgICAgICAgIkRFMzBGMzg3MjhGRTdDODYzNUUzMjRFMkNENUQ4RUJDQUExQzUxOTkzMzE1RkQ3M0IzODkwNEUxMDdEN0E3IgorICAgICAgICAiQjdCMTBFRENBMzg5NjkwNkZDRjg3QkUzNjdCQjg1OENBMUIyN0UyRkMzQzg2NzRFQ0M4QjBGOTJDMEUyNzAiCisgICAgICAgICJCQTJFQ0EzNzAxMzExRjY4QUZDRTIwOERDQzQ5OUI0QjNEQjMwRkYwNjA1Q0UwNTVEODkzQkMxNDYxRDM0MiIKKyAgICAgICAgIkVGMzJFN0Q5NzIwQiIgCisKKyAgICAgICAgVGhpcyBpcyBhIGJ1ZyBpbiBYOS4zMSwgb2J2aW91c2x5IGludHJvZHVjZWQgYnkgdXNpbmcKKworICAgICAgICAgICBkID0gZV57LTF9IG1vZCAocC0xKShxLTEpCisgICAgICAgICAgCisgICAgICAgICBpbnN0ZWFkIG9mIHVzaW5nIHRoZSB1bml2ZXJzYWwgZXhwb25lbnQgYXMgcmVxdWlyZWQgYnkgNC4xLjM6CisKKyAgICAgICAgICAgZCA9IGVeey0xfSBtb2QgbGNtKHAtMSxxLTEpCisKKyAgICAgICAgIFRoZSBleGFtcGxlcyBpbiBYOS4zMSBzZWVtIHRvIGJlIHByZXR0eSBidWdneSwgc2VlCisgICAgICAgICBjaXBoZXIvcHJpbWVnZW4uYyBmb3IgYW5vdGhlciBidWcuICBOb3Qgb25seSB0aGF0IEkgaGFkIHRvCisgICAgICAgICBzcGVuZCAxMDAgVVNEIGZvciB0aGUgNjYgcGFnZXMgb2YgdGhlIGRvY3VtZW50LCBpdCBhbHNvIHRvb2sKKyAgICAgICAgIG1lIHNldmVyYWwgaG91cnMgdG8gZmlndXJlIG91dCB0aGF0IHRoZSBidWdzIGFyZSBpbiB0aGUKKyAgICAgICAgIGRvY3VtZW50IGFuZCBub3QgaW4gbXkgY29kZS4KKyAgICAgICAqLworICAgIH0sICAKKworICAgIHsgLyogRmlyc3QgZXhhbXBsZSBmcm9tIE5JU1QgUlNBVlMgKEIuMS4xKS4gICovCisgICAgICAiKGdlbmtleVxuIgorICAgICAgIiAgKHJzYVxuIgorICAgICAgIiAgICAobmJpdHMgNDoxMDI0KVxuIgorICAgICAgIiAgICAocnNhLXVzZS1lIDE6MylcbiIKKyAgICAgICIgICAgKGRlcml2ZS1wYXJtc1xuIgorICAgICAgIiAgICAgIChYcDEgIzFlZDNkNjM2OGUxMDFkYWI5MTI0YzkyYWM4IylcbiIKKyAgICAgICIgICAgICAoWHAyICMxNmU1NDU3Yjg4NDQ5NjdjZTgzY2FiOGMxMSMpXG4iCisgICAgICAiICAgICAgKFhwICAjYjc5ZjJjMjQ5M2I0Yjc2ZjMyOTkwM2Q3NTU1YjdmNWYwNmFhYTVlYVxuIgorICAgICAgIiAgICAgICAgICAgIGFiMjYyZGExZGNkYTgxOTQ3MjA2NzJhNGUwMjIyOWEwYzcxZjYwYWVcbiIKKyAgICAgICIgICAgICAgICAgICBjNGYwZDJlZDhkNDllZjU4M2NhN2Q1ZWVlYTkwN2MxMDgwMWMzMDJhXG4iCisgICAgICAiICAgICAgICAgICAgY2FiNDQ1OTUjKVxuIgorICAgICAgIiAgICAgIChYcTEgIzFhNWQ5ZTNmYTM0ZmI0NzliZWRlYTQxMmY2IylcbiIKKyAgICAgICIgICAgICAoWHEyICMxZjljY2E4NWYxODUzNDE1MTZkOTJlODJmZCMpXG4iCisgICAgICAiICAgICAgKFhxICAjYzgzODdmZDM4ZmEzM2RkY2VhNmE5ZGUxYjJkNTU0MTA2NjM1MDJkYlxuIgorICAgICAgIiAgICAgICAgICAgIGMyMjU2NTVhOTMxMGNjZWFjOWY0Y2YxYmNlNjUzZWM5MTZkNDU3ODhcbiIKKyAgICAgICIgICAgICAgICAgICBmODExM2M0NmJjMGZhNDJiZjVlOGQwYzQxMTIwYzE2MTJlMmVhOGJiXG4iCisgICAgICAiICAgICAgICAgICAgMmYzODllZGEjKSkpKVxuIiwKKyAgICAgICIxN2VmN2FkNGZkOTYwMTFiNjJkNzZkZmIyMjYxYjRiMzI3MGNhOGUwN2JjNTAxYmU5NTRmODcxOWVmNTg2YiIKKyAgICAgICJmMjM3ZThmNjkzZGQxNmMyM2U3YWRlY2M0MDI3OWRjNjg3N2M2MmFiNTQxZGY1ODQ5ODgzYTUyNTRmY2NmZCIKKyAgICAgICI0MDcyYTY1N2I3ZjQ2NjM5NTM5MzAzNDZmZWJkNmJiZDgyZjlhNDk5MDM4NDAyY2JmOTdmZDVmMDY4MDgzYSIKKyAgICAgICJjODFhZDAzMzVjNGFhYjBkYTE5Y2ZlYmUwNjBhMWJhYzc0ODI3MzhlZmFmZWEwNzhlMjFkZjc4NWU1NmVhMCIKKyAgICAgICJkYzdlOGZlYiIKKyAgICB9LAorCisgICAgeyAvKiBTZWNvbmQgZXhhbXBsZSBmcm9tIE5JU1QgUlNBVlMgKEIuMS4xKS4gICovCisgICAgICAiKGdlbmtleVxuIgorICAgICAgIiAgKHJzYVxuIgorICAgICAgIiAgICAobmJpdHMgNDoxNTM2KVxuIgorICAgICAgIiAgICAocnNhLXVzZS1lIDE6MylcbiIKKyAgICAgICIgICAgKGRlcml2ZS1wYXJtc1xuIgorICAgICAgIiAgICAgIChYcDEgIzFlNjRjMWFmNDYwZGZmODg0MmMyMmI2NGQwIylcbiIKKyAgICAgICIgICAgICAoWHAyICMxZTk0OGVkY2VkYmE4NDAzOWM4MWYyYWMwYyMpXG4iCisgICAgICAiICAgICAgKFhwICAjYzhjNjdkZjg5NGM4ODIwNDVlZGUyNmE5MDA4YWIwOWVhMDY3MjA3N1xuIgorICAgICAgIiAgICAgICAgICAgIGQ3YmM3MWQ0MTI1MTFjZDkzOTgxZGRkZThmOTFiOTY3ZGE0MDQwNTZcbiIKKyAgICAgICIgICAgICAgICAgICBjMzlmMTA1ZjdmMjM5YWJkYWZmOTI5MjM4NTk5MjBmNjI5OWU4MmI5XG4iCisgICAgICAiICAgICAgICAgICAgNWJkNWI4Yzk1OTk0OGY0YTAzNGQ4MTYxM2Q2MjM1YTM5NTNiNDljZVxuIgorICAgICAgIiAgICAgICAgICAgIDI2OTc0ZWI3YmIxZjE0ODQzODQxMjgxYjM2M2I5Y2RiIylcbiIKKyAgICAgICIgICAgICAoWHExICMxZjNkZjBmMDE3ZGRkMDU2MTFhOTdiNmFkYiMpXG4iCisgICAgICAiICAgICAgKFhxMiAjMTQzZWRkN2IyMmQ4Mjg5MTNhYmYyNGNhNGQjKVxuIgorICAgICAgIiAgICAgIChYcSAgI2YxNTE0N2QwZTdjMDRhMWUzZjM3YWRkZTgwMmNkYzYxMDk5OWJmN2FcbiIKKyAgICAgICIgICAgICAgICAgICBiMDA4ODQzNGFhZWRhMGMwYWIzOTEwYjE0ZDJjZTU2Y2I2NmJmZmQ5XG4iCisgICAgICAiICAgICAgICAgICAgNzU1MjE5NWZhZThiMDYxMDc3ZTAzOTIwODE0ZDhiOWNmYjVhMzk1OFxuIgorICAgICAgIiAgICAgICAgICAgIGIzYTgyYzJhN2ZjOTdlNTVkYjU0Mzk0OGQzMzk2Mjg5MjQ1MzM2ZWNcbiIKKyAgICAgICIgICAgICAgICAgICA5ZTNjYjMwOGNjNjU1YWViZDc2NjM0MGRhODkyMTM4MyMpKSkpXG4iLAorICAgICAgIjFmOGIxOWYzZjVmMmFjOWZjNTk5ZjExMGNhZDQwM2RjZDliZGY1ZjdmMDBmYjI3OTBlNzhlODIwMzk4MTg0IgorICAgICAgIjFmM2ZiM2RkMjMwZmIyMjNkODk4ZjQ1NzE5ZDliMmQzNTI1NTg3ZmYyYjhiY2M3NDI1ZTQwNTUwYTViNTM2IgorICAgICAgIjFjOGU5YzFkMjZlODNmYmQ5YzMzYzY0MDI5YzBlODc4YjgyOWQ1NWRlZjEyOTEyYjczZDk0ZmQ3NThjNDYxIgorICAgICAgIjBmNDczZTIzMGM0MWI1ZTRjODZlMjdjNWE1MDI5ZDgyYzgxMWM4ODUyNWQwMjY5Yjk1YmQyZmYyNzI5OTRhIgorICAgICAgImRiZDgwZjJjMmVjZjY5MDY1ZmViOGFiZDhiNDQ1YjljNmQzMDZiMTU4NWQ3ZDNkNzU3NmQ0OTg0MmJjN2UyIgorICAgICAgIjhiNGEyZjg4ZjRhNDdlNzFjM2VkZDM1ZmRmODNmNTQ3ZWE1YzJiNTMyOTc1YzU1MWVkNTI2OGY3NDhiMmM0IgorICAgICAgIjJjY2Y4YTg0ODM1YiIKKyAgICB9CisgIH07CisgIGdwZ19lcnJvcl90IGVycjsKKyAgZ2NyeV9zZXhwX3Qga2V5X3NwZWMsIGtleSwgcHViX2tleSwgc2VjX2tleTsKKyAgZ2NyeV9tcGlfdCBkX2V4cGVjdGVkLCBkX2hhdmU7CisKKyAgaWYgKHdoYXQgPCAwICYmIHdoYXQgPj0gc2l6ZW9mIHRlc3R0YWJsZSkKKyAgICBkaWUgKCJpbnZhbGlkIFdIQVQgdmFsdWVcbiIpOworCisgIGVyciA9IGdjcnlfc2V4cF9uZXcgKCZrZXlfc3BlYywgdGVzdHRhYmxlW3doYXRdLnBhcmFtLCAwLCAxKTsKKyAgaWYgKGVycikKKyAgICBkaWUgKCJlcnJvciBjcmVhdGluZyBTLWV4cHJlc3Npb24gWyVkXTogJXNcbiIsIHdoYXQsIGdwZ19zdHJlcnJvciAoZXJyKSk7CisKKyAgZXJyID0gZ2NyeV9wa19nZW5rZXkgKCZrZXksIGtleV9zcGVjKTsKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKGtleV9zcGVjKTsKKyAgaWYgKGVycikKKyAgICBkaWUgKCJlcnJvciBnZW5lcmF0aW5nIFJTQSBrZXkgWyVkXTogJXNcbiIsIHdoYXQsIGdwZ19zdHJlcnJvciAoZXJyKSk7CisgICAgCisgIHB1Yl9rZXkgPSBnY3J5X3NleHBfZmluZF90b2tlbiAoa2V5LCAicHVibGljLWtleSIsIDApOworICBpZiAoIXB1Yl9rZXkpCisgICAgZGllICgicHVibGljIHBhcnQgbWlzc2luZyBpbiBrZXkgWyVkXVxuIiwgd2hhdCk7CisKKyAgc2VjX2tleSA9IGdjcnlfc2V4cF9maW5kX3Rva2VuIChrZXksICJwcml2YXRlLWtleSIsIDApOworICBpZiAoIXNlY19rZXkpCisgICAgZGllICgicHJpdmF0ZSBwYXJ0IG1pc3NpbmcgaW4ga2V5IFslZF1cbiIsIHdoYXQpOworCisgIGVyciA9IGdjcnlfbXBpX3NjYW4gCisgICAgKCZkX2V4cGVjdGVkLCBHQ1JZTVBJX0ZNVF9IRVgsIHRlc3R0YWJsZVt3aGF0XS5leHBlY3RlZF9kLCAwLCBOVUxMKTsKKyAgaWYgKGVycikKKyAgICBkaWUgKCJlcnJvciBjb252ZXJ0aW5nIHN0cmluZyBbJWRdXG4iLCB3aGF0KTsKKworICBpZiAodmVyYm9zZSA+IDEpCisgICAgc2hvd19zZXhwICgiZ2VuZXJhdGVkIGtleTpcbiIsIGtleSk7CisKKyAgZF9oYXZlID0ga2V5X3BhcmFtX2Zyb21fc2V4cCAoc2VjX2tleSwgInJzYSIsICJkIik7CisgIGlmICghZF9oYXZlKQorICAgIGRpZSAoInBhcmFtZXRlciBkIG5vdCBmb3VuZCBpbiBSU0Egc2VjcmV0IGtleSBbJWRdXG4iLCB3aGF0KTsKKyAgaWYgKGdjcnlfbXBpX2NtcCAoZF9leHBlY3RlZCwgZF9oYXZlKSkKKyAgICB7CisgICAgICBzaG93X3NleHAgKE5VTEwsIHNlY19rZXkpOworICAgICAgZGllICgicGFyYW1ldGVyIGQgZG9lcyBtYXRjaCBleHBlY3RlZCB2YWx1ZSBbJWRdXG4iLCB3aGF0KTsgCisgICAgfQorICBnY3J5X21waV9yZWxlYXNlIChkX2V4cGVjdGVkKTsKKyAgZ2NyeV9tcGlfcmVsZWFzZSAoZF9oYXZlKTsKKworICBnY3J5X3NleHBfcmVsZWFzZSAoa2V5KTsKKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKHB1Yl9rZXkpOworICBnY3J5X3NleHBfcmVsZWFzZSAoc2VjX2tleSk7Cit9CisKKworCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBpbnQgZGVidWcgPSAwOworICBpbnQgaTsKKworICBpZiAoYXJnYyA+IDEgJiYgIXN0cmNtcCAoYXJndlsxXSwgIi0tdmVyYm9zZSIpKQorICAgIHZlcmJvc2UgPSAxOworICBlbHNlIGlmIChhcmdjID4gMSAmJiAhc3RyY21wIChhcmd2WzFdLCAiLS1kZWJ1ZyIpKQorICAgIHsKKyAgICAgIHZlcmJvc2UgPSAyOworICAgICAgZGVidWcgPSAxOworICAgIH0KKworICBnY3J5X2NvbnRyb2wgKEdDUllDVExfRElTQUJMRV9TRUNNRU0sIDApOworICBpZiAoIWdjcnlfY2hlY2tfdmVyc2lvbiAoR0NSWVBUX1ZFUlNJT04pKQorICAgIGRpZSAoInZlcnNpb24gbWlzbWF0Y2hcbiIpOworICBnY3J5X2NvbnRyb2wgKEdDUllDVExfSU5JVElBTElaQVRJT05fRklOSVNIRUQsIDApOworICBpZiAoZGVidWcpCisgICAgZ2NyeV9jb250cm9sIChHQ1JZQ1RMX1NFVF9ERUJVR19GTEFHUywgMXUgLCAwKTsKKyAgLyogTm8gdmFsdWFibGUga2V5cyBhcmUgY3JlYXRlLCBzbyB3ZSBjYW4gc3BlZWQgdXAgb3VyIFJORy4gKi8KKyAgZ2NyeV9jb250cm9sIChHQ1JZQ1RMX0VOQUJMRV9RVUlDS19SQU5ET00sIDApOworCisgIGZvciAoaT0wOyBpIDwgMjsgaSsrKQorICAgIGNoZWNrX3J1biAoKTsKKworICBmb3IgKGk9MDsgaSA8IDQ7IGkrKykKKyAgICBjaGVja194OTMxX2Rlcml2ZWRfa2V5IChpKTsKKyAgCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L3Rlc3RzL3JhbmRvbS5jIGIvbGliZ2NyeXB0LTEuNC42L3Rlc3RzL3JhbmRvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMmEzNzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQtMS40LjYvdGVzdHMvcmFuZG9tLmMKQEAgLTAsMCArMSwyNTUgQEAKKy8qIHJhbmRvbS5jIC0gcGFydCBvZiB0aGUgTGliZ2NyeXB0IHRlc3Qgc3VpdGUuCisgICBDb3B5cmlnaHQgKEMpIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAgIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICAgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorCisjaW5jbHVkZSAiLi4vc3JjL2djcnlwdC5oIgorCitzdGF0aWMgaW50IHZlcmJvc2U7CisKK3N0YXRpYyB2b2lkCitkaWUgKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICB2YV9saXN0IGFyZ19wdHI7CisKKyAgdmFfc3RhcnQgKGFyZ19wdHIsIGZvcm1hdCk7CisgIHZmcHJpbnRmIChzdGRlcnIsIGZvcm1hdCwgYXJnX3B0cik7CisgIHZhX2VuZCAoYXJnX3B0cik7CisgIGV4aXQgKDEpOworfQorCisKK3N0YXRpYyB2b2lkCitwcmludF9oZXggKGNvbnN0IGNoYXIgKnRleHQsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IG4pCit7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAgPSBidWY7CisKKyAgZnB1dHMgKHRleHQsIHN0ZG91dCk7CisgIGZvciAoOyBuOyBuLS0sIHArKykKKyAgICBwcmludGYgKCIlMDJYIiwgKnApOworICBwdXRjaGFyICgnXG4nKTsKK30KKworCitzdGF0aWMgaW50Cit3cml0ZW4gKGludCBmZCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgbmJ5dGVzKQoreworICBzaXplX3QgbmxlZnQgPSBuYnl0ZXM7CisgIGludCBud3JpdHRlbjsKKyAgCisgIHdoaWxlIChubGVmdCA+IDApCisgICAgeworICAgICAgbndyaXR0ZW4gPSB3cml0ZSAoZmQsIGJ1ZiwgbmxlZnQpOworICAgICAgaWYgKG53cml0dGVuIDwgMCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChlcnJubyA9PSBFSU5UUikKKyAgICAgICAgICAgIG53cml0dGVuID0gMDsKKyAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICBubGVmdCAtPSBud3JpdHRlbjsKKyAgICAgIGJ1ZiA9IChjb25zdCBjaGFyKilidWYgKyBud3JpdHRlbjsKKyAgICB9CisgICAgCisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CityZWFkbiAoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBidWZsZW4sIHNpemVfdCAqcmV0X25yZWFkKQoreworICBzaXplX3QgbmxlZnQgPSBidWZsZW47CisgIGludCBucmVhZDsKKyAgY2hhciAqcDsKKyAgCisgIHAgPSBidWY7CisgIHdoaWxlICggbmxlZnQgPiAwICkKKyAgICB7CisgICAgICBucmVhZCA9IHJlYWQgKCBmZCwgYnVmLCBubGVmdCApOworICAgICAgaWYgKG5yZWFkIDwgMCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChucmVhZCA9PSBFSU5UUikKKyAgICAgICAgICAgIG5yZWFkID0gMDsKKyAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICBlbHNlIGlmICghbnJlYWQpCisgICAgICAgIGJyZWFrOyAvKiBFT0YgKi8KKyAgICAgIG5sZWZ0IC09IG5yZWFkOworICAgICAgYnVmID0gKGNoYXIqKWJ1ZiArIG5yZWFkOworICAgIH0KKyAgaWYgKHJldF9ucmVhZCkKKyAgICAqcmV0X25yZWFkID0gYnVmbGVuIC0gbmxlZnQ7CisgIHJldHVybiAwOworfQorCisKKworLyogQ2hlY2sgdGhhdCBmb3JraW5nIHdvbid0IHJldHVybiB0aGUgc2FtZSByYW5kb20uICovCitzdGF0aWMgdm9pZAorY2hlY2tfZm9ya2luZyAodm9pZCkKK3sKKyAgcGlkX3QgcGlkOworICBpbnQgcnBbMl07CisgIGludCBpLCBzdGF0dXM7CisgIHNpemVfdCBucmVhZDsKKyAgY2hhciB0bXAxWzE2XSwgdG1wMWNbMTZdLCB0bXAxcFsxNl07CisgIAorICAvKiBXZSBiZXR0ZXIgbWFrZSBzdXJlIHRoYXQgdGhlIFJORyBoYXMgYmVlbiBpbml0aWFsemllZC4gKi8KKyAgZ2NyeV9yYW5kb21pemUgKHRtcDEsIHNpemVvZiB0bXAxLCBHQ1JZX1NUUk9OR19SQU5ET00pOworICBpZiAodmVyYm9zZSkKKyAgICBwcmludF9oZXggKCJpbml0aWFsIHJhbmRvbTogIiwgdG1wMSwgc2l6ZW9mIHRtcDEpOworCisgIGlmIChwaXBlIChycCkgPT0gLTEpCisgICAgZGllICgicGlwZSBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvciAoZXJybm8pKTsKKworICBwaWQgPSBmb3JrICgpOworICBpZiAocGlkID09IChwaWRfdCkoLTEpKQorICAgIGRpZSAoImZvcmsgZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IgKGVycm5vKSk7CisgIGlmICghcGlkKQorICAgIHsKKyAgICAgIGdjcnlfcmFuZG9taXplICh0bXAxYywgc2l6ZW9mIHRtcDFjLCBHQ1JZX1NUUk9OR19SQU5ET00pOworICAgICAgaWYgKHdyaXRlbiAocnBbMV0sIHRtcDFjLCBzaXplb2YgdG1wMWMpKQorICAgICAgICBkaWUgKCJ3cml0ZSBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGlmICh2ZXJib3NlKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRfaGV4ICgiICBjaGlsZCByYW5kb206ICIsIHRtcDFjLCBzaXplb2YgdG1wMWMpOworICAgICAgICAgIGZmbHVzaCAoc3Rkb3V0KTsKKyAgICAgICAgfQorICAgICAgX2V4aXQgKDApOworICAgIH0KKyAgZ2NyeV9yYW5kb21pemUgKHRtcDFwLCBzaXplb2YgdG1wMXAsIEdDUllfU1RST05HX1JBTkRPTSk7CisgIGlmICh2ZXJib3NlKQorICAgIHByaW50X2hleCAoIiBwYXJlbnQgcmFuZG9tOiAiLCB0bXAxcCwgc2l6ZW9mIHRtcDFwKTsKKworICBjbG9zZSAocnBbMV0pOworICBpZiAocmVhZG4gKHJwWzBdLCB0bXAxYywgc2l6ZW9mIHRtcDFjLCAmbnJlYWQpKQorICAgIGRpZSAoInJlYWQgZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IgKGVycm5vKSk7IAorICBpZiAobnJlYWQgIT0gc2l6ZW9mIHRtcDFjKQorICAgIGRpZSAoInJlYWQgdG9vIHNob3J0XG4iKTsKKworICB3aGlsZSAoIChpPXdhaXRwaWQgKHBpZCwgJnN0YXR1cywgMCkpID09IC0xICYmIGVycm5vID09IEVJTlRSKQorICAgIDsKKyAgaWYgKGkgIT0gKHBpZF90KSgtMSkKKyAgICAgICYmIFdJRkVYSVRFRCAoc3RhdHVzKSAmJiAhV0VYSVRTVEFUVVMgKHN0YXR1cykpCisgICAgOworICBlbHNlCisgICAgZGllICgiY2hpbGQgZmFpbGVkXG4iKTsKKworICBpZiAoIW1lbWNtcCAodG1wMXAsIHRtcDFjLCBzaXplb2YgdG1wMWMpKQorICAgIGRpZSAoInBhcmVudCBhbmQgY2hpbGQgZ290IHRoZSBzYW1lIHJhbmRvbSBudW1iZXJcbiIpOworfQorCisKKworLyogQ2hlY2sgdGhhdCBmb3JraW5nIHdvbid0IHJldHVybiB0aGUgc2FtZSBub25jZS4gKi8KK3N0YXRpYyB2b2lkCitjaGVja19ub25jZV9mb3JraW5nICh2b2lkKQoreworICBwaWRfdCBwaWQ7CisgIGludCBycFsyXTsKKyAgaW50IGksIHN0YXR1czsKKyAgc2l6ZV90IG5yZWFkOworICBjaGFyIG5vbmNlMVsxMF0sIG5vbmNlMWNbMTBdLCBub25jZTFwWzEwXTsKKyAgCisgIC8qIFdlIHdvbid0IGdldCB0aGUgc2FtZSBub25jZSBiYWNrIGlmIHdlIG5ldmVyIGluaXRpYWxpemVkIHRoZQorICAgICBub25jZSBzdWJzeXN0ZW0sIHRodXMgd2UgZ2V0IG9uZSBub25jZSBoZXJlIGFuZCBmb3JnZXQgYWJvdXQKKyAgICAgaXQuICovCisgIGdjcnlfY3JlYXRlX25vbmNlIChub25jZTEsIHNpemVvZiBub25jZTEpOworICBpZiAodmVyYm9zZSkKKyAgICBwcmludF9oZXggKCJpbml0aWFsIG5vbmNlOiAiLCBub25jZTEsIHNpemVvZiBub25jZTEpOworCisgIGlmIChwaXBlIChycCkgPT0gLTEpCisgICAgZGllICgicGlwZSBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvciAoZXJybm8pKTsKKworICBwaWQgPSBmb3JrICgpOworICBpZiAocGlkID09IChwaWRfdCkoLTEpKQorICAgIGRpZSAoImZvcmsgZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IgKGVycm5vKSk7CisgIGlmICghcGlkKQorICAgIHsKKyAgICAgIGdjcnlfY3JlYXRlX25vbmNlIChub25jZTFjLCBzaXplb2Ygbm9uY2UxYyk7CisgICAgICBpZiAod3JpdGVuIChycFsxXSwgbm9uY2UxYywgc2l6ZW9mIG5vbmNlMWMpKQorICAgICAgICBkaWUgKCJ3cml0ZSBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGlmICh2ZXJib3NlKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRfaGV4ICgiICBjaGlsZCBub25jZTogIiwgbm9uY2UxYywgc2l6ZW9mIG5vbmNlMWMpOworICAgICAgICAgIGZmbHVzaCAoc3Rkb3V0KTsKKyAgICAgICAgfQorICAgICAgX2V4aXQgKDApOworICAgIH0KKyAgZ2NyeV9jcmVhdGVfbm9uY2UgKG5vbmNlMXAsIHNpemVvZiBub25jZTFwKTsKKyAgaWYgKHZlcmJvc2UpCisgICAgcHJpbnRfaGV4ICgiIHBhcmVudCBub25jZTogIiwgbm9uY2UxcCwgc2l6ZW9mIG5vbmNlMXApOworCisgIGNsb3NlIChycFsxXSk7CisgIGlmIChyZWFkbiAocnBbMF0sIG5vbmNlMWMsIHNpemVvZiBub25jZTFjLCAmbnJlYWQpKQorICAgIGRpZSAoInJlYWQgZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IgKGVycm5vKSk7IAorICBpZiAobnJlYWQgIT0gc2l6ZW9mIG5vbmNlMWMpCisgICAgZGllICgicmVhZCB0b28gc2hvcnRcbiIpOworCisgIHdoaWxlICggKGk9d2FpdHBpZCAocGlkLCAmc3RhdHVzLCAwKSkgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpCisgICAgOworICBpZiAoaSAhPSAocGlkX3QpKC0xKQorICAgICAgJiYgV0lGRVhJVEVEIChzdGF0dXMpICYmICFXRVhJVFNUQVRVUyAoc3RhdHVzKSkKKyAgICA7CisgIGVsc2UKKyAgICBkaWUgKCJjaGlsZCBmYWlsZWRcbiIpOworCisgIGlmICghbWVtY21wIChub25jZTFwLCBub25jZTFjLCBzaXplb2Ygbm9uY2UxYykpCisgICAgZGllICgicGFyZW50IGFuZCBjaGlsZCBnb3QgdGhlIHNhbWUgbm9uY2VcbiIpOworfQorCisKKworCisKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIGludCBkZWJ1ZyA9IDA7CisKKyAgaWYgKChhcmdjID4gMSkgJiYgKCEgc3RyY21wIChhcmd2WzFdLCAiLS12ZXJib3NlIikpKQorICAgIHZlcmJvc2UgPSAxOworICBlbHNlIGlmICgoYXJnYyA+IDEpICYmICghIHN0cmNtcCAoYXJndlsxXSwgIi0tZGVidWciKSkpCisgICAgdmVyYm9zZSA9IGRlYnVnID0gMTsKKworICBzaWduYWwgKFNJR1BJUEUsIFNJR19JR04pOworCisgIGdjcnlfY29udHJvbCAoR0NSWUNUTF9ESVNBQkxFX1NFQ01FTSwgMCk7CisgIGlmICghZ2NyeV9jaGVja192ZXJzaW9uIChHQ1JZUFRfVkVSU0lPTikpCisgICAgZGllICgidmVyc2lvbiBtaXNtYXRjaFxuIik7CisKKyAgZ2NyeV9jb250cm9sIChHQ1JZQ1RMX0lOSVRJQUxJWkFUSU9OX0ZJTklTSEVELCAwKTsKKyAgaWYgKGRlYnVnKQorICAgIGdjcnlfY29udHJvbCAoR0NSWUNUTF9TRVRfREVCVUdfRkxBR1MsIDF1LCAwKTsKKworICBjaGVja19mb3JraW5nICgpOworICBjaGVja19ub25jZV9mb3JraW5nICgpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L3Rlc3RzL3JlZ2lzdGVyLmMgYi9saWJnY3J5cHQtMS40LjYvdGVzdHMvcmVnaXN0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjkwZmUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L3Rlc3RzL3JlZ2lzdGVyLmMKQEAgLTAsMCArMSwxODcgQEAKKy8qIHJlZ2lzdGVyLmMgLSBUZXN0IGZvciByZWdpc3RlcmluZyBvZiBhZGRpdGlvbmFsIGNpcGhlciBtb2R1bGVzLgorICoJQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgIi4uL3NyYy9nY3J5cHQuaCIKKworc3RhdGljIGludCB2ZXJib3NlOworc3RhdGljIGludCBpbl9maXBzX21vZGU7CisKK3N0YXRpYyB2b2lkCitkaWUgKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICB2YV9saXN0IGFyZ19wdHIgOworCisgIHZhX3N0YXJ0KCBhcmdfcHRyLCBmb3JtYXQgKSA7CisgIHZmcHJpbnRmIChzdGRlcnIsIGZvcm1hdCwgYXJnX3B0ciApOworICB2YV9lbmQoYXJnX3B0cik7CisgIGV4aXQgKDEpOworfQorCitnY3J5X2Vycl9jb2RlX3QKK2Zvb19zZXRrZXkgKHZvaWQgKmMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgdW5zaWduZWQga2V5bGVuKQoreworICAodm9pZCljOworICAodm9pZClrZXk7CisgICh2b2lkKWtleWxlbjsKKworICByZXR1cm4gMDsKK30KKworI2RlZmluZSBGT09fQkxPQ0tTSVpFIDE2CisKK3ZvaWQKK2Zvb19lbmNyeXB0ICh2b2lkICpjLCB1bnNpZ25lZCBjaGFyICpvdXRidWYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluYnVmKQoreworICBpbnQgaTsKKworICAodm9pZCljOworCisgIGZvciAoaSA9IDA7IGkgPCBGT09fQkxPQ0tTSVpFOyBpKyspCisgICAgb3V0YnVmW2ldID0gaW5idWZbaV0gXiAweDQyOworfQorCit2b2lkCitmb29fZGVjcnlwdCAodm9pZCAqYywgdW5zaWduZWQgY2hhciAqb3V0YnVmLCBjb25zdCB1bnNpZ25lZCBjaGFyICppbmJ1ZikKK3sKKyAgaW50IGk7CisKKyAgKHZvaWQpYzsKKworICBmb3IgKGkgPSAwOyBpIDwgRk9PX0JMT0NLU0laRTsgaSsrKQorICAgIG91dGJ1ZltpXSA9IGluYnVmW2ldIF4gMHg0MjsKK30KKworZ2NyeV9jaXBoZXJfc3BlY190IGNpcGhlcl9zcGVjX2ZvbyA9CisgIHsKKyAgICAiRk9PIiwgTlVMTCwgTlVMTCwgMTYsIDAsIDAsCisgICAgZm9vX3NldGtleSwgZm9vX2VuY3J5cHQsIGZvb19kZWNyeXB0LAorICAgIE5VTEwsIE5VTEwsCisgIH07CisKK2ludAorY2hlY2tfbGlzdCAoaW50IGFsZ29yaXRobSkKK3sKKyAgZ2NyeV9lcnJvcl90IGVyciA9IEdQR19FUlJfTk9fRVJST1I7CisgIGludCAqbGlzdCwgbGlzdF9sZW5ndGg7CisgIGludCBpLCByZXQgPSAwOworCisgIGVyciA9IGdjcnlfY2lwaGVyX2xpc3QgKE5VTEwsICZsaXN0X2xlbmd0aCk7CisgIGFzc2VydCAoISBlcnIpOworICBsaXN0ID0gbWFsbG9jIChzaXplb2YgKGludCkgKiBsaXN0X2xlbmd0aCk7CisgIGFzc2VydCAobGlzdCk7CisgIGVyciA9IGdjcnlfY2lwaGVyX2xpc3QgKGxpc3QsICZsaXN0X2xlbmd0aCk7CisgIAorICBmb3IgKGkgPSAwOyBpIDwgbGlzdF9sZW5ndGggJiYgKCEgcmV0KTsgaSsrKQorICAgIGlmIChsaXN0W2ldID09IGFsZ29yaXRobSkKKyAgICAgIHJldCA9IDE7CisKKyAgcmV0dXJuIHJldDsKK30KKwordm9pZAorY2hlY2tfcnVuICh2b2lkKQoreworICBpbnQgZXJyLCBhbGdvcml0aG07CisgIGdjcnlfY2lwaGVyX2hkX3QgaDsKKyAgY2hhciBwbGFpblsxNl0gPSAiSGVpbCBEaXNjb3JkaWEhIjsKKyAgY2hhciBlbmNyeXB0ZWRbMTZdLCBkZWNyeXB0ZWRbMTZdOworICBnY3J5X21vZHVsZV90IG1vZHVsZTsKKyAgaW50IHJldDsKKworICBlcnIgPSBnY3J5X2NpcGhlcl9yZWdpc3RlciAoJmNpcGhlcl9zcGVjX2ZvbywgJmFsZ29yaXRobSwgJm1vZHVsZSk7CisgIGlmIChpbl9maXBzX21vZGUpCisgICAgeworICAgICAgaWYgKGdwZ19lcnJfY29kZSAoZXJyKSAhPSBHUEdfRVJSX05PVF9TVVBQT1JURUQpCisgICAgICAgIGRpZSAoInJlZ2lzdGVyIGNpcGhlciBmYWlsZWQgaW4gZmlwcyBtb2RlOiAlc1xuIiwgZ3BnX3N0cmVycm9yIChlcnIpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoZXJyKQorICAgICAgICBkaWUgKCJyZWdpc3RlciBjaXBoZXIgZmFpbGVkOiAlc1xuIiwgZ3BnX3N0cmVycm9yIChlcnIpKTsKKyAgICB9CisKKyAgZXJyID0gZ2NyeV9jaXBoZXJfb3BlbiAoJmgsIGFsZ29yaXRobSwgR0NSWV9DSVBIRVJfTU9ERV9DQkMsIDApOworICBpZiAoZXJyKQorICAgIGRpZSAoImdjcnlfY2lwaGVyX29wZW4gZmFpbGVkOiAlc1xuIiwgZ3BnX3N0cmVycm9yIChlcnIpKTsKKworICBlcnIgPSBnY3J5X2NpcGhlcl9lbmNyeXB0IChoLAorCQkJICAgICAodW5zaWduZWQgY2hhciAqKSBlbmNyeXB0ZWQsIHNpemVvZiAoZW5jcnlwdGVkKSwKKwkJCSAgICAgKHVuc2lnbmVkIGNoYXIgKikgcGxhaW4sIHNpemVvZiAocGxhaW4pKTsKKyAgYXNzZXJ0ICghIGVycik7CisgIGFzc2VydCAobWVtY21wICgodm9pZCAqKSBwbGFpbiwgKHZvaWQgKikgZW5jcnlwdGVkLCBzaXplb2YgKHBsYWluKSkpOworCisgIGVyciA9IGdjcnlfY2lwaGVyX3Jlc2V0IChoKTsKKyAgYXNzZXJ0ICghIGVycik7CisKKyAgZXJyID0gZ2NyeV9jaXBoZXJfZGVjcnlwdCAoaCwKKwkJCSAgICAgKHVuc2lnbmVkIGNoYXIgKikgZGVjcnlwdGVkLCBzaXplb2YgKGRlY3J5cHRlZCksCisJCQkgICAgICh1bnNpZ25lZCBjaGFyICopIGVuY3J5cHRlZCwgc2l6ZW9mIChlbmNyeXB0ZWQpKTsKKyAgYXNzZXJ0ICghIGVycik7CisgIGFzc2VydCAoISBtZW1jbXAgKCh2b2lkICopIHBsYWluLCAodm9pZCAqKSBkZWNyeXB0ZWQsIHNpemVvZiAocGxhaW4pKSk7CisKKyAgcmV0ID0gY2hlY2tfbGlzdCAoYWxnb3JpdGhtKTsKKyAgYXNzZXJ0IChyZXQpOworCisgIGdjcnlfY2lwaGVyX2Nsb3NlIChoKTsKKworICBnY3J5X2NpcGhlcl91bnJlZ2lzdGVyIChtb2R1bGUpOworCisgIHJldCA9IGNoZWNrX2xpc3QgKGFsZ29yaXRobSk7CisgIGFzc2VydCAoISByZXQpOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgaW50IGRlYnVnID0gMDsKKyAgaW50IGkgPSAxOworCisgIGlmIChhcmdjID4gMSAmJiAhc3RyY21wIChhcmd2WzFdLCAiLS12ZXJib3NlIikpCisgICAgdmVyYm9zZSA9IDE7CisgIGVsc2UgaWYgKGFyZ2MgPiAxICYmICFzdHJjbXAgKGFyZ3ZbMV0sICItLWRlYnVnIikpCisgICAgdmVyYm9zZSA9IGRlYnVnID0gMTsKKworICBnY3J5X2NvbnRyb2wgKEdDUllDVExfRElTQUJMRV9TRUNNRU0sIDApOworICBpZiAoIWdjcnlfY2hlY2tfdmVyc2lvbiAoR0NSWVBUX1ZFUlNJT04pKQorICAgIGRpZSAoInZlcnNpb24gbWlzbWF0Y2hcbiIpOworICBnY3J5X2NvbnRyb2wgKEdDUllDVExfSU5JVElBTElaQVRJT05fRklOSVNIRUQsIDApOworICBpZiAoZGVidWcpCisgICAgZ2NyeV9jb250cm9sIChHQ1JZQ1RMX1NFVF9ERUJVR19GTEFHUywgMXUgLCAwKTsKKworICBpZiAoIGdjcnlfY29udHJvbCAoR0NSWUNUTF9GSVBTX01PREVfUCwgMCkgKQorICAgIGluX2ZpcHNfbW9kZSA9IDE7CisKKyAgZm9yICg7IGkgPiAwOyBpLS0pCisgICAgY2hlY2tfcnVuICgpOworCisgIC8qIEluIGZpcHMgbW9kZSB3ZSBsZXQgdGhlIE1ha2VmaWxlIHNraXAgdGhpcyB0ZXN0IGJlY2F1c2UgYSBQQVNTCisgICAgIHdvdWxkIG5vdCBtYWtlIG11Y2ggc2Vuc2Ugd2l0aCBhbGwgZWdpc3RlcmluZyBkaXNhYmxlZC4gKi8KKyAgcmV0dXJuIGluX2ZpcHNfbW9kZT8gNzc6MDsgCit9CmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvdGVzdHMvcnNhLTE2ay5rZXkgYi9saWJnY3J5cHQtMS40LjYvdGVzdHMvcnNhLTE2ay5rZXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE3OTE1YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC0xLjQuNi90ZXN0cy9yc2EtMTZrLmtleQpAQCAtMCwwICsxLDE4IEBACisoa2V5LWRhdGEgCisgKHB1YmxpYy1rZXkgCisgIChyc2EgCisgICAobiAjMDBENjAwN0E3QUQ0N0JCOEQ2QjM1NkU0RjI0REZBRUUzQTcyMkZFRTc3RjdFOTU0N0Y4NjZDQjM2OUMyMzNFNkNCMzkxNkQ0MTY5NzNFMzE1N0I0REMxODM3RTZENEM5MDdEMTA2Mzg1NTczNUVBQTg1NzE3NkE3REEzQ0E5RjM3OEZGN0FFOUVGMjI3QzE5Mzk2NUYxMDZGMzVEQjJBODMzRDI3NjBDRjlGMkQwNDE5MzhDRDMxMEQ5Q0UzOEVERDE3OUMzM0VCQzQ5NjNBMDIyMjFEODAwMEZEQkY0QkVCNTkyQ0FCMUVEMUVFRUM5RDY5MTZGMjcyNjNDNzZERTcwMTg0RjUzOTlERTNCMzg2MjIyNzM0NkIxQjNGQkEzMDYxNzREMDhCRUMzNjc1RTI1OTNDRkQ0MjE1OTY1NUIwQkUxQTJCNjlDMkJBOUY0RjAzQjhDNkJBNTA1RjZCRkRGQzYxNjNENzRGNDJBNkQ0OTA4Mjg0RDY4NzlDRUNDRjY1MTJGOTIyNTYxMkUzMDMwQUNGMzY2M0RGQjc3QjQxQUZGQ0ZDNzBCQzExQjIyNEUxNEIzOTdEMjVBQzE1RTRFMzQyQjM0QjM2MzA1NkVBNzZDQjAyNjVEQkQ0MUY3MzNDN0ZERTk4QjdDMjM0MDI4OUUzMzhDRDMxRjk5M0FCRkFDQTZFODNCNTRCQ0I1MEREMUREMTExNjVDMTg4QzgwRUJEQTE5MEExMUI2RDg5ODJDREExQjZCOUQxNjMxQUEzRUFDQzkzMDQwMjM3ODMxQTUyRDE1ODI2QTBEM0U5MkM4MzNEMDIzNDk3NUM5MkE3MjM2RjkwMkZBNjcwM0M4OUM3Nzc5NzY1MDIwQzExRjcxNEI0QzlEMzNCNzZDRDQ2NkRDMkJFOUExMDI0ODhCMDYzNUYzMUU2RkJCOTI4MkU1MTM5RDMyNjIzRTEwRUQ5QzI5NURBM0IzOUY2ODIyNzIxOEVERjhDNkZFOTM3MkYxNzRBRTFERTVCQkU3QjBBRjA5QTg2OUNBRURCRUZFMDU0NThCRkQ0M0NGMzJGMTBGNUMzNDVBMkUzRDU4OEM4QzE2QjREQThCNDRGQTk1MzlDNjc5QjgxMTMzQTM1NDk4Njk2RjVEODY2RTNCNkE4OTgxMUFFQTdCRkQxQkY2OTBFQzMyOUQ4Nzk4OUNEQURBN0VBQjEwNjc4NUQyRDY2NjFCRDQwMEQ3NkMxMTNFMjhGMTNGRDg4MzAyN0UxQ0FDODQ4QjEzNzUwQzdDQ0Q1MzAyNzNDMTY1QkRGREE5M0U2RjcyODk3RTk3RjAwMzMwODcwNEI5NTgwMUYyMjNFRTg5MTYwNzg2QjFERTQ0MEJBOUMxRjM3MUNCQTM3RTVCMDk2NTBDREIzQUExQUJBQTIzN0FEMTVCODlEQ0QwMzM5MEEyODMwODY0M0UyMTk0OTBCRUM4MzQwM0Y2QTA5Qjk0RjgxRDdCQjM5MUMxMjFGQzkwMjhBNjkwOEU1QjI4N0FDNzkyMDlCOTA1QjMzNzI0QjE4NjlBNjc5Q0IzNDdCRjE5MkQ4MEQyRDY2Q0YxREFFRkVCQkYyMkNFREI4Q0VDMDEwRDZGOEQ4NkNEMDU1RUQ3MTQyNURBNzJERjFDMDdBNTczRTZGMDcwMjM1QzM3OERBQjU0MDRFRDAwNEI0OTQ2Q0NEQTQ3ODZBQ0JCRjM3OUE0N0NDMzZBMDQ5QzUwNjUxQ0E0QjFDRUYwM0VFODdEQjZEMjQ4NEMzRDEwQUY3MTc5OEE2QUQxRTIwNzgwODE0Rjc5MzQ4RDQ1QkQxMDA0ODgwRDJERURFQkQxNTI2OTRDODBCOUY5M0RGMzJGNTkzMDkxMURCMzc5QjRDQkI5MjMwQ0ZDNUZDMTI2QjlCNzdGMDc0QjlDODJCREI0RjEyNDcxQjNGRTkyMDc5NTI1RkQyNzYyOTNCNjNCOTc4QjU1RTAzOTAyNEVFNjg4MTgwRDdDN0M2QzA5NEI3NTRBQjlCNjUyQUMzMTgxMkYyRjdFNDVFRjJCNkQ0NDc4RDdDNkU1QzhGM0NCMEE0RDA0QTNFNjkzRDFERDREOEY4OTRFOTEwRDlBOTk5RERBQkUwNDI3QTFBQjBDNzE1QzVBNjk1QTY5MTQwQjIwQjlEQTExOTVFNkM5NTM2QjVERjI0QjRENDVFRDI0RDBGMkMyNzZFM0NGNDgwNjZFRkI5NzdDMkI3MDk2QjAyRUI1MjMwOUQ5MTZCRDQzMjM0N0Q3Mjc5OUJGOUQ3NkEwM0Q1NERFMjExNDYwMDE3QzBFMjY4QkM5RTIzQjQxNUFCRjQ2RUI4QjkzOUI1QTQxM0VCRDNGMjBFOTVGNzA0RTFGMkNEQ0RGOTc0QTg3NDM5MjNEQkM2RDgzNjNEQzg5NDhCRTg1RUYxRDM2OENEM0VBQkRCRTVCODI2NDhEMkY2NzZFQjMxMEQ3Qjc3NDY1RDNBMTRCODYwNTA0NjNFNDNBQzc0NUYzNzgxRTdBNkY1ODJCRDdCOEFCMjJCQzRFRUVDRDJDQjE1NUU2RTBCMjYwNDg0M0UzOTA2RDQ3RUJEQTJDMTBCNkQ4QkZDQkI1NzIyQ0U1Mzk0RUI1MDcyMUU5MEVGRDI4QzYzQTYyMjY5QzhDMTQ1OTNENjkwNzZEMEYxOThEMkJEQ0NCNkQ3NTNDQjgxQzRCRUQ1NkE5MEUyRERCRkZDMEI5MDc2QzY1Rjk3M0I1RUEzMjQyRTcxRTNDQkJGRTA5NzZDRkUyMjQ3NUY1NjcyNjA1OEQyRDBDRTNCRDUyQUE5NDBBMEY1NTlERDA1NUJFOUE2RjUwODQ2OTAyRTAyQjcwREI0RkY1QkVEMzM3NjJFMTA0MDlEMjVBQkRBQ0Y2NjFCRDlCQTJBMjIyMTJFMDI4OTNBMTYyNUNBNDQ4NTA4ODdCNEIzQTAwRDBBRjYzNjQ1RTJFQzQyMzMzMDM1MDYyMDkwRThFN0U2MzAzN0M2OTJGQkEwQjNGQzdGMzY4NkZDMjgzMUY0REUyRDREODJDRjZGRDYzMjFENjYyMUM4MjI3NzE1RTM3NzJFRTg4MDU5MTFBQTlFNjcwODNDNTExRjE3ODYzQzRENkYyQzI5RTE5Q0YzMjkyMDAwMjRFNTM5QTdDNUJGMUE5RDYwMUFGRjhEQjdDRkQ3NUM2NTMyNDg4NDY5RTQ0QkFDNzI2NkEzQzEyNzcyMEU2NDAzMjhGOTk3MEI3NTUwOUUyOTJDQ0VDMEI1NUExRjcyOTQ1NkNCMjgwNEJFNTA0NTExODVGOENEQTMxM0M3RDRERjZDMUM2N0Q2QzQxMTAyNUEyQkZGRjA2QzUwNjI0NzBGOTdCMTdFNzVCNEY4MUNEMUZFQzc3NzQ2NUQ2ODQ4NDk4MDlCNDI4MUI2OTBEMkE4RkU1QzRGQTg3REIwMDMyODYzMEZDMzFCRkREQTQ2NDFCMjlDQjQzNDE0NzgwNkE2MTRFNDUwRTNFMkI1MDMxN0UzQjRFRTYyNjJBMkQ0RDBBOEZFNzUzMENFREZCQ0I1MDE2QzRENkU2MUMzNEU2MUFGQTMyNDg3MUE5Qzc1RjlCQzZCRjZDOTJCOTU5MTBDOUQwRkUwNDlBRUVGMkU5NkU0QzlFNjlFMUZDRTFGNkNDNjg3RDUzMzY2OEY1NTM2N0UyNjk1MTk3QkUzOTJBN0ZFNjZDNEY4OEMwQjFBOURFQzZERkY2ODI2NzU4NTU5NzlERUEyQTU2NDQ3NDhERDg4MkNFMUYwRDhGREE4NTMwNjE3QkFBMTMwQUQ5QzE2QUJGOEQ3NkI1ODUzMTA0QUQyRTBDNTRDOTYzOUMzRjZFMTM0M0FDOTQxMzk2MjEyNDVFRThFMTJDQTQzNjZBNkVDNzUyQkQ5RDFBMDk0OENDQzM2MjZDRURCODgyQkE0NjM4MTE1QkJGNTU0NDRERDQ1NDRFRUM1NjFGMEU3NjJDOTk4OUE5MzA2RDQ3NDlBQkQ0N0MzMUY0MEFEM0Y3MzVGRUVFNkUxRkRDRUI2MjYwNzNDRDVGNzY3MzBCMzQ4MTAzQjA0MUI5RUVCOTQxRUZBNjE1ODFERDkyNzg4MDJBMjkzNEMzM0ZGMDY2OEMyNUNFRjI1NDZDNDQyNjNBNjg5MTlFQ0JCNTQwQjRBMThFMTg2N0VBMTVDOUY3QTI4NTNGNTVFRkJCMDFDM0QyN0QyODU3OUUwMzBEMEE3NzFCNzU0NjgwRkNENDZCNTZFQkQzNDMxQzI0RjIwMkEzNDNFMjAyOTQwNzZFNTZBMDlGQTVGNkMzRTg0NERBRjVCRENGQkZGNTVDQ0MzRkREREIwNjBGQkM2ODBCQTUyMDE1MzA5OEU1N0ZDNzc0MUQ3N0RGQTg5MzJGOTAyOEQ4RTBFNjY2MDA5NzRBNDFEQUM1QkJBNDY5MDQwN0FDMzZFQzIwNjY1NUFEQ0VDQzhBQTA0NzE2MDFGNjdDM0RGNDhCODMwNTg1RkExNUM1MjA2MUM0RkY5NTg0NTNCMUU3NTYyNjEyMENEQzBBRENFNDQ3NDMwMjdGQTRDNTlDMTkzMUU5MDcyNkNEMkJFMjQwRDBEQzZENjFDREU1MTY1MzUwRDg2RkZGMTcyNjBBODIzQzBBRTM0NjdBNTk3RDc3NEE2N0JFODQzOTUxOTc1RTE3QkMxQ0I2OURDOEEwQzdCRkY3OTlGQjhGRDJCREIzNzg1M0QyRUIyOEM5QjdCOEEyMjEyRkM3M0ZERjJGMjFGRjNGQkNENzk4NTMzRkM0ODY3NzM5RTQ4QkEwNjFCMTc0QkFDMjI0MDY0RjNFODY3QTFDRjUyRTA5MUZERDM2ODcxOTU1RkJFQTkwQ0QzRDIzQjFCRjAwMzk5MzBFMDYzNjA4MEU2QTM2MjA2RUQ1REQxQ0U0NTQ2RUMwQjA4MDJCQkVFMjg2OURDQ0FFQTAxQjhGQzNBNjM5MjgyMDE4MEFBNEQ5OUFCNjdDNTdFOEZEMDg3NEU3QzU0QkJDN0I5QTJBQTREMUVBNEFEQzFBMjgwMkRGOTA4QUY3NEY5MTVBRjk4RUVFQkY4MjJBQzk1OENEMEQ5QUY1QTc1NEFCMkY0NzkwMjI1RjE4ODY0QTk0NzM0RTUyNkJERTQ5N0ZGMjFGMzM5MjQ3MkQ0RjBFM0I3RTJFRTk3RERDQTE1MDYwQkYzNUEwNUUyNTkzNDE4ODA5RDNDOTczOEMzMjhFQjRENDRGMzVFNkM5MTMwNjkwOTZCMDc0MjgwOUY1NUYwMUQwNkQ0MEVCMDQ3NkMzNDk1MEZEQUVGOUJEMkNDMUY3NjUzQjRCQ0YxQUEzMDQ5NjM1MzBDOEYwQzM5Njk3RUFEMzJBREY0NjRFM0NBQzkzMUQzMzk5MkIzNTdBM0EyMzFGQjk3OEE1NkMzNTkyQTYxNDExQTU0MjhDMzU0OUE5OTFEODExIykKKyAgIChlICMwMTAwMDEjKQorICAgKQorICApCisgKHByaXZhdGUta2V5IAorICAocnNhIAorICAgKG4gIzAwRDYwMDdBN0FENDdCQjhENkIzNTZFNEYyNERGQUVFM0E3MjJGRUU3N0Y3RTk1NDdGODY2Q0IzNjlDMjMzRTZDQjM5MTZENDE2OTczRTMxNTdCNERDMTgzN0U2RDRDOTA3RDEwNjM4NTU3MzVFQUE4NTcxNzZBN0RBM0NBOUYzNzhGRjdBRTlFRjIyN0MxOTM5NjVGMTA2RjM1REIyQTgzM0QyNzYwQ0Y5RjJEMDQxOTM4Q0QzMTBEOUNFMzhFREQxNzlDMzNFQkM0OTYzQTAyMjIxRDgwMDBGREJGNEJFQjU5MkNBQjFFRDFFRUVDOUQ2OTE2RjI3MjYzQzc2REU3MDE4NEY1Mzk5REUzQjM4NjIyMjczNDZCMUIzRkJBMzA2MTc0RDA4QkVDMzY3NUUyNTkzQ0ZENDIxNTk2NTVCMEJFMUEyQjY5QzJCQTlGNEYwM0I4QzZCQTUwNUY2QkZERkM2MTYzRDc0RjQyQTZENDkwODI4NEQ2ODc5Q0VDQ0Y2NTEyRjkyMjU2MTJFMzAzMEFDRjM2NjNERkI3N0I0MUFGRkNGQzcwQkMxMUIyMjRFMTRCMzk3RDI1QUMxNUU0RTM0MkIzNEIzNjMwNTZFQTc2Q0IwMjY1REJENDFGNzMzQzdGREU5OEI3QzIzNDAyODlFMzM4Q0QzMUY5OTNBQkZBQ0E2RTgzQjU0QkNCNTBERDFERDExMTY1QzE4OEM4MEVCREExOTBBMTFCNkQ4OTgyQ0RBMUI2QjlEMTYzMUFBM0VBQ0M5MzA0MDIzNzgzMUE1MkQxNTgyNkEwRDNFOTJDODMzRDAyMzQ5NzVDOTJBNzIzNkY5MDJGQTY3MDNDODlDNzc3OTc2NTAyMEMxMUY3MTRCNEM5RDMzQjc2Q0Q0NjZEQzJCRTlBMTAyNDg4QjA2MzVGMzFFNkZCQjkyODJFNTEzOUQzMjYyM0UxMEVEOUMyOTVEQTNCMzlGNjgyMjcyMThFREY4QzZGRTkzNzJGMTc0QUUxREU1QkJFN0IwQUYwOUE4NjlDQUVEQkVGRTA1NDU4QkZENDNDRjMyRjEwRjVDMzQ1QTJFM0Q1ODhDOEMxNkI0REE4QjQ0RkE5NTM5QzY3OUI4MTEzM0EzNTQ5ODY5NkY1RDg2NkUzQjZBODk4MTFBRUE3QkZEMUJGNjkwRUMzMjlEODc5ODlDREFEQTdFQUIxMDY3ODVEMkQ2NjYxQkQ0MDBENzZDMTEzRTI4RjEzRkQ4ODMwMjdFMUNBQzg0OEIxMzc1MEM3Q0NENTMwMjczQzE2NUJERkRBOTNFNkY3Mjg5N0U5N0YwMDMzMDg3MDRCOTU4MDFGMjIzRUU4OTE2MDc4NkIxREU0NDBCQTlDMUYzNzFDQkEzN0U1QjA5NjUwQ0RCM0FBMUFCQUEyMzdBRDE1Qjg5RENEMDMzOTBBMjgzMDg2NDNFMjE5NDkwQkVDODM0MDNGNkEwOUI5NEY4MUQ3QkIzOTFDMTIxRkM5MDI4QTY5MDhFNUIyODdBQzc5MjA5QjkwNUIzMzcyNEIxODY5QTY3OUNCMzQ3QkYxOTJEODBEMkQ2NkNGMURBRUZFQkJGMjJDRURCOENFQzAxMEQ2RjhEODZDRDA1NUVENzE0MjVEQTcyREYxQzA3QTU3M0U2RjA3MDIzNUMzNzhEQUI1NDA0RUQwMDRCNDk0NkNDREE0Nzg2QUNCQkYzNzlBNDdDQzM2QTA0OUM1MDY1MUNBNEIxQ0VGMDNFRTg3REI2RDI0ODRDM0QxMEFGNzE3OThBNkFEMUUyMDc4MDgxNEY3OTM0OEQ0NUJEMTAwNDg4MEQyREVERUJEMTUyNjk0QzgwQjlGOTNERjMyRjU5MzA5MTFEQjM3OUI0Q0JCOTIzMENGQzVGQzEyNkI5Qjc3RjA3NEI5QzgyQkRCNEYxMjQ3MUIzRkU5MjA3OTUyNUZEMjc2MjkzQjYzQjk3OEI1NUUwMzkwMjRFRTY4ODE4MEQ3QzdDNkMwOTRCNzU0QUI5QjY1MkFDMzE4MTJGMkY3RTQ1RUYyQjZENDQ3OEQ3QzZFNUM4RjNDQjBBNEQwNEEzRTY5M0QxREQ0RDhGODk0RTkxMEQ5QTk5OUREQUJFMDQyN0ExQUIwQzcxNUM1QTY5NUE2OTE0MEIyMEI5REExMTk1RTZDOTUzNkI1REYyNEI0RDQ1RUQyNEQwRjJDMjc2RTNDRjQ4MDY2RUZCOTc3QzJCNzA5NkIwMkVCNTIzMDlEOTE2QkQ0MzIzNDdENzI3OTlCRjlENzZBMDNENTRERTIxMTQ2MDAxN0MwRTI2OEJDOUUyM0I0MTVBQkY0NkVCOEI5MzlCNUE0MTNFQkQzRjIwRTk1RjcwNEUxRjJDRENERjk3NEE4NzQzOTIzREJDNkQ4MzYzREM4OTQ4QkU4NUVGMUQzNjhDRDNFQUJEQkU1QjgyNjQ4RDJGNjc2RUIzMTBEN0I3NzQ2NUQzQTE0Qjg2MDUwNDYzRTQzQUM3NDVGMzc4MUU3QTZGNTgyQkQ3QjhBQjIyQkM0RUVFQ0QyQ0IxNTVFNkUwQjI2MDQ4NDNFMzkwNkQ0N0VCREEyQzEwQjZEOEJGQ0JCNTcyMkNFNTM5NEVCNTA3MjFFOTBFRkQyOEM2M0E2MjI2OUM4QzE0NTkzRDY5MDc2RDBGMTk4RDJCRENDQjZENzUzQ0I4MUM0QkVENTZBOTBFMkREQkZGQzBCOTA3NkM2NUY5NzNCNUVBMzI0MkU3MUUzQ0JCRkUwOTc2Q0ZFMjI0NzVGNTY3MjYwNThEMkQwQ0UzQkQ1MkFBOTQwQTBGNTU5REQwNTVCRTlBNkY1MDg0NjkwMkUwMkI3MERCNEZGNUJFRDMzNzYyRTEwNDA5RDI1QUJEQUNGNjYxQkQ5QkEyQTIyMjEyRTAyODkzQTE2MjVDQTQ0ODUwODg3QjRCM0EwMEQwQUY2MzY0NUUyRUM0MjMzMzAzNTA2MjA5MEU4RTdFNjMwMzdDNjkyRkJBMEIzRkM3RjM2ODZGQzI4MzFGNERFMkQ0RDgyQ0Y2RkQ2MzIxRDY2MjFDODIyNzcxNUUzNzcyRUU4ODA1OTExQUE5RTY3MDgzQzUxMUYxNzg2M0M0RDZGMkMyOUUxOUNGMzI5MjAwMDI0RTUzOUE3QzVCRjFBOUQ2MDFBRkY4REI3Q0ZENzVDNjUzMjQ4ODQ2OUU0NEJBQzcyNjZBM0MxMjc3MjBFNjQwMzI4Rjk5NzBCNzU1MDlFMjkyQ0NFQzBCNTVBMUY3Mjk0NTZDQjI4MDRCRTUwNDUxMTg1RjhDREEzMTNDN0Q0REY2QzFDNjdENkM0MTEwMjVBMkJGRkYwNkM1MDYyNDcwRjk3QjE3RTc1QjRGODFDRDFGRUM3Nzc0NjVENjg0ODQ5ODA5QjQyODFCNjkwRDJBOEZFNUM0RkE4N0RCMDAzMjg2MzBGQzMxQkZEREE0NjQxQjI5Q0I0MzQxNDc4MDZBNjE0RTQ1MEUzRTJCNTAzMTdFM0I0RUU2MjYyQTJENEQwQThGRTc1MzBDRURGQkNCNTAxNkM0RDZFNjFDMzRFNjFBRkEzMjQ4NzFBOUM3NUY5QkM2QkY2QzkyQjk1OTEwQzlEMEZFMDQ5QUVFRjJFOTZFNEM5RTY5RTFGQ0UxRjZDQzY4N0Q1MzM2NjhGNTUzNjdFMjY5NTE5N0JFMzkyQTdGRTY2QzRGODhDMEIxQTlERUM2REZGNjgyNjc1ODU1OTc5REVBMkE1NjQ0NzQ4REQ4ODJDRTFGMEQ4RkRBODUzMDYxN0JBQTEzMEFEOUMxNkFCRjhENzZCNTg1MzEwNEFEMkUwQzU0Qzk2MzlDM0Y2RTEzNDNBQzk0MTM5NjIxMjQ1RUU4RTEyQ0E0MzY2QTZFQzc1MkJEOUQxQTA5NDhDQ0MzNjI2Q0VEQjg4MkJBNDYzODExNUJCRjU1NDQ0REQ0NTQ0RUVDNTYxRjBFNzYyQzk5ODlBOTMwNkQ0NzQ5QUJENDdDMzFGNDBBRDNGNzM1RkVFRTZFMUZEQ0VCNjI2MDczQ0Q1Rjc2NzMwQjM0ODEwM0IwNDFCOUVFQjk0MUVGQTYxNTgxREQ5Mjc4ODAyQTI5MzRDMzNGRjA2NjhDMjVDRUYyNTQ2QzQ0MjYzQTY4OTE5RUNCQjU0MEI0QTE4RTE4NjdFQTE1QzlGN0EyODUzRjU1RUZCQjAxQzNEMjdEMjg1NzlFMDMwRDBBNzcxQjc1NDY4MEZDRDQ2QjU2RUJEMzQzMUMyNEYyMDJBMzQzRTIwMjk0MDc2RTU2QTA5RkE1RjZDM0U4NDREQUY1QkRDRkJGRjU1Q0NDM0ZERERCMDYwRkJDNjgwQkE1MjAxNTMwOThFNTdGQzc3NDFENzdERkE4OTMyRjkwMjhEOEUwRTY2NjAwOTc0QTQxREFDNUJCQTQ2OTA0MDdBQzM2RUMyMDY2NTVBRENFQ0M4QUEwNDcxNjAxRjY3QzNERjQ4QjgzMDU4NUZBMTVDNTIwNjFDNEZGOTU4NDUzQjFFNzU2MjYxMjBDREMwQURDRTQ0NzQzMDI3RkE0QzU5QzE5MzFFOTA3MjZDRDJCRTI0MEQwREM2RDYxQ0RFNTE2NTM1MEQ4NkZGRjE3MjYwQTgyM0MwQUUzNDY3QTU5N0Q3NzRBNjdCRTg0Mzk1MTk3NUUxN0JDMUNCNjlEQzhBMEM3QkZGNzk5RkI4RkQyQkRCMzc4NTNEMkVCMjhDOUI3QjhBMjIxMkZDNzNGREYyRjIxRkYzRkJDRDc5ODUzM0ZDNDg2NzczOUU0OEJBMDYxQjE3NEJBQzIyNDA2NEYzRTg2N0ExQ0Y1MkUwOTFGREQzNjg3MTk1NUZCRUE5MENEM0QyM0IxQkYwMDM5OTMwRTA2MzYwODBFNkEzNjIwNkVENUREMUNFNDU0NkVDMEIwODAyQkJFRTI4NjlEQ0NBRUEwMUI4RkMzQTYzOTI4MjAxODBBQTREOTlBQjY3QzU3RThGRDA4NzRFN0M1NEJCQzdCOUEyQUE0RDFFQTRBREMxQTI4MDJERjkwOEFGNzRGOTE1QUY5OEVFRUJGODIyQUM5NThDRDBEOUFGNUE3NTRBQjJGNDc5MDIyNUYxODg2NEE5NDczNEU1MjZCREU0OTdGRjIxRjMzOTI0NzJENEYwRTNCN0UyRUU5N0REQ0ExNTA2MEJGMzVBMDVFMjU5MzQxODgwOUQzQzk3MzhDMzI4RUI0RDQ0RjM1RTZDOTEzMDY5MDk2QjA3NDI4MDlGNTVGMDFEMDZENDBFQjA0NzZDMzQ5NTBGREFFRjlCRDJDQzFGNzY1M0I0QkNGMUFBMzA0OTYzNTMwQzhGMEMzOTY5N0VBRDMyQURGNDY0RTNDQUM5MzFEMzM5OTJCMzU3QTNBMjMxRkI5NzhBNTZDMzU5MkE2MTQxMUE1NDI4QzM1NDlBOTkxRDgxMSMpICAgCisgICAoZSAjMDEwMDAxIykKKyAgIChkICMwMTI1QTdFRDE0RTAxNDExMUFFMkJEOEZEODFBNjlCMEJERUQ4ODZEQkU0NzdEOUNDMDhDNkIwN0YxRjgyQkQ1QkQ3Mzc5N0ZGOUZGRkIwRDI1NDJCRTk3RkQxRENFOUZFMzBGNTE2RjExN0RCNDQ5QjUxM0M4NUVGNzc5REM5MURENTdCNkIyRTFCREQwNzdBMUVCRTE0ODQ4NkMyQURDOEZFQUM3RkUxQkQ0MEJERDQ1RTY4MzNCMjZGQjc1Mzg4RDA1MjkzMTc3RUUxMjY3OEIxOTdCNDJFRkQ1OUEzODk4NUI0QkI0NzFBMzc2MUU0MUYxQkE4QUIzQTJBRkE1QTI0MUI5OTkwOTZCOEE5ODA5QkM3QzVEQkIzQkRGNDc2MDQ5QUU3NjcxQTQ3MjEzQzk5MjJCN0U0QzFBNTU0NUJBOTJDNTU1MTAwREIwMEFCNzcyNTRDOEUxREZDMjgzRjNFREU5MDE4MTlCNjExQ0Q1RTU1MTEzM0QxNEU4RkQxODg0MEY2MzMxRDI5RTJFRUQ0NzExOEU3MDk0QzFFMzZFNTNEQTJBQTkwMTMzODU2QTM1MTM2NzIyNEI1MUY4MEMxODRBNUMzQzRDREE1Q0M4MjIxMjZCM0RGNjk2QUU5NkJGQjhCODM2RkE1NkU0RThEN0Q4QTU0NUU1RjY2OEYyMzIwM0FDNjk2OEJFMEE4QTBDM0JFRUFDMEFDOUNGQUU5OTRCOEVBNUUyOTNBNUI5ODE3RDQ5Qjg5NzYxNTI4NTk1QkI5OUQ4M0MyQjFBQTQwNTRGQTJGRjFEMUQ0RjhBREJDM0U4NjNEOEY0QkQ4Qzc2QzM4RTA1N0Q4MTc0MEZCNEZCMTJCQzNDRjgwQUI1MTAyMjM5MzRGRThEM0ZENDYxRDE3RTlCNEVBMDczODBBN0U1MjAyREQ5M0E0MEIxRjJFNkMyMDQ4MTYwOTQ5QTI0N0FDOUEzRjk2MkE0RTJGNEVFODA5RjAwQzc2QUY4REE0NzM3RDEzOThFNkE5NUJFNDYzN0M5NDlBMzM0OTJDOTY5MUIyNTRFQjIzOUVBN0IxRUMwRTJENDI2MUEyNzE4M0Y5MDU3N0YwNEIzNTZGRDEwRkRCNUUyM0E0NDcxMDY4OTUyOTMwRUFGRjRFREM3NTdBQ0UyNTc4MURCQTgwN0EwQzE1M0ZFRERDQ0I1NUEwOEI3NzRBQjQ0QUQyQ0M3NUJEMzE5RDQ4MjJCRkM2QUYyNEM5RjgzN0M3MkQxQTYxNTEwOTg4MjkwNkFEQzJCMkM2Nzk2MzBBNkZBRTM2MzE0NEI3N0ExMzRGMjg1NkRGMUQ4RTlBNzdBQUVDMDhBNzJGRDY3QzEyMkJEMjgwRDU5MUE2QzQwNDVEMDQ5NzM2MkZCOTFDOEMzOEMwMEE0NTdBMEJCRThENjI1MjEwRTRCRjU1RkM0MDQxRkJFMEExNTE1QjcwRUE5OEM0RjQyODRCM0M5NkMxNUREMjFDOENDMTUzMDVEQjVCRkEyQzIxRUI5NTIwQzlBQ0Q4MjNGNUU3QUJDREEzOTkzRDg5QTdCNTYxQzEwMUZFQzA4QThBRTY2MjEyNDVDQUExNDA2RDc1MzZGQkM2RTgzNTY5MkQyQjFCQjU0MEI4RjJCMkVBQjdBMTQwNkIyRkU4Mzg3M0NERURGQjBBMEU3MTdBMDM3Q0QzQTYzMjJBRTBCNkY1RTM2MTg3NjQ2ODY2QTBENDA2RjdGNTQwMDdGRUM5NzExMzExQkNFODdGQzZCNEY0NEM1RDFGN0JFREQyREVEMDgxRjE0MzlGMzgzMTJGQTI3Q0I2NTY2NUIxNTk1Rjg4NzEzMzc4Nzk3QUI2MjRDNzI4Q0E2NjMyNjUzRUM4RTc2MkE3NkUzRTU5N0FBRDRDM0MzRkU0MTY0OEFFQjA3RkNCOEJGRTlDNzBBMTgxOEU0RjFCMTkxMjRCRUNEMzIwRTRDREE2QTlGRDAyQjBBNDIyMTE0QjVERTMxMzc2NTQ5QzNCNUZFMUE4OTZGOEZDQjI1NkI4MTRCRDEwMEZGQkY1MzU5NTEwRDhGRDI0M0RCMDE0REJDRkEzMDM2Qzg1N0E0MURDQkFFMjlFQ0UyNTAxMkFGMEI4ODgyN0ExQjNGM0ZBNkU3NUVERjE3OTBCMENDRDc5NEQwRTczMzMxNTc0M0VGNTBGQTE4RTVFMUE5M0RDNUQxRUIyOEY1NTVDMEE4NTQxQjcyOTk1NEVBMTg2NUM2RkRCRTgxMEQxNTNDQjUwQzAyNEU4RTdBNTlEMzI0QzIyQjYyNkEzMEY0QUFBMEZBNDZFRENBNENDNDJGNEIyRDAzM0IxNDdEQTU0QTY3RDEwMzYzM0E4OEVCRkZGMEVGRkI2MUFBOThERDJCMDU3NzAwRkFDMDk4NkE5RkIyN0MyQ0MyOUVFMzBCNjk5REUwNjNDNzZBMUUyODYzRDEzOTUxQzM1QzVBQkQzNTc1NTU3ODFEMkE1RTY4QjBCRkFDRjJFMTE3NDcwMDZFMDgxMEREMENGOTdENTg1MzE4QTNCMERGN0E2NzQ2NUVDMzc2MTAwNEFBOUI3QzE0MUI0RTU0NDREOUVCNjQ5QkJEOTRGOTgzRkNGQUVDOTgyRDk5NEM3QTYyMERFMkQ4QUVFMDEyQkZEMjJBQTkzMjJGM0REM0JENUNFOTBDMTc2NjBEMThGOENCNjc5QjAyQkRBQkMwRDREMEY4NzZCMERENkQyNThFMDhEQzUwQjM1NTQ0QTRCREJFNUY3NTYwNDQ5M0Q1RkRGOThCN0ZCODEyNDc1QzdCNzEyMkRERUM1MTIzMjJFMTg1NUMzMTEwNTM5N0FGMjg0QjdDMkI0REMzMTVEMkU4RDUwMTdCQkQyNDAwODg1RDVFQjZDMzIxQjUwOTNFRjk4QTE0RUI0QzI5REMyQjdERjk1NjVEOUUyM0EyQkU2QTJFMzM0Q0UzNDg1QTg2NzdFNDYzREQ4NkY0OUUzQjU2RDI5NzRGN0Q5MzBGRkRENjBCQTU0QUI0OUFFOURDREM1ODhBNEZDN0FGQ0RCODlBNzcxM0M1MUZBOTdCRkE4ODY4RUUyMDdDM0MwMDMyRkRCMzAyRTQ1REZBMERGRDhBMkRFNEQ1MEE5NTlBNDI0NjI2Q0M5MkNFNzRGOEEyNjI3QzNCMjA0MDZENzE0QkI2NDgyNUZCQUUxQjQ0QTJGNzU2OUUzMkE4Q0JCNDFEQkEzRDkxMTU2OTFCMDdDMzk1MUEyRDEzOTRCRjA2QkIwNjkwQjcxMEQ0MzhDQ0M0RTVCOTJCMENGMzAyMTA5QTYwQzgzNkUzQUI0MEU0RDM1NzlDMkUxQzc3RjQzMkM2MjkyNUE3NTFEOTJBNTY0NDQwQTU2M0IzQzM3M0Q5QTQ2RkZDQjBFQjQ3ODk2MjQ1MEMxMTE5MkZERTE4NzcxOEY5QUVERkY2MURGRTM5QUU5ODcxNEIxREQ0OUMzNTY1OTNGMjNGMkJBREUwRTc1M0IyNUJEQ0IzRDYxOEUzQ0RDNUM1RDhGMzc5NzRBNDQ5RTZFMkQyMUI0NkZBOTA0MzVGMzk5QUZGOTg5ODhERUE5MDQ4QjgwMzFFMUFFMkU0QjJCN0MzRkJCN0NBNzc1QjYwNTg1MDBEQjg4NTJGRjczNTgyNTFDQkYxMkEzQ0EyMzM3MTk3NjBEMjUxOTM5QTI5Nzc4RDdCNEJERTE1QjUyNDRCOEFCNDc1NTVDMTg5MjUyMjIzMzE0NDNERDZCMjI3MjgyQTEwMTQ0M0YxNDg1MTczNDc5NkZGNEUzMjNCNjZFRDgzMDRFNTk0OTczRURCQ0E1N0I5NDEzQkI4MzU3NDY3MzYyM0NCOUJBMjgyRjkyRkJFNDlCRkM3RDZEMTg2NDRDMTc0MURBRkVFODZCNThBMTc0QUExQjU3NkYyNTk5Q0FBOEYxNUM5QUM1MTNDQ0MzNzc4RUFCODFENkVGOTA1NTdFNzNFMjA3RTk2QkMyRDgzQkQzRkVEMzcxN0IwRThFNTI3QUUyN0JEMDVCMjg5NjIyODAwOTlBRDFBRjhDOEQwQjBFNjY4RURDNzNBQjNCRDdFMjFDOUM5MTM0QkZCQzgzN0JCQzhFNjhGRThERjQ4MzY1NDkxMzcxRDM3OENCNzY4QTI0QTk1NkYwRDYyNUQ0N0VEQkJBQjA1MUU0QjRFRTVENTk1NzRBNEYyQzQzNzFENDkxRUQxODJDRDk0NUREQUYxMUVCMTczODJBNThGMkFGQjZCNzlERTNFQTE2MzZDNjc0NDkzNDBGNzdBMUNGMTRERkVEQ0I0MkIxOEJGRkI4NjZERDAwN0I5QTYwNkM3QkFFQTcwRjlDNUVBQzk4Q0JCNTJFQ0U1OTMyRjI5MjVBQ0VBQUU0MTJFNjExNDA5MENCNTQxNDVBNzUxRTQzMEVGMUNBM0E0MThDNEQ3NkVBN0Q3OTdGRjg4MjQwMUZEMjE5ODRGNEZCQzM0N0M0QkZCQjVCMkI5NDZCNjVGNEZFMEM3QjlFNUUxNkNCQzFCNjYxMjMyNUEwQzgzQTg3NDBENUQ4ODVDNDQzRUI4RDAyMjg5QkZDNzJFM0JEMjkyNUU1OTlCODYzRjExN0M4QTMyRTgxRjRCNkYyQzBDNUQ4Q0VBNkU3NUMwM0U1NjRFM0Y4RDE2NjNCNUYzRDIxRDg0NEI2RjgwRkI5ODI0ODQ4MDkzMDMwMTk2NzAxMTVGRjVDQzVGRjY2ODFFMUM5QjlBQjAxRUE3MTlBRUNBQjdBNEM0RjEwNDQwMTc0NDk3NDFDNzI2QTREMUQ5N0QwRkIwRDM5MEYzN0RFMEY4MzgwMzgyNzBBRURENUUwNTgxMTMyNTJENEY4RTkxQjEzNzdGRDI0RjUyOEVFREY1OEFFNTc1MzI3QkUxN0Y0QTlENjhFMjRCMzlEREYxMTg3QzhBQkNFQjFBODRBQjZCQUIwNzM1RjM3NTZFNTEyNjQxRTYyRDNCNTFERjAzMTZEMDY1OTQ5Mzc5REQwNkMwNzYwNkE4MjEyNkExMjlBMkE3MEY5MUVGNTQwOTZDRkNCQzM0NDdCNDlENURENUY3REM3QUE5RjNFODZFOEVDRDU4MUY1MTczMURGNzI2MTk0Q0QzMTQzQ0MxRTYwOEFFODgyRUE4ODQ4Q0RGRDlGM0ZGNjI4MkFDNkQ3MjJDMkQ1RjUxRjI2NTI3MjRGRUI2MDFFMDJFMUYwNzhFMzJCMzY4OTJFRDlFMkRFMEE2Mzc4MzZBMDA1QjAxQ0VGREFERjkwNTM0MDQ5NTY1RThCOTY1MjI0QjNFN0VGRjU3MDdGM0RFQjZCRkRCOEQ4MDQ1NTQ5MTY4Q0QxQzgxOTEwRTU4NDk3OEE1NTVERTg3N0NGQkRDQjhENzM4OEQzMDgxRjlERDgwNjcxOTg1NjI1MjFGRUU5OUM1N0UzNDAxIykKKyAgIChwICMwMEU2QkJDQkVCRkNBODEzQ0VENzkwN0Y1RkE3M0M0QzJEMzUzMkFGN0E3NjUwQzRBODg1NjNERjgwNUQ1NEQwQ0VBNTI4MzQ3QTYwRjcwM0M4RkZFOTE5OTc1MDVGOEMyMzgzODNFMDNDNTNERkQzNDdEMEUzODVBNUNGRkU0RTJBOTQ0REQ0NUFDQkM0ODFENTREN0IyMkY0QzU5QTJCRkM4QzY4NkU1MjdCOTA3QUQ5QzVFQ0U4NzBEMTAyNTUwRDhENEEwMkI0MDREQUU3MDIzQ0M4RjA0MzZERTVGNTBBN0NFMUY0RTc0MTE0N0Y2NzZCNURDOTQzN0NCNDc3MjdCOTMxNTVBRTVDMUVCRTIzNkU5RjQzNkQ3MjNGRjc3MDEwNDMwNUExNDYwQzIxQkU5MzYxNTgyQ0IxMDdDQUYwMzZGMDYwMEJDQzZENzhERTczQzFGNDRDMjVGMzc3QjlBNjUzNDlFOUI3M0M0NDZFNUM2MjgxRENCNjhFQzY1QUY2ODRBQjM5RjZDODRDRjk2RTRDRDkwOUI2MUZBMkQ4QkJCNjlBNzk5NEI3ODg2NUZGRUFDRDM4MzhGODUxQzk0NDAzOUMyNDIyQjc1QUU0RjlDMkExNzAyQjAwNTY0MUVCNDFDRTlGQjA0Mjc1N0U4NkY2RTk2NTE0MjhFQkE0RDkwOEQ2MEE5OUFENjFFNUQwOUU3QTA1QzdFNTlBOTYxNURFOTY1MjAwQ0ZCNzVBMjI4QjFENURCOEQyQzA0MEE2NUQ5NDBENTUxNkM5RkM1MDY5Qjk0RDJGMTkwM0VGNkIwN0Y3MEVDRjNFOEQ3MjBGNzQxMzlBNDY0N0Q3OTEzMTgzNUNGN0YxNUVBODM5MzUwQTAwQkQ5RDczMzM1OTUwMzQ5N0JDRTM5QTI0OTdDQUNDQUQ0MUIwQUU3QTM2RTZGMDFGRUNBMUIwQjA2MkY5QzMyMzJCRDZGNjczNEM5N0RCMkVFN0RFMDUwMzcwMDg3MjEwRjgxNjFCMDcyMzdFNzEyRTI5RTBCQTZCMkI2NjFFQzIyREFEMDUwOUQ1MEVGNzUyNTVENDBCOTU0RDJCMzY5NEMzMEU1OTgyRUIyRDE1QjcyQTg3MDlCQzRGOUI2RkVGQzRFNkYwMUZGMDREMTI4MzExMjA5QjRDNDM1M0FGNDNCREU1OEQ2MzFEQjdFMDQ3RDdCNDY5Q0RFNEE5MTc2NDE1RjZGN0I2MEJDMTI5RTBCQTgzNjNENzcxNDBEQTBGQzY4NURCNzZGQ0I5NjhDOEM1ODY1N0RCODZGQzkwOEU3RDExRjQxRDkwN0NBMzY3QzE3QUQzRUY4MTI4MDcyMUZENDBFNkFFREMxMTg1MzhBRkUxMDlCOEZBODE4NTAyOTgyNTc4QkIyRUFFM0FDQzMwMjhFRjc5QzRDQUI1NzVDQzg0NzNFMDVGRjVEOTExMTg2MDU4QkNBN0Y1MjY5RkFBNjZDQkI2OENFNDdFRTA3NDhGMkE4RTUyRUVCODQ3NTAzMEQzNEU1NEMzNjU1NzJCQTI4MjIyNjczMEFEQTNCRUYxNkQ1ODJBNDA5RjE1QUI4OTE4OEYxNzM3RjdDQTgyRUUwRDk2QkQyQjNBMjE1M0NERjZFRTI3RkQwNEY0QUVGNEFBM0ZDNkVCMDJFOTJFQzIxMzU5ODY0NTA3RUFEM0UwOUQzMTE3RUVERDYxQUYzNDI2NTQxMkMzNjJFRTAxQjI2QjkyNUJDNzRBMjY3OUExQzExMkM2NTNBRTg4RkQxMjQyMjA3NDJBMDVERENCMUNERTdERjIzNDI2NjlGREY3NkUxQzNGOUJGOEZFMTM2MzNBREYzMzA1MEZBNDkxRkE3MDhBOTE4RUNBNzg3RkYwNzRFOTBGOUEwQUEyMTZBQ0IxMTYwRDIyQkU3QTk4MTdERUY1RkEyRTI3RkM5MDZBQ0Y1QjU3NzRBNURCMDY5QTY2RjVGMTc1MkQ3NTIxRTFDRTQ5Rjg4ODgyMThCQTI0Qzk3QTkyQzI4N0RBQjhCMDhCNDQzM0VDMURERUI1QzdBM0Q5Njk1NkVCQ0M0NkEyREUyQjk1Q0FDQTkxQkVDQkNCMTVEQ0EyMEQxM0M5NzdGNTBGNkRDMEQ3MDVEQjc4QjU5NzU4MUY4NTBFMjBFMEVFQjZFQTlBN0E5RDI3MDhBNjUwQTNDRDA3NDhFRTFEREFFQTU1OUM4MEQyQTAwRjJEQkQyOUMzRUY1OEMxM0NCMEI4NEFGQTMwQzUwOEJDOEFENzFBNEZDM0UxNDY5MEYxNkI1Mjk0MzAxM0Q3QkIwOUY1NjI3RDdEMTM0M0RBRUQ4ODE5OEQ1QURBMjNFMEI5NDQ4NEUwNkE4MjdGRTQ5MjI3NTQwMTEwRUNFQzlFMzU0Rjg3RTI3NDk2QjdGRjVFRDMxNTIxODE3QzhCNUIxODIxMjlFRTBDNTIxQzg1QTk5NkJGNUVBRjFGODc1ODNCREZFNjkzODZFRENFNjMzMzcyNTJGNThEMzdBRUM3NDI3MDJEOTdGM0I5N0NFMEZEMDZFRTYwRUU0MzgwQzJFNDhEN0FBRDQ5RTI2Rjc2Q0U5ODEyMzdBREI2MTdCMEJCNkQ1OURBRTMxQjYzMzU4NjZFN0Y5NjcwRjhBMjVEOUJDNDREN0MzMjYwMkJBM0Q1ODAwMkJENTM0NzNFM0Y3ODEyNDlBQjE3QzFDNzhDNDk2NjExIykKKyAgIChxICMwMEVENkZBMzY0NDJBMjQwODY1NTgxQjVDMzk4QzkzRjU1QUZENTM4NkE4MDFBRjFEOEJGOEE5RkY4QUI5QzU3OEY5N0RBMDJBRkM0NDE4MEFCNTgxQTFFMTBBNEQ2NUI3RDFFOUMwQjA0RDU3RkIxRkQxM0I3RUNGMUFEN0MwMjk2RjFGNUQ1MkMzMjIzQ0IxMTdFNkM2QkVEMUZEQTcwMUE3QTQwNzlGQkQzNUIxODBEMjI5NUIyMTZGRUFCMjg0Rjg1NTk0RUREREMxNzlDOUFBRTZFNkNBNTQ1RDJGQkNBMzA4QjA5NjFCMjFBMUI0QTRFOURFMjdDRjhENjkyMkZDOTAyQzM1MzEzQjA1RjBGRkI1Q0M2NjdFNjRFMDcwNkQ1MjEwRDM5MTkwNzRCMzg0Q0E1OTY4MzU5Q0JBNUY0QkNBMDk2MzIzQUQ0OEUyQ0RFOUQyNUYwOEUyRUY5NDVBMURENDY0NTdGNDhCNEJGOEVCRUMyREMzNzM3Q0MwOUUzMzNFMzBGMTdBM0FDRDE5NTY3QTVDNUQyMDBFN0E0MzAzQTk3QTg5M0YwODg0RUQzQ0Q5NzZCNDFDMkJDRUVGMDREOUZDRTRGMzAyMThDQzlBQUUyNkZGQzU3NDlCMTAwMTFCODA1QURBOUM0ODU3QjY5MUE3QTgyMEYyNTY0REY1OTc5RjU3MEY4RDUyNERERTI2OEY3MDI4OTFFOUNDREJEOUY4MjFDMkVDRjI3RjYwQzc5NUU3NDNBQzY3Q0FEQjA3RDIyRDNBN0JEMzIyREE5QzNFN0EzNUFDNkEzNTMzM0Y4NzFGRTZERTAxNjJCQTJBMUY5NTY1RTQxMUFERDQyNEZGMDcyN0IyMjgwQkFGRERGNTIyQzI3MkQzQTI5MTBFRkUyN0Y1NTkwRjhFMEY2QzM4QkVBMTg5NUEwODkzNzU1RjQ0QkRGNDFGRUNGM0JGM0JBMjdDNkQ2RjAzNkExQUE3MDczNkRFNzE0NjVGQTc4RUE0NkYzNDM0MUUwNURFN0FCMzdBNTA3NEI0RTk5RTBCQUI1NEQ2NTg2Mjk1MDNFMTI0MkFDQUZERTA4NzIxMDU4RjIwOEQzRjYyRkFFNzQyRDE1OENBRTUyMTk5NDUxNENGMEJFQzU4MEYwNzUwNDYzMTlGQkZDOEU5NzFGMEZGNUVFRDlFMkFCN0QxOTRDRDIxRUNDQ0IyRTU0RDIzOUFBM0IwMjU0RjRBQjE2NDFFNkU4RTE1MTJGRjFEMUVENTc5MjA1RjE4MDc4OTg4MjhDRkEyNEI4MEQyMzBGQTZDNTJDNkE5MjM0OEUxQTA2OUMyMzlGN0I2RjJFN0NDOTk1QkQzQ0QxQjQxM0ZDODZDNjI2RkU5NjJDN0VDM0NGMTlGQTE5M0IzQTczMkFGMTdFNTFFNkI1N0NDMjYzREU4MkE1QzQ1Q0I5RTM3QzJCQUI0NEU4OEU1NzkyRkJCQzQwNzQ4Rjg2MTM0RDIyMUJGNzc1RTJCRjU3Rjk4QTg4NEZDQkE0OTQ3MTg2NjFBM0ZGNzNBQUUwNEE2RjVDREZCNkYxNDNENjgwRDA5QkE0Q0NENkM2RjE4NkU5MjU2OUI4RjY3QTM1QjU3OTZCOUYyRUQ0MDRGMTFDNTRFRDI5MEQ3RDc4MzY1MDE0NzNGMDZEOEE2MjNENTNBQjU4NkI2NDRGM0Y1QkRGOEIwQjY3MENBNjk2QTIzQjdCNTIzMTlDOTFEMkNBMjdGQ0RGNDIxMDMwQ0VBOEE2QjA3OUZFQzJFNDY3QkUwNDI3QUZDRUExMjY0OEYzRTEyRjA5NzQ1MTY2RDIwRDNEMUNENjk2NUVBQkEyNzMyNDY5QzA3N0IzQzRFNDREMzUwM0Q4ODI5MzdEQTUxMzkwNzYxNDRGQUVBQjc1MDgzQkY0RTE2NzI1QkI5NjI1QTk5REU5MkY2RjIyNkRFMzQzRjczRTk3NDU3N0Y4RDZGNUI1N0NGQkVCNjA3NjM2MjcyNDBBMjhDOTBBNzNCQzdBOUU0N0Q3NENCQUJCNjQ4Njk4OEM5ODNBNUEzREM5MUE0RDhFMzUzQUU2QzYwODQ5OUQyMTM5MUUzMkQ4RUYzQTAzMDkyNTk1OUI1MkMxQkMwM0YxN0FBRTJGRUU0RTI4QjJCNTE4ODlFQzJBNUZFNTg3QzYwMTM5QzlDRjI5QUY0NjU1NUIwODlCNTRCNUVGMEJCM0I5MkJDQzBFQTBFNkU5NEY5NDRGRThFOTc0MUREQTkwMkYxODVFMEQxNjg3NkExMDM1MUFEMjJGRTZBQkQ0Mzc4QUQ3NEExM0NEMkJEOTY5NkYwQjU5QTA2OUNENjU4MkY5MjQ1OEE4OUIxNTY0OEU4MzM2MTQ1OThENkZEQUJBQzAyNjc5MUNEQjNGQTg3ODczQ0E4NkUzREY3MTg3QzkyMzBBRkZCMTA4OUVGODNCOENCNTQ4NTZBREMyMzREMDdERjQ3OTUxNEE4RjQ3RUM5OTAzOTMwRTQ3RjlFOTNBRTFGOTZENzM1OEY0MjA4RTE5Q0NFRDhBRUMwNjNBRkU4QTMxRTM5QzkyMUY3RDc4NjdENTdFOEY2OEIxNDk0NzkzRTZEQ0QwNkYzREM2ODgwOUJENDU1REJCNDQwNzZENkFCNjQ1ODZFMEEwOUE0MkNFQkEyODI5QTVGODFCREVBNUVEQjIzREMyNTFENjlDMzczRDJFMjc1MjAxIykKKyAgICh1ICMwMEVBMkNCQkVGQkZGQkQ0QkQzODUwNTg0QUVBMzE1Rjg4RUQ4OTJGNzM5OEU1QzRFQ0QxN0Y4RTQ1ODhCMDczREEzMkFDNzA4REFEQzBFNTU0MTc1NTNGQjREQzI1MTMwRjQyQTlBMDRFNDM1QzYzRTEwOTE3NDQyMzJENTNGRjk4QUJBNDUwRTNCOTFBRjUxMjYzMUUyOEJGNDUzQkU0RkNCOTcxMzExMkY4OTBGMzY4NTIzRkUxNzVCMDkwOTM4NUYwQjQwNEIzRTYzNzBGQTZEQjMzNDkwREMyMTZDRTNERTU0OEZEREY2OEM4MUZFNDlCQjk2ODNDMzBGQTZEMURFOEIwMTlBOTQ2ODNFNTA4QjcyMEYyRURBMjAxMzMzMjVGRDQ2NDQ2MjBEMDg2MTgyRjFFODI4MzIxNUQyQkNCQkMxQjMwMkRFQTcxNENFMUU1OUZFOEU5OTY0ODkwMTgwNzhGOENDRERBRUYwODZFRkRGODJCQTQ1REY0MjRFNTM5QUJDOUQ2MUFCRUMxNDM0NjI3NUFBOTI1NjAzMTUxNEFBQzU5RkY0MEM3RDFCNDM2M0FDN0M3NEU4Q0MzODU0QzlFNTdGNjkxM0MyQ0ZDNTk5RTlEQkI0NDZENTUzNDgyQzlCNTMxNTYzQTdDQURENTYyRDY0MTUxQjM5NjFGQjUyQTBENTQyNDA2RDQ5MUY4MDkwRUJCNzM3QzM4ODAxNkY5NTkxODMxM0MwRUM5ODdGNzAxRjJBMjVBRTNGMENFRjJCOUYzNDYwQTlFNDhBRUUzODJGMDFDQjA5QjBBOTM3MjEwNEZBQzJFRTY5MkJCMkIxNEU2RkUzNzZBMjk4OTE2ODdFMTU3QzQwRjA5RkIzMjgzNDAyRTREMzE5Qzk3OTFFN0EwNjAyNUM1NDJCNDQxMUVFQTcxODkwRDIyRTM0RTgwMzhCMzAwMkFDN0ZCNzVBNTBFRDI5QUFFQUZGMzY1ODg5NTBBMDZBOEQyMTM5QjA0MjA2NzNEQ0IzNzA4N0U4MTk2QTAzNEQwQTVDNzhBODI0QkNEMEE3NEJCRDdFMDhCMDRCOEYwOEY0NzNDMDlGNjM1MDUwOENFQjQ3NkRFRTFFNDFEMENGOTYwQ0EzRTg3QUU4NDg5ODExNTc3RjdENDlDQjFFRjg4NTQ1M0Y3MDg3QjgxMjZGQjk5MDI4QjU3NzFFQzlFMTU5MDQwMTA5MTAyREVFMTc1REFGQTAzOEVFN0I2MkI5Njc5N0U1NkU2MzYxQzM3REZDNDIzOTgwMjAxMTQ3NjVFMjhDM0YzQjRCNkE0QzMzQTg2QTk5NUEwRDU2NDcwNjhCNzE0NzU1MkY0RTYxMzA4NjY1MjdENDgzMzk0OUU5RjkyMDQ0MDZGMDk2NzM1RjMzQkZEMUJCNTc3MzRFMTVEMEI0MDM1QTM3Q0NBN0M4OTdDMTgxNjJCMTI5NTFBNjg0RjU4NkYxQjdGRjA0MUE4NUI3RjQ0RkFDMTI1QTgwQUM3ODJBRDNGNEQ3RUM1MkMzMThFRUE1MkNGQTZBRjA5RUJBNTA4MTNCNUJBQzgzNjdCMUZGODBBOTlEQjhCREVDM0UzODQyNDU1QTA2RDIyREE5OUYwQkU1QjUyMzMwRDFENUMwQ0NBQ0IzNjYxRDcwM0JFMUQ5NkU3ODMyQTE1OUM4ODU4RTA4Q0MyMzEwMUZCQzBERTc4M0QzMjA5QTgwQTNFRDRFQkNGNTc2NjFCMDFEODRFQkNGQkU3MEEwRUM5MjE1ODhCOENEOUI5QkYyMTkxOEQ4NkMzQzk3QjBGNkJCRjQwMzdFODBDOTlBMzQ5QTFBMkI3OEYzMzdDQzQwMjk0MTVGRjBEQjU0QUM5QTNBMURGN0UwNzQ4MkRDOUYwNEU2MzhDOUQ1QkJBQUQzMkE2MjdGMkVGMURDM0UxN0FFQzM2NUU0MTZDNzAzQzQ0OUFBNDAxMDRERUMzNTgyMDJGN0Y3OENDRjc3MTE1QURBRDU2N0NEQUU2QjRCMkM4MURBNEZCRTZBOTdCQkYyQTcwNDM4OTkxMUU0QTVCMzlDM0MxRjE4NzEwMUU1M0IzREY3QTBDRTA1QzRCNzk1NkY0RUQzMUREMjI1QjQ2MDM2QzUzNDRCM0NEQjIzNkU1QjFBMTJFMTU5MDA4RDEwNkQxQ0Y2QzE0QzVGNzMzNUE0QTVEODBFMDA4RjAxMDZGNjM2RUY3NTA3MjNCNTA1MTFGMzdCM0JBNkZGQkVCMjdBMjcwODI4QjlDQjEyM0Q3RjU5RUEwQkU5NTZDMEQwMjRDNzdBQzA2MDg2NDYwOTk4RjE4NjEwRUNCOTQ2NTFERjQ3QUIzN0RERENEQjk3OTcyMDNBNDMyMUNCQzFFNkU4NUVDNjQ5MTlFQjc0QUM3RTJGM0MxNUZFQjVERkNDRkMyMzU5RDM1M0M4QjZCNjAwMTUyRDQyMTFBNTU0NzdGRjMxMDI2QjM0QzEwQzVGMUZDMUExREQxQzFFRjZBMTRCMjZDRkQxQUY3MEQ2QkFBNDQ2MUI0Mzg3NjMxRTREQ0ZERkZBQjExOEY3MTBBOEI4QjJEMTJFRUM0OTI0NzUxNzIwQjlBQTlEOTQ1MjdCOUYxOUU4QjM1MjIyMjU2N0Y2NjJGQzY3NTNBQTRCRTIyQzJBODUxRjIzNzhBRDVFRTU1MzlDMUUwRjRERDkwNDAwREQ3REM2RjFFQTY3NUQ5IykKKyAgICkKKyAgKQorICkKZGlmZiAtLWdpdCBhL2xpYmdjcnlwdC0xLjQuNi90ZXN0cy90LW1waS1iaXQuYyBiL2xpYmdjcnlwdC0xLjQuNi90ZXN0cy90LW1waS1iaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWFkMGYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L3Rlc3RzL3QtbXBpLWJpdC5jCkBAIC0wLDAgKzEsMzYxIEBACisvKiB0LW1waS1iaXQuYyAgLSBUZXN0cyBmb3IgYml0IGxldmVsIGZ1bmN0aW9ucworICogQ29weXJpZ2h0IChDKSAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgCisgKiBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpbmNsdWRlICIuLi9zcmMvZ2NyeXB0LmgiCisKKyNkZWZpbmUgUEdNICJ0LW1waS1iaXQiCisKK3N0YXRpYyBjb25zdCBjaGFyICp3aGVyZXN0cjsKK3N0YXRpYyBpbnQgdmVyYm9zZTsKK3N0YXRpYyBpbnQgZXJyb3JfY291bnQ7CisKKyNkZWZpbmUgeG1hbGxvYyhhKSAgICBnY3J5X3htYWxsb2MgKChhKSkKKyNkZWZpbmUgeGNhbGxvYyhhLGIpICBnY3J5X3hjYWxsb2MgKChhKSwoYikpCisjZGVmaW5lIHhmcmVlKGEpICAgICAgZ2NyeV9mcmVlICgoYSkpCisjZGVmaW5lIHBhc3MoKSBkbyB7IDsgfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQKK3Nob3cgKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICB2YV9saXN0IGFyZ19wdHI7CisKKyAgaWYgKCF2ZXJib3NlKQorICAgIHJldHVybjsKKyAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICIsIFBHTSk7CisgIHZhX3N0YXJ0IChhcmdfcHRyLCBmb3JtYXQpOworICB2ZnByaW50ZiAoc3RkZXJyLCBmb3JtYXQsIGFyZ19wdHIpOworICB2YV9lbmQgKGFyZ19wdHIpOworfQorCitzdGF0aWMgdm9pZAorZmFpbCAoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgIHZhX2xpc3QgYXJnX3B0cjsKKworICBmZmx1c2ggKHN0ZG91dCk7CisgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAiLCBQR00pOworICBpZiAod2hlcmVzdHIpCisgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICIsIHdoZXJlc3RyKTsKKyAgdmFfc3RhcnQgKGFyZ19wdHIsIGZvcm1hdCk7CisgIHZmcHJpbnRmIChzdGRlcnIsIGZvcm1hdCwgYXJnX3B0cik7CisgIHZhX2VuZCAoYXJnX3B0cik7CisgIGVycm9yX2NvdW50Kys7Cit9CisKK3N0YXRpYyB2b2lkCitkaWUgKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICB2YV9saXN0IGFyZ19wdHI7CisKKyAgZmZsdXNoIChzdGRvdXQpOworICBmcHJpbnRmIChzdGRlcnIsICIlczogIiwgUEdNKTsKKyAgaWYgKHdoZXJlc3RyKQorICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAiLCB3aGVyZXN0cik7CisgIHZhX3N0YXJ0IChhcmdfcHRyLCBmb3JtYXQpOworICB2ZnByaW50ZiAoc3RkZXJyLCBmb3JtYXQsIGFyZ19wdHIpOworICB2YV9lbmQgKGFyZ19wdHIpOworICBleGl0ICgxKTsKK30KKworLyogQWxsb2NhdGUgYSBiaXQgc3RyaW5nIGNvbnNpc3Rpbmcgb2YgJzAnIGFuZCAnMScgZnJvbSB0aGUgTVBJCisgICBBLiBSZXR1cm4gdGhlIExFTkdUSCBsZWFzdCBzaWduaWZpY2FudCBiaXRzLiBDYWxsZXIgbmVlZHMgdG8geGZyZWUKKyAgIHRoZSByZXN1bHQuICovCitzdGF0aWMgY2hhciAqCittcGkyYml0c3RyIChnY3J5X21waV90IGEsIHNpemVfdCBsZW5ndGgpCit7CisgIGNoYXIgKnAsICpidWY7CisgIAorICBidWYgPSBwID0geG1hbGxvYyAobGVuZ3RoKzEpOworICB3aGlsZSAobGVuZ3RoLS0pCisgICAgKnArKyA9IGdjcnlfbXBpX3Rlc3RfYml0IChhLCBsZW5ndGgpID8gJzEnOicwJzsKKyAgKnAgPSAwOworCisgIHJldHVybiBidWY7Cit9CisKKy8qIEFsbG9jYXRlIGEgYml0IHN0cmluZyBjb25zaXN0aW5nIG9mICcwJyBhbmQgJzEnIGZyb20gdGhlIE1QSSBBLiAgRG8KKyAgIG5vdCByZXR1cm4gYW55IGxlYWRpbmcgemVybyBiaXRzLiBDYWxsZXIgbmVlZHMgdG8geGZyZWUgdGhlCisgICByZXN1bHQuICovCitzdGF0aWMgY2hhciAqCittcGkyYml0c3RyX25seiAoZ2NyeV9tcGlfdCBhKQoreworICBjaGFyICpwLCAqYnVmOworICBzaXplX3QgbGVuZ3RoID0gZ2NyeV9tcGlfZ2V0X25iaXRzIChhKTsKKworICBpZiAoIWxlbmd0aCkKKyAgICB7CisgICAgICBidWYgPSBwID0geG1hbGxvYyAoMik7CisgICAgICAqcCsrID0gJzAnOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGJ1ZiA9IHAgPSB4bWFsbG9jIChsZW5ndGggKyAxKTsKKyAgICAgIHdoaWxlIChsZW5ndGgtLSA+IDEpCisgICAgICAgICpwKysgPSBnY3J5X21waV90ZXN0X2JpdCAoYSwgbGVuZ3RoKSA/ICcxJzonMCc7CisgICAgICAqcCsrID0gZ2NyeV9tcGlfdGVzdF9iaXQgKGEsIDApID8gJzEnOicwJzsKKyAgICB9CisgICpwID0gMDsKKyAgcmV0dXJuIGJ1ZjsKK30KKworLyogU2hpZnQgYSBiaXQgc3RyaW5nIHRvIHRoZSByaWdodC4gKi8KK3N0YXRpYyB2b2lkCityc2hpZnRiaXRzdHJpbmcgKGNoYXIgKnN0cmluZywgc2l6ZV90IG4pCit7CisgIHNpemVfdCBsZW4gPSBzdHJsZW4gKHN0cmluZyk7CisKKyAgaWYgKG4gPiBsZW4pCisgICAgbiA9IGxlbjsKKworICBtZW1tb3ZlIChzdHJpbmcrbiwgc3RyaW5nLCBsZW4tbik7CisgIG1lbXNldCAoc3RyaW5nLCAnMCcsIG4pOworfQorCisvKiBTaGlmdCBhIGJpdCBzdHJpbmcgdG8gdGhlIGxlZnQuIENhbGxlciBuZWVkcyB0byBmcmVlIHRoZSByZXN1bHQuICovCitzdGF0aWMgY2hhciAqCitsc2hpZnRiaXRzdHJpbmcgKGNvbnN0IGNoYXIgKnN0cmluZywgc2l6ZV90IG4pCit7CisgIHNpemVfdCBsZW4gPSBzdHJsZW4gKHN0cmluZyk7CisgIGNoYXIgKnJlc3VsdDsKKworICBpZiAobGVuK24rMSA8IGxlbikKKyAgICBkaWUgKCJpbnRlcm5hbCBvdmVyZmxvd1xuIik7CisgIC8qIEFsbG9jYXRlIGVub3VnaCBzcGFjZS4gKi8gCisgIHJlc3VsdCA9IHhtYWxsb2MgKGxlbituKzEpOworICBmb3IgKDsgKnN0cmluZyA9PSAnMCcgJiYgc3RyaW5nWzFdOyBzdHJpbmcrKywgbGVuLS0pCisgICAgOworICBtZW1jcHkgKHJlc3VsdCwgc3RyaW5nLCBsZW4pOworICBpZiAoKnN0cmluZyA9PSAnMCcgJiYgIXN0cmluZ1sxXSkKKyAgICBuID0gMDsgLyogQXZvaWQgZXh0cmEgbnVsbHMgZm9yIGFuIG9ubHkgMCBzdHJpbmcuICAqLworICBlbHNlCisgICAgbWVtc2V0IChyZXN1bHQrbGVuLCAnMCcsIG4pOworICByZXN1bHRbbGVuK25dID0gMDsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKiBUaGlzIGlzIHRvIGNoZWNrIGEgYnVnIHJlcG9ydGVkIGJ5IGJwZ2NyeXB0IGF0IGl0YXBhcmljYS5vcmcgb24KKyAgIDIwMDYtMDctMzEgYWdhaW5zdCBsaWJnY3J5cHQgMS4yLjIuICAqLworc3RhdGljIHZvaWQKK29uZV9iaXRfb25seSAoaW50IGhpZ2hiaXQpCit7CisgIGdjcnlfbXBpX3QgYTsKKyAgY2hhciAqcmVzdWx0OworICBpbnQgaTsKKworICB3aGVyZXN0ciA9ICJvbmVfYml0X29ubHkiOworICBzaG93ICgiY2hlY2tpbmcgdGhhdCBzZXRfJXNiaXQgZG9lcyBvbmx5IHNldCBvbmUgYml0XG4iLCBoaWdoYml0PyJoaWdoIjoiIik7CisKKyAgYSA9IGdjcnlfbXBpX25ldyAoMCk7CisgIGdjcnlfbXBpX3JhbmRvbWl6ZSAoYSwgNzAsIEdDUllfV0VBS19SQU5ET00pOworICBnY3J5X21waV9zZXRfdWkgKGEsIDApOworCisgIGlmIChoaWdoYml0KQorICAgIGdjcnlfbXBpX3NldF9oaWdoYml0IChhLCA0Mik7CisgIGVsc2UKKyAgICBnY3J5X21waV9zZXRfYml0IChhLCA0Mik7CisgIGlmICghZ2NyeV9tcGlfdGVzdF9iaXQgKGEsIDQyKSkKKyAgICBmYWlsICgiZmFpbGVkIHRvIHNldCBhIGJpdFxuIik7CisgIGdjcnlfbXBpX2NsZWFyX2JpdCAoYSwgNDIpOworICBpZiAoZ2NyeV9tcGlfdGVzdF9iaXQgKGEsIDQyKSkKKyAgICBmYWlsICgiZmFpbGVkIHRvIGNsZWFyIGEgYml0XG4iKTsKKyAgcmVzdWx0ID0gbXBpMmJpdHN0ciAoYSwgNzApOworICBhc3NlcnQgKHN0cmxlbiAocmVzdWx0KSA9PSA3MCk7CisgIGZvciAoaT0wOyByZXN1bHRbaV07IGkrKykKKyAgICBpZiAoIHJlc3VsdFtpXSAhPSAnMCcgKQorICAgICAgYnJlYWs7CisgIGlmIChyZXN1bHRbaV0pCisgICAgZmFpbCAoInNwdXJpb3VzIGJpdHMgZGV0ZWN0ZWRcbiIpOworICB4ZnJlZSAocmVzdWx0KTsKKyAgZ2NyeV9tcGlfcmVsZWFzZSAoYSk7Cit9CisKKy8qIENoZWNrIHRoYXQgcmlnaHQgc2hpZnRpbmcgYWN0dWFsbHkgd29ya3MgZm9yIGFuIGFtb3VudCBsYXJnZXIgdGhhbgorICAgdGhlIG51bWJlciBvZiBiaXRzIHBlciBsaW1iLiAqLworc3RhdGljIHZvaWQKK3Rlc3RfcnNoaWZ0IChpbnQgcGFzcykKK3sKKyAgZ2NyeV9tcGlfdCBhLCBiOworICBjaGFyICpyZXN1bHQsICpyZXN1bHQyOworICBpbnQgaTsKKworICB3aGVyZXN0ciA9ICJ0ZXN0X3JzaGlmdCI7CisgIHNob3cgKCJjaGVja2luZyB0aGF0IHJzaGlmdCB3b3JrcyBhcyBleHBlY3RlZCAocGFzcyAlZClcbiIsIHBhc3MpOworCisgIGEgPSBnY3J5X21waV9uZXcgKDApOworICBiID0gZ2NyeV9tcGlfbmV3ICgwKTsKKyAgZ2NyeV9tcGlfcmFuZG9taXplIChhLCA3MCwgR0NSWV9XRUFLX1JBTkRPTSk7CisKKyAgZm9yIChpPTA7IGkgPCA3NTsgaSsrKQorICAgIHsKKyAgICAgIGdjcnlfbXBpX3JzaGlmdCAoYiwgYSwgaSk7CisKKyAgICAgIHJlc3VsdCA9IG1waTJiaXRzdHIgKGIsIDcyKTsKKyAgICAgIHJlc3VsdDIgPSBtcGkyYml0c3RyIChhLCA3Mik7CisgICAgICByc2hpZnRiaXRzdHJpbmcgKHJlc3VsdDIsIGkpOworICAgICAgaWYgKHN0cmNtcCAocmVzdWx0LCByZXN1bHQyKSkKKyAgICAgICAgeworICAgICAgICAgIHNob3cgKCJnb3QgPSVzXG4iLCByZXN1bHQpOworICAgICAgICAgIHNob3cgKCJ3YW50PSVzXG4iLCByZXN1bHQyKTsKKyAgICAgICAgICBmYWlsICgicnNoaWZ0IGJ5ICVkIGZhaWxlZFxuIiwgaSk7CisgICAgICAgIH0KKyAgICAgIHhmcmVlIChyZXN1bHQpOworICAgICAgeGZyZWUgKHJlc3VsdDIpOworICAgIH0KKworICAvKiBBZ2Fpbi4gVGhpcyB0aW1lIHVzaW5nIGluLXBsYWNlIG9wZXJhdGlvbi4gKi8KKyAgZ2NyeV9tcGlfcmFuZG9taXplIChhLCA3MCwgR0NSWV9XRUFLX1JBTkRPTSk7CisKKyAgZm9yIChpPTA7IGkgPCA3NTsgaSsrKQorICAgIHsKKyAgICAgIGdjcnlfbXBpX3JlbGVhc2UgKGIpOworICAgICAgYiA9IGdjcnlfbXBpX2NvcHkgKGEpOworICAgICAgZ2NyeV9tcGlfcnNoaWZ0IChiLCBiLCBpKTsKKworICAgICAgcmVzdWx0ID0gbXBpMmJpdHN0ciAoYiwgNzIpOworICAgICAgcmVzdWx0MiA9IG1waTJiaXRzdHIgKGEsIDcyKTsKKyAgICAgIHJzaGlmdGJpdHN0cmluZyAocmVzdWx0MiwgaSk7CisgICAgICBpZiAoc3RyY21wIChyZXN1bHQsIHJlc3VsdDIpKQorICAgICAgICB7CisgICAgICAgICAgc2hvdyAoImdvdCA9JXNcbiIsIHJlc3VsdCk7CisgICAgICAgICAgc2hvdyAoIndhbnQ9JXNcbiIsIHJlc3VsdDIpOworICAgICAgICAgIGZhaWwgKCJpbi1wbGFjZSByc2hpZnQgYnkgJWQgZmFpbGVkXG4iLCBpKTsKKyAgICAgICAgfQorICAgICAgeGZyZWUgKHJlc3VsdDIpOworICAgICAgeGZyZWUgKHJlc3VsdCk7CisgICAgfQorCisgIGdjcnlfbXBpX3JlbGVhc2UgKGIpOworICBnY3J5X21waV9yZWxlYXNlIChhKTsKK30KKworLyogQ2hlY2sgdGhhdCBsZWZ0IHNoaWZ0aW5nIHdvcmtzIGNvcnJlY3RseS4gICovCitzdGF0aWMgdm9pZAordGVzdF9sc2hpZnQgKGludCBwYXNzKQoreworICBzdGF0aWMgaW50IHNpemVfbGlzdFtdID0gezEsIDMxLCAzMiwgNjMsIDY0LCA2NSwgNzAsIDB9OworICBpbnQgc2l6ZV9pZHg7CisgIGdjcnlfbXBpX3QgYSwgYjsKKyAgY2hhciAqdG1wc3RyLCAqcmVzdWx0LCAqcmVzdWx0MjsKKyAgaW50IGk7CisKKyAgd2hlcmVzdHIgPSAidGVzdF9sc2hpZnQiOworICBzaG93ICgiY2hlY2tpbmcgdGhhdCBsc2hpZnQgd29ya3MgYXMgZXhwZWN0ZWQgKHBhc3MgJWQpXG4iLCBwYXNzKTsKKworICBmb3IgKHNpemVfaWR4PTA7IHNpemVfbGlzdFtzaXplX2lkeF07IHNpemVfaWR4KyspCisgICAgeworICAgICAgYSA9IGdjcnlfbXBpX25ldyAoMCk7CisgICAgICBiID0gZ2NyeV9tcGlfbmV3ICgwKTsKKworICAgICAgLyogZ2NyeV9tcGlfcmFuZG9taXplIHJvdW5kcyB1cCB0byBmdWxsIGJ5dGVzLCB0aHVzIHdlIG5lZWQgdG8KKyAgICAgICAgIHVzZSBnY3J5X21waV9jbGVhcl9oaWdoYml0IHRvIGZpeCB0aGF0LiAgKi8KKyAgICAgIGdjcnlfbXBpX3JhbmRvbWl6ZSAoYSwgc2l6ZV9saXN0W3NpemVfaWR4XSwgR0NSWV9XRUFLX1JBTkRPTSk7CisgICAgICBnY3J5X21waV9jbGVhcl9oaWdoYml0IChhLCBzaXplX2xpc3Rbc2l6ZV9pZHhdKTsKKworICAgICAgZm9yIChpPTA7IGkgPCA3NTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgZ2NyeV9tcGlfbHNoaWZ0IChiLCBhLCBpKTsKKyAgICAgICAgICAKKyAgICAgICAgICByZXN1bHQgPSBtcGkyYml0c3RyX25seiAoYik7CisgICAgICAgICAgdG1wc3RyID0gbXBpMmJpdHN0cl9ubHogKGEpOworICAgICAgICAgIHJlc3VsdDIgPSBsc2hpZnRiaXRzdHJpbmcgKHRtcHN0ciwgaSk7CisgICAgICAgICAgeGZyZWUgKHRtcHN0cik7CisgICAgICAgICAgaWYgKHN0cmNtcCAocmVzdWx0LCByZXN1bHQyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgc2hvdyAoImdvdCA9JXNcbiIsIHJlc3VsdCk7CisgICAgICAgICAgICAgIHNob3cgKCJ3YW50PSVzXG4iLCByZXN1bHQyKTsKKyAgICAgICAgICAgICAgZmFpbCAoImxzaGlmdCBieSAlZCBmYWlsZWRcbiIsIGkpOworICAgICAgICAgICAgfQorICAgICAgICAgIHhmcmVlIChyZXN1bHQpOworICAgICAgICAgIHhmcmVlIChyZXN1bHQyKTsKKyAgICAgICAgfQorICAgICAgCisgICAgICAvKiBBZ2Fpbi4gVGhpcyB0aW1lIHVzaW5nIGluLXBsYWNlIG9wZXJhdGlvbi4gKi8KKyAgICAgIGdjcnlfbXBpX3JhbmRvbWl6ZSAoYSwgc2l6ZV9saXN0W3NpemVfaWR4XSwgR0NSWV9XRUFLX1JBTkRPTSk7CisgICAgICBnY3J5X21waV9jbGVhcl9oaWdoYml0IChhLCBzaXplX2xpc3Rbc2l6ZV9pZHhdKTsKKyAgICAgIAorICAgICAgZm9yIChpPTA7IGkgPCA3NTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgZ2NyeV9tcGlfcmVsZWFzZSAoYik7CisgICAgICAgICAgYiA9IGdjcnlfbXBpX2NvcHkgKGEpOworICAgICAgICAgIGdjcnlfbXBpX2xzaGlmdCAoYiwgYiwgaSk7CisKKyAgICAgICAgICByZXN1bHQgPSBtcGkyYml0c3RyX25seiAoYik7CisgICAgICAgICAgdG1wc3RyID0gbXBpMmJpdHN0cl9ubHogKGEpOworICAgICAgICAgIHJlc3VsdDIgPSBsc2hpZnRiaXRzdHJpbmcgKHRtcHN0ciwgaSk7CisgICAgICAgICAgeGZyZWUgKHRtcHN0cik7CisgICAgICAgICAgaWYgKHN0cmNtcCAocmVzdWx0LCByZXN1bHQyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgc2hvdyAoImdvdCA9JXNcbiIsIHJlc3VsdCk7CisgICAgICAgICAgICAgIHNob3cgKCJ3YW50PSVzXG4iLCByZXN1bHQyKTsKKyAgICAgICAgICAgICAgZmFpbCAoImluLXBsYWNlIGxzaGlmdCBieSAlZCBmYWlsZWRcbiIsIGkpOworICAgICAgICAgICAgfQorICAgICAgICAgIHhmcmVlIChyZXN1bHQyKTsKKyAgICAgICAgICB4ZnJlZSAocmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICBnY3J5X21waV9yZWxlYXNlIChiKTsKKyAgICAgIGdjcnlfbXBpX3JlbGVhc2UgKGEpOworICAgIH0KK30KKworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgaW50IGRlYnVnID0gMDsKKyAgaW50IGk7CisKKyAgaWYgKGFyZ2MgPiAxICYmICFzdHJjbXAgKGFyZ3ZbMV0sICItLXZlcmJvc2UiKSkKKyAgICB2ZXJib3NlID0gMTsKKyAgZWxzZSBpZiAoYXJnYyA+IDEgJiYgIXN0cmNtcCAoYXJndlsxXSwgIi0tZGVidWciKSkKKyAgICB2ZXJib3NlID0gZGVidWcgPSAxOworCisgIGlmICghZ2NyeV9jaGVja192ZXJzaW9uIChHQ1JZUFRfVkVSU0lPTikpCisgICAgZGllICgidmVyc2lvbiBtaXNtYXRjaFxuIik7CisKKyAgZ2NyeV9jb250cm9sIChHQ1JZQ1RMX0RJU0FCTEVfU0VDTUVNLCAwKTsKKyAgZ2NyeV9jb250cm9sIChHQ1JZQ1RMX0VOQUJMRV9RVUlDS19SQU5ET00sIDApOworICBpZiAoZGVidWcpCisgICAgZ2NyeV9jb250cm9sIChHQ1JZQ1RMX1NFVF9ERUJVR19GTEFHUywgMXUsIDApOworCisgIGdjcnlfY29udHJvbCAoR0NSWUNUTF9JTklUSUFMSVpBVElPTl9GSU5JU0hFRCwgMCk7CisKKyAgb25lX2JpdF9vbmx5ICgwKTsKKyAgb25lX2JpdF9vbmx5ICgxKTsKKyAgZm9yIChpPTA7IGkgPCA1OyBpKyspCisgICAgdGVzdF9yc2hpZnQgKGkpOyAvKiBSdW4gc2V2ZXJhbCB0aW1lcyBkdWUgdG8gcmFuZG9tIGluaXRpYWxpemF0aW9ucy4gKi8KKworICBmb3IgKGk9MDsgaSA8IDU7IGkrKykKKyAgICB0ZXN0X2xzaGlmdCAoaSk7IC8qIFJ1biBzZXZlcmFsIHRpbWVzIGR1ZSB0byByYW5kb20gaW5pdGlhbGl6YXRpb25zLiAqLworICAKKyAgc2hvdyAoIkFsbCB0ZXN0cyBjb21wbGV0ZWQuIEVycm9yczogJWRcbiIsIGVycm9yX2NvdW50KTsKKyAgcmV0dXJuIGVycm9yX2NvdW50ID8gMSA6IDA7Cit9CmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvdGVzdHMvdGVzdGFwaS5jIGIvbGliZ2NyeXB0LTEuNC42L3Rlc3RzL3Rlc3RhcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTRhZTdiCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L3Rlc3RzL3Rlc3RhcGkuYwpAQCAtMCwwICsxLDExMiBAQAorLyogdGVzdGFwaS5jIC0gZm9yIGxpYmdjcnlwdAorICoJQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAqCisgKiBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIGdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxnY3J5cHQuaD4KKworCisjZGVmaW5lIEJVRygpIGRvIHtmcHJpbnRmICggc3RkZXJyLCAiT29vcHMgYXQgJXM6JWRcbiIsIF9fRklMRV9fICwgX19MSU5FX18gKTtcCisJCSAgZXhpdCgyKTt9IHdoaWxlKDApCisKKy8qIGFuIEVsR2FtYWwgcHVibGljIGtleSAqLworc3RydWN0IHsKKyAgICBjb25zdCBjaGFyICpwLCpnLCp5OworfSBlbGdfdGVzdGtleTEgPSB7CisgICIweDlENTU5RjMxQTZEMzA0OTJDMzgzMjEzODQ0QUVCQjc3NzI5NjNBODVEMzIzOUYzNjExQUFCOTNBMkE5ODVGNjRGQjczNUI5MjU5RUMzMjZCRjU3MjBGOTA5OTgwRDYwOUQzN0MyODhDOTIyM0IwMzUwRkJFNDkzQzNCNUFGNTRDQTIzMDMxRTk1MkU5MkY4QTNEQkVEQkM1QTY4NDk5M0Q0NTJDRDU0Rjg1Qjg1MTYwMTY2RkNEMjVCRDdBQjZBRTlCMUVCNEZDQzlEMzAwREFGRjA4MUM0Q0JBNjY5NDkwNkQzRTNGRjE4MTk2QTVDQ0Y3RjBBNjE4Mjk2MjE2NkIiLAorICAiMHg1IiwKKyAgIjB4OTY0MDAyNEJCMkEyNzcyMDU4MTNGRjY4NTA0OEFBMjdFMkIxOTJCNjY3MTYzRTdDNTlFMzgxRTI3MDAzRDA0NEM3MDBDNTMxQ0U4RkQ0QUE3ODFCNDYzQkM5RkZFNzQ5NTZBRjA5QTM4QTA5ODMyMkIxQ0Y3MkZDODk2RjAwOUUzQTZCRkYwNTNEM0IxRDFFMTk5NEJGOUNDMDdGQTEyOTYzRDc4MkYwMjdCNTE1MTFEREU4QzVGNDM0MjFGQkMxMjczNEE5QzA3MEYxNThDNzI5QTM3MEJFRTVGQzUxQTc3MjIxOTQzOEVEQTgyMDJDMzVGQTNGNUQ4Q0QxOTk3QiIKK307CisKK3ZvaWQKK3Rlc3Rfc2V4cCAoIGludCBhcmdjLCBjaGFyICoqYXJndiApCit7CisgICAgaW50IHJjLCBuYml0czsKKyAgICBnY3J5X3NleHBfdCBzZXhwOworICAgIGdjcnlfbXBpX3Qga2V5WzNdOworICAgIHNpemVfdCBuOworICAgIGNoYXIgKmJ1ZjsKKworICAgIGlmICggZ2NyeV9tcGlfc2NhbiggJmtleVswXSwgR0NSWU1QSV9GTVRfSEVYLCBlbGdfdGVzdGtleTEucCwgTlVMTCApICkKKwlCVUcoKTsKKyAgICBpZiAoIGdjcnlfbXBpX3NjYW4oICZrZXlbMV0sIEdDUllNUElfRk1UX0hFWCwgZWxnX3Rlc3RrZXkxLmcsIE5VTEwgKSApCisJQlVHKCk7CisgICAgaWYgKCBnY3J5X21waV9zY2FuKCAma2V5WzJdLCBHQ1JZTVBJX0ZNVF9IRVgsIGVsZ190ZXN0a2V5MS55LCBOVUxMICkgKQorCUJVRygpOworCisgICAgLyogZ2V0IG5iaXRzIGZyb20gYSBrZXkgKi8KKyAgICByYyA9IGdjcnlfc2V4cF9idWlsZCAoICZzZXhwLCBOVUxMLAorCQkJICAgIihwdWJsaWMta2V5KGVsZyhwJW0pKGclbSkoeSVtKSkpIiwKKwkJCQkgIGtleVswXSwga2V5WzFdLCBrZXlbMl0gKTsKKyAgICBmcHV0cyAoICJEVU1QIG9mIFBLOlxuIiwgc3RkZXJyICk7CisgICAgZ2NyeV9zZXhwX2R1bXAgKCBzZXhwICk7CisgICAgeyAgZ2NyeV9zZXhwX3QgeDsKKyAgICAgICB4ID0gZ2NyeV9zZXhwX2NkciAoIHNleHAgKTsKKyAgICAgICBmcHV0cyAoICJEVU1QIG9mIENEUjpcbiIsIHN0ZGVyciApOworICAgICAgIGdjcnlfc2V4cF9kdW1wICggeCApOworICAgICAgIGdjcnlfc2V4cF9yZWxlYXNlICggeCApOworICAgIH0KKyAgICBuYml0cyA9IGdjcnlfcGtfZ2V0X25iaXRzKCBzZXhwICk7CisgICAgcHJpbnRmICggImVsZ190ZXN0a2V5MSAtIG5iaXRzPSVkXG4iLCBuYml0cyApOworICAgIG4gPSBnY3J5X3NleHBfc3ByaW50ICggc2V4cCwgMCwgTlVMTCwgMCApOworICAgIGJ1ZiA9IGdjcnlfeG1hbGxvYyAoIG4gKTsKKyAgICBuID0gZ2NyeV9zZXhwX3NwcmludCAoIHNleHAsIDAsIGJ1ZiwgbiApOworICAgIHByaW50ZiAoICJzcHJpbnQgbGVuZ3RoPSV1XG4iLCAodW5zaWduZWQgaW50KW4gKTsKKyAgICBnY3J5X2ZyZWUgKCBidWYgKTsKKyAgICBnY3J5X3NleHBfcmVsZWFzZSggc2V4cCApOworfQorCisKK3ZvaWQKK3Rlc3RfZ2Vua2V5ICggaW50IGFyZ2MsIGNoYXIgKiphcmd2ICkKK3sKKyAgICBpbnQgcmMsIG5iaXRzID0gMTAyNDsKKyAgICBnY3J5X3NleHBfdCBzX3Bhcm1zLCBzX2tleTsKKworICAgIGdjcnlfY29udHJvbCggR0NSWUNUTF9JTklUX1NFQ01FTSwgMTYzODQsIDAgKTsKKyAgICByYyA9IGdjcnlfc2V4cF9idWlsZCAoICZzX3Bhcm1zLCBOVUxMLCAiKGdlbmtleShkc2EobmJpdHMgJWQpKSkiLCBuYml0cyApOworICAgIHJjID0gZ2NyeV9wa19nZW5rZXkoICZzX2tleSwgc19wYXJtcyApOworICAgIGlmICggcmMgKSB7CisJZnByaW50ZiAoIHN0ZGVyciwgImdlbmtleSBmYWlsZWQ6ICVzXG4iLCBncGdfc3RyZXJyb3IgKHJjKSApOworCXJldHVybjsKKyAgICB9CisgICAgZ2NyeV9zZXhwX3JlbGVhc2UoIHNfcGFybXMgKTsKKyAgICBnY3J5X3NleHBfZHVtcCAoIHNfa2V5ICk7CisgICAgZ2NyeV9zZXhwX3JlbGVhc2UoIHNfa2V5ICk7Cit9CisKK2ludAorbWFpbiggaW50IGFyZ2MsIGNoYXIgKiphcmd2ICkKK3sKKyAgICBpZiAoIGFyZ2MgPCAyICkKKwlwcmludGYoIiVzXG4iLCBnY3J5X2NoZWNrX3ZlcnNpb24gKCBOVUxMICkgKTsKKyAgICBlbHNlIGlmICggIXN0cmNtcCAoIGFyZ3ZbMV0sICJ2ZXJzaW9uIikgKQorCXByaW50ZigiJXNcbiIsIGdjcnlfY2hlY2tfdmVyc2lvbiAoIGFyZ2MgPiAyID8gYXJndlsyXSA6IE5VTEwgKSApOworICAgIGVsc2UgaWYgKCAhc3RyY21wICggYXJndlsxXSwgInNleHAiICkgKQorCXRlc3Rfc2V4cCAoIGFyZ2MtMiwgYXJndisyICk7CisgICAgZWxzZSBpZiAoICFzdHJjbXAgKCBhcmd2WzFdLCAiZ2Vua2V5IiApICkKKwl0ZXN0X2dlbmtleSAoIGFyZ2MtMiwgYXJndisyICk7CisgICAgZWxzZSB7CisJZnByaW50ZiAoc3RkZXJyLCAidXNhZ2U6IHRlc3RhcGkgbW9kZS1zdHJpbmcgW21vZGUtYXJnc11cbiIpOworCXJldHVybiAxOworICAgIH0KKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LTEuNC42L3Rlc3RzL3RzZXhwLmMgYi9saWJnY3J5cHQtMS40LjYvdGVzdHMvdHNleHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWQ1NGE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L3Rlc3RzL3RzZXhwLmMKQEAgLTAsMCArMSw0NTYgQEAKKy8qIHRzZXhwLmMgIC0gIFMtZXhwcmVzc2lvbiByZWdyZXNzaW9uIHRlc3RzCisgKglDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGliZ2NyeXB0LgorICoKKyAqIExpYmdjcnlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTGliZ2NyeXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgIi4uL3NyYy9nY3J5cHQuaCIKKworI2RlZmluZSBQR01OQU1FICJ0c2V4cCIKKworc3RhdGljIGludCB2ZXJib3NlOworc3RhdGljIGludCBlcnJvcl9jb3VudDsKKworc3RhdGljIHZvaWQKK2luZm8gKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICB2YV9saXN0IGFyZ19wdHI7CisKKyAgaWYgKHZlcmJvc2UpCisgICAgeworICAgICAgdmFfc3RhcnQoIGFyZ19wdHIsIGZvcm1hdCApIDsKKyAgICAgIHZmcHJpbnRmIChzdGRlcnIsIGZvcm1hdCwgYXJnX3B0ciApOworICAgICAgdmFfZW5kKGFyZ19wdHIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2ZhaWwgKCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLiApCit7CisgICAgdmFfbGlzdCBhcmdfcHRyIDsKKworICAgIGZwdXRzIChQR01OQU1FICI6ICIsIHN0ZGVycik7CisgICAgdmFfc3RhcnQoIGFyZ19wdHIsIGZvcm1hdCApIDsKKyAgICB2ZnByaW50ZiAoc3RkZXJyLCBmb3JtYXQsIGFyZ19wdHIgKTsKKyAgICB2YV9lbmQoYXJnX3B0cik7CisgICAgZXJyb3JfY291bnQrKzsKK30KKworCisvKiBmaXhtZTogd2UgbmVlZCBiZXR0ZXIgdGVzdHMgKi8KK3N0YXRpYyB2b2lkCitiYXNpYyAodm9pZCkKK3sKKyAgaW50IHBhc3M7CisgIGdjcnlfc2V4cF90IHNleHA7CisgIGludCBpZHg7CisgIGNoYXIgKnNlY3VyZV9idWZmZXI7CisgIHNpemVfdCBzZWN1cmVfYnVmZmVyX2xlbjsKKyAgY29uc3QgY2hhciAqc3RyaW5nOworICBzdGF0aWMgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyICp0b2tlbjsKKyAgICBjb25zdCBjaGFyICpwYXJtOworICB9IHZhbHVlc1tdID0geworICAgIHsgInB1YmxpYy1rZXkiLCBOVUxMIH0sCisgICAgeyAiZHNhIiwgTlVMTCB9LAorICAgIHsgImRzYSIsICJwIiB9LAorICAgIHsgImRzYSIsICJ5IiB9LAorICAgIHsgImRzYSIsICJxIiB9LAorICAgIHsgImRzYSIsICJnIiB9LAorICAgIHsgTlVMTCB9CisgIH07CisKKyAgaW5mbyAoImRvaW5nIHNvbWUgcHJldHR5IHBvaW50bGVzcyB0ZXN0c1xuIik7IAorCisgIHNlY3VyZV9idWZmZXJfbGVuID0gOTk7CisgIHNlY3VyZV9idWZmZXIgPSBnY3J5X3htYWxsb2Nfc2VjdXJlIChzZWN1cmVfYnVmZmVyX2xlbik7CisgIG1lbXNldCAoc2VjdXJlX2J1ZmZlciwgJ0cnLCBzZWN1cmVfYnVmZmVyX2xlbik7CisKKyAgZm9yIChwYXNzPTA7O3Bhc3MrKykKKyAgICB7CisgICAgICBzd2l0Y2ggKHBhc3MpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgIHN0cmluZyA9ICgiKHB1YmxpYy1rZXkgKGRzYSAocCAjNDE0MjQzNDQjKSAoeSB0aGlzX2lzX3kpICIKKyAgICAgICAgICAgICAgICAgICAgIihxICM2MTYyNjM2NDY1NjY2NyMpIChnICVtKSkpIik7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKCBnY3J5X3NleHBfYnVpbGQgKCZzZXhwLCBOVUxMLCBzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcnlfbXBpX3NldF91aSAoTlVMTCwgNDIpKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZhaWwgKCIgc2Nhbm5pbmcgYCVzJyBmYWlsZWRcbiIsIHN0cmluZyk7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgICAKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgIHN0cmluZyA9ICgiKHB1YmxpYy1rZXkgKGRzYSAocCAjNDE0MjQzNDQjKSAoeSB0aGlzX2lzX3kpICIKKyAgICAgICAgICAgICAgICAgICAgIihxICViKSAoZyAlbSkpKSIpOworICAgICAgCisgICAgICAgICAgaWYgKCBnY3J5X3NleHBfYnVpbGQgKCZzZXhwLCBOVUxMLCBzdHJpbmcsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSwgImZvb1wwXHgwMVwweDAyNzg5MDEyMzQ1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NyeV9tcGlfc2V0X3VpIChOVUxMLCA0MikpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZmFpbCAoIiBzY2FubmluZyBgJXMnIGZhaWxlZFxuIiwgc3RyaW5nKTsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICBzdHJpbmcgPSAoIihwdWJsaWMta2V5IChkc2EgKHAgIzQxNDI0MzQ0IykgKHkgc2lsbHlfeV92YWx1ZSkgIgorICAgICAgICAgICAgICAgICAgICAiKHEgJWIpIChnICVtKSkpIik7CisgICAgICAKKyAgICAgICAgICBpZiAoIGdjcnlfc2V4cF9idWlsZCAoJnNleHAsIE5VTEwsIHN0cmluZywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyZV9idWZmZXJfbGVuLCBzZWN1cmVfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X21waV9zZXRfdWkgKE5VTEwsIDE3KSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmYWlsICgiIHNjYW5uaW5nIGAlcycgZmFpbGVkXG4iLCBzdHJpbmcpOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgaWYgKCFnY3J5X2lzX3NlY3VyZSAoc2V4cCkpCisgICAgICAgICAgICBmYWlsICgiZ2NyeV9zZXhwX2J1aWxkIGRpZCBub3Qgc3dpdGNoIHRvIHNlY3VyZSBtZW1vcnlcbiIpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICB7CisgICAgICAgICAgICBnY3J5X3NleHBfdCBoZWxwX3NleHA7CisKKyAgICAgICAgICAgIGlmIChnY3J5X3NleHBfbmV3ICgmaGVscF9zZXhwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoZm9vYmFyLXBhcm1zICh4cCAjMTIzNCMpKHhxICMwMyMpKSIsIDAsIDEpKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmFpbCAoIiBzY2FubmluZyBmaXhlZCBzdHJpbmcgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RyaW5nID0gKCIocHVibGljLWtleSAoZHNhIChwICM0MTQyNDM0NCMpIChwYXJtICVTKSAiCisgICAgICAgICAgICAgICAgICAgICAgIih5IGR1bW15KShxICViKSAoZyAlbSkpKSIpOworICAgICAgICAgICAgaWYgKCBnY3J5X3NleHBfYnVpbGQgKCZzZXhwLCBOVUxMLCBzdHJpbmcsIGhlbHBfc2V4cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN1cmVfYnVmZmVyX2xlbiwgc2VjdXJlX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY3J5X21waV9zZXRfdWkgKE5VTEwsIDE3KSkgKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmFpbCAoIiBzY2FubmluZyBgJXMnIGZhaWxlZFxuIiwgc3RyaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdjcnlfc2V4cF9yZWxlYXNlIChoZWxwX3NleHApOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgICAKKyAgICAgICAgICAKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXR1cm47IC8qIFJlYWR5LiAqLworICAgICAgICB9CisKKworICAgICAgLyogbm93IGZpbmQgc29tZXRoaW5nICovCisgICAgICBmb3IgKGlkeD0wOyB2YWx1ZXNbaWR4XS50b2tlbjsgaWR4KyspCisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBjaGFyICp0b2tlbiA9IHZhbHVlc1tpZHhdLnRva2VuOworICAgICAgICAgIGNvbnN0IGNoYXIgKnBhcm0gPSB2YWx1ZXNbaWR4XS5wYXJtOworICAgICAgICAgIGdjcnlfc2V4cF90IHMxLCBzMjsKKyAgICAgICAgICBnY3J5X21waV90IGE7CisgICAgICAgICAgY29uc3QgY2hhciAqcDsKKyAgICAgICAgICBzaXplX3QgbjsKKworICAgICAgICAgIHMxID0gZ2NyeV9zZXhwX2ZpbmRfdG9rZW4gKHNleHAsIHRva2VuLCBzdHJsZW4odG9rZW4pICk7CisgICAgICAgICAgaWYgKCFzMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZmFpbCAoImRpZG4ndCBmb3VuZCBgJXMnXG4iLCB0b2tlbik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgcCA9IGdjcnlfc2V4cF9udGhfZGF0YSAoczEsIDAsICZuKTsKKyAgICAgICAgICBpZiAoIXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZhaWwgKCJubyBjYXIgZm9yIGAlcydcbiIsIHRva2VuKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgaW5mbyAoImNhcj1gJS4qcydcbiIsIChpbnQpbiwgcCk7CisKKyAgICAgICAgICBzMiA9IGdjcnlfc2V4cF9jZHIgKHMxKTsKKyAgICAgICAgICBpZiAoIXMyKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZmFpbCAoIm5vIGNkciBmb3IgYCVzJ1xuIiwgdG9rZW4pOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIHAgPSBnY3J5X3NleHBfbnRoX2RhdGEgKHMyLCAwLCAmbik7CisgICAgICAgICAgaWYgKHApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZhaWwgKCJkYXRhIGF0IGNhciBvZiBgJXMnXG4iLCB0b2tlbik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHBhcm0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHMyID0gZ2NyeV9zZXhwX2ZpbmRfdG9rZW4gKHMxLCBwYXJtLCBzdHJsZW4gKHBhcm0pKTsKKyAgICAgICAgICAgICAgaWYgKCFzMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBmYWlsICgiZGlkbid0IGZvdW5kIGAlcydcbiIsIHBhcm0pOworICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBwID0gZ2NyeV9zZXhwX250aF9kYXRhIChzMiwgMCwgJm4pOworICAgICAgICAgICAgICBpZiAoIXApIAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGZhaWwoIm5vIGNhciBmb3IgYCVzJ1xuIiwgcGFybSApOworICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpbmZvICgiY2FyPWAlLipzJ1xuIiwgKGludCluLCBwKTsKKyAgICAgICAgICAgICAgcCA9IGdjcnlfc2V4cF9udGhfZGF0YSAoczIsIDEsICZuKTsKKyAgICAgICAgICAgICAgaWYgKCFwKSAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBmYWlsKCJubyBjZHIgZm9yIGAlcydcbiIsIHBhcm0gKTsKKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaW5mbyAoImNkcj1gJS4qcydcbiIsIChpbnQpbiwgcCk7CisgICAgICAgICAgCisgICAgICAgICAgICAgIGEgPSBnY3J5X3NleHBfbnRoX21waSAoczIsIDAsIEdDUllNUElfRk1UX1VTRyk7CisgICAgICAgICAgICAgIGlmICghYSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBmYWlsKCJmYWlsZWQgdG8gY2RyIHRoZSBtcGkgZm9yIGAlcydcbiIsIHBhcm0pOworICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgIAorICAgICAgZ2NyeV9zZXhwX3JlbGVhc2UgKHNleHApOworICAgICAgc2V4cCA9IE5VTEw7CisgICAgfQorICBnY3J5X2ZyZWUgKHNlY3VyZV9idWZmZXIpOworfQorCisKK3N0YXRpYyB2b2lkCitjYW5vbl9sZW4gKHZvaWQpCit7CisgIHN0YXRpYyBzdHJ1Y3QgeworICAgIHNpemVfdCB0ZXh0bGVuOyAvKiBsZW5ndGggb2YgdGhlIGJ1ZmZlciAqLworICAgIHNpemVfdCBleHBlY3RlZDsvKiBleHBlY3RlZCBsZW5ndGggb3IgMCBvbiBlcnJvciBhbmQgdGhlbiAuLi4gKi8KKyAgICBzaXplX3QgZXJyb2ZmOyAgLyogLi4uIGFuZCBhdCB0aGlzIG9mZnNldCAqLworICAgIGdjcnlfZXJyb3JfdCBlcnJjb2RlOyAgICAvKiAuLi4gd2l0aCB0aGlzIGVycm9yIGNvZGUgKi8KKyAgICBjb25zdCBjaGFyICp0ZXh0OyAKKyAgfSB2YWx1ZXNbXSA9IHsKKyAgICB7IDE0LCAxMywgMCwgR1BHX0VSUl9OT19FUlJPUiwgIig5OmFiY2RlZmdoaSkgIiB9LAorICAgIHsgMTYsIDE1LCAwLCBHUEdfRVJSX05PX0VSUk9SLCAiKDEwOmFiY2RlZmdoaXgpIiB9LAorICAgIHsgMTQsICAwLDE0LCBHUEdfRVJSX1NFWFBfU1RSSU5HX1RPT19MT05HLCAiKDEwOmFiY2RlZmdoaSkiIH0sCisgICAgeyAxNSwgIDAsIDEsIEdQR19FUlJfU0VYUF9aRVJPX1BSRUZJWCwgIigwMTA6YWJjZGVmZ2hpKSIgfSwKKyAgICB7ICAyLCAgMCwgMCwgR1BHX0VSUl9TRVhQX05PVF9DQU5PTklDQUwsICIxOiJ9LAorICAgIHsgIDQsICAwLCA0LCBHUEdfRVJSX1NFWFBfU1RSSU5HX1RPT19MT05HLCAiKDE6KSJ9LAorICAgIHsgIDUsICA1LCAwLCBHUEdfRVJSX05PX0VSUk9SLCAiKDE6eCkifSwKKyAgICB7ICAyLCAgMiwgMCwgR1BHX0VSUl9OT19FUlJPUiwgIigpIn0sCisgICAgeyAgNCwgIDIsIDAsIEdQR19FUlJfTk9fRVJST1IsICIoKSgpIn0sCisgICAgeyAgNCwgIDQsIDAsIEdQR19FUlJfTk9fRVJST1IsICIoKCkpIn0sCisgICAgeyAgMywgIDAsIDMsIEdQR19FUlJfU0VYUF9TVFJJTkdfVE9PX0xPTkcsICIoKCkifSwKKyAgICB7ICAzLCAgMCwgMSwgR1BHX0VSUl9TRVhQX0JBRF9DSEFSQUNURVIsICIoICkifSwKKyAgICB7ICA5LCAgOSwgMCwgR1BHX0VSUl9OT19FUlJPUiwgIigzOmFiYygpKSJ9LAorICAgIHsgMTAsICAwLCA2LCBHUEdfRVJSX1NFWFBfQkFEX0NIQVJBQ1RFUiwgIigzOmFiYyAoKSkifSwKKyAgICAvKiBmaXhtZTogd2UgbmVlZCBtdWNoIG1vcmUgY2FzZXMgKi8KKyAgICB7IDAgfSwKKyAgfTsKKyAgaW50IGlkeDsKKyAgZ2NyeV9lcnJvcl90IGVycmNvZGU7CisgIHNpemVfdCBuLCBlcnJvZmY7CisKKyAgaW5mbyAoImNoZWNraW5nIGNhbm9uY2lhbCBsZW5ndGggdGVzdCBmdW5jdGlvblxuIik7CisgIGZvciAoaWR4PTA7IHZhbHVlc1tpZHhdLnRleHQ7IGlkeCsrKQorICAgIHsKKyAgICAgIG4gPSBnY3J5X3NleHBfY2Fub25fbGVuICgoY29uc3QgdW5zaWduZWQgY2hhciopdmFsdWVzW2lkeF0udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbaWR4XS50ZXh0bGVuLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb2ZmLCAmZXJyY29kZSk7CisgICAgICAKKyAgICAgIGlmIChuICYmIG4gPT0gdmFsdWVzW2lkeF0uZXhwZWN0ZWQpCisgICAgICAgIDsgLyogc3VjY2VzcyAqLworICAgICAgZWxzZSBpZiAoIW4gJiYgIXZhbHVlc1tpZHhdLmV4cGVjdGVkKQorICAgICAgICB7IC8qIHdlIGV4cGVjdGVkIGFuIGVycm9yIC0gY2hlY2sgdGhhdCB0aGlzIGlzIHRoZSByaWdodCBvbmUgKi8KKyAgICAgICAgICBpZiAodmFsdWVzW2lkeF0uZXJyb2ZmICE9IGVycm9mZikKKyAgICAgICAgICAgIGZhaWwgKCJjYW5vbmljYWwgbGVuZ3RoIHRlc3QgJWQgLSB3cm9uZyBlcnJvciBvZmZzZXQgJXVcbiIsCisgICAgICAgICAgICAgICAgICBpZHgsICh1bnNpZ25lZCBpbnQpZXJyb2ZmKTsKKyAgICAgICAgICBpZiAoZ2NyeV9lcnJfY29kZSAoZXJyY29kZSkgIT0gdmFsdWVzW2lkeF0uZXJyY29kZSkKKyAgICAgICAgICAgIGZhaWwgKCJjYW5vbmljYWwgbGVuZ3RoIHRlc3QgJWQgLSB3cm9uZyBlcnJvciBjb2RlICVkXG4iLAorICAgICAgICAgICAgICAgICAgaWR4LCBlcnJjb2RlKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBmYWlsICgiY2Fub25pY2FsIGxlbmd0aCB0ZXN0ICVkIGZhaWxlZCAtIG49JXUsIG9mZj0ldSwgZXJyPSVkXG4iLAorICAgICAgICAgICAgICBpZHgsICh1bnNpZ25lZCBpbnQpbiwgKHVuc2lnbmVkIGludCllcnJvZmYsIGVycmNvZGUpOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAorYmFja19hbmRfZm9ydGhfb25lIChpbnQgdGVzdG5vLCBjb25zdCBjaGFyICpidWZmZXIsIHNpemVfdCBsZW5ndGgpCit7CisgIGdjcnlfZXJyb3JfdCByYzsKKyAgZ2NyeV9zZXhwX3Qgc2UsIHNlMTsKKyAgc2l6ZV90IG4sIG4xOworICBjaGFyICpwMTsKKworICByYyA9IGdjcnlfc2V4cF9uZXcgKCZzZSwgYnVmZmVyLCBsZW5ndGgsIDEpOworICBpZiAocmMpCisgICAgeworICAgICAgZmFpbCAoImJhZiAlZDogZ2NyeV9zZXhwX25ldyBmYWlsZWQ6ICVzXG4iLCB0ZXN0bm8sIGdwZ19zdHJlcnJvciAocmMpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIG4xID0gZ2NyeV9zZXhwX3NwcmludCAoc2UsIEdDUllTRVhQX0ZNVF9DQU5PTiwgTlVMTCwgMCk7CisgIGlmICghbjEpCisgICAgeworICAgICAgZmFpbCAoImJhZiAlZDogZ2V0IHJlcXVpcmVkIGxlbmd0aCBmb3IgY2Fub24gZmFpbGVkXG4iLCB0ZXN0bm8pOworICAgICAgcmV0dXJuOworICAgIH0KKyAgcDEgPSBnY3J5X3htYWxsb2MgKG4xKTsKKyAgbiA9IGdjcnlfc2V4cF9zcHJpbnQgKHNlLCBHQ1JZU0VYUF9GTVRfQ0FOT04sIHAxLCBuMSk7CisgIGlmIChuMSAhPSBuKzEpIC8qIHNwcmludHMgYWRkcyBhbiBleHRyYSAwIGJ1dCBkaWVzIG5vdCByZXR1cm4gaXQgKi8KKyAgICB7CisgICAgICBmYWlsICgiYmFmICVkOiBsZW5ndGggbWlzbWF0Y2ggZm9yIGNhbm9uXG4iLCB0ZXN0bm8pOworICAgICAgcmV0dXJuOworICAgIH0KKyAgcmMgPSBnY3J5X3NleHBfY3JlYXRlICgmc2UxLCBwMSwgbiwgMCwgZ2NyeV9mcmVlKTsKKyAgaWYgKHJjKQorICAgIHsKKyAgICAgIGZhaWwgKCJiYWYgJWQ6IGdjcnlfc2V4cF9jcmVhdGUgZmFpbGVkOiAlc1xuIiwKKyAgICAgICAgICAgIHRlc3RubywgZ3BnX3N0cmVycm9yIChyYykpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgZ2NyeV9zZXhwX3JlbGVhc2UgKHNlMSk7CisKKyAgLyogQWdhaW4gYnV0IHdpdGggbWVtb3J5IGNoZWNraW5nLiAqLworICBwMSA9IGdjcnlfeG1hbGxvYyAobjErMik7CisgICpwMSA9ICdceDU1JzsKKyAgcDFbbjErMV0gPSAnXHhhYSc7CisgIG4gPSBnY3J5X3NleHBfc3ByaW50IChzZSwgR0NSWVNFWFBfRk1UX0NBTk9OLCBwMSsxLCBuMSk7CisgIGlmIChuMSAhPSBuKzEpIC8qIHNwcmludHMgYWRkcyBhbiBleHRyYSAwIGJ1dCBkb2VzIG5vdCByZXR1cm4gaXQgKi8KKyAgICB7CisgICAgICBmYWlsICgiYmFmICVkOiBsZW5ndGggbWlzbWF0Y2ggZm9yIGNhbm9uXG4iLCB0ZXN0bm8pOworICAgICAgcmV0dXJuOworICAgIH0KKyAgaWYgKCpwMSAhPSAnXHg1NScgfHwgcDFbbjErMV0gIT0gJ1x4YWEnKQorICAgIGZhaWwgKCJiYWYgJWQ6IG1lbW9yeSBjb3JydXB0ZWQgKDEpXG4iLCB0ZXN0bm8pOworICByYyA9IGdjcnlfc2V4cF9jcmVhdGUgKCZzZTEsIHAxKzEsIG4sIDAsIE5VTEwpOworICBpZiAocmMpCisgICAgeworICAgICAgZmFpbCAoImJhZiAlZDogZ2NyeV9zZXhwX2NyZWF0ZSBmYWlsZWQ6ICVzXG4iLAorICAgICAgICAgICAgdGVzdG5vLCBncGdfc3RyZXJyb3IgKHJjKSk7CisgICAgICByZXR1cm47CisgICAgfQorICBpZiAoKnAxICE9ICdceDU1JyB8fCBwMVtuMSsxXSAhPSAnXHhhYScpCisgICAgZmFpbCAoImJhZiAlZDogbWVtb3J5IGNvcnJ1cHRlZCAoMilcbiIsIHRlc3Rubyk7CisgIGdjcnlfc2V4cF9yZWxlYXNlIChzZTEpOworICBpZiAoKnAxICE9ICdceDU1JyB8fCBwMVtuMSsxXSAhPSAnXHhhYScpCisgICAgZmFpbCAoImJhZiAlZDogbWVtb3J5IGNvcnJ1cHRlZCAoMylcbiIsIHRlc3Rubyk7CisgIGdjcnlfZnJlZSAocDEpOworICAKKyAgLyogRklYTUU6IHdlIG5lZWQgYSBsb3QgbW9yZSB0ZXN0cyAqLworCisgIGdjcnlfc2V4cF9yZWxlYXNlIChzZSk7Cit9CisKKworCitzdGF0aWMgdm9pZAorYmFja19hbmRfZm9ydGggKHZvaWQpCit7CisgIHN0YXRpYyBzdHJ1Y3QgeyBjb25zdCBjaGFyICpidWY7IGludCBsZW47IH0gdGVzdHNbXSA9IHsKKyAgICB7ICIoNzpnMzQ6ZmdoMTo6MjooKSkiLCAwIH0sCisgICAgeyAiKDc6ZzM0OmZnaDE6OjI6KCkpIiwgMTggfSwKKyAgICB7CisiKHByb3RlY3RlZC1wcml2YXRlLWtleSBcbiIKKyIgKHJzYSBcbiIKKyIgIChuICMwMEJFOEE1MzYyMDQ2ODcxNDlBNDhGRjlGMTcxNUZGMzUzMEFEOUE4MzZENjIxMDJCRjQwNjVFNUNGNTk1MzIzNkRCOTRGMURGMkZGNEQ1MjVDRDRDRTc5NjZEREMzQzgzOTk2OEU4QkFDMjk0ODkzNERGMDQ3Q0M2NTI4N0NENzlGNkMyM0M5M0U1NUQ3RjkyMzFFMzk0MkJENDk2REUzODM0Njk5Nzc2MzVBNTFBREY0QUY3NDdEQjk1OENBMDJFOTk0MERGQzFEQzBGQzdGQzc1NUU3RUI2NjE4RkVFNkRBNTRCOEEwNkUwQ0JGOUQ5MjU3NDQzRjk5OTIyNjE0MzUjKVxuIgorIiAgKGUgIzAxMDAwMSMpXG4iCisiICAocHJvdGVjdGVkIG9wZW5wZ3AtczJrMy1zaGExLWFlcy1jYmMgXG4iCisiICAgKFxuIgorIiAgICAoc2hhMSAjQzJBNTY3M0JEMzg4MjQwNSMgXCI5NlwiKVxuIgorIiAgICAjOEQwOEFBRjZBOTIwOUVENjlENzFFQjdFNjRENzg3MTUjKVxuIgorIiAgICNGN0IwQjUzNUY4RjhFMjJGNEYzREEwMzEyMjQwNzAzMDNGODJGOTIwN0Q0Mjk1MkYxQUNGMjFBNEFCMUM1MDMwNEVCQjI1NTI3OTkyQzdCMjY1QTlFOUZGNzAyODI2RkI4ODc1OUJERDU1RTQ3NTlFOUZDQTZDODc5NTM4QzlEMDQzQTlDNjBBMzI2Q0I2NjgxMDkwQkFBNzMxMjg5QkQ4ODBBN0Q1Nzc0RDk5OTlGMDI2RTVFNzk2M0JGQzhDMEJEQzlGMDYxMzkzQ0I3MzRCNEYyNTk3MjVDMEEwQTBCMTVCQTM5QzM5MTQ2RUY2QTFCM0RDNERGMzBBMjJFQkUwOUZEMDVBRTZDQjBDOEM2NTMyOTUxQTkyNUYzNTRGNEUyNkE1MTk2NEY1QkJBNTAwODE2OTBDNDIxQzgzODVDNDA3NEU5QkFCOTI5N0QwODFCODU3NzU2NjA3RUFFNjUyNDE1Mjc1QTc0MUM4OUU4MTU1NThBNTBBQzYzOEVEQzVGNTAzMDIxMEI0Mzk1RTNFMUE0MEZGMzhEQ0NDQjMzM0ExOUVBODhFRkU3RTRENTFCNTQxMjhDNkRGMjczOTU2NDY4MzY2NzlBQzIxQjFCMjVDMURBNkYwQTdDRTlGOUJFMDc4RUZDNzkzNEZBOUFFMjAyQ0JCMEFBMDZDMjBERkFGOUE2NkZBQjdFOTA3M0ZCRTk2QjlBN0YyNUMzQkE0NUVDM0VFQ0E2NTc5NkFFRTMxM0JBMTQ4REU1MzE0RjMwMzQ1QjQ1MkI1MEIxN0M0RDg0MUE3RjI3Mzk3MTI2RThDMTBCRDBDRTNCNTBBODJDMDQyNUFBRUU3Nzk4MDMxNjcxNDA3QjY4MUY1MjkxNjI1NkY3OENBRjkyQTQ3N0FDMjdCQ0JFMjZEQUZEMUJDRTM4NkE4NTNFMkEwMzZGODMxNEJCMkU4RTVCQjFGMTk2NDM0MjMyRUZCMDI4ODMzMUMyQUIxNkRCQzU0NTdDQzI5NUVCOTY2Q0FDNUNFNzNENURBNUQ1NjZFNDY5RjBFRkE4MkY5QTEyQjg2OTNFMCMpXG4iCisiICApXG4iCisiIClcbiIsIDAgfSwKKyAgICB7IE5VTEwsIDAgfQorICB9OworICBpbnQgaWR4OworCisgIGZvciAoaWR4PTA7IHRlc3RzW2lkeF0uYnVmOyBpZHgrKykKKyAgICBiYWNrX2FuZF9mb3J0aF9vbmUgKGlkeCwgdGVzdHNbaWR4XS5idWYsIHRlc3RzW2lkeF0ubGVuKTsKK30KKworCitzdGF0aWMgdm9pZAorY2hlY2tfc3NjYW4gKHZvaWQpCit7CisgIHN0YXRpYyBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIgKnRleHQ7CisgICAgZ2NyeV9lcnJvcl90IGV4cGVjdGVkX2VycjsgIAorICB9IHZhbHVlc1tdID0geworICAgIC8qIEJ1ZyByZXBvcnRlZCBieSBPbGl2aWVyIEwnSGV1cmV1eCAyMDAzLTEwLTA3ICovCisgICAgeyAiKDc6c2lnLXZhbCgzOmRzYSIKKyAgICAgICIoMTpyMjA6XHg3ZVx4ZmZceGQ1XHhiYVx4YzlceGM5XHhhNFx4OWJceGQ0XHgyNlx4OGJceDY0IgorICAgICAgIlx4MDZceDdhXHhjZlx4NDJceDdiXHg2Y1x4NTFceGZiKSIKKyAgICAgICIoMTpzMjE6XHgwMVx4OGNceDZjXHg2Zlx4MzdceDFhXHg4ZFx4ZmRceDVhXHhiM1x4MmFceDNkIgorICAgICAgIlx4YzVceGFlXHgyM1x4ZWRceDMyXHg2Mlx4MzBceDYyXHgzZSkpKSIsCisgICAgICBHUEdfRVJSX05PX0VSUk9SIH0sCisgICAgeyAiKDc6c2lnLXZhbCgzOmRzYSIKKyAgICAgICIoMTpyMjA6XHg3ZVx4ZmZceGQ1XHhiYVx4YzlceGM5XHhhNFx4OWJceGQ0XHgyNlx4OGJceDY0IgorICAgICAgIlx4MDZceDdhXHhjZlx4NDJceDdiXHg2Y1x4NTFceGZiKSIKKyAgICAgICIoMTpzMjE6XHgwMVx4OGNceDZjXHg2Zlx4MzdceDFhXHg4ZFx4ZmRceDVhXHhiM1x4MmFceDNkIgorICAgICAgIlx4YzVceGFlXHgyM1x4ZWRceDMyXHg2Mlx4MzBceDYyXHgzZSkpIiwKKyAgICAgIEdQR19FUlJfU0VYUF9VTk1BVENIRURfUEFSRU4gfSwKKyAgICB7ICIoNzpzaWctdmFsKDM6ZHNhIgorICAgICAgIigxOnIyMDpceDdlXHhmZlx4ZDVceGJhXHhjOVx4YzlceGE0XHg5Ylx4ZDRceDI2XHg4Ylx4NjQiCisgICAgICAiXHgwNlx4N2FceGNmXHg0Mlx4N2JceDZjXHg1MVx4ZmIpIgorICAgICAgIigxOnMyMTpceDAxXHg4Y1x4NmNceDZmXHgzN1x4MWFceDhkXHhmZFx4NWFceGIzXHgyYVx4M2QiCisgICAgICAiXHhjNVx4YWVceDIzXHhlZFx4MzJceDYyXHgzMFx4NjJceDNlKSkpKSIsCisgICAgICBHUEdfRVJSX1NFWFBfVU5NQVRDSEVEX1BBUkVOIH0sCisgICAgeyBOVUxMLCAwIH0KKyAgfTsKKyAgaW50IGlkeDsKKyAgZ2NyeV9lcnJvcl90IGVycjsKKyAgZ2NyeV9zZXhwX3QgczsKKworICBpbmZvICgiY2hlY2tpbmcgZ2NyeV9zZXhwX3NzY2FuXG4iKTsKKyAgZm9yIChpZHg9MDsgdmFsdWVzW2lkeF0udGV4dDsgaWR4KyspCisgICAgeworICAgICAgZXJyID0gZ2NyeV9zZXhwX3NzY2FuICgmcywgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzW2lkeF0udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuICh2YWx1ZXNbaWR4XS50ZXh0KSk7CisgICAgICBpZiAoZ3BnX2Vycl9jb2RlIChlcnIpICE9IHZhbHVlc1tpZHhdLmV4cGVjdGVkX2VycikKKyAgICAgICAgZmFpbCAoImdjcnlfc2V4cF9zc2NhbiB0ZXN0ICVkIGZhaWxlZDogJXNcbiIsIGlkeCwgZ3BnX3N0cmVycm9yIChlcnIpKTsKKyAgICAgIGdjcnlfc2V4cF9yZWxlYXNlIChzKTsKKyAgICB9Cit9CisKKworCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBpZiAoYXJnYyA+IDEgJiYgIXN0cmNtcCAoYXJndlsxXSwgIi0tdmVyYm9zZSIpKQorICAgIHZlcmJvc2UgPSAxOworCisgIGdjcnlfY29udHJvbCAoR0NSWUNUTF9ESVNBQkxFX1NFQ01FTV9XQVJOKTsKKyAgZ2NyeV9jb250cm9sIChHQ1JZQ1RMX0lOSVRfU0VDTUVNLCAxNjM4NCwgMCk7CisKKyAgYmFzaWMgKCk7CisgIGNhbm9uX2xlbiAoKTsKKyAgYmFja19hbmRfZm9ydGggKCk7CisgIGNoZWNrX3NzY2FuICgpOworICAKKyAgcmV0dXJuIGVycm9yX2NvdW50PyAxOjA7Cit9CmRpZmYgLS1naXQgYS9saWJnY3J5cHQtMS40LjYvdGVzdHMvdmVyc2lvbi5jIGIvbGliZ2NyeXB0LTEuNC42L3Rlc3RzL3ZlcnNpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzI1OWFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LTEuNC42L3Rlc3RzL3ZlcnNpb24uYwpAQCAtMCwwICsxLDU4IEBACisvKiB2ZXJzaW9uLmMgIC0gIFRoaXMgdmVyc2lvbiB0ZXN0IHNob3VsZCBiZSBydW4gZmlyc3QuCisgICBDb3B5cmlnaHQgKEMpIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExpYmdjcnlwdC4KKyAgCisgICBMaWJnY3J5cHQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICAKKyAgIExpYmdjcnlwdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICAKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKKyAgIFVTQS4gICovCisKKy8qIFRoaXMgdGVzdCBzaG91bGQgYmUgcnVuIGZpcnN0IGJlY2F1c2UgZHVlIHRvIGEgZmFpbGluZyBjb25maWcubGlua3MKKyAgIHNjcmlwdCBvciBiYWQgY29uZmlndXJlIHBhcmFtZXRlcnMgdGhlIGp1c3QgYnVpbGQgbGliZ2NyeXB0IG1heQorICAgY3Jhc2ggaW4gY2FzZSBNUEkgZnVuY3Rpb24gZm9yIHNwZWNpZmljIENQVSByZXZpc2lvbnMgaGF2ZSBiZWVuCisgICBlbmFibGVkLiAgUnVubmluZyB0aGlzIHRlc3QgZmlyc3Qgd2lsbCBwcmludCBvdXQgaW5mb3JtYXRpb24gc28gdG8KKyAgIG1ha2UgaXQgZWFzaWVyIHRvIGZpZ3VyZSBvdXQgdGhlIHByb2JsZW0uICovCisgICAKKyAgCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2luY2x1ZGUgIi4uL3NyYy9nY3J5cHQuaCIKKworI2RlZmluZSBQR00gInZlcnNpb24iCisKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICh2b2lkKWFyZ2M7CisgICh2b2lkKWFyZ3Y7CisKKyAgZ2NyeV9jb250cm9sIChHQ1JZQ1RMX0RJU0FCTEVfU0VDTUVNLCAwKTsKKyAgaWYgKCFnY3J5X2NoZWNrX3ZlcnNpb24gKEdDUllQVF9WRVJTSU9OKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsIFBHTSAiOiB2ZXJzaW9uIG1pc21hdGNoXG4iKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBnY3J5X2NvbnRyb2wgKEdDUllDVExfUFJJTlRfQ09ORklHLCBOVUxMKTsKKworICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LnRhci5iejIgYi9saWJnY3J5cHQudGFyLmJ6MgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWVkYjRlCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ2NyeXB0LnRhci5iejIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliZ2NyeXB0LnVybCBiL2xpYmdjcnlwdC51cmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZjNzBiZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdjcnlwdC51cmwKQEAgLTAsMCArMSBAQAorZnRwOi8vZnRwLmdudXBnLm9yZy9nY3J5cHQvbGliZ2NyeXB0L2xpYmdjcnlwdC0xLjQuNi50YXIuYnoyCmRpZmYgLS1naXQgYS9saWJnY3J5cHQudmVyc2lvbiBiL2xpYmdjcnlwdC52ZXJzaW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MTRiZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnY3J5cHQudmVyc2lvbgpAQCAtMCwwICsxIEBACisxLjQuNgo=